milkytracker-0.90.85+dfsg/0000755000175000017500000000000011320341147014417 5ustar admin2admin2milkytracker-0.90.85+dfsg/depcomp0000755000175000017500000004426711317506534016022 0ustar admin2admin2#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, 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, see . # 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 Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: milkytracker-0.90.85+dfsg/configure0000755000175000017500000074256111317506531016353 0ustar admin2admin2#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.64 for MilkyTracker 0.90.85. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software # Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # 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. 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+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: www.milkytracker.net about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # 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` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='MilkyTracker' PACKAGE_TARNAME='milkytracker' PACKAGE_VERSION='0.90.85' PACKAGE_STRING='MilkyTracker 0.90.85' PACKAGE_BUGREPORT='www.milkytracker.net' PACKAGE_URL='' ac_unique_file="src" ac_header_list= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS SDL_LIBS SDL_CFLAGS SDL_CONFIG ZZIP_LIBS ZZIP_CFLAGS PKG_CONFIG ALSA_LIBS ALSA_CFLAGS RTMIDI_DIR RTMIDI EGREP GREP RANLIB CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking with_alsa with_alsa_prefix with_alsa_inc_prefix enable_alsatest with_sdl_prefix with_sdl_exec_prefix enable_sdltest with_jack ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PKG_CONFIG ZZIP_CFLAGS ZZIP_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # 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. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -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) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$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 ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$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 ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) 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 | -n) 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 ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=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 ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $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} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_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 ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # 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 the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` 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 test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # 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 <<_ACEOF \`configure' configures MilkyTracker 0.90.85 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/milkytracker] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of MilkyTracker 0.90.85:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-alsatest Do not try to compile and run a test Alsa program --disable-sdltest Do not try to compile and run a test SDL program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-alsa Enable native ALSA sound/midi support [default=check] --with-alsa-prefix=PFX Prefix where Alsa library is installed(optional) --with-alsa-inc-prefix=PFX Prefix where include libraries are (optional) --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) --with-jack Enable JACK support [default=check] Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility ZZIP_CFLAGS C compiler flags for ZZIP, overriding pkg-config ZZIP_LIBS linker flags for ZZIP, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF MilkyTracker configure 0.90.85 generated by GNU Autoconf 2.64 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # 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;} return $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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;} } # ac_fn_c_check_header_compile # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( cat <<\_ASBOX ## ----------------------------------- ## ## Report this to www.milkytracker.net ## ## ----------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi 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;} } # ac_fn_c_check_header_mongrel # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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;} } # ac_fn_c_check_type # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(0 < ($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 1))]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 1) < ($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 2))]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval as_val=\$$3 if test "x$as_val" = x""no; then : else break fi done 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;} } # ac_fn_c_find_intX_t # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $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;} } # ac_fn_c_check_member # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(($ac_type) -1 >> ($2 - 1) == 1)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval as_val=\$$3 if test "x$as_val" = x""no; then : else break fi done 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;} } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* 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 $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext 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;} } # ac_fn_c_check_func 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 MilkyTracker $as_me 0.90.85, which was generated by GNU Autoconf 2.64. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/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` /usr/bin/hostinfo = `(/usr/bin/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` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # 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. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " fcntl.h" as_fn_append ac_header_list " inttypes.h" as_fn_append ac_header_list " limits.h" as_fn_append ac_header_list " malloc.h" as_fn_append ac_header_list " memory.h" as_fn_append ac_header_list " stddef.h" as_fn_append ac_header_list " stdint.h" as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " string.h" as_fn_append ac_header_list " strings.h" as_fn_append ac_header_list " sys/ioctl.h" as_fn_append ac_header_list " sys/param.h" as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; 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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_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 # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## 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 am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # 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" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $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 : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /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 for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir 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. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$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' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } 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 $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; 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_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # 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_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; 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_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # 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_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='milkytracker' VERSION='0.90.85' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC 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 { $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_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # 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_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # 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_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" # 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then : $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C++ compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } 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_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= 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 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $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 : $as_echo_n "(cached) " >&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 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_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no 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 if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 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 ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. 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 : $as_echo_n "(cached) " >&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 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_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi 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 : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$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 { $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 : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end 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; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; 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 for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&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 : $as_echo_n "(cached) " >&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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # 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 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } 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 for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # 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_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done 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 { $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_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # 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_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; 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_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # 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_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Checks for header files. ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; 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_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; 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_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $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 : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $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 : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # AC_CHECK_HEADER(zzip/lib.h,,AC_MSG_ERROR("Cannot find zzip/lib.h")) # Checks for libraries. # Check whether --with-alsa was given. if test "${with_alsa+set}" = set; then : withval=$with_alsa; else with_alsa=check fi if test "x$with_alsa" != xno; then alsa_save_CFLAGS="$CFLAGS" alsa_save_LDFLAGS="$LDFLAGS" alsa_save_LIBS="$LIBS" alsa_found=yes # Check whether --with-alsa-prefix was given. if test "${with_alsa_prefix+set}" = set; then : withval=$with_alsa_prefix; alsa_prefix="$withval" else alsa_prefix="" fi # Check whether --with-alsa-inc-prefix was given. if test "${with_alsa_inc_prefix+set}" = set; then : withval=$with_alsa_inc_prefix; alsa_inc_prefix="$withval" else alsa_inc_prefix="" fi # Check whether --enable-alsatest was given. if test "${enable_alsatest+set}" = set; then : enableval=$enable_alsatest; enable_alsatest="$enableval" else enable_alsatest=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA CFLAGS" >&5 $as_echo_n "checking for ALSA CFLAGS... " >&6; } if test "$alsa_inc_prefix" != "" ; then ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" CFLAGS="$CFLAGS -I$alsa_inc_prefix" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_CFLAGS" >&5 $as_echo "$ALSA_CFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA LDFLAGS" >&5 $as_echo_n "checking for ALSA LDFLAGS... " >&6; } if test "$alsa_prefix" != "" ; then ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" LDFLAGS="$LDFLAGS $ALSA_LIBS" fi ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" LIBS="$ALSA_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_LIBS" >&5 $as_echo "$ALSA_LIBS" >&6; } min_alsa_version=1.0.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libasound headers version >= $min_alsa_version" >&5 $as_echo_n "checking for libasound headers version >= $min_alsa_version... " >&6; } no_alsa="" alsa_min_major_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` alsa_min_minor_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` alsa_min_micro_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { /* ensure backward compatibility */ #if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) #define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR #endif #if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) #define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR #endif #if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) #define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR #endif # if(SND_LIB_MAJOR > $alsa_min_major_version) exit(0); # else # if(SND_LIB_MAJOR < $alsa_min_major_version) # error not present # endif # if(SND_LIB_MINOR > $alsa_min_minor_version) exit(0); # else # if(SND_LIB_MINOR < $alsa_min_minor_version) # error not present # endif # if(SND_LIB_SUBMINOR < $alsa_min_micro_version) # error not present # endif # endif # endif exit(0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: found." >&5 $as_echo "found." >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not present." >&5 $as_echo "not present." >&6; } alsa_found=no fi rm -f core conftest.err 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 if test "x$enable_alsatest" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_ctl_open in -lasound" >&5 $as_echo_n "checking for snd_ctl_open in -lasound... " >&6; } if test "${ac_cv_lib_asound_snd_ctl_open+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $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 snd_ctl_open (); int main () { return snd_ctl_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_ctl_open=yes else ac_cv_lib_asound_snd_ctl_open=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_asound_snd_ctl_open" >&5 $as_echo "$ac_cv_lib_asound_snd_ctl_open" >&6; } if test "x$ac_cv_lib_asound_snd_ctl_open" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else alsa_found=no fi fi if test "x$alsa_found" = "xyes" ; then RTMIDI="../midi/libmidi.a" RTMIDI_DIR="midi" LIBS=`echo $LIBS | sed 's/-lasound//g'` LIBS=`echo $LIBS | sed 's/ //'` LIBS="-lasound $LIBS" fi if test "x$alsa_found" = "xno" ; then if test "x$with_alsa" != xcheck; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "--with-alsa was given, but test for alsa failed See \`config.log' for more details." "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ALSA not found - midi support disabled" >&5 $as_echo "$as_me: WARNING: ALSA not found - midi support disabled" >&2;} fi CFLAGS="$alsa_save_CFLAGS" LDFLAGS="$alsa_save_LDFLAGS" LIBS="$alsa_save_LIBS" ALSA_CFLAGS="" ALSA_LIBS="" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gzopen" >&5 $as_echo_n "checking for library containing gzopen... " >&6; } if test "${ac_cv_search_gzopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 gzopen (); int main () { return gzopen (); ; return 0; } _ACEOF for ac_lib in '' z; 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_gzopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_gzopen+set}" = set; then : break fi done if test "${ac_cv_search_gzopen+set}" = set; then : else ac_cv_search_gzopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gzopen" >&5 $as_echo "$ac_cv_search_gzopen" >&6; } ac_res=$ac_cv_search_gzopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_LIBZ 1" >>confdefs.h fi #AC_CHECK_LIB(zzip, zzip_file_open,,AC_MSG_ERROR("Cannot find -lzzip")) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; 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_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_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_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; 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_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_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_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZZIP" >&5 $as_echo_n "checking for ZZIP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$ZZIP_CFLAGS"; then pkg_cv_ZZIP_CFLAGS="$ZZIP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zziplib >= 0.10.75\""; } >&5 ($PKG_CONFIG --exists --print-errors "zziplib >= 0.10.75") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ZZIP_CFLAGS=`$PKG_CONFIG --cflags "zziplib >= 0.10.75" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$ZZIP_LIBS"; then pkg_cv_ZZIP_LIBS="$ZZIP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zziplib >= 0.10.75\""; } >&5 ($PKG_CONFIG --exists --print-errors "zziplib >= 0.10.75") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ZZIP_LIBS=`$PKG_CONFIG --libs "zziplib >= 0.10.75" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ZZIP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "zziplib >= 0.10.75"` else ZZIP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "zziplib >= 0.10.75"` fi # Put the nasty error message in config.log where it belongs echo "$ZZIP_PKG_ERRORS" >&5 as_fn_error "Package requirements (zziplib >= 0.10.75) were not met: $ZZIP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables ZZIP_CFLAGS and ZZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables ZZIP_CFLAGS and ZZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else ZZIP_CFLAGS=$pkg_cv_ZZIP_CFLAGS ZZIP_LIBS=$pkg_cv_ZZIP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi SDL_VERSION=1.2.0 # Check whether --with-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then : withval=$with_sdl_prefix; sdl_prefix="$withval" else sdl_prefix="" fi # Check whether --with-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then : withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi # Check whether --enable-sdltest was given. if test "${enable_sdltest+set}" = set; then : enableval=$enable_sdltest; else enable_sdltest=yes fi if test x$sdl_exec_prefix != x ; then sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; 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_path_SDL_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_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_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_sdl_version=$SDL_VERSION { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; } no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_sdl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" as_fn_error "Please install libSDL" "$LINENO" 5 fi rm -f conf.sdltest CPPFLAGS="$CPPFLAGS -D__FORCE_SDL_AUDIO__" # Check that SDL supports the X11 wm { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether SDL supports X11" >&5 $as_echo_n "checking whether SDL supports X11... " >&6; } OLDCPPFLAGS=$CPPFLAGS CPPFLAGS=$SDL_CFLAGS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include const int test = SDL_SYSWM_X11; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_X11 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS=$OLDCPPFLAGS # Jack is dynamically linked to ease binary portability (no longer required) # Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; else with_jack=check fi if test x$with_jack != xno; then for ac_header in jack/jack.h do : ac_fn_c_check_header_mongrel "$LINENO" "jack/jack.h" "ac_cv_header_jack_jack_h" "$ac_includes_default" if test "x$ac_cv_header_jack_jack_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_JACK_JACK_H 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5 $as_echo_n "checking for library containing dlsym... " >&6; } if test "${ac_cv_search_dlsym+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 dlsym (); int main () { return dlsym (); ; return 0; } _ACEOF for ac_lib in '' dl; 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_dlsym=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_dlsym+set}" = set; then : break fi done if test "${ac_cv_search_dlsym+set}" = set; then : else ac_cv_search_dlsym=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5 $as_echo "$ac_cv_search_dlsym" >&6; } ac_res=$ac_cv_search_dlsym if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error "Dynamic library support not found - required for JACK support" "$LINENO" 5 fi else if test x$with_jack != xcheck; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "--with-jack was given, but JACK headers were not found See \`config.log' for more details." "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: JACK headers not found, JACK support disabled" >&5 $as_echo "$as_me: WARNING: JACK headers not found, JACK support disabled" >&2;} fi fi done fi # 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if defined S_ISBLK && defined S_IFDIR extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; #endif #if defined S_ISBLK && defined S_IFCHR extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; #endif #if defined S_ISLNK && defined S_IFREG extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; #endif #if defined S_ISSOCK && defined S_IFREG extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stat_broken=no else ac_cv_header_stat_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 $as_echo "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then $as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if test "${ac_cv_header_stdbool_h+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; bool e = &s; char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; # if defined __xlc__ || defined __GNUC__ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 reported by James Lemley on 2005-10-05; see http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html This test is not quite right, since xlc is allowed to reject this program, as the initializer for xlcbug is not one of the forms that C requires support for. However, doing the test right would require a runtime test, and that would make cross-compilation harder. Let us hope that IBM fixes the xlc bug, and also adds support for this kind of constant expression. In the meantime, this test will reject xlc, which is OK, since our stdbool.h substitute should suffice. We also test this with GCC, where it should work, to detect more quickly whether someone messes up the test in the future. */ char digs[] = "0123456789"; int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); # endif /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* 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"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 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; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if test "${ac_cv_c_inline+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" case $ac_cv_c_int8_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int8_t $ac_cv_c_int8_t _ACEOF ;; esac 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 : else cat >>confdefs.h <<_ACEOF #define off_t long int _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 : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLOCKS 1 _ACEOF $as_echo "#define HAVE_ST_BLOCKS 1" >>confdefs.h else case " $LIBOBJS " in *" fileblocks.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS fileblocks.$ac_objext" ;; esac 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if test "${ac_cv_struct_tm+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "#define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if test "${ac_cv_c_volatile+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTRDIFF_T 1 _ACEOF fi # Checks for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if test "${ac_cv_func_closedir_void+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if test "${ac_cv_lib_error_at_line+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then case " $LIBOBJS " in *" error.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS error.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if test "${ac_cv_sys_largefile_source+set}" = set; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi 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 : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 $as_echo_n "checking for working memcmp... " >&6; } if test "${ac_cv_func_memcmp_working+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_memcmp_working=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_memcmp_working=yes else ac_cv_func_memcmp_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 $as_echo "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac for ac_header in stdlib.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE /* Assume that all systems that can run configure have sys/param.h. */ # ifndef HAVE_SYS_PARAM_H # define HAVE_SYS_PARAM_H 1 # endif # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; int i, pagesize; int fd; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 1; if (write (fd, data, pagesize) != pagesize) return 1; close (fd); /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 1; data2 = (char *) malloc (2 * pagesize); if (!data2) return 1; data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 1; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 1; if (read (fd, data3, pagesize) != pagesize) return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 1; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if test "${ac_cv_func_select_args+set}" = set; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : ${ac_cv_func_select_args='int,int *,struct timeval *'} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 $as_echo_n "checking whether lstat dereferences a symlink specified with a trailing slash... " >&6; } if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi for ac_func in atexit floor getcwd gettimeofday memmove memset munmap pow select sqrt strcasecmp strdup strerror strrchr 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" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files Makefile src/Makefile src/compression/Makefile src/compression/zziplib/generic/Makefile src/fx/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/ppui/osinterface/Makefile src/tracker/Makefile" 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 overridden 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, we kill variables containing newlines. # 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. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}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 "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\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" && { $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 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;} 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}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # 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 ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by MilkyTracker $as_me 0.90.85, which was generated by GNU Autoconf 2.64. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet, --silent do not print progress messages -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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ MilkyTracker config.status 0.90.85 configured by $0, generated by GNU Autoconf 2.64, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/compression/Makefile") CONFIG_FILES="$CONFIG_FILES src/compression/Makefile" ;; "src/compression/zziplib/generic/Makefile") CONFIG_FILES="$CONFIG_FILES src/compression/zziplib/generic/Makefile" ;; "src/fx/Makefile") CONFIG_FILES="$CONFIG_FILES src/fx/Makefile" ;; "src/midi/Makefile") CONFIG_FILES="$CONFIG_FILES src/midi/Makefile" ;; "src/milkyplay/Makefile") CONFIG_FILES="$CONFIG_FILES src/milkyplay/Makefile" ;; "src/ppui/Makefile") CONFIG_FILES="$CONFIG_FILES src/ppui/Makefile" ;; "src/ppui/osinterface/Makefile") CONFIG_FILES="$CONFIG_FILES src/ppui/osinterface/Makefile" ;; "src/tracker/Makefile") CONFIG_FILES="$CONFIG_FILES src/tracker/Makefile" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; 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 # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 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" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # 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 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # 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 || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # 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 break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$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 `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # 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 by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;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 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"; } && { $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" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$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 { $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" \ || 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" \ || as_fn_error "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # 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=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || 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 || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi #([Makefile src/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/fx/Makefile src/tracker/Makefile src/compression/Makefile]) milkytracker-0.90.85+dfsg/COPYING0000644000175000017500000010500311316456771015470 0ustar admin2admin2Note: Since the 0.90.85 release, Milkyplay (the player library used by MilkyTracker) is now licensed under the New-BSD license. The rest of MilkyTracker remains covered by the GPL: GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . milkytracker-0.90.85+dfsg/README0000644000175000017500000000205711317505267015316 0ustar admin2admin2Notes on building MilkyTracker ============================== See INSTALL for a more general explanation of how 'configure' works. The configure scripts try to check for everything needed, and will also auto-detect ALSA and JACK adding support automatically; However, this behaviour can be over-ridden using the following arguments to configure: --with-alsa | --with-jack Force build to use alsa/jack, build will fail if not found. --without-alsa | --without-jack Disable alsa/jack support. Note that the configure scripts plus associated Makefiles are designed to build the SDL version of MilkyTracker only. Build files for other targets (OSX, win32, wince) can be found in the 'platforms' directory. Dependencies ============ To build MilkyTracker you will need the following development libraries: ALSA (optional) JACK (optional) SDL libz Note to package maintainers: MilkyTracker contains an internal copy of libzzip that has been modified for use with MilkyTracker; An externally linked libzzip will not work correctly (ZIP support will be broken). milkytracker-0.90.85+dfsg/missing0000755000175000017500000002623311317506534016035 0ustar admin2admin2#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, 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, see . # 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: milkytracker-0.90.85+dfsg/configure.in0000644000175000017500000000726711254507623016755 0ustar admin2admin2# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ(2.61) AC_INIT(MilkyTracker, 0.90.85, www.milkytracker.net) AC_CONFIG_SRCDIR(src) AM_INIT_AUTOMAKE(dist-bzip2) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_CPP AC_PROG_AWK AC_PROG_INSTALL AC_PROG_RANLIB AC_PROG_MKDIR_P # Checks for header files. AC_HEADER_DIRENT AC_HEADER_STDC AC_CHECK_HEADERS_ONCE([fcntl.h inttypes.h limits.h malloc.h memory.h stddef.h stdint.h stdlib.h string.h strings.h sys/ioctl.h sys/param.h sys/time.h unistd.h],,AC_MSG_ERROR([One or more required header files are missing])) # AC_CHECK_HEADER(zzip/lib.h,,AC_MSG_ERROR("Cannot find zzip/lib.h")) # Checks for libraries. AC_ARG_WITH([alsa], [AS_HELP_STRING([--with-alsa], [Enable native ALSA sound/midi support @<:@default=check@:>@])], [], [with_alsa=check]) if test "x$with_alsa" != xno; then AM_PATH_ALSA([1.0.0],[ RTMIDI="../midi/libmidi.a" RTMIDI_DIR="midi" AC_SUBST(RTMIDI) AC_SUBST(RTMIDI_DIR)], [if test "x$with_alsa" != xcheck; then AC_MSG_FAILURE([--with-alsa was given, but test for alsa failed]) else AC_MSG_WARN([ALSA not found - midi support disabled]) fi]) fi AC_SEARCH_LIBS(gzopen, z, AC_DEFINE([HAVE_LIBZ], [1], [Define to 1 if you have the 'libz' library.]),) #AC_CHECK_LIB(zzip, zzip_file_open,,AC_MSG_ERROR("Cannot find -lzzip")) PKG_CHECK_MODULES([ZZIP],[zziplib >= 0.10.75]) SDL_VERSION=1.2.0 AM_PATH_SDL($SDL_VERSION,, AC_MSG_ERROR([Please install libSDL])) CPPFLAGS="$CPPFLAGS -D__FORCE_SDL_AUDIO__" # Check that SDL supports the X11 wm AC_MSG_CHECKING([whether SDL supports X11]) OLDCPPFLAGS=$CPPFLAGS CPPFLAGS=$SDL_CFLAGS AC_COMPILE_IFELSE( [#include const int test = SDL_SYSWM_X11;], [AC_MSG_RESULT([yes])] AC_DEFINE([HAVE_X11], [1], [SDL supports X11 features]), [AC_MSG_RESULT([no])]) CPPFLAGS=$OLDCPPFLAGS # Jack is dynamically linked to ease binary portability (no longer required) AC_ARG_WITH([jack], [AS_HELP_STRING([--with-jack], [Enable JACK support @<:@default=check@:>@])], [], [with_jack=check]) if test x$with_jack != xno; then AC_CHECK_HEADERS([jack/jack.h], [AC_SEARCH_LIBS(dlsym,dl,,[AC_MSG_ERROR([Dynamic library support not found - required for JACK support])])], [if test x$with_jack != xcheck; then AC_MSG_FAILURE([--with-jack was given, but JACK headers were not found]) else AC_MSG_WARN([JACK headers not found, JACK support disabled]) fi]) fi # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STAT AC_HEADER_STDBOOL AC_C_CONST AC_C_INLINE AC_TYPE_INT16_T AC_TYPE_INT32_T AC_TYPE_INT64_T AC_TYPE_INT8_T AC_TYPE_OFF_T AC_TYPE_SIZE_T AC_STRUCT_ST_BLOCKS AC_HEADER_TIME AC_STRUCT_TM AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T AC_C_VOLATILE AC_CHECK_TYPES([ptrdiff_t]) # Checks for library functions. AC_FUNC_CLOSEDIR_VOID AC_FUNC_ERROR_AT_LINE AC_FUNC_FSEEKO AC_PROG_GCC_TRADITIONAL AC_FUNC_MALLOC AC_FUNC_MEMCMP AC_FUNC_MMAP AC_FUNC_REALLOC AC_FUNC_SELECT_ARGTYPES AC_FUNC_STAT AC_CHECK_FUNCS([atexit floor getcwd gettimeofday memmove memset munmap pow select sqrt strcasecmp strdup strerror strrchr]) AC_CONFIG_HEADER(config.h) AC_CONFIG_FILES([Makefile src/Makefile src/compression/Makefile src/compression/zziplib/generic/Makefile src/fx/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/ppui/osinterface/Makefile src/tracker/Makefile]) AC_OUTPUT #([Makefile src/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/fx/Makefile src/tracker/Makefile src/compression/Makefile]) milkytracker-0.90.85+dfsg/install-sh0000755000175000017500000003253711317506534016446 0ustar admin2admin2#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # 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. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$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 $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # 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. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: milkytracker-0.90.85+dfsg/resources/0000755000175000017500000000000011317506162016437 5ustar admin2admin2milkytracker-0.90.85+dfsg/resources/reference/0000755000175000017500000000000011317506162020375 5ustar admin2admin2milkytracker-0.90.85+dfsg/resources/reference/xm-form.txt0000755000175000017500000011415310751412325022531 0ustar admin2admin2The "Complete" XM module format specification v0.81 ============================================= ----- Compiled and written by Matti "ccr" Hamalainen of TNSP 2000-2001 Contact ccr/TNSP at: e-mail: ccr@tnsp.org www : http://www.tnsp.org/ NEWS/CHANGES FROM V0.75 ----------------------- - Typofixes - Info about Vibrato, - Info about other programs than FT2 that support XM and discussion about how they differ from FT. - Player processing info - More info about other effects TO-DO LIST ---------- - Research workings of the rest of the effects. - Do a complete check of accuracy to this doc. (e.g. test all info that is said here.) ============================================================================ DESCRIPTION ----------- NOTICE: I DON'T claim that the information in this document is errorfree, so use common sense if you encounter something that does not match! I am constantly improving this doc, send your reports to me and I'll see if I can figure out what went wrong. :) This documentation was written due to lack of 'complete' guide to the XM format. In 2000 I used the modified XM document by Sahara Surfers when I started writing XM loader/player for "J Sound System". It was good, but still lacked some crucial information. During the development of J Sound System I have gathered some additional information (and still continue to do so). This document is the result of that work. Remember - the information contained herein is based on tests on REAL XM files and REAL FT2 :) If you have any questions, fixes or suggestions (to add info about something, for example), e-mail me. ============================================================================ SOURCE MATERIAL AND ADDITIONAL CREDITS -------------------------------------- - Lots of empirical and systematic testing in FT2. Hours and hours of "to-FT2-shell-to-DOS-write-doc-back-to-FT2-...", beer, coffee, swearing, XXX, etc. - Investigating PT 3.61 internals. - Testing of J Sound System's XM player. - Testing of other players to see the common pitfalls ;) This document is based on the original XM format description: (C) Copyright 1994 by Mr.H of Triton productions (Distributed in public domain) Some information is from the enchanged XM description written by Guru and Alfred of Sahara Surfers in 1995: "Not copyrighted, released into public domain (at least the additions by us). Feel free to do what you wish. Credits please." Some bug information from ODE2PTK.MOD's documentation written and gathered by Chipaux Sylvain aka Asle/Lithium^ReDoX Greetings also to: - My friends who have beared me talking about FT2's "features" and swearing the bugs in "Other Players", etc. - All TNSP members: fgcl, mdx, sind., delfine, ssad. - All demoscene people over the world, demo on! (But please try not to make 3D stuff only, it's boring :-) ============================================================================ DISCLAIMER ---------- You can use this information in any way you wish as long as it is distributed freely and no payment is taken for distributing it (maybe except a minimal fee for the physical copying process). Also the authors may not be held responsible for anything including but not excluding damages, loss of profit or similar. This information is provided in hope that it is useful, but there are no warranties of any kind that the information contained in this document is in any way correct or usable. The responsibility for consequences when using the information is entirely on the user. ============================================================================ ******************** * General layout * ******************** The layout of a typical XM is like this: XM header (up to and excluding header size field, now 60 bytes) Rest of the header (length including header size field) Pattern 0 header (length in header) Pattern 0 data (length in header) Pattern 1 header (length in header) Pattern 1 data (length in header) ... (* number of patterns) Instrument 0 header (length in size field is this and next one together) if (numSample > 0) Extra header Sample 0 header (size in instrument extra header) Sample 1 header (size in instrument extra header) ... (* number of samples in instrument) Sample 0 data (length in sample header) Sample 1 data (length in sample header) ... (* number of samples in instrument) Instrument 1 header (length in size field is this and next one together) ... (* number of instruments) ****************************** * The XM file structure: * ****************************** HEADER ====== Offset|Length| Type | Description ------+------+--------+-------------------------------------------- 0 | 17 | (char) | ID text: 'Extended Module: ' | | | (The last character is space, i.e. $20) 17 | 20 | (char) | Module name, padded with zeros. 37 | 1 | (char) | Always $1a 38 | 20 | (char) | Tracker name 58 | 2 | (word) | Version number, hi-byte major and low-byte minor | | | The current format is version $0104. Format | | | versions below $0104 have a LOT of differences. | | | Remember to check this field! Your loader will | | | probably crash if you don't! | | | 60 | 4 | (dword)| Header size | | | Calculated FROM THIS OFFSET, NOT from | | | the beginning of the file! +4 | 2 | (word) | Song length (in pattern order table) +6 | 2 | (word) | Song restart position +8 | 2 | (word) | Number of channels (2, 4, 6, 8, 10, ..., 32) +10 | 2 | (word) | Number of patterns (max 256) | | | NOTICE: This might not include all patterns used! | | | If empty patterns are used at the end of the song | | | they are NOT saved to the file!! +12 | 2 | (word) | Number of instruments (max 128) +14 | 2 | (word) | Flags field: | | | bit0: 0 = Amiga frequency table | | | 1 = Linear frequency table +16 | 2 | (word) | Default tempo +18 | 2 | (word) | Default BPM +20 | 256 | (byte) | Pattern order table PATTERNS ======== Offset|Length| Type | Description ------+------+--------+-------------------------------------------- ? | 4 | (dword)| Pattern header length +4 | 1 | (byte) | Packing type (always 0) +5 | 2 | (word) | Number of rows in pattern (1..256) +7 | 2 | (word) | Packed patterndata size | | | << Note! This is zero if the pattern is | | | completely empty and no pattern data | | | follows! >> | | | ? | ? | | Packed pattern data. INSTRUMENTS =========== Offset|Length| Type | Description ------+------+--------+-------------------------------------------- ? | 4 | (dword)| Instrument HEADER size (SEE THE NOTICE BELOW) +4 | 22 | (char) | Instrument name +26 | 1 | (byte) | Instrument type (always 0) | | | << In reality, this seems pretty random, | | | so DON'T assume that it's zero. >> | | | +27 | 2 | (word) | Number of samples in instrument. NOTICE: The "Instrument HEADER Size" field tends to be more than the actual size of the structure documented here (it includes also the extended instrument sample header below). So remember to check it and skip the additional bytes before the first sample header! If the number of samples is greater than zero, then this will follow: (if it is zero, nothing will follow!) Offset|Length| Type | Description ------+------+--------+-------------------------------------------- +29 | 4 | (dword)| Sample header size +33 | 96 | (byte) | Sample number for all notes +129 | 48 | (byte) | Points for volume envelope +177 | 48 | (byte) | Points for panning envelope +225 | 1 | (byte) | Number of volume points +226 | 1 | (byte) | Number of panning points +227 | 1 | (byte) | Volume sustain point +228 | 1 | (byte) | Volume loop start point +229 | 1 | (byte) | Volume loop end point +230 | 1 | (byte) | Panning sustain point +231 | 1 | (byte) | Panning loop start point +232 | 1 | (byte) | Panning loop end point +233 | 1 | (byte) | Volume type: bit 0: On; 1: Sustain; 2: Loop +234 | 1 | (byte) | Panning type: bit 0: On; 1: Sustain; 2: Loop +235 | 1 | (byte) | Vibrato type +236 | 1 | (byte) | Vibrato sweep +237 | 1 | (byte) | Vibrato depth +238 | 1 | (byte) | Vibrato rate +239 | 2 | (word) | Volume fadeout +241 | 2 | (word) | Reserved Envelope format --------------- The envelope-data (for both Volume and Panning envelope) is formatted as follows: Data for ONE envelope point: Offset|Length| Type | Description ------+------+--------+-------------------------------------------- ? | 1 | (word) | Frame number of the point (X-coordinate) ? | 1 | (word) | Value of the point (Y-coordinate) Since one envelope point takes 2 words (2*2 bytes), the total maximum number of points in envelope is (48/4) = 12 points. So in practice, you have: #define MAX_ENVELOPE_POINTS 12 typedef { WORD nframe; WORD value; } t_envelope_point; t_envelope_point volume_envelope[MAX_ENVELOPE_POINTS]; t_envelope_point panning_envelope[MAX_ENVELOPE_POINTS]; Envelope frame-counters work in range 0..FFFFh (0..65535 dec). BUT! FT2 only itself supports only range 0..FFh (0..255 dec). Some other trackers (like SoundTracker for Unix), however, can use the full range 0..FFFF, so it should be supported. !!TIP: This is also a good way to detect if the module has been made with FT2 or not. (In case the tracker name is brain- deadly left unchanged!) Of course it does not help if all instruments have the values inside FT2 supported range. The value-field of the envelope point is ranged between 00..3Fh (0..64 dec). SAMPLE HEADERS ============== "Number of samples" of these will follow after the instrument header. See also the XM file general layout in the beginning of this file to understand better/get the big picture. Offset|Length| Type | Description ------+------+--------+-------------------------------------------- ? | 4 | (dword)| Sample length +4 | 4 | (dword)| Sample loop start +8 | 4 | (dword)| Sample loop length +12 | 1 | (byte) | Volume +13 | 1 | (byte) | Finetune (signed byte -16..+15) +14 | 1 | (byte) | Type of sample, bit meanings: | | | 0-1: 00 = 0 dec = No loop, | | | 01 = 1 dec = Forward loop, | | | 11 = 2 dec = Ping-pong loop; | | | 4: 16-bit sampledata +15 | 1 | (byte) | Panning (0-255) +16 | 1 | (byte) | Relative note number (signed byte) +17 | 1 | (byte) | Reserved +18 | 22 | (char) | Sample name NOTICE: Note! After the instrument header the file contains ALL sample headers for the instrument followed by the sample data for all samples. Also note that it is possible that samples have loops with length zero. In that case the loops just have to be skipped. Sample data ----------- Sample data is stored as signed values: * 8-bit sample : char in C if char is 8bit, ShortInt in Pascal. * 16-bit sample: int in C, Integer in Pascal. The saved data uses simple delta-encoding to achieve better compression ratios (when compressed with pkzip, etc.) Pseudocode for converting the delta-coded data to normal data, for 8-bit samples: signed byte old, new; old = 0; for i = 0 to data_len { new = sample[i] + old; sample[i] = new; old = new; } NOTICE: 16-bit samples are encoded in same way, except that the datatype is 16-bit. ============================================================================ *********************** * Pattern format: * *********************** The patterns are stored as ordinary MOD patterns, except that each note is stored as 5 bytes: ? 1 (byte) Note (1 - 96, 97 = KEY-OFF) +1 1 (byte) Instrument (1-128) +2 1 (byte) Volume column byte (see below) +3 1 (byte) Effect type +4 1 (byte) Effect parameter A simple packing scheme is also applied, so that the patterns do not get TOO large: Since the MSB in the note value is never used, it is used for the compression. If the bit is set, then the other bits are interpreted as follows: bit 0 set: Note follows 1 set: Instrument follows 2 set: Volume column byte follows 3 set: Effect follows 4 set: Effect parameter follows It is very simple, but far from optimal. If you want to get better compression, you can always repack the patterns in your loader. PSEUDOCODE: ... dbyt = getbyte(); if (dbyt AND 0x80) { if (dbyt AND 0x01) c_note = getbyte(); if (dbyt AND 0x02) c_inst = getbyte(); if (dbyt AND 0x04) c_vol = getbyte(); if (dbyt AND 0x08) c_effect = getbyte(); if (dbyt AND 0x10) c_param = getbyte(); } else { c_note = dbyt; current_row++; } ... ============================================================================ ************************* * Player Processing: * ************************* This information is almost straight from XMP's technical documents (see "other docs" section for more info), and it explains how FT2 handles the different playing events: Play = Play new note with new default volume Switch = Play new note with current volume OldVol = Don't play sample, set old default volume Cut = Stop playing sample Cont = Continue playing sample ---------- INSTRUMENT ----------- Event | None | Same | Valid | Invalid ---------------+--------+--------+--------+---------------------- New Note | Switch | Play | Play | Cut (1) New Instrument | - | OldVol | OldVol | OldVol Tone Porta | Cont | OldVol | OldVol | OldVol (1) This means that if There was NO instrument, FT2 Switches. And if it is Same as currently playing instrument, FT2 Plays, etc. ============================================================================ ******************** * Instruments: * ******************** INTRODUCTION ------------ Instruments are a way to have more special control over playing of the sample(s) and "combining" several samples into one "package" that can be used in similar way to a normal sample. This means that, numerous (16 in XM format) samples from one "realworld" instrument could be taken in various pitches, and then, using instrument editor, combined into a good simulation of the real-world one. Why would you want to do that? You could have just one sample and save memory? And the envelopes could be done with effect commands? Yes, but many times it is much better to have several samples of one real-world instrument since if just one sound sample is used, the sound gets more distorted as the playing pitch gets further from the original sampling pitch. Using envelopes gives more flexible and general control of the instrument and you can still use the effects if you want. This is just one reason for using instruments, there are many more (tips: chiptunes, drumsets), just look around. IN XM-FORMAT ------------ In XMs, a instrument combines a maximum of 16 samples to one package with certain parameters. (NOTICE that the _internal_ representation in FT2 is not exactly same, you can notice that by looking the value-ranges in here, sample-header structures and in FT2's instrument editor...) Value Range - Instrument volume | 00..3F - Panning | 00..FF - Tuning | -128..127 - Fade-out | 000..FFF - Auto-Vibrato: * Speed | 00..3F * Depth | 00..0F * Sweep | 00..FF (In other trackers may be 0..FFFF !) - Envelopes: * Volume * Panning All of these parameter settings apply to every sample in the instrument. Envelopes and auto-vibrato are discussed further in below. ****************************** * Volumes and envelopes: * ****************************** First some mathematical stuff, explanations follow below... The volume formula ================== FinalVol = (FadeOutVol/65536)*(EnvelopeVol/64)*(GlobalVol/64)*(Vol/64)*Scale; The panning formula =================== FinalPan = Pan + ( (EnvelopePan-32)*(128-Abs(Pan-128)) / 32 ); NOTICE: The panning envelope values range from 0...64, not -128...+127 Fadeout ======= The FadeOutVol is originally 65536 (after the note has been triggered) and is decremented by "Instrument.Fadeout" each tick after note is released (with KeyOff Effect or with KeyOff Note) NOTICE: Fadeout is not processed if Volume Envelope is DISABLED. (This means that the FadeOutVol stays at 65536) Panning Envelope does not affect Fadeout. Envelopes ========= An excerpt from original XM documentation: >> The envelopes are processed once per frame, instead of every >> frame where no new notes are read. This is also true for the >> instrument vibrato and the fadeout. Since I am so lazy and the >> tracker is rather self-explaining I am not going to write any >> more for the moment. Introduction to envelopes ------------------------- Envelopes are a simple, yet ingenious way to achieve more versatile control over the instrument's volume/panning abilities with much less effort than using conventional ways (effects, volume-changes). Describing all the possibilities of envelopes (or instruments as whole!) would be impossible effort! Envelopes and instruments have been widely used in all imaginable and unimaginable ways in XMs... This is why it is important to implement these features correctly in a module-player. General information ------------------- As stated above, envelopes are processed on each "frame". The frame is quite much similar to our familiar friend "tick". Frames, however, are separate from ticks and are only reset on "envelope reset", whereas ticks are reset on every new row. In practice, the envelope processing routine should increase a "frame_counter" integer value for all envelopes (_separately_ for both volume & panning envelopes!) and for every playing instrument. This frame-counter is then used when interpolating between the envelope points. Envelope is reset (or "triggered") when: - A new note is set - A new instrument is set - A Lxx-effect is issued (See Lxx-effect description below!!) (Lxx resets both envelopes, volume and panning.) Envelope reset means that frame_counter of the envelope is set to zero or other value (in case of Lxx), the envelope is ACTIVATED and other possible internal values are initialized. PSEUDOCODE ---------- !! NOTICE: SEE XM-structure descriptions in above sections for info on the !! envelope-points! if (envelope_enabled) then PROCESS_ENVELOPE_FRAME: frame_counter = 0..65535, triggered/reset appropriately. current_point = [get the point number 0..MAX_ENVELOPE_POINTS-1 which has (nframe < frame_counter), BUT where current_point+1 point has (nframe > frame_counter) ] !! NOTICE: You don't need to worry about the first point's nframe-value, !! it will be always ZERO. (If not, then it's a buggy module :-) point_d = (env_pnts[current_point+1].nframe - env_pnts[current_point].nframe); value_d = (env_pnts[current_point+1].value - env_pnts[current_point].value); cval = (current_frame - env_pnts[current_point].nframe); final_env_output = env_pnts[current_point].value + ((value_d * cval) / point_d); This is how it works approximately, the interpolation could be made more efficient and you also have to take into account all the other things about envelopes, like triggering, etc. Check out J Sound System if you want to see how ;) I'll try to write more about this when I feel so :-) Autovibrato ----------- [Information about autovibrato may not be too accurate, I'll try to fix this when I get my tests finished on this subject.] The instrument autovibrato works like the normal vibrato effect, except that it is applied on EVERY frame of instrument and uses it's own parameters. - Vibrato is applied even if envelope(s) are not enabled. This means that you need to do the autovibrato separately from envelope processing. - The Vibrato Sweep is a parameter that describes the speed when the "full power of vibrato" is reached. After reaching the maximum value, it stays on it. - It SEEMS (or rather like "hears") that the vibrato sweep actually stays on the value it had when KeyOff was received. I am not 100% sure about this, but I it really sounds like it. I have added this to the pseudocode below. - Other parameters work as in normal vibrato effect. This is the formula that I have developed for the vibrato depth calculation: Range definitions: vib_speed = [0..3F] vib_depth = [0..F] vib_sweep = [0..FF] curr_frame= [0..FFFF] Calculations: if (keyoff = FALSE) { if (curr_frame < vib_sweep) tmp = curr_frame; else tmp = vib_sweep; } final_depth = (tmp * vib_depth) / vib_sweep; [!!!!! NOT FINISHED YET !!!!!] ******************************** * Periods and frequencies: * ******************************** PatternNote ranges in 1..96 1 = C-0 96 = B-7 97 = Key Off (special 'note') FineTune ranges between -128..+127 -128 = -1 halftone, +127 = +127/128 halftones RelativeTone is then in range -96..95, so in effect a note with RelativeTone value 0 is the note itself. Formula for calculating the real, final note value is: >> RealNote = PatternNote + RelativeTone; So the range of RealNote is 1..119, where 1 = C-0 119 = A#9 NOTICE: This is higher than the max for PatternNote (96)! Linear frequency table ====================== The formulas for calculating period and frequency for Linear frequency table, are as follows: > Period = (10*12*16*4) - (Note*16*4) - (FineTune/2) > Frequency = 8363*2^((6*12*16*4 - Period) / (12*16*4)) Which naturally can be simplified to: > Period = 7680 - (Note * 64) - (FineTune / 2) > Frequency = 8363 * 2^((4608 - Period) / 768) NOTICE: The values are reasonable. With note 119 and finetune of +128, we get: > x = 7680 - (119*64) - (128/2) > x = 64 - 64 > x = 0 Amiga frequency table ===================== The formulas for calculating period and frequency for Amiga (logarithmic) frequency table, are as follows: Period = (PeriodTab[(Note MOD 12)*8 + FineTune/16]*(1-Frac(FineTune/16)) + PeriodTab[(Note MOD 12)*8 + FineTune/16]*(Frac(FineTune/16))) *16/2^(Note DIV 12); (The period is interpolated for finer finetune values) Frequency = 8363*1712/Period; << NOTICE FROM Sahara Surfers: The interpolation code above doesn't work because of several reasons: 1. It does not interpolate. (Try adding 1 to the PeriodTab index in the second line) 2. It may go past the table beginning for negative finetune values. Write your own interpolation routine instead - it's not that hard. >> PeriodTab = Array[0..12*8-1] of Word = ( 907,900,894,887,881,875,868,862,856,850,844,838,832,826,820,814, 808,802,796,791,785,779,774,768,762,757,752,746,741,736,730,725, 720,715,709,704,699,694,689,684,678,675,670,665,660,655,651,646, 640,636,632,628,623,619,614,610,604,601,597,592,588,584,580,575, 570,567,563,559,555,551,547,543,538,535,532,528,524,520,516,513, 508,505,502,498,494,491,487,484,480,477,474,470,467,463,460,457); << Note! The period table is made for 1-based note numbers, so in practise it contains the period values for B-3 to G#4. Fun. >> ************************* * Standard effects: * ************************* ##| Eff | Info | Description --+-----+------+------------------------------ 00: 0 | | Arpeggio 01: 1 | (*) | Porta up 02: 2 | (*) | Porta down 03: 3 | (*) | Tone porta 04: 4 | (*) | Vibrato 05: 5 | (*) | Tone porta+Volume slide 06: 6 | (*) | Vibrato+Volume slide 07: 7 | (*) | Tremolo 08: 8 | | Set panning 09: 9 | | Sample offset 10: A | (*) | Volume slide 11: B | | Position jump 12: C | | Set volume 13: D | | Pattern break 14: E1 | (*) | Fine porta up --: E2 | (*) | Fine porta down --: E3 | | Set gliss control --: E4 | | Set vibrato control --: E5 | | Set finetune --: E6 | | Set loop begin/loop --: E7 | | Set tremolo control --: E9 | | Retrig note --: EA | (*) | Fine volume slide up --: EB | (*) | Fine volume slide down --: EC | | Note cut --: ED | | Note delay --: EE | | Pattern delay 15: F | | Set tempo/BPM 16: G | | Set global volume 17: H | (*) | Global volume slide 20: K | | Key off (Also note number 97) 21: L | | Set envelope position 24: P | (*) | Panning slide 26: R | (*) | Multi retrig note 28: T | | Tremor 31: X1 | (*) | Extra fine porta up --: X2 | (*) | Extra fine porta down (*) = If the effect PARAMETER byte is zero, the last nonzero byte for the effect should be used. (This means that the effect "remembers" it's parameters!) This also applies to E1x/E2x, EAx/EBx, X1x/X2x, where the "x" is checked for zero, if it is zero, then use last non-zero. SEE ALSO THE INDIVIDUAL EFFECT NOTES BELOW! (For more information and bugs + specialties) In general, the commands are reasonably Protracker compatible although not all PT "features" (some might call them replay routine bugs) are implemented. ************************** * Effect descriptions: * ************************** This is the effect info section. All the information contained here is based on my (ccr) experiments on FT2 and XM format. I have only added notes for the effects that need some attention, the ones left out should be implemented as in PT MOD. 1xx - Porta up (*) ------------------- Bends the frequency of channel/sample UP by PERIODS. NOTICE! Parameters (and their saved values) are SEPARATE from values of effect 2xx (Porta down) and 3xx (Tone porta)!! 2xx - Porta down (*) --------------------- Bends the frequency of channel/sample DOWN by PERIODS. NOTICE! Parameters (and their saved values) are SEPARATE from values of effect 1xx (Porta up) and 3xx (Tone porta)!! 3xx - Tone porta (*) --------------------- Bends the frequency of channel/sample to the given and saved note value by PERIODS. NOTICE#1! Parameters (and their saved values) are SEPARATE from values of effect 1xx (Porta up) and 2xx (Porta down)!! NOTICE#2! If a new note is got, but porta speed (parameter) is 0, the new note is ignored. NOTICE#3! The NOTICE#2 also applies to new instrument number! (This does not work as in Impulse Tracker!) SEE ALSO: Volume column Tone porta. 4xy - Vibrato (*) ------------------ SEE ALSO: Volume column vibrato. --------------------======================== 5xx - Tone porta+Volume slide (*) 6xx - Vibrato+Volume slide (*) 7xy - Tremolo (*) 8xx - Set panning --------------------======================== 9xx - Sample offset (*) ------------------------ Set sample offset to parameter * 256 units (aka bytes or 16-bit words, depending on the sample format). NOTICE#1! Unlike stated in original XM documentation, this effect DOES remember it's parameters, aka last non-zero parameter is used. NOTICE#2! If there is no instrument set on the same row, this effect is ignored: C-4 01 -- 950 >> Plat from offset 256*50H <--+ ... .. -- 000 | C-4 01 -- 000 >> Play from offset 0 | ... .. -- 000 | C-4 01 -- 900 >> Play from offset 256*50H ---+ ... .. -- 910 >> No instrument, 9xx IGNORED! | C-4 01 -- 900 >> Play from offset 256*50H ---+ Axy - Volume slide (*) ----------------------- Remembers it's parameters, but is NOT connected with the volume column effect volume slides. SEE ALSO: Volume column Volume slide. Cxx - Set volume ----------------- The volume column effects are not supported by this command, so don't use the same routine as the "main" volume setting for this (IF you use that for vol.col. effect checking too!). Dxx - Pattern break -------------------- Works like in S3M/MOD. The parameter is in BCD format, and the final row for jump is calculated as follows: jump_to_row = (paramY*10 + paramX) E1x - Fine portamento Up ------------------------ ... E2x - Fine portamento Down -------------------------- ... E6x - Set loop begin/loop -------------------------- This effect may SEEM TO USUALLY work, BUT: 1) If a loop is set on pattern N in row R (with E60), and no pattern jump/break effects are used after that, FT2 will start playing the next pattern (N+1) from row R instead of row 0! a) Pattern Jump and Pattern Break reset this. Bug only occurs if PJ or PB have NOT been used. a) Affects also MOD-files made with FT2! So MOD-players should also support this "feature". [Tested with: 2.04, 2.06 and 2.08] 2) If two or more pattern loop commands are on the same row (on different channels), strange behaviour occur: FT2 may jump to a random row, or perform the loop random times or even do the effect right, but at least v2.08 did all these just randomly without any reproducable pattern! NOTICE: This is a REAL BUG in FT2 and the working of the effects is random and cannot be reproduced. (So you don't need to bother to implement this.) NOTICE TO TRACKERS: Avoid using two or more Pattern Loops on same row as this effect is buggy and results are undefined! (It may first SEEM that it works right, but try to play it 5-10 times [with Play Song/Play Pattern] and you will see that it does strange things.) [Tested with: 2.06 and 2.08] ADDITIONAL: The Loop Position is NOT zeroed when the pattern changes, so if set to row X previously, and on some other pattern does not re-set it, a loop effect will loop to the same row. (In Scream Tracker 3 S3M-format, the loop-position is reset to 0 always when the pattern changes! Impulse Tracker [2.14 at least] is similar to FT2, it also uses the latest parameter.) E9x - Retrig note ------------------ ... EEx - Pattern delay -------------------- This effect works otherwise normally, BUT: FT2 simply forgets to play/update other effects on the row when there's a Pattern Delay: 01|--- -- EB1|--- -- EE5|... The Fine Volume Slide Down (EB1) won't be played here, thought it should be updated five times (EE5)! [Tested with: 2.04, 2.06 and 2.08] Fxx - Set Speed / Tempo ------------------------ if (Param > 0) then if (Param <= $1F) then Speed = Param; else Tempo = Param; As you notice, a zero parameter should be ignored. Kxx - Key Off ( also note number 97 ) -------------------------------------- The parameter of this effect does not have any meaning. (At least any that I would be aware of) This effect does the same as note-number 97 dec, in practice, it "releases" the virtual "key" or note. See description of Instruments and Envelopes above for more info. Lxx - Set envelope position ---------------------------- Set the current position in the envelopes to FRAME number XX, between 00-FFh. (See also Envelope-description section for more information) This command also re-triggers the ENVELOPES (not the note/sample though), so if the envelope had stopped, it will be reset (and set to the given offset position.) UNKNOWN: (TO-DO-list) - Does it reset other than framepos? (e.g. fadeout?) Pxx - Panning slide (*) ------------------------ ... Rxx - Multi retrig note (*) ---------------------------- ... Txx - Tremor ------------- ... ********************************* * Effects in volume column: * ********************************* All effects in the volume column should work as the standard effects. The volume column is interpreted before the standard effects, so some standard effects may override volume column effects. Value | Meaning ---------+----------------------------- 0 | Do nothing $10-$50 | Set volume (Value-$10) : | : : : | : : $60-$6f | Volume slide down $70-$7f | Volume slide up $80-$8f | Fine volume slide down $90-$9f | Fine volume slide up $a0-$af | Set vibrato speed $b0-$bf | Vibrato $c0-$cf | Set panning $d0-$df | Panning slide left $e0-$ef | Panning slide right $f0-$ff | Tone porta **************************************** * Volume column effect descriptions: * **************************************** Here are some notes on the volume column effects: (See also the WARNINGS in the normal effect explanation section!) 1) Volume slides (normal and fine) DO NOT remember their parameters and are NOT connected with the "normal volume effects". Examples: C-4 01 -- 000 >> Starts playing inst #1 at C-4 ... .. -1 000 >> Lowers volume of channel by 1 ... .. -0 000 >> Does not do ANYTHING! ... .. -- 000 >> The above applies to all volume column volume slide effects. 2) Vibrato effect DOES REMEMBER it's parameters and IS connected (shares saved parameters) with "normal effect vibrato". Examples: C-4 01 S5 000 >> S5 sets vibrato speed to 5 ... .. V1 000 >> V1 starts vibrating with speed 5 and depth of 1 ... .. V0 000 >> continues vibrating witht depth of 1 ... .. V0 000 >> and same as above.. ... .. 00 400 >> !! still vibrates with same params! ... .. 00 400 >> !! and same as above.. ... .. V0 400 >> !! _doubles_ the vibration (as expected) This means that volume column effects "Sx" with "Vy" are equal to normal effect "4xy"! 3) Tone portamento effect DOES REMEMBER it's parameters and IS connected (shares saved parameters) with "normal porta effect" parameter. (See also notes about the effect 3xx!) Examples: C-4 01 -- 000 >> Starts playing inst #1 at C-4 ... .. -- 000 C-6 01 M1 000 >> M1 starts bending to C-6 with speed of 1 ... .. -- 000 ... .. M0 000 >> continues bending to C-6 with speed of 1 ... .. -- 000 ... .. -- 300 >> !! continues bending to C-6 with speed of 1 This means that volume column effect "Mx" is equal to normal effect "30x"! ************************** * Bugs/Features of FT2 * ************************** There are few known "features" in FT2's player system, which could be considered "bugs", but since we are thinking only about playing an XM correctly, they should be considered features which need to be implemented. Here's a list of these features: - Pattern Loop replay features. See description of effect E6x for more information. - Pattern Delay replay feature. See description of effect EEx for more information. Here is a list of REAL BUGS which should be attributed by the FastTracker 2 maintainers: - Effect parameters not initialized/zeroed when playing starts. During my tests on FT2 I found out that on effects that "remember" their parameters (e.g. save the previous non zero parameter), FT2 DOES NOT CLEAR THE SAVE VALUES when it starts playing! This means that if you use this kind effect with zero before using non zero value on that effect and channel, results are UNDEFINED! This may affect the playing of some modules! (Tested on FT2.08/2.06) - Bugs in Pattern Loop effect. See description of effect E6x for more information. ********************************** * Other trackers and detecting * ********************************** Aside from the programs mentioned here, there are number of conversion utilities and other trackers that are capable of saving to XM-format. Some of those don't do it properly and might set the identification tags (TrackerName, format version) identical to FT2, etc. SoundTracker ------------ An "FT2 clone" for Unixes, a GNU GPL licensed tracker running under X Window System and Gtk+ toolkit. Supports at least x86 based platforms. Platform : Linux and other UNIX-type OS Author : Michael Krause Available : http://www.soundtracker.org/ TrackerName TAG: "rst's SoundTracker " (last empty characters are spaces, ASCII 32 dec) Provides also extra effects: Qxx - Set LP Filter Resonance Zxx - Set LP Filter Cut-Off Frequency These effects are also supported by OpenCP player, from which the player code has been taken from to SoundTracker. (More info about these effects can be got from SoundTracker and/or OpenCP sourcecode which are available under GNU GPL license) DigiTrakker ----------- A quite tracker in it's own, Shareware. I don't know whether it is maintained anymore. Platform : DOS (at least) Author : prodatron/n-Factor Available : ??? (search the Internet) TrackerName TAG: Changes This is a quite special case. DigiTrakker misuses the TrackerName TAG and puts the name of the composer there, if there is any set. This behavior makes it very hard to detect XMs made with DigiTrakker. IT2XM ----- Not really a tracker, but a Impulse Tracker (.IT) to XM format converter. Platform : DOS Author : Andy Voss (Phoenix/Hornet) Available : ??? TrackerName TAG: Identical to FT2 Due to differences in IT's XM-replay and differences in IT/XM formats in general, it is not possible to accurately replay an converted XM. And since the trackername-tag is identical to FT2's, abandon all hope... ********************** * Other documents? * ********************** I highly recommend that you also read other material available, even the ones for other formats since they might help you to understand the design choices behind FT2. Here is a list of docs I have read and found useful in creation of JSS and this document: - Extended Module Player (XMP)'s technical documents by Claudio Matsuoka and Hipolito Carraro Jr. [http://xmp.helllabs.org/] - Firelight's (Brett Paterson) FMODDOC (and FS3MDOC) - ProTracker 2.1A player source and v3.61 format documentation. - And of course the documents mentioned in the "credits" section of this file. They contained valuable information that I used as a very basis of this doc. Thanks to the writers of above docs, it would not have been possible to write JSS or this doc without you! All the documents are available at the J Sound System's homepage: http://jss.sf.net/moddoc/ ***************** * Final Words * ***************** That's it. 'nuff said. Too much talk, far too less deeds done. Questions? Send me some e-mail. milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/0000755000175000017500000000000011317506167023472 5ustar admin2admin2milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/Alankila_email_140108.txt0000644000175000017500000003220110743001543027717 0ustar admin2admin2Subject: Milkytracker - computed bleps update From: Christopher O'Neill To: alankila@bel.fi Date: 14/1/2008 00:27:37 Hi Antti, I don't know whether you remember or not, but we spoke on IRC over a year ago, when I produced an experimental version of Milkytracker with Amiga sound simultation using your guide. Anyway, at the time it was a dirty hack to get Milyktracker to use it, but since then the code base has been cleaned up and we've been able to incorporate the filters (along with some other resamplers). We are due to release a new version in the coming weeks, but in the meantime I've attatched a beta version (linux/i586) for you to play around with. I would be very grateful if you could try it out and comment on the accuracy of the Amiga resampling modes. To enable it, select 'Config' and then click on 'Resampling' - volume ramping is not needed so can be disabled - ensure you are using 48khz mixer resolution also, as there's a slight bug with the other rates at the moment. PS - Milkytracker will be going open source in the near future, under the GPL. - Chris (Deltafire/df) ==== Subject: Re: Milkytracker - computed bleps update From: "Antti S. Lankila" To: Christopher O'Neill Date: 14/1/2008 10:12:26 Christopher O'Neill wrote: > I don't know whether you remember or not, but we spoke on IRC over a year ago, > when I produced an experimental version of Milkytracker with Amiga sound > simultation using your guide. > Of course I do. > We are due to release a new version in the coming weeks, but in the meantime > I've attatched a beta version (linux/i586) for you to play around with. I > would be very grateful if you could try it out and comment on the accuracy of > the Amiga resampling modes. To enable it, select 'Config' and then click > on 'Resampling' - volume ramping is not needed so can be disabled - ensure > you are using 48khz mixer resolution also, as there's a slight bug with the > other rates at the moment. > Yeah, my blep tables are not compatible with sampling rates less than about 44.1 kHz in any case... The aliasing prevention is tuned for about 20 kHz and if that's greater than (or too close to) the nyquist frequency, it's not going to work so well. I have forgot how to sample songs using milkytracker. I looked around in the gui but could not figure it out. I suppose I might use jack to record audio data, but is there some easier way to get it done? I can say that by ear milkytracker's output is good, but I'd like to compare against modern uade123 just in case. Comparison is slightly hampered by the fact that uade emulates more of Amiga hardware than milkytracker does. I can tell that you still do not have the amiga period limitation at about 112-113 maximum, which makes some songs sound rather funny as the sound jumps up instead of distorting like it used to. You should probably support the Amiga-style playback model separately, so that the protracker command for turning the filter on and off could also be supported. > PS - Milkytracker will be going open source in the near future, under the GPL. > I'm sure shd will be pleased. > Was just looking through your webspace and noticed the computed-blep.h file is > different to the one I was using in Milkytracker. I've replaced it with the > newer (at least I'm assuming it's newer) version. > Yeah, I may have done some nearly inconsequential updates to it. There are no significant changes between the versions, apart from slightly improved quality or slightly cleaner cutoff at 20 kHz or so. The best reference to track for the bleptable is currently uade source tree, which I updated a few months ago. I think I reduced filter bandwidth slightly to ensure a cleaner cutoff or something. I guess I'm becoming more conservative, even when the only thing that can show the difference is FFT plots. I still have a long-term annoyance with the blep table which is that its SNR is slightly less than 84 dB. If only I had 33 bit wide integers I could allocate the one extra bit and ensure that the noise level is always less than the signal. For 16-bit music that milkytracker is theoretically capable of producing, I should calculate a new table with at least 100 dB SNR. (Hello, floating point arithmetic!) But on the other hand, who cares about PC music played with amiga hardware limitations? I do worry about the fact that you may not be dithering the output or doing noise shaping for it. How do you do it at the moment? I think there are real situations in mod music where correlated quantization noise could be heard, especially with lots of channels and consequently quiet output levels. -- Antti ==== Subject: Re: Milkytracker - computed bleps update From: Christopher O'Neill To: "Antti S. Lankila" Date: Today 10:44:11 Hi Antti, thanks for the reply. On Monday 14 January 2008 10:12:26 you wrote: > I have forgot how to sample songs using milkytracker. I looked around in > the gui but could not figure it out. I suppose I might use jack to > record audio data, but is there some easier way to get it done? I can > say that by ear milkytracker's output is good, but I'd like to compare > against modern uade123 just in case. 'Disk Op' -> underneath 'Song' select .wav and click 'Save As', check the quality settings before recording. > Comparison is slightly hampered by the fact that uade emulates more of > Amiga hardware than milkytracker does. I can tell that you still do not > have the amiga period limitation at about 112-113 maximum, which makes > some songs sound rather funny as the sound jumps up instead of > distorting like it used to. You should probably support the Amiga-style > playback model separately, so that the protracker command for turning > the filter on and off could also be supported. I guess this could be emulated in the resampler - what should I do with the samples if the period is less than 112-113, just ignore them or delay them? > I still have a long-term annoyance with the blep table which is that its > SNR is slightly less than 84 dB. If only I had 33 bit wide integers I > could allocate the one extra bit and ensure that the noise level is > always less than the signal. For 16-bit music that milkytracker is > theoretically capable of producing, I should calculate a new table with > at least 100 dB SNR. (Hello, floating point arithmetic!) Milkytracker uses integer mathmatic in its mixer, 32-bit ints (the reason being that many of the target platforms do not support floating point). For 8-bit samples, there is still some room for extra precision in the blep table (currently 8+17 = 25 bits, so 5 spare). However, for 16-bit samples there is not enough space to use the 17-bit table, therefore i've had to reduce the precision (by 3 to reduce overflows, so 14 bits only). So basically 16-bit samples will be noisy - but it's that or nothing. > But on the > other hand, who cares about PC music played with amiga hardware > limitations? Well.. Some of the users of Milkytracker prefer the sound using the Amiga resamper than the other modes - especially for chips. Still, these are using 8-bit samples anyway so everything is working as it should. >> I do worry about the fact that you may not be dithering the output or > doing noise shaping for it. How do you do it at the moment? I think > there are real situations in mod music where correlated quantization > noise could be heard, especially with lots of channels and consequently > quiet output levels. Well, we did speak briefly about differing the output (after noticing that modplug does this), but at the moment it remains on the todo list. Saying that, I don't think it's a big job to implment - basic differing anyway, I don't know about noise shaping.. - Chris ==== Subject: Re: Milkytracker - computed bleps update From: "Antti S. Lankila" To: Christopher O'Neill Date: Yesterday 13:15:42   Christopher O'Neill wrote: > Hi Antti, thanks for the reply. > > On Monday 14 January 2008 10:12:26 you wrote: >   >> I have forgot how to sample songs using milkytracker. I looked around in >> the gui but could not figure it out. I suppose I might use jack to >> record audio data, but is there some easier way to get it done? I can >> say that by ear milkytracker's output is good, but I'd like to compare >> against modern uade123 just in case. >>     > > 'Disk Op' -> underneath 'Song' select .wav and click 'Save As', check the > quality settings before recording. >   Ah yes. I was looking around that but I must have missed it. I just did the A500 plot: http://bel.fi/~alankila/uade-vs-milky.png http://bel.fi/~alankila/uade-vs-milky-detail.png http://bel.fi/~alankila/uade-vs-milky-detail2.png Overall: good agreement, correct overall shape. Milkytracker has slightly incorrect synthesis frequency for 48 kHz output, probably result of quantization of the period values to integer approximations. (UADE uses floating point math to ensure the output periods are exact.) Milkytracker also has about 3-4 dB higher noise level, perhaps due to the way final mixing is done. Maybe you quantize the channels to final output level before adding them together. You could set every channel to maybe 24-bit resolution, and then sum all of them together, scale by volume level, and then dither, shift and clip to 16-bits. Overall, the synthesis seems adequate, and the differences must be due to this type of trivial variations in the implementation. > I guess this could be emulated in the resampler - what should I do with the > samples if the period is less than 112-113, just ignore them or delay them? >   Good question, heh. The simplest strategy is to just clamp it to 113, because no matter what Amiga could not fetch words from RAM faster than at the horizontal line switch rate, which apparently alternates between 113*2 and 114*2 clocks. (This works because Paula gets 16 bits at time, so it can play two samples in the time one rasterline changes.) This deals with the most noticeable problem which is the sound jumping up octave or half in mods, when in real Amiga you just get distortion. Unfortunately the sound chip did its thing even if it could not get data from RAM fast enough, so it is not so easy to do it right: when Paula sends the low 8 bits to the D/A output, it pulls a data request line to Agnus, which will issues a DMA read from RAM at the start of next raster line. If Agnus could not satisfy Paula's data request in time, Paula'd simply replay the data it had. Based on reading UADE code, it seems that Paula will "splice" the data words together so that if at start of next 16-bit word there was no new data available, it'd reissue the upper 8 bits again, but then play the lower 8 bits from the next word, effectively skipping the upper 8 bits of the next word due to this timing glitch. Amiga hardware additionally produced some type of timing-related distortion for period values less than 122 or 123. This causes replay of the previous sample word, too. I suppose it's related to some delay inherent in the interaction between Paula and Agnus regarding the request for next data word from memory. So the problem I described above happens a bit earlier than it should, based on the above analysis. > Milkytracker uses integer mathmatic in its mixer, 32-bit ints (the reason > being that many of the target platforms do not support floating point). For > 8-bit samples, there is still some room for extra precision in the blep table > (currently 8+17 = 25 bits, so 5 spare). However, for 16-bit samples there is > not enough space to use the 17-bit table, therefore i've had to reduce the > precision (by 3 to reduce overflows, so 14 bits only). So basically 16-bit > samples will be noisy - but it's that or nothing. >   True. UADE itself promotes the samples to 14-bit by multiplying the 8-bit sample with the 6-bit volume register, and the blep table is calculated for this. If I delayed the multiplication with volume I could improve the SNR. >>> I do worry about the fact that you may not be dithering the output or >>>       >> doing noise shaping for it. How do you do it at the moment? I think >> there are real situations in mod music where correlated quantization >> noise could be heard, especially with lots of channels and consequently >> quiet output levels. >>     > > Well, we did speak briefly about differing the output (after noticing that > modplug does this), but at the moment it remains on the todo list. Saying > that, I don't think it's a big job to implment - basic differing anyway, I > don't know about noise shaping.. >   I think triangular PRNG noise shaping may be the easiest, and it has quite attractive spectrum, practically most energy > 10 kHz. I implemented it for a toy project, but was unable to detect any audible difference. I think the amiga output modes at least are noisy enough as they come and there might be no need for additional dithering before modest 1-2 bit quantization. Full noise shaping is fancy but not really worth the trouble. People who care about that sort of thing can use JACK to get it. -- Anttimilkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/0000755000175000017500000000000011317506166025266 5ustar admin2admin2milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/compute-blep.py0000644000175000017500000001570110742655365030247 0ustar admin2admin2#!/usr/bin/python import math import sys from scipy import array, exp from scipy.signal import firwin from scipy.fftpack import fft, ifft def fir_minphase(table, pad_size=8): table = list(table) # table should be a real-valued table of FIR coefficients convolution_size = len(table) table += [0] * (convolution_size * (pad_size - 1)) # compute the real cepstrum # fft -> abs + ln -> ifft -> real cepstrum = ifft(map(lambda x: math.log(x), abs(fft(table)))) # because the positive and negative freqs were equal, imaginary content is neglible # cepstrum = map(lambda x: x.real, cepstrum) # window the cepstrum in such a way that anticausal components become rejected cepstrum[1 :len(cepstrum)/2] *= 2; cepstrum[len(cepstrum)/2+1:len(cepstrum) ] *= 0; # now cancel the previous steps: # fft -> exp -> ifft -> real cepstrum = ifft(map(exp, fft(cepstrum))) return map(lambda x: x.real, cepstrum[0:convolution_size]) class BiquadFilter(object): __slots__ = ['b0', 'b1', 'b2', 'a1', 'a2', 'x1', 'x2', 'y1', 'y2'] def __init__(self, b0, b1, b2, a1, a2): self.b0 = b0 self.b1 = b1 self.b2 = b2 self.a1 = a1 self.a2 = a2 self.reset() def reset(self): self.x1 = 0.0 self.x2 = 0.0 self.y1 = 0.0 self.y2 = 0.0 def filter(self, x0): y0 = self.b0*x0 + self.b1*self.x1 + self.b2*self.x2 - self.a1*self.y1 - self.a2*self.y2 self.x2 = self.x1 self.x1 = x0 self.y2 = self.y1 self.y1 = y0 return y0 def make_rc_lopass(sample_rate, freq): omega = 2 * math.pi * freq / sample_rate; term = 1 + 1/omega; return BiquadFilter(1/term, 0.0, 0.0, -1.0 + 1/term, 0.0); def make_butterworth(fs, fc, res_db=0): # 2nd-order Butterworth s-domain coefficients are: # # b0 = 1.0 b1 = 0 b2 = 0 # a0 = 1 a1 = sqrt(2) a2 = 1 # # by tweaking the a1 parameter, some resonance can be produced. res = 10.0 ** (-res_db / 10.0 / 2) ar = z_transform(1, 0, 0, 1, math.sqrt(2) * res, 1, fc, fs) return BiquadFilter(*ar) # observe: a and b are reversed here. To be absolutely clear: # a is the nominator and b is the denominator. :-/ def z_transform(a0, a1, a2, b0, b1, b2, fc, fs): # prewarp s-domain coefficients wp = 2.0 * fs * math.tan(math.pi * fc / fs) a2 /= wp * wp a1 /= wp b2 /= wp * wp b1 /= wp # compute bilinear transform and return it bd = 4 * b2 * fs * fs + 2 * b1 * fs + b0 return [ (4 * a2 * fs ** 2 + 2 * a1 * fs + a0) / bd, (2 * a0 - 8 * a2 * fs ** 2) / bd, (4 * a2 * fs ** 2 - 2 * a1 * fs + a0) / bd, (2 * b0 - 8 * b2 * fs ** 2) / bd, (4 * b2 * fs ** 2 - 2 * b1 * fs + b0) / bd, ] def quantize(x, bits, scale=False): x = list(x) fact = 2 ** bits # this adjusts range precisely between -65536 and 0 so that our bleps look right. correction_factor = 1.0 if scale: correction_factor = x[-1] - x[0] for _ in range(len(x)): val = x[_] * fact / correction_factor; # correct rounding if val < 0: val = int(val - 0.5) else: val = int(val + 0.5) # leave scaled? if not scale: val /= float(fact) x[_] = val * -1 return x def lin2db(lin): return 20 * (math.log(lin) / math.log(10)) def print_spectrum(table, sample_rate): for _ in range(len(table) / 2): mag = lin2db(abs(table[_])) pha = math.atan2(table[_].real, table[_].imag) print "%s %s %s" % (float(_) / len(table) * sample_rate, mag, pha) def print_fir(table, format='gnuplot'): if format == 'gnuplot': for _ in range(len(table)): print "%s %s" % (_, table[_]) elif format == 'c': col = 0 print " {" for _ in range(len(table)): col += len(str(table[_])) + 1 if col >= 80: print col = 0 sys.stdout.write("%s," % table[_]) if col != 0: print print " }," def integrate(table): total = 0 for _ in table: total += _ startval = -total new = [] for _ in table: startval += _ new.append(startval) return new def run_filter(flt, table): flt.reset() # initialize filter to stable state for _ in range(10000): flt.filter(table[0]) # now run the filter newtable = [] for _ in range(len(table)): newtable.append(flt.filter(table[_])) return newtable AMIGA_PAL_CLOCK = 3546895 def main(): spectrum = len(sys.argv) > 1 unfiltered = firwin(2048, 21500.0 / AMIGA_PAL_CLOCK * 2, window=('kaiser', 10.0)) # move filtering effects to start to allow IIRs more time to settle unfiltered = fir_minphase(unfiltered) # make digital models for the filters on Amiga 500 and 1200. filter_fixed6khz = make_rc_lopass(AMIGA_PAL_CLOCK, 4900.0) filter_leakage = make_rc_lopass(AMIGA_PAL_CLOCK, 32000.0) filter_led = make_butterworth(AMIGA_PAL_CLOCK, 3275.0, res_db=-0.70) # produce the filtered outputs amiga500_off = run_filter(filter_fixed6khz, unfiltered) amiga1200_off = run_filter(filter_leakage, unfiltered) amiga500_on = run_filter(filter_led, amiga500_off) amiga1200_on = run_filter(filter_led, amiga1200_off) if not spectrum: # integrate to produce blep amiga500_off = integrate(amiga500_off) amiga500_on = integrate(amiga500_on) amiga1200_off = integrate(amiga1200_off) amiga1200_on = integrate(amiga1200_on) unfiltered = integrate(unfiltered) # quantize and scale amiga500_off = quantize(amiga500_off, bits=17, scale=(not spectrum)) amiga500_on = quantize(amiga500_on, bits=17, scale=(not spectrum)) amiga1200_off = quantize(amiga1200_off, bits=17, scale=(not spectrum)) amiga1200_on = quantize(amiga1200_on, bits=17, scale=(not spectrum)) unfiltered = quantize(unfiltered, bits=17, scale=(not spectrum)) if spectrum: spec = int(sys.argv[1]) if spec == -1: table = unfiltered if spec == 0: table = amiga500_off if spec == 1: table = amiga500_on if spec == 2: table = amiga1200_off if spec == 3: table = amiga1200_on print_spectrum(fft(table), sample_rate=AMIGA_PAL_CLOCK) else: print " /*" print " * Table generated by compute-blep.py." print " */" print print "/* tables are: a500 off, a500 on, a1200 off, a1200 on, vanilla. */" print "const int winsinc_integral[5][%d] = {" % len(unfiltered) print_fir(amiga500_off, format='c') print_fir(amiga500_on, format='c') print_fir(amiga1200_off, format='c') print_fir(amiga1200_on, format='c') print_fir(unfiltered, format='c') print "};" if __name__ == '__main__': main() milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/Changes.txt0000644000175000017500000000176110742655365027413 0ustar admin2admin2pre-release 2006-07-02 alankila * Christopher O'Neill (Deltafire from ircnet's #amigaexotic, and one of the authors of milkytracker) tried to implement the blep approach. He made an excellent point that convinced me to separate the aging function from the function that adds new bleps. The function is now known as input_sample, and the aging function is called clock(). * Christopher also found out the hard way a silly bug of mine: sampleclip routine had the comparison operators the wrong way. :-( pre-release 2006-06-27 alankila * LED filter cutoff is at 3.2, not at 1.6. Duh. This was due to a bug in Butterworth filter computation routine, noticing as I reimplemented it from BLT. * LED filter on genuine Amiga appears to perform slightly suboptimally with about 0.3 dB lowered resonance from theoretical. Perhaps component tolerances are at issue? Additionally, the filtering slope appears slightly different from expected. milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/note-guide-unfinished.txt0000644000175000017500000000016210742655365032227 0ustar admin2admin2the guide has not yet been finished. I plan to extend it with some pictures that hopefully illuminate the issues. milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/computed-blep_c_source.txt0000644000175000017500000014306710742655365032473 0ustar admin2admin2 /* * Table generated by compute-blep.py. */ /* tables are: a500 off, a500 on, a1200 off, a1200 on, vanilla. */ const int winsinc_integral[5][2048] = { { 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131070,131070,131070, 131070,131070,131069,131069,131069,131068,131068,131068,131067,131067,131066,131066, 131065,131065,131064,131063,131063,131062,131061,131060,131059,131058,131056,131055, 131054,131052,131050,131049,131047,131045,131043,131040,131038,131035,131033,131030, 131026,131023,131020,131016,131012,131008,131003,130998,130993,130988,130982,130976, 130970,130963,130956,130949,130941,130932,130924,130914,130905,130895,130884,130872, 130861,130848,130835,130821,130807,130792,130776,130759,130742,130724,130705,130685, 130664,130642,130620,130596,130571,130545,130518,130490,130461,130430,130398,130365, 130331,130295,130257,130219,130178,130136,130093,130047,130000,129951,129901,129848, 129794,129737,129679,129618,129555,129490,129423,129353,129281,129207,129130,129050, 128968,128883,128795,128704,128611,128514,128415,128312,128206,128097,127985,127869, 127750,127627,127501,127371,127237,127100,126959,126813,126664,126510,126353,126191, 126025,125854,125679,125499,125315,125126,124933,124734,124531,124323,124110,123891, 123668,123439,123205,122965,122720,122470,122214,121952,121685,121412,121133,120849, 120558,120261,119959,119650,119335,119014,118687,118354,118014,117668,117315,116956, 116591,116219,115840,115455,115063,114665,114260,113849,113430,113005,112574,112135, 111690,111239,110780,110315,109843,109364,108879,108387,107888,107383,106871,106352, 105827,105295,104757,104212,103661,103104,102540,101970,101394,100812,100223,99629, 99028,98422,97810,97192,96568,95939,95305,94665,94020,93370,92714,92054,91389,90719, 90045,89366,88682,87995,87303,86607,85908,85205,84498,83788,83075,82358,81639,80916, 80191,79464,78734,78002,77268,76533,75795,75056,74316,73575,72833,72090,71346,70602, 69858,69114,68370,67626,66883,66140,65399,64658,63919,63181,62445,61711,60979,60249, 59521,58796,58074,57355,56639,55926,55217,54512,53810,53113,52419,51731,51046,50367, 49693,49023,48359,47701,47048,46400,45759,45124,44495,43872,43256,42646,42043,41447, 40858,40276,39702,39134,38575,38023,37478,36941,36413,35892,35379,34874,34378,33890, 33410,32938,32475,32020,31574,31137,30708,30288,29876,29473,29079,28693,28317,27948, 27589,27238,26896,26562,26238,25921,25613,25314,25023,24740,24466,24200,23942,23692, 23451,23217,22991,22773,22562,22359,22164,21975,21794,21621,21454,21294,21140,20994, 20853,20719,20592,20470,20354,20244,20139,20040,19946,19857,19774,19694,19620,19550, 19484,19422,19364,19310,19260,19213,19169,19128,19090,19054,19022,18991,18963,18936, 18912,18889,18867,18847,18828,18810,18792,18776,18759,18743,18727,18711,18695,18679, 18662,18644,18626,18607,18587,18565,18542,18518,18492,18465,18436,18404,18371,18336, 18298,18259,18216,18172,18124,18074,18022,17966,17908,17847,17783,17716,17646,17572, 17496,17416,17334,17248,17159,17066,16971,16872,16770,16664,16556,16444,16329,16211, 16090,15966,15839,15709,15576,15440,15301,15159,15015,14868,14718,14566,14412,14255, 14096,13935,13771,13606,13439,13270,13099,12927,12753,12578,12401,12224,12045,11866, 11685,11504,11322,11140,10958,10775,10592,10409,10226,10044,9862,9680,9499,9319,9139, 8961,8783,8607,8432,8258,8086,7915,7747,7580,7415,7252,7091,6932,6776,6622,6471, 6322,6176,6032,5892,5754,5619,5488,5359,5234,5111,4992,4877,4764,4655,4550,4448, 4349,4254,4163,4075,3990,3910,3832,3759,3689,3622,3560,3500,3445,3393,3344,3299, 3257,3219,3184,3153,3124,3099,3078,3059,3044,3031,3022,3015,3011,3010,3012,3016, 3023,3033,3044,3058,3075,3093,3113,3136,3160,3186,3213,3242,3273,3305,3338,3372, 3408,3444,3481,3520,3558,3597,3637,3677,3718,3758,3799,3839,3880,3920,3960,4000, 4039,4077,4115,4152,4188,4224,4258,4291,4323,4354,4384,4412,4439,4464,4488,4510, 4530,4549,4566,4581,4594,4606,4615,4623,4628,4631,4633,4632,4629,4624,4617,4608, 4597,4583,4568,4550,4530,4508,4484,4458,4429,4399,4366,4332,4296,4257,4217,4175, 4130,4085,4037,3988,3937,3884,3830,3774,3717,3658,3598,3537,3475,3411,3347,3281, 3215,3147,3079,3010,2940,2870,2799,2728,2657,2585,2513,2440,2368,2296,2224,2151, 2080,2008,1937,1866,1796,1726,1657,1589,1521,1454,1389,1324,1260,1197,1135,1075, 1016,958,901,846,792,740,689,640,592,546,502,459,419,379,342,307,273,241,211,183, 156,132,109,88,69,52,37,24,12,2,-5,-11,-16,-18,-19,-18,-16,-11,-6,2,11,21,33,47,61, 77,95,113,133,154,176,200,224,249,275,302,329,358,387,416,447,477,508,540,572,604, 636,669,702,734,767,800,832,864,896,928,960,991,1021,1051,1081,1110,1138,1166,1193, 1219,1245,1270,1293,1316,1338,1359,1379,1398,1416,1433,1448,1463,1476,1488,1499, 1509,1518,1525,1531,1536,1540,1542,1543,1543,1542,1539,1536,1530,1524,1517,1508, 1498,1487,1475,1462,1447,1432,1415,1397,1379,1359,1338,1317,1294,1271,1247,1222, 1196,1170,1143,1115,1086,1057,1028,998,967,936,905,874,842,809,777,744,712,679,646, 613,581,548,515,483,450,418,387,355,324,293,263,233,204,175,147,119,92,66,40,15, -10,-33,-56,-78,-99,-120,-139,-158,-176,-193,-209,-224,-238,-252,-264,-275,-286, -295,-304,-311,-318,-324,-329,-332,-335,-337,-338,-338,-338,-336,-333,-330,-326, -321,-315,-308,-301,-293,-284,-274,-264,-253,-242,-229,-217,-203,-190,-175,-161, -145,-130,-114,-98,-81,-64,-47,-29,-11,6,24,42,61,79,97,115,134,152,170,188,206,223, 241,258,275,291,308,324,340,355,370,384,399,412,425,438,450,462,473,484,494,503, 512,521,529,536,542,548,553,558,562,566,568,570,572,573,573,573,572,570,568,565, 562,558,553,548,543,537,530,523,515,507,498,489,479,469,459,448,437,426,414,402, 389,377,364,351,337,324,310,296,282,268,254,239,225,211,196,182,168,153,139,125, 111,97,83,70,56,43,30,17,5,-7,-19,-31,-42,-53,-64,-75,-85,-94,-104,-113,-121,-129, -137,-144,-151,-158,-164,-170,-175,-180,-184,-188,-192,-195,-198,-200,-202,-203, -204,-205,-205,-204,-204,-203,-201,-199,-197,-195,-192,-188,-185,-181,-176,-172, -167,-162,-156,-151,-145,-139,-132,-126,-119,-112,-104,-97,-90,-82,-74,-66,-59,-51, -42,-34,-26,-18,-10,-2,7,15,23,31,39,47,54,62,70,77,85,92,99,106,112,119,125,131, 137,143,148,154,159,163,168,172,176,180,183,187,190,192,195,197,199,201,202,203, 204,205,205,205,205,204,203,202,201,200,198,196,194,192,189,186,183,180,177,173, 169,165,161,157,153,148,143,139,134,129,124,119,113,108,103,97,92,86,81,75,70,64, 59,53,48,42,37,32,26,21,16,11,6,1,-4,-9,-13,-18,-22,-26,-30,-34,-38,-42,-46,-49, -52,-55,-58,-61,-64,-66,-69,-71,-73,-74,-76,-78,-79,-80,-81,-82,-82,-83,-83,-83, -83,-83,-83,-82,-82,-81,-80,-79,-78,-77,-75,-74,-72,-70,-68,-66,-64,-62,-60,-57, -55,-52,-50,-47,-44,-42,-39,-36,-33,-30,-27,-24,-21,-18,-15,-12,-9,-6,-3,0,3,6,8, 11,14,17,20,22,25,27,30,32,35,37,39,41,43,45,47,49,50,52,54,55,56,58,59,60,61,61, 62,63,63,64,64,65,65,65,65,65,64,64,64,63,63,62,61,61,60,59,58,57,56,55,53,52,51, 49,48,46,45,43,41,40,38,36,35,33,31,29,28,26,24,22,20,19,17,15,13,11,10,8,6,5,3,1, 0,-2,-3,-5,-6,-8,-9,-10,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-21,-22,-23,-23, -24,-24,-25,-25,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-25,-25,-25,-24, -24,-23,-23,-22,-21,-21,-20,-19,-19,-18,-17,-16,-16,-15,-14,-13,-12,-11,-10,-10,-9, -8,-7,-6,-5,-4,-3,-2,-1,0,1,1,2,3,4,5,6,6,7,8,9,9,10,11,11,12,12,13,14,14,15,15, 15,16,16,16,17,17,17,17,18,18,18,18,18,18,18,18,18,18,18,18,18,17,17,17,17,16,16, 16,16,15,15,14,14,14,13,13,12,12,11,11,11,10,10,9,9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1, 1,0,0,-1,-1,-1,-2,-2,-3,-3,-3,-4,-4,-4,-4,-5,-5,-5,-5,-6,-6,-6,-6,-6,-6,-6,-7,-7, -7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-6,-6,-6,-6,-6,-6,-6,-6,-5,-5,-5,-5,-5,-4,-4,-4, -4,-4,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,-1,-1,-1,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,3,3,3, 3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3, 3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,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, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }, { 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131072,131072,131072,131072,131072,131072,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131070,131070,131070,131070,131070,131070, 131070,131070,131070,131070,131070,131070,131070,131070,131070,131070,131069,131069, 131069,131069,131069,131069,131069,131069,131068,131068,131068,131068,131068,131068, 131067,131067,131067,131067,131066,131066,131066,131066,131065,131065,131064,131064, 131064,131063,131063,131062,131062,131061,131061,131060,131060,131059,131058,131058, 131057,131056,131055,131055,131054,131053,131052,131051,131050,131049,131047,131046, 131045,131044,131042,131041,131039,131038,131036,131034,131032,131031,131029,131027, 131024,131022,131020,131017,131015,131012,131009,131007,131004,131001,130997,130994, 130991,130987,130983,130979,130975,130971,130967,130962,130958,130953,130948,130942, 130937,130931,130926,130920,130913,130907,130900,130893,130886,130879,130871,130863, 130855,130847,130838,130829,130820,130810,130800,130790,130779,130768,130757,130745, 130733,130721,130708,130695,130682,130668,130654,130639,130624,130608,130592,130576, 130559,130541,130523,130505,130486,130466,130446,130426,130405,130383,130361,130338, 130314,130290,130265,130240,130214,130187,130160,130132,130103,130074,130044,130013, 129981,129949,129916,129882,129847,129812,129775,129738,129700,129661,129621,129581, 129539,129497,129453,129409,129364,129318,129270,129222,129173,129123,129071,129019, 128966,128911,128856,128799,128742,128683,128623,128562,128500,128436,128372,128306, 128239,128171,128101,128031,127959,127886,127811,127736,127659,127580,127501,127420, 127337,127254,127169,127082,126995,126906,126815,126723,126630,126535,126439,126341, 126242,126142,126040,125936,125831,125725,125617,125507,125396,125284,125170,125055, 124938,124819,124699,124577,124454,124329,124203,124075,123946,123815,123683,123549, 123413,123276,123137,122997,122855,122711,122566,122420,122272,122122,121971,121818, 121663,121507,121350,121191,121030,120868,120704,120539,120372,120204,120034,119863, 119690,119515,119339,119162,118983,118803,118621,118438,118253,118067,117879,117690, 117500,117308,117114,116920,116724,116526,116327,116127,115926,115723,115519,115313, 115106,114898,114689,114478,114266,114053,113839,113624,113407,113189,112970,112750, 112528,112306,112082,111858,111632,111405,111177,110948,110718,110487,110255,110022, 109788,109553,109317,109080,108842,108604,108364,108124,107883,107641,107398,107154, 106909,106664,106418,106171,105923,105675,105426,105176,104926,104675,104423,104171, 103918,103664,103410,103155,102899,102643,102387,102130,101872,101614,101356,101096, 100837,100577,100316,100055,99794,99532,99270,99007,98745,98481,98217,97953,97689, 97424,97159,96894,96628,96362,96096,95829,95563,95296,95028,94761,94493,94225,93957, 93688,93419,93151,92881,92612,92343,92073,91803,91534,91263,90993,90723,90452,90182, 89911,89640,89369,89098,88827,88556,88284,88013,87741,87470,87198,86926,86654,86382, 86110,85838,85566,85294,85022,84750,84477,84205,83933,83660,83388,83116,82843,82571, 82298,82026,81753,81481,81208,80936,80663,80391,80118,79846,79573,79301,79029,78756, 78484,78212,77939,77667,77395,77123,76851,76579,76307,76035,75763,75491,75220,74948, 74676,74405,74134,73862,73591,73320,73049,72778,72507,72237,71966,71696,71426,71156, 70886,70616,70346,70077,69807,69538,69269,69000,68732,68463,68195,67927,67659,67391, 67124,66857,66590,66323,66056,65790,65524,65258,64993,64728,64463,64198,63934,63670, 63406,63143,62880,62617,62354,62092,61830,61569,61308,61047,60787,60527,60267,60008, 59749,59491,59233,58975,58718,58461,58205,57949,57694,57439,57184,56930,56676,56423, 56171,55918,55667,55416,55165,54915,54665,54416,54167,53919,53671,53424,53178,52932, 52686,52442,52197,51954,51710,51468,51226,50984,50743,50503,50263,50024,49786,49548, 49310,49074,48838,48602,48367,48133,47899,47666,47434,47202,46971,46740,46510,46281, 46052,45824,45597,45370,45144,44918,44693,44469,44245,44022,43800,43578,43357,43137, 42917,42698,42479,42261,42044,41827,41612,41396,41181,40967,40754,40541,40329,40118, 39907,39696,39487,39278,39069,38862,38655,38448,38242,38037,37832,37628,37425,37222, 37020,36819,36618,36417,36218,36019,35820,35622,35425,35228,35032,34837,34642,34448, 34254,34061,33869,33677,33486,33295,33105,32916,32727,32539,32352,32164,31978,31792, 31607,31422,31238,31055,30872,30690,30508,30327,30147,29967,29787,29609,29431,29253, 29076,28900,28724,28549,28374,28200,28027,27854,27682,27510,27339,27169,26999,26830, 26661,26493,26326,26159,25993,25827,25662,25498,25334,25171,25008,24846,24685,24524, 24364,24204,24045,23887,23729,23572,23416,23260,23104,22950,22796,22642,22490,22337, 22186,22035,21884,21735,21586,21437,21289,21142,20996,20850,20704,20560,20416,20272, 20129,19987,19845,19705,19564,19425,19285,19147,19009,18872,18735,18599,18464,18329, 18195,18062,17929,17797,17665,17534,17404,17274,17145,17017,16889,16762,16635,16509, 16384,16259,16135,16011,15888,15766,15644,15523,15403,15283,15163,15044,14926,14809, 14692,14575,14460,14344,14230,14116,14002,13889,13777,13665,13554,13443,13333,13224, 13115,13007,12899,12792,12685,12579,12473,12368,12264,12160,12056,11953,11851,11749, 11648,11547,11447,11347,11248,11149,11051,10953,10856,10759,10663,10568,10472,10378, 10284,10190,10097,10004,9912,9820,9729,9638,9548,9458,9369,9280,9191,9104,9016,8929, 8843,8757,8671,8586,8501,8417,8333,8250,8167,8085,8003,7921,7840,7759,7679,7599, 7520,7441,7363,7285,7207,7130,7053,6977,6901,6826,6751,6676,6602,6528,6455,6382, 6310,6237,6166,6095,6024,5954,5884,5814,5745,5676,5608,5540,5473,5405,5339,5273, 5207,5141,5076,5012,4947,4884,4820,4757,4694,4632,4570,4509,4448,4387,4327,4267, 4208,4149,4090,4032,3974,3917,3859,3803,3746,3691,3635,3580,3525,3471,3417,3363, 3310,3257,3204,3152,3100,3049,2998,2947,2897,2847,2797,2748,2699,2651,2603,2555, 2507,2460,2414,2367,2321,2276,2230,2185,2141,2096,2052,2009,1966,1923,1880,1838, 1796,1754,1713,1672,1631,1591,1551,1511,1472,1432,1394,1355,1317,1279,1242,1204, 1167,1131,1094,1058,1023,987,952,917,882,848,814,780,747,713,680,648,615,583,551, 519,488,457,426,396,365,335,305,276,246,217,188,160,132,103,76,48,21,-7,-34,-60, -87,-113,-139,-165,-190,-216,-241,-266,-290,-315,-339,-363,-387,-410,-434,-457, -480,-502,-525,-547,-569,-591,-613,-634,-656,-677,-697,-718,-739,-759,-779,-799, -818,-838,-857,-876,-895,-914,-932,-951,-969,-987,-1005,-1022,-1040,-1057,-1074, -1091,-1107,-1124,-1140,-1156,-1172,-1188,-1203,-1219,-1234,-1249,-1264,-1279,-1293, -1308,-1322,-1336,-1350,-1363,-1377,-1390,-1403,-1416,-1429,-1442,-1454,-1467,-1479, -1491,-1503,-1514,-1526,-1537,-1548,-1559,-1570,-1581,-1592,-1602,-1613,-1623,-1633, -1643,-1652,-1662,-1671,-1680,-1690,-1699,-1707,-1716,-1725,-1733,-1741,-1750,-1758, -1765,-1773,-1781,-1788,-1796,-1803,-1810,-1817,-1824,-1830,-1837,-1843,-1850,-1856, -1862,-1868,-1874,-1880,-1885,-1891,-1896,-1902,-1907,-1912,-1917,-1922,-1926,-1931, -1935,-1940,-1944,-1948,-1952,-1956,-1960,-1964,-1968,-1971,-1975,-1978,-1982,-1985, -1988,-1991,-1994,-1997,-2000,-2002,-2005,-2007,-2010,-2012,-2014,-2017,-2019,-2021, -2022,-2024,-2026,-2028,-2029,-2031,-2032,-2034,-2035,-2036,-2037,-2038,-2039,-2040, -2041,-2042,-2042,-2043,-2044,-2044,-2045,-2045,-2045,-2045,-2046,-2046,-2046,-2046, -2046,-2045,-2045,-2045,-2044,-2044,-2044,-2043,-2042,-2042,-2041,-2040,-2039,-2039, -2038,-2037,-2035,-2034,-2033,-2032,-2031,-2029,-2028,-2026,-2025,-2023,-2022,-2020, -2018,-2017,-2015,-2013,-2011,-2009,-2007,-2005,-2003,-2001,-1999,-1996,-1994,-1992, -1989,-1987,-1984,-1982,-1979,-1977,-1974,-1971,-1969,-1966,-1963,-1960,-1957,-1954, -1951,-1948,-1945,-1942,-1939,-1936,-1933,-1929,-1926,-1923,-1919,-1916,-1913,-1909, -1906,-1902,-1899,-1895,-1891,-1888,-1884,-1880,-1877,-1873,-1869,-1865,-1861,-1857, -1853,-1849,-1845,-1841,-1837,-1833,-1829,-1825,-1821,-1817,-1813,-1809,-1804,-1800, -1796,-1791,-1787,-1783,-1778,-1774,-1770,-1765,-1761,-1756,-1752,-1747,-1743,-1738, -1734,-1729,-1725,-1720,-1716,-1711,-1706,-1702,-1697,-1692,-1688,-1683,-1678,-1673, -1669,-1664,-1659,-1654,-1650,-1645,-1640,-1635,-1630,-1626,-1621,-1616,-1611,-1606, -1601,-1596,-1591,-1586,-1582,-1577,-1572,-1567,-1562,-1557,-1552,-1547,-1542,-1537, -1532,-1527,-1522,-1517,-1512,-1507,-1502,-1497,-1492,-1487,-1482,-1477,-1472,-1467, -1462,-1457,-1452,-1447,-1442,-1437,-1432,-1427,-1422,-1417,-1412,-1407,-1402,-1397, -1392,-1386,-1381,-1376,-1371,-1366,-1361,-1356,-1351,-1346,-1341,-1336,-1331,-1326, -1321,-1316,-1311,-1306,-1301,-1296,-1291,-1286,-1281,-1276,-1271,-1266,-1261,-1256, -1251,-1246,-1241,-1236,-1231,-1226,-1221,-1216,-1211,-1206,-1201,-1196,-1191,-1186, -1181,-1176,-1171,-1166,-1161,-1156,-1152,-1147,-1142,-1137,-1132,-1127,-1122,-1117, -1112,-1108,-1103,-1098,-1093,-1088,-1083,-1079,-1074,-1069,-1064,-1060,-1055,-1050, -1045,-1040,-1036,-1031,-1026,-1022,-1017,-1012,-1008,-1003,-998,-994,-989,-984,-980, -975,-970,-966,-961,-957,-952,-947,-943,-938,-934,-929,-925,-920,-916,-911,-907, -902,-898,-894,-889,-885,-880,-876,-872,-867,-863,-859,-854,-850,-846,-841,-837, -833,-828,-824,-820,-816,-812,-807,-803,-799,-795,-791,-787,-782,-778,-774,-770, -766,-762,-758,-754,-750,-746,-742,-738,-734,-730,-726,-722,-718,-714,-710,-706, -702,-699,-695,-691,-687,-683,-679,-676,-672,-668,-664,-661,-657,-653,-649,-646, -642,-638,-635,-631,-627,-624,-620,-617,-613,-609,-606,-602,-599,-595,-592,-588, -585,-581,-578,-574,-571,-568,-564,-561,-557,-554,-551,-547,-544,-541,-537,-534, -531,-528,-524,-521,-518,-515,-511,-508,-505,-502,-499,-496,-492,-489,-486,-483, -480,-477,-474,-471,-468,-465,-462,-459,-456,-453,-450,-447,-444,-441,-438,-435, -433,-430,-427,-424,-421,-418,-416,-413,-410,-407,-405,-402,-399,-396,-394,-391, -388,-386,-383,-380,-378,-375,-373,-370,-367,-365,-362,-360,-357,-355,-352,-350, -347,-345,-342,-340,-337,-335,-333,-330,-328,-325,-323,-321,-318,-316,-314,-311, -309,-307,-305,-302,-300,-298,-296,-293,-291,-289,-287,-285,-282,-280,-278,-276, -274,-272,-270,-268,-266,-264,-261,-259,-257,-255,-253,-251,-249,-247,-246,-244, -242,-240,-238,-236,-234,-232,-230,-228,-226,-225,-223,-221,-219,-217,-216,-214, -212,-210,-209,-207,-205,-203,-202,-200,-198,-197,-195,-193,-192,-190,-188,-187, -185,-183,-182,-180,-179,-177,-176,-174,-172,-171,-169,-168,-166,-165,-163,-162, -161,-159,-158,-156,-155,-153,-152,-151,-149,-148,-146,-145,-144,-142,-141,-140, -138,-137,-136,-134,-133,-132,-131,-129,-128,-127,-126,-124,-123,-122,-121,-120, -118,-117,-116,-115,-114,-113,-111,-110,-109,-108,-107,-106,-105,-104,-103,-102, -100,-99,-98,-97,-96,-95,-94,-93,-92,-91,-90,-89,-88,-87,-86,-85,-85,-84,-83,-82, -81,-80,-79,-78,-77,-76,-75,-75,-74,-73,-72,-71,-70,-70,-69,-68,-67,-66,-66,-65, -64,-63,-62,-62,-61,-60,-59,-59,-58,-57,-56,-56,-55,-54,-54,-53,-52,-52,-51,-50, -50,-49,-48,-48,-47,-46,-46,-45,-45,-44,-43,-43,-42,-42,-41,-40,-40,-39,-39,-38, -38,-37,-36,-36,-35,-35,-34,-34,-33,-33,-32,-32,-31,-31,-30,-30,-29,-29,-29,-28, -28,-27,-27,-26,-26,-25,-25,-25,-24,-24,-23,-23,-23,-22,-22,-21,-21,-21,-20,-20, -20,-19,-19,-18,-18,-18,-17,-17,-17,-16,-16,-16,-15,-15,-15,-15,-14,-14,-14,-13, -13,-13,-13,-12,-12,-12,-11,-11,-11,-11,-10,-10,-10,-10,-9,-9,-9,-9,-9,-8,-8,-8,-8, -7,-7,-7,-7,-7,-6,-6,-6,-6,-6,-6,-5,-5,-5,-5,-5,-5,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3, -3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,0,0,0,0,0,0,0,0, }, { 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131071,131071,131071,131071,131071,131071,131071,131071,131070, 131070,131070,131069,131069,131069,131068,131068,131067,131067,131066,131065,131065, 131064,131063,131062,131060,131059,131058,131056,131055,131053,131051,131049,131047, 131044,131041,131039,131035,131032,131029,131025,131021,131016,131011,131006,131001, 130995,130989,130982,130975,130967,130959,130950,130941,130931,130921,130910,130898, 130886,130872,130858,130844,130828,130811,130794,130775,130756,130735,130714,130691, 130666,130641,130614,130586,130557,130526,130493,130459,130423,130385,130346,130304, 130261,130215,130168,130118,130066,130012,129955,129896,129834,129769,129702,129632, 129559,129483,129403,129321,129235,129145,129052,128956,128855,128751,128642,128530, 128413,128292,128167,128037,127902,127762,127618,127468,127313,127153,126988,126816, 126639,126456,126268,126072,125871,125663,125449,125228,125000,124766,124524,124275, 124018,123754,123482,123202,122915,122619,122315,122003,121682,121352,121014,120666, 120310,119944,119569,119184,118790,118386,117972,117548,117114,116670,116215,115750, 115274,114787,114290,113781,113262,112731,112189,111636,111071,110495,109907,109308, 108696,108073,107438,106791,106132,105461,104778,104083,103375,102656,101924,101180, 100423,99655,98874,98081,97275,96458,95628,94786,93932,93066,92188,91298,90397,89483, 88558,87621,86673,85713,84742,83760,82766,81762,80748,79722,78687,77641,76585,75519, 74443,73359,72264,71161,70049,68929,67800,66663,65519,64367,63207,62041,60868,59689, 58503,57312,56116,54914,53708,52498,51283,50064,48843,47618,46391,45161,43930,42697, 41464,40229,38995,37760,36527,35294,34063,32833,31606,30382,29161,27944,26730,25521, 24317,23119,21926,20740,19560,18388,17223,16066,14918,13779,12649,11529,10420,9321, 8233,7157,6093,5042,4003,2978,1967,969,-14,-982,-1934,-2871,-3792,-4697,-5585,-6455, -7308,-8144,-8961,-9759,-10539,-11300,-12042,-12764,-13466,-14148,-14809,-15450, -16070,-16669,-17247,-17803,-18338,-18851,-19342,-19811,-20258,-20683,-21085,-21465, -21823,-22158,-22470,-22760,-23027,-23272,-23494,-23694,-23871,-24025,-24158,-24268, -24356,-24422,-24467,-24489,-24490,-24470,-24429,-24367,-24284,-24180,-24057,-23913, -23750,-23568,-23367,-23146,-22908,-22652,-22377,-22086,-21778,-21453,-21112,-20756, -20384,-19997,-19596,-19181,-18753,-18312,-17858,-17393,-16915,-16427,-15929,-15420, -14902,-14375,-13840,-13297,-12747,-12190,-11627,-11058,-10485,-9907,-9324,-8739, -8151,-7560,-6968,-6375,-5781,-5187,-4594,-4002,-3411,-2823,-2237,-1655,-1077,-502, 67,631,1189,1741,2286,2824,3354,3875,4388,4892,5387,5871,6345,6808,7261,7701,8130, 8547,8951,9342,9720,10085,10436,10773,11096,11404,11698,11977,12241,12489,12723, 12941,13143,13330,13500,13655,13795,13918,14025,14116,14192,14251,14295,14323,14335, 14331,14312,14278,14228,14164,14084,13990,13881,13757,13620,13469,13304,13126,12934, 12730,12514,12285,12045,11793,11530,11256,10972,10677,10373,10060,9738,9408,9070, 8724,8370,8011,7644,7273,6895,6513,6126,5736,5341,4944,4544,4142,3738,3333,2927, 2521,2115,1710,1306,903,502,104,-291,-683,-1072,-1456,-1836,-2211,-2580,-2944,-3301, -3653,-3997,-4334,-4663,-4985,-5299,-5603,-5900,-6187,-6464,-6732,-6990,-7238,-7476, -7703,-7919,-8124,-8318,-8501,-8673,-8833,-8981,-9117,-9242,-9355,-9455,-9544,-9620, -9685,-9737,-9777,-9806,-9822,-9826,-9819,-9799,-9768,-9726,-9672,-9606,-9530,-9442, -9344,-9234,-9115,-8985,-8845,-8696,-8536,-8368,-8190,-8004,-7809,-7606,-7395,-7177, -6951,-6719,-6479,-6233,-5982,-5725,-5462,-5195,-4923,-4647,-4367,-4083,-3797,-3507, -3216,-2922,-2627,-2331,-2034,-1736,-1438,-1141,-844,-548,-253,40,330,619,904,1187, 1466,1741,2012,2279,2541,2798,3050,3296,3536,3770,3998,4219,4434,4641,4841,5034, 5218,5395,5564,5725,5877,6021,6156,6282,6399,6508,6607,6697,6779,6851,6913,6967, 7011,7046,7071,7087,7095,7093,7081,7061,7032,6994,6948,6892,6829,6756,6676,6588, 6491,6387,6276,6157,6031,5898,5758,5612,5459,5301,5136,4966,4791,4611,4426,4237, 4043,3845,3644,3440,3232,3022,2809,2594,2377,2158,1938,1717,1495,1273,1051,829,607, 387,167,-52,-269,-484,-697,-907,-1115,-1320,-1522,-1720,-1915,-2106,-2293,-2475, -2653,-2826,-2994,-3157,-3315,-3467,-3614,-3754,-3889,-4018,-4140,-4256,-4366,-4469, -4565,-4655,-4738,-4814,-4882,-4944,-4999,-5047,-5088,-5122,-5148,-5168,-5180,-5186, -5184,-5176,-5161,-5138,-5110,-5074,-5032,-4984,-4929,-4868,-4801,-4728,-4649,-4564, -4474,-4378,-4278,-4172,-4061,-3946,-3826,-3702,-3574,-3442,-3306,-3167,-3024,-2879, -2730,-2579,-2426,-2270,-2113,-1954,-1793,-1631,-1468,-1304,-1140,-975,-810,-645, -481,-317,-154,8,169,329,486,643,796,948,1098,1244,1388,1529,1667,1802,1933,2060, 2184,2304,2419,2531,2638,2741,2839,2933,3022,3106,3185,3260,3329,3393,3452,3506, 3554,3597,3635,3668,3695,3718,3734,3746,3752,3753,3749,3740,3725,3706,3682,3652, 3618,3579,3536,3488,3435,3378,3317,3252,3183,3110,3033,2952,2868,2781,2691,2597, 2501,2402,2300,2196,2090,1981,1871,1759,1645,1530,1414,1297,1179,1060,941,821,701, 581,461,342,223,104,-13,-130,-245,-360,-472,-584,-693,-801,-907,-1010,-1111,-1210, -1307,-1401,-1492,-1580,-1665,-1747,-1827,-1902,-1975,-2044,-2110,-2172,-2231,-2286, -2337,-2385,-2429,-2469,-2505,-2538,-2567,-2591,-2612,-2629,-2642,-2652,-2657,-2659, -2657,-2651,-2641,-2628,-2612,-2591,-2567,-2540,-2509,-2475,-2438,-2398,-2354,-2308, -2259,-2207,-2152,-2095,-2035,-1973,-1908,-1842,-1773,-1703,-1630,-1556,-1480,-1403, -1325,-1245,-1164,-1083,-1000,-917,-833,-749,-664,-579,-495,-410,-325,-241,-157,-73, 10,92,173,253,332,410,487,562,636,708,779,848,915,980,1043,1104,1163,1219,1274, 1326,1376,1423,1467,1510,1549,1586,1621,1653,1682,1708,1732,1753,1771,1786,1799, 1809,1817,1821,1823,1823,1819,1813,1805,1794,1780,1764,1746,1725,1702,1677,1649, 1619,1588,1554,1518,1481,1441,1400,1358,1313,1268,1220,1172,1122,1071,1019,966,912, 858,802,746,690,633,575,518,460,402,344,286,228,170,113,56,0,-56,-111,-166,-219, -272,-324,-375,-425,-474,-521,-567,-612,-656,-698,-739,-779,-816,-852,-887,-920, -951,-981,-1008,-1034,-1059,-1081,-1102,-1120,-1137,-1152,-1166,-1177,-1186,-1194, -1200,-1204,-1206,-1206,-1205,-1201,-1196,-1190,-1181,-1171,-1159,-1146,-1131,-1115, -1097,-1078,-1057,-1035,-1012,-987,-961,-934,-906,-877,-847,-816,-784,-751,-718,-683, -649,-613,-577,-541,-504,-466,-429,-391,-353,-315,-277,-239,-201,-163,-125,-88,-50, -13,23,59,95,130,164,198,232,264,296,327,357,386,414,442,468,493,518,541,563,584, 604,623,641,657,673,687,700,712,722,731,739,746,752,757,760,762,763,763,761,759, 755,750,744,737,729,720,710,699,688,675,661,647,631,615,598,581,562,543,524,504, 483,462,441,419,396,374,351,327,304,280,256,232,208,184,160,136,113,89,65,42,18,-5, -27,-50,-72,-93,-114,-135,-156,-175,-195,-213,-232,-249,-266,-283,-299,-314,-328, -342,-355,-367,-379,-390,-400,-409,-418,-426,-433,-439,-445,-450,-454,-457,-460, -462,-463,-463,-463,-462,-460,-458,-454,-451,-446,-441,-435,-429,-422,-415,-407, -398,-389,-379,-369,-359,-348,-337,-325,-313,-300,-288,-275,-262,-248,-234,-221, -207,-192,-178,-164,-149,-135,-120,-106,-91,-77,-63,-48,-34,-20,-6,7,21,34,47,60,72, 85,96,108,119,130,141,151,161,170,179,188,196,204,211,218,225,231,236,241,246,250, 254,257,260,262,264,266,267,267,267,267,266,265,264,262,259,257,254,250,246,242, 238,233,228,222,217,211,205,198,191,184,177,170,163,155,147,139,131,123,115,107,99, 90,82,74,65,57,48,40,32,24,16,8,0,-8,-16,-23,-30,-38,-45,-52,-58,-65,-71,-77,-83, -88,-94,-99,-104,-109,-113,-117,-121,-125,-128,-131,-134,-137,-139,-141,-143,-145, -146,-147,-148,-148,-149,-149,-148,-148,-147,-146,-145,-144,-142,-140,-138,-136, -134,-131,-128,-126,-122,-119,-116,-112,-109,-105,-101,-97,-93,-88,-84,-80,-75,-71, -66,-62,-57,-53,-48,-43,-39,-34,-29,-25,-20,-16,-11,-7,-2,2,6,10,14,18,22,26,30,33, 37,40,43,47,50,52,55,58,60,62,65,67,68,70,72,73,74,76,77,77,78,79,79,79,79,79,79, 79,79,78,77,77,76,75,74,72,71,70,68,67,65,63,61,59,57,55,53,51,49,46,44,42,39,37, 34,32,30,27,25,22,20,17,15,12,10,7,5,3,0,-2,-4,-6,-8,-10,-12,-14,-16,-18,-20,-22, -23,-25,-26,-28,-29,-30,-32,-33,-34,-35,-36,-37,-37,-38,-39,-39,-40,-40,-40,-40, -40,-41,-41,-40,-40,-40,-40,-39,-39,-39,-38,-37,-37,-36,-35,-35,-34,-33,-32,-31, -30,-29,-28,-27,-26,-24,-23,-22,-21,-20,-18,-17,-16,-15,-13,-12,-11,-10,-8,-7,-6, -5,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,13,14,15,15,16,16,17,17,18,18,18,19, 19,19,19,19,20,20,20,20,20,19,19,19,19,19,19,18,18,18,17,17,17,16,16,15,15,14,14, 13,13,12,12,11,10,10,9,9,8,7,7,6,6,5,4,4,3,3,2,1,1,0,0,-1,-1,-2,-2,-3,-3,-4,-4,-4, -5,-5,-6,-6,-6,-7,-7,-7,-7,-8,-8,-8,-8,-8,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, -9,-9,-8,-8,-8,-8,-8,-8,-7,-7,-7,-7,-7,-6,-6,-6,-6,-5,-5,-5,-5,-4,-4,-4,-3,-3,-3, -3,-2,-2,-2,-2,-1,-1,-1,-1,0,0,0,0,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1, 1,1,1,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,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }, { 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131072,131072,131072,131072,131072,131072,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131070,131070,131070,131070,131070, 131070,131070,131070,131070,131070,131070,131069,131069,131069,131069,131069,131069, 131069,131068,131068,131068,131068,131067,131067,131067,131067,131066,131066,131066, 131065,131065,131064,131064,131063,131063,131062,131062,131061,131060,131060,131059, 131058,131057,131057,131056,131055,131054,131053,131052,131050,131049,131048,131046, 131045,131043,131042,131040,131038,131037,131035,131033,131030,131028,131026,131023, 131021,131018,131015,131012,131009,131006,131002,130999,130995,130991,130987,130983, 130978,130973,130969,130964,130958,130953,130947,130941,130935,130928,130922,130915, 130907,130900,130892,130884,130875,130866,130857,130848,130838,130828,130817,130806, 130794,130783,130770,130757,130744,130731,130716,130702,130687,130671,130655,130638, 130621,130603,130584,130565,130545,130525,130504,130482,130460,130436,130413,130388, 130363,130336,130310,130282,130253,130224,130193,130162,130130,130097,130063,130028, 129992,129955,129917,129878,129838,129797,129754,129711,129666,129621,129574,129525, 129476,129425,129373,129320,129265,129209,129152,129093,129033,128971,128908,128843, 128777,128710,128641,128570,128497,128423,128348,128270,128191,128111,128028,127944, 127858,127770,127680,127589,127495,127400,127303,127204,127103,127000,126895,126787, 126678,126567,126454,126339,126221,126102,125980,125856,125730,125602,125471,125338, 125203,125066,124927,124785,124641,124494,124345,124194,124041,123885,123726,123566, 123403,123237,123069,122899,122726,122551,122373,122193,122010,121825,121638,121447, 121255,121060,120862,120662,120460,120255,120047,119837,119625,119410,119192,118972, 118750,118525,118298,118068,117836,117601,117364,117125,116883,116639,116392,116143, 115892,115638,115382,115124,114863,114600,114335,114068,113798,113526,113252,112976, 112698,112417,112135,111850,111564,111275,110985,110692,110398,110101,109803,109503, 109201,108897,108591,108284,107975,107664,107352,107038,106722,106405,106086,105766, 105445,105122,104797,104472,104145,103816,103487,103156,102824,102491,102157,101822, 101485,101148,100810,100471,100131,99790,99448,99106,98762,98419,98074,97729,97383, 97037,96690,96343,95995,95647,95298,94949,94600,94250,93901,93551,93201,92850,92500, 92150,91799,91449,91098,90748,90397,90047,89697,89347,88998,88648,88299,87950,87601, 87253,86905,86557,86210,85863,85517,85171,84826,84481,84137,83793,83450,83107,82765, 82424,82083,81743,81404,81065,80727,80390,80053,79717,79382,79048,78714,78382,78050, 77718,77388,77058,76730,76402,76074,75748,75423,75098,74774,74451,74129,73808,73487, 73168,72849,72531,72214,71897,71582,71267,70953,70640,70328,70017,69706,69397,69088, 68779,68472,68165,67859,67554,67250,66946,66643,66341,66040,65739,65439,65140,64841, 64543,64246,63949,63653,63358,63063,62769,62475,62182,61890,61598,61307,61017,60727, 60437,60148,59860,59572,59284,58998,58711,58425,58140,57855,57571,57287,57003,56720, 56437,56155,55873,55592,55311,55031,54751,54471,54192,53913,53635,53357,53079,52802, 52525,52249,51973,51697,51422,51148,50873,50599,50326,50053,49780,49508,49236,48964, 48694,48423,48153,47883,47614,47345,47077,46809,46542,46275,46009,45743,45477,45213, 44948,44685,44421,44159,43897,43635,43374,43114,42854,42595,42336,42079,41821,41565, 41309,41054,40799,40545,40292,40040,39788,39537,39287,39038,38789,38541,38294,38048, 37803,37558,37315,37072,36830,36589,36348,36109,35871,35633,35397,35161,34927,34693, 34460,34228,33998,33768,33539,33311,33084,32859,32634,32410,32187,31966,31745,31526, 31307,31090,30873,30658,30444,30230,30018,29807,29597,29388,29181,28974,28768,28564, 28360,28158,27957,27756,27557,27359,27162,26966,26771,26578,26385,26193,26003,25813, 25624,25437,25250,25065,24881,24697,24515,24333,24153,23974,23795,23618,23441,23266, 23091,22917,22745,22573,22402,22232,22063,21895,21728,21561,21396,21231,21067,20904, 20742,20581,20420,20260,20101,19943,19786,19629,19473,19318,19164,19010,18857,18705, 18553,18402,18252,18103,17954,17806,17658,17511,17365,17220,17075,16930,16787,16644, 16501,16359,16218,16077,15937,15797,15658,15520,15382,15245,15108,14972,14836,14701, 14566,14432,14299,14166,14033,13902,13770,13639,13509,13379,13250,13121,12993,12865, 12738,12611,12485,12360,12235,12110,11986,11863,11740,11617,11495,11374,11253,11133, 11013,10894,10776,10658,10540,10423,10307,10191,10076,9961,9847,9734,9621,9509,9397, 9286,9176,9066,8957,8848,8740,8633,8526,8420,8315,8210,8105,8002,7899,7797,7695, 7594,7494,7394,7295,7197,7099,7003,6906,6811,6716,6622,6528,6435,6343,6251,6160, 6070,5981,5892,5804,5717,5630,5544,5458,5374,5290,5206,5124,5042,4961,4880,4800, 4721,4642,4564,4487,4410,4334,4259,4184,4110,4037,3964,3892,3821,3750,3679,3610, 3541,3472,3405,3337,3271,3205,3139,3074,3010,2946,2883,2820,2758,2696,2635,2575, 2515,2455,2396,2338,2280,2222,2165,2109,2052,1997,1942,1887,1833,1779,1725,1672, 1620,1568,1516,1464,1413,1363,1313,1263,1213,1164,1116,1067,1019,972,924,877,831, 784,738,693,647,602,558,513,469,425,382,339,296,253,211,169,127,85,44,3,-38,-78, -118,-158,-198,-237,-276,-315,-353,-392,-430,-467,-505,-542,-579,-616,-652,-688, -724,-760,-795,-831,-865,-900,-934,-968,-1002,-1036,-1069,-1102,-1135,-1167,-1199, -1231,-1263,-1294,-1325,-1356,-1386,-1417,-1447,-1476,-1506,-1535,-1563,-1592,-1620, -1648,-1676,-1703,-1730,-1757,-1783,-1809,-1835,-1860,-1886,-1910,-1935,-1959,-1983, -2007,-2030,-2053,-2076,-2099,-2121,-2143,-2164,-2185,-2206,-2227,-2247,-2267,-2287, -2306,-2325,-2344,-2363,-2381,-2399,-2416,-2434,-2451,-2468,-2484,-2500,-2516,-2532, -2547,-2562,-2577,-2591,-2605,-2619,-2633,-2646,-2659,-2672,-2685,-2697,-2709,-2721, -2733,-2744,-2755,-2766,-2777,-2787,-2798,-2807,-2817,-2827,-2836,-2845,-2854,-2863, -2871,-2880,-2888,-2896,-2903,-2911,-2918,-2925,-2932,-2939,-2946,-2952,-2959,-2965, -2971,-2977,-2982,-2988,-2993,-2999,-3004,-3009,-3014,-3018,-3023,-3027,-3032,-3036, -3040,-3044,-3048,-3052,-3056,-3059,-3063,-3066,-3069,-3073,-3076,-3079,-3082,-3084, -3087,-3090,-3092,-3095,-3097,-3099,-3101,-3104,-3106,-3108,-3109,-3111,-3113,-3115, -3116,-3118,-3119,-3120,-3122,-3123,-3124,-3125,-3126,-3127,-3128,-3128,-3129,-3130, -3130,-3131,-3131,-3131,-3132,-3132,-3132,-3132,-3132,-3131,-3131,-3131,-3130,-3130, -3129,-3129,-3128,-3127,-3126,-3125,-3124,-3123,-3122,-3121,-3119,-3118,-3116,-3114, -3113,-3111,-3109,-3107,-3105,-3103,-3100,-3098,-3095,-3093,-3090,-3088,-3085,-3082, -3079,-3076,-3072,-3069,-3066,-3062,-3059,-3055,-3051,-3048,-3044,-3040,-3036,-3032, -3027,-3023,-3019,-3014,-3009,-3005,-3000,-2995,-2990,-2985,-2980,-2975,-2970,-2964, -2959,-2954,-2948,-2942,-2937,-2931,-2925,-2919,-2913,-2907,-2901,-2895,-2889,-2883, -2876,-2870,-2864,-2857,-2850,-2844,-2837,-2831,-2824,-2817,-2810,-2803,-2796,-2789, -2782,-2775,-2768,-2761,-2754,-2747,-2740,-2732,-2725,-2718,-2710,-2703,-2696,-2688, -2681,-2674,-2666,-2659,-2651,-2644,-2636,-2629,-2621,-2613,-2606,-2598,-2591,-2583, -2576,-2568,-2560,-2553,-2545,-2537,-2530,-2522,-2515,-2507,-2499,-2492,-2484,-2476, -2469,-2461,-2454,-2446,-2438,-2431,-2423,-2416,-2408,-2400,-2393,-2385,-2378,-2370, -2362,-2355,-2347,-2340,-2332,-2325,-2317,-2310,-2302,-2294,-2287,-2279,-2272,-2264, -2257,-2249,-2242,-2234,-2227,-2219,-2212,-2204,-2197,-2189,-2182,-2174,-2167,-2159, -2152,-2144,-2137,-2129,-2122,-2114,-2107,-2099,-2092,-2084,-2077,-2069,-2062,-2054, -2047,-2039,-2032,-2024,-2016,-2009,-2001,-1994,-1986,-1979,-1971,-1964,-1956,-1948, -1941,-1933,-1926,-1918,-1911,-1903,-1895,-1888,-1880,-1873,-1865,-1857,-1850,-1842, -1835,-1827,-1819,-1812,-1804,-1797,-1789,-1781,-1774,-1766,-1758,-1751,-1743,-1736, -1728,-1720,-1713,-1705,-1698,-1690,-1683,-1675,-1667,-1660,-1652,-1645,-1637,-1630, -1622,-1615,-1607,-1600,-1592,-1585,-1577,-1570,-1563,-1555,-1548,-1540,-1533,-1526, -1518,-1511,-1504,-1496,-1489,-1482,-1475,-1467,-1460,-1453,-1446,-1439,-1431,-1424, -1417,-1410,-1403,-1396,-1389,-1382,-1375,-1368,-1361,-1354,-1347,-1341,-1334,-1327, -1320,-1313,-1307,-1300,-1293,-1286,-1280,-1273,-1266,-1260,-1253,-1247,-1240,-1234, -1227,-1221,-1214,-1208,-1202,-1195,-1189,-1183,-1176,-1170,-1164,-1157,-1151,-1145, -1139,-1133,-1127,-1121,-1114,-1108,-1102,-1096,-1090,-1084,-1078,-1073,-1067,-1061, -1055,-1049,-1043,-1037,-1032,-1026,-1020,-1014,-1009,-1003,-997,-992,-986,-980,-975, -969,-964,-958,-953,-947,-942,-936,-931,-925,-920,-914,-909,-904,-898,-893,-888, -882,-877,-872,-867,-861,-856,-851,-846,-841,-836,-830,-825,-820,-815,-810,-805, -800,-795,-790,-785,-780,-775,-770,-765,-760,-756,-751,-746,-741,-736,-731,-727, -722,-717,-712,-708,-703,-698,-694,-689,-685,-680,-675,-671,-666,-662,-657,-653, -648,-644,-639,-635,-631,-626,-622,-618,-613,-609,-605,-601,-596,-592,-588,-584, -580,-575,-571,-567,-563,-559,-555,-551,-547,-543,-539,-535,-531,-527,-524,-520, -516,-512,-508,-504,-501,-497,-493,-490,-486,-482,-479,-475,-471,-468,-464,-461, -457,-454,-450,-447,-443,-440,-436,-433,-430,-426,-423,-420,-416,-413,-410,-407, -403,-400,-397,-394,-391,-387,-384,-381,-378,-375,-372,-369,-366,-363,-360,-357, -354,-351,-348,-345,-342,-340,-337,-334,-331,-328,-325,-323,-320,-317,-314,-312, -309,-306,-304,-301,-298,-296,-293,-291,-288,-285,-283,-280,-278,-275,-273,-270, -268,-265,-263,-260,-258,-256,-253,-251,-249,-246,-244,-242,-239,-237,-235,-232, -230,-228,-226,-224,-221,-219,-217,-215,-213,-211,-209,-206,-204,-202,-200,-198, -196,-194,-192,-190,-188,-186,-184,-182,-180,-178,-176,-175,-173,-171,-169,-167, -165,-163,-162,-160,-158,-156,-155,-153,-151,-149,-148,-146,-144,-143,-141,-139, -138,-136,-134,-133,-131,-130,-128,-127,-125,-123,-122,-120,-119,-117,-116,-115, -113,-112,-110,-109,-107,-106,-105,-103,-102,-101,-99,-98,-97,-95,-94,-93,-91,-90, -89,-88,-86,-85,-84,-83,-82,-80,-79,-78,-77,-76,-75,-73,-72,-71,-70,-69,-68,-67, -66,-65,-64,-63,-62,-61,-60,-59,-58,-57,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47, -46,-46,-45,-44,-43,-42,-41,-40,-40,-39,-38,-37,-36,-36,-35,-34,-33,-33,-32,-31, -30,-30,-29,-28,-27,-27,-26,-25,-25,-24,-23,-23,-22,-21,-21,-20,-19,-19,-18,-18, -17,-16,-16,-15,-15,-14,-14,-13,-12,-12,-11,-11,-10,-10,-9,-9,-8,-8,-7,-7,-6,-6,-5, -5,-5,-4,-4,-3,-3,-2,-2,-2,-1,-1,0,0,0,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7, 8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,11,12,12,12,12,12,13,13,13,13,13,13,14, 14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,17, 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,16,16,16,16, 16,16,16,16,16,16,16,16,16,16,15,15,15,15,15,15,15,15,15,15,15,14,14,14,14,14,14, 14,14,14,14,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12,12,11,11,11,11,11,11,11, 10,10,10,10,10,10,10,9,9,9,9,9,9,9,8,8,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,5,5,5,5, 5,5,4,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0, }, { 131072,131072,131072,131072,131072,131072,131072,131072,131072,131071,131071, 131071,131071,131071,131070,131070,131070,131069,131069,131069,131068,131067,131067, 131066,131065,131064,131063,131062,131061,131060,131058,131056,131055,131053,131051, 131048,131046,131043,131040,131037,131034,131030,131026,131022,131017,131012,131007, 131001,130995,130988,130981,130974,130965,130957,130948,130938,130927,130916,130904, 130892,130878,130864,130849,130833,130816,130798,130779,130759,130737,130715,130691, 130666,130640,130612,130583,130552,130519,130485,130449,130412,130372,130330,130287, 130241,130193,130143,130090,130035,129978,129918,129855,129789,129720,129649,129574, 129496,129415,129330,129242,129150,129054,128954,128851,128743,128631,128515,128394, 128269,128139,128004,127864,127718,127568,127412,127251,127084,126911,126732,126547, 126356,126158,125954,125743,125525,125300,125068,124829,124582,124328,124065,123795, 123517,123231,122936,122632,122320,121999,121669,121330,120982,120624,120256,119879, 119492,119095,118687,118269,117841,117402,116952,116492,116020,115538,115043,114538, 114021,113492,112952,112400,111836,111259,110671,110070,109457,108831,108193,107543, 106879,106203,105514,104813,104098,103370,102630,101876,101110,100330,99537,98732, 97913,97081,96236,95378,94508,93624,92727,91818,90896,89961,89013,88053,87081,86096, 85099,84090,83069,82036,80991,79935,78868,77789,76700,75599,74488,73367,72235,71094, 69943,68782,67613,66434,65246,64051,62847,61635,60416,59190,57957,56717,55471,54220, 52963,51701,50434,49163,47888,46609,45327,44043,42756,41467,40177,38885,37594,36301, 35010,33719,32429,31141,29855,28571,27291,26014,24741,23473,22210,20952,19700,18455, 17217,15986,14763,13548,12343,11147,9961,8785,7620,6466,5325,4196,3079,1976,886,-189, -1249,-2295,-3325,-4339,-5336,-6317,-7280,-8226,-9154,-10063,-10953,-11824,-12675, -13507,-14318,-15108,-15878,-16626,-17353,-18058,-18741,-19401,-20038,-20653,-21245, -21813,-22358,-22879,-23376,-23849,-24298,-24723,-25123,-25499,-25850,-26177,-26479, -26756,-27009,-27236,-27440,-27618,-27772,-27901,-28006,-28087,-28143,-28175,-28184, -28168,-28129,-28067,-27981,-27873,-27741,-27588,-27412,-27214,-26995,-26755,-26494, -26212,-25910,-25589,-25248,-24888,-24510,-24114,-23700,-23269,-22821,-22357,-21878, -21383,-20874,-20351,-19814,-19264,-18702,-18127,-17542,-16946,-16339,-15724,-15099, -14466,-13825,-13177,-12523,-11863,-11198,-10528,-9854,-9177,-8498,-7816,-7133,-6449, -5765,-5082,-4400,-3719,-3041,-2366,-1694,-1027,-364,293,944,1589,2227,2856,3478, 4091,4695,5288,5872,6444,7006,7555,8093,8617,9129,9627,10111,10580,11036,11476, 11900,12309,12702,13079,13439,13782,14108,14417,14708,14982,15237,15475,15695,15896, 16079,16244,16390,16518,16627,16718,16790,16844,16880,16897,16896,16877,16840,16785, 16712,16622,16515,16390,16249,16092,15918,15728,15522,15301,15065,14814,14549,14270, 13977,13671,13352,13021,12678,12324,11958,11582,11196,10800,10395,9982,9560,9131, 8695,8252,7803,7348,6889,6425,5957,5486,5013,4536,4059,3580,3100,2620,2141,1663, 1186,711,239,-230,-696,-1157,-1614,-2065,-2512,-2952,-3385,-3812,-4231,-4642,-5045, -5439,-5825,-6200,-6566,-6922,-7267,-7601,-7924,-8236,-8535,-8823,-9098,-9360,-9610, -9847,-10070,-10280,-10476,-10659,-10828,-10982,-11123,-11249,-11361,-11459,-11543, -11612,-11667,-11707,-11734,-11746,-11744,-11727,-11697,-11653,-11596,-11524,-11440, -11342,-11231,-11107,-10971,-10822,-10661,-10489,-10304,-10109,-9903,-9686,-9458, -9221,-8974,-8717,-8452,-8178,-7897,-7607,-7310,-7006,-6695,-6378,-6056,-5728,-5396, -5059,-4718,-4373,-4026,-3675,-3323,-2969,-2613,-2257,-1900,-1543,-1187,-831,-477, -125,225,573,917,1258,1595,1928,2256,2580,2898,3210,3516,3815,4108,4394,4672,4942, 5205,5459,5705,5942,6169,6388,6596,6796,6985,7164,7333,7491,7639,7776,7902,8018, 8122,8215,8298,8369,8429,8478,8516,8542,8558,8562,8556,8538,8510,8471,8421,8361, 8291,8210,8119,8019,7909,7789,7660,7522,7376,7220,7057,6885,6706,6519,6325,6125, 5917,5703,5484,5258,5028,4792,4552,4307,4059,3806,3551,3293,3032,2769,2504,2237, 1970,1701,1433,1164,895,627,360,95,-169,-431,-690,-947,-1201,-1452,-1699,-1942, -2181,-2415,-2644,-2869,-3088,-3302,-3510,-3711,-3907,-4096,-4278,-4453,-4622,-4783, -4936,-5082,-5220,-5351,-5473,-5587,-5693,-5791,-5880,-5961,-6033,-6097,-6152,-6199, -6237,-6267,-6287,-6300,-6304,-6299,-6286,-6265,-6235,-6198,-6152,-6098,-6037,-5968, -5891,-5807,-5716,-5618,-5513,-5401,-5283,-5158,-5027,-4891,-4749,-4601,-4449,-4291, -4129,-3962,-3791,-3617,-3438,-3256,-3072,-2884,-2693,-2501,-2306,-2110,-1912,-1713, -1513,-1313,-1112,-911,-710,-510,-311,-112,85,281,475,666,856,1043,1227,1408,1586, 1761,1931,2098,2261,2420,2574,2723,2868,3007,3142,3271,3395,3513,3626,3732,3833, 3928,4016,4099,4175,4245,4309,4366,4417,4461,4499,4530,4555,4573,4585,4591,4590, 4583,4569,4550,4524,4492,4454,4410,4361,4306,4245,4179,4108,4031,3949,3863,3772, 3676,3576,3472,3364,3252,3136,3016,2894,2768,2640,2509,2375,2239,2101,1961,1820, 1677,1533,1387,1241,1095,948,801,654,507,360,215,70,-74,-217,-358,-498,-636,-771, -905,-1036,-1165,-1291,-1415,-1535,-1652,-1766,-1877,-1984,-2088,-2187,-2283,-2375, -2463,-2546,-2625,-2700,-2771,-2837,-2898,-2955,-3008,-3055,-3098,-3136,-3170,-3198, -3222,-3241,-3256,-3265,-3270,-3271,-3266,-3258,-3244,-3226,-3204,-3177,-3146,-3111, -3071,-3028,-2981,-2930,-2875,-2816,-2754,-2689,-2620,-2548,-2473,-2396,-2315,-2232, -2146,-2058,-1968,-1876,-1782,-1686,-1589,-1490,-1390,-1289,-1187,-1084,-980,-876, -771,-667,-562,-457,-353,-249,-145,-43,59,160,260,358,456,551,645,738,828,916,1003, 1087,1169,1248,1325,1399,1471,1540,1606,1669,1729,1786,1840,1891,1938,1983,2024, 2062,2096,2128,2155,2180,2201,2219,2233,2244,2252,2256,2257,2255,2249,2240,2228, 2213,2195,2174,2150,2123,2093,2060,2025,1987,1946,1903,1858,1810,1761,1709,1655, 1599,1541,1482,1421,1359,1295,1230,1164,1096,1028,959,889,818,747,676,604,532,460, 388,316,245,173,102,32,-38,-107,-175,-242,-308,-374,-437,-500,-561,-621,-680,-736, -792,-845,-897,-947,-995,-1041,-1085,-1127,-1166,-1204,-1240,-1273,-1304,-1333, -1360,-1385,-1407,-1427,-1444,-1459,-1472,-1483,-1491,-1497,-1501,-1502,-1501,-1498, -1493,-1486,-1476,-1465,-1451,-1435,-1418,-1398,-1377,-1353,-1328,-1302,-1273,-1243, -1212,-1179,-1144,-1108,-1071,-1033,-994,-953,-912,-869,-826,-782,-737,-692,-646, -600,-553,-506,-459,-411,-363,-316,-268,-221,-173,-126,-79,-33,13,58,103,147,191, 233,275,316,356,396,434,471,507,541,575,607,638,668,696,723,749,773,796,817,837, 855,872,887,901,913,924,933,941,947,952,955,957,957,956,953,949,943,936,928,919, 908,896,882,868,852,835,818,799,779,758,736,713,690,666,641,615,589,562,534,506, 478,449,420,390,361,331,301,270,240,210,180,150,120,90,60,31,2,-27,-55,-83,-110, -137,-164,-190,-215,-239,-263,-286,-309,-331,-352,-372,-391,-410,-427,-444,-460, -475,-489,-502,-514,-525,-536,-545,-553,-561,-567,-572,-577,-580,-583,-585,-585, -585,-584,-582,-579,-575,-571,-565,-559,-552,-544,-536,-526,-516,-506,-494,-482, -470,-457,-443,-429,-414,-399,-383,-367,-351,-334,-317,-300,-282,-265,-247,-229, -210,-192,-174,-155,-137,-119,-100,-82,-64,-46,-28,-11,7,24,41,58,74,90,105,121,135, 150,164,177,190,203,215,227,238,248,258,268,277,285,293,300,307,313,318,323,327, 331,334,337,339,340,341,341,341,340,339,337,334,331,328,324,320,315,310,304,298, 292,285,277,270,262,254,245,237,227,218,209,199,189,179,169,159,148,138,127,116, 106,95,84,73,63,52,42,31,21,11,0,-10,-19,-29,-38,-48,-57,-66,-74,-83,-91,-98,-106, -113,-120,-127,-133,-139,-145,-150,-155,-160,-165,-169,-172,-176,-179,-182,-184, -186,-188,-189,-190,-191,-191,-191,-191,-190,-190,-188,-187,-185,-183,-181,-178, -175,-172,-169,-165,-162,-158,-154,-149,-145,-140,-135,-130,-125,-119,-114,-109, -103,-97,-91,-86,-80,-74,-68,-62,-56,-50,-44,-38,-32,-26,-20,-14,-8,-3,3,8,14,19,24, 29,34,39,43,48,52,56,60,64,68,72,75,78,81,84,86,89,91,93,95,97,98,99,100,101,102, 103,103,103,103,103,103,102,101,100,99,98,97,96,94,92,90,88,86,84,82,79,77,74,71, 69,66,63,60,57,54,51,48,44,41,38,35,32,28,25,22,19,16,12,9,6,3,0,-3,-6,-9,-11,-14, -17,-19,-22,-24,-26,-29,-31,-33,-35,-37,-38,-40,-42,-43,-45,-46,-47,-48,-49,-50, -51,-51,-52,-52,-53,-53,-53,-53,-53,-53,-53,-53,-52,-52,-51,-50,-50,-49,-48,-47, -46,-45,-44,-43,-42,-40,-39,-38,-36,-35,-33,-32,-30,-29,-27,-25,-24,-22,-20,-19, -17,-15,-14,-12,-11,-9,-7,-6,-4,-3,-1,1,2,3,5,6,8,9,10,11,13,14,15,16,17,18,19,20, 20,21,22,22,23,24,24,24,25,25,25,26,26,26,26,26,26,26,26,26,25,25,25,25,24,24,23, 23,22,22,21,21,20,19,19,18,17,17,16,15,14,14,13,12,11,10,10,9,8,7,6,6,5,4,3,2,2,1, 0,-1,-1,-2,-3,-3,-4,-5,-5,-6,-6,-7,-7,-8,-8,-9,-9,-9,-10,-10,-10,-11,-11,-11,-11, -12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-11,-11,-11,-11,-11,-10, -10,-10,-10,-9,-9,-9,-8,-8,-8,-7,-7,-7,-6,-6,-6,-5,-5,-4,-4,-4,-3,-3,-3,-2,-2,-2, -1,-1,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0,0, -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,-2, -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,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,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }, }; milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/interpolate.txt0000644000175000017500000005706710742655365030403 0ustar admin2admin2Dear Amiga mod playback software author, you are receiving this note because your software is implementing playback capabilities for an important format, the Amiga protracker 1.x-3.x mod format. As you probably are aware, most of these modules were composed on the Amiga computer for playback on Amiga system. The Amiga hardware playback system is unlike the PC environment, and needs some special care if authentic-seeming Amiga mod playback is desired. Typical playback software for the various sample tracker formats is architected roughly like this: [ Player routine ] --> [ Mixer and resampler ] --> Output The player routine component produces information about the samples, their sampling frequencies and volume levels (and filtering, panning, etc. depending on format) to the mixer and resampler component, which uses the player routine's instructions to generate the final output by resampling the sample stream from memory and mixing it to physical output channels. I'm going to focus exclusively to the Mixer and resampler component here. A typical implementation of the resampler uses linear interpolation, or some higher-order polynomial interpolation, splines, or even sinc-based "theoretically correct" resampling with some 8-tap FIR or more. Unfortunately, all of them miss the mark as far as Amiga is concerned. For typical mod player, the most accurate emulation of Amiga output occurs when *no* interpolation is used at all. However, there seems to be nothing special about the mixing -- simply adding the resampled channels together suffices. Why the Amiga is different? --------------------------- To understand what goes on with the Amiga sound chip, Paula, is to understand that Paula does no interpolation of any kind. Paula's output is strictly a pulse wave, produced on 3546895 Hz frequency, which is the Paula clock rate for PAL systems. The Amiga period values, typically valued somewhere between 120 and 800, count Paula ticks. For instance, a period value of 400 means that Paula waits 400 ticks holding the output constant, and then changes to the next sample. To simulate this perfectly, we would produce an output sample stream at that 3.55 MHz rate, one sample per tick, and then simply hold the output constant while counting down to zero from the period value, then switch to next sample, reset period clock back to original value, and so on. This stream would be very accurate representation of the Paula's output. Aliasing in Paula output ------------------------ It is also worth it to understand that playing back a sample from Paula replaces the original waveform with its smoothly undulating shapes with nothing but hard-edged pulses. This will have an impact to the sound, of course, and is called aliasing distortion. It's called aliasing, because copies of the original sound's frequency spectrum repeat throughout the entire audible part of audio spectrum and beyond, theoretically up to infinity. This may surprise those who believe that because Amiga's maximum sampling rate is some 28867 Hz, the maximum frequency produced by Amiga is threrefore limited to 14.5 kHz or so. However, this is merely the highest frequency that may be produced without aliasing. In addition, some misguided people have tried to run their mod players at 28867 Hz mixing frequency based on some kind of confused idea of what the mixing rate means for Amiga. This won't work either. The analog filters -- more complications ---------------------------------------- After leaving the chip, the sound enters a 6 dB/oct resistor+capacitor (RC) low-pass filter tuned at approximately 5 kHz. I will call this component "fixed filter" in this document. The purpose of this filter is probably to remove some of that aliasing which is inherent in the pulse synthesis. Additionally, it is possible to engage a low-pass 12 dB/oct Butterworth filter tuned at approximately 3.2 kHz by turning the Amiga power LED brighter with a special protracker command. I will call this component "LED filter". These filters should probably be understood as reconstruction filters, because their purpose is to attempt to "reconstruct" the original smoothly undulating waveform after a pulse-based version of it has been generated by some D/A converter. However, proper reconstruction filters should probably feature steeper cut-offs than just 6 or 12 dB, and they should be dynamic; their tuning should follow the sampling rate, as it is the sampling rate that decides where the first aliased frequency will occur. (As an example, some Atari ST models have a DAC chip which is fed through DMA at any of the four possible sampling rates, and the analog reconstruction filter's cutoff also is chosen based on the sampling rate.) Regardless, this is the hand we have been dealt with, and in order to accurately simulate Amiga 500 audio playback, we thus need to emulate these two filters in addition of producing the right kind of output stream from Paula emulation. No interpolation -- use resampling! ----------------------------------- To properly resample audio, we need to achieve two things, often done simultaneously: * remove all components in the audio stream above some selected frequency, usually about 20 kHz. * decimate the signal by discarding samples until we obtain output at the correct rate. For 44.1 kHz output we need to discard approximately 79 of every 80 samples. Decimation can be safely done only after the lowpass step has been completed. If decimation is done without lowpass filtering, some extra aliasing shall be introduced to the remaining audio. What happens is that all frequencies in the spectrum now alias in the audible range, making the ultrasonic sounds produced by the pulse-wave synthesis to appear as additional noise in the mod playback. Fortunately, the previous paragraph contains the answer to the problem. It is possible to make simulated Paula's output consist of "bandlimited steps", or BLEPs as they are called. The output is done by simulating Paula at 3.55 MHz clock rate and replacing the hard edges of Paula's pulses by BLEPs, which are carefully constructed in such a fashion to not contain those difficult frequencies above 21 kHz or so. Because the input stream does not contain frequencies near or above nyquist frequency of the final sampling rate, all we have to do is to build an abstract version of Paula's output signal that we can evalute to real sample whenever it is needed. The abstract version consists two parts: the output level of "genuine" Paula with hard-edged pulses, and the states of various BLEPs which which are then used to correct the "hard edges" of Paula's waveform to the smooth curves of the BLEPs instead. The mixing of one blep thus has the following procedure, roughly: * adjust the output level of Paula to the new value. * start a new blep, and scale it in such a fashion that its amplitude is the difference between new output level and the old level. If we ask the synthesis function to produce a sample at this moment, it would still report the old level. But as we clock Paula forward, and ask again, the blep gradually changes the output level from the old value to the new value. At some point we are done with the BLEP, and then the output is simply constant at the new output level. This leaves the filters, but they are easy. Because the output is done by mixing bleps, we can implement the analog filters in the bleps themselves, by filtering them with digital models of the analog filters to produce versions of BLEPs that have treble components reduced to match Amiga 500's operation with LED filter on and off. This may seem somewhat miraculous, but this is how it works. The implementation ------------------ We need to compute the blep tables. Firstly we need a function that contains all the frequencies in the world. One such function is called the delta function. We define it as follows: delta(x) = 0 if x != 0 delta(x) = 1 if x = 0. If we low-pass filter the delta, it morphs into a sinc function. sinc function is a special one, it has all the frequencies from 0 to some given cutoff value. The cutoff is determined by the rate the sinc is oscillating in. f(x, rate) = sin(x * pi / rate) / (x * pi / rate) if x != 0 f(0, rate) = 1 if x = 0 With rate = 1.0 the sinc does no filtering at all, and becomes a delta function in effect. If we plot the sinc function by asking the value of sinc at each integer value, it is zero everywhere except 1 at 0. To do no filtering at all is the same as having the cutoff at exactly half of the sampling rate. If the sinc is to remove everything above, say, 21 kHz, rate = 3.55e6 / 21e3 / 2. An ideal sinc filter extends from negative infinity to the positive infinity. Because a practical implementation is needed, the sinc function must be truncated at some point. The truncation affects the width of the stopband of the sinc function -- short functions begin filtering earlier and are not as steeply filtering as long filters. I've found that 2048 point sinc functions are sufficient to perform filtering for Paula, so we'd sample the sinc function from f(-1024, rate) to f(1023, rate) and thus yield 2048 values. Because 2048 point function is quite short, there is an issue at the edges, where the sinc is still oscillating. Some windowing function is needed to smooth the sinc properly at edges to zero. The Hann window, or the raised cosine window is the simplest. It is defined as hann(x, length) = 0.5 - 0.5 * cos(x / length * 2 * pi). For this, the length would be 2048, and the values of x would go from 0 to 2047. The result should look like a symmetric "water-drop" with few small side lobes. If you have some plotting software, you can see the sinc function at this point. gnuplot suffices, you can type something like: set xrange [-1024:1023] plot sin(x * pi / 84) / (x * pi / 84) * (0.5 - 0.5 * cos((x + 1024) / 2048 * 2 * pi)) The sinc table is final mixing frequency independent ----------------------------------------------------- The only things that go into calculating the sinc table are the Paula clock frequency and the frequency of the cutoff. As long as calls to obtaining output occur at rates greater or equal to 44.1 kHz, the table works. With rates below about 20 kHz, the blep table itself will produce aliasing. The function is sampled at Paula clock rate, which is constant; it therefore also has a fixed duration in seconds. For 2048 points, it's 2048 paula ticks or roughly 0.6 milliseconds. From this it follows that at 44.1 kHz sampling frequency, about 25 samples of the table make it into the output. The table must however be longer than merely 25 samples because depending on the phase where the blep starts, ie. paula pulse occurs, it's always different values of the table that need to be chosen, so all of them become used at some point. (However, in truth the table does not need to be that precise, it could well be sampled at a lower frequency without compromising output quality noticeably. Perhaps only about 16 different phase values are needed, but now it has 80 (as many phases as there are clocks between samples).) Filtering the sinc ------------------ The minimum-phase reconstruction is implemented in cepstral domain in the included program. My knowledge of the operations involved is too limited to explain why or how it works, but after we do this, the filter shape changes in such a way that as much as possible of the filter occurs "early on" and the filter "settles" for longer period after an initial large transition. So, before minimum phase reconstruction, the filter is a symmetric waterdrop-like wave, with pre- and postringing at the peak, but after the reconstruction the peak moves to the start of filter, and the filter displays decaying oscillation for most of its duration. The upshot of the reconstruction is that it allows our IIR filters the longest period to settle after the initial excitation by the large part of the peak, thus allowing us to truncate them earlier. There has been some talk that minimum-phase reconstructions are in general better audio filters than linear-phase filters (which are symmetric by the midpoint), because they do not display the preringing that is perceptible to ear if it occurs for too long. The increased postringing is not an issue, as it often occurs in nature, and thus the ear "expects" it. However, the issue is made complicated by the fact that phase relationships are by definition modified by minimum-phase reconstructions. At any case, this choice makes no audible difference in this case, because in both cases the ringing is tuned to occur at frequencies above 20 kHz, and the phase delays are almost linear across the entire audible band. The fixed filter ---------------- We should apply the IIR filters to the sinc function before proceeding to build the band-limited step. The 6 dB/oct filter is an IIR filter that is computed according to the following formula: output(n) = b0 * input(n) + (1 - b0) * output(n - 1) that is, the output is a linear combination of input and the value of output in the last iteration. The b0 determines the cutoff value and is computed as follows: omega = 2 * pi * 5000 / sampling_rate b0 = 1 / (1 + 1 / omega) As a reminder, the cutoff frequency would be 5.0 kHz and sampling rate is 3.55 MHz because we will operate the blep that is "sampled" at 3.55 MHz. The rest of the problem here is just applying the previous formula to filtering the BLEP. Amiga 1200 current leakage simulation ------------------------------------- It seems that Amiga 1200 output response attenuated by some 0.2 - 0.3 dB near 20 kHz. This would seem to be due to the LED filter even though it isn't enabled, because this effect does not manifest when turning the LED filter on. It is difficult to be sure, though, because of limited resolution and the extreme attenuation, noise floor gets very close to signal. Regardless, the effect can be modelled with a 32 kHz lowpass RC filter. A word of caution ----------------- To correctly apply the filter, we first need to extend the sinc we computed by imagining that it is preceded by, say, 10 000 constant values of the first value of the filter, and these are run through the filter to ensure that the filter is properly settled for the base level of the blep. This is especially important if the first value of the sinc is not zero, or if the filter is reused between computations for any reason. Additionally, to validate that the length of the blep is sufficient, it would be helpful to examine how much the IIR filter oscillates at the end of the table by computing the value of filter(last_output_value) - last_output_value If the filter has not yet damped, the difference will not be zero, and depending of the oscillation magnitude, artifacts could be introduced. The LED filter -------------- If no LED filtering emulation is desired, the next BLEP can be left uncomputed. To simulate the LED filter, we clone the previous sinc function for applying the LED filter on. The model for LED filter requires application of a biquad filter that simulates the 2nd order Butterwoth lowpass filter. The formula for biquad is as follows: output(n) = b0 * input(n) + b1 * input(n-1) + b2 * input(n-2) - a1 * output(n - 1) - a2 * output(n - 2) That is, two samples of past input history and two samples of past output history and the current sample are required. The coefficients are derived using bilinear transform in the Python source; feel free to look at the gory details for computing b0, b1, b2, a1 and a2 from there. So, anyway, we should go and filter our copy of the previous sinc function with the biquad formula, and then proceed to figuring out how to convert the filtered sincs to bandlimited steps. The step-function ----------------- Step is our representation of Paula's pulses. We could define it as follows: f(x) = 0 if x < 0 f(x) = 1 if x >= 0 The band-limited step --------------------- Convolution in DSP is the application of a filter in the time domain. It is basically like computing a dot product between two vectors. The other "vector" is the tabularised version of the convolution function, and the other is the sample data around the point we wish to compute convolution at. We would be talking about 2048-dimensional vector here, if vectors were otherwise an appropriate metaphor. In order to bandlimit a step, we can calculate a representation of the step sample stream. We start with the entire sample buffer at zero and calculate the convolution. It is all zero as expected. Then we introduce the edge, or the first sample of the step into the sample buffer. The convolution's value is now equal to the first value in the convolution function. As more samples are introduced, the value of convolution is the sum of the values in the convolution function over the area of the step function. Thus, the bandlimited step is in effect just a numeric integral of the convolution function. We should take care to scale the step accordingly. If you are dealing with 16-bit sample data, you would probably want to scale the step in such a fashion that it starts at, say, 0 and ends at 65536. Or, as I often prefer, it starts at -65536 and ends at 0. This is just to make the blep evaluation code simple. The downside with starting with negative number is that the sign takes 1 byte to encode in the resultant C source. For the example program, the blep resolution is 17 bits and the blep runs from a positive value to zero. Sample code in C (but for mono output) -------------------------------------- /* 131072 to 0, 2048 entries */ #define BLEP_SCALE 17 #define BLEP_SIZE 2048 /* the step function */ int32_t sine_integral[BLEP_SIZE] = { precomputed table }; /* the instantenous value of Paula output */ static int16_t global_output_level; /* count of simultaneous bleps to keep track of */ static unsigned int active_bleps; /* the structure that holds data of bleps */ typedef struct { int16_t level; int16_t age; } blep_state_t; /* place to keep our bleps in. MAX_BLEPS should be defined as a BLEP_SIZE / MINIMUM_EVENT_INTERVAL. For Paula, minimum event interval could be even 1, but it makes sense to limit it to some higher value such as 16. */ static blep_state_t blepstate[MAX_BLEPS]; /* return output simulated as series of bleps */ int16_t output_sample(int filter_table) { int i; int32_t output; output = global_output_level << BLEP_SCALE; for (i = 0; i < active_bleps; i += 1) output -= winsinc_integral[filter_table][blepstate[i].age] * blepstate[i].level; output >>= BLEP_SCALE; if (output < -32768) output = -32768; else if (output > 32767) output = 32767; return output; } In the code where new Paula samples get added to the system, you would so something like this: function input_sample(int16_t sample) { if (sample != global_output_level) { /* Start a new blep: level is the difference, age (or phase) is 0 clocks. */ if (active_bleps > MAX_BLEPS - 1) { fprintf(stderr, "warning: active blep list truncated!\n"); active_bleps = MAX_BLEPS - 1; } /* Make room for new blep */ memmove(&blepstate[1], &blepstate[0], sizeof(blepstate[0]) * active_bleps); /* Update state to account for the new blep */ active_bleps += 1; blepstate[0].age = 0; blepstate[0].level = sample - global_output_level; global_output_level = sample; } } And while no events occur, you would call the clock() function to advance the bleps. void clock(unsigned int cycles) { for (i = 0; i < active_bleps; i += 1) { blepstate[i].age += cycles; if (blepstate[i].age >= BLEP_SIZE) { active_bleps = i; break; } } } This code is not very optimized in that it constantly keeps blepstate as a sorted list. It is possible to implement it more efficiently, for instance by keeping occurence times instead of ages, but that complicates the output sample function. The right optimization of the code might depend on whether periods are small or large compared to sampling intervals. For Paula, periods are typically much larger than sampling intervals, so code like this might be better tradeoff. For modern computers, it takes quite little time, so I leave the optimizing for people who are that way inclined. Typical length of the blep list can be short, only 5-6 entries if the sample rates are low or occur conveniently otherwise. At the maximum, Paula is constantly producing pulse waves but it's probably sensible to limit maximum period to 124 unless Paula DMA fetch starvation is simulated. A typical sequence of events would look like this. Assuming that we sample output at exactly 80 paula clock ticks apart, and that playback period is, say 140, we'd do calls like this: input_sample(samplebuf[0]); clock(80); *output++ = output_sample(); clock(60); input_sample(samplebuf[1]); clock(20); *output++ = output_sample(); clock(80); *output++ = output_sample(); clock(40); input_Sample(samplebuf[2]); ... Results and analysis -------------------- I have hi-fi recordings of Amiga 500 and 1200 playing Sainahi Circles with both LED filter on and off. This analysis was largerly based on the sampling work by pyksy on #amigaexotic at IRCnet. Big thanks to pyksy for his work! In addition, Melkor (kohina board) sent me a hi-fi sampling of his Amiga 4000 playing Sainahi Circles. The results are summarised as number of png pictures that display the simulated and real responses side-by-side and their residual (difference) spectrums. The units are in Hz and dB. There is a constant offset that follows from the fact that the hi-fi samplings used 32-bit floating point samples, whose value range is different from the integer-coded PCM data, yielding the largest part of the difference. The rest is explained by the different recording levels used between setups. The files called a{1200,500,4000}_{on,off}.png shows the simulated response of UADE and real Amiga superimposed. comb{1200,500,4000}_{on,off}.png show the difference between two in dB units. These are the same pictures as before, but with the spectra substracted, allowing for more precise evaluation of the differences between simulated and real output. We can see that UADE and Amiga produce same features closely, thus essentially validating the model used for output synthesis. We can observe a good cutoff starting around 20 kHz and quickly extinguishing response by approximately 23 kHz. This should yield satisfactory results for all sampling frequencies above and including 44.1 kHz. However, I personally recommend 48 kHz as default output frequency because it works without resampling on majority of cards, while 44.1 kHz output often may need a resampling step on either software or hardware. For LED off cases, the residual spectrum is largerly just noise. There is, however a small 0.3 dB boost around 0 to 3 kHz. This can be seen on Amiga 500, but not on Amiga 1200. In both Amiga 500 and Amiga 1200, the LED filter also displayed this boost, and it was compensated for by adjusting the Butterworth filter with a small resonance term. Despite adjustments, the LED filter case is not perfect. The residual spectrum is roughly flat to 3 kHz, thanks to manually fitting the filter, but after that there is some extra attenuation which is then compensated by something else on the analog filter. For Amiga 500 case, the simulation hits noise floor and can not yield anything meaningful above 15 kHz, but those measurements also show the same general pattern. Overall, I think the model yields accuracy to about 0.5 dB for all cases, which should be sufficient for all practical purposes. Especially the Amiga 1200 case seems well modelled. Author ------ Antti S. Lankila feel free to send feedback, comments and spam. milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/0000755000175000017500000000000011317506166026767 5ustar admin2admin2milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/a1200_on.png0000644000175000017500000001127210742655365030726 0ustar admin2admin2‰PNG  IHDR€à,Ö)PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@îî ÀÿÀ €@ €ÿ€@ÿ€ÿÀ`ÀÀ`€À`€€@ÿ€0`€€`@@@@€€€`€``€`€Àÿ`ã°À@À€` À`À`À €€€` €``` @@ @€`€ `€``€€€€@ € €€€    ÐàÀ €€À`€ÀàÀ`ÀÀ€À€`ÿ@ÿ@@€Àÿÿ€`ÿ€€À ÀÀÀÀÿÀÿÿÿÿ€ ÀÀ ÿ``ÿÿ€ÿ €àà àà ÿ ÀÀÀ    ÿ€ € €@ €@€€`À€`ÿ€€ÀÀÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿÿÿ€ÿÿÀT&¼sLIDATxœí –£ õÁýÏ<‚iQä³TÍtÒ¨h¬|d–`:Öõóóy¨ÏG=ã ôžÀŒ¬‚û¶ÿëñÀ#rüsöy–üòÎ¥ËËmßúfÁœÁÓmHÀmiœ,Ýö «a8ƒ§Û˜€¥W‡éAÀFÊv_ï¥Þ‰_ÜþÎ)V–ã×ÎÿµêÔŸ­;?Ïáe3L0ËÙ ªðéïÕ¢¿°òL-s]ƒu_þ(Y^id@À±11h"’/‹­o‘@À0’¹mz[XÖåoÃ}9^ó¶’U“œ>`ÑÕ!AhÂáUlI`å~¼n3¬ÇÝ8š·âV®´•Þ{ɸ§þ"<Ú‡Ö³Õ!&´dõŒú:é^pø‹õ(_OW7–a¯­‘z/hÞK'‘ÜÁ°„¼øÄ@ Þ¼²«wxž–ÓJ¾k›X® øçÖL5ÞÄOv‘d­`¸WQá­º»b‘Õ¥ðëÇ¢¯qTíuT~ùgȯmÛ7¯çU¥›N îÒñÚê­—™ÉÝõl ÷ðØ—=í0(û‹œíÄÃ8§€K¬ÀññÇz„ç">[g"¹•ã½õx Wÿ²Òßtê$ÿÚÝäÆÂ¯[Fâ›å¼_½ýÝH½¨ÿ"<€ïcÊ¡SöÕÿþÇg;:3‰§c¹cc~Ð cæâÛwMÀ0>ÅG’ØÝŸX ðdw@©ïR°0‡ð»è“ =ò6ôk›Ñ‚A@KÐÛþ—!Zv¿L~‹ÂE’_°´€·ýCÀwšüOÝþZ2¹º—ÄêGêïýëKt«‚oVêé¸ôüJèû ‰€7HeÁ^Ã=  PÀÄ"É'/ ®¦ÎRðcWðâ’(„œ$”Œ€a )º– ñŠ=zñÖ©¸½f‰Õ%ëóŒÎS~ZÉÕl1ØÆÕíd§Wb·íˆ®Þ"tj‹AQDA@AQ ¨þ^à”Çê¿8AQž ¨4ð€§jB <AQDA@A”çmÁ( pŸ½apQDÉ0¼ùXá>×L(± czA¸œ†ŒÓ—z2–å4dgÁëºxyðdÈå`­鵂 ¸Vˆ€ NÂXI@òà@@%£bsìÕ08íUDïp³ð 4- ýSǧaGzDiYÀO{%‘ÁiZÀ…¢ðð´. "ƒƒ€ Jû’MóǦ #Ó¾€„À¡éA@BàÀt !pdº8.¢ô yðÀ ˆÒ‡€äÁ€ J’ ‚(H<*¢ô! Kgr£ðhô$ býñèD@7h/·iŽF?.  ?"ݸ¸¹”j¥UèEÀÏ( æ¹ZŠPƒ~tÏÌà0ÝèØ&±1TOÊÓ€6/þ<`àt( u™!èOÀ €žÄÀ@@¥k1°Dé[@ÚEº§w ƒ€ Jçb`ï ˆÒ»€Ø9£ˆ†’oPµù‚/¢•¹aIz?àÙU›1ý*۴ŠɅ;¥·~YJc`ŸÜÐËƒ× C–Bo1°7nÙ³nî•Ý£›henšÃÀþ ^\“0vÈHR'Ø!ýWÃø``wt_@&Üc HìŽÑ´!†‘^L@Ó0·ýHï \b8÷èGì‚Ñ´c¸mÃw `Œ' ¶ƒ n Jï üÅpZõÌó& ¶Ì€˜žZØ2C ¸H‰¸i†\¸mÆp eÙ2ƒ ¸õU¥·tÃÌ MÄ 3º€¶b:›ax ¡ŠF’f˜Q@Ê% 1‰€¾Ÿ[8b¿¦pÙûiÙ;˜0° fÐõÓRØÓhû((uL:gÁDIæpë%¨—/é¬ ÊL~Ðû°æÚÖÆ0®‘(³ è«oo¡H,Êtèã ŘXÀ£ç>Ê1µ€Ú»"Ä@f0€9—d@@Ëÿ" APtP#:è!#îP(z``}Ð냀>XôAÀê `Ö°6‚•AÀÚC*ƒ€šáܪ‚€Ûý›X Œù¹¬Æ0œ[Uð MY¸"˜‚X LB¬EŽAfžà–ç .!°ñšœ1½<„ÀJ\7h]f+qÁ u]à÷yðòà5ÈG‚Lø}.Ú ¸N·&|ìBÈ,Y°¹UßÏÁÀ dBlNB»)_Qð&ø#! ÞËÀýK7AÀRÐOáX ¼–ƒŠé `97@À‚óAÀ‚óAÀ’0¤[6XÛ(¢L±ôÞtÅ6ù0ðX–½qxY܈20¹¦øZ›öá_Ù×§Ÿ_Aï»iî­Ã<óÇäu7øî‚Ð<â-ÊÞ`ü –Sˆ€/²]êH@+ä6öªÚî-A@±Õg`M¹Jj;ñÇš|ýÉu]N«ô.à>ìÛÔ!_Ǹæ†T0&ݰƒ(µúØšA'žVqÞ;sŒ€ïã:[êP:µÀ” `=\©CÇÊÍœ#`=öȧuü†ÀÞ4ÖC«³‹¾½Ã|&"`=´:»Øs•ÕÞ]Œ€9-lhÓqFOxw1Vä¼´k+«'ó ›@O[-a(x¢ù‚+âŒçªÌ™°zû™hÆt!æ ØS…À ­ëžë½8*T "àÀ¸<¸å¬ÆŽ'£Z®˜AÀ‘Ѧ4âòbcb[3ŽŒvaÛAŽ6#¿û³J‚€sðqNéÃÄf@ÀIÐKp#‰ÜŽD à$h¥Ñ?þçAøM„¬Ó·‰‚™/xö‰t‹qÞŒéÿ˜1} ôñ$Z3˜gƒ:*¨•™G† ­«ÉuÝãâåÁk!CG¨£^Zªî¢=뱜µ8AÍ T $ CóR©†‹LQ˜ŠhØ‘PÁ£¾ªº>Õ D@¨m Bˆª[A@ˆ©¾Ñvœ/ßKŒ€ðòF›~y”7„›t¶« ‚öfâW D@8Åv—6̼”Â9ÚÜ3ò?Voˆ€ðƒ­$òêlœ?°U‚nJØ@@øÅa]jÄi¥ON‡€ð O¯ïa.U¼È ®¢Ý=ta B-̽Ä:Š|¡™>" ä Í «ÚÍ5Ù)3avžù|fÁ±˜?mYÄØ—e Â#<ÄÐ>9" Gg€€P" ˆ‚€ KF5By\Mõ…ûJ^`«Ü«dÔi¿~…€ð®jzYN+?]^E©C¯w„×Q~[ñ‘Û_êa ""Buü~Ô¢ ˆ‚€ ‚(¢ ˆ‚€ ‚(¢ ˆ‚€ ‚( (&>,º}3[uó{>ZK·-×ffLö|´–nS®È l]M®kìÛþ¯á{·¹,àîàº\Y  ,¡‡ ˆòU 0UËÄ®êÜ&>½™¬KüìéÅtŽùב¶VR·VЦt´ V©˜tŸ|"ÑWÓ>Ò=Kþ­tÏ´¹ZàÚ®.ÁzŸÉº¬"îéÖ>æÞ¬“ý.ñÓËɦ}7íHüšÇ|–bÝó}ú]Î>—w“\ÎOÆËÚ_ª³»è”ø°3©’r™,8°vºÝdÁwHè3°~ºëbOs.u‹å5?ëA^L[*]¹„*ñÈ‘)àÚ²,âIEND®B`‚milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/comb500_on.png0000644000175000017500000001154010742655365031346 0ustar admin2admin2‰PNG  IHDR€à,Ö)PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@îî ÀÿÀ €@ €ÿ€@ÿ€ÿÀ`ÀÀ`€À`€€@ÿ€0`€€`@@@@€€€`€``€`€Àÿ`ã°À@À€` À`À`À €€€` €``` @@ @€`€ `€``€€€€@ € €€€    ÐàÀ €€À`€ÀàÀ`ÀÀ€À€`ÿ@ÿ@@€Àÿÿ€`ÿ€€À ÀÀÀÀÿÀÿÿÿÿ€ ÀÀ ÿ``ÿÿ€ÿ €àà àà ÿ ÀÀÀ    ÿ€ € €@ €@€€`À€`ÿ€€ÀÀÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿÿÿ€ÿÿÀT&¼sòIDATxœí‰–£ õñÿÿ¼;3 "W+V½Õi+ h̲|™õ?ûœnNà‹üX÷gÞŠ€0žCÀA]Àÿ‡€+ÀmÊ \7ù,뜮J­›üÍyï®ÿ hIŒ€_L®´q«êCÀwçý¥»~Ö|øî¼¿z×;ƒO€€nO>|OzÇ_¸Hån®!©Ì§7µã&ÖVW­Ø%,9†ÒJFïý·í\&cDÂ]á</ð¸Œ`K&mBÌ ·°b4¥4a÷`ã(¯Dìu²{¬-w¯"Üð2Úoâõ¬½…ɶЛA!6ଂÏö9ìn7¶«sجŠÍy„^¬-I@7/ç2;PeŠù´öhYU7‘ŽÉ¹+Ö­çîy:J=Ú¸&œGÁ·Ä=$þA³Ž““nuïÏÉzNÄtöR[21ÿÑ|ŠÁ‚6Ô~|¤Î}p?Y‹Ù\áfùê˜Üáݺ×vV»ðºw€„Éâ/ ÜÞ°ìËЭŸü]ò™ ¶lÕ¢»g‘UöbYÏ…Ô€Í*&©²óŠÛ6Ák“ìÙHèÈ AíR@çû#å­{œŠw7±'`±xЫƒšeYìC)c"¦³b[ *3•.²ò¹cç+qržz:©Ú 5ÁG‹cW"îy+ ¸Š{¸¼nŽ·ŠÚ®»üƒ–·—<Ø#wÝãÿs³Ö>È«ø©+ýCÀln²¸*ÓU`'FnœÛ˳(ÓéY,Ì|€fzMp\G AÀ›¾œ«{ /ç€pMu ø»6B!­šà£Ñ=þC@¸&â_ù0Œ8(S‘A˜az£ÜáôAƘööÓaqÿ€€  ‚Ò]Ð6]A@PE¼ß¡'æïFè8=A@PAù›H=0ça<ªXωÞó B6뮆¡º°7»* ¨â˜¡ª˜Ø³ˆ:€€  ‚*æpð „¶˜óa@@ÌÞê" ¨`ª÷B>õ_@@ÈÇX@@ÈA•ú¯ dst@4@@PA•G ¸þçœTƒ7p^‡{€€?ÚýÿÛ&•ÁàôýCÀ¯á " ô"æ–-àüCÀYå2æüB’Qz$ªNŠ,àÕ ãAÀ9‘9þélpNfpýÏ99—/ð1L(àgÿÿ¶‰µ°$tFðþÕ èÔ‡móÅÈc,S¸Ï _GÐãÞôe=O½åÇ\«œA%òeާ øÃ=gÜ ÏZX ú1£€Ö9àñÚo‚g ‰Üiðn·ñ—}àE”iŸ?(aNý”aR|Ÿ°w0(Gð‰þ!àŒ·Û?äM¤¯üš‡Ü€€ó!hžrtN‡ôØ„a ¨"={ÒÄîT§#&à#ýCÀùü„A@‚'à>ˆ€0ï7@Ž!h„!¸žý_„xàž;óΆ+ Y;óΆ#›yp÷㜠¾@@‚*O¶MgA‡§<÷þ8 ˆ€ª ª‚€¨‰yÁ˜‹Î" *æÉ÷¼ÄAÀY@@TPD@U5yö÷qpœï½œl n±É÷6ÿp°u0H⛆€­ƒAì ’xߵ܆`^ç¾ß5l Rˆ>û+è2øNüÓ=l RDTÉKøN°{0HàßwðBó6ð• `ÿ`Àjq_yÖ ¾’S@ƒ€‚½· 8¿„¾?õ­Ø!æ øæÂAÀ·!”Ä› ßöv%à«[™¶LVÏÐxÓp…ÉŠ½‚ÉJâã\ ZLVOp¶Ž^-îÎOVø|Ìb· “•Ä3¾÷?Y¹ßa;1±^LD[KKS8C³•>ÌÖB@ñÎ,DÀœ`ÍôÊùÝ·¼Õ‚€ÙÁâÉ鄘ÂQo¶r#àÕ( ¦@Àì`‘Ò¹<ƒCÀAm*ž* ›Ì &ϵ>ÆšA@Ì&4®'¬²Ï  æ“Š'ZnF˜õ4þâ‚€ùÁ„â‰÷ÝŒ<‡€˜¬€Nq[ÿOWòÙ=´‰è-`büþDÀÂùÉDè h–vg¾¢Ïå„ÿ9'Û²†n§<ˆ€rºõ÷o›ì £ %—# õ+àóý×û…€b:QÀ €ÇÎ%¸DöË=fæ+…J÷Ù}¡YÝ€I…êñsÊ·iÄœ¬Vç®0±sx¯Ì0>’ó~>-à5½`·ý]† 8Ãá¥r´D@1ÝyhóJHk¶–  ,•»å„럃v3~G@û¼ÎzÓxžž ¾ÿxÈýŠˆ€3ìp@ãï× è¯p† UÜ—– ø~cÊ%÷úÝè* _vÁç:KÀp¥c|ð^* Tnîìm…k=û<Ä]Œ€…Áœ2ºpÙiENrv„—°ôƒˆËûZå›ÎHc c½!ÌI>!`úôøe;tŸžÆZ\W”hgv~ã½+,f¶%tžw—0ú\2A@¹By.IMx‚<#*gD+Öo0ɪ@::O0•g³>, f]=K¸ Pó&¶íš'Ü{ûÄTk: vˆ­ª±‘€âFÂHŠ1_À£ñ@Àª`’c‡‘b«Ò_ÀßMëÉÄfCß?[ðv°Í1oHØPìN„½“P¶<·í".7߆ÄëðTÏ9O±—M̨‡”§Œ&Ih¢ËdÛíZ5ú_ósÞ²gÎWÆYÛ{‚€‘ 7»«F s_À{3Þ_©¦º€íÚ¹¤€Â¯?93g÷oÜz½º!XG:-tÈŠ40Öÿqf"¹Š|8°U°SÀì2Í1)C@A[ÿíž~yÙËpÊ[P]F x熩¬ª,ÔëIÁ-ƒl¦l’±'3\ÀšPªøÂ¹{Þ饑*÷ðÔW¸¹"ñ@ÀfÁ :t1]–b£N·8醛,(›ix²€‘0ÖDœ{ €ÖF¬“Âdʯð6ƒ£÷Bƒ6SÐD_X ZU΢üv·ÃHk"à€`Í Ù;za¿$G@å±…ññ¾o0öäFxÙ[@/Û¾{søÇû±³88ìÁÚÁÚvý£T‹o?wÿ(`§2EsLëÃ`0.<“,ÍH¦€&òÆç˜FÀà´0!  ßÝ_W¨ l0~6:Oøè¥)Î¥P™&b!àÆÄ o(D0–ÍËÜÇú7Y `÷`£ô¿Qb½gç?+y\Àëìû~ש[Ì"`pæÕVÀŒ¶¹C¿ú L.`°Mã$0~)Iê ™+ÃÎû x–€ÞÛFø/± ag°ˆÜÜ’›MñIAÇDì¤:’]\,b°äJÀðIÌçXÌ•€QI¼ÇÄÊãp¶E7ôZ씀ø—Ë—ŒDêN_@©­FÀ"&Pö%càDJ³HF0Y;B”av¼à.~å¶@@ëì0KÀÅ,Ám5 ÞcVïoÌu)2æâöFdË6ÿUðLu[@{M,c €-·äEÇäJ¶æwŠ…™â_6 *ÎË]nÌfÃДÏïä@,1Åêörˆ‚€ñ˜û3…€Â¶š(œßI¡ýfo€€©‚€BäpسAÀhŒC@±×ë.¹ZbÌ)`‹Å·†€¥Œp(-\p˜ €ÝAÀë8×b\1xç:3©€­@ÀÞ `’L¡L‚€½AÀ$ØL#Ü~-AÀ4ØLÃ÷;:ƒ€poU_ðì ^Áu¶® àØ¼{‚€  ‚*ª ¨‚€  ‚*ª ¨‚€  ‚*ª´tf­ V™ÕäoÎûkv}]ÿ ³=[×}é‚€ßL>lã?zýý­îBùEϬ€lÔð›àca-ðÞpí1þ ˆÚu‰ÝîtIç:ì”ç'¯ÛzMêýÎŽÂM’/……§›÷dÜÛÉ÷KÌÒ$7Byòº­×¤>¯*Eh’|),<ݼ§k¸Ö ËD×¼o÷t”Fh“¼°ð¬ÇòÐ1ï©ÈëRVþmy &wÒ–%?FÕË“—¦ÞB˜4+±BMòÒÂ[÷Ö²lï÷×½×½WëF2ù0d%ŽÅîÉ«Rï±0ÂzTaE…·ë_¶õºÔµÉ“qï§>>‹Û‡Ñšd¥®n‚Ë“W¥vÂíg±Þ®YáµÈ{]ÑGãÞN}|’Ëóñ]Ë ïXa&—’>ôzœJÊ»‘j’×”§Nîöu„£î*+¼=ÝRTxmò^Yôåü.R.Æ0Ó¨IEND®B`‚milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/comb1200_off.png0000644000175000017500000001406510742655365031567 0ustar admin2admin2‰PNG  IHDR€à,Ö)PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@îî ÀÿÀ €@ €ÿ€@ÿ€ÿÀ`ÀÀ`€À`€€@ÿ€0`€€`@@@@€€€`€``€`€Àÿ`ã°À@À€` À`À`À €€€` €``` @@ @€`€ `€``€€€€@ € €€€    ÐàÀ €€À`€ÀàÀ`ÀÀ€À€`ÿ@ÿ@@€Àÿÿ€`ÿ€€À ÀÀÀÀÿÀÿÿÿÿ€ ÀÀ ÿ``ÿÿ€ÿ €àà àà ÿ ÀÀÀ    ÿ€ € €@ €@€€`À€`ÿ€€ÀÀÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿÿÿ€ÿÿÀT&¼sÇIDATxœí݉’¬(…a ßÿ§ï” $ ² è"¦ ᬥ{n/ !„B!„B!„BÈ·²þåwùïúÚvÝ#¤]~úΛ‹¸EHÛ\ uœÉc9­Y»+!ÉIð·[“} €ùºÿu/êÝ·ûÌsŸe×8êàÙõàÁìÄÀ¹ç>Í®ï/ØçÁý^µÄ…)»w\áÆça’šªf¦ø÷äñž®õfêߨÏp/ ëñ×]×Ю„v¾S󽽿_‚×>jÞoÜßüÆ­¼x—l¿{Q¿ŠØKÛ#Øí®ïÄòZsqÄà›îùµ1_ µc $¬úõ¹Íøàf_é=TrN“¼£ÿ›Ëÿý¯3­rµ7±ç)70+¿çïª=›¯Ïüæ‹íj(ûã˜Uó,½#¬Vi ü¤'f»Ý•3§:kcÿ–ÕjzMÉxŽÈIس>z»gõ¨wói€‹$p­»äay˜Œ##týßÈ=Qü6®×•쮼ê‡Z?m†gíH߯l@æ=ç ví‘3C£òv{Êž“•ÙÚÁdµã=``Àëm¢ùˆ˜í€~%î¹Ëh¹,æAvÝÙvZÚÝ¥‡s¤Õ”/ŒÙe>zÛŒ´2ï ½mFZ™×f¬Ïzü\¾0ê¤Àg@_#>úð‘Ð×€€¾F|$c­3ëe’ÙµÎãÜ–¡&#“Ìþƒ£Þuð¡Ð×h¨…ÉÈ$³Ÿ ýgÍíwÅ8Rf¨üÛýê‡üþÌPúà/ÌHòKðb´þ·ïoÞp¤Œ0íO,«ž]üÁyO×h€£¬L^˜‘b€/Áq{ À‡2;ÀÃÛé€{˜‘ô÷€çAG"{Ï *c½ÙÎÿ"ZyûÀò€ñÅ>p¤éû§@o«‘&#Ìëe€ƒ­3ë€`½0#¬f€õ2@ÿWBƒ­3ë€y`äÇþÁ&#ÌÈ07ãÒûðÐêû5^Éè6[±®ë Àœ°Z˜VËçf`µŒÐ;ê1*O_¦€W¾p¼ò$ÀžÇ€9X-7ßd>^àóÙü ž·ì3#Éè¶Ÿ œéó3Ú×€GRzW¯!ÀZc&€M¦@#ÐÈàó~‰Jé3 À €VjŒ“•eécõYÖ8§S{€‘ozX+´38ÀÀ‹ÕM7Ï&&€KÖÊÐ[:-/˜¾¹Ý>Ãü=¸' F¢ÀÈÙ¹ýî¶û¸íðál¿Éu˜S´.@m tÎU °Ãÿª™°Æ,_P]=ƧÀ¼] .€ñÉXã·8ÞP½W Ðßû•CíèI{€“#8@m±'Xe–C¼›|FʇÏnjУ¼ûTV ^" Ûg0€ž¨ç}·ý…p€¾uK÷Í£vÎ÷Öç÷£)ûÔdÝ Ã÷‹þÖ÷)€Wͪ¾`ä!npS€û†ï0>´ÀÔÚ¥ÉXašè{» @Zàñ{ê²ëƒkB Ö •Qßð¸Àà}`@šgs]€Þ)?0T €V(®‘÷ÜÞpó $€öƒ¾uK=U¸9÷z U =‚uåŸHø¾ö!Ä) Ðì¯ãà&n PNòº ÀÐýM;Ü3ÜR†ˆO9@óÑY®ù]®«ØxÜà~c~€ÚλyÀŸ¾ó¦³qy9@«I@eÔûÁîö7y?ÀuuØo}  rR4o0ªSòKðb/Áë* f\äñVÎ7*ZÎðOKÎPkr| {Ã?Át€ËfL€z§ÖcO1tgu»t›3¡€ÛÙ) PÝ:3À´Bo'Ʊ*#Õ¨Ô ó=€ÇÛ½óà~/ü5Ìå¢W¨œíiä Ço÷i €æØù_D;7Z¼Žôך›èÉ«:‡Llœ » çÍd€Ê:0PÉj0@Ïÿ._ Ò€ÞL ÐýÅ&u ¯c]€ç Íp“Ã0<1}ìIªkö8À?(47P+Õ v¸˜Ð€Ö ÿ,}Ã͆Á$ô,Û]<cþ3z†kàô¡Ü(¨þO¨& `“3 ožö‹ ¨tŠè,ºo«g!@µt@eôáîsà˜íþFw ²»¼O€žÓÇ[ê/ÌrboèËÍ®Ñ5z àÕ €žiÌ PÝ–P;Ô'ë[Ñ@·¨q+ m€ž“Òr»{ï(.¾ð¾õcmоŒ‹ï“:ï–½2Àóö¦´½.h´`S€6ª]¿pwòê{À«ÿ[:GO]³:õ™P¶ Óëååèctö€3ÜôáÂoÀ4(ÿmv¨Í% ~^´6·¨î”^xsïÙ€J) öôÕ³ñ”§èÌ€Ú–gnN{åqÏ\T€öýW´úG4Y¼ ¬иÿ€ac©7¹S ;™/Üî pó<üB€né74çó:€Ægý:ÏO¨ðMFèÙ˧j]2ÚµsгæÇʳÔÛ†—ë ûŒý0À „ñZƒ:]¿ðxG5Àk‡zôÔy3úÀÏИé7å–œ“ïáÉŠã>@m¤Oδ[µ¨Ÿ‚Âݵ˸©#9Ëøn€Ú£û¾‰Ý´Š Pö @kRÓ4v©!@Ý2Í^ó˜ ç9;0@Ͼ»Çú~î\­–-)•u™ V €JT€Îþph€òz-˜ñœÝ#3)@ãPÞŒ£Y \){%x7)àÿ x1=6}  Ùª@û8€r¿è µÒvcùçX1ÔJ{&`(X ;)î“wŸ›×Ã*@_ÑT€›³9 ú`@µš»}€Ú$6¹l lu[…K?ð^)@gøÖ·«ß[*†œbUšÍăãÔWâ˯ÉÔ¨=®”þ*@ýô«PÖ‘Jj³—§:À0;}^Û;”mðè@z&ÀÜ$<èMÐÙ8 @kf:@Ïbz«z …g¿÷TÑ-ÖNyZ(ÃÛí¶ë‘2€QÇòa€1ÏBCøJ€…ÿ2@ß 4‡Wn][¨Ïð!€rå( v PmYp3ï¨Ö¸þåw¹®bãqg€ÞÊðv;z3ÀŸ¾ó¦³q™  ó~.×">P‚’ hç²f\um`ûÚ Ð³ã}^‡åq€×«íºŠíF û_¼lÐe+н÷=€qK%GõtgøKÆÐîÓú= ü§úTg›0ôŒ²¶ôè;ç€î“7÷ ¨´ï¼ û+bqØàAN;Î ð<Ò¨½ v7»£ë“p;»g<ÞžoÝ/e¾Ð)ù€Öþ{«n¿c– p±ßà”|­¼}”=“²g2@sYÞ00—î·¥íOBê´+<00L=€b¿”áÚôŒ{pßåÔŸ³öí8€îp<®ýsRŠUÑ— €á| w܉ú޾ºKçdšLZýAJaâ~w€Û@­ªè°§ ¯½g¨#uG¼wõê¾™ÝÏkQšsš òäT×€ý:ø&€vÖK€v…'J›«îé«þ¾%•7Ïr0jÞçtnKW(g«öN¸¹›³jÀcq•-¿ ¶04û¹OQßÚz§u\Eô}ÚïpcŠ›æÜ¶cJnÞ Ð÷Š%îô­­gZ×U 1ª·Õ`àÞ@ÿ©sSžsT&eÎí›Ýîf§‰ëì75€ÆP4§s[:`ZêÔÖ¬ @}j ±{üè5˜¶úo˜2¯8€·[è¬i+€ú¯(Èé͇ghîîžßÎtn»5‡(ö€î¤® C ?À}lPkX`hxNÐtqÖe^€JÍ®­O|ÕÊýÉh¬Ìç*ÿ{yRž¨ŒV0g"JÇz­ò£tV!àYµ@E À Ô—:} ;©ýÞÿsSÍncm ÜÄÖ 5Œ¨nÍøi€æ{¯;€ú¢]hÝϘ51 ånp+ç(wd`€7…¾0í# RùQ€ÚwWLÌ'zÚ´xšGЕñ»À+€öí<€J»Ï¿_þÉÿ•AåmÚ½—Á&øï²Àc¡Œš´'ûÀ@˜9ÒòN€âÕÖÙÀ@¦hõ› i*€Z½~ €¾ÿíUo[2’U€ù9‹°,Û\E•¢™ÈY¼àyOK€úâi³x@³œ=Å´:¢Ò³•½hðj2?@Ï¡¼öô˜*ݱ•Û4{ï—Êk“À¬ŽËw `°2ÅÓêœÆèÙ=ŠÒ¼K@ßîP”vºbh ` @ïý2 \ÆE`„úNŽv«ˆ17q}Ü.¸èk§6íМ—h€Û@1 ¹ROôŸ=bë°0ýEóÌ™ðÚ @&€¹e”ýEóÌ™| öL–é ð* À6ÿ¿à}qП—ÜÏ´7{áîÖ™‰¬SpSZ¼ ¶`¸Y÷Jg"뤵¦Àü< P6+@{FßX(BÖà׿ü.×ÕÜjÜV°¶(Ós'wmà"îÃúΛçV¾`rÍÆMž3 ƒ €áAüí–¸œ/½¦9àõêœГyÖúöínÚ­šGæ €âÝÜMÎ3 Ý'ó ‘¼)°(üwÀûÚžo[ð§¼ÇŒÝï¼o©5û Àã=à ÏýR滋àvÝ´GH¬Ó ˆòö€Ùƒt׺d*óTÒà&¶M0oÀìQX#Ì%nWõV¼Z0µ¶¿]É(¬‘×ÔÏ7‡’A>ð· €÷Å'Xowß0zoè4| Y€7휪oèÝ @Y €iƒ°FbÆï #‡©ðïEþ-U`°wI…Š+ÝS)óòÀ¢UšU•›Ñ7ã¶R¢À„}™`ñ ¬æÀ*`î ¬’Ê#Û€{êŒm À)î[˜Z»~X+Ìdh€Å?ÃÀ¼p`T3ÖNc€Ç††¥ ó**Œíßb†,Xíˆp™ ü€¡AX%÷“öå3‹þe^`þ Eý'xÜ`ríá@µØkŽî€gØ%3<ÀÛÚÌéü1€Þ3|a¦Xöïcú«:7Rú°J¸0¦Tun¤t`•pÉ(n0/\Ó € ª:7r:/Ý.|*T‹½à¿Bl[€÷íš! cÚ°aUÞ·`ê¼oÀ†Ux߀ «Î ÐÛ€Å2Æ€m«––®!ûÕ®–¶Ë«‡~añY€ÍVêÛÛ€±`“06lÆ€MÀذI›¶¿ê€Ñi‰¤Í¯Ú͑ͺ**ÀüÚßÍØ×¿ü.×³Æ ~9Cüé;oÞàt™àå€ïJ5€¡wÒ…/Á‹ Ð|=–s8/ª€mÒ`ÈË]Î3 Y3à«2ô€ïÏ­S(_•¡ïøÞŒ 0µ§ #À6`dØ&Œ Û€‘`›02l“zGùu¬FNØ&ŒÍ—k´a6ã²J)-$¾06lÆ€MÀذI*ôçÕýz~uv€ÄF€mÀȰM¶ #À6`dØ&Œ ÛäUÿíç #À6`dØ&$]@Ò5$]@Ò5$]ó6€ø›,-xp€ÄŸ^µHü é’® é’® é’® é’® é’® é›ö €$’® é’® é’®y@üÍ’®iÐH é’® é’® àú—ëÊÞQ €3f €ÿ ýý·_ÙcŠpÆŒ ÐÙS €3f €û«íj¿èŠóáºz pÆ4=hA/Jkå%Ø®Áðuè ¨\x &%Éx^ä'ûkíK’Ôä­¼} I ? !]@Ò5$]@Ò5þ¡BdHº€¤kHº€¤kHº€¤kHº€¤kHº€¤kžHˆ’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’® é’®©if-+V8•®Ýgžû4»¾®ÿ Û¯ìûí§¦2\÷™ç>Ë®ÿãõ÷ß~eo¼î<2•ñºÏ<÷YvÝèl¼î<2•ñºÏ<÷ivý÷j»†^‚ IM‚¿»—`B€¤k$Àó€ä‘ì/Øê!Ox„B!„ÞÉúH\þáúøMN÷²ÑKzÿeW¨Ò}É\¼¾sÖMîn½¨~Û}[!¿{Ùè%½õάP¥û’¹x}ç*ÜàZ Ð7‰¦sß«#·Bg î›Cù‡*¯KÞ ô7òê\¥ôÍë¾ÿ8¼¤{nïã(¸]£*œ Jºç.Þz¼Zæíý1xÉÒëuåokEwÓCTgÿQlÞ½¨÷q3+¬ç),kñþy£—õ.í¬›Þû|.îOFã*ªwñKp~÷¢ÞöQH®p-[Öâüó¯ÆÜË–Þ[7¹÷ùLΟÇwæ/ÞÙàM—œÏÐëùVâ|R¦V*é^ö]@~ïànßW8Ï]y‹wô[²¯ÎÜ —žB!„B!„BÉÏÐt‰¬aŧ}IEND®B`‚milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/a4000_off.png0000644000175000017500000001146310742655365031067 0ustar admin2admin2‰PNG  IHDR€à,Ö)PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@îî ÀÿÀ €@ €ÿ€@ÿ€ÿÀ`ÀÀ`€À`€€@ÿ€0`€€`@@@@€€€`€``€`€Àÿ`ã°À@À€` À`À`À €€€` €``` @@ @€`€ `€``€€€€@ € €€€    ÐàÀ €€À`€ÀàÀ`ÀÀ€À€`ÿ@ÿ@@€Àÿÿ€`ÿ€€À ÀÀÀÀÿÀÿÿÿÿ€ ÀÀ ÿ``ÿÿ€ÿ €àà àà ÿ ÀÀÀ    ÿ€ € €@ €@€€`À€`ÿ€€ÀÀÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿÿÿ€ÿÿÀT&¼sÅIDATxœí‰v¤ õáÿóîÈáA¤ªÞnL2 sTA¤§ `0æY]·fP +Þúßlj¡¥C@cN èµÁ3@&éÎ:úÍ^ …TÛ~µéº¯HµU‹ßÎ'¤ÚêÅ›Û6ÜAóÝç{Cµª-S<ÝaÈ¥ zs»Çމi/ ~b[™}õþ:4ï°WJ“Ëï¶€I x§Páæð™…E‡û¹¶Jº€Gû¤|þshÖée¯¿yöŒ°\×ÎHþÅ'/ZMÞ.Ñà„/‚-Ó+ÁþöRÀ­"W¾ÿ+,u$ùèu?;¼h)£šàˆ- ¬ô¤ŠǶ2}å¶ËX6zwŒ=Îí?èÿMì_†ú‹ðE?~ÛÊ•24±%óÞ5ûi{Áñd•yó$œ\ùñ_Âä?8ÅAòÉë~Z@ÁRFæ¤IŒâZ ^Ôöz]•y¢£ È•€QtܵËÓä«yД†QõÐÊnUìÚóG/üÑÑeKš£&xœ™¼~Š÷Ó´=>í²?¯ô 7ÑU®ø í¯!8}øÙ#`$}Ξ¸I¥œ—þnƒ€ ð|°£\)¥A@A”Á¼êµÝ;mºêØàùçø•›y¢Žâî°Ë ´í<ø÷/ï>øãQïòàèpLä°òp%á5¹Þìi××@‚ç÷x<ƒïp÷í֦ݸÜáÞ‡ÊívÉû¼õs_w‘ö`cv‰žçÑží;LÃ&‹b‚?7ù £ÿ …#cÛQ”›£ŠŽ<tsùÇDÎç뽰)|†ÓvwíV“ÿ„»„®þ2|_rSÀ)6Á½ý±%áÛZa0CÔÑfv›ð¸ëV/®,ÜãìéîL7ïÏ-¨ãà/Ëzï½òSPÏòá 8úp’iMÀðAüŸ\ôÉlÜ~®0?hyV–¿òøt/œLX _àÉ.öù|‡Ï‘˜Âa|Šƒ]ôÎú lïvôñ†>÷ø¡… ¾ú qiöð¢Bwš¸«ê Ÿ>µ{ `$`w!ešüÏz'ÒýMx\ìÃV…wÀ.øìª=~ºþ¾ÎʰÂ`ãN=w‡Ÿüµ"`GMpØ\nBØ™˜¶Ç§£]7ÓñfŽwÙ­[<ÿcÞ¿ÑÑܽ°pßí««=¨ïh¯žóW”ÿQdY¾”Ïô~†ŸS©ã|¤AwËI®¯Ä\ËùP)ß O§OÒÂKA@AQDA@AQDA@AQDA@AQDA@AQDA@A”´;`½MpËB& êø7ëÇëK^0÷Õ –‹\Î8'· ž£uâ–ï߃_#uQ“PÀ™ÏyžSHÀEa äÐ —Ñ ‡aB dQh !QDA@¥€jZT‘’`0D)& m0äPn> B¢ ˆ‚€ ‚(¢ ˆRP@F¢!QD)¸2'‚(¢ ˆ‚€ ‚(¢ ˆ‚€ JI¹É ˆ‚€ ‚(%Ó4Ð dDA@AQDA@¥¨€ B*¢ ˆ‚€ JÑŒéôB QDA@A”²Ò †DÒV›DÁa¾`½A@H%AÀÙO•eLׄT2¦OÅIn‚Wùf»ÙÑ?Ð æà<îÎþú OBûˆÙ" $’O›`„T ÈI ¤‘Ð 1-öÅ0 B*E¢R)+ '‚(¢”“@H¢°€„@HAQD)- Â@H¡´€„@HAQŠ ¨OÑîñ–€·@@¥¸€kë»(†cào ÈY Üâ%‘†{”ðgÞO@b Ü ¼€“wxEÀU=B Üà=ýh¿eÂ4D¼  ²ƒ€NÀÅÈð D¼ à¤lœ³ºý×OéÑB „¼" ýfñ¶æ?!^Pym±A@xC@Ç⾪e „ï èÍÍ2b ¼+ ïÜÂLAØó²€ÞUaµµÇ8o 8-vìO¹@ˆ`y]ÀÝÌÀeQþð ŒÍëNñÐó²]%æºTp‡Úú&L˜õ¨4óöABÀÉhE\ 3fÔ¤G§•£æ„pL¤4S• ZC!í”­mtZ1ƒzL¤Œ0í1 ÇGüA‘ H‘/ ˆ‚€ ʧœ˜¥0Ÿp!Cº:Wù‚Ÿ² 2mu’չ̘þ”mÖ¾2³±°w¾% ™ðÛ*û-tͽ6xä¨ÉÌR˜ì…¥Â7ÉÓF5›(h~Wì9)¥¯+3Q;'K÷šà }q˜)«Ýó±sÀ€Ÿ„Ø9߆9ûæ[Ñ `ß ˆòyÿ÷…†ûåóþfƒýÒ€€Ë{@7|_ÀØ-mˆÝ‚€ J+Òé”F$öJ3û¤ ÒŒ€Ø'¢´# ']Ò€„ÀA@¥!]Œ‰ýÐ’€[öWì‡ôò‹0WµyZÐä·që™/ëTAl™´ÿ×%<˜­Ú8M hóÛ¬7Š(e–ÚGÀ–iL@½rŒÎë°¥AÄÀ†iJÀi±Ö)? '6L[𕋦( ,¶K[: íÒª€n\0ÎŽ _§ Ýêú„ÂÖèC@{„‰ûÍч€6ë5I_›£•Îí@Ò׿èDÀõ‚œ¾HB lŠ^Ô+JO.û¤çÊœÛH‡åô#àn¾ªrY½Pðt$ ÃNÛÒIôO±m ë~‚.ü.ÁT…%î˜I5îg¡ ] ¸š¥ü5è_B!ÊЧ€Þ¬…Ig>üm}Ö`£§Ù`  `Õò³ ´»„‚2Œ àÖ{§|Á¯ôùJ0„€îüˆkeg¹b`u†Ð M«Å›¶µxS ·yVg,×¾I4cAßs%¯2c 8M“¹^wö(óû+3œ€ƒ5AÀX“Ïç +òåŒéR `EpáŠä6Á«ƒ³ÿ»~$DÀJdiãÙ×k´3¸ 4Á¬ó 1° x!° ×µ` úÅE¹: à9„À à9X<‡ ª@À 0ð}ð¥˜#ý6x^‰?H…ƒ…AÀkT¸ä×GJƒ€à–ðXïŸCÀ àìê,€Y¼Åz'§Š4‚ à=\j&ÒsoBj°w@ÀtüÉZ¸øÌà7aU/1ðÌS0¥SBüV5rÍ1§†Y `j1#ÔfA#}Á3@À<Ü 3JÙ%²;'#›‹€¥ˆ¯ßg¹[€%É3 ?RJ$©äFr6Ë’$àb@ÀO”Ò)*-vŽÃÈÝ,Ì•¶ÜÊd°0º'l¾÷Š]þD7¹ ?PJ(wný² ÆY+øƒ¾†fò¤ –Â[½}ÓÕÑÚ! VÀe»×½á+&¹2 #ˆ² p)½’Y¢¿I ˆn5Ù•L¿Déß´h ¶ˆ^êà š,.5€-¢ü»ØÍo¦©É1Bl 8mq°±þ¶ÉÁêFú×­MZ@À69»¿øIÆ0°QÎl+"`g¨Æ:ÃØª¥Aìå§"ù:Ø!Ê,uÞˆ vˆ\Zè#`¯(ÿd0ÈÖô©Àˆ€Ý¢5­¸y :AɇDÀ®±*ï›uÖψ€}³¬ó•»»ý·F°ÅAÀ¾YlJÄ-Cçzï;Ýìœ-m¢ÍÄd2æ|%"à(¨p¦–EUDÀaX‚9„_¹µ‡!œBˆ€P›hÿ6Fø»n'æ ŽŠÔ‹ )ˆ€£¢¶‘Áè²]]pXÌÈ ÍŸ-42ˆ€Ã¢×W˜6eB ‹^Õc^ú‡EE_ê²Å>û£„8.*º½X$"àÀDw·‹$fB@°ˆLTE@ؘ§Š€°!ª~OÁ§zGÁ§z+Œ€PÛ@„Ê]a„Ê!!¢nD@ˆ©j BŒ°Òp ³Äjö˜ "2˜©ªB(o}Ëw5ÌÉlR¦“/¸c¼ûä>& I•NÆôÎq÷ª¿ÛÉpšpÔ7œ· 8G¿„¾Ð·®¿w¯R–6ž}DÀÎYÛà—WoãN1¾z»&Â9êƒ2 3ZÀW d ÎQú A†5ãáv.ø ¨MÀ·F.PvÕå­á@„ ÌÕ¸Ÿ‡(33ëµiúW˜ÜÞ˯‰€pÉÛKø" \â-á‹€ ‚(¢¼Ò# ÜAQDyã$á>¢¼ ‹*¾XB²¬÷É-êïï‚€‚*½VBj){‡BúÍrm0Bk"QʵÁ B„ ´€ª€èéÿ_•zè B«{zé¬g! ä –u@ð¹9li”Idy8(€ðŒ‡!á!ÏB ÂCDyÖ# <åQD@xÊ£ˆ€ð”GWC˜&#Âc~WåÔfBe´€Ê­gžÂsüˆ€Po†~jw$#aµÎL¾`pØ)úUÜ6dLƒ éôó" Bˆ ‰dEÀÿÿ×NÀ A†ñȺQ8[c6roUÏ&|2 |Ð# xÔÐŽ¿0 !y2 ¥È눩aÊ3¡" ”AYÒ D@(‚(¢ È’l BIDY–DÊ‚€ Kš…A@%É@„Ò ˆ‚€ KŠÅA@A–ʃ€ ‚(²Ü7ád¹m  Èr×@„w¸i Â; Èrïþ$„÷¸¡ ›üi «üe »,×-1ÂË,«‚ý;ûBe¿{¼ ˆ‚€ ‚(¢ ˆ‚€ ‚(M HµíW››1ýù‚©¶ýjsŠŸ¿’1jÛ¯6£ø©V°xmßúÏ I†Ö¾ôƒžb´ ›`€š ˆ²†ˆš}b;€nê 7ïUj«>Û¼Wmõ|õ2¿9úQuTÐT´]’©1.ißüƒ*߬ÙU{Vû;µž¿ÌŽÿVp¶õÕzcæi–p«¶î nSÀz‘Ù½ónój¥ÇU¾Zsä}½|V_ÕOú>Õ§&œ½9oV8ï h¾©Zí,ñj󩘫7 "Mp,`½SOûµ¡&¸ÞÓyc$¬]í|Ñéù¨€SÕÎyýáË÷j«Z€Züô÷+ú=‰Í IEND®B`‚milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/a1200_off.png0000644000175000017500000001130310742655365031057 0ustar admin2admin2‰PNG  IHDR€à,Ö)PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@îî ÀÿÀ €@ €ÿ€@ÿ€ÿÀ`ÀÀ`€À`€€@ÿ€0`€€`@@@@€€€`€``€`€Àÿ`ã°À@À€` À`À`À €€€` €``` @@ @€`€ `€``€€€€@ € €€€    ÐàÀ €€À`€ÀàÀ`ÀÀ€À€`ÿ@ÿ@@€Àÿÿ€`ÿ€€À ÀÀÀÀÿÀÿÿÿÿ€ ÀÀ ÿ``ÿÿ€ÿ €àà àà ÿ ÀÀÀ    ÿ€ € €@ €@€€`À€`ÿ€€ÀÀÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿÿÿ€ÿÿÀT&¼sUIDATxœíÝ‹v£*@aYòþÏ'ÀÊ‘'ß¡éò€ånëÕŸó|||º p¹46Ýç识áùøøt`í«cx(Í[¨;ü,ö“ðÌåß9Ë“©¶Ûü}ÓWá×UË®Véêøñä%˜‘€©JN¢÷Ì¿iÿrÛ¿ðÅòŒ]&ýùWæò~`Ç[°uÞ#üŒu RÁˆäÆâŒV“s/@$ÛoÓ¹…IM¿TÊ¿Íàn:7–µ&9þ¸E¯—_‚m ¬Ä«Ò¼ôÎôoÓ_k.`ß× ßÞ2׳7íþÐý›8>ŒùÿAßø…Ý¿: ¿åBá³í Ž''ÁmFÜG\'ÂÉÞ~ø—0¹?œÂAòÎã½:v'³Ä`\óÒ rrn(á6ý‘ÌÌp@?b9aÎ%§)è)z›ÇQõxïza€fÞmÞm"6 v6ÙϜ̙vi`ÿù»HøºRù7í½Ð;œy¼i3ë6!ËD€d=ÏN¸Y·rz½ü»Œ_àþÊŽz·RBBÔ(^-®¥½^JÍ]6§s_ãÿºùÂjþZœèå#IpcÞN€ÓÉï/öÔ¤­up/b×£N¢wПÂÉ*¸Â½ûrµ–/z?ýeïÌ;à”öësWL¤\tÿ6XgwXé\)šÜá"¥cìß—åúv¤œl‰¯œ¢g`"wýXð÷뮂›Ü9¢ûÔø«ÄÌ‚5jæ_íßùÞkçñMþµwÉLɛ݋œ܉›Cà`Naö÷æá? áÓt64DoÅþLÙÿêñ¹³}rãÃæõ½>”¾øÉ¸ÿ:üíÝ+çL÷nÄÎÔ¿øàø˜r¼-@ÿ½åþá‡Osð”DNìåì¹£•?fNn}Ç~c7q`8ž]8mâÿ8O.²?®ØŸ”wFÀ$þ3s2Ø¿R¿#熮n3¸ 7’ÅЛz_Ý¿‰ðÖö×€´/cŠXÜÚ__ì/=èÉ éê6·r¸¤õ°3%åØÇ'úêoél¬òþÀb'ö¥çaBÇ¿KÌ›;kì°á¿òñ³ˆ\$zâ̾¼—Q±)B0)xOóñ÷Ÿ^tôI弋8:ÜÁ‹±9õ)¾f«?MÖ/2x‚ò§uuõ7ìÝFêídO¯Æ\nGôêr+§GzÃ#"@ˆ"@ˆ"@ˆ"@ˆ"@ˆ"@ˆº þ}!àBBBÔݵž_ 8s;@†@ÜA€E€E€E€E€uÿ½`Ä dE ÊU؆!墢2ô?‹l¯N€(—`|Ç⎼Y0¢²ìY° ön§¢Lþ¾MÔaïv# î` Q,„@TÕ0¼‡b5>˜ÎˆbQQQQQQQQQQQUvRN(E€E€E€E€E€E€E€E€Uçh™ˆBQQQQQu¤@"@ˆ"@ˆ"@ˆ"@ˆ"@ˆª ¢ BBBBTµ9VJÔ !E¢¢¢êÈR  DU y0J DU8^ð†Q ÂÓ7ˆd)ùò^®:ó`å̵óøMy/ç’.¿~‰Ž€ˆY !û׋5"GÞkÀ‰QWN€jŸGWÃìΈtõVD/îÿi*øWÞ_|Þ8{'@ A€îÁyûž•„ˆk “Ûÿe’µIæËˆªà–™ pÞ^Κ!Q5´ãÜžÛ¶`lÇFÀW5@à p 1mÜ œÝ™#¢U€ËŠó’Õƒ8Ñ(ÀuÀÛ4+gˆVz½™9±9ƒ±jàÿç ÀYÏæ»¿^¢a€ÇaÎ}§äoåàz á5 ð–¶k¦÷ïµ;cÆ€Z£ÍòÉÖ"ƒàØz8ïï×iw ~ÁaõpÚßö“#ÀQuð¤5 TÿãöY53˜§h·äªuËx´‡h6œá£MƒxJ€öíºu9™-Xñ¬Íjê™Ïâ1.ï»+àž ·6š-XGñ 8„çHCxr€“óªõàÿ¿(dYøóžà‚¿!êñRà· D=?@ ü´H_F€õ†)ðâ¢^ S Ý@Aë™­Þï]Úý­›í÷™:zU€³6kçȈñŽ×Òö=i»é~§É£™79baÚÛüŸY¹ —hví¼ò+ûø°·G.Þ&zzQ€æ³ëÁùëéyB‡ee;œÚo(PÈkœO;»K…³†kkÜäf^NÊÊ)h?dúÉñ‚Û:ëË©É{a7ÿùûîp˜079ç£È|þDDFAkxçGLoë´Že}t8{þ·u6s88:º£*Ÿ…‘qÄôI4Às™Câl§“ù÷ì¿âs¿=,þ`Ù³`¥&g¬¼²=;ÅM^cóU€Çjqïp&·ž-@õ°Ð{ñ§½÷ëì¶EŽùzÅ ;…ë®d|\€Á{Å·,qü-\'F€½}#@ÇéÒ²^^òýZÔ¥ÀÎ2B¶9¶Ðj˜NÖ7¥ïÅ@Þ²"ºÍ+Á®0¤'öHÓ†fÖH÷D€Ρ¶ÑF`/Gà ìƒÏèpKÂFkg/OéíÍ“?¶Y;3ú:üaÛ¦p}¯þ[$ïó!À_´ÝÞuª¾3†p[±ñàOîÇQêCÑ~Ò™å®þÞ4ëv]Û¶þ«ýÓ'™7jFV»ú饼e³C=m}ÒÙn×îÈ:r˜KoŸxZ¾×vQ9/Aïãð(uõW:ÿ|^ÆÕ½æŠîpŽëIZ@YcÎvï0Þ~j°"/ž`4›ÍetxIad° °"wÜvȰ/ ÏûŽ goÅâ~Eçë``M¶Àå“å¢[xNdúð¶rüá°*=»ËÅ˪š}ÿ ¶²ÈgCµ³—š± $Àº"ŸIÞ?æ´¶·œÙ'Ctß  ÀæÌ çä F*Û³»I|'™{]} vé"±,ìuõ±¤o{:PØQrWØéêƒ!À#|¤e«C÷ŒÏn¥@€¤í›w‹ù³à#-ëõºõõ߿矇z|&½½o2ëý#¡-Ÿiïdõv4Šï-à“éíMäu~ýÅà£m¡Îø|´Èf3öÛO¼*$À—±šƒà½ú£Lø6îv«z9&cìsN¯A€o³†¶o@mŽ~òÖ½làëÄö'3›O:½mvL€¯ùTÝÖžJöR#‹ßÇž6òƒ·½cB€/tú†È WUà]Eö²!?ÇîêHò^¤"ÀÏÙ÷#üŽåü½ïá æôíã„ÖóY ~à.©³ zúÓ±rˆµwæü¨­ ðÃìì7ëûÆÏ™9—è̃•7CƳh×p“vÎz‚¢zÔR ùWÝ{„ª–Ï”h»GVmVÍ8C ð`È,øË´·#~w·„ve¡ð옿Ì+ÎÛ-¦³UááCð]±fÁ¯9ÊÓº+a¹Y=Šàȳ=wùè§T8¨}Ãêí{±uƒ8¨ð $RË"8¨e“…èrq_8*íy p\þéª > b¥e¶ $@ldVH 6Z DI¬&@8"6N’áˆÌ… —…/ <û²°ÙË ¢«µÀyŸ÷¶ÞR‹Ð{uëJiÓÞúÅþ£ÄÙ\zúà|{‡„ˆ£­@'ÀøœØÌ¨Ë Ž´³4|s¼â’sˆ›Œk¥¸C€HS }×îlɘ‘&;@ÿ ⦬÷˸ÿ›‘¨h/æÁXü`"@$+Û¾÷B08ÿ"ÑÍíGGœ Ò•è¾3wØš‘ê~€vô#@d+<–’}#8öÎ"ÕííYöÛœ‚Öãs¼àa•xõÃŒ‚Öð8bú¸ZÏ0½ 5àè˜PRÊ~_œy°òfÈø¸Ê&Ö¨‡¥Í—Z²B˜Œ!K‡U¿+c!d›³fd‚¶¸:^Ggnÿ "B\Å ù¢²êH€(°®®‘!¢ÄqÏ…%t­wåE´wRŽqËÝ ÷Ü,qBBÖ½ 7 D D dÝ*qBBBÖ · D dÝ(qBVyˆŠ $@Ô@€UZ ¢ŽÂ u d•H€¨¥¨@D-Y% ª!@ˆ"@ˆ"@È*(QBBBBBV~m æxÁ8Õ2ÀíPé1ç´Î=|¢®ú*eæºk€Îf5 .dÈŠhÔF€E€E€E€E€•S ¢:„(„(„(„(„(„(„(„(„¬Œ õ D D D D D deìžãÞ„1QQYÉ Z @ˆ"@ÈJ-ÑBVbˆ6¢²Ò $@4B€•T ¢™” Í d%H€h‡!Š!ëwˆ†¢¢²~˜uÄôå@Á/é*¸*#¦#CÍp"@䪠Rë\wÿ:9ó`åÍÐU‰õ({¹­>F@¤ú52 FSõd!%~Èj´U/ÀWÇ® $@4F€¥õEƒˆÖôÕ(H€è€!ë´@Dg º @ÈŠ- ÿ?Ñ‹¶ëcôêÿ7ˆžLy;„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„(„¨—(>Xôö×£U?àxÁŸ}>ž6Ýg¨sÄôÏ>O›î£Tȸ}¥Ö¹îZßòŸòKÐ4¨¦”kuù¢«aH×eâ}Õù6Qÿ¤åd÷‰Ÿ4œ®Àc¾z¤O[Òw­à6%û¾`—“ûo>2ѦӶÓ=›|«éž?ÒÇ­î Ú'Øïw¢&% ™nïÇü¶;ŽÉî&áIãÉÆ'ÚvÚAø=óÙû>ß úošpö{i;ÉéüÉhàöM×Ǽ¿è”øegê?$ ÌdfÁa€½§ûšYpÇ;$ô; °ÿtÕÅbÏãœú.–K¬¸\ÒpÚRÓ•›0ü•‰*&gL¡IEND®B`‚milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/comb4000_off.png0000644000175000017500000001453710742655365031574 0ustar admin2admin2‰PNG  IHDR€à,Ö)PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@îî ÀÿÀ €@ €ÿ€@ÿ€ÿÀ`ÀÀ`€À`€€@ÿ€0`€€`@@@@€€€`€``€`€Àÿ`ã°À@À€` À`À`À €€€` €``` @@ @€`€ `€``€€€€@ € €€€    ÐàÀ €€À`€ÀàÀ`ÀÀ€À€`ÿ@ÿ@@€Àÿÿ€`ÿ€€À ÀÀÀÀÿÀÿÿÿÿ€ ÀÀ ÿ``ÿÿ€ÿ €àà àà ÿ ÀÀÀ    ÿ€ € €@ €@€€`À€`ÿ€€ÀÀÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿÿÿ€ÿÿÀT&¼sñIDATxœíÝ’£*†aSÜÿ=Ÿ³“¨Ð4È?¨ïW[5Ò(>1™ÙaÛ!„B!„B!„BÞ™Ïçû÷÷qßf¯Ò/_jÿþ:͹k„ôËg $dLv€ \!$-Å?¡·àºÛaݽ”Ö/h}õ€´îÚÚès ­;¶Þ߸oßîÃo¡Dë·ÞTn|IL’ÓËú¯ ¼ç´gäÆã+±Äîró9¾Ý];¼O´õÞCdeu׊7=jO^oü}êMyk¯ø§y€nî~¿µb€î?hÕB»¸Ç)6–  ödJŒQw¾GjË:ô*9o—²«ÿ=…¿öçVyøí"¾í!6°(ç—SÞ«yÚó¹ÍÚÅõÈ­áf·<šŸÝØOGuÖtOH9jëü¶³ëvü»ÖÑ“{o¶w9ÓØ boÓ)y5ÀM8Ç]òp/‚¼Lö-ÎÕe“û=ñÝ.dså]ϺÔúm3~Ôžô߃ È^ó^`¿#3qï¥b®ârôò”å6%wÕÔ £?lr›ðÜè?XÍå ¯mß$7¹‡wÔQ€Ûï¶èžg`—ß ™Ï¹‘;`E¤ õf'ؾöâ]È^TK8*7ÐZ€Îßö LVÛ?F:{wúÓvÙ¾]¿åþÞ ð"YÃj] ²¾bÍ+ ;5RëÄ÷3±'sÀ@ª8-™fg@25$S@25$S@25$S@25$S@25$ScZ  É ÉÔLM`‘K’ÜL ÉÔ–}4 É ÉÔL ÉÔðŽiú¨Scôs l¾ €z8(ÔÀAiú¨SÀ‹,y¥ /ÏŠàE–¼ÒoXtŠ“Ç4YòJ0ŽIáÔŠ™Ðý•†Û¾âþR½Ìš²ä…` XÎßEèþFÏm¿On6À¯4Iǘ©úü]œ5»dE€¥—gÅL~ þèÓ (*g€}Ó`.”ã7k¿kx[ç3à‚WÚÝ?*Àø FμäÀì0”r€r FÀP2¾Ñæ!¹5»€}“PîÐè(Z†'(®Ù$ì›UŽ­™‘ëïÛ€~œ`ßÐ p½+mœ‡›'`ìŠpDR.wàZRñ$çæñÅg .–‡ô€ÎÊr×qÀ.@?So/ @ã.°S½½(ÝŽ©· ›Õñx¹cëŽ[½(Ápr‚ÿBܱUÇ=F€^$ÀÕ€S“°ñ(>cÈ=89/ýPÀi0õü–>b85àÔ€S@NMk€É®8& vÜa$èÅgÚp@Üó] Q–{>`ò`ÿ´˜z‚V\€fÛ85Ï(Ëð&¯ €M@7ãž 8 o¨| ô¸Àà°è·8òL€k ̘tà9;ŒD1@õPØ?Ú%ê·wöÏв)çÀþÐ’0 Q¶pbÞÐ~ο+pRžPû¢6 ×æöå’•_•€jFÀÐóbdÚd>Àð¼Õå5kòF€ÑýFtë™·º¸fUÞðòŸ 06ouiͺÐßáÁÏi2ýy«µ¡V¯Ð–Õ]0öê+„Ÿ·zã(@¹—Š; Ó2à¹S“‘PNa€Ú'Âüš5 ²ÃsFç­.¬Y—ç4I? ý1€S#H[ÑÚT´Ï€ãÀ};5Ø óßÝÀ_MN(¾©Ì@wñmÅ(€ œ/€!€€#òx€úJ€Ê'E _Ж×<Û®Ð?ýÈì¯8êØžP;@w3õÝûÇ(êªû€ö#5À €±Ý£»´ˆÑ.ÔU§lŽh­÷hÔaà7<×-qž«üÖ 7ê{hÄöh£«=6¯ì<€úKÌÐ]—{©GB£ŠJu`Œ€ç*¿58 5nŠ:KM€š6` ÙùåRŒh·=K1ÀW&œ­wH~k°?@÷Sí, P|xêwTÔw#{Õ €ê"û&Ð?'t;› P´{5@c|ÏhoàX€ò-÷\w/ƱÀì8Ç@7Q€Þ³' 98íËë[[õŸ+èl\  ë›7ðìvXà±f==`¬×b€J·†>eXÏ¿ &:.˜Fh«âÔ™P™©ú·YLX½À}ìX“Ej3Uoê¼™´ßþ•§"­ênÊ÷¤×hoN¨ÎTý»!Š «W¨ýKÁ4€‘nïÐxÛG<'Æt°}~ìÙ2ÍÀ «(ž¾ÀÜ «•™ª-y P¼9EzNhÄÒ@€þáͺ:ÄKôÙ½ `ÍÉ® ð§¼g&¡ÐÀý|—úi€*—í·ègÔgªÞv’]¾©h=®Ðú_:jÖSn¬ñ¬P&üññµ]a€Ñ·à^+ÎvM€á4˜2h[  ×î `˨Õ>šôöuŽaE€N‘ÿ?ŒÜ ƒT€úå«Ë Öxÿ;` ½X”†Ï‹»ÀèÖN+΀‘]ÄB pÀ´¼`ʘ- 0ÖÇ€ÆÝ³ 5|þv½‡GÓ ¸þ’ƒ¬ ÀÚÐú õ|w€ÁA?žŽü÷ðx€ÿ¶ðrçhJÊñbøÀ´”ôWÐÈ% ày¶ÂÅmŠ3Ø´U¿ëb† €‘Ã`]îÐ>ÞGtΪ Àsl^кÀ}:÷Š{4Ê"µ}Ü%žÏ°.ÍÊsïPJW÷ m 4LL;€—c–08±i«0VD¶ß—Ø,hDGz”Õ‹'† € éЫÀfé ЩýéÕX—„1óF)ÐÙs2@ýpƒ×ó÷•—¼¹’XÞ¨>!þ-°Yºt/à€nÌa ¬›v ‰§3 {èeîëØiox{€Ñ#ó~F=ã²h½Í±N* ÀCmôÞ:Û zJY¾ `†À@YáÉS†, 7jÕcïªL.»½ ²Àx8 `¦@Éð¶mvîqø]üË Z£Û  Uýaõ.Þ0B¡ÀÀË>ÐÒV!À_n0 òŽ“¿­V 0J'€þž7¨_±sñÁ·ÿÕ­¶è€[l(:4ÊfKåî÷¨^ós± @å(ö%ãoîp3óÆZP,Žhÿ¶¦xta]€é—ûµÊ­úG`oŒü]c¾àyåú´/]W€©ã\0Úh Àð¼ÕûÒ­*ïØ€›³"ž Ü½ÀȼÕûâ(€þr5@åm- Ðy§RÞ³(wo06oõ¾<`ÎX˜ø¥¾Ø@wÇ9oÁê¼ÕûJ“ «oPqgÒí^´1×»Ø{»»æNX}4û¶Õç­Þ^và´; >oõÖ <Ûj€×Ú”Mãîöû_æÑíy«÷%[èìÝ`tÞêßÒê#h|€F^‹@¥ëØwŠß ÐßTýÅ‚ò)ò)«¹R&çÑ•P)¦Ÿ0µãB€Æ~°wPK]€ ¿¥°2TŠiÇp€WM|2½wÃ5@!¥9@¯•Ù¬_OT–dU€Æ#¼T þ†€)ù¾PÝÐyBŽä° ÚÛl€{wx~xHÝ‹œU`ÏÂPn°ºwpdø[;82ü­þÖÎGà #óì¼à×'€ßµí|àÈð»¶~×¶ó€C#†|ZøÒðom;84ü[ÛÎG ÿÖ¶ó€CÀ¿µí|àÐðom;84ü[ÛÎG ­›;+ŒÌÃ@w3ç­7®³È( Ï[R€kä¾#óV§Ôà¹-ÀؼÕ)5¸Fn ðœ&ÓŸ·úXŠÌC À5²ÀÜ «fß¶ú¼ÕwÀ{d‘¼©¸êóV_ÕüþOHNÏSÚóV§ÔÔÿ+.‡ç®£óV'Ôà"¹+@¯€_€wÈSæÖà" Ø À± Ø À± Ø À± Ø À±y+À¿p~(6pl(6,1/ ņ%†ãMYãG¿øÚÐݲÄp¼)t·,1o -KŒÆ«²ÆðµYcÈøÚ¬1ä|mÖr¾6k ù€~ÖWe!àk³ÆðµYcÈøÚ¬1ä|o–r¾7K 9ß›%†€ïÍCÀ÷f‰!à{³Äð½YbÈH¦€djH¦f€k| !Ã@25$S@25$S@25$S@25–Ì?w¬; Z?¹µ6Sõ1uá¹€´îÒZ›©ÚÚhm*9ÒújOm¦jëxl«:¢{ ­g´VgªöU~IO>@9Sµ\ ¤O´Ï€$âÌTPIHóìïØ¿÷ísÅÚHȰ ŽB!„²HJ¾$v¾¶‰Š[×õ]ÑÚùßÙZ´Þ næ‘_¦ä›‚¿6êCbâÖu}W´Þ‡¼¬@‹Ö[áÀÍ<òëÌø©:„žGîþïŽÜMZœÕwèºyB>â¿+dµÛ_‘ÖCFÓ¢ÖÇ÷ÒKû.n½_¿eJãùŠÖ¥÷Ùß.‹N}ï»fØ£åÝÿ®ÞJ¿)mÃ×qåÖûe,+ð9îa%·ã¯è{RëË|Jn£Ç ò÷Š´R×¾Ïií^ˆÜç• ÜŽ¿làyݰ_•Ï-r¼š‹æ¥‹îxþy·‚/¥?Çç‰ã•™Y¨¢uÝ÷Š[GÏù²Àqó*¸½ÙV4pM޼rØ !„B!„B!„òüe²†ZkFeëIEND®B`‚milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/a500_on.png0000644000175000017500000001060310742655365030645 0ustar admin2admin2‰PNG  IHDR€à,Ö)PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@îî ÀÿÀ €@ €ÿ€@ÿ€ÿÀ`ÀÀ`€À`€€@ÿ€0`€€`@@@@€€€`€``€`€Àÿ`ã°À@À€` À`À`À €€€` €``` @@ @€`€ `€``€€€€@ € €€€    ÐàÀ €€À`€ÀàÀ`ÀÀ€À€`ÿ@ÿ@@€Àÿÿ€`ÿ€€À ÀÀÀÀÿÀÿÿÿÿ€ ÀÀ ÿ``ÿÿ€ÿ €àà àà ÿ ÀÀÀ    ÿ€ € €@ €@€€`À€`ÿ€€ÀÀÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿÿÿ€ÿÿÀT&¼sIDATxœíÝ‹š›*@aüðýŸyÆ;(Qdo`ýç´ig’˜LV!hK÷o;ò²ûÿ5Ÿr¦¹wl°s¿¼ÙàXŸ`ÂÀ£nˆÐr¹Ã²×˜‚y<*_®¢ƒ+!<•/WQ€ÁÍ0<•/WS€\Í#@]¼U¼Ã÷BßÙq™¦ß°KW·ú×E_.Ùô﮾ˇòv€·ƒX¶„„ž^ݹ óß°ñ†Îs»†- »/2`¶qɘָüAË8gñô´å:k0ë пÛ×uOß^œ?â±uµÅ«r}è}ѿήÛ.¾tÛÉvæ`•Î÷‚ãžýÅ¿›/J=~Á«Ä Íñ±wÇ““ÝuzWmÌ®¾{º¿¼§//N€_8ŒO¡ÁÎOo7÷:Wt}'_<\Àø×H€U» p7:æecÜ4O{:™‰/\¯Ô»–·  J¡)ØÙydù¢Y¿¸­,ß7¡³žWú«9g×éœÓx_4â+!(!êQ?ÝëéìZN.ð~º .ìåÅ 0»÷›>Ò]Ë{o´ˆ7ÞÏàˆ<…,°À«•·Ô/ù'Ÿé.×Kp« ÙEõ£Þ¨§Ü.^`€3ÿÕvï_ónë×¶ Ì} Ü­mëU¶¯u»…ôoËö5÷!3x;{dü›6×µžlwŹGÝv÷úñogy\`Óš} Û£°¯ÄHöÚq ð®úpÒm'þåUº×z¯ngðʳ¦û·Ã?©¥ûà "û{ë|µÿÅ¿áÇ宲ô´; ìôÝ8Ùη]™;v9U&|å?x;/¯ÌÌâÏNβܓýÇÿ žÜ¶[Z08>í»Ý¿p÷1Xè»G98ômßæñ6@ïw÷_Áî¼ësÀà?ÿ,‡åoÅéM»‡ÃîFÇÃÈbŒûŸ…tã$x9çº/ú)_\îäÌÛÛþ<ÙžzäŸsÿÅZpÙò7oMÙ~ºý#ãO»™êxbÂ'Ç«vÇ.ï‹&°bv?Ü#ÿ¼ëïÛbû>‹³ ýÍÝNž?/¹^¼Üˆú±î®·—{ñz×q÷z¢——âŽ×óþâuø,']J¸ ¬´@dA€E€E€E€E€E€E€E€E€E€E€E€•"@ ÄcQQQQQQQQúïEö.Nxè~€áO”˜N DÅ=\>,g pš Ä~šÉò©4Œ€H&j%dù‘JÜs@s ⡘½O†ó/N€x&ɆhÄSQQQ‰¤@@†@DH`oyˆ Êë "ÆR î#@ˆJ`¿ü¸'e€¦'@DJàbX^þøîúQ»Oܲëy—>õ\ù&@omdÜ6HÊ ¯ãÄGzo¿ÎÄÀÎWº/Ê N} âÔwn+=+Â8óa€ÞÆDЗ®ÆöØQYœ ŽòHƒØÉ íy={4½åy vb Z™8^ð-¼a Má…˜~ÂqÄt“ ÀiæÉ ÑSp×gî¼ ù†éÍÃ<„‰¯g°{1Cà°Ã>bòd|à²k b”=@Þ$WÄJÈ»­- dl‰¾ ¶De€ã›5¿¹f(£5@Þ%Ò²&Ò ­òÚp#”hXiBB”âyؽ26!Js€ÌÁ P C` Th«§9Àá9FÁÊ©Ð0 WO{€X9„(„(„¨ø‚Ò/ø> ¬ZtA¯˜‹«F€õ$@gî¼ ùX«GõtcëßÒÞ¢ ¬™þ)˜«F€¥3 VMý†èÖ‹!Š!Š!ªˆ)°^QQ…ÈÛãjUF€ Õ"@ˆ*%@æàJ C`­Š ÐZ>¬£6Åø_žå£:êSJ€Ë¼x2X™rì9¤zŠ pA€u!@ˆ*/@žV¥¸9Œ\] i¸&å8è{6 V¢Ì'X¢d}¤|%ÈX²d,^Ñ2–!ªð™ƒKWv€ Å#@ˆ*=@æà C`éŠ!°l¥ÈX¸òd,Zñ2–­‚KV~€STX¨ ä ë%«!Àÿÿÿã¹`‘ª µ‘2U áS;ŠE€UG€3 ,O]²*\œªd,OLAÓq‚ó/ø>†ÀâD4…'pÄô ¥¹_PgJ!°07 êºnü†ßœ9¸ó&d r³ž}€â!°4Ñ+!º§à¥@Ž'RŠúìíx< ,CÄJÈ<kÞ 3šö‹¡À2Ôµ!ÚÕ3 — Þ Óp *i¸UÈVAý*÷+iWw€Ãh)P³Úüϯ§@Å*ð¿@Þ0§Z ²2¢XíNí ZÕ8¡@­¢¢ pW ÛeÔh2@Ë‹Äj´ [`ß³›‚í¸îÈþªš4ฯþ¡å“Œ4i'Ài_}»”ǨCKÎïXZþ,zK0k+@ãì˜@€*´àÖs° ͸aÔ€-!Jj9@k† 3ì°*ªá‡Uûžýe5àÖJi9@ !À e„àŒ!PÎeà‚!P.z6J À ³°t0æG€†ÀüÐŘº³#@C`nèaÌ} ™ !03ÜaÌ‹wó"À=†À¬pox§ˆômhô ‚E4(Xýñ‚ ÀlbX=þÒ~Äô$0 ¢À\nÔuë¬;èÌÁ7!׃s¸YÏ`7~]# æµ²üÞ@€˜IÜs@C€H+&Àn™ƒ«ß 3 À,Ø}Šs ÀSì–ž£À ð{%|/‘à×ð üþBŸ"À_ðSø~‰ë͸—>+$_ ÀßzÛûÚD:xGxýF`Lc`r…S#À8˜F¢À´0¦E€±(0)ŒÅÖ“"Àh=£`BøÈP a øLÏkÃià ø¾Àø¾Á1†_#À—hð|¯'Âç0Vˆ#À4(ð!L„£‹A€É0 ?A€éPà˜Æ#À„ã`J“¢ÀX˜“p,LËòÂpLÌÚqg}*¼‰“ä-#7àþ´–=dn!ÀOŒ‡¸a¼¿ÃûÞ@€æáeÛài‡J€›Ÿ öûÏù]NúÆ Œ:búx àVŽœŠ?Mf+n>?]Á´>Æ1ýÿW+GLOg|*hí:O#¢]þØøŽ¬qàvúµLÅóéXd?à¨ÔÙ˜Ks^`‘§#ÀâÌãú´Á÷Z Àò GƒÝ½>â*«@,Ñž 5XÔ –Ά",g'V¬AÁO °Á¹¸„ì°gŸÁoÖg…K$ÀŠ„‡ÁÉ4ê °. :%H€µ¹›`¿ûƒ¬ÏÕLìXgcÑi™«tþ:É)¡ °RÞûHn’XE!ÀŠÅ8ësn>Œ>b:Ç .ˆ=¼xïJzÃ6Qu1½LKƒOKôaooZLA–kzNøf< ;éò¶uÝ4ëNõÿwÞ÷’Þ!|e-/q‚Ïݬgpm°c,šc ò;Œ¾8TI=?½L€µ°/בÓ`3 D3dC4&B  V!Â3OÇÙJ$@M Úå_"@œZÃ/GDÄos‡_TH€ˆ~Û!â ëzsEˆ×ì‹ ‰Å•H€øÊ­q‘‘ÅÙ4M€°¥H€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€E€Uh€bás‡Å®>bºŽãWûxh[®ª×ù#¦Wûxh[®ª»%>lf¹œçÞ¹¼ñÿÎÿðØí§?ŽõݹÞ6™mS0BÂ<ß›·¨OÖuâe“¸¿>þùM˜®>¸ÐO—½.!ó}¾º§Ú¶äÝ*èï‘kÃäò“,ôÓeoË=[üWË=¿§ê¶ç°sö‡Èô3éL'àºÜÜ÷¹´3ŽÉþþþÉÇ‹ /ôÛeïÂÏyŸÏ–˜÷ñ¾!ÿ® g?—oiÎŒœÿõ>/O:%~Ø‘òɳ‚̼0÷r‹™‚3Þ ¡Ÿ‰h€ù—Û]¬ö¨ Ðä]-—Ø2p¹äÃeK-WnÁdò·Ž'PS¿’IEND®B`‚milkytracker-0.90.85+dfsg/resources/reference/Amiga_resampler/modguide/results/a500_off.png0000644000175000017500000001173010742655365031005 0ustar admin2admin2‰PNG  IHDR€à,Ö)PLTEÿÿÿ   ÿÀ€ÿÀÿîîÀ@îî ÀÿÀ €@ €ÿ€@ÿ€ÿÀ`ÀÀ`€À`€€@ÿ€0`€€`@@@@€€€`€``€`€Àÿ`ã°À@À€` À`À`À €€€` €``` @@ @€`€ `€``€€€€@ € €€€    ÐàÀ €€À`€ÀàÀ`ÀÀ€À€`ÿ@ÿ@@€Àÿÿ€`ÿ€€À ÀÀÀÀÿÀÿÿÿÿ€ ÀÀ ÿ``ÿÿ€ÿ €àà àà ÿ ÀÀÀ    ÿ€ € €@ €@€€`À€`ÿ€€ÀÀÿ€@ÿ @ÿ `ÿ pÿÀÀÿÿÿÿ€ÿÿÀT&¼sjIDATxœí –£*õÀþ×<£‚|Ä´(rªÞ›˜Õü…i‹ù?nP—E»ÿÿÌ@9¶´wupö×< ÓÁÕ>OÀ‚‚gˆP¸\°ìñI0÷£óp?$`²Âýè<Ü ˜¬†á~tî—|awüAÙîð]ê›x¥MŸJžÓ||ôÝpð#ü¼‡—¼l‚­Iå«¢S ng>I ¨Ÿ ù¦¶¹¬3ç¼uÁÛæìT°7\¼äGL»\a¤5y›†š=¦w„iSî!¸û_Žò肟¥ …p*IJVî9À`exÌyžçè(®eÁ3ɳËÓÿÒÿc8ž¿ú‹ðjþXX–À/&œŽ7Ý‹OÑ1ƒCOSdßAÀŸIpI>¹à‡»k,É!~JEv¡zQÚëè÷1OVN­ HX’_F±ã!]ž&_ÍDŠêǪ§VN§îÇöÔAü©$Øë5bWNûJW(°ßO©MùÊ0‡—:æ!Yßÿ ‚¬çãLܳݰ*Y·û´»ÓÙQNwÈû2ØÏë<Ê¥¢ ˆ2˜€¿Jm×òK׳ޙ)ŸÇÿë¸73jaõMrûÄ&x¨?/Ãt#`ú›ÔºVùà×kD¥ËÄÞaH2ð°ú.ã‚ï‚æ½tÉóŒöû±2  ¾¼r€«?wX±6*ä’['•;lrï~oç¾îïbÚÄÂlrV98‡GÌøE’'uwÇ}÷¦4øõcÑŸ±_7ù £‡Âš±ý‹(–›£€Ò&+ÝÜWþ~‰˜3yºÞ…Má»ö…»"ï$fw•CùÝ&· |.`“Æ&¸Ÿ?¶$¼ñÝ:ÆÁ¡‹Ù-ÂýÒ©³»¹éhó÷éL7‹PÿÓá/Ëzh•‰/Ú[«ÿ"¼€Ä½É QÃßtöÿþã»Ý™ÄÂmçæGZž•å[þ“§ûSÀÉD‹ážlb/(þ•ÂòäÜ.1¤€Éø)Žì¢?mÿÇßíèö&£>÷}Ò‹B¯þC|4›ü Ë&&;¬==µk `œ¸¤RœÈ'w¯"]_„ûÅ>ìAÌ~Lvâ¯Óõ·uV† —õ<n¯¼ÁF’ÙOAIÃKwæø–S”DSz1Ç›½.ƒÛ|¼]Ñ .,Üvu¡á¥6ñJœõCÿð²~Ïè>ÚïÁ- Žqõ8Ùá•8Áõ8ÏwïLÀ{:}’.AQDA@A”b ÜAQDA@AQDA@AQDA@A”b ÜAQDA@AQDA@AQ2 Ç$ vÇ@¸ÉuÓÌn „› ˆ’—´ƒf;·á¹ƒÛÑ©‰¡Y…ûŠ€Pм<àt" ÂMr fˆwG@¸G‘Šh„» ˆ‚€ ‚(¢á¢ ˆ‚€ ‚(¢”Pa Ü¡”€Dp QDA@A”bR †;( ‚(¢ ˆ‚€ J9M= Båœò)- ¦Br@@¥¸€¤ÁCy12(, V9P™Øá:Ü“_ „Ë ˆRVÀ% 8ê)^àQR@¥ºiÚGà'%œÔšT!IQw´·\ Ç´@š÷ÜbA„$ï”=”¦}ÎxUÀ]C„^0¨D@8å-ýF9M œQC@Eûœñš€~É×–EbÞЫ|¶Eª£!æEãøNiW‰°ñ¦€J++ Q!* ¸4ïõƒ+U4b=)Ú†a£¦€“P™%)1Tpm^:méý&$ ·å®ŸˆG¦¶€KYx[8‰¦º€“í5m¼C3ªôZ lœfLƒ€­Ó¸€LpÓ:ÝHË\›´. 1P3¦o£t# ¶Ió.5„ÛKØ"h›ç0°EÚpiÞj©inÜæµ1oÌ­‹õ3t"`ôF¯ 'ÚNÃ\ˆß¡ ];)ÿ_¡örñ!.¤3ë‡èC@‡ë:mó„úÐsUOÊÏ.R‡-Ioª%óDˆ:n1ÞÒgÿá¢C9zpr½U×O¦†Æ7Ì™µÿ¥èNÀˆ-:ôÔ&ÇhË+j¢EÞT‡’pTe³ ŠRä4ÿçÁîµ1å¯ÌaSè ¼‚€Bd´Øç ü¾€÷8ñnÚ’?Ô6ÈBŒ" 2m#^9x¿n p^ÃsG@/ žƒù˘Öb?¢Sá÷4%׿–=ójàþ©ì½ÉV?£Ò7M«XŸQ’àK``}ÐëÓ}5LXÞ+¢ó@Àê `Ö°6‚•AÀE÷Àº `„⑪ `Ä" ép=0Fi…+‚€1ŠVáš àEY¸"˜k€Iè ] LCX <뀀'(꣫€€g(¦$®ž²BmlSvÞ:Âè‘'–â^¡½r‹qÇ$Š2XŽ,•Ü49cˆ€åÈp«ÑF@ÑÝ;#C%½f·^(¶{g\Ц½jŸ(Åvï`VίöÙÕ>QÝÈ"`Qô´O v³™±ßÖYŒÃy;Ç‹¢ÖÎûJk3ó—‹ÝüØkéc›9,únD°,&Q5“²ëÉ6ØA/·ÂG¤JíÞ7ë\ìûŒÙÊÎO|ЦÁ#N؉€/bâÁiõnP²‡Þ´îÃ)ˆ€¯cëûö¼Ÿž´:l2m—#àë¬YÁi‹ç¶¾„‡hÎLÔhÏ=!àûhµW8k;ovˆW2­RßÇÕ¶ÄI¯ÛDëA>FÀzüÐÅŠXo÷±øÕiZÛ½.Ÿ+r† `µÝãªXXk÷Á¸"`½Ý!ÉHi0~¬µ;¤AÀô¶óö:»ð0¹é*Þòâ DÀW( ¾nÐŽña{o56È™iKÔØš„Ø"'c|lÃò×=•§ `O¨öFøEÀžh0'ˆ€Ý€ J[Q öÇ>ñ’ìi\;Ä>D"}W@ÀÙfêl"-FÀ>Q§,eFÀNñ§ &-þX·옽0²›¨?7îvÌ>I¶5qíGó­9°gô:žB8k¶úÖŒœØ3KwýµÇô´÷ãw“hìÎÀ©÷~4uÙgËv Â."à „}U¿óx;‚?#ñäW çpÂ^Ô^Ý´¬8&{Õ´~’ÇÄï²¥$cA_ÀIpäKÛJ·¼ªI®6ÅNÿà>ËœŽÊÒ<ç°€€P~*£ÒUÓuA@0Ȉ€`8¹UKbÔ·÷A@pˆ€àQ?ˆ€àQ? D@ð©" Ô6!࿜(# „„]÷j£·‘~÷©˜Þ !f=a7O½k ­¶Hpýðçÿ¸EöîÐ zÚ;Jo‘á‹\7hÑîÿ?³ÈÞB# Hb*M:ìl| Íóžênzið$ÈÐ Ú>.÷®€íÙœ·Øo&ì½>¬î øZJœU±¯Ø;Ûs¶(¬~ø´œ—œp ´KÕI¬ÇŒ9Î6 ¦f6×ɉ€r‡TDÃ[‹ÈÞ=æ(šJ­ÏôáŒmH飀Ñ„—Ы€ÖÀƒ€ÉÞ ¹™B„SôšŒ£@›·/ïÔ× œò[À8%Þ+k² D@8%žZΊçýÔ>ÿBIôÞ*·r& 7IôÅß œ è7œTLOgßœ€pN, kþ¥B!´ÍZ”)êþ,ë" ”â0¿pPårFŽ?Ðvž×¬Ö ± ˜5• B)ìt"/ ¨~âæ³É0ð²€ á*¢<ð¬;ÿÿÿ®qC@×]!m Bùªßµ†k•6ÂE²ô8:}¢á*¥Ü:. \ä¾€égêò¸n ë0¨‚7Çm¨†ËdFþ[ÏÉjS…É›ÁAýÐ~F@¸Ì9DÂÄ8\¿€€pQ ¸?>>S‡€p{úMÇGš®óT@û! Üá–‰QÂôþrDWo BÑSš—øÙA!=å= ÷'Yè`¼¬ç d¡3Rÿ „<¤A@¥ ù ˆ‚€ K9n ½×g Ü!žÁá6wÐ¥j¤nQ*F@xÂcñÔ@„g<4ᢠÈòÌ@„‡ ˆRMÀù?n‘½;tJ-íþÿ3‹ìÝ¡Wj&ÁGxÁ yÞR]û:yið$È0$·¼hÏì¶3ö‚ÇÛ1 ¿5I0¨$ …8á‰TÃÀc* øÂîв<0á9²Ü7¡÷+£Ÿ…‹€°‚€ Ë]ÊpÓ@„2 ÈrÏ@„RÜ2¡²Ü1¡¢ ÈrÃ@„r ˆ‚€ ‚(²äˆ€PQ´Ö™" ”A–< ƒ€ ‚,Y" ”AQdÉ1¡8¢ ˆ‚€ ‚(²dˆ€PQDA@åº/€€ Ëe^áªïpÑ@„—¸f Â[\zFá=.(ˆ€ð&ˆ€ð&²hý{À"„ hë¡qQ[*²)èLjºQÅÄç‚E?ÏË¿ÙíÄýè<Üo ¸¨·9xk÷‚t{?¾î§œ 8þSóÝÞÇ{¢âÈ0°3¾ñ¼NëfÙ¼‰IøDÂ,ð|&V& Ñ÷W ¾vÞ»Œå"``gJ‚ŒÎß´ç7ó%)ÞXKÖ_Ìö_ðï9‰ /g³öF¬áïmü“ÞÔÏ£¿~±ýãe>•9ïÔ‡VÃÏH- h6éÙöÓâ„S¦Ø\íÀŽŸQôi‹ýÙ†v`fs¯h÷tžÑáF“ ãú'Š©ÀÓý¶æXØ£¥ e×…ÜóÅ߯ßó"†ë[uÉÄÃð6WLæ\Cõ5çõŠù;ŒÌ*†Ùdÿ ä³¨€¦?ýýo¶52ÂËaoó x¤&¡s&  }> $;ÎÓ¢y€ž"Wïüžœë±ÏVâÉÎêgÓ#-‘¹JmžÐB'P'iT@ã§þβÊÞ÷€â»È,b[û‡€QKÜs—Vò8ô±öäuÛ))†kUhSf(ÎSø9¾gM|yn=h­X‡t ¾/5úÙü2‹˜ãô3ŠxJÚ5èç.{ÐÝþ¶Â3ËÞ?ŸjµC‘‹ØÑ•þ!`œ¬ÞµÇ)».1¼"£‘#5O‹úAÀ0U:½‹w ÂT¦‚€0„© La*SA@˜ ÂT¦‚€0„© La*SA@˜ ÂT¦‚€0„© La*SA@˜ ÂT¦‚€0„© Gÿ’Þ gÌo°Ó·$ƒ)ÐøCc;BµÚþ! dQu >L/®ûvPØ…KÀ<_Ä/¤¶¾[»QáÛT^‚M¹C.uZ_Ïr©»´¿Ê!“B-¤ÙŠ“ÁN´P!„© La*SA@˜ ÂT¦‚€0¥ˆ€0„© ÌDA@˜ ÂT¦‚€0„©tPÅËÀöÌ3áa*SA@˜ ÂT¦‚€0„© Le‚€ áa*SA@˜ ÂT¦‚€0„© La*SA@˜J©€â„Õæ BœBÅ «­Ù2âT hMÒ…€EÝ%øpçk}V”g⨀º·€ &¬>Ž6g@Ü¥÷UT0܈Ji‚ÓB4 ”'¬NúA£T@ iÂj„8º€jÈoBTÔ0Ü„© Lå•bà6¨a"SA@˜ ÂThÛ„€ð€€0•žž‰ü La*ãTî&§Q¸ Sy£€ö ¢ã‡)ೊ€ß'qÔúðnÉÒx$Yù38±B{¦‚€0•÷xçGÀ@@˜ ÂT T¿#º€ñoò€7òF•]£·MÊ·«ðŒv¸Ø€Ðƒ˜€êy$ :p#>! :pUþ0ð9KÀ„;M@…€«’!ೌ€ÐŠoxFËfÁ¾  :pY>"`Â3 ¼’7x·p9šÌ¸çh¯/`¼8¼‘k´½c§ž«Bs¦Ò]À„ «pcz ˜2au­€Jßk1N@㈀ðÇ Kðš1ý÷S?Ü”|ÿéR=_pÓ{@\˜a—`C@s7&& ÒM¨Й°Z+R# ‡€+" ¨¬ýåŠV›Êü®jîô÷ ~žîZHV5êmGÀõ- @­€ÊÚ+qöÛ4*ô€€ KÀ[‹7 ¨ÂÀåPæà?[ï%G@u ´âM>UÉÚz¹º!àrä xiÒ^À§ÜЏ€Ï¹é@@h ÂTDÕ+´ÿáŠ`.G¦€çzsY@£YøE¦’+à_i„F L%[Àÿv" 4BоçC@èD¾€}.ÁWfY@c›Q:º Þ ÂT <&¨ð£¬) ïë(p9Þ)àýÀ! ¨”Ô¦CÞï&M@{`û ¨oùk1•~…•Ô®Ëø–PøEþɰ€îó'B+Ô!Œ¦- 3®ãÔ)6Ù(ëp¤26" ŒaŸ—€€¸îæSÇ+Ö„'#½$,Âûô*w àIÐ C@hÃ[4Ú‡€D¿­è<Ÿü€PIŽ€.3¼7!àÊ L啺Z!àWQÆË€0e-ÂXfâ~ýÂ@¦2N@qÂjc¾ÜaŠV¿r•§d°½ð6&hLÐêЪ?ÊèKð˜¯U»:#à.\ãW  u7Á;aµ¶¬Õl×çÐuÕ×^x#þ¡Ž€úŽfV#àö 0qÂj§Æüã´#ÝPÜif&3‰€ŸaYŸe±i¸3¹ÇaŸ×`Qõ'\̯ۂ€™ `[0l˲Š‹N@{°-˜ ¶3A@›ºQ×Oeo;p`Ú…Éïå,/- §i8ˆ~*} Ï` …52 XÊŒÐWnoÆÜpÀµ|½¸R¾\@{—Ðù›`0£W”p²CÀPdóD€op*¹ŠÏ ˜ïÑy³€&M”žŒ_(`ÖØ#àÔù_zyLØ-”E@‘S¿änAÀ¤ÝBYA@ùŠÝnYu  Äy˜Ú-æ­üçôG `#ª¼—>+ ÷ñ ¡œ³Z¬øVzƒŠÄ@“5ïîA@%†Xl&`NWï:Ð[û£¬×¤òˆ€­Èк¡îtËÞ\Ìïb­®ü®€ž¨Ÿçž :E ˜ó‡Mo \@åкP/*`äù Û°“€™C£‚MÏú¢q.÷AwÅ%ج(ÔŒ€"XOÀìûŒáØÍËP{¼P!!`d¢©Qøì~«Ð3@@qö`\\ÀhÛƒ=9T@cöàÙ‡ Øÿ!»û¢Œ¥L#ÅF\‚SÀÐü¯ÅÊmGÀ"êÔ”j!`Þ|Áv¬0ykŸ3 Øö¼FcØQ‘%4Z˜% ÒÂEd}/ÁK 8£6áÛeß" q }»€¡Kz :Ÿ_[02D¯К=8!YöÀ´Pë…t:`”€Þâc¿! lO€fÎPÌ€zÙ· ˜Írö~ÄIÇÛeï·.«ž@û…€™Ê°NŒ6D¨íÈÐ2.EÀD_WPj}™€zºº¿•¢ý­¯ ÊÙßI@§ÃõíîBäì|eLÀÔâ¯Ð}à ;òì'`è^N^8Bß‘å ;HÔ‹ÚÅÝ-ùÛM@e­ÇZ`­l" x˜>«Lù¸€V¼ÝYˆ€!Â§È  †ë,! Ðü5!B ³€ix«ÝE@%¬! ¶ÃZ0zEë<Ì£tÚŸ$à_¯€çîaÄ.ÝGÀÌNC@¼vX  €šj’€%ð\F@áÃcÏÎg+ž-ð^wúS´{TðY }¿D¸mk (µÕ/ p¨è1 WÀPßÛöM¯øÐ¬ê‰>Êû&Ô´%tûsŒ€¡ËÌ.Ú=HÔ4é¾(?_'W+t°Z@§GžÏlšÜ$ñ5’¦eÞRÌmÐ6ê;ú ¨ìmÒk$M° e>³{uÐùÔG|¤é@½€ò[+´%Ò wtžlä×Pš>"`B’x<Æ » Ûiºè­óx¹€väWtÃ0$ ¿WÏž”Æ#Ò¿©MCÀÔm, ’⇠ù¶‹]ô—GÀ^ž_ ÷Ms[„€x `.- ¤®PlâÓ 5Q@é¨0ŽzëÉlZ­€õc+fµ›fìÐ…h (|Zý"U8;~J@ÛŠ½R'(Þ3ï* N±€ ½—ß¿ÊYp«GÀ¤ ¸§€Â£Æ¹EÖP¾'ë( ÛJ,G¹«ïÐø''(ò}ó“gÄ ·f˜€ÂEÙ+ [ÿ¡œµ˜€éÝ6QÀºûˆ€÷ÜHÆôp¿ÔéZ+AÀâÆ)©GÖðœΜ ÎZ+m_K h¼ºµ$ ˜Ù<éÖÏÕmiÙÉòYM@Wƒ5”êìq£z‘} 6'¶Ï‡åÇð(~ƒ‘"ÒsçHZc‹€^ò|/ÁfŽ g@ .ïðµ“/Á(®Ý‹8UeØÓ¿ ï(ml)`^ûì¹›³¸€ÖÇ0Ò‡2c<;µ¥€©!›¨A»QîŒpû¸Ÿ€z„GÀ{ÝáDÀ¥‚€iCÀ&x|®qVÙc¾/ €€ÿX]@%4«¹€¾š££¤¢b*Ôx½€Ö¦€zÉ/ øX„€5ì,`ò¡d«-dõ^üœ€ÏÍPú3Âæ  ^4q¨•´˜( ýï˜ã:êD"ä °’¨œ¿€N‘¦ú‚°ó|Ô©Ð_ÐÓ*œ“Ìbº€òôÅ]4#…öŠéFN÷¨# ¨¾, ²"…öÚ›•»èÙàT€:’€¦h-tcõñ*ðü¿P@½ çi=$ óæBÀ<­å&zcg h87HÀüŽÌ­£ô7S‘8:™Å jJðñ¬B@kb‰­Ìõ]…“¯W@ç”hïE@ƒÞÃùóù Z“Ô*CÀ*Æ è®ŒÐŽ|ö´0ü›o´ø‚€ú¨:I¥Fyj ¨ì ×2V€ÊÙãFØ{ô/.ÉPtd>¨Õ®x©>Ëù†›©½„ Zì!´XK@ÓýÇ4…ÌàßÙ;D@Ïr´ˆ è¼×·Pyª–ã  Å‹”‡‹@@;Å›|, V`ln.`WÿÐI! £•²R@˨®–ƒ€ßP0Ê£RD@) ?!àáüBË- µ¤»€æBoŸ»ü½Ôç$³G][y·€Â;&,à³ç$³XX@{CÊ%Xû÷.8'™ÅB‘¿~ ¨ý!àœdK hU€~Љx…€OÆ¥ÝÙïVÓLÀ«üCB}e²€Fó0™O ˜ßq†€BôxïEœ”Ìf˜€RttÏH=G§Üšj@@‹7è¿8÷Ð;è†ΰwpò„Õ£”ë" ytÊÙ€ÎÆìd àæŠV[—àŽV0Pß{tã΃nê‹{¼-i0aõ'Ï€ú°5¨0"zJZž°z)ÝìÅx:au¶€Yý&©;ò‡ëÒPˆý´#ÝÐ9 ²£€×ÖÖöõo¹ß„øMi. ©Ý³$— hk‘p)õ¬j÷Ø9™Í®ºûpH2›ñ>ëúÕØShŒ€Ú‘!`çd6gkçkµeýµúŠ€C’Ù,$ ¾»€w2ìDD@g„óô_ ß#ࣄÕdlÌFPzóÐçK¾€ÊXóWàìEÀ!ÉlðÚ« h7»¡Ýd#à€Ý“Ù\Ž ÐëˆP&G@³º\õ °_2›G@qÄ>#`¤Ý•½» ø0QÀˆ\)eš hÎâëLpŒ€ÝXZÀÐM¾3™ š¹Îc´lë >܃æô"`‡d6ï0\›øë“6Zõ7°³ hõ¸µc?¯³vJæàµj/“ÌaaÅ禖ÞAØ4 `ßd{˜Þlì›ÌáK^ö¸û*l, jL0Å.¬ƒtþŽÀS2”ó>rlŸÌá[ú”y—€­ï)]0ÑM@ï>|K2åë]DÀÉV0ž@^ Ç=U#`ûd/P¨>|g2´ã°g2ßg_0#& Ò·65²Ìì8ôUÒ™o è-È€r%AÀ;‡±‚€æÁ"`?ЊCÀžÉ\Bª´¢Ü°1¨1AÀ»°¼s  XIgðÎá0’*¡H4^^‰"`Ïd.hn& 87’1áá‹Ìí8œDåd…׎ÜdE  ¸Ÿ€ÎöìdE|T@=8+Ï-àÂþUOXm ØsÂjGï.à²'ÀV[Ë '€rܪþï8ƒrÿÌ3N¡“ìAÀU(þæ~)KVÄ;ôÆfÔ-,fÄm" é†~PÀ»°‚•~’#`AêåüèKÛ‘U$/,n^þGlìÈRúø„€êYÜ ¼p °zàpI€}AÀHŠqÖ¦YŒ¤HÑ¢²~|e² p]0’b”€ªúJ¾&ß°~àü%Ø…€å `,vc9R¬«_™,\Œå&`‹g©õ@ÀXŽ„äXÎ7l‘cž€ÿµß–,\¼rTXÛ|c² p]>!` ¼c?PÀ ýCÀ‹ÉªÄš>žø˜€;^ð瀀'UÖ×€¯K6œžÌðúß”l0opGð瀀'S @À&Û |a²@À&Û |a²@À&Û‰-ÿ á|øÂd[€ïK¶Ø$W]²Ê¦L ¯­¼NÀ¥=£¨0aµ±†€Åá˜PRš¬ÐXCÀâpL(ùhn”Wz6å}á+·}™C—&¬þ™—`€\2ü‹]‚:‚€0qÂj„aœlñ`4ˆ³)z$®¸¾~AS^W{Mô_¡â MÂÂΛÛö`ÞìpóãEñÓîh†òðºÚk¢¯þ.ÌÐ$ü(ì¼¹m%ž!à¯V@_#º¶ýü«ŽÒ m ;O«Ü׆Žmeþe'пšÎKNlYøùëðšðÒèkÜФ wšðÒÎû]W˲£¿*¯éz9¯ý×ZÉaò0$ûG±{xUô5ˆ…~÷)¬¨ó.ýËj¯‹® æÍ¾ß‹ç›Q{IŠ®¾—‡WE›£á鶢λô/ë¼m¯ëzoÞìèû\ÞŽ},ï¼»À—Γ&àQïŒoï²ë)#§š®ýý­?œ~,Éì#²’øœGé è*=éø‡kÂÙý¾%î¹ðÏ–u‚œz¿‹®¿qûœO~=åªgj}ØŒ§+Lÿ=¹Ùkâ•uŠÈЊl®pSŽž—2VÐÑÃ06y¶½3£çFFÀzÄÀ¤ v^?Û x#{1:°Ñj¯R@çÑ~eùÑö÷€‘Ï·‰öOÀbÿ0. 7:Š!eÛìs-DJrëù>MXœ‘SmVO×.{Zé6è.5öèá¾ríP‹¸çÉû˜ãñêÉÐÇEð8é²£½Źedzu§=­ˆ_»Ò?¼&«wýóÔ¦^Å vb¤ÆiÑ^"§L§)™óP†‚€0„¡ a(CA@ ÂP†‚€0„¡ a(/Ð\Û@Àåâ? \.þ³@Àåâ?‹÷ h: Ò;þÃ@Àæñs@Àæñ0‡|Yü›2ØKcÞ NE¶,Ñ¿§.Œy+4| É¢€ûŽÂ˜·‚€SQ*à¾xlõVæ•§¡LëÞöc©:³žô3(’E½ËÃ"ö¡0š÷€ÇúJB: hŽH¢ôkõ.PÅ1oç¢Zíaµ1{‚€sñº i+ …€™ `U0¬«béb`:Ø6fò6[~M‡€ @ÀªXX VÅBÀZ°m,ÌÛÆBÀL°m,ÌÛÆBÀL°m,ÌÛÆBÀL°m,Ì ¡l+ˆx—# |­Ëò¶€^éǃ€ZKaµß¹" »åŽ47ï’˜,`àLèÛTC[M@Ï2”;)`ª¡Fæ¢ ÙÖj  Zx!êT'ÙŽm-nPé è^ódÕù¶OÓ[ô h´n¬P »y ª»ŽE·¾ÑvÝ$ ÷?Öx–LŽ)S¼OÀ³!MÀýfX2Bš€g_‹ì‡(”ZVÀ}ÑÞ,¦­)œ'Ä:iÏÐ7"’­$Q@yXe,vö‡5„€Æy(0O”Ð!þBùØB@¥cÕ' ÚšLPÍöªØbn¹²È BfЯ*k] ¸ÎNX@Ñd$‡<Sï#ýhÕ BôKprL‘¡“ÛMz§â½Z+©‡yÇ› ¤Í‡¨€&|\EÏCô´ÐÈ4gðï¡ükøíc7õë# Ö¼½ ì+PÍVK¶NÀðñ7ÐØÏJT/h3ì)`dhs–ß)``dEÀ­TÀs×MŠvƒÙÆ’¼(†€U1‹tºÎ}–+~í‡ è¹áí¿]@«Ýu<¶ß, Ú§ó(¶!à—7¨…ï)`Ä!½X•€² "`X ­Í4²M­ÒFÀÍùο»PD@ô ÿû/C@7óDít^. Ûoð AÀXºN¥õ”§æ îé" Ò¬Ö¦wô_ (j—è¼G@ÿ»9ñA+b¡€¾VbÇæ¬ ^Øõ´OÝ<zKk ¨EG@…× è«Ñ¢òïŠîP…€N-t2ó2AÀDb*çݪÕNÀ@ÇO  hµJÀ@‡€€›õÐÛ1‘€q«œØ’¥ônKÝLÀÐywj! ŽPf­´¬g±!`˜g (ÏNC&„³Ø÷cÜ, : <úE×00PöЈ=ïðü!ceëÁûbŠ€—w3@À k¸'^(`Ô„Ç H¤§€zÊiÔi=¸óLG+•) S (  œÍ½O† èd#Ë»KjÔi=¸ó·èÇ+0–¢5ÂÄôöV xô~3.4¢üÓÔŒ©Póùf…bn)†[ è·å-Š~F@»†WtŒ€ñf/R´nÞͶ‚€Þí’0Ôè&zÖÝP¯z)`¬¬1Úö¥4Þæ— (û,Úè&zÖÝkGÓÏÚÛå§ðú|œþsh*`à”­:#Ó…ìËzELÉÂm$¢Òš¿B¶€±éBö½æc¼Ê¡„r½x¥·x% rôuÚç§¥€Ÿî# z>Ü2^‰T¼ª xÖxƒ€û¢½ù\V§¸ìëp§ÐÍ$ ‹,›Pæbº­|”Š®1¼7ªúnE™ý·!·Âð¯RdºpÌÙÔ{v”€ª v;ý”ôÑMÉÍŽÒIÀØt!û&½&^EpÖ¼RÀèt![,æ0SÍ@À³åüRýE´ò.óÉðh®·€Föj¸â(0Ÿ ÝKÈÐ2OöI̤»€¿‚0㙚Ày>µ* ^Ï/3N@½–P=å—1îð hK:ܼOA?%ÆzŒÕ¼KÀ_[óÉð¸c* `>oP0£€VÖ¨nߎÝUªåpF/b  |2¯Ó~³€â_ h¯9ƒtâ# ¶åŠ´ÕË0tBlýÞUsÕƒ¼E@_3ì  _.EÀóâ'bNÝWÍXC›EðŒc¼È\ƒ±P­oLŒ€Z…‹ö0©Ìug-W@ãm¼n1PÅ-½”"þ†€€Y]‡€v&¸oB@±ýXë(àykxTŠø: èõ¬ªy‹pÊámÍ.;…€{e71‡ h¼=k (#"` XÀ<ÚûpÛ¼.ÔA@LÀÄÔïP½“ô¬‚  S#P>é†÷Ë xµ—°Î?lHµ€–Š››ù SRG@¥òòú§a”€«žÜ•LM Hb‹ýx! ñž. HeØ›DÀ3•· ˜/Å4î¯ í«ÌÄÎÐ+†€×¼PÀúÓ.R ¼·ËÄÎb*Õ BÔTöÐñv•ÚPŸŸÁ»aïwã¢Öœ»–Ç¢ Yk”‰|3PTùVíaq]ËOÝ<˜KÀ}ñØø‘Vmú‡‹?A/-!`UÝ¿úbñùf΢Mò9¯¿¥ï5휽¨k‘jUYM2þ•ö'чE,¨/––ÐJ¥Ã{Àc=ðÆ ê‹¥B«3 L" :AˆúÝÌ+¬w0—ðÛG¬ªÿ4õ› «êGLhß)`-Æ?SX –P"`(P3" ±²Äô«…TŽrQ­×–±®€yÅÛbŽÙÕÎ …Ú€¯ð/©t3ʯŒ€Y  ìu@À½ql–°ÿ$V0d˜\rv#`f VíÁP-­V®p(OÐ>)Ë ènEÀë@­2Úƒ-/ %àJþÉ7ʳX/ŠßÛ¥' ¸Í"à~†! 6!K@ç®&Úþ·ø¶à³ùÒÜ% q÷½SÀ¦40§[€€Å ` îÐx‹Ø +·!`ð]:G4Cúˆ€CA@Ê› ¤øZ§Hp(- žû à¼Ì>"àPê<ƒ]+6a†ü§P‰€-˜!”åõìÊòú ö¡ÅW Å  (¯¯ `P”×W° FA@ˆ²¾€_3?öÝ83(Êë+ØåõìãÔÒè( 4 I—F¾ÎF@ˆ²¦€Ò \”¸oEÀA@Y^] }Ïu  ,¯® `"àÐòg• Ú ö• Ú ö• Ú ö• Ú N ÂP†‚€0”Až)&Úƒ€ ‚€0„¡L àžˆO¶€N9\ƒ§ 軈€“r¿€§ƒTþ ßÉ ¥øNڸ߃ҽ¯zƒÊ“åAÀõh"à~+hçÆæ[ôðÛ"LI䋳tm;tï’€`ÓRÀMÐ'äóA@°ÐÏLæ„ à´´º;5ƒU¿廹°€éò à‚ô0Œ- Û2¾„¡ a(ƒR àKA@Êý~ÿýá„I™DÀ wðQôðûp£€ø·"3˜7x!à£@@Ê²ß ÂPîP~ã‚€/§›€\ hôb1ðQÌ!`Ž;ø(: èK€àÒW@qiE@pA@Ê…Bø^ÖÐ(ÑñoI†‚€0”õ´~½…€ës¿€Î—ÓF-ÇÂ"àútÐÁå9Â’ eM‹êÁŒL!`ø$òŒLrÁ%[ÀØt!×1›hÊ.Ý0#¥ªÓ…\ÇD@p)c†§@@8Éœ'Ä«˜.d»-qðí} ŽMÙT@ü{Õ—`{ºë˜ž€E !à“(ýFŸ.ä2&‚KõÑÊ»ÈdË BÀ'1â_BjÜð9Œ°P |CA@Ê@küAÀ§°¨€ç0kƒ€0”qÖ郀a(C¹]ÀÝœJ{ð! ÐýIVø†2JÀZyð! e€Õî àC@@ʰ!• àC@@ÊëAÀ‡€€0”Ulð]6ÌÀÂâß@@ÊͶ›Ñ ŸÁºâß#@@ ÂPÖ°Q ÂP–žA†€‘ B>©÷ˆF@pI06Aˆ{—J„d²T'ù¤Þ¢Á%Ô/Á‰ó„ œd΢Mb™Ç{@( ïSp³ÚƒÇS~ ¶'Iž'Á%ûk}‚ô!¥‰Â3)ÿ":üö!™Ûÿ%¤C{°0CA@ ÂP†‚€0„¡ a(w à€€0„¡ a(CA@ ÂP†‚€0„¡ a(CA@ ÂP†‚€0„¡ a(dɹí¯R»®mj?¾vdº}ùÞ„¨ýªÚ±éBΕ¢ö»jǦ 9WnLˆÚ瀞.ä\H$_Ù_­àЄaĦ èÏ÷ ¼_¿ë1þÁFSò‘Øý4]ðÙúbÏ~mWÔÞÕQ Eí­°ãFf~IÉ—‚î¼Ãê,ÄWŠk×µ]Qûü¥’-jo…72ókFø©0”BÏÌ¿ç( ФvaÇYm‡Rè–yq ‚|Ûÿˆ§ŒªEµ¯ÔKÛ.®½ŸY3%À±¿¢viÇ}öËeÑ¡ïm×t{4¼û[­ôZú™H©>3×ÞOcY€Ï1†•tÜ.EÛƒj_ò)Fäïi=¥T®½©ížˆÜg—•tÜ.YÇ5ȼ®Û¯Âç9^ÍÅÙ¼TÀâŽ;ö?OÀ­à£ôçx?q¼23UÔ®û> ¸vô˜/ƒWQÇíÕ¶¢Žk’ye·”ó$ˆ†ï¹ó‚IEND®B`‚milkytracker-0.90.85+dfsg/resources/reference/xmeffects.html0000644000175000017500000005016110747460061023255 0ustar admin2admin2 XM effects comprehensive help

XM Effects Comprehensive Help

Abbreviations: ST means SoundTracker, FT2 — Fasttracker V.2.

FT2 (and hence ST) has a separate track column for effects. Some widely-used effects can also be implemented using volume column.

Effects placed in the effects column

The effects in FT2 (and also ST) are being written in three fields: first (number or letter) means effect type, second and third — effect parameter(s). Effects may have one parameter with the byte lenght or two with nibble lengths. In this table the first case is denoted as "xx" after the effect type, the second — as "xy". For instance, 1xx is the one-parameter effect, and 0xy — two-parameters one.
Mnemonic Name Parameter(s) Description Comments
Standard FT2 effects
0xy Arpegio 1st halftone, 2nd halftone First tick the note is played, the next tick — note + x halftones, the next tick — note + y halftones, then repeat from the beguinning. For instance: C-1 037: first is played C1, then C1 + 3 ht = Eb1, then — C1 + 7 ht = G1 and then again C1 and so on...  
1xx/2xx* Portamento up/down Speed This command is used to slide the sample pitch up or down. This is done using the speed value. If Amiga frequence table is used, the sliding will be non-linear (the speed depends on the frequency). Actually sliding (really tone stepping) is being performed at every tick since command is active. So the final tone depends on the "Speed" parameter. This is true for all slide/portamento commands.
3xx* Tone portanemto Speed This command is used together with a note, and will slide to its frequency. If glissando mode is set (by E3x command), the frequency will be rounded to the nearest halftone ST has some quirk here: the tone stepping is performed at every tick except first. So if we use two successive 3xx command, during the first tick of the second line we'll obtain the same tone as at the last tick of the previous line (no stepping when line is changing). So there will be no time-linear portamento, alas :( But this isn't notable at normal BPM.
4xy* Vibrato Rate, depth Adds (frequency) vibrato to the channel with a specified rate and speed. Set vibrato mode command (E4x) can be used to change the vibrato waveform (see below).  
5xy* Tone portamento + volume slide Up speed, down speed (see volume slide (Axy)) This command execute both tone portamento and volume slide. The speed is used for the volume slide. The tone portamento speed is being taken from the previous appearance of the tone portamento (3xx) effect.
6xy* Vibrato + volume slide Up speed, down speed (see volume slide (Axy)) This command execute both tone portamento and volume slide. The speed is used for the volume slide. See comment for 5xy.
7xy* Tremolo Rate, depth The same like vibrato (4xy) but affects the sound amplitude rather then the frequency.  
8xy Set panning position Position 0x00 — leftmost, 0xff — rightmost.  
9xx Sample offset Offset This command should be used together with a note. The sample will be played from (offset * 0x100) instead of zero.  
Axy* Volume slide Up speed, down speed Slides the current volume up or down. Either up speed or down speed should be zero  
Bxx Position jump Position This command will cause jump to the selected song postion and play pattern from the beginning  
Cxx Set volume Volume Sets the current volume of the track where the command is, just like volume column. The volume should not be greater than 0x40  
Dxx Pattern break Pattern position This command will cause jump to the next pattern and play from the selected position  
E0x Set filter mode (Amiga only) Mode I don't have Amiga so I can say nothing about how this command works.  
E1x/E2x* Fine portamento up/down Speed This command works as portamento up/down, but the sliding occurs only one time per line.  
E3x Set glissando mode Mode If mode = 1, the resulting frequency after implementing this command will be rounded to the nearest halftone.  
E4x Set vibrato mode Mode Mode: 0 — sine, 1 — ramp down, 2 — square. If you add 4 to the mode, the waveform will not be retrigged when a new instrument is played  
E5x Set fine-tune Tune This command should be used together with a note. It will cause another fine-tune value to be used.  
E6x Pattern loop Count If count is zero, the beginning of the loop will be specified. When a non-zero value is used, the pattern will be looped from a loop start by a given number of times.  
E7x Set tremolo mode Mode See E4x (set vibrato control), but for the tremolo waveform.  
E9x Retrig note Interval Retrigs note with the specified interval. Realization of this command in ST (v. <= 0.6.8) has a bug: effect is not working when BPM / 53 < Interval, the effect is not working.
EAx/EBx* Fine volume slide up/down Speed This command works as usual volume slide up/down, but the sliding occurs only one time per line.  
ECx Note cut Tick Cut the note at the specified tick. Note that it will only set the volume to zero, and the sample will still be played. EC0 combination doesn't work in ST. But hopefully its rather useless, 'cause it can be replaced by simply setting volume to zero.
EDx Note delay Ticks This command will delay the note by the selected number of ticks.  
EEx Pattern delay Lines This command will delay pattern by the selected number of tracker lines Realization of this command in ST is extremly buggy. The delay produced by it is right, but: 1) just before the pause, in the place where this command is met, the note in the track where the command is, is played nevertheless; 2) other notes placed in the same line as EEx command will not be played after the pause left.
Fxx Set speed Speed or BPM This command will set the speed or BPM value of the song. If value is less than 0x20, the speed will be changed. Othervise, the BPM value will be changed.  
Gxx Set glibal volume Volume Sets the global volume. The value should not exceed 0x40. In ST valuse greater than 0x40 work as they would be equal to 0x40.
Hxy* Global volume slide Up speed, down speed Works exactly as volume slide, but it slides the global volume instead.  
Lxx Set envelope position Position Changes the envelope position (measured in ticks, as in the instrument editor).  
Pxy Panning slide Right speed, left speed Slides the panning position. Works like the volume slide.  
Rxy* Extended retrig Volume change, interval This is an extended version of the retrig command. Volume is changed according to the following table:
None   Unused
1-19+1
2-2A+2
3-4B+4
4-8C+8
5-16D+16
6*2/3E*3/2
7*1/2F*2
Realization of this effect in FT2 has the bug: the first repeat is appeared not after at the tick set by interval, but at the interval - 1 tick (and then the note is played at 2 * interval - 1, 3 * interval - 1 tick and so on. ST realization of this effect has the same bug as E9x effect, so it's hardly to trace, whether its behavior copies that of FT2 or not.
Txy Tremor On time, off time This effect will set the volume to zero during off time number of ticks, and then restore the volume back during ofn time number of ticks.  
X1x/X2x* Extra fine portamento up/down Speed Works like fine portamento up/down, but the speed will be divided by four.  
Extended effects (ST only)
Zxx LP filter cutoff Frequency This will set the cutoff frequency of the lowpass filter. To switch off the filter, you must use Zff and Q00.
Qxx LP filter quality Quality This will set the quality (resonance) of the lowpass filter.
Notes:
* If the data byte is zero, the last nonzero byte for the command will be used.

Effects in the volume column

"x" in the name column means parameter.

Volume Name Analogic effect in the effect column
0x Nothing
10 - 50 Set volume Value - 0x10
6x Volume slide down A0x
7x Volume slide up Ax0
8x Fine volume slide down EBx
9x Fine volume slide up EAx
ax Set vibrato speed One half of 4xy
bx Vibrato, the parameter is the depth. Second half of 4xy
cx Set panning 8x0
dx Panning slide left P0x
ex Panning slide right Px0
fx Tone porta 3x0

Some more XM features

XM format also contains some features which are actually not effects, but often cause misunderstanding. First, one should remember that each pattern line is divided into some ticks. The number of ticks per line is set by "Speed" parameter. The number of processed ticks per second is determined by "BPM" parameter according to the formula: ticks per second = BPM * 2 / 5.

In the instrument editor: One time unit in the volume envelope is equal to one tick. The "Fadeout" parameter determines the time of the sound decay after the key will be released. ST has the following strangeness here: in the editing mode the fadeout is implemented independently on the volume envelope. But while the module playing the fadeout acts only if the volume envelope is turned on.

Frequency table: if the linear table is selected, the frequency shift will be performed at the constant speed independently on the current frequency.

This document is composed using xm.txt file, FT2 embedded help, ST cheat sheet and my own experience.

(C) Yury Aliaev 2006. Distributed under the terms of GNU FDL.



milkytracker-0.90.85+dfsg/resources/pictures/0000755000175000017500000000000011317506162020275 5ustar admin2admin2milkytracker-0.90.85+dfsg/resources/pictures/carton.ico0000644000175000017500000002362610737746457022312 0ustar admin2admin2(fhŽ èö ¨Þ 00h†00¨î( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿf`öô÷÷pw÷ÿvfw÷ÿv`vwöÿvpffgv`ðtÿÿgðÿgoÿgðp÷ÿö@ôföô`üðÀÀÀÀÀÀÀÀààð?ð?ðùÿ( @ „h ®~WºŸˆÆ±œ5"žS+ÿÿÿ’u[Ù·òѨ'<jI-}m\Õ¥p«s1ܵ•ùþÿÿÿûrS8³t“V9'òñðøþÿ­V¸¿ÂÿûñÈ·§»Wú¡}VF/‡F0„zaþÿÿÓŸ‚æçÝ`ÿîÙëúù¸£“#Âqÿ–sgB©†býÿÿŃ[õÕÆ®«’ÍN4ÇO1ó“±L ÿϱÿðÛ¯…PÞÅ¢½|"Ò¬ÿ»›ërV˜baBÿ§Z:‰R!ÔœCÿðÖò¡ÿûòèÑ´zJ3b2¸||:ÿ’*C͈jâ—Uþ~UúâÓûõíÀwBÿ‹>ªsgBé‡/Ä€_Þ©tûPöùêõãÑÿóÒû„9­uS6®fÿ‰H݇cæiùMüÿÿÿáºÿ‰Pµ~V4¤[DÿêÂ÷åÄù~QðïâöåÓéÌ©ÿ¸Šÿ›qt? ¶hÿÿþÿÔÆþ÷èÿíÊ‘iK´|D¢}eLZLwTh2hZw2wTweZw2hTwehZw2ZTwehZwTe2heZL Le hheh hLLeeLüðÀÀÀÀÀÀÀÀààð?ð?ðùÿ( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿf`föö`Dÿ÷ÿô@D÷ÿwt@ww÷ÿwwpwwwv÷ÿwwg`fwwf÷ÿwGffFfwgfÿÿw@ff@FdGgf÷ÿw@ff@fdGgf÷ÿw@ff`fdGgf÷ÿw@ff`fdGgo÷ÿG@ff`vdGfo÷ÿt@ffpfdDgöÿwpf`fdGwÿfo÷w`f`ffwfÿfgwff`FfwDÿÿGôGvf@FwDÿÿÿôôGf@ÿÿÿÿðgÿðwÿÿÿÿwÿÿÿÿÿpgDpÿÿÿÿpôdw@Gÿÿÿÿ÷FDgÿÿpÿÿ÷d`ÿÿÿwffÿÿÿwf`GÿÿwDÿ`wDÿfwÿDÿDfÿüÿÿðÿÿÀÿÿÿüðððððððððððððððø?øüÿüÿþÿÿÿÿÿÿ€ÿÿ€?ÿÿÀÿÿÿÃÿÿÿÏÿÿ( @€    $ (,/1259=@BBC F$I(L-N0Q1S3 T3U5W4X5Z4]2`2 c1 f0h1k1n1r1t2u4w6x9y<y@ zB {E|G|I}J}K }K }L}O}S$V(‚V,„X-‰Y-S$‘P”Q—Q˜R™U™XšZš[š[ œ[ \^_ažcŸe h¢i¥lªo®s°v±w³xµy·z¹z¼{½{¿{ ÁyÁyÃyÅ{É|Ì~ÎÐÑÓ~Õ}Ø}Ù}Ü{ßxâv"èq%ím+ñk0ói3õh6öh8÷i9÷k<øk=ùl>ún@úoAúpCúqDûrFûrHúrLütOüwRüyTý|UüWýƒ[ü†]üˆ]úŠ\øŒZõŽXñTí‘Pé“Nã•NÚ•HÔ•EÊ”CÁ‘EºF´ŠO­†Uªƒ[£‚_œe–‚j™†nžŠr¢v©•y´šzº{¿Ÿ|Ä¢|Ê¥~Î¥}Ó¦|צ|ݧ|ã¥{ë¢zõžyúyüœzý|þ þ£…þ¤ˆþ¦Šþ¨Œüªû¯‘ù¶“ö»•òÀ—ïÄšëÆœèÆžèÆ¡èÆ¤æÆ§åǪåȬèË­ëÍ­ïЭóÒ®õÓ¯÷Õ°÷Ö²ôÓ²ïÑ´êиçлåÑ¿âÒÄàÓÉâ×ÍçÛÐéÜÑïÞÐóßÍöáÌ÷äÐùæÕúëÛüíÞüïáûòåúôéøôì÷ôîõóñóóòòóóñóóñóôñôõñö÷ó÷øóøùôùúõúúöûúøüûùþúúþúûþúüþûýþüÿÿÿþþýþþüoooQQê}êQQ66æêê·êæã66''ÔãÔæêÄêãÑÔÑ''ÆÑÆÑÔæêÆêãÑÆÄÆÄ·Ä·ÄÆÑÑ}êÑêãÑÆÄ·}·}}o}·ÄÆÑ}}êÔêãÑÆ'·}oQo'}o}·ÄoÑ}}êãêãÑÆ'}oQo'6}o'6ÄoÑ}}êÔêãÑÆ'}oQo6Q}o'6ÄoÑ}}êÑêãÑÆ'}oQoQo}o'6ÄoÑ}}êÆêãÑÆ'}oQoo}}o'6ÄoÑ}æêÄêã6Æ'}oQo}·}o'6Äoo}æê·êãÑ''}oQo·}}o'66oÑÔæê}êãÑÆÄoQo}o}o'6ÄÆÑæêoooæãÆÄ·}QooQ}o}·ÄÔãQQêêQQQÔÑ·}oQoQ6}o}ÆÑ66êêêê6Ñê66ÆÄoQo6'}·Ä''ææêêêêê'·êê''·}o'}ããêêêêêêêo·êêêoÔÔêêêêêêÄêæo·ÑêêÑêêêêêêêêê·o·6'Ñ'ÑêêêêêêêêêÄã'o6··'6Ñêêêêêêêêê·6Q66QÆêêêêÄêêêêêÔQ'QoÆêêêêêêêÔÔooQQêêêêêêÑÑQQo6ÄêêêêÆÆ66êêo'·êÄÄ''êêQQ··êê66êê''ê}QÿüÿÿðÿÿÀÿÿÿüðððððððððððððððø?øüÿüÿþÿÿÿÿÿÿ€ÿÿ€?ÿÿÀÿÿÿÃÿÿÿÏÿÿ(0`€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿf`föö`Fÿüÿö@Dÿ÷ÿt@Dÿw÷ÿwwt@Dwww÷ÿwwwt@wwww÷ÿwwwwpwwwwwÏ÷ÿwwwwÇpÇÇwwwÌÏ÷ÿwwgwÌl` lÇwwwÌÏ÷ÿwwFgÌff lÇgvwÌÏÿÿwwDÌffLlfGvwÌÏÿÿwwDÌff@LfDGvwÌÏ÷ÿwwDÌff@LfDGvwÌÏ÷ÿwwDÌff@lfDGvwÌÏ÷ÿwwDÌff`lfDGvwÌÏ÷ÿwwDÌff`lfDGvwÌ÷ÿ|ÇDÌff`ÌfDGvwÇ÷ÿtFDÌffÀ|fDGvfw÷ÿwtDÌffp|fDFfwwüÿwwtLffpÌfDDwwwöÿwwwpffÀlfDwwwwÿfo÷wwwÀFf`lfÇwwwÿfÿfowwwÌff`llÇwwÿFÿÿgvGwwÌff`LlÇwwDÿÿÿöôGwÌff@LlÇwDÿÿÿÿôwôG|ff@LlwDÿÿÿÿÿÿGwÿôGvf@ Çÿÿÿÿÿÿÿðwÿð f ÿÿÿÿÿÿ÷ðgwÿÿðwÿÿÿÿÿ÷pÿwwÿÿðÿÿÿÿ÷pÿÿgwðÿÿÿÿðÿÿÿôfwwGGÿÿÿÿÿÿÿ÷÷FgdtGÿÿÿÿÿÿ÷p÷fft@ÿÿÿÿ÷pÿÿvflgÿÿÿ÷pÿÿÿvfgÿÿ÷pÿÿÿ÷v`÷pÿÿÿ÷vfðÿÿÿ÷voöGÿÿÿÿ÷voÿöÿÿ÷tOÿö`ÿ÷tOÿö`÷tOÿö`pÿô@ÿô@ÿô@ð `ÿÿüÿÿÿÿðÿÿÿÿÀÿÿÿÿÿÿÿüÿÿðÿÿÀÿÿÿüüüüüüüüüüüüüüüüüüüüüüþÿþÿÿÿÿÿÿ€ÿÿÀ?ÿÿÀÿÿàÿÿÿàÿÿÿðÿÿÿøÿÿÿøÿÿÿüÿÿÿüÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿ(0`€ €€€€€€€€€ÀÀÀÀÜÀðʦ€€€ÿÿÿÿÿÿÿÿÿÿÿÿðûÿ¤  Ôðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÿ’Üz¹b–Js2PÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÿIÜ=¹1–%sPÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿÿܹ–sPãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÿIÜ=¹1–%sPðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÿ’Üz¹b–Js2PÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÿÜܹ¹––ssPPÿÔðÿ±âÿŽÔÿkÆÿH¸ÿ%ªÿªÜ’¹z–bsJP2ÿÔãÿ±ÇÿŽ«ÿkÿHsÿ%WÿUÜI¹=–1s%PÿÔÔÿ±±ÿŽŽÿkkÿHHÿ%%ÿܹ–sPÿãÔÿDZÿ«ŽÿkÿsHÿW%ÿUÜI¹=–1s%PÿðÔÿâ±ÿÔŽÿÆkÿ¸Hÿª%ÿªÜ’¹z–bsJP2ÿÿÔÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÜܹ¹––ssPPðÿÔâÿ±ÔÿŽÆÿk¸ÿHªÿ%ªÿ’Üz¹b–Js2PãÿÔÇÿ±«ÿŽÿksÿHWÿ%UÿIÜ=¹1–%sPÔÿÔ±ÿ±ŽÿŽkÿkHÿH%ÿ%ÿܹ–sPÔÿã±ÿÇŽÿ«kÿHÿs%ÿWÿUÜI¹=–1s%PÔÿð±ÿâŽÿÔkÿÆHÿ¸%ÿªÿªÜ’¹z–bsJP2Ôÿÿ±ÿÿŽÿÿkÿÿHÿÿ%ÿÿÿÿÜܹ¹––ssPPòòòæææÚÚÚÎÎζ¶¶ªªªžžž’’’†††zzznnnbbbVVVJJJ>>>222&&&”””••ì”ì••—•ììì„쌌•———€ìŒìƒì€ €————€€ Œìƒì€ ——‹‹ Œì‚ì€ ‚ ‹‹ÿÿ ‚Œì ì€ ‚‚ƒ‚‚ÿÿÿ‚‚ƒ‚ ‚‚„Œì ì€ ‚‚ƒƒ„ƒƒÿ„ƒ„ƒƒ‚ ‚„„„Œì ì€ ”‚ƒƒ„„”„”„”„„ƒƒ‚‚ƒ ƒ„„„Œìì€ ‹”•ƒ„„””•”ÿ„”„„ƒ”‚ƒ” ƒ„„„Œì€ì€ ‹‹ÿ”„„””•”ÿ‹„”„•”—‚ƒ” ƒ„„„Œì€ì€ ‹‹ÿ•„„””•”‹‹„””‹‹—‚ƒ” ƒ„„„Œìì€ ‹‹ÿ•„„””•”‹—„”•‹‹—‚ƒ” ƒ„„„Œì ì€ ‹‹ÿ•„„””•”—•„”•‹‹—‚ƒ” ƒ„„„Œì ì€ ‹‹ÿ•„„””•”••„”•‹‹—‚ƒ” ƒ„„„Œì ì€ ‹‹ÿ•„„””•”•”„”•‹‹—‚ƒ” ƒ„„Œì‚ì€ „„ ‹‹ÿ•„„””•””„„”•‹‹—‚ƒ”ƒƒ„Œìƒì€ ——”‹‹ÿ•„„””•”„ƒ„”•‹‹—‚ƒ””” Œìƒì€ ‹‹‹ÿ•„„””•”ƒƒ„”•‹‹—””” Œì„ì€ ‚‹ÿ•—„””•”ƒ„„”•‹‹—— Œì”ì€ ‚‚ƒÿ—•”•”„”„”•‹‹ƒ‚ ìì”””ŒŒ ‚‚ƒƒ„‹”•””•„”•„ƒƒ‚ €ì••ì씕•€ ‚‚ƒƒ„„””•”••„”„„ƒƒ‚ €€—•ììì앃 •— ‚ƒƒ„„””•”•—„”„„ƒƒ‚——ìììììì앃ìì—— ƒ„„””•”—‹„”„„ƒ ——ŒŒììììììì—ƒ ìì——‚‚„””•”‹‹„”„‚‚‹‹ŒŒììììììììì싃ƒ ììì‹‹ƒƒ”•”‹ÿ„„ƒÿÿ€€ììììììììììììŒÿƒƒ ììììÿÿ„””ÿ„ÿ€€ìììììììììì샃쌔ƒƒ ìììììÿ”ìììììììììì샃ÿÿì쀔ƒƒ ìììììÿììììììììì샃ÿÿìììì€ÿ””ƒƒƒ ììÿÿììììììììììÿÿìììììì쀋””ƒƒƒ ‹ ÿ‹ ìììììììììììììì샃ìì—””ƒ•— ‹‹ ìììììììììììì샃ÿÿìì••””ƒ——— ììììììììì샃ÿÿììììì••”•„• ìììììì샃ÿÿìììììì씕•” ìììì샃ÿÿìììììììì””” ì샃ÿÿìììììììì ”””• ììÿÿìììììììì ••ìì”—‚ììììììììì ••ììì씋‚ìììììì ——ìììì””‹‚ìììì‚‚‹—ìììì••ÿƒì‚‚‹‹ìììì••ÿƒƒÿÿìììì——ìììì‹—ììì‹‹ìÿÿ„•ÿÿüÿÿÿÿÿÿðÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿðÿÿÿÿÀÿÿÿÿÿÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿüÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÀ?ÿÿÿÿÀÿÿÿÿàÿÿÿÿÿàÿÿÿÿÿðÿÿÿÿÿøÿÿÿÿÿøÿÿÿÿÿüÿÿÿÿÿüÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿmilkytracker-0.90.85+dfsg/resources/pictures/athena_ft2_style_12x12.png0000644000175000017500000001411710737746457025121 0ustar admin2admin2‰PNG  IHDR °êYô& pHYs  šœgAMAØëõª cHRMn rì÷I„úoƒè!1º‰Oó•ÅIDATxÚbb@Ä„Ì @¡p…@(€Bá  €P8„ @¡pˆDüg``ÑÄaƒ1@¡( @¡pÄa„b€B‘ °ÑŒP@¡ÈŠ¥„"@(zˆ¢¢ €P”ÃÈÁ ÄÄ€ä€BQ@(€Bá  €P8„ @¡p…@,PÏ€I€B‘ xp2üg &°#!N e„ @¡@(Š2€b˜ &HðBtŠ2€bF/Ø¡Ä&!Š2€bb„(úÿ¨ €˜À !þ e„b@]ðŸñ?Ø„¢ € ñq @¡È „‚@±üGÄ<@1!I0 #’€bBN;„b@1!I0 L$@LH —ñˆÉN€bX €`Îùò@¡Ø@P{þƒ¥ˆ ¢b @1A(ˆ‰ÄQVÉ@Lÿ¡!² €˜R,@1Á¢D8àÿCõ,NÁ@¡d€Bq@A‚ª €˜:E@¡p…@(€Bá  €P8„ ˜ÛÀÖ r,Š2€Bá  €P8„ @¡p…@ÐBº „R† ’Óˆ R`e„b@¡p…@(€Bá  €P8„  ’ÓE@ÁS<J ”R €Xþ#¥k€bB¤]F€b‚ ¤Åh€b+†z €@)RŒy„ÈY@@¡è @¡$>€B‘ @¡pˆ‘ªlÌ€BQ@(€BáJ4Š @¡p…@(€Bá  €P8„ @¡p% E €P2 @¡d@€BQ@(€Bá  €à 2 €PJ>€BQ@(€Bá  €P8„ @¡p…@(€Bá  €P8„ ”p €B‰`€B‘ ”z €Pd¥^ €B©E €Pê€B‘ ”z €Pd¥^ x½ x5ÌžŒ„¢ €P8„ @¡p…@(€Bá ãDÝ@,HNc ”à &D ÂÀ@LÈE @¡˜@(€Bá  €P8„ @ÁBì€Bq@¡„@¡„@¡@°DV@LÈQ@(± @( @(q @(Ñ@LHl€Bj=10Jf ·ŠÛÅm„¢ €XE4#@A+qH© @(z…@(­€B‘ ”8 ”p $ç00Š€Bá  €Lc` ¸i €BQ@(€Bá  €P8„Ò` ”â €Pj3€BÑ@(€bAŠ€‚‡((¬E@¡p%ÜE €P €P €Pâ €P  …@(n ¸@n e„ @¡pÅm„â6€B 7€B €B1 €˜jw€B‘ ¤Ž@A‹Nˆ%—Š€BÉ2„"@(e/@¡„@¡ä€BÑ@(€Bñ)@¡è e„ @¡pÅ4€B 7€Bq@¡Ø@(  €P8„ ”\@(¹ €P”  €P\@(n e„ @¡p…@(…7@¡ÈJüŠ @¡è €BÑ@(2„ @¡p…@(öŠ @¡Ø@(2„¢ €Pd¥@(m$€BQ@(?@¡¤k€BIÊ„RúJé@L°~8¬Wæl”Ì x Ä dçŠs…@(€BI„’(E@¡pE@¡è e„ @¡p…@,Èa@(a@(a@(a@(a@(a @(a @(a @(a @(m$€Bñ@¡äS€B©BÅÕ„Â ”Ê €P@¡( ”Ä@(ÊE@¡( ¤"ž €P:Cwñÿ3ÔÛŒ`µÄ„Tç1ŠÑ„ @Aƒ÷?ØP€5°@, °‚(@(á@(á@(á@(F  €X›y„Tg10Š2€Bá  €P8„ ¤>$@!ÕYŒ „R7Š€BáJ} @(zE@¡p…@(€B1 €P@¡„@¡„@¡4WÅ4€Bá  €P8„ @¡ *J@(Ù €XœÆ@°09 €RÕ€B1 €P8„ @¡p…@(-€B„Ð&€B 7€Bi‡Jû €PL @¡Œ`Š€BQ@(€Bá  €S/#@¡¸ €PÜ@(öŠ„Â ·Š€BQ@(€Bá  €P8„â6€BIo„’Þ%½Š„¨Í€’«ôÀúE@¡p…@(€BIo„’Þ¥¿@(z…@(€B)C¥  e„ @¡p…@(e@¡Ä)@¡ Š€Bá  €P8„ @¡p…@(Q„§„§ Œ„Ò …@(€Bá  €P8„ ”~ @¡Ä)@¡Ä)@¡Ä)@¡@(€BÉõ„’ë¥Ü ”r €P  @¡p…@(q @(^ e„ @¡p…@(€Bá  €P8„R†JœÓøé€‚­ƒH€BF ”V€Bz ”ù,€B™º &¤f"@¡8 €P8„ ”p è48¶ˆ )ÿ1ÊÀ @1!¹† €PÜ@(9€BiÌŠÛ¥} @( €bB.«eð €PÊ7€B)ßÅ?„ @¡p…@(€Bá  €Pò@¡ä€Bi‡J› €P  @¡´¥^ e„ @¡p…@(é €P €P €Pô  €P8„ @1Á’1RFg` ”Ø èœ$Í|¤ €Ë^€B 7€B± €P8„n„¢ €P”  €P8„ @¡ä€B 7€B 7€B©OÅ€BI!„T^ÿg e„ @¡\„b@¡¤7€B©³¥Î Ó…@(€Bá  €P8„ @¡p¥/@(õ@¡( @¡p…@(€Bá  €P8„ ”p ”p ·Š€Bá  €P8„ @¡pˆ‰^’32#|š €˜Óð „’ëÅm„b@¡p…@(e/@¡Ô„R—Jn ” €Pê€bb@𣠔² €PÜ@(. @¡x €Pz”„Ò§ ¦ÿpKÿ3Š„Â @¡p%ŸŠÛE@¡p…@(£l„Ò® e„ @¡pˆ©ªg ”¾3@¡äS€BS ”f@¡L)Ê@@¡ tÊ@@¡ tÊ”@1!—!„Ò ”z €Xƒ „2Â@(ž @¡p…@(€Bá  €P8ÄÄ€TJ^ e„2t@(2„2Ž@(2„Ò €Bi”Š @¡ 7Š @¡„@¡„@1! 2Š€Bá  €P8„ @¡p…@(=#€B 7€B)¥< ”ò €àiÄ hÚðe•@¡X @(€Bá  €P8„ @¡p…@(€Bá  €P8„ @¡p%7J^ ”a:€BÑ@(ÄÒl e„ @¡p…@(€Bá  €P8„ @¡4W¥é@(ʹGÉ@ÈE'@¡( @¡”–„RŸJs €Pô  €Pšl„Òd e„ @¡p…@(FJœŠ2€Bá  €P €Pšy„ÒÌ =„ @¡Œ¿J; €P €P”Š„Â ”È ”È e„ @¡p…@(q @(n e„ @¡„@¡„@¡( ”² €PÊ*€BQ@(@(á@(n ”!x€BÉ´„b@¡p…@(Kˆ©)Æ@(Ê…@(€BáJ» €Pd…@(€B 7€B 7€BQ@(ñ@(-€BQ@( €P €P €P”Š„Â ”Ì@(ù €P”  €P8„ @¡p¥ý@(2„§„¼„n„s„b@¡p…@(€BáJ¢ ”p e„’F¥p €BÑ@(€Bá  €P8„Y„§„â6€BQ@(ŠsE €P8„Ò ”‘9€B™ ”‘9€B1 €P8„§„"@(ë-E €P8„ @¡p…@(€Bá|½%ÈS„’E@¡p…@(é €ÀMjFèÊL€BQ@(€BáJ§ €Pd…@(á@(2„ @¡¸ €PÊ€BQ@(€Bá  €P8„ ·Š @¡p…@(n ·Š2€Bá  €P8„ ”¼@(y €P”  €P8„2L@(å@¡( @¡p…@(¥%@¡Tm„¢ €P%„"@(€Bê ”º €P”  €P8„ ”ê €Pª€BQ@(¥@¡È  €Pâ €Pâ €P  =„ @¡p…@(A@(2„ @¡¸ €PÊD€BQ@ˆÊ"@þ30Š2€BáŠÑ„’ÞE@¡X @(2„ @¡”‰„’vE@¡”ä„"@(y €PÜ@(Ê…@(€B6 €Bá  €P8„ @¡¸ €PÜ@(Ê…@(€Bq@¡È  €P8„ ”(€B ”ñ7€B x€B1 €P8„ ·Š @¡p¥'@(2„ @Aà 2Y @(á@(Ê…@(€Bq@¡È  €Pâ €P²3@¡( @¡p¥^ €Bá  €PÜ@(2„ ”‚ €P .€BQ@(y €Pü@(á@(z…@(€B ø Ð$€bBb3› €˜Ø Ä„Äf &$6@AŒ†–<„R¾Êž€B)Åm„ ”a-€b‚yÝo1 €P Å€BáÊž€Bi#J3 €Pô  €P8„ @¡p…@(€Bá  €PÜ@(ë)e¿ @¡è @¡ £|( D|DÊØ @¡@(€Bq@¡”!„¢ €P8„RŠ @¡ ÓŠ @¡ŒÙŠ @¡Lʈ3@¡( @¡p…@(€BYŠ@(3„¢ €P&E €PæE €PZÄ„"@(€Bá  €˜þ#€‚D=Š2€Bá  €À! ÄĈE@¡p…@(€BáŠÛÅh€BQ@(€Bኄb@¡( @¡p…@(€B1 €…0žE@¡p…@(ó´„â6€BQ@(€Bá  €P8„ @¡¸ €PdÅ„"@(€Bá  À •ÖMÉÌÖIEND®B`‚milkytracker-0.90.85+dfsg/resources/pictures/ft2_style_12x12_spaced.png0000644000175000017500000001441710737746457025123 0ustar admin2admin2‰PNG  IHDR °øì[È pHYs  šœgAMAØëõª cHRMn rì÷I„úoƒè!1º‰Oó•PLTEÿÿÿgvìcyIDATxÚb`@„‚  @( €P@¡ €BA„‚  0bddÓeCx„ @¡pÅ€Bá  €Bá  @PE…„ ˆP @( €P@¡ €BA„‚  @( €P@Á<&…@p‚€B‘ @¡pE@¡È  €Pì @ÐШ @10 ™ @ð„ÊŠ @Áõ€x„ e„b4@¡p  @( € æC  @¡$€Bá  €P8„˜ „ ;Üs 6@!4 €b`„ºÄ ˜20 € Y ° ˆJ€b@@1 » €B’ €à¦0@¡8 €P@¡x €P8³L  @( €P@¡ €BA„‚  $ߊӅ@(€Bá  €P8„ @¡X @( €P@¡¨ ätÁ@(€Bá  €P8„ @¡pÅR€BA„‚J,Ša„RÜJá@(¹ €“/@¡p%õ"ç22ŠÝ„‚  ·  €P8„âP€B‘ @¡p  @( €P@¡ €BA„‚  @(n @¡ä9€BA„‚  @( €P €P$  @( €P@¡ €BA„‚  @( €P@¡@¡p  ”ì @(€Ba  €P؄ 6@¡p… @(€BA„‚%›J @(€Bá  €P8„ @¡pÅR€Bq @¡ €Bñ6@¡”;„"@(€Bá  €P8„ @¡¸ €P\@( €P”Šç¥" ”˜ 6@¡°… @(l€BaJþ Ç  ·ŠÛ…@(6’>€B‘ @¡@(€B± €P@( €Pô  €P8„ $£Å €Bá  €P8„Â ×  ”à µ„ @¡8 €PT  €Pü@(€B 7€Bq @¡ €BQ@(æ  €P8„â6€B± €P8„ @¡X @(Ž @(á@(. @¡°…@(íS€B‘ 6@¡p… @( €P@¡x €P<@(€BኀB‘ @¡p…@(ŠcŠ2€B1 €P8„ @¡d €B €Bá  €P, Ç  @( €P@¡ €B± €P8„‚Š2€Bá  @( €P@¡ €BA„b4@¡p  e„ ”6@¡ €BA„ì„ 6@¡°… @(2„¢ €PTŠJ€BA„‚  @() €PÄ  =„"@( €P@¡ €BA„â€Bñ@¡ø €PTŠJ€Ba  €P؄ @( €P<@( €PŒ @¡Ô§„" @(€BA„"@(€BA„‚¥à ”Î@ÁŠ 0 @Ðñ%H €`0 @(€BáœQ„â€B± €P@¡ €B 7€B 7€Bá  €Pê€B‘ @¡p…@(€Bq @¡ €B)9E@¡p…@(zE €P8„ @¡@(® @(á@(Ч…@(€Bá  €P8„b4@¡X @(Ž @(ª¥© @(¦  €P8„ @¡pÅh€B± €P@¡ €BI;„âS€Bá  €P2@¡È  €P8„ KÅ5„‚E@¡@(€BáŠÛE €P8„ @¡p  ”¨ ”X …@ÈÃ@(z…@(€Bእ„â€BA„¢ €P8„ @¡„5@¡È  €P8„ @¡¸ €P@¡Ø@(ê…@(€Bá  €P8„ @¡X @(® @(MC€B1 €P8„ @¡p…@(€B *€B‰S€Bq @¡ €BÑ@(€BáJ@(&Š @¡è @¡p…@(® @(Ò„Â @¡p…@(€Bá  €P8„§„â€BA„2¼ @(þ ¤!S€b€¹I€B1 €à³L @ðÁ| @(¦  €P8„â€BA„<À@(zy.€ €K€b@v@¡¸ €P¤¥¨ ¤¨gd {Å5„‚%YŠ€Bá  €P8„ @¡p…@(–ŠcJ6 …@(€BÑ@(~ @¡p…@(€BA„‚Å „â€Bá  €P8„ ”ö(@¡D0@¡D0@10 MJê —JŠ=„ @¡è €Bá  €P8„Â ×  ”p =„¢ €P8„¢ €PT  €P8„b4@¡@(Ž @(å@¡ @(€Bá  €P8„ @¡p…@( €P@¡ø €P8„ @¡p…@(€Bá  €P €P\@( €Pô  €P8„ @¡p…@(€B!e]@¡ô'Šb€Bá  €P |€B)n%QJõ@( @¡˜@(•@¡¸ €P@¡è @¡p… ”î%@¡ÈŠ€Bá  €P8„â€BA„¢ €P8„ @¡´«Å €Bá  €P8„ðÐP€Bq @¡ €B‰€B1 €P؄ 6@¡°… @(l€BaŠ¥„â€BA„’Åh€Bá  €P8„ @¡p…@(–  @(Z…@(¦  €P‚ €P8„b@¡pÅ €Bá  @(^ -„ @¡p…@(€Bá  €P, @( €P4E?@¡@(%@¡dJ€B1 €P@¡ €BA„‚  @( €P@¡ €BA„‚  @(y €P$JP  €Pƈ  @( €P@¡ €BA„‚  @(•@¡¸ €P8„RØJ¤  €P8„¢ €P¬ @(–  €PôŠÑ„ @¡p…@(€B1 €P\@( €P@¡ €B 7€B1 €P¼@(€Bá  €P  £ÅJ€BA„¢ €P8„ð„b4@¡p…@(€Bá  €PŒ W  @( €P<@(F  €Pò@¡ø €P8„¢ €PŒ +Êx<@¡@(€BáŠÑ„"@(€Bá  €P8„‚  @(. o  €Pâ €P, @¡è £ÅJ€BA„b @¡pÅN€B1 €P8„ @¡p…@(€Bq @¡ €BQ@( €P<@(Ê…@(€Bá  €P8„b4@¡X @( €PôŠ@¡È  €P8„ @¡p%¨Åm„b@¡ €B1 €P  @¡peÈ €P¬ €BÑ@(€BáŠkŠ €Bá  €P8„ @¡p…@(€B)  @( €P €PúY„ @¡p%t…@(€B± €P@¡ €BA„â6€B1 €P8„ @¡p…@(€B± €P@¡ €BA„â6€B1 €P8„ @¡p…@(FŠ•„‚  ”ò €PŒ @¡p…@(€B1 €P €P8„‚  ” €Pì @¡p…@(€B1 €Pœ@(€B± €P@¡ €B x€B± €PL @¡p…@(€Bá  @( €P@¡¸ €PL @¡tÑE@¡p…@(FŠ•„‚Š)„ @¡¬É €BáJX  €PÜ@( @( €P@¡˜@(€Bá  €P8„ @¡¸ €Pì @( €P@¡˜@(€Bá  €P8„BJ €Pª€BA„‚  3…@(€B© …@(€BáJ¸Š„‚    €P8„b@¡È  €P8„ ;  @(  €P8„RpŠ^€BኀBñ@¡Ø @( €P@¡ €B餒@¡°… @(l€Ba  €PŒ ;Š6€Bñ1@¡p%0ˆyg@¡È  €P8„ K  £…@(€Bá  €P8„ @¡p…@( €P@¡ø €PÒ @¡p… @(Å/@¡ÈŠ€Bá  €P, @( €P@¡ €BF @¡X@(€B)¸…@(cë„‚  @( €P@¡ @(–  €P @(€Bñ@¡p  @( €P@¡ €BÎfŒ„b;@¡pE@¡è @( €P@¡ €BA„‚Š¥„"@( €P”Š@¡ €BA„‚  @( €P, Q€BáŠ2€BÑ@( €P@¡ €BA„‚  @(. @¡¨ @( €P@¡ €”EL$«‡IEND®B`‚milkytracker-0.90.85+dfsg/resources/pictures/IDC-Harmonica.bmp0000644000175000017500000000630011130466476023300 0ustar admin2admin2BMÀ >( ‚   ÿÿÿÿÿÿÿÿÿÿÿÿüüÿÿÿÿÿÿÿÿÿÿ??ÿÿÿÿïǃÿÿÿÿƒÇïÿÿÿççóççÿÿÿÿÿÿÿÿñççÏççñÿŸÏçÿÿù999ÿÿÿ9“Ç“9ÿÿÿ“)99ÿÿÿÇ““99ÿÿÿ9999ÿÿÿáÏÏσÏÏÿùƒ?ÿÿÿ???#ÿÿù999ÿÿ?999ÿÿÿƒ999ƒÿÿÿ9999ÿÿÿ99)ÿÿÿÁŸŸŸŸŸŸÿ9339??ÙùùùñÿùÿçççÇÿçÿ9999??ù99ÿÿŸŸŸŸƒŸŸÁÿ?9ƒÿÿÿ999ùùÿƒ9?9ƒÿÿÿ999??ÿ9ùÃÿÿÿÿÿÿÿóççÿÿÿÿÿÿÿÿÿÿÿÿ“ÇïÿÃóóóóóÃÿýùóçÏŸ?ÿÃÏÏÏÏÏÃÿ?ŸÏçóÿçççƒ999ÿ99“ÇÇ“9ÿ9)999ÿ'39999ÿƒ999999ÿççççççÿƒ9¹ã9ƒÿ93'99ù“#999™Ãÿ??999ÿ‡3999™Ãÿ991! 9ÿ999)9ÿ??????ÿ93''39ÿƒ99ùùùáÿçççççÿ999999ù‰191?™Ãÿ?????ÿ????ÿ99993ÿƒ9???™Ãÿ9993ÿ9999™Ãÿ?#!9™ÃÿÏÿÏÃù9ƒÿÏçóùóçÏÿÿÿÿÿÿÿóçÏŸÏçóÿ÷ççÿççÿÿÿççÿççÿÿóù999ƒÿƒ999ƒ9ƒÿÏÏÏçóùÿƒ999?ƒÿƒ9ùù?ÿùù9™ÍÏÿƒ9ùùãùÿ???ƒùƒÿçççÇççÿƒ !3‡ÿÿ?ŸÏçóùüÿççÿÿÿÿÿÿÿÿÿƒÿÿÿÏççÿÿÿÿÿÿÿççççÿÿïǃ“ÿÿÏçóóóçÏÿçÏŸŸŸÏçÿÿÿÿÿÏççÿ‰3#‰—3‡ó-“Ïç“iŸÿïéƒ/ïÿ“““““ÿÿÿÿÿ·““ÿçÿçççççÿÿÿÿÿÿÿÿmilkytracker-0.90.85+dfsg/resources/pictures/IDC-MicroKnight.bmp0000644000175000017500000003067010737746457023640 0ustar admin2admin2BM¸16(‚1  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmilkytracker-0.90.85+dfsg/resources/pictures/16note2.ico0000644000175000017500000000047610737746457022220 0ustar admin2admin2(( À ;f) ’<¿Næm2ì^ñ«‰ó·™ôÁ¨ö˶úáÔüëâýõñÿ#@V„%xê4kÛ5h@lWް F½° À À Ð Ð #D`À weD0°nÖÆiw€6DVhpD0ÇÿƒÿãÁ€Á€ñÀñàñøñøñøððððÿ€milkytracker-0.90.85+dfsg/resources/pictures/oldschool.icns0000644000175000017500000013335210737746457023172 0ustar admin2admin2icns¶êICN#ªªªª]÷ß÷]÷ßꪭwÕuÛ»ÊM6ïÅ*•Wèÿû¯Å_þ×iï÷»Öÿÿ×Éï÷oå_}·ÊºÛkõU­¿ÿÿÿÿÿÿÿÿÿUUüª«ÿÿUV¿úîûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿicl4ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝîî®îêîêîêîêî®ïêïïþ•žéYæžöŸæŸiþÿÿÿ×wWw×}u}vyWinÿ¯|}|}ççw§í÷åæ•~ÿï|w×}u×uwWWnyçÿþpwpw×|wwÇw×W^ÿïpw~îþïîåþîuuwÿÿpw Yÿÿÿþæ•—×åŸþwuŸöïÿÿùoùYWWÿïpyÿýÿÿÿïŸú•~~ÿÿpwvîçÿïÿùZîiWçÿïw|}æßÿþþÿ–Ùçu~ÿÿÇÇw}u~u~}içgçÖÿïwW×WçWWWçW]u••ŸÿÿúÿŸÿÿŸÿÿÿÿÿÿÿÿïÿÿÿÿþÿúÿÿŸÿÿÿùÿÿÿÿç×wwwww}uÿÿÿ¯ÿÿW}}}WÕ}gWÞÿÿÿÿÿÿw××W}wWÅwWÿÿÿÿÿþUuuu×U~h^~ÿÿÿïÿÿùÿÿ¯ÿùÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌicl8úùúùúùúùúùúùúùúùúùúùúùúùúùúùúùúùûü¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ý¬¬¬ÿ¬ÿþÐ¥¥Ï¥«É«É«ÏüÏ«ÐÏ«ÐϬÏÐÐò¬óÿÿÿýê¥y–ž¤—xžž£žÈ¤xȤ¤È¤Ïª¥Ï¤ÏÿÿþÖlžž–¤žÏ¥¤–¤Ð£Ï¤êœ«Î¥Ïê¤È«êôýól—r—sœž–£¤œœž¢¤£žÎ¥£ÉªÈêÿýþr–r––r–rž¤œ–xœœœœœ¢£££È¤ôÿ­ór–l–rrÈ««ÐÏÐÐýÐÐÏýÐÐÏУ£È¤¤ÿÿþý–r–r–Оϥ«ÿààôÿàÿý««Ï¤ê£Á£¤Èàÿýêr–r–¤ÿàÿÈþôôÿÿÿýýÏêÿÿ¥Ï£¤È¤ôÿþÖ–r––¤¤ÿÿþüÐàôÿÿÿþЫÿÿýÏ«¤£¤Èàÿýþ–––x–«Ð¬¦£àôêÿÿÿààÉþüûÏ«Á¤Ç¤ôÿýêx–œ–œ¤¥¤ªÐôàÿýýýýýò¤Ï¥Ð££¤¤Èàÿþó–œx–œ–£¤È¤¤È¤¤¤¤¤¤¤É«¤£Á¤£È¤ôÿýþ£ž£¤££ž££Ç¤£È£¤È¤Çª¤ªÈɪÏàÿþÿêÿôÿÿôÿÿêÿÿêàôêàÿÿàÿàêÿÿÿàÿêÿÿýÿÿÿÿàÿêóêþôêôþêóêêóêóÿêôêÿÿÿàÿÿýÿÿàÿÿþœœœœœœœœœœ££££àÿÿÿÿÿÿþÿêôêô¤œ¢¢¢££££Á¤£ÈÏàÿÿÿÿÿýÿàÿôꢢœ££££Ç¤£È£¤þêôÿÿÿþÿÿÿàϤȣ¤È¤Ç¤È£È¤È¤Î¤È¤ÉªÐÿÿÿÿÿþÿôÿÿÿôàÿÿàÿàêàÿÿÿàÿêÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+÷++÷+÷+÷+÷+÷+÷+÷+÷+÷+÷+÷+÷++÷+÷il32ýÿLHƒ87‚65€4€3€231!  +;O1)??E/347/(($5) !# V945/E,78$%B**! 3 SLEF=;:86420.+)%" NMLKJF')+)&# KJJIH(") ()&#  HHGG7$ (&# # FFED,! 3*(&#! €CB97I+@;(%#  €A@?!"((€" !!('%# >==0$#""!!*/..(!*(&$" ƒ.--,++*)(('&%$#"! „‡ƒ‚ƒ…‚‚ 344332210/.-,+*)($2110//.-,+*)(&%  ./€0//..-,+**)'&%$!$%%&%$$##"!  €Ž„À¿ÝÿýÿLHƒ87‚65€4€3€231>RQONLJHFDB@><287520-*'!p¢Þ„m¯®À˜nnc•qXS[`GRFCW0ñ›Œ‘Àw˜Cœ_d¼r.rBZ;P1320.,+**)+5;t|uld[ÓÒÐÎÊFmG\E)-L9Lrtme\ÌËÉǘ` QJ@Btmf]MÅÄÃÁxW P$2*@0sle^¾¾½»ŸS7Ie P@B>Hqke^··¶µ´YY^b&€"NPKG(spjd]¯°°¯®¬…a_]\ZYaecbZNLI\wsnhb\ €€~|{ywusqomjheb_\YVRNIEƒˆƒ‚ƒ ƒ  ‚€‘•”“‘Ž‹‰‡„|xuqh V€ŽŒŠ‰‡…ƒ€~{xuqnj9Cƒ‡ˆ‡‡†…„‚€~|ywtqnkg` ;fhijjiihfecb`^\YWTQN( €Ž„À¿ÝÿýÿLHƒ87‚65€4€3€231I^^]]\[ZZYXWWVLTTSQMID?6.'€¿ñ ‹ØÑ窼ÆÍ´Ÿ£˜â³Ž‡”žu‡smPÿ´²¯¥æ¡¿aÍ„’ÿ¬E®i(ì`‚aiƒ“…ÿïèäÁÕÞ²å«Ä®¿ðïÛÄÆÖ£¼º‡…ž…Œ†ÿµ¦¶ü‚ÿ üôìâ×Ì¿±¢’ ‚ÿõqRCDCC‚B AEU`¾ÌÀ³¥– ‚ÿ`˜c„f)I|\|.»À´§˜ ÿÌŠ vx hl¾³§š ÿ¦~ e8,O*dM½²§› ÿß|(7I—‚@Hev»±¦› ‚ÿ…ƒ”:€" 0~trA½¸¯¤™ ƒÿË•’‘˜›˜•|x˜Å¾µ¬¢˜ ˆÀ¿½¹¶²®ª¦¡˜’†€yqƒˆƒ‚ƒ€€ ƒ€ îõóñïìéåâÞÚÕÐÌÆÀº¬Œ€êèæäáÞÛ×ÓÏÊÆÀ»µ¯^C!ØÞßßÞÝÛÙÖÓÐÌÈÄ¿ºµ°ªž`¨«­®®­¬ª¨¦¤¡ž›—“‹†A €…À¿Ýÿl8mkyôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòˆóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûúúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍ›’—öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûËÖþÿÿÿÐL"\ÿÿäÆ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ܃híÿÿÿ×EPÿú³hžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû¹ºÿÿÿÿÑK&üÿÖ•÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏqADÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3‰™™™™™™™™™™™™™™™™™™™™™™™™™™™™™— "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%ih32C€ÿ€þƒÿ‰þ–ÿþÿ€þƒÿ‰þ˜ÿþ…ÿ‰þ•ÿƒþƒÿ‰þ•ÿþþÿ€þƒÿ‰þ•ÿþþÿ€þƒÿ‰þ•ÿ­¿EBˆ<“;†:6(VK!€„ƒ„ƒ K € € ‚ ‚€€€€/€(#DPMGB:>J7G:E@>@?>=;;#-60(./)),+&%"€*+P,T*+4HH-M$/+%:,$#%,8*,!*VV(2%P?;O*H-2G!0-C:$: $4," *TT6L( ,#+"2!%$A>+("s-! *SRPOLONMMKF=FF22C$??>=:39872$)10''''")QPPONNMLKJIHGF'2"'>?>=<;:98654310.-+)'%# ) O€N8MLLJJHC?>=)&698775543210/.,,/.-+)'%#!) MMLLKKJIB ‚‚€& #-+)'%#!) LKKJJIHA(1$-+ ‚%"+)'%$!) J€I HHG"%*€‚D ()'%$" ( HH€G FC/&€ 4#)'%$" ( F EE;&)€*€ ('%$" ( ‚D C?, 0Y5  BV#('%#" ( €C€B A'WP(-‚#%XG%(&%#" ( ‚A @@8+/$.. ƒ $%(#)'&%#" ' ?€@€?>3 ‚A‚N5 )('&$#! ' =‚>€='<5100//..-,,++**)(''&%&**)('%$"!' ;ƒ<€;%::998876655432210/..,,+)('&%#"!&Œ „ „ €‚€&‡Œ†„&™‡„&„‚!€ € …&„(4€3221100//.--,+**)('&…%€1ƒ2€100//..-,,+**)('&%# ƒ%‚&0‚1€0€/..--,++*))('&%%$ƒ$..…/..€-,++**))('&%%$#"€$€",,€-..-€,++**))(''&%$$#"!€$€€ ‡ † € ‚ € €¤ÿ­Ÿÿÿëÿ€ÿ€þƒÿ‰þ–ÿþÿ€þƒÿ‰þ˜ÿþ…ÿ‰þ•ÿƒþƒÿ‰þ•ÿþþÿ€þƒÿ‰þ•ÿþþÿ€þƒÿ‰þ•ÿ­¿EBˆ<“;†:6(VK!…ƒ„ƒ K €‚€€€€€ €  €,/ X»àØÅ· «Î—ÈžÁ²­³²¯«¦¦`|™‡pƒss}zjVh`+RO-€*pßvìppGŒÊËzÙ^€tc£y`]Dd@yžuzAK;I[E9?PK%ZZQ4*òñh‡`ᮢÞpÊz$ŠÉX„|½¢b3(¤VUN b”4.}R.+ 5c]VN*íì“ÔjSQOu]rZŠ4Y9ca¸®uo]S'PQ)9}]G1%8M<)IYQ*èçáßÕàÝÚØÕÆªÆÅ‰‰¾cL²²¯¬¥‘£ŸœdrˆnoWnoaZ[T )ãâáßÝÛÙÖÔÑÎËÈÅj‰[k®³°­ª§¤¡ž›—”Œˆ„€zupjd]V)ÞÝÜÚÙ×ÕÒÐ̼±­/«nf–¡žœ™–”’ŒŠ‡„~}„ƒ{vpke_X )ÙÙ×ÖÔÓÐηJ(,‚‚€& "bzvqke`Y )ÕÔÓÑÐÎ̵$k‡a|w‚& RgQ`K Wzvqkfa[ )ÐÏÎÍËÊÈYdL7t‚&DS93Gsuplga\ (ËÊÊÉÇÆ¼+h!€' 4aQXtpkgb\ (ÇÆÅÄÃÂ¥&gT5€*#D€BDtpkgb\ (ÂÁÁÀ¿¾±)x 0Ym&W BVQPsokfa\ (€½ ¼»º¹Ll4WP;z‚a#%XG+Vjrnjea\ (¸ ·¶µž urLgzƒ# bR8R]Juqmiea\ '³´´³³²±°41E2‚ D‚Q7 +;, Uvsplhd`\ '®®€¯,®­¬«©”ˆ‡†…ƒ‚€}|zxwusqomkilzxurokgc_[ '¨©ª)©¨§¦¥¤£¡ žœš™—•“‘‹‰†„‚|zwtpmjfb^Z &‡‚€€€  &††„&™‡„&„#€[ZZYXXWVUTSRQPONMLJIGFEC…&€‚o””““’‘ŽŒ‹Šˆ‡…ƒ€}|ywuspnH…%€,ދЉˆ‡…„‚€}{ywuspnkeƒ%‚lŠ‹ŠŠ‰ˆ‡†…„‚~|zxvtrpnligHƒ$)ƒ…ƒ†…„„ƒ‚~|{ywvtrpnligda€$€a}€€‚€€~}|{yxvtsqomkigdb`B€€$€…€€  €¤ÿ­Ÿÿÿëÿ€ÿ€þƒÿ‰þ–ÿþÿ€þƒÿ‰þ˜ÿþ…ÿ‰þ•ÿƒþƒÿ‰þ•ÿþþÿ€þƒÿ‰þ•ÿþþÿ€þƒÿ‰þ•ÿ­¿EBˆ<“;†:6(VK!…ƒ„ƒ K €!€ € € €,/ kÔìêÙÍËÙëºëÇêßßçééèçé’¼äΰÏÕ½¼Íɯ¬F‡‚K€*‡ð™ÿ’_«êî¤þŠ©£–ݧŒ‹h˜f¹í¹Ájz`v”p^fƒ{<”•‡V*)þþ„´‰þÊÏþœô¡4¼þ}º±þå™L=öˆˆ~2¡óSJÌ…JEW¤™Ž*+þþ¯úkij¤‡š~ÀJ‚Vüô®¦‹=‚A]ΘtP;\/bCw’†**€þýø‚þ%÷Øýþ´Âþ“süþÿÿúàÿÿþꤻçß´¶¶¶ •–‹))‹þ˜Ê†›øþþƒÿþùóíçáÙÒÊÁ¸¯¤šŽ )(‡þðáßߒчßÝÙÔÏÎÚÙÒʹ°¦œ’)(…þêf>E'‚‚€-6¡Ñʺ±§ž”)'„þ é3–¼†°° ‚ †¨…{ŽÉº²©Ÿ–)&„þ|mQ®‚Dˆ]Qu!½Áº²© —(%ƒþ ù?¹—4€ 4Ÿ…À¹±©¡˜($ƒþ à4™qT€*8o€f/p¿¸±©¡™(#ƒþ ö<° 0Y›<# BV „½·°©¡™("„þn¢MWPL¾‚Ÿ6%XG:¯¼¶¯§ ™(!„ÿå0¯§m˜½(ƒ  ~T|—zÀº´®¦Ÿ˜' …ÿÕQKlM€  G€TST: E`H3ŒÂ¾¸²¬¥ž—'†ÿþâÑ€ÐÏÎËÈÆÃÀ½º·´°­±ÈÇÁ¼¶°ª¤–'ÿþþûøõòïìèäáÝÚÖÑÍÈÄ¿¹´®¨¢œ•&‹$#""€! €&††„&™‡„&„8–•””“’‘ŽŒŠˆ‡…„‚€~|zwuspn …&€‚¶ôóóòðïíëéçåãàÝÛØÕÒÏÌÈÄÁ½¹´v„%€Fç€ìëêéçæäâàÝÛÙÖÓÐÎÊÇÄÀ½¹µ±§)ƒ%‚²ãä€åããáàÞÝÛØÖÔÒÏÌÉÆÃÀ½¹µ²­©wƒ$CØÚÜÝÜÛÚÙ×ÕÓÑÏÍÊÈÅ¿¼¸µ±®ª¦¡#€$€$ ŸÎÑÓÕÕÖÖÕÕÔÒÑÐÎÌÊÈÅÃÀ½º·´±­ª¦¢žm$€ +.€/ƒ0€/€.--,++*))''&%$# €¤ÿ­Ÿÿÿëÿh8mk FwuCxüÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü•åÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþýøùøøøùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþø»ª£££Àþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþñùëþþþþþþý·x\WWÒÿÿþñøðÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþÚ»¼øþþþþþþ»SæÿÿþѺÈýÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþß­„d–þþþþþþÄUçÿÿÕªg­ÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþúÀcgÞþþþþþþÁ^ àÿÿõ®TzâÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþÖç§üþþþþþý¸]ŸÿÿþÉÖ±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷§T2æÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýóéáßßáöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'p ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¥@[____________________________________________^ich#Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿßÿÿÿÿÿßÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿßÿÿÿÿÿßÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿit32JÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿÿþŸž˜“Ž‹™Š‰˜ˆŒ‡…†…€{tgM‚ š‚jZMH…GFED‰C…BŒA@@EMTN5 ’‹b5 „ Œ‰†…ƒ (y~[$ † ’ŒŠ……„€kc1 … “І…„€_Nƒ •І…„T? † ƒ„‚ƒƒ‚ƒƒƒƒ‚ƒ‚€€ € € €  „€J2 †J€Y€XWW€VUUTTSSRRQQPPOONNMMLLKKJ€IHGGFFEEDDCCBBAA@@-&?>>=€<&;::9988766544322100/.-,+*))('%"! „‚D+ …T"OXWW€V]UUE@<.6IQQP=ONNILLKKJJIIHHGGFFEEDDCCBBAA@-3>==<<;4- )988763)4"$32100/.-+*)('"! ‚‚C)… TY&XXWWVB‚!'MQPPNNM2LKKJ1(0CG?BEEDDCC/;€A4@ 0>== +8( 43211$ *)(' "! ‚C)„n&TXX* RWVVF )@NRQQPP==<$.-4:62'%"32&  ))'#"!‚€C)ƒ&€X-WG0VVB 3TTS(IRQQPPONNMM* )EI, CG6E&‚9# :==<<;;::9 763 . %/!-, *!  #"! €C)‚‚W+V KTSSD:QQPPO, JNMM! 1JIIHGF2&ED€C6$A@#€#%>==6&6( 766/ ,10/*€ $#"!  ‚C)‚W‚V%//E3€SRR -QPPO=8NMM%€=BIIHH'GF&5DDCCBB$2 ">==. 7665"&110/$€ &%$#"!  ‚C)‚VUU= €T$2@NRRQPPOK !NMML* =>( 4   551-2€ "+!' "! ƒC)‚€TS@RR6-€Q€POO€N€MLG2 4IID@GG&EED@ /BBAA@@€? >>==<.;::99€877$ 322,10' +€)(''& ! ƒC)‚‚SRQ€P€O€NMM€LKKJJ€IHH€G AEDDC7 2A€@??€>==<<;;€:+998877663&"1322110//&--,#&*)(''&%$#"!  ƒC)‚SƒRQ€P€O€N€MLL€KJJ€IHH€GF*EDDCC,  2A@@??€>==€<;;€:+9988776655443322110//.--,++*)(('&%$##"! ƒB(‚€R‚QPONNMLL€KJJ€IHH€GF>5€D, /AA@@€?>>€=<<;;€:99€8'776655443322110//.--,++*))('&%$$#"! ƒB(‚‚Q‚PO€N€M€L€KJJ€IHH€G FF55D- 3BAA€@??€>==€<;;€:998877€6$55443322100//.--,++*))('&%%$#"! ‚B(‚QƒPON€M€L€K€J€IHH€G FFE*) 3BBAA€@??€>==€<;;€:99€8776655€4 3221100//.--,++*))('&&%$#"!  ‚B(‚€PƒONMLLKJJ€I€H€G FFEE&3CBB€A@@€?>>€=€<;;€:998877€6%554433221100//.--,++*))(''&%$#""!  ‚B(‚‚O‚NML€K€J€IHH€G€F€ED4€CBB€A@@€?€>==€<;;€:99€877€6&554433221100//.--,++*))(''&%$##"!  B(‚OƒN‚ML€K€JI;(”Š'0/..--,++*))(''&%$##"!  B(‚€N„M€LKJ€I0’‚Œ$..--,++*))(''&%$$#"!  B(‚ƒM‚LKJ€IE€ ''&&‰‚‹ƒ‚.--,++*))(''&%%$#"!!  B(‚MMƒL‚KJID 'CFF€ED@%†ƒ %€3221.€--,++*))(''&%%$#"!!  €€B(‚LƒKJ‚IHHCFF2!&0CC7ƒ…‹<[(€% 441$%10-,,++*))(''&%%$#""!  €€B(‚„K‚J‚I€H +BF0 € 3B>†Š rU#40‚ //,++*))(''&%%$#""!  €€B(‚KK„J‚IHGC BF+B6 ‡Š Ig4  4. €/. ,++*))(''&%%$##"!  €€B(‚‚JƒI‚H€G+6E&.A$‡Š ]U51€.)€+**))(''&%%$##"! B'‚…I‚H‚GFE9 =@ ‡‰-Z>)4!.+**))(''&%%$##"! B'‚€I„HƒG FF>.E#@ˆˆ 3O+ 5/€-%€(**))(''&%%$##"! B'‚ƒH„GF E.=Dƒ?-‰ˆ BF#4ƒ%-!**)((''&%%$##"! B'‚‡G‚F€E&D4‡ ?0‰ˆ >@ 4† -*))((''&%%$##"!! B'‚‚G„F‚EDC4‡!4?0ˆˆ :=%4 ‡0-*))((''&%%$##"!! B'‚…F„E€D %C3 …]R>0ˆˆ 384 …'_',*))(('&&%%$##"!! B'‚ˆEƒD C,;B.;ƒ’vO$>,ˆˆ &-41)ƒv“wc$ ,*))(''&&%%$##"!! ‚B'‚„E„DC ;+BivfJ,+>ˆ‰ 3% N|v[:-'€%€)(''&&%$$##"!! ‚B'‚‡D„CBBA5G~V=PL+<= ˆŠ €(-3gWAKR7, *))((''&%%$$##"!! ‚B'‚‹C‚B+2A#^|E9\]) ,=(‰Š(2) 7Š]E_3 -,*))((''&%%$$#""!! ‚B'‚†C„BA  =@ !PcQ/EjX&+=6‰‹‚)2' Cgb:>if4*,(*))(€' &%%$$#""! ‚B'‚ŠBƒA@.@@0#,  ,*8>9‰‹€ /1+!.% 2.%--€*))((''&&%%$##""! ‚A&AAB‡A‚@;?>-!0>=6ŠŒ (10# ,.-€**))((''&&%%$##""! ‚A&€‰A…@?< )€>=9!ŒŽF -0€/..-(€+**))((''&%%$$##""! ‚A&‚@ƒ?;€ "+(! Du‡ˆˆ‰‡b* $##€+**))((€' &%%$$##"!! ‚A&‚??†@…?‚>/–&;ŠCB;)†)++**))((''&&%%$$##"!! ‚A&‚?„>€=6%…Їˆ†",,++**€)((''&&%%$##""!! ‚A&‚‘>ƒ=‚<‚;:9‚8€76€543€2€1€0€/€.€-,,€+**))((€' &%%$$##""!!  ‚A&‚€=Š>„=ƒ<‚;‚:9876€543€2€1€0€/€.€-,,€+**€)((''&&%%$$##""!  ‚A&‚<<Ž=…<;ƒ:9‚8€7‚6€543€2€10€/..€-€,€+**))((€'&&%%$$##"!!  ‚@&‚…<=‰<‚;ƒ:9‚87654€32€10€/€.€-,,€+**€)((''&&€% $##""!!  ‚@%‚;<ƒ;„:9‚87‚654€321€0€/€.€-€,++€*))((€'&&%%$$##""!!  ‚@%«¡”Ž@%€§£“@%‚£¤”@%„Ÿ¥•@%†š§•@%‰”©–?%Œ¬–€?%Ê–‘€?%–ŽŠ‡† ‚ ‚‘€?%• „6„5„4‚3ƒ210‚/€.-€,+€*€)((€'€’€?%’ ˆ5†4‚3ƒ21‚0/.-€,+€*€)€(€'"€‘?%‚‘#‚5‰4ƒ3ƒ2‚10‚/.-€,+€*€)€(€'&&’?%ƒ Š4…3ƒ2ƒ1‚0/.‚-€,+€*€)€(€'&&%!“?$…"Ž3…2ƒ1‚0‚/.-,+€*€)€(€'€&%%‘‚?$†Š Š3‡2ƒ1ƒ0‚/.‚-€,+*€)€(€'€&€% ‚?$†‰!2…1‚0ƒ/.‚-,+€*)€(€'€&€%$$‚?$€‡† ‚1…2ˆ1„0ƒ/‚.‚-€,‚+€*)€(€'€&€%€$!Žƒ?$ˆ„%001…0„/‚.‚-,+*)€('&&%$$##Žƒ>$‚‰//”0…/‚.ƒ-,‚+*)€(€'€&%$$€#!Œ„>#ƒ‹#.ƒ/Š0‡/ƒ.ƒ-,‚+*)(€'€&%$$€#""Œ„>#„‰-‚.’/„.„-,ƒ+*)€('€&%€$€#"" Š…>#„ˆ"‚-….„/ˆ.„-‚,ƒ+*)('€&%€$€#€"!Š…>#€„† +€,„-.†-ƒ,ƒ+*‚)('€&%€$€#€"!!ˆ†=#…„ *€+,•-„,„+*‚)('&€%$€#€"€! ˆ†=#‚…‚‡ – ‰ ‡ † ‡‡="ƒ†Äš‡="ƒ†Âšˆ€¾§‰äÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿÿþŸž˜“Ž‹˜Šž‰—ˆ‡…†…€{tgM‚ š‚jZMH„G‘FŒEžD‰C…BŒA@@EMTN5 ’‹b5 ƒ ‘މ†…ƒ (y~[$ … ’‰†…„€kc1 ƒ ”ŽŠ†…„€_N –ŽŽŠ†…„T>‡EED€C€B€A€@??€>==<<€;::99€8€766€544€322€1€0//€.--€, ++**))(('&&%%$##""! „€J2 †g7Íúúùø÷öõóòñðïîìëêéçæäãáàÞÝÜÚÙ×ÖÔÓÑÐÏÍÌÊÉÇÆÅÃÂÀ¿¾¼»º¸·¶´|f°¯­¬«©¨¦¥£¢ Ÿ›š˜–”“‘‹‰‡…‚€}{xvsqnkO:b_\YVR2„‚D+ …j6êTÛø÷öõôóòñðïíÁ³£y”ÊäãâªÝÜÚ;ÊÖÕÓÒÑÏÎÌËÉÈÇÅÄÂÁÀ¾½¼º¹¸¶µ}®­«ª©§’}Up ž›šŽr”^e‹‰‡…ƒPOywtroREa]ZWTQ?‚‚C)… 6éø&aöõôóò·BAAZ#iÖãâà=JÜÛÙ‰ÕÔÒÑ…,j‚D¼Ç®¸ÃÂÀ¿¾¼‚£¸·¶´F…®¬«M.yžm)”L'‹‰g4#/wurp$#4b_\YVRO>‚C)„nbè÷öpåóóñÄ$$Ak$°ØåäãâધÛÚØ;aÔÓ† j³\ÈÆMÂ5@zŽHH1ž…­¬«a~‘¤˜>‹4k g^j%$TXH[vsqW :c`]ZWTQNFC)ƒ1aööõõÇ~ññ¶‰ìëêjËåäãâàß0JÛÚØ×oS kÀÌu»Ç–5Ád)‚9'S^1Y>"tss/!U‰ÈÕºxÏ8€7˜6€'c¾½¼º¹¸_'´³\;Cw7^{z<˜—•”‘R€M<w|z6 ,#H3`]ZWTRN'ƒC)‚Aííììëëê¾è…ׄ>‚B!<~—p.-` 9ϧZ”“Á@¦¼»º¸·t<´²¯­n%’V,R4P;–•Š/O-€_z/]pL a^[XVSP'ƒC)‚@€ëYêééè°çæ“wäãâáàßÞÝÜÛÚÙØ×ÖLJS99Í̾±ÉÇ6eÂÁÀ³‚º¹¸¶µ´³²°¯®­«ª€B-¦¥£¢¡Ÿžœšb(zŠˆny1€6trpnkU([_\YVTQ(ƒC)‚@€émèèççæåääãâáààÞÞÝÜÛÚØØÖÕÔÓÒÑÏÎÍÌËÊÉÇÆ6M¶ÁÀ¿¾š(Œ·¶´³²±°®­¬«ª©§¦¥¤£¡ Ÿžœ›š˜ŽhM^ˆŽ‹‰ˆ†…k}djwurpnligeb_]ZWURƒC)?€çmææååäããâáààßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÏÎÍÌËÊÉÇÆÅpÂÀ¿¾½x‹¶µ´²±°¯®­«ª©¨§¦¥£¢¡ žœ›™˜—–”“‘Ž‹‰ˆ†…ƒ}{ywusqnljgec`^[XVSƒB(‚q?æååääããââáààßÞÝÜÛÚÚÙØ×ÖÕÔÓÑÐÏÎÍÌËÊÉÇÆÅ¬“À¿¾y2€·¶µ´³²°¯®­¬«ª©§¦¥¤£¢ Ÿžœš™˜–•”’‘ŽŒ‹‰ˆ†„ƒ}{ywusqomjhfca^\YVTƒB(‚>äãã€âkáààßÞÞÝÜÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÉÉÇÆÅÄ”’¿z3¹¸¶µ´³²±°¯­¬«ª©¨§¦¥£¢¡ Ÿœ›š˜—–•“’‘ŽŒ‹‰‡†„ƒ}{yxvtqomkifda_]ZWU‚B(‚r>ââááààßßÞÝÝÜÛÚÚÙØ×ÖÖÕÔÓÒÑÐÏÎÍËËÉÈÇÆÅÄÃon3Žº¹¸·¶´³²±°¯®­««©¨§¦¥¤£¢¡Ÿžœš™˜—–”“’ŒŠ‰‡†„ƒ}{zxvtrpmkigdb_][XU‚B(‚=ààß߀ÞjÝÜÜÛÚÚÙØØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂdJ»º¹¸·¶µ´²±°¯®­¬«ª©¨§¥¤£¢¡ Ÿžœ›š™˜–•”’‘ŽŒŠ‰‡…„‚}{zxvtrpnkigeb`^[YV‚B(‚=€ÞoÝÝÜÜÛÚÚÙÙØ×ÖÖÕÔÓÒÑÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ‘½¼»º¹¸·¶µ´³²±¯®­¬«ª©¨§¦¥¤£¡ Ÿžœ›š˜—–•”’‘Ž‹Šˆ‡…„‚}{zxvtrpnligeca^\YWB(‚<€ÜÛÛÚÚÙÙØØ×ÖÖÕÔÓÓÒÑÐÏÎÍÍË¥i7+Ž”‹%>o‡…ƒ‚€}{zxvtrpnljgeca_\ZWB(‚<ÚÙÙØØ×ÖÖÕÕÔÓÓÒÑÐÏÏÎÍÌ‚‘ƒŒ$eƒ‚€}{yxvtrpnljhfca_]ZXB(‚;Ù€Ø××€ÖÕÔÔÓÒÒÑÐÏÏÎÍÌ¿D€Bffee5ˆƒ‹ƒ 0JJ@&‚;€~}{yxvtrpnljhfdb_][XB(‚;××€ÖÕÕÔÔÓÓÒÑÑÐÏÏÎÍÌ̾+g¹ÅÄÃÂÁÀ³c…„  (f’Ž‹G €2€~}{yxvtrpnljhfdb`][Y€€B(‚:ÕÕ€Ô ÓÓÒÒÑÑÐÐÏÏÎÍÌÌËÊ7+¹ÅĈY54d…¾½™(‚†‹<[(€%U“’ˆdJIIi‰ˆ~,2~|{ywvtrpnljhfdb`^\Y€€B(‚:€Ó€ÒÑÑÐÐÏÏÎÍÍÌËËÊÉt+¹Äƒ€Ž»®(€‡Š rU_”‡G ‚U†…3W|zywvtrpnlkigec`^\Z€€B(‚9ÑÐЀÏÎÎÍÍÌËËÊÉÉ»¹ÄLw¹–ˆŠ Ig4 V”€4…ƒ|zywutrpnlkigeca_\Z€€B'9‚ÏÎ΀ÍÌËËÊÊÉÉÈÇr•Äe€·^ˆŠ ]U)•‹€4ƒr€Ozxwutrpnlkigeca_]Z€€B'‚8ÎÎÍÌÌ€ËÊÉÉÈÈÇÇÆ*5굇‰-Z>q”:[2)zxwusrpnlkigeca_][B'‚8€ÌËÊÊÉÉÈÈÇÇÆÅÅ­|ÂJ^´Qˆˆ 3O+•€h€rxvusrpnljigeca_][B'‚7ÊÉÈÈÇÇÆÆÅÅÄÃ}ªÀƒ'³|‰ˆ BF#D”Aƒi \xvtsqpnljigeca_][B'‚7ÉÉ€ÈÇÆÆÅÅÄÄÃÃÂd¿‘‡ ²†‰ˆ >@ M”%† I"?wvtsqpnljigeca_][B'‚6€ÇÆ€ÅÄÄÃÃÂÂÁÀ4¾‡!4°…ˆˆ :=g“‡/B~">wvtrqonljhgeca_][B'‚6‚ŀĀÃÂÂÁÁÀÀ¿c½ …]R¯…ˆˆ 38U’& …'_'B~!>wutrqonljhgeca_][B'‚5ƒÃ€ÂÁÁ€À ¿¿¾¾y¥».;ƒ’vO6®yˆˆ &-L’91)ƒv“wc$X}Svutrpomljhfeca_][‚B'‚5„Á€À¿¿€¾ ½½¼¥w¹IivfJ,`­Nˆ‰ '‘e N|vZ:~n€ivtsrpnmkjhfeca_][‚B'‚4€À‚¿€¾½½€¼»»º(2¸–G~V=PL+£¬ˆŠ €(gWAKR7E~Gwvtsqpnmkihfdca_][‚B'‚4ƒ¾€½¼»»ºº¹¹v‹¶^^|E9\]) x¬m‰Š(At  7Š]E_2 }Ewutrqpnlkigfdca_][‚B'‚3…¼€»€º¹¹€¸·©´G !PcQ/EjX&p«–‰‹‚'tkCgb:>if4#w~@ pvutrqonlkigfdba_][‚A'‚2‡º¹¹€¸··€¶~<³²~(#,  ,6ˆ« $‰‹€ƒ‹s(!.% 2-AzP€Swvtsrpomljigedb`_][‚A&2ˆ¸€·€¶µµ´´F0¦°°{Q10Pƒ««–$ŠŒ qЉ_7'&>t€P€/xvutsqpnmkjhgecb`_][‚A&1€¶‚·‚¶µµ€´³³²§&p¯®­­¬«« XŒŽF  G€‡†…„ƒ‚p*€/xwvutrqpnmkihgecb`^][‚A&‚1´´…µ‚´³³²²±±°¥E€DYwmX9 Du‡ˆˆ‰‡b*  4UedcJ*€ Nyxwvtsrponlkihfeca`^][‚A&‚0²ˆ³²±±€°¯¯®„/–&;ŠCB;)† @szyxvutrqpnmljigfdca_^\[‚A&‚0°±²‚±€°€¯®®­­¬¬—bC.ƒ-‚,‚+‚*‚)(‚'&%$€#"B_}|zyxwvtsrqpnmkjhgedba_^\Z‚A&‚/®¯ƒ°‚¯®®€­¬¬€«ª€©R¨§§¦¦¥¥¤££¢¡¡ ŸŸžœœ›šš™˜˜—–•””“’’‘ŽŒ‹‹Š‰ˆ‡†…„ƒƒ~}|{zyxvutsrponlkihgecba_]\Z‚A&‚.¬­…®‚­¬¬€«Yªª©©¨¨§§¦¦¥¥¤££¢¡¡  Ÿžžœœ›šš™˜——–•””“’’‘ŽŒ‹Š‰ˆ‡†……„ƒ‚€~}|zyxwvutrqpnmljigfecb`_][Z‚A&‚.ªª««ˆ¬«€ª€©¨€§¦€¥O¤££¢¢¡¡ ŸŸžœœ›šš™˜˜—––•””“’‘ŽŒ‹Š‰ˆ‡‡†…„ƒ‚€~}|{zyxvutsrponmkjigfdca`^][Y‚@&‚-§¨©©€ª„«€ª©¨¨€§V¦¦¥¥¤¤££¢¢¡¡ ŸŸžžœœ›šš™˜˜—––•””“’‘ŽŒ‹Š‰ˆ‡‡†…„ƒ‚€~}|{zyxwvutrqponlkihgedca_^][Y‚@%‚-¥¦§§¨¨‡©€¨§¦¦€¥T¤¤££¢¢¡¡ ŸŸžžœœ›šš™™˜——–••”“’’‘ŽŒ‹Š‰‰ˆ‡†…„ƒƒ€~}|{zxwvutsrponmljigfecba_]\[Y@%©¢”Ž@%€¦£”@%‚¢¤•@%„ž¥•@%‡˜§–@%Š’©–€?%‡®—€?%É—‘€?%–€*ˆ)…(„'ƒ&‚%‚$‚#‚"! €‚‘€?%€”W‚˜€—–••€”““€’‘€,ŽŽŒ‹‹ŠŠ‰ˆˆ‡‡†……„ƒ‚€~}|{zzyxwvutsrrppn*€’€?%’†–€•€”““€’5‘‘ŽŽŒ‹‹ŠŠ‰‰ˆ‡‡†……„ƒƒ‚€~}|{zzyxwvuttrrqpon_’?%‚‘_‚•ƒ”€“€’‘‘€3ŽŽŒŒ‹‹Š‰‰ˆˆ‡††……„ƒƒ‚€~}}|{zzyxwvuttsrqponml)’?%„ކ“‚’€‘€ŽŽ€Œ€‹*Љ‰ˆˆ‡‡†……„ƒƒ‚€~}}|{zzyxwvuttsrqponmlk]“?$…\€‘€’ƒ‘€ŽŽ€2ŒŒ‹‹ŠŠ‰‰ˆˆ‡‡†……„„ƒƒ‚€~}||{zyxxwvuttsrqponmlkji(‘‚?$†Š†Ž€ŒŒ€‹Š€‰ˆˆ‡‡†€…%„ƒƒ‚€€~~}|{{zyxxwvuttsrqponnllkii[ ‚?$‡ˆZˆŽ€Œ‹ŠŠ€‰ˆ€‡†€…'„ƒƒ‚‚€~}}|{zzyxxwvuttsrqponnmlkjihg4ƒ?$€‡†€‹ŠŒ‚‹ŠŠ‰3ˆˆ‡‡††……„„ƒƒ‚‚€~~}||{zzyxwvvuttsrqponnmlkjihgf_ Žƒ?$‰ƒg€‰Š„‹Š‚‰ˆˆ€‡††€…-„„ƒƒ‚‚€~~}||{zzyxxwvvutsrrqponnmlkjihgfed3Žƒ>$‚Š€$†€‡€ˆˆ‰ˆ‡††€…„„€ƒ‚€€€$~}}|{{zzyxxwvuutsrrqponnmlkjihgfedc\Œ„>#ƒŒc„„……€†‹‡€†…„„€ƒ‚‚€*€~~}}||{zzyxxwvvuttsrrqponnmlkjihgfeecca2Œ„>#„‰"‚ƒƒ€„…€„ƒ‚‚€.€€~~}}||{zzyxxwwvvutssrqpponmllkjihgfeedcbaZŠ…>#„ˆ_~€€‚‚ƒ…„ƒƒ€‚€€€~€}(|{{zzyyxxwvvuttsrrqpponmllkjihggeedcba`_0Š…>#€„† !{|}}~€€ˆ‚‚€€€€~.}}||{{zzyyxxwvvuttssrqqponnmlkkjihgfeedcba`_^Wˆ†=#…„ Zxyz{||}~~€ƒ€„€€~€}||{{€zy€x$wvvuuttsrrqpponnmlkjjihgfeedcba`_^]\/ˆ†=#‚…‚ € ƒ!”"†!„ ƒƒ‚‚‡‡="ƒ†Ä™ˆ="ƒ‡Ášˆ€¾§‰äÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿÿþŸž˜“Ž‹˜Šž‰—ˆ‡…†…€{tgM‚ š‚jZMH„GFEžD‰C…BŒA@@EMTN5 ’‹b5 ‚ ‘‰†…ƒ (y~[$ „ “‰†…„€kc1 ‚ •ŽŠ†…„€_N ™ŽŠ†…„T>‡e"nnmmllkkjjiihhggfeedccbba``_^^]\\[ZZYYXWVVUUTSSRRQPPOONMMLKKJJIHHGFFEDDCBA@@?>=<;:987654310/.,+*('&$#„€J2 †T´ÿ˦Œÿýú÷ôñîëèäáÝÙÖÒÎËÆÂ½¹µ°_¢˜“ˆR„‚D+ …Tÿ†ŒÿÃï‚ÿ€ÿ_—ÿÌëƒÿïˉ¸ÿ ýêºô˜¥ëèåáÞÛ×Ó‚€Èÿ»¶†qŸš•‹…h ‚‚C)…Tÿÿ:ƒÿihh6©ÿaw€ÿÞÿ×E¬Òl‡ÿÔ‚ÿ*qØ€ÿ,}I&Æÿ²$Bô{?ëèåâ§U8MÅÀ¼¸:9T¡œ—’ˆƒf‚C)„ž€ÿµ!‚ÿ 88g®7…ÿÿ^ÿÿØ0¬ÿ”ÿÿ}ÿTgÅéèvu*OÿíØ€ÿ-žÐÎîÿúfãS®2©˜ëè¬<:ˆ‘t•½¹ _£žš”‹…€sC)ƒ‚ÿË€ÿ Ý€ÿ¬„ÿJvÿ³†0®ÿÿ¾ÿÿôUÿ¡@‚=†—N_p‡ÿ(v%tDþûê2"Ój/X¨Ü–ÒÎ5@Û1%[”¥ ›—’ˆ‚~x%€C)‚Rƒÿ8€h‚ÿƒÿºÿˆ1ØÿC€ÿÿߣ‚ÿùšÿÿ—€£€ÿô|IHX©ù¶$ƒþûùØ"wÉâßÜ{ihÃy€ N«¦¢˜”Š…€{<‚C)‚jƒÿ™PÈÇÿÜO‚ÿ¿‚ÿù€ÿž€F‚ÿ§ÿÿ¤îƒÿP™à“€ÿÒ8Œ‹X†cýûøö™¯åâßÜ£^€ F°¬¨£Ÿš–‘Œ‡‚}=‚C)‚i„ÿ €ÿNÙ‚ÿzyÿ‹ÿ²ÿpƒ€ÿVÿÿ-„ÿbOàN)o€ÿlŒ€ÿ*éfíúøõóây<ßÜo…Ïš£;œ­©†–œ—“ŽŠ„>ƒC)‚h„ÿ€ÿ«cb4»º¹I3ŠÞ€ÿÃÿZ€X÷V€- ƒÿ™<ÿÿ•^mÁX˜ÈÆbúøõó1î…€}aÃÌÉXH9v,S™”‹‡‚?ƒC)‚h„ÿÿÿØÿÕc‚3`Ì÷µHG›1ZÿÿÐ/‘òðÿgƒÿ"¼aÿÿíÿÿ²9'ïŠG&%„S‚a÷õãÐëKI€+*šÉL™·|. Ÿš–‘ˆ„@ƒC)‚g‡ÿíÀÿÚ†[ZêƒÿV¤ÿ,Ô‹ÿÑkI†ÿýž@"0íêèÉâß´,ÇQ€WÀ¼¸´°A+–œ—“Š…AƒC)‚f¤ÿV}‚ÿü>+ã•ÿ%ýúéª|˜àíêèåâßÜÚ¯ÔÑÎ¥®ÃÀ¼¹µ±­ª¦¡™•Œ‡2ƒB(‚e¤ÿ¶‚ÿÂ++â”ÿ&þüúøõóñîìêçåâßÜÙ×ÔÑÎËÈÄÀ½¹¶²¯ª§£žš–‘‰"ƒB(‚d¤ÿð€ÿÃ,QÒ–ÿ&ýûù÷õóðîìéçäâßÜÙ×ÔÑÎËÈÄÁ½º¶³¯¬§£ ›—“ŽŠ#ƒB(‚c£ÿñîÿÅ,Qæ—ÿ(þýûøöôòðîëéçäáßÜÙÖÔÑÎËÈÅÁ¾º·³°¬¨¤ ˜”‹#‚B(‚c£ÿµ³,Rç™ÿ(þüúøõôñïíëèæäáÞÜÙÖÔÑÎËÈž»·´°­©¥¡™•‘#‚B(‚b£ÿ¢yé›ÿ(ýûù÷õóñîìêèåãáÞÛÙÖÓÑÎËÈÅ¿»¸´±­ª¦¢žš–’Ž$‚B(‚a¤ÿëÿ)þüúøöôòðîìêçåâàÞÛÙÖÓÑÎËÈÅ¿¼¸µ±®ª§£Ÿ›—“$‚B(‚`˜ÿ©WCŽ”‹‚†‹<[(€%‹òðߣxvv¬âàÐGQÏÌÊÇÅ¿¼¹¶³¯¬©¥¢ž›—“%€€B(‚\‘ÿ »BÿþÖ)€*æÿÿ>€‡Š rUšóÞs‚‹ÝÛT€ÌÉÇÄ¿¼¹¶³¯¬©¦¢ž›—”&€€B(‚[‘ÿ.ÿÿ{¿ÿöˆŠ Ig4 ŒôÓ-€UÚØ+ÌÉÆÄÁ¾¼¹¶³¯¬©¦£Ÿ›˜”&€€B'‚Zÿ¹óÿ£Ðÿ™ˆŠ ]UAõä1€T×»€€ÉÆÃÁ¾»¹¶³¯¬©¦£Ÿœ˜•&€€B'‚ZÿBUÿþÿÿ‡‰-Z>¹ô^”ÔQBÈÆÃÀ¾»¸µ²¯¬©¦£ œ™•&B'‚Yÿ Éÿx€—ÿ„ˆˆ 3O+#ôÔ€Ô«€¼ÅÃÀ½»¸µ²¯¬©¦£ ™–&B'‚Xÿ Éÿÿƒ<ÿʉˆ BF#nôhƒ¬Ñ–ÅÂÀ½º¸µ²¯¬©¦£ ™–&B'‚Wÿ¢ÿì‡ ÿÛ‰ˆ >@ }ò<† wÐ6eÅ¿½º·µ²¯¬©¦£ š–&B'‚VÿTÿê‡!4ÿÙˆˆ :=¨ñ.‡/kÏ6eÄ¿¼º·´²¯¬©¦£ š–&B'‚Vÿ  ÿé …]Rÿ؈ˆ 38‰ð> …'_'kÏ6eÃÁ¿¼¹·´±¯¬©¦£ š—&B'‚Uÿ Ãÿÿ.;ƒ’vOIÿňˆ &-{ï]1)ƒv“vc$ΈÃÀ¾¼¹¶´±®¬©¦£ š—&B'‚Tÿ ÀÿwivfJ,–ÿˆ‰ ?î¤ N|vZ:!Ï´€¬ÂÀ½»¹¶³±®«©¦£ š—&‚B'‚Sÿ>PÿõG~V=PL+ÿÿ(ˆŠ €(Ðë0gWAKR6mÏt(Ä¿½º¸¶³°­«¨¥£ š—&‚B'‚Sÿ¿âÿ˜^|E9\]) Äÿ±‰Š(jê¾ 7Š]E_2 *ÐÎpÃÁ¿¼º·µ²°­ª¨¥¢Ÿš–&‚B'‚R‘ÿ**ÿÿs !PcQ/EjX&³ÿö‰‹‚'¾è­Cgb:>if42ÄÏh¹ÂÀ¾¼¹·´²¯­ª§¤¢Ÿœ™–&‚A'‚Q‘ÿÎ`ÿÿË5#,  ,BÖÿÿ9‰‹€ Øåº8!.% 2-_ÆÐ‚€‰Ä¿½»¹¶´±¯¬ª§¤¡Ÿœ™–&‚A&€P’ÿrM€ÿ Ç‚NL€Õÿÿô8ŠŒ .ºâášX=!==€<;;€:!99887kœÍËÉÈÆÄÂÀ¾¼¹·µ³°®¬ª§¤¢ š—•&‚A&‚K°ÿ=þýûúùø÷õôóñðïîìëêèçåäâáßÞÜÛÙØÖÕÓÑÐÎÌËÉÇÅÃÁ¿½»¹¶´²°­¬©¦¤¡Ÿš—”&‚A&‚J®ÿ?þýüûúø÷öõôóñðïîìëêèçåäãáàÞÝÛÚØ×ÕÔÒÐÏÍËÉÈÆÄÂÀ¾¼º¸¶³±¯­ª¨¦£¡žœ™—”&‚A&‚J­ÿ@þýüûúø÷öõôòñðïîìëêèçåäãâàßÝÜÚÙ×ÖÔÒÑÏÎÌÊÈÆÅÃÁ¿½»¹·µ³°¯¬ª§¥£ ž›™–”&‚@&‚I«ÿBþýýûúùø÷õôóòñðîíìëêèçåäãâàßÞÜÛÙØÖÕÓÑÐÎÌËÉÈÆÃÂÀ¾¼º¸¶´²°­¬©§¤¢ ›˜–“&@%‚GªÿCþýüûúø÷÷õôóòñðîíìëêèçåäãâáßÞÜÛÙØÖÕÓÒÐÏÍËÉÈÆÅÃÁ¿½»¹·µ³±¯­ª©¦¤¡Ÿš˜•“&@%©¡”@%¥£”@%ƒ ¥•@%…œ¦•@%‡—¨–@%‹«–€?%’€²—€?%É—‘€?%–€C…BƒA‚@‚?€>=<€;:99€8€7€6€544€3221100’€?%€”Ž€úùù€ø>÷÷ööõõôóóòññðïîííìëêéèçæåäãâáàßÞÝÜÛÙØØÖÕÔÒÑÐÏÎÌËÉÈÆÅÄÂÁ¿¾¼º¹·¶E€‘?%’#ƒ÷öö€õ>ôôóòòññðïîîíìëëêéèççååäââáßßÞÜÛÛÙØ×ÖÕÓÒÑÐÏÍÌËÉÈÆÅÄÂÁ¿¾¼»¹¸¶´’?%‚‘š…ô@óóòòññððïîîííìëêêéèççååäãâáàßÞÝÜÛÚÙØÖÕÔÓÒÑÏÎÍÌËÉÈÆÅÄÂÁÀ¾½»º¸¶µ³²D“?%„Ž"ññ€ò‚ñ€ð<ïïîîííìëëêéèèçæåääãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÏÎÍÌËÉÈÆÅÄÂÁÀ¾½»º¸·µ³²°™’‚?$…–î„ïî>ííììëëêêéèèççæåääââáàßÞÞÜÛÛÙÙØÖÕÕÓÒÑÐÏÎÌËÊÉÈÆÅÄÂÁÀ¾½¼º¹·¶´²±¯­B‘‚?$†Š!ëë†ìë=êêééèèççæåääãâááàßÞÞÜÜÛÚÙØ×ÖÕÔÓÒÑÏÏÍÌËÊÉÈÆÅÃÂÁÀ¾½¼º¹·¶´³±¯®¬• ‚?$‡ˆ’èè€éêé€è€ç9æååääãââáàßßÞÝÜÛÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÉÈÇÆÅÃÂÁ¿¾½¼º¹·¶´³±°®¬«©Uƒ?$€ˆ….ä€åææ„çææåääã€â5áàßßÞÞÝÜÛÛÙÙØ×ÖÕÔÓÒÒÑÏÎÎÌËÊÉÈÆÅÄÃÂÀ¿¾½»º¹·¶´³±°®­«ª¨œ Žƒ?$‰ƒ¨ááââãã†äãã€â€á7àßßÞÞÝÜÛÛÚÙØØ×ÖÕÔÓÒÒÑÐÏÎÍÌËÉÈÈÆÅÄÃÂÀ¿¾¼»º¹·¶´³²°¯­¬ª¨§¥S„>$‚Š€:ÜÝÞ€ßàˆáàà€ß9ÞÞÝÜÜÛÛÚÙÙØ×ÖÖÕÔÓÒÒÑÐÏÎÍÌËÊÉÈÇÆÅÃÂÁÀ¿½¼»º¸·¶´³²°¯­¬ª©§¥¤˜ Œ„>#„‹¢ØÙÚÛÜÜÝ݈ÞÝ݀܀Û5ÚÙÙØØ×ÖÕÕÔÓÒÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÀ¿¾½¼º¹¸·¶´³±°¯­¬ª©§¦¤¢¡QŒ„>#„‰ 7ÓÕÖרØÙÙÚŠÛÚÚ€Ù7ØØ×ÖÖÕÕÔÓÒÒÑÐÏÏÎÍÌËËÉÈÈÆÅÅÃÂÁÀ¿¾½¼º¹¸¶µ´³±°¯­¬ª©§¦¤£¡Ÿ” Š…>#„ˆ ›ÏÑÒÓÔÕÖÖׂ؂قØ:××ÖÖÕÕÔÔÓÒÒÑÑÐÏÎÎÍÌËÊÉÈÈÆÆÅÃÃÂÀ¿¿½¼»º¹·¶µ´²±°¯­¬ª©§¦¤£¡ žœOŠ…>#€…… 5ÊËÍÎÏÐÑÒÓÔÔÕ„ÖÕÔÔÓÓ€Ò3ÑÐÐÏÎÎÍÌÌËÊÉÈÈÆÆÅÄÃÂÁÀ¿¾½¼º¹¸·¶µ³²±°®­¬ª©§¦¤£¡ ž› ˆ†=#…„ “ÅÇÉÊÌÌÎÏÏÐÑÑ€Ò†ÓÒ8ÑÑÐÐÏÏÎÎÍÌÌËÊÉÉÈÇÆÆÅÄÃÂÁÀ¿¾½¼»º¹¸¶µ´³²°¯®­¬ª©§¦¤£¡ ž›š˜L‡‡=#‚…‚233445ƒ6Š7†6ƒ54321€0€/€.€-€,€+**))€('‡‡="ƒ†Ä™ˆ="ƒ‡Àš‰€¾§‰äÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÿt8mk@@Ÿ¿ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁ’5Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûïïïïïïïîîîîîîîîî÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾¼»¸¶µ´´´´´´´´´¹öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ̸´®©¦£££££££££Òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿܳ« —‘ŒŠŠŠŠŠŠŠ‘øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí¬ €vnjiiiiii¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÎßÿÿÎÖûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦”}hXLFEEEEEFÑÿÿÿÿÿÿÿÿÿÿçÛÿÿßÒûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÁÕîíÅ»ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´qWB4+((((()ÿÿÿÿÿÿÿÿÿÿûÂÉîíÓ¸Ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿз³¯¬¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹ŠlL4"3ÿÿÿÿÿÿÿÿÿÿÿḵ±­¶úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûå·°© š—ÑòóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË‹kI- Gÿÿÿÿÿÿÿÿÿûû¼³¬¤š¿ÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛż¯¥™‹||‡ÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓŽoK-DÿÿÿÿÿÿÿÿóÂ˳©ž‘…~˜¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿκ²¥–…se_^c¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ“uQ1 Eÿÿÿÿÿÿÿÿß»µªœŒyjb`cwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙ¾º™…pYIBAG¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË–yU5 Gÿÿÿÿÿÿÿÿ긹 ŒxaOECFiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûúíu]D2*ÉËÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™|X7 8ÿÿÿÿÿÿÿÿûìú›}eL7,zتÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹iO5"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿš~[9  ÿÿÿÿÿÿÿÿÿÿÿÛpV<'Gñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ߀žÒËHPðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³š~[9  ·ÿÿÿÿÿÿÿÿÿóž~¨šYBðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì“´ÿÿZTÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû­™}Y8  pÿÿÿÿÿÿÿÿÿù ’ÿÿ’¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿÿòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí¬—zV6  Øÿÿÿÿÿÿÿÿÿÿîÿÿåòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿܪ”wS3 _ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŨ‘sN/ $«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûµ¤ŒmI+ 5Ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,In‹¡°¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸°(Ce€”¡¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¡#:Wn€‹‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‹ .EWenssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssn .:CILLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLI #(,........................................................................................................................, milkytracker-0.90.85+dfsg/resources/pictures/carton.icns0000644000175000017500000013214010737746457022464 0ustar admin2admin2icns´`ics#HÀàðð?ø?ø?ø?ø?ø?ø?øðÀ€Ààðð?ø?ø?ø?ø?ø?ø?øðÀ€is32­ÿjˆÿ\´¤‚†ÿªÿ÷Ϫÿƒÿ …ª‡ÜûùÚƒƒÿ »ÿß¼–ÜßO}ÿ ãü÷öÝ£{Q €ÿm~ñÿÑžÍÝN‰Û‘ÿÿ\¶íÞ´„y¾pÿ8p©ØÝ}Ÿf ÿ$1tÌÆ«s) ÿ$=Gä®V' ÿ=S^ç¸& ÿÿFd\\ë·+) €ÿ ?v¢ªâ¶•`+ ‚ÿ $‚Åã­€M„ÿfˆ‚ÿÿ$wˆÿwÀ²—†ÿ½ÿúÛÀ³ÿƒÿ ³½¡ãúü뱃ÿ Îÿåɬâè–¬ÿ •èûø÷嵦£µ €ÿ|“ôþÚ²Õã˜Åê›ÿa¡Ñï㿯ºÔ¡M*ÿoвËäèµÊ°fFKÿOc§âßÑ¢XVNiÿ~Oo…¼ñÑ€2|KZÿqTo òÚ«2yG:ÿÿ`š¤–žôÙ¬]E"ÿÿ"ƒ²ÏÏîØË­u;ÿ U­Ûóб„„ÿ™»®‚ÿÿHˆÿ’Ñ쀅ÿÖÿÿîßßÿƒÿíÙ¿ò€ÿçƒÿ ëÿóÜÆïûàÛÿ«ó€ÿôÌØòÝ €ÿ|®ÿÿéËãðáýþ¬ÿ°èìùïÐß÷ðÕ‹UÿÆÚíñøýïõô·‹‡ÿÞˆ—ÝûúöÒ‚˜”´ÿÛˆ£Êîÿó«SÕ’´ÿÇ£ÒæÿüÚTЋmÿÿªîàÖåÿúÛÝ…DÿÿQÃêþøþøÿó¿mÿ mØõÿó亄ÿÌîå‚ÿs8mk</ûÂJŸÿÿÿÀJ,ùÿÿÿÿÿvŸÿÿÿÿÿÿ÷A.ùÿÿÿÿÿÿÿê+•ÿÿÿÿÿÿÿÿÿÓ ¬ÿÿÿÿÿÿÿÿÿù$ªÿÿÿÿÿÿÿÿÿõ"ªÿÿÿÿÿÿÿÿÿõ"ªÿÿÿÿÿÿÿÿÿõ"«ÿÿÿÿÿÿÿÿÿö#¢ÿÿÿÿÿÿÿÿÿó|çÿÿÿÿÿÿ®8}çÿþ®8–FICN#0|ÿÀÿðÿøÿüÿþÿÿÿÿÿÿ€ÿÿÀÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿÀÿÿÿü?ðÀ0|ÿÀÿðÿøÿüÿþÿÿÿÿÿÿ€ÿÿÀÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿàÿÿÀÿÿÿü?ðÀil32›†ÿKH˜ÿˆŸ\–ÿC¸§£›W”ÿ •ÿôÈ©¦œ`‘ÿ GëÿøþõͰ«ŸfŽÿ£ÚÒûûøýöÑ·°¢vÿ[æO2Êáÿúùý÷Ôê3‹ÿ«úv¥ÁãøùøüþŸ‹ÿ^íúþû¿Ýi££ÿûúôOGi‰ÿ©ÿ€ø þøÊƒVŠÞúª!]–ˆÿ\íú€øúûýúÌbMßI6R}®X†ÿ«ÿ€øúéáúùýÛÍ®&Xp€’«I…ÿeöý€øö“nðôûÿùMFfƒ Ë؃…ÿ*ŒàÿûøóŽªrh¼ì²6_w áÿâk„ÿK–áþüýðná^Pl«òà„(„ÿ!FUk£âýüýúðBi·ÞšJ ƒÿ!I_s‰±äüûýhf¯ªoX> ƒÿ$+At—¢¦©Àì»[ž™‡k^= ƒÿ%"h¢µÉÓÈŠ¦­žh6  ƒÿ(%2$0ÅÞëÅÀ¬–T1 "ƒÿ'%REF,•äê˾ 0,? ƒÿ%O@nR:ÅíѾ£†~> ƒÿ%O@kS¥ñÖ¼¬¡y> ƒÿ%N@kS§ñܼ«žy> „ÿ"?(T „ÿ#I^uWuN§ò伫žx6@ „ÿ"F`t“£p"¤ñÞ¼«†c^? †ÿBn˜¢³­Çí×¼«œ‹m`A$‰ÿ.f•·ËßêÓ½«ž’gHŒÿ9}·æíÌÀ´f(ÿ M×̯4”ÿffXŠÿ…ÿx_˜ÿ ¡e–ÿb˼°¥m“ÿ ­ÿ÷×À·­{‘ÿ róýøü÷ÛÇÀµŽÿ¾ãÜûúøü÷ÝÐÌ®ÿñn^ØéþùøûøäßËp‹ÿ 'Êû¸‘œºÍ逸úûÈr‹ÿõùýüÌ䂳¶þúùõ”—˜‰ÿÀÿ€ø üøØ›}£åøÃv­Ä–ˆÿôù€øúúüûÛ‰lä…‰ °Äj†ÿºÿ€øúïçùùûã×Áw©¾´¶¶W…ÿløü€øö©Žòõúý÷˜¹½ÌàÚ†…ÿP§âýúøô¤¾Ž‚ÊïÁ³»Êîÿã†"ƒÿTvˆ²æüûüñ²¡…奺Ñõã¤aC6ƒÿY}–©¦¼èûûüúÏżØâ´ŽqTE<ƒÿ b}—¶¿¹µÇé€ú  µÑÁ¯¦“uVFHƒÿi€l‡¾ÅÎÌÆÖñԡƾ¼¿±ŠQTFUƒÿt‚T#X›Ì×áåÞ½ÌÑËÆ¸o$4WGaƒÿW"h^m³ÝíôßÞÒ€5wvUHqƒÿ~WŠ|~y¾ñóâÝÇXR*“sUHoƒÿq‚W‡xž•ˆßôäÝɳ¯ )sVG_ƒÿf‚W‡x›•pÌ÷èÜÒΪ )sVFNƒÿ]‚W†y›•rÎ÷ëÜÑ˪ )sVFBƒÿU‰^Žuš•rÎ÷ïÛÑ˪$sVE8„ÿMƒ˜µ¿Œ¤’qÎ÷ðÛÑ˨5j“rVH-„ÿ"Z޹¿ÁͨzÌ÷ìÛÑɹ²°“zX7…ÿA‚¯ÉÍÖÏàôèÜÑÈÀÁ²‰a.ˆÿU“ÀÜâíóåÜÑÌǬ€9Œÿh¦ÓõõâßÚº•Qÿ Âçåаb”ÿ¢¨•Šÿ…ÿ¥z˜ÿ›§m–ÿ€ãÕÀ¯{“ÿ ÉÿÿëÙËž‘ÿž‚ÿñçÝÔÄŽÿ:áðë‚ÿõòíéçÿÓÿŠëù‚ÿúÿòÌ‹ÿ ÄóÿÙ³¾ÔÝö‚ÿöЊÿÎÿÞð ÉÍÿÝë͉ÿÞƒÿ î¹¥½óÿåÑôñ²ˆÿŸ†ÿ ñµŒðÅæçèàv†ÿË‚ÿüô€ÿ òè×ÏøüêÚÃ]…ÿyƒÿİü€ÿ üºðû÷ùù㌅ÿwÉí€ÿý¾Ø­žÞûÕÖûøùÿÿì¦Dƒÿ˜ÕÉÎð€ÿû˹¡ïÊöúüÿêÄ¡‡fƒÿžÞïðÖØôÿ ââäþüïÓÑË£…qƒÿ ¯ÜîÿÿñÞä÷€ÿ âúòáåôíÒ¢†‰ƒÿ¾á®ÂüüûóéóüöíðéõÿÿÝ ˆƒÿÍãŠDŽÕùúúüøóó÷úÿ÷£=_¥‰´ƒÿ ÙãŽCœŸ±æùÿÿ€ù ñ­R0ÁÓ¢‰Âƒÿ×ãŽA¿¿¼Ìëÿÿúùï„z1HëÍ¢‰ÂƒÿËãŽA¼¼ÑÝÚüÿüøðãã7FçÍ¢ˆ°ƒÿ¸äŽA¼¼ÐÜÓøÿü÷øþÞ6Fç΢‡•ƒÿ¨åŽ;»¼ÐÜÔøÿü÷÷ûÞ6Fç΢†ƒÿ˜ßړĹÏÜÔøÿý÷÷ûÞ2?ç΢„i„ÿ†æñþüËÖÚÔøÿý÷÷ûÜQžë̤‹U„ÿ<™Ûÿþøøã×÷ÿü÷÷ùððÿíמg…ÿ`µêÿûøôüÿü÷÷øøÿÿÒ›KˆÿsÂíÿûÿÿü÷÷ûÿåµVŒÿ–ÔòÿÿúúÿèËyÿ ¹êüÿñ㢔ÿâìØŠÿl8mk8&ù±:mÿÿÿ°: ßÿÿÿÿÿ°:oÿÿÿÿÿÿÿÿ°9 Þÿÿÿÿÿÿÿÿÿÿ°6oÿÿÿÿÿÿÿÿÿÿÿÿó ÞÿÿÿÿÿÿÿÿÿÿÿÿÿŠoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\ ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüSnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï+ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä&qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿǸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿx¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ;¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù #B¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿùŸ,B¹ÿÿÿÿÿÿÿÿÿÿùŸ,B¹ÿÿÿÿÿÿùŸ,B¹ÿÿùŸ,PÎ.ich#H€àøþÿ€ÿàÿøÿþÿÿ?ÿÿ?ÿÿ€ÿÿÀÿÿàÿÿÿðÿÿÿðÿÿÿøÿÿÿüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿðÿÿÀÿÿÿü?ðÀ€àøþÿ€ÿàÿøÿþÿÿ?ÿÿ?ÿÿ€ÿÿÀÿÿàÿÿÿðÿÿÿðÿÿÿøÿÿÿüÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?ÿÿðÿÿÀÿÿÿü?ðÀih32 Šÿ3¨ÿ›y§ÿtÉ»p€¤ÿBΊƼr€¡ÿ ˜ÿÿØŽ„Ç»q€Ÿÿ CíúøûÿÜ‘ŠÉ¾u€œÿžÿøûÿß™ŽË½z€™ÿHïÿÿùøûÿࠔ˿~€—ÿ¥ýxžñúúø ûÿ⥛ÎÀ…5–ÿ Xù´ (vÿëøùøúÿ槣܄”ÿ «ÿ€?#Š„}ýòöùøúþé¾W”ÿgóúôÎsê<ŸûTÙöõ‚øþÚ0*’ÿ¯ÿøùýþïƒòªCóT×ÿù€øýtVM‘ÿ\ôùøùÿÿ°t¥–ÀïýúüÒ$A_™kÿ±ÿ…øúîžxCf‘Ûèÿp@^ƒ¹^ÿ_öù†øúýü­c^*Ô×,KHi¯¬ÿ²ÿ„øýý€øùü´NvÿoH\ihiÀ²ŒÿcøùƒøüÀÈ‚øÿõýÔ!9Ybw”r¹®Šÿ¿ÿƒøùë¡=Éÿþþøøùÿp#S^o†—¥ÊÅ¥UŠÿ5Ðþý‚øÿ?~ëÀ¿ÿûüÕ(G[h~’¢Ö÷ÿÿŸ‰ÿ-xÐýü€øúä—Ígp'š’Íÿz/Xbw‹ªæüÿë˜7 ‰ÿ#'@zÓýüøøûÿý¿qAÉ4æÝ4Q^nƒ¼óÿê›C ‰ÿ &EQQ‡Óüü€øþëâ¸Zÿ~;\eƒÒÿë¡M ‰ÿ#'E[^hiŒÖþûøøúü÷ÐÕ?U]‹Þí¦hJ* ˆÿ'EZ\oŒŠz˜Úýû€øÿ‡B^žÞ¬s_]J* ‡ÿ%'A[^n‰–¢œŠÛýûûáKe¢­…ƒu][K+ ‡ÿ%*%KqŒ•ž©·¶¡«Þÿ‘K’š™—Šr^]N$  ‡ÿ%*# )n™£©³ÄÙа«]‘°¯Ÿ”‰taL ‡ÿ%'+# 8­·ÃÔàñȯ˱ªŸ—Ža% 3‡ÿ%0+#;^ ?”ÄÔßëÛÁ±«¤7 F-E‡ÿ%2*#=ˆ>1ÚßëÝŲ§F K+"E‡ÿ%$+#<ƒa¡hÜàëßdz™$_vJ+ ‡ÿ%+#<ƒ\£!lßêâÍÁ±¦šœ{J+ ‡ÿ%*#<„]¢!<ÙëåÐÁ±ª –yJ+ ‡ÿ%+#<ƒ^¢!AÙëçÔÀ±ªŸ–zJ+ ˆÿ#+"<ƒ\¢!AÙêêØ¿±ªŸ–zJ+ ‰ÿ#(;":„]¢!AÙêíÝ¿±ªŸ–yJ+ ‰ÿ#'F]FQ ]¢!AÙêï῱ªŸ–zJ+ ‰ÿ#&EZ^q‡:_¡ AÙêï࿱ªŸ–yEL* ‰ÿ# 1HZ\oŠ–—Ÿ#@ÙêìÜ¿±ªŸ•R_^K* Šÿ!8Yan‰• ª“RCØëè×À±ªŸ”Šu^[J,&"ÿGs–ž¨·Ç·ÚêæÒÁ±ªŸ”‰r\_U2 ‘ÿ,a“¥©³Ã×àêåÏÁ±ªŸ”‰viU/•ÿ8p¦ºÄÔßêâÌÁ±ªŸ™‘e=™ÿAÁÜàëÞÆÂ°°¨zIÿ L–ÛôÝÃÉ»‘U¡ÿ Y©ÐÀ¥b¥ÿUV’ÿŠÿz:¨ÿ(Ÿx€¦ÿ…ϼy€¤ÿ bâ§šÎÀ‚ ¡ÿ ´ÿþ媡ÒÃ…#žÿm÷øøúþ篦×É0œÿ'ºþø úþ鵬ÚÌš;™ÿ{øÿþùø úýé¼²ÛЫ^—ÿCÂÿ‘´õùùø úýêÄÂãÔ·Š–ÿ ýÂ@\•ÿïøùøùüîÉËò°”ÿ fËÿ›sMž¬£ûö÷ùøùüïÚš”ÿ¤ùøøßñ]°ýrâøö‚øûç†{’ÿOËüøøûþôõ¹[ùrãÿù€øü§w¢†‘ÿ‰ùƒøÿþÁ™µ?±Íñüùûßv‘¯ÈŠÿ>Èý…øúó³œl‰¥äíýškޱÄÑ{ÿƒü‡øùüüɃIßáhƒ••ŸÔ¾ÿ#Åý„øüü€øùûÆv‹ÿ“q•®¿¢—Ù½Œÿxü„øûÓÕ‚øþøþÛf‹¥º¼Ã™ȲŠÿÈþƒøùð·hÎÿýü€ø þŽxœµ¾»ÇÏãÉ©\Šÿ@×ýü‚øÿŸcžÐ¾ÍÎÿúûÙe•­½»ÂÎç÷ÿÿ¡‰ÿ=iŽÖüû€øùé°Ùƒ‹K«©Ûÿ•€¦º»½Ðïúÿé£b8ˆÿ%Kxzz—ÚýûøøúþüË“ZÖNíàsžµ½ºÚöÿèªpOB<‡ÿ Ou—£Üüû€øýïêÅzÿ ˆ­»¾äþ걆r_J@?‡ÿ%Tu”¦»±–«ßüúøøùúøÜÝ€¤¸Èë츑‰n]K@D‡ÿ]u•¥·¿À¸¤³âüú€øÿª‘¶Ô澡­ª–…o]K@K‡ÿ%cuާ»¾½ÄÎÆ°¶åûúú葳ÐÁ¬µÁ¹§–ˆs]K?O‡ÿ%hu†cKšÂÁÃËÑÙÑÃÈçÿ»˜¿¿ÁǾ¾¸«›p9[K?S‡ÿ%ut†b-c£ÆÎÐÖÜêäÏϤ¾ÒÓËĽ¾‘@^K>]‡ÿ%€t†b"+cª‡ÿ%tt†b"&w»K‘ÌqvªîóíáÞÖÍÅͬ&%”†o]K>\_‡ÿ%gu†b"&vºK‘ËqtêóïãÞÕÐËÇ«&%”†o]K?Q‡ÿ%`u†b"&w»K‘Ìqt‘êóñçÞÖÐÊÇ«&%”†o]K@M‡ÿ%Xu†a%w»K‘Ìqt’ëóòèÝÖÐÊÇ«&%”†o]K@G‡ÿ%Ou‚…O's»K‘Ìqt‘ëóôëÝÖÐÊÇ«&%”†o]K@@‡ÿ%Ku–©•”·GÌqt‘êòöîÝÖÐÊÇ«&#•†o]KA=ˆÿ#Cz”¥»Á¼p”Ëqt’ëòöíÝÖÐÊÇ©$A™…o]JD7‰ÿ#W„𦷽½ÄÅÈrp‘ëóôêÝÖÐÊÆ±”º¬–…n`W@Šÿ!6q¨¾¿½ÃÌÑÀ–’êóòèÝÖÐÊľ¸§•Š|]6ÿI„»ÄÄËÐÙÝÖëóðåÞÖÐÊĽ¾¸­ŸzI‘ÿRÃÒÑÖÛèîóïãÞÖÐÊĽĽ‹Y”ÿeœÏÝÜæîóíáÞÖÐÊÊÜm—ÿ€p¨ÛîïóìßßÕÕѧy›ÿ€ yºðúìÝäโ'Ÿÿ $“ÈçÝÈœW£ÿK  i’ÿŠÿÌo¨ÿ7¨y€¦ÿ ˜ÙÆ ¤ÿ ‚ûǵÚÈ‘)¡ÿ 3ÕÿÿøÉ½ßÌ–Xžÿ•‚ÿùÎÈêÚ®yœÿ[Ù„ÿüÛÐñãÄŽ™ÿ®‡ÿûäÜôéÞ½—ÿ“éÿ­Î†ÿûëíþïëé•ÿ ÏÿÓbŽ´ÿû…ÿýðöÿá”ÿ Ìöÿ·«y¹ØÏ‡ÿþýà™”ÿë€ÿùµÿÅÿ’ð…ÿüßÔª’ÿ£óƒÿ»ÿÍvÿ’õƒÿâÔöÆ‘ÿĆÿÛÁËeÏÝû€ÿôËçøô¶ÿuåˆÿÏ—«½ôùÿÎÉàòÿñ›ÿ§‹ÿ꽬gñðµâêÚÜÿÔ0ÿBÛŒÿÞ¢¤ÿ¶ÎíùÿÜÉöË3Œÿ†ÿêç…ÿ æªëôüøûï¼Ü½Šÿ&Ø…ÿþєۄÿ ¬Óòüú÷÷ùÿÒ³fŠÿKå…ÿ´ˆÂãØÞá€ÿâ§ñöü÷÷øý€ÿ© ‰ÿh©¨äƒÿöÎ죬nÂÇîÿ³Úöüø÷ùþÿÿðµ’gˆÿÚе´æ„ÿÞ¸vêjûè·ôûú÷ûÿÿﻣ—ƒq‡ÿ ˆÔÞñ濾éƒÿúúØ¡ÿÇâùûøÿÿðöò‘|w‡ÿ ÔÜëóÿíÂÌî„ÿïìÌöüûÿóѾÝäË­’|~‡ÿ £ÔÜìòýþüíÏÒôƒÿÙêûÿ÷×ÍíøïßÊ­’{Œ‡ÿ±ÓÝáôÿü÷ùûðÜÛ÷€ÿùâûûÞÙíýÿôíäЮ’z–?‡ÿ%¼ÓäŸuÚÿûøøùúðëíùÿîìîêîúøúþøõ»g«’z ‡ÿ%ÐÒåœ6V˜Ýûûø÷øþûòöîïôùùø÷þÿÕh4±’x¯ÿ‡ÿÛÒä=So{®äúù÷üÿÿúöú€ø üþÝ~'3į’w·ÿ‡ÿ%ãÑä=O©ÒŒšÅî÷ýÿÿýùøøùýÞ‡> 7ãéË­’w¾ÿ‡ÿ%ãÑä=N«ú•·ÂÅéþÿÿýùøøö›RV<(AëàÊ®’w¾ÿ‡ÿØÒä=N«ö“ËøÇá€ÿýùøùé|ºÜA'@êàÊ®’x¶ÿ‡ÿ%ÎÒä=O«ö“ÊøÉÓíÿÿþû÷øõôÿâ?'@êàÊ®’x­¿‡ÿ%¸Óä=O«ö“Ê÷ÉÒåÿÿþû÷øøùúá?'@êàÊ®’z‡ÿ©Óå=N«ö“ÉøÉÒæÿÿþû÷€ø úá?'@êáÊ­’{‡ÿ™Ôå›7N«ö“ÉøÉÒæÿÿþû÷€ø úá?'@êáÊ­’|…‡ÿˆÕßÔ}O§ö“ÉøÉÒæ€ÿü÷€ø úá?'@êáÊ­’|w‡ÿÕÜî÷ÔÍòÉøÉÒæ€ÿý÷€ø úá? =ëàÊ­’}qˆÿrÝÝëòÿÿõ³Ë÷ÉÒæ€ÿý÷€ø úß=b¾ðàÊ­‘ƒf‰ÿ/”Üôóýü÷ùòôÊÑæÿÿþû÷€ø ùèÇÿûíßÊ´£w5ŠÿU¬ñÿý÷øùøíàæÿÿþû÷‚ø ÿþôíçÔž]ÿh·øÿùøøùøøÿÿþû÷ø÷úÿûò·r‘ÿv»øÿù÷÷ýÿÿþû÷ø÷ÿÿÄ“ÿ€ “Èùþøüÿÿþû÷€øýüÏ —ÿ¥×û€ÿ ýùøøüþÚ¯?›ÿa²æÿÿýùûÿè»wŸÿ ªÖíÿýíÚ·£ÿÃêéÊ’ÿh8mk 0EÿŸ+Kÿÿú*·ÿÿÿÿùž+AÿÿÿÿÿÿÿùŸ+¸ÿÿÿÿÿÿÿÿÿú¡*@ÿÿÿÿÿÿÿÿÿÿÿÿúž+¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿùŸ+@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú ¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯AÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚ ¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿº@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿy¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô*Aÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã(¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿä"Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ ÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà Áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà Áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà Áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà ÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé pêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô‰~èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó }èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó’ ~éÿÿÿÿÿÿÿÿÿÿÿÿÿÿó‘!}èÿÿÿÿÿÿÿÿÿÿó‘ |èÿÿÿÿÿÿó ~éÿÿó‘ ¬Ëit32FOÿ¢1ü÷ü€÷ú‚÷ù÷÷ï÷÷ïöZ‚÷ïóZ÷ZZï÷ïñZ€÷ZZï÷ïîZƒ÷ZZï÷ïìZ…÷Zkï÷ïéZˆ÷kkï÷ïçZŠ÷kkï÷ïâZ÷kkï÷ïàk÷k„ï÷ïÝk’÷„„ï÷ïÛk”÷„„ï÷ï×k—÷„„ï÷ïÕk™÷„”ï÷ïÒkœ÷””ï÷ïÐk€÷ïš÷””ï÷ïÍk÷ïŒÞš÷””ï÷ïË„€÷ïŒ)›÷¥¥ï÷ï11È„÷ïÞš÷¥¥ï÷ï1Ç„€÷ïŒÞZ)œ÷¥¥1ï÷Å„÷ ïZ”Î÷¥¥11ï÷÷Å„€÷ ï½µZ€÷Þ”š÷½½11ïÄ„÷­÷)÷)œ÷½½1Ä„‚÷ ï)¥11÷÷„ƒ÷Þ˜÷½11Â1„†÷ZÞŒ€÷)‚÷)—÷½1€Á1”ˆ÷Z÷Z€÷諒–÷½1Z¿”Ž÷Z÷ï÷µ‘÷½1)BZ¾”÷ï)1÷Μ€÷!!÷½€)BZ½”÷µ‚÷€÷ïZ÷½€)BZZÖ¼”–÷„€÷Z÷÷ï÷½)BB€ZÖº”—÷ZZ€÷9ï÷¥Î‹÷½€)B€ZcÖ÷¹”—÷ïZ)÷ZŒŒÎ‰÷½)BZcsÖ÷·”÷ 11ÎÞΆ÷½€B€Zc€sÖ÷¶¥÷ ŒÞ÷ÞÞ)‡÷½)ZZccss„ŒÖ÷´¥¢÷ „µ÷Z÷÷Z”÷½€ )9css„„ŒÖ÷÷³¥¢÷ Î÷œZ÷Þ)÷½)9JZZs„Œ””Ö÷³¥¦÷)ÖZ÷Î)91J€ZcŒ€”œÖ÷³¥¦÷½Œ)÷Î)9JZ cs”œ¥Ö÷÷±¥©÷÷Î)1JZc€s„œ¥¥Ö÷÷°¥ª÷ï)1µ÷Î)19J€Z ccss„Œ”­­Ö÷÷®¥²÷Î)9JZcss„„Œ”œ¥µµÖ÷÷­½–÷ŒÎ—÷Î)9JZc€s„Œ”€œ¥Ö€÷«½—÷¥”÷Î)91J€Zccss„Œ””œœ¥­µ­Ö€÷ª½–÷Þ÷÷)“÷Î)9JZcss„„Œ”œœ¥¥­µÖ÷÷÷©½˜÷¥÷÷)’÷Î)1JZc€s„Œ”€œ¥­­Ö÷÷¨½–÷ZZ’÷Î)99J€Z ccss„Œ””œœ¥­ÖÖ„÷÷¦½—÷ZZ)‘÷Î)9JZ css„„Œ”œœ¥¥Ö‡÷¨½½”÷¥‚÷ïµZ½÷Þ)ˆ÷Î)9JZc€s„Œ”€œ¥ÖŠ÷¥1½½“÷Œ)÷‡÷ç)91J€Z ccss„Œ””œœÖÖ‰÷¤119½½“÷¥œïZ÷÷ZZ÷÷Z½‚÷ç)1JZ css„„Œ”œœÖ‰÷!¤1BR½½–÷ZZ÷÷Z€÷)÷ç)1JZc€s„Œ”œœÖˆ÷1)¤1€!ZZ½½•÷ œ÷9÷÷Œ‚÷ç19J€Z ccss„Œ””ÖÖ‡÷J9¤1€))1ZZ½Î”÷Z€÷)÷ç)9JZcss„„Œ”Ö‡÷ZR¤1€ !)1BJZcÎΔ÷Z1÷÷¥ç÷ç9JZc€s„Œ”Ö†÷ZZ¤1€ ))9BJZZcsÎΖ÷ïZ÷ç91J€Zccss„ŒÖÖ…÷cZ‚¤1€!)1BJZs{ÎΖ÷÷ç9JZcss„„Ö…÷sc!€¤1€))1BJ‚ZcŒŒÎΔ÷ µ÷÷ç1JJ€Zc€s„Ö„÷„s1)!‚¤1€!)1BJ‚ZcksŒ”ÎΗ÷ç9J€Zccss„Öƒ÷ŒŒJB1)!€¤1€))9BJ‚Z cks{Œ”œÎç”÷ç9JZcssÖÖ‚÷ ””ZZJB1)!‚£1€!)1BJ‚Z cks{ŒŒ”œ¥çç’÷çJJ€ZcssÖ‚÷œœZJB1)!€¢1€))1BJ‚Zcks{ŒŒ””œ¥¥çç÷1J€ZccsÖ÷¥œc‚ZJB1)!‚¢1€!)1BJ‚Zcks„ŒŒ€”œœ­­ççŽ÷JZcÖÖ€÷­¥skc‚ZJB1)!€¢1€))9BJ‚Z cks{ŒŒ””œœ€¥­µçç‹÷JJ€ZcÖ€÷µ­Œ{scc‚ZJB1)!‚¢1€!)1BJ‚Zcks{ŒŒ€” œœ¥¥­­µ½çç‰÷J€ZcÖ÷÷µµŒŒ„{skc‚ZJB1)!€¢1€))1B‚Z cks{ŒŒ””œœ€¥­­µµÆÎˆ÷J€ZÖÖ÷ƽ””€Œ{scc‚ZJB1)!€¢1€!)1B€Zcks{ŒŒ€” œœ¥¥­­µµ½ÆÖÖ†÷JZZÖ÷ÖΜœ””ŒŒ„{skc‚ZJB1)!¢1€))9B€Zcks{ŒŒ””€œ ¥¥­­µµ½ÆÆÖÖÞƒ÷1JZZÖÞÖ¥¥œœ””€Œ{scc‚ZJB1)€‚¢1€!)1B‚ks{ŒŒ€”œœ¥¥­­µµ½ÆÎÎÖÞÞç÷1ZZÞÞ­­¥¥œœ””ŒŒ„{skc‚ZJB‚¢1€))1B„{ŒŒ””œœ€¥­­µµ½ÆÆÖÖ€Þçç11÷1ççµ€­ ¥¥œœ””ŒŒ„{scc‚Z„‚¢1€!)1B†Œ€” œœ¥¥­­µµ½ÆÎÎÖ€Þççïï€1ïï½µµ€­ ¥¥œœ””ŒŒ„{skc€Z…¢1€))9Bˆ”œœ€¥­­µµ½ÆÆÖÖ€Þ ççïï÷1÷ÎÆ½µµ€­¥¥œœ””€Œ{sccZ…!‚¢11€!)1Bˆœœ¥¥­­µµ½ÆÎÎÖ€Þ ççïï÷1÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ„{sk…1)!€1¢11€))1Bƒs ¥¥­­µµ½ÆÆÖÖ€Þ ççïï÷1÷ÎÆ½µµ€­¥¥œœ””€Œ{…JB1)!‚1¢11€!)1Bƒs{Œƒ­­µµ½ÆÎÎÖ€Þ ççïï÷Z÷ÎÆ½µµ€­¥¥œœ””ŒŒ†ZJB1)!€1¢11€))9Bƒs{ŒŒ„µµ½ÆÆÖÖ€Þ ççïï÷Z÷ÎÆ½µµ€­¥¥œœ””†ZJB1)!‚1¢Z1€!)1Bƒs{ŒŒ„€½ÆÎÎÖ€Þ ççïï÷Z÷ÎÆ½µµ€­¥¥œœ†ZJB1)!€Z¢11€))1Bƒs{ŒŒ€¥€ÆÆÖÖ€Þ ççïï÷k÷ÎÆ½µµ€­¥¥ƒ†ZJB1)!‚1¢11€!)1Bƒs„ŒŒ€œ¥¥ÆÎÎÖ€Þ ççïï÷k÷ÎÆ½µµ€­¥„„…ZJB1)!€1¢11€))9Bƒs{ŒŒ€€¥­ÆÆÖÖ€Þ ççïï÷k÷ÎÆ½µµ€­¥‚€Œ…ZJB1)!‚1¢1€!)1Bƒs{ŒŒ€œ¥¥­ÆÎÎÖ€Þ ççïï÷k÷ÎÆ½µµ€­¥€””ŒŒ„…ZJB1)!€¢1€))1Bƒs{ŒŒ€€¥­!ÆÖÖ€Þ ççïï÷„÷ÎÆ½µµ€­¥œœ””€Œ…ZJB1)!‚¢1€!)1Bƒs{ŒŒ€œ¥¥­!))Ö€Þ ççïï÷„÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!€¢1€))9Bƒs{ŒŒ€œ¥¥­!))1€Þ ççïï÷„÷ÎÆ½µµ€­¥¥œœ””€Œ…ZJB1)!‚¢1€!)1Bƒs{ŒŒ€œ¥¥­!))1€Þ ççïï÷”÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!€¢1€))1Bƒs{ŒŒ€€¥­!))1€Þ ççïï÷”÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!‚¢1€!)1Bƒs„ŒŒ€œ¥¥­!))1€Þ ççïï÷”÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!€¢1€))9Bƒs{ŒŒ€€¥­!))1€Þ ççïï÷¥÷ÎÆ½µµ€­¥¥œœ””€Œ…ZJB1)!‚¢1€!)1Bƒs{ŒŒ€œ¥¥­!))1€Þ ççïï÷¥÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!€¢1€))1Bƒs{ŒŒ€€¥­!))1€Þ ççïï÷¥÷ÎÆ½µµ€­¥¥œœ””€Œ…ZJB1)!‚¢1€!)1Bƒs{ŒŒ€œ¥¥­!))1€Þ ççïï÷¥÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!€£1€))9Bƒs{ŒŒ€œ¥¥­!))1€Þ ççïï÷½÷ÎÆ½µµ€­¥¥œœ””€Œ…ZJB1)!‚¤1€!)1Bƒs{ŒŒ€œ¥¥­!))1€Þ ççïï÷½÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!€¤1€))1BJƒs{ŒŒ€€¥­!))1€Þ ççïï÷½÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!‚¤1€!)1BJZZ‚s„ŒŒ€œ¥¥­!))1€Þ ççïï÷Î÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!€¤1€))9BJZ€s{ŒŒ€€¥­!))1€Þ ççïï÷Î÷ÎÆ½µµ€­¥¥œœ””€Œ…ZJB1)!‚¤1€!)1BJ‚Zcs{ŒŒ€œ¥¥­!))1€Þ ççïï÷Î÷ÎÆ½µµ€­¥¥œœ””ŒŒ„…ZJB1)!€¤1€))1BJ‚Zcks{ŒŒ€€¥­!))1€Þ ççïï÷ç÷ÎÆ½µµ€­¥¥œœ””€Œ…ZJB1)!‚¤1€!)1BJ‚Zcks{ŒŒ€œ¥¥­!))1€Þ ççïï÷Î÷ÎÆ½µµ€­¥¥œœ””ŒŒ„„ZZJB1)!€¤1€))9BJ‚Zcks{ŒŒ”€œ¥¥­!))1€Þ ççïï÷Î÷ÎÆ½µµ€­¥¥œœ””€Œ‚ZJB1)!‚¤1€!)1BJ‚Zcks{ŒŒ€”œ¥¥­!))1€Þ ççïï÷Î÷ÎÆ½µµ€­¥¥œœ””ŒŒ„€c‚ZJB1)!€¥19))1BJ‚Z cks{ŒŒ””œœ€¥­!))1€Þ ççïï÷½÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ„scc‚ZJB1)!‚¨JJ)1BJ‚Zcks„ŒŒ€”œœ¥¥­!))1€Þ ççïï÷½÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ„{skc‚ZJB1)!€)!¬ZZBJ‚Z cks{ŒŒ””œœ€¥­­€!))1€Þ ççïï÷½÷ÎÆ½µµ€­¥¥œœ””€Œ{scc‚ZJB1)!€91°„Zcks{ŒŒ€” œœ¥¥­­µµ!))1€Þ ççïï÷¥÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ„{skc‚ZJB1)!€RJ´Zc€Z cks{ŒŒ””œœ€¥­­µµ½Æ))1€Þ ççïï÷¥÷ÎÆ½µµ€­¥¥œœ””€Œ{scc‚ZJB1)!ZZ¸csZcks{ŒŒ€” œœ¥¥­­µµ½ÆÎÎ1€Þ ççïï÷¥÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ„{skc‚ZJB1)ZZ¼s„ks{ŒŒ””€œ ¥¥­­µµ½ÆÆÖÖ€Þ ççïï÷”÷ÎÆ½µµ€­¥¥œœ””€Œ{scc‚ZJBccÀŒŒ{ŒŒ€” œœ¥¥­­µµ½ÆÎÎÖ€Þ ççïï÷”÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ„{skc‚Z{sÄŒ”Œ””œœ€¥­­µµ½ÆÆÖÖ€Þ ççïï÷”÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ„{scc€ZŒ„È”œ””œœ¥¥­­µµ½ÆÎÎÖ€Þ ççïï÷”÷ÎÆ½µµ€­¥¥œœ””ŒŒ„{skcZ”ŒËœ¥œ€¥­­µµ½ÆÆÖÖ€Þ ççïï÷„÷ÎÆ½µµ€­¥¥œœ””€Œ{scœ”Í¥­­µµ½ÆÎÎÖ€Þ ççïï÷„÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ„{¥œÐ­µµ½ÆÆÖÖ€Þ ççïï÷„÷ÎÆ½µµ€­ ¥¥œœ””ŒŒ­¥Ô­€µ½ÆÎÎÖ€Þ ççïï÷k÷ÎÆ½µµ€­ ¥¥œœ””­­Øµ½½ÆÆÖÖ€Þ ççïï÷k÷ÎÆ½µµ€­¥¥œœµµÜÆ€ÎÖ€Þ ççïï÷k÷ÎÆ½µµ€­¥¥Æ½àÎÖÖ€Þ ççïï÷Z÷ÎÆ½µµ€­ÖÎäÞççïï÷Z÷ÎÆ½µµ­ÞÖèÞ€ç ïï÷Z÷ÎÆ½µÞÞìççïï÷1÷ÎÆççð ïï÷1÷ïïô11÷1÷11ø€1¾ÿ¢ŒJü÷ü€÷ú‚÷ùƒ÷ô¥ƒ÷ñ¥÷¥¥ƒ÷鹿÷¥¥ƒ÷!륃÷¥¥ƒ÷!!饅÷¥­!ƒ÷!!楈÷­­!!ƒ÷!!䥊÷­­!!ƒ÷99á!¥÷­­!!ƒ÷99ß!­÷­µ99ƒ÷99Ü!­’÷µµ99ƒ÷JJÚ!­”÷µµ99ƒ÷JJ×9­—÷µµ9Jƒ÷JJÕ9­™÷µ½JJƒ÷JkÒ9­œ÷½½JJƒ÷kkÐ9­ž÷½½JJƒ÷kkÍJ­‚÷½ïš÷½½kkƒ÷kkËJµ÷½!„›÷ÎÎkkƒ÷ŒŒÈJµ‚÷Jk!!Zïš÷ÎÎkkƒ÷ŒÇJµ÷½ï!¥!„œ÷ÎÎkŒ‚÷kÅkµ‚÷Jk¥9Æ!ç÷ÎÎŒŒ€÷kÅkµ÷ÞÖ9œkk€÷ï9Æš÷ÖÖŒŒ÷kÄkµ‚÷ck½9ÖÎ÷Z„÷„Zœ÷ÖÖŒkÄkµƒ÷ „Î9ŒŒJ÷÷½J!cƒ÷ï˜÷ÖŒŒÂŒµ†÷œï½€÷„1‚÷J„—÷ÖŒkskÁŒ½ˆ÷œk÷1¥÷ÎÞ–÷ÖŒksœk¿k½Ž÷œ!‚÷Zc÷Ö‘÷ÖŒks„”œk¾k½Ž÷„Œ÷çÆ€÷{{÷Ökss„”œk½J½÷Ö‚÷ZJ÷!¥÷ Ökks„”œ¥çJ¼J½–÷J½€÷œ1÷ Öks„””œ¥µçJºJ½—÷œ¥€÷)Œ÷÷Îç‹÷ Ökss„”œ¥µ½ç÷J¹J½˜÷ ¥1„÷œJ½B!½ç‰÷ ÖJs„”œ¥¥µ½½ç÷J·9½÷ 1ŒŒ!!kçï9ç†÷ÖJ€k”œ¥µ½ç÷9¶9Î÷ ½cï÷99ïï„9‡÷ÖJks„k¥µ½µ½ç÷9´9΢÷ ½Ö÷c¥÷÷œ!Æ÷ÖJkss{ŒkJ€½µµ½ç÷÷9³9΢÷ çkk÷Æœ÷ï)„÷Ö9ks{Œ”œœJJ½µ½½Æç÷9²!Φ÷„çœ11c!÷ ç9ks{ŒŒ”œ­µ½J€½ÆÆç÷!±!Φ÷kkÞ½„÷ç9ss„Œ”œ­­µ½½99ÆÆÎç÷÷!¯!Ω÷c9÷ ç!ks„Œ”œ¥­µ½µ9ÆÎÎç÷÷!®!Ϋ÷„ŒÖ÷ ç!s{ŒŒ”œ­µ½ µ½Æ99ÎÎç÷÷!¬β÷ ç!ss{Œ”¥­­µ€½ µ½½ÆÆÎ!ÖÖç÷÷«Ö–÷½ç—÷ ç!s{Œ”œœ­µ½µ½ÆÆ€Î!!ç€÷©Ö—÷sZΔ÷ çs{ŒŒ”œ­µƒ½€Æ€ÎÖÖ!ç€÷¨Ö–÷ï÷÷„B“÷ çs„Œ”œ­­µ€½µµ½ÆÆÎÖç÷÷÷¨Ö˜÷Î÷÷„!’÷ çs„Œ”œœ­µ½µ½ÆÆÎÖç÷÷¨Ö–÷œ9)œ!’÷焌Œ”œ­µ½µ½€Æ€Îçç„÷÷¦Ö—÷!­¥99„‘÷ çs{Œ”œ­­µ€½µ½½ÆÆ€Îç‡÷¦ÖÖ”÷΃÷ÖœRÞ÷ï!„ˆ÷ç{Œ”œœ­µ½µ½€ÆÎÎçŠ÷¥ŒÖÖ“÷½B!„÷!JBc)‡÷ï{ŒŒ”œ­µ½µ½€ÆÎçç‰÷k¤€ŒÖÖ“÷ÎJÎ÷œ1÷÷­¥÷÷œRÞ‚÷”œ­­µ€½µµ½ÆÆÎç‰÷{sk¤Œkk”œÖÖ–÷¥¥÷÷¥!€÷)„÷ï!„Œ”œ¥­µ½µ½€Æçˆ÷Œ{99k£ Œkks{œ¥ÖÖ•÷ JÆ÷1Œ÷÷½!‚÷ï!ŒŒ”œ­µ½µ½ÆÆçç‡÷ ”ŒBB99k¢ Œkks{„Œ¥­Öç”÷¥!1€÷B„÷ï!{Œ”¥­­µ€½µ½½Æç‡÷ ¥œRJBB99k¢Œkks{„Œ””µ½çç”÷¥1Œ÷÷Îï÷ï!Œ”œœ­µ½µ½Æç†÷ ­¥ZZRJBB99k¢Œkks{„Œ””œ¥½½!!çç—÷œk÷ï9ŒŒ”œ­µƒ½çç…÷!!½µkcZZRJBB99k¢!Œkks{„Œ””œ¥­µ½½!!çç–÷k÷ï9Œ”œ­­µ€½µµç…÷!!½½{skkZZRJBB99k!¢!Œkks{„Œ””œ¥­µµ€½!!çç”÷ Ök1÷÷ï9Œ””œ­µ½µç„÷!!µ½Œ„{skcZZRJBB99k!¢!Œkks{„Œ””œ¥­µµ½Æ!9çç—÷ï9Œ”œ­µ½µçƒ÷9!½½””Œ„{skkZZRJBB99k!¢!Œkks{„Œ””œ¥­µµ‚½ÆÆ99çï”÷ïJŒ”œ­­µ€½çç‚÷99ƽ¥œ””Œ„{skcZZRJBB99k!¢9Œkks{„Œ””œ¥­µµ„½ÆÎ99ïï’÷ïJ””œ­µ€½ç‚÷99ÆÆ­­¥œ””Œ„{skkZZRJBB99k9¢9Œkks{„Œ””œ¥­µµ„½ÆÆÎÎ99ïï÷JŒ”œ­µ€½ç÷99Îνµµ¥¥œ””Œ„{skcZZRJBB99k9¢9Œkks{„Œ””œ¥­µµ€½µ€½€ÆÎÎÖJJïïŽ÷J”œ­­µ½çç€÷JJÎ΀½µ­­¥œ””Œ„{skkZZRJBB99k9¢9Œkks{„Œ””œ¥­µµ„½€Æ€ÎÖÖJJïï‹÷k””¥­µ½ç€÷JJÖÖ‚½µµ¥¥œ””Œ„{skcZZRJBB99k9¢JŒkks{„Œ””œ¥­µµ„½€ÆÎ€ÖJJïï‰÷ k”œ­µ½ç÷÷JJÖÖ„½µ­­¥œ””Œ„{skkZZRJBB99kJ¢JŒkks{„Œ”!œ¥­µµ„½€ÆÎ€ÖÞÞJkˆ÷ k”¥­­çç÷kJÞÞÆÆ„½µµ¥¥œ””Œ„{skkZZRJBB99kJ¢JŒkks{„Œ”!!)­µµ„½€ÆÎÖÞççkk†÷ k”œ­ç÷kkççÆ„½µ­­¥œ””Œ„{skZZRJBB99kJ¢ JŒkks{„Œ”!!€)µ„½€ÆÎÖÞÞççïkkƒ÷ Œ”œ­çkkïçÎÎÆ„½µµ¥¥œ””Œ„€ cZZRJBB99kJ¢ kŒkks{„Œ”!!)1ƒ½€ÆÎÖÞÞ€çïïkk÷ŒœœkkïïÎÆ„½µ­­¥œ””€ kZZRJBB99kk¢ kŒkks{„Œ”!!)199½€ÆÎÖÞÞçç‚÷Œïï€Ö΀Ƅ½µµ¥¥œ€€ cZZRJBB99kk¢ kŒkks{„Œ”!!€)1199BB½½€ÆÎÖÞÞ€çï÷÷€Œ÷÷Þ€ÖÎÆ„½µ­­ kkZZRJBB99kk¢ kŒkks{„Œ”!!)1€9€B€ÆÎÖÞÞ€çï€÷Œ÷çÞÞÖ€ÎÆ„½µ {skcZZRJBB99kk¢ ŒŒkks{„Œ”!!)199BJJÆÎÖÞÞ€çï€÷Œ÷çÞÞ€ÖÎÆƒ½Œ„{skkZZRJBB99kŒ¢ ŒŒkks{„Œ”!!)19½9€B€JR€ÎÖÞÞçç‚ï€÷Œ÷çÞÞÖ΀ƽ!!””Œ„{skcZZRJBB99kŒ¢ ŒŒkks{„Œ”!!€)119€½BBJJRRZZÎÖÞÞ€çï€÷¥÷çÞÞ€ÖÎÆ½½!€œ””Œ„{skkZZRJBB99kŒ¢ ŒŒkks{„Œ”!!)19½B€JRZZck€ÖÞÞçç‚ï€÷¥÷çÞÞÖ€ÎÆ))!€œ””Œ„{skcZZRJBB99kŒ¢ ¥Œkks{„Œ”!!)19½BJJRRZZc€kÖÞÞ€çï€÷¥÷çÞÞ€ÖÎÆÆ)!€œ””Œ„{skkZZRJBB99k¥¢ ŒŒkks{„Œ”!!)19½B€JÎZZc€ksÞÞçç‚ï€÷­÷çÞÞÖ€Î11)!€œ””Œ„{skcZZRJBB99kŒ¢ ŒŒkks{„Œ”!!€) 119½µ½½BJJR€Îc€ksÞÞ€çï€÷­÷çÞÞ€Ö€Î911)½€!€œ””Œ„{skkZZRJBB99kŒ¢ ŒŒkks{„Œ”!!)19½B€J΀ksÞÞ€çï€÷­÷çÞÞÖÎÎ911))€½€!€œ””Œ„{skcZZRJBB99kŒ¢ kŒkks{„Œ”!!)19½BJJR΀ksÞÞ€çï€÷­÷çÞÞ€Ö€Î911ÆÆ€½€!€œ””Œ„{skkZZRJBB99kk¢ kŒkks{„Œ”!!)19½B€J΀ks{Þçç‚ï€÷µ÷çÞÞÖÎÎ9΀ƀ½€!€œ””Œ„{skcZZRJBB99kk¢ kŒkks{„Œ”!!€)119½BJJR΀ks{{„ççï€÷µ÷çÞÞ€ÖÎÆ€½€!€œ””Œ„{skkZZRJBB99kk¢ kŒkks{„Œ”!!)19½B€J΀ks{{„Œ‚ï€÷µ÷çÞÞÖ€ÎÆ€½€!€œ””Œ„{skcZZRJBB99kk¢ JŒkks{„Œ”!!)19½BJJR΀ks{{„Œçï€÷½÷çÞÞ€ÖÎÆ€½€!€œ””Œ„{skkZZRJBB99kJ¢ JŒkks{„Œ”!!)19½B€J΀ks{{„Œ‚ï€÷½÷çÞÞÖ΀ƀ½€!€œ””Œ„{skcZZRJBB99kJ¢ JŒkks{„Œ”!!€) 119½µ½½BJJR΀ks{{„Œçï€÷½÷çÞÞ€ÖÎÆ€½€!€œ””Œ„{skkZZRJBB99kJ¢ 9Œkks{„Œ”!!)19½B€J΀ks{{„Œçï€÷Î÷çÞÞÖ€ÎÆ€½€!€œ””Œ„{skcZZRJBB99k9¢ 9Œkks{„Œ”!!)19½BJJR΀ks{{„Œçï€÷Î÷çÞÞ€ÖÎÆ€½€!€œ””Œ„{skkZZRJBB99k9¢ 9Œkks{„Œ”!!)19½B€J΀ks{{„Œ‚ï€÷Î÷çÞÞÖ΀ƀ½€!€œ””Œ„{skcZZRJBB99k9¢ 9Œkks{„Œ”!!€)119½BJJR΀ks{{„Œçï€÷Î÷çÞÞ€ÖÎÆ€½€!€œ””Œ„{skkZZRJBB99k9¢ !Œkks{„Œ”!!)19½B€J΀ks{{„Œ‚ï€÷Ö÷çÞÞÖ€ÎÆ€½€!€œ””Œ„{skcZZRJBB99k!¢ !Œkks{„Œ”!!)19½BJJR΀ks{{„Œçï€÷Ö÷çÞÞ€ÖÎÆ€½€!€œ””Œ„{skkZZRJBB99k!¢ !Œkks{„Œ””!)19½B€J΀ks{{„Œ‚ï€÷Ö÷çÞÞÖ΀ƀ½€!€œ””Œ„{skcZZRJBB99k!¢Œkks{„Œ””œ¥))119½µ½½BJJR΀ks{{„Œçï€÷ç÷çÞÞ€ÖÎÆ€½€!€œ””Œ„{skkZZRJBB99k¢Œkks{„Œ””œ¥­µ)19½B€J΀ks{{„Œçï€÷ç÷çÞÞÖ€ÎÆ€½€!€œ””Œ„{skcZZRJBB99k¢Œkks{„Œ””œ¥­µµ½9½BJJR΀ks{{„Œçï€÷ç÷çÞÞ€ÖÎÆ€½€!€œ””Œ„{skkZZRJBB99k¢Œkks{„Œ””œ¥­µµƒ½B€J΀ks{{„Œ‚ï€÷ï÷çÞÞÖ΀ƀ½€!€œ””Œ„{skcZZRJBB99k£ Œkks{„Œ””œ¥­µµƒ½BJJR΀ks{{„Œçï€÷ç÷çÞÞ€ÖÎÆ€½€!¥œ””Œ„{skkZZRJBB99k¤ Œkks{„Œ””œ¥­µµ„½€J΀ks{{„Œ‚ï€÷ç÷çÞÞÖ€ÎÆ€½€!µ¥¥œ””Œ„{skcZZRJBB99k¤ Œkks{„Œ””œ¥­µµ„½ÆÆR΀ks{{„Œçï€÷ç÷çÞÞ€ÖÎÆ€½€!½µ­­¥œ””Œ„{skkZZRJBB99k¥ ŒŒs{„Œ””œ¥­µµ„½€ÆÎ€ks{{„Œ‚ï€÷Ö÷çÞÞÖ΀ƀ½!€½µµ¥¥œ””Œ„{skcZZRJBBsk¨ ””„Œ””œ¥­µµ€½µ€½€ÆÎ€ks{{„Œçï€÷Ö÷çÞÞ€ÖÎÆ„½µ­­¥œ””Œ„{skkZZRJ{{¬œ¥””œ¥­µµ„½€ÆÎÖkks{{„Œçï€÷Ö÷çÞÞÖ€ÎÆ„½µµ¥¥œ””Œ„{skcZZŒŒ¯­­œ¥­µµ„½€ÆÎ€Ös{{„Œçï€÷Î÷çÞÞ€ÖÎÆ„½µ­­¥œ””Œ„{skkœ”±µ½­µµ„½€ÆÎÖÞ{„Œ‚ï€÷Î÷çÞÞÖ΀Ƅ½µµ¥¥œ””Œ„{s¥œ´½½µ„½€ÆÎÖÞÞçŒçï€÷Î÷çÞÞ€ÖÎÆ„½ µ­­¥œ””Œ„µ­¸½µƒ½€ÆÎÖÞÞçç‚ï€÷½÷çÞÞÖ€ÎÆ„½ µµ¥¥œ””½½¼!!ƒ½€ÆÎÖÞÞ€çï€÷½÷çÞÞ€ÖÎÆ„½µ­­¥œµ½!!À!!½Æ½½€ÆÎÖÞÞçç‚ï€÷½÷çÞÞÖ΀Ƅ½µµ¥½µ!!Ä!!‚ÆÎÖÞÞ€çï€÷½÷çÞÞ€ÖÎÆ„½µ½½!!È!9ÆÎÆÎÖÞÞ€çï€÷µ÷çÞÞÖ€ÎÆƒ½ÆÆ9!Ì99‚ÎÖÞÞ€çï€÷µ÷çÞÞ€ÖÎÆ½ÎÆ99Ð99ÎÖÎÖÞÞçç‚ï€÷µ÷çÞÞÖ΀ƽ½ÎÎ99Ô99‚ÖÞÞ€çï€÷­÷çÞÞ€ÖÎÆÖÎ99ØJJÖÞÖÞÞçç‚ï€÷­÷çÞÞÖ€ÎÆÆÖÖJJÜJJ€Þ€çï€÷­÷çÞÞ€ÖÎÞÖJJàJJ€ç‚ï€÷¥÷çÞÞÖÎçÞJJäJkç‚ï€÷¥÷çÞÞ€ÖççkJèkkï€÷ ¥÷çÞÞÖïïkkìkkïï€÷Œ÷çÞïïkkðkk€÷Œ€÷kkôŒŒ÷Œ÷ŒŒø€Œ¾ÿ¢ç”üÿü€ÿú‚ÿùƒÿ!!ôïƒÿ!!ñïÿïï!!ƒÿ!!ïï€ÿïï!!ƒÿ!9ë!ïƒÿïï!!ƒÿ99é!ï…ÿïï!9ƒÿ99æ!ïˆÿïï99ƒÿ99ä!ïŠÿïï99ƒÿkká9ïÿïï99ƒÿkkß9ïÿï÷kkƒÿkkÜ9ï’ÿ÷÷kkƒÿ””Ú9ï”ÿ÷÷kkƒÿ””×kï—ÿ÷÷k”ƒÿ””Õkï™ÿ÷÷””ƒÿ”ÆÒkïœÿ÷÷””ƒÿÆÆÐkïžÿ÷÷””ƒÿÆÆÍ”ï‚ÿ÷›ÿ÷÷ÆÆƒÿÆÆË”÷ÿ÷9Þ›ÿ÷÷ÆÆƒÿççÈ”÷‚ÿ”Æ99­›ÿ÷÷ÆÆƒÿçÇ”÷ÿ÷ÿ9ï9Þœÿ÷÷Æç‚ÿÆÅÆ÷‚ÿ”Æïk÷9÷ÿ÷÷çç€ÿÆÅÆ÷ÿ÷÷kïÆÆÿs÷šÿ÷÷ççÿÆÄÆ÷‚ÿµÆ÷k÷÷ÿ­ÞÿÞ­œÿ÷÷çÆÄÆ÷ƒÿ Þ÷kçç”ÿÿ÷”9µŸÿ÷ççÂç÷†ÿïÿ!÷€ÿÞZ‚ÿ”Þ—ÿ÷çÆÎÆÁç÷ˆÿïÆÿZïÿ÷÷–ÿ÷çÆÎïÆ¿Æ÷Žÿï9‚ÿ¥µÿ÷‘ÿ÷çÆÎÞçïÆ¾Æ÷ŽÿÞçÿ÷÷€ÿÖÖÿ÷ÆÎÎÞçïÆ½”÷ÿ÷‚ÿ­”ÿ9ïÿ ÷ÆÆÎÞçïïÿ”¼”÷–ÿ”÷€ÿïZÿ ÷ÆÎÞççïï÷ÿ”º”÷—ÿïï€ÿRçÿÿ÷÷‹ÿ÷ÆÎÎÞçïï÷€ÿ”¹”÷˜ÿ ïZÞÿï”÷„9÷÷‰ÿ÷”ÎÞç€ï÷ÿ÷ÿÿ”·k÷ÿ Zçç99Æ÷ÿ!s÷†ÿ÷”€Æçïï÷ÿ€÷ÿÿk¶k÷ÿ ÷µÿÿkkÿÿÞk‡ÿ ÷”ÆÎÞÆï÷ÿÿ÷ÿÿk´k÷¢ÿ ÷÷ÿµïÿÿï9÷ÿ ÷”ÆÎÎÞçÆ”ÿ‚÷€ÿk³k÷¢ÿ ÷ÆÆÿ÷ïÿÿJÞÿ÷kÆÎÞç€ï””‚÷ÿÿk²9÷¦ÿÞÿïZZµ9‚ÿ kÆÎÞççïï÷÷ÿ”‚÷ÿÿ9±9÷¦ÿÆÆ÷÷Þ‚ÿ kÎÎÞçïï÷÷ÿÿ÷kk€÷€ÿ9¯9÷©ÿµk!‚ÿ9ÆÎÞç€ï÷ÿÿ÷k€÷€ÿ9®9÷«ÿÞç÷‚ÿ9ÎÞççïï÷€ÿ‚÷kk÷÷€ÿ9¬!÷³ÿ9ÎÎÞçïï€÷ÿ…÷9÷÷€ÿ!«!÷–ÿ÷÷˜ÿ9ÎÞç€ï÷÷ÿ‡÷99ÿ!©!÷—ÿÎ¥÷•ÿ !ÎÞççïï÷÷ÿÿ‰÷9ÿ!¨!÷™ÿÞ{”ÿ !ÎÞçïï÷÷ÿÿ‰÷ÿÿÿÿ!¨÷˜ÿ÷ÿÿÞ9“ÿ!ÎÞç€ï÷ÿÿ‰÷‚ÿ!!ÿ¨÷–ÿïkRï9“ÿ!Þççïï÷€ÿ‡÷†ÿ!ÿ¦÷—ÿ9÷ïkkÞ’ÿÎÞçïï€÷ÿ‡÷ˆÿ!!¦÷÷”ÿ÷!ƒÿ÷ïœ÷ÿÿ9Þ‰ÿ!Þç€ï÷÷ÿ‡÷‹ÿ¥ç÷÷“ÿ÷„9Þÿ9”{µRˆÿ !Þççïï÷÷ÿÿ…÷‹ÿƤ€ç÷÷“ÿ÷”÷ÿïZÿÿ÷ïÿÿïœ÷ƒÿ!Þçïï÷÷ÿÿ…÷ŠÿÖÎÆ¤çÆÆçï!÷÷–ÿïïÿÿï9€ÿJÞ‚ÿ9Þç€ï÷ÿÿ…÷‰ÿ!çÞskÆ£ !çÆÆÎÖïï!!÷÷•ÿ ”÷ÿZçÿÿ÷9ƒÿ9ççïï÷€ÿƒ÷‰ÿ !!ïç„{skÆ!¢ !çÆÆÎÞÞç÷÷!!÷•ÿï9Z€ÿ„Þ‚ÿ9Þçïï€÷ÿƒ÷ˆÿ !!ï„{skÆ!¢ !çÆÆÎÖÞççïÿÿ!!–ÿïZçÿÿ÷ƒÿ9ç€ï÷÷ÿƒ÷‡ÿ !!÷ï­¥œ”„{skÆ!¢!çÆÆÎÞÞçç€ïÿ÷99™ÿïÆ‚ÿkççïï÷÷ÿÿ÷‡ÿ99ÿ÷Ƶ­¥œ”„{skÆ!¢9çÆÆÎÖÞçç€ï÷99˜ÿÆ‚ÿkçïï÷÷ÿÿ÷†ÿ99÷ÿÖÎÆÆ­¥œ”„{skÆ9¢9çÆÆÎÞÞçç€ï÷÷ÿÿ÷÷99–ÿ÷ÆZ€ÿkç€ï÷ÿÿ÷…ÿ99÷÷çÞÖÎÆµ­¥œ”„{skÆ9¢9çÆÆÎÖÞçç€ï÷÷€ÿ€÷9kšÿkçïï÷€ÿ€÷„ÿk9÷÷ïççÞÖÎÆÆ­¥œ”„{skÆ9¢9çÆÆÎÞÞçç€ï÷÷€ÿ‚÷kk—ÿ”çïï€÷ÿ÷÷„ÿkk÷÷€ïççÞÖÎÆµ­¥œ”„{skÆ9¢kçÆÆÎÖÞçç€ï÷÷€ÿ„÷kk•ÿ”€ï÷÷ÿ÷÷ƒÿkk÷€ïççÞÖÎÆÆ­¥œ”„{skÆk¢kçÆÆÎÞÞçç€ï÷÷€ÿ†÷kk’ÿ”çïï÷÷ÿÿ÷‚ÿkk÷÷ÿÿ÷÷€ïççÞÖÎÆµ­¥œ”„{skÆk¢kçÆÆÎÖÞçç€ï÷÷€ÿˆ÷””ÿ”ïï÷÷„ÿ””€÷€ÿ÷÷€ïççÞÖÎÆÆ­¥œ”„{skÆk¢kçÆÆÎÞÞçç€ï÷÷€ÿŠ÷””ÿÆ€ï÷ƒÿ””‚÷€ÿ÷÷€ïççÞÖÎÆµ­¥œ”„{skÆk¢”çÆÆÎÖÞçç€ï÷÷€ÿŒ÷””‹ÿÆïï÷‚ÿ””„÷€ÿ÷÷€ïççÞÖÎÆÆ­¥œ”„{skÆ”¢ ”çÆÆÎÞÞçç9ïï÷÷€ÿŽ÷”ƈÿÆïï÷÷€ÿÆ”†÷€ÿ÷÷€ïççÞÖÎÆÆ­¥œ”„{skÆ”¢ ”çÆÆÎÖÞçç99J÷÷€ÿŽ÷ÿÿÆÆ†ÿÆïï÷ÿÿÆÆÿ‡÷€ÿ÷÷€ïççÞÖÎÆ­¥œ”„{skÆ”¢ ”çÆÆÎÞÞçç99JJR€ÿ÷€ÿÆÆƒÿçïï÷ÿÆÆÿÿˆ÷€ÿ÷÷€ïççÞ€ µ­¥œ”„{skÆ”¢ÆçÆÆÎÖÞçç99JJRRZÿ÷ÿÆÆÿçïïÆÆÿÿŠ÷€ÿ÷÷€ïç€ Æ­¥œ”„{skÆÆ¢ÆçÆÆÎÞÞçç99JJRRZksŽ÷„ÿççÿçÿÿŒ÷€ÿ÷÷ïï!€€ µ­¥œ”„{skÆÆ¢ÆçÆÆÎÖÞçç99JJRZZkk{{÷…ÿ€çÿÿŽ÷€ÿ÷÷!!€ ÆÆ­¥œ”„{skÆÆ¢ÆçÆÆÎÞÞçç99JJRRZkss{{„Š÷‡ÿçÿ÷€ÿ!€ ÖÎÆµ­¥œ”„{skÆÆ¢ççÆÆÎÖÞçç99JJRRZkk€{„””‰÷†ÿçÿ÷ÿ--!çÞÖÎÆÆ­¥œ”„{skÆç¢ççÆÆÎÞÞçç99JJRRZk÷s{{„€”œ†÷‡ÿçÿ÷99--!ïççÞÖÎÆµ­¥œ”„{skÆç¢ççÆÆÎÖÞçç99JJRZZk€÷{„””œœ¥­…÷†ÿïÿ÷9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆç¢ççÆÆÎÞÞçç99JJRRZk÷„€”œ¥­µÆ‚÷‡ÿïÿ‹÷JJ9--€!ïïççÞÖÎÆµ­¥œ”„{skÆç¢ïçÆÆÎÖÞçç99JJRRZk÷„””œœ¥­µ€Æ÷†ÿïÿ‰÷RRJJ9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆï¢ççÆÆÎÞÞçç99JJRRZk÷„€”÷¥­µ€ÆÎ÷÷‡ÿïÿ‡÷ZZRRJJ9--€!ïïççÞÖÎÆµ­¥œ”„{skÆç¢ççÆÆÎÖÞçç99JJRZZk÷„””œ€÷µ€ÆÎ€÷†ÿïÿ†÷kZZRRJJ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆç¢ççÆÆÎÞÞçç99JJRRZk÷„€”÷€ÆÎ÷÷‡ÿïÿ†÷kZZRR€÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆç¢ÆçÆÆÎÖÞçç99JJRRZk÷„””œ÷€ÆÎ€÷†ÿïÿ†÷kZZ‚÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆÆ¢ÆçÆÆÎÞÞçç99JJRRZk÷„€”÷€ÆÎÖ÷‡ÿ÷ÿ†÷k„÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆÆ¢ÆçÆÆÎÖÞçç99JJRZZk÷„””œ÷€ÆÎÖÞÞ†ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆÆ¢ÆçÆÆÎÞÞçç99JJRRZk÷„€”÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆÆ¢”çÆÆÎÖÞçç99JJRRZk÷„””œ÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆ”¢”çÆÆÎÞÞçç99JJRRZk÷„€”÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆ”¢”çÆÆÎÖÞçç99JJRZZk÷„””œ÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆ”¢kçÆÆÎÞÞçç99JJRRZk÷„€”÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆk¢kçÆÆÎÖÞçç99JJRRZk÷„””œ÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆk¢kçÆÆÎÞÞçç99JJRRZk÷„€”÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆk¢kçÆÆÎÖÞçç99JJRZZk÷„””œ÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆk¢9çÆÆÎÞÞçç99JJRRZk÷„€”÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆ9¢9çÆÆÎÖÞçç99JJRRZk÷„””œ÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆ9¢9çÆÆÎÞÞççï9JJRRZk÷„€”÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆ9¢!çÆÆÎÖÞçç€ïJRZZk÷„””œ÷€ÆÎÖÞÞç‡ÿŽ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆ!¢!çÆÆÎÞÞçç€ï÷÷RZk÷„€”÷€ÆÎÖÞÞç‡ÿŽ÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆ!¢!çÆÆÎÖÞçç€ï÷÷ÿÿk÷„””œ÷€ÆÎÖÞÞç‡ÿŽ÷€9--€!ïïççÞÖÎÆÆ­¥œ”„{skÆ!¢!çÆÆÎÞÞçç€ï÷÷€ÿ÷„€”÷€ÆÎÖÞÞç‡ÿŽ÷€9--€!ïïççÞÖÎÆµ­¥œ”„{skÆ!£çÆÆÎÖÞçç€ï÷÷€ÿ÷„””œ÷€ÆÎÖÞÞç‡ÿŽ÷€9--!!€ïççÞÖÎÆÆ­¥œ”„{skƤçÆÆÎÞÞçç€ï÷÷€ÿ‚÷€”÷€ÆÎÖÞÞç‡ÿŽ÷€9--÷÷€ïççÞÖÎÆµ­¥œ”„{skƤçÆÆÎÖÞçç€ï÷÷€ÿ„÷œ÷€ÆÎÖÞÞç‡ÿŽ÷€9ÿÿ÷÷€ïççÞÖÎÆÆ­¥œ”„{skÆ¥ççÎÞÞçç€ï÷÷€ÿ‰÷€ÆÎÖÞÞç…ÿ÷ÿŽ÷9÷€ÿ÷÷€ïççÞÖÎÆµ­¥œ”„{ÎÆ¨ïïÞçç€ï÷÷€ÿ‰÷€ÆÎÖÞÞç…ÿ÷ÿ÷€ÿ÷÷€ï ççÞÖÎÆÆ­¥œ”ÞÖ¬ïïç€ï÷÷€ÿŠ÷ÆÆÎÖÞÞç…ÿ÷ÿ÷€ÿ÷÷€ï ççÞÖÎÆµ­¥çç¯!÷÷ïï÷÷€ÿŒ÷ÎÖÞÞç…ÿ÷ÿ÷€ÿ÷÷€ï ççÞÖÎÆÆïï!±!!÷ÿ÷÷€ÿŽ÷ÞÞç…ÿ÷ÿ÷€ÿ÷÷€ïççÞÖÎïï!!´!!ÿ÷€ÿ÷ç…ÿ÷ÿ÷€ÿ÷÷€ïççÞ÷÷!!¸!!÷÷ÿ÷‡ÿ÷ÿ÷€ÿ÷÷€ïçÿÿ!!¼99‘÷†ÿ÷ÿ÷€ÿ÷÷ïï÷÷99À99Ž÷‡ÿ÷ÿ÷€ÿ÷99Ä99÷†ÿ÷ÿ÷€ÿ÷÷99È9kŠ÷‡ÿ÷ÿ÷ÿ÷÷k9Ìkk‰÷†ÿ÷ÿ‘÷kkÐkk†÷‡ÿ÷ÿ÷kkÔkk…÷†ÿïÿ÷kkØ””‚÷‡ÿïÿ‹÷””Ü””÷†ÿïÿ‰÷””à””÷‡ÿïÿ…÷ÿ÷””ä”Ɔÿïÿƒ÷ÿÿÆ”èÆÆ„ÿïÿ÷ÿÿÆÆìÆÆ‚ÿçÿ÷÷ÿÿÆÆðÆÆ€ÿç€ÿÆÆôççÿçÿççø€ç¾t8mk@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmilkytracker-0.90.85+dfsg/resources/pictures/Setup Blue Screen.ico0000644000175000017500000000706610737746457024174 0ustar admin2admin2h& ¨Ž( @øøøê÷ûçô÷àïñçïïÝëìÆÍÐÈÈÈÀÀÀ¾Ãú¿Á¸½¿¶»¼³¶¶®¸»¬´µª¯±¨¨¨¦©ª¢££¥¡”Ÿ±´š§§›–šš‘—˜“““Œ’“ŒŒŒƒŠŒ‚ƒƒžs·sây{Òvwåf&ØY Ì?&̦h¬ST›y`¿&3²3³¯£™•}‚t‡Šu™Svzzsssnz|mrrckkccc}dWu[BfLLZ`aZzZZ_`ZZZTXXTTTHHHBBB_:;UO*j*3333&&---""":*ÿÿÿþJ::M44444444þþþþ1B  7:þþþ>:>6:þþ8  ::þ.,/GC6:þ-&,0GL2>A6:þ(!"O0NLJJJJJA6 FH?I6L6 6M' )3Jþþ:E:988D Jþþþ:>1EEM5 Jþþþþ4 #;===K Jþþþþþ $#%**+ Jþþþþþ <<<<<<Jþþþþþ Jþþþþþþ þþ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÀÿÿàÿÿàÿÿàÿÿðÿÿ( @€øøøðûÿëùþêöùèô÷â÷ÿäòõáïñëëëÜñ÷ÜìíÕêîÖççÎßßÌÌÌÀÀÀÌ™™·Åų³³®¼¼­­­¤¤¤©­™™™•••„„„ÿ™fÿfÌfóæÌ33ÙÌÀ³ª¦™3š•€u‰Œfÿ3€zzzsssmmmfffZZZW^^UUUOUUf3|)j777...###"" ÿÿÿ@@2222222@@@@@@@@@@@@@@@@@@@@@@@@@222@@@@@@@@@@@@@@@@@@@@@@@@2 22 1=@@@@@@@2 22 @@@@ 1=@@@@@@2 22@@@ @11=@@@@@225@ @ @ @ 11=@@@@222   11=@@@222111=@@*"#%')8@2111=þ@@*!"#%'*8@2111=þ@@* !"#%(*8@2;;==;111=þ@@* !"#$(*8@2111=þ@@* !"2$(*82411111111111111=þ@@5 22$(*2@@@@@@@@@@@@@11=þ@5222$(24444444444444@1;þ51 2$2---11@11þþ5 22 ,,-11@þþþþ5227&&&&&&&& 11@þþþþ52 2@@@@@===& 11@þþþþ@552 2 =& 11@þþþþ@@5522 =& 11@þþþþ@@@55222222 =& 11@þþþþ@@@@55 6@@& 11@þþþþ@@@@@@ 6@@@@@@@@@& 11@þþþþ@@@@@@ 6&&& 11@þþþþþþþþþþ 6&&& 11@þþþþþþþþþþ 66666666666666 11@þþþþþþþþþþ  11@þþþþþþþþþþ 11@þþþþþþþþþþþ 1@þþþþþþþþþþþþ @þþþþþþþþþþþþþþþþþþÀÿÿÀ?ÀÀÀÀÀÀÀÀÀÀÀÀ€€Ààðüüüüüüþÿÿ€milkytracker-0.90.85+dfsg/resources/pictures/milky2.png0000644000175000017500000015213610737746457022244 0ustar admin2admin2‰PNG  IHDR€à5ÑÜä pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÉyIDATxÚìýw˜$÷yž ß•:OΛsD\,2@€ ‚9'Q"•“IJ–,]²$[:¶¿Ïö9¾Ž³%Ò1Í£@Z™A$˜Ã»Øœ'çΩºÒ÷G…®ê™(Y”È÷Ƶ˜™ž™îª_ÕT=ý¼I<AA„ïTYAA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA  ‚ ‚ PAA(‚ ‚ ˆAAD ‚ ‚ "AA€‚ ‚ ‚@AAA  ‚ ‚ PAA(‚ ‚ ¼º, ßSïz5 ×qþÊŸw`pŒT:x¡ß3°°06<Þ¨—i6ªrÀA(ßÓÂEU¹çþ7ñ¦·ÿ0¥R ÇqPÏu£Ÿó<¾ö¥ßæâÙgqcÏñÿ–;ŽßÅÔ–ÜÿèÇ(•ktL Ïó¢m7EQbŸ×ñ†G¢Ÿyñ+ÿÏžx"ñ¼ét–_üÕߤXªá¹n´_½7Ûç+—Ÿdl|Û·ï£ZmÛ‘üÙð£çª&¿—ßø¿~³Ýˆ¾~ø±ïg÷þ›±:Ö†ßëÝ–'¾úoØ;¶‡#÷}˜z­7σk—_á‹øåÄáÍ=E–@þæ£i:?û ¿Æ{>üÓT«®øƒH…BÃׄʆçð¿§à6Û¬Õ×BÕTÞyç# þ•mëýħøÄOü*‡½“ùùUõ–ecÛ¶íà8.Žãà8á×ëçŸÀÂqœH(Þ¶ïHïðÈcï£VoAØ ÷/¾Ÿ‰}v-:&ÇßtM©*ªê ëÞïÇ¿J¾›¶] ù º®¡ë†¡£¨j$4{_ç©oüÇæø›>Á®‰ã¦(°{ß-ä ƒrò ‚ P¾Wy÷û?ÆÄ¶Ã,-—°ì®ó ŸÍ„Ì&@)^¤i¶h·;x®Ë©Ùèìÿ+ÙÎþA¦vßÏ¥Ëó4ê-\×튴p[EUñ<ò¥o^¹ÄЇ£ý þÕé—Ï=44Ê]¾ Çvû¾™ØTTðñúµçñ<*°mëh÷÷Âç ÄZd¡ÆÅ¥ªv×<Ø~Mí  ´ª´ÚTMEÕ4Ìv3!ã"`¢œ¼áÁ¦iù?<7€ªj¹å9ùAø_‚„€áo—ϾL£¸ä ¡ÜCûBÕ´®x!Èã¢öðÍ÷óâ3†ç¹òG ‚@Aø^#ŸË°cxÙ=wà¸^Wø%”(ªªFÇ…Qvõ*uÇbûÐvTMåÂì󨊂aèäûòÔ«õ¿ð¶¿ëÞó‘OQ? ³c÷è&eƒ Ë(µÁÉÄÈ‹},]ú:ªÒuÎn»ãAòýSK54u£ãçy ªªàºž¾ „¯çù!ñùò< ª¡ÒqLËõ×/t7Ò½ô®u:íÝ ò…<™\MÕ0›&õâuúöìõ]ÛP‡ÇHÓp<…õbmÃñ ¿îëfÇî£L_}UþA(ßkt:&·n?FgjŽãâzjX¸(½‚%.ÂÜõuêûغuŒ¯ýÉ¿#}á)Ne¶4Ààðà_X~à#?­w¾•……5úñh¨)ÌùÕYÔÝžÐetЙšaqq}Ãöë¥uJÍR$ ù<ïùð'±m‡B>Ó•=n€¢*x®ÿŠfDzlVO?íXdŒ JJÇs<´ìj,½Ñ:z›|OQt=•¼˜êIG0e8ŠEqu†Ln|ÓÚ`gh˜ÊÅËôíÞE±TK„ž•@˜Þ|ûÃ"A(ßk¨ªÊÖýbmݸkZàv…EaÄÒu7VµXm}x˜”®±¼\äŽ]wóÍ Opß#÷ãùŠ¢284ÀÜõ¹ok›Ò™,?ùÉÈÀè^ÖÖʸ–MÝKA:‘8õ·_I¸m”Š´‡ÇpŠUÔ`ûCçÎó Zº”Ré4Ÿû­_Ç0 t=yÉr]Ïõp]7“†¯;91 @¥UÁÃ_#C3ðŒ<õF»[tнMŠ5âáåxˆ\Õ´ RUÂ3étšéµëÜÛý˜–ŠíĪ–c²=8B6|ÞØóûù“°sÏQò…Aõ²ü1‚ P¾Èfs|òçþ Jj‚vËŒ_(¬âíTÂÇB‰¿F‹t_ðsëTUAÓ3,–1Ûú2}ÔÚ5R©™\†v³ýšÛ41¹OþܯӶRT« _©*¶‘!Ë”˜h" Û6®ñzšª159õ—Њ‚ç¹¨ŠŠíÚ22#Ã8N7¯.žú×Kop$‚Ó¹¤N„È™U…t*C½Z'“¡SmDù˜¡8Vc/º¶\DO§ð×qPƒ¢EõÃÂ7Ýöž{ò¾'ÿRé,ƒCã7ÌO­WK´Z5¹X‚@Aøî`çÎÝ|òçõŠG+e¡°êö¯Ûø{¡è·?ñÐQ¦ª]ñ¸RšAUTÜjc;ïäžÀõ<^SÞzì>>úƒ?GµjÒl¶¢íÐt ÇRc´ۦEå샇p]×SÀõдn›ÏÃÐ9tçQÇq¹÷Í?}ÿ/J((O=ÿßq=×sq\MQÚ´ÎCÝ4¿pCý‡ñì ù† ‹_!ìy.ŽcS­6|!·¡J»ëØêéÊüiÜ©# g1 ›¹åžêOþÒÅ ãÛxäñïcbË\×C+®ÑîäŽcûyåä6rÏZÇe¡Zä•+_cÏžÇPú6}­Þb¢åÅk¼üü—¹zéå¿Ô¶OóÖý"†‘¶híÂÍ-—ùýÏü :fK.‚ðys,K ó¸ëîûøÙ_ú׬–ZÍv"ßíF­Oºßë:U®ç%\CEQèTœ]ŸmÙäóc¨•²Äd¸-}ýCìÙë_ê\zøMïäÇ>ýÏŸÚm;¸žÇÙ«OðüSÿ™ËWyྛH¼›ˆµë ?/¬ÏpùåÏñÌù?ã–íÇPúnر÷±É-{xë{~’7¿ý‡Im(œy}ÆFǰfO é±îGÑZOðÈ㟋† üÑ€_•e„¿9¼û}åMïøQ–WkØ–õ ë9þMPM~_MЦÐùë†UX:Ë|y]ÕøÖ©¯søÀCL/¦V©aÛ6Z=réLŽÿ;ÿ˜›=Äêz%šê¾Žm;hš†í¸hš†‘2ü64=¢Àq\Ò+¹²t–‘ὸ¹BBØŽ166€ôÃëº=±ý*i7™› µ4Í|yŽf§‰®tì‡'Rز‹NÇò«¥=ÏM6o"Ÿ!b™+W¾ÎòÒrôØèè(™¬Ÿ©©ºª‘Ig@a`Û:AþfïºØ¶C¾^¦=4Ž–ÏÓéØ8&!xr©>Î}æÛ>úúù‰Oý#ö¼ŸF½ÝÍF·ÞÄN=ËK'ÿ”{Ó×—ÃìØ†5²Ï›êÅoá86Ãaë®Û±rC]¡‰üÈÞÜÓ8#cÛ8tôJÅe*¥•okEáö›oÇõƵÊàpTýgxt ÏóX˜»$Aø6‘° ü Á0 >ù³ÿ€Áñ#¬®U|×)ë ¾Žßã7]USýð§ewóÌ‚¶ÙîpræÅ˜ã×Ï3¯þõj'˜[è/P.VŸÜÎO|ò“ʱ²ZŠ*lU¥RZfÌöhë9Œ¡~²ù ŽíÐl´é§ÞÂÖÁk§.òòì îØu7}Ãý~å+àM¿ÊS/^ˆ¶kçŽ7зc+¦iuÍ)¯Ç¡ò¼ ½{…Çby>rAm×FQ††wúM¡£µºáw={¦”/|‹Ï?ù{ܱ÷Î×/*)ÝàÒÂy¶¨]ÅR34\ÿõÒc#tÌŠªbŒ¡¯•N¨ë«8ãݪi×c|dŠ|a€F½òºçÒw?È{>ôSÔš.­fWü…û£×8µpŠN=ËlñS¼ë]ÿ³Ï~EQƒµQ£pó³§Ÿæ§Þþ3¼üÊç¸yÛíx;ãØ¶ã&’'•ÞuÜ$¤œ/ òŽ÷’‹ç^àþ™× Û“Iep=k‹¯2”!“McYvâ¸xžÇ]÷¿ƒÕ婘„o  Â߆‡GøG¿öR>HµÖ슞HðÐ},ü:(PUUSƒ<³îÏ…!TUÓüï+[»‰€B®ZµŠmû(ds~qÃM·Ýǧá_¢è}Tª ÿ~®ú¯Y\›gíìÓ¨ØƆ¢û¼ªùáÖµ¹† ‘ U˜+^çŽ]wSËo¡ì¦X¸¾èWÛO^þ&¶ë ÐN«ÃÐh½½¤Åß–Ph¨š›ÒѵÍfŠÓ ¬**U TU‹„,=AüÇ•èùCÇ.³:Ëïüî?àK'¿È|ü';~ðµß]«ª¢Ò4›˜W¯ÐjW±GÆH€ª¢¯¯’ɦI¥ô .£;2F'(úé+¬œý2Å“4Õ×|Ít&ËÇäïòþý¥ª•HI-]â+/†f§Å–mÛÉ¥s¤ÓFtNô~üðCßG{bŠ¢rváíË/b¤ R)MU¢Pµúnšh 8rß÷#ÿ„»¾æþLML¡* zp¼¬¹—HgR‰ôtŸŠ¢¨<öŽa`h\.(‚ Pþæ³ÿÀ!þþ¯þ;Lg€F,·ˆòÍÂ\15˜SÛÍEKöà C½ªª’Z_ÁåÒÙ–ÃKÓϚɯŠU,X-®ù“+ð…S6—å­ïúß÷ƒ¶éÒh¶q]7ÊÑsl‡Ë/}6mŒÝû{2Èå3 ª,^¸F»XÁu=Ú­[†¶S3FAS¡¿£t™{îÐ å9^ù"íV‡‘‘Œ@ÀFkÂô‰xv ó…AÞùÁŸáM¯‘¨©óKó,¯­ (*­Neæ2…B‚B!Çì —Ö±¦O°|ñ«Ü|ô©TF.,‚ð:HX¾ƒ<üÆÇxÛû~œµR+hѯŠõ"áÞdã¹wJ0òMUÕèc<mqå ãoŠ¾Î¯Í`9Vàì84M:f‡¾œïÔiºFJMqËÝà¦[n¥Rmà½ëBZÍ6¯<ýÛÌ—çùÀ[ÿ ­v'Fh·LHà8ô·WX<{‚|*Okh?¸~˘|!ËSÏ=Ͻö‡xúò·ð<—Žm¢**™Ûi·;B²áë¸ÁHµx‘X MSt[‘‹ŠMÕèëËc;v¢0¦ë’õ4‡V¿{|25æø6xô§™½~.ùn:p¡ôÄKªd3Y¦¯]cמ}4[m„×ã”±Éמ‡Ól³Þ(²{t™áýØs ¯¾šØNEUyËÛ>Ìßò!VV+8AØ<Ìo0kMΜú]–+Ë‘û©kY#Ãý·<ÈÒ©/c9†rÃÔM¿x¥Ua°oˆv½¹³áz6;MZ羄W¹‡±½;¨Ú ‚ÃÒ=Gc‚0Þ <¾pèè=lÛyˆ'¾ð[Ì\;“Ί®°^/2œ¦Õn1[™áäÜIöÎíÅ´;8îFáz÷ÞûØÓ›ùoÿñWä#"áo?øÃ?Å­w¿Å¥b¢è", h®WÈ¢mZaÛ½Ékš‹¸ù߯¶«Lßwl‡³3/D¯Ñéth6›k%úóýhšÆöámÜôà¡Vkâ8nÂ]¬/¬ðü©ÿÁÒò}ìÓäóYš--È9ŒnþŠm…jfœüÔ!fò9tÿì8®Í³ÏŸ£a6P••ÕUÞpä ôç)–ª‘ˆ ×CÓ´@ÜiÂÂáÄ…O½îh¸ÁücÌR(dýYÅ›T±ö¶0ñ<¯eb/ÃØs{B„öNÙ UQȤ3Ô¦É9B«mv¹¨ùõ殞‡ŽÃH~˜±-÷ zo¸çíôç~äßÉì3O`v’Jì—»ºÊÓ/†V§…¦éhªŠ¦$›X—š% -ÅJm™ã‡ÞÎ3gþR£Ä®Ñ]\;óÇ݆šü½ÕÅçp«ô￉Z½…soXn°>¡8Ìy׆³§žäɯý³Å±#÷ ¨–ÝÏcem…-c[¹iç=”]ƒü– ¬Ž…çÁ–-£èºŠ¦ª4š&n©Êíw½…—Ÿÿ’\hA  üÍ “Éð‹¿ü¿‘ØÃâR1YÝJ[Z@Mˆ¿°ùs2²¦lè¹W]\e¹ºÌ-iƒ¡ÁÅR=rvlÛ¢V­û®`6‡®ißs'ßølË¡mv¢fΠøNÛÜ _ñÿ¦Ýl±ct'#GR©6!ÚPиŽë ¾l:„î`.‡aèd²¾pºãè9ÿÂïrdê0gÏѱ:¤wßF«eFB.¾]—m³Ô²XžŸª (*—‹×£ÇRšíØìÛ['5Q¹~wÎTU%3ØÇËg^áí÷>ÂòJ9z<Ýöp{Ä_Ö1«‹ ôç¨T‘ƒ™l “,4‰‹é#;î¤ì‹B*c׎C,®LsàÈ<þÎO é)*Õva©áDÒ¤¾p‘?~åpMó]dMÑP5hXÏréÏôsöêשµ«¼ñ๶~-!fŽjÀååóL´Ê¤÷Þ®k= ¶“Å4jl‚M´Æ±ý=zëƒìÜs3O|ñ·0íº¦1œ¡/;€ëØtšæVΡ(*éöé}·Ñnu˜Ÿ_ݰŽ÷=ô^ÖVf™½~V.:‚ P¾³lݺŸÿûÿœ¦•£\©oê:]>‚]†A;=âçÓ‘lPÜz‰qüf«;óëó<ñgÿ€[ïþ8wz;Ïžû*åni.籘É#ûi·LlÇ DPWL™—^æ ¯þ)®ãâ¹ð†·ÿ«keZë”\†t&M:m Ï]¢Ù®¢y.öðþ@í¦Áì  ö“ÏgÛ™R<æËóÙó'§O1Ô7ÄM7íe~a=Êï‹Ë«PPÔª Ò™4å\U£oËø†Ùf»ÃJm5Êuh[m†·âÆÂë]A­lZìyFÊ¿Lö÷åXYí®‘J ¿m·…ç9˜õ¢ð}ܱŒ %¿·¢ ž‡kµ@Ïú³‹5ƒ{ý0}ýôõãᯇªªdÇG"¡ìº.Åó_ç…ë/ây.š¦£ª*šª¡ªZ²:¼g[uU#cd©¶ýŠáˆ=U¹qÊøru‰ìé¯RØ}?™\Æßî`”]üJwêKRÆÏ‹BŸïšóÓœ>÷žçRª¯GÅ&µF†¾|ëõ†çIo™Âlwéþó©<þîçwþ¿Nµ²&Aèý›—%„¿n?vœÿÏÿñß0µ Ò7.8Ea}u‘Îòešf±{6m‚~4t}Ó¾€Õå"¯~•~ôŸq×~”ÑÂ(O|õß`7W(—J¾S§¨d,o~ÇÏ2yd?­¦‰e;]©ùNÎÂË_æÏNýq ªÚÜzàq&&F°-%ç‹ÓŽÙ¡Z©ƒ¢bg§`ÛÍA  f5—¡PÈ&öSUUfçŸÃv—^¦Õl±{û=t,Çu{ow :¯R%6èÛ±•>k=Q=«¡æª/t­;­£cu(«y:¦ÑtÅ Q£æ°à$üàðþ·ÓjwHzô³½“@ ݈Ħ®j ·,“ÎpíúuŒ z5¾­ñã?¾¡ iέ«¨¸ºÁ–í»|ñçy4-œrÅÏß\¸Œ»²T{Ï‘K¸eëÍ ¥‡Íްcp;#ù‘®»è‰Ð^ÒzŠÑÂxÏ9úÚ·‹–ÕfýÒt–WÈç³è†­eR’XãxaO\—f¶íäÖ‡€­£Ûñb9År©ûùê«´[&º¡õSÿól6ÏÛÞ÷ÓŽ• â Â_ ïzÏøàÇ>ɵ™µ¨À¡·qn³ÑâÜs€–Ò¸ïÞƶ }í4UúÚõºUšªR;÷y=ÃþcÀêØd²¾K5}õ2³c3QµçDÿ·>ü~ÆÆGi5M?‡.&FªÕgžÿÌçP•Z¹Êxa‚·~ð},.•èëëÎÁ çß2ÔÏ`ð˜ãºhªJ¹\£ü¬®i¸(Ï/smÍ/~óÜ7É(YŽÜuŒù…uÎ<ýYfŠ3lÜÊ®‘= F±ôíÊ ÚŽÛ#c騶LÚè®É€[ñ_ËóEmJOcYé¡MÅåf!ØP¤èÃC~>_&…U÷×°·ÒTQÔ -T4UG Bís3Ó;¾•ŽeÇBì¡ë—œín‡Ñ_Àhd°u4 %âÐmœ¿8‡¢(d«%žŠ¦©ØÛ çFgj}[vSð<¶‡Çı阭`ŸUÚ«EV_ XY'•J‘…´‡rCœ^8Å–-¬7ÖQc!ã9‚á÷‹+¯Ðï5Hí:ˆTêz®»ÁõKünE`ø#†¡3qÛ£ .ÌqåÊS´Ì&x.3 3ìØ²Ãö×_bìÎG)Wê8¶³¡¦f|b;¾õ|éÿ«\ˆA  üõ ª?ùw~ž#·½‘«×W¢ÆÆjlă¢ª¬¯W8÷âg©» zàSd³)ŠÅZbXoÎT(úB±õê·>Ëž±ý4rS,þ3ªí*{ÇöQ7ëèFŠ/<÷ÇìÚº‡Ý£ûØwŒm‰¦SÄó ×WмðÜ£Öò 1šõ†nðþü%ÖKõ¨(#¼¡k=“ |7LÃu=û6Üô5U¥±ü VÊZ‘{¿“ÒÙ“TZ%ÞùAnÏ%ÅU(MœS×ÈeRìÛ3ŵëËè;wPž%µc[âç—Ês‰V,ª¢à86…BMSb4[q¢k¶ÓD’Í¥èÏav,M_ød2[—hª–;Gyv TÖJ‘Sñâ/„ŠV¥Š“‰ŠhvïžÄs=ô¥yæWÎb»ÃÞà"öNäð?êdsÝù½éí9¬t .?ÅbqÃHE.¦¢øo4êf=‘Ë~®çF½CQ ßk+k•ÑwßN*¥Ó ÎûÞí s/ãy°½£ ]×%³u;ûÇ>€yõ%Î]Ï󘞟fû–íÔÍ*­KçéÛs€J¥¾©ÀÊ—_dëÄͤò›÷„S˜¸í´/ž¤³{ŠþþÕjoh8r/C®¯_„L(L2™,}}YêõvBFNfL˜‡¡Øðûµ`ªÉz±Ö‰ºŽ¦é8Ž4î¦Ï­(*zkUU"ÑÞ»oIW¬+'qÛuèßã CÇ¡Xª³^¬1½ô*¦m²së]¨Ùt"ôÙ§™ôæŽML0<òn¦.½ÄËW^¤¯¯/áN le¶4³©ãV»AOI7¾¡ºV_%}îëdwÞCÿ`˲q{Ú ÅÅj˜ÓÚ+àŸO§ Ò‡ïaz˜Ë¿…í8Ì.̲uj×—Î2¨÷“LT"ÇEðÞôaVW星¹ 'A@rá Ûwìäÿûo~ 53E¹ÒˆV\4išŠ}ý2ÏŸú,këkLN²÷á)W›Ñ2lö¼vu–¾V•á=; ¿k'Æžƒd÷ìAݱ‡£[na07ľ½[h4Mÿ÷Ò)Öêk4 vŽìäñwý¾ã½úÆ¢žƒáó+ŠBçÒižxá¿bÙVt#oÖ[ìŸØÏÛÞ÷.*U?oQ×54M½a[ØŸ/Üç ù]ó±6&#Þy„;︙³‹ç¨‘bt´¿'?,¹¶™·2ûÔSOŸ£8·D®¼†Ù±¢Ÿ-«˜v']7®?×O!Ÿ‚" MåüùÂ,üöp]—éóÓ¤Vg(:ÍfÇq¨Ì<Çà¡ã~Cè`"ˆŠÃÕ2na”}Çn§ ÑÚ×N²ÞXcÿÔ~nyãG Ü‘(äL¹p—Å—¿ÂWÎ}9ÊS•FP]úÁúÇ´M ˶}ák=ƒçz¢qtxl8þ ^¥ÑhóÔKŸ'j ìxLMç™§~ŸG¿™}û}1ÇÆ)'q£ ¡ AÊ ?1NDzI§üDgi‰¹Õ x±u74Ã;Ù²÷ZíNOáÁÆ k5æpZKKƒýLŒQ,Õ?ÿÒ³ͳݺu+ZÐ:cdÐU´žö'®(Šºí%›ïÇ \TËv6Ì#Vf.ó™oþ&Ýü¬ì–xåŽÙÁœ$?9žt½ë•tg“/ÝÇbáØBC{Y¸~Çsý–.Ah-(jQ© ªªmx]/øÝNkþŽƒ>2l/¹àñcû¶"Jl¼¢ éCÛÑo °²r•L: *äZ ÒãÛü書ˆŠ¢³-§qîêù„[+ß‹HXþ yÿ?Æcïü«ëµDÞS(<×£Ù2™{ù \[»JÇìP¯ÕÙ7¾Ÿê•kœ[|‰f§I5;ÀvÏ¥£0« ûïwÔ_MU¿•‰ë±^¬’ɤ¸ïž#œ»0¹+åR‹Ëç¸}÷½ ßz¶í&Æ}…®Q½ÑâⳟãÂòÅäÛõçëÞuóû™`yµ….-D4[”Xh3ülX$âzêl÷ƺj·ÞsÃ#ï¤ÞhG?§„3fƒýñÜ®h Ûí)ª£4ÖÊÜýøÝœ>;b®EÛhh¶ë°²¾ÂÁ‰cرi+‘ð‰…ãáÈp:…~RkFûVÏF·ºÔPõ •²~¿=ÿ±\6ÇõëÓÜ5¹“êéç91ý¶ëÐ0¸®Ã@nC3X®.3Ð?Djð`×ýów,T•T6mGuv‘[6}£ÑûX\š…¡æî~Cßø·?òƒ,¾òef—f퇃ø_{ž‹ë¹hªŒÜèšãÚ¨À|ñ:Cí*¹CwRÈghý»­`CP{màðËá½¹}Ë.ÖOù•9l×a×ÜÆ–-ض³¡¨&·vãÖ7ó¨šçËürÁD ‚ðÿÃ0øôßýGì;r7«ë5\§+„â9MÅJ‹/þ>kõ5lÛ¡V«cZ&«UÎ|õßñû?Ljß­äs\Ï#ß3Þ­«»M!¿zü‘Û¹pi>*Èð<ìÊ4;÷½…‘›ö`vì :2Ù.em­Ì+Oÿ6+µÕ ûcu,vïæý?ð¦gWüæÎ1ç'î6…’§·’X×4†‡ QÞ\«Ùæ™+OF¯ašnÛ~Œ}{÷²¸RŽ~W‹=·LÝpÕXNÖ•¡ØP²lÛï³w}íj$X\Ï¥ÕlbÛE=CÊÐPTß ?†Â¼·úWQ6FÊð÷a“êáxE‰æ«‹6Oö{ñim›òÉùÜ ¿K.“çþ}÷c;‹•EE妭·Ò0FPöҡ*JgÐst]ò3è†îO#Ñ4•Ì\ÆØ{ÈŸ+ÒéÝÞø¸¼^’Í¥ÙuÏ;Ø;{¯¼ô%( $B¼aŠ€º‰7;ÁZ:®UB”šEZ¯~ƒÃ04ØGµÖˆMœ!Ñм›OúÚ{™lš-ÇßBý¹¯Òl¬r}îy¦úßB6—I4¥¸ºr‰ã·Ý Êý,Í_åÔ‰¯ÉÅK(Â_ŽÑ±1~åŸþïxú«kÕH õ¶Yœ^â̩ߥmùÕJMÕÈ °Z]åñ·þûuoØ7H†…‹¦©,–ç8 Þ9ŒÓ¢5¾“]S#˜?ñÞ0ôÈ•ÑT¹sWyö•Ï`9ØM=l¢l’ÒR¼û?K¹Rž[ ÇÊ9®>‚l®ãú¯ívçóºžGÊÐ(–êÑv1{ŽmFÂÈl›ìÃ;)W †°UMõŸ[õ…F<¡?üÚ „ ª©œ8yUUX©­$\¨V«…é˜ìÚ»?ဆû®¥ØxF£Þd|b8r ÃmRw2é¶ÃyúÙ§ÇëÖ£·ptßÑ„ƒ¶<’¹U‹w{/^n ¶f`¸· lefýC·ÝÍÎB–³ÏŸN6ÏÓTŽÙÉüÂz䌅ǫ>´…ó/þÇÜ¡›0M+š"²!O/ö \ë^A °‡¸Gàòå'h6¤ú7œû]¡½Ik—X[œ¸0l[m:¯~•ú–ãìÜ¿r¥¹Ó‰cyÞõ6>÷MîæGíe.¯\桜ßé¡Ç>ÊÚê ³—ä"&ˆá/ƇøØü2Jj”r¹±©[§ª*«ç/óò™Ïc»ºªÑ6ÛàÁ#Šlé:ÖäA&'GÐuÍïÿ§*hA+ŽÍPT…™³WY©­pPM&çg2)2™a?Ü©(¨º?ÿ†Z>{ž§O|Çs6<¯çztÚî|ðûai¥ä¥ ~×õ¼DÑAÜÔ …|ΟöQ«·±m7„ŽãòÌ…/G?ï8CÙ!î߯ÜÂz$ÀBê¹oú½8rîT…l6MÇìЩ·Õ¿ž´4q\Æ'F|—0,àÖ•HHz1g ¯?O:e$ÂçázúÏqãÃÍV+j‚´]“mÛPr[°4áU׸´r‰Á™eRi£+ü<›¡ÕŠ÷ðC¸ƒƒ Z/^}’ãžKþÈ­A¯IÀM®aoõqoaH¯°Êo›bOÿ{YzõKÔuúò…h\Ï‹U;7\‡Þjh-ø²½x‚J§Bßá#˜íNÞ¬J8þÅðZbf¶<éîýGqcy}áö–Ý€õ]Ü3¶‡µõ*ý}9jõ&ïxÿOó?~ãŸR¯•äb&|Ï!UÀ‚ð—ämo'o~÷ÏR9ó*¿ùŸ™oüéðàA1D2¬Ÿ9Ásøóo–.Z“ûnºŸ‡>Æö{fëÖ±H,iZ·Ê4¬¼Ô55ú¨©*º¦Òo­sdËM‰êÕDug ÔÂŽë²zâ)¾ôòïD…¡P E\£ÖàøÞã|ÿÇÞM±TöcmMT…”¡¡ëþ<^MSèt,6Žëâ8ÕZ‹z£®û‚®zö43g.³üÒ7¨›È™«×ê>þ^Ív·Ÿ ÚÝG]÷Ç•…ÇZðX¸6JèUçŸf°SŽ\)€NÇÂ오Siú Y¬`ÔØÚ$>W»Ÿ/^¸F>#ªAn·ÇJé׀̈́R•ÅÚ"µv•¡ˆô‹f\EåM·¼þò,ª¦Å¥>x.[¦†©ÓcºÛÚÝÿ‰mǨVj3Ží0ûÜŸóõó_IÜ(Û­6ƒƒƒÜù¶²ºV¡c9‰V)ɱ`þLØøl\MóöëÚ/^.r?âc¶t=^èÍf› ßü¾vþ«7thlÓ"ŸÍs×ãï¥Tn`ÛË+%¦Ï\aúüuʧ^aaaJ¥IÊÐɤSŒ °}Û(+ËEff–©T¬®U¸ryž¹³Wi·Êìºy?×ׯńBÇ´øÀ£Õî$Ú½tgóv÷7ÙJ¦;õ$Þr¦Ôª¢* åÊBàt9~‘‚ëWÙÚz(]çOQýßCÈas(BwnÅ0ôÄ:©H ݨt6wÃs¤ÝnG9€ª¢¢«ív“ÁôPTØŠçú Ï ÔXÃ0´ ì«ç¢°´RŽ„k|ÂÖ1ý;w¢k:…tWf^¢~æƒyŒØè:ÿ)7¶í ?×á©Æž[×üµÈdR|èýlŸ8L±\Lˆ?ÛuX­¯±R[ ŠDÔÈùT5Ñ{3fâ«OQ*×éïÏãö6VfÇ›CÇËøø¾¸LgR~Û%yþ)ƒ /ÃÐuÚ­Ïýo|ücrQ¾ç·=‚ð “Éð«¿ö¯Ø¶ûV.\žÇ¶Ý¨šòƒþÇ”N=K£ÑÂu=.=û?™)ÎDE¡è˜Þðاêcq¹ˆ¦)›6WŽç.…"/|\Ó”¡! Í ÕêNhššÈ— gy¥Ì™§?Ëbei“w€ (~HÚq]n¿ë#9r„§ïó((FŒMbSûƒÊJÛqp\³ãW:oß>‰×óðÆi·-2™ý\={åj÷µ;f‡;<äï‹ãFyZQ¾Xâ¾/~»aÉð{Q_P(Îü½¸r]Õ°Ý  ëaÛ{&ümDCs¤õ„×ê:~ª‚û-- «¿†sÔh6"'LStš:û·ô§Óe³~EotP=ð<2F–Úܨ*Z_\>C»Õaùú"tL&ìêŠÀX£“l&Í©ƒÌ¯³kb7kµeÜçŸbë½F9–Ýs#ОÞF÷LUŽãúëÕ±PÒ 0Pžg¸Ã4î`uîE&FÇ©¶«\]»Æ-[oFSují*}™þd¥8ÉjèîÔ%úÚvl¼+/2W:ÀÁ[÷±¾^Ų @¤;©¦[¹Ü}î^ƒq³±~BÛ“c˜33\¸ôe»åÝt&w²´pÓ/S.r‚8€‚ $Ùºuÿþ¿|–¾‘}Ìί%ª=R)ÃQõÂ(ί0Sœ n>ÝvÕj•ÇŽ=Î[ßtëÅî´MS1ô¤S†>C#l@lÕÈÈ·n?ÆËO|#™Æ›kªÊõéežûÚITúF.š4(ö¬ŽÍc·<Æ÷á¹Ïý1éý·°õÞØvüVTUar|ȯl\!ÃèVvÆ›#+±b!ŸñçÏ=9C®çQ­Öxà½dq¹mOÜõ ÷;\x!4oŽ®( e­ÊÂó_Ãq(ÏRQTlÛ¦m™Ô³X–³ÁIŠ;¥¡Û011L& D¨æï·®%]CE!•ºqØÏóTÐdzyòⓚ<„ª©Ln&?:HfxÌÈ™Ñ!Ò£Ãh;o%=6ù<žçÑ1-¬¶‰^ÈÒ]ç KUÐÇP.—ÑUƒ”–bµºÈü3ßb /—8â!äÐiUƒ -ÅësäóY ŒŒ @§¸m•Á­˜û˜êïçà}dmm\*Ï-[oF ÞäÒfŠÓ‰py/›9‚AÍ3Jñ"3/½J>Ÿ%eèÁv÷:}IǸ÷óðgâ½7K‘p<¸í À£oý&·ì‘ P„.wÝ}ÿá7~‡f'CµÖJ8TáGMS0ûvðÜÕgÁsÎ'ª ×FCåÁ”åÕräžÅ ›®iò´Ô188gÛ=ѲÚÑ÷Bw(eè\|é,/=õ›4;­ÈÝQ{Z~´j-ú²úö"ß?AY`rÂw¿æÖh®•!Ò0ÿNÕT_¸…9ñ<®«×—¸¶v5r}tUcÛÐVŽØ¹yaH6>m"ÌIŒ¯K\pª=!ácÇáÚúl"ÏÀ²,Ï!Ýçr„""<^¡@ðCÃÝÉ © ©tÊТï÷ˆd_# PoúUÔ×Ö®R©”ȧ Œ Ž3<˜cËä0##ŒŽ£éL ײ1Khµý5íï£Xªu]ÌDÞ¤ÆÔÞ]èšA«ãç f——Ï3÷Ì7£pp|Í⟛׮‘®–èÛ6I³Ùf}~…Æù¡r…áᆇû(Þ±ƒþþ<7¿é£ä´>Ö«ë‘Ë0 Ùi2[š Ž«ÚÓBÆÃÐŒÄc *ŽëอÊ4¥Wž 2h·:˜³s´çhÏ-P]LäÆ÷#.nýŸ‰»I!Øö’T #Å»>ôÉļdA(ßÃ|ø#ßÇ¿ú7¿ÁÒJ“Z½¦)‘XÝ;ÏóX?u†WOÿ¾ÿK®ËþñƒÁMZCUTÖVÖyüý¿€ª(ÔíÈÍ E_\ ÆCV¡°ÛÔõÑ5Ld}½9SŠ¢0÷Ì·xùìçü&¼±QXŠ¢¢k:º¦£©*fÛDQî¸÷û9zÓÍhšJv|˜ çX~ñEj•‡o?€¡k¤×/túŒXuq$Ú‚5 Euý¥H¸ž‹iš¼÷]‘øÕu-ªäÕu 5(öÐu,Xøµ¢v× »1ÇSSUÖëKœ¹|Šb£M m‡t*Íðp_$œãÂÁ ZÀÄÇ×-,¬E….qWÐ,é é¯Q @UQ(7˼厷¡ª•f‰Ži’Ë¥“½wQQFGÙ¶k µGé+@˜ÓfhAqŽƒí0'Ñ0tvNìcfi˵p=´žæÚÚe®}ë«äséHªšŠÙ±X]Z§zæyVÎÐ6²4mÒKWÈÕçý°úÈ!†‡ú6Lñ][ƒÉ;f×è^š­Vt®ïÞÅXaŒ¬‘á™+ÏбÍäyôgŒ‹Cd#éZ«Âµçþ„Εóä‹ó06NnÇ6²Û·FM¯»®­ºé䙸 Œ‹OEñû\:Ö±b’þÞõ¡OIQˆð=œå‚p£wGªÆ?ýµÆ=¾WNOcv,?÷NQ‚'ݼ´åŸäÅëÏáy.SƒS<ûÊgxÃþ‡Ø1¼“kkW©UjyﻉV£ÍM7íFQ¶³2âÍ­C¡ç÷ „T ª×eyµÌé…S±mPq-¾÷-¬®WÏ¢Åʸ“®GØ‚ÅUñ[œndX•Zèï§Ö¨2Þ7Ýð³é,ƒýþZ;þÏYŽ‹iZ¤Ó†ß–&h)2?¿Æ¶mcLŽ-p¼(ŸÒß%Žþ6¾ö%´ÙòÝ×z»Îp~„¦Ù@UšÍ&Ã#cQõmØÜ:G>—&“IE?[(ä(OÏS«6¢¿‹øZÅÿ†\×M¤>Ô—×(lß²a_ÂÍ8v÷cÜtÛƒr!Ä„ï%vîÚÍ¿ú?þ3 Sçêôr¢ pxÃðÇJmÙ¯|Uú:®ÃäÀ Å.._à§?õïÈfÓL{(šu ¸¸˜Rzæ©jªU¨†®X¼Ò÷ÂÅYÔ­·r}f…é—þ˜¥êRPtâ½æ>V+Ut]ãÁÇš\.Í¡‡îFûšI/rúº7S7 ¹ºÑÜÖnèÔq\R†8.¾`Z]«òä¥oày.Žç'þ[‹7¼õaªÕ&V ‚Ãß÷«<»ÕζíD"0Ü߸@ 'tã––ý°ï@¶Ÿ´îo4 \Ïåà–C¨ªF¾re=»§"a­«ƒyÊåÇoßÏÒJ‰v0ÃYíi9¹²ŠBxÈÒé××5êíí '`ø¼«+kضí×uî¶Áé¯TV5•NÇJe5˜²sÏÝ\¿ò S#SØ®å·q12hªÆ|yŽ…ò<ûÆ÷±oë1lÂÉ*¾ Öן#66œ?ñ†Þ¡Œ;nžç±k÷>Ú“[¹þÜWèïÏâyç–Î2³>ýÏó-Œ³cü +¥.­\DUT¶n%cdq\›éâ ËÕe>tßâLm£yÑϬWçPOÔɾ-¨Œ6…á]Û°Ç/^Ù2A:eD7ñ7RnÌý«Ì,0°cˆ\ØÐ yÓÛ?Îêò,Ë‹×å¢(ˆ(ßí<òè›øÏ¿ù{”j°^¬En]¼Gšª(,.yék¿ÍJm9èñ¦ÅÄ‘‰¥µ•U¦&§xÇ[î¤Ùl38G òçâ»qaÞŒ¢»@hÅ{¸išÊ«/œã¥§ÿùF«c±kl_ä tEšøâ8Þôo{óqjµ&Žã¢ï9È-¬zÍß¾ -ª<Ž9aSæ¸s¯>n^<Tâ*ŠŠiv80q;n; ¬°©sè†aÓçøºlæ¾ù³mýö1™òz´ßåfÅ7štìVG¥mZÌͯ±sçD×qŒ»iš?%›IE!Õø¿pŸ{sËŒ×Ël5(5KFŠf§ŸÆê©”ôìm™’ü¸ñq…l&MΛƒ‡ÎèÔ‘›ñð(VŠÑï¦õ,ÙTÏsIé)†óÃØ¨¸ógãE¤ÂÁà¹Âs:ÞGéqju]‹òð2Ù,‡~'W–*¬ÖVØ5º“á£o@S5ÚV›õÊ<šªqhò0·m¿ƒ|ºà§1 áȾÇyäM—jß0ÕsO'ÞìÔZŠ'Ÿ¡X¬’ɦ#×8eè ïÚF6“ŠÖ ÷Í@¥\çⳟgpçÖ(÷o³b’n/ÍïùȧÉIQˆ P¾»ùÄý¿ðËÿ’Ë××(W‰©a>‘ëy\º0ëOƯ¾ D‡åXÑÒ *QM³ÍØÐ=úifæ×h4ý‚‹Jµ —¸˜‰•Äí½.EôóåËœ¿zÓó›ÛÚÁ6ø",B “îýa…ÁÜ ßÇ(–ët:¾µsÇ8åÌCãòÙ®ºtÁ5Þ®Æõ¼H†Ó;ê6Ï_z"Ú¿ñ³Éöc³^ªÑj›‘øs{z¶ÅCÏ‘ ©&ëýZQZµ¹èy¦§üê_ÇïY¸d;ÌÌ­²sû8éžÆÀZ4?¹ƒ¦©˜¦•ÈËŒò37ÉÕÈd²¯-5&š®“52ÑšŒ¦U?ÿ0^MŠÁø×qQØ(޵¡ÞÐ`c“ÔµÈópIii4Ug­¾ÎZ} §µJ –«âx #»·c;n2ä¯&§~¨=ëæÆgCÇ„áo}+^ž‡¼‘Ý£{(Ÿ}ÒßÜ(ÏOS4L«…¦h å†ñê3xõœéxs'ƒ7þ›"×up]Ëéоü"s—fýp°šl’®SµÚˆþf‹ó+¬¿ú ²õ2‡ïû@b?"G5VoÊÞ?0Â;?øÓf ‚@Aø.@7 ~áïÿ:¿ë¹tu‘fËL$“‡®–¦ª¬ž<ÃÅSŸK´‰‹«0ìzf»ÃÇì_ÐWœå‰/>ýÌðP!jlÞ0{…^ÜíÛÌ3M‹Œ‘cë–íØŠŽçy¼:÷J´ ¡ Ùëþu:<×ãmú{¤R:Íf»+(ƒ¢eÙt‚°wø©”ÿFOË–0¯.rÿ4•«'Î`Úh‡ÙéÐn¶ù¾½b©žUZlì[•‹=_|âG”¬_¶»¶v/8žçÒéøÐvm¾™Ñ‘þ B:tC'ëêôr÷X‡ÕêÆÊëø¨?ÃH½æ¹Õh5X.-‘Ïæqƒc’Ö3¤S~o#掋ßÍ„üq×õ,Ðjwh› íN²ivš¬–V£óÔqVjË”ÊëÒÖjËô[EH¥éh™LŠl&¼^7ÌV©‡ŽYtÔd.¦çzQŠ‚¦k»ó~.×J×%yÄÅ¢8Ésç8îˆw×Éó<ÔÒ%ÖÏ^ˆåÍ&÷p°àOTF·O0~ëÉîØçñCñ}Šçz†ÿvì>ÂCoþ°\(€‚ðÝÄðð(ÿâ_ý½‡Å¥bÔž¤÷ÆÔ±l®?ùN\þjô˜ãÚÑÏô:•r…{>ĸ‰ƒoz”÷íO„q}×AÙ0½Ã0‚æÌA^Øf l‹¥:'¾ø;œž]5ÀuhԚخ³i…eWœª´šmÞtëÛxÓ÷Ro´¹tËÇe` 5áwô†?u]'•Ò#¦ª mÓâÊõ¯Gb  \*sÿ}§Ýî`Yv¢ï_$š{ b¯㠡ãaçðõ––K4;Íè´­6–eáyi#Íî][ÉeÓ†9m¡x ¿>x`;ƒý9.^žglt 1r.¤ávDZT&óºçX£ÕÀ0R8®íèäsffü .êæk5Ö¾ ¬ª ý}9Ê¥K¯žgúüõÈÜwË-2y:3rB=\†rCôúÉ9ÒF†…Ò ¬ŸçþGïdËäP0:.jÜÝøca+™Þ–:ŠTcÇrZïyàqŒ]‡pÜd±Œ¦h=éZâ{KÕE\×ÙÆÞ)*f}æ¹WüÔ”¾!U mZ1ằ°(þÆ®·‰zﱸó¾Ç9tÓÝrÁD Âwå×ÿåo훤\ñCF›Ñn[œùÚç9½p ×sƒêÒÍVQTÚí6cýc|ø“?ÉòJ…VÛ/®kÆTÅ'„ŸÇC›qgàʵ%^þÊÿˆ*)óéƒJ j5,ÇJ¸‘þ4†n¿µZ­Î@v€÷ýô²^ªã8N"ÌzòÉW Ý"Œ• ÷Ç¡j Bg.vÃÖ´¨Ê«/ž§ÒªD?gv:¤R)>øñwðù'Ù¿gŠTÊHL Iäm©Ê†~‡Žãv2× w·ßàÚìr4n Ú®áÇ2N1::9†ñâ•0´ÇçV¯bš†‡úÕ¯¾àwO4U%õ:9€v Fýqh š¦“Ie¸>=‹¡k ÷+ÞÜÙÝd¤™Ò3²N×U¶nÅcÀiR>õ WÏÏÐj›ôåÆÉfr”ª%4UÃõ\ÆúÆ™œD×tRZš´‘¡m·ùÖï}†\.Ãäø`äp†ëw>ãÛÓ+ÎÔžæÔáŽM²åØqJn߆êf×ó"w/Î@v *( Ï_%–Ͼ~Ó¬Ó¾ø åJ=¨ªî>w{a1±½®ëƪ®7oˆß·Þo}÷26±M.œÂw R,|Oò†‡ã'?ýY[¯Ó6Û‰pS<ü[,Õ9ÿôç(5‹„±jÛ0ïÏó\Ú­6úþ¿eÙTªèyÍ6#Ã}  ’… ›ÝŒB^=s…Ó_ aÖƒ›§KÛjƒ¢ç7>v\Çu04ÃÏKTu<ÏŶm:¦ÉÛß÷ Ô›mšMMÓQäWï¦etÔŸ’`Z±wjO%®†ª*€Ôp?dç8.ë3O&ÄX»Õæþður˜Ÿøô?ç÷þíäýŸü <ÏãúÌ Šâÿ~¸ÿŠë¡iš_ÉôŒW$»*h$+’Ì5ÿk™Ëþ8ÏóèÏö388äOЈU܆ÇÀ0´H*ŠÂ®¦Ñ44¢m Ecø!~ždsù×w™Ó£¤µ4†f$œâµÕt]Oôt ?†bÀí9zs'=ÏcëÖQØ:ÊÕÓW4‹”—,´‘XKgpq±-›L:‹ç¹ŒÆ‚Pª‹¦è~E±còµÏþ6ä˜9ÕÙ§¹¾~´žÂ´ý–=ÍN“‡Žý [ïíq$“UÁñõ‰úGê)n¾ûΟ}•1«FÇj'ÞØÄÏwM5(hFâÍÌfN¡‚‚‡‡íX(Ó§™oîgÇŽ ÌŽåÏ€öºŽ²çz‰íŒpì¾¶ÿ¬ñ^”Nl_Ré ïýÈÏòÛÿùWh·rÄ„¿m|ü‡ÿ?ð£¿ÈâR™vЮWüÌίñê·>K=\¡cá >{ƒûÐl¶8¼ça{ä8kÅjTñ `¶; ñçô$ÜÇŸÇ‹58ý­—˜>ùG´­VÒs]4ß ¶ÏÐŒ(G1üýF½ÁGå¾»Òlš‘àñ]¤ Œ;<ÂÑÃ;q7J½=ðâE*ažV(_>y…•ÚJ,ÏÃÃc×ý³Œ0»ë½à[Ïž£Ñ4Ù½s‚m[†1 ½ë©JÂ]U{Âzqw,t“fׯ&QÁ(øaO<LJ´Y À¸P +_C²™¥r=q€¨2:.Ö ÃxÝóíÒåK,\]膸QÑT s}ÕŸáKˆf.c¼9t<<?¶ñc³÷æ}¤ö";:Ä£7¡)fƒr­ @Ëj’ÒŒ®»«(ZŠŒžÁÃåkÿÏoñçÿ+OûË¥%ÖëEÞxèM¼÷ÿÌ|ü£±~šNÇJŒÿ‹ôºƒáùîÏ¡#7S) £Ú üÜà¼X¯¯Æþî\Œh»TE r*»‚0»v™™Ó—(ä3†ÎÄ]‘‹ßήӾ±È*‚½¡øÁáqÞùŸBQåÖ)ˆ„¿5d³9~î—þÇï}ûk†|=Ïãʹi.½ðûÁ|R;nïÅBª]æçváA¿ÑÇýÝŸàâ•EÜ[¬]I»ÑâÜS/'ªÃþòJ9ºá«1¡Õ±l®}ãë\yrÃë†B¡¦¦1͞碫vP| ÂvÛd¤„É;ÞÀ©3×EaþÞõ™tCcp°@¹ÚŒrãy‹ñ>iªêç+Æ÷¥~åé„kS¯×á=o½3Z‹õb•¹Ù¾üÕ|ö·¿ÄùKóLM ‘ͦ“î*É\·°¢3.Ê•+µ•È}-5Êd•,®4#¶õH(÷ãxh7,°ðŒ¾­˜“j½Ši·)5K å†7Yk-*Ðh´ê4j5Žn¿‰úáÁÈí÷DîðCïeuf‰•åâFá…›ˆÁPtíÝw˜ÂÁ›¨ÛéèõãÅá94R‹ÎùÞó>tzýsAGUüíÏvVX;y˲I§Œ -BÇ2‘^¡*±\Û®+¨l²¶Š¢°{ß-<øÈûå‚*ˆ„¿ ŒOòí?²sÏÍ4[fä …•¸qOcöâNš—ȯëVœ”%jÕûŽ=ÌÒr‰µõj”s,dòYŒN1q3q] OÀ4-._]ä•?û<§¿åÏÏ-•ëœÿêŸqfþTâµât Òi–+ Ñvõ†ÕZÍÞò8í‹'h]8Ã˧®$Æ­=ýì_üÛ·ŽÑ騾ðй#ñ› ßóÍßîpíTUáÔ™k\[K:qVÇâÈÑ÷Ð6-Úm‹+×—(–ëäׯ199Âà–1Ξ›æ÷ÿï/R,ÕØ¹}4 ÷Õ„9€½Á³ókѱP•rµ„¡¤"÷Q-di›V䆂®×y ¹ðÄèÏo8F½?î:ý¶Î¿©‰-zоì@´öiC§T©sùê"SS#LN Q*ט›[ai¥½¦çz”+ ÌŽ‰Àø1އ‹{?N¹Åo·Ò1©Õë 7;é&ú3¢5Eñ<×åÎG>Áøè@Ôœ;dç¡]¨šÆÜì ós+8¶“¨–ö‚ùʪ¶y?>€þav»ƒucMÕ‚c¾±jÝvì sqáª( nôOA¥X¾Î7¾ðïi6ÛärÉÍxc¯{Úuºé©ªîä„ÿî}ûØø¹° «Ñ€_•e¾›9zó1~æÿ%š‘¥mÚ±\%7(×õX?ñggžÅÃà Š=/pøˆå]Ñ-Fp]l˜š¼ƒ·½û=´Ú IæÍó¯¢yV/cáâiÖ®^¦:;‹cVPªE2ã[hƒ8í/>õ{¼üòŸÓ¶Zëã;ZŽçFÛa¹6—¦Ïsç8"ÚÛµƒ›ªG³ÕäöÝ÷òØ÷uh‚]7æêÕæÖÑt• —æøÃ?ú5nÚ÷(¾é®ÈýНKØ $ Næ¤]ò«~åf°Ní¶‰ëº|êçÿ­V‡Z½…ë¸lÛ2ÊÖÇèïË1>6ȶ­£dú ¬®U™_,²kÇ–åôä’©‰×T5*ò˜;}‰bùZpL Ö¬3œb­º†«8Ü~ìAvìÜ9´¾`à†Âda±Iad0rãmx’ùbáÄ…/ýég7L•èÛ&¶²oÛÁh_TUÃHe¨¸Gíòß,…\†áá~ú Ù®+¦©ÌϯQ.Õ¨ÖšÔmUéö4¤;5&œV:É}}y:ËË”j%Ö««ì™Ú‹® ‘¥kzLLÁµâ5P`§žGÞÊÖ©LÓJ„Òóù *Kë,œù*©jƒÜä¶h½\Ï‹ Hºë•§§ëÙlŠ DzÍ@¸w]ZUñÃåaŽ­ªª¾Û§øù³a88,IeúH©:S[é¬-°ÚI166½ E ª©ªâŸª‚Brnp(ÃÜ@¥çœÙ{ð6.;A«Y“‹¬ð·)¾«yä±÷ðÞý8¦‰ç9=¦ûNß4m_üÓë×b®ˆ‚騱†Ðj"´Þ”–Ë+ìêÛÅñ{o‹ÚÈôVö^ê9ÊJ»¾3rͪ¢(œ:}ÚÜ w=p '^¹LóJC30m“\*õqëº|*åf™=Û÷siú©Ä¶…7L×ó £pËÃ÷cÙ#ÃýdÒ‡íäâ×¾ÀìÂòùq~ù—~ƒ;n݃iÚd‚1`º¦b;n”?幩”í{|Î]œãäÜËÉfÓ• Þö&vláúÌ*m³Ã¹3×xäÑ;‚~qþþ{žÇÄøS“ø®ÇÜÂzäÀ¥Ó©  pxóÖ¢ÂpmöräÒzž‹‚B£Ý@UlöîÝ亹h)-róÂãbÛš®aÙç¿òE&n¾;Ö*†àõ7 ºx(<ÎÒz¢Ïó¸|í Üúp4UÃÐÒT ²Ù4¶íøù¢j·©±e;”JuÌ‹¯òÌ™?#¥§¹}û1†n}ÉñAjõV·G_$˜º¢< ›g'áÌ^Àrl²z6温 aŠÁ¾L©ÁI.?ù'4½‰ý{·²^¬b;Nb ê‹/’OHï¿…™3—Ùû¡Ä9¥¡[9—ŽÇÐð¨ßêgëÒWÎS¬.¡âÆÞœ©ØŽœÛþˆETP<%8®Ý…Žã`w‰7x©å ÌUËLÝtÏS±m§+Dƒó:î^ö®G÷MH× ö Ž •Êð¾ïûY~û?ý f»)[A  üM@UU>üñŸãÞû‰åtùß “þ5ÍϧZ[«2÷ÒY©­DΈk?áz]ݰpˆeZzô Ü}ïɳaræË«Üû®÷39>¸ÝïìÙ5¢(üîç¿ÅÒÙ/3¤Ô,EÛÒ;›Õõ\ª­*º÷‡p¬/\{¶{c ÄŸç¹{à<ôЃÔm¿Gœ¢ðͧ^%—.ø?¼}o¼ÿ&lÇÁÐu2cÃÌßFÓ¤câÓqQ55úP={ÚßgUÇu,*åŠï>¼™¶iQ(dX>Sác}Ôï姆-b,Z¦…Ã(ªÂøØ_úÌŸòØG߆®wü†ý uÝ-í¶_ˆpqù\°Ï6ª¢²V\etrMÕÑp¸óøm8ŽÍ‚õ‚ÊâÐñu‚‚Çu1öÞÊ-GwP.×£)j0 &$añNMg2¯)¶ŒoõŤ碫zP¹mc9n>¼™ùõH†ÂøégÏrýäñòÕXV‡\.ÏóÎs¼¡;îÄù\ƯvÜÈñ‹Ÿ'ZP½ÝRÛ´¬•f…sÓg¹iÏ-ÑyRj®0Ñ?…¢(\\¾€ã9ܱóN×A÷ N|M wßq€Z­¸:OþÎçØ6~‡?ò.t]ãs뮜8Ëð¸žG*è)h;N°ÆÝm³m'r;Ö8ŽEgë(åožÀª\DSü¿QÛiû½.<]Ó£ð¾¡éx¸àùâ/ÞÐÙ M·1OåL‡ô¾ƒŒ õEBÔu\ CDzìh6µíø‡ß‹ý¸@ gBLòÎü¿ÿßÿµ\t…¿u(‰¸– |—0Ð?ÀwߢvsÊtUCSuôÀ…ñèý6)u³çæ;l–caÚfôuÜá EVݬ³¶¾J^+p÷Ñ»"—.tä¶KÕ%²ƒôgúbßÓ£çÔTŽÝ¡mµP•Žc±R[¡Öª2Þ?m§9.+µUÞrìc\Ÿ‘õÆzB :®C»Ý¢^©sÇá;6´ÔX©­PiUù¾ÿ*­vë5ÏÇ»n¾›‡Ž¿… zZÏ&­ÊttN¨ªUÂZ®Åru™‹Kð<\:ÏC&›Î“>p ƒyNþùïQj–0íNPè ã÷º!Þõb‘ŽÙÁs<–ëËìÛ¶½Sû°]‹|ºà;yfWç_eÏèn&ú§P•0kÙò™~fÖ¯bÚfPt¡²ÞX§Ô(q`b¿ÿF ]c¦8ÃCþfÏýYtÎù+îëþͺžËXaŒþì@t<;¶IZÏ&gUÕ‚}ÔЃÊ`-=ˆgUi™ 2©®ëç:AaÊÈpjöDbrO|vwøúáyúàc?…‘Òý¾“›‹…N²ãbýëÀ“_û¼\x…¿]F‰,ðÝHµV¥Ý6Iëi é…t\*GZO‘Òýžl†æ»])=¸ ¹ž‡åXØ®ÝäÝžÐo$F›V³…íØ,—»!¾è†åW0ZŠÉþ)Æ‚›«¦êhÑÌÿ™”žŠZ]Œä‡Ù>¼ºÙ¸Á¯‚n×hvˆq£FÕ­F ˱©ÕkÁ¾†¯ë¿ö`n‘¡>MmþšªGë’12Ñ:¥‚5Kii2zÆoc37±Íår9W»›Oøêü)?gÒ(DB*,¡hу׾cç1ª­ †jD‚K ~ˆrØÒÁqÓa¯(*#C«ÓDQ2F:z”žFW ²FMÑ£9³áëjªÆru…–ÕŒŽ®jÁ÷zU¯Ûüzôåû"IQu@ÁAÇt}A£k:†žBWu­ƒõž˜âÞ½÷’ϸßäò£4´~ C§VoaÚè¸ÅÅ_xZ–M³ÙÄu\<Åc¢0A³Þ`¾8GÛjùùù-LïBW5&¶lØö\ºÏ·kY#KZO“ÖS´:MLì^{0;À‘©#¬^þ{w¾!X;=úøzÿ -ÅPnMÑ0T]5HëÙàˆ«f§NµU‚ôŽéŸw™TnÃöëZŠj³œh$‰ÉØsš®jäRyªgŸEš÷ßäìa?ñ¾‡ßÃÞ·É…W(ßi<ÏãÌù3‘ ‰ÿÓ¢»9\¹Ø#îJ…¡Å^· | §i360F­Ucny.ñZ¬¥…ª(\]»‚ew¢NèpE!®à5;ޏ}~o¼ºéWo†®ˆPCOñG¯üϨ²3ž—X)•ñ<JÇòúJWdÂk²’´žæ…¯½ÈêZÓjEÎh¸Ÿq¡Ÿáo©¡ ’­eYAPÁ£m¶±]‡¯œüsŽLaê–ǘ_9›Ø×PÀ…˜ë¹dS9ú2ÝÙ½¡øS%*X 2×uÑ ˶Qh4›ÑñVP#SUtÕ ¥ù¢ÐPýó¢Õ ÅŸm“’ÍzôØ_”z£¶i¡ˆªûï¶jšŽ®¥Ð4_fŒ,Y#ÇDÿ„¿¾èغßR¦uþÕ¨õO:ëáv†n·ã8dÃJeO B¨`wlþà›Ÿc­¾Ê¹k_çÙK_Ç´;”›¥n…tðŸ®éØN'x#cDÎðp~8pÌÔh]tUc®4KÖ©%þB1í¯½CñY#ã·£‰­qxš:-«s……ò<ùtšUM¬i¥Y¤ØX \@]ÓYª.$ÞÝèŸ/r3Ì•f˜?w…L&åO§‰Ï@Vˆ €ÔX…ð;Þÿ“ NÉÅW(ßi–V—X^YŠnúJÌyëšÒÓ‘ è%Ìù ÖáÍi}m=Ê S5…•ò*õææn]ÆÈRn–¢PiÔF&h_’ÒÓÑ ÕqmÖêkX¶…®jTZ\Ï¥c›XŽE.•Å´LÚV;Q¨R.—ƒé~õ®i›Ô›õh_Â}É37û-¾ò…giYÍ 7¶óØØ^Æ æËúB׋j8&N ^ûÈ®›Ø=¶÷ú«ÑÏÄŸß BÖñžpaOÄpìžíX¸®“hœÒS‰ãcšmT ¹–eÑétp/ÚþxH׋½v(dk¹¡ oâM¿“on<pƒ#ÝðQ£]ãÂÂ)<\²J7·P „•ëW†9s©Óë×(—.ƒÕam­ÌÌÚå˜V"+t=uU£ÕjaYš¦GÕäž­f›áÑq^™}%8'm²ý¬ÕW7UUKç˜?ÏsÉPkWk×éµ+òião*6_…t!æë~[U£ã˜|é•/²Z[a¶4C¥Ub¥¶Ì]¢éñêÜÜ0Cù‘Ä1Ó;^ ×sÉÙhbËÒüÓ¬­Wº³ª¸¶\ úvWSU²¹ïýȧIgrrñD ÂwšWÎŒDCo¯±ð_øX!(Œè-¸ˆç …7ýR±‰‡ÕÒ*†–âØîã\š¹´ésÒ2F†j«œx\Aܵp[Â×34ƒþŒ:¬´ª¤ô43«³\™¹Â«çOQkÔñ<…µŠ ¿¿`±¸Žm%§”´:-´˜s†¹]Ï£.°tík¤wÞÉ-oú`ô3NO¡Ë¦EAA%cd£›»¦kÑžÙ®C½Uãø®»™+^gµ¶´AX&]ÛØÄ%YŸÖëºùBÆKÌfn·}‘âáÑè4±, ³cÞ0-QÑíÙ¤µ ŽÓmú6‹=¿ÛNäbÆ{ÕÝPÖ+œ˜~ž3/ùuAµ.n$öBñëyJPÀ¹¢F†\*Ç\iޫ׾Båâ·"!ž;ñâ¤P¬ù¢ÙÅsCñåÛW«Ã–üŽÉõµiVª«Œ÷ù¹¦«µå(¯Òó{çàx÷Q òb/,_`¶4Ë|yŽ…Êùt]ã7ý;x- é¾èó…òöÏu]îo°Ÿ½7ÃŒ‘åÊ+ÿ“jµÉðØÍQñŠ[ŸÞÄùÞçó3™L”Céº.Ë«Ë,”fþÂÇ-îŠ*±‘®øT7êr¹LÛ4ñ\\*‡ªªX–EÛlQj–n(hÃ<Æ…ò<š¦ÑèÔ7ˆÑ¸ ÚL4¸î뻀•z…åêràrùýö|s29_8ª8§ë ªŠJ6•£Ú®1˜ cd"bê&ëCؾ$:=@¡e5™/ÎS«Ô©VÊœ<€ëyd ¶ëoDÔ¨7^Ô‡¯çXL l¡Úª±}h;ÅF‘]#»Ù>´•òì·UøG× Nν̕ÕKôeú˜èŸb¾<ÏÁmÙ9²€´žfê¶Çð¶ÝÌReŽfþa¡t=ßí'ÅlælÇ«<ùîiJ3¨´*”O½ÂøØ ‹®áýöÝK5;Aùô3Œ 04TˆÞ¸8rœ{ßð.¹ø ã‘FÐÂw¿,—8°û_>ù%êvƒ•Ú2o8ð—W.ПéO´zX­¯òìÉo±}rgp“ó(7ËdŒLt“­Õjþh7« ˜<ÌÕõˬTæ°m Eü@Ï´ ¿¦²Ú®°cd7¦ÝŽo²JP”¯©ÍNÏs±3(¦0Í6®í‡J=<ô”Ê£ŠBq–Õê28P7ëA._(ýý…>ÒÆÇ–e, ×^a,[ˆ*žCÇ4,–ð‚m {Pñ–ÖÎoš7»™óæá‘Õs¼|ñwí¿›áüHT˜Õ¶ZÔÍ:Ã/™Úv?ަsùåÏãzƒ¹! =•Iw×e½¾ê¯R”v‘lëâŸÏþ‡”–Š \]W* ¸K5†bב½XŽK¾¿€Z)ã¬/³ÐT,06:€e9ضÎ]‡X˜»J¹¸,`A@AøNÑl79sé o¹ý­Ü¾ãvnÛ~;Žk3Ñ?™­N“ç^àèÁ[£ßu\‡¾L? ³ÛèÕo×Òö»ƒQ÷ï¯xhºÎüÊBª öë52¤õ4v=zÜŸîỉŽgGN ›~жÚxž‡Õ±±m×qüÉÀÊůóôåo¢(Ð××G_®F»A³ÓÝ^MÕ*7º)çR9¾qá«Ì•fh˜õ 7ÒpÛ6 §eŒn«ŽT*…åø­Zâ•Àn¬QqWø)Ñ넹aÎV˜·çôÌ6öwƒ±hÝæÔ®ç¡âÏÐtšÍ&fÇä±[ã­·¾ÉþI²ƒ\Y½9XŽçðâôó”ÖÖÚºaÄß_žça[.Š¢fàzŽ®koȹ‹‹^/&îBQ>Ñ?ùºîdˆíØ~>hØÜ8X_Ó1±l‹ìÕrÛö›-ÇsD»âµ³i]Ê Ñ0üÀC?L6—faþ™×]Þmž[˜#«å8qîó+s‰ój ;€ª(äRyFvo'µ|‘£[naÏØ~2©Ü†ð¯ëùç‹®¥X©.~[Ûº‹]×5l¨íŸ_×W/‘J4Zfô{é·>p ÃÃýOæäÉ+Ñ9­jïúàO14yøg8p×°†F a(7„2»7謑¡Ú¬úÓ,<¢©Ýü*@¥õ] ŸÎã¸6 ³N¹UñÃn®K½\Ƕìî,\Õöå üax.­§q\Çsª]ÇÎqŠÕÒ††ðëÈ‹¹–®çRHç)6Öɧ §²×±òY›\š>Ï-Ûoö[‡¸6†ž¢e6#‘é·ôh$„g|[ÂÇ›ÁH/¿`bs÷/tJÁŸêâ‹?=ÂB˜v»ãÚÑ1Ï¥ LôOrnñʦû5”Âõ<úË‹\˜}þ†‚ýF¸~þŸ‘2üªuËda}žçÏ>ÇÖÁmŒäGØ>´dzY­.EE2iß—<9¸-Ñȃ¢Ñ š»Ç·%în6;M4Uc¤0õ2t=—s‹çxþêóìÞŽ·ÿ§nâêÊEf‹Óœ~î4ã#ýQ@%V’I§ÐvÀš™Æó<²™S;yûû~B.À‚@AøNreú ¥J)ºÉ‡óu—ʳ´VNÒ˜yŽÆÅçÈ”×éïÔ¹¾~}Ó›ÙP¿_‘èáa;9· !ÏóÐ4r­œ¸é…7¢ºYgº8ÞÑ}hªÎ¶¡í‰{]3ȧ ìÝÃZ} ÇqèêCÓ“sx=ÏEÑÓà˜ÁÄ’N"ìÚì4Ù=¶'ºiëºÆzyý†7â¸0L>î0”âêêeF‡öDyŽçàx~øòK§¾È?ý\º~=Û÷Ñ—`9¸QgÓY®Ï]žïôÂi²F–|º@'æ¶ÅÝ4×óhͯoÔ.'^ḊÚm-ãyfÇwÃj0aäé«OñüõçÙ:´…õêÍvÉ-S¸ŽCì%ž{óÞî†ö/ßN@µ^‹Â°*.º]åúm"ÁçyAE²KÇépeõ2 • éBÏ\è»ÍV32EÂE–Õòûñ)ºß"FÕÌ‘V²\½‚‚ÒÍ´ô¼Ä„^þmT›ÎÏ¿ÂÁíwm|¯W Ò¨5hYMÒz†\&ÏPß0Ù!2z–Ù¹Y†ò#dŒ }™Æú'£yÝÑbиWQÔÈ! ét|aÕn·Î À±ÇèØ&£…Q:òp‡i&Žƒª(›6žQ ‘o‡J½œ[^¬uIOµ±çyèªÆ‘©›ÈèÝöD¯Eïö8Žƒ¦ihš†åXTZUúÒ} ìb(7DµU¥/Óß­ˆö Þl`YVÔ”Úw%oÊ …Þöámœ˜y ì[¶¾îZ„ç_Çê1² å‡"§7$J‘Ig0;&ç¯Oô[)ŒÓ¶ZlÚ—ÔØŽ…ªj”k]ámÖ¹ºr•µúZ$þ†óÜ^ð{ù…La®a¸Ö‰‰7AŸEUQ©´*\úú·ãâ]Q@؇;} ×õßÐÕë-Þ}ï›ÉH“háoÒFøž£\«°{Çî(d6`îÞ<»=ý¾~^t÷b7?«caÙVk«‘s¿ضÍàÀ ýÙtU§ö[mäSy2F&z¾¨L®Õt¦×¯ã¸.¦Õñåë282ÄÁm¸mûí¤4š¢`iyÌÖjThaš~uçHß(ý™JÍbôao·¾|_Ô~£»ßÝÖ.½ynµvË+—Êq|×q¶ mãàä&ú&X­¯òàŸà¶Q­µøæóŸósøšÍHpÙ¶ÍÈÐ0}™~jíjÏÔˆ®ôQbÿW•mCÛØ6~€z«´Á•s½®³Zi•AF£ü¾ÇúZ1j s`ÏD%-øù_ÅÆ:5³ÆîÑÝœY8KÓjÒ—éZ†x‘ð·1¾­Nsézç.ûöhà®›îö VT ]ñX©Ì’1²hж¡åM­]¥îÃrý¹ÔaAOèÔÅ·Ãqí¨U€euh¶šX¶EÇ1ñ<ϯ¦UUÔÜéþQ¼VŒ‘IHOEQ(äòd39tÍ nViY­n£¢X+Ÿî›”žb©º„ˆ¦f§¹AÔ†¿ÔlšèŠäðyþœÝ¨× ŸËæ,®•×…þ ÅRvéõ« åGüµÃ_‡T0ÊíÊêUZV›Z»FÇêPmTi;&¹t>ý¨«:Ùào”Dë£ø›£¸Cëz+•yÞãcض»¡YPn¨·¼Niæ ™f‹Ný!SSì;þ8§O>™˜h#"ᯉ¶Ù¦Ë3<0y/Ý© NpcÓ5–ÕŒn¸Ñ¸µà&¦(J$ÇûÇ­WU f‘º £0oØsÌÐR¤ôTðÜ~Å¡®é\\¾Àj} ðgýš¶ßÜøÁòwl/C¹aTUãäÜ+\^¹ÄÞÁq¶ ïäúÚÕÈ9j·[lÚŠë9TƒQ]á¨1ÏõìÜà“„P\¨±–'~ÑQ³äF«„¦j¤õ zÿÌær$ÂcV7XŽM«Œ+s]Ö׊‘ª<ºÿhlÊŠÿ»~‘ŒÆha,på<³ƒ,×–Y­­ 9FÊØ´  ×óñÛ€–Ýá®›ïöcUǤX_%kø«EõûþÅ.ë5 é¾($ëºNàDûÇÊwF{ÇÛù+«i:­V“f§IÓlÒŸˆD’¢çP4|Jªf ?ßÇ–‰­((¤ ÕV)1¦/|ÓBâ¬!èÉ7ÈJm5jâ\n•6ˆü^ÓÞPÀNCñÇ­éº?Ù²-ªÍvƒ‘ÁQ4Mcµ¶ÌHa,&‚ Î/ž¦n6°›´ž"ŸÎñ¶[ßÅö‘í¸žpö“½ÿ”hëyÝ~”1qíçR_¹Ìȶ#‰).Q_AÏCÁZ_ä ¯þ ÝüNŒ}7“Ë÷Ó?0Â¥s/É…XøŽ#!`á{’SçNEÓ<6üQsƒÁo>„BÅvl\×A7üAõ†ntCˆ¸‰Þ‚Õz-rçܨºÔÃÐŒègJÍWV/seõ2C¹!F £€?«·ÉóÈÑGéÏ’Ö3´í6¯Ìžf¿êr-¼Ù:®i·i—/24r˜Ñá}TZ•ؤ’®s«* Vl^§ÓÁuÝMsóÁè¿°àÂòE¶mgÏèÖÍâ Ï¿,žçE3™ñüÐj6•c©º„Û“®PZOohÞî³}É««T+d2â¾›¢*螃×6ia©ñ-шD/jBþZÄ ˆ égÏmhô}#&¥j9}w£Ÿòóìò9¿²½T)riú"®ë’Kå£sIQ..Ÿ#—Ê‘O嘘d07D!]àå鸺v9"§î„oâ) z,¼¡eðyËj³xišLÆð¼ª$œT€l~’‡úÛî½ÇnUåè­÷sÇ=o‘‹°ðG—%¾i¶[œ»rŽ›Þ8Ý1Pn¬eÄ@v€ºYÇ´;þˆ¸X’¢¨¤Òf»C¥]Ų, ÃÀñÔ`’ƒmÛTÛ5FòFônËÒA^—åXšA_¦›¶ÜB.?®CSÉ’uª dýŠZÇõݼxÞ^¸­y«[Ý«a@Ïó(·*ÄÁôì4[Ƕl"N6öØ) “ÒSdÊ뜿þ-<ÏeçðÎÄÏÒÖVÏFB 쨪nÐÖEUUíf¢Í‹›cë·] .Hjx ·x†ì íÑ}0÷R¢]Žým†ëÍÅr‰ü`>p´‚â†N•lº@Ùj¡k©ÈÖTþ|êѱLœà„oŒzC¢ñ‘tŽë «S“,”ç^wûÒzŠõò:3‹3Üqô8}ý­ Ù˜î¨àyIg©Û5*õ —f.¡e¡Ö®PH÷3WšaÇðΨJx3ñydß[PGFèTþ …9|š Áú¯êvâŸ;à¹VþæsLLÐn[7¬OíÚEªÚ ¯CUŠÑ6=ü؇YYšföúy¹ "ᯛ3—β{Çr™lä¬tËÝwü…t¶µ†$t‡÷ÏsÉåó´Û&* ãýã”Z%_üከ4*Œä‡ÎŽ¢(˜v›J«ÌZ}{÷>Èbyµ±¹Å`{ é+µ•`ÛÜ ñtW|óâhªÎÁ‰œ_:nXŽÉXß«µÕ`[avf×u©7ër…×\›bcJ«ÂKÓ/a_{Ž”f0œÆõ\´@ ù.¤/¾RA%eZOÓê41RF0ÂZVgSÁ¹Qxz€ÿ½«AÀZmXáž=wG7Ôb½Èzu ÇJ>gÛ4ɤ3 ÇʉUg‡íÝÁ‰éìßË`v€Z³Ê`a !Vãâ’UÆß•°=Pæ˜ìŸâêÚ¾|拌ö2”bf}†ûöm‡F#‘Øû&esÐ?6FƒµÒû‡ö'\éJ»ÄZ}Û±-ŒÆœ7Jˆ®ùÅá›ð˜w[Ïl¬DŽ‹äåê2c}㚱鑜žcviÇuxéì‹?zGuÌçzJUÇö×ÚóßPr\ס\,³\]¢ÙiqlDZ¨ÇdïúØá›‘æ"ïÿáw1;¿ÎòJ gáæº½9]7~ÎÄ[À¨ªŠë8(ªŸf®·¢(hÅ5Tõ`ÂÔ4·¿ï'øÍÿëïÓé´åb,|G°ð=‹mÛœ¾p:ºaÄo¬JÌõȧ Q›•Þ±]žç’Éøâ¢Ô*qÓ–[6¼ŽeZTÛµ¨¹°ª(,V¸¶v••Ú*yGtsé öŽ© _Óqíhò†åøáÄÙÒ,wí¾‡Žmbhiú3ýÑ6ÏÍÍÑn·ét:Ô[õØ|ã¿ð{M³ÅÔÀ$‡'±|?£…±($¶#?„Úì4q=—´žBQT2™t4‘A *(-Ëú¶·É4‰ÍxúÒS¬ÖÖ(×hÕë8¸^§m¶6Iœ8L¥Zf¦8C£ÓŒÂŸ›½¾÷—W©W£ß±Ëo¼í9ìÛÏ£‡ßÌá©#¸žK­QãÜâYrí•H°Æ[Àx=ÇÌŽò»‚¬ÚðÃî—.\¢m¶¤Ü(ahzB(ºâSºYÛô$ûnÜÿ0åÁÛÄ1³¶^ŒD¦ã8¼tö%4WÛð¼fÝßþàOO× ªí–αV]eïè>î¹å£ŒôSn–6=Öà§sTZ%>ûßþŒm[†Éd6ŸÐ¡ijôæ-)ú•Vb»®U ‡¡àP¶û)–jÝñ~ÁßMÿÀ<ò~¹ "á;Á•é+”«•覯~íº)*©` ƒ²É —ÏEIîak‰8µjbµ¦­´*Ìg0´{FwãtªÌ—¦_ÓÑÉÙHðuG‡óJµ`ŒW‹§¯<…–ò+*Á¯ð]]]£Õ슠õR11A¢×űƒæÏÛ‡vb»ÇŠB¸ñ0 ëy\^½B6ÈU3‚„zMÓ’ólU…¥õå ¢Å} ¡÷íŒZkÔjLL²oÇn:r{wìÁ±“!Ò–ÕŽZ€¬7Љq¡Ø/5‹pØzg§´4»FöpxûaL»CÓ¬mpÛ¼Xõí ¡ …_¼v1zŽºY÷g{n$Àů†ç“ë9‘{×[mo2Î/~ì¶ mg­¾†í:L Lm*èuUãòÌ¥ oÈ^8ýß|éœ8{‚ŽeÒ2ýb"ßek¹MæªÓTÛULdÏØ~ZM“¥kÏÑî47„Çãù‰#‹ëy´ÖNñµ'OÓß—‹Ââ½ü½.àfºo³œ¿øße´¿¦Åz±tP­cn;þFr¹>¹ "á¯Ïóxåì+Q.SïÅ[ Ú¤„‚Èu`&…ÿ/º¡¥t?‘¾G´Ø¶ÍâÜ"«+k´­®ç±V_ãîÝ÷pÛŽã´¬6×V/'ÆŽmFؗСjâñ^U«UhY Z•r•r©œx®bq}ƒhèí ¶öˆ÷ÃKºî&n¥ß».™+æ—©4Zèµâ‚Û¶ÝâÐÍ ûv¿ïW¾z±µ2[-&û'¸÷è{ƒísiµZØŽca9ËÕ%ò©ÙÁDƒîpý,ÇâàÄ -ÅP~ˆZ½¶©Kj¤2Ý9È©tT úzT•˜SÖuåÏI¸ŠC¹aŒ  ½÷¼èuÝ:¶I³ÓˆöbS@Â5°,®L_A×t:Žå7× lׯr:((l @Âã¾Þ×v_§7 Àõµë~1É&"?¥¦˜^˜ÞÔIët:¬—×ùæKߤR«Ðl51í6©>ƒ¡áAv ïdçØ4ÍoÓhÕq]‡õÚjBÇ·ßoÔι¹¾LÛìɤáñnC÷ÍÅŸßQMˆÀ°t\vç«Ðn‘ɤÈfÓ£n¤8xô.¹ "á;ÁÂòËk+ÑÌܸ3s¦õº¦G9~@$³ÙL”LïŸ)ªÊÊ‚ß#pmyZ»Žç¹ æ†X(Ïq.p {Ý0?-î´xž? 6>9DMŒçRv¾1O¥VaueuÃþ–Ë•hŠÉkQÈp<熮$ÀJm…ýãû£mP·Ô_@ýÔâûÙëÔl&|o”çаpTßС‡(/ * fÛÜpo™-Æ £´¬£…Q4U‹„k\$„Ï[7ëšAǶÐ{Fð…d²y²¹~†G¦8xàŽ>Æ@ÿÐë;€õJ4e#tØÜMœ4Ó6Ù3º‡¾‘#Ñ›ƒ¸cÚì4©-~Rzš†ÙàÊÊ®¬^¡mµ¨7꛸WéïïG7 #¼®?J/—ÉFÏ¿Ùùq#2þ!\§‘ü0ùt޵úÆóOQTVVW7§^ÇáÔÅ“¼|îÏŸ|ž§Ÿ}†F§IÆÈáX §;O× ªÑ(¿sˆû2ýѶ©Áø¸ËO<¹€½`?Æ7Õ‰…{ãy€›EV–‹ ªVV˘f')Ñ8:±M.‚@AøNñÊ™W¢æ¬^TÕh'nx}™þ(djЦB×5lǦިãyKsKQ+˲X\ZÄ´Mê±!õ¡£Õ4ýœ³Z³N»câzÍf#pÍü›.•G æwû²müž›Ds5®/-ÞðƺR\ÝÄ íì°XYŒœ¹ÍÜŸf§É@6)|ÂálTÏó0MUýËÍk9LñŠT€õÚ?òãÿŽv£Å™…Ó8®C»µ1ß/œNIñE€zCTUTÿyÒétâ{áç­f\®×óؾ}££ŒŽNn*âÔ›u¿-kc…9€Áyg»§CÇñç:oÚ‰Md‰·¼)5ËìÛGÆŽõ³b?Y#é«'Y(ÎoúúÓóÓ(®BµT¥Õn¡kšª‘Mg£Ñožça¹V¢°Ã޽) …wRn̉T^c¤Þôüô_øo´Þ¬1·2å–†E4ž}}ùŽŸÓU=jüwøJ³<õôiòœß½S¢Pðf‡ÕõüԆʹ ¬Ÿ¿ÄüåYJ¥‹Wç)|šÊéç Ñ@ßµ—þ¾Ü¦Ïãy*i¹ "á;E¹Zfz~&ùÇôSƒ°kZO‘66^¬C—,“Ë ë®ëP\+b¶“¢«K«´¬vÔ30¼YvìívÇq0-“Z£æÏUšífbnZOE¿\qA£{:—.^¦R^½áþ‹Å(œëÆÇñ¾1®¯_g8?»Ù{ ÷ïÎ]÷Pj϶6Ñn¯ÃF­AÇÚXðZ›ÝpÃm\oyËMoÅ[[cýÊ×ÑTEQi·7VåFcá¬Ö¦Ï†¹MÛŒþYŽE£QO4÷Žo‡ªé4›5V–gùÂן°Ò7H¡Ðÿšç™çy¾ Kð y’cWk+¤2N'œ6?׳ɞÑÝ æF(5K‰0üDÿwì?Žêj7܆‹ç/Ò¨6¸|í2³Ë³ä2ùÈé GÀµ:É‘qTHç)5K¬7Š›ÎŽ±ìΦ«žÊüòü_êïtuy™t*ÛjªÆÿŸ½;²ì<ÏÃþœýœ»ß¾½/3ÓƒÙ0+A)Ф$’â"ÐŒ\©JRv9vòW*¥”-/IÅN*NR‰•ŠT.Û©Š-ËqÉ‘eZ¤"YÜE‚ €ÁÌ`ö™žÞ·»og_òÇ9÷ô½Ó=˜(êùUuÍ`ÐÝ·ïÒ÷>÷ý¾ï}ÛV+éå·ÿÄöAáoðuýåW±²^…¦)éý3øs°„»ÿë’76a„ÍK7P|ø$Ž>û8æŽ-àÐÂ$žÿøS¨<ñŒ=þ<&.Ä'„ï8m<¨: ‚€›WÏò ˜‰>H®\ˆ[—Üí—%é `dÿß`©XEd²7„ÙÝ,ÓBµ¶;Ò;nðõ~à#|šÛµá>E…çû°ì½½b†b@åO¡†Q×õpõò5øÞ»71n6›VÜî¬ôI‚„s«çp|êá‘J`Ólbº0ÎVzÙƒj¦–˜Éd2’ ïVß‚mÛ°+­d WZ£tßÖ^ÖšE<\…»¼uåLÕî66ÏŽÛ¶¬Úù„Iàê9½ô{z‡íÎ6Vê«X­¯`µ±Šíö6Â(LÃÃpÓlEÑ ª:,«›üìÍòù"N|ü¾*YAŒ4²®¤µ­6,ÏÆêÎ%ÜÞÈýÓ4›P$‹ÇqmûÒ¾ièµÜw ¡QÐl´pùÆeH’]üÖË#·áúfÿž?‡ªÄ :ý®-]E¶gïk)?¼þ*TUÃ_ÿòÛõeøYR0‘ŸÄ\iã¹qŒçÆqhl åyÌ–f`yVº„=pg¥ý^¢(‚¦Äm…~pö帢íÍ V eäq3ü÷¢Qºï…«Ì¦ÛÇ­ïÿ¥bž "øþ êŠä#þ»ç°lÕÝ&BH°m¶í¢ZkÃu=xžßÒ?ïzf[µMˆ¢$íaLßJO‰ßù&&›Tpz\-EQˆÝÆ^ÿÁˆ¢°WéùHf{'—áºÉž L‚ñê úC„aÇõÐíY°¯ŸÇ¿ûáÖÒ7ñꛯ>P%”è½ÆI DC|ßÇÅ«ïà™3Oïëw6xáÈi9ÔûtiR%~€Õ[k÷|B¢›¨+iϼÁ5AH^˜d ‚ïÁ=ˆ‚ˆŒ‘Aßì£Ýk#Ÿ+ÀP tí8èùÉ2ÖÆÚµÆ]×F³‰Ù©ÙôÅð PÛµÑ4›¨ukøÄ©O¢Tœƒm5q}ûJò9ñÄ;Où&„xž‡n'þYÛ›„œøðB|€¡çôQ³Â‘à …ÀÁÏ#‹V«˜M– ÿ®H |?8p~¯e[èö»ÈgóØîl#}”3el´6ã}cGªo²¨`s{ŸxìËȈòSEܾ½„\¾„n·‘îe¼3€šfAà'Ë•*²™ôk0ôz[龜‘Kì·ª7öUç†ß°ÜÙæÝxI¢¯_ÄÒÚò¹<òF“S(äóhÕZ˜/- œŸÃÃGNákoü?Éã<~ãÒwL芾o9ú êäA§Ò´/¥Æ}.ãêóheop¹½I”îëûfÔ,¶V^ÂÚÍoŒL~¹ó„ö࿯n\ʼnÙÀ½ªò`¿ð u‘ë;i•}ðsk²Š¢QD£Ú@«Óâ.1ý4Y^[ƱÅcÈeãqiñéÑ0žš(èy´“Y»¾ïcõÆê=÷Ý¥Á«Ö@×êa,7?Ðu=#…H²Œ¸‘s<Õ0Œd9)L+l~àÁ \4ml®o=ðõl4ûúÿ “Dy=‡ŽÝÅÏŸü8DQÂÅåW“ÍöBú‚ï‡y59Ò¬5G6Ö·;mŒåÆö½ø¾qõ5¶¶÷f󪪊ÇŽc}ã6¬;ÂbߊOžoc»øOþÆßÁ#fˆ`z¾çÂÞ¸™Þ¦‚ @ãJ¢ïû…²,õzÜ[êßØÚø±?¯¯\ÇÜä\|°B¹ûçå´ýã‡ÃÝ`à |Ûž•>¶Ãäñ&DÉD (D ’SÙV O¿ða\X;‡( ¡JbÒÚÇM³‹‚˜N ª¬¡ ç¡‹:Î_¾À'ZúÀIþ>o¢Q¦ebav!y ZO@MÖбãýlëKkè÷î¿êEDIÄde2™u*¦Ë¢ "B”üwl8O&ˆbZõ„¸‹Ù·pëú­é:zž‡…¹ù´×ÝzN†ªãù£/@–,Uo¦ò£¡ÿ¸3ø@º¤Ý±»X[^ ƪ®bj|jßeåslµ·qs÷:.o\„®h8}øyÔ;#—YΔ±\[Á‰ÉÇÐïmÆSF€­êZ̓—`Ã0ÄNuš¤Â È‚‚‚žG×éÂöÔuX] cÅY¨’Š'{Ž€¯~õ_âêåwзº0Í.l»½ãñm¸²·4‘e¾ç¢ZÛÁÎÎ:Âdɹ×ëì !§:ïùLNpKb|‚u§»W†“Ї¨(9‰.Òð- "‚(Œ÷?"–ÕÇõë—°º¾‚V»ŽB¡ UÕ I$)>¡q@›šœƒiöÉdá8öÕÁ¥›—ðÐ3Ÿ AdÈ^ˆ›ÒûD€C1 ÉjúX˜®!lËÆÕWìßMǵ±ÛØÅôÄ $]Ü#DȨ™ôÏèm?^‡ÿÌiyìt¶ܱ§tøçOd#‚,ÊX¯®áÌ©_D£½’Þƒç?YŽ®êŠC5Ór¸pù"ê­:Ÿd‰èƒpìØ1Ø75" ?ý²™,r¹l¼ÿ'}qÙ d^àbcmÍZóÁ_ÄzVG.“¼4¥/QògzöúÖ z±‰IÅÅt-\yç  ü‘o#›A±PL«wÃ'ÝÀE)SF³_GµWÝ }É‹â^ŠÒ F!DQ‚®çÐh7°¾²¶ï8—ËÁБ×d E£ˆr¦˳PíÔQ·v‘uÌ—Ò¹´ƒÛd\ÕàødQŽ+gQ€¥•%˜ýƒƒøàzÕšu¬n®aym·Wo£¶]C«ÚB¿ÝGˆZ˜ÅÖö&¬­ôÝ¢$ˆI‹I”Ò×qÓhY}t{m¸n¦ # I’ Ë TU…›ô#t=| bRý“Eb8âö;S#¡PHöªI¢W‡E %9¹+‰ƒJ“¶¶·Ðl5,Û‚$IÐõ Š…¦¦çøªµm¨ŠŠÅÅ“(Ëh6k‚`ßIUÛêcéúÛX<þ$DQB¿ÛÇúî;CK±q¸Vd59•œœ Ãd E’¡Ê*VVVQo¾7ÁÇr,ÔÚ5DQ„b¡˜†¯Áã±’­Üå„t´/ŒË’‚F¿¾/ì ¾W˜^W!íþÙ-Ÿ‘WsÛâƒK~ò»šl)¨²Š¬š…Ýsðæ;oò ˜~*û~#ˆ~ÆMOOããÿ8¾úÕ¯Ž@]×l#B÷OÓtLŒÏ@LÚ¿ô{Ô»ô=dYÁ“O>‡å囨V·Þ·Ÿ]E<|ê ,/_‹—ŒÇB©8†ÅÅ“X[[B&“ƒ,+° ÛÛëiÃñƒdŒÌ^8޾TŽG£ÌÁOݦiÂõÜûþYgfpäðq¼úÃïÜõsŽŸzÏ}ìEÈŠs¯ÿ.,Ï‚€8Œwël®mAQŒWÆÓÆß¾ï# Ãû:‘ü^úØ Ãâô‘Þìµ~,gÔýú®9rR<­§­Š‚ô{Øž]1°Z_ÁGŽ}«åt¿p<’/E§H tEGY/ã›/}^›OôS{é/I’ð…/|µZ- “““8zô(J¥2™ ¾ò•¯üT_Q”pæ±g ë66WaY}´ÛMx¼è«ªŠ|®˜þw½ñ`›ð+•IÔëïàEE>_D.[€¢jh5kh¶j$Ç:F³v׿ÎwÒu§NžA„éÒå»õfüqUðé_þ vvvpøÈ,,Å?øçÇb•LOÍ¡VÛÁêÚ-ˆ¢„‰‰iÌÏÁîî&lçàʳi™tˆãGeòeèF‹GNÀ¶ß=¤Ý¸ú4=ƒ…#@使äaˆÚn\=L»ù åsyÌOÌþj@.zNïÀ©%a4ÜPL¿Ît͸ñ·QH?op@DDF¦)’‚ŒšÅõ¥ë ÄHôA9~ü8EÁŸþ韢T*áĉ€ÕÕU¼þúëû:öÿ$«M'N<†G~­v[ÛkX^¾žî«z×P6>B¡„Z}²ïåZXXÄîî6Z­¸Énܲ"Ä¡…‡pìØÃ¨T&aY}¼~öû0Œ,L³‡F£Q!I2‚;NÏNNÎàùç?©ÉY¼òÃï¢Ù¨Å³}ã¿ñ²£$A’â2½níN ííµä6âÞ¶‰±ò8zýNºÌ)¾Ëˆ0Q’°[Ý‚®xâñgÑ=z­v»»[èu;Ð |Ï…¢¨PT ²,C@¼Ç¬Ûm£Õn@ã–:÷sy’$c·ZEe|—/]Æ¥‹7ËöUÚâÛ4îg¸×$>‰:˜1üO<ñaœ<ù$Y‚ëöQ­Õ°³³b¡Œ¹ùE4ê»h¶jI˲úéRoº¿NîAÉ^,– ÀÄÄ4:Â0@î]æàòn^=‹¥ëoŇ>FV‡(IPeª¬ß÷cïöL‚SryaüØmQTU…šÌÌÞèF'šdÔ:É‘;+ém|~ìçÜhmb¾<ŸV—j{ûoäÔïðe«²ER/Â¥—ùL €DEQðÔSOáµ×^Ñ#GÏç±¹¹‰ÍÍÍŸh•é ðwèÐC˜Ÿ[D«ÝÄõñÐчaèvw·Ò¡ƒ×ªÁ‹» %‡ÅööÌ~<%¢Ûk#æðð©30Í>V×n#ŠBLŒOA¬¬ÜD¡PB6›Ç—^ü+ØÚZÁÍ›Wqæ±g±të*fæÐi·ÐhÔ é:ž|üYœ9ó <ÏÇÊê-øž›Lôˆ›áñiOǵø>|ß—ÖD¹\®ë¤M’=×ÅÄÄ Q„"+e‚(¤Ë‡qUeÿmäù>n-]CøÈY<þ؇†zf†nÀ´úè÷ºè›]X–Y–Q(–aZ}(ŠUÕ¡(*dI¾ëåMMMáÓ¿ü+$üÁüúf|{–Ç&†ÒJ¼™?âëé¹\ÏMûB˜"+%)= [*•pøðaH2 +þðãªr»Ó„iõ0?wš®Ã²L]<…k×Ï#ŠY–!I{'hƒ0€ï{?Ýw'I2TU‹¯Ÿ¬Ä{‡®ãðíYÈñÔSB½ÖD»W‰;íVz]5M‡¡gEÆÊãÉutá^º'P–(²EÕ ÈJ<5dx£;n¯»~,Gˆñmêz.\׆ç¹ð}!½ž?êïUßêãêöU©–4l^ú ÿ¢„¦ÙLOþÞYýì»®ª€AWö&ó“è;=ìtwÓ€éÝñ&RW ¼ñæïÛ›K"@¢;,..bjj ÛÛÛèõzxûí·á8Î]*C²Ù,r¹½VÛÛÛïÉ“x6›Ç‘Ã'ÐëµqóÖeèz¾ïabbŠ¢Â²Ì½ˆƒ þ¢Q11>MÓÑïõ‘ËÒ‘bQ¡ZÝÁÄä4>ùÉ_ÁÆú Z­V×–Ðïw±tû¦§çñKŸúUH’ŒjunÅ| ¹l³3 ˜šœÁøø$AÄöÎ^ûáKéR¥ªjw¼ ÇQEQübî:0ÍL³Çu€(‚¬ª(ŠÃº‘,Éiµ,D÷q{*ŠŠ\¾ˆz½ Ïuá:qÀ ‚ ¾‡0 P(”‘1²Ð rÙôÌSpœögßG­¾Ïs¡ëFz]£(‚ë{(ŠE ÙL–Ð\‚°×ÓÐ020Œl–~a"’<¼sõ¶§¶PÊ•ñøü™‘JÞ ¤i²–Ù80üÝYTÿ`¾<ŸîŒ¢Kµ%¨ÉtžA/ÉAx—D åLjÛ?Bók"@¢÷Àää$¾üå/c}}¯¾úêÈá|>b±ˆb±ˆl6‹l6 Y–aY,ËJ+µZ-mÚünaÅ»Çü±±IÀõ— KRú5¥b…BÕêÎÞÉOI†¢(ñ)KUÅ¡…Ãh·Ûç#¸n\‰ò“WÜ<Ü^º‰ ðÑé´!Ir:í¡^¯âÕ×¾‹n·ƒl.Œ‘C.¿ð粄aˆ›K7Ðn5Ðj5‘ɿɿîRm‰O·‚@†°mN Íf ²m&&€iš˜ššC.W€$ÉÉ‹uüÀǽΡår¨ª]Ï ›ÍxyŽë “É¢XC6›ÇØØDzøbpyžç%•»¹\¢ bm->¥\(”î*"ø¾‡?«ñÒv„„$lË011…0 °¹¹Žn·¼ü]LLLbs³Š™™´ÛqOı±qr%´:M45 %(Š‚ ”`è²Ù<Â0‚ëÚ0Í^Zm ª¢"›Í£\G¡P†®e%ÕQ„\>‹çŸû0N=|¹\›U\<ÿªÕmär…¯c³Qƒ—+`ñÈ ll­¢Ûí Ù¬BâeQMÕ`Yä²IèÔôxéý`RITˆb\)õ<½~JÒã%v?j1^R<òÈøÝÆ¢l çVÏáÉCOîû\UV±ÑjÞuïßÞ¸ÂhßçXž MÖà‡½:Æóãé!‘Á×K¢ ]Ñ¡ *Oý ÑAUU;v èt:øÚ×¾Y–qôèQ”Ëe‹Eض^¯‡^¯‡jµŠ^¯7üîÆ02p;ý¼B¾„¿ükßyëë·aÛV<ò+ Òe9Q0?wkkKéòæßû{í¯ý•÷üºw:]<þø3p]'éÍloo`~no{í'r{ÿοø=üãüO w[†žÁ‘#ákô{?ÑËëv[ñ¾Êã X,âßüþÿý¹¼ßüG¿…ô›¿‰( !JqŬ\Çßü›¿Ž_ûË¿ øÒ‹ÿ)LÓ‚eÙ¸rå‚ Ä©“£ßë@”$z–mÂÈä`ä edŒ "šjà±3ãðá9<ûá'^üÒ_ŽCgRE-—Æñ¿ñßà/}ùó÷õ3ñÅOÜ÷õëv{øÌ/¿C7P­n!¨ªþ{Œöû&>óé¿”VêGx?f¦§qòÔ)œ:öHå È77ñòµo¡Þo ’Kÿ4Ù@×nT‡÷ÿ‰#{÷7ß.gÊñÂÞÆÐwMøÉA! "4YE%[Áùw.ÄÕp"@¢÷O>ŸÇ©S§`ÛvrH ‹ãÇCEt»]lllàâÅ‹Võžzê)\¾|ù][ OQeŸùô¯AQUhšŽR)^öó}Ýn;]ÖšŸ_D¯×ÅÖöYA…xçKøÝßý=”Kxž‹(Š’ÊUQ’ ©:4MÇ¡ÃóX\œ…m»8ûúE8Ž 'Ù?5ØÃEa²/ÏC­V‹Ãg¦‡ Â0D³ÙÄ¿øçÿ ª¦¥{×áÁÆ‚KIåRU4(Š‚?÷ CƒadËã±f¾L67R]»xñ:vwêð|®ëÀOf¿kÐ,Wïzy¶e!È(–ö–\oÝZÃêÊ<Ï…ãÄód‡'Sè†ǶG*8â(B†ð|¾çâ/¿’V$ º‘A>_„aì5.—Ç¡i&¶·×Ñé¶Q›€®ÈYtº-ÈŠŠ’n@Q4z ‡æñøãâÑGOâÐáYT*呟¡26/‘&á1Ÿ/@×3ÉcÐÁÛç®À0tD¡È1»†!ü ®|Àîní.×qô1³µ½UU159‡v7î'8xŒ*J¼SĽ}÷ADÈr²wQÕpèÐ,Ž;AP(”ÐëµÑé¶ï8LsŸµEAÀÇžùÆrãPímÈí"@ñü©Ï⭛߆xØlo¡’­ `”°ÝÙ|×Ç|x—©+{½þø¾k&Ëî{c %QBNËÁìY¸¾|OÄÄHô~:zô(}ôQœ;w²,ãÅ_Äùó籺ºŠZ­ö®‡>&&& ËrúÂy?Êåq”ÇÆ±½µŽï¿ôE2™ =ƒV»±wh@–ÑlÖày.DA„ë:ø÷_ùC|ãëßÆØØ&'§aÛTU§ !Æ+S¨T¦ðåÿè³X\œü‡?y Æ.jµm´;MØv¼¤Vð`Û{{ÇüÀK¦RˆÂx@ýoþæo!›ì“ÓT-=wÿ4UG¾PB¹TA¡PÆsÏ?‘T\uF¶c"‚x›žM¿îò;·ðò˯£Ùª¡^ßMçç¾›©ÉixžEQQ›@©8†çž‹/OQ´½Ëóã*Ìp ¼½´‰?ùãï Ñ¬¢^ßA¯×Mï Èåò(ŠØÜ\¿k8ò}®çÀ²úè÷{ð\79ô"AS5d³yhÚÞþÁɉ´Ûm B2uC…ïû(—Ç¡Y¨Š†§ž~=tÏ}¼T&“K÷d ‚€—pFë«èvZpÜû¯¢ ïß´,½~®ë ÕªCQUÌÎ àëú-|ï{¯ “ÉASõtùÿAÞ0d3y”Ç&P,”ñK¿üÑ4f29héR¶ôÀ¿ëG®ê0ÝL·˜õ4¼Í?„c§>¢]ÅÙÛgqcã:~ùñOìë;øôïÞ½P8zÈc§¾…‰ü8œä½$Jˆ¢Y5ƒ¼–Ç×øM> Ñû¥T*áôéÓ°m7oÞÄââ"&''Ñn·ñÇüÇÃ'NœÀ‘#G Š"~øÃ¢Ñh¾ô¥/á«_ý*Μ9ƒ .Üód°$I(—'ÒÞu¾çâßúJzP¤ßï¢ßïŽ|Íúúí¤mˆ?ðàºvZYp]­vãã“е '®\º®QÜ'$•EÓê£Ûë ÕªÃ´â>nƒV%^²œ–V½Â²¤$ñã.²ïÉ’Ó}Yá¾–#ïzý“}€qµRH*¡rÜ¢EV!Àƒªjд½$br‚4 㪓ëÚw½eY†ª¨0Œ,¨]O¬jº‘VŸE¦êP ¾àA–UhwXq=ý~ívNÞPl¶ê˜žœ( ¨Ðï0 Ãtÿ ç¹°l®çŒT~5Í€ªª{uj²¬#“ÉBea€ùùÙ¡*ß*•ÒÈåÔë-¬®làw®á­·Îcii ív­V ¦Ùƒç9Éý‡ÀÁø¾x²JÛÛ[é‹÷B<ºÍÄÊêMÌÎÂâ‘èö:ÉžT5Ý8x¼ÜÏcFHwƒÓÙÉ¿&ýeH?BõN?½¯ÅËÀFí¦'F[ŸÀg>üŸC´wñ­+ß@ÏUP4JööüÝü<„>Ì~¦kî…C„Pe y½€•µ54; >! ÑûarrLJmÛ˜››ÃÊÊ Þyç|éK_ÂÙ³gáû>æææpìØ1\¿÷Ü[\\D£Ñ@¡P@«ÕÂñãÇQ«ÕP­Þ»aòäÄ,DQD³Yƒ¦êXY½…n÷Þ^/˜qå%>hàù,I†Øm¡V‹›éV*S8yü¢áWgd2ŠÅ"Úí:*L«—~ïA¸ò/=ø Šñ’¢(ñ)Òl…|)­èˆ’˜¶æ’þP¯¶ý§u#ìõr»óº æÂJ’”N„fYŠÇ©´„(@&“G¡PH*ŠZú}§§çÍåQ,Œ¥§£ã¾Éø±¡ †A\ÙJ‚r«Ý€çîÉjÔw°¸x½^;×6Rù aÒ Æóà^Z©ª¢AVö`.[€"˜˜* \Îàô#G17·þñÚÚÞ8{·n-ã­7ÏÃq­´rÛï÷Ð7»è÷:è›=„AUÕâ¶,’’Þ¦‚X–½w½ðdî½›(JèvÛp< G€(>›® ¤eŒ?~’ƒ?>^¢ˆâÓºÃa* BàÞx ›žšÂøÐ)ë;ß DQˆÝÚU+§á zÝDQˆõµe`!nåRÐ #•ÀƒB_<Y€ã»ˆ¢[í-ŒONa»½×u K2ÆU3C¯_xOÈÄHô~8~ü8yä4›MX–…o~ó›°mcccèt:¸téRR™ÂÖÖ®_¿Ž£G¦ûÿ2™ |ßÇøø8^{íÞOÞåò8 #‹•Õ‚¯ýÞ}µ4&Q"BxžÇÒ*Ú Üôz]øž‡éé9LOõÒjb†X[»ííu¬o® Ùª¥ÿoïE4jæAȲ MÕ‘ÍP*UP›D>_‚®éÄ ßC£ç»ð‡þôAÒï/ @A\³Ìôr]×m›ñ2«€~Q›€ªihÔk# #‹ÛË7191‹0Ø›`©ªÊÁtç¹èuÛhµëhµêh6k#¼±±IØŽ…f³†‰ñÔjÛØÚ^Û\FÂm<¥dp ¢0R}ûø'žÄäd …bväû´Z]¬¯ïàÊ•›¸ðö%¬¬¬$} M˜f¶m}XÝ^–Õ+Sþ^<1L»¶2ú1K€Ä¸Zgd²ð\QÌÏB!_„m;°í¸ÏÞc%®’Bò UOé)eÏsa;V£(‚eõ“Þ‘Þú‰Gž¸Ë?Úû¯]¿Œ0Š05ù(>?yçÇ^ÁNg¦k¡ F&… W‡ÃàV{ m³±\Ÿ{üE„rýît%ƒ0 Ðì×`{6~øækwÝSJÄHô+•J¸xñ"–——G–}ßÇææ&ºÝ½€´¹¹‰©©)ŒãÚµkI%)^–¼víÚ=÷þ©ªŽRq ív#½¬ÚÐç+ñ×ßmµ¹Ýi P('ýööþÝuÝx ¸Û‚ë:V®†‰¢UÕËqäÈCøw_ù—?‘ûÁqâÖ%¶mBQ´¤yñ^En°dšÉäÍæ“¼·°X(c·Ï•U”½p§ëd2¹xÏ¢¦UäóE4µáv¨‚W¨|/¯ªïT5ª¢baá!¬¬Ü@ßì¡Ûkcccù¾BH†icé;';¾7ЬºÛÂͨî¶põZ\!îtšèvÛ0­>z½.úýNÜ ÏêöLØŽA1žÍa¼2¾™I*§JÒðº”.9kš‚¿ýwÿÊ{vÿ NŽË~¼Ä›ÍäP*Vðë¿þ_á‹¿úé÷üñEQ‚½¤ºv¿*• Æ ãwù¾áHï?ER®.¿AQ4JP¤ø0ËåÍË8={=§MÖ⾛ɒ0÷,¼U]ÂGŽ}…YDQWÎAƒ‡óëoˆ+‰Y5ƒË+—±²¹Â'db$z¿œ={öÀ_XXÀîînº$ÕëõpâÄ ˆ¢ˆ .Ä›õt"ÈýÈç‹èõ»¨7vß·ëWŸ€®ïmü÷.æÉÙL¥âØ]›‡KïÜÞ÷ïA®ƒÁ(´Ñi a/g;®W_} ý~7Þ¿˜4‰Þdÿ…/~_øâGß³ÛÅu”Kelok#‡;ÒëŽxÆìì$YBuw Ý^N ¶mBÓ ôû]Ôê;?F±l¯z{gð»ôÎm8Ž7RAL«ŠwÍÁ˜=A0>>…~¿ƒl&À÷0^™B.[@e|"}0¸Ïο}#Y:îÁqì‘=Ž÷Â89žœD×t…| †‘=ðk×ÖvQÝmí Çñã$Hö¤†IŸÊxtÞ`K繨ÕjèöÚ°m3>\óMÏœ>sà¾Çáêß` W%ÔzÕô͈éöÓÇå'N}o®¾ñÜ8¼ÀƒåYÈiqÿ˶Ն$Jøü¿ (¬ï^ÂvgŽï Œ"aMV¡J òj»«U> ÑME>|ßýîwÓ»uëêõzzðãGQ,”¡(*ªÕ{¾—$)¥¥&.Ôäà„ UÕ±±q;=Á{7…B²¼7A#Šâ&ÄQÅûé¤{ÿ‹‚YQâv$wiî¬i žz:ž|ée8Ž›?ðà:N:ºkp°dÐ$¹oöÐjÕP­nÃv,øž··ohQöÆuTwë°íxÙÓóÜ´Òòn9Þ»7"6ðÄ“' i Â0D­VE©X†m[D㕽Ñd¥RÙlkë·±»»‰V«/ Ošªc·º‰É‰YK˜f¾ïC%d²9¸ŽV«qà,àx>îÞýÝÑÌzb²„‰ÉžÿÈ#¨î¶°»ÛBµZÇ•+7qíZ'½ÿ3FxTUK¦„øˆ>é÷ÚØ­nÁ÷]Tkñí„453r›}çÛ¯£Ù¬¡ZÛŽ›b;ÖUàî<<Ø“'ŠRÜ€ÛÈŒr}ƒ5‰……ITw[X[‹ß½öê„QOmñœd[ |xÞ^õº^ß…c[pÒñÑ¿?2N:ƒb±Œ×/¡šTÚ …æ*³w ´#IxéÉ_ñŽùÐ;Ý<}è¬5W±Û¯"l¶¶°8~Ï}æø"¤ö.Þºõ]C•ÁA°Y-‡‹WßA?9ŒEÄHôš˜˜ÀöööÈÔ0 ¬ð­vããÓ8|èzýn|²4™þQ*UË %³h! Ý5ØSç8z=/žÏ›Éß5FQI”066Û¶‡®G”ÌL ‘Ï¡(*.]nÞ«LI”ÒÙµösé^µcÇæÒ¿?òè‘ôs~ù3@§ÝÇõëkÃ/ÿàºÝ^Þ’¥ÐÁÞA×uâ=`¾÷¡Kúç \8 ¯¼rú.ªµ-ôz]]7’ž‹/¿IäJe •Ê$âxRôÑëuF¦¦ç kúÈr¸iZp\ºžA©T‰[ïÜ1©Åqld³9T*é”EV’SØâ³€%qoZ„‡*Wo½y “(³Ð4% ƒÀ|üž†eÙ¨Õš¸rù&n--ãÖ%lmíÂÈdàº6z½.šÍÊå (ªŽ^¯ï ”dòå8€ U}èp@UñÇ(kBL3ÃS?ª»-\½ºŠR)ÃÐÒåî½ëˆôMÄÍh6;h6Úxë­Ëp]®+ÀKf{nüfb0[9HúUŒOáCÏ| ý~¶cãÅÿ3üÉø}¬¯/ã‰GŸØWýEO?÷!\¿r ½NžïCÈ¢‚jo÷À¾ƒ½›í ä´ÊJðNzdØË¯c©µð‚¸Рà`é×·}\¾u‰OºÄHôÓ`gg;;;ïù÷m4ªh6kÐu…BÓSóØÙÝ„ëÚ(Êètš¨Ù;ð<çÝ—´¢ÅÒи3¸ÎÀ¶MLNÎBW X–‰õõ•´õGE°l Žã ZÛ†cß»âÏ6ÎAÓ (òÞ §e98{öRrò´ ?ðñ OãÈ‘ø…ýégNÇ—bÏ|èàÙÇÿ¶²²…µÕ-4[-ü»?ø£´L˜ôô|7=$2ÐïwШï¢Þˆ?ú½.‚0À¡…£0Ín:{øNºi Ã4ˆ :qܸR§( JÅ22™ìP( ër¹"JÅ1H¢tàR1¸C‡) …DAÂØØÄ³€¿xéÛ‚;Ô{ï­7®ã»ßyN³³c˜™ÀøøÍ`aa†¡ca!þ;/‡×kM¬¬nbùö*67·qöì›i‹0` f²¤&;Ho7Y: £ð=¬GQßÃïàz_8žçbww'í9ø…/~¢ áØ±ÌÌÆØ8Æ£_úôs€µµìîÔðÇüm´[ „a„?ûÑä÷ª†«W/ ŒBDa„Ó§ŸÀíÛ×qáâYˆ¢×±ñ+Ÿù5´ZuÌNN#p]´“¥{Ã00xÏ~äY”Êe¼ü½—àu{~èÁõ«Ãr˳FþßåÕ×ã7ÉÞÄ0™õ;h#‰RzŠø›/}ëG:ÅLÄHôçL|zÑ„e™˜›;MÓàº6VWoÞ÷÷0­*•ɸÁqy®ë ›ÉãäÉGqãæe4µxY0 059—V£(‚ÙïÆû¦<íÎÁÕ¿©©9F#‹l6‡l®€©Éé‘ »Õ-ܼy ÝnÝ^¾ïASe\ºt7n\‹O¼*>÷ù_D>ŸÃ¡Ãs8yrpøð Ž›þóñ¸±¿÷wÿ~ÿ÷H‚ƒm›èööZã´Û ìV7ÑhVѨWÑ7»é²`!_D£Q=° ¨kFZõô“?À¶-ôû]ØŽ ËŠèXe|ä~’%#‹ba,›Ÿ¨½{`Ê9(’ YQœ~v«[¨V·àyrÙ9™,ÃÞÉ02˜Y@¯×E½QÅÊê- eÔkU=z,ý¼ZmË+7Ðé6Ñïuáù.Êå2J¥qt: ÔU¨ŠŠöÏV’“¹4UC±TÄ¿øi‚€ŸÿøsÈdâI33ÓqÁ0€ëÚiæf³†­íµ¸'_«Ë2†*fg!Ÿ/ÂqLloÞžªªÃq¸ˆm¥×Ù´âö8ã•Itº-˜fo¤ùö/þÒ øÅ_zá=»¯³€'B…p Ýn+mÄ Ä;·¶7ÓŸ' C(ŠUUQ­iX^^‚ªÆÐ0²˜žžÂ?‚é™)<üð1ŒUŠ0 GÆÑ£‡ñÛÿç?绢(! }¸IàÔu ÿóÿúëïÙõœö“=s¾ï¡T*#Jª^aÂ4»X[_ÆæÖjŠ1ѧBQã&à››+¸pá\<úMQQÈðå_û<{ìaLLŒAÓÔ¤ÒšÃÿø?ü·ø[ë×ÑjuÐétñG_û*¾òïÿ-VVn&§ß£ti¾ßïáßúž{æi|öó/bb¢]Wqö‡oàæµ›D  Ñ_DÅâ”míFÇ Ôë»hµê鲤  ×ë —+ Ñ¨Áó=˜f‚(âþOÿ þ÷ÿíÿˆ÷½õã&ÁŽcXɲm 7o]Å采¦ëqÿ;×A¯ßÁòòþõ¿þ·¯¼ò¬oÜF?iCâûVVnÁu=ôzmlm®BQÕ¤Ù±UÑ ªª5¿õ[·!Š"~û·ÿiZ!ëtšñ²¬cÃóâæÒËË>ž|ây¢ǶÐëwÐï÷Òþoƒ0·[ÝŠ—½µÌ¾¶6qÕ%®L¹®ƒŸûÈ'!JÇFel¶c"›Íacc kk+øwðGP5=nœ4¬’$!cdÑj7ï»Ò{Ð,à0 à{L³V»·Þ:ÏuE._½€^·ïÝsâ°ª(j:;9ž‡«BS ?v õzßùÎKÐuºn@YœÃøx ª&Ãu= e„aI–à8Ο¿ï•åä@P|ñþÐ$¤(ÉÌ^Dp®{ð›ƒN‡A4ŸV±½½?ûÞ÷âJ§ë¡ZÝB«]G1_Är2ëv°\­®güT5¾¾õº†öOÿ9*ÉòX …‚ŽO}êçqüø1äóòù,¢h 'Nü×ø/þË¿Ž[7oãÊÕËøÎw¾ùùìîîàìÙ¸Gç“Ï>‰ÓB«ÙÆ•K×ñgßø.ÚíŠå™Ç£OžÁⱇà…BPdŠ¢âÜoÜñ˜G~†ƒ xð“ƒ#~à%ŸëA%芉Ü8^~ãÕ>uMôÓb¯£*PIËbrr¦Ù‹C,§§4S0Êåq¬­/¡Ói½'—Y.ÇMš—n_ƒ$ÉÐ4š¦CÓt(r|òÕq¬xÔ›kÃó¼»ÎÓ-—++O`eõt=ÃH>ôLÈ’àfY&Ç‚çy˜ŸÂ“O<DZqsé*4M‹_à%’Ÿ~¯{”Îö½x¬i™0Í^àâV"Š¢BSu@à{.ÇNöîYð}‚ Â02¨T¦ÐëµGú+Ä#Èâ±oñma@ø¾\.‡Ž>Œry ý~««K$Ùlår…Bõz ½^²,ajj««Ë÷÷Ï6û]8I@-JÈJÈ$mRlÛ‚iõ“Ût¯Áñ _._H[ãÌÏ,+ÉþŽÐ$JRtM«N§ËŠg&˲ÃÈ X‹iF:“w¯õJbD…B ÅâdIŠO·n®ï ×wÎîöÚpQbñèI´[Ítt`6“ÇôÔlÇB»ÝÀ¥KoÁõ<ˆ¢0’e9îY˜¼aÈd²˜ž^@&“A§ÓB@ÓtìînÁ²ú§>‰§Ÿ~ ýèGqêÔ)ŒW ( ‚ ‚c;¨Öxõ•W±µ½…ÏýÊç I–n-á­WÞÀÊÒm¸É›/QðÑO| ÇO?ŒÚNë[«X[]…mÛøÜ¾€õ/~fßJïÛ»ñÃAè§!0ŠÂôOI”0™ŸB¯ÓÃ×_ú:Ÿ$‰ègÑììaŒ•ÇQ«ï ßï¦-DDIJÇ™Åã¸ÌtÞKE;v[[k0Í~ÚJF’¤t‰Êüôdj¼7n¯/àXyA„(Š˜žšÃää,ê*ºÝ6”dîôàr½äÃp›MÓP*•pâÄ |æ3¿‚þÜÏajzÙL’,#ð}¼ùæ›øßø›8óУÐT-Þ1è(‰Zf^R¹ŸþìgqâÔ)ܺ¹IÑëöËgñÿ}õ«ûöþùa/ðànzâ× âê_Ñ(¡¨ñµo} Ý;nK"@¢?ç$IÂÉ“§m5®ß¸˜ž„|?ŒM`jj7n\JO¿Š¢þÊƼųssÈeóñ\_Í@¥2‰0 ÐïwQ­mǽÖ;™—+Ž´‚îm7hÐ[(”pâøcŸÆÚÚ-ÈJý¤}G†(+(•ÆÒ~~ƒjÃKºƒ»ÓÓsh5ëp’%ÒÁ8µáÆÈÅâtÝ€¦hµêètšÈçK˜Ÿ;‚ÇÏ<‹V»ŽW^ý6z½îÈmQ(1;sW®žOÃs!_Š÷º|Ï…(I(äK›@6“E¾P‚iö±½½†l¶€\¾€~¯ƒ¥Û×¼/š>4UÇCG†i›ØÞ^C&“G.›‹û2 qx ’¹ÌŽkÇÓ?Ìfg°»»™îGî—ø#i1FIK½1iñ‚¸¯¤$Åý!‡öÜ®g099ƒ^¯;rØæ ùÑAà£R™‚(Ѝն!·½IgEDZL&‡ññid³yt;-ll® X(a||–mb{{=™ ½ ÷Âçàq\Ç}¿å1LMÏ`aaׯ_ÃÚÚ*²Ù,fÆgð¡3Ϥ!/ÈR³ßƒ¢¨Èç‹Èd²°m ½^'Ý[w·±pƒðý“+¢‘0v·ª¤¦IHÓ¡*qƒ`QQ.ŧn{½Úí,ÛD¿ß…iö‘ËæññÝnÕê&._9÷î!E3pèð1¬¬ÜÀììa4›5|þsÿ1æçŽ ŒB´š5¼ñæËh4«è´›˜™YÀÊêºÝVRyНÛh`޻¢R™€(ˆØÜZC.WÀää,E… X[»…~¿7Z<`°$I˜Ÿ? MÓ±¾¾ïÓjQ¥'F£¾ßºßë^×ï~ÞØ:t ½^­V=‹§hqƒrI†0<ÃÀÇöÎzRÙŽ/s0[zd¢I¢P(ǧÕ}®ë Ñؽg“ó÷â÷䳿ðYŒ—*éÔUVÑ2[°=k_ëA‘ËçðÜóÏá›_ÿ>ôágñö¹·“Qñ¼AÅ/žöWþ@e”Œ"2RÿïŸüÎû%@"úÉ©T&1=5‡n¯ƒf³ŽcBEh6ëh·ètÛɘ­ðIDËQ.UÉæ @ÀüübºÔØïw1?·ˆL6‡[·®àâ;gßu¹|rr…B½^ÛÛ똜œÅüü"¦&gqäð1,¯ÜÄÎîL3î]¸¶¶ôž\r¹˲`ÛqßÂÁÁ†8Äì=M–JñÍÁ—»µáùi%Ë æçŽ —+ÄËÕf/=aß/$INz :÷ý}o¼¤±óûevj¿ø‘OLú¨õj#Õ?Qˆ÷®NMMáÌ“!ðC|÷ÛßÁ ý^þþÒ ;¼ßoPýÇ’QD)SÆëo¿ŽË·.óɉ‰è'K× ”KŒMàÚõwÞ×ׂLO- Tƒiö°»»‰z£ QpôèÃ(—*èvÛÃ[Ûkh·žÊ21> ß÷pâÄcèõ:¸½|¦Ùƒœ,E¿2™Ž=t’$áÚõ‹0ÍÊåqÌÍA£YÅÖÖêŸë濺ž¹w³ò?'>ñü'°03Aѵ»w­þýÕ¿þW¡éþðþðècàëúõ$(Æ'÷Z¾ÄÁ  +¦ Sh4Zø£?ûŸ”ˆˆèN²¬ —+À²F$@.[ÀÄÄ4¦¦æ‘Ï“žykèvÛ#'™sÙff`;Ö×—ßõÄæO2~ò_€ë8X^½MÕQ.ãêµóØÙÙàýS$ŸÍãóŸütÕÀNg{¤ú'‰rð`v~¢(@%t:œëmHyÈ0Ý>DA„ã;P¤¸•ÎxnfÏÆW¿û‡ûF 1=`ÀšŸ_D©87·n7Ðíµã}ZÙ| ?(Ÿù0>Žz}W®¾f³†Je ÆîÍ·éƒõì™cñðaô]²(%@r2²Mú7I”P¬! "vwv~²×oÐúELöUª‚ŽkK×qîÊ›Ü÷G €DDïYVP(”¡iz)QÄ|ÛTŽ{#›„ùïEò•àüƒô‰åC+}sBL;„`d”ä€Á›ãÍ$6âÁËHW šÒ¿"]o¶×ücî»/—¨hÀ¤s;SbââËÉ ´aLJ½ggfL23ˆIŠ5ý-IRûÈÀ€ݸØÿ½àˆã½Ð0¯§—>,Â逸Q^9ÊÅæk¼€PºA©ŠÙ8¢ÒÐbý:qó)ÃÒëg⊓uxÍ üIŸ83^^u²uãÿÑ`dy3r‹lô­œjÏ´]_rÎÍAOM¼žà@Ü£n‚©º½LIrpE¹ëâ‚ÁèÅ['J›6¬>’ëÒD©óм¾–V\c3Oˆ».+t©4ˆx Ð9 h%zÇRƒ+Œ¤ £là§'1`»O©‹Ä€2 ‡ ÊBí ¡¶±Pùu$%3©ä ¼,%3»j/Þx5k‡&‹=ë“E|ýÁÁfÀ‹Ð ãed>CüGø¨ñÏ›%hÁ‚Èñã“ l)Q›Õâ‘P‹lˆÖ|| ƒˆ¿J ­q’»À>fÒ{éMÇg{ñ+×;ÛñJ_ÒãýmHÈJ¤þUcb[!i5>Þ˘KE˜*xážôf‘çP–JO7€;õqm†T¯ ]䯫=}4±w il¼•KEh"á_D‚›‚ëð$Ö1}ËñÂ4½QªSÔþ-ó<:€ãSúÉëø£]RµÐ°ÐÍÑ›ƒ r<ЗαÓW&ªÉ,Ç… j½ú0šúo#SϪ&•^ÀŸ‹¥ã9ûô\ç%PP,¸ên ð'\­#M‹‚ùÌOÐù¹ˆª–…–¼téí]ÀùG €ñ%Ú0ÐöX½õ˜’ 뫃›)¼H€Sžö0`µ"f $€V@ëcÁR‰zCU‘(²@j z5 ¶‘X ¤Çúšl#ñO%€yø……Ý\$œæ/*2/ÌZ¿ Îèß ¤G¿fµª²í4qj~!ø‰)Š;ú d(ŠN€ˆË€K€'IRÄ99bü¶ú~&GAäs$KB´ŒCR|»[´-Ä3ÊiZÄyó4 ’:ï$iQó5!³´•¡VA4ïÃwAã+·œåE ðÈוÓX• š­ÿ¤H”±/ šÒ@ÉMž¨”ðøãc.OTõ& ×äªÞ>S¦öwªïý‰*7T]8ØÙ$ªÆÐæ­‚"bEVjÒK6„D·Ët9ÿdž.“Ý{èÔïMuqU¦ËÅû„‰SUõ?n™*ËJC¦ºÚ Îɬ¹>a˜ÀжoŠÃÚ­®+¯¸¨Îµø¢v/Ï5rWõ’ x~Xs # ©6Ì'ÒßWɪ\n&eÛ•Ë W€ S(w. ~+ héÒá•‹Bc*è@aºrsY§O LO{n~ÕhƒI!Ý74. éÆÉâñȼ¿Ý` _ŠÉ¾Ø” ñÓ´Ù!€‰í’b½@éxâ ´&ÎØ'ë\½!'ô‰gMÜé|[pP˜@ÈéÌž´ðç‹ &Àià¼6ÀW€à#©X˜²²¼ @¸îl>ÿ®Bg«8MLÎÅaÒÝÈ’'z6è*ž74ð¹¸Dèâ°r 7ôö>02™¬£AsÆ IÉÔ`êgÏ1Ô\¯§€­U `mD<`üãþ,Ú Œ2À²-€\ÎßÐfGª8´#Aé[°q»¥=ÕÖCÈÜî‰Aù1f¿÷2Èžä¶´ €áÁ:;€qàj ìÕŒ—PÄßl—³ßªö!AßPáºâ[û²ãžýl“ièÉç§IDòÚýƒBqýõ$Pz¢±%ñOøOÎDž1þÇ$°Q®á¶$ùþŸ+ IË"$!A¿w‰’jÿ úÝ$öùOŽ—Æ4%ÁØ7ø§±ÿÈY ÁØ÷ V"°`ßï'áû‰/<>fÿqþ<ð4€„¦µ:ïkæÿA0‡BÌø½ÊÕû$ /d›¼­íã yŠ¥ŠäÞ•ª{hLù l¼ƒ­'¿¶‰îÄCòs–ÿj_?W '.ï·baTøïØt#¤ßá?âBz¾½ˆûŸeÿJì()NÚƇ"¾#4 cö¹B¿¶$”1û·m;äÇ¿(ˆÏ›´×‹€?È¡c7õ¯(O=FÁ¿eɃª#)àfþãÓæPït’à\îµn'Ô]/<îJ¥…ùƒ† ‚.bÿò¦ÜæH>‹x¾<¬lOµò¿=cÅRþaš2¬Wyʼnƒ l}7U<À,6EÜÕ±[¢üàÜ»ÞÔŸs¶¼a‹}›=ÆWW×9Ó„Àâã# W,%!å[…¾ïy»„m °’Àu‡ü**X­ÖkMã´õ:˜Ïg¾? ¼n óóóÖŠ@oKàW·{S"ðWˆ"®ñÏ÷ !WA»…hH@++`K”ÒÛ²%ӔƗ—’ÀNj­l1¸»`%FI«+ŒSú‰´¾$ßå <çt:××_H`W¿»ˆ$àÈûD¬V”ÀcN+G zÇ®‚ŒÀ4#ì*d«àdô 9ãUðZO€¶|ì#Å€ßFÒòmØDw8™n‹6 à¶Qmb·Ï ÍáX¶Q ]RZ̈êX·‰Ô¼.ØÍˆjb NÊŒ¨ia"´^UNè5ê”Lam.|„ÐJóR ,jò"žvÌmBÃIUN¸øØ¿”@ftÂB¶UVlÅ» L&_q»„±ãVç„Õï‚”€c}å…&ž_™Z• x.ù†Û$Bfó¬ 1øÆ[$(}Þu)™çý¼”~V%¥áúo—¡Zç¬Vßr[tD\DÑO8ÿÊŸü«Ä¢Òk¤„DIEND®B`‚milkytracker-0.90.85+dfsg/resources/pictures/drop.ico0000644000175000017500000000047610737746457021766 0ustar admin2admin2(( À ;f) ’<¿Næm2ì^ñ«‰ó·™ôÁ¨ö˶úáÔüëâýõñÿ!!+î„1 ÎîéC ÎîêS ÎîëbMîÇ0Mí„éPæfÿÿøðààààðð?øøÿüÿþÿÿÿÿ¿ÿÿmilkytracker-0.90.85+dfsg/resources/pictures/milkytracker.png0000644000175000017500000065517310737746457023547 0ustar admin2admin2‰PNG  IHDRºº pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFO–IDATxÚìýwœeÇyßùªêœsóí0i€AÆ 2 ÌY¢¨dÉ’lË뵽럽’m9iWò:ɲ¼ZÉkÙkÚ +‹Z…µ-‘ ”¬@R¤H$r˜œSçÏ©ªßçôíîÁ€È8¾ïyõk¦Óí{ëžžîç©§žÇyM³Z%DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD %DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD %DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD %DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD %DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD Q@DDDDDDD”%DDDDDDDD Q@DDDDDDD”%DDDDDDDD %DDDDDDDD Q@DDDDDDD”‘WN¢%yùÕ²ßþÝ?@wóU¬,žÁ{ϹÓÇŽF,-œe4è1öè-Ïá}Ι3Gµh"""rI jDDD^>Sݾý{þIc–Ñ8gáüIN~‚´Ñ¥Öœ¥ÑšÁDÆ€u8g1Ö8˰7µ‘|¸LðcŠ|Ȱ¿€÷gOÃ9Ç“O=‚÷^ -"""Jˆˆˆ|½ì¼fåû„ùžçüü Çžþ}éwçc"‚§ðiÖ"«u¨7§hv6Óìn¥>½•Z½‰KIbI³”F-#«eÔj µZJ½–ÒjÖIœc0?wžù¹E>@‘#GžÆÇOdeeQOŒˆˆˆ""òj`­%„ …¸Ìݹï.~ôÇÿ5û.räØ>û¿Ìhá y1f4âƒÇû€1Pø¢ü±#EðÄ0ŒMÈZÓ´¦¶ÒšÚB«3Kwv ™-Ô²„4IȲ„z-ÅZ‹uŽÄF£œåÞáp„÷)oÛ{Î;Êú•¢'HDDD ¹œ½÷ƒßÆ3ýÙŸä©G?©¹L½óíïâÇ~â_qìä"ŸøÍß᳿ù«$6!MRFã!½þ …/0Æ”?ˆcÄ‹µ†"Ælõ>kÊãÖÀL^ot7QkÍÐèLÑšÚD½=Msj3ÆXм /<Þ{  F| z#ââ"ŸûC¾ðøïë‰yQ@‘W‘?÷§ÿoýÆïà ä ~3çÏçì©CZ˜Ëíyúž?Çþð?âøéEþõþæO Ëj(þ‘8 þcŒeF>b´ÎZŒ±8ë°Îb­ÅÙkLy[Æ’8‡-‹>+ó'éË]iÒ:¶ÖÂÕÚ˜´A,fi‘šƒ;®¿“'ŸûÃQ_O˜ˆˆÈë„ÆŠˆ¼Jcx×>ĉSó?q–¼ð¼éí†z£­Å¹ŒüÝø;üèÿŸ|ò?Í_ÿÞ?Íü©$.™”Ü…P–üǪþÎ\PŒWí(wø#‘"¾`4oø:‰s¤IJ£Ö Yo1Õ™afj›f¶2ÓîÐuÐ*VHŽ1>úÿ÷ŸÅ-.P¯~ò;—ðֻ߭'LDDD ¹ÜlšÚDsz–ý‡NÑ]8Kô‘$mñæwÿ9-Îeâ'ü'ùçïñ}ù¯ðãÿûÿFêÎ%Xç!T%ü± û cXîò[‹scÊ÷­&†ã`èúÄŽG„ˆ1VIªã–#Ö:jiF£I«Ù¡ÙhÑnu1Æ’…>uST)‡„+7_ÅÖMWê‰Q@DD.'Û·^Åâ™ÓX ÞÑê4 !25}5{o~P ôu”e?õ/?·×÷ð·¾§¾ø%šõµ´†³Ž#Î%åß6ÁY‹5UY¿[=W °¦,ý'F"Þ OŒž¢ Ëý嵑1VÇ"!†êkB ջ˾>ÄYéÍC> 5œòk¼éžè Q@DD.'›7]Á‘'gç5ÛµEQÐé6ñEÁ­w¿—V{Z‹ôuÐnuøÙŸû%¦º]Þuÿƒ„qA»Ñ&K³ò|?±Úù/wü1øPëÖXœµ“#Î9\’TçÿËÏqΑ%5¬5Xkñ«¨ª(+ ¦¬¨¾Æú÷û¢ÀXZ™#úœdõÈAZc¶5ÅM{ïÕ)""¢€ˆˆ\.6MÍòìO²yªNÒj0èÈj)i=ÃÙ¼õÛ´H¯°íÛwðK¿úŸùÝßø þðè4;Ôk Œ-w÷ͺÎýÆŠ¢`©·L”µó¿#ISœu˜Õ7–¼ðdUB ©v÷kiq‘O’ «« ƒP\=‘q>&ÆÈ`Ø›¼Í>çöîÇZýJ ""¢€ˆˆ\ €v—n´H³Y'FÁÐé4 1²uûì¾nŸêrížëøõßü=þÅüýìÓn´©Uþ­)¼ZSîÊ‹œÞp@0‘V³Ãbo™QQ€þhÀ(å’¤$IŠ3–´›ÀШÕÁXº­.Ãñï}5Q`uš@œ$Bð“ ¾ð9ÃÑ2Æ:(†åÛ1@ “&Ü}÷{ô¤Šˆˆ( ""_oÎ%tšm¬±Ýÿ×îÞQî¨g)µ,a8r÷ƒß´îL¹¼\î¹û>~î~…¿ømßFa™f£E’$“†|«þÆEθ(°Îaœåôü9>õè§yâà“ò±êøßXî¯0ªšþkh7ÛÔÒ k-Fk õ¬F§Ù¦!lÕ@ÐÚ²àê¿Kª†‚–ñxŒ³Žñx€± ¡­ýàj„á Wm¿¶Ž‘ˆˆˆ( ""__­ö4Þc8üÌsÜyÛnb¬ô†¤iJ§Û®b¹·Ýõ-ØËè]ï|/?ô÷ÿ1ý{¿—n«Kšd@5Ö/F0û@z›ÞxÄcžà“|Ч=MoЛÜÖÊ ÇcžàðécX—eu†ù˜Å•%†ù¸ ètû_=VШÕiÔe©¿µ˜j˜ µc->øI@g-y1ÆZËxÔ#$E^`«>[o3]ÌñàCߪ'XDDä5LÛD""¯©MUÀ’F$~…$Kô‡°iŠ,s´;mVÎ/rËïæ©Çþˆáº@S.ïúÓ†où¶ïäÿÀߦ۞®šíy e`^ÆR«¥œ8w‚ýÇö3 ¿âíÎ/Í3¿4Ï–™-\±eGYþ_äô|ŸÞ O£V§Õ, cpÖQ¯ÕËžUù¿­¦ L5NÐ|A#£ªß€sŽþ°O͈Lùk@aR,†kšÓìÞu3=¡'[DDä5È?¬e¹¼]yõìÞ¼¢(«ÚSM–Š:+§ÏÑší’ºg ýqÆÒi79rPAÜ¥ôýÿËðßô­üèþ¯tšÉ?k¨Îî1ràÄAyæÎÌ¡ðÅKúýaŸÓçOÍ3[I“  |ð ÆCŠ"ÇXK£VÇG–Õp.!M2—¸`’˜("ÀñÓGXm8ÝÝF«êU\¶ö AZg¼|Ž™kßÀSÿ¡žp%DDäëaÏîÛÙÚnB9ß½ßëqýwrèéÃdÝFZ{†AÈŽ+÷pè¹Ï1öµx_ëJçøáþQÞúîoäÇþÞߣYk¥Ö&„2Úfqe‰Ç<Áãûcqya2~﫵2Xáø™ãD›§¶&)ñ!0Œ†#.IiÔ$.-û ˜r÷?I’B`”8;w &Ïò G?±°¼À¦éÍlžÞ‚µ08kð¡œ01«S ¬e4\´F1ì“@™Ä¨ØÆ4ãåslßv;Iò[E®‹@DDD y%Ítg‰q´¨Kïü)L£Á¸(ðEÀ%ç-íVƒåÞ€+wÝÁì¦-Ì?«ü*¤IÂCÿ)º[÷ðÔü25µ¬ÎBo‰ãgOpâì òW(@>vê0ÇNæÊí»¸îª]8cÉó1È‹‚3óg9¿8ÇtgŠÙéÍ4j ¬uø3‰1B(+D†K”€`‰ÌäëÒ4eÖ/óæ·|+¿ó‰êBy Ñ‘W‡ï{'Åpã.s³Ý€Ö&æÏ/ÑhÔɲ„"i–Ð[`ŒcÓl—gŸzD øUصíj¶ïÞÇ܉g9üizƒ–xæèsœ?;9ŽñJZ^Yàð‰CŒ°lÛr%õ$-ùÇÆ2ÎÇ,,/°Ô["xOš¤,­,°¸<@"WìØK̸¬N¸` Kjäƒeló ΞÛO°¢‹ADDä5BcED.sÎ%t Xw¬ÜËÁ§žåæ½W–È Obm5&ÎRoÔs®¹öºS3ZįBˆˆœ?ò‰K°ÖQËj—Å};qb?¿ûéñè±àêdµÎVeþò<çÜây8È|üÞB ?Xª®+ ùó'ÒF›îè<½í;u!ˆˆˆ( ""¯”©éÍÄñó›ùõ—¹bk Çp4&÷¡œ´[uBŒ Gž7=üA-âWaœÉ‡K„¢Dš¦ZÌ—ÀƒKji4ÉH“k3éË;qÇO<ÇÿãO0·pŒó|ò>€áp…€©ÆÆ^ƒz—8˜gÇžûi4Úº(DDD”‘—S«Ö¹è€Ao@Ãæ˜V‹àY–X‹³›XšÍ:ãáˆÑØp߃oÓb¾Ä@–&dY,­‘$)ÆõÆ«âþ‡8~öÎ%x_L’HC°D’$?~ÁÛ(°ë˜ê/òÞ÷~·. %DDäåtE·C^Œ¹ØNm’$9°ŸÙÍ—ûdi‚MÖY¬14ê5¬s,-õ¹õ®·k1_Z €z­ÁÌæ4ê ²´†5–,yõTRœ?ƒ1 Œ‹ÊÆ€Ãj¤dR«‹ñ—_…Z›8\$™ÞŦÙíº,DDD”‘—K'uëšµÅu/`åÐ3û¹æÊ­ôΜ¯ÂV°Ö8‡1†V»A>ã²nÛ÷-è‹tnñG˜D €_— XŸ“cdÆŒyàoÖ…!""¢€ˆˆ\*E>æ‹Ï=J³Ñ.±*€ 1”~Œ$.åñGgïu;ŽÆ¡ðe¹w(ºD…n›³§Îó†ûÞ©Å}‰þÛ¯ÿ2Gž}š×–“Z~ÌÛß÷=¯Šû¾¸²D½V'VU# ËçE‡±Žq€‚2øÏøuɀ₪ۘ&_™£–Íj, ˆˆˆ""r)9òõVc SFbÕD€8uô(³3BŽÆñÁcœÁ8ƒM,ÆZíþ2×\{'­V[‹ûý£ø×Ù¾ë*²FÌM¶n»ò²¿ß…/(|³nR=²²–/E4“dl¬ FGZk0ëúì»÷ýº(DDD”‘Keyñ<'–‡8—”çþÖ5Èû=–HRÇÂbÂÚ;DqÖ‘¦Ž7œ9»Â›~¯÷%ZZZàßþÔq˃oÀh9÷=ôM¯ŠûÞHÓŒcé÷çHj5l’bÓ“Õ°i†uŒ!`‰rÊêÊc(ÒqÔÇ)÷Üó]"""JˆˆÈ¥à}Á“¾D½Ö˜¼mý(@(»¹?þÅǸrÇfV–úÕùíXÿÕÇZ°ÓS NŸãºï×â~~ã·~ýÏ<ÎU7ì¡a#[;Û™™ÝvÙßï¹¥yY}ÒbÐ;GcË4ÃlšF§Msóõ™µfƒ´^#­e¸4ÁØl‰%VɇmL1ë{\ûà (""ò*à€Ö2ˆˆ\þBôÜuÃôúË}†…gïm·òô3GhwªÉbXkèCÀXCXY†ö4EÿgΜÖ¿DŸþ£ß㻿÷/²<¿@’4º[yæÙ?¹Ì¯¡Àlw_Xc<üÞo"ëvHë[¶ÍÒhÖ©·›ÔÛ-²N‹úT‡ÆT—z·KÚjâÚmh6‰õCFÁÑžaSwŠçžû¢. ‘ËX¢%yu8wæ(#Ê‘ø¼÷;ë˜?u ç,Ö:F£‚Z­üoÞ&–èËÏI’ï}›°´°Ìý½›ÇSàöRõ{+üøþ0ßÿ·þŸûø纭[¹q÷M/¬,²©³“Á°‡qŽ£Ÿåïz;KË#6ÏL1 †9£Ñ˜áhLŒç9…yNî…÷„“çƒÁã S×ÌꂹÌ逈ȫF$÷ž;÷îc0ì¯FÿëÞ !x|ÚäÊk®âø±³t¦ZÄ'GV bõº_YaœÔ¸rk§Ÿ~BKüUøÌgþ€;Ý{ö°wïÕ\ÝÕì¾öZ6]¹kvß˶­;9wö0ùx¸ñ°K¸ï-ßÎwÝÍú¥ŸÜð\¾œ¼÷lšž%1²yË6Þÿ¡oää馧ۤYFŒ—8’$!Ë2¬KpÎáG–$8gq.%Ë’4¡–fìÚ}%Ÿùƒßa~á¼. ‘Ë”*DD^EÏb“¤Œå«€1TÇ0ưtî4wÜs_úÜŸ{¬ÝØïÕXCŠÅ;GÏ¥ôŽŸaÏ÷ïýªø«0ùO¿ö‹üê¯ü{¶ìdëu×rï[ÞΛ￉ÜßÀÊʽÜóÐ[Ùÿì1–Ïðôc¿ËTg+;o|÷Ýw'ÿùW>B\?±á°Ô[aªÑÄÏ¡çžÁU"Þ—Õ!µZG¸$à‹€µ–Z–`Œ!¸Öâ¬'/ vñ1§(·Þz7>­‹BDDD ùZGþxÿ³ìÝD—–i7kŒFžñhÌhœB,+KŠrEQÆyŽ÷‘qáñ±`´¸ÌÒr—ëo¼ þ‹®%DDäkc乃_âΫ?Àüx8©˜ô0†ñò<ÎB£]g8Ñi×ñ¾ìüo­!Ú2Yà‚!ËRÑ1XZáíïúöÿ«×"•–W–ž÷¶Oÿáoóé?ümvïÚËû¾ñ;¸vïÍܵï~ñÿùI>õ¿ùu¹¯ÃñO$KkŒòŸý£ÏÒœ½‚ápDœé2=Ãᘢ((| È£<'x F„çž"÷ôÎÎqº7ÄfÓºDDD”‘Keiá,f‡ùÅs}¿%rèÀAv]½'Ÿ:L[ý!DŒ5D_VdYÂ\ÖÄ-/3sÝÍ8çðÞk‘_=ÿü‰¿ù$,ú+Ìv¦1ùˆ'Œ}÷mæôéyÒÄ2ç¬ôÇäãœqÈ‹Ÿ{Š)òrB@^øòßãœås pò 3×l×-""r³Z‘W—á°Ïçö?MâÒ «G¬u=ðÛ¶Í#BìGÀ9‹©nÇXC–$Ô;Mº.pö܈‡~X ü:qjî4µ¬†µ–ýO=…u†ÓçX^°´2¢·Òcq±ÏÒÒ ½•‹Ë}–—{,,öXî YYé³ÔïÓëÆ@>ê³Ü²cû.-®ˆˆˆ""r)Äxjÿ©×‚ÿHù·sŽÓG㋌a0k ÆX0—XŒ5k¨×kÌû„…“çxàMïÒ¿N,÷–)¼ÇZDZÃÈ’„¥åK+|‘3{FyÎpœ3ŒÈ‹‚ѨÀ‡€/rŠPàs/!êD†ƒ!W]½W‹+""¢€ˆˆ\*ós'i6Û“”ÍýÊ*ËÒù345Ómúý!Ö”ÿÝ[cH¬Ã‹³ë,õz†ê’#Ó{˜ššÒ¿NÌ-Ï“&óçÎ2pÖÐë ñ!B (<Á{r_NÈ‹œ"/(B úòcbð8—`äã‚mªQ@DD.ÑpÀþ‡ êþ_V"e2ÀFŒú+´»-Š¥>¾ð8ëV?œÄYœµ$ÖR«¥4Zuœ…ýNóÁoøøuâä¹S¤i†1†CÏ=G»Ó`i©_U“€÷e£¿¼ð>B¤_½#øª%!—©5g´°"""JˆˆÈ¥cà O?BbÝ$ø¯Þœsœ9~”-³] âC('À¤üß:Sõ °4u†6 §ÎsóíoÔ¿N,®,–ÇC¬å衃ÌN·Yî Eć2™”çe@‘ÞÃêî¤Ê9Q`h¹€­wµ°"""JˆˆÈ¥bŒáìùS4­É®B,Ïc[k9}ô Û¶Î@=+Ƕ…Xõ(ÇZkHR@«Y£Þj@žÜ,»wïÖ"¿Nœ_š'MRŽ|Ž,KÆ`Êâ’à=Ö@‘{Š(|yæß‡€÷‘<¡:‚Òó–šñø`h6;ZX%DDäRˆ12Yê÷¡ ú'U€5–¹S'™i‘Õj £2q`ÁZS–ÿ»ª/€+íN,:z†oþ–oÓ"¿Nœž;M’¤œ:~”™©&…÷ÞcÀÇXý1BÄû@ ü71P„U¥€bã‚+·_«…Q@DD.] ðøÁ§ÈÒ¬zÉßÖ:Kó"³3²q›/°ÖVUå1Z–’%)ÎZÚ­®Ûean™n}P ü:1·8Gˆ‘þâGOųÖZž}òI®¹j>ý1!DŠà±Ö`My ÆHš8g©¥ 33]Μ™gûU·Ðh4´È_…óï>Êÿò}‹-[¶½: çˆÀñC‡™žnÑŒËkÄ0g«^D\ÕÐL®6[&œ#3bdó¬&ˆˆˆ( ""—TŒ‘§?SîÒ†@ |Y¦m ‡žÝÏ•;6A­Æ`0$ÍY’L~ 8S&\b±Öe [f§ð>pèØo~ËÃZä©^«óïþþÁßüÇ\³çf|øCüÆ'>Íü³ÿ‹7Üóàe-ö–8zð96Ít G8WŽ„jŠ„YìŸI&À˜ª"ÀÓtQ“DDD”‘—ÃÙù³tÛÓ“@n­\ÛqúØ1êµ”lªM\\¢È=!D²´œón«ž‰s$‰ÃZK–9šÍ:‡œæ7¾S ü"cøŽw}z‡¿ñ½<³ÿ$Oï?ÎJÄû>ðAþÕ¿ù9~æßÿ>ø¡ï¤Ùê\ž×ÑÂyΞezª ÆEQŽŠ4eÀ$ àlÙÀ€q¶ þ¡œ€%1VsF…ˆˆˆ""r© ÇCúã.I'dzW­ÌŸå؉³lÝ2MËE†£c (Ö: ¦¬ˆUS@ VK™šjÑë ™Ùvív[‹ü¼ýž·‘½·ÝÊ©¹!sóËÔ²”?úÜ3lšî0ÕmqÛm·ðW¿ïoó/þÍ໿÷opÕν—Õc8=wšùÓ'ɲ”n·É`0ÆUMþ&ÝÿcœŒ4Õtk!Kˆ"YM׌ˆˆÈåÆ?¬eyu‹1P«ÕÙ2µ‰q>®*b9 x¶]½‡Vwš3R›¡Ón¦Ž8k±Îb¬!5†Ê4¹³ cÙ6cxâ‰ÇµÐ/ –ÕxÓ¾7bàíþ&>ó…LušXkèõFXgÙuÕf0”•i¶;¹í®‡¹z÷>|Q0wþ$Áû¯ëã1ÐH3îzà-ÁrþüÍfqQà½Ç‡XM˜ÌZÓÉ×ÎøQNÍFF¤<ùôê⹌¨@Dä5bÿÑýÔkª`d5&sÖqôÐ~î¹óZV Ã`8žlðÁO^O’kYêèv4šósKÜxëZà/ã;ßýÄÙ}ã |þ©ŒsOŒ&ެ–ò©ÏΉ1¬Uø›ò¶:ö¿úI“°äш¥ÝšÒÅ!""¢€ˆˆ\j½Á !®îÈ®½=ÆÈу˜ê6!ËXZZÁ‡HœsX³ö£ÀY3‰åœ³lÚ4Å`8¦Ö¹Š™™Y-òEÜví­„àñ¾`ÇÍûØð$õzÆhœc¤VKؽk?ô7ÿÏ=ñ8WlŸe×Õ[ؾuš™é6ÍFÄ:Ò4ã–;æ[¾ûy߇ÿ»¯¿ c^ùÓçÎsþäq굌¼ðŒFθò¾¬oþ·zßÖ˜$Š1Û¶\£ DDDä2¢#""¯1FBŒlžšÅ?yD†ƒ>w<ð>sŒÑ0gËæijµˆ¸j~;€5¦JŠÂ“& §Oφí[2ìKZèõ?Dã}ç®Þ{ÏžñÔëÝNƒ#!ÂÌT‹›wwùÈOþ_üÖû N=Êßü[·ÌâC¨¦5@‘Ñ('Ï ²ú×ìÞÇ·¿™,k°´p†<¾b×ѶÍ;¸íîû8xä Cš:FyAð¸z]E0ÄÉ´ VÄ@#_a`êä£ENœ:  EDDä2¡ ‘×PàÙ#Ï23µ©œÝ¾Îpe‰ñp@’¥ÄÅå2YPœ-ƒÿÕï>DLõok µZJ³ÝàüÜ"»®{ƒùï¸ï´ZÚ­.»ï¼—…Åefg:ÄyîY\ê±ëš-|îÿ ¥g,ð‰ßç/}Ç_à“¿ý»ÜrÃUì¼j3›7u™žj13ݦÝidŽpíñžÿu~ï_äškïxE×O<‚1†é©½þ¢ê ±ÊÃE‹ŒZÆj—Ànw‹.%DDäå09³pç’²[{ˆ¥iÆÁgŸ¥Ón°¸Ô¯v¨#EQàCœ$b(w¤mb16ÏvÉÇYkW\y•¹’&)7ĥlßµ“ßû£§i·45ŠÂ3ç,-õ¹nç6>ÿéϱyf+›g¶0Õ™ÁâøèG>Ê?ÿÁeºnغ©ÃÌT‹4-Kííꈽjü8f³ÍçÜqÿƒ<{ô1F6mê’e ĈsvÒáÝZK‘" c ‹K=–VúÜvË üîoÿgýðtŽwÜóv—°}çÕ|æéstÚM¶l™.Çå‘••›f»|ö“ÿ…_ùµ_á³–ãgO05³ÖôvFµiò¤Mš58uä'žy–n¼†Ù-›!–¥÷…ÇS­'bÒŸÕyN=æDoèn¹’«®¼™;÷£giñ̤òãkqÃMw³iËVŽ?@–:¼¯Æ „2Aª××åFƒœšƒÂf<ùäïë›RDDä2‘h DD^[|ðDcI’”q>.cµX8sš-›»¤YÂpy@^”±e#7 Æšuã«3ßlÞ4ÅÁ'A²›ë®»žçž{öu½Æ;·_C¯¿ À¦ëo`ð±Ï±û 7E¹Cn¡ð×îÚÎÏÿëß Tù±SGø•_ÿ9ff¶q×½ïáº›îÆº ½!‹¿öûìÞ½™»î½‹f«ÆÓÏž`y©‡5†q^TÁ¶!v:Œb„áÛïѰ@Òdß`óìnN~š'ž"ÏG_õcüâ?Ëõ7ÞN½Y£·¸B«Uªòÿ*¿`(O(<¯îÀ,žhkdYñx¤oL‘Ë€*DD^ƒL’²uj–<)wö½ÏÙsóm=½D¾¸ÄôÖYjYJâ,Εͭ-»ÿkˆB,w|­1œž[Æ¥Ž«·wø“Ïæu»¶ÖÞ°wƮص›/X¡Þn°mË4ÆòqÁ8/Çì»áJþŸŸûέϷ²4#ÆÀçásŸþuFî¾þFèÎrìø"§û;¯šafÇ–W F9Þ{œ1`MÕuLš²”|TÐM 1§ÑÞD»»«®¼™ÔÕXéÇûâ%?Îå¥yÞúޱ²2dùôyjí°zM” !Äê(³!R‹#›qþôs¬ôôM)""r9ü£%yíyîð3ÔkÍjd[ Æ€1†£‡Ðí4ÃÊò€ËRÿàC9¾Ý’Ä|À%–Ĺr \æhuœ=3Ï-ûÞøº^ÛMS›°Õô„Ù½w–˜ÝÔÅÃx\`¬!Ï=SÝ6ûŸú!„ÉN¼u ÆB äãáäyyô ¿Ïÿýãßϯþü?eapœ•™íüÞg3÷è¹y×,W_µ…$qŒÇ¾ ü™œ¹7ÆA§ÅR½ËBᘊ=®Îr®Ý´‰Ûn}ïÏ÷q×ï§Vk¾¤Ç9wî$Ãáz#ƒËê†(»ü¿P¿cÀXʱ€3S[õ )""r™P€ˆÈkP^Œ¹ÿ¶ûY^Y`Ãí$eÏ·râìÆY¦º-Ò$!IÊóÝÖšr\]Uþ‚'„rž½ææ—Ù¶}§Ž>Æ™3g^wëjŒá[ï%M2vï½gN¤Ý6Û¶LÊfx ‹+ܸ÷*~ùŠC‡`­%I2lU à}Aˆ#ÎÚIܼ¼¼ÀSO|žÏ|ò×±IN÷êë89—sÝ–6³Ûf)|diqë,¦ªˆ!”ϱ’„k0  ëi˜œf±ÌŽ-Wrõž7bŒãÜùÃ/úñÞuÏ;ÉjuÎ]$XCšº*¡T^OrbD\_#8Cc¼Ì &ŒGK;ñ¬¾)EDD.ªy Š1rìÌñj`y`ÛgeǶi¬³ôûC|„(ŠbÒЇHðqËaʲ÷n§I­–ròôË'~çcäE¾¿Ð™ùéñǾÀ?ø{ÿ?öÿgþäóÀ]ûöpåÍ{ÀYZÃ,/—¿UðïÊ×]µ3Õe¡½•…z—-­\µçv6m¾Š›n}3Ó;.þ5ýè´e‚ÈV÷ûW“Jñ_y6 ­·ôÍ(""¢€ˆˆ¼œ _pniŽÄ%„ʳý<ó4nbdy±1Wäes¹"ùº*S}ÆŒ±tÛ-lb9{~™÷¼ïƒ¯«õ¼mÏ-dIÊ®k¯åw>ù4fªC–&_6RŒ€‘Å…¶l™æ7óã/Ëý8{æ$¿øs?Îßù¾oåÉ?ùwÜw ùìf,te†Ã²ÀX¨Õ ËpIB’%4šu6maËõ;™žÝÊž›ïejf Û6í¡s‘úógOPxM,´šãqyT "ªc «•eÜ_õ¨~Űi]ߌ"""JˆˆÈË)ÆÈž$M³I`fãÔ±#ÌN·!qä…gœ˜*x 1bªÊ'ÎbŒ!±–z=%q gÏ-²ûú»^7kYK3š&iZcß[ß_Y¡Ñ¨—üˆU…E`8‘e 5ÓãÈ‘#/ë}òEÁoÿÆÿÇßÿ»ßE::ÄÖ=×Û„º ˜| Þƒ5Õñ G­–ÑnÕ™š*›ÞtÓNfgg¸bûlo7ؽõ:¶Î^ñ¼¯òÖXlšÂJR«‘¬þ½áÚƒ"Z21iCߌ"""JˆˆÈËíä¹d« €1Àü™t:M\=c43Î ü$  Ä)Š@âÊÎ:œ1e k¡Ûm²¸¸LÁëçÀõW_Kšdìºî:~÷žÁ4›dYRŽO´ï=Ö9z½!SS-¾ôȽb÷Íû‚ŸÿùÁ¯ü??ÄM7n%ïÎ`M¤F°ÜÃ%®LJÔ2êõíVV³Fš8ÒÌA-eÛôV2çØÚÞÊ­×Þ³áö{‹gi·ê$YBJ(wý×ý»0S8ZˆÆÒT%DDäå•9>Fœs”Gý-ÕEð9­V“"Ïé†e#@'åÝ«³ìa­Ë»³g3Ó|8uzŽ~Ç^ók˜¥»vì"I®¿ï!VÎ.”M}(wÃ}¹v¾ð,-ö™šjóÉ?üï¯øý<{î ÿøŸüU¶˜“ì¸þ†íiˆ‘üüEîÉRÇT·I£žaŒa8ÊYY`–WèlÚÎÎí×Pø!9{¯}#æ4Ï<ùY–ÐjÖ €÷a-àû¬OŒ£!5åÇÎLoÑ7£ˆˆˆ""òrŠ1òì‘ç°ÆN‚µÄ%<õøev¯Ïp0Æ®6 ¬>ÆarÎÛZƒŒ3„iÔS’,áüÜ ·ßùÆ×üîØ´ k {nØË'>õ$Ôk8kñ¾¬–Xm²ØëÆ4ë _ø“Ï}ÝžïŸú™çßýË¿ÁŽÎ<·fÒÍ=F°U€¢('Xʤ€uŽN§Aˆ‘ƒGOóáókvíÒ4ÅËô¦Y~ïóǰΑ8G^>à‹ŸŒsÏÊÒ IšðÄcŸ»lîÿÁƒù+ÿÓ÷òÛÿåÿæoºž{ïÚË`8âÀ,.ôH}N9ÀpÍž+¯%MRˆÄ>›ÚWphÿ³Ôki–]Ðôo- ð¼)€iBÄ#t§7ëQDDD y¹yï9~î$¬ðÖ2X:Ob!Àpn‘¢ðÕîÿêl÷°.aPˆi–b­Åh6j$‰ãÔé9®»éî×ìÚí»öŒ1ì{àMôN£ÕiR„€Ï=EîËÝÿ¼ ·Ò‡å6ošâ‹òéËîqüê¯þ*ï~Ç9{ôsIȇ+di íÆ¤>BªãÿëzDÆbFY½¥oB%DDä•0õÉ}Ž1åûÖVæÏÒí4 ÖVzcȽ'†ˆ÷‘àÞ{|&S|Œ#ÆšÍΖ{öÜp×knÍ®¿ú:l’0Lg‰½Fá0'†ØP@` E^Ðu×lpøÀ£¯šÇ÷›¿ñ1þáþvìè1¾ê:’ÆÖ&ŒÇCF£!µÄaWwö‹œgžxë,.ËÀ{¨úEº ¿T6‘o,–ˆËêú&Q@DD^)O&qnòzñlÙä.k°´ÔLJ€ÁbSöpΑ¤–HSþÐpiyÎYêõŒ¥Å…iqóÍ·¼fÖªž•£þ®»ñfž>xLÙän8ÃxLVýô ¾ ,.cbA’ŽzöUõ8G£ÿò'ÿ¿õþ ~k‡åú6êõ>ºÍ66å/ !rúÔIŒ-Ÿ÷2à¯FþÅõ1ÊžŽatXc±Yó«¾ß÷ý›?ÿ?üEܺkWDDD”‘cäøÙã$.¼meþ4Öh’Ÿ£ðÕ2n_”»ÛeqÖ‘$å1€P„ê@B³Ý çÌϯð®÷|à5³^wíÝG’¤ì¾å§Î“MwËæ‹Ë´\\ûá™{ÚÎMÂéÏ’G—õãZíx¡“'Oò‹?óO¸ú:Ëøš›hÏ^ÁÕÛwBðd¶ ³0ô0Xœ18a4.“1Â8¯*CÊ#"åß)Ѧ$Öa£Ó™yÉ÷÷ê«÷òÝßó½ü•¿ú|äßþ,Y–é›YDDD ùJ–zKÔ²¶:0ê-3ö`j†Ù$ÇCQBÕýßT‰ƒ#Æ–ïs‰Å&k?:ÚÍ:.qœ9·È­ûîM¬“1†v³M­Þd©hš@­^c<c}NÍxÊÀ7²|…ï8~ø‰Ëâ¾¹—/÷1ÃáŸøçÿÓ>Fû†Ý,d[Ië-¢/°~ˆïõñÕøÃXŸ¯%¼Ç`0TÁ’â¬!IkXãÀÀT÷¥üÎoþnjõ§Î̳iûõüãù1}#‹ˆˆ( ""_I#gÊYöÎ9–çNÓî4`ܧ?aÁûr$`^M0ÆC90†µƒÞΖGš­:Ë‹+¸lš[o½õU¿N3i²4ãÆ}û8xä4y´ÄG´\Y%1)F(ÆC¢K8vøñ¯{ ÿR<øàƒü…¿ðžw›¿ó‰ßæ>òC\s};{¸Œu[päà|á ÑÐvå@‚Á‹‰eo ›$8c1Æaê52!2=½õ%Ý¿«¯¾ë¯½<£QΑãç¸fÏ>þò_ùkúfQ@DD¾œ#ÇNÇY ”ÁÞÊÜ)ºÝ&1ôVä…ÇZGÙ`-P&ÊJ—Ør`bé´ä¹çä™>ðÁ½ê×é[稜ÕÙ±ëzVæ– Û¡È Xî‘Æ1cƱüñ9›„X/Ñ[žÅ‚þ¯U’$Ü{ï½|ìc¿èûÏ;ÇOüØRK¹ÆXüxÀ‰OO:ý'Dð¡ IÀ„ˆqg ÆÚ2Ñ”%#ÖZí—6 ðÞ‡¾‰v·ÉhT{ÏâR/=~ˆ[î~;ûîx@ßÐ"""JˆˆÈ—snñÎ%“@r°4‡1–¢>ÍÜü2!FŠjÄ[˜þå®­‚ÿ,IÊ Öbejª Àé3 ¼áž7½ª×ÇC£Þ¤Ó™†Ö,vØ'ÍÆ£œnâ!•»Þ€ŠÞ®WÍ”™Ù-/úþ]wÃ]ìšš%kת#)ñ8ç̹E¾ðùgyãÛ¿‹VkJßÐ"""JˆˆÈ GÞc­ÅYÇ`é1–ÉÈÏÍ—#cć8ù7UìÖU$Öa(d‰#«eÌÍ/QooæÖ[o{Õ®ÏT»K½Öàêk¯ãБ3ÔV»ý/.‘Ä‚à pŽ$&²°x\³'÷¿,Aÿ¥Úñ¿Ð 7ìåÙg_ÜÄ‚¹³ÇøÒþÏ`¬ÅçXZ©æü­ûÂXÁ Ƭ5ÔÒºf§›t»Ó/òq[xó‡X:õ,ÝéòјǺrç;5|eŽzÖäÌÙC“> _kÐÿríø¯×jµ˜™™åðáC/éó?ôÞX®»î*f®¹‚^k ×j”CòÀpq‰åSg8{à0ÇŸ>ÄgðÄ“‡8vü4=uïÝ‹XË]÷½…3‡H붪4)rOï=IZ' yö‰Ïð¶wÿϤ©FŠˆˆ( ""µ°¼@=«Of¶÷æÏ’&°,.õð>à¬%Âd$`ŒåpQø*H…$±$ÕHÀn§Aš%œ;¿Èâ a×®]¯ºuiÔ¤IF½ÕÂdMâÒ2`hÅ‚0\©®úáé÷—I³Ç?ùªzœ×_=§NŸ¢(Š—ü¹ƒ•ã´[ æbvñ8S‹g©/ÏS[Y –÷©ù!ió!±ß§È=ÅpDo¹O­ÙúŠ·ûoâÊ´Æâò<©iŠåCòÂS"Y£Ëh¸ÌÑÃOðîý }S‹ˆˆ( ""3ÎÇ,ö—I“k,ƒåóÔkýèXé ˆ1ûr÷?FÊc1b€Pö~sÖâCÀȲ”V³Á ?â𑳼ë=xÕ­Ë­×ÝJšfÌnÛÎü b Æ¨œ€` &k”ìsòbLÚèrôÄS_Ó×}%vý×»öÚkyîEžÿ¿PÔãäñÓàË€ƒ3ÄDLŒX"Õ¤‘/C R¯ùú$ÍxãÛ¾þÜ1Bðt§§Êk0¼/ÇRúDL„v{sçŽqÕ5w±eû5úÆQ@DD.æ³ÿ1I’b¬e°t qçË1o±löåß…åŽñºJ÷ÎÒ4ÁÃôT g gÎ/rÓ­÷¾êÖä¶koÅËìö­œ:½@Ýê.Âx€s®J}DŠá ÞÌ­Ìá}qÙ>¦õÇ Œ14›M¶lÝÊþýû™å®»ÞÀ{ßû^ÞñŽw¼¨Û[é/ÓnXHS­Fù«Ä$…&_¼lh ÞGí6­FçoûÝøst{KôeµE£Õ*„rç?ÏÇÄ E!’eu¬µ=ü%>ü§ÿw}S‹ˆˆ( ""³°¼@âœuøQ?cÚmº®jþWtEá'‰€Õ]jcÍäÌûämÚ­:Y-£·2¤ÖÞÎÕ×¼zve—¦å™óM;¶süÔy_°äÞ—i‚z›·Ýû~þëü !„Ég¿í݆îà,çGCB øh6[ÄñÁ|y †°îkZ’´Aì­ðÌã¿Ï·~×òOè]úæù2T "ò:õì±çªF€ŽÁòõZùˆÁ`DŒ¡:óÉóïÁGBðÄ*Ø+›â•Sœs¸ÄÑm7Iåìùyî¼ç¡úÍWüó5|ÞWvï­÷a­%­gäEÄ÷úÔÊ”Y²Fä Á—÷Æ%ŒóÑK—xçýŽ–eÜtÓM|ã7~ˆ¿ù?Àÿö¿ýwìÛǃù÷?ÿó9r˜_ú¥_Úü_x{Ûú—Å¥E¨¥Ò1fòKEØðz™Cˆø¢ ( l£†/"7ï¼mò¹õZ“;®ÚÅòò¡ZÛ< ós`Êvãq^VÅäˆA¬îc­Þâè¡/Ðîlãλ5PDDäËQ€ˆÈëÔ¡“‡¹i× ŒÆC†ËslÞ™’§uúý!…8[p©!Ĉeì•`ñ> 8ãÊf€ki43šÍ:KK}šÝ›Ø¾};§Nº LüšC^ÖBÀKcªÕ%/ÆLMmæüÜŒÇ"ãÖçÊ#ãQF½Å?õG_×çïÂ$ƒo|#úÆ1  ‡CŽ;J£Ñà wÝÅ;Þñ¬µ|Û·};+½–—XX˜gnnŽóçϳ¸¸Hžç_ñëž8u’ém›Á˜ªéßóŸ×¸ýc øH‡K,Æ¥,×_q=Ïžx–‡þ6Šþ£ñHµËΕ#}Èó@>*ðëžõÕ^íÖf–Oñäã¿Ã?ôC|é ¿=I$\ŠñŒ"""JˆˆÈ«Þh<Ê]Ý|eŒ¡SŠóó˜]Û‰D †è#³ –r€³ãмXÛýu,Ó3––û:z–÷¾ïüÌOÿ»—+¾$Ik,ýaï=×n¾•S§h¸È(:ýÉ_¦(Æ/z]•‘× õÙ-½˜—׎çNâ\‚5å8@×n¨Ï`8¢ÊòíòþÕOý>ú(Ü??ò#ÿ”z½À`8 z I/Zþoc#åæ|¬l Æt»M¢q“khª3ÅüdªÀê­dYŠ1–ѨÀeñ¨ †êú‹!”Õ1ÒénâôÉgXY>Ë[Þög_òz¿SDDD.7ª‘×yÀ)>ïÕ»{˜9ÎZŒ1 —æ¨M—£ûFÃ1zÜd6!Ú²`om [CQcˆ«[±¬stZu—z?qŽw½û}ü¿¿ø _!{à<¾Ôçå«{.Fùk-¶Þd4ΩY%g ét›|\'ïõ‰ý9Z­.=ò‰KÌ¿´€ÝC5ûˆç²ÿüŸÿó Ÿþþ÷¿Ÿ7¼á 8çøð‡?Ìý¯ÿ•O}êÓ“²þh"½^Ÿ/~ñK,,,Ðl6Ëã…ÏÁ%—½àrÇh(3frW‡Ã1ÆB#K«û !0,Ožèr€'ÆHgzš¼ðäENá>÷Mu4"žX}¬‰ÐÚÊpe‰cÇçᇾ“ßûŸ}Á*€ó\¨*@DD^‹T " þ/«Ûzå[œ`ܛǥåîl¯?Ä:ƒ«ºü‡‰a-( Þã½ÇZ‡c Æ–ï1ÖR²,áÜù%nÝwßó‚ý//\mQîʾp‚àR<ÎZB$iJbËÇÄYlâ°Æâ‹k51i“y7ÃüÒ¹Kså|5»ÎfÝçV¬±“cͤ`R `Mùb W\q%o~ó›yôÑGùé—øè/þ¿ÜxãÍ|×w}7Ö–ŸoMy¼ÃÃá#Gxò©§&_<ÄPM¸hkâ†äÆyŽ1O2y΋"§ðEya5ð jõ:Æ@ž{FãœhËœÂúç8ÆX¨Þ:»é FýEVVÎsï}ï{åŸ%DD^ËÁÿúÛ|u 'ÎÀÃxe‘Z–ë]ÆK=¼epʲÿ¢ðøê¼¿_H –¥“à$u$®|i·›ôVÌn»ŽM›f×ò/õHÅj2àåyü‰Kˆ1Po¶²ÉߨªF·ÖbœÁ¹ï#|«†÷Å‹"¿š÷m¼¦&5ýë Ìó‚ÔIûê³–X÷VV–— ú|êÓŸæÉ'žàÉ'žàcÿwßý0ð½î{ùÀ>Úí6wÝyzc-¡0ÎËû×÷Õ'xÃÃÊ=1–»õÞ{’Ä’fu Þã}sÉ$ñÁYGšexïÉóêx@ œÄÕA€u_·R«Õ±IÊÜüiÚ­Æ%KÒˆˆˆ( "òª üÍ+ð5^]ÎÌ-ßaYнP8ðU3¶|Ù}Ý”%Ú“*€jÔš/Æ–?NbXÛynÖR°†ÃGÏñ–‡ßþ×ÿÂÊ€õoŸ„½/ªà¥=YšОÞÌ8ωR ¹÷“]pë ôûPkñìãð2ÿY§u¿á‚óê«;üƼðYöu¯÷ú}þÃüO¼ÿ}ïçÏþÙ?Çw÷÷ðþ÷¿Ÿ_ø…b0üìÏþ,7ÞtÃ;ßùNÞóž÷°uëÖIr¡ÌETgûWïÚj¢úqõMÆN@Qjµ Üïóç•ÚÇð!0=3K E(ÏÿªY”Õ§ØI~Ä`¡¬T‰ïs‚—î»ZÕ""ò¡"ò: þ_ɯõê9?Ü ªàÝ“¡Ó¢;X¢$Ö,e—"ÑG‚1‰!5vr qo"`±ÖÕ3jiÊ¡#§¸ùÖûøÿáW/ŒE¿BÐuñ$@¹é¹TG´ëi c Íît™Øˆe×ÿÄZÒÄ‚¡ð|`™„£‡¾øUþ/NÜpÍ^x{ëwü_ðë­ëëY3¹éG¿ô(Ï>ûÓS]Œ5ôVz,--¯ Øáï|'­v›ŸøÉŸ`8®}½!qÄb­¤1fݽ68"ElU!!øÀx<‚¤lB‰dYV}¾}ÞdµŒÜCžç„ÜO®ƒ`“ˆuÝT¨#ÖÀp|é§4¨?€ˆˆ¼Ú©@Dü¿ÎÅ)¼ÇK1X¤3ÝÁƒá¨äª¦k1bL9—}uTÛ¸(°åáL4ÊÆni’à¬ajºE±2€Ú6šÍÆ%)ãq·ñâ¿P-«B¤ÞžÂûÕª‡Õsó"8kh[O ½å¹¯)øq»ÿ÷“òúµ×Ÿ·+m ÆØò…µ>«/Ö¬õ0Ö0 9}æ §Nfyyeíc ŒÇcvíÞͯÿ·ÿÆh8¬›,ý˜8Ê«û×âuAñ$ùàcõ¹†Ã^ŸcGþ„$);ügIò¼ÊbÜd‹¸ÖñßV·ýE;D®ÞcLydãåúEÕ""¢€ˆˆ‚ÿWgÒÁpèÔõ&£åE:ƒhéFUñÁcÁûˆ5¶<×]D0Õ„O$â\þ¥IB·Õ€,ãä©zóÛ^ðë›—Ž1F¼k} ªõ !P«×hw»eÙáÉ}QN("KÖŽ¬åE"ΜI° ÒEDD”QàùŽ9A–ÖÈûK¤.aè-ãþ° È"…/›ÿÅ >b,G¶ÅH’¬íJ§.™q!F\–R¯×˜?;ǵ{ï|^Ð?Yg.–XŸ¸0X^[ߎó^Ün|§Ñ.üf›H9Þ0FÈWq·Œ‹bAîÇÌ«ç%þ62\×ܯêe/H(¬OØI’ÁbŒÛ0°ëüÕþ +ªy“¯Y–Ý—o+ooís74üƒêhÀê×6àÖs1“„ÕÝALÏtxä¹?ƺrŒ¤sɆ c µZkËûËìÁ@4ÕJ•Å&„ÄH˜ Œ¤)“ê„zÞ¿Ö]ü˹/€1†[o¿“ýo~–?ú£Ï²ÿ~Z­–þKõà/ÿ}ˆ—ýó1>xòÞ"Iâp3]Âü"Lî}Äû늉Æ}ÄHÒ„0f]I=`­éâÆcrö~Ãä³~íªà=Æêólµ”‘H\»ÝHÙ|ÏTýÒ„èMyìÃÄ ngà>bðë ðt;MÍ6ƒþ ç–NsÅÌ•ø¢(wì«ÄR½ÖX½sÞ—ÿC˜\ å= `B™cØÐ}°eXÏž«ªÜørï±ÁöåÔà½ïûF~ןæÌù%vïÙK«3Íž={Ø¿?·ÝvgÏžÕ‘×1Uˆˆ‚à³O|=£Þi–0xòq>)ù@ðe)wôeyw |=÷ª+{,ƒ¢Ä9¬³4[u¨§œ9¿Â½÷<°ÖL^p—Û¬+}_{6_¸à¥lÄ^86¯Œõ ¡ú‘X6<¤*M¯ÊÒC†¶É™“_äí› ÷qãøÃ ¯Ô‹ôUHnÖUA¬–ɯ·Wîô¯¿êãVËöíúJ‚ ×l­z`ã[é[íú¿ö¼Øu·åW“[ëzÆj×ÝÚu–Õ©#I³Ó›XXY$åõYëàƒ'M2b “÷MÆ F€0 ºW¨˜2eQ~êB ©Ôør»ö_ËnþåP Ðétø‘ÿãçØvíÛøÌ矠ÑHÙ½k'›7o!Ï=›7oáÙçžãšk®Ñv""JˆˆÈë=qúü)¬uôÏÓjÕ‰ÀhœWåÕU‘·©ŽĈ«ÿUPYŽi³¶åfm¤6iš±0·È÷šª$Ÿ²6Ÿµ ßÇÕ ë‚pãètlÞ¼e²H½q<¢/“LU²©V/wï}ˆø"àCÙÙ¿œ`Ë~1®« ªÖˆøP6 ,oë¥ò¯Æ>ø ûïÿ[>õÇÏqîôY­.o~ã$iB½–ÑŒXZ°¸4æÓŸùn¿ývý·,"¢€ˆˆ¼^ÆÀ¸ÈiÔ[ŒW–©e£héõ†å\vÊÆkÞ¯ëàËòì yl%ÖA(ËÇW`§ÖÑnãWØ´uιI0¿>P~þËÆà-8{qI€õ»î/¸ë‹!T]þGyŽuŽÑhLËð$±!Òtj½åù¯°žæ‚_pÍêã±MZLºí³Z²o׎¬÷«þY Ò×ù]ØDp5Ð7vuWßnœ(°áo»öñU/k×ULõ™ ë7)~kG’ÕVÑ`Lym¸Ä’&Ž­[¶L>·?L’0«É$"$‰[»Éê¬BáËÄS™±)ÿò¾ DOùi†ËF”Eˆ„à¿ú" ðõJ¼ç=ïã­ïÿŸøä§!ÐîÎPË2¶mîÒ¨g“iËËNœžçø©E>ñ»Ÿä­o}«þ Q@D䵨ÊW Z6îR?{ì9â¨KoFE˜Œaó¡ ü‰‘P‚“ Ú}9ªÍ”aa ¡JDZ cáô¹>÷Ý÷ÆÉNöóîˆ1«/œ÷þ‚I€‹ßÌ юتœ`6T lÌ+\äã­”ŠG!ð~CŸ¾Ñ¨ ¡1‹HásbáñeuJ ¼ðþ‹M`xÞ¿/žxiIµW&qð¡où34f÷qìÐQÑâjMjõ c ·Ý|5­V`’) 50Î=ó }ž9p‚û³¿Ì}÷ݧÿžED^G4@Dhk}&–V–Hb pí~4¤(ròÄ’:[UIJ3|µk[x1 `°¡*›÷¡*ÉŽ˜ISG­Yc8·Èž}w$ɺnæy÷1šµ`r]dUþ#јòï‹>žõ³áÍ»ÿϪDZ֮û·ƒ¢€*!Pä9 †3'½´€ð"IcØ)°Æa­ÁÙçVÏæ› ½<2Q6µåÃj÷<®Kâ¬ëP6`XKpñØ×˜j¼^ ¯}Á8¹Ö•Sb Øèˆ1`V“%++ÔìÆ²ŠÕ}‘XNXÍc9®Àââ Ó3ÓšöG_^S˜XŽ @¨’L¢­Ê1Ê~ã}ùñ6‚§(>8“¬~uB`mšƒyÁ§ãô€¯_ÎyßX=¾:N€ÉTb\ßp~R °v}í½q]”w±x=V·é¬«îª#IÝZüרMîÉx\0,sçŽ>/n|Áu½ ø7ªÊÀߥ i’’%)I’¬íÈ›µâÎVkf­«Ž ¬;6`×M ü÷ÚsUžð/âZºf=ǵòýòéŒk# ‰ †CZÍö†¾>x Ÿ—|Œ//.a0“2~cÊ)«‰Žhc•”(›ýùè©Ê ȲÁ—Ìd@àÆkgÝœ‰ ÿ^{:/ý¨ÀKá¡·ˆ<Î0<žV­J¤t[4Zu6oêòç¿ëí4êsgNñ›ÿé7†LÏ´hÔ3Ò4)+IB D±e‚bn~™c§æø…_þ8ÝnWÿiŠˆ¼Æ©@Dä• Ç¹ØÎâËô¿´û´1(>;†kF=f§Úœ?iˆyAã.I(|$’“º„h!Rg˹ Ù|™ D²ÌaÛ-†Ã÷ßu÷侯*Œ4U WÆ’fòÖõkVnÖµßð(ŒY-ù_=•ÖÝBõQ«‰ qIU»n°Îª1€µZJ‘ÄU V“ÞÊâ— þÍ;íë'XãH’”Zš‘ee ¿Zþ¿¶+_–ÀÇñUûc•hñ$.ÁZK-­UIË ®¥7Ö\_0©`²6;ùWëeLul#L>oµ¬Ÿh±v5Æ^ÛÙ¶&–ã'ULNS½5ú²Ò#F¼´»Éµ#ŒòaùïÀÚcö¾ì-e`²DU’!¬&Š21UÄÔWÉ©òH“ÚºçââÏUŒq²S¿¡àU\Ê*€½7ÝÁÖ«îeþèA:­ª‘b³AV˨¥ ú›âÉG¾À?ûÇÿÔ$;}ŒçNðîw¿›ñ/þ·Þ¸“§÷ŸàÄ©yò<à‹²‘b^æz G9ÿÝ?ámo¼•áp¨ÿ®ED”‘Ë5 ðÒw&͆ ýÛO?…ÉlÙÜáXapyAŒ!¬³ÄX0¼“’ÔNbË"Ö–Õ‡€K,ÅØÓi7X.’&iY6¸4ÁSä$ £ÁòƯuáyò ëZî®;—’V%þ©KH«RÿÕDI9ú® ¦W{TýŠH’ŒÄYl $.ÁaɇåºÚ•Ñð¤Ûÿºò~c&Ýô1†}{ïàÝü Ï_â3Ÿü Nz]B Œî Lô+„uEôëz6b(¢!b1«Ç>.81)¹¯žÈ"µzµgzý~Ù“Áðx_ б'F³îˆÇêØ@O„1ã0¦æ³*yaÀ6Œ|VfÝz½\I€KaÛŽ«¹ãïàÜÑC4›]œK ËHê5vlßÄwøA¾ç;>Ä£}ñyŸûñœë¯¿žïüÎïäg~ægØ<Óå±§²°Ø£ÈËIã¼`œçcùÿåxÿ»î½¬zˆˆÈ¥£#""_—$À¥ ü/]ð_ZôHb¤–$åñï†2ä2†@Äçcãêž6ÆB»Q‡,áô©y®Üu3ëkù7Þ§¸ñþO6bíº³ÜUàoËc×÷® ø­Ìµ/ÇßU/¬îЯÂ¥iB‘{|(ƒøÕʬ!Í’jWúùçÈͺ`ÖZKšÕ˜™ÙÄö+¯b÷žë¹þú˜Ý¼•$k’$5Œu`\R£ÙêÒîl¢ÝÙD­Þ…¤ Y“Ô±®F–¥dYF½–R6å÷DkÙ|ÕÕlÚ¶ƒ™-W±iËLw7sýÞIÓ:µZFš8œ38kÙwÃ]tMúóe‚Â’,ãæ}o­®…µÄÅj/LÙyß^ØWÀX¼ÏqD.NžžX5s\VwüMu¬»—¤®ãÁ°«z1Æ)ýaŽ¡Œõ'9bõRN¡1cAyU€`qصë.ðc.zþÿÅ&^‰~µZoþ®äÜ¹Ó Vhdòyi·Ø»÷*voêñ®w=ü¢Kö—––¸çž{øû?üC'„1>ŒË]nW£ÖiÓí¶i·›äyΉãGé­,‘¦ ù(BÁ7Ý@»U§Ù¨³´´Hê"×_·“#‡qæÌzý>{wÞÊŽ™Íœ>wœ!˲É:eµ6·Üñ6žüâ/W:®?>aXêgLÄT•õÆ”Ýø« “óþvž—mú-q’"z i•P‰`Ó Wã(• ‡˜W]ÿ#y1Æžñ¸(³ ,–¢<Ó°:€Ñx¢/ðD\ô„Pÿö‚ëzòïÕKĬë-QyØpF^Ôq€—‹sŽÿñ¯ýGŽ.Ñ;w‚éöl’`Ú-îºk/õÑAþ§¿òý_ÕmÿÈüGŽáçþßó›¿÷%Ž;»6]ÂD–ùö?ó·xúñÏóøãëÇŠˆˆ""òâöÕ ý¢ï}IÅZ¹<ÕÎvô®ªkç™×B¸ÕYîk£åb5—=®EoUÀ³¾qÜù¥9KK4[3 ÏEŠ¢ ø2p³1 Kã¼(ÏÑ›r—?8‰ŽÀYÊÝYÊ¿uÄév› çç8tø ÷ÞÿFž~æ̺¼Íꈾµ^kA»1ksVçÙo(M7¶ºÕ ¿ MM|^ ÄIJÔõïZ–Òë !qË©1Dl½ÆÒ♵5œ¬ïj2Â’$íî­V‡FkŠWîfÛ¶t§§±ÖÒžåÈáãäyAVψ!²27GQä˜ êµI’P¯×ètÛ úVú#ýÍVc"ý•eêÍŒn;eiaŽ©©)j™cÓÎíÔÒ²WA>2¸iÏ­Ì6§8qê8ƒaŸ¬^Ã8KâÊ^ÆX®Øy3Ë‹ç9v豪Ì-pßX°ÆK×TÓW¸Éùüu¹„êsbõÆQ6\×Ã|\^ÇqmŒŸ©šÞã'ß% Åjjhµ_d(Ù¥yY:1¡œbðÁÿE“qµñáÚXÃç÷xþ÷ä‹9+ÿÕŒük?ðO9rrÈ܉çh×§Èê-L»Í=wß@ïØówô}Mÿ7}ô£娱c|âŸà÷>ý$ûžyr¬¬Ì*j¤€bhŠÑë€^DQAAñj+8Ð*Êm»´mŸÅE¼W@o7ö¯P´"< UÔœ5eeVÎg>{Šy ¿áþñ[{Ÿ“CeeU1¹ÞzNå9±÷Žˆ±VD¼ï÷ý¾o'tèСC‡—Cþ7¤<|&×ÉÿÆÒ.ÅÆ¾.dKv×h“a)%B*¤Šä;N²Á»(àãtU+ŒIBb‹u–ÙÑ-ú—NE¿‹‰áB ¼³È–̃ۂ’øà‘^¶b4Öƒ±PÆš=ôú Øß?âõ¯}='"ÞÛnø5ù”ÏëoßÏ“½÷íNÃq^KúCû»­{nŽ-áë¯%J²_7Ð&ÉK•w G‡7ÅœöþH!1:†ü¥ù€Ý3w‘¦=L’qáÂÝœ;w¥5UÝç–³çÏ·5‚²,Y† ‡}ÒT“§i–¦n8šL9’æMÌtTe³!êi*YÌèŸÙ¡Èbu µ–ÆýN ¶©lIЖ£E+}€$5íJ‡'|í—´Àú‘›`Áõ1{L`ű "œŒRÄÀÄ ÔFØèp¢ÐaY¹Û¬(Ë2†®ïŸ÷1KÂú€mBðH$oŽ…>ÄðF„ 8‡·¡%Þúhð/Lö_èd¼“ø¯Ý&·¾ˆh÷¹ü“ú/p4ÏØ¿ü©Ê(Ûˆ~Ÿ‡¾›åå÷ò?~†äw¼ã¼ñoäýøUí¸rm?¶0OUV\¿~ùïä¿î1ï£C‡:t@‡:txiòÿ)¾“—ç8ÞÃÖZ£Z»yh÷«÷ïP*vºÇÀ¾øsƤ“ÄI¼µ8k£\Û î1&%I’# xÇÇý _õê7!‚ n,¹_OÍãt|3eßÞ6x|T@€–G¬[Òk)ÐÃ>ÕlIÕ$\¼x‘+—/Ç©nûpÄʹðü©­¸ý/'×ާ½¢uÈÖÂ.âäzó³ññ9f¯­Õ]IÊ–`ÓzçQRR.§'V%ÚÇUú½Y> Ïzé€<+ؽxÝSHmX®*fó%&M¹ïÞ1“ù|N¹ÊÈó”45diJšF¦ª*´QäyFY®(W%eUa­Géï-ódiBMÉÞ­›ôò‹¤iJš¦YAâò~Š÷žétJÀÓÔqÒ®•Z³èHæ]àdºŸ€—mŒÞZQHóœmpm˃>q‡ÛD4ãŸxîŽk žUÓæCûœLçS”PÑλ1!T\ð)Ö†»úqUD¶â—w-^6í1ì7UŒw3ᶇp› Â1á?ÙÀ‰õšèÖW>£sþ5¯}=îÿRÞûž÷cË[gîFôú<ôêKèÉÇøÛÿàï~V_«>úÑòu¿ï÷ñö·ÿ oÿ¹pcoÅ4XÌg“ò?òoùsßúõÝ {‡:ü@Ø¡C‡ßø­¯Z‡êüó™‰/L.Öä?I²,§WdiŠIb·¼IRÒ,c4“¦9išaLŠÒ©tKòs²¬À¤9Údh“`´Ùìïçñ! ¥âéË#e dï=ÎÛ¸Oï!¸ Ññ>‡·à×Un‘x{ç#±kŠ5!ïõrBUsíÆ_ò¥oÛLÜ×ÉýœØõ¿ýq>ùuÑ òDP݉F€{ଃíZÌ mcAü–A/#Ë ùÆ-à¬CHAU.Û·Ì6Ñ@H”6dŘ­3—è vIt‚é9½»K@0›-ñÁ“gYŸ‡45­HF+Éj¹doŸéôˆÅbÁjµ¤i„P ‡}vwvŽGh¤9iÞÃ$yÞC¶SóårÅ|>GkMs»g9wñ,i–bŒaÕNس,E‰1 çBÛJë͸\Àí+ñ‰¸Ð>®¡õ÷»å¶!;'q¬Ì–v³:!„d¶˜E‡ ¾%þ!þ;8ÀCðíj€ Èã~àEhC'i›|lÀ„¿ãŽŒnû·<ñõ“Ç™¸ý?ù /ã|}áËïÌå¸ý{ó¢Çþ–ÿ'ýÈ£T‡{lïÞ…ìxðÁ‹ôª'ø_þñÿú9y û¹Ÿû9¾ë»þ_ùe¯e{Ügñ)$̦‡œ>÷0ßüÍßܽµtèСÃït€:tø ˆÿË–$Âgãö¢õ?Ë2²,Çð2ÒR!0&A›èÈóX9W5ïRê¶&.vÛ+o±ÖâlMëlkÑ÷àc-µ„1„²„aó±“]I…ó¡À:0"à+Ø…Œ®qbW;’ª€Ç3IÁd2çž ÷·vb]¬‹äŽÃåNNô7ïò˜H­‰Zk —·3ÒÍTw]è¼k§Ìñ”VÌg+X®"Eà|ëXÍÛßAn‚ÿL’1ÜÞe{g—¦v(0öQZÒ4 A€ŠÚZ”h%ÑÒP7–ébÅj¾D'†²txj´ÎH’H•’$Æ ”BiM‘ ®köö÷¨Ë• Üué^ŠÌà\C–åôÓׯ_ãâ]ãêÂd‚µ.>×ë5!¢ÃÇ_^ÁÖî÷®XWì À¡àŸ$Á­Å^¨ã}ÿÀqÔ‚ÄãPñùô´ƒ$øÀrYQä=–ËÚç!´¹¢•|Û8ÿ«•ÆZ‡´Uk—G\c>`…CX‹ç-R‡"nK’ˆ“~Ä ·Á ’'I{8¹ nk;ø ÏèÛT!æ/ü]>ú±§˜Ý¼Áxûg¯gßÿýßÏ[ÞòÞúe_Ë»~ý,Ë!ÎYnݸƟùÎÿ™_üÅ_äÚµkÝ‹‡:t@‡:üVÃç¢ àø:_ùÿLIÿÖÖi–QW³Ù¬Ýé×ÑâO@)Ò M]C F[$ÆPU%$‚~€µŽªnh¬ÃÛHÌEÓÄ.zd$ò®A)ƒL ÞZšªŽÓW!pvIV¤¬æs\c‘F„ÀÛZãœDÉØÑîœÙ!: ”ÑæÍ:¨0>„J*¤òÈ~A5™#ï9ÇÙ³g¹~ýzË×Z{~;¡mNÁmTq‚Œ‹;,Þbè.ÚJ¹HþEÛ#ot‚1†º.il³Ùgßç4ÖAjP*Þ¶¥MUÆš¼vòŸ§=†[§ÙÚ:EÑ úcz½‚Æ:šf±¹/!”T­XÏþþ·nÞÄE¡5&ÍRá‚ÀIUÕÐVÜ…“ÄP9Z+v¶Ç¬VKêºfgg‹ñ¨Ï|6cµœÑK‹Õ‚[·nQôÌæKööðÎ!” MLkû?5|èuÿïúÅÿ‚o·(Ä1Þì̇v.ƒOV>ÈMÀšÔ'ëÇça¹( ‡,W Ök÷ιXAØÞ^ðëc@`­ÛtÕ )ABp'T¸ ZáJà„…&VPf:¿ãœ=qìœ \¯9œ«ˆùwÔeœ Eøì¨z'Ä€ÿû7þYnÔ^~Š^Ù°µ=àµ÷hþÞÿ÷¹|ëúçüUóÛ¾íÛxßûÞÇý÷žåã]Æù€1Ц©yúÉ'ø¾x;ßú‡¾ï}÷Ó¡C‡СC‡¿ýE€;‰ýó÷yŸ¿—þâßûüù·¥Œ½”RÜÿýTUMÓÔìž:Å©S§¸zíi’¡µ!I F£-¶·w™LY,fŒ·¶Éó³Ù”¦ª1Æ$)Ú8êºÁâ4X*°¥M$_¶ÆµjyÀäh‚³5W®7~öÿjÈÈç=\R¨öQ\Oxå‰çPl‚ýzý£Ñˆ²¬˜N¦8ïH“„aÄ|9Û„Ý!ˆUrÎAÕlìïÚh¤4¶BJM’fôû[ôŠýÁIÖÃè„þ`@c-‡ìïYBcRò"!MRúý>Ö6L§Kž{öY­H!©KšÄÚÁŲ¢ªêv¿ÝG»¾u}|ìõzib¨ê:>¿:Aéh“"MÊSÏ\¡±på¹çX.+¤TL'‡ïJï¶ xFã]ŠÞˆÅü°}TýGn´ýÇÇ<1˜/ˆu…Þq-âíÇ;QlðßæTMÃh8äÚk›“λ˜G¡¥:!>„¸ª¡Ä昊Þ…ÀáÚçØ’ ÁKp êjŸ?hvdû¸—ÜT«&ö·Ÿ¹ŸM@Ä«~=ÇyòÃï%ˇ˜Ñˆñ¸ÏW¿õó;ÿ7'‡¿!¯˜Þ{¾þ뿞÷¾ÿýÜÚ›²w0áŒ@Y­Zñ÷¿ÿ‡ùëáOuo/:tèÐ :tèðÛBðòÒ¼ÅË%ü/$HÜù÷Û™íÎÎ/^DÉO<’Ù|Î}÷ÝÏC½†²rô‡cz½ÛÛ»ŒÇc&“#÷S浡©kæËE$Bey´óú€µ‘leYJš¤1ñ6ÃÙ†45(­™M°UÉSO}’7~ÑýìÞ:„’¸ Ђ·xt¬$VgA²ÒoºßׄIIIcõ3&æ‹’xâ?ýì¦Âoð¯×mˆýæ¿'þ¬ë£í_¶DY"D ×ï“f¶q<ðÀý,– œs,g«Ø¢àÛÝrÚÂ@Ž· Úw¥%¶.QJQd}z½ƒíSœ={ímš&îáOŽö©Ê‚Àh<&Ë£~$MðÁsãæM¬µENÓÔxo™NR&’¦‘Xç™ÍâºAð9yž’$©ÔæySJ!¥Äkÿš¸–Q[OšåììžæÊÕnÝš1Ÿ×è¬Gš$MX.W(Z'ˆo€UÓðæ/þ½¼ã?ýxûX´TWÊͱ*B$ÈbÐGÀºê¨NÖ~“³P€mZû Ö:ƒÑmÌÚ‹63"Ö€”H¢ƒD´ËèQ¬°Èàqíï|Û€¡¢ !tA`]ÅnÿtÛ~á'q{KFt†„c!C„¸¢pµî§ütÏõO§ èõù²¯ýÓ<õè£qäì]Œ·üéoú2¾õ~?“Å‚E¹âÓ­ }¥xæ™gø‹ßñ|ï?øÇü»>F¨|{~¯–s.Ýýüîßý»ùÿñ?vo:tèÐ :tèð[ /×Úà§žî}v+¿Ž¯k00 xöÙgɲ¼%̱ÞmµªÈŠ!çvÏÐëÈó‚Á ”’4ÍØ=u-%ÓÙŒÆ:‚~ѧ±Íq0žŒýï!|¤iFQdØÆ’Ã|1'KƒY–3›Ï™.¦ôrƒÂ³ˆ cg»o‚'X‡‚ÒÄàH§ü¾­\¯cûâåx¤R¨~7aÃ)Æ£“é´í?N —R´¡oþ˜ì·cû“ÿ–í´÷¤RÓ+zܸ~“årÉÞþ>ã­1FkªºlÝ%[‘Â{œwÐXŒ1ÇY!`mëþ’ŒÞpÌk_ûZΞ=‹µž[û‡Ì¦¼u¤iÂÖÖ˜ÁpˆÖÛ4H¨a@U×TJá½c¹\Q×%Jilc ÇH±j‘¸!Ô>f-hM5¶©)Š¥ttCHI¯èh°µ=ææ›øPa—ÃaŸ w]âÊ3O2>{ßm!w±úÑ‘[<øš/æ±½{ó<­ÃÉã5î߯Åž'dÉÖ=`É|†M¤ÄûÀ ß¿$ïÉÓœùbmvÂæ¼lw41c·ÏW¬± щРGRlpZ8ºû5|ü©¼€†÷i8ƒNT~¶­ÿBH¾ùÿñßsåÊ5êåœí‹÷ÑëüÙoý]ü…oýÃxï9˜Mž¯>~Ž…€Ÿø‰Ÿà˾ìËxèõo㉧¯GÄ{<žÃƒëü¥ÿö_ðÎw>Ìl6ëÞb:tèС:tèÐá·‡pGÁ\K5ÂoÚ½,Š‚årÉÑÑ0ÁM¯×g4Þ¦?3ïröìY¤jSùc¹X0ŸÏÉò = HÒ,î?;kilM–E² ÐÔ >šÆ²\–k&‚Šª¶œÞÝf4qýÆMÊUIP`TÀ–%!Õñ{¥ÄYª%H‚ÐøÖJ- X§¹Zʸ㽩݋VnI (2¦“×nòÆ7}!¿üË¿°VYXÁ½á‡q}àu;aí^[½/œ?G^Èvr­¥Â5ŽÔ¤<“à È’)e»S.#Éoêl8¦ç‰‰)wÁ{LÚ#nñÀ«äâÅ € ¬âã—e9R€N&Íð­ÓB¶áu(KS-)Ë ×T8[ÓT%M”‹%óÙëI R†uó@²­×ƒ²v,WŒY&)yn(ËŠ½ƒ)!Xv·GìïŽdšù|úýiš’Tz¶@ŒûqŠ”Ëšû_ý|òÑ_B‚l…ž`“ÊPÈ6J œhôÏ+ qO¿Ö+%éõû"ÔMMj’MÚ¿Ĭ ã%ø(Ä$!€” éš6­¾½œxýR ¼·„àÐ"¡ß0_Î_àU@´ÍkwÃKcãf94É§í ¸ýG¾á};“IÃjzÄøü½ô¾é¿ð=ßÅÁþWöo½´2ñ9|½úãoðÞ÷¾Ÿ«×S¦³JK¼óXßpëÆ3ü«û¾áÿöæÏ² Ú¡C‡: C‡>Ë"€¸cˆö›Iúw±cÅßb±ØÜG­ E¯'º;gØÙ9ƒ1 ÖZ‹9GG5MÝPUËeBèI¡?2ô0F3™Î™Ïg„àãžy¤&ÁX,–8WRV5Mc8±/ë†S»Û\8ýƒ&“ƒHLë Š˜ÎïA¸8‘õgBx´–y‚–šEYÆÜß®´¤ò8?LPä)S!XÎWìž½·µy³Ù×”Š? _°¹v-ÄÿN˜MbxŸÔììl3Œ6sÝTXç0Úl ã*yl(R’eij(Ë€Vç,BJF£1gΞáì™ÓdYÂlVR×M$øB ³5Ui±Mkê¬#xGU•çp>öÕ[穪¶‰N©Ê¢¥‰õy^P– µ=¤ßë#Ug’ªÙ¿RêÆá|Ér5Ç»ÀôÈÒë'¼êžSÜwïE2c°ÖòܳW¹¹w“º®PZa¤¢”‘¹K)èå³ý#êÄðæ·~ï}×O±©ÿÛãɵ|»þ|ˆ "<ŸžŠ5ÍnC%ŒRä­ÃeÀ·ªJR“ç£íívu¤ÍP@o[¡hhðBÆL! .€Šµ¡–ÕBà®ó¯áãŸüõ”ÿÄ‹@›| n[¸£à®ýÙÈxó[¾”áÎ<ûô“¤½!ýုùÊ7ó¾wüÿx÷¯¾›ÊÙRù¢äÿs+¬V+¾ã;þ<ÿðý0ïùà'£ ¦%Öz‹9ÁK¾ë»¾‹ïû¾ïëÞ^:tèС:tèÐá·¦p¼¿ü›KüO’‘µûâÅ‹|øÃŽ/ÎZÓëØÞ>EÑ2o‘ç9Uµb:rp°Ïr¹Ä6–º®IÒ”ÑjÉp8d0â©ÙÝÝe4rttÄrµb±(QR’¦†áp@–eÌfsêºÁ% Î9ÊÊ2.9wî4ãÑÛT8)ÉEÜ—¶„hÕ’A稚X+¸5ê3öÉRƒžJæ‹ר8Ñ߈´•ƒ!f z¸ÙsîÃáÅbydzžgâØtÔ·íŸ÷º×ò‰GC Ib²$Ńo<ÃÞ NŒ… qžÊÖí,—x©9}j›¢ßgwÔg¾,1j‰QT¡Ý»×š,+ZrT1_¬X,X[#ƒe¹˜Q.¦xï‘Roè™÷ÐØXǸ±Þ{.P´Ï½òaèXs÷ÕÁJjãâcí+‚(cè9YfÐJ’$’àjfÓ9•uL' òìw]<÷£ ƒÁ€£wO¹uóéð U]‘örŠ,¡q±q éÔUÉÖî]'çÛ·*‰]þ5nWöoƒÄcׂ DkȺ#P0è÷7Ohª©0Æ?>¢ Ž ŠD]ÄðG),Pxš()¡ZgD¼QdrM ÑôºÇ¥»^ÍåËŸx>‰áSZûo£ØíJ›FŠv…!ø—RùžwÝã­¾â÷~~ìq„”líìðŸÿ§{sþ»üOÑRsípï7ýó—~é—x߻ދ÷|>Ï^ÙCñy[®¦¼åË¿…s?þã]5`‡:t@‡:ü•~ ÙUÛH5²,ckk ¥UUq_¿èõèGh“±Z•ÔÕ –Ë9GGGí¼Ãy‡µ5ÅähŸ¢èsúôfÓ)ç/œ'Ïr²Íc>N–d¤:ã¥IŠÑ¦å› “$(SР1®¦\ͨË%MX¤†ÓçÎ3ØÞ*@X´QäA·uˆžíí]t’"•f¶X2_V,Kf“ Ζ4uíüu‰R ÛfD·„DH‰qå@+…J<w\»'$Î<oRy¼—¬K’,‹ÇŒ¨ÑJ3²aA/Oȳ>p‰zåùØãϰµ=B IY–ˆ ©ëç%{3vÊŠ45Ñ-ÒÏ)«šå²&ËSªª¤i,_öUß̯üÂÿ'’½“.ÑÊV>à%O†mBÿ‰5€µƒã¤˜ˆVúbÐo§è>:ê¥ÌæütΣŒYÚÇ:×@|Ûà7ꃎ1x|ì D«j‰ ž`-½Þ)|øJÜÉËã2ÊzÊ¿>ÆâjÀµ€ŸBÎ[ŸÕ·ÝÀ ü]IÁ_úkßËÏà}l`xõ«ïá|õ«yÛ[¿­57>ÔqÛ«ÊgßýÝßÍÏÿâ;Ù?ÊY®*„ˆaž“Ã=¾ï~Šoù†/ìV:tèÐá· 𷻇¡C‡~s „à¾ûîÃ6–+W¯P•ílmØÚÚ¡è A‚`:9âàà€ÙÁ*X„w¶i°Îb«’ÕrÁb¹b0(ˆvêH¦ªÊ’$ i§ü!@cu[”’h£†œ>µÃéS;äyNÝ4Tµ§ìàË„Ä(GÌ[à,eU3è¼å—¸|툲l8{v›ÄhëY•Þ·âKb¿ÞóB2Ÿ-ð¶wÆ<ýÄ'R!•BKR ¥ÙNò%J+zEÁp8bk¼…Db¤D)jCü…(­Q¦ d=ŠÑ ¶®±Þ‘9çNÁÖŽñ™Óüúû>Îlÿ¿šã¼ È3ò½…”Š$) x¦‡ìí]çàæu¦G”Ë’¦¬qÖã'Å^¢…¢0 ibH´&3†ÄŒíý‹b1 iZ`L†Ò J´Œ›íÞ:\]cKU5T«ŠåtÁtUÑ-’§l‡ÜwéÜ{Ž$1›uЦ±”e͵ë×ÉÒ‚ñîY' ¤ ‡„€¦¶X…j¾"í ¸úìÇqî ºˆÓüKw}^›Ìܤ'9® ¤%úð¡Í' )ãq\,yׯ¾kC«‡yŸ3;g˜-&(!IóŒ/ûª¯æÙËû\¹¶OS78Zç†Å9O>:]ñ˜ð LB–D§¸ù-&³C„Jð(î¿ÿU\½údë0Çœ|½°V:Äfqás‚oþ“ßW§8::¢×ðªû/ñW¿ã÷òå_ðE4Ø,^i¸ž€Ïò=¯ªŠ«—ŸáþÐ7rkŸç¶!#àÑ .^ñëï~w÷‚Þ¡C‡¿ »‡ C‡~ƒIÿ |@ß?Øg29NûöÎ29š°\®èõ{äyNc-«ùGÚ¤}Eb’º<È@µœóÌÓÏqåêuæó9ÓÙ‚EYS5¥ »»;œ?†ñ¨Oš&T•c¹´4MœäÖ£®=£ÑsçNszwÈ=—N³sþ4^j„4«)ÂV, üd™S}Þ÷+¿È÷žå‰'¯²0Cè)y–ÄÑ˽ó1'^Æà>m42ÏñUMRì÷z$YNÑQúÅ€<í‘%¦­9LLʹóç·HMÊ è“$JF+xðë-Nhlš#Œd:=¤™a‚%XKšTöö8¸~ƒ+O=ÊsÏ|„O<þ~žúÄû˜Þ¸ÉÑá”$Í FHᘲ¿·ÇôàPWd ¥d)ã~ŸÑ`H¿1Œ÷rdhÀ5H<®©™ÏX-¦Tå‚ùüˆƒ£[”åïj2 ½DÓK4™6dZcŒŽÂ‡(ÅK²˜råñ§ùØ£OqåÚ!×nqp4LJ€ÖfCŒ«ªâÖÞÖÆi»R‘¼ùvß@l?m؆ª¬ø²¯ýãGÿ`úkžLtö·€/NGÅfç&^&Et™¬Wrˆ€4ÉBÅcCÄd©äf}C¶U'üø1 0Þ‚R±ºOjÐ:öׇ¸z脳—>­“;¸õïtG6ÀmßðÙ#Ô÷ßÿ ¾ömLf ’,å®»Îòßþu|óúFf³9yšqýàÖgx+ŸýIüÏüÌϰ8z–­ PZ¡´B+…w–¯ù=–3gÎt/î:tèðÛ C‡~3D!6¤JÁÖÖ£áˆóÎÓ+zÌf ò¼ÇöÎFã-“0ŸO©W%b]§3„N‘"¦ØËwô•Œéì¶¶¬6H²<Úú›ÚÒ4–Ã~A–ŰºØç.qž è,ËUCcãQŸ ïB!M™Îk –É캮Þr÷=yì£Bš„&¤-¸ç®3$‰aYV4Öá}{¿…À‡c˵àƒG–%Î$ ûšÕjEV HLŽQ£õqå]KÒ&Ó‹ù߸˜ê/Dt7Sâ“‘¤A¥(¡qe «¾š#q¤J mC"³éI?åòÕ[„` ®f29äúÕ'ÙN >ùì3WS­J&“9¾ªÈð¤Z“$)yÚ#Ïrò¤Gž¥I‚Æ30›Q•1{Áy‹sŽU½bU-¨ê’ªZ±,—ÔUI’¤(W&TëtH¤ÂÐ" D›²/J*¼Ô˜W5Mã°&Ó9«UÅáá”ýÃ7nrýÆ^ltŽ8÷%f³Ëå ¥Tty”u|È$ÁNfˆ4£.ç̦û›c6à .^x5Hlɦ ÇÁ:`ÍÕ} fûÐ’S;C¶zžŸÿ…ŸßœFºça§û@ ×ð%_ù<{eŸk×)ËšÎ{‚³Oû@á<‡¥CIMAÀ³æh’e=´1hŠ€sžÒ–xk˜´Oð!ñ¶ÁÙ&ÞhlCðK„w4Õ(¦é‹¸![Gƒkáƒwä½D²-$"Íð®ÝØGEšJŽÅbÉ|¾ ®JŒ‚Á`Ìb:#7Š,O(¯WNPZáúBOcòèÑ,V|Þ›¾†ëW?NVåµÂ•m¾8¦›~½åq2aÀy„­''ñBæåœÆ5ísƒ­–-Z /PŸ¨%C¢ð>ZÇ×iûž4Í¡±ŒÏ>Ì 7b¾œ?O DðmX¥¿„¿[ü?í¿áÕ€p[FÅí¹ÿýßþûÌ–Q;µ3â‹ÞòjBsÈßùž¿…Vš åf~SR>óW›Ï–#àƒü ?ú#?ÈÛ¾æñôs·¢+C ¤’gÎÜÍ[ÞòÞûÞ÷v/ò:tèÐ :tèÐaCþáyùëׯ#¼ñMoäÃþIZ Á;Çjµ`±˜“$ £­1G·öQ*Nú…•0äܺUÓT ðšB@x‹®–,n5,tŠî½)Eœ"{K‘žyç}t X¸tj‡‹ç%W¯Þâò³×™ÝšóàëîçÁ‡.QV Ï}l‰?8 K‘Š^Gù¯zÃ[ÙÞîóÜÕΞ١ßË)ò”eY’ !3 %ŦŠO*IÙ/¢˜°užåü€Ù|Á| &“ÔJ¥øà[²ŽI§m@†V•`rR)P¾fzÀl>E«¸/¤ˆY^Ðë É’Œ»ïº‡>9'É ãaÊ´·ÇÁÞMêªâ™çc°u‘ÄL€À=”JH’,Úô|CeÎYlm2®UàjæóçlláåjÞ¦ÐCS êjIš$Hp¶Æ:‡kŽ&ûdó#†ƒ1YZé„åÜáŒÆùÀõÚã„Ç{‡sŽf6Ã9ËÖ©-*YãmÃ3Ÿ|œS»çyî9EY7ä²MÞw‘ç ) ræ·–TuÃ…KsùéÆÐ¾ö¾nó6LXÆI|8®o”mø½\+Míèùºƒ@ ¶M›E¡hlM]ÇÆcT+Ø„MÐ_ ÞGlÌ‚hƒü¤@I@’g½èº°£Á%ËÉœ·}Õ7ð3oÿWˆ¶ñÃëÖÉý›ÿÞÁ£Ã SëuÓÅmô;ÀÛÞö•¼ñó¿”G¿Jš¦ËåW¼Ö(Ûö ‚o¨—Kœkð>VìŽî–à‡A#Cƒ›Ï˜-V¬ú}¶· ¼³(gé9ÉÁᜪ²ìL¹táÜ ïSÞs¸ä‰<Á“Ï^#I$uEŸfrçb ^Y×|äý¿Ê[¾üwóÜ•–Ë’A/g40[–ÔuƒQ†¼HÑZ£u$¹. lTš{ﻟk×®’e·öЪ"HóMtH…’-%JF#ºV“d(©±Ò „ Å1/,–S”RmxYœ® ^€C4€eP*¡?Ü"Mûlmer°ÇÑõçP8z&N™…Ò(¡ÑB¢|[cxk©m‰µ–¦®X­–X[á¬%è÷zìn¦¶ R.(1±1¡®K²,'+†Ô^P{t5¸®i˜/§”õŠÅrÆl1aØ1ï’c–MƒéRšåå-*xžšÀb¶À–ÐÔ|ô‘ñ_ý®ód‰æhº$M B¤Vž¨”D 4UÃC¯{WŸ}çì1¡ aSͳ 'î /‹ë€ë)ÁlãÈò‚ÛO†€µ RJ¼‡²\áë\ ”1ðC²EdþBH|p1Àð©BÀþáeŒ1$…–Ô€¨k’» ·˜Î7Ç'©l«*n?oãoòBÁ"_Üï÷ø;ïå਄ 8³;ä÷ÿ®7óÇ¿ñ©ªŠlCþ_âµC¬+CÃæº?}—Àg.8çøÖoùãü³ÿ÷ÿΓÏÜD P:ŠxÞyn\¿Æþðóg¾õ[»ü:tè€:tø/‘ôŸtû‡ç-‹“ç9·nÝÂûÀ|zDðÑ’lëš›!PU ÞC1ì³X,ðÞ“År±$x‹÷ï=MS³*—di,ÍPÚ D¬Ž€±˜³·,ÉÆ9JBeKzEÁ Ÿ³*kž»|“UYsÿÝgxÕ½ç9Z®|øqªý›¬BÜWÚ€RTU³©Ý{îéOò5¿¯àš<äÊÕî»ç,½"%ÏRš:NsWeEÓx´–äYSþÉ|ÅÄ —c I[¿‡ò)Ñ΃kÐJa¤B R£UüCKµ+™®fL—s‚$ë|@»!{1<®®jÒ$C')YÑ#IK;I‰"xÁ@htš¢¤FÈ8¿Făà\(|à¸%Þã¬Eð7à¹{)eB/¸6Ê’&@¿¡µÐÔ2º1¬ˆ Iå’༭(Cœ¦LXÕ+î»§O*5µ dXnÜx’£é!E^°½sŽ$“à ãA]ULgž~ô£ìlŸãàpF¹ªÈ‹@êhçíJĤqTUÍ¿èëxï;ÿ݆qï#WnI¾Þ0Q±©û[ßkâ|l(«º½,f ¬-‹+IÀ´R8çp>^*… ˆ°Y@ „‡˜2 £í÷ž 4×&׸÷ÂçÑ ðA e`5™ñ¶¯üƒ¼ý§$Ò{qg=¨Øp{N®=œ¬ú;i í}yA7Aà~ðG1&AÊší­>_øù÷óã?òC¼ÿýï'цyU}ÓýxT½HÃàK\ÇgÏðk¿ökTË[ôŠ„ª¶øö5J*I]­xÕC_Á¥K—xöÙg»7€:tø-ˆ® C‡~Cå€;éÁí—K;Û½s”«)G‡7Y̧8oYÍ'îݤ©VL±Ë9Î;f³97÷~c´&„€µ5Î5(¥Hµ‰iûB„jíÜŽB:ªéŠÅ¤f¹hX­,Riz½ïÏ<}~âYª²äuß‹÷µ ­i¼ÃhÃÍýwßsJªÕ’'ÿ([[}žzöËU‰D0ègh-ðÁ±ZV,æ ŽØß?b:‰VÿUã©KVÔµaè÷Glïœ"é Ð&Á$):+@Ê8ôE ¤DHÙNÕrÊb5ÇI^ Ió>Y1"Ks²´@ë4º¤Š•{:ÁYPmмGšôŠi¯‡— ’”…C#dtÔMES­hš ïž,àIÓ”óg/òê{æ® ÷£¤¤P!uÜñG ƒ% ¥ó,ê†ÆVà*IÐý ÇØd„žãÔ¹Wq×¹{P"&ù[Û0Ÿ’E¿]CB‚§—PBqsï2“ýëܸz™£Ã=Œ|è=¿Æ¹s[ŒÇ#ʺ‰Ymµ[$ÑñB–j\mÙÞ9OšõocÇÄSàDÀ³¦ô/4,ovÛX*ëÛËd{u¢=Vu<~}<†½÷h¥P2p¼{Eá¸pL¾%àűÎ&%ó匲^`…£#yn,äg9{ö®ÛïŸxþ™*ĉ¦§Ž^ô?þÊ×ÿÁoäÕ¿Ž²Žޝ~ÕYüêø÷þ>JJò¬`z°¹}!^îëÈ‹ã‹_Çg'0„ÀŸÿsÿ5Û[ÃÍkÖú¾ ³£=þÍOÿÚóÝ:tèС:tèÐáw:§øÈ-îøËc=¶ÙµöÎáš ï-&É0YŽÒ U¹d>;`±šci(Ë9-ñÞÞ¢&ˆöx£S¤ŒÁ‚hƒ ’:¬8(p˜àðeCÝ8¬¥ãQc$7ž¹Î~ׇHSÅ×~Å›[;Sà‘4Ö€ýƒ)ÃÑm !>øÞ_åÜ™1óÙ‚[3VuIÖ"„B©ì”«’ÅrIcP2îŒ;IrʪÁ#ÙÚÞæâ=—>M1Úb÷Ô.ãím‚ÑÔ¶¡rŽÙbÊt6a:Ÿà„¢èi ò|x\#Çq C Ú‹B@¹,éBh¼˜$Cjƒ2!%Î;j[#¥DÉèX°¶¡®KªzE.¶ʸ¾»{Ž»/=Ìé³÷£ó«Õœ£É>Â7è`±«#¤-‘Þ|®¦nêØ P¯°Þ‘ç9£ñˆtkŒÌ œÎùˆS[§‘@]W\ß¿u‰VŠ RvÎÝÏ=÷¼†Ñx—ÉbÉtÓP—+¼oȲœål†›îqéÒi„Pñ9×: "B¢d$Ò:1 %Ö:î¾ÿ ›)wþ6ñJ´cÿ°žŽŸ<Æå1qhœÇº“sõHàÛ Uü檬ðÞS[×N˜eû"~tiSƒŒ•ŽVïÖ“rÁcO?‚× "/h¼@‹@s8á­oû£Ü9Ï;Ck·?IùËéyÇ?½^ïü®ïa¾,™MWEÊ^s‰où¦oÂG¢ö§G/Hà_¾ðÂäÿ¥þ3'æüà™^&Ï’vå(†?"böÈb6áOü‰?ѽtèСC'tèСC‡Û?†¿ø‡ñ8 ÔåŠr5G¶nç«ÕŒåbÊäp£ƒ=êªÄÙ'E¬Á“R ´F¶;ò>€ Ýë¡}P)µˆ„<ƒc5™±*k²,a4è1öèyóËWn1å|ýïy+çï9G6Ú&Érç™Î‡¤:AÉ«—©«’~/ãɧ®±ZV _¤Óúó-­€°ªì†¥†vç¾nê*×®Xç©*‹ !†®ÏÕº„hûelðasÞ¹^Gˆvù¼÷?÷’6?Tð”µäôé»6‚ÐúD;Ê^ iR³êõ×¢!7u‚býõu "ðw¾÷ŸR– UUã¼çu]äo|ç_áÖH)1‰áh1yñׇ—%¼øTÿ¥þ3þÚó—Ø÷‘RÄã¬}„,s¾ó»ÿ7Ò4í^è;tèС:tèÐá¿hÆ'ÍËÉÏõç,Ëù„£ƒÌgqâ\• G=zyÂj>¡nJj[ã½C…nïðÁû˜Lïê#Œfb—· é*fûG4µ%M5ý^¬Œr>þè³ü§_úׯ‘eYfP&%M MUÑ4 ½ACÚ?ðÞwqæÔˆƒÃËUE][’Äj–’á°O’(&“)«£)ºZ‘ÚŠÙᔽk{4!ÚÁ•Xg±E+Íh<$M3”2¤YŽÖ/órEi‹jEY.)—S&7¯1Ý»E³˜ãl›‘@JA&¹:&pËÅ2ö6›XY(YA?ËÑ-ôÎAæ=ŒIJ‘f=’|€Ñ RŒphBÑx…“' µ0Ìœ`á Fàt&E*ƒñúS’z‡·G71«½Pc|œæ[[3ì8{êÖY&70¶cŒ„ÆY×¼G)ƒ’© Î9zYÁÍë7ÈYñЫ/ѸXŸW âj…Gh] [—-Ù_3ûÛ›ÖÑymcBÄJ®‰akëN|üh-U]¡Ö­Ò4 !¬+#5ªMý­Úse½ï½ëíZÃÕëO3½ñ$¢ßÇyÐübÁ×üÞ?~"`O<ï„+ kbR8vd¼üÄϽí«~=ôZòÔ\<»ÃÞó.~æ§~ diÎSׯðrlù/_xéŸþu|f"À#<ÂÞ§HƒuâãÚ°Ç[7¯ñOþ_?Ú½îwèСC'tèСCÇþ[šÏóüÒëË×CÔÖnm]Ãb>áðà:“Û4M‰wï-Ö5X[c­Éÿ"‰Œõj‰u±CÞ»šÕbÅl¾B›„$Ë!ÑÌ]$y©”„ºâÆCêÆ3èçô‹©`5qýÙ<úîG¸uùÆE¢¥“áû‡3“lRöÿè‡oõ!pãÖQœ†Öqj>›.¸råO|òšÉ”S|9C¹™rd¶d±7¡®bý]ð)ï„àWÞñïŽ l{_Up¬¬a8Ø:A–ÅF¼¸1ßIÔ›³»²¢à;ÿÊßd{Ü£q£5gvRþÆwþUœh­™.—/<ø©„€W*¼øu|f"ÀûÝßÅîÎcd+ŒùMUdݬxõÃ_ÌÃ?ܽüwèСC'tèСC‡“2À ^6‘~1À65u½Â9Ët6#MÓÍÔz½{ìù8ù¯ššÙbÆjµ ®–_–3ê£ «£)Îz¤IJS‡Hž-YN88šƒÐ½,N‘…4_N8¼ú(éüL¬L)ŒâðpÎhgÏmsýÆ!Þ;ÊehJV‡×XîßBÙ gV«óåŒÙbFÕ”4õŠŒc‡‡Sꪤnó„„45xëRÑŒI³E1$/†è,GjC“ m2dK×t§ò+b0Ý:‹ .+”VmÞzÄÚ¤ÿXq‡TH¥Ñʦy ©4B%¸*4$®ÄÙ%¶^Å@ÀÐÄ ;eÊ FÛÛäEÔ©¢3íì0Þ=E2ãuk¡ï,U]ÇHï1&6%ÌS‹ÖÕùôǩʙ1äiN‘ehm"¶$!qÖ’%}ìQD³àÒÅÓ,æË;»ÖzãŒíã “l3awξè‘+›&½µP"dج„X–uK?e+jÛ ¥‰á†Î"g];™oå2©Zî­A ˆ­ø@Ìô·Ùðפ^JÁjµ`zë™ éM,ö'|Íïýhó àöŸ¥]ˆ¶ó^Ü>MòyTúø»ÿÃa©$¶®¹çîþâŸývšºFAjRç“ÍíˆüM^9>ô¡!Ü‚,5ØÆoÖ%±õa:ÙçûÿÅO#e÷q³C‡: C‡þ çúâS|ëɲc‚¿þw¼ìÖ­››]e¥âÄWˆHh}8ç°ÎR6•u8× ñ(ß l UE¨šHn¤&H…P£ {S' šþ àÔnŸ»_}‰¹ê³½u–ÃÉ¡šR9Bq0]qæÜY"å ÉûíÜsq—²ª™L¸jÅõkÏ‚„þp„é ÈFÛŒOf0Þ¥7ÜBd‹ªa¹š³5èQN'L§f³‡GSVËï=ƒAN–å¤YÖ F%¤iA–÷Iò2KÑ©Fg)"ËRÆ•q­ À²qTÖ¡[‚çG*E"¦â÷š½T¶¡¶M›JoÐÚDR#ÊdQM  ­-Ý6„W/\SaË¢ž‘»%,—,—e[ëÙ²”‚Æzʲ¡\5è f9yšµ5‰1,Ï:‹‚"ïÓËhmðÁ£U‚цébŠ£M\ÕH2L’ĵ!6dÌzK¯ðþýÛ¹t×.B ªªÞ|0kÑ£-·uu‚@®×Ö­µÞhásoËĹ%Ñ‹Õ"†Všçüæ¶BhƒþZ÷@¼–lŠxS¢½¥Mü@çŽ -qöòÓ¥XÝ ¦©Y¹œ$Ío»—âÙ__ÚPÁ“"Aü§ÜüùÒ/ÿ]¼þõo`wg€1š{.ææí<ûäS€ KR®î¿ÀÙRxy+ŸÉ~ÿóþ•©!¾û¯ÿ¶·‡h£Z×GˆBଣ©+¾ýÛ¿½{ýïСC‡NèСC‡Nx¹’$á®».2QJ’ç9y^ UKöLJ–f$&A+M¢´VHwÕJ"IšÚ‚·èЀ·D 'ð± OZÇl^!”bÔï“¥š³§Ç¼îͯBž:Ãx¼Ã¢\"E žÅ¢â¾ûïGÈ(Dh•pùéOb”fk<àòÕ}P†ÝSçÙÙ9‡•“'˜<Á§)Mbh’„dÐÇê”ÒIfÒ^ô¸uó&‡‡GÔuE–eŒF£HG´±'iJ’dXëhš %*MJ Ó„l0™°h<•s„-é£"ÅZGÕ4²¬d ll j籊&(V6°°žÆyJÛ°¨+œ÷4Ç‚N †Ö%¹_’ÌŽp‡”‡VÓ‹ƒ)‹[ˆù„^½ /$/4Ƥxïbý¢«qÁ¡¤¢ÈŠ8Ý”’¤i†Qy𓙔Ĥ™ ¤BHJâ%O Þÿkïãô8c4°\TXïñÞá|\§B X[mhâ|19Î Dѧýªõ­PÂæûåÚPᣠ²(ËcÞÙî”U‰Tq½cý» ×¢ H¤ð›O1AÊÍýÁÇj@8O\Ï+ R*>ú_ hœÔb€Îùê¯ý#b,Åq5áúÏñõÜAþOœ¡F'¼á­¿Ÿ²lè)÷]:Eh–üÈ?ÿ!¬u¨¶¢²v͆çŸt¬Å…O'Å€WBè…xåä_ø…_ HBÌ;ðaÓÕ@S¯ø›÷Ÿ0 ºý:tè€:tø/…è‡Ïìs¶çËå’~¿Ï=÷ÜC–¥‘œ!1J“&qÚÿ¤$IB–æí^~û¡ùÈû¹p~Tœ² )b `PÇ$þ¦©ñmÐÛb~ÄÑáÛ]*í¿¤¸]Ý’aÀ{‚m>ÂígɲZo) Î!„Œ»ý*Öÿ ¡"ÙU$H¡Z€Àsb] ®7¤]Š˜{ dtÉÈê*fܧŒqHg)¶Ú6€öqYÛýã´ÿvN½©ÙÜü‰d÷Üé{xæÃOóèW˜ÍW„àùëá¯n2&²$ãÖôàX@؈ ÇÄ_lDùŠˆù+^9¼÷üëo28p.à¼o]JqàÙ§®ñ½ßû½Ý›A‡:t@‡:üÎÀíãŸÿµû0ž÷——þ }xxÈ•+W¸qã&UU±Z­R¢•Æh1 ZÇÊ·¸‹IYpáܲ¤^ÕñòvÊk_ÇIºbú½ uB];M±MІ{î:ÃÛ¾ä5¸¤‡Jk±UÅátAžåà}¬\’÷ÿú»Ø$Z1›•dI‚Ò±©@J2mRŒIIÒ”4Múdi‚”ŠÑÖn¤—ÁâmÅ|1çààËW®pëæM‹9UÓâÄ(C¢£µ;Ír”Ò¤YAQôPJ³Z•$Z’ô3ŽÊ9Zk¤d¤’8çq.€”ñkÚ ƒ4¦ÝC—¸à±!`¥ ¿»Íç½á!¾ø‹^ÇÑç±{ñ+ïxä±Çùð'>É3×ob¥fxöN*.Üw ëM½äì(åÜVÆÐ4¸r­Vø¦Æ;KÓTX[S•Kj[Sy0[͸qt“ë7©šÖ5´q‡­ãÙŸìcLBšdh¥ÚÀ(‰±wŽÔ¤üê;ÞÉ…ÓCFƒ‚ªª[«}EB»zÒ4qo?ZÇÁþ¦“½6PÑoá u ÇǵáX$¾Í00›Ð=€ª®š¦ŽéýÄÆXEHëð%kæŽÛû¡Í‚ëßUJ”Ô!xûOÿŸ¼ú x­£"a6+ù¢·~m.x’dz:Ö²iXgHáØÒ5ïü•GHÓ„ÿå{ÿ!‡‡‡8k‘RP¬êró{Ý~ϸ]x©W˜çúO—Ô;^~ò'’Ýíi¢7¢w~³Ž4™ñ§¾ã;8wî\÷fÑ¡C‡СC‡¿ýñÒyÞâÅ¿™LéE2ÄÆT gÏžEX,æìÝÚc¹XD"Ѳ½ÞG–ÇSOk°Mo*Üj;Ù ß ‚× |C¢$F+Œˆ¨ë†²lp>:ª'ÓÏ]Ûãp2`çô^(ç#±s–Áh‰Rˆdôú³ÏŽ»/áðh†n;é•2$i«ôÒc Ú„”ôŠ™$ØÆ!¤akk ï,ÖZªU¨,º¶Ì÷Ø»v‹½7±Ëe´€KEðR(´IZò'ɲÃÑѨ-©ì¥ãÎÿk·€2çc}d9&/0iŽNS¤‰Ö~<&˸t×9î»ï..\8Ãh4¦× óioL@0Îyò™g™Ìgì^8Ç3WnQ»€õžƒ½”‹#Ò"açÌ.£íq¤ò¶ÂÙ[­X¬fXëHtBQôÈÓïÁ¨]œ\;ë°MCÓÔï¨›Š£ù”,ÍÉÒc ƘhE?qLJ©ÀÁüæsŒG}ªº¡iÚµ°Þ¥g«c’âXÿÖÍg°®nÒõ¦üÚÕ/wîëš>ô‡ÇDWꦦq¶m°€²¬b¹`X‡üEÈHôE¬pܬ!¬k3ƒÛìë+­[D¬ÅTJáœc±÷$éx@íÚB³9wÝ÷æÛî¦àd=`¸=$°=çd[›(¥$‘)Ø’~¹à‘|ˆÿëßý4"Äórk´Å­ÉÁm¯/^Í÷Bâ/ù ó¹ õŸš¦áGþÅÐ+RðàlE„ .W<ú±C~ìÇ~¬{³èСC‡NèСC‡ß™x¹]/7 @É ?h­Ãr³£®¥ÚL#¶i­Ì‰ôr”ç .8ð ¦í6Þ#½Ã[‹G ¥!Q&V¹U%µmJ1 ö šÆóŽ_y„wþÚÇYU–,ï!µf±*qMÃéS»íD6 …$MR>ú‘rîÌJ+jëHÓ8IWJ¡µF)M’$$Ú& JkÒ,Ň@Y6œ:}k-!8‚÷$RiAßZ0V‚q¢1B€·Ø¦Æá7–wëlì†×­ÎZV«’º¶ÔMCðç<‹ÉÎïbt$Œ^D­¤è I³“¥HmÚ ÒŒ¤ÈéõòXE˜lcÑJpú̘».e´;&QI†ËWžå¹çžãÖþÓ²d±Z0_,¹që€g/_ã¹+WY”%§ÏŸ¦ª–غ¦±5A‘ Š>Ûƒ1ÃbHž$ä&!K’˜û 5 ç=J*f³CœQP)J›M¨àš®k¥yï/¿“{/&M ËeƒøÖ“÷°Mu[eñ¿“ÉM%OÜâ¤ÄpLÎ×)–>L’œØ§oë÷í´\\Ü÷Gˆ((mX-Hb&€ e PBŸ[!Äo•²ý£bcƒT%ùwÿæÇxÝ×°íy£E`²h¸pñÍÍp‚@‹;¦ýÇ?þ=wF;s§øùŸþIzù!‰Ñ\ºøû³ƒ;VŽmÿRÞ¹VpÜð™ˆ/."¼Ô÷¾2ÑàðŸqjwÔŠŽÑAãÛ,ˆÚ6ܼy7|ÉWóÚ×¾¶{sèСC‡NèСC‡ßþ'þœœÞ¿œÏë/´ n£Ä0:©6ÁtJ)Œ61ðÏÄä~IÜá—Bnzƃ÷„`‘"†³ Â;„­mÍ]híãÞ¹˜@@x³ ®qÔuu0ä<ôª»8}v—Õb…³¦ä:!qŽÊΞ;‹ób2|bRÞ÷žw‘¥ša¿`r´@kƒ1©ÖBF$}ÚD1@kE¿_ …¤ª*N:KSW¸¦á˜W%‹²FOŠCË€ÄÓ×’B‚p5v1ÃÖZkò<Ç»8ÙÖ&¡(úEd$Wn]§¬–ÌçGŒG}.^8M/Ï[+º@' ZJŒÖ$i‚N2²~¥ÖZË%“Ù)`0èqáÜ.½ê.î½û,§Oo±{n—ísg0½!7ö÷Y¬æÌ3&eŬ\1-Kæ«’£Å’7÷xôÑORÚÑNÀµTq½C)Bð4ÎQ}FƒãáˆÑh›aL/ïÓï éƒMÂÞá ’4‹–ûÖú/ÄPÑ’wÅáþ!²:äôé­˜Ôoc0">’馩¢hà£Ûc}¬.æÓØ¢àÅmóëÀ í¤‡MƒEžå·Ÿ)íH\*@`mÓZåÁ‡BBjRÆ€*ÞÑ–û·z{I)[‚'õRH–u‰¨Q£–¸ â+¾úŸƒ'ĉ aoó ÖÍëö`k´Küìe´ÖdiN¿7ä¹ÏmòŽ—$ÖBž<Ö6îX?8Ù:ð|"ÿ¹!ö¯4poo§ÿ0E‘à]\óð­°<, >þñëüËýÑîÍ¢C‡: C‡~C|ßr’Üñƒ§OŸŽSLâ±’Qȳœ,Í0Z£¥B ‰·MLro'ßR%Iôèbm…ó„j‰p¬µí¤Ö‡³kŽg<úø³<öÄsXëyÍ«/ñ†‡ïfggL1èã¤&õ5ÓùŠû%lme’—Ÿ£\­ØÚ0›­"iSI4¤’(©6ÄJ*IQdH­°Öã¼bgw—º±Xç)½e^–4¼PѦî-’@"%=£(”B4 Í|N]5ÔeMµ(™,X®Ãp8f4Úæ`>á`zÀÞÞMD%/ì2ì÷6IôZKÒ,!ÍRÃ^;QÖ(­ÑJ2èçŒÇƒøßQŸÓ§Æœ;³Í…s;œ9=æì™-ΜÞáì]ÚE¦' &°t5e°4ÎÑxOéc«@“$x!¨KYWìO¨]׸ ¨§,ed’¤!¨ë7&‡$i"ÁG©Ý¦>lD¥þ껹p~­5«²Þ0yﮩ[’*Oú[aàØOpr¿=G pìˆßWäy{­•_VÕ­4„(âÞ}€Ú³BdHÙfHqlÕ÷ï@J á¸:sI!¤¤lþõý¯ºï,µƒÊ<š°7H-7çŸX¯ÔlqÖ ÷'Ex݉T %;»[Ìgsò¬ È{ŒÛ¼û‘_½„ßò'Ú\Xç)oKö_‹/ìŸý£W|Ýð=ßóß±5îa§iÞ…öüµTUÅÍë×HÆoàË¿üË»÷…:tè€:tøÀõ7acW~¡ÕÏõ/øÑ{M2¤\¿~ÇûÄfŠ©ÖN¡6b€Ö‘䎫Ü\p $I’‘&yÛaç¥Áy¼·øAÈø§½ué=øW®(W+ööùåw~€÷~èq&󊳧ÆX"¡ á-ÓéŠK—îB©è@±XAÑçÃzÛ£Æf˺%üRF;º¢ «S­«A“¥ Iã—.ÝG][œs„PJ±l,+èm´ŠsV-$FÂÀ( £QuòPWHW‘Ù ª†Õ¢Ä(›†²\±œÏ‘¬õH%8wvLš$y†6Š,Ëé÷ûqe!MŽúlo8{z›,M ’$a8èņ,ewgÌéS»lúlm  z GvÏœa{w•e˜$ÅÙ€ó²±4MMÕ8ʺ¡lUÍ´,9Z,XÔ5Ucq>`} qëJ(2cêªd¶˜1_.X–%×o^eeÚ¤mˆ! ãqµ;kmxúñ'83locm¡u­Î6›iµwîø`m×2¤Œ!Œá„‹E/`›Þ¡u²9Ð×úÀÁô°<η·@*–2|Ù B Z›T2Á¶þ•V´8yg¤H-©e]£Ý!Aµ¿“l |åWý‰¹©”ÇÄ}~¯E@ÉèC¸ëÂuY“%mødšŸåRܾöpòU ¼‡ðü¥ M;À‹Š//ðåûWð¡}ˆDƀǦ‰ušµ4µ£i,³Åœ§ž|‚ïûgÿ)» :tèÐ :tèðY%ã¿ÄÿÅ?o ‹çxŸàëÉ£·OµeµjóMU·Ç}üªnÓoO´ò­hàb} ÷ÑàÁz×fQ¨Xu 1PæõŠŸú‰ç5o|6ÏéÝuŽ»ï:ÃÞòåA`MÔå ò¿®íz8±^€2Üwé4‰I¢Þ…M âFГÇ6?/%·¯œN’r!6Õ†¯Tø\Š!¾÷úFܪnâŸÊRÕ.þ·¬Ø»u“éDòþðéÞ¤:tèС:tèÐá·ù?¦7/‡øó’®€õ‡ÙîÇ)œZj¥7{ÿFR“&)YZ%‰IHt»ÎÛ=ïu;€µ uµÂÙ)Jj¤NÀdxi"¡ !†á…@À¶ë«J”VìœÙ…D1?œsõÊ>ͼD Á0µƒÎ{V«š³gÎÆd– *©¹zù&‡ «²Â6.Ú›el-Œ68G[e¨)²­5Mãèî¾û"ÁF¹P )¨=”.Ð8Ac²ø8hƒ”‚Ä$Œ³œTµÂA¢@ÉMy]’d(¥£]þÙ'X•«¸:Ù&;[ãM}! ¥B+Iš$‘ø§†Äh”8E—5וB’¦)Z'½‚áhDÞë“f9.HVeEÕXŠ­-ŠÁˆÁx TJ:¢tŽC£Úç<1 ý¬`Ø‘g=zE$Í@iœ6À²ª˜”%‹rEí,µ³ŒwO3«kŒIm÷k =F6¼ç¿Îƒ÷lÓïç-ñŽÇQÓT›ðÉ6°%Âr3Í"Üv qg¾ET‚ÁƒëuÕ^oÝ®8gñÁmj,׫k+|hɲr“Æýq󀈗Ëvg_ª(~ )ÑF#¤¢q–ÿúâÍŸÿ*î¿ïJ ²¢ÇÝ÷<ȦÈ~CˆE{=ªm ';ÑÖ/JÎìщ£5Dzj«ÿÚ@J¹®bÑý¢¤Þd{ÄÇñÄ‹„¸3xðø/ëçâÓY x~&ÃK‘ùW øö·¿3;#´R¬V eݰ*+êÆÒÔ–åjÉå«OóßýضM£C‡:t@‡:|ä_ÜI»?g"ø_Ü>á¿ók¢KŠ;¦üB ´Œ ù‰IÈÒ”~^P¤9i’’·ýöy’Ç@“ T ÕÓÊlˆ”:Š!༣©+l¹DaIµBê” ’8Iwë-~ð&5‰Ä#\CU®(ò„sç¶xðá{xÃD§) pRA’P­jŽg|þ[Þ“Ø×d÷GüÊ;~ž¢H‘Rpãæd3É4J¶!‡cÚ¨¸%¤IBÓ8–eÅ«|8Îzmƒ³ÁY4Dmã!ÚÖ­¤PE¢W&)ã¢Ga ÒC.>¾IFb k ÁsýÊÓÌŽhêël´¾Khꆦi(«ÞY¶Æ¶¶†ìîŒÉ²Hdög,V5UÕ ”¤WdôûãaÁ¹3[l‡¤©!ËR²,oÛ E–0æ(­X–5!L¤YŸ¬7BçCaðHêXÖ5†Ú ¬‡ÆK/¨\`åC!T»¯¯$>ü:ÞøÖ·€ŽÂ-yö!°þŸÖ±=âêcc¼ÕÍmŸsÍÆŠÛ&ÄÆ‘Éø‹Íc[Àq€$Y¶9ÚY;µm⊂ªª6ò¡­”\ÿ[HZB<‡üÚI°i) ¢í˜Ñ&‰+Ú dÓæuÉå§Ÿ$S®mˆ×ÿÿè½1Il9ío] ›ý6'@ ‚`ê4˸ÖâmÏWóãl ©¢p¥bØ¥’3çÎÜ,(åúÅâΰ@ñ<²ªðv!àÅ_ù^®°y8?ÍWËårÉ;ùg)Š„ºi¢KÈÚØ¸a-ÖY¦‡ìߺÂ7Û_îÞ°:tèС:tèÐá•“qqrÊ.xI! ÀËÄí›ý/ðõöÿÅ |¬/|Ek#–â$ùm-‰ŽÕn©N)ÒŒQĨ?bk¸M?/è}zY,ÍHtt¤IJbRò,‹—'R% t úCb½§± u¹DK&A*T¦]ðxçÛð5Q0ÂSqóæ-êrɹs;Üß9ÞúáFR“¢ª‡“§NŸB)‰s¶­„a1â£ù‰ììŒ9<œm×Ú­¥$Y‚1†$1äyÆÖV£4Ó銻.Ý‹N Z'h$™„B ^uïyÎ#½ï’¢ßg41 oÐR3Ìs†I‚ñL@*%¹Q!hœeïÆn\»ÌÍëW˜²œÏqÎR®”«%ËÙœÅ|†·±… \®xü“Ïñþ=ÆG?ö4W®í³\•”UMÕ4TU²Ô0œ=½ÅÝÏÄv€­1y–cƒ6 % M4Â:¬m¨êVxÐå˜Ñ« k™,—,šš E) ÐX“Q Éèô.çヒí¤Rœ;7YÄ™3§xÕß@Ò&ð¯ù×;ô±¶.á]ÿùWxðž³èÄ´Ù}ïŽ3Ö%$ȸàNŒúÃÇ|Ô!Ú}BIÒv§Ùñ{Wc´ÞY­d$¡Bà} b›…P­ Úi¼lmôñåÚ1 U iÔ%ÕÆM#dtØà Rð“ÿêQëé{ŒGcƒÑño³&ûëë–â6~žd€'ôú<þèãqBÆŒ¬HyÕðÀ¯âܹs›ÚK“¤Ü}÷Ý\¸p‘ûî¹—$I7Î¥Të0<¯)ç;ŽIûgøRbÁËÇ?ý'ÿ˜Ý!h¬ÇVÞzl㩪’ý[7ø¶?ÿ?¢uçèСC‡ßHèî!èСÃï( à…>ÿ®'á>ßÙÒ^èËá¶/I)O„¡Ùç}J~aA %9;BÀÚ¯K§’RÆŠ¼Öò¯¥B›h÷_‡Œ¥&iwæ5YÚÚ[{±jëô”Hç*~ðJ³Ó$‰ žj5'Í{d*¥¡µá·Á}Á‡Ø™.V(dhСaÿòUš:0Ü:EaÎÐ+T‘£Ê)Ižâí‚£Ù’x€Te…wŽ`I’óØ'?ÁSO}’»Î]äúõCêÚbŒnI¨$MbÍžïÎY`ÀÑÑœeYƒÚæìÙ³LnÅ]z¥ñê²¢ßËpe:™s÷½÷pëÆ§Nípóæ«Å’ÝÓÛèTáA‘e$Jâ} ¶•¸àX­”ÕŠÉþ ’D2è\]SNÌ8Bé„  ©jêÆ£T¬h´Î¡í[{ŒG}ƒyw¡…”eC–ú½‚"ÏR`+ÓÄ·åÄh¼÷4e>_amƒPŠàí1óé”zµÂÎgô2‡Îúh“‚³H`µ*ÙÙÂpÈl:áô¹û Š~Îö©mÔ›_Ç#¿úl]E2ߪ[0Ú°X-°“«Œ‡}–G3@àšf3©÷Þt ½·++ëc?ˆÛԱȴ0&‰gF{ÜIZ$ÆP-KH{m#›ýÿ˜íçã$^ ”Œ7é]@µçyÌM m˜ˆÙBÄ~zïZç-æì Æì]г÷’%†á0ç|Ó·ñÃÿâûOœÑ‚ ÕmÕ™ñFÃb„°µ=ä#|-MKÎú؇8œOâÚˆŒA’Û[[|Þç½–?ú ýøcœ>}ŠS§ÏpíÚÕ¸Êb¨¢÷!ÞîÁŠmH!œp$ð¾÷2[.B¢U‚’ ÓÕ„¢×ãox3{3œôŠ”()ÈRC×ýômÀ¡ ÑÒže ½<áÊ=¤JðB¡”áÌ™mŽn0›/Á±œÎØÞÑØšéd B´ ŠºªküDœîJ îdv@cÎÞu/i’Ƶˆº¢œÍ˜ïÝ$•„íêÙ »\RÎ,§3ªyüûìpÊͽC®]½EUW¸X,J–e $¤ª–«McBˆÇ‡ÑŠ4Q$IÌAH³„<7 9óE‰õž¢W •¤jjêºB” dœ¦6MÃrUbͨ?f;Í(ú}î¹çµuH“rþâiž}⩘ÃÐñõ>{ž›×¯sïë^Ïõ[|p<÷Ô‡€€,+P*k+áÔÎÙÛÄ®hc?>il€°Œ¡ÈS¨ùÄã?ÃB.œ:Ϫ\òê׿+r&“%µgÊ&± œ·ñø´!<"OÐëzÁdz$I7Ó}Ñ6 ¬óë,£þ[W/óú/x+½"ekÜg{{—Ÿýÿ¾Í)%n{›0@85>Å™­³¼ùmoå—ö§HM†V±åàC?żváî{îÆ‡ÀÍ›7988lE Ïh4ÂÙ¸f²&õòdkw¶)ŽïÎ_{E¯ Ï¿T¼r€u5¯{Ã[Ù?˜ÑXëfðø(~9Ç—|Åïçÿûãÿè8s£C‡:|NÑ9:tèð;ƒü:V×—û­/0ìÒ:a¼µEšfÌ ¤ŠA^Bœ³›µ‚ÍTTÊMÀÙú“´Qš4‰ýì1Y]´{þ‰¹=ÌOµSê<±Ù6Ú ´!5)RGÒïœÃûø!» ”!É L–“¦iÜiojç,ËÆ¢PȦdjfÎêxõ؃sž6R?DpørŽ(™=sÄÌyæ½Ú7±ZÐYVUÅl±B§Yl!ð,Ãxû ïÏ»ø_ÿG9{z›+W÷9µ3B)µŽeÙlHO¼ÌcÉÎö€ÔhÒ4å ozóåïãÑÅÑ„g¹*ÑB”¡i®_¾É•H¥©J‰÷1`.ˆ˜ /uB"Û@º~ ©w¹¾w “×à– B –ó I¦Ax„R(!Q:ŠTuLõ—„‰öp߀o¸òôTº‡Ò„âÒ¥3”eÍhØGA¿×§nÖZVeCc=YfAad ÏÞy”ŠÎŽÑ¨Ç­ý)ÓÉŠ$Í9]䬖+ʲ„å’Ä4xY¯ÇlvÄáÁ„7>ôyÔÕ‚BùÍDÜÙš*ä¼ñ ß̇ßóM¥ÝzboLÊáÁ½°¤ßË8:¨ðë½dL¯­cäx=JF'\78žfÇcBB¬“lšR+lUƒiwü}8>(‘€# PH¼h­°C(AßÃͱd!:J¤ƒ/…÷¡©¬…°"”‡ô¶/!¥$IsΟ¿‹ë×® Uü}׋“ádÖ€äIP†7|ÞÝüøÑ£s[áÑ* }RÅ?£®^¹¶YWÐÊ´¿·ãèh‚Tñ¼BÞ:¹¾M¿~Œ}+š´ÝZØüû…ëï$÷Ÿþ„ÿå»þý¿û·|Ó·þ%Ò4¡Y”4m@£\¯|Áb>åæõçøcò;øñúÇÝ›Y‡:t@‡:¼<žþ©†ÿá•\± z‹O@JE0Ú„ÇÕ壒$o©êï|KÒ5©I7Ö}çcȘ’’Ô$hé¨(¥ÈÓ<&ù'i\Ðf3±Žd þ"Zó½P”"Aˆ)µ/±¶!0EÁÎÎÆÄú»º‰DÞ$Iܧ¶[U¬ê …DyK& uÐ+ÛúME$¥F²Éƒè$k&ÞÚõëۺʶ1 ø(/Hp¼kÏC$Z¡kooó bS­ÌàƒJáo2VON–3ÎŽOñžwý2þ/ÿe._;`2_ñe_ñ{ø·?ñÛš¿u_X'†H™h0)ã~Bb2´2Ù’y]*ª­¡ÔÚDWAúiBt$ļ Ï…ópÞqýú5„ïðB¼'È€wAÑŠ+/ýb÷r‰»x¥¯–ÏÃÑÑÏ<õ Š|Èl±Â[·²€xï8Ú»ÅýÖ¿Íÿþ/ÿ)Î¹î ­C‡: C‡>ÅGÖ`ÿwºĉ=~ñ"tÃK}&>q[iš±½³ƒóà,O^ŒÐIB=?b¾œa´¦—õè}”T„àc¢¼÷4¶n«Ó ˽¬O¿×'1i;­Ôq-@k¤Òó”ÖÒxÐÚ¤FçÛ;Û uãH\M¹XÐöØÝÞ"IS¬µ4Vz%h¬GJ…×qÇßIEé«ÚÓ3žÂhêµuئŽ5ymª¾”š&TÔÞ²*Wh0[pp¸Ïöé ¬lW æ ¦ó£Ñ¸ n‹¿sŒÖº­ï“¥Ûç%Ö<úÖ UÂÔiæ³£6¨b@¡6&Vy¶9QOÊözÅFPhlƒÒŽÉt޵ Išãû(Šïcæˆl¿"Àq éÚÅñJ]/[}YßùCÿüñÿÚßãÖÁ”ªrñ1“!®ˆk,[ðäåëþÐçßÿ›Õ½¡uèСC'tèСÃ+UN2ûçWh³˜c‘ ¼ù¹988@›%£¿,$RfR‘šç-ãþ8Nô•Ž–ÝV†°ÖáœEiMb i’Ñ+H©ñ°Y%@(,àÔÂLÌ PJ£‚ 72"™ ±Ö®î÷ÙÝÙ¢?è!TUCS—x _tKêÆ2Þáœgµ*YM—à™–$B°ŽU]ƒ<QP&ÁVž²®¶™Í&”ËÕr‚è1IŽò ³EŃ=Ä;~å— j×à›š`2Š^Ÿ÷¿ÿ]ü±?ñg9{v›}ôI‚ó4UEµ\R×sÊåï\´voŸáF,ˆýý)&Kxðþ³|ò±O°µ½Mš$ìn¹¼ªY®VxZËx\iH”D)C®ÖZœ­Ñm ›óqˆÂRaÒŒr>;æÖ¢„D›„ ¡¤¢ŸŒ(mP†<ëSÕ‚€69J¼óhÁY\SSÕ¶®P ¤*e9™RÎKVÕgÎìàÚÊD©½*¥7 ÿÑê/ÚI‹R:¾.(…²Ñ©ÚcPÚ gNJ„s­Hâðîø¹ˆÕ‡´a§âV^˜¸¿œU€W&ÀÞÿŠ<¥È–Ë ëÈ•ËOsöì]|ôcŠÃ£9ãñ˜ÄŽJ„R¸ÆR.æÌfSœu”«·ní£¥$_]bzsÇ’¸‡¢0åì/qu¡eŸ•ø‰  *Q˜E›@@ŠØ~àxoÛI¯¢ªk’,E›œ#ïY¯Z‚kbÒ¼TXÈŒ¦±MLì·5iZ„Â)I d‚ÒEæpÕŠ²*IOÀqpã€~/Dï#¹ô ¬u„÷ÿãn¼ßL­u£éõûئ¡,+šÆÒ؆ÆV¸Fpñü.ËlF]7ôFã!JÇü )U¼ÏµÅ-K¿™±µ»ËáÞþ&dÏB*önÜ"îl‚½ó·¹¢›=´ƒzy‚Žö5viùÈGìœ:Cá} ]¢_ï±>0:nígYÁ²œá}À( JbÛdÚª7(!F“çÖ„w4ÞÓx‹T µ¨6«À9Él1Áz‡RItkÈÚP¨,.Nnâ=lo¡g<×ö°§¶{ŒFCÌÿŸ½ÿ ¶lÍÏû°ß›VÚñ¤Î7NŽAD EI4e%JtI–eÓRYv©ŠŸôÁv±dºJú"¹Êþà²M[–h“*Y$mÂ6’‘1ÌÅ`æÎÜ|;÷I;­ø&x×9Ýw°‹ös«»Ï=}ú„½Ö^{=ÿÿŒÞyúa`6«pÎáœÇÚ@^(B„¶sd™Â;µŽº®A@Ûô,òÜÊdšqr|HÛuLf³tìc1b‡`Ó9wñð”Oæ5.Ï.®î¤”å=9ä;þBúýø›iL¯éëÎMd ‘ò¤SûÃX7²È,Ë“¸DH¢Ä0Öü‡’©QjF™¼ºI)/†ô|1 îÐìøé£Ÿ~¶d§ÉÀ«¯¼Ì¶®ñBÒwmR}!2X‹¨$ëË ¾ò•_gÕ(º¦ãæÁmÚú%Zk´É1Z§OkQR"µf±˜ò•/ÿlÚàëŒ("ª¨(ŠŠj2%ËRõcȲ´ù–!$!x$zT¡¤”› ú¡§WƒŸ,D¢Oÿт d‡£à…\€oW|wŽ–78:8áï~•ßXæÿ›·üøßø+üGÿÉ?Ïã§—Ðy"!Ù.”S½ãüüÿÖ¿ÿŸðâoîU{ì±ÇûÀ{ì±Çw» ý¨pÿJfœûóz¾o½Ñ}1}üùZ+¾è)ä˜ä/J›ü1õ?ÏK2“‰üY ÷’š(R°Ÿ2yÚ0Bi¢R¸R`ò%5Î9¤R”UA?XBÓ¢òg(%ÑJPMJ¦e "ÒÔ-«õŽºn½½Þô…àÐ&&#(•¾nô¤íÚncXL™N ”’-‰Ac­Ä»ˆu%U™Qä9yž¡dJQwÞ³^ï躥RA[J†¨ÈóßÖø9={ÌdqƒÒÇ !xùÕ—yó­oC¤w=? EEŒ‘/éçø·ÿ‡–Û·xóíûtÝ€V)Å_ 2SVèrÂd±d1?äþ‡ïÐupApr|ÄÙ×¾‰´–әΖ(4Fgh)B#” :G ‘6€w‘LDКªœc‡ŽC l“F[ò|Âêì”;¯¼†Ò)ùdJ½j¨ò 笳h&×$Õ¤b>ŸÒ´-õ®¦i¶cµ¢ÂhÉÐ÷(Upãð6ç«Sl»ÆŠY9gsz‰‚,3ÌȲDXW›šmÝqt0EÅÙÙïÁ{Ÿò"ÌfŠÂ0 =gçç©EB)t>e×쨚–¢ÈS¥`–!TKÉ,¢OŠ,o}¸æÞKwx|ÿR)fÓ%k ¾þ«ÿ€õê,ml£$ °Ö"Ê«í<Ä1ÿ¹øÿ…€‘™ÊDÝSÝ éù¢ôøI&/Ę °}OÌÇLˆñsJb2È+ÿ{²*%‰ýs¢+„HM!Ò5 vèù¾ïý<Ͷf~°à½ûøæ;ï1•h¥qÑÒW›vůå î}†°«9XòáãdÐÚ\ÛÌ8¼ÓÚ ”b1«øò7ßáö»„hÑ*ÇÊ‚²š`LN^(¥±¶OA›ã†ßûâ:o ËÒóTÙC/À0†ämÒüó̆+ À·’ÿç×¾ßxpçæË,çGxïxåîÇùàáÛÜ8¾Í/cÝÀ×ßþÊ?QHßÛo}ƒ»·—<|rN½kñÞUrÌdHÞ>~Ÿ/~ßð•/ýÔþÅm=öØc?Øc=öø(®Éõµñõy_¶{¿•P×7ÁâZÃ*^/¿8×þá$wN^¥ÔH²“;%ë'ï¾2&Uy© ¤FèT˃'8›&'ËKtU¡µd:ÉQÚà} ,ÓÉc4mÓqÁ BÄ[Ÿ|Òe‰DP·-ÛõŽÍÙ…ð”J Æôuç}º1ºS”iðh| $x˺­9—ŠbZ’çm$e^`²üúsH Yf(˱†PÂ`-v0éß(ðÞbn1¸‚zí™L´ÞÒ ¢Ù0•šn]szYóúÇ^#þí@ˆç,Þ÷ØÞ1›Ï¹ÿá»=åå×?N–x©8¾}‹‹g2›$ïý$7H-‰Qà­ÇŽõjCQä!dòï·M‡íʼHçXôSPVS†n‡³=³¢bûôÛ[¦UÉí;'TeÁr9åñÓKÎÎw,ejqOWm×Ù´d¹œÓ=“lŽÖŠƒƒ ï¾{ŸívGˆŽÕåŠõ¦ÆöŽ"ËX.gÔuGÖ ªzƒ¼s—ìٳɒ÷¶[¾þÕŸ$?ÕR蟔c"¾ŒJéñ¹÷Ük^²…çϹ˜Ö¿H!ÈËcLÚéûJcÊ0Úˆh=>§i») †TÉR.ƒ@ ´&ØT#C€˜†wR./VüÌOýZ*òªDæΦa”Ó÷¥’©ÑñÁ;oʻĩŠyÚò+…6Ùh;‡|ÒQäZkŽ*ŒÊ0:G*M9™±-rL–#Ç!"¤oÝ9‡÷vøähP)hS©4Üp.)мUýX?r 2"FR®š¸ÊN|qóÝ1Ÿ°œðö_ÇÚž?ø=˜,ËÈ7ßû*‡Ë>ûñïåÃGï²Þ^¾0nýÇoêCüÍ¿ö—ùâøyôè‚apˆQŽ–›tb„¹<;çðçþ3þüŸùýû¸=öØcý`=öØã£ˆ/挤ëºžËøåUy7Wåo¹yßò¹£ E^&upH©ÕúÊÿ«4J¤6¡‰*C›c Æ”ãÆ8ÝÄçJ „`°Ýf@ç%‡K&Uúø~°)…^0¤º6á=~׳ª[Ð’ØõÈ`vG= ÁèCµ¿R¥ÁH… iûéƒC(‰Áb„JI÷Âaw-ÛuM” ó’ɼ¤,Џç=}ß'ÒAIži¦“"m€UÚdVòò{´ÍÀý·ßÇn×(Ñ"ˆÔ^cìÀéù†W^~Id>mÍ­C:Çë¯}’_ýÊ/ñ³?ó“üëúÄ“%ï½÷ˆ“ãy:F"Éê#| Gže 1òÒK¯³^mÉg7x哟äƒ'ñn`º¤(…4çkp]£89:`:-€ÈzÓpÿ›ï3׸a¬öó¨˜òÚÍšaW§Ê¹è™/RØ_ˆÉ¤¤šTìêë"‘®íȲ ÛwH=úÅMÚc4WS'çQ&‡¼áÄ (³œaÓòö;AŽŽ—Ì&G‡ .V5ç—5Z ò]rÿñ{¿¥kõ_ÿkÿwþäŸúwùæ;ÓÐ* BL-*RŠ1 Qa]ϳ'ïñ™/~‘¯¿ñÆþEn=öØc?Øc=öøÖ!ÀsYÿUâxˆÏƒëÅØÓ~õ17NNhÚ†¦®¯MêöF¤^ð±N¬Ì+ʼ@ eÚ¢IE@Pè¼ÂƒÖ9¹Î1Ú`tqò­•¢2ë\ߢÇõ-=áøÆ-fÓ$fŒ!ÆHÛôDïÉþˆxç"Ž®ßáÁHBR*¼ ëÒV-(•zÖE"eÒ¥´{7 )%A¡S@Žö|Ë6®™̘NÊ´­÷é1sí€÷š¢È(‹ c4ïiÚ7ôܽw›RD¾ô+_c¾8¦('Ô­¥ ‘ó‹-ÿÂþr|X} ®cË“/ÔþîÝ9â­·î… ËSºT)4Q{ò(€d~pÄÅÖrQ[>óÙ/ð“ïï`‡­3²\£Ã¹Ž–´!UBᚎç‰tŒ4¶m{¢Ñl¬£Ð%…‚#ŒÄËÚž¾k9ɲ1±>&åFçhÛÎ ïYÍÙ\^Ò¶;”’d&ǘ9¤Ð>"øp¶¿&¦›Ý - (‰:t dYI·©yëíû4c2-9>X0ŸO8=[a´¦J Š"§*sš¦%›]Ïå!ÅT±Z]°Ûí˜NK¦“‚'OŸ²XÌÉ´b}×Ñ45¶iñm‹Lºž•n÷C/PÉ$õ"õ^¼À…ñ CÏ\Oˆ*'Wž²¨¨Š)º˜ÓeoüÜßNácš?B$ Ê€ˆÖú:Q•æ$ˆäõ·DF2æ)\W*“½'FipBð é»NdøÇ„Þ¾ñ2U9¡iw×ïkÚš¦­?2$Øl/Ùl/ÿ‰ÚÞ~û-Ž+–Ë gçkœ¨xu¼“-*øv›ÿÞðŸóçÿÌ÷í_àöØc=ö€=öØcñœØ )¯%ÇR´É˜TBŒ)XM>|Rpëö-¼ó|ðá‡HFëDŒåXÑ%5ŒéëQ\”„è“ïXgeÅl6e2™ ´!F… )5Bj¤ÐãBÒ*'ŸVd*0t±ë8pŸMQ¡ŠŠùbBß9†í†<ö„è|oð#Î .mÍLV‘çA$/v¡T"ê¶OÉöÁÓ¶œw€DÆ€692F¬PJáEJÉá☪œ2•Š(›Ë ZÊ*‡2e`=F{”’L«)"«ËSÜÿ€ÁBÛ¡´Â‰´ýUÚ¹–ͶáÖí›,KêzKÓ8; ¢Å˜ ùàýwxüè>7nÞe:­8?Ûpr¼DŒnB BTdy’ ­ñBQN§Ô;‹.¼ôòK<|ø(IÓ•$“ŠÞwìš@QNÈDN™ç m—Â¥Ò,ŽÑZÑuóøº!“L¤ ‚HÇa°h!Ȳ S“‚TšLH„à·nßæòò’®ë膞¶oÉó”Ãh—IÚHÛÐSÛLò <ÚZ²rJ»Òù<#D‡’"mþ¥$ Eʾ@tÉ*ðôé)½µDMÛqúì”ϼô $=ÛÓ§Ü~ýS¼£$ójÆûv¸n—Ò1ˆ$å7Å’Næl..XΘLçì‚æ+¿ò÷èú†¢¬R ¡Th%Ç¡aª !Ð÷Îy”RH™Ĩj!)r ¢”Ƙ‚¨cª´ïÝ„ȵ ã*ýÿÅ)À‹C€oUìê5¯½ôIžœ>øMU¾ˆÅì)ëíå¨Fú.ƒÚù?ÿ¥ÿŸý¾?Æû<ÅÚž“ü_޹>xDHßÛ“§rïÞ=ÿ=\¬ÎNWL&%1 ¢`TR$’+•·ºÉ'½Þ´T“ŠÅÔðµ¯}õúœR!Gò‘ª*É«‚j2A)3ñHYæÌçnÝ8¤,snœ0?Zpv¹£·“Ä|FVNÐBì@½^Ñt-Fgi+IÝõ>`²œÃÃC†Î^“¨,/™-lw[\ð8ïl?†¾ žÁ¥º;)’>‡’¡÷ô¬ h­¹q¼LM.Ç Ö±Ù4¬65sŽŽŽPD´”ENž+>üð!RI´6UÅ'>õ)¶»ŽËõ޳³5í®&ø8N…Z -pågOßÕ,Ϲ`ŒTÑç™–„±-àèàJ¤ÐÌ€B‰HÏG!Äs )B)ÊiÅá"ãk_{‰üŽ9ZgÌÊŠj2¡8¸Ãv»ÅZ‡f¬ ¼"•iÀC EˆÞ';1µ8Çfóˆédδ,12é|”–©=#¦€ÌÕzGݶ´] Dg©ŽÒ Ÿþžï὇çä¾åÁÓÓ0gäxgñÎqÿùϳÝÔ¬.W©¯;¯ðÁábLiýJcŒf¾˜³X,8<8d:›“åeª0“­¡¸ªó1TÕ”²ÊP"Õæ ƒMçÁã4—[¤hûÛ7 Ñ£EªS€29ƒµxiPù”é|I9-p6⚆à>‚Ô =¾ï 2¤™ Á¡£CAhZçh)Ó&qì2úï=m×$ódÎ$¯è¶ÖkˆFÓ÷-m—úËfÓ‚[7O J:§ð!y£E5¡‰Rã‘øàùå7ÞáõO~‚_øùŸ§*KvM‡ó–ºéxåÕ×yçíoòþáßåOþ©‡{·yû›ŽUh‚à"(°Î'Ï5D²2å©.yütÅ'_û<‚¿F–•˜¬$}ß!•"ÏsŠ\3›æTUŽÖI’¯•DkEž²,ã¨È9XLØÕëuƒó‡̦˜|Âá6Ûša#XÜbÓÞg¢‰D•B ¥” } kkŒÉ‘B]䣄âäø«Õë†ké½#ÓY²ˆ„€ô–Le‰ÈÊÄVÓ[Ïzô—Ϧ%‘@ãÒ!…]B×[¦“‚ÊHš:@Ldx6­ØÕ-YQç9I×õœ_®iº|DII®R(²¬ «·.N¸qëg§OR¦1Y¤@D 2½-=Tå%Ÿ‡hª±®ïÚšsUQ7Êó¯Èw–gi8!Ò¹˜Òÿ5j$ÄDȳ4°QRá_`Ÿá£YžI$ej}°q¼>D¤Ô&Ç(= "J˜±Í"`L <ÈÑq±]qïè6Á9êõ%Z+Œ*Æ”}AŒ|¸Š!@IÍl^qþtM,–<ºxÀƒwr2Ekƒ1IégÆddy–l?!2Qg©5€0Ú{2„ô"‘d²Öb‰¿þÕ¯ƒ§( ‘j1§njš¦!ˆ4ôº*?IÁ|{À·¼ëÉéªrÊlºäüò”ïöÑߪXo/Xo/˜N C—†ßåºýÞ{ïq07,f«õŽap¥ˆ~”Çèç7å›f‹%Ûõjÿ¢·Ç{ì±ì±Ç¿—Éÿä±5Ëå·nßáÞ½{ÌfSì`yòì)]ÛáC Õ2YFݮԊ¯üÚ|æÓŸá×ík¸Á1Ø^)GG̦ò¢àäø˜““Ë%“jŠ `mÚÌ—eF‘›ÔÃÞth%ÉòŒ"ËÇTï$Kw6mn­µÜ8‚û½%vPꌒ±;ŽtÚa@N+n-äe’‡+)±Úc•Ai•|à¹Æ{Çn—ªç´kÉ&m½£kkººA Aˆ‰0F%Ê Š“gX IÓÖô¶çb}δœp´ä²°ÎʆHÛ[=^ñúÇ?ž‚Ï|`>©hû†²¸wïÞyû›¼ûÎ78;}ÊñÑ!%ç—S"Ðõc$ÒÃ06+8Ÿ¶¼¹ÉhW;\ÈÇ?ñYú!$û`‡>Õ6š«èûŽºéS~ƒÒdFsx˜ÔYf¨Ê‚Ͷåð`AUåTEA–åÝ8a2ðLkvÍ-L†&1B„ÞE¤©¶MJ2­!‹ø`‰>ÐwŽ£“%mÛctã¿óÁCò7íŽ(Ò–Vv<‘€Ž®XojœuL'™Ñióáx1 ”`1Ÿ³ÛmhÛïB)–¬Ök´1£@§¡Ï®!„@©é.¤‡¬ v5¾[³8|ó³'|ó‰¤]…ÎÝ»ó:!f¢Ç6Ž(äGj¯B1_Œ ”R Arw X‘(•Ò´]Kžé´ÍWé#áÊ" S žó€TR¾E 2…âQB0) 2cRÒüÕ!)ÐR£uD#Ád@ 9ß^òò{àüé)Úh„™|äÚá:¿*&œ/i÷l|ýDQM)Ê Æ$Ò?›M™N§¼öÚ+ܽ}“÷?xÈ“§Ïð»@ˆƒ êô˜†> Yƹ É:Ð)&ð™Ï|œ²Èhê†ïÀ0 þ¹ãñ“Ô`½m‚àBR”ò&Ö«Sþø¿þòWÿÒ¸áÛc=öØöØcßëC€ô+u¬—EÉÉÍ›|á‹_ä•—_ƘŒ®ï™/–lëz¬K²åÍvË“'¹¼8£©k./.¸sï.«Õ–Þ9&Æ0_̹qrƒ,Ï™L&,–̦3fÓ)E‘ÓŽ]Ó!… ,2ò,…ÃUe™d¾Y†É4R¤’"Z2ç±F£àέCÖÛ†¾sZjú®ÃyG•gU%Ež‘ç1¦d#Þy¼))‹,…­8:´l·5}×Pï¶dYFQTì䆖~ˆøàðÖb­£³=™2”yª2œ Tж­Y×)C`9; (¦ôB QëÍŽÝ®¦®[—>ñ©×8¹q‹ÇÚ㟞³Z7Äè©­Ã55Ûm˧äsië…Ê .ã8:¼w}Lúüþ»òßf±˜r~ºæp1Å:OfÀÚ˜‚Îb Ûm ÞâC¤È«gkÎÎ×¼þê'ù•7~5õ¦Çˆw–4mÓ° ç@¨çZˆ‚¼È¨JCUæôe·Mrú,3Lª´ñ–†<Ó˜ƒÄHn4Ͱ#ÄH×9BÓ"c­p>SD$F¦þú¨".©Ñ™L*ê]MŒAJC俦«q!%àLjÁÂÐàÇí¿sž¶·Ø±òQ AžŠÜ ¤ øäk?<8àRD‚÷×Òï,3´m‹PUY!C"ëÈÇ >1 •f·[sëð&«YÊ–¸"‘<—óyÅÑÁ ®ºÔ‹ó1¤¡Àx^ùˆ"‘f‰@IÁ¤š™ìºµÃ;‡TŠÁ¹”¿E¦2"ƱÁó!`ŒiÓ/d’¾G¥Î¥8O ­ÑÄ«‚Ïç’zSåŸôc=Ÿ@i‡Öë=ZH.ž#òCRÙ†D •†BBHû,+8XLyðî{üÜÏü?(Ê48TZ£MFUM8:>æ•—îBä÷îc­Mò¥. DÓcÚ¤¢1©`°ÆädyAðcÒ×xúì}Þïò"ãÖÍÛLª ?ú(Y¿ÊÛ®H~Œ©áÖÉ=nßæí÷~ýsíåŸ(ð ÿÕ_ý+üoþ÷ÿåÛØÕ]Rh!⹜#ŽkÛµÜ{í ˜,ÃÃþ…o=öØc?Øc=~¯¤L]Ü˃îܾË+/½ÌÑÑ ÞúÁR”вd¹XbŒárµb³Ù°\.Ùm7œž>£i¦ÓŸùÜ'Ù¬k”VäYÎd2c¶˜3›Î)«$ù7&O¡½»Úêû®ë!B@‘å©2Š"KÛ\!ð>â½#¥Y¦©ª!™Ñ!Ù5-mÓ#•LDi$&Zk|H±jå´ÄhÑê:-ÜY‡•1ô¹N[UePª¦·!%¹1tCOo-Î[¼F?zK®sªjʤœ2-¦ ®Ã:Ç®ÝQÅÈ$/ic’dÀ÷–‹öœ‹'—¨â6/ݽÉryÀ²±tƒ§iZZ“#Û†‹óSoÜAJEŒëf“¸­òëãù ?ÿù“ÿÆŸ×^½Í¯þ£¯0XKŒ)ìNÈŒÆõ–ºÞ1 ÞY†¡ãüò1Í7·|úã¯0l/ *Cêd ÑBÐu-}ß±«w©]¤-ª†~'ØmWTUIð‘¼,RFAUÒv=‹Ù„Â*ï©Ê‚ùlB–.Ï膓YâlºnÀ ±ë°ãfU“&””Hm(‹ )%»Í–HêsWÊH–8ï $…Š¢š–Lªä¿fr1…Ý)¥¨ª£§ç—äºb:1ܸqBðž·ß{Ìbž§<„ˆ!¢”HV£ñv #€K9ÁwiØâm½aqpîñ7>ÂúÄøü;8ºE™\17©Äµôü i£íÆ€1ßh¦Ó’Ù|BY¤ŸÀÐá—Ö:t¦ÆÇGB¼>ÈqXᯇÑ/¯H+~¨Q2åe’Í‘_QF„²Hˆ2 „Æd9Ï.O¹s|‹¾Þ1È9¹Y‰P ¥ähHÒõ£»'lÖüÊ—‚²šR”Rj¤LÃÀª*)òœ'OÎÆ¶1¦ýƒÑvðç“ú(©3Ä”¯P–%uÓ‘‰Ô"t!ò•7¾Aßíhê ÁvWS×5·nÝâöíÛüðŽ*Ê*O¶!Œç“L‘ã¹ÇÿVOøÁûÓüÔßú/ö/z{ì±ÇûÀ{ìñ{‘ô‹jÉ„Háf˃Cò¢ ë{¶»Îž3t=·nsãÆ1Jiú>IØ—&gypÄryÄÅå]׳\pttBSסȊ’²˜0™N’'WvM‹ê{º®ÃçìHl$½ c½&ÏƘ§u"*b‚ÄùT!hŒ¡(s$ã†Ôª*+æR¯û0ØQê/Ñ*m³L“ƒÖ©*O„4ðCD*…ÑE!¢0Ø ¨£À÷i4™òˆ¡%†!nϦٰm7L‹)ÓÉœ"+1Ú㜣év”DÊ\Ñ9f(ˆ#$—ŸATøÝ)«ÍŽf2bd¤ï;~õoð‰O~œßû€à!´\®Ž9;;ãͯ½Á鳧ܼq³‚óËšãÃÞ§tôÁ&»B5;¤t=»íŠívÍ <íé)g‡snóøì Jk2)S/zpÔ»ÍH†$Fç©É³Õ*úµ+ï@FÁZžêŒÅÍ#ê7è½æÞ½ÛI²®y–áC`:I6¥MÛѵ=«•À<™d1ùñ·« BDŽè»Û·<7j'rl´a°ÖYåÞ™Ö´ë—(nÝ:äp9cµ«Ùíšd[¨ f³‚Ŭäì|Í;ï?å¥{‡Ü:žqãÆ1³žp~¹"Sg‡”çÐvI g´mÑ‚è;®ê ´Ò4Í–{G·yöH\ûí"…û¥£|MØ´‚élÂnÛ@Hí ¹–c) ¤¬2š¦#úˆÉÔø8„R)qÖYé ùÀÙt®]=çãUªÂ•l]Ç:Âä)ˆ)hR¤ djjÜðvÆaBP9ù¢„®Áv-.‚ ¥õ?[r÷øvú‰Çú¾étÉàZd’ \_¾ôÕ_¦iÊj:Z~t²˜df 7T !²˜Ï¹qrÄ®nyòì}o¯>ïÜõð¸nxX­·×ì{2©È‹ ¶àìÀ`;´É1µ(8׳^¯X.Ȳ,eUŒS›øž?Ì/¾ñÓô‹ž»·^&39Î;=½ÏÅåÓÑrr}J~G’ÿÛUÄùþõ¿ÊÁíïKóĘÎ=Dø–ïÛ†?ò/ÿüôßþ/Ã*Ã=öØc=~óØ·ì±Ç¿ëÏÉ¿b:›qçÎ=ò¼ ®[š¶§nZž=}DæÓ E‘$ÕuÓ1Ø€R)„«šL¸}û67oÜFJ•$ÈRQ–%óù’ùbÖ†Ô2pv ëzº¦ÅÚ?8úÁr~±árݰÚìèºàJÊDt”zNl7!‰H‚„cÏ| 8sÖ_÷­Rm È2œutÀ,mÓÒuÖzœ½ÐB"¤&ËKæËd–§®p!)Š)GG79šO±A2],˜Mçx\ÇfsùB*wÀÚž*/Pd³y’ìzCQž`­§Ý¥²nRÍ ÖL½£S9·n0t—¼óÍ·1Z"ܽq‡]äÜ¿€›·îòÙÏ~‘ž³Û4ÌÆl„Qâ‰òãüºÈ ´ÒÄÖ’Og,o¿ó&ÖÛë6€«Þz! kwô}M?tXÛãÜ@Ól†dçȤĈ€Â#‚e·ÞryqÁùÅŽˆ njÖë§OO¹¸X£@i‰ï}:'bq4£œO’bL¥G '5/ß½É|1ÅZ‡saü^5B)†¡Ç˜ŒÁd:™M3àU’ó[ëi[‹’‚¼0,çSŽfÄY¯z./7Î)Kƒž÷½¿Ÿûžá#€L]ñ1=/®‚þ˜‚Ÿ-"Ádô×àº5EQ¡µA˱JˆB`¨<§(r¬u×Ù÷“ƒã”Î/4Jjlè±¾G©©µÆ˜l$Äm4Zk¤2˜Ì ”F‰ÿ³ÙŒ?ôŸûì'9>>äñÓSv»†ºnúçÃ0`퀵ï=Á{B8—¬;nÌ(òœ²,R¦p@Û¼¿nh»m G‡‡H%±ÎQ–SG\lÎð1ðêÑÛžY5ç½ûßH›ý1Wa¤êßZ$ð]™K×ñ³³§üèù<|t޳îZ qu_ülÞ{¬ëiëœ>y¸Üc=öøÀ^°Ç{ü®FUMÓFÖV«È$á¬%¸\ïpaô»¢R0œJ$T*EQHɆ"%‹GÇ'L§K’Cß²ÝlÒ ¸ôvÀûˆu‘¾w\žmд¬Ö5Í®%„@–%sžgh“!¸±¾MJAf !FBá‘0¦õkŠ2ÃZu/Ž`2MYæ¸a zúÎ&µ@׳Ù4 ÃR1ŸÏR¦¯« R Žo°Ýìxòä)™ÎðEËœ[‡p~vJSEšip°ën/4»-%}×óŒåÁ!fœž^º£B Zçhê/Ê‚wt>¶-Þ ^º÷ qÜÀÇèYmÎÉ9ºû ð3üÌOÿÿò¿òopçÖ!ßxvNÛ‰^ (‘$ä‘‚ßtÎìð&ýÚÒzÍë/’føñ´q ‘E1!+*´ÉÈò€ºô}(6%nè°CǦ¯i¥d1]Pf9Þ ©A*t»â©²”E…Q wyF·^sùX§ ³6¥)'˃‚DêÉ4}Ýcd<ЭÂn‡R‘ãŒÉhš–“`6;Ly¥YíVL'st6EëŒà!3†ªJÍgZIʰ˜¬6;V›1ŒQL«œgÏVHR_Hòj­ Sà{GŒâU;GQêzÅÅM.Ï\70áµ<È\„ªÈÈrƒwIÉbŒf–´Öh£0u‡. BÀ`}"Ø!¢•Be†ª*ADB à#ZK”V8—ž3A+|Hƒ «Õ¶‚(m¡ 1X|H[õ”; ÇÁ! %I! Þ5x: ëS¦†6†Óõ97n  äyÉñѺa›l£ª!ø°È¨Kó:¤T©Í"‚óžwÞý_ÿú[l·;š¶£ïzœ³øÆl@ôá}ʱœ’©mDkÊ¢ ª &“ Þ9la™LgX›üñB)”1ÐÂÅù%ýtàèøˆ/|á÷qúø’M}ÉË÷^ã`văóhÛ¤dJCNð©”GqJ ßeûÛS¼óöÛ.g)èr¬urTqˆ±ááê Íö’?ýïý%þçîóû¼=öØcý`=öø½Š´ýK7ˆ]ß3XËÐõ,— &“|ðìê†ÍvÇzÛ¢TªÌó 'SÊxžç(­‘&•!Óƒ¨ª Ú¤¡‚wmÛ²ÚÔ4MÏ0 t½ÇvBHJ­(d >C*Öë O¡ª²DZB s¥ Ý` œóˆq—IÉßRa¨2Çê@ß÷iðÐ{: ëXgÙÕ=ëMCÝ´\œoh6ÂXÃuQN8¹u›År†ÑàC$3³é”zÖbLÉÖo.tÁÉœžá¼#¸>‘&gyüô)woŸ°¾Ø¢”A¸†Ógg,3´tÞ±yúŒêø61Z¤a ©¶­õ‡ºf½íùÞïýÂur~DR·5ŸXäÔòù1}óko°^]p÷î o½ý€ºn©ŠðD'!mÕGÂg2ƒÏnס&Ï Z) ÕzÆÇúÁñ{Š\7¢°4ë§Ìª)y^ LA Vi†Aj„1(¡PR’kÔ)dú¬JcƒEæ“rNˆžÕö )ÔØÌ‘®?éÏT§iLòýk­QÚP•“é$ùñ­c°I±QïvtmÏà,¾P!µF‘Î%!@‹”¹ ”b¾X0™¤ÇÉûÀn·¥ë†ñùšª wD(Ëë=óÅœ;·o“çŸúô'¹}민ò2w^ºÍl2K­!ƒ%ød?Á§G2ŽC¶ßÚÕù·ôÑ»íŠÏ}ï°ZíÆŸ!­þSuaäÅ4€HÄ[ËÿÀ¿È—~æoì_÷Øc=~›Ø+öØcßux1 ªï{ÎÏžÑu Ë寳)!zr#GÛ I¶,]×R–ò,£mZ$‚²Ê1ZI/yº“—½§ç[vgçà{¤HÞs‡dRNÙ„Á Iëz†¡#Ï'äÙ„õÙ†®·„ø*ËE…V‰Ü ™dÓ9ëùº~Ühúk‰¶sž¦íYoZN>ÆRß<Þ[¬í€ÑÖY\ðh•cŒàìÁŒ1L_*¸y² „ÞacÎz]ã;IYNèËÑ›,ºžõvƒí"ÒH„ˆv`Ý(úî ƒ°Ñ(ìj}–üáJ±˜Ï¸ƒ­²ª$Ö‘í¶ãàø„ÃÃú¦Oió!p±>çŸûÜð‹‡G\^œð3?ý÷ø±á_åèpÎêñéèƒŽÏ ÞXÇŠŒžLFú¨w;Jž|"18†¾Á˜“ÌÊ Å¬©–Î:›äΚ$‡{×Ë 'G·q¾§‚Nd¤È J©)òŠ,+RÈ£”8ç軚óÕËù³Ù%ô¸<øèQBa\?f?[qp0çøæ ›Í–z¬FCJB "RM躚©R¡Y=½ÀÚ´åUZqÔL8ZN™Lrìd‰”cލëŽé$#7ízÅáÑ‚gç[¢ÔÛšG¿yð©á!¤m4rl¹ZTk¸}t‡ËˇÏëä„Ĺá:PÆ„ø4ÐDlˆô¶ƒzÅ©wäYF1)(« '$R’í®¦ëzú!å”eÁÉÍL‹ÔÆàƒ£ïB”$e™Ï96è¨pÒâlÚêÇL—©/`Ù yN>-z„ësÑ× ’@&1/“RÂõ8¡Y­Ïh›5ÖÙkbšÂõ1 ¤N¶!%JiªIÅÑá!y–ª•´8gGuÄøv; c 0VòÁHÀc “’€ÄA?8zëiê†ívK vTL@QT!étK×Ôüðÿ0ŸøøÇ¸ÿào½ýÖEnÞZPÎ*_q¹jøÔg>Ë_þձ·ᅨÉÒÖ>%± 4á:¬‹\QÎH!¡(G²eðA!¥Á˜‚e¥¸qçfR.H ^`­Ã˜ cr.6—(!‘YÉ|~€g-VXr“,q°è¢@fUªä³¥†þ⡬¨æK–‡ËTØtØÁÒ5Ñ7–Þ‰à¨Ï.Óó@iÊ\I©þU©‘!2Ÿ•t%Ä$7—ÂSϧäYÎlV’em4¡ïž{ûSÒâó7% ]×p'ϘÎfÔ»äÁ%™öXyè‘h?BµÉ8˜²i¶o±Ö‘9Ú(D0Q`²,ÛU%]ס¥àèøƒb·Ý%eBpô}@*Íb6¡,26Û–®·h%q!âœÂYwëÛ>#(M”¤¦‹‚rR2›Ut¦g³Ú!D@)MÌ‹ñ±H7FÑd„«ÞK<ÒÇ]=>B ‡‚é¬d:©˜L ”R©64+®¯SýÐÓ6»íŽí®¦ïzú~ :‹•L>x¬Ka„F¾ lžúrMÛtDëðvÀ½ïA¤ÐÅj2áprÈ`Úº¢ë-ï¾÷>ï}ð€ú?Äáá’¦nøÚ¯ÿ:?æâìœËË3œµ)‡Á;в m›Q ðÛ—úÿFèûžvó”¢Èè»a ÿ‹|¤çÁÇkå–zž<~‹?ðÏü«üÜßÿ¯÷/€{ì±Ç¿ ì-{ì±Çï|´0U¥¼­”ÜFiìÙÙ)g§§ Ö¡Ç„ñË‹ Ö«KV«5ëMKÝ:)R‘eE†ýàJI6Û–¯üò¯QÊÈb¶d^MqCCa’ç_JÉQ&™nÓ¬I;ǘë´AHhmÇl¾!F2!DºÞ²Ý5´mŸ¼À6µ 4»†Õê’Ógg¬Wk6—çXÛ£•fZÍf‹CdVᢥ@kdfÈŠŒ¢Ì9!2™,§Ü:9ÀzG×ܼy‹¡³¬Î/@†(‘CÍ`rÊŠõn‡‹ëÒ†1Œõ`''¬VkªrÂ|º¤Ê ”dEW7ø®Å Ãñí[Lª)ZŒu„¨øìïû4»Ë'|õWß}Ôé&RN°Õ‚ûï¿9’ŽÈ­ÛwyåµOóàIÚt—Uw!m¥CLD!&òˆà:•>="ÏX.§%ËsêÎ(F¤0üè#¦*¸{ë²ÌQJ2›N Þc²,)[b:†R î½üÎú¤:i-óÒÐ×ÍHÂ’Å{7óˆ÷"L§ BQ²Y™žÃå-ªr†ˆ)"ÅU–›#Ê$Š("EYrx¸$ø¤˜/&lV§,YÌçTe…Ö* Š’ÜdÌ–G)Ã(B­$ÓIÉtZQip0©rr£™LJ¦”E޳ŽÞv\œ?fZ-(²/ ùdBžÜàèw C:§”DŒMÏI¾B(…T)„@*äùã`IÍb>ãÞݼöÊnß>a2™PM&LªŠ¶ë躞¦iY]®Ùl· ýóÀèÃõÀ®wŽÞ¦ÌÆäÒq(¼ÅõÞ ÛcmG×5ch^ x‹T -Ó¹fg°ŽÏ~úS¼úê+,æ3Þ~÷]Ξ=c·]±Ûlèºkò¢`6_œ£ëÚÿÿ\Ïq¼ò±ßÇfS§åu³ÃµÌä#Cˆèß÷šŸþ»ÿ‡ý‹á{ì±Ço{À{ìñ»†ü'‚ø¢5o¹±§±‰ ÀRc Æ$ÏùàRH  ’e Ó¼"¬kžZM–W„H² h…T‚ínà—¿ôu*éÑR°Û^Ðu;–‹c"‹ÀÄ$“&ËÒæÊ¥Î÷Y1Åz NatÆÐîxöô wîÞ!™<å¤Ð³]Ý2ôŽ¡©‰R2t5vH7÷¾íR°˜ÌÉ«YŠeS%6”³ú΂ðI¾>B?à¢gÓ58ŸºäÝ0 …`»Ý}`¶˜±l{ú¡c²\0tž~h‘¡`s¾åäãw¸S7<Ú\‚¶­Ĕخ*^yé%V—[$)’ˆ.mZ} Ž®µL&9È@+ ¦"òðñ%ŸûÂðW¡lBâƒçrsÁâøõë_üùŸâGìO°\ÎxúôœÆTxGÚÊú‘ Ä@Œ‚(5YYÑ­¶4]àðöm„„¾oV¡FÒ&…L[z•ÔÄ´u 1%‘v Z2½£ÈKò¼D~}¤ÇÖkªå!“ù’ÓÕ ‹Â”9“YÅlVѶg"x”T»ÞÒ¶GU…4š"\pH'‘Ú­á(”»KM!0UL&lZÃuZºpq±æÝž ”d:É9˜Ì˜N' Ö¹1õ¬“*"˲àää€<+ˆÛ ahê×G")5? %RˆaÛíèû†Éò&‘¯ÁÐæ£×µ)ðN‰0N%ÆT÷ÊädH\P šºAH‰—:åxO‘ç)E_ ²!ãüü‚àgq}Lú¾ãôÉ;ܾ÷¼·QÜc=öØöØcÿ¶“ÿñö3ÝÆÀGBÈÇÍQ©\©¢w%oNÕ]ï¹V!XÔÐñäÃ'œO'<{v™*ÔâÑ÷ÑC“‚ó†nh9\‘娭Çn·ˆ¬`R¤s"Z€”Ši–±©z見)íjË77oq|ó&Úd´mlêÞ²fØqÙìpÎ"…¤Âqr|D7zÙ+-ÙEI3ìÈs“<Ãc›$¢$´Í–à{ðIe b¤Y¯x´mP“ŠÅ,£ë:Ë›xè‹PEf¨}AÑ]ðô²áàä„!/¹\=!h»: +ZËÌH¦³Š®kR_:‘Ö9ŠrŽCÛ["Ri,š™ßqv¹ãG~ß§ð!5(©@Hš¶æ{—óï/ÿòÏÑ6;nÝ<äÉ“sÚ¶I»GHOë¤Lîs¡4.‚ŸÌÛ ?àÆK¯ð•_ù%r“‘ë´ R¥žw ñjËx¥xiûëÏ`º¡ÇtM’ï A[¯q¶Ã»»Ì'KæÓ9ˆdÙ ¨w ÖZº]Mð– 4^kò²`:Ô»·[ò,gQNÈ•$3c w× :&O»†Q=©J./6 uöˆä‘FP ç[NŽvdFdyF× YžãlboBJf“äYoAH¤’D.)[ü88€8*#"“éQR„Œ Ã(Úëð¢DŠçMÀ5[LVbÊ uÛ³Û5TÓ ©%ZIªªBgJ^‘]s–Ö{ê¦áÝwßçéÙš®wSdÛí©4RŠ1˜Q“i¨ëšÕ¦æéÃgH[§:>•Ñ…ò£aTÚ$"q1‚HmÒ Hˆéq"¢cD)Æaƒ$3š<Ó”eF™g/9>\2›Vd™ab[ÓuëM}ÝPÒ÷Þ{|ô)¤pâÄp¤ö…øÂsÚGOð©"ŽÇ!%"U˜J1š‚#ø0·ô³=}<`,–|å7È´âK_þOž<ÁÚ!…‚Ju}Íìº&5?HEQ” CÿÈ6~äRû;1¸8?c’ ʲ «[°|dLD¼@¼8جžñÇÿÔ_äÿøŸý[ûÆ=öØcý`=öø½†x]½åÁòÝ G¹s ôC$¾1†²šàí€Vв˜‘W ‚íaØ ×ç—‰|ˆèõ ¯Ey‚§c–ÍX,–£'7‘®¼„)òÌP·ŽÉò¼Ã `ò’¾«éÜ€ÉJd œÞÿÉâ¡ B o/éëZJ–e™ˆhÄà˜æ%»~಩±ÒpxtȬ¬Îayíõßî.‰Á¥­¼Î)ó’|6'Ë4ÍùŠ(‹å’à{V—+–‹’Ý®`·©™g«RøÙjÓròêMÔ¦åäÆK(eP›Kº¾&ÄT–g9çÛs7àC¤Ò3fÓ%Q$R'xJ f3ì“§ÿûù…Ÿÿ)z;ëŒ"/ÐJ£”-#Ipâ¯kÇ!FlpÎÒ¾p¬ÖÔ¾àÕ»¯cðtA¡„ t=mÝ‚C1ÚP,g,S¼K®!R×;.WgÌgL*r­Ñ€÷ç-‘ˆ”†\ªdS‰>5,ØDÖSóE"ÿƒ”’®wœ]ìXÌ'„QR¦áDŒdÆà=8›ŽWð©…¢iú¡£©æL¦œˆa”Â#bD™Éñc ›«Û-7Æãñ¼*‹‚ÐH-Señ®ãAûŒÙÁ’ã›GD‹ù ï.&[Œ÷éd‚‚,3<;¿àÑãKV§ÌtÁ¤ÊÉŒf¹œp÷Î Jj./×¼óþ}lÝaûÂL˜.snsbrHDCTàGýtšò$ú>Kj™ò9dž†j2Ù‹vÛ]’ü+I‘ç,ç¦Ó­³é„årF–g $ζ»–³ó5« Ûm“=¼K¤]Ȫ“–@H™jE²©H!p1£OÄ>Œ[z‘jCLõYfˆ1༻&ýR|ð4uäüâ”/~áó´mËv½æÝwßE…’)T²‰MïS0!½d¹8@OJV«]×~ÑÿÎøGÿàor|ïX¯wë „æ ÊTý ’XÛ’L–¹){ì±Ç{ì{ì±Çï â/®¶_q,öþZº,‚BJ‡÷%EQ ”¦®k2•êÀ<É_—ç4CPQ@®5ÕtI59Dé ×y‘È)%rR&¿r™<ÈwË´eWwl/׈ŠrN³» m.ÉŠ¹Éi/ŸaŠ &¯ðÝÛn™““e9›vǤœ¦{߬$ÊŠ™¡ú;Xœã´)ˆL^€Ôß9æ`9¥(4çç š¶!/ŠTÛ¦ ëó‹iÉåvKÝwd&g[w®gÛZNÎ8:¹K^NX]žb‡ŽH@ÊÈñc~ýk_E+ƒ9óé-J©)µÁ ÒÒèÌ€€Ý¶AÍ«{gŸ¢HýíÎ;Ö› ŽNîòàƒ7ŸƒŸú»|ßúç('m;åæ¹Ü<ŒC€$<ÇG0: zièÇäΖ\^^Ò»ÈìXß–êb c ™l 2mVåXó&piV¡ÐЬ(°ÖòᓈõåO. ™.áÛn‘2Òo;6ãç²cÂ}5]Î ¬»ƒ¤QéÜòž =^:¤ H£¤&WÉÁ”n¸¤óiàsÕ½'¥@i…sÕfdz³‚ãƒ-LJ³þ'%Js-7·ÎbOÛòÕ†~xéå[<¨;•¢­w\\¬Ñ¥°¿)Ê)Fg¸p5É2ãÒШ Åø½YùRIb‰ôzÇÐÖh­p[x¯µLœ?=Åy$Ÿ×õãÏ%QZ“gIÍ⇎íö1ózN~x+QÀ¤ªpÞrv¶JÛwo‘Ù„érN™ „Ÿ¢³‚vÝ £RUe_ïÀh¢Dgv;d^ 7ÜI™!-‘Ja2Ít6%3Šaè8»XcÊ0Fqv¾áì|M½kR+Ä0}JõOö1ª‘ÒD†ˆ‹vꄤ¶ðo>¸k«ãŸ1xP"Uþ…À`‡1§#Œ6 1àãç~îçÆ&€1šÉdŠÖšËËs†¾O•#«÷ÞaÝèoQ]=ÇïÔöÿ ?óÓ?ûçÿe=9ÿÇIœO*€çžŒtõQrqú!_üýœ/ýÜ_ß¿î±Ç{ì{ì±ÇÛðÝnDã˜>.H’ÿDÀ¹ˆ”(A:²*IdK–•L7ºÂ‡ˆp5m—$öÓ9*ŸbŒ!…•!zÖ›sB”èÒÔN’-§ežBÚæóYI‘'äœÇyÏi•szº"´=Õü˜ÝnEW¯12ù–C_Ó 5&r%YL—}U‹Ò(º ÈJ‰‰9nhê6õÖÍd’# .P)ŒŽàR ØÙ“ ª"cReܼy@»ÓÔMæéxùµ;Ôë†ûïHŽMç8¬JòiEXŸQ7=¯¾v“Í;p&c:?¦,f´Í†è,¾Åá¼äèä˜÷>xŸ¨ î½”dÉZ+¼’i³)$Öšó‹-y¦ùüç?ÏOÜ<Ê—BDš®áøÆKüÚW~™ànß>âÝ_ý&b^%µ‡¼òC§Í}$IÚ% •@VShZšÁóC?üÏòã?þ×’l>D¢ŒR[‚‚ˆÄû1Fáš¶>[ŠqX %J¢(ÐB3?:L}±b»ÛᢠJ8\#•ä‰`·CŠ@s1àG#‘c ›;ì#ÛÁ¦ ³éœô)ÏBŽ6€ˆåÙÃG,¹}rÀy=0X‡1†Æºñßx”48—†*ç—[BpTeN ‘Þ:Ú΢¥(pαÚ4<;ßR䊾wèÃ91zŠºMV™T3º¡C*…Paäc£5À;>z‡»·_G™"IØÇ|€ " •Â)÷ÛÍš®o(g‡¼õµ·Ù¬eDëj܆©É@À.Û"eNðŽ“íà|uÁåú„äÖ÷‰RÑE‚Üd¡Èó „K^÷ 0*"‚ÄDIÓ¢ÈA+°qð„a`/%>X 0Nˆdx—äøgg—d™A)µkU™“e:ålvÉÞã<äùý0ŒÖ‘(Äë ŠHk=Sýb þ:—âšüÎÙ¤pÉ*2 C²\ ƪÌäŽ-£’@is¾Ù45}ßC /Jb–þÝ0txP*^_{ãÿ/«€‡>äp™‚­Ø%@„º>ÏRRf_C_óÃôßßöØc=ö€=öØã÷® £HÍyצѴ™“’²¬ˆ>2©&ÌHƒÚާë–E–3›.‘&ÇIƒ“É›ÝõÉ?M¦AkvB°¼±@i‚ù¬d6­˜TY¦ÒîSª´mÓšªÌ©›ŽÍ¦…¢€¾Çu;œë)LV’è¬ïãv°ëZT1ÃK÷ÏELÍZFfó)y™á| ë,Â9*5" O¤mxï­^»MU2%89>d³^1t;2˜³ÞœãBÏà,™ÉéTN¿©q:c&-[§U†éôOßg×Znßäô씦ݢ„&¢È !"tòÇQ屿ôlç>óiþöÿÆã–üæÛÝšƒéÍÙaèùò/ý ¯~ò÷óà+‘¦î('WmqLnh¥RîÃ(åϧSŒëØí:>ñÙ?ó¿ájoBR/ejn¸:F_<<'Lñ*g"B éczkÙ®×|ì3_$Ç:«¸ÿèÉì@ë¤ )ômµ¡Ð`”I6FɵT‰øë”¼B¤÷Žm(%äZÑw=³É9’¾#*hVè¦ÇÌæ”EEªiÅÓói[”ìêŽg§—-+–‹t]O¦ÎëYmZŒÑ@¤íz†Á²Ös&ªf¶˜â| «+ŠŠÞvIÒïÆä„GB°Örÿ÷ùÄǾÀ‹ I “:)%D c”Bâb ÙmÈ I¿Þ²‹)[„R­PªÄ¨È®npÒ"µb‚Ì1à¼ÅÏç÷SXa ©XT3&'wP¦dµÚ"…çñãgU LU‚0xCŒ<¾n@kIÄEˆ!Rw[„ä¹a³êˆH¬µ¬ÖÉR‘–Ë)“ªmHið(d²VX—Þ;š¦Ã .MŠÔécÀY›äû΂O¾üq0”†SiÛàljrð£%`ð×U}!¤Ì€çí1)âóPC!yžS”Eúº.å \}­+»T:}Ò`Ãÿíƒ×ßÙ+xß÷<{üóyÅf]C]^œ˜†RޝWƒ€ôì¼xúG7îpþìÑþep=öØã·ˆ} à{ìñO5¾“ ^ÓG`¬¼zûÊ ,…"Ï’~>›R”%uÝÒÖ¥h))²ä•¯ÊIò¦ë›WÈ<‡Qe…© Ë9‡ÇŸ,™MJ”d¹AJAYdLª|¬Ó)‰\IŒ–”eÆlR0VT“/–.Dvm‹²¬¢óžÞZ¼Ôè|†ÊLÊ rì]OwÞ‹ƒG &“i }; Ü@ÄÓöõn‹;ÞÀ·6 ”b³Y#%|æÓ¯s||ƒE¡èÇé³Kú¡E ‘òl ˆ–lq@™ETß“é´9Dˆ‚ívM7Xæ³ ¯½ú ï¼û¯~ìûÒ0Ñ‚^f)œn<Æö”2ð±/~ŠÅ,ãoýÍÿZ'?~Œikýúí—øÕ7¿ü‘ãì¬åGþðãÍoÜ'6-f: O’¾#"a̸Úß+-i75^eܸy“÷ßù2ÛÍæ9٠쑽šÅ‘8ÅÞãuÄ]’T{‡–šÏ}ÿ’“ù‚_þÅŸbÓÔ„èØ®.Ø\žál‡’©:N QR¡t†@^×W†\Ÿ"õÔk““%ýÐc‡~¬ž\Eºº¤·Ù6,–¶»f´+$r¯µb2™°Û¶ûÅäübCèû¿Zʸ®C$Yï^~íûyó×~rÿ"¹Ç{ìñ[Ä^°Ç{ü®D|!´íy5`Ê ª¼àpqˆ7:+hêšÁZªÉ’Ú´‘”YEi4JJPš&HNŽØn̼âøhA‘²L¢µÂhÍ`Ö9º¶GÍ4ø‘ % "õÔk­ˆD2£™LrCÅlVpv^ðôé)»ó59½4(] „ÄET’ 4ƤÀ:ï=!FŠ"c¾œaФûÀ-2Ýÿ'ß0‘¾ÛBdVÍé6ÄñçuÝðìéŸÿâËÄB‘Ï–\lw œèú“ˆÆrq¹åû¿ø:¿ôw~’ªœ01B¼ÖÜ\ñàIÃjëøÔÉ->÷¹Ï¤Áœ†ˆ@¦!ÀÆkeÇ{>ãG¾ÿSxŸÂΔLsçU^"•&¼höÕ7~™,‡/ß‚w¾Æ o‚# G;£ü™z'¡¨`½æ|}Àþsÿÿ×ÿâÿ„ kêik,x^±æS€ZY”ÌçsLfPJ%Üut]Ëf³ãÉÙ#ÞúƇ|Ï÷~QFyøì¦Kƒ¡ ã×r¥1Y–©2$"º@gù¸‰ ˆé|²L2C ºÝQæJ剬¹‘)´%>|ŒÐ†¨GÏv„§§k‚ܹqÈÃGOyû=Ë£êÖÔ5ggçTÓ9·n.ج¶„‹yÉÙùçj:%^DÊù ¡«QJ‘“H¦ý(á 1NyÖ†”Ó>ÖÖ½À5iÆ1(CY-‰xr•1›Ï¸Ø\^{î=áau9°º8#ÞôdÕ© ZJ‚‘h™§üŽQJ“Ó÷-2)ÇAøðá[xk©/±XœÐ‰Ê5eU‘Þ9Bð4õ%EQ¢U S¬ª²0H9†DŠ”c¡„¤m·xïȳiaw¾bk &ÓE†’ÉÇß¶¶nè»f$áŠÝv5¢$1øk¿÷‰ì§zÈ!©Y¤Lƒ¤$„çÍ×B‹‰/’ïß|áñWWþÑ’C¸®it.© t×£´ÁdÉ*0 ý Ÿ#~äºûÆ´¿­!À¯þÊ/ñ¯þ›ÿSŠ"c·àB þ!½-H Á§àK Þrtüòõst=öØcß<ö €=öØãŸj|Ç €kòÿ‚`ü!$ZifՌÃc¡’„7ÏsªÉ¤Æ"±>’™© ú(Ó eUR97NΘO òÌeY¦éËééŠ‹Ë Z ò\£”¾NùVJ¢Tò¯¦µô]æ™!3šÌhf³ ˃C拼PÓ YY Š•tž‘ç©ælpÉ÷«"d™¢ª*L‘ÑuÍ¦ÆŒÞØ~pD¡1â¬e–£¤8ÐG(ŠTYvëÆe5g»ÚqzYƒl6[¼ó)ñ])Ü0ÐyÁk…ǾM[ïA±¢%׊ӳ§=çõÀ¿ò'þ%ÞyçEV‘kÉ€c’ü[&ÊSÔÉ-~è>Ïõ—ÿr"9cøžž£ÅïŸ>¡m·×ÇÔ{Ïòà¯üS¬>b(¦IªÃH;$c€ÿ|–¤éJKdßàuÁg>óq~òïþÍN•ø\(#/½üñõyíõ×ù…_øy”NsñínËzµ=ÑküÝ/ße~ë%æ »-o½ûõ±+^¢Ç¡ .Dz;¤¼Òã1þB T†É2$rÔ/ˆ1Ô2­QZÓ÷‰˜]mj¥ 4CÏÕ ˆ$•éù²ÙÖ¬.wä¹âârôÊR²ÝnY,ÇÏ;P7}?¤à¹Ú´6´º¤Äá‡w=ýÐS”3Z©yüøéa ‘²˜¡¤A¸y|($JŒ WÏ[ù\Ç÷!胠˜L¸Ø>Ãû~|Ü’]Àºž¶iÐB¡MIç ®ï2=fZeèÌ ”F©üÊL’Ú¶fz¤ÒoÑYN‘|ˆt›5Fxмdè{¢w }ßâœCƒRrTö(<­2é<Ñ%›ˆˆ„ÁÑýu8gßuÔuC·['é¿T™6öCßÑ6[º®Nä=†´ä1qÞq˜(FB}u®¤PÂ@Ä»ýðQÚ-±G<j¼úÛ"Jk´V×J*²¼@*‰uÉ@¥Ö´M3 ^]gÅG+/ª~{ €®mù7ÿ{ÿ.gç5»mÎÍñÛ'¾W ‡ñ~`·¹`u¹·ì±Ç{ì{ì±ÇëW›§±mì;`$ÿRk„P„(°Þ3 -©ª eQ`2CU•tƒMÄ B#sÃ|6a¹˜r¸œ²œW ÖQ×!x„¦¤p£Fy»L¤Z¤4t©R}‘ʲ ÏÔXï“] È˜N+Š< |ðØ!Õb©S#€¸àp\Û‘kAYå˜<'J…oº®ÆG›ˆ'0DÅÑÉ’,S”e†óž»w^b’)Þ|÷)÷>c°=¶wÁII^fÄPFñ‚>ÿy`YLD³ß6X!9<9áôñ78;}öâÉC$róð&?öcœøááŸù¡àãŸúg§¼ýö[ÉÇí=}ßÑ4-ƒµ×Ýí7Kôâ^yé³é‚Ÿú©¿…’ )5J§xw1/CzÌ|› 1»jP:CçEÚ6‡€’š0’6)Óc7Ø­4Z* „ÂFÆ¡‚ z>$J(U‘ÑÕ=m³ÁÛ©bª‡óŽ›·n1Ø”Q·»]ªz›ÎR[Óv4í€z”‚hg)Ê M¯bŒñùÅñJ ®'\Ï º‰ôkmðÁSVf³ÙõßgyAž(-†! E¾ãº?¾ø4zñJý-þÖp|¸àîËŸæÙù†áyœË‹ŸöÅ–€˜š>þ‰ä+¿úÿÞ¿Pî±Ç{ü ÷Á{ìñO;®–?/n£®þ_\¥É“$åYžQQBç;”ޣɲœ,ŸPN*މQ ‘Lò1ÞXf&yøóL1›äy’ñwÖ±Ù¶|õ×¾Æ_ú2±oÀ[†¶g³­éú¦íÙljš¦'FíG—"© móòÌgX;¤Ÿ­%™I²ß®ë雞ØHï(Œ¤Ìu q³žv»E©äÙR\Ao;Û¥ŸÊp²@dж­!z¬µIÆþäܺuˆÝÔØ¦·©g-ÒhD„'O.xíÓŸSÆSÍX‰è釴ÍlŸÜ'+&©’É\èûDƃ¿&0Ÿ^‚W?öq¬w£ÌYAŒt}˽“›ßvìßüú¯Ð-Õ­èÝ.õÛM¼Rý†tN„˜‚Í‚÷ˆ‰™Al7<{ºâOü‰…« µ”œžåONX]œñàáS¾þæ;ܾq“¿ð¿øø_ÿ§ÿ[fÕ”0’Œüó|€9_²¹¸@HÍñÝ—89¸‘¼ÛÎòê+/ñêË÷˜Í*ŒŽ8×áðt®§mw´]M?t¸±¾ ïÀ¤Ò˜,OD¬˜ ³’~ VT:gSo¼OÍ! bRlÓ&ï¡ë >`2Ãk¯Ý¦¬ ¼ïÙm¶Ôõ–ÁÁÓ³5o¾õ€ÇO/Kf’:"vX­·´½ãèä{¯Þc¹X¤aUˆ× óâúÁãÖ¤ˆ!_äŠ×"‘\%“B&Ï2ªª (r¼÷x×ã†k{k±cr¾a2Ƨy¤‰Ô¤aò’,+1yIQÍÈËY²[˜‚¬œ*+±n`Ûu´CdtäZ'ÛA¸Ñ&K)ùJµâøhÁÍGTeIÝ´0ã¯%zR¢Ëœ~è¹\=eµ>åòâ)»Í%ÑYʼ ª&(£’-A€V‚L+´’˜q £D’ç+™,Fy–ct†V: wb ~bÀñ:·òyèßGØø•= ~t{î£njÖë}×"H™Yf(Ë yž#•`,}ßYºŠïÊí¿¥ÿ–?õÿ.{ífjoxñÜ ñù‹ÀÕ¯ñ{‹Áƒ'Ï«ý‹ä{ì±Çoû €=öØãŸZˆq+öâ§ø·žb$ÙÆä“¡µIÄ2‰tÉóœƒÃ[R•‰4ìš3daÐZ!±Lf0FRŽïϵ&7EäáÃǼÿÖÛdJiÃdz0Ö©íPZR†”¯•@kE‘'O´”£GUÊäQG|`p–~†ïFip›á\ ï;Äà( C¦3Br¯‰ç‘BI´x$Áy´ˆ´.Õ¼ISb§w–É2ãÆÉ!wîžp~vƳ'Ï8»Xóà‘å/‘Í(pg–fè@¥ÇP‰py¹Å¡9ºyL³ª¯I‡ˆ0-+š¦Á2°Ý­Ð}³kb˜j»Ç.o ÃîÙ%MÓñÚëkÍJ&‰sÛ5Ýþ¶sÀ=?ûÿŸÿ¾ž÷NŸ&‹…” 8 âÝNdŽ( !à•àüýoðÞ“·øâ§ï>Wˆ¤ÁL$ò©ÏuÛóŸþ/ÿg¼üÒ+ü™?÷?áýðâ¿ü¿ý×üÜÏþÿñüFþ®7’>¹Ï§Ú3Úv`1¯øþ/þAþÎOÿ-¼w¼ýö;¼òò+8ç¸{÷¿öƯ#¤B›ŒHÀ (c€,%¸ )J#®<ÚZ!¢@ŠÃuý[^ÎÙu5Eˆ˜¼$ZŒ«õ‘-ùàˆvÀ¹¤ä¸}ã-«‹S†!=GºvàòtËêÙ%]ïùø§îaòŒa°ìvM">${L‘“ICQômê§OÇÿ£)óWOˆ HV‡o%¤R$Ò¦„Ñq}¬¼ÇûÔCïGo¾µëlª¼Tú:”Q¢“݈1)$¢hePR“e>8Dpø¡a¶8fuù LÍDhÜÐ3›Ì°!Ò8‡ ‘ @Ä$®—Zpr0å`9ãþýG¼ûþ#\; EÊ«F2+4wnÑõ=>xJ£m³C1Ò ¥¾þácˆé¹ëÒ°$†€Yµ÷.UþC©«“TJ Y¬w„±ÎŽëŸü+QŒ×²ÿÈ·ä¼p|lßcéJQ×»dM!5—(™ŽE?tØa¾[À·^ãw|ë@à7Æûï½Ç›LçÝé9סˆçCÉ‹Å/tíŠÏ~îÇø•/ÿøþs=öØã7‰½`=öø§yð-ä_|ä3ï%2‘¤ÿ&ÉïGimžçäEÁbqÌÍ[w˜N¦L¦S´1 6U¶…(ðDÔtÊ­›ܼq0š¥›ôÁZÎÏW¼õæ[(‡·1YJýw!0 çSš¶’b"41tëêf?ŒGsž¶íéºäÁ¶¶OÛYçpãßgJ“g”Açyª4ŠH”âšdyç°Ý@ß 4ÝÀ¶Þ`»-ÃÐÓwƒƒªÊ¸y㢧ëz.Ï7Ôk.w–½~›U¾~ß÷hQRÑ#QmÇòÆ Ç‡S}ðáõ@&ùo=ëÝúz YS²ê\ò( KC„`hLð|á~Ž"“üøßøëTE…’I2o´áèà„7ÞzãÛΣ ?ü‡ÿ(ï>¼ÀÅÀb>IH¤”äëŽ! ß‹ï}•v·ahjlf7nÞæµ×_áåW^å~ðGyëíorqöläi„`¿üYNçLf3~ægÿ^<)Åf³¥íZŠ¢ ëZêz—jÞ‚K,J)T^ µ&Ȥ^°ÖÝ@p.}œÉR 4 ©º®éœ÷4m‹ ¥têŒ'mŠí00™—,§e‘‚$û®¥­w´ÍŽ[w_¢mCÝà¨,cR8h»4<0™¡2ŠIž³XTl×[zçØXxüô­kEKžhUBà`q”äùâùðî;-ƒHMN€.K†úœ§Ï|ª³KχŽÒäÜ8ºE¯*\WlÀ˜)B(„Ö)=A¦\¥MÊKÐ&fçOè» YY‘邲œ uÆàCèBb2Á|1£ë¶Ìç‹ù„ñìôk=Ñy”TDy®ùØk·™NKVë ]×cDKI¦Í˜Ñ´ùa$÷!^IùÇ¡Øøü 1\ùÅxQ÷.®†*!…-ºq02†WðbÊÿs5ÀwâäâÛøzë,C?à¼Ã¹! \쀳î»Hÿ¿ûö7V~3ö€öú÷óåý`=öØã7½`=öø§˜þÇÿo»¼ÚB¤(ƒ¥åJcòœªšr|ãÓÙ„ÉtJY@@ŽAmBj†ƒå„—ïsód‰Ñ’ºé¸\ï8?[óðÁ”LæÇ 3ÐyJå' œ¥]íxöì’Óó5ëmÃÅjÇj½cW·tݰ%Î'rïƒGkEž´JðÁ¹¤ è-D’¹¨È¦:ÏP™A*‰Ê³T)'$ÞGºÞQw=Ûf ëvà“= ÐJÑnVüÚW¾ÉýûùÂ>ÍúþÏó=Ÿ{¨Y¡™M >öê ¦ó ˜ç"Þº”‚/àÁã3^ùä§ú9¾hĨÊâz ‚g·½L‰ÿ/{ÿe[–ß÷aŸ½÷ 7Ö­\õò{Ýý:L÷ÌôLÂ`f!A$ @Ð  IÓ¢ÃR°µè°dZµ¤å%[´åeÚ —(‹iŠ Hffz¦szýò«\7Ÿ´ƒÿØçž{oU½îÂŒÄûëUýªnÕMçìsîù~ßß÷ë@5J½y%Û5Hbe¹ugŸk^¯"ö¤TeÄ!PŠ(ŒN­ƒW_ù¡‚Õ­UôA‡#ŒB>”ï\Zm1Ú±sçMöïßðåRšÞxïÓÏzɽóDAÄà #ö÷yãÞ nÜ¿M–güíÿâÿÆÏÿ—ÿ/t–ñÄò—ÿÚÿ†Ÿü™?7­‚7n¿Æ½›w±Î±uåëËkå’,}¬ãÁƒll¬‡¡ÔbA9šÍ€f+¢ÓiP¯Ç ‰NIÒ!Y2"÷ɲ1…Îq“ìxN*Ò¢€ ÂýQŸÁ°O2îÚ‚"p°¿K’ ‰BÉr§ÅÕ«—ØÜÜ ÝnR‹C\ 1Î!mÁý»{Ü»·Çþa—ápLE,/·i¶[ Îjjµ˜P)œÉÁ–ÀÖl ^'цÎçZ”›ÁMÁèT¤€œDØi¼)ŸsXã ï/ᨳŽBkìøŒ+*?!D9ºã½ÿ¥H¥"$ c‚¨FXk–>)ÀOåeäæÚÆ&Wy’‹—¯ÓêlqùÚÓEÁ›o¾Å`8 (r™'©É±„Ôë1ì’¥é8ESÎðWöüÕØˆÀ§K`-Öxo©Ž ÞmùïDáîÇl ]9yQxsÈjÜÉ“>fQTß;ΞÙ?p[hk|T¤)£CO÷·+w Ÿ?œx{àŸýÂ?òÇBœxü™µd|JBõ…c<ì²´´¶øÀ\Ô¢µ¨wY À¢µ¨oAà?•õO€Åic+ªîºR’v³ƒ^FÝh4h¶šHÑY^cm}ƒ0¬Çy®ŽrÃÌwòk5âFí­U®\Þ¤Ója¬¥?Jé 9:ìs|xš%„sÈR^‹r…wèÖmZ›rü´6ÚGøic(ÊÌpk,yž3'¤É˜"Ï‘øNw½Q«ÅQ„Šb$ÞÎ8WÎ?ƒ.¼,Ø9K:Ê')ä)$CŠÂ:2®!` ýñmr>þÑð¡÷=ÕËÛÔê5–ÚMŽŽèu†hç;z*ôùç¹X^]fpp"+Ê8/g>îw½ì‹’•õG¨Þ  p«üv*ëh¹‚hcÏ|ò}ü×ç¿Bâ;ÿŽI_ƒƒÞƒÑàX1¬¬lðÈõ§ß@ª"jqˆ1e·ØøNjšŒ¸óùÊÑÝ©€ÀjŒ“,wVxãÆKUdØêÒ ç.\ã‰÷}ˆ_û…À­;o낃Þ£dDÚëóÙ_ù5ÏÓ¬®o²¶yŽ'Ÿz–W^~ž4c±\^ÛâòO 3LxãækÞµ]–]Ö"ÇZǹím:Q\GIÉúÚ2­f5V:œp^Á"iî篅+à¥,½ ¼\Ü ¯z±d{G|x½"Eàè§Þ‡"ésttä³êÓ”G¯?F׸{0Àš,1L5£QÆ(ÉÊcH0:î“òÑ€~·K–i2㸿w£4´Ôku¢ Ž3®2TB•Nö²O'°¤__¹“ˆZD:Øaw÷^érïAóÄÏ!Šíµ-Š …I2ò<¥µÊ¸É‰ˆ+£Bz£M)¼|^)E­Ñ`÷ÞëÔjujÆúõÔŒkln_bïàˆd0$ IÇ)«Ûܽýšƒ( (=,¤t„]ðàÁJiÎp0ò`ßy£Nïá»ùÞôO•*ŸjaK‚ÃN@iêgKÒ@o>Yß•7¦(uðž óÿÊø¯ôglÁÙ·ŸðïÔùŸíô‹wàÞÙ3à4ÁpttÈ'>õƒì¼‡oG$L_¾µ†Nç7o=·øð\Ô¢µ¨wQ À¢µ¨oA`êÔîÒÁå|}=®Ónv‚ˆ0nÒYYeeuzs…Îò*f )$µx¤¼CøÆú*[[ë\¼xŽsç·h5[hí¥ÃqJïhH·Ûçèè€"˰EŽ „R °:£?‘g ºÈÐiB’¤ôz}†Ã„noÄáñ€ƒÃ>ÝînoÀñqn¯Ï`0Àh?këµ%Žƒ²³-½|™ oKÄ?¶€(;ñRÖ¤pŘÁðˆp¡ì¼:\õº&@_Ì#N|.ßS"®ÿœ0ùsSÀ1xÜŸ˜˜ýw#õïâ÷âNåïªö÷€0z;{ª’Öjž~ÏgÎŽŒ]Ô¢µ¨Eª… ࢵ¨o¹rÎǺÍJ;¢BŸcz'pÖp* Öh²²²L£Ùf¹Ó"Q\'м7@–fd…%ŒcÚíõZ ±Î‚43 ]Þ¸±Cš¤$Ã1ýîÎi6×¶½^I¤3è"c8pÔ;B*I£±Ld5Ö´.0…¦Þ¬ÂK÷…§¢¤á/ KVú€ôóÍAà#ÇÊ £5¹5• s[dDaˆ CD É&ÍrŒ¨°æ»¨Ö`3°–•µi–a¬fÿ`Ä?þï“oûðÓ¤F²»ß§(RŽ{DRxÅ‚t sêERpÔrí=×HóÏÒ¨5+`Ýn¶އZû˜¼Ä(êJ ,^¢+%H…TÞÁ«7‘¤/_áÎoГwI¡sÖ—×Ï\“1€æÖ:vw‡$+¼sýäš¿0îÝÁŸV°uéq¬-AÈÑí7Œ2>ôìüúoü¨Ç –;+„䯽·ü8i¹Ã øÚ›/±¹²¿ò+ìܽÏ'¾ï@Fü{ÿÁßäþ7›/þîgyí+_åü|7«[ç¸zéQî<¸ŠI·àöÛ¤iVަDXo¾ùEžâ€z½É•«sõÚ#<þø#ìíu§ ˆÑ(¥( "/„¤šƒÇZ'(=$h4j\{äqŽŽÀY¶–—ɲ§ £î!—.mñú»kÆ!tN¡WÐyм[Ž©h#¸?N½* Tc JÊÙ’ð¯Ë8ƒ®20´¥Ü?/rOЕR?.PÎñ;‹)žð˜šßÏ›êM׫³nÊ·Lâ§îŒ™:å³Ñª§o‡“j€Óf~§Å⡤‚»Ï<ÁàœåÍW¿L£±M.$¿¿ýùñad€¯îñ.ëØÛ¿»ø]Ô¢µ¨w¨ÅÀ¢µ¨o‰šHzO]Œž4¾c¬d@Ũ "Œ"¨F³Ý!®µÙX_¡³Ô„Pt:-OäB¬®¬²ººLEH¥pÖ¡ Íh0b¿ËáA—tØgØÝGàX[ÝB©!|Ô™s–ãÞ!ÇýcrMy çe¿ÒZ²$!ËS²<# ºwÉ’1Z{³5oºæ'Ù0Ç–â4+|´à(%éôz G#²lD–Ž}rx™ó0M'ÚJ´ð.ëBJ„õ饕¶¶Ö©×kd‰¥a o½u—݇ŒFc–WZ,µëŒ²Â(s‚¸^æšÂIÎ_<Çý/!ô@Çølùã~×w%l_xÔeAîLe†ô@©–ñ‰>ÅîÎÏ}ñw©×%Xs(ÐYZåå·^:µ>ŒÖ¬¬lrþò£ìÝ;@Ë€V³Fž^ªäìî¼ @Ä\¸þ,µM–WÖX®­°ýØ{øÈ‡žáó¿ûë$iʹõsõqîívqº¥pÊ“ÿúð2&g{û ^{ýw¦‹ZÔ¢µ µ¨Eýü?´%æÿnÒýÂ%}g?ŒëDqƒHE´—Û,µ[¨0ÂXˆâV«I†h#X[]åü…mZÍÆZ²¦×Òíɇ]òtDF,-­NX¤ó®Þ£ñˆþ°‡ÑJHA è¼ÎR£ñ,MHÇÒqŸ,MI’k½@š¦Èl»¼ % »]’Áæ˜,Eç…ÏF×Îyv£Y£QoP«Õ²”ÊãI ÊDÍ&"©7\<¿M½Ñ  "HÇ™u•‹|ø(°¬ÐÆ)jMÜpL}y‰µ¥ˆ£ÊüO Á~÷!„wÕß| !uåÐB¡…ô k"Irœ<óþG‰øµ_úEµ:JP&:l¬oóÜ«_=sH)øðǾ“G#l·GØn`ŒC†ÁÁzÝ=ž|擨ZŒ,×I.ÀÇÅ+—Y]|õ«_e4Õ#¾ø{¿Eš&SŠIˆ¹H5?»mÙï°ÚZfïæM^½ù&[çassGž~?½Þˆf£ÆêÖ9~÷7ÿ%…)ÊùnW™Nš±]dy†)׌ÀypXdŒF#ºý>N›V3fŸf#BµšOSF£„$ÉȲŒ$Õ`á}ï{ ) ɸÏúj“Íõ Ö×7(´kHӔǒFs‰¢LÁHò„$ëDaD&'h„QѬGX‡ã„݀ϧ¯E1*XB X]ÞD©€ 4¦«XÙÃØMYã.ŽQvÈ[·^/G^,ÚhÒ<Å:˜9ÿ¢y›É²µÚÄëcŠn'ç!®ô0lb úƒŒ¨ÞæâµGxêéÇYYnq¼¿OÔh3[táù„”(©X[_çæ[¯úXÑ2ÖoÒýZô[šèMÔ9¦œãŸDö¹ÒÅßjƒ±~œ#Ï ´-*@_™SNFžì<àŸ—¼—£Q'eü“Ç*S:æ‡2DµMÎï§ÁµM…x¨´þá~gÏø¿ï€~ï˜O|æÒ$¸4Eͼ´É>?û!Ï?É—¾ò ‹ÔE-jQ‹z‡Zx,jQ‹ú¦ƒÿ“?Wòÿ3®ô”T(’䩈8Œ ujµ:õz‹z½Í¹s[œÛÞÆØmš­%66×Yj7 E‘kúÇö9ØïrtpÌðx,KpBP«5qÎP)6÷ ­È3ÆÉg ¡’´êuZaH(Y:f8ê2u)Ò$$ý.Ã^—~¯ÇpÐc4ìsxpÀÁÁ!£Ñˆ( °FS9-h Cä ¬öÑ|®ŒK[Z^¡ÑZòòk'È‹c5yš`LŽ”ø4!¼ã¹Î”escka÷ Çp˜°¼Ü¦Ÿí¨µš8i0º`0Qš(ªBù.¿r8%98°yñ*…Î=á EeÞGa謮ÀH0i.NÀ àgôc}üñ*ÿ\Jïâ®MA(aŸ¹V^{õë4ëN)y¦ ÿ16ú‚‹Ÿ@aiÜæ]Îëõ:¶7àî½~â'þ88Ç(ñÙÏþ ÇLJUŒÚ¬ç„›V޼ÈùÚë/øÈÆ£žûܯóêëw ÀI„»T’ô;½1áäk¶û[y†ÖžHÒFO¿tÎx›—ª‹ZÔ¢õµP,jQ‹ú¦ƒÿÙîÿ\ç†ð²^IÅ„Q „Dõ­Î KUÚËÖ×Ö¹|ùkkk,w–£c`e¥ÍòR›Í5:í&FŽúìïÓ=îÓïö)’:bFJE£ÞÂ8ƒNÇþKçè"#KÇØå¿ÖZé§s ­ËÑ)ya)ÿ$B²<L¥ÿÓ¢;»'æ`öœ\~v4`¼ŸêªÏwçO÷Ø'J x'ÿ·W¼;àâÅËÔ›ë¤Ã1ÊÙŠRg<âäœ:!íÖ×.óÚ_\|¸.jQ‹ZÔÛÔÂpQ‹ZÔ·!œ©R­v‡å•Z­µz“z£I³Ñ¢½´L£Ù¢Ù¨3J2œ…ååÆ@»Ý¢Ù¨‘g½î^oÈp˜Ðë÷)’E>FII½VGª]¤è"Çä)EžxÓ³Ò-ÏRð…Dzs/!¤ôÝì BªŒA K(jµíz£t÷&s“ÜmßE7¨ "­sâ0§&#´¸²»h³ÝQ—F³Ã täG*´Ñº MGÞPMŸL B<ùT‡Õå6Úhâzƒå¶@)¸þèEÞxk3yc8'pŒ64€ãá1AÅmŠ¢àþƒc®>þ»·îù‹o) ƒctéÞ®K@#«àwYÝCvv©ÅW}”W¾öB)»¬ï´w:ëìîÞ‡\j3ìù½çnðS?õSü¿ñ7 f&ýcQ¦LÑŠïz?÷æ ¼Ç<É• &¹õ5nš÷"•àÒ¹UâF÷½÷Ã|ዟó÷7Ö'8”[Í|c«üö¼HZ–ÛT`´¡ÈSò<%ÍRZ­Æx•…’ÎR!ñkÉŠ"CIÁöö+6÷ì³½¹L¤BÞ|ã&FkêµýAÏ6ZËp˜x5»wÒC ÒËð…Tµ&A2F§#F£.N…ˆ°éåêåv)Œ& oÒ_FC V$Ö›vÎB¶8)Ài‘ OÇÞgtB낺ò€>Pª=q~„`²­Ã ‡pŒÄI+AºskÆX"§üp‡ðkF’( h6›à$½¾BXMžfhc¡ÑhÐïö«5%,»÷~ûk] MQÊø™Ž}à¿1š\ÞÔO”äÆI[þåO¢þªÑ€rÜ€j=J u>ó®¡rsàÚÍ<®r†P8mèwVÉRq111<ÍÊÎ* Î6þ;Û(нÃßÀïþæ/ò}?ú—¡cFš¨DøÖ>üÕ À™‚ǯ~àÔöXÔ¢µ¨E8Ç/6Á¢µ¨o&Øèuš8ý·Rú‹õ«W¯ðÄã×9wn›vËÏü¯¯¯Òé´ ”dï°G‘kVWZDQÈÊr )`ر·ÄÎî!qppLÒ=¢(R‹jXãÈ“i2Dg‰Ÿå5†"O {wØ;Úa8ê“çyåB®”" #¤TkV#…ó£é,'C”5ÔÃF¡pX‘&#Æã1GÃ>Ã<#5ša2"÷0i;>Â&ÇèdH–¦ŒúGdý#ƃé ‡öÉz‡d½C†ÇûôûÇdY‚±£á1ÉèAÎr»Žýƒc¤ pÖ²¶Ü˜Ø‰ÑlÕY_[%ŠœÕ´o~(¡(4{‡={êiò<¯ººõ¸Vy9[T»Î"¼üßÙêßÉ~¼÷à›·÷¸zíš—Ž—TJ‰ÖkËk]7¯¾òujµÍÍe?ŸdDµG\}üC‡ˆrp8TÞ›­ŒÞxó?ù“?5£:™ùr³’ò² §›sŽ—o½ÂÝ»Ø|Œ¹ûo½µƒ±žÌùñŸþs(éÍ%+8g1V—m[Ú€8Œ‰ƒˆP„Aˆ’Q鿥ùV[Ò$-»ÐŽ,×AD£Þ`¹Óay¹M»Õ$PÞ=?ÉrÎmorpxŒs†Zg J  Œ#êµç +LI^ù®¶*$ˆjÔêmT´DD¤EE6V§qw¡RS,+@Î×™ƒ\LgÑ¥i45Ö&@z²ñó"G^=ª%§bw1  m  ¥ï ;‡Q´TRöÂXta±Ö»<2$TõzÌõÇγ¼Ü¢ÑnH/9¦|ìcŸ$/2¬3•2ç¼RCgè¢À[ÅÿMfþµÖd%£uá*Y¿«Œÿlu;8ç“ü&›2 “λsŽNg‹Gžø€÷ ˜ó(Éwâœzf«½T{鿘ª\ÄIU“±€‡ñe•®éLàá~y÷ïÝ¢Q‹‘aˆuS=‚,-E|Äçü—_ –qrÌÚÊùÅ좵¨E½M-‹ZÔ¢¾È€‡“ ÐV³ÍÆæÛçÎqñâ%66ÖÉr6„¤^ £€Á(¥Ón²±¾L³Q#B¤”988æèhÈáQfètŒÀ1K:’¦C@ ‚@('(œwi'#´ñóÜãlŒ)/ø•’B ÁwTËN±¿,vX#ÐÆTÆ_>’-& µ0FÄ’<£—ˆkcpÚ†Q•Ž32@JI^nìUÂGðâ@Úh2cY^i°¾¾Ž.RîÝ»ÍÚê:[[)¹q{Ÿó[Ë\º°Áp”¡ûcÂ@!­F“Ããe¡Tˆ,¡{<äéG¯æ#jqÍGØÅ5Ž'ºT 8‘ÕMí(UÈÑñ€KW¯úŽ8%ÆxÀÖòêC×ÊhØçK¿û/¹ôÈ·±õHF)+«-T¨Ð6@H D8õ’pxŸ…ìïwéûØGù¾pö“L¢çœ­âï<Ë!æ2ß_¾ù —·/B>BÜ{‰·Ö¹þÈRJ¾ë{þ(ÿâŸÿÃê!í$ǽÜ&Þ»"˜1¶ôaT#Ë©ˆã†ŸÛOFX­‘¬6¬­-±º¶L’¤D¡@ E\ói­F‡£Ùh`òœë×=É",µœÛZÇKìô88z…By ©üq($B…¨¸r––,0ø˜LW9>úÑ»´Gq‹-×)8!Ë$€ÓÛ•‰ÚCÆâÂ2¢ Â’Rª©‡€óPÓw†y¨ƒÂ€ô¦ÂyãÈÉ_H¡(Œ!+ QäÏ *ðj€0Pc“1Fk‚`• (çÑK@lʹÿsŸà`ï6ɸ?ç PèœBè2ÞÏ¿õé ð›{J0áìT÷PŽ œÕYwÎ*ÅÇ>õÃ,­\àůþ*y6ò±©“÷X¾_kÏpâÔÁ,&?-ýw©Pý^2o88WÞtñÏïo¯ȳ% µzÄøØÛqÎÞCžÑºšÜ–f#¾ýÛþ(ÿä—ÿÖâƒuQ‹ZÔ¢À¢µ¨oÀ/ÎÀ ­Õjlmo¢‚Á0¡Ð¬·Û Y®)´%Ï ë«.žß¤Ù¬”ŽéI’sÜp§Ëè¨K`5X MúÞ©?aLATkP‹ëX`­w%Ï‹¬4kó†`…ö†_Z„AHæaT]¤j£QB dàM¶ëJ j,BY £5J „ƒPJ”3˜"óŠY0é©KgˆR….ÎE™.€8Љ\D¬r´ä.feeë]ÅhÍÞÞq­ÆÚRƒV­Åþј¯<÷ÛÛ4›uzG]ÆcIZ8Ò$£Ñlã;œÎB’¥)91ÍÎ2V[߉Sªºž¯L¡¼dÇwÿCYv:j‘gY^péê5´ÑUX)…s–ÕFóm×ÏKω§Ÿýq’§ÖB 6(»ÃRxœbN:œ­%l7Hyåõûü©?ý§ùüç¿ðÐYä©ÀÙMÑÌ8€sÞ¹ÿsÏýŸzö“È"áö—>Çå ?J)žzæÙ’˜Ú'É«”tÕä˜yÌÓ¤êœA£; úgþRœè¢hˆ’ ›¿¿¬(¯àůý›—>Q€5ye8{lξbQ>£3Ï<ñ±°¨E-jQ `Q‹ZÔ·vmù?^i’ÒïõùòÆ+¯½A½^§Q«±ÔYBJÉh”Òål¬¯°²¼D­#„$/4ƒAÂÞ~Û÷0Ý.¡õݹ˃û;à|2µ–zC‘ᬄ¢k©‰.<Å¥+ ɆܻûGG;%!!æ×ÑÌz˜|ë;ÿó Ü•#'dz×ßP’v³Ááñd÷˜g?öǸ²÷¿÷ù_GW#I¢äªdùœåsˆ³CôægæÅ‰×0›à¦$˜˜Ž)Fœ&æ ‡‡“¯¾ø.<òm‡Üš|¸ƒ˜yFg £á1ËKtûû‹ÖE-jQ‹:£)‹ZÔ¢þ@k®+8s!øÐN¬´[m>õéϰpˆ.,›4ÛMjqqRà„$ŽjœÛZÅXÇp”ptÔçàhÀáQŸƒÃ>ýƒcBWecF£>ƒa—^ï€îñ>ÃQŸ,Ï(J3=]䌓!ãdH’ŒHóm /ÿw^¦oJ§nk-Úz£/],Îx"AI‰teæߘÒ5Ü™Ò^û˜0kH²çlõœãtD–§äEŽ.I‚0Œü\rž …ÿYI‰ŠȰN†äÙé,û½ÃaŸV³ÎÕGžáþ[w88ê3Îr¢  4DX‡¬GtV–pB¡‹‚F«A* ë ‚8ĦQ£N§YãÖk/yð/‡¥£~»¹B­µECZ„Ó$.˜—îìIÂ3|œsÛküâ/üœ¶Äq½r?_jvxãÁ-²l|æš(òŒÕµM.]~‚ÃãAP¯Åä¹w¼wƕω+Qƒ‚"Éåš>ûLJ;<ÿüó'Ê|Xº˜|?ñ¡ò02Öðæ½·°a‹§ßsžÿûþ7Éòt šN€ª Ø¥ïÁDROI8c°NWÏ'€4ω‚ˆZ88ìö(Š”,ÓÚ$)Y–‘f)ÆZ%èu{DQ„µ–<×dYN\«sp8 ?JèFXë“pÞ,ÑPc­w]Ó†ºÔˆ âhÔgoï­Š\‘Bréâ#¨ ƒr†(ŒTXáø3U=UüœÄ"(\ÁÛ/û´1OKÐÛª5yâ™O1ꑦ}â¸T!(³äÁd,ÞyÃI$()²<I¨¿M¥@*IHâ( Ã2VV–8:êSä©si¶9:¼Çh4BëgËkS@­-.Kq¦À):K‘α¶|Žóž¢¹´ÆhØEë¼ÊŽI~ð§e«õ2û»+[—Xë¬ ƒO¼ÿ}Ü¿w€M¬ÖÔ–.rùêSìïÜ ÏSfG"*¼.x›sìä|úë%+fÎÕ“u+¨”ówyxdàôïÎöHÆ#>ù?L ²ŒPο“ïIΤ )Ø›w^Z|à.jQ‹ZÔµP,jQ‹ú&’³€âL’@ X^^æóŸÿQ­Á>ð,* (´¡?HˆkíZD³ÕDIɽƒ#îïtÁ Ò¬@kKšdH!0Æ‘¦cúƒcŽ{ŒÆÃ k*p–ÏHµ¥>÷¾ì’YçJ'wª™Ýé…¬õ~¡€¬ðNÿRJ Ę‰É—wæ¶™+ …T ­ ¯0~ÆØw‹•}UĘC)ê–Òϧ£‘QŒ! oà6õÁÚy¡Ž GÝÃaÆòj‡z-¢pmak… Û+ܹ·1ë«mú¥hÄ` Íññ1í­UŸY^b¿f»ËPõ©y˜q¸‚f°HHÓ‚0 8wá÷nÜòiRa­a” Y^Ý¢ß;xèÚ¹ñÆ |à#ßI­a%PŠ@hWà”¨¤ûnfŽ_8AÐi¡»|ý¥ÛüìÏþIþÞßû{'ÙñvQgs#BÌ5J_|ùó¼ðÒïT$«¤ß§ç±­µä¥©^ ‚rM¨ÒÀâL9û,Q\óYöÃ>ÆZZÍí0 {Ø%/iš±±±A…Ü»·Ëh8¢È·iÔcŒvõRvvIÓ„§žzãBº½½îÕX[mФè$ÇH[ä¸0@¤¢ J󼩬¼Ðš-辋~v³Y 4¡›‰ZôS^ªõz „Õñ&Ë5%¥Ãºi§ßϸ[„ ¼±¤›no©¤8ÞÁ:‡ÑŽ¢°äÚK 2PÄÊñä“WùÊ—Æ7f<ʸzí:÷îÝõäžµH¥À8T>Du6I¬ƒläý08ípE‚@Дïyì#q“½Ã»Ü¿ÿ i:ÂÎcNÕ.‚ÓÝtØZÛò¿s¥y®‰¤#3ŽVâÓ>ùÝޝù¸çµrÝ3‘˜‘óÏ“¯Ìújl ÜÖ>¡c.V`î]Ül‚ëCgÿO+Ò4¡ÝªD¹{ûä‚“s…ËWáþ[·±Öøq!pÖ²´´þ¶kçå¿Âí·^emí2÷ïyð„ªô˜Û•ÉjUŠz‡Xáxîùüå?ÿ‡¹ví*o½uóìÅYÖ‰òqæ×i)µ® Ž«ÖÄÉÔ€“$Àì÷Yžb‚Ð'8oÔ6xv8„Hc‰‚ˆÜYã!Úh:­%–j&Ëéwd¹¦QXît˃û» V‡ôîî!LNª ¯ç9‰l§q˜p¨¼Ï„Ñk¨"é&ü†˜¤)HY¥ Lö­ޏÙ$éý; éMcHAfÝ4Ó½láN€±’\`3„ônõN؉àŒ·Â Ö,ÇäÜd( 5?æ”Òx‡%/4yaˆµ! ½$–W:\â ¯¼|+éØb!ϲrMÁdc–ò!ï}â»Ø:ÿ$/íWI’~e”(NØXÌ­åɱ2%ˆð€Õž¬òÉY¿úgFD93;j0›fð0ÀÿÝiÿæ«_A…ÛLFhÞiTgRÆjÒdHÕÉòdñA»¨E-jQ'j¸¨E-ê›þOþ“3ªQùÙxçsçÓLsp”` Ôë!òÄAÌîþãœÀxw1?§\ä é ŽéöÈòÌÏð[ã¥ÿFWv‹Ã:‹5^ÞŸ)ãtÌ01LFŒÒ„Q:f02NÆIÂ(I&#úã½Ñ€þhHVdUVx^ää…÷0¥Ó¿ÖšÁ¨Ï^wŸ;{÷¸·ÿ€Ý£½RÆí£-k™Nç)ýÑ€Ãþ1½a¬È)Š¢º’Iº;$£.i–2Nä¶@HÅÖÖ®[g}} ‹ ŒØß9$M ¹ºÍÅíeFƒN›ëׯríÚ%¶¶7}\`‘c ã}òk mò<›ÛWi6ž^ì é[µ¶e¢´ér>¶ëÞΣ$ãÒå+˜Òünrß¼ÈYm­¼íúÉóŒ7_ý:ËË-læ½”ò~g˯j‘•j…2OÞ!·oïòü+÷øéŸþé³Vçt‘VÎmœýw%žº½Ï)ëì™ € àó¾YžRè¼¼mòx¤] Mî•$Q@ª3Ž]²,#ŽÐj²Áˆû÷pçÎMp8nÞºËË_‰îÑ» Ž&£@Td¸lÈîþ]úý!ÍF(RH9óžu ÞŒO´˜hûÅÄסÜeq\óÀ°ì0Û³"áN}3y¸™|¹²E-…¬" S`M޳²å 'ÔC~!”$…¿ÖYŸê€7âœÌâ{#OC–¥Á§E[ëu7BpþÜW½L÷pŸÃƒ¶·Ï{Ç~[¬5¼ùü—Xj„õæ2­¥uêõ͸F\‹QWxyN208Þcpï&Kµúðò?øxìéï Œj3~ÓNû¹s¬tV‰Âx9 5›a²18KQä´ò#®/¯óéïÿ lm_-£þ*Š¥Šþ›]‡ò²G)¿¤˜Ž§L¢«½%|ÆI('û_Ì™ ¾›‘€Óç~îK¿NGÕºšxKHìÛûL؂Ѹϓ~`ñA»¨E-jQ `Q‹ZÔ·ZÍ;…»ê1Žc.^¼ÈcׯÓëiw:´[m‚°Æã×/³½½F½{´,ç·îó‹71ý>ù`̸?&í ˆ²12ëÓí0õ {dy†1e>{ ĵUçÖZK®s’,aœŽÉòm öDŽwø&ÿ•·Oî4è±s´Çý£]vŽöü÷‡»Ü?Üa÷xÝîGƒ.Iškoø&¥$Íò"'ͲJö/ðÆlq…yQÐvIò!$Zëê*Úï–®uÎhØ£Èâz år¶7–)ƒß©‡Ša¨%t¼ôòë¼þÚ %ú‡Çí*ÇÚRHyç~k,N@8¢¶¼Žsfn޹(ò’àDK¯ü¨)üûEIò$e0J¹tùŠ'+L,uÛÖ9‚wá$ÿòK_eu­ÃæÆ ãqê;˜Râœð£3e'¹ëÖE!xëÖã,àÓŸþô‰uyj‡áN¬Xçly7áª}ûv$×Y·O;´ž¼ÉMQyRˆ“ág¥ÉÞÿpÐå°wÌh<À™—ævöŽHsKÅd„ô´ã8Ëd9‰P ±*@)I¿wÀÝ»wŽF´›5Z͈8VÕ~sÎP <1qÂ(Q;ƒR ©ìC¼óÛDÌm7Ênº˜I¦›íZk£1:)Áå”d%p—N̘(N0¦¬–Wò¸ÊTЕ¤À$Ћ±ŽB{ɾužp^]O K­JIŒvt–×BÐöB…1²;¼IVox• ¡aX§¹´JgùÍÎ6Íö Íæ2µ°pe)y6iùÐå‡üOÁ\àÄÓb‰‚€½ÿ#i,ÎjŒÎýxO–‘Y>fÐ?¦6ºÏS›ñ‰ïúY––×ÊãkdSzqâL,æF3„˜ù³D€˜ºïy…©y`¥˜UT{Ïz-Ó—áo ln,£š5 ûîέ@oÚjt¼‹ZÔ¢µ µ¨E}³ê;„åµßöö6»»»ì`¬õ.ÞJ…µFƒ$IIR/Ëß;èrç^ZãTHî@Ù3:àîíWxõÍØÙ¿ç¥ÿƒc†ã¹.J÷}[J‹ ô3¶‰E𱂅öã¹öÝu'iž“æ)iž2ÎÉQæUQTkQJJªÒ9^ „¤l®mòòs7xþÅìs~k…¨Q#Ó‚¸Ý¼àË_z‘/|ù5» ½^Z‘… ÄR”¿8—0¦,¯­Ñ\ZÆ]ÍþZçÀ îf#ÍÊïËÎ<ÍŒv÷{œ»°MEXë•BŒ14ë­wÜvÖZ^é‹\¹´…Oiˆ‚` "\)ùÆù\ô ¤²ÀR›þÞ_úÚ›üøûIx'²§|œÊ÷qÆÒØÑU³óbN)2ÿvê8˜3(×9WSê©Ú`ViRþ'¥£tDwÐ%MÇ()ÆA͇/Ôë„͘¥N †z;¢‡€E7 ¢˜"±sÿ;wî`¡UQrB|H„ˈY8` 0VVÊ€·tsî9ßm–3i B ¥$ÏÇH…qÕëŸ4êÝ\ЂE(9ÝÞÖùù1áMÊu0Ù–­}‡. ¹Öäe²‚5^ÄòñO};K­&¸|ù:Î9^yë²£ñÑxD–ûî¹-ŠÖú¡Yóeõ¯ W:”[¬ƒ•Í ._»Ä£O<ÎÊÚ I–2N’,#ͳò>#Á‰ 0u¥:ÄÙ1Å`ÄÊú:›k¬,·A ²4'R’v¤i­7n³{Ч0>®^X^iÑjÖÚ@acúý”Í‹W(Š[v«ý¼»ñîBÍäºÏÎÒû„Ão= ^‹Xßܪ^¿R¾›ª‹œfó»w¿ý›¿‚ N›á`Œ ƒjvÙû”ù Öù¹êr‡qYÎkoÞçÛ>öi:g¹¯ŸIœüþÀ}ÑU‘³ë¡63k=Q2çI!¿JÙº³•¿” ¥Qâ°ŒÒ j4šmÎŸÛ¤Õ i4"ÀxuŒ’„a€±‚¢°HÒh­"”"IG<عÅÝ›opÿþ=Æ£>ºÈq*À Þ!°ú^ÉbP¡òIZWÝïhnÿŸü~Înf Ër!ËÆ¥ªEx77û8nþA]©ów®LðÛ] /T7Ö– Þb2bceœæhmJ2ÎQXƒµŽåÎ ?ø£?Âòr%C–—WÈŠœ/¾ô{ܸ“0Š ƒ¼ð…_¦¹Ñ);ÖÎ+Êu¥„à ‰Tag­'žæ{ÿÈðéïú$×»B½Ç?üc?ÅêêZõ–Æé˜¢ÐdENš&|íÅ› † !q{Å:éÉ.ëÇ]´ÕdyÎ8Ð?Þ£>zÀùäsíâ3³÷ ­—1‰òÌXÀê¿ò“rJÚ1¯V©:þS@qö¹ÿìÏǯ~é³l®-ÏG>¾;j•¼Hyö=ß±ø ]Ô¢µ¨°¨E-ê[ú¤T͈Nå¯Z]ÍzŒs†Zâ¬@…1ÎIStÒå`ÿwwn1õÑÖbñ]`QƒAè˜=~Uo´þµ½oo ¨±ÆbŒ!ŒBVW:<ÿü×yýõ×XZ^¦ÑjT K—J¢(кð]L£½²ÁMâÒ$Q“–{÷_G”Ä‚6š¥vÖÅMpŽlÜ#b^}ù¯¼~ãîˆîqŸÃƒ#ŠdŒ( ?3¾qLçSY¼±>Âî$º“jnöW…ŠH­;,wšl_¸€u®”fû.mV¤¬,-¿ãvûús_F‘²±¹LÒHáã$+®þ“nª+‰Š@J’ÝÝc¾òüm~äGü ¼êÎÂS€›‰œYNgîD—òέ)æÈm Š<ÃhT) †’Øð3þ>ÇéH²…ιûGÇ=VW:¬­­E1B*Õêĵ:QT##¢¸N½¹B­Þ!n,¡­%ÏRŠBIáf=æÉ™iÚ€¬¤±e·[ŠjÄdz®ñ熼0ä…ÆZC’ä¤yA–XãU-ÆY´±|Ï÷ç/\äýïÿHõ&ŽûÇÜÙ½GÆAˆµ†Õh€kµKg{ÐNbœÀZB®.ó‰O}?ô½á™§ãÜùm6½QF2ÎHßù¹?_)Iz£…öÝý,˸}÷€"×8kÈ\D{ý" +°mËui­!Í£>ƒÑ€Áñ.Ÿyÿ§XYÙž*f å @9ýš*4äÌHy;ó÷=EÌŒp2}à!ÇÁä×îÝe}½ú†Ï©….8·yõÔ~_Ô¢µ¨Ók¸¨E-ê[¢Žz­ÎµG®Ñëõ怓+»yÍfz­†‚£nŸ,‡ý£1yo„2Y‘R«5ØÞ¼ÈÊê6YžbµFÍþñÚr£g"¥Ä7DDaÌöÆ6·çüä¯þ¥ŸäWéñþþéÿï§Ê çf³‰µ®ìª[^|ñ…Ò— åà`ŸsÛÛÄqŒ6–z½ÁÒÒ*;{tÖ|°ßíc­¡ÐºÒ°ºq[h"!ÉEˆ‡‡]l¡YYjá¤"¥Àï$¾·{›F­A·LÚ^%ÉRRí››í c6–7‘åÜ/¥Û:ÖÇ´YûOç(‘@HInagç4+Ø:wž×¿þÂLšï&wmÍ÷•/þþöäÎí]²¼ ŠÜ{$ÈR Ÿ`}‚#JÔrsÜãµ7îñ?ø£üüÿço¿»µ:þbÍŠ3ÿéÎ'§Œg»¡Ö:¤´àdõØÆl‘ºSÒa¬¤BXK Ö “ÇÝ;w%œßZ'ŽBÂ0D’@EAH8e|›3$*ˆJGyí‡ Š1ÚœõÆ’þ9§¯]›œµÕNÈŠd±È) P‚òI ã)!g¶™ßœ a û´6BOé9Ÿ N“n’6ŒJN]é³HéGDœu>iCú×h¬'h6j,-5ˆ”$ =iXÖ^ZÃþè÷óÊ«¯òÙÏý‹Št§c¢0¤„XgùÏþ:ßõC?Í/‘ÂâœÄ h6¹pa“oûàc4BòB£µ'ü²,ç­Ã]Œq<úij<óÌ3<ÿüóõ)J/@J’´(e-€AÒZ»@Ðß§ß?B | JÁ™›ÌûD!£Ñˆ+~ˆî—ÿùÜzœ[Ã3ÿT«{æØ¨r?x£EWÅþ¹ùHÁIÌëìááDE¾›³ïK/?ÏÅókˆfFù7tZµÖ0÷Ø\»ÈÎþíŇ좵¨E-€E-jQ߬ªu³·!X[_cgg‡ãããUÊ€Ó”;,--ÅuÒTsçÞ1.54Èó”ãÔ°´±Îð¸Ç0á¬C…5q­IoØ÷ÝñòEH)ª¸­‡U=nðØ…ë\ظȅ ORˆˆµ¥U:­ñ/þ%>ö‰Oñïÿ{•ç¿ö•ß'ûáóƒÎz­u³—e÷ïÝçÁýÔj5¶¶¶TÈáá>Æܺ{ ¬ ,É­õËPlo?Âν{$£„åbÌÍ»»¬t–X[ªÓn7XÛXãð¨Ï½[÷12@ŽÎÒ*·ïÞ ×9£tŒ’ '´Œ¨%k´š ÂPÖ[Ô›mD÷hÂâT³é2(ÇÅ´cH¨*$`›åì ؾpу\k«í¼ÈiÖ›ïjó}î7~™ïú¾?F³Ý ßÑZj"”@èR*?™ GLcã„DÜp@P{†g?ðžûêWO9ùÏ£ÖéÏóпdJS:WÁœ²c>ç`çsÖ#À'x‚ÊUÎÿ¥Ÿñ·AèA»5h!„BÎú4 £SŒ 7o½…IjõÍFJ „ô“ΉJ áPa°ÆbF…ÞôN…5"S0ÔÚê¹WÑšzp6Ÿ vŸª$f·•ÏcœæÂ˰ÚnnJ$ÉÕzǃèÒ¹ò%*O†ÉY¤ôzpÓ˜ÂÉ8RLŸŸHa¤@ßÝ6:Á&ý]tž“&)É(ÅC½ÑÀC:NùùðwçFZŽ=.¬myB ÇÞ­hŸœÁ^—¸³ÄÅ‹|úOãœ÷ë°¬1 F ÝaÆñaŸ»wwÙÙۣК7wXß~žÿ:…Öä:Gë‚íBT¹žµƒ°½ÉFrx´‡uyå'!>a"Ïh®µ’Qe¼èKVh_HYþ¾3@^þSåËd”Øáæç:\¹s„˜ŒÌœˆÕœû08M $ã1µÐÇ!z( Ä76²• O>úÁ°¨E-jQ `Q‹ZÔ·BM®û&²ç8ŠÙÛÛ›g ÊÎ]š¥ÓïõYꄌ“ ! ͆¸L“¤cÚë\º°Â]7æ¨; Ër:Ë«4–êwM™20_b†`8[¶ýÔõð‘GÞK‘g:gpp—Z­ÎjÜ`| ¯ßÜa0J¹~ýqþÁûOù[ëÿÊù·þ3òüá*)åÇÀ2IÆÌÎóãÀ•ÝY–qûÎmîܹWÿÅaDÅÄQL„Há ÙÖ7ÏáX©×8É—¦(}Ž0Ø¢YSìï0笟ßà訇IÆhçh·:ô†½IFõ0À EFÔ\¡.Q¤X¿p‘{÷(t©€p–X+Šò¦lÎ2Ki6rpÐç±Ç¯SèÂwhEÈdˆ Uw#oÝx½Û\<·ÎËw_Àµê¥ù›,Öxs¸ ¸8ßU¤Ä,/QôxóÖ?õdžç¾úÕ‡ìÎ&Ü$Jnò;ßñåÄ\ûI#ÀÙý=w{i$è&@GLÝÒ­µh§«Q–jM)ˆ£&Ö*Š"ó Æg y:¢(¶ÎoSkÔ}‡Ü•Ýs!p©pB Pé£(1ƃ6c‘Öû œÅÞEQ oð¨gÀ5ò¸¯Þr 0+—ø²s/ðù‰b`BÎõz]]^Aˆ‰¡°Žé°AÅ ¸é9E–ÃÖ"…7ÖsHéwîï3ì}¢‚ö¤ƒT$„aT¥ç ¥ÑŒ³ m,˜&"L”¶¾Âúù6‡;7IÓqiÉh¡¥²ÎÖ—¦Àúç­Ä̺eâ§YÅ(ÎP@~½—ëV J5@¹ŽÅtí3¡fæˆw§øÂç?K³µÁÑž£ý ^µ£yæúGøÏÿw‹ÜE-jQ‹Z‹ZÔ¢¾9 šñís ×ZK ‚©œ~"7†"Ï1ÆçÉ/uZ4š „ ¸Õ0§äEÎrqnk<ró-IK€t›Æä¥Y+snløD¿ô>þ¾ïd°÷–ÏÙÎ3Ú-oJD1«AÆ—¾úÎY:íþÀuþ—ñ/ñíŸü ý?øk¼þê‹g¾ÿ“àVZ{A2 geåk¹Î+ÿm  "P ç`}ë*Çû{,+ÇÚÊ6K1EŠvŽÃFQŒ‡=–úhDŒ%qWäÔjM„TtE§µDwÎIi½3¾;!”.•)MëœsF!±ÆPè %ÔôIJ¤#zÝ#‚P!•"ÏR"cÊ®­CHåÁ¸HÂIœ¸R&àƒ° ëDì¦àÐT`Iºæ€ÞÌ6SsʈéíRÅáȲ”¸ÖÀYÁ[xž›‘b l™‰¸+ɉ ) ¢Fé ¢‰T ¥B¤’*DJå½)„`÷h—Wn½zò ¤‚·FYJ3®Žÿæïü<ÿûÿøÿÄa/çÕ7î³sÐe¯G¯ŸøøÌrJ¥¼ÚCJ/˜Q‚( iµZÕv±ÖTÛ?K HB)|Çý„™ª!ëçcpx‡ãÞ”Ƈõ¸†tQÏGùÍPWŽeLöÁä}NU-¢â¾&kçÔ³*‰r`Ž˜ì§™Ç|;Àçç·øÈgþNâœ~GÁ“Ǭ”’Z\'ÍÒ„Þ¢µ¨Eý›Y g”E-jQߤ€¿îKÒ„öRû òRÙ<ÏHÓœ#†£1;;;$Ã.E6BXƒ :z“H(ºý#†Ã>GGû¤É¸¼XÌ0› €Ÿ¼žì¬lò¡OüÒHÐYZãÒ#ï'ØxŒqû2ÇsÔžx†çßþ!þè|”‹Öùú‹oñ[_|™k<ÂßþùÀÿÙ¿@ïâ½»¹ï§?Ÿ°K¯”³®ØÎœ³kÈŠ¼ŠF§ µV‹ µA³Þ¢Ÿ&¸¨NR¤4V×Pa„À1÷ H(ŠSä$ã!²JE4m–šK´šm%$ƒÁ1ý£=†½oÞ¼ ~ô€iWÏ9?—^eµ)帛~ð¨@A‘°{Ðcuy™v§sŠ(©Çµw½†~ësÿ‚íKçÖp½~)gž—Ù»r4(ýÊÍÜnr|pÌíû}~ìÇ~üáÁ NÞë$p*v·sÝè³öuEœºÝ2nF*íG¹Æøã<á“^™â]ì5ZgÕÁdƘÂSè‚ãÃöHÇ#ò¢ Í œá&yîD æ… J!„B:δÓ¨ÇDqä KõÇëë+ÓµâÝ qÖRh¹örøu6IÅû\a{ý<GÇžLÊ2”•ïˆ>úob (ËuàׂœFþ‰‰RËÏÌ™û‰)Ñ"óçÕ³ŒþfÌçHšSlޝ—^ø:Íz qüûú|Éò„ëWßz!.jQ‹ZÔ‚XÔ¢µ¨?(ÀïæÀÿäÚ¯×ëÑl6ç.'·ÖhF£wïÞ¥×ëѪÇ…)È(¥ÐÚqp4$+,E‘"„$ˆëÄqäÍÓ”*çÍÜìÿüŬä#Ÿú)™ëƒ€¸Ùgˆ…9SBðÑ=A\Ü^åÛ?úùÐãŒÇ¿ü/¿Ê«o<àOþé?Ïüù;\}ä÷ŸC}Ò‘¾2Ör®rJwÖbËœðBg¤™'žxïÇrj€1Ȱ†u0 #ªÕ©5–‘*¢Ñh TH5* ŠëH) dHD*¤Ð9Öh„ÍÈ}ö{Çߺ‰“ ” 5…5~¾ê²âÁÿììµsDaa,ËJ°¶¹Y*<¦¢ÅïÚÁ{wç{7yòú%@PhãKÌ)cáDÙ ÷¾ a-‚QÂW¿~ƒŸý“æýò0Öªr«wSéúœ—½˜‰AäÔ·'žÇU3ÿ³·Lw9Œ1äE†6…W´Ì€«BçdéØ'DšñhÄñá!yžÞû@¨rÝ %–ôÆî¥ƒˆ@ùí&ÎØiäÛ\%‰WµÌ˜ýMâïfÓNnOÿ^Ý ñåÁ -£+­›Þ+79¡Š‘Jb)Çʵ3,€=M8”ÿNþÄÎlG[ú-¬n_FJ‰TJ…Uê‚5†½£}>÷•ßbO¼qú -×Ú õd£sŽúÿû‡\Ú^% $JùµœkMš¤ô#ï1¥ˆ,Eäd9&×di"¨è m Lâ 9Ý-3—sbÖ•¢½Áù­+AŒ5mrï¨ü&—ƒÕZ˜Ü^ÅþÍð>I˜n‹Ó$@ùû“Ïsòxµ¨E-jA,jQ‹úfÕÉYèÉõÜDzÇÑ 0p%Xs$ɘÃÃvv0yôÚE>þ‰ÓZî ‘ìÝ{Àó/¼Â˯ÜÀêœÂ FEŠsÆÏÕ:W^›¯cªå~߇¿¶X¢­ ¬Š2Àæc0š@x9i‡¬-·SzÃ1i–sn{•O|ô)®\Ùâõ7ïòKÿò+¤ºÆ_ù÷ÿ3~ä'þ,*øÆ'®N_èº ,M°¡-»¦Îùùhk5Ûç.ÓhŸ§^Ø"cyiÕ;”ç9£á˜ãÃc’tˆÆÏ›ŒDkŒóîáÎ9åçÊ€(ðd@¨B0m Ú¢`8ì³¼¾Uª ¶Zã ʬg8ÙqS¡Òíi7jœ»xqîOŒñ$M»±ô®·×ç×¹x~ µÒAu=¨+åß~ìcºi=Jñú;,­^à™§Ÿ~wûæ µÆTÅáNK¢O¬}qƾvgš2ã®>“ŒQÎWº 0…° j£)Š çlé¯`®$´âšïôOÞ¼SVÆìM€¾on÷P@Lâô|‡WKžH©fÞ'à\žÅ›L·ªƒï涵嚶çiš8PÒC¦L¸s\‹8½õÊÇȳq5Põ~WäYJ£Õ&Œ"” BáôúǼxãEÞ¸ófYg»þœÀªb†º¹ð€ üø’vÝÇåú IwHÞí¡{\„ë ÍAkжȱƒ½þÃãqÅýø‘¥2ÎrÎQQ¼m/[ qä¦ÀZKXúGˆjkøÑfþä{9Oxµ¹&„B ¿N&#ˆùW5‰ •!ÆÚÆe®=þí,©‚#Ó3jêØ.¦¼‚ ”bk£ÖÞG@†þ`L*ž~ò2ùГ´5^}õ.¯¾~—ïùŸäÿðý?9wáê¿`Ò+ž•³Oôþ£ù¡}?ÃaFœâæ*¨ˆz­EÔ‰‚ˆH8SPFkšµˆLk¬±8ãPRy€J†5µ:­Z(¬ÕÛ(%è6/^ªö_Qd¨“×L»Ø®Œæbö÷º F [çÏcKƒ·(Œ¨ÇuÂ0¢Ýl½ëmõÏÿÙ?ac­ÍåË[,)} ¬W&sL Î\é*/—Z˜ÃŸû—øéŸùÙê¾õz½T¥Ì}q ¨LÁ§‚0d{{›øC<ýž§h6šH!hÖê%·Q`;C,¸yXrBEà7·­~ö>…öÒõBh£½†)*°Ÿe)B‚ (Gb$By@쟻L2˜@Z)ªô T ¼zÍXï1 ÔŒcüj)Š1k›û‹Å‡ò¢µ¨°¨E-jQ $€˜[£ ažqæÐZ“¤ ;îs÷îmnߺ‰.rÖV—Y^jš,O‰Â˜zk…sÛ›¤é˜Á _vCgfìÝ´ëhCÊ€ïøžŸe-04‰sÓ_¡Ät¤=TÔâcg@š…Ñ(Eš Û+¼÷½×xìÑót»C~ãsÏ‘šñ¯ý'ü[ßÿ“(|C ÿ,Âd. Í•àÇû>ðqÂÆ«ùˆ¼Hh6—q2DI?×J…’!“ZÐŽ,µäit¥ßýWRJ”THII-ŒiÖ´k1A1IêXÚ8_½´4û¤ö‰Ü•Ÿ4Rx»úRe … 'äð¨Oši¶¶¶GúŒz¥Öh–šï^pppÀ׿ÆÕ+[ôµ"Ksdà ³sÖ'LÖœøÃ/?÷þèwQ¯ÕqøÑ’ÍÍMRJâ(fme ç.pñÂE.¿Àúê* ËÀÉúú/^À9ËsÏ}ñ8ai© øîy³Ñ¢ÕhE5‚ *³é%SqÿltÞaɲ?¹v%èšt`qã,Óq‡3­u¹„ðsýbؘ̗Ë@Ï¢”µOþ/fæ·'ÉKËÂZ\uüýÌýÛ\^LŽwQñᜠ šœ°¬%Ë3V£‚0ðzc½(cð8á08ú†4’ïßó ~†ÀpÖb¬ÙˈÂ( PRù¯29@–Òx¤ER£(žn« ø-_ÈÎá.ÍF›Nk™|Ð''%±„H9"åü÷b‘D  9FgÔêµêñ’<õDŸµ³VzóÒÛx¢âRV#CJN÷ÿäuK)3ÿM@ºR ¥Ô¼Ë‰w€ª6B*¿>gï/N¼†‰¢€3_ä4}`öofˆ€W_yŽV«AP­­o„Èò„§¯ûÛ,È… `Q‹ZÔ‚XÔ¢µ¨?àÔ·ƒá€Ç{ŒF£q ï‚ÃhMQtxùåyãõ×Ȳ„åNÂ0×­j­{{;ôú=t‘— yz±\ͨ—OðìGÿ0r ã/0g»³Î'– @(EXz 乯Z77×=N3Žzc–Ûu½¶ÍG?ü8N‹—_¾Å«¯ß㣟ü!þWÿîʹóWÞxØÏnî œ QoómŸü£ öö¨EutÔšòÊËúƒ„È $ b"€õÊ5þ¥T¾K(ýE~†J‡1!…ˆ‘ÃA}…Z †´ÑÕ+ô˜Úùn­Áèª+i¬ed@ÑŒ9wñ"®”y«òy• è´—¿¡õ¿úK¬¯¶hžß"è÷*8ã`Î÷)p¦„¶“»Ô¤88æå7öøÑû±r=9>>æòåË<óÌ3<ñÄ㬮®úîhi`±µµÍúÚíf›«—¯Ðj¶¹ÿ;»;h]ç9ËËÖÖV%#ò<#ŽcZúô«7ˆ£ ƒõz›F£M­Ö¤Uk²Tš2Ö¢:J†( QØI\SG÷ ùbœEEe¨²¶Pe¶•Žÿ³3ô®¼BPœ˜ÒÈÅq„ÄGÖM“ &œØÛ_bL W¨Â)9ã™Í*Y–M‡èD'H€wŠ´ÖpnãòÛÆ®Î¯ÐÅXÀ¢µ¨ÿéÖB°¨E-ê›\3²üòBòµ×^+¿^'Ï –––¨ÕâYTàÇ’„ÃÃn¼ù/½ôwïÜâà`îÑãÑ[É}ʼnYáéÅ¢RŸüžŸ!Ù=&cbšM8#_-œïn]¹¼5í(—÷vffYL¢ðJÕ»‚Õå&ßöá'Ù¸v‰ƒ[;¼úÆ>õÝŒŸû·ÿë3úyZ pÖÅ©>üñt‘fïƒã]:5r&ÝRI (ý}g_IE(” |×]H¢„DH…@ù° |Ö¸åtµCIA=Pˆ Bèœþ aûÂU@ ‹œÄ)dcœœf³ØÏ9hÔÀ<Ø=¦ÕnRo6 ÃÈß ÚßÀÀp8äµ—~Íõ6iÔÀv»55Л<·³þk7I)pQÄñ­d¶Í‡?ôá©w )Áÿü{' ÍV ­5;»;庛à?š‘ç9wïÞcŸF½Žµ­½ƒ5š@IÂ@†Zƒf­A³Þ¦³¼ÉòÊyÚ-šÍ6õZ“¥v‡•å5êqm4Öšµ°†tkÅÜÑÖw—•RdE6£p2!+f…ÂQy_LÝg}ܵ.È’©ÀÌv ü§·LŒƒ0œvÞÝTu3 ="ŠH&c3|Þ<Ò«ç¼\>œƒ×_ü2ö Ή™XE‡És¢¸ÆÒÚÃtÌ0M½Fé‹AE $­Zz\# B”˜ÌÏ¥Ùùo~í‹¿ “0õìÕ°NôÉ÷"€×Þ¸K¢üì_ø?òíŸùájÆûä%ðîm'ÝÀó—çÉ÷7{oÞãpçuZ6®¾kç®–û,ó[Ëzƒ³jFÛ2—iïŒ#ˆ"Š[wˆBÅúÖ–')TX9¾/µ:ßðZúÅößqåâ&ë6h*WJý) žroNÖ›™ÊÖQ¯ÑTŽßýâ+üÈý'w‚{Òúú׿λw±ÆTj“iãÔUÆYš¡sÍæúÍZƒ8Œt^$cºƒ>ÝAŸ,ÏŽú Çè"#l´Ë,µ×X묱½¾ÍÅóרXÞ@II¡=‰Ðª7hÅu!ñ#”=~WæÈOФcoݼ ¿¥á¿*åÝ'ß»(%âƒó"ψ‚èÔ:=å±.NãT!(]éKâ`FNEàÁ E5ÿº˜r¶÷mçŸÃó¡B¯Ä¸ùµF¥üóù8A‹¶–ñ¨ÏcO>ËD[ÍzË»1W}–v³ÍR³M(ZµKõ¦Ûc”TѨJ§|!Yž1JÆH¡ ÓYo‘˜’øu@R:ý‹À/%BÍtö¥ò  rž¿zÈâ@JUN©˜ ¨ŸâóÓÞëÂËŠ€œ& Lêõ×^à¹5d³yZýð.H€Lg<õØÇ¾Á³É‚XÔ¢µ µ¨E-êj·Ûlmm²²²ÂÖÖ[[>[¾Ùl²¼¼ü9ù ¸X›1頻ÅÜLKÖƒ…|â‡IúcÄèˆ. J}³×í^ ‚°ŠKC¤’4šqeþ7‰RL»Ë“Ëò2‚ËÿÒU_È@…!ç¶W¸ty‹Æ¹u»ñüÏþïxöÛ¾çìwêæ vgïøî?f,%0VÓ\½<#½÷¯ÃÏ•OÍÍT¹‚²Óh…—O1ƒ˜GB–³ Au¡-ËjbepQ ¥TI|8Œ1ÈÙ.§+Á?”ÝÌrl"ÒëpÚÆh‚ $P!A×–ˆãú7´–Œ1ü‹_ú._XÃv–Y%›!Œ¦RwÔW3É«"ç¹oóã?ñS§@æÙkpf>ÛMé…Yn`2Ž2 ɲ„¬È‡$é˜Q:&/òj4 ×)δÉIÒ!¸å œN1Π•å6ç¯]eåâ£ll_¥ÕYgus“ÖòZ¨ª#[ #¯ gýÜ»s¦œv¸Y|VAræ­U}i­«ý¤g)мškwâንyp:}Ü`bv'æ6ÝÌövôºâ8B uZuó§²%‹¡dè •â­W( (Œ)M<£ÈrB"…$PÞÀCa4—Ï]¡Ýª³¾ö?ñ’(ŒÑZS9ÎY–ê Zõzƒ(¬yü÷}’,A)…ËrÖWÚŒuEoÌl Œ«|7À‘9ºTDLã?Ý;àU7wˆ*ÕÁML>å¤Û/Qaˆ ÂÊlq¢rªP2˜¦NL:úBÌíÓé:’ó±s€~&)`– pî™1Qìî<àòÅuêµZ•Èòðóäé?°ÖrõÒ“‹ÛE-jQ `± µ¨E}ÓODåæýû÷ét–XZjÓé,ñØc²±¹A½^g0Ì]#žžŸé¾‹D€‡› sÎqñêûØØºÆZºGÐ\)çrçAžw@AJôÌk­…¡7Ã*­ÈsÓxç°Ö¡¤-J ¥ÉÌÞÏÐJéGV:-._Ü@4ôïìpt<æÃŸøa~ð'þ•͇n³ËWß˧¿÷ç¹c%;`8êÓY»Hîä)C,‹—ýN.Ï'TŠFUþ­ÌZ“Í8€OOÎ#´ºrÕ=û½õf8¬5XD™0³]Ëø=clÙQ¤IFž¬oma¬ÆáÂ8®S iü>Æþîßù;tL ±ÂUôÈÙ×Ó'Æ"„*A­%¶Ê‡×‡]–V6‰ã:‘òï[#1v C*.Æ9œ)gÑe@šô† ë[ÛÞ;A*¯#R í¥•ox]½ñÆìÜàÜö*yÐdE3 ÅN;ò'@‚+eãC²” ¹³“ðéÏ|×»|VW›œ¤sNé3¾~dE“9Y–æ)º(Jÿ çg²äiJ22èÓ=ØeïþmvïÝápïÉx@†¬¯/³²²B× ‚õz-* 0’5%*N¨„ucò™} ÑÖx¥Aæ‰!Þ)ªn Z•ò Ü °%WJD‘OQj:Âc-VY”5~iSDc,Jþ8²Šfõ„…ÃY‰¶$¯|Ô¢_PÞ÷£š)ù‰é1ÎÍhÄlÔéèñó¿Ã§¿ÿÏTJ’És‹wæ“c2Ë3ž¸öa¾ôüoþ+|j 1‹ZÔ¢þÇ\ À¢µ¨oj ‡CvvvxóÍ7«¬ë“—Z‚yóþªÛ?—0§³žÂ™™Y€åÕó<òÄGYË{H)éjõÐk<Œ´ðnèåW.m–€]T’ñIרYWLd•GÀ,ø›tŸË÷$+É1Ôë1ç½ KKÔúLj£c®:Mœôp£C‡÷9Ú½Á›¯~‰Ñ Gme“4^™¤N·ÂŒ›š-à§WÝóÀI2Ss¥·ú<€˜tE EF–?ë?>Þg½s‰‹ÛW&¥(Fþþßÿû\9¿Bg¥åßwžyqã5Îqj–Äëy G:„Ã#œÚä±Ç{(¨8‹ šüÞ¹ÓJwÂuß¹©ò üÎYš‚¬H)tqâ>ë4E‘2ô8ÞÀîƒ{쑌ÇHÒn/±¶±É…KW¸þøSœ¿p…+W¯qþÜ6ívƒz=FH°Fƒ³%ˆ*ÖÍ°éæ‘•TŸÊíÝM:–vþ!v&Uá”OÛ ŸÀÌHJ†%!%f|J©z™4pÔ?¢úÙtS¦z(ÉÙ$a™tàå8N©Œ)»ç øú~™ååU¡ªTŠîÁwßz„C;ãé²Àwº“qRÍÃÿâ/ü÷¬/7ùÈÇ?ÅÅ+SCžçdy†±¥¢0®æþ[õ: 9îwÙ?Ü¥&¹ Y¯+LXCOfúE@¤bB!988ªÞR¥q¡…"÷&œsž&o‡W§R|Yý©0$Œcjµ:Q{@–ßõ”ïøQD…„Q(Œ¼"@NeþžØ¥i ˜¦‰HUÉý³]qšLš;F'NaÕí¯¾ú"Kíº§„§÷}¿6šG¯<â“¿¨E-jA,jQ‹ZÔ7©F££Ñè]+1£Âü†ú/3häñ§?΢G=ŠÚÚã P•4Õ•Ol¨PqíÊæ";ߟñ,¥ô® ÓÛO_“Š)Xr~tÁMŒ…`cs…Q³CÑjCÜD)I¯„Ö9J(.œ»J}ý ™ ç\íʼnítòKŠ©ôº‰G—aq–©~Bœ2V¬AÄ-ë^‚<1ÔÃËú˜¥zTH«Õ™>Âlàì£:èE[÷Æ8K+Ë(`ÎÂV{å÷µ¶†Ã!_ÿêoÓi7qÍ5V] ãåáölà$•œŠ§;mÚJsûþ>êOÿÜ7øì§ã!qîÔ÷ÓߟþÁ:ï“çYe8!’ª}h F§dÃ>‡»û<¸û€£û»ôöÉÆ I½Ñ¢ÞjÆ5jõJ:B%hÖc¢PEŠ( PÊ«Dù­µÕᣋÌÏ}A%Ï/¬ÁiígÊ?gîæìÞßn M”(>…Â¥ÚÁÙ·Áññ1QP# b”¨Fà§ã%ó'lý؃ B„Tå¦õÛpçö+¨ ä‘'Ÿ-IBßµû¬o^©<=ªyö,N~®xÓÊ0 «HÓE-jQ‹Z‹ZÔ¢õ-Rë°žÑ#z[´!gf/^¼ Ä ÙadNw¸‘òÿÏÞŸG[–Ýõàggºã›_Ì9§”J¥&$b´À¸À@yì겫]´¡\¶Ûîj7«Xí¶«Ú]VÙ Úq fƒ@XhBhL)ç)"2æˆ7Ow:ÓÞ»ÿØçN/"2SR (t±ÞŠ7Üw‡s÷9o¿¿ïïûC)EèÅðBiæ[u/Á6ù«Û–Ö>õq«ï ˜ûÀH:;R'Ti~ƒìn¾A£Ug§ ˜_9É‘ÕS̯ÞÅÜêY’ö*Ú•p»h0wë‘°£N\ÕúÓ ?`&6Þ“f€£*3°–AžR𤯦ÑAÌAg—ЕôwÖ* °ç ¦ 'Òœu8)¡HYßÚ 57‡”’Ì 2+ IhÏ/~Ùkè7Þ÷+=²@¯¹H6è@Yø^z5ÂJgà­±#8)¥b· 8¸¾ÉÒñ7Ðn·_õ$&»÷CuˆÃÝùOžÕ±ÖP”E‘S9¦,GzY0OXLžâÒ..ë#M,-Û»¬­íÐíf ›[ìììÑëuQÒQ¯‡´[uæê,-69²2ÇÂ|ƒ$‰ÐªŠDEŠ"ûª¬{k ®0¡ÆŽÚÆ/m:ònd˜Y¡¯@éQ&ü09cÒAá‰ÂP…(©}üP©IçÀ¯j) B(yÊK×},Ï<öQ¢Z߃ŽJ‰ h4–¦D2B€Ëzc2À–X úÍ÷‘ç}VNžåÁG¿´¦Ÿ§tÓ>ý<©1ò"' Cêqͽmöv©»>Áb¢§ÀªÝ„HG,,-Óž›'Šcœc¥Ž;äõ!ñ€z8ötKJ^åÜ/|Ê€Vš0 ÃÈú ð§¦ÇJ%Çf•ÙßPõ„ô ßêÊÐÿ/”BôÄŽWP­!Õ(@V¤ÌÜOqXØ/üxÂÆú5B­ÈŒ»…À»…¸ Â?èîpbõÄ+q¯P3æ`V³šÕŒ˜Õ¬f5«? Šà¾>¼Y·H¤¡c‚;oê&AY'$2ÒÔjÆØŠT¨ºþU<—q[Å :ã0U·¥õ¤ukÆÛT)DELÓ Aö ¨¡—Ý«€)3*k)-È‘ßÄžwBé?ø‡¸S Á¿ÿ‘d8& †:G>èBpmó [ý>N…”¥çÁŸ®5‰Âc¬‘ˆ#EœœU@åþïê œ)ØÙé`œ£1×FqeËàÆ—c8¬|ä#[i5kDIÊrLB¸‘+áÔ{>eUÇÌ‹œÏ=þí¯ý¾$¢jrMŠÃQgn"=¹©Õk'’†&Yž‘æ)Y‘c¬­dÝrZWO¯ß%Ï3¤+I\‰ëtÉwØÛØeóÆ7n²»¹Cç K¤5íVL¨µ8de©Í©KYiÓlD~N\ùys­u%íö* )<¨3¦)Jc_%Pªb¿jšà«Ãsc‚Ü”@¨%ÎY?º0I²LïŠ%8)AŒÅG£4¥”œ{æS,,­Ðj/a—ñŸ¼ë!Š"õóò8Š2y¿‡®×Â0F8+xé™Ï‘õHê-~ô›i´æ+ÃCïR”†ÂŒ)I¢%%Ÿ{ös˜"§D“e9q#¡°>4SÈøèQç,+ Gh4Z,,,Òh·‰â„I^Åuá;ñU—_ 9Ïb‚øŸ)-‘Zy·ÿ ‚j ÉaM9} R ¥ôHAáý¼ëø¤€@‡£ûÑZW¡ýsAŽÆE„¬îK Ç“#µÅ¤MDõ½‰×ðÌS_ ˆCJ'˜’?ÝŽ¸ ÂÏòwŸyËkäÅŒ˜Õ¬f5#f5«YÍê5‡øî+5[›LaŒ#&·`îtE¢\¯Ü³«Œr ¬Åhí»`ÃM-*k½9›±%ïvøsc+%ÀP6?6ís•¯ŒïO ÉҜ易ŽÐŠH þÄÙá}.&Ʀòc8F9²œvS({Þ/a;dÝuT`Ø-«¡²2*Š8n„ Åã¤D·BÀá{©|Š‚t 0ÆÒë§´› µfÓs®Š“’V{þ+ZŸÿôï3?ßdG´YÐpôíê©XÀñqÏî‹8"s’+ëÜõÀ;o‰üR‰ªiO€[oiÝ0mÑM|ÏÇ*æE^EÆØG5Ž,Ïé§]úƒ.é O™{Ïi W2èî±¹vƒ½ D‘{uAVEžáœ%Žš,-µiÖ#¤”ÞEB{9¹P#NY¨ÊÁÞ:;2<´îX+n{Î;(Ëá@*qe5C~ë!vÕ¢®‚1e3%J…ìuö‘B`œë°eÎúµË,=]©UJv¶×8u÷ë9}êM8Wׯy5‚³,/µq ë=œðF‹;W^`°}­CxøÝ,¯ÜU¹âƒ–¢,èfy†’ŠƒîOœ{“α2©°¢2!HûŽ-­b÷hÔ›´Úó„‘~²ÿZ¢‰R²râcãÈ!ã7âÔ$Q„1A¢u8âž;1S~,^cF£+ÖºQ`F(íÁ¿RAå# =áP™;21ÿï‰M=2M)ÄPR=ÿ‰DˆéQÉ‹/ÇŽ?Àý÷¾ÝwÉu@FÄQÍKUŒãçŸù,ƒî.E‘Qî­!›5 ':Dê€H Ö¶{Ô„½½múÝLY’¤D^) •DŠ( i/¶i4ë´Z„q€ $ZkT ” ´†,ËüuE)tÅI­F½Ñ ^¯S«Õˆ¢¨ö•‚JJêEÞ+µ‚®Æ¤ª¼´% (©†#J#+‰1y£*’BŽŒ|˜Ž˜P|t;DÄñ-çÉ«!Ðt‰ÂxÀ¥$3`V³šÕŒ˜Õ¬f5«¯ðåV«½2ê>;w›Œ2qÈP¤¬Ìè„â¾³G«Ž½™pØ®°^ê?öÒ6ÏÖØªÛY9ª»±"À”† ì9aˆ%ÐZB¯ë#÷¤<´ÁÊéCBᦞº˜‚Gãô;²“÷*T•yîúmºGTŸ§¾²»v¹ÖN[dÇDÌÙnõçÏz?€Â0ùLÏì¹€z¯ËN'àë¾îë¾2àpÀx8ô3!¦I¬alá¨fEÊAoŸ^¿Ã íS”ÖZ´Ò$aŒVŠþ ÏöÞÝ=ziƒA†$I‡ ŸöY߼Ε+ç¹zåìÁ6;k›\¸xƒËWoÐítQÂÒ¨ÇÔÍP t€Âws‹2G ‹¾sï·•çß Ãl•'?¿H4 ”A†Qe^'d}” £8Éáy:±ö‡¡Ãµh ( Ž°Î²ß= ŽâÑ §”äÜ“eåØÝH¥Á9ÒA—lÐåȱû¸¶q œ#ë÷8zlcZ‡Þ#À:ýÏ]~‘ÝÎHˆÊ¡éÑj.ñÆßM3©ÓHê4“:s¡òóúE‘ó¹§?ÃAgNwwp™<ö)QS«µ1Üwÿ8}ê KË+¾ã_8[T> n¤ò‘ZFõv¥Õ%Ú -ííÅõ¹&V`¡pÀÎÚ[[»t;Š<÷k&‰i44›-&µZ0Š*yÿÐ À_GÑ}•"@ 9ºÖ(åM¥RUºÀp$`˜P¥TiBŒIÿŽN~Ñ÷Æç¦cwƒ (ímÖÕ« ²¬Ëòâ±×ú¯Óìô¬f5«0«YÍjVšH€¹ùÕÀÂÝœIŰëM%ß/8!Y]j:Nei1ÖwüKããÚÊ¢ÀX/û/ ï0Šîªb¾nuHÇwú':ÁA ÑÊÇ~C £wÀ'3K”pSnڇ˾ŠËý$àM$Qg);ºÅÆå'‰ÂˆÒ8úiAç&µ6Ɣހ‹­4òN°a,@õŒœõäˆcèôèrssÜ•%DŸi‚Fsî+Z3ýèG8²¯,àl E^ *äè9<&@ö¨›\o ËåË7øÎ÷þÀ-÷äÈ‘¯h}º[ÌìF¾Óë“éÑŠ²,d}ºƒHh6?~Œ ÐDaÈ‘Õ#4ÚMvöè÷; ²>ýÒ²—•ä""ŒZX'HËŒn¿ËÕ—¸|ñyöo\æÊÅë\ºrƒ,ÏýÇ`RᤡёèÆZ¬)ª ûª^ï’Âϰ;!ˆ‚˜…f›ùF›F” „(¥È²>JklåïªsXWK[V±xÞÏnh2h½Ê$ˆª‘C?ËP¢ò5p‚ÞîMzæ€XëØ¸ñ¥’ÄQÒ”äÕz‘LS‹›¡ñ!w^ùréæ¾ðüãô=´ËIÜQ¤¹ïž·S"Éʯåz“$©Guºýo\¢×ï²µv™Z˜R† µf‹ùÅŽ=Ê‘¥£|Ë7~;>ð ó KQ02ÙsÂQ–%eY’¥)»;ûlï°³ß!ˆC—çXXn3·8½ a) bQâz66·8èå)¦ôæ’ZÄIB³Ù¦ÙlÇÉÄk­‘Ry£O!p¶‰šôO­n!AøˆÀ*:ÒÇÿ©ñ¨˜ðSQRÁ0Í@Ü¡¿vãI- ¼m×ý•I€¼4Ü}òuwœýŸÌjV³š³šÕ¬fõ§øRÇ’ÆÒ+\e5k?”ÁWg 6PÔ1eQ`%/ ynÈòœ5ÙÛ$®Ï1w¤Íæå8²|ŒÏ>÷y¿¿~žf«A†·WSùZ†¾Š“mc0ë¥Å‚˜]°³×ei±M‡ }âÁ[|¥ c O=ö––Úäáœ7Œý¦ÜëņÎZï–ŠVÿ€N±ÀÙ³÷ŒnÇ1ïxÇ;xôÑGG&_¶ReB 0L' LF üºÉ à SR«'´çÚÌ/Î#,´Ú¼ùMo¤;èR9: ÑaŒ "¬Š¨7Iâ6R… y‘²»·.zdÝŒÔH¢ZLÒl„5ÂF‹¹•eV–—XZX@H‰)3 k½ÉÚ´ »-FºÀûW¡¨E1Q…µ(FW¯W+MDtz{^6î`ÆFxÕ#Mkd„F°…Ûµí5šÖ(vPÁ¥ç?ÃÒѳDq)=°Ý^»Ä™Ó"\Y¿8òÞqsêØƒÄ*$ B¥ˆd€[žxñI®o^ $EË’ûï~q2G^–„AˆÖE™G!Ûû;þ½1–ËÏ}žd¡EÏHçY]]¡ÖHP"¤V?ƽ÷¼¤–%Z{Ó?©ÖZв¤?HÙÙØâÆ¥kô€( ¨7j,®® ƒœ%Ï` ò^‡½Ý]ö÷÷é÷{y†‚$I¨×k4M °°0RcŒO/±n4U–†²4Õh‹ïðë @IíÓ ªYþѵIŠÑ(Àè{ãt‹¡ • KŽLM®\|z='¾Z`¸*-9ºz×mÀ»ø I€YÍjV³š³šÕ¬fõÇJÎ\Ÿü¨×ۯܟ©f‘G8Ðy[vGh%ȲSZÊÂåiZå%eaÈ‹r´ vŒœuÖG—¹±EšÊª{&„À8‡T~ž7JcH™7ïò—ë êá $ö+î?Y$uå(ŠŒÖlR‹ë,/åææ νð íVŒ kø3‰&°Yÿ1JœŠp£Í¹oÐú×Pöö88PO"â$òcŒÎ“Zó+^'¿ú+¿ÄÙS+ôâ:˜Â83žW˜Ê@p‡Òëf᥮òþâ_ÝïÉ“'‘R²¹¹I½^¿e]¾jà?PàÖ~¢s>(ÿÔYÃAg››7¹rí*ç_:ÏÆæ ‹ó$I pœMú[ F^#SÑ%•Š«F°¦Ï‰¨Ì3w·7hÔ"DãzÙx© ½\ܤ¬¸*ÆZâ¨Fšõ¹õáÆƒ6·{*¯ðè®Û³šÕ¬fõ'[3À¬f5«¯‰š[8Š5î–íÝ-û6y8wZ@07ß"MKJëý‹Ü’›’²´…؇«‡g¡Å´C5€ÎÁ{ºR‚( C’ Hï¢&ïwíèvæ¶{ûªLSMm(Š”š4Üe^°²t”§^||ú¶W)Ûs¸l02þó›ÿ—9ÆC3NCèïy°ЧÛO ¢a½@II aTMÖÁþÀû8sr•ÝRÙtDT†aܤ;ÿØR`U@HÉùg/óþâ_åÈ‘#´Z-666ïpìØ±WEJÞÚ‰HIïMgÇ£S?²·6á9(мrÏ·dEJ§ßáéçžáÂÅ ô³.{ôÒcÍFÂêÊ<ÇáÌéã´M¢zcJ"tLi¡,r°9زRÈXºûòÜШ5Iê5peÅ¡Ý |†RûÑRVúAS:b¡„B „@ËЧ_TRñþ ;"‘†#43z¹ÿð!ä$É',Rˆªk=VœäEÆí ¢0™Ó­_~’(nÐh/¡£S07wë,;>ñ¢(XXjad„!Öš‘É”Þ/OHxòüS¬oßdkç J)V–ÏPXC'8kH¢˜Fâçìw:ûhrñ¹/â쀭›ô:[D ®_ßæ —b…@j\ŠÒ“Kív#Ës,-µ9rd‘׿î,o|Ã=,// oà7”õß{×1¾ÿ{ßÃ{¾é¿àÁîeqq8öéAY:ûìïÓíz“@SZ” Èr‹qŠ»ÏÞC£9 B„T~÷„µþ:hªaò BLâ@;ÿL`SJ!'®ÉÈBCžv BEny…ñ{wÛ˨±†Õ¥“·åà_»¿4%ÀL0«YÍjFÌjV³šÕŸ`—fSjbrƒhÝhLïå|üU(z½´êîû®—ÀQ”c‰±cû{QEüYk}÷gà…ðrZSZÚÍ„$è4”¢‹CÏúP‡K)Èz„RsëôÕ*J' »Eט;µÊãŸú( íEž~éYL%ËÖ¿ð9Ž_Â9ƒãñƒ¡AøˆpÛ{wh'^5çŒ1dYV0(2öw׸yý7¯¿ÄöÖ:qà¾Òúý˜ã«1j± @Léß{kª‘wËŸÆ)ÜP«‘:M­L‰Z÷ñÐCqõêU¶··ØØØ`nnnäp˜¸óHÀ„Œyˆl§žƒ›ÊH“‚q„^¡â,QUD†acsW9îKåØzƒŒíÝ›[]6·ö ”Ð*$ª'È b`YA^زð>ÎêPizÝŒAVú¹ð<Ÿz߇ )%AÆ!Jûȸ¡·†«ÌüêqÈB³I3I¨Ç5jIFÒ Y«é?S.é§]¤òså¦ÌQÂNjâm“¢:†ÖG¨IÍjÜâêúUZ‹!½) ÉÙºö"J…Ì/¹BöÚÍe®¬_Ã7®^§UQ„ôóÜ'TãCÎ9Jk±Œ;ây™ã*‰‚’¼´eA-©SäA-Œ µ¦0á»×ž¡Wlìlb³.E¯ÃúÕ .]ZçÂÅ›<÷ÂÎ]Z£Óí3,–ÄILÇÔ TÒé°Ö¢´¢ÑjrúôqÞö¶·ñ-ßü.¾ï/|oë£?q”F³I­V'NtRš’þ ÏÞþÝn²ô®Y^ÒK Μ9C«9Òa56%‰ÂÈ¿·*&¢.‡î¶ÊFóÿ£ñ1ö ÃÀ‰óâÆÕ „¡¦8œèâÜm8Ó‰¹‘…†áØê]SìÁË‘³šÕ¬f5#f5«YÍêG5¿xt4W~+° šŽÐ«þ{y‘c÷ØÚÞçü¥›”…»íK1j;k)¡4fäüo+×q7j.£}ç 4˜™ÒoÐÛ­I§3 w’ißwq›Mmõ¿Ô8‘°ÿÒQj$Mm º ¢î9ÝýGWNð¹g>wËí?ýéOqòØ2i¢]1ü !œÑòÖV¬óÇ<ËJÒ~ŸË×/ñô³Ÿæ‹Ÿý=¾ø¹ÿÌ‹Ï=FYš×l-<ñùßçäñUPšùwÞÁpbœ<¾H…#3>! &%WÏßä[¿ý»9wîý~ß¿vkÙØØàĉÔj·’QÑjµ¨Õj#ÃÀ[qÆÄüôP`Ýx’C¿‰É{–f¼å-ož-{ ;Ll`´*<'è÷2–—æY\œG‹€0 Ã!¡pþv¡Ög8¢ $RšA7cм@ «7TvPeQPoÄ4šu­RKŠ¢¤, B%ˆƒ€8ŒÐ: Ðq”P«5<Pk5„Ôt»ûH)Ñ‘öDšMì …§Ê”œ>[„ôÝâ`HŒäþœ½¹³N-J< éÁ&qÜ Ô õƼ³0†Z²€µ†Nï€ÞÆ5„3´çš?þ€7`Lû”e9Š-Êb4#ƒn¿;"º†×˜n: °!%eYP¹÷1…)Èó>Âvq:áêÍ+¨¢G,Jâ¢Ëö…§Ùzéiн=ö»Y•¦Æ”dYN·;`¿Ó§ÓKéôrº½”¤^§ÕnÒjÖ™››caacÇŽòÆ7¾žS'O³¸´ÂÂüËË«,.­ÐjÍÅu”ÒX Í2JSâ,ô{)Eé8yú4G—Vi7[¬,¯°¼¼Äü|{ä0oúVLy´X;-­w¤ÆnýDH®^9GG·ÿÅ;*ðÇj!Çœ}•W 1ó˜Õ¬fõg¦f³šÕ¬¾&ªÑ\ô3çwÚÊñÆRE–StzÔ¯ðžw?B¯Ÿqþâ jµ˜Å¹ÆHZ+0(%¡þUÿX¯¨Ãùã¡LÖZ‡3v” ШÅZÓ·ùAŸH ƒõî´±tâ ºP¤FÐÐ_ P8AÜÛ!I§Oð¹þ.‹í%.ܸDž§·ÜÞƒ,·Ù)cæËDᆠ@¨àÉWák1ÿJù¡må@It­ÅÎî>/]<Ïó/>ÃÿúÏœwÓ7Òívùóá¿"Í_»?W¿üK¿È?ûß¾›ß~î" f×*5t¡8}z‘,7´› JJƒŒ­ÿ¾ÖÒ^ÉÇœºëõ¾ûËxÖkk‹z½N†#b Ž9BY–h­ÑZÓëõØÞÞfnnc »{»‡$ÄÔÿ ¦Cù´7@ÁÞþY–O>Î.Ë‘Jy2ch~(ƒ^N‘4› ûJâJ‹D"„2„ ‘BD1¥1ÞõßA({Û{̵—¨/ÎcZ ÂçÜg9EQÐë:d¦Ñ& C´¤¦V¯”­¨”0Îúq‚(ˆ*@HÅþe¿»ç»ùNâL9“²z}n QŒŽy„u–0ŒFÊЇ×7oðu¾™|gëë7Ÿáô½ï¤/$síe²A‡²È°Î²0œKkWxøìCì\»ÌêÙ{Ù[ßF‡!ƒ,%ÒRæH]#/s"Tçö^÷€VÒ@I?Þc!/s¬5h¥ µ4…-¬%ÍíÒ0¿:‡°1ë›7È‹ŒNo,Ï±Îø‚°¼PgéRúƒëQ£•ÂÇ~7¢•ÄIÝGôU c ¥•$õóó Xç¨% ÎAšf•„¿ßP=ʼDÅç]¢( ÙnS¯'ìïï²µµÍÂÂ>ðä©sSXø¬HÿVTê¨ÛAt1ið(†&“bD&:àúµ‹¼þÍ!(‰uÒ8‰;_"“ 暷&ÃÜyæÿKëŸùÌjV³š³šÕ¬fõ'Vs‹G(¶#¥õmýžÒQd€ZYæoˆV=âÍÜ͵ºÖÖ÷xöü5êIÄâ|ÓËPK?*à ßñ/LYmÿÆŠcÝØ$«’ º¥@³#„ / *ë#”ô¡M¤›Þ3š7 —÷Ñ:ô¹ãÆ©Ww|†jƒ<ëS¶Oñõ4ù™mrß]ñßûÅ;þÞÅóOÓÊsÏ}š¬ÌIóœùÅy¤ÖØ¢œZõyYŒ´ s+ôú”UlbQæᕲŠý8ClÜ8ÇÊ™7 ]Ê¥B´v8§è¥DwŸ ç/3¿ÐÆ:ètzÔ› â¼ B¤jPØÙëaD€µ–^oŸ@+ò¢dw¯T1Ë+«8ëÍ7qaÒ,÷ÿ§y¿O™¦ˆ DÞï`@ÚÙ#Ë8ãÇPææçÙØX#ê*âÏ çGžœgo¹’‡ZVã¶£p°±v8ÒD0ðŠ 1vż ð?L4Xæš ˆ ØïDLŽ0ÌH€YÍjV3`V³šÕ¬þ´^ètH·)LÏÖЎÀ¦( ©´Ïç=ï~„ ×xæ™K<þ‡Ÿç/þà»9¾z„v3a~®Áµ[<÷â5æç¬,µÑRjÅ ô€ÜZ/ ffƒÃXÈóÂÛ‡³Æ4%i5êDQ@¯—ÒTvbÿ*îü'ç¿=hseNCYöœ¢0‚èUl>-’ThÜ.eR£u÷)~ó?þ<íæÏ_y‘¼Èïø»ûØGø¾¿úõ\¹ø4MÈøìÃÓ죃c,N;4eÖgsýk/ðÓ?õH9žPëöú„Aøš®‰_úÅŸå¯ü·ÿ˜Ï]»A‹>¸´ïŒKçhÔc._Ýdw¯G 5sí:gO¯’f9¥±<öÜ5ÄöªLY>ýf‚à?RűqØù¿ÙlrýúõÑ×Y–±¶¶ÆÆÆ+++¬­­Ç ó ó?~œÁ`Àþþ>YžWGÎMÄàY¤ðóæ«GŽÐnµ±ÎÑívÙÝÝ!MSŽ?Ε+W¦@‹ÅV)?‚Q±5Jrdu­}?ÝÏqK´PhR J¥h!ÐA„–š²,H³®,Ñ8DÞ¥Ÿöéâ Þl•ž ´F …3¥+¡" ŸgßA"”Ö¾kyÀœýt@^–”&«äþ“5xsKW 6È!¹7 p>A@€Y#´ «±;¿¹µÆÛ_ÿVÖ·ÖÀ ®]þM-‰yæÙçPZá¬ÀYƒ¤Ü‚²…`å(mdš`$}q8Ò´O ¼£A ‡ÄÁÐsä•Ô÷ΓaqT#Ëú¯ù•H€/5`V³šÕ¬fÀ¬f5«Yý±V£µ„5wvÀ¯KKD Bq0·Ê÷ÿ¹w •àÓŸ{‘Á åÿõSœ;÷žøô7ó ï~ßû—~€“ÇhÔ#æ›<öĶw:ÌÍÕiÖt ±V`ð£¹1XcRP–Ö›VZy3ìþ×cæç½Óýõµ-,`œ$fb|x×yÈP*¤Òà °´b`J’WPtKÁ‚NéìP´ÏððjÁS[{œ9q7øô‡^öwŸzê)~äHkÉv°±Ï[ª†ÿÖý²'(‰4=v®¿ÄêÅ=÷Ü=ºUQüÛûïyÃo}M×ÄO<Áßû°¸{9söŒ ­v8Ôllú™ó½ƒÝ^J«™°µ}@iªÙåR²ظ¶Çw¼÷ûùí÷ýÇéW8avÖh4°Ö’eÙè{#ÆZÖÖÖHÓ7o¦„aÈüÜ'O¢, ®ß¸>òh4œ8qœ­­mvvvX[[CIÉööy^ ¤äæÍh­'¼ Æ®ûþ ±¾[:zŽAž3ÕªN«™Zcƒ°aÞs@ @)jIAÚÃï„oÅØküÜ}ÕB¯œ°¬-+™¿#Ë AÐKûg mˆ¬FE¤Tþ<À€0~MQ¢¤B ‰Å „šðÉpÈÊcCV‚-ÂY¢ ¢ÕÐ:¨2ç¥Wá”%…5\ßÙb®V§—¦”eN·³ŽÖE‘1¿p”,ëaJƒ”›W8kJ.=ý8~Ó·²¾¶ËC¿‹/|æwÀvw®qüäCÜsï;¸zés¥Ö§NâÚµkS?wrc ý^Ÿ’8fa~ýý}¢0$Œ¢*ÂN’¦)õz3gΰ¾¾ΑçY–Þb\¶ÐšãèÙ‡éõS¯ÀÎiXG4ê ;Û{cÏc¥ÃªþÁF•õ.*⢤, ¬µÔ¢˜¨½HÚëJEFAŒÒQ%P‘cgmå¹áÈÓá›Û7NŒ–²Ãa­%/ Š"|Dãw¿…î Ã ß#Ð1Zá BøÄ‰a€‚noŸFmŽ$޹pé È*ÕCi–Š ½ïÆ ÇCw½ŽÁ ã¯³ÉêÑûɲAÅ­)Ò´ BÐh.ÐínÓn´Y:v¥5ÝŒîþYÚÅ9Gç`“ãw=±f)ßûWÿ"*Œ¹xáyž}òãܼùÒ”™ãµ2—®¹Æt*E½}ŒX ¤““¦=²<¥ßï°³»ÉîþÝÎ.Kíyâ8¡(ý4cwg4Méf%R À£(ÿ(ª8CGQe)‰BM£á=-jµaäG¬u#sJ©:ÐA@'„Q_…ÛŸ¸õ”ú˜Õ¬f5«?Í5K˜Õ¬fõg¾Ú‹G(‹r´q«)K»ÜƒÞ6ûªÅÑw~=ÿò_ýmæÛ5{ü%^÷Ài®?ý"ÿîÏpmí2«óc@záúK¼ÿ“àWé—ùŸ~ôïð‘ßþu’Pplužw¾í~î»ûë›{<ùìK\_Û®6„k†Ž÷>ËYƒ©<â8àèêqú±Ý$^ànÓ¾º½`xU÷€º^¤w?ªˆZÿasÐ>B›uʼ$Iê\¸zþUß/|î“´æ[h­ˆ+ÅÂá1Ü)?ç¼m5`JŠ¬ÏÆÞ:§N-sÿý÷~ÏÃ_ÿëƒcËǘk´¦Æ^‹úÀ~‡ã«1;e€°2Ÿð¶·=@¯›ò‰O 4Z ¤P>e I¢õ¨F½ÖðqƒI“z\ãÒÖMÚ­y‚ $MPXT%w¯Õæ‚À^#ØÚßÃYÇÓŸü8gN!îý7ŒVy¿·Ožõ­þÆþ ––ç¸pîiÞÿ¿ÀÚËÕs¾OnÂÆ ÕÉð¥)ÙÚÛ!ˆˆJã €Z\'Nj$qB½YgqiÅ¥œpœ»ô,ƒƒ-êäÄyŸl{‹sÏ¿ÄÕ+7¹tåN—4Ë) 3J/pà=#B Њf³ÎÂ\“£G–9vl•»Îœâô©S¬Y!i4<T–XcQ: Nææ8vâ$GŽœ Ùš'Nj„aˆ” ¥‚0Fé¡Te6)ü9Vuí>®ÒÿU©“1­Ò¾våQ¤qïûd Å(¥EŒüÇç—³Eαå3ãˆÍ[H€—Aó/ƒô'‰€!0«YÍêO[ÍFf5«Yý™¯ÅÅc¸¼ ª¤èîB½Mzô?òüNŒ±ü⯒7=r–^/å§ÿé³±½F šõÍú­÷ù™g?ϩ՘ÿlùć~Ÿoùž÷òŽo|÷=Ê‘å9.^ÙàÅ ×ÙÜØca±E«‘xé?ž0ÆVriÇ|»Î\»†’‚›k{$”ŒÛÜËBD¦@µ@™¢]R ã³_`·¨LÀ]úe^8Åw~ûùÙñOh7çùÐg~ÿUß}ð÷ø‘ø=lÞhUc‹HéÇüÝ·Ð~7nmI÷`‹Í5~å§v*ïÊ•+h]ãÈâ õ(ò’pk_³u‘$ Ï<þqŽÞ÷Kƒ˜3ÞÇÆAÁcŸ§´rh<&§6ò«HЊ<^d!ݤñ†·³´ü~Ž;F½^gaa O´¤é-¾·ó ¸ ÛƒsŽ?øÈ0?7ÏéÓ§IÓÖz½.'Ožàøñc4MÒ4eÐïW&ò¶¦´cÍè6ÎØ‘~Y‡Š¢´8ëóë¥Y™CãeëÖ"E‰‘^¥EYVw'pòÒ†l—)%R*ß]ã-qäB¢„"‰bÀÏ”·Û-z½žOKþç…ðƇi6ð‘wZ{²ïa¡„Å F§‚pG 4KijqÍK܃ˆ8ôé¾ãì0ÎRæ}VOßKYz•Ƶ+_daõ! ë¥ï««wsóæ9Œ1,/áâKœ=q;;¬®,psm‡zcžîÁ6ÎY¾ð™ßàÛ¾ûoâ¤ã¿ú¡9y %äî„|þ]•0üu^ýÐ3% Bf‡a ¢DHXZ^bõÈq’péâEžö9n¬_åÈòQ‚ F:GXæl\»ÎÖNLg¥ÅñGª‘ = üвÄXGi 5†~íÇQ€”’ZE!­fƒF³ËÎÎ>ƒ~Z%Ryå@FžÐ)2AŸ0ŠRhÅ`0 ×ëR: f˜nQ98JY­Ã¡_ÅXàÜX9±¹~­ò„‡¸~1ÁBV1£ï•eÁÊâ1n;1"ÝÜ-ë—'á“_ªyà¬f5«YÍ€YÍjV³ú²knaú) ׃¬ ¯ð¦¯3åûßÅï|ø1ŠÂðmßôÿ¿Ÿÿ0à§É‹ŒF½…Àƒ­5ozàQ¾ðü§î÷Êú5Öv6xÃݯã¿ò+|äwÞÏwü—ßÇ[¿þ›¨ÕB–›¬­ïríú6ë»,,´hÖbìÐ}Ýùùï¹vƒV#AjÉÕ›hÁ°û Á¡(VL·QT²j©c\>#ë ¶QgÐíИð8(5`Ùº~ž¥åãœzÇ›xñóA¢A§ßyÕÇ·ÛíÒï\gÇ&$Ù"®º±‡H)æP«.ëwÙÙ¾Æë¹G}ttŸÖZ~æg~Ž#KÇh×j£nñœ½¥”âSôQþõOþ ®¯óÔ§¿Ès7RJã»à”Âÿ•|9åTôƒ„0ÝâÊsWyï÷ü Ÿþä‡988`}}v»M£Ñ¸ãæÒ'`ŠÓ³ŽÝ½]:Üs÷=ìîîbJÃåK— ÀMв¨îÇU±i•©ÚD •(üœ†³ã|ö*&sÜûh)¤DT€ßYC©$Ò JSúH@cpÎGVŠ Äf]!uEhO AV+Âw`…’ÞPi¬)A¢8¢Ñj0¤tØÙÛå ×%µ†~Ú% "o(XÓHá_“¶:G²š%¨E18‡’š@‡RÓn´ƒ„ (KJ[¢… nîlÐnÎQÃÁþgμ™Ó§4)aiéëë—(JC7/)ò’§þ蓼ý;¿‹ÝÝ.¾ã»ùÄÖcëxâó¿Ï_úÍÿ¯òÕ1=Œ'Åèüð&”¾/¼_õ;Çþþ6guè¯ Î«9t€0(%˜››c~i(ŠØÝÝáÆµ:¤–Ô°ÎQ‘Íìwy©·‡Tc ŽCêõRJ´†<+A”(¥½ß‚(­üx…ò+¤Ñ¨Q¯%$õ˜ ØÝíÐïgXc°Î!,¥#ÐA$ £‡# biœ#NúÝN¥J‘þÿ Wóþ 0Ó«R‚«ÔSî…)ÇzÖ‘/êØ‚ ÒIL€u%K‹Ç«Çò¦ Þ—Áᆊ„!™pˆxÝ÷«ö3`V³šÕŸ–šÌjV³ú3_ö eAGì.œæ¿û»?È›9Ëø•rdežw½ãAþ—¿ó÷ùدüsŠ2§QkŽºpÎùY从œ&ÐÁ-÷9½ð8—ׯSf%¿ö³?Ë?ùÿ=—Ÿ’»N­pïÙc<ôàIî:}„A?ãÆÍmÊ**Ð:G‡=2O‡˜ÒrsÍÏÜ[À:yHJ8àŽ;Mp–†v# ¶ÅôDεл¨% öOóî7­ð‰œZ\ãýŸüÝ/ù_:÷µÕ%¤”$¢=»ªÉz›gí»ÿ½ƒ-v6.óÏþÙ?™’øEÁ¿û©ŸãÈâ*±À(õÚrÖý~ŸcGr°»Î?ù—Î_$°ù°£„EÖïpGZ‘ÆKÌ¥ëDíû¹ys‹/Òï÷¹yó&çÎ{Åç2 ܈ q•ŒyhŽfJõk×èõz8n‡]ï-0õüìmîŒ3c‚*NÍw^½¹›Ô‚( G€Rz¹yP¥¸ª#íìÁ¬±¥4R€”wøG ¤BI’^Î-d5Á=ZÞ_Jj,aé ¥ÛéÓïö¨' =pq"­¤Ÿ¥ 4R*ŒˆÙpØ1cd‘éœO4СŸcjÔcÿÑHjÄ÷RBö;Ô“&¤A„lm^D©ÐwµEå¿Æ`-íöQ^ºþ8ÇöÍ5î¾ëBÞþõß;:®k×ÎW€ÞÝ–à‘P‹IFR§רG J¨Ê À³h;ÛëÈ0Ä¡½O„µA„’!{Û{lll‘¥9qÓl¶0¶ä™óO°·¿…ª!¦Ìeí÷¹|é7¯o°µµG·×÷JŽj , ¥1ô)Ý^JaŒõ®ÿJIÑnÖ™ŸkÐlÖÑZûwÔ9léȲ’Á §,Aé˜ù…eNœ:Å‘#Ç™›_`~a‘å•#ÌÍ/ ƒ`,õ¯úû#2K(d5" äðé¯z}pƒkÇmƆçÒÄú°Ö¡•FKL… z,9úÿ‚î6À~òã•H€YÍjV³š³šÕ¬fõU¬$išn)àäþþþ^¼p“§ž»Â»Þñ:>þGOócë‡yéÚyÚ9¢0¡4%Ö&ýëûio{û·Ý¼]ºy™?|êÓ4ë-ÒNŸÿ¿ýKþ_ÿèïs°u™î>Æ=wáž³G™›k°¾¾ÍÆÆ­fÂÉc èJ~ÛïT<į‚˜ü…ØÊØ‹f“Ô@á$ri‘¹=GgÚ'ùëéÝüÄ¿ø7´›ó<öü¿¬.Õg?ó —ÚD­U\Ú™zfR22f›¬,í³»sƒwýoššý·ÖòÒK/Ñh´iÕë^¦œ§¯) ”âôéÓ¬¬¬ðéO}œ2 :&4}ß·ÎGg+ƒ½-Ï2ü$ Œ±l¾´Æw|÷¾J ÿ²”ÀHžî¬uŽ^¯çý† †êv@‡ˆ„ÑÍe5UGµz¢’˜ƒcuež{î>F ]”¡”Ïn§Š·t–QP€¦µ©Râ&@šchtÈœRø²4•7†R[Ýi?åî³w½þ?7Å¡á|$àäöÆU¯´%YÚE …±†Â”¶R-HEÆ„:ò¿ã7¶×hÔDAĵÏQkH!PŰ¼|Ÿ;yF©cÒ<åÜ?Ï‘•9Ú­Qcûxëä»ÂT¼ÜèíõäJ3®S’0"#â(¢'AõXpÎø÷Vj?7/5Jj„Ð8çØïv¹pîç^<ǵ«×ÈÓœ0ŠÉóŒs—žçÂ¥çXÛ¸J–ö8dø72ÏéïvØÚÚco¯K:ÈÊwüƒ²´>6°; Í òÜø/åãˆZy ÔŒÌúŒ<7ä¥ÃUG0©ÕhÔ›Ôk —8rä(íöJé 0"Ÿ*õ‰ÁQ£ûmÛ›7AÊ*@AŒMF'ÞÑ׎ £I¯¢(Ë‚$n #¯ÿ˜ÃLJ€¾œò/K¼a0«YÍjV3`V³šÕ¬¾ Õš[%޾ñ½ïä¿û¯¿ƒÏ}ñQð×~àùÝŸþEžùàϱ¹³N=©ûŒº>Ö¹ês¬[óÜæ;>V–g|àÓâ™K/°8·Lgk—ýOþ1ÿæþŸ(úÛÜuz•³gp÷='ÅÞ^‡¹VZ!Ýî C^´Ù |ãFÄâ6Æ€‡¾^~M™áÒ¡|×® "ÜÒ2rg›Ýí4–ÏpïÛá‰O|ˆÎÎ…)¸²~õË:Î7o\Çæ»ì“e´°SÏÊØ¡Werf ½î;;×ø±û¿Nuÿ¥”üú¯¿•ùj:¨œæM%‘~m*‚ ÏsnÞ¸F$ØQml> V•Ÿ‚ŸÑ8àïÄ(HÉ õÞuZK³²räK~N·¯ú8¾™›º­uýf1Uüüµ’Œ­m€ƒÝ._øü‹ÌÏ7xýëΆ á]ó= 2´ÎÁ0Õ½´–²HA*ì«yn‡Â"‡=Ý©'/F†w^¯eY’e‹Kó¸Ê˜pwk óstºûþ^¤yjŒÕøìÞ·®s°^ò_¤yF–gdE޵†@kêILzwû,íS:G%DZ“öw‰‚!<‘%… "¬uĺÎÓ/=ƒuާ>ý^ÿàI´R»ûQ¢Zc<×ÃV¯'Žb¤#—ÿΠG/0È3Ò,%ÍRúƒ¾7Vtã~µ¨Ò!¤UšÆ:Kšgt»]Ö76xî©gyéüKtÀA£ÙB!Ý}YŸ,O±&§èw±®2¸´†b¿ËöÖ{]²´ÀX‹u–²J*1ÆÑïg Òœ²(1Ö’ç%yQ‡šåÅ6ós O€Ä!A¡tà½ô»;;ìîvF~µZÂÒÒ«GŽr殳´ÛsÞ0Røqˆ1 ãÿ•BHåÉ!‘B±³u§¤¨n"E`B2Õ oã*/RCQ´š ‰ŒIyôßr­…—Sc½’r`V³šÕ¬fÀ¬f5«Y½ÆÕüèßüs|ë»ÞÈ“Ï]ay±Å÷|Û[øGóïò±O}€4K‰£d”cn*÷m!¼kù$ÀÞÙßæ¡³¯{ÅÇÜØÝä÷>óaÒ"çÄ‘SìÞÜà'ÿéó¾Ÿý ™sßÙ£Ü{Ï –Û8×nî°µÓåÂ¥›^ÊjÇg‡ïe ö–éw¤ˆŸM-sÈsœ±(­8qßI²õ-Òõ™k/œ9ËÏ6øÈ>DÆüÞ§?ôëk—Ÿ!^œ#NhìÜSUXU ,ËûìîÝä]ßðfî½÷Þ©û)Š‚_ÿµß`y~™(±ÖP9Z¿v €4Myî¹çÈ2:Ÿ|ìÃ,ž>ŠÔ5›ŽÛæÖV³òŽ©y€ñaö~Ò,Ji¶/ÞàÏÿóš®ãÃä€ãå=†ò¸qT€©ò…q£¸9?íào?¤<ÿìeZ<|JI„³(¡QJŽWTê¬ÃYKV ²´šùXlÕˆÏãf6<á&)Êëƒ¡ÌЈâé8ª—lŸ{î1>òØÇ8ºr’£+'¸~þ?ùOŒ½ÿ—X™ xàÞã41×nlñ‡Ÿ}?úÌs,è‚HyC³ÒNÏ5“ämM«²¤¹À7´wŸ=ÆÍ›Û¸çi5çIßÏÛßt†Ÿÿ·ÿêIƒ~áãc¾¢cýÜSŸ§Ù¬ãÂ&ƒ6Ë)?²[uÿwÙݽÎýØÿ8åü°¶¶†s‚f£•ªLæÜkðÔSO¡”â©'ãìÉ;zŽbp01j1¡x%õ¾Ttâšé:68ƾþUù—ýÙ!k€I÷ø 0œ1>hDX3ZÏÓÝø1ç±µµÇ?O³UçÜËüB ¤@ë`"ePŒÀ”~Éeý¢8@* fœ½n‡ƒ×Sf S’‹±0È2в¤V«Ñét ãˆÂø±€ÍÍm^xñ—¯^ç8qâ§î:†Ò·_bH@F'ŒïHË'Aá,ƒ<£Ÿ¦dyNiJò<'/ Oh…ïôcH³• @(Åüü1p-C.¯_#Ë2>ñþßáèJ›f³†T÷?øö[üD²"ÃZ3õ>Z¥5Æw× þ\tv<æA%_RUoŸ¤,YZzbGÈjìB¡”¦–Ô Â¥5õF­Œ³eN -¡+0eJQfHgYšoÐN4ù~Ÿî^‡4ͽ _{ý†3>- Ë úƒaDãpéKõ„v«F£‘$±_Ö@Y‚ƒ(Š©ÕDqN’f–þ @!FƒV»EFH¥*óAåÍ$…ûRú(G(=Œ‘Tôz{5=‚»]6“q¸*JÒQ˜‚ŹÕPWJMIÿ½ñ +ª”9q‘r‚øÒ;þ3`V³šÕŒ˜Õ¬f5«×¸}ôV›„a@¼y…(ŒYš[F)5Úˆ‹Ê)ÚK eêv"ŽËo÷;{¼åuo}ÕÝéwùü%v:û,/¬°²p„sO<οûÿ?xòa0(ÐJPô  {›ˆÞ ×Et7)ºÛ¸¬CH9±Él{޳ߙ˜“B–]”V\¼t“ús4[ ôÝÏÙ»òÉßýOäýœ®žcç`÷+>Î/¾ða`Ùu!ež¡ÅÛYž²»“oû¶wqß}÷Ýr?ŸøÃO²²r”Hkl[g­AKõš¯+W®†€\záÓœ}ý=(%™×e5_㉸¼; NP„h­)®]ãëßóC_ÖszÙn¿ßFL‚‰u:Î’Û¡9ëOQ–X;~mÎ9¯0òŠH8ØëòéÏ<ÃÖö>­¹ s ’(ö’q¼!ž¬æ „óãƒn‡$ 2šÚ]Œ¹†iÝ‚\%:Tœ:sœÖ\¥7®]ge”e1–¢Jȳ½Î€ëW×pÖ±´<ÏÂB­Õí±—8k*þFÐK{dyŽ“ ­k8Y‘ÑO ÒkA MÖØÙÝ%!ZEœ¿ô$ ‘Î!±ÂÒl´Q:ãXX:Å¥›—pÎñäýwö€òäÝEµñ¦KzuDnŠ €ék¨Ø˜Ñ2p®Še”£T)< Õ*@‰ˆ0¬1J…©q@šfXãÕLÎ ‚ d®¹D%„a ëðKéÖ”´“…F@™¦ôúJc±Æ*k)¡( y^P”‡£, ÖXÂ@ÓlÖh6b´VþZ*B)TxÙ¾”˜J EaÈò’AZÐí¥ Í&ZžÈJ"¥Fk´ßÑÚ›÷é[¥_¸©œÎI<^}2L¨”)Ãñ—¼ÌX^:Š”’ +…B+UùÈá"£ÎÿÄÝúÛŒÈù2DÀ ìÏjV³š³šÕ¬fõU¯+—/q÷ÙÓìl^áøþ^ÿ†w±0·D„^Š[up¤³žÃ »šaÖÞxï‚èKtŸ|â“|ü‹Ÿd¾½ÀB{‰¹F›çû?õ?ÿ#žøÔ™o'td[_F×Û`-B¬-ÙÝÝ`óÚ‹ìÝ8Ç`ï&Ew².ãL·ê9WsÝ( RQf)ÍõóÏçùÓ<ò†³˜¹ðì \ßZãùK/¼&ÇÙZËåó£çZh“N„w–ଡ×Ûaw÷&÷ïýÈ-Ý/c ?û³?ϱc§ƒc<ø·•1Ük]+++!8}ú4ŸüäræD‹~¸DÙ۷ħ í¤÷ÞôŸSÒØÕ‹Øýì÷"¾þ¿íUü—_@·þŽàP¤˜ð±q#`"G~òw¬1h¥ P`Sxiòû½”õz.YV²ztÕüY;¬r‚œ`ÐíDB ¿voaªO]eX©*Ž@EI½îI†^oÀ  ¥)‘R!yY‚°NrùâUn^_§(Jæ[4Zu¤ç³±† ˆQ* (Kÿa©)½é 1äeBÒ¬·hÖ›„:¤,súiŸHGYÏÇò ZÀ‰ã÷xu„Õìõ{eÉËW¨–V»†sŽ·¿û‡<`t^ý‚s>%AT‡Œ‡äŽ”¢JðÀS«gÊê˜{@JM’4hÔÚ„aâ;ØÒƒíýƒ»{{t{]:ûò¼@+M­Þ"Šj¨0ñiRÐOSöH{}%ʺ}®^Ý`skŸÁ 'Ͻ?C–WcyIž”¥%Í Lé¯=Z+´–Ôj1q-‚*À!H;Û»t{)¥q”•¢ (,­v›¥¥UšÍ6:ð#R{%€(ôà_𠣆>¢ÐÓÀ-¸ÛMX0ú¨¿!à°´ë‹^]P=†Ò©:ð)Bú÷Cˆ[GÄ„ÃÅð\ûJ¦LÏ!La³šÕ¬fõÇU øñÙa˜Õ¬fõg½ò<ãßÿôOsãÆ ~ôþ÷¬—-7¯’¦ý*ZNmÆü¬©ßd#˜"Ò´Ï7ÃwóÙ'>ù%=‡^ÚãÙ‹ÏñÈ}VÝ%¿ ½qé<ŸúØï’ÔcLSÆs¤V1p!V'¨¸IÔ\¤Õl*X²l@¯{@·³M‘vqE†+ „+ÖV;[ËÁÁÅctU“7¼ýa³ÉþÕ_AÅgŸûükzœ3œ¹ï­yN98@† nÔoƒ,ï³¶q‰û<ÎÿðÿiD¾ kooŸøÉÇÿsР(s¤Tœ¿zžýÎÞkú|»Ý._øÂ¸rå ¬.·È“èƒMqÌ€ 9vÿžj6ŽÄnäÜØÔŠ¸³ÉчßÎãŸû¬µ_Ò¦ÿ–¹b16&w0™þ|ò>' ¦oïxÝÃ_OVTÏׂ*£~èÊ?9"P”%d)}¥è¬]ÁJ X¼œÝ:‹³D à8v×½ô D‘ñ„[{•³.ÆkAá]ùËœcgoåýn­t•`1Ö`œE 1–S'ßÈ`°GQ„A„)y^ÔbêõdÔ‘F@YH ­eÖ·®rÐÙBIndYJšõ±¦Ä9‹Vš0 ªqO<ôÓ« +”ÖÒíîÑh.bméçÁ«•]«·98Ø"Jšln^eea…Ë/žãÑ·¿•ë{`‹GïâÆåg=1&õ¤FFJb­ï°OΗ+©üóÑA¢+bãä]¢Ë)Üô±›–V2y!ü{—¦}м¨ýsY†)QŒpŽÜZt’ ŒstƘ"'ˬïö‹) yYVÓ0¢;©RÊk¬_+•rAVÏËí8¤Q\ša‹+AŽF{”RDQ„’’4M1eY¥pTŠ%}¤¤R^þ¯¼1¥Ö¥4íùU¢Äø©€ºS$Úpý ¯éCbl¡½ÄãÏ’@k‚0¨¸<N^£Fã/SÌ–ÏÓ^ÏÅè¼礛æÂÄÓf5«YÍjFÌjV³šÕkXO=õï{߯ó]ßùí$Ç"_¿É Tøm<7<4œr¸*Ã\Žb©p>ÐêÆî½þÁ—O_x+ßûÎ9vö¶I}Ö¯çæÅǹöâÑ=¸B^”\ 2¤ &“5›ÔmjÍêq‚’Š¢ÈÉò½~noŸ^w²Èˆã:IRg‡«÷ÝÅ‘fÎoþ‡Ÿ¡Ý˜ãûö6ñv_Iíîlðæ¯ûVvwS?~Ö|$\Õ‰Ý;ØâúÍsüÄOþKŽ;æ%Ñ•ÒàÃþž|æEzàaÖ×qÖRš!%Ï]|–N¯óU]çϽÈ7½ç{(2Ü`T$±b€‚1 p‡“­c`$AÑaç@°rr™Kž} '`É‹ÛÿÎ$ˆ"I`êóª»üÈ[ÞMšU2cЕ#º##oÂVýjàRаÎÞæet°´¼HQ ²lôÔjq‚³†“w?À^¯Àô;$aRuA+ߊÑS£ˆÃÒ””eA 5[[7+Ы*¸ÉÌv£,«Ç^Ç`p@iRB¢•Æ:G:ÈpÖ±¸<‚,+pÎP9ós+lnß`gïV„Z£pX[¢„" C ÄUkQKŸ/„çÛïî³4cŠá#%5ý¬G™t³€zRg~¾‰U ½^Šêy¶7/#p$aLH©¼ÁŸ5$ALÆDA@E$qìcƒˆ0ŒRpôÄëЦDÊ1ÈøYô@h ¤˜ZçÐR#…ô§H¶v®ƒ-(³”P:B!UH ”OaHSÊ<'T+ÖAn¼ú!ŠB¤àza¼”¿,-eéG’( ÐCòÔKâ-W–•ÂwáÃ0 ŽB‚ 2 ¬Hž,Ë0ÆV³ú~._*ïm µ&ÐQ¡?.PkÌQ‹š(铦O$n> Mý„qÂs>O†ÄQ<’ø¿ŒR¦9ð‡„Ðø»i ÛóüKûâKø˜Õ¬f5«0«YÍjV£êtöù½ß}Ç­òȻߋÜ?`w{jƒ7™å,¤D Ÿð³¸yžñ­ïüN>ùÅYÏakw“Çž{Œ4ϘoÍÓ¬7uH ýX¦$ïîÓÙºÎæõçY»ôE®_ùÖìPŠ>©†Hë ÍULØÆ…s$­EæÚ Ô“:q\ÇÖ—0:æmßþN޵-¿þ3?E«Þæ÷?ÿQßy}Ë9Ç‘£'âeêe‰ÅI–fÖ7/³z¬Å?øï¶yÙÿèÿþã,,à®»îfýÂKÞ¡½,QRñôKÏÐô¾ªk#ÏsÞðú{ØvËÝ-tT§ÙVÀ5Ü’ÇgÁŒç¢0"lŸx˜ÏÒ» yñêb¦»ý·€þ©ÿ8=Ä!òú7ü¤yehJ”s81LÎõ»Ù¹[k°~å:)ÙÝÞóäQ5‘D ¥)9vú,½ÌQtˆÂ9aX'ƨ¨z0Aa2Œs„R°ßÙ" CÔÐìѹÑx'äüÃòñèõ;”Ù€0ˆu0zí¦0ôzê:Ð ƒ. ­eö;Û¬m^&‰<°ÖUî|DQìMÝ„&Ò¡ödD^,Ï/Q”½AF­å_{õš„€FcžÝ½-¢ æÂµX_fgmƒ{¸›Íý”²´ÄI‹Fc‘͵—(mY÷X²²À:K„Ì8LˆÃÈw¤+5„±–å!«‘FQxxÊjÞ^à K­C ð·Je (²>¥)±ÖøUmKêQPE= ò"£( ”’X|äžvô+e”À''c}<`?ó~Þ¢"q¬õRÿ²(*u€D8¯@*tà½|Ò)¯ ã•Ãu ª1]Ex†‘OÝpÎÇuêµ…J•á*p>aäW©nÇ©Yç‚€ —Ÿô¯­R-øk}%÷¯â`+ŽmÚ¿>ý¹#'CŒ¢e_é\¿…©@Œ~ÿËõ3"`V³šÕŒ˜Õ¬f5«©²ÖòÄ?Ã¥—^àõßø^Ž&M6¶nTóÞb$QÎrJ!ª.ép@ÐïwµÖ×/ÙÏc÷`—+ëW¹²q½îB*V—ްº°Ê\sz­N»Ñ&‰kDAˆÉrzûÛì®]b÷Æ‹l]~’Þæ ´k‹‹š#g–9rÏ)ξåÍÌß} 'Žrü¾Ó4íïû¹ÿ@ÕøÈ>>R=|5* gz"Í1Yĺ[\½qŽóÿœÓ§OsÍ+À×étø¿üƒçëÞùnŽ=Á•gŸ¹§+¥xâÅÇÉò쫾6®\¾À;ßõ]Øn†.û ˆ¦åÄÃvôm»zŒÜ³RP'%*ræï~ˆžùô+ý—ûþ„”€Üª˜ &:îBŽþÆ7½‹4¯|-J3R¾ø»ž08«Ô.‘›$ì¯]b¯{@½^£, yžW®ò%aâLÉâ±#b{»Z¡U0&Ô†ÀHí(‹ÂÏøãØÞ[#PáØìq¢ÆÓÛÖYŽÞC:H)ò>¡u81á_W–,-·98è1th4çèö:¬m^¢Yód›TÊû;"Ðrl8ç?»¼Ëê¸Ôâ˜í½ –c&È3 (eYæ:Œ¸|ý<'VO°~å §î»Ÿ½ƒÎ:âz›(®³µ~‰¼,È‹œ¢Ì1Æ{@kEFHD5Š`HóœÜÂʱÖ¢„¬À¦…ò¤:Ö²"0+bS*²¢[©D5¦ápÎD ‰qU¢ G^ ZWà_xSFë{YÒ4#/б]†-„Oiì;üš²ÕõÀUÀÙãkž'qBE•!!ˆÂ!JùçGQ%Í÷×r©4í¹cžÐšL©«pŸ ‡×xëJ´ 9åI?ªS©“·s±R½ãb¬À`8:ÛÆëvrd`bÄcH0Ü ðÇ÷5É]þÞŒ˜Õ¬fõ•”ž‚YÍjV_Ëõâs_à'þùßç=ßõ_s×#ßÎ…/þîhsæÿ—Š€*†¯¬y‘ò®‡á…?Oš~eik-ÝA—î Ëåµ+•÷¦%Ì·æ9ºt”ã«§t@^däEî;uE¶o¬sóòUŸÉ€›í9æ–VèìS 4jM>ú…OÐû*wÑŸö þæáãë;̱ å€ÜHv÷68}ö_÷uoݶ,ËQ à?ARkSo´ZcL9õgê«¡X¸]mnnRô.²·™ìÆ–á#Íž:w„eì¥[u*u”`O,Rë\G·NóÆ·|þ¯nÛ~ËNßU²é ÷ÿC"/—–S?Þ›ˆ·”J!„­ž¿—±K!0Õ(•«9C*ÌZTeH×KûÜ\_ãî³gyá…sàÖò,EâèwöÑõ¶w¢·vêI:äèK1̳g VJ²¢ 2¤%Õ„‚Áw¹‘‚@i\1@ s‚ÒäL xŒÞ¬5lˆ , ”Ò”UÌ^i Jȑӻó(¡ª´˜êâôö8uä4Ízƒíí5ÚÍ–'„ÄIÆ—çWØïìQ ›ì¹5.ݼÌÙ£g‹=’0¤gRœ³¬½g ^|æ“£YzïuP`lYEong,¥µ֡ˆ Gã®Z†Tb g„pHQVŽôb$]wÕ×yiˆ‚­$ŽJRCoâdÕ1B¡t k-E1@;ƒ²ŽRIr9~Oí ðÀ½,K:Ÿ² U‹BJ4’@kêµxdj(„ Y(-ƒ~†³–F³† t@’Ôh·ôSúý.8Sc¶êÒ«‘* K{ ¢œ8_LYbLâWd.'(Ë­BÒ²w«_‡B)çÕ(Â1LL†˜bè(üˆ•W‚ÿÒŽ¾v™àª7ïðÑ(’ö¶`~’¸½‘èíýEÅËþάf5«0«YÍjV_SÕëîó›ÿé_ñÆ7¿‡·½ù»¸ñÌfƒ 34¿©&Zg½?€slí¬óW¿ÿGù©Ÿÿ_^ÓÍ•l+Ø/ ö{\ºéUZ)¢0f±µÀÊ Ks‹¬Ì¯Ç5Š2§( úƒî8Ü(j­²¤à7?úëì¾q¯TÆn^~œ¥S'±—:˜þ>i–³µ{“û¿þ‹àOÓ”0 G¿÷s?ós´›KÔëmb4û/+âåvFz_­zÿoü"þ/ýYºOƒœû6ï0PI¿¡ÇŽæþÁƒ~&²ÛD­U8¸Ìëßô^._xšÝÝ/÷=˜ÓÃèÊ `/Œé9{Á” U÷X ;} áóç…’þe(åÍÖ,/ÍS«ÕÉŠŒÜ# °%‘’äYŸf[#UPùKˆ;¼‰ÀLœcŠ~ÚÇX‹1†$Š*—{9¾WudMN µ‡[ÃØC'uGÅÔ1s¶$Ij ²”ƒ^‡¸,©EIe°7ÿ¢zfr̹8‡uc-W6nPOêlí­³2·L?ïtcqJ¡´b®Ùfw›¥…¼tý<ËsËœ{ò)Ž<ôfy†É,B)Žžx­#ž{ò£ØÊSÀ9‹1ÐôÉ£ÑhÖBB$!’(ª'ÎZ/é7¾s/œ£tUMD€þØJ¼q©•+@“hM%•*@Rš[Z:ýÚ8‚(`°ùÀÏú‡ [‹µ Q`­@*Q©$,Z+²<'Ï Ò,GjD˜†¡½?²"©rQ`Kƒ3†^/%/J¢P“$ h6›dÙJdéðÆ€ÎùhÐÉ÷º4E“X©]†"–Éñw(NÓ)Æè B©œà ¼¬÷Òm£ªÿ ÆX¬-±–ÊLÖ“v6ˆpcãK†?¢RL¸[:û¢RœÝ™ dâZ0 ì…x%"`FÌjV3`V³šÕ¬fÀã}˜ëW^à[¾é/qoXòÌ‹_›?U›'%ÎZ\Õ +Šœ Ûçmoþ>û؇¿êϱ4†rУ7èqeýêh³(e%]V k½©Ø°3õZý½šúµ_ýeþÎÿøoøƒóWÐý.ý‚Hð¶·½mæ÷÷÷Y]]ÅZË`0à·ãýÜýÀ»©Õšž)rN$š?¶çíÚU¤¹ÁŽn²Ð¿‰V!¥ª†L‡ó€\˜[õN©iJM°½Íü•¿Í¿ý×ÿø²çpÇÿvß;ÄL‘‡Ó<è·(€‡_J-'dÙé… äPEbü ’$Ä:ÃÎÎ6íV‹—^º®¬,JÊ2'V!ýÎ˧#TaŠÞõLƒòQ×Ûm¥Z+ S`2KYe$J*p)F¹4%y‘M¯0k÷ ñ “ÒO¦ bò2g¿×!+r²2¯<BÚ²YMx¬³h9œ»w¦`0°×Ûà¡{&c¶:›4£:¥1^‚o@ËÒü2ûûÛÄ*¢–Ìñé§?Í·¼õ›l]£Õ<ÂNž#µ$ËGïeåèYûÔo°·³æÇ]Z±´4ÇÊÒAP–†Íí¾éÛ€AZ‚V>‚/ËÁVD@i1Â!ïj;¡(ÿX¬ˆ08JSTñ§~@A`#R—Q9ÐG+oÆ'”FNJŒs˜¬2¦"•’±?Š¡¦, Qb­%ÏJ*' ¤²è*R/qãë8rÀæéÅ 'Ë2JcH’ˆ8©1¿°B°À–…û³%R*¬1XçGˆŒñ1¡VJ¯l±Î_£GçŤo‡›ðÊ 2{…(ˆé±?¢Ì¬µ™à _Uùh¥0•âÁŸ£Æ#V¦…ÎY¬å|J†p'$ÒyµËa ÏT¤ç­@þ•Ê_~¦ °±©gu5p3`V³šÕ¸äìÌjV³šÕ¸67¯òkïûW<}í*ozó·á-øk˜K=Üïîoóöû__E¡ýñ—7Ï2dEN?æ)EYxàOüœ?žD,Íc0lm_ãÿöþ>µZ ðf{ÃÏ¥”<ÿü ÔãqX§ÛϰàwUçþx7­øÍ_`õä2„uZ2wö­©óÍØ1!`ï Ëm¬p°y™­ý:ßúmßù•¼Û£·ûÉp÷?’Ïs«œ8ÐÕSwãÀÈô4TŠ‹ÜI’H#€Î|{½ý ’°Æ0në;ÙZJjq,ÏàÅ+çØ[[c.–Ôê1ÂAP)Po÷ñÆ·};JçMû©!/½ÿ…³–v«‰”’¥…«« Ì/4ÐBê¡h‰¬°XðÝg%pBc¥Â:‹R„@AW_Kâ0" Â*‘Ãg}l™#DIâÕ¶¤4E‘aŠŒ|Ð'í÷)Š[Í(­ˆ¢$‰qΑe½~Fš>‘ÁÚj~?¤V‹ ‚€ Ôˆ @(í§çKK¿7 䔥%"êµ&F‹(®¡‚d€u©„Ç:Z{ÃV¥Õ(Ib¼0䘚ø'µÄ Gùc¢ª±¡RI¢F×z]ņA@„£ä)½JfK¨ÕÐCÂ….~tAŒTb2.±òl8ì p;sÀÇÉÂi¿q™/À¬fõµ\3À¬f5«Yª¢ÈøÐGÿ—®¾À·¿ûû »ÉKW^¼ãí)év÷ù‹ßúüÎ'ÞOš è¥ý¯ùãøûümVO}Ï?W²³¿Å{¿ûÏü®^½ÊÝwß=ºí/ÿò¯°ÐZ$Œkk ´š’ü{¹÷/™qþü9Þ“]c‡„…|¥# •AÝáq„ÂŽ)"k†³"£wKA«Ö¤óÒç9þÆoåäsOsõêÕ)rãUg€WÌÉ.ÿáßwξl Q I)}÷ÚUrhá²êï2A!dÖÑlÄS(I^SHÃ9Gnr癨KbØ>9~Úbœ#?ŽGWh‘e\1Εd¹Å”…Ï~—ʯgI³ ¼ÊEV]VªˆC!„oôâ;²§N¥(ú º9­Ú<õ¨†Ö!qœŒÒ=ŠŠéö2ò²ð’ý À)R­:Ôè@ƒªÔ¢2\¬”HE)2$¥õž 0Æ’ç9Î ”„BUÊ¢(¤l™êf³ÍÜÂ"s K´çç ’„Äf9i·Ož¦cFׯ²0ã&HRG1H«Î¾V„¡&Ž#¢(ð$O ’gy^R”­â¨F½Þ¤=7ÏÒÒ2‹‹ËÄI©C”ÑA„†ZÓnÕýèÆG2þ\£]CL?ÃUuò½ÊK¾Uê‚«ÖðPõàc%ªêþUD¡Özl0Y)ƤÔH¡ªÇVH©oIm¦xÕ€§ÐH5º¿­›WÂ8Qàx…Q‚YJÀ¬f5#f5«YÍjVSuÐÙá?ýÆOò±/|‚^ÿ œÿñ?äÝïx"íW„Š—«A€«dô*Nˆš-¢¸ÁÞæç^¸Âöö>Zi¢(¨Œ÷"Р$A„ÞGAøH„–žÜQ (T¨: ¨@ú~¯ãçÞk5¬ãJ…„QTùJLiÈ=²l€±¥')Dõ^ÕbêÍ&2 1¦¤ßë‘2Š¢dæ 4J{·~k y^Ðï¥ Ò k½i`‡Ôk1q>nPx/“,+) ‡u‚Ò8Š JHjuš­6QT#bÂ(&Žõf¹ù&õF ¥<ˆ—J"•]oF„€ð„€çJy9¿RUIù•Öc@í¼'„ó^¹€@*ï½¢Õx@iŽŒHáIå ?*P=–VSÊ“a*…TÕøÀ¼~ ¹®*±cHŒã§#DÇòÿiÀ?9&0«YÍjFÌjV³šÕ¬F Èò©Ï}_ü­Ÿ¢ŒÛÜwöá[L×6w60¦$/|NýÒâ~øoÿgÎÜõ5}ì~çý¿É{¿ã]?qð³ÿO>ù$ívÛBkùÕ_}Æ"‘ÖÔ•¥( G—Z¨ò{Ó—n\ü{ üÿÈÊÝÇ!HXPÙ°8A¸;€ÿ1°–U–}Ç(VWN0¸ö»éQÞýîozE =¿Â_þk?Ì·~ç÷1¿xü¶\À!0I à¦îW)K¤ªºJU²äñӧꊋá\rQOâÑ ÷È\Ò°‹%/òаcRÂ0¬1SOpèœP™ŸìÈD>z®49ý´G¯ß%ÍeŽ­L-ñ3êA” κŠ0†Òéá+¥1¥Ï‡‹¢„,Oé¥^Qå)Æ•&§´%Æ u¾Ãš@iµ(¢™Ôxþ¥gI¢:W×ÎSk¨ª‹“BgŽß…Dõú<—×®psóçžxœ3w¤L^)!ÆZYuû¹vg±EæÍäªó§ß …#/Jrc™Ÿo²¸<ljS«;¾Äâb›¤ž&!:Ðíçìƒ(¢P‚ÔiÚsKDIƒz­E³1‡Š¢ÌY^^áÔÉ“h[ÒÞ½ƒ=Ê,Ãä¹>eµF‚µ½^—tЧßPJJïAà\¥°dÉóc½«~h¢(¤–ÄÄqHX©„–`,¦´ë¯ eéBÑnµˆÂ˜f³E{nž(©#EHG,,´  RWhtU8ßZû5/DÅT$€Da8ðRz_ŸŒA¶ŸöQE;÷Hÿ{BV ^xp/JjtT„A@ C¤ª:ï$BøßRWŸ«Ñ}Œ¿öëÇ:2ú»4©(8 ðLJAÿŒ˜Õ¬¾Vjæ0«YÍjV¯²®Ýx‰Ÿù¥ηÓðÐýoã`ëÛ»ëôÓýA·ê()´˜{äÍ|üSÏñ~ŒoúÆ·³vóÆ×ä1ÛÚÚ䇸oºo/¼ðgΜmL1üÖo~€fc‰8ˆ1HŠÒK°‡* )$;û;b¯áܹs|Þæ¢¬1×»A†än˜ænÝ7Žåª>†ÂÜ4Z Ýì’û¯{ç÷ñüóϱ¶¶vÇÇ绿¿õÃ?L£ñ³¿ô.^¼Âå—žàÒ¹Ï{÷øÊ·ÜU'\å<^Å9WI˜ýçR%ÆRú™n)¦ ‚9r¤ÀH+O‹Q·{‚PpCéûÈÈÜD ûJQæ;ô'p#;Ï“ø @¨:©µ¤á±³uU¬š!ËÅX–-”ëî&M ¡L÷}6û¡7af´š°sàg«~6 "vö·BÜeiÈ ǯ²¿ßEH…R>&0’Z(èÀÇDö{©ëtÖ;åOkÃÑ+œW ¨ÀÇŽJ´a½)"Ba±ØÒŒ^ùóëQÊ1²‘–B¢µÆXƒ¨Î%QÅÇúëÚø¤“Ö{žXg¥™"îÆóúvtî ¯Ÿnäð?tî°>Ô9˜pô˜¾$¹)o!&Sf ³šÕ×BͳšÕ¬fõ%T–§üÖþ9~룿IÞ<ΙÓ°¹³>Â}BÞùÎ÷²º<Ç•k[|þ‰Küü/üò×ìñzôÑGyðÁF`ÿýï?=ôЈ¸võ7nl’$MŸÃŸÅ΋r´ÉUJ±ßÝû}¿õë?ÇÒ©UdÒ¢a;Hßõ‡Ùâ‡6ÐB¸±yå¶.œ , ÒgžâÿÚß›ò8¬èvö©%1w:›9KEÜuÏ£¼ãÝ?ÄñÓ¯»uöÿv €ÊDÑYWIþ=øf§óžÖZ¿?Ö>çÞ[UI*ˆ x>—Ü3í³÷ÚûÜ:ïó>ïóXK)ªÒû4;-Úݽ¸K–eäyF>ˆ¸’ÎÛ NSâ4!Ë]!†%Æk |å:­s‹(¡;׏Ä„ž¶nJH<ÓSÛYh-°Ø\àÿ{×{9çôM$I×ÅŠ<\x¾”xJ uF¯ß¡Ó^Ät—X82Ëž=‡Y:t„dù¦×div‰n’‘ä/PD%ŸJ5¤V˜cÓ¦iNÛ8C¹V¡\.£Â"Ö‰¶#<‚R•jmœV«KT*Q¯ÕÁd¤ý.y’’'1i¿G¿Ó¦½¼Hg¹‰Î2Ê•*åJ¥7Øa1¤+Ÿ¡Ñ]ñÈsMœd¤iF^Öžç¢Ëåˆ Ï÷œ*BJÇR˜›kÒï§lØ0ÉÄDƒÉÉIÖ­[G£1Fj,Q)bjÊ=†¡Û®òPJ;ùRÊ¡2@HçÈNþïIohéºõE§>p?+nÿ Ï/^ãyÃBÝÍðR~åá)ßó ãEé¶åx~€Wøø~€W$ x¾_Œ¨"‘@ G¤òž·Vö_ëø+rès0ðX; |ÅšÛðP·Ga„6Œ#Œ0Âßî¾çÌ-àÊ_ýM.û…_gqn™pön»ë4Î9‡f»‡1–öAÊ\ùª_ç¯ß÷GÿéÖéï|ç°?|ø0GŽabbbøø¿ô%*•qÂ¨Š°®ÈtŽÕÚu~‹/Эnç?ô8î¿ÿ>.™ßE¢+Ô’eÕ Ë¹Z]ž±ªøwEôÊcÉôº­´›óÄ,ò’—þ*ÿï¯ÿì¤Û¹ãæki¶^ë¶ÇþÝ7QªL11½•KŸv9_üÜ"‹ G†J€ÕD ˜vç…@çΆϩŠ©+1éÒ±B¬vú0ðWÖ¬‰W¸ð+©Höí¾ÇýèEÈJ ÝÌh|érÔótZˆa‚ €RP*¸SìªXcb¨…v#6Aç)ÒsÑuÇ鱑,-µ¨TKžG©\a|ªÆÌÔ4ö~íÆ ìÀ´.!Ó9¹Ö®S.æMKE^Œ(! ƒß B¸¢N)â´O½\£Ÿ÷(EI꼄. !•Ïúu§qðÈ>ja•å Ì¹ƒAÈTÙЛ¬Óêf„^%AJßug…ïú·&'Izô’.Gç ”O)*3÷è¶—ˆJ5¶lÜÁ=ߺ‡ïxUª%Ÿr)@ ©V+Tªeúi†ò:©\. rM’fX­Òy™ ‚Íf‹uë¦9:{ˆ4M¨z ´Í‘:‡ ¤5Ä]ƒÉs*õ1ªõIš£µª=œO„,R J95F ¤#¤”X«]q^Ô¨¾'‘å,•¤¹Dç†<×a‡ÄÑ¡ÃócÙ´aŠ$s¤Ñäø8nN¯ŸâynÎ_ù.PçΓB¸ù})‹´ƒÄ÷œÚcð#RÙ¡gÀà"3ÆLF{á>:×ΘÒ„ÑXëJ§¨U1˜N-6øCaµ£Ê0%%yÌc¸ýŽoÃñ> …ׄ•n?mA8ZkÊ‘{®»¯Ö"„3ʃϳ³Í²n%€ËÕ½FJ€Føa…Þ2Z†Fa„G^·Í×nøwÝñUvìÜÂÓŸÿB&¶]HøT+Ív^/f÷žÃ<ñ‰Oä›ßø2öòšõ‰¢ˆw¿ûÝ„a8$žúÔ§röÙg#„ Ë2~ã½AFc=› ¼ÒºõìÜÔà¶o¢•©Tê|õ¶/ÿ‡!m.㌋ŸA˜eˆ¤Cª"ìIºe†fiƒzzPü¯R £e@I:‹Éç²~öîݳv[BÄ]Î<çvnßÎÂr—O^óÚÃXcŠrµÆÎ3/¥ÛY`y騰ƒ=Ø‘aŠÂJ.\ð$´,æçU@Þí¬,­…LA¹Ö9ªrÎÎ)¾þå/øÇ–Žfv¥h°–™ñIâ¤ÏáÃûyü\ÆÜRÝí °xÊ/Œÿ _%E6:Gç aX&O»ì9xïÊ1 â‡ÊŠBöl g_ø t“ôÛxBøã]ϳ4'ŽSšÍ&_A¨˜ÚD…\kzÝžËdÁYGfØávV©¡æqÎÈÍ á” Æ`LN­\'/¼†±sÆR #–Z Xk©”ÇXX>J½Teîð1žõìgðÀ¾ƒ”Ê5”róÜžrõîGa¡FÈH³”^aÌGAî´;-Ò~›²§èw{ÌÍ696ßdn±I’dÄiÎÂb“47tZ‹…Á k I·×ÂÃÆ ‰ãOyø^ˆT¾ºí|#°äYBžeAR¬˜"‡öéÞñŸ7îQDÊ”ÁìºçcR¸¸FáþëHK?I‘R²iÃ$S“uf¦§PÒ#Ë!å†4IVF õ+¾ÝvEq‘«1Ö°Ôœª`„øž$Â0$ CÊ¥ˆ0Z ñƒ€(tñbk ày3uT~1æ00õ“\pÁÌÍ/ „*ÈA\tÑ…¼ð…/`ëÖÍ<îâ‹9ç쳸ëî{YPì·‹/t†¬šó_™ù_å¬!ÄJüáªBå <\ZèH 0Â?¬)Fa„þU°,.ãÿýåðÿþòÙ¸ùtþä½ Q/Ój÷˜St»ËÍ·ÞÇK_ùFÞñ–Wý§Y™«¯¾šjµ À‘#GøøÇ?Îÿïÿ}(ÿ_XX`×®9ãô'â¤ È Ï3‚ $ "VfÑÿ#q`ÿ^Lo‹ºÂ¸mSW†¦–ûÕùdÅÿjÏ:5(%1Ù¾;8ïÒŸåÞ]÷røÐÁ•««èââc×pÁ…ql¡‡²–öÒ1î¿çLÌofÇ™ó¸y!×Ã7þý óùÃÙë‚ÐFc¥C+%Á@0Øq—mîI…À™þ Áª¬÷•}¤(æNãqw‰RäÓÃ'·)þJýî ?ŠÜsYQ4ûaÙ© Ùípb#²0éëuÛø…éZn¡‚+“ÇC èt;´—úÜ|ËÍìܱ“¹¹9t¡4qµºÅêÜ%*ÝÕ \¡5TS¬¼Ë` ¢Óï ¥¤›ô E‚ÁšÁÚ:CÀ­¶²{ÿ<)™œÜÌRg™í§mcÏwîdë¦f:Ôjc¾Ñ9h‰ñ$ÂSxA€ ¢j•¥Åº&qÜ#Oò<#Mb¬ÉK𦔢‘a¥ ™tiõé#ˆÆÄqŸ0,¹$% £)-Iœ:ÕÂð¯š"ÕýÔ29½Ž,‘Hz½„ñ©išÍ6Kœ’" ]÷;ËñKeŒòÑÚ# ™¤µ-æÝ­ó¥@ ‘Åõ²RÀæÚ -Šf§ð<'¥7¾%Ë2Œ.FOŠ(Ê$ÍIÒŒÉñzD€°Üj“i1éy …Á("±Æ™ù kr¤”øE €1ƒÈQg0…>Q†NÊoqê…~œ¸­AN?ã îúÎ] Vºêƒ¹þð…dl¬Áã.¾ˆ¹…yþË‹/ç?ú <Ïã1ÏóŸ÷SÜñí;ɲœ¥å%öï?ÀùçË/¾äJðÙÏü ‹K ¬ŸžæŒÓwR­U¸í¶;¨VÊ…©û¹¸°À‘£G‡Ÿ‹t£)Ò™{HÕ£F+J€E#Œ0ˆa„FáaÈ€Ãîç—îÇù—/|ƒÇ^°ƒÃGÀhªýMj<å/ä«_üØŠÕxîsŸëŠ\­yÿûßÏää$ÓÓÓE±høæMߤ\# *…#}ÖPŽB¤Í;ùÒ]·~ßÓ _ø?þüÿ‰=šC‰ š$3k ÿA}¿Zò/NRüËBê­#_=ØîqÅ¿°+ïÓï-ø ¤T÷ä¡!0:%*U0ÚÐ{”Kezý)%žòÁ!]OØdNÊmŒÆ÷|°ø™û‰)¤îº($ÛÝ6JHÕI­VI”üˆ( ˆ³”Fe’ƒíYŒ5Üq˼âu¯äã×~«ˆ““ÑžsÚ·>yž£EEDå::ÍÈã.å9²¸O–öè÷:kYjJ¤p±†Q196E}l‘„ôº=„p£R) O…øžBHÓ ÝëQ©M`¦—ä(¾*ƒµ(Ï mF®3$.A‚4uD•Td½.H…U°–b^^b¬#|ä {í)t® ‡až}®uaéªÜëE Ÿˆ%ŽS²L³ÔìQŠBœÐ÷ˆJ!A?!"b?ÃÚU­-H‹Ö8é¿6%VàùRI¬U.jQÂЧ”J¾¯Ü¹1–8ÉЄðYŽÑÐkpúégðàþý(é £21(å1ÞcçÎí<°çAŽ9Âwî¼›Àø¥_ü96oÚÄm·ÝÁíwÜÉxcŒÝ{ö’eóóK,/7yò“ŸÈ³Ÿóã$IL·ÓEÁÒÒÛ·mgaq¾; —<þñÜøµY\\X‰Ý…`gåƒçFmÖ¸kH€Ñ(À#Œ€Fa„ÝN‹çþøSù›~–í[×sw/FôÛ4úKœ{áróŸsÞbüÞïýF€¥¥%Þýîwó†7¼aÙÝ?üýG¨×¦‚²ûBªs„5(_:y¶òJ5víºéûæ¸ÜOܺŸDLÐÊ"¥'Š”³5Eÿñ„ÀÉŠ€Aul†ÖâaêRñS?{%ÿû÷­ÐJE÷ù£ú3~ôÙ/eyylÚz‡öÝCsé÷í»›ñR)f6“es­EG VÆŠÌsOJ4 9°è6Ü/AAHgJ§”* £úÚ‚{­Ñ ‚æü1ÆN[‡ BòTb¬ëãjÌ ä@~m4HK–‹îÿ`þÕ: ס,aÒo#¢q”òÑyÿxUó €6 ¼ˆJ©B’¤ø¾OÞnƒ5è"’M¡†*†\gh£]¬—’é”rXÆ/|¤tÑnKœç,uš”Ju„äyŠÅC"‘ÒbÑl˜ZÏžCûÂ05¹]ûî㬭gòé|Š-çœÃÂr“ÚÌz_¡£I3íœð³L*…TÐS|¿ÄþïâØìAÒ$¡¯{ÎdNzHÏG[Kše…'‚Å·9¦ß'Q>Rz¡Oú”ËU|¥HsM³Õ¥•¦g`‹Â] O Êå:år41,//xATB&ORa•GÚk¡L™¬˜û—žGà‡Nv¯Íp–}SøJh­‡ Ï÷ð cD)g|Ï*ZÒ4e¹ÙEkM¥2FUÈrMœæä†ÂhÏCç):ÏB£sí ôìÊu+Åh„W7ßsÞžïäþÊ ¸óm…Åóaرó4—šìÝw€ Î?—Ééi6oÚ„ÎSöíÛÏÝ÷ì`ff¬SãLMMÑéöذ~ó5’¥f‡±±1²,ç´Ó6Òjµiµ»x¾Ï×n¼™R±ióF6¬_Ç-·~‹f³Å=ãi|ã¦obóÀ&ãœ}ÎÙ|ýÆʦ0Û°ÃÀ’•ÏØà~÷[‰Ðb­Êg„F#Œ0Â#<ZÍ®|ÉOògù1ff&˜Ý—Ð f"ió¬ŸzŸùØ{¾/díÿ¨×ë¼êU¯B)mõÑ~”ÇóœçaH–[Hĭň*µ5¤ÇÉŠ”Áï½îv|;Öºýrkê!××HAšö±R1ViÐϺÌḬ̀°¸€±“gh“£„‡ô¾ò±J!­!³)¹Îɳ”$Žc»*f»‹Yò,ÏHÒ%ëÇ7!¤›+t^…”ƒˆJÒMSÊ*`.sÝÖÇŽpæc.bgŽõ7ú¾ËƒÇP2–…K.¹˜ë®»žÍ§­gb¢A£QEJI¹Rgjr‚ 7pìØåJßóè÷cÒ4Áójµ:IšÒíöÈ󜥥&Íå&õz |醯R*—É’‘§ä¹å¦oÞÌ]ö §Æqƒÿ®¨wÓ)E$¨³b˜yb¥¿¢qB2É#Œ0"Fa„F8 šËó¼þµWò›¿óº½˜åcó4DŸó§gX¼ô'¹ñëÿôCyÜþð‡`~~ž_ýÕ_`óæÍÃçìÞ½›r¹Áx¤Šh0Wˆ°F) XZ8B©Tås7~äûîËg»Õäàî¯Q Ϥ.ÀËûhU9áë3œÜ`ku÷5lÔ VÓ¤Í}lÚùL¶íÛ̓îÄB>óÑ?å O}cãëøÊç?0|m¦3z&cÓÔiTÏ:ƒåÃw²abšsGÖÕB:½&“ÊCW$ ¥ ìC©"RO!ìŠ;¹­uAÒ¬=ÃÂÍ:’’CûwóœÉ ‚ð(‰ðÐyޝ‚U„ˆÅXQŒ ¸È=¥Âa'xe»ƒÇ‹übA»í%'·ÎTMƒ§šÖHUf¬ZãÀî}xž_œ®¨t éâXåÐtNI…¶’Üä$¹3Ÿó¤çœóíÀý]óÀ=”£*õÒ8yîº÷¹´xÂ¥,lY¿…{÷ßR1ÕXÏ}öpÖ¦|ãº/rÁSŸDsyÚ–­J ±N÷Û˜8gb| k,YÚ£†Tk%Ô¦LO®§ÓZæàÑýk¨×Æ(WÆÈ²„$KñJ¹µ(å…Æ&1yMšäÔë%¢0 ^+11^c>h¶:èn£S¬cs„T¤Ø½HATCMœvéÇ=GIA)1RAžS*•06G J’eya@)‡„‘]uŽPE??yž£”¤TŽH“ ­Ýù)—B*åIš‘e9n! 'w@aªç8S>¥ÐYŠTŠ,M±9CI)U\N­ây)B*Œqã :·Å¥^¯qÞ¹gqË­·ÓO’,×8xØ%Fß¼åVÆëU.8ÿ jÕ*år™uë¦i4A„*ÆKÒ,cÝÔ$ËÍ&Õj!óó‹ôº]ªKFŽ4(…ÔëUŒÖt»]fçæ™£Ó馃Ïiޱ–‰É)æAJ¤5nÔ§Pô»±—0øceW%¸Û'ŽÆFaDŒ0Â#Œð8|ð~ï·ÿ+¿úšÿ‹™ž`y~™±t§œ}Ë ‡¸û¾oýPï‹_übžýìg#¥+ï÷~€W¼âÁJxݾˆ_š@…5Uå+H}sÓ£€ÞB—4šà]·}_ç—¿ð)žû¢7àQ#í,Õ"Ò"æK‰æÑ=ÆÄœ¤2X$Z ̪¯$Ã÷XE6ØbŒÀý~ ¡TQ<Šb¿ý“ÿƒÿ3)=*¥2~à:ËëfÖqlö[) ÂJ7–€Æ—·y!ù/ŠÖUé R MAœÆFªÊL–ÆJqèÈ~öÞǺé ,·—éõ{ìÜ~¹uNø¡°(\ ž¶š´Õâh¿Ç¦S”Ë!ï15U§^+qäèý¥e7ù.2PHz½¸ðƒ0 <Êå1â¸K𯄥 ‚<Ži.-PmLe)Ê/‘ek ¾ï‘K‰ïyÅÈ…‹y”Bâû Ïw÷‡ï)gT(ÕrD/N1Æ•|ce:>R ’,GXçk…ÞPI’kK®]÷[ù!B*”§ÈÓœ4q)ÊóñG½^ÇZËwÞÉ•W^ Àýѱ}ûvWÄjͯýÚ¯1¾álo‚Z I5¤V! žôij9zïý|çèvÝuÓ÷åqæyNµê”¶êB§¿üÅ¿Ä ¦íOŠ]ÜÁÑÙƒk©Tj¤ýa?áÜ'?;¾õµUõòC³ B6n<§>õéÔ§6°oσx:#7š^A"!Øyæ…LLmq…˜•dvQ%[ðB÷Í@*Wä¦)^­Â›k|õ†(eÌ:éûoŸ!Í}žç<þGžLª=ç–È»dç±î¤ÉiÒÅ÷ÊQ™]|“4OW±kª’ás–ÙvúãÉ»mŒIU€òº§aŒ…~™/Ö#´ÎÈsíLÕŠÈ4Xeš(Ö°,®˜,:ýÚh´5h£1F;ýDÑÍîö{TËêåÆpÌG9$‡ê•ó­EÀ" ´ã6Scì{àAžö¬'Ón·™™Yç¢ã¬Á“a‘ëœvsŽæâQŽÎ ×]f¬2F½QGHA»Û§ø4ê ’Å庽IÚ#Kj¡‡Nº˜>õÙ¿¡ßûþ%GŽz³÷4ªÒ£Û^¢T*£QªðèöÚ:ºÏxef—æHÓa )3lÞ>Åîî=%`×=wpÉ¥?FµÞ 6µ…ýÜEÙóHò”8Mضãlf6î ‰3¤’v;E]TçJ¹†¡”$”5ÎÜZç«×ß@F˜;<4a[“ëIó k]¦û™çžËØä͵È;]|çš¶ÊŽÀm N{øÒ' B¹—v·ùˆk/”äŒsŸFÞmc³¾3*ôÖ*ĪÔ:'Ís¤’ug¹ñ¶o°¼Ü¤Ûí±hƒÄ¢Àk×zͺ¯*–œ-‚ň€"÷¾ÙZbãú-D*r&lEþºµOJ’´O’¥X«‹(Á.Ó㓜¶aÖƒ±±¾`…ëÎæÆu²  ¥Äèœ~·ƒ0M@÷)U#z‰Fzµj‰±)¦Çgð”"Nú,.%‹» :O0¢ñ°_XºÝ>Ý$Æ“%W Ãn/u>ÒéW¤ïc½€ÚäÓ¦èö“•ä@‰Aï¹ M e1ÕZcŠ=ËÉrí bYÅØÅ`Ý䀔©åRˆ‚À§R)¡”+Ô+Q¹%2hmÐÆt$IŽ5Æ%ç?ëçyõåÿ{ìPB³eçÅ\ñ ¯þw;¶sÎ9‡Ë/¿|(ýÿó?ÿsöîÝ ÀYgE½^>÷¶Ûœ¬ÿ£×¼ŸÿÔ¹œqáéèÚhK© Í’±¸pìûú|cØuççYÌ#?$ë, ‹þÁÏ© K.O¦&Ö¡”Çr¿ÏîÃ{˜½ÿ«Œm¸”;Ïr×ÐÃø! û‡ý³³K”kžø¬€-Ó©–ÊáÐCçÆ9—Y?l­;îâ$rK®s&Ǧœe[ÑÄ*åŠ=%JJŽ<Èd£L¥VF(Ej4šA÷U™.$×µmÔÆyÁ„ ×Y*æÿÝ€yˆµJyä:œ1e9,iè‘hkhWÖ³xÀZ³bÚYÌ ÏEñ»Öš,Kˆ“˜f·É÷ßJ¸tÕ±‰Ö¶¬ÛæŠ]áF1œY£à›_¾‰ Ï9“ƒ$]Ò€’‚ÀS„QDµ>ÆXmŒÉɦÖm@+IÛ(4q·ð¹ÄF‘È1>¹‰M›vbrÍrk‰4Oñ‚ƒ$É’4Æèœ²Ðt–9rt–N§‰' y–¢“‹+–`• Z/±nzŒÀÔêA%D¡sËQ¤OkI“˜¤Ó"i·±F¢³„j5"Š|›kâ8!Ï –Aqž“¦ù0ê/Ïsâ$EçÏSlÜ0ɦ“ÌLÕY?Ý`¼Qel¬J½V¦Z)QŠBB_á)UœåÆ71Úb, <¨D¹R¡6VgfÝ ÓÓÓLOO155E½>Æ™gìd|¼A«Õb~nžïÜ}wßs?I’"„¤Ñcû¶ÍlÛ² ë§ #·år™±±qÊ•,·hmña gÌ/tÙ{`޽ûg™›oÑlÇÌηh¶b<Ï'׆,·DA@¤YÎÂb“÷¥Õê!ë¶O³qÇ4¶O1sÚ$•Z™RµL†ì?ú IêF'(ÚcSÅgÏ…Q¬O‘2P(¬Í1;Þ4Â#üà`¤a„FøwF«9Ï·}™‰MÛ¨ofÜ—TJeöÚsÊÛ8cëYüÄSžËE;/ ú§ôúm⤱† /{S¸þ_þñßå˜>÷¹Ï±uëV¬µìÚµ‹¼àÃÇÞô¦7q饗»Hÿ÷ÿþ_n¿ýv´Ö|ö³Ÿæ­¿óë„•1ڹἳ6æ]Þü–ÿAw¿ïÏåܱCl;ÿÆÃ ½Öåró(¹u)%^‹$‰)•*œ¹ó‚ ¤ÝëÑëµXÜw7Û.øQ޼›,KVppÿn6l:“ññi!Bù,}z¹Êìòë7îdzÃéè\#½¤×-ŠZЏ ª˜oObÊcl]qã _Æó|’…Öâ°~à´é ¤i2$TàñøKŸÊâråå.&MÒsÒÿá =$i%QÒéÎqèØ¾G¢Ò°ÆpÎ…ÏÀôc¬IP|?½öFkJA™ *“£ÐZcšåv—RÙuÖ³<£›jÐJ‹†Qèãy‚uë&˜˜#îõéõcԀذÖÅ/êŒ ñ„‡°Ž€ò‚€ \G^ ϪÛoÃP1Ö»Áó¯Ïs1RJ|ßc¼Ñ@i­K–°ÎgÀ÷$ª0šX ‰P’j¹DµV"  $Íû”Ë%*••J™( YZn±ÿÀ!º½>­nŸ$ÕüÈ“žÈÞ}‡(—Ëœ¶qšÆXF½ÂX½êFQ¬ÄBü0$×®àƒßw&›Ij˜_ì°ÿÐG-Ñé&ôû)­NŸv»‡P«–Yjvè÷<_øŠv»ÃCÇ8rdŽ ð«Wð}…©Ü˜†•–°b…vª !éôÛÌÍãØÜQ|ßGy>ý¸[Œ¬\ÒÎï®*þ9¡ø_ùHŒØ€F#Œ0Â#œ2tžqÿ=7“ØŒ [/bCµL?îqlñØÃŠÏzÒs¸ìñ?Ɔ‰i:&ý¤ç µ<Ÿj¹Îúu›PÛ/æW~þÇøÒ×îä_þ·Oxó›ßÌ‹_üb”Rt»]^ð‚pøðááãï~÷»™šš Žc^ô¢ ë÷û|øÃâW^ò|žùŒ'óÄÇžÎßÿݹîKÿüƒs.Ó& e-lž"‚ò£Þ†1–åÖ"iš°af3åR•õ3›iuZôºMú GÙröc9°ïÞ“§Ç_+~ «´Z1ãëÖÓ[š%é·©•«ÈRƒéõ;çÄí6B_ú­qY}…C»L¢FƒMS’¯õk(åQ­Ô8xìК‚`û†-Î ¾(½Û­&ÏúÉç§–£óMò^·ÈY_[¦'q!”shO;Fk´Îñ¢ýæ>â,e¾9_úÅŒ8±È±«êœ“É£O`AŽÃ‘¹Cœ»ý\0 Mî cÆhÿåYW 8ph7s‹³k«6ؾõ,vœùxjÏ…Ê4g¹™Û¾³—¸Ÿ!¿ËÑ‚SÅyçÇk_ûZ”rÒêüãÜ|óÍÃÇ}ßgË–-ÃÛG=aN‡ç?ÿù¼ö×~™;︅¿xÿÕìØ±ƒk¯½vØM}ûÛßþ]ïãêí\{íµßÕ6Þ÷¾÷ ·a­åª«®>¶w÷=hµ€Û@¯×ƳÞÏazr=žç¡uNœô†÷oÛz¥r4Y<<ËãÿŒSÚÞm7}†,I°ÖÐj&l½è2ŠJT¢–]ád ý¤Æƒà ¦U8QÀÀ] A),­Y‹a‘]8®#@*E§ÛÁä)ãcUÊÕxÞŠŒþ8bKM®sª•Æ)¯Y’´Á“Ô‰5¸C©¾+Ñ‹\y飭¦R® øWÕñn°«_ºrŒeÃPðp?/¤1·Üw ¥ B"‹53Ù¢™›pj /c™_š§Ýíðñž|é%ÌÍÁZ§ 9»P*•(×ꔫ%¢J‰¨T¢\ªP©…>Vk|)P:ay阻ž¤e±¹ˆ¶å‡Xéºáž'‰‚ˆRx>¾ò•¢¤sŽY`±Ùayy™nki4ÖjL÷{Ľó K=:G³Ù"¨?<‚[Ä äÐwNX‹g,'îtÉú}žJ‰»-ŒÎÐ&Æ Ê#ˆ"úIŸnÒ'ˆcJqŒçGøžóOð ¹·¶`ý©%ž5“Ó:ºH.,R”'ñ…@KA·Ÿ°¹8¸ß'*—±V•|Œ±Äý)žE£Å˜ H¾è4&¬ÑxA@ŽtŹ'1‚Ð#M=HèibpñˆÆà{år€Ñ–8ÉÈtN·—Òlõ0¹†ÂhÏZ‹•N…•ÏGz pQƒ± ¯Ð¹Á÷}¬è’åý~Jœf$i†±†aè# “$!ðQP-•ÜH‚ïc‘䯩úqæäöÒy!mˆ“”8Éètâ$Å m%4I¢ÉÒ”ŽTÐi·‰ã™çå‘çžèáçi5&‹5µ…¸F¤™û}DŒ0ˆa„Fá»À½÷ÞÄüüA~ö9¿ÈË^ðrÚÃç<žÃ&äÚ/üá®o³÷þÛOi[Ÿûø{ùÉŸxõrýßd__ò’—ðK¿ôKø¾Öš}èC|ùË_>áyOx†‘^­V‹›nºé”¶ÿ†7¼ñññ¡ àïxÇ÷m÷¸æŸþÿå—ßB¤6Ñ^ÏxöqÃu_r³ê'I#Pª˜™Ì}°oï^.}ú39Y§T.ÑêÇܬ¼ÖhCš&DÑØÉ þ¢¸_$n»‘áá4â¤cËbÕä·Ö9H…”+†|ƒ´ƒa`‘ˆà ›? ÛðZ³¿ÕÒ8á1ka¹µÈîc»Ù4¾™4O\ç¶ØÎÖõ›¸ã¾oƒH¡HuÌmßùO~ÜðOÿϼú7_Á¿z ÖT‘J¡´ÀZIªá›ÈÂ#+ŸR”û ÍVøŒML07{?Æj’,¡›ôP~€ê¶âºâ mÄPÇ€´ Ýµ™k$ïá PJ0&})h-u°ãAÎÒRæ.!#ð*ânN`@1ÖºÈD!Öäˆ\¸¹w_SR“¦©0Ú(ž¯«FŒÕB¤”¤iFœ¤X Aà‘ç†,Ë\jAš¸í—(`íàÜö…¼])‰ç)––(—B”øžO³»@šº™úÁ%j•K.p’Äó*¸É*A§ŸÐS‚0@JI–f´;1ÆÂX½D) <…î\imð¼Ôí:¥ÛíÑíõɲ„4é“&)Zk„uËo¬!Ó™]ð¼áúiE¼¡@ ¤µ†8ÑÄi)¾§(•B’$ÇI©\!Š"¦&Ç™ãð‘ƒ$q:ÇS¾Û¶ÕhÁPÉ3HévE Vœ3Ä[Ç Ž0Â#`„Fa„SÁüü!Þ÷woçå?ÿz¦w<޹õkÜñíõvØE»5Gðo0«¹uëVþøÿ˜ 0Æðï|‡—¿üå'<ïñ<ãã+Rë»îºë”ßcÏž=<ëYÏú:wy–q×·>Ãéü Q{ž¼¿¥‰Gµ±úcõ“¿¦ÞXϦu[8tl?ªÝἋžÊ·^?,Šøê>À–¹.¯Ìœq Ú©¤iŒ×h7KÐíº/ôÆ‚t²ì^¯É±Ý<îÉçóÚ×¼šß¼ê7cüÉäö@àùxÊC W\•DÄ¡÷Q*LMToTi/7A[†Úg@ùE>º°®(<ÎY%AÏ®áºÍ¤t†eæxBâx øÝè é©b–ß9ÚHƒE·_bUWÓ#ÔV‰ÿÅê·k‰Šãvc€¯ßù5~þ¿€6N!¤ÄbÉsÃøØKÍEçÙ¡v“»wßÇùgžËûßó÷üì•ÏãæÛî£Ro •‡´n}$nTÁSB‹±”$ªÛ" Æêc,ÎA™ÎèõÛÅ©¶k)ÊÓ K^—¸—arƒ’´AJU˜ÿ¹BÓj Ö'•)~`±BçšÜ ¼ KËmJ%Ÿzµ ¾%ÏY¦é÷b¤Rh“cuN¯ßC'™S²¬Ž²´.=œ×…§|üP±(œÿ€KÞX’6ÒSn:‹5áyxA€ÕÝá¹Öv0Ò# ïÊ+¯Dó¥ƒÀvÜvëœ÷ا“V6âw•ròïá?µ·žO³Ó¤Ûï.I.¸èRî¼ãH|òÃoå'^øz‚ÀC J= R.11Q§ZÞÆÞ=‡‰çÜv4¤:favÍî,¯~ÕËøÊ—¿ÂM7~ɱ ? Z®}*ð=Ÿ(ˆð<ÏÍS[Ëâ±9Bß§Z)1Ѩq8ÐiŒÙø^€P:Ïée9¾ç“åÙ ôñh·QÊG(µ¶äX­f(ÖCXc ž¹Q„ã ™áˆAQ³¢*tƶ«^µºúŸF‡wÓ·ðø%Μ £3Èl˜ÚÀrkc žTäFsèð^&ãlî¼é.¶îÜÈÝ÷ìæ´m§mʺcpëmø3ÉKÓ˜ÆÄQqðÀ·ïÆf yǤ)mϧD„a‰¨T% "|ßà ‰±²¦Æz:§“ô‰‚rø>§“i2 ãc%*• ããdiF)sÝþ$NÑ™D×¹‹ïh­ÑFcMF²4wÅw‘Ja%ÓšDJŽÎ.Óï¥Ôª¡ «PÐS”öˆû1IÜǤ:ÄEºLûÏkkÜ\{’¥$ýâ> QÑîµR }%ÊwéRJ”u†˜™ÖXc1´¶˜‚ËRMyG©îsf9y®IÒŒv§ÇÂR‹V«C÷Hú}úýòe\­­Fçzx݊°Ñj)Î5š¼ ÜZ¹Åp~båz×–,ɇDV¢”_ŒXHÊ•ccuÆU昛ÃtA“a­ÁZ‰ޝ“¸(FaYc!n‹'¬öËa„FÀ#Œ0ÂÿXX<ÊòÒì÷t›øÀ8ÿüó‘RÇ1W^y%Ífó¤Ï]mâ—eÙíüÿñøÂgÿŽŸxáÿBì]¤ßœ'óKôâ¹ÎqNôŠ0ˆˆÂ2¾ç‡6š8éÇ]rí¤þJ*¶n;—#ï§Õï ™`ó–Ø¿gXÀººm-Ðm/²{××Ù²ó0 ‹ ]Opô`H¹RaÝÌ‹¾Oûð1´Ni51?»—wÿé[±XÞûgN½\#ôÔyãÔFîÛßš÷,•ª¤:Ã÷| ”Â÷²4¡úLNÔ)WJ´’‘Ì>’ÜhZef&6rhvßI‹ÿÕõz§½„ç9£;!äC ÖºŽ¯ç“YKEè®°F¯˜÷ :Þ«…[ÿaàŠù™]-°Cº`µsÀÀZص÷NÎß|ªðHÈö•4jã,6…yžÖ÷Ü÷6L¯ç¶¯ßÎkc”*>K ³ŒO¬Ã˜)¾çaLŠxE¦{€51BXÆ úñý~)½á^'–4“ô’>^¯MØïP)W)Gµ!‘cHÁJ‡"NC'í“fc¥Ï È‹™u—$!èõÑS«W¨Ö$ËËt’¢u@Úíbs yŽç-]ßZ¬Îœü_ '{—Ò)’ŒŽn»‡ç+ÆÇªH%iwúHë'-’N×[æLîæéx*,®7w2ð©ÆJœ‚RøGø„B"ýéO?äóO;í4Œ1H)9vìØC?l8røË³w’…ëHg¿Åb·Éls4±X<åS«4˜žÜȺÉM”Kµ“®ý~‡ƒG÷0»p8éa¬Á÷f&OcûÆlÑš]ó‹T7_Dsy‘Vkùa÷ë¶o|’©éÍÌ}¹£{Èó!¥r™M[Îä‚Ç>hÇfvßy³Çöòk¯ù~äÉ?Âoýöï²}ëvöõï'Pž‹ë+WO»‡AD)(áù¥¨ì ЬB{y™À/1Þ¨05Q§¹Üb8n0Lð1ÖI«ëÕqÛ÷ˆëÜjÎã…E9Ã:áÈàjÀý\ç~@’ôOxPÈÿW=°¦ëoOÌJ?‘³8Î-Ý—¾ý%ž}ñ³HÍàåÎpýÄz––±E%•GšÆÜzç­\rÁãøæµ_湿ô3ÜvûíxžO©ð÷X<ß“!<m,ÉrZµJµRg÷®›YI8°`MÑw][krr«Ñ}M’ôé•z„a…È‘× /Ì™CJ‰5λ!Ë5ˆ… ‰s–—{hë•2j•ˆ0t²óúXJ9 ßé1{ÔÐku\,dž£<¡$dëæþ¥¢V«‚”È‚ÐÚ’¤q'áP§@CÉ‘Ƈ,à °8eAž:âC9³?­sM¨¼‚ ¡XoÈuF®B|WÌyÑÙ¶Öb¬ Ñ}ŒµhcÙ!R8i¿ˆQ•9eƒ6†~?%Í2:.­fes¤¶HÜøÎß69¹vF‰B¸Ä ;e0Ž´ÒNà|Ùbµޤ¹‹ÔT¾'=r%‡W  £-IâÔ~X¢R® ÿe/{™s/ o¾ùæGýžï{ßûxå+WF®¾új^õªWý@¬ûg?õA~ì'^ÂþÅYÎ:w3ÿòÿ>½Æᓟø|ÿGé7»”¢ ¢ì®Ô­–$í“Û×Ýði¶oß>|쉗<™ÙåE¶MLsáiÙÓÉyü“žË¯ýûa·í¡”×þÓ{8û¼K¸óö¯¬ÙŸ}æó8rh?ÓvŠÛwÎð’—üGŽᆯÜÌÓŸøXŽíÙÒ'!,JQ™\ç„AH„Da™ÎüÁp导tÍc¯ý¿Îg?õ6ÌleÝä¦5óÉÃZU „ÑŠwÿñ{xןüáð±W½úåüÁÛßK£6Ád¤8}zœY¿Î3Ÿý">ÿ¹kN Äq3îÏûÉËÖÿ¿õ[oáè±ÕqþÝwräàn>ø·L­VãoÿCÖŸ¶ƒñÆ„+>Š2êd_Þà Â*…(*ã…%0†ìçÌ / 3¦Æk4Æê,dMW°äÚe¨®ð˲˜Jeü×w@ÄýRÖܬ2+Çzüþ­È‹¸9­™lL±°<7ìòzäîw±Vù?8/vUèŸ8Qò¿–°«¶»zß 7Ýõ5.ú!×zÕ92lœ\O³»ŒÑÚE"1n»ãëüèS~?KøØ?~ç¿à‰ÜtëlÚr:VQw€ò,¦Ý\bbÇ ÕjÀm·ÝìÖÀ•EÀ¡5!‘ÆPdà¹Ùw!±h&&ÆY\Xå‘®ýZ§ä~@nJx^H¤|7w.Gö)…oõÐÁÃxw;Xn£ª%&'ǨV"ŒµŒM5è6Û…²DãKÜq#Y–"ò )A"•Dy Ïó©–"ú^aŠ×@äTq.”š:¢É‘£ è®kƒ±X‹Î2'(L •0Èl0¹+̵Öx¾GxDQ84•4ÆÐé%N•9>ZÒ‹3––{èÌøÒ¬NH“IÒæ:Cç™óD°fhº)„ú2Xk†¦—B¸Ev?¼z‹«Ýy¸Q¬WŒ=ü $·I?FU*H郴T‚?)Wkè, i’²:ðRyEâ‡pŸ5)Ê (*•ããu*•2¾ç³0F311E–§4—Ù¿oý~DŒ0ˆa„FáßÿÚâÿúë¯çì³Ï ×ëñ+¿ò+dYö°¯9ï¼óVÃ1ûØÇþS­ùã÷8®¹ævìØ±f¯ú7‘öàô­ШOâûáC÷•JUÖOmâÓŸüx sKG©mÜIw˜A’l2O|ò7}í 'Ra||œ«®ºjøØÒÒ×\ó)S§Óë÷9vð~õå/æÌ3Ïäþûà?ú9žúã?C©TFJoh\'ʼn½vß±ÖEedX"!RYz”r%"lÅ4ƪÌLÓîôH“b Àש•c ÆFNšçw î·)ÕÆPÊ[“Np¼êÅZS”E®P±Ö°qj÷=xÏ ›p|®ßJ%ü¨ÿʬ¼áZâaU =‘Ý!Nû|k÷í\¸í\òBJ.ίQm°°<Å"…ÂS>¹Î¹ëîÛ¹è¼Ç –ñõÛö±sËi,µ¨Ö¦]G¸x§¹Ù#„QÄÌÌ$Üs I»c+Dˆ¢ 3œ!ž”á¹û+å cõ1Ú­NQ  fÎ5yž’f)¡!¢*`‰¥"ð=«p §x°Baa5u_`“˜åƒ}愯–¨WËÔcøžÏr³Mœv±Æ¢„BáºöGNè\Óëv‹ý!ŠÂ1ÏQXèDB“d}’´ÎcLî< ä‘- Å`tC˜añ/ rÕZ]Œ F†•¢ºP =þç䙋A̳ ß ÂOïû”+XYD'J°^µºSgd:£ß‹±”t×Tž¥¸œAšæ3òB¢Ey>ñi åÔk ¢¨Âþýûh./ Gê†ã QgF8" FaDŒ0Â#Œðï‚O|â<ýéOšþ½ûÝïæ_þå_ö5Ï|æ3™˜X‰²»ÿþûñ}Î>ûlêõ:ßüæ7à×쪫®âíoûšûÞüÛoáïþꃬ_¿“Ó6F½:î:r%õê3“›xï{®¿ù¦ßà•W¾ŽF}š ãSä%„õ8ç1?Íár`ÿî“Ì–W¾ò•kºÿïù³?£Ü˜!(ÕXØwÛ·Mðó?wžçñ¾÷ýããÙ¶}'Knü[(<Ï#Óù‰_(<)%2,‹ŒA%š(ôñ}Eµ1>Q%<g(HLñú‹¥1¹ùÄÊû!Ðm/P›Ø†òB¬éWg¯%„`@*c5›Öo[ykWäýÅ8ÀJùÈúûsܨ€]Eœ4͸8û÷ÞÎÙ›ÏÄ£ C ë'fXn-¹.°rû­¤ÇѹÃìhï ^«3Ç8¸‘Ç_4AÒo"ü Ú8²¯Õ\fã¦MÌLÖùë®+ŠAÀŠ¢p6Ü(¶0C4m£M›6„!Ö¯çè±cÃu°XŒÖÝ'Ïs´Îð“(MÁÂXYàIU4ª¹cmqz­Á—P–„!íöYì$è©1ÆÊWHO‚±äÆ¢s7ï{ŠJ¥Šïùä&ÇjÎ2ב.\ç…Hé¡mC'Åð°v㧇'‘ cQá\õ Bz¤yŽÈsǨ\BƒÎ!OS¤ç¹R\*´µ4“/Ä·ÏÚ<ß)®:Y–“¤9yžcò O'›“æ ­Î2½^›,é¹™~ºØ?±6X¢ Œ5wŠâ‹T é$tqlC§ )‚©’ëœ,ËÐ&¤R­Ðïv1:CyÆZ’8!î÷°X*•)ªÕ*:7Äí„~œb´Fà’Ò$&MÒ8Æbð7ŸFžÓ³–,KÉÒœN§C§Õsd—”DQu3ƒˆv{k-AàS®Tñ=gê™ç½~Ÿ^·K¿ßýc<Â#`„Fa„k\}õÕ<÷¹ÏÎñ¿ÿýïço|ã#¾îõ¯ýð5áá†K/½”ññq–––X¿~ýìzíØ±ƒ÷½ï}kÒn½õV^÷ë¿Á±#1Û×mgý†¨ ºf}15¾»ïü6ýWÕ/û.»ì2.xÌ™zð•ò¨LÞ›§sžüÌ_æ3ÿø´[Íöou÷Ïž=üöoý/þ¹_b® sÍC|ðmï¢Ñhpï½»øìg¿ÄŽ3žHc|œP-×èö»øžÏÁ¹C'ìkϯR¶1=Ré#ËÖZúÝ6A¥Ç)Õr„ï¹È²• ÚÅZÀ󪧼æíæ<Û£€ž§0ɉUú€poã$ÞJ9€‰úøZ¢aø<×wÅÕI¶É‰ ãGÖÜ&``,wým×ó—<Û9½ƒ“kkÁ¦™Mì;ò sV—EçY(n¼å«<õÒ˨”"ÊK‡Ù°þbvíú•±áÑ\^ÂóÛ¶m¥Õœãæo~c˜ ïdð.-ÁJBa±L4ưú½>Õj™v§ÃÑû`rrŠ­[6søÐ´6ÅùÅ ÎbÒ<#ËÓ‚T°T£2ž§PƒÂ!—M¢5B*"¥ð¤%@Óœ_¢ßOüÀÇd¬Æ PÒ£T­¢|åIò~ŽDb…ä›b^I‰R’<³«N§3q(ެ@[G²aÅȃB£ÉA˜•H?ש/beá“ µ3"ƒ1IšdX)±ÒIí=ßù&ôzI±æ–^·KÜï!óØçÚ¶­f‹q?¡µ¼DšeøJ÷ûô»]Ž%I7Ú Ö8B&Ïs¬Ñø¾OÜëÑj6ñ<%¥SG¤)Ò§ÔÐNQ¢¼FcŠZ½A¥R!*…xž"‰cÚ­&ËË}”R”JeÊ• íV«PE¸s?RŒ0Âw9Z‚Fa„ŽÇ»Þõ.^úÒ—âû®Xúüç?Ê|Ox†¿÷û}ÞùÎwžôyøÀøéŸþiÖ­[GÿêQ…ÿH¼ò•¯d÷îÝkŠÿ«¯¾šK.¹„¯}õ¶ž}›·œLûxòÔÿé•RR­Œ13qïûóµ1Š¿õÛ¿Éüâ!ÚÝ%àù>õl‘t1Ჟ¸ò’᪫®ZÓýÇ;ÞÀ?|øýÞ{oýÝ7pÆgðîw¿—Fc•Ú$¥Rk,§o;‡uS(—kÌ.;a_³J6©UEn^[)R+°&g¼Q%Œ|¢0 ü¢ØmÂuæµF—Á¾RÍ=4šËó”J!¢RBÛ“ìNŠ^”íR |×ÉMÓd•Ü•™_A Š‹aQÌy[kÖ¼Ïàw7¾vS+Å—]yÞªÿ-6çØstoá«`°Â9ú×ÊU*åŠ+ÚŠ )R*¾öÍ/Ñîõ0¹æ+Ÿ¸Ž Î=Ÿc‡÷Òm-2?w”õ7³afŠ¿ý«?_yo;Ø?3<SP¥RĦM§1ÖsÝÜ4avîGazzÊÁÖ8“=!QRâ+‰”Î=¿Ýk1ÛZ`®µL/î‘d./Í2ŒÉr@‚_RÄXzyŽ6er’N‰&ð  ¥ÀÀÆgqœÑï÷‰\–¡¤pé ©EJáðTkÈ­qʈ¢ø·«ŠcÎÒK¥Ò‘ ^‘` h“£ó ´Ž uaÖW˜öíÌŸz­J¹R*‡„KqX^Z`qîÝn›4ÑFÓívÉbg@9=3ÅsŸû&&¦(E|/,ŽcPÐ[§ 0Eª€vу¹v#¹Nɲ´ø=#79Úh÷_ÿ«Mñ{–‘¦)iÒ%Ïò4!MbZËKÌÏÎÒ\^¢µ¼D¿×%ît8|è ûöìåÐþôz¬ÉIã>½v‹~·ãŽIg žïâ²4e¹Õ¤¹ÜĘœz£Jø( ý~‡n»E¯Û!M2:í.ós‹Øƒ²¸¸D'¡ÃRñøa…aáûÁPyôP£T#Œ0‰)Fa„FXƒ?ú£?âWõW ßuã7òìg?û”^ûŠW¼‚ZmÅÅýÁ¤ßïŸô¹Ïþóשccc?pk5>>ÎûÞ÷>.¿üòá}{öìáU¯z×]wà$ÇÜýeÆžòR*q â%ˆÆOù=|/`|lš…}Çøíßz3¿û~€‹/~,Ï{ÁsøÊõ·Q.!*c6a"[bQmà)?v_¾öï×ý_¨pë­·rõÕWooܰŽ+®x¾ï³gÏ>íWÙ¹ó øÊêBºnúÖM§3o£“îg¹\¢ÛéA¥„xXk³º……Ù9Î<÷LzqÂü|›ñFf³‹Ü6=R&ψÓ>ë§NãÐì~i`iñ˜3[ó™•'˜®¢R0ç’'üÝg´gÖŒ3¬¨8Î<ñ¸ŠNF°ÊOà/{AaÜzß­œ6yš+bŠ­*¥Ø¾a;÷¸ŸLgH£ŠN´Ûö×oý*Ozì¥`-×â‹<ÿ¥?ŵ×åylݲ…oÜx_úÒõ± \×\89¼…Xá¢ãæææÝ é åŠÐZ³”/Q­Õˆ¢n¯GøîÆW„›/BôˆÓ¹Éé¥=*A©qq #¡•(G>6²d9ä™Ë¼<…"G÷ žï’~/Å èv:È¡ù[Si-²ˆ04Ö ¥%Õš,˰Ö8£?»:›¡ˆ/¬Y~йzÏ ðÓrqþÝZIÉÐ}™v®üQtáÝ *eÆjUJ¥Ï—£é¤â^csò4ÃzбZ¬å‚sÎf÷»I’)ŸüØg9ýŒíÌl˜áî»îA`Y\Z¤ÛKÉÒmé` / ±J²zÜa p¼âdE!PŒsä)íVŽRÎÌOI7¶`-t;í"ö/w×A7G9T\å|Œ)f÷Ÿ •rD¯×'‰a…ÅjPž"MS”òH³„~/¦×푤éðs•~ Ú¸CçYš×¢û¯S¡ªP÷àH½’œ°šØa„FÀ#Œ0€7¾ñ¼úÕ¯&Š"Œ1ÜqÇ<íiO;å׿üå/_SÔêSŸ:éó®¼òÊ5D0$~PðÌg>“k®¹fMWý#ù¯zÕ«XZZZóܽ»ïæ¬óïÃDë(w…¹ðOé}œ1[™ÉÓøÈ5Ÿàu¿þÚá{þ×þûÇç0>6C–Ð*¤dûLô.bÇw³çþo¯‘þ¼á oXsû½ï}/Q¡µæ÷AÖo>JTÇ«VÑYŽ”¥<’h‚ùÙ»OZ{JA¥\‹{ößãæÂÍÊçÊhÍ7¿} ž}>:çSþ,Ϲü'Ù·ÿ(»wÝÆÿyËÿ^Eg¸v¶Š>¬@Øâ¥á /äž{îAë¼Èp¯5Ö0??ËäÄ$‹‹}|Ïu\WŸ)\Ìœ1š<ë¡uB’'^HàùÈ¢`³Ö€D¡O‰Åwk”2rŒ5ˆ|Aš¤hë¡S-dÆP¤âט’@y(顤SH ”t +†ÄÛ×b~^8W1PB‹Å#3båÔ @;cÆáS„) sƒ±‹@zKÐc5:ÏÑY“gDa@ø:ãõq·OšÄdë¦8ïüs¸ÿ¾ÝÈgî@y’¥¥Eö8ÈÑ£GŠØ>Yx-ÈU„†)]Z]M8­ý;"„,f÷ݨ‰Ì²âD’t5e]bAAäXcˆqÿÕÆ` mÀ©(–›K,//D!QT"Ïs²,%NRtžã5Mn†×ÊlÃù2 ÔÆ´Ñ«>?c¬‘ÊC„ðÖ*rôh,`„FÀ#Œ0§„ÿý¿ÿ7ozÓ›†ÅÿwÞÉÅ_ü¨¶qÁ O’„ßüÍß<éóþëý¯'Ü÷ƒ4ðÊW¾rÃ?ÀW\ÁG>ò‘‡|ÍW¾ðž÷â7©)²î2ª:…9Å÷¨—ñ–7ÿ.òîw°}ûv~åe?Ï'>r-ÕÊ8Õê8½ A/PZ:Â亳ðdº¦ûÝu× Õ 2`p,<ð¿û;oá·ÞòNæÛUæÚäF#„•:Ý>ýñÿwÒ}ܺuwÝÓ§T |îƒÜ÷ÍÏðàá=ÄiÂûÿæoxÙ+_Åüb‡Ü×-ì'hm1¾! }l'%κlÜx&|çËÇ•Ì'–ÒIÒ'Mºž‡ðäªÊÍÿî¿™â¶T„A °h3VŸ`vþÐC•ö<’aX-®rý?ž°§@"ܽû6Nk¬c¢Ö(äù ‹bçÜ-çpσ÷ºbHÈ¡GAžeÜõÀÝŒÕêÜýÏwòÉë>‰–oß~ó°+,Š÷_!\Áe­q‰‡fjjŠ#GŽ8c@!¡œt:]ÆÆÆ˜œš`iq jB"¬§ ÏI$I씹vîô&%ËB?Â3Ç)qœâ{a)@ZW:j­‘X0)Æd.Ò ”0hf}ŽpÊòc ¾ôð=T¢’ ¤5H2„–hyQ°\ …_ÎèÑżµ#eQÔ»n÷ ÎPë5ÁÍçkmž‰sØÏtf±EA¹\bqñºßçŒÓ·2Þ¨óõ¯ÜDžçÜr󷈓¡ý8&˲,enáGf÷sèÐA16lÜ@µVeãÆõÄqv§ úý>J9¿)„3ß´îú¦0³\1£´«.ÓU¦˜.q A00V\Ñ -ƒëµ0M,TÖ!)$~qÝôû=ºý>ß%Í2§,À7Cÿ !Öì×ÐëÀ25±Ñ5P= L(òÄ`=‰À0ˆ`̇±š#Œ0ˆa„Fáðæ7¿™«®ºŠ(ròî={öp饗>ªm¼þõ¯§T* oßÿý«ò×WpñÅsá…þ@¯×êâÿºë®ãU¯z{öìyØ×t;-îûöçØzÖOPë.#âeˆ§üžå¨Êº©Í|⣟嵯{ Û·o൯{ ×üÃ'h¶ç)•ª(哇c,½Ÿå£ûxÛ¼uÍvŽ÷rxík_ëfõÓ”·½ímüŸ·¼žäsÜ¿¯Ãd£F>·ÈÑÌãoßwÕCîß¶ÍÓ¤iÎÁÃsÌÝz7ÝñUºýŽ“ôjÍï¿ýí¼ò¿¾ßWøž¢T (—Âa [懈 ¢Ýi2S©?D¹|bAÞnÍQ*CT"‹cµRüçr³j,_ ¤ï »‹[6lãØ*Cçì©Ut<Ôý« ƒÂ¨ðæûnáÇ{™‹¬+º·RºÂçÜç°ûкqwXD“ô _¼÷› ³‹³+q„XDÑý^ãµh|½VgzfŠ,ËBÒhŒÓl6‡…6¸h9—´—qøða&&&Ù¼y“+² ®®Z­2>1A½^'Ib’$¡Ûé2¿¸XH¼ ZÊA•Hš­‰’( JâHIÇ+ÂPÊí¦ö=)°J¢%˜\“¤9Jºsit†5Îa^XÍcçU@1V!Ú%NbÒ‡Ycòâ4HtšÙÿ‡•ëÁÅç‰bs“™“Z"eð½ z]7/tÚ]–ç±:ç¶[–)—úý^ÑïÑéwIÒ„,wsø¹ÎÐÆ°¸4[Ķ9pð¶ˆýór0&bÜù?±.H¥Bq -WÈm NÇ%DC’Äk^«Ykm0(Ü]ñ^¬u±_¦ðÚ0¦H4(‚<Ïq ‰Ê‹8R!œÇ·É#Œ0ˆa„FáaðêW¿š×¿þõ„aèæÕx€³Î:ëQoç¥/}éðwc ÿôOÿtÒçýáþ!¾¢ü]Ê\_Úã%ÿ…[oþ ;ꄬ2ƒí#x£JyÔkÌLžÆ¯¿ö7øø'ÿp>—_ñ<>ñ‘k©W'¨V'è¤)ËIŸ .ØÁϾðÃm\}õÕkˆŠ¿þë¿fjj €Ûo¿|àÃÇ~îòŸà3Ÿº–±™v/æŸ>õ§»O½ô>ûù[¸ûº¿ãÈÜ!’,%É’âK¼¡Ùlr͇?Ì3žõS8¼Àr³G½ZƧi£é(…I3*cªÒ>¡o7™Ú°?ŠÐI†.š–¦(þÒÜÍF‹Ð'ˆJΕ>MØzÚnþö×Naõ9’ðQ=×Ú~_jͱûØ~v®Û†Âu>-næÚZNßt:‡æ°°¼ˆ->*i–rþÖ‹øÎ¾;V:¾ÃâÎâû>J)²,£T*1=3Íxc‚Å¥E>B¿×wåµx°‡‹a|œ±%œcžçÌÍͱ¸´H©T¢•ð<?ðYZZtç¡ÝB)±FƒmÛ·ÓëuÙðóóM:=ƒR’ èµúôzåRD) ð”, C7‡ï….1К<+Š:áºÕ¾Xq¶ÏsC”Ëe„§HtŽŠÀz ½Bžn…¡ß`PÝ—ÒEç\»Ž¶/žÍÈ´)Ìö,Yž’ê ¿T¢R©‚”ÃYõ$í¡ólJäž&É2Z­. Käý>Vg(ázíí–»æâ¤G?é§±“¼ÛU†‚Ö:Â*Jk &7äyFEΔ³è”;‚E»‚\äE£úI H‹!i„ÆËJ#¾ X鈋µXëqáÖkuÚÀp  (ÔOnÙ ‚¡0¨ø* “ Š„•1[ü»2(ð Æ„ȇ¤Õ¨ó?Â#`„Fa„SÀoüÆoð–·¼…r¹ Àw¾óG-ûذa§Ÿ~úðvš¦¼ç=ï9áy—^z)?ò#?ò_ p¾ÀíÙ³g¨xæ3ŸÉîÝ»¹âŠ+ÖHë Ÿÿ§¿á§®xé‘v– jSä§X\Fa™™É|çŽ;¸þúë¹ì²Ëxݯ¿–ùçëYjÎ%ºÝe/áw~ÿ]k^?pþعs'W\qBÒ4åMozÓ ï÷s?÷³ü×+½³ûY˜?ú°ûöšÿñGì»íŸÙdiž;ÿƒrX Á¼ó÷yáå/¦V«—é÷¢( Í2<åæšU!¥wÊöâüQ6ïx ¥R‰^³Sȉ]áoWÿ(…PŠR;†Û§Ö?ŠâþÑ\Ÿ¥x˜÷²–Ûï¿™ã눼°PÆkÒ]§O£V®stþ(Ý´µŽ8wëܽïÎáv¬ø¾Ïú ˜GA¿3;7˾}ûOŒ2”E8ÞÀO»ùrMQ\æk&wöq?FÁüžòX·~=J*Z­6R)ßgÆ L4ÆñTˆîf`,µÈ£1Ñ`a~™´Û#ë%®ó,‹TIêµ2Aâ ð´3k4P?ð‰|ŸR9Â÷|’$¥–éed)$½$Çä¹{ý ý-œô_ ƒ°´EJ”D¡0Fâ+_èYCª yž“f ¹0x:Åè>JøEœ’g-¢ `¬†’,OYZjÓ^lAž MF?]Jn{yžg IZc« h;L*°…'=AAÒï÷i4ÆQJ¡u>,žÑcÁv­ú ó'VmR Rzx#âÛ§0ƒOTQ´ö_f€+ï÷ð »JúÿП©BÁ úy£¢„FÀ#Œ0ÂßEñÿæ7¿yXüïÙ³‡'?ùÉdYö¨·uÕUW­1ñÛ»w/‡>áy¿ÿû¿ÿfNÞùƒA'ý}ï{ãããŒsíµ×òŽw¼ãƒ½ãÑl.³o×u̬{ ¯é/CéÔR”TÔ«ÌLnâªßx7ßz#àT¯úÕ+ùƒ·ÿ9aP¢ÙYà¢Çž=$~ë·ßBnÔðö_üÅ_P*•Rrë­·ò…/|á„÷ku[¼ýOßzJû¶û[ÿL«µ@œÆÎ•Û˜áü°):Ó{x€¯}åÆ'¶qøÈžïáy ÏóJ¡”NRkC¿yd_ˆ#‡÷ñ„À#*ô<\g(éºÿº˜ýFI}”’4cEwq :YíößÛ41ûˆÆêûò<ãÖ=wð䳞àŒåŒÅW^!GwööµjzmŒN·Ã¾cû‰ã˜È¸øÌÇó­ûnnqff†4IXZ^&‰Ž;Æ0~p…¤Ûƒ!Lá$oÀÊ¢Þ+¢ò+0ÂPXÎ9ö,Ïùx@jáÀþH))W+”Ëu|åÓì÷©è?ðHã¥, ÀŒÖ¤)¤IŠETJ!Aàã…>žP„Q@¹1=ÙÀ÷Z|å!ÍNJ½Z"N nŸ,I@@»ÝÅf9‚(0Î_@J”B ƒD ‰Á©VŒ'ñ¥B›œv»)®kk4yž‚…v«C»Ý£ßïÓn÷ðŒÁꌼ˜ë·FcŒ“ŧ™ÐFÄÆêî¹]‰lääÅm’$´ÛmÎ>û,öíÛG§ÓYõÚãù‚G"¶ „5Å¥ ‘R¬$ GØ"yÁ®ñ8~?-ß›š|5I0Â#|¯!GK0Â#ŒðŸ¿÷{¿ÇïþîïR*•††;wî¤Õj}WÛû™Ÿù™5·?þñŸðœ½èE<éIOÞ>^6úƒÖÍùÈG>Â%—\²¦ëÕUWqË-·œ`x<¾úåëˆõ”ÆÑZã¥S~ßÀ˜ß@·•ò×õ7Ãû¯|Ù¯P©û>¶‡csûùµÿ¾2ë¿´´ÄGÿáãl;ýNÛ´•ç=ïy<å)OAJIš¦¼ñoüW¯Çm»n#Ëé—1ÆÍݦið¤BIÉŸüÑ»X7Ó =|O ‹R!žç“‘’›„Íë¶žRa={ô aPŠ(—ÈY5ó?(v•ʽßÖ-ëA¸üzcr”RÇ]‡'þ|ïa’$8ttÇš³k渥…ŠB »÷•r… vžÇg\Àú‰õœ6µ‰§\ô£ß!©”Ë4[-ö=ø s/ŒíÖ›Yµ«Š9wÞœ,}x»ðj°¿3ú¦(l–$KȲ¬0os2î~¯ÏÂÂ,­Î­¤Çýûö¡%ÄVÓŽû¤™S‹˜¢že9I·ÇÒR›¥V—ÜBT)•KLNŒF!QR¯W™šš`jzŠññ:“SlÜ8ÅæÍ3lÜ4Íädƒé©S¦¨O4ð+%2!éf†ÔXcI ô³„4IÈ´&Nûhc‘Râ{!ʲ4¥ßëÑm·è´[tÚm:Ýi–Óíõ™›Ÿg~a‘^7AhM–gtû]ºIŸÂ#`„Fa„ï{¼õ­o嵯}íðKâîÝ»¹ä’K¾ëí]|ñÅlÚ´ixûdò¥ò'2ÌhXOlذáj-÷ìÙóžõ¬5]ÿÇ=îqìÞ½›Ë/¿üa_ûµ/|ˆcÒÃ*Äý6§¦€RR­Œ13yï|Ç­ñxãoþOŽÎ=Èó_ðì5Ýÿ?~×»ñrAg¾Iµ>Ã[ßúÖ¡Ã×¾ö5¾ò•¯ü«×¢Ýë £ãŒµk „AŽº”оôEfE¾'ñ}ÏE{^ç I³aÝöS(¢-GÄó¥(Ä=Œ•d†¡“9JAàáùŠ( رu¥(ÂâT'Q©úÈåº}øŸG]þ¯ê¤®lceCß¼÷›x‚,Ë1z¥K<˜é–¸}èTJ²4aÃÄFÎ<ã œqÆéH)ر};•JeÕû®HÍ?’†")ÀyðCç÷¤Íþ+۰Ŭ¼±†æò2:×äYŠÖ“SlÚ´©É &''™šœ¤…$ýIÖfniŽÆTžNXè¶XîuiõºÄ:!S–L%\üŸhk1@še$iF–k=)FÛaŠHø”£! Z+31^grjœÚXr½F.}:INœæ$YN’j’ÜeÉÇqŸ8î’$}²<Áä9qÜ#Ž{¤YêÌéŠÎºÑ–,ÍÈÒ“[¤udM–¥d¹+žã<#És’<#ÉÒ‚t*ÖoÍu#Š11¼-Vý~–×¾î5ÃûöîÝË_ýå©Ôס;Gø©Ÿ¸Œ³Ï>{XH¼ìe/ûž­ƒÅâ)oEÝ1¨n ó6%%J*®þó÷²qf?ð <…µî1©XÐB²nfû)½gšÆ,/ÎRŠBÂ0%ÑV¸Ù%ÁóJ!¤@y•JH¹R.f¯5SS§ýëûˆ€“'¾ÆUÞý¸Í»ï" Kn B‚Ñ«•㊾À(—*t;M.9ýRSa×®]8°ÿ¤mÖÚ  (ðEþÀàÍ Š¾‚ 0Eî»ÕN  m¡ôÐNpèÐ!Œ1œ¾s; sìÞ³›¹ù…•‚·8>“çt»Ë;vˆõë”k>*4e¨Õ}ÆjŠzÕ£Võ)•}<_å9½8f©ÕâèܳKË,µÚ,5;,vú4Û]Z½>Ëí­NåN^’’~€U ? )ת”jU¬(’ ´&×9¹6äâ,!Ncúq‡^¯Mf2>aây ý ,Yž$=úq—d0ƒsº7…{½.:玀«J±†X!ÌXE¬=ßàüî¼Óù>t:æææ˜››ãàÁC´ZMîºë.2¼ïòË/g÷îÝ<îq;ékî¿÷6î>º ¯2îŒïòþ)½—‚J¹Æº©Íüí_}½{÷ûð‡?´fáOþø=Œ×§ÉŒa¡½Ì¯¿î5ÎeÞ®½öÚ5¯ý×¢Õm3Ä®SŒpñiÃΦxÊã£×\C)4TËÆX<ßC)‰ò¤ï“¦=ÆÆ7Ÿòû;² ô©–#Dµ¼ª ¸ÙO:£3AXr3ö:gݺmkæš¿—DÀ£Q ÿ¼}{oc6N £‘uv•ëújɾ¡–üˆöòÛö&¦7Ójµè÷{û†Ãm :ü«•ÖIýÏHÅݼuóí…ƒý  ¾ýŽo³¸¸@·Ý¦Ù\äà}>|˜ÙcÇÐyædä:§Õ\fyi‘™ÉÓ“cÌL7ر}n*$Cg=ò´OÜïÓl.³´¼Ä¡ÃG˜[ààÁ£><ǃ³ûÁ£ì?|”ÃÇ9:·ÌÑù‹Í.ÝXÓO I¦éöR2m‡|áy/BK#á ëª`€¥¥%®¸â ^õª•ùû;vpË-·pÕUWô5ßùÖçØß‹ JÒ~S‹Ôò”O£6ÉÌäi¼ûÿlxÿjå[ߺO|ô³”¢ οõ;odÝúuH)éõz¼ãôÆw‡Ã ³xÊsÿªíšU•°’ %Ÿüȇ˜œ¨áÊEÁIADN bRJ•©S~ßwï¢R ¨”#üÀßO 1©œºÀ“N6ï>Ö:ÙøÌô¦U»úpóÒYºŸðÚÉô£'$€1†¯ÝñÏxž6y‘À*"ÀžE‘3åë6yÒyÏ`brÝI ÆÕ €“ÎÀÞûcÖDձƽ~PøÖŒ6Eg=#N²,q]ðÂÕ?Ïs„$qÊÜüZkú½˜]»î£Ýé$ ý~L¯×ayqžæòv“vk™fs‰¥¥Eº.ÝnŸåå&­f‹^·G¿×¥ßï“eš43t{ s m–[=š­ÍV×™†!²T‚(ÂFeD©‚ˆB¤/ÈmL?i‘™JfÔk%f¦ÆÙ¶e=çž½;6sñcÎå©O~<ç_p6““ãaˆPÏ÷ñ¼¥R*„rc/.¦O ö\Ü]qmJ—ò ĪŸáÀC<òõ8Â#Œ0"Fa„þSâƒü /yÉKí5_ÿú×yìcû=Ùöë^÷º5Åý®]»èv»ø¾Ï5×\CµZ4 <÷¹Ïåî»ï>Á`PHü0àꫯæ’K.áÖ[oÞ÷ö·¿k¯½öƒÀ$îs÷]ŸeÁÖð<´½pÊ£QTafò4>ýÉáúë¯?áñÿó»oe¬>Iž§¤ºË/¾|ØýÿÌ?}†Ù¹”gþÄ‹¿gÇm­dʯ™®ò=Rñ÷ø çž¾ŽF­‚òÜh€“[Wȳ”ËxãÔH€½{ï%ŠJåˆ(  ºh»ÈGJ®ó¯I“¥ÎP.ÍR’$¡Ûí1;·D³Ùc <«5IÜ£ßí÷Ûô{-ºí%Z­EZË‹´š‹äIŒçI:íÝn8Nè÷û$ýq¯KžöI“„4NÜß•"Y¢T)Q©•©ÕJT*%*ÕÕZ‰(’”J!aà…åÈczrŒM§­cë–lÛº‰ÓwnãüsÏà Îaó¦ lÙ´éÉ Ê¥ˆR©äÆ|¨TÂ|<å;@®&Ä,b !\üåÊßÃã'-þÅè¶FaDŒ0Â#Œp"®»î:^ü⣔Â÷¿ýmžò”§|϶¿z[Æ>ð oýë_góæwš¦¼üå/§Ùlœ˜¦)‹‹‹?4kë­·rÉ%—põÕWï{æ3ŸÉ-·Ür‚AàÁýpxñNâh)%ywé”H%åRjyŒ¿ý›÷¯yìúë¯çŽoÝãbÛ üÙŸ¿‹z½Ž”’V«Åë^ó¿Ø\­–wòÜçÿÒ÷ì¸}?Ä÷ü¡ì`(p>¡R-WAÃ?ÿÎØ¹r)t9íÞÿÏÞyÇKR•ùû9çTUç›ÓÌ<Æ”¤ÀˆèW…ÅÅ€á§kX1»+(0¦eWA%ã0¤!33L7ßÛ±Â9¿?ªºï½`€Wô<|šîÛU]U}ªº§¿ïyßï+ÉärD&¢RcöŒ;µÏgW<‰Ž"²™ÙL¥H§B¢•Ôk»¤<ÏuH§3 ñë8î¤,ˆÝçuf¶#Ä· ˜m‚O?ý†£¸œ" ýÉ™Æ4‚ucA%%¹L( i1Eqj\ò°Ãã™ðW=ÀøöÆÆ “l­£8@k¢0J<â€A¤c#AŽ Œ[ßUk•Ø/ièû>¥R‘J¹HµR¢\ªQ¬ø”+Õ¤!"ªÔª%ª¥JcCG)Ž R­)•ñ+>¥¡!j££ÔÆJ”†Æax`˜âè(ÕJ‘À/!t€ÏW %ð\Ïsq=…£’àS*E&›%N“ÍåèììdZïº:Û)ò´´´0uêTrùéT)Ê‘´µ5ÑÞÚL6—%—Ë‘ÍfÉç›Hg2x©trÉDè;H)‘ªîM11 ’ó[Ϙ¨õ­è·X,6`±X,–çàî»ïæøãG)EEüñä ƒÚeÛó›ß<)ý¿R©ðÃþ€Ë/¿|’¿@E|ë[ßâºë® ½½}Òl¿1†Õ«W366öwwÎ:ë,N=õÔ†[kk+W]u—\rɤl€¥wßÀˆªB® ¨bª#¨çÙ¶ÖÕZ™J­Ì«^ṳe‹?u.-…Vj~…½ö™ÃñÇwøÅϯ¢­mímS骒NÍåÐW¼fÇ?äÎÿ\èÂs½IòR’Š”ë‘NepT*Íåÿ9Ó;’ÔýX¹^Šº±ZOÏž;µO߯ñø£ËH§]²¹4©T )%Žëày.^Ê%•vÈfRd2)ò…ô²é<¡Öa0É\ ‘Ð(9¤R.i/MP«ÐVäÈEïÙ¦Ýᶇb¦€Éž›4Éq§÷=ž M„1úÚ‡ÑøóZEš0Œ[È…~ ¿V¡–´Þ«ùUJ¥"űa†Gfh¸ÈàðåJ™J¥H©4J±8ÆÈÈCƒ#Œ ᆒ‚€4štT!­RºJ–€¬ˆÈâÔªTGFb°€âÈ¥±1jµ D!!ÐI Êøq*•%Î‘ÍæÉeòäò”ã @*—šP­…ŒŒ–Y»~O=ó,ahÈçòtuwÑTÈ“ËfÉåòd³YÒéLtòR(¥RÅ)ÿB"ÈFÚüùRn“þ/&ux¾ShÓÿ-ËócíA-‹åïŒT*Å]wÝÅþûDÍoû[Þò–·ìÒý|èCš$ ŸyæFGGùЇ>Äi§6Ipüþ÷¿ŸÔk~tt”3fP*•v˜öÖYgMª¥ÿ¿ñ/åX®¾úêIæ€Û#Š"î¿ãqÜYtÚ¨‡H§›y®™¿š_¡op# îÁ™ï>³ñü—ÿˆ±á -…6¬ã _úŽ ìþþ~¾ô…ó˜?û@¼\RF´Õú1satt']º@ƒÞé÷Ú7ÜOû´9”e™(ŠBà*‡”—"íeHy©Ä]ûxhé]twv±¹oÇ©ÅiÓJQª´¶í¼à3O=ÂÞûB&í‘J»h!¤Âué”K.&›I¡uD.—KRÖC2ÒJg)—Fw»iòuGzm¢¦Â02´‘û×=Í~]Ó "×u&­ Äz/ù¸Ü"奈tD­Z¥0²…£Nx·ÝtùVï¥~bâ1Z#¤œàXŸl“<Œ— !ë»MÚØ„q 0aRE!Æ´6ȤÔG9Ž‰Ïµ 4†?ðñªU 錉CMèG¤•"ïº8JÒ’NT‹lܲ‰‘‘åRŸ.@”dœ¤”Âà Ã¥‘B)¤ëN¥ÉæR?é€ñ‰Â01®t0(†‡Çˆ¢ˆ\f”‘\6Îv@204Êèè…ã:8®G„¸®K†Daˆ1)U\ÖÄʘ¸;E"Ö€Žâ²!@G %FG`&õz˜,Úö¹í­g±X,6`±X,ÿÌž=›Ûn»­ÑÚ÷}®¼òJÎ<óÌ]¾¯C9dÒß¿úÕ¯8ùä“ùêW¿:)½ÕªU“:@lø×××gOØVlڸͫnEN=†‚*RÛ‚[èÞ®-`¤#F‹Cô ¬çû—Ÿ7iÙ%?¸Œ|¶™J­Ä‰¯;ŽؿтñòË~DGÛTZš;qPœ°L{e„‡ü3•Òkž}ò%½帱à4Ä:îÛž ¥Äu<.ýÞøÏ‹~ȪÕ[+Vp×KS«Uðò;oøô“à(EÊsɤS„aXJ§Sä³2™B J•éL“Œ¡DÓÔܶM`{‚ü¥ê_ÈDmý5O>ys§¼WTü/µ£W4„p.E ÁØè(=^o|ëùÍ5ßßæBlÝ›0 $傸¥@Ä‚_hd½ÓCãu‚HQlj‡#ÐÄv :iÕ0!Ô:"Ȥ^©ˆj¤q•KiLa´Á• ˆüˆš‰gî½LŠQ?öˆY ¤C¤M2Æ¡#¤@²^_ƒ "]a°\‘JK<7EùøµRlX™ŒI¹ QP*:”W¯Eëˆ ÔqɃ‘hQ¤Q‰‘_„ïûaŸ )QJÅY1ŽCq€ ~HZ£¤ÄÍ$±ñãVõkÐNô[,–—‚-°X,–¿Ž=öXî¼óΆø/—Ë|ûÛßÞ-âÿ]ïzMMMüˆ÷}Ÿb±ÈÅ_L¡Ph¬788È[ßúV{r^wßu^zë"ð}dmûe•J‘ÍýëxÃ?Ÿ8©´ãsŸý<£Ã¤T ôñéÅŸh5nÚ´™ï~ûR:Ú¦’MP ‘„NÂ*mcrôéL6û%½‡b¥LS®‰\&ßÒ9<×Ãu½InçŽR¬^ù,«ŸyŒl6…ëÆF}™L£Š&¢§kæNíóÙ•OéÏsÈd=Òé¹l:.ð\<Ï!å9Ôj!^*®gžD>söØŸ™9}±Âk¢Áà‹Ý†Öw=üGò…v¿†ȺÛü„4r=ä%BHÒ© ¹|–-}« ärÆ{þ}gŽ89Ö ]ê’r€Hë$ÌPï|0Ñ pÜ4Ð$3þ:1œØ1 þ;ž1¢0ˆ[†¡ C¤1„‘O±R¢âרÔÊè0DA*ß„1 ×ËJåEÅÆŽ¡†È€Ö  B‡¤$xd$ä¾ÏPÿ(åJr¥HÆHÂ0¤Z­066Æðð0}ýý 3:V¦\ªP*• Ÿ±ÑQ†ú¦X,Q­Õ(—+TªUjµ*~Ío¢ÜT 7å‘JÇžRH¤ˆÍ/•ãà¸.®—ÆõR(ÇE9*䈿Æ,‹Å,‹å„3Ï<“_ÿú×L™2­5Åb‘~ðƒ|úÓŸÞ-û;ãŒ3éÿRJÖ¬YÃ{ßû^:;;'Ô ï~÷»Y¶l™=A/k¯ú¦-G¾ÐÊèèÀ6­ƒÐgh´J0ÊGþýÃ燆†¸ê¿"Ÿm¡R-qÖÏl1j­¹äâÒÙ>…ÖBJ9h$2Ù¶q²àWh+qıgÐÕÝû¢ÓÐ:Z:hÊ5‘ÏäI%FhŽrP26]“‰/€çz\ûó+éh+à*!%él)jÕ"{Î;d§ö†!ëV?M6“¢ËÐÒœ£¥%G>ŸÆK¹8®BØ´e˜|.—¤ª"¿FKÛÖíòvìÚ¿µ˜ßZxMì(ðÜ^xa°Ë6­¤©¹•J­B„‰Øwo´›KŽ]IEÖÍМk¡¸é17*Þþ¯ïÙ ñ8>õ™þF @Çyÿ‘Žbc@]o+h0$­¦4‚ÚFQ#U>Ò±i 6!aäã‡5ªA•¢_¦T BŸ‘Ò~ÑÚ܆ã8D2Úàº)7…ã¥p¼4ÊË ¥ ÊC('žajüLšØ`(DiŸ¼+)ÂÂÆq•KeúûûéÛÒÏàÀ£ccø¾P2®é¥ÚDDQ@µZ¡Z©à‡AP«úT+Ujµ:2qù@I:Áõ¼ØPIÇÅóÒ‰g@ ÏóÊÄ ¼~lÀb±Ø€Åb±üÝóñœï}ï{v_ÃÃÃ|ô£å'?ùÉnÛçÖéÿ¹\Ž=÷7l‹¢ˆ‹/¾¸aúgyaø¾Ïí·\Î@¾›T*3©5 1†Ry”Íýëxë©odΜñÙúo}ó"¤ñÃàÈþíÌw5fÿŸyæ~rÅ•t¶M%“Ρ„iˆ€ UÀÔÊ´•†8êÄ÷‘Íæwêx_ÿO'3eÊ,<×KŽãRÈ5‘Íäð\&çÆ=Ò•r2ž½ö\¥wßCJUinÊâ8¥$Ž—Â¯–èêš·Óãöô“ÓTÈÐÜ”¥­µ@WG3Ó§¶“Íx‰(– Ž‘ËçbQ+ }Ò™¦í ßñûmoÆŒ;õïJ±ÿ|<öÀÖ×™t–b¥´]Ñd#ÓB)—B¶‰l*OÐÿå¡vÞô–w>gÀl#(·mØè t¤1´‰õ‚ ACb˜þäÞ˜ñL­´0„q?BLÒFOR‹"ÚZºp¼45™¡j|™¢‚¢ŠCUÇ÷‘rŒŠƒB&çJPw 0B!aîÅðÈZÂHS©V)—Š”JEJå"5¿†ãxdÒ2™4]]Ì™;›TÊ%“Îb „a@Ä>a¢ÀÇ„A܈¿ à¸np¤HG!•LŒ+]<Ï‹Ëe&´|®`ý·X,6`±X,ÿ üð‡?ä«_ý*ét€ 6ð†7¼Ë/¿|·íóƒü Ùl¶ñ·ÖšîîîIßqÇ|üãÿ›£E‹5„ТE‹^6çvõêU m¼‹jn ~P#, &âÚgh¤lAñ¥/±±þªU«¸â‡?#—)0Væ‹_9—žžø¼AÀ÷¿{1m½4ÚbÓ´í"©D!m¥1Þø/‹I¥ÒÛ]WA>“ã˜æ#ÿ¾˜Ë~ö+ÎúØÌšwJ*¦õ̤k"ÊIgâßs=åà:.J)\'QwÜü[¦t·â9 I§³Tke¼lÓNÙÃÜG!—¡©)K¡&—M“ɤhnÊ’Ny(GR®¸^ClžWó«[^(†¿ÖÌk]@?üèïqšzR1V*Q7êk´Žc\üS_* 9×Ú F×@8‹×œtò¤÷Ðhý·ï¬ÞpbF€Ñ:™eŸ0ãÕKÂFg€ñ’€pBY@½Ó@ˆ#0ºa)• J‘-4“nj"’ å9äššÈæs(7r\\Ï#Îàe2„(¤“B:NÒá öý5TBÍh-`¸P5†š_FkMÆYB9x©4^*M>Ÿ§½½™3§óú“Nä½ï>ƒ£<‚L:›êˆ0ˆK‚0~?±9cr.丳},ê×u1ZẠ×q’Rg‚¨Uù‹Å,‹åš_þò—œqÆ8ŽƒÖšµk×rÀp×]wíÖýž~úé“Üÿë^užxâ ^õªWÙ´ ¸í¶›™1ò­Ýøµ*2,S,Ð7¸³>09û¢o}—–¦Â0òö·¿­q^–/_Îo¯û=mSH§rϹO/¡,sÆÿû&¹|S"$®ãrâ+Oâãï?ÓÞõöÝc!ù¦&†GŠ …,zûQÊaJ÷tz{fДo&Ê ”"åep'ÿJ9x®GÚKsÇo¥³5E:íÑHé„UF«e:Ú§ìÔx=õÄ#”ËcäsR®‹ÏuH§\R©ØA^kMSK[£û„1†¬›ÙéVkÏØýBmh`®~€Bs;• LÍ÷ã™î ?í&šÇÕß›ã8ä³9J¥a¼â²ÞÞ¼úø“¶zl3¥üÜïlÜ`’g€Ù*K@›$;@OX7¹Ÿ· 4tÝ' ÉèlëÄs=3g!Ž”x®‹ã8¥È¸.‰£\\×E¹.’—@¸T *¡¦F„Æ`”Áqêß_"IËwÉfó´´´ÓÖÖAgW'{Ì›Í)oýg>ø@Ö®[ϲad´HµV#ôÃ8íß÷ «UL ˆÍãHDDOø”Ë%*IöF*åatDÔ|cLðRx©J9ÛŽû6a9û¥i±XžÛÀb±X^†Ü|óÍüñ¿—.]Êá‡þWÙ÷¾ûî»ÃeëׯgÁ‚öíB®û奼ñÔOÑTÍR)ø>¼/g¾ûßë<°ì®»ö:Z§04²…oÿkär±Ð¢ˆÏûE:ڦДoEÉí÷ƒ—[K'EÁT\±†)Óö!ojuøk›§QËô­}Œg×?C6›G9Š•«7S"Š"º»g‚¸nŠöÖ.*ÕÅò¾_CŠR‡ãF!Zk<7E…Ü~ËïÈM9¥•â ö|ºëÚç+­5Ë–ÞÅ1¯~-žÿÄÑœê•TÔüŽÙ½h£=Ö]>bv»0{rùŸél™AW¶™Ñòžç"…wîŸИøw.]@‡†rq„&±YÈ«_]åÖ[ÿ¸Õ[Ø~DóœïÈLZb´NÚÚi¤¬/– uÒ*P"¥ÆÔ’ˆ@ƒD$ðDãºÛºC9ò¨ÕÑÂ%ˆ@bp”Â×é8%!Ò ž‚j4ÞÂP@tÆEÚAá8Ïõi)ÀqM…<ó÷˜Çü=æ’Íf¨Tª‹%6mÚB¹\&B"›š0Dˆø³w90ñóÄ¥˜m Z'”ÂP«Vc/„¤¬Äu]LÒ±Ãs="/Dëh8mú¿Åb±‹Åbù;¦§§‡›o¾™}öÙ§ÑÖíŽ;îàØcý«ìÿŸþéŸÈç·_^*•xÇ;ÞaOÒ.Æ÷}î¾õ'zÌ{Èn~OG<ýè fL݃ ô‘R‘Ëèh‚TY°p>‹Ðxý½÷ÜËãËŸaÏ9’ò2;ÿr{Æw¡™GvSr)6­{œGïý}\«¬åÐ=u*R*žY±6QepTpÜëNÇTÇÐZ#¥$—-Ig¦R)Å}ÏëýÏu¬l"rû’›yíéû5„ë¤ kU:_€À_c;‰TÊ¥V ˆ7§¤G:^*K.ŸÉZ#•ŠûÀï6êâØì’À€1ðàC7pâ‘ïÀõkŒ‹4šã †ŒÛõ 1Q’ ¤hmhnjfptˆâØ(!ÑmGrÄî¹çîïl« ‰‡8̸(q;A)bQoÂ`" ­ãTx- RׯBM”¼‘„š³Mc«Tjx®—8ýÇóâòãH‚ô!þüç?ÛµX¿~ÓVÞÌ´îcɲ–é­=L阉¯£FõRy”g×oäìÿøF\;LÜ ò´w¼‹îöÙò-ÈíÌþOÿQRhn@ÆÂ¤¯ïYúŸ¹›‡«eŒ•”|èĽ½{Z/:ŠÛÜO‚¶j*»]n¤‚K)qöÖ.Êé"CÃýqÏx­"N O{ÂrÈкǪ€´—¥Ô*ƒ”j|æô9¸ç®[ñk5Rž‡’¥â÷!¥`d´L±Xex¤ÌìysÙ46.ZõîO;ê*°³Á€­çÝcÙ96:Àý+îæóet`#¥ò…\˜ñöqBƳÜRÆ3Ò29¯-ù†Ç Õuaæ"¨Õxðe;ìˆdgã«$bß$A€ºC¢ bÑ«£!Rj0# FÔå´ˆEµ„(N`jçT„xÙcµ£C„ÊSŸÙ›$B*@ã¸(6‚N”ã`´AŠdÚ4SÙLš|>#ž|òiZ[Z¸ýλY¾üqÆŠe¢P&ÓòZk„6IÀ%Î6ˆtDd¢Fà)6<œàu`ê}’c­a—¸Ž‹P’0 0\ÿ¡ý2´X,/ë`±X,/N>ùdî¿ÿ~z{{‚û§?ýé_UüL›6m›ç|ßçÜsÏÝ­],pï½waÜõd[{ɦ2´¥ÓLëœNwÇ4²™¥Ê(‡q ‡rp#;ä·¿ù)'OGëRnz?êªMÇiÓ¡a‚¦Vâ'î¥)ל<ݘ٬‹û+5T0¹hÑ·b-:•LÒ§^"…@ ÈfòLéžN>[Àub3@ÏõH§2d3Yž|ànº»[â 2Š¥ö™èN“_«qÿ}·Çíó±`s!GS!‡ë¹”ÊUÖo`ÖÜ9„Q€1†‚Ò(¥þϰyŽÛÖëg¬zj)«*c´vM£\«„þ„ôÿñàǤ_}”’´4·¡¤bx öÊ(Óçÿ{í½ï ïh`&wElå%`ÌñËx{@ äØ' ^'Òa”Ññu×ÓÞšzz‰BqÂQàº$¸qÛ<¤B(!E\Fâºqg )QŽBJŸkŽrð<×KÅ-øÒi2™ žç’ÍfPR14<ÌÀÀ /Œ\Îèh‘jµ†ïûDaD ãÖ‡*ÉV0:B`0Q”¼ØðР†‡Ô»$1Q²N„ŽBÂЧZ«à×*mâ®®ƒã¸sûBfÿ_º¿…Åb±‹Åb±üÕøèG?ÊW\Agg'ccc|øÃæ}ï{ß_ýXî»ï¾FÊv]üç;ßá /´'ê¯Àµ¿ü)N·Gº©( KC˜(ddl€-øò~¡Ñö¯X,²øSçÒÙÞK!·ãÙÿ†xˆ"ЕÊO>ûÏ®_ï×hké$Ò~ĩ֘†à3@{÷V>»™H9Ì?hO†ÝZÂBg"þEb†VïS/PRÑÚÒA[Kg\s-J)²™<Õb…îl‰tÚCJ—„5fÍØw§ÇéŽ?/Áó²Ù©”KKs–Îö<Ã#Ežzf¿þÝ=ø¤©Öª£Qh:»§½ ®€íg,»ûZRyšZ{-aЉ9g<› ÉãzCC®»ƒáÁõìsØ~˜t WoƃªgÈz;4ÙÈȤ³t¶O!—É7Zæ²î½õffÎèw0Æà¥Ûv>Puïè Jwg M… Ë–?ËþçVîºëQ*CE¢Ñ1†ÊAèÇmÙjEìÔËöš¨UË,_z-•T;(–Æ&ëA‘ˆ±íl°”Šöæv´þµ´—ÇØçðw0{ΜIB~çf»ÏÅmøÌ¤µâZ}t= žŸ¸ßÞÎ)˜Hã:ÕPà×J8Nj‚ðñ^•Š=\7.+0õ*‰#)âÀAr-Nh9¨¢0$ðCJå*c¥2¥J•R©BX­Å¢ß„ “vÉ=‰ã}vâÏIÜA'C3î‘Ñ&Õêë6:)Dq$ù;6­ŒßH6¯ß‚)• V¥MÔ(ù`£€ ô™;ç¿2€ÏšgŸbíæÉ·Oc¬R¢T*'3¿ªÑí@4¢„lÌ"K)élëÆQÃ#[h)YxøiÛ”üÔùÄÛŽƒ[Õ%ÝâVëñmÖÛjÝ(0è¸æÝhz;¦0{Á¶lÄ q¼t\ç/dr¯HŒRñ뉖±±^DA8¡ü B ±?E©4B­V¡\.R.•eppˆþÁ!‡¥82† j8Bã PÐ!è0>îú¬>õ™}“”8$ï‹ÉŸŸÆ½Ö“Ú&6&õòˆH'åñ>„H%q’6šb;-ëç])×õp½©Tšt&K>ßL:±A‹Å,‹Åò7óÅ,%—\r _þò—QJ¡µfùòå,X°€r¹lÈ©§žÊ·.8‡gGúÙ8¸‘ÅŸý4ÝÝÝå}û»tµ÷ÒÚÜ…ëxÏó¿¢MÄšk IeöÃ*­-í„OÕ¯Mš™Œ¢m4{î·?År ªUì9ÊÊGyêÏ7qäá{ƒrî/7f=¥P‰£¹H²&g¸nŠŽÖnšòÍä3y¼ãVš Y¤ãÄýÜCŸyóv¾Õå•WþŒ]ÍÚu[ÐÅ”*&3ËÕ17ôÓ1¥7nEE´„eöÝÿ/ëëâÁû~ÏÆ BsÛÆÊ#a˜ˆÆ8 c\ &™Ê‰oB"•KS¡…À¯2<¸‘ÖJ™<©S§>ç>·ˆµ¬7º3f«À@’E ‘‹gÝx^Gq)@K¾…l:‹jí¡\.’Ng‘¢>‹/&E#Ää~DˆØå?"1î3Tª‚0" #Â6l|Šj¥L¥R¦XctdŒþÁ!ú¶ Ðß7@qd ¡C¤‰Û†OúD:v÷¢°1Ó?qßzbÐC×ÛIväõP/ˆ¢(ÎŒ˜ø…JLÕ¸ÇLšõ÷¼4©L)aè…!B”ãLº,‹ X,‹åÿˆl6ËÝwßÍûÞ÷>”RAÀµ×^ËþûïoLJ?üaúûûùÁ~Ài§FPÀpÆ»Îh¬³aý~|ù•t¶O%›Éo·æw¢L©‹§rµLqB€ÖAÀô®©Tj•†û~´•[ïÌ9¬Y×ln¢»³…J¹È½Ko穇c0ÕD«ªá´u7fña\ô7R”“²€º Ëg›èlïaóëÈ:>¸)a&)ûfBpLOpù§Q°­A¢™0ëovTÁÔ “±‰âò­ ˜(>mrüó4qÜ…H%1:¢Z­P­Vðý*µZ•(2`Åb±‹Åb±ü1sæL–/_Î!‡Ä&nÿõ_ÿÅ)§œbçœ|>ÏÒ¥Kùæ7¿I{{;ßüæ7Ù²e ý}\|ñE ­5Ÿýìçél凉УÜçøm0:dc߯dö´‰Ø8¼ž–B+ÕZ¥±í‰D:¢¥«‹—¯$MñÈã« #Múüá—²ïÂy„ÂesÍkˆ‰fdõÙ[ѨMO:Ô³ÚºXÿäƒà)”—Âó2„:âàƒOÚéqûÎw¿Çs¦â Cމ߯#A(Ï¥xTjå†9[—ÔôNßãe}­”Š#<½ò„ù" X+ƒrA&³ýu…)Õø bH)ñR:Z»ñ—áÑ~ò£cúªw5LH_ƒ£ƒãBMR^ TjÕ uÿ‰Mš1H!Ie ŒŽ”˜:¥G]Mͯ`"ÃÀ`?ÿòÜ3ñG0Ù¸ ²Ñù\ÖÓÿ“Àz .`0oÿÃééé ©»ü”^LÊeêÔ½wzì~óëëØ{nA*ƒG€+ãŽmÚÍ5*dˆ¢Xä%Ž?þôívLx9ñÌ“²qðqd~ cå"A=xSŸ!wS”¦/ˆO®ëR(4áy)††7Ñ\ö9ìØÓinn~á²+¿€í{ˆIâ_'+MïìDÆÐ:mƒƒ8N Y/i2ö7aþB6´u|Í&ÇA(߯%õõà9Nãú–B†a2ãEQX‹ï£ Õa’úÑ.21èÓFéäÖfè­ÆÄ°=×þíéq­Ç3 Lb6hê†Éçµþ^dzd,öƒ€0 ÆpˆF¶…Åb±‹Åb±ìFv$ä…\|ñÅ\ýõd³YŒ1,[¶Œ½öÚ‹›nºÉÜ?0¯ýëéëëãK_úRc†à´ÓNkxA\rÉ%¤Ói¢(âK_øOÚ ¤Ñ¤v`h'·QgšM›zDM¥Vff÷4ÊÕ"AL0.Ÿ¥2ZáàÓ§vbž^Fk¡ƒzíòïo¾’®ŽòÓzØ÷‡4jµåÄôÿú,.4Œê´1”+E<îR…6š›³LŸÖÉ^{ÎbμiD¦²Óc¨uÄõ¿þºgôP5.žÐFP32F•/“ÅjñAHEK*Å~þ²¿~î¿ûz*^€p[%’Ô'6}tÜXôKÑ84fÍB84ZÈg›)Ž ÐÀQ‹þ ÏóvÉñM»uA<%0Æ0cÊtÀÍåØÐ?F¥ZÁMg³û”„ c»ñ “ W»Œ óŒD:ÍRH”Ê`"Md4Q›†AˆN~øa@†QH¨C´¯µ¯4mhŽ—L|—[×ý?ßMÈ*˜P6Pÿ; ÃFF@ÃøÏQH%“ÏÒd¡/d\‹¢ÈÎþ[,6`±X,–ÝÅm·ÝÆg?ûYÎ9çœIÎËóæÍcõêÕœyæ™™Ý+¯¼’ƒ>˜ááa;pÿ vØa<ôÐCüæ7¿¡££cÒ5³dÉ®»î: .9æ˜câÌ¥äÞ{ïeÙ#OÒÑ»7i/KXÂَȘTÿè(bãÀÆxfPƒŽB¶Œm¢½¹Ñâ$ffzB@0ÌØcoFF+`4Ù\ŠuW‘N§Y0ÿ@¤RaÈÍ—_ÈœY=4µ4á>a4²ê-ÐÆÍCµZfÖ~ ¹vü $›Iã: El^³Ž~ûý4ž?ûÙO9`ß©”#‰„0T"ç¥aH¶­›j­œ´oüó¿|äei­¹ëW"ºº(År9®W TRÿO½^ž â¿Þ"¾ÏZPnšá‘~dEqÜëþíEwKØž/ÀdS¼ñYñŽÖv2^£ {+ž]£<\×C¨qÑ_ÏZˆÅ¸HÄïÄ-%Y‰i@úB?¬Ææƒ‰!‘FM¤#‚0$Š’Ôù(BGqvZ#0IóÁ8õÀÔÍ Íøçe›€Gãýšç ˆl?`²m&E½Í`â' â@šqËÍz Ή¾cÅ¿Åb‹ÅbÙì¹çž!ø¯ÿú/¾üå/³ï¾ûòñœ§žzŠÞÞ^¤”¬]»–ÓN;3Î8ÃØ?07ÝtwÞy' .Ün›®O}êS„aÀå—_ÞhY­VùÄ'>Á–+h™5‹°Ð;—†pÐÛüÃ/ê‚K†G&ÊŒ¸VXk\×¥\)×þ›ñÔec ½³ç³zí†ÇX³~O¬\ŽÁ°÷¼…¤<µV‘˸ %©l&NNê¨ëîéaÄuÕFS©”q››™wÐ —H¥ÜFJøÀ–>nüÕwBÿi±Xdùý7“în§j$i‹]™.s *Û–¤„G ]J9ðw`V*ŽòÐ=W![§R®Öðýj²$þ«Amsu F+´à¥rèÚ®iæÄ7þë‹>¦íß™IÂ8^¶Gï\qÖ‰×ÜÃèÐ(^º›Œÿ'|„œ<9že’Äï/}Œ‰ˆŒ@(ÅðÈ ΠAGɺqm¤C‚0Hjçã €ºw@ýmè(Ψ§ý›$0yÖ^Or<ŸøßºsÂGr+3ÁøXꑌƒR*ù.1q¹KÙú‹Å,‹Å²;¹öÚk"êì³Ï桇â‚ .ÀC¥Ráç?ÿ93fÌàšk®±ƒõʉ'žH?'žx"Žãlwßüæ7<òÈ#@\ûÔQG5–ÝqÇÜwß}”JEºû—ä¦÷PöÚ‘R +Ó‚:w±€Y×·nB浦R+ÑÕÚA¥Z&ŒÂ­dɸ™YKǶl†tšõhnja”7?x ~PcYû0cÊl¦ô´QìϦ“L‚ä?L,T P«U)G¯zóÉ<þô:)H§<´1‹%®¿ê;Œ‡^Ôø^öòpÁL*¹æÆ»ÖÚ+P jqI€‰Œ`x¨oR;¹—3k׬`Ó¦eï¢R­†çB&"_#‚?Dà£ð$2q&@&S@¡‰Š8™™yìI/ñÈvì~ßÖÔBk¾ L™ÖËÓ«7€¤RqK;êm “™þ¸›DÜ @ȸþ_¨xæ_J Î @€ïû×û %Yó쉫~Ò‘ Š»ÔŲ6šPGD&J„½n|êÏ:$JŒ$M’Jc¶rÿ¯§îï̘¼m^44:)ÄyÈF þümÅ¿Åb‹ÅbÙ­|èC¢¿¿Òs¾ïóè£ò†7¼ÓN;ÍÒ?(ýèGY¿~=7ÜpíííÛü ŸÈ9çœÏR×þ×gÿ}ßçÜsÏm¬÷äS±ìöÿ¥eî †Ý¤“ÂTGqÐIR÷¸Ö¨Õ*T—c ŠBú‹}Ìì™N©Rjˆ˜ñYÏñ™ÌlS+•J'—aõ3ëÙ߃q¸ëÀ­ËÿÄæ¾õÌš1c Œ"²­í±¼I\Íǃ†0ô)ðŠ×¿'Vn&“òH§½XdiÍ-W_ƺ+^ô8W*7ÜGk[²pãcP. ˆŒCKGAàƒŽ@ú6¯agj´_.<¸ô6Fj“ŠÕ"~&B¿ªß‚Dôk¾† „HòùVDèSÙ¼‰ÖžƒvÊ+á¹ P·ï†?{ÊL"»èüªW³a}®—FHU—µ”„@ ‘˜ð%n2În2¹âåx ÊÀ¯a´N‚)FF6Æ©ñ:6·Œëýcó¼( ‰Âz0@Ç7ý оQÅÁ­(j´¬·0&ÎØQíÿ‹Óâæ9:ɰ‰³lÂ0ˆ[n•-`±XlÀb±X,»‘×¼æ5Ôj5‚ à±ÇãÓŸþ4 .äÖ[oµƒóȧ?ýiV®\É…^ÈÔ©S'¥ûoí¸pûí·óÄO0kÖ,Ž<òÈÆ²;{ï½w²à{ð½ï×ÌÜwƒ¢ ‘ÊBXE6$_,H6n^;ITQ€ÁMe¨&îÿ‘ŽâÔæz³ŽSò…ô¨ ‘N§H­A:²aððð†ÇÙãÄ7S­ú±ó~=í?Ɇ©×.¡Ïhq„ÆhE¢„ ««¥Q¨ùÓ ¿â¡Çî|ÉcþµóÏçà}»Éu·ƒë†ªq¨V}º¦Ï¤æW1QJÑ¿eÃßPºóÖ«pš\FBÅHq”02ɬ"ø‘Fhˆ€@'¶|: ˜ØD°¥¥ WûT·laÖž¯fÚôYÏ#H_X½{S®@{SFÇ­&7ETÊe\7…!P"¾w„Ä‘2÷I›I1>ó?n/)“²ˆ‚*¨¸^)ÕÈó0Äå)ALò«0hŒIÚêø3Dqi€†øI‰@”¸òw2Т­åþvÆar`à¥\v㦱aÀí¬¿Åb±‹ÅbùkóÐCqØa‡qôÑG³ß~ûqÑEÙAù£¥¥… /¼Çœ¯|å+Ìž={»uþZkV­ZÕ˜íøä'?Ù(#¹ð ÉfãÕj•÷¿ÿýÛÝßí·ßÄãËndCöa0Ê€“†0@„e@øUú†ûúCëˆru %åj™ ô“}Nî1.d²ytò|&“BFe´‰xçIïÄs½F`ê”6‚(¢„ ¬[ÓÈ$ÐIuú”ÊEÚçîÁ @9Ši½¤\Ç‘€¿æÇ(w<ÐÉŠõÒ­ã–˜±ø="5ZñnxRÄ^±'@¨u²^”ÆÙ êf¶ñ>ضîgÅ¿yÞ À¤@€õ·X,6`±X,ÿ7<üðÃüå/±ñÆÛÞö6î¼óNV¬XÁÇ>ö1öÚk/\×Ýf½ X¶l§Ÿ~:O=õTÃi½¯¯¥K—ÆBG)N<ñÄÆkî¹çž~úéîû¦¯fåÃdÏC0hRq@kLµÈÆM«1è†ðˆtÈ`iˆéݽTk•F±IÂ%¹›:{o‡ÆÈ5föuEÿ²èm¤½¸5á¦-C~ÈšåR­”'”‚À§TCäó,zã.2ovùlÜfîáûâ7×îÚ@Ùc.'çÉr¸…\ìˆo4Ey ­#¥èßôwy-ö÷má‰e×Ñ3cÕcÕj,ê5èDèGFlG²‹¸s€DFâ…›Î!0Œ}Ž:î”­^av \· Lt¶Ï¥³t6·5êÙçtý¤ÓÙØðOÄÞBʸ¥P %ˆ¸¥ŸLTñÿÆ[ʤ\ +ãb\@T㺣1:$ÔA,êMÔ𨨛_êäfL&i£gH²b¤< J‚ƒ÷ 0<§ðßUâë@€Åb±Ø€Åb±X,:è nºé&ùŸÿù^ùÊWÒÖÖ¶M=´ÖšJ¥ÂŸþô'^ÿú×sðÁsçwrôÑG7ÖùÔ§>Õ˜ý¿à‚ Èd2@\ûÿ©O}êyåꫯ`ÃÓw³à°}”YŒ—GkÆ-kãYÊD}DQˆ«]-TýÚ¸¸1Ñ„iMûÔYôŒRÕ06VNI¹@È[ -|ó3§iÍÆ§O„WlP†!åJ“Ésà«OâÑ'×1oVÙL <óÔJ~ñÓ¯ÆÆ|»˜ÿþñ8pál\Ï\<–CÃctMŸAø(G1:2øw{mÞwïݘʓ4M›Êðèp<ËmêéòÄŽú›HÚ pH§ã1s¤—!_h‘ožÎ ‹^÷"h\¨Îì™Þ¸Îì¿GŸÞHµæ“ÊäQŽŒ»: Œ‰ûÝK”©œ¸% ˆKH”Ȥ% _¨ÕÊY¿–%ÕÒ0Q6êýu”¤ËkÓH›oÀê®þÐL, ¨· ŒËêYf›îãâ|÷‰‹Åby.;‹Åb±¼4?üpN?ýt8à¦M›FooïÝü!n9644Äu×]Çg>ó¶lÙÒXö‘|¤‘âðÛßþ¶ñx¢aäÃ?ÜÈ x>~ò“ïòþäÙsá¾Ûß}÷ñŽw¼ƒÎÎNÞûÞ÷Nÿo}ë[ñ‹_08ÏF/^¼˜¶¶6¤”AÀùçŸÿ‚Ž÷âœG±ïiz÷šÅêM›H”tF|ÅÊ(ùLŽR¥@̾׃É(BRé&ÌH,’eu Έ"¤OºNfú››[x掛'A Ǽñd¤—bÞœ)´´äð«Uú¶ôsþç?Ʀ¾µ»õܽñõÇqø!s|$”J„ª 7å¡”Â÷k÷×ï÷/ú ‡4—0åR®–c‘ïºà¸ñ¬¿ç‚«©ÂqÊA*™Ì¸K”£P®ÂK§È¤›xvõzÎýü—^äÑft÷6fÝÛ:ÚY¹©Äèè¹|ŽRÔ“g$Lj (Ki”(Uï˜(ûBbÐxÙ[V&: cñ¯“4&(z&×ÔÓHí7òch˜îhæò6_¨áŸÿ‹Å,‹Åbù?aÁ‚\tÑE¼÷½ïeŸ}öÁqœí¶;ÓI˰իWóµ¯}iÓ¦qøá‡sÕUWmw»G}4S§Nmüýo|£ñø}ï{_Ã4ðé§Ÿæšk®yÁÇý‹¾È†g–"²P± m4í{3{¦†a2{jÎê±öÙQåy¤•Ç¡VKÜý“ôibÕB:j<öƒåJ‘S>ðAÂPÓRÈÑ;¥”ç0<0È~þ\Önxf—ž+%ÕvŸÿéߥ½µ€(pZš¨Ô|¦Îƒ”‚à P©Tøï+¾ÎþûíI1,Ïò{.Âsc×|¥P®D)‰r$R ”#q]…T±¿R-íD¤ØÒòŽw¼ãK&•¦§­Dì?ð¶3ßÅ“O®Âq3(×Ã@x¨_b< Eœ  ”ŒMÿˆïIü’Zj•Z\  'O|+ê-þâö”ãâ¢ð6ÄV‰õÙ|Ó01ŒËL£«Åxz¿¦>ó?.ô·õ=°X,°X,‹åoœG}”ŸÿüçôõõQ, ‚ 1‹oA°råJ¾ýíoÓÔÔĬY³8çœs³ù;âŸøÄ$ƒÀ|€½÷Þ›Y³f5‚ /tö"×ýê‡xJSB:±p7šyÓ÷`ZÏ šòÍ @]E:Ehꘊ_ H Ù,U¿Úth£ÇƒFO*#ÀJ­Bû´^T*ËX©Êžó¦!O>³–/}é뤌dïy‡!w Ú_3{¦sÄ>óî7¿›)S¶YþÇ›EŒ‚8Ž"Ò†Î3ɤS“:0ü=³~ýznþÝÅôLéa¤8ˆvR)¤£RâzN|ï(””8J%B[áH…›òH§]r™4½Óf0\ôùçSΠ§§çǬž “RŠþ²ËàÀù|¢^Ó/JʆèW2HÉd¹IJÅÁ¥$R%A!©ù¥ø鯋x?jÜïÜ,ûD¯'& ^ŠÓÿÖû²X,–]‡õ°X,‹åEpÎ9çpÎ9ç0sæL^ÿú׳páBÂ0äÞ{ï媫®¢V{á³ÈÇsLãñ'?ùI‚ Nÿ袋³ÿ£££üô§?}ÑÇE>zó÷z%Õ²‡4%¦vt£¤¢T)ÒÖÜA±´WüjæÍZÈí÷ýšáÑ׎of÷4:›Û³²o8æ <ùì“Üþàí CE€[oú9ý„DaDª¥Õ7öå þÄã2îRéJ£4·v!H7ùõ©"Y¯Á7õÔ{ç:8Ž$•òȤ]”J³~ãûøbúc;µÿB6O{sÆh„œ|ú¿r×}bâ)~$I;¿dýú,~Ý‘ n¶§Äù'‘Ôæ R‘ V.ÑŽëQÙ¼ÍÌüó±$ŸÆëŸû’y±âßb±XlÀb±X,–¿)V¯^Í÷¿ÿý—¼7¿ùÍ4777þ¾ì²ËBô•¯|%Zk¤”\yå•/y_Aèóô“÷0{îa8‘njޙ‰ù_<{ï¹MùfFŠ#±j‘’Ž)³¨”Jd4KŸM:1\†(Š.ŽÐ?ÜÏhiŒPG¸ŽCK¾™B6Ï¹ßø><±ŽýÌ"“v-ñÙ³?,`„béó( ÷ÓoæuÇý˽'ž¾ï½·®Ö:šÛÐZóùo_Ê•×Þ…Þø({ÎÚ“½gïÍ}ÞÇã«GIÉ1¯|{°[úG¨ÕÂ0B¥8ñõ›ß]Å'>ü9Y3BµR$[hÆuœFª½(•˜Ê¸µ^*åɤÈfR¤Sž§Üžó÷åø^ÖÜü¼ûžÝ3#®©Gฒ Ë`ÿmí]H)Ʊø!dãì& eRC„i(u h)1Q„T“ð€ÄMåyæ±[^ð8MðB°S¢ÿ… ‹Åbٽ؋Åb±¼(N8á„FÍ뮸-^¼øz—&›NQ(dÈfRäššéæCùžç=ç>;[ÚiÊ’Râ“߯ãO¬ ›Ë£¥hƒ‰ù`bî'…€ä𔉠rTì &Ú ‚Ð/cŒA ! ©TŽkž|ÃD€‰o{{±âߦý[,°X,‹åïžC=´ñøâ‹/n<>å”Sÿð‡?Ðßß¿ËöF>ÅÑõ¬ß´߯F!•j9Iå×(©(dó8Êi¸Ÿ{©ÔÆð#Ø2¼>郋1­#j~­áPG¹ë7 €ÑLéi¥T¬²äæ?³þ‰Ç0Z“ÏæééšNèd)—jº/“§:º™YMYÞ´èÝÌ™uÀó¾Ÿ}fî‰To9ëS´··F>Q!„b(Ý @ͯFóö?Œæ–fòù 3§w²Çì)è ÊÒ»nú‡½qå%¼bÿ9„A™ VÂQÇQ(¥pdlúçz.žçây™lŠ|.C6›"íy¤R­­mH•¢\¼ç=ïßá¾”TÌêžÞ¸®¥ÓMh­Éä›âú}2ö±Ì} .-::ŒêÝùâ†IV€ÁP©–À$ ¥‹ë¦¶+êŸÿ¶“ÞX£?‹Åb‹Åb±XvÀ»Þõ. …wÝu×$‘Øa‡±kûûßÿþ]ºßL*‹TûÖQ­UŠ…|"v´Ö` í¥q”;²›Xè‡L"ü1I-¶ÞÁžÅb…™Ó;*òÈc+¸áê_ ƒ* æ,7ƒoÆ–Œ‰º0!$²ÔÇq½š£^ñ62éÂv÷à9.]3öå O#›oæÙU+xË›NdãÚÇâ<©·…š_‡½úµø~D©T¥ZñéîjfÙÝKØø{>ºâ1n¿ñZöß{c#„:7Tq­¿ç)²™™´GS>C>—¢¹)K!Ÿ&rÈçÒ´´43Z¬²ðÀ£èìêÞuNÅs½ÆõsÜ?¿µk×ã:)”TIk¿x_ÕSüq?^ p•DƒPjÂÛ¤vÁ€’Z¥Œ#®ëQ*ìò±{é¢ßÎü[,°X,Ëß0K–,i´‰ÛÞmÑ¢E“Ö¿ôÒKŸsý—âlÿrçŒ3Îh¤ÿŸ{–õööbŒáþûïgÆ »t¿Ãýäsy¤T ÷3<6LEhéØÕ?¾\Ç¥«wü žÝ×F‹ÿ¤  1ýº‘Öt´7a ¹ì[ßD%@pØ‚Cé53.àê>}‘†Q· §y ~q„¹MÞüšw3cú¾Û죻wor½ (–Ƹmɯ9ó_ßÌÚµ«¹û¶ŸQ*ÆÝJ^ ¾[ืœN[[µ Œ4A¤äŠ+¾³MöÂ?7üùF¶<±Œ9³¦0:´…Я!(W!¥Às\Òi—¦B†L&E&{¸ž"—Má:ŠL&M¡gpÌçuo:m›}¤½4½= ¹›Éf(éAàeòˆ$Ý?vøOfü¥DNô H–G:v߯ê3ÿu+cBjÕ ÒÄO¦rM¬~¾»OôOÿ‹Åb‹Åb±üC°ÿþû7ß}÷ÝÇÇ<ŽãP.—ùÊW¾²Ë÷kŒ¡9ß‚‚ « B Ôþº¡1†¶îYÔ|\´$ÝÂkZ¦^¿mŒáÒï^Šòcƒ9½³‘^"z9TŒ$Õl7n¾™”_ä5‡ÄQ¯|;ù\kc×ñ¸ëÖÿæ§—|†«¯œlÊøû_}-)Säf,àï|3=Ý­8JR.׈¢ˆO|äL{!&\qÍq‡×3wÎtJ¥!”#ñ\E:·ýknΑÏgio-PȧI¥\2)¥R)בHéJg˜;ÿæÎŸ°™×;;6ø‹³ú9è¨ãØÜ7€ãeã~I0LˆXè+GÅF”I)€R26ô“à(™´•¬#ÆKJű8@% F rMm<ûÌ_&‰÷çñÛ[wפ÷ÛY‹Åò×Çv°X,‹eÒÝÝÍGÁüùóÉçó¤Óiúûûyà¸ë®»(—Ë“ÖË[ÞBSS×þW«ÕƲE‹áº.O<ñ·ÜrËn9^ÏK!¥"ŒB0†b¥HÚK£¤ŠåIÒ:MM¾µ‡(Ô‰àŠLÜC=Vrq`[A#¤<‡ëoº“ò†'PÒ¡¥ÐBWÇTP.á„ùˆ ]ú&mÉ#‘‡›íÄ ŠìÕÞÊÌEïaé£wðôŠûX¹bés¾ÏǼ™}z-éT†B!ÇàH%)‡ÿýÙå¬Y½Â^¼ ApñÏ.á?>úÈi]ômÞDçÔédÒ.©”G:åÐ\Èà8’l&…£R ¢0"Œ4Qg‚(éR©úœøú·óý§>À”önZòM}µ¶µ# ½£›ÈÚQIÇFv”#‰"Ý4I%1‘‰Å~b"ˆPDQì`()©VŠÉ$q\¿TzN¡ÿ×ÁŠ~‹Åb‹Åb±¼lù§ú'Z[[Y¶l«W¯æw¿û]cf<›Í2kÖ,ÞúÖ·òµ¯}+VðóŸÿœ_þò—¼ûÝïŽÝÎK.¹dÒv÷Ûo?‚ à'?ùÉn9n!DcFß4ýA¥V!å¦PJÅï#nÿN6ßJ±Aª‘hlC%!D\-'' }£¬\v+®ã!”`þ̽âºa²ã( )WJTk%¢(D· óÜ ÙT61o“”ìX–?p7³§ÌŒ[ù%¥=y57÷á¤2H§õ {c hPNÜúO&³ûÚhСD‚0Ô8R¢ym’ã)—K`"@£”Ǧ Oþ¬ÿ‹Å,‹ÅbyÙ±ï¾ûòñœßüæ7ÜxãÔjµí ©b‘åË—³|ùr¾øÅ/rðÁ³çž{rä‘GrçwNrÿâ‰'&½¶§§‡þþ~¾÷½ïí)b ·Ü{ -íI-¿AGBJjA G;q€d]ÇË@q„¡Ðt)âÔkqfŒ!ÝÔºM+\·k“Š…ó@º4mâma‘ÑA6÷­fpx#APEƒR.ù\+m½tuLÃÍBP5^¦ü"3³ŠžWŸÁ#ÏÜÏ£ÝFúÛ}¿7ßðmzÅÉüïÏGyfų<´ì.Ö<û”½˜wÀ¦Í\øí øâç¿Äºt:¬’Ï·â9…\×UIÏ8ß@Jˆ"Mj4à¥R Žrâë߆ÂuœDàKZ§Ì¢lò3J*•E5ûì]²+®¸‚uëÖñŽw¼ƒ ^òöÎ<óÌFúÿ7¿ùÍĨ.æàƒ&NsÍ5×ìôöZ[[yßûÞÇyç·SëÏ™3§±î¿üE–-[Æå?¼Œ+.¿W)<×# CŒ2töîÏÆú>¢©€rU,ä¤DE~Îa´÷´r×m×#·ê C?NßV{L›×¨û÷ƒ€áâ›·<Ëæþ5|ù?ÏåÌ3ß5éµÿþïç·¿þ#ݳèjŸ†”’§WÁ}ñ+\øÝo ÓÍdÓ’®ö&‚("Š4#£ ¢Dø~üœFH!Bɤ©U‹ôÌ[ÀÚ'DëˆöÙ ÁK!«%Ò™lœòO<£{ÔA ž0g¥¤ ÒQ<ÙÀ À„ É-¥@kC©8B±ü6#ƒýeño±X,{Ø ‹Åb±¼ìY¼xñgHÏ?ÿ|†††^Òö?üáóÌ3ÏðŸÿùŸ|îsŸÛ%âओNj<~øá‡'-[°`ýýý\yå•;µ­óÎ;ÁÁÁÿÛã ƒâ{?ø>>ñ8¯<æh*~@‡DZÓÜ5-6IsÝF*¶—jŠKš:X°ÿ¾lÙ¯$Ÿoeh¸Ÿµ×ðÐÓË ¥Cú8a…žÖé´·MãCaéÒ¥\rÉ%;%þ·X9ï¼óX±bÅnÉøk\Ã/•{ý |ñë´e3§u¢u€ç(|?JJ8B|?ÎñƒšiLúóåò´0L™ ^¦@ǬD~•T*K½ŒD9 ŒiHg)&‹i•<騱NÝx²Þ @ Ñ߯P-1&Bp#ýkv£Øßúf±X,6`±X,Ë.gâŒ÷ÕW_Í¢E‹â‡r—^zéKÚþ5×\Ãÿûÿ… ²bÅ®sŠ—R2mÚ4~ö³ŸMrÿèííeÕªUÏ»9sæ°téR/^¼Í²«¯¾š³Ï>›C9dÜU}ÂíCáì³ÏÞfŒæÌ™ÃM¿ÿ=ÿú®wQ "‘Î5c¢8CA—3d»’ÎOaï£^˺ (GÒÕÑ\×sÕ?R*2ŽK(cƒ¬Ùð4+V?Ì[ßv¼õffÏžÝXûsŸûÿö®€iaZï>47OA¹YŠž©{2wÎìµçá(ÇcΜ…(7ÍÆ¾µ”*eB- D_kFÆ6sâ‰Çò—¿ü…ƒ>xÒ-Y²ä9Çæì³ÏÞfÖ}Μ9ÜrË-Ûë¿åkxWñë?ý–óþ㫌 …«×nfd´DÍ©T}jµR©Jijÿq ¿ÀQŠ”—Æuó8”éO!ðR¤#“™þx}1áºA€6q@¤M#»¤¾®Ž ‘6q[@!Ðq c£ÃQ@¤C"⸞xdÉqþ|BÝì@äcžÅbyYcK,‹Åò²æ”SNàì³ÏÞ&EûþûïÑÛ>}:¿ùÍoèëëcß}÷Ýe³þu>ò‘àº.]tÑ6ËçÍ›G__ßN‰ÿº@zºúóÍßÿý1:묳øÌg>Ã'>ñ‰Æö~pñá¦ß]Oè×0FƒÖÕÚ‚Ó~ ›6a´aß½fðà_žÙ¦`J{µÐ§8<À³›ž%•3\öã‹8î¸ãë,[öŸüÄ9lX?Âì ):qÜ,21ÔF œÊIµÁÁ¼=cõ³ËDCT+pâI'påÿül›€ÎâÅ‹Y¹råsŽMýZ:ÿüó½>.u±¾«Jv×5¼«1Æð»?_{¶Ãùßÿ:›û†©Æ‚ ¢Ró Â0ŒÓñëíû\Ç¡©©…âØí=Ýômé'É#”@$(ŒILÒÿ1ã™õëJ‰ÖB¤ŠKt¤ ç´aldEI7CøµÊvÄýö¼˜°LìÄú‹ÅòòÁfX,‹åeÏÕW_½Kë³:è n¿ýv2™ oxÃv¹øxÓ›ÞÔ¶Ë—/ßfyGGÏ>ûì_ßÚÚÊ-·Ü2IüßÿýYý“2~Á×.àÈÃâÚ_^Ë/¯ù%'½öµüæº_£¤$¨•‰´(jôKJà(I­ê3oΚ›r4²ÛÊ)U¿Ê†ÁM<¹z9Çx8Kï¿k’ø¿âŠóÆú†43¦íCk[/ét®1FÛˆÑ$ P7|›1s_¦öÎ'›Íƒ4L›ÑÃw¿79°òùÏ}‰O}ú«ÕA*Ûéq¹ôÒK™;w.K–,iññO󸣫™=c!-Í]¤Òy¤TÏ!½ÄvŸji‚‚‘Ò¾ñ¯N Ž|ýëðƒï_FO×,²MÝôôîɆu³nÕƒDQø¼c344Ä©§žÊÒ¥Kã~ÞyçqõÕWÿÍ]û›¾¡~~úËÿ¦Ð\à”÷œÅ½KÇI¥©ÕâYy„À÷CG‚1(]¦¤‡(ä)‹tw´Ñ?4ŠÑ¦á¡DÜJ2Ô% ÑÈ6‘"®ýW2n)ˆ3 Œ‰¯/“t0B222€Ö:>¯²ùV]ö;ûEi±X,Ø ‹Åb±¼ÌY²dÉó¦s¿î»ï>f̘Á‡?üa¶lÙ²[Žù•¯|%---À¶îÿu\×ÝÆ°Îœ9s&¹Ôœzê©»Ä(nÕº¼àPö™½s¦ÍÁs]¤”T‹C‰H30VBG!Q’ê½×Óq]Å~ûÌàŽûÇlõ~¢(âÀÃàÞûïš$þ¯ý嵜tâYõL3{ÐÕ1l¦)1t{.Ìx@J€”„&`¬<Äì9S&e¬\¹’ó¿ö5Š•QÖmZÁê•÷òÌò?Qí§¥½—L¶iûÆ…Û œuÖYÏyþ®á¿ÅJ‰ÿ¹æùóoÍ´iŒŒŒR­Öbó¿Pã¨xÖ^'ç@Hëxd³Y ù¤õŸOë’`@}Ö_$uÿõçãu4R$ÉùJ$³þ†ÈÂ(BGC}‰ÂˆP´ˆ3†v› Åb±¼¼°‹ÅbyÙv_þò—Ùk¯½Bð£ýh·óé§ŸÞhÿwß}÷mwÏ|æ3<øàƒÛ]¶uêù¥—^ºËähi”õ[Ö3wÚ\¤”ÊE†F©–Gp¤¤IiÆ"ÇJàyôΚB!—báÞ3xüñ'ØòÌãÛló=ï}Ï6îûgœñnîüóýtu̦½u ù\ 5QÞ?ÛëAP¥Tä_Þö¦m&ý}»'˜s '¼d“¾Ûþô§—ågoíæõÜðÛë9sêTÒ© ƒÃ%\/çºbƒ>בIj]è \×£V«ÐÚ’g`¨×þ ˆ¤¼Ä4ÖU2~.ÒãAmât´Ž3 P-Q­Vâ C¤ñ29JåûEi±X, 6Àb±X,/kve{´3Ï<¥×_=•Je·ó±Ç ÀSO=Åèèè ll-¦wµQÜÜN:•¡¹ÐBo×42© ÕòÊ•BòJ£Ð8ù,=Ý­tu´ÐÕ–áâ\‰EÛèó‰Ç»dÉöÙ{_îøÓ_˜5mz{æRÈ·îpÖûRBˆ î' Šjµ3gÎü«][wx±ÿš7ÐÔÜú²ûüÝûè_øÉ/§'!E„‰b“È(ÔH™ö%F¤8®ƒçy´µdP2žÙ7Z£1}’´~‘tPRbŒF ‰Â؇ÂDÁs@``p Zk„Ñ4ù¦vV?}Ÿý¢´X,°X,Ëß»jæûÔSO¥½½€ÿùŸÿÙ­Ç<}út¾ûÝᄄ׿˜^ö/„rµÄ²'–Ñ\h¥k¢»½'îÙ DAïÔW±ï>Ó¹ô’ÿeù²ßã¤ÝçÚ !„DJÙèß¾#Ñ/„yî°@}fؘXDêˆÖÖ–¿Úõ÷BÎ…”’æÖžmÞïæM›8ðÀƒ¹èÿÍ«Ž;éeõù+îç›çŸÇô¶ £cCÔj>ÆâJ”Š0“,×KQ©Tho/$çY¢&–a$µÿZk|?À=©S€ãûH´Ñ£ ˆ±Á>4:6tR¸nž¾OÙ/J‹Åb±‹Åb±XÆ9ùä“q‡(ЏóÎ;wÛ~Ž?þx²ÙØ)ÿÆo|QÛØ:ëaë6€/c ÷=rét–æ¦VZšÚ(¤3d²)@PÀëlÇõ¦Mé çÎÿÚgÙÔ¿‰ÁMÛ܉AšN8Ç[Î~ ç±nÃÓlé_K¥:·uÛù#Üî³" ( Ozþýïÿ¹|+í3èê™CWÏÜñÛ”úã9tuÎbJ×LzºfÒÕ5›®ž¹4µtá8n£&}{·¡¹u ‡ó6š[»¶ÐÈå2̘>•ÿ:ï[|õ‚ÐÞÑõ²ùì<¶ú)ªÕ ?ýÁ·˜;½“ᡪ•jâm!ÑF£”ŠÛJ”%%™LšÖæ,JŽa=Õ¿^û ¤"Ò:òB‚Á4 ã’Iqx? âýA:]`xp½ýr³X,– X‹Åb±X€yóæÅ¦cQÄÆwÛ~N?ýt¤”h­Y³æÅ“mõp 'ìòr•Z…åÏ<ž3÷$›ÉÑf4M…,ƒHÂ|ž)mM„敇Îçß?ôFÇâ:ëZPCëhÒ¶.»ì2ž]õ,ßûþ÷hmm¥µµ•_ýú¾ùoñ­o\LWÇ :;f϶!•“Hâç’ú[¡ãfñJ:x^–Õ«WOZ¦-«(•G0[eìPýO8ŽK>߯_–.gÕªUç[[[9ë}ÿÊ–Ï0Ø¿–Ze mÌó-¢¹™þt+ý¥2áæ'XÿÄRw$}}}üÇgÎ¥½½c‡¯ïîœÁëŽ;“ÎÎÙ4µt1gÏ#˜5o?º»[©ëƒ-]ÍdÒ-Í9©ˆŒ!›v™3{6^ø=.½â*öÜ{ß¿©ÏŒçz4çšÁ€DQõkH)ùý 7 <Ë^{Ì¡V«Q«V#À Š#M¤u\²!Z:Û›¶Iû¨wÐQœú¯C;þa›ü…ADê‹ËÐaȺY¹æûÅf±X,6`±X,˶ÜrË-cPJqæ™gî–}uÔQär9–.]ú’¶uöÙgOú{Μ9ÜrË-/Ù•¾µµ•[n¹…«®ºŠƒ:ˆû¿Ÿ‘Ò(B FÙcÎT‚ âÐçñÛk®bõšUÏ»Í( qª#L™µ7Sö9†_ýâzN~Ó[X¹rüµ?ùÉåœáçXµæÖmx’ÑÑ>¢(H\ÞÍŽýê ´AI6ÛL[Û4>þñÉãó‰O|”ð4Ö¬z€ kc¸-åÒ(APkË ߢ(¢V+Q`x`-›†×°|ýÓœúö×ñã]Jkk ÿù•/sË-·ÐÙ3×ËLÚ×{ÉkþrÙf\7MË”9ýªCé{f Þ}ë6oaóÆÍüð;Ó”W´4ç˜=£“ö–Bld§©”ï8œÿþß_óÙ/~®®žÿóÏ‹ë¸t4µÅÎüR ”k5åà8.]ø-ö™•§··›R¹ŒI6ºqÚÇA)EG[n=³BŒ›ý­AÆŽÿÆÄ×hœz‰Áà5Jc£Eà¸)R¹fýËoí›Åb±Ø€Åb±X,ÛrÅWP.—8è ƒx÷»ß½Ë÷qÚi§5Lã6lØð’¶uÿý÷sÖYgmXºt)çwÞ‹2\¼x1ƒƒƒœp œrÊ),]º”7¾é¬Ù{¬[ù,S{ÚÈ{pÞ׿¼SÛÕZ³zãJÂÍÓ’o¡{ï#Y½b€×-z×þòÚÆz'ŸüÏÜuÏÚ:Ö¬œÁÁõT«¥çÈ”0Û”¤¼,3xìñõ|þó“ïcû?¾ü[´ä|V>}/kV.cÓºÇØ²q}›W²eÓJú6­dËÆ§X÷ì#<ûÌ_xæñ;)dÊüè‡ò¥/}®±­•+Wñž÷þ?fÎ=“þù£ìsÀ" ùvN<úm¼Ï‘8Ž‹ãfiŸ7‡{×á|æûsÏ’ë-ë&ý“’ ðw¼—wŸz:åŠOg{3{ÍíÅsŽë „¤Ksòɧð‹kÏ™ïý0Ù\þÿæÇ£”´ZÐI->„”´vÍ¡)””~Àç>y6'µ7M…c£#T«~ÜPȤK€FIAÊóˆ´¦»³G© I½b(„À0îü_¿Ɔ†ÃZ|,Æà¨4C[VøûÅf±X,6`±X,˶lذ›o¾Ïóøú׿ÎÉ'Ÿ¼K÷qÄG ¥äž{î¡Z­¾äí]zé¥,Z´h›®u!ÕUW±xñâf|ðÁ,^¼˜«®º c çwÞ¤ågŸ}6W_}5+Ö¯ “Ê1´¹ö¶<Ǽb®¸ô»Ô^€9]ͯqçÃw0ð̤ýSASëœó±Ïð±|¬±ÞìÙ³ùãm7s꿜ijkfæ§)–‰ôsø%ÔƒÚ ¥"Ÿï`Ê”ùüïÏoÜ&pÜq¯æÖ?ÞÈ?¼€·¼áHrî(O>òGžxh O<¼„Ç^Â“ÜÆÑGÌå­o:–?ßúknûãMwÜ«ÛX¶ìN9õtŠKKª åæ9àГxÃÛÿƒ\Û<4¤cïÙ<|ã÷xß›Ñ\h¡µ¹×ñ¶9| ›ÉÑÙÖEXyçI'ó†c^Ãw¾þmz:›™>µ\6…Æ­ôZš›xÿ?ÊÏy3o~Ë;ñ¼Ô_t5w‚D<ó/ì±×þ™AhIÊK#„`Ó¦Í\øå/óª#÷)(‡‘RtÄuRI„xžC[[åH¤!BÄËm aÒ  žûhŠÅA´Ž;H×%×ÖÁ³ÏÜg¿Ô,‹e;Ø.‹Åb±$œzꩬY³†ÞÞ^Z[[ùñÌ!‡ÂüÇì’íÏž=€ë¯¿~—ó’%K8äC8ï¼ó8å”S&-;å”S¶yngX¹r%guVÃg X.²¾ÝÃSɤ=dXâªkþûo7 Cîzänæ÷1ÞÁtÍZ@6ßέ7þ™ã=¯óktÐA|ñKŸãØWŧ>u.ëÖÑÓ=—|®夶j½gb5™Ü8Ê¡¹¹ üü¿çᇗóoœ×€ã;Žã;+~ô>÷Å èî݃)3ç’!M¾\¤T®’no!;µ“¢ö±òWß§£¹ƒöÖ.Œ€_ßö†û¶Ù¦RŠ”—&•Êà*‡\&O…ÜyËíÜòÛÙká>|ü3‹ÙgiŒŒ•.Q*×èêèàŸ:—SÞþ.~rÙ÷Yró¯_´¯ÄÎ „ «¥½ŒQF€ìµÏBjd +É­ú¤D:äÞ;ïæ€ƒoâ€ýãÁGž¤X¡¥¥ćªãŽBJIG[›6¡¤ Œ³?’ qí¿q‚‰ •âaPÃ`Ð&ÄõrH ›×=a¿Ð,‹e;Ø ‹Åb±X´Ö¼ùÍo¦¯¯­5…BOúÓüå/ᨣŽzIÛ>öØcõÿwÝu×.=î•+Wrê©§²hÑ".½ôÒ½zYÁܹs·1üó²?Ö¤”\vÉE/éxŸZû ÷<°„hÓÃZ[è˜}åÁ?Ÿt2?ºâÇõŽ;î8–,¹žCÛ“5k—Ó7°šZ­´‰Þöp”GsS7Ó¦ïÊUÃuôëøÜç¿4Éð…pù?fÑkÞÈù^Áì=eê´½ijé$ÛÞJµ©´¡ºe€j¹†ç¸dzºèÜûx:;¦pÃÝ7óãßüh»â …èl­-xn ¥\R^†æB m=l\¹¾ãÝœöæwpïw2µ«•¶–Ùl Ïsèîîáß?ñY.¸è¿9ôˆWí¶ÏGgs;~%õüÁì9{RÕi††AH’j5D‰’ ?ð¹ø;? »Ò;µal¬„ë*¤¤1Ëo’=Ý­xž›l^"„¤žâiq€# †âØ ‘!y½KSS'›Ö=n¿Ì,‹Å,‹Åby~–.]ʉ'žÈúõëÑ:ž<è ƒ¸é¦›X²dÉ‹šQoooçœsÎA)ÀòåËw˱/Y²„³Î: !gŸ}6gŸ}ö6B~ëÀA}½¶¶69䪵 Zz£Ã#\ãu/ùXû‡øÓÒ?2²ê^²ªJë܃è}(~ùBþíŒ3e ­­­üø'—qîg?J¡ ñý2Û6œð·6çÇ¥©ÐIïÔ½™3÷P®ýÕísì9îø8pÁ…ߨáñ-[öŸýÜùü¾B÷Ô=øÚ7~ÄXP`öüCéè™M¶Ð‚mÀuéÎVTk zlŒò¦>jÕ©B3厽˜=û8ÊEJ…ØŽa¥\äÑ'îf¬i -]3ÈfóH§Á»ŽG.[ ½µ ~xÁ8ãŸßɯ~þKš Y:Ú ¤ÁqöñƒË®â°#ŽÚ¥×VgsAFa#Ë gÊ ªdAJg0Ê#¥œ¤<@àº_ãìÿ$¯:b>Ù\ž V¦R­¡”LZ ÊF@ÚséìhŽ3˜¸Ö ø2nE¥Ò(•J™0âcr\š[§òøƒ7Û/2‹ÅbÙ‚h³k±X,Ë?"W^y%o~ó›Éf³±¶L„O±Xä™gžaùòålÞ¼™-[¶044„RŠ\.GWWmmmtuu1þ|:;;ikkC)Åðð0]]]Að²“é½3Y»~õs®sÉ%—ð¾÷½¯ñ÷ÙgŸÍù矿Ýu¥,˜³73§ïÛ5Ÿ¡ÁaJ›gKß:p|¾ööi´µNÅóò[•ÔÒŒß5 ÍEüd¤Cj~…jeŒRe„Ji„ru„Jy„0ð'“R¤22Ùf2™¹B…¦Ò™n*ݨO¯ïO ”T£ Èpx48mͤÓ®£øùÏ¡\¯‰--ZÄ’%KH§svÔ?1Æþ´D#”ÊcÔj•Øý^Ä"86Æ ñ8æ¤×ðæSßÂðH‰ ›‡p]‡LÚet¬Â]wÝÉ×þs1¥âèK:çuÿÈÄ3ÿJ(¦MŸ‡ÌtR©”ÊÁQ.Z¢J…´©áë M?¨„!ÚD¼âÈ£øgž›o[ŠR’¦¦fZšrI'ñ1 ‚ˆÇŸ^Gµêc´ÁO>+:2Ô‚¸3DDômZC±8Œ_ó ü*ÍíÓ ý*ºé»öËËb±Xv€õ°X,‹e¼óïä˜cŽá¢‹.bŸ}öA©¸N¹©©‰8€8ˆÓ¥”Œ‰â4 CÆÆÆÃ¥·ÞzëËVüÏ+þ_(ÚhYñ(#,˜=BsÏ<2{AGçLi þ±’m!tr¤SY”“Ävf/¶òÐ&Îs4„AI‡l¦@&ÓD!ì"Ô>A䆵8¥]§°C2sÆõR8N ÇKá(g’ð¯‹rL쇇€HG(©H¥^gµšO88L©#[ȱèÍà¡¿ìxvºZ-ñç%¿`iî&:ä5±×¤KƒŒŽ Q©–PÊidx®‡nÿÝ-Üñû[xÅ«æmÿúvZZšX¿iˆ ‡p2]¼jÑ[¹þWW¼èóÓZh!ã´!RJfÍÙ '7…‘¡~”ã!eœª/•A§ÓàkÐ~üy‰$J)tq÷wðÊ;naß½æÑÇW „¡„¤Ü¸ R­ ž«hiʱÅ0Bà‡ Œ£(î0„T*cÔü :24ŽçÑÞ=ƒ~ñ%ûÅe±X,6`±X,Ë‹ãÏþ3pÇ<øÀ8ꨣèèèhˆ¡‰ÔSüëâ>ç¹\®±ìw¿ûÔí°¡CcÃìW¥­c ­s§6ÔKKÐO­V!“OS$MXûæ õ´ô®L“P&žÇF yÝV‰F"ÙâøÕ‰ú:@&—†LŠJ¥Fµˆbµ_Ûi8‘ri„;þt5Þ Gr{÷ΠT£\o£—´Â Š¿ùÅ/¹ú¿¯d¯}÷ækß¹CœËC>ËÌ=§­ãû7½ ó!… ­ÐJ-¨¡µ&íy¤\×½ùmд›7®eÆži¿ÿÏ(ÇAŠ8ûÁ(¨jEÊÍ ”Äu4QTA …6šïû»üâúß±iK?¥r/•Âq®#‘I…”ŠY3:éAk|– R@¨ãó:62Hâå®›¥4ÔOq´ß~˜,‹å¹¾ßíX,‹Åòüüáà­o}+===ì·ß~|õ«_eåÊ•ŒŽŽR,)•J›ïûø¾OµZ¥\.S,Á‚»ï¾Ûæ¨Ôªüå‰e<½ò16>| é\•á¶™dZº©‡HUúhR:è;ª`ÜÎóƌ߯£“[¤A'·Æòñ—LÜj=¨³½úI“T«kaŒžô «PÈ’ëjCI‰‚m^,¥ÄÙN{Àbq˜ßßv ¿úÃ/-³zý*ž~ö ž^ý$+×>Íêõ+Y½~%ûÖ1<6D©\bé½÷qÂ+Žeݪ§yÍ«÷GÉáG¿åG)Ú›ÚBO)2‰ø?õ_?€)ìɦõÏâ¥2(å²ð°ãq”ÂQq ¿ç8ˆtЇþ‘R#PV/a¨V«œ÷ÙÏ1gf/Žø~-R"1¤Sí͸ŽB9 !:‰Tk%´ŽB&qE×´=¹ã—Ú‘Åb±Ø€Åb±X,»–ÇœsÏ=—¹sçÒÜÜL¡P ŸÏÓÔÔÄ>ûìÃôéÓI§Ód³Yòù<_|qãµk×®µøcX±~%>õ«ºpó„ÝÝè¦^„€p¬’Tø?dž’{=Qü'÷ZCRÏ@´õ¬¼Þa0ÁÏð‹‰‹ rÂ=ž- 1(!É75‘mjÙ& «»—|¡€ç¥¶ñ«ø¡OµVa¬\dxl˜‘âÃcà '÷C£CŒ•F)Wã€Ó»Þövþpõ̞ÙMwï^L›¹ÇNÊõhË·EJÆ¢=•NqÖÇ?ÇHØÎ¦ ëpS9ÇÅó24µ´rØ«^㺸®ƒã*<Ï!JzIyL\:#Gÿ{î¾›¾u+ééî" k±€ˆkü=W!8J2sz'RÈx¼Lü@­RL†]`ÐdrÍÕ"#C›ìÈb±Xžkh±X,Ënæ–[ná„N ¯¯žžžÝÚ«ýï G)öœ±íÍíìqð± ùyÚF6âWK¸®K%Õ—›±ãŸ9“L'>'’Ô1nàÈF0@ÔK&(öº@lP_oü¹ºS½¥â2WI¤”µ×=ÁÆuOQ.ÅéíÙ\޽÷YÈ1¯:j¹È·.ü7¬Ôê0—β÷Ì=)22:„†˜®¿§ú!:ÊAI…‚P‡|æ¿.âþG\ÃÕ?;ÿ9Ç;›ÊPÈä1&"}Œ1tuwóO|‘‡`óæu¤Òy\ÇA9^*—rÈfRxÜ}ë D‘Æ÷}*ÕQ¹B­´‘ž¶*µJÒ>0.ÅÈò|óGÿêg7ø>mí¤<'î A¤ñý€Çž\OÿàµZ@D”*EƆú)UŠøµ¦ÏØŸß\óEFmÀb±Xž|ÁƒÅb±X,»¯|å+477óýïŸ%K–ìT{ hcèî§ê׈FhÍÚ÷>€áQ•µ"¹”CˆBo7`Bg3AÈOœ‚<êÁÏÜS7úKÖõ BÅAƒz&@ÝüÑ$Ùã%Á%é|†¶öfLŸÃ¼½öcáþ±ðÀCÙcþº:{˜1g6ÿò/§3gÞ|yhår)þ±&%…LޱòAè£!ÒQ£>Þ$c¥“.uŸ0 é§gÖBÜt•± ômٸݱnÎ5Ñœ- ÐÔü‘ŽØsï½øú·/ãO÷¬dó¦u¤2Ò™J9H¥Ã+“v=½ÓؼîY„Œ³B#P: 寢¾îYEA­Ìþ‡AÿÀù|×sRâ8 ­ R ”Rô Œ"D‘¦T¡æûD¾!4!™l3ÊM±ì®_ÚŒÅb±ì¶Àb±X,–ÝL[[7Þx£ýlܲ§á©Çâþß_Éžûs÷ÃÉw–GI•7Ó á‰m+ó'ÞM*¨ßOô ñ"þÛŒÖñêua]­ž¸á¸tÁhŠñ¸B=BฎJQhncÚ̹ìµ×BöYx0 öÛŸùóçÑÖÞ‚DàG}<×þî6Î|ï‡hniEkMH!ˆ´nÿ8ÿEQ»oBHž|ôQÚÛš(«qì?ow|gtOgj{7˜?ôAÀQÇÃooü=þË3lܸžt¦™T&Ÿx,&&ˆ‘FGš Šðƒ€l¾‰#®rI§S¤R.89¶  ¤B%q ÅpËï®§9çÐÚÖÊØØhw‚ l€Zšsri„A5 ¶H”§ðÜSgìË-¿þšýX,‹ X,‹ÅòÏÂ… Éd2,_¾ÜÈ‹¤êWyàéGX·yK~ý+¿™}ŽÚ›ÑÎyx…VjÕ ¯¦MU^x î P_êø&·ÓÀlÿ”H„­˜´R@P$¢U‚«Žãà¸WJé …ÀQ’tÚ#•rÑ@Í8ýŒ÷sÝïî`ïý¤½¥“\&‡ç¸q]<¢±_ƒ‰Ë„ÀqÜØtO&eaD¤5Aàëzä¤ã>|Á¡t·´S®ÑFã:.x¿úͯY¿yˆ+V“ɶâ¦ÒàBÝÀƒŽ aQ­ùÔj!^&Ï>‚£™t ™Éôâ–€I=¿±[‚”‚oåKì»×,Â0l´ÇŒKÀuâfUÓ¦vÅm6¥Â!ßÔNyt#C6õßb±XlÀb±X,–¿^ûÚ×"„`llŒÁÁA; /‘UWóȪ'X¿~=¿¸ä[LKo$ê™J97|SAyŒ¦ œ2(av.01XPÏÀ4î꫚ ›1‘‰oɶê3òQ=_Ç¥Òu”#Iú¼”¡bÇ{©âšýº(ö\בԂb¹Âÿ뻼÷ì/²`ßCèlë¦-ÏæÈgrdRiÒ^|s7ñ!PqPA*š›;ˆBMèG”7lá W¼aÒ;non§ÔHy©x»™<›7l¦T*±qã¹|ÒqêM©;!R`Œ& ã[¥R£Vó™2mmÝ(¥H§\¯€6&Nˆq_cà‰Gƒ°LïÔn††F #MͳÂ0BAKK.îÖèH„T¡PRÑ;}o®¿æ<û¡°X,–€õ°X,‹e7òÁ~… rÓM7ñ¿ÿû¿v@v~à³yp ¹LžþÛô43æÏbÈé$…ÀÑ!ÔÆÈŠ×u Œ`¼Ûz01N0Aå;j|AÝüO0îH%ÛŒ³â%r‚‘ #%ÒQ8Ê!“öHy*6ÎsR)×I$Nù‰£¨ÔÂH0kï8à•¯¡sÊLF¶@á:NÒ†ÏÁs\<×Ãu]Rn ×qyõ?¿—‘±€Ê–_dh-hÖ®YÀ+¾‚áÑAÂ(Œgé•c˜>c:¡ÛÊŠÕ›ðý`«aI ¾¸ÌÀÔËZ I̘3MkVEšIqxÓÿgï΃,;Ïû¾ÿÎ{ι[ïë,˜ƒÁ b_ \ ‚)Ê¢e‰±*fÊ‘”ÐI¬¨R K)—[Š#¹’R”¥G6S’•ˆ¡((A „&¶Y€Áìû>½÷]Ïy—üqνÝCX¶` 8ú~PSÝîô½}úܪ~ïó>Fà e×ÿâ«™8ÖÓ_ýº~üü¤Îž»¤$­(‰¼WÙ§1’sE¿ƒ…Å)ÇCc:sê%½ñê³¼!àm €wÐM7Ý$ï½¾ò•¯p1þ 9ïtèô¸xZv[¯>óGê{^šÕB2©¤1*ï¬LgQã¦WöX·³/»ýýÿ°~»¿ì `ýÚÖÿºv*ïõGÊ)ƒaÐè.” )ªLˆdLĦXä'qÿ<|yÚÀ_cð4åSVÓXIb”çV½^O×m¿Y?ôŸÕþÃ_Ô>ù]¿ënMMoÖÈȸjµ!Åqª8­êSÿÅ?VclZ‹‹«Râñ1¹ÅeÝõÀ*Ž‹p£^RµR-Æô£zµ®ñ‘ }ëéo)1F•$Q}ǯ‹!È{WNU,^¤³N™µêö2µZ]å½\÷¼ÿÊc£Z­¦`j2Æ(6¦Xü‡08ÊÐl6uôýšR·[49ŒL¿©bµ^3“cJ+©ŒI'©ªõa}õñÏñF€·)áðÎÙ¸q£Œ1zñŹï€+KóZ\]Ò ›¯W8sJΜҮ;ÔÊÐ ²®¦É$“ﬨæW5<4®%—”kþuÕë¶k¼ä¬âbÛ?‰ŠÝçrï$ (ªLù×EAŠÊê)*:Ü#ÉDJŒ)ÏÂGƒžƒF^Q””_?RÅ"Ûù X‘ªÕDíNOËͦšó+jåNq:®ïÿ„òÜjfzLi’Èy¯ñ±!Í-¬èØÞ#Šœ“™W¥š¨-­J<ú }ãkO¨¥šÚ¤N¯£$N4:<¦Ù©š¿°¨^kQõzU++m9WlÉ›·ôDƒ×ë]P9™8V·—«^oèÆ›oÕ¡7ö)mŒKr2‘Q’¤rÎúHÒÿøþ©~ã+iÿ“Ês'ï‚*•DÞKi+Ï#mÞ0¥ãÝ Š}ª¿ùÛòÎñÞ=ÆÇÇ%IgΜáb¼C¬s:|æ˜&G'´ez“íyQÃ#´ýŽ÷kÑO+u©†í²²Õy&‰L}\ 6QÙÒ~­'@9úoPì|±-¯PvýWQ;I F¡_æ_ž÷/þ~ñÿ½‚"ïLQÎÅ‘Œ¢"ˆ¾ãHBù1x)D^Qdä}QM`½Wð^® Ò4V£Q“÷RûʲºK‹êõ¼¼³Z>{I!M¥nWqT7’\$31®4MŠ#£#ê\ž×Íw|ŸžþÆë¥ÃßÒ'úQu{mUÒªÆF&T«5Ôé¶tâÀ> oSx›» ÃçNh¥Õ”µ¹ï}QGžûm §óªožÕBcJñ’‰5Ü9¯É$»º/Àú)!H¾ü˜— ÝàßZ°®œ¿ÈŠÝñà¥àÊE¼÷rNåNz(U¹µr®¬+—yYç•;WîŠ;yß?:äûÏúQ@± ï‡ýÿns§4M”›Dfa^wÞÿqIÒ…ãÏifj£ºYW¾µWI«:´w¿&Ç*ª®;´64! ºDƒ ¡ÿ}çY.›;µÚ]yE›TÛIµJMiRŒ4¦ƒljŒ‰õÅ_ûœõš:®œsêe¹Œ‰”¦±"éÿöqsï.;vì÷^gÏžåbü5êf=»pJ§¯\P/ï©×íhï _Óño}IÃñ¼êSZžU³qd»Ï/k4¶ëªÊ=ïà$ïÖêô]¿^ÑKàªÑ€ëãý£ÅξäTTïdm1RϹ ×_ì;?øÜz+ksåÖËZWT„ ›ûµÊƒàEáªÝÿAO~£Â(RðAÎ:EŠ”NŒ*óR'Ö®Ý7ëw~ç‹ÊÆ·—+Êb«Z©kéÂŽÓÊû«Æ–GBq¡8Bù:¬µêõ2Ýûð£ª4FeâDi’þ£ãÁ.ÿñÃÇ5ÞHä}>Øÿ•Õ˜HwßsŸ®Û¶‹x÷“1F­V‹‹ñ.°¸º¤ÃgOêÊÒ‚Bj./iß³¤ó{_ ³ªú†)-Œ^§¥tFIÈ5™dJä%W.ú}yÎÝ—ý|(þŽøºE±/ðÖæ.÷rÖ+w^Î9eYQÞo“³NÖ:Ù,/Êçs§Ü9ïBqßÚb•»þWíȯo$ ~@Qi0øwIi%•Okê^šÓ÷}T’ÔËOiblªx®²o@µRÓÞ_ж-ÓŠ“x°¸/š÷]Ý41R2ô‡&IÞ;å¹S§›©ÛÍ5{Ý8wFiZQMÓ$•$%e@'zâ·¾¨F­¦,ËÊÀ+Ф¸<*ðÑý74ü` ïZ­¦W^y¥8³wçÎÍ_ÔBsI'f4ÚÖ•KZ¸ò{š½n»6ßü~åµ)-´:ŠZmM$™¼:ªªãM±¬5¾<Ø_&’b)S,ÊãrÌ]< Ê2$•»ú.‘sV¹e"§,’’uåüÖyÙÌeôÖÉæN¹skÇÖ-îƒ[× ŠÖÊðýºûÎkÐk Ïs¥iªx¤!7ßSuèzOê ÿï¿Ò?üÏÿ¹ÒÞAY›¿(&‰¯Ì«¦U 7jZÌò²ý@(†µÉ‰ý¨#EEkÅb2¢Ê3«®Étë=ë±ýªVjeåƒ+KÿMY `dâXçNÕh-Ör91IYkeâHÆGúØ'>©ßûÒ¯keiîßùónÔºk÷’"¥iECõ†&F§•£ã£úÉŸúqí¾u·Ž=¢Ï~ö³zæ™gx£¸fÅ’~ËÀ_½Ÿû¹ŸÓ /¼ Çœ‹ñ.cÕRsE^WµJUI«µ²¤K'ö+Q[㮓ժM9¯z”©n¼œ/+ÿ£~÷¿²Ôß)*[ï Û%ëIl%±â¸g—&‰â$.ß™ríÝúË£¹µÊr'›{õ²LYæÊrú\ÎJÖ[9·öÜEÅÁÕUa]XÐïMÊ*J5•‰Œl«#›eÑ©ãt×ûÞ§Q¥jµWËWU,”ó¼¥ÉëviiqµœnÐ?fPŽ3 kϳ> 0Q$[öM0&RœÄZY¼¢ÔeŠ)Ž#¥Iª$I•ĉҴ¢ 'Oë=÷ݧ^–ËÙbA|¢wAyîõÆþ—þ­?_Ývã­zäž©Q­KÁe¯Á«ÝYUÖëèÁ=¨¿ÿ_ÿÝ~ç-ªV«Ú´y³Ž9ªgŸ}–7€kGx±›øî¶ÒnêÈÙ“:7wQÖ;…tþÄ›ÚûßÒ•#¦zÃËNNk¡6©›j8všŒ»ª‡\Êóâ€T4t~m±íƒ¢( :Ùëä—BÑÜ/8/ï¼rg•9§,Ï•çNYn•eY±ëß|(Úøâs_öø7‘‘[·è6ƒ^E~ßÿ|Ýâ_’¼s >(Ž¢Ña)·Ú¾ë¥iªßùü¯*ǫ’V‹iÞ+‰Síù5íØ2®Z½Z åèÁþ÷[Ö¬=ùóaP ÑëYu:=ÝþàGti~NõÚP1  ¬ˆã¤g˜*(èò…KNrÕkU™¸ßË ø.MlôÉ¿ów•¤•·üL+iE{ßGµ}ÃV8sDGOÒ¥¹ ZZYT«ÝÔäô¤þÑ/ý¼>öwLû_Ô‰S—ÕéfòÞkbr†7ðöyïõÊ+¯p!Þå‚‚æW–tèÌ1]Y^,–/:¤ýOA—=¥F¥§‘-µPÓ‚­ª9MšŽFB.õzk=ʳöA*»ü¯ßóÞ+wA¹÷²ÖÊy§Üz¹Üɹ¢Ë¿³^Öå¹U漬wEU€µ²ÖÍ˃Þ{Å‘ŠP!„rÁ¿6q ÿ½õDýÑ…Ö)ËrIAiµ8|ª~T+ËËZUKõZCÞ;ù2à¨Ujºx|Ÿ¶oUbLñuýÚăPVBô› öŸÔ÷›z¯¼z=+祩ەĉ*iµh˜Vlj’8•1FIœ(ŠŒ~÷×?¯í×MÉ»0èÇFÕJ¢±Ñ!}äcŸü£(ÒæéMúÈ}hqiN'ÎÕj{U!xUÒŠjÕš~äïý˜~úçÿ™æÚ±žýÖA;qQÇN_Rž{ù ¥•aÞÀÛ·´´¤sçÎq!¾G8ïuaá²=¡•öjYÚ.]9{Lûžþ]ßÿÇš—Æ·mÖBc\ ®*Ék2Î÷:R·+åV!SÔ/¹÷ÅâÞ{ sWvõ/úb¼_îre>—u¶X0çAÎ[åÖ—S M1n/Çú;ðƒÄ!¬Œ¢u;ÿ~]³¾ÜI±QžY)Š”&‰T¯«Óéêþ¤$é«Oü††‡ÇeâXÎ{%q¢—þìYÝqëvÕëµÁSö?¹êyÌZ ^[ÑÀÐ9«n'Ó–]w*·¶˜0XðK‘é­ˆT­Tuùüeå­emÚ0.IJãXÕJªJš¨ZIõéÿô3ªUjÚ¶a«½÷ƒºaÓ6¾pR Ëó²Î*’TI«Ú}óÍú…ÿõW´û¾G´ÿͳ:v겚͎LéÜùùàuþü¼¦7läàšFÞ!?ü°{ì1åyÎÅøž œ–[«jvÚªW«JãDARseIgì“m]Ðì¦JÆgÕ´R§çŠõ ª+Û³Š’X”«GŠL1BÏ$F2FišÈ˜HQ,E22 ŠB¤àUŒôAÖZYd4ô>È{É«¨ð eàP4ÿ‹¢h]ÙÿÚt€¢û¿/ÚóçVrNi½Vô)HbÙÅnؤù‹‡uêäqmØyŸÆ“HíNS¾¬0X]]Ñw¿G——­š­NYñP„õaÀÕ ÿÁŸ²obž÷´Ònª·pQ£ÃÊM,)(ŽÅ&)'$e{£=/¿¢OüÈja©©;ý•$–L¤á¡º|Ë©»¼ ¹Å+ZZ],š£Z¥¦á‘ý—ÿÍOé?þÌ¥C§táÒ¢Úžòþ´çtäÀëÚ<3¢£§—491ªßúÍÏñ&@ޞǼ(Í.çªã{Kns-¬.)wVCµšâ¨(œl­®èüñÊ–ÏizfJ•éÍÊM"o­‚÷ª› Ôæ²][ÔZšXqT̹7Æ(1¦lh§ÁηW¤ HNÅq—gø³,—|Pž¹A‚àŠcÅx¿r—¿? ÓB(÷V‰ ÜõgóIÞ)ª¤Å¹{c”÷2ur«íÛfµ÷Õµ²rI÷Þr¯––çåœUP1J°Ý\Ö®ÛïÕÙóskåþeèPlù¯M@4è¶ÅE’e]5—æ¥HšQ­ìþoÊñ~ÆDE'JâXAÒù gôàûïW¥1¬v'+~5¦hB¤±éYýÉïQY^Œ ŒãXµj]>ô þ÷õjhúzíyý¤V›9çŠÊ [ôAØ÷ʳúæü†¾ú§¢{Þû]·y“~û ¿©<Ëx¸&q€wˆsŽÝÿkÀÂê’ž9®ËKóåfv±¸]¼rA{Ÿ{B§^zL³C«šÞ¶IÑä¤Ú•†ÚÞ¨{MämÕV—•5›rÞË:§,³Ês§Ü:u{¹¬µò®ìðŸYÙܻә•œŸ—ryÑ#ÀvÚ×:ã+RY²¯«H*¶þ%Ù²iaPq  ü~⡆º ËÚ~ã=ªÖj:î„ÎöŠòù "ÄŠM¬½¯¼¦™ñDÕje0 pPf0ø|Mt êuÛj-/*³™2›+¯ +wNú°aU+uÕª UÒªL9! Ž…ô¿ýÒ¯hëæI¥I¬$‰'‰Ò$Qš&Ú½{§6^·]ÕJUÕJM³3³ú§¿ø?èWýs:y¡£7V·—©—çÊ2§$5ª7*úúAO<ö/•e=]¹|Qÿâ—ÿ‰FFêÚ°a7=€kÿ!5»m-¬.*6FõÊÚ9øN»¥ÓGhåÒmÝ2«Ñ™Mò•š²´¢NËg¹Fäd»]å!R”šr[tµW¤r‘]ö”—·^Ö…"pÅŽµuA68_„ýæ‚ý×W¶P(öwÈCÂW9C¯ø¦œW:T“‰ŒL$Ùf[•ÑÖ¬Ž=¤ÜwuûŽ[Š*ï5>>$SŸÑòró­×é;‡~a@·ÓTsuQÖæ Þ+ ’"ÅŠ56<$%IEq’ÈDF!µZ+Z\º¢ÜfZ\\ÐûÞÿ LZ—sA•4VIib45»E^ù7ºÿ¡èWþ¯_Õõ7Ý¢—öÓù‹‹Êò\n.—;5UmÞ0ªý/ÿ'=÷Ì+6Fµ´"… ¥¥Eýýÿì3zæé§tæôInz“ù´ÚniauYÆÕ+Õ²Y`P§ÝÖécoèò©}Ú8UÓö®Wœ6ä«UµL*׳ªú\¶ÓUO±ŒT”ÆG‘‚+ç•%üYîäƒWÖ³ÊlQòŸ;¯à‹P XXû²Ü­" ßŒ¯è P”èçÿƒÖTN,ðNi£Q<ÐDÊs«<=ôÞÛõäWŸÐüÜÝ~ףʚóÊm1&O!èô©ºïÖ…K‹å×^¿ñ® MBzݦÚí9kÕŸ É$±F†ÆÔ³^µÚâJEÆ{µÚ+ZY]T–÷о*Žì}e>þw~H^QêŸ$‰‚’ÔhÃÆúÔýˆvÞñ^-6{:qê²–WÚêörõzEÕÅøØf&RýÒÏÿŒ^úö ’¤4IaŽéoýð¤7^߯7ß|›Šóð«–›Ëeùjy>(Ïr9yT^yV±[Ö–-59»II½®g½\‚sr®è¾·~§?”@Py ß™ß—‹~——!@±ÕŠ’4.+Œes§»ï¹C¯~û›Z^^V'XÝ´ùz­4—äËív[·Ü¶Ks+‘²Ì~Ç¢ÿêëÔn¯¨ÓY){øò¤€QdbÅq"¹^OãµXí¥ËZY],*ƱҴ:ý—¦U­,¯èû>òUÃÅñ…d£à‚¶n™ÖÎ[uôäEu»™:ÝLN¦^fBÐìô˜†ª=ýÌOÿ¤>4x}Iœh¤>$•½ þðÇuùÊ%½òò·¸Éà­AÀRkEÆÄªU*ƒñ{’4å’Ž¼þ².œØ§ñÑš®Û¶]CÃCŠªUŵT¹õêv2u;™¬õŠL$›»¢Y]¹ðw>ÈæV™-ôý†|E½}±¶,ÀË6üÞ¯å ý³y¶¶VïçiªJ%-Öæ!ȶ»ÊéÆíÓúö¿yAs—ÏjûÖl®,Ï!@¯³¢ém·je¥µnáï‹ÝzyùàÕZ]R¯×**|<¡QMÿ’4‘Qи]ÑòÂùà‹&~&–1±*iUI’ª’VIŠãD¯}ûU}ÿßþu{V¾¬jAºqÇ&%‰ÑCgÕíYu:¹2ë”Ä‘¶m™V¶zVŸùÉOknn_'­)*›>üÈGä½×3O?ÉÍ àšD@€¿¤ÜZŸ¿¤£çOiµÓzKH°8wEÏ?ù¸¾ü¹¦£¯þ‰Fk]mÙ<£ééQŽ;Ы«-Í]ZÐâÒª:ÝL½Ì)Ï­z½L™sRr¡¨è—þÛò£ÊÒù¢’ ¿Âìȇ E±ÖG’¤vký¿I6ו+KºåöüÊ׿¤´R+žßÀÁ×hãTRìÀ{§2AP^Î;µ–æ•uÚòÖ)d¹B–‹•‹ÿ$ÕèØö|ëËzìk_Л'©Ùíhb|ZCãª×‡T©TU«ÖU¯ i¨1¢‘á1¹žWd3MŽ©’ÄŠâH.x¥•XR1eÁ¹âMŒ5ôÐý7éÊÙ}ú‰ÿ´šÍ·ö,0‘Q­ZSšT”&©:­¶¦§7pC¸fQðWÄû¢"`µÓRš¤J“bž}q _òÞéÒ¹Ó:ðêóZ¹rJ[·Ìjû ;d’bôu^ù%uWÔÉœ÷’1òÖ•»úìì»ráßoºçË‘“Qùù ü_ýî‚~mñïûƒ’F½è¸oŒœ)ëMOÏêÔÑ=šŸŸ|íé±IeyoÐ`prlHY<©|P’täôaݱóV­6—U/¿ðœîùøO¨ÕlÉ;¯¼ÕR¯×‘uE_€`‹1ƒÊ­¢ØÈÄ©âJE³³“Ž/êé§¾ú–ëÖí4uäàK:rð%c´û–»µs÷]Ú¸åf¥¹Ñx”«¹´¢Ëç¯hûÖ5;]MO”ßcжë¦591¤‘¡Šþ“Oÿ==öØcÿîÀ&Õ*õbDcdÕív45=+cLÑô®1T¼CŠŠ€¶VÚ-¥I¬JRtµÊÆsY¯§7ߨ¯ç¾þ‡ªGí¾q‹®ß¹SµZMq£®,e‹+ÊW›ÊÚ=ÙHŠ#Sœï/ì#IÞË•÷ƒE@PV ȹ¢û¿´¶ûßO*%©ä.·j¶ºÚµûzýÙS8ø^&ÇgTIbõz]ùòu߸û5³TÍ¥YoËö omñ²|PdŒL’*©Ö4>9¡»nÖÿòË¿8è“ðç !hîÊ9øš^ûö“ºtù¨B#•щsM=òþÛiblXÆÕÓS#Z]YÒÇ?þq=ùä¿ÿ¿‰ŒvnÙ!ks¥Iª»nÖ7ߢ?øÊ—Ôi·¸àí !¨Ùíh¹ÕT’ΤE …òcñ˜³gNëÛÏ?£}/=£™ÑX·¼g§6o¹Nµ‘†r“(AnqUy³©¼Ý‘b™r?ØùÊÍ}_œÉ—uåÀõ;ÚëÊ‚”ÖªÅqIÁùÅemܬ §ßÐââ¼$éÜ•sº{÷Ýj¶W•Û\>xõ:KÚºë6Í/®È÷ºòÞ;ÿÁgþ#É£82šÓGÞ£þÉÏýŒz½ÞÛ¾†+Ë‹:zx¿ö½úŒö¼üM}ó™çµoïKrÎê–[n‘$:tHúЇtàÀ¿ð×ݵu§²¬'mÞ¶C7Ýv»žúúŸjnî7.€kG¾K|𺼴 iA3ckŒ(Š¢bdŸü`W|uyYô•ßÓ>þemºî:=òÑнwÜ¥…U¯+sËZ^i«¹ÒRXYQ7)6ІG'¦ìº¯µö$ïTŽ(×ýa-Èóⵕ5Q$'éìÙ+ºÿ½ï×ñc‡‹ÿïœ.,ÎiblJ—ç/ªÝkëèáÃÚ¼m¯¶o¿YgÎ]’kw¥à$WŒ'H’T‘‰UÓØ­_ü…ŸU«õ—ßY_ZZÐ×þô IÒ¯ýÚ¯ßIYQñvƒ™™Éjµ›rÞ©×í*ijfƒô&÷+€k Ú½®šËò!h¸ÞP'ƒEiEEC¿(RsuU¯ïyUÏ?õGÊV/êú­3Ú}Óª5†TR¨VåL,¿Ú”ouºY±6åë‹¿ûóδ%ÃÁiIòžl«£û¼M_ÿÚƒG^œ;¯í›¶K!È:«à½N;¦±†×ŽoR’VäãXN‘¢JEQ+Öý÷Þ¨ÿï×ÿg8qâ]÷s¸ç=÷«^­«—u51=«[ïº[¯¿¾Oìå&pÍ¡à¯ÑRsEKÍÔ‡43>¥jZUA&2EC½ÁY~éõ=¯ißk¯*ŽÝqï{uÓjëÍ»´´ÜÒübSívW­ÅEŽ¢^QÙ,0ê¯õuU'Â’s~0M (H# UZ«›ØxÕ㬳úú·¿¡­¶hzl²¨^pN{^~Y¯ïÝ£;xH·Ýt—âêVWºRdtÇ­×ëË¿ý/ÞVYþwÓÜò¼vm½Q!xÙ,“$ÍÎnäÆpM¢à] ³¹›ËZj­j¨>¤F½¡ØÄeY{Pkþ}p:wæ¤ö¿ò¼¼ö¬Æ†¥Ý»¶kbfVÁÙ8VnŒLž©j‚*Q(þ9ÏÕkeÁ@ñˆ¤ZÖS:VÓ3ßøý·<~¥µ¢ÕvSÕjM•´"Iêõz:}☼ö¢/ÑähE÷ܾYOþéãúý?øƒwíuo÷ººçö‡4T«+Švßu—.]º¬çžù7%€kÎw ¤À»ÅÆÉYÍŽOKÁ«SŽØ³ÎI!((È{/_6÷óÞk˶íºë½Ôô¦›ÔÎkºxq^~iY“I.õZRR•+j9#/)„b×ߌ)Nârñdó\õÖªnyðý÷ÿÝgþB¯uvbFiKŠ›¢záüü÷F#½Ûoy@ŸxäG•ĹúáÔÁ7è³?ýin@×޼K]\¸¬‹ —5ToèÆÍ;d¢Hín[½¬+ç"cùPάtúÔI~`||>`|ff<~ pf~ff<`f|f|>``p>|fff|~`l`~~`n``>p`nf<fffnff~|ffdxnf````~bv~lbffvz|nf<fff<|fl````>|~ffff<fffv4bbjjj<Bf4fBff, ~ 0~|````|@`0 ``|nf|>pp>>vf>|fn`>80|00>f><``|nffp``lxlfþkkkünff800<~ ~   006l6|6f|f>`~ff>66öf Û<~~<ffffffÛ{; 8 0 0`0 þþ`0 0`|Æ |ÆÆÞÜÀ~8lÆÆþÆÆüff|ffüþ† 0bþ|`````|À`0 | |8lÆÿ00vÜÈÜvxÌøÌøÀÀ|ÆÀÆ|üfffü8`ÀøÀ`8þÀøÀÀ""""c>""""ã0,# Ä4 À@@@@À<<<<<<<<<<<<<~~<<~~<<~~~~<<~~~~<66÷ÿÿ÷66666707666ÿÿ66÷÷666ÿÿ6666ÿÿÿÿ6666666??6666666ÿ666ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿððððððððÿÿÿÿvÜÈÜvxÌøÌøÀÀüÌÀÀÀÀþllllüÌ`0`Ìü~ØØØpffff|`ÀvÜü0xÌÌx0ü8lÆþÆl88lÆÆllî0|ÌÌx~ÛÛ~ ~ÛÛ~`À8`ÀøÀ`8xÌÌÌÌÌÌ~~~~~`00`ü0`0üØØp~vÜvÜ8ll8 ìl<Xllllp˜0`ø<<<<milkytracker-0.90.85+dfsg/resources/fonts/ZERO.8X80000644000175000017500000000400210737746457020676 0ustar admin2admin2~¥½™~~ÿÛÿÿÃç~îþþ|88|þ|8<ÿÿJ8|þþ’8<ÿÿçÃçÿÿÿ~~~~~ÿ~~ÿ `ÿ` ÀÀÀÿ$fÿf$8|þþ|8000000ffPøPøP|ÒÐ|Ö|ã¦ì7eÇ8L8EÆÎz `ÀÀÀ`  T8þ8T~p~  0`À8DDDD88x||Æ 0`þ|Æ<Æ|6fþþÀÀüü|ÆÀüÆÆ|þ 000|ÆÆ|ÆÆ||ÆÆ~Æ|0000 0`0~~p p|Æ 00|‚ºª¾€|8dÂþÂÂüÆüÆÆü|ÆÀÀÆ|üÆÆÆÆüþÀøÀÀþþÂøÈÀÀ|ÆÀÞÆzÆÆÆþÆÆÆ~~ ÌxÆÌØðØÌÆð````bþÆîþÖÖÆÆÆæöÞÎÆÆ|ÆÆÆÆÆ|üff|``ð|ÆÆÆÞÎ|üff|ffæ|ÂÀ|Æ|~ÆÆÆÆÆÆ|ÆÆÆÆÆl8ÆÆÖÖÖîÆÆl88lÆ‚Æl88þ† 0bþÀ`0 p000000p8lÆÿ00|~Æ~ÀÀüÆÆÆü|ÆÀÆ|~ÆÆÆ~|ÆþÀ|0ðÿ<ÀþÀ>~ÃÃÃÃþþþ~~p pþ0`0þØp~vÜvÜþ><~~<ffffffÛÛ{>c8ll8†ü~~~<~~<ÿ<~~< þ 0`þ`0ÀÀÀþ$fÿf$<~ÿÿÿÿ~<((((|(|(B<  ~~   =FŒ|"b¼CFü"`ÀAB<x$b¢CFü"@¸CB<6J‚” "`ÎCF:""b¼EFD(È  ¬uFH0$(pàQJD0P !B|"&jÔU†Œ1rª+FD!aÂCF8|"bÄùF@!aÂKF:|"BüE†„ £bœ| AB<""bÂED8""DÆ)(""BÄUV(Dd¨)FD"BÂ?"B<È $äIJ4dÆIP bÂUT(D¨*D"ÄE>D8<Ä.H0  $X(D‚‚þÿ€€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿÿ€€€Ààðøüþÿÿ?ÿÿÀÀÀÀÀÀÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÀÀÀÀªxüüüüx<~~~~<????€€€€€ÀÀÀÀ€ÀààààÀàððððàðøøøøð~~~~~~~~ÿÿ<~ÿÿÿÿÿ<~ÿÿÿçZBB瀀@@@€€HHH’’III’’@@ @@HH$$$HHII$$$II€€€ $$’’’$$<<øø66öö66666666666þö66666öþ6666þøøøÿÿÿÿ666676666670??0766666÷ÿÿ÷66666707666ÿÿ66÷÷666ÿÿ6666ÿÿÿÿ6666666??6666666ÿ666ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿððððððððÿÿÿÿvÜÈÜvxÌøÌøÀÀüÌÀÀÀÀþllllüÌ`0`Ìü~ØØØpffff|`ÀvÜü0xÌÌx0ü8lÆþÆl88lÆÆllî0|ÌÌx~ÛÛ~ ~ÛÛ~`À8`ÀøÀ`8xÌÌÌÌÌÌ~~~~~`00`ü0`0üØØp~vÜvÜ8ll8 ìl<Xllllp˜0`ø<<<<milkytracker-0.90.85+dfsg/resources/fonts/EK-SPACE.8X80000644000175000017500000000400210737746457021247 0ustar admin2admin2|‚ª‚ºD8|’’þºD8lþþþ|88|þ|888ÖþÖ88|þþ’88|||8þÆ‚‚‚Æþ8DDD8þƺººÆþ |ÆÆ||ÆÆ|| 80>666æÜU)U)Uÿ`x~x` <ü< ~~ffffff~ÖÖÖv~ÀüÆ~ü~~8||8þ8|þþ|88x8ÀÀÀ~(lîl(8|þþ|8000000ll(PøPøP|ÖÐ|Ö|2Vl6jL8l8dÆÆ~0`ÀÀÀ`  T8þ8T~0| 0`|ÆÆÖÆÆ|8~|ÆpÀþ|Æ<Æ|6fÆþþÀÀüü|ÆÀüÆÆ|þ |000|ÆÆ|ÆÆ||ÆÆ~Æ| 0`0 ||`0 0`~?x?p?€À€àüþü8~þþü(T(T(T(Tÿÿ8|ÿÿTÿÿ8|þÿÿlþÖÖÖ`ÀÀÀÀ€pØØØØŒqÛÛÛÛŽÀ````0Ællll8Çmmmm8€€€€À°°°°à¶¶¶¶ã8|||8ðø666ææ6666666666üæ66666æü666üøððÿÿÿÿ66676666666300366666ãÿÿã6666630366ÿÿ666ãã66ÿÿ666ÿÿÿÿ66666666666666ÿ6666ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿððððððððÿÿÿÿvÌÌvp<|rV|>jN~f`|f<f<0 0 <<<<  fff>ff>|``|ffffff<``ff|fff~fff|fffffff>|ff``>`~|00<006ffff<fff6fff~fff|~ 0~0p p!MUUN ?00?ÿÿü ü>>milkytracker-0.90.85+dfsg/resources/fonts/FN-ICE.8X80000644000175000017500000000400210737746457021020 0ustar admin2admin2~¥½™~~ÿÛÿÃçÿ~lþþþ|88|þ|88|8þþ’|8|þ|8|<<ÿÿçÃÃçÿÿþ><~~<ffffffÛÛ{>c8ll8†ü~~~<~~<ÿ<~~< þ 0`þ`0ÀÀÀþ$fÿf$<~ÿÿÿÿ~< 08888ll((|(|(``|````~ÆÆ~üÀÀüÆÆÆÆ8~f<ÀÀÆÌøÌÆ``````>ìþÖÆÆüÆÆÆÆ|ÆÆÆ|üÆÆÆüÀ~ÆÆÆ~ÜæÀÀÀ~À|ü00|000ÆÆÆÆ~ÆÆll8ÆÆÖþlÆl8lÆÆÆÆ~üü0`þ0ÿp pÿÿÿÀÀÿÿÿÿÿþ|88|þmilkytracker-0.90.85+dfsg/resources/fonts/IDC-MicroKnight.12X120000644000175000017500000001100011221230771023024 0ustar admin2admin2pppppÜÁÜÀ9œãþÇ9œãþÇ9œpþswà?pwp÷?pàà·9Îp€sœíØ|àîà|ç;÷qçp¼pàà`à8€8€8€8à8àààà8ŽÃøðÿ‡Üá8ppà?þpp@à?þppà8Àp€àþq<çww?÷qwpþpxpppþüpÇ?pppÿüp?pgpwpþÀà¸Ã9Žs8ÿ8€ÿpð?ppw8þ~pð?wpwpw8þÿ8Ààpppþq8‡ã?wpwpw8þþq8wpwpçpðpppppp@à8À8àÀüÀü€pÀ8Àp€þsppàppüá8çwwwwwçsàpüþq8wpÿwpwpwpÿq8‡ó?wpwpw8ÿþq8pppppþÿq8wpwpwpwpÿÿwðpppÿÿwðppp|àpÇwpwpwx~pwp÷wpwpwpÿppppÿÀpppwpwpþw8ÇqwðwpÇq8pppppÿ÷xß÷wwrwpwp÷p÷sww~Çwxwpþq8wpwpwpwpþÿq8wpwp÷?pþq8wpwpwpww>þ8ÿq8wp÷?wpÇq8p~pà?pgpwpþÿpppppwpwpwpwpwpþwpwpç8ŽÃÜøwpwpwrw÷ß÷xç8Üø€Üá8wpwpwpç?€8€8€ÿ8Àp€àpÿø€8€8€8€8€øpÀ8à€pøààààø øÀŽðpp0øpçwpwpþpÿq8wpwpwpÿþp8ppppþpüçpwpwpwpþþp‡ó?pppþøÀÀ|ÀÀÀÀþwpwpwpþpç?pÿq8wpwpwppÀpppþp|ppgpüp‡sçðwpÇq8€ppppþóxß÷wwrwpÿq8wpwpwpþq8wpwpwpþÿq8wpwp÷?püçpwpwpçpÿspppp~pà?pwpþÀþÀÀÀÀøwpwpwpwpþwpç8Žã8ÜÁøwp'wwÿç?Þã8ç8Üp€Üá8ppwpçpüÿ8Àp€àÿàpp€ppàppppppxààààxðÿÿðÿppÿðÿÿðÿààÿðþÃø p€üá?ÿmilkytracker-0.90.85+dfsg/resources/fonts/INVERSE.8X80000644000175000017500000000400210737746457021232 0ustar admin2admin2~¥½™~~ÿÛÿÿÃç~îþþ|88|þ|8<ÿÿJ8|þþ’8<ÿÿçÃçÿÿÿ~~~~~ÿ~~ÿ `ÿ` ÀÀÀÿ$fÿf$8|þþ|8000000ffPøPøP|ÒÐ|Ö|ã¦ì7eÇ8L8EÆÎz `ÀÀÀ`  T8þ8T~p~  0`À0ðÿ<ÀþÀ>~ÃÃÃÃþþþ~~p pþ0`0þØp~vÜvÜÀþspwpÿwpwpwpÿspwpÿspwp÷?þsppppç?ÿq8wpwpwp‡óÿwpppðÿwppppþsppÇwpwpç?wpwpÿwpwpwpÿppppðþppppç?wpw8ÿq8wpwpppppðvp÷}ÿww'wpwpwp÷q?wwçw|‡wpþspwpwpwpç?ÿspwpÿsppþspwpwpgw~Çç;ÿspwpÿspwpwpþsppþppç?ÿppppwpwpwpwpç?wpwpwpwpŽÃøwpwrw÷ß÷x7`wpç8üá8wpwpwpwpþppÇ?ÿp€à8Àðø€8€8€8€8€À8€pàÀøàààà€ øÀŽðp@þpçwpçpÿspwpwp÷?þspppç?pþwpwpwpçþsp÷pç?àpþppþspçpç?pÿspwpwpwppþpppà?pppç?ppwp‡ó‡spwp8€8€8€8€8þsr'wr'wpwpþspwpwpwpþspwpwpç?ÿspwpwpÿsþwpwpwpþpþsppppþsàpç?pp?pppç?wpwpwpç?wpwpç8Üwpwr'wr'ç?wpç?wpwpwpçpç?ÿ<àxÀðð€8ü8€8pppppxàøàà€ðÿÿðÿppÿðÿÿðÿààÿÀø€p  pø€ümilkytracker-0.90.85+dfsg/resources/fonts/ATHENA.12X120000644000175000017500000001100010737746457021201 0ustar admin2admin2p€ø€øppÜÁà8ŽóŽã8Žã8ÿç8ŽPþsWà?PuþPÇqàp€8Çqþp‡ñ ~Àv2>Ãq<~p@ð€8€8€8€8€ðxààààxp€ÿç?üÁŽ3`ppðpppðpÀàp€8Àþspwpwpwpwpþp€ppppþþsp8Àp€àÿþsppàppwpþwpwpþpppÿwpÿppwpþþspÿspwpwpþÿp8€ÀàpþspwpþspwpwpþþspwpwpþppþppppÀp€€pÀà?à?€pÀp€þspp>ppüá8gw{7ws7wsçãüþspwpÿwpwpwpÿspwpÿspwpwpÿþsppppppþÿq8wpwpwpw8ÿÿwppppÿÿwppppþsppÇwpwpwpþwpwpÿwpwpwpÿppppÿþppppwpþwpw8ÿq8wpwppppppÿvp÷}ÿww'wpwpwp÷q?wwçw|‡wpþspwpwpwpwpþÿspwpÿsppþspwpwpwvçw|¾0ÿspwpÿspwpwpþsppþppwpþÿpppppwpwpwpwpwpþwpwpwpwpŽÃøwpwp'wwÿ÷}wpwpç8üá8wpwpwpwpþpppüÿp€à8Àpÿø€8€8€8€8€øÀ€8pàÀøààààø øÀŽÿp@à?pþwpwpþpð?wpwpwpÿà?wpppþpçwpwpwpþà?wpÿwppþàppà?pppà?wpþpwpþpð?wpwpwpà?pppþppppwpþpwpw8ÿq8wp€8€8€8€8€ðà?'wr'wrwpà?wpwpwpà?wpwpwpþð?wpwp÷?pàwpwpçpà?wppà?pþppþppðpwpþppwpwpwpþppwpwpŽÃøppwp'wr'wrþppwpþspwpppwpþpwpþðÀð€<àÿð€8€pÀp€8€ðppppppxàp€pàxðÿÿðÿppÿðÿÿðÿààÿÀø€p  pø€ümilkytracker-0.90.85+dfsg/resources/fonts/KANAFONT.8X80000644000175000017500000000400210737746457021320 0ustar admin2admin2~><~~<ffffffÿÿfffff~Àüff>üÿÿÿ<~~<~<~~< þ 0`þ`0ÀÀþþ$fÿf$<~ÿÿÿÿ~<<<<Ìîflþþlþþl8~ð|ü8vî8wn8|l{îþ{80<000<8< <8l8þþ8l~~80~~8p`|þæÆÎþ|xx~~üþ|àþþüþ<þüÆÆÆþþþþÀüþü>~àüÆþ|þþ8pp|þÆ|Æþ||þÆþþü808pp8þþþþ88|þ888|þÆÞÀþ~|þÆþþÆÆüþÆüÆþü>~àÀÀþ~øüÎÆÆþü>~àþÀþþ>~àþþÀÀ>~àÞÆþ|ÆÆÆþþÆÆ<<<<>>þüÆÆÌøüÎÆÀÀÀÀà~>ÆþþÆÆÆÆæöþÞÎÆÆ<~æÆÆþ|üþÆþüÀÀ<~æÆÚÜnüþÆüüÆÆ~þÀüþü~~ÆÆÆÆÆþ|ÆÆÆÆî|8ÆÆÆÆþþÆÆÆÆ||ÆÆÆÆþ~þüÿÿpÿÿ<<000<<`p8<< <<8|îÿÿ08|þÆþ~ÀÀüþÆþü~þÀþ~~þÆþ~|þÆþÀ~~xp|þÆ~þüÀÀüþÆÆÆ88xxüøÀÌÌøüÌÌ|þÖÆÆüþÆÆÆ|þÆþ||þÆþüÀÀ~þÆþ~üþÆÀÀ~ð|ü00üü0<ÆÆÆþ|ÆÆî|8ÆÆÖþ|Æ||ÆÆff~>üøþ|àþpppxxpvþÜ8|îþÿ€€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿÿ€€€Ààðøüþÿÿ?ÿÿÀÀÀÀÀÀÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÀÀÀÀUüüüüüü~~~~~~??????€€€€€€ÀÀÀÀÀÀààààààððððððøøøøøø~~~~~~~~ÿÿ>>**>k><<ÿÿçÃÃçÿÿþ><~~<ffffffÛÛ{>c8ll8†ü~~~<~~<ÿ<~~< þ 0`þ`0ÀÀÀþ$fÿf$<~ÿÿÿÿ~< 06ll66ÿfÿllh<|v¬X4jÜ 0`<00`8```0 pI>6A~ ÿ  0`À€ 6fÆÆÆ|  < 6f 2| 6f f<6f| 0`|F<0lrb<v 02"f< 2f< 0  08`À`0?~ p2f !Y¥ž€~&fþÆÆ 6fìÜÆü 6fÀÀÀ~ 6cÃÃÆü 6`üÀÂü0ü``` 6`ÀÎÂ|&&füÌÌÌ88000LÌÌø2fløÌÆÆ0`ÀÀÀþ"vv^ÖÖÆ"vvVÞÎÆ 6fÆÆî| 6fÆüÀÀ 6fÆÆÜv 6fÆüÆÆ 6`à~|x00p6fÆÆÆ~6fÆÆl86fÆÖÖ|Ãf8gÃ6fÆÌx00>rÆ0bü00```x 00 8 x4vÿ002bf:0`lrbd80`b<&bb<2|`< 0`ø```2f><0 lvff000000à0<ff000X|ÖÖÆ,>fff 6ff<,2"|``$d|f8p``p<| x006fl66f,&fÆÖlÆ,4cÀ6f| x" 0~ 00  0 ÿ8lþÿðÀ€€€€€ÿÿ€€€€€€€€€€€€ÀÀàÿÿÿà€€€€Ààðøüþÿÿ?ÿÿüðàÀÀÀÿÿÿÿÀÀÀÀÀÀÀÀÀÀààðøÿÿÿÿ?ÿÿÀ€€Àÿÿ8ü~ü8~ÿ~?~?<€€€@€ÀpÀÀ`8`Ààxþ><~~<ffffffÛÛ{>c8ll8†ü~~~<~~<ÿ<~~< þ 0`þ`0ÀÀÀþ$fÿf$<~ÿÿÿÿ~<$$$DþDDDþD(~¨|*ü("D"D8D(Vˆˆv   T8þ8T| ~ @8DŠ’¢D8p|øx€€üø8ø€„„„þü€€øø€€€ü‚‚|ü8DD|‚‚||‚‚~  ~~  @€€€@>ü‚‚‚‚‚üþ€€þ€€þþ€€þ€€€>@€Ž‚‚|‚‚‚þ‚‚‚x„ˆàˆ„€€€€€€þø”’’’’’ø„‚‚‚‚‚@€|ü|‚‚‚‚‚‚|‚‚‚‚‚D8’’’’’’ü‚‚D8D‚‚‚D(þ `€þp@@@@@p@ 88(D‚ÿ |~‚~€€ü‚‚‚ü~€€€~~‚‚‚~|‚þ€~<@ø@@@@|‚‚~ü€€ø„‚‚‚8ð€€„ˆðˆ„ ü’’’’ø„‚‚‚|‚‚‚|ü‚‚ü€€~‚‚~ü‚€€€|€xø| ‚‚‚‚|‚‚‚D8’’’’ü‚D8D‚‚‚‚~üþ8@þ0` `d˜8lÆÆþÿ€€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿÿ€€€Ààðøüþÿÿ?ÿÿÀÀÀÀÀÀÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÀÀÀÀUüüüüüü~~~~~~??????€€€€€€ÀÀÀÀÀÀààààààððððððøøøøøø~~~~~~~~ÿÿ<~ÿÿÿÿÿ<~ÿÿÿBfZBBÀÀÀÀÀÀÀØØØØØØØÛÛÛÛÛÛÛ```````lllllllmmmmmmm€€€€€€€°°°°°°°¶¶¶¶¶¶¶<<øø66öö66666666666þö66666öþ6666þøøøÿÿÿÿ666676666670??0766666÷ÿÿ÷66666707666ÿÿ66÷÷666ÿÿ6666ÿÿÿÿ6666666??6666666ÿ666ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿððððððððÿÿÿÿvÜÈÜvxÌøÌøÀÀüÌÀÀÀÀþllllüÌ`0`Ìü~ØØØpffff|`ÀvÜü0xÌÌx0ü8lÆþÆl88lÆÆllî0|ÌÌx~ÛÛ~ ~ÛÛ~`À8`ÀøÀ`8xÌÌÌÌÌÌ~~~~~`00`ü0`0üØØp~vÜvÜ8ll8 ìl<Xllllp˜0`ø<<<<milkytracker-0.90.85+dfsg/resources/fonts/J-FLUX.8X80000644000175000017500000000400210737746457021064 0ustar admin2admin2~¥½™~~ÿÛÿÃçÿ~lþþþ|88|þ|88|8þþ’|8|þ|8|<<ÿÿçÃÃçÿÿþ><~~<ffffffÛÛ{>c8ll8†ü~~~<~~<ÿ<~~< þ 0`þ`0ÀÀÀþ$fÿf$<~ÿÿÿÿ~<000000lllllþlþll~À|üfÌ0fÌ8l8vÜÌv 0```0`00`f<ÿ`ÀÀÀ`>üÆÆÆÆÆüþÀÀþÀÀþþÀÀþÀÀÀ>`ÀÎÆÆ|ÆÆÆþÆÆÆ|ÆÌØðØÌÆÀÀÀÀÀÀþüÖÖÖÖÖÖøÌÆÆÆÆÆ`À|ü~ÆÆÆÆÆÆ|ÆÆÆÆÆl8ÖÖÖÖÖÖüÆÆÆ|ÆÆÆÌÌÌx000þ 0`þx`````x`0 xxþ><~~<ffffffÛÛ{>c8ll8†ü~~~<~~<ÿ<~~< þ 0`þ`0ÀÀÀþ$fÿf$<~ÿÿÿÿ~<<<lll(|(|(~À|üÆÌ0fÆ8l8vÜÌv00`0```0`00`f<ÿ`<|ÆÌ0fÆ8lhvÜÌv0 000 0 0f<ÿ 8 0`0 ~~0  0fff~fff~~ff<æflxlfæð```bfþ‚ÆîþÖÆÆÆæöÞÎÆÆ8lÆÆÆl8üff|``ð8lÆÆÆl<üff|lfãÃÃff<<ÆÆÆÖþîÆÃf<ìvf`ð>`<|> ffff;fff<ckk66c66cfff<p~L2~pppÿÿþÀÀþþþþþþ|88|þmilkytracker-0.90.85+dfsg/resources/fonts/ZIRCFONT.8X80000644000175000017500000000400210737746457021355 0ustar admin2admin2~¥½™~~ÿÛÿÃçÿ~lþþþ|88|þ|88|8þþ’|8|þ|8|<<ÿÿçÃÃçÿÿþ><~~<ffffffÛÛ{>c8ll8†ü~~~<~~<ÿ<~~< þ 0`þ`0ÀÀÀþ$fÿf$<~ÿÿÿÿ~<Dl,"þ&ä~D~˜|6ü ‚Æ 0bÆ8dl8~˜ä0`0`@`0p  0 6øhÌx0>ø 0`Àx –²æÌx0pÀÀÂÆ||Æ"&lø>`@ü@`>^ð@xà``8LÀœÆf<„„þÌDD<<>æ<FLXpxÌB@@ÀÀ@^üÄì¾–’‚‚„ÄÆæ¦²ž0 >>>>>>~øøøÿÿÿÿ6667666666670??0766666÷ÿÿ÷6666670766ÿÿ666÷÷66ÿÿ666ÿÿÿÿ6666666??6666666ÿ6666ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿððððððððÿÿÿÿw˜˜w6füÆÆüÀþb`````ÿffffþb00bþ?fÆÌx333>0ðÿ<ÀþÀ>~ÃÃÃÃÿÿÿ00ü00üp pþ0`0þØp~vÜvÜ``0x0 ìl8ØìÌÌð0Àð<<<<milkytracker-0.90.85+dfsg/resources/fonts/IDC-MicroKnight.8X80000644000175000017500000000400010737746457022730 0ustar admin2admin2ll$llþlþll|Ð||`–|0lÒ pØpöÜØ|0```00 0l8þ8l~| 0`ÀxÌÞöæ|8~|<`ÀÀþ<FÆ|0lÌþ øÀüFÌxpÀüÆÆÌxþ xÌ|ÆÆÌxxÌÆÆ~0`0||0 0|Æ<008lÞöÞÀffÆÆÆ~xÌüÀÆ|8l`x````~ÆÆÆ~|ÀøÌÆÆÆÆ8~  L8ÀÌØðØÌÆ8~ÄîþÖÆÆøÌÆÆÆÆxÌÆÆÆ|øÌÆÆÆüÀ>fÆÆÆ~üÆÀÀÀÀxÀ|Æ|0|0002ÆÆÆÆÆ~ÆÆll88ÆÖþ|lDÆl88lÆÆÆÆÆ~|þ 0`þ 0 0 08lÞöÞÀf<þÀÀþþþþþþ|88|þmilkytracker-0.90.85+dfsg/resources/fonts/EK-MAC.8X80000644000175000017500000000400210737746457021014 0ustar admin2admin2|‚ª‚ºD8|’’þºD8lþþþ|88|þ|888ÖþÖ88|þþ’8<<<~fBBBf~$$$~fZZZf~ 666æÜU)U)Uÿ`x~x` <ü< ||ffffff>ZZZ:F<~~8||8þ8|þþ|88x8```~(lîl(8|þþ|8000000ll((|(|(  00Zf< 0`0 ~~`0 0`f>``|fff|fff>ff>F<``|ffff8  L8``ff|ff8üÖÖÖÖ|fffffff>|ff``F<~ 0~ 0 0 00Z $f~€€€€€€€ÿþ€€€€€€€€€€€€€€€ÿþ€Ààðøüþÿÿ??àÏÐÐÐÐÿÿÿüþó ÐÐÐÐÐÐÐÐ ÐÐÐÐÏà?ÿÿÿ óþüÐ À À Ð Uü~ü~ü~~~~~~~~?~?~????ÀÀÀ€ð€ð€ðÀüÀüÀüàþàþàþðþðþðþ<<<<<<<<ÿÿÿ<ÿÿÿ~ÿÿÿ<~ÿÿÿ|jjààààààüüüüüüÿÿÿÿÿÿààààààüüüüüüÿÿÿÿÿÿÀÀÀÀÀÀøøøøøøÿÿÿÿÿÿ<<<<ðø666ææ6666666666üæ66666æü666üøððÿÿÿÿ66676666666300366666ãÿÿã6666630366ÿÿ666ãã66ÿÿ666ÿÿÿÿ66666666666666ÿ6666ÿÿðÿÿÿÿÿÿÿÿÿÿÿÿððððððððÿÿÿÿ6ll6`~`>€á Ĉ#milkytracker-0.90.85+dfsg/resources/fonts/DX-FUTUR.8X80000644000175000017500000000400210737746457021335 0ustar admin2admin2~¥½™~~ÿÛÿÿÃç~îþþ|88|þ|8<ÿÿJ8|þþ’8<ÿÿçÃçÿÿÿ~~~~~ÿ~~ÿ `ÿ` ÀÀÀÿ$fÿf$8|þþ|80006lØ6666~À|ü0fÌ3f8l8mÆÎ{   `000000`T8þ8T~0~0 0`ü0000`0`0~~0 0|Æ00~ÃÛÛÞÀ|>ffþÆÆÆ>ffþÆÆü>f`ÀÀÆü>ffÆÆÆü>``þÀÀþ>``þÀÀÀ>f`ÎÆÆücccþÆÆÆ  ÌxflxðØÌÆ```ÀÀÀþf~~ÖÖÆÆfv~ÞÎÆÆÆ~``|ÆÆÆüfÆ~|ÆÀÀÀ<`<| >ffÆÆ|ccfl8ÖÖÖÖüÆl8lÆccÆ~üþ 8`þ 0 `0000`pÛ(Dþÿ€€€€€€€ÿÿ€€€€€€€€€€€€€€€ÿÿÿ€€€Ààðøüþÿÿ?ÿÿÀÀÀÀÀÀÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀÀÿÿÿÿÿÿÀÀÀÀªüüüüüü~~~~~~??????€€€€€€ÀÀÀÀÀÀààààààððððððøøøøøøªÖªÖªÖªÖÿÿ8|ÿÿþÿÿ8|þÿÿÃçÿÛÃÀÀÀÀÀÀÀØØØØØØØÛÛÛÛÛÛÛ```````lllllllmmmmmmm€€€€€€€°°°°°°°¶¶¶¶¶¶¶<<øø666öö6666666666þö66666öþ666þøøøÿÿÿÿ6667666666670??0766666÷ÿÿ÷6666670766ÿÿ666÷÷66ÿÿ666ÿÿÿÿ6666666??6666666ÿ6666ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿððððððððÿÿÿÿw˜˜w6füÆÆüÀþb`````ÿffffþb00bþ?fÆÌx333>0ðÿ<ÀþÀ>~ÃÃÃÃþþþ~~p pþ0`0þØp~vÜvÜ~~~~~ÿ~~ÿ `ÿ` ÀÀÀÿ$fÿf$(lÖþþ|8000 0f"HlþlþlH|ÖÐÐ|–|s–¬X6jÌ8de>|Äz0  À`00àT8þ8T~p~€ 0`À0ðÿ<þ><~~<ffffffÛÛ{>c8ll8†ü~~~<~~<ÿ<~~< þ 0`þ`0ÀÀÀþ$fÿf$<~ÿÿÿÿ~<88$DþDDDþD8DBB~BBx„„ø„„ø<@€€€@<ü‚‚‚‚‚ü|€€ø€€|<@@x@@@x„€˜„„xBBBB~BB88 8@DHPpHD@@@@@@|XtTTTTTXdDDDDD8DDDDD8""""c>""""ã0,# Ä4 À@@@@À<<<<<<<<<<<<<~~<<~~<<~~~~<<~~~~<66÷ÿÿ÷66666707666ÿÿ66÷÷666ÿÿ6666ÿÿÿÿ6666666??6666666ÿ666ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿððððððððÿÿÿÿvÜÈÜvxÌøÌøÀÀüÌÀÀÀÀþllllüÌ`0`Ìü~ØØØpffff|`ÀvÜü0xÌÌx0ü8lÆþÆl88lÆÆllî0|ÌÌx~ÛÛ~ ~ÛÛ~`À8`ÀøÀ`8xÌÌÌÌÌÌ~~~~~`00`ü0`0üØØp~vÜvÜ8ll8 ìl<Xllllp˜0`ø<<<<milkytracker-0.90.85+dfsg/resources/fonts/IDC-Topaz2.0.8X80000644000175000017500000000400011221230771021777 0ustar admin2admin2lllllþlþll>`<|f¬Ø6jÌ8lhvÜÎ{0 000 0 0f<ÿ 80`~~``fff~fff<<f<ÆÌØðØÌÆ``````~ÆîþÖÆÆÆÆæöÞÎÆÆf>``|fff|<```<>fff>ff><``|ffff x``flxlf ìþÖÆÆ|ffffff>|f```<`<|00|000ffff>fff<ÆÆÖþlÆl8lÆfff<0~ 0~pppÿÿþÀÀþþþþþþ|88|þmilkytracker-0.90.85+dfsg/resources/fonts/J-TERMO.8X80000644000175000017500000000400210737746457021174 0ustar admin2admin2~¥½™~~ÿÛÿÿÃç~îþþ|88|þ|8<ÿÿJ8|þþ’8<ÿÿçÃçÿÿÿ‡%ÈaƒU›)`€€€—80•™a`€€˜ €€€‘a•€€ƒZ› €€€– •€‡%(€ˆ €€€‘a•%ÈaƒWˆ =(=(€–(•a€€€aa€‘a•‡%È€ƒZ‹ 80(80(€–•a%(€ˆ €€€‘a•1ÈaƒY‹)€€€–0•a‡%(€ˆ €€€‘a•‡%ÈaƒZ‹ aa€– •a1(€ˆ €€€‘a•‡%ÈaƒWˆ €€€–(•a‡%(€€€€€‘a•€aƒZ€€€€–•€‡%(€€€€€‘a•%ÈbaƒU‹)8080€–0•a€€ˆ €€€‘a•€€ƒZ‹ €€€– •€‡%(ƒ\ˆ €€€‘a•%ÈaƒWˆ €€€–(•a€€€€€€‘a•‡%È€ƒZ‹ =00=00€–•a%(€ˆ €€€‘a•1ÈaƒY‹)€€€–0•a‡%(€ˆ €€€‘a•‡%Èaƒ\‹ €€€– ua1(ƒZˆ €€€‘au‡%ÈaƒWˆ ‡?0‡?0€–(ua‡%(€€€€€‘au€aƒZ‹ €€€–uˆ ‡%(€ˆ €€€‘au _‡"ÈaƒU›)`A0A0€—:0s™a`€€˜ €€€‘as€€ƒZ› €€€– s€‡"(€ˆ €€€‘as"ÈaƒWˆ <(<(€–(sa€€€aa€‘as‡"È€ƒZ‹ :0:0€–sa"(€ˆ €€€‘as.ÈaƒY‹)aa€–0sa‡"(€ˆ €€€‘as‡"ÈaƒZ‹ €€€– sa.(€ˆ €€€‘as‡"ÈaƒWˆ €€€–(sa‡"(€€€€€‘as€aƒZ€€€€–s€‡"(€€€€€‘as"ÈbaƒU‹)€€€–0sa€€ˆ €€€‘as€€ƒU‹ €€›)`– s€‡"(ƒ\ˆ €€˜ ‘as"ÈaƒWˆ ‡50‡50ˆ –(sa€€€€€€‘as‡"È€ƒY‹ €€‹)–sa"(€ˆ €€ˆ ‘as.ÈaƒY‹)80 80 ˆ –0sa‡"(ƒZˆ €€€‘as‡"Èaƒ\‹ €€€– Sa.(ƒYˆ €€‹)‘aS‡"ÈaƒWˆ :0:0ˆ –(Sa‡"(€€€€ˆ ‘aS€aƒY‹ €€‹)–Sˆ ‡"(ƒYˆ €€ˆ ‘aS |‡)ÈaƒU›)`<0<0‡D—50s™a`€€˜ €€€‘as€€ƒZ› €€‡A– s€‡)(€ˆ €€€‘as)ÈaƒWˆ :0:0‡<–(sa€€€aa€‘as‡)È€ƒZ‹ <0<0‡C–sa)(€ˆ €€€‘as5ÈaƒY‹)€€‡?–0sa‡)(€ˆ €€€‘as‡)ÈaƒZ‹ €€‡<– sa5(€ˆ €€€‘as‡)ÈaƒWˆ aa‡:–(sa‡)(€€€€€‘as€aƒZ€€€‡<–s€‡)(€€€€€‘as)ÈbaƒU‹)<0<0‡D–0sa€€ˆ €€€‘as€€ƒZ‹ €€‡A– s€‡)(ƒ\ˆ €€€‘as)ÈaƒWˆ aa‡<–(sa€€€€€€‘as‡)È€ƒZ‹ ‡D0‡D0‡D–sa)(€ˆ €€€‘as5ÈaƒY‹)€€‡F–0sa‡)(€ˆ €€€‘as‡)Èaƒ\‹ €€‡H– ra5(ƒZˆ aa€‘ar‡)ÈaƒWˆ C0C0‡D–(ra‡)(€€€€€‘ar€aƒZ‹ €€‡A–rˆ ‡)(€ˆ aa€‘ar …‡$ÈaƒU›)`?0 ?0 ‡C—70…™a`€€˜ €€€‘a…€€ƒZ› €€‡?– …€‡$(€ˆ €€€‘a…$ÈaƒWˆ :0:0‡<–(…a€€€aa€‘a…‡$È€ƒZ‹ <0<0‡A–…a$(€ˆ €€€‘a…0ÈaƒY‹)€€‡>–0…a‡$(€ˆ €€€‘a…‡$ÈaƒZ‹ aa‡:– …a0(€ˆ €€€‘a…‡$ÈaƒWˆ :(:(‡7–(…a‡$(€€€a€‘a…€aƒZ€aa‡:–…€‡$(€€€€€‘a…$ÈbaƒU‹)<0<0‡C–0…a€€ˆ €€€‘a…€€ƒZ‹ €€‡?– …€‡$(ƒ\ˆ €€€‘a…$ÈaƒWˆ aa‡<–'…a€€€€€€‘a…‡$È€ƒZ‹ :0:0‡A–…a$(€ˆ €€€‘a…0ÈaƒY‹)€€‡>–,…a‡$(€ˆ €€€‘a…‡$ÈaƒY‹ aa‡:–ƒa0(ƒ\ˆ €€€‘aƒ‡$ÈaƒWˆ ‡<0‡<0‡<–$ƒa‡$(€€€€€‘aƒ€aƒY‹ €€‡>–ƒˆ ‡$(€ˆ €€€‘aƒ n‡%ÈaƒU›)`€€‡A—8(•™a`€€˜ €€€‘a•€€ƒZ› €€‡=–•€‡%(€ˆ €€€‘a•%ÈaƒWˆ =(=(‡8–!•a€€€aa€‘a•‡%È€ƒZ‹ 80(80(‡?–•a%(€ˆ €€€‘a•1ÈaƒY‹)€€‡<–$•a‡%(€ˆ €€€‘a•‡%ÈaƒZ‹ aa‡8–•a1(€ˆ €€€‘a•‡%ÈaƒWˆ €€‡:–•a‡%(€€€€€‘a•€aƒZ€€€‡<–•€‡%(€€€€€‘a•%ÈbaƒU‹)8080‡A– •a€€ˆ €€€‘a•€€ƒZ‹ €€‡=–•€‡%(ƒ\ˆ €€€‘a•%ÈaƒWˆ €€‡8–•a€€€€€€‘a•‡%È€ƒZ‹ =00=00‡C–•a%(€ˆ €€€‘a•1ÈaƒY‹)€€‡?–•a‡%(€ˆ €€€‘a•‡%Èaƒ\‹ €€‡:–ua1(ƒZˆ €€€‘au‡%ÈaƒWˆ ‡?0‡?0‡C–ua‡%(€€€€€‘au€aƒZ‹ €€‡D–uˆ ‡%(€ˆ €€€‘au V‡"ÈaƒU›)`A0A0‡A—:s™a`€€˜ €€€‘as€€ƒZ› €€‡=–s€‡"(€ˆ €€€‘as"ÈaƒWˆ <(<(‡:–sa€€€aa€‘as‡"È€ƒZ‹ :0:0‡?–sa"(€ˆ €€€‘as.ÈaƒY‹)aa‡<–sa‡"(€ˆ €€€‘as‡"ÈaƒZ‹ €€‡8–sa.(€ˆ €€€‘as‡"ÈaƒWˆ €€‡5–sa‡"(€€€€€‘as€aƒZ€€€‡8–s€‡"(€€€€€‘as"ÈbaƒU‹)€€‡A–sa€€ˆ €€€‘as€€ƒU‹ €€‡=›)`€‡"(ƒ\ˆ €€€˜ "ÈaƒWˆ €€‡:ˆ a€€€€€€€‡"È€ƒY‹ €€‡?‹)a"(€ˆ €€€ˆ .ÈaƒY‹)€€‡<ˆ a‡"(ƒZˆ €€€€‡"Èaƒ\‹ €€‡8€a.(ƒYˆ €€€‹)‡"ÈaƒWˆ €€‡:ˆ a‡"(€€€€€ˆ €aƒY‹ €€‡<‹)ˆ ‡"(ƒYˆ €€€ˆ ü‡)ÈaƒU›)`€€› ‡A0™a`€€˜ €€€a€€ƒZˆ €€€€€‡)(‡U )(€€‰a €)ÈaƒWˆ €€€€a€€ˆ €€˜ 0€‡)È€€)€€€€a)(‡W ˆ €€€€5Èa€ˆ €€€€a‡)(ƒZ)€€ˆ €‡)ÈaƒWˆ €€€€a5(€ˆ €€˜ 0€‡)ÈaƒY)€€€€a‡)(‡W ˆ €€ˆ €€a€ˆ €€€€€‡)(‡Y )€€˜ 0€)Èbaƒ\ˆ €€€€a€€ˆ €€€€€€ƒU‹)€€ˆ €€‡)(€ˆ €€€€)ÈaƒWˆ €€‡C0€a€‡U )(€€a€‡)È€ƒY‹)€€€€a)(‡W ˆ €€€€5Èa€ˆ €€€€a‡)(‡Y )(€€€€‡)ÈaƒWˆ €€€‡D0a5(€ˆ €€€a‡)ÈaƒY‹)€€€€a‡)(‡W ˆ €€€€€a€ˆ €€€€ˆ ‡)(‡Y )(€€€€ í‡$ÈaƒU›)`€‡F0€€™a`€€˜ €a€€€€ƒZˆ €€€€€‡$(‡U )(€€€€$ÈaƒWˆ €€€€a€€ˆ €€€€‡$È€€)€€€€a$(‡W ˆ €€€€0Èa€ˆ €€€€a‡$(ƒZ)€€€€‡$ÈaƒWˆ €€€€a0(€ˆ €€€€‡$ÈaƒY)‡H(€€€a‡$(‡W ˆ a€€€€a€ˆ €€€€€‡$(‡Y )€€€€$Èbaƒ\ˆ €€€€a€€ˆ €€€€€€ƒU‹)€€€€€‡$(€ˆ €€€€$ÈaƒWˆ €€€€a€‡U )(€€€€‡$È€ƒY‹)€€€€a$(‡W ˆ €€€€0Èa€ˆ €€€€a‡$(‡Y )(€€€€‡$ÈaƒWˆ €€€€a0(€ˆ €€€€‡$ÈaƒY‹)€‡M(€€a‡$(‡W ˆ €a€€€a€ˆ €€€€ˆ ‡$(‡Y )(€€€€ û‡%ÈaƒU›)`€€‡K0€™a`€€˜ €€a€€€ƒZˆ €€€€€‡%(‡U )(€€€€%ÈaƒWˆ €€€€a€€ˆ €€€€‡%È€€)€€€‡D(a%(‡W ˆ €€€a1Èa€ˆ €€€€a‡%(ƒZ)€€€€‡%ÈaƒWˆ €€€€a1(€ˆ €€€€‡%ÈaƒY)€€€€a‡%(‡W ˆ €€€€€a€ˆ €€€€€‡%(‡Y )€€€€%Èbaƒ\ˆ €€€€a€ƒU‹)€€€€€€‡U )(€€€€€‡%(ƒU‹)€€€€%ÈaƒWˆ €€€€a€‡U )(€€€€‡%È€ƒY‹)€€€‡D0a%(‡W ˆ €€€a1Èa€ˆ €€€€a‡%(‡Y )(€€€€‡%ÈaƒWˆ €€€€a1(€ˆ €€€€‡%ÈaƒY‹)‡I0€€€a‡%(‡W ˆ a€€€€a€ˆ €€€€ˆ ‡%(‡Y )(€€€€ þ‡"ÈaƒU›)`€‡A0€€™a`€€˜ €a€€€€ƒZˆ €€€€€‡"(‡U )(€€€€"ÈaƒWˆ €€€€a€€ˆ €€€€‡"È€€)€€€€a"(‡W ˆ €€€€.Èa€ˆ €€€€a‡"(ƒZ)€€€€‡"ÈaƒWˆ €€€€a.(€ˆ €€€€‡"ÈaƒY)€€€€a‡"(‡W ˆ €€€€€a€ˆ €€€€€‡"(‡Y )€€€€"Èbaƒ\ˆ €€€€a€€ˆ €€€€€€ƒU‹)€€€€€‡"(€ˆ €€€€"ÈaƒWˆ €‡A(€€a€‡U )(€a€€‡"È€ƒY‹)‡?0€€€a"(‡W ˆ a€€€.Èa€ˆ €€‡D(€a‡"(‡Y )(€€a€‡"ÈaƒWˆ €€€‡C0a.(€ˆ €€€a‡"ÈaƒY‹)€€€€a‡"(‡Y )(€€€€€aƒY‹)€‡A0€€ˆ ‡"(ƒY‹)€a€€ E‡)Èa\ €€€€—5s™a`€\ €€€€‘as€€\ €€€€–s€‡)‡\€€€€‘as)ÈaZ €€€€–sa€Z €€€€‘as‡)È€Z €€€€–sa)‡Z€€€€‘as5ÈaU €€€€–sa‡)U €€€€‘as‡)ÈaU €€€€–sa5‡U€€€€‘as‡)Èa\ €€€€–sa‡)\" €€€€‘as€a\# €€€€–s€‡)‡\$€€€€‘as)Èba\& €€€€–$sa€\' €€€€‘as€€\) €€€€–s€‡)!‡\*€€€€‘as)ÈaU+ €€€€–"sa€U- €€€€‘as‡)È€U. €€€€–sa)#‡U0€€€€‘as5ÈaƒY›)`€€€–*sa‡)$ƒZ˜ €€€‘as‡)Èaƒ\‹ €€€–ra5%ƒYˆ €€‹)‘ar‡)ÈaƒWˆ ‡:0‡:0ˆ –&ra‡)'€€€€ˆ ‘ar€aƒY‹ €€‹)–rˆ ‡)(ƒYˆ aaˆ ‘ar ¾‡)ÈaƒU›)`€€‡A› ™a`€€˜ €€€€€€ƒZˆ €€€€€‡)‡U )(€€€‰a )ÈaƒWˆ €€„€a€€ˆ €€€˜ 0‡)È€€)€€€€a)‡W ˆ €€€€5Èa€ˆ €€„€a‡)€)€€€ˆ ‡)Èa‡Wˆ €€€€a5€ˆ €€€˜ 0‡)Èa€)€€„€a‡)‡Wˆ €€€ˆ €a€ˆ €€€€€‡)€)€€€˜ 0)Èba‡Wˆ €€„€a€€€€€€€€€€€€€€ˆ €‡)!‡W€€€€€)Èa€€€€€€a€€€€€€€‡)È€€€€€€€a)#€€€€€€5Èa€€€€€€a‡)$€€€€€€‡)Èa€€€€€€a5%€€€€€€‡)Èa€€€€€€a‡)'€€€€€€€a€€€€€€ˆ ‡)(€€€€€€ u‡)Èa˜€€€€€™a`€€€€€€€€€€€€€€€€‡)€€€€€€)Èaˆ€€€€€a€€€€€€€‡)È€€€€€€€a)€€€€€€5Èaˆ€€€€€a‡)€€€€€€‡)Èa€€€€€€a5€€€€€€‡)Èaˆ€€€€€a‡)€€€€€€€a€€€€€€€‡)€€€€€€)Èbaˆ€€€€€a€€€€€€€€€€€€€€€€‡)!€€€€€€)Èaˆ€€€€€a€€€€€€€‡)È€€€€€€€a)#€€€€€€5Èaˆ€€€€€a‡)$€€€€€€‡)Èa€€€€€€a5%€€€€€€‡)Èaˆ€€€€€a‡)'€€€€€€€a€€€€€€ˆ ‡)(€€€€€€ ”)È@€ƒY›)`€€€€™a ˜ €€€€)È€€ˆ €€€€a€€)€€€€‡)È€€ˆ €€€€a€€ˆ €€€€5È€€€€€€€a€€€€€€€‡)È€€)€€€€a€€ˆ €€€€‡)È€€ˆ €€€€™a €€€€€(@  0}– P P P Z d n x ‚ *𾞠02`  ëéá×ÚÛÜçþ,'$'%!ìåÝÛßæãåïý! ! ÷èäâáääçêîöÿûíèææäâæêìïöÿ ÿóïëæææçæéîñõú ÿöòîìèæçèéëîò÷úÿ  þúöñíëëéééíïñöúþ  ýøõñîìëìììïòõøü  ýúöòðîíííïðòôùûÿ  ûúöôòññòòóöøúþ  þûøöóòñññóôõøûý  þûùöôóñòòóôöùûý   ÿüù÷õôôòóôõ÷ùüþ ÿüú÷öôô raina(@  }(– P P P Z d n x ‚ 𾞠02° ÿøóííñíëûþú)&%$úÔÙÜÙÛßë#%!ÿãßâáàßâçõ  éçæáäåäæìòù èèèãäææèëðõþ  þòíêèèåäèììñõüÿ  þ÷òðëéèéèêíñóøý  ÿúôðîëêééëëïò÷úÿ  üøõñïííìíïñôöû  þúöôñðîïïðñô÷úý  üú÷ôòòñðñóôöùüÿ  üû÷õôóñòòóõöúýÿ  ýùøöôòóòòóõøùüÿ  ýúøöõóóóóôõ÷úüþ (@ ¬ €é O €ç d €å û €ä µ €â üùù¹bÁæFëÚ1Ðã-©÷C(ÎÖ6üèýêô,ãä ôûøðåüË#ç2×ùñ+Ç#Öú ú§8)Ìà< ÃÑ^4™¹i´ænõÃö<÷ þèêèß.Ìä-ßÊ?/õÞ òðøÈ×HåÍ FÏ×RìÌ N½Òp1 òBÌ- !ÂÙsÔ©)(ßÓ ï$ïô êùóBçÂ'è!ÜíöE¨ÝXý¤1=Ëô2×Ý. ¨ÿVøS)¿áE9¡¸j (NŸMçÚ »-Þó ÷þûêú ïöìù=פ]@¼´YÙòÀ:û«NÍÕ)ìí0íÛíê4×ýí1´ãbÎ ÒãR1·Ëkü½Øû ûç>ÐÜM&•ü>ýøÍôèúÕö&%ÄÖ-1ìÎ 3ðÖî:êøHöÞÉ7Ðâ95ÆÙKéÄ(Ùý ò÷÷ïÚBíÃæêâñ$Ûò)æûãÿ!ìó"ÂõYïµ1(ñÉþèáï? ¿á?Íð"êâ(èïÛ íüþ àôöãûîëÖ2Ø îîþ ðê ×ß>æçô,$ãù ê úíóòñü ñù× #ûðì ôïô öà" Ûû ôôþñ÷ ñóú þøþ ýõüüö ýíú ðë õ ïôõ üîóùìýüïðþïúÿîÿøþ ù ûöïîã÷ï çøüòî ñúûù ññ÷õ ò÷úúüù úùúüùÿþÿþÿøüùøøüÿýþüÿýûýüþýÿýþüýûýþþÿþþÿþÿÿÿÿÿÿÿüÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿþüþ ‘¯î›AçÚ åûíû)ñýîÿ$íñ ÷!Ôíò"ùíì-òî:Öù óòîõ3×Ý+%Óäö"5äðÉ /Ø ùõ×Eäòì=óÆÀw£KÍä åî(Ã-÷Ì 6Ñä"=é²#ûàÛ,%ÎÜ *öÇEÖã- × Ûælß™ U¤, žIÎîÕJÖËøÿî #ó°Wû¤(àå&ÜÕR(ÄëÑ0õ ñäè(ã ÛIÇÃ66صCöêãWý²6Ø ôåD®÷)öíýÜ8»Wã®Kóõóíâ!ÔÈeÅÈ'0Êîï Ûÿ ù þÏú2þ²7Þ­.-æÍøõ ÿ ß1¯MÙð!óÿåöçþô"àÐ-.í» 9%©ãWÜû òèè2!ÁÜüË)ÐÞö'øö ýÑö4àî'Ùà Î F¼ì0 èæ éï%ãð ïýåäõ  þÛì õü üðôéò1É4 Ëæ0äì!Ùá ,çß çñè%Êú"õ íÞúóáòæÊò5öÕ)Ýíñ&ïèÜþ þâòá,å·.:ãÅ"'ÔÚ*ùþú þÿ õþåõï5âÛ-íÝéî%ßì6ùùïþùïû÷ïò ääãùëá  Û'ûéóÿ Õÿ#äùþ ôâ Ýó áñõôôß %Ûòåúú-ìß %ôâðîìùýå òí ó÷üïúõý éã(ßâ$ìÒ*æç åéôùüÿó÷üûñ ñø üýþ÷üÿþòøÉ 5Øä ïïýøñ ûóüõç&âìðì øçÿúýôøéòøøú ýüí ùåáçôîþ òûýýí ÷ðûìñÖ!ßð ñôø þúÿéøü÷ øøöþ Ýù Ëÿ-ëÊ0æÖ *üÖüôÚ &õÜ'èëùñðöôçðòä$ôíüïéñö þô÷ ü ïðòõú ýñ ùëûôùð÷ öÌ1ô×ÿ* æôøí õï ëú öñ üðüöúî ô÷ÿüùù ùòüü öúõûùô ôòòñ íñ ôðö û úø÷ýéüõàöéøõ÷ôûðï õ øûÿùîÿô îüìøè üêþòõ òôþîôðèüò êñíõ#õå þöýúøüÞóîþ ÷æ(ôßþòìëò úò þð ï ýõ õð ó ÷ ÷û õøÿôþ þú ìÿüöû í÷ó íÿ ýùúÿúÿ÷ûýýúÿ÷ûëûüÿúô úçýýöÿýñÿõ òêúüþùúúò øûüö ï ìü ëûõõøýðù ü÷ý òúüì òô üõ õó ó÷ý úö ûóýçóíéóá ÿè úÿúø ö þë üî÷ öþ ÷ùýô øõÿ ûû÷óòü óýüñùñ üÿö ïõ óõ ûõüÿ êö ýøúÿø÷ïöùûüúüù ýùÿþ÷ô ûü÷ýüîÿùâ%Óñõ ôóøé÷'ê÷þþõçøîì úóý öæ ìôÿþûùÿ÷ý÷÷óÿÿì ëïò ðð ûýþöóÿ!ùÙ'êôôú û÷ÿ÷ñ$ùûýóþþ úû ôù úõ õí ð öõ ýñä ÿâêí ýùýòüöîÿýðòú úòÞôö úûìò÷ùÿ êò ýÿø÷ýúñþ ùáüâùù ôýï åïïýùééû ï ìÿúóô ù ìöúý èëþüì ýíúÙ ýøùêýó éüùüõ ôàíï" Þôùç"×û#Ú(óÞôé õó ôû úòöùûöõòõö òýóÿñïü ÷åûù ÿüøùïûïýøùþ"ÿãþ õÿ ö÷ ûùúà4òÝéùÿéüæðöûó þôí üú÷ñõö êð ò÷üÿö ü÷ûöì ìù ëñåÿ õ÷ ùýýþóÿ øüþ ùôûùñùç÷üþù ý õö þé ôÿ÷ôø ðú øüÿûð ùîþø ÿþöû íûïú ÷ï ÿøÿùÿ ð ùù÷ë÷ÿþþùú òñ øúþýýøþ÷þüñ öìü÷ôýüþüù÷ñ ÷ù÷õÿþöúþý÷ôýú÷ ìöòóÿù÷ÿ÷ûôþûóô ëþïúôü ú÷ýöýììú øÿö úõþ ô úÿýþü óõù ùñ ÷ùÿú ýýôþúûúúÿüüÿöýþùý õô ûøüþûøøø ýòÿùþ ùúûüüúû üøÿ÷û úô óø üìôûüþý þùþúþþûÿþüý÷úñ÷ýö ôøúÿ þù öþÿùýýþõ òùüìøö ðø ÷úþ öýýøøûþûöýøýüûÿþüüõ õð ñø óù üñ øö þùúÿûýþþþþÿþÿüúüýþÿúûÿÿûü úÿûÿþùýûüÿÿûüÿûü ýüøõ ÿùøú ÷ùüÿõùÿüýþùýþøöùüûþüûüÿþýÿýÿþüÿýüþþþýþüüýýúü÷ýüúþÿûÿÿþüþûÿÿÿþúúûýüÿþÿýþüýüûÿøýþÿþûýÿúúþüþþùúÿûÿÿÿùùþûÿúúüÿþüÿÿýýþÿüÿûþüþüþûûþýýÿüÿúýÿýÿýþÿúýùÿÿþüùñýó ôýôþüðø øõ íúû ñø øñÞôì íðüáùíöìóúÝ õòÿïþùóúö÷úôô#îý ú íõ ÷÷þýöûÿøý íø ÿúþ üòü÷ø üûøêûúüúþþïõ ç úùòü ìþñùë öüþûû ñþüõòÿüöùú÷þûýûòö ôö öýóú ð÷ý÷ôü ÿùû üÿýûüúúüóöú þ÷þþþúÿõÿóûüû úùÿö ùóöþÿþùùüûúúýøþõþ ûøÿÿùýþûùþüúüúýúþþÿþýþúÿÿûÿüÿþþýþýþûüÿûûÿÿÿþÿÿüþþþÿþúüúüÿýÿÿþüþüÿûÿþýûþûÿþýüýþþþÿÿüþýþýÿüþþÿýýÿÿþÿýÿþüûýÿýÿþÿþÿÿýÿüÿþÿýþþþüÿÿÿüþþÿýÿÿþÿþÿþÿþýÄ)ÿ¬÷H63Ñó 'ÂnêÌú ÞÎ&Ïõéó 9Á$ãõ ííA×´.µ_íù<§ÿ3øÕ×@ò»ã*.Îöìí*ñ×›_ð&¨A)åÜéK´ðEGÏ ¼=Ù²F¬:þîÏé I ÷4þºßýx„ùR/“îÁnóÿ5òÚ,ˆIEÄðÏ3ö1ÏFÍ)ÞÜ2ÿêå]ÞÖò8¼Góè  E:ÍÒ'.Ò è =µä+Ë:êÖø öí0×û÷§H Þý:è0œö3ç1( ‡ÏBëÆAÆ-ÁýÐ åóû_Ôëü 'ÚÉì\ìÍÂGåù÷ù$*Ôå®D?÷Ë.¸ ü(þà%Ùöý³]ñ‹Eøß4åüÞ ø3Èò.×òõ¿>  Ñ6ÝýÔ6æ/õùà Á 1þ†^ðøþ½5¼'þãÙ*Ëð8æÚç#)¬íM·Ñ(>êÀ ùüøæ óå"Ø8þÌé? ó Òá(@Ìä õÄôX÷åæã, ÷úÐõA÷ñÊ.õüÿå Ûà=ÞÑ!öéé7ííùå êÛôùîæ úê âîâ&æõ+óîæ Û%ýõÞ$âí ÿðíÐ+÷ôúóÿüúÿ » íà  ÿüëñä ÷òòôïòý)Ë÷)òÞ Ä*ûÞïõòóàþ!Óý8Õíï ñþø÷éô ðíú(àèúíø*äÈ$êÚ 2ñåÿ ìÙ 2Øðöä òýøåüðûú âêðüðøþîò ôùÿðöïí óû î÷òì öûìþëõèûòü üûõÿïùùþóõöýýÿöüýøüúõ êû äûóû èù ÷ó òóýö÷ùñ øüüÿ÷ÿöþÿÿÿúÿ ùôþ ÿó üòùï÷ õñ û÷û õ÷÷õ ôô þþÿùüþô üøú þùýþýûùÿ÷ùýûú ÷ûÿþø ÿøþÿúù ùûúý ú÷ýýÿÿÿüÿÿþýþúþÿýýþúýÿûþüýýÿÿþÿûýþýÿùýúûýýÿÿþúüÿýþþüÿÿýÿÿþýÿÿÿÿÿþÿþýÿÿÿþÿþýþþÿÿýþÿþþþþþÿþþÿþþÿþþÿþþþþÿÿÿÿÿÿÿÿÿÿþþþþþüýÿ÷ üüíÿ ùûÙ2ñáñí êêßúû ûÿíü òø éýñ ü òÿþýñãü" Öüôüôýþà'ä êìôÝ øóÿñ èú ùùýþýú÷ ùõ úþ÷ì ìøæðà Úúçëýÿïòú ì÷ßñýñëõü ïü ôþüóüïôøÿý÷ûû ýð ýÿø ð÷ ûÿô úô ûóÿðú ÷ôõýûñ ñþ ûóþòþ õ÷ úýÿýúûùÿþüûûüþùýÿÿýþÿýþûÿþÿþÿýþýýÿÿþÿþþÿÿþÿþþþÿÿÿþþÿþþþþþþþþþþþþþüþæü üû òùþûðü÷ÿù óüóú øúýó úûûÿüïøú ÿùÿ þôûô ñ ýôðù òì úù ýûøïøû ýóò ÿó ÷ óøôëÿðî úð üù ô õÿ ùóêôóüöõú ö ýøó ôòïúûýùñçî÷ óù ëûåõðÿýúüüùýùð üúòù÷ ùë ìò õë  óùõñ øüþë úø ñÿ ÷ù ýýûüü÷ù öú úÿüìñúñÿøöÿûúñùþãôäüðõðï õþ úñúï ùøý õþøô ýùöïôð÷÷óùúþþùÿøò ôñ ðú ýû þóùñõý þíøò ýðþ îû õòÿø ò ÷ñ ôþòüø ò ó÷îþõþùÿþÿúø óÿÿÿøÿÿö úó øñú÷ÿûïþÿø ôÿÿøýýöüíÿ ÷û þóûæï÷ ûù üþüûø÷ø ñýúý ùÿ÷ýþþüý ûò øô øüÿýÿýýý úü úúýöûø øø õùþûþþøüýÿúýÿö ý÷ýþÿÿÿÿüûùþÿûúøþûÿüÿÿÿüÿûÿþÿüþýþþþüÿýþüÿþÿÿÿÿÿÿÿÿüþþÿþÿýÿþÿÿþþþÿþÿÿÿþÿþþÿþþþþÿÿÿÿÿÿþþ made parallel in Ft2(*ð and MilkyTracker(*ð(*ð 2005(*ðmilkytracker-0.90.85+dfsg/resources/music/universalnetwork2_real.xm0000644000175000017500000027153710737746457024675 0ustar admin2admin2Extended Module: universal network 2MilkyTracker  }   @­›1 ‡10ˆ ˆ ˆ ˆ €€€€€€€€€€€€€€€€€€ƒ1 €€€€€€€€€€€ƒ1 €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ1 €€€€€€€€€€€€€€€€€€€€€€€ƒ1 €€€€€€€€€€€ƒ1 €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ1 €€€€€€€€€€€€€€€€€€€€€€€ƒ1 €€€€€€€€€€€ƒ1 €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ1 €€€€€€€€€€€€€€€€€€€€€€€ƒ1 €€€€€€€€€€€ƒ1 €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‡1 €€€€€‡1 €€€€€‡1 0€€€€€‡1 @€€€€€ @`›1 ‡1P„‡E0€€€„€€€€€„P€€€€€„€€€€ƒ1 „P€€€€€„€€€€ƒ1 „P€€‡E €€„€€€€€„PƒI€€€€„€€€€€„P€€€‡E €„€€€€€„P‡= €€€€„€€€€€„P€€€€€„€„ €€ƒ1 „P€€€€€„€€€€€„P€€€€€„€€€€ƒ1 „P€€€€€„€€„ €ƒ1 „P€€€€€„€€€€€„P‡IP€€€€„€€€„ €„P‡I0€€€€„€‡E0€€€„P‡I €€€€„€€€€€„P‡I€€€€„€‡H0€€ƒ1 „P€€€€€„€€‡E €€„P€€€€€„€€€€ƒ1 „P€€€€€„€‡G0‡H ‡E ƒ1 „P€€€€€„€€€€€„Pƒ=€€€€„€€€‡H €„P‡I@€€€€„‡I0‡C0‡G €€„P‡I0€€€€„‡I €€€€„P‡I €€€€„‡I€€‡G ƒ1 „P„‡@0€€€„€€‡C €€„P€€€€€„€€€€ƒ1 „P€€€€€„€‡>0€‡C ƒ1 „P€€‡@ €€„€€€€€„PƒD€€€€„„ €€€€„PƒD€€‡@ €„„ ‡@0‡> €‡1 „PƒD€€€‡1 „„ €€€‡1 0„PƒI€€€‡1 @„„ €€‡> @Í›1 ‡1P€‡E0€Q0 €„€€€€€„P€€€œ0 €„€€€€ƒ1 „P€€‡E œ0 €„€€€€ƒ1 „P€€€œ0 €„€€€€€„PƒI€€œ0 €„€€€€€„P€€€œ0 €„€€€€€„P‡= „ €œ0 €„€€€€€„P€€€œ0 €„€€€€ƒ1 „P€€„ œ0 €„€€€€€„P€€€œ0 €„€€€€ƒ1 „P€€€œ0 €„€€€€ƒ1 „P€€€œ €„€€€€€„P‡IP€€œ €„€€€€€„P‡I0€€œ €„€€€€€„P‡I €€œ €„€„€€€„P‡I€€O0 €„€€€˜ƒ1 „P€€€Q €„€€„€€„P€€€œ €„€€€€ƒ1 „P€€€œ €„€€€€ƒ1 „P€€€O0 €„€€€€€„Pƒ=€€œ €„€€€€€„P‡I@€€Q €„‡I0€€€€„P‡I0€€œ0 €„‡I €€€€„P‡I €€E €„‡I€€€›I‘„P„ƒ=€O0 ˜‘„€„ €€ƒI„P€ƒI€E@ €„€€€€ƒI„P€ƒ@‡= C €„€„ „ €ƒI„P€ƒK‡I E@ €„€„ €€›I ‘„PƒDƒD‡@ QP ˜‘„„ €„ €ƒI „PƒDƒN‡K O0 €„„ „ „ €‡I „PƒDƒB‡D Q ‡I „„ €€€‡I0„PƒIƒL‡N E ‡I@„„ „ „ € @HƒI1P @€ƒ=€—E07€„€„ €”(7ƒI„P€ƒD€” 7€„€€€”7ƒ1 „P€€€”7„ „€„ €”7ƒI=P @€ƒI‡=0”7€„€€„ ”7ƒI„P€ƒP‡D0”07€„P€„ €”(7ƒ8 „P€€„0” 7€„P€„ „ ”7‡=0=P @€ƒN‡I0”07€„€€€”(7ƒI„P€ƒI‡P0” 7€„€„ „ ”7ƒI=P @€€„0”07€„P€€„ ”7‡B „ €ƒ=‡N0”07‡B „!€„ €”7ƒI1P @€ƒB‡I0”7€„P€€„ ”7ƒI„ €€„0”7€„!€„ €”7ƒI;P @€ƒD‡=0”07€„€€„ ”(7€„P€€‡B0” 7€„€€€”7ƒIGP @€ƒG„0” 7€„€„ „ ” 7ƒI„P€ƒD‡D0”(7ƒI„€€€”(7ƒI=P @€€„0”07€„P€„ €”7›1‘„ €ƒB‡G0”7œ ‘„!€€„ ”7ƒ=„P€ƒD‡D0”07€„P€„ €”7ƒI1 @€€„0”7€„!€„ „ ”7ƒI„P€ƒG‡B0”07€„€€€”(7›D‘„P€ƒD‡D0” 7„„€„ „ ”7›D‘=P @€€„0”7„„€€„ ”7ƒI„P€ƒB‡G0”07ƒI„€„ €”7ƒI=P @€€‡D0”07€„P€€„ ”(7ƒI„ €ƒB„0” 7€„!€„ €”7€8P @€€‡B0”07€„P€„ „ ”(7ƒID @€ƒ@„0” 7€„!€€€”7ƒI„P€€‡B0”07€„€„ „ ”7ƒI;P @€ƒ@„0”07€„€€„ ”(7ƒI „P€ƒ?‡@0” 7€„€„ €”7ƒI „P€€„0”07€„€„ „ ”7 @]ƒI1P @€ƒ=€—E07€„€„ €”(7ƒI„P€ƒP€” 7€„€€€”7ƒ1 „P€€€”7„ „€„ €”7ƒI=P @€ƒ=‡=0”7€„€€„ ”7ƒI„P€‡P0‡P0”07€„P€‡P0€”(7ƒ8 „P€‡P0„0” 7€„P€‡P0„ ”7‡=0=P @€ƒN‡=0”07€„€€€”(7ƒI„P€ƒL‡P0” 7€„€„ „ ”7ƒI=P @€€„0”07€„P€€„ ”7‡B „ €ƒI‡N0”07‡B „!€„ €”7ƒI1P @€€‡L0”7€„P€€„ ”7ƒI„ €ƒS„0”7€„!€„ €”7ƒI;P @€ƒP‡I0”07€„€€„ ”(7€„P€€„0” 7€„€€€”7ƒIGP @€ƒU‡S0” 7€„€„ „ ” 7ƒI„P€ƒS‡P0”(7ƒI„€€€”(7ƒI=P @€€„0”07€„P€„ €”7›1‘„ €ƒP‡U0”7œ ‘„!€€„ ”7ƒ=„P€€‡S0”07€„P€„ €”7ƒI1 @€ƒI„0”7€„!€„ „ ”7ƒI„P€“=À‡P0”07€„€À€”(7›D‘„P€À„0” 7„„€” À„ ”7›D‘=P @€ƒ@‡I0”7„„€€„ ”7ƒI„P€ƒK‡=0”07ƒI„€„ €”7ƒI=P @€ƒD„0”07€„P€„ „ ”(7ƒI„ €ƒ@‡@0” 7€„!€„ €”7€8P @€ƒK‡K0”07€„P€„ „ ”(7ƒID @€€„0” 7€„!€€€”7ƒI„P€ƒ@‡@0”07€„€„ „ ”7ƒI;P @€ƒK‡K0”07€„€€„ ”(7ƒI „P€ƒ@„0” 7€„€„ €”7ƒI „P€ƒK‡@0”07€„€„ „ ”7 @iƒI,P @€ƒD€—@07€„€„ €”(7ƒI„P€ƒP€” 7€„€€€”7ƒ1 „P€€€”7„ „€„ €”7ƒI8P @€ƒG‡D0”7€„€€„ ”7ƒI„P€ƒR‡P0”07€„P€„ €”(7ƒ8 „P€€„0” 7€„P€„ „ ”7‡=08P @€ƒ?‡G0”07€„€€€”(7ƒI„P€ƒK‡R0” 7€„€„ „ ”7ƒI8P @€€„0”07€„P€€„ ”7‡B „ €ƒ@‡?0”07‡B „!€„ €”7ƒI,P @€ƒL‡K0”7€„P€€„ ”7ƒI„ €ƒ?„0”7€„!€„ €”7ƒI6P @€ƒK‡@0”07€„€€„ ”(7€„P€€‡L0” 7€„€€€”7ƒIBP @€ƒD‡?0” 7€„€„ „ ” 7ƒI„P€ƒP‡K0”(7ƒI„€€€”(7ƒI8P @€€„0”07€„P€„ €”7›1‘„ €ƒG‡D0”7œ ‘„!€€„ ”7ƒ=„P€ƒR‡P0”07€„P€„ €”7ƒI, @€€„0”7€„!€„ „ ”7ƒI„P€ƒD‡G0”07€„€€€”(7›D‘„P€ƒP‡R0” 7„„€„ „ ”7›D‘8P @€€„0”7„„€€„ ”7ƒI„P€ƒ?‡D0”07ƒI„€„ €”7ƒI8P @€ƒK‡P0”07€„P€€„ ”(7ƒI„ €ƒ@„0” 7€„!€„ €”7€3P @€ƒL‡?0”07€„P€„ „ ”(7ƒI? @€ƒ?‡K0” 7€„!€€€”7ƒI„P€‡K0‡@0”07€„€‡K0„ ”7ƒI6P @€‡K0‡L0”07€„€‡K@„ ”(7ƒI „P€‡K@‡?0” 7€„€‡K@€”7ƒI „P€‡KP‡K0”07€„€‡KP‡K0”7 @œƒI*P @€ƒB€—>0G€„€„ €”(GƒI„P€ƒN€” G€„€€€”Gƒ1 „P€€€”G„ „€„ €”GƒI6P @€ƒF‡B0”G€„€€„ ”GƒI„P€ƒR‡N0”0G€„P€„ €”(Gƒ8 „P€€„0” G€„P€„ „ ”G‡=06P @€ƒI‡F0”0G€„€€€”(GƒI„P€ƒU‡R0” G€„€„ „ ”GƒI6P @€€„0”0G€„P€€„ ”G‡B „ €ƒF‡I0”0G‡B „!€„ €”GƒI*P @€ƒR‡U0”G€„P€€„ ”GƒI„ €ƒD„0”G€„!€„ €”GƒI4P @€ƒP‡F0”0G€„€€„ ”(G€„P€ƒF‡R0” G€„€€€”GƒI@P @€ƒR‡D0” G€„€„ „ ” GƒI„P€€‡P0”(GƒI„€€€”(GƒI6P @€‡BP‡F0”G€„P€‡B €”G›1‘„ €‡BP‡R0”Gœ ‘„!€‡B „ ”Gƒ=„P€‡RP„0”G€„P€‡R €”GƒI* @€‡RP‡B0”G€„!€‡R ‡B ”GƒI„P€‡NP‡B0”G€„€‡N ‡B ”G›D‘„P€‡NP‡R0”G„„€‡N ‡R ”G›D‘6P @€‡FP‡R0”G„„€‡F ‡R ”GƒI„P€‡FP‡N0”GƒI„€‡B ‡N ”GƒI‡6@€‡BP‡N0”G€€€„0‡N ”G€€€‡DP‡F0”G€€€„0‡F ”G€€€‡FP‡F0”G€€€„0‡B ”G€˜€‡IP‡B ”G€˜€„0„0”G€˜€‡NP‡D ”G€˜ €„0„0”G€˜ €‡PP‡F ”G€˜€„0„0”G€˜‡= ‡KP‡I ”G€˜‡=0„0„0”G€˜‡=@‡IP‡N ”G€˜‡=P„0„0”G @‡N P€‡60€—BPG€„P€€€”@L€„€€€”0G€„€€€” L€‡B P€€€”PG€„P€€€” L€„‡N €€”PG€„„ €€”@L€‡BP„€€”0G€„„€€” L€‡BP‡B €€”PG€„„ €€” L€‡B P„€€”PG€„P„€€”@L€‡B ‡B €€”0G€„„€€” L€‡L P‡B €€”PG€„P„€€”@L€„‡B €€”0G€„„P€€” L€„P‡B !€€”PG€„P„€€” L€N ð‡L €€”PG€„ „ €€”@L€„P„€€”0G€„„!€€” L€„P„ €€”PG€„„ €€” L€J PÂN ð€€”PG€ž P„ €€” L€ž P„ €€”PG€ž P„€€”@L€‡> P„ €€”PG€„P„€€”@L€‡>J 0€€”0G€„ž 0€€” L€‡>Pž 0€€”PG€„Pž 0€€” L€‡2 ‡> €€”PG€„ „ €€”@L€‡> P‡>€€”0G€„„€€” L€„P‡> €€”PG€„„P€€” L€>PÁ‡2 €€”PG€>PÁ„ €€”@L€>P‡> €€”0G€>PÄ€€” L€LPð„ €€”PG€„„€€”@L€„P>0Á€€”PG€„>0Á€€” L€„P>0€€”PG€„>0À€”@L€N PðL ð€€”0G€„„€€” L€œP„ €€”PG€œP„€€”@L€œP„ €€”0G€œP„€€” L€PPÂN ð€€”PG€œP„€€” L€œPœ €€”PG€œPœ €€” L€ @rƒN€‡.Pƒ=—FP7ƒ:€€„ €”@<€˜€„P€”07ƒ=˜€„ €” <‡: ›N€„P€”P7ƒAƒN€„ €” <‡= ƒN ‡N ‡:Pƒ=”P7ƒFƒN €„ €”@<‡A ƒF€„P€”07ƒA„ €„ €” <‡F ƒF€„P€”P7ƒ=„ €„ €” <‡A ƒB€‡:Pƒ=”P7ƒ:€€„ €”@<‡= €‡F „P€”07ƒ=€„ „ €” <‡: ƒQ‡F ‡.Pƒ=”P7ƒA€„ „ €”@<‡= ƒQ ‡B „P€”07ƒF€€„ €” <‡A „ €„P€”P7ƒA€€„ €” <‡F ƒP Q ð‡:Pƒ=”P7ƒ=€€„ €”@<‡A „ €„P€”07ƒ:€€„ €” <‡= ƒ8€„P€”P7ƒ=€€„ €” <‡: ›NðP ð‡5Pƒ=”P7ƒA€€„ €” <‡= €€‡.P€”P7ƒF€€„ €”@<‡A €€„Pƒ=”P7ƒ:€€„ €”@<‡F €N ð„P€”07ƒ=€€„ €” <‡A €€‡:P€”P7ƒA€€„ €” <‡: „ €„Pƒ=”P7ƒH€€„ €”@<‡= €€„P€”07ƒA€€„ €” <‡A €€‡:P€”P7ƒ=€€„ €” <‡H €€„Pƒ=”P7ƒ:€€„ €”@<‡A €€‡.P€”07ƒ=€€„ €” <‡= ›Ið€„Pƒ=”P7ƒA€€„ €”@<‡: €€‡:P€”P7ƒH€€„ €” <‡= ‡P 0€‡5P€”P7ƒA„€„ €”@<‡A ƒPI ð„Pƒ=”07ƒ=€€„ €” <‡H €€‡:P€”P7ƒ:€€„ €”@<‡A ‡Q0€‡)P€”07ƒ=„€„ €” <‡= ƒQP ð‡.Pƒ=”P7ƒA€€„ €” <‡: ‡P 0€„P€”P7ƒH„€„ €” <‡A @tƒ6€‡.Pƒ=—FP7€›N0€„ €”@<€˜0€„P€”07€˜0€„ €” <€“BÀ€„P€”P7€“BÀ€„ €” <€“B À‡N ‡:PƒD”P7€“B À€„ €”@<€ƒF€„PƒD”07€„ €„ €” <€ƒF€„P€”P7€„ €„ €” <€ƒB€‡:Pƒ=”P7€€€„ €”@<€€‡F „P€”07€€„ „ €” <€›Qð‡F ‡.Pƒ=”P7€€„ „ €”@<€€‡B „P€”07€€€„ €” <€Q 0P€„P€”P7€œ0P€„ €” <€›PðQ ð‡:PƒD”P7€€€„ ƒD”@<€„ €„PƒD”07€€€„ €” <€€„ „P€”P7€€€„ €” <€›NðP ð‡5Pƒ=”P7€€€„ €” <€˜"„ ‡.P€”P7€œ "€„ €”@<€ƒN €‡*Pƒ=—BPG€€€„ €”@G€˜"N ð„P€”0G€œ "€„ €” G€ƒN€‡6P€”PG€€€„ €” G€˜"€„Pƒ=”PG€œ "€„ €”@G€ƒN€„PƒD”0G€„ €„ €” G€ƒN€‡*PƒD ”PG€„ €„ €” G€ƒN „„PƒD”PG€„ €„ €”@G€ƒN €‡6PƒD ”0G€„ ˜ „ €” G€›B𘠇6PƒD ”PB‡= 0˜ ˜ „ €” B€›B ˜ ‡*PƒD ”PB‡= 0œ ª˜ „ €” B€›B𘠇*PƒD”PB‡A 0˜ ˜ „ €” B€›E N  ‡6PƒD”PB‡A 0œ ª˜ „ €” B€›D𘠇*PƒD ”PG‡B 0˜ œ  „ €” G€ƒBL  „PƒD”PG‡F 0œ ª˜ „ €” G€›Eú˜ „PƒD”PG‡D 0˜ œ  „ €” G€›D J  „PƒD”PG‡P 0œ  ˜ „ €” G€ @©‡N P„‡*Pƒ=—BPGƒ6„€„ €”@L€‡N P€„P€”0Gƒ:„€„ €” L‡6 NP€„P€”PGƒ=œ€„ €” L‡: NP‡N ‡6Pƒ=”PGƒBœ€„ €”@L‡= ‡NP€„P€”0GƒF„€„ €” L‡B ‡NP€„P€”PGƒI„€„ €” L‡F ƒF€‡6Pƒ=”PGƒFƒF€„ €”@L‡I ƒF„ „P€”0GƒBƒF€„ €” L‡F ›L€‡*Pƒ=”PGƒ=˜ €„ €”@L‡B €€„P€”0Gƒ:€€„ €” L‡= „ €„P€”PGƒ6€€„ €” L‡: ›QðL$ð‡6Pƒ=”PGƒ:€€„ €”@L‡6 „ €„P€”0Gƒ=€€„ €” L‡: ƒF„ „P€”PGƒB€€„ €” L‡= ƒNN0ð‡1Pƒ=”PGƒF€€„ €” L‡B ˜„ ‡*P€”PGƒI˜€„ €”@L‡F ›N @€„Pƒ=”PGƒ6€€„ €”@L‡I €J ð„P€”0Gƒ:˜€„ €” L‡F ›N€‡6P€”PGƒ=€€„ €” L‡B ˜€„Pƒ=”PGƒD˜€„ €”@L‡6 ƒF€„P€”0GƒB€€„ €” L‡: ƒF€‡6P€”PGƒ:€€„ €” L‡= ƒD„ „Pƒ=”PGƒ6€€„ €”@L‡F ƒD€‡*P€”0Gƒ:€€„ €” L‡D ‡QP€„Pƒ=”PGƒ=„€„ €”@L‡= œP€‡6P€”PGƒDœ€„ €” L‡: „P€‡1P€”PGƒ=„€„ €”@L‡6 PPðL ð„Pƒ=”0Gƒ:„€„ €” L‡: œP€‡6P€”PGƒ6œP€„ €”@L‡= „ „ ‡%P€”0Gƒ:„ €„ €” L‡F NPÁN$ð‡6Pƒ=”PGƒDœPÁ€„ €” L‡D œPÁ€„P€”PGƒBœPÁ„„ €” L‡: @1›1 ‡1Pˆ —=0À‡EP€€„€À˜€€„P€À‡E@€€„€À˜€ƒ1 „P€À‡E@—= À€„€À˜Àƒ1 „P€—=0À‡E0À€„€À˜À€„PƒIÀ‡E0À€„€À˜À€„P€À‡E —= À€„€À˜À€„P‡= —=0À‡EÀ€„€À˜À€„P€À‡I0À€„€À€Àƒ1 „P€À€—= À€„€À€À€„P€—=0À‡= À€„€À€Àƒ1 „P€À€À€„€À€Àƒ1 „P€À€—= À€„€À€À€„P‡IP—=0À€À€„€À€À€„P‡I0À€À€„€À€À€„P‡I —D0À€—= À€„€À€À€„P‡IÀ‡I0À€„€À€Àƒ1 „P€À‡I —D À€„€À€À€„P€—=0À‡I À€„€À€Àƒ1 „P€À‡I"À€„€À€Àƒ1 „P€À€—= À€„€À€À€„Pƒ=—B0À€À€„€À€À€„P‡I@À€À€„‡I0À€À€„P‡I0À€—B À€„‡I À€À€„P‡I —=0À‡= À€„‡IÀ€Àƒ1 „P„À‡I À€„€À‡I À€„P€À‡I —= À€„€À‡I Àƒ1 „P€—D0À‡I À€„P€À‡IÀƒ1 „P€—N0À„À€„P€À€À€„PƒDÀ€—D À€„„ À€À€„ ƒD—P0À€—N À€„„ À€À‡1 „PƒDÀ€À‡1 „P„ À€À‡1 0„PƒI—D0À‡D —P À‡1 @„„ À„ À @ ›1 ‡10ˆ ƒ=€ˆ €€€€€€€€€„ €€€€€€€€ƒ1 €€ƒ=€€€€€€€€ƒ1 €€€‡= €€€€€€€€€€ƒD„€€€€€€€€€€„ ‡= €€€€€€€€€€ƒ=€€€€€€€€€€€ƒE‡D €€€€€€€ƒ1 €€„ „€€€€€€€€€€ƒE‡= €€€€€€€ƒ1 €€€‡E €€€€€€€ƒ1 €€ƒB„€€€€€€€€€€ƒD‡E €€€€€€€€€€„ €€€€€€€€€€€ƒ=‡B €€€€€€€€€€€‡D €€€€€€€ƒ1 €€‡= „€€€€€€€€€€€‡= €€€€€€€ƒ1 €€‡=€€€€€€€€ƒ1 €€€‡=€€€€€€€€€€‡=€€€€€€€€€€€€‡=€€€€€€€€€€‡=€€€€€€€€€€€€‡=€€€€€€€ƒ1 €€‡=€€€€€€€€€€€€‡=€€€€€€€ƒ1 €€‡=€€€€€€€€ƒ1 €€€‡=€€€€€€€€€€‡=€€€€€€€€€€€€‡=€€€€€€€‡1 €€‡=€€‡1 €€€€€‡1 0€€€‡=€‡1 @€€€€€ @g›1 ‡10ˆ ƒ=€ˆ €€€€€€€€€„ €€€€€€€€ƒ1 €€ƒ=€€€€€€€€ƒ1 €€€‡= €€€€€€€€€€ƒD„€€€€€€€€€€„ ‡= €€€€€€€€€€ƒ=€€€€€€€€€€€ƒE‡D €€€€€€€ƒ1 €€„ „€€€€€€€€€€ƒE‡= €€€€€€€ƒ1 €€€‡E €€€€€€€ƒ1 €€ƒB„€€€€€€€€€€ƒD‡E €€€€€€€€€€„ €€€€€€€€€€€ƒI‡B €€€€€€€€€€€‡D €€€€€€€ƒ1 €H ‡I „€€€€€€€€€G €‡I €€€€€€€ƒ1 €C ‡I€€€€€€€€ƒ1 €@ €‡IH €€€€€€€€C ‡I€G €€€€€€€€A €‡IC €€€€€€€€@ ‡I€@ €€€€€€€€> €‡IC €€€€€€ƒ1 €@ ‡I€A €€€€€€€€< €‡I@ €€€€€€ƒ1 €; €€> €€€€€€ƒ1 €7 €‡I@ €€€€€€€€9 €€< €€€€€€€€„ €€; €€€€€€‡1 €€€€7 ‡1 €€€€€‡1 0€€€€9 ‡1 @€€€€€ @6›1 ‡/0ˆ ƒ=€ˆ €€€€€€€€€„ €€€€€€€€ƒ1 €€ƒ=€€€€€€€€ƒ1 €€€‡= €€€€€€€€€€ƒD„€€€€€€€€€€„ ‡= €€€€€€€€€€ƒ=€€€€€€€€€€€ƒE‡D €€€€€€€ƒ1 €€„ „€€€€€€€€€€ƒE‡= €€€€€€€ƒ1 €€€‡E €€€€€€€ƒ1 €€ƒB„€€€€€€€€€€ƒD‡E €€€€€€€€€€„ €€€€€€€€€€€ƒ=‡B €€€€€€€€€€€‡D €€€€€€€ƒ1 €€‡= „€€€€€€€€€€€‡= €€€€€€€ƒ1 €€‡=€€€€€€€€ƒ1 €€€‡=€€€€€€€€€€‡=€€€€€€€€€€€€‡=€€€€€€€€€€‡=€€€€€€€€€€€€‡=€€€€€€€ƒ1 €I0 ‡=€€€€˜ €€€€€œ0 €‡=€€€˜ €€€ƒ1 €œ0 ‡=€€€€˜ €€€ƒ1 €œ0 €‡=€€€˜ €€€€€œ0 ‡=€€€€˜ €€€€€œ0 €‡=€€€˜ €€€‡1 €œ0 ‡=€€‡1 €˜ €€€‡1 0€œ0 €‡=€‡1 @€˜ €€€ @ë›1 ‡*Pˆ ƒ=€ˆ €€€€€€€€€„ €€€€€€€€ƒ1 €€ƒ=€€€€€€€€ƒ1 €€€‡= €€€€€€‡X€€€ƒD„œ €€€€€•Uð €€€„ ‡= ”ð €€‡X€€”ð €€œƒ=€”ð €€•Uð €€”ð €€”ð ƒE‡D ”ð €€”ð €€”ð ƒ1 €”ð „ „”ð €€”ð €€”ð €€”ð ƒE‡= ”ð €€”ð €€”ð ƒ1 €”𠀇E ”ð €€”ð €€”ð ƒ1 €”ð ƒB„”ð €€”ð €€”ð €€”ð ƒD‡E ”ð €€”ð €€€€€”ð „ €€€€”ð €€€€€”ð ƒI‡B „€€€€€€€€€€‡D €€€€€€€ƒ1 €90 ‡I „€€€€€€€€€;0 €‡I €€€€€€€ƒ1 €<0 ‡I€€€€€€€€ƒ1 €;0 €‡I9 €€€€€€€€<0 ‡I€; €€€€€€€œP>0 €‡I< €ŒN€€€€€ŒM<0 ‡I€; €ŒL€€€€€ŒK>0 €‡I< €ŒJ€€€€ƒ1 ŒI@0 ‡I€> €ŒH€€€€€ŒF>0 €‡I< €ŒE€€€€ƒ1 ŒD@0 €€> €ŒC€€€€ƒ1 ŒBC0 €‡I@ €ŒA€€€€€Œ@@0 €€> €Œ>€€€€€Œ=‡C0€€@ €Œ<€€€€‡1 Œ;‡@0€€C ‡1 Œ:€€€€‡1 0Œ9‡C0€€@ ‡1 @Œ8€€€€ @:›1 ‡8P€‡E0€€€„€€€€€„P€€€€€„€€€€ƒ1 „P€€€€€„€€€€ƒ1 „P€€‡E €€„€€€€€„PƒI€€€€„€€€€€„P€€€€€„€€€€€„P‡= „ €€€„€€€€€„P€€€€€„€€€€ƒ1 „P€€€€€„€€€€€„P€€„ €€„€€€€ƒ1 „P€€€€€„€€€€ƒ1 „P€€€€€„€€€€€„P‡IP€€€€„€€€€€„P‡I0€€€€„€€€€€„P‡I €€€€„€„€€€„P‡I€€€€„€€€€ƒ1 ‡9P€€€€€„€€€€€„P€€€€€„€€„€ƒ1 „P€€€€€„€€€€ƒ1 „P€€€€€„€€€€€„Pƒ=€€€€„€€€€€„P‡I@€€€€„‡I0€€€€„P‡I0€€€€„‡I €€€€„P‡I €€€€„‡I€€€›I‘„P„€€€˜‘„€€€€ƒI„P€€€€€„€€€€ƒI„P€€€€€„€€€€ƒI„P€€€€€„€€€€›I ‘„PƒD‡G0€€˜‘„„ €€€ƒI „PƒD€€€€„„ €€€‡I „PƒD€‡G €‡I „„ €€€‡I0„PƒI€€€‡I@„„ €€€ @¤›1 ‡1P€‡E0ˆ :0€„€€€œ €„P€€€œ0 €„€€€œ  ƒ1 „P€€€œ00€„€€€œ 0ƒ1 „P€€‡E œ0@€„€€€œ @€„PƒI€€œ0P€„€€€œ P€„P€€€œ0@€„€€€œ @€„P‡= „ €œ00€„€€€œ 0€„P€€€œ0 €„€€€œ  ƒ1 „P€€€„€„€€€€€„P€€„ €€„€€€€ƒ1 „P€€€€€„€€€€ƒ1 „P€€€€€„€€€€€„P‡IP€€€€„€€€€€„P‡I0€€€€„€€€= ‘€„P‡I €€8 ‘€„€„€6 ‘€„P‡I€€? ‘€„€€€= ‘ƒ1 „P€€€F ‘€„€€€= ‘€„P€€€D ‘€„€€„E ‘ƒ1 „P€€€B ‘€„€€€D ‘ƒ1 „P€€€= ‘€„€€€E ‘€„Pƒ=€€= ‘€„€€€> ‘€„P‡I@€€„€„‡I0€€€€„P‡I0€€€€„‡I €€€€„P‡I €€€€„‡I€€€›I‘„P„€€€˜‘„€€€€ƒI„P€€€€€„€€€€ƒI„P€€€€€„€€€€ƒI„P€€€€€„€€€€›I ‘„PƒD…G0€€˜‘„„ €€€ƒI „PƒD€€€€„„ €€€‡I „PƒD€€€‡I „„ €€€‡I0„PƒI€€€‡I@„„ €€€ 6µ›1 ‡9Pˆ €‡EP€€„€€˜€€„P€€‡E@€€„€€˜€ƒ1 „P€‡Q ‡E@—= À€„€˜ ˜Àƒ1 „P€˜ 0‡E0À€„€˜ 0˜À€„PƒI˜ @‡E0À€„€˜ P˜À€„P€˜ `‡E —= À€„€€˜À€„P‡= €‡EÀ€„€€˜À€„P€€‡I0À€„€€€Àƒ1 „P€˜€—= À€„€˜€À€„P€˜ ‡= À€„€˜ €Àƒ1 „P€˜ €À€„€˜ €Àƒ1 „P€˜ €—= À€„€˜ €À€„P‡IP˜ €À€„€˜ €À€„P‡I0˜ €À€„€˜ €À€„P‡I ˜ €—= À€„€˜ €À€„P‡I˜ ‡I0À€„€˜ €Àƒ1 ‡8P€›P‡I —D À€„€˜€À€„P€˜‡I À€„€˜€Àƒ1 „P€P@‡I"À€„€˜€Àƒ1 „P€˜€—= À€„€˜€À€„Pƒ=P0€À€„€˜€À€„P‡I@˜€À€„‡I0˜€À€„P‡I0P €—B À€„‡I „€À€„P‡I €‡= À€„‡I€€À‡8080œ‡PP€À€˜ ˜„€À€˜ ˜„@€—= À€˜ ˜„€À€˜ ˜„0€À˜ ˜ ˜Œ ‡IÀ €€€€€€ €€€€€€ @T1*„„10€—I07€€€€€”7€€€€€”07€€€€€”7€€€€€”07€€€€€”7€€€€€”07€€€€€”7€ƒM€€€”07€€€€€”7€€€€€”07€„ €€€”7€ƒL€€€”07€€€€€”7€€‡M0€€”07€€€€€”7€€€€€”07€€„ €€”7€€‡L0€€”07€„ €€€”7€ƒM€€€”07€€€€€”7€€€€€”07€„ €€€”7€ƒL€€€”07€€„ €€”7€€‡M0€€”07€„ €€€”7€ƒJ€€€”07€€„ €€”7€€‡L0€€”07€„ €€€”7€ƒL€€€”07€€„ €€”7€€‡J0€€”07€€€€€”7€€€€€”07€„ „ €€”7€€‡L0€€”07€€€€€”7€ƒG€€€”07€€€€€”7€€€€€”07€„ „ €€”7€ƒH€€€”07€€€€€”7€€‡G0€€”07€€€€€”7€€€€€”07€„ „ €€”7€€‡H0€€”07€€€€€”7€ƒG€€€”07€€€€€”7€€€€€”07€„ „ €€”7€ƒH€€€”07€€€€€”7€€‡G0€€”07€„ €€€”7€ƒG€€€”07€€„ €€”7€€‡H0€€”07€„ €€€”7 @v€œ0 „ €€—I07€œ €€€”7€œ0 €€€”07€œ €€€”7€œ0 €€€”07€œ €€€”7€œ0 €€€”07€œ €€€”7€ƒM€€€”07€€€€€”7€€€€€”07€„ €€€”7€ƒL€€€”07€€€€€”7€€‡M0€€”07€€€€€”7€€€€€”07€€„ €€”7€€‡L0€€”07€„ €€€”7€ƒM€€€”07€€€€€”7€€€€€”07€„ €€€”7€ƒL€€€”07€€„ €€”7€€‡M0€€”07€„ €€€”7€ƒJ€€€”07€€„ €€”7€€‡L0€€”07€„ €€€”7‡90ƒH€90€—E0G€€„ €€”G€€‡J0€€”0G€€€€€”G€€€€€”0G€„ „ €€”G€€‡H0€€”0G€€€€€”G€ƒG€€€”0G€€€€€”G€€€€€”0G€„ „ €€”G€ƒH€€€”0G€€€€€”G€€‡G0€€”0G€€€€€”G€€€€€”0G€„ „ €€”G€€‡H0€€”0G€€€€€”G€ƒG€€€”0G€€€€€”G€€€ƒI€”0G€„ „ €€”G€ƒH€ƒI€”0G€€€€€”G€€‡G0ƒI€”0G€„ €€€”G€ƒG€ƒI€”0G€€„ €€”G€€‡H0ƒI€”0G€„ €€€”G @ìƒ9ƒE€ƒD€—I07€€€€€”7€€€€€”07€€€€€”7€€€ƒD€”07€„ €€€”7ƒ9€‡E0ƒD‡D”07€€€€€”7€ƒG€ƒB„”07€€€€€”7€€€€‡D”07€„ €€€”7ƒEƒE€ƒD‡D”07€€€€€”7€€‡G0€‡B”07€€€€€”7€€€ƒD„”07€€„ €€”7ƒ9€‡E0€‡D”07€„ €€€”7€ƒG€‡D0„”07€€€‡D0€”7€€€ƒD‡D”07€„ €€€”7ƒEƒE€ƒB„”07€€„ €€”7€€‡G0€‡D*”07€„ €€‡D ”7ƒ9ƒG€ƒD‡D”07€€„ €€”7€€‡E0€‡B”07€„ €€€”7ƒ9ƒA€ƒD„”07€€„ €€”7€€‡G0€‡D”07€€€€€”7€€€ƒD„”07€„ „ €€”7ƒ9€‡A0ƒD‡D”07€€€€€”7€ƒG€ƒB„”07€€€€€”7€€€€‡D”07€„ „ €€”7ƒEƒA€ƒD‡D”07€€€€€”7€€‡G0€‡B”07€€€€€”7€€€ƒD„”07€„ „ €€”7ƒ9€‡A0ƒD‡D”07€€€„ €”7€ƒG€ƒD„”07€€€€€”7€€€‡D0‡D”07€„ „ „€”7ƒEƒA€ƒI‡D”07€€€„„ ”7€€‡G0ƒI‡D”07€„ €„€”7ƒ9ƒG€ƒI‡D*”07€€„ „„”7€€‡A0ƒI‡I”07€„ €„„”7 @¿ƒ8ƒ@€ƒD€—D0G€€€€€”G€€€€€”0G€€€€€”G€€€ƒ=€”0G€„ €„ €”G€€‡@0ƒD€”0G€€€€€”GƒDƒD€ƒB€”0G€€€€€”G€€€€€”0G€„ „ €€”Gƒ8ƒ@€ƒD€”0G€€€€€”G€€‡D0€€”0G€€€€€”G€€€ƒD€”0G€€„ €€”G€€‡@0€€”0G€„ €‡=0€”GƒDƒD€‡=0€”0G€€€‡=0€”G€€€ƒD€”0G€„ €€€”Gƒ8ƒ@€ƒB€”0G€€„ €€”G€€‡D0€€”0G€„ €€€”GƒDƒD€ƒD€”0G€€„ €€”G€€‡@0ƒ5€”0G€„ €„ €”Gƒ8ƒL€ƒD€”0G€€„ €€”G€€‡D0€€”0G€€€B ‘€”G€€€B0‘€”0G€„ „ B@‘€”G€€‡L0ƒD€”0G€€€€€”GƒDƒP€ƒB€”0G€€€€€”G€€€‡B0€”0G€„ „ €€”Gƒ8ƒL€ƒD€”0G€€€€€”G€€‡P0€€”0G€€€€€”GƒD€€ƒD€”0G€„ „ €€”GƒD€‡L0ƒI€”0G€€€ƒI€”Gƒ8ƒP€ƒI€”0G€€€ƒI€”GƒD€€ƒI€”0G€„ „ ƒI€”GƒDƒL€ƒI€”0G€€€€€”Gƒ8€‡P0ƒI€”0G€„ €€€”GƒDƒP€ƒI€”0G€€„ €€”Gƒ8€‡L0ƒI€”0G€„ €€€”G @Uƒ=ƒQ€ƒD‡D 0—IP7€€€€D”7€ƒS€€D” 7€€€€D”7‡IPƒT€€D”@7„ €€€D”7„PƒX‡Q ƒDD—=P7„ €€€D”7„PƒY‡S ƒID”07€€€€D”7ƒ=ƒX‡T €D”@7€„ €€D”7€ƒX‡X ƒDD—=P7€€€€D”7€ƒT‡Y €D” 7€€€€D”7ƒIƒS‡X ƒDD—I@7€€„ €D”7€ƒQ‡X €D”07€„ €€D”7€ƒY‡T €D”P7€€€€D”7ƒ=ƒY‡S ƒDD—= 7€„ €€D”7€ƒX‡Q ƒID”@7€€„ €D”7€ƒX‡Y ƒID”P7€„ €€D”7ƒIƒV‡Y ƒDD—=@7„ €„ €D”7ƒPƒQ‡X €D”07„ „ €€D”7ƒ=ƒX‡X ƒDD—IP7€€„ €D”7€ƒS‡V €D” 7€€€€D”7‡IPƒT‡Q €D”@7„ „ „ €D”7„PƒS‡X ƒDD—= 7„ €€€D”7„PƒS‡S ƒID”P7€€€€D”7ƒ=ƒQ‡T €D”07€„ „ €D”7€ƒT‡S ƒDD—=@7€€€€D”7€ƒM‡S €D” 7€€€€D”7ƒIƒL‡Q ƒDD—IP7€„ „ €D”7€ƒJ‡T €D”@7„€€€D”7„PƒS‡M €D”07„€€€D”7ƒ=ƒL‡L ƒID—=P7€„ „ €D”7€ƒT‡J ƒID” 7€€€€D”7€ƒM‡S €D”@7€„ €€D”7ƒIƒS‡L ƒID—=07„€„ €D”7ƒIƒQ‡T ƒID” 7€„ €€D”7 @nƒ=ƒQ€ƒD‡D 0—IP7€€€€D”7€ƒS€€D” 7€€€€D”7€ƒT€€D”@7€€€€D”7‡IPƒX‡Q ƒDD—=P7„€€€D”7„PƒY‡S ƒID”07„€€€D”7„PƒX‡T €D”@7€„ €€D”7ƒ=ƒX‡X ƒDD—=P7€€€€D”7€ƒT‡Y €D” 7€€€€D”7€ƒS‡X ƒDD—I@7€€„ €D”7‡IPƒQ‡X €D”07„„ €€D”7„PƒY‡T €D”P7„€€€D”7„PƒY‡S ƒDD—= 7€„ €€D”7ƒ=ƒX‡Q ƒID”@7€€„ €D”7€ƒX‡Y ƒID”P7€„ €€D”7ƒIƒV‡Y ƒDD—=@7€€„ €D”7€ƒQ‡X €D”07€„ €€D”7ƒ9ƒX‡X ƒDD—9PG€„4„ €D”G€ƒX‡V €D” G€„0€€D”G€ƒX‡Q €D”@G€„0„ €D”G“EÀƒV‡X ƒDD—E GÀ„0„ €D”GÀƒV‡X ƒID”PGÀ„0„ €D”GÀƒV‡X €D”0G€„0„ €D”Gƒ9ƒT‡V ƒDD—9@G€„0„ €D”G€ƒT‡V €D” G€„0„ €D”G€ƒT‡V ƒDD—EPG€„0„ €D”GƒEƒS‡T ‡D D”@G€„0„ €D”G€ƒS‡T ƒDD”0G€„0„ €D”G€ƒS‡T ‡D D—9PG€„0„ ‡D0D”Gƒ9ƒQ‡S ƒDD” G€„0„ €D”G€ƒQ‡S ƒDD”@G€„0„ €D”GƒEƒL‡S ƒDD—E0G€„0„ €D”G€ƒL‡Q ƒDD” G€„0„ €D”G @‘ƒ9ƒ`€ƒI‡D @—9PG€€€€D”G€ƒ_€ƒID” G€€€€D”G€ƒY€ƒID”@G€€€€D”GƒEƒX‡` ƒID—E G€€€€D”G€ƒT‡_ €D”PG€€€€D”G€ƒS‡Y ƒID”0G€„ €€D”Gƒ9ƒM‡X ƒID—9@G€€€€D”Gƒ9ƒL‡T ƒUD” G€€€€D”G€ƒ`‡S ƒID—EPG€ƒ_„ €D”GƒEƒY‡M €D”@G€‡X €€D”G€ƒT‡L ƒID”0G€ƒS€€D”G€ƒM‡` ƒID—9PG€‡L ƒ_€D”Gƒ9ƒ`‡Y ƒDD” G€ƒ_‡X €D”G€ƒY‡T €D”@G€‡X ƒS€D”GƒEƒT‡M ƒID—E0G€ƒS‡L €D”G€ƒM‡` €D” G€‡L ƒ_€D”Gƒ9ƒY‡Y ƒID—9PG€„4‡X €D”G€ƒX‡T €D” G€„0ƒS‡D0D”G€ƒV‡M ‡D0D”@G€„0‡L ‡D0D”GƒEƒ[‡Y ƒID—E G€„0„4€D”G€ƒY‡X ƒDD”PG€„0„0€D”G€ƒX‡V ƒDD”0G€„0„0€D”Gƒ9ƒ]‡[ ƒDD—9@G€„0„0€D”Gƒ9ƒ[‡Y ƒDD” G€„0„0€D”G€ƒY‡X ƒDD—EPG€„0„0€D”GƒEƒ`‡] ƒDD”@G€„0„0€D”G€ƒ_‡[ ƒDD”0G€„0„0€D”G€ƒ]‡Y ƒDD—9PG€„0„0€D”Gƒ9ƒ_‡` ƒDD” G€„0„0€D”G€ƒ`‡_ ƒDD”@G€„0„0€D”GƒEƒ_‡] ƒDD—E0G€„0„0€D”G€ƒ`‡_ ƒDD” G€„0„0€D”G @“ƒ8‡_P€ƒI‡D 0—DPG€‡\P€€D”G€‡XP€ƒI D”PG€‡UP€€D”G€‡SP€ƒI D”PG€‡PP€€D”GƒD‡LP‡_ ƒID”PG€‡IP‡\ €D”G€‡GP‡X ƒI D”PG€‡DP‡U €D”G€‡@P‡S ƒI D”PG€‡=P‡P €D”Gƒ8‡;P‡L ƒID”PG€‡8P‡I €D”G€‡4P‡G ƒI D”PG€‡1 ‡D €D”G€ƒP‡@ ƒI D”PG€„‡= €D”GƒDƒQ‡; ƒID”PG€„‡8 €D”G€ƒP‡4 ƒI D”PG€€‡1 €D”G€ƒQ‡P ƒI D”PG€„„!€D”Gƒ8ƒS‡Q ƒID”PG€€„!€D”G€ƒQ‡P ƒI D”PG€€„ €D”GƒDƒP‡Q ƒI D”PG€€„!€D”G€ƒN‡S ƒID”PG€„„!€D”Gƒ8ƒP‡Q ƒI D”PG€€„ €D”G€ƒL‡P ƒI D”PG€€„!€D”G€ƒI‡N ƒID”PG€ƒJ„!€D”GƒDƒK‡P ƒID”PG€ƒL„ €D”G€ƒX‡L ƒID”PG€„„ €D”G€ƒX‡I ƒID”PG€€‡J €D”Gƒ8ƒ\‡K ƒID”PG€„‡L €D”G€ƒ\‡X ƒID”PG€€„!€D”GƒDƒX‡X ƒID”PG€„„ €D”G€ƒX‡\ ƒID”PG€€„!€D”GƒDƒS‡\ ƒID”PG€„„ €D”G€ƒS‡X ƒID”PG€„„!€D”Gƒ8ƒX‡X ƒID”PG€€„ €D”G€ƒX‡S ƒID”PG€„„!€D”GƒDƒ\‡S ƒID”PG€„„!€D”G€ƒ\‡X €D”PG€€„ €D”G @›D‡1&‡Q@ƒI„ „€€€€€€€€˜„ €€€€˜€€€ƒD€˜ƒI€‡Q €€œ €€€ƒD€‡Q0€‡I ˜€€€€€˜‡=0€˜ƒP„˜€€˜€€œ €€˜„ ‡I ‡Q€€œ €€€€€‡Q$ƒI€˜€€€€€˜€€˜ƒQ‡P ˜€€˜€€œ ƒD€˜„ „‡Q€€œ €€€€€‡Q ƒQ‡I ˜€€€€€˜ƒD€˜€‡Q ˜€€˜€€œ ƒD€˜ƒN„‡Q€€œ €€€€€‡QƒP‡Q ˜€€€€€˜€€˜„ €˜€€˜€€œ €€˜ƒI‡N ‡Q€€œ €€€€€€€‡P ˜€€€€€˜ƒD€€‡I „˜€€€€€œ €€€€‡I €€€€€€€ƒD€€‡I€€€€€€€€ƒD€€€‡I€€€€€€€‡=0€€‡I€€€€€€€€€€€€‡I€€€€€€€€€€‡I€€€€€€€€€€€€‡I€€€€€€€ƒD€€‡I€€€€€€€€€€€€‡I€€€€€€€ƒD€€‡I€€€€€€€€ƒD€€€‡I€€€€€€€€€€‡I€€€€€€€€€€€€‡I€€€€€€€‡D €€‡I€ƒ?‡D €€€€€‡D0€€€‡I€‡D@€€€€€ @gƒD‡1&‡Q@ƒI„ „€€€€€€€€˜„ €€€€˜€€€€€˜ƒI€‡Q €€œ €€€€€‡Q0€‡I ˜€€€€€˜‡=0€˜ƒP„˜€€˜€€œ €€˜„ ‡I ‡Q€€œ €€€€€‡Q$ƒI€˜€€€€€˜€€˜ƒQ‡P ˜€€˜€€œ €€˜„ „‡Q€€œ €€€€€‡Q ƒQ‡I ˜€€€€€˜€€˜€‡Q ˜€€˜€€œ €€˜ƒN„‡Q€€œ €€€€€‡QƒP‡Q ˜€€€€€˜€€˜„ €˜€€˜€€œ €€˜ƒI‡N ‡Q€€œ €€€€€€€‡P ˜€€€€€˜€€€‡I „˜€€€€€œ €€€€‡I €€€€€€€€€€‡I€€€€€€€€€€€€‡I€€€€€€€‡=0€€‡I€€€€€€€€€€€€‡I€€€€€€€€€€‡I€€€€€€€€€€€€‡I€€€€€€€€€€‡I€€€€€€€€€€€€‡I€€€€€€€€€€‡I€€€€€€€€€€€€‡I€€€€€€€€€€‡I€€€€€€€€€€€€‡I€€€€€€€€€€‡I€€€€€€€€€€€€‡I€€€€€€€ @˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€˜ ˜ ˜ ˜ ˜ ˜ €€€€€€ ...Strobe&Kmuland...(@ @ ) @€ø9Éþýé    ýøûôøøôüõøùöÿû    ûøø÷õúóû÷õüöþþ    øøø÷õúôøúöûöýÿ    øùöúôù÷öûõúøü    ÷úõûô÷úóýôúùü     ÷úõûôöûòýõùûú     öûõù÷õûñüøõÿú    öúôùøôüòûùöþú    ÿ÷ùõøùôûõøúõÿû    ûú÷øõûôùö÷üõÿü   ÿÿ÷óéôéðòêü  ýþþõôèôëìõçþ   ýÿýõóéñïêöèÿ   ýÿþóóêîõæ÷ë  þüóòîëôç÷îÿ  þûóïïéöèóõþ  üùõêóæöêðúü þÿøõëóçôîìýý  þ÷õêóêðòéûÿ   þÿÿöõèôëìöèü  ýüõõéñîéüòûúÿ  þûøï÷ïòõìúïúüþ   ÿûøðõññöìøóøþý   ÿü÷ñôôíùì÷õöý   þüöòòôî÷ïóøôþ  üûôóðöíöññûôÿ   úûòõî÷îôôðûõÿ  üûñöíöñðùíû÷   ûûïøîõòîúíûùÿ  üùð÷ïòõìúïùüþ   ü÷ðöñîøêûòöÿþ    ÿû÷ðôôíøìøõöÿþ   þüöòñ÷ì÷ðóøôþ  þüôôð÷ìöòñúôþ   üüñöï÷íóõîüö   úûñöí÷ððøíüø  ÿûùð÷íõóíúîûùÿ    üùðöðòöìùðùüý  üøñöñð÷ëùò÷þý    ü÷ñóóíùì÷õôþ   þüôòñöëøïôøôþ  ûûôóñöíöôñùõþ   üûóõîøîó÷îüô  üûñöï÷ïðùîüöÿ   üùð÷ïôóîúîúúþ   þúùï÷ïóõëüïùüý  úùïöòðöìúò÷ÿü   üöòôôîøíøôõü   ÿû÷ñóõí÷ðô÷õý  üûôóñ÷ìõóñûõÿ   ûúòõîøîôöîûõÿ  ûûñöî÷ððùïû÷ÿ  üùñøîöòîüîúùý úøñøïóöìûïùüü   ûøïöòïøìúóöÿü   ú÷ðõôî÷îøöõü   ýûõòó÷ìøðôùóü   ýûõôðøíõôñûóý   üúóõïùíó÷ïûöþ  ûùðøî÷ñïúìý÷ÿ   úùð÷îöóîûîûùþ  ûùïøðóõíûðøýû  úøñ÷ñðùìùñ÷ÿû    û÷ñõòï÷ï÷õõÿþ   ýûõòòöìøðõøóþ  üúóôñ÷íöôñúôþ   ûüòöï÷ïóøîûõÿ  üúò÷îøïðúîüöÿ  ûùðøïõóíûîúúý   ÿúùï÷ðòöëüðùüý  ÿúøï÷òð÷íúò÷þü    ÿû÷ðõõîùí÷õõû   þûöòòöî÷òóøõý   ýúõóðøíöôñûôÿ  úúóõïøïòøîüôÿ  ûúñöî÷òñúíü÷þ  üùñøïõóïüíúúü úùðøðóöíúñ÷ýü   û÷ðöóï÷ïùò÷ÿû   úöðõõíøï÷÷ôü   ýûõòóöîøñôùóü   ýúõóòøíöôñûóþ   üúôõïøîó÷ðûöþ  ûùñ÷ïöòîûîü÷ÿ   ùùð÷ïõôîûíüúý  ÿúùïøñòöîúñøýû  úùðöòòøìùóöÿû  TiTAN(@ @ Ò 1¡@€@¦ýçÚ &Xïô£ßõþÿüþÿ9Hööæ¤ôõ üþþ ?.òÿ×°ùúÿÿ@ñÌÄüûÿÿÿÿ= ïþÃÖûüýÿÿ"8þöö¿êøÿþÿÿÿ+-öûíÀù ùýÿþÿ ýÿÿÿÿÿÿ(òçÐüüÿÿÿÿÿ,óÚØ þüÿÿ/õþÐâûýþú1òÔ× ÿÿýþÿÿÿÿ2ôúöÏàùüýÿÿÿÿ#/úúùñÈî÷þÿýþÿÿÿ,'óùéÆü öüÿþÿ1ïÿùßÉ úûÿÿÿÿ6ñûøÓÓýÿûýÿÿÿ4õúôÊá÷ýýÿÿÿ'/øûùîÅñöþÿþÿÿ /&ñøåÅ ÷ûÿÿÿÿ4ðþøÛË ûúÿÿÿ8 ñúøÏÖüûþÿÿÿ!4öøôÇä÷þýÿÿÿ).õþùìÃõõýþþÿÿÿ 1#ðúâÄ øûÿþÿÿÿ6ñûöÖÍ ûúÿþÿ5õùþóÍØüÿûýþÿ'0ùûùüîÆç÷ýüÿÿÿ 0'òûûæÃ÷õ üüþÿÿ6ïþþøÝÆøûÿþÿÿ8 ñ úõÓÎüúþþÿVøÚÇøûþþÿÿØ(Dô øþÿýþÿÿÿÿÿÿÿÿúÑÀùûþÿÿ4;õûùüþýÿÿÿÿÿÿÿÿÿöÇÊýúÿÿÿ=/ìûûÿÿýÿÿÿÿÿÿÿÿÿî¿ÚúûýÿEëüÿûþþþÿÿÿÿÿÿÿÿôÇÌÿþúþÿ,Býõ ÷ýýþÿÿÿÿÿÿÿÿÿþåºíõÿÿþÿ@,ìûûÿÿþÿÿÿÿÿÿÿÿÿùÏà ùúÿÿ!G î øÿþýþþÿÿÿÿÿÿÿÿÿí½Þùüýÿ 87ñþùûÿþþÿÿÿÿÿÿÿÿüÙ¼ ö üÿÿÿFë úüýþþÿÿÿÿÿÿÿÿóÃÑüÿúþÿ/@ùø÷üýþþþÿÿÿÿÿÿþá»òöþýÿÿ0?øøøüþþÿÿÿÿÿÿÿÿÿÿàºòõÿÿþþ1>øø÷ýýþÿÿÿÿÿÿÿÿþàºôöýýþ1?öú÷ýýýÿÿÿÿÿÿÿÿýß»õöýýþ2=öú÷üýþÿÿÿÿÿÿÿüߺöõ üýþ4<õú÷üþþÿÿÿÿÿÿÿüÞ»÷õ ýýþÿ4;õûøüýýÿÿÿÿÿÿÿÿýݺøõ üýþÿ4:ôü÷üþþþÿÿÿÿÿÿ÷ÍÅ úûÿþEë ûÿûþþþÿÿÿÿÿÿÿê¼âùýü+BþõøýÿýýÿÿÿÿÿÿÿûÕ¾ ÷ ûþþÿ?+ìûûþÿþþÿÿÿÿÿÿÿñÂÔýüüÿ!F ï ùþýÿÿÿÿÿÿÿÿÿýߺööýýþÿ 77ñÿøüþþÿÿÿÿÿÿÿöÉÈûúþþFì ûÿüýÿÿÿÿÿÿÿÿÿþâºðöÿþüþÿCìüÿüþþÿÿÿÿÿÿÿüØ» ÷ ûþþ D ï ùýþÿÿþÿÿÿÿÿÿøÌÄ úúÿÿ+AþöøýÿþÿÿÿÿÿÿÿÿÿòÂÒüÿúþþÿ 67óýúûÿÿÿÿÿÿÿÿÿÿê»ã÷ýþÿÿ>)ìûûþÿþÿÿÿÿÿÿþߺôõþÿþþDíûüýÿþÿÿÿÿÿÿûÔ¾ ÷ ûÿþ1=õúøûÿÿÿþÿÿÿÿûÔ¾ ÷ ûÿþC!ëýýûþÿþÿÿÿÿÿÿðÀÕûûýÿÿ(Cô øþþýÿÿÿÿÿÿÿÿþÞ¹÷õýþþÿ =/íûûþÿÿÿÿÿÿÿÿöÉÈûúþþÿEî øýþÿÿÿÿÿÿÿÿÿç»çöþýÿ4;óüøûÿÿÿþÿÿÿÿúÓ¾ø úÿþÿCëüþûþþþÿÿÿÿÿÿÿð¾Øùûþÿÿ 48ôýùûÿÿþÿÿÿÿÿÿÿöÇÊýùþþÿ*@þõ ÷þÿýþÿÿÿÿÿúÐÁøûÿÿ D ð ùýüþÿÿÿÿÿÿÿýܺùõ üýÿCíüÿüýþÿÿÿÿÿÿÿåºëöýýÿÿ=)îûûþÿþÿÿÿÿÿÿî¾Úúûþÿÿ 66óþùüþþÿÿÿÿÿÿõÆËýúþÿ,?ü÷øþÿýþÿÿÿÿÿÿúÐÁ ù úÿÿ@#íþýûþÿþÿÿÿÿÿÿí¾Ûùüýþ%Bò ùÿþýþÿÿÿÿÿÿýÚºýö üþÿ :0ðúûþÿþÿÿÿÿÿÿôÄÎþþúþÿCí úýýÿÿÿÿÿÿÿÿÿãºîöÿþþÿ0;øúøýþþÿÿÿÿÿÿùÎà ùúÿþÿB íýþüýþÿÿÿÿÿÿì¼ßùüýÿ<*ïûûÿÿýÿÿÿÿÿùÐÁ ùúÿþÿÿAíüÿüþþþÿÿÿóÆÍýúýþÿÿ D ð ùþýÿÿÿÿÿÿÿì¾Ýùüüÿÿ,>ü÷ùýÿþÿÿÿÿÿÿýäºîöþÿüÿ 64òþúûÿÿÿÿÿÿÿüÙ¼ý ÷üýÿ>&íûûþÿÿÿÿÿÿøÎà úûÿÿBîûÿüþÿÿÿÿÿÿúÓ¿ øüþÿÿ ;-îûûþÿÿÿÿÿÿÿïÀØûûýCï øýýþþÿÿÿÿýݺùö üýþÿ38ôüùûþþÿÿÿÿÿÿõÇËüûýþAìüþûþþþÿÿÿÿþæºëöÿÿüÿÿ*?þõ ÷ýÿþþÿÿÿÿÿÿùÏ ø ûÿþÿ>(íÿüûÿÿþþÿÿÿÿÿí¾Üùüüÿÿ>'íûûþþÿÿÿÿýáºóöþþÿ>&ëÿüûþÿÿÿÿÿÿÿþà»óöþýþ?$ìþýûýÿÿÿÿÿþß»ôöþþþ>$ìþýûþÿþÿÿÿÿÿþÞ»ö÷ýýÿÿÿ?#ëýþûýþÿÿÿÿÿþݼ÷÷ýýþÿÿ@!ìýþûýþÿÿÿÿÿýݼø÷ýýÿÿ@ ìýþûüþÿÿÿÿÿüÖ½ ÷ûÿþ%Aó ÷ÿþýþÿÿÿÿñÂÔüúüÿÿ 9-ïúûþÿþÿþÿÿþß»õ÷ýýþD ï ùüýÿÿÿÿÿÿÿ÷ÉÉûúþÿÿ37ôü÷üýþÿÿÿÿÿè»ç÷þýÿÿBìüÿüýÿÿÿÿÿúÓÀùûþþÿÿ)?ýö ÷þÿüþÿþÿÿÿð¿Ùúûýÿÿ B ð øüüÿÿÿÿþì¿ßùüý+=ü÷øýýýÿÿýâ¼ñöþþÿ 53òþøûÿþýÿÿÿü×¾ øüÿÿÿ<&ìÿýûþþþÿ÷ÍÇ ûûÿþÿAíûüþÿÿÿÿÿòÃÔýÿûþÿÿ"@ò ùÿÿþþþÿÿÿé¾ä÷þýÿÿ,;ùùùýýþÿÿÿøÎÆ úûÿþÿ>#ìþýüþþþþì¾áøýþÿ"Aó øÿþýþÿÿÿüؾÿ øüÿþ 8/ïùûÿþþþþóÅÒýÿûþÿÿAî ûýþÿþþÿýâ¼ò÷ÿÿýþ.:÷úøýýýÿÿÿ÷ÍÈ ûúÿþÿ? ìýþûþþþÿþê¿ãøþýÿ&?ó øþÿýþÿÿøÌÇ ûúÿþÿAï úýýþÿþÿü׿ øûþþ?íýþûÿþþÿþá¼ôõýýÿÿ 8,îûüÿÿþþÿÿë½å÷ýýÿÿ07ôüùüþþÿÿÿòÃÕûûþÿÿ&=õùþÿ(@ @ E @ @€úÿÿÿþB"â þù ÷í±ñ éüüùýþþÿÿÿÿÿÿÿÿÿþ,?ëú ñ ùøÂË%õþ ô ùþüþÿÿÿÿÿÿÿÿüIæóÿüýÛ² ïõýüÿÿþÿÿÿÿÿÿÿÿB$à ýûøî³î"é ýüùþþÿÿþÿÿÿÿÿÿÿÿ+@éû ñ øúÁË%õÿ õ úýÿÿÿÿÿÿÿÿýC$Þýú ÷üÿýþа ðôþþüÿÿÿÿÿÿÿÿÿÿÿÿþ2Dçû ñ ùþûþþÿë£ò"éýüøüþþÿÿÿÿÿÿÿÿÿÿÿÿûVãñúúþþþý°Ä,ò ô øþýÿÿÿÿÿÿÿÿÿÿÿÿýO&Þüú õûþýþɧ ìòüüÿþþÿÿÿÿÿÿÿÿÿÿÿÿý5Hëùð øûüýÿé›ñ&åúÿùüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû\áïøùþÿýþý²º.ôý ò ùýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýI0åô õüýÿýÿÚšç÷úùþþÿÿÿÿÿÿÿÿÿÿÿÿÿüZ ßòøúþÿÿÿµ´*úøñ úýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿC6éò öýüýÿá˜þ!äùÿùüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYâôøúþÿüÿÿ¹®'ÿóñ úúýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ><îü ïöÿþûýþÿç˜ô&äúþøýÿþÿÿÿÿÿÿÿÿÿI2éòõÿýüüÿÿþþþÿËšêòûúÿÿÿÿÿÿÿÿÿÿÿÿÿÿû`Þõö ùþýÿþþÿÿþþø¥Á1î ò øþýÿÿÿÿÿÿÿÿÿÿÿÿÿú)døæê üýøüÿýüÿÿÿþÿÿ×’å÷úùþþÿÿÿÿÿÿÿÿÿÿÿÿÿþS5åóóüÿýýþÿÿþþÿÿþ²¨-üõï ûüýþþÿÿÿÿÿÿÿÿÿÿÿûh Üîù÷þÿýþÿÿþþÿÿþôœË4éõöþýÿÿÿÿÿÿÿÿÿÿÿÿÿþý:UñòëøúúþþÿÿþÿÿÿþǘéòûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿüeÞõ÷ûþýþÿÿþÿÿÿÿû À5ë ò øýüÿþÿÿÿÿÿÿÿÿÿÿÿþü5[öêëøúúýüÿþÿÿÿÍ•èôûúÿþÿÿÿÿÿÿÿÿÿÿÿÿübáùüõûþýþþÿþþÿÿý¦¶4ñýñ÷üüÿÿÿÿÿÿÿÿÿÿÿÿþü-bùæê üýúýþþÿÿÿþÿÿÿÓ“ åõúüÿÿÿÿÿÿÿÿÿÿÿÿþELìùíõÿüýÿÿýþÿÿÿþÿþÿþþþÿõžÈ4ê ô øýüþÿÿÿÿÿÿÿù&làí ùúýÿÿþþÿþÿþÿÿÿþþÿ¼¡#ðð ýÿüýþÿÿÿÿÿÿÿÿÿÿü a/×ûù ôüÿüýÿÿþÿþÿþþþÿÿþþÿÚ“ý#äøúûþÿÿÿÿÿÿÿÿÿþýEYâúìøûûþýþÿÿþÿþÿþþÿÿöžÎ.ëô öÿþÿÿÿÿÿÿÿÿÿÿû#nÞìùúþþÿþÿÿÿþþÿÿþÿÿÿþ»§ðð ýÿûýÿÿÿÿ 25 May / 2006(@ @ qCqC@€ûþ6ä þûøþ÷¾å!îûùþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿüBéôÿüÿãµ ëõýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿý(<êý ó úüÊÅ ûú ô ûýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=$à þûøó¸ä#íûùýýþÿÿÿÿÿÿÿÿþÿÿÿÿÿ+=çþ ò ùþþÿÞ® ìøûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý?#á ýú ÷üþÿÃÂ"ûú ô ûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüHçóúúþÿõ®ã&ê úùþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþÿ+<íû ó úþýÿÝ« ìõýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþA ä ýú ÷üýÿÂÀ#ûøó üýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýIçóûûþÿó¯ã&ê úúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ,;îù ò ùþýÞ« ì÷ûýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýA ä ýú ÷üýÿľ#ûù ó ýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ%Bñõò ûÿûýþþô«ã&ê ú ùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=(çö øþþûþþÿÛ¦ éõýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýJâôùúýÿýÿ½»%ûùó üýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%Cõòð úûýþÿòªÝ+é ûùþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý='êø öþÿýÿþÿÛ¤ éöûúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýK äôøúþÿüÿÿ¾º$ýöó ýÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ%Cöñð úûýýþÿóªÝ*ê ù øþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ='êø öþÿýþÿÿÜ¥ éöúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ)?ôõî úûýÿþýÿþ½·%ýöñ úýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþA%é ø ÷þÿûýþÿÿþò¤Ü,è ø øýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûN åõûûþÿýþþÿØŸ çöúüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü+@÷óð úüýÿþþþÿº³&þõñ ûýýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþC"ìø õüÿýÿÿþþþÿó£Û,è ø øþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüOçôùúþýþþþÿØ çöúúÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý*@øóñ úüýÿÿþþþ»³&þöñ úûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿA$ìö õýþüþÿþþþò¥Ù-éù øÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿý*@øóð úüýÿÿÿÿþþÿÿþÙ›è÷úüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýD#ìö øþÿýýÿþþþÿÿ¸­)ýöñ üÿûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûRçõúûþÿýÿÿþþþÿòžØ.é÷ øþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý,@úòï øûýþþÿÿþþþÿÙ—åõúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþF!ïö öýýýþÿÿþþþ¸«)þõñ úüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúRèòøúþÿýÿþÿÿþþþòŸÖ0ç ÷ øþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû-@ûðî ùüýþýÿÿþþþÙ—åöúüþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûQ êöøûþýÿþÿÿþþþÿÿµª*þóï üúýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý&Hêî ûþúýþþÿÿÿþþþÿÿòšÔ1ç õ ÷ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýB*óô ÷ÿýüþþþÿÿþþþÿØ’äöúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýT ì÷ÿøúýýÿÿþþÿÿþþþÿ´¨*ÿóï úúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü%Iëî ûÿùýþÿþþÿÿþþþò›Ñ3æ ø øÿþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿA*ôô öþþýþÿÿþþÿÿþþþØ’ âõùúþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüS íöøúþþÿÿÿþÿÿþþþ·¦(óï ýþüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý%Iëî ûÿùýþÿÿþþÿÿþþþóœÐ2èö øÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüVëôøùýýÿÿþþÿÿþþþÿÿþØ‘ ãöúúþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü,Fìî ûÿûýþÿþþÿÿþþþÿÿþµ£*ÿôð þþýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI%óõ öüÿýÿþÿÿþþÿÿþþþÿÿó—Ï4æ ö õþýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûYíöÿ÷úþÿýþÿÿÿþÿÿþþþÿ×!âõúúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü+Gîï üþúýþþÿÿþþÿÿþþþÿ´£(ñð þþûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþH%õóóüÿûþþÿÿþþÿÿþþþÿô˜Ì6æ ö õÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýYîôøúþýÿþÿÿþþÿÿþþþÿÙŽ!ãö÷ üÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü+Gíñ üþúýþýÿÿþþÿÿþþþÿ¶¢'ðð þþýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüYíöÿøúþýþÿÿþþÿÿþþþÿÿþÿô—Ë6çô ÷þýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû)Lìð þüùýþþÿÿÿþÿÿþþþÿÿþþØ‹!âõ÷ úýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþI)÷þ ðôþþûþýÿÿÿþþÿÿþþþÿÿþ³ *òï úûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü^îöÿ÷ úþýþþÿÿþþÿÿþþþÿÿþô”Ì6çô ÷þþûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþü)Míñ üþøûÿýþÿÿþþÿÿþþþÿÿÿ׌$á÷úùýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü,Iîñ üþûüþýþÿÿþþÿÿþþþÿÿÿéä2àþú ö ûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú Xðûûöúþýþþÿÿþþÿÿþþþÿÿþ² ,ÿòï üÿúüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü3Bïð øûûþýþÿÿþþÿÿþþþÿÿÿæ‹í-àûý ÷ úýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý]îõ÷ úýýþþÿÿþþÿÿþþþÿÿþþÿÖ‰#ßõ÷ üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú]ìòùúýÿýÿþÿÿþþÿÿþþþÿÿþþÿÿÈŒæðùúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü)Qíñ þüúýÿþþÿÿþþÿÿþþþÿÿþþÿû µ5ðþð÷üýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû Zð ýø ôûÿýýþþÿÿþþÿÿþþþÿÿþþÿЋ âòøüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû1Iîñ üþúüÿÿýþÿÿþþÿÿþþþÿÿþþÿù™¾8ê ñ÷ýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû2Hîð ùÿúüþýþÿÿþþÿÿþþþÿÿþþÿëÝ3âø õýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüQ#õóóýþûþþþÿÿþþÿÿþþþÿÿþþÌ‹åóúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûaíõùúþýþþÿÿþþÿÿþþþÿÿþþÿíÚ4ãù öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü [ï ýú ôûûýþþÿÿþþÿÿþþþÿÿþþÿÿþ·™%îí úúüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû5Jíî ùúúþþÿÿþþÿÿþþþÿÿþþÿÿþÿèŠä3Þüü õ ûüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúfëô÷ ùþýÿþÿÿþþÿÿþþþÿÿþþÿÿþÿõ•Ç5çòöþÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûfìôö ùþýÿþÿÿþþÿÿþþþÿÿþþÿÿþþú™¾3ì ñ÷þûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿübîùû ôûþýÿþÿÿþþÿÿþþþÿÿþþÿÿþý¡´/ôûðøýûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü?@ÿñï÷ûýþþþÿÿþþÿÿþþþÿÿþþÿÿþÕˆ#àôúúýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúcìôøúþûþÿÿÿþþÿÿþþþÿÿþþÿÿþúº2ïþðöýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüZ òõ õûûýþÿÿþþÿÿþþþÿÿþþÿÿþþþÿù›¿.ðÿ ñöýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûjéò÷ øþÿýýÿþþÿþþþÿÿþþÿÿþþþÿá†ñ,àúý ö üþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþü:LìíùúúþÿÿþþÿÿþþþÿÿþþÿÿþþþÿÿÀ“éî ýýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû7Oëî úúúþÿÿþþÿÿþþþÿÿþþÿÿþþþÿÿä…î.ßýû öüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüdë÷ýö ùþýÿÿþþÿÿþþþÿÿþþÿÿþþþÿÿ©¬%þõî ûúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþý>Gÿííöúúþÿÿþÿÿÿþþþÿÿþþÿÿþþþÿÿä‡ê/àýû öüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüS.ô ñôÿüúþÿÿþþÿÿþþþÿÿþþÿÿþþþÿÿ׆%ßöøüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü]ð ÷ ò üÿýýÿÿþþÿÿþþþÿÿþþÿÿþþþÿÿʈäïûúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü4Sêìùÿøûýýþþÿÿþþþÿÿþþÿÿþþþÿÿþÿÿþ¢·&øùîøüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü fêúû ô ùþýþþÿÿþþþÿÿþþÿÿþþþÿÿþÿÿþÔ‡!â÷÷ úþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûPúðéøúúþÿýÿþþþÿÿþþÿÿþþþÿÿþÿÿþþþþþ•æñûùþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú8ZþçèùÿùûÿÿþþþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿËáñüúþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû/cãé üýøüþÿÿþþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿ׉ÿ&ßöøúþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü jæùû ò úþýþþþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿþžÁ$ôüðøýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþü;Wûëç÷øûþÿýþþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿÓ‡ !àòúúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP=ñý íóýþüþÿýÿþþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿç‹ç,âÿù ÷þýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüläöýõ úþýþþþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿÈ‘äñúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù/dãé ýýøüýÿÿþþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿÿ¨·ýöí úýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüJIôõëöûûþÿýÿþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿÿþþþÚ‰þ%áöøüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûr áñö ÷ÿýýþÿÿþþÿÿþþþÿÿþÿÿþþþþþÿÿþþÿþþû¡Å÷üïøýýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþOFñùëóúúýÿýÿÿþþÿÿþþþÿÿþÿÿþþþþþÿÿþþþþþÿëŽæ'å ù ÷þýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\5êòò üþûýÿÿþþÿÿþþþÿÿ(@ @ * @€AÞ øÔÚú øÿÿíì1í =ðÁ°'Ã?MãçS`¨(ô0_² #³ ÷hÉÔá åä-WP ƒÕÒS‹!ë9 ªI“DûDp·Ù3›|æÎ7 ¶Ùò0º%/½]ÂîPËEÅ¿9óÔB¸ â«H2á¶î,Û¼qüØèGȬKÙ^¡ó:ÜèWr”¬ýµ oöÙà ê!W¢"þ¹`ÀãÜ®ãˆ5=àÑ*ØÀ+ÙBÝtÜõ Ãû·ë} ­?˨PÓéƒÿÙ#æ Ô‹ñ1Úùþ ô ûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿü k"âûù óúýüÿþþþþþÿÿþþÿþþÿÿÿþþÿþÿÿþÿþþþþÿÿÿþþÿÿÿ²¤ ìï þþüýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø*vÚêù öþÿüþÿÿÿþÿþþþþÿÿþþÿþÿÿþþÿþþþÿÿÿþþÿÿÿþþþþÿÿó”Ó&ìô øþþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýLYìõéòúúþýÿþÿþÿÿþþÿþÿþþþÿþþþÿÿþÿþÿÿþÿþþþþþþÿÿÿþÿÿÿþþþþþþÿþþÿÿ÷Ÿ×!ï ó ÷þþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú&rÝìù öüÿüýþþþÿþþÿÿþþþÿÿÿÿþþþþÿþÿÿÿþþÿÿþÿþþþþþþÿþþÿÿþþÿþþþÿþþº±ðï üüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû.dñêê ûþúýþþÿþþþÿÿþÿþÿÿÿþÿþþÿþþÿÿÿþþÿþþþþþþþþÿÿþÿÿÿþÿþþþþþþþþÿÿþÿÿþþþþþþþþþþÿÿÿÿþþþþþþþºÉüúò ûýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûaàó÷ùþýÿþÿþÿÿÿÿþÿþþþÿÿÿþþÿÿÿþÿþþþþþÿÿþþÿÿÿþþÿþþþþþÿúøþÿþÿÿþþþþþþþþþþÿÿÿÿþþþþþþþþþþþÿÉÀÿöó üýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"T÷ëì ûþûýýüþÿÿþþÿþÿþÿþþþÿÿÿÿþþþÿþþÿÿÿþþÿÿþþþÿþþþþÿþþÿÿÿþÿþþþþþþÿûûþþþþÿÿÿÿþþþþþþþþþþþÿÿþþþþþþÿÿþþþþþõ»è î úüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ ÿýþþþþÿþþÿ*.æöúýüÿþþÿþÿþþÿþÿþþÿÿþÿþÿþþÿþþþÿþÿÿþþÿÿþþþþþþþþ Love too you all! (@ @ s@€#Îøä™Rí™ú,Ú ßºëäm q¦ñf6OHâtíZP¹¢ tõâwp'_%a;¿P]{ÈBä:óÄ™µ§;iΔthÖ\¥h;ä§x<„I°ÒsI?}ƒH¬Î«‹Ù¬¡ólÑèÏßVŽ;aÆ®ÄlHöòÔ«ñúc&çÏÁÖ(ûÔ;^(ͧ¦/úúó ‚Ì®Æ$I ]òû/úóû Á®À8¨JÙÍ„|IÆ'¾Òx¥›6]8É ÉŽ ú£§ïwHº¡]°Óò ýúWè“)g-¤äÛêYzµ§FQ@gûÇ)l3 y4kû–ÙÄQïî¡å¢[Žk ßßÒIŽÓ¯jô¢{ÔÞ&(o\-~=Ó3ØúùmÅFËÿóî ûúüþþÿÿÿü r(àý÷ñ ùþýÿþüþÿÿÿÿÿð‰Ô4ã ö õþýýÿÿÿÿÿÿù}×!ìõ øýüþÿÿÿÿþþþÚû)ß÷øùýÿÿÿÿÿÿú6u÷âçúýùûÿýÿÿþþþþ¾çï üúüþÿÿÿÿÿÿýþQYé÷éóûûÿÿÿþþþþÿÿ¤°$úøî úûûþÿÿÿÿÿÿük8Üõñ úÿüþÿþþþþÿÿñÒ,éóöþÿüÿÿþÿÿÿÿÿúxÔñõ ÷þþþþþþÿüþÿÿÿ£·!üöð ùüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿû z Ö!ë÷ ÷ýÿýÿÿÿÿþþþþÿÿþÿþþÿÿþÿÿ”æï ûúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿú l-Ûûøñ ûÿýÿÿþþþþþÿÿþþÿþÿÿþþÿÞ†õ,Þùý ÷ûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿTQåþíôûüþÿÿþÿþþÿÿþþþÿÿÿþþÿÿõ‘Ô(êòöÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿù6sôåæúýøüÿÿÿþÿþþÿÿþþþÿÿÿþþÿþÛ…û+ßùþ÷ ûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþTCà ïôÿþüþþþÿÿþÿþþÿÿþþÿÿþþþÿÿþþÿÿÿþÿþþð—Þ+æ ÷ öÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýDXéõìöüüþþÿÿÿÿþþÿÿÿþÿÿÿþÿþÿÿÿþþÿÿþþþþù¤É%ò ñ÷ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû0lóæê ûýøûýÿþÿþþÿþÿÿÿþÿÿÿþþÿþþþÿÿþþþþ²´óï ûýþÿÿÿÿÿÿÿÿÿKCÒôþ ðõð Ä© ÿ ô ëî ÿÿþ7ïÇæ"\ÛóÇâ"øù ÷Ûºþß.Iº¹^,Ñ×úâ ÷æý&4þ!Ò²úìKA²,4ȧýð EFÈ´þ7Bí÷Ùªì+õ ôô ÷9Uãì âÂá]?çñûÿòñÎÑ/FåøªÉ6Rßù·Úç÷47úåòöðªÍ4 èØS3× êîùé®îKJü•Ú'>öñåá÷ÿâ¼þ%ÛÅÿüÓâï÷@Sì­ÎòôGBÚ Ë× ïÛ$& ùüê ÿûûï®àX8òÔòÜòììÿú9%ßïúûéQã ýùþúÿýýþÜèÙ¶ î÷þ,Töí"ЮòD;úßéÂüð øÿüþCHÌÑü#3íêöñÂí ë þøYÃýþÎÓ,Z¶Í"èÃï3(òÑà C½Ëö?Ôô4#Ò³ã)÷ =ì Ç­ ðþýõ ?#ÞÿßÂUݸóì(æ×þþåÎüöCæòìê ÷ýíè ôþî ,/àÞ ûëòý ú é¸êL3íý ëºãS0ìòüúßîì #ñõéÛ 3æÐð%ûãî0ò÷çÿìûí 3ëÿùöüåä"; Ô×üè$B Üøúòè"ù êÅü,%ýÚñïú/Cóññ ýìäþöþñÍ÷ð +ïÇÙ!JÙôÔÝ#A ¶Ä.åÎï;=ì»Ú&Fåù¾Þòü %ÿæ+ Úà5áÉî#éö ìþ7ú¾íþAõâþÖ¾ <ôñøî%&ؽÿ35ú¾Ô!7ù÷ñòúÓ÷ï úúþüüAÚÿÿêÅé="ñÔÝ/ñ ëâõûØ D éÓ¾-õçù+ùÜøõþݺì9@ûªä ñé C-ÖÞýúÚ ó ÿ<õì âÃö2(ýìùêýâ 0/ÞÈúíæúØÝõ %óÖà2 òüÝã îî ôüÿìå ù -âýêñ ÛÔ &ìÞó%*ûçúÞù ñã÷/øÄó èìø.ìù öðý ÿÞá$þû üæß)úüýÝÕúñá ýêÿ!-òÔã4öþêïò÷#øûôÓé6$îðôåòõû +Íß "îàõ øßð) è÷÷ÿîÓö $ð üÿöîûä &ëÜý èòûÿ%ì÷úîÎýò øï2ôÓâ7ÿßßõ% î ûØßüúèôõù ûÿ%Õá+æç÷ó ÿíý  ë êàí.Üàýõ üõ þ÷éú úýØÞüùûé× ÞÝ'îîïß üñ#ööûúüÜÙÿø ÷ÿýüàäóüúþÚè -ãÞòúüòüþúóÎò&(ãþãü&ÿçæÜ"ùîþüýú)ÙÛ%ý ïïðã0íûþôëôýù öó þ÷ù 3 ÏÝ ÷,ë ýÕàûìú éå ÿ!ÎÝ ýü#ùìóø ýð÷ùÿÿíþ øÑõù2úÑ÷ý$ùîôÜø&)ûÙì#óùþùýþòýôÿúúáÞ)þúþ÷üùÝ÷ðøçæ þòôíâóÿ)îýûêí çúõýý 0àúþ óßñ!óüîú!ûÈïø*üÑõ*éúû ìÐõ*%ÿÐãþýèè ù)öù çÑü þ øüáá÷úþøù.é ýëõ æÜ,ðøûôôÿ ýåõèõ'&üòüþþúéõî+éúþÿòêþúó þü"îûùÛÝüû îöúþýõüÿåá0ÿÝÛú ýèê.éûêæ+ÖÙ& ìÑð,'îòüýæî,ôáå(ïýÖæ(ÙÙ ÿ ðûðõ÷þþúý * íôÛí( àØ ö êì þ êå ÷ þ)úõ òñýÿÿýíÿõü÷#çõ ó÷ þáÕ)óÛÚ+ð÷îïþø  ðÿÿëï åå÷îûý õ÷ýÿôÿýö ñýøÿûêø"þÙ÷ñý)üéùðýýùÿìßõåþò!&îþõ úôï þýüÿíá ø  þíßë.%îöúÿãí1"ïÚâ äâ %çÖò%)öûóÙðò öõÿ ýà÷ æÞÿûôýó ëÞü ÿ ìùûÞÞ#ÿõýúóãÝ'èÐþþñ÷óãúþýÿüý%óõýÿäÝõáö&#ðÝçúú"ìåÛ/íî÷ýæïúþüúöè÷ ñöøðà ö üÿîí úüþçðýù&úø éÙû$ ýö ìÚý ùú ðÜöôóÞÝ 'óÿùýßá ý üáî óü ù ìûþø÷ÿÿö'ìûøÜäèýêåéÔ/îÞýñýüÿ$ò ÷ý÷û÷ìûüæþ "ü×å,ôüâá& åç ÷ó ûÿ#ôý óàë&öþúüÜâ%ìýàë'áà ñâóöùùÿÿöùü*úÏð) áçýôêÿ÷ùúñí ÿöÿÿ )ð ùöóÿéö÷õëüþÿ#ãï ôãõ%$ñãì $ ïüûÿý÷×í' ßùêúçýðú+ûÍóüø'æç÷üÜí#ðøþ úýðÛý ô ûÿøñýÿíðÝ ëôþýÿï÷ùûÛëõ þòü$òÜë( ßæ þý ï ùÞèÿÿäûõþü æä/ìíùñ ÿþóý ñîåî&ååô ÿüù ÿúñöüþýäÞþ ûýüìÝ ßä òôÿòè òýùùþùúßç þ öÿþûæêóþøü æê.ðÿòâüùÿøìý ðóïü$ûùø÷ÿèâÿû ûñâà ù æùìð  öï÷ûýúýýÿóô÷ó&íôûùþþþïøßø ýÿý ÷üÿöÜ. ïÞüûþý åá%ôëâóáÿòþø(ãêúíÿúÿþ õòûþ üýöõþêûøùñûûþÿëÿý úýþûå!öõþüäü ìÜ&ôæ÷îÜùñ÷ûý ûðãù üüýü÷ êáþ þ õêõú õäí"õûÿþþþøü üúúêÝ ÿüøúÿÿÿç÷# ò øëô ÿüýôäóçã"òëöþöþüïáý ùêß ëàûüíåøöÿùàìþþÿúþ õööêñ$ôþú üøïî õþÝí# ôÿåñ öûü ÷ö üÜï ÷îòøúþ÷ÝûÞæ ý ûý÷óý  ôæÿ óëþ ÿñôùù ÷âì ÿùüòìñøñ  û ÷ÿÿþûàôíûñýûÿøýûòûýúâô ûûòîáúøõçøÿýþÿ $éöý ö÷óå ûþ"÷ñÿýìï$ôìì ìê  úéú÷éï ÿþýñþèå ûù üÝíüþíúýüñÿ÷íýù åâÿ%÷ëÝ ô$ãâ÷ý÷þþøêþþûóÞ÷üóæãõóý ùóñ ÿÿáè ýöþ ùúýíøï!ìßõøø $ ï ýðûýøäú ûÿûü ñèüüöýùüþúôà ýýûøêãÿøòûùýùõðõ úÚæ ý øçóýùþ ÿ÷ öôúþíÛ,íßô úûûõøöüóôáý ßêù$ùûîßû ùûïûòèûñï ôïùäë ùú åë ñøÿûïéÿùßï þÿÿØò ö ýèô ÷þàî ÿùúþþøÿùöü ÿÿÿÿïæÿûþõÝûîûðë û çãòäüùêë ÿ ÿûøãïúúî ÿàì ëôûëöþúýýðóüý íÿ úüçô ü ÷úîü÷ôêùõüëâýøÿèæ ø ÿþÿ çñûöþ ýùü êìüïãê  ûãìòíÿúÿ øôúýïð Øôüàúöý#ýÛò ÿ ýàì ðêøýûÿÿþÿ÷ó ñãñÝýÿùìâøëþíï ñëó  áãóùóñýö êóþý÷ûþÿ òýäîñøþ üþøäøçðñòýþ ÿôøïâòÜìùõþýý âéôëùøþÿÿüýóñ÷ùý þñþí øüûþü÷ú ÿèõ ùÿùý üÿçê ýïøóõÿþíüÿéõíåø ÷ÿÿóî üÿæê  íòõô óóÿÿ ûûÿöôùð ýöîåö ñãõôþûöøü ýàò òúþýôý ÿòÿþùüòüþþòù þÿÿðí õøòí  þ åë  éî ÿ áê üóýþ ùýüëï ýÿûüÿÿúú  éîýÿøé ú ïçúÿþþÿýøý÷éæ üöû ûï÷ÿûÿ ý òüÿòöúýúþüüö ðî üûüþ ú÷åý ÷ ôôÿ ô÷ûñú ïòÿ óçú ûøûôòÿýîè÷íýò ùðþ  ù üúôûÿñ öþúçðÿýçï  ÷ýûÿú÷ü èë ù÷ýöÿûóýþúúõûúÿþôüÿþÿþÿùí üó÷í ÿ îè÷ç ïæÿ ø÷ÿýüòëúûýÿýùñì÷ ûýî÷ÿøéõøýþÿþýúÿöòåþÿýøþÿòôö üöð û ÿýþÿ÷éþö íëöòýÿüþ÷ý ý ÷îô ûôìõ ýöèõ øôìøýéó ùõø óýîû â÷  íê ôþýüî øéý÷ õèýêïþ ÿùûøþ÷ÿû þúöñôüìðû ÿòøòõÿþöõûÿû÷ýûþîþ ÿøÿþêðùýèóõþöûÿü ûþýôü ñõ ÿûö ýúûÿþúÿü þûþþýüóøðû÷ ùøùú þÿÿòò óøûú ôÿýùúù ýñ(@ @ d@€Q–Ôâ>TÐgÃ1åÝ`ÖÎ Jê׳0!•Aä}Àü8®L§å•œ'B‰ð<)Û¹G\¥ÚÕ<ÂÈ^¾RûôóÜá:ù‡K3¯VæÇ7ÿàÂcÊ«2ç*.þ÷ÜÿðÞ!Ìû,fƘ Õ-?Úý 6 ëÿ»ýÓ4×Ñí{á¸ÁqæàlÞÅ^þÙµàDý !C,É×*¯ð»„%ªõ.Ú'íÅ)ã@„ëç]í OåŒ-ôÿ!,â c˜,J¢á§1xáïÎÃ+&À+Üh¨9çÎú"$É6o@¼Ö"üþp—Îa*¼ô0áñß8$®ýóíèuºÛ„ζ»\4ÜÏ>ùâ¾çmð›ZÿáÇ´=`ÕnøßÕÿ)Œìyç·ðTÞñþå uÛÅÞÜ7Ä1î!¾$ßÙü,‰9?©Ñ$üäц#ÍÃÌC4ð/ àÜÌ?öX¢%èïm¸çd£$èö[°,.•ë"rÏìôß @Ûøä)ÿ#Ê´püõ¹ù $ä/b¢è+âß6÷¬ŽðãóøùþþÿÿÿÿùÁ ò øÿþÿÿ'eæøûüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûþøüþÿ?^ûñ óýÿüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÚœáñ ÿþûþÿÿU>èøùþÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÁ¥ ô øýý'aäøûûÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿí«Àüýøüÿþ?[ùô ôýÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÛŸãòÿþüþCðض8HÏþÌï @âÒ2)‘úXèÛè.,ï%¤ JìKÒê!ÌÆQ °K÷à)ÅúRï÷躹BV×êËË ! 9 ýÁ±&Û1G¥Òð4¦06Ëý VÏß-ðø—÷4ñ0§ Cž1ÄÅ_ûì !'ÿÃÒb*µâõÎø,aijã:îéIŒ@ø¸7Öã)H¯ÙI£þ%VèÜÓoó±þ$÷ÊØT(ζ[<ÙÄ®*- Î2ÜöàòNºÍÝ]/“H­ ªû 2è BËÞ#.û² ïàOõƺC­áýø(Iů0PøÙþóö,Õíí%×NÜê?é*Ó¿#þâ4Èú ä½-9ñüÄèíÌ^Üæ<×ëñ$Ï»d ÑÓ[ÙÕ6ã-·!Ã÷ séÆÀþBêñ4ì»þ'íòì`è ÷L6õø×þûÕJÊÞ(îÅ&3&À¹0ê)õþÿâOôëãºÅè,9öÒQø°Ý(õßÙ<$Âü=Ó!ÙTÅíÌ-TÝÞíëé7 ôËÝï)=”9:ÌÅÒ7AÊð2$àò ÁG¿Ô0*ðïÇðE3â£NÿíØð'æ§B6ÿÙÊ%6äïûýÝ=9ÀôÚ+ú#ãï%â!öÔ Ñõü%ï³#*<Õßùí0óÉ*eßæûÌû9 #ñðç&çö ¡8Í(Ô <êÓ<ÚáÕ'Ì>áÒêN)ÂõÏÌ+91óÔõà¿ú*'îíJÑÖÊ9&åèÙ_=ÈëäçQïÖ_¿¯<õâQ6ÂÓ8¹.¤/ëý#úâ÷âFû¨'GÃòÚAÛ!ËMðÇ9ìÎ$ ¶ðëê/ ÜçGôïÕ¥B8 òÔÛ÷6ÞÇ8þ ÏÝ9÷ïìû@Ç£"'¾ó:÷÷ÿQßÝ9ª÷Jó¾0ÖE·ÕQ¿!BõôÚîý, —*:½?ùÏ&ýîÏGå³ø%ûèøíîØý +Wů Ú7æú #÷ýÇúÔ(é çãfòýÏÎ[ëá]åÊEêÇá/þÑ  9$Èå!ÉñÌg!ºì+èõ%øÌõ;¶ò ÛCâÞèï*ûùà%ë ÑÜíü°!8Ç Û(ûèãfÖâß $úïê Ü(Â&Æë?ùØÿ6ñÕã4É&Åï KØê øëÄ1 þáë!þÖÊSþøÔûó-0¼ýõ òü¸æñ< Òó öÐôü*'ÄøÕ-ùì+É ( ²É6 ì ÁDÑ åä¼#Ðùõì-«×F2ÓÿÏ*1îÛí0ïÒó-Ä$ÜHÑ>Ìñ°uâèVÎÌçG·>ÒÞâ>Ðò;È(üÑ:È.ÿÞP þûõåäªIË!ÈùÍ-«ý!òñúå êæ O¤òêø7ç ùÿØç×ýúþÕQ ôé½F ÍE¶-ïßÌÜï 9îÎ ÛóÅ+NÐ×â Þ ð9Êää.ü+½ ¥÷ãWß×WÑàÚàbäòÙî$áý3Ü,õ×8ë òîí £ð=âÙø@-·Íï49Üæ&ÕÊG éòäòá æ(åò'ì ïøé °)âçþ<ÀÛö3&Üïý÷éû.üäé éò6üÇGÓÕþ5"ïß+ùäçä<þÉ*ôíÖ0ÏÍ6#ÿ åêû!ÓÙ=ýÚå+èùþòú?üØñí Ý÷Üðä Ìë$Íè ñþÖ>1Ýùôß $ óðÿàçã0Õð3 áñ& × ûì4ä#ÍÿFøÝ ýöÔí'ûóïéû¾2óÜõÿ ü7Õê÷û÷ÖÔü/áé Ùþ÷ÿþ-ââÛá!èí*Íó+ÒüèÍ5Õ òàòèÿ*Û.åÈÖ>íáæ *Üèø÷Óéê$ ¬ö#óÍ!÷ó2ÂÆå%êÚ4å!Å+é"Ñ5ú÷ðåÿ #ËßGâ,Î Ü/¼ö!úñüë üâ2.¿Úþê%ç  ÿéÞå ò Ò0!íÿÁ)Ò.Ç1âæöÜü( Þç2îßÙ ýïÿñüì (íáå 9é×-ýß"ççùïÞý òßðú$ôúéÞ&ÿÛò ö" Ññ-îõÿú ø çüøëÝøÙðÿþóçÿîàøüßü ùÿç'öíøóò þÒþ4ðïä"àòçâØ þ5ìçÞ ñøôæ ÷ÿð!Ñë& úùé éÔ ìí Õíúù ùÿþ ö%óüõÖöíâ !âßýÿþçþÞ ìÝôøÉì Ûü÷÷Ð 6ãðå+õìöþ$åèàü Þ;Úá þìð åí÷ ÿ,õþèòßþ3æ Þêò ñëÙ'ä åö%ñáþö)éôÖ-àèéÿ ßÏ, Õ ï'%Üóüîð"ÿà#ñçíÈ ñìæùéþ0ôìíÜ úñ"îùø ÿûÈöúôïüúùüóÛ ïñûúåîóôþî ðîðíýüòúÜ èë ÿëßÿ úúýööø óà ñ øý  ýÿÓþôõÿ ëòùíùôÿþø!÷ð v1.01(@ @ @€&þ|ë DMýûø øᬵüùþRõ þûûõî½¼ô&=) ÞÅÅéìæ(ûó)ïÖ×úþ!ÿÛ)çÒ 97#þúþõÏÉÜùé H:ý òí×þ îÿÿýøý#JA ñû°ÖC ü/äãøüÒá-ö%ÑÉî÷ä Úô B*3 æ ùÿé¾úþêÿó$( /íì ƽÊú þ óá þþþñð FI ßÞ! î ÷ýüìkÊAÜòóþþûþþÿÿÿÿÿÿÿÿÿÿÿÿÿ5u Ø ëô ÷ýÿüÿþþþþþþþþþþþþþþþ½o!Ýðø øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿT`ìðçöúüþþþþþþþþþþþþþþþþþÿû÷Ëv 'Üñø øýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`Fà ëð üþúüþþþþþþþþþþþþþþþþþþþþúñÜ}î4Øøü ô úþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ† Ò&ç ÷ øýÿüþþþþþþþþþþþþþþþþþþþþþþþþþïèþ•Ì&ì ïóüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEgìñåóùùü¸Ø3ê%ðÏÝ ×(-¹úê/º5Õø+%ËÕë,Òíñòò5—6-Ýö:ñÆì0ïà&¸9 #·KÌýSÀ»þ3îå9ËÛEÊî.àþ"«#µ+ù(Û ÎúQÕßï Öð5ÝÒBåæÎ!ôè,ôñç<èÞåûRè¼CÃ?äØëâ(ÏüøÍñæ<ãÚÌ9ýÌè îü.Åä9æõõôØé)á1Ë #á3ÌéøÝ"×ÕÞÙ%Äø@Ùã)&Àë?Ê$¿E%Ñ é ðùøûÒ?ùÄRöç¼&ßÞ)%ÞæÂ?Àê4Á ðòõô3ÜÞXÅì2Þúñññê ë<÷âôÝáú -ØÍHðÎUÜÿå÷çÝ<³ÿÙ?ÝÇ&ï &¾=ÀøÆáFÿÓî1ñÿùêåî(ýÏ óîð<åðÜ1ëòÎB¾ý3ë ÇëFÖó+üæ þÂýLßÓ$÷û Æ+ æìçù.íÎ%Îë2ÐùDðÔý Ø  úëÑúòô2Ä7Úè6ðÉ3åýíîÞÔ-õï÷ ×?#Âû ùÝÚ'îèMÒÝç$öÐò&*Ðì2Õá."Ü 6ÕÔüð;Øâ&#ÛÿÛû#Ìå5Ñäï'#ù÷ùÇéUëê íÞ.®",øÓõâù+üáÔÿ-  Céæåï,ö÷Û/Ëûý÷çëè!!ö÷ÿþõïå×÷++Úâ¹ôNðË1ÑÕ:ð ÷Úø 2ßúþ òìûû *ä÷%ùüýôÇ@ÑÐ6×ä"ñäÚû%Ø5æä $ûëûæ;ðÀ!(Öý üÙ %Ê)"õùùêôýðææ#íÓC¹-ñÖAÎ2œW»ôé4ì&ëí/Ë÷$Ï $Ê@ð ×çJþÕ#Îß3Æë?í !öá,ýöúÎ Úñ5Éñò'Ϲ$'§(õPÄçò%àÕÕð÷ éå$*ßë ÷ñÎôéß6Îå&é2åÞWå×%çÕö4óÍ2Ùöíý èø öÆ7âºCí¿Sòèô !Ë÷5Çæ4ýð )½÷4ó½'/Î öçè-Ó =µ.ÔÂIíÒ\ÇâåÃ7«"ò ò üþ#þÎý$òõýæ-Ü þöþÝý,ã ôÌò #ïÊî5Ù ¥1ðÝ#&ãÜ*¾öýèû ýúÝë  ç;ú¹éý*÷î øâ÷ßòñìCè äÜEéãBñÐ4ûüèââ'âç ßÊ0,Òìä ù ç÷)Ëè.ë ¿.¾ýüðòKÂ>ÇþÔúKðôýæûÞ(Ñ1îâ3áôó é ·%Ýñõ6 Èðõ+Ü÷öþëý)ðàö æà<ú¾MýåÞö,÷à"÷êçæ>òÓ ÷÷Û!ÕÙ7úçôü$Ñã=àé+ èþúé>ÿØöí áøÿÛ&âìñ'óÓ,ÿß õ ôõ/ø¿8 ÔüÜ0 óèú'öùß Ç)úîJÆ "ÂE»÷Z°%&µÄõ#óà+É1åù ðæïø9æ Üÿß Ý8¸ )Üõ þÇ,ßïü ýþü÷ûñ æý@æÈå,ïó úÞççãú?áÚéCßîBäÛ5õþãé!à#ÝíÛÌ; Ñòøïúåô Éõõ(èÄ7ôÄ(&öÄâ éöìÚñä#.Äø;Òþ$Ìÿ!ì'ßôÓá.ô×Ó$Èðýõ -îÏ .ÿéýý íðñþåý.áú$å$çÞúêàÿ× $öïãô ïê3 íòåï÷Ð0ãïü3èê!ë&Ê%ÝùîEñïãô%ùðôÛÿôè+ Çúúðù á+èèÿúâáÝ ñüúþá$åçëÚòö À('àúß(òíûù(ùéÚ Þ Ð,/Ãõ"ÿèüÙò+î +áÿéýÚ7÷ãÕïæîðÚ-Òàüí#âð¾ 1ëóéè'Å1Ü7âôéß#Ä+ã Þý,íöÞúÜ1á âë öù âÝ ä/ËõðÀÚ 4çðãúþ/ëäúùî&«+ê÷ ñ ûæç8Öü ÿçø0éàì$ýî¸#Ç& ÿ çåï÷.éò+Ç àâ.îÙÜ!ø×ôÿî Í 'ùÎ/ôÙÚï)õ ØìúÕì*æÝ*ÞÚ.àú(Ë&-Óî ðùü×%¾F úÁ%êÖ,èÝÏ'#Åþê-Ðúçû ö,óÐDÙã2äøôïùêü ó1úëðß  çú.ßöÏ1 ÐGçöåúìÚ&½ æó1óËù-Á!Ìþð æÒ3 Óç3ùüþïéïü& Óûõ üñ)ýÁìé&ææ"Äúéüùàöü+Õç9áú1èþàÿú È Ïþàþñï û" ïÿø÷á$Ñø"ë×Ó.åæûé  ÿúÞóÿûüö(ýÑ/ßþ#Óö5î ý÷ùõÎ ë÷ ë@åãûöÜõÜ#Åú÷ßä +ùÒîØ ,÷ç-Ôîï'óß*øòæò&óÔ-ðßî &úþàê#à&$Ù üíë2Ñ ûýâÔ öýõ÷ðïêôþ êç;öÒåî2Î(ºSûÙññ2ôüáÎ ÜùÖ*÷úÙþ2ßúßÅ:êÿÖö 'óöÎ%Ø;õåþó"áÓÐôôñ"ÑúúèïïÖè .ÞóÖ(ïÖ)åå9 Õ Óì"  íö ï ñ þîë& íÒ,Ò(Ùð*ûãý6Í ÃGþüýÄ7ößò.óãÏ!#éõôêðøñþùüóîÿõþùôõÝý&éè"êâ ùÿÿ ôù àèüÙûÝê÷'Ó"Ê#ùéá) éØ  "äíêùÖ?ÞÝú!Ô;æü õõ ßâ$äôòßéùôíýÕ î0îéÿô×ùíøãâó×CÔþýüêêú *ýÞâû&Ï#Éúýæ'ùÓ/ìä#ñ ò ÿÚ+ àüÛôò òûúýîãôï!ò÷Þ;ÙýÁî ùà1ïé ôîÿ#ññÞ÷ü çã-Ùû!úýé ÿÍ*óÝ!ó"ñÔ'Úò öÛ Üò1õéâ ýíùôé"ãóç0Üå4êê)Ûø õë Þ îçèêîøÙ4ñæ ïõÒ'îþú óÿí÷÷ïØùÓ þýô!øíÿïç ÷ã ó ùëîõîüéôüìñ5çõë÷ùõÝ$äî-Óþí#ðòåôý"ÙÚò .àû ûýßýíîöñÕ5ýüçûö,Ýôøþø ßòôèû þå ÿùúÛâüí"ßøÓ%ÒóäÞ-ÔÿîôÖã öñÑì%âÞõóðûòê&äð$ã"Í&öñÀ9ÛBÏó+Øêããé)úðüûúäúèúä õè äé,Ôþ ï ëù2åì ùè÷  êæ( òóÞ  çðõö ãõí(Ï !Ö Ù úêá ûâõõ!ïÿëÚ"Ûï þ÷èáøóùøêýüè Ü ôß÷ ýïëþ÷åõëöõ  êü&òø ëû÷ ïç,úñî èôæ ÞÙ ü-ì÷æõûò æ þüþñ*óÝ øùñùä(öýóïð ïü'þóùîùùû ñÝ-ðôó.îñýûô%Øóïí2ýéñùñúìÿç ýüþó*ïà ÷ úíæ'éñþã óÝòö öû÷ ô éíðþùë&øæôþùíçú"æöð-êØù é+ëðü÷áû4çùïþ&þðùûá ç ìö ÷ç:ýÖ úí áõ êîïùðî+ âïâñõÿáú.õïôóíÚü õóó Ö çøüëù ãø÷þñ ÷ øñí ýßÑùß$ïô/Â#(Òøíðþéìêåü ä÷*óîå)ÿæ ïþ"Î&ã ñÜþ øðüõß êó ßîýüæøØ)È ì6çåó õáöóù+àè-ð üä.ûøÚ"æ æ#Ôèìï úü ùññ öß.èýÜñûõêóüöð*àÿöûñ ííýð øæþ"çê%ýç÷ ñøúþ óñ÷ì ú÷ è÷ øìú"ðßôß0ûäøß ÷ Ûòïó ó÷ ßö ý!ýòÕ Ì-êûãñ(éáúÚó# ûß#æÿüûöéóñ1Ýùõ!ìÿÙ Ò3ðäì ãÈûý÷üÿ ßùöîëúþ ðóöù âð þ ý ìíûéÿï%ðîûìûïõë íôñÿýøðàöøõ÷ë'áñ üñÿèüîæýüÔ ïõñ'èáù ýð+öà îî'Ñ%Êî%Øíß& ÷÷ñÿþâøîßúúëøïúþûôüýùóýÿá&íä ðìþüñþõðííðþñþñÓéûûêèÎ õÜëóóøéöñÿûúêÿÝü+êúþþûå ù õî úïïñõ(@ @ ­@€ v€ÿöõôá õß%Õùýîâ  öÕ,öëÔõ ìñù÷ï"æãç3Üä0îë Þðþö øå  Üûæ ýàæ)Øøúýù)ýÐþ- ëùþý öüêýÿõó"éý û× ó êõÿÝý%üñá þ øê&óð ñùò ùÔ$çíó(àþûù"Þ ñê÷8 æâíñþåòõðÎó#üóñ çÞúæî×ñ÷þñé òòÖüô áÞâü÷çö ÷Í!èúû÷'ÿÈ& !Ýâí0ýã)îüøéñ ûëõ%ôäéðð#úÕ-ÿ× ëî Ýóãòûøõ(ô #ôüü÷»ðúý ý ÿ þ ý ÿÿ ý ý ÿÿ üüÿþÿÿÿÿÿÿýÿÿþùýþþøøÿÿúõþþõýþÿ÷øÿÿúöÿýôýÿÿ÷øÿûõþöýÿùúþýÿ þ ý ÿÿ ý ý ÿþ ý ý ÿþ ýÿþÿÿÿÿÿÿÿÿÿýûÿþýöûÿþ÷øþÿúöÿýõüþÿ÷øÿúõÿýôýÿÿ÷ùûöþöýÿüüþÿ ÿ þ þ þÿ ý ü ÿþ üü þþÿþÿÿÿÿÿÿÿþóñþýöþþ÷þÿÿøûÿü÷ÿý÷þÿøúû÷ÿÿ÷þùúüøÿùþÿýýÿþþÿþ ÿýþ ÿÿ þý ÿþýþÿÿÿÿÿÿÿþüÿÿþùýÿÿùùÿÿû÷ÿþ÷ýÿÿùùÿû÷ÿþ÷ýÿÿùùÿüøþøþÿúûüùüÿþþþ þþ ÿ þý ÿÿ ýþÿþýþÿÿÿÿÿþþýÿÿýùÿþþ÷ýþÿøúÿÿü÷ÿþ÷ýÿÿøúÿûøÿÿöýÿùúüøþøþÿúûþüýþÿÿÿ þ ýÿÿÿþÿÿþþÿÿÿþþÿÿÿþüþÿÿúüÿÿýùþÿùýÿÿúüÿýùÿþùþÿÿûûÿýùþùÿÿüûýúÿúÿÿüûþýýÿþÿþþÿþýÿÿþþÿÿÿýÿÿÿýüÿþþúýþÿûûÿüúÿþúþÿúûÿüùÿþùþÿúûüúÿúþÿûüýûúþþýÿýÿþÿÿþþÿþþÿÿþÿþÿþÿÿþýüþýùþÿùþÿÿúüÿüúÿþúýÿÿúûÿüùÿûþÿüþþüÿüÿüþÿüÿüýþÿÿÿÿÿÿÿÿþÿþþÿÿþýýÿÿýýÿþûÿûÿÿüþÿþüÿÿÿüþÿüýþûÿûÿÿýýþüÿüþýÿüüÿÿÿÿþÿÿÿÿÿþÿÿÿ For Big Chip Compo(@ @ {@€oqî2ðÉ% :ÎéÖÖ",Þîë¼Lóý¿ø2Ìýîû ¬ð?'Éá*Îð* îø 2ÛÙÑ/ëðÞLæÛÞ7øÛë?ÞýãÞ7ÞÛGÎÞû ó"´ÉQÓ%ÛIÙÙ7øÉîÙõîDã"ÑýÔQÖ4’?ÑÁYÞðG9¼ö/Ûî"ÛÌð'LûÞãë*ýð*ÉÑfÎ%´*óÑ/¬ Ûãö ðæ "Tɧ7óëIîë/û'ãÞæá ó æTÉõÙ óæã û æÖè*ëë ÞÖæ<ðÞæ Ùø *óéà%á ó¯"øã%øý-ðãÛû'áè  ëæ<øøûãûó "Éó<Þ"ÑûÞÄ ãëû ðó7ÖÉ%óó4îõ  ëæóæóøû'öÖø/ë"¼/Ùãó%èî*ÖÛøîLëÎ"øýîø Ûøðã¼ð"%ÛýÌ Ñ?ðÞë*Þî/øÞû"éðãè/Îû'æîæýøûÛæ*î Ñý óöÖø/ëðûæÉ àöðÞ-øëÞý/Ô ã ãæàæ?ã ãã  ÞÞ ý"ÞÙðé'ãö"ã áý %ëÞøÁ%Þ" ÙõöýøöóðøöøîøÙ"ëë% æëýÙ"èæ% îóó" Ì óÙ'ýáð<ëðö èõö öûý öø óýóûîë øøøõûøøýðë û û ðøûýûøóýø ðóó ð øóóóîýøûýûîø øöðý ø ððûõ õûóýûõ ö ýû óãðýæøóø ûûýøûýðæýî ýøóæ ø #7(@ @ @€F:ÿú‡Ç›ÀxÒDš,AP·Œ'úã3LÙøï\‹¡ý±O±>•—þ·Õ˜ÞÒÿχٖùôç–:ôïÜ5lÓòúðöÿûùûÿúýýûþûýþûþüþüýÿûþüýýûýÿþÿÿþÿÿþüþÿþþýýÿþýÿÿþýþüûýüûýûýûýûýüüüûþûýüüþûüüüüüþûþþúýþýûÿþúüüýýÿüýÿþÿÿÿþÿþÿÿþþýýÿþýÿÿþýþÿýþþùýúþúýþüùþûþüùþýûüþüüýþûûüüþûþûÿûþûýÿûþýüýýÿüýúÿþÿþÿÿÿþÿþýýÿþýÿÿþýþÿýþþùýýúûýþüûýúþüüüüûüþüüýþûûüüüþûþûýþýüüýüüýýýýûþÿþÿþÿÿÿþÿþýýýÿþýÿÿþýþÿýþÿùýþúýüûýúþûþüúýûüþüüüüþûþûüüüÿúþûýýýþüþýüýþýþýýýÿÿþÿþÿÿÿþÿþÿþýýÿþýÿÿþýþÿÿþüüüýúûþúÿûûýûþüüüûüþüüýþûûüþüûüýÿúþüþûýýù÷ 9üìíàéôúîõëùùÝ+øôà èâòòä1ûñúï"ööþýôõãìß!×ü óü äúð ïýøÿ÷þüúûýû ûþûýô ùÿú ÷û÷ú üûüýþþý÷þú öûüûþ÷ ÿø üûüøþÿü þüúùúú÷ ÷þÿùüú ýÿý üõþÿ ÷þû öúùþüý ýûÿ ÷÷þüÿõõÿýüýøúû ûúûù ÷þô ýÿ üûù úþýÿûúÿò úúûÿô üöú õ ö÷ úøÿûú ùøýý÷þúúúý úù ûûý øúý÷ýÿýý ñ ûÿ ú÷ùÿõ þüÿÿý ûýþþýúÿþüüÿÿûýÿùýÿûüýÿùýÿÿÿüÿýþýÿÿÿ÷ÿÿýûþÿûþÿ÷ýüþÿÿ ùúþÿÿüÿýúûûýÿþÿÿûùÿýüþþûüÿÿÿÿý ùýþþûýÿüüýûú úþþûýÿûÿþþÿ üûüüûúþüÿûüûÿü÷øÿø(@ @ FD@€Xæÿþ tþýÿÿÿÿÿÿ(@ @ FD@€>ÿ„þÿýûýþýÿÿÿÿÿÿ…(@ @ FD@€>„ÿÿÿÿÿþÿþýþýÿÿÿÿÿÿ…(@ @ FD@€>Lÿÿþûþýÿÿÿÿÿÿ…(@ @ ®2@û€]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø¹’ñøýýÿÿNï ùûüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþØ’Ûñ üûþÿÿÿ$M í øýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿî§¶ýý øýÿþJ(ïÿûúþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúĤó úþþÿD3ïùúþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÝ àóýüþÿÿC5ìúúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð¶ÂÿýùþÿÿH0êúùþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúË®õ ûþþ5Høö õýÿýýÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþâ¯ãõþüÿÿ)Lð öÿýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿò½Èÿþûþÿÿ3Dúö öüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûеö ûÿþ-Hþó öþþüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþåµå÷þýÿJé úûýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÂÊýúþÿF"êýýûþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÕ¼ ÷ ûÿþIë ùüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçºæøþþÿEêüþûýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÇÎýûÿÿÿBíüÿüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÙÁÿ ÷ üÿÿ 93ðùüÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéÂèùþýÿ@ ëýþûýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõËÐýûþÿ)<ýöøþÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÛÄÿ øüþÿ.2öüúüþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÄèùþý<ò ùÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÐÔ þüÿÿÿ.0óþùüÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿýßÊÿ ùüÿÿ8ðûýýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÈêúþþÿ6 òúýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÔØ þüþÿ((ôÿúüþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýâÐÿ úýÿÿ1öúÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÒï úþþÿ("õüýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøØÞ þüþ 'óÿþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýæÙûýÿÿÿ&ùûÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÙô úÿþ %ôþÿýþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúáç ÿÿýÿ"øüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþéÞûýþÿûýüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôßö üþÿÿ  ÷þÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûçêÿþÿÿÿ øþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðæüþÿùýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøé÷ýÿÿÿ úýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýìïÿþÿÿÿúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôíÿýÿÿÿÿÿ ûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿúïùþÿÿ ÿýþÿÿÿþÿÿÿÿmilkytracker-0.90.85+dfsg/resources/music/sv_ttt.xm0000644000175000017500000010601110737746457021471 0ustar admin2admin2Extended Module: The Titan TurricanMilkyTracker ,‡   @¿€—3âXƒ,€€€€”aX˜ €€€€”aXƒ,€‡73€€”aX€€‡78€€X€€ƒ:€€X„$€€€€—3âXƒ8€ƒ:€€”aX˜ €€€€Xƒ,€€€€”aX€€€€€X€€€€€”aX€€€€€Xƒ,€›:€€”aX„$€€€€Xƒ,€ƒ:€€”aX€€€€€X€€‡73€€”aX€€‡78€€Xƒ,€ƒ:€€”aX˜ €€€€Xƒ8€€€€X„$€€€€Xƒ8€ƒ:€€X˜ €€€€€ƒ,€€€€€€€€€€€˜€€€€€˜€€€€—3âXƒ6€›:€€”aX„$€€€€”aX€€€€€”aX€€€€€—/ÓIƒ(€ƒ:€€”aI˜ €€€€Iƒ(€‡73€€”aI€€‡78€€I€€ƒ:€€”aI„$€€€€Iƒ4€ƒ:€€”aI˜ €€€€Iƒ(€€€€”aI€€€€€I€€€€€”aI€€€€€Iƒ(€›:€€”aI„$€€€€Iƒ(€ƒ:€€I€€€€€—3âXƒ(€‡73%Ç€”aX€€‡78œ?€”aXƒ4€ƒ:œ=€”aX˜ €€œ<€”aXƒ(€€œ:€”aX„$€€œ9€“1Yƒ*€ƒ:œ8€Y˜ €€œ6‡1aYƒ6“1Y€œ5œa Y€Y€œ3˜ ”aY˜Y€œ2˜ Y˜Y€œ1ƒ4”aY˜Y€œ/€Y˜Y€œ.€”aY˜Y€œ-„…a˜Y€œ, @eƒ3€ƒ,„ƒ:œ+˜¤€˜ €€œ*˜ 3$£ƒ,€‡73œ)˜ €€€‡78œ(ƒ,˜ ƒ8“3Xƒ:œ'€˜ „$”X€œ&ƒ,‡,$ƒ8“3Xƒ:œ%˜ €˜ ”X€œ$ƒ8,$£ƒ,“3Xƒ:œ#€˜ €X€œ"˜ 8$£˜X€œ!€€˜„€œ ƒ,˜ ƒ;“1Y›:œ€€„$„€œƒ6‡,$ƒ,“1Yƒ:œ˜ €€Y€„˜¤‡6$˜Y‡73€˜¤˜ ˜€‡78€ƒ8€ƒ,“/Iƒ:€€€˜ ”I€€ƒ38$£ƒ8“/I€€˜¤€„$I€€˜¤‡3$ƒ8Iƒ:€˜¤€˜ I€€ƒ,€ƒ,Iƒ:€€€€I€€€,$£˜I€€€€˜I€€ƒ*€ƒ6I›:€€€„$I€€€*$£€I›:€€€€I€€ƒ3€ƒ,Iƒ:€˜¤€˜ I€€˜ ‡3$ƒ,I‡73€€€€I‡78€ƒ,˜ ƒ8“3Xƒ:€€€„$”X€€˜ ‡,$ƒ8“3Xƒ:€€€˜ ”X€€ƒ8˜ ƒ,“3Xƒ:€€€€X€€€8$£˜X€€€€˜„€€ƒ,€ƒ8“1Y›:€€€„$„€€ƒ;‡,$ƒ,“1Yƒ:€˜¤€€Y€€˜ ;$£˜Y‡73€€€˜€‡78€ƒ:˜ ƒ,“/Iƒ:€˜¤€˜ ”I€€ƒ8‡:$ƒ8“/I€€˜¤€„$I€€˜¤8$£ƒ8Iƒ:€˜¤€˜ ”I€€ƒ,€ƒ;“/9ƒ:€€€€9€€€‡,$˜9€€€€˜“.8€€ƒ3€ƒ88›:€€€„$8€€˜¤3$£€8›:€˜¤€€8€€ @ùƒ6€ƒ(“/Yƒ:€˜¤€˜ Y€€˜¤6$£ƒ(Y‡73€˜¤€€Y‡78€˜¤€ƒ4Yƒ:€˜¤€„$Y€€ƒ8€ƒ4Yƒ:€€€˜ Y€€€‡8$ƒ(Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ3€ƒ4Y›:€˜¤€„$Y€€˜¤‡3$ƒ(Yƒ:€˜¤€€Y€€€€˜“/Y‡73€ƒ3€˜Y‡78€ƒ6€ƒ(Yƒ:€˜¤‡3$˜ Y€€˜¤6$£ƒ4Y€€˜¤€„$Y€€€€ƒ4Yƒ:€€€˜ Y€€ƒ8€ƒ(Yƒ:€˜¤€€Y€€˜¤‡8$˜Y€€˜¤€˜Y€€ƒ3€ƒ4“/Y›:€€€„$Y€€€‡3$€Y›:€€€€Y€€ƒ;€ƒ*“1Yƒ:€˜¤€˜ Y€€˜¤;$£ƒ*Y‡73€˜¤€€Y‡78€€€ƒ6Yƒ:€€€„$Y€€ƒ:€ƒ6Yƒ:€€€˜ Y€€€‡:$ƒ*Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ6€ƒ6Y›:€€€„$Y€€˜¤6$£ƒ*“1Yƒ:€˜¤€€Y€€˜¤€˜“6G‡73€˜¤€˜G‡78€ƒ8€ƒ*Gƒ:€€€˜ G€€€‡8$ƒ6G€€€€„$G€€€€ƒ6Gƒ:€€€˜ G€€ƒ3€ƒ*Gƒ:€˜¤€€G€€˜¤‡3$˜G›:€˜¤€˜G›:€ƒ1€ƒ6G›:€€€„$G€€€‡1$€G›:€€€€G€€ @Mƒ3€ƒ,€ƒ:‡3a˜¤€˜ €€œa ˜ 3$£ƒ,€‡73˜ ˜ €€€‡78˜ ƒ,˜ ƒ8“3Xƒ:„€˜ „$”X€€ƒ,‡,$ƒ8“3Xƒ:€˜ €˜ ”X€€ƒ8,$£ƒ,“3Xƒ:€€˜ €X€€˜ 8$£˜X€€€€˜„€€ƒ,˜ ƒ;“1Y›:€€€„$„€€ƒ6‡,$ƒ,“1Yƒ:€˜ €€Y€€˜¤‡6$˜Y‡73€˜¤˜ ˜€‡78€›8¤€ƒ,“/Iƒ:€˜¤€˜ ”I€€ƒ38$£ƒ8“/I€€€€„$I€€€‡3$ƒ8Iƒ:€€€˜ I€€ƒ,€ƒ,Iƒ:€€€€I€€€,$£˜I€€€€˜I€€ƒ*€ƒ6I›:€€€„$I€€€*$£€I›:€€€€I€€ƒ3€ƒ,Iƒ:€€€˜ I€€˜ ‡3$ƒ,I‡73€€€€I‡78€ƒ,˜ ƒ8“3Xƒ:€˜¤€„$”X€€˜ ‡,$ƒ8“3Xƒ:€€€˜ ”X€€ƒ8˜ ƒ,“3Xƒ:€˜¤€€X€€˜¤8$£˜X€€˜¤€˜„€€ƒ,€ƒ8“1Y›:€€€„$„€€ƒ;‡,$ƒ,“1Yƒ:€˜¤€€Y€€˜ ;$£˜Y‡73€˜¤€˜€‡78€ƒ?˜ ƒ,“/Iƒ:€˜¤€˜ ”I€€ƒ8‡?$ƒ8“/I€€˜¤€„$I€€˜¤8$£ƒ8Iƒ:€˜¤€˜ ”I€€ƒ,€ƒ;“/9ƒ:€€€€9€€˜¤‡,$˜9€€˜¤€˜“.8€€ƒ3€ƒ88›:€€€„$8‡78€€3$£€8›:€€€€8‡78€ @ï›;¤€ƒ(“/Yƒ:€˜¤€˜ Y€€˜¤;$£ƒ(Y‡73€˜¤€€Y‡78€€€ƒ4Yƒ:€€€„$Y€€ƒ8€ƒ4Yƒ:€€€˜ Y€€€‡8$ƒ(Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€›;¤€ƒ4Y›:€˜¤€„$Y€€˜¤‡;$ƒ(Yƒ:€€€€Y€€€€˜“/Y‡73€ƒ3€˜Y‡78€ƒ8€ƒ(Yƒ:€˜¤‡3$˜ Y€€€8$£ƒ4Y€€˜¤€„$Y€€€€ƒ4Yƒ:€€€˜ Y€€ƒ;€ƒ(Yƒ:€˜¤€€Y€€˜¤‡;$˜Y€€˜¤€˜Y€€ƒ?€ƒ4“/Y›:€€€„$Y€€€‡?$€Y›:€€€€Y€€ƒ=€ƒ*“1Yƒ:€˜¤€˜ Y€€˜¤=$£ƒ*Y‡73€˜¤€€Y‡78€˜¤€ƒ6Yƒ:€€€„$Y€€ƒ:€ƒ6Yƒ:€€€˜ Y€€€‡:$ƒ*Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ=€ƒ6Y›:€˜¤€„$Y€€˜¤=$£ƒ*“1Yƒ:€˜¤€€Y€€€€˜“6G‡73€€€˜G‡78€ƒ?€ƒ*Gƒ:€€€˜ G€€€‡?$ƒ6G€€€€„$G€€€€ƒ6Gƒ:€€€˜ G€€ƒ@€ƒ*Gƒ:€˜¤€€G€€˜¤‡@$˜G€€˜¤€˜G€€ƒ?€ƒ6G‡:3€€€„$G‡:8€€‡?$€Gƒ:€€€€Gƒ:€ @žƒ8€ƒ,“87ƒ:€€€˜ 7€€˜ €ƒ,7‡73€€€€7‡78€€€ƒ87ƒ:€˜ €„$7€€€€ƒ87ƒ:€€€˜ 7€€˜ €ƒ,7ƒ:€€€€7€€€€˜7€€˜ €˜7€€€€ƒ;—8.7›:€€€„$7€€˜ €ƒ,7ƒ:€€€€7€€ƒ4€˜“87‡73€€€˜7‡78€˜ €ƒ,7ƒ:€€€˜ 7€€€€ƒ87€€˜ €„$7€€€€ƒ87ƒ:€€€˜ 7€€˜ €ƒ,7ƒ:€€€€7€€€€˜7€€˜ €˜7€€€€ƒ67›:€€€„$7€€˜ €€7›:€€€€7€€ƒ3€ƒ,“87ƒ:€˜ €˜ 7€€€€ƒ,7‡73€€€€7‡78€€€ƒ87ƒ:€€€„$7€€€€ƒ87ƒ:€€€˜ 7€€€€ƒ,7ƒ:€€€€7€€€€˜7€€€€˜7€€€€ƒ8—8.7›:€€€„$7€€€€ƒ,7ƒ:€€€€7€€€€˜“87‡73ƒ1€€˜7‡78œa €€ƒ,7ƒ:˜ €€˜ 7€˜ ƒ,€ƒ87€„€€„$7€€€€ƒ87ƒ:€€€˜ 7€€€€ƒ;7ƒ:€€€€7€€€€˜7€€€€˜7€€€€ƒ87€€€€„$7€€€€€7€€€€€7€€ @èƒ8€ƒ,“87ƒ:€€€˜ 7€€˜ €ƒ,7‡73€€€€7‡78€€€ƒ87ƒ:€˜ €„$7€€€€ƒ87ƒ:€€€˜ 7€€˜ €ƒ,7ƒ:€€€€7€€€€˜7€€˜ €˜7€€€€ƒ;—8.7›:€€€„$7€€˜ €ƒ,7ƒ:€€€€7€€ƒ4€˜“87‡73€€€˜7‡78€˜ €ƒ,7ƒ:€€€˜ 7€€€€ƒ87€€˜ €„$7€€€€ƒ87ƒ:€€€˜ 7€€˜ €ƒ,7ƒ:€€€€7€€€€˜7€€˜ €˜7€€€€ƒ67›:€€€„$7€€˜ €€7›:€€€€7€€ƒ3€ƒ,“87ƒ:€˜ €˜ 7€€€€ƒ,7‡73€€€€7‡78€€€ƒ87ƒ:€€€„$7€€€€ƒ87ƒ:€€€˜ 7€€€€ƒ,7ƒ:€€€€7€€€€˜7€€€€˜7€€€€ƒ8—8.7›:€€€„$7€€€€ƒ,7ƒ:€€€€7€€€U˘“87‡73ƒ1€œ?˜7‡78œa €œ=ƒ,7ƒ:˜ €œ<˜ 7€˜ €œ:ƒ87€„€œ9„$7€€€œ8ƒ87ƒ:€€œ6˜ 7€€€œ5ƒ*“1Yƒ:‡1a€œ3˜ Y€œa €œ2€Y‡73˜ €œ1€Y‡78˜ €œ/€Y›:ƒ4€œ.€Y€€€œ-€Y›:€€œ,˜ Yƒ:€ @ƒ;Œ+ƒ(“/Yƒ:€€œ*˜ Y€€˜ œ)ƒ(Y‡73€€œ(€Y‡78€€œ'ƒ4Yƒ:€˜ œ&„$Y€€€œ%ƒ4Yƒ:€€œ$˜ Y€€˜ œ#ƒ(Yƒ:€€œ"€Y€€€œ!˜Y€€˜ œ ˜Y€€€œƒ4Y›:€€œ„$Y€€˜ œƒ*Yƒ:€€œ€Y€€ƒ=œ˜“1Y‡73€€œ˜Y‡78€˜ œƒ6Yƒ:€€œ˜ Y€€€œƒ*Y€€˜ œ„$Y€€€œƒ6Yƒ:€€œ˜ Y€€˜ œƒ*Yƒ:€€œ€Y€€€„˜Y€€˜ €˜Y€€€€ƒ6Y›:€€€„$Y€€˜ €€7›:€€€€7€€ƒ?€ƒ,“87ƒ:€˜ €˜ 7€€€€ƒ,7‡73€€€€7‡78€€€ƒ87ƒ:€€€„$7€€€€ƒ87ƒ:€€€˜ 7€€€€ƒ,7ƒ:€€€€7€€€€˜7€€€€˜7€€€€ƒ8—8.7›:€€€„$7€€€€ƒ,7ƒ:€€€€7€€€€˜“87‡73ƒ3€€˜7‡78œa €€ƒ,7ƒ:˜ €€˜ 7€˜ €€ƒ87€„€€„$7€€€€ƒ87ƒ:€€€˜ 7€€€€ƒ*“1Yƒ:‡1a€€˜ Y€œa €€€Y‡73˜ €€€Y‡78˜ €€€Y›:€€€€Y€€€€€Y›:€€€˜ Yƒ:€ @¦ƒ;€ƒ(“/Yƒ:€€€˜ Y€€˜ €ƒ(Y‡73€€€€Y‡78€€€ƒ4Yƒ:€˜ €„$Y€€€€ƒ4Yƒ:€€€˜ Y€€˜ €ƒ(Yƒ:€€€€Y€€€€˜Y€€˜ €˜Y€€€€ƒ4Y›:€€€„$Y€€˜ €ƒ*Yƒ:€€€€Y€€ƒ=€˜“1Y€€€€˜Y€€˜ €ƒ6Y€€€€˜ Y€€€€ƒ*Y€€˜ €„$Y€€€€ƒ6Y€€€€˜ Y€€˜ €ƒ*Y€€€€€Y€€€€˜Y€€˜ €˜Y€€€€ƒ6Y›:€€€„$Y€€˜ €€7›:€€€€7€€ƒ8€ƒ,“87ƒ:€˜ €˜ 7€€€€ƒ,7‡73€€€€7‡78€€€ƒ87ƒ:€€€„$7€€€€ƒ87ƒ:€€€˜ 7€€€€ƒ,7ƒ:€€€€7€€€€˜7€€€€˜7€€€€ƒ8—8.7›:€€€„$7€€€€ƒ,7ƒ:€€€€7€€€€˜“87‡73€€€˜7‡78€€€ƒ,7ƒ:€€€˜ 7€€€€ƒ87€€€€„$7€€€€ƒ87ƒ:€€€˜ 7€€ƒ-€ƒ,“1Yƒ:€˜€˜ Y€€˜€€Y‡73€˜€€Y‡78€˜€€Y›:€˜€€Y›:€˜€€Y›:€˜€˜ Yƒ:€ @€—3âX‡,€€€€”aX€€€€€”aX€€€€€”aX„q€€€€X€€€€€X€€€€€—3âX„q€€€€”aX€€€€€X€€€€€”aX„q€€€€X€€€€€”aX€€€€€X„q€€€€”aX€€€€€X€€€€€”aX„q€€€€X€€€€€”aX€€€€€X„q€€€€”aX€€€€€X€€€€€X„q€€€€X€€€€€X€€€€€€„q€€€€€€€€€€€€€€€€€„q€€€€—3âX€€€€€”aX„q€€€€”aX€€€€€”aX„q€€€€—/ÓIƒ(€€€€”aI„q€€€€I€€€€€”aI„q€€€€I€€€€€”aI„q€€€€I€€€€€”aI€€€€€I€€€€€”aI€€€€€I€€€€€”aI€€€€€I€€€€€”aI€€€€€I€€€€€I€€€€€“1Yƒ*€€€€Y€€€€€Y€€€€€Y€€€€€Y€€€€€Y€€€€€Y€€€€€Y€€€€€Y€€€€€Y€€€€€Y€€€€€Y€€€€€Yƒ'€‡73€€Yœ8€‡78€€Yƒ*€›:€€€€€›:€ @7ƒ6€ƒ/„ƒ:€˜¤€˜ €€€˜ 6$£ƒ/€‡73€˜ €€€‡78€ƒ*˜ ƒ;“6Xƒ:€€˜ „$”X€€ƒ*‡*$ƒ;“6Xƒ:€˜ €˜ ”X€€ƒ;*$£ƒ/“6Xƒ:€€˜ €X€€˜ ;$£˜X€€€€˜„€€ƒ6˜ ƒ;“4Y›:€€€„$„€€ƒ9‡6$ƒ/“4Yƒ:€˜ €€Y€€˜¤‡9$˜Y‡73€˜¤˜ ˜€‡78€ƒ;€ƒ/“2Iƒ:€€€˜ ”I€€ƒ6;$£ƒ;“2I€€˜¤€„$I€€˜¤‡6$ƒ;Iƒ:€˜¤€˜ I€€ƒ*€ƒ/Iƒ:€€€€I€€€*$£˜I€€€€˜I€€ƒ(€ƒ;I›:€€€„$I€€€($£€I›:€€€€I€€ƒ6€ƒ/Iƒ:€˜¤€˜ I€€˜ ‡6$ƒ/I‡73€€€€I‡78€ƒ*˜ ƒ;“6Xƒ:€€€„$”X€€˜ ‡*$ƒ;“6Xƒ:€€€˜ ”X€€ƒ;˜ ƒ/“6Xƒ:€€€€X€€€;$£˜X€€€€˜„€€ƒ6€ƒ;“4Y›:€€€„$„€€ƒ>‡6$ƒ/“4Yƒ:€˜¤€€Y€€˜ >$£˜Y‡73€€€˜€‡78€ƒ=˜ ƒ/“2Iƒ:€˜¤€˜ ”I€€ƒ;‡=$ƒ;“2I€€˜¤€„$I€€˜¤;$£ƒ;Iƒ:€˜¤€˜ ”I€€ƒ/€ƒ/“29ƒ:€€€€9€€€‡/$˜9€€€€˜“18€€ƒ6€ƒ98›:€€€„$8€€˜¤*$£€8›:€˜¤€€8€€ @ùƒ9€ƒ+“2Yƒ:€˜¤€˜ Y€€˜¤9$£ƒ+Y‡73€˜¤€€Y‡78€˜¤€ƒ7Yƒ:€˜¤€„$Y€€ƒ;€ƒ7Yƒ:€€€˜ Y€€€‡;$ƒ+Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ6€ƒ7Y›:€˜¤€„$Y€€˜¤‡6$ƒ+Yƒ:€˜¤€€Y€€€€˜“2Y‡73€ƒ6€˜Y‡78€ƒ9€ƒ+Yƒ:€˜¤‡6$˜ Y€€˜¤9$£ƒ7Y€€˜¤€„$Y€€€€ƒ7Yƒ:€€€˜ Y€€ƒ;€ƒ+Yƒ:€˜¤€€Y€€˜¤‡;$˜Y€€˜¤€˜Y€€ƒ6€ƒ7“2Y›:€€€„$Y€€€‡6$€Y›:€€€€Y€€ƒ>€ƒ-“4Yƒ:€˜¤€˜ Y€€˜¤>$£ƒ-Y‡73€˜¤€€Y‡78€€€ƒ9Yƒ:€€€„$Y€€ƒ=€ƒ9Yƒ:€€€˜ Y€€€‡=$ƒ-Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ9€ƒ9Y›:€€€„$Y€€˜¤9$£ƒ-“4Yƒ:€˜¤€€Y€€˜¤€˜“9G‡73€˜¤€˜G‡78€ƒ;€ƒ-Gƒ:€€€˜ G€€€‡;$ƒ9G€€€€„$G€€€€ƒ9Gƒ:€€€˜ G€€ƒ6€ƒ-Gƒ:€˜¤€€G€€˜¤‡6$˜G›:€˜¤€˜G›:€ƒ4€ƒ9G›:€€€„$G€€€‡4$€G›:€€€€G€€ @ùƒ6€ƒ(“/Yƒ:€˜¤€˜ Y€€˜¤6$£ƒ(Y‡73€˜¤€€Y‡78€˜¤€ƒ4Yƒ:€˜¤€„$Y€€ƒ8€ƒ4Yƒ:€€€˜ Y€€€‡8$ƒ(Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ3€ƒ4Y›:€˜¤€„$Y€€˜¤‡3$ƒ(Yƒ:€˜¤€€Y€€€€˜“/Y‡73€ƒ3€˜Y‡78€ƒ6€ƒ(Yƒ:€˜¤‡3$˜ Y€€˜¤6$£ƒ4Y€€˜¤€„$Y€€€€ƒ4Yƒ:€€€˜ Y€€ƒ8€ƒ(Yƒ:€˜¤€€Y€€˜¤‡8$˜Y€€˜¤€˜Y€€ƒ3€ƒ4“/Y›:€€€„$Y€€€‡3$€Y›:€€€€Y€€ƒ;€ƒ*“1Yƒ:€˜¤€˜ Y€€˜¤;$£ƒ*Y‡73€˜¤€€Y‡78€€€ƒ6Yƒ:€€€„$Y€€ƒ:€ƒ6Yƒ:€€€˜ Y€€€‡:$ƒ*Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ6€ƒ6Y›:€€€„$Y€€˜¤6$£ƒ*“1Yƒ:€˜¤€€Y€€˜¤€˜“6G‡73€˜¤€˜G‡78€ƒ8€ƒ*Gƒ:€€€˜ G€€€‡8$ƒ6G€€€€„$G€€€€ƒ6Gƒ:€€€˜ G€€ƒ3€ƒ*Gƒ:€˜¤€€G€€˜¤‡3$˜G›:€˜¤€˜G›:€ƒ1€ƒ6G›:€€€„$G€€€‡1$€G›:€€€€G€€ @cƒ6€ƒ/„ƒ:œ+˜¤€˜ €€œ*˜ 6$£ƒ/€‡73œ)˜ €€€‡78œ(ƒ*˜ ƒ;“6Xƒ:œ'€˜ „$”X€œ&ƒ*‡*$ƒ;“6Xƒ:œ%˜ €˜ ”X€œ$ƒ;*$£ƒ/“6Xƒ:œ#€˜ €X€œ"˜ ;$£˜X€œ!€€˜„€œ ƒ6˜ ƒ;“4Y›:œ€€„$„€œƒ9‡6$ƒ/“4Yƒ:œ˜ €€Y€„˜¤‡9$˜Y‡73€˜¤˜ ˜€‡78€ƒ6€ƒ/“2Iƒ:€„$€˜ ”I€€ƒ;;$£ƒ;“2I€€˜¤€„$I€€˜¤‡;$ƒ;Iƒ:€˜¤„˜ I€€€€ƒ/Iƒ:€€€€I€€€*$£˜I€€€€˜I€€ƒ(€ƒ;I›:€€€„$I€€€($£€I›:€€€€I€€ƒ6€ƒ/Iƒ:€˜¤€˜ I€€˜ ‡6$ƒ/I‡73€€€€I‡78€ƒ*˜ ƒ;“6Xƒ:€€€„$”X€€˜ ‡*$ƒ;“6Xƒ:€€€˜ ”X€€ƒ;˜ ƒ/“6Xƒ:€€€€X€€€;$£˜X€€€€˜„€€ƒ6€ƒ;“4Y›:€€€„$„€€ƒ>‡6$ƒ/“4Yƒ:€˜¤€€Y€€˜ >$£˜Y‡73€€€˜€‡78€ƒ;˜ ƒ/“2Iƒ:€˜¤€˜ ”I€€ƒB‡;$ƒ;“2I€€˜¤€„$I€€˜¤B$£ƒ;Iƒ:€˜¤€˜ ”I€€€€ƒ/“29ƒ:€€€€9€€€‡/$˜9€€€€˜“18€€ƒ6€ƒ98›:€€€„$8€€˜¤*$£€8›:€˜¤€€8€€ @õƒ>€ƒ+“2Yƒ:€˜¤€˜ Y€€˜¤>$£ƒ+Y‡73€˜¤€€Y‡78€˜¤€ƒ7Yƒ:€˜¤€„$Y€€ƒ;€ƒ7Yƒ:€€€˜ Y€€€‡;$ƒ+Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ9€ƒ7Y›:€˜¤€„$Y€€˜¤‡9$ƒ+Yƒ:€˜¤€€Y€€€€˜“2Y‡73€€€˜Y‡78€ƒ;€ƒ+Yƒ:€˜¤„$˜ Y€€˜¤;$£ƒ7Y€€˜¤€„$Y€€€€ƒ7Yƒ:€€€˜ Y€€ƒ>€ƒ+Yƒ:€˜¤€€Y€€˜¤‡>$˜Y€€˜¤€˜Y€€ƒ;€ƒ7“2Y›:€€€„$Y€€€‡;$€Y›:€€€€Y€€ƒ@€ƒ-“4Yƒ:€˜¤€˜ Y€€˜¤@$£ƒ-Y‡73€˜¤€€Y‡78€€€ƒ9Yƒ:€€€„$Y€€ƒ=€ƒ9Yƒ:€€€˜ Y€€€‡=$ƒ-Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€ƒ@€ƒ9Y›:€€€„$Y€€˜¤@$£ƒ-“4Yƒ:€˜¤€€Y€€˜¤€˜“9G‡73€˜¤€˜G‡78€ƒB€ƒ-Gƒ:€€€˜ G€€€‡B$ƒ9G€€€€„$G€€€€ƒ9Gƒ:€€€˜ G€€ƒC€ƒ-Gƒ:€˜¤€€G€€˜¤‡C$˜G›:€˜¤€˜G›:€ƒB€ƒ9G›:€€€„$G€€€‡B$€G›:€€€€G€€ @õ›;¤€ƒ/„ƒ:œ+˜¤€˜ €€œ*˜¤‡;$ƒ/€‡73œ)˜¤˜¤€€‡78œ(˜¤˜¤ƒ;“6Xƒ:œ'˜¤˜¤„$”X€œ&˜¤˜¤ƒ;“6Xƒ:œ%˜¤˜¤˜ ”X€œ$˜¤˜¤ƒ/“6Xƒ:œ#˜¤˜¤€X€œ"˜¤˜¤˜X€œ!˜ ˜¤˜„€œ „˜¤ƒ;“4Y›:œ€˜ „$„€œ€„ƒ/“4Yƒ:œ€€€Y€„€€˜Y‡73€€€˜€‡78€€€ƒ/“2Iƒ:€€€˜ ”I€€€€ƒ;“2I€€€€„$I€€€€ƒ;Iƒ:€€€˜ I€€€€ƒ/Iƒ:€€€€I€€€€˜I€€€€˜I€€€€ƒ;I›:€€€„$I€€€€€I›:€€€€I€€€€ƒ/Iƒ:€€€˜ I€€€€ƒ/I‡73€€€€I‡78€€€ƒ;“6Xƒ:€€€„$”X€€€€ƒ;“6Xƒ:€€€˜ ”X€€€€ƒ/“6Xƒ:€€€€X€€€€˜X€€€€˜„€€€€ƒ;“4Y›:€€€„$„€€€€ƒ/“4Yƒ:€€€€Y€€€€˜Y‡73€€€˜€‡78€€€ƒ/“2Iƒ:€€€˜ ”I€€€€ƒ;“2I€€€€„$I€€€€ƒ;Iƒ:€€€˜ ”I€€€€ƒ/“29ƒ:€€€€9€€€€˜9€€€€˜“18€€€€ƒ98›:€€€„$8€€€€€8›:€€€€8€€ @ƒ€€ƒ+“2Yƒ:€€€˜ Y€€€€ƒ+Y‡73€€€€Y‡78€€€ƒ7Yƒ:€€€„$Y€€€€ƒ7Yƒ:€€€˜ Y€€€€ƒ+Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€€€ƒ7Y›:€€€„$Y€€€€ƒ+Yƒ:€€€€Y€€€€˜“2Y‡73€€€˜Y‡78€€€ƒ+Yƒ:€€€˜ Y€€€€ƒ7Y€€€€„$Y€€€€ƒ7Yƒ:€€€˜ Y€€€€ƒ+Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€€€ƒ7“2Y›:€€€„$Y€€€€€Y›:€€€€Y€€€€ƒ-“4Yƒ:€€€˜ Y€€€€ƒ-Y‡73€€€€Y‡78€€€ƒ9Yƒ:€€€„$Y€€€€ƒ9Yƒ:€€€˜ Y€€€€ƒ-Yƒ:€€€€Y€€€€˜Y€€€€˜Y€€€€ƒ9Y›:€€€„$Y€€€€ƒ9€ƒ:€€€€€€€€€˜€‡73€€€˜€‡78€€€˜€ƒ:€€€œa€€€›:€œa€ƒ:€˜€œa€€€˜€œa€ƒ:€˜€œa€€€˜€„a€€€˜€„a€€€˜€€€›:€˜€€€€€˜€€€ƒ:€˜€€€€€˜€€€‡73€˜€€€‡78€svenzzon of titan(„„2€úùþþþþüýÿÿþÿüÿþÿþÿýþþÿþÿýÿýÿÿÿÿýÿÿþÿþÿþÿþÿþÿ—(a- €BMu¯&^Ù’ÿ4fñë z*NÒŸ‰’()V†Ï©þ£È¾í7³?Ev'MÇfÀê¢JìMvkæýî¯o×ô.“9O–• ñÖÈ'q8¥6Zï ÃHVŠ q(S—þ1]ìV±‡cƵ/%«˜Ä!T|Ã\àŽ‡×·ý™øõŽA«‡®ÎÚNËŒèËýÙââV½P“"m³A×î¶dv´7ÍÎ0ý eä4”?ÞòlÁyPF¶¡~ãb¤SÈøƒ‘^®VåÖçð11 V´¼ ѵ(Un:] ñ¼HöéÔ¯ëu‘x™w¬¾€•³üï$ÔTÒ»|ˆJº\ázV釗e›4íÐ8ŸÛ5ÔÊ Q7b û÷B %ÊÖPï4 Ñ·9Å€_)Bv7AËàä1ú]çÏÓò#” LøQ‹*æ «õýb)è_ -‡X¢’tÙœR.ÁO’ÿœ™” Þñ>óEŠ<"ð¤\EQ$]xDB—f0À"Ú³5›MýþÿþþûþÿþýþþþþüþþþþýþþþüþÿþþýýþþþýþþÿþþÿýþýýþþþþþýþýþþýþþÿþüýþÿýþþýþýþþþýþýþÿýýþÿþÿüþþþýþþýþýþÿþþûþÿþýþþþþüþþþþýþýÿüþþþÿýýýþÿýþþÿþþýþþýýÿýþþýÿýþýýÿþþþüþþþýþþýþýþÿýýþýÿþýýþÿþÿüþþþýþþýþýþÿþþûþÿþýþþþþüþþþþýþýÿüþþþÿýýýþÿýþþþÿþþÿþÿþýþÿþÿþÿÿýÿýÿþþþÿþÿþÿÿüÿþþÿÿýÿþÿþþþþþÿþÿþþþþÿÿýþÿþÿÿþüÿÿþþÿýÿÿýÿþþÿýÿÿþþýÿÿþÿýþÿÿþÿüÿÿþÿþÿýþÿþþÿýÿÿþÿþýþÿþÿþÿþþÿþÿþþÿýÿÿþÿýþþþÿÿþÿýÿþþþÿýÿÿþÿþýÿýÿÿþþþÿÿýÿýþÿÿþÿýÿÿýþÿýÿþÿÿþÿÿýþÿþÿþþÿþÿýþþÿþÿþÿÿýþþþÿýÿÿþÿþÿüÿþÿþÿÿýÿýþÿýÿÿþÿþÿþýþÿþÿþþÿþÿÿÿÿÿÿþÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿýÿÿþþþÿýþÿþþýÿÿþÿÿÿÿþÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿþÿÿýÿþýÿþþÿÿÿÿýÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿþÿþÿÿÿþýþþþÿýþÿÿÿþÿýÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿþÿÿÿÿþÿÿþýþÿþýÿþþÿÿÿÿÿÿþÿÿÿÿÿÿþÿýÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿýÿÿþÿÿÿÿþÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿýÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿýÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿýÿÿþÿÿÿÿþÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿýÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿþþÿÿÿÿÿÿþþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþþÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿThe Titan Turrican(- ‘üÿàÿýûû Ûïùýÿ êØ ëêï øâì éßãëj,åïï‘Ôùþ 8b%÷ýņ̃ü÷ ýòùîõù+þ³Þ ûûëø%úóëìá!> ýùðææäü %Þßãìý %=üøí÷õòðêóçìï ïñÿûîåøùûý ÿ ùîóìÿùöô$Aâ䨸ðùüW%àìì ßòöï.ùíôîîñ÷  &·ÞÜ "ûüâôöö2ýþþüåÏ÷û÷ú%%:þùõý  ÂåõÝð/ñö ãÌÿòëùûÿùööîþÿ¹áÙôû 9 ý¾ââÙ!$üäãÕó÷)$úöõüþÌëïÿ7Çæ êÙð üû(Dòíü ììÖêäöü%" ýÓêùüêù/þôü ÿòðêúøòöÛè ôø,þûíøÉêñðþ *Gýîÿý ïâ úûýÖØÛ,øú ùú òáøõýúõù÷  òñäõ óõöÿôù þÿýÿ0þñ Ãæ  âÛÂúüüúçêíÙõñý1 õæèÔò  %'öòèùäïåøû %Öë  àòóïôíòðüÜòû ÿÿþ`I(ÛóøþÿÿÿÿŸ·Ù þùþýþþþþbqìïìÿþÿÿÿÿŸüûþýþþþþbqìïìÿþÿÿÿÿVÙüûüÿþþþþbqìïìÿþÿÿÿÿŸüûüÿþþþr@ìæòÞïþ‰ø óò# D#×ÞÝüìõþþY0 ¨ð  ÷ SíöI3òâü èîüúÿßïÄÚø0ññ÷.ú¸úV åÞûG'þÑÞ¸Õý&ïï:& ÷ãöÖþ&Êù·ý}ÏË ! ø÷û¼×, ô6# ðøû Üü ïüßê*%ünôSPõàùþùúÉâñ0íøA'ÖÝò' ‡ó ý)éça ºÂý'ìñ÷U;öîçûæòþU ¬Ö÷ø³ý UöëØíÎÚþ  þéï@&üðüÑÿüü×ýDàß åëåödGó­ÀOMôîï òùùÿûÿÑý¿úý ýù óö=%ÆÒ0žÉüH)ßÝñ ÿóýcñå àé§¿f@ºÇ(úîÐîÿ&yô š˜ì;çî Ùâ91޹:8¶Ñ"ñø=»Ù :¯öJ;úóYÚ×`K«Æì\I§®P7×Òî;% øèøÿìþÔæü& þüýçþDøï3&Õäö,#½È=+ùê ¬ÒU?•éDù÷û×å æþ÷ÿ5%äëô´Ò#"þñþ)æê÷ýíÿÛplì[TÆÁþG öÆÚù?ÿàì7'äã¡÷. ²õ ÿüÒÿ_ ØÒø)úööáïF)ÉÑòM0×ܰøþÿÿa?ñíëÿýþþþþÿÿÿÿþ§Ï ýûþþþþÿÿÿÿÿ‚ âôúþþþþþÿÿÿÿþþˆø þýþþþþþu õåúÿÿÿþþþþ¸Ñ ûþþþþþÿÿÿÿE$þòöûÿÿÿÿÿþþþþ›ù ÿý%#Óäü) úöòÿøûì÷þ  àüM ØìûÿâìÙüÞÞ"éë"ßç ÿìñüçýý#ýÐÞ2*ýìíâó)ö÷íü÷õìùöþBÏæù; ºôþ Öè îë)þéò÷þñôþÿÞÿñýÿìÿïù1$ÊÝö:+ËË/çâ(# Éßíëø-ðõü)ìþíùöÿRÍÓ!!áê ÿú öûÿÿþñù Ôú!íýÕÿýùüêõ ýû Ýé ñûÏßøA èùýûùæñ ýý÷úý êöÿ)òúëÿÑú þô÷ þþ×ê öù þÝý þÖüöÿ ýùõ÷ûäî üî÷,Øßö= Þùÿ*üãýÛâ&üóýïù êðúõöðöÿëÿ%ü¶ù3 òìýùú  þþéòîý-áèöÿíôø"ù÷òù×ã&#çï ÿæô÷)ñûáúäìÿþíõôö øü ùùýùýÒú,çñúÙߨü  þèõ äë# Ìã Ôøïû)Öúú þúþ òóêïýüöýùþ4Ïåù? Õø"øýüéñ ÿÿ âðéñùüôèþú:Úß)ùðø àæ+Þâ ïóþùýõýë/ÓùþÁùùõÿîô ñóü+çëéüÍúáüþûôùèò üü ýýýùûúÿñôèí ù÷áíôòøüÿþëý Þýûû ýýü óø ìôý ôúþï!÷þþ þþóþ øûöú áë Þïùüóîýùú ÿÜçðîÿìòîíú û÷ýö5ÛÞ1Ûù üùéë ïöÿ ÷÷øùÿ÷ çûþüÿþü üúüüþüÿûüüýÛå÷ûùÿüýúýøü)ìîøùüûûýÿúý çñïíû þÿöÿ íñîò ÿüëó üùëù#ñóùöÿóì êêòõêòþüýùý Üúþ üÿúüôùïñúø÷ü éñþýøþîý Øü6ÆøØü ööîóû ýþôúýÿ×ý&éé,èëüöúýïöÕù ýþèÿþ Óý&óò ýïõîó ëõûéóÿöýúûòøýîóôôøùúü÷ýÿöþôú ñþÿ þïö õø ìö ûùþèý ÿÿóþþûúÿÿüýøý ôöùûÿÿêýòõòÿÿöù ù÷ ÿý íýáüòÿ æí ïò öö ñôüüáú ÿ÷ÿóñý ùûü÷ýÿûú ùÿ÷þìýÿþÿýýûý îóÿúýòöÿðýáü úûøûêóÿýúÿ ùûýçð îýþôþöö èñ ø÷þü õýýÿúüû÷øþ öùüþøúý ýüú îö þãý ÿó÷öú ò÷ýúüÿþòøîï ÷úÿïóìï ýúü÷úÿôþòýÿþÿýýÿñù øøëö òý ðóñýÿõû íñòóûööþúþþ ûüøþøû íò üúøøþ ÷ûýøýþ ÷ýþþÿúý ûþüýýþþþýýýÿõÿûþÿ öôúúöô þùòýùÿöúüúñ õí ùûþúý ýíÿ þø ü÷øýõôúû þþþýþþõ þðüûùú öñ þýýÿÿúû ýïÿþý(@ðQÜðÖ!ýÿõæ)Þ2õóùêò<Â-Þüö$í>áÅ8ÞÆI²8Òë1ß+ôîàâö ã@ÙûùÅ þ Ú½IÊ6á¿6ãì¹CÙ$öýÖ-ýéþûå çÙ8ì÷Ò Ê2ðÔ:ÐßÖ ÷îÀ;ÝùÎÎýã3Ô;·6çþà Á8Ê3Ó)Ò íý#ôûÓ!ô ûÊ2æì+ñê!öó'÷ôñé.îæôÖ)éåðÇ0â&ðÐîÙ Øû ä0á Øê*Ó5áëòüç ìÓ Ùç+Õë3Úáîñðßô ñìú Û ÿÜý íûÞ åñ#åýù éÝ$íêûÿç$ßö Ñ#íé6àñÆ(ã ë:à ÿñ ÿãþüó üøúå Øãøý"ïì÷ ï#öèú÷ ùôúáùí&æí×$Û'Üã ý!ðå êè-èþèß÷öïüý øÿüßîøòùòûçùÿöá"îùüðöý îå ÿõ ð ÿùñþùüøóúý þøúìïü óûÿù÷õûö ýöþ ùÿ ÷ðýþ ûòð ùû ýû ÷ÿ õ ûö ùü÷ ÿøúþúüûþúüûþþþÿMade as intro tune(4Ö\0€ùöë"ñöìæú ù!°YÐà 8·÷ùÓP¬d~gÔ2jÍ6Æó;àº`¨T¢<¨Q­bËð>È%ãØa©'óÉ-°-!²GÆSÁÒk™\Ç ç Ì%ê'ßÓm¥,›~¥ùݵˆp!Q”:ø æ6²- ⱜ„# ä.áãMufÆ2éø ñ -”<µ)Dzx·ä±r¸ ÿñùLt‘Câ ºOó•G"·4òðÿó2ž@Á.÷á'ëÎ#­.2ºA©/ñý(È&ã Í[©V¡5ÖÓ! æþÇ/Ñ-°FêüòçýéN ’WMóøëÏ„P™¼ç_†QÔEº Ù3¹-Åú Ûýá'ôöÑS´4ÉE³(´]¿+¨ZÛçÛ<ÔòF·PˆeÚ ²¡[J áîR¶.¨v…hÔÚ\¦(³7ùùèavQ÷"­1ûÔ,çÿ ¹Qäýë.èÚNÐ üÆZ½&õØU×Ù?Þüþß*ÀV{Kö ¢PéûÂ{{%5Ì ¥AªKîÍña­ö<}GêÔ:µã7Ùÿö Ö!Ã3í ëýå.”?îîúñ#ºv‡4Ü)³ BYêãñW®è9Ú¿B°CøòÚ^·òÓl› B·9ÜéüÜ1öäÕÿùÔF±ÿX2þÍUÊü ä$Â9ãÕõ]«üü öèQ™PÈY˜V­¯3ø ñþ$±N–0÷7•gÊ ýïBÆù úÏ\“vŒh¯?Ü è,èóöÕúO~‹¯%Ë2çñ ̸\Ëè'íá)ÂIª1ôèÐ;õõØYµ#íÛFº Ácª$™Nãø2Âüãõäø÷Ý"âø+¿Úû ßåÚ1äÒm:ä-äÔXÂñF°YÉé! àýðìK£FêÑY×ÅOòîÔ' ºCÃTŸ:›IðñêEÀíö'îØOÈàPÓÝç<¿ùV·âß:ÞØ=æû*ªOÞ ßÎ&Äi»ù6ÎïZ–6øúôÿâù9ÔâÞ.ùßÞ÷$Õ .±dZƒDò×1¾INê1¡6ÏSbØðþä"©6$¾"ùÝ9íàäÊäÿÿ ðîÿí öíý0¬g¸ïîõôñ ë7¨'D•.ó/›w¦=çëüõà*ß(º-Ç$î#Øüú,Ëî÷æ Û=Ãôèùô ñ(Á6öîô÷ óñÉü7èèýúÏ;øïÜüé0Æ>¹.ØÚIË ûû°32–IïèB«1ùðìúÑMµÁ7¡8*©T¯%à¿Híâ6Õî Ê*·<ïâ ðÚ=ûË6éÕa¸ÝG³!î%Øê4èíüñäï èÿí4Îÿù,ÍD[Ö #À"ûá õ Âf£NÅùþ(à °-=·Ù<ÚõüÚ7ðÞ )Ü úË.îÛ?Øüçä,»"Ò2ßùÙ +t”CíÑ 7¯NÑÿñþ(Õ ü©[Õõí@².äîü6áøðÚ/ãü×A£cÈÕdÎþö èù í$¾Gfor titan artpack2(@@BB2€°and for newest version(of MilkyTracker!((Rock on Peter!(((((((((((I greet my friends in(superior art creations(Thank you and good(bye.((Scour, Nerv, Asphyx,(Crome, Maktone, barium(idiana, comrade, coh,(don, dipswitch, eboy,(f0st, flamez, fourth,(kmx, mr.death, pdz,(sergeon cuts, spinsane(vouck, webpige0((I wish you all good(luck with your future(productions !((Rocked the scene(since -95(((((milkytracker-0.90.85+dfsg/resources/music/theday.xm0000755000175000017500000022237010757602370021421 0ustar admin2admin2Extended Module: the day they landedMilkyTracker -*      !"#$&'(%)* @I?? QC › ?0 €€€„ˆˆ€ŒÑ €€€Kˆˆ€ŒÑ K0 €€…?ˆˆ€ŒÑ ˆ €€Cœ°ˆ˜ ŒÑ ˆ C0 €…KŒ°ˆˆ ŒÑ ˆ Œá €?Œ°ˆŠ ?0 ˆ Œá €…CŒ°ˆˆ ŒÑ ˆ Œá €KŒ°ˆŠ ŒÑ K0 Œá €…?Œ°ˆˆ ŒÑ ˆ Œá €CŒ°ˆ‚ŒÑ ˆ C0 €…KŒ°ˆ€ŒÑ ˆ Œá €?Œ°ˆˆ ?0 ˆ Œá €…CŒ°ˆˆ ŒÑ ˆ Œá €FŒ°ˆŠ ŒÑ F0 Œá €…?Œ°ˆˆ ŒÑ ˆ Œá €C>°ˆ›@ŒÑ ˆ C0 €…FŒ°ˆˆŒÑ ˆ Œá €OŒ°ˆ€O0 ˆ Œá €…CŒ°ˆ€ŒÑ ˆ Œá €FŒ°ˆ˜ ŒÑ F0 Œá €…OŒ°ˆˆ ŒÑ ˆ Œá €CŒ°ˆŠ ŒÑ ˆ C0 €…FŒ°ˆˆ ŒÑ ˆ Œá €OŒ°ˆŠ O0 ˆ Œá €…CŒ°ˆŠ ŒÑ ˆ Œá €FŒ°ˆŠ ŒÑ F0 Œá €…OŒ°ˆˆ ŒÑ ˆ Œá €CŒ°ˆŠ ŒÑ ˆ C0 €…FŒ°ˆˆ ŒÑ ˆ Œá €JŒ°ˆŠ J0 ˆ Œá €…CŒ°ˆˆ ŒÑ ˆ Œá €FŒ°:ÿ‹"Œá F0 ŒÑ €…JŒ°ˆˆŒá ˆ ŒÑ €RŒ°ˆ€Œá ˆ R0 €…FŒ°ˆ€Œá ˆ ŒÑ €JŒ°ˆ˜ J0 ˆ ŒÑ €…RŒ°ˆˆ Œá ˆ ŒÑ €FŒ°ˆŠ Œá F0 ŒÑ €…JŒ°ˆˆ Œá ˆ ŒÑ €RŒ°ˆ‚Œá ˆ R0 €…FŒ°ˆ€Œá ˆ ŒÑ €JŒ°ˆˆ J0 ˆ ŒÑ €…RŒ°ˆˆ Œá ˆ ŒÑ €FŒ°9ð‹!Œá F0 ŒÑ €…JŒ°ˆˆŒá ˆ ŒÑ €EŒ°ˆˆ Œá ˆ E0 €…FŒ°ˆˆ Œá ˆ ŒÑ €AA°ˆ‹A0 ˆ ŒÑ €…EŒ°ˆˆŒá ˆ ŒÑ €MŒ°ˆ‹)Œá M0 ŒÑ €…AŒ°ˆˆŒá ˆ ŒÑ €EŒ°ˆ˜ Œá ˆ E0 €…MŒ°ˆˆ Œá ˆ ŒÑ €AŒ°ˆ‹A0 ˆ ŒÑ €…EŒ°ˆˆŒá ˆ ŒÑ €MŒ°ˆ‹)Œá M0 ŒÑ €…AŒ°ˆˆŒá ˆ ŒÑ €EŒ°ˆ‹Œá ˆ E0 €…MŒ°ˆˆŒá ˆ ŒÑ €AŒ°ˆ‹)A0 ˆ ŒÑ €…EŒ°ˆˆŒá ˆ ŒÑ €CŒ°ˆ‹(Œá C0 ŒÑ €…AŒ°ˆˆŒá ˆ ŒÑ € @6?0ƒ?ƒBƒ?œá ?0 œÑ ƒ1…C€€€Œá ˆ ŒÑ €K0˜r€KŒá ˆ K0 …1@…?ˆ€„ Œá ˆ ŒÑ €C0ˆƒI‡?ÿC0 ˆ ŒÑ ›1s…KŒ €€Œá ˆ ŒÑ ˆ?0ƒCƒB?Œá ?0 ŒÑ …1@…C€€„ Œá ˆ ŒÑ €K0€€ƒKŒá ˆ K0 ƒ1…?„ €€Œá ˆ ŒÑ €C0ƒDƒB…?ðC0 ˆ ŒÑ …1@…K€€€Œá ˆ ŒÑ €?0„ ƒI?Œá ?0 ŒÑ ‹1…C€€„ Œá ˆ ŒÑ ˆF0›FƒB‡KðŒá ˆ F0 …1@…?ˆ€€Œá ˆ ŒÑ €C0ˆƒBCC0 ˆ ŒÑ ƒ1…Fˆ€€Œá ˆ ŒÑ €O0ˆ€OŒá O0 ŒÑ …1@…Cˆ€„ Œá ˆ ŒÑ €F0ˆƒI‡CðŒá ˆ F0 ‹1…Oˆ€€Œá ˆ ŒÑ ˆC0Œ €CC0 ˆ ŒÑ …1@…F€€„ Œá ˆ ŒÑ €O0ƒFƒBƒOŒá O0 ŒÑ ƒ1…C€€€Œá ˆ ŒÑ €F0„ ƒBCŒá ˆ F0 …1@…O€‡I €Œá ˆ ŒÑ €C0ƒCƒICC0 ˆ ŒÑ ‹1…F€€„ Œá ˆ ŒÑ ˆJ0FƒIƒOŒá J0 ŒÑ …1@…C€€€Œá ˆ ŒÑ €F0ˆƒB:ŒÑ ˆ F0 ƒ1…JŒ €€ŒÑ ˆ Œá €R0ŒP€FR0 ˆ Œá …1@…FŒ €„ ŒÑ ˆ Œá €J0ƒDƒI‡:ðŒÑ J0 Œá ‹1…R€€€ŒÑ ˆ Œá ˆF0€ƒB:ŒÑ ˆ F0 …1@…J€€„ ŒÑ ˆ Œá €R0C€ƒFR0 ˆ Œá ƒ1…F€€€ŒÑ ˆ Œá €J0€ƒB…:ðŒÑ J0 Œá …1@…R„ €€ŒÑ ˆ Œá €F0ƒ?ƒI:ŒÑ ˆ F0 ‹1…J€€„ ŒÑ ˆ Œá ˆG0€ƒB‡FðG0 ˆ Œá …1@…F„ €€ŒÑ ˆ Œá €A0ƒAƒB<ŒÑ H0 Œá ƒ1…G€€€ŒÑ ˆ Œá €M0€€HŒÑ ˆ T0 …1@…A€€„ ŒÑ ˆ Œá €H0ˆƒI‡<ðM0 ˆ Œá ‹1…Mˆ€€ŒÑ ˆ Œá ˆA0ˆ€<ŒÑ H0 Œá …1@…Hˆ€„ ŒÑ ˆ Œá €M0Œ ƒBƒHŒÑ ˆ T0 ƒ1…Aˆ€€ŒÑ ˆ Œá €H0ˆƒB…<ðM0 ˆ Œá …1@…Mˆ‡I €ŒÑ ˆ Œá €A0ƒJƒIHŒÑ H0 Œá ‹1…H€€„ ŒÑ ˆ Œá ˆM0„ ƒIƒHŒÑ ˆ T0 …1@…A€€€ŒÑ ˆ Œá € @]? C°?ð›'@œá ˜ ?0 €…CŒ°ˆˆŒá ˆ ŒÑ €K Œ°ˆ€K0 ˆ ŒÑ €…?Œ°ˆ€Œá ˆ ŒÑ €C!Œ°ˆ˜ Œá C0 ŒÑ €…KŒ°ˆˆ Œá ˆ ŒÑ €?!Œ°ˆŠ Œá ˆ ?0 €…CŒ°ˆˆ Œá ˆ ŒÑ €K"Œ°ˆ‚K0 ˆ ŒÑ €…?Œ°ˆ€Œá ˆ ŒÑ €C"Œ°ˆˆ Œá C0 ŒÑ €…KŒ°ˆˆ Œá ˆ ŒÑ €?#Œ°ˆ‹&Œá ˆ ?0 €…CŒ°ˆˆŒá ˆ ŒÑ €F#Œ°ˆˆ F0 ˆ ŒÑ €…?Œ°ˆˆ Œá ˆ ŒÑ €C$Œ°‰>‹Œá C0 ŒÑ €…FŒ°ˆˆŒá ˆ ŒÑ €O$Œ°ˆ‹+Œá ˆ O0 €…CŒ°ˆ˜Œá ˆ ŒÑ €F%Œ°ˆœf„F0 ˆ ŒÑ €…OŒ°ˆ‹+Œá ˆ ŒÑ €C%Œ°ˆ˜Œá C0 ŒÑ €…FŒ°ˆˆŒá ˆ ŒÑ €O&Œ°ˆ‹+Œá ˆ O0 €…CŒ°ˆˆŒá ˆ ŒÑ €F&Œ°ˆˆF0 ˆ ŒÑ €…OŒ°ˆˆŒá ˆ ŒÑ €C'Œ°ˆ‹&Œá C0 ŒÑ €…FŒ°ˆˆŒá ˆ ŒÑ €J'Œ°ˆˆŒá ˆ J0 €…CŒ°ˆˆŒá ˆ ŒÑ €F(:°ˆ‹"F0 ˆ Œá €…JŒ°ˆˆŒÑ ˆ Œá €R(Œ°ˆ€ŒÑ R0 Œá €…FŒ°ˆ€ŒÑ ˆ Œá €J)Œ°ˆ˜ ŒÑ ˆ J0 €…RŒ°ˆˆ ŒÑ ˆ Œá €F)Œ°ˆŠ F0 ˆ Œá €…JŒ°ˆˆ ŒÑ ˆ Œá €R*Œ°ˆ‚ŒÑ R0 Œá €…FŒ°ˆ€ŒÑ ˆ Œá €J*Œ°ˆˆ ŒÑ ˆ J0 €…RŒ°ˆˆ ŒÑ ˆ Œá €F+<°ˆ‹F0 ˆ Œá €…JŒ°ˆˆŒÑ ˆ Œá €G+Œ°ˆ‹"ŒÑ G0 Œá €…FŒ°ˆˆŒÑ ˆ Œá €A,Œ°‰A‹$ŒÑ ˆ H0 €…GŒ°ˆˆŒÑ ˆ Œá €M,Œ°ˆ€T0 ˆ Œá €…AŒ°ˆ€ŒÑ ˆ Œá €H-Œ°ˆ˜ ŒÑ M0 Œá €…MŒ°ˆˆ ŒÑ ˆ Œá €A-Œ°ˆŠ ŒÑ ˆ H0 €…HŒ°ˆˆ ŒÑ ˆ Œá €M.Œ°ˆŠ T0 ˆ Œá €…AŒ°ˆŠ ŒÑ ˆ Œá €H.Œ°ˆ›ŒÑ M0 Œá €…MŒ°ˆ˜ŒÑ ˆ Œá €A/Œ°ˆšŒÑ ˆ H0 €…HŒ°ˆšŒÑ ˆ Œá €M/Œ°ˆšT0 ˆ Œá €…AŒ°ˆšŒÑ ˆ Œá € @¦?0?°Cð‡?@œÑ ?0 œá ƒ1…MŒ°ˆ€ŒÑ ˆ Œá €K0Œ°ˆ…K@ŒÑ ˆ K0 …1@…?Œ°Œ„ŒÑ ˆ Œá €C0Œ°ˆ?ÿ 1C0 ˆ Œá ƒ1…KŒ°ˆ€ŒÑ ˆ Œá €?0Œ°ˆ…?AŒÑ ?0 Œá …1@…CŒ°Œ„ŒÑ ˆ Œá €K0Œ°ˆ…KBŒÑ ˆ K0 ƒ1…?Œ°ˆ€ŒÑ ˆ Œá €C0Œ°ˆ?ð 2C0 ˆ Œá …1@…KŒ°Œ€ŒÑ ˆ Œá €?0Œ°ˆ…?CŒÑ ?0 Œá ƒ1…CŒ°ˆ„ŒÑ ˆ Œá €F0Œ°ˆKð 3ŒÑ ˆ F0 …1@…?Œ°Œ€ŒÑ ˆ Œá €C0>°ˆ…CDC0 ˆ Œá ƒ1…FŒ°ˆ€ŒÑ ˆ Œá €O0Œ°ˆ…ODŒÑ O0 Œá …1@…CŒ°Œ„ŒÑ ˆ Œá €F0Œ°ˆCð 5ŒÑ ˆ F0 ƒ1…OŒ°ˆ€ŒÑ ˆ Œá €C0Œ°ˆ…CEC0 ˆ Œá …1@…FŒ°Œ„ŒÑ ˆ Œá €O0Œ°ˆ…OFŒÑ O0 Œá ƒ1…CŒ°ˆ€ŒÑ ˆ Œá €F0Œ°ˆ…CFŒÑ ˆ F0 …1@…OŒ°Œ€ŒÑ ˆ Œá €C0Œ°ˆ…CGC0 ˆ Œá ƒ1…FŒ°ˆ„ŒÑ ˆ Œá €J0Œ°ˆ…OGŒÑ J0 Œá …1@…CŒ°Œ€ŒÑ ˆ Œá €F0Œ°:ÿ…FHŒá ˆ F0 ƒ1…JŒ°ˆ€Œá ˆ ŒÑ €R0Œ°ˆ…RHR0 ˆ ŒÑ …1@…FŒ°Œ„Œá ˆ ŒÑ €J0Œ°ˆ…FIŒá J0 ŒÑ ƒ1…RŒ°ˆ€Œá ˆ ŒÑ €F0Œ°ˆ…FIŒá ˆ F0 …1@…JŒ°Œ„Œá ˆ ŒÑ €R0Œ°ˆRð :R0 ˆ ŒÑ ƒ1…FŒ°ˆ€Œá ˆ ŒÑ €J0Œ°ˆ…FJŒá J0 ŒÑ …1@…RŒ°Œ€Œá ˆ ŒÑ €F0Œ°9ð…FKŒá ˆ F0 ƒ1…JŒ°ˆ„Œá ˆ ŒÑ €E0Œ°ˆ…RKE0 ˆ ŒÑ …1@…FŒ°Œ€Œá ˆ ŒÑ €A0A°ˆ…ALŒá A0 ŒÑ ƒ1…EŒ°ˆ€Œá ˆ ŒÑ €M0Œ°ˆ…MLŒá ˆ M0 …1@…AŒ°Œ„Œá ˆ ŒÑ €E0Œ°ˆAð =E0 ˆ ŒÑ ƒ1…MŒ°ˆ€Œá ˆ ŒÑ €A0Œ°ˆ…AMŒá A0 ŒÑ …1@…EŒ°Œ„Œá ˆ ŒÑ €M0Œ°ˆ…MNŒá ˆ M0 ƒ1…AŒ°ˆ€Œá ˆ ŒÑ €E0Œ°ˆAð >E0 ˆ ŒÑ …1@…MŒ°Œ€Œá ˆ ŒÑ €A0Œ°ˆ…AOŒá A0 ŒÑ ƒ1…EŒ°ˆ„Œá ˆ ŒÑ €C0Œ°ˆMð ?Œá ˆ C0 …1@…AŒ°Œ€Œá ˆ ŒÑ € @?0C°ƒBƒ??0 ˜ œÑ ƒ1…CŒ°€€Œá ˆ ŒÑ €K0Œ°€KŒá K0 ŒÑ …1@…?Œ°€„ Œá ˆ ŒÑ €C0Œ°€‡?ÿŒá ˆ C0 ƒ1…KŒ°€€Œá ˆ ŒÑ €?0Œ°›I ??0 ˆ ŒÑ …1@…CŒ°€„ Œá ˆ ŒÑ €K0Œ°€ƒKŒá K0 ŒÑ ƒ1…?Œ°€€Œá ˆ ŒÑ €C0Œ°›I …?ðŒá ˆ C0 …1@…KŒ°€€Œá ˆ ŒÑ €?0Œ°ƒB??0 ˆ ŒÑ ƒ1…CŒ°€„ Œá ˆ ŒÑ €F0Œ°€‡KðŒá F0 ŒÑ …1@…?Œ°€€Œá ˆ ŒÑ €C0Œ°€CŒá ˆ C0 ƒ1…FŒ°€€Œá ˆ ŒÑ €O0Œ°ƒBOO0 ˆ ŒÑ …1@…CŒ°€„ Œá ˆ ŒÑ €F0Œ°€‡CðŒá F0 ŒÑ ƒ1…OŒ°€€Œá ˆ ŒÑ €C0Œ°ƒBCŒá ˆ C0 …1@…FŒ°€„ Œá ˆ ŒÑ €O0Œ°›I ƒOO0 ˆ ŒÑ ƒ1…CŒ°€€Œá ˆ ŒÑ €F0Œ°›I CŒá F0 ŒÑ …1@…OŒ°€€Œá ˆ ŒÑ €C0Œ°›I CŒá ˆ C0 ƒ1…FŒ°€„ Œá ˆ ŒÑ €J0Œ°€ƒOJ0 ˆ ŒÑ …1@…CŒ°€€ŒÑ ˆ ŒÑ €F0:°ƒB:ŒÑ F0 Œá ƒ1…JŒ°€€ŒÑ ˆ Œá €R0Œ°€FŒÑ ˆ R0 …1@…FŒ°€„ ŒÑ ˆ Œá €J0Œ°€‡:ðJ0 ˆ Œá ƒ1…RŒ°€€ŒÑ ˆ Œá €F0Œ°›I :ŒÑ F0 Œá …1@…JŒ°€„ ŒÑ ˆ Œá €R0Œ°€ƒFŒÑ ˆ R0 ƒ1…FŒ°€€ŒÑ ˆ Œá €J0Œ°›I …:ðJ0 ˆ Œá …1@…RŒ°€€ŒÑ ˆ Œá €F0<°ƒB:ŒÑ F0 Œá ƒ1…JŒ°€„ ŒÑ ˆ Œá €G0Œ°›I ‡FðŒÑ ˆ G0 …1@…FŒ°€€ŒÑ ˆ Œá €A0œ° €Œá ˆ J0 ƒ1…N€€€Œá ˆ ŒÑ €V0€€JV0 ˆ ŒÑ …1@…J„ €„ Œá ˆ ŒÑ €N0ƒNƒI‡>ðŒá N0 ŒÑ ‹1…V€€€Œá ˆ ŒÑ ˆJ0€ƒB>Œá ˆ J0 …1@…N„ €„ Œá ˆ ŒÑ €V0ƒN€ƒJV0 ˆ ŒÑ ƒ1…J„ €€Œá ˆ ŒÑ €N0ƒNƒB…>ðŒá N0 ŒÑ …1@…V€€€Œá ˆ ŒÑ €J0€ƒI>Œá ˆ J0 ‹1…N„ €„ Œá ˆ ŒÑ ˆI0ƒLƒB‡JðI0 ˆ ŒÑ …1@…J€€€Œá ˆ ŒÑ €E0€ƒB@Œá E0 ŒÑ ƒ1…I€€€Œá ˆ ŒÑ €Q0˜r€LŒá ˆ Q0 …1@…Eˆ€„ Œá ˆ ŒÑ €I0ˆƒI‡@ðI0 ˆ ŒÑ ‹1…Qˆ€€Œá ˆ ŒÑ ˆE0ˆ€@Œá E0 ŒÑ …1@…Iˆ€„ Œá ˆ ŒÑ €Q0ˆƒBƒLŒá ˆ Q0 ƒ1…Eˆ€€Œá ˆ ŒÑ €I0ˆƒB…@ðI0 ˆ ŒÑ …1@…QŒ ‡I €Œá ˆ ŒÑ €E0ƒNƒI@Œá E0 ŒÑ ‹1…I€€„ Œá ˆ ŒÑ ˆG0€ƒIƒLŒá ˆ G0 …1@…E€€€Œá ˆ ŒÑ € @_C0ƒOƒB›C C0 ˜ œÑ ƒ1…G€€€Œá ˆ ŒÑ €O0€€OŒá O0 ŒÑ …1@…C˜r€„ Œá ˆ ŒÑ €G0ˆƒI‡CÿŒá ˆ G0 ›1s…OŒ €€Œá ˆ ŒÑ ˆC0ƒNƒBCC0 ˆ ŒÑ …1@…Gœ Ò€„ Œá ˆ ŒÑ €O0O(ÿ€ƒOŒá O0 ŒÑ ƒ1…CN0€€Œá ˆ ŒÑ €G0ƒJƒB…CðŒá ˆ G0 …1@…O€€€Œá ˆ ŒÑ €C0€ƒICC0 ˆ ŒÑ ‹1…G„ €„ Œá ˆ ŒÑ ˆJ0›Q ƒB‡OðŒá J0 ŒÑ …1@…C€€€Œá ˆ ŒÑ €E0€ƒBJŒá ˆ E0 ƒ1…Jˆ€€Œá ˆ ŒÑ €Q0ˆ€VQ0 ˆ ŒÑ …1@…EŒ €„ Œá ˆ ŒÑ €J0ƒJƒIƒJŒá J0 ŒÑ ‹1…Q€€€Œá ˆ ŒÑ ˆE0„ €JŒá ˆ E0 …1@…J€€„ Œá ˆ ŒÑ €Q0ƒLƒBƒVQ0 ˆ ŒÑ ƒ1…E„ €€Œá ˆ ŒÑ €J0€ƒBJŒá J0 ŒÑ …1@…Q€‡I €Œá ˆ ŒÑ €E0ƒNƒIJŒá ˆ E0 ‹1…J„ €„ Œá ˆ ŒÑ ˆQ0‡LƒIƒVQ0 ˆ ŒÑ …1@…E„€€ŒÑ ˆ ŒÑ €@0„ƒBEŒÑ @0 Œá ƒ1…QŒ€€ŒÑ ˆ Œá €L0Œ€QŒÑ ˆ L0 …1@…@Œ€„ ŒÑ ˆ Œá €B0ŒƒI‡EðB0 ˆ Œá ‹1…LŒ€€ŒÑ ˆ Œá ˆ@0ŒƒBEŒÑ @0 Œá …1@…BŒ€„ ŒÑ ˆ Œá €L0Œ€ƒQŒÑ ˆ L0 ƒ1…@Œ€€ŒÑ ˆ Œá €B0ŒƒB…EðB0 ˆ Œá …1@…LŒ€€ŒÑ ˆ Œá €@0ŒƒIEŒÑ @0 Œá ‹1…BŒ€„ ŒÑ ˆ Œá ˆL0ŒƒB‡QðŒÑ ˆ L0 …1@…@Œ€€ŒÑ ˆ Œá €B0QƒBEB0 ˆ Œá ƒ1…L„€€ŒÑ ˆ Œá €@0„€QŒÑ @0 Œá …1@…BŒ€„ ŒÑ ˆ Œá €L0ŒƒI‡EðŒÑ ˆ L0 ‹1…@Œ€€ŒÑ ˆ Œá ˆB0ŒƒIEB0 ˆ Œá …1@…LŒ€„ ŒÑ ˆ Œá €@0Œ€›QŒÑ @0 Œá €…BŒ€ˆŒÑ ˆ Œá €L0œ‡I ˆŒÑ ˆ L0 €…@Œ€ˆŒÑ ˆ Œá €B0Œ‡I0ˆB0 ˆ Œá €…LŒ€ˆŒÑ ˆ Œá €@0Œ‡I@ˆŒÑ @0 Œá €…BŒƒIˆŒÑ ˆ Œá € @$A0ƒEƒBƒAœá ˜ A0 ƒ1…C€€€Œá ˆ ŒÑ €M0€€MM0 ˆ ŒÑ …1@…A„ €„ Œá ˆ ŒÑ €E0ƒHƒI‡AÿŒá E0 ŒÑ ›1s…M€€€Œá ˆ ŒÑ ˆA0EƒBAŒá ˆ A0 …1@…E€€„ Œá ˆ ŒÑ €M0€€ƒMM0 ˆ ŒÑ ƒ1…A„ €€Œá ˆ ŒÑ €E0ƒHƒB…AðŒá E0 ŒÑ …1@…M€€€Œá ˆ ŒÑ €A0EƒIAŒá ˆ A0 ‹1…E€€„ Œá ˆ ŒÑ ˆH0€ƒB‡MðH0 ˆ ŒÑ …1@…A„ €€Œá ˆ ŒÑ €E0ƒHƒBEŒá E0 ŒÑ ƒ1…H€€€Œá ˆ ŒÑ €Q0€€QŒá ˆ Q0 …1@…E„ €„ Œá ˆ ŒÑ €H0ƒEƒI‡EðH0 ˆ ŒÑ ‹1…Q€€€Œá ˆ ŒÑ ˆE0H€EŒá E0 ŒÑ …1@…H€€„ Œá ˆ ŒÑ €Q0€ƒBƒQŒá ˆ Q0 ƒ1…E€€€Œá ˆ ŒÑ €H0EƒBEH0 ˆ ŒÑ …1@…Q€‡I €Œá ˆ ŒÑ €E0HƒIEŒá E0 ŒÑ ‹1…H€€„ Œá ˆ ŒÑ ˆL0LƒIƒQŒá ˆ L0 …1@…E€€€Œá ˆ ŒÑ €H0€ƒBHH0 ˆ Œá ƒ1…L„ €€ŒÑ ˆ Œá €T0ƒL€TŒÑ T0 Œá …1@…H„ €„ ŒÑ ˆ Œá €L0ƒHƒIƒHŒÑ ˆ L0 ‹1…T€€€ŒÑ ˆ Œá ˆH0„ ƒBHH0 ˆ Œá …1@…L€€„ ŒÑ ˆ Œá €T0ƒJ€ƒTŒÑ T0 Œá ƒ1…H€€€ŒÑ ˆ Œá €L0€ƒBHŒÑ ˆ L0 …1@…T€€€ŒÑ ˆ Œá €H0LƒIHH0 ˆ Œá ‹1…L€€„ ŒÑ ˆ Œá ˆG0€ƒBƒTŒÑ G0 Œá …1@…H„ €€ŒÑ ˆ Œá €C0ƒGƒBCŒÑ ˆ C0 ƒ1…G€€€ŒÑ ˆ Œá €O0€€OO0 ˆ Œá …1@…C€€„ ŒÑ ˆ Œá €G0˜rƒI‡CðŒÑ G0 Œá ‹1…Oˆ€€ŒÑ ˆ Œá ˆC0ˆ€CŒÑ ˆ C0 …1@…Gˆ€„ ŒÑ ˆ Œá €O0ˆƒBƒOO0 ˆ Œá ƒ1…Cˆ€€ŒÑ ˆ Œá €G0ˆƒB…CðŒÑ G0 Œá …1@…Oˆ‡I €ŒÑ ˆ Œá €C0Œ ƒIOŒÑ ˆ C0 ‹1…Gˆ€„ ŒÑ ˆ Œá ˆE0ˆƒIƒOE0 ˆ Œá …1@…Cˆ€€ŒÑ ˆ Œá € @žœŒ›B€;À ‡;χ=€€Œ€€€€„€€Œ€€€€…I€€Œ€€„ „ „‡=€Œ€‡A?€€…A$„€Œ€€€€„…I€Œ€‡5J€€…=*„€Œ€„€€„…AƒIŒBƒA€€…I.„€Œ€€„„„…=€Œ€5„„…A/„€Œ€„ „„„…I€Œ€ƒA„0„0…=0„€Œ€€€€„…A€Œ€5€€…D2„€Œ€„ „„„…=€ŒBƒA€€…A3„€Œ€€€€„…D€Œ€5€€…M4„€Œ€„ €€„…A€Œ€ƒA€€…D5„€Œ€€„„„…M€Œ€5„„…A7„€Œ€„ „„„…DIŒBƒA„ „ …M8„€Œ€€€€„…A€Œ€5€€…D9„€Œ€„ „„„…M€Œ€ƒA€€…A:„€Œ€€€€„…D€Œ€5€€…H;„€Œ€„ €€„…A€€BƒA€€…D=„€€€€„„„…H€€€5„„…P>„€€€„ „„„…D€€€ƒA„„…H?„€€€€€€„…P€€€5€€…D@„€€€„ „„„…HI€BƒA€€…PA„€€€€€€„…D €€€5€€…HC„€€€„ €€„…P €€€ƒA€€…DD„€€€€„„„…H!…I0€€5„„…CE„€€€„ „„„…D!€€BƒA„„…?F„€€€€„„„…C"€€€5„„…KH„€€€„ „„„…?"…I €€ƒA„„…CI„€€€€„„„…K#€€€5„„…?J„€€€„ „„„…C#ƒI€BƒA„„…KK„€€€€„„„…?#€€€5„„…CL„€€€„ „„„…K$€€€ƒA„„…?N„€€€€€€„…C$…I €€5€€…AO„€€€„ €€„…?% @~€ƒ>ƒBƒDˆ€‡@0„€€€€ˆ€„…D€€€8ˆ€…L0„€€€„ ˆ€„‡@€„ ƒ1ƒDˆ€…D0„€€€€ˆ€„…L€€€8‡>%€…@0„€€€„ €€„…DƒIƒ>ƒBƒD€€…L0„€€€€€€„…@€€€8„€…D0„€€€„ €€„…L€„ ƒ1ƒD€€…@0„€€€€€€„…D€ƒ>‡1 8‡>%€…G0„€€€„ €€„…@€€ƒBƒD€€…D0„€€€€€€„…G€€€8„€…P0„€„ €„ €€„…D€ƒ>ƒ1ƒD‡>%€…G0„€€€€€€„…P€€€8€€…D0„€€€„ €€„…GI€ƒBƒD€€…P0„€„ €€„€„…D€€€8‡>%€…G0„€„€„ €€„…P€€ƒ1ƒD€€…D0„€„€€€€„…G€€€8€€…K0„€„€„ „€„…D€€ƒBƒD€€…G0„€„€€„€„…K€€€8€€…S0„€„€„ „€„…G€€ƒ1ƒD€€…K0„€„€€„€„…S€€€8€€…G0„€„€„ „€„…KI€ƒBƒD€€…S0„€„€€„€„…G€€€8€€…K0„€„€„ „€„…S€ƒ>ƒ1ƒD€€…G0„€€€€„€„…K…I0€€8€€…F0„€€€„ „€„…G€€ƒBƒD€€…B0„€€€€„€„…F€›?€8‡>%€…N0„€€€„ €€„…B…I €ƒ1ƒD€€…F0„€€€€€€„…N€€€8€€…B0„€„ €„ €€„…FƒIƒ:ƒBƒD?%€…N0„€€€€€€„…B€€€8€€…F0„€€€„ €€„…N€›?0ƒ1ƒD€€…B0„€€€€„€„…F…I €€8‡:%€…D0„€„ €„ €€„…B @s€ƒ;ƒBƒA€€‡=0€€€€€€€„€€€€5€€…I0€€€€„ €€„‡=€„ ƒ1ƒA€€…A0„€€€€€€„…I€€€5‡;%€…=0„€€€„ €€„…AƒIƒ;ƒBƒA€€…I0„€€€€€€„…=€€€5„€…A0„€€€„ €€„…I€„ ƒ1ƒA€€…=0„€€€€€€„…A€ƒ;‡1 5‡;%€…D0„€€€„ €€„…=€€ƒBƒA€€…A0„€€€€€€„…D€€€5„€…M0„€„ €„ €€„…A€ƒ;ƒ1ƒA‡;%€…D0„€€€€€€„…M€€€5€€…A0„€€€„ €€„…DƒI€ƒBƒA€€…M0„€„ €€„€„…A€€€5‡;%€…D0„€„€„ €€„…M€€ƒ1ƒA€€…A0„€„€€€€„…D€€€5€€…H0„€„€„ „€„…A€€ƒBƒA€€…D0„€„€€€€„…H€€€5€€…P0„€„€„ €€„…D€€ƒ1ƒA€€…H0„€„€€„€„…P€€€5€€…D0„€„€„ €€„…HƒI€ƒBƒA€€…P0„€„€€€€„…D€€€5€€…H0„€„€„ „€„…P€ƒ;ƒ1ƒA€€…D0„€€€€€€„…H‡I0€€5€€…C0„€€€„ €€„…D€€ƒBƒA€€…?0„€€€€„€„…C€›<€5‡;%€…K0„€€€„ €€„…?‡I €ƒ1ƒA€€…C0„€€€€€€„…K€€€5€€…?0„€„ €„ €€„…CƒIƒ7ƒBƒA<%€…K0„€€€€€€„…?€€€5€€…C0„€€€„ €€„…K€›<0ƒ1ƒA€€…?0„€€€€„€„…C‡I €€5‡7%€…A0„€„ €„ €€„…? @v€ƒ>ƒBƒD€€‡@0„€€€€€€„…D€€€8?%0€…L0„€€€„ €€„‡@€„ ƒ1ƒD€€…D0„€€€€„€„…L€€€8‡>%€…@0„€€€„ €€„…DƒIƒ>ƒBƒD€€…L0„€€€€€€„…@€€€8„€…D0„€€€„ €€„…L€„ ƒ1ƒD€€…@0„€€€€€€„…D€ƒ>‡1 8‡>%€…G0„€€€„ €€„…@€€ƒBƒD€€…D0„€€€€€€„…G€€€8„€…P0„€„ €„ €€„…D€ƒ>ƒ1ƒD‡>%€…G0„€€€€€€„…P€€€8€€…D0„€€€„ €€„…GI€ƒBƒD€€…P0„€„ €€„€„…D€€€8‡>%€…G0„€„€„ €€„…P€€ƒ1ƒD€€…D0„€„€€€€„…G€€€8€€…K0„€„€„ „€„…D€€ƒBƒD€€…G0„€„€€€€„…K€€€8€€…S0„€„€„ €€„…G€€ƒ1ƒD€€…K0„€„€€„€„…S€€€8€€…G0„€„€„ €€„…KI€ƒBƒD€€…S0„€„€€€€„…G€€€8€€…K0„€„€„ „€„…S€›? ƒ1€€€ƒ1„€ˆ €€€€„ ‡K€ˆ ›B€€€ƒ1„€ˆ ˜€€€€„€ˆ ˜€€€„ €€ˆ ˜€„€ƒ1€€ˆ ˜€?% €„ €€˜˜€„€ƒ1€€˜˜€Œ €ƒ1€€˜˜€Œ €„ €€ˆ˜ €„€ƒ1€€˜˜ €Œ €€€€ˆ˜ €Œ €€€€ˆ˜ €œ€„ €€ˆ˜ €œ€ƒ1€€ˆ˜€œ€„ €€ˆ˜€Œ€€€€ˆˆ€œ€€€€ˆˆ€Œ€€€€ˆˆ€Œ€€€ @‡€ƒ;ƒBƒA€€‡=0„€€€€€€„…A€€€5<%0€…I0„€€€„ €€„‡=€„ ƒ1ƒA€€…A0„€€€€„€„…I€€€5‡;%€…=0„€€€„ €€„…AƒIƒ;ƒBƒA€€…I0„€€€€€€„…=€€€5„€…A0„€€€„ €€„…I€„ ƒ1ƒA€€…=0„€€€€€€„…A€ƒ;‡1 5‡;%€…D0„€€€„ €€„…=€€ƒBƒA€€…A0„€€€€€€„…D€€€5„€…M0„€„ €„ €€„…A€ƒ;ƒ1ƒA‡;%€…D0„€€€€€€„…M€€€5€€…A0„€€€„ €€„…DI€ƒBƒA€€…M0„€„ €€„€„…A€€€5‡;%€…D0„€„€„ €€„…M€€ƒ1ƒA€€…A0„€„€€€€„…D€€€5€€…H0„€„€„ „€„…A€€ƒBƒA€€…D0„€„€€€€„…H€€€5€€…P0„€„€„ €€„…D€€ƒ1ƒA€€…H0„€„€€„€„…P€€€5€€…D0„€„€„ €€„…HI€ƒBƒA€€…P0„€„€€€€„…D€€€5€€…H0„€„€„ „€„…P€ƒ;ƒ1ƒA€€…D0„€€€€€€„…HI€€5€€…C0„€€€„ €€„…D€€ƒBƒA€€…?0„a€€€„€„…C€›<€5‡;%€…K0„€ˆ€„ €€„…?ƒIˆƒ1ƒA€€…C0„€ˆ€€€€„…K€Œ €5€€…?0„€™>€„ €€„…C€ŠƒBƒA<%€…K0„aˆ€€ˆ€„…?€ˆ€5ˆ€…C0„€ˆ€„ ˆ€„…KƒIˆƒ1ƒAŒ€…?0„€ˆ€€™>€„…C€ˆ€5Ž%€…A0„€ˆ€„ ˆ€„…? @J€€ƒBƒA‡=)€‡=)„€€€€„€„…A%€€€5I* €…I*„€€€„ „‡=„‡=€€€ƒAA, „…A,„€€€€„I „…I€€€5=- „…=-„€€€„ „A „…AƒI€BƒAI. „…I.„€€€€„= „…=€€€5A/ „…A/„€€€„ „I „…I€€€ƒA=0 „…=0„€€€€„A „…A€€€5D2 „…D2„€€€„ „= „…=€€BƒAA3 „…A3„€€€€„D „…D€€€5M4 „…M4„€€€„ „A „…A€€€ƒAD5 „…D5„€€€€„M „…M€€€5A7 „…A7„€€€„ „D „…DI€BƒAM8 „…M8„€€€€„A „…A€€€5D9 „…D9„€€€„ „M „…M€€€ƒAA: „…A:„€€€€„D „…D€€€5H; „…H;„€€€„ „A „…A€€BƒA…D=„…D=„€€€€„H „…H€€€5P> „…P>„€€€„ „…D„…D€€€ƒAH? „…H?„€€€€„P „…P€€€5D@ „…D@„€€€„ „H „…HI€BƒAPA „…PA„€€€€„D „…D €€€5HC „…HC„€€€„ „P „…P €€€ƒADD „…DD„€€€€„H! „…H!I€€5CE „…CE„€€€„ „D! „…D!€€BƒA?F „…?F„a€€€„C" „…C"ƒI€€5KH „…KH„€€€„ „?" „…?"€€€ƒACI „…CI„€€€€„K# „…K#€€B5?J „…?J„€€€„ „C# „…C#I€€ƒAKK „…KK„€€€€„?# „…?#€€€5CL „…CL„€€€„ „K$ „…K$€€BƒA?N „…?N„€€€€„C$ „…C$I€€5AO „…AO„€€€„ „?% „…?% @ƒBƒC‡?)„‡?)„€€€€„C% „…C%€€€7K* „…K*„€€€„ „‡?„‡?€€€ƒCC, „…C,„€€€€„K „…K€€€7?- „…?-„€€€„ „C „…CƒI€BƒCK. „…K.„€€€€„? „…?€€€7C/ „…C/„€€€„ „K „…K€€€ƒC?0 „…?0„€€€€„C „…C€€€7F2 „…F2„€€€„ „? „…?€€BƒCC3 „…C3„€€€€„F „…F€€€7O4 „…O4„€€€„ „C „…C€€€ƒCF5 „…F5„€€€€„O „…O€€€7C7 „…C7„€€€„ „F „…FI€BƒCO8 „…O8„€€€€„C „…C€€€7F9 „…F9„€€€„ „O „…O€€€ƒCC: „…C:„€€€€„F „…F€€€7J; „…J;„€€€„ „C „…C€€BƒC…F=„…F=„€€€€„J „…J€€€7R> „…R>„€€€„ „…F„…F€€€ƒCJ? „…J?„€€€€„R „…R€€€7F@ „…F@„€€€„ „J „…JI€BƒCRA „…RA„€€€€„F „…F €€€7JC „…JC„€€€„ „R „…R €€€ƒCFD „…FD„€€€€„J! „…J!…I0€€7EE „…EE„€€€„ „F! „…F!€€BƒCAF „…AF„a€€„„E" „…E"ƒI€€‚€„„„€€€„€A" €…A"€€B‚€„€„€€€„€€€„€€€‚€€€€€€€„€€€€I€€‚€€€€€€€„€€€€€€B‚€€€€€€€„ €€€€I€€‚€€€€€€€„0€€€€I€€‚€€€€€€€€€€€€ @Q€€ƒBƒC‡?)„‡?)„€€€€„A% „…A%€€€7K* „…K*„€€€„ „‡?„‡?€€€ƒCC, „…C,„€€€€„K „…K€€€7?- „…?-„€€€„ „C „…CƒI€BƒCK. „…K.„€€€€„? „…?€€€7C/ „…C/„€€€„ „K „…K€€€ƒC?0 „…?0„€€€€„C „…C€€€7F2 „…F2„€€€„ „? „…?€€BƒCC3 „…C3„€€€€„F „…F€€€7O4 „…O4„€€€„ „C „…C€€€ƒCF5 „…F5„€€€€„O „…O€€€7C7 „…C7„€€€„ „F „…FI€BƒCO8 „…O8„€€€€„C „…C€€€7F9 „…F9„€€€„ „O „…O€€€ƒCC: „…C:„€€€€„F „…F€€€7J; „…J;„€€€„ „C „…C€€BƒC…F=„…F=„€€€€„J „…J€€€7R> „…R>„€€€„ „…F„…F€€€ƒCJ? „…J?„€€€€„R „…R€€€7F@ „…F@„€€€„ „J „…JI€BƒCRA „…RA„€€€€„F „…F €€€7JC „…JC„€€€„ „R „…R €€€ƒCFD „…FD„€€€€„J! „…J!…I0€€7EE „…EE„€€€„ „F! „…F!€€BƒCAF „…AF„€€€€„E" „…E"€€€7MH „…MH„€€€„ „A" „…A"…I €€ƒCEI „…EI„€€€€„M# „…M#€€€7AJ „…AJ„€€€„ „E# „…E#ƒI€BƒCMK „…MK„€€€€„A# „…A#€€€7EL „…EL„€€€„ „M$ „…M$€€€ƒCAN „…AN„€€€€„E$ „…E$…I €€7CO „…CO„€€€„ „A% „…A% @à€ƒ;ƒBƒAƒ?€‡=0€€€€€›A€„€€€€5ˆ€…I0€€€€„ ˆ€„‡=€„ ƒ1ƒAˆ€…A0„€€€€ˆƒ?„…I€€€5ˆA0…=0„€€€„ ˆˆ„…AƒIƒ;ƒBƒAˆˆ…I0„€€€€ˆˆ„…=€€€6ˆˆ…A0„€€€„ ˆˆ„…I€„ ƒ1ƒBˆˆ…=0„€€€€ˆˆ„…A€ƒ;‡1 6ˆˆ…D0„€€€„ ˆˆ„…=€€ƒBƒB˜2ˆ…A0„€€€€ˆˆ„…D€€€5ˆˆ…M0„€„ €„ ˆˆ„…A€ƒ;ƒ1ƒAˆˆ…D0„€€€€€ˆ„…M€€€5„˜2…A0„€€€„ „ˆ„…DI€ƒBƒA„ˆ…M0„€„ €€„ˆ„…A€€€5„ˆ…D0„€„€„ „€„…M€€ƒ1ƒA„€…A0„€„€€„„„…D€€€5„€…H0„€„€„ „„„…A€€ƒBƒA›D€…D0„€„€€ˆ„„…H€€€5ˆ€…P0„€„€„ ˆ„„…D€€ƒ1ƒA›B€…H0„€„€€€„„…P€€€5€D0…D0„€„€„ €ˆ„…HI€ƒBƒA€ˆ…P0„€„€€€ˆ„…D€€€5€B0…H0„€„€„ €€„…P€ƒ;ƒ1ƒA›A€…D0„€€€€ˆ€„…H…I0€€5ˆ€…C0„€€€„ ˜r€„…D€€ƒBƒAˆ€…?0„€€€€ˆ€„…C€›<€5ˆA0…K0„€€€„ ˆˆ„…?…I €ƒ1ƒA›?ðˆ…C0„€€€€ˆ˜r„…K€€€5˜bˆ…?0„€„ €„ ˆˆ„…CƒIƒ7ƒBƒAˆˆ…K0„€€€€ˆˆ„…?€€€5ˆ?0ð…C0„€€€„ Œˆ„…K€›<0ƒ1ƒAŒ˜b…?0„€€€€Œˆ„…C…I €€5Œˆ…A0„€„ €„ „ˆ„…? @瀃;ƒBƒA›<ˆ‡=0„€€€€ˆŒ„…A€€€5ˆˆ…I0„€€€„ ˆŒ„‡=€„ ƒ1ƒAˆˆ…A0„€€€€ˆŒ„…I€€€5ˆA0…=0„€€€„ ˆˆ„…AƒIƒ;ƒBƒAˆˆ…I0„€€€€ˆˆ„…=€€€6ˆˆ…A0„€€€„ ˆˆ„…I€„ ƒ1ƒBˆˆ…=0„€€€€ˆˆ„…A€ƒ;‡1 6˜1ˆ…D0„€€€„ ˆˆ„…=€€ƒBƒBˆˆ…A0„€€€€ˆˆ„…D€€€5ˆˆ…M0„€„ €„ ˆˆ„…A€ƒ;ƒ1ƒAˆ˜1…D0„€€€€ˆˆ„…M€€€5ˆˆ…A0„€€€„ ˆˆ„…DI€ƒBƒAˆˆ…M0„€„ €€Œˆ„…A€€€5Œˆ…D0„€„€„ Œˆ„…M€€ƒ1ƒA„ˆ…A0„€„€€„ˆ„…D€€€5„ˆ…H0„€„€„ „Œ„…A€€ƒBƒA„ˆ…D0„€„€€„Œ„…H€€€5„€…P0„€„€„ œ„„…D€€ƒ1ƒAŒ€…H0„€„€€Œ„„…P€€€5Œ€…D0„€„€„ Œ„„…HI€ƒBƒA„€…P0„€„€€„„„…D€€€5„€…H0„€„€„ „„„…P€ƒ;ƒ1ƒAœ€…D0„€€€€Œ„„…HI€€5Œ€…C0„€€€„ Œ„„…D€€ƒBƒA„€…?0„a€€€„„„…CƒI›<€5„€…K0„€ˆ€„ „„„…?€ˆƒ1ƒA„€…C0„€ˆ€€„„„…K€Œ ƒB5„€…?0„€™>€„ „„„…CIŠ€ƒA„€…K0„€ˆ€€„„„…?€ˆ€5„€…C0„€ˆ€„ „„„…K€ˆƒ1ƒA„€…?0„€ˆ€€„„„…CIˆ€5„€…A0„€ˆ€„ „„„…? @€ƒ>ƒBƒDƒ?€‡@0„€€€€›D„„…A€€€8ˆ€…L0„€€€„ ˆ„„‡@€„ ƒ1ƒDˆ€…D0„€€€€ˆ„„…L€€€8ˆ‡?0…@0„€€€„ ˆD0„…DƒIƒ>ƒBƒDˆˆ…L0„€€€€ˆˆ„…@€€€8ˆˆ…D0„€€€„ ˆˆ„…L€„ ƒ1ƒDˆˆ…@0„€€€€ˆˆ„…D€ƒ>‡1 8ˆˆ…G0„€€€„ ˆˆ„…@€€ƒBƒDˆˆ…D0„€€€€œbˆ„…G€€€8Œˆ…P0„€„ €„ Œˆ„…D€ƒ>ƒ1ƒDŒˆ…G0„€€€€Œˆ„…P€€€8Œˆ…D0„€€€„ Œœb„…GI€ƒBƒDŒˆ…P0„€„ €€ŒŒ„…D€€€8Œˆ…G0„€„€„ ŒŒ„…P€€ƒ1ƒDŒˆ…D0„€„€€ŒŒ„…G€€€8Œˆ…K0„€„€„ ŒŒ„…D€€ƒBƒD›Eˆ…G0„€„€€ˆŒ„…K€€€8ˆˆ…S0„€„€„ ˆŒ„…G€€ƒ1ƒD›Gˆ…K0„€„€€ˆŒ„…S€€€8ˆE0…G0„€„€„ ˆˆ„…KI€ƒBƒD˜2ˆ…S0„€„€€ˆˆ„…G€€€8ˆG0…K0„€„€„ ˆˆ„…S€ƒ>ƒ1ƒD›Dˆ…G0„€€€€ˆˆ„…K…I0€€8ˆ˜2…F0„€€€„ ˆˆ„…G€€ƒBƒDˆˆ…B0„€€€€Œˆ„…F€›?€8ŒD0…N0„€€€„ ˆˆ„…B…I €ƒ1ƒD›Bˆ…F0„€€€€ˆˆ„…N€€€8ˆˆ…B0„€„ €„ ˆˆ„…FƒIƒ:ƒBƒDˆŒ…N0„€€€€ˆˆ„…B€€€8ˆB0…F0„€€€„ ˆˆ„…N€›?0ƒ1ƒDˆˆ…B0„€€€€Œˆ„…F…I €€8Œˆ…D0„€„ €„ ˆˆ„…B @ÿ€ƒ>ƒBƒD›Dˆ‡@0„€€€€ˆˆ„…D€€€8ˆˆ…L0„€€€„ ˆˆ„‡@€„ ƒ1ƒDˆŒ…D0„€€€€ˆˆ„…L€€€8ˆD0…@0„€€€„ ˆˆ„…DƒIƒ>ƒBƒDˆˆ…L0„€€€€ˆˆ„…@€€€8ˆˆ…D0„€€€„ ˆˆ„…L€„ ƒ1ƒDˆˆ…@0„€€€€ˆˆ„…D€ƒ>‡1 8ˆˆ…G0„€€€„ ˆˆ„…@€€ƒBƒDˆˆ…D0„€€€€˜ˆ„…G€€€8ˆˆ…P0„€„ €„ Œˆ„…D€ƒ>ƒ1ƒDŒˆ…G0„€€€€Œˆ„…P€€€8Œˆ…D0„€€€„ Œ˜„…GI€ƒBƒDŒˆ…P0„€„ €€Œˆ„…D€€€8ŒŒ…G0„€„€„ Œˆ„…P€€ƒ1ƒDŒŒ…D0„€„€€Œˆ„…G€€€8ŒŒ…K0„€„€„ Œˆ„…D€€ƒBƒDŒŒ…G0„€„€€Œˆ„…K€€€8ŒŒ…S0„€„€„ Œˆ„…G€€ƒ1ƒDŒŒ…K0„€„€€Œˆ„…S€€€8ŒŒ…G0„€„€„ „ˆ„…KI€ƒBƒD„Œ…S0„€„€€„ˆ„…G€€€8€Œ…K0„€„€„ €ˆ„…S€ƒ>ƒ1ƒDK‘Œ…G0„€€€€Œ‘€„…KI€€8Œ‘„…F0„€€€„ Œ‘€„…G€€ƒBƒDŒ‘€…B0„a€€€Œ‘€„…F€›?€8Œ‘K‘…N0„€€€„ „‘ˆ„…BƒI€ƒ1ƒD„‘Œ‘…F0„€€€€„‘ˆ„…N€€€8„‘Œ‘…B0„€„ €„ „‘ˆ„…F€ƒ:ƒBƒD„‘Œ‘…N0„a€€€„‘€„…B€€€8„‘„‘…F0„€€€„ „‘€„…NƒI›?0ƒ1ƒD„‘„‘…B0„€€€€„‘€„…F€€€8„‘„‘…D0„€„ €„ „‘€„…B @6€‡>P‡B@ƒD›PH0›5„€€€€ˆ€˜ …D€€€8ˆJ08$„€€€„ ˆ€˜°„€œ!ƒ1ƒDˆM0›<À€€˜!€€ˆ€œ$@€€˜!€8ˆP0›A 5#€˜!€„ ˆˆœ$@€ƒIœM!‡B=ƒDŒˆ›A  ‡8€˜!€€Œˆœ$`€€˜!€8Œˆ›<À‡<#€˜!€„ Œˆœ$ „€œ!ƒ1ƒDŒˆ›=@‡A#€˜!€€Œˆ˜`„€œK!€8ŒŒ=$ ‡A #€˜!€„ ŒŒ˜@„€˜!‡B;ƒDœbŒ›<`‡<#€˜!€€ŒŒœ$À„€˜!€8ŒŒ›= ‡=#€œ!€„ ŒŒœ$@€€œI!ƒ1ƒDŒŒ›:°‡=€˜!€€ŒŒœ$ €€˜!€8Œœb›A ‡<#€˜!€„ ŒŒœ$`„I˜!‡B9ƒDŒŒ›=@‡=#€œ!€€ŒŒ˜À„€˜!€8ŒŒ<$@‡:#€œ!€„ ŒŒ˜ „€˜!ƒ1ƒDŒŒ›8 `‡A#€œ!€€ŒŒ˜ „€˜!€8ŒŒœ$°‡=#€œ!€„ ŒŒ˜ €€˜!‡B7ƒDŒŒ›6@‡<€œ!€€ŒŒ˜À€€˜!€8ŒŒ9$@‡8 #€œ!€„ ŒŒ˜ €€˜!ƒ1ƒDŒŒ›=°„€œ!€€ŒŒœ$ €€˜!€8ŒŒ›B`‡6#€œ!€„ ŒŒœ$ €I˜!‡B5ƒDŒŒ›F À‡9€œ!€€ŒŒœ$ €€˜!€8ŒŒ›A@‡=#€œ!€„ ŒŒœ$°„€œA!ƒ1ƒDŒŒ›B ‡B#€˜!€€ŒŒ˜`„…I0˜!€8ŒŒB$ ‡F #€˜!€„ ŒŒ˜À„€˜!‡B3ƒDŒŒ›C`‡A#€˜!€€ŒŒœ$@„€œ?!€8ŒŒ›D ‡B#€˜!€„ ŒŒœ$°€…I ˜!ƒ1ƒDŒŒ›A@‡B€˜!€€ŒŒœ$À€€˜!€8ŒŒ›H ‡C#€œ!€„ ŒŒœ$°„ƒIœ=!‡B1ƒDŒŒ›D`‡D#€˜!€€ŒŒ˜@„€˜!€8ŒŒC$À‡A#€˜!€„ ŒŒ˜ „€œ;!ƒ1ƒDŒŒ›? °‡H#€˜!€€ŒŒ˜ „…I ˜!€8ŒŒœ$ ‡D#€œ!€„ ŒŒ˜`€ @þ€‡>:‡B0ƒDD)€›5‡C$€€€€ˆ€˜ €€€€8ˆ€8$ƒ? €€€„ ˆ€˜°€€œ!ƒ1ƒDˆ€›<À„$€˜!€€ˆ€œ$@€€˜!€8ˆD›A ‡5#€˜!€„ ˆˆœ$@€€œ7!‡B-ƒDŒˆ›A  ‡8€˜!€€Œˆœ$`€€˜!€8Œˆ›<À‡<#€˜!€„ Œˆœ$ „€œ!ƒ1ƒDŒˆ›=@‡A#€˜!€€Œˆ˜`„€œ5!€8ŒŒ=$ ‡A #€˜!€„ ŒŒ˜@„€˜!‡B+ƒDœŒ›<`‡<#€˜!€€ŒŒœ$À„€˜!€8ŒŒ›= ‡=#€œ!€„ ŒŒœ$@€€œ3!ƒ1ƒDŒŒ›:°‡=€˜!€€ŒŒœ$ €€˜!€8Œœ›A ‡<#€˜!€„ ŒŒœ$`„€˜!‡B)ƒDŒŒ›=@‡=#€œ!€€ŒŒ˜À„€˜!€8ŒŒ<$@‡:#€œ!€„ ŒŒ˜ „€˜!ƒ1ƒDŒŒ›8 `‡A#€œ!€€ŒŒ˜ „€˜!€8ŒŒœ$°‡=#€œ!€„ ŒŒ˜ €€˜!‡B'ƒDŒŒ›6@‡<€œ!€€ŒŒ˜À€€˜!€8ŒŒ9$@‡8 #€œ!€„ ŒŒ˜ €€˜!ƒ1ƒDŒŒ›=°„€œ!€€ŒŒœ$ €€˜!€8ŒŒ›B`‡6#€œ!€„ ŒŒœ$ €€˜!‡B%ƒDŒŒ›F À‡9€œ!€€ŒŒœ$ €€˜!€8ŒŒ›A@‡=#€œ!€„ ŒŒœ$°„€œ+!ƒ1ƒDŒŒ›B ‡B#€˜!€€ŒŒ˜`„€˜!€8ŒŒB$ ‡F #€˜!€„ ŒŒ˜À„€˜!‡B#ƒDŒŒ›C`‡A#€˜!€€ŒŒœ$@„€œ)!€8ŒŒ›D ‡B#€˜!€„ ŒŒœ$°€€˜!ƒ1ƒDŒŒ›A@‡B€˜!€€€Œœ$À€€˜!€8€Œ›H ‡C#€œ!€„ €Œœ$°„€œ(!‡B!ƒD€Œ›D`‡D#€˜!€€€Œ˜@„€˜!€8€ŒC$À‡A#€˜!€„ €€˜ „€œ&!ƒ1ƒD€€›? °‡H#€˜!€€€€˜ „€˜!€8€€œ$ ‡D#€œ!€„ €€˜`€ @€ƒ;ƒBƒA›HŒ‘‡=0„€€€€ˆˆ„…D€€€5ˆŒ‘…I0„€€€„ ˆˆ„‡=€„ ƒ1ƒAˆŒ‘…A0„€€€€ˆˆ„…I€€€5ˆH0…=0„€€€„ ˆˆ„…AƒIƒ;ƒBƒAˆˆ…I0„€€€€ˆˆ„…=€€€6ˆˆ…A0„€€€„ ˆˆ„…I€„ ƒ1ƒBˆˆ…=0„€€€€ˆˆ„…A€ƒ;‡1 6˜1ˆ…D0„€€€„ ˆˆ„…=€€ƒBƒBˆˆ…A0„€€€€ˆˆ„…D€€€5ˆˆ…M0„€„ €„ ˆˆ„…A€ƒ;ƒ1ƒAˆ˜1…D0„€€€€ˆˆ„…M€€€5ˆˆ…A0„€€€„ ˆˆ„…DI€ƒBƒAˆˆ…M0„€„ €€Œˆ„…A€€€5Œˆ…D0„€„€„ Œˆ„…M€€ƒ1ƒA„ˆ…A0„€„€€„ˆ„…D€€€5„ˆ…H0„€„€„ „Œ„…A€€ƒBƒAGˆ…D0„€„€€ŒŒ„…H€€€5Œ€…P0„€„€„ Œ„„…D€€ƒ1ƒAŒ€…H0„€„€€Œ„„…P€€€5ŒG0…D0„€„€„ ŒŒ„…HI€ƒBƒAŒˆ…P0„€„€€ŒŒ„…D€€€5Œˆ…H0„€„€„ ŒŒ„…P€ƒ;ƒ1ƒAŒˆ…D0„€€€€ŒŒ„…H…I0€€5Œˆ…C0„€€€„ ŒŒ„…D€€ƒBƒADˆ…?0„€€€€ŒŒ„…C€›<€5Œˆ…K0„€€€„ ŒŒ„…?…I €ƒ1ƒAŒˆ…C0„€€€€ŒŒ„…K€€€5ŒD0…?0„€„ €„ ŒŒ„…CƒIƒ7ƒBƒAŒˆ…K0„€€€€ŒŒ„…?€€€5Œˆ…C0„€€€„ ŒŒ„…K€›<0ƒ1ƒAŒˆ…?0„€€€€ŒŒ„…C…I €€5Œˆ…A0„€„ €„ ŒŒ„…? @ñ€ƒ;ƒBƒA›Hˆ‡=0„€€€€ˆŒ„…A€€€5ˆˆ…I0„€€€„ ˆŒ„‡=€„ ƒ1ƒAˆˆ…A0„€€€€ˆŒ„…I€€€5ˆH0…=0„€€€„ ˆˆ„…AƒIƒ;ƒBƒAˆˆ…I0„€€€€ˆˆ„…=€€€6ˆˆ…A0„€€€„ ˆˆ„…I€„ ƒ1ƒBˆˆ…=0„€€€€ˆˆ„…A€ƒ;‡1 6˜1ˆ…D0„€€€„ ˆˆ„…=€€ƒBƒBˆˆ…A0„€€€€ˆˆ„…D€€€5ˆˆ…M0„€„ €„ ˆˆ„…A€ƒ;ƒ1ƒAˆ˜1…D0„€€€€ˆˆ„…M€€€5ˆˆ…A0„€€€„ ˆˆ„…DI€ƒBƒAˆˆ…M0„€„ €€Œˆ„…A€€€5Œˆ…D0„€„€„ Œˆ„…M€€ƒ1ƒA„ˆ…A0„€„€€„ˆ„…D€€€5„ˆ…H0„€„€„ „Œ„…A€€ƒBƒA„ˆ…D0„€„€€„Œ„…H€€€5„€…P0„€„€„ „„„…D€€ƒ1ƒA„€…H0„€„€€„„„…P€€€5„€…D0„€„€„ „„„…HI€ƒBƒA„€…P0„€„€€„„„…D€€€5„€…H0„€„€„ „„„…P€ƒ;ƒ1ƒA„€…D0„€€€€„„„…HI€€5„€…C0„€€€„ „„„…D€€ƒBƒA„€…?0„a€€€„„„…CƒI›<€5„€…K0„€ˆ€„ „„„…?€ˆƒ1ƒA„€…C0„€ˆ€€„„„…K€Œ ƒB5‡H€…?0„€™>€„ „„„…CIŠ€ƒAM0€…K0„€ˆ€€„„„…?€ˆ€5H€…C0„€ˆ€„ „„„…K€ˆƒ1ƒAK‡H0…?0„€ˆ€€„„„…CIˆ€5HM00…A0„€ˆ€„ „„„…? @/€ƒ>‡BPƒD›GH0‡@0„€€€€ˆ„„…A€€€8ˆK0…L0„€€€„ ˆ„„‡@€„ ƒ1ƒDˆH0…D0„€€€€ˆ„„…L€€€8ˆG0…@0„€€€„ ˆˆ„…DƒIƒ>‡BMƒDˆˆ…L0„€€€€ˆˆ„…@€€€8ˆˆ…D0„€€€„ ˆˆ„…L€„ ƒ1ƒDˆˆ…@0„€€€€ˆˆ„…D€ƒ>‡1 8ˆˆ…G0„€€€„ ˆˆ„…@€€‡BKƒDˆˆ…D0„€€€€œbˆ„…G€€€8Œˆ…P0„€„ €„ Œˆ„…D€ƒ>ƒ1ƒDŒˆ…G0„€€€€Œˆ„…P€€€8Œˆ…D0„€€€„ Œœb„…GI€‡BIƒDŒˆ…P0„€„ €€ŒŒ„…D€€€8Œˆ…G0„€„€„ ŒŒ„…P€€ƒ1ƒDŒˆ…D0„€„€€ŒŒ„…G€€€8Œˆ…K0„€„€„ ŒŒ„…D€€‡BGƒDŒˆ…G0„€„€€ŒŒ„…K€€€8Œˆ…S0„€„€„ ŒŒ„…G€€ƒ1ƒDŒˆ…K0„€„€€ŒŒ„…S€€€8Œˆ…G0„€„€„ ŒŒ„…KI€‡BEƒDŒˆ…S0„€„€€ŒŒ„…G€€€8Œˆ…K0„€„€„ ŒŒ„…S€ƒ>ƒ1ƒDŒˆ…G0„€€€€ŒŒ„…K…I0€€8Œˆ…F0„€€€„ ŒŒ„…G€€‡BCƒDŒˆ…B0„€€€€ŒŒ„…F€›?€8Œˆ…N0„€€€„ ŒŒ„…B…I €ƒ1ƒDŒˆ…F0„€€€€ŒŒ„…N€€€8›D0ˆ…B0„€„ €„ €Œ„…FƒIƒ:‡BAƒD‹Gˆ…N0„€€€€€Œ„…B€€€8‹Hˆ…F0„€€€„ €Œ„…N€›?0ƒ1ƒD‹JD00…B0„€€€€€€„…F…I €€8‹MG0…D0„€„ €„ €€„…B @6˜>%‡B ƒDD)€›5‡C$€€€€ˆ€˜ €€€€8ˆ€8$ƒ? €€€„ ˆ€˜°€€œ!ƒ1ƒDˆ€›<À„$€˜!€€ˆ€œ$@€€˜!€8ˆD›A ‡5#€˜!€„ ˆˆœ$@€€œ"!‡BƒDŒˆ›A  ‡8€˜!€€Œˆœ$`€€˜!€8Œˆ›<À‡<#€˜!€„ Œˆœ$ „€œ!ƒ1ƒDŒˆ›=@‡A#€˜!€€Œˆ˜`„€œ !€8ŒŒ=$ ‡A #€˜!€„ ŒŒ˜@„€˜!‡BƒDœŒ›<`‡<#€˜!€€ŒŒœ$À„€˜!€8ŒŒ›= ‡=#€œ!€„ ŒŒœ$@€€œ!ƒ1ƒDŒŒ›:°‡=€˜!€€ŒŒœ$ €€˜!€8Œœ›A ‡<#€˜!€„ ŒŒœ$`„€˜!‡BƒDŒŒ›=@‡=#€œ!€€ŒŒ˜À„€˜!€8ŒŒ<$@‡:#€œ!€„ ŒŒ˜ „€˜!ƒ1ƒDŒŒ›8 `‡A#€œ!€€ŒŒ˜ „€˜!€8ŒŒœ$°‡=#€œ!€„ ŒŒ˜ €€˜!‡BƒDŒŒ›6@‡<€œ!€€ŒŒ˜À€€˜!€8ŒŒ9$@‡8 #€œ!€„ ŒŒ˜ €€˜!ƒ1ƒDŒŒ›=°„€œ!€€ŒŒœ$ €€˜!€8ŒŒ›B`‡6#€œ!€„ ŒŒœ$ €€˜!‡BƒDŒŒ›F À‡9€œ!€€ŒŒœ$ €€˜!€8ŒŒ›A@‡=#€œ!€„ ŒŒœ$°„€œ!ƒ1ƒDŒŒ›B ‡B#€˜!€€ŒŒ˜`„€˜!€8ŒŒB$ ‡F #€˜!€„ ŒŒ˜À„€˜!‡BƒDŒŒ›C`‡A#€˜!€€ŒŒœ$@„€œ!€8ŒŒ›D ‡B#€˜!€„ ŒŒœ$°€€˜!ƒ1ƒDŒŒ›A@‡B€˜!€€€Œœ$À€€˜!€8€Œ›H ‡C#€œ!€„ €Œœ$°„€œ!‡BƒD€Œ›D`‡D#€˜!€€€Œ˜@„€˜!€8€ŒC$À‡A#€˜!I„ €Iÿ˜ „‡Iœ!IуDƒ1IÒ›? °‡H#…I#˜!I(Ñ€€I-Ò˜ „…I2˜!I7Ñ8€I<Òœ$ ‡D#…IAœ!IFÑ„ €IKÒ˜`  @ó™I›B&˜¨ƒ6ƒ€€`o€€€€€€€š€€€€€€€Š€€€€€€€Š€€€B…ú€€Š€€€€€€€Š€€€…6ú…ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€…Bð…ð€€Š€€€€€€€Š€‰B€6…ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€…Bð…ð€€Š€€€€€€€Š€€€6…ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€B…ð€€Š€€€BÒ˜€€Š„‰B€‡6ð‡ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€…Bð…ð€€Š€€€€€€€Š€‰B€…6ð…ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€…Bð…ð€€Š€€€€€€€Š€€€…6ð…ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€™B …ð€€Š€€€€€€€Š€‰B€…6ð…ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€…Bð…ð€€Š€€€€€€€Š€€€™6 …ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€B…ð€€Š€€€BÒ˜€€Š€‰B€‡6ð‡ð€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€B…ð€€Š€€€€€€€Š @€›B&€ƒ6‡ð€€š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€B…ú€€š €€€€€€€Š€€€…6ú…ð€€Š€€€€€€€Š€€€€€€€š €€€€€€€Š€€€…Bð…ð€€Š€€€€€€€Š€‹B€6…ð€€š €€€€€€€Š€€€€€€€Š€€€€€€€Š€€€…Bð…ð€€š €€€€€€€Š€€€6…ð€€Š€€€€€€€Š€€€€€€€š €€€€€€€Š€€€B…ð€€Š€€€BÒ˜€€Š€‹B€‡6ð‡ð€€š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€€€€€š€€€€€€€Š€€€…Bð…ð€€Š€€€€€€€Š€‹B€…6ð…ð€€š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€…Bð…ð€€š€€€€€€€Š€€€…6ð…ð€€Š€€€€€€€Š€€€€€€€š€€€€€€€Š€€€™B …ð€€Š€€€€€€€Š€‹B€…6ð…ð€€š€€€€€€€Š€€€€€€€Š€€€€€€€Š€€€…Bð…ð€€š€€€€€€€Š€€€™6 …ð€€Š€€€€€€€Š€‹B€B…ð€€š€€€BÒ˜€€Š€€€‡6ð‡ð€€Š€€€€€€€ŠƒI€€@…ð€€†ð€€€€€€€„ð€€€€€€€„ð€€€€€€€„ð€‹B€…Bð…ð€€„ð€€€€€€€„ðƒI€€€€€€„ð€€€€€€€„ð @)€›B&ƒ1ƒ6‡ð€€›Q!€€€€€€€˜ €€€€€€€˜ €€€€€€€˜ €€€B…úƒNƒI˜ €€€€€€€˜ €€€…6ú…ð€€˜ €€€€€€€˜ ƒIƒ1€€€aaQ0"€€€€€€€˜ €€€…Bð…ð€€˜ €€€€€€€˜ €‹B€@…ð„0„0˜ €€€€€€€˜ €€€€€€€˜ €€€€€€€˜ ƒ1€€…Bð…ðaaQ #€€€€€€€˜ €€€@…ð€€˜ €€€€€€€˜ €€€…Bð…ð„ „ ˜ €€€€€€€˜ €€€@…ð€€˜ €€€BÒ˜€€˜ 1ƒI€‡6ð‡ðaaQ$€€€€€€€˜ €€€€€€€˜ €€€€€€€˜ €€€€€„„˜ €€€€€€€˜ €€€…Bð…ð€€˜ €€€€€€€˜ 1‹B€…6ð…ðaaQ&€€€€€€€˜ €€€€€€€˜ €€€€€€€˜ …1 €€…Bð…ð„„˜ €€€€€€€˜ €€€…6ð…ð€€˜ €€€€€€€˜ ƒIƒ1€€€aaQ'€€€€€€€˜ €€€™B …ð€€˜ €€€€€€€˜ €‹B€…6ð…ð„„˜ €€€€€€€˜ €€€€€€€˜ €€€€€€€˜ ƒ1€€…Bð…ðaaQ(€€€€€€€˜ €€€™6 …ð€€˜ €€€€€€€˜ €‰B€B…ð„„˜ €€€BÒ˜€€˜ €€€‡6ð‡ð€€˜ €€€€€€€˜ ƒIƒ1€@…ðaa„€€€€€€€€€€€€€€€€€€€€€€€€€€€…Bð…ð€€€€€€€€€€€€€€€€€€€€€€€€€€€ @ ƒ1›B&€ƒ6‡ð€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€B…úƒNƒQ€€€€€€€€€€€€…6ú…ð€€€€€€€€€€€ƒIƒ1€€€aa€€€€€€€€€€€€…Bð…ð€€€€€€€€€€€€‹B€@…ð„0„0€€€€€€€€€€€€€€€€€€€€€€€€€ƒ1€€…Bð…ðaa€€€€€€€€€€€€@…ð€€€€€€€€€€€€€€…Bð…ð„ „ €€€€€€€€€€€€@…ð€€€€€€BÒ˜€€€1ƒI€‡6ð‡ðaa€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€„„€€€€€€€€€€€€…Bð…ð€€€€€€€€€€€1‹B€…6ð…ðaa€€€€€€€€€€€€€€€€€€€€€€€€€…1 €€…Bð…ðƒNƒP€€€€€€€€€€‰B€…6ð…ð€€€€€€€€€€€ƒIƒ1€€€aa€€€€€€€€€€€€™B …ð€€€€€€€€€€€€‹B€…6ð…ð„0„0€€€€€€€€€€€€€€€€€€€€€€€€€ƒ1€€…Bð…ðaa€€€€€€€€€€€€€€€€€€€€€€€€€€‰B€E…!ð„ „ €€€€€€€€€€€€€€€€€€€€€€€€€ƒIƒ1€…Gð…#ðaa€€€€€€€€€€€€€€€€€€€€€€€€€€‹B€A…ð€€€€€€€€€€€€€€€€€€€€€€€€€€€ @´ƒ1›B&€ƒ6‡ð€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€B…úƒNƒQƒU€€€€€€€€€€€…6ú…ð€€€€€€€€€€€ƒIƒ1€€€aaa€€€€€€€€€€€…Bð…ð€€€€€€€€€€€€‹B€@…ð„0„0„0€€€€€€€€€€€€€€€€€€€€€€€€ƒ1€€…Bð…ðaaa€€€€€€€€€€€@…ð€€€€€€€€€€€€€€…Bð…ð„ „ „ €€€€€€€€€€€@…ð€€€€€€BÒ˜€€€1ƒI€‡6ð‡ðaaa€€€€€€€€€€€€€€€€€€€€€€€€€€€€€„„„€€€€€€€€€€€…Bð…ð€€€€€€€€€€€1‹B€…6ð…ðaaa€€€€€€€€€€€€€€€€€€€€€€€€…1 €€…Bð…ðƒNƒPƒT€€€€€€€€€‰B€…6ð…ð€€€€€€€€€€€ƒIƒ1€€€aaa€€€€€€€€€‹B€™B …ð€€€€€€€€€€€€‰B€…6ð…ð„0„0„0€€€€€€€€€€€€€€€€€€€€€€€€ƒ1€€…Bð…ðaaa€€€€€€€€ƒI€€€€€€€€€€€€€€€€‰B€E…!ð„ „ „ €€€€€€€€€€€€€€€€€€€€€€€€Iƒ1€…Gð…#ðaaa€€€€€€€€€€€€€€€€€€€€€€€€€‹B€I…%ð€€€€€€€€€€€I€€€€€€€€€€€€€€€ @[ƒ1›B&›B ƒ6‡ð€€€€€œÿ€€€€€€€‹E€€€€€€€‰B€€€€€€€‹IB…*úƒNƒIƒQ€€‰E€€€€€€€‹B…6ú…ð€€€€€‰I€€€€€ƒIƒ1‹E€€aaa€€‰B€€€€€€€‹I…Bð…*ð€€€€€‰E€€€€€€‹B‹B@…(ð„0„0„0€€‰I€€€€€€€‹E€€€€€€€‰B€€€€€ƒ1€‹I…Bð…*ðaaa€€‰E€€€€€€€‹B@…(ð€€€€€‰I€€€€€€€‹E…Bð…*ð„ „ „ €€‰B€€€€€€€‹I@…(ð€€€€€‰EBÒ˜€€€1ƒI‹B‡6ð‡ðaaa€€‰I€€€€€€€‹E€€€€€€€‰B€€€€€€€‹I€€„„„€€‰E€€€€€€€‹B…Bð…*ð€€€€€‰I€€€€€1‹B‹E…6ð…ðaaa€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€…1 €‹B…Bð…*ð„„„€€‰I€€€€€€€‹E…6ð…ð€€€€€‰B€€€€€ƒIƒ1‹I€€aaa€€‰E€€€€€€€‹B™B …*ð€€€€€‰I€€€€€€‹B‹E…6ð…ð„„„€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€ƒ1€‹B…Bð…*ðaaa€€‰I€€€€€€€‹E™6 …ð€€€€€‰B€€€€€€‰B‹IB…*ð„„„€€‰EBÒ˜€€€€€‹B‡6ð‡ð€€€€€‰I€€€€€ƒIƒ1‹E@…(ðaaa€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€€€‹B…Bð…*ð€€€€€‰I€€€€€€€‹E€€€€€€€‰B€€€€€ @Sƒ1›B&‹Jƒ6‡ð€€€€€‰E€€€€€€€‹B€€€€€€€‰J€€€€€€€‹EB…*úƒNƒQƒV€€‰B€€€€€€€‹J…6ú…ð€€€€€‰E€€€€€ƒIƒ1‹B€€aaa€€‰J€€€€€€€‹E…Bð…*ð€€€€€‰B€€€€€€‹B‹J@…(ð„0„0„0€€‰E€€€€€€€‹B€€€€€€€‰J€€€€€ƒ1€‹E…Bð…*ðaaa€€‰B€€€€€€€‹J@…(ð€€€€€‰E€€€€€€€‹B…Bð…*ð„ „ „ €€‰J€€€€€€€‹E@…(ð€€€€€‰BBÒ˜€€€1ƒI‹J‡6ð‡ðaaa€€‰E€€€€€€€‹B€€€€€€€‰J€€€€€€€‹E€€„„„€€‰B€€€€€€€‹J…Bð…*ð€€€€€‰E€€€€€1‹B‹A…5ð…ðaaa€€‰J€€€€€€€‹D€€€€€€€‰A€€€€€…1 €‹I…Að…)ðƒMƒPƒU€€‰D€€€€€€‰B‹A…5ð…ð€€€€€‰I€€€€€ƒIƒ1‹D€€aaa€€‰A€€€€€€€‹I™A …)ð€€€€€‰D€€€€€€‹B‹A…5ð…ð„0„0„0€€‰I€€€€€€€‹D€€€€€€€‰A€€€€€ƒ1€‹I…Að…)ðaaa€€‰D€€€€€€€‹A€€€€€€€‰I€€€€€€‰B‹DD…,ð„ „ „ €€‰A€€€€€€€‹I€€€€€€€‰D€€€€€ƒIƒ1‹A…Gð…/ðaaa€€‰I€€€€€€€‹D€€€€€€€‰A€€€€€€‹B‹IA…)ð„„„€€‰D€€€€€€€‹A€€€€€€€‰I€€€€€ @Yƒ1›B&‹Eƒ6‡ð€€€€€‰A€€€€€€€‹I€€€€€€€‰E€€€€€€€‹BB…*úƒNƒQƒU€€‰I€€€€€€€‹E…6ú…ð€€€€€‰B€€€€€ƒIƒ1‹I€€aaa€€‰E€€€€€€€‹B…Bð…*ð€€€€€‰I€€€€€€‹B‹E@…(ð„0„0„0€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€ƒ1€‹B…Bð…*ðaaa€€‰I€€€€€€€‹E@…(ð€€€€€‰B€€€€€€€‹I…Bð…*ð„ „ „ €€‰E€€€€€€€‹B@…(ð€€€€€‰IBÒ˜€€€1ƒI‹E‡6ð‡ðaaa€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€€€‹B€€„„„€€‰I€€€€€€€‹E…Bð…*ð€€€€€‰B€€€€€1‹B‹I…6ð…ðaaa€€‰E€€€€€€€‹B€€€€€€€‰I€€€€€…1 €‹E…Bð…*ð„„„€€‰B€€€€€€€‹I…6ð…ð€€€€€‰E€€€€€ƒIƒ1‹B€€aaa€€‰I€€€€€€€‹E™B …*ð€€€€€‰B€€€€€€‹B‹I…6ð…ð„„„€€‰E€€€€€€€‹B€€€€€€€‰I€€€€€ƒ1€‹E…Bð…*ðaaa€€‰B€€€€€€€‹I™6 …ð€€€€€‰E€€€€€€‰B‹BB…*ð„„„€€‰IBÒ˜€€€€€‹E‡6ð‡ð€€€€€‰B€€€€€ƒIƒ1‹I@…(ðaaa€€‰E€€€€€€€‹B€€€€€€€‰I€€€€€€€‹E…Bð…*ð€€€€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€ @_ƒ1›B&‹>ƒ6‡ð€€€€€‰I€€€€€€€‹B€€€€€€€‰>€€€€€€€‹GB…*úƒJƒNƒS€€‰B€€€€€€€‹>…6ú…ð€€€€€‰G€€€€€ƒIƒ1‹B€€aaa€€‰>€€€€€€€‹G…Bð…*ð€€€€€‰B€€€€€€‹B‹>@…(ð„0„0„0€€‰G€€€€€€€‹B€€€€€€€‰>€€€€€ƒ1€‹G…Bð…*ðaaa€€‰B€€€€€€€‹>@…(ð€€€€€‰G€€€€€€€‹B…Bð…*ð„ „ „ €€‰>€€€€€€€‹G@…(ð€€€€€‰BBÒ˜€€€1ƒI‹>‡6ð‡ðaaa€€‰G€€€€€€€‹B€€€€€€€‰>€€€€€€€‹G€€„0„0„0€€‰B€€€€€€€‹>…Bð…*ð€€€€€‰G€€€€€1‹B‹A…5ð…ðƒIƒMƒQ€€‰>€€€€€€€‹E€€€€€€€‰A€€€€€…1 €‹=…Að…)ð€€€€€‰E€€aaa€‰B‹A…5ð…ð„0„0„0€€‰=€€aaaƒIƒ1‹E€€€€€€€‰A€€€€€€€‹=™A …)ð€€€€€‰E€€€€€€‹B‹A…5ð…ðƒIƒMƒP€€‰=€€€€€€€‹D€€€€€€€‰A€€€€€ƒ1€‹=…Að…)ð€€€€€‰D€€aaa€€‹A€€„ „ „ €€‰=€€aaa€‰B‹DD…,ð„0„0„0€€‰A€€€€€€€‹=€€€€€€€‰D€€€€€ƒIƒ1‹A…Gð…/ð€€€€€‰=€€€€€€€‹D€€aaa€€‰A€€€€€€‹B‹=I…1ð‚‚‚€€‰D€€€€€€€‹A€€€€€€€‰=€€€€€ @q›1›B&‹>ƒ6‡*ð€€€€€‰I€€€€€€€‹B€€€€€€€‰>€€€€€€€‹GB…6úƒNƒSƒV€€‰B€€€€€€€‹>…6ú…*ð€€€€€‰G€€€€€ƒIƒ1‹B€€aaa€€‰>€€€€€€€‹G…Bð…6ð€€€€€‰B€€€€€€‹B‹>@…4ð„0„0„0€€‰G€€€€€€€‹B€€€€€€€‰>€€€€€ƒ1€‹G…Bð…6ðaaa€€‰B€€€€€€€‹J@…4ð€€€€€‰G€€€€€€€‹N…Bð…6ð„ „ „ €€‰J€€€€€€€‹S@…4ð€€€€€‰NBÒ˜€€€1ƒI‹V‡6ð‡*ðaaa€€‰S€€€€€€€‹S€€€€€€€‰V€€€€€€€‹N€€„0„0„0€€‰S€€€€€€€‹J…Bð…6ð€€€€€‰N€€€€€1‹B‹I…5ð…)ðƒMƒQƒU€€‰J€€€€€€€‹M€€€€€€€‰I€€€€€…1 €‹P…Að…5ð€€€€€‰M€€aaa€‰B‹U…5ð…)ð„0„0„0€€‰P€€aaaƒIƒ1‹Y€€€€€€€‰U€€€€€€€‹U™A …5ð€€€€€‰Y€€€€€€‹B‹P…5ð…)ðƒMƒPƒU€€‰U€€€€€€€‹U€€€€€€€‰P€€€€€ƒ1€‹Y…Að…5ð€€€€€‰U€€aaa€€‹\€€„0„0„0€€‰Y€€aaa€‰B‹YD…8ðƒPƒUƒY€€‰\€€€€€€€‹U€€€€€€€‰Y€€€€€ƒIƒ1‹P…Gð…;ð€€€€€‰U€€€€€aaaaaaaa€€€€€€€€‡I‹B‹IƒI…=ðƒUƒYƒ\…I#€‰M€€€€€…I2€‹D€€€€€…IA€‰I€€€€€ @\ƒ1›B&‹Eƒ6‡*ð€€€€€‰A€€€€€€€‹I€€aaa€€‰E€€€€€€€‹BB…6úƒNƒQƒU€€‰I€€€€€€€‹E…6ú…*ð€€€€€‰B€€€€€ƒIƒ1‹I€€aaa€€‰E€€€€€€€‹B…Bð…6ð€€€€€‰I€€€€€€‹B‹E@…4ð„0„0„0€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€ƒ1€‹B…Bð…6ðaaa€€‰I€€€€€€€‹E@…4ð€€€€€‰B€€€€€€€‹I…Bð…6ð„ „ „ €€‰E€€€€€€€‹B@…4ð€€€€€‰IBÒ˜€€€1ƒI‹E‡6ð‡*ðaaa€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€€€‹B€€„„„€€‰I€€€€€€€‹E…Bð…6ð€€€€€‰B€€€€€1‹B‹I…6ð…*ðaaa€€‰E€€€€€€€‹B€€€€€€€‰I€€€€€…1 €‹E…Bð…6ð„„„€€‰B€€€€€€€‹I…6ð…*ð€€€€€‰E€€€€€ƒIƒ1‹B€€aaa€€‰I€€€€€€€‹E™B …6ð€€€€€‰B€€€€€€‹B‹I…6ð…*ð„„„€€‰E€€€€€€€‹B€€€€€€€‰I€€€€€ƒ1€‹E…Bð…6ðaaa€€‰B€€€€€€€‹I™6 …*ð€€€€€‰E€€€€€€‰B‹BB…6ð„„„€€‰IBÒ˜€€€€€‹E‡6ð‡*ð€€€€€‰B€€€€€ƒIƒ1‹I@…4ðaaa€€‰E€€€€€€€‹B€€€€€€€‰I€€€€€€€‹E…Bð…6ð€€€€€‰B€€€€€€€‹I€€€€€€€‰E€€€€€ @Sƒ1›B&‹Bƒ6‡*ð€€€€€‰I€€€€€€€‹E€€€€€€€‰B€€€€€€€‹JB…6úƒNƒQƒV€€‰E€€€€€€€‹B…6ú…*ð€€€€€‰J€€€€€ƒIƒ1‹E€€aaa€€‰B€€€€€€€‹J…Bð…6ð€€€€€‰E€€€€€€‹B‹B@…4ð„0„0„0€€‰J€€€€€€€‹E€€€€€€€‰B€€€€€ƒ1€‹J…Bð…6ðaaa€€‰E€€€€€€€‹B@…4ð€€€€€‰J€€€€€€€‹E…Bð…6ð„ „ „ €€‰B€€€€€€€‹J@…4ð€€€€€‰EBÒ˜€€€1ƒI‹B‡6ð‡*ðaaa€€‰J€€€€€€€‹E€€€€€€€‰B€€€€€€€‹J€€„„„€€‰E€€€€€€€‹B…Bð…6ð€€€€€‰J€€€€€1‹B‹E…5ð…)ðaaa€€‰B€€€€€€€‹J€€€€€€€‰E€€€€€…1 €‹D…Að…5ðƒMƒPƒU€€‰J€€€€€€‰B‹I…5ð…)ð€€€€€‰D€€€€€ƒIƒ1‹M€€aaa€€‰I€€€€€€€‹D™A …5ð€€€€€‰M€€€€€€‹B‹I…5ð…)ð„0„0„0€€‰D€€€€€€€‹M€€€€€€€‰I€€€€€ƒ1€‹D…Að…5ðaaa€€‰M€€€€€€€‹I€€€€€€€‰D€€€€€€‰B‹MD…8ð„ „ „ €€‰I€€€€€€€‹D€€€€€€€‰M€€€€€ƒIƒ1‹I…Gð…;ðaaa€€‰D€€€€€€€‹M€€€€€€€‰I€€€€€€‹B‹DA…5ð„„„€€‰M€€€€€€€‹I€€€€€€€‰D€€€€€ @Yƒ1›B&‹Nƒ6‡*ð€€€€€‰I€€€€€€€‹E€€€€€€€‰N€€€€€€€‹IB…6úƒNƒQƒU€€‰E€€€€€€€‹N…6ú…*ð€€€€€‰I€€€€€ƒIƒ1‹E€€aaa€€‰N€€€€€€€‹I…Bð…6ð€€€€€‰E€€€€€€‹B‹N@…4ð„0„0„0€€‰I€€€€€€€‹E€€€€€€€‰N€€€€€ƒ1€‹I…Bð…6ðaaa€€‰E€€€€€€€‹N@…4ð€€€€€‰I€€€€€€€‹E…Bð…6ð„ „ „ €€‰N€€€€€€€‹I@…4ð€€€€€‰EBÒ˜€€€1ƒI‹N‡6ð‡*ðaaa€€‰I€€€€€€€‹E€€€€€€€‰N€€€€€€€‹I€€„„„€€‰E€€€€€€€‹N…Bð…6ð€€€€€‰I€€€€€1‹B‹E…6ð…*ðaaa€€‰N€€€€€€€‹I€€€€€€€‰E€€€€€…1 €‹N…Bð…6ð„„„€€‰I€€€€€€€‹E…6ð…*ð€€€€€‰N€€€€€ƒIƒ1‹I€€aaa€€‰E€€€€€€€‹N™B …6ð€€€€€‰I€€€€€€‹B‹E…6ð…*ð„„„€€‰N€€€€€€€‹I€€€€€€€‰E€€€€€ƒ1€‹N…Bð…6ðaaa€€‰I€€€€€€€‹E™6 …*ð€€€€€‰N€€€€€€‰B‹IB…6ð„„„€€‰EBÒ˜€€€€€‹Q‡6ð‡*ð€€€€€‰I€€€€€ƒIƒ1‹E@…4ðaaa€€‰Q€€€€€€€‹I€€€€€€€‰E€€€€€€€‹P…Bð…6ð€€€€€‰I€€€€€€€‹E€€€€€€€‰P€€€€€ @¡ƒI‹B‹Nƒ6‡*úƒQƒUƒZ€€ˆ€„€€€€€ˆ€„€€€€€‰N€„€€€€€ˆ€„€€€€€ˆ€„aaa€€ˆ€„€€€€€€€„€€€€€€€„„0„0„0€€€€„€€€€€€€„€€€€€€€„€€€€€€€„€€€€€€€„aaa€€€€„€€€€€€€„€€€€€€€„„ „ „ €€€€„€€€€€€€„€€€€€€€„€€€€€€€„€€€€€€€„aaa€€€€„€€€€€€€„€€€€€€€„„„„€€€€„€€€€€€€„€€€€€€€„€€€€€€€„€€€€€€€„aaa€€€€„€€€€€€€„€€€€€€€œr„„„€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œaaa€€€€Œ€€€€€€€Œ€€€€€€€Œ„„„€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œaaa€€€€Œ€€€€€€€Œ€€€€€€€Œ„„„€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œaaa€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€€€€€Œ€€€2 0(@ @ WU@d÷Uÿýÿ`Mýþýüþþþÿþýüûúûýþü Ampli,(@ @ ­ @dò‹4ˆÂéä( Û ÚgðŽô%V3ûòÑïßKºì)ÝÐ,6$ªÃ<è/ö÷ÿ(×UùäÝ·½àþ8?ÇUÿ¢Ü$öÝÝ: ¶;Î&ÄNÝúƒ F2ßVµç*ôÝ?£å”Ü×ÁøoÕ×ýûVÆü Å8ÝÒ ×êë•1CÕÖÑÇê?îdöðËäºàl3¹à§)ñü\òç«å{ûÎ/ÞÞþôôN¾E¤m¿î‰A8Ù. Ò²I\ÀÍ ÉÝgAÌ´±+0 áI”ÝWžûEõÉýOû‘Cä´=Tê­\1 æ(úå°>@õ™pòÔœØ8!0ÛòAçëí×#XϹÇ"y¹»jØÖD®â ýAåLðÀ "!°æÁ8"ï8¹Óèk­áûï-ò] ’èf.Ïíü÷í%÷Ñó<çáMÀH÷ÿœ è44Š#sØT÷‡2ü¥‚2¢ÿëxÁ ÿs;ÿÿþþÿÿýÿÿþÿþþÿÿýÿýÿþÿþÿÿýþþþýÿÿþÿî‘Úv,ÿÿþþÿÿýÿÿþÿþþÿÿýÿýÿþÿþÿÿýþþþýÿíŒÜ3Wÿÿþþÿÿýÿÿþÿþþÿÿýÿýÿþÿþÿÿýþþþýÿÿþÿÿýÿÿþþÿþÿÿýÿÿþþÿþÿÿýö©Úÿ\ÿÿþþÿÿýÿÿþÿþþÿÿýÿýÿþÿþÿÿýþþþýÿÿþÿÿýÿÿþþÿþÿÿýÿÿþþÿþÿÿýÿÿþþÿþÿÿýþþþÿþò¯ï ú%Cÿÿÿþþÿÿýÿÿþÿþþÿÿýÿýÿþÿþÿÿýþþþýÿÿþÿÿýÿÿþþÿþÿÿýÿÿþþÿþÿÿýÿÿþþÿþÿÿýþþþÿþ÷ëûüþúáè þþ%øüÿþÿýÿÿþþÿþÿûíøÿÿÿÿýþþþÿþþ Kmuland &(@ @ (&@€&þ|ë DMýûø øᬵüùþRõ þûûõî½¼ô&=) ÞÅÅéìæ(ûó)ïÖ×úþ!ÿÛ)çÒ 97#þúþõÏÉÜùé H:ý òí×þ îÿÿýøý#JA ñû°ÖC ü/äãøüÒá-ö%ÑÉî÷ä Úô B*3 æ ùÿé¾úþêÿó$( /íì ƽÊú þ óá þþþñð FI ßÞ! î ÷ýüìkÊAÜòóþþûþþÿÿÿÿÿÿÿÿÿÿÿÿÿ5u Ø ëô ÷ýÿüÿþþþþþþþþþþþþþþþ½o!Ýðø øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿT`ìðçöúüþþþþþþþþþþþþþþþþþÿû÷Ëv 'Üñø øýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`Fà ëð üþúüþþþþþþþþþþþþþþþþþþþþúñÜ}î4Øøü ô úþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ† Ò&ç ÷ øýÿüþþþþþþþþþþþþþþþþþþþþþþþþþïèþ•Ì&ì ïóüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEgìñåóùùü¸Ø3ê%ðÏÝ ×(-¹úê/º5Õø+%ËÕë,Òíñòò5—6-Ýö:ñÆì0ïà&¸9 #·KÌýSÀ»þ3îå9ËÛEÊî.àþ"«#µ+ù(Û ÎúQÕßï Öð5ÝÒBåæÎ!ôè,ôñç<èÞåûRè¼CÃ?äØëâ(ÏüøÍñæ<ãÚÌ9ýÌè îü.Åä9æõõôØé)á1Ë #á3ÌéøÝ"×ÕÞÙ%Äø@Ùã)&Àë?Ê$¿E%Ñ é ðùøûÒ?ùÄRöç¼&ßÞ)%ÞæÂ?Àê4Á ðòõô3ÜÞXÅì2Þúñññê ë<÷âôÝáú -ØÍHðÎUÜÿå÷çÝ<³ÿÙ?ÝÇ&ï &¾=ÀøÆáFÿÓî1ñÿùêåî(ýÏ óîð<åðÜ1ëòÎB¾ý3ë ÇëFÖó+üæ þÂýLßÓ$÷û Æ+ æìçù.íÎ%Îë2ÐùDðÔý Ø  úëÑúòô2Ä7Úè6ðÉ3åýíîÞÔ-õï÷ ×?#Âû ùÝÚ'îèMÒÝç$öÐò&*Ðì2Õá."Ü 6ÕÔüð;Øâ&#ÛÿÛû#Ìå5Ñäï'#ù÷ùÇéUëê íÞ.®",øÓõâù+üáÔÿ-  Céæåï,ö÷Û/Ëûý÷çëè!!ö÷ÿþõïå×÷++Úâ¹ôNðË1ÑÕ:ð ÷Úø 2ßúþ òìûû *ä÷%ùüýôÇ@ÑÐ6×ä"ñäÚû%Ø5æä $ûëûæ;ðÀ!(Öý üÙ %Ê)"õùùêôýðææ#íÓC¹-ñÖAÎ2œW»ôé4ì&ëí/Ë÷$Ï $Ê@ð ×çJþÕ#Îß3Æë?í !öá,ýöúÎ Úñ5Éñò'Ϲ$'§(õPÄçò%àÕÕð÷ éå$*ßë ÷ñÎôéß6Îå&é2åÞWå×%çÕö4óÍ2Ùöíý èø öÆ7âºCí¿Sòèô !Ë÷5Çæ4ýð )½÷4ó½'/Î öçè-Ó =µ.ÔÂIíÒ\ÇâåÃ7«"ò ò üþ#þÎý$òõýæ-Ü þöþÝý,ã ôÌò #ïÊî5Ù ¥1ðÝ#&ãÜ*¾öýèû ýúÝë  ç;ú¹éý*÷î øâ÷ßòñìCè äÜEéãBñÐ4ûüèââ'âç ßÊ0,Òìä ù ç÷)Ëè.ë ¿.¾ýüðòKÂ>ÇþÔúKðôýæûÞ(Ñ1îâ3áôó é ·%Ýñõ6 Èðõ+Ü÷öþëý)ðàö æà<ú¾MýåÞö,÷à"÷êçæ>òÓ ÷÷Û!ÕÙ7úçôü$Ñã=àé+ èþúé>ÿØöí áøÿÛ&âìñ'óÓ,ÿß õ ôõ/ø¿8 ÔüÜ0 óèú'öùß Ç)úîJÆ "ÂE»÷Z°%&µÄõ#óà+É1åù ðæïø9æ Üÿß Ý8¸ )Üõ þÇ,ßïü ýþü÷ûñ æý@æÈå,ïó úÞççãú?áÚéCßîBäÛ5õþãé!à#ÝíÛÌ; Ñòøïúåô Éõõ(èÄ7ôÄ(&öÄâ éöìÚñä#.Äø;Òþ$Ìÿ!ì'ßôÓá.ô×Ó$Èðýõ -îÏ .ÿéýý íðñþåý.áú$å$çÞúêàÿ× $öïãô ïê3 íòåï÷Ð0ãïü3èê!ë&Ê%ÝùîEñïãô%ùðôÛÿôè+ Çúúðù á+èèÿúâáÝ ñüúþá$åçëÚòö À('àúß(òíûù(ùéÚ Þ Ð,/Ãõ"ÿèüÙò+î +áÿéýÚ7÷ãÕïæîðÚ-Òàüí#âð¾ 1ëóéè'Å1Ü7âôéß#Ä+ã Þý,íöÞúÜ1á âë öù âÝ ä/ËõðÀÚ 4çðãúþ/ëäúùî&«+ê÷ ñ ûæç8Öü ÿçø0éàì$ýî¸#Ç& ÿ çåï÷.éò+Ç àâ.îÙÜ!ø×ôÿî Í 'ùÎ/ôÙÚï)õ ØìúÕì*æÝ*ÞÚ.àú(Ë&-Óî ðùü×%¾F úÁ%êÖ,èÝÏ'#Åþê-Ðúçû ö,óÐDÙã2äøôïùêü ó1úëðß  çú.ßöÏ1 ÐGçöåúìÚ&½ æó1óËù-Á!Ìþð æÒ3 Óç3ùüþïéïü& Óûõ üñ)ýÁìé&ææ"Äúéüùàöü+Õç9áú1èþàÿú È Ïþàþñï û" ïÿø÷á$Ñø"ë×Ó.åæûé  ÿúÞóÿûüö(ýÑ/ßþ#Óö5î ý÷ùõÎ ë÷ ë@åãûöÜõÜ#Åú÷ßä +ùÒîØ ,÷ç-Ôîï'óß*øòæò&óÔ-ðßî &úþàê#à&$Ù üíë2Ñ ûýâÔ öýõ÷ðïêôþ êç;öÒåî2Î(ºSûÙññ2ôüáÎ ÜùÖ*÷úÙþ2ßúßÅ:êÿÖö 'óöÎ%Ø;õåþó"áÓÐôôñ"ÑúúèïïÖè .ÞóÖ(ïÖ)åå9 Õ Óì"  íö ï ñ þîë& íÒ,Ò(Ùð*ûãý6Í ÃGþüýÄ7ößò.óãÏ!#éõôêðøñþùüóîÿõþùôõÝý&éè"êâ ùÿÿ ôù àèüÙûÝê÷'Ó"Ê#ùéá) éØ  "äíêùÖ?ÞÝú!Ô;æü õõ ßâ$äôòßéùôíýÕ î0îéÿô×ùíøãâó×CÔþýüêêú *ýÞâû&Ï#Éúýæ'ùÓ/ìä#ñ ò ÿÚ+ àüÛôò òûúýîãôï!ò÷Þ;ÙýÁî ùà1ïé ôîÿ#ññÞ÷ü çã-Ùû!úýé ÿÍ*óÝ!ó"ñÔ'Úò öÛ Üò1õéâ ýíùôé"ãóç0Üå4êê)Ûø õë Þ îçèêîøÙ4ñæ ïõÒ'îþú óÿí÷÷ïØùÓ þýô!øíÿïç ÷ã ó ùëîõîüéôüìñ5çõë÷ùõÝ$äî-Óþí#ðòåôý"ÙÚò .àû ûýßýíîöñÕ5ýüçûö,Ýôøþø ßòôèû þå ÿùúÛâüí"ßøÓ%ÒóäÞ-ÔÿîôÖã öñÑì%âÞõóðûòê&äð$ã"Í&öñÀ9ÛBÏó+Øêããé)úðüûúäúèúä õè äé,Ôþ ï ëù2åì ùè÷  êæ( òóÞ  çðõö ãõí(Ï !Ö Ù úêá ûâõõ!ïÿëÚ"Ûï þ÷èáøóùøêýüè Ü ôß÷ ýïëþ÷åõëöõ  êü&òø ëû÷ ïç,úñî èôæ ÞÙ ü-ì÷æõûò æ þüþñ*óÝ øùñùä(öýóïð ïü'þóùîùùû ñÝ-ðôó.îñýûô%Øóïí2ýéñùñúìÿç ýüþó*ïà ÷ úíæ'éñþã óÝòö öû÷ ô éíðþùë&øæôþùíçú"æöð-êØù é+ëðü÷áû4çùïþ&þðùûá ç ìö ÷ç:ýÖ úí áõ êîïùðî+ âïâñõÿáú.õïôóíÚü õóó Ö çøüëù ãø÷þñ ÷ øñí ýßÑùß$ïô/Â#(Òøíðþéìêåü ä÷*óîå)ÿæ ïþ"Î&ã ñÜþ øðüõß êó ßîýüæøØ)È ì6çåó õáöóù+àè-ð üä.ûøÚ"æ æ#Ôèìï úü ùññ öß.èýÜñûõêóüöð*àÿöûñ ííýð øæþ"çê%ýç÷ ñøúþ óñ÷ì ú÷ è÷ øìú"ðßôß0ûäøß ÷ Ûòïó ó÷ ßö ý!ýòÕ Ì-êûãñ(éáúÚó# ûß#æÿüûöéóñ1Ýùõ!ìÿÙ Ò3ðäì ãÈûý÷üÿ ßùöîëúþ ðóöù âð þ ý ìíûéÿï%ðîûìûïõë íôñÿýøðàöøõ÷ë'áñ üñÿèüîæýüÔ ïõñ'èáù ýð+öà îî'Ñ%Êî%Øíß& ÷÷ñÿþâøîßúúëøïúþûôüýùóýÿá&íä ðìþüñþõðííðþñþñÓéûûêèÎ õÜëóóøéöñÿûúêÿÝü+êúþþûå ù õî úïïñõùýýÝ  ôøîüÙüüíï÷ÿÿ òúÿá Ë"ù ôú÷ùýýè%æå& åæ ðë ýïëôà&öè$çßÿý!ýåø#Ýþóéïîòä-Þóí'îþýè'ìÿ*Øéöôüýëêÿþþïîýúùøöëñú òð þýýöé ùü#éóúáÿìýþüïõý éû úü ëÚòå#üúôìêúóù òñìöÜÜ ûö çôá ýóýç&ÿêý ýûéýãõúéúñÿóÿýó ëóõÖ Ý ã ùùüöñ  ééúç ïþáûüýüýäóûùðÿ÷ ñüøðòÿî åöäï í òÿ ÿëìôùú ñéþ!å!åúøëýýï  éý íúë'éûõý û éùÿßüüïÿä$êìú î Õ åãñùôÿ ëñâñ óõ þÛ çü#òê÷í øÿò úéüüõ&ãõ(ðöëöñ ýò ïþëñ ùóõáû!ûòûÜþþëüùÿöý ðîóæòö ôê÷íùóöð ã íöôþûíìû÷ûïùþè õëöûâîùõõúùðûü üûééòìö ÷ï îö ýöüôóò÷ Þã þûõ÷èóðøÿúæéýþøô ûéõûëþ  òõÿüöîùñæöìûçûÿöì îð÷òûñôîüõ ñÿíûöô úøö÷ú óýû ûòî!úùõþîúÿõæïý÷#ø÷òûüùû îÿýöäþÿòûõêþî  ñîø þü òô ôõï øý ÿ ìçÿøøííñò âûúíú ÿôðï'õúöù÷ùþòüðùôòû$õè úöûñ ÷ ì ûû÷þãûôôáÓ÷÷õîù þ÷ïýûóÿñöþó ýïù òûðýô ÷õþÿ ùõé üûøöö üë÷ÿùýïø ïòü â òöó ïëù úô"ùçòúÝÚëá öëýûôþîùñìøüÿíþ óûùøÿþööþüíýøë÷òÿÿùôõóîòúòð ûûæññüýüþ öóþç ïÿûû õùöùðú õö ûð ü ÿðüøí÷ùÿï÷öüïÿûí ðóýëô ÷öþüýüøÿùûðÿôþí÷ ø ùû ëû üüòÿý õñ ö÷ ïëöô øëü ú ëý úê öñ ò÷î þÿú îú é þü õð öûñ êôù ùçûì õ ÿì  øî ÷òñÿõ ñýüèïú çþñ êó õúýÿñõð ûùç ó÷ñü üîïÿ÷íûûþýòõåòüÿú ûöù øüöõôðïúõî÷ûôõÿæ òóñùêøîý êùéúÿöú ýûóýòýõûþýýìþþ ùýûîìòþ ûýúðôû øø èÿ öÿïåï ìü ëùó#çö ôê÷ ê üýöÿ óõ ä ûù õõýôùûüñ þýõôëüñþü õù ï ýúùýý÷ öÿûìý ú÷ÿùøùï ú÷úÿ÷öøþëû ö ûõì ÿõ ÿüÿûÿøúüû ÿô ýþ õýúþ ôú ðú ûüûôûùüþüóóýï ýúúû õø÷ÿ ðÿüü÷þýõ øú û ÷òü÷ýüóýýýöô þý øýú ÿóøóýýúù îÿ ÷þñ ùó ñóüúöþú÷ úÿðþûúüö û õþðüúöúÿøþøöñüøýöþýüÿóùù ëü ð ýýïë ö þÿóûû ñûôþÿüûÿ òô÷üñùýíÿÿýüþöÿîù ùý úþû÷øù ð øî òïÿúÿöþ þ÷ óüú òöøõÿýú ôûöø÷ øøò÷þøôýýíþôùù ÷ÿ÷ó óù úùù îýþúýì þÿõ ýýÿúòÿöü õúÿ÷÷ýí ü÷ö ýøýüùúúüÿþûúó õ õ ûø ùü÷ ñû÷ø òÿýóÿøþýý öõûÿ÷þùñÿûñÿú ÿöþõüÿÿ ñÿ÷ ú÷ óÿö úþúù öÿùþ úúùÿýðóÿúûö ùú ÿ ûþùüùûø üö úþõúúþýøüú óýöþõÿû úüõø ýöö óüü ýõ ÿüÿüþúýý ÷ÿ ø ûøþúú÷ÿÿþøüýû ýüûÿýùù ÿüû ùýÿû íôûøþûÿüûôúÿúþÿýýþýõ ýøúú ö þùýü÷ý ÿûôýûýÿô þüûþÿ ýüøöþò úü þüó îþù øùþýûùý ýûÿúÿúùÿÿøý øýø ûýûúþþÿù÷þþýúúòýÿýö öùÿýó úûû öú ýýüùüÿÿ ýûþÿûûüùüúûþúûÿþþüþ üÿüÿþúþûýþûüúùýÿúû ýþüýýýüüûÿúþýÿþÿüþþûþþÿûþÿÿÿùÿùÿùÿÿÿÿþýþüýúüúùüþöÿ÷ÿ÷úþÿûýù ÷ýýû ÿüýýûÿýýüûüýþÿýüÿýÿþýõýüüûþùÿùóÿ üþû÷üùÿúüÿýÿýýüþüþúüýÿûüû ûúúøþøÿÿýÿÿýúÿøüù ùýýýü ûÿýÿÿþþþþýüü þýÿúûýüúûÿÿüýÿýúùúúûúÿýÿüþÿ÷ùþøÿÿûø ÿýüÿýüþùÿþûúûýúþú þúü ýúýÿÿ÷öüÿÿÿÿýþþþýýüûúü ø øþýüü üúúûûþù üúøÿýúýÿüþüþúüþþûþýýüúÿÿûúúýüÿÿÿýÿþûþþýýÿþýþÿýþÿÿÿÿüÿÿÿÿüþýþÿÿþýþýþþþÿÿûÿþþýÿÿþûþÿÿÿþþþþÿÿüþÿÿþÿÿÿýýþýýþþþÿþþþÿÿýþüÿÿÿÿÿýÿÿýÿÿÿÿÿþüþÿÿÿÿÿÿÿÿÿüýþÿýþýÿÿüûþýÿÿýýÿýýÿÿýÿÿÿþÿÿÿÿüÿÿÿÿÿÿÿÿÿþÿþþýýÿÿÿÿÿýýÿÿÿÿþÿÿþÿþÿþþþÿþÿþÿÿýÿÿÿÿÿÿþÿÿþÿþÿÿÿÿÿÿÿÿþÿÿÿýÿÿÿþÿÿþþþÿþÿÿÿþÿÿÿÿÿÿûÿÿÿÿÿþýþýÿþÿ raina(@ @ @ä€ÿÿþÿþû÷ûþõ0êÒ#õê÷öÚ7"³ú3½ãD õ÷ò$óÜ 2ïž5ÖAøÇýÍ-GÜæýüåïߨ.úø7ëª(÷éñ1×õÆöO)æÅüÛ"$îþ#èÊ*Ö9"ÍØÀ;UÆòÖâ )Ãà]ü¶ ûõüéï ìêû%Áõfس4Ïøÿ2Þ±20é£mÕØùáDåã÷ ü ëéì÷!ñåì7ÝÙAÆK£ÈZøíèõö"ñõ ûTð¤:ù²W5¾îþð ýíŽyÉä€Óv.O‹L°×<ìßK ¸Åþ<ë*»íì@,• g·»;ò÷ÿ³¹o%Åö Ú÷ß32ÿû SõðªöL$-ÌÚ×0îòõ(#“ zÉá©Ó•|ó2 þçöâ.ß÷Åé2óÑ2/èáß*Îü (³â+1çÜÌ-SåÚõÛ0Þß)ûÛÒçl@mõzº¿IÜì ðÒ Úë$ÏÍL3™ \ÚÔÍIƒ~‰6­Ð,Uê¼/7¥ªKEÚÝ&ðèþ îÞ 5Öß& Éù†õPgÚþ ÷á÷í¾ eöÈÒÛð/L ÈÕLáà ßF–UHåï1!{éaÖÊZ?×Öâ® qд ÜÌ61¼Ë÷1'¶QÑÌýò20´ \ö0% úÂö õõÚï,G°Ö/Èy÷˜HåØþùú27«ÃDÞÉ])ÕØâO½"!øÈãyõ~ G üà´P©þ>#î¥L»÷*ß)×Î(õÛ 3ìÏô?R™Œ_PÑèóáîóÚ*Ãî5AÊÄä !>»Ôñ 9ö±ÿBÔ¬/#É(AÈÉü*åêÕ6è ã Í;CÆåó)¯îw»ŠvtÙÅÏà;6õÞ²YþæþöäþI¸$¥'!ÑÞþó"¼ÀOÐïìÜÍjò¡$Åó9ºîõû$Úá&Ê×H!¿37—ð@îõ0ßÎH¥sЕ6"Ð(çáEø¥0é ñý¬!FÌÙ*ÐÍ3àØ&KÑÄ!ìóü âÎ#.èáó$Óû-ÞÏ GòÓ&'×Ð  ÷ó#¯ïdÛª"7!÷Úüêñ ñã÷(çÚþóè$ìý îþ ÿþòÜú(ûþÝ*Øù ïÎ$*äõ#Ïè)øÀì:) ÎÝñ #øãà)üûê ÿþÊÐ0 ï9 ¼÷ÿûÞ =òÚ ó÷ ÷ÙÜà7¯+aºØ1óÑ×X<½å&áËBàÜþãë!ïýî !úÕðóðø&ßÕùÕ1 ýáï õè&óüóãüÜÞ'Ë>ÜÛ ÿô íØ$ûìü  ìùáñC¸ðüù ÷þáû"õåõ õ÷ïø ìã ëíùòûôà êãúëþóçùì þáð &Õ÷ûç÷ þúòõ õáùê öù ÷ëþáÐ%ïæôúù óøóðèø"û íëþìþ ÿõßîþþóù ììûõ áóùüóþ öö îùøþþøï ÷ÿÿøü þõùü÷ÿõî ú÷åüøø÷ù÷ü íøøõ ûôÿþó ÷üöýúþü þá õ ýÿþøõþ õó  õýþ÷ õùûüýÿùýø ü÷ûÿþ÷þûþÿþùúÿÿÿÿÿ ôöþÿþ÷ þÿþûùüúúöþÿþÿÿýùþÿÿúþÿÿÿÿÿÿþÿþþÿþÿÿÿþþÿÿÿÿ(@ @ 7É@€û(¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q¯Q Trio Internacional(@ @  @€ï;÷ýþÓšÕüþþþÿÿÿÿÿÿÿÿÿÿ #BFÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþýýþþþýþýûóÚºÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ (G?ÿÿÿÿÿÿÿÿÿÿÿÿÿþýþþýÿüþûÿüýûïÔ¶Íþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,N4ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüüÿýÿüýýýûèб×ýþþÿÿÿÿÿÿÿÿÿÿÿÿÿ3NüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþþþþýþüýåȱÝþÿÿÿÿÿÿÿÿÿÿÿ ,9þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýþþýüðÞÑÅ×ýÿÿÿÿÿÿÿ!-5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿýþÿýûïÜÑÆÖÿÿÿÿÿÿÿÿ#02ÿÿÿÿÿÿÿÿÿÿÿÿýÿýþþÿýýûëÚÑÆÞþÿÿÿÿÿÿ%1*ÿÿÿÿÿÿÿÿÿÿÿÿýþÿýûûûúòìäÚÛØòýÿÿÿÿÿÿ  'þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýÿýþýÿúôêáÙÛÕïÿÿÿÿÿ!# ÿÿÿÿÿÿÿÿÿÿÿýþþýÿþýþùôéáÚÜØòÿÿÿÿ ù ÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿüÿþþüúóèáÝÛÚïÿÿ "ÿÿÿÿÿÿÿÿÿÿÿÿþýÿüÿþþýþýùñæâÞÝÝðÿ  ÿÿÿÿÿÿÿÿÿþýÿüþÿþýþýý÷îæàÞÝß÷ÿÿ !ÿÿÿÿÿÿÿÿÿýþýþþþþýÿû÷îäáßßÞ÷ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿþýÿýþýþýÿýþüõíåâàßâ÷ÿÿÿÿÿÿÿÿÿÿÿüÿýþþÿüþþýüúôíåãâàåøÿ ÿÿÿÿÿÿÿÿþþýÿýþýÿüþþþþúóëäãâáçõÿÿ þÿÿÿÿÿÿÿÿÿÿÿüþýÿþýþþýÿþýýøñìåäââéùÿÿ ýÿÿÿÿÿÿÿÿÿÿÿÿýþüÿþþýÿýýþþýöòêæçãåèõÿÿÿÿÿÿÿÿÿüÿþüÿþýþÿýÿýýÿûöòéèçäçëóÿÿ ÿÿÿÿÿÿÿüþýþÿüùþÿþþþþþýùöðìééäëìó  ÿÿÿÿÿÿÿÿþÿýþýþþþýÿþüÿýÿýþùõïéêèåëíò  ÿÿÿÿÿÿÿÿþýþýþþþýþýÿþýÿþþüøõîéëèçììôÿÿ þÿÿÿÿÿÿÿýýþýþÿüþþýüþþÿûøõíìëèëìðñú ÿÿÿÿÿÿþýþüÿþýýÿüÿÿýÿýþþþú÷õíïëêìðñóöþÿÿ  ÿÿÿÿÿýþýýÿýþþþüþýÿýÿýþýú÷òîîëêîïðôúÿÿÿÿþ ÿÿþýþÿüþþþýþýÿýÿýþýþÿüùøóîîîëîòòö÷ýÿÿ  ÿýþþüþþþþþýþýþýÿýþÿüýüû÷óððìîòñôø÷ÿÿÿþ þü  ÿþÿýþýþþýýþýÿýýþþýþÿýþýÿþúöôðñîòñôõøùÿÿþþ  ÿÿþýþýþþýþýýÿýþýÿüýüþþþûú÷òððñóòö÷ùúÿÿÿÿ    ýýýþýþýþýÿüÿýþþÿýþþýÿþÿþþþüúöôóðñóôôøúûÿÿÿ  þþýþýÿþýþýÿýþþÿþþþÿþþÿýÿýýú÷õôòòõôöúúýÿÿÿÿ ÿüýþþþÿýþþþÿýÿþþÿþþÿþÿþþüúùõõôó÷÷øùûþÿÿÿÿÿÿ ÿýþþþþþþÿüùûÿþþÿþþÿüÿÿüúøùöô÷÷øùüúÿÿÿÿÿ þþÿýþýÿÿýýÿþÿþþÿÿþþýýùù÷÷ôøö÷ûúýÿÿÿÿÿÿþþÿþþÿþþÿþÿþþÿÿýÿþýúùù÷÷øùùüüüÿÿþÿþÿþÿþÿþþþþÿþþýýüûùùùúùûüýþÿÿÿÿÿÿÿÿÿÿÿþÿÿþþÿÿþÿÿÿÿÿÿÿþþÿýüüúúûûüüüÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿýÿÿÿýýýûûûúûûýÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿþþÿÿÿÿþýüüýüüüÿþþÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿþýÿþþýÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿ0 8(^·¦@€ðþ üíñü!öäêï÷Ýîóóçü/â Ûõÿýûø óõ 0 ä $ûý÷  ô.òô øùúúýþ÷ä õÝöñ þé è)æÃë&äøøß9üêõúÔøýÿåìã.êèüâ íîúû ôùóë! ö ÿô ï%4ÜÇö7 ýÖ.ÙæëûïåðààöÚóýö-Öö6àòû)ÿü¼+ þÓÕ"ññÅêÕðÚò*ðÞü .â ÜòòþøÓ, Ñ Æ(ì èFñ&ýÓñ »ôÔÚï Ë'# ó ñ/Ì ùêîöá? ÞÏîÎ Ôó÷æõ* ú æöË ÝßÖ8þ ÷÷å#óýìôáïÆü Úïö /øùß,!ýñç#)õ!ôüöÊ Äûÿ÷è4÷éïáð ìþäæú*õâåOçûàõE ÿ×ïßêýàüô2ðÓ÷×ÍÑôïðú+ôö ÿ% úÍ#ûõ úúåõàöùÙ×(íêá éàë*úÌüöÌà.åÚ × É" ýõ+!ñüûò(êíÞÝÜþöþæÿ óèCñî÷.öò/÷Õÿíú milkytracker-0.90.85+dfsg/resources/music/milky.xm0000644000175000017500000007005410737746457021302 0ustar admin2admin2Extended Module: milk in veinsMilkyTracker  …  @êƒ1€€€€‡F0€€€€a€€€€a€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€‡I0€€€€€€€€ƒ:a€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€‡H0€€€€€€a€€a€€€€€€€ƒ:€€€€€€€€€a€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€ƒ1€€€€‡B0€€€€a€€€€a€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€‡D0€€€€€€€€ƒ:a€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€‡=0€€€€€€a€€a€€€€€€€ƒ:€€€€€€€€€a€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€ @ï‹1˜…˜aaaaaaa™a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€ˆ€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€‰a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€ˆ€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€ƒ1€€€€€€€€€‰a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€ˆ€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€‰a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€ˆ€a€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€ƒ1€€€€€€€€€‰a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€ˆ€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€‰a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€ˆ€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€ƒ1€€€€€€€€€‰a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€ˆ€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€‰a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€ˆ€a€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€ @æƒ1€€€€€€€€€a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€‡I0€€€€€€€€ƒ:a€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€‡H0€€€€€€a€€a€€€€€€€ƒ:€€€€€€€€€a€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€ƒ1€€€€‡B0€€€€a€€€€a€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€‡D0€€€€€€€€ƒ:a€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€‡=0€€€€€€a€€a€€€€€€€ƒ:€€€€€€€€€a€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€ @êƒ/€€€€‡G0€€€€a€€€€a€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ6€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ/€€€€€€€€€a€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ6€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ/€€€€€€€€€ƒ/€€€€€€€€€a€€€€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€‡F0€€€€€€€€ƒ6a€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ/€€€€€€€€€a€€€€€€€€€€ƒ1€€‡B0€€€€€€a€€a€€€€€€€ƒ6€€€€€€€€€a€€€€€€€ƒ/€€€€€€€€€a€€€€€€€€€ƒ/€€€€‡G0€€€€a€€€€a€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ6€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ/€€€€€€€€€a€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ6€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ/€€€€€€€€€ƒ/€€€€€€€€€a€€€€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€‡I0€€€€€€€€ƒ6a€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ/€€€€€€€€€a€€€€€€€€€€ƒ1€€‡F0€€€€€€a€€a€€€€€€€ƒ6€€€€€€€€€a€€€€€€€ƒ/€€€€€€€€€a€€€€€€€€€ @uƒ1€€€€‡K0€€€€a€€€€a€€€€€€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€ƒ3€€€€€€€€€a€€€€€€€€€€ƒ:€€€€€€€€€a€€€€€€€€€€€€€€€€€ƒ1€€€€€€€€€ƒ1€€€€€€€€€a€€€€€€€€€€€€€€€€ €€€ƒ3€€€€€ €€€a€‡I0€€€ €€€€ƒ:a€€€ €€€€a€€€€ €€€€€€€€€ 0 €€ƒ1€€€€€€!P €€a€€€€€€"0 €€€ƒ3€€‡H0€€‡# €€€a€€a€›3Å€€€€€ƒ:€€€›3À€€€€€a€€€ƒ'€€€ƒ1€€€€€‹3€€€a€€€€€a€€€ƒ1€€€€‡B0›3À€€€a€€€€aƒ'€€€€€€€€€a‡I€€€ƒ3€€€€ƒ'€€€€a€€€€‹3€€€€€ƒ:€€€a€€€€€a€€€ƒ'‡I€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€€€ƒ'‡I$€€€a€€€€›3Ä€€€€€ƒ:€€€‹3€€€€€a€€€ƒ'€€€€€€€€€€‡I,€€ƒ1€€€€€a€€€ƒ1€€€€€›3À€€€a€€€€€ƒ'€€€€€€€€€a‡I4€€€ƒ3€€€€ƒ'€€€€a€‡D0€€‹3€€€€€ƒ:a€€a€€€€€a€€€ƒ'‡I<€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€‡=0€ƒ'‡ID€€€a€€a€›3Å€€€€€ƒ:€€€‹3€€€€€a€€€ƒ'€€€ƒ1€€€€€ƒ3‡IL€€a€€€€€‹3€€€ @«ƒ1€€€€‡F0›3À€€€a€€€€aƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€€€€‹3€€€€€ƒ:€€€a€€€€€a€€€ƒ'ƒI€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€€€ƒ'ƒI€€€a€€€€›3ŇI €€€€ƒ:€€€‹3›1@€€€€a€€€ƒ'a€€€€€€€€€ƒI€€ƒ1€€€€€a€€€ƒ1€€€€€›3À€€€a€€€€€ƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€‡I0€€‹3€€€€€ƒ:a€€a€€€€€a€€€ƒ'ƒI€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€‡H0€ƒ'ƒI€€€a€€a€›3Å€€€€€ƒ:€€€‹310€€€€a€€€ƒ'a€€ƒ1€€€€€‹3‹=€€a€€€€€aa€€ƒ1€€€€‡B0›3À€€€a€€€€aƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€€€€‹3€€€€€ƒ:€€€a€€€€€a€€€ƒ'ƒI€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€€€ƒ'ƒI€€€a€€€€›3ćI €€€€ƒ:€€€‹3›1@€€€€a€€€ƒ'a€€€€€€€€€ƒI€€ƒ1€€€€€a€€€ƒ1€€€€€›3À€€€a€€€€€ƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€‡D0€€‹3€€€€€ƒ:a€€a€€€€€a€€€ƒ'ƒI€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€‡=0€ƒ'ƒI€€€a€€a€›3Å€€€€€ƒ:€€€‹310€€€€a€€€ƒ'a€€ƒ1€€€€€ƒ3‹=€€a€€€€€‹3a€€ @«ƒ1€€€€‡F0›6À€€€a€€€€aƒ*€€€€€€€€€aƒI€€€ƒ3€€€€ƒ*€€€€a€€€€‹6€€€€€ƒ:€€€a€€€€€a€€€ƒ*ƒI€€€€€€€€€€€€ƒ1€€€€€‹6€€€a€€€€€a€€€€ƒ3€€€€ƒ*ƒI€€€a€€€€›6ŇI €€€€ƒ:€€€‹6›1@€€€€a€€€ƒ*a€€€€€€€€€ƒI€€ƒ1€€€€€a€€€ƒ1€€€€€›6À€€€a€€€€€ƒ*€€€€€€€€€aƒI€€€ƒ3€€€€ƒ*€€€€a€‡I0€€‹6€€€€€ƒ:a€€a€€€€€a€€€ƒ*ƒI€€€€€€€€€€€€ƒ1€€€€€‹6€€€a€€€€€a€€€€ƒ3€€‡H0€ƒ*ƒI€€€a€€a€›6Å€€€€€ƒ:€€€‹610€€€€a€€€ƒ*a€€ƒ1€€€€€‹6‹=€€a€€€€€aa€€ƒ1€€€€‡B0›6À€€€a€€€€aƒ*€€€€€€€€€aƒI€€€ƒ3€€€€ƒ*€€€€a€€€€‹6€€€€€ƒ:€€€a€€€€€a€€€ƒ*ƒI€€€€€€€€€€€€ƒ1€€€€€‹6€€€a€€€€€a€€€€ƒ3€€€€ƒ*ƒI€€€a€€€€›6ćI €€€€ƒ:€€€‹6›1@€€€€a€€€ƒ*a€€€€€€€€€ƒI€€ƒ1€€€€€a€€€ƒ1€€€€€›6À€€€a€€€€€ƒ*€€€€€€€€€aƒI€€€ƒ3€€€€ƒ*€€€€a€‡D0€€‹6€€€€€ƒ:a€€a€€€€€a€€€ƒ*ƒI€€€€€€€€€€€€ƒ1€€€€€‹6€€€a€€€€€a€€€€ƒ3€€‡=0€ƒ*ƒI€€€a€€a€›6Å€€€€€ƒ:€€€‹610€€€€a€€€ƒ*a€€ƒ1€€€€€ƒ6‹=€€a€€€€€‹6a€€ @«ƒ/€€€€‡G0›/À€€€a€€€€aƒ#€€€€€€€€€aƒI€€€ƒ1€€€€ƒ#€€€€a€€€€‹/€€€€€ƒ6€€€a€€€€€a€€€ƒ#ƒI€€€€€€€€€€€€ƒ/€€€€€‹/€€€a€€€€€a€€€€ƒ1€€€€ƒ#ƒI€€€a€€€€›/ŇI €€€€ƒ6€€€‹/›1@€€€€a€€€ƒ#a€€€€€€€€€ƒI€€ƒ/€€€€€a€€€ƒ/€€€€€›/À€€€a€€€€€ƒ#€€€€€€€€€aƒI€€€ƒ1€€€€ƒ#€€€€a€‡F0€€‹/€€€€€ƒ6a€€a€€€€€a€€€ƒ#ƒI€€€€€€€€€€€€ƒ/€€€€€‹/€€€a€€€€€a€€€€ƒ1€€‡B0€ƒ#ƒI€€€a€€a€›/Å€€€€€ƒ6€€€‹/10€€€€a€€€ƒ#a€€ƒ/€€€€€‹/‹=€€a€€€€€aa€€ƒ/€€€€‡G0›/À€€€a€€€€aƒ#€€€€€€€€€aƒI€€€ƒ1€€€€ƒ#€€€€a€€€€‹/€€€€€ƒ6€€€a€€€€€a€€€ƒ#ƒI€€€€€€€€€€€€ƒ/€€€€€‹/€€€a€€€€€a€€€€ƒ1€€€€ƒ#ƒI€€€a€€€€›/ćI €€€€ƒ6€€€‹/›1@€€€€a€€€ƒ#a€€€€€€€€€ƒI€€ƒ/€€€€€a€€€ƒ/€€€€€›/À€€€a€€€€€ƒ#€€€€€€€€€aƒI€€€ƒ1€€€€ƒ#€€€€a€‡I0€€‹/€€€€€ƒ6a€€a€€€€€a€€€ƒ#ƒI€€€€€€€€€€€€ƒ/€€€€€‹/€€€a€€€€€a€€€€ƒ1€€‡F0€ƒ#ƒI€€€a€€a€›/Å€€€€€ƒ6€€€‹/10€€€€a€€€ƒ#a€€ƒ/€€€€€ƒ/‹=€€a€€€€€‹/a€€ @¿ƒ1€€€€‡K0›3À€€€a€€€€aƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€€€€‹3€€€€€ƒ:€€€a€€€€€a€€€ƒ'ƒI€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€€€ƒ'ƒI€€€a€€€€›3ŇI €€€€ƒ:€€€‹3›1@€€€€a€€€ƒ'a€€€€€€€€€ƒI€€ƒ1€€€€€a€€€ƒ1€€€€€›3À€€€a€€€€€ƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€‡I0€€‹3€€€€€ƒ:a€€a€€€€€a€€€ƒ'ƒI€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€‡H0€ƒ'ƒI€€€a€€a€›3Å€€€€€ƒ:€€€‹310€€€€a€€€ƒ'a€€ƒ1€€€€€‹3‹=€€a€€€€€aa€€ƒ1€€€€‡B0›3À€€€a€€€€aƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€€€€‹3€€€€€ƒ:€€€a€€€€€a€€€ƒ'ƒI€€€€€€€€€€€€ƒ1€€€€€‹3€€€a€€€€€a€€€€ƒ3€€€€ƒ'ƒI€€€a€€€€›3ćI €€€€ƒ:€€€‹3›1@€€€€a€€€ƒ'a€€€€€€€€€ƒI€€ƒ1€€€€€a€€€ƒ1€€€€€›3À€€€a€€€€€ƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€‡D0€€‹3€‡?€€€ƒ:a€€a€˜Ä€€€a€€€ƒ'ƒI€€€€€€€€€€‡?€ƒ1€€€€€‹3€˜Ä€a€€€€€a€€€€ƒ3€€‡=0€ƒ'ƒI‡?€€a€€a€›3Å€˜Ä€€€ƒ:€€€‹310€€€€a€€€ƒ'a‡?€ƒ1€€€€€ƒ3‹=˜Ä€a€€€€€‹3a€€ @ ƒ1€€€€‡F0›3À€ƒ?€a€€€€aƒ'€˜Ä€€€€€€€aƒI›=@€€ƒ3€€€€ƒ'€‹?€€a€€€€‹3€˜Ä€€€ƒ:€€€a€€€€€a€€€ƒ'ƒIƒB€€€€€€€€€€€ƒ1€€€€€‹3€˜Ä€a€€€€€a€€€€ƒ3€€€€ƒ'ƒI‹A€€a€€€€›3ŇI €€€€ƒ:€€€‹3›1@ƒ=€€€a€€€ƒ'a‹:€€€€€€€€ƒI‹=€ƒ1€€€€€a€ƒ?€ƒ1€€€€€›3À€˜Ä€a€€€€€ƒ'€€€€€€€€€aƒI‡?€€ƒ3€€€€ƒ'€˜Ä€€a€‡I0€€‹3€€€€€ƒ:a€€a€‡?€€€a€€€ƒ'ƒI˜Ä€€€€€€€€€€€ƒ1€€€€€‹3€ƒA€a€€€€€a€‹B€€ƒ3€€‡H0€ƒ'ƒIƒD€€a€€a€›3Å€˜Ä€€€ƒ:€€€‹310ƒ=€€€a€€€ƒ'a˜Ä€ƒ1€€€€€‹3‹=€€a€€€€€aa‡=€ƒ1€€€€‡B0›3À€ƒ?€a€€€€aƒ'€˜Ä€€€€€€€aƒI€€€ƒ3€€€€ƒ'€‡?€€a€€€€‹3€˜Ä€€€ƒ:€€€a€€€€€a€€€ƒ'ƒI‡?€€€€€€€€€˜Ä€ƒ1€€€€€‹3€€€a€€€€€a€‡?€€ƒ3€€€€ƒ'ƒI˜Ä€€a€€€€›3ćI €€€€ƒ:€€€‹3›1@‡?€€€a€€€ƒ'a˜Ä€€€€€€€€ƒI€€ƒ1€€€€€a€€€ƒ1€€€€€›3À€€€a€€€€€ƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€‡D0€€‹3€€€€€ƒ:a€€a€€€€€a€€€ƒ'ƒI€€€€€€€€€€€€ƒ1€€€€€‹3€ƒ?€a€€€€€a€€€€ƒ3€€‡=0€ƒ'ƒI›=Ä€€a€€a€›3Å€€€€€ƒ:€€€‹310›:Ä€€€a€€€ƒ'a€€ƒ1€€€€€ƒ3‹=ƒ6€a€€€€€‹3aƒ8€ @îƒ1€€€€‡F0›6À€€€a€€€€aƒ*€€€€€€€€€aƒI€€€ƒ3€€€€ƒ*€›:@€€a€€€€‹6€˜À€€ƒ:€€€a€€€€€a€€€ƒ*ƒIƒ6€€€€€€€€€€€ƒ1€€€€€‹6€˜Ä€a€€€€€a€‡6€€ƒ3€€€€ƒ*ƒI€€€a€€€€›6ŇI ˜Ä€€€ƒ:€€€‹6›1@‡6€€€a€€€ƒ*a€€€€€€€€€ƒI˜Ä€ƒ1€€€€€a€ƒ6€ƒ1€€€€€›6À€ƒB€a€€€€€ƒ*€€€€€€€€€aƒI€€€ƒ3€€€€ƒ*€›A@€€a€‡I0€€‹6€˜À€€ƒ:a€€a€€€€€a€€€ƒ*ƒIƒ=€€€€€€€€€€€ƒ1€€€€€‹6€˜Ä€a€€€€€a€‡=€€ƒ3€€‡H0€ƒ*ƒI€€€a€€a€›6Å€˜Ä€€€ƒ:€€€‹610ƒ=€€€a€€€ƒ*a€€ƒ1€€€€€‹6‹=ƒ:€a€€€€€aa€€ƒ1€€€€‡B0›6À€ƒ?€a€€€€aƒ*€€€€€€€€€aƒI˜Ä€€ƒ3€€€€ƒ*€‡?€€a€€€€‹6€€€€€ƒ:€€€a€˜Ä€€€a€€€ƒ*ƒI‡?€€€€€€€€€€€ƒ1€€€€€‹6€˜Ä€a€€€€€a€‡?€€ƒ3€€€€ƒ*ƒI€€€a€€€€›6ćI ˜Ä€€€ƒ:€€€‹6›1@‡?€€€a€€€ƒ*a€€€€€€€€€ƒI˜Ä€ƒ1€€€€€a€€€ƒ1€€€€€›6À€€€a€€€€€ƒ*€€€€€€€€€aƒI€€€ƒ3€€€€ƒ*€€€€a€‡D0€€‹6€€€€€ƒ:a€€a€€€€€a€€€ƒ*ƒI€€€€€€€€€€€€ƒ1€€€€€‹6€€€a€€€€€a€€€€ƒ3€€‡=0€ƒ*ƒI€€€a€€a€›6Å€€€€€ƒ:€€€‹610€€€€a€€€ƒ*a€€ƒ1€€€€€ƒ6‹=€€a€€€€€‹6a€€ @ ƒ/€€€€‡G0›/À€ƒ?€a€€€€aƒ#€˜Ä€€€€€€€aƒI›=@€€ƒ1€€€€ƒ#€‹?€€a€€€€‹/€˜Ä€€€ƒ6€€€a€€€€€a€€€ƒ#ƒIƒB€€€€€€€€€€€ƒ/€€€€€‹/€˜Ä€a€€€€€a€€€€ƒ1€€€€ƒ#ƒI‹A€€a€€€€›/ŇI €€€€ƒ6€€€‹/›1@ƒ=€€€a€€€ƒ#a‹;€€€€€€€€ƒI‹=€ƒ/€€€€€a€ƒ?€ƒ/€€€€€›/À€˜Ä€a€€€€€ƒ#€€€€€€€€€aƒI‡?€€ƒ1€€€€ƒ#€˜Ä€€a€‡F0€€‹/€€€€€ƒ6a€€a€‡?€€€a€€€ƒ#ƒI˜Ä€€€€€€€€€€€ƒ/€€€€€‹/€ƒA€a€€€€€a€‹B€€ƒ1€€‡B0€ƒ#ƒIƒD€€a€€a€›/Å€˜Ä€€€ƒ6€€€‹/10ƒ=€€€a€€€ƒ#a˜Ä€ƒ/€€€€€‹/‹=€€a€€€€€aa‡=€ƒ/€€€€‡G0›/À€ƒ?€a€€€€aƒ#€˜Ä€€€€€€€aƒI€€€ƒ1€€€€ƒ#€‡?€€a€€€€‹/€˜Ä€€€ƒ6€€€a€€€€€a€€€ƒ#ƒI‡?€€€€€€€€€˜Ä€ƒ/€€€€€‹/€€€a€€€€€a€‡?€€ƒ1€€€€ƒ#ƒI˜Ä€€a€€€€›/ćI €€€€ƒ6€€€‹/›1@‡?€€€a€€€ƒ#a˜Ä€€€€€€€€ƒI€€ƒ/€€€€€a€€€ƒ/€€€€€›/À€€€a€€€€€ƒ#€€€€€€€€€aƒI€€€ƒ1€€€€ƒ#€€€€a€‡I0€€‹/€€€€€ƒ6a€€a€€€€€a€€€ƒ#ƒI€€€€€€€€€€€€ƒ/€€€€€‹/€ƒ?€a€€€€€a€€€€ƒ1€€‡F0€ƒ#ƒI›=Ä€€a€€a€›/Å€€€€€ƒ6€€€‹/10›;Ä€€€a€€€ƒ#a€€ƒ/€€€€€ƒ/‹=ƒ6€a€€€€€‹/aƒ8€ @ƒ1€€€€‡K0›3À€€€a€€€€aƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€›:@€€a€€€€‹3€˜À€€ƒ:€€€a€€€€€a€€€ƒ'ƒIƒ6€€€€€€€€€€€ƒ1€€€€€‹3€˜Ä€a€€€€€a€‡6€€ƒ3€€€€ƒ'ƒI€€€a€€€€›3ŇI ˜Ä€€€ƒ:€€€‹3›1@‡6€€€a€€€ƒ'a€€€€€€€€€ƒI˜Ä€ƒ1€€€€€a€ƒ6€ƒ1€€€€€›3À€ƒB€a€€€€€ƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€›A@€€a€‡I0€€‹3€˜À€€ƒ:a€€a€€€€€a€€€ƒ'ƒIƒ=€€€€€€€€€€€ƒ1€€€€€‹3€˜Ä€a€€€€€a€‡=€€ƒ3€€‡H0€ƒ'ƒI€€€a€€a€›3Å€˜Ä€€€ƒ:€€€‹310ƒ=€€€a€€€ƒ'a€€ƒ1€€€€€‹3‹=ƒ:€a€€€€€aa€€ƒ1€€€€‡B0›3À€ƒ?€a€€€€aƒ'€€€€€€€€€aƒI˜Ä€€ƒ3€€€€ƒ'€‡?€€a€€€€‹3€€€€€ƒ:€€€a€˜Ä€€€a€€€ƒ'ƒI‡?€€€€€€€€€€€ƒ1€€€€€‹3€˜Ä€a€€€€€a€‡?€€ƒ3€€€€ƒ'ƒI€€€a€€€€›3ćI ˜Ä€€€ƒ:€€€‹3›1@‡?€€€a€€€ƒ'a€€€€€€€€€ƒI˜Ä€ƒ1€€€€€a€€€ƒ1€€€€€›3À€€€a€€€€€ƒ'€€€€€€€€€aƒI€€€ƒ3€€€€ƒ'€€€€a€‡D0€€‹3€‡?€€€ƒ:a€€a€˜Ä€€€a€€€ƒ'ƒI€€€€€€€€€€‡?€ƒ1€€€€€‹3€˜Ä€a€€€€€a€€€€ƒ3€€‡=0€ƒ'ƒI‡?€€a€€a€›3Å€˜Ä€€€ƒ:€€€‹310€€€€a€€€ƒ'a‡?€ƒ1€€€€€ƒ3‹=˜Ä€a€€€€€‹3a€€ @ëƒ1€€€€‡F0›3À€ƒ?‡3 a€€€€aƒ'€˜Ä' €€€€€€€aƒI›=@‡3 €ƒ3€€€€ƒ'€‹?: €a€€€€‹3€˜ć'€€ƒ:€€€a€€3 €€a€€€ƒ'ƒIƒB‡:€€€€€€€€€: ƒ1€€€€€‹3€˜ć3 a€€€€€a€€' €ƒ3€€€€ƒ'ƒI‹A‡3 €a€€€€›3ŇI €: €€ƒ:€€€‹3›1@ƒ=‡'€€a€€€ƒ'a‹:3 €€€€€€€ƒI‹=‡:ƒ1€€€€€a€ƒ?: ƒ1€€€€€›3À€˜ć3 a€€€€€ƒ'€€' €€€€€€aƒI‡?‡3 €ƒ3€€€€ƒ'€˜Ä: €a€‡I0€€‹3€€‡'€€ƒ:a€€a€‡?3 €€a€€€ƒ'ƒI˜ć:€€€€€€€€€: ƒ1€€€€€‹3€ƒA‡3 a€€€€€a€‹B' €ƒ3€€‡H0€ƒ'ƒIƒD‡3 €a€€a€›3Å€˜Ä: €€ƒ:€€€‹310ƒ=‡'€€a€€€ƒ'a˜Ä3 ƒ1€€€€€‹3‹=€‡:a€€€€€aa‡=: ƒ1€€€€‡B0›3À€ƒ?‡3 a€€€€aƒ'€˜Ä' €€€€€€aƒI€‡3 €ƒ3€€€€ƒ'€‡?: €a€€€€‹3€˜ć'€€ƒ:€€€a€€3 €€a€€€ƒ'ƒI‡?‡:€€€€€€€€˜Ä: ƒ1€€€€€‹3€€‡3 a€€€€€a€‡?' €ƒ3€€€€ƒ'ƒI˜ć3 €a€€€€›3ćI €: €€ƒ:€€€‹3›1@‡?‡'€€a€€€ƒ'a˜Ä3 €€€€€€€ƒI€‡:ƒ1€€€€€a€€: ƒ1€€€€€›3À€€‡3 a€€€€€ƒ'€€' €€€€€€aƒI€‡3 €ƒ3€€€€ƒ'€€: €a€‡D0€€‹3€€‡'€€ƒ:a€€a€€3 €€a€€€ƒ'ƒI€‡:€€€€€€€€€: ƒ1€€€€€‹3€ƒ?‡3 a€€€€€a€€' €ƒ3€€‡=0€ƒ'ƒI›=ć3 €a€€a€›3Å€€: €€ƒ:€€€‹310›:ć'€€a€€€ƒ'a€3 ƒ1€€€€€ƒ3‹=ƒ6‡:a€€€€€‹3aƒ8:  @΃1€€€€‡F0›6À€€‡1 a€€€€aƒ*€€% €€€€€€€aƒI€‡1 €ƒ3€€€€ƒ*€›:@: €a€€€€‹6€˜Ç%€€ƒ:€€€a€€1 €€a€€€ƒ*ƒIƒ6‡:€€€€€€€€€: ƒ1€€€€€‹6€˜ć1 a€€€€€a€‡6% €ƒ3€€€€ƒ*ƒI€‡1 €a€€€€›6ŇI ˜Ä: €€ƒ:€€€‹6›1@‡6‡%€€a€€€ƒ*a€1 €€€€€€€ƒI˜ć:ƒ1€€€€€a€ƒ6: ƒ1€€€€€›6À€ƒB‡1 a€€€€€ƒ*€€% €€€€€€aƒI€‡1 €ƒ3€€€€ƒ*€›A@: €a€‡I0€€‹6€˜Ç%€€ƒ:a€€a€€1 €€a€€€ƒ*ƒIƒ=‡:€€€€€€€€€: ƒ1€€€€€‹6€˜ć1 a€€€€€a€‡=% €ƒ3€€‡H0€ƒ*ƒI€‡1 €a€€a€›6Å€˜Ä: €€ƒ:€€€‹610ƒ=‡%€€a€€€ƒ*a€1 ƒ1€€€€€‹6‹=ƒ:‡:a€€€€€aa€: ƒ1€€€€‡B0›6À€ƒ?‡1 a€€€€aƒ*€€% €€€€€€aƒI˜ć1 €ƒ3€€€€ƒ*€‡?: €a€€€€‹6€€‡%€€ƒ:€€€a€˜Ä1 €€a€€€ƒ*ƒI‡?‡:€€€€€€€€€: ƒ1€€€€€‹6€˜ć1 a€€€€€a€‡?% €ƒ3€€€€ƒ*ƒI€‡1 €a€€€€›6ćI ˜Ä: €€ƒ:€€€‹6›1@‡?‡%€€a€€€ƒ*a€1 €€€€€€€ƒI˜ć:ƒ1€€€€€a€€: ƒ1€€€€€›6À€€‡1 a€€€€€ƒ*€€% €€€€€€aƒI€‡1 €ƒ3€€€€ƒ*€€: €a€‡D0€€‹6€€‡%€€ƒ:a€€a€€1 €€a€€€ƒ*ƒI€‡:€€€€€€€€€: ƒ1€€€€€‹6€€‡1 a€€€€€a€€% €ƒ3€€‡=0€ƒ*ƒI€‡1 €a€€a€›6Å€€: €€ƒ:€€€‹610€‡%€€a€€€ƒ*a€1 ƒ1€€€€€ƒ6‹=€‡:a€€€€€‹6a€:  @ëƒ/€€€€‡G0›/À€ƒ?‡/ a€€€€aƒ#€˜Ä# €€€€€€€aƒI›=@‡/ €ƒ1€€€€ƒ#€‹?6 €a€€€€‹/€˜ć#€€ƒ6€€€a€€/ €€a€€€ƒ#ƒIƒB‡6€€€€€€€€€6 ƒ/€€€€€‹/€˜ć/ a€€€€€a€€# €ƒ1€€€€ƒ#ƒI‹A‡/ €a€€€€›/ŇI €6 €€ƒ6€€€‹/›1@ƒ=‡#€€a€€€ƒ#a‹;/ €€€€€€€ƒI‹=‡6ƒ/€€€€€a€ƒ?6 ƒ/€€€€€›/À€˜ć/ a€€€€€ƒ#€€# €€€€€€aƒI‡?‡/ €ƒ1€€€€ƒ#€˜Ä6 €a€‡F0€€‹/€€‡#€€ƒ6a€€a€‡?/ €€a€€€ƒ#ƒI˜ć6€€€€€€€€€6 ƒ/€€€€€‹/€ƒA‡/ a€€€€€a€‹B# €ƒ1€€‡B0€ƒ#ƒIƒD‡/ €a€€a€›/Å€˜Ä6 €€ƒ6€€€‹/10ƒ=‡#€€a€€€ƒ#a˜Ä/ ƒ/€€€€€‹/‹=€‡6a€€€€€aa‡=6 ƒ/€€€€‡G0›/À€ƒ?‡/ a€€€€aƒ#€˜Ä# €€€€€€aƒI€‡/ €ƒ1€€€€ƒ#€‡?6 €a€€€€‹/€˜ć#€€ƒ6€€€a€€/ €€a€€€ƒ#ƒI‡?‡6€€€€€€€€˜Ä6 ƒ/€€€€€‹/€€‡/ a€€€€€a€‡?# €ƒ1€€€€ƒ#ƒI˜ć/ €a€€€€›/ćI €6 €€ƒ6€€€‹/›1@‡?‡#€€a€€€ƒ#a˜Ä/ €€€€€€€ƒI€‡6ƒ/€€€€€a€€6 ƒ/€€€€€›/À€€‡/ a€€€€€ƒ#€€# €€€€€€aƒI€‡/ €ƒ1€€€€ƒ#€€6 €a€‡I0€€‹/€€‡#€€ƒ6a€€a€€/ €€a€€€ƒ#ƒI€‡6€€€€€€€€€6 ƒ/€€€€€‹/€ƒ?‡/ a€€€€€a€€# €ƒ1€€‡F0€ƒ#ƒI›=ć/ €a€€a€›/Å€€6 €€ƒ6€€€‹/10›;ć#€€a€€€ƒ#a€/ ƒ/€€€€€ƒ/‹=ƒ6‡6a€€€€€‹/aƒ86  @ß›1€€€€‡K0›3À€€‡3 a€€€€aƒ'€€' €€€€€€€aƒI€‡3 €ƒ3€€€€ƒ'€›:@: ˆa€€€€‹3€˜Ç'€€ƒ:€€€a€€3 €€a€€€ƒ'ƒIƒ6‡:€€€€€€€€€: ‹1€€€€€‹3€˜ć3 a€€€€€a€‡6' €ƒ3€€€€ƒ'ƒI€‡3 €a€€€€›3ŇI ˜Ä: ˆ€ƒ:€€€‹3›1@‡6‡'€€a€€€ƒ'a€3 €€€€€€€ƒI˜ć:ƒ1€€€€€a€ƒ6: ‹1€€€€€›3À€ƒB‡3 a€€€€€ƒ'€€' €€€€€€aƒI€‡3 €ƒ3€€€€ƒ'€›A@: ˆa€‡I0€€‹3€˜Ç'€€ƒ:a€€a€€3 €€a€€€ƒ'ƒIƒ=‡:€€€€€€€€€: ‹1€€€€€‹3€˜ć3 a€€€€€a€‡=' €ƒ3€€‡H0€ƒ'ƒI€‡3 €a€€a€›3Å€˜Ä: ˆ€ƒ:€€€‹310ƒ=‡'€€a€€€ƒ'a€3 ƒ1€€€€€‹3‹=ƒ:‡:a€€€€€aa€: ‹1€€€€‡B0›3À€ƒ?‡3 a€€€€aƒ'€€' €€€€€€aƒI˜ć3 €ƒ3€€€€ƒ'€‡?: ˆa€€€€‹3€€‡'€€ƒ:€€€a€˜Ä3 €€a€€€ƒ'ƒI‡?‡:€€€€€€€€€: ‹1€€€€€‹3€˜ć3 a€€€€€a€‡?' €ƒ3€€€€ƒ'ƒI€‡3 €a€€€€›3ćI ˜Ä: ˆ€ƒ:€€€‹3›1@‡?‡'€€a€€€ƒ'a€3 €€€€€€€ƒI˜ć:ƒ1€€€€€a€€: ‹1€€€€€›3À€€‡3 a€€€€€ƒ'€€' €€€€€€aƒI€‡3 €ƒ3€€€€ƒ'€€: ˆa€‡D0€€‹3€€‡'€€ƒ:a€€a€€3 €€a€€€ƒ'ƒI€‡:€€€€€€€€€: ‹1€€€€€‹3€€‡3 a€€€€€a€€' €ƒ3€€‡=0€ƒ'ƒI€‡3 €a€€a€›3Å€€: ˆ€ƒ:€€€‹310€‡'€€a€€€ƒ'a€3 ƒ1€€€€€ƒ3‹=€‡:a€€€€€‹3a€: (@  (2 < F ÔdæAP$Œæäpåe€@ä€ùbengík½Ê%ë úüòj¼Î#ë øþÿõV4víýþø ímÀÈ$ì úü ï\{ ýÿþú ðgï7øþýôR?„Íþùû ð^-yîûýù îgûþø ìlת.íþù îiÍ»)ë ûú íg;(ë úú ïeËÃ&ê úü ðcʰ0ûÿú ífм)ê úýñaÔ¡2ÿÿù íeËÄ&æ ÿû ðbΨ/÷ýóR<|åûýù î\|úþ÷êeéŸ-ñÿÿù ìdÙ³+ë üú ìdÔ»(ë úú íbÒÀ&ë úú íbÐÃ%çþû íbÛ´*ë üú í`Õ¿'æú ìa×¼'ë ÷ú í`Õ¿'æûþÿôLAà ûüù îW!~ úþ÷ê`ôš+óþø êaá¯+ì üú ì^ßµ)ì üú ë^ܺ'ë ûù ì^Ú½&ë ùýý ì^è«+ì üù ë]ܼ&ì ÷ú ì]à·'ì ûÿû ì\á¶)ê öþõCJˆ× üûú ïM/úþ÷ ëY“'øýø ê[ìª*îþÿù ëZæ²)ì üù ëZã·'ì ûù ëYâº&ì ûÿ÷ îUš)òþù ëXæ¶'ì üÿùìWì¯)ì üù ìYî­*ë ùüû÷=MŽÔ üûû ñF7ƒøûÿþ÷ ìQ"ýýýø êTù¤)ðþÿù ëTñ­(îýù ëUì²(ì üù ëTëµ'ì úüíH)†ûü÷éUí³&îýùìTû¥)îýû îE“#ôþþò6T–Ì þúû ñ>@‰îýÿý÷ íJúü÷êO¡(òÿþø ëOùª(îþÿù ëOö®'îýù ìMõ±'ì ùþ÷2IéøûöéNù®&îüüð;-ÿþüù îG—(ÿþ÷-RžÉ þúûó7Fæÿþýù ï@+‹ ùü÷ ìF#öýø ëG¤&ñÿÿù ëG©&ðþÿù ëH¬&îýû îC˜" þÿù ìD§%ðýüñ=!Žùüø ì raina . CoolPHat(@ @ ¼#™@(€&bassÿùùõôõõõö÷øùúûûüýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(@ @ k@ä€percÿÿÿþùýþùøÿô÷þ þ÷ùûÿý ûòøý ô÷ôöý õëîü ñ÷æùýòïóø  ýððü ÿòüö íîÿõôðü þýõûüòô ýÿÿúüý ñþýüú÷ÿüüüýöÿûýþ üõûÿýÿüûþ ûþõýû ÷úù ûñûÿÿóøü ÷ü÷þýýúúÿûÿüûù÷ ÷ôûþ ÿ÷øýýûÿúöþ ÿùôðù õñõòý  õùóþ ùùûû õûûúùöúøþþüûü÷ÿ úüùïð ïðòøþóôñý ùçéöý÷çëõúøîñð öêïôýëìê÷ ùèðí ûñæíÿ  ü÷ðóý ñúòíý ëæúú  þõññ÷  ëëüÿ úûð÷þ  úëðú íæíú  îëðö  þòòñú ñõóôÿ ûôôû òïö úôïò  óñ÷ý ýúôôÿ  úú÷îÿý ýøîíú  öéñû ðòñ ÷îþ üùóúý ýþüúøù üÿôúÿ ÷úöø úõòý þý÷ñö  ÿììô  öëñõôïîìü÷òëöý ÷ððú ûøóùü öôëüùúððó  üìñòõïæ ûôóöþ ùõðòû ùýóïú ýùîíû þýñòø ôéôûüóöñù ñìîý ýøçóÿ ÷÷îõ ý÷øô þ÷úü úöüøû þù÷üÿý÷øüÿý óÿ÷þ üû ù÷ÿÿ üýþ üüþø öûø ÿþöùþû üïúü øú÷ÿþüûÿþþÿü÷õ ûûÿó÷ÿüïñúûöúùõý üúûùþ ýóùû üó÷ý  ÷îóû ûùøöö  ûòìôû þøîð÷þ ûõòïù ýûõö÷ ÿôúö÷ý ûöï÷û  üùìüü ýøï÷ üóùùþÿøòú øôù  ô÷ö÷ úûöôúô÷ùù ùð÷ýý ûþñõ ÷ðýú õÿõù ýùï÷ÿ ÿÿúùýýýÿóõú þ÷ñø ûúü÷ùü þÿ÷þ ôóý ÷ô÷ ÿùûýöþ ûõïû øøúö þõõö üðöúúòþþ ÿ÷ö÷ü þûþúþýÿýúý÷õ üùó üÿüýþýÿô þûþ÷õýõôû ûõûûû þðîü üö÷ðôòìóú ûùø÷ þü÷ôû û÷óñý  ýöìòÿ ÿóéî ÿíî÷ùïäïóòíïöÿöðíðþ óèð  ýøõö÷þ þî÷õù ÷ìò÷ òïïú üþðôú ýöúþýú ûù÷ö ûøúûÿ÷üúþ úúúùÿýüüù ýýüþûþÿÿ ûúúþú üóúûþ þîðøùøñøþ  ôíîù  öìîù  ðð÷úþ÷ïó ÿúóóü ýðõúú  ýöôûûúõûú û÷üþ üþþÿýýýþûÿþýþÿøÿýýþüþûþûþüûþûúøûÿõü ÿýþüÿþûþýúÿøûýþýýÿ÷þÿøüþÿûú üýÿúÿüüÿõúÿþúùúû ÿúõúúûüúÿôðÿüúû÷û ÿôùóøûôò ý÷ôøøùøø ÷ñôø õóîû ýõùöý üöö÷ ûúøûú ûûÿüýýþÿøÿý þúùÿÿþþüýþþýýýÿÿþÿúþùÿþüÿýÿþûýýõÿùúû ùøøþýþüþüþúûüÿ÷ûûýýüÿúþÿüÿÿüÿüÿúûúûûûýû÷ÿ ýùùó øðó öóüü÷øþýýýÿ÷ûþûþúýþûüúþþ øøö ýôôýý÷öüû ÿôòýÿ þ÷îöü øöòõþ ø÷ñôûýõìðüÿïíðü ýîêö úìð÷ ýüôõù ÿøòþþúùùûüüýúûþüùýÿù÷ø þôôý ÿûö÷û ü÷úû öüûý ýûûøþý þýúóù ûüüûü ÿóýü ýðûýõøÿúúýýý ùùûù÷öôý þ÷ûüú þøøøÿ ûöÿ÷ ûùûÿÿÿûüûüüô÷ý øùõûþ  ÿúùöýÿ úöûýþýúûýý ýþ÷ùþ üûüü üýûøþúøûÿþ þýùýÿÿüþüüýüôú ÿøöû õûýýþøõûÿþøùÿøüûû þøùüø ÷úüû ûùüýýþÿþýþûúûþþùûþüþùþýüùúûüÿú÷þúùùöþ þ÷÷þ ûøüûÿûüýýýýÿúþÿüüþüùÿÿûüþþÿüúþýýûøýþùþüúÿ ûøùüÿ þöòýôøü ùóõü ÷ñúù ûõ÷öü øóôü ùôòú ôòöùøòòò  ûóëîúòíôú ýóððú  ü÷êòÿ  ý÷ðöû úõñ÷ ÿ÷ó÷ý üúóø øøùûû ÿ÷öôü  ÿ÷òñú  úîñù õññù üôõøþ þùøùý üþ÷õÿ üôöû ùüúýÿÿüûþÿúûÿúûÿþÿÿüÿþûÿýþúùõÿ þõøüþúõüýù÷ý üøúû úùüû þõøýü  ÿõóøùú÷ÿøüÿûÿýù ý÷üûüúûýûøþþøõû þ÷úÿùýýþüûýÿÿÿýþþýýûýÿÿüÿþþûýýüýþÿÿÿüýÿýüÿûÿüüÿøüþüÿþþþüûûÿÿüüýþþþüúýøøýÿûûýþú÷ÿ þøõþþÿûøýÿýüûýþüÿûÿýÿÿþüüÿÿûþýÿûýýýþýþúÿüüýþþúùûüöüýýþúöøÿ ýú÷õÿ ÿûöøü ùòõûûóöøýüû þúÿÿþþøúý üûùú ÿûôúÿøõýÿø÷þúúúýüüüþýüýýþþûúþÿÿÿýýÿÿþüÿýÿýÿþüüþÿûûþþûûýú÷ûþüþýÿþüúûùýþÿÿýúÿÿþöúÿ ùùùû ýùúúû  ÿûõôü üûóø÷øþüþýüþüûþÿýüÿÿÿûýüöùúøüü ûùûû þõùÿÿ÷õüÿùù÷ úùûÿüøþÿûýýÿÿÿÿúÿúúÿþþü÷þ þøöþý÷üÿþþýþþÿýÿþöÿþýþûúþÿüûûÿùùûùöýþüûþýýûûûÿ þûøöúùùÿû÷úüùøýùûýÿýüþÿúûþÿÿûüüþÿýþÿÿýÿþýþÿþþþÿýûÿÿûûûÿüþúúüùûûþõöù ÿøöøþ öóõý ÷õóø þ÷õïø  ùòñö  ûõ÷ôø  ûóô÷ý ùô÷ú öøùü þúò÷þ û÷øöý ý÷÷óû ÿøöøû ÷÷úøÿø÷ûý ÿú÷ôþ ýõóýýüüúþûúùüÿüüýýýÿÿûùû úûöú ûööø ûöõú þøøüýøùûýù÷þüúþþúýýúýüþüÿùûýý üûúýýøùýþûûÿýýûúýúúúþ ýøøþ ÿú÷úü ýÿüúú ü÷÷þýúùû þøúûþúöÿüüûûüüûúþþ÷ùüýùúÿþþüýþúüýÿüüýüüûüüûüûûþÿÿùþûüýûýÿüüýþúüþþüÿÿÿþþýýþþüýþÿûÿþÿüýúýýüùþÿþüÿþþýûþüýþúüþþþûûÿüþþýÿÿüþÿÿýüÿþÿûüþüýþýÿÿÿþüýÿÿþþýÿþÿÿýÿþÿþýýÿÿÿýýÿýÿÿþÿþÿýþÿýýýþüÿûøüÿúúýÿüùýýûùþÿüýýýýÿÿüþüÿúþÿþþýÿüþþýüýÿþþûüÿÿÿûþþýÿýýÿÿþÿÿüþÿÿüÿÿþÿþýÿþþþþÿÿÿûÿþýüûüüûÿýþþûýýÿÿýÿÿÿþÿÿþýþýÿþþþþüýýþüýûûÿûÿüûúÿþùúýýùûÿþùùýÿþúúÿüüüÿüûÿüûþýþúüýýþþýüÿÿýÿýýÿÿÿþÿÿþÿüýÿÿýýþÿÿþûþüþüýÿÿûùüüûûý ÿûøüþøúýûüþþýúÿýÿýþüüÿÿÿþÿÿþûÿÿÿþÿþýþþüüþÿþýûÿþýÿýýýüþþûþþûýþÿûûÿÿýþÿþüþþüþÿþûþýûþûüÿûûüÿúúýÿýýüÿûùþüüüþþüüýûÿþýýÿÿþüþÿþþÿÿÿþÿþýüÿÿþÿÿÿÿþþþþþýÿÿþþÿÿÿüÿÿÿÿþþÿÿýþþþÿÿýþþÿüüþÿûÿÿÿýþÿýþÿÿýþÿûýýýþýÿûüþýüþûýüýûýýüýþÿýþýþþþýþüÿþüÿþüüüÿÿþúýÿþýýþÿýÿüþüüÿþþûüÿýûúüúýûýüùûýþûþüþýýþþýûÿþýþÿÿúýÿýûþþÿüýýüÿÿûûÿûûÿþüüýÿýúüÿüüþýýýþýûüÿþüüÿÿüýþþüýýüûýÿûúþÿþüüýþüýþûýýþþþüÿþûýÿýýþÿÿýýÿÿýýýÿýýýýýþÿþýûþþûüÿþúûýûýýþýüýÿüÿþþûýÿÿýûýÿûûüþüúýþþþùúüýýýÿþþýþÿÿÿýÿýÿÿÿýÿÿþýþüýÿÿýþþþþýÿÿýüþÿÿþÿýÿþÿýÿÿÿþÿþÿÿÿÿÿþýÿýÿÿýþþþüþþýüþþüþþýþÿÿþÿÿýýþÿþûÿþþýþþýýÿýþþÿÿÿüÿÿüýÿûüÿýüûþûûüûûüÿÿûúüÿüûýþüûþþüüÿþþþÿþûýþþþýþþÿÿÿýÿþþÿÿþÿþýþÿýÿþÿýüýþûýÿÿüþþÿþÿÿýüÿýÿüýýþýüþÿÿûùýüüúýÿýûúþüûüþÿûúûþûûýþüýýÿýûûþÿüûýþýüüýüúüýúûþüüüýûûþÿþúüýýúúþÿýýúüÿûúüüüùþúúûÿþûûüüùùþÿúøúÿùøúÿÿù÷úÿþû÷úþøùûýüúúýüøùÿþûúûÿûûûÿþüûûüûþþÿýûüÿýýþüüþþûýþþýûýýüýýüûÿþüþÿÿýþÿÿýÿÿÿþÿÿÿþÿýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿÿÿþþýþþþýýþýÿþÿþþÿÿþþÿþÿýÿÿÿþÿÿÿÿþÿÿÿþþþÿþÿýÿÿþþÿþþþÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿ trying out(@ @ ½½Å€leadÚ ûü milkytracker 2005milkytracker-0.90.85+dfsg/docs/0000755000175000017500000000000011317506147015360 5ustar admin2admin2milkytracker-0.90.85+dfsg/docs/readme_OSX.html0000644000175000017500000000273510737746457020262 0ustar admin2admin2

Important notes for OS X users


Please note that on OS X the command key is used instead of the Ctrl key.

This is because you can simulate a right mouse button click by pressing

Ctrl+Left mouse button.

Also, due to difficulties in detecting caps lock key down/key repeat

events, on OS X it's not possible to enter a key off "note" by pressing

caps lock. Use the "1" (one) key instead.

Playing the song / pattern by pressing right Ctrl / right Alt isn't possible

either. Press Enter / Ctrl+Enter instead.


If you can help me in solving the caps lock and or the right Ctrl / Alt

issues on OS X why don't you contact me :)

milkytracker-0.90.85+dfsg/docs/TiTAN.nfo0000644000175000017500000000324111317477251017006 0ustar admin2admin2 ___ . _ o ___________ /\_\\__ __ _ T i T a N (_) ___ _\ ____ \_ \/_/ ____________ _ _________ ._\___. / \ //\ _ _\_ ____ \_ ____ \_ \/ | ___/ \__// \ | _|_ __ _ / \ / | / \_ \ | : _ _/ \__/ .| __ ____ / \ | / \_ :| __ _ _ \/ (.)(o) \ ____| _ ____ / |_____| /_/\\ . - o - \ | H2o! \/ \_\/ / \ |_____________ ___ __ _ /______________\ Titan Presents: MilkyTracker v0.90.85 - The multiplatform Fasttracker II clone - Released on 01.01.10 See MilkyTracker.html for details. --------------------------------------------------------- Code.........: pailes Deltafire GFX..........: kenet raina Demo songs...: svenzzon Strobe & Kmuland raina ASCII art....: H2o --------------------------------------------------------- WWW: http://milkytracker.org/ http://TitanDemo.org/ IRC: #MilkyTracker on EsperNet #TitanDemo on EFnet milkytracker-0.90.85+dfsg/docs/ChangeLog.html0000644000175000017500000006146611317477251020115 0ustar admin2admin2 MilkyTracker ChangeLog

MilkyTracker ChangeLog

01/01/10 (v0.90.85):

Whats New:

  • Ability to move dialogs.
  • Keyboard shortcut Shift-U (unmute all).
  • Unix/SDL version now uses system libzzip.
  • Updated section panel to handle multiple pages.
  • Basic quicktime support on OSX.
  • LHA archive support.
  • Colour table import/export.
  • gzip compression support.
  • New font: IDC-Harmonica (12x12)
  • New font: IDC-MicroKnight (12x12)
  • Ability to detect desktop display resolution.
  • Added '1' as note-off key in MilkyTracker mode.
  • Ability to adjust screen magnification factor.
  • Milkyplay license changed from GPL to BSD (MilkyTracker remains GPL).
  • Working close button in OSX.
  • LZX compressor support.
  • Improved constants for 10 band EQ.
  • New font: Topaz 1.3 & Topaz 2.0 (8x8)

Bugs Fixed:

  • (Unix) JACK client thread gets zombified causing playback to block.
  • Crash when using the '-orientation ROTATE90CW' switch on SDL versions.
  • Screen input lock after showing a system message.
  • Bug in xm loader for old xm variant causing 8 bit samples to not load correctly.
  • Added FT2 note range clipping to live playback.
  • Improved live recording note-off.
  • Crash when unable to open a directory.
  • Experimental mod exporter fix.
  • Volume scale default volume for empty instrument/samples.
  • Modplug XM importer fix.
  • Crash when MilkyTracker attempts to load a non-existant file.
  • Dialog initalization bug (caused focus to miss in edit fields etc).
  • Font selection bug.
  • Mouse repeat bug on SDL version.
  • Small bug in SDL Midi code.
  • Little bug in the advanced edit panel (limit of subsequent channels).
  • Undefined .XM sample type 0x3 causes sample loop to appear "one shot".
  • Instrument vibrato depth value gets doubled when copying instruments.
  • PSM loader can now store sub-song information correctly.
  • XM loading problems with 16-bit odd sample sizes.
  • Support for callbacks on systems that don't use C style function calls (ie, OS/2)
  • Instrument fadeout value initially doesn't match the slider position when adding new instruments to a loaded module.
  • Selecting an instrument with the numpad doesn't update the instrument or sample editors with the selected instrument, but with the previous one.
  • Bug in auto-detection of playmode for XM modules (panning was not set).
  • Set envelope position after sustain points.
  • Ignored lower 3 bits of finetune for more accurate FT2 playback
  • Crash while loading sample during playback
  • Screen refresh issues
  • Problem with French keyboard layout.
  • The current pattern length under the song title isn't updated when the mod is zapped.
  • Shrinking a 2-row pattern isn't possible.
  • Undoing an action doesn't register as a change.
  • A slight graphical bug occurs when using the seq and cln buttons on the FEth pattern of a mod.
  • Crash when converting sample resolution.
  • Freeze on exit when using DirectSound on Windows 7.
  • Lots of other smalls bugs not worth mentioning.

04/13/08 (v0.90.80):

Important note:

This version of MilkyTracker will update your current configuration file in a way that it's no longer usable with older versions. It is recommended that you keep a backup of your configuration file. On Windows the configuration is stored in the application folder. When using MilkyTracker on OS X or Unix systems the configuration is stored in your home directory in a file called .milkytracker_config.

Whats New:

  • Killer feature: Open up to 32 modules using tabs(*):
    • Allows simultaneous playback of different tabs
    • Copy pattern data/instruments/samples between tabs
  • New resamplers for improved sound quality:
    • Cubic Lagrange
    • Cubic Spline
    • Fast Sinc (window size 16, fixed point integer, sinc lookup table)
    • Precise Sinc (window size 128, double floating point)
    • Amiga 500
    • Amiga 500 LED
    • Amiga 1200
    • Amiga 1200 LED
  • Render parts of the song directly into a sample slot (from HD recorder)
  • Live switch toggle [L]
  • Track splitter insert note off toggle
  • Sample editor shows time in milliseconds according to currently selected relative note
  • Notes on muted channels appear in grey on the piano
  • Scopes also available with smoothed lines
  • Added option to always mixdown stereo samples, no more questions ;)
  • WAV loader recognizes loop points and also exports them

(*) Only available in the Desktop version of MilkyTracker

Bugs Fixed:

Replay

  • Fixed bug in bidirectional looping which caused clicks on short samples
  • Introduced smart loop area double buffering to eliminate sample looping clicks
  • Fixed issue when switching between 4xx and Vx
  • Fixed issue when having a Dxx on the last order and restart is not zero
  • Milky's note range was going slightly higher than that of Ft2's.

Other

  • CRASH/FREEZE: When trying apply crossfade on invalid selections in sample editor.
  • FREEZE: Optimize song can freeze MilkyTracker if the displayed pattern number no longer exists after optimization.
  • Bug in the XI-loader causes instrument vibrato settings not to be applied until some instrument setting is modified.
  • Cutting arpeggio commands by selecting only the operand digits leaves invisible 000 commands on the pattern that repeat the previous arpeggio from effect memory.
  • GUS patch loader note mapping more accurate now
  • Some custom screen resolutions lead to distorted rendering.
  • The Apple AIFF loader doesn't load big endian samples correctly.
  • Rewritten major parts of the GUI & editor code to be more reliable.
  • Countless bugs you might not even have found yet

05/20/07 (v0.90.60):

Whats New:

  • New imported (obscure) module formats (mainly for personal satisfaction):
    • Another DSM format (Digisound Interface Kit library)
    • Another AMF format (DSMI library)
    • SFX (SoundFX)
  • Basic AIFF loader (Apple Sound Format, only reads uncompressed AIFF but allows for importing CD tracks directly on OS X)
  • Four new 8x8 fonts (thanks to idc and Rez)
  • Set custom screen resolution
  • Scrollbars in the list boxes dynamically show/hide depending on content (saves some space)
  • Row preview with Shift+Space
  • Song Preview Alt+Space
  • Integrated disk browser (click "flip" in the disk operations panel)
  • Sample editor got EQ filters now (3 and 10 bands)
  • Sample editor got waveform generators for sine, square, triangle and sawtooth
  • Solid scopes (ProTracker style, toggle in the config under the misc. tab)
  • Pattern replay is a bit more like Ft2 now (switching to different pattern doesn't reset cursor to row 0)
  • Clone button to clone the current order
  • "Mix paste" in the sample editor: paste in a sample from the clipboard and get it mixed with the current selection/entire sample.
  • As usually: more Ft2-compatible replay

Bugs Fixed:

Replay

  • A severe volume ramping bug has been fixed
  • Instrument auto vibrato ramp wave forms were swapped
  • Fixed several issues in the replayer which were causing problems when using EDx and Mx and similiar combinations

Other

  • Orders containing pattern number FF vanished from modules saved from Ft2.
  • Loading arbitrary files as samples adds the filename to the sample text.
  • The y-axis in the sample editor was flipped (negative side was on the top).
  • Toggling scopes in the config with the keyboard left the checkbox unaffected.
  • Crash: A bug in the IFF reader crashes MilkyTracker when loading some IFF samples.
  • Crash: After adding channels and saving as MOD.
  • Saving MOD with extended octaves (5 instead of 3) produces results like FT2 now.
  • Crash: (on Linux x86_64, strange behavior elsewhere): Caused by illegal 16-bit zero-length samples, as saved by Soundtracker.
  • Crash: when loading modules without instruments.
  • FREEZE: when zooming way in/loading LOOONG instrument envelopes.
  • FREEZE (on Windows Vista): when initializing audio on startup.
  • Assigning samples to notes in the instrument editor by clicking and holding (painting) doesn't have effect on C-0.
  • Certain hot words in song titles cause incorrect module format detection (improved at least ;)).
  • Clear button above sample box didn't work properly.
  • Dxx on the last row of a pattern caused a display error when xx is greater than the number of rows on the current pattern.
  • Insert silence screwed up 16 bit samples.
  • Instrument panning settings defaulted to center on key-release when key-jamming.
  • Optimizer functions "Minimize all samples" and "Samples to 8-bit" triggered one another when only one of them were selected.
  • Selection block is truncated to current pattern length (you know, after being taller on a taller pattern).
  • Several things like applying sample editor filters and using the optimizer reset global volume.
  • Other things I can't remember :P

09/26/06 (v0.90.50), Tons of fixes and added features:

Whats New:

  • New platforms supported:
    • FreeBSD (x86)
    • Linux (x86, x86_64, PowerPC, ARM, GP2X)
    • Solaris 9 & 10 (SPARC)
    • Windows (ANSI)
    • Windows CE Handheld PCs and the Gizmondo
  • New imported module formats:
    • DBM (DigiBooster Pro)
    • GMC (Game Music Creator)
    • IT (Impulse Tracker)
      • NOTE: MilkyTracker will remain an Ft2 clone, importing converts everything to this environment and accurate playback is not pursued. It's just like with the rest of the imported formats apart from MOD and XM.
      • MORE IMPORTANTLY: MilkyTracker refuses to import modules with more than 32 channels. It's not that the XM format couldn't handle it but the Fasttracker II framework doesn't, so there.
  • Low-latency audio driver support:
    • ALSA on Linux
    • ASIO and DirectX on Win32, thanks to RtAudio
      • 48kHz mixing resolution now available also on Win32. NOTE: MMSYSTEM/WaveOut can't handle 48kHz, so don't mix these two.
  • Adjustable MOD channel panning
  • Adjustable opacity for muted channels
  • Alternate view in the main panel showing Add, Octave and Global volume values
  • Fasttracker II edit mode and scrolling style loaded by default
  • MIDI in with velocity and note delay/off recording (works on your QWERTY too), thanks to RtMidi
  • Module optimization panel
  • Pattern row highlighting, two independent intervals
  • Sample editor noise generators
  • Selectable pattern/UI fonts
  • Skippable splash screen
  • Volume boost/fade dialogs accept negative values (useful for chip sample generation, sample phase inversion etc)

Bugs Fixed:

Replay

  • A rogue EDx note delay without a note should retrigger the previous note when x is lesser than or equal to song speed.
  • EDx+EEy, that is delayed notes on a pattern delayed row played when x was larger than or equal to the song speed. Sadly, this shouldn't happen according to Ft2, thus it doesn't anymore.
  • E5x finetune setting implemented.
  • E9x note retrig was a little off, now it's ever closer to Ft2.
  • F00 speed setting wasn't implemented, now it stops playback
    • Fasttracker II slows down to advancing one row every 10 or so minutes. If you can justify this behavior, i.e. convince us how you can rationally utilize it (a 10 minute pause) in a song, it will be implemented.
  • K00 did not send a noteOff but set the volume to zero.
  • Mx volume column tone portamento acted as M0 when starting a song from scratch and you couldn't actually enter an M0 because a 1 was was automatically filled in as the parameter. All fixed and dandy now.
  • Rxx multiretrig, see E9x.
  • Something clicked in the mixer, literally. Now smoother than a baby's butt.

User interface

  • A channel could get stuck playing only one instrument when volume ramping was off. Ain't life peculiar?
  • A crash happened when selecting a range in sample editor and the mouse was released outside the MilkyTracker window followed by a cut or copy operation. You see the selection was still in progress and the poor tracker got confused because it didn't know where the range started/ended.
  • A pattern that was deleted from the orderlist remained on the screen.
  • An instrument stayed selected after it had been removed with the minus button.
  • Block operation areas did not always match block selections.
  • Global volume wasn't reset on stop/play.
  • Key release now effects the correct note (not necessarily the note that is playing).
  • Multisample instruments got rearranged/optimized automatically.
  • Scrollbar positions were reset upon screen switches. Added botox.
  • Standard-breaking XI instruments (w/ stereo and more than 16 samples) were crashing MilkyTracker. Now stereo is converted to mono and surplus samples are dismissed.
  • The MilkyTracker window insisted on staying topmost after switching from fullscreen to windowed.
  • The F10 key brought up the system menu on Win32. Now it just jumps to row 10h like it's supposed to.
  • The selection disappeared after pasting a block. Doesn't anymore.
  • When tabbing to a channel outside the current display, the screen shifted one whole "page". Very confusing for young, fragile artists. Now it moves one channel at a time, à la Ft2.

02/14/06 (v0.90.30), Mainly bugfixes and minor additions:

Bugs fixed:

  • ProTracker modules using 'one shot'-looped samples seem to crash the replayer sometimes. Fixed.
  • There was a bug in the mod exporter when trying to export samples with a loopstart set to 0. Fixed.
  • The windows version would crash when inserting MANY points between two points in an envelope. Fixed.
  • The right-left combined mouse click on the scopes didn't work properly. Fixed.
  • switching between the loop types caused crashes. Fixed.
  • Redo filter seems to crash/erase sample in the win32 version. Fixed.
  • Retrig command was still a little bit buggy (when used in combination with delay note). Fixed.
  • Arpeggio was still a little bit buggy (won't be noticed when tickspeed%3 == 0). Fixed.
  • Putting a position jump inbetween a pattern loop will cause the song length estimator to hang in an infinite loop. Fixed.
  • Trying to enable the volume envelope when it says 'none selected' in the envelope editor Milky would crash. Fixed.
  • Block transpose up/down was buggy. Fixed.
  • Pattern Len display isn't updated to reflect new length after block was pasted and pattern grew. Fixed.
  • Scopes didn't update after loading samples/instruments
  • Dozens of other fixes…

Features added:

  • Multichannel record/keyjazz/editing (like in FT2)
  • Disable pattern grow when pasting
  • Enable "by channel tabbing" (like in FT2)
  • Instrument quick select using numerical keypad
  • Select sample within instrument in FT2 edit mode (Shift+Alt+Up/Down)
  • Emulate insert key with Ctrl+Up in the OSX version (select from the OSX main menu under option "special")
  • Dragging files from the win-explorer/osx finder into the MilkyTracker window loads the file (works for modules, instruments, patterns, tracks, samples etc.)
  • Load/Save IFF samples
  • More WAV sample types recognized and loaded
  • Improved Protracker compatibility
  • More options on the replayer for improved module playback compatibility
  • Playmodes can now be saved to be the default playmode
  • Even more FT2 keyboard shortcuts (F9-F12, look in the doc for more info)
  • Even more customizing support, see config.
  • PocketPC: Added scopes as well
  • PocketPC: Jam page with extended keyboard or pattern

11/29/05 (v0.90.00), Lots of improvements, really can't remember them all:

  • Improved mixer, improved FT2 effect compatibility (especially tremolo, tremor, vibrato)
  • Scopes (finally) (only for Desktop versions)
  • Configurable colors (config->layout)
  • Disk writer (Ctrl+R)
  • FT2 like pattern follow: cursor line always in center center
  • Prospective mode and toggle follow song mode
  • Volume scale (Shift/Alt/Ctrl+V like FT2)
  • Load GUS patches (needs to be loaded as instrument)
  • Load every file as sample (good for making noise samples)
  • Dozens of sample filters
  • Reworked GUI (especially menus)
  • Sample offset can be shown in sample editor
  • Drawing samples (but remember to turn on looping, otherwise doesn't sound good ;))
  • Toggle Hex count for rows in pattern editor
  • Show zero effect as 00 instead of dots (see config->layout)
  • Improved Protracker 2.x, 3.x replay modes (see options)
  • Skip through song while it's playing (with cursor keys or scrollwheel)
  • Time length calculation/play time meter
  • Peak meters
  • Sequencer button (see order list)
  • Hold the Alt Key in the sample editor to move entire loop not only loop/end
  • Tons of other fixes…
  • More things to find out…

10/07/05:

  • Fixed crash when saving .MODs
  • Implemented Lxx command (set envelope position)
  • New: Hold down Ctrl (Apple on OSX) to resize selection in sample editor
  • New: Zoom sample in/out by using the scroll wheel of your mouse
  • New: Swap channels (select source with cursor and swap with destination channel by menu)
  • New: Split track (spread notes from one channel across subsequent channels)
  • New: Use virtual channels when playing instruments (enable in config first) (instruments played on virtual channels won't cut instruments used in song)
  • Other stuff (don't remember all of it)

09/01/05:

  • Fixed lots of crashes =)
  • cut/copy/paste works in sample editor (hopefully, not much tested yet)
  • you're able to change default screen resolution but you need to restart MilkyTracker to apply
  • Save patterns/tracks in FT2 formats .XP/.XT
  • Save Protracker compatible mods
  • Fixed some small issues

07/01/05:

  • Fixed lots of crashes
  • Undo/Redo in sample editor (cut/copy/paste is following soon)
  • Minor cosmetical changes
  • Vibrato volume command now works in pattern editor (press "v")
  • Vibrato speed volume command now works in pattern editor (press "s")
  • X command works in pattern editor
  • MOD loader now recognises 15 channel mods
  • Added "large" font for tracking <= 4 channel songs ;)
  • Del. key can be used for deleting note+ins./volume/effect

06/22/05:

  • !! Fixed bug that caused MilkyTracker to crash when selecting empty samples (sorry for that one)
  • Fixed bug with ALT+F4 when using FT2 shortcuts and Windows =)
  • Paste of tracks and patterns always insert at row 0, not at cursor
  • Added possibility to expand orderlist listbox
  • Added predefined envelopes
  • Changed instrument color (one day it will be possible to select your own colors ;))
  • More minor fixes

06/13/05:

  • Improved sample position markers
  • Added envelope position markers
  • Improved XM replayer (fixed FT2 note clipping when playing arpeggios)
  • Added more FT2 keyboard shortcuts (Ctrl+I, Ctrl +S, Ctrl +X etc.)
  • Minor fixes + Additions
  • Added support for mouse scrollwheel
  • PocketPC: "Full" onscreen keyboard (probably still buggy)

05/27/05:

  • Right (1st) & Left click (2nd) on channel box cycles between solo channel/unmute all (Alternatively hold ALT key and left click on channel box)
  • Del. now deletes note & instrument in FT2 mode
  • Pattern scrolling is now buffer independent on Win32/WinCE (Not necessary under OSX because of much smaller buffer sizes =))
  • Added another pattern scroll style (cursor scrolls to the center and keeps center until the last page)

05/22/05:

  • Due to request MilkyTracker now features a FT2 compatibility mode. You can switch between MilkyTracker (modern ;)) and FT2 edit modes in the config screen. (See MilkyTracker manual for details.) Note: Not all FT2 commands are implemented yet, but the most important ones for editing are included.
  • Hopefully fixed some keyboard layout problems

05/14/05:

  • Fixed some "focus" issues
  • Divided "save" option into "save" and "save as…"
  • Added value interpolation (available in the "Advanced Editor")
  • Fixed an instrument load/save issue
  • PocketPC: Fixed bug, which prevented the progress bar from disappearing when saving instruments/samples.

05/06/05:

  • Minor optimizations making the GUI more responsive
  • Toggle focus of pattern editor by pressing space
  • Play song from current order by pressing enter
  • Play pattern by pressing ctrl+enter
  • Play pattern from current position by pressing shift+enter
  • PocketPC: Explicit hiding of SIP (does this solve any problems?)
  • PocketPC: Minor facelifts

04/29/05:

  • Added possibility to swap/copy samples from one instrument to another
  • Fixed major bug in XI loader
  • Increased button autorepeat delay
  • PocketPC version: GAPI is now properly shut down before opening the common file dialog

04/25/05:

  • First "official" PocketPC pre-release.
milkytracker-0.90.85+dfsg/docs/readme_unix0000644000175000017500000001226711317477251017616 0ustar admin2admin2README for MilkyTracker SDL Versions ==================================== This file contains information that is specific to the SDL versions of MilkyTracker. Please read this file in addition to MilkyTracker.html Milkytracker should in theory compile and run on any posix compatible operating system. However, the build system requires a working C++ compiler and associated libraries/includes, Bash compatible shell interpreter and compatible version of Gnu Make. Please read the README file in the top-level source directory for build instructions. Currently the following platforms have been tested: - Linux x86 x86_64 powerpc arm (GP2X/F200 etc) - Freebsd x86 - Netbsd x86 - Solaris sparc - Other PSP (it will run, but user input not implemented) AmigaOS (known problems) AROS (known problems) Since the change to open source/GPL, binary distributions of Milkytracker are no longer supported (apart from OSX and Windows/Windows CE). The options are to build the binary from the source archive, or to use a pre-built binary possibly supplied by your *nix distribution. It is advisable that you run MilkyTracker from the command line (at least the first time you run it) as it will output some messages informing you of what audio driver it is using as well as any errors that occurred. MIDI (Alsa only) ================ If available, MilkyTracker will detect Alsa and configure itself as a Midi receiver. You can then link MilkyTracker up to a Midi sender in the normal manner. You can enable midi velocity recording with the following command line argument: $ ./milkytracker -recvelocity Midi velocity recording only works in live record mode (pattern is playing). Midi support is currently only available on the Linux versions. Audio Driver ============ SDL *should* detect the best available audio driver on your system, however if this isn't the case you can set the environment variable 'SDL_AUDIODRIVER' to configure SDL to use the driver of your choice. Some known values to try are 'alsa', 'dsp', 'arts', 'esd'. For example: $ SDL_AUDIO_DRIVER=alsa ./milkytracker Note that due to weaknesses in some audio configurations we have had to force MilkyTracker to use 2^N audio buffer sizes. This option can be disabled in the config menu and this is recommended if your audio driver will accept it. * New for version v0.90.80 * Two new audio drivers have been added; ALSA and JACK. JACK by default does not attempt to guess which output device to connect to, the connection should be made manually. Video Driver ============ MilkyTracker should auto-detect your screen mode, however if it doesn't there are the following command line options: -bpp N Set N to either 16 or 24 -swap Swaps the red and blue values in 24 BPP mode -orientation Valid arguments are NORMAL|ROTATE90CCW|ROTATE90CW -fullscreen Does what it says The screen size can be selected in the Config->Layout menu. Fullscreen mode can be toggled using ALT+Return. Note that these arguments are likely to be removed in the future - drop us a note if you actually need to use them. Crash Handler ============= Hopefully you should never need to know this, but just in-case the unthinkable happens MilkyTracker has a crash handler which should intercept most crashes (but not freezes!). If this does happen, a message will be outputted to stderr and MilkyTracker will attempt to save a backup of the song currently loaded. This will be named BACKUPxx.XM and saved in your home directory (where xx is a sequential number in the range 00 to 99). If MilkyTracker should crash, please attempt to reproduce the crash and then post details on the bug forum so we can attempt to fix whatever is causing it. GP2X Version ============ This version is currently incomplete - however the basics are working, and you should be able to load/play tunes (even compose - if you are patient!). The following script (named milkytracker.gpu) can be used to load up MilkyTracker and return to the menu once it's exited: --- cut here --- #!/bin/sh # Start MilkyTracker: ./milkytracker # Sync SD card: sync # Return to the menu screen after exiting MilkyTracker. cd /usr/gp2x exec /usr/gp2x/gp2xmenu --- cut here --- The mouse pointer can be controlled using the d-pad (it is accelerated with 3 speeds). Press the d-pad to click, or press the start button to begin playback. GP2X control is likely to be improved in future releases. Asus EEE PC =========== This machine has problems which prevent Milkytracker from functioning properly. The default Linux install has a broken version of the SDL libraries, most users replace the default install with another Linux distribution which seems to fix the problem with Milkytracker seg-faulting on startup (the seg-fault is generated in the libSDL library). However, even with a different distribution installed all is not good. It seems that the graphic-intense nature of Milkytracker causes the audio to stutter on playback. It is not clear what is causing this symptom, but it has reported that routing the audio through JACK solves it (SDL and Alsa are affected). Any suggestions or bugfixes (ideally :) are appreciated. Enjoy! - Christopher O'Neill (Deltafire) 19/8/2006 milkytracker-0.90.85+dfsg/docs/EqualizerDesign.doc0000644000175000017500000006600011000267720021132 0ustar admin2admin2ÐÏࡱá>þÿ 13þÿÿÿ0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥Á @ ð¿²bjbj00 .&RbRb² ÿÿÿÿÿÿˆ2222222F....,Z$FöŠŠŠŠŠeee‡‰‰‰‰‰‰$þRP|­2AeeAA­22ŠŠÛÂÿÿÿA 2Š2ЇÿA‡ÿÿ22ÿŠ~ à&4_ñÆ.K ÿ‡Ø0ÿÌU ÌÿFF2222Ì2ÿˆe"‡ÿŸ³Žeee­­FF$ j Äõ FFj Equalizer Design Introduction Hello, Please find enclosed the class for the parametric equalizer. This class can be used to create parametric equalizer objects of which you can create as many as you would like for your EQ. For example, if you make a 10 Band EQ you would want to instance 10 EQ objects. Each EQ will either boost, cut, or do nothing to the sound depending on what ‘gain’ values you pass it. Using the code First, include the class #include “Equalizer.h” Create an Equalizer object Equalizer eq; Calculate the coefficients for the Equalizer object. The following example would result in an eq with a centre frequency of 1000Hz, a width of 1000Hz, and some value for gain (see Utility functions), and operating at a sample rate of 44100Hz. Note that if you make an EQ with a band at, for example, 16000 Hz, then it would cause the filter to become unstable if you pass in a width greater than 6050 as this goes above half the sampling rate i.e. 22050. You should bear this in mind when you choose your bands. eq.CalcCoeffs(1000, 1000, 44100, gain); Pass a stereo signal (xL, xR) to the eq to be filtered. The result will be placed in yL and yR. The current code uses double precision, you could change this to float if you like. eq.Filter(xL, xR, &yL, &yR); A 3 Band EQ example You need to create an eq for each band and pass the signal from one eq to the next. Here will we demo a 3 band. Equalizer eq1; Equalizer eq2; Equalizer eq3; float fs = 44100 // or whatever samplerate you use // gain1,2,3 are the gains in dB of your filter (-12 to 12 (in dB) is good) eq1.CalcCoeffs(20, 20, fs, gain1); eq2.CalcCoeffs(31, 31, fs, gain2); eq3.CalcCoeffs(63, 63, fs, gain3); // Fetch a stereo signal xL = inputLeft; xR = inputRight; // Pass the stereo input eq1.Filter(xL, xR, yL, yR); // Pass the output from the previous filter eq2.Filter(yL, yR, yL, yR); eq3.Filter(yL, yR, yL, yR); outputLeft = yL; outputRight = yR; Utility Functions // Calculate frequency from 20Hz to 20,000 Hz, a value of 0 to 1 should be passed (as is normally used in linear controls) float CalcFreq(float f) { return (pow(1000.0f,f)*20); } // Calculate Gain value, which is passed when you CalcCoeffs(), a value from 0 to 1 should be passed, this will result in a -12 to 12 dB cut \ boost. i.e. 0 = -12dB, 0.5 = 0dB, 1 = 12dB float EQ::CalcGain(float val) { float dB = 12.0f * ((2.0f * val) - 1.0f); float gain = pow(10.0f, (dB / 20.0f)); return (gain); } › © « Å Ü ù   ;   Î ú  * . 0 1 2 3 ~ ‡ è         o ‹ Œ º ½ ð ñ +3<÷ïë÷æë÷ë÷æëâÞâÚë÷Õ÷ëÚÎÚÊÚ½¹±¬§±¢½™•¹™‘•‚w‚hí‡h~B* ph€hí‡hjÍB* ph€hGüh >PhjÍh,3þ h;%5 h9@R5 hÖë5 h -Ð5h;%h;%5h;% hÈÔ5hÈÔhÈÔ5hHÝ hÈÔhÈÔ h5hÈÔhh hnZÐ5hnZÐhnZÐhnÛ5hnZÐhnZÐ5- '(š › ª « Ä Å Ü Ý ø ù    1 2 3 ç è     ýýýýýýýýýýýýýýýýýýýýýýøøøøøøgdÈÔ²þ  Œ œ « º » ¼ ½ ð ñ =`ƒ¦§ÀÐáâûC_{úúúúúúúúúúúúññìãããããããããÞgdGü 7$8$H$gdGügd,3þ 7$8$H$gd,3þgdÈÔ<=?RX\`u{ƒ˜ž£¥¦§ÀâûC{¡³´ôáÎáÎáÎáÎáÎáÎỨ¨rÎrΨ]A7hH†hjÍ5B* CJOJQJ^JaJmHnHph€u(hjÍ5CJOJQJ^JaJmHnHu4hí‡hGüB* CJOJQJ^JaJmHnHph€u4hí‡hjÍB* CJOJQJ^JaJmHnHph€u%hjÍCJOJQJ^JaJmHnHu%hÈÔCJOJQJ^JaJmHnHu%hGüCJOJQJ^JaJmHnHu%h,3þCJOJQJ^JaJmHnHuhí‡h,3þB* ph€{|Ÿ ¡³´/0hi#$BDop˜™©«¬­®¯°úúúúúúúúúúúúúñññññññìúçâààgdÈÔgd,3þgd¾a 7$8$H$gd¾agdGü´áõ./05?DJPRUhiåͲ—„iSiSiSiS@å%h¾aCJOJQJ^JaJmHnHu+h¾ah¾aCJOJQJ^JaJmHnHu4h¾ah¾aB*CJOJQJ^JaJmHnHphÿu%hHXÍCJOJQJ^JaJmHnHu4hH†hjÍB* CJOJQJ^JaJmHnHph€u4hH†h¤²B* CJOJQJ^JaJmHnHph€u.hÃh;B* CJOJQJ^JaJmHnHph€u4hH†h¾aB* CJOJQJ^JaJmHnHph€u¨®Í"#$)7<BCEJqv𠫬­åʯ”ÊiiViii@; hGü5+h¾ah¾aCJOJQJ^JaJmHnHu%hHÝCJOJQJ^JaJmHnHu.h¾aB*CJOJQJ^JaJmHnHphÿu%h¾aCJOJQJ^JaJmHnHu4hH†h~B* CJOJQJ^JaJmHnHph€u4hH†h¤²B* CJOJQJ^JaJmHnHph€u4hH†h¾aB* CJOJQJ^JaJmHnHph€u4hH†hHÝB* CJOJQJ^JaJmHnHph€u­®¯°±²÷òëçëhnZÐ hnZÐhnZÐ hnZÐ5hÈÔhÈÔ5°±²ýý,1h°‚. °ÆA!°"°# $ %°°Ä°Ä Äœ@@ñÿ@ NormalCJ_HaJmH sH tH DA@òÿ¡D Default Paragraph FontRi@óÿ³R  Table Normalö4Ö l4Öaö (k@ôÿÁ(No List² &ÿÿÿÿ '(š›ª«ÄÅÜÝøù 123ç茜«º»¼½ðñ=`ƒ¦§ÀÐáâûC_{|Ÿ ¡³´/0hi# $ B D o p ˜ ™ © « ¬ ­ ® ¯ ° ± ´ ˜0€€0˜0€€x˜0€€x˜0€€x˜0€€x˜0€€˜0€€x˜0€€ €˜0€€˜0€€˜0€€€˜0€€˜0€€€˜0€€˜0€€˜0€€ €˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€x˜0€€˜0€€˜0€€ €˜0€€x˜0€€˜0€€ €˜0€€˜0€€ €˜0€€ €˜0€€ €˜0€€(˜0€€ €˜0€€ €˜0€€ €˜0€€ €˜0€€ €˜0€€˜0€€˜0€€ €˜0€€0€˜0€€˜0€€x˜0€€x˜0€€x˜0€€˜0€€x˜0€€x˜0€€˜@0€€x˜0€€˜0€€˜0€€x˜0€€˜0€€˜0€€x˜0€€x˜0€€˜0€€x˜0€€˜0€€˜0€€˜0€€x˜0€€€˜0€€ €˜0€€˜0€€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€ €˜0€€x˜0€€ €˜0€€˜0€€˜0€€€˜0€€€123ç蜫ñ=`ƒC_Ÿ ¡³´0hp ˜ ™ © « ¬ ­ ® ´ @0¤ïd80@0@00|@0€@0¤ï05‚@0@0@0€@0€@0 €@0€@0 €@0€@0¤ïô|‚@0€@0€@0€@0€@00€@0€@0¤ï€}‚@0€@0€@0€@0€@0€@0€@0€@0¤ï<´­²  {°² ² ð8ð@ñÿÿÿ€€€÷ð’ðð0ð( ð ððB ðS ð¿Ëÿ ?ðÿÿù.`Ì_#ú.`”Š##å´ +î´ 8*€urn:schemas-microsoft-com:office:smarttags€time€ €11€48€Hour€Minute´ ´  Î º½ðð+3ûûCCóóôõ./Í" ± ´ ´ åÇx¾a;%Ãh; >P9@Rx.ak~H†í‡ÌI¦¤²jÍHXÍ -ÐnZÐ<ÓÈÔnÛHÝÖë}ôqzøGü,3þÿ@€¿¿pó««¿¿² @ÿÿUnknownÿÿÿÿÿÿÿÿÿÿÿÿG‡z €ÿTimes New Roman5€Symbol3& ‡z €ÿArial?5 ‡z €ÿCourier New"ñˆðÐh…ª&I…ª&0r@r@Ñð ´´r4d® ® 3ƒð H)ðÿ?äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿx.aÿÿEqualizer Design Introduction David Davidþÿà…ŸòùOh«‘+'³Ù0€˜ÀÌÜèô   < H T`hpxä Equalizer Design Introduction DavidNormal David19Microsoft Word 10.0@ ´@¶y6XñÆ@Öë^ñÆr@þÿÕÍÕœ.“—+,ù®0 hp€ˆ˜  ¨°¸ À êäHome® ¡ Equalizer Design Introduction Title þÿÿÿþÿÿÿ!"#$%&'þÿÿÿ)*+,-./þÿÿÿýÿÿÿ2þÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF@ K_ñÆ4€1TableÿÿÿÿÿÿÿÿÌWordDocumentÿÿÿÿÿÿÿÿ.&SummaryInformation(ÿÿÿÿ DocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ(CompObjÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word Document MSWordDocWord.Document.8ô9²qmilkytracker-0.90.85+dfsg/docs/ChangeLog_old.rtf0000644000175000017500000002204711316456771020575 0ustar admin2admin2{\rtf1\ansi\ansicpg10000\deff0{\fonttbl{\f0\froman\fprq2\fcharset77 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}} {\*\generator Msftedit 5.41.15.1503;}\viewkind4\uc1\pard\tx565\tx1133\tx1700\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\lang1033\f0\fs24 MilkyTracker ChangeLog:\par \par \lang1031\f1 02\lang1033\f0 /\lang1031\f1 14\lang1033\f0 /0\lang1031\f1 6\lang1033\f0 (\b v00.90.\lang1031\f1 3\lang1033\f0 0\b0 ), \lang1031\f1 Mainly bugfixes and minor additions\lang1033\f0 :\par \lang1031\ul\f1 Bugs fixed\ulnone :\par -\lang1033\f0 ProTracker modules using 'one shot'-looped samples seem to crash the replayer sometimes. \lang1031\f1 Fixed\lang1033\f0 .\par \lang1031\f1 -\lang1033\f0 There \lang1031\f1 was\lang1033\f0 a bug in the mod exporter when trying to export samples with a loopstart set to 0. \lang1031\f1 Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 The windows version \lang1031\f1 would\lang1033\f0 crash when inserting MANY points between two points in an envelope\lang1031\f1 . Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 The right-left combined mouse click on the scopes \lang1031\f1 didn't\lang1033\f0 work properly\lang1031\f1 . Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 switching between the loop types caus\lang1031\f1 ed\lang1033\f0 \lang1031\f1 crashes. Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 Redo filter seems to crash/erase sample in the win32 version\lang1031\f1 . Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 Retrig command \lang1031\f1 was\lang1033\f0 still a little bit buggy (when used in combination with delay note)\lang1031\f1 . Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 Arpeggio \lang1031\f1 was\lang1033\f0 still a little bit buggy (won't be noticed when tickspeed%3 == 0)\lang1031\f1 . Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 Putting a position jump inbetween a pattern loop will cause the song length estimator to hang in an infinite loop.\lang1031\f1 Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 Trying to enable the volume envelope when it says 'none selected' in the envelope editor Milky \lang1031\f1 would\lang1033\f0 crash\lang1031\f1 . Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 Block transpose up/down\lang1031\f1 was buggy. Fixed.\lang1033\f0\par \lang1031\f1 -\lang1033\f0 Pattern Len display isn't updated to reflect new length after block was pasted and pattern grew\lang1031\f1 . Fixed.\par - Scopes didn't update after loading samples/instruments\par - Dozens of other fixes...\par \ul Features added\ulnone :\par - Multichannel record/keyjazz/editing (like in FT2)\par - Disable pattern grow when pasting\par - Enable "by channel tabbing" (like in FT2)\par - Instrument quick select using numerical keypad\par - Select sample within instrument in FT2 edit mode (Shift+Alt+Up/Down)\par - Emulate insert key with Ctrl+Up in the OSX version (select from the OSX main menu under option "special")\par - Dragging files from the win-explorer/osx finder into the MilkyTracker window loads the file\par (works for modules, instruments, patterns, tracks, samples etc.)\par - Load/Save IFF samples\par - More WAV sample types recognized and loaded\par - Improved Protracker compatibility\par - More options on the replayer for improved module playback compatibility\par - Playmodes can now be saved to be the default playmode\par - Even more FT2 keyboard shortcuts (F9-F12, look in the doc for more info)\par - Even more customizing support, see config.\par - PocketPC: Added scopes as well\par - PocketPC: Jam page with extended keyboard or pattern\lang1033\f0\par \par 11/29/05 (\b v00.90.00\b0 ), Lots of improvements, really can't remember them all:\par - Improved mixer, improved FT2 effect compatibility (especially tremolo, tremor, vibrato)\par - Scopes (finally) (only for Desktop versions)\par - Configurable colors (config->layout)\par - Disk writer (Ctrl+R)\par - FT2 like pattern follow: cursor line always in center center\par - Prospective mode and toggle follow song mode\par - Volume scale (Shift/Alt/Ctrl+V like FT2)\par - Load GUS patches (needs to be loaded as instrument)\par - Load every file as sample (good for making noise samples)\par - Dozens of sample filters\par - Reworked GUI (especially menus)\par - Sample offset can be shown in sample editor\par - Drawing samples (but remember to turn on looping, otherwise doesn't sound good ;))\par - Toggle Hex count for rows in pattern editor\par - Show zero effect as 00 instead of dots (see config->layout)\par - Improved Protracker 2.x, 3.x replay modes (see options)\par - Skip through song while it's playing (with cursor keys or scrollwheel)\par - Time length calculation/play time meter\par - Peak meters\par - Sequencer button (see order list)\par - Hold the Alt Key in the sample editor to move entire loop not only loop/end\par - Tons of other fixes...\par - More things to find out...\par \par 10/07/05:\par - Fixed crash when saving .MODs\par - Implemented Lxx command (set envelope position)\par - New: Hold down Ctrl (Apple on OSX) to resize selection in sample editor\par - New: Zoom sample in/out by using the scroll wheel of your mouse\par - New: Swap channels (select source with cursor and swap with destination channel by menu)\par - New: Split track (spread notes from one channel across subsequent channels)\par - New: Use virtual channels when playing instruments (enable in config first)\par (instruments played on virtual channels won\rquote t cut instruments used in song) \par - Other stuff (don't remember all of it)\par \par 09/01/05:\par - Fixed lots of crashes =)\par - cut/copy/paste works in sample editor (hopefully, not much tested yet)\par - you\rquote re able to change default screen resolution but you need to restart MilkyTracker to apply\par - Save patterns/tracks in FT2 formats .XP/.XT\par - Save Protracker compatible mods \par - Fixed some small issues\par \par 07/01/05:\par - Fixed lots of crashes\par - Undo/Redo in sample editor (cut/copy/paste is following soon)\par - Minor cosmetical changes\par - Vibrato volume command now works in pattern editor (press "v")\par - Vibrato speed volume command now works in pattern editor (press "s")\par - X command works in pattern editor\par - MOD loader now recognises 15 channel mods\par - Added "large" font for tracking <= 4 channel songs ;)\par - Del. key can be used for deleting note+ins./volume/effect\par \par 06/22/05:\par - !! Fixed bug that caused MilkyTracker to crash when selecting empty samples (sorry for that one)\par - Fixed bug with ALT+F4 when using FT2 shortcuts and Windows =)\par - Paste of tracks and patterns always insert at row 0, not at cursor \par - Added possibility to expand orderlist listbox\par - Added predefined envelopes \par - Changed instrument color (one day it will be possible to select your own colors ;))\par - More minor fixes\par \par 06/13/05:\par - Improved sample position markers\par - Added envelope position markers\par - Improved XM replayer (fixed FT2 note clipping when playing arpeggios)\par - Added more FT2 keyboard shortcuts (Ctrl+I, Ctrl +S, Ctrl +X etc.)\par - Minor fixes + Additions\par - Added support for mouse scrollwheel\par - PocketPC: "Full" onscreen keyboard (probably still buggy)\par \par 05/27/05:\par - Right (1st) & Left click (2nd) on channel box cycles between solo channel/unmute all\par (Alternatively hold ALT key and left click on channel box)\par - Del. now deletes note & instrument in FT2 mode\par - Pattern scrolling is now buffer independent on Win32/WinCE \par (\b Not necessary\b0 under \b OSX\b0 because of much smaller buffer sizes =)) \par - Added another pattern scroll style (cursor scrolls to the center and keeps center until the last page)\par \par 05/22/05:\par - Due to request MilkyTracker now features a FT2 compatibility mode\par You can switch between MilkyTracker (modern ;)) and FT2 edit modes in the config screen.\par (see MilkyTracker manual for details)\par \b Note: \b0 Not all FT2 commands are implemented yet, but the most important ones for editing are included\par - Hopefully fixed some keyboard layout problems\par \par 05/14/05:\par - Fixed some "focus" issues\par - Divided "save" option into "save" and "save as..." \par - Added value interpolation (available in the \ldblquote Advanced Editor\rdblquote )\par - Fixed an instrument load/save issue\par - PocketPC: Fixed bug, which prevented the progress bar from disappearing when saving instruments/samples.\par \par 05/06/05:\par - Minor optimizations making the GUI more responsive\par - Toggle focus of pattern editor by pressing space\par - Play song from current order by pressing enter\par - Play pattern by pressing ctrl+enter\par - Play pattern from current position by pressing shift+enter\par - PocketPC: Explicit hiding of SIP (does this solve any problems?)\par - PocketPC: Minor facelifts\par \par 04/29/05:\par - Added possibility to swap/copy samples from one instrument to another\par - Fixed major bug in XI loader\par - Increased button autorepeat delay\par - PocketPC version: GAPI is now properly shut down before opening the common file dialog\par \par 04/25/05:\par \pard First "official" PocketPC pre-release\par } milkytracker-0.90.85+dfsg/docs/readme_PocketPC.html0000644000175000017500000000714110737746457021255 0ustar admin2admin2

Welcome to our multiplatform music tracker called MilkyTracker.


Here a few important notes about the Windows Mobile version:


- The package contains executable binaries for three different CPU architectures (ARM, MIPS, x86).

  If you got a regular PocketPC running PocketPC 2000/2002/2003 or Windows Mobile 2005 you will only

  need what's inside the ARM folder. 

- If you've worked with previous versions of MilkyTracker before and you're experiencing

  double entries in the key-config tool, please delete the file "keys.cfg" in the MilkyTracker 

  folder and run it again

- MilkyTracker needs quite some memory and it will NOT warn if it runs out of it.

  Give it as much memory as you can, if you experience odd behaviour (e.g. playback stops 

  and can't be continued etc.) try to save your work and exit to free up some memory.

- Make sure you have GAPI installed

- I have no VGA (HiRes) device so I have no idea what MilkyTracker will look like on such a device 

  (MilkyTracker PocketPC is supposed to run in 320x240 landscape)

- If the sound skips try to increase buffer size and/or play around with output frequency 

  (smaller buffer means lower latency)

- Use the button config tool to assign functions to your hardware buttons

- On older devices your songs must reside in "My Documents" or one of its direct subfolders

- MilkyTracker also runs on H/PC devices running Windows CE, but you will need aygshell.dll and gx.dll

  (both available for H/PC Handheld PCs)

- Have fun


Currently supported platforms:

Windows, MacOS X, Linux, PocketPC (2000, 2002, 2003(?))


Make sure you read the other manual as well.


Contact us for any reason (questions, bug-reports, feature-requests etc.):

support@milkytracker.net


or visit our homepage: 

http://www.milkytracker.net

milkytracker-0.90.85+dfsg/docs/MilkyTracker.html0000644000175000017500000031636511317477251020670 0ustar admin2admin2 MilkyTracker Manual v0.90.85

MilkyTracker Manual v0.90.85

Hello and welcome to MilkyTracker, an open source multi-platform Fasttracker II compatible music tracker program. This document holds a lot of valuable information about the tracker but it's not a tracking manual. If you want to learn more about tracking and how it's done, the Internet is your friend. We host some resources on MilkyTracker.net as well.

Disclaimer:

MilkyTracker is under development so use it at your own risk. The team is not responsible for any loss of data and/or hardware damage caused by MilkyTracker.

Now, with the formalities taken care of, let's have a look at the…

Table of Contents

  1. Supported platforms
  2. Overview
  3. Features
    1. Resamplers
    2. Tabs
  4. Imported and exported file formats
    1. Modules
    2. Samples
    3. Instruments
    4. Patterns and Tracks
  5. Keyboard shortcuts
    1. MilkyTracker edit mode
    2. Fasttracker II edit mode
  6. Effect command reference
    1. Glossary
    2. Effect commands
  7. MIDI support
  8. Known issues and bug reports
  9. Credits
  10. Contact
  11. Donations

1. Supported platforms

MilkyTracker currently runs on the following platforms:

  • *BSD
  • GNU/Linux
  • Mac OS X
  • Microsoft Windows 9x/NT/Me/200x/XP/Vista
  • Microsoft Windows CE 3.0+/Mobile
  • AmigaOS 4

It has also been known to run on:

  • Xbox (GNU/Linux)
  • Solaris 9 & 10
  • Sony PlayStation Portable

You can run MilkyTracker on other platforms by compiling from source.

2. Overview

MilkyTracker is an open source, multi-platform music application; more specifically part of the tracker family. It attempts to recreate the module replay and user experience of the popular DOS application Fasttracker II, with special playback modes available for improved Amiga ProTracker 2.x/3.x compatibility. MilkyTracker is not "another Windows tracker", which should already be made obvious by the plethora of supported desktop and portable platforms. In fact it started as a project to bring tracking to the Pocket PC. When this milestone was reached, the next one was creating a truly FT2 compatible tracker for portable as well as modern desktop platforms.

3. Features

  • Fasttracker II-like, custom graphical user interface with context menus
  • Supported on multiple platforms including portable devices
  • Very accurate .XM replay compared to FT2
  • ProTracker 2/3 playback modes for playing and editing .MOD files
  • Various resampler options including emulated Amiga 500/1200 sound output
  • Choose between a modern and a true-to-FT2 editing scheme / keyboard layout
  • Tabbed user interface for opening and playing up to 32 modules simultaneously and for exchanging data between them
  • Over 30 imported module formats
  • Basic archive support for loading zipped, powerpacked and UMX modules directly
  • Rendering songs/patterns to disk (.WAV) or directly to sample
  • Powerful sample editor featuring waveform generators
  • In-depth instrument editor featuring envelope zooming and scaling and support for copying and swapping instruments and samples across tabs
  • Copy/swap dialog for instrument management
  • Undo/redo in pattern/sample/instrument editor
  • Low latency audio driver support
  • MIDI In support
  • Module optimizer
  • Internal file browser option
  • Various font sizes for improved visibility of pattern data
  • Prospective pattern view option
  • Playing and editing simultaneously
  • Live mode for seamless pattern changes

Resamplers

MilkyTracker offers various resampling options for playback, rendering and sample processing. These are:

  • No interpolation
  • Linear interpolation
  • Cubic Lagrange
  • Cubic Spline
  • Fast Sinc (window size 16, fixed point integer, sinc lookup table)
  • Precise Sinc (window size 128, double floating point)
  • Amiga 500
  • Amiga 500 LED
  • Amiga 1200
  • Amiga 1200 LED

The different modes were added for completeness and while the choice of resampler is a matter of personal taste, you should keep in mind that Linear interpolation represents the highest quality option available in Fasttracker II so that's what the majority of .XM files were made (to be played) with. Also, the Amiga modes are meant to be used with 4 channel .MODs only. Precise Sinc is a CPU killer - great for resampling in the sample editor but don't expect hot real-time performance.

Tabs

MilkyTracker enables you to open and play up to 32 modules simultaneously and to exchange data between them. Initially, tabs are invisible but can be activated with keyboard shortcuts described below. There are some configurable options for tabs as well, like automatically opening modules in new tabs and background stopping behavior control. You can choose to never stop playback on background tabs, or to automatically stop on tab change or stop when playback on another tab is started. Playback can also resume upon returning to a tab.

4. Imported and exported file formats

I. Modules

MilkyTracker can import a wide range of tracker module formats but since Milky is a FT2 clone, modules are replayed in an FT2 environment which means not all features of different formats are supported. MilkyTracker also has basic archive support, so it's possible to load zipped, powerpacked and UMX modules directly.

Import:

.669669 Composer/Unis669 (PC)
.AMFAsylum Music Format ("Crusader" in-game music) (PC)
Digital Sound and Music Interface (DSMI) library (PC)
.AMSExtreme Tracker (PC)
Velvet Studio (PC)
.CBAChuck Biscuits+Black Artist module format (PC)
.DBMDigiBooster Pro (Amiga)
.DIGIDigibooster 1.0-1.7 (Amiga)
.DSMDigisound Interface Kit (DSIK) library (PC)
Dynamic Studio (PC)
.DTMDigital Tracker (Atari)
DigiTrekker 3.0 (PC)
.FARFarandole Composer (PC)
.GDMGeneral Digimusic (PC)
.GMCGame Music Creator (Amiga)
.IMFImago Orpheus (PC)
.ITImpulse Tracker (PC)
.MDLDigiTrakker 1.0-3.0 (PC)
.MODSound-/ProTracker and variants (Amiga & PC)
.MTMMultiTracker (PC)
.MXMCubic Tiny XM (PC)
.OKTOktalyzer (Amiga)
.PLMDisorderTracker II (PC)
.PSMEpic MegaGames MASI (PC)
.PTMPolyTracker (PC)
.S3MScream Tracker 3.0 (PC)
.SFXSoundFX (Amiga)
.STMScream Tracker 2.0 (PC)
.ULTUltraTracker (PC)
.UNIMikMod (PC)
.XMFasttracker II (PC)

MilkyTracker's song export options are the same as Fasttracker II's but it is notable that, unlike FT2, Milky saves Amiga compatible 4-channel .MODs. MilkyTracker also features ProTracker 2.x and 3.x playback modes for .MODs.

Export:

.MODProTracker boundaries, although can save 2–32 channels
.WAVMicrosoft/IBM PCM Waveform audio rendering
.XMFasttracker II compatible, not as common as one might think

II. Samples

Milky can load practically anything as RAW PCM audio samples; one of FT2's famous features.

Import:

.8SVX / .IFFCompressed/uncompressed Interchange File Format
.AIF / .AIFFApple Audio Interchange File Format
.WAVMicrosoft/IBM uncompressed PCM Waveform audio
.*RAW PCM audio

Export:

.IFFUncompressed Interchange File Format
.WAVMicrosoft/IBM uncompressed PCM Waveform audio

III. Instruments

MilkyTracker can load and save FT2's eXtended Instrument (.XI) format and additionally import Gravis Ultrasound GF1 Patch (.PAT) files.

IV. Patterns and Tracks

MilkyTracker handles FT2's eXtended Pattern (.XP) and eXtended Track (.XT) files with full compatibility.

5. Keyboard shortcuts

By user request, MilkyTracker features two edit modes. You can switch between these in the Config screen (Misc. tab). To learn about the differences and which might better suit you, read the appropriate sections below. There are a couple of shortcuts that are the same for both modes so let's clear those out of the way first:

Please note that under Mac OS X the Command key is used instead of the Ctrl key.

Alt-EnterSwitch between full screen and windowed display (Windows & SDL)
Alt-Command-FSwitch between full screen and windowed display (OS X)
Shift-MMute current channel
Ctrl-Shift-MInvert muting
Ctrl-Shift-TOpen a new tab
Shift-UUn-mute all
Ctrl-Shift-WClose current tab
Ctrl-Shift-LeftSelect previous tab
Ctrl-Shift-RightSelect next tab

I. MilkyTracker edit mode

The MilkyTracker mode basically is a bit more "modern" because you can focus on different parts (e.g. Pattern Editor, Instrument listbox, Sample listbox etc.) and when you're pressing keys, they're routed to the focused control. Keyboard shortcuts are also more standard; you can select by pressing the SHIFT key and navigating with the cursor keys, cut, copy & paste by using Ctrl-X/C/V etc. Users who are new to tracking will probably find this a bit more intuitive.

Section switching:

Ctrl-Alt-
AAdvanced edit
CConfiguration
DDisk operations
IInstrument editor
RDisk recorder
SSample editor
TTranspose
XMain screen
ZToggle scopes

Global:

2, 3, 5, 6…Play / insert notes (depending on whether edit mode is on)
Q, W, E, R…
S, D, F, G…
Z, X, C, V…
F1…F8Select octave
Ctrl-Shift-1…8
SpaceToggle pattern editor focus (edit mode on/off)
EnterPlay song from current order
Ctrl-EnterPlay current pattern from beginning
Shift-EnterPlay current pattern from cursor position
Shift-F9Play current pattern from beginning (same as Ctrl-Enter)
Shift-F10Play current pattern from position after the first quarter of the pattern length
Shift-F11Play current pattern from position after the second quarter of the pattern length
Shift-F12Play current pattern from position after the third quarter of the pattern length
Alt-SpacePlay song from current row (stop and return when keys are released)
Shift-SpacePlay row by row
EscStop
Ctrl-FToggle song follow
Ctrl-PToggle prospective pattern view
Ctrl-WToggle pattern wrapping
Ctrl-LToggle pattern change behavior (live mode)
Ctrl-OLoad song
Ctrl-SSave song
Ctrl-Shift-SSave song as…
Ctrl-QExit program
Alt-F4

Pattern Editor:

Cursor keysMove around
TabJump to next channel
PageUpJump 16 rows up
PageDownJump 16 rows down
HomeJump to first row
EndJump to last row
F9Jump to beginning of the pattern
F10Jump to position ¼ through the pattern
F11Jump to position halfway through the pattern
F12Jump to position ¾ through the pattern
Ctrl-ZUndo
Ctrl-YRedo
Shift-Cursor keysSelect block
Shift-Alt-Cursor keysExtend block
Ctrl-ASelect entire pattern
Ctrl-XCut
Ctrl-CCopy
Ctrl-VPaste
Ctrl-IInterpolate values
DeleteDelete note/instrument/volume/effect/parameter
Shift-DelDelete note, volume and effect at cursor
Ctrl-DelDelete volume and effect at cursor
Alt-DeleteDelete effect at cursor
InsertInsert space on current track at cursor position
Shift-InsertInsert row at cursor position
BackspaceDelete previous note
Shift-BackspaceDelete previous row
The key right of LShiftEnter key-off
The key below EscEnter key-off (Windows only)
1Enter key-off (OS X only)

Transpose:

Alt-F7Transpose current instrument in block down
Alt-F8Transpose current instrument in block up
Shift-F7Transpose current instrument in track down
Shift-F8Transpose current instrument in track up
Ctrl-F7Transpose current instrument in pattern down
Ctrl-F8Transpose current instrument in pattern up
Alt-F1Transpose all instruments in block down
Alt-F2Transpose all instruments in block up
Shift-F1Transpose all instruments in track down
Shift-F2Transpose all instruments in track up
Ctrl-F1Transpose all instruments in pattern down
Ctrl-F2Transpose all instruments in pattern up

Sample Editor:

Shift & dragQuick draw
Ctrl & dragResize selection
Alt & dragMove selection or loop range

II. Fasttracker II edit mode

The FT2 edit mode is for the die-hard FT2 users and probably isn't very intuitive to beginners. Please note that not all FT2 shortcuts are implemented yet and some may differ for various technical reasons. Also note that this edit mode may not be optimal on Pocket PC because of the limitations of some input devices.

Section switching:

Ctrl-
AAdvanced edit
CConfiguration
DDisk operations
IInstrument editor
RDisk recorder
SSample editor
TTranspose
XMain screen
ZToggle scopes

Global:

2, 3, 5, 6…Play / insert notes (depending on whether edit mode is on)
Q, W, E, R…
S, D, F, G…
Z, X, C, V…
F1…F8Select octave
Right CtrlPlay song from current order
EnterPlay song from current order
Right AltPlay current pattern from beginning (Windows &SDL)
Ctrl-EnterPlay current pattern from beginning
Shift-EnterPlay current pattern from current row
Shift-F9Play current pattern from beginning (same as Ctrl-Enter/Right Alt)
Shift-F10Play current pattern from position after the first quarter of the pattern length
Shift-F11Play current pattern from position after the second quarter of the pattern length
Shift-F12Play current pattern from position after the third quarter of the pattern length
Alt-SpacePlay song from current row (stop and return when keys are released)
Shift-SpacePlay row by row
SpaceStop / Edit
Shift-LeftIncrease song position
Shift-RightDecrease song position
Ctrl-LeftIncrease current pattern number
Ctrl-RightDecrease current pattern number
Ctrl-FToggle song follow
Ctrl-PToggle prospective pattern view
Ctrl-WToggle pattern wrapping
Ctrl-LToggle pattern change behavior (live mode)
Shift-Ctrl-LLoad song
Shift-Ctrl-SSave song
EscExit program

Pattern editor:

Cursor keysMove around
PageUpJump 16 rows up
PageDownJump 16 rows down
HomeJump to first row
EndJump to last row
TabJump to next track
Shift-TabJump to previous track
Alt-Q…IJump to track (0…7) MOD N-Channels
Alt-A…KJump to track (8…15) MOD N-Channels
F9Jump to beginning of the pattern
F10Jump to position ¼ through the pattern
F11Jump to position halfway through the pattern
F12Jump to position ¾ through the pattern
The key right of LShiftEnter key-off
Caps-LockEnter key-off (Windows only)
1Enter key-off (OS X only)
DelDelete note or volume column at cursor
Shift-DelDelete note, volume and effect at cursor
Ctrl-DelDelete volume and effect at cursor
Alt-DeleteDelete effect at cursor
InsInsert space on current track at cursor position
Shift-InsInsert row at cursor position
BackspaceDelete previous note
Shift-BackspaceDelete previous row

Clipboard operations:

Alt-Cursor keysSelect block
Shift-Alt-Cursor keysExtend block
Alt-F3Cut block
Alt-F4Copy block (yes, even under Windows =)
Alt-F5Paste block
Shift-F3Cut track
Shift-F4Copy track
Shift-F5Paste track
Ctrl-F3Cut pattern
Ctrl-F4Copy pattern
Ctrl-F5Paste pattern

Additional shortcuts (not found in FT2):

Ctrl-Alt-ZUndo
Ctrl-Alt-YRedo
Ctrl-Alt-ASelect entire pattern
Shift-IInterpolate values

Volume scaling:

Alt-VVolume scale block
Shift-VVolume scale track
Ctrl-VVolume scale pattern

Command/Volume macro:

Shift-Alt-1…0Read command/volume at cursor
Alt-1…0Write command/volume at cursor

Transpose:

Alt-F7Transpose current instrument in block down
Alt-F8Transpose current instrument in block up
Shift-F7Transpose current instrument in track down
Shift-F8Transpose current instrument in track up
Ctrl-F7Transpose current instrument in pattern down
Ctrl-F8Transpose current instrument in pattern up
Alt-F1Transpose all instruments in block down
Alt-F2Transpose all instruments in block up
Shift-F1Transpose all instruments in track down
Shift-F2Transpose all instruments in track up
Ctrl-F1Transpose all instruments in pattern down
Ctrl-F2Transpose all instruments in pattern up

Instrument selection:

Shift-UpSelect previous instrument
Shift-DownSelect next instrument
Ctrl-Shift-UpSelect previous sample
Ctrl-Shift-DownSelect next sample

You can also quick-type the hex-number of the instrument you want to select on the numeric keypad, the layout is like this:

PCMac
Num 0…9Num 0…9Digit 0…9
Num /Num =Digit A
Num *Num /Digit B
Num -Num *Digit C
Num +Num -Digit D
Num EnterNum +Digit E
Num ,Num EnterDigit F

Sample editor:

Shift & dragQuick draw
Ctrl & dragResize selection
Alt & dragMove selection or loop range

6. Effect command reference

I. Glossary

BPMTraditionally Beats Per Minute, but in tracker terminology it defines the speed of ticks.
Effect memoryWhen an effect command is called with 0 parameters, previous parameters are used.
Row/lineRefers to one line of "text" on a pattern. In playback its duration depends on how many ticks there are per row (Speed) and fast they are (BPM).
Sample fine-tune/volume/panningPer sample default settings available through the instrument editor (thus also called instrument volume etc). Overrideable with effect commands. .MODs support these as well but with lower precision. (Save module and load back to enforce .MOD precision.)
TickThe base time unit in traditional trackers like MilkyTracker, originating from Amiga. Notes are triggered on the first tick of a row (unless delayed) and effects are applied on the following ticks.
SemitoneThe smallest musical interval in Western music and in MilkyTracker. A C# note is one semitone away from the note C.
Speed (Spd.)Number of ticks per row.

II. Effect commands

Standard commands (.MOD &.XM)

Extended commands (.XM only)

Volume column commands (.XM only)

*) Not implemented, no plans to support
**) Not implemented yet, will be required for feature completeness
***) Not supported on Amiga nor in FT2, effect relocation (8xx, Px) advised

0xy Arpeggio

Syntax:0
x = semitone offset
y = semitone offset
Example: C-4 ·1 ·· 037
··· ·· ·· 037
··· ·· ·· 037
··· ·· ·· 037
Explanation:

Arpeggio quickly alters the note pitch between the base note (C-4) and the semitone offsets x (3 = D#4) and y (7 = G-4). Each pitch is played for the duration of 1 tick. If speed is higher than 3 (meaning there are more than 3 ticks per row), the sequence is looped.

ProTracker 2/3

Base note is played for tick 0, then the semitone offset x for tick 1, then semitone offset y for tick 2.

Fasttracker II

Base note is played for tick 0, then the semitone offset y for tick 1, then semitone offset x for tick 2.

Notes:
  • Doesn't have effect memory and cannot be used without parameters.
  • In Fasttracker II, arpeggio logic fails when song speed is 16 (0x10) or higher. Using arpeggio at such speeds may cause unpredictable results across different players.
Tips:

When both effect parameters are used, it is wise to use a song speed value divisible by 3 in order that the arpeggio sequence can loop smoothly.

1xx Portamento up

Syntax: 1
xx = portamento speed
Example: C-4 ·1 ·· 103
··· ·· ·· 103
··· ·· ·· 103
··· ·· ·· 103
Explanation:

Portamento is used to slide the note pitch up or down. The higher the xx, the faster it goes. Effect is applied on every tick.

Amiga frequencies

The slide speed also depends on the sample frequency.

Notes:

ProTracker 2/3

Doesn't have effect memory and cannot be used without parameters.

2xx Portamento down

Syntax:2
xx = portamento speed
Example: C-4 ·1 ·· 203
··· ·· ·· 203
··· ·· ·· 203
··· ·· ·· 203
Explanation: Works similarly to 1xx portamento up, only bending note pitch down instead of up.
Notes:

ProTracker 2/3

Doesn't have effect memory and cannot be used without parameters.

3xx Portamento to note

Syntax:3
xx = portamento speed
Example: C-4 ·1 ·· ···
E-4 ·1 ·· 304
··· ·· ·· 300
··· ·· ·· 310
Explanation:

This portamento command bends the already playing note pitch towards another one, entered with the 3xx command. In the example, C-4 is bent towards E-4 at portamento speed 04 which isn't fast enough to reach the E-4 pitch during the two rows at the default song speed (6/125). However, 310 on the following row continues the portamento and being much faster, achieves the target E-4 pitch.

4xy Vibrato

Syntax:4
x = speed
y = depth
Example: C-4 ·1 ·· 481
··· ·· ·· 402
··· ·· ·· 400
··· ·· ·· 460
Explanation:

Vibrato alters note pitch up and down in the maximum range of a full tone. After the initial xy pair, parameters can be set individually. The pitch is reset when the command is discontinued.

5xy Portamento to note with volume slide

Syntax:5
x = volume slide up speed
y = volume slide down speed
Example: C-4 ·1 ·· ···
E-4 ·1 ·· 304
··· ·· ·· 504
··· ·· ·· 504
Explanation:

Performs portamento to note with parameters initialized with 3xx or Mx while sliding volume similarly to Axy volume slide.

Notes:

ProTracker 2/3

Doesn't have effect memory for volume slide speeds, 500 works identically to 300.

6xy Vibrato with volume slide

Syntax:6
x = volume slide up speed
y = volume slide down speed
Example: C-4 ·1 ·· 481
··· ·· ·· 601
··· ·· ·· 600
··· ·· ·· 6C0
Explanation:

Performs vibrato with parameters initialized with 4xy or Sx+Vx while sliding volume similarly to Axy volume slide.

Notes:

ProTracker 2/3

Doesn't have effect memory for volume slide speeds, 600 works identically to 400.

7xy Tremolo

Syntax:7
x = speed
y = depth
Example: C-4 ·1 ·· 787
··· ·· ·· 700
··· ·· ·· 7C0
··· ·· ·· 700
Explanation:

Tremolo alters note volume up and down. After the initial xy pair, parameters can be set individually. The pitch is reset when the command is discontinued.

8xx Set note panning position

Syntax:8
xx = panning position
Example: C-4 ·1 ·· 880
··· ·· ·· 8A0
··· ·· ·· 8C0
··· ·· ·· 8F0
Explanation:

Sets the note stereo panning from far left 00 to far right FF overriding sample panning setting.

Notes:

ProTracker 2/3

  • On Amiga, the 4 MOD channels are hard panned left, right, right and left by hardware, no use panning manually there.

Fasttracker II

Panning envelopes operate relative to the set position.

9xx Sample offset

Syntax:9
xx = sample offset
Example: C-4 ·1 ·· ···
··· ·· ·· ···
C-4 ·1 ·· 908
··· ·· ·· ···
Explanation:

The sample that the note triggers is played from offset xx. The offsets are spread 256 samples apart so 908 skips the first (0x8*256=) 2048 bytes of the sample and plays it on from there. This means that the furthest point 9xx can reach is (0xFF*256 =) 65280 bytes into the sample.

Tips: Resampling a loop to exactly (0x10000=) 65536 bytes gives you the highest possible level of control over the sample.

Axy Volume slide

Syntax:A
x = volume slide up speed
y = volume slide down speed
Example: C-4 ·1 ·· A04
··· ·· ·· A04
C-4 ·1 ·· A0F
··· ·· ·· A80
Explanation:

Slides note volume up/down at speed x/y depending on which parameter is specified. Effect is applied per tick so song speed value acts as a multiplier.

Notes:
  • Parameters x and y should NOT be used at the same time, doing so almost guarantees unpredictable results across different players.

ProTracker 2/3

Doesn't have effect memory and cannot be used without parameters.

Bxx Jump to order

Syntax:B
xx = song position
Example: C-4 ·1 ·· ···
··· ·· ·· ···
··· ·· ·· ···
··· ·· ·· B04
Explanation:

Immediately breaks the current pattern and jumps to order xx in the pattern order table (POT).

Tips:

Can be used to divide a song into separate looping sections effectively creating multiple songs using the same set of instruments. Such modules can be used in games and such where the sections can be triggered dynamically by program events.

Cxx Set note volume

Syntax:C
xx = volume
Example: C-4 ·1 ·· ···
··· ·· ·· C10
··· ·· ·· C40
··· ·· ·· C00
Explanation:

Sets the note volume 0040 overriding sample volume setting.

Notes:

Fasttracker II

Volume envelopes operate relative to the set volume.

Dxx Pattern break

Syntax:D
xx = row number on next pattern
Example: C-4 ·1 ·· ···
··· ·· ·· ···
··· ·· ·· ···
··· ·· ·· D04
Explanation:

Breaks the current pattern and jumps to row xx on the next pattern.

Notes:

Unlike with the majority of effect parameters, here xx is a decimal value rather than hexadecimal. Hexadecimal values are converted to decimal (D0F jumps to row 15).

The highest row number you can jump to is 63.

E1x Fine portamento up

Syntax:E1
x = portamento speed
Example: C-4 ·1 ·· E11
··· ·· ·· E12
··· ·· ·· E13
··· ·· ·· E14
Explanation:

Works similarly to 1xx portamento up, only the slide is a lot finer because the effect is applied only once per row.

E2x Fine portamento down

Syntax:E2
x = portamento speed
Example: C-4 ·1 ·· E11
··· ·· ·· E12
··· ·· ·· E13
··· ·· ·· E14
Explanation:

Works similarly to 2xx portamento down bending note pitch down, only the slide is a lot finer like with E1x.

E3x Glissando control

Syntax:E3
x = glissando control toggle on/off
Example: C-4 ·1 ·· E31
D-4 01 ·· 305
··· ·· ·· 300
··· ·· ·· E30
Explanation:

Glissando control E31 changes note portamento behavior affecting commands 3xx, 5xy and Mx. Instead of stepless pitch bend (=glissando), the frequencies are rounded to nearest semitone. To revert to default glissando, use E30.

Notes:

This command is not yet implemented in MilkyTracker.

E4x Vibrato control

Syntax:E4
x = vibrato waveform selection
Example: C-4 ·1 ·· 48C
··· ·· V0 E41
··· ·· V0 E42
··· ·· ·· E40
Explanation:

This command sets the waveform used for 4xy, 6xy and Vx vibrato commands. The default waveform is sine, reset on every new note (E40). Possible parameter x values are:

  • 0 = Sine
  • 1 = Ramp down
  • 2 = Square
  • 4 = Continuous sine
  • 5 = Continuous ramp down
  • 6 = Continuous square
Notes:

This command is not yet implemented in MilkyTracker.

E5x Set note fine-tune

Syntax:E5
x = fine-tune
Example: C-4 ·1 ·· E54
··· ·· ·· ···
C-4 ·1 ·· E5C
··· ·· ·· ···
Explanation:

Sets note fine-tune overriding sample fine-tune setting. This command works a little differently for .MOD and .XM tracking. While both parameter value ranges are logical, the latter is also linear. See here:

xProTracker 2/3Fasttracker II
00-8
1+16-112
2+32-96
3+48-80
4+64-64
5+80-32
6+96-16
7+1120
8-128+16
9-112+32
A-96+48
B-80+64
C-64+80
D-48+96
E-32+112
F-16+128

E6x Pattern loop

Syntax:E6
x = set loop point / number of iterations
Example: C-4 ·1 ·· E60
··· ·· ·· ···
F-4 01 ·· ···
··· ·· ·· E63
Explanation:

Loops a section of a pattern x times. E60 sets the (optional) loop start point and E6x with x values 1F sets the end point and the number of iterations. If loop start point is not set, beginning of the pattern is used by default.

Notes:

The loop points need to be set on the same channel for them to work correctly.

Fasttracker II

One of the most (in)famous FT2 bugs is the E60 bug: When E60 is used on a pattern row x, the following pattern also starts from row x instead of the beginning of the pattern. This can be avoided by placing a D00 pattern break on the last row of the pattern where E60 was used.

Tips:Musicians concerned with correct playback of their .XM modules can utilize the E60 bug to skip sections of (or the whole) song when played with lesser players. ;)

E7x Tremolo control

Syntax:E7
x = tremolo waveform selection
Example: C-4 ·1 ·· E72
··· ·· ·· 76C
··· ·· ·· E70
··· ·· ·· 700
Explanation:

This command sets the waveform used for 7xy tremolo command. As with E4x vibrato control, the default waveform is sine and the possible parameter x values are:

  • 0 = Sine
  • 1 = Ramp down
  • 2 = Square
  • 4 = Continuous sine
  • 5 = Continuous ramp down
  • 6 = Continuous square
Notes:

This command is not yet implemented in MilkyTracker.

E8x Set note panning position

Syntax:E8
x = panning position
Explanation:

This command is another panning position command used by some trackers…

Notes:

…However, since it does not work on Amiga (because of the hardware panning) nor in Fasttracker II (hmm, enough panning commands already?), effect relocation to 8xx or Px is advised in order to produce compatible modules.

E9x Re-trigger note

Syntax:E9
x = triggering interval
Example: C-4 ·1 ·· E93
C-4 ·1 ·· ···
··· ·· ·· ···
C-4 ·1 ·· ···
Explanation:

This command re-triggers a note every x ticks.

EAx Fine volume slide up

Syntax:EA
x = speed
Example: C-4 ·1 10 EA2
··· ·· ·· EA0
··· ·· ·· EA4
··· ·· ·· EA0
Explanation:

Works similarly to Ax0 volume slide up, only the slide is a lot finer because the effect is applied only once per row.

EBx Fine volume slide down

Syntax:EB
x = speed
Example: C-4 ·1 ·· EB2
··· ·· ·· EB0
··· ·· ·· EB4
··· ·· ·· EB0
Explanation:

Works similarly to A0y volume slide down, only the slide is a lot finer like with EAx.

ECx Note cut

Syntax:EC
x = tick number
Example: C-4 ·1 ·· EC1
C-4 ·1 ·· EC2
C-4 ·1 ·· ···
··· ·· ·· EC0
Explanation:

Cuts a note by setting its volume to 0 at tick precision. Possible parameter x values are 0 – (song speed - 1). Higher values have no effect.

EDx Note delay

Syntax:ED
x = tick number
Example: C-4 ·1 ·· ···
A#3 01 ·· ED3
C-4 ·1 ·· ···
··· ·· ·· ···
Explanation:

Delays a note x ticks. Like with ECx note cut, possible x values are 0 – (song speed - 1). Higher values prevent the note from playing altogether.

EEx Pattern delay

Syntax:EE
x = amount of rows
Example: C-4 ·1 ·· ···
A#3 01 ·· EE5
C-4 ·1 ·· ···
··· ·· ·· ···
Explanation:

Delays playback progression for the duration of x rows.

Fxx Set song speed/BPM

Syntax:F
xx = speed/BPM value
Example: C-4 ·1 ·· F90
A#3 01 ·· F03
C-4 ·1 ·· ···
··· ·· ·· ···
Explanation:

Parameter x values 011F set song speed i.e. the amount of ticks per row. Values 20FF set the BPM which essentially is the speed of the ticks. F00 stops playback.

Gxx Set global volume

Syntax:G
xx = volume
Example: C-4 ·1 ·· G40
··· ·· ·· G20
··· ·· ·· G10
··· ·· ·· G00
Explanation:

Sets the global song note volume 0040.

Hxy Global volume slide

Syntax:H
x = volume slide up speed
y = volume slide down speed
Example: C-4 ·1 ·· H04
··· ·· ·· H04
C-4 ·1 ·· H0F
··· ·· ·· H80
Explanation:

Slides global song volume up/down at speed x/y depending on which parameter is specified.

Notes:

Parameters x and y should NOT be used at the same time, doing so almost guarantees unpredictable results across different players.

Kxx Key-off

Syntax:K
xx = tick number
Example: C-4 ·1 ·· K03
··· ·· ·· ···
C-4 ·1 ·· ···
··· ·· ·· K00
Explanation:

Sends instrument key-off much like the note column counterpart, only in tick precision. As K00 is the equivalent of a note column key-off, it cancels any actual note on the row. Possible parameter xx values are 00 – (song speed - 1). Higher values have no effect.

Lxx Set volume envelope position

Syntax:L
xx = volume envelope position
Example: C-4 ·1 ·· L20
··· ·· ·· ···
··· ·· ·· L00
··· ·· ·· ···
Explanation:

Makes the currently playing note jump to tick xx on the volume envelope timeline.

Pxy Panning slide

Syntax:P
x = panning slide right speed
y = panning slide left speed
Example: C-4 ·1 ·· P04
··· ·· ·· P00
··· ·· ·· P80
··· ·· ·· P00
Explanation:

Slides note panning right/left at speed x/y depending on which parameter is specified. Effect is applied per tick so song speed acts as a multiplier.

Notes:

Parameters x and y should NOT be used at the same time, doing so almost guarantees unpredictable results across different players.

Rxy Re-trigger note with volume slide

Syntax:R
x = volume slide speed
y = triggering interval
Example: C-4 ·1 ·· R81
··· ·· ·· R12
··· ·· ·· R23
··· ·· ·· R04
Explanation:

Much like E9x, this command rapidly re-triggers a note while sliding its volume. Parameter x values affect note volume like this:

  • 0 = previous x value
  • 1 = - 1
  • 2 = - 2
  • 3 = - 4
  • 4 = - 8
  • 5 = -16
  • 6 = * 0.66666666666666666666666666666667
  • 7 = * 0.5
  • 8 = no volume change
  • 9 = + 1
  • A = + 2
  • B = + 4
  • C = + 8
  • D = +16
  • E = * 1.5
  • F = * 2
Notes:

This command is very buggy from the start, straight from the source, Fasttracker II. While FT2's own documentation is inaccurate in many places, this is different. Extensive testing has revealed almost bizarre qualities of this effect and it's up to MilkyTracker to emulate it all. Without doubt the quirk the team has spent the most time and iterations working on getting it right. And still we advise to be careful with it. When using Rxy, check your song with FT2 (render to .WAV if you don't have the hardware (to emulate)), or at least BASS/XMPlay. And if you do find something odd, please report the bug as accurately and detailed as possible.

Setting volume on the volume column (xx) at the same time with Rxy resets the volume to xx before each re-trigger making the effect sound different.

Tips

Use R8y instead of R0y when you want to keep the volume unchanged, these two x values are often documented inaccurately as "No volume change" and "Unused", respectively.

Txy Tremor

Syntax:T
x = ticks on
y = ticks off
Example: C-4 ·1 ·· T13
··· ·· ·· T00
··· ·· ·· T31
··· ·· ·· T00
Explanation:

Rapidly alters note volume from full to zero, x and y setting the duration of the states in ticks.

Notes:

Using T00 makes a fast tremor effect but it also functions as effect memory repeating the last parameters. So you can only use this 00 speed once per channel before you use any other parameter values.

X1x Extra fine portamento up

Syntax:X1
x = speed
Example: C-4 ·1 ·· X11
··· ·· ·· X10
··· ·· ·· X18
··· ·· ·· X10
Explanation:

Works just like E1x fine portamento up, only with 4 times the precision.

X2x Extra fine portamento down

Syntax:X2
x = speed
Example: C-4 ·1 ·· X11
··· ·· ·· X20
··· ·· ·· X28
··· ·· ·· X20
Explanation:

Works just like E2x fine portamento down, only with 4 times the precision like E1x extra fine portamento up.

xx Set note volume

xx = volume
Example: C-4 ·1 ·· ···
··· ·· 10 ···
··· ·· 40 ···
··· ·· 00 ···
Explanation:

Sets the note volume 0040 overriding sample volume setting. This is what the volume column is primarily used for, hence no effect command character. It's the equivalent of Cxx set note volume on the effect column.

+x Volume slide up

Syntax:+
x = speed
Example: C-4 ·1 10 ···
··· ·· +2 ···
··· ·· +4 ···
··· ·· +8 ···
Explanation:

Slides note volume up at speed x with the song speed (ticks) acting as a multiplier like with Ax0 volume slide on the effect column.

-x Volume slide down

Syntax:-
x = speed
Example: C-4 ·1 ·· ···
··· ·· -2 ···
··· ·· -4 ···
··· ·· -8 ···
Explanation:

Slides note volume down at speed x with the song speed (ticks) acting as a multiplier like with A0y volume slide on the effect column.

Dx Fine volume slide down (displayed as ▼x)

Syntax:D
x = speed
Example: C-4 ·1 ·· ···
··· ·· ▼2 ···
··· ·· ▼4 ···
··· ·· ▼8 ···
Explanation:

This is the volume column equivalent of EBx fine volume slide down, effect is applied once per row.

Lx Panning slide left (displayed as ◀x)

Syntax:L
x = speed
Example: C-4 ·1 ·· ···
··· ·· ◀2 ···
··· ·· ◀4 ···
··· ·· ◀8 ···
Explanation:

Slides note panning left at speed x with the song speed value (ticks) acting as a multiplier like with P0x volume slide on the effect column.

Mx Portamento to note

Syntax:M
x = speed
Example: C-4 ·1 ·· ···
E-4 01 ·· 304
··· ·· M0 ···
··· ·· M1 ···
Explanation:

This is the volume column equivalent of 3xx portamento, only with 1 digit resolution. M1 corresponds to 311, M2 to 322 and so on…

Tips:

3xx and Mx share effect memory, so it's possible to initialize a portamento with a more precise 3xx value and sustain it with M0 freeing the effect column for arpeggios, note delays, tremolo or whatever.

Px Set note panning position

Syntax:P
x = speed
Example: C-4 ·1 P4 ···
··· ·· ·· ···
··· ·· PC ···
··· ·· ·· ···
Explanation:

This is the volume column equivalent of 8xx panning, only with 1 digit resolution. P8 corresponds to 888, P9 to 899 and so on…

Tips:

3xx and Mx share effect memory, so it's possible to initialize a portamento with a more precise 3xx value and sustain it with M0 freeing the effect column for arpeggios, note delays, tremolo or whatever.

Rx Panning slide right (displayed as ▶x)

Syntax:R
x = speed
Example: C-4 ·1 ·· ···
··· ·· ▶2 ···
··· ·· ▶4 ···
··· ·· ▶8 ···
Explanation:

Slides note panning right at speed x with the song speed value (ticks) acting as a multiplier like with Px0 volume slide on the effect column.

Sx Set vibrato speed

Syntax:S
x = speed
Example: C-4 ·1 ·· 48F
··· ·· S4 A01
··· ·· ·· 600
··· ·· ·· 400
Explanation:

Sets the vibrato speed like the x in 4xy vibrato. In the example it is used instead of 4xy to free up the effect column.

Ux Fine volume slide up (displayed as ▲x)

Syntax:U
x = speed
Example: C-4 ·1 10 ···
··· ·· ▲2 ···
··· ·· ▲4 ···
··· ·· ▲8 ···
Explanation:

This is the volume column equivalent of EAx fine volume slide up, effect is applied once per row.

Vx Vibrato

Syntax:V
x = depth
Example: C-4 ·1 ·· 484
··· ·· V0 ···
··· ·· V8 ···
··· ·· V0 ···
Explanation:

Performs vibrato with depth x but requires the speed component to be initialized with 4x0 or Sx.

Notes:

Note pitch isn't reset when the command is discontinued.

7. MIDI support

MilkyTracker supports basic MIDI input, which means you can use your MIDI device to feed notes into MilkyTracker. Enabling MIDI input varies a little from platform to platform - here's how to do it on…

Windows: Select Preferences from the system menu (top left corner of the window)
OSX: Select Preferences from the MilkyTracker menu or press Command-,
Linux: Enabled by default if available on the system. See the Linux readme for details.

8. Known issues and bug reports

MilkyTracker aims for full Fasttracker II compatibility in its replay but this goal is easier set than achieved. Some of the original effect implementations defy all documentation and logic. Here's a list of current replay differences between FT2 and Milky:

  • 0xy arpeggio when song speed is greater than or equal to 16
  • E3x glissando control is not implemented.
  • E4x vibrato control is not implemented.
  • E7x tremolo control is not implemamented.
  • Handling of E6x pattern loop and EEx pattern delay on the same row
  • Portamento overflow "effect" isn't reproduced in MilkyTracker.
  • Volume column effects used in conjunction with EDx note delay

If you find more incompatibilities, or if MilkyTracker crashes or does something really stupid, we'd really like to hear from you and it would be even cooler if you could describe how to reproduce the problem. There's a section dedicated to bug reports on our web forum.

9. Credits

The MilkyTracker experience is brought to you by the following people:

pailesmain code
DeltafireSDL port and additional code
kenetgraphics
rainawebsite, documentation maintenance and additional graphics
Kmulandpromotion, support and additional web graphics
StrobeIRC channel administration, demo videos, winning compos

Acknowledgements

Thanks to the following people for their contribution to the project: Varthall/Up Rough for the AmigaOS port, tarzeau for Debian and Ubuntu packaging, ehaupt for FreeBSD port, Gary P. Scavone for RtAudio and RtMidi, kruze, idc, Rez et al. for the fonts, svenzzon for the demo tune, m0d for forum administration, Valerio for the quick reference printouts, syphus for constructive criticism, Flasch, setrodox, jix, Evil-Ville, Spot, the entire Titan crew for support and everybody who donated or dropped a letter.

Special greetings to everyone at #MilkyTracker for making it a daily active channel.

10. Contact

You can contact the MilkyTracker team by email (), through the forum at http://www.milkytracker.net/?community or in IRC. To chat with the community live, you can connect to #MilkyTracker on EsperNet with your IRC client or use the java client on our website.

11. Donations

A word from pailes:

If you like MilkyTracker and you're looking for a way to support its development, why not donate something using PayPal? The PayPal account is . Donations of any amount are appreciated and they keep me going. Also, when you donate, your feature requests will always be on top of my list - isn't that a neat offer?

Don't worry, MilkyTracker will always be free because I really enjoy working on it, but you should remember that FT2 wasn't real freeware either.

milkytracker-0.90.85+dfsg/docs/FAQ.html0000644000175000017500000002655511317477251016675 0ustar admin2admin2 Frequently Asked Questions about MilkyTracker

Frequently Asked Questions about MilkyTracker

Here are some questions answered which get asked on the forum and on IRC from time to time.

  1. Where can I find a list of all the effect codes?
  2. Where can I find a list of all the keyboard shortcuts?
  3. Why does MilkyTracker look different from Fasttracker II?
    • The GUI of MilkyTracker has been adjusted to fit low resolution displays with 320x240 pixels. Thus the screen can be more easily divided into seperate pages.
  4. Where are the extended Sample Editor functions (S.E.Ext.)?
    • In the sample context menu, just right-click / tap'n hold in the sample area. The Pattern and Instrument Editors have their context menus too, you know.
  5. Why does my .XM sound different from Ft2 in MilkyTracker?
    • MilkyTracker tries to play XMs as accurate as possible but there are still known and unknown issues. Most of them are rare but if you find one, report it to us and we'll try to fix it.
  6. Why does my .XM sound different from ModPlug/Schism/WinAMP/xxx in MilkyTracker?
    • MilkyTracker aims to reproduce Ft2 playback as closely as possible while other players/trackers don't do that, so if you think your track is being messed up in MilkyTracker compare it to Ft2 first. If it still sounds weird, see the question above.
  7. Why doesn't MilkyTracker load my .XM (created in ModPlug)?
    • Unless the module is otherwise corrupt, it probably features more than 32 channels. In Fasttracker II, 32 is the maximum.
  8. Why does MilkyTracker play my IT/S3M/xxx module wrong?
    • Well, MilkyTracker is an XM tracker. It will play all other tunes (except for .MOD) the way Ft2 would do it. Every feature from other modules not being XM compatible will be thrown out when importing the song.
  9. What do the buttons SEQ, CLN, F, P, W and L do?
    • SEQ stands for sequence, the button inserts the next unused pattern in the pattern order table.
    • CLN stands for clone, it does the same as SEQ but additionally it copies the data from current pattern to the new one.
    • The F button toggles song following. Disabling it enables you to better edit the song while it is playing.
    • The P button toggles prospective pattern view. When disabled, you see one pattern at a time. When enabled, the patterns show as a continuous strip.
    • The W button toggles pattern wrapping. Basically it either allows you to freely move from pattern to pattern while editing or helps you concentrate on one pattern at a time.
    • The L button toggles live mode. This affects the pattern change behavior. When it's off, changing song positions is instant. In live mode, the change happens after the current pattern has been finished which allows seamless skipping from one part of a song to another. Repetitions, jamming, you know, generic live stuff.
  10. What are Jam channels?
    • Jam channels enable you to play notes live on your MIDI or computer keyboard independent of the song channels. If disabled, note polyphony is restricted to whatever number of channels the song has.
  11. Does MilkyTracker support MIDI?
    • MilkyTracker supports some basic MIDI INPUT, which means you can use your MIDI device to feed notes into MilkyTracker. See the documentation for instructions on how to enable MIDI In on different platforms.
  12. Can you port MilkyTracker to platform xxx?
    • Unfortunately my time is rather limited at the moment so first you need to know some things about MilkyTracker:
    • MilkyTracker is written in a platform independent fashion and uses a rather primitive approach of software rendering to make porting as easy as possible. On the downside this means MilkyTracker needs quite some CPU power. At the bottom end of the desktop version MilkyTracker requires at least around 300Mhz to run MilkyTracker in 640x480x16 bit color. This might seem quite a bit, but actually it's nothing compared to nowadays computer speeds. MilkyTracker was never written with old computer systems in mind. The low resolution version (320x240) will probably run on systems offering 150Mhz or more but 320x240 is the only supported low resolution mode.
    • MilkyTracker is *heavily* mouse centered. And I really mean *heavy*. Controlling MilkyTracker with a few buttons only will not be fun and totally useless and I'm not going to waste time on a port for a device without a mouse equivalent (touch screen etc.). Please understand that porting itself often requires quite an amount of time and still doesn't guarentee MilkyTracker to be fully useable.
    • Now that MilkyTracker is open-source the opportunity exists for anyone with enough motivation to port MilkyTracker to whatever platform they desire.
  13. Why isn't there a PSP/NDS port of MilkyTracker?
    • Because noone has had the motivation to write one. Perhaps you do :)
  14. Can you tell me a bedtime story?
    • Yes. Once upon a time…
      11:32	anyguy has joined #MilkyTracker
      11:32	pailes yawns
      11:32	<anyguy> Hi
      11:32	<pailes> hi there
      11:33	<anyguy> this sounds terrible, but i just downloaded milky traker and i have no idea how to use it
      11:33	<anyguy> any help?
      11:34	<pailes> load a song
      11:34	<pailes> play it
      11:34	<pailes> maybe watch the video tutorials
      11:34	<anyguy> the vids on youtube were no help
      11:34	<pailes> what was the problem?
      11:35	<anyguy> i have no idea how to work milky traker
      11:35	<pailes> I guess you have to be more specific
      11:36	<anyguy> i cant even make a simple sound or track
      11:36	<pailes> can you load a song and play it?
      11:36	<anyguy> no clue how?
      11:37	<pailes> "load" a song 
      11:37	<pailes> there is a "load" button
      11:37	<pailes> which suggests you should press it to load a song
      11:37	<anyguy> i know, but its all... blah, file types
      11:38	<anyguy> error loading file type
      11:38	<pailes> you can only load songs which have the .xm extension
      11:38	<pailes> i.e. some of the songs which are included in the milkytracker distribution package
      11:39	<anyguy> nice, but how do i edit or build on that?
      11:39	<pailes> first I suggest to press the config button
      11:40	<pailes> then select the misc. tab by pressing the misc. button
      11:40	<pailes> and switch to milkytracker edit mode
      11:40	<pailes> this mode will be easier to use
      11:41	<pailes> for people not having any tracking background
      11:41	<anyguy> so for now on out, trial and error?
      11:41	<anyguy> this is alien to me
      11:41	<pailes> when you have enabled milkytracker edit mode you can edit pattern data by clicking into the pattern, this will focus the pattern editor
      11:41	<pailes> rec. will turn red
      11:42	<anyguy> i see
      11:42	<pailes> which means you can edit pattern data
      11:42	<pailes> you can enter regular notes by pressing keys on your pc keyboard
      11:42	<pailes> c, c#, d, etc.
      11:43	<anyguy> how do i clear it all and use the samples
      11:43	<pailes> pres "zap" and then "song"
      11:43	<pailes> it will preserve the samples
      11:44	<anyguy> so how do i start now?
      11:44	<pailes> try to find which key on the keyboard maps to which note... there are also some documents which you can read to understand how a tracker works
      11:45	<pailes> you can change the octave with the function keys btw. only two octaves of notes are available at a time through the keyboard, if you want to change the octave you need to do it manually 
      11:45	<anyguy> can i change the speed?
      11:47	<pailes> you do that by inserting a speed command in the last column of a track (a track are those vertical units in the pattern)
      11:47	<pailes> everything is done using those commands
      11:49	<pailes> maybe this helps: http://en.wikipedia.org/wiki/Tracker
      11:50	<pailes> although this article is a little bit outdated
      12:06	<anyguy> god i suck at this
      12:16	<anyguy> i dont know what im doing wrong here
      12:17	<pailes> you can't learn tracking in a few minutes... it really takes some dedication and time
      12:17	<anyguy> how do i start though
      12:19	<pailes> reading and trial and error
      12:20	<pailes> and loading songs and listen to them and find out how they're made by altering sample and pattern data
      12:25	<anyguy> blaw
      12:25	anyguy has disconnected: Quit: Saving BACKUP.XM...
      12:26	<pailes> yes, bye bye
      The end.
milkytracker-0.90.85+dfsg/docs/MilkyTracker.rtf0000644000175000017500000003147710737746457020531 0ustar admin2admin2{\rtf1\ansi\ansicpg10000\deff0{\fonttbl{\f0\froman\fprq2\fcharset77 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}} {\*\generator Msftedit 5.41.15.1503;}\viewkind4\uc1\pard\tx565\tx1133\tx1700\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\lang1033\ul\b\f0\fs32 MilkyTracker Documentation\ulnone\fs40\par \fs48\par \b0\fs22 Hello and welcome to this very first version of MilkyTracker a platform independent FastTracker II "clone"\par \par Currently supported platforms are:\par - Windows\par - Mac OS X\par - PocketPC (Windows CE 3.0 and above)\par \par I'm also working on a pure SDL port which is supposed to run under Linux as well but it will take some more time.\par \par \b\fs24 Important:\b0\par \fs22 Right now MilkyTracker is under heavy development so use it at your own risk.\par I'm not responsible for any loss of data and or hardware damage caused by MilkyTracker.\par Lots of functionality is still\lang1031\f1 missing.\lang1033\f0\par \par \ul\b\fs24 Quick Overview:\par \ulnone\b0\fs22\par Due to request MilkyTracker features two edit modes:\par \par \ul\b I. MilkyTracker edit mode:\b0\par \ulnone The MilkyTracker mode basically a bit more "modern" because you can focus on different parts \par (e.g. Pattern Editor, Instrument Listbox, Sample Listbox etc.) and when you're pressing\par keys they're routed to the focused control.\par Also keyboard shortcuts are more standard, you can select by pressing the SHIFT key\par and navigating with the cursor keys, cut, copy & paste with using CTRL+X/C/V etc.\par I think users who are new to tracking will find this a bit more intuitive.\par The edit mode can be changed in the config screen (Misc. tab)\par \par Right now a few common keyboard shortcuts are supported in the \b MilkyTracker edit mode\b0 :\par \par \ul Global shortcuts:\par \ulnone Space: \tab\tab\tab Toggle pattern editor focus (edit mode on/off)\par Enter: \tab\tab\tab Play song from current order\par Ctrl+Enter:\tab\tab\tab Play current pattern from beginning\par Shift+Enter:\tab\tab\tab Play current pattern from cursor position\par Shift+F9\tab\tab\tab Play current pattern from beginning (same as Ctrl+Enter)\par Shift+F10\tab\tab\tab Play current pattern from position after the first quarter of the pattern length\par Shift+F11\tab\tab\tab Play current pattern from position after the second quarter of the pattern length\par Shift+F12\tab\tab\tab Play current pattern from position after the third quarter of the pattern length\par ESC: \tab\tab\tab\tab Stop playing\par Ctrl+O: \tab\tab\tab Load new song\par Ctrl+S: \tab\tab\tab Save song\par Ctrl+Shift+S: \tab\tab Save song under new filename\ul\par \ulnone\par \ul Transpose:\par \ulnone Shift+F7: \tab\tab\tab Transpose current instrument in track down\par Shift+F8: \tab\tab\tab Transpose current instrument in track up\par Ctrl+F7: \tab\tab\tab Transpose current instrument in pattern down\par Ctrl+F8: \tab\tab\tab Transpose current instrument in pattern up\par Alt+F7: \tab\tab\tab Transpose current instrument in block down\par Alt+F8: \tab\tab\tab Transpose current instrument in block up\par Shift+F1: \tab\tab\tab Transpose all instruments in track down\par Shift+F2: \tab\tab\tab Transpose all instruments in track up\par Ctrl+F1: \tab\tab\tab Transpose all instruments in pattern down\par Ctrl+F2:\tab\tab\tab Transpose all instruments in pattern up\par Alt+F1: \tab\tab\tab Transpose all instruments in block down\par Alt+F2: \tab\tab\tab Transpose all instruments in block up\par \par \ul Pattern Editor:\par \ulnone Cursor keys: \tab\tab Move around\par Tab: \tab\tab\tab\tab Jump to next channel\par PgUp/PgDn: \tab\tab 16 rows up/down\par Home/End\tab\tab\tab Guess what\par F1-F8: \tab\tab\tab choose octave\par F9\tab\tab\tab\tab Jump to position 0 in pattern\par F10\tab\tab\tab\tab Jump to position after the first quarter of the pattern length\par F11\tab\tab\tab\tab Jump to position after the second quarter of the pattern length\par F12\tab\tab\tab\tab Jump to position after the third quarter of the pattern length\par Ctrl-Z: \tab\tab\tab Undo\par Ctrl-Y: \tab\tab\tab Redo\par Ctrl-X: \tab\tab\tab Cut\par Ctrl-V: \tab\tab\tab Paste\par Ctrl+A: \tab\tab\tab Select entire pattern\par Shift-M: \tab\tab\tab Mute current selected channel\par Ctrl+Shift-M: \tab\tab Invert current muting\par Ctrl+I: \tab\tab\tab Interpolate values\par Delete: \tab\tab\tab Delete note/instrument/volume/effect/operand\par Sh+Del: \tab\tab\tab Delete note, volume and effect at cursor.\par Ctrl+Del: \tab\tab\tab Delete volume and effect at cursor.\par Alt+Delete: \tab\tab\tab Delete effect at cursor.\par Insert: \tab\tab\tab Insert a new note slot at current cursor position\par Shift-Insert: \tab\tab Insert an entire row at current cursor position\par Backspace: \tab\tab\tab Delete note slot before current cursor position\par Shift-Backspace: \tab\tab Delete entire row of notes before current cursor position\par \par Try to play around with pressing other keys to find out what notes they're mapped to =)\par \par \ul\b II. FastTracker 2 edit mode:\b0\par \ulnone The FT2 edit mode is for the die-hard FT2 user and is propably not so intuitive to use,\par but I think FT2 users don't care about that.\par \b Please note\b0 that not all FT2 shortcuts are implemented yet and some may differ because\par of various reasons.\par \b Also note \b0 that this edit mode is not working very well on a PocketPC because of limited\par input devices. \par \par Right now the following FT2 keyboard shortcuts are supported in the \b FastTracker edit mode\b0 :\par (copied straight out of FT2 manual ;))\par \par \pard\b 5.1 Cursor moves:\par \par \b0 PageUp \tab Jump 16-lines upwards.\par PageDown \tab Jump 16-lines downwards.\par Home\tab\tab Jump to line 0.\par End \tab\tab Jump to last line.\par Tab \tab\tab Jump to next track.\par Sh+Tab \tab Jump to previous track.\par Alt+Q..I \tab Jump to track (0..7) MOD N-Channels.\par Alt+A..K \tab Jump to track (8..15) MOD N-Channels.\par \b\par 5.2 Cut/Copy/Paste:\par \par \b0 Del\tab\tab Delete note or volume column at cursor.\par Sh+Del\tab\tab Delete note, volume and effect at cursor.\par Ctrl+Del\tab Delete volume and effect at cursor.\par Alt+Delete \tab Delete effect at cursor.\par Ins \tab\tab Insert note at cursor.\par Sh+Ins \tab Insert line at cursor.\par Backsp. \tab Delete previous note.\par Sh+Backsp\tab Delete previous line.\par Alt+Cursor\tab Mark block.\par Sh+F3 \tab\tab Cut track.\par Sh+F4 \tab\tab Copy track.\par Sh+F5 \tab\tab Paste track.\par Ctrl+F3 \tab Cut pattern.\par Ctrl+F4 \tab Copy pattern.\par Ctrl+F5 \tab Paste pattern.\par Alt+F3\tab\tab Cut block.\par Alt+F4 \tab\tab Copy block (yes even under windows =)).\par Alt+F5 \tab\tab Paste block.\par \b\par Additional shortcuts (not FT2):\par \pard\tx565\tx1133\tx1420\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\b0\i Ctrl-Alt+Z \tab\tab Undo\par Ctrl-Alt+Y \tab\tab Redo\par Ctrl+Alt+A \tab\tab Select entire pattern\par Shift-M \tab\tab Mute current selected channel\par Ctrl+Shift-M \tab Invert current muting\par Shift+I \tab\tab Interpolate values\par \pard\b\i0\par 5.3 Miscellaneous:\par \par \pard\tx565\tx1133\tx1420\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\b0 Right Ctrl \tab\tab Play song from current order (\b only works under Windows\b0 )\par \pard\i Enter: \tab\tab Play song from current order\par \pard\tx565\tx1133\tx1420\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\i0 Right Alt \tab\tab Play current pattern from beginning (\b only works under Windows\b0 )\i\par Ctrl+Enter:\tab\tab Play current pattern from beginning\par \pard\tx565\tx1420\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802 Shift+Enter:\tab Play current pattern from cursor position\par \pard\tx565\tx1133\tx1420\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\i0 Space\tab\tab\tab Stop/Edit\par \i ESC\tab\tab\tab Stop all playing\par \i0 F1..F8 \tab\tab Select octave\par F9\tab\tab\tab Jump to position 0 in pattern\par F10\tab\tab\tab Jump to position after the first quarter of the pattern length\par F11\tab\tab\tab Jump to position after the second quarter of the pattern length\par F12\tab\tab\tab Jump to position after the third quarter of the pattern length\par \i Shift+F9\tab\tab Play current pattern from beginning (same as Ctrl+Enter/Right Alt)\par Shift+F10\tab\tab Play current pattern from position after the first quarter of the pattern length\par Shift+F11\tab\tab Play current pattern from position after the second quarter of the pattern length\par Shift+F12\tab\tab Play current pattern from position after the third quarter of the pattern length\i0\par Caps-Lock\tab\tab Enter Keyoff-"note" (\b only works under Windows\b0 )\par Sh+Left \tab\tab Increase song position\par Sh+Right \tab\tab Decrease song position\par Ctrl+Left \tab\tab Increase pattern number\par Ctrl+Right \tab\tab Decrease pattern number\par \pard\b\par \pard\fi-282\li282 Window switching:\par \pard\par \b0 Ctrl+\par A \tab\tab Advanced edit.\par C \tab\tab Configuration.\par D \tab\tab Disk operations.\par I \tab\tab Instrument editor.\par S \tab\tab Sample editor.\par T \tab\tab Transpose.\par X \tab\tab Main screen. (almost alt+X)\par Z \tab\tab Show/Hide scopes\par R\tab\tab Disk recorder\par \b\par 5.5 Instrument select (Numeric keypad):\par \par \b0 Sh+Up \tab\tab Select previous instrument\par Sh+Down \tab Select next instrument\par Sh+\lang1031\f1 Alt+\lang1033\f0 Up \tab Select previous \lang1031\f1 sample\lang1033\f0\par Sh+\lang1031\f1 Alt+\lang1033\f0 Down \tab Select next \lang1031\f1 sample\lang1033\f0\par \par You can also quick-type the hex-number of the instrument you want to select\par on the numeric keypad, the layout is like this:\par \pard\fi-400\li400\par \pard\tx560 0..9 \tab = Digit 0..9\b\par \b0\par PC Keyboard:\par / \tab = Digit A\par * \tab = Digit B\par - \tab = Digit C\par + \tab = Digit D\par Enter = Digit E\par , \tab = Digit F\par \par Mac Keyboard:\par = \tab = Digit A\par / \tab = Digit B\par * \tab = Digit C\par - \tab = Digit D\par \lang1031\f1 +\lang1033\f0 \lang1031\f1\tab\lang1033\f0 = Digit E\par \lang1031\f1 Enter\lang1033\f0 \tab = Digit F\par \b\par \pard\par 5.6 Command/Volume macro:\par \b0\par Alt+1..0 \tab Write command/volume at cursor.\par Sh+Alt+1..0 \tab Read command/volume at cursor.\par \par \b 5.7 Transpose:\par \par \b0 Sh+F7 \tab\tab Transpose current instrument in track down\par Sh+F8 \tab\tab Transpose current instrument in track up\par Ctrl+F7 \tab Transpose current instrument in pattern down\par Ctrl+F8 \tab Transpose current instrument in pattern up\par Alt+F7 \tab\tab Transpose current instrument in block down\par Alt+F8 \tab\tab Transpose current instrument in block up\par Sh+F1 \tab\tab Transpose all instruments in track down\par Sh+F2 \tab\tab Transpose all instruments in track up\par Ctrl+F1 \tab Transpose all instruments in pattern down\par Ctrl+F2\tab\tab Transpose all instruments in pattern up\par Alt+F1 \tab\tab Transpose all instruments in block down\par Alt+F2 \tab\tab Transpose all instruments in block up.\par \pard\tx565\tx1133\tx1700\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\par \pard\b 5.8 Other:\par \par \b0 Ctrl+V \tab\tab Volume scale pattern\par Alt+V \tab\tab Volume scale block\par Shift+V \tab Volume scale track\par \pard\tx565\tx1133\tx1700\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\par (\b please note that under Mac OS X the "Apple" key is used instead of the Ctrl key\b0 )\par \par If MilkyTracker crashes or does something really stupid I'd really like to hear from you\par and it would be even cooler if you can reproduce the problem as closely as possible.\par \par \b\fs24 Known issues:\b0\par \fs22 Some things work different in MilkyTracker and some dialogs may look different ;)\par \par Okay that's all for now, a more detailed explanations of all the functions will follow later.\par (In the meantime why don't you check out the official FastTracker 2 document?)\par \par \b\fs24 Donate:\b0\fs22\par If you like MilkyTracker and you're looking for a way to support me developing it, \par why don't you donate something using PayPal?\par My PayPal account: \b donate@milkytracker.net\b0\par Any donation will be appreciated and it keeps me going. Also, when donating, your\par feature requests will always be on top of my list, isn't that a neat offer? \par \par Don't worry MilkyTracker will always be free because I really enjoy working on it,\par but you should remember that FT2 wasn't real freeware either \par \par Contact me:\par \b support@milkytracker.net\par \b0 or visit\par \b http://www.milkytracker.net\par \par Thanks to anyone who has contributed:\par Kenet (for the amazing logos), Kmuland (for always supporting me), \par raina (for the nice icons), Svenzzon (for his nice example tune) \par \lang1031\f1 the entire Titan crew for supporting my work \lang1033\f0 and everybody else \par who dropped me a letter...\par \b0\par \pard Have fun...\fs20\par } milkytracker-0.90.85+dfsg/docs/readme_rtaudio0000755000175000017500000000366410766725353020314 0ustar admin2admin2/************************************************************************/ /*! \class RtAudio \brief Realtime audio i/o C++ classes. RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), SGI, Macintosh OS X (CoreAudio and Jack), and Windows (DirectSound and ASIO) operating systems. RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2007 Gary P. Scavone 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. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. 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. */ /************************************************************************/milkytracker-0.90.85+dfsg/ChangeLog0000644000175000017500000000003011000267720016161 0ustar admin2admin2See docs/ChangeLog.html milkytracker-0.90.85+dfsg/INSTALL0000644000175000017500000002231010737757152015470 0ustar admin2admin2Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. milkytracker-0.90.85+dfsg/NEWS0000644000175000017500000000007611316456771015140 0ustar admin2admin2See http://www.milkytracker.org/ for latest news and updates. milkytracker-0.90.85+dfsg/Makefile.am0000644000175000017500000000077511136161517016472 0ustar admin2admin2SUBDIRS = src EXTRA_DIST = docs/ChangeLog.html docs/EqualizerDesign.doc docs/FAQ.html \ docs/MilkyTracker.html docs/TiTAN.nfo docs/readme_OSX.html \ docs/readme_PocketPC.html docs/readme_rtaudio docs/readme_unix \ platforms/osx/milkytracker_ppc.zip platforms/osx/milkytracker_sdl.zip \ platforms/osx/milkytracker_universal.zip \ platforms/win32/milkytracker_devcpp.zip platforms/win32/milkytracker_vs8.zip \ platforms/wince/milkytracker_evc3.zip resources/pictures/carton.ico \ resources/pictures/carton.png milkytracker-0.90.85+dfsg/autom4te.cache/0000755000175000017500000000000011317506530017230 5ustar admin2admin2milkytracker-0.90.85+dfsg/autom4te.cache/output.00000644000175000017500000074473511317506524020700 0ustar admin2admin2@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.64 for MilkyTracker 0.90.85. @%:@ @%:@ Report bugs to . @%:@ @%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software @%:@ Foundation, Inc. @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # 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. 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+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: www.milkytracker.net about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set $? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global $as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error ERROR [LINENO LOG_FD] @%:@ --------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in @%:@( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # 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` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='MilkyTracker' PACKAGE_TARNAME='milkytracker' PACKAGE_VERSION='0.90.85' PACKAGE_STRING='MilkyTracker 0.90.85' PACKAGE_BUGREPORT='www.milkytracker.net' PACKAGE_URL='' ac_unique_file="src" ac_header_list= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIB@&t@OBJS SDL_LIBS SDL_CFLAGS SDL_CONFIG ZZIP_LIBS ZZIP_CFLAGS PKG_CONFIG ALSA_LIBS ALSA_CFLAGS RTMIDI_DIR RTMIDI EGREP GREP RANLIB CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking with_alsa with_alsa_prefix with_alsa_inc_prefix enable_alsatest with_sdl_prefix with_sdl_exec_prefix enable_sdltest with_jack ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PKG_CONFIG ZZIP_CFLAGS ZZIP_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # 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. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -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) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$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 ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$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 ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) 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 | -n) 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 ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=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 ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $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} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_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 ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # 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 the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` 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 test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # 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 <<_ACEOF \`configure' configures MilkyTracker 0.90.85 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/milkytracker@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of MilkyTracker 0.90.85:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-alsatest Do not try to compile and run a test Alsa program --disable-sdltest Do not try to compile and run a test SDL program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-alsa Enable native ALSA sound/midi support @<:@default=check@:>@ --with-alsa-prefix=PFX Prefix where Alsa library is installed(optional) --with-alsa-inc-prefix=PFX Prefix where include libraries are (optional) --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) --with-jack Enable JACK support @<:@default=check@:>@ Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility ZZIP_CFLAGS C compiler flags for ZZIP, overriding pkg-config ZZIP_LIBS linker flags for ZZIP, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF MilkyTracker configure 0.90.85 generated by GNU Autoconf 2.64 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # 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;} return $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.$ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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;} } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( cat <<\_ASBOX ## ----------------------------------- ## ## Report this to www.milkytracker.net ## ## ----------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi 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;} } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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;} } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_find_intX_t LINENO BITS VAR @%:@ ----------------------------------- @%:@ Finds a signed integer type with width BITS, setting cache variable VAR @%:@ accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array @<:@1 - 2 * !(0 < ($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 1))@:>@; test_array @<:@0@:>@ = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array @<:@1 - 2 * !(($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 1) < ($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 2))@:>@; test_array @<:@0@:>@ = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in @%:@( int$2_t) : eval "$3=yes" ;; @%:@( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval as_val=\$$3 if test "x$as_val" = x""no; then : else break fi done 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;} } @%:@ ac_fn_c_find_intX_t @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $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;} } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_find_uintX_t LINENO BITS VAR @%:@ ------------------------------------ @%:@ Finds an unsigned integer type with width BITS, setting cache variable VAR @%:@ accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array @<:@1 - 2 * !(($ac_type) -1 >> ($2 - 1) == 1)@:>@; test_array @<:@0@:>@ = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in @%:@( uint$2_t) : eval "$3=yes" ;; @%:@( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval as_val=\$$3 if test "x$as_val" = x""no; then : else break fi done 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;} } @%:@ ac_fn_c_find_uintX_t @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* 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 $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext 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;} } @%:@ ac_fn_c_check_func 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 MilkyTracker $as_me 0.90.85, which was generated by GNU Autoconf 2.64. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/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` /usr/bin/hostinfo = `(/usr/bin/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` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # 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. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " fcntl.h" as_fn_append ac_header_list " inttypes.h" as_fn_append ac_header_list " limits.h" as_fn_append ac_header_list " malloc.h" as_fn_append ac_header_list " memory.h" as_fn_append ac_header_list " stddef.h" as_fn_append ac_header_list " stdint.h" as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " string.h" as_fn_append ac_header_list " strings.h" as_fn_append ac_header_list " sys/ioctl.h" as_fn_append ac_header_list " sys/param.h" as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; 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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_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 # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## 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 am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # 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" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $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 : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /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 for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir 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. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$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' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } 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 $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; 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_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # 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_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; 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_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # 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_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='milkytracker' VERSION='0.90.85' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC 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 { $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_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # 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_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # 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_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" # 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then : $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C++ compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } 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_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= 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 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $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 : $as_echo_n "(cached) " >&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 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_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no 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 if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 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 ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. 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 : $as_echo_n "(cached) " >&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 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_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi 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 : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$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 { $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 : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end 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; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; 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 for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&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 : $as_echo_n "(cached) " >&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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # 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 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } 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 for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # 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_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done 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 { $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_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # 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_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; 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_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # 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_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Checks for header files. ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; 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_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; 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_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $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 : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $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 : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # AC_CHECK_HEADER(zzip/lib.h,,AC_MSG_ERROR("Cannot find zzip/lib.h")) # Checks for libraries. @%:@ Check whether --with-alsa was given. if test "${with_alsa+set}" = set; then : withval=$with_alsa; else with_alsa=check fi if test "x$with_alsa" != xno; then alsa_save_CFLAGS="$CFLAGS" alsa_save_LDFLAGS="$LDFLAGS" alsa_save_LIBS="$LIBS" alsa_found=yes @%:@ Check whether --with-alsa-prefix was given. if test "${with_alsa_prefix+set}" = set; then : withval=$with_alsa_prefix; alsa_prefix="$withval" else alsa_prefix="" fi @%:@ Check whether --with-alsa-inc-prefix was given. if test "${with_alsa_inc_prefix+set}" = set; then : withval=$with_alsa_inc_prefix; alsa_inc_prefix="$withval" else alsa_inc_prefix="" fi @%:@ Check whether --enable-alsatest was given. if test "${enable_alsatest+set}" = set; then : enableval=$enable_alsatest; enable_alsatest="$enableval" else enable_alsatest=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA CFLAGS" >&5 $as_echo_n "checking for ALSA CFLAGS... " >&6; } if test "$alsa_inc_prefix" != "" ; then ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" CFLAGS="$CFLAGS -I$alsa_inc_prefix" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_CFLAGS" >&5 $as_echo "$ALSA_CFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA LDFLAGS" >&5 $as_echo_n "checking for ALSA LDFLAGS... " >&6; } if test "$alsa_prefix" != "" ; then ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" LDFLAGS="$LDFLAGS $ALSA_LIBS" fi ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" LIBS="$ALSA_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_LIBS" >&5 $as_echo "$ALSA_LIBS" >&6; } min_alsa_version=1.0.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libasound headers version >= $min_alsa_version" >&5 $as_echo_n "checking for libasound headers version >= $min_alsa_version... " >&6; } no_alsa="" alsa_min_major_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` alsa_min_minor_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` alsa_min_micro_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { /* ensure backward compatibility */ #if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) #define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR #endif #if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) #define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR #endif #if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) #define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR #endif # if(SND_LIB_MAJOR > $alsa_min_major_version) exit(0); # else # if(SND_LIB_MAJOR < $alsa_min_major_version) # error not present # endif # if(SND_LIB_MINOR > $alsa_min_minor_version) exit(0); # else # if(SND_LIB_MINOR < $alsa_min_minor_version) # error not present # endif # if(SND_LIB_SUBMINOR < $alsa_min_micro_version) # error not present # endif # endif # endif exit(0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: found." >&5 $as_echo "found." >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not present." >&5 $as_echo "not present." >&6; } alsa_found=no fi rm -f core conftest.err 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 if test "x$enable_alsatest" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_ctl_open in -lasound" >&5 $as_echo_n "checking for snd_ctl_open in -lasound... " >&6; } if test "${ac_cv_lib_asound_snd_ctl_open+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $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 snd_ctl_open (); int main () { return snd_ctl_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_ctl_open=yes else ac_cv_lib_asound_snd_ctl_open=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_asound_snd_ctl_open" >&5 $as_echo "$ac_cv_lib_asound_snd_ctl_open" >&6; } if test "x$ac_cv_lib_asound_snd_ctl_open" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else alsa_found=no fi fi if test "x$alsa_found" = "xyes" ; then RTMIDI="../midi/libmidi.a" RTMIDI_DIR="midi" LIBS=`echo $LIBS | sed 's/-lasound//g'` LIBS=`echo $LIBS | sed 's/ //'` LIBS="-lasound $LIBS" fi if test "x$alsa_found" = "xno" ; then if test "x$with_alsa" != xcheck; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "--with-alsa was given, but test for alsa failed See \`config.log' for more details." "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ALSA not found - midi support disabled" >&5 $as_echo "$as_me: WARNING: ALSA not found - midi support disabled" >&2;} fi CFLAGS="$alsa_save_CFLAGS" LDFLAGS="$alsa_save_LDFLAGS" LIBS="$alsa_save_LIBS" ALSA_CFLAGS="" ALSA_LIBS="" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gzopen" >&5 $as_echo_n "checking for library containing gzopen... " >&6; } if test "${ac_cv_search_gzopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 gzopen (); int main () { return gzopen (); ; return 0; } _ACEOF for ac_lib in '' z; 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_gzopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_gzopen+set}" = set; then : break fi done if test "${ac_cv_search_gzopen+set}" = set; then : else ac_cv_search_gzopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gzopen" >&5 $as_echo "$ac_cv_search_gzopen" >&6; } ac_res=$ac_cv_search_gzopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "@%:@define HAVE_LIBZ 1" >>confdefs.h fi #AC_CHECK_LIB(zzip, zzip_file_open,,AC_MSG_ERROR("Cannot find -lzzip")) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; 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_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_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_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; 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_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_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_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZZIP" >&5 $as_echo_n "checking for ZZIP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$ZZIP_CFLAGS"; then pkg_cv_ZZIP_CFLAGS="$ZZIP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zziplib >= 0.10.75\""; } >&5 ($PKG_CONFIG --exists --print-errors "zziplib >= 0.10.75") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ZZIP_CFLAGS=`$PKG_CONFIG --cflags "zziplib >= 0.10.75" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$ZZIP_LIBS"; then pkg_cv_ZZIP_LIBS="$ZZIP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zziplib >= 0.10.75\""; } >&5 ($PKG_CONFIG --exists --print-errors "zziplib >= 0.10.75") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ZZIP_LIBS=`$PKG_CONFIG --libs "zziplib >= 0.10.75" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ZZIP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "zziplib >= 0.10.75"` else ZZIP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "zziplib >= 0.10.75"` fi # Put the nasty error message in config.log where it belongs echo "$ZZIP_PKG_ERRORS" >&5 as_fn_error "Package requirements (zziplib >= 0.10.75) were not met: $ZZIP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables ZZIP_CFLAGS and ZZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables ZZIP_CFLAGS and ZZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else ZZIP_CFLAGS=$pkg_cv_ZZIP_CFLAGS ZZIP_LIBS=$pkg_cv_ZZIP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi SDL_VERSION=1.2.0 @%:@ Check whether --with-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then : withval=$with_sdl_prefix; sdl_prefix="$withval" else sdl_prefix="" fi @%:@ Check whether --with-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then : withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi @%:@ Check whether --enable-sdltest was given. if test "${enable_sdltest+set}" = set; then : enableval=$enable_sdltest; else enable_sdltest=yes fi if test x$sdl_exec_prefix != x ; then sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; 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_path_SDL_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_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_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_sdl_version=$SDL_VERSION { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; } no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_sdl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" as_fn_error "Please install libSDL" "$LINENO" 5 fi rm -f conf.sdltest CPPFLAGS="$CPPFLAGS -D__FORCE_SDL_AUDIO__" # Check that SDL supports the X11 wm { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether SDL supports X11" >&5 $as_echo_n "checking whether SDL supports X11... " >&6; } OLDCPPFLAGS=$CPPFLAGS CPPFLAGS=$SDL_CFLAGS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include const int test = SDL_SYSWM_X11; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_X11 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS=$OLDCPPFLAGS # Jack is dynamically linked to ease binary portability (no longer required) @%:@ Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; else with_jack=check fi if test x$with_jack != xno; then for ac_header in jack/jack.h do : ac_fn_c_check_header_mongrel "$LINENO" "jack/jack.h" "ac_cv_header_jack_jack_h" "$ac_includes_default" if test "x$ac_cv_header_jack_jack_h" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_JACK_JACK_H 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5 $as_echo_n "checking for library containing dlsym... " >&6; } if test "${ac_cv_search_dlsym+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 dlsym (); int main () { return dlsym (); ; return 0; } _ACEOF for ac_lib in '' dl; 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_dlsym=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_dlsym+set}" = set; then : break fi done if test "${ac_cv_search_dlsym+set}" = set; then : else ac_cv_search_dlsym=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5 $as_echo "$ac_cv_search_dlsym" >&6; } ac_res=$ac_cv_search_dlsym if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error "Dynamic library support not found - required for JACK support" "$LINENO" 5 fi else if test x$with_jack != xcheck; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "--with-jack was given, but JACK headers were not found See \`config.log' for more details." "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: JACK headers not found, JACK support disabled" >&5 $as_echo "$as_me: WARNING: JACK headers not found, JACK support disabled" >&2;} fi fi done fi # 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if defined S_ISBLK && defined S_IFDIR extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; #endif #if defined S_ISBLK && defined S_IFCHR extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; #endif #if defined S_ISLNK && defined S_IFREG extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; #endif #if defined S_ISSOCK && defined S_IFREG extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stat_broken=no else ac_cv_header_stat_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 $as_echo "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then $as_echo "@%:@define STAT_MACROS_BROKEN 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if test "${ac_cv_header_stdbool_h+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; bool e = &s; char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; # if defined __xlc__ || defined __GNUC__ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 reported by James Lemley on 2005-10-05; see http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html This test is not quite right, since xlc is allowed to reject this program, as the initializer for xlcbug is not one of the forms that C requires support for. However, doing the test right would require a runtime test, and that would make cross-compilation harder. Let us hope that IBM fixes the xlc bug, and also adds support for this kind of constant expression. In the meantime, this test will reject xlc, which is OK, since our stdbool.h substitute should suffice. We also test this with GCC, where it should work, to detect more quickly whether someone messes up the test in the future. */ char digs[] = "0123456789"; int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); # endif /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "@%:@define HAVE_STDBOOL_H 1" >>confdefs.h 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* 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"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 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; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if test "${ac_cv_c_inline+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" case $ac_cv_c_int8_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define int8_t $ac_cv_c_int8_t _ACEOF ;; esac 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 : else cat >>confdefs.h <<_ACEOF @%:@define off_t long int _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 : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_STAT_ST_BLOCKS 1 _ACEOF $as_echo "@%:@define HAVE_ST_BLOCKS 1" >>confdefs.h else case " $LIB@&t@OBJS " in *" fileblocks.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS fileblocks.$ac_objext" ;; esac 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if test "${ac_cv_struct_tm+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "@%:@define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @%:@define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "@%:@define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @%:@define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "@%:@define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @%:@define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if test "${ac_cv_c_volatile+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "@%:@define volatile /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_PTRDIFF_T 1 _ACEOF fi # Checks for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if test "${ac_cv_func_closedir_void+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "@%:@define CLOSEDIR_VOID 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if test "${ac_cv_lib_error_at_line+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then case " $LIB@&t@OBJS " in *" error.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS error.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if test "${ac_cv_sys_largefile_source+set}" = set; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF @%:@define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "@%:@define HAVE_FSEEKO 1" >>confdefs.h fi 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 : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 $as_echo_n "checking for working memcmp... " >&6; } if test "${ac_cv_func_memcmp_working+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_memcmp_working=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_memcmp_working=yes else ac_cv_func_memcmp_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 $as_echo "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIB@&t@OBJS " in *" memcmp.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS memcmp.$ac_objext" ;; esac for ac_header in stdlib.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE /* Assume that all systems that can run configure have sys/param.h. */ # ifndef HAVE_SYS_PARAM_H # define HAVE_SYS_PARAM_H 1 # endif # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; int i, pagesize; int fd; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 1; if (write (fd, data, pagesize) != pagesize) return 1; close (fd); /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 1; data2 = (char *) malloc (2 * pagesize); if (!data2) return 1; data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 1; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 1; if (read (fd, data3, pagesize) != pagesize) return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 1; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "@%:@define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_REALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_REALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" realloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS realloc.$ac_objext" ;; esac $as_echo "@%:@define realloc rpl_realloc" >>confdefs.h fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if test "${ac_cv_func_select_args+set}" = set; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : ${ac_cv_func_select_args='int,int *,struct timeval *'} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF @%:@define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF @%:@define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF @%:@define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 $as_echo_n "checking whether lstat dereferences a symlink specified with a trailing slash... " >&6; } if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF @%:@define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then case " $LIB@&t@OBJS " in *" lstat.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIB@&t@OBJS " in *" stat.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF @%:@define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi for ac_func in atexit floor getcwd gettimeofday memmove memset munmap pow select sqrt strcasecmp strdup strerror strrchr 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" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files Makefile src/Makefile src/compression/Makefile src/compression/zziplib/generic/Makefile src/fx/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/ppui/osinterface/Makefile src/tracker/Makefile" 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 overridden 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, we kill variables containing newlines. # 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. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}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 "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\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" && { $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 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;} 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}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # 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 ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error ERROR [LINENO LOG_FD] @%:@ --------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set $? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global $as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in @%:@( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by MilkyTracker $as_me 0.90.85, which was generated by GNU Autoconf 2.64. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet, --silent do not print progress messages -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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ MilkyTracker config.status 0.90.85 configured by $0, generated by GNU Autoconf 2.64, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/compression/Makefile") CONFIG_FILES="$CONFIG_FILES src/compression/Makefile" ;; "src/compression/zziplib/generic/Makefile") CONFIG_FILES="$CONFIG_FILES src/compression/zziplib/generic/Makefile" ;; "src/fx/Makefile") CONFIG_FILES="$CONFIG_FILES src/fx/Makefile" ;; "src/midi/Makefile") CONFIG_FILES="$CONFIG_FILES src/midi/Makefile" ;; "src/milkyplay/Makefile") CONFIG_FILES="$CONFIG_FILES src/milkyplay/Makefile" ;; "src/ppui/Makefile") CONFIG_FILES="$CONFIG_FILES src/ppui/Makefile" ;; "src/ppui/osinterface/Makefile") CONFIG_FILES="$CONFIG_FILES src/ppui/osinterface/Makefile" ;; "src/tracker/Makefile") CONFIG_FILES="$CONFIG_FILES src/tracker/Makefile" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; 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 # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 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" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # 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 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # 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 || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # 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 break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$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 `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # 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 by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;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 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"; } && { $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" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$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 { $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" \ || 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" \ || as_fn_error "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # 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=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || 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 || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi #([Makefile src/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/fx/Makefile src/tracker/Makefile src/compression/Makefile]) milkytracker-0.90.85+dfsg/autom4te.cache/traces.00000644000175000017500000015540511317506524020607 0ustar admin2admin2m4trace:/usr/share/aclocal/alsa.m4:15: -1- AC_DEFUN([AM_PATH_ALSA], [dnl Save the original CFLAGS, LDFLAGS, and LIBS alsa_save_CFLAGS="$CFLAGS" alsa_save_LDFLAGS="$LDFLAGS" alsa_save_LIBS="$LIBS" alsa_found=yes dnl dnl Get the cflags and libraries for alsa dnl AC_ARG_WITH(alsa-prefix, [ --with-alsa-prefix=PFX Prefix where Alsa library is installed(optional)], [alsa_prefix="$withval"], [alsa_prefix=""]) AC_ARG_WITH(alsa-inc-prefix, [ --with-alsa-inc-prefix=PFX Prefix where include libraries are (optional)], [alsa_inc_prefix="$withval"], [alsa_inc_prefix=""]) dnl FIXME: this is not yet implemented AC_ARG_ENABLE(alsatest, [ --disable-alsatest Do not try to compile and run a test Alsa program], [enable_alsatest="$enableval"], [enable_alsatest=yes]) dnl Add any special include directories AC_MSG_CHECKING(for ALSA CFLAGS) if test "$alsa_inc_prefix" != "" ; then ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" CFLAGS="$CFLAGS -I$alsa_inc_prefix" fi AC_MSG_RESULT($ALSA_CFLAGS) dnl add any special lib dirs AC_MSG_CHECKING(for ALSA LDFLAGS) if test "$alsa_prefix" != "" ; then ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" LDFLAGS="$LDFLAGS $ALSA_LIBS" fi dnl add the alsa library ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" LIBS="$ALSA_LIBS $LIBS" AC_MSG_RESULT($ALSA_LIBS) dnl Check for a working version of libasound that is of the right version. min_alsa_version=ifelse([$1], ,0.1.1,$1) AC_MSG_CHECKING(for libasound headers version >= $min_alsa_version) no_alsa="" alsa_min_major_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` alsa_min_minor_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` alsa_min_micro_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` AC_LANG_SAVE AC_LANG_C AC_TRY_COMPILE([ #include ], [ /* ensure backward compatibility */ #if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) #define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR #endif #if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) #define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR #endif #if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) #define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR #endif # if(SND_LIB_MAJOR > $alsa_min_major_version) exit(0); # else # if(SND_LIB_MAJOR < $alsa_min_major_version) # error not present # endif # if(SND_LIB_MINOR > $alsa_min_minor_version) exit(0); # else # if(SND_LIB_MINOR < $alsa_min_minor_version) # error not present # endif # if(SND_LIB_SUBMINOR < $alsa_min_micro_version) # error not present # endif # endif # endif exit(0); ], [AC_MSG_RESULT(found.)], [AC_MSG_RESULT(not present.) ifelse([$3], , [AC_MSG_ERROR(Sufficiently new version of libasound not found.)]) alsa_found=no] ) AC_LANG_RESTORE dnl Now that we know that we have the right version, let's see if we have the library and not just the headers. if test "x$enable_alsatest" = "xyes"; then AC_CHECK_LIB([asound], [snd_ctl_open],, [ifelse([$3], , [AC_MSG_ERROR(No linkable libasound was found.)]) alsa_found=no] ) fi if test "x$alsa_found" = "xyes" ; then ifelse([$2], , :, [$2]) LIBS=`echo $LIBS | sed 's/-lasound//g'` LIBS=`echo $LIBS | sed 's/ //'` LIBS="-lasound $LIBS" fi if test "x$alsa_found" = "xno" ; then ifelse([$3], , :, [$3]) CFLAGS="$alsa_save_CFLAGS" LDFLAGS="$alsa_save_LDFLAGS" LIBS="$alsa_save_LIBS" ALSA_CFLAGS="" ALSA_LIBS="" fi dnl That should be it. Now just export out symbols: AC_SUBST(ALSA_CFLAGS) AC_SUBST(ALSA_LIBS) ]) m4trace:/usr/share/aclocal/pkg.m4:26: -1- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ]) m4trace:/usr/share/aclocal/pkg.m4:56: -1- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) m4trace:/usr/share/aclocal/pkg.m4:84: -1- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ]) m4trace:/usr/share/aclocal/pkg.m4:104: -1- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ]) m4trace:/usr/share/aclocal/sdl.m4:11: -1- AC_DEFUN([AM_PATH_SDL], [dnl dnl Get the cflags and libraries from the sdl-config script dnl AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], sdl_prefix="$withval", sdl_prefix="") AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], sdl_exec_prefix="$withval", sdl_exec_prefix="") AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], , enable_sdltest=yes) if test x$sdl_exec_prefix != x ; then sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) min_sdl_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" dnl dnl Now check if the installed SDL is sufficiently new. (Also sanity dnl checks the results of sdl-config to some extent dnl rm -f conf.sdltest AC_TRY_RUN([ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" AC_TRY_LINK([ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) rm -f conf.sdltest ]) m4trace:/usr/share/aclocal-1.11/amversion.m4:14: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) m4trace:/usr/share/aclocal-1.11/amversion.m4:33: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) m4trace:/usr/share/aclocal-1.11/auxdir.m4:47: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) m4trace:/usr/share/aclocal-1.11/cond.m4:15: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) m4trace:/usr/share/aclocal-1.11/depend.m4:28: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) m4trace:/usr/share/aclocal-1.11/depend.m4:163: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) m4trace:/usr/share/aclocal-1.11/depend.m4:171: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) m4trace:/usr/share/aclocal-1.11/depout.m4:14: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ]) m4trace:/usr/share/aclocal-1.11/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) m4trace:/usr/share/aclocal-1.11/init.m4:26: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) m4trace:/usr/share/aclocal-1.11/init.m4:126: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) m4trace:/usr/share/aclocal-1.11/install-sh.m4:11: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) m4trace:/usr/share/aclocal-1.11/lead-dot.m4:12: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) m4trace:/usr/share/aclocal-1.11/make.m4:14: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) m4trace:/usr/share/aclocal-1.11/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) m4trace:/usr/share/aclocal-1.11/missing.m4:24: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) m4trace:/usr/share/aclocal-1.11/mkdirp.m4:11: -1- AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) m4trace:/usr/share/aclocal-1.11/options.m4:13: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) m4trace:/usr/share/aclocal-1.11/options.m4:19: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) m4trace:/usr/share/aclocal-1.11/options.m4:25: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) m4trace:/usr/share/aclocal-1.11/options.m4:31: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) m4trace:/usr/share/aclocal-1.11/runlog.m4:12: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) m4trace:/usr/share/aclocal-1.11/sanity.m4:14: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) m4trace:/usr/share/aclocal-1.11/silent.m4:14: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) m4trace:/usr/share/aclocal-1.11/strip.m4:17: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4trace:/usr/share/aclocal-1.11/substnot.m4:14: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) m4trace:/usr/share/aclocal-1.11/substnot.m4:19: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) m4trace:/usr/share/aclocal-1.11/tar.m4:24: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) m4trace:configure.in:5: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.in:5: -1- m4_pattern_forbid([_AC_]) m4trace:configure.in:5: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.in:5: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.in:5: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.in:5: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.in:5: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.in:5: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:5: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.in:5: -1- m4_pattern_allow([^prefix$]) m4trace:configure.in:5: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.in:5: -1- m4_pattern_allow([^bindir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^datadir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^includedir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^docdir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^infodir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^psdir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^libdir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^localedir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^mandir$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:5: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.in:5: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.in:5: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.in:5: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.in:5: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.in:5: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.in:7: -1- AM_INIT_AUTOMAKE([dist-bzip2]) m4trace:configure.in:7: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.in:7: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.in:7: -1- AM_AUTOMAKE_VERSION([1.11]) m4trace:configure.in:7: -1- _AM_AUTOCONF_VERSION([2.64]) m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.in:7: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.in:7: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.in:7: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.in:7: -1- _AM_SET_OPTIONS([dist-bzip2]) m4trace:configure.in:7: -1- _AM_SET_OPTION([dist-bzip2]) m4trace:configure.in:7: -2- _AM_MANGLE_OPTION([dist-bzip2]) m4trace:configure.in:7: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:7: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:7: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) m4trace:configure.in:7: -2- _AM_MANGLE_OPTION([no-define]) m4trace:configure.in:7: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:7: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:7: -1- AM_SANITY_CHECK m4trace:configure.in:7: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) m4trace:configure.in:7: -1- AM_MISSING_HAS_RUN m4trace:configure.in:7: -1- AM_AUX_DIR_EXPAND m4trace:configure.in:7: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.in:7: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) m4trace:configure.in:7: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.in:7: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) m4trace:configure.in:7: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.in:7: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) m4trace:configure.in:7: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.in:7: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) m4trace:configure.in:7: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.in:7: -1- AM_PROG_INSTALL_SH m4trace:configure.in:7: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.in:7: -1- AM_PROG_INSTALL_STRIP m4trace:configure.in:7: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.in:7: -1- AM_PROG_MKDIR_P m4trace:configure.in:7: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.in:7: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.in:7: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:7: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:7: -1- AM_SET_LEADING_DOT m4trace:configure.in:7: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.in:7: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) m4trace:configure.in:7: -2- _AM_MANGLE_OPTION([tar-ustar]) m4trace:configure.in:7: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) m4trace:configure.in:7: -2- _AM_MANGLE_OPTION([tar-pax]) m4trace:configure.in:7: -1- _AM_PROG_TAR([v7]) m4trace:configure.in:7: -1- AM_MISSING_PROG([AMTAR], [tar]) m4trace:configure.in:7: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.in:7: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.in:7: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.in:7: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) m4trace:configure.in:7: -2- _AM_MANGLE_OPTION([no-dependencies]) m4trace:configure.in:7: -1- _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])]) m4trace:configure.in:7: -2- _AM_MANGLE_OPTION([silent-rules]) m4trace:configure.in:10: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:10: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.in:10: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:10: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:10: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:10: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:10: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.in:10: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.in:10: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.in:10: -1- _AM_DEPENDENCIES([CXX]) m4trace:configure.in:10: -1- AM_SET_DEPDIR m4trace:configure.in:10: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.in:10: -1- AM_OUTPUT_DEPENDENCY_COMMANDS m4trace:configure.in:10: -1- AM_MAKE_INCLUDE m4trace:configure.in:10: -1- m4_pattern_allow([^am__include$]) m4trace:configure.in:10: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.in:10: -1- AM_DEP_TRACK m4trace:configure.in:10: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.in:10: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.in:10: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.in:10: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.in:10: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.in:10: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.in:10: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.in:10: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.in:11: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:11: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:11: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.in:11: -1- _AM_DEPENDENCIES([CC]) m4trace:configure.in:11: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.in:11: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.in:11: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.in:11: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.in:11: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.in:11: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.in:12: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:12: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:12: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:13: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:15: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.in:20: -1- m4_pattern_allow([^GREP$]) m4trace:configure.in:20: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.in:20: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_fcntl_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" fcntl.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_inttypes_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" inttypes.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_limits_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" limits.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_malloc_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" malloc.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_memory_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" memory.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_stddef_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" stddef.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_stdint_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" stdint.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_stdlib_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" stdlib.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_string_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" string.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_strings_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" strings.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_sys_ioctl_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/ioctl.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_sys_param_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/param.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_sys_time_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" sys/time.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:21: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], [AS_VAR_APPEND([ac_header_list], [" unistd.h"])]) _AC_HEADERS_EXPANSION]) m4trace:configure.in:32: -1- AM_PATH_ALSA([1.0.0], [ RTMIDI="../midi/libmidi.a" RTMIDI_DIR="midi" AC_SUBST(RTMIDI) AC_SUBST(RTMIDI_DIR)], [if test "x$with_alsa" != xcheck; then AC_MSG_FAILURE([--with-alsa was given, but test for alsa failed]) else AC_MSG_WARN([ALSA not found - midi support disabled]) fi]) m4trace:configure.in:32: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. You should run autoupdate.], [../../lib/autoconf/lang.m4:148: AC_LANG_SAVE is expanded from... /usr/share/aclocal/alsa.m4:15: AM_PATH_ALSA is expanded from... configure.in:32: the top level]) m4trace:configure.in:32: -1- _m4_warn([obsolete], [The macro `AC_LANG_C' is obsolete. You should run autoupdate.], [../../lib/autoconf/c.m4:94: AC_LANG_C is expanded from... /usr/share/aclocal/alsa.m4:15: AM_PATH_ALSA is expanded from... configure.in:32: the top level]) m4trace:configure.in:32: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:2601: AC_TRY_COMPILE is expanded from... /usr/share/aclocal/alsa.m4:15: AM_PATH_ALSA is expanded from... configure.in:32: the top level]) m4trace:configure.in:32: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. You should run autoupdate.], [../../lib/autoconf/lang.m4:157: AC_LANG_RESTORE is expanded from... /usr/share/aclocal/alsa.m4:15: AM_PATH_ALSA is expanded from... configure.in:32: the top level]) m4trace:configure.in:32: -1- m4_pattern_allow([^HAVE_LIBASOUND$]) m4trace:configure.in:32: -1- m4_pattern_allow([^RTMIDI$]) m4trace:configure.in:32: -1- m4_pattern_allow([^RTMIDI_DIR$]) m4trace:configure.in:32: -1- m4_pattern_allow([^ALSA_CFLAGS$]) m4trace:configure.in:32: -1- m4_pattern_allow([^ALSA_LIBS$]) m4trace:configure.in:44: -2- m4_pattern_allow([^HAVE_LIBZ$]) m4trace:configure.in:46: -1- PKG_CHECK_MODULES([ZZIP], [zziplib >= 0.10.75]) m4trace:configure.in:46: -1- PKG_PROG_PKG_CONFIG m4trace:configure.in:46: -1- m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4trace:configure.in:46: -1- m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) m4trace:configure.in:46: -1- m4_pattern_allow([^PKG_CONFIG$]) m4trace:configure.in:46: -1- m4_pattern_allow([^PKG_CONFIG$]) m4trace:configure.in:46: -1- m4_pattern_allow([^ZZIP_CFLAGS$]) m4trace:configure.in:46: -1- m4_pattern_allow([^ZZIP_LIBS$]) m4trace:configure.in:46: -1- PKG_CHECK_EXISTS([zziplib >= 0.10.75], [pkg_cv_[]ZZIP_CFLAGS=`$PKG_CONFIG --[]cflags "zziplib >= 0.10.75" 2>/dev/null`], [pkg_failed=yes]) m4trace:configure.in:46: -1- PKG_CHECK_EXISTS([zziplib >= 0.10.75], [pkg_cv_[]ZZIP_LIBS=`$PKG_CONFIG --[]libs "zziplib >= 0.10.75" 2>/dev/null`], [pkg_failed=yes]) m4trace:configure.in:46: -1- _PKG_SHORT_ERRORS_SUPPORTED m4trace:configure.in:49: -1- AM_PATH_SDL([$SDL_VERSION], [], [as_fn_error "Please install libSDL" "$LINENO" 5]) m4trace:configure.in:49: -1- m4_pattern_allow([^SDL_CONFIG$]) m4trace:configure.in:49: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:2751: AC_TRY_RUN is expanded from... /usr/share/aclocal/sdl.m4:11: AM_PATH_SDL is expanded from... configure.in:49: the top level]) m4trace:configure.in:49: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:2674: AC_TRY_LINK is expanded from... /usr/share/aclocal/sdl.m4:11: AM_PATH_SDL is expanded from... configure.in:49: the top level]) m4trace:configure.in:49: -1- m4_pattern_allow([^SDL_CFLAGS$]) m4trace:configure.in:49: -1- m4_pattern_allow([^SDL_LIBS$]) m4trace:configure.in:60: -2- m4_pattern_allow([^HAVE_X11$]) m4trace:configure.in:72: -1- m4_pattern_allow([^HAVE_JACK_JACK_H$]) m4trace:configure.in:82: -1- m4_pattern_allow([^STAT_MACROS_BROKEN$]) m4trace:configure.in:83: -1- m4_pattern_allow([^HAVE__BOOL$]) m4trace:configure.in:83: -1- m4_pattern_allow([^HAVE_STDBOOL_H$]) m4trace:configure.in:84: -1- m4_pattern_allow([^const$]) m4trace:configure.in:86: -1- m4_pattern_allow([^int16_t$]) m4trace:configure.in:87: -1- m4_pattern_allow([^int32_t$]) m4trace:configure.in:88: -1- m4_pattern_allow([^int64_t$]) m4trace:configure.in:89: -1- m4_pattern_allow([^int8_t$]) m4trace:configure.in:90: -1- m4_pattern_allow([^off_t$]) m4trace:configure.in:91: -1- m4_pattern_allow([^size_t$]) m4trace:configure.in:92: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_BLOCKS$]) m4trace:configure.in:92: -1- m4_pattern_allow([^HAVE_ST_BLOCKS$]) m4trace:configure.in:92: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:93: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.in:94: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.in:95: -1- m4_pattern_allow([^uint16_t$]) m4trace:configure.in:96: -1- m4_pattern_allow([^_UINT32_T$]) m4trace:configure.in:96: -1- m4_pattern_allow([^uint32_t$]) m4trace:configure.in:97: -1- m4_pattern_allow([^_UINT64_T$]) m4trace:configure.in:97: -1- m4_pattern_allow([^uint64_t$]) m4trace:configure.in:98: -1- m4_pattern_allow([^_UINT8_T$]) m4trace:configure.in:98: -1- m4_pattern_allow([^uint8_t$]) m4trace:configure.in:99: -1- m4_pattern_allow([^volatile$]) m4trace:configure.in:100: -1- m4_pattern_allow([^HAVE_PTRDIFF_T$]) m4trace:configure.in:103: -1- m4_pattern_allow([^CLOSEDIR_VOID$]) m4trace:configure.in:104: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:105: -1- m4_pattern_allow([^_LARGEFILE_SOURCE$]) m4trace:configure.in:105: -1- m4_pattern_allow([^HAVE_FSEEKO$]) m4trace:configure.in:107: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.in:107: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:107: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:107: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:107: -1- m4_pattern_allow([^malloc$]) m4trace:configure.in:108: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:109: -1- m4_pattern_allow([^HAVE_GETPAGESIZE$]) m4trace:configure.in:109: -1- m4_pattern_allow([^HAVE_MMAP$]) m4trace:configure.in:110: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.in:110: -1- m4_pattern_allow([^HAVE_REALLOC$]) m4trace:configure.in:110: -1- m4_pattern_allow([^HAVE_REALLOC$]) m4trace:configure.in:110: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:110: -1- m4_pattern_allow([^realloc$]) m4trace:configure.in:111: -1- m4_pattern_allow([^SELECT_TYPE_ARG1$]) m4trace:configure.in:111: -1- m4_pattern_allow([^SELECT_TYPE_ARG234$]) m4trace:configure.in:111: -1- m4_pattern_allow([^SELECT_TYPE_ARG5$]) m4trace:configure.in:112: -1- m4_pattern_allow([^LSTAT_FOLLOWS_SLASHED_SYMLINK$]) m4trace:configure.in:112: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:112: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:112: -1- m4_pattern_allow([^HAVE_STAT_EMPTY_STRING_BUG$]) m4trace:configure.in:126: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:126: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.in:126: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.in:126: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.in:126: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.in:126: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.in:126: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.in:126: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) m4trace:configure.in:126: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS milkytracker-0.90.85+dfsg/autom4te.cache/output.10000644000175000017500000074473511317506530020676 0ustar admin2admin2@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.64 for MilkyTracker 0.90.85. @%:@ @%:@ Report bugs to . @%:@ @%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software @%:@ Foundation, Inc. @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # 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. 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+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: www.milkytracker.net about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set $? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global $as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error ERROR [LINENO LOG_FD] @%:@ --------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in @%:@( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # 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` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='MilkyTracker' PACKAGE_TARNAME='milkytracker' PACKAGE_VERSION='0.90.85' PACKAGE_STRING='MilkyTracker 0.90.85' PACKAGE_BUGREPORT='www.milkytracker.net' PACKAGE_URL='' ac_unique_file="src" ac_header_list= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIB@&t@OBJS SDL_LIBS SDL_CFLAGS SDL_CONFIG ZZIP_LIBS ZZIP_CFLAGS PKG_CONFIG ALSA_LIBS ALSA_CFLAGS RTMIDI_DIR RTMIDI EGREP GREP RANLIB CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking with_alsa with_alsa_prefix with_alsa_inc_prefix enable_alsatest with_sdl_prefix with_sdl_exec_prefix enable_sdltest with_jack ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PKG_CONFIG ZZIP_CFLAGS ZZIP_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # 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. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -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) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$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 ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$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 ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) 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 | -n) 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 ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=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 ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $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} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_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 ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # 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 the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` 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 test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # 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 <<_ACEOF \`configure' configures MilkyTracker 0.90.85 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/milkytracker@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of MilkyTracker 0.90.85:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-alsatest Do not try to compile and run a test Alsa program --disable-sdltest Do not try to compile and run a test SDL program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-alsa Enable native ALSA sound/midi support @<:@default=check@:>@ --with-alsa-prefix=PFX Prefix where Alsa library is installed(optional) --with-alsa-inc-prefix=PFX Prefix where include libraries are (optional) --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) --with-jack Enable JACK support @<:@default=check@:>@ Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility ZZIP_CFLAGS C compiler flags for ZZIP, overriding pkg-config ZZIP_LIBS linker flags for ZZIP, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF MilkyTracker configure 0.90.85 generated by GNU Autoconf 2.64 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## @%:@ ac_fn_cxx_try_compile LINENO @%:@ ---------------------------- @%:@ Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } @%:@ ac_fn_cxx_try_compile @%:@ ac_fn_c_try_compile LINENO @%:@ -------------------------- @%:@ Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } @%:@ ac_fn_c_try_compile @%:@ ac_fn_c_try_cpp LINENO @%:@ ---------------------- @%:@ Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } @%:@ ac_fn_c_try_cpp @%:@ ac_fn_c_try_link LINENO @%:@ ----------------------- @%:@ Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # 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;} return $ac_retval } @%:@ ac_fn_c_try_link @%:@ ac_fn_c_try_run LINENO @%:@ ---------------------- @%:@ Try to link conftest.$ac_ext, and return whether this succeeded. Assumes @%:@ that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 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;} return $ac_retval } @%:@ ac_fn_c_try_run @%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists and can be compiled using the include files in @%:@ INCLUDES, setting the cache variable VAR accordingly. 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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;} } @%:@ ac_fn_c_check_header_compile @%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES @%:@ ------------------------------------------------------- @%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using @%:@ the include files in INCLUDES and setting the cache variable VAR @%:@ accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @%:@include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( cat <<\_ASBOX ## ----------------------------------- ## ## Report this to www.milkytracker.net ## ## ----------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi 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;} } @%:@ ac_fn_c_check_header_mongrel @%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES @%:@ ------------------------------------------- @%:@ Tests whether TYPE exists after having included INCLUDES, setting cache @%:@ variable VAR accordingly. 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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;} } @%:@ ac_fn_c_check_type @%:@ ac_fn_c_find_intX_t LINENO BITS VAR @%:@ ----------------------------------- @%:@ Finds a signed integer type with width BITS, setting cache variable VAR @%:@ accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array @<:@1 - 2 * !(0 < ($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 1))@:>@; test_array @<:@0@:>@ = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array @<:@1 - 2 * !(($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 1) < ($ac_type) (((($ac_type) 1 << ($2 - 2)) - 1) * 2 + 2))@:>@; test_array @<:@0@:>@ = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in @%:@( int$2_t) : eval "$3=yes" ;; @%:@( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval as_val=\$$3 if test "x$as_val" = x""no; then : else break fi done 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;} } @%:@ ac_fn_c_find_intX_t @%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES @%:@ ---------------------------------------------------- @%:@ Tries to find if the field MEMBER exists in type AGGR, after including @%:@ INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $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;} } @%:@ ac_fn_c_check_member @%:@ ac_fn_c_find_uintX_t LINENO BITS VAR @%:@ ------------------------------------ @%:@ Finds an unsigned integer type with width BITS, setting cache variable VAR @%:@ accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array @<:@1 - 2 * !(($ac_type) -1 >> ($2 - 1) == 1)@:>@; test_array @<:@0@:>@ = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in @%:@( uint$2_t) : eval "$3=yes" ;; @%:@( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext eval as_val=\$$3 if test "x$as_val" = x""no; then : else break fi done 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;} } @%:@ ac_fn_c_find_uintX_t @%:@ ac_fn_c_check_func LINENO FUNC VAR @%:@ ---------------------------------- @%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* 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 $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext 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;} } @%:@ ac_fn_c_check_func 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 MilkyTracker $as_me 0.90.85, which was generated by GNU Autoconf 2.64. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/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` /usr/bin/hostinfo = `(/usr/bin/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` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # 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. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " fcntl.h" as_fn_append ac_header_list " inttypes.h" as_fn_append ac_header_list " limits.h" as_fn_append ac_header_list " malloc.h" as_fn_append ac_header_list " memory.h" as_fn_append ac_header_list " stddef.h" as_fn_append ac_header_list " stdint.h" as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " string.h" as_fn_append ac_header_list " strings.h" as_fn_append ac_header_list " sys/ioctl.h" as_fn_append ac_header_list " sys/param.h" as_fn_append ac_header_list " sys/time.h" as_fn_append ac_header_list " unistd.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; 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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_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 # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## 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 am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # 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" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $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 : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /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 for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir 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. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$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' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } 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 $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; 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_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # 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_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; 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_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # 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_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='milkytracker' VERSION='0.90.85' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC 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 { $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_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # 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_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # 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_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" # 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then : $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C++ compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } 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_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf @%:@ Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= 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 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $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 : $as_echo_n "(cached) " >&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 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_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no 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 if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $@%:@ != 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 ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe 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 { $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 : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # 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_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. 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 : $as_echo_n "(cached) " >&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 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_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi 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 : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$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 { $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 : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end 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; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; 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 for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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 depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&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 : $as_echo_n "(cached) " >&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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$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. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@ifdef __STDC__ @%:@ include @%:@else @%:@ include @%:@endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # 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 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } 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 for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. 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_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # 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_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done 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 { $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_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # 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_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; 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_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # 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_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Checks for header files. ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; 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_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; 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_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $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 : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $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 : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # AC_CHECK_HEADER(zzip/lib.h,,AC_MSG_ERROR("Cannot find zzip/lib.h")) # Checks for libraries. @%:@ Check whether --with-alsa was given. if test "${with_alsa+set}" = set; then : withval=$with_alsa; else with_alsa=check fi if test "x$with_alsa" != xno; then alsa_save_CFLAGS="$CFLAGS" alsa_save_LDFLAGS="$LDFLAGS" alsa_save_LIBS="$LIBS" alsa_found=yes @%:@ Check whether --with-alsa-prefix was given. if test "${with_alsa_prefix+set}" = set; then : withval=$with_alsa_prefix; alsa_prefix="$withval" else alsa_prefix="" fi @%:@ Check whether --with-alsa-inc-prefix was given. if test "${with_alsa_inc_prefix+set}" = set; then : withval=$with_alsa_inc_prefix; alsa_inc_prefix="$withval" else alsa_inc_prefix="" fi @%:@ Check whether --enable-alsatest was given. if test "${enable_alsatest+set}" = set; then : enableval=$enable_alsatest; enable_alsatest="$enableval" else enable_alsatest=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA CFLAGS" >&5 $as_echo_n "checking for ALSA CFLAGS... " >&6; } if test "$alsa_inc_prefix" != "" ; then ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" CFLAGS="$CFLAGS -I$alsa_inc_prefix" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_CFLAGS" >&5 $as_echo "$ALSA_CFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA LDFLAGS" >&5 $as_echo_n "checking for ALSA LDFLAGS... " >&6; } if test "$alsa_prefix" != "" ; then ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" LDFLAGS="$LDFLAGS $ALSA_LIBS" fi ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" LIBS="$ALSA_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_LIBS" >&5 $as_echo "$ALSA_LIBS" >&6; } min_alsa_version=1.0.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libasound headers version >= $min_alsa_version" >&5 $as_echo_n "checking for libasound headers version >= $min_alsa_version... " >&6; } no_alsa="" alsa_min_major_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` alsa_min_minor_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` alsa_min_micro_version=`echo $min_alsa_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { /* ensure backward compatibility */ #if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) #define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR #endif #if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) #define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR #endif #if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) #define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR #endif # if(SND_LIB_MAJOR > $alsa_min_major_version) exit(0); # else # if(SND_LIB_MAJOR < $alsa_min_major_version) # error not present # endif # if(SND_LIB_MINOR > $alsa_min_minor_version) exit(0); # else # if(SND_LIB_MINOR < $alsa_min_minor_version) # error not present # endif # if(SND_LIB_SUBMINOR < $alsa_min_micro_version) # error not present # endif # endif # endif exit(0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: found." >&5 $as_echo "found." >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not present." >&5 $as_echo "not present." >&6; } alsa_found=no fi rm -f core conftest.err 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 if test "x$enable_alsatest" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_ctl_open in -lasound" >&5 $as_echo_n "checking for snd_ctl_open in -lasound... " >&6; } if test "${ac_cv_lib_asound_snd_ctl_open+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $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 snd_ctl_open (); int main () { return snd_ctl_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_asound_snd_ctl_open=yes else ac_cv_lib_asound_snd_ctl_open=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_asound_snd_ctl_open" >&5 $as_echo "$ac_cv_lib_asound_snd_ctl_open" >&6; } if test "x$ac_cv_lib_asound_snd_ctl_open" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_LIBASOUND 1 _ACEOF LIBS="-lasound $LIBS" else alsa_found=no fi fi if test "x$alsa_found" = "xyes" ; then RTMIDI="../midi/libmidi.a" RTMIDI_DIR="midi" LIBS=`echo $LIBS | sed 's/-lasound//g'` LIBS=`echo $LIBS | sed 's/ //'` LIBS="-lasound $LIBS" fi if test "x$alsa_found" = "xno" ; then if test "x$with_alsa" != xcheck; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "--with-alsa was given, but test for alsa failed See \`config.log' for more details." "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ALSA not found - midi support disabled" >&5 $as_echo "$as_me: WARNING: ALSA not found - midi support disabled" >&2;} fi CFLAGS="$alsa_save_CFLAGS" LDFLAGS="$alsa_save_LDFLAGS" LIBS="$alsa_save_LIBS" ALSA_CFLAGS="" ALSA_LIBS="" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gzopen" >&5 $as_echo_n "checking for library containing gzopen... " >&6; } if test "${ac_cv_search_gzopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 gzopen (); int main () { return gzopen (); ; return 0; } _ACEOF for ac_lib in '' z; 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_gzopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_gzopen+set}" = set; then : break fi done if test "${ac_cv_search_gzopen+set}" = set; then : else ac_cv_search_gzopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gzopen" >&5 $as_echo "$ac_cv_search_gzopen" >&6; } ac_res=$ac_cv_search_gzopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "@%:@define HAVE_LIBZ 1" >>confdefs.h fi #AC_CHECK_LIB(zzip, zzip_file_open,,AC_MSG_ERROR("Cannot find -lzzip")) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; 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_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_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_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; 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_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_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_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZZIP" >&5 $as_echo_n "checking for ZZIP... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$ZZIP_CFLAGS"; then pkg_cv_ZZIP_CFLAGS="$ZZIP_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zziplib >= 0.10.75\""; } >&5 ($PKG_CONFIG --exists --print-errors "zziplib >= 0.10.75") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ZZIP_CFLAGS=`$PKG_CONFIG --cflags "zziplib >= 0.10.75" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$ZZIP_LIBS"; then pkg_cv_ZZIP_LIBS="$ZZIP_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zziplib >= 0.10.75\""; } >&5 ($PKG_CONFIG --exists --print-errors "zziplib >= 0.10.75") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ZZIP_LIBS=`$PKG_CONFIG --libs "zziplib >= 0.10.75" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ZZIP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "zziplib >= 0.10.75"` else ZZIP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "zziplib >= 0.10.75"` fi # Put the nasty error message in config.log where it belongs echo "$ZZIP_PKG_ERRORS" >&5 as_fn_error "Package requirements (zziplib >= 0.10.75) were not met: $ZZIP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables ZZIP_CFLAGS and ZZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables ZZIP_CFLAGS and ZZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else ZZIP_CFLAGS=$pkg_cv_ZZIP_CFLAGS ZZIP_LIBS=$pkg_cv_ZZIP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi SDL_VERSION=1.2.0 @%:@ Check whether --with-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then : withval=$with_sdl_prefix; sdl_prefix="$withval" else sdl_prefix="" fi @%:@ Check whether --with-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then : withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi @%:@ Check whether --enable-sdltest was given. if test "${enable_sdltest+set}" = set; then : enableval=$enable_sdltest; else enable_sdltest=yes fi if test x$sdl_exec_prefix != x ; then sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; 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_path_SDL_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_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_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_sdl_version=$SDL_VERSION { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; } no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_sdl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" as_fn_error "Please install libSDL" "$LINENO" 5 fi rm -f conf.sdltest CPPFLAGS="$CPPFLAGS -D__FORCE_SDL_AUDIO__" # Check that SDL supports the X11 wm { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether SDL supports X11" >&5 $as_echo_n "checking whether SDL supports X11... " >&6; } OLDCPPFLAGS=$CPPFLAGS CPPFLAGS=$SDL_CFLAGS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include const int test = SDL_SYSWM_X11; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "@%:@define HAVE_X11 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS=$OLDCPPFLAGS # Jack is dynamically linked to ease binary portability (no longer required) @%:@ Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; else with_jack=check fi if test x$with_jack != xno; then for ac_header in jack/jack.h do : ac_fn_c_check_header_mongrel "$LINENO" "jack/jack.h" "ac_cv_header_jack_jack_h" "$ac_includes_default" if test "x$ac_cv_header_jack_jack_h" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_JACK_JACK_H 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5 $as_echo_n "checking for library containing dlsym... " >&6; } if test "${ac_cv_search_dlsym+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 dlsym (); int main () { return dlsym (); ; return 0; } _ACEOF for ac_lib in '' dl; 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_dlsym=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_dlsym+set}" = set; then : break fi done if test "${ac_cv_search_dlsym+set}" = set; then : else ac_cv_search_dlsym=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5 $as_echo "$ac_cv_search_dlsym" >&6; } ac_res=$ac_cv_search_dlsym if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error "Dynamic library support not found - required for JACK support" "$LINENO" 5 fi else if test x$with_jack != xcheck; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "--with-jack was given, but JACK headers were not found See \`config.log' for more details." "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: JACK headers not found, JACK support disabled" >&5 $as_echo "$as_me: WARNING: JACK headers not found, JACK support disabled" >&2;} fi fi done fi # 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if defined S_ISBLK && defined S_IFDIR extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; #endif #if defined S_ISBLK && defined S_IFCHR extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; #endif #if defined S_ISLNK && defined S_IFREG extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; #endif #if defined S_ISSOCK && defined S_IFREG extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stat_broken=no else ac_cv_header_stat_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5 $as_echo "$ac_cv_header_stat_broken" >&6; } if test $ac_cv_header_stat_broken = yes; then $as_echo "@%:@define STAT_MACROS_BROKEN 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if test "${ac_cv_header_stdbool_h+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; bool e = &s; char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; # if defined __xlc__ || defined __GNUC__ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 reported by James Lemley on 2005-10-05; see http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html This test is not quite right, since xlc is allowed to reject this program, as the initializer for xlcbug is not one of the forms that C requires support for. However, doing the test right would require a runtime test, and that would make cross-compilation harder. Let us hope that IBM fixes the xlc bug, and also adds support for this kind of constant expression. In the meantime, this test will reject xlc, which is OK, since our stdbool.h substitute should suffice. We also test this with GCC, where it should work, to detect more quickly whether someone messes up the test in the future. */ char digs[] = "0123456789"; int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); # endif /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "@%:@define HAVE_STDBOOL_H 1" >>confdefs.h 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* 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"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 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; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "@%:@define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if test "${ac_cv_c_inline+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" case $ac_cv_c_int8_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define int8_t $ac_cv_c_int8_t _ACEOF ;; esac 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 : else cat >>confdefs.h <<_ACEOF @%:@define off_t long int _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 : else cat >>confdefs.h <<_ACEOF @%:@define size_t unsigned int _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STRUCT_STAT_ST_BLOCKS 1 _ACEOF $as_echo "@%:@define HAVE_ST_BLOCKS 1" >>confdefs.h else case " $LIB@&t@OBJS " in *" fileblocks.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS fileblocks.$ac_objext" ;; esac 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 : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if test "${ac_cv_struct_tm+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "@%:@define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF @%:@define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "@%:@define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @%:@define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "@%:@define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @%:@define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "@%:@define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF @%:@define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if test "${ac_cv_c_volatile+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "@%:@define volatile /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_PTRDIFF_T 1 _ACEOF fi # Checks for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if test "${ac_cv_func_closedir_void+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "@%:@define CLOSEDIR_VOID 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if test "${ac_cv_lib_error_at_line+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then case " $LIB@&t@OBJS " in *" error.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS error.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if test "${ac_cv_sys_largefile_source+set}" = set; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @%:@define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF @%:@define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "@%:@define HAVE_FSEEKO 1" >>confdefs.h fi 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 : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_MALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_MALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" malloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS malloc.$ac_objext" ;; esac $as_echo "@%:@define malloc rpl_malloc" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 $as_echo_n "checking for working memcmp... " >&6; } if test "${ac_cv_func_memcmp_working+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_memcmp_working=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_memcmp_working=yes else ac_cv_func_memcmp_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 $as_echo "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIB@&t@OBJS " in *" memcmp.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS memcmp.$ac_objext" ;; esac for ac_header in stdlib.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE /* Assume that all systems that can run configure have sys/param.h. */ # ifndef HAVE_SYS_PARAM_H # define HAVE_SYS_PARAM_H 1 # endif # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; int i, pagesize; int fd; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 1; if (write (fd, data, pagesize) != pagesize) return 1; close (fd); /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 1; data2 = (char *) malloc (2 * pagesize); if (!data2) return 1; data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 1; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 1; if (read (fd, data3, pagesize) != pagesize) return 1; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 1; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "@%:@define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "@%:@define HAVE_REALLOC 1" >>confdefs.h else $as_echo "@%:@define HAVE_REALLOC 0" >>confdefs.h case " $LIB@&t@OBJS " in *" realloc.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS realloc.$ac_objext" ;; esac $as_echo "@%:@define realloc rpl_realloc" >>confdefs.h fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if test "${ac_cv_func_select_args+set}" = set; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : ${ac_cv_func_select_args='int,int *,struct timeval *'} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF @%:@define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF @%:@define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF @%:@define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat dereferences a symlink specified with a trailing slash" >&5 $as_echo_n "checking whether lstat dereferences a symlink specified with a trailing slash... " >&6; } if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF @%:@define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then case " $LIB@&t@OBJS " in *" lstat.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIB@&t@OBJS " in *" stat.$ac_objext "* ) ;; *) LIB@&t@OBJS="$LIB@&t@OBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF @%:@define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi for ac_func in atexit floor getcwd gettimeofday memmove memset munmap pow select sqrt strcasecmp strdup strerror strrchr 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" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF @%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files Makefile src/Makefile src/compression/Makefile src/compression/zziplib/generic/Makefile src/fx/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/ppui/osinterface/Makefile src/tracker/Makefile" 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 overridden 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, we kill variables containing newlines. # 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. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}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 "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\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" && { $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 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;} 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}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # 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 ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error ERROR [LINENO LOG_FD] @%:@ --------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set $? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global $as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in @%:@( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by MilkyTracker $as_me 0.90.85, which was generated by GNU Autoconf 2.64. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet, --silent do not print progress messages -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 ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ MilkyTracker config.status 0.90.85 configured by $0, generated by GNU Autoconf 2.64, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/compression/Makefile") CONFIG_FILES="$CONFIG_FILES src/compression/Makefile" ;; "src/compression/zziplib/generic/Makefile") CONFIG_FILES="$CONFIG_FILES src/compression/zziplib/generic/Makefile" ;; "src/fx/Makefile") CONFIG_FILES="$CONFIG_FILES src/fx/Makefile" ;; "src/midi/Makefile") CONFIG_FILES="$CONFIG_FILES src/midi/Makefile" ;; "src/milkyplay/Makefile") CONFIG_FILES="$CONFIG_FILES src/milkyplay/Makefile" ;; "src/ppui/Makefile") CONFIG_FILES="$CONFIG_FILES src/ppui/Makefile" ;; "src/ppui/osinterface/Makefile") CONFIG_FILES="$CONFIG_FILES src/ppui/osinterface/Makefile" ;; "src/tracker/Makefile") CONFIG_FILES="$CONFIG_FILES src/tracker/Makefile" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; 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 # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 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" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # 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 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # 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 || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # 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 break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$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 `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # 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 by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;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 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"; } && { $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" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$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 { $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" \ || 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" \ || as_fn_error "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # 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=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || 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 || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi #([Makefile src/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/fx/Makefile src/tracker/Makefile src/compression/Makefile]) milkytracker-0.90.85+dfsg/autom4te.cache/requests0000644000175000017500000001502611317506534021036 0ustar admin2admin2# This file was generated by Autom4te Wed Jul 29 06:45:47 UTC 2009. # It contains the lists of macros which have been traced. # It can be safely removed. @request = ( bless( [ '0', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', '/usr/share/aclocal/alsa.m4', '/usr/share/aclocal/pkg.m4', '/usr/share/aclocal/sdl.m4', '/usr/share/aclocal-1.11/amversion.m4', '/usr/share/aclocal-1.11/auxdir.m4', '/usr/share/aclocal-1.11/cond.m4', '/usr/share/aclocal-1.11/depend.m4', '/usr/share/aclocal-1.11/depout.m4', '/usr/share/aclocal-1.11/init.m4', '/usr/share/aclocal-1.11/install-sh.m4', '/usr/share/aclocal-1.11/lead-dot.m4', '/usr/share/aclocal-1.11/make.m4', '/usr/share/aclocal-1.11/missing.m4', '/usr/share/aclocal-1.11/mkdirp.m4', '/usr/share/aclocal-1.11/options.m4', '/usr/share/aclocal-1.11/runlog.m4', '/usr/share/aclocal-1.11/sanity.m4', '/usr/share/aclocal-1.11/silent.m4', '/usr/share/aclocal-1.11/strip.m4', '/usr/share/aclocal-1.11/substnot.m4', '/usr/share/aclocal-1.11/tar.m4', 'configure.in' ], { 'm4_pattern_forbid' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, '_AM_SET_OPTION' => 1, 'AC_DEFUN' => 1, 'AM_PROG_MKDIR_P' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_MISSING_HAS_RUN' => 1, 'AM_SUBST_NOTMAKE' => 1, 'AM_MISSING_PROG' => 1, 'AM_PATH_ALSA' => 1, 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AC_DEFUN_ONCE' => 1, 'AM_PROG_INSTALL_STRIP' => 1, '_PKG_SHORT_ERRORS_SUPPORTED' => 1, '_m4_warn' => 1, 'AM_SANITY_CHECK' => 1, 'PKG_CHECK_EXISTS' => 1, 'AM_SILENT_RULES' => 1, 'AM_PATH_SDL' => 1, 'include' => 1, '_AM_PROG_TAR' => 1, 'AM_AUX_DIR_EXPAND' => 1, 'AM_DEP_TRACK' => 1, '_AM_SET_OPTIONS' => 1, 'AM_RUN_LOG' => 1, '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, '_AM_IF_OPTION' => 1, '_AM_SUBST_NOTMAKE' => 1, 'm4_pattern_allow' => 1, '_AM_AUTOCONF_VERSION' => 1, '_AM_MANGLE_OPTION' => 1, 'AM_CONDITIONAL' => 1, 'AM_SET_LEADING_DOT' => 1, 'AM_SET_DEPDIR' => 1, '_AM_DEPENDENCIES' => 1, 'PKG_PROG_PKG_CONFIG' => 1, 'AM_PROG_INSTALL_SH' => 1, 'm4_include' => 1, 'PKG_CHECK_MODULES' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, 'AU_DEFUN' => 1, 'AM_MAKE_INCLUDE' => 1 } ], 'Autom4te::Request' ), bless( [ '1', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', 'aclocal.m4', 'configure.in' ], { 'AM_PROG_F77_C_O' => 1, '_LT_AC_TAGCONFIG' => 1, 'AC_INIT' => 1, 'm4_pattern_forbid' => 1, 'AC_CANONICAL_TARGET' => 1, '_AM_COND_IF' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_SUBST' => 1, 'AC_CANONICAL_HOST' => 1, 'AC_FC_SRCEXT' => 1, 'AC_PROG_LIBTOOL' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AC_CONFIG_LINKS' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'LT_SUPPORTED_TAG' => 1, 'm4_sinclude' => 1, 'AM_MAINTAINER_MODE' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, '_m4_warn' => 1, 'AM_PROG_CXX_C_O' => 1, '_AM_COND_ENDIF' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AM_SILENT_RULES' => 1, 'AC_CONFIG_FILES' => 1, 'LT_INIT' => 1, 'include' => 1, 'AM_GNU_GETTEXT' => 1, 'AC_LIBSOURCE' => 1, 'AC_CANONICAL_BUILD' => 1, 'AM_PROG_FC_C_O' => 1, 'AC_FC_FREEFORM' => 1, 'AH_OUTPUT' => 1, 'AC_CONFIG_AUX_DIR' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AM_PROG_CC_C_O' => 1, 'm4_pattern_allow' => 1, 'sinclude' => 1, 'AM_CONDITIONAL' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AC_CONFIG_HEADERS' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'm4_include' => 1, '_AM_COND_ELSE' => 1, 'AC_SUBST_TRACE' => 1 } ], 'Autom4te::Request' ) ); milkytracker-0.90.85+dfsg/autom4te.cache/traces.10000644000175000017500000014116711317506530020605 0ustar admin2admin2m4trace:configure.in:5: -1- AC_INIT([MilkyTracker], [0.90.85], [www.milkytracker.net]) m4trace:configure.in:5: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.in:5: -1- m4_pattern_forbid([_AC_]) m4trace:configure.in:5: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.in:5: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.in:5: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.in:5: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.in:5: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.in:5: -1- AC_SUBST([SHELL]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.in:5: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.in:5: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.in:5: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.in:5: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:5: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:5: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:5: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:5: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:5: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:5: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.in:5: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.in:5: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.in:5: -1- m4_pattern_allow([^prefix$]) m4trace:configure.in:5: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.in:5: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.in:5: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.in:5: -1- m4_pattern_allow([^bindir$]) m4trace:configure.in:5: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.in:5: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.in:5: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.in:5: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.in:5: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.in:5: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.in:5: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.in:5: -1- m4_pattern_allow([^datadir$]) m4trace:configure.in:5: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.in:5: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.in:5: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.in:5: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.in:5: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.in:5: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.in:5: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.in:5: -1- m4_pattern_allow([^includedir$]) m4trace:configure.in:5: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.in:5: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.in:5: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.in:5: -1- m4_pattern_allow([^docdir$]) m4trace:configure.in:5: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.in:5: -1- m4_pattern_allow([^infodir$]) m4trace:configure.in:5: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.in:5: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.in:5: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.in:5: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.in:5: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.in:5: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.in:5: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.in:5: -1- m4_pattern_allow([^psdir$]) m4trace:configure.in:5: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.in:5: -1- m4_pattern_allow([^libdir$]) m4trace:configure.in:5: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.in:5: -1- m4_pattern_allow([^localedir$]) m4trace:configure.in:5: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.in:5: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.in:5: -1- m4_pattern_allow([^mandir$]) m4trace:configure.in:5: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.in:5: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.in:5: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.in:5: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.in:5: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.in:5: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.in:5: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.in:5: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.in:5: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.in:5: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.in:5: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.in:5: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.in:5: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.in:5: -1- AC_SUBST([DEFS]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.in:5: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.in:5: -1- AC_SUBST([ECHO_C]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.in:5: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.in:5: -1- AC_SUBST([ECHO_N]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.in:5: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.in:5: -1- AC_SUBST([ECHO_T]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.in:5: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.in:5: -1- AC_SUBST([LIBS]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:5: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:5: -1- AC_SUBST([build_alias]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.in:5: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.in:5: -1- AC_SUBST([host_alias]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.in:5: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.in:5: -1- AC_SUBST([target_alias]) m4trace:configure.in:5: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.in:5: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.in:7: -1- AM_INIT_AUTOMAKE([dist-bzip2]) m4trace:configure.in:7: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.in:7: -1- AM_AUTOMAKE_VERSION([1.11]) m4trace:configure.in:7: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.in:7: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.in:7: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.in:7: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.in:7: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) m4trace:configure.in:7: -1- AC_SUBST_TRACE([am__isrc]) m4trace:configure.in:7: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.in:7: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.in:7: -1- AC_SUBST([CYGPATH_W]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([CYGPATH_W]) m4trace:configure.in:7: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.in:7: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) m4trace:configure.in:7: -1- AC_SUBST_TRACE([PACKAGE]) m4trace:configure.in:7: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:7: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) m4trace:configure.in:7: -1- AC_SUBST_TRACE([VERSION]) m4trace:configure.in:7: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:7: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) m4trace:configure.in:7: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.in:7: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ @%:@undef PACKAGE]) m4trace:configure.in:7: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) m4trace:configure.in:7: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.in:7: -1- AH_OUTPUT([VERSION], [/* Version number of package */ @%:@undef VERSION]) m4trace:configure.in:7: -1- AC_REQUIRE_AUX_FILE([missing]) m4trace:configure.in:7: -1- AC_SUBST([ACLOCAL]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([ACLOCAL]) m4trace:configure.in:7: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.in:7: -1- AC_SUBST([AUTOCONF]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([AUTOCONF]) m4trace:configure.in:7: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.in:7: -1- AC_SUBST([AUTOMAKE]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([AUTOMAKE]) m4trace:configure.in:7: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.in:7: -1- AC_SUBST([AUTOHEADER]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([AUTOHEADER]) m4trace:configure.in:7: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.in:7: -1- AC_SUBST([MAKEINFO]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([MAKEINFO]) m4trace:configure.in:7: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.in:7: -1- AC_SUBST([install_sh]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([install_sh]) m4trace:configure.in:7: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.in:7: -1- AC_SUBST([STRIP]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([STRIP]) m4trace:configure.in:7: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.in:7: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) m4trace:configure.in:7: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.in:7: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.in:7: -1- AC_SUBST([MKDIR_P]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([MKDIR_P]) m4trace:configure.in:7: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.in:7: -1- AC_SUBST([mkdir_p], ["$MKDIR_P"]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([mkdir_p]) m4trace:configure.in:7: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.in:7: -1- AC_SUBST([AWK]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.in:7: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:7: -1- AC_SUBST([SET_MAKE]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.in:7: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.in:7: -1- AC_SUBST([am__leading_dot]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([am__leading_dot]) m4trace:configure.in:7: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.in:7: -1- AC_SUBST([AMTAR]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([AMTAR]) m4trace:configure.in:7: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.in:7: -1- AC_SUBST([am__tar]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([am__tar]) m4trace:configure.in:7: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.in:7: -1- AC_SUBST([am__untar]) m4trace:configure.in:7: -1- AC_SUBST_TRACE([am__untar]) m4trace:configure.in:7: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.in:10: -1- AC_SUBST([CXX]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.in:10: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:10: -1- AC_SUBST([CXXFLAGS]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([CXXFLAGS]) m4trace:configure.in:10: -1- m4_pattern_allow([^CXXFLAGS$]) m4trace:configure.in:10: -1- AC_SUBST([LDFLAGS]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.in:10: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:10: -1- AC_SUBST([LIBS]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:10: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:10: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:10: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:10: -1- AC_SUBST([CXX]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([CXX]) m4trace:configure.in:10: -1- m4_pattern_allow([^CXX$]) m4trace:configure.in:10: -1- AC_SUBST([ac_ct_CXX]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([ac_ct_CXX]) m4trace:configure.in:10: -1- m4_pattern_allow([^ac_ct_CXX$]) m4trace:configure.in:10: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([EXEEXT]) m4trace:configure.in:10: -1- m4_pattern_allow([^EXEEXT$]) m4trace:configure.in:10: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([OBJEXT]) m4trace:configure.in:10: -1- m4_pattern_allow([^OBJEXT$]) m4trace:configure.in:10: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([DEPDIR]) m4trace:configure.in:10: -1- m4_pattern_allow([^DEPDIR$]) m4trace:configure.in:10: -1- AC_SUBST([am__include]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([am__include]) m4trace:configure.in:10: -1- m4_pattern_allow([^am__include$]) m4trace:configure.in:10: -1- AC_SUBST([am__quote]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([am__quote]) m4trace:configure.in:10: -1- m4_pattern_allow([^am__quote$]) m4trace:configure.in:10: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) m4trace:configure.in:10: -1- AC_SUBST([AMDEP_TRUE]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([AMDEP_TRUE]) m4trace:configure.in:10: -1- m4_pattern_allow([^AMDEP_TRUE$]) m4trace:configure.in:10: -1- AC_SUBST([AMDEP_FALSE]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([AMDEP_FALSE]) m4trace:configure.in:10: -1- m4_pattern_allow([^AMDEP_FALSE$]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) m4trace:configure.in:10: -1- AC_SUBST([AMDEPBACKSLASH]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) m4trace:configure.in:10: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) m4trace:configure.in:10: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([CXXDEPMODE]) m4trace:configure.in:10: -1- m4_pattern_allow([^CXXDEPMODE$]) m4trace:configure.in:10: -1- AM_CONDITIONAL([am__fastdepCXX], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) m4trace:configure.in:10: -1- AC_SUBST([am__fastdepCXX_TRUE]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) m4trace:configure.in:10: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) m4trace:configure.in:10: -1- AC_SUBST([am__fastdepCXX_FALSE]) m4trace:configure.in:10: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) m4trace:configure.in:10: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) m4trace:configure.in:10: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) m4trace:configure.in:11: -1- AC_SUBST([CC]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- AC_SUBST([CFLAGS]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([CFLAGS]) m4trace:configure.in:11: -1- m4_pattern_allow([^CFLAGS$]) m4trace:configure.in:11: -1- AC_SUBST([LDFLAGS]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([LDFLAGS]) m4trace:configure.in:11: -1- m4_pattern_allow([^LDFLAGS$]) m4trace:configure.in:11: -1- AC_SUBST([LIBS]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.in:11: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.in:11: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:11: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:11: -1- AC_SUBST([CC]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- AC_SUBST([CC]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- AC_SUBST([CC]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- AC_SUBST([CC]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([CC]) m4trace:configure.in:11: -1- m4_pattern_allow([^CC$]) m4trace:configure.in:11: -1- AC_SUBST([ac_ct_CC]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([ac_ct_CC]) m4trace:configure.in:11: -1- m4_pattern_allow([^ac_ct_CC$]) m4trace:configure.in:11: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([CCDEPMODE]) m4trace:configure.in:11: -1- m4_pattern_allow([^CCDEPMODE$]) m4trace:configure.in:11: -1- AM_CONDITIONAL([am__fastdepCC], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) m4trace:configure.in:11: -1- AC_SUBST([am__fastdepCC_TRUE]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) m4trace:configure.in:11: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) m4trace:configure.in:11: -1- AC_SUBST([am__fastdepCC_FALSE]) m4trace:configure.in:11: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) m4trace:configure.in:11: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) m4trace:configure.in:11: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) m4trace:configure.in:11: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) m4trace:configure.in:12: -1- AC_SUBST([CPP]) m4trace:configure.in:12: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.in:12: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:12: -1- AC_SUBST([CPPFLAGS]) m4trace:configure.in:12: -1- AC_SUBST_TRACE([CPPFLAGS]) m4trace:configure.in:12: -1- m4_pattern_allow([^CPPFLAGS$]) m4trace:configure.in:12: -1- AC_SUBST([CPP]) m4trace:configure.in:12: -1- AC_SUBST_TRACE([CPP]) m4trace:configure.in:12: -1- m4_pattern_allow([^CPP$]) m4trace:configure.in:13: -1- AC_SUBST([AWK]) m4trace:configure.in:13: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.in:13: -1- m4_pattern_allow([^AWK$]) m4trace:configure.in:15: -1- AC_SUBST([RANLIB]) m4trace:configure.in:15: -1- AC_SUBST_TRACE([RANLIB]) m4trace:configure.in:15: -1- m4_pattern_allow([^RANLIB$]) m4trace:configure.in:19: -1- AH_OUTPUT([HAVE_DIRENT_H], [/* Define to 1 if you have the header file, and it defines `DIR\'. */ @%:@undef HAVE_DIRENT_H]) m4trace:configure.in:19: -1- AH_OUTPUT([HAVE_SYS_NDIR_H], [/* Define to 1 if you have the header file, and it defines `DIR\'. */ @%:@undef HAVE_SYS_NDIR_H]) m4trace:configure.in:19: -1- AH_OUTPUT([HAVE_SYS_DIR_H], [/* Define to 1 if you have the header file, and it defines `DIR\'. */ @%:@undef HAVE_SYS_DIR_H]) m4trace:configure.in:19: -1- AH_OUTPUT([HAVE_NDIR_H], [/* Define to 1 if you have the header file, and it defines `DIR\'. */ @%:@undef HAVE_NDIR_H]) m4trace:configure.in:20: -1- AC_SUBST([GREP]) m4trace:configure.in:20: -1- AC_SUBST_TRACE([GREP]) m4trace:configure.in:20: -1- m4_pattern_allow([^GREP$]) m4trace:configure.in:20: -1- AC_SUBST([EGREP]) m4trace:configure.in:20: -1- AC_SUBST_TRACE([EGREP]) m4trace:configure.in:20: -1- m4_pattern_allow([^EGREP$]) m4trace:configure.in:20: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) m4trace:configure.in:20: -1- m4_pattern_allow([^STDC_HEADERS$]) m4trace:configure.in:20: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ @%:@undef STDC_HEADERS]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_FCNTL_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TYPES_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_STAT_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MEMORY_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_INTTYPES_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_LIMITS_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_MALLOC_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MALLOC_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_MEMORY_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STDDEF_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDDEF_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDINT_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRING_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STRINGS_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_SYS_IOCTL_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_IOCTL_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_PARAM_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_TIME_H]) m4trace:configure.in:21: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:32: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. You should run autoupdate.], [../../lib/autoconf/lang.m4:148: AC_LANG_SAVE is expanded from... aclocal.m4:36: AM_PATH_ALSA is expanded from... configure.in:32: the top level]) m4trace:configure.in:32: -1- _m4_warn([obsolete], [The macro `AC_LANG_C' is obsolete. You should run autoupdate.], [../../lib/autoconf/c.m4:94: AC_LANG_C is expanded from... aclocal.m4:36: AM_PATH_ALSA is expanded from... configure.in:32: the top level]) m4trace:configure.in:32: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:2601: AC_TRY_COMPILE is expanded from... aclocal.m4:36: AM_PATH_ALSA is expanded from... configure.in:32: the top level]) m4trace:configure.in:32: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. You should run autoupdate.], [../../lib/autoconf/lang.m4:157: AC_LANG_RESTORE is expanded from... aclocal.m4:36: AM_PATH_ALSA is expanded from... configure.in:32: the top level]) m4trace:configure.in:32: -1- AH_OUTPUT([HAVE_LIBASOUND], [/* Define to 1 if you have the `asound\' library (-lasound). */ @%:@undef HAVE_LIBASOUND]) m4trace:configure.in:32: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBASOUND]) m4trace:configure.in:32: -1- m4_pattern_allow([^HAVE_LIBASOUND$]) m4trace:configure.in:32: -1- AC_SUBST([RTMIDI]) m4trace:configure.in:32: -1- AC_SUBST_TRACE([RTMIDI]) m4trace:configure.in:32: -1- m4_pattern_allow([^RTMIDI$]) m4trace:configure.in:32: -1- AC_SUBST([RTMIDI_DIR]) m4trace:configure.in:32: -1- AC_SUBST_TRACE([RTMIDI_DIR]) m4trace:configure.in:32: -1- m4_pattern_allow([^RTMIDI_DIR$]) m4trace:configure.in:32: -1- AC_SUBST([ALSA_CFLAGS]) m4trace:configure.in:32: -1- AC_SUBST_TRACE([ALSA_CFLAGS]) m4trace:configure.in:32: -1- m4_pattern_allow([^ALSA_CFLAGS$]) m4trace:configure.in:32: -1- AC_SUBST([ALSA_LIBS]) m4trace:configure.in:32: -1- AC_SUBST_TRACE([ALSA_LIBS]) m4trace:configure.in:32: -1- m4_pattern_allow([^ALSA_LIBS$]) m4trace:configure.in:44: -2- AC_DEFINE_TRACE_LITERAL([HAVE_LIBZ]) m4trace:configure.in:44: -2- m4_pattern_allow([^HAVE_LIBZ$]) m4trace:configure.in:44: -2- AH_OUTPUT([HAVE_LIBZ], [/* Define to 1 if you have the \'libz\' library. */ @%:@undef HAVE_LIBZ]) m4trace:configure.in:46: -1- m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4trace:configure.in:46: -1- m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) m4trace:configure.in:46: -1- AC_SUBST([PKG_CONFIG]) m4trace:configure.in:46: -1- AC_SUBST_TRACE([PKG_CONFIG]) m4trace:configure.in:46: -1- m4_pattern_allow([^PKG_CONFIG$]) m4trace:configure.in:46: -1- AC_SUBST([PKG_CONFIG]) m4trace:configure.in:46: -1- AC_SUBST_TRACE([PKG_CONFIG]) m4trace:configure.in:46: -1- m4_pattern_allow([^PKG_CONFIG$]) m4trace:configure.in:46: -1- AC_SUBST([ZZIP_CFLAGS]) m4trace:configure.in:46: -1- AC_SUBST_TRACE([ZZIP_CFLAGS]) m4trace:configure.in:46: -1- m4_pattern_allow([^ZZIP_CFLAGS$]) m4trace:configure.in:46: -1- AC_SUBST([ZZIP_LIBS]) m4trace:configure.in:46: -1- AC_SUBST_TRACE([ZZIP_LIBS]) m4trace:configure.in:46: -1- m4_pattern_allow([^ZZIP_LIBS$]) m4trace:configure.in:49: -1- AC_SUBST([SDL_CONFIG]) m4trace:configure.in:49: -1- AC_SUBST_TRACE([SDL_CONFIG]) m4trace:configure.in:49: -1- m4_pattern_allow([^SDL_CONFIG$]) m4trace:configure.in:49: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:2751: AC_TRY_RUN is expanded from... aclocal.m4:332: AM_PATH_SDL is expanded from... configure.in:49: the top level]) m4trace:configure.in:49: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. You should run autoupdate.], [../../lib/autoconf/general.m4:2674: AC_TRY_LINK is expanded from... aclocal.m4:332: AM_PATH_SDL is expanded from... configure.in:49: the top level]) m4trace:configure.in:49: -1- AC_SUBST([SDL_CFLAGS]) m4trace:configure.in:49: -1- AC_SUBST_TRACE([SDL_CFLAGS]) m4trace:configure.in:49: -1- m4_pattern_allow([^SDL_CFLAGS$]) m4trace:configure.in:49: -1- AC_SUBST([SDL_LIBS]) m4trace:configure.in:49: -1- AC_SUBST_TRACE([SDL_LIBS]) m4trace:configure.in:49: -1- m4_pattern_allow([^SDL_LIBS$]) m4trace:configure.in:60: -2- AC_DEFINE_TRACE_LITERAL([HAVE_X11]) m4trace:configure.in:60: -2- m4_pattern_allow([^HAVE_X11$]) m4trace:configure.in:60: -2- AH_OUTPUT([HAVE_X11], [/* SDL supports X11 features */ @%:@undef HAVE_X11]) m4trace:configure.in:72: -1- AH_OUTPUT([HAVE_JACK_JACK_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_JACK_JACK_H]) m4trace:configure.in:72: -1- AC_DEFINE_TRACE_LITERAL([HAVE_JACK_JACK_H]) m4trace:configure.in:72: -1- m4_pattern_allow([^HAVE_JACK_JACK_H$]) m4trace:configure.in:82: -1- AC_DEFINE_TRACE_LITERAL([STAT_MACROS_BROKEN]) m4trace:configure.in:82: -1- m4_pattern_allow([^STAT_MACROS_BROKEN$]) m4trace:configure.in:82: -1- AH_OUTPUT([STAT_MACROS_BROKEN], [/* Define to 1 if the `S_IS*\' macros in do not work properly. */ @%:@undef STAT_MACROS_BROKEN]) m4trace:configure.in:83: -1- AC_DEFINE_TRACE_LITERAL([HAVE__BOOL]) m4trace:configure.in:83: -1- m4_pattern_allow([^HAVE__BOOL$]) m4trace:configure.in:83: -1- AH_OUTPUT([HAVE__BOOL], [/* Define to 1 if the system has the type `_Bool\'. */ @%:@undef HAVE__BOOL]) m4trace:configure.in:83: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDBOOL_H]) m4trace:configure.in:83: -1- m4_pattern_allow([^HAVE_STDBOOL_H$]) m4trace:configure.in:83: -1- AH_OUTPUT([HAVE_STDBOOL_H], [/* Define to 1 if stdbool.h conforms to C99. */ @%:@undef HAVE_STDBOOL_H]) m4trace:configure.in:84: -1- AC_DEFINE_TRACE_LITERAL([const]) m4trace:configure.in:84: -1- m4_pattern_allow([^const$]) m4trace:configure.in:84: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */ @%:@undef const]) m4trace:configure.in:85: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler calls it, or to nothing if \'inline\' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif]) m4trace:configure.in:86: -1- AC_DEFINE_TRACE_LITERAL([int16_t]) m4trace:configure.in:86: -1- m4_pattern_allow([^int16_t$]) m4trace:configure.in:86: -1- AH_OUTPUT([int16_t], [/* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ @%:@undef int16_t]) m4trace:configure.in:87: -1- AC_DEFINE_TRACE_LITERAL([int32_t]) m4trace:configure.in:87: -1- m4_pattern_allow([^int32_t$]) m4trace:configure.in:87: -1- AH_OUTPUT([int32_t], [/* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ @%:@undef int32_t]) m4trace:configure.in:88: -1- AC_DEFINE_TRACE_LITERAL([int64_t]) m4trace:configure.in:88: -1- m4_pattern_allow([^int64_t$]) m4trace:configure.in:88: -1- AH_OUTPUT([int64_t], [/* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ @%:@undef int64_t]) m4trace:configure.in:89: -1- AC_DEFINE_TRACE_LITERAL([int8_t]) m4trace:configure.in:89: -1- m4_pattern_allow([^int8_t$]) m4trace:configure.in:89: -1- AH_OUTPUT([int8_t], [/* Define to the type of a signed integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ @%:@undef int8_t]) m4trace:configure.in:90: -1- AC_DEFINE_TRACE_LITERAL([off_t]) m4trace:configure.in:90: -1- m4_pattern_allow([^off_t$]) m4trace:configure.in:90: -1- AH_OUTPUT([off_t], [/* Define to `long int\' if does not define. */ @%:@undef off_t]) m4trace:configure.in:91: -1- AC_DEFINE_TRACE_LITERAL([size_t]) m4trace:configure.in:91: -1- m4_pattern_allow([^size_t$]) m4trace:configure.in:91: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if does not define. */ @%:@undef size_t]) m4trace:configure.in:92: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_BLOCKS]) m4trace:configure.in:92: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_BLOCKS$]) m4trace:configure.in:92: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_BLOCKS], [/* Define to 1 if `struct stat\' is a member of `st_blocks\'. */ @%:@undef HAVE_STRUCT_STAT_ST_BLOCKS]) m4trace:configure.in:92: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ST_BLOCKS]) m4trace:configure.in:92: -1- m4_pattern_allow([^HAVE_ST_BLOCKS$]) m4trace:configure.in:92: -1- AH_OUTPUT([HAVE_ST_BLOCKS], [/* Define to 1 if your `struct stat\' has `st_blocks\'. Deprecated, use `HAVE_STRUCT_STAT_ST_BLOCKS\' instead. */ @%:@undef HAVE_ST_BLOCKS]) m4trace:configure.in:92: -1- AC_LIBSOURCE([fileblocks.c]) m4trace:configure.in:92: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS fileblocks.$ac_objext"]) m4trace:configure.in:92: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:92: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:93: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) m4trace:configure.in:93: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) m4trace:configure.in:93: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ @%:@undef TIME_WITH_SYS_TIME]) m4trace:configure.in:94: -1- AC_DEFINE_TRACE_LITERAL([TM_IN_SYS_TIME]) m4trace:configure.in:94: -1- m4_pattern_allow([^TM_IN_SYS_TIME$]) m4trace:configure.in:94: -1- AH_OUTPUT([TM_IN_SYS_TIME], [/* Define to 1 if your declares `struct tm\'. */ @%:@undef TM_IN_SYS_TIME]) m4trace:configure.in:95: -1- AC_DEFINE_TRACE_LITERAL([uint16_t]) m4trace:configure.in:95: -1- m4_pattern_allow([^uint16_t$]) m4trace:configure.in:95: -1- AH_OUTPUT([uint16_t], [/* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ @%:@undef uint16_t]) m4trace:configure.in:96: -1- AC_DEFINE_TRACE_LITERAL([_UINT32_T]) m4trace:configure.in:96: -1- m4_pattern_allow([^_UINT32_T$]) m4trace:configure.in:96: -1- AH_OUTPUT([_UINT32_T], [/* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ @%:@undef _UINT32_T]) m4trace:configure.in:96: -1- AC_DEFINE_TRACE_LITERAL([uint32_t]) m4trace:configure.in:96: -1- m4_pattern_allow([^uint32_t$]) m4trace:configure.in:96: -1- AH_OUTPUT([uint32_t], [/* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ @%:@undef uint32_t]) m4trace:configure.in:97: -1- AC_DEFINE_TRACE_LITERAL([_UINT64_T]) m4trace:configure.in:97: -1- m4_pattern_allow([^_UINT64_T$]) m4trace:configure.in:97: -1- AH_OUTPUT([_UINT64_T], [/* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ @%:@undef _UINT64_T]) m4trace:configure.in:97: -1- AC_DEFINE_TRACE_LITERAL([uint64_t]) m4trace:configure.in:97: -1- m4_pattern_allow([^uint64_t$]) m4trace:configure.in:97: -1- AH_OUTPUT([uint64_t], [/* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ @%:@undef uint64_t]) m4trace:configure.in:98: -1- AC_DEFINE_TRACE_LITERAL([_UINT8_T]) m4trace:configure.in:98: -1- m4_pattern_allow([^_UINT8_T$]) m4trace:configure.in:98: -1- AH_OUTPUT([_UINT8_T], [/* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ @%:@undef _UINT8_T]) m4trace:configure.in:98: -1- AC_DEFINE_TRACE_LITERAL([uint8_t]) m4trace:configure.in:98: -1- m4_pattern_allow([^uint8_t$]) m4trace:configure.in:98: -1- AH_OUTPUT([uint8_t], [/* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ @%:@undef uint8_t]) m4trace:configure.in:99: -1- AC_DEFINE_TRACE_LITERAL([volatile]) m4trace:configure.in:99: -1- m4_pattern_allow([^volatile$]) m4trace:configure.in:99: -1- AH_OUTPUT([volatile], [/* Define to empty if the keyword `volatile\' does not work. Warning: valid code using `volatile\' can become incorrect without. Disable with care. */ @%:@undef volatile]) m4trace:configure.in:100: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTRDIFF_T]) m4trace:configure.in:100: -1- m4_pattern_allow([^HAVE_PTRDIFF_T$]) m4trace:configure.in:100: -1- AH_OUTPUT([HAVE_PTRDIFF_T], [/* Define to 1 if the system has the type `ptrdiff_t\'. */ @%:@undef HAVE_PTRDIFF_T]) m4trace:configure.in:103: -1- AC_DEFINE_TRACE_LITERAL([CLOSEDIR_VOID]) m4trace:configure.in:103: -1- m4_pattern_allow([^CLOSEDIR_VOID$]) m4trace:configure.in:103: -1- AH_OUTPUT([CLOSEDIR_VOID], [/* Define to 1 if the `closedir\' function returns void instead of `int\'. */ @%:@undef CLOSEDIR_VOID]) m4trace:configure.in:104: -1- AC_LIBSOURCE([error.h]) m4trace:configure.in:104: -1- AC_LIBSOURCE([error.c]) m4trace:configure.in:104: -1- AC_LIBSOURCE([error.c]) m4trace:configure.in:104: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS error.$ac_objext"]) m4trace:configure.in:104: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:104: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:105: -1- AC_DEFINE_TRACE_LITERAL([_LARGEFILE_SOURCE]) m4trace:configure.in:105: -1- m4_pattern_allow([^_LARGEFILE_SOURCE$]) m4trace:configure.in:105: -1- AH_OUTPUT([_LARGEFILE_SOURCE], [/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ @%:@undef _LARGEFILE_SOURCE]) m4trace:configure.in:105: -1- AC_DEFINE_TRACE_LITERAL([HAVE_FSEEKO]) m4trace:configure.in:105: -1- m4_pattern_allow([^HAVE_FSEEKO$]) m4trace:configure.in:105: -1- AH_OUTPUT([HAVE_FSEEKO], [/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ @%:@undef HAVE_FSEEKO]) m4trace:configure.in:107: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:107: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDLIB_H]) m4trace:configure.in:107: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.in:107: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.in:107: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:107: -1- AH_OUTPUT([HAVE_MALLOC], [/* Define to 1 if your system has a GNU libc compatible `malloc\' function, and to 0 otherwise. */ @%:@undef HAVE_MALLOC]) m4trace:configure.in:107: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MALLOC]) m4trace:configure.in:107: -1- m4_pattern_allow([^HAVE_MALLOC$]) m4trace:configure.in:107: -1- AC_LIBSOURCE([malloc.c]) m4trace:configure.in:107: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS malloc.$ac_objext"]) m4trace:configure.in:107: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:107: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:107: -1- AC_DEFINE_TRACE_LITERAL([malloc]) m4trace:configure.in:107: -1- m4_pattern_allow([^malloc$]) m4trace:configure.in:107: -1- AH_OUTPUT([malloc], [/* Define to rpl_malloc if the replacement function should be used. */ @%:@undef malloc]) m4trace:configure.in:108: -1- AC_LIBSOURCE([memcmp.c]) m4trace:configure.in:108: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS memcmp.$ac_objext"]) m4trace:configure.in:108: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:108: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_UNISTD_H]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_GETPAGESIZE], [/* Define to 1 if you have the `getpagesize\' function. */ @%:@undef HAVE_GETPAGESIZE]) m4trace:configure.in:109: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPAGESIZE]) m4trace:configure.in:109: -1- m4_pattern_allow([^HAVE_GETPAGESIZE$]) m4trace:configure.in:109: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MMAP]) m4trace:configure.in:109: -1- m4_pattern_allow([^HAVE_MMAP$]) m4trace:configure.in:109: -1- AH_OUTPUT([HAVE_MMAP], [/* Define to 1 if you have a working `mmap\' system call. */ @%:@undef HAVE_MMAP]) m4trace:configure.in:110: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_STDLIB_H]) m4trace:configure.in:110: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDLIB_H]) m4trace:configure.in:110: -1- m4_pattern_allow([^HAVE_STDLIB_H$]) m4trace:configure.in:110: -1- AC_DEFINE_TRACE_LITERAL([HAVE_REALLOC]) m4trace:configure.in:110: -1- m4_pattern_allow([^HAVE_REALLOC$]) m4trace:configure.in:110: -1- AH_OUTPUT([HAVE_REALLOC], [/* Define to 1 if your system has a GNU libc compatible `realloc\' function, and to 0 otherwise. */ @%:@undef HAVE_REALLOC]) m4trace:configure.in:110: -1- AC_DEFINE_TRACE_LITERAL([HAVE_REALLOC]) m4trace:configure.in:110: -1- m4_pattern_allow([^HAVE_REALLOC$]) m4trace:configure.in:110: -1- AC_LIBSOURCE([realloc.c]) m4trace:configure.in:110: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS realloc.$ac_objext"]) m4trace:configure.in:110: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:110: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:110: -1- AC_DEFINE_TRACE_LITERAL([realloc]) m4trace:configure.in:110: -1- m4_pattern_allow([^realloc$]) m4trace:configure.in:110: -1- AH_OUTPUT([realloc], [/* Define to rpl_realloc if the replacement function should be used. */ @%:@undef realloc]) m4trace:configure.in:111: -1- AH_OUTPUT([HAVE_SYS_SELECT_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_SELECT_H]) m4trace:configure.in:111: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the header file. */ @%:@undef HAVE_SYS_SOCKET_H]) m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([SELECT_TYPE_ARG1]) m4trace:configure.in:111: -1- m4_pattern_allow([^SELECT_TYPE_ARG1$]) m4trace:configure.in:111: -1- AH_OUTPUT([SELECT_TYPE_ARG1], [/* Define to the type of arg 1 for `select\'. */ @%:@undef SELECT_TYPE_ARG1]) m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([SELECT_TYPE_ARG234]) m4trace:configure.in:111: -1- m4_pattern_allow([^SELECT_TYPE_ARG234$]) m4trace:configure.in:111: -1- AH_OUTPUT([SELECT_TYPE_ARG234], [/* Define to the type of args 2, 3 and 4 for `select\'. */ @%:@undef SELECT_TYPE_ARG234]) m4trace:configure.in:111: -1- AC_DEFINE_TRACE_LITERAL([SELECT_TYPE_ARG5]) m4trace:configure.in:111: -1- m4_pattern_allow([^SELECT_TYPE_ARG5$]) m4trace:configure.in:111: -1- AH_OUTPUT([SELECT_TYPE_ARG5], [/* Define to the type of arg 5 for `select\'. */ @%:@undef SELECT_TYPE_ARG5]) m4trace:configure.in:112: -1- AC_DEFINE_TRACE_LITERAL([LSTAT_FOLLOWS_SLASHED_SYMLINK]) m4trace:configure.in:112: -1- m4_pattern_allow([^LSTAT_FOLLOWS_SLASHED_SYMLINK$]) m4trace:configure.in:112: -1- AH_OUTPUT([LSTAT_FOLLOWS_SLASHED_SYMLINK], [/* Define to 1 if `lstat\' dereferences a symlink specified with a trailing slash. */ @%:@undef LSTAT_FOLLOWS_SLASHED_SYMLINK]) m4trace:configure.in:112: -1- AC_LIBSOURCE([lstat.c]) m4trace:configure.in:112: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS lstat.$ac_objext"]) m4trace:configure.in:112: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:112: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:112: -1- AC_LIBSOURCE([stat.c]) m4trace:configure.in:112: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS stat.$ac_objext"]) m4trace:configure.in:112: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:112: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:112: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STAT_EMPTY_STRING_BUG]) m4trace:configure.in:112: -1- m4_pattern_allow([^HAVE_STAT_EMPTY_STRING_BUG$]) m4trace:configure.in:112: -1- AH_OUTPUT([HAVE_STAT_EMPTY_STRING_BUG], [/* Define to 1 if `stat\' has the bug that it succeeds when given the zero-length file name argument. */ @%:@undef HAVE_STAT_EMPTY_STRING_BUG]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_ATEXIT], [/* Define to 1 if you have the `atexit\' function. */ @%:@undef HAVE_ATEXIT]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_FLOOR], [/* Define to 1 if you have the `floor\' function. */ @%:@undef HAVE_FLOOR]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_GETCWD], [/* Define to 1 if you have the `getcwd\' function. */ @%:@undef HAVE_GETCWD]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ @%:@undef HAVE_GETTIMEOFDAY]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_MEMMOVE], [/* Define to 1 if you have the `memmove\' function. */ @%:@undef HAVE_MEMMOVE]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ @%:@undef HAVE_MEMSET]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_MUNMAP], [/* Define to 1 if you have the `munmap\' function. */ @%:@undef HAVE_MUNMAP]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_POW], [/* Define to 1 if you have the `pow\' function. */ @%:@undef HAVE_POW]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */ @%:@undef HAVE_SELECT]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_SQRT], [/* Define to 1 if you have the `sqrt\' function. */ @%:@undef HAVE_SQRT]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_STRCASECMP], [/* Define to 1 if you have the `strcasecmp\' function. */ @%:@undef HAVE_STRCASECMP]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_STRDUP], [/* Define to 1 if you have the `strdup\' function. */ @%:@undef HAVE_STRDUP]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ @%:@undef HAVE_STRERROR]) m4trace:configure.in:113: -1- AH_OUTPUT([HAVE_STRRCHR], [/* Define to 1 if you have the `strrchr\' function. */ @%:@undef HAVE_STRRCHR]) m4trace:configure.in:115: -1- AC_CONFIG_HEADERS([config.h]) m4trace:configure.in:116: -1- AC_CONFIG_FILES([Makefile src/Makefile src/compression/Makefile src/compression/zziplib/generic/Makefile src/fx/Makefile src/midi/Makefile src/milkyplay/Makefile src/ppui/Makefile src/ppui/osinterface/Makefile src/tracker/Makefile]) m4trace:configure.in:126: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.in:126: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.in:126: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.in:126: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.in:126: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) m4trace:configure.in:126: -1- AC_SUBST([am__EXEEXT_TRUE]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) m4trace:configure.in:126: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) m4trace:configure.in:126: -1- AC_SUBST([am__EXEEXT_FALSE]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) m4trace:configure.in:126: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) m4trace:configure.in:126: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) m4trace:configure.in:126: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([INSTALL]) m4trace:configure.in:126: -1- AC_SUBST_TRACE([MKDIR_P]) milkytracker-0.90.85+dfsg/aclocal.m40000644000175000017500000014270311317506524016276 0ustar admin2admin2# generated automatically by aclocal 1.11 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file 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. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],, [m4_warning([this file was generated for autoconf 2.64. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) dnl Configure Paths for Alsa dnl Some modifications by Richard Boulton dnl Christopher Lansdown dnl Jaroslav Kysela dnl Last modification: $Id: alsa.m4,v 1.24 2004/09/15 18:48:07 tiwai Exp $ dnl AM_PATH_ALSA([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for libasound, and define ALSA_CFLAGS and ALSA_LIBS as appropriate. dnl enables arguments --with-alsa-prefix= dnl --with-alsa-enc-prefix= dnl --disable-alsatest dnl dnl For backwards compatibility, if ACTION_IF_NOT_FOUND is not specified, dnl and the alsa libraries are not found, a fatal AC_MSG_ERROR() will result. dnl AC_DEFUN([AM_PATH_ALSA], [dnl Save the original CFLAGS, LDFLAGS, and LIBS alsa_save_CFLAGS="$CFLAGS" alsa_save_LDFLAGS="$LDFLAGS" alsa_save_LIBS="$LIBS" alsa_found=yes dnl dnl Get the cflags and libraries for alsa dnl AC_ARG_WITH(alsa-prefix, [ --with-alsa-prefix=PFX Prefix where Alsa library is installed(optional)], [alsa_prefix="$withval"], [alsa_prefix=""]) AC_ARG_WITH(alsa-inc-prefix, [ --with-alsa-inc-prefix=PFX Prefix where include libraries are (optional)], [alsa_inc_prefix="$withval"], [alsa_inc_prefix=""]) dnl FIXME: this is not yet implemented AC_ARG_ENABLE(alsatest, [ --disable-alsatest Do not try to compile and run a test Alsa program], [enable_alsatest="$enableval"], [enable_alsatest=yes]) dnl Add any special include directories AC_MSG_CHECKING(for ALSA CFLAGS) if test "$alsa_inc_prefix" != "" ; then ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" CFLAGS="$CFLAGS -I$alsa_inc_prefix" fi AC_MSG_RESULT($ALSA_CFLAGS) dnl add any special lib dirs AC_MSG_CHECKING(for ALSA LDFLAGS) if test "$alsa_prefix" != "" ; then ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" LDFLAGS="$LDFLAGS $ALSA_LIBS" fi dnl add the alsa library ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" LIBS="$ALSA_LIBS $LIBS" AC_MSG_RESULT($ALSA_LIBS) dnl Check for a working version of libasound that is of the right version. min_alsa_version=ifelse([$1], ,0.1.1,$1) AC_MSG_CHECKING(for libasound headers version >= $min_alsa_version) no_alsa="" alsa_min_major_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` alsa_min_minor_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` alsa_min_micro_version=`echo $min_alsa_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` AC_LANG_SAVE AC_LANG_C AC_TRY_COMPILE([ #include ], [ /* ensure backward compatibility */ #if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) #define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR #endif #if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) #define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR #endif #if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) #define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR #endif # if(SND_LIB_MAJOR > $alsa_min_major_version) exit(0); # else # if(SND_LIB_MAJOR < $alsa_min_major_version) # error not present # endif # if(SND_LIB_MINOR > $alsa_min_minor_version) exit(0); # else # if(SND_LIB_MINOR < $alsa_min_minor_version) # error not present # endif # if(SND_LIB_SUBMINOR < $alsa_min_micro_version) # error not present # endif # endif # endif exit(0); ], [AC_MSG_RESULT(found.)], [AC_MSG_RESULT(not present.) ifelse([$3], , [AC_MSG_ERROR(Sufficiently new version of libasound not found.)]) alsa_found=no] ) AC_LANG_RESTORE dnl Now that we know that we have the right version, let's see if we have the library and not just the headers. if test "x$enable_alsatest" = "xyes"; then AC_CHECK_LIB([asound], [snd_ctl_open],, [ifelse([$3], , [AC_MSG_ERROR(No linkable libasound was found.)]) alsa_found=no] ) fi if test "x$alsa_found" = "xyes" ; then ifelse([$2], , :, [$2]) LIBS=`echo $LIBS | sed 's/-lasound//g'` LIBS=`echo $LIBS | sed 's/ //'` LIBS="-lasound $LIBS" fi if test "x$alsa_found" = "xno" ; then ifelse([$3], , :, [$3]) CFLAGS="$alsa_save_CFLAGS" LDFLAGS="$alsa_save_LDFLAGS" LIBS="$alsa_save_LIBS" ALSA_CFLAGS="" ALSA_LIBS="" fi dnl That should be it. Now just export out symbols: AC_SUBST(ALSA_CFLAGS) AC_SUBST(ALSA_LIBS) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES # Configure paths for SDL # Sam Lantinga 9/21/99 # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS dnl AC_DEFUN([AM_PATH_SDL], [dnl dnl Get the cflags and libraries from the sdl-config script dnl AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], sdl_prefix="$withval", sdl_prefix="") AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], sdl_exec_prefix="$withval", sdl_exec_prefix="") AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], , enable_sdltest=yes) if test x$sdl_exec_prefix != x ; then sdl_config_args="$sdl_config_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_config_args="$sdl_config_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) min_sdl_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdl_config_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdl_config_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" dnl dnl Now check if the installed SDL is sufficiently new. (Also sanity dnl checks the results of sdl-config to some extent dnl rm -f conf.sdltest AC_TRY_RUN([ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" AC_TRY_LINK([ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) rm -f conf.sdltest ]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file 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. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file 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. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file 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. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file 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. # serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file 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. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file 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. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file 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. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file 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. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file 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. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file 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. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file 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. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file 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. # serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file 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. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file 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. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file 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. # serial 2 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file 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. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR milkytracker-0.90.85+dfsg/Makefile.in0000644000175000017500000005350411317506534016504 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ SUBDIRS = src EXTRA_DIST = docs/ChangeLog.html docs/EqualizerDesign.doc docs/FAQ.html \ docs/MilkyTracker.html docs/TiTAN.nfo docs/readme_OSX.html \ docs/readme_PocketPC.html docs/readme_rtaudio docs/readme_unix \ platforms/osx/milkytracker_ppc.zip platforms/osx/milkytracker_sdl.zip \ platforms/osx/milkytracker_universal.zip \ platforms/win32/milkytracker_devcpp.zip platforms/win32/milkytracker_vs8.zip \ platforms/wince/milkytracker_evc3.zip resources/pictures/carton.ico \ resources/pictures/carton.png all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done 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: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(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: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(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) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive 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-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ distclean distclean-generic distclean-hdr distclean-tags \ distcleancheck distdir distuninstallcheck 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive 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: milkytracker-0.90.85+dfsg/config.h.in0000644000175000017500000002061011317506532016450 0ustar admin2admin2/* config.h.in. Generated from configure.in by autoheader. */ /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_JACK_JACK_H /* Define to 1 if you have the `asound' library (-lasound). */ #undef HAVE_LIBASOUND /* Define to 1 if you have the 'libz' library. */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if `struct stat' is a member of `st_blocks'. */ #undef HAVE_STRUCT_STAT_ST_BLOCKS /* Define to 1 if your `struct stat' has `st_blocks'. Deprecated, use `HAVE_STRUCT_STAT_ST_BLOCKS' instead. */ #undef HAVE_ST_BLOCKS /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* SDL supports X11 features */ #undef HAVE_X11 /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* Define to 1 if the `S_IS*' macros in do not work properly. */ #undef STAT_MACROS_BROKEN /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to the type of a signed integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef int8_t /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `long int' if does not define. */ #undef off_t /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile milkytracker-0.90.85+dfsg/src/0000755000175000017500000000000011317506534015217 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/tools/0000755000175000017500000000000011317506047016356 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/tools/genlargefont.cpp0000644000175000017500000000430011150223367021526 0ustar admin2admin2/* * tools/genlargefont.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #include #include #include #include #include #include "BasicTypes.h" #include "PPPath_POSIX.h" #include "XMFile.h" #include "Font.h" #define NUMCHARS 100 #define CHARWIDTH 12 #define CHARHEIGHT 12 #define CHARSIZE (CHARWIDTH*CHARHEIGHT) static pp_uint8 dstFont[CHARSIZE*256/8]; static pp_uint8 src[CHARSIZE*NUMCHARS]; #define CONVERT_LARGE_CHAR \ for (y = 0; y < CHARHEIGHT; y++) \ { \ for (x = 0; x < CHARWIDTH; x++) \ { \ if (src[k*CHARSIZE+y*CHARWIDTH+x]) \ { \ bitstream->write(i*CHARSIZE+y*CHARWIDTH+x, true); \ } \ } \ } int main() { pp_uint32 x,y,i,j,k; XMFile f("athena_ft2_style_12x12.raw"); f.read(src, CHARSIZE, NUMCHARS); Bitstream* bitstream = new Bitstream(dstFont, (CHARSIZE*256)/8); bitstream->clear(); for (i = ' '; i <= '}'; i++) { k = i - ' '; printf("%i\n",k); CONVERT_LARGE_CHAR for (y = 0; y < CHARHEIGHT; y++) { for (x = 0; x < CHARWIDTH; x++) { if (bitstream->read(i*CHARSIZE+y*CHARWIDTH+x)) printf("1"); else printf("0"); } printf("\n"); } } k++; i = 254; CONVERT_LARGE_CHAR k++; i = 253; CONVERT_LARGE_CHAR k++; i = 0xf1; CONVERT_LARGE_CHAR k++; i = 0xf2; CONVERT_LARGE_CHAR k++; i = 0xf3; CONVERT_LARGE_CHAR k++; i = 0xc4; CONVERT_LARGE_CHAR XMFile f2("ATHENA.12X12", true); f2.write(dstFont, 1, sizeof(dstFont)); return 0; } milkytracker-0.90.85+dfsg/src/tools/convertrawfont.cpp0000644000175000017500000000576211150223367022151 0ustar admin2admin2/* * tools/convertrawfont.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #include #include #include #include #include #include "BasicTypes.h" #include "PPPath_POSIX.h" #include "XMFile.h" #include "Font.h" #define FLIP #define NUMCHARS 99 #define CHARWIDTH 8 #define CHARHEIGHT 8 #define CHARSIZE (CHARWIDTH*CHARHEIGHT) static pp_uint8 dstFont[CHARSIZE*256/8]; static pp_uint8 src[CHARSIZE*NUMCHARS]; #ifdef FLIP #define CONVERT_LARGE_CHAR \ for (y = 0; y < CHARHEIGHT; y++) \ { \ for (x = 0; x < CHARWIDTH; x++) \ { \ if (src[k*CHARSIZE+y*CHARWIDTH+x]) \ { \ bitstream->write(i*CHARSIZE+y*CHARWIDTH+(CHARWIDTH-1-x), true); \ } \ } \ } #else #define CONVERT_LARGE_CHAR \ for (y = 0; y < CHARHEIGHT; y++) \ { \ for (x = 0; x < CHARWIDTH; x++) \ { \ if (src[k*CHARSIZE+y*CHARWIDTH+x]) \ { \ bitstream->write(i*CHARSIZE+y*CHARWIDTH+x, true); \ } \ } \ } #endif void convert(const char* infile, const char* outfile) { pp_uint32 x,y,i,j,k; XMFile f(infile); f.read(src, CHARSIZE, NUMCHARS); Bitstream* bitstream = new Bitstream(dstFont, (CHARSIZE*256)/8); bitstream->clear(); for (i = ' '; i <= '}'; i++) { k = i - ' '; printf("%i\n",k); CONVERT_LARGE_CHAR for (y = 0; y < CHARHEIGHT; y++) { for (x = 0; x < CHARWIDTH; x++) { if (bitstream->read(i*CHARSIZE+y*CHARWIDTH+x)) printf("1"); else printf("0"); } printf("\n"); } } k++; i = 254; CONVERT_LARGE_CHAR k++; i = 253; CONVERT_LARGE_CHAR k++; i = 0xf1; CONVERT_LARGE_CHAR k++; i = 0xf2; CONVERT_LARGE_CHAR k++; i = 0xf3; CONVERT_LARGE_CHAR // replace space and put in horizontal line for (x = 0; x < CHARWIDTH; x++) { src[(CHARHEIGHT/2-1)*CHARWIDTH+x] = 0xFF; src[(CHARHEIGHT/2)*CHARWIDTH+x] = 0xFF; } k = 0; i = 0xc4; CONVERT_LARGE_CHAR XMFile f2(outfile, true); f2.write(dstFont, 1, sizeof(dstFont)); } int main() { convert("IDC-Harmonica.raw", "IDC-Harmonica.8X8"); //convert("IDC-Hoodlum.raw", "IDC-Hoodlum.8X8"); //convert("IDC-MicroKnight.raw", "IDC-MicroKnight.8X8"); //convert("REZ-ASCII.raw", "REZ-ASCII.8X8"); //convert("IDC-Harmonica12.raw", "IDC-Harmonica.12X12"); //convert("IDC-MicroKnight12.raw", "IDC-MicroKnight.12X12"); return 0; } milkytracker-0.90.85+dfsg/src/tools/TINY_UPPERCASE.6x50000644000175000017500000000170010737746457021132 0ustar admin2admin2(¯¼@LDFâ@DDD)E1„`dB9„€À„S8DDEQ  0ˆ‚ðÀ "QÊ)`”Q0!F)e€N8à„0áJ9¥!„@!(e”Bá€ôRJ ­Õ¥F9!QJq`”Q 0AŽB€RJ9 ”RH)½J¥€R„àˆQÊ)`”Q0!F)e€N8à„0áJ9¥!„@!(e”Bá€ôRJ ­Õ¥F9!QJq`”Q 0AŽB€RJ9 ”RH)½J¥€R„àj0ÏðBx>€á Ĉ#milkytracker-0.90.85+dfsg/src/tools/archivewriter.cpp0000644000175000017500000000526011150223367021737 0ustar admin2admin2/* * tools/archivewriter.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #include #include #include #include #include "BasicTypes.h" #include "PPPathFactory.h" #include "XMFile.h" #include "SimpleVector.h" using namespace std; class ArchiveWriter { public: enum { RecordSize = (256+4+4) }; void addFile(const PPSystemString& fileName) { files.add(new PPSystemString(fileName)); } void flush(const PPSystemString& fileName) { XMFile f(fileName, true); f.write("pls\xff", 1, 4); f.writeDword(files.size()); f.writeDword(RecordSize); pp_uint32 offset = 12; // write out toc first for (pp_int32 i = 0; i < files.size(); i++) { XMFile inf(*files.get(i)); pp_uint32 size = inf.size(); PPSystemString fileName = files.get(i)->stripPath(); cout << fileName << " Size: " << size << endl; char* nameASCIIZ = fileName.toASCIIZ(); char result[256]; memset(result, 0, sizeof(result)); strcpy(result, nameASCIIZ); delete[] nameASCIIZ; f.write(result, 1, sizeof(result)); f.writeDword(offset + RecordSize*files.size()); f.writeDword(size); offset+=size; } // write out files for (pp_int32 i = 0; i < files.size(); i++) { XMFile inf(*files.get(i)); pp_uint32 size = inf.size(); char* chunk = new char[size]; inf.read(chunk, 1, size); f.write(chunk, 1, size); delete[] chunk; } } private: PPSimpleVector files; }; int main(int argc, const char* argv[]) { ArchiveWriter writer; // Input PPPath* path = PPPathFactory::createPathFromString(argv[1]); const PPPathEntry* entry = path->getFirstEntry(); pp_uint32 numFonts = 0; while (entry) { if (!entry->isHidden() && entry->isFile()) { PPSystemString currentFile = path->getCurrent(); currentFile.append(entry->getName()); //cout << currentFile << endl; writer.addFile(currentFile); } entry = path->getNextEntry(); } writer.flush("/data"); return 0; } milkytracker-0.90.85+dfsg/src/tools/fontcompiler.cpp0000644000175000017500000003043711150223367021566 0ustar admin2admin2/* * tools/fontcompiler.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #include #include #include #include #include "BasicTypes.h" #include "Font.h" #include "PPPathFactory.h" #include "XMFile.h" using namespace std; const pp_uint32 fontWidth = 8; const pp_uint32 fontHeight = 8; pp_uint8 defaultFont[256*8] = { 0,0,0,0,0,0,0,0, 126,129,165,129,189,153,129,126, 126,255,219,255,195,231,255,126, 108,254,254,254,124,56,16,0, 16,56,124,254,124,56,16,0, 56,124,56,254,254,146,16,124, 0,16,56,124,254,124,56,124, 0,0,24,60,60,24,0,0, 255,255,231,195,195,231,255,255, 0,60,102,66,66,102,60,0, 255,195,153,189,189,153,195,255, 15,7,15,125,204,204,204,120, 60,102,102,102,60,24,126,24, 63,51,63,48,48,112,240,224, 127,99,127,99,99,103,230,192, 153,90,60,231,231,60,90,153, 128,224,248,254,248,224,128,0, 2,14,62,254,62,14,2,0, 24,60,126,24,24,126,60,24, 102,102,102,102,102,0,102,0, 127,219,219,123,27,27,27,0, 62,99,56,108,108,56,134,252, 0,0,0,0,126,126,126,0, 24,60,126,24,126,60,24,255, 24,60,126,24,24,24,24,0, 24,24,24,24,126,60,24,0, 0,24,12,254,12,24,0,0, 0,48,96,254,96,48,0,0, 0,0,192,192,192,254,0,0, 0,36,102,255,102,36,0,0, 0,24,60,126,255,255,0,0, 0,255,255,126,60,24,0,0, 0,0,0,0,0,0,0,0, 48,48,48,48,48,0,48,0, 108,108,108,0,0,0,0,0, 108,108,254,108,254,108,108,0, 24,126,192,124,6,252,24,0, 0,102,204,24,48,102,204,0, 56,108,56,118,220,204,118,0, 12,12,12,0,0,0,0,0, 24,48,96,96,96,48,24,0, 96,48,24,24,24,48,96,0, 0,102,60,255,60,102,0,0, 0,24,24,126,24,24,0,0, 0,0,0,0,0,24,48,0, 0,0,0,126,0,0,0,0, 0,0,0,0,0,0,24,0, 0,6,12,24,48,96,0,0, 124,198,214,214,214,198,124,0, 112,48,48,48,48,52,124,0, 248,12,12,120,192,192,252,0, 248,12,12,120,12,12,248,0, 192,204,204,204,254,12,12,0, 252,192,192,248,12,12,248,0, 192,192,192,252,198,198,124,0, 252,12,12,24,48,48,48,0, 56,108,108,124,198,198,124,0, 124,198,198,126,6,6,6,0, 0,0,24,0,0,24,0,0, 0,0,24,0,0,24,48,0, 0,12,24,48,24,12,0,0, 0,0,126,0,126,0,0,0, 0,48,24,12,24,48,0,0, 60,102,6,12,24,0,24,0, 60,102,219,219,206,96,60,0, 60,102,198,198,254,198,198,0, 252,198,198,252,198,198,252,0, 62,96,192,192,192,96,62,0, 252,198,198,198,198,198,252,0, 254,192,192,254,192,192,254,0, 254,192,192,254,192,192,192,0, 62,96,192,206,198,198,124,0, 198,198,198,254,198,198,198,0, 24,24,24,24,24,24,24,0, 6,6,6,6,6,6,124,0, 198,204,216,240,216,204,198,0, 192,192,192,192,192,192,254,0, 252,214,214,214,214,214,214,0, 248,204,198,198,198,198,198,0, 60,102,198,198,198,198,124,0, 252,198,198,198,252,192,192,0, 60,102,198,198,198,218,108,6, 252,198,198,198,252,198,195,0, 62,96,192,124,6,6,252,0, 126,24,24,24,24,24,24,0, 198,198,198,198,198,198,124,0, 198,198,198,198,198,108,56,0, 214,214,214,214,214,214,252,0, 198,198,198,124,198,198,198,0, 204,204,204,120,48,48,48,0, 254,6,12,24,48,96,254,0, 120,96,96,96,96,96,120,0, 0,96,48,24,12,6,0,0, 120,24,24,24,24,24,120,0, 24,60,102,195,0,0,0,0, 0,0,0,0,0,0,0,255, 48,48,48,0,0,0,0,0, 0,0,124,6,126,198,126,0, 192,192,252,198,198,198,252,0, 0,0,126,192,192,192,126,0, 6,6,126,198,198,198,126,0, 0,0,124,198,254,192,126,0, 60,96,248,96,96,96,96,0, 0,0,124,198,198,126,6,252, 192,192,252,198,198,198,198,0, 24,0,120,24,24,24,24,0, 12,0,60,12,12,12,12,248, 192,192,198,204,248,204,198,0, 48,48,48,48,48,48,28,0, 0,0,252,214,214,214,214,0, 0,0,252,198,198,198,198,0, 0,0,124,198,198,198,124,0, 0,0,252,198,198,252,192,192, 0,0,126,198,198,126,6,6, 0,0,252,198,192,192,192,0, 0,0,124,192,120,12,248,0, 48,48,252,48,48,48,28,0, 0,0,198,198,198,198,124,0, 0,0,198,198,198,108,56,0, 0,0,214,214,214,214,252,0, 0,0,198,198,124,198,198,0, 0,0,198,198,198,126,6,252, 0,0,254,12,56,96,254,0, 7,12,12,56,12,12,7,0, 24,24,24,24,24,24,24,24, 224,48,48,28,48,48,224,0, 118,220,0,0,0,0,0,0, 0,16,56,108,198,198,254,0, 255,128,128,128,128,128,128,128, 255,0,0,0,0,0,0,0, 255,1,1,1,1,1,1,1, 128,128,128,128,128,128,128,128, 1,1,1,1,1,1,1,1, 128,128,128,128,128,128,128,255, 0,0,0,0,0,0,0,255, 1,1,1,1,1,1,1,255, 128,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,128, 0,0,0,0,0,0,0,1, 128,192,224,240,248,252,254,255, 255,127,63,31,15,7,3,1, 255,255,192,192,192,192,192,192, 255,255,0,0,0,0,0,0, 255,255,3,3,3,3,3,3, 192,192,192,192,192,192,192,192, 3,3,3,3,3,3,3,3, 192,192,192,192,192,192,255,255, 0,0,0,0,0,0,255,255, 3,3,3,3,3,3,255,255, 192,192,0,0,0,0,0,0, 3,3,0,0,0,0,0,0, 0,0,0,0,0,0,192,192, 0,0,0,0,0,0,3,3, 0,0,0,85,0,0,0,0, 0,252,252,252,252,252,252,0, 0,126,126,126,126,126,126,0, 0,63,63,63,63,63,63,0, 0,31,31,31,31,31,31,0, 0,15,15,15,15,15,15,0, 0,7,7,7,7,7,7,0, 0,3,3,3,3,3,3,0, 0,1,1,1,1,1,1,0, 0,128,128,128,128,128,128,0, 0,192,192,192,192,192,192,0, 0,224,224,224,224,224,224,0, 0,240,240,240,240,240,240,0, 0,248,248,248,248,248,248,0, 126,126,126,126,126,126,126,126, 255,255,0,24,60,126,255,0, 255,255,0,0,0,0,24,24, 255,255,0,24,60,126,255,24, 255,255,0,66,102,90,66,66, 0,0,0,24,24,0,0,0, 0,192,192,192,192,192,192,192, 0,216,216,216,216,216,216,216, 0,219,219,219,219,219,219,219, 0,96,96,96,96,96,96,96, 0,108,108,108,108,108,108,108, 0,109,109,109,109,109,109,109, 0,128,128,128,128,128,128,128, 0,176,176,176,176,176,176,176, 0,182,182,182,182,182,182,182, 0,0,24,60,60,24,0,0, 0,0,248,24,248,24,24,24, 54,54,246,6,246,54,54,54, 54,54,54,54,54,54,54,54, 0,0,254,6,246,54,54,54, 54,54,246,6,254,0,0,0, 54,54,54,54,254,0,0,0, 24,24,248,24,248,0,0,0, 0,0,0,0,248,24,24,24, 24,24,24,24,31,0,0,0, 24,24,24,24,255,0,0,0, 0,0,0,0,255,24,24,24, 24,24,24,24,31,24,24,24, 0,0,0,0,255,0,0,0, 24,24,24,24,255,24,24,24, 24,24,31,24,31,24,24,24, 54,54,54,54,55,54,54,54, 54,54,55,48,63,0,0,0, 0,0,63,48,55,54,54,54, 54,54,247,0,255,0,0,0, 0,0,255,0,247,54,54,54, 54,54,55,48,55,54,54,54, 0,0,255,0,255,0,0,0, 54,54,247,0,247,54,54,54, 24,24,255,0,255,0,0,0, 54,54,54,54,255,0,0,0, 0,0,255,0,255,24,24,24, 0,0,0,0,255,54,54,54, 54,54,54,54,63,0,0,0, 24,24,31,24,31,0,0,0, 0,0,31,24,31,24,24,24, 0,0,0,0,63,54,54,54, 54,54,54,54,255,54,54,54, 24,24,255,24,255,24,24,24, 24,24,24,24,248,0,0,0, 0,0,0,0,31,24,24,24, 255,255,255,255,255,255,255,255, 0,0,0,0,255,255,255,255, 240,240,240,240,240,240,240,240, 15,15,15,15,15,15,15,15, 255,255,255,255,0,0,0,0, 0,0,118,220,200,220,118,0, 0,120,204,248,204,248,192,192, 0,252,204,192,192,192,192,0, 0,0,254,108,108,108,108,0, 252,204,96,48,96,204,252,0, 0,0,126,216,216,216,112,0, 0,102,102,102,102,124,96,192, 0,118,220,24,24,24,24,0, 252,48,120,204,204,120,48,252, 56,108,198,254,198,108,56,0, 56,108,198,198,108,108,238,0, 28,48,24,124,204,204,120,0, 0,0,126,219,219,126,0,0, 6,12,126,219,219,126,96,192, 56,96,192,248,192,96,56,0, 0,0,0,0,0,219,219,0, // 239 0,126,0,126,0,126,0,0, // 240 0x00,16+8+4+2+1,16,16,16,16,16+8+4+2+1,0x00, // 241 0x00,255,0,0,0,0,255,0x00, // 242 0x00,128+64+32+16+8,8,8,8,8,128+64+32+16+8,0x00, // 243 // Small DOT 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00, // 244 // ramp 2 wave part 2 0x00,0x00,0x00,0x40,0x80,0x00,0x00,0x00, // 245 // ramp 2 wave part 1 0x04,0x0c,0x14,0x24,0x44,0x85,0x06,0x04, // 246 // ramp wave part 2 0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00, // 247 // ramp wave part 1 0x04,0x06,0x85,0x44,0x24,0x14,0x0c,0x04, // 248 // squarewave part 2 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0xfe, // 249 // squarewave part 1 0xff,0x81,0x81,0x81,0x81,0x01,0x01,0x01, // 250 // sinewave part 2 0x00,0x00,0x00,0x04,0x04,0x88,0x88,0x70, // 251 // sinewave part 1 0x1c,0x22,0x22,0x41,0x41,0x00,0x00,0x00, // 252 // arrow down 0x00,0x00,0x7f,0x3e,0x1c,0x08,0x00,0x00, // 253 // arrow up 0x00,0x00,0x08,0x1c,0x3e,0x7f,0x00,0x00, // 254 // checkbox marker: 0x01,1+2+128,128+64+4+2,64+32+8+4,32+16+8,16}; // 255 // pseudo syntax checkin ?x? where ? can be any combination of numbers bool checkExtension(const char* ext, pp_uint32& width, pp_uint32& height) { pp_int32 i; // skip period ext++; bool noNumber = false; PPSystemString widthStr; for (i = 0; i < strlen(ext) && ext[i] != 'X'; i++) { widthStr.append(ext[i]); if (ext[i] < '0' || ext[i] > '9') noNumber = true; } if (ext[i] != 'X') return false; if (noNumber) return false; ext+=i+1; if (!strlen(ext)) return false; PPSystemString heightStr; for (i = 0; i < strlen(ext); i++) { heightStr.append(ext[i]); if (ext[i] < '0' || ext[i] > '9') noNumber = true; } if (noNumber) return false; width = atoi(widthStr); height = atoi(heightStr); return true; } int main(int argc, const char* argv[]) { bool writeRawImage = true; pp_int32 i = 0; // output fstream f("FontLibrary.cpp", ios::out); f << "struct FontEntry\n" "{\n const char* name;\n" " const unsigned int width, height;\n" " const unsigned char* data;\n" "};\n\n"; // Input PPPath* path = PPPathFactory::createPathFromString("../../resources/fonts/"); const PPPathEntry* entry = path->getFirstEntry(); f << "FontEntry fontEntries[] = {\n"; pp_uint32 numFonts = 0; while (entry) { if (!entry->isHidden() && entry->isFile()) { PPSystemString extension = entry->getName().getExtension(); extension.toUpper(); // Check for font file pp_uint32 width, height; if (checkExtension(extension, width, height)) { PPSystemString currentFile = path->getCurrent(); currentFile.append(entry->getName()); //cout << currentFile << endl; f << "// Font no. " << numFonts << endl; f << "FontEntry(" << '"' << entry->getName().stripExtension() << '"' << ", " << width << ", " << height << ", " << endl; XMFile input(currentFile); double dsize = ceil(width*height*256.0)/8.0f; pp_uint32 size = (pp_uint32)dsize; cout << "Size: " << size << endl; pp_uint8* data = new pp_uint8[size]; bool flip = false; if (width == 8 && height == 8) { cout << "Font is 8x8 => x-flipping + adding special characters" << endl; // char 239-256 are coming from out default font // those are special characters necessary for // displaying special pattern data // and symbols memcpy(data, defaultFont, 256*8); input.read(data, 8, 239); memcpy(data + 0xc4*8, defaultFont + 0xc4*8, 8); flip = true; } else { memset(data, 0, size); input.read(data, 1, size); } // fill in stream pp_uint32 j = 0; for (pp_int32 i = 0; i < size; i++) { if (j == 0) f << '"'; pp_uint32 src = data[i]; pp_uint8 dst = 0; if (flip) { dst = (src&1)<<7; dst |= ((src&2)>>1)<<6; dst |= ((src&4)>>2)<<5; dst |= ((src&8)>>3)<<4; dst |= ((src&16)>>4)<<3; dst |= ((src&32)>>5)<<2; dst |= ((src&64)>>6)<<1; dst |= ((src&128)>>7); } else dst = src; char hexStr[100]; sprintf(hexStr, "\\x%x", dst); if (i == size - 1) f << hexStr << '"' << endl; else f << hexStr; j++; if (j == 64 && i != size - 1) { f << '"' << endl; j = 0; } } if (writeRawImage) { PPSystemString file = currentFile.stripPath(); file.append(".raw"); cout << "Writing raw image: " << file << endl; char* rawImage = new char[256*width*height]; Bitstream bitstream(data, size); for (pp_int32 j = 0; j < width*height*256; j++) rawImage[j] = bitstream.read(j) ? 255 : 0; fstream bfstream(file,ios::out|ios::binary); bfstream.write(rawImage, 256*width*height); bfstream.close(); delete[] rawImage; } delete data; numFonts++; f << ")," << endl; } else { cout << "Unrecognized extension for " << entry->getName() << endl; } } entry = path->getNextEntry(); } f << "};" << endl << endl << "const unsigned int numFontsEntries = " << numFonts << ";" << endl; return 0; } milkytracker-0.90.85+dfsg/src/tools/gentinyfont.cpp0000644000175000017500000003026511150223367021430 0ustar admin2admin2/* * tools/gentinyfont.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #include #include #include #include #include #include "BasicTypes.h" #include "PPPath_POSIX.h" #include "XMFile.h" #include "Font.h" static pp_uint8 tinyFont[5*6*256/8]; const pp_uint32 tinyCharacters[] = { // Capital letters from A 0x00100, 0x01010, 0x01010, 0x01110, 0x01010, 0x00000, 0x01100, 0x01010, 0x01100, 0x01010, 0x01100, 0x00000, 0x00110, 0x01000, 0x01000, 0x01000, 0x00110, 0x00000, 0x01100, 0x01010, 0x01010, 0x01010, 0x01100, 0x00000, 0x01110, 0x01000, 0x01110, 0x01000, 0x01110, 0x00000, 0x01110, 0x01000, 0x01100, 0x01000, 0x01000, 0x00000, 0x00110, 0x01000, 0x01110, 0x01010, 0x00110, 0x00000, 0x01010, 0x01010, 0x01110, 0x01010, 0x01010, 0x00000, 0x00100, 0x00100, 0x00100, 0x00100, 0x00100, 0x00000, 0x00100, 0x00100, 0x00100, 0x00100, 0x01100, 0x00000, 0x01010, 0x01010, 0x01100, 0x01010, 0x01010, 0x00000, 0x01000, 0x01000, 0x01000, 0x01000, 0x01110, 0x00000, 0x01001, 0x01111, 0x01001, 0x01001, 0x01001, 0x00000, 0x01001, 0x01101, 0x01101, 0x01011, 0x01001, 0x00000, 0x00100, 0x01010, 0x01010, 0x01010, 0x00100, 0x00000, 0x01100, 0x01010, 0x01110, 0x01000, 0x01000, 0x00000, 0x00100, 0x01010, 0x01010, 0x01010, 0x00111, 0x00000, 0x01100, 0x01010, 0x01100, 0x01010, 0x01010, 0x00000, 0x00110, 0x01000, 0x00100, 0x00010, 0x01100, 0x00000, 0x01110, 0x00100, 0x00100, 0x00100, 0x00100, 0x00000, 0x01010, 0x01010, 0x01010, 0x01010, 0x01110, 0x00000, 0x01010, 0x01010, 0x01010, 0x01010, 0x00100, 0x00000, 0x01001, 0x01001, 0x01001, 0x01111, 0x01001, 0x00000, 0x01010, 0x01010, 0x00100, 0x01010, 0x01010, 0x00000, 0x01010, 0x01010, 0x00100, 0x00100, 0x00100, 0x00000, 0x01110, 0x00010, 0x00100, 0x01000, 0x01110, 0x00000, // small letters = capital letters (lazy guy) 0x00000, // a 0x01110, 0x00011, 0x01101, 0x01111, 0x00000, 0x00000, // b 0x01000, 0x01100, 0x01010, 0x00100, 0x00000, 0x00000, // c 0x00110, 0x01000, 0x01000, 0x00110, 0x00000, 0x00001, // d 0x00001, 0x00111, 0x01001, 0x00111, 0x00000, 0x00000, // e 0x00110, 0x01001, 0x01110, 0x00111, 0x00000, 0x00000, // f 0x00011, 0x00100, 0x01110, 0x00100, 0x00000, 0x00000, // g 0x00111, 0x01101, 0x00011, 0x01100, 0x00000, 0x00000, // h 0x01000, 0x01110, 0x01010, 0x01010, 0x00000, 0x00000, // i 0x00100, 0x00000, 0x00100, 0x00100, 0x00000, 0x00000, // j 0x00100, 0x00000, 0x00100, 0x01100, 0x00000, 0x00000, // k 0x01000, 0x01010, 0x01100, 0x01010, 0x00000, 0x00000, // l 0x01000, 0x01000, 0x01000, 0x00110, 0x00000, 0x00000, // m 0x01001, 0x01111, 0x01001, 0x01001, 0x00000, 0x00000, // n 0x01011, 0x01101, 0x01001, 0x01001, 0x00000, 0x00000, // o 0x00100, 0x01010, 0x01010, 0x00100, 0x00000, 0x00000, 0x01100, // p 0x01010, 0x01100, 0x01000, 0x00000, 0x00000, // q 0x01110, 0x01010, 0x01110, 0x00010, 0x00000, 0x00000, // r 0x01010, 0x01101, 0x01000, 0x01000, 0x00000, 0x00000, // s 0x00110, 0x01000, 0x00110, 0x01100, 0x00000, 0x00000, // t 0x00100, 0x01110, 0x00100, 0x00110, 0x00000, 0x00000, // u 0x01010, 0x01010, 0x01010, 0x00110, 0x00000, 0x00000, // v 0x01010, 0x01010, 0x01010, 0x00100, 0x00000, 0x00000, // w 0x01001, 0x01001, 0x01111, 0x01001, 0x00000, 0x00000, // x 0x01010, 0x00100, 0x01010, 0x01010, 0x00000, 0x00000, // y 0x01010, 0x01010, 0x00100, 0x01100, 0x00000, 0x00000, // z 0x01110, 0x00010, 0x01100, 0x01110, 0x00000, // number from 0 0x00100, 0x01010, 0x01010, 0x01010, 0x00100, 0x00000, 0x00100, 0x01100, 0x00100, 0x00100, 0x00100, 0x00000, 0x01100, 0x00010, 0x01100, 0x01000, 0x01110, 0x00000, 0x01100, 0x00010, 0x01100, 0x00010, 0x01100, 0x00000, 0x01000, 0x01010, 0x01110, 0x00010, 0x00010, 0x00000, 0x01110, 0x01000, 0x01110, 0x00010, 0x01100, 0x00000, 0x00110, 0x01000, 0x01110, 0x01010, 0x01100, 0x00000, 0x01110, 0x00010, 0x00100, 0x00100, 0x00100, 0x00000, 0x00100, 0x01010, 0x00100, 0x01010, 0x00100, 0x00000, 0x00100, 0x01010, 0x00110, 0x00010, 0x01100, 0x00000, 0x00000, // "-" 0x00000, 0x01111, 0x00000, 0x00000, 0x00000, 0x00000, // "+" 0x00100, 0x01110, 0x00100, 0x00000, 0x00000, 0x00000, // "=" 0x01111, 0x00000, 0x01111, 0x00000, 0x00000, 0x00000, // "^" 0x00100, 0x01010, 0x00000, 0x00000, 0x00000, 0x01010, // "#" 0x01111, 0x01010, 0x01111, 0x01010, 0x00000, 0x01000, // ">" 0x00100, 0x00010, 0x00100, 0x01000, 0x00000, 0x00010, // "<" 0x00100, 0x01000, 0x00100, 0x00010, 0x00000, 0x00000, // \xfa 0x00000, 0x00100, 0x00000, 0x00000, 0x00000, 0x00000, // \xfd 0x00100, 0x00100, 0x01110, 0x00100, 0x00000, 0x00000, // \xfe 0x00100, 0x01110, 0x00100, 0x00100, 0x00000, 0x00000, // 239 0x00000, 0x00000, 0x10101, 0x10101, 0x00000, 0x00000, // 240 0x00000, 0x00110, 0x01111, 0x00110, 0x00000, 0x00000, // 241 0x01111, 0x01000, 0x01000, 0x01111, 0x00000, 0x00000, // 242 0x11111, 0x00000, 0x00000, 0x11111, 0x00000, 0x00000, // 243 0x11111, 0x00001, 0x00001, 0x11111, 0x00000, 0x00000, // '.' 0x00000, 0x00000, 0x00000, 0x01100, 0x00000, 0x00001, // '/' 0x00010, 0x00100, 0x01000, 0x10000, 0x00000, 0x10001, // '%' 0x10010, 0x00100, 0x01001, 0x10001, 0x00000, 0x00000, // ':' 0x01100, 0x00000, 0x01100, 0x00000, 0x00000 }; #define CONVERT_TINY_CHAR \ for (y = 0; y < 6; y++) \ { \ for (x = 0; x < 5; x++) \ { \ if ((tinyCharacters[k]>>((4-x)<<2))&1) \ { \ bitstream->write(i*(5*6)+y*5+x, true); \ } \ } \ k++; \ } void genTinyFont() { pp_uint32 x,y,i,j,k; Bitstream* bitstream = new Bitstream(tinyFont, (6*5*256)/8); bitstream->clear(); k = 0; for (i = 'A'; i <= 'Z'; i++) { CONVERT_TINY_CHAR; } for (i = 'a'; i <= 'z'; i++) { CONVERT_TINY_CHAR; } for (i = '0'; i <= '9'; i++) { CONVERT_TINY_CHAR; } i = '-'; CONVERT_TINY_CHAR; i = '+'; CONVERT_TINY_CHAR; i = '='; CONVERT_TINY_CHAR; i = '^'; CONVERT_TINY_CHAR; i = '#'; CONVERT_TINY_CHAR; i = '>'; CONVERT_TINY_CHAR; i = '<'; CONVERT_TINY_CHAR; i = 0xf4; CONVERT_TINY_CHAR; i = 0xfd; CONVERT_TINY_CHAR; i = 0xfe; CONVERT_TINY_CHAR; i = 239; CONVERT_TINY_CHAR; i = 240; CONVERT_TINY_CHAR; i = 241; CONVERT_TINY_CHAR; i = 242; CONVERT_TINY_CHAR; i = 243; CONVERT_TINY_CHAR; i = '.'; CONVERT_TINY_CHAR; i = '/'; CONVERT_TINY_CHAR; i = '%'; CONVERT_TINY_CHAR; i = ':'; CONVERT_TINY_CHAR; delete bitstream; XMFile f("TINY.6x5", true); f.write(tinyFont, 1, sizeof(tinyFont)); } void genTinyFontUpperCase() { pp_uint32 x,y,i,j,k; Bitstream* bitstream = new Bitstream(tinyFont, (6*5*256)/8); bitstream->clear(); k = 0; for (i = 'A'; i <= 'Z'; i++) { CONVERT_TINY_CHAR; } pp_uint32 l = k; k = 0; for (i = 'a'; i <= 'z'; i++) { CONVERT_TINY_CHAR; } k+=l; for (i = '0'; i <= '9'; i++) { CONVERT_TINY_CHAR; } i = '-'; CONVERT_TINY_CHAR; i = '+'; CONVERT_TINY_CHAR; i = '='; CONVERT_TINY_CHAR; i = '^'; CONVERT_TINY_CHAR; i = '#'; CONVERT_TINY_CHAR; i = '>'; CONVERT_TINY_CHAR; i = '<'; CONVERT_TINY_CHAR; i = 0xf4; CONVERT_TINY_CHAR; i = 0xfd; CONVERT_TINY_CHAR; i = 0xfe; CONVERT_TINY_CHAR; i = 239; CONVERT_TINY_CHAR; i = 240; CONVERT_TINY_CHAR; i = 241; CONVERT_TINY_CHAR; i = 242; CONVERT_TINY_CHAR; i = 243; CONVERT_TINY_CHAR; i = '.'; CONVERT_TINY_CHAR; i = '/'; CONVERT_TINY_CHAR; i = '%'; CONVERT_TINY_CHAR; i = ':'; CONVERT_TINY_CHAR; delete bitstream; XMFile f("TINY_UPPERCASE.6x5", true); f.write(tinyFont, 1, sizeof(tinyFont)); } int main() { genTinyFont(); genTinyFontUpperCase(); return 0; } milkytracker-0.90.85+dfsg/src/tools/Makefile0000644000175000017500000000257710737746457020051 0ustar admin2admin2CPP = g++ CPPFLAGS = -g FILES_1 = "fontcompiler.cpp" \ "../ppui/osinterface/posix/PPSystem_POSIX.cpp" \ "../ppui/osinterface/posix/PPPath_POSIX.cpp" \ "../ppui/osinterface/PPPathFactory.cpp" \ "../milkyplay/XMFile.cpp" FILES_2 = "gentinyfont.cpp" \ "../ppui/osinterface/posix/PPSystem_POSIX.cpp" \ "../ppui/osinterface/posix/PPPath_POSIX.cpp" \ "../ppui/osinterface/PPPathFactory.cpp" \ "../milkyplay/XMFile.cpp" FILES_3 = "genlargefont.cpp" \ "../ppui/osinterface/posix/PPSystem_POSIX.cpp" \ "../ppui/osinterface/posix/PPPath_POSIX.cpp" \ "../ppui/osinterface/PPPathFactory.cpp" \ "../milkyplay/XMFile.cpp" FILES_4 = "convertrawfont.cpp" \ "../ppui/osinterface/posix/PPSystem_POSIX.cpp" \ "../ppui/osinterface/posix/PPPath_POSIX.cpp" \ "../ppui/osinterface/PPPathFactory.cpp" \ "../milkyplay/XMFile.cpp" FILES_5 = "archivewriter.cpp" \ "../ppui/osinterface/posix/PPSystem_POSIX.cpp" \ "../ppui/osinterface/posix/PPPath_POSIX.cpp" \ "../ppui/osinterface/PPPathFactory.cpp" \ "../milkyplay/XMFile.cpp" INCLUDE = -I. \ -I../ppui \ -I../ppui/osinterface \ -I../ppui/osinterface/posix \ -I../milkyplay main: $(CPP) $(CPPFLAGS) $(INCLUDE) $(FILES_1) -o fontcompiler $(CPP) $(CPPFLAGS) $(INCLUDE) $(FILES_2) -o gentinyfont $(CPP) $(CPPFLAGS) $(INCLUDE) $(FILES_3) -o genlargefont $(CPP) $(CPPFLAGS) $(INCLUDE) $(FILES_4) -o convertrawfont $(CPP) $(CPPFLAGS) $(INCLUDE) $(FILES_5) -o archivewriter milkytracker-0.90.85+dfsg/src/tools/compile.sh0000755000175000017500000000003110737736041020343 0ustar admin2admin2#!/bin/bash g++ test.cpp milkytracker-0.90.85+dfsg/src/tools/TINY.6x50000644000175000017500000000170010740205004017467 0ustar admin2admin2(¯¼@LDFâ@DDD)E1„`dB9„€À„S8DDEQ  0ˆ‚ðÀ "QÊ)`”Q0!F)e€N8à„0áJ9¥!„@!(e”Bá€ôRJ ­Õ¥F9!QJq`”Q 0AŽB€RJ9 ”RH)½J¥€R„àˆpØz„Q&rÉ`Òq0qn±@8¥ € ¡Œ@Á^J´•¢À(#pÊ!”&˜€8ÂPJ1”R)½@¥PŠ2j0ÏðBx>€á Ĉ#milkytracker-0.90.85+dfsg/src/tools/FontLibrary.cpp0000644000175000017500000107744111150217235021324 0ustar admin2admin2struct FontEntry { const char* name; const unsigned int width, height; const unsigned char* data; }; FontEntry fontEntries[] = { // Font no. 0 FontEntry("ARIEL", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x3c\x66\x66\x66\x66\x66\x3c\x0\x18\x1c\x18\x18\x18\x18\x3c\x0\x3e\x63\x60\x30\xc\x6\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x66\x7f\x60\x60\x0\x7f\x3\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x0\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x63\x63\x3f\x63\x63\x3f\x0\x3e\x63\x3\x3\x63\x63\x3e\x0\x3f\x63\x63\x63\x63\x63\x3f\x0\x7f\x3\x3\x1f\x3\x3\x7f\x0\x7f\x43\x3\x1f\x13\x3\x3\x0\x3e\x63\x3\x7b\x43\x63\x5e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x30\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x7b\x73\x3e\x60\x3f\x66\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\x8\x8\x1c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x6\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 1 FontEntry("ATHENA", 12, 12, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x80\xf\xf8\x80\xf\xf8\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x0\xdc\xc1\x1d\x10\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x38\x8e\xf3\x7f\x8e\xe3\x38\x8e" "\xe3\x38\xff\xe7\x38\x8e\x3\x0\x50\x0\x5\xfe\x73\x5\x57\xe0\x3f\x50\x7\x75\xfe\x3\x5\x50\x0\x0\x0\x0\x1c\xc7\x71\xe\xe0\x0\x7\x70\x80\x3\x38\xc7\x71\x1c\x0\x0\xfe\x70\x18\x87\xf1\xc\x7e\xc0\x3\x76\x32\x3e\xc3\x71\x3c\x7e\x7\x0\x70\x0" "\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf0\x0\x0\x78\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\x78\x0\x0\x0\x0\x2\x70\x80\xf\xff\xe7\x3f\xfc\xc1\x1f" "\x8e\x33\x60\x0\x0\x0\x0\x0\x7\x70\x0\x7\x70\xf0\x7f\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x4\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x0\x0\x0\x1c\xc0\x1\xe\xe0\x0\x7\x70\x80\x3\x38\xc0\x1\x1c\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x70\x80\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\xfe\x3\x0\xfe\x73\x70\x7\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\xff\x7\x0\xfe\x73\x70\x7\x7\x70\xe0\x3\x70\x0\x7\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\xff\x77\x0\x7\x70\x0" "\xff\x3\x70\x0\x7\x70\x7\x77\x70\xfe\x3\x0\xfe\x73\x0\x7\x70\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\xff\x7\x70\x0\x7\x38\x80\x3\x7f\xc0\x1\xe\xe0\x0\x7\x70\x0\x0\xfe\x73\x70\x7\x77\x70\xfe\x73\x70\x7\x77\x70\x7\x77\x70\xfe" "\x3\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\xfe\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x4\x0\x0\x0\xc0\x1\xe\x70\x80" "\x3\x1c\x80\x3\x70\x0\xe\xc0\x1\x0\x0\x0\x0\x0\xe0\x3f\x0\x0\x0\x0\xe0\x3f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x80\x3\x70\x0\xe\xc0\x1\xe\x70\x80\x3\x1c\x0\x0\xfe\x73\x70\x0\x7\x70\x0\x7\x3e\x70\x0\x7\x0\x0\x7\x70\x0\x0" "\xfc\xe1\x38\x67\x77\x7b\x37\x77\x73\x37\x77\x73\xe7\xe3\x0\xfc\x1\x0\xfe\x73\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x73\x70\x7\x77\x70\xff\x73\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\xfe\x73\x70\x7\x70\x0\x7\x70\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x38\xff\x1\x0\xff\x77\x0\x7\x70\x0\x7f\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xff\x77\x0\x7\x70\x0\x7f\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\xfe\x73" "\x70\x7\x70\x0\xc7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xff\x7\x0\xfe\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70" "\x0\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x38\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x7\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\x3\x76\x70\x8f\xf7\x7d\xff\x77\x77\x27\x77\x70\x7\x77\x70\x7\x7\x0\x3\x77\x70\xf" "\xf7\x71\x3f\x77\x77\xe7\x77\x7c\x87\x77\x70\x7\x6\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\xff\x73\x70\x7\x77\x70\xff\x73\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x76\xe7\x77" "\x7c\xbe\x3\x30\xff\x73\x70\x7\x77\x70\xff\x73\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xfe\x73\x70\x7\x70\x0\xfe\x3\x70\x0\x7\x70\x0\x77\x70\xfe\x3\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x7\x77\x70\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x8e\xc3\x1d\xf8\x0\x0\x7\x77\x70\x7\x77\x70\x27\x77\x77\xff\xf7\x7d\x8f\x77\x70\x3\x6\x0\x7\x77\x70\x7\xe7\x38\xfc\xe1\x38\x7\x77\x70\x7\x77\x70\x7" "\x7\x0\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\x0\x7\x70\xfc\x3\x0\xff\x7\x70\x80\x3\x1c\xe0\x0\x7\x38\xc0\x1\xe\x70\x0\xff\x7\x0\xf8\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf8\x0\x0\x0\xc0\x1\x1c\x80\x3\x38\x0" "\x7\x70\x0\xe\xe0\x0\x1c\xc0\x1\x0\xf8\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xf8\x0\x0\x20\x0\x7\xf8\xc0\x1d\x8e\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x7\x0" "\x70\x0\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\x0\x7\x70\xfe\x77\x70\x7\x77\x70\xfe\x7\x0\x7\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\x0\x7\x70\x0\xe7\x7f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x70\xff\x77\x0\x7\x70\x70\xfe\x3\x0\xe0\x3\x7\x70\x0\x7\x70\xe0\x3f\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0" "\x0\x0\xe0\x3f\x7\x77\x70\xfe\x7\x70\x0\x77\x70\xfe\x3\x0\x7\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x0\x0\x7\x0\xe0\x3f\x70\x0\x7\x70\x0\x7\x70\x0\x7\xfe\x3\x0\x0\x0\x70\x0\x0\x70\x0\x7\x70\x0\x7\x70" "\x0\x77\x70\xfe\x3\x0\x7\x70\x0\x7\x77\x70\x7\x77\x38\xff\x71\x38\x7\x77\x70\x7\x7\x0\x0\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf0\x1\x0\x0\x0\x0\x0\xe0\x3f\x27\x77\x72\x27\x77\x72\x7\x77\x70\x7\x7\x0\x0\x0\x0\x0" "\xe0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x0\x0\x0\x0\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x0\x0\x0\x0\xe0\x7f\x7\x77\x70\x7\x77\x70\x7\xe7" "\x7f\x0\x7\x70\x0\x0\x0\x0\xe0\x3f\x7\x77\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\xe0\x3f\x7\x70\x0\xfe\x1\x70\x0\x7\x70\xfe\x3\x0\x0\x70\x0\x7\x70\x0\x7\xf0\x3\x7\x70\x0\x7\x77\x70\xfe\x3\x0\x0\x0\x0\x0\x70\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x7\x77\x70\x8e\xc3\x1d\xf8\x0\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x27\x77\x72\x27\x77\x72\xfe\x3\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\xfe\x73\x70\x7\x77\x70\x7" "\x7\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\xfe\x7\x70\x0\x77\x70\xfe\x3\x0\x0\x0\x0\x0\xf0\x7f\xc0\x3\x1e\xf0\x80\x7\x3c\xe0\x1\xff\x7\x0\xf0\x80\x3\x38\x80\x3\x70\xc0\xf\x70\x80\x3\x38\x80\x3\xf0\x0\x0\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x78\x0\xe\xe0\x0\xe\x70\x80\x1f\x70\x0\xe\xe0\x0\xe\x78\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x7\x70\x0\x7\x70\x0\xff\xf" "\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\x0\x0\x0\x0\x0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\xe\xe0\x0\xe\xe0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x1f\xf8\x80\xf\x70\x0\x7\x20\x0\x2\x0\x0\x0\x0\x0\x0\x20\x0\x2\x70\x0\x7\xf8\x80\xf\xfc\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" ), // Font no. 2 FontEntry("ATHENA_SPACED", 12, 12, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x80\xf\xf8\x80\xf\xf8\x0\x7\x70\x0\x0\x70\x0\x7\x0\x0\x0\xdc\xc1\x1d\x10\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x38\x8e\xf3\x7f\x8e\xe3\x38\x8e" "\xf3\x7f\x8e\xe3\x38\x0\x0\x0\x50\x0\x5\xfe\x73\x5\xfe\x3\x75\x50\xe7\x3f\x50\x0\x5\x0\x0\x0\x0\x0\x0\xe7\x70\xe\x70\x0\x7\x38\x80\x3\x1c\xc7\x71\x0\x0\x0\xfe\x70\x18\xcf\xe0\x7\x3c\x60\x27\xe3\x33\x1c\xc7\xe3\x77\x0\x0\x0\x70\x0" "\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x0\xf\x0\x0\x0\x78\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x80\x7\x0\x0\x0\x0\x0\x2\x70\x80\xf\xff\xe7\x3f\xfc\xc1\x1f" "\x8e\x33\x60\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\xf0\x7f\x70\x0\x7\x70\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x0\x0\x0\xc0\x1\x1c\xe0\x0\xe\x70\x0\x7\x38\x80\x3\x1c\xc0\x1\x0\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x70\x80\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\xe0" "\x3f\x0\x0\x0\xfe\x73\x70\x87\x3\x1c\xe0\x0\x7\x38\xc0\x1\xe\xf0\x7f\x0\x0\x0\xfe\x73\x70\x7\x7\x70\xe0\x3\x70\x0\x77\x70\x7\xe7\x3f\x0\x0\x0\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\xff\x77\x0\x7\x70\x0" "\xff\x3\x70\x0\x77\x70\x7\xe7\x3f\x0\x0\x0\xfe\x73\x0\x7\x70\x0\xff\x73\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\xff\x7\x70\x0\x7\x38\x80\x3\x7f\xc0\x1\xe\xe0\x0\x7\x0\x0\x0\xfe\x73\x70\x7\x77\x70\xfe\x73\x70\x7\x77\x70\x7\xe7\x3f\x0" "\x0\x0\xfe\x73\x70\x7\x77\x70\x7\xe7\x7f\x0\x7\x70\x0\xe7\x3f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x0\x0\x0\x70\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x0\x0\x0\x70\x0\x7\x40\x0\x0\x0\x0\x1c\xe0\x0\x7\x38\xc0" "\x1\x38\x0\x7\xe0\x0\x1c\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\x0\x0\x0\x0\xe0\x3f\x0\x0\x0\x0\x0\x0\x0\xc0\x1\x38\x0\x7\xe0\x0\x1c\xe0\x0\x7\x38\xc0\x1\x0\x0\x0\xfe\x73\x70\x0\x7\x70\xe0\x3\x7\x70\x0\x0\x70\x0\x7\x0\x0\x0" "\xfc\xe1\x38\x67\x77\x7b\x37\x77\x73\x37\x77\x3e\xe\xc0\x1f\x0\x0\x0\xfe\x73\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\xff\x73\x70\x7\x77\x70\xff\x73\x70\x7\x77\x70\x7\xf7\x3f\x0\x0\x0\xfe\x73\x70\x7\x70\x0\x7\x70\x0\x7" "\x70\x0\x7\xe7\x3f\x0\x0\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x87\xf3\x1f\x0\x0\x0\xff\x77\x0\x7\x70\x0\x7f\x70\x0\x7\x70\x0\x7\xf0\x7f\x0\x0\x0\xff\x77\x0\x7\x70\x0\x7f\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\xfe\x73" "\x70\x7\x70\x0\xc7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x7\x77\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\xf0\x7f\x0\x0\x0\xfe\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70" "\x7\xe7\x3f\x0\x0\x0\x7\x77\x70\x7\x77\x38\xff\x71\x38\x7\x77\x70\x7\x77\x70\x0\x0\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xf0\x7f\x0\x0\x0\x3\x76\x70\x8f\xf7\x7d\xff\x77\x77\x27\x77\x70\x7\x77\x70\x0\x0\x0\x3\x77\x70\xf" "\xf7\x71\x3f\x77\x77\xe7\x77\x7c\x87\x77\x70\x0\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\xff\x73\x70\x7\x77\x70\xff\x73\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x67\x77\x7e\xc7\xe7" "\x3b\x0\x3\x0\xff\x73\x70\x7\x77\x70\xff\x73\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\xfe\x73\x70\x7\x70\x0\xfe\x3\x70\x0\x7\x70\x7\xe7\x3f\x0\x0\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x7\x77\x70\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x8e\xc3\x1d\xf8\x0\x0\x7\x77\x70\x7\x77\x72\x77\xf7\x7f\xdf\xf7\x78\x7\x37\x60\x0\x0\x0\x7\x77\x70\x7\xe7\x38\xfc\xe1\x38\x7\x77\x70\x7\x77\x70\x0" "\x0\x0\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\x0\xc7\x3f\x0\x0\x0\xff\x7\x70\x80\x3\x1c\xe0\x0\x7\x38\xc0\x1\xe\xf0\x7f\x0\x0\x0\xf8\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\xf\x0\x0\x0\x1c\xc0\x1\x38\x80\x3\x70\x0" "\x7\xe0\x0\xe\xc0\x1\x1c\x0\x0\x0\xf8\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x80\xf\x0\x0\x0\x20\x0\x7\xf8\xc0\x1d\x8e\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\x0\x0\x0" "\x70\x0\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xfe\x3\x70\x0\xe7\x7f\x7\x77\x70\x7\xe7\x7f\x0\x0\x0\x7\x70\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x0\x0\x0\x0\x0\x0\xfe\x73\x70\x7\x70\x0\x7" "\x70\x0\x7\xe7\x3f\x0\x0\x0\x0\x7\x70\xfe\x77\x70\x7\x77\x70\x7\x77\x70\x7\xe7\x7f\x0\x0\x0\x0\x0\x0\xfe\x73\x70\x7\xf7\x7f\x7\x70\x0\x7\xe7\x3f\x0\x0\x0\xe0\x3\x7\x70\x0\x7\xfe\x3\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0" "\x0\xfe\x73\x70\x7\xe7\x7f\x0\x7\x70\x7\xe7\x3f\x0\x0\x0\x7\x70\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\x70\x0\x0\xfe\x3\x7\x70\x0\x7\x70\x0\x7\x70\xe0\x3f\x0\x0\x0\x0\x7\x0\x0\x7\x70\x0\x7\x70\x0\x7\x70" "\x7\xe7\x3f\x0\x0\x0\x7\x70\x70\x7\x77\x70\x87\xf3\x1f\x87\x73\x70\x7\x77\x70\x0\x0\x0\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x0\x1f\x0\x0\x0\x0\x0\x0\xfe\x73\x72\x27\x77\x72\x27\x77\x70\x7\x77\x70\x0\x0\x0\x0\x0\x0\xfe" "\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\x0\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x0\x0\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\xff\x73\x0\x7\x0\x0\x0\x0\x0\xfe\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7" "\x70\x0\x7\x0\x0\x0\x0\xfe\x73\x70\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\x0\x0\x0\xfe\x73\x0\x7\xe0\x1f\x0\x7\x70\x0\xe7\x3f\x0\x0\x0\x0\x70\x0\x7\x70\x0\x3f\x70\x0\x7\x70\x70\x7\xe7\x3f\x0\x0\x0\x0\x0\x0\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x0\x0\x0\x7\x77\x70\x7\x77\x70\x7\xe7\x38\xdc\x81\xf\x0\x0\x0\x0\x0\x0\x7\x77\x70\x7\x77\x72\x27\x77\x72\x27\xe7\x3f\x0\x0\x0\x0\x0\x0\x7\x77\x70\x7\xe7\x3f\x7\x77\x70\x7\x77\x70\x0" "\x0\x0\x0\x0\x0\x7\x77\x70\x7\xe7\x7f\x0\x7\x70\x7\xe7\x3f\x0\x0\x0\x0\x0\x0\xff\x7\x3c\xe0\x1\xf\x78\xc0\x3\x1e\xf0\x7f\x0\x0\x0\xf0\x80\x3\x38\x0\x7\xfc\x0\x7\x38\x80\x3\x38\x0\xf\x0\x0\x0\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x78\x0\xe\xe0\x0\x7\xf8\x1\x7\xe0\x0\xe\xe0\x80\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x7\x70\x0\x7\x70\x0\xff\xf" "\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\x0\x0\x0\x0\x0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\xe\xe0\x0\xe\xe0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x1f\xf8\x80\xf\x70\x0\x7\x20\x0\x2\x0\x0\x0\x0\x0\x0\x20\x0\x2\x70\x0\x7\xf8\x80\xf\xfc\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" ), // Font no. 3 FontEntry("DISORDERTRACKER2", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x57\x51\x73\x54\x57\x0\x0\x0\x77\x21\x23\x21\x21\x0\x0\x0\x0\x0\x0\x0\x18\x0\x0\x0\xec\x4a\x42\x4a\x4e\x0\x0\x0\x13\x15\x13\x15\x75\x0\x0\x0\x3c\x42\x99\x85\x99\x42\x3c\x0\x20\x50\x70\x50\x50\x0\x0\x0" "\x71\x21\x21\x21\x27\x0\x0\x0\xf3\x1b\x7b\xdb\xdb\xdb\x73\x0\xf\xf\xf\xf\xf\xf\xf\xf\x0\x0\x0\xff\x0\x0\x0\x0\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x0\x0\x0\x80\x41\x22\x14\x8" "\x0\x0\xf8\x8\x3e\x1c\x8\x0\xf\x7\xf\x5d\x78\x70\x78\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x0\x36\x7f\x36\x36\x7f\x36\x0\x8\x7e\xb\x3e\x68\x6b\x3e\x8\x0\x63\x33\x18\xc\x66\x63\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\xc\xc\x6\x0\x0\x0\x0\x0" "\xc\x6\x6\x6\x6\x6\xc\x0\x18\x30\x30\x30\x30\x30\x18\x0\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x3e\x63\x63\x6b\x63\x63\x3e\x0\x18\x1c\x18\x18\x18\x18\x3c\x0\x3e\x63\x60\x38\xe\x3\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x63\x63\x63\x7e\x60\x60\x60\x0\x7f\x3\x3\x3f\x60\x63\x3e\x0\x3e\x3\x3\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\x18\x18\x18\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x18\xc\x6\x3\x6\xc\x18\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3e\x63\x30\x18\x18\x0\x18\x0" "\x3e\x63\x7b\x7b\x3b\x3\x3e\x0\x3e\x63\x63\x7f\x63\x63\x63\x0\x3f\x63\x63\x3f\x63\x63\x3f\x0\x3e\x63\x3\x3\x3\x63\x3e\x0\x1f\x33\x63\x63\x63\x63\x3f\x0\x7f\x3\x3\x1f\x3\x3\x7f\x0\x7f\x3\x3\x1f\x3\x3\x3\x0\x7e\x3\x3\x7b\x63\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x1e\xc\xc\xc\xc\xc\x1e\x0\x7c\x60\x60\x60\x60\x63\x3e\x0\x63\x63\x3f\x33\x63\x63\x63\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x63\x63\x3f\x3\x3\x3\x0\x3e\x63\x63\x63\x63\x7b\x3e\x60\x3f\x63\x63\x3f\x63\x63\x63\x0\x3e\x63\x3\x3e\x60\x63\x3e\x0\x3f\xc\xc\xc\xc\xc\xc\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x63\x6b\x7f\x77\x63\x0" "\x63\x63\x36\x1c\x36\x63\x63\x0\x63\x63\x63\x7e\x60\x63\x3e\x0\x7f\x30\x18\xc\x6\x3\x7f\x0\x1e\x6\x6\x6\x6\x6\x1e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7c\x66\x7c\x0\x6\x6\x3e\x66\x66\x66\x3e\x0\x0\x0\x3c\x66\x6\x66\x3c\x0\x60\x60\x7c\x66\x66\x66\x7c\x0\x0\x0\x3c\x66\x7e\x6\x3c\x0\x0\x3c\x66\x6\x1e\x6\x6\x0\x0\x0\x7c\x66\x66\x7c\x60\x3e" "\x6\x6\x3e\x66\x66\x66\x66\x0\x18\x0\x18\x18\x18\x18\x18\x0\x30\x0\x30\x30\x30\x30\x33\x1e\x6\x6\x66\x36\x1e\x36\x66\x0\x18\x18\x18\x18\x18\x18\x18\x0\x0\x0\x3e\x6b\x6b\x6b\x63\x0\x0\x0\x3c\x66\x66\x66\x66\x0\x0\x0\x3c\x66\x66\x66\x3c\x0" "\x0\x0\x3e\x66\x66\x3e\x6\x6\x0\x0\x7c\x66\x66\x7c\x60\x60\x0\x0\x3e\x66\x6\x6\x6\x0\x0\x0\x7c\x6\x3c\x60\x3e\x0\x6\x6\x3e\x6\x6\x66\x3c\x0\x0\x0\x66\x66\x66\x66\x3c\x0\x0\x0\x66\x66\x66\x3c\x18\x0\x0\x0\x63\x63\x6b\x6b\x3e\x0" "\x0\x0\x66\x66\x3c\x66\x66\x0\x0\x0\x66\x66\x66\x7c\x60\x3e\x0\x0\x7e\x30\x18\xc\x7e\x0\x38\xc\xc\x7\xc\xc\x38\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\x3e\x63\x3\x63\x3e\x30\x60\x3e\x0\x33\x0\x33\x33\x33\x6e\x0\x38\x0\x1e\x33\x3f\x3\x1e\x0\x7e\x81\x3c\x60\x7c\x66\xdc\x0\x33\x0\x1e\x30\x3e\x33\x6e\x0\x7\x0\x1e\x30\x3e\x33\x6e\x0\xc\xc\x1e\x30\x3e\x33\x6e\x0\x0\x0\x3e\x63\x3\x1e\x30\x1c" "\x7e\x81\x3c\x66\x7e\x6\x3c\x0\x33\x0\x1e\x33\x3f\x3\x1e\x0\x7\x0\x1e\x33\x3f\x3\x1e\x0\x33\x0\xe\xc\xc\xc\x1e\x0\x3e\x41\x1c\x18\x18\x18\x3c\x0\x7\x0\xe\xc\xc\xc\x1e\x0\x63\x8\x3e\x63\x7f\x63\x63\x0\xc\xc\x0\x1e\x33\x3f\x33\x0" "\x38\x0\x3f\x6\x1e\x6\x3f\x0\x0\x0\xfe\x30\xfe\x33\xfe\x0\x7c\x36\x33\x7f\x33\x33\x73\x0\x1e\x21\x0\x1e\x33\x33\x1e\x0\x0\x33\x0\x1e\x33\x33\x1e\x0\x0\x7\x0\x1e\x33\x33\x1e\x0\x1e\x21\x0\x33\x33\x33\x6e\x0\x0\x7\x0\x33\x33\x33\x6e\x0" "\x0\x33\x0\x33\x33\x3e\x30\x1f\xc3\x18\x3c\x66\x66\x3c\x18\x0\x33\x0\x33\x33\x33\x33\x1e\x0\x18\x18\x7e\x3\x3\x7e\x18\x18\x1c\x36\x26\xf\x6\x67\x3f\x0\x33\x33\x1e\xc\x3f\xc\x3f\xc\x1f\x33\x33\x5f\x63\xf3\x63\xc3\x70\xd8\x18\x3c\x18\x18\x1b\xe" "\x38\x0\x1e\x30\x3e\x33\x6e\x0\x1c\x0\xe\xc\xc\xc\x1e\x0\x0\x38\x0\x1e\x33\x33\x1e\x0\x0\x38\x0\x33\x33\x33\x6e\x0\x0\x1f\x0\x1d\x33\x33\x33\x0\x3f\x0\x33\x37\x3f\x3b\x33\x0\x3c\x36\x36\x7c\x0\x7e\x0\x0\x1c\x36\x36\x1c\x0\x3e\x0\x0" "\x18\x0\x18\x18\xc\x66\x3c\x0\x0\x0\x0\x3f\x3\x3\x0\x0\x0\x0\x0\x3f\x30\x30\x0\x0\x63\x33\x1b\x6c\xd6\x43\x21\xf0\xc3\x63\x33\xdb\xec\xb6\xf3\xc0\x18\x0\x18\x18\x3c\x3c\x18\x0\x0\xcc\x66\x33\x66\xcc\x0\x0\x0\x33\x66\xcc\x66\x33\x0\x0" "\x44\x11\x44\x11\x44\x11\x44\x11\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xbb\xee\xbb\xee\xbb\xee\xbb\xee\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6c\x6c\x6f\x6c\x6c\x6c\x0\x0\x0\x0\x7f\x6c\x6c\x6c" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 4 FontEntry("DX-FUTUR", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x14\x14\x0\x0\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x3e\x63\x6\x73\x63\x63\x3e\x0\x30\x30\x18\x0\x0\x0\x0\x0" "\xc\x6\x6\x6\x6\x6\xc\x0\xc\x18\x18\x18\x18\x18\xc\x0\x0\x22\x14\x36\x14\x22\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\xc0\x60\x30\x18\xc\x6\x3\x0" "\x7e\x63\x73\x6b\x67\x63\x3f\x0\x1c\x18\x18\x18\x18\x18\x3c\x0\x3f\x60\x3e\x3\x3\x3\x7f\x0\x7f\x60\x38\x60\x60\x60\x3f\x0\x63\x63\x7f\x60\x60\x60\x60\x0\x7f\x3\x3f\x60\x60\x60\x3f\x0\x7e\x3\x7f\x63\x63\x63\x3f\x0\x7f\x60\x30\x18\x18\x18\x18\x0" "\x7e\x63\x3e\x63\x63\x63\x3f\x0\x3e\x63\x7e\x60\x60\x60\x60\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x7e\x63\x63\x38\x0\x18\x18\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x70\x78\x6c\x66\x63\x63\x6f\x0\x3f\x60\x3b\x63\x63\x63\x3f\x0\x7e\x0\x3\x3\x3\x3\x7e\x0\x1f\x30\x63\x63\x63\x63\x3f\x0\x7f\x0\xf\x3\x3\x3\x7f\x0\x7f\x0\xf\x3\x3\x3\x3\x0\x7e\x0\x7b\x63\x63\x63\x3e\x0" "\x63\x63\x7f\x63\x63\x63\x63\x0\x3c\x0\x18\x18\x18\x18\x3c\x0\x30\x30\x30\x30\x30\x30\x1f\x0\x43\x63\x33\x7b\x63\x63\x63\x0\x6\x6\x6\x6\x6\x6\x7e\x0\x3f\x60\x6b\x6b\x6b\x63\x63\x0\x3f\x60\x63\x63\x63\x63\x63\x0\x7e\x60\x63\x63\x63\x63\x3f\x0" "\x7e\x60\x3e\x6\x6\x6\x6\x0\x7e\x63\x63\x63\x63\x3\x7f\x0\x7f\x60\x3f\x33\x63\x63\x63\x0\x7e\x3\x7f\x60\x60\x60\x3f\x0\x7e\x0\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x3\x7e\x0\x63\x63\x63\x63\x33\x1b\xf\x0\x63\x63\x6b\x6b\x6b\x63\x3f\x0" "\x63\x36\x1c\x0\x1c\x36\x63\x0\x63\x63\x3f\x0\xc\xc\xc\x0\x7f\x0\x30\x18\xc\x6\x7f\x0\x3c\xc\xc\xc\xc\xc\x3c\x0\x3\x6\xc\x18\x30\x60\xc0\x0\x3c\x30\x30\x30\x30\x30\x3c\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x7f\x60\x6e\x63\x3f\x0\x3\x3\x7b\x63\x63\x63\x3e\x0\x0\x0\x7e\x3\x3\x3\x7e\x0\x60\x60\x6e\x63\x63\x63\x3f\x0\x0\x0\x7e\x63\x3b\x3\x7f\x0\x3c\x0\x1e\x6\x6\x6\x6\x0\x0\x0\x7e\x63\x63\x6f\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x18\x18\x18\x18\x18\x0\x30\x0\x30\x30\x30\x30\x30\x1f\x3\x3\x63\x33\x7b\x63\x63\x0\x1c\x18\x18\x18\x18\x18\x18\x0\x0\x0\x3f\x63\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x7e\x63\x63\x63\x3f\x0" "\x0\x0\x7e\x63\x63\x3b\x3\x3\x0\x0\x7e\x63\x63\x6f\x60\x60\x0\x0\x7c\x6\x6\x6\x6\x0\x0\x0\x7e\x3\x7f\x60\x3f\x0\xc\x0\x3c\xc\xc\xc\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x33\x1f\x0\x0\x0\x63\x6b\x6b\x63\x3f\x0" "\x0\x0\x63\x36\x14\x36\x63\x0\x0\x0\x63\x63\x63\x6f\x60\x3f\x0\x0\x7f\x0\xc\x6\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\x5a\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x1f\x31\x31\x31\x3f\x3e\x0\x0\x3e\x62\x62\x62\x7e\x7c\x0\x0\x7c\xc4\xc4\xc4\xfc\xf8\x0\x0\xf8\x88\x88\x88\xf8\xf0\x0\x0\xf0\x10\x10\x10\xf0\xe0\x0" "\x0\xe0\x20\x20\x20\xe0\xc0\x0\x0\xc0\x40\x40\x40\xc0\x80\x0\x0\x80\x80\x80\x80\x80\x0\x0\x0\x0\x1\x1\x1\x1\x1\x0\x0\x1\x3\x3\x3\x3\x3\x0\x0\x3\x6\x6\x6\x7\x7\x0\x0\x7\xc\xc\xc\xf\xf\x0\x0\xf\x18\x18\x18\x1f\x1f\x0" "\x18\x18\x18\x18\x18\x18\x18\x18\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x8\x0\x0\x0\x0\x2\x2\x2\x2\x2\x2\x2\x0\x12\x12\x12\x12\x12\x12\x12" "\x0\x92\x92\x92\x92\x92\x92\x92\x0\x4\x4\x4\x4\x4\x4\x4\x0\x24\x24\x24\x24\x24\x24\x24\x0\x24\x24\x24\x24\x24\x24\x24\x0\x1\x1\x1\x1\x1\x1\x1\x0\x9\x9\x9\x9\x9\x9\x9\x0\x49\x49\x49\x49\x49\x49\x49\x0\x0\x0\x18\x18\x0\x0\x0" "\x0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x70\x88\x4\x0\x0\x0\x0\x0\x0\x20\x11\xe\x0\x0\x0\x3e\x22\x22\x22\x22\xe3\x0\x0\x3e\x22\x22\x22\x22\x63\x0\x0\xc\x34\xc4\x4\x4\x4\x0\x0\x20\x20\x20\x23\x2c\x30\x0\x0\x60\x20\x20\x20\x20\x60\x0" "\x0\x3\x2\x2\x2\x2\x3\x0\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0" "\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 5 FontEntry("EK-MAC", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x41\x55\x41\x5d\x22\x1c\x0\x3e\x49\x49\x7f\x5d\x22\x1c\x0\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x1c\x6b\x7f\x6b\x8\x1c\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x18\x3c\x3c\x3c\x18\x0\x0" "\x7e\x66\x42\x42\x42\x66\x7e\x0\x0\x18\x24\x24\x24\x18\x0\x0\x7e\x66\x5a\x5a\x5a\x66\x7e\x0\x70\x60\x50\x3c\x66\x66\x3c\x0\x3c\x66\x66\x3c\x18\x7e\x18\x0\x30\x30\x30\x30\x30\x1c\xc\x0\x7c\x6c\x6c\x6c\x67\x3b\x18\x0\x80\xaa\x94\xaa\x94\xaa\x80\xff" "\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x30\x3c\x3f\x3c\x30\x0\x0\x8\x3e\x8\x3e\x8\x8\x0\x0\x66\x66\x66\x66\x66\x0\x66\x0\x7c\x5a\x5a\x5a\x5c\x58\x58\x0\x3c\x46\x3e\x66\x7c\x62\x3c\x0\x0\x0\x0\x7e\x7e\x0\x0\x0\x8\x1c\x3e\x0\x3e\x1c\x8\x7f" "\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0\x0\x8\x18\x38\x78\x38\x18\x8\x0\x10\x18\x1c\x1e\x1c\x18\x10\x0\x0\x0\x0\x6\x6\x6\x7e\x0\x0\x14\x36\x77\x36\x14\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x36\x36\x14\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x0\x0\x18\x3c\x46\x3c\x62\x3c\x18\x0\x4\x6a\x34\x18\x2c\x56\x20\x0\x1c\x36\x1c\x26\x66\x66\x7c\x0\x18\x10\x8\x0\x0\x0\x0\x0" "\x30\x18\x18\x18\x18\x18\x30\x0\xc\x18\x18\x18\x18\x18\xc\x0\x18\x5a\x3c\x5a\x18\x0\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x60\x30\x18\xc\x6\x0\x0" "\x3c\x66\x66\x66\x66\x66\x3c\x0\x18\x1c\x18\x18\x18\x18\x18\x0\x3c\x66\x60\x30\x18\xc\x7e\x0\x3c\x66\x60\x38\x60\x66\x3c\x0\x70\x78\x6c\x66\x7e\x60\x60\x0\x7e\x6\x3e\x60\x60\x66\x3c\x0\x3c\x66\x6\x3e\x66\x66\x3c\x0\x7e\x60\x30\x18\x18\x18\x18\x0" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x3c\x66\x66\x7c\x60\x66\x3c\x0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x10\x8\x0\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3c\x66\x60\x30\x18\x0\x18\x0" "\x3c\x62\x6a\x6a\x7a\x2\x3c\x0\x3c\x66\x66\x66\x7e\x66\x66\x0\x3e\x66\x66\x3e\x66\x66\x3e\x0\x3c\x66\x6\x6\x6\x66\x3c\x0\x3e\x66\x66\x66\x66\x66\x3e\x0\x7e\x6\x6\x1e\x6\x6\x7e\x0\x7e\x6\x6\x1e\x6\x6\x6\x0\x3c\x66\x6\x76\x66\x66\x3c\x0" "\x66\x66\x66\x7e\x66\x66\x66\x0\x18\x18\x18\x18\x18\x18\x18\x0\x60\x60\x60\x60\x60\x66\x3c\x0\x66\x66\x66\x3e\x66\x66\x66\x0\x6\x6\x6\x6\x6\x6\x3e\x0\x3f\x6b\x6b\x6b\x6b\x6b\x6b\x0\x3e\x66\x66\x66\x66\x66\x66\x0\x3c\x66\x66\x66\x66\x66\x3c\x0" "\x3e\x66\x66\x66\x3e\x6\x6\x0\x3c\x66\x66\x66\x66\x36\x6c\x0\x3e\x66\x66\x3e\x66\x66\x66\x0\x3c\x66\x6\x3c\x60\x66\x3c\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x66\x66\x66\x66\x66\x66\x3c\x0\x66\x66\x66\x66\x66\x26\x1e\x0\x6b\x6b\x6b\x6b\x6b\x6b\x3f\x0" "\x66\x66\x66\x3c\x66\x66\x66\x0\x66\x66\x66\x3c\x18\x18\x18\x0\x7e\x60\x30\x18\xc\x6\x7e\x0\x78\x18\x18\x18\x18\x18\x18\x78\x0\x6\xc\x18\x30\x60\x0\x0\x1e\x18\x18\x18\x18\x18\x18\x1e\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7e" "\x18\x8\x10\x0\x0\x0\x0\x0\x0\x0\x3c\x62\x7c\x66\x7c\x0\x6\x6\x3e\x66\x66\x66\x3e\x0\x0\x0\x3c\x66\x6\x66\x3c\x0\x60\x60\x7c\x66\x66\x66\x7c\x0\x0\x0\x3c\x66\x7e\x6\x3c\x0\x38\x4c\x1e\xc\xc\xc\xc\x0\x0\x0\x7c\x66\x66\x7c\x62\x3c" "\x6\x6\x3e\x66\x66\x66\x66\x0\x18\x0\x1c\x18\x18\x18\x18\x0\x30\x0\x38\x30\x30\x30\x32\x1c\x6\x6\x66\x66\x3e\x66\x66\x0\x1c\x18\x18\x18\x18\x18\x18\x0\x0\x0\x3f\x6b\x6b\x6b\x6b\x0\x0\x0\x3e\x66\x66\x66\x66\x0\x0\x0\x3c\x66\x66\x66\x3c\x0" "\x0\x0\x3e\x66\x66\x66\x3e\x6\x0\x0\x7c\x66\x66\x66\x7c\x60\x0\x0\x3e\x66\x66\x6\x6\x0\x0\x0\x3c\x46\x3c\x62\x3c\x0\x0\x18\x3c\x18\x18\x18\x30\x0\x0\x0\x66\x66\x66\x66\x3c\x0\x0\x0\x66\x66\x66\x26\x1e\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x66\x66\x3c\x66\x66\x0\x0\x0\x66\x66\x66\x7c\x62\x3c\x0\x0\x7e\x30\x18\xc\x7e\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\xc\x18\x18\x30\x18\x18\xc\x0\xc\x5a\x30\x0\x0\x0\x0\x0\x0\x0\x18\x24\x66\x7e\x0\x0" "\xfe\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\x7f\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xfe\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x7f" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xfc\xfe\x7\xf3\xb\xb\xb\xb\xff\xff\x0\xff\x0\x0\x0\x0" "\x3f\x7f\xe0\xcf\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xb\xb\xb\xb\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xf3\x7\xfe\xfc\x0\x0\x0\x0\xff\x0\xff\xff\xd0\xd0\xd0\xd0\xcf\xe0\x7f\x3f\xb\x9\x4\x3\x0\x0\x0\x0\xd0\x90\x20\xc0\x0\x0\x0\x0" "\x0\x0\x0\x0\x3\x4\x9\xb\x0\x0\x0\x0\xc0\x20\x90\xd0\x0\x0\x0\xaa\x0\x0\x0\x0\x0\x3f\x7e\x3f\x7e\x3f\x7e\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\x7e\xfc\x7e\xfc\x7e\xfc\x0\x0\xfe\xf0\xfe\xf0\xfe\xf0\x0\x0\xfe\xe0\xfe\xe0\xfe\xe0\x0" "\x0\xfc\xc0\xfc\xc0\xfc\xc0\x0\x0\xf0\x80\xf0\x80\xf0\x80\x0\x0\xc0\x0\xc0\x0\xc0\x0\x0\x0\x0\x3\x0\x3\x0\x3\x0\x0\x1\xf\x1\xf\x1\xf\x0\x0\x3\x3f\x3\x3f\x3\x3f\x0\x0\x7\x7f\x7\x7f\x7\x7f\x0\x0\xf\x7f\xf\x7f\xf\x7f\x0" "\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\xff\xff\x0\xff\x0\x18\x3c\x0\xff\xff\x0\xff\x0\x0\x0\x7e\xff\xff\x0\xff\x0\x18\x3c\x7e\xff\xff\x0\xff\x0\x3e\x56\x56\x0\x0\x0\x18\x18\x0\x0\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0" "\x0\xff\xff\xff\xff\xff\xff\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\xff\xff\xff\xff\xff\xff\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0\x0\xff\xff\xff\xff\xff\xff\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0" "\x0\x0\x0\xf\x18\x1f\x18\x18\x6c\x6c\x6c\x67\x60\x67\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x3f\x60\x67\x6c\x6c\x6c\x6c\x6c\x67\x60\x3f\x0\x0\x6c\x6c\x6c\x3f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\xf\x0\x0\x0\x0\x0\xf\x18\x18\x18\x18" "\x18\x18\x18\xf0\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xcc\xc\xf8\x0\x0\x0\x0\x0\xf8\xc\xcc\x6c\x6c\x6c\x6c\x6c\xc7\x0\xff\x0\x0\x0\x0\x0\xff\x0\xc7\x6c\x6c\x6c\x6c\x6c\xcc\xc\xcc\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xc7\x0\xc7\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xf8\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf0\x0\x0\x0\x0\x0\xf0\x18\xf8\x18\x18\x0\x0\x0\xf8\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\xf\x0\x0\x0\x0\x0\x0\x0\xf0\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x0\x6c\x36\x36\x6c\x0\x3c\x66\x66\x36\x66\x66\x36\x6\x3c\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7e\x6\xc\x18\xc\x6\x7e\x0\x0\x0\xfc\x66\x66\x66\x3c\x0\x0\x0\x66\x66\x66\x66\x3e\x3\x0\x0\x3c\x18\x18\x18\x30\x0" "\x0\x18\x3c\x66\x66\x66\x3c\x18\x38\x64\x66\x7e\x66\x26\x1c\x0\x3c\x66\x66\x66\x24\x24\x66\x0\x70\x98\x3c\x66\x66\x66\x3c\x0\x0\x0\x36\x6b\x6b\x36\x0\x0\x0\x60\x3c\x66\x66\x66\x3c\x6\x0\x0\x7c\x6\x7e\x6\x7c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 6 FontEntry("EK-SPACE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x41\x55\x41\x5d\x22\x1c\x0\x3e\x49\x49\x7f\x5d\x22\x1c\x0\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x1c\x6b\x7f\x6b\x8\x1c\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x1c\x3e\x3e\x3e\x1c\x0\x0" "\x7f\x63\x41\x41\x41\x63\x7f\x0\x0\x1c\x22\x22\x22\x1c\x0\x0\x7f\x63\x5d\x5d\x5d\x63\x7f\x0\x70\x60\x50\x3e\x63\x63\x3e\x0\x3e\x63\x63\x3e\x8\x3e\x8\x0\x30\x30\x30\x30\x30\x1c\xc\x0\x7c\x6c\x6c\x6c\x67\x3b\x18\x0\x80\xaa\x94\xaa\x94\xaa\x80\xff" "\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x30\x3c\x3f\x3c\x30\x0\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\x7e\x6b\x6b\x6b\x6e\x68\x68\x0\x7e\x3\x3f\x63\x7e\x60\x3f\x0\x0\x0\x0\x7e\x7e\x0\x0\x0\x8\x1c\x3e\x0\x3e\x1c\x8\x7f" "\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0\x0\x8\x18\x38\x78\x38\x18\x8\x0\x10\x18\x1c\x1e\x1c\x18\x10\x0\x0\x0\x0\x3\x3\x3\x7e\x0\x0\x14\x36\x77\x36\x14\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x36\x36\x14\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x6b\xb\x3e\x68\x6b\x3e\x0\x4c\x6a\x36\x18\x6c\x56\x32\x0\x1c\x36\x1c\x26\x63\x63\x7e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x60\x30\x18\xc\x6\x0\x0" "\x3e\x63\x63\x6b\x63\x63\x3e\x0\x18\x1c\x18\x18\x18\x18\x7e\x0\x3e\x63\x60\x38\xe\x3\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x66\x63\x7f\x60\x0\x7f\x3\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x30\x18\x3e\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x18\x8\x0\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x3e\x0\x3e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3c\x62\x60\x30\x18\x0\x18\x0" "\x3c\x62\x6b\x6b\x7b\x3\x3e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x63\x63\x3f\x63\x63\x3f\x0\x3e\x63\x3\x3\x3\x63\x3e\x0\x3f\x63\x63\x63\x63\x63\x3f\x0\x7f\x3\x3\x1f\x3\x3\x7f\x0\x7f\x3\x3\x1f\x3\x3\x3\x0\x3e\x63\x3\x7b\x63\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x78\x60\x60\x60\x60\x63\x3e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x6\x6\x6\x6\x6\x6\x7e\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x63\x63\x63\x3f\x3\x3\x0\x3e\x63\x63\x63\x6b\x33\x6e\x60\x3f\x63\x63\x63\x3f\x63\x63\x0\x3e\x63\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x63\x36\x1c\x36\x63\x63\x0\x66\x66\x66\x3c\x18\x18\x18\x0\x7f\x30\x18\x3e\xc\x6\x7f\x0\x78\x18\x18\x18\x18\x18\x18\x78\x0\x6\xc\x18\x30\x60\x0\x0\x1e\x18\x18\x18\x18\x18\x18\x1e\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x18\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x46\x6\x3f\x6\x6\x6\x0\x0\x0\x3e\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x18\x0\x30\x0\x38\x30\x30\x30\x31\x1e\x3\x3\x63\x3b\xf\x3b\x63\x0\x1c\x18\x18\x18\x18\x18\x18\x0\x0\x0\x36\x7f\x6b\x6b\x63\x0\x0\x0\x3e\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3e\x63\x63\x63\x3f\x3\x0\x0\x3e\x63\x63\x63\x7e\x60\x0\x0\x3e\x63\x63\x3\x3\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\xc\xc\x3e\xc\xc\xc\x38\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x22\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3e\x0\x0\x7f\x30\x1c\x6\x7f\x0\x38\xc\xc\x6\xc\xc\x38\x0\x18\x18\x18\x18\x18\x18\x18\x18\xe\x18\x18\x30\x18\x18\xe\x0\xe\x99\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xfe\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\x7f\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xfe\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x7f" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x1\x2\x2\x4\x8\x30\xc0\x3\xc\x10\x20\x40\x40\x80\x80\xf0\xfc\xe\x6\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xf\x3f\x70\x60\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x6\xe\xfc\xf0\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\x60\x70\x3f\xf\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x55\xaa\x0\x0\x0\x0\x38\x7e\x7f\x7f\x7f\x3e\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x1c\x7e\xfe\xfe\xfe\x7c\x0\x0\x0\x38\x7e\xfe\xfe\xfc\x0\x0\x0\x0\x0\x1e\xfe\xfc\x0" "\x0\x0\x0\x0\x0\xe\xfc\x0\x0\x0\x0\x0\x0\x80\xe0\x0\x0\x0\x0\x0\x0\x80\xc0\x0\x0\x0\x0\x0\x0\x1\x3\x0\x0\x0\x0\x0\x0\x1\x7\x0\x0\x0\x0\x0\x0\x70\x3f\x0\x0\x0\x0\x0\x78\x7f\x3f\x0\x0\x0\x1c\x7e\x7f\x7f\x3f\x0" "\x14\x2a\x14\x2a\x14\x2a\x14\x2a\xff\xff\x0\x0\x8\x1c\x3e\x0\xff\xff\x0\x0\x0\x0\x0\x2a\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\x36\x7f\x6b\x6b\x6b\x0\x0\x0\x18\x18\x0\x0\x0\x0\x6\x3\x3\x3\x3\x1\x0\x0\xe\x1b\x1b\x1b\x1b\x31\x0" "\x0\x8e\xdb\xdb\xdb\xdb\x71\x0\x0\x3\x6\x6\x6\x6\xc\x0\x0\x63\x36\x36\x36\x36\x1c\x0\x0\xe3\xb6\xb6\xb6\xb6\x1c\x0\x0\x0\x1\x1\x1\x1\x3\x0\x0\x18\xd\xd\xd\xd\x7\x0\x0\x38\x6d\x6d\x6d\x6d\xc7\x0\x0\x1c\x3e\x3e\x3e\x1c\x0\x0" "\x0\x0\x0\xf\x18\x1f\x18\x18\x6c\x6c\x6c\x67\x60\x67\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x3f\x60\x67\x6c\x6c\x6c\x6c\x6c\x67\x60\x3f\x0\x0\x6c\x6c\x6c\x3f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\xf\x0\x0\x0\x0\x0\xf\x18\x18\x18\x18" "\x18\x18\x18\xf0\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xcc\xc\xf8\x0\x0\x0\x0\x0\xf8\xc\xcc\x6c\x6c\x6c\x6c\x6c\xc7\x0\xff\x0\x0\x0\x0\x0\xff\x0\xc7\x6c\x6c\x6c\x6c\x6c\xcc\xc\xcc\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xc7\x0\xc7\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xf8\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf0\x0\x0\x0\x0\x0\xf0\x18\xf8\x18\x18\x0\x0\x0\xf8\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\xf\x0\x0\x0\x0\x0\x0\x0\xf0\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x0\x6e\x33\x33\x6e\x0\x3c\x66\x63\x3b\x63\x63\x3b\x3\x3c\x46\x6\x6\x6\x6\x6\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3c\x46\xc\x18\xc\x46\x3c\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\x66\x66\x66\x66\x3e\x3\x0\x0\x3e\xc\xc\xc\x18\x0" "\x0\x8\x3e\x6b\x6b\x6b\x3e\x8\x3c\x66\x63\x7f\x63\x33\x1e\x0\x3e\x63\x63\x63\x36\x36\x63\x0\x70\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x36\x6b\x6b\x36\x0\x0\x0\x0\x5e\x33\x6b\x66\x3d\x0\x0\x0\x7e\x3\x7f\x3\x7e\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 7 FontEntry("FINELINE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x42\x42\x42\x3c\x0\xff\xc3\xbd\xbd\xbd\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x1e\x21\x21\x21\x21\x21\x1e\x0\x8\xc\x8\x8\x8\x8\x1c\x0\x1e\x21\x10\x8\x4\x2\x3f\x0\x3e\x41\x40\x3c\x40\x41\x3e\x0\x30\x28\x24\x22\x7f\x20\x20\x0\x7f\x1\x1\x3f\x40\x40\x3f\x0\x3e\x41\x1\x3f\x41\x41\x3e\x0\x7f\x20\x10\x8\x8\x8\x8\x0" "\x3e\x41\x41\x3e\x41\x41\x3e\x0\x3e\x41\x41\x7e\x40\x41\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x0\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x1c\x22\x41\x41\x7f\x41\x41\x0\x3f\x41\x41\x3f\x41\x41\x3f\x0\x3e\x41\x1\x1\x41\x41\x3e\x0\x3f\x41\x41\x41\x41\x41\x3f\x0\x7f\x1\x1\x1f\x1\x1\x7f\x0\x7f\x1\x1\x1f\x1\x1\x1\x0\x3e\x41\x1\x79\x41\x61\x5e\x0" "\x41\x41\x41\x7f\x41\x41\x41\x0\x3e\x8\x8\x8\x8\x8\x3e\x0\x78\x20\x20\x20\x20\x21\x1e\x0\x21\x11\x9\x7\x9\x11\x21\x0\x2\x2\x2\x2\x2\x2\x7e\x0\x63\x55\x55\x49\x49\x41\x41\x0\x41\x43\x45\x49\x51\x61\x41\x0\x3e\x41\x41\x41\x41\x41\x3e\x0" "\x3f\x42\x42\x3e\x2\x2\x7\x0\x3e\x41\x41\x49\x51\x61\x3e\x40\x1f\x21\x21\x1f\x11\x21\x21\x40\x3e\x41\x1\x3e\x40\x41\x3e\x0\x7f\x8\x8\x8\x8\x8\x8\x0\x41\x41\x41\x41\x41\x41\x3e\x0\x41\x41\x41\x41\x41\x22\x1c\x0\x41\x49\x49\x49\x55\x63\x41\x0" "\x41\x22\x14\x8\x14\x22\x41\x0\x41\x22\x14\x8\x8\x8\x8\x0\x7f\x20\x10\x8\x4\x2\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x40\x7e\x41\x7e\x0\x1\x1\x3f\x41\x41\x41\x3f\x0\x0\x0\x3e\x41\x1\x41\x3e\x0\x40\x40\x7e\x41\x41\x41\x7e\x0\x0\x0\x3e\x41\x7f\x1\x3e\x0\x3c\x42\x2\x3f\x2\x2\x2\x0\x0\x0\xbe\x41\x41\x7e\x40\x3e" "\x1\x1\x3f\x41\x41\x41\x41\x0\xc\x0\x8\x8\x8\x8\x1c\x0\x20\x0\x30\x20\x20\x20\x21\x1e\x1\x1\x31\x9\x7\x9\x31\x0\x8\x8\x8\x8\x8\x8\x18\x0\x0\x0\x63\x55\x49\x49\x41\x0\x0\x0\x3f\x41\x41\x41\x41\x0\x0\x0\x3e\x41\x41\x41\x3e\x0" "\x0\x0\x3f\x41\x41\x3f\x1\x1\x0\x0\x7e\x41\x41\x7e\x40\xc0\x0\x0\x39\x66\x2\x2\x2\x0\x0\x0\x7e\x1\x3e\x40\x3f\x0\x8\x8\x3e\x8\x8\x8\x18\x0\x0\x0\x41\x41\x41\x41\x7e\x0\x0\x0\x41\x41\x41\x22\x1c\x0\x0\x0\x41\x49\x55\x63\x41\x0" "\x0\x0\x22\x14\x8\x14\x22\x0\x0\x0\x41\x41\x41\x7e\x40\x3f\x0\x0\x7f\x10\x8\x4\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x1e\x33\x2d\x2d\x33\x1e\x0\x0\x3c\x66\x5a\x5a\x66\x3c\x0\x0\x78\xcc\xb4\xb4\xcc\x78\x0\x0\xf0\x98\x68\x68\x98\xf0\x0\x0\xe0\x30\xd0\xd0\x30\xe0\x0" "\x0\xc0\x60\xa0\xa0\x60\xc0\x0\x0\x80\xc0\x40\x40\xc0\x80\x0\x0\x0\x80\x80\x80\x80\x0\x0\x0\x0\x1\x1\x1\x1\x0\x0\x0\x1\x3\x2\x2\x3\x1\x0\x0\x3\x6\x5\x5\x6\x3\x0\x0\x7\xc\xb\xb\xc\x7\x0\x0\xf\x19\x16\x16\x19\xf\x0" "\x36\x2a\x36\x2a\x36\x2a\x36\x2a\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x10\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 8 FontEntry("FN-ICE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x4\xc\x1c\x1c\x1c\x0\x1c\x0\x36\x36\x14\x0\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x0\x8\x3c\x6a\xc\x38\x6a\x3c\x8\x0\x7a\x25\x12\x8\x24\x52\x20\x10\x0\x18\x24\x4\x18\x0\x8\xc\xc\x6\x0\x0\x0\x0\x0" "\x30\x18\xc\xc\xc\xc\x18\x30\xc\x18\x30\x30\x30\x30\x18\xc\x0\x41\x36\x1c\x3e\x5d\x8\x8\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x40\x60\x30\x18\xc\x6\x2\x0" "\x3e\x63\x63\x63\x63\x63\x3e\x0\x8\x8\xc\xe\xc\xc\x1e\x0\x1e\x23\x31\x18\x6\x23\x3f\x0\x1e\x23\x20\x1c\x20\x23\x1e\x0\x23\x23\x23\x23\x3e\x20\x20\x0\x3f\x3\x3\x3f\x20\x21\x1e\x0\x3e\x3\x3\x1f\x23\x23\x1e\x0\x3f\x23\x20\x10\x8\xc\xc\x0" "\x1e\x23\x23\x1e\x23\x23\x1e\x0\x1e\x23\x23\x3e\x20\x23\x1e\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x0\x60\x30\x18\xc\x18\x30\x60\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x3e\x47\x20\x10\x18\x0\x18\x0" "\x3e\x41\x5d\x45\x5d\x41\x3e\x0\x7\xf\x1b\x33\x3f\x33\x33\x0\xf\x1b\x33\x7f\x33\x63\x3f\x0\x7\xf\x1b\x33\x3\x3\x3f\x0\x7\xf\x1b\x33\x63\x63\x3f\x0\x7\xf\x1b\x33\xf\x3\x3f\x0\x7\xf\x1b\x33\xf\x3\x3\x0\xf\x1f\x33\x23\x1b\x23\x3f\x0" "\x3\x3\x13\x33\x3f\x33\x33\x0\x8\x18\x18\x18\x18\x18\x18\x0\x20\x30\x30\x30\x33\x33\x3e\x0\x3\x1b\x33\x33\xf\x33\x33\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x3\x17\x3b\x33\x33\x33\x33\x0\x6\xf\x1b\x33\x63\x63\x3e\x0" "\x7\xf\x1b\x33\x3f\x3\x3\x0\xe\x1b\x33\x63\x63\x33\x6e\x0\x7\xf\x1b\x33\x1f\x33\x33\x0\x7\xf\x1b\x3\x1e\x20\x1f\x0\x3\x6\xc\x1c\x2c\xc\xc\x0\x3\x3\x23\x63\x63\x63\x3e\x0\x3\x3\x23\x63\x36\x1c\x8\x0\x3\x3\x23\x6b\x6b\x6b\x3e\x0" "\x22\x63\x36\x8\x36\x63\x22\x0\x3\x13\x33\x36\x3c\x20\x1f\x0\x6\xd\x18\x18\xc\x6\x3f\x0\x38\xc\xc\xc\xc\xc\xc\x38\x2\x6\xc\x18\x30\x60\x40\x0\x1c\x30\x30\x30\x30\x30\x30\x1c\x8\x1c\x36\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x33\x33\x6e\x0\x1\x3\x3\x1f\x33\x33\x1f\x0\x0\x0\x0\x1e\x33\x3\x3e\x0\x30\x30\x30\x3e\x33\x33\x3e\x0\x0\x0\x0\x1e\x33\xf\x3e\x0\x1c\x36\x6\x6\x1f\x6\x6\x0\x0\x0\x0\x1e\x33\x3e\x31\x1e" "\x3\x3\x3\x1f\x33\x33\x33\x0\x0\xc\x0\xc\xc\xc\xc\x0\x0\x30\x0\x30\x30\x33\x33\x1e\x3\x3\x33\x1b\xf\x1b\x33\x0\xe\xc\xc\xc\xc\xc\xc\x0\x0\x0\x0\x37\x7f\x6b\x63\x0\x0\x0\x0\x1d\x33\x33\x33\x0\x0\x0\x0\x1e\x33\x33\x1e\x0" "\x0\x0\x0\x3b\x66\x3e\x6\xf\x0\x0\x0\x6e\x33\x3e\x30\x78\x0\x0\x0\x3c\x66\x6\x6\x0\x0\x0\x0\x3e\x7\x38\x1f\x0\x0\x8\xc\x3f\xc\x6c\x38\x0\x0\x0\x0\x33\x33\x33\x6e\x0\x0\x0\x0\x33\x33\x1e\xc\x0\x0\x0\x0\x6b\x6b\x7f\x36\x0" "\x0\x0\x0\x77\x18\xc\x77\x0\x0\x0\x0\x33\x33\x3e\x30\x1f\x0\x0\x0\x7f\x30\xe\x7f\x0\x38\xc\xc\x7\xc\xc\x38\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\xaa\x55\x55\xaa\x0\x0\x0\x0\xe\x7f\xff\x7f\xe\x0\x0\x0\x3c\x7e\xff\x7e\x3c\x0\x0\x0\x70\xfe\xff\xfe\x70\x0\x0\x0\xe0\xfc\xfe\xfc\xe0\x0\x0\x0\x0\xf0\xfc\xf0\x0\x0" "\x0\x0\x0\xc0\xf8\xc0\x0\x0\x0\x0\x0\x80\xf0\x80\x0\x0\x0\x0\x0\x80\xe0\x80\x0\x0\x0\x0\x0\x1\x7\x1\x0\x0\x0\x0\x0\x1\xf\x1\x0\x0\x0\x0\x0\x3\x1f\x3\x0\x0\x0\x0\x0\xf\x3f\xf\x0\x0\x0\x0\x7\x3f\x7f\x3f\x7\x0" "\x24\x18\x24\x18\x24\x18\x24\x18\xff\xff\x3e\x1c\x8\x8\x0\x0\xff\xff\x1c\x8\x8\x0\x0\x0\xff\xff\x3e\x3e\x1c\x1c\x8\x8\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x1\x3\x3\x3\x0\x0\x0\x1\x3\xb\x1b\x7\x6\x0" "\x0\xbb\xbb\x77\x77\x77\xee\xee\x0\x0\x1\x3\x7\x3\x1\x0\x0\x1\xb\x17\x37\x17\x6\x2\x0\xbb\xbb\x77\x77\x77\xee\xee\x0\x0\x1\x1\x1\x1\x0\x0\x0\x0\x3\x3\xf\x7\x2\x0\x0\xbb\xbb\x77\x77\x77\xee\xee\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 9 FontEntry("FN-LOWER", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x18\x7e\x3\x3e\x60\x3f\x18\x0\x0\x63\x33\x18\xc\x66\x63\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\xc\xc\x6\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x0\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x3e\x73\x7b\x6f\x67\x63\x3e\x0\xc\xe\xc\xc\xc\xc\x3f\x0\x1e\x33\x30\x1c\x6\x33\x3f\x0\x1e\x33\x30\x1c\x30\x33\x1e\x0\x38\x3c\x36\x33\x7f\x30\x78\x0\x3f\x3\x1f\x30\x30\x33\x1e\x0\x1c\x6\x3\x1f\x33\x33\x1e\x0\x3f\x33\x30\x18\xc\xc\xc\x0" "\x1e\x33\x33\x1e\x33\x33\x1e\x0\x1e\x33\x33\x3e\x30\x18\xe\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x18\xc\x6\x3\x6\xc\x18\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3c\x66\x30\x18\x18\x0\x18\x0" "\x3e\x63\x7b\x7b\x3b\x3\x3e\x0\x0\x0\x1e\x30\x3e\x33\x6e\x0\x7\x6\x6\x3e\x66\x66\x3b\x0\x0\x0\x1e\x33\x3\x33\x1e\x0\x38\x30\x30\x3e\x33\x33\x6e\x0\x0\x0\x1e\x33\x3f\x3\x1e\x0\x1c\x36\x26\xf\x6\x6\xf\x0\x0\x0\x6e\x33\x33\x3e\x30\x1f" "\x7\x6\x36\x6e\x66\x66\x67\x0\xc\x0\xe\xc\xc\xc\x1e\x0\x30\x0\x38\x30\x30\x33\x33\x1e\x7\x6\x66\x36\x1e\x36\x67\x0\xe\xc\xc\xc\xc\xc\x1e\x0\x0\x0\x33\x7f\x7f\x6b\x6b\x0\x0\x0\x1d\x33\x33\x33\x33\x0\x0\x0\x1e\x33\x33\x33\x1e\x0" "\x0\x0\x3b\x66\x66\x3e\x6\xf\x0\x0\x6e\x33\x33\x3e\x30\x78\x0\x0\x3b\x6e\x46\x6\xf\x0\x0\x0\x3e\x3\xe\x38\x1f\x0\x8\xc\x3f\xc\xc\x2c\x18\x0\x0\x0\x33\x33\x33\x33\x6e\x0\x0\x0\x33\x33\x33\x1e\xc\x0\x0\x0\x63\x63\x6b\x7f\x36\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x33\x33\x33\x3e\x30\x1f\x0\x0\x3f\x19\xc\x26\x3f\x0\x1e\x6\x6\x6\x6\x6\x1e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x1e\x30\x3e\x33\x6e\x0\x7\x6\x6\x3e\x66\x66\x3b\x0\x0\x0\x1e\x33\x3\x33\x1e\x0\x38\x30\x30\x3e\x33\x33\x6e\x0\x0\x0\x1e\x33\x3f\x3\x1e\x0\x1c\x36\x26\xf\x6\x6\xf\x0\x0\x0\x6e\x33\x33\x3e\x30\x1f" "\x7\x6\x36\x6e\x66\x66\x67\x0\xc\x0\xe\xc\xc\xc\x1e\x0\x30\x0\x38\x30\x30\x33\x33\x1e\x7\x6\x66\x36\x1e\x36\x67\x0\xe\xc\xc\xc\xc\xc\x1e\x0\x0\x0\x33\x7f\x7f\x6b\x6b\x0\x0\x0\x1d\x33\x33\x33\x33\x0\x0\x0\x1e\x33\x33\x33\x1e\x0" "\x0\x0\x3b\x66\x66\x3e\x6\xf\x0\x0\x6e\x33\x33\x3e\x30\x78\x0\x0\x3b\x6e\x46\x6\xf\x0\x0\x0\x3e\x3\xe\x38\x1f\x0\x8\xc\x3f\xc\xc\x2c\x18\x0\x0\x0\x33\x33\x33\x33\x6e\x0\x0\x0\x33\x33\x33\x1e\xc\x0\x0\x0\x63\x63\x6b\x7f\x36\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x33\x33\x33\x3e\x30\x1f\x0\x0\x3f\x19\xc\x26\x3f\x0\x38\xc\xc\x7\xc\xc\x38\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" "\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x3\x1\x3\x7\xf\x1f\xbf\xff\xff\xfd\xf8\xf0\xe0\xc0\x80\xc0\xff\xff\x7\x7\x7\x7\x7\x7\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xe0\xe0\xe0\xe0\xe0\xe0\x7\x7\x7\x7\x7\x7\x7\x7\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\x7\x7\x7\x7\x7\x7\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xe0\xe0\xe0\xe0\xe0\xe0\xff\xff\x7\x7\x0\x0\x0\x0\x0\x0\xe0\xe0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x7\x7\x0\x0\x0\x0\x0\x0\xe0\xe0\x0\x0\x0\x0\x55\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x0\x18\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x38\x44\x82\x0\x0\x0\x0\x0\x0\x0\x0\x41\x22\x1c\x0\x0\xfc\x84\x84\x84\x80\x80\x0\x0\x0\x0\x10\x10\x10\x1f\x0\x0\x80\x80\x80\x8c\xb0\xc0\x0\x0\x1\x6\x18\x0\x0\x0\x0\x3c\x66\x30\x18\x18\x0\x18\x0" "\x3c\x66\x30\x18\x18\x0\x18\x0\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x8\x1c\x8\x0\x0\x0\x0\x0\x18\x3c\x18\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0" "\x18\x7e\x7e\xff\xff\x7e\x7e\x18\x3c\x7e\xff\xff\xff\xff\x7e\x3c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 10 FontEntry("FN-ROUND", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x78\x84\xaa\x81\xb9\x9d\x81\x7e\x78\xfc\xd6\xff\xc7\xe3\xff\x7e\x0\x6c\xfe\xfe\x7c\x38\x10\x0\x10\x38\x7c\xfe\x7c\x38\x10\x0\x10\x38\x54\xfe\x54\x10\x38\x0\x10\x38\x7c\xfe\xd6\x10\x7c\x0\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xe0\xc0\xae\x19\x11\x13\xe\x0\x38\x4c\x46\x46\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x30\x38\x38\x18\x18\x0\xc\x0\x6c\x36\x36\x0\x0\x0\x0\x0\x0\x6c\x6c\xff\x66\xff\x36\x36\x0\x10\x78\x16\x3c\x48\x3e\x8\x0\x6e\x35\x1a\x2c\x56\x3b\x0\x30\x0\x70\xc\x6\x3c\x0\x18\xc\xc\x6\x0\x0\x0\x0\x0" "\x70\x1c\x6\x6\x6\xc\x18\x0\x18\x30\x60\x60\x60\x38\xe\x0\x0\x10\x92\x7c\x38\x6c\x82\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x20\x20\x30\x18\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x30\x38\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x30\x6c\x66\x63\x63\x63\x3e\x0\x30\x38\x30\x30\x18\x18\x3c\x0\x30\x6c\x66\x30\x18\x4c\x3e\x0\x30\x6c\x66\x30\x60\x66\x3c\x0\x60\x68\x6c\x66\x3e\x30\x30\x0\x70\xc\x6\x3e\x40\x62\x3c\x0\x70\x18\xc\x36\x4e\x46\x3c\x0\x70\x6e\x60\x30\x18\x18\xc\x0" "\x70\x58\x4c\x38\x44\x66\x3c\x0\x30\x4c\x66\x3c\x30\x18\xc\x0\x0\x0\x30\x30\x0\x18\x18\x0\x0\x0\x30\x30\x0\x18\x18\xc\x70\x1c\x6\x3\x6\xc\x18\x0\x0\x0\x0\xfc\x0\x7e\x0\x0\x18\x30\x60\xc0\x60\x38\xe\x0\x38\x4c\x66\x30\x30\x0\x18\x0" "\x78\x84\x9a\xa5\x79\x1\x7e\x0\x60\x78\x64\x66\x7f\x63\x63\x0\x30\x6c\x66\x37\x3b\x63\x3f\x0\x30\x6c\x66\x3\x3\x3\x7e\x0\x30\x6c\xc6\xc3\xc3\x63\x3f\x0\x30\x6c\x6\x3f\x3\x43\x3f\x0\x60\xd8\xc\x3f\x6\x6\x6\x0\x30\x6c\x6\x3\x73\x43\x3e\x0" "\x64\x64\x66\x3f\x33\x33\x33\x0\x1c\x18\x18\x1c\xc\xc\xc\x0\x60\x60\x60\x32\x33\x33\x1f\x0\x4c\x66\x36\x1f\x33\x63\x63\x0\x10\xc\x6\x3\x3\x3\x7f\x0\x44\x6e\x6e\x7a\x6b\x6b\x63\x0\x44\x6e\x6e\x6a\x7b\x73\x63\x0\x30\x6c\x66\x63\x63\x77\x3e\x0" "\x30\x6c\x66\x63\x3f\x3\x3\x0\x30\x6c\x66\x63\x63\x3b\x6e\x0\x30\x6c\x66\x63\x3f\x63\x63\x0\x30\x6c\x6\x7\x7e\x40\x3e\x0\x70\x1e\x18\x18\xc\xc\xe\x0\x68\x6c\x66\x63\x63\x63\x7e\x0\x68\x6c\x66\x63\x63\x36\x1c\x0\x68\x6c\x66\x63\x6b\x6b\x3e\x0" "\x80\xc3\x66\x1c\x38\xe6\xc3\x0\x6c\x66\x63\x33\x1e\xc\xc\x0\x7c\x4e\x63\x38\xc\x46\x3f\x0\x38\xc\xc\x6\x6\x6\x1e\x0\x4\xc\xc\x18\x30\x60\xc0\x0\x1c\x30\x30\x30\x18\x18\x1e\x0\x18\x2c\x6e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x18\xc\xc\x0\x0\x0\x0\x0\x0\x0\x70\x4c\x46\x66\x5c\x0\xc\x6\x36\x4e\x46\x26\x1c\x0\x0\x0\x70\xc\x6\x46\x3c\x0\x60\x60\x78\x64\x46\x46\x3c\x0\x0\x0\x70\x4c\x3e\x6\x3c\x0\x30\x28\xc\x6\x1f\x6\x6\x6\x0\x0\x70\x4c\x66\x7c\x60\x3c" "\x18\xc\x4\x36\x6e\x66\x66\x0\x0\x18\x0\x18\xc\xc\xc\x0\x0\x18\x0\x18\xc\xc\xc\x7\x8\xc\x64\x36\x2e\x66\x66\x0\x18\x18\x18\x18\xc\xc\xc\x0\x0\x0\x1a\x3e\x6b\x6b\x63\x0\x0\x0\x34\x7c\x66\x66\x66\x0\x0\x0\x30\x6c\x66\x66\x3c\x0" "\x0\x0\x34\x4c\x44\x3e\x6\x6\x0\x0\x58\x24\x26\x3e\x60\x60\x0\x0\x66\x1c\xe\x6\x6\x0\x0\x0\x70\xe\x3c\x60\x3e\x0\x30\x30\x18\x78\x1e\x18\xc\xc\x0\x0\x68\x6c\x66\x36\x6c\x0\x0\x0\x68\x6c\x66\x34\x18\x0\x0\x0\x64\x66\x63\x6b\x36\x0" "\x0\xc0\x63\x34\x18\x2c\xc6\x3\x0\x0\x68\x6c\x66\x3e\x30\x1e\x0\x0\x78\x44\x30\xc\x7e\x0\x20\x30\x18\xc\xc\x18\x10\x0\x30\x30\x30\x0\x18\x18\x18\x0\x8\x18\x30\x30\x18\xc\x4\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x7f\x0\x0" "\xff\xf\x3\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\xe0\xc0\xc0\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x3\x3\x7\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\xc0\xf0\xff" "\x7\x0\x0\x0\x0\x0\x0\x0\x80\x80\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x1\x1\x0\x0\x0\x0\x0\x0\x0\xe0\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3f\xf\x7\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xf8\xf0\xe0\xe0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x7\x7\xf\x1f\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xe0\xf0\xfc\xff\xff\x3\x1\x0\x0\x0\x0\x0\x0\xc0\x80\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x1\x3\x0\x0\x0\x0\x0\x0\x80\xc0\x0\x0\x0\xff\xff\x0\x0\x0\x0\x0\x1c\x3f\x7e\x3f\x1c\x0\x0\x0\x18\x7e\xff\x7e\x18\x0\x0\x0\x38\xfc\x7e\xfc\x38\x0\x0\x0\xe0\x78\x3c\x78\xe0\x0\x0\x0\xc0\x70\x38\x70\xc0\x0" "\x0\x0\x0\xc0\x70\xc0\x0\x0\x0\x0\x0\x80\x40\x80\x0\x0\x0\x0\x80\x0\x0\x0\x80\x0\x0\x0\x1\x0\x0\x0\x1\x0\x0\x0\x0\x1\x2\x1\x0\x0\x0\x0\x0\x3\xe\x3\x0\x0\x0\x0\x3\x6\x1c\x6\x3\x0\x0\x0\x7\x1e\x3c\x1e\x7\x0" "\x18\x18\x18\x18\x18\x18\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x1\x0\x3\x3\x0\x1\x0\x0\xd\x0\x1f\x1f\x0\xd\x0" "\x0\x6d\x0\xff\xff\x0\x6d\x0\x0\x3\x0\x7\x7\x0\x3\x0\x0\x1b\x0\x3f\x3f\x0\x1b\x0\x0\xdb\x0\xff\xff\x0\xdb\x0\x0\x0\x0\x1\x1\x0\x0\x0\x0\x6\x0\xf\xf\x0\x6\x0\x0\xb6\x0\xff\xff\x0\xb6\x0\x0\x0\x0\x0\x7f\x6c\x6c\x6c" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 11 FontEntry("GRAFPAPR", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x0\x1c\x22\x22\x22\x22\x1c\x0\x18\x1c\x1e\x18\x18\x18\x3e\x0\x3e\x63\x60\x30\xc\x6\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x66\x7f\x60\x60\x0\x7f\x3\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x0\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x0\x1c\x26\x43\x7f\x43\x43\x0\x0\x3f\x63\x3f\x63\x63\x3f\x0\x0\x3e\x63\x3\x3\x63\x3e\x0\x0\x3f\x63\x63\x63\x63\x3f\x0\x0\x7f\x3\x1f\x3\x3\x7f\x0\x0\x7f\x43\x1f\x13\x3\x3\x0\x0\x3e\x63\x3\x7b\x63\x5e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x30\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x7b\x73\x3e\x60\x3f\x66\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\x8\x8\x1c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x6\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\xaa\xd5\xaa\xd5\xaa\xd5\xaa\xff\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 12 FontEntry("GTHS-BUG", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x3e\x1c\x3e\x8\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x0\x0\x0\x3c\x0\x3c\x0\x0" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\x0\x7c\x56\x56\x7c\x50\x50\x0\x3c\x66\x1c\x36\x36\x1c\x33\x1e\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x66\xdb\xbd\x0\x0\x0\xbd\xdb\x66\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x1c\x1c\x1c\x0\x1c\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\xc\x3e\x3\x1e\x30\x1f\xc\x0\x0\x63\x33\x18\xc\x66\x63\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\x6\x6\x3\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\xc\xc\x3f\xc\xc\x0\x0\x0\x0\x0\x0\x0\x1c\x18\xc\x0\x0\x0\x3f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x3e\x63\x63\x6b\x63\x63\x3e\x0\x18\x1e\x18\x18\x18\x18\x7e\x0\x3e\x60\x60\x3e\x3\x3\x7f\x0\x3e\x60\x60\x3c\x60\x60\x3f\x0\x68\x6c\x66\x63\x7f\x60\x60\x0\x7f\x3\x1f\x30\x60\x60\x3f\x0\x3c\x6\x3\x3b\x63\x63\x3e\x0\x7f\x60\x30\x30\x18\x18\xc\x0" "\x7e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x6e\x60\x30\x1e\x0\x0\x1c\x1c\x0\x0\x1c\x1c\x0\x0\x1c\x1c\x0\x0\x1c\x18\xc\x18\xc\x6\x3\x6\xc\x18\x0\x0\x0\x3f\x0\x0\x3f\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3f\x60\x30\x18\x18\x0\x18\x0" "\x3e\x63\x7b\x7b\x7b\x3\x1e\x0\x1e\x30\x63\x63\x7f\x63\x63\x40\x3f\x63\x63\x3b\x63\x33\x1f\x0\x7e\x3\x3\x3\x3\x6\x7c\x0\x3f\x63\x63\x63\x63\x33\x1f\x0\x3e\x63\x3\x3b\x3\x3\x7e\x0\x7c\x6\x6\x3f\x6\x6\x6\x0\x7e\x3\x3\x73\x63\x66\x7c\x40" "\x63\x63\x3\x7f\x63\x63\x63\x40\x3c\x0\x18\x18\x18\x18\x3c\x0\x78\x0\x60\x60\x60\x30\x1f\x0\x63\x33\x1b\xf\x33\x63\x63\x40\x3\x3\x3\x3\x3\x3\x7f\x0\x3f\x63\x6b\x6b\x6b\x6b\x63\x40\x1f\x30\x63\x63\x63\x63\x63\x40\x3e\x63\x63\x63\x63\x66\x3c\x0" "\x3f\x63\x63\x33\x1f\x3\x3\x0\x3e\x63\x63\x63\x6b\x2e\x18\x70\x3f\x63\x63\x33\x1f\x33\x63\x40\x7e\x3\x6\x3c\x60\x60\x3f\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x6\x7c\x0\x63\x63\x63\x63\x36\x1c\x8\x0\x6b\x6b\x6b\x6b\x6b\x63\x3f\x0" "\x43\x63\x36\x1c\x36\x63\x63\x40\x63\x63\x63\x66\x7c\x63\x3e\x0\x7f\x60\x30\x18\xc\x6\x7f\x0\x1e\x6\x6\x6\x6\x6\x1e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x7e\x63\x63\x63\x6e\x0\x3\x3\x1f\x33\x63\x63\x3b\x0\x0\x0\x7e\x63\x3\x6\x7c\x0\x60\x60\x7c\x66\x63\x63\x6e\x0\x0\x0\x7e\x63\x7f\x3\x7e\x0\x7c\x6\x6\x1f\x6\x6\x6\x0\x0\x0\x7e\x63\x63\x6e\x60\x3f" "\x3\x3\x1f\x33\x63\x63\x63\x0\x18\x0\x18\x18\x18\x18\x18\x0\x30\x0\x30\x30\x30\x30\x30\x1f\x3\x3\x7f\xf\x1b\x33\x63\x0\x10\x18\x18\x18\x18\x18\x18\x0\x0\x0\x3f\x6b\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x66\x3c\x0" "\x0\x0\x3b\x63\x63\x3f\x3\x3\x0\x0\x6e\x63\x63\x7e\x60\x60\x0\x0\x7b\xf\x7\x3\x3\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x8\xc\x3f\xc\xc\xc\x38\x0\x0\x0\x63\x63\x63\x63\x6e\x0\x0\x0\x63\x63\x36\x1c\x8\x0\x0\x0\x63\x6b\x7f\x3e\x14\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x1c\x6\x7f\x0\x38\xc\xc\x7\xc\xc\x38\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xfe\x3\xf9\x5\x5\x5\x5\x5\xff\x0\xff\x0\x0\x0\x0\x0\x7f\xc0\x9f\xa0\xa0\xa0\xa0\xa0\x5\x5\x5\x5\x5\x5\x5\x5\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\x5\x5\x5\x5\x5\xf9\x3\xfe\x0\x0\x0\x0\x0\xff\x0\xff\xa0\xa0\xa0\xa0\xa0\x9f\xc0\x7f" "\x4\x6\x3\x0\x0\x0\x0\x0\x20\x60\xc0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x3\x6\x4\x0\x0\x0\x0\x0\xc0\x60\x20\x9\x12\x25\x4b\x97\x2f\x5e\xbc\x3d\x7a\xf4\xe9\xd2\xa4\x48\x90\xfc\xfe\x7\xf3\xb\xb\xb\xb\xff\xff\x0\xff\x0\x0\x0\x0" "\x3f\x7f\xe0\xcf\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xb\xb\xb\xb\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xf3\x7\xfe\xfc\x0\x0\x0\x0\xff\x0\xff\xff\xd0\xd0\xd0\xd0\xcf\xe0\x7f\x3f\xb\x9\xc\x7\x0\x0\x0\x0\xd0\x90\x30\xe0\x0\x0\x0\x0" "\x0\x0\x0\x0\x7\xc\x9\xb\x0\x0\x0\x0\xe0\x30\x90\xd0\x0\x0\x33\x66\x33\x0\x0\x0\x0\x0\xc\x16\x3e\x3f\x33\x0\x42\x18\xaa\x38\x3c\x7e\x32\x0\x0\x0\x30\x58\x7c\xfc\x30\x0\x0\x0\x0\x60\xb8\xf8\x30\x0\x0\x0\x0\xc0\x60\xf0\x30\x0" "\x0\x0\x0\x80\xc0\xe0\x20\x0\x0\x0\x0\x0\x80\xc0\x20\x0\x0\x0\x0\x0\x0\x80\x20\x0\x0\x0\x0\x0\x0\x1\x1\x0\x0\x0\x0\x0\x1\x3\x3\x0\x0\x0\x0\x1\x2\x7\x3\x0\x0\x0\x0\x3\x5\xf\x3\x0\x0\x0\x0\x6\x1b\x1f\x13\x0" "\x5a\x4a\x42\x52\x5a\x4a\x42\x52\xff\xff\x0\x18\x3c\x66\xc3\x81\xff\xff\x0\x0\x0\x0\x18\x3c\xff\xff\x0\x18\x3c\x66\xdb\xbd\xff\xff\x0\x22\x77\x7f\x6b\x22\x0\x0\x0\x18\x0\x0\x0\x0\x0\x7\x0\x4\x6\x0\x7\x0\x0\x1f\x0\xc\x6\x0\x1f\x0" "\x0\xff\x0\xcc\x66\x0\xff\x0\x0\x7\x0\x4\x6\x0\x7\x0\x0\x3f\x0\xc\x26\x0\x3f\x0\x0\xff\x0\xcc\x66\x0\xff\x0\x0\x1\x0\x0\x0\x0\x1\x0\x0\x1f\x0\xc\x6\x0\x1f\x0\x0\xff\x0\xcc\x66\x0\xff\x0\x0\x18\x3c\x66\x3c\x18\x0\x0" "\x0\x24\x7e\x3c\x7e\x24\x0\x0\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x7f\x36\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 13 FontEntry("IDC-Harmonica", 12, 12, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x0\xdc\xc1\x1d\xdc\xc1\xc\x44\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x39\x9c\xe3\x7f\xfe\xc7\x39\x9c" "\xe3\x7f\xfe\xc7\x39\x9c\x3\x0\x70\x0\x7\xfe\x77\x7\x77\xe0\x3f\x70\x7\x77\xff\x3\x7\x70\x0\x0\x0\xe0\xe0\x1b\xb7\x39\xce\x1\xe\x70\x80\x73\x9c\xed\xd8\x7\x7\x0\xfc\xe0\x1c\xce\xe1\xe\x7c\xe0\x73\xf7\x73\x1e\xe7\x71\x3f\x3e\x7\x0\xe0\x0" "\xe\xe0\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x0\x7\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x0\x7\xe0\x0\x0\x38\x0\x7\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\x7\x38\x0\x0\x8c\xe1\x3d\xff\xf7\x7f\xff\xf7\x7f\xfe\xc3\x1f" "\xf8\x0\x7\x20\x0\x0\x0\x0\x0\x70\x0\x7\x70\xe0\x3f\xfe\x3\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x80\x3\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\xfe\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\xc\xe0\x0\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\x7\x0\x0\x0\x0\x0\xfe\x71\x3c\xe7\x77\x77\x3f\xf7\x71\xf\x77\x70\xfe\x3\x0\x70\x0\x7\x78\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\xfe\x3\x0\xfc\x3\x70\x0\xc7\x3f\x6\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xfe\x7\x70\x0\x7\x3f\x0\x7\x70\x0\x7\x70\x7\x77\x70\xfe\x3\x0\x38\x86\x73\x1c\xe7\x70\x7\x77\x70\x7\xf7\x7f\x0\x7\x70\x0\x7\x0\xff\x77\x0\x7\x70\x3f" "\xf\x7\x70\x0\x7\x70\x7\x77\x70\xfe\x3\x0\xfe\x73\x0\x7\x70\x3f\xf\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\xff\x7\x70\x0\x7\x38\xc0\x1\xe\x70\x0\x7\x70\x0\x7\x70\x0\x0\xfe\x73\x70\x7\xe7\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe" "\x3\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x87\xe7\x77\x0\x7\x70\xc0\x3\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x7\x38\x0\x0\x80\x3\x1c\xe0\x0\x7\x38\xc0" "\x1\x38\x0\x7\xe0\x0\x1c\x80\x3\x0\x0\x0\x0\x0\xc0\x3f\xfc\x3\x0\x0\xc0\x3f\xfc\x3\x0\x0\x0\x0\x1c\x80\x3\x70\x0\xe\xc0\x1\x38\xc0\x1\xe\x70\x80\x3\x1c\x0\x0\xfe\x73\x70\x0\x7\x70\xe0\x3\x7\x70\x0\x7\x0\x0\x7\x70\x0\x0" "\xfc\xe3\x70\x7\x77\x70\xe7\x77\x73\x37\x77\x73\xe7\x73\x0\xfe\x3\x0\xfc\xe3\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x71\x38\x87\xf3\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\xfc\xe3\x70\x7\x70\x0\x7\x70\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\xff\x77\x0\x7\xf0\xf\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xff\x77\x0\x7\xf0\xf\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\xfc\xe3" "\x70\x7\x70\x0\xc7\x77\x70\x7\x77\x70\x7\x77\x78\x7e\x7\x70\x7\x77\x70\x7\xf7\x7f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xff\x7\x0\xe0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x77\x70" "\x7\x77\x70\xfe\x3\x0\x7\x77\x38\xc7\x71\xe\x77\xf0\x3\x77\x70\xe\xc7\x71\x38\x7\x7\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\x7\xf7\x78\xdf\xf7\x7f\x77\x77\x72\x7\x77\x70\x7\x77\x70\x7\x7\x0\x7\xf7\x70\x1f" "\xf7\x73\x77\x77\x7e\xc7\x77\x78\x7\x77\x70\x7\x7\x0\xfc\xe3\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x38\xfe\x1\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x7\x0\x0\xfc\xe3\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xe7\x77" "\x3c\xbe\x3\x70\xff\x73\x70\x7\x77\x70\xff\x73\x7\xe7\x70\x1c\x87\x73\x70\x7\x7\x0\xfe\x73\x70\x7\xe0\x3\xfc\x1\x3e\x0\x67\x70\x7\x77\x70\xfe\x3\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x7\x77\x70\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x38\xc7\x71\xe\x7e\x0\x0\x7\x77\x70\x7\x77\x70\x7\x77\x72\x77\xf7\x7f\xdf\xf7\x78\x7\x7\x0\x7\xe7\x38\xdc\x81\xf\xf8\x80\xf\xdc\xe1\x38\x7\x77\x70\x7" "\x7\x0\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\xe0\x0\xe\xe0\x0\xe\xe0\x0\x0\xff\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\x7\x70\x0\xff\x7\x0\xf8\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf8\x0\x0\x7\xe0\x0\x1c\x80\x3\x70\x0" "\xe\xc0\x1\x38\x0\x7\x60\x0\x4\x0\xf8\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xf8\x0\x0\x20\x0\x7\xf8\xc0\x1d\x8e\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f" "\x70\x0\x7\x70\x0\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\x0\x7\x70\xfe\x77\x70\x7\x77\x70\xfe\x7\x0\x7\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\x0\x7\x70\x0\xe7\x7f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x70\xff\x77\x0\x7\x70\x0\xfe\x7\x0\xf8\xc3\x1\x1c\xc0\x1\xfc\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x0\x0" "\x0\x0\xe0\x7f\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\xf7\x3f\x7\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x70\x0\x7\x0\xc0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xfe\x3\x0\x0\x7\x70\x0\x0\x7c\x0\x7\x70\x0\x7\x70" "\xe\xe7\x70\xfc\x3\x0\x7\x70\x0\x7\x77\x38\xc7\x71\xe\x7f\x70\xe\xc7\x71\x38\x7\x7\x0\x0\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\xf8\x7\x0\x0\x0\x0\x0\xf0\x38\xdf\xf7\x7f\x77\x77\x72\x7\x77\x70\x7\x7\x0\x0\x0\x0\x0" "\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x0\x0\x0\x0\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x0\x0\x0\x0\xe0\x7f\x7\x77\x70\x7\x77\x70\x7\xe7" "\x7f\x0\x7\x70\x0\x0\x0\x0\x70\x3f\xf\x77\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\xe0\x7f\x7\x70\x0\xfe\x3\x70\x6\x77\x70\xfe\x3\x0\x1c\xc0\x1\x1c\xe0\xf\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\xf8\x7\x0\x0\x0\x0\x0\x70\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x8e\xe3\x38\x8e\xc3\x1d\xf8\x0\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x27\x77\x77\xff\xf7\x7d\x8e\x3\x0\x0\x0\x0\x0\x70\x70\x8e\xc3\x1d\xf8\x80\xf\xdc\xe1\x38\x7" "\x7\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x87\xe7\x77\x0\x7\x70\xff\x3\x0\x0\x0\x0\x0\xf0\x3f\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\xff\x7\x0\xe0\x3\x7\x70\x0\x7\x70\x80\x3\x70\x0\x7\x70\x0\x7\xe0\x3\x0\xff\xf\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7c\x0\xe\xe0\x0\xe\xe0\x0\x1c\xe0\x0\xe\xe0\x0\xe\x7c\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x7\x70\x0\x7\x70\x0\xff\xf" "\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\x0\x0\x0\x0\x0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\xe\xe0\x0\xe\xe0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\xfe\xc3\x1f\xf8\x0\x7\x20\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x2\x70\x80\xf\xfc\xe1\x3f\xff\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" ), // Font no. 14 FontEntry("IDC-Harmonica", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x36\x36\x12\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x8\x7e\xb\x3e\x68\x3f\x8\x0\x6\x69\x36\x18\xc\x36\x4b\x30\x1e\x33\x16\x6e\x3b\x33\x6e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\xc\x18\x30\x30\x30\x18\xc\x0\x0\x36\x7f\x7f\x3e\x1c\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\xc0\x60\x30\x18\xc\x6\x3\x0" "\x0\x1e\x33\x7b\x6f\x67\x3e\x0\x18\x18\x1c\x18\x18\x18\x7e\x0\x3e\x60\x3e\x3\x3\x3\x7f\x0\x7e\x60\x38\x60\x60\x63\x3e\x0\xc\x4c\x66\x63\x7f\x60\x60\x0\x7f\x3\x3f\x60\x60\x63\x3e\x0\x3e\x3\x3f\x63\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3e\x63\x3e\x63\x63\x63\x3e\x0\x3e\x63\x63\x63\x7e\x60\x30\x0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x18\x10\x0\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\xc\x18\x30\x60\x30\x18\xc\x0\x3e\x63\x60\x3c\xc\x0\xc\x0" "\x3c\x66\x63\x7b\x3b\x3\x7e\x0\x3c\x66\x63\x7f\x63\x63\x63\x0\x1f\x33\x3f\x63\x63\x63\x3f\x0\x3c\x66\x3\x3\x3\x63\x3e\x0\x1f\x33\x63\x63\x63\x63\x3f\x0\x7f\x3\x1f\x3\x3\x3\x7f\x0\x7f\x3\x1f\x3\x3\x3\x3\x0\x3c\x66\x3\x73\x63\x73\x6e\x60" "\x63\x63\x7f\x63\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x60\x60\x60\x63\x63\x3e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3c\x66\x63\x63\x63\x33\x1e\x0" "\x3f\x63\x63\x63\x3f\x3\x3\x0\x3c\x66\x63\x63\x63\x3b\x36\x60\x3f\x63\x63\x3f\x1b\x33\x63\x0\x3e\x63\xe\x38\x62\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x33\x1b\xe\x0\x63\x63\x63\x6b\x7f\x77\x63\x0" "\x63\x36\x1c\x1c\x36\x63\x63\x0\x63\x63\x63\x3e\x18\x18\x18\x0\x7f\x30\x18\xc\x6\x3\x7f\x0\x3c\xc\xc\xc\xc\xc\x3c\x0\x3\x6\xc\x18\x30\x60\x40\x0\x3c\x30\x30\x30\x30\x30\x3c\x0\x8\x1c\x36\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7f" "\x18\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3c\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x7e\x0\x7c\x6\x6\x3e\x6\x6\x6\x6\x0\x0\x7e\x63\x63\x7e\x60\x3f" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x7e\x0\x60\x0\x70\x60\x60\x60\x66\x3c\x3\x3\x63\x33\x1f\x33\x63\x0\x6\x6\x6\x6\x6\x6\x7c\x0\x0\x0\x37\x7f\x6b\x63\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x63\x3f\x3\x0\x0\x7e\x63\x63\x63\x7e\x60\x0\x0\x3b\x67\x3\x3\x3\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\xc\xc\x3e\xc\xc\xc\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x36\x36\x1c\x0\x0\x0\x63\x63\x6b\x7f\x36\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x3f\x18\xc\x6\x7f\x0\x70\x18\x18\xc\x18\x18\x70\x0\xff\x0\x0\x0\x0\x0\x0\x0\xe\x18\x18\x30\x18\x18\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 15 FontEntry("IDC-Hoodlum", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x6c\x6c\x6c\x0\x0\x0\x0\x0\x0\x6c\xfe\x6c\xfe\x6c\x0\x0\x10\xfe\x16\xfe\xd0\xfe\x10\x0\x0\x66\x36\x18\x6c\x66\x0\x0\x38\x6c\x38\xfc\x66\xde\x0\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x0\x30\x18\x18\x18\x30\x0\x0\x0\x18\x30\x30\x30\x18\x0\x0\x18\x42\x18\x3c\x18\x42\x18\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x0\xfe\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x0\xc0\x60\x30\x18\xc\x6\x0" "\x0\xfe\xc6\xc6\xc6\xfe\x0\x0\x0\x3c\x30\x30\x30\x30\x78\x0\x0\xfe\xc0\xfe\xe\xfe\x0\x0\x0\xfe\xc0\xf8\xc0\xfe\x0\x0\xe\xe\x6e\x6e\xfe\x60\x60\x0\x0\xfe\xe\x7e\xc0\x7e\x0\x0\xe\xe\xe\xe\xfe\xce\xfe\x0\x0\xfe\xc0\xc0\xc0\xc0\xc0\x0" "\x0\xfe\xce\xfe\xce\xfe\x0\x0\x0\xfe\xc6\xfe\xc0\xc0\xc0\xc0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x18\xc\x0\x60\x30\x18\xc\x18\x30\x60\x0\x0\x0\xfe\x0\xfe\x0\x0\x0\xc\x18\x30\x60\x30\x18\xc\x0\x0\xfe\xc6\xf0\x30\x0\x30\x0" "\x7c\xc6\xf6\xd6\x76\x6\x7c\x0\x0\xff\xc0\xfe\xce\xce\x0\x0\x0\x7f\xc0\x7e\xce\x7e\x0\x0\x0\xfc\xe\xe\xe\xfc\x0\x0\x0\x7f\xc0\xce\xce\x7e\x0\x0\x0\xff\x0\xfe\xe\xfe\x0\x0\x0\xff\x0\xfe\xe\xe\x0\x0\x0\xfc\xe\xce\xce\xfc\x0\x0" "\x0\xce\xce\xfe\xce\xce\xe\x0\x0\x38\x38\x38\x38\x38\x0\x0\x0\xff\x30\x30\x30\x30\x3e\x0\x0\xce\x6e\x3e\x6e\xce\x0\x0\xe\xe\xe\xe\xe\xfe\x0\x0\x0\xc6\xee\xfe\xd6\xc6\x6\x2\x6\xce\xde\xfe\xee\xce\x80\x0\x0\x7f\xc0\xc6\xc6\x7c\x0\x0" "\x0\x7f\xc0\x7e\xe\xe\x0\x0\x0\x7f\xc0\xc6\xf6\x7c\xc0\x0\x0\x7f\xc0\x7e\x6e\xce\x0\x0\x0\xf0\x38\x38\x38\x1f\x0\x0\x0\xff\x38\x38\x38\x38\x0\x0\x0\xce\xce\xce\xce\x7c\x0\x0\x0\xce\xce\xce\x7c\x38\x0\x0\xc0\xc6\xd6\xfe\xee\xc6\x0\x0" "\x0\xce\xce\x7c\xce\xce\x0\x0\x0\xce\xce\xfe\x38\x38\x38\x0\x0\xff\x70\x38\x1c\xfe\x0\x0\x0\x18\x8\x8\x8\x18\x0\x0\x0\x6\xc\x18\x30\x60\xc0\x0\x0\x18\x10\x10\x10\x18\x0\x0\x10\x38\x6c\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x18\x18\xc\x0\x0\x0\x0\x0\x0\xff\xc0\xfe\xce\xce\x0\x0\x0\x7f\xc0\x7e\xce\x7e\x0\x0\x0\xfc\xe\xe\xe\xfc\x0\x0\x0\x7f\xc0\xce\xce\x7e\x0\x0\x0\xff\x0\xfe\xe\xfe\x0\x0\x0\xff\x0\xfe\xe\xe\x0\x0\x0\xfc\xe\xce\xce\xfc\x0\x0" "\x0\xce\xce\xfe\xce\xce\xe\x0\x0\x38\x38\x38\x38\x38\x0\x0\x0\xff\x30\x30\x30\x30\x3e\x0\x0\xce\x6e\x3e\x6e\xce\x0\x0\xe\xe\xe\xe\xe\xfe\x0\x0\x0\xc6\xee\xfe\xd6\xc6\x6\x2\x6\xce\xde\xfe\xee\xce\x80\x0\x0\x7f\xc0\xc6\xc6\x7c\x0\x0" "\x0\x7f\xc0\x7e\xe\xe\x0\x0\x0\x7f\xc0\xc6\xf6\x7c\xc0\x0\x0\x7f\xc0\x7e\x6e\xce\x0\x0\x0\xf0\x38\x38\x38\x1f\x0\x0\x0\xff\x38\x38\x38\x38\x0\x0\x0\xce\xce\xce\xce\x7c\x0\x0\x0\xce\xce\xce\x7c\x38\x0\x0\xc0\xc6\xd6\xfe\xee\xc6\x0\x0" "\x0\xce\xce\x7c\xce\xce\x0\x0\x0\xce\xce\xfe\x38\x38\x38\x0\x0\xff\x30\x18\xc\xfe\x0\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x0\xc\x18\x18\x30\x18\x18\xc\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 16 FontEntry("IDC-MicroKnight", 12, 12, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x0\xdc\xc1\x1d\xdc\x81\x19\x10\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x39\x9c\xe3\x7f\xfe\xc7\x39\x9c" "\xe3\x7f\xfe\xc7\x39\x9c\x3\x0\x70\x0\x7\xfe\x73\x7\x77\xe0\x3f\x70\x7\x77\x70\xf7\x3f\x70\x0\x7\x0\xe0\xe0\x1b\xb7\x39\xce\x1\xe\x70\x80\x73\x9c\xed\xd8\x7\x7\x0\x7c\xe0\xe\xee\xe0\x6\x7c\xe7\x3b\xf7\x71\xe\xe7\x70\x1f\xbc\x3\x70\xe0\x0" "\xe\xe0\x0\x8\x60\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x0\x7\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x0\x7\xe0\x0\x0\x38\x0\x7\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\x7\x38\x0\x0\x0\x0\x0\x8e\xc3\x1d\xf8\xf0\x7f\xff\x87\xf" "\xdc\xe1\x38\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\xe0\x3f\xfe\x3\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x7\x40\x0\x3\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\xfe\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\xe0\x0\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\x7\x0\x0\x0\x0\x0\xfe\x71\x3c\xe7\x77\x77\x3f\xf7\x71\xf\x77\x70\xfe\x3\x0\x70\x0\x7\x78\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\xfe\x3\x0\xfc\x3\x70\x0\xc7\x3f\x6\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xfc\x3\x70\x0\x7\x3f\x0\x7\x70\x0\x67\x70\x7\x77\x70\xfe\x3\x0\xc0\x1\x1c\xe0\x0\x7\xb8\xc3\x39\x8e\x73\x38\xff\x7\x38\x80\x3\x0\xff\x70\x0\x7\xf0\x3f" "\x0\x7\x70\x0\x7\x70\x7\x77\x38\xfe\x1\x0\x7e\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x38\xfe\x1\x0\xff\x7\x38\xc0\x1\xe\xe0\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\xfe\x71\x38\x87\xe3\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x38\xfe" "\x1\x0\xfe\x71\x38\x7\x77\x70\x7\x77\x70\x7\xe7\x7f\x0\x7\x70\xf0\x3\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x7\x40\x0\x3\x0\x0\x1c\xe0\x0\x7\x38\xc0" "\x1\x38\x0\x7\xe0\x0\x1c\x0\x0\x0\x0\x0\x0\x0\xc0\x1f\xfc\x1\x0\x0\xc0\x1f\xfc\x1\x0\x0\x0\x0\x0\x80\x3\x70\x0\xe\xc0\x1\x38\xc0\x1\xe\x70\x80\x3\x0\x0\x0\xfe\x73\x70\x0\x7\x70\xe0\x3\x7\x70\x0\x7\x0\x0\x7\x70\x0\x0" "\xfc\xe1\x38\xe7\x77\x77\x77\x77\x77\xe7\x73\x0\x7\xe0\x70\xfc\x3\x0\xfe\x71\x38\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x71\x38\x87\xf3\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x38\xff\x1\x0\xfe\x71\x38\x7\x70\x0\x7\x70\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\xff\x77\x0\x7\xf0\x1f\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xff\x77\x0\x7\xf0\x1f\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x7c\xe0" "\x0\x7\x70\x0\xc7\x77\x70\x7\x77\x70\x7\x77\x78\x7e\x7\x70\x7\x77\x70\x7\xf7\x7f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xff\x7\x0\xc0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x77\x70" "\x7\x77\x70\xfe\x3\x0\x7\x77\x38\xc7\x71\xe\x77\xf0\x3\x77\x70\xe\xc7\x71\x38\x7\x7\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\x7\xf7\x78\xdf\xf7\x7f\x77\x77\x72\x7\x77\x70\x7\x77\x70\x7\x7\x0\x7\xf7\x70\x1f" "\xf7\x73\x77\x77\x7e\xc7\x77\x78\x7\x77\x70\x7\x7\x0\xfe\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x7\x0\x0\xfe\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x77\x77" "\x3e\xfe\x3\x38\xff\x71\x38\x7\x77\x70\x7\xf7\x3f\x77\x70\xe\xc7\x71\x38\x7\x7\x70\x7e\x70\x0\x7\xe0\x3f\x0\x7\x70\x0\x67\x70\x7\x77\x70\xfe\x3\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x7\x77\x70\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\x7\xe7\x38\x8e\xc3\x1d\xdc\x81\xf\xf8\x0\x0\x7\x77\x70\x7\x77\x70\x7\x77\x72\x77\xf7\x7f\xdf\xf7\x78\x7\x7\x0\x7\xe7\x38\xdc\x81\xf\xf8\x80\xf\xdc\xe1\x38\x7\x77\x70\x7" "\x7\x0\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x80\x3\x38\x80\x3\x38\x80\x3\x0\xff\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\x7\x70\x0\xff\x7\x0\xf8\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf8\x0\x0\x0\x70\x0\xe\xc0\x1\x38\x0" "\x7\xe0\x0\x1c\x80\x3\x70\x0\xe\x0\xf8\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xf8\x0\x0\x20\x0\x7\xf8\xc0\x1d\x8e\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f" "\x70\x0\x7\x70\x0\x4\x30\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf8\x3\x70\x0\xe7\x7f\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x7\x70\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\x0\x0\x0\xfe\x70\x38\x7\x70\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\x0\x7\x70\xfc\xe7\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\xfe\x70\x1c\x87\xf3\x3f\x7\x70\x0\x7\x70\x70\xfe\x3\x0\xf8\xc0\x1d\x1c\xc0\x1\x7c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x0\x0" "\x0\xfe\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\xe7\x3f\x7\x70\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x70\x0\x7\x0\xc0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xfe\x3\x0\x0\x7\x70\x0\x0\x7c\x0\x7\x70\x0\x7\x70" "\x6\x67\x70\xfc\x3\x0\x7\x70\x0\x87\x73\x1c\xe7\xf0\x7\x77\x70\xe\xc7\x71\x38\x7\x7\x0\x0\x80\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xfe\x3\x0\x0\x0\x0\x7\xf3\x78\xdf\xf7\x7f\x77\x77\x72\x7\x77\x70\x7\x7\x0\x0\x0\x0\xff" "\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x0\x0\x0\xfe\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x0\x0\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x0\x0\x0\xfc\xe7\x70\x7\x77\x70\x7\x77\x70\x7\xe7" "\x7f\x0\x7\x70\x0\x0\x0\xff\x73\x70\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x7e\x70\x0\x7\xe0\x3f\x0\x7\x70\x6\x77\x70\xfe\x3\x0\x1c\xc0\x1\xfe\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\xf8\x7\x0\x0\x0\x0\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\x7\x77\x70\x7\xe7\x38\x8e\xe3\x38\xdc\xc1\x1f\xf8\x0\x0\x0\x0\x0\x7\x77\x70\x27\x77\x77\xff\xe7\x3f\xde\xe3\x38\x6\x3\x0\x0\x0\x0\x7\xe7\x38\xdc\x81\xf\x70\x80\xf\xdc\xe1\x38\x7" "\x7\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x7\xe7\x7f\x0\x7\x70\xfc\x3\x0\x0\x0\x0\xff\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\xff\x7\x0\xe0\x1\x7\x70\x0\x7\x70\x80\x3\x70\x0\x7\x70\x0\x7\xe0\x1\x0\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x78\x0\xe\xe0\x0\xe\xe0\x0\x1c\xe0\x0\xe\xe0\x0\xe\x78\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x7\x70\x0\x7\x70\x0\xff\xf" "\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\x0\x0\x0\x0\x0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\xe\xe0\x0\xe\xe0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\xfe\xc3\x1f\xf8\x0\x7\x20\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x2\x70\x80\xf\xfc\xe1\x3f\xff\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" ), // Font no. 17 FontEntry("IDC-MicroKnight", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x36\x36\x24\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x8\x3e\xb\x3e\x68\x68\x3e\x8\x6\x69\x3e\x18\xc\x36\x4b\x30\xe\x1b\xe\x6f\x3b\x1b\x3e\x60\x18\x18\x10\x8\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\xc\x18\x30\x30\x30\x18\xc\x0\x0\x36\x1c\x7f\x1c\x36\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\x10\x8\x0\x0\x0\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x60\x30\x18\xc\x6\x3\x0" "\x0\x1e\x33\x7b\x6f\x67\x3e\x0\x18\x18\x1c\x18\x18\x18\x7e\x0\x3e\x60\x3c\x6\x3\x3\x7f\x0\x3c\x60\x38\x60\x62\x63\x3e\x0\x18\x18\xc\x36\x33\x7f\x30\x0\x1f\x3\x3f\x60\x62\x33\x1e\x0\xe\x3\x3f\x63\x63\x33\x1e\x0\x7f\x60\x30\x18\x18\x18\x18\x0" "\x1e\x33\x3e\x63\x63\x33\x1e\x0\x1e\x33\x63\x63\x7e\x60\x38\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x10\x8\x0\x18\xc\x6\xc\x18\x0\x0\x0\x0\x3e\x0\x3e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3e\x63\x60\x3c\xc\x0\xc\x0" "\x1c\x36\x7b\x6f\x7b\x3\x66\x3c\x1e\x33\x63\x7f\x63\x63\x63\x0\x1f\x33\x3f\x63\x63\x33\x1f\x0\x1e\x33\x3\x3\x3\x63\x3e\x0\x1f\x33\x63\x63\x63\x63\x3f\x0\x7f\x3\x3f\x3\x3\x3\x7f\x0\x7f\x3\x3f\x3\x3\x3\x3\x0\x1c\x6\x3\x73\x63\x63\x7e\x60" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x70\x60\x60\x60\x63\x63\x3e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x1e\x33\x63\x63\x63\x63\x3e\x0" "\x1f\x33\x63\x63\x3f\x3\x3\x0\x1e\x33\x63\x63\x63\x6b\x3e\x30\x1f\x33\x63\x63\x3f\x1b\x33\x60\x1e\x3\x3e\x60\x62\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x36\x36\x1c\x1c\x0\x63\x63\x63\x6b\x7f\x77\x63\x0" "\x63\x36\x1c\x1c\x36\x63\x63\x0\x63\x63\x63\x3e\x30\x30\x30\x0\x7f\x30\x18\xc\x6\x3\x7f\x0\x1c\xc\xc\xc\xc\xc\x1c\x0\x0\x3\x6\xc\x18\x30\x60\x0\x1c\x18\x18\x18\x18\x18\x1c\x0\x8\x1c\x36\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7f" "\x18\x18\x10\x8\x0\x0\x0\x0\x0\x3c\x60\x7e\x63\x63\x7e\x0\x3\x1f\x33\x63\x63\x63\x3f\x0\x0\x1e\x33\x3\x3\x63\x3e\x0\x60\x7c\x66\x63\x63\x63\x7e\x0\x0\x1e\x33\x3f\x3\x63\x3e\x0\x1c\x36\x6\x1e\x6\x6\x6\x6\x0\x7e\x63\x63\x63\x7e\x60\x3e" "\x3\x1f\x33\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x7e\x0\x30\x0\x38\x30\x30\x30\x32\x1c\x3\x33\x1b\xf\x1b\x33\x63\x0\x1c\x18\x18\x18\x18\x18\x7e\x0\x0\x23\x77\x7f\x6b\x63\x63\x0\x0\x1f\x33\x63\x63\x63\x63\x0\x0\x1e\x33\x63\x63\x63\x3e\x0" "\x0\x1f\x33\x63\x63\x63\x3f\x3\x0\x7c\x66\x63\x63\x63\x7e\x60\x0\x3f\x63\x3\x3\x3\x3\x0\x0\x1e\x3\x3e\x60\x63\x3e\x0\xc\x3e\xc\xc\xc\x4c\x38\x0\x0\x63\x63\x63\x63\x63\x7e\x0\x0\x63\x63\x36\x36\x1c\x1c\x0\x0\x63\x6b\x7f\x3e\x36\x22\x0" "\x0\x63\x36\x1c\x1c\x36\x63\x0\x0\x63\x63\x63\x63\x7e\x60\x3e\x0\x7f\x30\x18\xc\x6\x7f\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\xc\x18\x18\x30\x18\x18\xc\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 18 FontEntry("INVERSE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\xff\xc3\x99\x99\x99\x99\xc3\xff\xff\xe7\xe3\xe7\xe7\xe7\xc3\xff\xff\xc3\x99\xcf\xe7\xb3\x81\xff\xff\xc3\x9d\xcf\x9f\x99\xc3\xff\xff\xcf\xd7\xdb\x81\xdf\xdf\xff\xff\x81\xf9\xc1\x9f\x9d\xc3\xff\xff\xe3\xf9\xc1\x99\x99\xc3\xff\xff\x81\xbf\xcf\xe7\xe7\xe7\xff" "\xff\xc3\x99\xc3\x99\x99\xc3\xff\xff\xc3\x99\x99\x83\xdf\xe7\xff\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x0\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\xff\xe7\xdb\xdb\x81\xbd\xbd\xff\xff\xc1\x99\xc1\x99\x99\xc1\xff\xff\x83\x39\xf9\xf9\x39\x83\xff\xff\xc1\x99\x99\x99\x99\xc1\xff\xff\x81\xb9\xe1\xe9\xb9\x81\xff\xff\x81\xb9\xe1\xe9\xf9\xf9\xff\xff\xc3\xb9\xf9\x89\xb9\x83\xff" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x30\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x7b\x73\x3e\x60\x3f\x66\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\x8\x8\x1c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x6\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\xff\x7\x7\x7\x7\x7\xff\xff\xff\x0\x0\x0\x0\x0" "\xff\xff\xff\xe0\xe0\xe0\xe0\xe0\x7\x7\x7\x7\x7\x7\x7\x7\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\x7\x7\x7\x7\x7\xff\xff\xff\x0\x0\x0\x0\x0\xff\xff\xff\xe0\xe0\xe0\xe0\xe0\xff\xff\xff\x7\x3\x1\x0\x0\x0\x0\x0\xe0\xc0\x80\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x1\x3\x7\x0\x0\x0\x0\x0\x80\xc0\xe0\x0\x0\x0\xee\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 19 FontEntry("J-CURSE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\xc\xc\x0\xc\x0\x6c\x36\x1b\x0\x0\x0\x0\x0\x0\x6c\xfe\x6c\x6c\xfe\x6c\x0\x18\x7e\x3\x3e\x60\x3f\xc\x0\x0\x66\x33\x18\xcc\x66\x0\x0\x1c\x36\x1c\xb6\x63\x73\xde\x0\x60\x30\x18\x0\x0\x0\x0\x0" "\x30\x18\x18\x18\x18\x18\x18\x30\x6\xc\xc\xc\xc\xc\xc\x6\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc\x0\x0\xc0\x60\x30\x18\xc\x6\x0" "\x3c\x66\x66\x6b\x6b\x63\x3e\x0\x30\x38\x30\x18\x18\x18\x18\x0\x3e\x63\x60\x3c\x6\x3\x7f\x0\x3c\x66\x60\x3c\x60\x63\x3e\x0\x66\x66\x66\x63\x7f\x60\x60\x0\x7e\x6\x6\x3e\x60\x60\x3f\x0\x3c\x66\x6\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3c\x66\x66\x3e\x63\x63\x3e\x0\x3c\x66\x66\x7c\x60\x60\x3f\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x6\x0\x0\x18\xc\x6\xc\x18\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3e\x63\x60\x38\xc\x0\xc\x0" "\x7e\xc3\xdb\xdb\x7b\x3\x3e\x0\x7c\x66\x66\x7f\x63\x63\x63\x0\x7c\x66\x66\x7f\x63\x63\x3f\x0\x7c\x66\x6\x3\x3\x63\x3f\x0\x7c\x66\x66\x63\x63\x63\x3f\x0\x7c\x6\x6\x7f\x3\x3\x7f\x0\x7c\x6\x6\x7f\x3\x3\x3\x0\x7c\x66\x6\x73\x63\x63\x3f\x0" "\xc6\xc6\xc6\x7f\x63\x63\x63\x0\x30\x30\x30\x18\x18\x18\x18\x0\x60\x60\x60\x60\x30\x33\x1e\x0\x66\x36\x1e\xf\x1b\x33\x63\x0\x6\x6\x6\x3\x3\x3\x7f\x0\x66\x7e\x7e\x6b\x6b\x63\x63\x0\x66\x6e\x7e\x7b\x73\x63\x63\x0\x3c\x66\x66\x63\x63\x63\x3e\x0" "\x3c\x66\x66\x3f\x3\x3\x3\x0\x3c\x66\x66\x63\x63\x5b\x36\x60\x3e\x66\x66\x3f\x63\x63\x63\x0\x3c\x66\x6\x3c\x60\x63\x3e\x0\xfe\x30\x30\x18\x18\x18\x18\x0\xc6\xc6\xc6\x63\x63\x63\x3e\x0\xc6\xc6\xc6\x63\x63\x36\x1c\x0\xc6\xc6\xc6\x63\x6b\x6b\x3e\x0" "\xc6\x6c\x38\x18\x3c\x66\xc3\x0\x66\x66\x3c\x18\xc\xc\xc\x0\x7f\x60\x30\x1c\x6\x3\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x0\x6\xc\x18\x30\x60\xc0\x0\xe\xc\xc\xc\xc\xc\xc\xe\x18\x3c\x66\xc3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\x18\x30\x0\x0\x0\x0\x0\x0\x0\x7c\xc0\xfe\x63\x7e\x0\x6\x6\x3e\x63\x63\x63\x3f\x0\x0\x0\x3c\x66\x3\x63\x3e\x0\xc0\xc0\xfc\x66\x63\x63\x7e\x0\x0\x0\x3c\x66\x7f\x3\x7e\x0\x38\xc\xc\x3f\x6\x6\x6\x0\x0\x0\x3c\x66\x63\x7e\x60\x3e" "\x6\x6\x3e\x63\x63\x63\x63\x0\x30\x0\x30\x30\x18\x18\x18\x0\x60\x0\x60\x60\x30\x30\x30\x1f\x6\x6\x36\x1b\xf\x1b\x33\x0\x30\x30\x30\x18\x18\x18\x18\x0\x0\x0\x3e\x6b\x6b\x6b\x6b\x0\x0\x0\x3c\x66\x63\x63\x63\x0\x0\x0\x3c\x66\x63\x63\x3e\x0" "\x0\x0\x3c\x66\x63\x3f\x3\x3\x0\x0\x7c\x66\x63\x7e\x60\x60\x0\x0\x3e\x63\x3\x3\x3\x0\x0\x0\x3c\x6\x3c\x60\x3e\x0\x30\x30\x7c\x18\x18\x18\x18\x0\x0\x0\x66\x66\x63\x63\x3e\x0\x0\x0\xc6\xc6\x66\x36\x1c\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\xc6\xc6\x63\x7e\x60\x3f\x0\x0\x7f\x30\x1c\x6\x7f\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\x6\xc\xc\x18\xc\xc\x6\x0\xe\xdb\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 20 FontEntry("J-ELECTR", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x8\x8\x8\x8\x8\x0\x8\x0\x24\x24\x24\x0\x0\x0\x0\x0\x22\x7f\x22\x22\x22\x7f\x22\x0\x14\x7e\x15\x3e\x54\x3f\x14\x0\x0\x44\x22\x10\x8\x44\x22\x0\x1c\x22\x14\x6a\x11\x11\x6e\x0\x10\x10\x10\x0\x0\x0\x0\x0" "\x10\x8\x4\x4\x4\x8\x10\x0\x4\x8\x10\x10\x10\x8\x4\x0\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x8\x8\x3e\x8\x8\x0\x0\x0\x0\x0\x0\x0\x8\x4\x0\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x8\x0\x0\x40\x20\x10\x8\x4\x2\x0" "\x1c\x22\x51\x49\x45\x22\x1c\x0\xe\x8\x8\x8\x8\x28\x3e\x0\x1f\x20\x20\x1e\x1\x1\x3f\x0\x1f\x20\x20\x1c\x20\x20\x1f\x0\x1\x21\x21\x21\x7f\x20\x20\x0\x3f\x1\x1\x1f\x20\x20\x1f\x0\x1\x1\x1\x3f\x41\x41\x3e\x0\x3f\x20\x20\x10\x8\x8\x8\x0" "\x1c\x22\x22\x3e\x41\x41\x3e\x0\x3e\x41\x41\x7e\x40\x40\x40\x0\x0\x0\x8\x0\x0\x8\x0\x0\x0\x0\x8\x0\x0\x8\x4\x0\x20\x10\x8\x4\x8\x10\x20\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x4\x8\x10\x20\x10\x8\x4\x0\x3c\x42\x40\x20\x10\x0\x10\x0" "\x3c\x42\x99\xa5\x59\x2\x7c\x0\x3c\x42\x41\x41\x7f\x41\x41\x0\x3f\x41\x41\x3f\x41\x41\x3f\x0\x7c\x2\x1\x1\x1\x2\x7c\x0\x3f\x41\x41\x41\x41\x41\x3f\x0\x7f\x1\x1\x7f\x1\x1\x7f\x0\x7f\x1\x1\x7f\x1\x1\x1\x0\x7c\x2\x1\x71\x41\x41\x3e\x0" "\x41\x41\x41\x7f\x41\x41\x41\x0\x8\x8\x8\x8\x8\x8\x8\x0\x40\x40\x40\x40\x40\x20\x1e\x0\x21\x11\x9\x7\x9\x11\x21\x0\x1\x1\x1\x1\x1\x1\x7f\x0\x1f\x29\x49\x49\x49\x49\x49\x0\x1f\x21\x41\x41\x41\x41\x41\x0\x3c\x42\x41\x41\x41\x21\x1e\x0" "\x3f\x41\x41\x41\x3f\x1\x1\x0\x3c\x42\x41\x41\x41\x51\x2e\x40\x3f\x41\x41\x21\x1f\x21\x41\x0\x7c\x2\x1\x3e\x40\x40\x3f\x0\x3e\x8\x8\x8\x8\x8\x8\x0\x41\x41\x41\x41\x41\x41\x3e\x0\x41\x41\x41\x41\x41\x22\x1c\x0\x49\x49\x49\x49\x49\x49\x3f\x0" "\x41\x41\x22\x1c\x22\x41\x41\x0\x41\x22\x14\x8\x8\x8\x8\x0\x7f\x40\x30\x8\x6\x1\x7f\x0\xe\x2\x2\x2\x2\x2\xe\x0\x0\x2\x4\x8\x10\x20\x40\x0\x1c\x10\x10\x10\x10\x10\x1c\x0\x8\x14\x22\x41\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x4\x4\x4\x0\x0\x0\x0\x0\x0\x0\x3e\x40\x7e\x41\x7e\x0\x1\x1\x3f\x41\x41\x41\x3f\x0\x0\x0\x7e\x1\x1\x1\x7e\x0\x40\x40\x7e\x41\x41\x41\x7e\x0\x0\x0\x3e\x41\x7f\x1\x7e\x0\x3c\x2\x1f\x2\x2\x2\x2\x0\x0\x0\x3e\x41\x41\x7e\x40\x3f" "\x1\x1\x1f\x21\x41\x41\x41\x0\x10\x0\x1c\x10\x10\x10\x10\x0\x20\x0\x38\x20\x20\x20\x10\xf\x1\x1\x21\x11\xf\x11\x21\x0\x4\x4\x4\x4\x4\x4\x18\x0\x0\x0\x3f\x49\x49\x49\x49\x0\x0\x0\x1f\x21\x41\x41\x41\x0\x0\x0\x3e\x41\x41\x41\x3e\x0" "\x0\x0\x3f\x41\x41\x3f\x1\x1\x0\x0\x7e\x41\x41\x7e\x40\x40\x0\x0\x3f\x41\x1\x1\x1\x0\x0\x0\x3e\x1\x1e\x20\x1f\x0\x8\x8\x3e\x8\x8\x8\x30\x0\x0\x0\x41\x41\x41\x41\x3e\x0\x0\x0\x41\x41\x41\x22\x1c\x0\x0\x0\x49\x49\x49\x49\x3f\x0" "\x0\x0\x41\x22\x1c\x22\x41\x0\x0\x0\x41\x41\x41\x7e\x40\x3f\x0\x0\x7f\x20\x1c\x2\x7f\x0\x60\x10\x10\xc\x10\x10\x60\x0\x8\x8\x8\x8\x8\x8\x8\x8\x6\x8\x8\x30\x8\x8\x6\x0\x26\x19\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\xaa\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 21 FontEntry("J-FLUX", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x18\x7e\x3\x3e\x60\x3f\x18\x0\x0\x66\x33\x18\xc\x66\x33\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\x30\x30\x30\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\xc\x0\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x0\x0\x60\x30\x18\xc\x6\x0\x0" "\x3e\x63\x6b\x6b\x6b\x63\x3e\x0\xe\xc\xc\xc\xc\x2c\x3e\x0\x1f\x30\x30\x1e\x3\x3\x3f\x0\x1f\x30\x30\x1e\x30\x30\x1f\x0\x3\x33\x33\x33\x7f\x30\x30\x0\x3f\x3\x3\x1f\x30\x30\x1f\x0\x3\x3\x3\x3f\x63\x63\x3e\x0\x3f\x30\x30\x18\xc\xc\xc\x0" "\x1c\x36\x36\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x60\x60\x0\x0\x0\x18\x0\x0\x18\x0\x0\x0\x0\x18\x0\x0\x18\xc\x0\x0\x30\x18\xc\x18\x30\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3c\x66\x60\x30\x18\x0\x18\x0" "\x3c\x66\xdb\xdb\x73\x6\x3c\x0\x3c\x66\x63\x63\x7f\x63\x63\x0\x3f\x63\x63\x3f\x63\x63\x3f\x0\x7c\x6\x3\x3\x3\x6\x7c\x0\x3f\x63\x63\x63\x63\x63\x3f\x0\x7f\x3\x3\x7f\x3\x3\x7f\x0\x7f\x3\x3\x7f\x3\x3\x3\x0\x7c\x6\x3\x73\x63\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x18\x18\x18\x18\x18\x18\x18\x0\x60\x60\x60\x60\x60\x60\x3e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x3f\x6b\x6b\x6b\x6b\x6b\x6b\x0\x1f\x33\x63\x63\x63\x63\x63\x0\x3c\x66\x63\x63\x63\x63\x3e\x0" "\x3f\x63\x63\x63\x3f\x3\x3\x0\x3c\x66\x63\x63\x63\x5b\x36\x60\x3f\x63\x63\x63\x3f\x63\xc3\x0\x7c\x6\x3\x3e\x60\x60\x3f\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x6b\x6b\x6b\x6b\x6b\x6b\x3f\x0" "\x63\x63\x63\x3e\x63\x63\x63\x0\x33\x33\x33\x1e\xc\xc\xc\x0\x7f\x60\x30\x18\xc\x6\x7f\x0\x1e\x6\x6\x6\x6\x6\x1e\x0\x0\x6\xc\x18\x30\x60\x0\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x18\x3c\x66\xc3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\xc\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x7e\x3\x3\x3\x7e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x7e\x0\x3c\x6\x1f\x6\x6\x6\x6\x0\x0\x0\x3e\x63\x63\x7e\x60\x3f" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1e\x18\x18\x18\x18\x0\x30\x0\x3c\x30\x30\x30\x30\x1f\x3\x3\x63\x33\x1f\x33\x63\x0\xc\xc\xc\xc\xc\xc\x38\x0\x0\x0\x3f\x6b\x6b\x6b\x6b\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\x60\x0\x0\x3f\x63\x3\x3\x3\x0\x0\x0\x3e\x3\x1e\x30\x1f\x0\xc\xc\x3f\xc\xc\xc\x38\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x63\x63\x3e\x63\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x1c\x6\x7f\x0\xe0\x30\x30\x1c\x30\x30\xe0\x0\x18\x18\x18\x18\x18\x18\x18\x18\x7\xc\xc\x38\xc\xc\x7\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\xaa\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 22 FontEntry("J-TERMO", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x1c\x1c\x1c\x0\x1c\x0\x77\x77\x77\x0\x0\x0\x0\x0\x0\x6c\xfe\x6c\x6c\xfe\x6c\x0\x18\x7e\x7\x3e\x70\x3f\xc\x0\x0\x66\x33\x18\xcc\x66\x0\x0\x1c\x36\x1c\xb6\x63\x73\xde\x0\x60\x30\x18\x0\x0\x0\x0\x0" "\x30\x18\x18\x18\x18\x18\x18\x30\x6\xc\xc\xc\xc\xc\xc\x6\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc\x0\x0\xe0\x70\x38\x1c\xe\x7\x0" "\x3e\x77\x77\x7f\x77\x77\x3e\x0\x38\x3c\x38\x38\x38\x38\x7c\x0\x3e\x77\x70\x3c\xe\x7\x7f\x0\x3e\x70\x3c\x70\x77\x77\x3e\x0\x77\x77\x77\x77\x7e\x70\x70\x0\x7f\x7\x3f\x70\x77\x77\x3f\x0\x3e\x77\x7\x3f\x77\x77\x3e\x0\x7f\x60\x70\x38\x1c\x1c\x1c\x0" "\x3e\x77\x77\x3e\x77\x77\x3e\x0\x3e\x77\x7e\x70\x77\x77\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x6\x0\x0\x18\xc\x6\xc\x18\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3e\x77\x70\x38\x1c\x0\x1c\x0" "\x7e\xc3\xdb\xdb\x7b\x3\x3e\x0\x3e\x77\x7f\x77\x77\x77\x77\x0\x3f\x77\x3f\x77\x77\x77\x3f\x0\x3e\x77\x7\x7\x7\x77\x3e\x0\x3f\x77\x77\x77\x77\x77\x3f\x0\x7f\x7\x1f\x7\x77\x77\x7f\x0\x7f\x7\x1f\x7\x7\x7\x7\x0\x7e\x7\x77\x77\x77\x77\x3e\x0" "\x77\x77\x77\x7f\x77\x77\x77\x0\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x0\x70\x70\x70\x70\x77\x77\x3e\x0\x77\x77\x3f\xf\x3f\x77\x77\x0\x7\x7\x7\x7\x77\x77\x7f\x0\x77\x7f\x77\x77\x77\x77\x77\x0\x3f\x77\x77\x77\x77\x77\x77\x0\x3e\x7f\x77\x77\x77\x7f\x3e\x0" "\x3f\x77\x3f\x7\x7\x7\x7\x0\x3e\x77\x77\x77\x77\x77\x7e\xe0\x3f\x77\x3f\x77\x77\x77\x77\x0\x3e\x7\x3e\x70\x77\x77\x3e\x0\x7f\x1c\x1c\x1c\x1c\x1c\x1c\x0\x77\x77\x77\x77\x77\x77\x3e\x0\x77\x77\x77\x77\x77\x36\x1c\x0\x77\x77\x77\x77\x77\x7f\x77\x0" "\x77\x77\x3e\x1c\x3e\x77\x77\x0\x77\x77\x3e\x1c\x1c\x1c\x1c\x0\x7f\x70\x38\x1c\xe\x7\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x0\x7\xe\x1c\x38\x70\xe0\x0\xe\xc\xc\xc\xc\xc\xc\xe\x18\x3c\x66\xc3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3e\x70\x7e\x77\x7e\x0\x7\x7\x3f\x77\x77\x77\x3f\x0\x0\x0\x3e\x77\x7\x77\x3e\x0\x70\x70\x7e\x77\x77\x77\x7e\x0\x0\x0\x3e\x77\x7f\x7\x7e\x0\x3c\xe\xe\x3f\xe\xe\xe\x0\x0\x0\x3e\x77\x77\x7e\x70\x3e" "\x7\x7\x3f\x77\x77\x77\x77\x0\x38\x0\x38\x38\x38\x38\x38\x0\x70\x0\x70\x70\x70\x70\x70\x3f\x7\x7\x77\x37\x1f\x37\x77\x0\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x0\x0\x0\x3f\x6b\x6b\x6b\x6b\x0\x0\x0\x3f\x77\x77\x77\x77\x0\x0\x0\x3e\x77\x77\x77\x3e\x0" "\x0\x0\x3f\x77\x77\x3f\x7\x7\x0\x0\x7e\x77\x77\x7e\x70\x70\x0\x0\x3f\x77\x7\x7\x7\x0\x0\x0\x7e\x7\x7e\xe0\x7e\x0\x1c\x1c\x7f\x1c\x1c\x1c\x1c\x0\x0\x0\x77\x77\x77\x77\x3e\x0\x0\x0\x77\x77\x77\x36\x1c\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x77\x36\x1c\x36\x77\x0\x0\x0\x77\x77\x77\x7e\x70\x3f\x0\x0\x7f\x38\x1c\xe\x7f\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\x6\xc\xc\x18\xc\xc\x6\x0\xe\xdb\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 23 FontEntry("KANAFONT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x3c\x42\xa5\x81\xbd\x99\x42\x3c\x3c\x7e\xdb\xff\xc3\xe7\x7e\x3c\x0\x66\xff\xff\xff\x7e\x18\x0\x0\x0\x1c\x3e\x3e\x1c\x0\x0\x0\x18\x3c\x66\xe7\x18\x3c\x0\x18\x3c\x7e\xff\x7e\x18\x3c\x0\x0\x0\x3c\x7e\x7e\x3c\x0\x0" "\xff\xff\xc3\x81\x81\xc3\xff\xff\x0\x0\x3c\x7e\x66\x7e\x3c\x0\xff\xff\xc3\x81\x99\x81\xc3\xff\x78\x70\x58\x3e\x63\x63\x3e\x0\x3c\x66\x66\x3c\x18\x7e\x18\x18\xf8\x18\x18\xf8\x18\x1e\x1f\xe\xfe\xc6\xc6\xfe\xc6\xe6\x77\x3\xdb\xdb\x18\xff\xff\x18\xdb\xdb" "\xe\x1e\x3e\x7e\x3e\x1e\xe\x0\x70\x78\x7c\x7e\x7c\x78\x70\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x0\x66\x66\x66\x66\x66\x0\x66\x0\xff\xff\x66\x66\x66\x66\x66\x0\x7e\x3\x3f\x66\x66\x7c\x60\x3f\x0\x0\x0\x0\xff\xff\xff\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x7e" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x7f\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\x0\xff\xff\x7e\x3c\x18\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x3c\x18\x0\x18\x0\x33\x77\x66\x0\x0\x0\x0\x0\x36\x7f\x7f\x36\x7f\x7f\x36\x0\x1c\x7e\xf\x3e\x78\x3f\x1c\x0\x0\x6e\x77\x38\x1c\xee\x76\x0\x1c\x3e\x36\xde\x77\x7f\xde\x0\x18\x1c\xc\x0\x0\x0\x0\x0" "\x38\x3c\xc\xc\xc\x3c\x38\x0\x1c\x3c\x30\x30\x30\x3c\x1c\x0\x0\x36\x1c\x7f\x7f\x1c\x36\x0\x0\x18\x18\x7e\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x1c\xc\x0\x0\x0\x7e\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x60\x70\x38\x1c\xe\x6\x0" "\x3e\x7f\x67\x63\x73\x7f\x3e\x0\x1e\x1e\x18\x18\x18\x7e\x7e\x0\x3f\x7f\x60\x3e\x7\x7f\x7f\x0\x3f\x7f\x60\x3c\x70\x7f\x3f\x0\x63\x63\x63\x7f\x7f\x60\x60\x0\x7f\x7f\x3\x3f\x70\x7f\x3f\x0\x7c\x7e\x7\x3f\x63\x7f\x3e\x0\x7f\x7f\x60\x70\x1c\xe\xe\x0" "\x3e\x7f\x63\x3e\x63\x7f\x3e\x0\x3e\x7f\x63\x7f\x70\x7f\x3f\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x1c\xc\x0\x38\x1c\xe\xe\x1c\x38\x0\x0\x7f\x7f\x0\x0\x7f\x7f\x0\x0\x1c\x38\x70\x70\x38\x1c\x0\x3e\x7f\x70\x38\x1c\x0\x1c\x1c" "\x3e\x7f\x63\x7b\x3\x7f\x7e\x0\x3e\x7f\x63\x7f\x7f\x63\x63\x0\x3f\x7f\x63\x3f\x63\x7f\x3f\x0\x7c\x7e\x7\x3\x3\x7f\x7e\x0\x1f\x3f\x73\x63\x63\x7f\x3f\x0\x7c\x7e\x7\x7f\x3\x7f\x7f\x0\x7c\x7e\x7\x7f\x7f\x3\x3\x0\x7c\x7e\x7\x7b\x63\x7f\x3e\x0" "\x63\x63\x63\x7f\x7f\x63\x63\x0\x3c\x3c\x18\x18\x18\x3c\x3c\x0\x7c\x7c\x60\x60\x70\x7f\x3f\x0\x63\x63\x33\x1f\x3f\x73\x63\x0\x3\x3\x3\x3\x7\x7e\x7c\x0\x63\x7f\x7f\x63\x63\x63\x63\x0\x67\x6f\x7f\x7b\x73\x63\x63\x0\x3c\x7e\x67\x63\x63\x7f\x3e\x0" "\x3f\x7f\x63\x7f\x3f\x3\x3\x0\x3c\x7e\x67\x63\x5b\x3b\x76\x60\x3f\x7f\x63\x3f\x3f\x63\x63\x0\x7e\x7f\x3\x3f\x60\x7f\x3f\x0\x7e\x7e\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x7f\x3e\x0\x63\x63\x63\x63\x77\x3e\x1c\x0\x63\x63\x63\x63\x7f\x7f\x63\x0" "\x63\x63\x63\x3e\x3e\x63\x63\x0\x63\x63\x7f\x7e\x60\x7f\x3f\x0\xff\xff\x70\x38\xe\xff\xff\x0\x3c\x3c\xc\xc\xc\x3c\x3c\x0\x0\x6\xe\x1c\x38\x70\x60\x0\x3c\x3c\x30\x30\x30\x3c\x3c\x0\x1c\x3e\x77\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\xff" "\xc\x1c\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x7f\x63\x7f\x7e\x0\x3\x3\x3f\x7f\x63\x7f\x3f\x0\x0\x0\x7e\x7f\x3\x7f\x7e\x0\x60\x60\x7e\x7f\x63\x7f\x7e\x0\x0\x3e\x7f\x63\x7f\x3\x7e\x0\x70\x78\x18\x7e\x18\x1e\xe\x0\x0\x3e\x7f\x63\x7e\x60\x7f\x3f" "\x3\x3\x3f\x7f\x63\x63\x63\x0\x1c\x1c\x0\x1e\x1e\x78\x70\x0\x70\x70\x0\x78\x78\x70\x3f\x1f\x3\x33\x33\x1f\x3f\x33\x33\x0\x18\x18\x18\x18\x18\x78\x70\x0\x0\x0\x3e\x7f\x6b\x63\x63\x0\x0\x0\x3f\x7f\x63\x63\x63\x0\x0\x0\x3e\x7f\x63\x7f\x3e\x0" "\x0\x3e\x7f\x63\x7f\x3f\x3\x3\x0\x7e\x7f\x63\x7f\x7e\x60\x60\x0\x0\x3f\x7f\x63\x3\x3\x0\x0\x0\x7e\xf\x3e\x78\x3f\x0\xc\xc\x3f\x3f\xc\x3c\x38\x0\x0\x0\x63\x63\x63\x7f\x3e\x0\x0\x0\x63\x63\x77\x3e\x1c\x0\x0\x0\x63\x63\x6b\x7f\x3e\x0" "\x0\x0\x63\x3e\x3e\x63\x63\x0\x0\x66\x66\x7e\x7c\x70\x3f\x1f\x0\x0\x7f\x78\x3e\x7\x7f\x0\x70\x78\x18\xe\xe\x18\x78\x70\x18\x18\x18\x18\x18\x18\x18\x18\xe\x1e\x18\x70\x70\x18\x1e\xe\x6e\x7f\x3b\x0\x0\x0\x0\x0\x0\x8\x1c\x3e\x77\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\xaa\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x18\x3c\x66\xc3\x66\x66\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\x18\x18\xff\xff\x0\x66\x7e\x7e\x66\x66\x0\x0\x0\x8\x0\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x0\x18\x18\x0\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x66\x66\x67\x60\x67\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x0\x0\x7f\x60\x67\x66\x66\x66\x66\x66\x67\x60\x7f\x0\x0\x0\x66\x66\x66\x66\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x66\x66\x66\x66\xe6\x66\x66\x66" "\x66\x66\xe6\x6\xfe\x0\x0\x0\x0\x0\xfe\x6\xe6\x66\x66\x66\x66\x66\xe7\x0\xff\x0\x0\x0\x0\x0\xff\x0\xe7\x66\x66\x66\x66\x66\xe6\x6\xe6\x66\x66\x66\x0\x0\xff\x0\xff\x0\x0\x0\x66\x66\xe7\x0\xe7\x66\x66\x66\x18\x18\xff\x0\xff\x0\x0\x0" "\x66\x66\x66\xff\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\xff\x66\x66\x66\x66\x66\x66\x66\xfe\x0\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\xfe\x66\x66\x66\x66\x66\x66\x66\xff\x66\x66\x66\x66" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x7f\x33\x7f\x6e\x0\x3f\x7f\x63\x3f\x63\x7f\x3f\x3\x7f\x7f\x63\x3\x3\x3\x3\x0\x0\x3\xff\xff\x66\x66\x66\x0\x7f\x7f\xe\x1c\xe\x7f\x7f\x0\x0\xc0\xfe\x7f\x33\x3f\x1e\x0\x0\x0\x66\x66\x7e\x3e\x7\x3\x0\x0\xff\xff\x1b\x18\x18\x0" "\x0\x3c\x7e\x66\x66\x7e\x3c\x0\x3e\x7f\x63\x7f\x63\x7f\x3e\x0\x3e\x7f\x63\x77\x36\x77\x77\x0\x7e\x7\x3e\x7f\x63\x7f\x3e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x30\x30\x7e\xdb\xdb\x7e\xc\xc\x3e\x3f\x3\x3f\x3\x3f\x3e\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 24 FontEntry("MOTIF", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x3e\x7f\x6b\x5d\x63\x7f\x3e\x0\x63\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x8\x1c\x8\x77\x77\x8\x1c\x0\x1c\x3e\x7f\x7f\x36\x8\x1c\x0\x0\x18\x3c\x7e\x3c\x18\x0\x0" "\xff\xe7\xc3\x81\xc3\xe7\xff\xff\x0\x18\x3c\x66\x66\x3c\x18\x0\xff\xe7\xc3\x99\x99\xc3\xe7\xff\x78\x70\x78\x6c\x1e\x33\x33\x1e\x7e\xc3\xc3\x7e\x18\x7e\x18\x18\x78\x58\x78\x18\x18\xe\xf\x6\x7c\x7c\x6c\x6c\x6f\x66\x78\x30\xdb\x3c\x66\xe7\x66\x3c\xdb\x0" "\x1\x3\xf\x1f\xf\x3\x1\x0\x40\x60\x78\x7c\x78\x60\x40\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x0\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xde\xdc\xd8\xd8\xd8\x0\x3c\x66\x1c\x36\x36\x1c\x33\x1e\x0\x0\x0\x0\x7f\x7f\x7f\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x7e" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x38\x7f\x38\x18\x0\x0\x0\xc\xe\x7f\xe\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x8\x1c\x3e\x3e\x7f\x0\x0\x0\x7f\x3e\x3e\x1c\x8\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x18\x7e\x3\x3e\x60\x3f\x18\x0\x0\x63\x30\x18\xc\x6\x63\x0\x1c\x36\x1c\x6e\x33\x33\x6e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x77\x3e\x7f\x3e\x77\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x0\x7f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x0\x0\x3c\x76\x66\x6e\x3c\x0\x0\x0\x18\x1c\x18\x18\x3c\x0\x0\x0\x3c\x66\x30\xc\x7e\x0\x0\x7e\x30\x38\x60\x60\x30\x1e\x0\x34\x36\x36\x33\x7f\x30\x0\x0\x7e\x2\x3e\x66\x60\x30\x1e\x38\xc\x6\x3e\x66\x66\x3c\x0\x0\x7e\x60\x30\x38\x18\xc\xc" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x0\x3c\x66\x66\x7c\x60\x30\x1c\x0\x0\x4\x0\x0\x4\x0\x0\x0\x18\x18\x0\x0\x18\x18\xc\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7f\x0\x0\x7f\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3e\x63\x60\x30\x18\x0\x18\x0" "\x3e\x63\x63\x7b\x3b\x3\x7e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x66\x66\x3e\x66\x66\x3f\x0\x3c\x66\x3\x3\x3\x66\x3c\x0\x1f\x36\x66\x66\x66\x36\x1f\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x1c\x6\x3\x1f\x3\x3\x3\x0\x3e\x63\x3\x3\x7b\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x18\x18\x18\x18\x1b\x1b\xe\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x1e\x33\x33\x33\x33\x33\x33\x0\x1c\x36\x63\x7f\x63\x36\x1c\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x63\x6b\x3e\x60\x0\x3f\x33\x3\x3\x3\x3\x0\x3e\x63\x3\x3e\x60\x63\x3e\x0\x0\x6e\x3b\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x36\x1c\x8\x0\x63\x63\x6b\x6b\x7f\x77\x63\x0" "\x63\x36\x1c\x1c\x1c\x36\x63\x0\x66\x66\x66\x66\x66\x7c\x60\xc0\x7f\x61\x30\x18\xc\x46\x7f\x0\x3e\x6\x6\x6\x6\x6\x3e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x3e\x30\x30\x30\x30\x30\x3e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x0\x3e\x63\x3\x63\x3e\x0\x0\x0\x3f\x66\x66\x66\x3f\x0\x0\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x7f\x3\x1f\x3\x3\x0\x0\x0\x3c\x66\x66\x38\x60\x38" "\x0\x0\x63\x63\x7f\x63\x63\x0\x0\x0\x3c\x18\x18\x18\x3c\x0\x0\x0\x30\x30\x30\x36\x1c\x0\x0\x0\x63\x33\x1f\x33\x63\x0\x0\x0\x3\x3\x3\x3\x3f\x0\x0\x0\x63\x77\x6b\x6b\x63\x0\x0\x0\x7e\x6c\x6c\x6c\x6c\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x66\x3e\x6\xf\x0\x0\x0\x3e\x63\x63\x3b\x6e\x0\x0\x0\x3f\x66\x3e\x36\x67\x0\x0\x0\x3e\x3\x3e\x60\x3e\x0\x0\x0\x7e\x5a\x18\x18\x3c\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x36\x1c\x8\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x66\x66\x3c\x18\x18\x0\x0\x0\x3f\x19\xc\x26\x3f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\xe\x18\x18\x70\x18\x18\xe\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x1c\x36\x36\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\xff\x30\xb7\x81\xed\xc\xff\x0\x3f\x29\x23\x31\x25\x3f\x0\x0\x7e\x52\x46\x62\x4a\x7e\x0\x0\xfc\xa4\x8c\xc4\x94\xfc\x0\x0\xf8\x48\x18\x88\x28\xf8\x0\x0\xf0\x90\x30\x10\x50\xf0\x0" "\x0\xe0\x20\x60\x20\xa0\xe0\x0\x0\xc0\x40\xc0\x40\x40\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x2\x2\x3\x2\x3\x0\x0\x7\x5\x4\x6\x4\x7\x0\x0\xf\xa\x8\xc\x9\xf\x0\x0\x1f\x14\x11\x18\x12\x1f\x0" "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x3c\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x1\x1\x1\x1\x1\x0\x0\x0\x15\x15\x15\x15\x15\x0" "\x0\x0\x55\x55\x55\x55\x55\x0\x0\x0\x5\x5\x5\x5\x5\x0\x0\x0\x55\x55\x55\x55\x55\x0\x0\x0\x55\x55\x55\x55\x55\x0\x0\x0\x1\x1\x1\x1\x1\x0\x0\x0\x5\x5\x5\x5\x5\x0\x0\x0\x55\x55\x55\x55\x55\x0\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x66\x0\x0\x0\x0\x0\x78\x84\x2\x0\x0\x0\x0\x0\x0\x0\x41\x22\x1c\x0\x0\x0\x7c\x44\x44\x44\x44\xc6\x0\x0\x7c\x44\x44\x44\x44\xc7\x0\x0\xc\x34\xc4\x4\x4\x4\x0\x0\x20\x20\x20\x23\x2c\x30\x0\x0\x60\x20\x20\x20\x20\x60\x0" "\x0\x3\x2\x2\x2\x2\x3\x0\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0" "\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x81\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 25 FontEntry("NOTCH", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x22\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x42\x42\x42\x3c\x0\xff\xc3\xbd\xbd\xbd\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x2e\x3f\x1f\xe\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x1\x3\x7\xf\xf\x7\x3\x1\x80\xc0\xe0\xf0\xf0\xe0\xc0\x80\xc\x1e\x3f\xc\xc\x3f\x1e\xc\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6d\x6e\x6c\x6c\x6c\x0\x3e\x41\x1e\x22\x22\x3c\x41\x3e\x0\x0\x0\x0\x7f\x7f\x7f\x7f\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x0\x0\x18\x3c\x7e\xff\xff\x7e\x3c\x18\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x11\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\xc\xc\x6\x0\x0\x0\x0\x0" "\x40\x30\x18\x18\x18\x30\x40\x0\x1\x6\xc\xc\xc\x6\x1\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\xc\xc\x6\x0\x0\x0\x3f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x3e\x61\x63\x6b\x63\x63\x3e\x0\x18\x1c\x18\x18\x18\x18\x3c\x0\x3e\x63\x60\x30\xc\x6\x7f\x0\x3e\x43\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x46\x7f\x60\x60\x0\x7f\x1\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x40\x30\x18\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x30\x1c\x0\x0\xc\xc\x0\x0\xc\xc\x0\x0\xc\xc\x0\xc\xc\x6\x0\xc0\x60\x30\x18\x18\x30\x60\xc0\x0\x0\x7e\x0\x7e\x0\x0\x0\x3\x6\xc\x18\x18\xc\x6\x3\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x61\x63\x3f\x63\x63\x3f\x0\x3c\x66\x3\x3\x43\x66\x3c\x0\x3f\x61\x63\x63\x63\x63\x3f\x0\x7f\x1\x3\x1f\x3\x3\x7f\x0\x7f\x41\x3\x1f\x13\x3\x3\x0\x3e\x63\x3\x7b\x4b\x63\x5e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x8\x18\x18\x18\x18\x7e\x0\x78\x10\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x2\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x61\x63\x63\x63\x63\x3e\x0" "\x3f\x62\x66\x3e\x6\x6\xf\x0\x3e\x61\x63\x63\x7b\x73\x3e\x60\x3f\x62\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x8\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\xc\xc\x1e\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x70\x30\x30\x30\x30\x30\x30\x70\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x18\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x7\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x61\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x61\x63\x3f\x3\x3\x0\x0\x7e\x43\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x63\x36\x1c\x8\x0\x0\x63\x6b\x6b\x7f\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x36\x1c\xc\x7\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x6\xd\x1a\x35\x6a\xd5\xab\x56\xac\x58\xb0\x60\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x3e\x3e\x3e\x3e\x3e\x3e\x3e\x3e\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x0\x3f\x3f\x3f\x3f\x3f\x3f\xbf\x3f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x3c\x3c\x3c\x3c\x3c\x3c\xbc\x3e\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x7e\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 26 FontEntry("PEANUT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x1c\x8\x8\x0\x8\x0\x48\x24\x0\x0\x0\x0\x0\x0\x22\x7f\x22\x22\x22\x7f\x22\x0\x8\x3c\xa\x1c\x28\x1e\x8\x0\x0\x44\x22\x10\x8\x44\x22\x0\x1c\x22\x14\x6a\x11\x11\x6e\x0\x20\x10\x0\x0\x0\x0\x0\x0" "\x10\x8\x4\x4\x4\x8\x10\x0\x4\x8\x10\x10\x10\x8\x4\x0\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x8\x8\x3e\x8\x8\x0\x0\x0\x0\x0\x0\x0\x8\x4\x0\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x8\x0\x0\x40\x20\x10\x8\x4\x2\x0" "\x1c\x22\x32\x2a\x26\x22\x1c\x0\xc\x8\x8\x8\x8\x8\x8\x0\x1c\x22\x20\x18\x4\x2\x3e\x0\x1c\x22\x20\x18\x20\x22\x1c\x0\x0\x10\x8\x24\x22\x7e\x20\x0\x3f\x1\x1e\x20\x20\x11\xe\x0\x4\x2\x2\x3a\x46\x42\x3c\x0\x3c\x20\x20\x10\x10\x8\x8\x0" "\x3c\x12\xa\x3c\x42\x42\x3c\x0\x3c\x42\x62\x5c\x40\x40\x20\x0\x0\x0\x8\x0\x0\x8\x0\x0\x0\x0\x8\x0\x0\x8\x4\x0\x20\x10\x8\x4\x8\x10\x20\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x4\x8\x10\x20\x10\x8\x4\x0\x3c\x46\x46\x20\x10\x0\x10\x0" "\x3c\x42\x99\xa5\x59\x2\x7c\x0\x1c\x22\x42\x42\x7e\x42\x42\x0\x1e\x21\x21\x1f\x21\x21\x1f\x0\x3c\x2\x1\x1\x1\x2\x3c\x0\x3f\x41\x41\x41\x41\x41\x3f\x0\x3e\x1\x1\x1f\x1\x1\x3e\x0\x3c\x2\x2\x1e\x2\x2\x2\x0\x1e\x21\x1\x19\x21\x21\x1e\x0" "\x42\x42\x42\x42\x7e\x42\x42\x0\x1c\x8\x8\x8\x8\x8\x1c\x0\x30\x20\x20\x20\x20\x20\x1c\x0\x2\x22\x12\xa\xe\x12\x22\x0\x2\x2\x2\x2\x2\x2\x3e\x0\x1a\x2e\x2a\x2a\x2a\x2a\x2a\x0\x1a\x26\x22\x22\x22\x22\x22\x0\x1c\x22\x22\x22\x22\x22\x1c\x0" "\x3c\x42\x42\x3e\x2\x2\x2\x0\x3c\x42\x41\x41\x41\x51\x2e\x40\x3c\x42\x42\x3e\x12\x22\x42\x0\x1c\x22\x4\x8\x10\x22\x1c\x0\x3c\xa\x8\x8\x8\x8\x8\x0\x22\x22\x22\x22\x22\x32\x2c\x0\x22\x22\x22\x22\x22\x14\x8\x0\x2a\x2a\x2a\x2a\x2a\x2a\x1e\x0" "\x22\x22\x14\x8\x14\x22\x22\x0\x22\x22\x22\x32\x2c\x20\x18\x0\x3e\x20\x10\x8\x4\x2\x3e\x0\xe\x2\x2\x2\x2\x2\xe\x0\x0\x2\x4\x8\x10\x20\x40\x0\x1c\x10\x10\x10\x10\x10\x1c\x0\x8\x1c\x36\x1c\x8\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x4\x4\x4\x0\x0\x0\x0\x0\x0\x0\x0\x3c\x42\x62\x5c\x0\x2\x2\x2\x3a\x46\x42\x3c\x0\x0\x0\x0\x3c\x2\x2\x3c\x0\x40\x40\x40\x5c\x62\x42\x3c\x0\x0\x0\x1c\x22\x3e\x2\x3c\x0\x0\x1c\x2\x1e\x2\x2\x2\x0\x0\x0\x3c\x42\x62\x5c\x40\x3c" "\x2\x2\x2\x2\x3a\x46\x42\x0\x0\x0\x8\x0\x8\x8\x8\x0\x0\x0\x20\x0\x20\x20\x20\x18\x2\x2\x2\x12\xa\x16\x22\x0\x8\x8\x8\x8\x8\x8\x8\x0\x0\x0\x0\x6a\x56\x52\x52\x0\x0\x0\x0\x3a\x26\x22\x22\x0\x0\x0\x0\x1c\x22\x22\x1c\x0" "\x0\x0\x3c\x42\x46\x3a\x2\x2\x0\x0\x3c\x42\x62\x5c\x40\x40\x0\x0\x1a\x26\x2\x2\x2\x0\x0\x0\x18\x24\x8\x12\xc\x0\x0\x0\x8\x38\xc\x8\x8\x0\x0\x0\x0\x42\x42\x62\x5c\x0\x0\x0\x0\x42\x42\x24\x18\x0\x0\x0\x0\x2a\x2a\x2a\x1e\x0" "\x0\x0\x20\x16\x8\x34\x2\x0\x0\x0\x42\x42\x62\x5c\x40\x3c\x0\x0\x2c\x12\x8\x24\x1a\x0\x60\x10\x10\xc\x10\x10\x60\x0\x8\x8\x8\x8\x8\x8\x8\x8\x6\x8\x8\x30\x8\x8\x6\x0\x26\x19\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xfc\x2\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\x3f\x40\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x2\xfc\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x40\x3f" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x3\x7\xf\x1f\x3f\x7e\xfc\x3f\x7e\xfc\xf8\xf0\xe0\xc0\x80\xc0\xb0\xec\x3c\x1a\xe\x7\x5\xff\x55\xff\x0\x0\x0\x0\x0" "\x3\xd\x3f\x34\x78\x50\xe0\xa0\x7\x5\x7\x5\x7\x5\x7\x5\xe0\xa0\xe0\xa0\xe0\xa0\xe0\xa0\x7\x5\xe\xa\x3c\xec\x70\xc0\x0\x0\x0\x0\x0\xff\x55\xff\xe0\xa0\x70\x58\x3c\x37\xd\x3\x7\x5\x7\x0\x0\x0\x0\x0\xe0\xa0\xe0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x7\x5\x7\x0\x0\x0\x0\x0\xe0\xa0\xe0\x0\x81\xc3\xe7\xff\x7e\x3c\x18\x0\x1e\x29\x23\x31\x25\x1e\x0\x0\x3c\x52\x46\x62\x4a\x3c\x0\x0\x78\xa4\x8c\xc4\x94\x78\x0\x0\xf0\x48\x18\x88\x28\xf0\x0\x0\xe0\x90\x30\x10\x50\xe0\x0" "\x0\xc0\x20\x60\x20\xa0\xc0\x0\x0\x80\x40\xc0\x40\x40\x80\x0\x0\x0\x80\x80\x80\x80\x0\x0\x0\x0\x1\x1\x1\x1\x0\x0\x0\x1\x2\x2\x3\x2\x1\x0\x0\x3\x5\x4\x6\x4\x3\x0\x0\x7\xa\x8\xc\x9\x7\x0\x0\xf\x14\x11\x18\x12\xf\x0" "\x78\x3c\x1e\x3c\x78\x3c\x1e\x3c\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x0\x10\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x66\x0\x0\x0\x0\x0\x78\x84\x2\x0\x0\x0\x0\x0\x0\x0\x41\x22\x1c\x0\x0\x0\x7c\x44\x44\x44\x44\xc6\x0\x0\x7c\x44\x44\x44\x44\xc7\x0\x0\xc\x34\xc4\x4\x4\x4\x0\x0\x20\x20\x20\x23\x2c\x30\x0\x0\x60\x20\x20\x20\x20\x60\x0" "\x0\x3\x2\x2\x2\x2\x3\x0\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0" "\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x81\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 27 FontEntry("PERISOFT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x8\x8\x14\x36\x6b\x0\x7f\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x8\xc\xc\xc\x4\x0\xc\x0\x66\x44\x0\x0\x0\x0\x0\x0\x12\x36\x7f\x36\x7f\x36\x12\x0\x3e\x6b\xb\xb\x3e\x69\x3e\x8\xce\x69\x35\x1a\x6c\x56\x33\x0\x1c\x26\xa6\x7c\x3e\x23\x5e\x80\x10\x18\xc\x0\x0\x0\x0\x0" "\xe0\x30\x18\x18\x18\x30\x60\xc0\x3\x6\xc\x18\x18\x18\xc\x7\x9\x2a\x1c\x7f\x1c\x2a\x48\x0\x8\x18\x18\x18\x7e\x18\x10\x0\x0\x0\x0\x0\x0\x10\x18\xe\x0\x0\x0\x7e\x1\x0\x0\x0\x0\x0\x0\x0\x0\x18\x38\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x3c\x66\x76\x56\x4e\x2e\x1c\x0\xc\x18\x18\x18\x18\x18\x3c\x0\x3e\x63\x40\x60\x3e\x7\x7f\x0\x3e\x63\x60\x60\x38\x63\x3e\x0\x30\x58\x4c\x46\x43\x7e\x40\x0\x3f\x63\x3\x3\x3e\x40\x3f\x0\x3c\x66\x43\x3\x3f\x43\x3e\x0\x3f\x60\x30\x18\xc\x6\x3\x0" "\x3e\x43\x43\x43\x3e\x43\x3e\x0\x3e\x43\x43\x43\x7e\x41\x3e\x0\x0\x8\xc\x0\x0\xc\x8\x0\x0\x8\x8\x0\x8\xc\x4\x0\x0\x30\x18\xc\x6\xc\x18\x0\x0\x0\x40\x7e\x0\x7e\x2\x0\x0\x3\x6\xc\x18\xc\x6\x0\x3e\x63\x60\x60\x3c\x0\xc\x8" "\x1c\x22\x49\x55\x35\x9\x22\x1c\xe\x1b\x23\x43\x43\x7f\x43\x0\x3e\x43\x43\x23\x3f\x43\x3e\x0\x3e\x43\x43\x3\x43\x43\x3e\x0\x3e\x43\x43\x43\x43\x23\x1f\x0\x3e\x43\x3\x1b\x7\x43\x3e\x0\x3e\x43\x3\x1b\x7\x3\x2\x0\x3e\x43\x23\x3\x3b\x43\x3e\x0" "\x42\x43\x43\x63\x7f\x43\x42\x0\x7e\x18\x10\x10\x10\x18\x7e\x0\x18\x30\x20\x20\x21\x33\x1e\x0\x62\x33\x1b\xf\xf\x1b\x32\x0\x6\x3\x3\x3\x3\x43\x3e\x0\x22\x63\x63\x77\x7f\x6b\x22\x0\x42\x43\x43\x47\x4f\x5b\x72\x0\x3e\x43\x43\x43\x43\x43\x3e\x0" "\x3e\x43\x43\x43\x3f\x3\x6\x0\x3e\x43\x43\x43\x43\x53\x5e\x80\x3e\x43\x43\x23\x1f\x23\x42\x0\x3e\x43\x3\xe\x38\x43\x3e\x0\x7f\x1c\x18\x18\x18\x18\x8\x0\x42\x43\x43\x43\x43\x43\x3e\x0\x42\x43\x43\x43\x23\x13\xe\x0\x42\x43\x43\x43\x5b\x6f\x46\x0" "\x81\x43\x23\x16\x1c\x3e\x63\x0\x43\x43\x26\x2c\x18\x8\x8\x0\x3e\x61\x30\x18\x7f\x6\x7f\x0\x70\x18\x18\x18\x18\x18\x18\x70\x3\x6\xc\x18\x30\x60\xc0\x80\x7\xc\xc\xc\xc\xc\xc\x7\x8\x1c\x26\x43\x81\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x8\xc\x18\x30\x0\x0\x0\x0\x0\x0\x1e\x20\x3e\x63\xde\x0\x2\x3\x3\x3b\x47\x43\x3e\x0\x0\x0\x1e\x23\x3\x43\x3e\x0\x20\x40\x5c\x66\x63\x43\x7e\x0\x0\x0\x1e\x23\x1f\x3\x3e\x0\x3c\x46\x46\x6\x6\x1f\x6\x0\x0\x0\x3e\x43\x63\x5e\x40\x3e" "\x2\x3\x3b\x6f\x47\x43\x42\x0\x18\x10\x4\x18\x18\x18\x38\x0\x40\x60\x0\x60\x20\x21\x31\x1e\x2\x23\x13\xb\x7\xb\x12\x0\xc\x18\x18\x18\x18\x18\x30\x0\x0\x0\x22\x77\x6b\x6b\x22\x0\x0\x0\x3e\x43\x43\x43\x43\x0\x0\x0\x3e\x43\x43\x43\x3e\x0" "\x0\x0\x1e\x23\x43\x3f\x3\x2\x0\x0\x3c\x46\x43\x7e\x40\x80\x0\x0\x38\x4f\x46\x6\x6\x0\x0\x0\x3e\x3\x1c\x30\x1f\x0\x8\xc\xc\xc\x7f\xc\x78\x0\x0\x0\x43\x43\x43\x46\xbc\x0\x0\x0\x42\x43\x43\x26\x1c\x0\x0\x0\x22\x6b\x6b\x77\x22\x0" "\x0\x0\x23\x16\xc\x16\x23\x0\x0\x0\x43\x43\x43\x7e\x40\x3f\x0\x0\x7e\x30\x8\x6\x7f\x0\x78\xc\x18\xe\x18\xc\x78\x0\x8\x18\x18\x18\x18\x18\x18\x10\x7\xc\x6\x3c\x6\xc\x7\x0\x6\x8d\x78\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xfe\xff\x3\xf3\xb\xb\xb\xb\xff\xff\x0\xff\x0\x0\x0\x0\x7f\xff\xc0\xcf\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xb\xb\xb\xb\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xf3\x3\xff\xfe\x0\x0\x0\x0\xff\x0\xff\xff\xd0\xd0\xd0\xd0\xcf\xc0\xff\x7f" "\xb\xd\x6\x3\x0\x0\x0\x0\xd0\xb0\x60\xc0\x0\x0\x0\x0\x0\x0\x0\x0\x3\x6\xd\xb\x0\x0\x0\x0\xc0\x60\xb0\xd0\xb\xb\x13\x33\xc6\xe\xfc\xf0\xf\x3f\x70\x60\xc1\xc6\xc4\xc8\xfe\xff\x47\xa3\xd3\x6b\x37\x1b\xff\xff\x55\xaa\xff\x0\x0\x0" "\xff\xff\xd5\xea\xdf\xe8\xd8\xe8\x1b\x17\x1b\x17\x1b\x17\x1b\x17\xe8\xd8\xe8\xd8\xe8\xd8\xe8\xd8\x17\x1b\x17\xfb\x57\xab\xff\xff\x0\x0\x0\xff\x55\xaa\xff\xff\xd8\xe8\xd8\xef\xd5\xea\xff\xff\x17\x1b\x15\x1a\xf\x0\x0\x0\xd8\xe8\x58\xa8\xf0\x0\x0\x0" "\x0\x0\x0\xf\x15\x1a\x17\x1b\x0\x0\x0\xf0\x58\xa8\xd8\xe8\x0\x0\x0\x55\x0\xaa\x0\x0\x0\x1c\x26\x26\x26\x3e\x7f\x2a\x0\x0\x1c\x26\x26\x26\x3e\x7f\x0\x0\x1c\x26\xe6\xa6\x3e\x7f\x0\x0\x1c\x26\xe6\xa6\x3e\x7f\x0\x1c\x26\xa6\xe6\x3e\x7f\x0" "\xe0\x30\x30\x30\xf0\xf8\x0\x0\x80\xc0\xc0\xc0\xc0\xe0\x0\x0\x0\x0\x80\x80\x80\x80\xc0\x0\x0\x0\x0\x0\x1f\x1d\x0\x0\x0\x0\x0\x1\x1f\x3c\x10\x38\x0\x1\x5\xf\x19\x3b\x10\x38\x3\x4\x4\x1c\x37\x2f\x70\x38\x0\x7\x9\x9\x9\x1f\x3f\x38" "\x18\x2c\x26\x1c\x38\x64\x3c\x18\xff\xff\x0\x0\x8\x8\x14\x6b\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x8\x8\x14\x2a\x5d\xff\x7e\x0\x42\xe7\xff\xdb\x42\x0\x0\x0\x8\x18\x0\x0\x0\x0\x3\x5\x5\x5\x5\x3\x0\x0\x7\x1d\x29\x29\x1d\x7\x0" "\x0\x0\xf\xf9\xc9\x3d\xf\x0\x0\x0\x6\x5\x5\x6\x0\x0\x0\x20\x3e\x33\x27\x3e\x20\x0\x0\xe0\xfe\x9b\x93\xde\xf0\x0\x0\xf\x1a\x12\x12\x12\x1b\xf\x0\x1f\x3a\x52\x52\x52\x3b\x1f\x0\x7f\xda\x92\x92\xd2\xfb\x1f\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x80\xc0\x20\xd0\xe8\xf4\x1a\x8d\xe6\xaa\x83\x7d\x4d\x75\x4d\x7a\x85\xaa\xff\xff\x9d\xad\xbb\xd9\xff\xaa\xff\x7f\xdd\xea\xab\x5d\xff\xaa\xcc\x77\xcc\xff\xe0\xdb\x7b\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 28 FontEntry("REZ-ASCII", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x0\x18\x18\x0\x0\x6c\x6c\x6c\x0\x0\x0\x0\x0\x24\x7e\x24\x24\x7e\x24\x0\x18\x7c\xe\x3c\x70\x3e\x18\x0\x4e\x6a\x3e\x18\x7c\x56\x72\x0\x3c\x66\x66\x3c\x1e\x36\x6c\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x60\x30\x18\x18\x18\x30\x60\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x10\x54\x38\x38\x54\x10\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x3c\x3c\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x40\x60\x30\x18\xc\x6\x2\x0" "\x3c\x66\x76\x7e\x6e\x66\x3c\x0\x18\x1c\x18\x18\x18\x18\x3c\x0\x3c\x66\x66\x30\x18\xc\x7e\x0\x3c\x66\x66\x30\x66\x66\x3c\x0\x6\x6\x66\x66\x7c\x60\x60\x0\x7e\x66\x6\x3e\x60\x66\x3c\x0\x3c\x66\x6\x3e\x66\x66\x3c\x0\x7e\x66\x60\x30\x18\xc\xc\x0" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x3c\x66\x66\x7c\x60\x66\x3c\x0\x0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x18\xc\x20\x30\x18\xc\x18\x30\x20\x0\x0\x0\x3c\x3c\x0\x3c\x3c\x0\x8\x18\x30\x60\x30\x18\x8\x0\x3c\x66\x66\x30\x18\x0\x18\x0" "\x78\x84\xb2\xaa\xaa\x72\x4\xf8\x3c\x66\x66\x7e\x66\x66\x66\x0\x3e\x66\x66\x3e\x66\x66\x3e\x0\x3c\x66\x66\x6\x66\x66\x3c\x0\x3e\x66\x66\x66\x66\x66\x3e\x0\x7e\x66\x6\xe\x6\x66\x7e\x0\x7e\x66\x6\xe\x6\x6\x6\x0\x3c\x66\x6\x76\x66\x66\x3c\x0" "\x66\x66\x66\x7e\x66\x66\x66\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x78\x30\x30\x30\x36\x36\x1c\x0\x66\x66\x66\x3e\x66\x66\x66\x0\x6\x6\x6\x6\x6\x6\x7e\x0\x42\x66\x7e\x66\x66\x66\x66\x0\x62\x66\x6e\x7e\x76\x66\x46\x0\x3c\x66\x66\x66\x66\x66\x3c\x0" "\x3e\x66\x66\x3e\x6\x6\x6\x0\x3c\x66\x66\x66\x66\x76\x3c\x60\x3e\x66\x66\x3e\x66\x66\x66\x0\x3c\x66\x6\x3c\x60\x66\x3c\x0\x3e\x60\x60\x60\x60\x60\x60\x0\x66\x66\x66\x66\x66\x66\x3c\x0\x66\x66\x66\x66\x66\x6c\x38\x0\x66\x66\x66\x66\x7e\x66\x42\x0" "\x66\x66\x66\x3c\x66\x66\x66\x0\x66\x66\x66\x3c\x18\x18\x18\x0\x7e\x66\x30\x18\xc\x66\x7e\x0\x78\x18\x18\x18\x18\x18\x78\x0\x2\x6\xc\x18\x30\x60\x40\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x10\x38\x6c\x44\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x7e\x0" "\x0\x18\x18\x30\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x66\x7e\x0\x6\x6\x3e\x66\x66\x66\x3e\x0\x0\x0\x3c\x66\x6\x66\x3c\x0\x60\x60\x7c\x66\x66\x66\x7c\x0\x0\x0\x3c\x66\x7e\x6\x7c\x0\x3c\x66\x66\x6\xe\x6\x6\x0\x0\x0\x7c\x66\x66\x7c\x60\x3e" "\x6\x6\x3e\x66\x66\x66\x66\x0\x18\x0\x18\x18\x18\x18\x18\x0\x60\x0\x60\x60\x60\x66\x66\x3c\x6\x6\x66\x66\x3e\x66\x66\x0\x18\x18\x18\x18\x18\x18\x18\x0\x0\x0\x66\x7e\x66\x66\x66\x0\x0\x0\x3e\x66\x66\x66\x66\x0\x0\x0\x3c\x66\x66\x66\x3c\x0" "\x0\x0\x3e\x66\x66\x66\x3e\x6\x0\x0\x7c\x66\x66\x66\x7c\x60\x0\x0\x3e\x66\x66\x6\x6\x0\x0\x0\x7c\x6\x7e\x60\x3e\x0\xc\xc\x3c\xc\xc\x6c\x78\x0\x0\x0\x66\x66\x66\x66\x3c\x0\x0\x0\x66\x66\x66\x6c\x38\x0\x0\x0\x66\x66\x66\x7e\x66\x0" "\x0\x0\x66\x66\x3c\x66\x66\x0\x0\x0\x66\x66\x66\x7c\x60\x3e\x0\x0\x7e\x30\x18\xc\x7e\x0\x70\x18\x18\xc\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\xe\x18\x18\x30\x18\x18\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 29 FontEntry("SCRIPT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x8\x8\x8\x8\x8\x0\x8\x0\x14\x14\x14\x0\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x0\x8\x3c\xa\x1c\x28\x1e\x8\x0\x0\x46\x26\x10\x8\x64\x62\x0\xc\x12\xc\x4c\x52\x22\x5c\x0\x8\x8\x4\x0\x0\x0\x0\x0" "\x10\x8\x8\x8\x8\x8\x10\x0\x8\x10\x10\x10\x10\x10\x8\x0\x0\x2a\x1c\x8\x1c\x2a\x0\x0\x0\x8\x8\x3e\x8\x8\x0\x0\x0\x0\x0\x0\x0\x8\x8\x4\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x40\x20\x10\x8\x4\x2\x1\x0" "\x3c\x42\x42\x5a\x42\x42\x3c\x0\x10\x18\x10\x10\x10\x10\x38\x0\x3c\x42\x40\x38\x4\x2\x7e\x0\x3c\x42\x40\x20\x40\x42\x3c\x0\x20\x30\x28\x24\x7e\x20\x20\x0\x7e\x2\x3e\x40\x40\x42\x3c\x0\x38\x44\x2\x3a\x46\x42\x3c\x0\x7e\x40\x20\x10\x10\x10\x10\x0" "\x3c\x42\x42\x3c\x42\x42\x3c\x0\x3c\x42\x42\x7c\x40\x42\x3c\x0\x0\x0\x18\x0\x0\x18\x0\x0\x0\x8\x8\x0\x0\x8\x8\x4\x20\x10\x8\x4\x8\x10\x20\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x4\x8\x10\x20\x10\x8\x4\x0\x3c\x42\x20\x10\x10\x0\x10\x0" "\x3c\x42\x5a\x5a\x32\x2\x7c\x0\x20\x30\x30\x28\xbc\x62\x31\x0\x3e\x44\x46\x3d\xc2\x62\x3f\x0\x38\x44\x6\x3\x82\x42\x3c\x0\x1e\x24\x46\x45\xc2\x62\x3f\x0\x38\x44\x2\x1d\xc2\x42\x3c\x0\x6c\x52\x41\x29\xb0\x50\x8\x0\x38\x44\x6\x73\xc2\x62\x5c\x0" "\x44\x44\x46\x3d\xa2\x62\x22\x0\x20\x18\x14\x13\x88\x48\x30\x0\x20\x30\x28\x35\xae\x62\x12\xc\x24\x14\xe\x7\x8a\x52\x22\x0\x10\xc\xa\x5\x84\x42\x3e\x0\x44\x64\x56\x2b\xaa\x61\x31\x0\x88\x8c\x4e\x55\xd4\x62\x22\x0\x78\x84\x86\x43\xc2\x62\x1c\x0" "\x3e\x44\x46\x23\x9f\x62\x2\x0\x78\x84\x86\x43\xd2\x62\x5c\x0\x3e\x44\x42\x3f\xa2\x61\x21\x0\x20\x20\x50\x48\xc5\x46\x39\x0\xc0\x3e\x9\x5\x82\x42\x3c\x0\x44\x44\x46\x43\xa2\x22\x1c\x0\x44\x44\x22\x63\x94\x14\x8\x0\x44\x44\x42\x23\xaa\x6a\x14\x0" "\x22\x26\x15\x9\x94\x62\x22\x0\x88\x44\x42\x43\xfc\x44\x42\x3c\x3c\x42\x41\x39\xe0\x5c\x42\x3c\x38\x8\x8\x8\x8\x8\x38\x0\x1\x2\x4\x8\x10\x20\x40\x0\x1c\x10\x10\x10\x10\x10\x1c\x0\x8\x14\x22\x41\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x4\x4\x8\x0\x0\x0\x0\x0\x0\x0\x5c\x27\x92\x52\x2c\x0\x8\x4\x16\x2d\xa2\x52\x3c\x0\x0\x0\x3e\x25\x82\x42\x3c\x0\x80\x80\x5c\x67\xe2\x52\x4c\x0\x0\x0\x1c\x23\x9e\x42\x3c\x0\x30\x4c\x42\x71\xa8\x24\x14\x8\x0\x0\xbc\x47\xe2\x5c\x22\x1c" "\x8\xc\x36\x4d\xa4\x62\x32\x0\x0\x20\x0\x10\x99\x4e\x38\x0\x0\x40\x0\x70\xad\x72\x9\x7\x4\x4\x16\xb\x8e\x52\x32\x0\x20\x18\x14\xa\x89\x44\x38\x0\x0\x0\x2a\x57\xd2\x49\x29\x0\x0\x0\x34\x4f\xc4\x62\x22\x0\x0\x0\x3c\x47\xa2\x22\x1c\x0" "\x0\x0\x1a\x27\xa6\x5e\x2\x1\x0\x0\x5c\x23\xb2\x6c\x60\x20\x0\x0\x66\x59\xa0\x60\x30\x0\x0\x0\x30\x50\xcc\x43\x3c\x0\x20\x20\x7c\x13\x90\x48\x38\x0\x0\x0\x24\x27\x92\x52\x2c\x0\x0\x0\x26\x63\x92\xa\x4\x0\x0\x0\x46\x43\xaa\x2a\x14\x0" "\x0\x0\x22\x15\x88\x54\x22\x0\x0\x0\x44\x23\xa2\x7c\x22\x1c\x0\x0\x3c\x23\x98\x74\x12\xc\x20\x10\x10\x8\x10\x10\x20\x0\x8\x8\x8\x0\x8\x8\x8\x0\x4\x8\x8\x10\x8\x8\x4\x0\x24\x1a\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x41\x41\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x1e\x3f\x3f\x3f\x3f\x1e\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x78\xfc\xfc\xfc\xfc\x78\x0\x0\xf0\xf8\xf8\xf8\xf8\xf0\x0\x0\xe0\xf0\xf0\xf0\xf0\xe0\x0" "\x0\xc0\xe0\xe0\xe0\xe0\xc0\x0\x0\x80\xc0\xc0\xc0\xc0\x80\x0\x0\x0\x80\x80\x80\x80\x0\x0\x0\x0\x1\x1\x1\x1\x0\x0\x0\x1\x3\x3\x3\x3\x1\x0\x0\x3\x7\x7\x7\x7\x3\x0\x0\x7\xf\xf\xf\xf\x7\x0\x0\xf\x1f\x1f\x1f\x1f\xf\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\xe7\x5a\x42\x42\xe7\x0\x0\x0\x18\x18\x0\x0\x0\x0\x1\x1\x2\x2\x2\x1\x1\x0\x9\x9\x12\x12\x12\x9\x9" "\x0\x49\x49\x92\x92\x92\x49\x49\x0\x2\x2\x4\x4\x4\x2\x2\x0\x12\x12\x24\x24\x24\x12\x12\x0\x92\x92\x24\x24\x24\x92\x92\x0\x0\x0\x1\x1\x1\x0\x0\x0\x4\x4\x9\x9\x9\x4\x4\x0\x24\x24\x49\x49\x49\x24\x24\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 30 FontEntry("SMALLCAP", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x3e\x7f\x6b\x5d\x63\x7f\x3e\x0\x63\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x8\x1c\x8\x77\x77\x8\x1c\x0\x1c\x3e\x7f\x7f\x36\x8\x1c\x0\x0\x18\x3c\x7e\x3c\x18\x0\x0" "\xff\xe7\xc3\x81\xc3\xe7\xff\xff\x0\x18\x3c\x66\x66\x3c\x18\x0\xff\xe7\xc3\x99\x99\xc3\xe7\xff\x78\x70\x78\x6c\x1e\x33\x33\x1e\x7e\xc3\xc3\x7e\x18\x7e\x18\x18\x78\x58\x78\x18\x18\xe\xf\x6\x7c\x7c\x6c\x6c\x6f\x66\x78\x30\xdb\x3c\x66\xe7\x66\x3c\xdb\x0" "\x1\x3\xf\x1f\xf\x3\x1\x0\x40\x60\x78\x7c\x78\x60\x40\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x0\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xde\xdc\xd8\xd8\xd8\x0\x3c\x66\x1c\x36\x36\x1c\x33\x1e\x0\x0\x0\x0\x7f\x7f\x7f\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x7e" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x38\x7f\x38\x18\x0\x0\x0\xc\xe\x7f\xe\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x8\x1c\x3e\x3e\x7f\x0\x0\x0\x7f\x3e\x3e\x1c\x8\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x18\x7e\x3\x3e\x60\x3f\x18\x0\x0\x63\x30\x18\xc\x6\x63\x0\x1c\x36\x1c\x6e\x33\x33\x6e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x77\x3e\x7f\x3e\x77\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x0\x7f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x0\x0\x3c\x76\x66\x6e\x3c\x0\x0\x0\x18\x1c\x18\x18\x3c\x0\x0\x0\x3c\x66\x30\xc\x7e\x0\x0\x7e\x30\x38\x60\x60\x30\x1e\x0\x34\x36\x36\x33\x7f\x30\x0\x0\x7e\x2\x3e\x66\x60\x30\x1e\x38\xc\x6\x3e\x66\x66\x3c\x0\x0\x7e\x60\x30\x38\x18\xc\xc" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x0\x3c\x66\x66\x7c\x60\x30\x1c\x0\x38\x38\x0\x0\x38\x38\x0\x0\x18\x18\x0\x0\x18\x18\xc\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7f\x0\x0\x7f\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3e\x63\x60\x30\x18\x0\x18\x0" "\x3e\x63\x63\x7b\x3b\x3\x7e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x66\x66\x3e\x66\x66\x3f\x0\x3c\x66\x3\x3\x3\x66\x3c\x0\x1f\x36\x66\x66\x66\x36\x1f\x0\x7f\x43\x3\x1f\x3\x43\x7f\x0\x7f\x46\x6\x3e\x6\x6\xf\x0\x3e\x63\x3\x3\x7b\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x3c\x18\x18\x18\x1b\x1b\xe\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x67\x6f\x7b\x73\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x63\x6b\x3e\x60\x3f\x63\x63\x3f\x1b\x33\x63\x0\x3e\x63\x3\x3e\x60\x63\x3e\x0\x7e\x5a\x18\x18\x18\x18\x3c\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x36\x1c\x8\x0\x63\x63\x6b\x6b\x7f\x77\x63\x0" "\x63\x36\x1c\x1c\x1c\x36\x63\x0\x66\x66\x66\x3c\x18\x18\x3c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x3e\x6\x6\x6\x6\x6\x3e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x3e\x30\x30\x30\x30\x30\x3e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x63\x7f\x63\x63\x0\x0\x0\x3f\x66\x3e\x66\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x0\x0\x3f\x66\x66\x66\x3f\x0\x0\x0\x7f\x3\x1f\x3\x7f\x0\x0\x0\x7f\x3\x1f\x3\x3\x0\x0\x0\x7e\x3\x73\x63\x3e\x0" "\x0\x0\x63\x63\x7f\x63\x63\x0\x0\x0\x3c\x18\x18\x18\x3c\x0\x0\x0\x78\x30\x30\x33\x1e\x0\x0\x0\x63\x33\x1f\x33\x63\x0\x0\x0\x3\x3\x3\x3\x3f\x0\x0\x0\x63\x77\x6b\x6b\x63\x0\x0\x0\x67\x6f\x6b\x7b\x73\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x66\x3e\x6\xf\x0\x0\x0\x3e\x63\x63\x3b\x6e\x0\x0\x0\x3f\x66\x3e\x36\x67\x0\x0\x0\x3e\x3\x3e\x60\x3e\x0\x0\x0\x7e\x5a\x18\x18\x3c\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x36\x1c\x8\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x66\x66\x3c\x18\x18\x0\x0\x0\x3f\x19\xc\x26\x3f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\xe\x18\x18\x70\x18\x18\xe\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x1c\x36\x36\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x40\xaa\x4\x0\x0\x0\x0\x1e\x33\x2d\x2d\x33\x1e\x0\x0\x7e\x66\x5a\x5a\x66\x7e\x0\x0\xfc\x84\xb4\xb4\x84\xfc\x0\x0\xf8\x48\x18\x88\x28\xf8\x0\x0\xf0\x30\x10\x10\x30\xf0\x0" "\x0\xc0\x60\x20\x20\x60\xc0\x0\x0\x80\xc0\x40\xc0\xc0\x80\x0\x0\x0\x80\x80\x80\x80\x0\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x2\x2\x3\x3\x0\x0\x3\x6\x4\x4\x6\x3\x0\x0\x7\xd\xc\x8\xe\x7\x0\x0\xf\x19\x16\x16\x19\xf\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x1\x3\x2\x3\x1\x0\x0\x0\x7\x9\x18\x9\x7\x0" "\x0\x1c\x63\xc1\x80\xc1\x63\x1c\x0\x0\x3\x5\x4\x5\x3\x0\x0\x0\x1f\x21\x10\x21\x1f\x0\x0\xfc\x7\xc1\x20\xc1\x7\xfc\x0\x0\x1\x2\x3\x2\x1\x0\x0\x7\xc\x9\x9\x9\xc\x7\x0\x1f\x70\xc1\x82\xc1\x70\x1f\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 31 FontEntry("THICK", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\x1e\x1e\x1e\xc\x0\xc\x0\x33\x66\xcc\x0\x0\x0\x0\x0\x0\x6c\xfe\x6c\x6c\xfe\x6c\x0\x3e\x6b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x60\x30\x18\x0\x0\x0\x0\x0" "\x30\x18\x18\x18\x18\x18\x18\x30\x6\xc\xc\xc\xc\xc\xc\x6\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc\x0\x0\xc0\x60\x30\x18\xc\x6\x0" "\x3e\x73\x7b\x7f\x77\x73\x3e\x0\x38\x3c\x38\x38\x38\x38\x38\x0\x3e\x73\x70\x38\x1c\xe\x7f\x0\x3e\x73\x70\x3c\x70\x73\x3e\x0\x73\x73\x73\x73\x7f\x70\x70\x0\x7f\x7\x7\x3f\x70\x70\x3f\x0\x3e\x67\x7\x3f\x67\x67\x3e\x0\x7f\x60\x70\x38\x1c\x1c\x1c\x0" "\x3e\x67\x67\x3e\x67\x67\x3e\x0\x3e\x73\x73\x7e\x70\x70\x3f\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x6\x0\x0\x18\xc\x6\xc\x18\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3e\x63\x70\x38\x1c\x0\x1c\x0" "\x3e\x63\x7b\x7b\x3b\x3\x3e\x0\x3e\x67\x67\x67\x7f\x67\x67\x0\x3f\x67\x67\x3f\x67\x67\x3f\x0\x3e\x67\x7\x7\x67\x67\x3e\x0\x3f\x67\x67\x67\x67\x67\x3f\x0\x7f\x7\x7\x7f\x7\x7\x7f\x0\x7f\x7\x7\x7f\x7\x7\x7\x0\x3e\x67\x7\x77\x67\x67\x3e\x0" "\x67\x67\x67\x7f\x67\x67\x67\x0\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x0\x70\x70\x70\x70\x73\x73\x3e\x0\x67\x37\x1f\xf\x1f\x37\x67\x0\x7\x7\x7\x7\x7\x7\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7f\x77\x67\x67\x0\x3e\x67\x67\x67\x67\x67\x3e\x0" "\x3f\x67\x67\x3f\x7\x7\x7\x0\x3e\x67\x67\x67\x67\x57\x2e\x40\x3f\x67\x67\x3f\x67\x67\x67\x0\x3e\x67\x7\x3e\x70\x73\x3e\x0\x7f\x1c\x1c\x1c\x1c\x1c\x1c\x0\x67\x67\x67\x67\x67\x67\x3e\x0\x67\x67\x67\x67\x67\x3e\x1c\x0\x63\x63\x63\x6b\x6b\x7f\x3f\x0" "\xc7\x6e\x3c\x18\x3c\x76\xe3\x0\x67\x67\x3e\x1c\x1c\x1c\x1c\x0\x7f\x70\x38\x1c\xe\x7\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x0\x6\xc\x18\x30\x60\xc0\x0\xe\xc\xc\xc\xc\xc\xc\xe\x18\x3c\x66\xc3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3e\x70\x7e\x73\x7e\x0\x3\x3\x3f\x67\x67\x67\x3f\x0\x0\x0\x3e\x67\x7\x67\x3e\x0\x60\x60\x7e\x73\x73\x73\x7e\x0\x0\x0\x3e\x67\x7f\x7\x7e\x0\x3c\xe\xe\x3f\xe\xe\xe\x0\x0\x0\x3e\x73\x73\x7e\x70\x3e" "\x3\x3\x3f\x67\x67\x67\x67\x0\x18\x0\x18\x1c\x1c\x1c\x1c\x0\x30\x0\x30\x38\x38\x38\x38\x1f\x3\x3\x33\x1b\xf\x1b\x33\x0\x18\x18\x1c\x1c\x1c\x1c\x1c\x0\x0\x0\x3f\x6b\x6b\x6b\x6b\x0\x0\x0\x3f\x67\x67\x67\x67\x0\x0\x0\x3e\x67\x67\x67\x3e\x0" "\x0\x0\x3f\x67\x67\x3f\x7\x7\x0\x0\x7e\x73\x73\x7e\x70\x70\x0\x0\x3f\x67\x7\x7\x7\x0\x0\x0\x7e\x7\x3e\x70\x3f\x0\x18\x18\x7e\x1c\x1c\x1c\x1c\x0\x0\x0\x67\x67\x67\x67\x7e\x0\x0\x0\x67\x67\x67\x36\x1c\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x67\x3e\x1c\x3e\x73\x0\x0\x0\x73\x73\x73\x7e\x70\x3f\x0\x0\x7f\x38\x1c\xe\x7f\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\x6\xc\xc\x18\xc\xc\x6\x0\xe\xdb\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 32 FontEntry("TINY", 6, 5, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x28\xaf\xbc\x2\x0\x0\x0\x40\x4c\x44\x46\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe2\x8\x0\x0\x0\x0\x0\x0\x1e\x0\x0\x0\x0\x6\x40\x44\x44\x0\x44\x29\x45\x0\x31\x84\x10\x60\x90\x11\xe\x18" "\x64\x90\x1\x42\x39\x84\x80\x13\xe\x19\xc0\x84\x53\x6\x38\x44\x8\x1\x44\x11\x45\x0\x51\xc\x19\x0\xc\x30\x0\x0\x0\x0\x0\x88\x8\x82\x0\xf0\xc0\x3\x20\x8\x22\x2\x0\x0\x0\x0\x0\x0\x0\x0\x51\xca\x29\x60\x94\x51\x6\x30\x21\x4\x3\x46" "\x29\x65\x80\x13\x4e\x38\xe0\x84\x11\x2\x30\xe1\x14\x3\x4a\x39\xa5\x0\x21\x84\x10\x40\x8\x21\x6\x28\x65\x94\x2\x42\x8\xe1\x80\xf4\x52\x4a\x20\xad\xd5\x12\x10\xa5\x14\x1\x46\x39\x21\x0\x51\x4a\x71\x60\x94\x51\xa\x30\x41\x90\x1\x8e\x10\x42\x80\x52" "\x4a\x39\xa0\x94\x52\x4\x48\x29\xbd\x4\x4a\x11\xa5\x80\x52\x84\x10\xe0\x10\x11\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x88\x2\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\xd8\x7a\x0\x84\x51\x4\x0\x26\x4\x3\x10\x72\xc9\x1\x60\xd2\x71\x0\x30" "\x71\x4\x0\x6e\xb1\x1\x40\x38\xa5\x0\x20\x80\x10\x0\x8\x20\x6\x0\xa1\x8c\x2\x40\x8\xc1\x0\x90\x5e\x4a\x0\xb4\x95\x12\x0\xa2\x14\x1\xc0\x28\x23\x0\x70\xca\x21\x0\x94\x15\x2\x0\x26\x98\x1\x80\x38\xc2\x0\x50\x4a\x31\x0\x94\x52\x4\x0\x29" "\xbd\x4\x40\x11\xa5\x0\x50\x8a\x18\x0\x1c\x32\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x6a\x5\x0\x30\xcf\x0\xf0\x42\x78\x0\x3e\x0\x1f\x80\xf\xe1\x7\x0\x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x20\xc4\x11\x0\x88\x23\x4\x0\x0\x0\x0" ), // Font no. 33 FontEntry("TINY_UPPERCASE", 6, 5, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x28\xaf\xbc\x2\x0\x0\x0\x40\x4c\x44\x46\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe2\x8\x0\x0\x0\x0\x0\x0\x1e\x0\x0\x0\x0\x6\x40\x44\x44\x0\x44\x29\x45\x0\x31\x84\x10\x60\x90\x11\xe\x18" "\x64\x90\x1\x42\x39\x84\x80\x13\xe\x19\xc0\x84\x53\x6\x38\x44\x8\x1\x44\x11\x45\x0\x51\xc\x19\x0\xc\x30\x0\x0\x0\x0\x0\x88\x8\x82\x0\xf0\xc0\x3\x20\x8\x22\x2\x0\x0\x0\x0\x0\x0\x0\x0\x51\xca\x29\x60\x94\x51\x6\x30\x21\x4\x3\x46" "\x29\x65\x80\x13\x4e\x38\xe0\x84\x11\x2\x30\xe1\x14\x3\x4a\x39\xa5\x0\x21\x84\x10\x40\x8\x21\x6\x28\x65\x94\x2\x42\x8\xe1\x80\xf4\x52\x4a\x20\xad\xd5\x12\x10\xa5\x14\x1\x46\x39\x21\x0\x51\x4a\x71\x60\x94\x51\xa\x30\x41\x90\x1\x8e\x10\x42\x80\x52" "\x4a\x39\xa0\x94\x52\x4\x48\x29\xbd\x4\x4a\x11\xa5\x80\x52\x84\x10\xe0\x10\x11\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x88\x2\x0\x0\x0\x0\x0\x0\x0\x0\x0\x51\xca\x29\x60\x94\x51\x6\x30\x21\x4\x3\x46\x29\x65\x80\x13\x4e\x38\xe0\x84" "\x11\x2\x30\xe1\x14\x3\x4a\x39\xa5\x0\x21\x84\x10\x40\x8\x21\x6\x28\x65\x94\x2\x42\x8\xe1\x80\xf4\x52\x4a\x20\xad\xd5\x12\x10\xa5\x14\x1\x46\x39\x21\x0\x51\x4a\x71\x60\x94\x51\xa\x30\x41\x90\x1\x8e\x10\x42\x80\x52\x4a\x39\xa0\x94\x52\x4\x48\x29" "\xbd\x4\x4a\x11\xa5\x80\x52\x84\x10\xe0\x10\x11\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x6a\x5\x0\x30\xcf\x0\xf0\x42\x78\x0\x3e\x0\x1f\x80\xf\xe1\x7\x0\x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x20\xc4\x11\x0\x88\x23\x4\x0\x0\x0\x0" ), // Font no. 34 FontEntry("XTSAMP", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x20\x60\xff\xff\x60\x20\x0\x0\x4\x6\xff\xff\x6\x4\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x18\x3c\x7e\xff\x0\x0\x0\x0\x0\x0\xff\x7e\x3c\x18\x0\x4\xc\x1c\x3c\x3c\x1c\xc\x4\x20\x30\x38\x3c\x3c\x38\x30\x20\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x0\x18\x0\x0\x36\x12\x0\x0\x0\x0\x0\x0\x0\x24\x7e\x24\x7e\x24\x0\x0\x10\x78\x1c\x70\x3c\x10\x0\x0\x40\x66\x30\x18\xc\x66\x0\x0\x0\x1c\x36\x5c\x36\x5c\x0\x0\x18\x10\x0\x0\x0\x0\x0" "\x0\x18\xc\x6\x6\xc\x18\x0\x0\x18\x30\x60\x60\x30\x18\x0\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x10\x0\x0\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x0\x40\x60\x30\x18\xc\x6\x0" "\x0\x3c\x66\x76\x6e\x66\x3c\x0\x0\x18\x1e\x18\x18\x18\x18\x0\x0\x3c\x66\x60\x30\x18\x7e\x0\x0\x3e\x60\x7e\x60\x60\x3e\x0\x0\x70\x78\x6c\x66\x7c\x60\x0\x0\x7e\x6\x3e\x60\x60\x3e\x0\x0\x7c\x6\x3e\x66\x66\x3c\x0\x0\x7e\x0\x30\x18\x18\x18\x0" "\x0\x3c\x66\x3c\x66\x66\x3c\x0\x0\x3c\x66\x66\x6c\x70\x1e\x0\x0\x0\x0\x18\x0\x0\x18\x0\x0\x0\x18\x0\x0\x18\x8\x0\x0\x30\x18\xc\x6\xc\x18\x0\x0\x0\x0\x3e\x0\x3e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x0\x0\x3c\x60\x60\x38\x0\x18\x0" "\x0\x1c\x22\x32\x32\x2\x3c\x0\x0\x7c\xe\x66\x7e\x66\x66\x0\x0\x3c\x6\x66\x3e\x66\x3e\x0\x0\x7c\x0\x6\x6\xe\x7c\x0\x0\x3e\x70\x66\x66\x66\x3e\x0\x0\x7e\x0\x6\x36\x6\x7e\x0\x0\x7e\x0\x6\x76\x6\x6\x0\x0\x7c\xe\x6\x76\x66\x3c\x0" "\x0\x66\x66\x66\x76\x66\x66\x0\x0\x18\x18\x18\x18\x18\x18\x0\x0\x7e\x0\x60\x60\x70\x3e\x0\x0\x66\x66\x26\x1e\x76\x66\x0\x0\x6\x6\x6\x6\x0\x7e\x0\x0\x46\x6e\x7e\x36\x46\x66\x0\x0\x66\x6e\x5e\x3e\x76\x66\x0\x0\x3c\x70\x66\x66\x66\x3c\x0" "\x0\x3e\x60\x66\x36\x6\x6\x0\x0\x3c\x66\x66\x56\x36\x6c\x0\x0\x3e\x60\x66\x1e\x36\x66\x0\x0\x7c\x6\x6\x7c\x60\x3e\x0\x0\x7e\x0\x18\x18\x18\x18\x0\x0\x66\x66\x66\x66\x70\x3c\x0\x0\x66\x66\x66\x6e\x2c\x8\x0\x0\x46\x46\x56\x56\x56\x3c\x0" "\x0\x42\x66\x2c\x18\x66\x42\x0\x0\x66\x66\x34\x30\x18\x18\x0\x0\x7e\x0\x30\x18\xc\x7e\x0\x0\x3e\x6\x6\x6\x6\x3e\x0\x0\x2\x6\xc\x18\x30\x60\x0\x0\x78\x60\x60\x60\x60\x78\x0\x0\x18\x3c\x66\x42\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x0" "\x0\xc\x18\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x6c\x66\x7c\x0\x0\x6\x6\x3e\x76\x66\x3e\x0\x0\x0\x0\x7c\xe\xe\x7c\x0\x0\x60\x60\x7c\x6e\x66\x7c\x0\x0\x0\x3e\x66\x76\x6\x7c\x0\x0\x78\x1c\xc\x3e\xc\xc\x0\x0\x0\x7c\x66\x7c\x60\x3c\x0" "\x0\x6\x6\x3e\x76\x66\x66\x0\x0\x0\x18\x0\x18\x18\x18\x0\x0\x18\x0\x18\x18\x18\xe\x0\x0\x6\x6\x36\x1e\x36\x66\x0\x0\x18\x18\x18\x18\x18\x18\x0\x0\x0\x0\x7f\xd6\xd6\xd6\x0\x0\x0\x0\x3f\x76\x66\x66\x0\x0\x0\x0\x3c\x66\x66\x3c\x0" "\x0\x0\x0\x3f\x66\x3e\x6\x0\x0\x0\x0\xfc\x66\x7c\x60\x0\x0\x0\x0\x78\x1c\xc\xc\x0\x0\x0\x0\x3c\xe\x78\x3e\x0\x0\xc\xc\xc\x1e\xc\xc\x0\x0\x0\x0\x0\x66\x66\x3e\x0\x0\x0\x0\x0\x66\x3c\x18\x0\x0\x0\x0\x56\x56\x7e\x6c\x0" "\x0\x0\x0\x0\x66\x3c\x66\x0\x0\x0\x0\x6c\x7c\x60\x3c\x0\x0\x0\x0\x7e\x30\x18\x7e\x0\x0\x30\x18\x18\x4\x18\x30\x0\x0\x18\x18\x18\x0\x18\x18\x0\x0\xc\x18\x18\x20\x18\xc\x0\x0\x0\x6c\x36\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x6c\x0\x3e\x6c\x66\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x66\x0\x7c\x6\x7e\x66\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x66\x0\x3c\x66\x66\x1c\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x66\x18\x6e\x66\x66\x3c\x0\x0\x66\x0\x66\x66\x66\x3c\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x3e\x3e\x3e\x3e\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 35 FontEntry("ZERO", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x42\x42\x42\x3c\x0\xff\xc3\xbd\xbd\xbd\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x2e\x3f\x1f\xe\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x60\x60\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x0\x18\x24\x24\x24\x24\x18\x0\x18\x1c\x1e\x18\x18\x18\x3e\x0\x3e\x63\x60\x30\xc\x6\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x66\x7f\x60\x60\x0\x7f\x3\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x2\x80\xc0\x60\x30\x30\x60\xc0\x80\x0\x0\x7e\x0\x7e\x0\x0\x0\x3\x6\xc\x18\x18\xc\x6\x3\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x8\x1c\x36\x63\x63\x7f\x63\x41\x3f\x61\x63\x3f\x63\x63\x3f\x0\x3e\x61\x3\x3\x43\x63\x3e\x0\x1f\x31\x63\x63\x63\x33\x1f\x0\x7f\x1\x3\x1f\x3\x3\x7f\x0\x7f\x41\x3\x1f\x13\x3\x3\x0\x3e\x61\x3\x7b\x43\x63\x5e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x30\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x7b\x33\x3e\x60\x3f\x66\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\x8\x8\x1c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x6\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x55\xaa\xff\x0\xff\xaa\x55\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x8\x0\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x8\x10\x18\xbe\x7d\x18\x8\x10" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 36 FontEntry("ZIRCFONT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x10\x18\x18\x18\x8\x0\x18\x0\x22\x36\x34\x0\x0\x0\x0\x0\x0\x44\x7f\x64\x27\x7e\x22\x0\x10\x7e\x19\x3e\x6c\x3f\x4\x0\x0\x41\x63\x30\xc\x46\x63\x0\x1c\x26\x36\x1c\x7e\x19\x27\x0\x8\xc\x6\x0\x0\x0\x0\x0" "\x18\xc\x6\x2\x6\xc\x38\x0\xe\x18\x30\x20\x30\x18\xc\x0\x0\x4\x6c\x1f\x78\x16\x33\x0\x0\x8\x18\x78\x1e\x18\x10\x0\x0\x0\x0\x0\x0\x10\x18\xc\x0\x0\x0\x7c\x1f\x0\x0\x0\x0\x0\x0\x0\x0\x18\x10\x0\x60\x30\x10\x8\xc\x6\x3\x0" "\x1e\x30\x69\x4d\x67\x33\x1e\x0\x8\xc\x8\x8\x8\x3c\xe\x0\x3e\x67\x60\x38\xc\x76\x1f\x0\x7e\x60\x38\x6c\x41\x63\x3e\x0\x24\x26\x36\x32\x7f\x10\x10\x0\x3f\x1\x3f\x63\x40\x73\x3e\x0\x3c\x6\x3\x3b\x67\x66\x3c\x0\x3e\x67\x20\x30\x18\x18\x8\x0" "\x4e\x62\x36\x1c\x36\x33\x1e\x0\x5e\x63\x61\x73\x6c\x20\x20\x0\x0\x10\x18\x0\x0\x18\x8\x0\x0\x8\x18\x0\x0\x10\x18\xc\x18\xc\x6\x3\x6\x1c\x30\x0\x0\x0\x7e\x0\x1e\x78\x0\x0\x6\x1c\x30\x60\x30\x18\xc\x0\x3c\x66\x22\x30\x18\x0\x18\x0" "\x3c\x42\x79\x65\x79\x3\x3e\x0\x8\x8\x1c\x14\x3e\x63\xc1\x0\x3e\x63\x64\x3c\x64\x66\x3f\x0\x7c\xe\x3\x3\x43\x63\x3e\x0\x3e\x63\x40\x44\x64\x36\x1f\x0\x7c\x6\x2\x3f\x2\x6\x7c\x0\x7a\xf\x2\x1e\x7\x6\x6\x0\x1c\x32\x3\x39\x63\x66\x3c\x0" "\x20\x21\x21\x7f\x33\x22\x22\x0\x3c\x10\x18\x18\x18\x8\x3c\x0\x7c\x20\x20\x60\x60\x67\x3c\x0\x62\x32\x1a\xe\x1e\x33\x42\x0\x2\x2\x3\x3\x2\x7a\x3f\x0\x23\x37\x7d\x69\x49\x41\x41\x0\x21\x23\x63\x67\x65\x4d\x79\x0\x3c\xe\x43\x41\x63\x36\x1c\x0" "\x3e\x43\x64\x3e\x6\x6\x2\x0\x1e\x32\x60\x6d\x31\x3b\x6e\x0\x3e\x43\x64\x3e\xe\x36\x62\x0\x3c\x46\x2\x1c\x70\x61\x3e\x0\x78\x1f\x8\xc\xc\x4\x4\x0\x43\x43\x43\x61\x61\x33\x1e\x0\x41\x43\x62\x26\x24\x1c\x18\x0\x41\x41\x69\x6b\x2b\x3f\x36\x0" "\x1\x62\x36\x1c\x1c\x36\x63\x0\x41\x62\x66\x3c\x18\xc\x6\x0\x3f\x30\x18\x8\xc\x66\x3e\x0\x3e\x2\x6\x6\x6\x4\x1c\x0\x2\x6\xc\x8\x18\x30\x60\x0\x3c\x20\x30\x30\x30\x10\x1e\x0\x8\x3c\x66\x41\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf8\x1f" "\x4\xc\x18\x0\x0\x0\x0\x0\x0\x0\x2c\x32\x61\x63\x5e\x0\x2\x2\x3b\x67\x43\x61\x3d\x0\x0\x0\x3c\x6\x3\x71\x3e\x0\x20\x20\x6e\x73\x61\x43\x5e\x0\x0\x0\x3e\x33\x1b\x6\x7c\x0\x38\xc\x4\x3c\xe\x8\x8\x0\x0\x0\x5e\x63\x61\x6e\x20\x1e" "\x1\x1\x1b\x37\x63\x42\x42\x0\x0\x10\x0\x10\x18\x18\x8\x0\x0\x8\x0\x8\x18\x18\x10\xe\x2\x2\x23\x1b\xf\x11\x21\x0\x8\x8\x18\x18\x18\x10\x10\x0\x0\x0\x35\x7f\x4b\x49\x49\x0\x0\x0\xd\x1b\x31\x31\x21\x0\x0\x0\x1e\x21\x63\x66\x3c\x0" "\x0\x0\x39\x4d\x67\x3b\x2\x2\x0\x0\x2e\x39\x33\x3e\x10\x10\x0\x0\x19\x37\x3\x2\x2\x0\x0\x0\x1e\x7\x3c\x60\x3e\x0\x10\x10\x7e\x18\x18\x8\x8\x0\x0\x0\x44\x46\x66\x72\x4c\x0\x0\x0\x61\x33\x16\x1c\x8\x0\x0\x0\x42\x43\x6b\x69\x36\x0" "\x0\x0\x31\x1e\xc\x16\x23\x0\x0\x0\x43\x26\x3c\x18\xc\x3\x0\x0\x3c\x33\x8\x6\x3f\x0\x18\xc\x4\x3\x4\xc\x38\x0\x8\x18\x8\x10\x18\x18\x10\x0\xe\x10\x10\x60\x10\x18\xe\x0\x4c\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x41\x14\x0\x0\x0\x0\x18\x19\xf\x3c\x36\x6\x0\x0\x42\x76\x1c\x3c\x66\x43\x0\x0\x18\xd8\xf0\x3c\x6e\x60\x0\x0\x60\x60\xf8\xfc\x60\x40\x0\x0\x80\x98\xf0\xc0\x60\x60\x0" "\x0\x20\x60\xc0\xc0\x60\x30\x0\x0\x80\x80\x0\xc0\xe0\x0\x0\x0\x0\x0\x80\xc0\x0\x0\x0\x0\x0\x0\x3\x1\x0\x0\x0\x0\x1\x1\x0\x3\x3\x0\x0\x0\x4\x7\x1\x3\x6\x4\x0\x0\x1\x1d\xf\x3\x6\x6\x0\x0\x6\x6\x3f\x1f\x6\x4\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x24\x42\x3c\x0\xff\xff\x0\x18\x24\x42\x5a\x0\xff\xff\x0\x18\x3c\x7e\x3c\x0\xff\xff\x0\xe7\x5a\x42\x42\xe7\x0\x0\x0\x18\x18\x0\x0\x0\x0\x2\x3\x3\x2\x3\x1\x0\x0\x2\x3\x13\x3a\x1b\x11\x10" "\x0\x32\x33\x13\x3a\x1b\x11\x10\x1\x3\x1\x3\x6\x6\x0\x0\x1\x3\x1\x43\x26\x66\x30\x10\x1\x33\x71\x63\x26\x66\x30\x10\x0\x2\x3\x1\x0\x0\x0\x0\x0\x2\x33\x31\x6\x7\x3\x2\x20\x62\x73\x31\x26\x67\x63\x2\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), }; const unsigned int numFontsEntries = 37; milkytracker-0.90.85+dfsg/src/tools/test.cpp0000644000175000017500000000427311150223367020043 0ustar admin2admin2/* * tools/test.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #include #include using namespace std; const int breakl = 16; const int seekpos = 0; const char* hextab = "0123456789abcdef"; void btoh(unsigned char i, char* input) { input[0] = hextab[i>>4]; input[1] = hextab[i&0xf]; input[2] = '\0'; } int main(int argc, const char* argv[]) { if (argc != 3) { cerr << "Forgot your parameters?"; exit(-1); } FILE* infile = fopen(argv[1],"rb"); if (!infile) { cerr << "Could not open " << argv[1] << endl; exit(0); } fseek(infile, seekpos, 0); FILE* outfile = fopen(argv[2],"wb"); if (!outfile) { cerr << "Could not create " << argv[2] << endl; exit(0); } int bytesread = 0; int colcnt = 0; do { unsigned char buffer[3*10]; bytesread = fread(buffer, 1, sizeof(buffer), infile); /*for (int j = 0; j < bytesread/3; j++) { unsigned char v1 = buffer[j*3+2]; unsigned char v2 = buffer[j*3+1]; unsigned char v3 = buffer[j*3+0]; buffer[j*3+0] = v1; buffer[j*3+1] = v2; buffer[j*3+2] = v3; }*/ for (int i = 0; i < bytesread; i++) { char outbuffer[100]; outbuffer[0] = '0'; outbuffer[1] = 'x'; btoh(buffer[i], outbuffer+2); outbuffer[4] = ','; outbuffer[5] = '\0'; if (colcnt == breakl) { strcat(outbuffer, "\n"); colcnt = 0; } fwrite(outbuffer, 1, strlen(outbuffer), outfile); colcnt++; } } while (bytesread != 0); fclose(outfile); fclose(infile); return 0; } milkytracker-0.90.85+dfsg/src/ppui/0000755000175000017500000000000011317506534016174 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/PPPath.h0000644000175000017500000001572711150223367017510 0ustar admin2admin2/* * ppui/PPPath.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPPath.h * MilkyTracker * * Created by Peter Barth on 12.10.06. * */ #ifndef __PPPATH_H__ #define __PPPATH_H__ #include "BasicTypes.h" class PPPathEntry { public: enum Type { Nonexistent, Hidden, File, Directory }; protected: PPSystemString name; Type type; pp_uint32 size; public: PPPathEntry() { } virtual ~PPPathEntry() { } virtual void create(const PPSystemString& path, const PPSystemString& name) { this->name = name; type = Nonexistent; size = 0; } virtual const PPSystemString& getName() const { return name; } virtual bool isFile() const { return type == File; } virtual bool isDirectory() const { return type == Directory; } virtual pp_uint32 getSize() const { return size; } virtual bool isHidden() const { return type == Hidden; } virtual bool isDrive() const { return false; } virtual bool isParent() const { static const PPSystemString temp(".."); return name.compareTo(temp) == 0; } virtual bool compareTo(const PPPathEntry& src) const { if (name.compareTo(src.name) != 0) return false; return (type == src.type && size == src.size); } virtual PPPathEntry* clone() const { // check if this is the correct type PPPathEntry* result = new PPPathEntry(); result->name = name; result->type = type; result->size = size; return result; } class PathSortRuleInterface { public: virtual pp_int32 compare(const PPPathEntry& left, const PPPathEntry& right) const = 0; }; class PathSortByFileRule : public PathSortRuleInterface { public: virtual pp_int32 compare(const PPPathEntry& left, const PPPathEntry& right) const { // no drives if (!left.isDrive() && !right.isDrive()) { if (left.isFile() && right.isFile()) { return left.getName().compareToNoCase(right.getName()); } else if (left.isDirectory() && right.isDirectory()) { if (!left.isParent() && !right.isParent()) return left.getName().compareToNoCase(right.getName()); else if (left.isParent()) return -1; else return 1; } else { if (left.isDirectory() && right.isFile()) return -1; else return 1; } } // drives else if (left.isDrive() && right.isDrive()) { return left.getName().compareToNoCase(right.getName()); } else { if (left.isDrive() && !right.isDrive()) return 1; else return -1; } } }; class PathSortBySizeRule : public PathSortRuleInterface { public: virtual pp_int32 compare(const PPPathEntry& left, const PPPathEntry& right) const { // both are files if (!left.isDirectory() && !right.isDirectory()) { if (left.getSize() != right.getSize()) return left.getSize() - right.getSize(); else return left.getName().compareToNoCase(right.getName()); } // directory else if (left.isDirectory() && right.isDirectory()) { PathSortByFileRule comparator; return comparator.compare(left, right); } else { if (left.isDirectory() && !right.isDirectory()) return -1; else return 1; } } }; class PathSortByExtRule : public PathSortRuleInterface { public: virtual pp_int32 compare(const PPPathEntry& left, const PPPathEntry& right) const { // both are files if (!left.isDirectory() && !right.isDirectory()) { pp_int32 diff = left.getName().compareExtensions(right.getName()); if (diff == 0) return left.getName().compareToNoCase(right.getName()); else return diff; } // directory else if (left.isDirectory() && right.isDirectory()) { PathSortByFileRule comparator; return comparator.compare(left, right); } else { if (left.isDirectory() && !right.isDirectory()) return -1; else return 1; } } }; private: static pp_int32 partition(PPPathEntry** a, pp_int32 left, pp_int32 right, const PathSortRuleInterface& sortRule, bool descending = false) { const pp_int32 sign = descending ? -1 : 1; pp_int32 first=left, pivot=right--; while(left<=right) { while(sortRule.compare(*a[left], *a[pivot])*sign < 0/*a[left]=first)&&(sortRule.compare(*a[right], *a[pivot])*sign >= 0/*a[right]>=a[pivot]*/)) right--; if(left=right) return; p = partition(array, left, right, sortRule, descending); sortInternal(array, left,p-1, sortRule, descending); sortInternal(array, p+1, right, sortRule, descending); /*const pp_int32 sign = descending ? -1 : 1; pp_int32 i,j; PPPathEntry* x; PPPathEntry* y; i=l; j=r; x=array[(l+r)/2]; do { while (sortRule.compare(*array[i], *x)*sign < 0) i++; while (sortRule.compare(*x, *array[j])*sign < 0 && j > 0) j--; if (i <= j) { y=array[i]; array[i]=array[j]; array[j]=y; i++; j--; } } while (i<=j); if (l. * */ #include "Graphics.h" #include "Font.h" #include "fastfill.h" #define BPP 2 PPGraphics_16BIT::PPGraphics_16BIT(pp_int32 w, pp_int32 h, pp_int32 p, void* buff) : PPGraphicsFrameBuffer(w, h, p, buff) { } void PPGraphics_16BIT::setPixel(pp_int32 x, pp_int32 y) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*y+x; *buff = color16; } } void PPGraphics_16BIT::setPixel(pp_int32 x, pp_int32 y, const PPColor& color) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint16 col16 = (((pp_uint16)((color.r)>>3)<<11)+((pp_uint16)((color.g)>>2)<<5)+(pp_uint16)((color.b)>>3)); pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*y+x; *buff = col16; } } void PPGraphics_16BIT::fill(PPRect rect) { if (rect.y1 < currentClipRect.y1) rect.y1 = currentClipRect.y1; if (rect.x1 < currentClipRect.x1) rect.x1 = currentClipRect.x1; if (rect.y2 > currentClipRect.y2) rect.y2 = currentClipRect.y2; if (rect.x2 > currentClipRect.x2) rect.x2 = currentClipRect.x2; pp_uint32 col32 = (((pp_uint32)color16) << 16) + color16; const pp_int32 hPitch = pitch>>1; pp_uint16* dest = (pp_uint16*)buffer+hPitch*rect.y1+rect.x1; const pp_int32 width = rect.x2 - rect.x1; const pp_int32 height = rect.y2 - rect.y1; const pp_int16 color16 = this->color16; for (pp_int32 y = 0; y < height; y++) { pp_uint16* buff = dest; pp_int32 len = width; if (reinterpret_cast (buff) & 3) { *buff++ = color16; len--; } pp_uint32* buff32 = (pp_uint32*)buff; fill_dword(buff32, col32, len>>1); if (len&1) *((pp_uint16*)(buff32+(len>>1))) = color16; dest+=hPitch; } } void PPGraphics_16BIT::fill() { fill(currentClipRect); } void PPGraphics_16BIT::drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) { pp_int32 lx = x1; pp_int32 rx = x2; if (x1 > x2) { pp_int32 h = x2; x2 = x1; x1 = h; } if (lx < currentClipRect.x1) lx = currentClipRect.x1; if (rx > currentClipRect.x2) rx = currentClipRect.x2; if (y < currentClipRect.y1) return; if (y >= currentClipRect.y2) return; pp_uint32 col32 = (((pp_uint32)color16) << 16) + color16; pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*y+lx; pp_int32 len = rx-lx; if (len <= 0) return; if (reinterpret_cast (buff) & 3) { *buff++ = color16; len--; } pp_uint32* buff32 = (pp_uint32*)buff; fill_dword(buff32, col32, len>>1); if (len&1) *((pp_uint16*)(buff32+(len>>1))) = color16; } void PPGraphics_16BIT::drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) { pp_int32 ly = y1; pp_int32 ry = y2; if (y1 > y2) { pp_int32 h = y2; y2 = y1; y1 = h; } if (ly < currentClipRect.y1) ly = currentClipRect.y1; if (ry > currentClipRect.y2) ry = currentClipRect.y2; if (x < currentClipRect.x1) return; if (x >= currentClipRect.x2) return; pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*ly+x; for (pp_int32 y = ly; y < ry; y++) { *buff = color16; buff+=pitch>>1; } } void PPGraphics_16BIT::drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSLINETEMPLATE } void PPGraphics_16BIT::drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSAALINETEMPLATE } void PPGraphics_16BIT::blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { pp_int32 w = size.width; pp_int32 h = size.height; const pp_uint32 bytesPerPixel = bpp; if (intensity == 256) { pp_uint16* dst = (pp_uint16*)((pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP)); for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { *dst = (((pp_uint16)((src[0])>>3)<<11)+((pp_uint16)((src[1])>>2)<<5)+(pp_uint16)((src[2])>>3)); dst++; src+=bytesPerPixel; } dst+=this->pitch/BPP - w; src+=pitch - w*bytesPerPixel; } } else { pp_uint16* dst = (pp_uint16*)((pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP)); for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { *dst = (((pp_uint16)((src[0]*intensity/256)>>3)<<11)+((pp_uint16)((src[1]*intensity/256)>>2)<<5)+(pp_uint16)((src[2]*intensity/256)>>3)); dst++; src+=bytesPerPixel; } dst+=this->pitch/BPP - w; src+=pitch - w*bytesPerPixel; } } } void PPGraphics_16BIT::drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 charDim = currentFont->charDim; if (x + (signed)charWidth < currentClipRect.x1 || x > currentClipRect.x2 || y + (signed)charHeight < currentClipRect.y1 || y > currentClipRect.y2) return; /*pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; if (x>= currentClipRect.x1 && x + (signed)currentFont->charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + (signed)currentFont->charHeight < currentClipRect.y2) { for (pp_uint32 i = 0; i < currentFont->charHeight; i++) { pp_uint8* buff = (pp_uint8*)buffer + (y+i)*pitch + x*3; for (pp_uint32 j = 0; j < currentFont->charWidth; j++) { if (currentFont->getPixelBit(chr, j,i)) { buff[0] = b; buff[1] = g; buff[2] = r; } buff+=3; } } } else { for (pp_uint32 i = 0; i < currentFont->charHeight; i++) for (pp_uint32 j = 0; j < currentFont->charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && currentFont->getPixelBit(chr, j,i)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*3); buff[0] = b; buff[1] = g; buff[2] = r; } } }*/ Bitstream* bitstream = currentFont->bitstream; pp_uint8* fontbuffer = bitstream->buffer; pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*y+x; const pp_uint32 cchrDim = chr*charDim; const pp_uint32 incr = (pitch>>1)-(charWidth); if (x>= currentClipRect.x1 && x + charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + charHeight < currentClipRect.y2) { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if ((fontbuffer[xChr>>3]>>(xChr&7)&1)) { *buff = color16; } buff++; xChr++; } buff+=incr; yChr+=charWidth; } } else { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && (fontbuffer[xChr>>3]>>(xChr&7)&1)) { pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*(y+i)+(x+j); *buff = color16; } xChr++; } yChr+=charWidth; } } if (underlined) drawHLine(x, x+charWidth, y+charHeight); } void PPGraphics_16BIT::drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 sx = x; while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; case '\n': y+=charHeight; x=sx-charWidth; break; default: drawChar(*str, x, y, underlined); } x += charWidth; str++; } } void PPGraphics_16BIT::drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; default: drawChar(*str, x, y, underlined); } y += charHeight; str++; } } milkytracker-0.90.85+dfsg/src/ppui/MessageBoxContainer.cpp0000644000175000017500000001427111150223367022600 0ustar admin2admin2/* * ppui/MessageBoxContainer.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "GraphicsAbstract.h" #include "Button.h" #include "MessageBoxContainer.h" #include "Font.h" #include "BasicTypes.h" #include "PPUIConfig.h" #include "Screen.h" #include "SimpleVector.h" PPMessageBoxContainer::PPMessageBoxContainer(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, const PPString& caption) : PPContainer(id, parentScreen, eventListener, location, size), caption(caption), captured(false) { PPContainer::setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorMessageBoxContainer)); PPFont* font = PPFont::getFont(PPFont::FONT_SYSTEM); captionSize = 2 + 2*2 + font->getCharHeight() + 1; buttonLocation = location; buttonLocation.y+=captionSize; buttonSize = size; buttonSize.height-=captionSize; button = new PPButton(-1, NULL, NULL, buttonLocation, buttonSize, false, false, false); button->setColor(*PPContainer::color); } PPMessageBoxContainer::~PPMessageBoxContainer() { delete button; } void PPMessageBoxContainer::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; PPColor bColor = *color, dColor = *color, vbColor = *color; // adjust dark color dColor.scaleFixed(32768); bColor.scaleFixed(87163); vbColor.scaleFixed(131072); g->setColor(*color); g->setRect(location.x, location.y, location.x + size.width, location.y + captionSize); g->fill(); //g->fill(); button->paint(g); g->setRect(location.x, location.y, location.x + size.width, location.y + size.height); g->setColor(bColor); g->drawHLine(location.x, location.x + size.width, location.y); g->drawVLine(location.y, location.y + size.height, location.x); g->drawHLine(location.x + 2, location.x + size.width - 2, location.y + size.height - 3); g->drawVLine(location.y + 2, location.y + size.height - 2, location.x + size.width - 3); g->setColor(dColor); g->drawHLine(location.x + 2, location.x + size.width - 2, location.y + 2); g->drawVLine(location.y + 2, location.y + size.height - 2, location.x + 2); g->drawHLine(location.x, location.x + size.width, location.y + size.height - 1); g->drawVLine(location.y, location.y + size.height, location.x + size.width - 1); // seperator g->setColor(dColor); PPFont* font = PPFont::getFont(PPFont::FONT_SYSTEM); g->drawHLine(location.x + 2, location.x + size.width - 3, location.y + captionSize-1); g->setColor(bColor); g->drawHLine(location.x + 3, location.x + size.width - 2, location.y + captionSize); pp_int32 cx = size.width / 2 - font->getStrWidth(caption) / 2; g->setColor(0,0,0); g->drawString(caption, location.x + cx + 1, location.y + 5); g->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); g->drawString(caption, location.x + cx , location.y + 4); paintControls(g); } void PPMessageBoxContainer::setSize(const PPSize& size) { PPContainer::setSize(size); buttonSize = size; buttonSize.height-=captionSize; button->setSize(buttonSize); } void PPMessageBoxContainer::setLocation(const PPPoint& location) { PPContainer::setLocation(location); buttonLocation = location; buttonLocation.y+=captionSize; button->setLocation(buttonLocation); } pp_int32 PPMessageBoxContainer::dispatchEvent(PPEvent* event) { switch (event->getID()) { case eLMouseDown: lastCapturePoint = *reinterpret_cast(event->getDataPtr()); captured = isPointInCaption(lastCapturePoint); if (captured) return 0; break; case eLMouseDrag: if (handleMove(*reinterpret_cast(event->getDataPtr()))) return 0; break; case eLMouseUp: if (captured) { captured = false; return 0; } break; } return PPContainer::dispatchEvent(event); } bool PPMessageBoxContainer::isPointInCaption(const PPPoint& point) { PPSimpleVector& controls = getControls(); for (pp_int32 i = 0; i < controls.size(); i++) if (controls.get(i)->hit(point)) return false; return hit(point); //return (point.x >= location.x && point.x <= location.x + size.width && // point.y >= location.y && point.y <= location.y + captionSize); } bool PPMessageBoxContainer::handleMove(PPPoint point) { if (!captured) return false; const pp_int32 catchBound = 4; const pp_int32 dcatchBound = catchBound*2; const pp_int32 width = size.width; const pp_int32 height = size.height; bool ignorex = (point.x < -(width-dcatchBound)) || (point.x >= parentScreen->getWidth() + (width - dcatchBound)); bool ignorey = (point.y < -(height-dcatchBound)) || (point.y >= parentScreen->getHeight() + (height - dcatchBound));; PPPoint delta(ignorex ? 0 : point.x - lastCapturePoint.x, ignorey ? 0 : point.y - lastCapturePoint.y); if (!ignorex) lastCapturePoint.x = point.x; if (!ignorey) lastCapturePoint.y = point.y; if (location.x + delta.x < -(width-dcatchBound)) { delta.x += -(width-dcatchBound) - (location.x + delta.x); } if (location.y + delta.y < -(height-dcatchBound)) { delta.y += -(height-dcatchBound) - (location.y + delta.y); } if (location.x + delta.x >= parentScreen->getWidth() - dcatchBound) { delta.x -= (location.x + delta.x) - (parentScreen->getWidth() - dcatchBound); } if (location.y + delta.y >= parentScreen->getHeight() - dcatchBound) { delta.y -= (location.y + delta.y) - (parentScreen->getHeight() - dcatchBound); } move(delta); PPPoint buttonPos = button->getLocation(); buttonPos.x+=delta.x; buttonPos.y+=delta.y; button->setLocation(buttonPos); parentScreen->paint(); return true; } milkytracker-0.90.85+dfsg/src/ppui/DialogFileSelector.cpp0000755000175000017500000003667111150223367022413 0ustar admin2admin2/* * ppui/DialogFileSelector.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogFileSelector.cpp * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #include "DialogFileSelector.h" #include "Screen.h" #include "StaticText.h" #include "MessageBoxContainer.h" #include "Font.h" #include "ListBox.h" #include "ListBoxFileBrowser.h" #include "CheckBox.h" #include "PPPathFactory.h" enum ControlIDs { DISKMENU_STATICTEXT_FILTEREXTENSIONS = PP_MESSAGEBOX_BUTTON_USER6, DISKMENU_CHECKBOX_FILTEREXTENSIONS, DISKMENU_STATICTEXT_SORTBY, DISKMENU_BUTTON_SORTBY, DISKMENU_BUTTON_SORTORDER, }; pp_int32 DialogFileSelector::OverwritePromptResponder::ActionOkay(PPObject* sender) { PPEvent event(eCommand); return dialogFileSelector.baseClassHandleEvent(dialogFileSelector.getMessageBoxContainer()->getControlByID(PP_MESSAGEBOX_BUTTON_OK), &event); } pp_int32 DialogFileSelector::OverwritePromptResponder::ActionCancel(PPObject* sender) { dialogFileSelector.show(); // avoid removal of modal dialog box after we're out of here return 1; } DialogFileSelector::DialogFileSelector(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, bool editfileName/* = false*/, bool overwritePrompt/* = false*/, bool selectDirectories/* = false*/) : PPDialogBase(), doOverwritePrompt(overwritePrompt), allowSelectDirectories(selectDirectories), allowEditFileName(editfileName), sortAscending(true) { initDialog(screen, responder, id, caption, 310, 230, 26, "Ok", "Cancel"); PPControl* text = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION); text->setLocation(PPPoint(text->getLocation().x, text->getLocation().y - 4)); pp_int32 x = getMessageBoxContainer()->getLocation().x; pp_int32 width = getMessageBoxContainer()->getSize().width; pp_int32 height = getMessageBoxContainer()->getSize().height; PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_YES)); pp_int32 y2 = button->getLocation().y; pp_int32 x2 = x + width / 2 - 65; button->setLocation(PPPoint(x2+5,y2)); button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_CANCEL)); x2 = x + width / 2 + 5; button->setLocation(PPPoint(x2+5,y2)); y2 = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y + 14 + 16; pp_int32 listBoxWidth = (240*width)>>8; x2 = x + width / 2 - (listBoxWidth>>1); pp_uint32 x3 = x2+3; pp_uint32 size = 6*8+4; pp_uint32 space = 6; button = new PPButton(PP_MESSAGEBOX_BUTTON_USER4, screen, this, PPPoint(x3, y2 - 16), PPSize(size, 12)); button->setText("Prev."); messageBoxContainerGeneric->addControl(button); x3+=button->getSize().width + space; button = new PPButton(PP_MESSAGEBOX_BUTTON_USER5, screen, this, PPPoint(x3, y2 - 16), PPSize(size, 12)); button->setText("Next"); messageBoxContainerGeneric->addControl(button); x3+=button->getSize().width + space; button = new PPButton(PP_MESSAGEBOX_BUTTON_USER2, screen, this, PPPoint(x3, y2 - 16), PPSize(size, 12)); button->setText("Parent"); messageBoxContainerGeneric->addControl(button); x3+=button->getSize().width + space; button = new PPButton(PP_MESSAGEBOX_BUTTON_USER3, screen, this, PPPoint(x3, y2 - 16), PPSize(size, 12)); button->setText("Root"); messageBoxContainerGeneric->addControl(button); x3+=button->getSize().width + space; button = new PPButton(PP_MESSAGEBOX_BUTTON_USER1, screen, this, PPPoint(x3, y2 - 16), PPSize(size+2, 12)); button->setText("Home"); messageBoxContainerGeneric->addControl(button); x3+=button->getSize().width + space; { pp_uint32 x3 = x2+3; pp_uint32 y3 = y2 + 3; PPControl* ctrl; ctrl = new PPStaticText(DISKMENU_STATICTEXT_SORTBY, NULL, NULL, PPPoint(x3, y3), "Sort by:", true); messageBoxContainerGeneric->addControl(ctrl); x3+=8*8; button = new PPButton(DISKMENU_BUTTON_SORTBY, screen, this, PPPoint(x3, y3-1), PPSize(51, 11), false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Extension"); messageBoxContainerGeneric->addControl(button); button = new PPButton(DISKMENU_BUTTON_SORTORDER, screen, this, PPPoint(x3+button->getSize().width, y3-1), PPSize(13, 11), false); button->setText(sortAscending ? "\xfd" : "\xfe"); messageBoxContainerGeneric->addControl(button); x3+=114; ctrl = new PPStaticText(DISKMENU_STATICTEXT_FILTEREXTENSIONS, NULL, NULL, PPPoint(x3, y3), "Type filter:", true); messageBoxContainerGeneric->addControl(ctrl); ctrl = new PPCheckBox(DISKMENU_CHECKBOX_FILTEREXTENSIONS, screen, this, PPPoint(x3 + 12*8+2, y3-1)); messageBoxContainerGeneric->addControl(ctrl); } y2 = getMessageBoxContainer()->getControlByID(DISKMENU_STATICTEXT_SORTBY)->getLocation().y + 14; listBoxFiles = new PPListBoxFileBrowser(MESSAGEBOX_LISTBOX_USER1, screen, this, PPPoint(x2, y2), PPSize(listBoxWidth, height - (122))); listBoxFiles->setFilePrefix(""); listBoxFiles->setDirectoryPrefix(""); listBoxFiles->setDirectorySuffixPathSeperator(); listBoxFiles->setSortAscending(sortAscending); messageBoxContainerGeneric->addControl(listBoxFiles); editFieldCurrentFile = new PPListBox(MESSAGEBOX_LISTBOX_USER1+1, screen, this, PPPoint(x2, y2+listBoxFiles->getSize().height + 4), PPSize(listBoxWidth,12), true, editfileName, false); editFieldCurrentFile->setBorderColor(messageBoxContainerGeneric->getColor()); editFieldCurrentFile->showSelection(false); editFieldCurrentFile->setMaxEditSize(4096); editFieldCurrentFile->addItem(""); editFieldCurrentFile->setSingleButtonClickEdit(true); messageBoxContainerGeneric->addControl(editFieldCurrentFile); overwritePrompResponder = new OverwritePromptResponder(*this); overwritePromptMessageBox = new PPDialogBase(screen, overwritePrompResponder, PP_DEFAULT_ID, "Overwrite existing file?"); fileFullPath = new PPSystemString(); initialPath = new PPSystemString(listBoxFiles->getCurrentPathAsString()); } DialogFileSelector::~DialogFileSelector() { delete initialPath; delete fileFullPath; delete overwritePromptMessageBox; } pp_int32 DialogFileSelector::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eKeyDown || event->getID() == eKeyUp || event->getID() == eKeyChar) { return processKeys(sender, event); } else if (event->getID() == eCommand) { switch (reinterpret_cast(sender)->getID()) { case PP_MESSAGEBOX_BUTTON_OK: { return confirm(); } case PP_MESSAGEBOX_BUTTON_USER1: { gotoHome(); break; } case PP_MESSAGEBOX_BUTTON_USER2: { gotoParent(); break; } case PP_MESSAGEBOX_BUTTON_USER3: { gotoRoot(); break; } case PP_MESSAGEBOX_BUTTON_USER4: { prev(); break; } case PP_MESSAGEBOX_BUTTON_USER5: { next(); break; } case DISKMENU_BUTTON_SORTBY: listBoxFiles->cycleSorting(); refresh(); break; case DISKMENU_BUTTON_SORTORDER: sortAscending = !sortAscending; listBoxFiles->setSortAscending(sortAscending); refresh(); break; case DISKMENU_CHECKBOX_FILTEREXTENSIONS: updateFilter(); break; default: return PPDialogBase::handleEvent(sender, event); } } else if (reinterpret_cast(sender) == listBoxFiles && event->getID() == eConfirmed) { pp_int32 index = *((pp_int32*)event->getDataPtr()); return confirm(*listBoxFiles->getPathEntry(index)); } else if (reinterpret_cast(sender) == listBoxFiles && event->getID() == eSelection) { updateSelection(*((pp_int32*)event->getDataPtr())); return PPDialogBase::handleEvent(sender, event); } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { case MESSAGEBOX_LISTBOX_USER1+1: { const PPString* str = *(reinterpret_cast(event->getDataPtr())); *fileFullPath = listBoxFiles->getCurrentPathAsString(); PPSystemString newStr(*str); fileFullPath->append(newStr); break; } } } else return PPDialogBase::handleEvent(sender, event); return 0; } void DialogFileSelector::show(bool b/* = true*/) { if (b) { refreshExtensions(); refresh(false); } PPDialogBase::show(b); } const PPSystemString& DialogFileSelector::getSelectedPathFull() { editFieldCurrentFile->commitChanges(); PPString str = editFieldCurrentFile->getItem(0); *fileFullPath = listBoxFiles->getCurrentPathAsString(); PPSystemString newStr(str); fileFullPath->append(newStr); return *fileFullPath; } void DialogFileSelector::setCurrentEditFileName(const PPSystemString& name) { editFieldCurrentFile->clear(); char* nameASCIIZ = name.toASCIIZ(); PPString str(nameASCIIZ); editFieldCurrentFile->addItem(str); delete[] nameASCIIZ; *fileFullPath = listBoxFiles->getCurrentPathAsString(); fileFullPath->append(name); } void DialogFileSelector::updateButtonStates(bool repaint/* = true*/) { // Get home button PPButton* buttonHome = static_cast(getMessageBoxContainer()->getControlByID(PP_MESSAGEBOX_BUTTON_USER1)); buttonHome->setClickable(listBoxFiles->canGotoHome()); // Get previous button PPButton* buttonPrev = static_cast(getMessageBoxContainer()->getControlByID(PP_MESSAGEBOX_BUTTON_USER4)); buttonPrev->setClickable(listBoxFiles->canPrev()); // Get next button PPButton* buttonNext = static_cast(getMessageBoxContainer()->getControlByID(PP_MESSAGEBOX_BUTTON_USER5)); buttonNext->setClickable(listBoxFiles->canNext()); if (repaint) { parentScreen->paintControl(buttonHome); parentScreen->paintControl(buttonPrev); parentScreen->paintControl(buttonNext); } { PPButton* button; const char* stateText = sortAscending ? "\xfd" : "\xfe"; button = static_cast(getMessageBoxContainer()->getControlByID(DISKMENU_BUTTON_SORTORDER)); if (button->getText().compareTo(stateText) != 0) { button->setText(stateText); if (repaint) parentScreen->paintControl(button); } static const char* sortTypes[PPListBoxFileBrowser::NumSortRules] = {"Name", "Size", "Extension"}; stateText = sortTypes[listBoxFiles->getSortType()]; button = static_cast(getMessageBoxContainer()->getControlByID(DISKMENU_BUTTON_SORTBY)); if (button->getText().compareTo(stateText) != 0) { button->setText(stateText); if (repaint) parentScreen->paintControl(button); } } } pp_int32 DialogFileSelector::baseClassHandleEvent(PPObject* sender, PPEvent* event) { return PPDialogBase::handleEvent(sender, event); } pp_int32 DialogFileSelector::processKeys(PPObject* sender, PPEvent* event) { if (event->getID() == eKeyDown) { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); //pp_uint16 scanCode = *(((pp_uint16*)event->getDataPtr())+1); switch (keyCode) { case VK_ESCAPE: if (editFieldCurrentFile->isEditing()) goto callBaseClass; return discard(); break; case VK_RETURN: if (editFieldCurrentFile->isEditing()) goto callBaseClass; return confirm(); break; default: callBaseClass: return baseClassHandleEvent(sender, event); } } else if (event->getID() == eKeyUp) { return baseClassHandleEvent(sender, event); } return baseClassHandleEvent(sender, event); } pp_int32 DialogFileSelector::confirm() { pp_int32 i = listBoxFiles->getSelectedIndex(); PPSystemString currentSelectedName = listBoxFiles->getPathEntry(i)->getName(); PPString str = editFieldCurrentFile->getItem(0); PPSystemString currentEnteredName(str); if (currentEnteredName.compareTo(currentSelectedName) == 0 || currentEnteredName.length() == 0) return confirm(*listBoxFiles->getPathEntry(i)); pp_int32 res; PPPathEntry* newPathEntry = PPPathFactory::createPathEntry(); newPathEntry->create(listBoxFiles->getCurrentPathAsString(), currentEnteredName); res = confirm(*newPathEntry); delete newPathEntry; return res; } pp_int32 DialogFileSelector::confirm(const PPPathEntry& entry) { if (!allowSelectDirectories && entry.isDirectory()) { stepInto(entry); return 0; } else if (doOverwritePrompt && entry.isFile() && listBoxFiles->getCurrentPath().fileExists(getSelectedPathFull())) { overwritePromptMessageBox->show(); return 0; } // fake OK press PPEvent event(eCommand); return PPDialogBase::handleEvent(reinterpret_cast(getMessageBoxContainer()->getControlByID(PP_MESSAGEBOX_BUTTON_OK)), &event); } pp_int32 DialogFileSelector::discard() { // fake cancel button press PPEvent event(eCommand); return PPDialogBase::handleEvent(reinterpret_cast(getMessageBoxContainer()->getControlByID(PP_MESSAGEBOX_BUTTON_CANCEL)), &event); } void DialogFileSelector::refresh(bool repaint/* = true*/) { listBoxFiles->refreshFiles(); updateButtonStates(false); refreshCurrentFileEditField(false); if (repaint) parentScreen->paintControl(messageBoxContainerGeneric); } void DialogFileSelector::refreshCurrentFileEditField(bool repaint/* = true*/) { const PPPathEntry* entry = listBoxFiles->getCurrentSelectedPathEntry(); if (!entry || (allowEditFileName && !entry->isFile())) return; editFieldCurrentFile->clear(); char* nameASCIIZ = entry->getName().toASCIIZ(); PPString str(nameASCIIZ); editFieldCurrentFile->addItem(str); delete[] nameASCIIZ; if (repaint) parentScreen->paintControl(editFieldCurrentFile); } void DialogFileSelector::updateSelection(pp_int32 index, bool repaint/* = true*/) { refreshCurrentFileEditField(repaint); *fileFullPath = listBoxFiles->getCurrentPathAsString(); fileFullPath->append(listBoxFiles->getPathEntry(index)->getName()); } void DialogFileSelector::gotoHome() { listBoxFiles->gotoHome(); refresh(); } void DialogFileSelector::gotoRoot() { listBoxFiles->gotoRoot(); refresh(); } void DialogFileSelector::gotoParent() { listBoxFiles->gotoParent(); refresh(); } bool DialogFileSelector::stepInto(const PPPathEntry& entry) { if (listBoxFiles->stepInto(entry)) { refresh(); return true; } return false; } void DialogFileSelector::gotoPath(const PPSystemString& path) { listBoxFiles->gotoPath(path); refresh(); } // undo last changes void DialogFileSelector::prev() { listBoxFiles->prev(); refresh(); } // redo last changes void DialogFileSelector::next() { listBoxFiles->next(); refresh(); } void DialogFileSelector::addExtension(const PPString& ext, const PPString& desc) { extensions.add(new Descriptor(ext, desc)); } void DialogFileSelector::refreshExtensions() { listBoxFiles->clearExtensions(); for (pp_int32 i = 0; i < extensions.size(); i++) listBoxFiles->addExtension(extensions.get(i)->extension, extensions.get(i)->description); } void DialogFileSelector::updateFilter() { listBoxFiles->clearExtensions(); if (static_cast(messageBoxContainerGeneric->getControlByID(DISKMENU_CHECKBOX_FILTEREXTENSIONS))->isChecked()) { refreshExtensions(); } refresh(); } milkytracker-0.90.85+dfsg/src/ppui/Dictionary.cpp0000644000175000017500000001043211150223367021000 0ustar admin2admin2/* * ppui/Dictionary.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPDictionary.cpp * MilkyTracker * * Created by Peter Barth on Mon Mar 14 2005. * */ #include "Dictionary.h" #include "SimpleVector.h" PPDictionary::PPDictionary() : enumerating(false), enumerationIndex(0) { keys = new PPSimpleVector; } PPDictionary::~PPDictionary() { delete keys; } // copy c'tor PPDictionary::PPDictionary(const PPDictionary& source) { keys = source.keys->clone(); } PPDictionary& PPDictionary::operator=(const PPDictionary& source) { // no self-assignment if (this != &source) { delete keys; keys = source.keys->clone(); } return *this; } PPDictionaryKey* PPDictionary::getKeyToModify(const PPString& key) const { for (pp_int32 i = 0; i < keys->size(); i++) { PPDictionaryKey* theKey = keys->get(i); if (theKey->getKey().compareTo(key) == 0) return theKey; } return NULL; } void PPDictionary::store(const PPString& key, const PPString& value) { PPDictionaryKey* theKey = getKeyToModify(key); if (theKey) theKey->store(value); else keys->add(new PPDictionaryKey(key, value)); } void PPDictionary::store(const PPString& key, const pp_uint32 value) { PPDictionaryKey* theKey = getKeyToModify(key); if (theKey) theKey->store(value); else keys->add(new PPDictionaryKey(key, value)); } PPDictionaryKey* PPDictionary::restore(const PPString& key) { return getKeyToModify(key); } pp_int32 PPDictionary::size() const { return keys->size(); } PPDictionaryKey* PPDictionary::getFirstKey() { if (keys->size() == 0) return NULL; enumerationIndex = 0; enumerating = true; PPDictionaryKey* theKey = keys->get(enumerationIndex); enumerationIndex++; return theKey; } PPDictionaryKey* PPDictionary::getNextKey() { if (!enumerating) return NULL; PPDictionaryKey* theKey = keys->get(enumerationIndex); enumerationIndex++; if (enumerationIndex == keys->size()) { enumerationIndex = 0; enumerating = false; } return theKey; } void PPDictionary::stopEnumeration() { enumerating = false; enumerationIndex = 0; } PPString PPDictionary::serializeToString() { PPString result; for (pp_int32 i = 0; i < keys->size(); i++) { PPDictionaryKey* theKey = keys->get(i); if (i) result.append(";"); result.append(theKey->getKey()); result.append("="); result.append(theKey->getStringValue()); } return result; } PPDictionary* PPDictionary::createFromString(const PPString& string) { PPDictionary* dictionary = new PPDictionary(); const char* str = string; pp_uint32 index = 0; bool invalid = false; pp_uint32 startIndex = 0; while (index < string.length()) { while (str[index] && str[index] != '=') index++; PPString key; if (str[index] == '=') { key = string.subString(startIndex, index); startIndex = ++index; } else { invalid = true; break; } while (str[index] && str[index] != ';') index++; PPString value; if (index > startIndex) { value = string.subString(startIndex, index); startIndex = ++index; } dictionary->store(key, value); } if (invalid || (string.length() == 0)) { delete dictionary; dictionary = NULL; } return dictionary; } pp_uint32 PPDictionary::convertFloatToIntNonLossy(float value) { pp_uint32 result; // not compatible if (sizeof(float) != sizeof(result)) return 0; memcpy(&result, &value, sizeof(result)); return result; } float PPDictionary::convertIntToFloatNonLossy(pp_uint32 value) { float result; // not compatible if (sizeof(float) != sizeof(result)) return 0; memcpy(&result, &value, sizeof(result)); return result; } milkytracker-0.90.85+dfsg/src/ppui/sdl/0000755000175000017500000000000011317506135016753 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/sdl/fix_newline.sh0000755000175000017500000000036410737736041021632 0ustar admin2admin2#!/bin/sh # for i in `ls` do if [ -f $i ] then if [ -n "`tail -1c $i`" ] then echo "Bearbeite $i" echo >> $i fi fi done milkytracker-0.90.85+dfsg/src/ppui/sdl/DisplayDevice_SDL.cpp0000644000175000017500000001515311150223367022711 0ustar admin2admin2/* * ppui/sdl/DisplayDevice_SDL.cpp * * Copyright 2009 Peter Barth, Christopher O'Neill * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "DisplayDevice_SDL.h" #include "Graphics.h" SDL_Surface* PPDisplayDevice::CreateScreen(pp_int32& w, pp_int32& h, pp_int32& bpp, Uint32 flags) { SDL_Surface *screen; /* Set the video mode */ screen = SDL_SetVideoMode(w, h, bpp, flags); if (screen == NULL) { fprintf(stderr, "Couldn't set display mode: %s\n", SDL_GetError()); fprintf(stderr, "Retrying with default size..."); w = getDefaultWidth(); h = getDefaultHeight(); screen = SDL_SetVideoMode(w, h, bpp, flags); if (screen == NULL) { fprintf(stderr, "Couldn't set display mode: %s\n", SDL_GetError()); fprintf(stderr, "Giving up."); return NULL; } } return screen; } PPDisplayDevice::PPDisplayDevice(SDL_Surface*& screen, pp_int32 width, pp_int32 height, pp_int32 scaleFactor, pp_int32 bpp, bool fullScreen, Orientations theOrientation/* = ORIENTATION_NORMAL*/) : PPDisplayDeviceBase(width, height, scaleFactor), realWidth(width), realHeight(height), orientation(theOrientation) { adjust(realWidth, realHeight); bFullScreen = fullScreen; initMousePointers(); } PPDisplayDevice::~PPDisplayDevice() { delete currentGraphics; } void PPDisplayDevice::adjust(pp_int32& x, pp_int32& y) { switch (orientation) { case ORIENTATION_NORMAL: case ORIENTATION_ROTATE180: break; case ORIENTATION_ROTATE90CCW: case ORIENTATION_ROTATE90CW: { pp_int32 h = x; x = y; y = h; break; } } x *= scaleFactor; y *= scaleFactor; } void PPDisplayDevice::transform(pp_int32& x, pp_int32& y) { pp_int32 h; switch (orientation) { case ORIENTATION_NORMAL: break; case ORIENTATION_ROTATE90CW: h = x; x = y; y = realWidth - 1 - h; break; case ORIENTATION_ROTATE180: break; case ORIENTATION_ROTATE90CCW: h = x; x = realHeight - 1 - y; y = h; break; } } void PPDisplayDevice::transformInverse(pp_int32& x, pp_int32& y) { pp_int32 h; switch (orientation) { case ORIENTATION_NORMAL: break; case ORIENTATION_ROTATE90CW: h = x; x = realWidth - y; y = h; break; case ORIENTATION_ROTATE180: break; case ORIENTATION_ROTATE90CCW: h = x; x = y; y = realHeight - h; break; } } void PPDisplayDevice::transformInverse(PPRect& r) { transformInverse((pp_int32&)r.x1, (pp_int32&)r.y1); transformInverse((pp_int32&)r.x2, (pp_int32&)r.y2); pp_int32 h; if (r.x2 < r.x1) { h = r.x1; r.x1 = r.x2; r.x2 = h; } if (r.y2 < r.y1) { h = r.y1; r.y1 = r.y2; r.y2 = h; } } void PPDisplayDevice::setTitle(const PPSystemString& title) { SDL_WM_SetCaption(title, "MilkyTracker"); } void PPDisplayDevice::setSize(const PPSize& size) { theSurface = SDL_SetVideoMode(size.width, size.height, theSurface->format->BitsPerPixel, theSurface->flags); } bool PPDisplayDevice::goFullScreen(bool b) { // In X11, this will make MilkyTracker go fullscreen at the selected // resolution. SDL_Surface* screen = SDL_GetVideoSurface(); if (SDL_WM_ToggleFullScreen(screen)) { bFullScreen = !bFullScreen; return true; } return false; } // Defined in main.cpp void exitSDLEventLoop(bool serializedEventInvoked = true); void PPDisplayDevice::shutDown() { exitSDLEventLoop(); } void PPDisplayDevice::setMouseCursor(MouseCursorTypes type) { currentCursorType = type; switch (type) { case MouseCursorTypeStandard: SDL_SetCursor(cursorStandard); break; case MouseCursorTypeResizeLeft: SDL_SetCursor(cursorResizeLeft); break; case MouseCursorTypeResizeRight: SDL_SetCursor(cursorResizeRight); break; case MouseCursorTypeHand: SDL_SetCursor(cursorHand); break; case MouseCursorTypeWait: SDL_SetCursor(cursorEggtimer); break; } } void PPDisplayDevice::signalWaitState(bool b, const PPColor& color) { setMouseCursor(b ? MouseCursorTypeWait : MouseCursorTypeStandard); } // Mouse pointer data Uint8 PPDisplayDevice::resizeLeft_data[] = { 0, 0, 96, 0, 97, 128, 99, 0, 102, 0, 108, 0, 120, 0, 127, 254, 120, 0, 124, 0, 102, 0, 99, 0, 97, 128, 96, 0, 0, 0, 0, 0 }; Uint8 PPDisplayDevice::resizeLeft_mask[] = { 240, 0, 241, 128, 243, 192, 247, 128, 255, 0, 254, 0, 255, 255, 255, 255, 255, 255, 254, 0, 255, 0, 247, 128, 243, 192, 241, 128, 240, 0, 0, 0 }; Uint8 PPDisplayDevice::resizeRight_data[] = { 0, 0, 0, 6, 1, 134, 0, 198, 0, 102, 0, 54, 0, 30, 127, 254, 0, 30, 0, 62, 0, 102, 0, 198, 1, 134, 0, 6, 0, 0, 0, 0 }; Uint8 PPDisplayDevice::resizeRight_mask[] = { 0, 15, 1, 143, 3, 207, 1, 239, 0, 255, 0, 127, 255, 255, 255, 255, 255, 255, 0, 127, 0, 255, 1, 239, 3, 207, 1, 143, 0, 15, 0, 0, }; Uint8 PPDisplayDevice::eggtimer_data[] = { 0, 0, 127, 192, 32, 128, 32, 128, 17, 0, 17, 0, 10, 0, 4, 0, 4, 0, 10, 0, 17, 0, 17, 0, 32, 128, 32, 128, 127, 192, 0, 0 }; Uint8 PPDisplayDevice::eggtimer_mask[] = { 255, 224, 255, 224, 127, 192, 127, 192, 63, 128, 63, 128, 31, 0, 14, 0, 14, 0, 31, 0, 63, 128, 63, 128, 127, 192, 127, 192, 255, 224, 255, 224 }; Uint8 PPDisplayDevice::hand_data[] = {54, 192, 91, 64, 146, 64, 146, 112, 146, 104, 146, 104, 128, 40, 128, 40, 128, 8, 128, 8, 128, 16, 64, 16, 64, 32, 32, 32, 31, 192, 0, 0, }; Uint8 PPDisplayDevice::hand_mask[] = {54, 192, 127, 192, 255, 192, 255, 240, 255, 248, 255, 248, 255, 248, 255, 248, 255, 248, 255, 248, 255, 240, 127, 240, 127, 224, 63, 224, 31, 192, 0, 0, }; void PPDisplayDevice::initMousePointers() { cursorResizeLeft = SDL_CreateCursor(resizeLeft_data, resizeLeft_mask, 16, 16, 2, 7); cursorResizeRight = SDL_CreateCursor(resizeRight_data, resizeRight_mask, 16, 16, 13, 7); cursorEggtimer = SDL_CreateCursor(eggtimer_data, eggtimer_mask, 16, 16, 5, 7); cursorHand = SDL_CreateCursor(hand_data, hand_mask, 16, 16, 5, 5); // The current cursor is used as the standard cursor; // This might cause problems if the system if displaying some other cursor at // the time, or it might not. It depends. cursorStandard = SDL_GetCursor(); } milkytracker-0.90.85+dfsg/src/ppui/sdl/DisplayDevice_SDL.h0000644000175000017500000000530711150223367022356 0ustar admin2admin2/* * ppui/sdl/DisplayDevice_SDL.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Our display device // ///////////////////////////////////////////////////////////////// #ifndef __DISPLAYDEVICE_H__ #define __DISPLAYDEVICE_H__ #include "BasicTypes.h" #include "DisplayDeviceBase.h" #include // Forwards class PPGraphicsAbstract; class PPDisplayDevice : public PPDisplayDeviceBase { public: enum Orientations { // Orientations ORIENTATION_NORMAL, ORIENTATION_ROTATE90CCW, ORIENTATION_ROTATE180, // unsupported ORIENTATION_ROTATE90CW, ORIENTATION_UNKNOWN }; protected: pp_int32 realWidth, realHeight; SDL_Surface* theSurface; Orientations orientation; SDL_Surface* CreateScreen(pp_int32& w, pp_int32& h, pp_int32& bpp, Uint32 flags); // used for rotating coordinates etc. void adjust(pp_int32& x, pp_int32& y); // Mouse pointers SDL_Cursor *cursorStandard, *cursorResizeLeft, *cursorResizeRight, *cursorEggtimer, *cursorHand; void initMousePointers(); static Uint8 resizeLeft_data[], resizeLeft_mask[]; static Uint8 resizeRight_data[], resizeRight_mask[]; static Uint8 eggtimer_data[], eggtimer_mask[]; static Uint8 hand_data[], hand_mask[]; public: PPDisplayDevice(SDL_Surface*& screen, pp_int32 width, pp_int32 height, pp_int32 scaleFactor, pp_int32 bpp, bool fullScreen, Orientations theOrientation = ORIENTATION_NORMAL); virtual ~PPDisplayDevice(); virtual void setSize(const PPSize& size); void transform(pp_int32& x, pp_int32& y); void transformInverse(pp_int32& x, pp_int32& y); void transformInverse(PPRect& r); Orientations getOrientation() { return orientation; } // ----------------------------- ex. PPWindow ---------------------------- virtual void setTitle(const PPSystemString& title); virtual bool goFullScreen(bool b); virtual void shutDown(); virtual void signalWaitState(bool b, const PPColor& color); virtual void setMouseCursor(MouseCursorTypes type); }; #endif milkytracker-0.90.85+dfsg/src/ppui/sdl/DisplayDeviceFB_SDL.cpp0000755000175000017500000004204611150223367023125 0ustar admin2admin2/* * ppui/sdl/DisplayDeviceFB_SDL.cpp * * Copyright 2009 Peter Barth, Christopher O'Neill * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "DisplayDeviceFB_SDL.h" #include "Graphics.h" PPDisplayDeviceFB::PPDisplayDeviceFB(SDL_Surface*& screen, pp_int32 width, pp_int32 height, pp_int32 scaleFactor, pp_int32 bpp, bool fullScreen, Orientations theOrientation/* = ORIENTATION_NORMAL*/, bool swapRedBlue/* = false*/) : PPDisplayDevice(screen, width, height, scaleFactor, bpp, fullScreen, theOrientation), needsTemporaryBuffer((orientation != ORIENTATION_NORMAL) || (scaleFactor != 1)), temporaryBuffer(NULL) { const SDL_VideoInfo* videoinfo; /* Some SDL to get display format */ videoinfo = SDL_GetVideoInfo(); if (bpp == -1) { bpp = videoinfo->vfmt->BitsPerPixel > 16 ? videoinfo->vfmt->BitsPerPixel : 16; } /* Set a video mode */ theSurface = screen = CreateScreen(realWidth, realHeight, bpp, SDL_SWSURFACE | (bFullScreen==true ? SDL_FULLSCREEN : 0)); if ( screen == NULL ) { fprintf(stderr, "Could not set video mode: %s\n", SDL_GetError()); exit(2); } switch (bpp) { case 16: currentGraphics = new PPGraphics_16BIT(width, height, 0, NULL); break; case 24: { PPGraphics_24bpp_generic* g = new PPGraphics_24bpp_generic(width, height, 0, NULL); if (swapRedBlue) { g->setComponentBitpositions(videoinfo->vfmt->Bshift, videoinfo->vfmt->Gshift, videoinfo->vfmt->Rshift); } else { g->setComponentBitpositions(videoinfo->vfmt->Rshift, videoinfo->vfmt->Gshift, videoinfo->vfmt->Bshift); } currentGraphics = static_cast(g); break; } case 32: { PPGraphics_32bpp_generic* g = new PPGraphics_32bpp_generic(width, height, 0, NULL); if (swapRedBlue) { g->setComponentBitpositions(videoinfo->vfmt->Bshift, videoinfo->vfmt->Gshift, videoinfo->vfmt->Rshift); } else { g->setComponentBitpositions(videoinfo->vfmt->Rshift, videoinfo->vfmt->Gshift, videoinfo->vfmt->Bshift); } currentGraphics = static_cast(g); break; } default: fprintf(stderr, "Unsupported color depth (%i), try either 16, 24 or 32", bpp); exit(2); } if (needsTemporaryBuffer) { temporaryBufferPitch = (width*bpp)/8; temporaryBufferBPP = bpp; temporaryBuffer = new pp_uint8[getSize().width*getSize().height*(bpp/8)]; } currentGraphics->lock = true; } PPDisplayDeviceFB::~PPDisplayDeviceFB() { delete[] temporaryBuffer; // base class is responsible for deleting currentGraphics } PPGraphicsAbstract* PPDisplayDeviceFB::open() { if (!isEnabled()) return NULL; if (currentGraphics->lock) { if (SDL_LockSurface(theSurface) < 0) return NULL; currentGraphics->lock = false; if (needsTemporaryBuffer) static_cast(currentGraphics)->setBufferProperties(temporaryBufferPitch, (pp_uint8*)temporaryBuffer); else static_cast(currentGraphics)->setBufferProperties(theSurface->pitch, (pp_uint8*)theSurface->pixels); return currentGraphics; } return NULL; } void PPDisplayDeviceFB::close() { SDL_UnlockSurface(theSurface); currentGraphics->lock = true; } void PPDisplayDeviceFB::update() { if (!isUpdateAllowed() || !isEnabled()) return; if (theSurface->locked) { return; } PPRect r(0, 0, getSize().width, getSize().height); swap(r); SDL_UpdateRect(theSurface, 0, 0, 0, 0); } void PPDisplayDeviceFB::update(const PPRect& r) { if (!isUpdateAllowed() || !isEnabled()) return; if (theSurface->locked) { return; } PPRect r2(r); swap(r2); PPRect r3(r); r3.scale(scaleFactor); transformInverse(r3); SDL_UpdateRect(theSurface, r3.x1, r3.y1, (r3.x2-r3.x1), (r3.y2-r3.y1)); } void PPDisplayDeviceFB::swap(const PPRect& r2) { PPRect r(r2); pp_int32 h; if (r.x2 < r.x1) { h = r.x1; r.x1 = r.x2; r.x2 = h; } if (r.y2 < r.y1) { h = r.y1; r.y1 = r.y2; r.y2 = h; } switch (orientation) { case ORIENTATION_NORMAL: { if (!needsTemporaryBuffer) return; if (SDL_LockSurface(theSurface) < 0) return; const pp_uint32 srcBPP = temporaryBufferBPP/8; const pp_uint32 dstBPP = theSurface->format->BytesPerPixel; PPRect destRect(r); destRect.scale(scaleFactor); const pp_uint32 stepU = (r.x2 - r.x1) * 65536 / (destRect.x2 - destRect.x1); const pp_uint32 stepV = (r.y2 - r.y1) * 65536 / (destRect.y2 - destRect.y1); switch (temporaryBufferBPP) { case 16: { pp_uint32 srcPitch = temporaryBufferPitch; pp_uint32 dstPitch = theSurface->pitch; pp_uint8* src = (pp_uint8*)temporaryBuffer; pp_uint8* dst = (pp_uint8*)theSurface->pixels; pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint16* dstPtr = (pp_uint16*)(dst + y*dstPitch + destRect.x1*dstBPP); pp_uint8* srcPtr = src + (v>>16)*srcPitch; for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { *dstPtr++ = *(pp_uint16*)(srcPtr + (u>>16) * srcBPP); u += stepU; } v += stepV; } break; } case 24: { pp_uint32 srcPitch = temporaryBufferPitch; pp_uint32 dstPitch = theSurface->pitch; pp_uint8* src = (pp_uint8*)temporaryBuffer; pp_uint8* dst = (pp_uint8*)theSurface->pixels; const pp_uint32 srcBPP = temporaryBufferBPP/8; const pp_uint32 dstBPP = theSurface->format->BytesPerPixel; pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint8* dstPtr = (pp_uint8*)(dst + y*dstPitch + destRect.x1*dstBPP); pp_uint8* srcPtr = src + (v>>16)*srcPitch; for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { *dstPtr = *(pp_uint8*)(srcPtr + (u>>16) * srcBPP); *(dstPtr+1) = *(pp_uint8*)(srcPtr + (u>>16) * srcBPP + 1); *(dstPtr+2) = *(pp_uint8*)(srcPtr + (u>>16) * srcBPP + 2); dstPtr+=3; u += stepU; } v += stepV; } break; } case 32: { pp_uint32 srcPitch = temporaryBufferPitch; pp_uint32 dstPitch = theSurface->pitch; pp_uint8* src = (pp_uint8*)temporaryBuffer; pp_uint8* dst = (pp_uint8*)theSurface->pixels; const pp_uint32 srcBPP = temporaryBufferBPP/8; const pp_uint32 dstBPP = theSurface->format->BytesPerPixel; pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint32* dstPtr = (pp_uint32*)(dst + y*dstPitch + destRect.x1*dstBPP); pp_uint8* srcPtr = src + (v>>16)*srcPitch; for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { *dstPtr++ = *(pp_uint32*)(srcPtr + (u>>16) * srcBPP); u += stepU; } v += stepV; } break; } default: fprintf(stderr, "Unsupported color depth for requested orientation"); exit(2); } SDL_UnlockSurface(theSurface); break; } case ORIENTATION_ROTATE90CCW: { if (SDL_LockSurface(theSurface) < 0) return; switch (temporaryBufferBPP) { case 16: { pp_uint32 srcPitch = temporaryBufferPitch >> 1; pp_uint32 dstPitch = theSurface->pitch >> 1; pp_uint16* src = (pp_uint16*)temporaryBuffer; pp_uint16* dst = (pp_uint16*)theSurface->pixels; if (scaleFactor != 1) { PPRect destRect(r); destRect.scale(scaleFactor); const pp_uint32 stepU = (r.x2 - r.x1) * 65536 / (destRect.x2 - destRect.x1); const pp_uint32 stepV = (r.y2 - r.y1) * 65536 / (destRect.y2 - destRect.y1); pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint16* srcPtr = src + (v>>16)*srcPitch; pp_uint16* dstPtr = dst + y + (realHeight-destRect.x1)*dstPitch; for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { *(dstPtr-=dstPitch) = *(srcPtr+(u>>16)); u += stepU; } v += stepV; } } else { for (pp_uint32 y = r.y1; y < r.y2; y++) { pp_uint16* srcPtr = src + y*srcPitch + r.x1; pp_uint16* dstPtr = dst + y + (realHeight-r.x1)*dstPitch; for (pp_uint32 x = r.x1; x < r.x2; x++) *(dstPtr-=dstPitch) = *srcPtr++; } } break; } case 24: { pp_uint32 srcPitch = temporaryBufferPitch; pp_uint32 dstPitch = theSurface->pitch; pp_uint8* src = (pp_uint8*)temporaryBuffer; pp_uint8* dst = (pp_uint8*)theSurface->pixels; const pp_uint32 srcBPP = temporaryBufferBPP/8; const pp_uint32 dstBPP = theSurface->format->BytesPerPixel; if (scaleFactor != 1) { PPRect destRect(r); destRect.scale(scaleFactor); const pp_uint32 stepU = (r.x2 - r.x1) * 65536 / (destRect.x2 - destRect.x1); const pp_uint32 stepV = (r.y2 - r.y1) * 65536 / (destRect.y2 - destRect.y1); pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint8* srcPtr = src + (v>>16)*srcPitch; pp_uint8* dstPtr = dst + y*dstBPP + dstPitch*(realHeight-1-destRect.x1); for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { dstPtr[0] = *(srcPtr+(u>>16) * srcBPP); dstPtr[1] = *(srcPtr+(u>>16) * srcBPP + 1); dstPtr[2] = *(srcPtr+(u>>16) * srcBPP + 2); dstPtr-=dstPitch; u += stepU; } v += stepV; } } else { for (pp_uint32 y = r.y1; y < r.y2; y++) { pp_uint8* srcPtr = src + y*srcPitch + r.x1*srcBPP; pp_uint8* dstPtr = dst + y*dstBPP + dstPitch*(realHeight-1-r.x1); for (pp_uint32 x = r.x1; x < r.x2; x++) { dstPtr[0] = srcPtr[0]; dstPtr[1] = srcPtr[1]; dstPtr[2] = srcPtr[2]; srcPtr+=srcBPP; dstPtr-=dstPitch; } } } break; } case 32: { pp_uint32 srcPitch = temporaryBufferPitch; pp_uint32 dstPitch = theSurface->pitch; pp_uint8* src = (pp_uint8*)temporaryBuffer; pp_uint8* dst = (pp_uint8*)theSurface->pixels; const pp_uint32 srcBPP = temporaryBufferBPP/8; const pp_uint32 dstBPP = theSurface->format->BytesPerPixel; if (scaleFactor != 1) { PPRect destRect(r); destRect.scale(scaleFactor); const pp_uint32 stepU = (r.x2 - r.x1) * 65536 / (destRect.x2 - destRect.x1); const pp_uint32 stepV = (r.y2 - r.y1) * 65536 / (destRect.y2 - destRect.y1); pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint8* srcPtr = src + (v>>16)*srcPitch; pp_uint32* dstPtr = (pp_uint32*)(dst + y*dstBPP + dstPitch*(realHeight-1-destRect.x1)); for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { *(dstPtr-=(dstPitch>>2)) = *(pp_uint32*)(srcPtr + (u>>16) * srcBPP); u += stepU; } v += stepV; } } else { for (pp_uint32 y = r.y1; y < r.y2; y++) { pp_uint32* srcPtr = (pp_uint32*)(src + y*srcPitch + r.x1*srcBPP); pp_uint32* dstPtr = (pp_uint32*)(dst + y*dstBPP + dstPitch*(realHeight-1-r.x1)); for (pp_uint32 x = r.x1; x < r.x2; x++) *(dstPtr-=(dstPitch>>2)) = *srcPtr++; } } break; } default: fprintf(stderr, "Unsupported color depth for requested orientation"); exit(2); } SDL_UnlockSurface(theSurface); break; } case ORIENTATION_ROTATE90CW: { if (SDL_LockSurface(theSurface) < 0) return; switch (temporaryBufferBPP) { case 16: { pp_uint32 srcPitch = temporaryBufferPitch >> 1; pp_uint32 dstPitch = theSurface->pitch >> 1; pp_uint16* src = (pp_uint16*)temporaryBuffer; pp_uint16* dst = (pp_uint16*)theSurface->pixels; if (scaleFactor != 1) { PPRect destRect(r); destRect.scale(scaleFactor); const pp_uint32 stepU = (r.x2 - r.x1) * 65536 / (destRect.x2 - destRect.x1); const pp_uint32 stepV = (r.y2 - r.y1) * 65536 / (destRect.y2 - destRect.y1); pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint16* srcPtr = src + (v>>16)*srcPitch; pp_uint16* dstPtr = dst + (realWidth-1-y) + (dstPitch*(destRect.x1-1)); for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { *(dstPtr+=dstPitch) = *(srcPtr+(u>>16)); u += stepU; } v += stepV; } } else { for (pp_uint32 y = r.y1; y < r.y2; y++) { pp_uint16* srcPtr = src + y*srcPitch + r.x1; pp_uint16* dstPtr = dst + (realWidth-1-y) + (dstPitch*(r.x1-1)); for (pp_uint32 x = r.x1; x < r.x2; x++) *(dstPtr+=dstPitch) = *srcPtr++; } } break; } case 24: { pp_uint32 srcPitch = temporaryBufferPitch; pp_uint32 dstPitch = theSurface->pitch; pp_uint8* src = (pp_uint8*)temporaryBuffer; pp_uint8* dst = (pp_uint8*)theSurface->pixels; const pp_uint32 srcBPP = temporaryBufferBPP/8; const pp_uint32 dstBPP = theSurface->format->BytesPerPixel; if (scaleFactor != 1) { PPRect destRect(r); destRect.scale(scaleFactor); const pp_uint32 stepU = (r.x2 - r.x1) * 65536 / (destRect.x2 - destRect.x1); const pp_uint32 stepV = (r.y2 - r.y1) * 65536 / (destRect.y2 - destRect.y1); pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint8* srcPtr = src + (v>>16)*srcPitch; pp_uint8* dstPtr = dst + (realWidth-1-y)*dstBPP + (dstPitch*(destRect.x1-1)); for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { dstPtr[0] = *(srcPtr+(u>>16) * srcBPP); dstPtr[1] = *(srcPtr+(u>>16) * srcBPP + 1); dstPtr[2] = *(srcPtr+(u>>16) * srcBPP + 2); dstPtr+=dstPitch; u += stepU; } v += stepV; } } else { for (pp_uint32 y = r.y1; y < r.y2; y++) { pp_uint8* srcPtr = src + y*srcPitch + r.x1*srcBPP; pp_uint8* dstPtr = dst + (realWidth-1-y)*dstBPP + (dstPitch*r.x1); for (pp_uint32 x = r.x1; x < r.x2; x++) { dstPtr[0] = srcPtr[0]; dstPtr[1] = srcPtr[1]; dstPtr[2] = srcPtr[2]; srcPtr+=srcBPP; dstPtr+=dstPitch; } } } break; } case 32: { pp_uint32 srcPitch = temporaryBufferPitch; pp_uint32 dstPitch = theSurface->pitch; pp_uint8* src = (pp_uint8*)temporaryBuffer; pp_uint8* dst = (pp_uint8*)theSurface->pixels; const pp_uint32 srcBPP = temporaryBufferBPP/8; const pp_uint32 dstBPP = theSurface->format->BytesPerPixel; if (scaleFactor != 1) { PPRect destRect(r); destRect.scale(scaleFactor); const pp_uint32 stepU = (r.x2 - r.x1) * 65536 / (destRect.x2 - destRect.x1); const pp_uint32 stepV = (r.y2 - r.y1) * 65536 / (destRect.y2 - destRect.y1); pp_uint32 v = r.y1 * 65536; for (pp_uint32 y = destRect.y1; y < destRect.y2; y++) { pp_uint32 u = r.x1 * 65536; pp_uint8* srcPtr = src + (v>>16)*srcPitch; pp_uint32* dstPtr = (pp_uint32*)(dst + (realWidth-1-y)*dstBPP + (dstPitch*(destRect.x1-1))); for (pp_uint32 x = destRect.x1; x < destRect.x2; x++) { *(dstPtr+=(dstPitch>>2)) = *(pp_uint32*)(srcPtr + (u>>16) * srcBPP); u += stepU; } v += stepV; } } else { for (pp_uint32 y = r.y1; y < r.y2; y++) { pp_uint32* srcPtr = (pp_uint32*)(src + y*srcPitch + r.x1*srcBPP); pp_uint32* dstPtr = (pp_uint32*)(dst + (realWidth-1-y)*dstBPP + (dstPitch*(r.x1-1))); for (pp_uint32 x = r.x1; x < r.x2; x++) *(dstPtr+=(dstPitch>>2)) = *srcPtr++; } } break; } default: fprintf(stderr, "Unsupported color depth for requested orientation"); exit(2); } SDL_UnlockSurface(theSurface); break; } } } milkytracker-0.90.85+dfsg/src/ppui/sdl/DisplayDeviceFB_SDL.h0000755000175000017500000000333311150223367022566 0ustar admin2admin2/* * ppui/sdl/DisplayDeviceFB_SDL.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Our display device // ///////////////////////////////////////////////////////////////// #ifndef __DISPLAYDEVICEFB_H__ #define __DISPLAYDEVICEFB_H__ #include "DisplayDevice_SDL.h" class PPDisplayDeviceFB : public PPDisplayDevice { private: bool needsTemporaryBuffer; pp_uint8* temporaryBuffer; pp_uint32 temporaryBufferPitch, temporaryBufferBPP; // used for rotating coordinates etc. void swap(const PPRect& r); public: PPDisplayDeviceFB(SDL_Surface*& screen, pp_int32 width, pp_int32 height, pp_int32 scaleFactor, pp_int32 bpp, bool fullScreen, Orientations theOrientation = ORIENTATION_NORMAL, bool swapRedBlue = false); virtual ~PPDisplayDeviceFB(); virtual bool supportsScaling() const { return true; } virtual PPGraphicsAbstract* open(); virtual void close(); void update(); void update(const PPRect& r); }; #endif milkytracker-0.90.85+dfsg/src/ppui/sdl/DisplayDeviceOGL_SDL.h0000755000175000017500000000306211150223367022717 0ustar admin2admin2/* * ppui/sdl/DisplayDeviceOGL_SDL.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* Using the OpenGL API for drawing/font operations turned out to be very CPU * intensive.. This code left here for historic reasons (edit the relevant * parts of src/tracker/Makefile.am if you want to play around). */ #ifndef __DISPLAYDEVICEOGL_H__ #define __DISPLAYDEVICEOGL_H__ #include "DisplayDevice_SDL.h" class PPDisplayDeviceOGL : public PPDisplayDevice { public: PPDisplayDeviceOGL(SDL_Surface*& screen, pp_int32 width, pp_int32 height, pp_int32 scaleFactor, pp_int32 bpp, bool fullScreen, Orientations theOrientation = ORIENTATION_NORMAL, bool swapRedBlue = false); virtual ~PPDisplayDeviceOGL(); virtual PPGraphicsAbstract* open(); virtual void close(); void update(); void update(const PPRect& r); }; #endif milkytracker-0.90.85+dfsg/src/ppui/sdl/DisplayDeviceOGL_SDL.cpp0000755000175000017500000000735111150223367023257 0ustar admin2admin2/* * ppui/sdl/DisplayDeviceOGL_SDL.cpp * * Copyright 2009 Peter Barth, Christopher O'Neill * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* Using the OpenGL API for drawing/font operations turned out to be very CPU * intensive.. This code left here for historic reasons (edit the relevant * parts of src/tracker/Makefile.am if you want to play around). */ #include "DisplayDeviceOGL_SDL.h" #include "Graphics.h" #ifdef __OPENGL__ #ifdef __APPLE__ #include #endif PPDisplayDeviceOGL::PPDisplayDeviceOGL(SDL_Surface*& screen, pp_int32 width, pp_int32 height, pp_int32 scaleFactor, pp_int32 bpp, bool fullScreen, Orientations theOrientation/* = ORIENTATION_NORMAL*/, bool swapRedBlue/* = false*/) : PPDisplayDevice(screen, width, height, bpp, scaleFactor, fullScreen, theOrientation) { const SDL_VideoInfo* videoinfo; /* Some SDL to get display format */ videoinfo = SDL_GetVideoInfo(); if (bpp == -1) { bpp = videoinfo->vfmt->BitsPerPixel > 16 ? videoinfo->vfmt->BitsPerPixel : 16; } Uint32 videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */ videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ //videoFlags |= SDL_ASYNCBLIT; /* This checks to see if surfaces can be stored in memory */ if (videoinfo->hw_available) videoFlags |= videoinfo->hw_available ? SDL_HWSURFACE : SDL_SWSURFACE; /* This checks if hardware blits can be done */ if (videoinfo->blit_hw) videoFlags |= SDL_HWACCEL; /* Sets up OpenGL double buffering */ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); /* Set a video mode */ theSurface = screen = CreateScreen(realWidth, realHeight, bpp, videoFlags | (bFullScreen==true ? SDL_FULLSCREEN : 0)); if (NULL == screen) { fprintf(stderr, "Could not set video mode: %s\n", SDL_GetError()); exit(2); } #if 0 CGLError err; CGLContextObj ctx = CGLGetCurrentContext(); // Enable the multi-threading err = CGLEnable( ctx, kCGLCEMPEngine); if (err != kCGLNoError ) { exit(2); } #endif currentGraphics = new PPGraphics_OGL(width, height); currentGraphics->lock = true; } PPDisplayDeviceOGL::~PPDisplayDeviceOGL() { // base class is responsible for deleting currentGraphics } PPGraphicsAbstract* PPDisplayDeviceOGL::open() { if (!isEnabled()) return NULL; if (currentGraphics->lock) { if (SDL_LockSurface(theSurface) < 0) return NULL; currentGraphics->lock = false; return currentGraphics; } return NULL; } void PPDisplayDeviceOGL::close() { SDL_UnlockSurface(theSurface); currentGraphics->lock = true; } void PPDisplayDeviceOGL::update() { if (!isUpdateAllowed() || !isEnabled()) return; if (theSurface->locked) { return; } SDL_GL_SwapBuffers(); //SDL_UpdateRect(theSurface, 0, 0, 0, 0); } void PPDisplayDeviceOGL::update(const PPRect& r) { update(); //PPRect r3 = r; //transformInverse(r3); //SDL_UpdateRect(theSurface, r3.x1, r3.y1, r3.x2-r3.x1, r3.y2-r3.y1); } #endif milkytracker-0.90.85+dfsg/src/ppui/Dictionary.h0000644000175000017500000000350311150223367020446 0ustar admin2admin2/* * ppui/Dictionary.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Dictionary.h * MilkyTracker * * Created by Peter Barth on Mon Mar 14 2005. * */ #ifndef DICTIONARY__H #define DICTIONARY__H #include "BasicTypes.h" #include "DictionaryKey.h" template class PPSimpleVector; class PPDictionary { private: PPSimpleVector* keys; bool enumerating; pp_int32 enumerationIndex; PPDictionaryKey* getKeyToModify(const PPString& key) const; public: PPDictionary(); ~PPDictionary(); // copy c'tor PPDictionary(const PPDictionary& source); PPDictionary& operator=(const PPDictionary& source); void store(const PPString& key, const PPString& value); void store(const PPString& key, const pp_uint32 value); PPDictionaryKey* restore(const PPString& key); pp_int32 size() const; PPDictionaryKey* getFirstKey(); PPDictionaryKey* getNextKey(); void stopEnumeration(); PPString serializeToString(); static PPDictionary* createFromString(const PPString& string); static pp_uint32 convertFloatToIntNonLossy(float value); static float convertIntToFloatNonLossy(pp_uint32 value); }; #endif milkytracker-0.90.85+dfsg/src/ppui/KeyboardBindingHandler.h0000644000175000017500000000240611150223367022673 0ustar admin2admin2/* * ppui/KeyboardBindingHandler.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * KeyboardBindingHandler.h * MilkyTracker * * Created by Peter Barth on 29.04.05. * */ #ifndef KEYBOARDBINDINGHANDLER__H #define KEYBOARDBINDINGHANDLER__H #include "BasicTypes.h" #include "Event.h" class KeyboardBindingHandler { private: pp_uint32 keyModifier; public: KeyboardBindingHandler() : keyModifier(0) { } protected: bool processKeyEvents(PPEvent* event); void resetKeyModifier() { keyModifier = 0; } pp_uint32 getKeyModifier() const { return keyModifier; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/RadioGroup.cpp0000644000175000017500000001302011150223367020742 0ustar admin2admin2/* * ppui/RadioGroup.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "RadioGroup.h" #include "Event.h" #include "GraphicsAbstract.h" #include "Screen.h" #include "Font.h" #include "PPUIConfig.h" PPRadioGroup::PPRadioGroup(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, pp_uint32 spacerHeight /* = 4 */) : PPControl(id, parentScreen, eventListener, location, size), radioButtonColor(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorRadioGroupButton)), textColor(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)), spacerHeight(spacerHeight), choice(0), horizontal(false), maxWidth(0) { font = PPFont::getFont(PPFont::FONT_SYSTEM); } PPRadioGroup::~PPRadioGroup() { } void PPRadioGroup::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; pp_int32 i,j,k; g->setRect(PPRect(location.x, location.y, location.x+size.width, location.y+size.height)); g->setFont(font); PPColor dark, ldark, bright, normal; normal = bright = ldark = dark = *radioButtonColor; bright.scale(1.25f); ldark.scale(0.75f); dark.scale(0.125f); if (!enabled) { normal.scaleFixed(40000); bright.scaleFixed(40000); ldark.scaleFixed(40000); dark.scaleFixed(40000); } PPColor textColor = *(this->textColor); if (!enabled) textColor.scaleFixed(40000); pp_uint32 spacerHeight = (font->getCharHeight()) + this->spacerHeight; pp_uint32 spacerWidth = maxWidth + DefaultRadioWidth; for (i = 0; i < items.size(); i++) { pp_int32 px = location.x + 2 + (horizontal ? i*spacerWidth : 0); pp_int32 py = location.y + 2 + (!horizontal ? (i*spacerHeight) : 0) + (spacerHeight>>1); if (i == (signed)choice) { for (j = 0; j < 5; j++) { g->setColor(ldark); for (k = px+j; k <= px+8-j; k++) g->setPixel(k, py-j); g->setColor(dark); g->setPixel(px+j, py-j-1); g->setPixel(px+8-j, py-j-1); g->setPixel(px+j, py-j); g->setPixel(px+8-j, py-j); } for (j = 0; j < 5; j++) { g->setColor(ldark); for (k = px+j; k <= px+8-j; k++) g->setPixel(k, py+j); g->setColor(normal); g->setPixel(px+j, py+j); g->setPixel(px+j-1, py+j); g->setPixel(px+8-j, py+j+1); g->setPixel(px+8-j+1, py+j+1); } for (j = 0; j < 3; j++) { g->setColor(textColor); for (k = px+j; k <= px+4-j; k++) g->setPixel(k+2, py-j+1); } for (j = 0; j < 3; j++) { g->setColor(textColor); for (k = px+j; k <= px+4-j; k++) g->setPixel(k+2, py+j+1); } } else { for (j = 0; j < 5; j++) { g->setColor(normal); for (k = px+j; k <= px+8-j; k++) g->setPixel(k, py-j); g->setColor(bright); g->setPixel(px+j, py-j-1); g->setPixel(px+8-j, py-j-1); } for (j = 0; j < 5; j++) { g->setColor(normal); for (k = px+j; k <= px+8-j; k++) g->setPixel(k, py+j); g->setColor(dark); g->setPixel(px+j, py+j+1); g->setPixel(px+j-1, py+j+1); g->setPixel(px+8-j, py+j+1); g->setPixel(px+8-j+1, py+j+1); } } g->setColor(0, 0, 0); g->drawString(*items.get(i), px + 12 + 1, py - (font->getCharHeight()>>1)+1 + 1); g->setColor(textColor); g->drawString(*items.get(i), px + 12, py - (font->getCharHeight()>>1)+1); } } pp_int32 PPRadioGroup::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; //if (!visible) // return 0; switch (event->getID()) { case eLMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); p->y -= location.y + 2; p->x -= location.x + 2; if (p->y < 0 || p->x < 0) break; pp_uint32 spacerHeight = (font->getCharHeight()) + this->spacerHeight; pp_uint32 spacerWidth = maxWidth + DefaultRadioWidth; pp_int32 index = -1; if (!horizontal) index = p->y / spacerHeight; else index = p->x / spacerWidth; if (index >= items.size() || index < 0) break; pp_int32 size = font->getStrWidth(*items.get(index)) + 12; if ((p->x % maxWidth) >= size) break; choice = index; PPEvent e(eSelection, &choice, sizeof(choice)); eventListener->handleEvent(reinterpret_cast(this), &e); parentScreen->paintControl(this); break; } case eLMouseUp: parentScreen->paintControl(this); break; } return 0; //return eventListener->handleEvent(reinterpret_cast(this), event); } void PPRadioGroup::addItem(const PPString& item) { items.add(new PPString(item)); pp_int32 width = font->getStrWidth(item); if (width > maxWidth) maxWidth = width; } const PPString& PPRadioGroup::getItem(pp_int32 index) const { return *items.get((index >= 0 && index < items.size()) ? index : 0); } void PPRadioGroup::fitSize() { size.height = items.size()*((font->getCharHeight()) + this->spacerHeight + 1); size.width = maxWidth + DefaultRadioWidth; } milkytracker-0.90.85+dfsg/src/ppui/Graphics_OGL.h0000755000175000017500000000473211150223367020612 0ustar admin2admin2/* * ppui/Graphics_OGL.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __GRAPHICSOGL_H__ #define __GRAPHICSOGL_H__ #ifdef __APPLE__ #include #else #include #endif class PPGraphics_OGL : public PPGraphicsAbstract { public: PPGraphics_OGL(pp_int32 w, pp_int32 h); virtual void setPixel(pp_int32 x, pp_int32 y); virtual void setPixel(pp_int32 x, pp_int32 y, const PPColor& color); virtual void fill(PPRect r); virtual void fill(); virtual void drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y); virtual void drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x); virtual void drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2); virtual void drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2); virtual void blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity = 256); virtual void drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined = false); virtual void drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined = false); virtual void drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined = false); virtual void fillVerticalShaded(PPRect r, const PPColor& colSrc, const PPColor& colDst, bool invertShading); virtual void setFont(PPFont* font); protected: virtual void validateRect(); private: struct FontCacheEntry { PPFont* font; pp_uint8* oldFontBits; pp_uint8* oglBitmapData; GLuint listOffset; pp_uint32 newWidth; pp_uint32 newHeight; FontCacheEntry() : font(NULL), oldFontBits(NULL), oglBitmapData(NULL), newWidth(0), newHeight(0) { } ~FontCacheEntry(); void createFromFont(PPFont* font); }; FontCacheEntry fontCache[4]; FontCacheEntry* fontCacheEntry; }; #endif milkytracker-0.90.85+dfsg/src/ppui/DialogFileSelector.h0000755000175000017500000000606611150223367022053 0ustar admin2admin2/* * ppui/DialogFileSelector.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogFileSelector.h * MilkyTracker * * Created by Peter Barth on 08.03.06. * */ #ifndef __DIALOGFILESELECTOR_H__ #define __DIALOGFILESELECTOR_H__ #include "DialogBase.h" #include "SimpleVector.h" class PPListBoxFileBrowser; class PPListBox; class PPPath; class PPPathEntry; class PPSystemString; class DialogFileSelector : public PPDialogBase { private: PPListBoxFileBrowser* listBoxFiles; PPListBox* editFieldCurrentFile; PPSystemString* initialPath; PPSystemString* fileFullPath; PPDialogBase* overwritePromptMessageBox; bool doOverwritePrompt; bool allowSelectDirectories; bool allowEditFileName; bool sortAscending; class OverwritePromptResponder : public DialogResponder { private: DialogFileSelector& dialogFileSelector; public: OverwritePromptResponder(DialogFileSelector& responder) : dialogFileSelector(responder) { } virtual pp_int32 ActionOkay(PPObject* sender); virtual pp_int32 ActionCancel(PPObject* sender); }; OverwritePromptResponder* overwritePrompResponder; PPSimpleVector extensions; public: DialogFileSelector(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, bool editfileName = false, bool overwritePrompt = false, bool selectDirectories = false); virtual ~DialogFileSelector(); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void show(bool b = true); const PPSystemString& getSelectedPathFull(); void setCurrentEditFileName(const PPSystemString& name); void addExtension(const PPString& ext, const PPString& desc); private: void updateButtonStates(bool repaint = true); pp_int32 baseClassHandleEvent(PPObject* sender, PPEvent* event); pp_int32 processKeys(PPObject* sender, PPEvent* event); pp_int32 confirm(const PPPathEntry& entry); pp_int32 confirm(); pp_int32 discard(); void refresh(bool repaint = true); void refreshCurrentFileEditField(bool repaint = true); void updateSelection(pp_int32 index, bool repaint = true); void gotoHome(); void gotoRoot(); void gotoParent(); bool stepInto(const PPPathEntry& entry); void gotoPath(const PPSystemString& path); void prev(); void next(); void refreshExtensions(); void updateFilter(); friend class OverwritePromptResponder; }; #endif milkytracker-0.90.85+dfsg/src/ppui/Object.h0000644000175000017500000000147511150223367017555 0ustar admin2admin2/* * ppui/Object.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef OBJECT__H #define OBJECT__H class PPObject { }; #endif milkytracker-0.90.85+dfsg/src/ppui/CheckBox.cpp0000644000175000017500000000473411150223367020371 0ustar admin2admin2/* * ppui/CheckBox.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "CheckBox.h" #include "Button.h" #include "GraphicsAbstract.h" #include "Event.h" #include "Screen.h" #include "Font.h" static const char* checked = "\xFF"; static const char* notChecked = "\x20"; PPCheckBox::PPCheckBox(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, bool checked /* = true */) : PPControl(id, parentScreen, eventListener, location, PPSize(10,10)) { button = new PPButton(id, parentScreen, this, location, this->size); button->setText(checked ? ::checked : ::notChecked); } PPCheckBox::~PPCheckBox() { delete button; } bool PPCheckBox::isChecked() const { return button->getText().compareTo(checked) == 0; } void PPCheckBox::checkIt(bool checked) { button->setText(checked ? ::checked : ::notChecked); } // from control void PPCheckBox::paint(PPGraphicsAbstract* graphics) { if (!isVisible()) return; button->paint(graphics); } pp_int32 PPCheckBox::dispatchEvent(PPEvent* event) { //if (!visible) // return 0; if (event->getID() == eLMouseDown) { button->dispatchEvent(event); } else if (event->getID() == eLMouseUp) { button->setText(isChecked() ? ::notChecked : ::checked); button->dispatchEvent(event); } parentScreen->paintControl(this); return 0; } pp_int32 PPCheckBox::handleEvent(PPObject* sender, PPEvent* event) { return eventListener->handleEvent(reinterpret_cast(this), event); } void PPCheckBox::enable(bool b) { PPControl::enable(b); button->enable(b); } void PPCheckBox::setSize(const PPSize& size) { PPControl::setSize(size); button->setSize(size); } void PPCheckBox::setLocation(const PPPoint& location) { PPControl::setLocation(location); button->setLocation(location); } milkytracker-0.90.85+dfsg/src/ppui/osinterface/0000755000175000017500000000000011317506534020476 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/osinterface/PPSavePanel.h0000644000175000017500000000241511150223367022762 0ustar admin2admin2/* * ppui/osinterface/PPSavePanel.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSavePanel.h * MilkyTracker * * Created by Peter Barth on Sat Mar 05 2005. * */ #ifndef PPSAVEPANEL__H #define PPSAVEPANEL__H #include "PPOpenPanel.h" class PPSavePanel : public PPOpenPanel { protected: PPSystemString defaultFileName; public: PPSavePanel(PPScreen* screen, const char* caption, const PPSystemString& defaultFileName) : PPOpenPanel(screen, caption) { this->defaultFileName = defaultFileName; } virtual ~PPSavePanel() {} virtual ReturnCodes runModal(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/0000755000175000017500000000000011317506143021254 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/SDL_ModalLoop.h0000644000175000017500000000440011150223367024012 0ustar admin2admin2/* * ppui/osinterface/sdl/SDL_ModalLoop.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SDL_ModalLoop.h * MilkyTracker * * Created by Peter Barth on 12.03.06. * */ #ifndef __CUSTOMEVENTLISTENER_H__ #define __CUSTOMEVENTLISTENER_H__ #include "BasicTypes.h" #include "Event.h" #include "PPModalDialog.h" class CustomEventListener : public EventListenerInterface { private: EventListenerInterface* oldEventListener; public: CustomEventListener(EventListenerInterface* oldListener) : oldEventListener(oldListener) { } virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eTimer) { return oldEventListener->handleEvent(sender, event); } return 0; } }; class ModalLoopResponder : public DialogResponder { private: bool& exitModalLoop; PPModalDialog::ReturnCodes returnCode; public: ModalLoopResponder(bool& exitModalLoopFlag) : exitModalLoop(exitModalLoopFlag), returnCode(PPModalDialog::ReturnCodeCANCEL) { } PPModalDialog::ReturnCodes getReturnCode() { return returnCode; } virtual pp_int32 ActionOkay(PPObject* sender) { exitModalLoop = true; returnCode = PPModalDialog::ReturnCodeOK; return 0; } virtual pp_int32 ActionCancel(PPObject* sender) { exitModalLoop = true; returnCode = PPModalDialog::ReturnCodeCANCEL; return 0; } virtual pp_int32 ActionNo(PPObject* sender) { exitModalLoop = true; returnCode = PPModalDialog::ReturnCodeNO; return 0; } }; class PPScreen; class PPDialogBase; PPModalDialog::ReturnCodes SDL_runModalLoop(PPScreen* screen, PPDialogBase* dialog); #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/PPMutex.cpp0000644000175000017500000000211011150223367023313 0ustar admin2admin2/* * ppui/osinterface/sdl/PPMutex.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMutex.cpp * MilkyTracker * * Created by Peter Barth on 18.11.05. * */ #include "PPMutex.h" PPMutex::PPMutex() { mutex = SDL_CreateMutex(); } PPMutex::~PPMutex() { SDL_DestroyMutex(mutex); } void PPMutex::lock() { SDL_LockMutex(mutex); } void PPMutex::unlock() { SDL_UnlockMutex(mutex); } milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/PPMutex.h0000644000175000017500000000202611150223367022766 0ustar admin2admin2/* * ppui/osinterface/sdl/PPMutex.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMutex.h * MilkyTracker * * Created by Peter Barth on 18.11.05. * */ #ifndef PPMUTEX__H #define PPMUTEX__H #include class PPMutex { private: SDL_mutex* mutex; public: PPMutex(); ~PPMutex(); void lock(); void unlock(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/fix_newline.sh0000755000175000017500000000036410737736041024134 0ustar admin2admin2#!/bin/sh # for i in `ls` do if [ -f $i ] then if [ -n "`tail -1c $i`" ] then echo "Bearbeite $i" echo >> $i fi fi done milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/PPQuitSaveAlert_SDL.cpp0000644000175000017500000000251511150223367025455 0ustar admin2admin2/* * ppui/osinterface/sdl/PPQuitSaveAlert_SDL.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPQuitSaveAlert_SDL.cpp * MilkyTracker * * Created by Peter Barth on 28.03.05. * */ #include "PPQuitSaveAlert.h" #include #include "SDL_ModalLoop.h" #include "DialogFileSelector.h" PPQuitSaveAlert::ReturnCodes PPQuitSaveAlert::runModal() { // Create a message box (the message box will invoke the responder) PPDialogBase* dialog = new PPDialogBase(screen, NULL, PP_DEFAULT_ID, "Save current changes?", PPDialogBase::MessageBox_YESNOCANCEL); ReturnCodes result = SDL_runModalLoop(screen, dialog); delete dialog; return result; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/PPSavePanel_SDL.cpp0000644000175000017500000000324311150223367024601 0ustar admin2admin2/* * ppui/osinterface/sdl/PPSavePanel_SDL.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSavePanel.cpp * MilkyTracker * * Created by Peter Barth on Sat Mar 05 2005. * */ #include "PPSavePanel.h" #include #include "SDL_ModalLoop.h" #include "DialogFileSelector.h" PPSavePanel::ReturnCodes PPSavePanel::runModal() { // Create a message box (the message box will invoke the responder) DialogFileSelector* dialog = new DialogFileSelector(screen, NULL, PP_DEFAULT_ID, this->caption, true, true); dialog->setCurrentEditFileName(defaultFileName); for (pp_int32 i = 0; i < items.size(); i++) { PPSystemString ext(items.get(i)->extension); PPSystemString desc(items.get(i)->description); dialog->addExtension(ext, desc); } ReturnCodes result = SDL_runModalLoop(screen, dialog); PPSystemString pathEntry(dialog->getSelectedPathFull()); // this is no longer needed delete dialog; fileName = ((result == ReturnCodeOK) ? pathEntry : ""); return result; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/PPOpenPanel_SDL.cpp0000644000175000017500000000374511150223367024613 0ustar admin2admin2/* * ppui/osinterface/sdl/PPOpenPanel_SDL.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPOpenPanel_SDL.cpp * MilkyTracker * * Created by Peter Barth on Sun Feb 27 2005. * */ #include "PPOpenPanel.h" #include #include "SDL_ModalLoop.h" #include "DialogFileSelector.h" PPOpenPanel::PPOpenPanel(PPScreen* screen, const char* caption) : PPModalDialog(screen) { this->caption = new char[strlen(caption)+1]; strcpy(this->caption, caption); } PPOpenPanel::~PPOpenPanel() { if (caption) delete caption; } void PPOpenPanel::addExtension(const PPString& ext, const PPString& desc) { Descriptor* d = new Descriptor(ext, desc); items.add(d); } PPOpenPanel::ReturnCodes PPOpenPanel::runModal() { // Create a message box (the message box will invoke the responder) DialogFileSelector* dialog = new DialogFileSelector(screen, NULL, PP_DEFAULT_ID, this->caption); for (pp_int32 i = 0; i < items.size(); i++) { PPSystemString ext(items.get(i)->extension); PPSystemString desc(items.get(i)->description); dialog->addExtension(ext, desc); } ReturnCodes result = SDL_runModalLoop(screen, dialog); PPSystemString pathEntry(dialog->getSelectedPathFull()); // this is no longer needed delete dialog; fileName = ((result == ReturnCodeOK) ? pathEntry : ""); return result; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/PPMessageBox_SDL.cpp0000644000175000017500000000277411150223367024770 0ustar admin2admin2/* * ppui/osinterface/sdl/PPMessageBox_SDL.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMessageBox_SDL.cpp * MilkyTracker * * Created by Peter Barth on 27.09.05. * */ #include "PPMessageBox.h" #include #include "SDL_ModalLoop.h" #include "DialogFileSelector.h" PPMessageBox::ReturnCodes PPMessageBox::runModal() { // Convert texts char* captionASCIIZ = this->caption.toASCIIZ(); char* contentASCIIZ = this->content.toASCIIZ(); PPString caption(captionASCIIZ); PPString content(contentASCIIZ); delete[] captionASCIIZ; delete[] contentASCIIZ; // Create a message box (the message box will invoke the responder) PPDialogBase* dialog = new PPDialogBase(screen, NULL, PP_DEFAULT_ID, caption, content); ReturnCodes result = SDL_runModalLoop(screen, dialog); delete dialog; return result; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/sdl/SDL_ModalLoop.cpp0000644000175000017500000000766111150223367024361 0ustar admin2admin2/* * ppui/osinterface/sdl/SDL_ModalLoop.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SDL_ModalLoop.cpp * MilkyTracker * * Created by Peter Barth on 29.03.06. * */ #include #include "SDL_ModalLoop.h" #include "Event.h" #include "Screen.h" #include "DialogBase.h" #include "PPMutex.h" void processSDLEvents(const SDL_Event& event); void processSDLUserEvents(const SDL_UserEvent& event); extern PPMutex* globalMutex; ///////////////////////////////////////////////////////////////// // // Okay here goes a quick description of how a modal dialog // using the SDL is realized: // So when this modal dialog is invoked, we ARE actually between // two globalLoop mutex calls, because we were invoked // by some mouse click or other event // So now we first attach a new event listener to our screen // object (so that all events sent end up in our own listener) // and install our own event handler loop... But this can only // be done when the globalMutex is unlocked first and locked // after... // ///////////////////////////////////////////////////////////////// PPModalDialog::ReturnCodes SDL_runModalLoop(PPScreen* screen, PPDialogBase* dialog) { bool exitModalLoop = false; SDL_Event event; // screen might be disabled in a stackable fashion pp_uint32 screenEnableStackCount = 0; while (!screen->isDisplayEnabled()) { screen->enableDisplay(true); screenEnableStackCount++; } // This is the responder for buttons invoked by the modal dialog ModalLoopResponder modalLoopResponder(exitModalLoop); dialog->setResponder(&modalLoopResponder); // Detach the event listener from the screen, this will actually detach the entire tracker from the screen EventListenerInterface* eventListener = screen->detachEventListener(); // Instantinate our own event listener CustomEventListener customEventListener(eventListener); // Attach it screen->attachEventListener(&customEventListener); // Show it dialog->show(); // Now to the tricky part, since a modal dialog has been invoked through a OS event, globalMutex is in locked state // so to allow further event processing we must unlock the mutex first // -- really messy and critical -- if (globalMutex) globalMutex->unlock(); // Create our own event loop while (!exitModalLoop && SDL_WaitEvent(&event)) { switch (event.type) { case SDL_MOUSEMOTION: { // ignore old mouse motion events in the event queue SDL_Event new_event; if (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)) > 0) { while (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)) > 0); processSDLEvents(new_event); } else { processSDLEvents(event); } break; } case SDL_USEREVENT: processSDLUserEvents((const SDL_UserEvent&)event); break; default: processSDLEvents(event); break; } } // pretend nothing happened at all, continue with main event loop after we're finished here if (globalMutex) globalMutex->lock(); // re-attach tracker screen->attachEventListener(eventListener); // if screen was disabled we enable it again while (screenEnableStackCount > 0) { screen->enableDisplay(false); screenEnableStackCount--; } return modalLoopResponder.getReturnCode(); } milkytracker-0.90.85+dfsg/src/ppui/osinterface/PPMessageBox.h0000644000175000017500000000236411150223367023144 0ustar admin2admin2/* * ppui/osinterface/PPMessageBox.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMessageBox.h * MilkyTracker * * Created by Peter Barth on 27.09.05. * */ #ifndef PPMESSAGEBOX__H #define PPMESSAGEBOX__H #include "PPModalDialog.h" class PPMessageBox : public PPModalDialog { private: PPSystemString caption, content; public: PPMessageBox(PPScreen* screen, const PPSystemString& strCaption, const PPSystemString& strContent) : PPModalDialog(screen), caption(strCaption), content(strContent) { } virtual ReturnCodes runModal(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/carbon/0000755000175000017500000000000011317506144021737 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/osinterface/carbon/PPSavePanel_CARBON.cpp0000644000175000017500000000544311150223367025611 0ustar admin2admin2/* * ppui/osinterface/carbon/PPSavePanel_CARBON.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSavePanel.cpp * MilkyTracker * * Created by Peter Barth on Sat Mar 05 2005. * */ #include #include "PPSavePanel.h" PPSavePanel::ReturnCodes PPSavePanel::runModal() { ReturnCodes result = ReturnCodeCANCEL; OSStatus err = noErr; NavDialogRef theSaveDialog; NavDialogCreationOptions dialogOptions; if ((err = NavGetDefaultDialogCreationOptions(&dialogOptions)) == noErr) { dialogOptions.modality = kWindowModalityAppModal; dialogOptions.windowTitle = CFStringCreateWithCString(NULL, caption, kCFStringEncodingASCII); if (defaultFileName.length()) dialogOptions.saveFileName = CFStringCreateWithCString(NULL, defaultFileName, kCFStringEncodingASCII); err = NavCreatePutFileDialog(&dialogOptions, 0, 0, NULL, NULL, &theSaveDialog); if (theSaveDialog) { err = NavDialogRun(theSaveDialog); NavReplyRecord reply; err = NavDialogGetReply (theSaveDialog, &reply); if (err == noErr) { // retrieve filename AEDesc actualDesc; FSRef fileToSave; //HFSUniStr255 theFileName; //CFStringRef fileNameCFString; err = AECoerceDesc(&reply.selection, typeFSRef, &actualDesc); err = AEGetDescData(&actualDesc, reinterpret_cast(&fileToSave), sizeof(FSRef)); // gib ihm int len = 4096; char* buffer = new char[len+1]; FSRefMakePath (&fileToSave, (UInt8*)buffer, len); int len2 = CFStringGetLength(reply.saveFileName); char* buffer2 = new char[len2+1]; CFStringGetCString(reply.saveFileName, buffer2, len2+1, kCFStringEncodingASCII); fileName = buffer; fileName.append("/"); fileName.append(buffer2); delete[] buffer; delete[] buffer2; result = ReturnCodeOK; NavDisposeReply(&reply); } NavDialogDispose(theSaveDialog); } if (dialogOptions.windowTitle) CFRelease(dialogOptions.windowTitle); if (dialogOptions.saveFileName) CFRelease(dialogOptions.saveFileName); } return result; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/carbon/PPQuitSaveAlert_CARBON.cpp0000644000175000017500000000372711150223367026467 0ustar admin2admin2/* * ppui/osinterface/carbon/PPQuitSaveAlert_CARBON.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPQuitSaveAlert.cpp * MilkyTracker * * Created by Peter Barth on 28.03.05. * */ #include #include "PPQuitSaveAlert.h" PPQuitSaveAlert::ReturnCodes PPQuitSaveAlert::runModal() { ReturnCodes res = ReturnCodeCANCEL; OSStatus err = noErr; NavDialogRef theOpenDialog; NavDialogCreationOptions dialogOptions; if ((err = NavGetDefaultDialogCreationOptions(&dialogOptions)) == noErr) { dialogOptions.modality = kWindowModalityAppModal; dialogOptions.windowTitle = CFStringCreateWithCString(NULL, "You suck", kCFStringEncodingASCII); err = NavCreateAskSaveChangesDialog (&dialogOptions, kNavSaveChangesClosingDocument, NULL, NULL, &theOpenDialog); if (theOpenDialog) { err = NavDialogRun(theOpenDialog); NavUserAction action = NavDialogGetUserAction (theOpenDialog); switch (action) { case kNavUserActionSaveChanges: res = ReturnCodeOK; break; case kNavUserActionDontSaveChanges: res = ReturnCodeNO; break; case kNavUserActionCancel: res = ReturnCodeCANCEL; break; } NavDialogDispose(theOpenDialog); } } return res; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/carbon/PPOpenPanel_CARBON.cpp0000644000175000017500000000540611150223367025613 0ustar admin2admin2/* * ppui/osinterface/carbon/PPOpenPanel_CARBON.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPOpenPanel_CARBON.cpp * MilkyTracker * * Created by Peter Barth on Sun Feb 27 2005. * */ #include #include "PPOpenPanel.h" extern SInt32 globalWindowLevel; extern WindowGroupRef groupRef; PPOpenPanel::PPOpenPanel(PPScreen* screen, const char* caption) : PPModalDialog(screen) { this->caption = new char[strlen(caption)+1]; strcpy(this->caption, caption); } PPOpenPanel::~PPOpenPanel() { delete[] caption; } void PPOpenPanel::addExtension(const PPString& ext, const PPString& desc) { Descriptor* d = new Descriptor(ext, desc); items.add(d); } PPOpenPanel::ReturnCodes PPOpenPanel::runModal() { ReturnCodes result = ReturnCodeCANCEL; OSStatus err = noErr; NavDialogRef theOpenDialog; NavDialogCreationOptions dialogOptions; if ((err = NavGetDefaultDialogCreationOptions(&dialogOptions)) == noErr) { dialogOptions.modality = kWindowModalityAppModal; dialogOptions.windowTitle = CFStringCreateWithCString(NULL, caption, kCFStringEncodingASCII); err = NavCreateChooseFileDialog(&dialogOptions, NULL, NULL, NULL, NULL, NULL, &theOpenDialog); if (theOpenDialog) { err = NavDialogRun(theOpenDialog); NavReplyRecord reply; err = NavDialogGetReply (theOpenDialog, &reply); if (err == noErr) { // retrieve filename AEDesc actualDesc; FSRef fileToOpen; //HFSUniStr255 theFileName; //CFStringRef fileNameCFString; err = AECoerceDesc(&reply.selection, typeFSRef, &actualDesc); err = AEGetDescData(&actualDesc, reinterpret_cast(&fileToOpen), sizeof(FSRef)); // gib ihm int len = PATH_MAX; char* buffer = new char[PATH_MAX+1]; FSRefMakePath (&fileToOpen, (UInt8*)buffer, len); fileName = buffer; delete[] buffer; result = ReturnCodeOK; NavDisposeReply(&reply); } NavDialogDispose(theOpenDialog); } if (dialogOptions.windowTitle) CFRelease(dialogOptions.windowTitle); } return result; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/carbon/PPMessageBox_CARBON.cpp0000644000175000017500000000243211150223367025763 0ustar admin2admin2/* * ppui/osinterface/carbon/PPMessageBox_CARBON.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMessageBox_CARBON.cpp * MilkyTracker * * Created by Peter Barth on 27.09.05. * */ #include #include "PPMessageBox.h" PPMessageBox::ReturnCodes PPMessageBox::runModal() { ReturnCodes res = ReturnCodeOK; OSStatus err = noErr; SInt16 out; Str255 caption, content; CopyCStringToPascal(this->caption, caption); CopyCStringToPascal(this->content, content); err = StandardAlert(kAlertNoteAlert, caption, content, NULL, &out); return res; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/PPOpenPanel.h0000644000175000017500000000301611150223367022763 0ustar admin2admin2/* * ppui/osinterface/PPOpenPanel.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __PPOPENPANEL_H__ #define __PPOPENPANEL_H__ #include "PPModalDialog.h" #include "SimpleVector.h" class PPOpenPanel : public PPModalDialog { protected: PPSimpleVector items; PPSystemString fileName; char* caption; public: PPOpenPanel(PPScreen* screen, const char* caption); virtual ~PPOpenPanel(); // must contain pairs of extensions / description // terminated by TWO NULL pointers virtual void addExtensions(const char* const extensions[]) { for (pp_uint32 i = 0; extensions[i] != NULL; i+=2) addExtension(extensions[i], extensions[i+1]); } virtual void addExtension(const PPString& ext, const PPString& desc); virtual const PPSystemString& getFileName() { return fileName; } virtual ReturnCodes runModal(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/fix_newline.sh0000755000175000017500000000036410737736041023352 0ustar admin2admin2#!/bin/sh # for i in `ls` do if [ -f $i ] then if [ -n "`tail -1c $i`" ] then echo "Bearbeite $i" echo >> $i fi fi done milkytracker-0.90.85+dfsg/src/ppui/osinterface/PPSystem.h0000644000175000017500000000155711150223367022376 0ustar admin2admin2/* * ppui/osinterface/PPSystem.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #if defined(__PPUI_WINDOWS__) #include "PPSystem_WIN32.h" #else #include "PPSystem_POSIX.h" #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/0000755000175000017500000000000011317506143021434 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/WaitWindow_WIN32.cpp0000644000175000017500000000766611315725503025136 0ustar admin2admin2/* * ppui/osinterface/win32/WaitWindow_WIN32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "WaitWindow_WIN32.h" #include "DisplayDeviceBase.h" extern HINSTANCE g_hinst; /* My instance handle */ WaitWindow* WaitWindow::instance = NULL; TCHAR WaitWindow::szClassName[] = _T("MILKYTRACKERWAITWNDCLASS"); LRESULT CALLBACK WaitWindow::WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch (msg) { case WM_PAINT: WaitWindow::getInstance()->render(); break; } return DefWindowProc(hWnd, msg, wParam, lParam); } void WaitWindow::init() { m_BitmapInfo.biSize = sizeof(BITMAPINFOHEADER); m_BitmapInfo.biWidth = getWidth(); m_BitmapInfo.biHeight = -getHeight(); m_BitmapInfo.biPlanes = 1; m_BitmapInfo.biBitCount = 24; m_BitmapInfo.biCompression = BI_RGB; m_BitmapInfo.biSizeImage = 0; m_BitmapInfo.biXPelsPerMeter = 0; m_BitmapInfo.biYPelsPerMeter = 0; m_BitmapInfo.biClrUsed = 0; m_BitmapInfo.biClrImportant = 0; HDC hScreenDC = ::GetWindowDC(NULL); m_hBitmap = ::CreateDIBSection(hScreenDC, (LPBITMAPINFO)&m_BitmapInfo, DIB_RGB_COLORS,(LPVOID *)&m_pBits, NULL, 0); ::ReleaseDC(NULL, hScreenDC); m_hDC = NULL; } void DrawPixel24(void* buffer, pp_int32 x, pp_int32 y, pp_int32 pitch, const PPColor& color) { unsigned char* buff = (unsigned char*)buffer; buff[y*pitch+x*3] = (unsigned char)color.b; buff[y*pitch+x*3+1] = (unsigned char)color.g; buff[y*pitch+x*3+2] = (unsigned char)color.r; } void WaitWindow::render() { ::DrawWaitBar(getWidth(), getHeight(), 160, 16, 0xFFFFFF, (color.r << 16) + (color.g << 8) + (color.b), m_pBits, getWidth()*3, &DrawPixel24); m_hDC = ::GetDC(hWnd); blit(hWnd, m_hDC, 0, 0, getWidth(), getHeight()); ::ReleaseDC(hWnd, m_hDC); m_hDC = NULL; } void WaitWindow::blit(HWND hWnd, HDC pDC, pp_int32 x, pp_int32 y, pp_int32 width, pp_int32 height) { RECT r; ::GetClientRect(hWnd,&r); HDC hBitmapDC = ::CreateCompatibleDC(NULL); HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hBitmapDC, m_hBitmap); ::BitBlt(pDC, x, y, width, height, hBitmapDC, x, y, SRCCOPY); ::SelectObject(hBitmapDC, hOldBitmap); ::DeleteDC(hBitmapDC); } WaitWindow::WaitWindow() { WNDCLASS wc; wc.hCursor = NULL; wc.hIcon = (HICON)::LoadIcon(NULL, IDI_APPLICATION); wc.lpszMenuName = NULL; wc.lpszClassName = szClassName; wc.hbrBackground = 0; wc.hInstance = g_hinst; wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; ::RegisterClass(&wc); hWnd = ::CreateWindow(szClassName, _T("Working..."), 0/*|WS_MAXIMIZEBOX|WS_MINIMIZEBOX*/,CW_USEDEFAULT,CW_USEDEFAULT, getWidth()+::GetSystemMetrics(SM_CXEDGE)*2+2, getHeight()+::GetSystemMetrics(SM_CYCAPTION)+2+::GetSystemMetrics(SM_CYEDGE)*2, NULL, NULL, g_hinst, 0); init(); } WaitWindow* WaitWindow::getInstance() { if (instance == NULL) instance = new WaitWindow(); return instance; } WaitWindow::~WaitWindow() { ::SendMessage(hWnd, WM_CLOSE, 0, 0); } void WaitWindow::show() { ::ShowWindow(hWnd, SW_SHOW); } void WaitWindow::hide() { ::ShowWindow(hWnd, SW_HIDE); } void WaitWindow::move(pp_int32 x, pp_int32 y) { ::SetWindowPos(hWnd, HWND_TOPMOST, x, y, 0, 0, SWP_NOSIZE); } milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPMutex.cpp0000644000175000017500000000214611150223367023504 0ustar admin2admin2/* * ppui/osinterface/win32/PPMutex.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMutex.cpp * PPUI SDL * * Created by Peter Barth on 18.11.05. * */ #include "PPMutex.h" PPMutex::PPMutex() { InitializeCriticalSection( &m_CS ); } PPMutex::~PPMutex() { DeleteCriticalSection( &m_CS ); } void PPMutex::lock() { EnterCriticalSection( &m_CS ); } void PPMutex::unlock() { LeaveCriticalSection( &m_CS ); } milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPMutex.h0000644000175000017500000000203511150223367023146 0ustar admin2admin2/* * ppui/osinterface/win32/PPMutex.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMutex.h * PPUI SDL * * Created by Peter Barth on 18.11.05. * */ #ifndef PPMUTEX__H #define PPMUTEX__H #include class PPMutex { private: CRITICAL_SECTION m_CS; public: PPMutex(); ~PPMutex(); void lock(); void unlock(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPMessageBox_WIN32.cpp0000644000175000017500000000176411150223367025326 0ustar admin2admin2/* * ppui/osinterface/win32/PPMessageBox_WIN32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #include "PPMessageBox.h" extern HWND hWnd; PPMessageBox::ReturnCodes PPMessageBox::runModal() { ReturnCodes res = ReturnCodeOK; ::MessageBox(hWnd, content, caption, MB_OK); return res; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPPath_WIN32.h0000644000175000017500000000442111150223367023623 0ustar admin2admin2/* * ppui/osinterface/win32/PPPath_WIN32.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPPath_WIN32.h * PPUI SDL * * Created by Peter Barth on 10.03.06. * */ #ifndef __PPPATH_WIN32_H__ #define __PPPATH_WIN32_H__ #include "PPPath.h" class PPPathEntry_WIN32 : public PPPathEntry { private: bool drive; public: PPPathEntry_WIN32() : drive(false) { } virtual void create(const PPSystemString& path, const PPSystemString& name); virtual bool isHidden() const; virtual bool isDrive() const { return drive; } void createNoCheck(const PPSystemString& path, const PPSystemString& name, Type type, bool drive); PPPathEntry* clone() const; }; class PPPath_WIN32 : public PPPath { protected: // WIN32 WIN32_FIND_DATA fd; HANDLE hFind; #ifndef _WIN32_WCE pp_uint32 drives; pp_int32 driveCount; #else pp_uint32 contentCount; #endif PPSystemString current; PPPathEntry_WIN32 entry; virtual bool updatePath(); public: PPPath_WIN32(); PPPath_WIN32(const PPSystemString& path); virtual const PPSystemString getCurrent(); bool change(const PPSystemString& path); virtual bool stepInto(const PPSystemString& directory); virtual const PPPathEntry* getFirstEntry(); virtual const PPPathEntry* getNextEntry(); virtual bool canGotoHome() const; virtual void gotoHome(); virtual bool canGotoRoot() const; virtual void gotoRoot(); virtual bool canGotoParent() const; virtual void gotoParent(); virtual char getPathSeparatorAsASCII() const; virtual const PPSystemString getPathSeparator() const; virtual bool fileExists(const PPSystemString& fileName) const; }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/fix_newline.sh0000755000175000017500000000036410737736041024314 0ustar admin2admin2#!/bin/sh # for i in `ls` do if [ -f $i ] then if [ -n "`tail -1c $i`" ] then echo "Bearbeite $i" echo >> $i fi fi done milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPPath_WIN32.cpp0000644000175000017500000002043011150223367024154 0ustar admin2admin2/* * ppui/osinterface/win32/PPPath_WIN32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPPath_WIN32.cpp * PPUI SDL * * Created by Peter Barth on 10.03.06. * */ #include "PPPath_WIN32.h" #include #ifdef UNICODE #ifndef _WIN32_WCE #include #else #include #endif #endif #define PPMAX_DIR_PATH PATH_MAX void PPPathEntry_WIN32::create(const PPSystemString& path, const PPSystemString& name) { drive = false; this->name = name; PPSystemString fullPath = path; fullPath.append(name); if (name.compareTo("..") == 0 || name.compareTo(".") == 0) { type = Directory; size = 0; return; } WIN32_FIND_DATA fd; HANDLE hFind = FindFirstFile(fullPath, &fd); if (hFind == INVALID_HANDLE_VALUE) { /*DWORD err = GetLastError(); char* message; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, (char*)&message, 0, NULL); LocalFree(message);*/ type = Nonexistent; return; } else { size = fd.nFileSizeLow; if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) type = Directory; if (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) type = Hidden; if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) type = File; } FindClose(hFind); } void PPPathEntry_WIN32::createNoCheck(const PPSystemString& path, const PPSystemString& name, Type type, bool drive) { this->name = name; PPSystemString fullPath = path; fullPath.append(name); this->type = type; this->drive = drive; this->size = 0; } bool PPPathEntry_WIN32::isHidden() const { return PPPathEntry::isHidden() || (name.compareTo(".") == 0); } PPPathEntry* PPPathEntry_WIN32::clone() const { // check if this is the correct type PPPathEntry_WIN32* result = new PPPathEntry_WIN32(); result->name = name; result->type = type; result->size = size; result->drive = drive; return result; } bool PPPath_WIN32::updatePath() { #ifndef _WIN32_WCE return SetCurrentDirectory(current) == TRUE; #else if (current.length() == 0) return true; DWORD res = GetFileAttributes(current); if (res == 0xFFFFFFFF) return false; return (res & FILE_ATTRIBUTE_DIRECTORY) != 0; #endif } PPPath_WIN32::PPPath_WIN32() : hFind(NULL), #ifndef _WIN32_WCE drives(0), driveCount(-1) #else contentCount(0) #endif { #ifndef _WIN32_WCE current = getCurrent(); updatePath(); #else change(""); #endif } PPPath_WIN32::PPPath_WIN32(const PPSystemString& path) : hFind(NULL), #ifndef _WIN32_WCE drives(0), driveCount(-1), #else contentCount(0), #endif current(path) { updatePath(); } const PPSystemString PPPath_WIN32::getCurrent() { #ifndef _WIN32_WCE TCHAR szPath[MAX_PATH+1]; GetCurrentDirectory(MAX_PATH, szPath); PPSystemString path(szPath); path.ensureTrailingCharacter(getPathSeparatorAsASCII()); return path; #else PPSystemString path(current); path.ensureTrailingCharacter(getPathSeparatorAsASCII()); return path; #endif } bool PPPath_WIN32::change(const PPSystemString& path) { PPSystemString old = current; current = path; current.ensureTrailingCharacter(getPathSeparatorAsASCII()); bool res = updatePath(); if (res) return true; current = old; updatePath(); return false; } bool PPPath_WIN32::stepInto(const PPSystemString& directory) { PPSystemString old = current; #ifndef _WIN32_WCE // check for drive if (directory.length() == 2) { const TCHAR* str = directory.getStrBuffer(); if (str[1] == ':') { if (change(directory)) return true; else { current = old; return false; } } } #else if (directory.compareTo("..") == 0) { PPSystemString temp = current; temp.ensureTrailingCharacter(getPathSeparatorAsASCII()); temp.deleteAt(temp.length()-1, 1); const TCHAR* base = temp.getStrBuffer(); const TCHAR* ptr = base + temp.length(); while (*ptr != '\\' && ptr > base) ptr--; // TO-DO: make this safe :( TCHAR* tempStr = new TCHAR[ptr - base + 1]; memcpy(tempStr, base, (ptr - base)*sizeof(TCHAR)); tempStr[(ptr - base)] = '\0'; current = tempStr; delete[] tempStr; current.append(getPathSeparator()); if (updatePath()) return true; else { current = old; return false; } } #endif current.append(directory); current.append(getPathSeparator()); if (updatePath()) return true; current = old; return false; } const PPPathEntry* PPPath_WIN32::getFirstEntry() { // if we're not on Windows CE we're going to // enumerate drives first before actually // iterating folder contents #ifndef _WIN32_WCE if (driveCount == -1) { drives = GetLogicalDrives(); driveCount = 0; while (!((drives >> driveCount) & 1) && driveCount < 26) driveCount++; if (driveCount < 26) { char drive = 'A' + driveCount; driveCount++; PPSystemString driveName(drive); driveName.append(":"); entry.createNoCheck("", driveName, PPPathEntry::Directory, true); return &entry; } else driveCount = -1; } #else // if we're on Windows CE we're going to add "." and next time ".." if (contentCount == 0 && (current.length() != 0 && current.compareTo("\\") != 0)) { contentCount++; entry.createNoCheck("", ".", PPPathEntry::Directory, false); return &entry; } #endif PPSystemString current = this->current; current.append("*.*"); hFind = FindFirstFile(current, &fd); if (hFind == INVALID_HANDLE_VALUE) { return NULL; } PPSystemString file(fd.cFileName); entry.create(this->current, file); return &entry; } const PPPathEntry* PPPath_WIN32::getNextEntry() { // continue iterating drives if not finished #ifndef _WIN32_WCE if (driveCount != -1) { while (!((drives >> driveCount) & 1) && driveCount < 26) driveCount++; if (driveCount < 26) { char drive = 'A' + driveCount; driveCount++; PPSystemString driveName(drive); driveName.append(":"); entry.createNoCheck("", driveName, PPPathEntry::Directory, true); return &entry; } else { const PPPathEntry* entry = getFirstEntry(); driveCount = -1; return entry; } } #else // on windows CE add ".." to the folder contents first if (contentCount == 1) { contentCount++; entry.createNoCheck("", "..", PPPathEntry::Directory, false); return &entry; } else if (contentCount == 2) { const PPPathEntry* entry = getFirstEntry(); contentCount = 0; return entry; } #endif BOOL res = FindNextFile(hFind, &fd); if (res) { PPSystemString file(fd.cFileName); entry.create(current, file); return &entry; } FindClose(hFind); return NULL; } bool PPPath_WIN32::canGotoHome() const { // we're going to assume Unicode is for WinNT and higher // means SHGetFolderPath is available #ifdef UNICODE return true; #endif return false; } void PPPath_WIN32::gotoHome() { // we're going to assume Unicode is for WinNT and higher // means SHGetFolderPath is available #ifdef UNICODE TCHAR* pszPath = new TCHAR[MAX_PATH+1]; SHGetSpecialFolderPath(NULL, pszPath, CSIDL_PERSONAL, FALSE); change(pszPath); delete[] pszPath; #endif } bool PPPath_WIN32::canGotoRoot() const { return true; } void PPPath_WIN32::gotoRoot() { change("\\"); updatePath(); } bool PPPath_WIN32::canGotoParent() const { return true; } void PPPath_WIN32::gotoParent() { stepInto(".."); } char PPPath_WIN32::getPathSeparatorAsASCII() const { return '\\'; } const PPSystemString PPPath_WIN32::getPathSeparator() const { return PPSystemString(getPathSeparatorAsASCII()); } bool PPPath_WIN32::fileExists(const PPSystemString& fileName) const { HANDLE handle = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); bool res = handle != INVALID_HANDLE_VALUE; if (res) CloseHandle(handle); return res; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPSavePanel_WIN32.cpp0000644000175000017500000000445511150223367025147 0ustar admin2admin2/* * ppui/osinterface/win32/PPSavePanel_WIN32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSavePanel.cpp * MilkyTracker * * Created by Peter Barth on Sat Mar 05 2005. * */ #include #ifdef _WIN32_WCE #include #endif #include #include "PPSavePanel.h" extern HWND hWnd; PPSavePanel::ReturnCodes PPSavePanel::runModal() { TCHAR szFile[MAX_PATH+1]; OPENFILENAME ofn; memset(szFile, 0, sizeof(szFile)); _tcscpy(szFile, defaultFileName); memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; PPString sourceFilter; pp_int32 i = 0; for (i = 0; i < items.size(); i++) { sourceFilter.append(items.get(i)->description); sourceFilter.append(" (."); sourceFilter.append(items.get(i)->extension); sourceFilter.append(")|"); sourceFilter.append("*."); sourceFilter.append(items.get(i)->extension); sourceFilter.append("|"); } const char* src = sourceFilter; TCHAR* dstFilter = new TCHAR[sourceFilter.length()+2]; memset(dstFilter, 0, (sourceFilter.length()+2)*sizeof(TCHAR)); for (i = 0; i < (signed)sourceFilter.length(); i++) { if (src[i] == '|') dstFilter[i] = '\0'; else dstFilter[i] = src[i]; } ofn.lpstrFilter = dstFilter; ofn.lpstrTitle = _T("Save File"); ofn.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT; PPSystemString defaultExtension(items.get(0)->extension); ofn.lpstrDefExt = defaultExtension; ReturnCodes err = ReturnCodeCANCEL; if (GetSaveFileName(&ofn)) { fileName = szFile; err = ReturnCodeOK; } delete[] dstFilter; return err; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPSystem_WIN32.cpp0000644000175000017500000000356311150223367024554 0ustar admin2admin2/* * ppui/osinterface/win32/PPSystem_WIN32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * System_WIN32.cpp * MilkyTracker * * Created by Peter Barth on Thu Mar 10 2005. * */ #include "PPSystem_WIN32.h" #include #include SYSCHAR System::buffer[MAX_PATH+1]; const SYSCHAR* System::getTempFileName() { TCHAR szPath[MAX_PATH+1]; _tcscpy(szPath, getConfigFileName(_T(""))); UINT result = ::GetTempFileName(szPath, _T("mt"), ::GetTickCount(), buffer); if (result == 0) { return getConfigFileName(_T("milkytracker_temp")); } return buffer; } const SYSCHAR* System::getConfigFileName(SYSCHAR* fileName/* = NULL*/) { // get path of our executable TCHAR szPath[MAX_PATH+1]; DWORD dwLen; LPTSTR p; ::GetModuleFileName(NULL, szPath, MAX_PATH); // cut off executable dwLen = (DWORD)_tcslen(szPath); if (dwLen) { p = szPath + dwLen; while (p != szPath) { if (TEXT('\\') == *--p) { *(++p) = 0; break; } } } if (fileName) _tcscat(szPath, fileName); else _tcscat(szPath, _T("milkytracker.cfg")); _tcscpy(buffer, szPath); return buffer; } void System::msleep(int msecs) { if (msecs < 0) return; ::Sleep(msecs); } milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/WaitWindow_WIN32.h0000644000175000017500000000346511150223367024572 0ustar admin2admin2/* * ppui/osinterface/win32/WaitWindow_WIN32.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef WAITWINDOW__H #define WAITWINDOW__H #include #include "tchar.h" #include "BasicTypes.h" class WaitWindow { private: static WaitWindow* instance; // Windows stuff static TCHAR szClassName[]; HWND hWnd; // Window callback static LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); // Render my own window content BITMAPINFOHEADER m_BitmapInfo; // <- this should be saved, eg make it a member variable HBITMAP m_hBitmap; LPBYTE m_pBits; HDC m_hDC; void init(); // Blit my content into DC void blit(HWND hWnd, HDC pDC, pp_int32 x, pp_int32 y, pp_int32 width, pp_int32 height); void render(); PPColor color; WaitWindow(); public: static WaitWindow* getInstance(); ~WaitWindow(); void show(); void hide(); void move(pp_int32 x, pp_int32 y); void update() { render(); } pp_int32 getWidth() { return 260; } pp_int32 getHeight() { return 80; } void setColor(const PPColor& color) { this->color = color; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPQuitSaveAlert_WIN32.cpp0000644000175000017500000000262111150223367026013 0ustar admin2admin2/* * ppui/osinterface/win32/PPQuitSaveAlert_WIN32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPQuitSaveAlert.cpp * MilkyTracker * * Created by Peter Barth on 28.03.05. * */ #include #include #include "PPQuitSaveAlert.h" extern HWND hWnd; PPQuitSaveAlert::ReturnCodes PPQuitSaveAlert::runModal() { ReturnCodes res = ReturnCodeCANCEL; int nID = MessageBox(hWnd, _T("Do you want to save the changes you made to your documents?"), _T("Save changes"), MB_YESNOCANCEL | MB_ICONQUESTION); if (nID == IDYES) { res = ReturnCodeOK; } else if (nID == IDNO) { res = ReturnCodeNO; } else if (nID == IDCANCEL) { res = ReturnCodeCANCEL; } return res; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPOpenPanel_WIN32.cpp0000644000175000017500000000556211150223367025152 0ustar admin2admin2/* * ppui/osinterface/win32/PPOpenPanel_WIN32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #ifdef _WIN32_WCE #include #endif #include #include "OSInterface\PPOpenPanel.h" extern HWND hWnd; PPOpenPanel::PPOpenPanel(PPScreen* screen, const char* caption) : PPModalDialog(screen) { } PPOpenPanel::~PPOpenPanel() { } void PPOpenPanel::addExtension(const PPString& ext, const PPString& desc) { Descriptor* d = new Descriptor(ext, desc); items.add(d); } PPOpenPanel::ReturnCodes PPOpenPanel::runModal() { TCHAR szFile[MAX_PATH+1]; OPENFILENAME ofn; memset(szFile, 0, sizeof(szFile)); memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; if (items.size() == 1) ofn.nFilterIndex = 0; else if (items.size() > 1) ofn.nFilterIndex = items.size()+1; PPString sourceFilter; pp_int32 i = 0; // single types for (i = 0; i < items.size(); i++) { sourceFilter.append(items.get(i)->description); sourceFilter.append(" (."); sourceFilter.append(items.get(i)->extension); sourceFilter.append(")|"); sourceFilter.append("*."); sourceFilter.append(items.get(i)->extension); sourceFilter.append("|"); } // all supported types if (items.size() > 1) { sourceFilter.append("All supported types|"); for (i = 0; i < items.size(); i++) { sourceFilter.append("*."); sourceFilter.append(items.get(i)->extension); if (i < items.size()-1) sourceFilter.append(";"); } sourceFilter.append("|"); } // all files sourceFilter.append("All files (*.*)|"); sourceFilter.append("*.*"); sourceFilter.append("|"); const char* src = sourceFilter; TCHAR* dstFilter = new TCHAR[sourceFilter.length()+2]; memset(dstFilter, 0, (sourceFilter.length()+2)*sizeof(TCHAR)); for (i = 0; i < (signed)sourceFilter.length(); i++) { if (src[i] == '|') dstFilter[i] = '\0'; else dstFilter[i] = src[i]; } ofn.lpstrFilter = dstFilter; ofn.lpstrTitle = _T("Open File"); ofn.Flags = OFN_EXPLORER; ReturnCodes err = ReturnCodeCANCEL; if (GetOpenFileName(&ofn)) { fileName = szFile; err = ReturnCodeOK; } delete[] dstFilter; return err; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPSystem_WIN32.h0000644000175000017500000000222211150223367024210 0ustar admin2admin2/* * ppui/osinterface/win32/PPSystem_WIN32.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * System_WIN32.h * MilkyTracker * * Created by Peter Barth on Thu Mar 10 2005. * */ #ifndef SYSTEM_WIN32_H #define SYSTEM_WIN32_H #include "XModule.h" class System { private: static SYSCHAR buffer[]; public: static const SYSCHAR* getTempFileName(); static const SYSCHAR* getConfigFileName(SYSCHAR* fileName = NULL); static void msleep(int msecs); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/win32/PPSystemString_WIN32.h0000644000175000017500000002156411150223367025411 0ustar admin2admin2/* * ppui/osinterface/win32/PPSystemString_WIN32.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSystemString.h * MilkyTracker * * Created by Peter Barth on Sun Apr 03 2005. * */ #ifndef PPSYSTEMSTRING__H #define PPSYSTEMSTRING__H #include "BasicTypes.h" #include typedef TCHAR SYSCHAR; class PPSystemString { private: SYSCHAR* strBuffer; pp_uint32 allocatedSize; HRESULT __fastcall AnsiToUnicode(LPCSTR pszA, LPWSTR* ppszW) { ULONG cCharacters; DWORD dwError; // If input is null then just return the same. if (NULL == pszA) { *ppszW = NULL; return NOERROR; } // Determine number of wide characters to be allocated for the // Unicode string. cCharacters = strlen(pszA)+1; // Use of the OLE allocator is required if the resultant Unicode // string will be passed to another COM component and if that // component will free it. Otherwise you can use your own allocator. *ppszW = (LPWSTR) malloc(cCharacters*2); if (NULL == *ppszW) return E_OUTOFMEMORY; // Covert to Unicode. if (0 == MultiByteToWideChar(CP_ACP, 0, pszA, cCharacters, *ppszW, cCharacters)) { dwError = GetLastError(); free(*ppszW); *ppszW = NULL; return HRESULT_FROM_WIN32(dwError); } return NOERROR; } void reAlloc(pp_uint32 newSize) { if (newSize <= allocatedSize) return; SYSCHAR* newStrBuffer = new SYSCHAR[newSize]; memcpy(newStrBuffer, strBuffer, sizeof(SYSCHAR)*allocatedSize); delete[] strBuffer; strBuffer = newStrBuffer; allocatedSize = newSize; } public: // Empty string PPSystemString() { strBuffer = new SYSCHAR[1]; *strBuffer = 0; allocatedSize = 1; } // String from single character PPSystemString(SYSCHAR c) { strBuffer = new SYSCHAR[2]; *strBuffer = c; *(strBuffer+1) = 0; allocatedSize = 2; } PPSystemString(const SYSCHAR* str) { strBuffer = new SYSCHAR[_tcslen(str) + 1]; _tcscpy(strBuffer, str); allocatedSize = (pp_uint32)_tcslen(str) + 1; } PPSystemString(const char* str) { LPWSTR tempStr = NULL; if (AnsiToUnicode(str, &tempStr) == NOERROR) { strBuffer = new SYSCHAR[_tcslen(tempStr) + 1]; allocatedSize = (pp_uint32)_tcslen(tempStr) + 1; _tcscpy(strBuffer, tempStr); free(tempStr); } else { strBuffer = new SYSCHAR[1]; *strBuffer = 0; allocatedSize = 1; } } PPSystemString(const SYSCHAR* str, pp_uint32 length) { strBuffer = new SYSCHAR[length + 1]; memcpy(strBuffer, str, length*sizeof(SYSCHAR)); strBuffer[length] = 0; allocatedSize = length + 1; } // copy c'tor PPSystemString(const PPSystemString& str) { strBuffer = new SYSCHAR[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize*sizeof(SYSCHAR)); allocatedSize = str.allocatedSize; } operator const SYSCHAR*() const { return strBuffer; } const SYSCHAR* getStrBuffer() const { return strBuffer; } // assignment operator PPSystemString& operator=(const PPSystemString& str) { if (this != &str) { delete[] strBuffer; strBuffer = new SYSCHAR[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize*sizeof(SYSCHAR)); allocatedSize = str.allocatedSize; } return *this; } PPSystemString& operator=(const char* str) { delete[] strBuffer; allocatedSize = (pp_uint32)strlen(str)+1; strBuffer = new SYSCHAR[allocatedSize]; for (pp_uint32 i = 0; i < allocatedSize; i++) strBuffer[i] = str[i]; return *this; } // comparison is necessary too bool operator==(const PPSystemString& str) const { return _tcscmp(strBuffer, str.strBuffer) == 0; } bool operator!=(const PPSystemString& str) const { return _tcscmp(strBuffer, str.strBuffer) != 0; } pp_int32 compareTo(const PPSystemString& str) const { return _tcscmp(strBuffer, str.strBuffer); } pp_int32 compareToNoCase(const PPSystemString& str) const { return _tcsicmp(strBuffer, str.strBuffer); } void toUpper() { for (pp_uint32 i = 0; i < length(); i++) if (strBuffer[i] >= 'a' && strBuffer[i] <= 'z') strBuffer[i] -= 'a'-'A'; } ~PPSystemString() { delete[] strBuffer; } pp_uint32 length() const { return (pp_uint32)_tcslen(strBuffer); } void insertAt(pp_uint32 i, const PPSystemString& s) { // doesn't work if (i > length()) return; allocatedSize = length() + s.length() + 1; SYSCHAR* newStr = new SYSCHAR[allocatedSize]; memcpy(newStr, strBuffer, i*sizeof(SYSCHAR)); memcpy(newStr + i, s.strBuffer, s.length()*sizeof(SYSCHAR)); memcpy(newStr + i + s.length(), strBuffer + i, (length() - i)*sizeof(SYSCHAR)); newStr[length() + s.length()] = 0; delete[] strBuffer; strBuffer = newStr; } void append(const PPSystemString& s) { insertAt(length(), s); } void deleteAt(pp_uint32 i, pp_uint32 numChars) { // not possible if (i > length()) return; // nothing to delete if ((signed)length() - (signed)numChars < 0) return; // nothing to delete if (strBuffer[i] == 0) return; SYSCHAR* newStr = new SYSCHAR[length() - numChars + 1]; allocatedSize = length() - numChars + 1; memcpy(newStr, strBuffer, i*sizeof(SYSCHAR)); memcpy(newStr + i, strBuffer + i + numChars, (length() - i - numChars)*sizeof(SYSCHAR)); newStr[length() - numChars] = 0; delete[] strBuffer; strBuffer = newStr; } void replace(const PPSystemString& str) { delete[] strBuffer; strBuffer = new SYSCHAR[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize*sizeof(SYSCHAR)); allocatedSize = str.allocatedSize; } PPSystemString stripPath() const { SYSCHAR* ptr = strBuffer+_tcslen(strBuffer); while (ptr > strBuffer && *ptr != '\\') ptr--; if (ptr != strBuffer) ptr++; PPSystemString str = ptr; return str; } PPSystemString stripExtension() const { SYSCHAR* ptr = strBuffer+_tcslen(strBuffer); while (ptr > strBuffer && *ptr != '.' && *ptr != '\\') ptr--; if (*ptr == '\\') return strBuffer; if (ptr != strBuffer) { PPSystemString str; delete[] str.strBuffer; str.allocatedSize = (pp_uint32)((ptr-strBuffer)+1); str.strBuffer = new SYSCHAR[str.allocatedSize]; memcpy(str.strBuffer, strBuffer, (ptr-strBuffer)*sizeof(SYSCHAR)); str.strBuffer[(ptr-strBuffer)] = '\0'; return str; } else { return ptr; } } PPSystemString getExtension() const { SYSCHAR* ptr = strBuffer+_tcslen(strBuffer); while (ptr > strBuffer && *ptr != '.' && *ptr != '/') ptr--; if (*ptr != '.') return _T(""); return ptr; } pp_int32 compareExtensions(const PPSystemString& str) const { SYSCHAR* ptrSrc = strBuffer+_tcslen(strBuffer); while (ptrSrc > strBuffer && *ptrSrc != '.' && *ptrSrc != '\\') ptrSrc--; bool noExt1 = false; if (*ptrSrc != '.') noExt1 = true; ptrSrc++; if (*ptrSrc == '\0') noExt1 = true; SYSCHAR* ptrDst = str.strBuffer+_tcslen(str.strBuffer); while (ptrDst > str.strBuffer && *ptrDst != '.' && *ptrDst != '\\') ptrDst--; if (*ptrDst != '.') return noExt1 ? 0 : 1; ptrDst++; if (*ptrDst == '\0') return noExt1 ? 0 : 1; return _tcsicmp(ptrSrc, ptrDst); } bool compareToExtension(const PPSystemString& extension) const { SYSCHAR* ptrSrc = strBuffer+_tcslen(strBuffer); while (ptrSrc > strBuffer && *ptrSrc != '.' && *ptrSrc != '\\') ptrSrc--; if (*ptrSrc != '.') return false; ptrSrc++; if (*ptrSrc == '\0') return false; return _tcsicmp(ptrSrc, extension.strBuffer) == 0; } void ensureTrailingCharacter(char chr) { pp_uint32 len = length(); if (len) { SYSCHAR* ptr = strBuffer+(len-1); if (*ptr != (SYSCHAR)chr) append(chr); } } bool startsWith(const PPSystemString& src) const { pp_uint32 srcLen = src.length(); pp_uint32 thisLen = length(); if (srcLen > thisLen) return false; if (srcLen == 0) return true; if (srcLen == thisLen) return compareTo(src) == 0; for (pp_uint32 i = 0; i < srcLen; i++) if (src.strBuffer[i] != strBuffer[i]) return false; return true; } // Delete this pointer after usage char* toASCIIZ() const { char* newStr = new char[length() + 1]; SYSCHAR* ptr = strBuffer; pp_int32 i = 0; while (*ptr) { newStr[i] = (char)(*ptr++); i++; } newStr[i] = '\0'; return newStr; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/Makefile.am0000644000175000017500000000247411135201273022527 0ustar admin2admin2noinst_LIBRARIES = libosinterface.a libosinterface_a_SOURCES = PPPathFactory.cpp posix/PPPath_POSIX.cpp \ posix/PPSystem_POSIX.cpp sdl/PPMessageBox_SDL.cpp sdl/PPMutex.cpp \ sdl/PPOpenPanel_SDL.cpp sdl/PPQuitSaveAlert_SDL.cpp sdl/PPSavePanel_SDL.cpp \ sdl/SDL_ModalLoop.cpp noinst_HEADERS = PPMessageBox.h PPModalDialog.h PPOpenPanel.h PPPathFactory.h \ PPQuitSaveAlert.h PPSavePanel.h PPSystem.h posix/PPPath_POSIX.h \ posix/PPSystemString_POSIX.h posix/PPSystem_POSIX.h sdl/PPMutex.h \ sdl/SDL_ModalLoop.h EXTRA_DIST = carbon/PPMessageBox_CARBON.cpp carbon/PPOpenPanel_CARBON.cpp \ carbon/PPQuitSaveAlert_CARBON.cpp carbon/PPSavePanel_CARBON.cpp \ posix/PPMutex.cpp posix/PPMutex.h sdl/PPMutex.cpp sdl/PPMutex.h \ win32/PPMessageBox_WIN32.cpp win32/PPMutex.cpp win32/PPMutex.h \ win32/PPOpenPanel_WIN32.cpp win32/PPPath_WIN32.cpp win32/PPPath_WIN32.h \ win32/PPQuitSaveAlert_WIN32.cpp win32/PPSavePanel_WIN32.cpp \ win32/PPSystemString_WIN32.h win32/PPSystem_WIN32.cpp win32/PPSystem_WIN32.h \ win32/WaitWindow_WIN32.cpp win32/WaitWindow_WIN32.h \ wince/PPOpenPanel_WINCE.cpp wince/PPQuitSaveAlert_WINCE.cpp \ wince/PPSavePanel_WINCE.cpp INCLUDES = -I$(top_srcdir)/src/ppui -I$(top_srcdir)/src/ppui/osinterface/posix \ -I$(top_srcdir)/src/ppui/osinterface/sdl AM_CPPFLAGS = -DMILKYTRACKER -D__THREADTIMER__ -D__LINUX__ ${SDL_CFLAGS} milkytracker-0.90.85+dfsg/src/ppui/osinterface/PPPathFactory.h0000644000175000017500000000225311150223367023330 0ustar admin2admin2/* * ppui/osinterface/PPPathFactory.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPPathFactory.h * MilkyTracker * * Created by Peter Barth on 27.11.06. * */ #ifndef __PPPATHFACTORY_POSIX_H__ #define __PPPATHFACTORY_POSIX_H__ #include "PPPath.h" class PPPathFactory { private: PPPathFactory() { } public: static PPPathEntry* createPathEntry(); static PPPath* createPath(); static PPPath* createPathFromString(const PPSystemString& path); }; #endif // __PPPATH_POSIX_H__ milkytracker-0.90.85+dfsg/src/ppui/osinterface/PPModalDialog.h0000644000175000017500000000236011150223367023257 0ustar admin2admin2/* * ppui/osinterface/PPModalDialog.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPModalDialog.h * MilkyTracker * * Created by Peter Barth on 28.03.05. * */ #ifndef PPMODALDIALOG__H #define PPMODALDIALOG__H #include "BasicTypes.h" class PPScreen; class PPModalDialog { public: enum ReturnCodes { ReturnCodeOK, ReturnCodeCANCEL, ReturnCodeNO }; protected: PPScreen* screen; public: PPModalDialog(PPScreen* theScreen) : screen(theScreen) { } virtual ~PPModalDialog() { } virtual ReturnCodes runModal() = 0; }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/PPPathFactory.cpp0000644000175000017500000000302211150223367023656 0ustar admin2admin2/* * ppui/osinterface/PPPathFactory.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPPathFactory.cpp * MilkyTracker * * Created by Peter Barth on 27.11.06. * */ #include "PPPathFactory.h" #include "BasicTypes.h" #if !defined(__PPUI_WINDOWS__) #include "PPPath_POSIX.h" PPPathEntry* PPPathFactory::createPathEntry() { return new PPPathEntry_POSIX(); } PPPath* PPPathFactory::createPath() { return new PPPath_POSIX(); } PPPath* PPPathFactory::createPathFromString(const PPSystemString& path) { return new PPPath_POSIX(path); } #else #include "PPPath_WIN32.h" PPPathEntry* PPPathFactory::createPathEntry() { return new PPPathEntry_WIN32(); } PPPath* PPPathFactory::createPath() { return new PPPath_WIN32(); } PPPath* PPPathFactory::createPathFromString(const PPSystemString& path) { return new PPPath_WIN32(path); } #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/Makefile.in0000644000175000017500000007235411317506534022556 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = src/ppui/osinterface DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libosinterface_a_AR = $(AR) $(ARFLAGS) libosinterface_a_LIBADD = am_libosinterface_a_OBJECTS = PPPathFactory.$(OBJEXT) \ PPPath_POSIX.$(OBJEXT) PPSystem_POSIX.$(OBJEXT) \ PPMessageBox_SDL.$(OBJEXT) PPMutex.$(OBJEXT) \ PPOpenPanel_SDL.$(OBJEXT) PPQuitSaveAlert_SDL.$(OBJEXT) \ PPSavePanel_SDL.$(OBJEXT) SDL_ModalLoop.$(OBJEXT) libosinterface_a_OBJECTS = $(am_libosinterface_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libosinterface_a_SOURCES) DIST_SOURCES = $(libosinterface_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ noinst_LIBRARIES = libosinterface.a libosinterface_a_SOURCES = PPPathFactory.cpp posix/PPPath_POSIX.cpp \ posix/PPSystem_POSIX.cpp sdl/PPMessageBox_SDL.cpp sdl/PPMutex.cpp \ sdl/PPOpenPanel_SDL.cpp sdl/PPQuitSaveAlert_SDL.cpp sdl/PPSavePanel_SDL.cpp \ sdl/SDL_ModalLoop.cpp noinst_HEADERS = PPMessageBox.h PPModalDialog.h PPOpenPanel.h PPPathFactory.h \ PPQuitSaveAlert.h PPSavePanel.h PPSystem.h posix/PPPath_POSIX.h \ posix/PPSystemString_POSIX.h posix/PPSystem_POSIX.h sdl/PPMutex.h \ sdl/SDL_ModalLoop.h EXTRA_DIST = carbon/PPMessageBox_CARBON.cpp carbon/PPOpenPanel_CARBON.cpp \ carbon/PPQuitSaveAlert_CARBON.cpp carbon/PPSavePanel_CARBON.cpp \ posix/PPMutex.cpp posix/PPMutex.h sdl/PPMutex.cpp sdl/PPMutex.h \ win32/PPMessageBox_WIN32.cpp win32/PPMutex.cpp win32/PPMutex.h \ win32/PPOpenPanel_WIN32.cpp win32/PPPath_WIN32.cpp win32/PPPath_WIN32.h \ win32/PPQuitSaveAlert_WIN32.cpp win32/PPSavePanel_WIN32.cpp \ win32/PPSystemString_WIN32.h win32/PPSystem_WIN32.cpp win32/PPSystem_WIN32.h \ win32/WaitWindow_WIN32.cpp win32/WaitWindow_WIN32.h \ wince/PPOpenPanel_WINCE.cpp wince/PPQuitSaveAlert_WINCE.cpp \ wince/PPSavePanel_WINCE.cpp INCLUDES = -I$(top_srcdir)/src/ppui -I$(top_srcdir)/src/ppui/osinterface/posix \ -I$(top_srcdir)/src/ppui/osinterface/sdl AM_CPPFLAGS = -DMILKYTRACKER -D__THREADTIMER__ -D__LINUX__ ${SDL_CFLAGS} all: all-am .SUFFIXES: .SUFFIXES: .cpp .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) --gnu src/ppui/osinterface/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/ppui/osinterface/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-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libosinterface.a: $(libosinterface_a_OBJECTS) $(libosinterface_a_DEPENDENCIES) -rm -f libosinterface.a $(libosinterface_a_AR) libosinterface.a $(libosinterface_a_OBJECTS) $(libosinterface_a_LIBADD) $(RANLIB) libosinterface.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPMessageBox_SDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPMutex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPOpenPanel_SDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPPathFactory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPPath_POSIX.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPQuitSaveAlert_SDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPSavePanel_SDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPSystem_POSIX.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SDL_ModalLoop.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` PPPath_POSIX.o: posix/PPPath_POSIX.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPPath_POSIX.o -MD -MP -MF $(DEPDIR)/PPPath_POSIX.Tpo -c -o PPPath_POSIX.o `test -f 'posix/PPPath_POSIX.cpp' || echo '$(srcdir)/'`posix/PPPath_POSIX.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPPath_POSIX.Tpo $(DEPDIR)/PPPath_POSIX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='posix/PPPath_POSIX.cpp' object='PPPath_POSIX.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPPath_POSIX.o `test -f 'posix/PPPath_POSIX.cpp' || echo '$(srcdir)/'`posix/PPPath_POSIX.cpp PPPath_POSIX.obj: posix/PPPath_POSIX.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPPath_POSIX.obj -MD -MP -MF $(DEPDIR)/PPPath_POSIX.Tpo -c -o PPPath_POSIX.obj `if test -f 'posix/PPPath_POSIX.cpp'; then $(CYGPATH_W) 'posix/PPPath_POSIX.cpp'; else $(CYGPATH_W) '$(srcdir)/posix/PPPath_POSIX.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPPath_POSIX.Tpo $(DEPDIR)/PPPath_POSIX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='posix/PPPath_POSIX.cpp' object='PPPath_POSIX.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPPath_POSIX.obj `if test -f 'posix/PPPath_POSIX.cpp'; then $(CYGPATH_W) 'posix/PPPath_POSIX.cpp'; else $(CYGPATH_W) '$(srcdir)/posix/PPPath_POSIX.cpp'; fi` PPSystem_POSIX.o: posix/PPSystem_POSIX.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPSystem_POSIX.o -MD -MP -MF $(DEPDIR)/PPSystem_POSIX.Tpo -c -o PPSystem_POSIX.o `test -f 'posix/PPSystem_POSIX.cpp' || echo '$(srcdir)/'`posix/PPSystem_POSIX.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPSystem_POSIX.Tpo $(DEPDIR)/PPSystem_POSIX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='posix/PPSystem_POSIX.cpp' object='PPSystem_POSIX.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPSystem_POSIX.o `test -f 'posix/PPSystem_POSIX.cpp' || echo '$(srcdir)/'`posix/PPSystem_POSIX.cpp PPSystem_POSIX.obj: posix/PPSystem_POSIX.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPSystem_POSIX.obj -MD -MP -MF $(DEPDIR)/PPSystem_POSIX.Tpo -c -o PPSystem_POSIX.obj `if test -f 'posix/PPSystem_POSIX.cpp'; then $(CYGPATH_W) 'posix/PPSystem_POSIX.cpp'; else $(CYGPATH_W) '$(srcdir)/posix/PPSystem_POSIX.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPSystem_POSIX.Tpo $(DEPDIR)/PPSystem_POSIX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='posix/PPSystem_POSIX.cpp' object='PPSystem_POSIX.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPSystem_POSIX.obj `if test -f 'posix/PPSystem_POSIX.cpp'; then $(CYGPATH_W) 'posix/PPSystem_POSIX.cpp'; else $(CYGPATH_W) '$(srcdir)/posix/PPSystem_POSIX.cpp'; fi` PPMessageBox_SDL.o: sdl/PPMessageBox_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPMessageBox_SDL.o -MD -MP -MF $(DEPDIR)/PPMessageBox_SDL.Tpo -c -o PPMessageBox_SDL.o `test -f 'sdl/PPMessageBox_SDL.cpp' || echo '$(srcdir)/'`sdl/PPMessageBox_SDL.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPMessageBox_SDL.Tpo $(DEPDIR)/PPMessageBox_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPMessageBox_SDL.cpp' object='PPMessageBox_SDL.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPMessageBox_SDL.o `test -f 'sdl/PPMessageBox_SDL.cpp' || echo '$(srcdir)/'`sdl/PPMessageBox_SDL.cpp PPMessageBox_SDL.obj: sdl/PPMessageBox_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPMessageBox_SDL.obj -MD -MP -MF $(DEPDIR)/PPMessageBox_SDL.Tpo -c -o PPMessageBox_SDL.obj `if test -f 'sdl/PPMessageBox_SDL.cpp'; then $(CYGPATH_W) 'sdl/PPMessageBox_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPMessageBox_SDL.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPMessageBox_SDL.Tpo $(DEPDIR)/PPMessageBox_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPMessageBox_SDL.cpp' object='PPMessageBox_SDL.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPMessageBox_SDL.obj `if test -f 'sdl/PPMessageBox_SDL.cpp'; then $(CYGPATH_W) 'sdl/PPMessageBox_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPMessageBox_SDL.cpp'; fi` PPMutex.o: sdl/PPMutex.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPMutex.o -MD -MP -MF $(DEPDIR)/PPMutex.Tpo -c -o PPMutex.o `test -f 'sdl/PPMutex.cpp' || echo '$(srcdir)/'`sdl/PPMutex.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPMutex.Tpo $(DEPDIR)/PPMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPMutex.cpp' object='PPMutex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPMutex.o `test -f 'sdl/PPMutex.cpp' || echo '$(srcdir)/'`sdl/PPMutex.cpp PPMutex.obj: sdl/PPMutex.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPMutex.obj -MD -MP -MF $(DEPDIR)/PPMutex.Tpo -c -o PPMutex.obj `if test -f 'sdl/PPMutex.cpp'; then $(CYGPATH_W) 'sdl/PPMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPMutex.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPMutex.Tpo $(DEPDIR)/PPMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPMutex.cpp' object='PPMutex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPMutex.obj `if test -f 'sdl/PPMutex.cpp'; then $(CYGPATH_W) 'sdl/PPMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPMutex.cpp'; fi` PPOpenPanel_SDL.o: sdl/PPOpenPanel_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPOpenPanel_SDL.o -MD -MP -MF $(DEPDIR)/PPOpenPanel_SDL.Tpo -c -o PPOpenPanel_SDL.o `test -f 'sdl/PPOpenPanel_SDL.cpp' || echo '$(srcdir)/'`sdl/PPOpenPanel_SDL.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPOpenPanel_SDL.Tpo $(DEPDIR)/PPOpenPanel_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPOpenPanel_SDL.cpp' object='PPOpenPanel_SDL.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPOpenPanel_SDL.o `test -f 'sdl/PPOpenPanel_SDL.cpp' || echo '$(srcdir)/'`sdl/PPOpenPanel_SDL.cpp PPOpenPanel_SDL.obj: sdl/PPOpenPanel_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPOpenPanel_SDL.obj -MD -MP -MF $(DEPDIR)/PPOpenPanel_SDL.Tpo -c -o PPOpenPanel_SDL.obj `if test -f 'sdl/PPOpenPanel_SDL.cpp'; then $(CYGPATH_W) 'sdl/PPOpenPanel_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPOpenPanel_SDL.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPOpenPanel_SDL.Tpo $(DEPDIR)/PPOpenPanel_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPOpenPanel_SDL.cpp' object='PPOpenPanel_SDL.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPOpenPanel_SDL.obj `if test -f 'sdl/PPOpenPanel_SDL.cpp'; then $(CYGPATH_W) 'sdl/PPOpenPanel_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPOpenPanel_SDL.cpp'; fi` PPQuitSaveAlert_SDL.o: sdl/PPQuitSaveAlert_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPQuitSaveAlert_SDL.o -MD -MP -MF $(DEPDIR)/PPQuitSaveAlert_SDL.Tpo -c -o PPQuitSaveAlert_SDL.o `test -f 'sdl/PPQuitSaveAlert_SDL.cpp' || echo '$(srcdir)/'`sdl/PPQuitSaveAlert_SDL.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPQuitSaveAlert_SDL.Tpo $(DEPDIR)/PPQuitSaveAlert_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPQuitSaveAlert_SDL.cpp' object='PPQuitSaveAlert_SDL.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPQuitSaveAlert_SDL.o `test -f 'sdl/PPQuitSaveAlert_SDL.cpp' || echo '$(srcdir)/'`sdl/PPQuitSaveAlert_SDL.cpp PPQuitSaveAlert_SDL.obj: sdl/PPQuitSaveAlert_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPQuitSaveAlert_SDL.obj -MD -MP -MF $(DEPDIR)/PPQuitSaveAlert_SDL.Tpo -c -o PPQuitSaveAlert_SDL.obj `if test -f 'sdl/PPQuitSaveAlert_SDL.cpp'; then $(CYGPATH_W) 'sdl/PPQuitSaveAlert_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPQuitSaveAlert_SDL.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPQuitSaveAlert_SDL.Tpo $(DEPDIR)/PPQuitSaveAlert_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPQuitSaveAlert_SDL.cpp' object='PPQuitSaveAlert_SDL.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPQuitSaveAlert_SDL.obj `if test -f 'sdl/PPQuitSaveAlert_SDL.cpp'; then $(CYGPATH_W) 'sdl/PPQuitSaveAlert_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPQuitSaveAlert_SDL.cpp'; fi` PPSavePanel_SDL.o: sdl/PPSavePanel_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPSavePanel_SDL.o -MD -MP -MF $(DEPDIR)/PPSavePanel_SDL.Tpo -c -o PPSavePanel_SDL.o `test -f 'sdl/PPSavePanel_SDL.cpp' || echo '$(srcdir)/'`sdl/PPSavePanel_SDL.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPSavePanel_SDL.Tpo $(DEPDIR)/PPSavePanel_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPSavePanel_SDL.cpp' object='PPSavePanel_SDL.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPSavePanel_SDL.o `test -f 'sdl/PPSavePanel_SDL.cpp' || echo '$(srcdir)/'`sdl/PPSavePanel_SDL.cpp PPSavePanel_SDL.obj: sdl/PPSavePanel_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PPSavePanel_SDL.obj -MD -MP -MF $(DEPDIR)/PPSavePanel_SDL.Tpo -c -o PPSavePanel_SDL.obj `if test -f 'sdl/PPSavePanel_SDL.cpp'; then $(CYGPATH_W) 'sdl/PPSavePanel_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPSavePanel_SDL.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/PPSavePanel_SDL.Tpo $(DEPDIR)/PPSavePanel_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/PPSavePanel_SDL.cpp' object='PPSavePanel_SDL.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PPSavePanel_SDL.obj `if test -f 'sdl/PPSavePanel_SDL.cpp'; then $(CYGPATH_W) 'sdl/PPSavePanel_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/PPSavePanel_SDL.cpp'; fi` SDL_ModalLoop.o: sdl/SDL_ModalLoop.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SDL_ModalLoop.o -MD -MP -MF $(DEPDIR)/SDL_ModalLoop.Tpo -c -o SDL_ModalLoop.o `test -f 'sdl/SDL_ModalLoop.cpp' || echo '$(srcdir)/'`sdl/SDL_ModalLoop.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SDL_ModalLoop.Tpo $(DEPDIR)/SDL_ModalLoop.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/SDL_ModalLoop.cpp' object='SDL_ModalLoop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SDL_ModalLoop.o `test -f 'sdl/SDL_ModalLoop.cpp' || echo '$(srcdir)/'`sdl/SDL_ModalLoop.cpp SDL_ModalLoop.obj: sdl/SDL_ModalLoop.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SDL_ModalLoop.obj -MD -MP -MF $(DEPDIR)/SDL_ModalLoop.Tpo -c -o SDL_ModalLoop.obj `if test -f 'sdl/SDL_ModalLoop.cpp'; then $(CYGPATH_W) 'sdl/SDL_ModalLoop.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/SDL_ModalLoop.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SDL_ModalLoop.Tpo $(DEPDIR)/SDL_ModalLoop.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/SDL_ModalLoop.cpp' object='SDL_ModalLoop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SDL_ModalLoop.obj `if test -f 'sdl/SDL_ModalLoop.cpp'; then $(CYGPATH_W) 'sdl/SDL_ModalLoop.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/SDL_ModalLoop.cpp'; fi` 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 $(LIBRARIES) $(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-generic clean-noinstLIBRARIES 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 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-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic 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 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: milkytracker-0.90.85+dfsg/src/ppui/osinterface/PPQuitSaveAlert.h0000644000175000017500000000215011150223367023631 0ustar admin2admin2/* * ppui/osinterface/PPQuitSaveAlert.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPQuitSaveAlert.h * MilkyTracker * * Created by Peter Barth on 28.03.05. * */ #ifndef PPQUITSAVEALERT__H #define PPQUITSAVEALERT__H #include "PPModalDialog.h" class PPQuitSaveAlert : public PPModalDialog { public: PPQuitSaveAlert(PPScreen* screen) : PPModalDialog(screen) { } virtual ReturnCodes runModal(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/posix/0000755000175000017500000000000011317506142021633 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/osinterface/posix/PPSystem_POSIX.h0000644000175000017500000000223011150223367024507 0ustar admin2admin2/* * ppui/osinterface/posix/PPSystem_POSIX.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSystem_POSIX.h * MilkyTracker * * Created by Peter Barth on Thu Mar 10 2005. * */ #ifndef SYSTEM_POSIX_H #define SYSTEM_POSIX_H #include "../../../milkyplay/MilkyPlayCommon.h" class System { private: static SYSCHAR buffer[]; public: static const SYSCHAR* getTempFileName(); static const SYSCHAR* getConfigFileName(); static void msleep(int msecs); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/posix/PPMutex.cpp0000644000175000017500000000262611150223367023707 0ustar admin2admin2/* * ppui/osinterface/posix/PPMutex.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMutex.cpp * PPUI SDL * * Created by Peter Barth on 18.11.05. * */ #include "PPMutex.h" #include PPMutex::PPMutex() : mutexpth_p(NULL) { mutexpth_p = new pthread_mutex_t; if (pthread_mutex_init(mutexpth_p, NULL)) { delete mutexpth_p; mutexpth_p = NULL; } } PPMutex::~PPMutex() { delete mutexpth_p; } void PPMutex::lock() { if (mutexpth_p) { pthread_mutex_lock(mutexpth_p); } } bool PPMutex::tryLock() { if (mutexpth_p) { if (pthread_mutex_trylock(mutexpth_p) == EBUSY) return false; } return true; } void PPMutex::unlock() { if (mutexpth_p) { pthread_mutex_unlock(mutexpth_p); } } milkytracker-0.90.85+dfsg/src/ppui/osinterface/posix/PPMutex.h0000644000175000017500000000206311150223367023347 0ustar admin2admin2/* * ppui/osinterface/posix/PPMutex.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMutex.h * PPUI SDL * * Created by Peter Barth on 18.11.05. * */ #ifndef PPMUTEX__H #define PPMUTEX__H #include class PPMutex { private: pthread_mutex_t* mutexpth_p; public: PPMutex(); ~PPMutex(); void lock(); bool tryLock(); void unlock(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/posix/PPSystem_POSIX.cpp0000644000175000017500000000466411150223367025057 0ustar admin2admin2/* * ppui/osinterface/posix/PPSystem_POSIX.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSystem_POSIX.cpp * MilkyTracker * * Created by Peter Barth on Thu Mar 10 2005. * */ #include "PPSystem_POSIX.h" #include #include #include #include #include #ifdef __PSP__ #include #include #endif #ifdef __AMIGA__ #include #endif SYSCHAR System::buffer[PATH_MAX+1]; const SYSCHAR* System::getTempFileName() { // Although tmpnam(3) generates names that are difficult to guess, it is // nevertheless possible that between the time that tmpnam(3) returns a pathname, // and the time that the program opens it, another program might create that // pathname using open(2), or create it as a symbolic link. This can lead to security holes. // To avoid such possibilities, use the open(2) O_EXCL flag to open the pathname. // Or better yet, use mkstemp(3) or tmpfile(3). tmpnam(buffer); // should not be the case, if it is the case, // create something that "might" work out if (buffer == NULL) { char *home = getenv("HOME"); if(home) { strcpy(buffer, home); strcat(buffer, "/.milkytracker_temp"); } else strcpy(buffer, "milkytracker_temp"); } return buffer; } const SYSCHAR* System::getConfigFileName() { char *home = getenv("HOME"); if(home) { strcpy(buffer, home); strcat(buffer, "/.milkytracker_config"); } else strcpy(buffer, "milkytracker_config"); return buffer; } void System::msleep(int msecs) { if (msecs < 0) return; #ifdef __PSP__ sceKernelDelayThreadCB(msecs*1000); #elif defined(__AROS__) // usleep is not implemented on AROS sleep(msecs < 1000 ? 1 : msecs/1000); #else usleep(msecs*1000); #endif } milkytracker-0.90.85+dfsg/src/ppui/osinterface/posix/PPSystemString_POSIX.h0000644000175000017500000001572011150223367025706 0ustar admin2admin2/* * ppui/osinterface/posix/PPSystemString_POSIX.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSystemString.h * MilkyTracker * * Created by Peter Barth on Sun Apr 03 2005. * */ #ifndef PPSYSTEMSTRING__H #define PPSYSTEMSTRING__H #include "BasicTypes.h" class PPSystemString { private: char* strBuffer; pp_uint32 allocatedSize; void reAlloc(pp_uint32 newSize) { if (newSize <= allocatedSize) return; char* newStrBuffer = new char[newSize]; memcpy(newStrBuffer, strBuffer, allocatedSize); delete[] strBuffer; strBuffer = newStrBuffer; allocatedSize = newSize; } public: // Empty string PPSystemString() : strBuffer(new char[1]), allocatedSize(1) { *strBuffer = 0; } // String from single character PPSystemString(char c) : strBuffer(new char[2]), allocatedSize(2) { *strBuffer = c; *(strBuffer+1) = 0; } PPSystemString(const char* str) : strBuffer(new char[strlen(str) + 1]), allocatedSize(strlen(str) + 1) { strcpy(strBuffer, str); } PPSystemString(const char* str, pp_uint32 length) : strBuffer(new char[length + 1]), allocatedSize(length + 1) { memcpy(strBuffer, str, length); strBuffer[length] = 0; } // copy c'tor PPSystemString(const PPSystemString& str) : strBuffer(new char[str.allocatedSize]), allocatedSize(str.allocatedSize) { memcpy(strBuffer, str.strBuffer, str.allocatedSize); } operator const char*() const { return strBuffer; } const char* getStrBuffer() const { return strBuffer; } // Delete this pointer after usage char* toASCIIZ() const { char* newStr = new char[length() + 1]; strcpy(newStr, strBuffer); return newStr; } // assignment operator PPSystemString& operator=(const PPSystemString& str) { if (this != &str) { delete[] strBuffer; strBuffer = new char[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize); allocatedSize = str.allocatedSize; } return *this; } // comparison is necessary too bool operator==(const PPSystemString& str) const { return strcmp(strBuffer, str.strBuffer) == 0; } bool operator!=(const PPSystemString& str) const { return strcmp(strBuffer, str.strBuffer) != 0; } pp_int32 compareTo(const PPSystemString& str) const { return strcmp(strBuffer, str.strBuffer); } pp_int32 compareToNoCase(const PPSystemString& str) const { return strcasecmp(strBuffer, str.strBuffer); } void toUpper() { for (pp_uint32 i = 0; i < length(); i++) if (strBuffer[i] >= 'a' && strBuffer[i] <= 'z') strBuffer[i] -= 'a'-'A'; } ~PPSystemString() { delete[] strBuffer; } pp_uint32 length() const { return strlen(strBuffer); } void insertAt(pp_uint32 i, const PPSystemString& s) { // doesn't work if (i > length()) return; char* newStr = new char[length() + s.length() + 1]; allocatedSize = length() + s.length() + 1; memcpy(newStr, strBuffer, i); memcpy(newStr + i, s.strBuffer, s.length()); memcpy(newStr + i + s.length(), strBuffer + i, length() - i); newStr[length() + s.length()] = 0; delete[] strBuffer; strBuffer = newStr; } void append(const PPSystemString& s) { insertAt(length(), s); } void deleteAt(pp_uint32 i, pp_uint32 numChars) { // not possible if (i > length()) return; // nothing to delete if ((signed)length() - (signed)numChars < 0) return; // nothing to delete if (strBuffer[i] == 0) return; char* newStr = new char[length() - numChars + 1]; allocatedSize = length() - numChars + 1; memcpy(newStr, strBuffer, i); memcpy(newStr + i, strBuffer + i + numChars, length() - i - numChars); newStr[length() - numChars] = 0; delete[] strBuffer; strBuffer = newStr; } void replace(const PPSystemString& str) { delete[] strBuffer; strBuffer = new char[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize); allocatedSize = str.allocatedSize; } PPSystemString stripPath() const { char* ptr = strBuffer+strlen(strBuffer); while (ptr > strBuffer && *ptr != '/') ptr--; if (ptr != strBuffer) ptr++; PPSystemString str = ptr; return str; } PPSystemString stripExtension() const { char* ptr = strBuffer+strlen(strBuffer); while (ptr > strBuffer && *ptr != '.' && *ptr != '/') ptr--; if (*ptr == '/') return strBuffer; if (ptr != strBuffer) { PPSystemString str; delete[] str.strBuffer; str.allocatedSize = (ptr-strBuffer)+1; str.strBuffer = new char[str.allocatedSize]; memcpy(str.strBuffer, strBuffer, (ptr-strBuffer)); str.strBuffer[(ptr-strBuffer)] = '\0'; return str; } else { return ptr; } } PPSystemString getExtension() const { char* ptr = strBuffer+strlen(strBuffer); while (ptr > strBuffer && *ptr != '.' && *ptr != '/') ptr--; if (*ptr != '.') return ""; return ptr; } pp_int32 compareExtensions(const PPSystemString& str) const { char* ptrSrc = strBuffer+strlen(strBuffer); while (ptrSrc > strBuffer && *ptrSrc != '.' && *ptrSrc != '/') ptrSrc--; bool noExt1 = false; if (*ptrSrc != '.') noExt1 = true; ptrSrc++; if (*ptrSrc == '\0') noExt1 = true; char* ptrDst = str.strBuffer+strlen(str.strBuffer); while (ptrDst > str.strBuffer && *ptrDst != '.' && *ptrDst != '/') ptrDst--; if (*ptrDst != '.') return noExt1 ? 0 : 1; ptrDst++; if (*ptrDst == '\0') return noExt1 ? 0 : 1; return strcasecmp(ptrSrc, ptrDst); } bool compareToExtension(const PPSystemString& extension) const { char* ptrSrc = strBuffer+strlen(strBuffer); while (ptrSrc > strBuffer && *ptrSrc != '.' && *ptrSrc != '/') ptrSrc--; if (*ptrSrc != '.') return false; ptrSrc++; if (*ptrSrc == '\0') return false; return strcasecmp(ptrSrc, extension.strBuffer) == 0; } void ensureTrailingCharacter(char chr) { pp_uint32 len = length(); if (len) { char* ptr = strBuffer+(len-1); if (*ptr != chr) append(chr); } } bool startsWith(const PPSystemString& src) const { pp_uint32 srcLen = src.length(); pp_uint32 thisLen = length(); if (srcLen > thisLen) return false; if (srcLen == 0) return true; if (srcLen == thisLen) return compareTo(src) == 0; for (pp_uint32 i = 0; i < srcLen; i++) if (src.strBuffer[i] != strBuffer[i]) return false; return true; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/posix/PPPath_POSIX.cpp0000644000175000017500000001016711150223367024462 0ustar admin2admin2/* * ppui/osinterface/posix/PPPath_POSIX.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPPath_POSIX.cpp * MilkyTracker * * Created by Peter Barth on 10.03.06. * */ #include "PPPath_POSIX.h" #include #include #ifdef __PSP__ // Needed for PATH_MAX #include #endif #ifdef __AMIGA__ #define PATH_MAX 1024 #endif #define PPMAX_DIR_PATH PATH_MAX void PPPathEntry_POSIX::create(const PPSystemString& path, const PPSystemString& name) { this->name = name; PPSystemString fullPath = path; fullPath.append(name); struct stat file_status; if (::stat(fullPath, &file_status) == 0) { size = file_status.st_size; if (S_ISDIR(file_status.st_mode)) type = Directory; //if (S_ISLNK(file_status.st_mode)) // printf("foo.txt is a symbolic link\n"); if (S_ISCHR(file_status.st_mode)) type = Hidden; if (S_ISBLK(file_status.st_mode)) type = Hidden; if (S_ISFIFO(file_status.st_mode)) type = Hidden; if (S_ISSOCK(file_status.st_mode)) type = Hidden; if (S_ISREG(file_status.st_mode)) type = File; } else { /* stat() call failed and returned '-1'. */ type = Nonexistent; } } bool PPPathEntry_POSIX::isHidden() const { return PPPathEntry::isHidden() || (name.startsWith(".") && name.compareTo("..") != 0); } bool PPPath_POSIX::updatePath() { return chdir(current) == 0; } PPPath_POSIX::PPPath_POSIX() { current = getCurrent(); updatePath(); } PPPath_POSIX::PPPath_POSIX(const PPSystemString& path) : current(path) { updatePath(); } const PPSystemString PPPath_POSIX::getCurrent() { char cwd[PPMAX_DIR_PATH+1]; memset(cwd, 0, sizeof(cwd)); getcwd(cwd, PPMAX_DIR_PATH+1); PPSystemString path(cwd); path.ensureTrailingCharacter(getPathSeparatorAsASCII()); return path; } bool PPPath_POSIX::change(const PPSystemString& path) { PPSystemString old = current; current = path; current.ensureTrailingCharacter(getPathSeparatorAsASCII()); bool res = updatePath(); if (res) return true; current = old; return false; } bool PPPath_POSIX::stepInto(const PPSystemString& directory) { PPSystemString old = current; current.append(directory); current.append(getPathSeparator()); bool res = updatePath(); if (res) return true; current = old; return false; } const PPPathEntry* PPPath_POSIX::getFirstEntry() { dir = ::opendir(current); if (!dir) { return NULL; } return getNextEntry(); } const PPPathEntry* PPPath_POSIX::getNextEntry() { struct dirent* entry; if ((entry = ::readdir(dir)) != NULL) { PPSystemString file(entry->d_name); this->entry.create(current, file); return &this->entry; } ::closedir(dir); return NULL; } bool PPPath_POSIX::canGotoHome() const { return getenv("HOME") ? true : false; } void PPPath_POSIX::gotoHome() { char* home = getenv("HOME"); if (home) { change(home); updatePath(); } } bool PPPath_POSIX::canGotoRoot() const { return true; } void PPPath_POSIX::gotoRoot() { change("/"); updatePath(); } bool PPPath_POSIX::canGotoParent() const { return true; } void PPPath_POSIX::gotoParent() { stepInto(".."); } char PPPath_POSIX::getPathSeparatorAsASCII() const { return '/'; } const PPSystemString PPPath_POSIX::getPathSeparator() const { return PPSystemString(getPathSeparatorAsASCII()); } bool PPPath_POSIX::fileExists(const PPSystemString& fileName) const { struct stat file_status; if (::stat(fileName, &file_status) == 0) { return (S_ISREG(file_status.st_mode)) != 0; } return false; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/posix/PPPath_POSIX.h0000644000175000017500000000401011150223367024115 0ustar admin2admin2/* * ppui/osinterface/posix/PPPath_POSIX.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPPath_POSIX.h * MilkyTracker * * Created by Peter Barth on 10.03.06. * */ #ifndef __PPPATH_POSIX_H__ #define __PPPATH_POSIX_H__ #include "PPPath.h" #include #include class PPPathEntry_POSIX : public PPPathEntry { public: PPPathEntry_POSIX() { } virtual void create(const PPSystemString& path, const PPSystemString& name); virtual bool isHidden() const; }; class PPPath_POSIX : public PPPath { protected: // POSIX DIR* dir; PPSystemString current; PPPathEntry_POSIX entry; virtual bool updatePath(); public: PPPath_POSIX(); PPPath_POSIX(const PPSystemString& path); virtual ~PPPath_POSIX() {} virtual const PPSystemString getCurrent(); virtual bool change(const PPSystemString& path); virtual bool stepInto(const PPSystemString& directory); virtual const PPPathEntry* getFirstEntry(); virtual const PPPathEntry* getNextEntry(); virtual bool canGotoHome() const; virtual void gotoHome(); virtual bool canGotoRoot() const; virtual void gotoRoot(); virtual bool canGotoParent() const; virtual void gotoParent(); virtual char getPathSeparatorAsASCII() const; virtual const PPSystemString getPathSeparator() const; virtual bool fileExists(const PPSystemString& fileName) const; }; #endif milkytracker-0.90.85+dfsg/src/ppui/osinterface/wince/0000755000175000017500000000000011317506144021600 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/osinterface/wince/PPOpenPanel_WINCE.cpp0000644000175000017500000000577711150223367025370 0ustar admin2admin2/* * ppui/osinterface/wince/PPOpenPanel_WINCE.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #ifdef _WIN32_WCE #include #include "gx.h" #endif #include #include "OSInterface\PPOpenPanel.h" extern HWND hWnd; // from FirstGX.cpp void SuspendFullScreen(); void ResumeFullScreen(); PPOpenPanel::PPOpenPanel(PPScreen* screen, const char* caption) : PPModalDialog(screen) { } PPOpenPanel::~PPOpenPanel() { } void PPOpenPanel::addExtension(const PPString& ext, const PPString& desc) { Descriptor* d = new Descriptor(ext, desc); items.add(d); } PPOpenPanel::ReturnCodes PPOpenPanel::runModal() { SuspendFullScreen(); TCHAR szFile[MAX_PATH+1]; OPENFILENAME ofn; memset(szFile, 0, sizeof(szFile)); memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; if (items.size() == 1) ofn.nFilterIndex = 0; else if (items.size() > 1) ofn.nFilterIndex = items.size()+1; PPString sourceFilter; pp_int32 i = 0; // single types for (i = 0; i < items.size(); i++) { sourceFilter.append(items.get(i)->description); sourceFilter.append(" (."); sourceFilter.append(items.get(i)->extension); sourceFilter.append(")|"); sourceFilter.append("*."); sourceFilter.append(items.get(i)->extension); sourceFilter.append("|"); } // all supported types if (items.size() > 1) { sourceFilter.append("All supported types|"); for (i = 0; i < items.size(); i++) { sourceFilter.append("*."); sourceFilter.append(items.get(i)->extension); if (i < items.size()-1) sourceFilter.append(";"); } sourceFilter.append("|"); } // all files sourceFilter.append("All files (*.*)|"); sourceFilter.append("*.*"); sourceFilter.append("|"); const char* src = sourceFilter; TCHAR* dstFilter = new TCHAR[sourceFilter.length()+2]; memset(dstFilter, 0, (sourceFilter.length()+2)*sizeof(TCHAR)); for (i = 0; i < (signed)sourceFilter.length(); i++) { if (src[i] == '|') dstFilter[i] = '\0'; else dstFilter[i] = src[i]; } ofn.lpstrFilter = dstFilter; ofn.lpstrTitle = _T("Open File"); ofn.Flags = OFN_EXPLORER; ReturnCodes err = ReturnCodeCANCEL; if (GetOpenFileName(&ofn)) { fileName = szFile; err = ReturnCodeOK; } delete[] dstFilter; ResumeFullScreen(); return err; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/wince/PPSavePanel_WINCE.cpp0000644000175000017500000000470411150223367025352 0ustar admin2admin2/* * ppui/osinterface/wince/PPSavePanel_WINCE.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSavePanel.cpp * MilkyTracker * * Created by Peter Barth on Sat Mar 05 2005. * */ #include #ifdef _WIN32_WCE #include #include "gx.h" #endif #include #include "OSInterface\PPSavePanel.h" extern HWND hWnd; // from FirstGX.cpp void SuspendFullScreen(); void ResumeFullScreen(); PPSavePanel::ReturnCodes PPSavePanel::runModal() { SuspendFullScreen(); TCHAR szFile[MAX_PATH+1]; OPENFILENAME ofn; memset(szFile, 0, sizeof(szFile)); _tcscpy(szFile, defaultFileName); memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; PPString sourceFilter; pp_int32 i = 0; for (i = 0; i < items.size(); i++) { sourceFilter.append(items.get(i)->description); sourceFilter.append(" (."); sourceFilter.append(items.get(i)->extension); sourceFilter.append(")|"); sourceFilter.append("*."); sourceFilter.append(items.get(i)->extension); sourceFilter.append("|"); } const char* src = sourceFilter; TCHAR* dstFilter = new TCHAR[sourceFilter.length()+2]; memset(dstFilter, 0, (sourceFilter.length()+2)*sizeof(TCHAR)); for (i = 0; i < (signed)sourceFilter.length(); i++) { if (src[i] == '|') dstFilter[i] = '\0'; else dstFilter[i] = src[i]; } ofn.lpstrFilter = dstFilter; ofn.lpstrTitle = _T("Save File"); ofn.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT; PPSystemString defaultExtension(items.get(0)->extension); ofn.lpstrDefExt = defaultExtension; ReturnCodes err = ReturnCodeCANCEL; if (GetSaveFileName(&ofn)) { fileName = szFile; err = ReturnCodeOK; } delete[] dstFilter; ResumeFullScreen(); return err; } milkytracker-0.90.85+dfsg/src/ppui/osinterface/wince/PPQuitSaveAlert_WINCE.cpp0000644000175000017500000000302611150223367026221 0ustar admin2admin2/* * ppui/osinterface/wince/PPQuitSaveAlert_WINCE.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPQuitSaveAlert.cpp * MilkyTracker * * Created by Peter Barth on 28.03.05. * */ #include #include #include "gx.h" #include "PPQuitSaveAlert.h" extern HWND hWnd; // from FirstGX.cpp void SuspendFullScreen(); void ResumeFullScreen(); PPQuitSaveAlert::ReturnCodes PPQuitSaveAlert::runModal() { SuspendFullScreen(); ReturnCodes res = ReturnCodeCANCEL; int nID = MessageBox(hWnd, _T("Do you want to save the changes you made to your documents?"), _T("Save changes"), MB_YESNOCANCEL | MB_ICONQUESTION); if (nID == IDYES) { res = ReturnCodeOK; } else if (nID == IDNO) { res = ReturnCodeNO; } else if (nID == IDCANCEL) { res = ReturnCodeCANCEL; } ResumeFullScreen(); return res; } milkytracker-0.90.85+dfsg/src/ppui/Graphics_ARGB32.cpp0000644000175000017500000002132211150223367021373 0ustar admin2admin2/* * ppui/Graphics_ARGB32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Graphics.h" #include "Font.h" #include "fastfill.h" #define BPP 4 PPGraphics_ARGB32::PPGraphics_ARGB32(pp_int32 w, pp_int32 h, pp_int32 p, void* buff) : PPGraphicsFrameBuffer(w, h, p, buff) { } void PPGraphics_ARGB32::setPixel(pp_int32 x, pp_int32 y) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; buff[1] = (pp_uint8)currentColor.r; buff[2] = (pp_uint8)currentColor.g; buff[3] = (pp_uint8)currentColor.b; } } void PPGraphics_ARGB32::setPixel(pp_int32 x, pp_int32 y, const PPColor& color) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; buff[1] = color.r; buff[2] = color.g; buff[3] = color.b; } } void PPGraphics_ARGB32::fill(PPRect rect) { if (rect.y1 < currentClipRect.y1) rect.y1 = currentClipRect.y1; if (rect.x1 < currentClipRect.x1) rect.x1 = currentClipRect.x1; if (rect.y2 > currentClipRect.y2) rect.y2 = currentClipRect.y2; if (rect.x2 > currentClipRect.x2) rect.x2 = currentClipRect.x2; pp_int32 len = (rect.x2-rect.x1); if (len <= 0) return; pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; #ifdef __ppc__ pp_uint32 rgb1 = (((pp_uint32)r) << 16) + (((pp_uint32)g) << 8) + (((pp_uint32)b)); #else pp_uint32 rgb1 = (((pp_uint32)b) << 24) + (((pp_uint32)g) << 16) + (((pp_uint32)r) << 8); #endif pp_int32 inc = (pitch-len*BPP) / BPP; pp_uint8* buff = (pp_uint8*)buffer+(pitch*rect.y1+rect.x1*BPP); pp_uint32* ptr = reinterpret_cast(buff); for (pp_int32 y = rect.y1; y < rect.y2; y++) { fill_dword(ptr, rgb1, len); ptr+=len; ptr+=inc; } } void PPGraphics_ARGB32::fill() { fill(currentClipRect); } void PPGraphics_ARGB32::drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) { pp_int32 lx = x1; pp_int32 rx = x2; if (x1 > x2) { pp_int32 h = x2; x2 = x1; x1 = h; } if (lx < currentClipRect.x1) lx = currentClipRect.x1; if (rx > currentClipRect.x2) rx = currentClipRect.x2; if (y < currentClipRect.y1) return; if (y >= currentClipRect.y2) return; if (lx > currentClipRect.x2) return; if (rx < currentClipRect.x1) return; pp_int32 len = (rx-lx); if (len <= 0) return; pp_uint8* buff = (pp_uint8*)buffer+pitch*y+lx*4; #ifdef __ppc__ pp_uint32 rgb1 = (((pp_uint32)currentColor.r) << 16) + (((pp_uint32)currentColor.g) << 8) + (((pp_uint32)currentColor.b)); #else pp_uint32 rgb1 = (((pp_uint32)currentColor.b) << 24) + (((pp_uint32)currentColor.g) << 16) + (((pp_uint32)currentColor.r) << 8); #endif fill_dword(reinterpret_cast(buff), rgb1, len); } void PPGraphics_ARGB32::drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) { pp_int32 ly = y1; pp_int32 ry = y2; if (y1 > y2) { pp_int32 h = y2; y2 = y1; y1 = h; } if (ly < currentClipRect.y1) ly = currentClipRect.y1; if (ry > currentClipRect.y2) ry = currentClipRect.y2; if (x < currentClipRect.x1) return; if (x >= currentClipRect.x2) return; pp_int32 len = (ry-ly); if (len <= 0) return; pp_uint8* buff = (pp_uint8*)buffer+pitch*(ly)+x*4; #ifdef __ppc__ pp_uint32 rgb1 = (((pp_uint32)currentColor.r) << 16) + (((pp_uint32)currentColor.g) << 8) + (((pp_uint32)currentColor.b)); #else pp_uint32 rgb1 = (((pp_uint32)currentColor.b) << 24) + (((pp_uint32)currentColor.g) << 16) + (((pp_uint32)currentColor.r) << 8); #endif fill_dword_vertical(reinterpret_cast(buff), rgb1, len, pitch); } void PPGraphics_ARGB32::drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSLINETEMPLATE } void PPGraphics_ARGB32::drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSAALINETEMPLATE } void PPGraphics_ARGB32::blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { pp_int32 w = size.width; pp_int32 h = size.height; pp_uint8* dst = (pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP); const pp_uint32 bytesPerPixel = bpp; if (intensity != 256) { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { dst[1] = (src[0]*intensity)>>8; dst[2] = (src[1]*intensity)>>8; dst[3] = (src[2]*intensity)>>8; dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } else { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { dst[1] = src[0]; dst[2] = src[1]; dst[3] = src[2]; dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } } void PPGraphics_ARGB32::drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; const pp_int32 charWidth = (signed)currentFont->getCharWidth(); const pp_int32 charHeight = (signed)currentFont->getCharHeight(); if (x + (signed)charWidth < currentClipRect.x1 || x > currentClipRect.x2 || y + (signed)charHeight < currentClipRect.y1 || y > currentClipRect.y2) return; const pp_int32 charDim = currentFont->charDim; pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; Bitstream* bitstream = currentFont->bitstream; pp_uint8* fontbuffer = bitstream->buffer; #ifdef __ppc__ pp_uint32 rgb1 = (((pp_uint32)r) << 16) + (((pp_uint32)g) << 8) + (((pp_uint32)b)); #else pp_uint32 rgb1 = (((pp_uint32)b) << 24) + (((pp_uint32)g) << 16) + (((pp_uint32)r) << 8); #endif const pp_uint32 cchrDim = chr*charDim; if (x>= currentClipRect.x1 && x + charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + charHeight < currentClipRect.y2) { pp_uint8* buff = (pp_uint8*)buffer + y*pitch + x*BPP; pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if ((fontbuffer[xChr>>3]>>(xChr&7)&1)) { *reinterpret_cast(buff) = rgb1; } buff+=BPP; xChr++; } buff+=pitch-(charWidth*BPP); yChr+=charWidth; } } else { pp_uint32 yChr = cchrDim; for (pp_int32 i = 0; i < charHeight; i++) { pp_uint32 xChr = yChr; for (pp_int32 j = 0; j < charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && (fontbuffer[xChr>>3]>>(xChr&7)&1)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*BPP); *reinterpret_cast(buff) = rgb1; } xChr++; } yChr+=charWidth; } } if (underlined) drawHLine(x, x+charWidth, y+charHeight); } void PPGraphics_ARGB32::drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; const pp_int32 charWidth = (signed)currentFont->getCharWidth(); const pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 sx = x; while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; case '\n': y+=charHeight; x=sx-charWidth; break; default: drawChar(*str, x, y, underlined); } x += charWidth; str++; } } void PPGraphics_ARGB32::drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; const pp_int32 charWidth = (signed)currentFont->getCharWidth(); const pp_int32 charHeight = (signed)currentFont->getCharHeight(); while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; default: drawChar(*str, x, y, underlined); } y += charHeight; str++; } } milkytracker-0.90.85+dfsg/src/ppui/ScrollBar.h0000644000175000017500000000473411150223367020233 0ustar admin2admin2/* * ppui/ScrollBar.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPScrollbar control class // ///////////////////////////////////////////////////////////////// #ifndef SCROLLBAR__H #define SCROLLBAR__H //#ifndef __LOWRES__ #define SCROLLBUTTONSIZE 10 //#else // #define SCROLLBUTTONSIZE 8 //#endif #include "BasicTypes.h" #include "Control.h" #include "Event.h" // Forwards class PPGraphicsAbstract; class PPButton; class PPScrollbar : public PPControl, public EventListenerInterface { private: PPColor backgroundColor; pp_uint32 oneDimSize; bool horizontal; PPButton* backgroundButton; PPButton* buttonUp; PPButton* buttonDown; PPButton* buttonBar; PPControl* caughtControl; bool controlCaughtByLMouseButton, controlCaughtByRMouseButton; PPPoint caughtMouseLocation, caughtControlLocation; pp_int32 currentBarSize, currentBarPosition; //bool pressed; void initButtons(); public: PPScrollbar(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, pp_int32 size, bool horizontal = false); virtual ~PPScrollbar(); void setBackgroundColor(const PPColor& color) { backgroundColor = color; } // set bar size [none:0 - full:65536] void setBarSize(pp_int32 size, bool repaint = false); // set bar position [0 - 65536] void setBarPosition(pp_int32 pos, bool repaint = false); pp_uint32 getBarSize() const { return currentBarSize; } pp_uint32 getBarPosition() const { return currentBarPosition; } virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void setLocation(const PPPoint& location); virtual void setSize(pp_uint32 size); }; #endif milkytracker-0.90.85+dfsg/src/ppui/Graphics_15BIT.cpp0000644000175000017500000002222711150223367021304 0ustar admin2admin2/* * ppui/Graphics_15BIT.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Graphics.h" #include "Font.h" #include "fastfill.h" #define BPP 2 #define _16TO15BIT(col) \ (((col) & 0x1f) + (((col)>>1)&0x3E0) + (((col)>>1)&0x7C00)) PPGraphics_15BIT::PPGraphics_15BIT(pp_int32 w, pp_int32 h, pp_int32 p, void* buff) : PPGraphicsFrameBuffer(w, h, p, buff) { } void PPGraphics_15BIT::setPixel(pp_int32 x, pp_int32 y) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*y+x; *buff = _16TO15BIT(color16); } } void PPGraphics_15BIT::setPixel(pp_int32 x, pp_int32 y, const PPColor& color) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint16 col16 = (((pp_uint16)((color.r)>>3)<<11)+((pp_uint16)((color.g)>>2)<<5)+(pp_uint16)((color.b)>>3)); pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*y+x; *buff = _16TO15BIT(col16); } } void PPGraphics_15BIT::fill(PPRect rect) { if (rect.y1 < currentClipRect.y1) rect.y1 = currentClipRect.y1; if (rect.x1 < currentClipRect.x1) rect.x1 = currentClipRect.x1; if (rect.y2 > currentClipRect.y2) rect.y2 = currentClipRect.y2; if (rect.x2 > currentClipRect.x2) rect.x2 = currentClipRect.x2; pp_uint32 col32 = (((pp_uint32)_16TO15BIT(color16)) << 16) + _16TO15BIT(color16); const pp_int32 hPitch = pitch>>1; pp_uint16* dest = (pp_uint16*)buffer+hPitch*rect.y1+rect.x1; const pp_int32 width = rect.x2 - rect.x1; const pp_int32 height = rect.y2 - rect.y1; for (pp_int32 y = 0; y < height; y++) { pp_uint16* buff = dest; pp_int32 len = width; if (reinterpret_cast (buff) & 3) { *buff++ = _16TO15BIT(color16); len--; } pp_uint32* buff32 = (pp_uint32*)buff; fill_dword(buff32, col32, len>>1); if (len&1) *((pp_uint16*)(buff32+(len>>1))) = _16TO15BIT(color16); dest+=hPitch; } } void PPGraphics_15BIT::fill() { fill(currentClipRect); } void PPGraphics_15BIT::drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) { pp_int32 lx = x1; pp_int32 rx = x2; if (x1 > x2) { pp_int32 h = x2; x2 = x1; x1 = h; } if (lx < currentClipRect.x1) lx = currentClipRect.x1; if (rx > currentClipRect.x2) rx = currentClipRect.x2; if (y < currentClipRect.y1) return; if (y >= currentClipRect.y2) return; pp_uint32 col32 = (((pp_uint32)_16TO15BIT(color16)) << 16) + _16TO15BIT(color16); pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*y+lx; pp_int32 len = rx-lx; if (len <= 0) return; if (reinterpret_cast (buff) & 3) { *buff++ = _16TO15BIT(color16); len--; } pp_uint32* buff32 = (pp_uint32*)buff; fill_dword(buff32, col32, len>>1); if (len&1) *((pp_uint16*)(buff32+(len>>1))) = _16TO15BIT(color16); } void PPGraphics_15BIT::drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) { pp_int32 ly = y1; pp_int32 ry = y2; if (y1 > y2) { pp_int32 h = y2; y2 = y1; y1 = h; } if (ly < currentClipRect.y1) ly = currentClipRect.y1; if (ry > currentClipRect.y2) ry = currentClipRect.y2; if (x < currentClipRect.x1) return; if (x >= currentClipRect.x2) return; pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*ly+x; for (pp_int32 y = ly; y < ry; y++) { *buff = _16TO15BIT(color16); buff+=pitch>>1; } } void PPGraphics_15BIT::drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSLINETEMPLATE } void PPGraphics_15BIT::drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSAALINETEMPLATE } void PPGraphics_15BIT::blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { pp_int32 w = size.width; pp_int32 h = size.height; const pp_uint32 bytesPerPixel = bpp; if (intensity == 256) { pp_uint16* dst = (pp_uint16*)((pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP)); for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { *dst = (((pp_uint16)((src[0])>>3)<<10)+((pp_uint16)((src[1])>>3)<<5)+(pp_uint16)((src[2])>>3)); dst++; src+=bytesPerPixel; } dst+=this->pitch/BPP - w; src+=pitch - w*bytesPerPixel; } } else { pp_uint16* dst = (pp_uint16*)((pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP)); for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { *dst = (((pp_uint16)((src[0]*intensity/256)>>3)<<10)+((pp_uint16)((src[1]*intensity/256)>>3)<<5)+(pp_uint16)((src[2]*intensity/256)>>3)); dst++; src+=bytesPerPixel; } dst+=this->pitch/BPP - w; src+=pitch - w*bytesPerPixel; } } } void PPGraphics_15BIT::drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 charDim = currentFont->charDim; if (x + (signed)charWidth < currentClipRect.x1 || x > currentClipRect.x2 || y + (signed)charHeight < currentClipRect.y1 || y > currentClipRect.y2) return; /*pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; if (x>= currentClipRect.x1 && x + (signed)currentFont->charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + (signed)currentFont->charHeight < currentClipRect.y2) { for (pp_uint32 i = 0; i < currentFont->charHeight; i++) { pp_uint8* buff = (pp_uint8*)buffer + (y+i)*pitch + x*3; for (pp_uint32 j = 0; j < currentFont->charWidth; j++) { if (currentFont->getPixelBit(chr, j,i)) { buff[0] = b; buff[1] = g; buff[2] = r; } buff+=3; } } } else { for (pp_uint32 i = 0; i < currentFont->charHeight; i++) for (pp_uint32 j = 0; j < currentFont->charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && currentFont->getPixelBit(chr, j,i)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*3); buff[0] = b; buff[1] = g; buff[2] = r; } } }*/ Bitstream* bitstream = currentFont->bitstream; pp_uint8* fontbuffer = bitstream->buffer; pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*y+x; const pp_uint32 cchrDim = chr*charDim; const pp_uint32 incr = (pitch>>1)-(charWidth); if (x>= currentClipRect.x1 && x + charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + charHeight < currentClipRect.y2) { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if ((fontbuffer[xChr>>3]>>(xChr&7)&1)) { *buff = _16TO15BIT(color16); } buff++; xChr++; } buff+=incr; yChr+=charWidth; } } else { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && (fontbuffer[xChr>>3]>>(xChr&7)&1)) { pp_uint16* buff = (pp_uint16*)buffer+(pitch>>1)*(y+i)+(x+j); *buff = _16TO15BIT(color16); } xChr++; } yChr+=charWidth; } } if (underlined) drawHLine(x, x+charWidth, y+charHeight); } void PPGraphics_15BIT::drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 sx = x; while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; case '\n': y+=charHeight; x=sx-charWidth; break; default: drawChar(*str, x, y, underlined); } x += charWidth; str++; } } void PPGraphics_15BIT::drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; default: drawChar(*str, x, y, underlined); } y += charHeight; str++; } } milkytracker-0.90.85+dfsg/src/ppui/Graphics_OGL.cpp0000755000175000017500000002367111150223367021150 0ustar admin2admin2/* * ppui/Graphics_OGL.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Graphics.h" #include "Font.h" #ifdef __OPENGL__ #ifdef __APPLE__ #include #else #include #endif static void setupOrtho(pp_uint32 width, pp_uint32 height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, height, 0, -1.0, 1.0); glTranslatef(0.5f, 0.5f, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } PPGraphics_OGL::PPGraphics_OGL(pp_int32 w, pp_int32 h) : PPGraphicsAbstract(w, h), fontCacheEntry(NULL) { setupOrtho(w, h); //glDrawBuffer(GL_FRONT_AND_BACK); glEnable(GL_SCISSOR_TEST); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glDisable(GL_POINT_SMOOTH); glDisable(GL_LINE_SMOOTH); glLineWidth(1.0f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); } void PPGraphics_OGL::setPixel(pp_int32 x, pp_int32 y) { glBegin(GL_POINTS); glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(x, y); glEnd(); } void PPGraphics_OGL::setPixel(pp_int32 x, pp_int32 y, const PPColor& color) { glBegin(GL_POINTS); glColor3ub(color.r, color.g, color.b); glVertex2i(x, y); glEnd(); } void PPGraphics_OGL::fill(PPRect rect) { glBegin(GL_QUADS); glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(rect.x1, rect.y1); //glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(rect.x2, rect.y1); //glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(rect.x2, rect.y2); //glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(rect.x1, rect.y2); glEnd(); } void PPGraphics_OGL::fill() { fill(currentClipRect); } void PPGraphics_OGL::drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) { glBegin(GL_LINES); glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(x1, y); glVertex2i(x2, y); glEnd(); } void PPGraphics_OGL::drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) { glBegin(GL_LINES); glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(x, y1); glVertex2i(x, y2); glEnd(); } void PPGraphics_OGL::drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { glBegin(GL_LINES); glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(x1, y1); glVertex2i(x2, y2); glEnd(); } void PPGraphics_OGL::drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { glEnable(GL_LINE_SMOOTH); glBegin(GL_LINES); glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(x1, y1); glVertex2i(x2, y2); glEnd(); glDisable(GL_LINE_SMOOTH); } void PPGraphics_OGL::blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { } void PPGraphics_OGL::drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined) { if (!fontCacheEntry || !currentFont) return; glRasterPos2d(x, y); pp_uint32 offset = (pp_uint32)chr * fontCacheEntry->newWidth * fontCacheEntry->newHeight; glColor3ub(currentColor.r, currentColor.g, currentColor.b); glBitmap(currentFont->getCharWidth(), currentFont->getCharHeight(), 0, currentFont->getCharHeight()-1, 0, 0, (GLubyte*)fontCacheEntry->oglBitmapData+offset); if (underlined) { glBegin(GL_LINES); glVertex2i(x, y+currentFont->getCharHeight()); glVertex2i(x+currentFont->getCharWidth(), y+currentFont->getCharHeight()); glEnd(); } } void PPGraphics_OGL::drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (!fontCacheEntry || !currentFont) return; glColor3ub(currentColor.r, currentColor.g, currentColor.b); pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); const GLubyte* data = (const GLubyte*)fontCacheEntry->oglBitmapData; glRasterPos2d(x, y); // Testing - No underline or \n support // Note: Even when using display lists, the opengl renderer is desperately slow // (on my Nvidia at least), it's unusable at fullscreen resolutions. Perhaps // using point-sprites would be quicker.. - Chris //glPushAttrib(GL_LIST_BIT); glCallLists(strlen(str), GL_UNSIGNED_BYTE, (GLubyte *) str); //glPopAttrib(); /* pp_int32 sx = x; while (*str) { switch (*str) { case '\xf4': glBegin(GL_POINTS); glVertex2i(x+(charWidth>>1), y+(charHeight>>1)); glEnd(); break; case '\n': y+=charHeight; x=sx-charWidth; glRasterPos2d(x, y); break; default: { pp_uint32 offset = ((pp_uint8)*str) * size; //glRasterPos2d(x, y); glBitmap(charWidth, charHeight, 0, charHeight-1, charWidth, 0, data+offset); if (underlined) { glBegin(GL_LINES); glVertex2i(x, y+charHeight); glVertex2i(x+charWidth, y+charHeight); glEnd(); } } } x += charWidth; str++; }*/ } void PPGraphics_OGL::drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (!fontCacheEntry || !currentFont) return; glColor3ub(currentColor.r, currentColor.g, currentColor.b); pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); const GLubyte* data = (const GLubyte*)fontCacheEntry->oglBitmapData; const pp_uint32 size = fontCacheEntry->newWidth * fontCacheEntry->newHeight; while (*str) { switch (*str) { case '\xf4': glBegin(GL_POINTS); glVertex2i(x+(charWidth>>1), y+(charHeight>>1)); glEnd(); break; default: { pp_uint32 offset = ((pp_uint8)*str) * size; glRasterPos2d(x, y); glBitmap(charWidth, charHeight, 0, charHeight-1, 0, 0, data+offset); if (underlined) { glBegin(GL_LINES); glVertex2i(x, y+charHeight); glVertex2i(x+charWidth, y+charHeight); glEnd(); } } } y += charHeight; str++; } } void PPGraphics_OGL::fillVerticalShaded(PPRect r, const PPColor& colSrc, const PPColor& colDst, bool invertShading) { if (invertShading) { glBegin(GL_QUADS); glColor3ub(colDst.r, colDst.g, colDst.b); glVertex2i(r.x1, r.y1); //glColor3ub(colSrc.r, colSrc.g, colSrc.b); glVertex2i(r.x2, r.y1); glColor3ub(colSrc.r, colSrc.g, colSrc.b); glVertex2i(r.x2, r.y2); //glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(r.x1, r.y2); glEnd(); } else { glBegin(GL_QUADS); glColor3ub(colSrc.r, colSrc.g, colSrc.b); glVertex2i(r.x1, r.y1); //glColor3ub(colSrc.r, colSrc.g, colSrc.b); glVertex2i(r.x2, r.y1); glColor3ub(colDst.r, colDst.g, colDst.b); glVertex2i(r.x2, r.y2); //glColor3ub(currentColor.r, currentColor.g, currentColor.b); glVertex2i(r.x1, r.y2); glEnd(); } } void PPGraphics_OGL::validateRect() { PPGraphicsAbstract::validateRect(); glScissor(currentClipRect.x1, this->height-currentClipRect.y1-(currentClipRect.y2-currentClipRect.y1), currentClipRect.x2-currentClipRect.x1, currentClipRect.y2-currentClipRect.y1); } void PPGraphics_OGL::setFont(PPFont* font) { PPGraphicsAbstract::setFont(font); pp_int32 charWidth = (signed)font->getCharWidth(); pp_int32 charHeight = (signed)font->getCharHeight(); bool found = false; for (pp_int32 i = 0; i < sizeof(fontCache) / sizeof(FontCacheEntry); i++) { if (fontCache[i].font && fontCache[i].oldFontBits == font->fontBits) { found = true; fontCacheEntry = &fontCache[i]; glListBase(fontCacheEntry->listOffset); break; } } if (!found) { glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_LSB_FIRST, true); glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); glPixelStorei(GL_UNPACK_ROW_LENGTH, ((font->getCharWidth()+7) / 8) * 8); pp_int32 slot = 0; for (pp_int32 i = 0; i < sizeof(fontCache) / sizeof(FontCacheEntry); i++) { if (!fontCache[i].font) { slot = i; break; } } fontCache[slot].createFromFont(font); fontCacheEntry = &fontCache[slot]; fontCacheEntry->listOffset = glGenLists(256); glListBase(fontCacheEntry->listOffset); const GLubyte* data = (const GLubyte*)fontCacheEntry->oglBitmapData; const pp_uint32 size = fontCacheEntry->newWidth * fontCacheEntry->newHeight; for(pp_uint32 i = 0; i < 256; i++) { glNewList(fontCacheEntry->listOffset + i, GL_COMPILE); glBitmap(charWidth, charHeight, 0, charHeight-1, charWidth, 0, data+i*size); glEndList(); } } } void PPGraphics_OGL::FontCacheEntry::createFromFont(PPFont* font) { this->font = font; this->oldFontBits = font->fontBits; newWidth = (font->getCharWidth() + 7) / 8; newHeight = font->getCharHeight(); pp_uint32 size = newWidth*newHeight*256; delete[] oglBitmapData; oglBitmapData = new pp_uint8[size]; memset(oglBitmapData, 0, size); Bitstream stream(oglBitmapData, size); pp_uint32 dst = 0; for (pp_uint32 i = 0; i < 256; i++) { for (pp_uint32 y = 0; y < font->getCharHeight(); y++) { if ((dst & 7) != 0) dst = ((dst+7)/8)*8; for (pp_uint32 x = 0; x < font->getCharWidth(); x++) { stream.write(dst, font->getPixelBit(i, x, font->getCharHeight() - 1 - y)); dst++; } } } } PPGraphics_OGL::FontCacheEntry::~FontCacheEntry() { delete[] oglBitmapData; } #endifmilkytracker-0.90.85+dfsg/src/ppui/Slider.h0000644000175000017500000000560711150223367017572 0ustar admin2admin2/* * ppui/Slider.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPSlider control class // ///////////////////////////////////////////////////////////////// #ifndef SLIDER__H #define SLIDER__H #define SLIDERBUTTONSIZE 12 #define SLIDERBUTTONHEIGHT 10 #define SLIDERBUTTONWIDTH 12 #include "BasicTypes.h" #include "Control.h" #include "Event.h" // Forwards class PPGraphicsAbstract; class PPButton; class PPSlider : public PPControl, public EventListenerInterface { private: PPColor backgroundColor; pp_uint32 oneDimSize; bool horizontal; bool buttonSwap; PPButton* backgroundButton; PPButton* buttonUp; PPButton* buttonDown; PPButton* buttonBar; PPControl* caughtControl; bool controlCaughtByLMouseButton, controlCaughtByRMouseButton; PPPoint caughtMouseLocation, caughtControlLocation; pp_int32 currentBarSize, currentBarPosition; pp_uint32 minValue; pp_uint32 maxValue; pp_uint32 currentValue; //bool pressed; void initButtons(); public: PPSlider(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, pp_int32 size, bool horizontal = false, bool buttonSwap = false); virtual ~PPSlider(); virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void setLocation(const PPPoint& location); virtual void setSize(pp_uint32 size); void setMinValue(pp_uint32 min) { minValue = min; } void setMaxValue(pp_uint32 max) { maxValue = max; } void setCurrentValue(pp_uint32 newValue) { currentValue = newValue; float f = (float)(currentValue - minValue)/(maxValue - minValue); setBarPosition((pp_int32)(f*65536.0f)); } pp_uint32 getCurrentValue() { return currentValue; } void setBackgroundColor(const PPColor& color) { backgroundColor = color; } // set bar size [none:0 - full:65536] void setBarSize(pp_int32 size, bool repaint = false); // set bar position [0 - 65536] void setBarPosition(pp_int32 pos, bool repaint = false); pp_uint32 getBarSize() const { return currentBarSize; } pp_uint32 getBarPosition() const { return currentBarPosition; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/carbon/0000755000175000017500000000000011317506144017435 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/carbon/DisplayDevice_CARBON.h0000644000175000017500000000523411150223367023361 0ustar admin2admin2/* * ppui/carbon/DisplayDevice_CARBON.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Our display device // ///////////////////////////////////////////////////////////////// #ifndef DISPLAYDEVICE__H #define DISPLAYDEVICE__H #include "BasicTypes.h" #include "DisplayDeviceBase.h" #include #include #include "PPSystem.h" class PPDisplayDevice : public PPDisplayDeviceBase { private: struct GWorldWrapper { Rect pictSize; GWorldPtr offscreen; PixMap* ppixMap; RgnHandle visibleRgn; GWorldWrapper(pp_uint32 width, pp_uint32 height, pp_uint32 bpp = 32); ~GWorldWrapper(); void UnlockGWorldMemory(unsigned char** Buffer, unsigned int* BytesPerRow); void LockGWorldMemory(); }; WindowPtr mainWindow, waitWindow; GWorldWrapper* mainGWorld; GWorldWrapper* waitGWorld; CFDictionaryRef oldmode; CFDictionaryRef mode; Rect oldRc; public: PPDisplayDevice(WindowPtr mainWindow, WindowPtr waitWindow, pp_int32 width, pp_int32 height, pp_int32 scaleFactor = 1, pp_uint32 bpp = 32); virtual ~PPDisplayDevice(); virtual PPGraphicsAbstract* open(); virtual void close(); virtual void update(); virtual void update(const PPRect& r); // Window handling virtual bool init(); virtual void setTitle(const PPSystemString& title); virtual void setSize(const PPSize& size); virtual bool supportsScaling() const { return true; } virtual bool goFullScreen(bool b); virtual PPSize getDisplayResolution() const; virtual void shutDown(); virtual void signalWaitState(bool b, const PPColor& color); virtual void setMouseCursor(MouseCursorTypes type); private: pp_int32 waitWindowWidth; pp_int32 waitWindowHeight; pthread_t drawThread; bool waitWindowVisible; void updateWaitWindow(); void renderAndUpdateWaitWindow(pp_uint32 width, pp_uint32 height, const PPColor& waitBarColor); static void* UpdateWaitWindowThreadProc(void* theID); }; #endif milkytracker-0.90.85+dfsg/src/ppui/carbon/DisplayDevice_CARBON.cpp0000644000175000017500000003670211150223367023720 0ustar admin2admin2/* * ppui/carbon/DisplayDevice_CARBON.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "DisplayDevice_CARBON.h" #include "Graphics.h" #ifdef __DRAWSPROCKETS__ #include static DSpContextReference sDSpContext = NULL; static CGrafPtr frontBuffer; CGrafPtr SetScreenTo800x600() /* Returns a pointer to the front buffer (a port, on-screen, guaranteed 800x600x32 even if the screen can't be set to 800x600). Returns NULL if it fails. */ { DSpContextAttributes attr = { 0, 800, 600, // Resolution 0, 0, kDSpColorNeeds_Require, NULL, 0, kDSpDepthMask_32, kDSpDepthMask_32, 32, 32, 1, // Don't need back buffers { 0, 0, 0 }, 0, { 0, 0, 0, 0 }}; OSStatus err; GrafPtr savPort; Rect frame; CGrafPtr frontBuffer; DSpStartup(); err = DSpFindBestContext(&attr, &sDSpContext); switch (err) { case kDSpConfirmSwitchWarning: break; case noErr: break; default: return NULL; } /* Reserve the context */ attr.contextOptions = 0; err = DSpContext_Reserve(sDSpContext, &attr); if (err) { return NULL; } /* Fade out (because changing the resolution looks messy) */ DSpContext_FadeGammaOut(kDSpEveryContext, NULL); /* Activate context */ err = DSpContext_SetState(sDSpContext, kDSpContextState_Active); if (err) { DSpContext_FadeGammaIn(kDSpEveryContext, NULL); return NULL; } /* Fade in instantly (the screen will remain black) */ DSpContext_FadeGamma(sDSpContext, 100, NULL); /* Get a pointer to the front buffer */ err = DSpContext_GetFrontBuffer(sDSpContext, &frontBuffer); if (err) { return NULL; } return frontBuffer; } void RestoreScreen() { if (!sDSpContext) { return; } #if FADE_OUT_ON_EXIT /* 0 if your app will have left the screen black */ DSpContext_FadeGammaOut(sDSpContext, NULL); #else DSpContext_FadeGamma(sDSpContext, 0, NULL); #endif /* Deactivate context */ DSpContext_SetState(sDSpContext, kDSpContextState_Inactive); /* Fade in */ DSpContext_FadeGammaIn(kDSpEveryContext, NULL); /* Clean up */ DSpContext_Release(sDSpContext); DSpShutdown(); } #endif PPDisplayDevice::GWorldWrapper::GWorldWrapper(pp_uint32 width, pp_uint32 height, pp_uint32 bpp/* = 32*/) { visibleRgn = NewRgn(); SetRect(&pictSize, 0, 0, width, height); int err = NewGWorld(&offscreen, bpp, &pictSize, NULL, nil, 0); if (err) { printf("Could not create offscreen buffer\n"); exit(1); } } PPDisplayDevice::GWorldWrapper::~GWorldWrapper() { DisposeGWorld(offscreen); } void PPDisplayDevice::GWorldWrapper::UnlockGWorldMemory(unsigned char** Buffer, unsigned int* BytesPerRow) { OSErr err; BitMap* tempBitMap; ppixMap = (PixMap*)GetPortPixMap(offscreen); err = LockPixels((PixMapHandle)ppixMap); if (!err) printf("LockPixels Error"); tempBitMap = (BitMap*)*(GetPortPixMap(offscreen)); *Buffer = (unsigned char*)tempBitMap->baseAddr; *BytesPerRow = (unsigned int)tempBitMap->rowBytes&0x3fff; } void PPDisplayDevice::GWorldWrapper::LockGWorldMemory() { UnlockPixels((PixMapHandle)ppixMap); } PPDisplayDevice::PPDisplayDevice(WindowPtr mainWindow, WindowPtr waitWindow, pp_int32 width, pp_int32 height, pp_int32 scaleFactor/* = 1*/, pp_uint32 bpp/* = 32*/) : PPDisplayDeviceBase(width, height, scaleFactor), mainWindow(mainWindow), waitWindow(waitWindow), oldmode(NULL), mode(NULL), drawThread(NULL), waitWindowVisible(false) { mainGWorld = new GWorldWrapper(width, height, bpp); pp_uint8* buffer; pp_uint32 pitch; mainGWorld->UnlockGWorldMemory(&buffer,(unsigned int*)&pitch); mainGWorld->LockGWorldMemory(); switch (bpp) { case 16: currentGraphics = new PPGraphics_15BIT(getSize().width, getSize().height, pitch, buffer); break; case 32: currentGraphics = new PPGraphics_ARGB32(getSize().width, getSize().height, pitch, buffer); break; } this->size.width = width; this->size.height = height; SizeWindow(mainWindow, width * scaleFactor, height * scaleFactor, false); currentGraphics->lock = true; } PPDisplayDevice::~PPDisplayDevice() { delete mainGWorld; delete waitGWorld; delete currentGraphics; } PPGraphicsAbstract* PPDisplayDevice::open() { if (!isEnabled()) return NULL; pp_uint8* buffer; pp_uint32 pitch; mainGWorld->UnlockGWorldMemory(&buffer, (unsigned int*)&pitch); static_cast(currentGraphics)->setBufferProperties(pitch, buffer); currentGraphics->lock = false; return currentGraphics; } void PPDisplayDevice::close() { currentGraphics->lock = true; mainGWorld->LockGWorldMemory(); } void PPDisplayDevice::update() { if (!isUpdateAllowed() || !isEnabled()) return; GDHandle SaveGD; CGrafPtr SavePort; Rect windowRect; GetGWorld(&SavePort, &SaveGD); //our current world must be the window, otherwise the offscreen buffer is drawn somewhere outside SetGWorld(GetWindowPort(mainWindow), GetGDevice()); GetPortBounds(GetWindowPort(mainWindow), &windowRect); //copy our offscreen world into the window CopyBits((BitMap *) *(GetPortPixMap(mainGWorld->offscreen)), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), &mainGWorld->pictSize, &windowRect, srcCopy, nil); //we flush the window buffer by passing the window and its visible region QDFlushPortBuffer(GetWindowPort(mainWindow), GetPortVisibleRegion(GetWindowPort(mainWindow), mainGWorld->visibleRgn)); SetGWorld(SavePort, SaveGD); } void PPDisplayDevice::update(const PPRect& r) { if (!isUpdateAllowed() || !isEnabled()) return; GDHandle SaveGD; CGrafPtr SavePort; Rect windowRect; GetGWorld(&SavePort, &SaveGD); //our current world must be the window, otherwise the offscreen buffer is drawn somewhere outside SetGWorld(GetWindowPort(mainWindow), GetGDevice()); GetPortBounds(GetWindowPort(mainWindow), &windowRect); float xScale = (float)(windowRect.right - windowRect.left) / (float)getSize().width; float yScale = (float)(windowRect.bottom - windowRect.top) / (float)getSize().height; Rect srcRect; srcRect.top = r.y1; srcRect.left = r.x1; srcRect.bottom = r.y2; srcRect.right = r.x2; Rect dstRect; dstRect.top = (int)(srcRect.top*yScale); dstRect.left = (int)(srcRect.left*xScale); dstRect.bottom = (int)(srcRect.bottom*yScale); dstRect.right = (int)(srcRect.right*xScale); //copy our offscreen world into the window CopyBits((BitMap *) *(GetPortPixMap(mainGWorld->offscreen)), GetPortBitMapForCopyBits(GetWindowPort(mainWindow)), &srcRect, &dstRect, srcCopy, nil); //we flush the window buffer by passing the window and its visible region QDFlushPortBuffer(GetWindowPort(mainWindow), GetPortVisibleRegion(GetWindowPort(mainWindow), mainGWorld->visibleRgn)); SetGWorld(SavePort, SaveGD); } bool PPDisplayDevice::init() { Rect bounds; RepositionWindow (mainWindow, NULL, kWindowCenterOnMainScreen); // The windows were created hidden so show them. ShowWindow(mainWindow); GetWindowBounds (waitWindow, kWindowContentRgn, &bounds); waitWindowWidth = bounds.right - bounds.left; waitWindowHeight = bounds.bottom - bounds.top; // setup wait screen offscreen buffers waitGWorld = new GWorldWrapper(waitWindowWidth, waitWindowHeight); return true; } void PPDisplayDevice::setTitle(const PPSystemString& title) { CFStringRef CFTitleRef = CFStringCreateWithCString(NULL, title, kCFStringEncodingUTF8); SetWindowTitleWithCFString(mainWindow, CFTitleRef); CFRelease(CFTitleRef); } void PPDisplayDevice::setSize(const PPSize& size) { SizeWindow(mainWindow, size.width * scaleFactor, size.height * scaleFactor, false); if (!bFullScreen) RepositionWindow (mainWindow, NULL, kWindowCenterOnMainScreen); this->size = size; } bool PPDisplayDevice::goFullScreen(bool b) { OSStatus err; if (b && !bFullScreen) // switch display res { // switch screen resolution CGDirectDisplayID display=CGMainDisplayID(); boolean_t exact; oldmode = CGDisplayCurrentMode(display); mode = CGDisplayBestModeForParametersAndRefreshRate(display, 32, size.width * scaleFactor, size.height * scaleFactor, 75.0, &exact); if (exact) { HideWindow(mainWindow); err=CGDisplaySwitchToMode(display,mode); HideMenuBar(); Rect r1,r2; GetWindowBounds(mainWindow, kWindowStructureRgn, &oldRc); r1 = oldRc; r2 = r1; SInt32 dh = (r1.bottom - r1.top) - size.height * scaleFactor; r2.left-=r1.left; r2.top-=r1.top+dh; r2.right-=r1.left; r2.bottom-=r1.top+dh; SetWindowBounds(mainWindow, kWindowStructureRgn, &r2); bFullScreen = true; ShowWindow(mainWindow); return true; } return false; } else if (!b && bFullScreen) { HideWindow(mainWindow); // switch screen resolution CGDirectDisplayID display=CGMainDisplayID(); err=CGDisplaySwitchToMode(display,oldmode); ShowMenuBar(); SetWindowBounds(mainWindow, kWindowStructureRgn, &oldRc); ShowWindow(mainWindow); bFullScreen = false; return true; } return false; } PPSize PPDisplayDevice::getDisplayResolution() const { const int MAX_DISPLAYS = 32; CGDirectDisplayID displayArray [MAX_DISPLAYS]; CGDisplayCount numDisplays; CFNumberRef number; CFBooleanRef booleanValue; long height, width, refresh, mode, bpp, bps, spp, rowBytes, gui, ioflags; int i; CGGetActiveDisplayList (MAX_DISPLAYS, displayArray, &numDisplays); for (i = 0; i < numDisplays; i++) { width = CGDisplayPixelsWide (displayArray[i]); height = CGDisplayPixelsHigh (displayArray[i]); // we are only interested in display properties //bpp = CGDisplayBitsPerPixel (displayArray[i]); //bps = CGDisplayBitsPerSample (displayArray[i]); //spp = CGDisplaySamplesPerPixel (displayArray[i]); //rowBytes = CGDisplayBytesPerRow (displayArray[i]); //number = (CFNumberRef)CFDictionaryGetValue (CGDisplayCurrentMode (displayArray[i]), kCGDisplayMode); //CFNumberGetValue (number, kCFNumberLongType, &mode); //number =(CFNumberRef)CFDictionaryGetValue (CGDisplayCurrentMode (displayArray[i]), kCGDisplayRefreshRate); //CFNumberGetValue (number, kCFNumberLongType, &refresh); //booleanValue = (CFBooleanRef)CFDictionaryGetValue (CGDisplayCurrentMode(displayArray[i]), kCGDisplayModeUsableForDesktopGUI); //CFNumberGetValue (number, kCFNumberLongType, &gui); //number = (CFNumberRef)CFDictionaryGetValue (CGDisplayCurrentMode (displayArray[i]), kCGDisplayIOFlags); //CFNumberGetValue (number, kCFNumberLongType, &ioflags); } return PPSize(width, height); } void PPDisplayDevice::shutDown() { HICommandExtended aCommand; EventRef anEvent; // send quit event BlockZero(&aCommand, sizeof(aCommand)); aCommand.attributes = kHICommandFromControl; aCommand.commandID = 'quit'; CreateEvent(NULL, kEventClassCommand, kEventCommandProcess, GetCurrentEventTime(), kEventAttributeUserEvent, &anEvent); SetEventParameter(anEvent, kEventParamDirectObject, typeHICommand, sizeof(aCommand), &aCommand); SendEventToWindow(anEvent, mainWindow); ReleaseEvent(anEvent); } //////////////////////////////////////////////////////////////////////////////// // -------------------------- wait window rendering --------------------------- //////////////////////////////////////////////////////////////////////////////// void DrawPixel32(void* buffer, pp_int32 x, pp_int32 y, pp_int32 pitch, const PPColor& color) { unsigned char* buff = (unsigned char*)buffer; buff[y*pitch+x*4+1]=color.r; buff[y*pitch+x*4+2]=color.g; buff[y*pitch+x*4+3]=color.b; } void PPDisplayDevice::updateWaitWindow() { GDHandle SaveGD; CGrafPtr SavePort; Rect windowRect; GetGWorld(&SavePort, &SaveGD); //our current world must be the window, otherwise the offscreen buffer is drawn somewhere outside SetGWorld(GetWindowPort(waitWindow), GetGDevice()); GetPortBounds(GetWindowPort(waitWindow), &windowRect); //copy our offscreen world into the window CopyBits ((BitMap *) *(GetPortPixMap(waitGWorld->offscreen)), GetPortBitMapForCopyBits(GetWindowPort(waitWindow)), &waitGWorld->pictSize, &windowRect, srcCopy, nil); //we flush the window buffer by passing the window and its visible region QDFlushPortBuffer(GetWindowPort(waitWindow), GetPortVisibleRegion(GetWindowPort(waitWindow), waitGWorld->visibleRgn)); SetGWorld(SavePort, SaveGD); } void PPDisplayDevice::renderAndUpdateWaitWindow(pp_uint32 width, pp_uint32 height, const PPColor& waitBarColor) { unsigned int pitch; unsigned char* buffer; waitGWorld->UnlockGWorldMemory(&buffer,&pitch); DrawWaitBar(width, height, 160, 16, 0xFFFFFF, (waitBarColor.r << 16) + (waitBarColor.g << 8) + (waitBarColor.b), buffer, pitch, &DrawPixel32); waitGWorld->LockGWorldMemory(); updateWaitWindow(); } void* PPDisplayDevice::UpdateWaitWindowThreadProc(void* theID) { PPDisplayDevice* thisDisplayDevice = (PPDisplayDevice*)theID; while (true) { if (thisDisplayDevice->waitWindowVisible) thisDisplayDevice->renderAndUpdateWaitWindow(thisDisplayDevice->waitWindowWidth, thisDisplayDevice->waitWindowHeight, thisDisplayDevice->waitBarColor); System::msleep(100); } return NULL; } void PPDisplayDevice::signalWaitState(bool b, const PPColor& color) { waitBarColor = color; if (b) { // get main window boundaries Rect bounds; GetWindowBounds (mainWindow, kWindowContentRgn, &bounds); // move wait window to fit in the middle of the main window MoveWindow (waitWindow, bounds.left + ((bounds.right-bounds.left) >> 1) - (waitWindowWidth>>1), bounds.top + ((bounds.bottom-bounds.top) >> 1) - (waitWindowHeight>>1), false); renderAndUpdateWaitWindow(waitWindowWidth, waitWindowHeight, waitBarColor); ShowWindow(waitWindow); waitWindowVisible = true; if (!drawThread) { if (pthread_create(&drawThread, NULL, UpdateWaitWindowThreadProc , (void*)this)) { // error printf("could not create thread"); } } } else { waitWindowVisible = false; HideWindow(waitWindow); } } void PPDisplayDevice::setMouseCursor(MouseCursorTypes type) { currentCursorType = type; switch (type) { case MouseCursorTypeStandard: SetThemeCursor(kThemeArrowCursor); break; case MouseCursorTypeResizeLeft: SetThemeCursor(kThemeResizeLeftCursor); break; case MouseCursorTypeResizeRight: SetThemeCursor(kThemeResizeRightCursor); break; case MouseCursorTypeHand: SetThemeCursor(kThemeOpenHandCursor); break; } } milkytracker-0.90.85+dfsg/src/ppui/ContextMenu.cpp0000644000175000017500000002212411150223367021145 0ustar admin2admin2/* * ppui/ContextMenu.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "ContextMenu.h" #include "GraphicsAbstract.h" #include "Event.h" #include "Screen.h" #include "Font.h" #include "Menu.h" #include "PPUIConfig.h" PPContextMenu::PPContextMenu(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPColor& selColor, bool doAutoAddHide/* = false*/, PPFont* font/* = NULL*/) : PPControl(id, parentScreen, eventListener, location, PPSize(0,0)), color(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorMenuBackground)), selectionColor(&selColor), autoAddHide(doAutoAddHide), notifyParentOnHide(false), menuSelection(-1), hasDragged(false) { // default color if (font == NULL) font = PPFont::getFont(PPFont::FONT_SYSTEM); menu = new PPMenu(font, *selectionColor, *color); menu->setTextBrightColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorMenuTextBright)); menu->setTextDarkColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorMenuTextDark)); } PPContextMenu::~PPContextMenu() { delete menu; } void PPContextMenu::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; g->setRect(location.x, location.y, location.x + size.width, location.y + size.height); // update menu selection before drawing the menu pp_int32 menuSelection = this->menuSelection; PPContextMenu* subMenu = static_cast(parentScreen->getLastContextMenuControl()); for (pp_int32 i = 0; i < menu->items.size(); i++) { if (menu->items.get(i)->subMenu == subMenu) menuSelection = i; } menu->paint(g, location.x, location.y, menuSelection); } void PPContextMenu::showSubMenu(PPContextMenu* subMenu) { if (parentScreen->getLastContextMenuControl() == subMenu) return; PPPoint p; p.x = getLocation().x + getSize().width - 2; p.y = getLocation().y - 2 + menuSelection * menu->getEntryHeight(); if (p.x + subMenu->getSize().width > parentScreen->getWidth() + (subMenu->getSize().width >> 1)) p.x = getLocation().x - subMenu->getSize().width; subMenu->setLocation(p); parentScreen->addContextMenuControl(subMenu); } pp_int32 PPContextMenu::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; //if (!visible) // return 0; switch (event->getID()) { case eLMouseDown: { hasDragged = false; pressInvoke = false; PPPoint* p = (PPPoint*)event->getDataPtr(); processMenuHit(*p); if (menuSelection >= 0) { if (menu->items.get(menuSelection)->subMenu) { PPContextMenu* subMenu = menu->items.get(menuSelection)->subMenu; if (parentScreen->getLastContextMenuControl() == subMenu) { parentScreen->removeLastContextMenuControl(); break; } if (parentScreen->getLastContextMenuControl() != this && parentScreen->getLastContextMenuControl() != subMenu) parentScreen->removeLastContextMenuControl(); showSubMenu(subMenu); } } break; } case eRMouseUp: case eLMouseUp: { if (event->getID() == eRMouseUp && !hasDragged) break; if (event->getID() && pressInvoke) break; PPPoint* p = (PPPoint*)event->getDataPtr(); processMenuHit(*p); if (menuSelection >= 0) { if (!menu->items.get(menuSelection)->subMenu) { pp_int32 theId = menu->items.get(menuSelection)->identifier; if (theId == -1) break; PPEvent e(eCommand, &theId, sizeof(theId)); eventListener->handleEvent(reinterpret_cast(this), &e); parentScreen->setContextMenuControl(NULL); menuSelection = -1; } } break; } case eLMouseRepeat: break; case eMouseMoved: case eLMouseDrag: case eRMouseDrag: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (hit(*p) && !hadCursor) { hadCursor = true; } else if (!hit(*p) && hadCursor && isSubMenu() && getParentMenu() && getParentMenu()->hit(*p)) { parentScreen->removeLastContextMenuControl(); break; } if (event->getID() == eLMouseDrag || event->getID() == eRMouseDrag) hasDragged = true; processMenuHit(*p); if (menuSelection >= 0 && menuSelection < menu->items.size()) { PPContextMenu* subMenu = menu->items.get(menuSelection)->subMenu; if (subMenu && parentScreen->getLastContextMenuControl() != subMenu) { PPContextMenu* lastMenu = (PPContextMenu*)parentScreen->getLastContextMenuControl(); if (lastMenu->getParentMenu()) { parentScreen->removeLastContextMenuControl(); } showSubMenu(subMenu); } else if (!subMenu && parentScreen->getLastContextMenuControl() != this) { parentScreen->removeLastContextMenuControl(); } } else if (menuSelection == -1 && parentScreen->getLastContextMenuControl() != this && !parentScreen->getLastContextMenuControl()->hit(*p) && hit(*p)) { parentScreen->removeLastContextMenuControl(); } break; } case eFocusGained: case eFocusGainedNoRepaint: { menuSelection = -1; pressInvoke = true; hasDragged = false; hadCursor = false; break; } case eFocusLost: case eFocusLostNoRepaint: menuSelection = -1; hasDragged = false; pressInvoke = false; hadCursor = false; break; } return eventListener->handleEvent(reinterpret_cast(this), event); } void PPContextMenu::addEntry(const PPString& s, pp_int32 theId, PPContextMenu* contextMenu) { if (menu) { if (autoAddHide && menu->items.size() > 0) { pp_int32 i = menu->items.size(); if (menu->items.get(i-1)->identifier == MenuCommandIDHide) { menu->items.remove(i-1); pp_int32 i = menu->items.size(); if (menu->items.get(i-1)->identifier == -1) menu->items.remove(i-1); } } menu->items.add(new PPMenu::Entry(s, theId, 0, contextMenu)); // add a hide option automatically if (autoAddHide) { pp_uint32 maxLen = 0; pp_int32 i; for (i = 0; i < menu->items.size(); i++) { if (menu->items.get(i)->name.length() > maxLen) maxLen = menu->items.get(i)->name.length(); } if (maxLen < 9) maxLen = 9; char* buffer = new char[maxLen+1]; memset(buffer, 0, maxLen+1); memset(buffer, '\xc4', maxLen); menu->items.add(new PPMenu::Entry(buffer, -1, 0, NULL)); delete[] buffer; menu->items.add(new PPMenu::Entry("Hide menu", MenuCommandIDHide, 0, NULL)); } if (contextMenu) contextMenu->setParentMenu(this); PPRect r = menu->getBoundingRect(); setSize(PPSize(r.width(), r.height())); } } bool PPContextMenu::hitMenu(const PPPoint& p) const { pp_int32 py = location.x; pp_int32 px = location.y; PPRect r = menu->getBoundingRect(); if ((p.x >= px && p.x < px + r.x2 - 4) && (p.y >= py && p.y < py + r.y2 - 4)) return true; return false; } void PPContextMenu::processMenuHit(const PPPoint& p) { PPPoint cp = p; pp_int32 px = location.x; pp_int32 py = location.y; cp.x -= px; cp.y -= py; cp.y -= 4; pp_int32 lastMenuSelection = menuSelection; if (cp.x < 0 || cp.x >= menu->getBoundingRect().width() || cp.y < 0) { menuSelection = -1; if (lastMenuSelection != menuSelection) parentScreen->paintContextMenuControl(this); return; } menuSelection = cp.y / menu->getEntryHeight(); if (menuSelection >= menu->items.size()) { menuSelection = -1; if (lastMenuSelection != menuSelection) parentScreen->paintContextMenuControl(this); } else { if (menuSelection >= 0 && menuSelection < menu->items.size()) { if ((menu->items.get(menuSelection)->state & 1) || (menu->items.get(menuSelection)->identifier==-1)) menuSelection = -1; } if (lastMenuSelection != menuSelection) parentScreen->paintContextMenuControl(this); } } void PPContextMenu::setSize(const PPSize& size) { this->size = size; if (location.x + size.width+2 > parentScreen->getWidth()) location.x-=((location.x + size.width+2)-parentScreen->getWidth()); if (location.y + size.height+2 > parentScreen->getHeight()) location.y-=((location.y + size.height+2)-parentScreen->getHeight()); } void PPContextMenu::setLocation(const PPPoint& location) { PPPoint loc = location; if (loc.x + size.width+2 > parentScreen->getWidth()) loc.x-=((loc.x + size.width+2)-parentScreen->getWidth()); if (loc.y + size.height+2 > parentScreen->getHeight()) loc.y-=((loc.y + size.height+2)-parentScreen->getHeight()); if (loc.x < 0) loc.x = 0; if (loc.y < 0) loc.y = 0; this->location = loc; } milkytracker-0.90.85+dfsg/src/ppui/PPUI.h0000644000175000017500000000260711150223367017122 0ustar admin2admin2/* * ppui/PPUI.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPUI main include // ///////////////////////////////////////////////////////////////// #ifndef PPUI__H #define PPUI__H #include "Object.h" #include "BasicTypes.h" #include "Tools.h" #include "Event.h" #include "Screen.h" #include "GraphicsAbstract.h" #include "Font.h" #include "Control.h" #include "Button.h" #include "ScrollBar.h" #include "Slider.h" #include "ListBox.h" #include "CheckBox.h" #include "Container.h" #include "MessageBoxContainer.h" #include "RadioGroup.h" #include "StaticText.h" #include "ContextMenu.h" #include "Seperator.h" #include "PPUIConfig.h" #endif milkytracker-0.90.85+dfsg/src/ppui/fix_newline.sh0000755000175000017500000000036410737736041021050 0ustar admin2admin2#!/bin/sh # for i in `ls` do if [ -f $i ] then if [ -n "`tail -1c $i`" ] then echo "Bearbeite $i" echo >> $i fi fi done milkytracker-0.90.85+dfsg/src/ppui/Graphics_BGR24_SLOW.cpp0000644000175000017500000002167411150223367022151 0ustar admin2admin2/* * ppui/Graphics_BGR24_SLOW.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Graphics.h" #include "Font.h" #define BPP 3 PPGraphics_BGR24_SLOW::PPGraphics_BGR24_SLOW(pp_int32 w, pp_int32 h, pp_int32 p, void* buff) : PPGraphicsFrameBuffer(w, h, p, buff) { } void PPGraphics_BGR24_SLOW::setPixel(pp_int32 x, pp_int32 y) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; buff[0] = (pp_uint8)currentColor.b; buff[1] = (pp_uint8)currentColor.g; buff[2] = (pp_uint8)currentColor.r; } } void PPGraphics_BGR24_SLOW::setPixel(pp_int32 x, pp_int32 y, const PPColor& color) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; buff[0] = (pp_uint8)color.b; buff[1] = (pp_uint8)color.g; buff[2] = (pp_uint8)color.r; } } void PPGraphics_BGR24_SLOW::fill(PPRect rect) { if (rect.y1 < currentClipRect.y1) rect.y1 = currentClipRect.y1; if (rect.x1 < currentClipRect.x1) rect.x1 = currentClipRect.x1; if (rect.y2 > currentClipRect.y2) rect.y2 = currentClipRect.y2; if (rect.x2 > currentClipRect.x2) rect.x2 = currentClipRect.x2; pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; pp_int32 len = (rect.x2-rect.x1); pp_uint8* buff = (pp_uint8*)buffer+(pitch*rect.y1+rect.x1*BPP); for (pp_int32 y = rect.y1; y < rect.y2; y++) { pp_uint8* ptr = buff; pp_int32 i; for (i = 0; i < len; i++) { *ptr = b; *(ptr+1) = g; *(ptr+2) = r; ptr+=3; } buff+=pitch; } } void PPGraphics_BGR24_SLOW::fill() { fill(currentClipRect); } void PPGraphics_BGR24_SLOW::drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) { pp_int32 lx = x1; pp_int32 rx = x2; if (x1 > x2) { pp_int32 h = x2; x2 = x1; x1 = h; } if (lx < currentClipRect.x1) lx = currentClipRect.x1; if (rx > currentClipRect.x2) rx = currentClipRect.x2; if (y < currentClipRect.y1) return; if (y >= currentClipRect.y2) return; pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; pp_int32 len = (rx-lx); pp_uint8* buff = (pp_uint8*)buffer+pitch*y+lx*BPP; pp_int32 i; for (i = 0; i < len; i++) { *buff = b; *(buff+1) = g; *(buff+2) = r; buff+=3; } } void PPGraphics_BGR24_SLOW::drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) { pp_int32 ly = y1; pp_int32 ry = y2; if (y1 > y2) { pp_int32 h = y2; y2 = y1; y1 = h; } if (ly < currentClipRect.y1) ly = currentClipRect.y1; if (ry > currentClipRect.y2) ry = currentClipRect.y2; if (x < currentClipRect.x1) return; if (x >= currentClipRect.x2) return; pp_uint8* buff = (pp_uint8*)buffer+pitch*ly+x*BPP; pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; for (pp_int32 y = ly; y < ry; y++) { *buff = b; *(buff+1) = g; *(buff+2) = r; buff+=pitch; } } void PPGraphics_BGR24_SLOW::drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSLINETEMPLATE } void PPGraphics_BGR24_SLOW::drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSAALINETEMPLATE } void PPGraphics_BGR24_SLOW::blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { pp_int32 w = size.width; pp_int32 h = size.height; const pp_int32 bytesPerPixel = bpp; pp_uint8* dst = (pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP); if (intensity == 256) { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { dst[2] = src[0]; dst[1] = src[1]; dst[0] = src[2]; dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } else { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { dst[2] = (src[0]*intensity)>>8; dst[1] = (src[1]*intensity)>>8; dst[0] = (src[2]*intensity)>>8; dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } } void PPGraphics_BGR24_SLOW::drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 charDim = currentFont->charDim; if (x + (signed)charWidth < currentClipRect.x1 || x > currentClipRect.x2 || y + (signed)charHeight < currentClipRect.y1 || y > currentClipRect.y2) return; /*pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; if (x>= currentClipRect.x1 && x + (signed)currentFont->charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + (signed)currentFont->charHeight < currentClipRect.y2) { for (pp_uint32 i = 0; i < currentFont->charHeight; i++) { pp_uint8* buff = (pp_uint8*)buffer + (y+i)*pitch + x*3; for (pp_uint32 j = 0; j < currentFont->charWidth; j++) { if (currentFont->getPixelBit(chr, j,i)) { buff[0] = b; buff[1] = g; buff[2] = r; } buff+=3; } } } else { for (pp_uint32 i = 0; i < currentFont->charHeight; i++) for (pp_uint32 j = 0; j < currentFont->charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && currentFont->getPixelBit(chr, j,i)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*3); buff[0] = b; buff[1] = g; buff[2] = r; } } }*/ pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; Bitstream* bitstream = currentFont->bitstream; pp_uint8* fontbuffer = bitstream->buffer; pp_uint8* buff = (pp_uint8*)buffer + y*pitch + x*BPP; pp_uint32 cchrDim = chr*charDim; if (x>= currentClipRect.x1 && x + charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + charHeight < currentClipRect.y2) { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if ((fontbuffer[xChr>>3]>>(xChr&7)&1)) { buff[0] = b; buff[1] = g; buff[2] = r; } buff+=BPP; xChr++; } buff+=pitch-(charWidth*BPP); yChr+=charWidth; } } else { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && (fontbuffer[xChr>>3]>>(xChr&7)&1)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*BPP); buff[0] = b; buff[1] = g; buff[2] = r; } xChr++; } yChr+=charWidth; } } if (underlined) drawHLine(x, x+charWidth, y+charHeight); } void PPGraphics_BGR24_SLOW::drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 sx = x; while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; case '\n': y+=charHeight; x=sx-charWidth; break; default: drawChar(*str, x, y, underlined); } x += charWidth; str++; } } void PPGraphics_BGR24_SLOW::drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; default: drawChar(*str, x, y, underlined); } y += charHeight; str++; } } milkytracker-0.90.85+dfsg/src/ppui/ListBoxFileBrowser.h0000644000175000017500000000741111150223367022073 0ustar admin2admin2/* * ppui/ListBoxFileBrowser.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ListBoxFileBrowser.h * MilkyTracker * * Created by Peter Barth on 19.10.06. * */ #ifndef __LISTBOXFILEBROWSER_H__ #define __LISTBOXFILEBROWSER_H__ #include "ListBox.h" #include "SimpleVector.h" #include "UndoStack.h" class PPListBoxFileBrowser : public PPListBox { public: enum SortTypes { SortByName, SortBySize, SortByExtension, NumSortRules }; private: class PPPath* currentPath; PPSystemString* initialPath; PPSystemString* fileFullPath; PPSimpleVector pathEntries; PPUndoStack history; PPString filePrefix, fileSuffix; PPString directoryPrefix, directorySuffix; bool sortAscending; bool cycleFilenames; PPSimpleVector items; SortTypes sortType; public: PPListBoxFileBrowser(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size); virtual ~PPListBoxFileBrowser(); virtual pp_int32 dispatchEvent(PPEvent* event); virtual bool receiveTimerEvent() const { return false; } void refreshFiles(); void setSortAscending(bool sortAscending) { this->sortAscending = sortAscending; } void setCycleFilenames(bool cycleFilenames) { this->cycleFilenames = cycleFilenames; } void cycleSorting() { sortType = (SortTypes)(((pp_int32)sortType+1) % NumSortRules); } void setSortType(SortTypes sortType) { this->sortType = sortType; if (this->sortType >= NumSortRules) this->sortType = SortByName; } SortTypes getSortType() const { return sortType; } void clearExtensions(); // must contain pairs of extensions / description // terminated by TWO NULL pointers void addExtensions(const char* const extensions[]); void addExtension(const PPString& ext, const PPString& desc); const PPPath& getCurrentPath() const { return *currentPath; } PPSystemString getCurrentPathAsString() const; PPString getCurrentPathAsASCIIString() const; const PPPathEntry* getPathEntry(pp_int32 index) const; const PPPathEntry* getCurrentSelectedPathEntry() const { return getPathEntry(PPListBox::getSelectedIndex()); } const PPSimpleVector& getPathEntries() const { return pathEntries; } bool canGotoHome() const; void gotoHome(); bool canGotoRoot() const; void gotoRoot(); bool canGotoParent() const; void gotoParent(); bool currentSelectionIsFile(); bool stepIntoCurrentSelection(); bool stepInto(const PPPathEntry& entry); bool gotoPath(const PPSystemString& path, bool reload = true); bool canPrev() const; void prev(); bool canNext() const; void next(); void setFilePrefix(const PPString& prefix); void setFileSuffix(const PPString& suffix); void setDirectoryPrefix(const PPString& prefix); void setDirectorySuffix(const PPString& suffix); void setDirectorySuffixPathSeperator(); private: void iterateFilesInFolder(); void buildFileList(); void sortFileList(); void cycle(char chr); static void appendFileSize(PPString& name, const PPPathEntry& entry); bool checkExtension(const PPPathEntry& entry); }; #endif // __LISTBOXFILEBROWSER_H__ milkytracker-0.90.85+dfsg/src/ppui/Button.cpp0000644000175000017500000001707511150223367020160 0ustar admin2admin2/* * ppui/Button.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Button.h" #include "GraphicsAbstract.h" #include "Event.h" #include "Screen.h" #include "Font.h" #include "PPUIConfig.h" PPButton::PPButton(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border/*= true*/, bool clickable/*= true*/, bool update/*=true*/) : PPControl(id, parentScreen, eventListener, location, size), color(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorDefaultButton)), textColor(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorDefaultButtonText)), border(border), clickable(clickable), update(update), verticalText(false), flat(false), autoSizeFont(true), offset(0,0), invertShading(false), lMouseDown(false), rMouseDown(false) { // default colors pressed = false; font = PPFont::getFont(PPFont::FONT_SYSTEM); } PPButton::~PPButton() { } void PPButton::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; PPPoint location = this->location; g->setRect(location.x, location.y, location.x + size.width, location.y + size.height); g->setColor(*color); //g->fill(); { PPColor nsdColor = *color, nsbColor = *color; if (!pressed) { // adjust not so dark color nsdColor.scaleFixed(flat ? 65536 : 40000); // adjust bright color nsbColor.scaleFixed(flat ? 65536 : 80000); } else { // adjust not so dark color nsdColor.scaleFixed(flat ? 65536 : 30000); // adjust bright color nsbColor.scaleFixed(flat ? 65536 : 60000); } g->fillVerticalShaded(nsbColor, nsdColor, invertShading); } PPColor bColor = *color; g->setFont(font); if (!pressed) { // adjust bright color bColor.scaleFixed(87163); g->setColor(bColor); g->drawHLine(location.x, location.x + size.width, location.y); g->drawVLine(location.y, location.y + size.height, location.x); // adjust dark color bColor = *color; bColor.scaleFixed(20000); g->setColor(bColor); g->drawHLine(location.x, location.x + size.width, location.y + size.height - 1); g->drawVLine(location.y, location.y + size.height, location.x + size.width - 1); if (text) { PPColor tColor = *textColor; if (!clickable || !enabled) { tColor.r = (tColor.r + color->r)>>1; tColor.g = (tColor.g + color->g)>>1; tColor.b = (tColor.b + color->b)>>1; } g->setColor(tColor); if (!verticalText) { pp_int32 cx = (size.width>>1)-(font->getStrWidth(text)>>1) + location.x; pp_int32 cy = (size.height>>1)-(font->getCharHeight()>>1) + location.y + 1; g->drawString(text, cx+offset.x, cy+offset.y); } else { pp_int32 cx = (size.width>>1)-(font->getCharWidth()>>1) + location.x; pp_int32 cy = (size.height>>1)-((font->getCharHeight()*text.length())>>1) + location.y + 1; g->drawStringVertical(text, cx+offset.x, cy+offset.y); } } } else { // adjust dark color bColor = *color; bColor.scaleFixed(32768); g->setColor(bColor); g->drawHLine(location.x, location.x + size.width, location.y); g->drawVLine(location.y, location.y + size.height, location.x); g->setColor(bColor.r>>1,bColor.g>>1,bColor.b>>1); g->drawHLine(location.x, location.x + size.width, location.y + size.height - 1); g->drawVLine(location.y, location.y + size.height, location.x + size.width - 1); //g->drawHLine(location.x, location.x + size.width, location.y + size.height - 1); //g->drawVLine(location.y, location.y + size.height, location.x + size.width - 1); if (text) { g->setColor(*textColor); if (!verticalText) { pp_int32 cx = (size.width>>1)-(font->getStrWidth(text)>>1) + location.x + 1; pp_int32 cy = (size.height>>1)-(font->getCharHeight()>>1) + location.y + 2; g->drawString(text, cx+offset.x, cy+offset.y); } else { pp_int32 cx = (size.width>>1)-(font->getCharWidth()>>1) + location.x + 1; pp_int32 cy = (size.height>>1)-((font->getCharHeight()*text.length())>>1) + location.y + 2; g->drawStringVertical(text, cx+offset.x, cy+offset.y); } } } if (border && enabled) { bColor.r = bColor.g = bColor.b = 0; g->setColor(bColor); g->setRect(location.x-1, location.y-1, location.x + size.width+1, location.y + size.height+1); g->drawHLine(location.x, location.x + size.width, location.y-1); g->drawVLine(location.y, location.y + size.height, location.x-1); g->drawHLine(location.x, location.x + size.width, location.y + size.height); g->drawVLine(location.y, location.y + size.height, location.x + size.width); } } pp_int32 PPButton::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; //if (!visible) // return 0; switch (event->getID()) { case eLMouseDrag: case eRMouseDrag: { PPPoint p = *reinterpret_cast(event->getDataPtr()); if (!hit(p) && clickable && pressed && update) { pressed = false; parentScreen->paintControl(this); } else if (hit(p) && clickable && !pressed && update) { pressed = true; parentScreen->paintControl(this); } } break; case eLMouseDown: handleButtonPress(lMouseDown, rMouseDown); break; case eLMouseUp: handleButtonRelease(lMouseDown, rMouseDown, event, eCommand); break; case eRMouseDown: handleButtonPress(rMouseDown, lMouseDown); break; case eRMouseUp: handleButtonRelease(rMouseDown, lMouseDown, event, eCommandRight); break; case eLMouseRepeat: case eRMouseRepeat: if (clickable && pressed) { PPEvent e(eCommandRepeat); eventListener->handleEvent(reinterpret_cast(this), &e); } break; } return eventListener->handleEvent(reinterpret_cast(this), event); } void PPButton::setText(const PPString& text) { bool lastCharIsPeriod = text.length() ? (text[text.length()-1] == '.') : false; this->text = text; // Fall back to tiny font if string doesn't fit with current font if (autoSizeFont && font != PPFont::getFont(PPFont::FONT_TINY) && !verticalText && ((signed)font->getStrWidth(text) > size.width - (lastCharIsPeriod ? -6 : 2) || (signed)font->getCharHeight() > size.height)) { font = PPFont::getFont(PPFont::FONT_TINY); } } void PPButton::handleButtonPress(bool& lMouseDown, bool& rMouseDown) { if (rMouseDown) { lMouseDown = false; pressed = false; if (update) parentScreen->paintControl(this); return; } lMouseDown = true; if (clickable) { pressed = true; if (update) parentScreen->paintControl(this); } } void PPButton::handleButtonRelease(bool& lMouseDown, bool& rMouseDown, PPEvent* event, EEventDescriptor postEvent) { lMouseDown = false; if (clickable && !rMouseDown && pressed) { pressed = false; if (update) parentScreen->paintControl(this); if (hit(*reinterpret_cast(event->getDataPtr()))) { PPEvent e(postEvent); eventListener->handleEvent(reinterpret_cast(this), &e); } } } milkytracker-0.90.85+dfsg/src/ppui/PPUIConfig.cpp0000644000175000017500000000312611150223367020600 0ustar admin2admin2/* * ppui/PPUIConfig.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPUIConfig.cpp * MilkyTracker * * Created by Peter Barth on 01.07.05. * */ #include "PPUIConfig.h" PPUIConfig::PPUIConfig() { colors[ColorSelection] = PPColor(64*2, 64*2, 128*2-1); colors[ColorGrayedOutSelection] = PPColor(128, 128, 128); colors[ColorDefaultButton] = PPColor(192, 192, 192); colors[ColorDefaultButtonText] = PPColor(0, 0, 0); colors[ColorContainer] = PPColor(128, 128, 128); colors[ColorMessageBoxContainer] = PPColor(120, 120, 120); colors[ColorMenuBackground] = PPColor(224, 224, 224); colors[ColorMenuTextDark] = PPColor(0, 0, 0); colors[ColorMenuTextBright] = PPColor(255, 255, 255); colors[ColorListBoxBorder] = PPColor(192, 192, 192); colors[ColorListBoxBackground] = PPColor(32, 32, 48); colors[ColorRadioGroupButton] = PPColor(128, 128, 0); colors[ColorStaticText] = PPColor(255, 255, 255); } milkytracker-0.90.85+dfsg/src/ppui/ContextMenu.h0000644000175000017500000000552111150223367020614 0ustar admin2admin2/* * ppui/ContextMenu.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Contextmenu control class // ///////////////////////////////////////////////////////////////// #ifndef CONTEXTMENU__H #define CONTEXTMENU__H #include "BasicTypes.h" #include "Control.h" #include "Menu.h" // Forwards class PPGraphicsAbstract; class PPFont; class PPContextMenu; class PPContextMenu : public PPControl { private: const PPColor* color; const PPColor* selectionColor; bool autoAddHide; bool notifyParentOnHide; PPFont* font; PPMenu* menu; pp_int32 menuSelection; bool hasDragged; bool pressInvoke; bool hadCursor; void showSubMenu(PPContextMenu* subMenu); public: PPContextMenu(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPColor& selColor, bool doAutoAddHide = false, PPFont* font = NULL); virtual ~PPContextMenu(); void setColor(const PPColor& color) { this->color = &color; } void setFont(PPFont* font) { this->font = font; menu->setFont(font); PPRect r = menu->getBoundingRect(); setSize(PPSize(r.width(), r.height())); } PPFont* getFont() const { return font; } virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); // menu controlling void addEntry(const PPString& s, pp_int32 theId, PPContextMenu* contextMenu = NULL); bool setState(pp_int32 theId, pp_uint32 newState) { return menu->setState(theId, newState); } bool hitMenu(const PPPoint& p) const; void processMenuHit(const PPPoint& p); void setSubMenu(bool bSubMenu) { menu->setSubMenu(bSubMenu); } bool isSubMenu() const { return menu->isSubMenu(); } void setParentMenu(PPContextMenu* parent) { menu->setParentMenu(parent); } PPContextMenu* getParentMenu() const { return menu->getParentMenu(); } void setNotifyParentOnHide(bool notifyParentOnHide) { this->notifyParentOnHide = notifyParentOnHide; } bool getNotifyParentOnHide() const { return notifyParentOnHide; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/GraphicsAbstract.h0000644000175000017500000002117211150223367021567 0ustar admin2admin2/* * ppui/GraphicsAbstract.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __GRAPHICSABSTRACT_H__ #define __GRAPHICSABSTRACT_H__ #include "BasicTypes.h" class PPFont; #define __PPGRAPHICSLINETEMPLATE \ if (x1 > currentClipRect.x2 || \ x2 < currentClipRect.x1 || \ y1 > currentClipRect.y2 || \ y2 < currentClipRect.y1) \ return; \ clipLine(x1, y1, x2, y2); \ if (x2 < x1) \ return; \ pp_int32 i, deltax, deltay, numpixels; \ pp_int32 d, dinc1, dinc2; \ pp_int32 x, xinc1, xinc2; \ pp_int32 y, yinc1, yinc2; \ /* Calculate deltax and deltay for initialisation */ \ deltax = abs(x2 - x1); \ deltay = abs(y2 - y1); \ /* Initialize all vars based on which is the independent variable */ \ if (deltax >= deltay) \ { \ /* x is independent variable */ \ numpixels = deltax + 1; \ d = (2 * deltay) - deltax; \ dinc1 = deltay << 1; \ dinc2 = (deltay - deltax) << 1; \ xinc1 = 1; \ xinc2 = 1; \ yinc1 = 0; \ yinc2 = 1; \ } \ else \ { \ /* y is independent variable */ \ numpixels = deltay + 1; \ d = (2 * deltax) - deltay; \ dinc1 = deltax << 1; \ dinc2 = (deltax - deltay) << 1; \ xinc1 = 0; \ xinc2 = 1; \ yinc1 = 1; \ yinc2 = 1; \ } \ /* Make sure x and y move in the right directions */ \ if (x1 > x2) \ { \ xinc1 = - xinc1; \ xinc2 = - xinc2; \ } \ if (y1 > y2) \ { \ yinc1 = - yinc1; \ yinc2 = - yinc2; \ } \ /* Start drawing at */ \ x = x1; \ y = y1; \ /* Draw the pixels */ \ for (i = 1; i<=numpixels; i++) \ { \ setPixel(x,y); \ if (d < 0) \ { \ d = d + dinc1; \ x = x + xinc1; \ y = y + yinc1; \ } \ else \ { \ d = d + dinc2; \ x = x + xinc2; \ y = y + yinc2; \ } \ } #define __PPGRAPHICSAALINETEMPLATE \ if (x1 > currentClipRect.x2 || \ x2 < currentClipRect.x1 || \ y1 > currentClipRect.y2 || \ y2 < currentClipRect.y1) \ return; \ clipLine(x1, y1, x2, y2); \ if (x2 < x1) \ return; \ PPColor* col = ¤tColor; \ pp_int32 x, y, inc; /* these must be >=32 bits */ \ pp_int32 dx, dy; \ dx = (x2 - x1); \ dy = (y2 - y1); \ if (abs(dx) > abs(dy)) { \ if (dx < 0) { \ dx = -dx; \ dy = -dy; \ swap(&x1, &x2); \ swap(&y1, &y2); \ } \ x = x1 << 16; \ y = y1 << 16; \ inc = (dx == 0 ? 0 : (dy * 65536) / dx); \ while ((x >> 16) < x2) { \ set_pixel_transp(this, x >> 16, y >> 16, \ col, (y >> 8) & 0xFF); \ set_pixel_transp(this, x >> 16, (y >> 16) + 1, \ col, (~y >> 8) & 0xFF); \ x += (1 << 16); \ y += inc; \ } \ } else { \ if (dy < 0) { \ dx = -dx; \ dy = -dy; \ swap(&x1, &x2); \ swap(&y1, &y2); \ } \ x = x1 << 16; \ y = y1 << 16; \ inc = (dy == 0 ? 0 : (dx * 65536) / dy); \ while ((y >> 16) < y2) { \ set_pixel_transp(this, x >> 16, y >> 16, \ col, (x >> 8) & 0xFF); \ set_pixel_transp(this, (x >> 16) + 1, (y >> 16), \ col, (~x >> 8) & 0xFF); \ x += inc; \ y += (1 << 16); \ } \ } class PPGraphicsAbstract { protected: static void swap(pp_int32* a, pp_int32* b) { pp_int32 h = *a; *a = *b; *b = h; } pp_int32 width, height; public: bool lock; protected: PPColor currentColor; pp_uint16 color16; PPRect currentClipRect, origRect; PPFont* currentFont; virtual void validateRect() { if ((currentClipRect.x1 < 0 && currentClipRect.x2 < 0) || (currentClipRect.y1 < 0 && currentClipRect.y2 < 0) || (currentClipRect.x1 > width && currentClipRect.x2 > width) || (currentClipRect.y1 > height && currentClipRect.y2 > height)) { currentClipRect.x1 = 0; currentClipRect.x2 = 0; currentClipRect.y1 = 0; currentClipRect.y2 = 0; return; } if (currentClipRect.x1 < 0) currentClipRect.x1 = 0; if (currentClipRect.y1 < 0) currentClipRect.y1 = 0; if (currentClipRect.x2 > width) currentClipRect.x2 = width; if (currentClipRect.y2 > height) currentClipRect.y2 = height; } void convertColorTo16() { color16 = (((pp_uint16)((currentColor.r)>>3)<<11)+((pp_uint16)((currentColor.g)>>2)<<5)+(pp_uint16)((currentColor.b)>>3)); } PPGraphicsAbstract(pp_int32 w, pp_int32 h) : width(w), height(h), lock(false), currentFont(NULL) { } public: pp_int32 getWidth() { return width; } pp_int32 getHeight() { return height; } void setRect(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { currentClipRect.x1 = x1; currentClipRect.y1 = y1; currentClipRect.x2 = x2; currentClipRect.y2 = y2; origRect = currentClipRect; validateRect(); } void setRect(PPRect r) { currentClipRect = origRect = r; validateRect(); } PPRect getRect() { return origRect; } void setFullRect() { currentClipRect.x1 = 0; currentClipRect.y1 = 0; currentClipRect.x2 = width-1; currentClipRect.y2 = height-1; origRect = currentClipRect; validateRect(); } void clipLine(pp_int32& x1, pp_int32& y1, pp_int32& x2, pp_int32& y2) { if (x1 < currentClipRect.x1) { float stepy = (float)(y2 - y1) / (float)(x2 - x1); y1 = (pp_int32)((float)y1 + stepy * (currentClipRect.x1-x1)); x1 = currentClipRect.x1; } if (x2 > currentClipRect.x2) { float stepy = (float)(y2 - y1) / (float)(x2 - x1); x2 = currentClipRect.x2; y2 = (pp_int32)((float)y1 + stepy * (x2-x1)); } } void setColor(pp_int32 r,pp_int32 g,pp_int32 b) { currentColor.r = r; currentColor.g = g; currentColor.b = b; convertColorTo16(); } void setColor(const PPColor& color) { currentColor = color; convertColorTo16(); } void setSafeColor(pp_int32 r,pp_int32 g,pp_int32 b) { if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; currentColor.r = r; currentColor.g = g; currentColor.b = b; convertColorTo16(); } PPColor getColor() { return currentColor; } virtual void setFont(PPFont* font) { currentFont = font; } PPFont* getCurrentFont() { return currentFont; } // Interfaces to be implemented by sub class virtual void setPixel(pp_int32 x, pp_int32 y) = 0; virtual void setPixel(pp_int32 x, pp_int32 y, const PPColor& color) = 0; virtual void fill(PPRect r) = 0; virtual void fill() = 0; virtual void drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) = 0; virtual void drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) = 0; virtual void drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) = 0; virtual void drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) = 0; virtual void blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity = 256) = 0; virtual void drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined = false) = 0; virtual void drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined = false) = 0; virtual void drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined = false) = 0; virtual void fillVerticalShaded(PPRect r, const PPColor& colSrc, const PPColor& colDst, bool invertShading) { const pp_int32 height = (r.y2 - r.y1); if (!height) return; pp_int32 addr = (colDst.r - colSrc.r)*65536 / height; pp_int32 addg = (colDst.g - colSrc.g)*65536 / height; pp_int32 addb = (colDst.b - colSrc.b)*65536 / height; if (invertShading) { addr = -addr; addg = -addg; addb = -addb; } pp_int32 rd = (invertShading ? colDst.r : colSrc.r) * 65536; pp_int32 gr = (invertShading ? colDst.g : colSrc.g) * 65536; pp_int32 bl = (invertShading ? colDst.b : colSrc.b) * 65536; const pp_int32 y1 = r.y1; const pp_int32 y2 = r.y2; for (pp_int32 i = y1; i < y2; i++) { setColor(rd>>16,gr>>16,bl>>16); drawHLine(r.x1, r.x2, i); rd+=addr; gr+=addg; bl+=addb; } } virtual void fillVerticalShaded(const PPColor& colSrc, const PPColor& colDst, bool invertShading) { fillVerticalShaded(currentClipRect, colSrc, colDst, invertShading); } }; #endif milkytracker-0.90.85+dfsg/src/ppui/Menu.h0000644000175000017500000000507711150223367017255 0ustar admin2admin2/* * ppui/Menu.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Menu.h * MilkyTracker * * Created by Peter Barth on Fri Mar 04 2005. * */ #ifndef MENU__H #define MENU__H #include "BasicTypes.h" #include "SimpleVector.h" class PPFont; class PPGraphicsAbstract; class PPContextMenu; enum MenuCommandIDs { MenuCommandIDNew = 0, MenuCommandIDCut = 1, MenuCommandIDCopy = 2, MenuCommandIDPaste = 3, MenuCommandIDSelectAll = 4, MenuCommandIDSelectNothing = 5, MenuCommandIDUndo = 7, MenuCommandIDRedo = 8, MenuCommandIDHide = 0x10000 }; struct PPMenu { struct Entry { PPString name; pp_int32 identifier; pp_uint32 state; PPContextMenu* subMenu; Entry(const PPString& s, pp_int32 theId, pp_uint32 stat = 0, PPContextMenu* aSubMenu = NULL) : name(s), identifier(theId), state(stat), subMenu(aSubMenu) { } }; PPSimpleVector items; PPFont* font; const PPColor* backColor; const PPColor* borderColor; const PPColor* selectionColor; const PPColor* textBrightColor; const PPColor* textDarkColor; bool subMenu; PPContextMenu* parentMenu; PPMenu(PPFont* aFont, const PPColor& selectionColor, const PPColor& bgColor, bool bSubMenu = false); pp_uint32 getMaxWidth() const; pp_uint32 getEntryHeight() const; PPRect getBoundingRect() const; bool setState(pp_int32 theId, pp_uint32 newState); void setSubMenu(bool bSubMenu) { subMenu = bSubMenu; } bool isSubMenu() const { return subMenu; } void setParentMenu(PPContextMenu* parent) { parentMenu = parent; } PPContextMenu* getParentMenu() const { return parentMenu; } void paint(PPGraphicsAbstract* g, pp_int32 px, pp_int32 py, pp_int32 menuSelection); void setFont(PPFont* font) { this->font = font; } void setTextBrightColor(const PPColor& color) { textBrightColor = &color; } void setTextDarkColor(const PPColor& color) { textDarkColor = &color; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/fastfill.h0000644000175000017500000000525411150223367020152 0ustar admin2admin2/* * ppui/fastfill.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * fastfill.h * MilkyTracker * * Created by Peter Barth on 28.12.07. * */ #ifdef __GNUC__ static __attribute__((noinline)) void fill_dword(pp_uint32* buff, pp_uint32 dw, pp_uint32 len) #else static inline void fill_dword(pp_uint32* buff, pp_uint32 dw, pp_uint32 len) #endif { #if defined(__ppc__) && defined(__GNUC__) // PPC assembly FTW!!1! // r3 = buff // r4 = dw // r5 = len asm volatile("li r9, 0\n" "srawi r10, r5, 2\n" "nop\n" // align loop start to 16 byte boundary "cmpw cr7,r10,r9\n" "nop\n" // see above "beq cr7,$+36\n" "2:\n" "stw r4,0(r3)\n" "stw r4,4(r3)\n" "stw r4,8(r3)\n" "stw r4,12(r3)\n" "addi r10,r10,-1\n" "addi r3,r3,16\n" // advance by 16 "cmpw cr7,r10,r9\n" "bne cr7,2b\n" "clrlwi r11, r5, 30\n" "nop\n" // align loop start to 16 byte boundary "cmpw cr7,r11,r9\n" "beq cr7,$+24\n" "1:\n" "stw r4,0(r3)\n" "addi r11,r11,-1\n" "addi r3,r3,4\n" // advance by 4 "cmpw cr7,r11,r9\n" "bne cr7,1b"); #else pp_uint32 newlen = len >> 2; pp_uint32 remlen = len & 3; if (newlen) { do { *buff = dw; *(buff+1) = dw; *(buff+2) = dw; *(buff+3) = dw; buff+=4; } while (--newlen); } if (remlen) { do { *buff++ = dw; } while (--remlen); } #endif } #ifdef __GNUC__ static __attribute__((noinline)) void fill_dword_vertical(pp_uint32* buff, pp_uint32 dw, pp_uint32 len, pp_uint32 pitch) #else static inline void fill_dword_vertical(pp_uint32* buff, pp_uint32 dw, pp_uint32 len, pp_uint32 pitch) #endif { #if defined(__ppc__) && defined(__GNUC__) asm volatile("nop\n" // align loop start to 16 byte boundary "nop\n" // same "nop\n" // same "li r9,0\n" "1:\n" "stw r4,0(r3)\n" "addi r5,r5,-1\n" "add r3,r3,r6\n" "cmpw cr7,r5,r9\n" "bne cr7,1b"); #else do { *buff = dw; buff+=(pitch>>2); } while (--len); #endif } milkytracker-0.90.85+dfsg/src/ppui/KeyboardBindingHandler.cpp0000644000175000017500000000337311150223367023232 0ustar admin2admin2/* * ppui/KeyboardBindingHandler.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * KeyboardBindingHandler.cpp * MilkyTracker * * Created by Peter Barth on 29.04.05. * */ #include "KeyboardBindingHandler.h" bool KeyboardBindingHandler::processKeyEvents(PPEvent* event) { switch (event->getID()) { case eKeyDown: { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); switch (keyCode) { // store key modifiers case VK_ALT: keyModifier |= KeyModifierALT; return true; case VK_SHIFT: keyModifier |= KeyModifierSHIFT; return true; case VK_CONTROL: keyModifier |= KeyModifierCTRL; return true; } break; } case eKeyUp: { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); switch (keyCode) { // store key modifiers case VK_ALT: keyModifier &= ~KeyModifierALT; return true; case VK_SHIFT: keyModifier &= ~KeyModifierSHIFT; return true; case VK_CONTROL: keyModifier &= ~KeyModifierCTRL; return true; } break; } } return false; } milkytracker-0.90.85+dfsg/src/ppui/ListBox.cpp0000644000175000017500000011213311150223367020260 0ustar admin2admin2/* * ppui/ListBox.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "ListBox.h" #include "GraphicsAbstract.h" #include "Event.h" #include "Screen.h" #include "Font.h" #include "ScrollBar.h" #include "Button.h" #include "PPUIConfig.h" #include "Tools.h" #define SCROLLBARWIDTH SCROLLBUTTONSIZE #define BLINKINTERVAL 40 void PPListBox::initialize() { // create background button //pp_int32 w = size.width - (scrollable?SCROLLBARWIDTH-2:0)-2; //pp_int32 h = horizontalScrollbar? size.height - (scrollable?SCROLLBARWIDTH-2:0)-2 : size.height-2; pp_int32 w = size.width - 2; pp_int32 h = size.height - 2; backgroundButton = new PPButton(0, parentScreen, NULL, PPPoint(location.x+1, location.y+1), PPSize(w, h), border, false); backgroundButton->setColor(*backGroundButtonColor); backgroundButton->setInvertShading(true); vScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x + size.width - SCROLLBARWIDTH, location.y), size.height, false); hScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y + size.height - SCROLLBARWIDTH), size.width - SCROLLBARWIDTH, true); if (vScrollbar) vScrollbar->show(!autoHideVScroll); if (hScrollbar) hScrollbar->show(!autoHideHScroll); } PPListBox::PPListBox(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border/*= true*/, bool editable/*= false*/, bool scrollable/* = true*/, bool showSelectionAlways/*= false*/) : PPControl(id, parentScreen, eventListener, location, size), borderColor(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorListBoxBorder)), backGroundButtonColor(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorListBoxBackground)), // default textcolor textColor(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)), autoHideVScroll(true), autoHideHScroll(true), selectionVisible(true), onlyShowIndexSelection(false), keepsFocus(true), showFocus(true), centerSelection(false), selectOnScroll(false), singleButtonClickEdit(false), allowDragSelection(true), rightButtonConfirm(false), hScrollbar(NULL), vScrollbar(NULL), colorQueryListener(NULL) { this->border = border; this->editable = editable; this->scrollable = scrollable; this->showSelectionAlways = showSelectionAlways; showIndex = false; indexBaseCount = 1; // "unlimited" editing maxEditSize = -1; //this->clickable = clickable; // create char vector with 16 initial entries items = new PPSimpleVector(16); // create background button initialize(); caughtControl = NULL; controlCaughtByLMouseButton = controlCaughtByRMouseButton = false; lMouseDown = rMouseDown = false; font = PPFont::getFont(PPFont::FONT_SYSTEM); startIndex = 0; startPos = 0; timerTicker = 0; selectionIndex = showSelectionAlways ? 0 : -1; columnSelectionStart = -1; adjustScrollbars(); editCopy = NULL; } PPListBox::~PPListBox() { delete vScrollbar; delete hScrollbar; delete backgroundButton; delete items; } void PPListBox::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; ColorQueryListener* colorQueryListener = this->colorQueryListener; PPColor bColor = *borderColor, dColor = *borderColor; // adjust dark color dColor.scaleFixed(32768); // adjust bright color bColor.scaleFixed(87163); pp_int32 xOffset = 2; pp_uint32 maxDigits = PPTools::getHexNumDigits(items->size() - 1 + indexBaseCount); if (maxDigits == 0) maxDigits++; if (showIndex) xOffset += (maxDigits * font->getCharWidth() + 5); pp_int32 yOffset = 2; backgroundButton->paint(g); if (border) { drawBorder(g, *borderColor); } g->setRect(location.x, location.y, location.x + size.width-2, location.y + size.height-2); g->setFont(font); pp_int32 pos = location.y + yOffset; pp_int32 selectionWidth = onlyShowIndexSelection ? (maxDigits * font->getCharWidth() + 5) : (size.width - 2); g->setColor(*textColor); for (pp_int32 i = startIndex; i < items->size(); i++) { if (i < 0) continue; if (pos >= location.y + size.height) break; if (i == selectionIndex /*&& columnSelectionStart < 0*/ && selectionVisible) { PPRect currentRect = g->getRect(); PPRect rect = PPRect(location.x + 2, pos, location.x + selectionWidth, pos + getItemHeight()); if (rect.y1 < currentRect.y1) rect.y1 = currentRect.y1; if (rect.x1 < currentRect.x1) rect.x1 = currentRect.x1; if (rect.y2 > currentRect.y2) rect.y2 = currentRect.y2; if (rect.x2 > currentRect.x2) rect.x2 = currentRect.x2; g->setRect(rect); if (hasFocus || !showFocus) g->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorSelection)); else { PPColor c = PPUIConfig::getInstance()->getColor(PPUIConfig::ColorGrayedOutSelection); c.scale(0.5f); g->setColor(c); } g->fill(); g->setColor(*textColor); g->setRect(currentRect); } if (showIndex) { char hexIndex[10]; PPTools::convertToHex(hexIndex, i + indexBaseCount, maxDigits); g->drawString(hexIndex, location.x + 2, pos); } PPRect currentRect = g->getRect(); g->setRect(location.x + xOffset, location.y + yOffset, location.x + size.width-2, location.y + size.height-2); if (columnSelectionStart>=0 && selectionIndex == i) { if ((timerTicker % BLINKINTERVAL) < (BLINKINTERVAL>>1)) { if (hasFocus) { PPColor c = PPUIConfig::getInstance()->getColor(PPUIConfig::ColorSelection); if (showSelectionAlways) c.scale(0.65f); g->setColor(c); } else g->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorGrayedOutSelection)); for (pp_int32 j = 0; j < 8; j++) g->drawVLine(pos, pos + getItemHeight(), location.x + xOffset - ((startPos-columnSelectionStart)*font->getCharWidth()) + j); } g->setColor(*textColor); } g->setColor(colorQueryListener ? colorQueryListener->getColor(i, *this) : *textColor); g->drawString(*items->get(i), location.x + xOffset - (startPos*font->getCharWidth()), pos); g->setRect(currentRect); pos+=getItemHeight(); } g->setRect(location.x, location.y, location.x + size.width, location.y + size.height-1); if (showIndex) { g->setColor(bColor); g->drawVLine(location.y + 1, location.y + size.height - 1, location.x + xOffset - 3); g->setColor(*borderColor); g->drawVLine(location.y, location.y + size.height, location.x + xOffset - 2); g->setColor(dColor); g->drawVLine(location.y + 1, location.y + size.height - 1, location.x + xOffset - 1); } if (hScrollbar) hScrollbar->paint(g); if (vScrollbar) vScrollbar->paint(g); } PPListBox::SelectReturnCodes PPListBox::select(const PPPoint* p) { if (singleButtonClickEdit) return SelectReturnCodePlaceCursor; timerTicker = 0; PPPoint cp = *p; cp.x-=location.x; cp.y-=location.y; pp_int32 xOffset = 2; pp_uint32 maxDigits = PPTools::getHexNumDigits(items->size() - 1 + indexBaseCount); if (maxDigits == 0) maxDigits++; if (showIndex) xOffset += (maxDigits * font->getCharWidth() + 5); pp_int32 yOffset = 2; cp.x -= xOffset; cp.y -= yOffset; if (cp.y > visibleHeight - getItemHeight()) cp.y = visibleHeight - getItemHeight(); pp_int32 selectionIndex = (cp.y / getItemHeight()) + startIndex; if (selectionIndex < 0 || selectionIndex >= items->size()) selectionIndex = -1; if (showSelectionAlways && selectionIndex == -1) return SelectReturnCodeBreak; // selected line is different from current line so commit changes first // then select other line if (selectionIndex != this->selectionIndex) { commitChanges(); //this->selectionIndex = selectionIndex; if (selectionIndex < 0 || selectionIndex >= items->size()) selectionIndex = -1; if (selectionIndex != -1) { PPEvent e(ePreSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } this->selectionIndex = selectionIndex; if (selectionIndex != -1) { PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } columnSelectionStart = -1; if (centerSelection) assureCursorVisible(); } else if (columnSelectionStart > 0 && this->selectionIndex >= 0) { pp_int32 columnSelStart = cp.x / font->getCharWidth() + startPos; if (columnSelStart <= (signed)getItem(selectionIndex).length()) columnSelectionStart = columnSelStart; else columnSelectionStart = (signed)getItem(selectionIndex).length(); } parentScreen->paintControl(this); return SelectReturnCodeDefault; } pp_int32 PPListBox::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; //if (!visible) // return 0; switch (event->getID()) { case eTimer: { if (!isEditing()) break; timerTicker++; bool timerState = (timerTicker % BLINKINTERVAL) < (BLINKINTERVAL>>1); if (timerState != lastTimerState) { lastTimerState = timerState; parentScreen->paintControl(this); } break; } case eFocusGainedNoRepaint: { timerTicker = 0; hasFocus = true; break; } case eFocusGained: { timerTicker = 0; hasFocus = true; parentScreen->paintControl(this); break; } case eFocusLost: { commitChanges(); hasFocus = false; parentScreen->paintControl(this); break; } case eFocusLostNoRepaint: { commitChanges(); hasFocus = false; break; } case eMouseWheelMoved: { TMouseWheelEventParams* params = (TMouseWheelEventParams*)event->getDataPtr(); if (params->delta > 0 && vScrollbar) { PPEvent e(eBarScrollUp); handleEvent(reinterpret_cast(vScrollbar), &e); } else if (params->delta < 0 && vScrollbar) { PPEvent e(eBarScrollDown); handleEvent(reinterpret_cast(vScrollbar), &e); } event->cancel(); break; } case eRMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); rMouseDown = true; // Clicked on horizontal scrollbar -> route event to scrollbar and catch scrollbar control if (hScrollbar && hScrollbar->isVisible() && hScrollbar->hit(*p)) { if (controlCaughtByLMouseButton) break; caughtControl = hScrollbar; caughtControl->dispatchEvent(event); controlCaughtByRMouseButton = true; } // Clicked on vertical scrollbar -> route event to scrollbar and catch scrollbar control else if (vScrollbar && vScrollbar->isVisible() && vScrollbar->hit(*p)) { if (controlCaughtByLMouseButton) break; caughtControl = vScrollbar; caughtControl->dispatchEvent(event); controlCaughtByRMouseButton = true; } else if (rightButtonConfirm) { switch (select(p)) { case SelectReturnCodeBreak: return 0; case SelectReturnCodePlaceCursor: goto placeCursor; } } break; } // implement some FT2 list box functionality // in FT2 you could click on a row and drag down, the while dragging // the list box would let you select other single rows case eRMouseRepeat: case eRMouseDrag: if (!rMouseDown) break; goto dragorautoscroll; case eLMouseRepeat: case eLMouseDrag: { if (!lMouseDown) break; dragorautoscroll: if (caughtControl == NULL) { PPPoint* p = (PPPoint*)event->getDataPtr(); PPPoint cp = *p; // check if we hit the items area: // below area => scroll up if (p->y < getVisibleRect().y1) { PPEvent e(eBarScrollUp); handleEvent(reinterpret_cast(vScrollbar), &e); // and limit the hit point to the start of the area cp.y = getVisibleRect().y1; } // above area => scroll down else if (p->y > getVisibleRect().y2) { PPEvent e(eBarScrollDown); handleEvent(reinterpret_cast(vScrollbar), &e); // and limit the hit point to the end of the area cp.y = getVisibleRect().y2 - getItemHeight(); } // handle selection by click point switch (select(&cp)) { case SelectReturnCodeBreak: return 0; case SelectReturnCodePlaceCursor: goto placeCursor; } } else caughtControl->dispatchEvent(event); break; } case eLMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); lMouseDown = true; // Clicked on horizontal scrollbar -> route event to scrollbar and catch scrollbar control if (hScrollbar && hScrollbar->isVisible() && hScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; caughtControl = hScrollbar; caughtControl->dispatchEvent(event); controlCaughtByLMouseButton = true; } // Clicked on vertical scrollbar -> route event to scrollbar and catch scrollbar control else if (vScrollbar && vScrollbar->isVisible() && vScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; caughtControl = vScrollbar; caughtControl->dispatchEvent(event); controlCaughtByLMouseButton = true; } // Clicked on text -> select text else { switch (select(p)) { case SelectReturnCodeBreak: return 0; case SelectReturnCodePlaceCursor: goto placeCursor; } } break; } case eRMouseUp: controlCaughtByRMouseButton = false; if (caughtControl && !controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; break; } if (rMouseDown) rMouseDown = false; else break; case eLMouseDoubleClick: { placeCursor: timerTicker = 0; PPPoint cp = *((PPPoint*)event->getDataPtr()); cp.x-=location.x; cp.y-=location.y; pp_int32 xOffset = 2; pp_uint32 maxDigits = PPTools::getHexNumDigits(items->size() - 1 + indexBaseCount); if (maxDigits == 0) maxDigits++; if (showIndex) xOffset += (maxDigits * font->getCharWidth() + 5); pp_int32 yOffset = 2; cp.x-=xOffset; cp.y-=yOffset; bool b = (cp.x >= 0 && cp.y >= 0 && cp.x <= visibleWidth && cp.y <= visibleHeight); if (!editable && b) { pp_int32 selectionIndex = (cp.y / getItemHeight()) + startIndex; if (caughtControl == NULL && selectionIndex >= 0 && selectionIndex < items->size()) { PPEvent e(eConfirmed, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } break; } if (b) { pp_int32 selectionIndex = (cp.y / getItemHeight()) + startIndex; if (selectionIndex < 0 || selectionIndex >= items->size()) { if (!showSelectionAlways) this->selectionIndex = -1; } else if (this->selectionIndex != selectionIndex || columnSelectionStart < 0) { // selected line is different from current line so commit changes first // then select other line commitChanges(); if (selectionIndex != -1) { PPEvent e(ePreSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } this->selectionIndex = selectionIndex; if (selectionIndex != -1) { PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } pp_int32 columnSelStart = cp.x / font->getCharWidth() + startPos; if (columnSelStart <= (signed)getItem(selectionIndex).length()) columnSelectionStart = columnSelStart; else columnSelectionStart = (signed)getItem(selectionIndex).length(); if (editCopy) delete editCopy; editCopy = new PPString(getItem(selectionIndex)); } else if (this->selectionIndex == selectionIndex && columnSelectionStart >= 0) { pp_int32 columnSelStart = cp.x / font->getCharWidth() + startPos; if (columnSelStart <= (signed)getItem(selectionIndex).length()) columnSelectionStart = columnSelStart; else columnSelectionStart = (signed)getItem(selectionIndex).length(); } parentScreen->paintControl(this); } break; } case eLMouseUp: controlCaughtByLMouseButton = false; lMouseDown = false; if (caughtControl == NULL) break; if (!controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; break; } break; case eKeyChar: { if (caughtControl) break; if (!isEditing()) break; if (selectionIndex < 0 || selectionIndex >= items->size()/* || columnSelectionStart < 0*/) break; pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); if (selectionIndex >= 0 && columnSelectionStart > (signed)getItem(selectionIndex).length()) columnSelectionStart = (signed)getItem(selectionIndex).length(); assureCursorVisible(); switch (keyCode) { default: if ((maxEditSize > -1) && ((signed)items->get(selectionIndex)->length() >= maxEditSize)) break; if (columnSelectionStart < 0 || selectionIndex < 0) break; items->get(selectionIndex)->insertAt(columnSelectionStart,(char)keyCode); columnSelectionStart++; break; } if (selectionIndex >= 0 && columnSelectionStart > (signed)getItem(selectionIndex).length()) columnSelectionStart = (signed)getItem(selectionIndex).length(); assureCursorVisible(); adjustScrollbars(); adjustScrollbarPositions(); parentScreen->paintControl(this); break; } case eKeyDown: { if (caughtControl) break; if (selectionIndex < 0 || selectionIndex >= items->size()/* || columnSelectionStart < 0*/) break; pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); if (selectionIndex >= 0 && columnSelectionStart > (signed)getItem(selectionIndex).length()) columnSelectionStart = (signed)getItem(selectionIndex).length(); timerTicker = 0; switch (keyCode) { case VK_DELETE: if (columnSelectionStart < 0 || selectionIndex < 0) goto skiprefresh; assureCursorVisible(); items->get(selectionIndex)->deleteAt(columnSelectionStart, 1); break; case VK_BACK: if (columnSelectionStart < 0 || selectionIndex < 0) goto skiprefresh; if (columnSelectionStart) { assureCursorVisible(); columnSelectionStart--; items->get(selectionIndex)->deleteAt(columnSelectionStart, 1); } break; case VK_ESCAPE: if (!editable) goto skiprefresh; // discard changes assureCursorVisible(); discardChanges(); break; case VK_RETURN: if (!editable) goto skiprefresh; // commit changes assureCursorVisible(); commitChanges(); break; //case VK_ESCAPE: // selectionIndex = -1; // columnSelectionStart = 0; // break; case VK_LEFT: assureCursorVisible(); // Not editing, try to scroll left // might be handy on pocketpcs with very tight listboxes if (columnSelectionStart < 0) { PPEvent e(eBarScrollUp); handleEvent(reinterpret_cast(hScrollbar), &e); break; } if (columnSelectionStart) columnSelectionStart--; break; case VK_RIGHT: assureCursorVisible(); // Not editing, try to scroll right // might be handy on pocketpcs with very tight listboxes if (columnSelectionStart < 0) { PPEvent e(eBarScrollDown); handleEvent(reinterpret_cast(hScrollbar), &e); break; } if (columnSelectionStart < (signed)getItem(selectionIndex).length()) columnSelectionStart++; break; case VK_UP: assureCursorVisible(); if (columnSelectionStart >= 0) break; if (selectionIndex) { pp_int32 newSelectionIndex = selectionIndex-1; PPEvent ePre(ePreSelection, &newSelectionIndex, sizeof(newSelectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &ePre); selectionIndex = newSelectionIndex; PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } break; case VK_DOWN: assureCursorVisible(); if (columnSelectionStart >= 0) break; if (selectionIndex < items->size() - 1) { pp_int32 newSelectionIndex = selectionIndex+1; PPEvent ePre(ePreSelection, &newSelectionIndex, sizeof(newSelectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &ePre); selectionIndex = newSelectionIndex; PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } break; case VK_NEXT: { assureCursorVisible(); pp_int32 lastSelectionIndex = selectionIndex; pp_int32 newSelectionIndex = selectionIndex; pp_int32 visibleItems = getNumVisibleItems(); if (newSelectionIndex + visibleItems >= items->size() - 1) { newSelectionIndex = items->size() - 1; startIndex = newSelectionIndex - visibleItems; } else { newSelectionIndex+=visibleItems; if (newSelectionIndex > items->size() - 1) newSelectionIndex = items->size() - 1; if (newSelectionIndex != lastSelectionIndex) { startIndex = newSelectionIndex; if (startIndex + visibleItems > items->size()) { startIndex-=(startIndex + visibleItems)-(items->size()); if (startIndex < 0) startIndex = 0; newSelectionIndex = startIndex; } } } if (newSelectionIndex != lastSelectionIndex) { PPEvent ePre(ePreSelection, &newSelectionIndex, sizeof(newSelectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &ePre); this->selectionIndex = newSelectionIndex; PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } break; } case VK_PRIOR: { assureCursorVisible(); pp_int32 lastSelectionIndex = selectionIndex; pp_int32 newSelectionIndex = selectionIndex; pp_int32 visibleItems = getNumVisibleItems(); newSelectionIndex-=visibleItems; if (newSelectionIndex < 0) newSelectionIndex = 0; if (newSelectionIndex != lastSelectionIndex) { PPEvent ePre(ePreSelection, &newSelectionIndex, sizeof(newSelectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &ePre); this->selectionIndex = newSelectionIndex; PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } break; } default: goto skiprefresh; } if (selectionIndex >= 0 && columnSelectionStart > (signed)getItem(selectionIndex).length()) columnSelectionStart = (signed)getItem(selectionIndex).length(); assureCursorVisible(); adjustScrollbars(); adjustScrollbarPositions(); parentScreen->paintControl(this); skiprefresh: break; } //case eLMouseDrag: default: if (caughtControl == NULL) break; caughtControl->dispatchEvent(event); break; } return 0; } pp_int32 PPListBox::handleEvent(PPObject* sender, PPEvent* event) { pp_int32 lastSelectionIndex = selectionIndex; // Vertical scrollbar, scroll down if (sender == reinterpret_cast(vScrollbar) && vScrollbar && vScrollbar->isVisible() && event->getID() == eBarScrollDown) { if (selectOnScroll) { pp_int32 newSelectionIndex = selectionIndex; if (newSelectionIndex < items->size()-1) { newSelectionIndex++; } if (newSelectionIndex != lastSelectionIndex) { PPEvent ePre(ePreSelection, &newSelectionIndex, sizeof(newSelectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &ePre); this->selectionIndex = newSelectionIndex; PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } assureCursorVisible(); } else { pp_int32 visibleItems = getNumVisibleItems(); if (startIndex + visibleItems < items->size()) startIndex++; float v = (float)(items->size() - visibleItems); vScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); } } // Vertical scrollbar, scroll up else if (sender == reinterpret_cast(vScrollbar) && vScrollbar && vScrollbar->isVisible() && event->getID() == eBarScrollUp) { if (selectOnScroll) { pp_int32 newSelectionIndex = selectionIndex; if (newSelectionIndex > 0) { newSelectionIndex--; } if (newSelectionIndex != lastSelectionIndex) { PPEvent ePre(ePreSelection, &newSelectionIndex, sizeof(newSelectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &ePre); this->selectionIndex = newSelectionIndex; PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } assureCursorVisible(); } else { if (startIndex) startIndex--; pp_int32 visibleItems = getNumVisibleItems(); float v = (float)(items->size() - visibleItems); vScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); } } // Vertical scrollbar, position changed else if (sender == reinterpret_cast(vScrollbar) && vScrollbar && vScrollbar->isVisible() && event->getID() == eBarPosChanged) { float pos = vScrollbar->getBarPosition()/65536.0f; pp_int32 visibleItems = getNumVisibleItems(); float v = (float)(items->size() - visibleItems); startIndex = (pp_uint32)(v*pos); } // Horizontal scrollbar, scroll up (=left) else if (sender == reinterpret_cast(hScrollbar) && hScrollbar && hScrollbar->isVisible() && event->getID() == eBarScrollUp) { if (startPos) startPos--; pp_int32 visibleItems = (visibleWidth) / font->getCharWidth(); float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, scroll down (=right) else if (sender == reinterpret_cast(hScrollbar) && hScrollbar && hScrollbar->isVisible() && event->getID() == eBarScrollDown) { pp_int32 visibleItems = (visibleWidth) / font->getCharWidth(); if (startPos + visibleItems < (signed)getMaxWidth()) startPos++; float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, position changed else if (sender == reinterpret_cast(hScrollbar) && hScrollbar && hScrollbar->isVisible() && event->getID() == eBarPosChanged) { float pos = hScrollbar->getBarPosition()/65536.0f; pp_int32 visibleItems = (visibleWidth) / font->getCharWidth(); float v = (float)(getMaxWidth() - visibleItems); startPos = (pp_uint32)(v*pos); } parentScreen->paintControl(this); return 0; } void PPListBox::setSize(const PPSize& size) { PPControl::setSize(size); delete backgroundButton; if (vScrollbar) delete vScrollbar; if (hScrollbar) delete hScrollbar; initialize(); adjustScrollbars(); assureCursorVisible(); } void PPListBox::setLocation(const PPPoint& p) { PPControl::setLocation(p); delete backgroundButton; if (vScrollbar) delete vScrollbar; if (hScrollbar) delete hScrollbar; initialize(); adjustScrollbars(); assureCursorVisible(); } void PPListBox::addItem(const PPString& item) { items->add(new PPString(item)); adjustScrollbars(); } const PPString& PPListBox::getItem(pp_int32 index) const { return *items->get(index); } void PPListBox::updateItem(pp_int32 index, const PPString& item) { items->replace(index, new PPString(item)); } void PPListBox::clear() { items->clear(); startIndex = 0; startPos = 0; selectionIndex = showSelectionAlways ? 0 : -1; columnSelectionStart = -1; adjustScrollbars(); if (vScrollbar) vScrollbar->setBarPosition(0); if (hScrollbar) hScrollbar->setBarPosition(0); } void PPListBox::setSelectedIndex(pp_int32 index, bool adjustStartIndex/* = true*/, bool assureCursor/* = true*/) { selectionIndex = index < items->size() ? index : items->size()-1; if (adjustStartIndex) startIndex = selectionIndex; if (assureCursor) assureCursorVisible(); } void PPListBox::setSelectedIndexByItem(const PPString& item, bool adjustStartIndex/* = true*/) { for (pp_int32 i = 0; i < items->size(); i++) { if (items->get(i)->compareTo(item) == 0) { setSelectedIndex(i, adjustStartIndex); break; } } } void PPListBox::placeCursorAtEnd() { if (selectionIndex >= 0 && selectionIndex < items->size()) columnSelectionStart = getItem(selectionIndex).length(); else if (items->size()) { selectionIndex = 0; columnSelectionStart = getItem(0).length(); if (editCopy) delete editCopy; editCopy = new PPString(getItem(selectionIndex)); } } void PPListBox::placeCursorAtStart() { if (items->size()) { selectionIndex = 0; columnSelectionStart = 0; if (editCopy) delete editCopy; editCopy = new PPString(getItem(selectionIndex)); } } void PPListBox::setShowIndex(bool showIndex) { this->showIndex = showIndex; calcVisible(); } void PPListBox::calcVisible() { // calculate visible area if (hScrollbar->isVisible()) visibleHeight = size.height - (scrollable?SCROLLBARWIDTH:0); else visibleHeight = size.height; if (vScrollbar->isVisible()) visibleWidth = size.width - (scrollable?SCROLLBARWIDTH:0); else visibleWidth = size.width; if (border) { if (!hScrollbar->isVisible()) visibleHeight--; if (!vScrollbar->isVisible()) visibleWidth--; } if (showIndex) { pp_uint32 maxDigits = PPTools::getHexNumDigits(items->size() - 1 + indexBaseCount); if (maxDigits == 0) maxDigits++; visibleWidth -= (maxDigits * font->getCharWidth() + 5); } } void PPListBox::adjustScrollbarPositions() { // adjust scrollbar positions if (vScrollbar) { pp_int32 visibleItems = getNumVisibleItems(); float v = (float)(items->size() - visibleItems); vScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); } if (hScrollbar) { pp_int32 visibleItems = (visibleWidth) / font->getCharWidth(); float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } } void PPListBox::adjustScrollbars() { if (!scrollable) { calcVisible(); return; } vScrollbar->show(!autoHideVScroll); hScrollbar->show(!autoHideHScroll); calcVisible(); if (items->size() == 0/* || getMaxWidth()*font->getCharWidth() == 0*/) { return; } const pp_int32 maxWidth = font->getCharWidth() * getMaxWidth(); // number of items fit into the current visible area (y direction) if (items->size() <= getNumVisibleItems()) { // if they exceed the current visible area in x direction // we need to activate the horizontal scroll bar if (maxWidth > getVisibleRect().width()) { hScrollbar->show(true); calcVisible(); // now if they no longer fit the visible area in y direction // we also need to activate the vertical scroll bar if (items->size() > getNumVisibleItems()) { vScrollbar->show(true); calcVisible(); } } } else { // they don't fit, we need the vertical scroll bar for sure vScrollbar->show(true); calcVisible(); // if the maximum x width exceeds the number of characters visible // we will also need to activate the horizontal scroll bar if (maxWidth > getVisibleRect().width()) { hScrollbar->show(true); calcVisible(); } } // adjust size of vertical scroll bar if (vScrollbar->isVisible()) { pp_int32 height = size.height; vScrollbar->setSize(height); } if (hScrollbar->isVisible()) { pp_int32 width = size.width - (vScrollbar->isVisible() ? SCROLLBARWIDTH : 0); hScrollbar->setSize(width); } float s = 1.0f; if (vScrollbar) { s = (float)(visibleHeight) / (float)(items->size()*(getItemHeight())); vScrollbar->setBarSize((pp_int32)(s*65536.0f), false); } if (hScrollbar) { s = (float)(visibleWidth) / (float)(getMaxWidth()*(font->getCharWidth())); hScrollbar->setBarSize((pp_int32)(s*65536.0f), false); } } void PPListBox::assureCursorVisible() { if (selectionIndex >= 0) { pp_int32 visiblePixels = (visibleHeight - getItemHeight()) - 1; pp_int32 visibleItems = visiblePixels / getItemHeight(); if (!centerSelection) { if ((startIndex <= selectionIndex) && ((selectionIndex - startIndex) * getItemHeight()) < visiblePixels) { } else if (selectionIndex > startIndex && selectionIndex + visibleItems < items->size()) { //startIndex = cursorPositionRow; startIndex+=(selectionIndex-(startIndex+visibleItems)); } else if (selectionIndex < startIndex && selectionIndex + visibleItems < items->size()) { //startIndex = cursorPositionRow; startIndex+=(selectionIndex-startIndex); } else { startIndex = selectionIndex - visibleItems; if (startIndex < 0) startIndex = 0; } } else { pp_int32 mid = (visibleHeight/2) / getItemHeight(); startIndex = selectionIndex - mid; if (startIndex < 0) startIndex = 0; } } if (columnSelectionStart >= 0) { pp_int32 visibleChars = (visibleWidth - font->getCharWidth()) / font->getCharWidth(); if ((startPos < columnSelectionStart) && ((columnSelectionStart - startPos) * font->getCharWidth()) < (visibleWidth - font->getCharWidth())) { } else if (columnSelectionStart + (signed)visibleChars < (signed)getMaxWidth()) startPos = columnSelectionStart; else { startPos = columnSelectionStart - visibleChars; if (startPos < 0) startPos = 0; } } adjustScrollbarPositions(); } void PPListBox::commitChanges() { if (selectionIndex < 0) return; if (selectionIndex >= items->size()) return; if (isEditing()) { PPString* str = items->get(selectionIndex); if (editCopy && str->compareTo(*editCopy) != 0) { PPEvent e(eValueChanged, &str, sizeof(PPString*)); eventListener->handleEvent(reinterpret_cast(this), &e); } if (!showSelectionAlways) selectionIndex = -1; columnSelectionStart = -1; if (editCopy) { delete editCopy; editCopy = NULL; } } } void PPListBox::discardChanges() { columnSelectionStart = -1; if (editCopy) { items->get(selectionIndex)->replace(*editCopy); delete editCopy; editCopy = NULL; } } // hack void PPListBox::saveState() { lastStartIndex = startIndex; lastStartPos = startPos; lastSelectionIndex = selectionIndex; hadVScrollbar = (vScrollbar != NULL && vScrollbar->isVisible()); hadHScrollbar = (hScrollbar != NULL && hScrollbar->isVisible()); } void PPListBox::restoreState(bool assureCursor/* = true*/) { if (lastStartIndex < items->size()) startIndex = lastStartIndex; if (startPos < (signed)getMaxWidth()) startPos = lastStartPos; if (lastSelectionIndex < items->size()) selectionIndex = lastSelectionIndex; else selectionIndex = items->size()-1; if (selectionIndex < 0 && showSelectionAlways && items->size()) selectionIndex = 0; // adjust scrollbar positions if (vScrollbar) { pp_int32 visibleItems = getNumVisibleItems(); float v = (float)(items->size() - visibleItems); vScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); // if scrollbar isn't visible, reset vertical position to start if (!vScrollbar->isVisible()) startIndex = 0; } else if (hadVScrollbar) { // if scrollbar isn't visible, reset vertical position to start startIndex = 0; } if (hScrollbar) { pp_int32 visibleItems = (visibleWidth) / font->getCharWidth(); float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); // if scrollbar isn't visible, reset horizontal position to start if (!hScrollbar->isVisible()) startPos = 0; } else if (hadHScrollbar) { // if scrollbar isn't visible, reset horizontal position to start startPos = 0; } if (assureCursor) assureCursorVisible(); } PPRect PPListBox::getVisibleRect() const { PPRect rect; rect.x1 = rect.x2 = location.x; rect.y1 = rect.y2 = location.y; rect.x2+=visibleWidth; rect.y2+=visibleHeight; return rect; } pp_int32 PPListBox::getItemHeight() const { return font->getCharHeight(); } pp_int32 PPListBox::getNumVisibleItems() const { return visibleHeight / getItemHeight(); //return (visibleHeight - (hScrollbar->isVisible() ? 4 : 0)) / getItemHeight(); } pp_uint32 PPListBox::getMaxWidth() const { pp_uint32 maxWidth = 0; for (pp_int32 i = 0; i < items->size(); i++) { pp_uint32 len = items->get(i)->length(); if (len > maxWidth) maxWidth = len; } return maxWidth+(editable ? 1 : 0); } milkytracker-0.90.85+dfsg/src/ppui/MessageBoxContainer.h0000644000175000017500000000362411150223367022245 0ustar admin2admin2/* * ppui/MessageBoxContainer.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPContainer control that looks like a Message box // (can contain other controls) // ///////////////////////////////////////////////////////////////// #ifndef MESSAGEBOXCONTAINER__H #define MESSAGEBOXCONTAINER__H #include "BasicTypes.h" #include "Container.h" class PPButton; class PPMessageBoxContainer : public PPContainer { private: PPString caption; pp_int32 captionSize; PPPoint buttonLocation; PPSize buttonSize; PPButton* button; bool captured; PPPoint lastCapturePoint; public: PPMessageBoxContainer(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, const PPString& caption); virtual ~PPMessageBoxContainer(); virtual void paint(PPGraphicsAbstract* graphics); virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); virtual pp_int32 dispatchEvent(PPEvent* event); void setCaption(const PPString& caption) { this->caption = caption; } private: bool isPointInCaption(const PPPoint& point); bool handleMove(PPPoint point); }; #endif milkytracker-0.90.85+dfsg/src/ppui/DialogBase.cpp0000755000175000017500000003122611150223367020674 0ustar admin2admin2/* * ppui/DialogBase.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogBase.cpp * MilkyTracker * * Created by Peter Barth on 06.10.05. * */ #include "DialogBase.h" #include "Screen.h" #include "StaticText.h" #include "MessageBoxContainer.h" #include "Font.h" #include "SimpleVector.h" // parse string and create a string vector with substrings // all fitting into width when drawn with font f static void wrapString(PPSimpleVector& stringParts, PPFont& f, const PPString& str, pp_int32 width) { if (f.getStrWidth(str) <= (unsigned)width) { stringParts.add(new PPString(str)); return; } PPString strCopy = str; stringParts.clear(); while (strCopy.length() > 0) { pp_int32 i = 0; pp_int32 j = -1; do { if (i < (signed)strCopy.length() && strCopy.charAt(i) == ' ') j = i; i++; } while (i <= (signed)strCopy.length() && (signed)f.getStrWidth(strCopy.subString(0,i)) <= width); i--; if (i != (signed)strCopy.length() && j >= 0) i = j+1; stringParts.add(new PPString(strCopy.subString(0,i))); strCopy = strCopy.subString(i,strCopy.length()); } } void PPDialogBase::initCommon(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, pp_int32 width, pp_int32 height, pp_int32& x, pp_int32& y) { respondListener = responder; parentScreen = screen; messageBoxContainerGeneric = NULL; /*#ifdef __LOWRES__ height+=15; #endif*/ x = screen->getWidth() / 2 - width/2; y = screen->getHeight() / 2 - height/2; messageBoxContainerGeneric = new PPMessageBoxContainer(id, screen, this, PPPoint(x, y), PPSize(width,height), "System request"); messageBoxContainerGeneric->show(false); pp_int32 x2 = x + width / 2 - (PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(caption) / 2); pp_int32 y2 = y + 28; messageBoxContainerGeneric->addControl(new PPStaticText(MESSAGEBOX_STATICTEXT_MAIN_CAPTION, screen, this, PPPoint(x2, y2), caption, true)); } void PPDialogBase::initDialog(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, const PPString& message, pp_int32 captionOffset, const PPString& buttonYesCaption) { respondListener = responder; parentScreen = screen; messageBoxContainerGeneric = NULL; pp_uint32 width = 290; PPFont* font = PPFont::getFont(PPFont::FONT_SYSTEM); PPSimpleVector stringList; wrapString(stringList, *font, message, width - (font->getCharWidth()*2 + 4)); pp_uint32 height = 62 + stringList.size()*12; /*#ifdef __LOWRES__ height+=15; #endif*/ pp_int32 x = screen->getWidth() / 2 - width/2; pp_int32 y = screen->getHeight() / 2 - height/2; messageBoxContainerGeneric = new PPMessageBoxContainer(id, screen, this, PPPoint(x, y), PPSize(width,height), caption); messageBoxContainerGeneric->show(false); pp_int32 y2 = y + 28; for (pp_int32 i = 0; i < stringList.size(); i++) { pp_int32 x2 = x + width / 2 - (font->getStrWidth(*stringList.get(i)) / 2); messageBoxContainerGeneric->addControl(new PPStaticText(MESSAGEBOX_STATICTEXT_MAIN_CAPTION+i, screen, this, PPPoint(x2, y2), *stringList.get(i), true)); y2+=12; } /*#ifdef __LOWRES__ pp_int32 y3 = y + height - (26 + 15); #else pp_int32 y3 = y + height - 26; #endif*/ pp_int32 y3 = y + height - captionOffset; PPButton* button; button = new PPButton(PP_MESSAGEBOX_BUTTON_YES, screen, this, PPPoint(x+width/2 - 30, y3), PPSize(60, 11)); button->setText(buttonYesCaption); messageBoxContainerGeneric->addControl(button); } void PPDialogBase::initDialog(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, pp_int32 width, pp_int32 height, pp_int32 captionOffset, const PPString& buttonYesCaption) { pp_int32 x,y; initCommon(screen, responder, id, caption, width, height, x, y); /*#ifdef __LOWRES__ pp_int32 y3 = y + height - (26 + 15); #else pp_int32 y3 = y + height - 26; #endif*/ pp_int32 y3 = y + height - captionOffset; PPButton* button; button = new PPButton(PP_MESSAGEBOX_BUTTON_YES, screen, this, PPPoint(x+width/2-30, y3), PPSize(60, 11)); button->setText(buttonYesCaption); messageBoxContainerGeneric->addControl(button); } void PPDialogBase::initDialog(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, pp_int32 width, pp_int32 height, pp_int32 captionOffset, const PPString& buttonYesCaption, const PPString& buttonCancelCaption) { pp_int32 x,y; initCommon(screen, responder, id, caption, width, height, x, y); /*#ifdef __LOWRES__ pp_int32 y3 = y + height - (26 + 15); #else pp_int32 y3 = y + height - 26; #endif*/ pp_int32 y3 = y + height - captionOffset; PPButton* button; button = new PPButton(PP_MESSAGEBOX_BUTTON_YES, screen, this, PPPoint(x+width/2-65, y3), PPSize(60, 11)); button->setText(buttonYesCaption); messageBoxContainerGeneric->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_CANCEL, screen, this, PPPoint(x+width/2+5, y3), PPSize(60, 11)); button->setText(buttonCancelCaption); messageBoxContainerGeneric->addControl(button); } void PPDialogBase::initDialog(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, pp_int32 width, pp_int32 height, pp_int32 captionOffset, const PPString& buttonYesCaption, const PPString& buttonNoCaption, const PPString& buttonCancelCaption) { pp_int32 x,y; initCommon(screen, responder, id, caption, width, height, x, y); /*#ifdef __LOWRES__ pp_int32 y3 = y + height - (26 + 15); #else pp_int32 y3 = y + height - 26; #endif*/ pp_int32 y3 = y + height - captionOffset; PPButton* button; button = new PPButton(PP_MESSAGEBOX_BUTTON_YES, screen, this, PPPoint(x+width/2-100, y3), PPSize(60, 11)); button->setText(buttonYesCaption); messageBoxContainerGeneric->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_NO, screen, this, PPPoint(x+width/2-30, y3), PPSize(60, 11)); button->setText(buttonNoCaption); messageBoxContainerGeneric->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_CANCEL, screen, this, PPPoint(x+width/2+40, y3), PPSize(60, 11)); button->setText(buttonCancelCaption); messageBoxContainerGeneric->addControl(button); } PPDialogBase::PPDialogBase(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, MessageBoxTypes type/* = MessageBox_OKCANCEL*/) : keyDownInvokeKeyCode(-1) { switch (type) { case MessageBox_OK: initDialog(screen, responder, id, "System Request", caption, 26, "Okay"); break; case MessageBox_OKCANCEL: initDialog(screen, responder, id, caption, 290, 74, 26, "Yes", "No"); break; case MessageBox_YESNOCANCEL: initDialog(screen, responder, id, caption, 290, 74, 26, "Yes", "No", "Cancel"); break; } } PPDialogBase::PPDialogBase(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, const PPString& message) : keyDownInvokeKeyCode(-1) { initDialog(screen, responder, id, caption, message, 26, "Okay"); } PPDialogBase::~PPDialogBase() { delete messageBoxContainerGeneric; } void PPDialogBase::show(bool b/* = true*/) { if (b) parentScreen->setModalControl(messageBoxContainerGeneric); else parentScreen->setModalControl(NULL); } void PPDialogBase::sendKey(EEventDescriptor event, pp_uint16 vk, pp_uint16 sc, pp_uint16 chr) { if (event == eKeyDown || event == eKeyUp) { pp_uint16 vksc[3] = {vk, sc, chr}; PPEvent keyDown(event, &vksc, sizeof(vksc)); PPControl* ctrl = messageBoxContainerGeneric->getFocusedControl(); if (ctrl && ctrl->isListBox()) ctrl->dispatchEvent(&keyDown); } else if (event == eKeyChar) { pp_uint16 vksc[2] = {vk, sc}; PPEvent keyDown(event, &vksc, sizeof(vksc)); PPControl* ctrl = messageBoxContainerGeneric->getFocusedControl(); if (ctrl && ctrl->isListBox()) ctrl->dispatchEvent(&keyDown); } } #define CALLHANDLER(HANDLERFUNC) \ if (event->getID() != eCommand) \ break; \ if (respondListener && respondListener->HANDLERFUNC(reinterpret_cast(this)) == 0) \ show(false); \ else if (respondListener == NULL) \ show(false); pp_int32 PPDialogBase::handleEvent(PPObject* sender, PPEvent* event) { #ifdef __LOWRES__ static const pp_uint16 scanCodesNumbers[] = {SC_1, SC_2, SC_3, SC_4, SC_5, SC_6, SC_7, SC_8, SC_9, SC_0, SC_PLUS, SC_MINUS, SC_PERIOD, 0, 0, 0, 0}; static const pp_uint16 asciiCodesNumbers[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '+', '-', '.', VK_LEFT, VK_RIGHT, VK_DELETE, VK_BACK}; #endif if (event->getID() == eKeyDown && keyDownInvokeKeyCode > 0 && *(((pp_int16*)event->getDataPtr())) == keyDownInvokeKeyCode) { event->cancel(); return 0; } else if (event->getID() == eKeyChar && keyDownInvokeKeyCode > 0) { event->cancel(); } else if (event->getID() == eKeyUp && keyDownInvokeKeyCode > 0 && *(((pp_int16*)event->getDataPtr())) == keyDownInvokeKeyCode) { keyDownInvokeKeyCode = -1; event->cancel(); } if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case PP_MESSAGEBOX_BUTTON_YES: { CALLHANDLER(ActionOkay); break; } case PP_MESSAGEBOX_BUTTON_CANCEL: { CALLHANDLER(ActionCancel); break; } case PP_MESSAGEBOX_BUTTON_NO: { CALLHANDLER(ActionNo); break; } case PP_MESSAGEBOX_BUTTON_USER1: { CALLHANDLER(ActionUser1); break; } case PP_MESSAGEBOX_BUTTON_USER2: { CALLHANDLER(ActionUser2); break; } case PP_MESSAGEBOX_BUTTON_USER3: { CALLHANDLER(ActionUser3); break; } case PP_MESSAGEBOX_BUTTON_USER4: { CALLHANDLER(ActionUser4); break; } // Input keys #ifdef __LOWRES__ case MESSAGEBOX_BUTTON_KEYS_BASE: // 1 case MESSAGEBOX_BUTTON_KEYS_BASE+1: // 2 case MESSAGEBOX_BUTTON_KEYS_BASE+2: // 3 case MESSAGEBOX_BUTTON_KEYS_BASE+3: // 4 case MESSAGEBOX_BUTTON_KEYS_BASE+4: // 5 case MESSAGEBOX_BUTTON_KEYS_BASE+5: // 6 case MESSAGEBOX_BUTTON_KEYS_BASE+6: // 7 case MESSAGEBOX_BUTTON_KEYS_BASE+7: // 8 case MESSAGEBOX_BUTTON_KEYS_BASE+8: // 9 case MESSAGEBOX_BUTTON_KEYS_BASE+9: // 0 case MESSAGEBOX_BUTTON_KEYS_BASE+10: // + case MESSAGEBOX_BUTTON_KEYS_BASE+11: // - case MESSAGEBOX_BUTTON_KEYS_BASE+12: // . { pp_int32 i = (reinterpret_cast(sender)->getID() - MESSAGEBOX_BUTTON_KEYS_BASE); pp_uint16 key[3]; key[0] = key[2] = (pp_uint16)asciiCodesNumbers[i]; key[1] = scanCodesNumbers[i]; sendKey(eKeyDown, key[0], key[1], key[2]); sendKey(eKeyChar, key[0], key[1], 0); sendKey(eKeyUp, key[0], key[1], key[2]); break; } case MESSAGEBOX_BUTTON_KEYS_BASE+13: // LEFT case MESSAGEBOX_BUTTON_KEYS_BASE+14: // RIGHT case MESSAGEBOX_BUTTON_KEYS_BASE+15: // DEL case MESSAGEBOX_BUTTON_KEYS_BASE+16: // BACK { pp_int32 i = (reinterpret_cast(sender)->getID() - MESSAGEBOX_BUTTON_KEYS_BASE); pp_uint16 key[2]; key[0] = (pp_uint16)asciiCodesNumbers[i]; key[1] = scanCodesNumbers[i]; key[2] = 0; sendKey(eKeyDown, key[0], key[1], key[2]); sendKey(eKeyUp, key[0], key[1], key[2]); break; } #endif } } return 0; } void PPDialogBase::setUserButtonText(pp_int32 index, const PPString& caption) { PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_USER1+index)); if (button) button->setText(caption); } pp_int32 PPDialogBase::getID() const { if (messageBoxContainerGeneric) return messageBoxContainerGeneric->getID(); return 0; } void PPDialogBase::setMessageBoxContainer(PPMessageBoxContainer* container) { delete messageBoxContainerGeneric; messageBoxContainerGeneric = container; } milkytracker-0.90.85+dfsg/src/ppui/DictionaryKey.h0000644000175000017500000000274511150223367021126 0ustar admin2admin2/* * ppui/DictionaryKey.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DictionaryKey.h * MilkyTracker * * Created by Peter Barth on Mon Mar 14 2005. * */ #ifndef DICTIONARYKEY__H #define DICTIONARYKEY__H #include "BasicTypes.h" class PPDictionaryKey { private: PPString key; PPString value; public: PPDictionaryKey(const PPString& newKey, const PPString& newValue); PPDictionaryKey(const PPString& newKey, const pp_uint32 value); // copy c'tor PPDictionaryKey(const PPDictionaryKey& source); void store(const PPString& newValue); void store(const pp_uint32 value); const PPString& getStringValue() const { return value; } pp_uint32 getIntValue() const; bool getBoolValue() const { return getIntValue() != 0; } const PPString& getKey() const { return key; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/StaticText.cpp0000644000175000017500000001103711150223367020771 0ustar admin2admin2/* * ppui/StaticText.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "StaticText.h" #include "Event.h" #include "GraphicsAbstract.h" #include "Font.h" #include "Tools.h" #include "PPUIConfig.h" PPStaticText::PPStaticText(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPString& text, bool drawShadow /*= false*/, bool drawUnderlined /*= false*/, bool autoShrink /*= false*/) : PPControl(id, parentScreen, eventListener, location, PPSize(0,0)), color(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)), drawShadow(drawShadow), underlined(drawUnderlined), autoShrink(autoShrink), shadowColor(0,0,0), text(text), extent(-1, -1) { font = PPFont::getFont(PPFont::FONT_SYSTEM); calcExtent(); } PPStaticText::~PPStaticText() { } void PPStaticText::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; g->setFont(font); if (extent.width != -1 && extent.height != -1) g->setRect(location.x, location.y, location.x + extent.width, location.y + extent.height+1); else g->setRect(location.x, location.y, location.x + size.width, location.y + size.height+1); const char* text = this->text; char* temp = NULL; if (autoShrink && (signed)font->getStrWidth(text) > extent.width) { pp_uint32 numchars = extent.width / font->getCharWidth(); temp = new char[numchars+1]; pp_uint32 i; for (i = 0; i < (numchars / 2); i++) temp[i] = text[i]; temp[i] = '\xef'; pp_uint32 j = i+1; for (i = strlen(text)-(numchars / 2); i < strlen(text); i++, j++) temp[j] = text[i]; temp[j] = '\0'; text = temp; } if (drawShadow) { if (enabled) g->setColor(shadowColor); else { PPColor col(shadowColor); col.r+=color->r; col.g+=color->g; col.b+=color->b; col.scaleFixed(8192); g->setColor(col); } g->drawString(text, location.x+1, location.y+1, underlined); } if (enabled) g->setColor(*color); else { PPColor col(*color); col.scaleFixed(40000); g->setColor(col); } g->drawString(text, location.x, location.y, underlined); if (temp) delete[] temp; } pp_int32 PPStaticText::dispatchEvent(PPEvent* event) { if (!eventListener) return -1; switch (event->getID()) { case eLMouseDown: if (hit(*reinterpret_cast(event->getDataPtr()))) { PPEvent e(eCommand); return eventListener->handleEvent(reinterpret_cast(this), &e); } return 0; } return -1; } void PPStaticText::setText(const PPString& text) { this->text = text; calcExtent(); } void PPStaticText::setIntValue(pp_int32 value, pp_uint32 numDecDigits/* = 0*/, bool negative/*= false*/) { /*char text[15]; _itoa(value, text, 10); setText(text);*/ if (numDecDigits == 0) { if (negative) { numDecDigits = PPTools::getDecNumDigits(abs(value)); numDecDigits++; } else { numDecDigits = PPTools::getDecNumDigits(value); } } // enough memory to hold 32bit Dec value char Dec[15]; if (negative) { PPTools::convertToDec(Dec+1, abs(value), numDecDigits-1); if (value < 0) Dec[0] = '-'; else Dec[0] = '+'; } else { PPTools::convertToDec(Dec, value, numDecDigits); } setText(Dec); } void PPStaticText::setValue(pp_int32 value, bool hex, pp_uint32 numDigits/* = 0*/, bool negative/* = false*/) { if (hex) setHexValue(value, numDigits); else setIntValue(value, numDigits, negative); } void PPStaticText::setHexValue(pp_int32 value, pp_uint32 numHexDigits/*= 0*/) { if (numHexDigits == 0) numHexDigits = PPTools::getHexNumDigits(value); // enough memory to hold 32bit hex value char hex[10]; PPTools::convertToHex(hex, value, numHexDigits); setText(hex); } void PPStaticText::calcExtent() { size.height = font->getCharHeight()*text.countLines() + (drawShadow?1:0); size.width = font->getStrWidth(text) + (drawShadow?1:0); } milkytracker-0.90.85+dfsg/src/ppui/TransparentContainer.h0000644000175000017500000000261411150223367022507 0ustar admin2admin2/* * ppui/TransparentContainer.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPContainer control that can be used to group controls // ///////////////////////////////////////////////////////////////// #ifndef TRANSPARENTCONTAINER__H #define TRANSPARENTCONTAINER__H #include "BasicTypes.h" #include "Container.h" class PPButton; class PPTransparentContainer : public PPContainer { public: PPTransparentContainer(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size); virtual ~PPTransparentContainer(); virtual void paint(PPGraphicsAbstract* graphics); }; #endif milkytracker-0.90.85+dfsg/src/ppui/Seperator.h0000644000175000017500000000245311150223367020310 0ustar admin2admin2/* * ppui/Seperator.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Seperator.h * MilkyTracker * * Created by Peter Barth on 16.03.05. * */ #ifndef SEPERATOR__H #define SEPERATOR__H #include "BasicTypes.h" #include "Control.h" class PPSeperator : public PPControl { private: bool horizontal; const PPColor* color; public: PPSeperator(pp_int32 id, PPScreen* parentScreen, const PPPoint& location, pp_uint32 size, const PPColor& theColor, bool horizontal = true); void setColor(const PPColor& color) { this->color = &color; } virtual void paint(PPGraphicsAbstract* graphics); }; #endif milkytracker-0.90.85+dfsg/src/ppui/win32/0000755000175000017500000000000011317506144017133 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/win32/DisplayDevice_WIN32.h0000644000175000017500000000433711150223367022720 0ustar admin2admin2/* * ppui/win32/DisplayDevice_WIN32.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Our display device // ///////////////////////////////////////////////////////////////// #ifndef DISPLAYDEVICE__H #define DISPLAYDEVICE__H #include "BasicTypes.h" #include "DisplayDeviceBase.h" #include // Forwards class PPGraphicsAbstract; class PPDisplayDevice : public PPDisplayDeviceBase { private: BITMAPINFOHEADER m_BitmapInfo; HBITMAP m_hBitmap; LPBYTE m_pBits; HWND m_hWnd; RECT m_lastRect; LONG m_lastWindowStyle, m_lastWindowExStyle; HDC m_hDC; bool m_waitWindowVisible; HANDLE m_hThread; DWORD m_threadID; void blit(HWND hWnd, HDC pDC, pp_int32 x, pp_int32 y, pp_int32 width, pp_int32 height); public: PPDisplayDevice(HWND hWnd, pp_int32 width, pp_int32 height, pp_int32 scaleFactor = 1); virtual ~PPDisplayDevice(); virtual PPGraphicsAbstract* open(); virtual void close(); void update(); void update(const PPRect& r); void adjustWindowSize(); virtual void setSize(const PPSize& size); virtual bool supportsScaling() const { return true; } // ----------------------------- ex. PPWindow ---------------------------- public: virtual void setTitle(const PPSystemString& title); virtual bool goFullScreen(bool b); virtual void shutDown(); virtual void signalWaitState(bool b, const PPColor& color); virtual void setMouseCursor(MouseCursorTypes type); static DWORD WINAPI UpdateWindowThreadProc(LPVOID lpParameter); }; #endif milkytracker-0.90.85+dfsg/src/ppui/win32/DisplayDevice_WIN32.cpp0000644000175000017500000001723111150223367023250 0ustar admin2admin2/* * ppui/win32/DisplayDevice_WIN32.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "DisplayDevice_WIN32.h" #include "Graphics.h" #include "WaitWindow_WIN32.h" #include "PPSystem.h" PPDisplayDevice::PPDisplayDevice(HWND hWnd, pp_int32 width, pp_int32 height, pp_int32 scaleFactor/* = 1*/) : PPDisplayDeviceBase(width, height, scaleFactor), m_waitWindowVisible(false), m_hThread(NULL), m_threadID(0) { m_BitmapInfo.biSize = sizeof(BITMAPINFOHEADER); m_BitmapInfo.biWidth = getSize().width; m_BitmapInfo.biHeight = -getSize().height; m_BitmapInfo.biPlanes = 1; m_BitmapInfo.biBitCount = 24; m_BitmapInfo.biCompression = BI_RGB; m_BitmapInfo.biSizeImage = 0; m_BitmapInfo.biXPelsPerMeter = 0; m_BitmapInfo.biYPelsPerMeter = 0; m_BitmapInfo.biClrUsed = 0; m_BitmapInfo.biClrImportant = 0; HDC hScreenDC = ::GetWindowDC(NULL); m_hBitmap = ::CreateDIBSection(hScreenDC, (LPBITMAPINFO)&m_BitmapInfo, DIB_RGB_COLORS, (LPVOID *)&m_pBits, NULL, 0); ::ReleaseDC(NULL,hScreenDC); m_hWnd = hWnd; m_hDC = NULL; // initialise graphics instance currentGraphics = new PPGraphics_BGR24(getSize().width, getSize().height, (getSize().width * 24) / 8, m_pBits); currentGraphics->lock = true; } PPDisplayDevice::~PPDisplayDevice() { delete currentGraphics; } PPGraphicsAbstract* PPDisplayDevice::open() { if (!isEnabled()) return NULL; currentGraphics->lock = false; return currentGraphics; } void PPDisplayDevice::blit(HWND hWnd, HDC pDC, pp_int32 x, pp_int32 y, pp_int32 width, pp_int32 height) { RECT r; GetClientRect(hWnd,&r); HDC hBitmapDC = ::CreateCompatibleDC(NULL); HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hBitmapDC, m_hBitmap); if (scaleFactor == 1) ::BitBlt(pDC, x, y, width, height, hBitmapDC, x, y, SRCCOPY); else ::StretchBlt(pDC, x*scaleFactor, y*scaleFactor, width*scaleFactor, height*scaleFactor, hBitmapDC, x, y, width, height, SRCCOPY); ::SelectObject(hBitmapDC, hOldBitmap); ::DeleteDC(hBitmapDC); } void PPDisplayDevice::close() { currentGraphics->lock = true; } void PPDisplayDevice::update() { if (m_hDC != NULL) return; if (!isUpdateAllowed() || !isEnabled()) return; m_hDC = ::GetDC(m_hWnd); blit(m_hWnd, m_hDC, 0, 0, getSize().width, getSize().height); ::ReleaseDC(m_hWnd, m_hDC); m_hDC = NULL; } void PPDisplayDevice::update(const PPRect& r) { if (m_hDC != NULL) return; if (!isUpdateAllowed() || !isEnabled()) return; m_hDC = ::GetDC(m_hWnd); blit(m_hWnd, m_hDC, r.x1, r.y1, r.width(), r.height()); ::ReleaseDC(m_hWnd, m_hDC); m_hDC = NULL; } extern HCURSOR g_cursorStandard; extern HCURSOR g_cursorResizeWE; extern HCURSOR g_cursorHand; void PPDisplayDevice::setTitle(const PPSystemString& title) { ::SetWindowText(m_hWnd, title); } void PPDisplayDevice::setSize(const PPSize& size) { // Important note: Save this size before the window // is actually resized using SetWindowPos (below) this->size = size; RECT rc; pp_int32 modexs = size.width * scaleFactor +::GetSystemMetrics(SM_CXEDGE) * 2 + 2; pp_int32 modeys = size.height * scaleFactor + ::GetSystemMetrics(SM_CYCAPTION) + 2 + ::GetSystemMetrics(SM_CYEDGE) * 2; ::GetWindowRect(m_hWnd, &rc); ::SetWindowPos(m_hWnd, NULL, rc.left, rc.top, modexs, modeys, SWP_SHOWWINDOW | SWP_NOZORDER); } void PPDisplayDevice::adjustWindowSize() { PPSize size = this->size; setSize(size); } static BOOL SetFullScreen (HWND hWnd, int w, int h) { if (!::IsWindow(hWnd)) return FALSE; DEVMODE dmScreen; int frequency = -1; if (::EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dmScreen)) { frequency = dmScreen.dmDisplayFrequency; } dmScreen.dmSize = sizeof ( DEVMODE ); dmScreen.dmPelsWidth = w; dmScreen.dmPelsHeight = h; if (frequency != -1) dmScreen.dmDisplayFrequency = frequency; dmScreen.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | (frequency == -1 ? 0 : DM_DISPLAYFREQUENCY); // Try with current frequency first if ( ::ChangeDisplaySettings( &dmScreen, CDS_FULLSCREEN | CDS_RESET) == DISP_CHANGE_SUCCESSFUL ) return TRUE; // Try without setting frequency dmScreen.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; if ( ::ChangeDisplaySettings( &dmScreen, CDS_FULLSCREEN | CDS_RESET) == DISP_CHANGE_SUCCESSFUL ) return TRUE; return FALSE; } bool PPDisplayDevice::goFullScreen(bool b) { if (b) { ::GetWindowRect(m_hWnd, &m_lastRect); if (::SetFullScreen(m_hWnd, size.width * scaleFactor, size.height * scaleFactor)) { m_lastWindowStyle = ::GetWindowLong(m_hWnd, GWL_STYLE); m_lastWindowExStyle = ::GetWindowLong(m_hWnd, GWL_EXSTYLE); ::SetWindowLong(m_hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS); ::SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_TOPMOST); ::ShowWindow(m_hWnd, SW_SHOWMAXIMIZED); ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); bFullScreen = true; } else { bFullScreen = false; return false; } } else { ::ChangeDisplaySettings(NULL, 0); ::SetWindowLong(m_hWnd, GWL_STYLE, m_lastWindowStyle); ::SetWindowLong(m_hWnd, GWL_EXSTYLE, m_lastWindowExStyle); ::SetWindowPos(m_hWnd, HWND_NOTOPMOST, m_lastRect.left, m_lastRect.top, m_lastRect.right - m_lastRect.left, m_lastRect.bottom - m_lastRect.top, SWP_SHOWWINDOW | SWP_FRAMECHANGED); bFullScreen = false; } return true; } void PPDisplayDevice::shutDown() { ::PostMessage(m_hWnd, WM_CLOSE, 0, 0); } DWORD WINAPI PPDisplayDevice::UpdateWindowThreadProc(LPVOID lpParameter) { PPDisplayDevice* thisDisplayDevice = (PPDisplayDevice*)lpParameter; while (true) { if (thisDisplayDevice->m_waitWindowVisible) WaitWindow::getInstance()->update(); System::msleep(100); } ::ExitThread(0); return 0; } void PPDisplayDevice::signalWaitState(bool b, const PPColor& color) { waitBarColor = color; if (b) { RECT bounds; ::GetWindowRect(m_hWnd, &bounds); WaitWindow::getInstance()->move(bounds.left + ((bounds.right-bounds.left) >> 1) - (WaitWindow::getInstance()->getWidth()>>1), bounds.top + ((bounds.bottom-bounds.top) >> 1) - (WaitWindow::getInstance()->getHeight()>>1)); WaitWindow::getInstance()->setColor(color); WaitWindow::getInstance()->show(); m_waitWindowVisible = true; if (!m_hThread) { m_hThread = CreateThread(NULL, 0, &UpdateWindowThreadProc, (void*)this, 0, &m_threadID); } } else { m_waitWindowVisible = false; WaitWindow::getInstance()->hide(); } } void PPDisplayDevice::setMouseCursor(MouseCursorTypes type) { currentCursorType = type; switch (type) { case MouseCursorTypeStandard: ::SetCursor(g_cursorStandard); break; case MouseCursorTypeResizeLeft: ::SetCursor(g_cursorResizeWE); break; case MouseCursorTypeResizeRight: ::SetCursor(g_cursorResizeWE); break; case MouseCursorTypeHand: ::SetCursor(g_cursorHand); break; } } milkytracker-0.90.85+dfsg/src/ppui/win32/fix_newline.sh0000755000175000017500000000036410737736041022012 0ustar admin2admin2#!/bin/sh # for i in `ls` do if [ -f $i ] then if [ -n "`tail -1c $i`" ] then echo "Bearbeite $i" echo >> $i fi fi done milkytracker-0.90.85+dfsg/src/ppui/PPUIConfig.h0000644000175000017500000000315411150223367020246 0ustar admin2admin2/* * ppui/PPUIConfig.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPUIConfig.h * MilkyTracker * * Created by Peter Barth on 01.07.05. * */ #ifndef PPUICONFIG__H #define PPUICONFIG__H #include "BasicTypes.h" #include "Singleton.h" class PPUIConfig : public PPSingleton { public: enum PPUIColors { ColorSelection = 0, ColorGrayedOutSelection, ColorDefaultButton, ColorDefaultButtonText, ColorContainer, ColorMessageBoxContainer, ColorMenuBackground, ColorMenuTextDark, ColorMenuTextBright, ColorListBoxBorder, ColorListBoxBackground, ColorRadioGroupButton, ColorStaticText, ColorLast }; private: PPColor colors[ColorLast]; PPUIConfig(); public: const PPColor& getColor(PPUIColors whichColor) const { return colors[whichColor]; } void setColor(PPUIColors whichColor, const PPColor& color) { colors[whichColor] = color; } friend class PPSingleton; }; #endif milkytracker-0.90.85+dfsg/src/ppui/Makefile.am0000644000175000017500000000357211135201273020225 0ustar admin2admin2SUBDIRS = osinterface noinst_LIBRARIES = libppui.a # For OpenGL, add sdl/DisplayDeviceOGL_SDL.cpp and Graphics_OGL.cpp, see # below libppui_a_SOURCES = Button.cpp CheckBox.cpp Container.cpp ContextMenu.cpp \ Control.cpp DialogBase.cpp DialogFileSelector.cpp Dictionary.cpp \ DictionaryKey.cpp Event.cpp Font.cpp Graphics_15BIT.cpp Graphics_16BIT.cpp \ Graphics_24bpp_generic.cpp Graphics_32bpp_generic.cpp Graphics_ARGB32.cpp \ Graphics_BGR24.cpp Graphics_BGR24_SLOW.cpp KeyboardBindingHandler.cpp \ ListBox.cpp ListBoxFileBrowser.cpp Menu.cpp MessageBoxContainer.cpp \ PPUIConfig.cpp RadioGroup.cpp Screen.cpp Scrollbar.cpp Seperator.cpp Slider.cpp \ StaticText.cpp Tools.cpp TransparentContainer.cpp sdl/DisplayDeviceFB_SDL.cpp \ sdl/DisplayDevice_SDL.cpp # Add Graphics_OGL.h and sdl/DisplayDeviceOGL_SDL.h here for OpenGL, see below noinst_HEADERS = BasicTypes.h Button.h CheckBox.h Container.h ContextMenu.h \ Control.h DialogBase.h DialogFileSelector.h Dictionary.h DictionaryKey.h \ DisplayDeviceBase.h Event.h Font.h Graphics.h GraphicsAbstract.h KeyBindings.h \ KeyboardBindingHandler.h ListBox.h ListBoxFileBrowser.h Menu.h \ MessageBoxContainer.h Object.h PPPath.h PPUI.h PPUIConfig.h RadioGroup.h \ ScanCodes.h Screen.h ScrollBar.h Seperator.h SimpleVector.h Singleton.h \ Slider.h StaticText.h Tools.h TransparentContainer.h UndoStack.h VirtualKeys.h \ fastfill.h sdl/DisplayDeviceFB_SDL.h sdl/DisplayDevice_SDL.h INCLUDES = -I$(top_srcdir)/src/ppui/osinterface \ -I$(top_srcdir)/src/ppui/osinterface/posix -I$(top_srcdir)/src/ppui/sdl # Add -D__OPENGL__ here if you want experimental opengl gfx (make clean # probably required) AM_CPPFLAGS = ${SDL_CFLAGS} -DMILKYTRACKER -D__LINUX__ -D__THREADTIMER__ EXTRA_DIST = carbon/DisplayDevice_CARBON.cpp carbon/DisplayDevice_CARBON.h \ win32/DisplayDevice_WIN32.cpp win32/DisplayDevice_WIN32.h \ wince/DisplayDevice_GAPI.cpp wince/DisplayDevice_GAPI.h milkytracker-0.90.85+dfsg/src/ppui/Graphics_BGR24.cpp0000644000175000017500000002435211150223367021301 0ustar admin2admin2/* * ppui/Graphics_BGR24.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Graphics.h" #include "Font.h" #define BPP 3 PPGraphics_BGR24::PPGraphics_BGR24(pp_int32 w, pp_int32 h, pp_int32 p, void* buff) : PPGraphicsFrameBuffer(w, h, p, buff) { } void PPGraphics_BGR24::setPixel(pp_int32 x, pp_int32 y) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; buff[0] = (pp_uint8)currentColor.b; buff[1] = (pp_uint8)currentColor.g; buff[2] = (pp_uint8)currentColor.r; } } void PPGraphics_BGR24::setPixel(pp_int32 x, pp_int32 y, const PPColor& color) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; buff[0] = (pp_uint8)color.b; buff[1] = (pp_uint8)color.g; buff[2] = (pp_uint8)color.r; } } void PPGraphics_BGR24::fill(PPRect rect) { if (rect.y1 < currentClipRect.y1) rect.y1 = currentClipRect.y1; if (rect.x1 < currentClipRect.x1) rect.x1 = currentClipRect.x1; if (rect.y2 > currentClipRect.y2) rect.y2 = currentClipRect.y2; if (rect.x2 > currentClipRect.x2) rect.x2 = currentClipRect.x2; pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; pp_uint32 rgb1 = (((pp_uint32)currentColor.b) << 24) + (((pp_uint32)r) << 16) + (((pp_uint32)g) << 8) + (((pp_uint32)b)); pp_uint32 rgb2 = (((pp_uint32)currentColor.g) << 24) + (((pp_uint32)b) << 16) + (((pp_uint32)r) << 8) + (((pp_uint32)g)); pp_uint32 rgb3 = (((pp_uint32)currentColor.r) << 24) + (((pp_uint32)g) << 16) + (((pp_uint32)b) << 8) + (((pp_uint32)r)); pp_int32 realLen = (rect.x2-rect.x1)*BPP; pp_int32 len = realLen/12; pp_int32 remainder = (((rect.x2-rect.x1)*BPP)%12) / 3; pp_uint8* buff = (pp_uint8*)buffer+(pitch*rect.y1+rect.x1*BPP); for (pp_int32 y = rect.y1; y < rect.y2; y++) { pp_uint32* ptr = reinterpret_cast(buff); pp_int32 i; for (i = 0; i < len; i++) { *ptr = rgb1; *(ptr+1) = rgb2; *(ptr+2) = rgb3; ptr+=3; } buff = reinterpret_cast(ptr); for (i = 0; i < remainder; i++) { *buff++ = (pp_uint8)b; *buff++ = (pp_uint8)g; *buff++ = (pp_uint8)r; } buff+=(pitch - realLen); } } void PPGraphics_BGR24::fill() { fill(currentClipRect); } void PPGraphics_BGR24::drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) { pp_int32 lx = x1; pp_int32 rx = x2; if (x1 > x2) { pp_int32 h = x2; x2 = x1; x1 = h; } if (lx < currentClipRect.x1) lx = currentClipRect.x1; if (rx > currentClipRect.x2) rx = currentClipRect.x2; if (y < currentClipRect.y1) return; if (y >= currentClipRect.y2) return; pp_uint8* buff = (pp_uint8*)buffer+pitch*y+lx*BPP; pp_int32 len = ((rx-lx)*BPP)/12; pp_int32 remainder = (((rx-lx)*BPP)%12) / 3; pp_uint32 rgb1 = (((pp_uint32)currentColor.b) << 24) + (((pp_uint32)currentColor.r) << 16) + (((pp_uint32)currentColor.g) << 8) + (((pp_uint32)currentColor.b)); pp_uint32 rgb2 = (((pp_uint32)currentColor.g) << 24) + (((pp_uint32)currentColor.b) << 16) + (((pp_uint32)currentColor.r) << 8) + (((pp_uint32)currentColor.g)); pp_uint32 rgb3 = (((pp_uint32)currentColor.r) << 24) + (((pp_uint32)currentColor.g) << 16) + (((pp_uint32)currentColor.b) << 8) + (((pp_uint32)currentColor.r)); pp_uint32* ptr = reinterpret_cast(buff); pp_int32 i; for (i = 0; i < len; i++) { *ptr++ = rgb1; *ptr++ = rgb2; *ptr++ = rgb3; } buff = reinterpret_cast(ptr); for (i = 0; i < remainder; i++) { *buff++ = (pp_uint8)currentColor.b; *buff++ = (pp_uint8)currentColor.g; *buff++ = (pp_uint8)currentColor.r; } } void PPGraphics_BGR24::drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) { pp_int32 ly = y1; pp_int32 ry = y2; if (y1 > y2) { pp_int32 h = y2; y2 = y1; y1 = h; } if (ly < currentClipRect.y1) ly = currentClipRect.y1; if (ry > currentClipRect.y2) ry = currentClipRect.y2; if (x < currentClipRect.x1) return; if (x >= currentClipRect.x2) return; pp_uint8* buff = (pp_uint8*)buffer+pitch*ly+x*BPP; pp_uint16 col16 = (pp_uint16)((currentColor.g << 8) + currentColor.b); for (pp_int32 y = ly; y < ry; y++) { *((pp_uint16*)buff) = col16; buff[2] = (pp_uint8)currentColor.r; buff+=pitch; } } void PPGraphics_BGR24::drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSLINETEMPLATE } void PPGraphics_BGR24::drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSAALINETEMPLATE } void PPGraphics_BGR24::blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { pp_int32 w = size.width; pp_int32 h = size.height; pp_uint8* dst = (pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP); const pp_uint32 bytesPerPixel = bpp; if (intensity == 256) { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { dst[2] = src[0]; dst[1] = src[1]; dst[0] = src[2]; dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } else { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { dst[2] = (src[0]*intensity)>>8; dst[1] = (src[1]*intensity)>>8; dst[0] = (src[2]*intensity)>>8; dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } } void PPGraphics_BGR24::drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 charDim = currentFont->charDim; if (x + (signed)charWidth < currentClipRect.x1 || x > currentClipRect.x2 || y + (signed)charHeight < currentClipRect.y1 || y > currentClipRect.y2) return; /*pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; if (x>= currentClipRect.x1 && x + (signed)currentFont->charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + (signed)currentFont->charHeight < currentClipRect.y2) { for (pp_uint32 i = 0; i < currentFont->charHeight; i++) { pp_uint8* buff = (pp_uint8*)buffer + (y+i)*pitch + x*3; for (pp_uint32 j = 0; j < currentFont->charWidth; j++) { if (currentFont->getPixelBit(chr, j,i)) { buff[0] = b; buff[1] = g; buff[2] = r; } buff+=3; } } } else { for (pp_uint32 i = 0; i < currentFont->charHeight; i++) for (pp_uint32 j = 0; j < currentFont->charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && currentFont->getPixelBit(chr, j,i)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*3); buff[0] = b; buff[1] = g; buff[2] = r; } } }*/ pp_uint8 r = (pp_uint8)currentColor.r; pp_uint8 g = (pp_uint8)currentColor.g; pp_uint8 b = (pp_uint8)currentColor.b; Bitstream* bitstream = currentFont->bitstream; pp_uint8* fontbuffer = bitstream->buffer; pp_uint8* buff = (pp_uint8*)buffer + y*pitch + x*BPP; pp_uint32 cchrDim = chr*charDim; if (x>= currentClipRect.x1 && x + charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + charHeight < currentClipRect.y2) { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if ((fontbuffer[xChr>>3]>>(xChr&7)&1)) { buff[0] = b; buff[1] = g; buff[2] = r; } buff+=BPP; xChr++; } buff+=pitch-(charWidth*BPP); yChr+=charWidth; } } else { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && (fontbuffer[xChr>>3]>>(xChr&7)&1)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*BPP); buff[0] = b; buff[1] = g; buff[2] = r; } xChr++; } yChr+=charWidth; } } if (underlined) drawHLine(x, x+charWidth, y+charHeight); } void PPGraphics_BGR24::drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 sx = x; while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; case '\n': y+=charHeight; x=sx-charWidth; break; default: drawChar(*str, x, y, underlined); } x += charWidth; str++; } } void PPGraphics_BGR24::drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; default: drawChar(*str, x, y, underlined); } y += charHeight; str++; } } milkytracker-0.90.85+dfsg/src/ppui/Control.cpp0000644000175000017500000001017311150223367020315 0ustar admin2admin2/* * ppui/Control.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Control.h" #include "Event.h" #include "Screen.h" #include "GraphicsAbstract.h" ////////////////////////////////////////////////////////////////////////////// // PPControl construction // ------------------------------------------------------------------------ // In: Parent screen object // ------------------------------------------------------------------------ // Note: All controls are placed within a valid screen object. // The screen is responsible for drawing the controls, if a control // needs to repaint itself it must tell the parent screen to draw it ////////////////////////////////////////////////////////////////////////////// PPControl::PPControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener /* = NULL */) : id(id), parentScreen(parentScreen), eventListener(eventListener), ownerControl(NULL), location(0,0), size(0,0), visible(true), enabled(true), hasFocus(false) { } PPControl::PPControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size) : id(id), parentScreen(parentScreen), eventListener(eventListener), ownerControl(NULL), location(location), size(size), visible(true), enabled(true), hasFocus(false) { } pp_int32 PPControl::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; return eventListener->handleEvent(reinterpret_cast(this), event); } bool PPControl::hit(const PPPoint& p) const { if (!visible) return false; return ((p.x >= location.x && p.x < location.x + size.width) && (p.y >= location.y && p.y < location.y + size.height)); } void PPControl::notifyChanges() { PPEvent e(eUpdateChanged); eventListener->handleEvent(reinterpret_cast(this), &e); } void PPControl::drawBorder(PPGraphicsAbstract* g, const PPColor& borderColor) { PPColor bColor = borderColor, dColor = borderColor; // adjust dark color dColor.scaleFixed(32768); // adjust bright color bColor.scaleFixed(87163); g->setColor(dColor); g->drawHLine(location.x, location.x + size.width, location.y); g->drawVLine(location.y, location.y + size.height, location.x); g->setColor(bColor); g->drawHLine(location.x, location.x + size.width, location.y + size.height - 1); g->drawVLine(location.y, location.y + size.height, location.x + size.width - 1); } void PPControl::drawThickBorder(PPGraphicsAbstract* g, const PPColor& borderColor) { PPColor bColor = borderColor, dColor = borderColor; // adjust dark color dColor.scaleFixed(32768); // adjust bright color bColor.scaleFixed(87163); g->setColor(borderColor); g->drawHLine(location.x, location.x + size.width, location.y); g->drawVLine(location.y, location.y + size.height, location.x); g->drawHLine(location.x, location.x + size.width, location.y + size.height - 1); g->drawVLine(location.y, location.y + size.height, location.x + size.width - 1); g->setColor(dColor); g->drawHLine(location.x+1, location.x + size.width-2, location.y+1); g->drawVLine(location.y+1, location.y + size.height-2, location.x+1); g->setColor(bColor); g->drawHLine(location.x+1, location.x + size.width-1, location.y + size.height - 2); g->drawVLine(location.y+1, location.y + size.height-2, location.x + size.width - 2); } bool PPControl::isVisible() const { bool visible = this->visible; if (ownerControl) visible = visible && ownerControl->isVisible(); return visible; } milkytracker-0.90.85+dfsg/src/ppui/Tools.cpp0000644000175000017500000000640311150223367017776 0ustar admin2admin2/* * ppui/Tools.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Tools.h" const char PPTools::hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; pp_uint32 PPTools::getHexNumDigits(pp_uint32 value) { if (value == 0 || (signed)value < 0) return 1; pp_uint32 i = 0; while (value >> i*4) i++; return i; } void PPTools::convertToHex(char* name, pp_uint32 value, pp_uint32 numDigits) { pp_uint32 i; for (i = 0; i < numDigits; i++) name[i] = hex[((value>>(numDigits-1-i)*4)&0xF)]; name[i] = 0; } pp_uint32 PPTools::getDecNumDigits(pp_uint32 value) { if (value == 0) return 1; pp_uint32 i = 0; pp_uint32 start = 1; while (value / start) { i++; start*=10; } return i; } void PPTools::convertToDec(char* name, pp_uint32 value, pp_uint32 numDigits) { pp_uint32 i; pp_uint32 start = 1; for (i = 0; i < numDigits-1; i++) start*=10; for (i = 0; i < numDigits; i++) { name[i] = hex[(value / start)%10]; start/=10; } name[i] = 0; } // you're responsible for deleting this vector PPSimpleVector* PPTools::extractStringList(const PPString& str) { PPSimpleVector* stringList = new PPSimpleVector(); const char* sz = str; PPString* line = new PPString(); while (*sz) { if (*sz == '\n') { stringList->add(line); line = new PPString(); } else { line->append(*sz); } sz++; } if (!line->length()) delete line; else stringList->add(line); return stringList; } PPString PPTools::encodeByteArray(const pp_uint8* array, pp_uint32 size) { char buffer[10]; // Convert number of bytes convertToHex(buffer, size, 8); PPString str = buffer; for (pp_uint32 i = 0; i < size; i++) { convertToHex(buffer, array[i], 2); str.append(buffer); } return str; } pp_uint8 PPTools::getNibble(const char* str) { if (*str >= '0' && *str <= '9') return (*str - '0'); if (*str >= 'A' && *str <= 'F') return (*str - 'A' + 10); if (*str >= 'a' && *str <= 'f') return (*str - 'a' + 10); return 0; } pp_uint8 PPTools::getByte(const char* str) { return (getNibble(str)<<4) + getNibble(str+1); } pp_uint16 PPTools::getWord(const char* str) { return (getByte(str)<<8) + getByte(str+2); } pp_uint32 PPTools::getDWord(const char* str) { return (getWord(str)<<16) + getWord(str+4); } bool PPTools::decodeByteArray(pp_uint8* array, pp_uint32 size, const PPString& str) { const char* ptr = str; pp_uint32 length = getDWord(ptr); if (length != size) return false; ptr+=8; for (pp_uint32 i = 0; i < length; i++) { *array++ = getByte(ptr); ptr+=2; } return true; } milkytracker-0.90.85+dfsg/src/ppui/Control.h0000644000175000017500000000724611150223367017771 0ustar admin2admin2/* * ppui/Control.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Basic control class // ///////////////////////////////////////////////////////////////// #ifndef CONTROL__H #define CONTROL__H // our basic types #include "Object.h" #include "BasicTypes.h" // Forwards class PPEvent; class EventListenerInterface; class PPGraphicsAbstract; class PPScreen; ///////////////////////////////////////////////////////////////// // Basic interface for all controls ///////////////////////////////////////////////////////////////// class PPControl : public PPObject { private: pp_int32 id; protected: PPScreen* parentScreen; EventListenerInterface* eventListener; // this object will receive events PPControl* ownerControl; PPPoint location; PPSize size; bool visible; bool enabled; bool hasFocus; PPControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener = NULL); PPControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size); public: virtual ~PPControl() {} void setEventListener(EventListenerInterface* eventListener) { this->eventListener = eventListener; } EventListenerInterface* getEventListener() { return eventListener; } void setOwnerControl(PPControl* ownerControl) { this->ownerControl = ownerControl; } PPControl* getOwnerControl() const { return ownerControl; } virtual pp_int32 dispatchEvent(PPEvent* event); virtual void paint(PPGraphicsAbstract* graphics) = 0; virtual bool gainsFocus() const { return false; } virtual bool gainedFocusByMouse() const { return gainsFocus(); } virtual bool isActive() const { return true; } virtual bool hit(const PPPoint& p) const; virtual void show(bool visible) { this->visible = visible; } virtual void hide(bool hidden) { show(!hidden); } virtual bool isVisible() const; virtual bool isHidden() const { return !isVisible(); } virtual void enable(bool b) { enabled = b; } virtual bool isEnabled() const { return enabled; } const PPPoint& getLocation() const { return location; } const PPSize& getSize() const { return size; } PPRect getBoundingRect() const { PPRect result(location.x, location.y, location.x + size.width, location.y + size.height); return result; } pp_int32 getID() const { return id; } virtual void setSize(const PPSize& size) { this->size = size; } virtual void setLocation(const PPPoint& location) { this->location = location; } virtual bool isContainer() const { return false; } virtual bool isListBox() const { return false; } virtual bool receiveTimerEvent() const { return false; } virtual bool gotFocus() const { return hasFocus; } protected: virtual void translateCoordinates(PPPoint& cp) { cp.x-=location.x; cp.y-=location.y; } virtual void notifyChanges(); void drawBorder(PPGraphicsAbstract* g, const PPColor& borderColor); void drawThickBorder(PPGraphicsAbstract* g, const PPColor& borderColor); }; #endif milkytracker-0.90.85+dfsg/src/ppui/Event.cpp0000644000175000017500000000254711150223367017764 0ustar admin2admin2/* * ppui/Event.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPEvent.cpp * MilkyTracker * * Created by Peter Barth on 23.05.05. * */ #include "Event.h" pp_uint32 keyModifier = 0; pp_uint32 forceKeyModifier = 0; void QueryKeyModifiers(); void setKeyModifier(KeyModifiers eModifier) { keyModifier |= eModifier; } void clearKeyModifier(KeyModifiers eModifier) { keyModifier &= ~eModifier; } void setForceKeyModifier(KeyModifiers eModifier) { forceKeyModifier |= eModifier; } void clearForceKeyModifier(KeyModifiers eModifier) { forceKeyModifier &= ~eModifier; } pp_uint32 getKeyModifier() { QueryKeyModifiers(); return keyModifier | forceKeyModifier; } milkytracker-0.90.85+dfsg/src/ppui/Button.h0000644000175000017500000000611511150223367017616 0ustar admin2admin2/* * ppui/Button.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPButton control class // ///////////////////////////////////////////////////////////////// #ifndef BUTTON__H #define BUTTON__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" // Forwards class PPGraphicsAbstract; class PPFont; class PPButton : public PPControl { private: const PPColor* color; const PPColor* textColor; bool border; bool clickable; bool update; bool verticalText; bool flat; bool autoSizeFont; PPPoint offset; bool pressed; bool invertShading; bool lMouseDown; bool rMouseDown; PPFont* font; PPString text; public: PPButton(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true, bool clickable = true, bool update = true); virtual ~PPButton(); virtual void setSize(const PPSize& size) { this->size = size; if (this->size.width < 8) this->size.width = 8; if (this->size.height < 8) this->size.height = 8; } void setColor(const PPColor& color) { this->color = &color; } const PPColor* getColor() const { return color; } void setXOffset(pp_int32 offset) { this->offset.x = offset; } void setYOffset(pp_int32 offset) { this->offset.y = offset; } void setText(const PPString& text); const PPString& getText() const { return text; } void setTextColor(const PPColor& color) { this->textColor = &color; } const PPColor* getTextColor() const { return textColor; } void setVerticalText(bool b) { verticalText = b; } void setFont(PPFont* font) { this->font = font; } PPFont* getFont() const { return font; } void setPressed(bool pressed) { this->pressed = pressed; } bool isPressed() const { return pressed; } void setUpdateable(bool b) { update = b; } void setClickable(bool b) { clickable = b; } bool isClickable() const { return clickable; } void setInvertShading(bool b) { invertShading = b; } void setFlat(bool b) { flat = b; } void setAutoSizeFont(bool autoSizeFont) { this->autoSizeFont = autoSizeFont; } virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); private: void handleButtonPress(bool& lMouseDown, bool& rMouseDown); void handleButtonRelease(bool& lMouseDown, bool& rMouseDown, PPEvent* event, EEventDescriptor postEvent); }; #endif milkytracker-0.90.85+dfsg/src/ppui/Singleton.h0000755000175000017500000000222111150223367020302 0ustar admin2admin2/* * ppui/Singleton.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Singleton.h * MilkyTracker * * Created by Peter Barth on 10.04.08. * */ #ifndef __SINGLETON_H__ #define __SINGLETON_H__ template class PPSingleton { private: static type* instance; public: static type* getInstance() { if (instance == NULL) instance = new type(); return instance; } }; template type* PPSingleton::instance = NULL; #endif milkytracker-0.90.85+dfsg/src/ppui/Tools.h0000644000175000017500000000316411150223367017444 0ustar admin2admin2/* * ppui/Tools.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PPUI_TOOLS__H #define PPUI_TOOLS__H #include "BasicTypes.h" #include "SimpleVector.h" class PPTools { private: static const char hex[]; public: static pp_uint32 getHexNumDigits(pp_uint32 value); static void convertToHex(char* name, pp_uint32 value, pp_uint32 numDigits); static pp_uint32 getDecNumDigits(pp_uint32 value); static void convertToDec(char* name, pp_uint32 value, pp_uint32 numDigits); // you're responsible for deleting this vector static PPSimpleVector* extractStringList(const PPString& str); static pp_uint8 getNibble(const char* str); static pp_uint8 getByte(const char* str); static pp_uint16 getWord(const char* str); static pp_uint32 getDWord(const char* str); static PPString encodeByteArray(const pp_uint8* array, pp_uint32 size); static bool decodeByteArray(pp_uint8* array, pp_uint32 size, const PPString& str); }; #endif milkytracker-0.90.85+dfsg/src/ppui/ListBoxFileBrowser.cpp0000644000175000017500000002330011150223367022421 0ustar admin2admin2/* * ppui/ListBoxFileBrowser.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ListBoxFileBrowser.cpp * MilkyTracker * * Created by Peter Barth on 19.10.06. * */ #include "ListBoxFileBrowser.h" #include "Screen.h" #include "PPPathFactory.h" PPListBoxFileBrowser::PPListBoxFileBrowser(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size) : PPListBox(id, parentScreen, eventListener, location, size, true, false, true, true), filePrefix(" "), fileSuffix(""), directoryPrefix(" "), directorySuffix(""), sortAscending(true), cycleFilenames(true), sortType(SortByName) { setRightButtonConfirm(true); currentPath = PPPathFactory::createPath(); } PPListBoxFileBrowser::~PPListBoxFileBrowser() { delete currentPath; } pp_int32 PPListBoxFileBrowser::dispatchEvent(PPEvent* event) { if (event->getID() == eKeyChar && cycleFilenames) { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); if (keyCode < 255) cycle((char)keyCode); } return PPListBox::dispatchEvent(event); } void PPListBoxFileBrowser::clearExtensions() { items.clear(); } // must contain pairs of extensions / description // terminated by TWO NULL pointers void PPListBoxFileBrowser::addExtensions(const char* const extensions[]) { for (pp_uint32 i = 0; extensions[i] != NULL; i+=2) addExtension(extensions[i], extensions[i+1]); } void PPListBoxFileBrowser::addExtension(const PPString& ext, const PPString& desc) { Descriptor* d = new Descriptor(ext, desc); items.add(d); } PPSystemString PPListBoxFileBrowser::getCurrentPathAsString() const { return currentPath->getCurrent(); } PPString PPListBoxFileBrowser::getCurrentPathAsASCIIString() const { char* nameASCIIZ = currentPath->getCurrent().toASCIIZ(); PPString result(nameASCIIZ); delete[] nameASCIIZ; return result; } void PPListBoxFileBrowser::refreshFiles() { iterateFilesInFolder(); } const PPPathEntry* PPListBoxFileBrowser::getPathEntry(pp_int32 index) const { return pathEntries.get(index); } bool PPListBoxFileBrowser::canGotoHome() const { return currentPath->canGotoHome(); } void PPListBoxFileBrowser::gotoHome() { PPSystemString before = currentPath->getCurrent(); currentPath->gotoHome(); PPSystemString after = currentPath->getCurrent(); if (after.compareTo(before) != 0) { history.Push(before); history.Push(after); history.Pop(); } refreshFiles(); } bool PPListBoxFileBrowser::canGotoRoot() const { return currentPath->canGotoRoot(); } void PPListBoxFileBrowser::gotoRoot() { PPSystemString before = currentPath->getCurrent(); currentPath->gotoRoot(); PPSystemString after = currentPath->getCurrent(); if (after.compareTo(before) != 0) { history.Push(before); history.Push(after); history.Pop(); } refreshFiles(); } bool PPListBoxFileBrowser::canGotoParent() const { return currentPath->canGotoParent(); } void PPListBoxFileBrowser::gotoParent() { PPSystemString before = currentPath->getCurrent(); currentPath->gotoParent(); PPSystemString after = currentPath->getCurrent(); if (after.compareTo(before) != 0) { history.Push(before); history.Push(after); history.Pop(); } refreshFiles(); } bool PPListBoxFileBrowser::currentSelectionIsFile() { const PPPathEntry* entry = getPathEntry(PPListBox::getSelectedIndex()); return entry ? entry->isFile() : false; } bool PPListBoxFileBrowser::stepIntoCurrentSelection() { const PPPathEntry* entry = getPathEntry(PPListBox::getSelectedIndex()); return entry ? stepInto(*entry) : false; } bool PPListBoxFileBrowser::stepInto(const PPPathEntry& entry) { if (entry.isDirectory()) { PPSystemString before = currentPath->getCurrent(); // check if we can actually change to this directory if (!currentPath->stepInto(entry.getName())) return false; PPSystemString after = currentPath->getCurrent(); if (after.compareTo(before) != 0) { history.Push(before); history.Push(after); history.Pop(); } refreshFiles(); return true; } return false; } bool PPListBoxFileBrowser::gotoPath(const PPSystemString& path, bool reload/* = true*/) { bool res = currentPath->change(path); if (res && reload) refreshFiles(); return res; } bool PPListBoxFileBrowser::canPrev() const { return !history.IsEmpty(); } // undo last changes void PPListBoxFileBrowser::prev() { if (history.IsEmpty()) return; gotoPath(*history.Pop()); } bool PPListBoxFileBrowser::canNext() const { return !history.IsTop(); } // redo last changes void PPListBoxFileBrowser::next() { if (history.IsTop()) return; gotoPath(*history.Advance()); } void PPListBoxFileBrowser::setFilePrefix(const PPString& prefix) { filePrefix = prefix; } void PPListBoxFileBrowser::setFileSuffix(const PPString& suffix) { fileSuffix = suffix; } void PPListBoxFileBrowser::setDirectoryPrefix(const PPString& prefix) { directoryPrefix = prefix; } void PPListBoxFileBrowser::setDirectorySuffix(const PPString& suffix) { directorySuffix = suffix; } void PPListBoxFileBrowser::setDirectorySuffixPathSeperator() { directorySuffix = currentPath->getPathSeparatorAsASCII(); } void PPListBoxFileBrowser::iterateFilesInFolder() { pathEntries.clear(); const PPPathEntry* entry = currentPath->getFirstEntry(); while (entry) { if (!entry->isHidden() && checkExtension(*entry)) { pathEntries.add(entry->clone()); } entry = currentPath->getNextEntry(); } sortFileList(); buildFileList(); } void PPListBoxFileBrowser::buildFileList() { PPListBox::clear(); for (pp_int32 i = 0; i < pathEntries.size(); i++) { const PPPathEntry* entry = pathEntries.get(i); char* nameASCIIZ = entry->getName().toASCIIZ(); PPString str(entry->isDirectory() ? directoryPrefix : filePrefix); str.append(nameASCIIZ); str.append(entry->isDirectory() ? directorySuffix : fileSuffix); appendFileSize(str, *entry); PPListBox::addItem(str); delete[] nameASCIIZ; } } void PPListBoxFileBrowser::appendFileSize(PPString& name, const PPPathEntry& entry) { if (entry.isFile()) { pp_int64 size = entry.getSize(); char buffer[1024]; if (size < 1024) sprintf(buffer, " (%db)", (pp_int32)size); else if (size < 1024*1024) { size>>=10; sprintf(buffer, " (%dkb)", (pp_int32)size); } else { size>>=20; sprintf(buffer, " (%dmb)", (pp_int32)size); } name.append(buffer); } } void PPListBoxFileBrowser::sortFileList() { pp_int32 i; PPPathEntry** tempEntries; PPPathEntry** drives; PPPathEntry** parents; pp_int32 numEntries = pathEntries.size(); tempEntries = new PPPathEntry*[numEntries]; drives = new PPPathEntry*[numEntries]; parents = new PPPathEntry*[numEntries]; //for (i = 0; i < numEntries; i++) // tempEntries[i] = pathEntries.get(i)->clone(); pp_int32 numDrives = 0; pp_int32 numParents = 0; pp_int32 content = 0; for (i = 0; i < numEntries; i++) { if (pathEntries.get(i)->isParent()) { parents[numParents] = pathEntries.get(i)->clone(); numParents++; } else if (pathEntries.get(i)->isDrive()) { drives[numDrives] = pathEntries.get(i)->clone(); numDrives++; } else { tempEntries[content] = pathEntries.get(i)->clone(); content++; } } PPPathEntry::PathSortRuleInterface* sortRules[NumSortRules]; PPPathEntry::PathSortByFileRule sortByFileRule; PPPathEntry::PathSortBySizeRule sortBySizeRule; PPPathEntry::PathSortByExtRule sortByExtRule; sortRules[0] = &sortByFileRule; sortRules[1] = &sortBySizeRule; sortRules[2] = &sortByExtRule; if (content) PPPathEntry::sort(tempEntries, 0, content-1, *sortRules[sortType], !sortAscending); if (numDrives) PPPathEntry::sort(drives, 0, numDrives-1, *sortRules[0], false); pathEntries.clear(); for (i = 0; i < numParents; i++) { pathEntries.add(parents[i]->clone()); delete parents[i]; } for (i = 0; i < content; i++) { pathEntries.add(tempEntries[i]->clone()); delete tempEntries[i]; } for (i = 0; i < numDrives; i++) { pathEntries.add(drives[i]->clone()); delete drives[i]; } delete[] parents; delete[] drives; delete[] tempEntries; } void PPListBoxFileBrowser::cycle(char chr) { pp_int32 currentIndex = PPListBox::getSelectedIndex(); PPSystemString prefix(chr); prefix.toUpper(); pp_uint32 j = currentIndex+1; for (pp_int32 i = 0; i < pathEntries.size(); i++, j++) { PPSystemString str = pathEntries.get(j % pathEntries.size())->getName(); str.toUpper(); if (str.startsWith(prefix)) { PPListBox::setSelectedIndex(j % pathEntries.size(), false); pp_int32 selectionIndex = PPListBox::getSelectedIndex(); PPEvent e(eSelection, &selectionIndex, sizeof(selectionIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); parentScreen->paintControl(this); break; } } } bool PPListBoxFileBrowser::checkExtension(const PPPathEntry& entry) { if (items.size() == 0 || entry.isDirectory()) return true; bool res = false; for (pp_int32 i = 0; i < items.size(); i++) { PPSystemString sysStr(items.get(i)->extension); if (entry.getName().compareToExtension(sysStr)) { res = true; break; } } return res; } milkytracker-0.90.85+dfsg/src/ppui/Slider.cpp0000644000175000017500000004117411150223367020124 0ustar admin2admin2/* * ppui/Slider.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Slider.h" #include "GraphicsAbstract.h" #include "Button.h" #include "Event.h" #include "Screen.h" void PPSlider::initButtons() { PPPoint buttonDownPos, buttonBarPos; PPSize buttonBarSize; if (horizontal) { this->size.height = SLIDERBUTTONHEIGHT; this->size.width = oneDimSize; buttonDownPos = PPPoint(location.x + oneDimSize - SLIDERBUTTONWIDTH, location.y); buttonBarPos = PPPoint(location.x + SLIDERBUTTONWIDTH, location.y); buttonBarSize = PPSize((oneDimSize - SLIDERBUTTONWIDTH*2), SLIDERBUTTONHEIGHT); } else { this->size.width = SLIDERBUTTONWIDTH; this->size.height = oneDimSize; buttonDownPos = PPPoint(location.x, location.y + oneDimSize - SLIDERBUTTONHEIGHT); buttonBarPos = PPPoint(location.x, location.y + SLIDERBUTTONHEIGHT); buttonBarSize = PPSize(SLIDERBUTTONWIDTH, (oneDimSize - SLIDERBUTTONHEIGHT*2)); } backgroundButton = new PPButton(0, parentScreen, NULL, /*_Point(location.x + (horizontal?0:1), location.y + (horizontal?1:0))*/location, this->size, false); backgroundButton->setColor(backgroundColor); backgroundButton->setInvertShading(true); buttonUp = new PPButton(0, parentScreen, this, location, PPSize(SLIDERBUTTONWIDTH,SLIDERBUTTONHEIGHT), false); buttonUp->setText(!buttonSwap ? "-" : "+"); buttonDown = new PPButton(0, parentScreen, this, buttonDownPos , PPSize(SLIDERBUTTONWIDTH,SLIDERBUTTONHEIGHT), false); buttonDown->setText(!buttonSwap ? "+" : "-"); buttonBar = new PPButton(0, parentScreen, this, buttonBarPos, buttonBarSize, false, false); setBarSize(currentBarSize, false); setBarPosition(currentBarPosition, false); } PPSlider::PPSlider(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, pp_int32 size, bool horizontal, bool buttonSwap) : PPControl(id, parentScreen, eventListener, location, PPSize(0,0)), oneDimSize(size), horizontal(horizontal), buttonSwap(buttonSwap), controlCaughtByLMouseButton(false), controlCaughtByRMouseButton(false) { // default color backgroundColor.r = 64; backgroundColor.g = 64; backgroundColor.b = 64; currentBarSize = 65536; currentBarPosition = 0; initButtons(); caughtControl = NULL; minValue = 0; maxValue = 255; currentValue = 0; } PPSlider::~PPSlider() { delete backgroundButton; delete buttonUp; delete buttonDown; delete buttonBar; } void PPSlider::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; g->setRect(PPRect(location.x, location.y, location.x + size.width, location.y + size.height)); /*g->setColor(backgroundColor); g->fill();*/ backgroundButton->paint(g); buttonDown->paint(g); buttonUp->paint(g); buttonBar->paint(g); } void PPSlider::setBarSize(pp_int32 size, bool repaint /* = true */) { if (size < 0) size = 0; if (size > 65536) size = 65536; currentBarSize = size; pp_int32 newSize = (((horizontal?(this->size.width-SLIDERBUTTONWIDTH*2):(this->size.height-SLIDERBUTTONHEIGHT*2))) * size)>>16; if (horizontal) { buttonBar->setSize(PPSize(newSize, this->size.height)); } else { buttonBar->setSize(PPSize(this->size.width, newSize)); } if (repaint) parentScreen->paintControl(this); } void PPSlider::setLocation(const PPPoint& location) { PPControl::setLocation(location); delete backgroundButton; delete buttonUp; delete buttonDown; delete buttonBar; initButtons(); } void PPSlider::setBarPosition(pp_int32 pos, bool repaint /* = false */) { if (pos < 0) pos = 0; if (pos > 65536) pos = 65536; currentBarPosition = pos; pp_int32 size = (horizontal?buttonBar->getSize().width:buttonBar->getSize().height); pp_int32 entireSize = (horizontal?(this->size.width-SLIDERBUTTONWIDTH*2):(this->size.height-SLIDERBUTTONHEIGHT*2)); pp_int32 maxPos = entireSize-size; pp_int32 newPos = (maxPos*pos)>>16; PPPoint p = location; if (horizontal) p.x+=newPos + SLIDERBUTTONWIDTH; else p.y+=newPos + SLIDERBUTTONHEIGHT; buttonBar->setLocation(p); if (repaint) parentScreen->paintControl(this); } pp_int32 PPSlider::dispatchEvent(PPEvent* event) { //if (!visible) // return 0; switch (event->getID()) { /*case eMouseWheelMoved: { TMouseWheelEventParams* params = (TMouseWheelEventParams*)event->getDataPtr(); if (params->delta > 0) { PPEvent e(eLMouseUp); handleEvent(reinterpret_cast(buttonUp), &e); } else if (params->delta < 0) { PPEvent e(eLMouseUp); handleEvent(reinterpret_cast(buttonDown), &e); } event->cancel(); break; }*/ case eLMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (buttonUp->hit(*p)) { caughtControl = buttonUp; caughtControl->dispatchEvent(event); controlCaughtByLMouseButton = true; } else if (buttonDown->hit(*p)) { caughtControl = buttonDown; caughtControl->dispatchEvent(event); controlCaughtByLMouseButton = true; } else if (buttonBar->hit(*p)) { caughtControl = buttonBar; // ------------------------- buttonBar->setPressed(true); parentScreen->paintControl(buttonBar); // ------------------------- caughtMouseLocation = *p; caughtControlLocation = buttonBar->getLocation(); caughtControl->dispatchEvent(event); controlCaughtByLMouseButton = true; } else if (backgroundButton->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } break; } case eLMouseUp: controlCaughtByLMouseButton = false; if (caughtControl == NULL) break; if (controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); break; } // ------------------------- if (reinterpret_cast(caughtControl) == buttonBar) { buttonBar->setPressed(false); parentScreen->paintControl(buttonBar); } // ------------------------- caughtControl->dispatchEvent(event); caughtControl = NULL; break; case eLMouseRepeat: { if (caughtControl) { caughtControl->dispatchEvent(event); break; } else { PPPoint* p = (PPPoint*)event->getDataPtr(); /*if (backgroundButton->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } PPPoint* p = (PPPoint*)event->getDataPtr();*/ if (backgroundButton->hit(*p) && !buttonBar->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } else if (buttonBar->hit(*p)) { // ------------------------- buttonBar->setPressed(true); parentScreen->paintControl(buttonBar); // ------------------------- caughtControl = buttonBar; caughtMouseLocation = *p; caughtControlLocation = buttonBar->getLocation(); caughtControl->dispatchEvent(event); } } break; } case eRMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (buttonUp->hit(*p)) { caughtControl = buttonUp; caughtControl->dispatchEvent(event); controlCaughtByRMouseButton = true; } else if (buttonDown->hit(*p)) { caughtControl = buttonDown; caughtControl->dispatchEvent(event); controlCaughtByRMouseButton = true; } else if (buttonBar->hit(*p)) { caughtControl = buttonBar; // ------------------------- buttonBar->setPressed(true); parentScreen->paintControl(buttonBar); // ------------------------- caughtMouseLocation = *p; caughtControlLocation = buttonBar->getLocation(); caughtControl->dispatchEvent(event); controlCaughtByRMouseButton = true; } else if (backgroundButton->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } break; } case eRMouseUp: controlCaughtByRMouseButton = false; if (caughtControl == NULL) break; if (controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } // ------------------------- if (reinterpret_cast(caughtControl) == buttonBar) { buttonBar->setPressed(false); parentScreen->paintControl(buttonBar); } // ------------------------- caughtControl->dispatchEvent(event); caughtControl = NULL; break; case eRMouseRepeat: { if (caughtControl) { caughtControl->dispatchEvent(event); break; } else { /*PPPoint* p = (PPPoint*)event->getDataPtr(); if (backgroundButton->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); }*/ PPPoint* p = (PPPoint*)event->getDataPtr(); if (backgroundButton->hit(*p) && !buttonBar->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } else if (buttonBar->hit(*p)) { // ------------------------- buttonBar->setPressed(true); parentScreen->paintControl(buttonBar); // ------------------------- caughtControl = buttonBar; caughtMouseLocation = *p; caughtControlLocation = buttonBar->getLocation(); caughtControl->dispatchEvent(event); } } break; } //case eLMouseDrag: default: if (caughtControl == NULL) break; caughtControl->dispatchEvent(event); break; } return 0; } pp_int32 PPSlider::handleEvent(PPObject* sender, PPEvent* event) { if ( (event->getID() == eLMouseUp && sender == reinterpret_cast(buttonUp)) || (event->getID() == eLMouseRepeat && sender == reinterpret_cast(buttonUp)) || (event->getID() == eRMouseUp && sender == reinterpret_cast(buttonUp)) || (event->getID() == eRMouseRepeat && sender == reinterpret_cast(buttonUp)) ) { // Call parent event listener //PPEvent e(eBarScrollUp); //return eventListener->handleEvent(reinterpret_cast(this), &e); if (currentValue > minValue) currentValue--; float f = (float)(currentValue - minValue)/(maxValue - minValue); setBarPosition((pp_int32)(f*65536.0f)); parentScreen->paintControl(this); PPEvent e(eValueChanged); return eventListener->handleEvent(reinterpret_cast(this), &e); } if ( (event->getID() == eLMouseUp && sender == reinterpret_cast(buttonDown)) || (event->getID() == eLMouseRepeat && sender == reinterpret_cast(buttonDown)) || (event->getID() == eRMouseUp && sender == reinterpret_cast(buttonDown)) || (event->getID() == eRMouseRepeat && sender == reinterpret_cast(buttonDown)) ) { // Call parent event listener //PPEvent e(eBarScrollDown); //return eventListener->handleEvent(reinterpret_cast(this), &e); if (currentValue < maxValue) currentValue++; float f = (float)(currentValue - minValue)/(maxValue - minValue); setBarPosition((pp_int32)(f*65536.0f)); parentScreen->paintControl(this); PPEvent e(eValueChanged); return eventListener->handleEvent(reinterpret_cast(this), &e); } else if (/*event->getID() == eLMouseDown &&*/ sender == reinterpret_cast(backgroundButton)) { if (horizontal) { PPPoint* p = (PPPoint*)event->getDataPtr(); if (p->x < buttonBar->getLocation().x) { pp_int32 bsize = buttonBar->getSize().width; pp_int32 entireSize = size.width - SLIDERBUTTONWIDTH*2; float f = (float)entireSize/(float)(entireSize - bsize); currentBarPosition-=(pp_int32)(currentBarSize*f); if (currentBarPosition < 0) currentBarPosition = 0; setBarPosition(currentBarPosition); // Call parent event listener //PPEvent e(eBarPosChanged); //return eventListener->handleEvent(reinterpret_cast(this), &e); } else if (p->x > buttonBar->getLocation().x + buttonBar->getSize().width) { pp_int32 bsize = buttonBar->getSize().width; pp_int32 entireSize = size.width - SLIDERBUTTONWIDTH*2; float f = (float)entireSize/(float)(entireSize - bsize); currentBarPosition+=(pp_int32)(currentBarSize*f); if (currentBarPosition > 65536) currentBarPosition = 65536; setBarPosition(currentBarPosition); // Call parent event listener //PPEvent e(eBarPosChanged); //return eventListener->handleEvent(reinterpret_cast(this), &e); } } else { PPPoint* p = (PPPoint*)event->getDataPtr(); if (p->y < buttonBar->getLocation().y) { pp_int32 bsize = buttonBar->getSize().height; pp_int32 entireSize = size.height - SLIDERBUTTONHEIGHT*2; float f = (float)entireSize/(float)(entireSize - bsize); currentBarPosition-=(pp_int32)(currentBarSize*f); if (currentBarPosition < 0) currentBarPosition = 0; setBarPosition(currentBarPosition); // Call parent event listener //PPEvent e(eBarPosChanged); //return eventListener->handleEvent(reinterpret_cast(this), &e); } else if (p->y > buttonBar->getLocation().y + buttonBar->getSize().height) { pp_int32 bsize = buttonBar->getSize().height; pp_int32 entireSize = size.height - SLIDERBUTTONHEIGHT*2; float f = (float)entireSize/(float)(entireSize - bsize); currentBarPosition+=(pp_int32)(currentBarSize*f); if (currentBarPosition > 65536) currentBarPosition = 65536; setBarPosition(currentBarPosition); // Call parent event listener //PPEvent e(eBarPosChanged); //return eventListener->handleEvent(reinterpret_cast(this), &e); } } } else if ((event->getID() == eLMouseDrag && sender == reinterpret_cast(buttonBar)) || event->getID() == eRMouseDrag && sender == reinterpret_cast(buttonBar)) { PPPoint* p = (PPPoint*)event->getDataPtr(); pp_int32 pos = 0,dx,nx; if (horizontal) { dx = (p->x - caughtMouseLocation.x); /*if (dx < 0) { __asm { int 3 } }*/ nx = caughtControlLocation.x + dx; //if (nx < location.x + SLIDERBUTTONSIZE) // nx = location.x + SLIDERBUTTONSIZE; //if (nx > location.x + size.width - SLIDERBUTTONSIZE*2 - buttonBar->getSize().width) // nx = location.x + size.width - SLIDERBUTTONSIZE*2 - buttonBar->getSize().width; nx-=(location.x + SLIDERBUTTONWIDTH); pp_int32 d = (size.width - buttonBar->getSize().width - SLIDERBUTTONWIDTH*2); if (d != 0) pos = nx*65536 / d; } else { dx = (p->y - caughtMouseLocation.y); /*if (dx < 0) __asm { { int 3 } }*/ nx = caughtControlLocation.y + dx; //if (nx < location.x + SLIDERBUTTONSIZE) // nx = location.x + SLIDERBUTTONSIZE; //if (nx > location.x + size.width - SLIDERBUTTONSIZE*2 - buttonBar->getSize().width) // nx = location.x + size.width - SLIDERBUTTONSIZE*2 - buttonBar->getSize().width; nx-=(location.y + SLIDERBUTTONHEIGHT); pp_int32 d = (size.height - buttonBar->getSize().height - SLIDERBUTTONHEIGHT*2); if (d != 0) pos = nx*65536 / d; } setBarPosition(pos); // Call parent event listener //PPEvent e(eBarPosChanged); //return eventListener->handleEvent(reinterpret_cast(this), &e); } else { return 0; } float f = getBarPosition() / 65536.0f; currentValue = (pp_int32)((f * (maxValue - minValue)) + minValue); parentScreen->paintControl(this); PPEvent e(eValueChanged); return eventListener->handleEvent(reinterpret_cast(this), &e); } void PPSlider::setSize(pp_uint32 size) { PPPoint buttonDownPos, buttonBarPos; PPSize buttonBarSize; if (horizontal) { this->size.height = SLIDERBUTTONHEIGHT; this->size.width = size; buttonDownPos = PPPoint(location.x + size - SLIDERBUTTONWIDTH, location.y); buttonBarPos = PPPoint(location.x + SLIDERBUTTONWIDTH, location.y); buttonBarSize = PPSize((size - SLIDERBUTTONWIDTH*2), SLIDERBUTTONHEIGHT); } else { this->size.width = SLIDERBUTTONWIDTH; this->size.height = size; buttonDownPos = PPPoint(location.x, location.y + size - SLIDERBUTTONHEIGHT); buttonBarPos = PPPoint(location.x, location.y + SLIDERBUTTONHEIGHT); buttonBarSize = PPSize(SLIDERBUTTONWIDTH, (size - SLIDERBUTTONHEIGHT*2)); } backgroundButton->setLocation(location); backgroundButton->setSize(this->size); buttonUp->setLocation(location); buttonDown->setLocation(buttonDownPos); } milkytracker-0.90.85+dfsg/src/ppui/Font.h0000644000175000017500000001236311150223367017253 0ustar admin2admin2/* * ppui/Font.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ // Font.h: interface for the PPFont class. // ////////////////////////////////////////////////////////////////////// #ifndef FONT__H #define FONT__H #include "BasicTypes.h" #include "SimpleVector.h" #define MAXFONTS 256 class PPGraphicsAbstract; class Bitstream { public: pp_uint8* buffer; pp_uint32 bufferSize; void setSource(const void* buffer, pp_uint32 bufferSize) { this->buffer = (pp_uint8*)buffer; this->bufferSize = bufferSize; } Bitstream(const void* buffer, pp_uint32 bufferSize) { setSource(buffer, bufferSize); } void clear() { for (pp_uint32 i = 0; i < bufferSize; i++) buffer[i] = 0; } bool read(pp_uint32 offset) const { return (buffer[offset>>3]>>(offset&7))&1; } void write(pp_uint32 offset, bool bit) { pp_uint8 mask = ~(1<<(offset&7));; buffer[offset>>3] &= mask; buffer[offset>>3] |= ((pp_uint8)bit<<(offset&7)); } }; class PPFont { private: // cache big font, is created from normal 8x8 font static pp_uint8 bigFont[]; public: enum FontID { FONT_TINY = 0, FONT_SYSTEM = 1, FONT_LARGE = 2, FONT_HUGE = 3, FONT_LAST }; private: static PPFont* fontInstances[MAXFONTS]; static pp_uint32 numFontInstances; pp_uint32 fontId; PPFont(pp_uint8* bits, pp_uint32 charWidth, pp_uint32 charHeight, pp_uint32 fontId); struct FontFamilyDescription { PPSize size; // Size of font character (width, height) const char* name; // Name of font familiy (Tiny, System, Large) const char* internalName; // Internal name pp_uint32 fontEntryIndex; // Index to font entry table (source for current selected font) const pp_uint32 defaultFontEntryIndex; // Default index to font entry table pp_int32 enumerationIndex; // Is currently enumerating entries FontFamilyDescription(PPSize theSize, const char* theName, const char* theInternalName, pp_uint32 theFontEntryIndex, const pp_uint32 theDefaultFontEntryIndex, pp_int32 theEnumerationIndex) : size(theSize), name(theName), internalName(theInternalName), fontEntryIndex(theFontEntryIndex), defaultFontEntryIndex(theDefaultFontEntryIndex), enumerationIndex(theEnumerationIndex) { } }; static FontFamilyDescription fontFamilyDescriptions[FONT_LAST]; static pp_int32 enumerationIndex; static void createLargeFromSystem(pp_uint32 index); public: pp_uint8* fontBits; Bitstream* bitstream; const pp_uint32 charWidth, charHeight; const pp_uint32 charDim; public: ~PPFont(); pp_uint32 getCharWidth() const { return charWidth; } pp_uint32 getCharHeight() const { return charHeight; } static PPFont* getFont(pp_uint32 fontId); bool getPixelBit(pp_uint8 chr, pp_uint32 x, pp_uint32 y) const { return bitstream->read(chr*charDim+y*charWidth+x); } pp_uint32 getStrWidth(const char* str) const; enum ShrinkTypes { ShrinkTypeMiddle, ShrinkTypeEnd }; void shrinkString(const char* text, char* result, pp_uint32 maxWidth, ShrinkTypes shrinkType = ShrinkTypeMiddle) { pp_uint32 numchars = maxWidth / getCharWidth(); pp_uint32 textLen = strlen(text); if (textLen <= numchars) { strcpy(result, text); return; } if (shrinkType == ShrinkTypeMiddle) { numchars-=(textLen & 1); char* temp = result; pp_uint32 i; for (i = 0; i < (numchars / 2) - ((textLen+1) & 1); i++) temp[i] = text[i]; while (temp[i-1] == ' ' && i > 1) i--; temp[i] = '\xef'; pp_uint32 j = i+1; pp_uint32 k = strlen(text) - (numchars / 2 + (textLen & 1)); while (text[k] == ' ' && k < textLen) k++; for (i = k; i < textLen; i++, j++) temp[j] = text[i]; temp[j] = '\0'; } else if (shrinkType == ShrinkTypeEnd) { pp_int32 i = 0; for (i = 0; i < (signed)numchars-1; i++) { result[i] = text[i]; } while (i > 0 && result[i-1] == '.') i--; result[i++] = '\xef'; result[i] = '\0'; } } PPString shrinkString(const PPString& text, pp_uint32 maxWidth, ShrinkTypes shrinkType = ShrinkTypeMiddle) { char* temp = new char[(text.length()+1)*2]; shrinkString(text, temp, maxWidth, shrinkType); PPString result(temp); delete[] temp; return result; } static const char* getFamilyInternalName(FontID fontID); static const char* getFirstFontFamilyName(); static const char* getNextFontFamilyName(); static const char* getFirstFontEntryName(FontID fontID); static const char* getNextFontEntryName(FontID fontID); static void selectFontFace(FontID fontID, const char* faceName); static const char* getCurrentFontFace(FontID fontID); }; #endif milkytracker-0.90.85+dfsg/src/ppui/Event.h0000644000175000017500000001240611150223367017424 0ustar admin2admin2/* * ppui/Event.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPEvent classes // ///////////////////////////////////////////////////////////////// #ifndef EVENT__H #define EVENT__H #include "Object.h" #include "BasicTypes.h" // key states enum KeyModifiers { KeyModifierALT = 1, KeyModifierSHIFT = 2, KeyModifierCTRL = 4 }; struct TMouseWheelEventParams { PPPoint pos; pp_int32 delta; }; void setKeyModifier(KeyModifiers eModifier); void clearKeyModifier(KeyModifiers eModifier); void setForceKeyModifier(KeyModifiers eModifier); void clearForceKeyModifier(KeyModifiers eModifier); pp_uint32 getKeyModifier(); enum EEventDescriptor { eInvalid = 0, eLMouseDown, eLMouseUp, eLMouseDoubleClick, eLMouseDrag, eLMouseRepeat, eRMouseDown, eRMouseUp, eRMouseDoubleClick, eRMouseDrag, eRMouseRepeat, eMouseMoved, eMouseEntered, eMouseLeft, eMouseWheelMoved, eBarPosChanged, eBarScrollUp, eBarScrollDown, eKeyDown, eKeyChar, eKeyUp, eFileDragDropped, eFileSystemChanged, eFocusGained, eFocusLost, eFocusGainedNoRepaint, eFocusLostNoRepaint, eRemovedContextMenu, eCommand, // e.g. button pressed once eCommandRight, // e.g. right button pressed once eCommandRepeat, // e.g. button stays pressed ePreSelection, // e.g. list box selection is about to change eSelection, // e.g. list box selection has been made eValueChanged, eUpdated, eUpdateChanged, eConfirmed, // e.g. ok-press eCanceled, // e.g. cancel-press eTimer, eFullScreen, eAppQuit }; ///////////////////////////////////////////////////////////////// // Basic event class ///////////////////////////////////////////////////////////////// class PPEvent : public PPObject { private: EEventDescriptor ID; unsigned char userData[256]; pp_int32 dataSize; pp_int32 metaData; public: PPEvent() : ID(eInvalid), dataSize(0), metaData(0) { } PPEvent(EEventDescriptor ID, pp_int32 theMetaData = 0) : ID(ID), dataSize(0), metaData(theMetaData) { } PPEvent(EEventDescriptor ID, void* dataPtr, pp_int32 dSize, pp_int32 theMetaData = 0) : ID(ID), dataSize(dSize), metaData(theMetaData) { if (dSize <= (signed)sizeof(userData)) memcpy(userData, dataPtr, dataSize); else exit(0); } PPEvent(const PPEvent& event) : ID(event.ID), dataSize(event.dataSize), metaData(event.metaData) { memcpy(this->userData, event.userData, event.dataSize); } EEventDescriptor getID() const { return ID; } const void* getDataPtr() const { return userData; } pp_int32 getDataSize() const { return dataSize; } pp_int32 getMetaData() const { return metaData; } void cancel() { ID = eInvalid; } bool isMouseEvent() const { switch (ID) { case eLMouseDown: case eLMouseUp: case eLMouseDoubleClick: case eLMouseDrag: case eLMouseRepeat: case eRMouseDown: case eRMouseUp: case eRMouseDoubleClick: case eRMouseDrag: case eRMouseRepeat: case eMouseMoved: case eMouseEntered: case eMouseLeft: case eMouseWheelMoved: return true; } return false; } }; ///////////////////////////////////////////////////////////////// // Interface for EventListenerInterface ///////////////////////////////////////////////////////////////// class EventListenerInterface : public PPObject { public: virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event) = 0; }; enum { PP_MESSAGEBOX_BUTTON_YES = 31000, PP_MESSAGEBOX_BUTTON_OK = 31000, PP_MESSAGEBOX_BUTTON_NO = 31001, PP_MESSAGEBOX_BUTTON_CANCEL = 31002, PP_MESSAGEBOX_BUTTON_USER1 = 31003, PP_MESSAGEBOX_BUTTON_USER2 = 31004, PP_MESSAGEBOX_BUTTON_USER3 = 31005, PP_MESSAGEBOX_BUTTON_USER4 = 31006, PP_MESSAGEBOX_BUTTON_USER5 = 31007, PP_MESSAGEBOX_BUTTON_USER6 = 31008, PP_MESSAGEBOX_BUTTON_USER7 = 31009, PP_MESSAGEBOX_BUTTON_USER8 = 31010, PP_MESSAGEBOX_BUTTON_USER9 = 31011, PP_MESSAGEBOX_BUTTON_USER10 = 31012, PP_MESSAGEBOX_BUTTON_USER11 = 31013, PP_MESSAGEBOX_BUTTON_USER12 = 31014, PP_MESSAGEBOX_BUTTON_USER13 = 31015, PP_MESSAGEBOX_BUTTON_USER14 = 31016, PP_MESSAGEBOX_BUTTON_USER15 = 31017, PP_DEFAULT_ID = 0x12345678 }; class DialogResponder { public: virtual pp_int32 ActionOkay(PPObject* sender) { return 0; } virtual pp_int32 ActionCancel(PPObject* sender) { return 0; } virtual pp_int32 ActionNo(PPObject* sender) { return 0; } virtual pp_int32 ActionUser1(PPObject* sender) { return 0; } virtual pp_int32 ActionUser2(PPObject* sender) { return 0; } virtual pp_int32 ActionUser3(PPObject* sender) { return 0; } virtual pp_int32 ActionUser4(PPObject* sender) { return 0; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/SimpleVector.h0000644000175000017500000001163111150223367020756 0ustar admin2admin2/* * ppui/SimpleVector.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef SIMPLEVECTOR__H #define SIMPLEVECTOR__H #include "BasicTypes.h" template class PPSimpleVector { private: pp_int32 numValuesAllocated; Type** values; pp_int32 numValues; bool destroy; void reallocate() { Type** values = new Type*[numValuesAllocated]; for (pp_int32 i = 0; i < numValues; i++) { values[i] = this->values[i]; } delete[] this->values; this->values = values; } // no copy construction please PPSimpleVector(const PPSimpleVector&); PPSimpleVector& operator=(const PPSimpleVector&); public: PPSimpleVector(pp_int32 initialSize = 0, bool destroy = true) { this->destroy = destroy; if (initialSize == 0) initialSize = 16; numValuesAllocated = initialSize; if (initialSize) values = new Type*[initialSize]; else values = 0; numValues = 0; } ~PPSimpleVector() { if (values) { if (destroy) for (pp_int32 i = 0; i < numValues; i++) delete values[i]; delete[] values; } } PPSimpleVector* const clone() { PPSimpleVector* clonedVector = new PPSimpleVector(numValuesAllocated, true); for (pp_int32 i = 0; i < numValues; i++) { clonedVector->values[i] = new Type(*values[i]); } clonedVector->numValues = numValues; return clonedVector; } void clear() { if (values) { if (destroy) for (pp_int32 i = 0; i < numValues; i++) delete values[i]; numValues = 0; } } Type* removeNoDestroy(pp_int32 index) { if (!numValues) return NULL; if (index < 0 || index >= numValues) return NULL; Type* result = values[index]; for (pp_int32 i = index; i < numValues-1; i++) values[i] = values[i+1]; numValues--; if (numValuesAllocated - numValues > 16) { numValuesAllocated-=16; reallocate(); } return result; } bool remove(pp_int32 index) { if (!numValues) return false; if (index < 0 || index >= numValues) return false; if (destroy) delete values[index]; for (pp_int32 i = index; i < numValues-1; i++) values[i] = values[i+1]; numValues--; if (numValuesAllocated - numValues > 16) { numValuesAllocated-=16; reallocate(); } return true; } void add(Type* value) { if (numValues >= numValuesAllocated) { numValuesAllocated += 16; reallocate(); } values[numValues++] = value; } // handle with care void replace(pp_int32 index, Type* value) { if (index < 0 || index >= numValues) return; if (destroy) delete values[index]; values[index] = value; } Type* get(pp_int32 index) const { if (index < numValues) { return values[index]; } else return 0; } pp_int32 size() const { return numValues; } bool isEmpty() const { return numValues == 0; } // -- sorting -------------------------------------------------------------- struct SortRule { virtual pp_int32 compare(const Type& left, const Type& right) const = 0; }; private: static pp_int32 partition(Type** a, pp_int32 left, pp_int32 right, const SortRule& sortRule, bool descending = false) { const pp_int32 sign = descending ? -1 : 1; pp_int32 first=left, pivot=right--; while(left<=right) { while(sortRule.compare(*a[left], *a[pivot])*sign < 0/*a[left]=first)&&(sortRule.compare(*a[right], *a[pivot])*sign >= 0/*a[right]>=a[pivot]*/)) right--; if(left=right) return; p = partition(array, left, right, sortRule, descending); sortInternal(array, left,p-1, sortRule, descending); sortInternal(array, p+1, right, sortRule, descending); } public: void sort(const SortRule& sortRule, pp_int32 l = 0, pp_int32 r = -1, const bool descending = false) { if (r == -1) r = size()-1; // no need to sort if (l == 0 && r <= 1) return; sortInternal(values, l, r, sortRule, descending); } }; #endif milkytracker-0.90.85+dfsg/src/ppui/KeyBindings.h0000644000175000017500000000374611150223367020560 0ustar admin2admin2/* * ppui/KeyBindings.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * KeyBindings.h * MilkyTracker * * Created by Peter Barth on Sat Mar 12 2005. * */ #ifndef KEYBINDINGS__H #define KEYBINDINGS__H #include "BasicTypes.h" template class PPKeyBindings { private: struct TKeyBinding { pp_uint16 keyCode; pp_uint32 keyModifier; Type handlerFunc; }; TKeyBinding bindings[256]; pp_uint32 currentBindingIndex; public: PPKeyBindings() : currentBindingIndex(0) { memset(bindings, 0, sizeof(bindings)); } void addBinding(pp_uint16 keyCode, pp_uint32 keyModifier, Type handlerFunc) { if (currentBindingIndex < sizeof(bindings)/sizeof(TKeyBinding)) { bindings[currentBindingIndex].keyCode = keyCode; bindings[currentBindingIndex].keyModifier = keyModifier; bindings[currentBindingIndex].handlerFunc = handlerFunc; currentBindingIndex++; } } bool getBinding(pp_uint16 keyCode, pp_uint32 keyModifier, Type& handlerFunc) const { pp_int32 i = 0; while (bindings[i].handlerFunc && i < (signed)currentBindingIndex) { if (bindings[i].keyCode == keyCode && (bindings[i].keyModifier == 0xFFFF || bindings[i].keyModifier == keyModifier)) { handlerFunc = bindings[i].handlerFunc; return true; } i++; } return false; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/VirtualKeys.h0000644000175000017500000000730011150223367020622 0ustar admin2admin2/* * ppui/VirtualKeys.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * VirtualKeys.h * MilkyTracker * * Created by Peter Barth on Fri Feb 25 2005. * */ #ifndef VIRTUALKEYS__H #define VIRTUALKEYS__H // These might look familiar to windows programmers ;) enum { VK_UNDEFINED = 0x00, VK_LBUTTON = 0x01, VK_RBUTTON = 0x02, VK_CANCEL = 0x03, VK_MBUTTON = 0x04, VK_BACK = 0x08, VK_TAB = 0x09, VK_CLEAR = 0x0C, VK_RETURN = 0x0D, VK_SHIFT = 0x10, VK_CONTROL = 0x11, VK_MENU = 0x12, VK_PAUSE = 0x13, VK_CAPITAL = 0x14, VK_KANA = 0x15, VK_HANGEUL = 0x15 , VK_HANGUL = 0x15, VK_JUNJA = 0x17, VK_FINAL = 0x18, VK_HANJA = 0x19, VK_KANJI = 0x19, VK_ESCAPE = 0x1B, VK_CONVERT = 0x1C, VK_NONCONVERT = 0x1D, VK_ACCEPT = 0x1E, VK_MODECHANGE = 0x1F, VK_SPACE = 0x20, VK_PRIOR = 0x21, VK_NEXT = 0x22, VK_END = 0x23, VK_HOME = 0x24, VK_LEFT = 0x25, VK_UP = 0x26, VK_RIGHT = 0x27, VK_DOWN = 0x28, VK_SELECT = 0x29, VK_PRINT = 0x2A, VK_EXECUTE = 0x2B, VK_SNAPSHOT = 0x2C, VK_INSERT = 0x2D, VK_DELETE = 0x2E, VK_HELP = 0x2F, VK_LWIN = 0x5B, VK_RWIN = 0x5C, VK_APPS = 0x5D, VK_NUMPAD0 = 0x60, VK_NUMPAD1 = 0x61, VK_NUMPAD2 = 0x62, VK_NUMPAD3 = 0x63, VK_NUMPAD4 = 0x64, VK_NUMPAD5 = 0x65, VK_NUMPAD6 = 0x66, VK_NUMPAD7 = 0x67, VK_NUMPAD8 = 0x68, VK_NUMPAD9 = 0x69, VK_MULTIPLY = 0x6A, VK_ADD = 0x6B, VK_SEPARATOR = 0x6C, VK_SUBTRACT = 0x6D, VK_DECIMAL = 0x6E, VK_DIVIDE = 0x6F, VK_F1 = 0x70, VK_F2 = 0x71, VK_F3 = 0x72, VK_F4 = 0x73, VK_F5 = 0x74, VK_F6 = 0x75, VK_F7 = 0x76, VK_F8 = 0x77, VK_F9 = 0x78, VK_F10 = 0x79, VK_F11 = 0x7A, VK_F12 = 0x7B, VK_F13 = 0x7C, VK_F14 = 0x7D, VK_F15 = 0x7E, VK_F16 = 0x7F, VK_F17 = 0x80, VK_F18 = 0x81, VK_F19 = 0x82, VK_F20 = 0x83, VK_F21 = 0x84, VK_F22 = 0x85, VK_F23 = 0x86, VK_F24 = 0x87, VK_NUMLOCK = 0x90, VK_SCROLL = 0x91, VK_LSHIFT = 0xA0, VK_RSHIFT = 0xA1, VK_LCONTROL = 0xA2, VK_RCONTROL = 0xA3, VK_LMENU = 0xA4, VK_RMENU = 0xA5, VK_OEM_3 = 0xC0, VK_OEM_102 = 0xE2, VK_PROCESSKEY = 0xE5, VK_ATTN = 0xF6, VK_CRSEL = 0xF7, VK_EXSEL = 0xF8, VK_EREOF = 0xF9, VK_PLAY = 0xFA, VK_ZOOM = 0xFB, VK_NONAME = 0xFC, VK_PA1 = 0xFD, VK_OEM_CLEAR = 0xFE, VK_ALT = 0xFF }; #endif milkytracker-0.90.85+dfsg/src/ppui/UndoStack.h0000644000175000017500000001164111150223367020236 0ustar admin2admin2/* * ppui/UndoStack.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * UndoStack.h * MilkyTracker * * Created by Peter Barth on 14.03.06. * */ #ifndef __UNDOSTACK_H__ #define __UNDOSTACK_H__ #include "BasicTypes.h" //--- Undo-stack ------------------------------------------------------------ // The undo stack works like this: // // /--<--< New Entry pushed: Stack is full? => bottom element will be removed // | and all elements will be moved // | one step down and the new element // |###| is placed on top // |###| | // |###| | // |###| \!/ // |###| // | // \-->--> /dev/null :) (bottom element will be deleted) template class PPUndoStack { private: enum { DEFAULTSTACKSIZE = 1024 }; // Our stacksize pp_int32 m_nStackSize; // our stack type** m_pUndoStack; // index of current stack entry pp_int32 m_nCurIndex; // index of last valid stack entry pp_int32 m_nTopIndex; // stack has overflowed and bottom elements have been removed bool m_bOverflow; public: //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : Construction: Create clean empty stack //--------------------------------------------------------------------------- PPUndoStack(pp_int32 nStackSize = DEFAULTSTACKSIZE) { // Remember size m_nStackSize = nStackSize; // create stack containing empty entries m_pUndoStack = new type*[nStackSize+1]; for (pp_int32 i = 0; i < nStackSize+1; i++) m_pUndoStack[i] = NULL; // empty stack m_nCurIndex = -1; m_nTopIndex = 0; // hasn't overflowed yet m_bOverflow = false; } //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : Destruction //--------------------------------------------------------------------------- ~PPUndoStack() { for (pp_int32 i = 0; i < m_nStackSize; i++) if (m_pUndoStack[i]) delete m_pUndoStack[i]; delete[] m_pUndoStack; } //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : Save entry on stack //--------------------------------------------------------------------------- void Push(const type& stackEntry) { // does new entry fit onto stack? if (m_nCurIndex < m_nStackSize-1) { // current index always points to the last entry m_nCurIndex++; } // nope, kill bottom entry and move content else { // delete first entry delete m_pUndoStack[0]; // move references for (pp_int32 i = 0; i <= m_nCurIndex; i++) m_pUndoStack[i] = m_pUndoStack[i+1]; m_bOverflow = true; } // make sure we don't leak something here if (m_pUndoStack[m_nCurIndex]) delete m_pUndoStack[m_nCurIndex]; // new entry m_pUndoStack[m_nCurIndex] = new type(stackEntry); m_nTopIndex = m_nCurIndex; } //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : Get entry from stack (only by pointer) //--------------------------------------------------------------------------- const type* Pop() { // anything on stack yet? if (m_nCurIndex>=0) { // get entry return m_pUndoStack[m_nCurIndex--]; /*type* pStackEntry = m_pUndoStack[m_nCurIndex]; // decrease stackpointer m_nCurIndex--; return pStackEntry;*/ } else { return NULL; } } //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : Get superimposed entry if possible (Redo) //--------------------------------------------------------------------------- const type* Advance() { // Nothing on stack if (m_nTopIndex == 0) { return NULL; } // Redo possible? if (m_nCurIndex. * */ #include "ScrollBar.h" #include "GraphicsAbstract.h" #include "Button.h" #include "Event.h" #include "Screen.h" #include "Seperator.h" class SliderButton : public PPButton { private: bool horizontal; bool up; public: SliderButton(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, PPPoint location, PPSize size, bool horiz = true, bool up = true) : PPButton(id, parentScreen, eventListener, location, size, false, true, true), horizontal(horiz), up(up) { } virtual void paint(PPGraphicsAbstract* g) { if (!isVisible()) return; PPButton::paint(g); g->setColor(0,0,0); PPPoint location = this->location; if (isPressed()) { location.x++; location.y++; } PPSize b = getSize(); // draw fancy triangles if (up) { const pp_int32 size = (b.width>>1)-2; const pp_int32 xo = ((b.width >> 1) - size)-1; const pp_int32 yo = ((b.width >> 1) - (size>>1))-1; for (pp_int32 j = 0; j <= size; j++) for (pp_int32 i = 0; i < (size*2+1)-j*2; i++) { pp_int32 x = i+j, y = j; if (horizontal) g->setPixel(size-y+yo+location.x, x+xo+location.y); else g->setPixel(x+xo+location.x, size-y+yo+location.y); } } else { const pp_int32 size = (b.width>>1)-2; const pp_int32 xo = ((b.width >> 1) - size)-1; const pp_int32 yo = ((b.width >> 1) - (size>>1))-1; for (pp_int32 j = 0; j <= size; j++) for (pp_int32 i = 0; i < (size*2+1)-j*2; i++) { pp_int32 x = i+j, y = j; if (horizontal) g->setPixel(y+yo+location.x, x+xo+location.y); else g->setPixel(x+xo+location.x, y+yo+location.y); } } } }; class SliderBarButton : public PPButton { private: PPSeperator* seperators[3]; bool horizontal; public: SliderBarButton(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, PPPoint location, PPSize size, bool border = true, bool clickable = true, bool update = true, bool horiz = true) : PPButton(id, parentScreen, eventListener, location, size, border, clickable, update), horizontal(horiz) { seperators[0] = new PPSeperator(0, parentScreen, PPPoint(0, 0), SCROLLBUTTONSIZE - 6, *getColor(), !horizontal); seperators[1] = new PPSeperator(0, parentScreen, PPPoint(0, 0), SCROLLBUTTONSIZE - 6, *getColor(), !horizontal); seperators[2] = new PPSeperator(0, parentScreen, PPPoint(0, 0), SCROLLBUTTONSIZE - 6, *getColor(), !horizontal); } virtual ~SliderBarButton() { delete seperators[0]; delete seperators[1]; delete seperators[2]; } virtual void paint(PPGraphicsAbstract* g) { if (!isVisible()) return; PPButton::paint(g); if ((horizontal && getSize().width < 20) || (!horizontal && getSize().height < 20)) return; PPPoint p(horizontal ? getLocation().x + getSize().width / 2 - 4 : getLocation().x + 2, horizontal ? getLocation().y + 2 : getLocation().y + getSize().height / 2 - 3); if (isPressed()) { p.x++; p.y++; } for (pp_int32 i = 0; i < 3; i++) { seperators[0]->setLocation(p); seperators[0]->paint(g); if (horizontal) p.x+=3; else p.y+=2; } } }; void PPScrollbar::initButtons() { PPPoint buttonDownPos, buttonBarPos; PPSize buttonBarSize; if (horizontal) { this->size.height = SCROLLBUTTONSIZE; this->size.width = oneDimSize; buttonDownPos = PPPoint(location.x + oneDimSize - SCROLLBUTTONSIZE, location.y); buttonBarPos = PPPoint(location.x + SCROLLBUTTONSIZE, location.y); buttonBarSize = PPSize((oneDimSize - SCROLLBUTTONSIZE*2), SCROLLBUTTONSIZE); } else { this->size.width = SCROLLBUTTONSIZE; this->size.height = oneDimSize; buttonDownPos = PPPoint(location.x, location.y + oneDimSize - SCROLLBUTTONSIZE); buttonBarPos = PPPoint(location.x, location.y + SCROLLBUTTONSIZE); buttonBarSize = PPSize(SCROLLBUTTONSIZE, (oneDimSize - SCROLLBUTTONSIZE*2)); } backgroundButton = new PPButton(0, parentScreen, NULL, /*_Point(location.x + (horizontal?0:1), location.y + (horizontal?1:0))*/location, this->size, false); backgroundButton->setColor(backgroundColor); backgroundButton->setInvertShading(true); buttonUp = new SliderButton(0, parentScreen, this, location, PPSize(SCROLLBUTTONSIZE,SCROLLBUTTONSIZE), horizontal, true); buttonDown = new SliderButton(0, parentScreen, this, buttonDownPos , PPSize(SCROLLBUTTONSIZE,SCROLLBUTTONSIZE), horizontal, false); buttonBar = new SliderBarButton(0, parentScreen, this, buttonBarPos, buttonBarSize, false, false, true, horizontal); setBarSize(currentBarSize); setBarPosition(currentBarPosition); } PPScrollbar::PPScrollbar(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, pp_int32 size, bool horizontal) : PPControl(id, parentScreen, eventListener, location, PPSize(0,0)), oneDimSize(size), horizontal(horizontal), controlCaughtByLMouseButton(false), controlCaughtByRMouseButton(false), currentBarSize(65536), currentBarPosition(0) { // default color backgroundColor.r = 32; backgroundColor.g = 48; backgroundColor.b = 64; initButtons(); caughtControl = NULL; } PPScrollbar::~PPScrollbar() { delete backgroundButton; delete buttonUp; delete buttonDown; delete buttonBar; } void PPScrollbar::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; backgroundButton->paint(g); buttonDown->paint(g); buttonUp->paint(g); buttonBar->paint(g); } void PPScrollbar::setBarSize(pp_int32 size, bool repaint /* = true */) { if (size < 0) size = 0; if (size > 65536) size = 65536; currentBarSize = size; pp_int32 newSize = (((horizontal?this->size.width:this->size.height) - SCROLLBUTTONSIZE*2) * size)>>16; if (horizontal) { buttonBar->setSize(PPSize(newSize, this->size.height)); } else { buttonBar->setSize(PPSize(this->size.width, newSize)); } if (repaint) parentScreen->paintControl(this); } void PPScrollbar::setBarPosition(pp_int32 pos, bool repaint /* = true */) { if (pos < 0) pos = 0; if (pos > 65536) pos = 65536; currentBarPosition = pos; pp_int32 size = (horizontal?buttonBar->getSize().width:buttonBar->getSize().height); pp_int32 entireSize = (horizontal?this->size.width:this->size.height) - SCROLLBUTTONSIZE*2; pp_int32 maxPos = entireSize-size; pp_int32 newPos = (maxPos*pos)>>16; PPPoint p = location; if (horizontal) p.x+=newPos + SCROLLBUTTONSIZE; else p.y+=newPos + SCROLLBUTTONSIZE; buttonBar->setLocation(p); if (repaint) parentScreen->paintControl(this); } pp_int32 PPScrollbar::dispatchEvent(PPEvent* event) { //if (!visible) // return 0; switch (event->getID()) { case eLMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (buttonUp->hit(*p)) { caughtControl = buttonUp; caughtControl->dispatchEvent(event); controlCaughtByLMouseButton = true; } else if (buttonDown->hit(*p)) { caughtControl = buttonDown; caughtControl->dispatchEvent(event); controlCaughtByLMouseButton = true; } else if (buttonBar->hit(*p)) { caughtControl = buttonBar; // ------------------------- buttonBar->setPressed(true); parentScreen->paintControl(buttonBar); // ------------------------- caughtMouseLocation = *p; caughtControlLocation = buttonBar->getLocation(); caughtControl->dispatchEvent(event); controlCaughtByLMouseButton = true; } else if (backgroundButton->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } break; } case eLMouseUp: controlCaughtByLMouseButton = false; if (caughtControl == NULL) break; if (controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); break; } // ------------------------- if (reinterpret_cast(caughtControl) == buttonBar) { buttonBar->setPressed(false); parentScreen->paintControl(buttonBar); } // ------------------------- caughtControl->dispatchEvent(event); caughtControl = NULL; break; case eLMouseRepeat: { if (caughtControl) { caughtControl->dispatchEvent(event); break; } else { PPPoint* p = (PPPoint*)event->getDataPtr(); /*if (backgroundButton->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } PPPoint* p = (PPPoint*)event->getDataPtr();*/ if (backgroundButton->hit(*p) && !buttonBar->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } else if (buttonBar->hit(*p)) { // ------------------------- buttonBar->setPressed(true); parentScreen->paintControl(buttonBar); // ------------------------- caughtControl = buttonBar; caughtMouseLocation = *p; caughtControlLocation = buttonBar->getLocation(); caughtControl->dispatchEvent(event); } } break; } case eRMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (buttonUp->hit(*p)) { caughtControl = buttonUp; caughtControl->dispatchEvent(event); controlCaughtByRMouseButton = true; } else if (buttonDown->hit(*p)) { caughtControl = buttonDown; caughtControl->dispatchEvent(event); controlCaughtByRMouseButton = true; } else if (buttonBar->hit(*p)) { caughtControl = buttonBar; // ------------------------- buttonBar->setPressed(true); parentScreen->paintControl(buttonBar); // ------------------------- caughtMouseLocation = *p; caughtControlLocation = buttonBar->getLocation(); caughtControl->dispatchEvent(event); controlCaughtByRMouseButton = true; } else if (backgroundButton->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } break; } case eRMouseUp: controlCaughtByRMouseButton = false; if (caughtControl == NULL) break; if (controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } // ------------------------- if (reinterpret_cast(caughtControl) == buttonBar) { buttonBar->setPressed(false); parentScreen->paintControl(buttonBar); } // ------------------------- caughtControl->dispatchEvent(event); caughtControl = NULL; break; case eRMouseRepeat: { if (caughtControl) { caughtControl->dispatchEvent(event); break; } else { /*PPPoint* p = (PPPoint*)event->getDataPtr(); if (backgroundButton->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); }*/ PPPoint* p = (PPPoint*)event->getDataPtr(); if (backgroundButton->hit(*p) && !buttonBar->hit(*p)) { handleEvent(reinterpret_cast(backgroundButton), event); } else if (buttonBar->hit(*p)) { // ------------------------- buttonBar->setPressed(true); parentScreen->paintControl(buttonBar); // ------------------------- caughtControl = buttonBar; caughtMouseLocation = *p; caughtControlLocation = buttonBar->getLocation(); caughtControl->dispatchEvent(event); } } break; } //case eLMouseDrag: default: if (caughtControl == NULL) break; caughtControl->dispatchEvent(event); break; } return 0; } pp_int32 PPScrollbar::handleEvent(PPObject* sender, PPEvent* event) { if ( (event->getID() == eLMouseUp && sender == reinterpret_cast(buttonUp)) || (event->getID() == eLMouseRepeat && sender == reinterpret_cast(buttonUp)) || (event->getID() == eRMouseUp && sender == reinterpret_cast(buttonUp)) || (event->getID() == eRMouseRepeat && sender == reinterpret_cast(buttonUp)) ) { // Call parent event listener PPEvent e(eBarScrollUp); return eventListener->handleEvent(reinterpret_cast(this), &e); } if ( (event->getID() == eLMouseUp && sender == reinterpret_cast(buttonDown)) || (event->getID() == eLMouseRepeat && sender == reinterpret_cast(buttonDown)) || (event->getID() == eRMouseUp && sender == reinterpret_cast(buttonDown)) || (event->getID() == eRMouseRepeat && sender == reinterpret_cast(buttonDown)) ) { // Call parent event listener PPEvent e(eBarScrollDown); return eventListener->handleEvent(reinterpret_cast(this), &e); } else if (/*event->getID() == eLMouseDown &&*/ sender == reinterpret_cast(backgroundButton)) { if (horizontal) { PPPoint* p = (PPPoint*)event->getDataPtr(); if (p->x < buttonBar->getLocation().x) { pp_int32 bsize = buttonBar->getSize().width; pp_int32 entireSize = size.width - SCROLLBUTTONSIZE*2; float f = (float)entireSize/(float)(entireSize - bsize); currentBarPosition-=(pp_int32)(currentBarSize*f); if (currentBarPosition < 0) currentBarPosition = 0; setBarPosition(currentBarPosition); // Call parent event listener PPEvent e(eBarPosChanged); return eventListener->handleEvent(reinterpret_cast(this), &e); } else if (p->x > buttonBar->getLocation().x + buttonBar->getSize().width) { pp_int32 bsize = buttonBar->getSize().width; pp_int32 entireSize = size.width - SCROLLBUTTONSIZE*2; float f = (float)entireSize/(float)(entireSize - bsize); currentBarPosition+=(pp_int32)(currentBarSize*f); if (currentBarPosition > 65536) currentBarPosition = 65536; setBarPosition(currentBarPosition); // Call parent event listener PPEvent e(eBarPosChanged); return eventListener->handleEvent(reinterpret_cast(this), &e); } } else { PPPoint* p = (PPPoint*)event->getDataPtr(); if (p->y < buttonBar->getLocation().y) { pp_int32 bsize = buttonBar->getSize().height; pp_int32 entireSize = size.height - SCROLLBUTTONSIZE*2; float f = (float)entireSize/(float)(entireSize - bsize); currentBarPosition-=(pp_int32)(currentBarSize*f); if (currentBarPosition < 0) currentBarPosition = 0; setBarPosition(currentBarPosition); // Call parent event listener PPEvent e(eBarPosChanged); return eventListener->handleEvent(reinterpret_cast(this), &e); } else if (p->y > buttonBar->getLocation().y + buttonBar->getSize().height) { pp_int32 bsize = buttonBar->getSize().height; pp_int32 entireSize = size.height - SCROLLBUTTONSIZE*2; float f = (float)entireSize/(float)(entireSize - bsize); currentBarPosition+=(pp_int32)(currentBarSize*f); if (currentBarPosition > 65536) currentBarPosition = 65536; setBarPosition(currentBarPosition); // Call parent event listener PPEvent e(eBarPosChanged); return eventListener->handleEvent(reinterpret_cast(this), &e); } } } else if ((event->getID() == eLMouseDrag && sender == reinterpret_cast(buttonBar)) || (event->getID() == eRMouseDrag && sender == reinterpret_cast(buttonBar))) { PPPoint* p = (PPPoint*)event->getDataPtr(); pp_int32 pos = 0,dx,nx; if (horizontal) { dx = (p->x - caughtMouseLocation.x); /*if (dx < 0) { __asm { int 3 } }*/ nx = caughtControlLocation.x + dx; //if (nx < location.x + SCROLLBUTTONSIZE) // nx = location.x + SCROLLBUTTONSIZE; //if (nx > location.x + size.width - SCROLLBUTTONSIZE*2 - buttonBar->getSize().width) // nx = location.x + size.width - SCROLLBUTTONSIZE*2 - buttonBar->getSize().width; nx-=(location.x + SCROLLBUTTONSIZE); pp_int32 d = (size.width - buttonBar->getSize().width - SCROLLBUTTONSIZE*2); if (d != 0) pos = nx*65536 / d; } else { dx = (p->y - caughtMouseLocation.y); /*if (dx < 0) { __asm { int 3 } }*/ nx = caughtControlLocation.y + dx; //if (nx < location.x + SCROLLBUTTONSIZE) // nx = location.x + SCROLLBUTTONSIZE; //if (nx > location.x + size.width - SCROLLBUTTONSIZE*2 - buttonBar->getSize().width) // nx = location.x + size.width - SCROLLBUTTONSIZE*2 - buttonBar->getSize().width; nx-=(location.y + SCROLLBUTTONSIZE); pp_int32 d = (size.height - buttonBar->getSize().height - SCROLLBUTTONSIZE*2); if (d != 0) pos = nx*65536 / d; } setBarPosition(pos); // Call parent event listener PPEvent e(eBarPosChanged); return eventListener->handleEvent(reinterpret_cast(this), &e); } return 0; } void PPScrollbar::setLocation(const PPPoint& location) { PPControl::setLocation(location); delete backgroundButton; delete buttonUp; delete buttonDown; delete buttonBar; initButtons(); } void PPScrollbar::setSize(pp_uint32 size) { PPPoint buttonDownPos, buttonBarPos; PPSize buttonBarSize; if (horizontal) { this->size.height = SCROLLBUTTONSIZE; this->size.width = size; buttonDownPos = PPPoint(location.x + size - SCROLLBUTTONSIZE, location.y); buttonBarPos = PPPoint(location.x + SCROLLBUTTONSIZE, location.y); buttonBarSize = PPSize((size - SCROLLBUTTONSIZE*2), SCROLLBUTTONSIZE); } else { this->size.width = SCROLLBUTTONSIZE; this->size.height = size; buttonDownPos = PPPoint(location.x, location.y + size - SCROLLBUTTONSIZE); buttonBarPos = PPPoint(location.x, location.y + SCROLLBUTTONSIZE); buttonBarSize = PPSize(SCROLLBUTTONSIZE, (size - SCROLLBUTTONSIZE*2)); } backgroundButton->setLocation(location); backgroundButton->setSize(this->size); buttonUp->setLocation(location); buttonDown->setLocation(buttonDownPos); } milkytracker-0.90.85+dfsg/src/ppui/BasicTypes.h0000644000175000017500000002773411150223367020423 0ustar admin2admin2/* * ppui/BasicTypes.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef BASICTYPES__H #define BASICTYPES__H typedef unsigned char pp_uint8; typedef signed char pp_int8; typedef unsigned short pp_uint16; typedef signed short pp_int16; typedef unsigned int pp_uint32; typedef signed int pp_int32; #include "ScanCodes.h" #if defined(WIN32) || defined(_WIN32_WCE) #include #include #define VK_ALT 0xFF #define __PPUI_WINDOWS__ #endif #if !defined(__PPUI_WINDOWS__) #include #include #include #include #include "VirtualKeys.h" #include "PPSystemString_POSIX.h" #endif #if defined(__PPUI_WINDOWS__) && defined(UNICODE) #include "PPSystemString_WIN32.h" #else #define PPSystemString PPString #endif #ifdef __GNUC__ typedef long long pp_int64; #else typedef __int64 pp_int64; #endif #ifndef VK_OEM_3 #define VK_OEM_3 0xC0 #endif #ifndef VK_OEM_102 #define VK_OEM_102 0xC0 #endif // Little helper macro #define PPSTR_PERIODS "\xef" // ------ This has to be defined somewhere ------ pp_uint32 PPGetTickCount(); struct PPPoint { pp_int32 x, y; PPPoint(pp_int32 theX, pp_int32 theY) : x(theX), y(theY) {} PPPoint() {} }; struct PPSize { pp_int32 width, height; PPSize(pp_int32 theWidth, pp_int32 theHeight) : width(theWidth), height(theHeight) {} PPSize() {} bool operator==(const PPSize& source) const { return (width == source.width && height == source.height); } bool operator!=(const PPSize& source) const { return !(width == source.width && height == source.height); } bool match(pp_int32 width, pp_int32 height) const { return (this->width == width && this->height == height); } }; struct PPRect { pp_int32 x1, y1, x2, y2; PPRect(pp_int32 px1, pp_int32 py1, pp_int32 px2, pp_int32 py2) : x1(px1), y1(py1), x2(px2), y2(py2) {} PPRect() {} pp_int32 width() const { return x2-x1; } pp_int32 height() const { return y2-y1; } void scale(pp_int32 scaleFactor) { x1 *= scaleFactor; y1 *= scaleFactor; x2 *= scaleFactor; y2 *= scaleFactor; } bool intersect(const PPRect& rc) const { pp_int32 left1, left2; pp_int32 right1, right2; pp_int32 top1, top2; pp_int32 bottom1, bottom2; left1 = this->x1; left2 = rc.x1; right1 = this->x1 + this->width(); right2 = rc.x1 + rc.width(); top1 = this->y1; top2 = rc.y1; bottom1 = this->y1 + this->height(); bottom2 = rc.y1 + rc.height(); if (bottom1 < top2) return false; if (top1 > bottom2) return false; if (right1 < left2) return false; if (left1 > right2) return false; return true; } }; struct PPColor { pp_int32 r,g,b; PPColor(pp_int32 red, pp_int32 green, pp_int32 blue) : r(red), g(green), b(blue) {} PPColor() {} void validate() { if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; } void scale(float f) { r = (pp_int32)((float)r*f); g = (pp_int32)((float)g*f); b = (pp_int32)((float)b*f); validate(); } void scale(float fr, float fg, float fb) { r = (pp_int32)((float)r*fr); g = (pp_int32)((float)g*fg); b = (pp_int32)((float)b*fb); validate(); } void scaleFixed(pp_int32 f) { r = (r*f)>>16; g = (g*f)>>16; b = (b*f)>>16; validate(); } void interpolateFixed(const PPColor& col, pp_int32 f) { r = (f*r + col.r*(65536-f)) >> 16; g = (f*g + col.g*(65536-f)) >> 16; b = (f*b + col.b*(65536-f)) >> 16; validate(); } PPColor invert() const { PPColor c(255-r, 255-g, 255-b); return c; } void set(pp_int32 red, pp_int32 green, pp_int32 blue) { r = red; g = green; b = blue; } void clamp() { if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; validate(); } void operator+=(const PPColor& source) { r+=source.r; g+=source.g; b+=source.b; validate(); } bool operator==(const PPColor& source) const { return (r == source.r && g == source.g && b == source.b); } bool operator!=(const PPColor& source) const { return !(r == source.r && g == source.g && b == source.b); } }; #ifdef WIN32 #define STRINGCOMPARE_NOCASE(left, right) _stricmp(left, right) #else #define STRINGCOMPARE_NOCASE(left, right) strcasecmp(left, right) #endif // C-String wrapper class PPString { private: char* strBuffer; pp_uint32 allocatedSize; void reAlloc(pp_uint32 newSize) { if (newSize <= allocatedSize) return; char* newStrBuffer = new char[newSize]; memcpy(newStrBuffer, strBuffer, allocatedSize); delete[] strBuffer; strBuffer = newStrBuffer; allocatedSize = newSize; } public: // Empty string PPString() : strBuffer(new char[8]), allocatedSize(8) { *strBuffer = 0; } // String from single character PPString(char c) : strBuffer(new char[8]), allocatedSize(8) { *strBuffer = c; *(strBuffer+1) = 0; } PPString(const char* str) : strBuffer(new char[strlen(str) + 1]), allocatedSize((pp_uint32)strlen(str) + 1) { strcpy(strBuffer, str); } PPString(const char* str, pp_uint32 length) : strBuffer(new char[length + 1]), allocatedSize(length + 1) { memcpy(strBuffer, str, length); strBuffer[length] = 0; } // copy c'tor PPString(const PPString& str) : strBuffer(new char[str.allocatedSize]), allocatedSize(str.allocatedSize) { memcpy(strBuffer, str.strBuffer, str.allocatedSize); } operator const char*() const { return strBuffer; } const char* getStrBuffer() const { return strBuffer; } // assignment operator PPString& operator=(const PPString& str) { if (this != &str) { if (str.allocatedSize <= allocatedSize) { memcpy(strBuffer, str.strBuffer, str.allocatedSize); } else { delete[] strBuffer; strBuffer = new char[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize); allocatedSize = str.allocatedSize; } } return *this; } PPString& operator=(const char* str) { pp_uint32 len = (unsigned)strlen(str)+1; if (len <= allocatedSize) { strcpy(strBuffer, str); } else { delete[] strBuffer; strBuffer = new char[len]; strcpy(strBuffer, str); allocatedSize = len; } return *this; } // comparison is necessary too bool operator==(const PPString& str) const { return strcmp(strBuffer, str.strBuffer) == 0; } bool operator!=(const PPString& str) const { return strcmp(strBuffer, str.strBuffer) != 0; } pp_int32 compareTo(const PPString& str) const { return strcmp(strBuffer, str.strBuffer); } pp_int32 compareToNoCase(const PPString& str) const { return STRINGCOMPARE_NOCASE(strBuffer, str.strBuffer); } bool startsWith(const PPString& str) const { if (length() < str.length()) return false; for (pp_uint32 i = 0; i < str.length(); i++) if (strBuffer[i] != str.strBuffer[i]) return false; return true; } ~PPString() { delete[] strBuffer; } pp_uint32 length() const { return (pp_uint32)strlen(strBuffer); } char charAt(pp_uint32 index) const { if (index < length()) return strBuffer[index]; return 0; } void insertAt(pp_uint32 i, const PPString& s) { // doesn't work if (i > length()) return; allocatedSize = length() + s.length() + 1; char* newStr = new char[allocatedSize]; memcpy(newStr, strBuffer, i); memcpy(newStr + i, s.strBuffer, s.length()); memcpy(newStr + i + s.length(), strBuffer + i, length() - i); newStr[length() + s.length()] = 0; delete[] strBuffer; strBuffer = newStr; } void append(const PPString& s) { insertAt(length(), s); } void deleteAt(pp_uint32 i, pp_uint32 numChars) { // not possible if (i > length()) return; // nothing to delete if ((signed)length() - (signed)numChars < 0) return; // nothing to delete if (strBuffer[i] == 0) return; allocatedSize = length() - numChars + 1; char* newStr = new char[allocatedSize]; memcpy(newStr, strBuffer, i); memcpy(newStr + i, strBuffer + i + numChars, length() - i - numChars); newStr[length() - numChars] = 0; delete[] strBuffer; strBuffer = newStr; } PPString subString(pp_uint32 leftIndex, pp_uint32 rightIndex) const { PPString newString; for (pp_uint32 i = leftIndex; i < rightIndex && i < length(); i++) newString.append(charAt(i)); return newString; } void replace(const PPString& str) { delete[] strBuffer; strBuffer = new char[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize); allocatedSize = str.allocatedSize; } pp_int32 getIntValue() const { pp_uint32 v; sscanf(strBuffer, "%d", &v); return v; } pp_int32 countLines() { pp_int32 numLines = 1; pp_int32 len = this->length(); for (pp_int32 i = 0; i < len; i++) { if (strBuffer[i] == '\n' && i != len-1) numLines++; } return numLines; } void toUpper() { for (pp_uint32 i = 0; i < length(); i++) if (strBuffer[i] >= 'a' && strBuffer[i] <= 'z') strBuffer[i] -= 'a'-'A'; } PPString stripPath() const { char* ptr = strBuffer+strlen(strBuffer); while (ptr > strBuffer && *ptr != '/' && *ptr != '\\') ptr--; if (ptr != strBuffer) ptr++; PPString str = ptr; return str; } PPString stripExtension() const { char* ptr = strBuffer+strlen(strBuffer); while (ptr > strBuffer && *ptr != '.' && *ptr != '/' && *ptr != '\\') ptr--; if (*ptr == '/' || *ptr == '\\') return strBuffer; if (ptr != strBuffer) { PPString str; delete[] str.strBuffer; str.allocatedSize = (pp_uint32)((ptr-strBuffer)+1); str.strBuffer = new char[str.allocatedSize]; memcpy(str.strBuffer, strBuffer, (ptr-strBuffer)); str.strBuffer[(ptr-strBuffer)] = '\0'; return str; } else { return ptr; } } PPString getExtension() const { char* ptr = strBuffer+strlen(strBuffer); while (ptr > strBuffer && *ptr != '.' && *ptr != '/' && *ptr != '\\') ptr--; if (*ptr != '.') return ""; return ptr; } pp_int32 compareExtensions(const PPString& str) const { char* ptrSrc = strBuffer+strlen(strBuffer); while (ptrSrc > strBuffer && *ptrSrc != '.' && *ptrSrc != '/') ptrSrc--; bool noExt1 = false; if (*ptrSrc != '.') noExt1 = true; ptrSrc++; if (*ptrSrc == '\0') noExt1 = true; char* ptrDst = str.strBuffer+strlen(str.strBuffer); while (ptrDst > str.strBuffer && *ptrDst != '.' && *ptrDst != '/') ptrDst--; if (*ptrDst != '.') return noExt1 ? 0 : 1; ptrDst++; if (*ptrDst == '\0') return noExt1 ? 0 : 1; return STRINGCOMPARE_NOCASE(ptrSrc, ptrDst); } bool compareToExtension(const PPString& extension) const { char* ptrSrc = strBuffer+strlen(strBuffer); while (ptrSrc > strBuffer && *ptrSrc != '.' && *ptrSrc != '/') ptrSrc--; if (*ptrSrc != '.') return false; ptrSrc++; if (*ptrSrc == '\0') return false; return STRINGCOMPARE_NOCASE(ptrSrc, extension.strBuffer) == 0; } void ensureTrailingCharacter(char chr) { pp_uint32 len = length(); if (len) { char* ptr = strBuffer+(len-1); if (*ptr != chr) append(chr); } } // Delete this pointer after usage char* toASCIIZ() const { char* newStr = new char[length() + 1]; strcpy(newStr, strBuffer); return newStr; } }; struct Descriptor { PPString extension; PPString description; Descriptor(const PPString& ext, const PPString& desc) : extension(ext), description(desc) { } Descriptor(const Descriptor& source) : extension(source.extension), description(source.description) { } }; #endif milkytracker-0.90.85+dfsg/src/ppui/DialogBase.h0000755000175000017500000001106311150223367020336 0ustar admin2admin2/* * ppui/DialogBase.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogBase.h * MilkyTracker * * Created by Peter Barth on 06.10.05. * */ #ifndef __DIALOGBASE_H__ #define __DIALOGBASE_H__ #include "BasicTypes.h" #include "Event.h" class PPScreen; class PPMessageBoxContainer; class PPDialogBase : public EventListenerInterface { public: enum MessageBoxTypes { MessageBox_OK, MessageBox_OKCANCEL, MessageBox_YESNOCANCEL }; private: DialogResponder* respondListener; pp_int16 keyDownInvokeKeyCode; protected: PPScreen* parentScreen; PPMessageBoxContainer* messageBoxContainerGeneric; enum { MESSAGEBOX_STATICTEXT_MAIN_CAPTION = 1, MESSAGEBOX_STATICTEXT_VALUE_ONE_CAPTION = 2, MESSAGEBOX_STATICTEXT_VALUE_TWO_CAPTION = 3, MESSAGEBOX_STATICTEXT_USER1 = 4, MESSAGEBOX_STATICTEXT_USER2 = 5, MESSAGEBOX_LISTBOX_VALUE_ONE = 100, MESSAGEBOX_LISTBOX_VALUE_TWO = 200, MESSAGEBOX_LISTBOX_VALUE_THREE = 300, MESSAGEBOX_LISTBOX_USER1 = 400, MESSAGEBOX_CONTROL_USER1 = 500, MESSAGEBOX_CONTROL_USER2, MESSAGEBOX_CONTROL_USER3, MESSAGEBOX_BUTTON_INCREASE_VALUEONE = (MESSAGEBOX_LISTBOX_VALUE_ONE+1), MESSAGEBOX_BUTTON_DECREASE_VALUEONE = (MESSAGEBOX_LISTBOX_VALUE_ONE+2), MESSAGEBOX_BUTTON_INCREASE_VALUETWO = (MESSAGEBOX_LISTBOX_VALUE_TWO+1), MESSAGEBOX_BUTTON_DECREASE_VALUETWO = (MESSAGEBOX_LISTBOX_VALUE_TWO+2), MESSAGEBOX_BUTTON_INCREASE_VALUETHREE = (MESSAGEBOX_LISTBOX_VALUE_THREE+1), MESSAGEBOX_BUTTON_DECREASE_VALUETHREE = (MESSAGEBOX_LISTBOX_VALUE_THREE+2), MESSAGEBOX_BUTTON_KEYS_BASE = 1000 }; void initDialog(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, const PPString& message, pp_int32 captionOffset, const PPString& buttonYesCaption); void initDialog(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, pp_int32 width, pp_int32 height, pp_int32 captionOffset, const PPString& buttonYesCaption); void initDialog(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, pp_int32 width, pp_int32 height, pp_int32 captionOffset, const PPString& buttonYesCaption, const PPString& buttonCancelCaption); void initDialog(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, pp_int32 width, pp_int32 height, pp_int32 captionOffset, const PPString& buttonYesCaption, const PPString& buttonNoCaption, const PPString& buttonCancelCaption); protected: PPDialogBase() : respondListener(NULL), keyDownInvokeKeyCode(-1), parentScreen(NULL), messageBoxContainerGeneric(NULL) { } public: PPDialogBase(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, MessageBoxTypes type = MessageBox_OKCANCEL); PPDialogBase(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, const PPString& message); virtual ~PPDialogBase(); void setResponder(DialogResponder* responder) { respondListener = responder; } PPMessageBoxContainer* getMessageBoxContainer() const { return messageBoxContainerGeneric; } void setMessageBoxContainer(PPMessageBoxContainer* container); virtual void show(bool b = true); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); void setUserButtonText(pp_int32 index, const PPString& caption); void setKeyDownInvokeKeyCode(pp_int16 keyCode) { keyDownInvokeKeyCode = keyCode; } pp_int32 getID() const; private: void initCommon(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, pp_int32 width, pp_int32 height, pp_int32& x, pp_int32& y); void sendKey(EEventDescriptor event, pp_uint16 vk, pp_uint16 sc, pp_uint16 chr); }; #endif milkytracker-0.90.85+dfsg/src/ppui/CheckBox.h0000644000175000017500000000337711150223367020040 0ustar admin2admin2/* * ppui/CheckBox.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPButton control class // ///////////////////////////////////////////////////////////////// #ifndef CHECKBOX__H #define CHECKBOX__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" // Forwards class PPGraphicsAbstract; class PPFont; class PPButton; class PPCheckBox : public PPControl, public EventListenerInterface { private: PPButton* button; public: PPCheckBox(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, bool checked = true); virtual ~PPCheckBox(); bool isChecked() const; void checkIt(bool checked); // from control virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); virtual void enable(bool b); virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); // from EventListenerInterface pp_int32 handleEvent(PPObject* sender, PPEvent* event); }; #endif milkytracker-0.90.85+dfsg/src/ppui/Graphics_24bpp_generic.cpp0000644000175000017500000002340011150223367023135 0ustar admin2admin2/* * ppui/Graphics_24bpp_generic.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Graphics_24bpp_generic.cpp * milkytracker_sdl * * Created by Peter Barth on 06.12.07. * */ #include "Graphics.h" #include "Font.h" #define BPP 3 PPGraphics_24bpp_generic::PPGraphics_24bpp_generic(pp_int32 w, pp_int32 h, pp_int32 p, void* buff) : PPGraphicsFrameBuffer(w, h, p, buff), bitPosR(0), bitPosG(8), bitPosB(16) { } void PPGraphics_24bpp_generic::setPixel(pp_int32 x, pp_int32 y) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; const pp_uint32 rgb = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); #ifndef __ppc__ buff[0] = rgb & 255; buff[1] = (rgb >> 8) & 255; buff[2] = (rgb >> 16) & 255; #else buff[0] = (rgb >> 16) & 255; buff[1] = (rgb >> 8) & 255; buff[2] = rgb & 255; #endif } } void PPGraphics_24bpp_generic::setPixel(pp_int32 x, pp_int32 y, const PPColor& color) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; const pp_uint32 rgb = (color.r << bitPosR) + (color.g << bitPosG) + (color.b << bitPosB); #ifndef __ppc__ buff[0] = rgb & 255; buff[1] = (rgb >> 8) & 255; buff[2] = (rgb >> 16) & 255; #else buff[0] = (rgb >> 16) & 255; buff[1] = (rgb >> 8) & 255; buff[2] = rgb & 255; #endif } } void PPGraphics_24bpp_generic::fill(PPRect rect) { if (rect.y1 < currentClipRect.y1) rect.y1 = currentClipRect.y1; if (rect.x1 < currentClipRect.x1) rect.x1 = currentClipRect.x1; if (rect.y2 > currentClipRect.y2) rect.y2 = currentClipRect.y2; if (rect.x2 > currentClipRect.x2) rect.x2 = currentClipRect.x2; const pp_uint32 rgb = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); pp_int32 len = (rect.x2-rect.x1); pp_uint8* buff = (pp_uint8*)buffer+(pitch*rect.y1+rect.x1*BPP); for (pp_int32 y = rect.y1; y < rect.y2; y++) { pp_uint8* ptr = buff; pp_int32 i; for (i = 0; i < len; i++) { #ifndef __ppc__ *ptr = rgb & 255; *(ptr+1) = (rgb >> 8) & 255; *(ptr+2) = (rgb >> 16) & 255; #else *ptr = (rgb >> 16) & 255; *(ptr+1) = (rgb >> 8) & 255; *(ptr+2) = rgb & 255; #endif ptr+=3; } buff+=pitch; } } void PPGraphics_24bpp_generic::fill() { fill(currentClipRect); } void PPGraphics_24bpp_generic::drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) { pp_int32 lx = x1; pp_int32 rx = x2; if (x1 > x2) { pp_int32 h = x2; x2 = x1; x1 = h; } if (lx < currentClipRect.x1) lx = currentClipRect.x1; if (rx > currentClipRect.x2) rx = currentClipRect.x2; if (y < currentClipRect.y1) return; if (y >= currentClipRect.y2) return; const pp_uint32 rgb = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); pp_int32 len = (rx-lx); pp_uint8* buff = (pp_uint8*)buffer+pitch*y+lx*BPP; pp_int32 i; for (i = 0; i < len; i++) { #ifndef __ppc__ *buff = rgb & 255; *(buff+1) = (rgb >> 8) & 255; *(buff+2) = (rgb >> 16) & 255; #else *buff = (rgb >> 16) & 255; *(buff+1) = (rgb >> 8) & 255; *(buff+2) = rgb & 255; #endif buff+=3; } } void PPGraphics_24bpp_generic::drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) { pp_int32 ly = y1; pp_int32 ry = y2; if (y1 > y2) { pp_int32 h = y2; y2 = y1; y1 = h; } if (ly < currentClipRect.y1) ly = currentClipRect.y1; if (ry > currentClipRect.y2) ry = currentClipRect.y2; if (x < currentClipRect.x1) return; if (x >= currentClipRect.x2) return; pp_uint8* buff = (pp_uint8*)buffer+pitch*ly+x*BPP; const pp_uint32 rgb = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); for (pp_int32 y = ly; y < ry; y++) { #ifndef __ppc__ *buff = rgb & 255; *(buff+1) = (rgb >> 8) & 255; *(buff+2) = (rgb >> 16) & 255; #else *buff = (rgb >> 16) & 255; *(buff+1) = (rgb >> 8) & 255; *(buff+2) = rgb & 255; #endif buff+=pitch; } } void PPGraphics_24bpp_generic::drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSLINETEMPLATE } void PPGraphics_24bpp_generic::drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSAALINETEMPLATE } void PPGraphics_24bpp_generic::blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { pp_int32 w = size.width; pp_int32 h = size.height; const pp_int32 bytesPerPixel = bpp; pp_uint8* dst = (pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP); if (intensity == 256) { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { const pp_uint32 rgb = ((pp_uint32)src[0] << bitPosR) + ((pp_uint32)src[1] << bitPosG) + ((pp_uint32)src[2] << bitPosB); #ifndef __ppc__ dst[0] = rgb & 255; dst[1] = (rgb >> 8) & 255; dst[2] = (rgb >> 16) & 255; #else dst[0] = (rgb >> 16) & 255; dst[1] = (rgb >> 8) & 255; dst[2] = rgb & 255; #endif dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } else { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { const pp_uint32 rgb = ((((pp_uint32)src[0]*intensity)>>8) << bitPosR) + ((((pp_uint32)src[1]*intensity)>>8) << bitPosG) + ((((pp_uint32)src[2]*intensity)>>8) << bitPosB); #ifndef __ppc__ dst[0] = rgb & 255; dst[1] = (rgb >> 8) & 255; dst[2] = (rgb >> 16) & 255; #else dst[0] = (rgb >> 16) & 255; dst[1] = (rgb >> 8) & 255; dst[2] = rgb & 255; #endif dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } } void PPGraphics_24bpp_generic::drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 charDim = currentFont->charDim; if (x + (signed)charWidth < currentClipRect.x1 || x > currentClipRect.x2 || y + (signed)charHeight < currentClipRect.y1 || y > currentClipRect.y2) return; const pp_uint32 rgb = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); Bitstream* bitstream = currentFont->bitstream; pp_uint8* fontbuffer = bitstream->buffer; pp_uint8* buff = (pp_uint8*)buffer + y*pitch + x*BPP; pp_uint32 cchrDim = chr*charDim; if (x>= currentClipRect.x1 && x + charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + charHeight < currentClipRect.y2) { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if ((fontbuffer[xChr>>3]>>(xChr&7)&1)) { #ifndef __ppc__ buff[0] = rgb & 255; buff[1] = (rgb >> 8) & 255; buff[2] = (rgb >> 16) & 255; #else buff[0] = (rgb >> 16) & 255; buff[1] = (rgb >> 8) & 255; buff[2] = rgb & 255; #endif } buff+=BPP; xChr++; } buff+=pitch-(charWidth*BPP); yChr+=charWidth; } } else { pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < (unsigned)charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < (unsigned)charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && (fontbuffer[xChr>>3]>>(xChr&7)&1)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*BPP); #ifndef __ppc__ buff[0] = rgb & 255; buff[1] = (rgb >> 8) & 255; buff[2] = (rgb >> 16) & 255; #else buff[0] = (rgb >> 16) & 255; buff[1] = (rgb >> 8) & 255; buff[2] = rgb & 255; #endif } xChr++; } yChr+=charWidth; } } if (underlined) drawHLine(x, x+charWidth, y+charHeight); } void PPGraphics_24bpp_generic::drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 sx = x; while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; case '\n': y+=charHeight; x=sx-charWidth; break; default: drawChar(*str, x, y, underlined); } x += charWidth; str++; } } void PPGraphics_24bpp_generic::drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; default: drawChar(*str, x, y, underlined); } y += charHeight; str++; } } milkytracker-0.90.85+dfsg/src/ppui/Makefile.in0000644000175000017500000006542611317506534020256 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = src/ppui DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libppui_a_AR = $(AR) $(ARFLAGS) libppui_a_LIBADD = am_libppui_a_OBJECTS = Button.$(OBJEXT) CheckBox.$(OBJEXT) \ Container.$(OBJEXT) ContextMenu.$(OBJEXT) Control.$(OBJEXT) \ DialogBase.$(OBJEXT) DialogFileSelector.$(OBJEXT) \ Dictionary.$(OBJEXT) DictionaryKey.$(OBJEXT) Event.$(OBJEXT) \ Font.$(OBJEXT) Graphics_15BIT.$(OBJEXT) \ Graphics_16BIT.$(OBJEXT) Graphics_24bpp_generic.$(OBJEXT) \ Graphics_32bpp_generic.$(OBJEXT) Graphics_ARGB32.$(OBJEXT) \ Graphics_BGR24.$(OBJEXT) Graphics_BGR24_SLOW.$(OBJEXT) \ KeyboardBindingHandler.$(OBJEXT) ListBox.$(OBJEXT) \ ListBoxFileBrowser.$(OBJEXT) Menu.$(OBJEXT) \ MessageBoxContainer.$(OBJEXT) PPUIConfig.$(OBJEXT) \ RadioGroup.$(OBJEXT) Screen.$(OBJEXT) Scrollbar.$(OBJEXT) \ Seperator.$(OBJEXT) Slider.$(OBJEXT) StaticText.$(OBJEXT) \ Tools.$(OBJEXT) TransparentContainer.$(OBJEXT) \ DisplayDeviceFB_SDL.$(OBJEXT) DisplayDevice_SDL.$(OBJEXT) libppui_a_OBJECTS = $(am_libppui_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libppui_a_SOURCES) DIST_SOURCES = $(libppui_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ SUBDIRS = osinterface noinst_LIBRARIES = libppui.a # For OpenGL, add sdl/DisplayDeviceOGL_SDL.cpp and Graphics_OGL.cpp, see # below libppui_a_SOURCES = Button.cpp CheckBox.cpp Container.cpp ContextMenu.cpp \ Control.cpp DialogBase.cpp DialogFileSelector.cpp Dictionary.cpp \ DictionaryKey.cpp Event.cpp Font.cpp Graphics_15BIT.cpp Graphics_16BIT.cpp \ Graphics_24bpp_generic.cpp Graphics_32bpp_generic.cpp Graphics_ARGB32.cpp \ Graphics_BGR24.cpp Graphics_BGR24_SLOW.cpp KeyboardBindingHandler.cpp \ ListBox.cpp ListBoxFileBrowser.cpp Menu.cpp MessageBoxContainer.cpp \ PPUIConfig.cpp RadioGroup.cpp Screen.cpp Scrollbar.cpp Seperator.cpp Slider.cpp \ StaticText.cpp Tools.cpp TransparentContainer.cpp sdl/DisplayDeviceFB_SDL.cpp \ sdl/DisplayDevice_SDL.cpp # Add Graphics_OGL.h and sdl/DisplayDeviceOGL_SDL.h here for OpenGL, see below noinst_HEADERS = BasicTypes.h Button.h CheckBox.h Container.h ContextMenu.h \ Control.h DialogBase.h DialogFileSelector.h Dictionary.h DictionaryKey.h \ DisplayDeviceBase.h Event.h Font.h Graphics.h GraphicsAbstract.h KeyBindings.h \ KeyboardBindingHandler.h ListBox.h ListBoxFileBrowser.h Menu.h \ MessageBoxContainer.h Object.h PPPath.h PPUI.h PPUIConfig.h RadioGroup.h \ ScanCodes.h Screen.h ScrollBar.h Seperator.h SimpleVector.h Singleton.h \ Slider.h StaticText.h Tools.h TransparentContainer.h UndoStack.h VirtualKeys.h \ fastfill.h sdl/DisplayDeviceFB_SDL.h sdl/DisplayDevice_SDL.h INCLUDES = -I$(top_srcdir)/src/ppui/osinterface \ -I$(top_srcdir)/src/ppui/osinterface/posix -I$(top_srcdir)/src/ppui/sdl # Add -D__OPENGL__ here if you want experimental opengl gfx (make clean # probably required) AM_CPPFLAGS = ${SDL_CFLAGS} -DMILKYTRACKER -D__LINUX__ -D__THREADTIMER__ EXTRA_DIST = carbon/DisplayDevice_CARBON.cpp carbon/DisplayDevice_CARBON.h \ win32/DisplayDevice_WIN32.cpp win32/DisplayDevice_WIN32.h \ wince/DisplayDevice_GAPI.cpp wince/DisplayDevice_GAPI.h all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .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) --gnu src/ppui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/ppui/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-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libppui.a: $(libppui_a_OBJECTS) $(libppui_a_DEPENDENCIES) -rm -f libppui.a $(libppui_a_AR) libppui.a $(libppui_a_OBJECTS) $(libppui_a_LIBADD) $(RANLIB) libppui.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Button.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CheckBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Container.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ContextMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Control.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogBase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogFileSelector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Dictionary.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DictionaryKey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DisplayDeviceFB_SDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DisplayDevice_SDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Event.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Font.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Graphics_15BIT.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Graphics_16BIT.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Graphics_24bpp_generic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Graphics_32bpp_generic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Graphics_ARGB32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Graphics_BGR24.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Graphics_BGR24_SLOW.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/KeyboardBindingHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ListBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ListBoxFileBrowser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Menu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MessageBoxContainer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PPUIConfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RadioGroup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Screen.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Scrollbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Seperator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Slider.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StaticText.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Tools.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TransparentContainer.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` DisplayDeviceFB_SDL.o: sdl/DisplayDeviceFB_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DisplayDeviceFB_SDL.o -MD -MP -MF $(DEPDIR)/DisplayDeviceFB_SDL.Tpo -c -o DisplayDeviceFB_SDL.o `test -f 'sdl/DisplayDeviceFB_SDL.cpp' || echo '$(srcdir)/'`sdl/DisplayDeviceFB_SDL.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/DisplayDeviceFB_SDL.Tpo $(DEPDIR)/DisplayDeviceFB_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/DisplayDeviceFB_SDL.cpp' object='DisplayDeviceFB_SDL.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DisplayDeviceFB_SDL.o `test -f 'sdl/DisplayDeviceFB_SDL.cpp' || echo '$(srcdir)/'`sdl/DisplayDeviceFB_SDL.cpp DisplayDeviceFB_SDL.obj: sdl/DisplayDeviceFB_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DisplayDeviceFB_SDL.obj -MD -MP -MF $(DEPDIR)/DisplayDeviceFB_SDL.Tpo -c -o DisplayDeviceFB_SDL.obj `if test -f 'sdl/DisplayDeviceFB_SDL.cpp'; then $(CYGPATH_W) 'sdl/DisplayDeviceFB_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/DisplayDeviceFB_SDL.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/DisplayDeviceFB_SDL.Tpo $(DEPDIR)/DisplayDeviceFB_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/DisplayDeviceFB_SDL.cpp' object='DisplayDeviceFB_SDL.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DisplayDeviceFB_SDL.obj `if test -f 'sdl/DisplayDeviceFB_SDL.cpp'; then $(CYGPATH_W) 'sdl/DisplayDeviceFB_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/DisplayDeviceFB_SDL.cpp'; fi` DisplayDevice_SDL.o: sdl/DisplayDevice_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DisplayDevice_SDL.o -MD -MP -MF $(DEPDIR)/DisplayDevice_SDL.Tpo -c -o DisplayDevice_SDL.o `test -f 'sdl/DisplayDevice_SDL.cpp' || echo '$(srcdir)/'`sdl/DisplayDevice_SDL.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/DisplayDevice_SDL.Tpo $(DEPDIR)/DisplayDevice_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/DisplayDevice_SDL.cpp' object='DisplayDevice_SDL.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DisplayDevice_SDL.o `test -f 'sdl/DisplayDevice_SDL.cpp' || echo '$(srcdir)/'`sdl/DisplayDevice_SDL.cpp DisplayDevice_SDL.obj: sdl/DisplayDevice_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DisplayDevice_SDL.obj -MD -MP -MF $(DEPDIR)/DisplayDevice_SDL.Tpo -c -o DisplayDevice_SDL.obj `if test -f 'sdl/DisplayDevice_SDL.cpp'; then $(CYGPATH_W) 'sdl/DisplayDevice_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/DisplayDevice_SDL.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/DisplayDevice_SDL.Tpo $(DEPDIR)/DisplayDevice_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/DisplayDevice_SDL.cpp' object='DisplayDevice_SDL.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DisplayDevice_SDL.obj `if test -f 'sdl/DisplayDevice_SDL.cpp'; then $(CYGPATH_W) 'sdl/DisplayDevice_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/DisplayDevice_SDL.cpp'; fi` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done 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: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ 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: ctags-recursive $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive 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-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic 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 installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive 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: milkytracker-0.90.85+dfsg/src/ppui/DisplayDeviceBase.h0000644000175000017500000001421411150223367021662 0ustar admin2admin2/* * ppui/DisplayDeviceBase.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __DISPLAYDEVICEBASE_H__ #define __DISPLAYDEVICEBASE_H__ // Some default values #ifndef __LOWRES__ #define DISPLAYDEVICE_WIDTH 640 #define DISPLAYDEVICE_HEIGHT 480 #else #define DISPLAYDEVICE_WIDTH 320 #define DISPLAYDEVICE_HEIGHT 240 #endif #include "BasicTypes.h" #include "Font.h" class PPGraphicsAbstract; ////////////////////////////////////////////////////////////////////////////////////////////////////////// // ------------------------------------ really shitty stuff ---------------------------------------------- ////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef void (*DrawPixelFunc)(void* buffer, pp_int32 x, pp_int32 y, pp_int32 pitch, const PPColor& color); static void DrawString(const char* textBuffer, pp_int32 posx, pp_int32 posy, const PPColor& color, void* buffer, pp_int32 pitch, DrawPixelFunc drawPixelFuncPtr) { PPFont* font = PPFont::getFont(PPFont::FONT_SYSTEM); while (*textBuffer) { pp_uint8 chr = *textBuffer++; { unsigned int j,i; for (i=0;i<8;i++) for (j=0;j<8;j++) if (font->getPixelBit(chr, j, i)) (*drawPixelFuncPtr)(buffer, posx+j, posy+i, pitch, color); } posx+=8; } } static void DrawWaitBar(const pp_int32 width, const pp_int32 height, const pp_int32 barWidth, const pp_int32 barHeight, const pp_int32 BAR_BRIGHT_COLOR, const pp_int32 BAR_DARK_COLOR, void* buffer, pp_int32 pitch, DrawPixelFunc drawPixelFuncPtr) { pp_int32 x,y; static int offset = 0; // background pattern, must be of type pp_uint8 static pp_uint8 pattern[] = {224, 210, 198, 210, 224}; for (y = 0; y < height; y++) { PPColor back; back.r = back.g = back.b = pattern[y % sizeof(pattern)]; for (x = 0; x < width; x++) (*drawPixelFuncPtr)(buffer, x, y, pitch, back); } PPColor textColor(0,0,0); ::DrawString("please wait"PPSTR_PERIODS, (width>>1)-(14*4), (height>>1)-16, textColor, buffer, pitch, drawPixelFuncPtr); int hBarPos = (width >> 1) - (barWidth>>1); int vBarPos = (height >> 1) - (barHeight>>1) + (height>>3); for (y = 0; y < barHeight; y++) { for (x = 0; x < barWidth; x++) { PPColor col; // little border for the lazy guys if ((y == 0) || (y == barHeight-1) || (x == 0) || (x == barWidth-1)) { col.r = col.g = col.b = 128; } else { int c = (x+y+(offset)) & 0x1f; int shade = 0; if (c <= 31) shade = c; else shade = 31 - (c - 32); shade = 255-(shade*8); col.r = ((BAR_BRIGHT_COLOR >> 16) * shade + (BAR_DARK_COLOR >> 16) * (255-shade)) >> 8; col.g = (((BAR_BRIGHT_COLOR >> 8) & 0xff) * shade + ((BAR_DARK_COLOR >> 8) & 0xff) * (255-shade)) >> 8; col.b = ((BAR_BRIGHT_COLOR & 0xff) * shade + (BAR_DARK_COLOR & 0xff) * (255-shade)) >> 8; } (*drawPixelFuncPtr)(buffer, hBarPos+x, vBarPos+y, pitch, col); } } offset+=8; } ////////////////////////////////////////////////////////////////////////////////////////////////////////// enum MouseCursorTypes { MouseCursorTypeStandard, MouseCursorTypeResizeLeft, MouseCursorTypeResizeRight, MouseCursorTypeHand, MouseCursorTypeWait }; class PPDisplayDeviceBase { protected: PPGraphicsAbstract* currentGraphics; PPSize size; pp_int32 scaleFactor; pp_int32 updateStackPtr; pp_int32 disabledStackPtr; // ----------------------------- ex. PPWindow ---------------------------- bool bFullScreen; PPColor waitBarColor; MouseCursorTypes currentCursorType; public: PPDisplayDeviceBase(pp_int32 theWidth = DISPLAYDEVICE_WIDTH, pp_int32 theHeight = DISPLAYDEVICE_HEIGHT, pp_int32 scaleFactor = 1) : currentGraphics(0), size(PPSize(theWidth, theHeight)), scaleFactor(scaleFactor), updateStackPtr(0), disabledStackPtr(0), bFullScreen(false), currentCursorType(MouseCursorTypeStandard) { } virtual ~PPDisplayDeviceBase() { } void enable(bool b) { if (!b) disabledStackPtr++; else if (disabledStackPtr > 0) --disabledStackPtr; } void allowForUpdates(bool b) { if (!b) updateStackPtr++; else if (updateStackPtr > 0) --updateStackPtr; } bool isEnabled() const { return disabledStackPtr == 0; } bool isUpdateAllowed() const { return updateStackPtr == 0; } virtual PPGraphicsAbstract* open() = 0; virtual void close() = 0; virtual void update() = 0; virtual void update(const PPRect& r) = 0; virtual void setSize(const PPSize& size) { this->size = size; } virtual const PPSize& getSize() const { return this->size; } pp_int32 getScaleFactor() const { return scaleFactor; } virtual bool supportsScaling() const { return false; } static pp_int32 getDefaultWidth() { return DISPLAYDEVICE_WIDTH; } static pp_int32 getDefaultHeight() { return DISPLAYDEVICE_HEIGHT; } // ----------------------------- ex. PPWindow ---------------------------- public: virtual bool init() { return true; } virtual void setTitle(const PPSystemString& title) { } virtual bool goFullScreen(bool b) { return true; } virtual bool isFullScreen() { return bFullScreen; } virtual PPSize getDisplayResolution() const { return PPSize(-1, -1); } virtual void shutDown() = 0; virtual void signalWaitState(bool b, const PPColor& color) { } virtual void setMouseCursor(MouseCursorTypes type) { currentCursorType = type; } virtual MouseCursorTypes getCurrentActiveMouseCursor() { return currentCursorType; } }; #endif milkytracker-0.90.85+dfsg/src/ppui/Screen.h0000644000175000017500000001146511150223367017566 0ustar admin2admin2/* * ppui/Screen.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPScreen class // ----------------------------------------------------------- // The PPScreen object acts as container for controls // Each control is a rectangular area on screen. // The screen is responsible for drawing the controls if // necessary (although the actual painting is implemented by // the control itself) // The screen will also send low level events from the OS // to the affected control(s) ///////////////////////////////////////////////////////////////// #ifndef SCREEN__H #define SCREEN__H #include "Object.h" #include "DisplayDeviceBase.h" #include "SimpleVector.h" #include "Control.h" // Forwards class PPControl; class PPEvent; class EventListenerInterface; class PPContainer; class GraphicsAbstract; class PPScreen : public PPObject { protected: PPDisplayDeviceBase* displayDevice; EventListenerInterface* eventListener; PPControl* focusedControl; PPControl* beforeModalFocusedControl; //PPControl* contextMenuControl; PPSimpleVector* contextMenuControls; PPControl* modalControl; PPSimpleVector controls; PPSimpleVector* timerEventControls; bool showDragHilite; PPContainer* rootContainer; private: PPPoint lastMousePoint; PPControl* lastMouseOverControl; void paintDragHighlite(PPGraphicsAbstract* g); void adjustEventMouseCoordinates(PPEvent* event); public: PPScreen(PPDisplayDeviceBase* displayDevice, EventListenerInterface* eventListener = NULL); virtual ~PPScreen(); void attachEventListener(EventListenerInterface* eventListener) { this->eventListener = eventListener; } EventListenerInterface* detachEventListener() { EventListenerInterface* theListener = eventListener; eventListener = NULL; return theListener; } void raiseEvent(PPEvent* event); void clear(); void paint(bool update = true, bool clean = false); void paintContextMenuControl(PPControl* control, bool update = true); void paintControl(PPControl* control, bool update = true); void paintSplash(const pp_uint8* rawData, pp_uint32 width, pp_uint32 height, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity = 256); void update(); void updateControl(PPControl* control); void pauseUpdate(bool pause); void enableDisplay(bool enable); bool isDisplayEnabled(); void setFocus(PPControl* control, bool repaint = true); PPControl* getFocusedControl() const; bool hasFocus(PPControl* control) const; void addControl(PPControl* control); bool removeControl(PPControl* control); void addTimerEventControl(PPControl* control); bool removeTimerEventControl(PPControl* control); PPControl* getControlByID(pp_int32 id) const; PPControl* getModalControl() const { return modalControl; } void releaseCaughtControls(); void setModalControl(PPControl* control, bool repaint = true); void setContextMenuControl(PPControl* control, bool repaint = true); void addContextMenuControl(PPControl* control, bool repaint = true); bool removeContextMenuControl(PPControl* control, bool repaint = true); bool removeLastContextMenuControl(bool repaint = true); bool hasContextMenu(PPControl* control) const; PPControl* getContextMenuControl(pp_int32 index = 0) const { return index < contextMenuControls->size() ? contextMenuControls->get(index) : NULL; } PPControl* getLastContextMenuControl() const { return contextMenuControls->size() ? contextMenuControls->get(contextMenuControls->size()-1) : NULL; } void setShowDragHilite(bool b); // -------------- PPDisplayDevice Delegates ------------------- pp_int32 getWidth() const; pp_int32 getHeight() const; static pp_int32 getDefaultWidth(); static pp_int32 getDefaultHeight(); void setSize(const PPSize& size); bool supportsScaling() const; pp_int32 getScaleFactor() const; bool goFullScreen(bool b); bool isFullScreen() const; PPSize getDisplayResolution() const; void setTitle(const PPSystemString& title); void signalWaitState(bool b, const PPColor& color); void setMouseCursor(MouseCursorTypes type); MouseCursorTypes getCurrentActiveMouseCursor() const; void shutDown(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/Container.h0000644000175000017500000000575511150223367020276 0ustar admin2admin2/* * ppui/Container.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPContainer control class (can contain other controls) // ///////////////////////////////////////////////////////////////// #ifndef CONTAINER__H #define CONTAINER__H #include "BasicTypes.h" #include "Control.h" #include "Button.h" #include "SimpleVector.h" class PPContainer : public PPControl { protected: const PPColor* color; bool border; private: PPButton* backgroundButton; PPSimpleVector controls; PPSimpleVector* timerEventControls; PPControl* focusedControl; PPPoint lastMousePoint; PPControl* lastMouseOverControl; // Control caught by mouse button press (left & right) PPControl* caughtControl; pp_int32 currentlyPressedMouseButtons; public: PPContainer(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true); virtual ~PPContainer(); virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); //void setColor(pp_int32 r,pp_int32 g,pp_int32 b) { color.r = r; color.g = g; color.b = b; backgroundButton->setColor(color); } void setColor(const PPColor& color) { this->color = &color; backgroundButton->setColor(color); } const PPColor& getColor() const { return *color; } void addControl(PPControl* control); bool removeControl(PPControl* control); virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); virtual bool gainsFocus() const; virtual bool gainedFocusByMouse() const; virtual void show(bool visible); virtual void hide(bool hidden); virtual bool isContainer() const { return true; } PPControl* getControlByID(pp_int32 id); PPControl* getFocusedControl() { return focusedControl; } PPSimpleVector& getControls() { return controls; } void setFocus(PPControl* control, bool repaint = true); bool hasFocus(PPControl* control) const; void move(const PPPoint& offset); void adjustContainerSize(); protected: void paintControls(PPGraphicsAbstract* g) { for (pp_int32 i = 0; i < controls.size(); i++) { PPControl* ctrl = controls.get(i); if (ctrl->isVisible()) ctrl->paint(g); } } friend class PPScreen; }; #endif milkytracker-0.90.85+dfsg/src/ppui/DictionaryKey.cpp0000644000175000017500000000306211150223367021452 0ustar admin2admin2/* * ppui/DictionaryKey.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPDictionaryKey.cpp * MilkyTracker * * Created by Peter Barth on Mon Mar 14 2005. * */ #include "DictionaryKey.h" #include PPDictionaryKey::PPDictionaryKey(const PPString& newKey, const PPString& newValue) : key(newKey), value(newValue) { } PPDictionaryKey::PPDictionaryKey(const PPString& newKey, const pp_uint32 value) : key(newKey) { store(value); } PPDictionaryKey::PPDictionaryKey(const PPDictionaryKey& source) { key = source.key; value = source.value; } void PPDictionaryKey::store(const PPString& newValue) { value = newValue; } void PPDictionaryKey::store(const pp_uint32 value) { char buffer[100]; sprintf(buffer,"%i",value); this->value = buffer; } pp_uint32 PPDictionaryKey::getIntValue() const { pp_uint32 v; sscanf(value, "%i", &v); return v; } milkytracker-0.90.85+dfsg/src/ppui/Seperator.cpp0000644000175000017500000000411011150223367020633 0ustar admin2admin2/* * ppui/Seperator.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPSeperator.cpp * MilkyTracker * * Created by Peter Barth on 16.03.05. * */ #include "Seperator.h" #include "GraphicsAbstract.h" PPSeperator::PPSeperator(pp_int32 id, PPScreen* parentScreen, const PPPoint& location, pp_uint32 size, const PPColor& theColor, bool horizontal/* = true*/) : PPControl(id, parentScreen, NULL, location, PPSize(0,0)), horizontal(horizontal), color(&theColor) { if (horizontal) { this->size.width = size; this->size.height = 2; } else { this->size.height = size; this->size.width = 2; } } void PPSeperator::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; g->setRect(location.x, location.y, location.x + size.width+1, location.y + size.height+1); //g->setColor(color); PPColor bColor = *color, dColor = *color; // adjust dark color dColor.scaleFixed(20000); // adjust bright color bColor.scaleFixed(87163); if (horizontal) { g->setColor(dColor); g->drawHLine(location.x, location.x + size.width, location.y); } else { g->setColor(dColor); g->drawVLine(location.y, location.y + size.height, location.x); } if (horizontal) { g->setColor(bColor); g->drawHLine(location.x+1, location.x +1+ size.width, location.y+1); } else { g->setColor(bColor); g->drawVLine(location.y+1, location.y +1+ size.height, location.x+1); } } milkytracker-0.90.85+dfsg/src/ppui/Screen.cpp0000644000175000017500000004457211150223367020126 0ustar admin2admin2/* * ppui/Screen.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "DisplayDeviceBase.h" #include "GraphicsAbstract.h" #include "Screen.h" #include "Event.h" #include "ContextMenu.h" #include "TransparentContainer.h" void PPScreen::paintDragHighlite(PPGraphicsAbstract* g) { g->setRect(0,0,getWidth(), getHeight()); g->setColor(46517>>8, 54740>>8, 65535>>8); g->drawHLine(0, getWidth(), 0); g->drawHLine(0, getWidth(), 1); g->drawHLine(0, getWidth(), 2); g->drawHLine(0, getWidth(), getHeight() - 1); g->drawHLine(0, getWidth(), getHeight() - 2); g->drawHLine(0, getWidth(), getHeight() - 3); g->drawVLine(0, getHeight(), 0); g->drawVLine(0, getHeight(), 1); g->drawVLine(0, getHeight(), 2); g->drawVLine(0, getHeight(), getWidth() - 1); g->drawVLine(0, getHeight(), getWidth() - 2); g->drawVLine(0, getHeight(), getWidth() - 3); } PPScreen::PPScreen(PPDisplayDeviceBase* displayDevice, EventListenerInterface* eventListener /* = NULL */) : displayDevice(displayDevice), eventListener(eventListener), focusedControl(NULL), beforeModalFocusedControl(NULL), modalControl(NULL), showDragHilite(false), rootContainer(NULL), lastMouseOverControl(NULL) { contextMenuControls = new PPSimpleVector(16, false); timerEventControls = new PPSimpleVector(16, false); rootContainer = new PPTransparentContainer(-1, this, eventListener, PPPoint(0, 0), PPSize(displayDevice->getSize())); } PPScreen::~PPScreen() { delete contextMenuControls; delete timerEventControls; } void PPScreen::adjustEventMouseCoordinates(PPEvent* event) { if (!displayDevice->supportsScaling()) return; const pp_int32 scaleFactor = displayDevice->getScaleFactor(); if (scaleFactor == 1) return; PPPoint* p = (PPPoint*)event->getDataPtr(); p->x /= scaleFactor; p->y /= scaleFactor; } void PPScreen::raiseEvent(PPEvent* event) { if (event->isMouseEvent()) adjustEventMouseCoordinates(event); // route events to event listener first eventListener->handleEvent(reinterpret_cast(this), event); if (event->getID() == eInvalid) return; // route timer event if (event->getID() == eTimer) { for (pp_int32 i = 0; i < timerEventControls->size(); i++) { PPControl* control = timerEventControls->get(i); if (!control->isVisible() || !control->receiveTimerEvent()) continue; control->dispatchEvent(event); } return; } if (modalControl && modalControl->isVisible()) { // listener of the modal control also gets a chance to listen to these events if (modalControl->getEventListener() && modalControl->getEventListener() != eventListener) modalControl->getEventListener()->handleEvent(reinterpret_cast(this), event); // if the above listener removed the control we're out of here if (!modalControl) return; modalControl->dispatchEvent(event); return; } // ------- handle context menu ----------------------------------- if (contextMenuControls->size()) { pp_int32 i; bool handled = true; bool mouseMoveHandeled = false; if (event->getID() == eMouseMoved || event->getID() == eLMouseDrag) { for (i = 0; i < contextMenuControls->size(); i++) { PPControl* contextMenuControl = contextMenuControls->get(contextMenuControls->size()-1); PPPoint* p = (PPPoint*)event->getDataPtr(); if (contextMenuControl->hit(*p) && contextMenuControl->isActive()) { contextMenuControl->dispatchEvent(event); mouseMoveHandeled = true; } } } if (mouseMoveHandeled) return; for (i = 0; i < contextMenuControls->size(); i++) { PPControl* contextMenuControl = contextMenuControls->get(i); if (contextMenuControl && contextMenuControl->isVisible()) { switch (event->getID()) { case eLMouseDown: case eRMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (contextMenuControl->hit(*p) && contextMenuControl->isActive()) { contextMenuControl->dispatchEvent(event); } else { bool inOtherMenu = false; for (pp_int32 j = 0; j < contextMenuControls->size(); j++) if (contextMenuControls->get(j) != contextMenuControl && contextMenuControls->get(j)->hit(*p)) { inOtherMenu = true; break; } if (!inOtherMenu) { if (event->getID() == eRMouseDown || event->getID() == eLMouseDown) handled = true; if (static_cast(contextMenuControl)->getNotifyParentOnHide()) { setContextMenuControl(NULL, false); paint(false); EventListenerInterface* listener = contextMenuControl->getEventListener(); struct MetaData { pp_int32 id; PPPoint p; } metaData; metaData.id = event->getID(); metaData.p = *p; PPEvent e(eRemovedContextMenu, &metaData, sizeof(metaData)); listener->handleEvent(reinterpret_cast(contextMenuControl), &e); update(); } else { setContextMenuControl(NULL); } } } break; } default: contextMenuControl->dispatchEvent(event); } } } if (handled) return; } rootContainer->dispatchEvent(event); } void PPScreen::pauseUpdate(bool pause) { displayDevice->allowForUpdates(!pause); } void PPScreen::enableDisplay(bool enable) { displayDevice->enable(enable); } bool PPScreen::isDisplayEnabled() { return displayDevice->isEnabled(); } void PPScreen::clear() { PPGraphicsAbstract* g = displayDevice->open(); if (!g) return; g->setColor(0,0,0); g->setRect(0, 0, g->getWidth(), g->getHeight()); g->fill(); displayDevice->close(); displayDevice->update(); } void PPScreen::paint(bool update/*= true*/, bool clean/*=false*/) { if (displayDevice == NULL) return; PPGraphicsAbstract* g = displayDevice->open(); if (!g) return; if (clean) { g->setColor(0,0,0); g->setRect(0, 0, g->getWidth(), g->getHeight()); g->fill(); } /*g->setColor(255, 255, 255); pp_int32 step = 0; for (pp_int32 y = 0; y < sizeof(characters)/sizeof(pp_uint16); y++) { for (pp_int32 x = 0; x < 4; x++) { if ((characters[y]>>((3-x)<<2))&1) { g->setPixel(x+32,y+32+step); } } step += ((y%5)==4)*2; }*/ //g->setFont(PPFont::getFont(PPFont::FONT_SYSTEM)); //g->setColor(255, 255, 255); //g->drawChar('A',0,0); pp_int32 i; /*for (i = 0; i < controls.size(); i++) { PPControl* control = controls.get(i); if (control->isVisible()) controls.get(i)->paint(g); }*/ // modal control overlapping everything if (!(modalControl && modalControl->isVisible() && modalControl->getLocation().x == 0 && modalControl->getLocation().y == 0 && modalControl->getSize().width == getWidth() && modalControl->getSize().height == getHeight())) { rootContainer->paint(g); for (i = 0; i < contextMenuControls->size(); i++) { PPControl* control = contextMenuControls->get(i); control->paint(g); } } if (modalControl) modalControl->paint(g); if (showDragHilite) paintDragHighlite(g); displayDevice->close(); if (update) displayDevice->update(); } void PPScreen::paintContextMenuControl(PPControl* control, bool update/* = true*/) { if (displayDevice == NULL || !control->isVisible()) return; PPGraphicsAbstract* g = displayDevice->open(); if (!g) return; for (pp_int32 i = 0; i < contextMenuControls->size(); i++) { PPControl* ctrl = contextMenuControls->get(i); ctrl->paint(g); } if (modalControl) { PPControl* ctrl = modalControl; ctrl->paint(g); } displayDevice->close(); if (update) { PPRect rect = control->getBoundingRect(); rect.x1--; if (rect.x1 < 0) rect.x1 = 0; rect.y1--; if (rect.y1 < 0) rect.y1 = 0; rect.x2++; if (rect.x2 > getWidth()) rect.x2 = getWidth(); rect.y2++; if (rect.y2 > getHeight()) rect.y2 = getHeight(); displayDevice->update(rect); } } void PPScreen::paintControl(PPControl* control, bool update/*= true*/) { if (displayDevice == NULL || !control->isVisible()) return; PPGraphicsAbstract* g = displayDevice->open(); if (!g) return; // modal control overlapping everything if (modalControl && modalControl->isVisible() && modalControl->getLocation().x == 0 && modalControl->getLocation().y == 0 && modalControl->getSize().width == getWidth() && modalControl->getSize().height == getHeight()) { // see whether the control we shall paint is a child of the modal control // if it's not, we don't need to paint it, because the modal control overlaps us PPControl* parent = control->getOwnerControl(); bool isModalControlChild = (parent == NULL); while (parent != NULL) { if (parent == modalControl) { isModalControlChild = true; break; } control = parent; parent = control->getOwnerControl(); } if (!isModalControlChild) return; } control->paint(g); bool paintContextMenus = false; for (pp_int32 i = 0; i < contextMenuControls->size(); i++) { PPControl* ctrl = contextMenuControls->get(i); if (ctrl->getBoundingRect().intersect(control->getBoundingRect())) { paintContextMenus = true; break; } } if (paintContextMenus) { for (pp_int32 i = 0; i < contextMenuControls->size(); i++) { PPControl* ctrl = contextMenuControls->get(i); ctrl->paint(g); } } if (modalControl) { // if the modal control hits the control to draw we also need to refresh the modal control if (modalControl->getBoundingRect().intersect(control->getBoundingRect())) modalControl->paint(g); } displayDevice->close(); if (update) { updateControl(control); } } void PPScreen::paintSplash(const pp_uint8* rawData, pp_uint32 width, pp_uint32 height, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { PPGraphicsAbstract* g = displayDevice->open(); if (!g) return; PPPoint p; p.x = g->getWidth() / 2 - width / 2; p.y = g->getHeight() / 2 - height / 2; PPSize s; s.width = width; s.height = height; g->blit(rawData, p, s, pitch, bpp, intensity); displayDevice->close(); displayDevice->update(); } void PPScreen::update() { if (displayDevice) { if (showDragHilite) { PPGraphicsAbstract* g = displayDevice->open(); paintDragHighlite(g); displayDevice->close(); } displayDevice->update(); } } void PPScreen::updateControl(PPControl* control) { PPRect rect = control->getBoundingRect(); rect.x1--; if (rect.x1 < 0) rect.x1 = 0; rect.y1--; if (rect.y1 < 0) rect.y1 = 0; rect.x2++; if (rect.x2 > getWidth()) rect.x2 = getWidth(); rect.y2++; if (rect.y2 > getHeight()) rect.y2 = getHeight(); displayDevice->update(rect); } void PPScreen::setFocus(PPControl* control, bool repaint/* = true*/) { PPSimpleVector chain(0, false); PPControl* ctrl = NULL; if (control == NULL) { rootContainer->setFocus(NULL); return; } else { ctrl = control; chain.add(ctrl); } if (ctrl == NULL) return; while (ctrl->getOwnerControl()) { PPControl* parent = ctrl->getOwnerControl(); ctrl = parent; if (ctrl->isContainer()) chain.add(ctrl); } for (pp_int32 i = chain.size()-1; i > 0; i--) { if (chain.get(i)->isContainer()) { static_cast(chain.get(i))->setFocus(chain.get(i-1), repaint); } } } PPControl* PPScreen::getFocusedControl() const { // first we need to find the control which is at the end of the focus hierarchy PPControl* parent = rootContainer; while (parent->isContainer() && static_cast(parent)->getFocusedControl()) { parent = static_cast(parent)->getFocusedControl(); } // if this is still a container this is not what we want => NULL return parent->isContainer() ? NULL : parent; } bool PPScreen::hasFocus(PPControl* control) const { // if the client is asking for container focus we first need to find the control // which is at the end of the focus hierarchy (see above) PPControl* parent = control; while (parent->isContainer() && static_cast(parent)->getFocusedControl()) { parent = static_cast(parent)->getFocusedControl(); } // now if those controls match, we're in focus return getFocusedControl() == parent; } void PPScreen::addControl(PPControl* control) { rootContainer->addControl(control); } bool PPScreen::removeControl(PPControl* control) { return rootContainer->removeControl(control); } void PPScreen::addTimerEventControl(PPControl* control) { if (control->receiveTimerEvent() && !control->isContainer()) timerEventControls->add(control); } bool PPScreen::removeTimerEventControl(PPControl* control) { bool res = false; for (pp_int32 i = 0; i < timerEventControls->size(); i++) { if (timerEventControls->get(i) == control) { timerEventControls->remove(i); res = true; } } return res; } PPControl* PPScreen::getControlByID(pp_int32 id) const { return rootContainer->getControlByID(id); } void PPScreen::releaseCaughtControls() { // uncatch controls within containers PPControl* parent = rootContainer; while (parent->isContainer() && static_cast(parent)->caughtControl && static_cast(parent)->currentlyPressedMouseButtons != 0) { PPControl* caughtControl = static_cast(parent)->caughtControl; static_cast(parent)->caughtControl = NULL; static_cast(parent)->currentlyPressedMouseButtons = 0; parent = caughtControl; } } void PPScreen::setModalControl(PPControl* control, bool repaint/* = true*/) { // Hide open menus first setContextMenuControl(NULL, false); if (modalControl) { PPEvent event(eFocusLostNoRepaint); modalControl->dispatchEvent(&event); modalControl->show(false); } if (control) { // uncatch controls within containers releaseCaughtControls(); PPEvent event(eFocusGainedNoRepaint); control->dispatchEvent(&event); control->show(true); } else if (focusedControl) { PPEvent event(eFocusGainedNoRepaint); focusedControl->dispatchEvent(&event); } modalControl = control; if (repaint) paint(); } void PPScreen::setContextMenuControl(PPControl* control, bool repaint/* = true*/) { if (control == NULL && !contextMenuControls->size()) return; PPEvent event(eFocusLost); PPEvent event2(eFocusGained); for (pp_int32 i = 0; i < contextMenuControls->size(); i++) contextMenuControls->get(i)->dispatchEvent(&event); delete contextMenuControls; contextMenuControls = new PPSimpleVector(16, false); if (control) { // uncatch controls within containers releaseCaughtControls(); control->dispatchEvent(&event2); contextMenuControls->add(control); } if (repaint) paint(); } void PPScreen::addContextMenuControl(PPControl* control, bool repaint/* = true*/) { PPEvent event(eFocusLost); PPEvent event2(eFocusGained); if (control) { control->dispatchEvent(&event2); contextMenuControls->add(control); } if (repaint) paint(); } bool PPScreen::removeContextMenuControl(PPControl* control, bool repaint/* = true*/) { if (!contextMenuControls->size()) return false; bool res = false; for (pp_int32 i = 0; i < contextMenuControls->size(); i++) if (contextMenuControls->get(i) == control) { contextMenuControls->remove(i); res = true; } if (res && repaint) paint(); return res; } bool PPScreen::removeLastContextMenuControl(bool repaint/* = true*/) { if (contextMenuControls->size()) { contextMenuControls->remove(contextMenuControls->size()-1); if (repaint) paint(); return true; } return false; } bool PPScreen::hasContextMenu(PPControl* control) const { if (!contextMenuControls->size()) return false; for (pp_int32 i = 0; i < contextMenuControls->size(); i++) if (contextMenuControls->get(i) == control) return true; return false; } void PPScreen::setShowDragHilite(bool b) { showDragHilite = b; if (!b) { PPGraphicsAbstract* g = displayDevice->open(); paintDragHighlite(g); displayDevice->close(); } paint(); } pp_int32 PPScreen::getWidth() const { if (displayDevice == NULL) return -1; return displayDevice->getSize().width; } pp_int32 PPScreen::getHeight() const { if (displayDevice == NULL) return -1; return displayDevice->getSize().height; } pp_int32 PPScreen::getDefaultWidth() { return PPDisplayDeviceBase::getDefaultWidth(); } pp_int32 PPScreen::getDefaultHeight() { return PPDisplayDeviceBase::getDefaultHeight(); } void PPScreen::setTitle(const PPSystemString& title) { if (displayDevice) displayDevice->setTitle(title); } void PPScreen::setSize(const PPSize& size) { if (displayDevice) displayDevice->setSize(size); rootContainer->setSize(size); } bool PPScreen::supportsScaling() const { if (displayDevice) return displayDevice->supportsScaling(); return false; } pp_int32 PPScreen::getScaleFactor() const { if (displayDevice) return displayDevice->getScaleFactor(); return 1; } bool PPScreen::goFullScreen(bool b) { if (displayDevice) return displayDevice->goFullScreen(b); return false; } bool PPScreen::isFullScreen() const { if (displayDevice) return displayDevice->isFullScreen(); return false; } PPSize PPScreen::getDisplayResolution() const { PPSize size(-1, -1); if (displayDevice) size = displayDevice->getDisplayResolution(); return size; } void PPScreen::signalWaitState(bool b, const PPColor& color) { if (displayDevice) displayDevice->signalWaitState(b, color); } void PPScreen::setMouseCursor(MouseCursorTypes type) { if (displayDevice) displayDevice->setMouseCursor(type); } MouseCursorTypes PPScreen::getCurrentActiveMouseCursor() const { if (displayDevice) return (MouseCursorTypes)displayDevice->getCurrentActiveMouseCursor(); return MouseCursorTypeStandard; } void PPScreen::shutDown() { if (displayDevice) displayDevice->shutDown(); } milkytracker-0.90.85+dfsg/src/ppui/Font.cpp0000644000175000017500000114662511316455755017634 0ustar admin2admin2/* * ppui/Font.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ////////////////////////////////////////////////////////////////////// // // PPFont.cpp: implementation of the PPFont class. // ////////////////////////////////////////////////////////////////////// #include "Font.h" #include struct FontEntry { FontEntry(const char* theName, const unsigned int theWidth, const unsigned int theHeight, const char* theData) : name(theName), width(theWidth), height(theHeight), data(theData) { } const char* name; const unsigned int width, height; const char* data; }; FontEntry fontEntries[] = { // Font no. 0 FontEntry("ARIEL", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x3c\x66\x66\x66\x66\x66\x3c\x0\x18\x1c\x18\x18\x18\x18\x3c\x0\x3e\x63\x60\x30\xc\x6\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x66\x7f\x60\x60\x0\x7f\x3\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x0\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x63\x63\x3f\x63\x63\x3f\x0\x3e\x63\x3\x3\x63\x63\x3e\x0\x3f\x63\x63\x63\x63\x63\x3f\x0\x7f\x3\x3\x1f\x3\x3\x7f\x0\x7f\x43\x3\x1f\x13\x3\x3\x0\x3e\x63\x3\x7b\x43\x63\x5e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x30\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x7b\x73\x3e\x60\x3f\x66\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\x8\x8\x1c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x6\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 1 FontEntry("ATHENA", 12, 12, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x80\xf\xf8\x80\xf\xf8\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x0\xdc\xc1\x1d\x10\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x38\x8e\xf3\x7f\x8e\xe3\x38\x8e" "\xe3\x38\xff\xe7\x38\x8e\x3\x0\x50\x0\x5\xfe\x73\x5\x57\xe0\x3f\x50\x7\x75\xfe\x3\x5\x50\x0\x0\x0\x0\x1c\xc7\x71\xe\xe0\x0\x7\x70\x80\x3\x38\xc7\x71\x1c\x0\x0\xfe\x70\x18\x87\xf1\xc\x7e\xc0\x3\x76\x32\x3e\xc3\x71\x3c\x7e\x7\x0\x70\x0" "\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf0\x0\x0\x78\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\x78\x0\x0\x0\x0\x2\x70\x80\xf\xff\xe7\x3f\xfc\xc1\x1f" "\x8e\x33\x60\x0\x0\x0\x0\x0\x7\x70\x0\x7\x70\xf0\x7f\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x4\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x0\x0\x0\x1c\xc0\x1\xe\xe0\x0\x7\x70\x80\x3\x38\xc0\x1\x1c\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x70\x80\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\xfe\x3\x0\xfe\x73\x70\x7\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\xff\x7\x0\xfe\x73\x70\x7\x7\x70\xe0\x3\x70\x0\x7\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\xff\x77\x0\x7\x70\x0" "\xff\x3\x70\x0\x7\x70\x7\x77\x70\xfe\x3\x0\xfe\x73\x0\x7\x70\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\xff\x7\x70\x0\x7\x38\x80\x3\x7f\xc0\x1\xe\xe0\x0\x7\x70\x0\x0\xfe\x73\x70\x7\x77\x70\xfe\x73\x70\x7\x77\x70\x7\x77\x70\xfe" "\x3\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\xfe\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x4\x0\x0\x0\xc0\x1\xe\x70\x80" "\x3\x1c\x80\x3\x70\x0\xe\xc0\x1\x0\x0\x0\x0\x0\xe0\x3f\x0\x0\x0\x0\xe0\x3f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x80\x3\x70\x0\xe\xc0\x1\xe\x70\x80\x3\x1c\x0\x0\xfe\x73\x70\x0\x7\x70\x0\x7\x3e\x70\x0\x7\x0\x0\x7\x70\x0\x0" "\xfc\xe1\x38\x67\x77\x7b\x37\x77\x73\x37\x77\x73\xe7\xe3\x0\xfc\x1\x0\xfe\x73\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x73\x70\x7\x77\x70\xff\x73\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\xfe\x73\x70\x7\x70\x0\x7\x70\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x38\xff\x1\x0\xff\x77\x0\x7\x70\x0\x7f\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xff\x77\x0\x7\x70\x0\x7f\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\xfe\x73" "\x70\x7\x70\x0\xc7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xff\x7\x0\xfe\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70" "\x0\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x38\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x7\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\x3\x76\x70\x8f\xf7\x7d\xff\x77\x77\x27\x77\x70\x7\x77\x70\x7\x7\x0\x3\x77\x70\xf" "\xf7\x71\x3f\x77\x77\xe7\x77\x7c\x87\x77\x70\x7\x6\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\xff\x73\x70\x7\x77\x70\xff\x73\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x76\xe7\x77" "\x7c\xbe\x3\x30\xff\x73\x70\x7\x77\x70\xff\x73\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xfe\x73\x70\x7\x70\x0\xfe\x3\x70\x0\x7\x70\x0\x77\x70\xfe\x3\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x7\x77\x70\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x8e\xc3\x1d\xf8\x0\x0\x7\x77\x70\x7\x77\x70\x27\x77\x77\xff\xf7\x7d\x8f\x77\x70\x3\x6\x0\x7\x77\x70\x7\xe7\x38\xfc\xe1\x38\x7\x77\x70\x7\x77\x70\x7" "\x7\x0\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\x0\x7\x70\xfc\x3\x0\xff\x7\x70\x80\x3\x1c\xe0\x0\x7\x38\xc0\x1\xe\x70\x0\xff\x7\x0\xf8\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf8\x0\x0\x0\xc0\x1\x1c\x80\x3\x38\x0" "\x7\x70\x0\xe\xe0\x0\x1c\xc0\x1\x0\xf8\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xf8\x0\x0\x20\x0\x7\xf8\xc0\x1d\x8e\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x7\x0" "\x70\x0\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\x0\x7\x70\xfe\x77\x70\x7\x77\x70\xfe\x7\x0\x7\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\x0\x7\x70\x0\xe7\x7f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x70\xff\x77\x0\x7\x70\x70\xfe\x3\x0\xe0\x3\x7\x70\x0\x7\x70\xe0\x3f\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0" "\x0\x0\xe0\x3f\x7\x77\x70\xfe\x7\x70\x0\x77\x70\xfe\x3\x0\x7\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x0\x0\x7\x0\xe0\x3f\x70\x0\x7\x70\x0\x7\x70\x0\x7\xfe\x3\x0\x0\x0\x70\x0\x0\x70\x0\x7\x70\x0\x7\x70" "\x0\x77\x70\xfe\x3\x0\x7\x70\x0\x7\x77\x70\x7\x77\x38\xff\x71\x38\x7\x77\x70\x7\x7\x0\x0\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf0\x1\x0\x0\x0\x0\x0\xe0\x3f\x27\x77\x72\x27\x77\x72\x7\x77\x70\x7\x7\x0\x0\x0\x0\x0" "\xe0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x0\x0\x0\x0\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x0\x0\x0\x0\xe0\x7f\x7\x77\x70\x7\x77\x70\x7\xe7" "\x7f\x0\x7\x70\x0\x0\x0\x0\xe0\x3f\x7\x77\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\xe0\x3f\x7\x70\x0\xfe\x1\x70\x0\x7\x70\xfe\x3\x0\x0\x70\x0\x7\x70\x0\x7\xf0\x3\x7\x70\x0\x7\x77\x70\xfe\x3\x0\x0\x0\x0\x0\x70\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x7\x77\x70\x8e\xc3\x1d\xf8\x0\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x27\x77\x72\x27\x77\x72\xfe\x3\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\xfe\x73\x70\x7\x77\x70\x7" "\x7\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\xfe\x7\x70\x0\x77\x70\xfe\x3\x0\x0\x0\x0\x0\xf0\x7f\xc0\x3\x1e\xf0\x80\x7\x3c\xe0\x1\xff\x7\x0\xf0\x80\x3\x38\x80\x3\x70\xc0\xf\x70\x80\x3\x38\x80\x3\xf0\x0\x0\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x78\x0\xe\xe0\x0\xe\x70\x80\x1f\x70\x0\xe\xe0\x0\xe\x78\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x7\x70\x0\x7\x70\x0\xff\xf" "\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\x0\x0\x0\x0\x0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\xe\xe0\x0\xe\xe0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x1f\xf8\x80\xf\x70\x0\x7\x20\x0\x2\x0\x0\x0\x0\x0\x0\x20\x0\x2\x70\x0\x7\xf8\x80\xf\xfc\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" ), // Font no. 2 FontEntry("ATHENA_SPACED", 12, 12, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x80\xf\xf8\x80\xf\xf8\x0\x7\x70\x0\x0\x70\x0\x7\x0\x0\x0\xdc\xc1\x1d\x10\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x38\x8e\xf3\x7f\x8e\xe3\x38\x8e" "\xf3\x7f\x8e\xe3\x38\x0\x0\x0\x50\x0\x5\xfe\x73\x5\xfe\x3\x75\x50\xe7\x3f\x50\x0\x5\x0\x0\x0\x0\x0\x0\xe7\x70\xe\x70\x0\x7\x38\x80\x3\x1c\xc7\x71\x0\x0\x0\xfe\x70\x18\xcf\xe0\x7\x3c\x60\x27\xe3\x33\x1c\xc7\xe3\x77\x0\x0\x0\x70\x0" "\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x0\xf\x0\x0\x0\x78\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x80\x7\x0\x0\x0\x0\x0\x2\x70\x80\xf\xff\xe7\x3f\xfc\xc1\x1f" "\x8e\x33\x60\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\xf0\x7f\x70\x0\x7\x70\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x0\x0\x0\xc0\x1\x1c\xe0\x0\xe\x70\x0\x7\x38\x80\x3\x1c\xc0\x1\x0\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x70\x80\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\xe0" "\x3f\x0\x0\x0\xfe\x73\x70\x87\x3\x1c\xe0\x0\x7\x38\xc0\x1\xe\xf0\x7f\x0\x0\x0\xfe\x73\x70\x7\x7\x70\xe0\x3\x70\x0\x77\x70\x7\xe7\x3f\x0\x0\x0\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\xff\x77\x0\x7\x70\x0" "\xff\x3\x70\x0\x77\x70\x7\xe7\x3f\x0\x0\x0\xfe\x73\x0\x7\x70\x0\xff\x73\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\xff\x7\x70\x0\x7\x38\x80\x3\x7f\xc0\x1\xe\xe0\x0\x7\x0\x0\x0\xfe\x73\x70\x7\x77\x70\xfe\x73\x70\x7\x77\x70\x7\xe7\x3f\x0" "\x0\x0\xfe\x73\x70\x7\x77\x70\x7\xe7\x7f\x0\x7\x70\x0\xe7\x3f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x0\x0\x0\x70\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x0\x0\x0\x70\x0\x7\x40\x0\x0\x0\x0\x1c\xe0\x0\x7\x38\xc0" "\x1\x38\x0\x7\xe0\x0\x1c\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\x0\x0\x0\x0\xe0\x3f\x0\x0\x0\x0\x0\x0\x0\xc0\x1\x38\x0\x7\xe0\x0\x1c\xe0\x0\x7\x38\xc0\x1\x0\x0\x0\xfe\x73\x70\x0\x7\x70\xe0\x3\x7\x70\x0\x0\x70\x0\x7\x0\x0\x0" "\xfc\xe1\x38\x67\x77\x7b\x37\x77\x73\x37\x77\x3e\xe\xc0\x1f\x0\x0\x0\xfe\x73\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\xff\x73\x70\x7\x77\x70\xff\x73\x70\x7\x77\x70\x7\xf7\x3f\x0\x0\x0\xfe\x73\x70\x7\x70\x0\x7\x70\x0\x7" "\x70\x0\x7\xe7\x3f\x0\x0\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x87\xf3\x1f\x0\x0\x0\xff\x77\x0\x7\x70\x0\x7f\x70\x0\x7\x70\x0\x7\xf0\x7f\x0\x0\x0\xff\x77\x0\x7\x70\x0\x7f\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\xfe\x73" "\x70\x7\x70\x0\xc7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x7\x77\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\xf0\x7f\x0\x0\x0\xfe\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70" "\x7\xe7\x3f\x0\x0\x0\x7\x77\x70\x7\x77\x38\xff\x71\x38\x7\x77\x70\x7\x77\x70\x0\x0\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xf0\x7f\x0\x0\x0\x3\x76\x70\x8f\xf7\x7d\xff\x77\x77\x27\x77\x70\x7\x77\x70\x0\x0\x0\x3\x77\x70\xf" "\xf7\x71\x3f\x77\x77\xe7\x77\x7c\x87\x77\x70\x0\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\xff\x73\x70\x7\x77\x70\xff\x73\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x67\x77\x7e\xc7\xe7" "\x3b\x0\x3\x0\xff\x73\x70\x7\x77\x70\xff\x73\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\xfe\x73\x70\x7\x70\x0\xfe\x3\x70\x0\x7\x70\x7\xe7\x3f\x0\x0\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x7\x77\x70\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x8e\xc3\x1d\xf8\x0\x0\x7\x77\x70\x7\x77\x72\x77\xf7\x7f\xdf\xf7\x78\x7\x37\x60\x0\x0\x0\x7\x77\x70\x7\xe7\x38\xfc\xe1\x38\x7\x77\x70\x7\x77\x70\x0" "\x0\x0\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\x7\x70\x0\xc7\x3f\x0\x0\x0\xff\x7\x70\x80\x3\x1c\xe0\x0\x7\x38\xc0\x1\xe\xf0\x7f\x0\x0\x0\xf8\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\xf\x0\x0\x0\x1c\xc0\x1\x38\x80\x3\x70\x0" "\x7\xe0\x0\xe\xc0\x1\x1c\x0\x0\x0\xf8\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x80\xf\x0\x0\x0\x20\x0\x7\xf8\xc0\x1d\x8e\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\x0\x0\x0" "\x70\x0\x7\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xfe\x3\x70\x0\xe7\x7f\x7\x77\x70\x7\xe7\x7f\x0\x0\x0\x7\x70\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x0\x0\x0\x0\x0\x0\xfe\x73\x70\x7\x70\x0\x7" "\x70\x0\x7\xe7\x3f\x0\x0\x0\x0\x7\x70\xfe\x77\x70\x7\x77\x70\x7\x77\x70\x7\xe7\x7f\x0\x0\x0\x0\x0\x0\xfe\x73\x70\x7\xf7\x7f\x7\x70\x0\x7\xe7\x3f\x0\x0\x0\xe0\x3\x7\x70\x0\x7\xfe\x3\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0" "\x0\xfe\x73\x70\x7\xe7\x7f\x0\x7\x70\x7\xe7\x3f\x0\x0\x0\x7\x70\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\x70\x0\x0\xfe\x3\x7\x70\x0\x7\x70\x0\x7\x70\xe0\x3f\x0\x0\x0\x0\x7\x0\x0\x7\x70\x0\x7\x70\x0\x7\x70" "\x7\xe7\x3f\x0\x0\x0\x7\x70\x70\x7\x77\x70\x87\xf3\x1f\x87\x73\x70\x7\x77\x70\x0\x0\x0\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x0\x1f\x0\x0\x0\x0\x0\x0\xfe\x73\x72\x27\x77\x72\x27\x77\x70\x7\x77\x70\x0\x0\x0\x0\x0\x0\xfe" "\x73\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x0\x0\x0\x0\x0\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x0\x0\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\xff\x73\x0\x7\x0\x0\x0\x0\x0\xfe\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7" "\x70\x0\x7\x0\x0\x0\x0\xfe\x73\x70\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\x0\x0\x0\xfe\x73\x0\x7\xe0\x1f\x0\x7\x70\x0\xe7\x3f\x0\x0\x0\x0\x70\x0\x7\x70\x0\x3f\x70\x0\x7\x70\x70\x7\xe7\x3f\x0\x0\x0\x0\x0\x0\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x0\x0\x0\x0\x0\x0\x7\x77\x70\x7\x77\x70\x7\xe7\x38\xdc\x81\xf\x0\x0\x0\x0\x0\x0\x7\x77\x70\x7\x77\x72\x27\x77\x72\x27\xe7\x3f\x0\x0\x0\x0\x0\x0\x7\x77\x70\x7\xe7\x3f\x7\x77\x70\x7\x77\x70\x0" "\x0\x0\x0\x0\x0\x7\x77\x70\x7\xe7\x7f\x0\x7\x70\x7\xe7\x3f\x0\x0\x0\x0\x0\x0\xff\x7\x3c\xe0\x1\xf\x78\xc0\x3\x1e\xf0\x7f\x0\x0\x0\xf0\x80\x3\x38\x0\x7\xfc\x0\x7\x38\x80\x3\x38\x0\xf\x0\x0\x0\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x78\x0\xe\xe0\x0\x7\xf8\x1\x7\xe0\x0\xe\xe0\x80\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x7\x70\x0\x7\x70\x0\xff\xf" "\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\x0\x0\x0\x0\x0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\xe\xe0\x0\xe\xe0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x1f\xf8\x80\xf\x70\x0\x7\x20\x0\x2\x0\x0\x0\x0\x0\x0\x20\x0\x2\x70\x0\x7\xf8\x80\xf\xfc\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" ), // Font no. 3 FontEntry("DISORDERTRACKER2", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x57\x51\x73\x54\x57\x0\x0\x0\x77\x21\x23\x21\x21\x0\x0\x0\x0\x0\x0\x0\x18\x0\x0\x0\xec\x4a\x42\x4a\x4e\x0\x0\x0\x13\x15\x13\x15\x75\x0\x0\x0\x3c\x42\x99\x85\x99\x42\x3c\x0\x20\x50\x70\x50\x50\x0\x0\x0" "\x71\x21\x21\x21\x27\x0\x0\x0\xf3\x1b\x7b\xdb\xdb\xdb\x73\x0\xf\xf\xf\xf\xf\xf\xf\xf\x0\x0\x0\xff\x0\x0\x0\x0\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x0\x0\x0\x80\x41\x22\x14\x8" "\x0\x0\xf8\x8\x3e\x1c\x8\x0\xf\x7\xf\x5d\x78\x70\x78\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x0\x36\x7f\x36\x36\x7f\x36\x0\x8\x7e\xb\x3e\x68\x6b\x3e\x8\x0\x63\x33\x18\xc\x66\x63\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\xc\xc\x6\x0\x0\x0\x0\x0" "\xc\x6\x6\x6\x6\x6\xc\x0\x18\x30\x30\x30\x30\x30\x18\x0\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x3e\x63\x63\x6b\x63\x63\x3e\x0\x18\x1c\x18\x18\x18\x18\x3c\x0\x3e\x63\x60\x38\xe\x3\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x63\x63\x63\x7e\x60\x60\x60\x0\x7f\x3\x3\x3f\x60\x63\x3e\x0\x3e\x3\x3\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\x18\x18\x18\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x18\xc\x6\x3\x6\xc\x18\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3e\x63\x30\x18\x18\x0\x18\x0" "\x3e\x63\x7b\x7b\x3b\x3\x3e\x0\x3e\x63\x63\x7f\x63\x63\x63\x0\x3f\x63\x63\x3f\x63\x63\x3f\x0\x3e\x63\x3\x3\x3\x63\x3e\x0\x1f\x33\x63\x63\x63\x63\x3f\x0\x7f\x3\x3\x1f\x3\x3\x7f\x0\x7f\x3\x3\x1f\x3\x3\x3\x0\x7e\x3\x3\x7b\x63\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x1e\xc\xc\xc\xc\xc\x1e\x0\x7c\x60\x60\x60\x60\x63\x3e\x0\x63\x63\x3f\x33\x63\x63\x63\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x63\x63\x3f\x3\x3\x3\x0\x3e\x63\x63\x63\x63\x7b\x3e\x60\x3f\x63\x63\x3f\x63\x63\x63\x0\x3e\x63\x3\x3e\x60\x63\x3e\x0\x3f\xc\xc\xc\xc\xc\xc\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x63\x6b\x7f\x77\x63\x0" "\x63\x63\x36\x1c\x36\x63\x63\x0\x63\x63\x63\x7e\x60\x63\x3e\x0\x7f\x30\x18\xc\x6\x3\x7f\x0\x1e\x6\x6\x6\x6\x6\x1e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7c\x66\x7c\x0\x6\x6\x3e\x66\x66\x66\x3e\x0\x0\x0\x3c\x66\x6\x66\x3c\x0\x60\x60\x7c\x66\x66\x66\x7c\x0\x0\x0\x3c\x66\x7e\x6\x3c\x0\x0\x3c\x66\x6\x1e\x6\x6\x0\x0\x0\x7c\x66\x66\x7c\x60\x3e" "\x6\x6\x3e\x66\x66\x66\x66\x0\x18\x0\x18\x18\x18\x18\x18\x0\x30\x0\x30\x30\x30\x30\x33\x1e\x6\x6\x66\x36\x1e\x36\x66\x0\x18\x18\x18\x18\x18\x18\x18\x0\x0\x0\x3e\x6b\x6b\x6b\x63\x0\x0\x0\x3c\x66\x66\x66\x66\x0\x0\x0\x3c\x66\x66\x66\x3c\x0" "\x0\x0\x3e\x66\x66\x3e\x6\x6\x0\x0\x7c\x66\x66\x7c\x60\x60\x0\x0\x3e\x66\x6\x6\x6\x0\x0\x0\x7c\x6\x3c\x60\x3e\x0\x6\x6\x3e\x6\x6\x66\x3c\x0\x0\x0\x66\x66\x66\x66\x3c\x0\x0\x0\x66\x66\x66\x3c\x18\x0\x0\x0\x63\x63\x6b\x6b\x3e\x0" "\x0\x0\x66\x66\x3c\x66\x66\x0\x0\x0\x66\x66\x66\x7c\x60\x3e\x0\x0\x7e\x30\x18\xc\x7e\x0\x38\xc\xc\x7\xc\xc\x38\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\x3e\x63\x3\x63\x3e\x30\x60\x3e\x0\x33\x0\x33\x33\x33\x6e\x0\x38\x0\x1e\x33\x3f\x3\x1e\x0\x7e\x81\x3c\x60\x7c\x66\xdc\x0\x33\x0\x1e\x30\x3e\x33\x6e\x0\x7\x0\x1e\x30\x3e\x33\x6e\x0\xc\xc\x1e\x30\x3e\x33\x6e\x0\x0\x0\x3e\x63\x3\x1e\x30\x1c" "\x7e\x81\x3c\x66\x7e\x6\x3c\x0\x33\x0\x1e\x33\x3f\x3\x1e\x0\x7\x0\x1e\x33\x3f\x3\x1e\x0\x33\x0\xe\xc\xc\xc\x1e\x0\x3e\x41\x1c\x18\x18\x18\x3c\x0\x7\x0\xe\xc\xc\xc\x1e\x0\x63\x8\x3e\x63\x7f\x63\x63\x0\xc\xc\x0\x1e\x33\x3f\x33\x0" "\x38\x0\x3f\x6\x1e\x6\x3f\x0\x0\x0\xfe\x30\xfe\x33\xfe\x0\x7c\x36\x33\x7f\x33\x33\x73\x0\x1e\x21\x0\x1e\x33\x33\x1e\x0\x0\x33\x0\x1e\x33\x33\x1e\x0\x0\x7\x0\x1e\x33\x33\x1e\x0\x1e\x21\x0\x33\x33\x33\x6e\x0\x0\x7\x0\x33\x33\x33\x6e\x0" "\x0\x33\x0\x33\x33\x3e\x30\x1f\xc3\x18\x3c\x66\x66\x3c\x18\x0\x33\x0\x33\x33\x33\x33\x1e\x0\x18\x18\x7e\x3\x3\x7e\x18\x18\x1c\x36\x26\xf\x6\x67\x3f\x0\x33\x33\x1e\xc\x3f\xc\x3f\xc\x1f\x33\x33\x5f\x63\xf3\x63\xc3\x70\xd8\x18\x3c\x18\x18\x1b\xe" "\x38\x0\x1e\x30\x3e\x33\x6e\x0\x1c\x0\xe\xc\xc\xc\x1e\x0\x0\x38\x0\x1e\x33\x33\x1e\x0\x0\x38\x0\x33\x33\x33\x6e\x0\x0\x1f\x0\x1d\x33\x33\x33\x0\x3f\x0\x33\x37\x3f\x3b\x33\x0\x3c\x36\x36\x7c\x0\x7e\x0\x0\x1c\x36\x36\x1c\x0\x3e\x0\x0" "\x18\x0\x18\x18\xc\x66\x3c\x0\x0\x0\x0\x3f\x3\x3\x0\x0\x0\x0\x0\x3f\x30\x30\x0\x0\x63\x33\x1b\x6c\xd6\x43\x21\xf0\xc3\x63\x33\xdb\xec\xb6\xf3\xc0\x18\x0\x18\x18\x3c\x3c\x18\x0\x0\xcc\x66\x33\x66\xcc\x0\x0\x0\x33\x66\xcc\x66\x33\x0\x0" "\x44\x11\x44\x11\x44\x11\x44\x11\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xbb\xee\xbb\xee\xbb\xee\xbb\xee\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x18\x1f\x18\x18\x18\x18\x18\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6c\x6c\x6f\x6c\x6c\x6c\x0\x0\x0\x0\x7f\x6c\x6c\x6c" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 4 FontEntry("DX-FUTUR", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x14\x14\x0\x0\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x3e\x63\x6\x73\x63\x63\x3e\x0\x30\x30\x18\x0\x0\x0\x0\x0" "\xc\x6\x6\x6\x6\x6\xc\x0\xc\x18\x18\x18\x18\x18\xc\x0\x0\x22\x14\x36\x14\x22\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\xc0\x60\x30\x18\xc\x6\x3\x0" "\x7e\x63\x73\x6b\x67\x63\x3f\x0\x1c\x18\x18\x18\x18\x18\x3c\x0\x3f\x60\x3e\x3\x3\x3\x7f\x0\x7f\x60\x38\x60\x60\x60\x3f\x0\x63\x63\x7f\x60\x60\x60\x60\x0\x7f\x3\x3f\x60\x60\x60\x3f\x0\x7e\x3\x7f\x63\x63\x63\x3f\x0\x7f\x60\x30\x18\x18\x18\x18\x0" "\x7e\x63\x3e\x63\x63\x63\x3f\x0\x3e\x63\x7e\x60\x60\x60\x60\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x7e\x63\x63\x38\x0\x18\x18\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x70\x78\x6c\x66\x63\x63\x6f\x0\x3f\x60\x3b\x63\x63\x63\x3f\x0\x7e\x0\x3\x3\x3\x3\x7e\x0\x1f\x30\x63\x63\x63\x63\x3f\x0\x7f\x0\xf\x3\x3\x3\x7f\x0\x7f\x0\xf\x3\x3\x3\x3\x0\x7e\x0\x7b\x63\x63\x63\x3e\x0" "\x63\x63\x7f\x63\x63\x63\x63\x0\x3c\x0\x18\x18\x18\x18\x3c\x0\x30\x30\x30\x30\x30\x30\x1f\x0\x43\x63\x33\x7b\x63\x63\x63\x0\x6\x6\x6\x6\x6\x6\x7e\x0\x3f\x60\x6b\x6b\x6b\x63\x63\x0\x3f\x60\x63\x63\x63\x63\x63\x0\x7e\x60\x63\x63\x63\x63\x3f\x0" "\x7e\x60\x3e\x6\x6\x6\x6\x0\x7e\x63\x63\x63\x63\x3\x7f\x0\x7f\x60\x3f\x33\x63\x63\x63\x0\x7e\x3\x7f\x60\x60\x60\x3f\x0\x7e\x0\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x3\x7e\x0\x63\x63\x63\x63\x33\x1b\xf\x0\x63\x63\x6b\x6b\x6b\x63\x3f\x0" "\x63\x36\x1c\x0\x1c\x36\x63\x0\x63\x63\x3f\x0\xc\xc\xc\x0\x7f\x0\x30\x18\xc\x6\x7f\x0\x3c\xc\xc\xc\xc\xc\x3c\x0\x3\x6\xc\x18\x30\x60\xc0\x0\x3c\x30\x30\x30\x30\x30\x3c\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x7f\x60\x6e\x63\x3f\x0\x3\x3\x7b\x63\x63\x63\x3e\x0\x0\x0\x7e\x3\x3\x3\x7e\x0\x60\x60\x6e\x63\x63\x63\x3f\x0\x0\x0\x7e\x63\x3b\x3\x7f\x0\x3c\x0\x1e\x6\x6\x6\x6\x0\x0\x0\x7e\x63\x63\x6f\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x18\x18\x18\x18\x18\x0\x30\x0\x30\x30\x30\x30\x30\x1f\x3\x3\x63\x33\x7b\x63\x63\x0\x1c\x18\x18\x18\x18\x18\x18\x0\x0\x0\x3f\x63\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x7e\x63\x63\x63\x3f\x0" "\x0\x0\x7e\x63\x63\x3b\x3\x3\x0\x0\x7e\x63\x63\x6f\x60\x60\x0\x0\x7c\x6\x6\x6\x6\x0\x0\x0\x7e\x3\x7f\x60\x3f\x0\xc\x0\x3c\xc\xc\xc\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x33\x1f\x0\x0\x0\x63\x6b\x6b\x63\x3f\x0" "\x0\x0\x63\x36\x14\x36\x63\x0\x0\x0\x63\x63\x63\x6f\x60\x3f\x0\x0\x7f\x0\xc\x6\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\x5a\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x1f\x31\x31\x31\x3f\x3e\x0\x0\x3e\x62\x62\x62\x7e\x7c\x0\x0\x7c\xc4\xc4\xc4\xfc\xf8\x0\x0\xf8\x88\x88\x88\xf8\xf0\x0\x0\xf0\x10\x10\x10\xf0\xe0\x0" "\x0\xe0\x20\x20\x20\xe0\xc0\x0\x0\xc0\x40\x40\x40\xc0\x80\x0\x0\x80\x80\x80\x80\x80\x0\x0\x0\x0\x1\x1\x1\x1\x1\x0\x0\x1\x3\x3\x3\x3\x3\x0\x0\x3\x6\x6\x6\x7\x7\x0\x0\x7\xc\xc\xc\xf\xf\x0\x0\xf\x18\x18\x18\x1f\x1f\x0" "\x18\x18\x18\x18\x18\x18\x18\x18\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x8\x0\x0\x0\x0\x2\x2\x2\x2\x2\x2\x2\x0\x12\x12\x12\x12\x12\x12\x12" "\x0\x92\x92\x92\x92\x92\x92\x92\x0\x4\x4\x4\x4\x4\x4\x4\x0\x24\x24\x24\x24\x24\x24\x24\x0\x24\x24\x24\x24\x24\x24\x24\x0\x1\x1\x1\x1\x1\x1\x1\x0\x9\x9\x9\x9\x9\x9\x9\x0\x49\x49\x49\x49\x49\x49\x49\x0\x0\x0\x18\x18\x0\x0\x0" "\x0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x70\x88\x4\x0\x0\x0\x0\x0\x0\x20\x11\xe\x0\x0\x0\x3e\x22\x22\x22\x22\xe3\x0\x0\x3e\x22\x22\x22\x22\x63\x0\x0\xc\x34\xc4\x4\x4\x4\x0\x0\x20\x20\x20\x23\x2c\x30\x0\x0\x60\x20\x20\x20\x20\x60\x0" "\x0\x3\x2\x2\x2\x2\x3\x0\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0" "\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 5 FontEntry("EK-MAC", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x41\x55\x41\x5d\x22\x1c\x0\x3e\x49\x49\x7f\x5d\x22\x1c\x0\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x1c\x6b\x7f\x6b\x8\x1c\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x18\x3c\x3c\x3c\x18\x0\x0" "\x7e\x66\x42\x42\x42\x66\x7e\x0\x0\x18\x24\x24\x24\x18\x0\x0\x7e\x66\x5a\x5a\x5a\x66\x7e\x0\x70\x60\x50\x3c\x66\x66\x3c\x0\x3c\x66\x66\x3c\x18\x7e\x18\x0\x30\x30\x30\x30\x30\x1c\xc\x0\x7c\x6c\x6c\x6c\x67\x3b\x18\x0\x80\xaa\x94\xaa\x94\xaa\x80\xff" "\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x30\x3c\x3f\x3c\x30\x0\x0\x8\x3e\x8\x3e\x8\x8\x0\x0\x66\x66\x66\x66\x66\x0\x66\x0\x7c\x5a\x5a\x5a\x5c\x58\x58\x0\x3c\x46\x3e\x66\x7c\x62\x3c\x0\x0\x0\x0\x7e\x7e\x0\x0\x0\x8\x1c\x3e\x0\x3e\x1c\x8\x7f" "\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0\x0\x8\x18\x38\x78\x38\x18\x8\x0\x10\x18\x1c\x1e\x1c\x18\x10\x0\x0\x0\x0\x6\x6\x6\x7e\x0\x0\x14\x36\x77\x36\x14\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x36\x36\x14\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x0\x0\x18\x3c\x46\x3c\x62\x3c\x18\x0\x4\x6a\x34\x18\x2c\x56\x20\x0\x1c\x36\x1c\x26\x66\x66\x7c\x0\x18\x10\x8\x0\x0\x0\x0\x0" "\x30\x18\x18\x18\x18\x18\x30\x0\xc\x18\x18\x18\x18\x18\xc\x0\x18\x5a\x3c\x5a\x18\x0\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x60\x30\x18\xc\x6\x0\x0" "\x3c\x66\x66\x66\x66\x66\x3c\x0\x18\x1c\x18\x18\x18\x18\x18\x0\x3c\x66\x60\x30\x18\xc\x7e\x0\x3c\x66\x60\x38\x60\x66\x3c\x0\x70\x78\x6c\x66\x7e\x60\x60\x0\x7e\x6\x3e\x60\x60\x66\x3c\x0\x3c\x66\x6\x3e\x66\x66\x3c\x0\x7e\x60\x30\x18\x18\x18\x18\x0" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x3c\x66\x66\x7c\x60\x66\x3c\x0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x10\x8\x0\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3c\x66\x60\x30\x18\x0\x18\x0" "\x3c\x62\x6a\x6a\x7a\x2\x3c\x0\x3c\x66\x66\x66\x7e\x66\x66\x0\x3e\x66\x66\x3e\x66\x66\x3e\x0\x3c\x66\x6\x6\x6\x66\x3c\x0\x3e\x66\x66\x66\x66\x66\x3e\x0\x7e\x6\x6\x1e\x6\x6\x7e\x0\x7e\x6\x6\x1e\x6\x6\x6\x0\x3c\x66\x6\x76\x66\x66\x3c\x0" "\x66\x66\x66\x7e\x66\x66\x66\x0\x18\x18\x18\x18\x18\x18\x18\x0\x60\x60\x60\x60\x60\x66\x3c\x0\x66\x66\x66\x3e\x66\x66\x66\x0\x6\x6\x6\x6\x6\x6\x3e\x0\x3f\x6b\x6b\x6b\x6b\x6b\x6b\x0\x3e\x66\x66\x66\x66\x66\x66\x0\x3c\x66\x66\x66\x66\x66\x3c\x0" "\x3e\x66\x66\x66\x3e\x6\x6\x0\x3c\x66\x66\x66\x66\x36\x6c\x0\x3e\x66\x66\x3e\x66\x66\x66\x0\x3c\x66\x6\x3c\x60\x66\x3c\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x66\x66\x66\x66\x66\x66\x3c\x0\x66\x66\x66\x66\x66\x26\x1e\x0\x6b\x6b\x6b\x6b\x6b\x6b\x3f\x0" "\x66\x66\x66\x3c\x66\x66\x66\x0\x66\x66\x66\x3c\x18\x18\x18\x0\x7e\x60\x30\x18\xc\x6\x7e\x0\x78\x18\x18\x18\x18\x18\x18\x78\x0\x6\xc\x18\x30\x60\x0\x0\x1e\x18\x18\x18\x18\x18\x18\x1e\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7e" "\x18\x8\x10\x0\x0\x0\x0\x0\x0\x0\x3c\x62\x7c\x66\x7c\x0\x6\x6\x3e\x66\x66\x66\x3e\x0\x0\x0\x3c\x66\x6\x66\x3c\x0\x60\x60\x7c\x66\x66\x66\x7c\x0\x0\x0\x3c\x66\x7e\x6\x3c\x0\x38\x4c\x1e\xc\xc\xc\xc\x0\x0\x0\x7c\x66\x66\x7c\x62\x3c" "\x6\x6\x3e\x66\x66\x66\x66\x0\x18\x0\x1c\x18\x18\x18\x18\x0\x30\x0\x38\x30\x30\x30\x32\x1c\x6\x6\x66\x66\x3e\x66\x66\x0\x1c\x18\x18\x18\x18\x18\x18\x0\x0\x0\x3f\x6b\x6b\x6b\x6b\x0\x0\x0\x3e\x66\x66\x66\x66\x0\x0\x0\x3c\x66\x66\x66\x3c\x0" "\x0\x0\x3e\x66\x66\x66\x3e\x6\x0\x0\x7c\x66\x66\x66\x7c\x60\x0\x0\x3e\x66\x66\x6\x6\x0\x0\x0\x3c\x46\x3c\x62\x3c\x0\x0\x18\x3c\x18\x18\x18\x30\x0\x0\x0\x66\x66\x66\x66\x3c\x0\x0\x0\x66\x66\x66\x26\x1e\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x66\x66\x3c\x66\x66\x0\x0\x0\x66\x66\x66\x7c\x62\x3c\x0\x0\x7e\x30\x18\xc\x7e\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\xc\x18\x18\x30\x18\x18\xc\x0\xc\x5a\x30\x0\x0\x0\x0\x0\x0\x0\x18\x24\x66\x7e\x0\x0" "\xfe\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\x7f\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xfe\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x7f" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xfc\xfe\x7\xf3\xb\xb\xb\xb\xff\xff\x0\xff\x0\x0\x0\x0" "\x3f\x7f\xe0\xcf\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xb\xb\xb\xb\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xf3\x7\xfe\xfc\x0\x0\x0\x0\xff\x0\xff\xff\xd0\xd0\xd0\xd0\xcf\xe0\x7f\x3f\xb\x9\x4\x3\x0\x0\x0\x0\xd0\x90\x20\xc0\x0\x0\x0\x0" "\x0\x0\x0\x0\x3\x4\x9\xb\x0\x0\x0\x0\xc0\x20\x90\xd0\x0\x0\x0\xaa\x0\x0\x0\x0\x0\x3f\x7e\x3f\x7e\x3f\x7e\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\x7e\xfc\x7e\xfc\x7e\xfc\x0\x0\xfe\xf0\xfe\xf0\xfe\xf0\x0\x0\xfe\xe0\xfe\xe0\xfe\xe0\x0" "\x0\xfc\xc0\xfc\xc0\xfc\xc0\x0\x0\xf0\x80\xf0\x80\xf0\x80\x0\x0\xc0\x0\xc0\x0\xc0\x0\x0\x0\x0\x3\x0\x3\x0\x3\x0\x0\x1\xf\x1\xf\x1\xf\x0\x0\x3\x3f\x3\x3f\x3\x3f\x0\x0\x7\x7f\x7\x7f\x7\x7f\x0\x0\xf\x7f\xf\x7f\xf\x7f\x0" "\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\xff\xff\x0\xff\x0\x18\x3c\x0\xff\xff\x0\xff\x0\x0\x0\x7e\xff\xff\x0\xff\x0\x18\x3c\x7e\xff\xff\x0\xff\x0\x3e\x56\x56\x0\x0\x0\x18\x18\x0\x0\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0" "\x0\xff\xff\xff\xff\xff\xff\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\xff\xff\xff\xff\xff\xff\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0\x0\xff\xff\xff\xff\xff\xff\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0" "\x0\x0\x0\xf\x18\x1f\x18\x18\x6c\x6c\x6c\x67\x60\x67\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x3f\x60\x67\x6c\x6c\x6c\x6c\x6c\x67\x60\x3f\x0\x0\x6c\x6c\x6c\x3f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\xf\x0\x0\x0\x0\x0\xf\x18\x18\x18\x18" "\x18\x18\x18\xf0\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xcc\xc\xf8\x0\x0\x0\x0\x0\xf8\xc\xcc\x6c\x6c\x6c\x6c\x6c\xc7\x0\xff\x0\x0\x0\x0\x0\xff\x0\xc7\x6c\x6c\x6c\x6c\x6c\xcc\xc\xcc\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xc7\x0\xc7\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xf8\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf0\x0\x0\x0\x0\x0\xf0\x18\xf8\x18\x18\x0\x0\x0\xf8\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\xf\x0\x0\x0\x0\x0\x0\x0\xf0\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x0\x6c\x36\x36\x6c\x0\x3c\x66\x66\x36\x66\x66\x36\x6\x3c\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7e\x6\xc\x18\xc\x6\x7e\x0\x0\x0\xfc\x66\x66\x66\x3c\x0\x0\x0\x66\x66\x66\x66\x3e\x3\x0\x0\x3c\x18\x18\x18\x30\x0" "\x0\x18\x3c\x66\x66\x66\x3c\x18\x38\x64\x66\x7e\x66\x26\x1c\x0\x3c\x66\x66\x66\x24\x24\x66\x0\x70\x98\x3c\x66\x66\x66\x3c\x0\x0\x0\x36\x6b\x6b\x36\x0\x0\x0\x60\x3c\x66\x66\x66\x3c\x6\x0\x0\x7c\x6\x7e\x6\x7c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 6 FontEntry("EK-SPACE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x41\x55\x41\x5d\x22\x1c\x0\x3e\x49\x49\x7f\x5d\x22\x1c\x0\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x1c\x6b\x7f\x6b\x8\x1c\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x1c\x3e\x3e\x3e\x1c\x0\x0" "\x7f\x63\x41\x41\x41\x63\x7f\x0\x0\x1c\x22\x22\x22\x1c\x0\x0\x7f\x63\x5d\x5d\x5d\x63\x7f\x0\x70\x60\x50\x3e\x63\x63\x3e\x0\x3e\x63\x63\x3e\x8\x3e\x8\x0\x30\x30\x30\x30\x30\x1c\xc\x0\x7c\x6c\x6c\x6c\x67\x3b\x18\x0\x80\xaa\x94\xaa\x94\xaa\x80\xff" "\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x30\x3c\x3f\x3c\x30\x0\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\x7e\x6b\x6b\x6b\x6e\x68\x68\x0\x7e\x3\x3f\x63\x7e\x60\x3f\x0\x0\x0\x0\x7e\x7e\x0\x0\x0\x8\x1c\x3e\x0\x3e\x1c\x8\x7f" "\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0\x0\x8\x18\x38\x78\x38\x18\x8\x0\x10\x18\x1c\x1e\x1c\x18\x10\x0\x0\x0\x0\x3\x3\x3\x7e\x0\x0\x14\x36\x77\x36\x14\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x36\x36\x14\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x6b\xb\x3e\x68\x6b\x3e\x0\x4c\x6a\x36\x18\x6c\x56\x32\x0\x1c\x36\x1c\x26\x63\x63\x7e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x60\x30\x18\xc\x6\x0\x0" "\x3e\x63\x63\x6b\x63\x63\x3e\x0\x18\x1c\x18\x18\x18\x18\x7e\x0\x3e\x63\x60\x38\xe\x3\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x66\x63\x7f\x60\x0\x7f\x3\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x30\x18\x3e\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x18\x8\x0\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x3e\x0\x3e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3c\x62\x60\x30\x18\x0\x18\x0" "\x3c\x62\x6b\x6b\x7b\x3\x3e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x63\x63\x3f\x63\x63\x3f\x0\x3e\x63\x3\x3\x3\x63\x3e\x0\x3f\x63\x63\x63\x63\x63\x3f\x0\x7f\x3\x3\x1f\x3\x3\x7f\x0\x7f\x3\x3\x1f\x3\x3\x3\x0\x3e\x63\x3\x7b\x63\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x78\x60\x60\x60\x60\x63\x3e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x6\x6\x6\x6\x6\x6\x7e\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x63\x63\x63\x3f\x3\x3\x0\x3e\x63\x63\x63\x6b\x33\x6e\x60\x3f\x63\x63\x63\x3f\x63\x63\x0\x3e\x63\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x63\x36\x1c\x36\x63\x63\x0\x66\x66\x66\x3c\x18\x18\x18\x0\x7f\x30\x18\x3e\xc\x6\x7f\x0\x78\x18\x18\x18\x18\x18\x18\x78\x0\x6\xc\x18\x30\x60\x0\x0\x1e\x18\x18\x18\x18\x18\x18\x1e\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x18\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x46\x6\x3f\x6\x6\x6\x0\x0\x0\x3e\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x18\x0\x30\x0\x38\x30\x30\x30\x31\x1e\x3\x3\x63\x3b\xf\x3b\x63\x0\x1c\x18\x18\x18\x18\x18\x18\x0\x0\x0\x36\x7f\x6b\x6b\x63\x0\x0\x0\x3e\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3e\x63\x63\x63\x3f\x3\x0\x0\x3e\x63\x63\x63\x7e\x60\x0\x0\x3e\x63\x63\x3\x3\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\xc\xc\x3e\xc\xc\xc\x38\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x22\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3e\x0\x0\x7f\x30\x1c\x6\x7f\x0\x38\xc\xc\x6\xc\xc\x38\x0\x18\x18\x18\x18\x18\x18\x18\x18\xe\x18\x18\x30\x18\x18\xe\x0\xe\x99\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xfe\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\x7f\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xfe\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x7f" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x1\x2\x2\x4\x8\x30\xc0\x3\xc\x10\x20\x40\x40\x80\x80\xf0\xfc\xe\x6\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xf\x3f\x70\x60\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x6\xe\xfc\xf0\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\x60\x70\x3f\xf\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x55\xaa\x0\x0\x0\x0\x38\x7e\x7f\x7f\x7f\x3e\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x1c\x7e\xfe\xfe\xfe\x7c\x0\x0\x0\x38\x7e\xfe\xfe\xfc\x0\x0\x0\x0\x0\x1e\xfe\xfc\x0" "\x0\x0\x0\x0\x0\xe\xfc\x0\x0\x0\x0\x0\x0\x80\xe0\x0\x0\x0\x0\x0\x0\x80\xc0\x0\x0\x0\x0\x0\x0\x1\x3\x0\x0\x0\x0\x0\x0\x1\x7\x0\x0\x0\x0\x0\x0\x70\x3f\x0\x0\x0\x0\x0\x78\x7f\x3f\x0\x0\x0\x1c\x7e\x7f\x7f\x3f\x0" "\x14\x2a\x14\x2a\x14\x2a\x14\x2a\xff\xff\x0\x0\x8\x1c\x3e\x0\xff\xff\x0\x0\x0\x0\x0\x2a\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\x36\x7f\x6b\x6b\x6b\x0\x0\x0\x18\x18\x0\x0\x0\x0\x6\x3\x3\x3\x3\x1\x0\x0\xe\x1b\x1b\x1b\x1b\x31\x0" "\x0\x8e\xdb\xdb\xdb\xdb\x71\x0\x0\x3\x6\x6\x6\x6\xc\x0\x0\x63\x36\x36\x36\x36\x1c\x0\x0\xe3\xb6\xb6\xb6\xb6\x1c\x0\x0\x0\x1\x1\x1\x1\x3\x0\x0\x18\xd\xd\xd\xd\x7\x0\x0\x38\x6d\x6d\x6d\x6d\xc7\x0\x0\x1c\x3e\x3e\x3e\x1c\x0\x0" "\x0\x0\x0\xf\x18\x1f\x18\x18\x6c\x6c\x6c\x67\x60\x67\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x3f\x60\x67\x6c\x6c\x6c\x6c\x6c\x67\x60\x3f\x0\x0\x6c\x6c\x6c\x3f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\xf\x0\x0\x0\x0\x0\xf\x18\x18\x18\x18" "\x18\x18\x18\xf0\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xcc\xc\xf8\x0\x0\x0\x0\x0\xf8\xc\xcc\x6c\x6c\x6c\x6c\x6c\xc7\x0\xff\x0\x0\x0\x0\x0\xff\x0\xc7\x6c\x6c\x6c\x6c\x6c\xcc\xc\xcc\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xc7\x0\xc7\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xf8\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf0\x0\x0\x0\x0\x0\xf0\x18\xf8\x18\x18\x0\x0\x0\xf8\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\xf\x0\x0\x0\x0\x0\x0\x0\xf0\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x0\x6e\x33\x33\x6e\x0\x3c\x66\x63\x3b\x63\x63\x3b\x3\x3c\x46\x6\x6\x6\x6\x6\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3c\x46\xc\x18\xc\x46\x3c\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\x66\x66\x66\x66\x3e\x3\x0\x0\x3e\xc\xc\xc\x18\x0" "\x0\x8\x3e\x6b\x6b\x6b\x3e\x8\x3c\x66\x63\x7f\x63\x33\x1e\x0\x3e\x63\x63\x63\x36\x36\x63\x0\x70\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x36\x6b\x6b\x36\x0\x0\x0\x0\x5e\x33\x6b\x66\x3d\x0\x0\x0\x7e\x3\x7f\x3\x7e\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 7 FontEntry("FINELINE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x42\x42\x42\x3c\x0\xff\xc3\xbd\xbd\xbd\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x1e\x21\x21\x21\x21\x21\x1e\x0\x8\xc\x8\x8\x8\x8\x1c\x0\x1e\x21\x10\x8\x4\x2\x3f\x0\x3e\x41\x40\x3c\x40\x41\x3e\x0\x30\x28\x24\x22\x7f\x20\x20\x0\x7f\x1\x1\x3f\x40\x40\x3f\x0\x3e\x41\x1\x3f\x41\x41\x3e\x0\x7f\x20\x10\x8\x8\x8\x8\x0" "\x3e\x41\x41\x3e\x41\x41\x3e\x0\x3e\x41\x41\x7e\x40\x41\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x0\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x1c\x22\x41\x41\x7f\x41\x41\x0\x3f\x41\x41\x3f\x41\x41\x3f\x0\x3e\x41\x1\x1\x41\x41\x3e\x0\x3f\x41\x41\x41\x41\x41\x3f\x0\x7f\x1\x1\x1f\x1\x1\x7f\x0\x7f\x1\x1\x1f\x1\x1\x1\x0\x3e\x41\x1\x79\x41\x61\x5e\x0" "\x41\x41\x41\x7f\x41\x41\x41\x0\x3e\x8\x8\x8\x8\x8\x3e\x0\x78\x20\x20\x20\x20\x21\x1e\x0\x21\x11\x9\x7\x9\x11\x21\x0\x2\x2\x2\x2\x2\x2\x7e\x0\x63\x55\x55\x49\x49\x41\x41\x0\x41\x43\x45\x49\x51\x61\x41\x0\x3e\x41\x41\x41\x41\x41\x3e\x0" "\x3f\x42\x42\x3e\x2\x2\x7\x0\x3e\x41\x41\x49\x51\x61\x3e\x40\x1f\x21\x21\x1f\x11\x21\x21\x40\x3e\x41\x1\x3e\x40\x41\x3e\x0\x7f\x8\x8\x8\x8\x8\x8\x0\x41\x41\x41\x41\x41\x41\x3e\x0\x41\x41\x41\x41\x41\x22\x1c\x0\x41\x49\x49\x49\x55\x63\x41\x0" "\x41\x22\x14\x8\x14\x22\x41\x0\x41\x22\x14\x8\x8\x8\x8\x0\x7f\x20\x10\x8\x4\x2\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x40\x7e\x41\x7e\x0\x1\x1\x3f\x41\x41\x41\x3f\x0\x0\x0\x3e\x41\x1\x41\x3e\x0\x40\x40\x7e\x41\x41\x41\x7e\x0\x0\x0\x3e\x41\x7f\x1\x3e\x0\x3c\x42\x2\x3f\x2\x2\x2\x0\x0\x0\xbe\x41\x41\x7e\x40\x3e" "\x1\x1\x3f\x41\x41\x41\x41\x0\xc\x0\x8\x8\x8\x8\x1c\x0\x20\x0\x30\x20\x20\x20\x21\x1e\x1\x1\x31\x9\x7\x9\x31\x0\x8\x8\x8\x8\x8\x8\x18\x0\x0\x0\x63\x55\x49\x49\x41\x0\x0\x0\x3f\x41\x41\x41\x41\x0\x0\x0\x3e\x41\x41\x41\x3e\x0" "\x0\x0\x3f\x41\x41\x3f\x1\x1\x0\x0\x7e\x41\x41\x7e\x40\xc0\x0\x0\x39\x66\x2\x2\x2\x0\x0\x0\x7e\x1\x3e\x40\x3f\x0\x8\x8\x3e\x8\x8\x8\x18\x0\x0\x0\x41\x41\x41\x41\x7e\x0\x0\x0\x41\x41\x41\x22\x1c\x0\x0\x0\x41\x49\x55\x63\x41\x0" "\x0\x0\x22\x14\x8\x14\x22\x0\x0\x0\x41\x41\x41\x7e\x40\x3f\x0\x0\x7f\x10\x8\x4\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x1e\x33\x2d\x2d\x33\x1e\x0\x0\x3c\x66\x5a\x5a\x66\x3c\x0\x0\x78\xcc\xb4\xb4\xcc\x78\x0\x0\xf0\x98\x68\x68\x98\xf0\x0\x0\xe0\x30\xd0\xd0\x30\xe0\x0" "\x0\xc0\x60\xa0\xa0\x60\xc0\x0\x0\x80\xc0\x40\x40\xc0\x80\x0\x0\x0\x80\x80\x80\x80\x0\x0\x0\x0\x1\x1\x1\x1\x0\x0\x0\x1\x3\x2\x2\x3\x1\x0\x0\x3\x6\x5\x5\x6\x3\x0\x0\x7\xc\xb\xb\xc\x7\x0\x0\xf\x19\x16\x16\x19\xf\x0" "\x36\x2a\x36\x2a\x36\x2a\x36\x2a\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x10\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 8 FontEntry("FN-ICE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x4\xc\x1c\x1c\x1c\x0\x1c\x0\x36\x36\x14\x0\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x0\x8\x3c\x6a\xc\x38\x6a\x3c\x8\x0\x7a\x25\x12\x8\x24\x52\x20\x10\x0\x18\x24\x4\x18\x0\x8\xc\xc\x6\x0\x0\x0\x0\x0" "\x30\x18\xc\xc\xc\xc\x18\x30\xc\x18\x30\x30\x30\x30\x18\xc\x0\x41\x36\x1c\x3e\x5d\x8\x8\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x40\x60\x30\x18\xc\x6\x2\x0" "\x3e\x63\x63\x63\x63\x63\x3e\x0\x8\x8\xc\xe\xc\xc\x1e\x0\x1e\x23\x31\x18\x6\x23\x3f\x0\x1e\x23\x20\x1c\x20\x23\x1e\x0\x23\x23\x23\x23\x3e\x20\x20\x0\x3f\x3\x3\x3f\x20\x21\x1e\x0\x3e\x3\x3\x1f\x23\x23\x1e\x0\x3f\x23\x20\x10\x8\xc\xc\x0" "\x1e\x23\x23\x1e\x23\x23\x1e\x0\x1e\x23\x23\x3e\x20\x23\x1e\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x0\x60\x30\x18\xc\x18\x30\x60\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x3e\x47\x20\x10\x18\x0\x18\x0" "\x3e\x41\x5d\x45\x5d\x41\x3e\x0\x7\xf\x1b\x33\x3f\x33\x33\x0\xf\x1b\x33\x7f\x33\x63\x3f\x0\x7\xf\x1b\x33\x3\x3\x3f\x0\x7\xf\x1b\x33\x63\x63\x3f\x0\x7\xf\x1b\x33\xf\x3\x3f\x0\x7\xf\x1b\x33\xf\x3\x3\x0\xf\x1f\x33\x23\x1b\x23\x3f\x0" "\x3\x3\x13\x33\x3f\x33\x33\x0\x8\x18\x18\x18\x18\x18\x18\x0\x20\x30\x30\x30\x33\x33\x3e\x0\x3\x1b\x33\x33\xf\x33\x33\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x3\x17\x3b\x33\x33\x33\x33\x0\x6\xf\x1b\x33\x63\x63\x3e\x0" "\x7\xf\x1b\x33\x3f\x3\x3\x0\xe\x1b\x33\x63\x63\x33\x6e\x0\x7\xf\x1b\x33\x1f\x33\x33\x0\x7\xf\x1b\x3\x1e\x20\x1f\x0\x3\x6\xc\x1c\x2c\xc\xc\x0\x3\x3\x23\x63\x63\x63\x3e\x0\x3\x3\x23\x63\x36\x1c\x8\x0\x3\x3\x23\x6b\x6b\x6b\x3e\x0" "\x22\x63\x36\x8\x36\x63\x22\x0\x3\x13\x33\x36\x3c\x20\x1f\x0\x6\xd\x18\x18\xc\x6\x3f\x0\x38\xc\xc\xc\xc\xc\xc\x38\x2\x6\xc\x18\x30\x60\x40\x0\x1c\x30\x30\x30\x30\x30\x30\x1c\x8\x1c\x36\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x33\x33\x6e\x0\x1\x3\x3\x1f\x33\x33\x1f\x0\x0\x0\x0\x1e\x33\x3\x3e\x0\x30\x30\x30\x3e\x33\x33\x3e\x0\x0\x0\x0\x1e\x33\xf\x3e\x0\x1c\x36\x6\x6\x1f\x6\x6\x0\x0\x0\x0\x1e\x33\x3e\x31\x1e" "\x3\x3\x3\x1f\x33\x33\x33\x0\x0\xc\x0\xc\xc\xc\xc\x0\x0\x30\x0\x30\x30\x33\x33\x1e\x3\x3\x33\x1b\xf\x1b\x33\x0\xe\xc\xc\xc\xc\xc\xc\x0\x0\x0\x0\x37\x7f\x6b\x63\x0\x0\x0\x0\x1d\x33\x33\x33\x0\x0\x0\x0\x1e\x33\x33\x1e\x0" "\x0\x0\x0\x3b\x66\x3e\x6\xf\x0\x0\x0\x6e\x33\x3e\x30\x78\x0\x0\x0\x3c\x66\x6\x6\x0\x0\x0\x0\x3e\x7\x38\x1f\x0\x0\x8\xc\x3f\xc\x6c\x38\x0\x0\x0\x0\x33\x33\x33\x6e\x0\x0\x0\x0\x33\x33\x1e\xc\x0\x0\x0\x0\x6b\x6b\x7f\x36\x0" "\x0\x0\x0\x77\x18\xc\x77\x0\x0\x0\x0\x33\x33\x3e\x30\x1f\x0\x0\x0\x7f\x30\xe\x7f\x0\x38\xc\xc\x7\xc\xc\x38\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\xaa\x55\x55\xaa\x0\x0\x0\x0\xe\x7f\xff\x7f\xe\x0\x0\x0\x3c\x7e\xff\x7e\x3c\x0\x0\x0\x70\xfe\xff\xfe\x70\x0\x0\x0\xe0\xfc\xfe\xfc\xe0\x0\x0\x0\x0\xf0\xfc\xf0\x0\x0" "\x0\x0\x0\xc0\xf8\xc0\x0\x0\x0\x0\x0\x80\xf0\x80\x0\x0\x0\x0\x0\x80\xe0\x80\x0\x0\x0\x0\x0\x1\x7\x1\x0\x0\x0\x0\x0\x1\xf\x1\x0\x0\x0\x0\x0\x3\x1f\x3\x0\x0\x0\x0\x0\xf\x3f\xf\x0\x0\x0\x0\x7\x3f\x7f\x3f\x7\x0" "\x24\x18\x24\x18\x24\x18\x24\x18\xff\xff\x3e\x1c\x8\x8\x0\x0\xff\xff\x1c\x8\x8\x0\x0\x0\xff\xff\x3e\x3e\x1c\x1c\x8\x8\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x1\x3\x3\x3\x0\x0\x0\x1\x3\xb\x1b\x7\x6\x0" "\x0\xbb\xbb\x77\x77\x77\xee\xee\x0\x0\x1\x3\x7\x3\x1\x0\x0\x1\xb\x17\x37\x17\x6\x2\x0\xbb\xbb\x77\x77\x77\xee\xee\x0\x0\x1\x1\x1\x1\x0\x0\x0\x0\x3\x3\xf\x7\x2\x0\x0\xbb\xbb\x77\x77\x77\xee\xee\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 9 FontEntry("FN-LOWER", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x18\x7e\x3\x3e\x60\x3f\x18\x0\x0\x63\x33\x18\xc\x66\x63\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\xc\xc\x6\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x0\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x3e\x73\x7b\x6f\x67\x63\x3e\x0\xc\xe\xc\xc\xc\xc\x3f\x0\x1e\x33\x30\x1c\x6\x33\x3f\x0\x1e\x33\x30\x1c\x30\x33\x1e\x0\x38\x3c\x36\x33\x7f\x30\x78\x0\x3f\x3\x1f\x30\x30\x33\x1e\x0\x1c\x6\x3\x1f\x33\x33\x1e\x0\x3f\x33\x30\x18\xc\xc\xc\x0" "\x1e\x33\x33\x1e\x33\x33\x1e\x0\x1e\x33\x33\x3e\x30\x18\xe\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x18\xc\x6\x3\x6\xc\x18\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3c\x66\x30\x18\x18\x0\x18\x0" "\x3e\x63\x7b\x7b\x3b\x3\x3e\x0\x0\x0\x1e\x30\x3e\x33\x6e\x0\x7\x6\x6\x3e\x66\x66\x3b\x0\x0\x0\x1e\x33\x3\x33\x1e\x0\x38\x30\x30\x3e\x33\x33\x6e\x0\x0\x0\x1e\x33\x3f\x3\x1e\x0\x1c\x36\x26\xf\x6\x6\xf\x0\x0\x0\x6e\x33\x33\x3e\x30\x1f" "\x7\x6\x36\x6e\x66\x66\x67\x0\xc\x0\xe\xc\xc\xc\x1e\x0\x30\x0\x38\x30\x30\x33\x33\x1e\x7\x6\x66\x36\x1e\x36\x67\x0\xe\xc\xc\xc\xc\xc\x1e\x0\x0\x0\x33\x7f\x7f\x6b\x6b\x0\x0\x0\x1d\x33\x33\x33\x33\x0\x0\x0\x1e\x33\x33\x33\x1e\x0" "\x0\x0\x3b\x66\x66\x3e\x6\xf\x0\x0\x6e\x33\x33\x3e\x30\x78\x0\x0\x3b\x6e\x46\x6\xf\x0\x0\x0\x3e\x3\xe\x38\x1f\x0\x8\xc\x3f\xc\xc\x2c\x18\x0\x0\x0\x33\x33\x33\x33\x6e\x0\x0\x0\x33\x33\x33\x1e\xc\x0\x0\x0\x63\x63\x6b\x7f\x36\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x33\x33\x33\x3e\x30\x1f\x0\x0\x3f\x19\xc\x26\x3f\x0\x1e\x6\x6\x6\x6\x6\x1e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x1e\x30\x3e\x33\x6e\x0\x7\x6\x6\x3e\x66\x66\x3b\x0\x0\x0\x1e\x33\x3\x33\x1e\x0\x38\x30\x30\x3e\x33\x33\x6e\x0\x0\x0\x1e\x33\x3f\x3\x1e\x0\x1c\x36\x26\xf\x6\x6\xf\x0\x0\x0\x6e\x33\x33\x3e\x30\x1f" "\x7\x6\x36\x6e\x66\x66\x67\x0\xc\x0\xe\xc\xc\xc\x1e\x0\x30\x0\x38\x30\x30\x33\x33\x1e\x7\x6\x66\x36\x1e\x36\x67\x0\xe\xc\xc\xc\xc\xc\x1e\x0\x0\x0\x33\x7f\x7f\x6b\x6b\x0\x0\x0\x1d\x33\x33\x33\x33\x0\x0\x0\x1e\x33\x33\x33\x1e\x0" "\x0\x0\x3b\x66\x66\x3e\x6\xf\x0\x0\x6e\x33\x33\x3e\x30\x78\x0\x0\x3b\x6e\x46\x6\xf\x0\x0\x0\x3e\x3\xe\x38\x1f\x0\x8\xc\x3f\xc\xc\x2c\x18\x0\x0\x0\x33\x33\x33\x33\x6e\x0\x0\x0\x33\x33\x33\x1e\xc\x0\x0\x0\x63\x63\x6b\x7f\x36\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x33\x33\x33\x3e\x30\x1f\x0\x0\x3f\x19\xc\x26\x3f\x0\x38\xc\xc\x7\xc\xc\x38\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff" "\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x3\x1\x3\x7\xf\x1f\xbf\xff\xff\xfd\xf8\xf0\xe0\xc0\x80\xc0\xff\xff\x7\x7\x7\x7\x7\x7\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xe0\xe0\xe0\xe0\xe0\xe0\x7\x7\x7\x7\x7\x7\x7\x7\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\x7\x7\x7\x7\x7\x7\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xe0\xe0\xe0\xe0\xe0\xe0\xff\xff\x7\x7\x0\x0\x0\x0\x0\x0\xe0\xe0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x7\x7\x0\x0\x0\x0\x0\x0\xe0\xe0\x0\x0\x0\x0\x55\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x3c\x3c\x3c\x3c\x3c\x3c\x3c\x3c\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x0\x18\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x38\x44\x82\x0\x0\x0\x0\x0\x0\x0\x0\x41\x22\x1c\x0\x0\xfc\x84\x84\x84\x80\x80\x0\x0\x0\x0\x10\x10\x10\x1f\x0\x0\x80\x80\x80\x8c\xb0\xc0\x0\x0\x1\x6\x18\x0\x0\x0\x0\x3c\x66\x30\x18\x18\x0\x18\x0" "\x3c\x66\x30\x18\x18\x0\x18\x0\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x8\x1c\x8\x0\x0\x0\x0\x0\x18\x3c\x18\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0" "\x18\x7e\x7e\xff\xff\x7e\x7e\x18\x3c\x7e\xff\xff\xff\xff\x7e\x3c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 10 FontEntry("FN-ROUND", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x78\x84\xaa\x81\xb9\x9d\x81\x7e\x78\xfc\xd6\xff\xc7\xe3\xff\x7e\x0\x6c\xfe\xfe\x7c\x38\x10\x0\x10\x38\x7c\xfe\x7c\x38\x10\x0\x10\x38\x54\xfe\x54\x10\x38\x0\x10\x38\x7c\xfe\xd6\x10\x7c\x0\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xe0\xc0\xae\x19\x11\x13\xe\x0\x38\x4c\x46\x46\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x30\x38\x38\x18\x18\x0\xc\x0\x6c\x36\x36\x0\x0\x0\x0\x0\x0\x6c\x6c\xff\x66\xff\x36\x36\x0\x10\x78\x16\x3c\x48\x3e\x8\x0\x6e\x35\x1a\x2c\x56\x3b\x0\x30\x0\x70\xc\x6\x3c\x0\x18\xc\xc\x6\x0\x0\x0\x0\x0" "\x70\x1c\x6\x6\x6\xc\x18\x0\x18\x30\x60\x60\x60\x38\xe\x0\x0\x10\x92\x7c\x38\x6c\x82\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x20\x20\x30\x18\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x30\x38\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x30\x6c\x66\x63\x63\x63\x3e\x0\x30\x38\x30\x30\x18\x18\x3c\x0\x30\x6c\x66\x30\x18\x4c\x3e\x0\x30\x6c\x66\x30\x60\x66\x3c\x0\x60\x68\x6c\x66\x3e\x30\x30\x0\x70\xc\x6\x3e\x40\x62\x3c\x0\x70\x18\xc\x36\x4e\x46\x3c\x0\x70\x6e\x60\x30\x18\x18\xc\x0" "\x70\x58\x4c\x38\x44\x66\x3c\x0\x30\x4c\x66\x3c\x30\x18\xc\x0\x0\x0\x30\x30\x0\x18\x18\x0\x0\x0\x30\x30\x0\x18\x18\xc\x70\x1c\x6\x3\x6\xc\x18\x0\x0\x0\x0\xfc\x0\x7e\x0\x0\x18\x30\x60\xc0\x60\x38\xe\x0\x38\x4c\x66\x30\x30\x0\x18\x0" "\x78\x84\x9a\xa5\x79\x1\x7e\x0\x60\x78\x64\x66\x7f\x63\x63\x0\x30\x6c\x66\x37\x3b\x63\x3f\x0\x30\x6c\x66\x3\x3\x3\x7e\x0\x30\x6c\xc6\xc3\xc3\x63\x3f\x0\x30\x6c\x6\x3f\x3\x43\x3f\x0\x60\xd8\xc\x3f\x6\x6\x6\x0\x30\x6c\x6\x3\x73\x43\x3e\x0" "\x64\x64\x66\x3f\x33\x33\x33\x0\x1c\x18\x18\x1c\xc\xc\xc\x0\x60\x60\x60\x32\x33\x33\x1f\x0\x4c\x66\x36\x1f\x33\x63\x63\x0\x10\xc\x6\x3\x3\x3\x7f\x0\x44\x6e\x6e\x7a\x6b\x6b\x63\x0\x44\x6e\x6e\x6a\x7b\x73\x63\x0\x30\x6c\x66\x63\x63\x77\x3e\x0" "\x30\x6c\x66\x63\x3f\x3\x3\x0\x30\x6c\x66\x63\x63\x3b\x6e\x0\x30\x6c\x66\x63\x3f\x63\x63\x0\x30\x6c\x6\x7\x7e\x40\x3e\x0\x70\x1e\x18\x18\xc\xc\xe\x0\x68\x6c\x66\x63\x63\x63\x7e\x0\x68\x6c\x66\x63\x63\x36\x1c\x0\x68\x6c\x66\x63\x6b\x6b\x3e\x0" "\x80\xc3\x66\x1c\x38\xe6\xc3\x0\x6c\x66\x63\x33\x1e\xc\xc\x0\x7c\x4e\x63\x38\xc\x46\x3f\x0\x38\xc\xc\x6\x6\x6\x1e\x0\x4\xc\xc\x18\x30\x60\xc0\x0\x1c\x30\x30\x30\x18\x18\x1e\x0\x18\x2c\x6e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x18\xc\xc\x0\x0\x0\x0\x0\x0\x0\x70\x4c\x46\x66\x5c\x0\xc\x6\x36\x4e\x46\x26\x1c\x0\x0\x0\x70\xc\x6\x46\x3c\x0\x60\x60\x78\x64\x46\x46\x3c\x0\x0\x0\x70\x4c\x3e\x6\x3c\x0\x30\x28\xc\x6\x1f\x6\x6\x6\x0\x0\x70\x4c\x66\x7c\x60\x3c" "\x18\xc\x4\x36\x6e\x66\x66\x0\x0\x18\x0\x18\xc\xc\xc\x0\x0\x18\x0\x18\xc\xc\xc\x7\x8\xc\x64\x36\x2e\x66\x66\x0\x18\x18\x18\x18\xc\xc\xc\x0\x0\x0\x1a\x3e\x6b\x6b\x63\x0\x0\x0\x34\x7c\x66\x66\x66\x0\x0\x0\x30\x6c\x66\x66\x3c\x0" "\x0\x0\x34\x4c\x44\x3e\x6\x6\x0\x0\x58\x24\x26\x3e\x60\x60\x0\x0\x66\x1c\xe\x6\x6\x0\x0\x0\x70\xe\x3c\x60\x3e\x0\x30\x30\x18\x78\x1e\x18\xc\xc\x0\x0\x68\x6c\x66\x36\x6c\x0\x0\x0\x68\x6c\x66\x34\x18\x0\x0\x0\x64\x66\x63\x6b\x36\x0" "\x0\xc0\x63\x34\x18\x2c\xc6\x3\x0\x0\x68\x6c\x66\x3e\x30\x1e\x0\x0\x78\x44\x30\xc\x7e\x0\x20\x30\x18\xc\xc\x18\x10\x0\x30\x30\x30\x0\x18\x18\x18\x0\x8\x18\x30\x30\x18\xc\x4\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x7f\x0\x0" "\xff\xf\x3\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\xe0\xc0\xc0\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x3\x3\x7\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\xc0\xf0\xff" "\x7\x0\x0\x0\x0\x0\x0\x0\x80\x80\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x1\x1\x0\x0\x0\x0\x0\x0\x0\xe0\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3f\xf\x7\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xf8\xf0\xe0\xe0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x7\x7\xf\x1f\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xe0\xf0\xfc\xff\xff\x3\x1\x0\x0\x0\x0\x0\x0\xc0\x80\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x1\x3\x0\x0\x0\x0\x0\x0\x80\xc0\x0\x0\x0\xff\xff\x0\x0\x0\x0\x0\x1c\x3f\x7e\x3f\x1c\x0\x0\x0\x18\x7e\xff\x7e\x18\x0\x0\x0\x38\xfc\x7e\xfc\x38\x0\x0\x0\xe0\x78\x3c\x78\xe0\x0\x0\x0\xc0\x70\x38\x70\xc0\x0" "\x0\x0\x0\xc0\x70\xc0\x0\x0\x0\x0\x0\x80\x40\x80\x0\x0\x0\x0\x80\x0\x0\x0\x80\x0\x0\x0\x1\x0\x0\x0\x1\x0\x0\x0\x0\x1\x2\x1\x0\x0\x0\x0\x0\x3\xe\x3\x0\x0\x0\x0\x3\x6\x1c\x6\x3\x0\x0\x0\x7\x1e\x3c\x1e\x7\x0" "\x18\x18\x18\x18\x18\x18\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x1\x0\x3\x3\x0\x1\x0\x0\xd\x0\x1f\x1f\x0\xd\x0" "\x0\x6d\x0\xff\xff\x0\x6d\x0\x0\x3\x0\x7\x7\x0\x3\x0\x0\x1b\x0\x3f\x3f\x0\x1b\x0\x0\xdb\x0\xff\xff\x0\xdb\x0\x0\x0\x0\x1\x1\x0\x0\x0\x0\x6\x0\xf\xf\x0\x6\x0\x0\xb6\x0\xff\xff\x0\xb6\x0\x0\x0\x0\x0\x7f\x6c\x6c\x6c" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 11 FontEntry("GRAFPAPR", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x0\x1c\x22\x22\x22\x22\x1c\x0\x18\x1c\x1e\x18\x18\x18\x3e\x0\x3e\x63\x60\x30\xc\x6\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x66\x7f\x60\x60\x0\x7f\x3\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x0\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x0\x1c\x26\x43\x7f\x43\x43\x0\x0\x3f\x63\x3f\x63\x63\x3f\x0\x0\x3e\x63\x3\x3\x63\x3e\x0\x0\x3f\x63\x63\x63\x63\x3f\x0\x0\x7f\x3\x1f\x3\x3\x7f\x0\x0\x7f\x43\x1f\x13\x3\x3\x0\x0\x3e\x63\x3\x7b\x63\x5e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x30\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x7b\x73\x3e\x60\x3f\x66\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\x8\x8\x1c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x6\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\xaa\xd5\xaa\xd5\xaa\xd5\xaa\xff\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 12 FontEntry("GTHS-BUG", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x3e\x1c\x3e\x8\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x0\x0\x0\x3c\x0\x3c\x0\x0" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\x0\x7c\x56\x56\x7c\x50\x50\x0\x3c\x66\x1c\x36\x36\x1c\x33\x1e\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x66\xdb\xbd\x0\x0\x0\xbd\xdb\x66\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x1c\x1c\x1c\x0\x1c\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\xc\x3e\x3\x1e\x30\x1f\xc\x0\x0\x63\x33\x18\xc\x66\x63\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\x6\x6\x3\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\xc\xc\x3f\xc\xc\x0\x0\x0\x0\x0\x0\x0\x1c\x18\xc\x0\x0\x0\x3f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x3e\x63\x63\x6b\x63\x63\x3e\x0\x18\x1e\x18\x18\x18\x18\x7e\x0\x3e\x60\x60\x3e\x3\x3\x7f\x0\x3e\x60\x60\x3c\x60\x60\x3f\x0\x68\x6c\x66\x63\x7f\x60\x60\x0\x7f\x3\x1f\x30\x60\x60\x3f\x0\x3c\x6\x3\x3b\x63\x63\x3e\x0\x7f\x60\x30\x30\x18\x18\xc\x0" "\x7e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x6e\x60\x30\x1e\x0\x0\x1c\x1c\x0\x0\x1c\x1c\x0\x0\x1c\x1c\x0\x0\x1c\x18\xc\x18\xc\x6\x3\x6\xc\x18\x0\x0\x0\x3f\x0\x0\x3f\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3f\x60\x30\x18\x18\x0\x18\x0" "\x3e\x63\x7b\x7b\x7b\x3\x1e\x0\x1e\x30\x63\x63\x7f\x63\x63\x40\x3f\x63\x63\x3b\x63\x33\x1f\x0\x7e\x3\x3\x3\x3\x6\x7c\x0\x3f\x63\x63\x63\x63\x33\x1f\x0\x3e\x63\x3\x3b\x3\x3\x7e\x0\x7c\x6\x6\x3f\x6\x6\x6\x0\x7e\x3\x3\x73\x63\x66\x7c\x40" "\x63\x63\x3\x7f\x63\x63\x63\x40\x3c\x0\x18\x18\x18\x18\x3c\x0\x78\x0\x60\x60\x60\x30\x1f\x0\x63\x33\x1b\xf\x33\x63\x63\x40\x3\x3\x3\x3\x3\x3\x7f\x0\x3f\x63\x6b\x6b\x6b\x6b\x63\x40\x1f\x30\x63\x63\x63\x63\x63\x40\x3e\x63\x63\x63\x63\x66\x3c\x0" "\x3f\x63\x63\x33\x1f\x3\x3\x0\x3e\x63\x63\x63\x6b\x2e\x18\x70\x3f\x63\x63\x33\x1f\x33\x63\x40\x7e\x3\x6\x3c\x60\x60\x3f\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x6\x7c\x0\x63\x63\x63\x63\x36\x1c\x8\x0\x6b\x6b\x6b\x6b\x6b\x63\x3f\x0" "\x43\x63\x36\x1c\x36\x63\x63\x40\x63\x63\x63\x66\x7c\x63\x3e\x0\x7f\x60\x30\x18\xc\x6\x7f\x0\x1e\x6\x6\x6\x6\x6\x1e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x7e\x63\x63\x63\x6e\x0\x3\x3\x1f\x33\x63\x63\x3b\x0\x0\x0\x7e\x63\x3\x6\x7c\x0\x60\x60\x7c\x66\x63\x63\x6e\x0\x0\x0\x7e\x63\x7f\x3\x7e\x0\x7c\x6\x6\x1f\x6\x6\x6\x0\x0\x0\x7e\x63\x63\x6e\x60\x3f" "\x3\x3\x1f\x33\x63\x63\x63\x0\x18\x0\x18\x18\x18\x18\x18\x0\x30\x0\x30\x30\x30\x30\x30\x1f\x3\x3\x7f\xf\x1b\x33\x63\x0\x10\x18\x18\x18\x18\x18\x18\x0\x0\x0\x3f\x6b\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x66\x3c\x0" "\x0\x0\x3b\x63\x63\x3f\x3\x3\x0\x0\x6e\x63\x63\x7e\x60\x60\x0\x0\x7b\xf\x7\x3\x3\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x8\xc\x3f\xc\xc\xc\x38\x0\x0\x0\x63\x63\x63\x63\x6e\x0\x0\x0\x63\x63\x36\x1c\x8\x0\x0\x0\x63\x6b\x7f\x3e\x14\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x1c\x6\x7f\x0\x38\xc\xc\x7\xc\xc\x38\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xfe\x3\xf9\x5\x5\x5\x5\x5\xff\x0\xff\x0\x0\x0\x0\x0\x7f\xc0\x9f\xa0\xa0\xa0\xa0\xa0\x5\x5\x5\x5\x5\x5\x5\x5\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\x5\x5\x5\x5\x5\xf9\x3\xfe\x0\x0\x0\x0\x0\xff\x0\xff\xa0\xa0\xa0\xa0\xa0\x9f\xc0\x7f" "\x4\x6\x3\x0\x0\x0\x0\x0\x20\x60\xc0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x3\x6\x4\x0\x0\x0\x0\x0\xc0\x60\x20\x9\x12\x25\x4b\x97\x2f\x5e\xbc\x3d\x7a\xf4\xe9\xd2\xa4\x48\x90\xfc\xfe\x7\xf3\xb\xb\xb\xb\xff\xff\x0\xff\x0\x0\x0\x0" "\x3f\x7f\xe0\xcf\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xb\xb\xb\xb\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xf3\x7\xfe\xfc\x0\x0\x0\x0\xff\x0\xff\xff\xd0\xd0\xd0\xd0\xcf\xe0\x7f\x3f\xb\x9\xc\x7\x0\x0\x0\x0\xd0\x90\x30\xe0\x0\x0\x0\x0" "\x0\x0\x0\x0\x7\xc\x9\xb\x0\x0\x0\x0\xe0\x30\x90\xd0\x0\x0\x33\x66\x33\x0\x0\x0\x0\x0\xc\x16\x3e\x3f\x33\x0\x42\x18\xaa\x38\x3c\x7e\x32\x0\x0\x0\x30\x58\x7c\xfc\x30\x0\x0\x0\x0\x60\xb8\xf8\x30\x0\x0\x0\x0\xc0\x60\xf0\x30\x0" "\x0\x0\x0\x80\xc0\xe0\x20\x0\x0\x0\x0\x0\x80\xc0\x20\x0\x0\x0\x0\x0\x0\x80\x20\x0\x0\x0\x0\x0\x0\x1\x1\x0\x0\x0\x0\x0\x1\x3\x3\x0\x0\x0\x0\x1\x2\x7\x3\x0\x0\x0\x0\x3\x5\xf\x3\x0\x0\x0\x0\x6\x1b\x1f\x13\x0" "\x5a\x4a\x42\x52\x5a\x4a\x42\x52\xff\xff\x0\x18\x3c\x66\xc3\x81\xff\xff\x0\x0\x0\x0\x18\x3c\xff\xff\x0\x18\x3c\x66\xdb\xbd\xff\xff\x0\x22\x77\x7f\x6b\x22\x0\x0\x0\x18\x0\x0\x0\x0\x0\x7\x0\x4\x6\x0\x7\x0\x0\x1f\x0\xc\x6\x0\x1f\x0" "\x0\xff\x0\xcc\x66\x0\xff\x0\x0\x7\x0\x4\x6\x0\x7\x0\x0\x3f\x0\xc\x26\x0\x3f\x0\x0\xff\x0\xcc\x66\x0\xff\x0\x0\x1\x0\x0\x0\x0\x1\x0\x0\x1f\x0\xc\x6\x0\x1f\x0\x0\xff\x0\xcc\x66\x0\xff\x0\x0\x18\x3c\x66\x3c\x18\x0\x0" "\x0\x24\x7e\x3c\x7e\x24\x0\x0\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x7f\x36\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 13 FontEntry("IDC-Harmonica", 12, 12, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x0\xdc\xc1\x1d\xdc\xc1\xc\x44\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x39\x9c\xe3\x7f\xfe\xc7\x39\x9c" "\xe3\x7f\xfe\xc7\x39\x9c\x3\x0\x70\x0\x7\xfe\x77\x7\x77\xe0\x3f\x70\x7\x77\xff\x3\x7\x70\x0\x0\x0\xe0\xe0\x1b\xb7\x39\xce\x1\xe\x70\x80\x73\x9c\xed\xd8\x7\x7\x0\xfc\xe0\x1c\xce\xe1\xe\x7c\xe0\x73\xf7\x73\x1e\xe7\x71\x3f\x3e\x7\x0\xe0\x0" "\xe\xe0\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x0\x7\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x0\x7\xe0\x0\x0\x38\x0\x7\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\x7\x38\x0\x0\x8c\xe1\x3d\xff\xf7\x7f\xff\xf7\x7f\xfe\xc3\x1f" "\xf8\x0\x7\x20\x0\x0\x0\x0\x0\x70\x0\x7\x70\xe0\x3f\xfe\x3\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x80\x3\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\xfe\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\xc\xe0\x0\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\x7\x0\x0\x0\x0\x0\xfe\x71\x3c\xe7\x77\x77\x3f\xf7\x71\xf\x77\x70\xfe\x3\x0\x70\x0\x7\x78\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\xfe\x3\x0\xfc\x3\x70\x0\xc7\x3f\x6\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xfe\x7\x70\x0\x7\x3f\x0\x7\x70\x0\x7\x70\x7\x77\x70\xfe\x3\x0\x38\x86\x73\x1c\xe7\x70\x7\x77\x70\x7\xf7\x7f\x0\x7\x70\x0\x7\x0\xff\x77\x0\x7\x70\x3f" "\xf\x7\x70\x0\x7\x70\x7\x77\x70\xfe\x3\x0\xfe\x73\x0\x7\x70\x3f\xf\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\xff\x7\x70\x0\x7\x38\xc0\x1\xe\x70\x0\x7\x70\x0\x7\x70\x0\x0\xfe\x73\x70\x7\xe7\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe" "\x3\x0\xfe\x73\x70\x7\x77\x70\x7\x77\x70\x87\xe7\x77\x0\x7\x70\xc0\x3\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x7\x38\x0\x0\x80\x3\x1c\xe0\x0\x7\x38\xc0" "\x1\x38\x0\x7\xe0\x0\x1c\x80\x3\x0\x0\x0\x0\x0\xc0\x3f\xfc\x3\x0\x0\xc0\x3f\xfc\x3\x0\x0\x0\x0\x1c\x80\x3\x70\x0\xe\xc0\x1\x38\xc0\x1\xe\x70\x80\x3\x1c\x0\x0\xfe\x73\x70\x0\x7\x70\xe0\x3\x7\x70\x0\x7\x0\x0\x7\x70\x0\x0" "\xfc\xe3\x70\x7\x77\x70\xe7\x77\x73\x37\x77\x73\xe7\x73\x0\xfe\x3\x0\xfc\xe3\x70\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x71\x38\x87\xf3\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\xfc\xe3\x70\x7\x70\x0\x7\x70\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\xff\x77\x0\x7\xf0\xf\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xff\x77\x0\x7\xf0\xf\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\xfc\xe3" "\x70\x7\x70\x0\xc7\x77\x70\x7\x77\x70\x7\x77\x78\x7e\x7\x70\x7\x77\x70\x7\xf7\x7f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xff\x7\x0\xe0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x77\x70" "\x7\x77\x70\xfe\x3\x0\x7\x77\x38\xc7\x71\xe\x77\xf0\x3\x77\x70\xe\xc7\x71\x38\x7\x7\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\x7\xf7\x78\xdf\xf7\x7f\x77\x77\x72\x7\x77\x70\x7\x77\x70\x7\x7\x0\x7\xf7\x70\x1f" "\xf7\x73\x77\x77\x7e\xc7\x77\x78\x7\x77\x70\x7\x7\x0\xfc\xe3\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x38\xfe\x1\x0\xff\x73\x70\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x7\x0\x0\xfc\xe3\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xe7\x77" "\x3c\xbe\x3\x70\xff\x73\x70\x7\x77\x70\xff\x73\x7\xe7\x70\x1c\x87\x73\x70\x7\x7\x0\xfe\x73\x70\x7\xe0\x3\xfc\x1\x3e\x0\x67\x70\x7\x77\x70\xfe\x3\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x7\x77\x70\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x38\xc7\x71\xe\x7e\x0\x0\x7\x77\x70\x7\x77\x70\x7\x77\x72\x77\xf7\x7f\xdf\xf7\x78\x7\x7\x0\x7\xe7\x38\xdc\x81\xf\xf8\x80\xf\xdc\xe1\x38\x7\x77\x70\x7" "\x7\x0\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\xe0\x0\xe\xe0\x0\xe\xe0\x0\x0\xff\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\x7\x70\x0\xff\x7\x0\xf8\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf8\x0\x0\x7\xe0\x0\x1c\x80\x3\x70\x0" "\xe\xc0\x1\x38\x0\x7\x60\x0\x4\x0\xf8\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xf8\x0\x0\x20\x0\x7\xf8\xc0\x1d\x8e\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f" "\x70\x0\x7\x70\x0\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\x0\x7\x70\xfe\x77\x70\x7\x77\x70\xfe\x7\x0\x7\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\x0\x7\x70\x0\xe7\x7f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x70\xff\x77\x0\x7\x70\x0\xfe\x7\x0\xf8\xc3\x1\x1c\xc0\x1\xfc\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x0\x0" "\x0\x0\xe0\x7f\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\xf7\x3f\x7\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x70\x0\x7\x0\xc0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xfe\x3\x0\x0\x7\x70\x0\x0\x7c\x0\x7\x70\x0\x7\x70" "\xe\xe7\x70\xfc\x3\x0\x7\x70\x0\x7\x77\x38\xc7\x71\xe\x7f\x70\xe\xc7\x71\x38\x7\x7\x0\x0\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\xf8\x7\x0\x0\x0\x0\x0\xf0\x38\xdf\xf7\x7f\x77\x77\x72\x7\x77\x70\x7\x7\x0\x0\x0\x0\x0" "\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x0\x0\x0\x0\xe0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x0\x0\x0\x0\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x0\x0\x0\x0\xe0\x7f\x7\x77\x70\x7\x77\x70\x7\xe7" "\x7f\x0\x7\x70\x0\x0\x0\x0\x70\x3f\xf\x77\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\xe0\x7f\x7\x70\x0\xfe\x3\x70\x6\x77\x70\xfe\x3\x0\x1c\xc0\x1\x1c\xe0\xf\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\xf8\x7\x0\x0\x0\x0\x0\x70\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x8e\xe3\x38\x8e\xc3\x1d\xf8\x0\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x27\x77\x77\xff\xf7\x7d\x8e\x3\x0\x0\x0\x0\x0\x70\x70\x8e\xc3\x1d\xf8\x80\xf\xdc\xe1\x38\x7" "\x7\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x87\xe7\x77\x0\x7\x70\xff\x3\x0\x0\x0\x0\x0\xf0\x3f\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\xff\x7\x0\xe0\x3\x7\x70\x0\x7\x70\x80\x3\x70\x0\x7\x70\x0\x7\xe0\x3\x0\xff\xf\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7c\x0\xe\xe0\x0\xe\xe0\x0\x1c\xe0\x0\xe\xe0\x0\xe\x7c\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x7\x70\x0\x7\x70\x0\xff\xf" "\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\x0\x0\x0\x0\x0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\xe\xe0\x0\xe\xe0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\xfe\xc3\x1f\xf8\x0\x7\x20\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x2\x70\x80\xf\xfc\xe1\x3f\xff\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" ), // Font no. 14 FontEntry("IDC-Harmonica", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x36\x36\x12\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x8\x7e\xb\x3e\x68\x3f\x8\x0\x6\x69\x36\x18\xc\x36\x4b\x30\x1e\x33\x16\x6e\x3b\x33\x6e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\xc\x18\x30\x30\x30\x18\xc\x0\x0\x36\x7f\x7f\x3e\x1c\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\xc0\x60\x30\x18\xc\x6\x3\x0" "\x0\x1e\x33\x7b\x6f\x67\x3e\x0\x18\x18\x1c\x18\x18\x18\x7e\x0\x3e\x60\x3e\x3\x3\x3\x7f\x0\x7e\x60\x38\x60\x60\x63\x3e\x0\xc\x4c\x66\x63\x7f\x60\x60\x0\x7f\x3\x3f\x60\x60\x63\x3e\x0\x3e\x3\x3f\x63\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3e\x63\x3e\x63\x63\x63\x3e\x0\x3e\x63\x63\x63\x7e\x60\x30\x0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x18\x10\x0\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\xc\x18\x30\x60\x30\x18\xc\x0\x3e\x63\x60\x3c\xc\x0\xc\x0" "\x3c\x66\x63\x7b\x3b\x3\x7e\x0\x3c\x66\x63\x7f\x63\x63\x63\x0\x1f\x33\x3f\x63\x63\x63\x3f\x0\x3c\x66\x3\x3\x3\x63\x3e\x0\x1f\x33\x63\x63\x63\x63\x3f\x0\x7f\x3\x1f\x3\x3\x3\x7f\x0\x7f\x3\x1f\x3\x3\x3\x3\x0\x3c\x66\x3\x73\x63\x73\x6e\x60" "\x63\x63\x7f\x63\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x60\x60\x60\x63\x63\x3e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3c\x66\x63\x63\x63\x33\x1e\x0" "\x3f\x63\x63\x63\x3f\x3\x3\x0\x3c\x66\x63\x63\x63\x3b\x36\x60\x3f\x63\x63\x3f\x1b\x33\x63\x0\x3e\x63\xe\x38\x62\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x33\x1b\xe\x0\x63\x63\x63\x6b\x7f\x77\x63\x0" "\x63\x36\x1c\x1c\x36\x63\x63\x0\x63\x63\x63\x3e\x18\x18\x18\x0\x7f\x30\x18\xc\x6\x3\x7f\x0\x3c\xc\xc\xc\xc\xc\x3c\x0\x3\x6\xc\x18\x30\x60\x40\x0\x3c\x30\x30\x30\x30\x30\x3c\x0\x8\x1c\x36\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7f" "\x18\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3c\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x7e\x0\x7c\x6\x6\x3e\x6\x6\x6\x6\x0\x0\x7e\x63\x63\x7e\x60\x3f" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x7e\x0\x60\x0\x70\x60\x60\x60\x66\x3c\x3\x3\x63\x33\x1f\x33\x63\x0\x6\x6\x6\x6\x6\x6\x7c\x0\x0\x0\x37\x7f\x6b\x63\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x63\x3f\x3\x0\x0\x7e\x63\x63\x63\x7e\x60\x0\x0\x3b\x67\x3\x3\x3\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\xc\xc\x3e\xc\xc\xc\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x36\x36\x1c\x0\x0\x0\x63\x63\x6b\x7f\x36\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x3f\x18\xc\x6\x7f\x0\x70\x18\x18\xc\x18\x18\x70\x0\xff\x0\x0\x0\x0\x0\x0\x0\xe\x18\x18\x30\x18\x18\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 15 FontEntry("IDC-Hoodlum", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x6c\x6c\x6c\x0\x0\x0\x0\x0\x0\x6c\xfe\x6c\xfe\x6c\x0\x0\x10\xfe\x16\xfe\xd0\xfe\x10\x0\x0\x66\x36\x18\x6c\x66\x0\x0\x38\x6c\x38\xfc\x66\xde\x0\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x0\x30\x18\x18\x18\x30\x0\x0\x0\x18\x30\x30\x30\x18\x0\x0\x18\x42\x18\x3c\x18\x42\x18\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x0\xfe\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x0\xc0\x60\x30\x18\xc\x6\x0" "\x0\xfe\xc6\xc6\xc6\xfe\x0\x0\x0\x3c\x30\x30\x30\x30\x78\x0\x0\xfe\xc0\xfe\xe\xfe\x0\x0\x0\xfe\xc0\xf8\xc0\xfe\x0\x0\xe\xe\x6e\x6e\xfe\x60\x60\x0\x0\xfe\xe\x7e\xc0\x7e\x0\x0\xe\xe\xe\xe\xfe\xce\xfe\x0\x0\xfe\xc0\xc0\xc0\xc0\xc0\x0" "\x0\xfe\xce\xfe\xce\xfe\x0\x0\x0\xfe\xc6\xfe\xc0\xc0\xc0\xc0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x18\xc\x0\x60\x30\x18\xc\x18\x30\x60\x0\x0\x0\xfe\x0\xfe\x0\x0\x0\xc\x18\x30\x60\x30\x18\xc\x0\x0\xfe\xc6\xf0\x30\x0\x30\x0" "\x7c\xc6\xf6\xd6\x76\x6\x7c\x0\x0\xff\xc0\xfe\xce\xce\x0\x0\x0\x7f\xc0\x7e\xce\x7e\x0\x0\x0\xfc\xe\xe\xe\xfc\x0\x0\x0\x7f\xc0\xce\xce\x7e\x0\x0\x0\xff\x0\xfe\xe\xfe\x0\x0\x0\xff\x0\xfe\xe\xe\x0\x0\x0\xfc\xe\xce\xce\xfc\x0\x0" "\x0\xce\xce\xfe\xce\xce\xe\x0\x0\x38\x38\x38\x38\x38\x0\x0\x0\xff\x30\x30\x30\x30\x3e\x0\x0\xce\x6e\x3e\x6e\xce\x0\x0\xe\xe\xe\xe\xe\xfe\x0\x0\x0\xc6\xee\xfe\xd6\xc6\x6\x2\x6\xce\xde\xfe\xee\xce\x80\x0\x0\x7f\xc0\xc6\xc6\x7c\x0\x0" "\x0\x7f\xc0\x7e\xe\xe\x0\x0\x0\x7f\xc0\xc6\xf6\x7c\xc0\x0\x0\x7f\xc0\x7e\x6e\xce\x0\x0\x0\xf0\x38\x38\x38\x1f\x0\x0\x0\xff\x38\x38\x38\x38\x0\x0\x0\xce\xce\xce\xce\x7c\x0\x0\x0\xce\xce\xce\x7c\x38\x0\x0\xc0\xc6\xd6\xfe\xee\xc6\x0\x0" "\x0\xce\xce\x7c\xce\xce\x0\x0\x0\xce\xce\xfe\x38\x38\x38\x0\x0\xff\x70\x38\x1c\xfe\x0\x0\x0\x18\x8\x8\x8\x18\x0\x0\x0\x6\xc\x18\x30\x60\xc0\x0\x0\x18\x10\x10\x10\x18\x0\x0\x10\x38\x6c\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x18\x18\xc\x0\x0\x0\x0\x0\x0\xff\xc0\xfe\xce\xce\x0\x0\x0\x7f\xc0\x7e\xce\x7e\x0\x0\x0\xfc\xe\xe\xe\xfc\x0\x0\x0\x7f\xc0\xce\xce\x7e\x0\x0\x0\xff\x0\xfe\xe\xfe\x0\x0\x0\xff\x0\xfe\xe\xe\x0\x0\x0\xfc\xe\xce\xce\xfc\x0\x0" "\x0\xce\xce\xfe\xce\xce\xe\x0\x0\x38\x38\x38\x38\x38\x0\x0\x0\xff\x30\x30\x30\x30\x3e\x0\x0\xce\x6e\x3e\x6e\xce\x0\x0\xe\xe\xe\xe\xe\xfe\x0\x0\x0\xc6\xee\xfe\xd6\xc6\x6\x2\x6\xce\xde\xfe\xee\xce\x80\x0\x0\x7f\xc0\xc6\xc6\x7c\x0\x0" "\x0\x7f\xc0\x7e\xe\xe\x0\x0\x0\x7f\xc0\xc6\xf6\x7c\xc0\x0\x0\x7f\xc0\x7e\x6e\xce\x0\x0\x0\xf0\x38\x38\x38\x1f\x0\x0\x0\xff\x38\x38\x38\x38\x0\x0\x0\xce\xce\xce\xce\x7c\x0\x0\x0\xce\xce\xce\x7c\x38\x0\x0\xc0\xc6\xd6\xfe\xee\xc6\x0\x0" "\x0\xce\xce\x7c\xce\xce\x0\x0\x0\xce\xce\xfe\x38\x38\x38\x0\x0\xff\x30\x18\xc\xfe\x0\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x0\xc\x18\x18\x30\x18\x18\xc\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 16 FontEntry("IDC-MicroKnight", 12, 12, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x0\xdc\xc1\x1d\xdc\x81\x19\x10\x1\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x39\x9c\xe3\x7f\xfe\xc7\x39\x9c" "\xe3\x7f\xfe\xc7\x39\x9c\x3\x0\x70\x0\x7\xfe\x73\x7\x77\xe0\x3f\x70\x7\x77\x70\xf7\x3f\x70\x0\x7\x0\xe0\xe0\x1b\xb7\x39\xce\x1\xe\x70\x80\x73\x9c\xed\xd8\x7\x7\x0\x7c\xe0\xe\xee\xe0\x6\x7c\xe7\x3b\xf7\x71\xe\xe7\x70\x1f\xbc\x3\x70\xe0\x0" "\xe\xe0\x0\x8\x60\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe0\x0\x7\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x0\x7\xe0\x0\x0\x38\x0\x7\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\x7\x38\x0\x0\x0\x0\x0\x8e\xc3\x1d\xf8\xf0\x7f\xff\x87\xf" "\xdc\xe1\x38\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\xe0\x3f\xfe\x3\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7\x70\x0\x7\x40\x0\x3\x0\x0\x0\x0\x0\x0\x0\xe0\x3f\xfe\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\xe0\x0\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\x7\x0\x0\x0\x0\x0\xfe\x71\x3c\xe7\x77\x77\x3f\xf7\x71\xf\x77\x70\xfe\x3\x0\x70\x0\x7\x78\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\xfe\x3\x0\xfc\x3\x70\x0\xc7\x3f\x6\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xfc\x3\x70\x0\x7\x3f\x0\x7\x70\x0\x67\x70\x7\x77\x70\xfe\x3\x0\xc0\x1\x1c\xe0\x0\x7\xb8\xc3\x39\x8e\x73\x38\xff\x7\x38\x80\x3\x0\xff\x70\x0\x7\xf0\x3f" "\x0\x7\x70\x0\x7\x70\x7\x77\x38\xfe\x1\x0\x7e\x70\x0\x7\xf0\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x38\xfe\x1\x0\xff\x7\x38\xc0\x1\xe\xe0\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\xfe\x71\x38\x87\xe3\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x38\xfe" "\x1\x0\xfe\x71\x38\x7\x77\x70\x7\x77\x70\x7\xe7\x7f\x0\x7\x70\xf0\x3\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x0\x70\x0\x7\x70\x0\x0\x0\x0\x7\x70\x0\x7\x40\x0\x3\x0\x0\x1c\xe0\x0\x7\x38\xc0" "\x1\x38\x0\x7\xe0\x0\x1c\x0\x0\x0\x0\x0\x0\x0\xc0\x1f\xfc\x1\x0\x0\xc0\x1f\xfc\x1\x0\x0\x0\x0\x0\x80\x3\x70\x0\xe\xc0\x1\x38\xc0\x1\xe\x70\x80\x3\x0\x0\x0\xfe\x73\x70\x0\x7\x70\xe0\x3\x7\x70\x0\x7\x0\x0\x7\x70\x0\x0" "\xfc\xe1\x38\xe7\x77\x77\x77\x77\x77\xe7\x73\x0\x7\xe0\x70\xfc\x3\x0\xfe\x71\x38\x7\x77\x70\xff\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x71\x38\x87\xf3\x3f\x7\x77\x70\x7\x77\x70\x7\x77\x38\xff\x1\x0\xfe\x71\x38\x7\x70\x0\x7\x70\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\xff\x77\x0\x7\xf0\x1f\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\xff\x77\x0\x7\xf0\x1f\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x7c\xe0" "\x0\x7\x70\x0\xc7\x77\x70\x7\x77\x70\x7\x77\x78\x7e\x7\x70\x7\x77\x70\x7\xf7\x7f\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xff\x7\x0\xc0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x77\x70" "\x7\x77\x70\xfe\x3\x0\x7\x77\x38\xc7\x71\xe\x77\xf0\x3\x77\x70\xe\xc7\x71\x38\x7\x7\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\xff\x7\x0\x7\xf7\x78\xdf\xf7\x7f\x77\x77\x72\x7\x77\x70\x7\x77\x70\x7\x7\x0\x7\xf7\x70\x1f" "\xf7\x73\x77\x77\x7e\xc7\x77\x78\x7\x77\x70\x7\x7\x0\xfe\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x7\x0\x0\xfe\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x77\x77" "\x3e\xfe\x3\x38\xff\x71\x38\x7\x77\x70\x7\xf7\x3f\x77\x70\xe\xc7\x71\x38\x7\x7\x70\x7e\x70\x0\x7\xe0\x3f\x0\x7\x70\x0\x67\x70\x7\x77\x70\xfe\x3\x0\xff\x7\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x0\x7\x77\x70\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x7\x77\x70\x7\x77\x70\x7\xe7\x38\x8e\xc3\x1d\xdc\x81\xf\xf8\x0\x0\x7\x77\x70\x7\x77\x70\x7\x77\x72\x77\xf7\x7f\xdf\xf7\x78\x7\x7\x0\x7\xe7\x38\xdc\x81\xf\xf8\x80\xf\xdc\xe1\x38\x7\x77\x70\x7" "\x7\x0\x7\x77\x70\x7\x77\x70\x7\xe7\x3f\x80\x3\x38\x80\x3\x38\x80\x3\x0\xff\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\x7\x70\x0\xff\x7\x0\xf8\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\x38\x80\x3\xf8\x0\x0\x0\x70\x0\xe\xc0\x1\x38\x0" "\x7\xe0\x0\x1c\x80\x3\x70\x0\xe\x0\xf8\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xe0\x0\xe\xf8\x0\x0\x20\x0\x7\xf8\xc0\x1d\x8e\x3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f" "\x70\x0\x7\x70\x0\x4\x30\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf8\x3\x70\x0\xe7\x7f\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x7\x70\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\xff\x3\x0\x0\x0\x0\xfe\x70\x38\x7\x70\x0\x7" "\x70\x0\x7\x70\x70\xfe\x3\x0\x0\x7\x70\xfc\xe7\x70\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\xfe\x70\x1c\x87\xf3\x3f\x7\x70\x0\x7\x70\x70\xfe\x3\x0\xf8\xc0\x1d\x1c\xc0\x1\x7c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x0\x0" "\x0\xfe\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x70\x0\xe7\x3f\x7\x70\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x70\x0\x7\x0\xc0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xfe\x3\x0\x0\x7\x70\x0\x0\x7c\x0\x7\x70\x0\x7\x70" "\x6\x67\x70\xfc\x3\x0\x7\x70\x0\x87\x73\x1c\xe7\xf0\x7\x77\x70\xe\xc7\x71\x38\x7\x7\x0\x0\x80\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\xfe\x3\x0\x0\x0\x0\x7\xf3\x78\xdf\xf7\x7f\x77\x77\x72\x7\x77\x70\x7\x7\x0\x0\x0\x0\xff" "\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\x7\x7\x0\x0\x0\x0\xfe\x71\x38\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x3\x0\x0\x0\x0\xff\x71\x38\x7\x77\x70\x7\x77\x70\x7\xf7\x3f\x7\x70\x0\x0\x0\x0\xfc\xe7\x70\x7\x77\x70\x7\x77\x70\x7\xe7" "\x7f\x0\x7\x70\x0\x0\x0\xff\x73\x70\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x0\x0\x0\x0\x0\x7e\x70\x0\x7\xe0\x3f\x0\x7\x70\x6\x77\x70\xfe\x3\x0\x1c\xc0\x1\xfe\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\x1c\xc0\x1\xf8\x7\x0\x0\x0\x0\x7\x77\x70" "\x7\x77\x70\x7\x77\x70\x7\x77\x70\xfe\x7\x0\x0\x0\x0\x7\x77\x70\x7\xe7\x38\x8e\xe3\x38\xdc\xc1\x1f\xf8\x0\x0\x0\x0\x0\x7\x77\x70\x27\x77\x77\xff\xe7\x3f\xde\xe3\x38\x6\x3\x0\x0\x0\x0\x7\xe7\x38\xdc\x81\xf\x70\x80\xf\xdc\xe1\x38\x7" "\x7\x0\x0\x0\x0\x0\x70\x70\x7\x77\x70\x7\xe7\x7f\x0\x7\x70\xfc\x3\x0\x0\x0\x0\xff\x7\x38\xc0\x1\xe\x70\x80\x3\x1c\xe0\x0\xff\x7\x0\xe0\x1\x7\x70\x0\x7\x70\x80\x3\x70\x0\x7\x70\x0\x7\xe0\x1\x0\x70\x0\x7\x70\x0\x7\x70\x0" "\x7\x70\x0\x7\x70\x0\x7\x70\x0\x7\x78\x0\xe\xe0\x0\xe\xe0\x0\x1c\xe0\x0\xe\xe0\x0\xe\x78\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x7\x70\x0\x7\x70\x0\xff\xf" "\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\x0\x0\x0\x0\x0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\xf0\xff\x0\xe\xe0\x0\xe\xe0\xff\xf\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf0\x7f\xfe\xc3\x1f\xf8\x0\x7\x20\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x2\x70\x80\xf\xfc\xe1\x3f\xff\x7\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" ), // Font no. 17 FontEntry("IDC-MicroKnight", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x36\x36\x24\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x8\x3e\xb\x3e\x68\x68\x3e\x8\x6\x69\x3e\x18\xc\x36\x4b\x30\xe\x1b\xe\x6f\x3b\x1b\x3e\x60\x18\x18\x10\x8\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\xc\x18\x30\x30\x30\x18\xc\x0\x0\x36\x1c\x7f\x1c\x36\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\x10\x8\x0\x0\x0\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x60\x30\x18\xc\x6\x3\x0" "\x0\x1e\x33\x7b\x6f\x67\x3e\x0\x18\x18\x1c\x18\x18\x18\x7e\x0\x3e\x60\x3c\x6\x3\x3\x7f\x0\x3c\x60\x38\x60\x62\x63\x3e\x0\x18\x18\xc\x36\x33\x7f\x30\x0\x1f\x3\x3f\x60\x62\x33\x1e\x0\xe\x3\x3f\x63\x63\x33\x1e\x0\x7f\x60\x30\x18\x18\x18\x18\x0" "\x1e\x33\x3e\x63\x63\x33\x1e\x0\x1e\x33\x63\x63\x7e\x60\x38\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x10\x8\x0\x18\xc\x6\xc\x18\x0\x0\x0\x0\x3e\x0\x3e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3e\x63\x60\x3c\xc\x0\xc\x0" "\x1c\x36\x7b\x6f\x7b\x3\x66\x3c\x1e\x33\x63\x7f\x63\x63\x63\x0\x1f\x33\x3f\x63\x63\x33\x1f\x0\x1e\x33\x3\x3\x3\x63\x3e\x0\x1f\x33\x63\x63\x63\x63\x3f\x0\x7f\x3\x3f\x3\x3\x3\x7f\x0\x7f\x3\x3f\x3\x3\x3\x3\x0\x1c\x6\x3\x73\x63\x63\x7e\x60" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x70\x60\x60\x60\x63\x63\x3e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x1e\x33\x63\x63\x63\x63\x3e\x0" "\x1f\x33\x63\x63\x3f\x3\x3\x0\x1e\x33\x63\x63\x63\x6b\x3e\x30\x1f\x33\x63\x63\x3f\x1b\x33\x60\x1e\x3\x3e\x60\x62\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x36\x36\x1c\x1c\x0\x63\x63\x63\x6b\x7f\x77\x63\x0" "\x63\x36\x1c\x1c\x36\x63\x63\x0\x63\x63\x63\x3e\x30\x30\x30\x0\x7f\x30\x18\xc\x6\x3\x7f\x0\x1c\xc\xc\xc\xc\xc\x1c\x0\x0\x3\x6\xc\x18\x30\x60\x0\x1c\x18\x18\x18\x18\x18\x1c\x0\x8\x1c\x36\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7f" "\x18\x18\x10\x8\x0\x0\x0\x0\x0\x3c\x60\x7e\x63\x63\x7e\x0\x3\x1f\x33\x63\x63\x63\x3f\x0\x0\x1e\x33\x3\x3\x63\x3e\x0\x60\x7c\x66\x63\x63\x63\x7e\x0\x0\x1e\x33\x3f\x3\x63\x3e\x0\x1c\x36\x6\x1e\x6\x6\x6\x6\x0\x7e\x63\x63\x63\x7e\x60\x3e" "\x3\x1f\x33\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x7e\x0\x30\x0\x38\x30\x30\x30\x32\x1c\x3\x33\x1b\xf\x1b\x33\x63\x0\x1c\x18\x18\x18\x18\x18\x7e\x0\x0\x23\x77\x7f\x6b\x63\x63\x0\x0\x1f\x33\x63\x63\x63\x63\x0\x0\x1e\x33\x63\x63\x63\x3e\x0" "\x0\x1f\x33\x63\x63\x63\x3f\x3\x0\x7c\x66\x63\x63\x63\x7e\x60\x0\x3f\x63\x3\x3\x3\x3\x0\x0\x1e\x3\x3e\x60\x63\x3e\x0\xc\x3e\xc\xc\xc\x4c\x38\x0\x0\x63\x63\x63\x63\x63\x7e\x0\x0\x63\x63\x36\x36\x1c\x1c\x0\x0\x63\x6b\x7f\x3e\x36\x22\x0" "\x0\x63\x36\x1c\x1c\x36\x63\x0\x0\x63\x63\x63\x63\x7e\x60\x3e\x0\x7f\x30\x18\xc\x6\x7f\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\xc\x18\x18\x30\x18\x18\xc\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 18 FontEntry("IDC-Topaz1.3", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x18\x0\x18\x0\x36\x36\x0\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x18\x7c\x6\x3c\x60\x3e\x18\x0\x0\x63\x33\x18\xc\x66\x63\x0\x1c\x36\x16\x6e\x3b\x33\x6e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x30\x18\xc\xc\xc\x18\x30\x0\xc\x18\x30\x30\x30\x18\xc\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\xc0\x60\x30\x18\xc\x6\x3\x0" "\x3c\x66\x76\x7e\x6e\x66\x3c\x0\x18\x1c\x18\x18\x18\x18\x7e\x0\x3c\x66\x60\x38\xc\x66\x7e\x0\x3c\x66\x60\x38\x60\x66\x3c\x0\x38\x3c\x36\x33\x7f\x30\x78\x0\x7e\x6\x3e\x60\x60\x66\x3c\x0\x38\xc\x6\x3e\x66\x66\x3c\x0\x7e\x66\x60\x30\x18\x18\x18\x0" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x3c\x66\x66\x7c\x60\x30\x1c\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7e\x0\x0\x7e\x0\x0\xc\x18\x30\x60\x30\x18\xc\x0\x3c\x66\x60\x30\x18\x0\x18\x0" "\x3e\x63\x7b\x7b\x7b\x3\x1e\x0\x18\x3c\x3c\x66\x7e\xc3\xc3\x0\x3f\x66\x66\x3e\x66\x66\x3f\x0\x3c\x66\x3\x3\x3\x66\x3c\x0\x1f\x36\x66\x66\x66\x36\x1f\x0\x7f\x66\x6\x1e\x6\x66\x7f\x0\x7f\x66\x6\x1e\x6\x6\xf\x0\x3c\x66\x3\x73\x63\x66\x7c\x0" "\x66\x66\x66\x7e\x66\x66\x66\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x70\x60\x60\x60\x66\x66\x3c\x0\x67\x66\x36\x1e\x36\x66\x67\x0\xf\x6\x6\x6\x46\x66\x7f\x0\x41\x63\x77\x7f\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x1c\x36\x63\x63\x63\x36\x1c\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x1c\x36\x63\x63\x63\x36\x3c\x60\x3f\x66\x66\x3e\x36\x66\xc7\x0\x3c\x66\xe\x1c\x70\x66\x3c\x0\x7e\x5a\x18\x18\x18\x18\x3c\x0\x66\x66\x66\x66\x66\x66\x7c\x0\xc3\xc3\x66\x66\x3c\x3c\x18\x0\x63\x63\x63\x6b\x7f\x77\x63\x0" "\xc3\x66\x3c\x18\x3c\x66\xc3\x0\xc3\xc3\x66\x3c\x18\x18\x3c\x0\x7f\x63\x31\x18\x4c\x66\x7f\x0\x3c\xc\xc\xc\xc\xc\x3c\x0\x3\x6\xc\x18\x30\x60\xc0\x0\x3c\x30\x30\x30\x30\x30\x3c\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7f" "\x18\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3c\x60\x78\x66\xdc\x0\x7\x6\x36\x6e\x66\x66\x3c\x0\x0\x0\x3c\x66\x6\x66\x3c\x0\x70\x60\x6c\x76\x66\x66\xdc\x0\x0\x0\x3c\x66\x7e\x6\x3c\x0\x38\x6c\xc\x1e\xc\xc\x1e\x0\x0\x0\xdc\x66\x66\x3c\x63\x3e" "\x7\x6\x36\x6e\x66\x66\x67\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x60\x0\x60\x60\x60\x60\x66\x3c\x7\x6\x66\x36\x1e\x36\x67\x0\x1c\x18\x18\x18\x18\x18\x3c\x0\x0\x0\x66\xee\xd6\xc6\xc6\x0\x0\x0\x3e\x66\x66\x66\x66\x0\x0\x0\x3c\x66\x66\x66\x3c\x0" "\x0\x0\x3b\x66\x66\x3e\x6\xf\x0\x0\xbc\x66\x66\x7c\x60\xe0\x0\x0\x37\x6e\x66\x6\xf\x0\x0\x0\x7c\x6\x3c\x60\x3e\x0\x10\x18\x7c\x18\x18\x58\x30\x0\x0\x0\x66\x66\x66\x66\xdc\x0\x0\x0\x66\x66\x66\x3c\x18\x0\x0\x0\xc6\xd6\xd6\x6c\x6c\x0" "\x0\x0\xc6\x6c\x38\x6c\xc6\x0\x0\x0\x66\x66\x66\x3c\x18\xe\x0\x0\x7e\x32\x18\x4c\x7e\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x18\x18\x18\x18\x0\xe\x18\x18\x70\x18\x18\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 19 FontEntry("IDC-Topaz2.0", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x18\x7c\x6\x3c\x60\x3e\x18\x0\x0\x66\x35\x1b\x6c\x56\x33\x0\x1c\x36\x16\x6e\x3b\x73\xde\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x30\x18\xc\xc\xc\x18\x30\x0\xc\x18\x30\x30\x30\x18\xc\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\xc0\x60\x30\x18\xc\x6\x3\x0" "\x3c\x66\x76\x7e\x6e\x66\x3c\x0\x18\x1c\x1e\x18\x18\x18\x18\x0\x3c\x66\x60\x30\x18\xc\x7e\x0\x3c\x66\x60\x38\x60\x66\x3c\x0\x38\x3c\x36\x33\x7f\x30\x30\x0\x7e\x6\x3e\x60\x60\x66\x3c\x0\x38\xc\x6\x3e\x66\x66\x3c\x0\x7e\x60\x60\x30\x18\x18\x18\x0" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x3c\x66\x66\x7c\x60\x30\x1c\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\xc\x0\x60\x18\x6\x18\x60\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\x6\x18\x60\x18\x6\x0\x0\x3c\x66\x60\x30\x18\x0\x18\x0" "\x3e\x63\x7b\x6b\x7b\x3\x1e\x0\x3c\x66\x66\x7e\x66\x66\x66\x0\x3e\x66\x66\x3e\x66\x66\x3e\x0\x78\xc\x6\x6\x6\xc\x78\x0\x1e\x36\x66\x66\x66\x36\x1e\x0\x7e\x6\x6\x1e\x6\x6\x7e\x0\x7e\x6\x6\x1e\x6\x6\x6\x0\x3c\x66\x6\x76\x66\x66\x7c\x0" "\x66\x66\x66\x7e\x66\x66\x66\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x60\x60\x60\x60\x60\x66\x3c\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x6\x6\x6\x6\x6\x6\x7e\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3c\x66\x66\x66\x66\x66\x3c\x0" "\x3e\x66\x66\x3e\x6\x6\x6\x0\x1e\x33\x33\x33\x33\x3b\x7e\x0\x3e\x66\x66\x3e\x36\x66\x66\x0\x3c\x66\xe\x3c\x70\x66\x3c\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x66\x66\x66\x66\x66\x66\x3c\x0\x66\x66\x66\x66\x3c\x3c\x18\x0\x63\x63\x63\x6b\x7f\x77\x63\x0" "\xc3\x66\x3c\x18\x3c\x66\xc3\x0\xc3\x66\x3c\x18\x18\x18\x18\x0\x7f\x30\x18\xc\x6\x3\x7f\x0\x3c\xc\xc\xc\xc\xc\x3c\x0\x3\x6\xc\x18\x30\x60\xc0\x0\x3c\x30\x30\x30\x30\x30\x3c\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7f" "\x18\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3c\x60\x7c\x66\x7c\x0\x6\x6\x3e\x66\x66\x66\x3e\x0\x0\x0\x3c\x6\x6\x6\x3c\x0\x60\x60\x7c\x66\x66\x66\x7c\x0\x0\x0\x3c\x66\x7e\x6\x3c\x0\x38\xc\x3e\xc\xc\xc\xc\x0\x0\x0\x7c\x66\x66\x7c\x60\x3c" "\x6\x6\x3e\x66\x66\x66\x66\x0\x18\x0\x18\x18\x18\x18\x30\x0\x30\x0\x30\x30\x30\x30\x30\x1e\x6\x6\x66\x36\x1e\x36\x66\x0\x18\x18\x18\x18\x18\x18\x30\x0\x0\x0\x37\x7f\x6b\x63\x63\x0\x0\x0\x3e\x66\x66\x66\x66\x0\x0\x0\x3c\x66\x66\x66\x3c\x0" "\x0\x0\x3e\x66\x66\x3e\x6\x6\x0\x0\x7c\x66\x66\x7c\x60\x60\x0\x0\x3e\x66\x6\x6\x6\x0\x0\x0\x3c\x6\x3c\x60\x3e\x0\xc\xc\x3e\xc\xc\xc\x38\x0\x0\x0\x66\x66\x66\x66\x7c\x0\x0\x0\x66\x66\x66\x3c\x18\x0\x0\x0\x63\x63\x6b\x7f\x36\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x66\x66\x66\x3c\x18\xc\x0\x0\x7e\x30\x18\xc\x7e\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x18\x18\x18\x18\x0\xe\x18\x18\x70\x18\x18\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 20 FontEntry("INVERSE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\xff\xc3\x99\x99\x99\x99\xc3\xff\xff\xe7\xe3\xe7\xe7\xe7\xc3\xff\xff\xc3\x99\xcf\xe7\xb3\x81\xff\xff\xc3\x9d\xcf\x9f\x99\xc3\xff\xff\xcf\xd7\xdb\x81\xdf\xdf\xff\xff\x81\xf9\xc1\x9f\x9d\xc3\xff\xff\xe3\xf9\xc1\x99\x99\xc3\xff\xff\x81\xbf\xcf\xe7\xe7\xe7\xff" "\xff\xc3\x99\xc3\x99\x99\xc3\xff\xff\xc3\x99\x99\x83\xdf\xe7\xff\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x0\x0\x38\xc\x6\xc\x38\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xe\x18\x30\x18\xe\x0\x0\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\xff\xe7\xdb\xdb\x81\xbd\xbd\xff\xff\xc1\x99\xc1\x99\x99\xc1\xff\xff\x83\x39\xf9\xf9\x39\x83\xff\xff\xc1\x99\x99\x99\x99\xc1\xff\xff\x81\xb9\xe1\xe9\xb9\x81\xff\xff\x81\xb9\xe1\xe9\xf9\xf9\xff\xff\xc3\xb9\xf9\x89\xb9\x83\xff" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x30\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x7b\x73\x3e\x60\x3f\x66\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\x8\x8\x1c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x6\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\xff\x7\x7\x7\x7\x7\xff\xff\xff\x0\x0\x0\x0\x0" "\xff\xff\xff\xe0\xe0\xe0\xe0\xe0\x7\x7\x7\x7\x7\x7\x7\x7\xe0\xe0\xe0\xe0\xe0\xe0\xe0\xe0\x7\x7\x7\x7\x7\xff\xff\xff\x0\x0\x0\x0\x0\xff\xff\xff\xe0\xe0\xe0\xe0\xe0\xff\xff\xff\x7\x3\x1\x0\x0\x0\x0\x0\xe0\xc0\x80\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x1\x3\x7\x0\x0\x0\x0\x0\x80\xc0\xe0\x0\x0\x0\xee\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 21 FontEntry("J-CURSE", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\xc\xc\x0\xc\x0\x6c\x36\x1b\x0\x0\x0\x0\x0\x0\x6c\xfe\x6c\x6c\xfe\x6c\x0\x18\x7e\x3\x3e\x60\x3f\xc\x0\x0\x66\x33\x18\xcc\x66\x0\x0\x1c\x36\x1c\xb6\x63\x73\xde\x0\x60\x30\x18\x0\x0\x0\x0\x0" "\x30\x18\x18\x18\x18\x18\x18\x30\x6\xc\xc\xc\xc\xc\xc\x6\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc\x0\x0\xc0\x60\x30\x18\xc\x6\x0" "\x3c\x66\x66\x6b\x6b\x63\x3e\x0\x30\x38\x30\x18\x18\x18\x18\x0\x3e\x63\x60\x3c\x6\x3\x7f\x0\x3c\x66\x60\x3c\x60\x63\x3e\x0\x66\x66\x66\x63\x7f\x60\x60\x0\x7e\x6\x6\x3e\x60\x60\x3f\x0\x3c\x66\x6\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3c\x66\x66\x3e\x63\x63\x3e\x0\x3c\x66\x66\x7c\x60\x60\x3f\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x6\x0\x0\x18\xc\x6\xc\x18\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3e\x63\x60\x38\xc\x0\xc\x0" "\x7e\xc3\xdb\xdb\x7b\x3\x3e\x0\x7c\x66\x66\x7f\x63\x63\x63\x0\x7c\x66\x66\x7f\x63\x63\x3f\x0\x7c\x66\x6\x3\x3\x63\x3f\x0\x7c\x66\x66\x63\x63\x63\x3f\x0\x7c\x6\x6\x7f\x3\x3\x7f\x0\x7c\x6\x6\x7f\x3\x3\x3\x0\x7c\x66\x6\x73\x63\x63\x3f\x0" "\xc6\xc6\xc6\x7f\x63\x63\x63\x0\x30\x30\x30\x18\x18\x18\x18\x0\x60\x60\x60\x60\x30\x33\x1e\x0\x66\x36\x1e\xf\x1b\x33\x63\x0\x6\x6\x6\x3\x3\x3\x7f\x0\x66\x7e\x7e\x6b\x6b\x63\x63\x0\x66\x6e\x7e\x7b\x73\x63\x63\x0\x3c\x66\x66\x63\x63\x63\x3e\x0" "\x3c\x66\x66\x3f\x3\x3\x3\x0\x3c\x66\x66\x63\x63\x5b\x36\x60\x3e\x66\x66\x3f\x63\x63\x63\x0\x3c\x66\x6\x3c\x60\x63\x3e\x0\xfe\x30\x30\x18\x18\x18\x18\x0\xc6\xc6\xc6\x63\x63\x63\x3e\x0\xc6\xc6\xc6\x63\x63\x36\x1c\x0\xc6\xc6\xc6\x63\x6b\x6b\x3e\x0" "\xc6\x6c\x38\x18\x3c\x66\xc3\x0\x66\x66\x3c\x18\xc\xc\xc\x0\x7f\x60\x30\x1c\x6\x3\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x0\x6\xc\x18\x30\x60\xc0\x0\xe\xc\xc\xc\xc\xc\xc\xe\x18\x3c\x66\xc3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\x18\x30\x0\x0\x0\x0\x0\x0\x0\x7c\xc0\xfe\x63\x7e\x0\x6\x6\x3e\x63\x63\x63\x3f\x0\x0\x0\x3c\x66\x3\x63\x3e\x0\xc0\xc0\xfc\x66\x63\x63\x7e\x0\x0\x0\x3c\x66\x7f\x3\x7e\x0\x38\xc\xc\x3f\x6\x6\x6\x0\x0\x0\x3c\x66\x63\x7e\x60\x3e" "\x6\x6\x3e\x63\x63\x63\x63\x0\x30\x0\x30\x30\x18\x18\x18\x0\x60\x0\x60\x60\x30\x30\x30\x1f\x6\x6\x36\x1b\xf\x1b\x33\x0\x30\x30\x30\x18\x18\x18\x18\x0\x0\x0\x3e\x6b\x6b\x6b\x6b\x0\x0\x0\x3c\x66\x63\x63\x63\x0\x0\x0\x3c\x66\x63\x63\x3e\x0" "\x0\x0\x3c\x66\x63\x3f\x3\x3\x0\x0\x7c\x66\x63\x7e\x60\x60\x0\x0\x3e\x63\x3\x3\x3\x0\x0\x0\x3c\x6\x3c\x60\x3e\x0\x30\x30\x7c\x18\x18\x18\x18\x0\x0\x0\x66\x66\x63\x63\x3e\x0\x0\x0\xc6\xc6\x66\x36\x1c\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\xc6\xc6\x63\x7e\x60\x3f\x0\x0\x7f\x30\x1c\x6\x7f\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\x6\xc\xc\x18\xc\xc\x6\x0\xe\xdb\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 22 FontEntry("J-ELECTR", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x8\x8\x8\x8\x8\x0\x8\x0\x24\x24\x24\x0\x0\x0\x0\x0\x22\x7f\x22\x22\x22\x7f\x22\x0\x14\x7e\x15\x3e\x54\x3f\x14\x0\x0\x44\x22\x10\x8\x44\x22\x0\x1c\x22\x14\x6a\x11\x11\x6e\x0\x10\x10\x10\x0\x0\x0\x0\x0" "\x10\x8\x4\x4\x4\x8\x10\x0\x4\x8\x10\x10\x10\x8\x4\x0\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x8\x8\x3e\x8\x8\x0\x0\x0\x0\x0\x0\x0\x8\x4\x0\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x8\x0\x0\x40\x20\x10\x8\x4\x2\x0" "\x1c\x22\x51\x49\x45\x22\x1c\x0\xe\x8\x8\x8\x8\x28\x3e\x0\x1f\x20\x20\x1e\x1\x1\x3f\x0\x1f\x20\x20\x1c\x20\x20\x1f\x0\x1\x21\x21\x21\x7f\x20\x20\x0\x3f\x1\x1\x1f\x20\x20\x1f\x0\x1\x1\x1\x3f\x41\x41\x3e\x0\x3f\x20\x20\x10\x8\x8\x8\x0" "\x1c\x22\x22\x3e\x41\x41\x3e\x0\x3e\x41\x41\x7e\x40\x40\x40\x0\x0\x0\x8\x0\x0\x8\x0\x0\x0\x0\x8\x0\x0\x8\x4\x0\x20\x10\x8\x4\x8\x10\x20\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x4\x8\x10\x20\x10\x8\x4\x0\x3c\x42\x40\x20\x10\x0\x10\x0" "\x3c\x42\x99\xa5\x59\x2\x7c\x0\x3c\x42\x41\x41\x7f\x41\x41\x0\x3f\x41\x41\x3f\x41\x41\x3f\x0\x7c\x2\x1\x1\x1\x2\x7c\x0\x3f\x41\x41\x41\x41\x41\x3f\x0\x7f\x1\x1\x7f\x1\x1\x7f\x0\x7f\x1\x1\x7f\x1\x1\x1\x0\x7c\x2\x1\x71\x41\x41\x3e\x0" "\x41\x41\x41\x7f\x41\x41\x41\x0\x8\x8\x8\x8\x8\x8\x8\x0\x40\x40\x40\x40\x40\x20\x1e\x0\x21\x11\x9\x7\x9\x11\x21\x0\x1\x1\x1\x1\x1\x1\x7f\x0\x1f\x29\x49\x49\x49\x49\x49\x0\x1f\x21\x41\x41\x41\x41\x41\x0\x3c\x42\x41\x41\x41\x21\x1e\x0" "\x3f\x41\x41\x41\x3f\x1\x1\x0\x3c\x42\x41\x41\x41\x51\x2e\x40\x3f\x41\x41\x21\x1f\x21\x41\x0\x7c\x2\x1\x3e\x40\x40\x3f\x0\x3e\x8\x8\x8\x8\x8\x8\x0\x41\x41\x41\x41\x41\x41\x3e\x0\x41\x41\x41\x41\x41\x22\x1c\x0\x49\x49\x49\x49\x49\x49\x3f\x0" "\x41\x41\x22\x1c\x22\x41\x41\x0\x41\x22\x14\x8\x8\x8\x8\x0\x7f\x40\x30\x8\x6\x1\x7f\x0\xe\x2\x2\x2\x2\x2\xe\x0\x0\x2\x4\x8\x10\x20\x40\x0\x1c\x10\x10\x10\x10\x10\x1c\x0\x8\x14\x22\x41\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x4\x4\x4\x0\x0\x0\x0\x0\x0\x0\x3e\x40\x7e\x41\x7e\x0\x1\x1\x3f\x41\x41\x41\x3f\x0\x0\x0\x7e\x1\x1\x1\x7e\x0\x40\x40\x7e\x41\x41\x41\x7e\x0\x0\x0\x3e\x41\x7f\x1\x7e\x0\x3c\x2\x1f\x2\x2\x2\x2\x0\x0\x0\x3e\x41\x41\x7e\x40\x3f" "\x1\x1\x1f\x21\x41\x41\x41\x0\x10\x0\x1c\x10\x10\x10\x10\x0\x20\x0\x38\x20\x20\x20\x10\xf\x1\x1\x21\x11\xf\x11\x21\x0\x4\x4\x4\x4\x4\x4\x18\x0\x0\x0\x3f\x49\x49\x49\x49\x0\x0\x0\x1f\x21\x41\x41\x41\x0\x0\x0\x3e\x41\x41\x41\x3e\x0" "\x0\x0\x3f\x41\x41\x3f\x1\x1\x0\x0\x7e\x41\x41\x7e\x40\x40\x0\x0\x3f\x41\x1\x1\x1\x0\x0\x0\x3e\x1\x1e\x20\x1f\x0\x8\x8\x3e\x8\x8\x8\x30\x0\x0\x0\x41\x41\x41\x41\x3e\x0\x0\x0\x41\x41\x41\x22\x1c\x0\x0\x0\x49\x49\x49\x49\x3f\x0" "\x0\x0\x41\x22\x1c\x22\x41\x0\x0\x0\x41\x41\x41\x7e\x40\x3f\x0\x0\x7f\x20\x1c\x2\x7f\x0\x60\x10\x10\xc\x10\x10\x60\x0\x8\x8\x8\x8\x8\x8\x8\x8\x6\x8\x8\x30\x8\x8\x6\x0\x26\x19\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\xaa\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 23 FontEntry("J-FLUX", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x18\x7e\x3\x3e\x60\x3f\x18\x0\x0\x66\x33\x18\xc\x66\x33\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\x30\x30\x30\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x18\xc\x0\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x0\x0\x60\x30\x18\xc\x6\x0\x0" "\x3e\x63\x6b\x6b\x6b\x63\x3e\x0\xe\xc\xc\xc\xc\x2c\x3e\x0\x1f\x30\x30\x1e\x3\x3\x3f\x0\x1f\x30\x30\x1e\x30\x30\x1f\x0\x3\x33\x33\x33\x7f\x30\x30\x0\x3f\x3\x3\x1f\x30\x30\x1f\x0\x3\x3\x3\x3f\x63\x63\x3e\x0\x3f\x30\x30\x18\xc\xc\xc\x0" "\x1c\x36\x36\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x60\x60\x0\x0\x0\x18\x0\x0\x18\x0\x0\x0\x0\x18\x0\x0\x18\xc\x0\x0\x30\x18\xc\x18\x30\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3c\x66\x60\x30\x18\x0\x18\x0" "\x3c\x66\xdb\xdb\x73\x6\x3c\x0\x3c\x66\x63\x63\x7f\x63\x63\x0\x3f\x63\x63\x3f\x63\x63\x3f\x0\x7c\x6\x3\x3\x3\x6\x7c\x0\x3f\x63\x63\x63\x63\x63\x3f\x0\x7f\x3\x3\x7f\x3\x3\x7f\x0\x7f\x3\x3\x7f\x3\x3\x3\x0\x7c\x6\x3\x73\x63\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x18\x18\x18\x18\x18\x18\x18\x0\x60\x60\x60\x60\x60\x60\x3e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\x3\x3\x3\x3\x3\x3\x7f\x0\x3f\x6b\x6b\x6b\x6b\x6b\x6b\x0\x1f\x33\x63\x63\x63\x63\x63\x0\x3c\x66\x63\x63\x63\x63\x3e\x0" "\x3f\x63\x63\x63\x3f\x3\x3\x0\x3c\x66\x63\x63\x63\x5b\x36\x60\x3f\x63\x63\x63\x3f\x63\xc3\x0\x7c\x6\x3\x3e\x60\x60\x3f\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x6b\x6b\x6b\x6b\x6b\x6b\x3f\x0" "\x63\x63\x63\x3e\x63\x63\x63\x0\x33\x33\x33\x1e\xc\xc\xc\x0\x7f\x60\x30\x18\xc\x6\x7f\x0\x1e\x6\x6\x6\x6\x6\x1e\x0\x0\x6\xc\x18\x30\x60\x0\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x18\x3c\x66\xc3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\xc\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x7e\x3\x3\x3\x7e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x7e\x0\x3c\x6\x1f\x6\x6\x6\x6\x0\x0\x0\x3e\x63\x63\x7e\x60\x3f" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1e\x18\x18\x18\x18\x0\x30\x0\x3c\x30\x30\x30\x30\x1f\x3\x3\x63\x33\x1f\x33\x63\x0\xc\xc\xc\xc\xc\xc\x38\x0\x0\x0\x3f\x6b\x6b\x6b\x6b\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\x60\x0\x0\x3f\x63\x3\x3\x3\x0\x0\x0\x3e\x3\x1e\x30\x1f\x0\xc\xc\x3f\xc\xc\xc\x38\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x63\x63\x3e\x63\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x1c\x6\x7f\x0\xe0\x30\x30\x1c\x30\x30\xe0\x0\x18\x18\x18\x18\x18\x18\x18\x18\x7\xc\xc\x38\xc\xc\x7\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\xaa\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 24 FontEntry("J-TERMO", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x1c\x1c\x1c\x0\x1c\x0\x77\x77\x77\x0\x0\x0\x0\x0\x0\x6c\xfe\x6c\x6c\xfe\x6c\x0\x18\x7e\x7\x3e\x70\x3f\xc\x0\x0\x66\x33\x18\xcc\x66\x0\x0\x1c\x36\x1c\xb6\x63\x73\xde\x0\x60\x30\x18\x0\x0\x0\x0\x0" "\x30\x18\x18\x18\x18\x18\x18\x30\x6\xc\xc\xc\xc\xc\xc\x6\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc\x0\x0\xe0\x70\x38\x1c\xe\x7\x0" "\x3e\x77\x77\x7f\x77\x77\x3e\x0\x38\x3c\x38\x38\x38\x38\x7c\x0\x3e\x77\x70\x3c\xe\x7\x7f\x0\x3e\x70\x3c\x70\x77\x77\x3e\x0\x77\x77\x77\x77\x7e\x70\x70\x0\x7f\x7\x3f\x70\x77\x77\x3f\x0\x3e\x77\x7\x3f\x77\x77\x3e\x0\x7f\x60\x70\x38\x1c\x1c\x1c\x0" "\x3e\x77\x77\x3e\x77\x77\x3e\x0\x3e\x77\x7e\x70\x77\x77\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x6\x0\x0\x18\xc\x6\xc\x18\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3e\x77\x70\x38\x1c\x0\x1c\x0" "\x7e\xc3\xdb\xdb\x7b\x3\x3e\x0\x3e\x77\x7f\x77\x77\x77\x77\x0\x3f\x77\x3f\x77\x77\x77\x3f\x0\x3e\x77\x7\x7\x7\x77\x3e\x0\x3f\x77\x77\x77\x77\x77\x3f\x0\x7f\x7\x1f\x7\x77\x77\x7f\x0\x7f\x7\x1f\x7\x7\x7\x7\x0\x7e\x7\x77\x77\x77\x77\x3e\x0" "\x77\x77\x77\x7f\x77\x77\x77\x0\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x0\x70\x70\x70\x70\x77\x77\x3e\x0\x77\x77\x3f\xf\x3f\x77\x77\x0\x7\x7\x7\x7\x77\x77\x7f\x0\x77\x7f\x77\x77\x77\x77\x77\x0\x3f\x77\x77\x77\x77\x77\x77\x0\x3e\x7f\x77\x77\x77\x7f\x3e\x0" "\x3f\x77\x3f\x7\x7\x7\x7\x0\x3e\x77\x77\x77\x77\x77\x7e\xe0\x3f\x77\x3f\x77\x77\x77\x77\x0\x3e\x7\x3e\x70\x77\x77\x3e\x0\x7f\x1c\x1c\x1c\x1c\x1c\x1c\x0\x77\x77\x77\x77\x77\x77\x3e\x0\x77\x77\x77\x77\x77\x36\x1c\x0\x77\x77\x77\x77\x77\x7f\x77\x0" "\x77\x77\x3e\x1c\x3e\x77\x77\x0\x77\x77\x3e\x1c\x1c\x1c\x1c\x0\x7f\x70\x38\x1c\xe\x7\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x0\x7\xe\x1c\x38\x70\xe0\x0\xe\xc\xc\xc\xc\xc\xc\xe\x18\x3c\x66\xc3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3e\x70\x7e\x77\x7e\x0\x7\x7\x3f\x77\x77\x77\x3f\x0\x0\x0\x3e\x77\x7\x77\x3e\x0\x70\x70\x7e\x77\x77\x77\x7e\x0\x0\x0\x3e\x77\x7f\x7\x7e\x0\x3c\xe\xe\x3f\xe\xe\xe\x0\x0\x0\x3e\x77\x77\x7e\x70\x3e" "\x7\x7\x3f\x77\x77\x77\x77\x0\x38\x0\x38\x38\x38\x38\x38\x0\x70\x0\x70\x70\x70\x70\x70\x3f\x7\x7\x77\x37\x1f\x37\x77\x0\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x0\x0\x0\x3f\x6b\x6b\x6b\x6b\x0\x0\x0\x3f\x77\x77\x77\x77\x0\x0\x0\x3e\x77\x77\x77\x3e\x0" "\x0\x0\x3f\x77\x77\x3f\x7\x7\x0\x0\x7e\x77\x77\x7e\x70\x70\x0\x0\x3f\x77\x7\x7\x7\x0\x0\x0\x7e\x7\x7e\xe0\x7e\x0\x1c\x1c\x7f\x1c\x1c\x1c\x1c\x0\x0\x0\x77\x77\x77\x77\x3e\x0\x0\x0\x77\x77\x77\x36\x1c\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x77\x36\x1c\x36\x77\x0\x0\x0\x77\x77\x77\x7e\x70\x3f\x0\x0\x7f\x38\x1c\xe\x7f\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\x6\xc\xc\x18\xc\xc\x6\x0\xe\xdb\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 25 FontEntry("KANAFONT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x3c\x42\xa5\x81\xbd\x99\x42\x3c\x3c\x7e\xdb\xff\xc3\xe7\x7e\x3c\x0\x66\xff\xff\xff\x7e\x18\x0\x0\x0\x1c\x3e\x3e\x1c\x0\x0\x0\x18\x3c\x66\xe7\x18\x3c\x0\x18\x3c\x7e\xff\x7e\x18\x3c\x0\x0\x0\x3c\x7e\x7e\x3c\x0\x0" "\xff\xff\xc3\x81\x81\xc3\xff\xff\x0\x0\x3c\x7e\x66\x7e\x3c\x0\xff\xff\xc3\x81\x99\x81\xc3\xff\x78\x70\x58\x3e\x63\x63\x3e\x0\x3c\x66\x66\x3c\x18\x7e\x18\x18\xf8\x18\x18\xf8\x18\x1e\x1f\xe\xfe\xc6\xc6\xfe\xc6\xe6\x77\x3\xdb\xdb\x18\xff\xff\x18\xdb\xdb" "\xe\x1e\x3e\x7e\x3e\x1e\xe\x0\x70\x78\x7c\x7e\x7c\x78\x70\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x0\x66\x66\x66\x66\x66\x0\x66\x0\xff\xff\x66\x66\x66\x66\x66\x0\x7e\x3\x3f\x66\x66\x7c\x60\x3f\x0\x0\x0\x0\xff\xff\xff\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x7e" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x7f\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\x0\xff\xff\x7e\x3c\x18\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x3c\x18\x0\x18\x0\x33\x77\x66\x0\x0\x0\x0\x0\x36\x7f\x7f\x36\x7f\x7f\x36\x0\x1c\x7e\xf\x3e\x78\x3f\x1c\x0\x0\x6e\x77\x38\x1c\xee\x76\x0\x1c\x3e\x36\xde\x77\x7f\xde\x0\x18\x1c\xc\x0\x0\x0\x0\x0" "\x38\x3c\xc\xc\xc\x3c\x38\x0\x1c\x3c\x30\x30\x30\x3c\x1c\x0\x0\x36\x1c\x7f\x7f\x1c\x36\x0\x0\x18\x18\x7e\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x1c\xc\x0\x0\x0\x7e\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x0\x60\x70\x38\x1c\xe\x6\x0" "\x3e\x7f\x67\x63\x73\x7f\x3e\x0\x1e\x1e\x18\x18\x18\x7e\x7e\x0\x3f\x7f\x60\x3e\x7\x7f\x7f\x0\x3f\x7f\x60\x3c\x70\x7f\x3f\x0\x63\x63\x63\x7f\x7f\x60\x60\x0\x7f\x7f\x3\x3f\x70\x7f\x3f\x0\x7c\x7e\x7\x3f\x63\x7f\x3e\x0\x7f\x7f\x60\x70\x1c\xe\xe\x0" "\x3e\x7f\x63\x3e\x63\x7f\x3e\x0\x3e\x7f\x63\x7f\x70\x7f\x3f\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x18\x0\x0\x18\x1c\xc\x0\x38\x1c\xe\xe\x1c\x38\x0\x0\x7f\x7f\x0\x0\x7f\x7f\x0\x0\x1c\x38\x70\x70\x38\x1c\x0\x3e\x7f\x70\x38\x1c\x0\x1c\x1c" "\x3e\x7f\x63\x7b\x3\x7f\x7e\x0\x3e\x7f\x63\x7f\x7f\x63\x63\x0\x3f\x7f\x63\x3f\x63\x7f\x3f\x0\x7c\x7e\x7\x3\x3\x7f\x7e\x0\x1f\x3f\x73\x63\x63\x7f\x3f\x0\x7c\x7e\x7\x7f\x3\x7f\x7f\x0\x7c\x7e\x7\x7f\x7f\x3\x3\x0\x7c\x7e\x7\x7b\x63\x7f\x3e\x0" "\x63\x63\x63\x7f\x7f\x63\x63\x0\x3c\x3c\x18\x18\x18\x3c\x3c\x0\x7c\x7c\x60\x60\x70\x7f\x3f\x0\x63\x63\x33\x1f\x3f\x73\x63\x0\x3\x3\x3\x3\x7\x7e\x7c\x0\x63\x7f\x7f\x63\x63\x63\x63\x0\x67\x6f\x7f\x7b\x73\x63\x63\x0\x3c\x7e\x67\x63\x63\x7f\x3e\x0" "\x3f\x7f\x63\x7f\x3f\x3\x3\x0\x3c\x7e\x67\x63\x5b\x3b\x76\x60\x3f\x7f\x63\x3f\x3f\x63\x63\x0\x7e\x7f\x3\x3f\x60\x7f\x3f\x0\x7e\x7e\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x7f\x3e\x0\x63\x63\x63\x63\x77\x3e\x1c\x0\x63\x63\x63\x63\x7f\x7f\x63\x0" "\x63\x63\x63\x3e\x3e\x63\x63\x0\x63\x63\x7f\x7e\x60\x7f\x3f\x0\xff\xff\x70\x38\xe\xff\xff\x0\x3c\x3c\xc\xc\xc\x3c\x3c\x0\x0\x6\xe\x1c\x38\x70\x60\x0\x3c\x3c\x30\x30\x30\x3c\x3c\x0\x1c\x3e\x77\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\xff" "\xc\x1c\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x7f\x63\x7f\x7e\x0\x3\x3\x3f\x7f\x63\x7f\x3f\x0\x0\x0\x7e\x7f\x3\x7f\x7e\x0\x60\x60\x7e\x7f\x63\x7f\x7e\x0\x0\x3e\x7f\x63\x7f\x3\x7e\x0\x70\x78\x18\x7e\x18\x1e\xe\x0\x0\x3e\x7f\x63\x7e\x60\x7f\x3f" "\x3\x3\x3f\x7f\x63\x63\x63\x0\x1c\x1c\x0\x1e\x1e\x78\x70\x0\x70\x70\x0\x78\x78\x70\x3f\x1f\x3\x33\x33\x1f\x3f\x33\x33\x0\x18\x18\x18\x18\x18\x78\x70\x0\x0\x0\x3e\x7f\x6b\x63\x63\x0\x0\x0\x3f\x7f\x63\x63\x63\x0\x0\x0\x3e\x7f\x63\x7f\x3e\x0" "\x0\x3e\x7f\x63\x7f\x3f\x3\x3\x0\x7e\x7f\x63\x7f\x7e\x60\x60\x0\x0\x3f\x7f\x63\x3\x3\x0\x0\x0\x7e\xf\x3e\x78\x3f\x0\xc\xc\x3f\x3f\xc\x3c\x38\x0\x0\x0\x63\x63\x63\x7f\x3e\x0\x0\x0\x63\x63\x77\x3e\x1c\x0\x0\x0\x63\x63\x6b\x7f\x3e\x0" "\x0\x0\x63\x3e\x3e\x63\x63\x0\x0\x66\x66\x7e\x7c\x70\x3f\x1f\x0\x0\x7f\x78\x3e\x7\x7f\x0\x70\x78\x18\xe\xe\x18\x78\x70\x18\x18\x18\x18\x18\x18\x18\x18\xe\x1e\x18\x70\x70\x18\x1e\xe\x6e\x7f\x3b\x0\x0\x0\x0\x0\x0\x8\x1c\x3e\x77\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\xaa\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x18\x3c\x66\xc3\x66\x66\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\x18\x18\xff\xff\x0\x66\x7e\x7e\x66\x66\x0\x0\x0\x8\x0\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x0\x18\x18\x0\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x66\x66\x67\x60\x67\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x0\x0\x7f\x60\x67\x66\x66\x66\x66\x66\x67\x60\x7f\x0\x0\x0\x66\x66\x66\x66\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x66\x66\x66\x66\xe6\x66\x66\x66" "\x66\x66\xe6\x6\xfe\x0\x0\x0\x0\x0\xfe\x6\xe6\x66\x66\x66\x66\x66\xe7\x0\xff\x0\x0\x0\x0\x0\xff\x0\xe7\x66\x66\x66\x66\x66\xe6\x6\xe6\x66\x66\x66\x0\x0\xff\x0\xff\x0\x0\x0\x66\x66\xe7\x0\xe7\x66\x66\x66\x18\x18\xff\x0\xff\x0\x0\x0" "\x66\x66\x66\xff\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\xff\x66\x66\x66\x66\x66\x66\x66\xfe\x0\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\xfe\x66\x66\x66\x66\x66\x66\x66\xff\x66\x66\x66\x66" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x7f\x33\x7f\x6e\x0\x3f\x7f\x63\x3f\x63\x7f\x3f\x3\x7f\x7f\x63\x3\x3\x3\x3\x0\x0\x3\xff\xff\x66\x66\x66\x0\x7f\x7f\xe\x1c\xe\x7f\x7f\x0\x0\xc0\xfe\x7f\x33\x3f\x1e\x0\x0\x0\x66\x66\x7e\x3e\x7\x3\x0\x0\xff\xff\x1b\x18\x18\x0" "\x0\x3c\x7e\x66\x66\x7e\x3c\x0\x3e\x7f\x63\x7f\x63\x7f\x3e\x0\x3e\x7f\x63\x77\x36\x77\x77\x0\x7e\x7\x3e\x7f\x63\x7f\x3e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x30\x30\x7e\xdb\xdb\x7e\xc\xc\x3e\x3f\x3\x3f\x3\x3f\x3e\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 26 FontEntry("MOTIF", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x3e\x7f\x6b\x5d\x63\x7f\x3e\x0\x63\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x8\x1c\x8\x77\x77\x8\x1c\x0\x1c\x3e\x7f\x7f\x36\x8\x1c\x0\x0\x18\x3c\x7e\x3c\x18\x0\x0" "\xff\xe7\xc3\x81\xc3\xe7\xff\xff\x0\x18\x3c\x66\x66\x3c\x18\x0\xff\xe7\xc3\x99\x99\xc3\xe7\xff\x78\x70\x78\x6c\x1e\x33\x33\x1e\x7e\xc3\xc3\x7e\x18\x7e\x18\x18\x78\x58\x78\x18\x18\xe\xf\x6\x7c\x7c\x6c\x6c\x6f\x66\x78\x30\xdb\x3c\x66\xe7\x66\x3c\xdb\x0" "\x1\x3\xf\x1f\xf\x3\x1\x0\x40\x60\x78\x7c\x78\x60\x40\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x0\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xde\xdc\xd8\xd8\xd8\x0\x3c\x66\x1c\x36\x36\x1c\x33\x1e\x0\x0\x0\x0\x7f\x7f\x7f\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x7e" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x38\x7f\x38\x18\x0\x0\x0\xc\xe\x7f\xe\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x8\x1c\x3e\x3e\x7f\x0\x0\x0\x7f\x3e\x3e\x1c\x8\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x18\x7e\x3\x3e\x60\x3f\x18\x0\x0\x63\x30\x18\xc\x6\x63\x0\x1c\x36\x1c\x6e\x33\x33\x6e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x77\x3e\x7f\x3e\x77\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x0\x7f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x0\x0\x3c\x76\x66\x6e\x3c\x0\x0\x0\x18\x1c\x18\x18\x3c\x0\x0\x0\x3c\x66\x30\xc\x7e\x0\x0\x7e\x30\x38\x60\x60\x30\x1e\x0\x34\x36\x36\x33\x7f\x30\x0\x0\x7e\x2\x3e\x66\x60\x30\x1e\x38\xc\x6\x3e\x66\x66\x3c\x0\x0\x7e\x60\x30\x38\x18\xc\xc" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x0\x3c\x66\x66\x7c\x60\x30\x1c\x0\x0\x4\x0\x0\x4\x0\x0\x0\x18\x18\x0\x0\x18\x18\xc\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7f\x0\x0\x7f\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3e\x63\x60\x30\x18\x0\x18\x0" "\x3e\x63\x63\x7b\x3b\x3\x7e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x66\x66\x3e\x66\x66\x3f\x0\x3c\x66\x3\x3\x3\x66\x3c\x0\x1f\x36\x66\x66\x66\x36\x1f\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x1c\x6\x3\x1f\x3\x3\x3\x0\x3e\x63\x3\x3\x7b\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x18\x18\x18\x18\x1b\x1b\xe\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x1e\x33\x33\x33\x33\x33\x33\x0\x1c\x36\x63\x7f\x63\x36\x1c\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x63\x6b\x3e\x60\x0\x3f\x33\x3\x3\x3\x3\x0\x3e\x63\x3\x3e\x60\x63\x3e\x0\x0\x6e\x3b\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x36\x1c\x8\x0\x63\x63\x6b\x6b\x7f\x77\x63\x0" "\x63\x36\x1c\x1c\x1c\x36\x63\x0\x66\x66\x66\x66\x66\x7c\x60\xc0\x7f\x61\x30\x18\xc\x46\x7f\x0\x3e\x6\x6\x6\x6\x6\x3e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x3e\x30\x30\x30\x30\x30\x3e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x0\x3e\x63\x3\x63\x3e\x0\x0\x0\x3f\x66\x66\x66\x3f\x0\x0\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x7f\x3\x1f\x3\x3\x0\x0\x0\x3c\x66\x66\x38\x60\x38" "\x0\x0\x63\x63\x7f\x63\x63\x0\x0\x0\x3c\x18\x18\x18\x3c\x0\x0\x0\x30\x30\x30\x36\x1c\x0\x0\x0\x63\x33\x1f\x33\x63\x0\x0\x0\x3\x3\x3\x3\x3f\x0\x0\x0\x63\x77\x6b\x6b\x63\x0\x0\x0\x7e\x6c\x6c\x6c\x6c\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x66\x3e\x6\xf\x0\x0\x0\x3e\x63\x63\x3b\x6e\x0\x0\x0\x3f\x66\x3e\x36\x67\x0\x0\x0\x3e\x3\x3e\x60\x3e\x0\x0\x0\x7e\x5a\x18\x18\x3c\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x36\x1c\x8\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x66\x66\x3c\x18\x18\x0\x0\x0\x3f\x19\xc\x26\x3f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\xe\x18\x18\x70\x18\x18\xe\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x1c\x36\x36\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\xff\x30\xb7\x81\xed\xc\xff\x0\x3f\x29\x23\x31\x25\x3f\x0\x0\x7e\x52\x46\x62\x4a\x7e\x0\x0\xfc\xa4\x8c\xc4\x94\xfc\x0\x0\xf8\x48\x18\x88\x28\xf8\x0\x0\xf0\x90\x30\x10\x50\xf0\x0" "\x0\xe0\x20\x60\x20\xa0\xe0\x0\x0\xc0\x40\xc0\x40\x40\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x2\x2\x3\x2\x3\x0\x0\x7\x5\x4\x6\x4\x7\x0\x0\xf\xa\x8\xc\x9\xf\x0\x0\x1f\x14\x11\x18\x12\x1f\x0" "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x3c\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x1\x1\x1\x1\x1\x0\x0\x0\x15\x15\x15\x15\x15\x0" "\x0\x0\x55\x55\x55\x55\x55\x0\x0\x0\x5\x5\x5\x5\x5\x0\x0\x0\x55\x55\x55\x55\x55\x0\x0\x0\x55\x55\x55\x55\x55\x0\x0\x0\x1\x1\x1\x1\x1\x0\x0\x0\x5\x5\x5\x5\x5\x0\x0\x0\x55\x55\x55\x55\x55\x0\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x66\x0\x0\x0\x0\x0\x78\x84\x2\x0\x0\x0\x0\x0\x0\x0\x41\x22\x1c\x0\x0\x0\x7c\x44\x44\x44\x44\xc6\x0\x0\x7c\x44\x44\x44\x44\xc7\x0\x0\xc\x34\xc4\x4\x4\x4\x0\x0\x20\x20\x20\x23\x2c\x30\x0\x0\x60\x20\x20\x20\x20\x60\x0" "\x0\x3\x2\x2\x2\x2\x3\x0\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0" "\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x81\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 27 FontEntry("NOTCH", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x22\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x42\x42\x42\x3c\x0\xff\xc3\xbd\xbd\xbd\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x2e\x3f\x1f\xe\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x1\x3\x7\xf\xf\x7\x3\x1\x80\xc0\xe0\xf0\xf0\xe0\xc0\x80\xc\x1e\x3f\xc\xc\x3f\x1e\xc\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6d\x6e\x6c\x6c\x6c\x0\x3e\x41\x1e\x22\x22\x3c\x41\x3e\x0\x0\x0\x0\x7f\x7f\x7f\x7f\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x0\x0\x18\x3c\x7e\xff\xff\x7e\x3c\x18\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x11\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x36\x1c\x6e\x3b\x33\x6e\x0\xc\xc\x6\x0\x0\x0\x0\x0" "\x40\x30\x18\x18\x18\x30\x40\x0\x1\x6\xc\xc\xc\x6\x1\x0\x0\x2a\x1c\x7f\x1c\x2a\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\xc\xc\x6\x0\x0\x0\x3f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x3e\x61\x63\x6b\x63\x63\x3e\x0\x18\x1c\x18\x18\x18\x18\x3c\x0\x3e\x63\x60\x30\xc\x6\x7f\x0\x3e\x43\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x46\x7f\x60\x60\x0\x7f\x1\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x40\x30\x18\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x30\x1c\x0\x0\xc\xc\x0\x0\xc\xc\x0\x0\xc\xc\x0\xc\xc\x6\x0\xc0\x60\x30\x18\x18\x30\x60\xc0\x0\x0\x7e\x0\x7e\x0\x0\x0\x3\x6\xc\x18\x18\xc\x6\x3\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x61\x63\x3f\x63\x63\x3f\x0\x3c\x66\x3\x3\x43\x66\x3c\x0\x3f\x61\x63\x63\x63\x63\x3f\x0\x7f\x1\x3\x1f\x3\x3\x7f\x0\x7f\x41\x3\x1f\x13\x3\x3\x0\x3e\x63\x3\x7b\x4b\x63\x5e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x8\x18\x18\x18\x18\x7e\x0\x78\x10\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x2\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x61\x63\x63\x63\x63\x3e\x0" "\x3f\x62\x66\x3e\x6\x6\xf\x0\x3e\x61\x63\x63\x7b\x73\x3e\x60\x3f\x62\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x8\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\xc\xc\x1e\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x70\x30\x30\x30\x30\x30\x30\x70\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x18\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x7\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x61\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x61\x63\x3f\x3\x3\x0\x0\x7e\x43\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x63\x36\x1c\x8\x0\x0\x63\x6b\x6b\x7f\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x36\x1c\xc\x7\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x6\xd\x1a\x35\x6a\xd5\xab\x56\xac\x58\xb0\x60\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x3e\x3e\x3e\x3e\x3e\x3e\x3e\x3e\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x3e\x7e\x7e\x7e\x7e\x7e\x7e\x3c\x0\x3f\x3f\x3f\x3f\x3f\x3f\xbf\x3f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x3c\x3c\x3c\x3c\x3c\x3c\xbc\x3e\x7c\x7c\x7c\x7c\x7c\x7c\x7c\x7e\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 28 FontEntry("PEANUT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x1c\x8\x8\x0\x8\x0\x48\x24\x0\x0\x0\x0\x0\x0\x22\x7f\x22\x22\x22\x7f\x22\x0\x8\x3c\xa\x1c\x28\x1e\x8\x0\x0\x44\x22\x10\x8\x44\x22\x0\x1c\x22\x14\x6a\x11\x11\x6e\x0\x20\x10\x0\x0\x0\x0\x0\x0" "\x10\x8\x4\x4\x4\x8\x10\x0\x4\x8\x10\x10\x10\x8\x4\x0\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x8\x8\x3e\x8\x8\x0\x0\x0\x0\x0\x0\x0\x8\x4\x0\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x8\x0\x0\x40\x20\x10\x8\x4\x2\x0" "\x1c\x22\x32\x2a\x26\x22\x1c\x0\xc\x8\x8\x8\x8\x8\x8\x0\x1c\x22\x20\x18\x4\x2\x3e\x0\x1c\x22\x20\x18\x20\x22\x1c\x0\x0\x10\x8\x24\x22\x7e\x20\x0\x3f\x1\x1e\x20\x20\x11\xe\x0\x4\x2\x2\x3a\x46\x42\x3c\x0\x3c\x20\x20\x10\x10\x8\x8\x0" "\x3c\x12\xa\x3c\x42\x42\x3c\x0\x3c\x42\x62\x5c\x40\x40\x20\x0\x0\x0\x8\x0\x0\x8\x0\x0\x0\x0\x8\x0\x0\x8\x4\x0\x20\x10\x8\x4\x8\x10\x20\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x4\x8\x10\x20\x10\x8\x4\x0\x3c\x46\x46\x20\x10\x0\x10\x0" "\x3c\x42\x99\xa5\x59\x2\x7c\x0\x1c\x22\x42\x42\x7e\x42\x42\x0\x1e\x21\x21\x1f\x21\x21\x1f\x0\x3c\x2\x1\x1\x1\x2\x3c\x0\x3f\x41\x41\x41\x41\x41\x3f\x0\x3e\x1\x1\x1f\x1\x1\x3e\x0\x3c\x2\x2\x1e\x2\x2\x2\x0\x1e\x21\x1\x19\x21\x21\x1e\x0" "\x42\x42\x42\x42\x7e\x42\x42\x0\x1c\x8\x8\x8\x8\x8\x1c\x0\x30\x20\x20\x20\x20\x20\x1c\x0\x2\x22\x12\xa\xe\x12\x22\x0\x2\x2\x2\x2\x2\x2\x3e\x0\x1a\x2e\x2a\x2a\x2a\x2a\x2a\x0\x1a\x26\x22\x22\x22\x22\x22\x0\x1c\x22\x22\x22\x22\x22\x1c\x0" "\x3c\x42\x42\x3e\x2\x2\x2\x0\x3c\x42\x41\x41\x41\x51\x2e\x40\x3c\x42\x42\x3e\x12\x22\x42\x0\x1c\x22\x4\x8\x10\x22\x1c\x0\x3c\xa\x8\x8\x8\x8\x8\x0\x22\x22\x22\x22\x22\x32\x2c\x0\x22\x22\x22\x22\x22\x14\x8\x0\x2a\x2a\x2a\x2a\x2a\x2a\x1e\x0" "\x22\x22\x14\x8\x14\x22\x22\x0\x22\x22\x22\x32\x2c\x20\x18\x0\x3e\x20\x10\x8\x4\x2\x3e\x0\xe\x2\x2\x2\x2\x2\xe\x0\x0\x2\x4\x8\x10\x20\x40\x0\x1c\x10\x10\x10\x10\x10\x1c\x0\x8\x1c\x36\x1c\x8\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x4\x4\x4\x0\x0\x0\x0\x0\x0\x0\x0\x3c\x42\x62\x5c\x0\x2\x2\x2\x3a\x46\x42\x3c\x0\x0\x0\x0\x3c\x2\x2\x3c\x0\x40\x40\x40\x5c\x62\x42\x3c\x0\x0\x0\x1c\x22\x3e\x2\x3c\x0\x0\x1c\x2\x1e\x2\x2\x2\x0\x0\x0\x3c\x42\x62\x5c\x40\x3c" "\x2\x2\x2\x2\x3a\x46\x42\x0\x0\x0\x8\x0\x8\x8\x8\x0\x0\x0\x20\x0\x20\x20\x20\x18\x2\x2\x2\x12\xa\x16\x22\x0\x8\x8\x8\x8\x8\x8\x8\x0\x0\x0\x0\x6a\x56\x52\x52\x0\x0\x0\x0\x3a\x26\x22\x22\x0\x0\x0\x0\x1c\x22\x22\x1c\x0" "\x0\x0\x3c\x42\x46\x3a\x2\x2\x0\x0\x3c\x42\x62\x5c\x40\x40\x0\x0\x1a\x26\x2\x2\x2\x0\x0\x0\x18\x24\x8\x12\xc\x0\x0\x0\x8\x38\xc\x8\x8\x0\x0\x0\x0\x42\x42\x62\x5c\x0\x0\x0\x0\x42\x42\x24\x18\x0\x0\x0\x0\x2a\x2a\x2a\x1e\x0" "\x0\x0\x20\x16\x8\x34\x2\x0\x0\x0\x42\x42\x62\x5c\x40\x3c\x0\x0\x2c\x12\x8\x24\x1a\x0\x60\x10\x10\xc\x10\x10\x60\x0\x8\x8\x8\x8\x8\x8\x8\x8\x6\x8\x8\x30\x8\x8\x6\x0\x26\x19\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xfc\x2\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\x3f\x40\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x2\xfc\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x40\x3f" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x3\x7\xf\x1f\x3f\x7e\xfc\x3f\x7e\xfc\xf8\xf0\xe0\xc0\x80\xc0\xb0\xec\x3c\x1a\xe\x7\x5\xff\x55\xff\x0\x0\x0\x0\x0" "\x3\xd\x3f\x34\x78\x50\xe0\xa0\x7\x5\x7\x5\x7\x5\x7\x5\xe0\xa0\xe0\xa0\xe0\xa0\xe0\xa0\x7\x5\xe\xa\x3c\xec\x70\xc0\x0\x0\x0\x0\x0\xff\x55\xff\xe0\xa0\x70\x58\x3c\x37\xd\x3\x7\x5\x7\x0\x0\x0\x0\x0\xe0\xa0\xe0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x7\x5\x7\x0\x0\x0\x0\x0\xe0\xa0\xe0\x0\x81\xc3\xe7\xff\x7e\x3c\x18\x0\x1e\x29\x23\x31\x25\x1e\x0\x0\x3c\x52\x46\x62\x4a\x3c\x0\x0\x78\xa4\x8c\xc4\x94\x78\x0\x0\xf0\x48\x18\x88\x28\xf0\x0\x0\xe0\x90\x30\x10\x50\xe0\x0" "\x0\xc0\x20\x60\x20\xa0\xc0\x0\x0\x80\x40\xc0\x40\x40\x80\x0\x0\x0\x80\x80\x80\x80\x0\x0\x0\x0\x1\x1\x1\x1\x0\x0\x0\x1\x2\x2\x3\x2\x1\x0\x0\x3\x5\x4\x6\x4\x3\x0\x0\x7\xa\x8\xc\x9\x7\x0\x0\xf\x14\x11\x18\x12\xf\x0" "\x78\x3c\x1e\x3c\x78\x3c\x1e\x3c\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x0\x10\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x66\x0\x0\x0\x0\x0\x78\x84\x2\x0\x0\x0\x0\x0\x0\x0\x41\x22\x1c\x0\x0\x0\x7c\x44\x44\x44\x44\xc6\x0\x0\x7c\x44\x44\x44\x44\xc7\x0\x0\xc\x34\xc4\x4\x4\x4\x0\x0\x20\x20\x20\x23\x2c\x30\x0\x0\x60\x20\x20\x20\x20\x60\x0" "\x0\x3\x2\x2\x2\x2\x3\x0\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x18\x3c\x3c\x18\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x3c\x3c\x3c\x3c\x0\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0\x0\x18\x3c\x7e\x7e\x3c\x18\x0" "\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x81\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 29 FontEntry("PERISOFT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x8\x8\x14\x36\x6b\x0\x7f\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x8\xc\xc\xc\x4\x0\xc\x0\x66\x44\x0\x0\x0\x0\x0\x0\x12\x36\x7f\x36\x7f\x36\x12\x0\x3e\x6b\xb\xb\x3e\x69\x3e\x8\xce\x69\x35\x1a\x6c\x56\x33\x0\x1c\x26\xa6\x7c\x3e\x23\x5e\x80\x10\x18\xc\x0\x0\x0\x0\x0" "\xe0\x30\x18\x18\x18\x30\x60\xc0\x3\x6\xc\x18\x18\x18\xc\x7\x9\x2a\x1c\x7f\x1c\x2a\x48\x0\x8\x18\x18\x18\x7e\x18\x10\x0\x0\x0\x0\x0\x0\x10\x18\xe\x0\x0\x0\x7e\x1\x0\x0\x0\x0\x0\x0\x0\x0\x18\x38\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x3c\x66\x76\x56\x4e\x2e\x1c\x0\xc\x18\x18\x18\x18\x18\x3c\x0\x3e\x63\x40\x60\x3e\x7\x7f\x0\x3e\x63\x60\x60\x38\x63\x3e\x0\x30\x58\x4c\x46\x43\x7e\x40\x0\x3f\x63\x3\x3\x3e\x40\x3f\x0\x3c\x66\x43\x3\x3f\x43\x3e\x0\x3f\x60\x30\x18\xc\x6\x3\x0" "\x3e\x43\x43\x43\x3e\x43\x3e\x0\x3e\x43\x43\x43\x7e\x41\x3e\x0\x0\x8\xc\x0\x0\xc\x8\x0\x0\x8\x8\x0\x8\xc\x4\x0\x0\x30\x18\xc\x6\xc\x18\x0\x0\x0\x40\x7e\x0\x7e\x2\x0\x0\x3\x6\xc\x18\xc\x6\x0\x3e\x63\x60\x60\x3c\x0\xc\x8" "\x1c\x22\x49\x55\x35\x9\x22\x1c\xe\x1b\x23\x43\x43\x7f\x43\x0\x3e\x43\x43\x23\x3f\x43\x3e\x0\x3e\x43\x43\x3\x43\x43\x3e\x0\x3e\x43\x43\x43\x43\x23\x1f\x0\x3e\x43\x3\x1b\x7\x43\x3e\x0\x3e\x43\x3\x1b\x7\x3\x2\x0\x3e\x43\x23\x3\x3b\x43\x3e\x0" "\x42\x43\x43\x63\x7f\x43\x42\x0\x7e\x18\x10\x10\x10\x18\x7e\x0\x18\x30\x20\x20\x21\x33\x1e\x0\x62\x33\x1b\xf\xf\x1b\x32\x0\x6\x3\x3\x3\x3\x43\x3e\x0\x22\x63\x63\x77\x7f\x6b\x22\x0\x42\x43\x43\x47\x4f\x5b\x72\x0\x3e\x43\x43\x43\x43\x43\x3e\x0" "\x3e\x43\x43\x43\x3f\x3\x6\x0\x3e\x43\x43\x43\x43\x53\x5e\x80\x3e\x43\x43\x23\x1f\x23\x42\x0\x3e\x43\x3\xe\x38\x43\x3e\x0\x7f\x1c\x18\x18\x18\x18\x8\x0\x42\x43\x43\x43\x43\x43\x3e\x0\x42\x43\x43\x43\x23\x13\xe\x0\x42\x43\x43\x43\x5b\x6f\x46\x0" "\x81\x43\x23\x16\x1c\x3e\x63\x0\x43\x43\x26\x2c\x18\x8\x8\x0\x3e\x61\x30\x18\x7f\x6\x7f\x0\x70\x18\x18\x18\x18\x18\x18\x70\x3\x6\xc\x18\x30\x60\xc0\x80\x7\xc\xc\xc\xc\xc\xc\x7\x8\x1c\x26\x43\x81\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x8\xc\x18\x30\x0\x0\x0\x0\x0\x0\x1e\x20\x3e\x63\xde\x0\x2\x3\x3\x3b\x47\x43\x3e\x0\x0\x0\x1e\x23\x3\x43\x3e\x0\x20\x40\x5c\x66\x63\x43\x7e\x0\x0\x0\x1e\x23\x1f\x3\x3e\x0\x3c\x46\x46\x6\x6\x1f\x6\x0\x0\x0\x3e\x43\x63\x5e\x40\x3e" "\x2\x3\x3b\x6f\x47\x43\x42\x0\x18\x10\x4\x18\x18\x18\x38\x0\x40\x60\x0\x60\x20\x21\x31\x1e\x2\x23\x13\xb\x7\xb\x12\x0\xc\x18\x18\x18\x18\x18\x30\x0\x0\x0\x22\x77\x6b\x6b\x22\x0\x0\x0\x3e\x43\x43\x43\x43\x0\x0\x0\x3e\x43\x43\x43\x3e\x0" "\x0\x0\x1e\x23\x43\x3f\x3\x2\x0\x0\x3c\x46\x43\x7e\x40\x80\x0\x0\x38\x4f\x46\x6\x6\x0\x0\x0\x3e\x3\x1c\x30\x1f\x0\x8\xc\xc\xc\x7f\xc\x78\x0\x0\x0\x43\x43\x43\x46\xbc\x0\x0\x0\x42\x43\x43\x26\x1c\x0\x0\x0\x22\x6b\x6b\x77\x22\x0" "\x0\x0\x23\x16\xc\x16\x23\x0\x0\x0\x43\x43\x43\x7e\x40\x3f\x0\x0\x7e\x30\x8\x6\x7f\x0\x78\xc\x18\xe\x18\xc\x78\x0\x8\x18\x18\x18\x18\x18\x18\x10\x7\xc\x6\x3c\x6\xc\x7\x0\x6\x8d\x78\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xfe\xff\x3\xf3\xb\xb\xb\xb\xff\xff\x0\xff\x0\x0\x0\x0\x7f\xff\xc0\xcf\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xb\xb\xb\xb\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xb\xb\xb\xb\xf3\x3\xff\xfe\x0\x0\x0\x0\xff\x0\xff\xff\xd0\xd0\xd0\xd0\xcf\xc0\xff\x7f" "\xb\xd\x6\x3\x0\x0\x0\x0\xd0\xb0\x60\xc0\x0\x0\x0\x0\x0\x0\x0\x0\x3\x6\xd\xb\x0\x0\x0\x0\xc0\x60\xb0\xd0\xb\xb\x13\x33\xc6\xe\xfc\xf0\xf\x3f\x70\x60\xc1\xc6\xc4\xc8\xfe\xff\x47\xa3\xd3\x6b\x37\x1b\xff\xff\x55\xaa\xff\x0\x0\x0" "\xff\xff\xd5\xea\xdf\xe8\xd8\xe8\x1b\x17\x1b\x17\x1b\x17\x1b\x17\xe8\xd8\xe8\xd8\xe8\xd8\xe8\xd8\x17\x1b\x17\xfb\x57\xab\xff\xff\x0\x0\x0\xff\x55\xaa\xff\xff\xd8\xe8\xd8\xef\xd5\xea\xff\xff\x17\x1b\x15\x1a\xf\x0\x0\x0\xd8\xe8\x58\xa8\xf0\x0\x0\x0" "\x0\x0\x0\xf\x15\x1a\x17\x1b\x0\x0\x0\xf0\x58\xa8\xd8\xe8\x0\x0\x0\x55\x0\xaa\x0\x0\x0\x1c\x26\x26\x26\x3e\x7f\x2a\x0\x0\x1c\x26\x26\x26\x3e\x7f\x0\x0\x1c\x26\xe6\xa6\x3e\x7f\x0\x0\x1c\x26\xe6\xa6\x3e\x7f\x0\x1c\x26\xa6\xe6\x3e\x7f\x0" "\xe0\x30\x30\x30\xf0\xf8\x0\x0\x80\xc0\xc0\xc0\xc0\xe0\x0\x0\x0\x0\x80\x80\x80\x80\xc0\x0\x0\x0\x0\x0\x1f\x1d\x0\x0\x0\x0\x0\x1\x1f\x3c\x10\x38\x0\x1\x5\xf\x19\x3b\x10\x38\x3\x4\x4\x1c\x37\x2f\x70\x38\x0\x7\x9\x9\x9\x1f\x3f\x38" "\x18\x2c\x26\x1c\x38\x64\x3c\x18\xff\xff\x0\x0\x8\x8\x14\x6b\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x8\x8\x14\x2a\x5d\xff\x7e\x0\x42\xe7\xff\xdb\x42\x0\x0\x0\x8\x18\x0\x0\x0\x0\x3\x5\x5\x5\x5\x3\x0\x0\x7\x1d\x29\x29\x1d\x7\x0" "\x0\x0\xf\xf9\xc9\x3d\xf\x0\x0\x0\x6\x5\x5\x6\x0\x0\x0\x20\x3e\x33\x27\x3e\x20\x0\x0\xe0\xfe\x9b\x93\xde\xf0\x0\x0\xf\x1a\x12\x12\x12\x1b\xf\x0\x1f\x3a\x52\x52\x52\x3b\x1f\x0\x7f\xda\x92\x92\xd2\xfb\x1f\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x80\xc0\x20\xd0\xe8\xf4\x1a\x8d\xe6\xaa\x83\x7d\x4d\x75\x4d\x7a\x85\xaa\xff\xff\x9d\xad\xbb\xd9\xff\xaa\xff\x7f\xdd\xea\xab\x5d\xff\xaa\xcc\x77\xcc\xff\xe0\xdb\x7b\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 30 FontEntry("REZ-ASCII", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x0\x18\x18\x0\x0\x6c\x6c\x6c\x0\x0\x0\x0\x0\x24\x7e\x24\x24\x7e\x24\x0\x18\x7c\xe\x3c\x70\x3e\x18\x0\x4e\x6a\x3e\x18\x7c\x56\x72\x0\x3c\x66\x66\x3c\x1e\x36\x6c\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x60\x30\x18\x18\x18\x30\x60\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x10\x54\x38\x38\x54\x10\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x3c\x3c\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x40\x60\x30\x18\xc\x6\x2\x0" "\x3c\x66\x76\x7e\x6e\x66\x3c\x0\x18\x1c\x18\x18\x18\x18\x3c\x0\x3c\x66\x66\x30\x18\xc\x7e\x0\x3c\x66\x66\x30\x66\x66\x3c\x0\x6\x6\x66\x66\x7c\x60\x60\x0\x7e\x66\x6\x3e\x60\x66\x3c\x0\x3c\x66\x6\x3e\x66\x66\x3c\x0\x7e\x66\x60\x30\x18\xc\xc\x0" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x3c\x66\x66\x7c\x60\x66\x3c\x0\x0\x0\x18\x18\x0\x18\x18\x0\x0\x0\x18\x18\x0\x18\x18\xc\x20\x30\x18\xc\x18\x30\x20\x0\x0\x0\x3c\x3c\x0\x3c\x3c\x0\x8\x18\x30\x60\x30\x18\x8\x0\x3c\x66\x66\x30\x18\x0\x18\x0" "\x78\x84\xb2\xaa\xaa\x72\x4\xf8\x3c\x66\x66\x7e\x66\x66\x66\x0\x3e\x66\x66\x3e\x66\x66\x3e\x0\x3c\x66\x66\x6\x66\x66\x3c\x0\x3e\x66\x66\x66\x66\x66\x3e\x0\x7e\x66\x6\xe\x6\x66\x7e\x0\x7e\x66\x6\xe\x6\x6\x6\x0\x3c\x66\x6\x76\x66\x66\x3c\x0" "\x66\x66\x66\x7e\x66\x66\x66\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x78\x30\x30\x30\x36\x36\x1c\x0\x66\x66\x66\x3e\x66\x66\x66\x0\x6\x6\x6\x6\x6\x6\x7e\x0\x42\x66\x7e\x66\x66\x66\x66\x0\x62\x66\x6e\x7e\x76\x66\x46\x0\x3c\x66\x66\x66\x66\x66\x3c\x0" "\x3e\x66\x66\x3e\x6\x6\x6\x0\x3c\x66\x66\x66\x66\x76\x3c\x60\x3e\x66\x66\x3e\x66\x66\x66\x0\x3c\x66\x6\x3c\x60\x66\x3c\x0\x3e\x60\x60\x60\x60\x60\x60\x0\x66\x66\x66\x66\x66\x66\x3c\x0\x66\x66\x66\x66\x66\x6c\x38\x0\x66\x66\x66\x66\x7e\x66\x42\x0" "\x66\x66\x66\x3c\x66\x66\x66\x0\x66\x66\x66\x3c\x18\x18\x18\x0\x7e\x66\x30\x18\xc\x66\x7e\x0\x78\x18\x18\x18\x18\x18\x78\x0\x2\x6\xc\x18\x30\x60\x40\x0\x1e\x18\x18\x18\x18\x18\x1e\x0\x10\x38\x6c\x44\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x7e\x0" "\x0\x18\x18\x30\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x66\x7e\x0\x6\x6\x3e\x66\x66\x66\x3e\x0\x0\x0\x3c\x66\x6\x66\x3c\x0\x60\x60\x7c\x66\x66\x66\x7c\x0\x0\x0\x3c\x66\x7e\x6\x7c\x0\x3c\x66\x66\x6\xe\x6\x6\x0\x0\x0\x7c\x66\x66\x7c\x60\x3e" "\x6\x6\x3e\x66\x66\x66\x66\x0\x18\x0\x18\x18\x18\x18\x18\x0\x60\x0\x60\x60\x60\x66\x66\x3c\x6\x6\x66\x66\x3e\x66\x66\x0\x18\x18\x18\x18\x18\x18\x18\x0\x0\x0\x66\x7e\x66\x66\x66\x0\x0\x0\x3e\x66\x66\x66\x66\x0\x0\x0\x3c\x66\x66\x66\x3c\x0" "\x0\x0\x3e\x66\x66\x66\x3e\x6\x0\x0\x7c\x66\x66\x66\x7c\x60\x0\x0\x3e\x66\x66\x6\x6\x0\x0\x0\x7c\x6\x7e\x60\x3e\x0\xc\xc\x3c\xc\xc\x6c\x78\x0\x0\x0\x66\x66\x66\x66\x3c\x0\x0\x0\x66\x66\x66\x6c\x38\x0\x0\x0\x66\x66\x66\x7e\x66\x0" "\x0\x0\x66\x66\x3c\x66\x66\x0\x0\x0\x66\x66\x66\x7c\x60\x3e\x0\x0\x7e\x30\x18\xc\x7e\x0\x70\x18\x18\xc\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\xe\x18\x18\x30\x18\x18\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 31 FontEntry("SCRIPT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x8\x8\x8\x8\x8\x0\x8\x0\x14\x14\x14\x0\x0\x0\x0\x0\x0\x14\x3e\x14\x3e\x14\x0\x0\x8\x3c\xa\x1c\x28\x1e\x8\x0\x0\x46\x26\x10\x8\x64\x62\x0\xc\x12\xc\x4c\x52\x22\x5c\x0\x8\x8\x4\x0\x0\x0\x0\x0" "\x10\x8\x8\x8\x8\x8\x10\x0\x8\x10\x10\x10\x10\x10\x8\x0\x0\x2a\x1c\x8\x1c\x2a\x0\x0\x0\x8\x8\x3e\x8\x8\x0\x0\x0\x0\x0\x0\x0\x8\x8\x4\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x0\x40\x20\x10\x8\x4\x2\x1\x0" "\x3c\x42\x42\x5a\x42\x42\x3c\x0\x10\x18\x10\x10\x10\x10\x38\x0\x3c\x42\x40\x38\x4\x2\x7e\x0\x3c\x42\x40\x20\x40\x42\x3c\x0\x20\x30\x28\x24\x7e\x20\x20\x0\x7e\x2\x3e\x40\x40\x42\x3c\x0\x38\x44\x2\x3a\x46\x42\x3c\x0\x7e\x40\x20\x10\x10\x10\x10\x0" "\x3c\x42\x42\x3c\x42\x42\x3c\x0\x3c\x42\x42\x7c\x40\x42\x3c\x0\x0\x0\x18\x0\x0\x18\x0\x0\x0\x8\x8\x0\x0\x8\x8\x4\x20\x10\x8\x4\x8\x10\x20\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x4\x8\x10\x20\x10\x8\x4\x0\x3c\x42\x20\x10\x10\x0\x10\x0" "\x3c\x42\x5a\x5a\x32\x2\x7c\x0\x20\x30\x30\x28\xbc\x62\x31\x0\x3e\x44\x46\x3d\xc2\x62\x3f\x0\x38\x44\x6\x3\x82\x42\x3c\x0\x1e\x24\x46\x45\xc2\x62\x3f\x0\x38\x44\x2\x1d\xc2\x42\x3c\x0\x6c\x52\x41\x29\xb0\x50\x8\x0\x38\x44\x6\x73\xc2\x62\x5c\x0" "\x44\x44\x46\x3d\xa2\x62\x22\x0\x20\x18\x14\x13\x88\x48\x30\x0\x20\x30\x28\x35\xae\x62\x12\xc\x24\x14\xe\x7\x8a\x52\x22\x0\x10\xc\xa\x5\x84\x42\x3e\x0\x44\x64\x56\x2b\xaa\x61\x31\x0\x88\x8c\x4e\x55\xd4\x62\x22\x0\x78\x84\x86\x43\xc2\x62\x1c\x0" "\x3e\x44\x46\x23\x9f\x62\x2\x0\x78\x84\x86\x43\xd2\x62\x5c\x0\x3e\x44\x42\x3f\xa2\x61\x21\x0\x20\x20\x50\x48\xc5\x46\x39\x0\xc0\x3e\x9\x5\x82\x42\x3c\x0\x44\x44\x46\x43\xa2\x22\x1c\x0\x44\x44\x22\x63\x94\x14\x8\x0\x44\x44\x42\x23\xaa\x6a\x14\x0" "\x22\x26\x15\x9\x94\x62\x22\x0\x88\x44\x42\x43\xfc\x44\x42\x3c\x3c\x42\x41\x39\xe0\x5c\x42\x3c\x38\x8\x8\x8\x8\x8\x38\x0\x1\x2\x4\x8\x10\x20\x40\x0\x1c\x10\x10\x10\x10\x10\x1c\x0\x8\x14\x22\x41\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\x4\x4\x8\x0\x0\x0\x0\x0\x0\x0\x5c\x27\x92\x52\x2c\x0\x8\x4\x16\x2d\xa2\x52\x3c\x0\x0\x0\x3e\x25\x82\x42\x3c\x0\x80\x80\x5c\x67\xe2\x52\x4c\x0\x0\x0\x1c\x23\x9e\x42\x3c\x0\x30\x4c\x42\x71\xa8\x24\x14\x8\x0\x0\xbc\x47\xe2\x5c\x22\x1c" "\x8\xc\x36\x4d\xa4\x62\x32\x0\x0\x20\x0\x10\x99\x4e\x38\x0\x0\x40\x0\x70\xad\x72\x9\x7\x4\x4\x16\xb\x8e\x52\x32\x0\x20\x18\x14\xa\x89\x44\x38\x0\x0\x0\x2a\x57\xd2\x49\x29\x0\x0\x0\x34\x4f\xc4\x62\x22\x0\x0\x0\x3c\x47\xa2\x22\x1c\x0" "\x0\x0\x1a\x27\xa6\x5e\x2\x1\x0\x0\x5c\x23\xb2\x6c\x60\x20\x0\x0\x66\x59\xa0\x60\x30\x0\x0\x0\x30\x50\xcc\x43\x3c\x0\x20\x20\x7c\x13\x90\x48\x38\x0\x0\x0\x24\x27\x92\x52\x2c\x0\x0\x0\x26\x63\x92\xa\x4\x0\x0\x0\x46\x43\xaa\x2a\x14\x0" "\x0\x0\x22\x15\x88\x54\x22\x0\x0\x0\x44\x23\xa2\x7c\x22\x1c\x0\x0\x3c\x23\x98\x74\x12\xc\x20\x10\x10\x8\x10\x10\x20\x0\x8\x8\x8\x0\x8\x8\x8\x0\x4\x8\x8\x10\x8\x8\x4\x0\x24\x1a\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x41\x41\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x1e\x3f\x3f\x3f\x3f\x1e\x0\x0\x3c\x7e\x7e\x7e\x7e\x3c\x0\x0\x78\xfc\xfc\xfc\xfc\x78\x0\x0\xf0\xf8\xf8\xf8\xf8\xf0\x0\x0\xe0\xf0\xf0\xf0\xf0\xe0\x0" "\x0\xc0\xe0\xe0\xe0\xe0\xc0\x0\x0\x80\xc0\xc0\xc0\xc0\x80\x0\x0\x0\x80\x80\x80\x80\x0\x0\x0\x0\x1\x1\x1\x1\x0\x0\x0\x1\x3\x3\x3\x3\x1\x0\x0\x3\x7\x7\x7\x7\x3\x0\x0\x7\xf\xf\xf\xf\x7\x0\x0\xf\x1f\x1f\x1f\x1f\xf\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\xe7\x5a\x42\x42\xe7\x0\x0\x0\x18\x18\x0\x0\x0\x0\x1\x1\x2\x2\x2\x1\x1\x0\x9\x9\x12\x12\x12\x9\x9" "\x0\x49\x49\x92\x92\x92\x49\x49\x0\x2\x2\x4\x4\x4\x2\x2\x0\x12\x12\x24\x24\x24\x12\x12\x0\x92\x92\x24\x24\x24\x92\x92\x0\x0\x0\x1\x1\x1\x0\x0\x0\x4\x4\x9\x9\x9\x4\x4\x0\x24\x24\x49\x49\x49\x24\x24\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 32 FontEntry("SMALLCAP", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x3e\x7f\x6b\x5d\x63\x7f\x3e\x0\x63\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x8\x1c\x8\x77\x77\x8\x1c\x0\x1c\x3e\x7f\x7f\x36\x8\x1c\x0\x0\x18\x3c\x7e\x3c\x18\x0\x0" "\xff\xe7\xc3\x81\xc3\xe7\xff\xff\x0\x18\x3c\x66\x66\x3c\x18\x0\xff\xe7\xc3\x99\x99\xc3\xe7\xff\x78\x70\x78\x6c\x1e\x33\x33\x1e\x7e\xc3\xc3\x7e\x18\x7e\x18\x18\x78\x58\x78\x18\x18\xe\xf\x6\x7c\x7c\x6c\x6c\x6f\x66\x78\x30\xdb\x3c\x66\xe7\x66\x3c\xdb\x0" "\x1\x3\xf\x1f\xf\x3\x1\x0\x40\x60\x78\x7c\x78\x60\x40\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x0\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xde\xdc\xd8\xd8\xd8\x0\x3c\x66\x1c\x36\x36\x1c\x33\x1e\x0\x0\x0\x0\x7f\x7f\x7f\x0\x18\x3c\x7e\x18\x7e\x3c\x18\x7e" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x38\x7f\x38\x18\x0\x0\x0\xc\xe\x7f\xe\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x8\x1c\x3e\x3e\x7f\x0\x0\x0\x7f\x3e\x3e\x1c\x8\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x18\x3c\x3c\x18\x18\x0\x18\x0\x36\x36\x36\x0\x0\x0\x0\x0\x36\x36\x7f\x36\x7f\x36\x36\x0\x18\x7e\x3\x3e\x60\x3f\x18\x0\x0\x63\x30\x18\xc\x6\x63\x0\x1c\x36\x1c\x6e\x33\x33\x6e\x0\x18\x18\xc\x0\x0\x0\x0\x0" "\x18\xc\x6\x6\x6\xc\x18\x0\x6\xc\x18\x18\x18\xc\x6\x0\x0\x77\x3e\x7f\x3e\x77\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x18\xc\x0\x0\x0\x0\x7f\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1c\x1c\x0\x60\x30\x18\xc\x6\x3\x1\x0" "\x0\x0\x3c\x76\x66\x6e\x3c\x0\x0\x0\x18\x1c\x18\x18\x3c\x0\x0\x0\x3c\x66\x30\xc\x7e\x0\x0\x7e\x30\x38\x60\x60\x30\x1e\x0\x34\x36\x36\x33\x7f\x30\x0\x0\x7e\x2\x3e\x66\x60\x30\x1e\x38\xc\x6\x3e\x66\x66\x3c\x0\x0\x7e\x60\x30\x38\x18\xc\xc" "\x3c\x66\x66\x3c\x66\x66\x3c\x0\x0\x3c\x66\x66\x7c\x60\x30\x1c\x0\x38\x38\x0\x0\x38\x38\x0\x0\x18\x18\x0\x0\x18\x18\xc\x30\x18\xc\x6\xc\x18\x30\x0\x0\x0\x7f\x0\x0\x7f\x0\x0\x6\xc\x18\x30\x18\xc\x6\x0\x3e\x63\x60\x30\x18\x0\x18\x0" "\x3e\x63\x63\x7b\x3b\x3\x7e\x0\x1c\x36\x63\x63\x7f\x63\x63\x0\x3f\x66\x66\x3e\x66\x66\x3f\x0\x3c\x66\x3\x3\x3\x66\x3c\x0\x1f\x36\x66\x66\x66\x36\x1f\x0\x7f\x43\x3\x1f\x3\x43\x7f\x0\x7f\x46\x6\x3e\x6\x6\xf\x0\x3e\x63\x3\x3\x7b\x63\x3e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x3c\x18\x18\x18\x18\x18\x3c\x0\x3c\x18\x18\x18\x1b\x1b\xe\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x67\x6f\x7b\x73\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x63\x6b\x3e\x60\x3f\x63\x63\x3f\x1b\x33\x63\x0\x3e\x63\x3\x3e\x60\x63\x3e\x0\x7e\x5a\x18\x18\x18\x18\x3c\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x36\x1c\x8\x0\x63\x63\x6b\x6b\x7f\x77\x63\x0" "\x63\x36\x1c\x1c\x1c\x36\x63\x0\x66\x66\x66\x3c\x18\x18\x3c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x3e\x6\x6\x6\x6\x6\x3e\x0\x3\x6\xc\x18\x30\x60\x40\x0\x3e\x30\x30\x30\x30\x30\x3e\x0\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x63\x7f\x63\x63\x0\x0\x0\x3f\x66\x3e\x66\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x0\x0\x3f\x66\x66\x66\x3f\x0\x0\x0\x7f\x3\x1f\x3\x7f\x0\x0\x0\x7f\x3\x1f\x3\x3\x0\x0\x0\x7e\x3\x73\x63\x3e\x0" "\x0\x0\x63\x63\x7f\x63\x63\x0\x0\x0\x3c\x18\x18\x18\x3c\x0\x0\x0\x78\x30\x30\x33\x1e\x0\x0\x0\x63\x33\x1f\x33\x63\x0\x0\x0\x3\x3\x3\x3\x3f\x0\x0\x0\x63\x77\x6b\x6b\x63\x0\x0\x0\x67\x6f\x6b\x7b\x73\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x66\x3e\x6\xf\x0\x0\x0\x3e\x63\x63\x3b\x6e\x0\x0\x0\x3f\x66\x3e\x36\x67\x0\x0\x0\x3e\x3\x3e\x60\x3e\x0\x0\x0\x7e\x5a\x18\x18\x3c\x0\x0\x0\x63\x63\x63\x63\x3e\x0\x0\x0\x63\x63\x36\x1c\x8\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x66\x66\x3c\x18\x18\x0\x0\x0\x3f\x19\xc\x26\x3f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\xe\x18\x18\x70\x18\x18\xe\x0\x6e\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x1c\x36\x36\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x40\xaa\x4\x0\x0\x0\x0\x1e\x33\x2d\x2d\x33\x1e\x0\x0\x7e\x66\x5a\x5a\x66\x7e\x0\x0\xfc\x84\xb4\xb4\x84\xfc\x0\x0\xf8\x48\x18\x88\x28\xf8\x0\x0\xf0\x30\x10\x10\x30\xf0\x0" "\x0\xc0\x60\x20\x20\x60\xc0\x0\x0\x80\xc0\x40\xc0\xc0\x80\x0\x0\x0\x80\x80\x80\x80\x0\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x2\x2\x3\x3\x0\x0\x3\x6\x4\x4\x6\x3\x0\x0\x7\xd\xc\x8\xe\x7\x0\x0\xf\x19\x16\x16\x19\xf\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x3c\x7e\xff\x0\xff\xff\x0\x0\x0\x0\x18\x18\xff\xff\x0\x18\x3c\x7e\xff\x18\xff\xff\x0\x42\x66\x5a\x42\x42\x0\x0\x0\x18\x18\x0\x0\x0\x0\x0\x1\x3\x2\x3\x1\x0\x0\x0\x7\x9\x18\x9\x7\x0" "\x0\x1c\x63\xc1\x80\xc1\x63\x1c\x0\x0\x3\x5\x4\x5\x3\x0\x0\x0\x1f\x21\x10\x21\x1f\x0\x0\xfc\x7\xc1\x20\xc1\x7\xfc\x0\x0\x1\x2\x3\x2\x1\x0\x0\x7\xc\x9\x9\x9\xc\x7\x0\x1f\x70\xc1\x82\xc1\x70\x1f\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 33 FontEntry("THICK", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x81\x81\x42\x3c\x0\xff\xc3\xbd\x7e\x7e\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x20\x3f\x1f\x0\x30\x50\xb0\xd0\x9f\x8f\xf0\xf0\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\x1e\x1e\x1e\xc\x0\xc\x0\x33\x66\xcc\x0\x0\x0\x0\x0\x0\x6c\xfe\x6c\x6c\xfe\x6c\x0\x3e\x6b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x60\x30\x18\x0\x0\x0\x0\x0" "\x30\x18\x18\x18\x18\x18\x18\x30\x6\xc\xc\xc\xc\xc\xc\x6\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xc\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc\x0\x0\xc0\x60\x30\x18\xc\x6\x0" "\x3e\x73\x7b\x7f\x77\x73\x3e\x0\x38\x3c\x38\x38\x38\x38\x38\x0\x3e\x73\x70\x38\x1c\xe\x7f\x0\x3e\x73\x70\x3c\x70\x73\x3e\x0\x73\x73\x73\x73\x7f\x70\x70\x0\x7f\x7\x7\x3f\x70\x70\x3f\x0\x3e\x67\x7\x3f\x67\x67\x3e\x0\x7f\x60\x70\x38\x1c\x1c\x1c\x0" "\x3e\x67\x67\x3e\x67\x67\x3e\x0\x3e\x73\x73\x7e\x70\x70\x3f\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x6\x0\x0\x18\xc\x6\xc\x18\x0\x0\x0\x0\x7e\x0\x7e\x0\x0\x0\x0\xc\x18\x30\x18\xc\x0\x0\x3e\x63\x70\x38\x1c\x0\x1c\x0" "\x3e\x63\x7b\x7b\x3b\x3\x3e\x0\x3e\x67\x67\x67\x7f\x67\x67\x0\x3f\x67\x67\x3f\x67\x67\x3f\x0\x3e\x67\x7\x7\x67\x67\x3e\x0\x3f\x67\x67\x67\x67\x67\x3f\x0\x7f\x7\x7\x7f\x7\x7\x7f\x0\x7f\x7\x7\x7f\x7\x7\x7\x0\x3e\x67\x7\x77\x67\x67\x3e\x0" "\x67\x67\x67\x7f\x67\x67\x67\x0\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x0\x70\x70\x70\x70\x73\x73\x3e\x0\x67\x37\x1f\xf\x1f\x37\x67\x0\x7\x7\x7\x7\x7\x7\x7f\x0\x63\x77\x7f\x6b\x63\x63\x63\x0\x63\x67\x6f\x7f\x77\x67\x67\x0\x3e\x67\x67\x67\x67\x67\x3e\x0" "\x3f\x67\x67\x3f\x7\x7\x7\x0\x3e\x67\x67\x67\x67\x57\x2e\x40\x3f\x67\x67\x3f\x67\x67\x67\x0\x3e\x67\x7\x3e\x70\x73\x3e\x0\x7f\x1c\x1c\x1c\x1c\x1c\x1c\x0\x67\x67\x67\x67\x67\x67\x3e\x0\x67\x67\x67\x67\x67\x3e\x1c\x0\x63\x63\x63\x6b\x6b\x7f\x3f\x0" "\xc7\x6e\x3c\x18\x3c\x76\xe3\x0\x67\x67\x3e\x1c\x1c\x1c\x1c\x0\x7f\x70\x38\x1c\xe\x7\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x0\x6\xc\x18\x30\x60\xc0\x0\xe\xc\xc\xc\xc\xc\xc\xe\x18\x3c\x66\xc3\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\x18\x30\x0\x0\x0\x0\x0\x0\x0\x3e\x70\x7e\x73\x7e\x0\x3\x3\x3f\x67\x67\x67\x3f\x0\x0\x0\x3e\x67\x7\x67\x3e\x0\x60\x60\x7e\x73\x73\x73\x7e\x0\x0\x0\x3e\x67\x7f\x7\x7e\x0\x3c\xe\xe\x3f\xe\xe\xe\x0\x0\x0\x3e\x73\x73\x7e\x70\x3e" "\x3\x3\x3f\x67\x67\x67\x67\x0\x18\x0\x18\x1c\x1c\x1c\x1c\x0\x30\x0\x30\x38\x38\x38\x38\x1f\x3\x3\x33\x1b\xf\x1b\x33\x0\x18\x18\x1c\x1c\x1c\x1c\x1c\x0\x0\x0\x3f\x6b\x6b\x6b\x6b\x0\x0\x0\x3f\x67\x67\x67\x67\x0\x0\x0\x3e\x67\x67\x67\x3e\x0" "\x0\x0\x3f\x67\x67\x3f\x7\x7\x0\x0\x7e\x73\x73\x7e\x70\x70\x0\x0\x3f\x67\x7\x7\x7\x0\x0\x0\x7e\x7\x3e\x70\x3f\x0\x18\x18\x7e\x1c\x1c\x1c\x1c\x0\x0\x0\x67\x67\x67\x67\x7e\x0\x0\x0\x67\x67\x67\x36\x1c\x0\x0\x0\x6b\x6b\x6b\x6b\x3f\x0" "\x0\x0\x67\x3e\x1c\x3e\x73\x0\x0\x0\x73\x73\x73\x7e\x70\x3f\x0\x0\x7f\x38\x1c\xe\x7f\x0\x30\x18\x18\xc\x18\x18\x30\x0\x18\x18\x18\x18\x18\x18\x18\x18\x6\xc\xc\x18\xc\xc\x6\x0\xe\xdb\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x55\x0\x0\x0\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x0\x18\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x0\x1f\x18\x1f\x18\x18\x6c\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x6c\x6c\x6c\x7f\x0\x0\x0\x0\x18\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 34 FontEntry("TINY", 6, 5, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x28\xaf\xbc\x2\x0\x0\x0\x40\x4c\x44\x46\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe2\x8\x0\x0\x0\x0\x0\x0\x1e\x0\x0\x0\x0\x6\x40\x44\x44\x0\x44\x29\x45\x0\x31\x84\x10\x60\x90\x11\xe\x18" "\x64\x90\x1\x42\x39\x84\x80\x13\xe\x19\xc0\x84\x53\x6\x38\x44\x8\x1\x44\x11\x45\x0\x51\xc\x19\x0\xc\x30\x0\x0\x0\x0\x0\x88\x8\x82\x0\xf0\xc0\x3\x20\x8\x22\x2\x0\x0\x0\x0\x0\x0\x0\x0\x51\xca\x29\x60\x94\x51\x6\x30\x21\x4\x3\x46" "\x29\x65\x80\x13\x4e\x38\xe0\x84\x11\x2\x30\xe1\x14\x3\x4a\x39\xa5\x0\x21\x84\x10\x40\x8\x21\x6\x28\x65\x94\x2\x42\x8\xe1\x80\xf4\x52\x4a\x20\xad\xd5\x12\x10\xa5\x14\x1\x46\x39\x21\x0\x51\x4a\x71\x60\x94\x51\xa\x30\x41\x90\x1\x8e\x10\x42\x80\x52" "\x4a\x39\xa0\x94\x52\x4\x48\x29\xbd\x4\x4a\x11\xa5\x80\x52\x84\x10\xe0\x10\x11\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x88\x2\x0\x0\x0\x0\x0\x0\x0\x0\x0\x70\xd8\x7a\x0\x84\x51\x4\x0\x26\x4\x3\x10\x72\xc9\x1\x60\xd2\x71\x0\x30" "\x71\x4\x0\x6e\xb1\x1\x40\x38\xa5\x0\x20\x80\x10\x0\x8\x20\x6\x0\xa1\x8c\x2\x40\x8\xc1\x0\x90\x5e\x4a\x0\xb4\x95\x12\x0\xa2\x14\x1\xc0\x28\x23\x0\x70\xca\x21\x0\x94\x15\x2\x0\x26\x98\x1\x80\x38\xc2\x0\x50\x4a\x31\x0\x94\x52\x4\x0\x29" "\xbd\x4\x40\x11\xa5\x0\x50\x8a\x18\x0\x1c\x32\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x6a\x5\x0\x30\xcf\x0\xf0\x42\x78\x0\x3e\x0\x1f\x80\xf\xe1\x7\x0\x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x20\xc4\x11\x0\x88\x23\x4\x0\x0\x0\x0" ), // Font no. 35 FontEntry("TINY_UPPERCASE", 6, 5, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x28\xaf\xbc\x2\x0\x0\x0\x40\x4c\x44\x46\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xe2\x8\x0\x0\x0\x0\x0\x0\x1e\x0\x0\x0\x0\x6\x40\x44\x44\x0\x44\x29\x45\x0\x31\x84\x10\x60\x90\x11\xe\x18" "\x64\x90\x1\x42\x39\x84\x80\x13\xe\x19\xc0\x84\x53\x6\x38\x44\x8\x1\x44\x11\x45\x0\x51\xc\x19\x0\xc\x30\x0\x0\x0\x0\x0\x88\x8\x82\x0\xf0\xc0\x3\x20\x8\x22\x2\x0\x0\x0\x0\x0\x0\x0\x0\x51\xca\x29\x60\x94\x51\x6\x30\x21\x4\x3\x46" "\x29\x65\x80\x13\x4e\x38\xe0\x84\x11\x2\x30\xe1\x14\x3\x4a\x39\xa5\x0\x21\x84\x10\x40\x8\x21\x6\x28\x65\x94\x2\x42\x8\xe1\x80\xf4\x52\x4a\x20\xad\xd5\x12\x10\xa5\x14\x1\x46\x39\x21\x0\x51\x4a\x71\x60\x94\x51\xa\x30\x41\x90\x1\x8e\x10\x42\x80\x52" "\x4a\x39\xa0\x94\x52\x4\x48\x29\xbd\x4\x4a\x11\xa5\x80\x52\x84\x10\xe0\x10\x11\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x88\x2\x0\x0\x0\x0\x0\x0\x0\x0\x0\x51\xca\x29\x60\x94\x51\x6\x30\x21\x4\x3\x46\x29\x65\x80\x13\x4e\x38\xe0\x84" "\x11\x2\x30\xe1\x14\x3\x4a\x39\xa5\x0\x21\x84\x10\x40\x8\x21\x6\x28\x65\x94\x2\x42\x8\xe1\x80\xf4\x52\x4a\x20\xad\xd5\x12\x10\xa5\x14\x1\x46\x39\x21\x0\x51\x4a\x71\x60\x94\x51\xa\x30\x41\x90\x1\x8e\x10\x42\x80\x52\x4a\x39\xa0\x94\x52\x4\x48\x29" "\xbd\x4\x4a\x11\xa5\x80\x52\x84\x10\xe0\x10\x11\xe\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x6a\x5\x0\x30\xcf\x0\xf0\x42\x78\x0\x3e\x0\x1f\x80\xf\xe1\x7\x0\x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x20\xc4\x11\x0\x88\x23\x4\x0\x0\x0\x0" ), // Font no. 36 FontEntry("XTSAMP", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x20\x60\xff\xff\x60\x20\x0\x0\x4\x6\xff\xff\x6\x4\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x18\x3c\x7e\xff\x0\x0\x0\x0\x0\x0\xff\x7e\x3c\x18\x0\x4\xc\x1c\x3c\x3c\x1c\xc\x4\x20\x30\x38\x3c\x3c\x38\x30\x20\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x18\x18\x18\x18\x0\x18\x0\x0\x36\x12\x0\x0\x0\x0\x0\x0\x0\x24\x7e\x24\x7e\x24\x0\x0\x10\x78\x1c\x70\x3c\x10\x0\x0\x40\x66\x30\x18\xc\x66\x0\x0\x0\x1c\x36\x5c\x36\x5c\x0\x0\x18\x10\x0\x0\x0\x0\x0" "\x0\x18\xc\x6\x6\xc\x18\x0\x0\x18\x30\x60\x60\x30\x18\x0\x0\x0\x66\x3c\xff\x3c\x66\x0\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x18\x10\x0\x0\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x30\x0\x0\x40\x60\x30\x18\xc\x6\x0" "\x0\x3c\x66\x76\x6e\x66\x3c\x0\x0\x18\x1e\x18\x18\x18\x18\x0\x0\x3c\x66\x60\x30\x18\x7e\x0\x0\x3e\x60\x7e\x60\x60\x3e\x0\x0\x70\x78\x6c\x66\x7c\x60\x0\x0\x7e\x6\x3e\x60\x60\x3e\x0\x0\x7c\x6\x3e\x66\x66\x3c\x0\x0\x7e\x0\x30\x18\x18\x18\x0" "\x0\x3c\x66\x3c\x66\x66\x3c\x0\x0\x3c\x66\x66\x6c\x70\x1e\x0\x0\x0\x0\x18\x0\x0\x18\x0\x0\x0\x18\x0\x0\x18\x8\x0\x0\x30\x18\xc\x6\xc\x18\x0\x0\x0\x0\x3e\x0\x3e\x0\x0\x0\x6\xc\x18\x30\x18\xc\x0\x0\x3c\x60\x60\x38\x0\x18\x0" "\x0\x1c\x22\x32\x32\x2\x3c\x0\x0\x7c\xe\x66\x7e\x66\x66\x0\x0\x3c\x6\x66\x3e\x66\x3e\x0\x0\x7c\x0\x6\x6\xe\x7c\x0\x0\x3e\x70\x66\x66\x66\x3e\x0\x0\x7e\x0\x6\x36\x6\x7e\x0\x0\x7e\x0\x6\x76\x6\x6\x0\x0\x7c\xe\x6\x76\x66\x3c\x0" "\x0\x66\x66\x66\x76\x66\x66\x0\x0\x18\x18\x18\x18\x18\x18\x0\x0\x7e\x0\x60\x60\x70\x3e\x0\x0\x66\x66\x26\x1e\x76\x66\x0\x0\x6\x6\x6\x6\x0\x7e\x0\x0\x46\x6e\x7e\x36\x46\x66\x0\x0\x66\x6e\x5e\x3e\x76\x66\x0\x0\x3c\x70\x66\x66\x66\x3c\x0" "\x0\x3e\x60\x66\x36\x6\x6\x0\x0\x3c\x66\x66\x56\x36\x6c\x0\x0\x3e\x60\x66\x1e\x36\x66\x0\x0\x7c\x6\x6\x7c\x60\x3e\x0\x0\x7e\x0\x18\x18\x18\x18\x0\x0\x66\x66\x66\x66\x70\x3c\x0\x0\x66\x66\x66\x6e\x2c\x8\x0\x0\x46\x46\x56\x56\x56\x3c\x0" "\x0\x42\x66\x2c\x18\x66\x42\x0\x0\x66\x66\x34\x30\x18\x18\x0\x0\x7e\x0\x30\x18\xc\x7e\x0\x0\x3e\x6\x6\x6\x6\x3e\x0\x0\x2\x6\xc\x18\x30\x60\x0\x0\x78\x60\x60\x60\x60\x78\x0\x0\x18\x3c\x66\x42\x0\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x0" "\x0\xc\x18\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x6c\x66\x7c\x0\x0\x6\x6\x3e\x76\x66\x3e\x0\x0\x0\x0\x7c\xe\xe\x7c\x0\x0\x60\x60\x7c\x6e\x66\x7c\x0\x0\x0\x3e\x66\x76\x6\x7c\x0\x0\x78\x1c\xc\x3e\xc\xc\x0\x0\x0\x7c\x66\x7c\x60\x3c\x0" "\x0\x6\x6\x3e\x76\x66\x66\x0\x0\x0\x18\x0\x18\x18\x18\x0\x0\x18\x0\x18\x18\x18\xe\x0\x0\x6\x6\x36\x1e\x36\x66\x0\x0\x18\x18\x18\x18\x18\x18\x0\x0\x0\x0\x7f\xd6\xd6\xd6\x0\x0\x0\x0\x3f\x76\x66\x66\x0\x0\x0\x0\x3c\x66\x66\x3c\x0" "\x0\x0\x0\x3f\x66\x3e\x6\x0\x0\x0\x0\xfc\x66\x7c\x60\x0\x0\x0\x0\x78\x1c\xc\xc\x0\x0\x0\x0\x3c\xe\x78\x3e\x0\x0\xc\xc\xc\x1e\xc\xc\x0\x0\x0\x0\x0\x66\x66\x3e\x0\x0\x0\x0\x0\x66\x3c\x18\x0\x0\x0\x0\x56\x56\x7e\x6c\x0" "\x0\x0\x0\x0\x66\x3c\x66\x0\x0\x0\x0\x6c\x7c\x60\x3c\x0\x0\x0\x0\x7e\x30\x18\x7e\x0\x0\x30\x18\x18\x4\x18\x30\x0\x0\x18\x18\x18\x0\x18\x18\x0\x0\xc\x18\x18\x20\x18\xc\x0\x0\x0\x6c\x36\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x6c\x0\x3e\x6c\x66\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x66\x0\x7c\x6\x7e\x66\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x66\x0\x3c\x66\x66\x1c\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x66\x18\x6e\x66\x66\x3c\x0\x0\x66\x0\x66\x66\x66\x3c\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x3e\x3e\x3e\x3e\x3e\x3e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 37 FontEntry("ZERO", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xff\xc3\xe7\x7e\x0\x77\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x18\x3c\x18\xff\xff\x52\x18\x0\x8\x1c\x3e\x7f\x7f\x49\x1c\x0\x0\x0\x18\x3c\x18\x0\x0\x0" "\xff\xff\xe7\xc3\xe7\xff\xff\xff\x0\x3c\x42\x42\x42\x42\x3c\x0\xff\xc3\xbd\xbd\xbd\xbd\xc3\xff\xf8\xe0\xb0\x3e\x63\x63\x3e\x0\x0\x7e\xc3\xc3\x7e\x18\x7e\x18\x20\x60\xe0\x20\x2e\x3f\x1f\xe\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x81\xc2\xbc\xe4\xa4\xfc\xea\xff" "\x0\x0\x6\x1e\x7e\x1e\x6\x0\x0\x0\x60\x78\x7e\x78\x60\x0\x18\x7e\x18\x18\x18\x18\x7e\x18\x66\x66\x66\x66\x66\x0\x66\x0\xff\x6d\x6e\x6c\x6c\x6c\x6c\x0\x7e\x81\x3e\x42\x42\x7c\x81\x7e\x0\x0\x0\x7e\x7e\x0\x0\x0\x18\x7e\x18\x18\x7e\x18\x0\xff" "\x18\x7e\x18\x18\x18\x18\x18\x0\x18\x18\x18\x18\x18\x7e\x18\x0\x0\x20\x60\xff\x60\x20\x0\x0\x0\x4\x6\xff\x6\x4\x0\x0\x0\x0\x0\x3\x3\x3\xff\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x0\x8\x1c\x3e\x7f\x0\x0\x0\x0\x0\x7f\x3e\x1c\x8\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\xc\xc\xc\xc\xc\x0\xc\x0\x66\x66\x0\x0\x0\x0\x0\x0\xa\x1f\xa\x1f\xa\x0\x0\x0\x3e\x4b\xb\x3e\x68\x6b\x3e\x8\xc7\x65\x37\x18\xec\xa6\xe3\x0\x1c\x32\x1c\xa2\x63\x73\x5e\x80\x30\x30\x18\x0\x0\x0\x0\x0" "\x8\x6\x3\x3\x3\x6\x8\x0\x8\x30\x60\x60\x60\x30\x8\x0\x8\x2a\x1c\x7f\x1c\x2a\x8\x0\x0\x18\x18\x7e\x18\x18\x0\x0\x0\x0\x0\x0\x0\x0\x18\xe\x0\x0\x0\x7e\x0\x0\x0\x0\x0\x0\x0\x0\x0\x60\x60\x0\x80\xc0\x60\x30\x18\xc\x6\x3" "\x0\x18\x24\x24\x24\x24\x18\x0\x18\x1c\x1e\x18\x18\x18\x3e\x0\x3e\x63\x60\x30\xc\x6\x7f\x0\x3e\x63\x60\x3c\x60\x63\x3e\x0\x70\x78\x6c\x66\x7f\x60\x60\x0\x7f\x3\x3\x3f\x60\x60\x3f\x0\x3e\x63\x3\x3f\x63\x63\x3e\x0\x7f\x60\x30\x18\xc\xc\xc\x0" "\x3e\x63\x63\x3e\x63\x63\x3e\x0\x3e\x63\x63\x7e\x60\x63\x3e\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x0\x0\x0\xc\x4\x2\x80\xc0\x60\x30\x30\x60\xc0\x80\x0\x0\x7e\x0\x7e\x0\x0\x0\x3\x6\xc\x18\x18\xc\x6\x3\x3e\x63\x30\x18\xc\x0\xc\x0" "\x3e\x41\x5d\x55\x7d\x1\x3e\x0\x8\x1c\x36\x63\x63\x7f\x63\x41\x3f\x61\x63\x3f\x63\x63\x3f\x0\x3e\x61\x3\x3\x43\x63\x3e\x0\x1f\x31\x63\x63\x63\x33\x1f\x0\x7f\x1\x3\x1f\x3\x3\x7f\x0\x7f\x41\x3\x1f\x13\x3\x3\x0\x3e\x61\x3\x7b\x43\x63\x5e\x0" "\x63\x63\x63\x7f\x63\x63\x63\x0\x7e\x18\x18\x18\x18\x18\x7e\x0\x78\x30\x30\x30\x30\x33\x1e\x0\x63\x33\x1b\xf\x1b\x33\x63\x0\xf\x6\x6\x6\x6\x46\x7f\x0\x63\x77\x7f\x6b\x6b\x63\x63\x0\x63\x67\x6f\x7b\x73\x63\x63\x0\x3e\x63\x63\x63\x63\x63\x3e\x0" "\x3f\x66\x66\x3e\x6\x6\xf\x0\x3e\x63\x63\x63\x7b\x33\x3e\x60\x3f\x66\x66\x3e\x66\x66\x67\xc0\x3e\x43\x3\x3e\x60\x63\x3e\x0\x7e\x18\x18\x18\x18\x18\x18\x0\x63\x63\x63\x63\x63\x63\x3e\x0\x63\x63\x63\x63\x63\x36\x1c\x0\x63\x63\x6b\x6b\x6b\x77\x63\x0" "\x63\x36\x1c\x8\x1c\x36\x63\x0\x41\x63\x36\x1c\x8\x8\x1c\x0\x7f\x61\x30\x18\xc\x46\x7f\x0\x38\x18\x18\x18\x18\x18\x18\x38\x3\x6\xc\x18\x30\x60\xc0\x80\xe\xc\xc\xc\xc\xc\xc\xe\x8\x1c\x36\x63\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xff" "\xc\xc\x18\x0\x0\x0\x0\x0\x0\x0\x3e\x60\x7e\x63\x7e\x0\x3\x3\x3f\x63\x63\x63\x3f\x0\x0\x0\x3e\x63\x3\x63\x3e\x0\x60\x60\x7e\x63\x63\x63\x7e\x0\x0\x0\x3e\x63\x7f\x3\x3e\x0\x3c\x66\x6\x3f\x6\x6\x6\x0\x0\x0\xbe\x63\x63\x7e\x60\x3e" "\x3\x3\x3f\x63\x63\x63\x63\x0\x18\x0\x1c\x18\x18\x18\x3c\x0\x30\x0\x38\x30\x30\x30\x33\x1e\x3\x3\x63\x1b\xf\x1b\x63\x0\x1c\x18\x18\x18\x18\x18\x38\x0\x0\x0\x63\x7f\x6b\x6b\x63\x0\x0\x0\x3f\x63\x63\x63\x63\x0\x0\x0\x3e\x63\x63\x63\x3e\x0" "\x0\x0\x3f\x63\x63\x3f\x3\x3\x0\x0\x7e\x63\x63\x7e\x60\xe0\x0\x0\x7b\x6e\x66\x6\x6\x0\x0\x0\x7e\x3\x3e\x60\x3f\x0\x18\x18\x7e\x18\x18\x18\x78\x0\x0\x0\x63\x63\x63\x63\x7e\x0\x0\x0\x63\x63\x63\x36\x1c\x0\x0\x0\x63\x6b\x6b\x77\x63\x0" "\x0\x0\x63\x36\x1c\x36\x63\x0\x0\x0\x63\x63\x63\x7e\x60\x3f\x0\x0\x7f\x30\x8\x46\x7f\x0\x70\x18\x18\xe\x18\x18\x70\x0\x18\x18\x18\x0\x18\x18\x18\x0\x7\xc\xc\x38\xc\xc\x7\x0\xe\xd9\x70\x0\x0\x0\x0\x0\x0\x0\x8\x14\x22\x7f\x0\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x55\xaa\xff\x0\xff\xaa\x55\x0\x0\x3f\x3f\x3f\x3f\x3f\x3f\x0\x0\x7e\x7e\x7e\x7e\x7e\x7e\x0\x0\xfc\xfc\xfc\xfc\xfc\xfc\x0\x0\xf8\xf8\xf8\xf8\xf8\xf8\x0\x0\xf0\xf0\xf0\xf0\xf0\xf0\x0" "\x0\xe0\xe0\xe0\xe0\xe0\xe0\x0\x0\xc0\xc0\xc0\xc0\xc0\xc0\x0\x0\x80\x80\x80\x80\x80\x80\x0\x0\x1\x1\x1\x1\x1\x1\x0\x0\x3\x3\x3\x3\x3\x3\x0\x0\x7\x7\x7\x7\x7\x7\x0\x0\xf\xf\xf\xf\xf\xf\x0\x0\x1f\x1f\x1f\x1f\x1f\x1f\x0" "\x55\x6b\x55\x6b\x55\x6b\x55\x6b\xff\xff\x0\x0\x0\x8\x1c\x3e\xff\xff\x0\x0\x0\x0\x0\x7f\xff\xff\x0\x0\x8\x1c\x3e\x7f\xff\xff\x0\xc3\xe7\xff\xdb\xc3\x0\x0\x0\x8\x0\x0\x0\x0\x0\x3\x3\x3\x3\x3\x3\x3\x0\x1b\x1b\x1b\x1b\x1b\x1b\x1b" "\x0\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0\x6\x6\x6\x6\x6\x6\x6\x0\x36\x36\x36\x36\x36\x36\x36\x0\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x0\x1\x1\x1\x1\x1\x1\x1\x0\xd\xd\xd\xd\xd\xd\xd\x0\x6d\x6d\x6d\x6d\x6d\x6d\x6d\x8\x10\x18\xbe\x7d\x18\x8\x10" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18\x18" "\x18\x18\x18\xf8\x0\x0\x0\x0\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x6c\x6c\x6c\xec\x6c\x6c\x6c\x6c" "\x6c\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x0\x0\x0\xff\x0\xff\x0\x0\x6c\x6c\x6c\xef\x0\xef\x6c\x6c\x18\x18\x18\xff\x0\xff\x0\x0" "\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x0\x18\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c\x6c" "\x18\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\xee\x19\x19\xee\x0\x0\x38\x6c\x66\x3f\x63\x63\x3f\x3\x7f\x46\x6\x6\x6\x6\x6\x0\x0\x0\xff\x66\x66\x66\x66\x0\x7f\x46\xc\x18\xc\x46\x7f\x0\x0\x0\xfc\x66\x63\x33\x1e\x0\x0\x0\xcc\xcc\xcc\x7c\xc\xf\x0\x0\xff\x18\x18\x18\x18\x0" "\x3c\x18\x3c\x66\x66\x3c\x18\x3c\x0\x3e\x63\x7f\x63\x3e\x0\x0\x0\x7e\xc3\xc3\xc3\x66\xe7\x0\x78\x98\x3c\x66\x63\x33\x1e\x0\x0\x0\x66\x99\x99\x66\x0\x0\x0\xc0\x3e\x73\x67\x3e\x3\x0\x0\x7c\x3\x7f\x3\x7c\x0\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), // Font no. 38 FontEntry("ZIRCFONT", 8, 8, "\x0\x0\x0\x0\x0\x0\x0\x0\x7e\x81\xa5\x81\xbd\x99\x81\x7e\x7e\xff\xdb\xff\xc3\xe7\xff\x7e\x36\x7f\x7f\x7f\x3e\x1c\x8\x0\x8\x1c\x3e\x7f\x3e\x1c\x8\x0\x1c\x3e\x1c\x7f\x7f\x49\x8\x3e\x0\x8\x1c\x3e\x7f\x3e\x1c\x3e\x0\x0\x18\x3c\x3c\x18\x0\x0" "\xff\xff\xe7\xc3\xc3\xe7\xff\xff\x0\x3c\x66\x42\x42\x66\x3c\x0\xff\xc3\x99\xbd\xbd\x99\xc3\xff\xf0\xe0\xf0\xbe\x33\x33\x33\x1e\x3c\x66\x66\x66\x3c\x18\x7e\x18\xfc\xcc\xfc\xc\xc\xe\xf\x7\xfe\xc6\xfe\xc6\xc6\xe6\x67\x3\x99\x5a\x3c\xe7\xe7\x3c\x5a\x99" "\x1\x7\x1f\x7f\x1f\x7\x1\x0\x40\x70\x7c\x7f\x7c\x70\x40\x0\x18\x3c\x7e\x18\x18\x7e\x3c\x18\x66\x66\x66\x66\x66\x0\x66\x0\xfe\xdb\xdb\xde\xd8\xd8\xd8\x0\x7c\xc6\x1c\x36\x36\x1c\x61\x3f\x0\x0\x0\x0\x7e\x7e\x7e\x0\x18\x3c\x7e\x18\x7e\x3c\x18\xff" "\x18\x3c\x7e\x18\x18\x18\x18\x0\x18\x18\x18\x18\x7e\x3c\x18\x0\x0\x18\x30\x7f\x30\x18\x0\x0\x0\xc\x6\x7f\x6\xc\x0\x0\x0\x0\x3\x3\x3\x7f\x0\x0\x0\x24\x66\xff\x66\x24\x0\x0\x0\x18\x3c\x7e\xff\xff\x0\x0\x0\xff\xff\x7e\x3c\x18\x0\x0" "\x0\x0\x0\x0\x0\x0\x0\x0\x10\x18\x18\x18\x8\x0\x18\x0\x22\x36\x34\x0\x0\x0\x0\x0\x0\x44\x7f\x64\x27\x7e\x22\x0\x10\x7e\x19\x3e\x6c\x3f\x4\x0\x0\x41\x63\x30\xc\x46\x63\x0\x1c\x26\x36\x1c\x7e\x19\x27\x0\x8\xc\x6\x0\x0\x0\x0\x0" "\x18\xc\x6\x2\x6\xc\x38\x0\xe\x18\x30\x20\x30\x18\xc\x0\x0\x4\x6c\x1f\x78\x16\x33\x0\x0\x8\x18\x78\x1e\x18\x10\x0\x0\x0\x0\x0\x0\x10\x18\xc\x0\x0\x0\x7c\x1f\x0\x0\x0\x0\x0\x0\x0\x0\x18\x10\x0\x60\x30\x10\x8\xc\x6\x3\x0" "\x1e\x30\x69\x4d\x67\x33\x1e\x0\x8\xc\x8\x8\x8\x3c\xe\x0\x3e\x67\x60\x38\xc\x76\x1f\x0\x7e\x60\x38\x6c\x41\x63\x3e\x0\x24\x26\x36\x32\x7f\x10\x10\x0\x3f\x1\x3f\x63\x40\x73\x3e\x0\x3c\x6\x3\x3b\x67\x66\x3c\x0\x3e\x67\x20\x30\x18\x18\x8\x0" "\x4e\x62\x36\x1c\x36\x33\x1e\x0\x5e\x63\x61\x73\x6c\x20\x20\x0\x0\x10\x18\x0\x0\x18\x8\x0\x0\x8\x18\x0\x0\x10\x18\xc\x18\xc\x6\x3\x6\x1c\x30\x0\x0\x0\x7e\x0\x1e\x78\x0\x0\x6\x1c\x30\x60\x30\x18\xc\x0\x3c\x66\x22\x30\x18\x0\x18\x0" "\x3c\x42\x79\x65\x79\x3\x3e\x0\x8\x8\x1c\x14\x3e\x63\xc1\x0\x3e\x63\x64\x3c\x64\x66\x3f\x0\x7c\xe\x3\x3\x43\x63\x3e\x0\x3e\x63\x40\x44\x64\x36\x1f\x0\x7c\x6\x2\x3f\x2\x6\x7c\x0\x7a\xf\x2\x1e\x7\x6\x6\x0\x1c\x32\x3\x39\x63\x66\x3c\x0" "\x20\x21\x21\x7f\x33\x22\x22\x0\x3c\x10\x18\x18\x18\x8\x3c\x0\x7c\x20\x20\x60\x60\x67\x3c\x0\x62\x32\x1a\xe\x1e\x33\x42\x0\x2\x2\x3\x3\x2\x7a\x3f\x0\x23\x37\x7d\x69\x49\x41\x41\x0\x21\x23\x63\x67\x65\x4d\x79\x0\x3c\xe\x43\x41\x63\x36\x1c\x0" "\x3e\x43\x64\x3e\x6\x6\x2\x0\x1e\x32\x60\x6d\x31\x3b\x6e\x0\x3e\x43\x64\x3e\xe\x36\x62\x0\x3c\x46\x2\x1c\x70\x61\x3e\x0\x78\x1f\x8\xc\xc\x4\x4\x0\x43\x43\x43\x61\x61\x33\x1e\x0\x41\x43\x62\x26\x24\x1c\x18\x0\x41\x41\x69\x6b\x2b\x3f\x36\x0" "\x1\x62\x36\x1c\x1c\x36\x63\x0\x41\x62\x66\x3c\x18\xc\x6\x0\x3f\x30\x18\x8\xc\x66\x3e\x0\x3e\x2\x6\x6\x6\x4\x1c\x0\x2\x6\xc\x8\x18\x30\x60\x0\x3c\x20\x30\x30\x30\x10\x1e\x0\x8\x3c\x66\x41\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xf8\x1f" "\x4\xc\x18\x0\x0\x0\x0\x0\x0\x0\x2c\x32\x61\x63\x5e\x0\x2\x2\x3b\x67\x43\x61\x3d\x0\x0\x0\x3c\x6\x3\x71\x3e\x0\x20\x20\x6e\x73\x61\x43\x5e\x0\x0\x0\x3e\x33\x1b\x6\x7c\x0\x38\xc\x4\x3c\xe\x8\x8\x0\x0\x0\x5e\x63\x61\x6e\x20\x1e" "\x1\x1\x1b\x37\x63\x42\x42\x0\x0\x10\x0\x10\x18\x18\x8\x0\x0\x8\x0\x8\x18\x18\x10\xe\x2\x2\x23\x1b\xf\x11\x21\x0\x8\x8\x18\x18\x18\x10\x10\x0\x0\x0\x35\x7f\x4b\x49\x49\x0\x0\x0\xd\x1b\x31\x31\x21\x0\x0\x0\x1e\x21\x63\x66\x3c\x0" "\x0\x0\x39\x4d\x67\x3b\x2\x2\x0\x0\x2e\x39\x33\x3e\x10\x10\x0\x0\x19\x37\x3\x2\x2\x0\x0\x0\x1e\x7\x3c\x60\x3e\x0\x10\x10\x7e\x18\x18\x8\x8\x0\x0\x0\x44\x46\x66\x72\x4c\x0\x0\x0\x61\x33\x16\x1c\x8\x0\x0\x0\x42\x43\x6b\x69\x36\x0" "\x0\x0\x31\x1e\xc\x16\x23\x0\x0\x0\x43\x26\x3c\x18\xc\x3\x0\x0\x3c\x33\x8\x6\x3f\x0\x18\xc\x4\x3\x4\xc\x38\x0\x8\x18\x8\x10\x18\x18\x10\x0\xe\x10\x10\x60\x10\x18\xe\x0\x4c\x3b\x0\x0\x0\x0\x0\x0\x0\x8\x1c\x36\x63\x63\x7f\x0" "\xff\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\x1\x80\x80\x80\x80\x80\x80\x80\x80\x1\x1\x1\x1\x1\x1\x1\xff\x0\x0\x0\x0\x0\x0\x0\xff\x80\x80\x80\x80\x80\x80\x80\xff" "\x1\x0\x0\x0\x0\x0\x0\x0\x80\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x0\x0\x0\x0\x80\x1\x3\x7\xf\x1f\x3f\x7f\xff\xff\xfe\xfc\xf8\xf0\xe0\xc0\x80\xff\xff\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0" "\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\x3\x3\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x3\x3\x3\x3\x3\x3\xff\xff\x0\x0\x0\x0\x0\x0\xff\xff\xc0\xc0\xc0\xc0\xc0\xc0\xff\xff\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x0\x0\x0" "\x0\x0\x0\x0\x0\x0\x3\x3\x0\x0\x0\x0\x0\x0\xc0\xc0\x0\x0\x0\x41\x14\x0\x0\x0\x0\x18\x19\xf\x3c\x36\x6\x0\x0\x42\x76\x1c\x3c\x66\x43\x0\x0\x18\xd8\xf0\x3c\x6e\x60\x0\x0\x60\x60\xf8\xfc\x60\x40\x0\x0\x80\x98\xf0\xc0\x60\x60\x0" "\x0\x20\x60\xc0\xc0\x60\x30\x0\x0\x80\x80\x0\xc0\xe0\x0\x0\x0\x0\x0\x80\xc0\x0\x0\x0\x0\x0\x0\x3\x1\x0\x0\x0\x0\x1\x1\x0\x3\x3\x0\x0\x0\x4\x7\x1\x3\x6\x4\x0\x0\x1\x1d\xf\x3\x6\x6\x0\x0\x6\x6\x3f\x1f\x6\x4\x0" "\x7e\x7e\x7e\x7e\x7e\x7e\x7e\x7e\xff\xff\x0\x18\x24\x42\x3c\x0\xff\xff\x0\x18\x24\x42\x5a\x0\xff\xff\x0\x18\x3c\x7e\x3c\x0\xff\xff\x0\xe7\x5a\x42\x42\xe7\x0\x0\x0\x18\x18\x0\x0\x0\x0\x2\x3\x3\x2\x3\x1\x0\x0\x2\x3\x13\x3a\x1b\x11\x10" "\x0\x32\x33\x13\x3a\x1b\x11\x10\x1\x3\x1\x3\x6\x6\x0\x0\x1\x3\x1\x43\x26\x66\x30\x10\x1\x33\x71\x63\x26\x66\x30\x10\x0\x2\x3\x1\x0\x0\x0\x0\x0\x2\x33\x31\x6\x7\x3\x2\x20\x62\x73\x31\x26\x67\x63\x2\x0\x0\x18\x3c\x3c\x18\x0\x0" "\x0\x0\x1f\x18\x1f\x18\x18\x18\x6c\x6c\x6f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x6c\x0\x0\x7f\x60\x6f\x6c\x6c\x6c\x6c\x6c\x6f\x60\x7f\x0\x0\x0\x6c\x6c\x6c\x6c\x7f\x0\x0\x0\x18\x18\x1f\x18\x1f\x0\x0\x0\x0\x0\x0\x0\x1f\x18\x18\x18" "\x18\x18\x18\x18\xf8\x0\x0\x0\x18\x18\x18\x18\xff\x0\x0\x0\x0\x0\x0\x0\xff\x18\x18\x18\x18\x18\x18\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xff\x0\x0\x0\x18\x18\x18\x18\xff\x18\x18\x18\x18\x18\xf8\x18\xf8\x18\x18\x18\x6c\x6c\x6c\x6c\xec\x6c\x6c\x6c" "\x6c\x6c\xec\xc\xfc\x0\x0\x0\x0\x0\xfc\xc\xec\x6c\x6c\x6c\x6c\x6c\xef\x0\xff\x0\x0\x0\x0\x0\xff\x0\xef\x6c\x6c\x6c\x6c\x6c\xec\xc\xec\x6c\x6c\x6c\x0\x0\xff\x0\xff\x0\x0\x0\x6c\x6c\xef\x0\xef\x6c\x6c\x6c\x18\x18\xff\x0\xff\x0\x0\x0" "\x6c\x6c\x6c\x6c\xff\x0\x0\x0\x0\x0\xff\x0\xff\x18\x18\x18\x0\x0\x0\x0\xff\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xfc\x0\x0\x0\x18\x18\xf8\x18\xf8\x0\x0\x0\x0\x0\xf8\x18\xf8\x18\x18\x18\x0\x0\x0\x0\xfc\x6c\x6c\x6c\x6c\x6c\x6c\x6c\xff\x6c\x6c\x6c" "\x18\x18\xff\x18\xff\x18\x18\x18\x18\x18\x18\x18\x1f\x0\x0\x0\x0\x0\x0\x0\xf8\x18\x18\x18\xff\xff\xff\xff\xff\xff\xff\xff\x0\x0\x0\x0\xff\xff\xff\xff\xf\xf\xf\xf\xf\xf\xf\xf\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xff\xff\xff\xff\x0\x0\x0\x0" "\x0\x0\x6e\x3b\x13\x3b\x6e\x0\x0\x1e\x33\x1f\x33\x1f\x3\x3\x0\x3f\x33\x3\x3\x3\x3\x0\x0\x0\x7f\x36\x36\x36\x36\x0\x3f\x33\x6\xc\x6\x33\x3f\x0\x0\x0\x7e\x1b\x1b\x1b\xe\x0\x0\x66\x66\x66\x66\x3e\x6\x3\x0\x6e\x3b\x18\x18\x18\x18\x0" "\x3f\xc\x1e\x33\x33\x1e\xc\x3f\x1c\x36\x63\x7f\x63\x36\x1c\x0\x1c\x36\x63\x63\x36\x36\x77\x0\x38\xc\x18\x3e\x33\x33\x1e\x0\x0\x0\x7e\xdb\xdb\x7e\x0\x0\x60\x30\x7e\xdb\xdb\x7e\x6\x3\x1c\x6\x3\x1f\x3\x6\x1c\x0\x0\x0\x0\x0\x0\xdb\xdb\x0" "\x0\x7e\x0\x7e\x0\x7e\x0\x0\x0\xf8\x8\x8\x8\x8\xf8\x0\x0\xff\x0\x0\x0\x0\xff\x0\x0\x1f\x10\x10\x10\x10\x1f\x0\x0\x0\x0\x8\x0\x0\x0\x0\x0\x0\x0\x2\x1\x0\x0\x0\x20\x30\x28\x24\x22\xa1\x60\x20\x0\x0\x0\x1\x2\x0\x0\x0" "\x20\x60\xa1\x22\x24\x28\x30\x20\x0\x0\x0\x40\x40\x40\x40\x7f\xff\x81\x81\x81\x81\x80\x80\x80\x0\x0\x0\x20\x20\x11\x11\xe\x38\x44\x44\x82\x82\x0\x0\x0\x0\x0\xfe\x7c\x38\x10\x0\x0\x0\x0\x10\x38\x7c\xfe\x0\x0\x80\xc1\x63\x36\x1c\x8\x0\x0" ), }; const unsigned int numFontsEntries = 39; PPFont* PPFont::fontInstances[MAXFONTS]; pp_uint32 PPFont::numFontInstances = 0; pp_uint8 PPFont::bigFont[256*16*16/8]; PPFont::FontFamilyDescription PPFont::fontFamilyDescriptions[FONT_LAST] = { FontFamilyDescription(PPSize(6,5), "Tiny (6x5)", "FONT_TINY", 35, 35, -1), FontFamilyDescription(PPSize(8,8), "System (8x8)", "FONT_SYSTEM", 23, 23, -1), FontFamilyDescription(PPSize(12,12), "Large (12x12)", "FONT_LARGE", 1, 1, -1), FontFamilyDescription(PPSize(16,16), "Huge (16x16)", "FONT_HUGE", 23, 23, -1) }; pp_int32 PPFont::enumerationIndex = -1; void PPFont::createLargeFromSystem(pp_uint32 index) { Bitstream bitstream(bigFont, (16*16*256)/8); bitstream.clear(); Bitstream stream2((pp_uint8*)fontEntries[index].data, (8*8*256)/8); for (pp_int32 k = 0; k < 256; k++) for (pp_int32 j = 0; j < 16; j++) for (pp_int32 i = 0; i < 16; i++) { pp_int32 srcOffset = ((j>>1)*8+(i>>1))+(8*8*k); pp_int32 dstOffset = (j*16+i)+(16*16*k); if (stream2.read(srcOffset)) { bitstream.write(dstOffset, 1); } } } PPFont::PPFont(pp_uint8* bits, const pp_uint32 chrWidth, const pp_uint32 chrHeight, pp_uint32 fontId) : charWidth(chrWidth), charHeight(chrHeight), charDim(chrHeight*chrWidth) { fontBits = bits; bitstream = new Bitstream(fontBits, 0); this->fontId = fontId; fontInstances[numFontInstances++] = this; } PPFont::~PPFont() { delete bitstream; } PPFont* PPFont::getFont(pp_uint32 fontId) { pp_uint32 i; for (i = 0; i < numFontInstances; i++) if (fontInstances[i]->fontId == fontId) return fontInstances[i]; if (numFontInstances >= MAXFONTS) return NULL; pp_uint32 index = fontFamilyDescriptions[fontId].fontEntryIndex; switch (fontId) { case FONT_TINY: { return new PPFont((pp_uint8*)fontEntries[index].data, 5, 6, fontId); } case FONT_SYSTEM: { return new PPFont((pp_uint8*)fontEntries[index].data, 8, 8, fontId); } case FONT_LARGE: { return new PPFont((pp_uint8*)fontEntries[index].data, 12, 12, fontId); } case FONT_HUGE: { createLargeFromSystem(index); return new PPFont(bigFont, 16, 16, fontId); break; } } return NULL; } pp_uint32 PPFont::getStrWidth(const char* str) const { if (str == NULL) return 0; return strlen(str)*getCharWidth(); } const char* PPFont::getFamilyInternalName(FontID fontID) { if (fontID >= FONT_LAST) return NULL; return fontFamilyDescriptions[fontID].internalName; } const char* PPFont::getFirstFontFamilyName() { enumerationIndex = FONT_TINY; if (enumerationIndex < FONT_LAST) return fontFamilyDescriptions[enumerationIndex].name; else return NULL; } const char* PPFont::getNextFontFamilyName() { enumerationIndex++; if (enumerationIndex >= FONT_LAST) { enumerationIndex = -1; return NULL; } return fontFamilyDescriptions[enumerationIndex].name; } const char* PPFont::getFirstFontEntryName(FontID fontID) { if (fontID >= FONT_LAST) return NULL; FontFamilyDescription* desc = &fontFamilyDescriptions[fontID]; PPSize size = desc->size; if (fontID == FONT_HUGE) { size.width >>= 1; size.height >>= 1; } pp_int32 i = 0; bool found = false; for (i = 0; i < (signed)numFontsEntries && !found; i++) if (size.match(fontEntries[i].width, fontEntries[i].height)) found = true; if (found) { desc->enumerationIndex = i-1; return fontEntries[i-1].name; } return NULL; } const char* PPFont::getNextFontEntryName(FontID fontID) { if (fontID >= FONT_LAST) return NULL; FontFamilyDescription* desc = &fontFamilyDescriptions[fontID]; PPSize size = desc->size; if (fontID == FONT_HUGE) { size.width >>= 1; size.height >>= 1; } pp_int32 i = desc->enumerationIndex+1; bool found = false; for (i = desc->enumerationIndex+1; i < (signed)numFontsEntries && !found; i++) if (size.match(fontEntries[i].width, fontEntries[i].height)) found = true; if (found) { desc->enumerationIndex = i-1; return fontEntries[i-1].name; } desc->enumerationIndex = -1; return NULL; } void PPFont::selectFontFace(FontID fontID, const char* faceName) { if (fontID >= FONT_LAST) return; FontFamilyDescription* desc = &fontFamilyDescriptions[fontID]; PPSize size = desc->size; if (fontID == FONT_HUGE) { size.width >>= 1; size.height >>= 1; } pp_int32 i = 0; bool found = false; for (i = 0; i < (signed)numFontsEntries && !found; i++) if (size.match(fontEntries[i].width, fontEntries[i].height) && strcmp(fontEntries[i].name, faceName) == 0) found = true; if (!found) return; i--; desc->fontEntryIndex = i; for (pp_uint32 j = 0; j < numFontInstances; j++) if ((unsigned)fontInstances[j]->fontId == (unsigned)fontID) { if (fontID == FONT_HUGE) createLargeFromSystem(i); else { fontInstances[j]->fontBits = (pp_uint8*)fontEntries[i].data; fontInstances[j]->bitstream->setSource(fontInstances[j]->fontBits, fontEntries[i].width*fontEntries[i].height / 8); } } } const char* PPFont::getCurrentFontFace(FontID fontID) { if (fontID >= FONT_LAST) return NULL; FontFamilyDescription* desc = &fontFamilyDescriptions[fontID]; return fontEntries[desc->fontEntryIndex].name; } milkytracker-0.90.85+dfsg/src/ppui/Menu.cpp0000644000175000017500000001131511150223367017600 0ustar admin2admin2/* * ppui/Menu.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PPMenu.cpp * MilkyTracker * * Created by Peter Barth on Fri Mar 04 2005. * */ #include "Menu.h" #include "Font.h" #include "GraphicsAbstract.h" // ------------- menu -------------------------------------------- PPMenu::PPMenu(PPFont* aFont, const PPColor& selectionColor, const PPColor& bgColor, bool bSubMenu/* = false*/) : font(aFont), backColor(&bgColor), borderColor(&bgColor), selectionColor(&selectionColor), textBrightColor(NULL), textDarkColor(NULL), subMenu(bSubMenu), parentMenu(NULL) //borderColor(128, 128, 128) { } pp_uint32 PPMenu::getMaxWidth() const { pp_uint32 maxWidth = 0; for (pp_int32 i = 0; i < items.size(); i++) { pp_uint32 len = items.get(i)->name.length(); if (len > maxWidth) maxWidth = len; } return maxWidth; } pp_uint32 PPMenu::getEntryHeight() const { #ifndef __LOWRES__ return font->getCharHeight()+2; #else return font->getCharHeight(); #endif } PPRect PPMenu::getBoundingRect() const { PPRect r; r.x1 = 0; r.y1 = 0; r.y2 = items.size()*getEntryHeight()+4; r.x2 = getMaxWidth()*font->getCharWidth()+5; return r; } bool PPMenu::setState(pp_int32 theId, pp_uint32 newState) { bool b = false; for (pp_int32 i = 0; i < items.size(); i++) { if (items.get(i)->identifier == theId) { items.get(i)->state = newState; b = true; } } return b; } void PPMenu::paint(PPGraphicsAbstract* g, pp_int32 px, pp_int32 py, pp_int32 menuSelection) { pp_int32 i; PPRect r = getBoundingRect(); #ifndef __LOWRES__ const pp_int32 yOffset = 1; #else const pp_int32 yOffset = 0; #endif { PPColor color = *backColor; g->setRect(px, py, px + r.x2 + 2, py + r.y2 + 2); g->setColor(color); static pp_uint8 pattern[] = {224, 210, 198, 210, 224}; for (pp_int32 i = py; i < py + r.y2; i++) { pp_int32 c = (pattern[(i-py)%5]-64); g->setColor(c,c,c); g->drawHLine(px, px + r.x2, i); } // border color = *borderColor; PPColor bColor = color; // adjust bright color bColor.scaleFixed(87163); PPPoint location(px,py); PPSize size(r.x2, r.y2); g->setColor(bColor); g->drawHLine(location.x, location.x + size.width, location.y); g->drawVLine(location.y, location.y + size.height, location.x); // adjust dark color bColor = color; bColor.scaleFixed(20000); g->setColor(bColor); g->drawHLine(location.x, location.x + size.width, location.y + size.height - 1); g->drawVLine(location.y, location.y + size.height, location.x + size.width - 1); g->setColor(0,0,0); g->drawHLine(location.x+1, location.x + size.width+1, location.y + size.height); g->drawVLine(location.y+1, location.y + size.height+1, location.x + size.width); g->drawHLine(location.x+1, location.x + size.width+2, location.y + size.height+1); g->drawVLine(location.y+1, location.y + size.height+2, location.x + size.width+1); } g->setFont(font); pp_int32 they = 0; for (i = 0; i < items.size(); i++) { if (i == menuSelection) { PPColor color = *selectionColor; PPColor nsdColor = color, nsbColor = color; nsdColor.scaleFixed(45000); // adjust bright color nsbColor.scaleFixed(75000); pp_int32 y = py + 2 + i*(getEntryHeight()) - 1; pp_int32 h = (getEntryHeight()+1); PPRect rect(px+1, y, px + 1 + r.x2 - 3, y + h/2); g->fillVerticalShaded(rect, nsbColor, nsdColor, true); rect.y1 += h/2; rect.y2 += h/2 + 1; g->fillVerticalShaded(rect, nsbColor, nsdColor, false); g->setColor(*textBrightColor); } else g->setColor(*textDarkColor); if (items.get(i)->state & 1) { g->setColor(*borderColor); g->drawString(items.get(i)->name, px + 2, py + 2 + they+yOffset); } else { PPColor curCol = g->getColor(); g->setColor((textBrightColor->r-curCol.r)>>1, (textBrightColor->g-curCol.g)>>1, (textBrightColor->b-curCol.b)>>1); g->drawString(items.get(i)->name, px + 3, py + 3 + they+yOffset); g->setColor(curCol); g->drawString(items.get(i)->name, px + 2, py + 2 + they+yOffset); } they+=getEntryHeight(); } } milkytracker-0.90.85+dfsg/src/ppui/TransparentContainer.cpp0000644000175000017500000000241011150223367023034 0ustar admin2admin2/* * ppui/TransparentContainer.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "GraphicsAbstract.h" #include "TransparentContainer.h" #include "BasicTypes.h" PPTransparentContainer::PPTransparentContainer(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size) : PPContainer(id, parentScreen, eventListener, location, size) { } PPTransparentContainer::~PPTransparentContainer() { } void PPTransparentContainer::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; paintControls(g); } milkytracker-0.90.85+dfsg/src/ppui/Container.cpp0000644000175000017500000002612111150223367020617 0ustar admin2admin2/* * ppui/Container.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Container.h" #include "Event.h" #include "Screen.h" #include "PPUIConfig.h" PPContainer::PPContainer(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border /* = true */) : PPControl(id, parentScreen, eventListener, location, size), color(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorContainer)), focusedControl(NULL), lastMouseOverControl(NULL), caughtControl(NULL), currentlyPressedMouseButtons(0) { this->border = border; backgroundButton = new PPButton(0, parentScreen, NULL, location, size, border, false); backgroundButton->setColor(*color); timerEventControls = new PPSimpleVector(16, false); } PPContainer::~PPContainer() { delete timerEventControls; for (pp_int32 i = 0; i < controls.size(); i++) { if (controls.get(i)->receiveTimerEvent()) { parentScreen->removeTimerEventControl(controls.get(i)); } } delete backgroundButton; } void PPContainer::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; backgroundButton->paint(g); paintControls(g); } pp_int32 PPContainer::dispatchEvent(PPEvent* event) { if (event->getID() == eInvalid) return 0; pp_int32 i, res = 0; bool handleEvent = false; if (caughtControl) { PPControl* control = caughtControl; switch (event->getID()) { case eLMouseDown: case eRMouseDown: currentlyPressedMouseButtons++; res = control->dispatchEvent(event); goto exit; case eLMouseUp: case eRMouseUp: currentlyPressedMouseButtons--; if (currentlyPressedMouseButtons == 0) { caughtControl = NULL; if (control->gainedFocusByMouse()) { setFocus(control); } } // break is missing intentionally case eLMouseDoubleClick: case eRMouseDoubleClick: case eLMouseDrag: case eLMouseRepeat: case eRMouseDrag: case eRMouseRepeat: case eMouseMoved: res = control->dispatchEvent(event); goto exit; } } if (focusedControl) { PPControl* control = focusedControl; bool mouseEvent = false; switch (event->getID()) { case eLMouseDown: case eRMouseDown: case eLMouseUp: case eRMouseUp: case eLMouseDoubleClick: case eRMouseDoubleClick: case eLMouseDrag: case eLMouseRepeat: case eRMouseDrag: case eRMouseRepeat: case eMouseMoved: case eMouseWheelMoved: mouseEvent = true; break; } if (!mouseEvent) { res = control->dispatchEvent(event); // we're getting send an focus lost event // so remove all references to focused controls if (event->getID() == eFocusLost || event->getID() == eFocusLostNoRepaint) { focusedControl = NULL; } goto exit; } } switch (event->getID()) { case eLMouseDown: case eRMouseDown: case eMouseWheelMoved: case eMouseMoved: handleEvent = true; break; // we got a focus gained message // if we don't have some focused control set, // we simply search for a control that could gain the focus // and assign focus to that case eFocusGainedNoRepaint: case eFocusGained: { if (focusedControl != NULL || caughtControl != NULL) break; for (pp_int32 j = 0; j < controls.size(); j++) { PPControl* control = controls.get(j); if (control->gainsFocus()) { setFocus(control, event->getID() == eFocusGained); break; } } break; } } if (!handleEvent) goto exit; // handle other events for (i = 0; i < controls.size(); i++) { PPControl* control = controls.get(i); if (!control->isVisible() || !control->isEnabled()) continue; bool abortLoop = false; switch (event->getID()) { // mouse wheel has moved case eMouseWheelMoved: { TMouseWheelEventParams* params = (TMouseWheelEventParams*)event->getDataPtr(); if (control->hit(params->pos) && control->isActive()) { control->dispatchEvent(event); abortLoop = true; } break; } // mouse has been moved also gets this case eMouseMoved: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (control->isActive()) { bool bHit = control->hit(*p); bool bLastHit = control->hit(lastMousePoint); if (!bLastHit && bHit) { PPEvent e(eMouseEntered, p, sizeof(PPPoint)); control->dispatchEvent(&e); } else if (bLastHit && !bHit) { PPEvent e(eMouseLeft, p, sizeof(PPPoint)); control->dispatchEvent(&e); } if (bHit) { if (control != lastMouseOverControl && lastMouseOverControl) lastMouseOverControl->dispatchEvent(event); res = control->dispatchEvent(event); lastMouseOverControl = control; abortLoop = true; } } break; } // Mouse button down event case eLMouseDown: case eRMouseDown: if (control->hit(*(PPPoint*)event->getDataPtr()) && control->isActive() && caughtControl == NULL) { currentlyPressedMouseButtons++; caughtControl = control; control->dispatchEvent(event); abortLoop = true; } break; } if (abortLoop || event->getID() == eInvalid) break; } exit: if (event->getID() == eMouseMoved) { PPPoint* p = (PPPoint*)event->getDataPtr(); lastMousePoint = *p; } return res; } PPControl* PPContainer::getControlByID(pp_int32 id) { pp_int32 i; for (i = 0; i < controls.size(); i++) { pp_int32 cID = controls.get(i)->getID(); if (cID == id) return controls.get(i); } // not found, try recursive in sub-containers if any for (i = 0; i < controls.size(); i++) { PPControl* control = controls.get(i); if (control->isContainer()) { PPControl* newCtrl = static_cast(control)->getControlByID(id); if (newCtrl) return newCtrl; } } return NULL; } void PPContainer::addControl(PPControl* control) { control->setOwnerControl(this); controls.add(control); if (control->receiveTimerEvent()) { if (this->isVisible()) parentScreen->addTimerEventControl(control); else timerEventControls->add(control); } } bool PPContainer::removeControl(PPControl* control) { pp_int32 i; bool res = false; if (control->receiveTimerEvent()) { parentScreen->removeTimerEventControl(control); } for (i = 0; i < controls.size(); i++) { if (controls.get(i) == control) { controls.remove(i); res = true; } } return res; } bool PPContainer::gainsFocus() const { if (caughtControl && caughtControl->gainsFocus()) return true; if (focusedControl) return true; return false; } bool PPContainer::gainedFocusByMouse() const { if (caughtControl && caughtControl->gainedFocusByMouse()) return true; return false; } void PPContainer::show(bool visible) { PPControl::show(visible); if (visible) { // add timer event controls to parent screen for (pp_int32 i = 0; i < timerEventControls->size(); i++) { parentScreen->addTimerEventControl(timerEventControls->get(i)); } timerEventControls->clear(); } else { // remove timer event controls from parent screen // and add them to our internal list for (pp_int32 i = 0; i < controls.size(); i++) { if (controls.get(i)->receiveTimerEvent()) { parentScreen->removeTimerEventControl(controls.get(i)); timerEventControls->add(controls.get(i)); } } } } void PPContainer::hide(bool hidden) { PPControl::hide(hidden); if (!hidden) { // add timer event controls to parent screen for (pp_int32 i = 0; i < timerEventControls->size(); i++) { parentScreen->addTimerEventControl(timerEventControls->get(i)); } timerEventControls->clear(); } else { // remove timer event controls from parent screen // and add them to our internal list for (pp_int32 i = 0; i < controls.size(); i++) { if (controls.get(i)->receiveTimerEvent()) { parentScreen->removeTimerEventControl(controls.get(i)); timerEventControls->add(controls.get(i)); } } } } void PPContainer::setSize(const PPSize& size) { this->size = size; backgroundButton->setSize(size); } void PPContainer::setLocation(const PPPoint& location) { /*PPPoint offset(location.x - this->location.x, location.y - this->location.y); move(offset);*/ this->location = location; backgroundButton->setLocation(location); } void PPContainer::setFocus(PPControl* control, bool repaint/* = true*/) { // nothing to do if (control == this->focusedControl) return; // the current control is about to lose focus if (this->focusedControl) { PPEvent e(repaint ? eFocusLost : eFocusLostNoRepaint); this->focusedControl->dispatchEvent(&e); } this->focusedControl = control; if (this->focusedControl) { PPEvent e(repaint ? eFocusGained : eFocusGainedNoRepaint); this->focusedControl->dispatchEvent(&e); } #if 0 if (verbose) { /*if (focusedControl != control && focusedControl) { PPEvent e(eFocusLost); focusedControl->dispatchEvent(&e); }*/ PPEvent eLost(eFocusLost); for (pp_int32 i = 0; i < controls.size(); i++) { PPControl* ctrl = controls.get(i); if (ctrl != control) ctrl->dispatchEvent(&eLost); } if (reGain && control) { PPEvent eGained(eFocusGained); control->dispatchEvent(&eGained); lastFocusedControl = control; } } focusedControl = control; #endif } bool PPContainer::hasFocus(PPControl* control) const { return focusedControl == control; } void PPContainer::move(const PPPoint& offset) { PPPoint p = getLocation(); p.x+=offset.x; p.y+=offset.y; location = p; backgroundButton->setLocation(p); PPSimpleVector& controls = getControls(); for (pp_int32 i = 0; i < controls.size(); i++) { PPControl* control = controls.get(i); if (!control->isContainer()) { p = control->getLocation(); p.x+=offset.x; p.y+=offset.y; control->setLocation(p); } else static_cast(control)->move(offset); } } void PPContainer::adjustContainerSize() { PPSimpleVector& controls = getControls(); pp_int32 x1 = parentScreen->getWidth(); pp_int32 y1 = parentScreen->getHeight(); pp_int32 x2 = 0; pp_int32 y2 = 0; for (pp_int32 i = 0; i < controls.size(); i++) { PPControl* control = controls.get(i); PPPoint p = control->getLocation(); if (p.x < x1) x1 = p.x; if (p.y < y1) y1 = p.y; p.x+=control->getSize().width; p.y+=control->getSize().height; if (p.x > x2) x2 = p.x; if (p.y > y2) y2 = p.y; } setLocation(PPPoint(x1, y1)); setSize(PPSize(x2-x1, y2-y1)); } milkytracker-0.90.85+dfsg/src/ppui/RadioGroup.h0000644000175000017500000000432011150223367020412 0ustar admin2admin2/* * ppui/RadioGroup.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPRadioGroup control class // ///////////////////////////////////////////////////////////////// #ifndef RADIOGROUP__H #define RADIOGROUP__H #include "BasicTypes.h" #include "Control.h" #include "SimpleVector.h" // Forwards class PPGraphicsAbstract; class PPFont; class PPButton; class PPRadioGroup : public PPControl { private: const PPColor* radioButtonColor; const PPColor* textColor; PPSimpleVector items; pp_uint32 spacerHeight; pp_uint32 choice; PPFont* font; bool horizontal; pp_int32 maxWidth; public: enum { DefaultSpacerHeight = 5, DefaultRadioWidth = 14 }; PPRadioGroup(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, pp_uint32 spacerHeight = DefaultSpacerHeight); virtual ~PPRadioGroup(); void setColor(const PPColor& color) { this->radioButtonColor = &color; } void addItem(const PPString& item); const PPString& getItem(pp_int32 index) const; void setSpacerHeight(pp_uint32 spacerHeight) { this->spacerHeight = spacerHeight; } void setFont(PPFont* font) { this->font = font; } void setHorizontal(bool b) { horizontal = b; } void setChoice(pp_uint32 choice) { this->choice = choice; } pp_uint32 getChoice() const { return choice; } virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); void fitSize(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/ListBox.h0000644000175000017500000001340011150223367017722 0ustar admin2admin2/* * ppui/ListBox.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PPListBox control class // ///////////////////////////////////////////////////////////////// #ifndef LISTBOX__H #define LISTBOX__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" #include "SimpleVector.h" // Forwards class PPGraphicsAbstract; class PPScrollbar; class PPFont; class PPButton; class PPListBox : public PPControl, public EventListenerInterface { private: bool border; const PPColor* borderColor; const PPColor* backGroundButtonColor; const PPColor* textColor; bool editable; bool scrollable; bool autoHideVScroll; bool autoHideHScroll; bool showIndex; pp_int32 indexBaseCount; bool showSelectionAlways; bool selectionVisible; bool onlyShowIndexSelection; bool keepsFocus; bool showFocus; bool centerSelection; bool selectOnScroll; bool singleButtonClickEdit; bool allowDragSelection; bool rightButtonConfirm; PPSimpleVector* items; pp_int32 startIndex; pp_int32 startPos; pp_int32 selectionIndex; pp_int32 columnSelectionStart; pp_int32 columnSelectionEnd; pp_int32 maxEditSize; pp_int32 timerTicker; bool lastTimerState; pp_int32 visibleHeight; pp_int32 visibleWidth; PPButton* backgroundButton; PPScrollbar* hScrollbar; PPScrollbar* vScrollbar; PPControl* caughtControl; bool controlCaughtByLMouseButton, controlCaughtByRMouseButton; bool lMouseDown, rMouseDown; PPFont* font; // UNDO PPString* editCopy; // hack pp_int32 lastStartIndex; pp_int32 lastStartPos; pp_int32 lastSelectionIndex; bool hadVScrollbar; bool hadHScrollbar; public: class ColorQueryListener { public: virtual PPColor getColor(pp_uint32 index, PPListBox& sender) = 0; }; private: ColorQueryListener* colorQueryListener; public: PPListBox(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true, bool editable = false, bool scrollable = true, bool showSelectionAlways = false); virtual ~PPListBox(); void setFont(PPFont* font) { this->font = font; } PPFont* getFont() const { return font; } void setBorderColor(const PPColor& color) { this->borderColor = &color; } void setAutoHideVScroll(bool b) { autoHideVScroll = b; } void setAutoHideHScroll(bool b) { autoHideHScroll = b; } void setShowIndex(bool showIndex); void showSelection(bool b) { selectionVisible = b; } void setOnlyShowIndexSelection(bool b) { onlyShowIndexSelection = b; } void setKeepsFocus(bool keepsFocus) { this->keepsFocus = keepsFocus; } void setShowFocus(bool showFocus) { this->showFocus = showFocus; } void setCenterSelection(bool bCenter) { centerSelection = bCenter; } void setIndexBaseCount(pp_int32 indexBaseCount) { this->indexBaseCount = indexBaseCount; } void setSelectOnScroll(bool b) { selectOnScroll = b; } void setSingleButtonClickEdit(bool b) { singleButtonClickEdit = b; } void setAllowDragSelection(bool b) { allowDragSelection = b; } void setRightButtonConfirm(bool b) { rightButtonConfirm = b; } void setMaxEditSize(pp_int32 max) { maxEditSize = max; } void addItem(const PPString& item); const PPString& getItem(pp_int32 index) const; void updateItem(pp_int32 index, const PPString& item); pp_int32 getNumItems() const { return items->size(); } void clear(); pp_uint32 getSelectedIndex() const { return selectionIndex; } void setSelectedIndex(pp_int32 index, bool adjustStartIndex = true, bool assureCursor = true); void setSelectedIndexByItem(const PPString& item, bool adjustStartIndex = true); bool isLastEntry() const { return selectionIndex == getNumItems() - 1; } bool isFirstEntry() const { return selectionIndex == 0; } bool isEditing() const { return columnSelectionStart>=0; } void placeCursorAtEnd(); void placeCursorAtStart(); void saveState(); void restoreState(bool assureCursor = true); // from PPControl virtual void paint(PPGraphicsAbstract* graphics); virtual bool gainsFocus() const { return keepsFocus; } virtual bool gainedFocusByMouse() const { return keepsFocus && ((caughtControl == NULL) && (items->size() > 0)); } virtual pp_int32 dispatchEvent(PPEvent* event); virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); // from EventListenerInterface pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual bool isListBox() const { return true; } virtual bool receiveTimerEvent() const { return true; } void commitChanges(); void discardChanges(); void setColorQueryListener(ColorQueryListener* listener) { colorQueryListener = listener; } private: enum SelectReturnCodes { SelectReturnCodeDefault, SelectReturnCodeBreak, SelectReturnCodePlaceCursor }; SelectReturnCodes select(const PPPoint* p); void initialize(); void calcVisible(); void adjustScrollbarPositions(); void adjustScrollbars(); void assureCursorVisible(); // new stuff PPRect getVisibleRect() const; pp_int32 getItemHeight() const; pp_int32 getNumVisibleItems() const; pp_uint32 getMaxWidth() const; }; #endif milkytracker-0.90.85+dfsg/src/ppui/Graphics.h0000644000175000017500000001011011150223367020071 0ustar admin2admin2/* * ppui/Graphics.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Graphics class // ///////////////////////////////////////////////////////////////// #ifndef __GRAPHICS_H__ #define __GRAPHICS_H__ #include "GraphicsAbstract.h" class PPGraphicsFrameBuffer : public PPGraphicsAbstract { protected: pp_int32 pitch; pp_uint8* buffer; public: PPGraphicsFrameBuffer(pp_int32 w, pp_int32 h, pp_int32 p, void* buff) : PPGraphicsAbstract(w, h), pitch(p), buffer((pp_uint8*)buff) { } void setBufferProperties(pp_int32 p, void* buff) { pitch = p; buffer = (pp_uint8*)buff; } }; #define __EMPTY__ #define SUBCLASS_GRAPHICS(baseclass, prologue, name, epilogue) \ class name : public baseclass \ { \ private: \ prologue \ public: \ name(pp_int32 w, pp_int32 h, pp_int32 p, void* buff); \ virtual void setPixel(pp_int32 x, pp_int32 y); \ virtual void setPixel(pp_int32 x, pp_int32 y, const PPColor& color); \ virtual void fill(PPRect r); \ virtual void fill(); \ virtual void drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y); \ virtual void drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x); \ virtual void drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2); \ virtual void drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2); \ virtual void blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity = 256); \ virtual void drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined = false); \ virtual void drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined = false); \ virtual void drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined = false); \ epilogue \ }; \ // trans is level of transparency - 0 = opaque, 255 = transparent static inline void set_pixel_transp(PPGraphicsAbstract* g, pp_int32 x, pp_int32 y, PPColor* col, unsigned char trans) { PPColor newColor; newColor.r = (col->r * (unsigned int)(255-trans))>>8; newColor.g = (col->g * (unsigned int)(255-trans))>>8; newColor.b = (col->b * (unsigned int)(255-trans))>>8; g->setPixel(x, y, newColor); } // used for win32 SUBCLASS_GRAPHICS(PPGraphicsFrameBuffer, __EMPTY__, PPGraphics_BGR24, __EMPTY__) // OSX (carbon, 32 bits with alpha channel) SUBCLASS_GRAPHICS(PPGraphicsFrameBuffer, __EMPTY__, PPGraphics_ARGB32, __EMPTY__) // used for wince (GAPI) SUBCLASS_GRAPHICS(PPGraphicsFrameBuffer, __EMPTY__, PPGraphics_16BIT, __EMPTY__) // OSX (carbon, 16 bit color, one unused bit) SUBCLASS_GRAPHICS(PPGraphicsFrameBuffer, __EMPTY__, PPGraphics_15BIT, __EMPTY__) // currently unused, big endian compatible version of PPGraphics_BGR24 SUBCLASS_GRAPHICS(PPGraphicsFrameBuffer, __EMPTY__, PPGraphics_BGR24_SLOW, __EMPTY__) #define PROLOGUE \ pp_uint32 bitPosR, bitPosG, bitPosB; #define EPILOGUE \ void setComponentBitpositions(pp_uint32 bitPosR, pp_uint32 bitPosG, pp_uint32 bitPosB) \ { \ this->bitPosR = bitPosR; this->bitPosG = bitPosG; this->bitPosB = bitPosB; \ } // used in the SDL port, arbitrary bit positions but a little bit slower than the rest SUBCLASS_GRAPHICS(PPGraphicsFrameBuffer, PROLOGUE, PPGraphics_24bpp_generic, EPILOGUE) SUBCLASS_GRAPHICS(PPGraphicsFrameBuffer, PROLOGUE, PPGraphics_32bpp_generic, EPILOGUE) #undef EPILOGUE #undef PROLOGUE #undef SUBCLASS_GRAPHICSABSTRACT #undef __EMPTY__ #ifdef __OPENGL__ #include "Graphics_OGL.h" #endif #endif milkytracker-0.90.85+dfsg/src/ppui/wince/0000755000175000017500000000000011317506141017273 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/ppui/wince/DisplayDevice_GAPI.cpp0000644000175000017500000000415311150223367023330 0ustar admin2admin2/* * ppui/wince/DisplayDevice_GAPI.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "DisplayDevice_GAPI.h" #include "Graphics.h" #include "gx.h" #include "WaitStateThread.h" // virtual screen comes from outside extern unsigned short *vScreen; // Also the Update functions void UpdateScreen(unsigned short* vScreen); void UpdateScreenRegion(unsigned short* vScreen, const PPRect& r); PPDisplayDevice::PPDisplayDevice(HWND hWnd, pp_uint32 width, pp_uint32 height) : PPDisplayDeviceBase(width, height) { currentGraphics = new PPGraphics_16BIT(width, height, (width * 16) / 8, (pp_uint8*)vScreen); this->hWnd = hWnd; } PPDisplayDevice::~PPDisplayDevice() { delete currentGraphics; } PPGraphicsAbstract* PPDisplayDevice::open() { if (!isEnabled()) return NULL; currentGraphics->lock = false; return currentGraphics; } void PPDisplayDevice::close() { currentGraphics->lock = true; } void PPDisplayDevice::update() { if (!isUpdateAllowed() || !isEnabled()) return; ::UpdateScreen(vScreen); } void PPDisplayDevice::update(const PPRect& r) { if (!isUpdateAllowed() || !isEnabled()) return; ::UpdateScreenRegion(vScreen, r); } void PPDisplayDevice::setTitle(const PPSystemString& title) { ::SetWindowText(hWnd, title); } void PPDisplayDevice::shutDown() { ::PostMessage(hWnd, WM_CLOSE, 0, 0); } void PPDisplayDevice::signalWaitState(bool b, const PPColor& color) { WaitStateThread::getInstance()->activate(b); } milkytracker-0.90.85+dfsg/src/ppui/wince/DisplayDevice_GAPI.h0000644000175000017500000000313011150223367022767 0ustar admin2admin2/* * ppui/wince/DisplayDevice_GAPI.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Our display device // ///////////////////////////////////////////////////////////////// #ifndef DISPLAYDEVICE__H #define DISPLAYDEVICE__H #include "BasicTypes.h" #include "DisplayDeviceBase.h" #include // Forwards class PPGraphicsAbstract; class PPDisplayDevice : public PPDisplayDeviceBase { private: HWND hWnd; public: PPDisplayDevice(HWND hWnd, pp_uint32 width, pp_uint32 height); virtual ~PPDisplayDevice(); virtual PPGraphicsAbstract* open(); virtual void close(); void update(); void update(const PPRect& r); // ----------------------------- ex. PPWindow ---------------------------- virtual void setTitle(const PPSystemString& title); virtual void shutDown(); virtual void signalWaitState(bool b, const PPColor& color); }; #endif milkytracker-0.90.85+dfsg/src/ppui/StaticText.h0000644000175000017500000000436311150223367020442 0ustar admin2admin2/* * ppui/StaticText.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // Static text control class // ///////////////////////////////////////////////////////////////// #ifndef STATICTEXT__H #define STATICTEXT__H #include "BasicTypes.h" #include "Control.h" // Forwards class PPGraphicsAbstract; class PPFont; class PPButton; class PPStaticText : public PPControl { private: const PPColor* color; bool drawShadow; bool underlined; bool autoShrink; PPColor shadowColor; PPString text; PPFont* font; PPSize extent; public: PPStaticText(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPString& text, bool drawShadow = false, bool drawUnderlined = false, bool autoShrink = false); virtual ~PPStaticText(); void setColor(const PPColor& color) { this->color = &color; } void setText(const PPString& text); const PPString& getText() const { return text; } void setFont(PPFont* font) { this->font = font; calcExtent(); } virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); void setUnderlined(bool b) { underlined = b; } void setValue(pp_int32 value, bool hex, pp_uint32 numDigits = 0, bool negative = false); void setIntValue(pp_int32 value, pp_uint32 numDecDigits = 0, bool negative = false); void setHexValue(pp_int32 value, pp_uint32 numHexDigits = 0); void setExtent(PPSize extent) { this->extent = extent; } private: void calcExtent(); }; #endif milkytracker-0.90.85+dfsg/src/ppui/ScanCodes.h0000644000175000017500000000345711150223367020213 0ustar admin2admin2/* * ppui/ScanCodes.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ScanCodes.h * MilkyTracker * * Created by Peter Barth on 21.05.05. * */ #ifndef SCANCODES__H #define SCANCODES__H #define SC_WTF 0x29 #define SC_1 0x02 #define SC_2 0x03 #define SC_3 0x04 #define SC_4 0x05 #define SC_5 0x06 #define SC_6 0x07 #define SC_7 0x08 #define SC_8 0x09 #define SC_9 0x0a #define SC_0 0x0b #define SC_SS 0x0c #define SC_TICK 0x0d #define SC_Q 0x10 #define SC_W 0x11 #define SC_E 0x12 #define SC_R 0x13 #define SC_T 0x14 #define SC_Z 0x15 #define SC_U 0x16 #define SC_I 0x17 #define SC_O 0x18 #define SC_P 0x19 #define SC_UE 0x1a #define SC_PLUS 0x1b #define SC_A 0x1e #define SC_S 0x1f #define SC_D 0x20 #define SC_F 0x21 #define SC_G 0x22 #define SC_H 0x23 #define SC_J 0x24 #define SC_K 0x25 #define SC_L 0x26 #define SC_OE 0x27 #define SC_AE 0x28 #define SC_SHARP 0x2b #define SC_SMALLERGREATER 0x56 #define SC_Y 0x2c #define SC_X 0x2d #define SC_C 0x2e #define SC_V 0x2f #define SC_B 0x30 #define SC_N 0x31 #define SC_M 0x32 #define SC_COMMA 0x33 #define SC_PERIOD 0x34 #define SC_MINUS 0x35 #define SC_CAPSLOCK 0x100 #endif milkytracker-0.90.85+dfsg/src/ppui/Graphics_32bpp_generic.cpp0000644000175000017500000002050011150223367023132 0ustar admin2admin2/* * ppui/Graphics_32bpp_generic.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Graphics_32bpp_generic.cpp * milkytracker_sdl * * Created by Peter Barth on 06.12.07. * */ #include "Graphics.h" #include "Font.h" #define BPP 4 #include "fastfill.h" PPGraphics_32bpp_generic::PPGraphics_32bpp_generic(pp_int32 w, pp_int32 h, pp_int32 p, void* buff) : PPGraphicsFrameBuffer(w, h, p, buff), bitPosR(0), bitPosG(8), bitPosB(16) { } void PPGraphics_32bpp_generic::setPixel(pp_int32 x, pp_int32 y) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; *(pp_uint32*)buff = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); } } void PPGraphics_32bpp_generic::setPixel(pp_int32 x, pp_int32 y, const PPColor& color) { if (y >= currentClipRect.y1 && y < currentClipRect.y2 && x >= currentClipRect.x1 && x < currentClipRect.x2) { pp_uint8* buff = (pp_uint8*)buffer+pitch*y+x*BPP; *(pp_uint32*)buff = (color.r << bitPosR) + (color.g << bitPosG) + (color.b << bitPosB); } } void PPGraphics_32bpp_generic::fill(PPRect rect) { if (rect.y1 < currentClipRect.y1) rect.y1 = currentClipRect.y1; if (rect.x1 < currentClipRect.x1) rect.x1 = currentClipRect.x1; if (rect.y2 > currentClipRect.y2) rect.y2 = currentClipRect.y2; if (rect.x2 > currentClipRect.x2) rect.x2 = currentClipRect.x2; pp_int32 len = (rect.x2-rect.x1); if (len <= 0) return; pp_uint32 rgb1 = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); pp_int32 inc = (pitch-len*BPP) / BPP; pp_uint8* buff = (pp_uint8*)buffer+(pitch*rect.y1+rect.x1*BPP); pp_uint32* ptr = reinterpret_cast(buff); for (pp_int32 y = rect.y1; y < rect.y2; y++) { fill_dword(ptr, rgb1, len); ptr+=len; ptr+=inc; } } void PPGraphics_32bpp_generic::fill() { fill(currentClipRect); } void PPGraphics_32bpp_generic::drawHLine(pp_int32 x1, pp_int32 x2, pp_int32 y) { pp_int32 lx = x1; pp_int32 rx = x2; if (x1 > x2) { pp_int32 h = x2; x2 = x1; x1 = h; } if (lx < currentClipRect.x1) lx = currentClipRect.x1; if (rx > currentClipRect.x2) rx = currentClipRect.x2; if (y < currentClipRect.y1) return; if (y >= currentClipRect.y2) return; if (lx > currentClipRect.x2) return; if (rx < currentClipRect.x1) return; pp_int32 len = (rx-lx); if (len <= 0) return; pp_uint8* buff = (pp_uint8*)buffer+pitch*y+lx*4; pp_uint32 rgb1 = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); fill_dword(reinterpret_cast(buff), rgb1, len); } void PPGraphics_32bpp_generic::drawVLine(pp_int32 y1, pp_int32 y2, pp_int32 x) { pp_int32 ly = y1; pp_int32 ry = y2; if (y1 > y2) { pp_int32 h = y2; y2 = y1; y1 = h; } if (ly < currentClipRect.y1) ly = currentClipRect.y1; if (ry > currentClipRect.y2) ry = currentClipRect.y2; if (x < currentClipRect.x1) return; if (x >= currentClipRect.x2) return; pp_int32 len = (ry-ly); if (len <= 0) return; pp_uint8* buff = (pp_uint8*)buffer+pitch*(ly)+x*4; pp_uint32 rgb1 = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); fill_dword_vertical(reinterpret_cast(buff), rgb1, len, pitch); } void PPGraphics_32bpp_generic::drawLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSLINETEMPLATE } void PPGraphics_32bpp_generic::drawAntialiasedLine(pp_int32 x1, pp_int32 y1, pp_int32 x2, pp_int32 y2) { __PPGRAPHICSAALINETEMPLATE } void PPGraphics_32bpp_generic::blit(const pp_uint8* src, const PPPoint& p, const PPSize& size, pp_uint32 pitch, pp_uint32 bpp, pp_int32 intensity/* = 256*/) { pp_int32 w = size.width; pp_int32 h = size.height; pp_uint8* dst = (pp_uint8*)buffer+(this->pitch*p.y+p.x*BPP); const pp_uint32 bytesPerPixel = bpp; const pp_uint32 bitPosR = this->bitPosR; const pp_uint32 bitPosG = this->bitPosG; const pp_uint32 bitPosB = this->bitPosB; if (intensity != 256) { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { *(pp_uint32*)dst = (((src[0]*intensity)>>8) << bitPosR) + (((src[1]*intensity)>>8) << bitPosG) + (((src[2]*intensity)>>8) << bitPosB); dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } else { for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { *(pp_uint32*)dst = ((pp_uint32)src[0] << bitPosR) + ((pp_uint32)src[1] << bitPosG) + ((pp_uint32)src[2] << bitPosB); dst+=BPP; src+=bytesPerPixel; } dst+=this->pitch - w*BPP; src+=pitch - w*bytesPerPixel; } } } void PPGraphics_32bpp_generic::drawChar(pp_uint8 chr, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); if (x + (signed)charWidth < currentClipRect.x1 || x > currentClipRect.x2 || y + (signed)charHeight < currentClipRect.y1 || y > currentClipRect.y2) return; pp_int32 charDim = currentFont->charDim; Bitstream* bitstream = currentFont->bitstream; pp_uint8* fontbuffer = bitstream->buffer; pp_uint32 rgb1 = (currentColor.r << bitPosR) + (currentColor.g << bitPosG) + (currentColor.b << bitPosB); pp_uint32 cchrDim = chr*charDim; if (x>= currentClipRect.x1 && x + charWidth < currentClipRect.x2 && y>= currentClipRect.y1 && y + charHeight < currentClipRect.y2) { pp_uint8* buff = (pp_uint8*)buffer + y*pitch + x*BPP; pp_uint32 yChr = cchrDim; for (pp_uint32 i = 0; i < charHeight; i++) { pp_uint32 xChr = yChr; for (pp_uint32 j = 0; j < charWidth; j++) { if ((fontbuffer[xChr>>3]>>(xChr&7)&1)) { *reinterpret_cast(buff) = rgb1; } buff+=BPP; xChr++; } buff+=pitch-(charWidth*BPP); yChr+=charWidth; } } else { pp_uint32 yChr = cchrDim; for (pp_int32 i = 0; i < charHeight; i++) { pp_uint32 xChr = yChr; for (pp_int32 j = 0; j < charWidth; j++) { if (y+(signed)i >= currentClipRect.y1 && y+(signed)i < currentClipRect.y2 && x+(signed)j >= currentClipRect.x1 && x+(signed)j < currentClipRect.x2 && (fontbuffer[xChr>>3]>>(xChr&7)&1)) { pp_uint8* buff = (pp_uint8*)buffer+((y+i)*pitch+(x+j)*BPP); *reinterpret_cast(buff) = rgb1; } xChr++; } yChr+=charWidth; } } if (underlined) drawHLine(x, x+charWidth, y+charHeight); } void PPGraphics_32bpp_generic::drawString(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); pp_int32 sx = x; while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; case '\n': y+=charHeight; x=sx-charWidth; break; default: drawChar(*str, x, y, underlined); } x += charWidth; str++; } } void PPGraphics_32bpp_generic::drawStringVertical(const char* str, pp_int32 x, pp_int32 y, bool underlined/* = false*/) { if (currentFont == NULL) return; pp_int32 charWidth = (signed)currentFont->getCharWidth(); pp_int32 charHeight = (signed)currentFont->getCharHeight(); while (*str) { switch (*str) { case '\xf4': setPixel(x+(charWidth>>1), y+(charHeight>>1)); break; default: drawChar(*str, x, y, underlined); } y += charHeight; str++; } } milkytracker-0.90.85+dfsg/src/compression/0000755000175000017500000000000011317506534017560 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/compression/zziplib/0000755000175000017500000000000011317506051021235 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/compression/zziplib/MyIO.cpp0000644000175000017500000000236611130466476022576 0ustar admin2admin2/* * MyIO.cpp * MilkyTracker * * Created by Peter Barth on 03.12.07. * */ #include "MyIO.h" #include "XMFile.h" __zzipfd Myopen(const zzip_char_t* name, int flags, ...) { XMFile* f = new XMFile((SYSCHAR*)name, (flags & O_WRONLY) ? true : false); if (!f->isOpen()) { delete f; return (__zzipfd)-1; } //TODO: find a better solution ASSERT(sizeof(f) == sizeof(__zzipfd)); return reinterpret_cast<__zzipfd>(f); } int Myclose(__zzipfd fd) { if (fd == (__zzipfd)-1) return -1; delete reinterpret_cast(fd); return 0; } zzip_ssize_t Myread(__zzipfd fd, void *buffer, zzip_size_t count) { if (fd == (__zzipfd)-1) return -1; return reinterpret_cast(fd)->read(buffer, 1, count); } zzip_off_t Mylseek(__zzipfd fd, zzip_off_t offset, int origin) { if (fd == (__zzipfd)-1) return -1; XMFile::SeekOffsetTypes moveMethod = XMFile::SeekOffsetTypeStart; if (origin == SEEK_CUR) moveMethod = XMFile::SeekOffsetTypeCurrent; else if (origin == SEEK_END) moveMethod = XMFile::SeekOffsetTypeEnd; reinterpret_cast(fd)->seek(offset, moveMethod); return reinterpret_cast(fd)->pos(); } zzip_off_t Myfsize(__zzipfd fd) { if (fd == (__zzipfd)-1) return -1; return reinterpret_cast(fd)->size(); } milkytracker-0.90.85+dfsg/src/compression/zziplib/MyIO.h0000644000175000017500000000073711130466476022243 0ustar admin2admin2/* * MyIO.h * MilkyTracker * * Created by Peter Barth on 03.12.07. * */ #ifndef __MYIO_H__ #define __MYIO_H__ #include "zzip_plugin.h" #ifdef __cplusplus extern "C" { #endif __zzipfd Myopen(const zzip_char_t* name, int flags, ...); int Myclose(__zzipfd fd); zzip_ssize_t Myread(__zzipfd fd, void *buffer, zzip_size_t count); zzip_off_t Mylseek(__zzipfd fd, zzip_off_t offset, int origin); zzip_off_t Myfsize(__zzipfd fd); #ifdef __cplusplus }; #endif #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/0000755000175000017500000000000011317506534022657 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_plugin.h0000644000175000017500000000624510737746457025430 0ustar admin2admin2/* * Author: * Guido Draheim * * Copyright (c) 2002,2003 Guido Draheim * All rights reserved * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 * * the interfaces for the plugin_io system * * Using the following you can provide your own file I/O functions to * e.g. read data directly from memory, provide simple * "encryption"/"decryption" of on-disk .zip-files... * Note that this currently only provides a subset of the functionality * in zziplib. It does not attempt to provide any directory functions, * but if your program 1) only uses ordinary on-disk files and you * just want this for file obfuscation, or 2) you only access your * .zip archives using zzip_open & co., this is sufficient. * * Currently the default io are the POSIX functions, except * for 'filesize' that is zziplibs own provided zzip_filesize function, * using standard POSIX fd's. You are however free to replace this with * whatever data type you need, so long as you provide implementations * for all the functions, and the data type fits an int. * * all functions receiving ext_io are able to cope with both arguments * set to zero which will let them default to a ZIP ext and posix io. */ #ifndef _ZZIP_PLUGIN_H /* zzip-io.h */ #define _ZZIP_PLUGIN_H 1 #include #ifdef __cplusplus extern "C" { #endif /* we have renamed zzip_plugin_io.use_mmap to zzip_plugin_io.sys */ #define ZZIP_PLUGIN_IO_SYS 1 struct zzip_plugin_io { /* use "zzip_plugin_io_handlers" in applications !! */ size_t (*open)(zzip_char_t* name, int flags, ...); int (*close)(__zzipfd fd); zzip_ssize_t (*read)(__zzipfd fd, void* buf, zzip_size_t len); zzip_off_t (*seeks)(__zzipfd fd, zzip_off_t offset, int whence); zzip_off_t (*filesize)(__zzipfd fd); long sys; long type; zzip_ssize_t (*write)(__zzipfd fd, _zzip_const void* buf, zzip_size_t len); }; typedef union _zzip_plugin_io { struct zzip_plugin_io fd; struct { void* padding[8]; } ptr; } zzip_plugin_io_handlers; #define _zzip_plugin_io_handlers zzip_plugin_io_handlers /* for backward compatibility, and the following to your application code: * #ifndef _zzip_plugin_io_handlers * #define _zzip_plugin_io_handlers struct zzip_plugin_io */ typedef zzip_plugin_io_handlers* zzip_plugin_io_handlers_t; #ifdef ZZIP_LARGEFILE_RENAME #define zzip_filesize zzip_filesize64 #define zzip_get_default_io zzip_get_default_io64 #define zzip_init_io zzip_init_io64 #endif _zzip_export zzip_off_t zzip_filesize(__zzipfd fd); /* get the default file I/O functions */ _zzip_export zzip_plugin_io_t zzip_get_default_io(void); /* * Initializes a zzip_plugin_io_t to the zziplib default io. * This is useful if you only want to override e.g. the 'read' function. * all zzip functions that can receive a zzip_plugin_io_t can * handle a zero pointer in that place and default to posix io. */ _zzip_export int zzip_init_io(zzip_plugin_io_handlers_t io, int flags); /* zzip_init_io flags : */ # define ZZIP_IO_USE_MMAP 1 #ifdef __cplusplus }; #endif #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/fseeko.cpp0000644000175000017500000005103110737746457024656 0ustar admin2admin2/* * NOTE: this is part of libzzipfseeko (i.e. it is not libzzip). * * These routines are fully independent from the traditional zzip * implementation. They assume a readonly seekable stdio handle * representing a complete zip file. The functions show how to * parse the structure, find files and return a decoded bytestream. * * These routines are a bit simple and really here for documenting * the way to access a zip file. The complexity of zip access comes * from staggered reading of bytes and reposition of a filepointer in * a big archive with lots of files and long compressed datastreams. * Plus varaints of drop-in stdio replacements, obfuscation routines, * auto fileextensions, drop-in dirent replacements, and so on... * * btw, we can _not_ use fgetpos/fsetpos since an fpos_t has no asserted * relation to a linear seek value as specified in zip info headers. In * general it is not a problem if your system has no fseeko/ftello pair * since we can fallback to fseek/ftell which limits the zip disk size * to 2MiBs but the zip-storable seek values are 32bit limited anyway. * * Author: * Guido Draheim * * Copyright (c) 2003,2004 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #define _LARGEFILE_SOURCE 1 #define _ZZIP_ENTRY_STRUCT 1 #include #include #include #include #if defined ZZIP_HAVE_STRING_H #include #elif defined ZZIP_HAVE_STRINGS_H #include #endif #include #include #include #include #include #include #if __STDC_VERSION__+0 > 199900L #define ___ #define ____ #else #define ___ { #define ____ } #endif #ifndef ZZIP_HAVE_FSEEKO #define fseeko fseek #define ftello ftello #endif /* note that the struct zzip_entry inherits the zzip_disk_entry values * and usually carries a copy of its values (in disk format!). To make the * following code more readable, we use a shorthand notation for the * upcast needed in C (not needed in C++) as "disk_(entry)". */ #ifdef __zzip_entry_extends_zzip_disk_entry #define disk_(_entry_) _entry_ #else #define disk_(_entry_) (& (_entry_)->head) #endif /* we try to round all seeks to the pagesize - since we do not use * the sys/mmap interface we have to guess a good value here: */ #define PAGESIZE 8192 /* ====================================================================== */ /* helper functions */ /** => zzip_entry_data_offset * This functions read the correspoding struct zzip_file_header from * the zip disk of the given "entry". The returned off_t points to the * end of the file_header where the current fseek pointer has stopped. * This is used to immediatly parse out any filename/extras block following * the file_header. The return value is null on error. */ static zzip_off_t zzip_entry_fread_file_header (ZZIP_ENTRY* entry, struct zzip_file_header* file_header) { if (! entry || ! file_header) return 0; ___ zzip_off_t offset = zzip_disk_entry_fileoffset (disk_(entry)); if (0 > offset || offset >= entry->disksize) return 0; fseeko (entry->diskfile, offset, SEEK_SET); return (fread (file_header, sizeof(*file_header), 1, entry->diskfile) ? offset+sizeof(*file_header) : 0 ); ____; } /** helper functions for (fseeko) zip access api * * This functions returns the seekval offset of the data portion of the * file referenced by the given zzip_entry. It requires an intermediate * check of the file_header structure (i.e. it reads it from disk). After * this call, the contained diskfile readposition is already set to the * data_offset returned here. On error -1 is returned. */ zzip_off_t zzip_entry_data_offset(ZZIP_ENTRY* entry) { struct zzip_file_header file_header; if (! entry) return -1; ___ zzip_off_t offset = zzip_entry_fread_file_header (entry, & file_header); if (! offset) return -1; offset += zzip_file_header_sizeof_tails (& file_header); fseeko (entry->diskfile, offset, SEEK_SET); return offset; ____; } /** => zzip_entry_data_offset * This function is a big helper despite its little name: in a zip file the * encoded filenames are usually NOT zero-terminated but for common usage * with libc we need it that way. Secondly, the filename SHOULD be present * in the zip central directory but if not then we fallback to the filename * given in the file_header of each compressed data portion. */ zzip__new__ char* zzip_entry_strdup_name(ZZIP_ENTRY* entry) { if (! entry) return 0; ___ zzip_size_t len; if ((len = zzip_disk_entry_namlen (disk_(entry)))) { char* name = (char*)malloc (len+1); if (! name) return 0; memcpy (name, entry->tail, len); name[len] = '\0'; return name; } ___ auto struct zzip_file_header header; if (zzip_entry_fread_file_header (entry, &header) && ( len = zzip_file_header_namlen(&header) )) { char* name = (char*)malloc (len+1); if (! name) return 0; fread (name, 1, len, entry->diskfile); name[len] = '\0'; return name; } return 0; ____;____; } static int prescan_entry(ZZIP_ENTRY* entry) { assert (entry); ___ zzip_off_t tailsize = zzip_disk_entry_sizeof_tails (disk_(entry)); if (tailsize+1 > entry->tailalloc) { char* newtail = (char*)realloc (entry->tail, tailsize+1); if (! newtail) return ENOMEM; entry->tail = newtail; entry->tailalloc = tailsize+1; } fread (entry->tail, 1, tailsize, entry->diskfile); /* name + comment + extras */ return 0; ____; } static void prescan_clear(ZZIP_ENTRY* entry) { assert (entry); if (entry->tail) free (entry->tail); entry->tail = 0; entry->tailalloc = 0; } /* ====================================================================== */ /** => zzip_entry_findfile * * This function is the first call of all the zip access functions here. * It contains the code to find the first entry of the zip central directory. * Here we require the stdio handle to represent a real zip file where the * disk_trailer is _last_ in the file area, so that its position would be at * a fixed offset from the end of the file area if not for the comment field * allowed to be of variable length (which needs us to do a little search * for the disk_tailer). However, in this simple implementation we disregard * any disk_trailer info telling about multidisk archives, so we just return * a pointer to the first entry in the zip central directory of that file. * * For an actual means, we are going to search backwards from the end * of the mmaped block looking for the PK-magic signature of a * disk_trailer. If we see one then we check the rootseek value to * find the first disk_entry of the root central directory. If we find * the correct PK-magic signature of a disk_entry over there then we * assume we are done and we are going to return a pointer to that label. * * The return value is a pointer to the first zzip_disk_entry being checked * to be within the bounds of the file area specified by the arguments. If * no disk_trailer was found then null is returned, and likewise we only * accept a disk_trailer with a seekvalue that points to a disk_entry and * both parts have valid PK-magic parts. Beyond some sanity check we try to * catch a common brokeness with zip archives that still allows us to find * the start of the zip central directory. */ zzip__new__ ZZIP_ENTRY* zzip_entry_findfirst(FILE* disk) { ___ zzip_off_t mapoffs; ___ zzip_off_t mapsize; if (! disk) return 0; fseeko (disk, 0, SEEK_END); ___ zzip_off_t disksize = ftell/*o*/ (disk); if (disksize < (zzip_off_t) sizeof(struct zzip_disk_trailer)) return 0; /* we read out chunks of 8 KiB in the hope to match disk granularity */ ___ zzip_off_t pagesize = PAGESIZE; /* getpagesize() */ ___ ZZIP_ENTRY* entry = (ZZIP_ENTRY*)malloc (sizeof(*entry)); if (! entry) return 0; ___ unsigned char* buffer = (unsigned char*)malloc (pagesize); if (! buffer) goto nomem; assert (pagesize/2 > (zzip_off_t) sizeof (struct zzip_disk_trailer)); /* at each step, we will fread a pagesize block which overlaps with the * previous read by means of pagesize/2 step at the end of the while(1) */ mapoffs = disksize &~ (pagesize-1); mapsize = disksize - mapoffs; if (mapoffs && mapsize < pagesize/2) { mapoffs -= pagesize/2; mapsize += pagesize/2; } while(1) { fseeko (disk, mapoffs, SEEK_SET); fread (buffer, 1, mapsize, disk); ___ unsigned char* p = buffer + mapsize - sizeof(struct zzip_disk_trailer); for (; p >= buffer ; p--) { zzip_off_t root; /* (struct zzip_disk_entry*) */ if (zzip_disk_trailer_check_magic(p)) { root = zzip_disk_trailer_rootseek ( (struct zzip_disk_trailer*)p); if (root > disksize - (long)sizeof(struct zzip_disk_trailer)) { /* first disk_entry is after the disk_trailer? can't be! */ zzip_off_t rootsize = zzip_disk_trailer_rootsize ( (struct zzip_disk_trailer*)p); if (rootsize > mapoffs) continue; /* a common brokeness that can be fixed: we just assume the * central directory was written directly before : */ root = mapoffs - rootsize; } } else if (zzip_disk64_trailer_check_magic(p)) { if (sizeof(zzip_off_t) < 8) return 0; root = zzip_disk64_trailer_rootseek ( (struct zzip_disk64_trailer*)p); } else continue; assert (0 <= root && root < mapsize); fseeko (disk, root, SEEK_SET); fread (disk_(entry), 1, sizeof(*disk_(entry)), disk); if (zzip_disk_entry_check_magic(entry)) { free (buffer); entry->headseek = root; entry->diskfile = disk; entry->disksize = disksize; if (prescan_entry(entry)) goto nomem; return entry; } } ____; if (! mapoffs) break; assert (mapsize >= pagesize/2); mapoffs -= pagesize/2; /* mapsize += pagesize/2; */ mapsize = pagesize; /* if (mapsize > pagesize) ... */ if (disksize - mapoffs > 64*1024) break; } free (buffer); nomem: free (entry); ____;____;____;____;____;____; return 0; } /** => zzip_entry_findfile * * This function takes an existing "entry" in the central root directory * (e.g. from zzip_entry_findfirst) and moves it to point to the next entry. * On error it returns 0, otherwise the old entry. If no further match is * found then null is returned and the entry already free()d. If you want * to stop searching for matches before that case then please call * => zzip_entry_free on the cursor struct ZZIP_ENTRY. */ zzip__new__ ZZIP_ENTRY* zzip_entry_findnext(ZZIP_ENTRY* _zzip_restrict entry) { ___ zzip_off_t seek; if (! entry) return entry; if (! zzip_disk_entry_check_magic (entry)) goto err; seek = entry->headseek + zzip_disk_entry_sizeto_end (disk_(entry)); if (seek + (zzip_off_t) sizeof(*disk_(entry)) > entry->disksize) goto err; fseeko (entry->diskfile, seek, SEEK_SET); fread (disk_(entry), 1, sizeof(*disk_(entry)), entry->diskfile); entry->headseek = seek; if (! zzip_disk_entry_check_magic (entry)) goto err; if (prescan_entry(entry)) goto err; return entry; err: zzip_entry_free (entry); return 0; ____; } /** => zzip_entry_findfile * this function releases the malloc()ed areas needed for zzip_entry, the * pointer is invalid afterwards. This function has #define synonyms of * zzip_entry_findlast(), zzip_entry_findlastfile(), zzip_entry_findlastmatch() */ int zzip_entry_free(ZZIP_ENTRY* entry) { if (! entry) return 0; prescan_clear (entry); free (entry); return 1; } /** search for files in the (fseeko) zip central directory * * This function is given a filename as an additional argument, to find the * disk_entry matching a given filename. The compare-function is usually * strcmp or strcasecmp or perhaps strcoll, if null then strcmp is used. * - use null as argument for "old"-entry when searching the first * matching entry, otherwise the last returned value if you look for other * entries with a special "compare" function (if null then a doubled search * is rather useless with this variant of _findfile). If no further entry is * found then null is returned and any "old"-entry gets already free()d. */ zzip__new__ ZZIP_ENTRY* zzip_entry_findfile(FILE* disk, char* filename, ZZIP_ENTRY* _zzip_restrict entry, zzip_strcmp_fn_t compare) { if (! filename || ! disk) return 0; entry = ( ! entry ) ? zzip_entry_findfirst (disk) : zzip_entry_findnext (entry); if (! compare) compare = (zzip_strcmp_fn_t)(strcmp); for (; entry ; entry = zzip_entry_findnext (entry)) { /* filenames within zip files are often not null-terminated! */ char* realname = zzip_entry_strdup_name (entry); if (! realname) continue; if (! compare (filename, realname)) { free (realname); return entry; } else { free (realname); continue; } } return 0; } //#ifdef ZZIP_HAVE_FNMATCH_H //#define _zzip_fnmatch fnmatch //# ifdef FNM_CASEFOLD //# define _zzip_fnmatch_CASEFOLD FNM_CASEFOLD //# else //# define _zzip_fnmatch_CASEFOLD 0 //# endif //#else //# define _zzip_fnmatch_CASEFOLD 0 ///* if your system does not have fnmatch, we fall back to strcmp: */ //static int _zzip_fnmatch(char* pattern, char* string, int flags) //{ // puts (""); // return strcmp (pattern, string); //} //#endif /** => zzip_entry_findfile * * This function uses a compare-function with an additional argument * and it is called just like fnmatch(3) from POSIX.2 AD:1993), i.e. * the argument filespec first and the ziplocal filename second with * the integer-flags put in as third to the indirect call. If the * platform has fnmatch available then null-compare will use that one * and otherwise we fall back to mere strcmp, so if you need fnmatch * searching then please provide an implementation somewhere else. * - use null as argument for "after"-entry when searching the first * matching entry, or the last disk_entry return-value to find the * next entry matching the given filespec. If no further entry is * found then null is returned and any "old"-entry gets already free()d. */ zzip__new__ ZZIP_ENTRY* zzip_entry_findmatch(FILE* disk, char* filespec, ZZIP_ENTRY* _zzip_restrict entry, zzip_fnmatch_fn_t compare, int flags) { if (! filespec || ! disk) return 0; entry = ( ! entry ) ? zzip_entry_findfirst (disk) : zzip_entry_findnext (entry); if (! compare) compare = (zzip_fnmatch_fn_t) _zzip_fnmatch; for (; entry ; entry = zzip_entry_findnext (entry)) { /* filenames within zip files are often not null-terminated! */ char* realname = zzip_entry_strdup_name (entry); if (! realname) continue; if (! compare (filespec, realname, flags)) { free (realname); return entry; } else { free (realname); continue; } } return 0; } /* ====================================================================== */ /** * typedef struct zzip_disk_file ZZIP_ENTRY_FILE; */ struct zzip_entry_file /* : zzip_file_header */ { struct zzip_file_header header; /* fopen detected header */ ZZIP_ENTRY* entry; /* fopen entry */ zzip_off_t data; /* for stored blocks */ zzip_size_t avail; /* memorized for checks on EOF */ zzip_size_t compressed; /* compressed flag and datasize */ zzip_size_t dataoff; /* offset from data start */ z_stream zlib; /* for inflated blocks */ unsigned char buffer[PAGESIZE]; /* work buffer for inflate algorithm */ }; /** open a file within a zip disk for reading * * This function does take an "entry" argument and copies it (or just takes * it over as owner) to a new ZZIP_ENTRY_FILE handle structure. That * structure contains also a zlib buffer for decoding. This function does * seek to the file_header of the given "entry" and validates it for the * data buffer following it. We do also prefetch some data from the data * buffer thereby trying to match the disk pagesize for faster access later. * The => zzip_entry_fread will then read in chunks of pagesizes which is * the size of the internal readahead buffer. If an error occurs then null * is returned. */ zzip__new__ ZZIP_ENTRY_FILE* zzip_entry_fopen (ZZIP_ENTRY* entry, int takeover) { if (! entry) return 0; if (! takeover) { ZZIP_ENTRY* found = (ZZIP_ENTRY*)malloc (sizeof(*entry)); if (! found) return 0; memcpy (found, entry, sizeof(*entry)); /* prescan_copy */ found->tail = (char*)malloc (found->tailalloc); if (! found->tail) { free (found); return 0; } memcpy (found->tail, entry->tail, entry->tailalloc); entry = found; } ___ ZZIP_ENTRY_FILE* file = (ZZIP_ENTRY_FILE*)malloc(sizeof(*file)); if (! file) goto fail1; file->entry = entry; if (! zzip_entry_fread_file_header (entry, &file->header)) goto fail2; file->avail = zzip_file_header_usize (&file->header); file->data = zzip_entry_data_offset (entry); file->dataoff = 0; if (! file->avail || zzip_file_header_data_stored (&file->header)) { file->compressed = 0; return file; } file->compressed = zzip_file_header_csize (&file->header); file->zlib.opaque = 0; file->zlib.zalloc = Z_NULL; file->zlib.zfree = Z_NULL; ___ zzip_off_t seek = file->data; seek += sizeof(file->buffer); seek -= seek & (sizeof(file->buffer)-1); assert (file->data < seek); /* pre-read to next PAGESIZE boundary... */ fseeko (file->entry->diskfile, file->data + file->dataoff, SEEK_SET); file->zlib.next_in = file->buffer; file->zlib.avail_in = fread (file->buffer, 1, seek - file->data, file->entry->diskfile); file->dataoff += file->zlib.avail_in; ____; if (! zzip_file_header_data_deflated (&file->header) || inflateInit2 (& file->zlib, -MAX_WBITS) != Z_OK) goto fail2; return file; fail2: free (file); fail1: zzip_entry_free (entry); return 0; ____; } /** => zzip_entry_fopen * * This function opens a file found by name, so it does a search into * the zip central directory with => zzip_entry_findfile and whatever * is found first is given to => zzip_entry_fopen */ zzip__new__ ZZIP_ENTRY_FILE* zzip_entry_ffile (FILE* disk, char* filename) { ZZIP_ENTRY* entry = zzip_entry_findfile (disk, filename, 0, 0); if (! entry) return 0; return zzip_entry_fopen (entry, 1); } /** => zzip_entry_fopen * * This function reads more bytes into the output buffer specified as * arguments. The return value is null on eof or error, the stdio-like * interface can not distinguish between these so you need to check * with => zzip_entry_feof for the difference. */ zzip_size_t zzip_entry_fread (void* ptr, zzip_size_t sized, zzip_size_t nmemb, ZZIP_ENTRY_FILE* file) { if (! file) return 0; ___ zzip_size_t size = sized*nmemb; if (! file->compressed) { if (size > file->avail) size = file->avail; fread (ptr, 1, size, file->entry->diskfile); file->dataoff += size; file->avail -= size; return size; } file->zlib.avail_out = size; file->zlib.next_out = (Bytef*)ptr; ___ zzip_size_t total_old = file->zlib.total_out; while (1) { if (! file->zlib.avail_in) { size = file->compressed - file->dataoff; if (size > sizeof(file->buffer)) size = sizeof(file->buffer); /* fseek (file->data + file->dataoff, file->entry->diskfile); */ file->zlib.avail_in = fread (file->buffer, 1, size, file->entry->diskfile); file->zlib.next_in = file->buffer; file->dataoff += file->zlib.avail_in; } if (! file->zlib.avail_in) return 0; ___ int err = inflate (& file->zlib, Z_NO_FLUSH); if (err == Z_STREAM_END) file->avail = 0; else if (err == Z_OK) file->avail -= file->zlib.total_out - total_old; else return 0; ____; if (file->zlib.avail_out && ! file->zlib.avail_in) continue; return file->zlib.total_out - total_old; }____;____; } /** => zzip_entry_fopen * This function releases any zlib decoder info needed for decompression * and dumps the ZZIP_ENTRY_FILE struct then. */ int zzip_entry_fclose (ZZIP_ENTRY_FILE* file) { if (! file) return 0; if (file->compressed) inflateEnd (& file->zlib); zzip_entry_free (file->entry); free (file); return 0; } /** => zzip_entry_fopen * * This function allows to distinguish an error from an eof condition. * Actually, if we found an error but we did already reach eof then we * just keep on saying that it was an eof, so the app can just continue. */ int zzip_entry_feof (ZZIP_ENTRY_FILE* file) { return ! file || ! file->avail; } milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/plugin.cpp0000644000175000017500000000335210737746457024703 0ustar admin2admin2/* * Author: * Guido Draheim * Mike Nordell * * Copyright (c) 2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #include #include #include "MyIO.h" #include #include #include #include #ifdef DEBUG #include #endif #include #include zzip_off_t zzip_filesize(__zzipfd fd) { struct stat st; if (fstat(fd, &st) < 0) return -1; # if defined DEBUG && ! defined _WIN32 if (! st.st_size && st.st_blocks > 1) /* seen on some darwin 10.1 machines */ fprintf(stderr, "broken fstat(2) ?? st_size=%ld st_blocks=%ld\n", (long) st.st_size, (long) st.st_blocks); # endif return st.st_size; } static const struct zzip_plugin_io default_io = { &Myopen, &Myclose, &Myread, &Mylseek, &Myfsize, 1, 1, /*&_zzip_write*/NULL }; /** => zzip_init_io * This function returns a zzip_plugin_io_t handle to static defaults * wrapping the posix io file functions for actual file access. */ zzip_plugin_io_t zzip_get_default_io() { return (zzip_plugin_io_t) &default_io; } /** * This function initializes the users handler struct to default values * being the posix io functions in default configured environments. */ int zzip_init_io(zzip_plugin_io_handlers_t io, int flags) { if (!io) { return ZZIP_ERROR; } memcpy(io, &default_io, sizeof(default_io)); io->fd.sys = flags; return 0; } /* * Local variables: * c-file-style: "stroustrup" * End: */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/dir.cpp0000644000175000017500000001614110737746457024163 0ustar admin2admin2/* * Author: * Guido Draheim * * Copyright (c) 1999,2000,2001,2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #include /* exported... */ #include #include /*offsetof*/ #include #include #include #ifdef ZZIP_HAVE_SYS_STAT_H #include #else #include #endif #include #ifndef offsetof #pragma warning had to DEFINE offsetof as it was not in stddef.h #define offsetof(T,M) ((unsigned)(& ((T*)0)->M)) #endif #ifdef ZZIP_HAVE_SYS_STAT_H /* MSVC does have IFbitmask but not the corresponding IStests */ # if !defined S_ISDIR && defined S_IFDIR # define S_ISDIR(_X_) ((_X_) & S_IFDIR) # endif # if !defined S_ISREG && defined S_IFREG # define S_ISREG(_X_) ((_X_) & S_IFREG) # endif #endif /** * This function is the equivalent of a => rewinddir(2) for a realdir or * the zipfile in place of a directory. The ZZIP_DIR handle returned from * => zzip_opendir has a flag saying realdir or zipfile. As for a zipfile, * the filenames will include the filesubpath, so take care. */ void zzip_rewinddir(ZZIP_DIR * dir) { if (! dir) return; if (USE_DIRENT && dir->realdir) { _zzip_rewinddir((DIR*)dir->realdir); return; } if (dir->hdr0) dir->hdr = dir->hdr0; else dir->hdr = 0; } #if ! USE_DIRENT #define real_readdir(_X_) 1 #else static int real_readdir(ZZIP_DIR* dir) { struct stat st = { 0 }; char filename[PATH_MAX]; struct dirent* dirent = _zzip_readdir((DIR*)dir->realdir); if (! dirent) return 0; dir->dirent.d_name = dirent->d_name; strcpy(filename, dir->realname); strcat(filename, "/"); strcat(filename, dirent->d_name); if (stat(filename, &st) == -1) return -1; dir->dirent.d_csize = dir->dirent.st_size = st.st_size; if (st.st_mode) { if (! S_ISREG(st.st_mode)) { dir->dirent.d_compr = st.st_mode; dir->dirent.d_compr |= 0x80000000; /* makes it effectively negative, * but can still be fed to S_ISXXX(x) */ }else { dir->dirent.d_compr = 0; /* stored */ } }else { dir->dirent.d_compr = 0; /* stored */ } return 1; } #endif /** * This function is the equivalent of a => readdir(2) for a realdir * or a zipfile referenced by the ZZIP_DIR returned from => zzip_opendir. * * The ZZIP_DIR handle (as returned by => zzip_opendir) contains a few more * entries than being copied into the ZZIP_DIRENT. The only valid fields in * a ZZIP_DIRENT are d_name (the file name), d_compr (compression), d_csize * (compressed size), st_size (uncompressed size). */ ZZIP_DIRENT* zzip_readdir(ZZIP_DIR * dir) { if (! dir) { errno=EBADF; return 0; } if (USE_DIRENT && dir->realdir) { if (! real_readdir(dir)) return 0; }else { if (! dir->hdr) return 0; dir->dirent.d_name = dir->hdr->d_name; dir->dirent.d_compr = dir->hdr->d_compr; dir->dirent.d_csize = dir->hdr->d_csize; dir->dirent.st_size = dir->hdr->d_usize; if (! dir->hdr->d_reclen) dir->hdr = 0; else dir->hdr = (struct zzip_dir_hdr *) ((char *)dir->hdr + dir->hdr->d_reclen); } return &dir->dirent; } /** => zzip_rewinddir * This function is the equivalent of => telldir(2) for a realdir or zipfile. */ zzip_off_t zzip_telldir(ZZIP_DIR* dir) { if (! dir) { errno=EBADF; return -1; } if (USE_DIRENT && dir->realdir) { return _zzip_telldir((DIR*)dir->realdir); }else { return ((zzip_off_t) ((char*) dir->hdr - (char*) dir->hdr0)); } } /** => zzip_rewinddir * This function is the equivalent of => seekdir(2) for a realdir or zipfile. */ void zzip_seekdir(ZZIP_DIR* dir, zzip_off_t offset) { if (! dir) return; if (USE_DIRENT && dir->realdir) { _zzip_seekdir((DIR*)dir->realdir, offset); }else { dir->hdr = (struct zzip_dir_hdr*) (dir->hdr0 ? (char*) dir->hdr0 + (size_t) offset : 0); } } #if defined ZZIP_LARGEFILE_RENAME && defined EOVERFLOW && defined PIC #undef zzip_seekdir /* zzip_seekdir64 */ #undef zzip_telldir /* zzip_telldir64 */ long zzip_telldir(ZZIP_DIR* dir); void zzip_seekdir(ZZIP_DIR* dir, long offset); /* DLL compatibility layer - so that 32bit code can link with this lib too */ long zzip_telldir(ZZIP_DIR* dir) { off_t off = zzip_telldir64 (dir); long offs = off; if (offs != off) { errno = EOVERFLOW; return -1; } return offs; } void zzip_seekdir(ZZIP_DIR* dir, long offset) { zzip_seekdir64 (dir, offset); } #endif /** * This function is the equivalent of => opendir(3) for a realdir or zipfile. * * This function has some magic - if the given argument-path * is a directory, it will wrap a real => opendir(3) into the ZZIP_DIR * structure. Otherwise it will divert to => zzip_dir_open which * can also attach a ".zip" extension if needed to find the archive. * * the error-code is mapped to => errno(3). */ ZZIP_DIR* zzip_opendir(zzip_char_t* filename) { return zzip_opendir_ext_io (filename, 0, 0, 0); } /** => zzip_opendir * This function uses explicit ext and io instead of the internal * defaults, setting them to zero is equivalent to => zzip_opendir */ ZZIP_DIR* zzip_opendir_ext_io(zzip_char_t* filename, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io) { zzip_error_t e; ZZIP_DIR* dir; # ifdef ZZIP_HAVE_SYS_STAT_H struct stat st; # endif if (o_modes & (ZZIP_PREFERZIP|ZZIP_ONLYZIP)) goto try_zzip; try_real: # ifdef ZZIP_HAVE_SYS_STAT_H if (stat(filename, &st) >= 0 && S_ISDIR(st.st_mode) ){ if (USE_DIRENT) { _zzip_DIR* realdir = _zzip_opendir(filename); if (realdir) { if (! (dir = (ZZIP_DIR *)calloc(1, sizeof (*dir)))) { _zzip_closedir(realdir); return 0; }else { dir->realdir = realdir; dir->realname = strdup(filename); return dir; } } } return 0; } # endif /* HAVE_SYS_STAT_H */ try_zzip: dir = zzip_dir_open_ext_io (filename, &e, ext, io); if (! dir && (o_modes & ZZIP_PREFERZIP)) goto try_real; if (e) errno = zzip_errno(e); return dir; } /** * This function is the equivalent of => closedir(3) for a realdir or zipfile. * * This function is magic - if the given arg-ZZIP_DIR * is a real directory, it will call the real => closedir(3) and then * free the wrapping ZZIP_DIR structure. Otherwise it will divert * to => zzip_dir_close which will free the ZZIP_DIR structure. */ int zzip_closedir(ZZIP_DIR* dir) { if (! dir) { errno = EBADF; return -1; } if (USE_DIRENT && dir->realdir) { _zzip_closedir((DIR*)dir->realdir); free(dir->realname); free(dir); return 0; }else { zzip_dir_close(dir); return 0; } } /* * Local variables: * c-file-style: "stroustrup" * End: */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_stdint.h0000644000175000017500000000301710737746457025431 0ustar admin2admin2#ifndef _ZZIP__STDINT_H /* zzip-stdint.h */ #define _ZZIP__STDINT_H 1 /* this file ensures that we have some kind of typedef declarations for unsigned C9X typedefs. The ISO C 9X: 7.18 Integer types file is stdint.h */ #include /* enforce use of ifdef'd C9X entries in system headers */ #define __USE_ANSI 1 #define __USE_ISOC9X 1 #ifdef ZZIP_HAVE_STDINT_H /* ISO C 9X: 7.18 Integer types */ #include #elif defined ZZIP_HAVE_SYS_INT_TYPES_H /*solaris*/ #include #elif defined ZZIP_HAVE_INTTYPES_H /*freebsd*/ #include #else typedef unsigned char uint8_t; typedef signed char int8_t; # if ZZIP_SIZEOF_INT && ZZIP_SIZEOF_INT == 2 typedef unsigned int uint16_t; typedef signed int int16_t; # elif ZZIP_SIZEOF_SHORT && ZZIP_SIZEOF_SHORT == 2 typedef unsigned short uint16_t; typedef signed short int16_t; # else # error unable to typedef int16_t from either int or short typedef unsigned short uint16_t; typedef signed short int16_t; # endif # if defined ZZIP_SIZEOF_INT && ZZIP_SIZEOF_INT == 4 typedef unsigned int uint32_t; typedef signed int int32_t; # elif defined ZZIP_SIZEOF_LONG && ZZIP_SIZEOF_LONG == 4 typedef unsigned long uint32_t; typedef signed long int32_t; # else # error unable to typedef int32_t from either int or long typedef unsigned long uint32_t; typedef signed long int32_t; # endif typedef unsigned _zzip___int64 uint64_t; typedef _zzip___int64 int64_t; #endif #endif /*_ZZIP_STDINT_H*/ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zip.cpp0000644000175000017500000006037710737746457024221 0ustar admin2admin2/* * Author: * Guido Draheim * Tomi Ollila * * Copyright (c) 1999,2000,2001,2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #include /* archive handling */ #include #include #include #include #include #include #include #include #ifdef ZZIP_HAVE_SYS_STAT_H #include #endif #include #include #define __sizeof(X) ((zzip_ssize_t)(sizeof(X))) /* per default, we use a little hack to correct bad z_rootseek parts */ #define ZZIP_CORRECT_ROOTSEEK 1 #if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ >= 4) # ifdef DEBUG # warning suppress a warning where the compiler should have optimized instead. # endif #define _255 254 #else #define _255 255 #endif #define ZZIP_DISK64_TRAILER #ifdef ZZIP_DISK64_TRAILER struct _disk_trailer { void* zz_tail; void* zz_for_correct_rootseek; // ZZIP_CORRECT_ROOTSEEK zzip_off64_t zz_entries; zzip_off64_t zz_finalentries; zzip_off64_t zz_rootseek; zzip_off64_t zz_rootsize; }; #define _disk_trailer_entries(__p) ((__p)->zz_entries) #define _disk_trailer_localentries(__p) ((__p)->zz_entries) #define _disk_trailer_finalentries(__p) ((__p)->zz_entries) #define _disk_trailer_rootseek(__p) ((__p)->zz_rootseek) #define _disk_trailer_rootsize(__p) ((__p)->zz_rootsize) #define _disk_trailer_set_rootseek(__p,__v) ((__p)->rootseek = (__v)) #else #define _disk_trailer zzip_disk_trailer #define _disk_trailer_entries zzip_disk_trailer_entries #define _disk_trailer_localentries zzip_disk_trailer_localentries #define _disk_trailer_finalentries zzip_disk_trailer_finalentries #define _disk_trailer_rootseek zzip_disk_trailer_rootseek #define _disk_trailer_rootsize zzip_disk_trailer_rootsize #define _disk_trailer_set_rootseek zzip_disk_trailer_set_rootseek #define __zzip_fetch_disk_trailer __zzip_find_disk_trailer #endif /* --------------------------- internals -------------------------------- */ /* internal functions of zziplib, avoid at all cost, changes w/o warning. * we do export them for debugging purpose and special external tools * which know what they do and which can adapt from version to version */ int __zzip_fetch_disk_trailer( __zzipfd fd, zzip_off_t filesize, struct _disk_trailer * _zzip_restrict trailer, zzip_plugin_io_t io); int __zzip_parse_root_directory( __zzipfd fd, struct _disk_trailer * trailer, struct zzip_dir_hdr ** hdr_return, zzip_plugin_io_t io); _zzip_inline char* __zzip_aligned4(char* p); /* ------------------------ harden routines ------------------------------ */ #ifdef ZZIP_HARDEN /* * check for inconsistent values in trailer and prefer lower seek value * - we fix values assuming the root directory was written at the end * and it is just before the zip trailer. Therefore, ... */ _zzip_inline static void __fixup_rootseek( zzip_off_t offset_of_trailer, struct _disk_trailer* trailer) { if ( _disk_trailer_rootseek (trailer) > offset_of_trailer - _disk_trailer_rootsize (trailer) && offset_of_trailer > _disk_trailer_rootsize (trailer)) { register zzip_off_t offset; offset = offset_of_trailer - _disk_trailer_rootsize (trailer); _disk_trailer_set_rootseek (trailer, offset); HINT2("new rootseek=%li", (long) _disk_trailer_rootseek (trailer)); } } #define __correct_rootseek(A,B,C) #elif defined ZZIP_CORRECT_ROOTSEEK /* store the seekvalue of the trailer into the "z_magic" field and with * a 64bit off_t we overwrite z_disk/z_finaldisk as well. If you change * anything in zziplib or dump the trailer structure then watch out that * these are still unused, so that this code may still (ab)use those. */ #define __fixup_rootseek(_offset_of_trailer, _trailer) \ *(zzip_off_t*)_trailer = _offset_of_trailer; #define __correct_rootseek( _u_rootseek, _u_rootsize, _trailer) \ if (_u_rootseek > *(zzip_off_t*)_trailer - _u_rootsize) \ _u_rootseek = *(zzip_off_t*)_trailer - _u_rootsize; #else #define __fixup_rootseek(A,B) #define __correct_rootseek(A,B,C) #endif #ifdef DEBUG _zzip_inline static void __debug_dir_hdr (struct zzip_dir_hdr* hdr) { if (sizeof(struct zzip_dir_hdr) > sizeof(struct zzip_disk_entry)) { WARN1("internal sizeof-mismatch may break wreakage"); } /* the internal directory structure is never bigger than the * external zip central directory space had been beforehand * (as long as the following assertion holds...) */ if (((zzip_off_t)hdr)&3) { NOTE1("this machine's malloc(3) returns sth. not u32-aligned"); } /* we assume that if this machine's malloc has returned a non-aligned * memory block, then it is actually safe to access misaligned data, and * since it does only affect the first hdr it should not even bring about * too much of that cpu's speed penalty */ } #else #define __debug_dir_hdr(X) #endif /* -------------------------- low-level interface -------------------------- */ #if defined BUFSIZ #if BUFSIZ == 1024 || BUFSIZ == 512 || BUFSIZ == 256 #define ZZIP_BUFSIZ BUFSIZ #endif #endif #ifndef ZZIP_BUFSIZ #define ZZIP_BUFSIZ 512 /* #define ZZIP_BUFSIZ 64 */ /* for testing */ #endif /** * This function is used by => zzip_file_open. It tries to find * the zip's central directory info that is usually a few * bytes off the end of the file. */ int __zzip_fetch_disk_trailer(__zzipfd fd, zzip_off_t filesize, struct _disk_trailer * _zzip_restrict trailer, zzip_plugin_io_t io) { #ifdef DEBUG #define return(val) { e=val; HINT2("%s", zzip_strerror(e)); goto cleanup; } #else #define return(val) { e=val; goto cleanup; } #endif register int e; #ifndef _LOWSTK auto char buffer[2*ZZIP_BUFSIZ]; char* buf = buffer; #else char* buf = malloc(2*ZZIP_BUFSIZ); #endif zzip_off_t offset = 0; zzip_ssize_t maplen = 0; /* mmap(),read(),getpagesize() use size_t !! */ char* fd_map = 0; if (!trailer) { return(EINVAL); } if (filesize < __sizeof(struct zzip_disk_trailer)) { return(ZZIP_DIR_TOO_SHORT); } if (!buf) { return(ZZIP_OUTOFMEM); } offset = filesize; /* a.k.a. old offset */ while(1) /* outer loop */ { register unsigned char* mapped; if (offset <= 0) { return(ZZIP_DIR_EDH_MISSING); } /* trailer cannot be farther away than 64K from fileend */ if (filesize-offset > 64*1024) { return(ZZIP_DIR_EDH_MISSING); } /* the new offset shall overlap with the area after the old offset! */ if (USE_MMAP && io->fd.sys) { zzip_off_t mapoff = offset; { zzip_ssize_t pagesize = _zzip_getpagesize (io->fd.sys); if (pagesize < ZZIP_BUFSIZ) goto non_mmap; /* an error? */ if (mapoff == filesize && filesize > pagesize) mapoff -= pagesize; if (mapoff < pagesize) { maplen = (zzip_ssize_t)mapoff + pagesize; mapoff = 0; } else { mapoff -= pagesize; maplen = 2*pagesize; if ((zzip_ssize_t)mapoff & (pagesize-1)) { /*only 1. run */ pagesize -= (zzip_ssize_t)mapoff & (pagesize-1); mapoff += pagesize; maplen -= pagesize; } } if (mapoff + maplen > filesize) maplen = filesize - mapoff; } fd_map = _zzip_mmap(io->fd.sys, fd, mapoff, (zzip_size_t)maplen); if (fd_map == MAP_FAILED) goto non_mmap; mapped = (unsigned char*) fd_map; offset = mapoff; /* success */ HINT3("mapped *%p len=%li", fd_map, (long) maplen); } else { non_mmap: fd_map = 0; /* have no mmap */ { zzip_off_t pagesize = ZZIP_BUFSIZ; if (offset == filesize && filesize > pagesize) offset -= pagesize; if (offset < pagesize) { maplen = (zzip_ssize_t)offset + pagesize; offset = 0; } else { offset -= pagesize; maplen = 2*pagesize; if ((zzip_ssize_t)offset & (pagesize-1)) { /*on 1st run*/ pagesize -= (zzip_ssize_t)offset & (pagesize-1); offset += pagesize; maplen -= pagesize; } } if (offset + maplen > filesize) maplen = filesize - offset; } if (io->fd.seeks(fd, offset, SEEK_SET) < 0) { return(ZZIP_DIR_SEEK); } if (io->fd.read(fd, buf, (zzip_size_t)maplen) < maplen) { return(ZZIP_DIR_READ); } mapped = (unsigned char*) buf; /* success */ HINT5("offs=$%lx len=%li filesize=%li pagesize=%i", (long)offset, (long)maplen, (long)filesize, ZZIP_BUFSIZ); } {/* now, check for the trailer-magic, hopefully near the end of file */ register unsigned char* end = mapped + maplen; register unsigned char* tail; for (tail = end-1; (tail >= mapped); tail--) { if ((*tail == 'P') && /* quick pre-check for trailer magic */ end-tail >= __sizeof(struct zzip_disk_trailer)-2 && zzip_disk_trailer_check_magic(tail)) { # ifndef ZZIP_DISK64_TRAILER /* if the file-comment is not present, it happens that the z_comment field often isn't either */ if (end-tail >= __sizeof(*trailer)) { memcpy (trailer, tail, sizeof(*trailer)); }else{ memcpy (trailer, tail, sizeof(*trailer)-2); trailer->z_comment[0] = 0; trailer->z_comment[1] = 0; } # else struct zzip_disk_trailer* orig = (struct zzip_disk_trailer*) tail; trailer->zz_tail = tail; trailer->zz_entries = zzip_disk_trailer_localentries (orig); trailer->zz_finalentries = zzip_disk_trailer_finalentries (orig); trailer->zz_rootseek = zzip_disk_trailer_rootseek (orig); trailer->zz_rootsize = zzip_disk_trailer_rootsize (orig); # endif __fixup_rootseek (offset + tail-mapped, trailer); { return(0); } } else if ((*tail == 'P') && end-tail >= __sizeof(struct zzip_disk64_trailer)-2 && zzip_disk64_trailer_check_magic(tail)) { # ifndef ZZIP_DISK64_TRAILER return(ZZIP_DIR_LARGEFILE); # else struct zzip_disk64_trailer* orig = (struct zzip_disk64_trailer*) tail; trailer->zz_tail = tail; trailer->zz_entries = zzip_disk64_trailer_localentries (orig); trailer->zz_finalentries = zzip_disk64_trailer_finalentries (orig); trailer->zz_rootseek = zzip_disk64_trailer_rootseek (orig); trailer->zz_rootsize = zzip_disk64_trailer_rootsize (orig); { return(0); } # endif } } } if (USE_MMAP && fd_map) { HINT3("unmap *%p len=%li", fd_map, (long) maplen); _zzip_munmap(io->fd.sys, fd_map, (zzip_size_t)maplen); fd_map = 0; } } /*outer loop*/ cleanup: if (USE_MMAP && fd_map) { HINT3("unmap *%p len=%li", fd_map, (long) maplen); _zzip_munmap(io->fd.sys, fd_map, (zzip_size_t)maplen); } # ifdef _LOWSTK free(buf); # endif # undef return return e; } /* * making pointer alignments to values that can be handled as structures * is tricky. We assume here that an align(4) is sufficient even for * 64 bit machines. Note that binary operations are not usually allowed * to pointer types but we do need only the lower bits in this implementation, * so we can just cast the value to a long value. */ _zzip_inline char* __zzip_aligned4(char* p) { #define aligned4 __zzip_aligned4 p += ((long)p)&1; /* warnings about truncation of a "pointer" */ p += ((long)p)&2; /* to a "long int" may be safely ignored :) */ return p; } /** * This function is used by => zzip_file_open, it is usually called after * => __zzip_find_disk_trailer. It will parse the zip's central directory * information and create a zziplib private directory table in * memory. */ int __zzip_parse_root_directory(__zzipfd fd, struct _disk_trailer * trailer, struct zzip_dir_hdr ** hdr_return, zzip_plugin_io_t io) { auto struct zzip_disk_entry dirent; struct zzip_dir_hdr * hdr; struct zzip_dir_hdr * hdr0; uint16_t * p_reclen = 0; unsigned long entries; /* 32bit is enough */ zzip_off64_t zz_offset; /* offset from start of root directory */ char* fd_map = 0; zzip_off64_t zz_fd_gap = 0; zzip_off64_t zz_entries = _disk_trailer_localentries (trailer); zzip_off64_t zz_rootsize = _disk_trailer_rootsize (trailer); zzip_off64_t zz_rootseek = _disk_trailer_rootseek (trailer); __correct_rootseek (zz_rootseek, zz_rootsize, trailer); hdr0 = (struct zzip_dir_hdr*) malloc(zz_rootsize); if (!hdr0) return ZZIP_DIRSIZE; hdr = hdr0; __debug_dir_hdr (hdr); if (USE_MMAP && io->fd.sys) { zz_fd_gap = zz_rootseek & (_zzip_getpagesize(io->fd.sys)-1) ; HINT4(" fd_gap=%ld, mapseek=0x%lx, maplen=%ld", (long)(zz_fd_gap), (long)(zz_rootseek-zz_fd_gap), (long)(zz_rootsize+zz_fd_gap)); fd_map = _zzip_mmap(io->fd.sys, fd, zz_rootseek-zz_fd_gap, zz_rootsize+zz_fd_gap); /* if mmap failed we will fallback to seek/read mode */ if (fd_map == MAP_FAILED) { NOTE2("map failed: %s",strerror(errno)); fd_map=0; }else{ HINT3("mapped *%p len=%li", fd_map, (long)(zz_rootsize+zz_fd_gap)); } } for (entries=zz_entries, zz_offset=0; entries; entries--) { register struct zzip_disk_entry * d; uint16_t u_extras, u_comment, u_namlen; if (fd_map) { d = ( struct zzip_disk_entry *)((void*)(fd_map+zz_fd_gap+zz_offset)); } /* fd_map+fd_gap==u_rootseek */ else { if (io->fd.seeks(fd, zz_rootseek+zz_offset, SEEK_SET) < 0) return ZZIP_DIR_SEEK; if (io->fd.read(fd, &dirent, sizeof(dirent)) < __sizeof(dirent)) return ZZIP_DIR_READ; d = &dirent; } if ((zzip_off64_t)(zz_offset+sizeof(*d)) > zz_rootsize || (zzip_off64_t)(zz_offset+sizeof(*d)) < 0) { FAIL4("%li's entry stretches beyond root directory (O:%li R:%li)", (long)entries, (long)(zz_offset), (long)zz_rootsize); break;} # if 0 && defined DEBUG zzip_debug_xbuf ((unsigned char*) d, sizeof(*d) + 8); # endif u_extras = zzip_disk_entry_get_extras (d); u_comment = zzip_disk_entry_get_comment (d); u_namlen = zzip_disk_entry_get_namlen (d); HINT5("offset=0x%lx, size %ld, dirent *%p, hdr %p\n", (long)(zz_offset+zz_rootseek), (long)zz_rootsize, d, hdr); /* writes over the read buffer, Since the structure where data is copied is smaller than the data in buffer this can be done. It is important that the order of setting the fields is considered when filling the structure, so that some data is not trashed in first structure read. at the end the whole copied list of structures is copied into newly allocated buffer */ hdr->d_crc32 = zzip_disk_entry_get_crc32 (d); hdr->d_csize = zzip_disk_entry_get_csize (d); hdr->d_usize = zzip_disk_entry_get_usize (d); hdr->d_off = zzip_disk_entry_get_offset (d); hdr->d_compr = zzip_disk_entry_get_compr (d); if (hdr->d_compr > _255) hdr->d_compr = 255; if ((zzip_off64_t)(zz_offset+sizeof(*d) + u_namlen) > zz_rootsize || (zzip_off64_t)(zz_offset+sizeof(*d) + u_namlen) < 0) { FAIL4("%li's name stretches beyond root directory (O:%li N:%li)", (long)entries, (long)(zz_offset), (long)(u_namlen)); break; } if (fd_map) { memcpy(hdr->d_name, fd_map+zz_fd_gap + zz_offset+sizeof(*d), u_namlen); } else { io->fd.read(fd, hdr->d_name, u_namlen); } hdr->d_name[u_namlen] = '\0'; hdr->d_namlen = u_namlen; /* update offset by the total length of this entry -> next entry */ zz_offset += sizeof(*d) + u_namlen + u_extras + u_comment; if (zz_offset > zz_rootsize) { FAIL3("%li's entry stretches beyond root directory (O:%li)", (long)entries, (long)(zz_offset)); entries--; break; } HINT5("file %ld { compr=%d crc32=$%x offset=%d", (long)entries, hdr->d_compr, hdr->d_crc32, hdr->d_off); HINT5("csize=%d usize=%d namlen=%d extras=%d", hdr->d_csize, hdr->d_usize, u_namlen, u_extras); HINT5("comment=%d name='%s' %s } ", u_comment, hdr->d_name, "",(int) sizeof(*d)); p_reclen = &hdr->d_reclen; { register char* p = (char*) hdr; register char* q = aligned4 (p + sizeof(*hdr) + u_namlen + 1); *p_reclen = (uint16_t)(q - p); hdr = (struct zzip_dir_hdr*) q; } }/*for*/ if (USE_MMAP && fd_map) { HINT3("unmap *%p len=%li", fd_map, (long)(zz_rootsize+zz_fd_gap)); _zzip_munmap(io->fd.sys, fd_map, zz_rootsize+zz_fd_gap); } if (p_reclen) { *p_reclen = 0; /* mark end of list */ if (hdr_return) *hdr_return = hdr0; } /* else zero (sane) entries */ return (entries ? ZZIP_CORRUPTED : 0); } /* ------------------------- high-level interface ------------------------- */ #ifndef O_BINARY #define O_BINARY 0 #endif static zzip_strings_t* zzip_get_default_ext(void) { static zzip_strings_t ext [] = { ".zip", ".ZIP", /* common extension */ # ifdef ZZIP_USE_ZIPLIKES ".pk3", ".PK3", /* ID Software's Quake3 zipfiles */ ".jar", ".JAR", /* Java zipfiles */ # endif 0 }; return ext; } /** * allocate a new ZZIP_DIR handle and do basic * initializations before usage by => zzip_dir_fdopen * => zzip_dir_open => zzip_file_open or through * => zzip_open * (ext==null flags uses { ".zip" , ".ZIP" } ) * (io ==null flags use of posix io defaults) */ ZZIP_DIR* zzip_dir_alloc_ext_io (zzip_strings_t* ext, const zzip_plugin_io_t io) { ZZIP_DIR* dir; if ((dir = (ZZIP_DIR *)calloc(1, sizeof(*dir))) == NULL) return 0; /* dir->fileext is currently unused - so what, still initialize it */ dir->fileext = ext ? ext : zzip_get_default_ext(); dir->io = io ? io : zzip_get_default_io (); return dir; } /** => zzip_dir_alloc_ext_io * this function is obsolete - it was generally used for implementation * and exported to let other code build on it. It is now advised to * use => zzip_dir_alloc_ext_io now on explicitly, just set that second * argument to zero to achieve the same functionality as the old style. */ ZZIP_DIR* zzip_dir_alloc (zzip_strings_t* fileext) { return zzip_dir_alloc_ext_io (fileext, 0); } /** * will free the zzip_dir handle unless there are still * zzip_files attached (that may use its cache buffer). * This is the inverse of => zzip_dir_alloc , and both * are helper functions used implicitly in other zzipcalls * e.g. => zzip_dir_close = zzip_close * * returns zero on sucess * returns the refcount when files are attached. */ int zzip_dir_free(ZZIP_DIR * dir) { if (dir->refcount) return (dir->refcount); /* still open files attached */ if ((signed)dir->fd >= 0) dir->io->fd.close(dir->fd); if (dir->hdr0) free(dir->hdr0); if (dir->cache.fp) free(dir->cache.fp); if (dir->cache.buf32k) free(dir->cache.buf32k); if (dir->realname) free(dir->realname); free(dir); return 0; } /** => zzip_dir_free * It will also => free(2) the => ZZIP_DIR-handle given. * the counterpart for => zzip_dir_open * see also => zzip_dir_free */ int zzip_dir_close(ZZIP_DIR * dir) { dir->refcount &=~ 0x10000000; /* explicit dir close */ return zzip_dir_free(dir); } /** * used by the => zzip_dir_open and zzip_opendir(2) call. Opens the * zip-archive as specified with the fd which points to an * already openend file. This function then search and parse * the zip's central directory. * * NOTE: refcount is zero, so an _open/_close pair will also delete * this _dirhandle */ ZZIP_DIR * zzip_dir_fdopen(__zzipfd fd, zzip_error_t * errcode_p) { return zzip_dir_fdopen_ext_io(fd, errcode_p, 0, 0); } static zzip_error_t __zzip_dir_parse (ZZIP_DIR* dir); /* forward */ /** => zzip_dir_fdopen * this function uses explicit ext and io instead of the internal * defaults, setting these to zero is equivalent to => zzip_dir_fdopen */ ZZIP_DIR * zzip_dir_fdopen_ext_io(__zzipfd fd, zzip_error_t * errcode_p, zzip_strings_t* ext, const zzip_plugin_io_t io) { zzip_error_t rv; ZZIP_DIR * dir; if ((dir = zzip_dir_alloc_ext_io (ext, io)) == NULL) { rv = ZZIP_OUTOFMEM; goto error; } dir->fd = fd; if ((rv = __zzip_dir_parse (dir))) goto error; dir->hdr = dir->hdr0; dir->refcount |= 0x10000000; if (errcode_p) *errcode_p = rv; return dir; error: if (dir) zzip_dir_free(dir); if (errcode_p) *errcode_p = rv; return NULL; } static zzip_error_t __zzip_dir_parse (ZZIP_DIR* dir) { zzip_error_t rv; zzip_off_t filesize; struct _disk_trailer trailer; /* if (! dir || dir->fd < 0) * { rv = EINVAL; goto error; } */ HINT2("------------------ fd=%i", (int) dir->fd); if ((filesize = dir->io->fd.filesize(dir->fd)) < 0) { rv = ZZIP_DIR_STAT; goto error; } HINT2("------------------ filesize=%ld", (long) filesize); if ((rv = (zzip_error_t)__zzip_fetch_disk_trailer(dir->fd, filesize, &trailer, dir->io)) != 0) { goto error; } HINT5("directory = { entries= %ld/%ld, size= %ld, seek= %ld } ", (long) _disk_trailer_localentries (&trailer), (long) _disk_trailer_finalentries (&trailer), (long) _disk_trailer_rootsize (&trailer), (long) _disk_trailer_rootseek (&trailer)); if ( (rv = (zzip_error_t)__zzip_parse_root_directory(dir->fd, &trailer, &dir->hdr0, dir->io)) != 0) { goto error; } error: return rv; } /** * will attach a .zip extension and tries to open it * the with => open(2). This is a helper function for * => zzip_dir_open, => zzip_opendir and => zzip_open. */ int __zzip_try_open(zzip_char_t* filename, int filemode, zzip_strings_t* ext, zzip_plugin_io_t io) { auto char file[PATH_MAX]; __zzipfd fd; zzip_size_t len = strlen (filename); if (len+4 >= PATH_MAX) return -1; memcpy(file, filename, len+1); if (!io) io = zzip_get_default_io(); if (!ext) ext = zzip_get_default_ext(); for ( ; *ext ; ++ext) { strcpy (file+len, *ext); fd = io->fd.open(file, filemode); if (fd != (unsigned)-1) return fd; } return -1; } /** * Opens the zip-archive (if available). * the two ext_io arguments will default to use posix io and * a set of default fileext that can atleast add .zip ext itself. */ ZZIP_DIR* zzip_dir_open(zzip_char_t* filename, zzip_error_t* e) { return zzip_dir_open_ext_io (filename, e, 0, 0); } /** => zzip_dir_open * this function uses explicit ext and io instead of the internal * defaults. Setting these to zero is equivalent to => zzip_dir_open */ ZZIP_DIR* zzip_dir_open_ext_io(zzip_char_t* filename, zzip_error_t* e, zzip_strings_t* ext, zzip_plugin_io_t io) { __zzipfd fd; if (!io) io = zzip_get_default_io(); if (!ext) ext = zzip_get_default_ext(); fd = io->fd.open(filename, O_RDONLY|O_BINARY); if (fd != (unsigned)-1) { return zzip_dir_fdopen_ext_io(fd, e, ext, io); } else { fd = __zzip_try_open(filename, O_RDONLY|O_BINARY, ext, io); if (fd != (unsigned)-1) { return zzip_dir_fdopen_ext_io(fd, e, ext, io); } else { if (e) { *e = ZZIP_DIR_OPEN; } return 0; } } } /** => zzip_dir_open * fills the dirent-argument with the values and * increments the read-pointer of the dir-argument. * * returns 0 if there no entry (anymore). */ int zzip_dir_read(ZZIP_DIR * dir, ZZIP_DIRENT * d ) { if (! dir || ! dir->hdr || ! d) return 0; d->d_compr = dir->hdr->d_compr; d->d_csize = dir->hdr->d_csize; d->st_size = dir->hdr->d_usize; d->d_name = dir->hdr->d_name; if (! dir->hdr->d_reclen) { dir->hdr = 0; } else { dir->hdr = (struct zzip_dir_hdr *)((char *)dir->hdr + dir->hdr->d_reclen); } return 1; } /* * Local variables: * c-file-style: "stroustrup" * End: */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_fseeko.h0000644000175000017500000000712710737746457025406 0ustar admin2admin2#ifndef _ZZIP_FSEEKO_H_ #define _ZZIP_FSEEKO_H_ /* * NOTE: this is part of libzzipfseeko (i.e. it is not libzzip). * * simplified zip disk access using fseeko on a stdio FILE handle * * Author: * Guido Draheim * * Copyright (c) 2003,2004 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #include #include typedef struct zzip_entry ZZIP_ENTRY; typedef struct zzip_entry_file ZZIP_ENTRY_FILE; typedef int (*zzip_strcmp_fn_t)(char*, char*); typedef int (*zzip_fnmatch_fn_t)(char*, char*, int); #ifndef zzip_entry_extern #define zzip_entry_extern extern #endif zzip_entry_extern zzip_off_t zzip_entry_data_offset(ZZIP_ENTRY* entry); zzip__new__ zzip_entry_extern ZZIP_ENTRY* zzip_entry_findfirst(FILE* file); zzip__new__ zzip_entry_extern ZZIP_ENTRY* zzip_entry_findnext(ZZIP_ENTRY* _zzip_restrict entry); #define zzip_entry_findlast zzip_entry_free #define zzip_entry_findlastfile zzip_entry_free #define zzip_entry_findlastmatch zzip_entry_free zzip_entry_extern int zzip_entry_free(ZZIP_ENTRY* entry); zzip__new__ zzip_entry_extern char* zzip_entry_strdup_name(ZZIP_ENTRY* entry); zzip_entry_extern char* zzip_entry_to_data(ZZIP_ENTRY* entry); zzip__new__ zzip_entry_extern ZZIP_ENTRY* zzip_entry_findfile(FILE* disk, char* filename, ZZIP_ENTRY* _zzip_restrict old, zzip_strcmp_fn_t compare); zzip__new__ zzip_entry_extern ZZIP_ENTRY* zzip_entry_findmatch(FILE* disk, char* filespec, ZZIP_ENTRY* _zzip_restrict old, zzip_fnmatch_fn_t compare, int flags); zzip__new__ zzip_entry_extern ZZIP_ENTRY_FILE* zzip_entry_fopen (ZZIP_ENTRY* entry, int takeover); zzip__new__ zzip_entry_extern ZZIP_ENTRY_FILE* zzip_entry_ffile (FILE* disk, char* filename); zzip_entry_extern _zzip_size_t zzip_entry_fread (void* ptr, _zzip_size_t size, _zzip_size_t nmemb, ZZIP_ENTRY_FILE* file); zzip_entry_extern int zzip_entry_fclose (ZZIP_ENTRY_FILE* file); int zzip_entry_feof (ZZIP_ENTRY_FILE* file); # ifdef _ZZIP_ENTRY_STRUCT # ifdef __cplusplus # define __zzip_entry_extends_zzip_disk_entry struct zzip_entry : public /*struct */zzip_disk_entry { char* _zzip_restrict tail; zzip_off_t tailalloc; /* the allocated size of tail */ FILE* diskfile; /* a file reference */ zzip_off_t disksize; /* the size of the file */ zzip_off_t headseek; /* the offset within the file */ zzip_off_t zz_usize; zzip_off_t zz_csize; /* items scanned from header */ zzip_off_t zz_offset; /* or zip64 extension block */ int zz_diskstart; }; # else struct zzip_entry /* : struct zzip_disk_entry */ { struct zzip_disk_entry head; char* _zzip_restrict tail; zzip_off_t tailalloc; /* the allocated size of tail */ FILE* diskfile; /* a file reference */ zzip_off_t disksize; /* the size of the file */ zzip_off_t headseek; /* the offset within the file */ zzip_off_t zz_usize; zzip_off_t zz_csize; /* items scanned from header */ zzip_off_t zz_offset; /* or zip64 extension block */ int zz_diskstart; }; # endif /* __cplusplus */ # endif /* _ZZIP_MEM_ENTRY_PRIVATE */ #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip___hints.h0000644000175000017500000001114510737746457025550 0ustar admin2admin2#ifndef __ZZIP_INTERNAL_HINTS_H #define __ZZIP_INTERNAL_HINTS_H #include #ifndef ZZIP_GNUC_ATLEAST # if defined __GNUC__ && defined __GNUC_MINOR__ # define ZZIP_GNUC_ATLEAST(_M_,_N_) \ ((__GNUC__ << 10) + __GNUC_MINOR__ >= ((_M_) << 10) + (_N_)) # elif defined __GNUC__ # define ZZIP_GNUC_ATLEAST(_M_,_N_) \ ((__GNUC__ << 10) >= ((_M_) << 10)) # else # define ZZIP_GNUC_ATLEAST(_M_, _N_) 0 # endif #endif #ifndef ZZIP_GNUC_EXTENSION # if ZZIP_GNUC_ATLEAST(2,8) # define ZZIP_GNUC_EXTENSION __extension__ # else # define ZZIP_GNUC_EXTENSION # endif #endif /* func has no side effects, return value depends only on params and globals */ #ifndef ZZIP_GNUC_PURE # if ZZIP_GNUC_ATLEAST(2,8) # define ZZIP_GNUC_PURE __attribute__((__pure__)) # else # define ZZIP_GNUC_PURE # endif #endif /* func has no side effects, return value depends only on params */ #ifndef ZZIP_GNUC_CONST # if ZZIP_GNUC_ATLEAST(2,4) # define ZZIP_GNUC_CONST __attribute__((__const__)) # else # define ZZIP_GNUC_CONST # endif #endif /* typename / variable / function possibly unused */ #ifndef ZZIP_GNUC_UNUSED # if ZZIP_GNUC_ATLEAST(2,4) # define ZZIP_GNUC_UNUSED __attribute__((__unused__)) # else # define ZZIP_GNUC_UNUSED # endif #endif /* obvious. btw, a noreturn-func should return void */ #ifndef ZZIP_GNUC_NORETURN # if ZZIP_GNUC_ATLEAST(2,5) # define ZZIP_GNUC_NORETURN __attribute__((__noreturn__)) # else # define ZZIP_GNUC_NORETURN # endif #endif /* omit function from profiling with -finstrument-functions */ #ifndef ZZIP_GNUC_NO_INSTRUMENT # if ZZIP_GNUC_ATLEAST(2,4) # define ZZIP_GNUC_NO_INSTRUMENT __attribute__((__no_instrument_function__)) # else # define ZZIP_GNUC_NO_INSTRUMENT # endif #endif /* all pointer args must not be null, and allow optimiztons based on the fact*/ #ifndef ZZIP_GNUC_NONNULL # if ZZIP_GNUC_ATLEAST(3,1) # define ZZIP_GNUC_NONNULL __attribute__((nonnull)) # else # define ZZIP_GNUC_NONNULL # endif #endif /* the function can not throw - the libc function are usually nothrow */ #ifndef ZZIP_GNUC_NOTHROW # if ZZIP_GNUC_ATLEAST(3,2) # define ZZIP_GNUC_NOTHROW __attribute__((nothrow)) # else # define ZZIP_GNUC_NOTHROW # endif #endif /* typename / function / variable is obsolete but still listed in headers */ #ifndef ZZIP_GNUC_DEPRECATED # if ZZIP_GNUC_ATLEAST(3,1) # define ZZIP_GNUC_DEPRECATED __attribute__((deprecated)) # else # define ZZIP_GNUC_DEPRECATED # endif #endif /* resolve references to this function during pre-linking the libary */ #ifndef ZZIP_GNUC_LIB_PROTECTED # if ZZIP_GNUC_ATLEAST(3,1) # define ZZIP_GNUC_LIB_PROTECTED __attribute__((visiblity("protected"))) # else # define ZZIP_GNUC_LIB_PROTECTED # endif #endif /* func shall only be usable within the same lib (so, no entry in lib symtab)*/ #ifndef ZZIP_GNUC_LIB_PRIVATE # if ZZIP_GNUC_ATLEAST(3,1) # define ZZIP_GNUC_LIB_PRIVATE __attribute__((visiblity("hidden"))) # else # define ZZIP_GNUC_LIB_PRIVATE # endif #endif /* ... and not even passed as a function pointer reference to outside the lib*/ #ifndef ZZIP_GNUC_LIB_INTERNAL # if ZZIP_GNUC_ATLEAST(3,1) # define ZZIP_GNUC_LIB_INTERNAL __attribute__((visiblity("internal"))) # else # define ZZIP_GNUC_LIB_INTERNAL # endif #endif #ifndef ZZIP_GNUC_FORMAT # if ZZIP_GNUC_ATLEAST(2,4) # define ZZIP_GNUC_FORMAT(_X_) __attribute__((__format_arg__(_X_))) # else # define ZZIP_GNUC_FORMAT(_X_) # endif #endif #ifndef ZZIP_GNUC_SCANF # if ZZIP_GNUC_ATLEAST(2,4) # define ZZIP_GNUC_SCANF(_S_,_X_) __attribute__((__scanf__(_S_,_X_))) # else # define ZZIP_GNUC_SCANF(_S_,_X_) # endif #endif #ifndef ZZIP_GNUC_PRINTF # if ZZIP_GNUC_ATLEAST(2,4) # define ZZIP_GNUC_PRINTF(_S_,_X_) __attribute__((__printf__(_S_,_X_))) # else # define ZZIP_GNUC_PRINTF(_S_,_X_) # endif #endif #ifndef ZZIP_FUNCTION # if ZZIP_GNUC_ATLEAST(2,6) # define ZZIP_FUNC __FUNCTION__ # define ZZIP_FUNCTION __FUNCTION__ # elif defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L # define ZZIP_FUNC __func__ # define ZZIP_FUNCTION "" # else # define ZZIP_FUNC 0 # define ZZIP_FUNCTION "" # endif #endif #ifndef ZZIP_STRING #define ZZIP_STRING(_X_) ZZIP_STRING_(_X_) #define ZZIP_STRING_(_Y_) #_Y_ #endif #ifndef ZZIP_DIM #define ZZIP_DIM(_A_) (sizeof(_A_) / sizeof ((_A_)[0])) #endif #if !(defined ZZIP_FOR1 && defined ZZIP_END1) # if defined sun || defined __sun__ # define ZZIP_FOR1 if (1) # define ZZIP_END1 else (void)0 # else # define ZZIP_FOR1 do # define ZZIP_END1 while (0) # endif #endif #ifndef ZZIP_BRANCH_OVER # if ZZIP_GNUC_ATLEAST(2,96) # define ZZIP_BRANCH_OVER(_X_) __builtin_expect((_X_),0) # else # define ZZIP_BRANCH_OVER(_X_) (_X_) # endif #endif #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/info.cpp0000644000175000017500000000747410737746457024351 0ustar admin2admin2/* * Author: * Guido Draheim * * Copyright (c) 2000,2001,2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #include /* exported... */ #include #include #ifdef ZZIP_HAVE_SYS_STAT_H #include #else #include #include #endif /** * just returns dir->errcode of the ZZIP_DIR handle * see: => zzip_dir_open, => zzip_diropen, => zzip_readdir, => zzip_dir_read */ int zzip_error(ZZIP_DIR * dir) { return dir->errcode; } /** => zzip_error * This function just does dir->errcode = errcode */ void zzip_seterror(ZZIP_DIR * dir, int errcode) { dir->errcode = errcode; } /** * This function will just return fp->dir * * If a ZZIP_FILE is contained within a zip-file that one will be a valid * pointer, otherwise a NULL is returned and the ZZIP_FILE wraps a real file. */ ZZIP_DIR * zzip_dirhandle(ZZIP_FILE * fp) { return fp->dir; } /** => zzip_dirhandle * This function will just return dir->fd * * If a ZZIP_DIR does point to a zipfile then the file-descriptor of that * zipfile is returned, otherwise a NULL is returned and the ZZIP_DIR wraps * a real directory DIR (if you have dirent on your system). */ int zzip_dirfd(ZZIP_DIR* dir) { return dir->fd; } /** * return static const string of the known compression methods, * otherwise just "zipped" is returned */ zzip_char_t* zzip_compr_str(int compr) { switch(compr) { case ZZIP_IS_STORED: return "stored"; case ZZIP_IS_SHRUNK: return "shrunk"; case ZZIP_IS_REDUCEDx1: case ZZIP_IS_REDUCEDx2: case ZZIP_IS_REDUCEDx3: case ZZIP_IS_REDUCEDx4: return "reduced"; case ZZIP_IS_IMPLODED: return "imploded"; case ZZIP_IS_TOKENIZED: return "tokenized"; case ZZIP_IS_DEFLATED: return "deflated"; case ZZIP_IS_DEFLATED_BETTER: return "deflatedX"; case ZZIP_IS_IMPLODED_BETTER: return "implodedX"; default: if (0 < compr && compr < 256) return "zipped"; else { # ifdef S_ISDIR if (S_ISDIR(compr)) return "directory"; # endif # ifdef S_ISCHR if (S_ISCHR(compr)) return "is/chr"; # endif # ifdef S_ISBLK if (S_ISBLK(compr)) return "is/blk"; # endif # ifdef S_ISFIFO if (S_ISFIFO(compr)) return "is/fifo"; # endif # ifdef S_ISSOCK if (S_ISSOCK(compr)) return "is/sock"; # endif # ifdef S_ISLNK if (S_ISLNK(compr)) return "is/lnk"; # endif return "special"; } }/*switch*/ } /** => zzip_file_real * This function checks if the ZZIP_DIR-handle is wrapping * a real directory or a zip-archive. * Returns 1 for a stat'able directory, and 0 for a handle to zip-archive. */ int zzip_dir_real(ZZIP_DIR* dir) { return dir->realdir != 0; } /** * This function checks if the ZZIP_FILE-handle is wrapping * a real file or a zip-contained file. * Returns 1 for a stat'able file, and 0 for a file inside a zip-archive. */ int zzip_file_real(ZZIP_FILE* fp) { return fp->dir == 0; /* ie. not dependent on a zip-arch-dir */ } /** => zzip_file_real * This function returns the posix DIR* handle (if one exists). * Check before with => zzip_dir_real if the * the ZZIP_DIR points to a real directory. */ void* zzip_realdir(ZZIP_DIR* dir) { return dir->realdir; } /** => zzip_file_real * This function returns the posix file descriptor (if one exists). * Check before with => zzip_file_real if the * the ZZIP_FILE points to a real file. */ int zzip_realfd(ZZIP_FILE* fp) { return fp->fd; } /* * Local variables: * c-file-style: "stroustrup" * End: */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_types.h0000644000175000017500000000323710737746457025274 0ustar admin2admin2/* * unlike in we are allowed to make up typedefs here, * while over there only #defines are allowed * * Author: * Guido Draheim * * Copyright (c) 2003,2004 Guido Draheim * All rights reserved, * usage allowed under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 * * if you see "unknown symbol" errors, check first that `-I ..` is part of * your compiler options - a special hint to VC/IDE users who tend to make up * their own workspace files. All includes look like #include , so * you need to add an include path to the dir containing (!!) the ./zzip_ dir */ #ifndef _ZZIP_TYPES_H_ #define _ZZIP_TYPES_H_ #include #include #include /* size_t and friends */ #ifdef ZZIP_HAVE_SYS_TYPES_H #include /* bsd (mac) has size_t here */ #endif /* msvc6 has neither ssize_t (we assume "int") nor off_t (assume "long") */ typedef unsigned char zzip_byte_t; // especially zlib decoding data typedef _zzip_off64_t zzip_off64_t; typedef _zzip_off_t zzip_off_t; typedef _zzip_size_t zzip_size_t; typedef _zzip_ssize_t zzip_ssize_t; /* in */ typedef struct zzip_disk64_trailer ZZIP_DISK64_TRAILER; typedef struct zzip_disk_trailer ZZIP_DISK_TRAILER; typedef struct zzip_file_trailer ZZIP_FILE_TRAILER; typedef struct zzip_root_dirent ZZIP_ROOT_DIRENT; typedef struct zzip_file_header ZZIP_FILE_HEADER; typedef struct zzip_disk_entry ZZIP_DISK_ENTRY; typedef struct zzip_extra_block ZZIP_EXTRA_BLOCK; #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_file.h0000644000175000017500000000410210737746457025037 0ustar admin2admin2/* * this is an internal header file - the structure contains two off_t * atleast making it LARGEFILE_SENSITIVE on linux2 and solaris systems * whereas about all functions just return a ZZIP_FILE* in zzip_zzip.h * * and so, this structure should be handled version-specific and * subject to change - it had been kept binary-compatible for quite * a while now so perhaps some program sources have errnously taken * advantage of this file. * * Author: * Guido Draheim * Tomi Ollila * * Copyright (c) 1999,2000,2001,2002 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #ifndef _ZZIP_FILE_H /* zzip-file.h */ #define _ZZIP_FILE_H 1 #ifndef ZZIP_32K #ifdef __GNUC__ /* include zzip_lib.h beforehand in order to suppress the following warning */ #warning zzip_file.h is an internal header, do not use it freely #endif #endif #include #include #ifdef ZZIP_HAVE_UNISTD_H #include #else #include # ifdef ZZIP_HAVE_SYS_TYPES_H # include # endif #endif #ifdef ZZIP_HAVE_SYS_PARAM_H #include /* PATH_MAX */ #endif #ifndef PATH_MAX # ifdef MAX_PATH /* windows */ # define PATH_MAX MAX_PATH # else # define PATH_MAX 512 # endif #endif /* * ZZIP_FILE structure... currently no need to unionize, since structure needed * for inflate is superset of structure needed for unstore. * * Don't make this public. Instead, create methods for needed operations. */ struct zzip_file { struct zzip_dir* dir; __zzipfd fd; int method; zzip_size_t restlen; zzip_size_t crestlen; zzip_size_t usize; zzip_size_t csize; /* added dataoffset member - data offset from start of zipfile*/ zzip_off_t dataoffset; char* buf32k; zzip_off_t offset; /* offset from the start of zipfile... */ z_stream d_stream; zzip_plugin_io_t io; }; #endif /* _ZZIP_FILE_H */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip__config.h0000644000175000017500000001424010737746457025530 0ustar admin2admin2#ifndef _ZZIP__CONFIG_H #define _ZZIP__CONFIG_H 1 /* zzip__config.h. Generated automatically at end of configure. */ /* config.h. Generated by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_BYTESWAP_H #undef ZZIP_HAVE_BYTESWAP_H #endif /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_DIRECT_H */ /* Define to 1 if you have the header file, and it defines `DIR'. */ #ifndef ZZIP_HAVE_DIRENT_H #undef ZZIP_HAVE_DIRENT_H #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_DLFCN_H #define ZZIP_HAVE_DLFCN_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_FNMATCH_H #undef ZZIP_HAVE_FNMATCH_H #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_INTTYPES_H #define ZZIP_HAVE_INTTYPES_H 1 #endif /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_IO_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_MEMORY_H #define ZZIP_HAVE_MEMORY_H 1 #endif /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef ZZIP_HAVE_NDIR_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_STDINT_H #define ZZIP_HAVE_STDINT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_STDLIB_H #define ZZIP_HAVE_STDLIB_H 1 #endif /* Define to 1 if you have the `strcasecmp' function. */ #ifndef ZZIP_HAVE_STRCASECMP #define ZZIP_HAVE_STRCASECMP 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_STRINGS_H #define ZZIP_HAVE_STRINGS_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_STRING_H #define ZZIP_HAVE_STRING_H 1 #endif /* Define to 1 if you have the `strndup' function. */ #ifndef ZZIP_HAVE_STRNDUP #undef ZZIP_HAVE_STRNDUP #endif /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef ZZIP_HAVE_SYS_DIR_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_SYS_INT_TYPES_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_SYS_MMAN_H #define ZZIP_HAVE_SYS_MMAN_H 1 #endif /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef ZZIP_HAVE_SYS_NDIR_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_SYS_PARAM_H #define ZZIP_HAVE_SYS_PARAM_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_SYS_STAT_H #define ZZIP_HAVE_SYS_STAT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_SYS_TYPES_H #define ZZIP_HAVE_SYS_TYPES_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_UNISTD_H #define ZZIP_HAVE_UNISTD_H 1 #endif /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_WINBASE_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_WINDOWS_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_WINNT_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_ZLIB_H #define ZZIP_HAVE_ZLIB_H 1 #endif /* whether the system defaults to 32bit off_t but can do 64bit when requested */ #ifndef ZZIP_LARGEFILE_SENSITIVE #define ZZIP_LARGEFILE_SENSITIVE 1 #endif /* Name of package */ #ifndef ZZIP_PACKAGE #define ZZIP_PACKAGE "zziplib" #endif /* Define to the address where bug reports for this package should be sent. */ #ifndef ZZIP_PACKAGE_BUGREPORT #define ZZIP_PACKAGE_BUGREPORT "" #endif /* Define to the full name of this package. */ #ifndef ZZIP_PACKAGE_NAME #define ZZIP_PACKAGE_NAME "" #endif /* Define to the full name and version of this package. */ #ifndef ZZIP_PACKAGE_STRING #define ZZIP_PACKAGE_STRING "" #endif /* Define to the one symbol short name of this package. */ #ifndef ZZIP_PACKAGE_TARNAME #define ZZIP_PACKAGE_TARNAME "" #endif /* Define to the version of this package. */ #ifndef ZZIP_PACKAGE_VERSION #define ZZIP_PACKAGE_VERSION "" #endif /* The number of bytes in type int */ #ifndef ZZIP_SIZEOF_INT #define ZZIP_SIZEOF_INT 4 #endif /* The number of bytes in type long */ #ifndef ZZIP_SIZEOF_LONG #define ZZIP_SIZEOF_LONG 4 #endif /* The number of bytes in type short */ #ifndef ZZIP_SIZEOF_SHORT #define ZZIP_SIZEOF_SHORT 2 #endif /* Define to 1 if you have the ANSI C header files. */ #ifndef ZZIP_STDC_HEADERS #define ZZIP_STDC_HEADERS 1 #endif /* Version number of package */ #ifndef ZZIP_VERSION #define ZZIP_VERSION "0.13.47" #endif /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ #ifdef __ppc__ #define ZZIP_WORDS_BIGENDIAN 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #ifndef ZZIP__FILE_OFFSET_BITS #define ZZIP__FILE_OFFSET_BITS 64 #endif /* Define for large files, on AIX-style hosts. */ /* #undef ZZIP__LARGE_FILES */ /* Define to `long long' if does not define. */ #ifndef ZZIP___int64 #define ZZIP___int64 long long #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef _zzip_const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus /* #undef _zzip_inline */ #endif /* Define to `_zzip_off_t' if does not define. */ #ifndef _zzip_off64_t #define _zzip_off64_t _zzip_off_t #endif /* Define to `long' if does not define. */ /* #undef _zzip_off_t */ /* Define to equivalent of C99 restrict keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #ifndef _zzip_restrict #define _zzip_restrict __restrict__ #endif /* Define to `unsigned' if does not define. */ /* #undef _zzip_size_t */ /* Define to `int' if does not define. */ /* #undef _zzip_ssize_t */ /* once: _ZZIP__CONFIG_H */ #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip___dirent.h0000644000175000017500000002225110737746457025710 0ustar admin2admin2#ifndef ZZIP_INTERNAL_DIRENT_H #define ZZIP_INTERNAL_DIRENT_H #include /* * DO NOT USE THIS CODE. * * It is an internal header file for zziplib that carries some inline * functions (or just static members) and a few defines, simply to be * able to reuse these across - and have everything in a specific place. * * Copyright (c) 2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #ifdef ZZIP_HAVE_DIRENT_H #define USE_DIRENT 1 #define _zzip_opendir opendir #define _zzip_readdir readdir #define _zzip_closedir closedir #define _zzip_rewinddir rewinddir #define _zzip_telldir telldir #define _zzip_seekdir seekdir #define _zzip_DIR DIR #include #elif defined ZZIP_HAVE_WINBASE_H #define USE_DIRENT 2 #define _zzip_opendir win32_opendir #define _zzip_readdir win32_readdir #define _zzip_closedir win32_closedir #define _zzip_rewinddir win32_rewinddir #define _zzip_telldir win32_telldir #define _zzip_seekdir win32_seekdir #define _zzip_DIR DIR /* * DIRENT.H (formerly DIRLIB.H) * * by M. J. Weinstein Released to public domain 1-Jan-89 * * Because I have heard that this feature (opendir, readdir, closedir) * it so useful for programmers coming from UNIX or attempting to port * UNIX code, and because it is reasonably light weight, I have included * it in the Mingw32 package. I have also added an implementation of * rewinddir, seekdir and telldir. * - Colin Peters * * This code is distributed in the hope that is will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAMED. This includeds but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #include struct dirent { long d_ino; /* Always zero. */ unsigned short d_reclen; /* Always zero. */ unsigned short d_namlen; /* Length of name in d_name. */ char* d_name; /* File name. */ /* NOTE: The name in the dirent structure points to the name in the * finddata_t structure in the DIR. */ }; /* * This is an internal data structure. Good programmers will not use it * except as an argument to one of the functions below. */ typedef struct { /* disk transfer area for this dir */ struct _finddata_t dd_dta; /* dirent struct to return from dir (NOTE: this makes this thread * safe as long as only one thread uses a particular DIR struct at * a time) */ struct dirent dd_dir; /* _findnext handle */ long dd_handle; /* * Status of search: * 0 = not started yet (next entry to read is first entry) * -1 = off the end * positive = 0 based index of next entry */ short dd_stat; /* given path for dir with search pattern (struct is extended) */ char dd_name[1]; } DIR; /* * dirent.c * * Derived from DIRLIB.C by Matt J. Weinstein * This note appears in the DIRLIB.H * DIRLIB.H by M. J. Weinstein Released to public domain 1-Jan-89 * * Updated by Jeremy Bettis * Significantly revised and rewinddir, seekdir and telldir added by Colin * Peters */ #include #include #include #include #include #include #define win32_SUFFIX "*" #define win32_SLASH "\\" #ifndef S_ISDIR #define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) /* is a directory */ #endif S_ISDIR /* opendir Returns a pointer to a DIR structure appropriately filled in to begin searching a directory. */ static DIR* win32_opendir (const char *szPath) { DIR *nd; struct _stat statDir; errno = 0; if (!szPath) { errno = EFAULT; return (DIR *) 0; } if (szPath[0] == '\0') { errno = ENOTDIR; return (DIR *) 0; } /* Attempt to determine if the given path really is a directory. */ if (_stat (szPath, &statDir)) { /* Error, stat should have set an error value. */ return (DIR *) 0; } if (!S_ISDIR (statDir.st_mode)) { /* Error, stat reports not a directory. */ errno = ENOTDIR; return (DIR *) 0; } /* Allocate enough space to store DIR structure and the complete * directory path given. */ nd = (DIR *) calloc (1, sizeof (DIR) + strlen (szPath) + strlen (win32_SLASH) + strlen (win32_SUFFIX)); if (!nd) { /* Error, out of memory. */ errno = ENOMEM; return (DIR *) 0; } /* Create the search expression. */ strcpy (nd->dd_name, szPath); /* Add on a slash if the path does not end with one. */ if (nd->dd_name[0] != '\0' && nd->dd_name[strlen (nd->dd_name) - 1] != '/' && nd->dd_name[strlen (nd->dd_name) - 1] != '\\') { strcat (nd->dd_name, win32_SLASH); } /* Add on the search pattern */ strcat (nd->dd_name, win32_SUFFIX); /* Initialize handle to -1 so that a premature closedir doesn't try * to call _findclose on it. */ nd->dd_handle = -1; /* Initialize the status. */ nd->dd_stat = 0; /* Initialize the dirent structure. ino and reclen are invalid under * Win32, and name simply points at the appropriate part of the * findfirst_t structure. */ nd->dd_dir.d_ino = 0; nd->dd_dir.d_reclen = 0; nd->dd_dir.d_namlen = 0; nd->dd_dir.d_name = nd->dd_dta.name; return nd; } /* readdir Return a pointer to a dirent structure filled with the information on the next entry in the directory. */ static struct dirent * win32_readdir (DIR * dirp) { errno = 0; /* Check for valid DIR struct. */ if (!dirp) { errno = EFAULT; return (struct dirent *) 0; } if (dirp->dd_dir.d_name != dirp->dd_dta.name) { /* The structure does not seem to be set up correctly. */ errno = EINVAL; return (struct dirent *) 0; } if (dirp->dd_stat < 0) { /* We have already returned all files in the directory * (or the structure has an invalid dd_stat). */ return (struct dirent *) 0; } else if (dirp->dd_stat == 0) { /* We haven't started the search yet. */ /* Start the search */ dirp->dd_handle = _findfirst (dirp->dd_name, &(dirp->dd_dta)); if (dirp->dd_handle == -1) { /* Whoops! Seems there are no files in that * directory. */ dirp->dd_stat = -1; } else { dirp->dd_stat = 1; } } else { /* Get the next search entry. */ if (_findnext (dirp->dd_handle, &(dirp->dd_dta))) { /* We are off the end or otherwise error. */ _findclose (dirp->dd_handle); dirp->dd_handle = -1; dirp->dd_stat = -1; } else { /* Update the status to indicate the correct * number. */ dirp->dd_stat++; } } if (dirp->dd_stat > 0) { /* Successfully got an entry. Everything about the file is * already appropriately filled in except the length of the * file name. */ dirp->dd_dir.d_namlen = (unsigned short) strlen (dirp->dd_dir.d_name); return &dirp->dd_dir; } return (struct dirent *) 0; } /* closedir Frees up resources allocated by opendir. */ static int win32_closedir (DIR * dirp) { int rc; errno = 0; rc = 0; if (!dirp) { errno = EFAULT; return -1; } if (dirp->dd_handle != -1) { rc = _findclose (dirp->dd_handle); } /* Delete the dir structure. */ free (dirp); return rc; } /* rewinddir Return to the beginning of the directory "stream". We simply call findclose and then reset things like an opendir. */ static void win32_rewinddir (DIR * dirp) { errno = 0; if (!dirp) { errno = EFAULT; return; } if (dirp->dd_handle != -1) { _findclose (dirp->dd_handle); } dirp->dd_handle = -1; dirp->dd_stat = 0; } /* telldir Returns the "position" in the "directory stream" which can be used with seekdir to go back to an old entry. We simply return the value in stat. */ static long win32_telldir (DIR * dirp) { errno = 0; if (!dirp) { errno = EFAULT; return -1; } return dirp->dd_stat; } /* seekdir Seek to an entry previously returned by telldir. We rewind the directory and call readdir repeatedly until either dd_stat is the position number or -1 (off the end). This is not perfect, in that the directory may have changed while we weren't looking. But that is probably the case with any such system. */ static void win32_seekdir (DIR * dirp, long lPos) { errno = 0; if (!dirp) { errno = EFAULT; return; } if (lPos < -1) { /* Seeking to an invalid position. */ errno = EINVAL; return; } else if (lPos == -1) { /* Seek past end. */ if (dirp->dd_handle != -1) { _findclose (dirp->dd_handle); } dirp->dd_handle = -1; dirp->dd_stat = -1; } else { /* Rewind and read forward to the appropriate index. */ win32_rewinddir (dirp); while ((dirp->dd_stat < lPos) && win32_readdir (dirp)); } } #else #define USE_DIRENT 0 #define _zzip_opendir(_N_) 0 #define _zzip_readdir(_D_) 0 #define _zzip_closedir(_D_) /* omit return code */ #define _zzip_rewinddir(_D_) #define _zzip_telldir(_D_) 0 #define _zzip_seekdir(_D_,_V_) /* omit return code */ #define _zzip_DIR void* /* end of DIRENT implementation */ #endif /* once */ #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_autoconf.h0000644000175000017500000000253510737746457025746 0ustar admin2admin2#ifndef _ZZIP_AUTOCONF_H_ #define _ZZIP_AUTOCONF_H_ 1 /* * This file is trying to override configure time checks of zzip with * definitions at compile time. This is not used by zzip sources themselves * but it may be really helpful with thirdparty software that happens to * include zzip headers from a central place but running on a different host. */ #include "conf.h" /* : */ #if defined HAVE_ENDIAN_H || defined ZZIP_HAVE_ENDIAN_H #include /* glibc */ #elif defined HAVE_SYS_PARAM_H || defined ZZIP_HAVE_SYS_PARAM_H #include /* solaris */ #endif #if defined __BYTE_ORDER #define ZZIP_BYTE_ORDER __BYTE_ORDER #elif defined BYTE_ORDER #define ZZIP_BYTE_ORDER BYTE_ORDER #elif defined _LITTLE_ENDIAN #define ZZIP_BYTE_ORDER 1234 #elif defined _BIG_ENDIAN #define ZZIP_BYTE_ORDER 4321 #elif defined __i386__ #define ZZIP_BYTE_ORDER 1234 #elif defined WORDS_BIGENDIAN || defined ZZIP_WORDS_BIGENDIAN #define ZZIP_BYTE_ORDER 4321 #else #define ZZIP_BYTE_ORDER 1234 #endif /* override ZZIP_WORDS_BIGENDIAN : macros ZZIP_GET16 / ZZIP_GET32 */ #ifdef ZZIP_BYTE_ORDER+0 == 1234 #undef ZZIP_WORDS_BIGENDIAN #endif #ifdef ZZIP_BYTE_ORDER+0 == 4321 #ifndef ZZIP_WORDS_BIGENDIAN #define ZZIP_WORDS_BIGENDIAN 1 #endif #endif #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip___mmap.h0000644000175000017500000000567010737746457025363 0ustar admin2admin2#ifndef __ZZIP_INTERNAL_MMAP_H #define __ZZIP_INTERNAL_MMAP_H #include /* * DO NOT USE THIS CODE. * * It is an internal header file for zziplib that carries some inline * functions (or just static members) and a few defines, simply to be * able to reuse these across - and have everything in a specific place. * * Copyright (c) 2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #ifdef _USE_MMAP #if defined ZZIP_HAVE_SYS_MMAN_H #include #define USE_POSIX_MMAP 1 #elif defined ZZIP_HAVE_WINBASE_H || defined WIN32 #include #define USE_WIN32_MMAP 1 #else #undef _USE_MMAP #endif #endif /* -------------- specify MMAP function imports --------------------------- */ #if defined USE_POSIX_MMAP #define USE_MMAP 1 #define _zzip_mmap(user, fd, offs, len) \ mmap (0, len, PROT_READ, MAP_SHARED, fd, offs) #define _zzip_munmap(user, ptr, len) \ munmap (ptr, len) #define _zzip_getpagesize(user) getpagesize() #ifndef MAP_FAILED /* hpux10.20 does not have it */ #define MAP_FAILED ((void*)(-1)) #endif #elif defined USE_WIN32_MMAP #define USE_MMAP 1 #ifndef MAP_FAILED #define MAP_FAILED 0 #endif /* we (ab)use the "*user" variable to store the FileMapping handle */ /* which assumes (sizeof(long) == sizeof(HANDLE)) */ static size_t win32_getpagesize () { SYSTEM_INFO si; GetSystemInfo (&si); return si.dwAllocationGranularity; } static void* win32_mmap (long* user, __zzipfd fd, zzip_off_t offs, size_t len) { if (! user || *user != 1) /* || offs % getpagesize() */ return 0; { HANDLE hFile = (HANDLE)_get_osfhandle(fd); if (hFile) *user = (int) CreateFileMapping (hFile, 0, PAGE_READONLY, 0, 0, NULL); if (*user) { char* p = 0; p = MapViewOfFile(*(HANDLE*)user, FILE_MAP_READ, 0, offs, len); if (p) return p + offs; CloseHandle (*(HANDLE*)user); *user = 1; } return MAP_FAILED; } } static void win32_munmap (long* user, char* fd_map, size_t len) { UnmapViewOfFile (fd_map); CloseHandle (*(HANDLE*)user); *user = 1; } #define _zzip_mmap(user, fd, offs, len) \ win32_mmap ((long*) &(user), fd, offs, len) #define _zzip_munmap(user, ptr, len) \ win32_munmap ((long*) &(user), ptr, len) #define _zzip_getpagesize(user) win32_getpagesize() #else /* disable */ #define USE_MMAP 0 /* USE_MAP is intentional: we expect the compiler to do some "code removal" * on any source code enclosed in if (USE_MMAP) {...} i.e. the unreachable * branch of an if (0) {....} is not emitted to the final object binary. */ #ifndef MAP_FAILED #define MAP_FAILED 0 #endif #define _zzip_mmap(user, fd, offs, len) (MAP_FAILED) #define _zzip_munmap(user, ptr, len) {} #define _zzip_getpagesize(user) 1 #endif /* USE_MMAP defines */ #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/Makefile.am0000644000175000017500000000072611136160016024706 0ustar admin2admin2noinst_LIBRARIES = libzzip.a libzzip_a_SOURCES = dir.cpp err.cpp fetch.cpp file.cpp fseeko.cpp info.cpp \ plugin.cpp stat.cpp zip.cpp noinst_HEADERS = zzip_autoconf.h zzip_conf.h zzip__config.h zzip___debug.h \ zzip___dirent.h zzip_fetch.h zzip_file.h zzip___fnmatch.h zzip_format.h \ zzip_fseeko.h zzip.h zzip___hints.h zzip_info.h zzip_lib.h zzip___mmap.h \ zzip__msvc.h zzip_plugin.h zzip_stdint.h zzip_types.h INCLUDES = -I$(top_srcdir)/src/compression/zziplib milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/err.cpp0000644000175000017500000001020610737746457024171 0ustar admin2admin2/* * Author: * Guido Draheim * Tomi Ollila * * Copyright (c) 1999,2000,2001,2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #include /* exported... */ #include #include #include #include static struct errlistentry { int code; const char* mesg; } errlist[] = { { ZZIP_NO_ERROR, "No error" }, { ZZIP_OUTOFMEM, "could not get temporary memory for internal structures" }, { ZZIP_DIR_OPEN, "Failed to open zip-file %s" }, { ZZIP_DIR_STAT, "Failed to fstat zip-file %s" }, { ZZIP_DIR_SEEK, "Failed to lseek zip-file %s" }, { ZZIP_DIR_READ, "Failed to read zip-file %s"}, { ZZIP_DIR_TOO_SHORT, "zip-file %s too short" }, { ZZIP_DIR_EDH_MISSING, "zip-file central directory not found" }, { ZZIP_DIRSIZE, "Directory size too big..." }, { ZZIP_ENOENT, "No such file found in zip-file %s" }, { ZZIP_UNSUPP_COMPR, "Unsupported compression format" }, { ZZIP_CORRUPTED, "Zipfile corrupted" }, { ZZIP_UNDEF, "Some undefined error occurred" }, { ZZIP_DIR_LARGEFILE, "Directory is largefile variant" }, { 0, 0 }, }; #define errlistSIZE (sizeof(errlist)/sizeof(*errlist)) /** * returns the static string for the given error code. The * error code can be either a normal system error (a * positive error code will flag this), it can be => libz * error code (a small negative error code will flag this) * or it can be an error code from => libzzip, which is an * negative value lower than => ZZIP_ERROR */ zzip_char_t* zzip_strerror(int errcode) { if (errcode < ZZIP_ERROR && errcode > ZZIP_ERROR-32) { struct errlistentry* err = errlist; for (; err->mesg ; err++) { if (err->code == errcode) return err->mesg; } errcode = EINVAL; } if (errcode < 0) { if (errcode == -1) return strerror(errcode); else return zError(errcode); } return strerror (errcode); } /** => zzip_strerror * This function fetches the errorcode from the => DIR-handle and * runs it through => zzip_strerror to obtain the static string * describing the error. */ zzip_char_t* zzip_strerror_of(ZZIP_DIR* dir) { if (! dir) return strerror (errno); return zzip_strerror(dir->errcode); } static struct errnolistentry { int code; int e_no; } errnolist[] = { { Z_STREAM_ERROR, EPIPE }, { Z_DATA_ERROR, ESPIPE }, { Z_MEM_ERROR, ENOMEM }, { Z_BUF_ERROR, EMFILE }, { Z_VERSION_ERROR, ENOEXEC }, { ZZIP_DIR_OPEN, ENOTDIR }, { ZZIP_DIR_STAT, EREMOTE }, { ZZIP_DIR_SEEK, ESPIPE }, # ifdef ESTRPIPE { ZZIP_DIR_READ, ESTRPIPE}, # else { ZZIP_DIR_READ, EPIPE}, # endif { ZZIP_DIR_TOO_SHORT, ENOEXEC }, # ifdef ENOMEDIUM { ZZIP_DIR_EDH_MISSING, ENOMEDIUM }, # else { ZZIP_DIR_EDH_MISSING, EIO }, # endif { ZZIP_DIRSIZE, EFBIG }, { ZZIP_OUTOFMEM, ENOMEM }, { ZZIP_ENOENT, ENOENT }, # ifdef EPFNOSUPPORT { ZZIP_UNSUPP_COMPR, EPFNOSUPPORT }, # else { ZZIP_UNSUPP_COMPR, EACCES }, # endif # ifdef EILSEQ { ZZIP_CORRUPTED, EILSEQ }, # else { ZZIP_CORRUPTED, ELOOP }, # endif { ZZIP_UNDEF, EINVAL }, { 0, 0 }, }; /** * map the error code to a system error code. This is used * for the drop-in replacement functions to return a value * that can be interpreted correctly by code sections that * are unaware of the fact they their => open(2) call had been * diverted to a file inside a zip-archive. */ int zzip_errno(int errcode) { if (errcode >= -1) return errno; { struct errnolistentry* err = errnolist; for (; err->code ; err++) { if (err->code == errcode) return err->e_no; } } return EINVAL; } /* * Local variables: * c-file-style: "stroustrup" * End: */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_format.h0000644000175000017500000002206110737746457025414 0ustar admin2admin2/* * Author: * Guido Draheim * * Copyright (c) 2000,2001,2002,2003 Guido Draheim * All rights reserved * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 * * The information was taken from appnote-981119-iz.zip * at http://www.freesoftware.com/pub/infozip/doc/ * which in turn is based on PKWARE's appnote.txt * (newer link: ftp://ftp.info-zip.org/pub/infozip/doc/) */ #ifndef _ZZIP_FORMAT_H /* zzipformat.h */ #define _ZZIP_FORMAT_H #include /* we have ICO C 9X types defined */ /* * Overall zipfile format * [local file header + file data stream + checksum descriptor] ... * ... [disk central directory] [disk trailer record] */ # ifdef _MSC_VER # pragma pack(push, 1) # endif struct zzip_version { zzip_byte_t version[1]; zzip_byte_t ostype[1]; } __zzip_attribute__((packed)); struct zzip_dostime { zzip_byte_t time[2]; zzip_byte_t date[2]; } __zzip_attribute__((packed)); #ifdef ZZIP_NEED_PACKED /* if your compiler does interesting things about struct packing... */ typedef zzip_byte_t zzip_version_t[2]; typedef zzip_byte_t zzip_dostime_t[4]; #else typedef struct zzip_version zzip_version_t; typedef struct zzip_dostime zzip_dostime_t; #endif #define ZZIP_CHECKMAGIC(__p,__A,__B,__C,__D) \ ( (((zzip_byte_t*)(__p))[0]==(__A)) && \ (((zzip_byte_t*)(__p))[1]==(__B)) && \ (((zzip_byte_t*)(__p))[2]==(__C)) && \ (((zzip_byte_t*)(__p))[3]==(__D)) ) /* A. Local file header */ struct zzip_file_header { # define ZZIP_FILE_HEADER_MAGIC 0x04034b50 # define ZZIP_FILE_HEADER_CHECKMAGIC(__p) ZZIP_CHECKMAGIC(__p,'P','K','\3','\4') zzip_byte_t z_magic[4]; /* local file header signature (0x04034b50) */ zzip_version_t z_extract; /* version needed to extract */ zzip_byte_t z_flags[2]; /* general purpose bit flag */ zzip_byte_t z_compr[2]; /* compression method */ zzip_dostime_t z_dostime; /* last mod file time (dos format) */ zzip_byte_t z_crc32[4]; /* crc-32 */ zzip_byte_t z_csize[4]; /* compressed size */ zzip_byte_t z_usize[4]; /* uncompressed size */ zzip_byte_t z_namlen[2]; /* filename length (null if stdin) */ zzip_byte_t z_extras[2]; /* extra field length */ /* followed by filename (of variable size) */ /* followed by extra field (of variable size) */ } __zzip_attribute__((packed)); #define zzip_file_header_headerlength (4+2+2+2+4+4+4+4+2+2) /* B. data descriptor * the data descriptor exists only if bit 3 of z_flags is set. It is byte aligned * and immediately follows the last byte of compressed data. It is only used if * the output media of the compressor was not seekable, eg. standard output. */ struct zzip_file_trailer { # define ZZIP_FILE_TRAILER_MAGIC 0x08074B50 # define ZZIP_FILE_TRAILER_CHECKMAGIC(__p) ZZIP_CHECKMAGIC(__p,'P','K','\7','\8') zzip_byte_t z_magic[4]; /* data descriptor signature (0x08074b50) */ zzip_byte_t z_crc32[4]; /* crc-32 */ zzip_byte_t z_csize[4]; /* compressed size */ zzip_byte_t z_usize[4]; /* uncompressed size */ } __zzip_attribute__((packed)); #define zzip_file_trailer_headerlength (4+4+4+4) /* C. central directory structure: [file header] . . . end of central dir record */ /* directory file header * - a single entry including filename, extras and comment may not exceed 64k. */ struct zzip_disk_entry { # define ZZIP_DISK_ENTRY_MAGIC 0x02014b50 # define ZZIP_DISK_ENTRY_CHECKMAGIC(__p) ZZIP_CHECKMAGIC(__p,'P','K','\1','\2') zzip_byte_t z_magic[4]; /* central file header signature (0x02014b50) */ zzip_version_t z_encoder; /* version made by */ zzip_version_t z_extract; /* version need to extract */ zzip_byte_t z_flags[2]; /* general purpose bit flag */ zzip_byte_t z_compr[2]; /* compression method */ zzip_dostime_t z_dostime; /* last mod file time&date (dos format) */ zzip_byte_t z_crc32[4]; /* crc-32 */ zzip_byte_t z_csize[4]; /* compressed size */ zzip_byte_t z_usize[4]; /* uncompressed size */ zzip_byte_t z_namlen[2]; /* filename length (null if stdin) */ zzip_byte_t z_extras[2]; /* extra field length */ zzip_byte_t z_comment[2]; /* file comment length */ zzip_byte_t z_diskstart[2]; /* disk number of start (if spanning zip over multiple disks) */ zzip_byte_t z_filetype[2]; /* internal file attributes, bit0 = ascii */ zzip_byte_t z_filemode[4]; /* extrnal file attributes, eg. msdos attrib byte */ zzip_byte_t z_offset[4]; /* relative offset of local file header, seekval if singledisk */ /* followed by filename (of variable size) */ /* followed by extra field (of variable size) */ /* followed by file comment (of variable size) */ } __zzip_attribute__((packed)); #define zzip_disk_entry_headerlength (4+2+2+2+2+4+4+4+4+2+2+2+2+2+4+4) struct zzip_root_dirent { /* the old name of the structure above */ # define ZZIP_ROOT_DIRENT_MAGIC 0x02014b50 # define ZZIP_ROOT_DIRENT_CHECKMAGIC(__p) ZZIP_DISK_ENTRY_CHECKMAGIC(__p) zzip_byte_t z_magic[4]; zzip_version_t z_encoder; zzip_version_t z_extract; zzip_byte_t z_flags[2]; zzip_byte_t z_compr[2]; zzip_dostime_t z_dostime; zzip_byte_t z_crc32[4]; zzip_byte_t z_csize[4]; zzip_byte_t z_usize[4]; zzip_byte_t z_namlen[2]; zzip_byte_t z_extras[2]; zzip_byte_t z_comment[2]; zzip_byte_t z_diskstart[2]; zzip_byte_t z_filetype[2]; zzip_byte_t z_filemode[4]; zzip_byte_t z_off[4]; } __zzip_attribute__((packed)); /* end of central dir record */ struct zzip_disk_trailer { # define ZZIP_DISK_TRAILER_MAGIC 0x06054b50 # define ZZIP_DISK_TRAILER_CHECKMAGIC(__p) ZZIP_CHECKMAGIC(__p,'P','K','\5','\6') zzip_byte_t z_magic[4]; /* end of central dir signature (0x06054b50) */ zzip_byte_t z_disk[2]; /* number of this disk */ zzip_byte_t z_finaldisk[2]; /* number of the disk with the start of the central dir */ zzip_byte_t z_entries[2]; /* total number of entries in the central dir on this disk */ zzip_byte_t z_finalentries[2]; /* total number of entries in the central dir */ zzip_byte_t z_rootsize[4]; /* size of the central directory */ zzip_byte_t z_rootseek[4]; /* offset of start of central directory with respect to * * the starting disk number */ zzip_byte_t z_comment[2]; /* zipfile comment length */ /* followed by zipfile comment (of variable size) */ } __zzip_attribute__((packed)); #define zzip_disk_trailer_headerlength (4+2+2+2+2+4+4+2) /* extra field should be type + size + data + type + size + data ... */ struct zzip_extra_block { /* fetch.h macros do not need this struct */ zzip_byte_t z_datatype[2]; /* as input type - a mere is okay */ zzip_byte_t z_datasize[2]; /* being returned by xx_to_extras usually */ } __zzip_attribute__((packed)); #define zzip_extra_block_headerlength (2+2) /* Zip64 end of central dir record */ struct zzip_disk64_trailer { # define ZZIP_DISK64_TRAILER_MAGIC 0x06064b50 # define ZZIP_DISK64_TRAILER_CHECKMAGIC(__p) ZZIP_CHECKMAGIC(__p,'P','K','\6','\6') zzip_byte_t z_magic[4]; /* end of central dir signature (0x06054b50) */ zzip_byte_t z_size[8]; /* size of this central directory record */ zzip_version_t z_encoder; /* version made by */ zzip_version_t z_extract; /* version need to extract */ zzip_byte_t z_disk[4]; /* number of this disk */ zzip_byte_t z_finaldisk[4]; /* number of the disk with the start of the central dir */ zzip_byte_t z_entries[8]; /* total number of entries in the central dir on this disk */ zzip_byte_t z_finalentries[8]; /* total number of entries in the central dir */ zzip_byte_t z_rootsize[8]; /* size of the central directory */ zzip_byte_t z_rootseek[8]; /* offset of start of central directory with respect to * * the starting disk number */ /* followed by zip64 extensible data sector (of variable size) */ } __zzip_attribute__((packed)); #define zzip_disk64_trailer_headerlength (4+8+2+2+4+4+8+8+8+8) /* z_flags */ #define ZZIP_IS_ENCRYPTED(p) ((*(zzip_byte_t*)p)&1) #define ZZIP_IS_COMPRLEVEL(p) (((*(zzip_byte_t*)p)>>1)&3) #define ZZIP_IS_STREAMED(p) (((*(zzip_byte_t*)p)>>3)&1) #define ZZIP_IS_PATCHED(p) (((*(zzip_byte_t*)p)>>5)&1) /* z_compr */ #define ZZIP_IS_STORED 0 #define ZZIP_IS_SHRUNK 1 #define ZZIP_IS_REDUCEDx1 2 #define ZZIP_IS_REDUCEDx2 3 #define ZZIP_IS_REDUCEDx3 4 #define ZZIP_IS_REDUCEDx4 5 #define ZZIP_IS_IMPLODED 6 #define ZZIP_IS_TOKENIZED 7 #define ZZIP_IS_DEFLATED 8 #define ZZIP_IS_DEFLATED_BETTER 9 #define ZZIP_IS_IMPLODED_BETTER 10 /* deflated comprlevel */ #define ZZIP_DEFLATED_STD_COMPR 0 #define ZZIP_DEFLATED_MAX_COMPR 1 #define ZZIP_DEFLATED_LOW_COMPR 2 #define ZZIP_DEFLATED_MIN_COMPR 3 # ifdef _MSC_VER # pragma pack(pop) # endif #endif /* _ZZIPFORMAT_H */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip___fnmatch.h0000644000175000017500000000120010737746457026032 0ustar admin2admin2#ifndef __ZZIP_INTERNAL_FNMATCH_H #define __ZZIP_INTERNAL_FNMATCH_H /** included by fseeko.c, mmapped.c, memdisk.c */ #include #ifdef ZZIP_HAVE_FNMATCH_H #include #endif #ifdef ZZIP_HAVE_FNMATCH_H #define _zzip_fnmatch fnmatch # ifdef FNM_CASEFOLD # define _zzip_fnmatch_CASEFOLD FNM_CASEFOLD # else # define _zzip_fnmatch_CASEFOLD 0 # endif #else # define _zzip_fnmatch_CASEFOLD 0 /* if your system does not have fnmatch, we fall back to strcmp: */ static int _zzip_fnmatch(char* pattern, char* string, int flags) { //puts (""); return strcmp (pattern, string); } #endif #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/stat.cpp0000644000175000017500000000612110737746457024355 0ustar admin2admin2/* * Author: * Guido Draheim * Tomi Ollila * * Copyright (c) 1999,2000,2001,2002 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 * * Description: * although this file is defining a function called zzip_stat it * will not need a real stat(2) exported by the Operating System. * It will just try to fill the fields of the ZZIP_STAT structure * of */ #include /* exported...*/ #include #include #include #define ZZIP_USE_INTERNAL #include /** * obtain information about a filename in an opened zip-archive without * opening that file first. Mostly used to obtain the uncompressed * size of a file inside a zip-archive. see => zzip_dir_open. */ int zzip_dir_stat(ZZIP_DIR * dir, zzip_char_t* name, ZZIP_STAT * zs, int flags) { struct zzip_dir_hdr * hdr = dir->hdr0; int (*cmp)(zzip_char_t*, zzip_char_t*); cmp = (flags & ZZIP_CASEINSENSITIVE) ? strcasecmp : strcmp; if (flags & ZZIP_IGNOREPATH) { char* n = strrchr((char*)name, '/'); if (n) name = n + 1; } if (hdr) while (1) { register char* hdr_name = hdr->d_name; if (flags & ZZIP_IGNOREPATH) { register char* n = strrchr(hdr_name, '/'); if (n) hdr_name = n + 1; } if (! cmp(hdr_name, name)) break; if (! hdr->d_reclen) { dir->errcode = ZZIP_ENOENT; return -1; } hdr = (struct zzip_dir_hdr *) ((char *)hdr + hdr->d_reclen); } zs->d_compr = hdr->d_compr; zs->d_csize = hdr->d_csize; zs->st_size = hdr->d_usize; zs->d_name = hdr->d_name; return 0; } /** => zzip_dir_stat * This function will obtain information about a opened file _within_ a * zip-archive. The file is supposed to be open (otherwise -1 is returned). * The st_size stat-member contains the uncompressed size. The optional * d_name is never set here. */ int zzip_file_stat (ZZIP_FILE* file, ZZIP_STAT* zs) { if (! file) return -1; zs->d_compr = file->method; zs->d_csize = file->csize; zs->st_size = file->usize; zs->d_name = 0; return 0; } /** => zzip_dir_stat * This function will obtain information about a opened file which may be * either real/zipped. The file is supposed to be open (otherwise -1 is * returned). The st_size stat-member contains the uncompressed size. * The optional d_name is never set here. For a real file, we do set the * d_csize := st_size and d_compr := 0 for meaningful defaults. */ int zzip_fstat (ZZIP_FILE* file, ZZIP_STAT* zs) { if (ZZIP_file_real(file)) { struct stat st; if (fstat (file->fd, &st) < 0) return -1; zs->st_size = st.st_size; zs->d_csize = st.st_size; zs->d_compr = 0; return 0; }else{ return zzip_file_stat (file, zs); } } /* * Local variables: * c-file-style: "stroustrup" * End: */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip___debug.h0000644000175000017500000000612610737746457025514 0ustar admin2admin2#ifndef __ZZIP_INTERNAL_DEBUG_H #define __ZZIP_INTERNAL_DEBUG_H #include #include /* perhaps want to show on syslog(3) ?? */ #ifdef DEBUG #include #define DBG1(X1) ZZIP_FOR1 { \ fprintf(stderr,"\n%s:%i:"X1"\n", ZZIP_FUNC,__LINE__ \ ); } ZZIP_END1 #define DBG2(X1,X2) ZZIP_FOR1 { \ fprintf(stderr,"\n%s:%i:"X1"\n", ZZIP_FUNC,__LINE__ \ ,X2);} ZZIP_END1 #define DBG3(X1,X2,X3) ZZIP_FOR1 { \ fprintf(stderr,"\n%s:%i:"X1"\n", ZZIP_FUNC,__LINE__ \ ,X2,X3); } ZZIP_END1 #define DBG4(X1,X2,X3,X4) ZZIP_FOR1 { \ fprintf(stderr,"\n%s:%i:"X1"\n", ZZIP_FUNC,__LINE__ \ ,X2,X3,X4); } ZZIP_END1 #define DBG5(X1,X2,X3,X4,X5) ZZIP_FOR1 { \ fprintf(stderr,"\n%s:%i:"X1"\n", ZZIP_FUNC,__LINE__ \ ,X2,X3,X4,X5); } ZZIP_END1 #define DBG6(X1,X2,X3,X4,X5,X6) ZZIP_FOR1 { \ fprintf(stderr,"\n%s:%i:"X1"\n", ZZIP_FUNC,__LINE__ \ ,X2,X3,X4,X5,X6); } ZZIP_END1 #else #define DBG1(X1) {} #define DBG2(X1,X2) {} #define DBG3(X1,X2,X3) {} #define DBG4(X1,X2,X3,X4) {} #define DBG5(X1,X2,X3,X4,X5) {} #define DBG6(X1,X2,X3,X4,X5,X6) {} #endif #define HINT1(X1) DBG1("HINT: " X1) #define HINT2(X1,X2) DBG2("HINT: " X1,X2) #define HINT3(X1,X2,X3) DBG3("HINT: " X1,X2,X3) #define HINT4(X1,X2,X3,X4) DBG4("HINT: " X1,X2,X3,X4) #define HINT5(X1,X2,X3,X4,X5) DBG5("HINT: " X1,X2,X3,X4,X5) #define HINT6(X1,X2,X3,X4,X5,X6) DBG6("HINT: " X1,X2,X3,X4,X5,X6) #define NOTE1(X1) DBG1("NOTE: " X1) #define NOTE2(X1,X2) DBG2("NOTE: " X1,X2) #define NOTE3(X1,X2,X3) DBG3("NOTE: " X1,X2,X3) #define NOTE4(X1,X2,X3,X4) DBG4("NOTE: " X1,X2,X3,X4) #define NOTE5(X1,X2,X3,X4,X5) DBG5("NOTE: " X1,X2,X3,X4,X5) #define NOTE6(X1,X2,X3,X4,X5,X6) DBG6("NOTE: " X1,X2,X3,X4,X5,X6) #define WARN1(X1) DBG1("WARN: " X1) #define WARN2(X1,X2) DBG2("WARN: " X1,X2) #define WARN3(X1,X2,X3) DBG3("WARN: " X1,X2,X3) #define WARN4(X1,X2,X3,X4) DBG4("WARN: " X1,X2,X3,X4) #define WARN5(X1,X2,X3,X4,X5) DBG5("WARN: " X1,X2,X3,X4,X5) #define WARN6(X1,X2,X3,X4,X5,X6) DBG6("WARN: " X1,X2,X3,X4,X5,X6) #define FAIL1(X1) DBG1("FAIL: " X1) #define FAIL2(X1,X2) DBG2("FAIL: " X1,X2) #define FAIL3(X1,X2,X3) DBG3("FAIL: " X1,X2,X3) #define FAIL4(X1,X2,X3,X4) DBG4("FAIL: " X1,X2,X3,X4) #define FAIL5(X1,X2,X3,X4,X5) DBG5("FAIL: " X1,X2,X3,X4,X5) #define FAIL6(X1,X2,X3,X4,X5,X6) DBG6("FAIL: " X1,X2,X3,X4,X5,X6) #ifdef DEBUG _zzip_inline static void zzip_debug_xbuf (unsigned char* p, int l) /* ZZIP_GNUC_UNUSED */ { # define q(a) ((a&0x7F)<32?32:(a&0x7F)) while (l > 0) { fprintf (stderr, "%02x %02x %02x %02x " "%02x %02x %02x %02x " "%c%c%c%c %c%c%c%c\n", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], q(p[0]), q(p[1]), q(p[2]), q(p[3]), q(p[4]), q(p[5]), q(p[6]), q(p[7])); p += 8; l -= 8; } # undef q } #endif #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip__msvc.h0000644000175000017500000001346110737746457025237 0ustar admin2admin2#ifndef _ZZIP__MSVC_H #define _ZZIP__MSVC_H 1 /* zzip__msvc.h. Generated automatically at end of configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_BYTESWAP_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_DIRECT_H #define ZZIP_HAVE_DIRECT_H 1 #endif /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef ZZIP_HAVE_DIRENT_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_DLFCN_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_FNMATCH_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_INTTYPES_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_IO_H #define ZZIP_HAVE_IO_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_MEMORY_H #define ZZIP_HAVE_MEMORY_H 1 #endif /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef ZZIP_HAVE_NDIR_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_STDINT_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_STDLIB_H #define ZZIP_HAVE_STDLIB_H 1 #endif /* Define to 1 if you have the `strcasecmp' function. */ /* #undef ZZIP_HAVE_STRCASECMP */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_STRINGS_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_STRING_H #define ZZIP_HAVE_STRING_H 1 #endif /* Define to 1 if you have the `strndup' function. */ /* #undef ZZIP_HAVE_STRNDUP */ /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef ZZIP_HAVE_SYS_DIR_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_SYS_INT_TYPES_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_SYS_MMAN_H */ /* Define to 1 if you have the header file, and it defines `DIR'. */ /* #undef ZZIP_HAVE_SYS_NDIR_H */ /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_SYS_PARAM_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_SYS_STAT_H #define ZZIP_HAVE_SYS_STAT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_SYS_TYPES_H #define ZZIP_HAVE_SYS_TYPES_H 1 #endif /* Define to 1 if you have the header file. */ /* #undef ZZIP_HAVE_UNISTD_H */ /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_WINBASE_H #define ZZIP_HAVE_WINBASE_H 1 /* hmm, is that win32 ? */ #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_WINDOWS_H #define ZZIP_HAVE_WINDOWS_H 1 /* yes, this is windows */ #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_WINNT_H #define ZZIP_HAVE_WINNT_H 1 /* is that always true? */ #endif /* Define to 1 if you have the header file. */ #ifndef ZZIP_HAVE_ZLIB_H #define ZZIP_HAVE_ZLIB_H 1 /* you do have it, right? */ #endif /* whether the system defaults to 32bit off_t but can do 64bit when requested */ /* #undef ZZIP_LARGEFILE_SENSITIVE */ /* Name of package */ #ifndef ZZIP_PACKAGE #define ZZIP_PACKAGE "zziplib-msvc" /* yes, make it known */ #endif /* Define to the address where bug reports for this package should be sent. */ /* #undef ZZIP_PACKAGE_BUGREPORT */ /* Define to the full name of this package. */ /* #undef ZZIP_PACKAGE_NAME */ /* Define to the full name and version of this package. */ /* #undef ZZIP_PACKAGE_STRING */ /* Define to the one symbol short name of this package. */ /* #undef ZZIP_PACKAGE_TARNAME */ /* Define to the version of this package. */ /* #undef ZZIP_PACKAGE_VERSION */ /* The number of bytes in type int */ #ifndef ZZIP_SIZEOF_INT #define ZZIP_SIZEOF_INT 4 #endif /* The number of bytes in type long */ #ifndef ZZIP_SIZEOF_LONG #define ZZIP_SIZEOF_LONG 4 #endif /* The number of bytes in type short */ #ifndef ZZIP_SIZEOF_SHORT #define ZZIP_SIZEOF_SHORT 2 #endif /* Define to 1 if you have the ANSI C header files. */ #ifndef ZZIP_STDC_HEADERS #define ZZIP_STDC_HEADERS 1 #endif /* Version number of package */ #ifndef ZZIP_VERSION #define ZZIP_VERSION "0.13.x" #endif /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef ZZIP_WORDS_BIGENDIAN */ /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef ZZIP__FILE_OFFSET_BITS */ /* Define for large files, on AIX-style hosts. */ /* #undef ZZIP__LARGE_FILES */ /* Define to `long long' if does not define. */ /* #undef ZZIP___int64 */ /* Define to empty if `const' does not conform to ANSI C. */ /* #undef _zzip_const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #ifndef _zzip_inline #define _zzip_inline __inline #endif #endif /* Define to `_zzip_off_t' if does not define. */ #ifndef _zzip_off64_t #define _zzip_off64_t __int64 #endif /* Define to `long' if does not define. */ #ifndef _zzip_off_t #define _zzip_off_t long #endif /* Define to equivalent of C99 restrict keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #ifndef _zzip_restrict #define _zzip_restrict #endif /* Define to `unsigned' if does not define. */ /* #undef _zzip_size_t */ /* Define to `int' if does not define. */ #ifndef _zzip_ssize_t #define _zzip_ssize_t int #endif /* once: _ZZIP__MSVC_H */ #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/Makefile.in0000644000175000017500000003325211317506534024731 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = src/compression/zziplib/generic DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libzzip_a_AR = $(AR) $(ARFLAGS) libzzip_a_LIBADD = am_libzzip_a_OBJECTS = dir.$(OBJEXT) err.$(OBJEXT) fetch.$(OBJEXT) \ file.$(OBJEXT) fseeko.$(OBJEXT) info.$(OBJEXT) \ plugin.$(OBJEXT) stat.$(OBJEXT) zip.$(OBJEXT) libzzip_a_OBJECTS = $(am_libzzip_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libzzip_a_SOURCES) DIST_SOURCES = $(libzzip_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ noinst_LIBRARIES = libzzip.a libzzip_a_SOURCES = dir.cpp err.cpp fetch.cpp file.cpp fseeko.cpp info.cpp \ plugin.cpp stat.cpp zip.cpp noinst_HEADERS = zzip_autoconf.h zzip_conf.h zzip__config.h zzip___debug.h \ zzip___dirent.h zzip_fetch.h zzip_file.h zzip___fnmatch.h zzip_format.h \ zzip_fseeko.h zzip.h zzip___hints.h zzip_info.h zzip_lib.h zzip___mmap.h \ zzip__msvc.h zzip_plugin.h zzip_stdint.h zzip_types.h INCLUDES = -I$(top_srcdir)/src/compression/zziplib all: all-am .SUFFIXES: .SUFFIXES: .cpp .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) --gnu src/compression/zziplib/generic/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/compression/zziplib/generic/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-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libzzip.a: $(libzzip_a_OBJECTS) $(libzzip_a_DEPENDENCIES) -rm -f libzzip.a $(libzzip_a_AR) libzzip.a $(libzzip_a_OBJECTS) $(libzzip_a_LIBADD) $(RANLIB) libzzip.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fetch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseeko.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` 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 $(LIBRARIES) $(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-generic clean-noinstLIBRARIES 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 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-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic 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 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: milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip.h0000644000175000017500000002423110737746457024045 0ustar admin2admin2/* * Author: * Guido Draheim * Tomi Ollila * * Copyright (c) 1999,2000,2001,2002,2003,2004 Guido Draheim * All rights reserved, * usage allowed under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 * * if you see "unknown symbol" errors, check first that `-I ..` is part of * your compiler options - a special hint to VC/IDE users who tend to make up * their own workspace files. All includes look like #include , so * you need to add an include path to the dir containing (!!) the ./zzip_ dir */ #ifndef _ZZIP_ZZIP_H /* zziplib.h */ #define _ZZIP_ZZIP_H #include #ifdef __cplusplus extern "C" { #endif /* the zzip_error_t is also used to pass back ZLIB errors... */ #define ZZIP_ERROR -4096 typedef enum { ZZIP_NO_ERROR = 0, /* no error, may be used if user sets it. */ ZZIP_OUTOFMEM = ZZIP_ERROR-20, /* out of memory */ ZZIP_DIR_OPEN = ZZIP_ERROR-21, /* failed to open zipfile, see errno for details */ ZZIP_DIR_STAT = ZZIP_ERROR-22, /* failed to fstat zipfile, see errno for details */ ZZIP_DIR_SEEK = ZZIP_ERROR-23, /* failed to lseek zipfile, see errno for details */ ZZIP_DIR_READ = ZZIP_ERROR-24, /* failed to read zipfile, see errno for details */ ZZIP_DIR_TOO_SHORT = ZZIP_ERROR-25, ZZIP_DIR_EDH_MISSING = ZZIP_ERROR-26, ZZIP_DIRSIZE = ZZIP_ERROR-27, ZZIP_ENOENT = ZZIP_ERROR-28, ZZIP_UNSUPP_COMPR = ZZIP_ERROR-29, ZZIP_CORRUPTED = ZZIP_ERROR-31, ZZIP_UNDEF = ZZIP_ERROR-32, ZZIP_DIR_LARGEFILE = ZZIP_ERROR-33 } zzip_error_t; /* * zzip_open flags. */ #define ZZIP_CASEINSENSITIVE O_APPEND /* do not use anymore. use CASLESS */ #define ZZIP_IGNOREPATH O_TRUNC /* do not use anymore. use NOPATHS */ #define ZZIP_EXTRAFLAGS (ZZIP_CASEINSENSITIVE|ZZIP_IGNOREPATH) /* zzip_open_ext_io o_modes flags : new style. use these from now on! */ #define ZZIP_CASELESS (1<<12) /* ignore filename case inside zips */ #define ZZIP_NOPATHS (1<<13) /* ignore subdir paths, just filename*/ #define ZZIP_PREFERZIP (1<<14) /* try first zipped file, then real*/ #define ZZIP_ONLYZIP (1<<16) /* try _only_ zipped file, skip real*/ #define ZZIP_FACTORY (1<<17) /* old file handle is not closed */ #define ZZIP_ALLOWREAL (1<<18) /* real files use default_io (magic) */ #define ZZIP_THREADED (1<<19) /* try to be safe for multithreading */ /* * zzip largefile renames */ #ifdef ZZIP_LARGEFILE_RENAME #define zzip_telldir zzip_telldir64 #define zzip_seekdir zzip_seekdir64 #endif /* * zzip typedefs */ /* zzip_strings_t ext[] = { ".zip", ".jar", ".pk3", 0 } */ typedef char _zzip_const * _zzip_const zzip_strings_t; typedef char _zzip_const zzip_char_t; typedef struct zzip_dir ZZIP_DIR; typedef struct zzip_file ZZIP_FILE; typedef struct zzip_dirent ZZIP_DIRENT; typedef struct zzip_dirent ZZIP_STAT; struct zzip_dirent { int d_compr; /* compression method */ int d_csize; /* compressed size */ int st_size; /* file size / decompressed size */ char * d_name; /* file name / strdupped name */ }; /* * Getting error strings * zzip_err.c */ _zzip_export /* error in _opendir : */ zzip_char_t* zzip_strerror(int errcode); _zzip_export /* error in other functions : */ zzip_char_t* zzip_strerror_of(ZZIP_DIR * dir); _zzip_export /* error mapped to errno.h defines : */ int zzip_errno(int errcode); /* * Functions to grab information from ZZIP_DIR/ZZIP_FILE structure * (if ever needed) * zzip_info.c */ _zzip_export int zzip_error(ZZIP_DIR * dir); _zzip_export void zzip_seterror(ZZIP_DIR * dir, int errcode); _zzip_export zzip_char_t* zzip_compr_str(int compr); _zzip_export ZZIP_DIR * zzip_dirhandle(ZZIP_FILE * fp); _zzip_export int zzip_dirfd(ZZIP_DIR * dir); _zzip_export int zzip_dir_real(ZZIP_DIR * dir); _zzip_export int zzip_file_real(ZZIP_FILE * fp); _zzip_export void* zzip_realdir(ZZIP_DIR * dir); _zzip_export int zzip_realfd(ZZIP_FILE * fp); /* * zip handle management * zzip_zip.c */ _zzip_export ZZIP_DIR * zzip_dir_alloc(zzip_strings_t* fileext); _zzip_export int zzip_dir_free(ZZIP_DIR *); /* * Opening/closing a zip archive * zzip-zip.c */ _zzip_export ZZIP_DIR * zzip_dir_fdopen(__zzipfd fd, zzip_error_t * errcode_p); _zzip_export ZZIP_DIR * zzip_dir_open(zzip_char_t* filename, zzip_error_t * errcode_p); _zzip_export int zzip_dir_close(ZZIP_DIR * dir); _zzip_export int zzip_dir_read(ZZIP_DIR * dir, ZZIP_DIRENT * dirent); /* * Scanning files in zip archive * zzip_dir.c * zzip_zip.c */ _zzip_export ZZIP_DIR * zzip_opendir(zzip_char_t* filename); _zzip_export int zzip_closedir(ZZIP_DIR * dir); _zzip_export ZZIP_DIRENT * zzip_readdir(ZZIP_DIR * dir); _zzip_export void zzip_rewinddir(ZZIP_DIR * dir); _zzip_export zzip_off_t zzip_telldir(ZZIP_DIR * dir); _zzip_export void zzip_seekdir(ZZIP_DIR * dir, zzip_off_t offset); /* * 'opening', 'closing' and reading invidual files in zip archive. * zzip_file.c */ _zzip_export ZZIP_FILE * zzip_file_open(ZZIP_DIR * dir, zzip_char_t* name, int flags); _zzip_export int zzip_file_close(ZZIP_FILE * fp); _zzip_export zzip_ssize_t zzip_file_read(ZZIP_FILE * fp, char* buf, zzip_size_t len); _zzip_export ZZIP_FILE * zzip_open(zzip_char_t* name, int flags); _zzip_export int zzip_close(ZZIP_FILE * fp); _zzip_export zzip_ssize_t zzip_read(ZZIP_FILE * fp, char * buf, zzip_size_t len); /* * the stdc variant to open/read/close files. - Take note of the freopen() * call as it may reuse an existing preparsed copy of a zip central directory */ _zzip_export ZZIP_FILE* zzip_freopen(zzip_char_t* name, zzip_char_t* mode, ZZIP_FILE*); _zzip_export ZZIP_FILE* zzip_fopen(zzip_char_t* name, zzip_char_t* mode); _zzip_export zzip_size_t zzip_fread(void *ptr, zzip_size_t size, zzip_size_t nmemb, ZZIP_FILE * file); _zzip_export int zzip_fclose(ZZIP_FILE * fp); /* * seek and tell functions */ _zzip_export int zzip_rewind(ZZIP_FILE *fp); _zzip_export zzip_off_t zzip_seek(ZZIP_FILE * fp, zzip_off_t offset, int whence); _zzip_export zzip_off_t zzip_tell(ZZIP_FILE * fp); /* * reading info of a single file * zzip_stat.c */ _zzip_export int zzip_dir_stat(ZZIP_DIR * dir, zzip_char_t* name, ZZIP_STAT * zs, int flags); _zzip_export int zzip_file_stat(ZZIP_FILE * fp, ZZIP_STAT * zs); _zzip_export int zzip_fstat(ZZIP_FILE * fp, ZZIP_STAT * zs); #ifdef ZZIP_LARGEFILE_RENAME #define zzip_open_shared_io zzip_open_shared_io64 #define zzip_open_ext_io zzip_open_ext_io64 #define zzip_opendir_ext_io zzip_opendir_ext_io64 #define zzip_dir_open_ext_io zzip_dir_open_ext_io64 #define zzip_plugin_io_t zzip_plugin_io64_t #endif /* * all ext_io functions can be called with a default of ext/io == zero/zero * which will default to a ".zip" extension and posix io of the system. */ typedef union _zzip_plugin_io _zzip_const * zzip_plugin_io_t; _zzip_export ZZIP_FILE * zzip_open_shared_io(ZZIP_FILE* stream, zzip_char_t* name, int o_flags, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io); _zzip_export ZZIP_FILE * zzip_open_ext_io(zzip_char_t* name, int o_flags, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io); _zzip_export ZZIP_DIR * zzip_opendir_ext_io(zzip_char_t* name, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io); _zzip_export ZZIP_DIR * zzip_dir_open_ext_io(zzip_char_t* filename, zzip_error_t* errcode_p, zzip_strings_t* ext, zzip_plugin_io_t io); /* zzip_file_open_ext_io => zzip_dir_open_ext_io + zzip_file_open */ #if defined _ZZIP_WRITE_SOURCE /* ........................................................................ * write support is not yet implemented * zzip_write.c */ #define ZZIP_NO_CREAT 1 ZZIP_DIR* zzip_dir_creat_ext_io(zzip_char_t* name, int o_mode, zzip_strings_t* ext, zzip_plugin_io_t io); ZZIP_DIR* zzip_dir_creat(zzip_char_t* name, int o_mode); int zzip_file_mkdir(ZZIP_DIR* dir, zzip_char_t* name, int o_mode); ZZIP_FILE* zzip_file_creat(ZZIP_DIR* dir, zzip_char_t* name, int o_mode); zzip_ssize_t zzip_file_write(ZZIP_FILE* file, const void* ptr, zzip_size_t len); ZZIP_DIR* zzip_createdir(zzip_char_t* name, int o_mode); zzip_ssize_t zzip_write(ZZIP_FILE* file, const void* ptr, zzip_size_t len); zzip_size_t zzip_fwrite(const void* ptr, zzip_size_t len, zzip_size_t multiply, ZZIP_FILE* file); #ifndef zzip_savefile #define zzip_savefile 0 #define zzip_savefile_is_null #endif #ifdef _ZZIP_NO_INLINE #define zzip_mkdir(_name_,_mode_) \ zzip_file_mkdir((zzip_savefile),(_name_),(_mode_)) #define zzip_creat(_name_,_mode_) \ zzip_file_creat((zzip_savefile),(_name_),(_mode_)) #define zzip_sync() \ { zzip_closedir((zzip_savefile)); (zzip_savefile) = 0; } #define zzip_start(_name_,_mode_,_ext_) \ { if ((zzip_savefile)) zzip_closedir((zzip_savefile)); zzip_savefile = zzip_dir_creat(_name_, _mode_,_ext_); } #else _zzip_inline static int zzip_mkdir(zzip_char_t* name, int o_mode) { return zzip_file_mkdir(zzip_savefile, name, o_mode); } _zzip_inline static ZZIP_FILE* zzip_creat(zzip_char_t* name, int o_mode) { return zzip_file_creat(zzip_savefile, name, o_mode); } #ifndef zzip_savefile_is_null _zzip_inline static void zzip_sync(void) { zzip_closedir(zzip_savefile); zzip_savefile = 0; } _zzip_inline static void zzip_mkfifo(zzip_char_t* name, int o_mode) { if ((zzip_savefile)) zzip_closedir (zzip_savefile); zzip_savefile = zzip_createdir(_name_,_mode_); } #else _zzip_inline static void zzip_sync(void) {} _zzip_inline static void zzip_mkfifo(zzip_char_t* name, int o_mode) {} #endif #endif /* _ZZIP_NO_INLINE */ #endif /* _ZZIP_WRITE_SOURCE */ #ifdef __cplusplus }; #endif #endif /* _ZZIPLIB_H */ /* * Local variables: * c-file-style: "stroustrup" * End: */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/fetch.cpp0000644000175000017500000000576010737746457024503 0ustar admin2admin2#include #if defined ZZIP_WORDS_BIGENDIAN && \ defined bswap_16 && defined bswap_32 && defined bswap_64 # define __ZZIP_GET16(__p) bswap_16(*(uint16_t*)(__p)) # define __ZZIP_GET32(__p) bswap_32(*(uint32_t*)(__p)) # define __ZZIP_SET16(__p,__x) (*(uint16_t*)(__p) = bswap_16((uint16_t)(__x))) # define __ZZIP_SET32(__p,__x) (*(uint32_t*)(__p) = bswap_32((uint32_t)(__x))) # define __ZZIP_GET64(__p) bswap_64(*(zzip_off64_t*)(__p)) # define __ZZIP_SET64(__p,__x) \ (*(zzip_off64_t*)(__p) = bswap_64((zzip_off64_t)(__x))) #endif /* ------------------------- fetch helpers --------------------------------- */ /** * Make 32 bit value in host byteorder from little-endian mapped octet-data * (works also on machines which SIGBUS on misaligned data access (eg. 68000)) */ uint32_t __zzip_get32(unsigned char * s) { #if defined __ZZIP_GET32 return __ZZIP_GET32(s); #else return ((uint32_t)s[3] << 24) | ((uint32_t)s[2] << 16) | ((uint32_t)s[1] << 8) | ((uint32_t)s[0]); #endif } /** => __zzip_get32 * This function does the same for a 16 bit value. */ uint16_t __zzip_get16(unsigned char * s) { #if defined __ZZIP_GET16 return __ZZIP_GET16(s); #else return ((uint16_t)s[1] << 8) | ((uint16_t)s[0]); #endif } /** => __zzip_get32 * This function does the same for an off64_t value. */ uint64_t __zzip_get64(unsigned char * s) { #ifdef __GNUC__ register uint64_t v = s[7]; v <<= 8; v |= s[6]; v <<= 8; v |= s[5]; v <<= 8; v |= s[4]; v <<= 8; v |= s[3]; v <<= 8; v |= s[2]; v <<= 8; v |= s[1]; v <<= 8; v |= s[0]; return v; #else return ((uint64_t)s[7] << 56) | ((uint64_t)s[6] << 48) | ((uint64_t)s[5] << 40) | ((uint64_t)s[4] << 32) | ((uint64_t)s[3] << 24) | ((uint64_t)s[2] << 16) | ((uint64_t)s[1] << 8) | ((uint64_t)s[0]); #endif } /** => __zzip_get32 * This function pushes a 32bit value at the specified address */ void __zzip_set32(unsigned char * s, uint32_t v) { #if defined __ZZIP_SET32 return __ZZIP_SET32(s, v); #else s[0] = (unsigned char) (v); v >>= 8; s[1] = (unsigned char) (v); v >>= 8; s[2] = (unsigned char) (v); v >>= 8; s[3] = (unsigned char) (v); #endif } /** => __zzip_get32 * This function does the same for a 16 bit value. */ void __zzip_set16(unsigned char * s, uint16_t v) { #if defined __ZZIP_SET16 return __ZZIP_SET16(s, v); #else s[0] = (unsigned char) (v); v >>= 8; s[1] = (unsigned char) (v); #endif } /** => __zzip_get32 * This function pushes a off64_t value at the specified address */ void __zzip_set64(unsigned char * s, uint64_t v) { s[0] = (unsigned char) (v); v >>= 8; s[1] = (unsigned char) (v); v >>= 8; s[2] = (unsigned char) (v); v >>= 8; s[3] = (unsigned char) (v); v >>= 8; s[4] = (unsigned char) (v); v >>= 8; s[5] = (unsigned char) (v); v >>= 8; s[6] = (unsigned char) (v); v >>= 8; s[7] = (unsigned char) (v); } milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_info.h0000644000175000017500000000140610737746457025057 0ustar admin2admin2/* * Author: * Guido Draheim * * Copyright (c) 2000,2001,2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #ifdef ZZIP_USE_INTERNAL /* do not make these public, they are for internal use only */ #define ZZIP_error(__dir) __dir->errcode #define ZZIP_seterror(__dir, __code) __dir->errcode = __code #define ZZIP_dirhandle(__fp) __fp->dir #define ZZIP_dirfd(__dir) __dir->fd #define ZZIP_dir_real(__dir) __dir->realdir != 0 #define ZZIP_file_real(__fp) __fp->dir == 0 #define ZZIP_realdir(__dir) __dir->realdir #define ZZIP_reafd(__fp) __fp->fd #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/file.cpp0000644000175000017500000010045310737746457024324 0ustar admin2admin2/* * Author: * Guido Draheim * Tomi Ollila * * Copyright (c) 1999,2000,2001,2002,2003 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #include /* exported...*/ #include #include #include #include #include #include #include #include #include #if 0 # if defined ZZIP_HAVE_IO_H # include /* tell */ # else # define tell(fd) lseek(fd,0,SEEK_CUR) # endif #else #define tells(fd) seeks(fd,0,SEEK_CUR) #endif /** * the direct function of => zzip_close(fp). it will cleanup the * inflate-portion of => zlib and free the structure given. * * it is called quite from the error-cleanup parts * of the various => _open functions. * * the .refcount is decreased and if zero the fp->dir is closed just as well. */ int zzip_file_close(ZZIP_FILE * fp) { auto int self; ZZIP_DIR * dir = fp->dir; if (fp->method) inflateEnd(&fp->d_stream); /* inflateEnd() can be called many times */ if (dir->cache.locked == NULL) dir->cache.locked = &self; if (fp->buf32k) { if (dir->cache.locked == &self && dir->cache.buf32k == NULL) dir->cache.buf32k = fp->buf32k; else free(fp->buf32k); } if (dir->currentfp == fp) dir->currentfp = NULL; dir->refcount--; /* ease to notice possible dangling reference errors */ memset(fp, 0, sizeof(*fp)); if (dir->cache.locked == &self && dir->cache.fp == NULL) dir->cache.fp = fp; else free(fp); if (dir->cache.locked == &self) dir->cache.locked = NULL; if (! dir->refcount) return zzip_dir_close(dir); else return 0; } static int zzip_file_saveoffset(ZZIP_FILE * fp) { if (fp) { __zzipfd fd = fp->dir->fd; zzip_off_t off = fp->io->fd.seeks(fd, 0, SEEK_CUR); if (off < 0) return -1; fp->offset = off; } return 0; } # ifndef ZZIP_CHECK_BACKSLASH_DIRSEPARATOR /* NOTE: also default */ # define ZZIP_CHECK_BACKSLASH_DIRSEPARATOR 0 /* to "NO" on win32 ! */ # endif # if !defined strcasecmp && !defined ZZIP_HAVE_STRCASECMP # define ZZIP_CHECK_BACKSLASH_DIRSEPARATOR 1 # endif #if ! ZZIP_CHECK_BACKSLASH_DIRSEPARATOR+0 #define dirsep_strrchr(N,C) strrchr(N,C) #define dirsep_casecmp strcasecmp #else #define dirsep_strrchr(N,C) _dirsep_strrchr(N) #define dirsep_casecmp _dirsep_casecmp static zzip_char_t* _dirsep_strrchr (zzip_char_t* name) { char* n = strrchr (name, '/'); char* m = strrchr (name, '\\'); if (m && n && m > n) n = m; return n; } static int _dirsep_casecmp (zzip_char_t* s1, zzip_char_t* s2) { /* ASCII tolower - including mapping of backslash in normal slash */ static const char mapping[] = "@abcdefghijklmnopqrstuvwxyz[/]^_"; int c1, c2; while (*s1 && *s2) { c1 = (int)(unsigned char) *s1; c2 = (int)(unsigned char) *s2; if ((c1&0xE0) == 0x40) c1 = mapping[c1&0x1f]; if ((c2&0xE0) == 0x40) c2 = mapping[c2&0x1f]; if (c1 != c2) return (c1 - c2); s1++; s2++; } return (((int)(unsigned char) *s1) - ((int)(unsigned char) *s2)); } #endif static int zzip_inflate_init(ZZIP_FILE *, struct zzip_dir_hdr *); /** * open an => ZZIP_FILE from an already open => ZZIP_DIR handle. Since * we have a chance to reuse a cached => buf32k and => ZZIP_FILE memchunk * this is the best choice to unpack multiple files. * * Note: the zlib supports 2..15 bit windowsize, hence we provide a 32k * memchunk here... just to be safe. */ ZZIP_FILE * zzip_file_open(ZZIP_DIR * dir, zzip_char_t* name, int o_mode) { auto int self; zzip_error_t err = (zzip_error_t)0; struct zzip_file * fp = 0; struct zzip_dir_hdr * hdr = dir->hdr0; int (*cmp)(zzip_char_t*, zzip_char_t*); cmp = (o_mode & ZZIP_CASELESS)? dirsep_casecmp: strcmp; if (! dir || !dir->fd || dir->fd == (unsigned)-1 ) return 0; if (o_mode & ZZIP_NOPATHS) { register zzip_char_t* n = dirsep_strrchr(name, '/'); if (n) name = n + 1; } if (hdr) while (1) { register zzip_char_t* hdr_name = hdr->d_name; if (o_mode & ZZIP_NOPATHS) { register zzip_char_t* n = dirsep_strrchr(hdr_name, '/'); if (n) hdr_name = n + 1; } HINT4("name='%s', compr=%d, size=%d\n", hdr->d_name, hdr->d_compr, hdr->d_usize); if (!cmp(hdr_name, name)) { switch (hdr->d_compr) { case 0: /* store */ case 8: /* inflate */ break; default: { err = ZZIP_UNSUPP_COMPR; goto error; } } if (dir->cache.locked == NULL) dir->cache.locked = &self; if (dir->cache.locked == &self && dir->cache.fp) { fp = dir->cache.fp; dir->cache.fp = NULL; /* memset(zfp, 0, sizeof *fp); cleared in zzip_file_close() */ }else { if (! (fp = (ZZIP_FILE *)calloc(1, sizeof(*fp)))) { err = ZZIP_OUTOFMEM; goto error; } } fp->dir = dir; fp->io = dir->io; dir->refcount++; if (dir->cache.locked == &self && dir->cache.buf32k) { fp->buf32k = dir->cache.buf32k; dir->cache.buf32k = NULL; } else { if (! (fp->buf32k = (char *)malloc(ZZIP_32K))) { err = ZZIP_OUTOFMEM; goto error; } } if (dir->cache.locked == &self) dir->cache.locked = NULL; /* * In order to support simultaneous open files in one zip archive * we'll fix the fd offset when opening new file/changing which * file to read... */ if (zzip_file_saveoffset(dir->currentfp) < 0) { err = ZZIP_DIR_SEEK; goto error; } fp->offset = hdr->d_off; dir->currentfp = fp; if (dir->io->fd.seeks(dir->fd, hdr->d_off, SEEK_SET) < 0) { err = ZZIP_DIR_SEEK; goto error; } { /* skip local header - should test tons of other info, * but trust that those are correct */ zzip_ssize_t dataoff; struct zzip_file_header * p = (struct zzip_file_header*) fp->buf32k; dataoff = dir->io->fd.read(dir->fd, (void*)p, sizeof(*p)); if (dataoff < (zzip_ssize_t)sizeof(*p)) { err = ZZIP_DIR_READ; goto error; } if (! zzip_file_header_check_magic(p)) /* PK\3\4 */ { err = ZZIP_CORRUPTED; goto error; } dataoff = zzip_file_header_sizeof_tail(p); if (dir->io->fd.seeks(dir->fd, dataoff, SEEK_CUR) < 0) { err = ZZIP_DIR_SEEK; goto error; } fp->dataoffset = dir->io->fd.tells(dir->fd); fp->usize = hdr->d_usize; fp->csize = hdr->d_csize; } err = (zzip_error_t)zzip_inflate_init (fp, hdr); if (err) { goto error; } return fp; }else { if (hdr->d_reclen == 0) break; hdr = (struct zzip_dir_hdr *)((char *)hdr + hdr->d_reclen); }/*cmp name*/ }/*forever*/ dir->errcode = ZZIP_ENOENT; zzip_errno(ZZIP_ENOENT); return NULL; error: if (fp) zzip_file_close(fp); dir->errcode = err; zzip_errno(err); return NULL; } /** * call => inflateInit and setup fp's iterator variables, * used by lowlevel => _open functions. */ static int zzip_inflate_init(ZZIP_FILE * fp, struct zzip_dir_hdr* hdr) { int err; fp->method = hdr->d_compr; fp->restlen = hdr->d_usize; if (fp->method) { memset(&fp->d_stream, 0, sizeof(fp->d_stream)); err = inflateInit2(&fp->d_stream, -MAX_WBITS); if (err != Z_OK) { goto error; } fp->crestlen = hdr->d_csize; } return 0; error: if (fp) zzip_file_close(fp); return err; } /** * This function closes the given ZZIP_FILE handle. * * If the ZZIP_FILE wraps a normal stat'fd then it is just that int'fd * that is being closed and the otherwise empty ZZIP_FILE gets freed. */ int zzip_fclose(ZZIP_FILE * fp) { if (! fp) return 0; if (! fp->dir) { int r = fp->io->fd.close(fp->fd); free(fp); return r; } /* stat fd */ else return zzip_file_close(fp); } /** => zzip_fclose */ int zzip_close(ZZIP_FILE* fp) { return zzip_fclose (fp); } /** * This functions read data from zip-contained file. * * It works like => read(2) and will fill the given buffer with bytes from * the opened file. It will return the number of bytes read, so if the => EOF * is encountered you will be prompted with the number of bytes actually read. * * This is the routines that needs the => buf32k buffer, and it would have * need for much more polishing but it does already work quite well. * * Note: the 32K buffer is rather big. The original inflate-algorithm * required just that but the latest zlib would work just fine with * a smaller buffer. */ zzip_ssize_t zzip_file_read(ZZIP_FILE * fp, char * buf, zzip_size_t len) { ZZIP_DIR * dir; zzip_size_t l; zzip_ssize_t rv; if (! fp || ! fp->dir) return 0; dir = fp->dir; l = fp->restlen > len ? len : fp->restlen; if (fp->restlen == 0) return 0; /* * If this is other handle than previous, save current seek pointer * and read the file position of `this' handle. */ if (dir->currentfp != fp) { if (zzip_file_saveoffset(dir->currentfp) < 0 || fp->io->fd.seeks(dir->fd, fp->offset, SEEK_SET) < 0) { dir->errcode = ZZIP_DIR_SEEK; return -1; } else { dir->currentfp = fp; } } /* if more methods is to be supported, change this to `switch ()' */ if (fp->method) /* method != 0 == 8, inflate */ { fp->d_stream.avail_out = l; fp->d_stream.next_out = (unsigned char *)buf; do { int err; zzip_size_t startlen; if (fp->crestlen > 0 && fp->d_stream.avail_in == 0) { zzip_size_t cl = ( fp->crestlen < ZZIP_32K ? fp->crestlen : ZZIP_32K ); /* zzip_size_t cl = fp->crestlen > 128 ? 128 : fp->crestlen; */ zzip_ssize_t i = fp->io->fd.read(dir->fd, fp->buf32k, cl); if (i <= 0) { dir->errcode = ZZIP_DIR_READ; /* or ZZIP_DIR_READ_EOF ? */ return -1; } fp->crestlen -= i; fp->d_stream.avail_in = i; fp->d_stream.next_in = (unsigned char *)fp->buf32k; } startlen = fp->d_stream.total_out; err = inflate(&fp->d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) { fp->restlen = 0; } else if (err == Z_OK) { fp->restlen -= (fp->d_stream.total_out - startlen); } else { dir->errcode = err; return -1; } } while (fp->restlen && fp->d_stream.avail_out); return l - fp->d_stream.avail_out; }else { /* method == 0 -- unstore */ rv = fp->io->fd.read(dir->fd, buf, l); if (rv > 0) { fp->restlen-= rv; } else if (rv < 0) { dir->errcode = ZZIP_DIR_READ; } return rv; } } /** * This function will read(2) data from a real/zipped file. * * the replacement for => read(2) will fill the given buffer with bytes from * the opened file. It will return the number of bytes read, so if the EOF * is encountered you will be prompted with the number of bytes actually read. * * If the file-handle is wrapping a stat'able file then it will actually just * perform a normal => read(2)-call, otherwise => zzip_file_read is called * to decompress the data stream and any error is mapped to => errno(3). */ zzip_ssize_t zzip_read(ZZIP_FILE * fp, char * buf, zzip_size_t len) { if (! fp) return 0; if (! fp->dir) { return fp->io->fd.read(fp->fd, buf, len); } /* stat fd */ else { register zzip_ssize_t v; v = zzip_file_read(fp, buf, len); if (v == -1) { errno = zzip_errno(fp->dir->errcode); } return v; } } /** => zzip_read */ zzip_size_t zzip_fread(void *ptr, zzip_size_t size, zzip_size_t nmemb, ZZIP_FILE *file) { if (! size) size=1; return zzip_read (file, (char*)ptr, size*nmemb)/size; } #define ZZIP_WRONLY O_WRONLY #define ZZIP_EXCL O_EXCL #if defined O_SYNC #define ZZIP_SYNC O_SYNC #else #define ZZIP_SYNC 0 #endif #if defined O_NONBLOCK #define ZZIP_NONBLOCK O_NONBLOCK #elif defined O_NDELAY #define ZZIP_NOCTTY O_NDELAY #else #define ZZIP_NOCTTY 0 #endif /* ------------------------------------------------------------------- */ /** * This function will => fopen(3) a real/zipped file. * * It has some magic functionality builtin - it will first try to open * the given filename as a normal file. If it does not * exist, the given path to the filename (if any) is split into * its directory-part and the file-part. A ".zip" extension is * then added to the directory-part to create the name of a * zip-archive. That zip-archive (if it exists) is being searched * for the file-part, and if found a zzip-handle is returned. * * Note that if the file is found in the normal fs-directory the * returned structure is mostly empty and the => zzip_read call will * use the libc => read to obtain data. Otherwise a => zzip_file_open * is performed and any error mapped to => errno(3). * * unlike the posix-wrapper => zzip_open the mode-argument is * a string which allows for more freedom to support the extra * zzip modes called ZZIP_CASEINSENSITIVE and ZZIP_IGNOREPATH. * Currently, this => zzip_fopen call will convert the following * characters in the mode-string into their corrsponding mode-bits: *
  • "r" : O_RDONLY : read-only *
  • "b" : O_BINARY : binary (win32 specific) *
  • "f" : O_NOCTTY : no char device (unix) *
  • "i" : ZZIP_CASELESS : inside zip file *
  • "*" : ZZIP_NOPATHS : inside zip file only *
all other modes will be ignored for zip-contained entries * but they are transferred for compatibility and portability, * including these extra sugar bits: *
  • "x" : O_EXCL : fail if file did exist *
  • "s" : O_SYNC : synchronized access *
  • "n" : O_NONBLOCK : nonblocking access *
  • "z#" : compression level : for zlib *
  • "g#" : group access : unix access bits *
  • "u#" : owner access : unix access bits *
  • "o#" : world access : unix access bits *
... the access bits are in traditional unix bit format * with 7 = read/write/execute, 6 = read/write, 4 = read-only. * * The default access mode is 0664, and the compression level * is ignored since the lib can not yet write zip files, otherwise * it would be the initialisation value for the zlib deflateInit * where 0 = no-compression, 1 = best-speed, 9 = best-compression. */ ZZIP_FILE* zzip_fopen(zzip_char_t* filename, zzip_char_t* mode) { return zzip_freopen (filename, mode, 0); } /** => zzip_fopen * * This function receives an additional argument pointing to * a ZZIP_FILE* being already in use. If this extra argument is * null then this function is identical with calling => zzip_fopen * * Per default, the old file stream is closed and only the internal * structures associated with it are kept. These internal structures * may be reused for the return value, and this is a lot quicker when * the filename matches a zipped file that is incidently in the very * same zip arch as the old filename wrapped in the stream struct. * * That's simply because the zip arch's central directory does not * need to be read again. As an extension for this function, if the * mode-string contains a "q" then the old stream is not closed but * left untouched, instead it is only given as a hint that a new * file handle may share/copy the zip arch structures of the old file * handle if that is possible, i.e when they are in the same zip arch. */ ZZIP_FILE* zzip_freopen(zzip_char_t* filename, zzip_char_t* mode, ZZIP_FILE* stream) { int o_flags = 0; int o_modes = 0664; if (!mode) mode = "rb"; # ifndef O_BINARY # define O_BINARY 0 # endif # ifndef O_NOCTTY # define O_NOCTTY 0 # endif # ifndef O_SYNC # define O_SYNC 0 # endif # ifndef O_NONBLOCK # define O_NONBLOCK 0 # endif for(; *mode; mode++) { switch (*mode) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': continue; /* ignore if not attached to other info */ case 'r': o_flags |= mode[1] == '+' ? O_RDWR : O_RDONLY; break; case 'w': o_flags |= mode[1] == '+' ? O_RDWR : O_WRONLY; o_flags |= O_TRUNC; break; case 'b': o_flags |= O_BINARY; break; case 'f': o_flags |= O_NOCTTY; break; case 'i': o_modes |= ZZIP_CASELESS; break; case '*': o_modes |= ZZIP_NOPATHS; break; case 'x': o_flags |= O_EXCL; break; case 's': o_flags |= O_SYNC; break; case 'n': o_flags |= O_NONBLOCK; break; case 'o': o_modes &=~ 07; o_modes |= ((mode[1] - '0'))&07; continue; case 'g': o_modes &=~ 070; o_modes |= ((mode[1] - '0')<<3)&070; continue; case 'u': o_modes &=~ 0700; o_modes |= ((mode[1] - '0')<<6)&0700; continue; case 'q': o_modes |= ZZIP_FACTORY; break; case 'z': /* compression level */ continue; /* currently ignored, just for write mode */ } } { ZZIP_FILE* fp = zzip_open_shared_io (stream, filename, o_flags, o_modes, 0, 0); if (! o_modes&ZZIP_FACTORY && stream) zzip_file_close (stream); return fp; } } /** * This function will => open(2) a real/zipped file * * It has some magic functionality builtin - it will first try to open * the given filename as a normal file. If it does not * exist, the given path to the filename (if any) is split into * its directory-part and the file-part. A ".zip" extension is * then added to the directory-part to create the name of a * zip-archive. That zip-archive (if it exists) is being searched * for the file-part, and if found a zzip-handle is returned. * * Note that if the file is found in the normal fs-directory the * returned structure is mostly empty and the => zzip_read call will * use the libc => read to obtain data. Otherwise a => zzip_file_open * is performed and any error mapped to => errno(3). * * There was a possibility to transfer zziplib-specific openmodes * through o_flags but you should please not use them anymore and * look into => zzip_open_ext_io to submit them down. This function * is shallow in that it just extracts the zzipflags and calls
  • * zzip_open_ext_io(filename, o_flags, zzipflags|0664, 0, 0)
* you must stop using this extra functionality (not well known * anyway) since zzip_open might be later usable to open files * for writing in which case the _EXTRAFLAGS will get in conflict. * * compare with => open(2) and => zzip_fopen */ ZZIP_FILE* zzip_open(zzip_char_t* filename, int o_flags) { /* backward compatibility */ int o_modes = 0664; if (o_flags & ZZIP_CASEINSENSITIVE) { o_flags ^= ZZIP_CASEINSENSITIVE; o_modes |= ZZIP_CASELESS; } if (o_flags & ZZIP_IGNOREPATH) { o_flags ^= ZZIP_IGNOREPATH; o_modes |= ZZIP_NOPATHS; } return zzip_open_ext_io(filename, o_flags, o_modes, 0, 0); } /* ZZIP_ONLYZIP won't work on platforms with sizeof(int) == 16bit */ #if ZZIP_SIZEOF_INT+0 == 2 #undef ZZIP_ONLYZIP #endif /** => zzip_open * * This function uses explicit ext and io instead of the internal * defaults, setting them to zero is equivalent to => zzip_open * * note that the two flag types have been split into an o_flags * (for fcntl-like openflags) and o_modes where the latter shall * carry the zzip_flags and possibly accessmodes for unix filesystems. * Since this version of zziplib can not write zipfiles, it is not * yet used for anything else than zzip-specific modeflags. */ ZZIP_FILE* zzip_open_ext_io(zzip_char_t* filename, int o_flags, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io) { return zzip_open_shared_io (0, filename, o_flags, o_modes, ext, io); } /** => zzip_open * * This function takes an extra stream argument - if a handle has been * then ext/io can be left null and the new stream handle will pick up * the ext/io. This should be used only in specific environment however * since => zzip_file_real does not store any ext-sequence. * * The benefit for this function comes in when the old file handle * was openened from a file within a zip archive. When the new file * is in the same zip archive then the internal zzip_dir structures * will be shared. It is even quicker, as no check needs to be done * anymore trying to guess the zip archive place in the filesystem, * here we just check whether the zip archive's filepath is a prefix * part of the filename to be opened. * * Note that this function is also used by => zzip_freopen that * will unshare the old handle, thereby possibly closing the handle. */ ZZIP_FILE* zzip_open_shared_io (ZZIP_FILE* stream, zzip_char_t* filename, int o_flags, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io) { if (stream && stream->dir) { if (! ext) ext = stream->dir->fileext; if (! io) io = stream->dir->io; } if (! io) io = zzip_get_default_io (); if (o_modes & (ZZIP_PREFERZIP|ZZIP_ONLYZIP)) goto try_zzip; try_real: /* prefer an existing real file */ { zzip_plugin_io_t os = (o_modes & ZZIP_ALLOWREAL) ? zzip_get_default_io () : io; __zzipfd fd = os->fd.open(filename, o_flags); /* io->fd.open */ if (fd != (unsigned)-1) { ZZIP_FILE* fp = (ZZIP_FILE*)calloc (1, sizeof(ZZIP_FILE)); if (!fp) { os->fd.close(fd); return 0; } /* io->fd.close */ fp->fd = fd; fp->io = os; return fp; } if (o_modes & ZZIP_PREFERZIP) return 0; } try_zzip: /* if the user had it in place of a normal xopen, then * we better defend this lib against illegal usage */ if (o_flags & (O_CREAT|O_WRONLY)) { errno = EINVAL; return 0; } if (o_flags & (O_RDWR)) { o_flags ^= O_RDWR; o_flags |= O_RDONLY; } /* this is just for backward compatibility -and strictly needed to * prepare ourselves for more options and more options later on... */ /*# if (o_modes & ZZIP_CASELESS) { o_flags |= ZZIP_CASEINSENSITIVE; } */ /*# if (o_modes & ZZIP_NOPATHS) { o_flags |= ZZIP_IGNOREPATH; } */ /* see if we can open a file that is a zip file */ { char basename[PATH_MAX]; char* p; strcpy (basename, filename); /* see if we can share the same zip directory */ if (stream && stream->dir && stream->dir->realname) { zzip_size_t len = strlen (stream->dir->realname); if (! memcmp (filename, stream->dir->realname, len) && filename[len] == '/' && filename[len+1]) { ZZIP_FILE* fp = zzip_file_open (stream->dir, filename+len+1, o_modes); if (! fp) { errno = zzip_errno (stream->dir->errcode); } return fp; } } /* per each slash in filename, check if it there is a zzip around */ while ((p = strrchr (basename, '/'))) { zzip_error_t e = (zzip_error_t)0; ZZIP_DIR* dir; ZZIP_FILE* fp; int fd; *p = '\0'; /* cut at path separator == possible zipfile basename */ fd = __zzip_try_open (basename, o_flags|O_RDONLY|O_BINARY, ext, io); if (fd == -1) { continue; } /* found: */ /* found zip-file, now try to parse it */ dir = zzip_dir_fdopen_ext_io(fd, &e, ext, io); if (e) { errno = zzip_errno(e); io->fd.close(fd); return 0; } /* (p - basename) is the lenghtof zzip_dir part of the filename */ fp = zzip_file_open(dir, filename + (p - basename) +1, o_modes); if (! fp) { errno = zzip_errno(dir->errcode); } else { if (! dir->realname) dir->realname = strdup (basename); } zzip_dir_close(dir); /* note: since (fp) is attached that (dir) will survive */ /* but (dir) is implicitly closed on next zzip_close(fp) */ return fp; } /*again*/ if (o_modes & ZZIP_PREFERZIP) goto try_real; errno = ENOENT; return 0; } } #if defined ZZIP_LARGEFILE_RENAME && defined EOVERFLOW && defined PIC #undef zzip_open_shared_io /* zzip_open_shared_io64 */ #undef zzip_open_ext_io /* zzip_open_ext_io64 */ #undef zzip_opendir_ext_io /* zzip_opendir_ext_io64 */ _zzip_export ZZIP_FILE * zzip_open_shared_io(ZZIP_FILE* stream, zzip_char_t* name, int o_flags, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io); _zzip_export ZZIP_FILE * zzip_open_ext_io(zzip_char_t* name, int o_flags, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io); _zzip_export ZZIP_DIR * zzip_opendir_ext_io(zzip_char_t* name, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io); /* DLL compatibility layer - so that 32bit code can link with this lib too */ _zzip_export ZZIP_FILE * zzip_open_shared_io(ZZIP_FILE* stream, zzip_char_t* name, int o_flags, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io) { if (! io) return zzip_open_shared_io64 (stream, name, o_flags, o_modes, ext, io); errno = EOVERFLOW; return NULL; } _zzip_export ZZIP_FILE * zzip_open_ext_io(zzip_char_t* name, int o_flags, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io) { if (! io) return zzip_open_ext_io64 (name, o_flags, o_modes, ext, io); errno = EOVERFLOW; return NULL; } _zzip_export ZZIP_DIR * zzip_opendir_ext_io(zzip_char_t* name, int o_modes, zzip_strings_t* ext, zzip_plugin_io_t io) { if (! io) return zzip_opendir_ext_io64 (name, o_modes, ext, io); errno = EOVERFLOW; return NULL; } #endif /* ZZIP_LARGEFILE_RENAME && EOVERFLOW && PIC */ /* ------------------------------------------------------------------- */ /** * This function will rewind a real/zipped file. * * It seeks to the beginning of this file's data in the zip, * or the beginning of the file for a stat'fd. */ int zzip_rewind(ZZIP_FILE *fp) { ZZIP_DIR *dir; int err; if (! fp) return -1; if (! fp->dir) { /* stat fd */ fp->io->fd.seeks(fp->fd,0,SEEK_SET); return 0; } dir = fp->dir; /* * If this is other handle than previous, save current seek pointer */ if (dir->currentfp != fp) { if (zzip_file_saveoffset(dir->currentfp) < 0) { dir->errcode = ZZIP_DIR_SEEK; return -1; } else { dir->currentfp = fp; } } /* seek to beginning of this file */ if (fp->io->fd.seeks(dir->fd, fp->dataoffset, SEEK_SET) < 0) return -1; /* reset the inflate init stuff */ fp->restlen = fp->usize; fp->offset = fp->dataoffset; if (fp->method) { /* method == 8, deflate */ err = inflateReset(&fp->d_stream); if (err != Z_OK) { goto error; } /* start over at next inflate with a fresh read() */ fp->d_stream.avail_in = 0; fp->crestlen = fp->csize; } return 0; error: if (fp) zzip_file_close(fp); return err; } /** * This function will perform a => lseek(2) operation on a real/zipped file * * It will try to seek to the offset specified by offset, relative to whence, * which is one of SEEK_SET, SEEK_CUR or SEEK_END. * * If the file-handle is wrapping a stat'able file then it will actually just * perform a normal => lseek(2)-call. Otherwise the relative offset * is calculated, negative offsets are transformed into positive ones * by rewinding the file, and then data is read until the offset is * reached. This can make the function terribly slow, but this is * how gzio implements it, so I'm not sure there is a better way * without using the internals of the algorithm. */ zzip_off_t zzip_seek(ZZIP_FILE * fp, zzip_off_t offset, int whence) { zzip_off_t cur_pos, rel_ofs, read_size, ofs; ZZIP_DIR *dir; if (! fp) return -1; if (! fp->dir) { /* stat fd */ return fp->io->fd.seeks(fp->fd, offset, whence); } cur_pos = zzip_tell(fp); /* calculate relative offset */ switch (whence) { case SEEK_SET: /* from beginning */ rel_ofs = offset - cur_pos; break; case SEEK_CUR: /* from current */ rel_ofs = offset; break; case SEEK_END: /* from end */ rel_ofs = fp->usize + offset - cur_pos; break; default: /* something wrong */ return -1; } if (rel_ofs == 0) return cur_pos; /* don't have to move */ if (rel_ofs < 0) { /* convert backward into forward */ if (zzip_rewind(fp) == -1) return -1; read_size = cur_pos + rel_ofs; cur_pos = 0; }else { /* amount to read is positive relative offset */ read_size = rel_ofs; } if (read_size < 0) /* bad offset, before beginning of file */ return -1; if (read_size + cur_pos > (zzip_off_t)fp->usize) /* bad offset, past EOF */ return -1; if (read_size == 0) /* nothing to read */ return cur_pos; dir = fp->dir; /* * If this is other handle than previous, save current seek pointer * and read the file position of `this' handle. */ if (dir->currentfp != fp) { if (zzip_file_saveoffset(dir->currentfp) < 0 || dir->currentfp->io->fd.seeks(dir->fd, fp->offset, SEEK_SET) < 0) { dir->errcode = ZZIP_DIR_SEEK; return -1; } else { dir->currentfp = fp; } } if (fp->method == 0) { /* unstore, just lseek relatively */ ofs = fp->io->fd.tells(dir->fd); ofs = fp->io->fd.seeks(dir->fd,read_size,SEEK_CUR); if (ofs > 0) { /* readjust from beginning of file */ ofs -= fp->dataoffset; fp->restlen = fp->usize - ofs; } return ofs; }else { /* method == 8, inflate */ char *buf; /*FIXME: use a static buffer! */ buf = (char *)malloc(ZZIP_32K); if (! buf) return -1; while (read_size > 0) { zzip_off_t size = ZZIP_32K; if (read_size < size/*32K*/) size = read_size; size = zzip_file_read(fp, buf, (zzip_size_t)size); if (size <= 0) { free(buf); return -1; } read_size -= size; } free (buf); } return zzip_tell(fp); } /** * This function will => tell(2) the current position in a real/zipped file * * It will return the current offset within the real/zipped file, * measured in uncompressed bytes for the zipped-file case. * * If the file-handle is wrapping a stat'able file then it will actually just * perform a normal => tell(2)-call, otherwise the offset is * calculated from the amount of data left and the total uncompressed * size; */ zzip_off_t zzip_tell(ZZIP_FILE * fp) { if (! fp) return -1; if (! fp->dir) /* stat fd */ return fp->io->fd.tells(fp->fd); /* current uncompressed offset is uncompressed size - data left */ return (fp->usize - fp->restlen); } /* * Local variables: * c-file-style: "stroustrup" * End: */ milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_fetch.h0000644000175000017500000004402010737746457025214 0ustar admin2admin2#ifndef _ZZIP_FORMATS_H #define _ZZIP_FORMATS_H #include #include #include /* linux knows "byteswap.h" giving us an optimized variant */ #ifdef ZZIP_HAVE_BYTESWAP_H #include #endif /* get 16/32 bits from little-endian zip-file to host byteorder */ extern uint32_t __zzip_get32(zzip_byte_t * s) __zzip_attribute__((const)); extern uint16_t __zzip_get16(zzip_byte_t * s) __zzip_attribute__((const)); extern void __zzip_set32(zzip_byte_t * s, uint32_t v); extern void __zzip_set16(zzip_byte_t * s, uint16_t v); extern uint64_t __zzip_get64(zzip_byte_t * s) __zzip_attribute__((const)); extern void __zzip_set64(zzip_byte_t * s, uint64_t v); # define ZZIP_GET64(__p) (__zzip_get64((__p))) # define ZZIP_GET32(__p) (__zzip_get32((__p))) # define ZZIP_GET16(__p) (__zzip_get16((__p))) # define ZZIP_SET64(__p,__x) (__zzip_set64((__p),(__x))) # define ZZIP_SET32(__p,__x) (__zzip_set32((__p),(__x))) # define ZZIP_SET16(__p,__x) (__zzip_set16((__p),(__x))) /* ..................... bitcorrect physical access .................... */ /* zzip_file_header - the local file header */ #define zzip_file_header_get_magic(__p) ZZIP_GET32((__p)->z_magic) #define zzip_file_header_set_magic(__p,__x) ZZIP_SET32((__p)->z_magic,(__x)) #define zzip_file_header_get_flags(__p) ZZIP_GET16((__p)->z_flags) #define zzip_file_header_set_flags(__p,__x) ZZIP_SET16((__p)->z_flags,(__x)) #define zzip_file_header_get_compr(__p) ZZIP_GET16((__p)->z_compr) #define zzip_file_header_set_compr(__p,__x) ZZIP_SET16((__p)->z_compr,(__x)) #define zzip_file_header_get_crc32(__p) ZZIP_GET32((__p)->z_crc32) #define zzip_file_header_set_crc32(__p,__x) ZZIP_SET32((__p)->z_crc32,(__x)) #define zzip_file_header_get_csize(__p) ZZIP_GET32((__p)->z_csize) #define zzip_file_header_set_csize(__p,__x) ZZIP_SET32((__p)->z_csize,(__x)) #define zzip_file_header_get_usize(__p) ZZIP_GET32((__p)->z_usize) #define zzip_file_header_set_usize(__p,__x) ZZIP_SET32((__p)->z_usize,(__x)) #define zzip_file_header_get_namlen(__p) ZZIP_GET16((__p)->z_namlen) #define zzip_file_header_set_namlen(__p,__x) ZZIP_SET16((__p)->z_namlen,(__x)) #define zzip_file_header_get_extras(__p) ZZIP_GET16((__p)->z_extras) #define zzip_file_header_set_extras(__p,__x) ZZIP_SET16((__p)->z_extras,(__x)) #define zzip_file_header_sizeof_tails(__p) (zzip_file_header_get_namlen(__p)+\ zzip_file_header_get_extras(__p) ) #define zzip_file_header_check_magic(__p) ZZIP_FILE_HEADER_CHECKMAGIC((__p)) /* zzip_file_trailer - data descriptor per file block */ #define zzip_file_trailer_get_magic(__p) ZZIP_GET32((__p)->z_magic) #define zzip_file_trailer_set_magic(__p,__x) ZZIP_SET32((__p)->z_magic,(__x)) #define zzip_file_header_get_crc32(__p) ZZIP_GET32((__p)->z_crc32) #define zzip_file_trailer_set_crc32(__p,__x) ZZIP_SET32((__p)->z_crc32,(__x)) #define zzip_file_trailer_get_csize(__p) ZZIP_GET32((__p)->z_csize) #define zzip_file_trailer_set_csize(__p,__x) ZZIP_SET32((__p)->z_csize,(__x)) #define zzip_file_trailer_get_usize(__p) ZZIP_GET32((__p)->z_usize) #define zzip_file_trailer_set_usize(__p,__x) ZZIP_SET32((__p)->z_usize,(__x)) #define zzip_file_trailer_sizeof_tails(__p) 0 #define zzip_file_trailer_check_magic(__p) ZZIP_FILE_TRAILER_CHECKMAGIC((__p)) /* zzip_disk_entry (currently named zzip_root_dirent) */ #define zzip_disk_entry_get_magic(__p) ZZIP_GET32((__p)->z_magic) #define zzip_disk_entry_set_magic(__p,__x) ZZIP_SET32((__p)->z_magic,(__x)) #define zzip_disk_entry_get_flags(__p) ZZIP_GET16((__p)->z_flags) #define zzip_disk_entry_set_flags(__p,__x) ZZIP_SET16((__p)->z_flags,(__x)) #define zzip_disk_entry_get_compr(__p) ZZIP_GET16((__p)->z_compr) #define zzip_disk_entry_set_compr(__p,__x) ZZIP_SET16((__p)->z_compr,(__x)) #define zzip_disk_entry_get_crc32(__p) ZZIP_GET32((__p)->z_crc32) #define zzip_disk_entry_set_crc32(__p,__x) ZZIP_SET32((__p)->z_crc32,(__x)) #define zzip_disk_entry_get_csize(__p) ZZIP_GET32((__p)->z_csize) #define zzip_disk_entry_set_csize(__p,__x) ZZIP_SET32((__p)->z_csize,(__x)) #define zzip_disk_entry_get_usize(__p) ZZIP_GET32((__p)->z_usize) #define zzip_disk_entry_set_usize(__p,__x) ZZIP_SET32((__p)->z_usize,(__x)) #define zzip_disk_entry_get_namlen(__p) ZZIP_GET16((__p)->z_namlen) #define zzip_disk_entry_set_namlen(__p,__x) ZZIP_SET16((__p)->z_namlen,(__x)) #define zzip_disk_entry_get_extras(__p) ZZIP_GET16((__p)->z_extras) #define zzip_disk_entry_set_extras(__p,__x) ZZIP_SET16((__p)->z_extras,(__x)) #define zzip_disk_entry_get_comment(__p) ZZIP_GET16((__p)->z_comment) #define zzip_disk_entry_set_comment(__p,__x) ZZIP_SET16((__p)->z_comment,(__x)) #define zzip_disk_entry_get_diskstart(__p) ZZIP_GET16((__p)->z_diskstart) #define zzip_disk_entry_set_diskstart(__p,__x) ZZIP_SET16((__p)->z_diskstart,(__x)) #define zzip_disk_entry_get_filetype(__p) ZZIP_GET16((__p)->z_filetype) #define zzip_disk_entry_set_filetype(__p,__x) ZZIP_SET16((__p)->z_filetype,(__x)) #define zzip_disk_entry_get_filemode(__p) ZZIP_GET32((__p)->z_filemode) #define zzip_disk_entry_set_filemode(__p,__x) ZZIP_SET32((__p)->z_filemode,(__x)) #define zzip_disk_entry_get_offset(__p) ZZIP_GET32((__p)->z_offset) #define zzip_disk_entry_set_offset(__p,__x) ZZIP_SET32((__p)->z_offset,(__x)) #define zzip_disk_entry_sizeof_tails(__p) (zzip_disk_entry_get_namlen(__p) +\ zzip_disk_entry_get_extras(__p) +\ zzip_disk_entry_get_comment(__p) ) #define zzip_disk_entry_check_magic(__p) ZZIP_DISK_ENTRY_CHECKMAGIC((__p)) /* zzip_disk_trailer - the zip archive entry point */ #define zzip_disk_trailer_get_magic(__p) ZZIP_GET32((__p)->z_magic) #define zzip_disk_trailer_set_magic(__p,__x) ZZIP_SET32((__p)->z_magic,(__x)) #define zzip_disk_trailer_get_disk(__p) ZZIP_GET16((__p)->z_disk) #define zzip_disk_trailer_set_disk(__p,__x) ZZIP_SET16((__p)->z_disk,(__x)) #define zzip_disk_trailer_get_finaldisk(__p) ZZIP_GET16((__p)->z_finaldisk) #define zzip_disk_trailer_set_finaldisk(__p,__x) ZZIP_SET16((__p)->z_finaldisk,(__x)) #define zzip_disk_trailer_get_entries(__p) ZZIP_GET16((__p)->z_entries) #define zzip_disk_trailer_set_entries(__p,__x) ZZIP_SET16((__p)->z_entries,(__x)) #define zzip_disk_trailer_get_finalentries(__p) ZZIP_GET16((__p)->z_finalentries) #define zzip_disk_trailer_set_finalentries(__p,__x) ZZIP_SET16((__p)->z_finalentries,(__x)) #define zzip_disk_trailer_get_rootsize(__p) ZZIP_GET32((__p)->z_rootsize) #define zzip_disk_trailer_set_rootsize(__p,__x) ZZIP_SET32((__p)->z_rootsize,(__x)) #define zzip_disk_trailer_get_rootseek(__p) ZZIP_GET32((__p)->z_rootseek) #define zzip_disk_trailer_set_rootseek(__p,__x) ZZIP_SET32((__p)->z_rootseek,(__x)) #define zzip_disk_trailer_get_comment(__p) ZZIP_GET16((__p)->z_comment) #define zzip_disk_trailer_set_comment(__p,__x) ZZIP_SET16((__p)->z_comment,(__x)) #define zzip_disk_trailer_sizeof_tails(__p) ( zzip_disk_entry_get_comment(__p)) #define zzip_disk_trailer_check_magic(__p) ZZIP_DISK_TRAILER_CHECKMAGIC((__p)) /* extra field should be type + size + data + type + size + data ... */ #define zzip_extra_block_get_datatype(__p) ZZIP_GET16((zzip_byte_t*)(__p)) #define zzip_extra_block_set_datatype(__p,__x) ZZIP_SET16((zzip_byte_t*)(__p),__x) #define zzip_extra_block_get_datasize(__p) ZZIP_GET16((zzip_byte_t*)(__p)+2) #define zzip_extra_block_set_datasize(__p,__x) ZZIP_SET16((zzip_byte_t*)(__p)+2,__x) /* zzip64_disk_trailer - the zip64 archive entry point */ #define zzip_disk64_trailer_get_magic(__p) ZZIP_GET32((__p)->z_magic) #define zzip_disk64_trailer_set_magic(__p,__x) ZZIP_SET32((__p)->z_magic,(__x)) #define zzip_disk64_trailer_get_size(__p) ZZIP_GET64((__p)->z_size) #define zzip_disk64_trailer_set_size(__p,__x) ZZIP_SET64((__p)->z_size,(__x)) #define zzip_disk64_trailer_get_disk(__p) ZZIP_GET32((__p)->z_disk) #define zzip_disk64_trailer_set_disk(__p,__x) ZZIP_SET32((__p)->z_disk,(__x)) #define zzip_disk64_trailer_get_finaldisk(__p) ZZIP_GET32((__p)->z_finaldisk) #define zzip_disk64_trailer_set_finaldisk(__p,__x) ZZIP_SET32((__p)->z_finaldisk,(__x)) #define zzip_disk64_trailer_get_entries(__p) ZZIP_GET64((__p)->z_entries) #define zzip_disk64_trailer_set_entries(__p,__x) ZZIP_SET64((__p)->z_entries,(__x)) #define zzip_disk64_trailer_get_finalentries(__p) ZZIP_GET64((__p)->z_finalentries) #define zzip_disk64_trailer_set_finalentries(__p,__x) ZZIP_SET64((__p)->z_finalentries,(__x)) #define zzip_disk64_trailer_get_rootsize(__p) ZZIP_GET64((__p)->z_rootsize) #define zzip_disk64_trailer_set_rootsize(__p,__x) ZZIP_SET64((__p)->z_rootsize,(__x)) #define zzip_disk64_trailer_get_rootseek(__p) ZZIP_GET64((__p)->z_rootseek) #define zzip_disk64_trailer_set_rootseek(__p,__x) ZZIP_SET64((__p)->z_rootseek,(__x)) #define zzip_disk64_trailer_check_magic(__p) ZZIP_DISK64_TRAILER_CHECKMAGIC((__p)) /* .............. some logical typed access wrappers ....................... */ /* zzip_file_header - the local file header */ #define zzip_file_header_csize(__p) ((zzip_size_t) \ zzip_file_header_get_csize(__p)) #define zzip_file_header_usize(__p) ((zzip_size_t) \ zzip_file_header_get_usize(__p)) #define zzip_file_header_namlen(__p) ((zzip_size_t) \ zzip_file_header_get_namlen(__p)) #define zzip_file_header_extras(__p) ((zzip_size_t) \ zzip_file_header_get_extras(__p)) #define zzip_file_header_sizeof_tail(__p) ((zzip_size_t) \ zzip_file_header_sizeof_tails(__p)) #define zzip_file_header_sizeto_end(__p) ((zzip_size_t) \ (zzip_file_header_sizeof_tail(__p) + zzip_file_header_headerlength)) #define zzip_file_header_skipto_end(__p) ((void*) (__p) + \ (zzip_file_header_sizeof_tail(__p) + zzip_file_header_headerlength)) #define zzip_file_header_to_filename(__p) ((char*) \ ((char*)(__p) + zzip_file_header_headerlength)) #define zzip_file_header_to_extras(__p) ((char*) \ (zzip_file_header_to_filename(__p) + zzip_file_header_namlen(__p))) #define zzip_file_header_to_data(__p) ((zzip_byte_t*) \ (zzip_file_header_to_extras(__p) + zzip_file_header_extras(__p))) #define zzip_file_header_to_trailer(__p) ((struct zzip_file_trailer*) \ (zzip_file_header_to_data(__p) + zzip_file_header_csize(__p))) /* zzip_file_trailer - data descriptor per file block */ #define zzip_file_trailer_csize(__p) ((zzip_size_t) \ zzip_file_trailer_get_csize(__p)) #define zzip_file_trailer_usize(__p) ((zzip_size_t) \ zzip_file_trailer_get_usize(__p)) #define zzip_file_trailer_sizeof_tail(__p) ((zzip_size_t) \ zzip_file_trailer_sizeof_tails(__p)) #define zzip_file_trailer_sizeto_end(__p) ((zzip_size_t) \ (zzip_file_trailer_sizeof_tail(__p) + zzip_file_trailer_headerlength)) #define zzip_file_trailer_skipto_end(__p) ((void*) (__p) + \ (zzip_file_trailer_sizeof_tail(__p) + zzip_file_trailer_headerlength)) /* zzip_disk_entry (currently named zzip_root_dirent) */ #define zzip_disk_entry_csize(__p) ((zzip_size_t) \ zzip_disk_entry_get_csize(__p)) #define zzip_disk_entry_usize(__p) ((zzip_size_t) \ zzip_disk_entry_get_usize(__p)) #define zzip_disk_entry_namlen(__p) ((zzip_size_t) \ zzip_disk_entry_get_namlen(__p)) #define zzip_disk_entry_extras(__p) ((zzip_size_t) \ zzip_disk_entry_get_extras(__p)) #define zzip_disk_entry_comment(__p) ((zzip_size_t) \ zzip_disk_entry_get_comment(__p)) #define zzip_disk_entry_diskstart(__p) ((int) \ zzip_disk_entry_get_diskstart(__p)) #define zzip_disk_entry_filetype(__p) ((int) \ zzip_disk_entry_get_filetype(__p)) #define zzip_disk_entry_filemode(__p) ((int) \ zzip_disk_entry_get_filemode(__p)) #define zzip_disk_entry_fileoffset(__p) ((zzip_off_t) \ zzip_disk_entry_get_offset(__p)) #define zzip_disk_entry_sizeof_tail(__p) ((zzip_size_t) \ zzip_disk_entry_sizeof_tails(__p)) #define zzip_disk_entry_sizeto_end(__p) ((zzip_size_t) \ (zzip_disk_entry_sizeof_tail(__p) + zzip_disk_entry_headerlength)) #define zzip_disk_entry_skipto_end(__p) ((zzip_byte_t*) (__p) + \ (zzip_disk_entry_sizeof_tail(__p) + zzip_disk_entry_headerlength)) #define zzip_disk_entry_to_filename(__p) ((char*) \ ((char*)(__p) + zzip_disk_entry_headerlength)) #define zzip_disk_entry_to_extras(__p) ((char*) \ (zzip_disk_entry_to_filename(__p) + zzip_disk_entry_namlen(__p))) #define zzip_disk_entry_to_comment(__p) ((char*) \ (zzip_disk_entry_to_extras(__p) + zzip_disk_entry_extras(__p))) #define zzip_disk_entry_to_next_entry(__p) ((struct zzip_disk_entry*) \ (zzip_disk_entry_to_comment(__p) + zzip_disk_entry_comment(__p))) /* zzip_disk_trailer - the zip archive entry point */ #define zzip_disk_trailer_localdisk(__p) ((int) \ zzip_disk_trailer_get_disk(__p)) #define zzip_disk_trailer_finaldisk(__p) ((int) \ zzip_disk_trailer_get_finaldisk(__p)) #define zzip_disk_trailer_localentries(__p) ((int) \ zzip_disk_trailer_get_entries(__p)) #define zzip_disk_trailer_finalentries(__p) ((int) \ zzip_disk_trailer_get_finalentries(__p)) #define zzip_disk_trailer_rootsize(__p) ((zzip_off_t) \ zzip_disk_trailer_get_rootsize(__p)) #define zzip_disk_trailer_rootseek(__p) ((zzip_off_t) \ zzip_disk_trailer_get_rootseek(__p)) #define zzip_disk_trailer_comment(__p) ((zzip_size_t) \ zzip_disk_trailer_get_comment(__p)) #define zzip_disk_trailer_sizeof_tail(__p) ((zzip_size_t) \ zzip_disk_trailer_sizeof_tails(__p)) #define zzip_disk_trailer_sizeto_end(__p) ((zzip_size_t) \ (zzip_disk_trailer_sizeof_tail(__p) + zzip_disk_trailer_headerlength)) #define zzip_disk_trailer_skipto_end(__p) ((void*) (__p) \ (zzip_disk_trailer_sizeof_tail(__p) + zzip_disk_trailer_headerlength)) #define zzip_disk_trailer_to_comment(__p) ((char*) \ ((char*)(__p) + zzip_disk_trailer_headerlength)) #define zzip_disk_trailer_to_endoffile(__p) ((void*) \ (zzip_disk_trailer_to_comment(__p) + zzip_disk_trailer_comment(__p))) /* zzip_disk64_trailer - the zip archive entry point */ #define zzip_disk64_trailer_localdisk(__p) ((int) \ zzip_disk64_trailer_get_disk(__p)) #define zzip_disk64_trailer_finaldisk(__p) ((int) \ zzip_disk64_trailer_get_finaldisk(__p)) #define zzip_disk64_trailer_localentries(__p) ((int) \ zzip_disk64_trailer_get_entries(__p)) #define zzip_disk64_trailer_finalentries(__p) ((int) \ zzip_disk64_trailer_get_finalentries(__p)) #define zzip_disk64_trailer_rootsize(__p) ((zzip_off64_t) \ zzip_disk64_trailer_get_rootsize(__p)) #define zzip_disk64_trailer_rootseek(__p) ((zzip_off64_t) \ zzip_disk64_trailer_get_rootseek(__p)) #define zzip_disk64_trailer_sizeof_tail(__p) ((zzip_size_t) \ zzip_disk64_trailer_get_size(__p) - zzip_disk64_trailer_headerlength) #define zzip_disk64_trailer_sizeto_end(__p) ((zzip_size_t) \ zzip_disk64_trailer_get_size(__p)) #define zzip_disk64_trailer_skipto_end(__p) ((void*) \ ((char*)(__p) + zzip_disk64_sizeto_end(__p))) /* extra field should be type + size + data + type + size + data ... */ #define zzip_extra_block_sizeof_tail(__p) ((zzip_size_t) \ (zzip_extra_block_get_datasize(__p))) #define zzip_extra_block_sizeto_end(__p) ((zzip_size_t) \ (zzip_extra_block_sizeof_tail(__p) + zzip_extra_block_headerlength)) #define zzip_extra_block_skipto_end(__p) ((void*) (__p) \ (zzip_extra_block_sizeof_tail(__p) + zzip_extra_block_headerlength)) /* ................... and put these to the next level ................ */ #define zzip_file_header_data_encrypted(__p) \ ZZIP_IS_ENCRYPTED( zzip_file_header_get_flags(__p) ) #define zzip_file_header_data_comprlevel(__p) \ ZZIP_IS_COMPRLEVEL( zzip_file_header_get_flags(__p) ) #define zzip_file_header_data_streamed(__p) \ ZZIP_IS_STREAMED( zzip_file_header_get_flags(__p) ) #define zzip_file_header_data_stored(__p) \ ( ZZIP_IS_STORED == zzip_file_header_get_compr(__p) ) #define zzip_file_header_data_deflated(__p) \ ( ZZIP_IS_DEFLATED == zzip_file_header_get_compr(__p) ) #define zzip_disk_entry_data_encrypted(__p) \ ZZIP_IS_ENCRYPTED( zzip_disk_entry_get_flags(__p) ) #define zzip_disk_entry_data_comprlevel(__p) \ ZZIP_IS_COMPRLEVEL( zzip_disk_entry_get_flags(__p) ) #define zzip_disk_entry_data_streamed(__p) \ ZZIP_IS_STREAMED( zzip_disk_entry_get_flags(__p) ) #define zzip_disk_entry_data_stored(__p) \ ( ZZIP_IS_STORED == zzip_disk_entry_get_compr(__p) ) #define zzip_disk_entry_data_deflated(__p) \ ( ZZIP_IS_DEFLATED == zzip_disk_entry_get_compr(__p) ) #define zzip_disk_entry_data_ascii(__p) \ ( zzip_disk_entry_get_filetype(__p) & 1) #define zzip_file_header_data_not_deflated(__p) \ (zzip_file_header_data_stored(__p)) #define zzip_file_header_data_std_deflated(__p) \ (zzip_file_header_data_deflated(__p) && \ zzip_file_header_data_comprlevel(__p) == ZZIP_DEFLATED_STD_COMPR) #define zzip_file_header_data_max_deflated(__p) \ (zzip_file_header_data_deflated(__p) && \ zzip_file_header_data_comprlevel(__p) == ZZIP_DEFLATED_MAX_COMPR) #define zzip_file_header_data_low_deflated(__p) \ (zzip_file_header_data_deflated(__p) && \ zzip_file_header_data_comprlevel(__p) == ZZIP_DEFLATED_LOW_COMPR) #define zzip_file_header_data_min_deflated(__p) \ (zzip_file_header_data_deflated(__p) && \ zzip_file_header_data_comprlevel(__p) == ZZIP_DEFLATED_MIN_COMPR) #define zzip_disk_entry_data_not_deflated(__p) \ (zzip_disk_entry_data_stored(__p)) #define zzip_disk_entry_data_std_deflated(__p) \ (zzip_disk_entry_data_deflated(__p) && \ zzip_disk_entry_data_comprlevel(__p) == ZZIP_DEFLATED_STD_COMPR) #define zzip_disk_entry_data_max_deflated(__p) \ (zzip_disk_entry_data_deflated(__p) && \ zzip_disk_entry_data_comprlevel(__p) == ZZIP_DEFLATED_MAX_COMPR) #define zzip_disk_entry_data_low_deflated(__p) \ (zzip_disk_entry_data_deflated(__p) && \ zzip_disk_entry_data_comprlevel(__p) == ZZIP_DEFLATED_LOW_COMPR) #define zzip_disk_entry_data_min_deflated(__p) \ (zzip_disk_entry_data_deflated(__p) && \ zzip_disk_entry_data_comprlevel(__p) == ZZIP_DEFLATED_MIN_COMPR) #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_conf.h0000644000175000017500000001447410776616763025061 0ustar admin2admin2/* * Here we postprocess autoconf generated prefix-config.h entries. * This is generally for things like "off_t" which is left undefined * in plain config.h if the host system does already have it but we do * need the prefix variant - so we add here a #define _zzip_off_t off_t * * This file is supposed to only carry '#define's. * See for definitions that might be seen by the compiler. * * Author: * Guido Draheim * * Copyright (c) 2001,2002,2003,2004 Guido Draheim * All rights reserved, * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 */ #ifndef _ZZIP_CONF_H #define _ZZIP_CONF_H 1 #define __zzipfd size_t #if !defined ZZIP_OMIT_CONFIG_H # if defined _MSC_VER || defined __BORLANDC__ || defined __WATCOMC__ # include # elif defined ZZIP_1_H # include "zzip-1.h" # elif defined ZZIP_2_H # include "zzip-2.h" # elif defined ZZIP_3_H # include "zzip-3.h" # elif defined ZZIP_4_H # include "zzip-4.h" # elif defined ZZIP_5_H # include "zzip-5.h" # else /* autoconf generated */ # include # endif #endif /* especially win32 platforms do not declare off_t so far - see zzip-msvc.h */ #ifndef _zzip_off_t #ifdef ZZIP_off_t #define _zzip_off_t ZZIP_off_t #else #define _zzip_off_t off_t #endif #endif #ifndef _zzip_off64_t #ifdef ZZIP_off64_t #define _zzip_off64_t ZZIP_off64_t #else #define _zzip_off64_t off64_t #endif #endif /* currently unused, all current zziplib-users do have ansi-C94 compilers. */ #ifndef _zzip_const #ifdef ZZIP_const #define _zzip_const ZZIP_const #else #define _zzip_const const #endif #endif #ifndef _zzip_inline #ifdef ZZIP_inline #define _zzip_inline ZZIP_inline #else #define _zzip_inline inline #endif #endif #ifndef _zzip_restrict #ifdef ZZIP_restrict #define _zzip_restrict ZZIP_restrict #else #define _zzip_restrict restrict #endif #endif #if defined __linux__ && __GNUC__+0 >= 4 #define zzip__new__ __attribute__((malloc)) #elif defined __linux__ && __GNUC__+0 >= 3 && __GNUC_MINOR_+0 >= 3 #define zzip__new__ __attribute__((malloc)) #else #define zzip__new__ #endif #ifndef _zzip_size_t #ifdef ZZIP_size_t #define _zzip_size_t ZZIP_size_t #else #define _zzip_size_t size_t #endif #endif #ifndef _zzip_ssize_t #ifdef ZZIP_ssize_t #define _zzip_ssize_t ZZIP_ssize_t #else #define _zzip_ssize_t ssize_t #endif #endif #ifndef _zzip___int64 #ifdef ZZIP___int64 #define _zzip___int64 ZZIP___int64 #else #ifdef _MSC_VER #define _zzip___int64 __int64 #else #define _zzip___int64 long long #endif #endif #endif /* whether this library shall use a 64bit off_t largefile variant in 64on32: */ /* (some exported names must be renamed to avoid bad calls after linking) */ #if defined ZZIP_LARGEFILE_SENSITIVE # if _FILE_OFFSET_BITS+0 == 64 # define ZZIP_LARGEFILE_RENAME # elif defined _LARGE_FILES /* used on older AIX to get at 64bit off_t */ # define ZZIP_LARGEFILE_RENAME # elif defined _ZZIP_LARGEFILE /* or simply use this one for zzip64 runs */ # define ZZIP_LARGEFILE_RENAME # endif #endif /* if the environment did not setup these for 64bit off_t largefile... */ #ifdef ZZIP_LARGEFILE_RENAME # ifndef _FILE_OFFSET_BITS # ifdef ZZIP__FILE_OFFSET_BITS /* == 64 */ # define _FILE_OFFSET_BITS ZZIP__FILE_OFFSET_BITS # endif # endif # ifndef _LARGE_FILES # ifdef ZZIP__LARGE_FILES /* == 1 */ # define _LARGE_FILES ZZIP__LARGE_FILES # endif # endif # ifndef _LARGEFILE_SOURCE # ifdef ZZIP__LARGEFILE_SOURCE /* == 1 */ # define _LARGEFILE_SOURCE ZZIP__LARGEFILE_SOURCE # endif # endif #endif #include /* mingw32msvc errno : would be in winsock.h */ #ifndef EREMOTE #define EREMOTE ESPIPE #endif #ifndef ELOOP #if defined EILSEQ #define ELOOP EILSEQ #else #define ELOOP ENOEXEC #endif #endif #if defined __WATCOMC__ #undef _zzip_inline #define _zzip_inline static #endif #if defined _MSC_VER || defined __WATCOMC__ #include #endif #ifdef _MSC_VER # if !__STDC__ # ifndef _zzip_lseek # define _zzip_lseek _lseek # endif # ifndef _zzip_read # define _zzip_read _read # endif # ifndef _zzip_write # define _zzip_write _write # endif # if 0 # ifndef _zzip_stat # define _zzip_stat _stat # endif # endif # endif /* !__STDC__ */ #endif /*MSVC*/ #if defined _MSC_VER || defined __WATCOMC__ # ifndef strcasecmp # define strcasecmp _stricmp # endif #endif # ifndef _zzip_lseek # define _zzip_lseek lseek # endif # ifndef _zzip_read # define _zzip_read read # endif # ifndef _zzip_write # define _zzip_write write # endif # if 0 # ifndef _zzip_stat # define _zzip_stat stat # endif # endif #if defined __GNUC__ || defined __attribute__ #define __zzip_attribute__(X) __attribute__(X) #else #define __zzip_attribute__(X) #endif #if defined ZZIP_EXPORTS || defined ZZIPLIB_EXPORTS # undef ZZIP_DLL #define ZZIP_DLL 1 #endif /* based on zconf.h : */ /* compile with -DZZIP_DLL for Windows DLL support */ #if defined ZZIP_DLL # if defined _WINDOWS || defined WINDOWS || defined _WIN32 /*# include */ # endif # if !defined _zzip_export && defined _MSC_VER && (defined WIN32 || defined _WIN32) # define _zzip_export __declspec(dllexport) /*WINAPI*/ # endif # if !defined _zzip_export && defined __BORLANDC__ # if __BORLANDC__ >= 0x0500 && defined WIN32 # include # define _zzip_export __declspec(dllexport) /*WINAPI*/ # else # if defined _Windows && defined __DLL__ # define _zzip_export _export # endif # endif # endif # if !defined _zzip_export && defined __GNUC__ # if defined __declspec # define _zzip_export extern __declspec(dllexport) # else # define _zzip_export extern # endif # endif # if !defined _zzip_export && defined __BEOS__ # define _zzip_export extern __declspec(export) # endif # if !defined _zzip_export && defined __WATCOMC__ # define _zzip_export extern __declspec(dllexport) # define ZEXPORT __syscall # define ZEXTERN extern # endif #endif #if !defined _zzip_export # if defined __GNUC__ /* || !defined HAVE_LIBZZIP */ # define _zzip_export extern # elif defined __declspec || (defined _MSC_VER && defined ZZIP_DLL) # define _zzip_export extern __declspec(dllimport) # else # define _zzip_export extern # endif #endif #endif milkytracker-0.90.85+dfsg/src/compression/zziplib/generic/zzip_lib.h0000644000175000017500000000543110737746457024674 0ustar admin2admin2/* * Author: * Guido Draheim * Tomi Ollila * * Copyright (c) 1999,2000,2001,2002,2003 Guido Draheim * All rights reserved * use under the restrictions of the * Lesser GNU General Public License * or alternatively the restrictions * of the Mozilla Public License 1.1 * * This is the private header containing definitions that are not * use by a libzzip user application. Writing an extension lib that * uses libzzip will still want to include this. The extension * write should make way to have the ISO C9X integer types defined. */ #ifndef _ZZIP_LIB_H /* zzip.h */ #define _ZZIP_LIB_H #include #include #include /* * this structure cannot be wildly enlarged... (see zzip-zip.c) */ struct zzip_dir_hdr { uint32_t d_usize; /* uncompressed size */ uint32_t d_csize; /* compressed size */ uint32_t d_crc32; /* the adler32-checksum */ uint32_t d_off; /* offset of file in zipfile */ uint16_t d_reclen; /* next dir_hdr structure offset */ uint16_t d_namlen; /* explicit namelen of d_name */ uint8_t d_compr; /* the compression type, 0 = store, 8 = inflate */ char d_name[1]; /* the actual name of the entry, may contain DIRSEPs */ }; #define _ZZIP_DIRENT_HAVE_D_NAMLEN #define _ZZIP_DIRENT_HAVE_D_OFF #define _ZZIP_DIRENT_HAVE_D_RECLEN /* * you shall not use this struct anywhere else than in zziplib sources. */ struct zzip_dir { __zzipfd fd; int errcode; /* zzip_error_t */ long refcount; struct { /* reduce a lot of alloc/deallocations by caching these: */ int * volatile locked; struct zzip_file * volatile fp; char * volatile buf32k; } cache; struct zzip_dir_hdr * hdr0; /* zfi; */ struct zzip_dir_hdr * hdr; /* zdp; directory pointer, for dirent stuff */ struct zzip_file * currentfp; /* last fp used... */ struct zzip_dirent dirent; void* realdir; /* e.g. DIR* from posix dirent.h */ char* realname; zzip_strings_t* fileext; /* list of fileext to test for */ zzip_plugin_io_t io; /* vtable for io routines */ }; #define ZZIP_32K 32768 /* try to open a zip-basename with default_fileext */ int __zzip_try_open (zzip_char_t* filename, int filemode, zzip_strings_t* ext, zzip_plugin_io_t io); ZZIP_DIR * zzip_dir_fdopen(__zzipfd fd, zzip_error_t * errcode_p); ZZIP_DIR* zzip_dir_fdopen_ext_io(__zzipfd fd, zzip_error_t * errorcode_p, zzip_strings_t* ext, const zzip_plugin_io_t io); ZZIP_DIR* /*depracated*/ zzip_dir_alloc_ext_io (zzip_strings_t* ext, const zzip_plugin_io_t io); #endif /* _ZZIP_H */ milkytracker-0.90.85+dfsg/src/compression/DecompressorGZIP.h0000755000175000017500000000312311172163710023064 0ustar admin2admin2/* * compression/DecompressorGZIP.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorGZIP.h * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #ifndef __DECOMPRESSOR_GZIP_H__ #define __DECOMPRESSOR_GZIP_H__ #include "Decompressor.h" /***************************************************************************** * gzip decompression *****************************************************************************/ class DecompressorGZIP : public DecompressorBase { public: DecompressorGZIP(const PPSystemString& fileName); virtual bool identify(XMFile& f); // this type of archive can contain any file type virtual bool doesServeHint(Hints hint) { return true; } virtual const PPSimpleVector& getDescriptors(Hints hint) const; virtual bool decompress(const PPSystemString& outFileName, Hints hint); virtual DecompressorBase* clone(); }; #endif milkytracker-0.90.85+dfsg/src/compression/AIFFWriter.m0000755000175000017500000006100611027457602021645 0ustar admin2admin2/* File: AIFFWriter.m Author: QuickTime DTS Change History (most recent first): <2> 03/24/06 must pass NSError objects to exportCompleted <1> 11/10/05 initial release © Copyright 2005-2006 Apple Computer, Inc. All rights reserved. IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple's copyrights in this original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* AIFFWriter is a simple class encapsulating the functionality of two sets of APIs; QuickTime's Audio Extraction API's and Core Audio's Audio File APIs. It let's clients of this class perform audio extraction from a QTKit QTMovie object to AIFF files using a single method call. Note that this class uses the default extraction channel layout which is the aggregate channel layout of the movie (for example, all Rights mixed together, all Left Surrounds mixed together, etc). Because we're writing a file the stream description for the output is modified from the default (32-bit float, de-interleaved) to 16-bit, interleaved big endian. The sample rate will be set to the highest sample rate found in the movie. For more information regarding newer audio capabilities of QuickTime, please see the QuickTime 7 Update Guide: http://developer.apple.com/documentation/QuickTime/Conceptual/QT7UpdateGuide/Chapter02/chapter_2_section_6.html */ #import "AIFFWriter.h" #pragma mark ---- AIFFWriterProgressInfo ---- // AIFFWriterProgressInfo is the object passed back to the progress callback // if implemented by the client. It contains information regarding the current // state of the export session which can be used to drive a UI. @interface AIFFWriterProgressInfo (Private) - (void)setPhase:(AIFFWriterExportOperationPhase)value; - (void)setProgressValue:(NSNumber *)value; - (void)setExportStatus:(NSError *)status; @end @implementation AIFFWriterProgressInfo - (AIFFWriterExportOperationPhase)phase { return phase; } - (NSNumber *)progressValue { return [[progressValue retain] autorelease]; } - (void)setPhase:(AIFFWriterExportOperationPhase)value { phase = value; } - (void)setProgressValue:(NSNumber *)value { if (progressValue != value) { [progressValue release]; progressValue = [value copy]; } } - (NSError *)exportStatus { return [[exportStatus retain] autorelease]; } - (void)setExportStatus:(NSError *)status { if (exportStatus != status) { [exportStatus release]; exportStatus = [status copy]; } } - (void) dealloc { [progressValue release]; [exportStatus release]; [super dealloc]; } @end #pragma mark ---- AIFFWriter private interface ---- @interface AIFFWriter (Private) - (OSStatus)extractAudioToFile:(SInt64 *)ioNumSamples; - (OSStatus)getDefaultExtractionInfo; - (OSStatus)configureExtractionSessionWithMovie:(Movie)inMovie; - (void)exportOnMainThreadCallBack:(id)inObject; - (void)exportExtractionOnWorkerThread:(id)inObject; - (void)setMovieExtractionDuration; - (void)exportCompletedNotification:(NSError *)inError; @end @implementation AIFFWriter #pragma mark ---- initialization/dealocation ---- - (id)init; { if (self = [super init]) { mLock = [[NSLock alloc] init]; mProgressInfo = [[AIFFWriterProgressInfo alloc] init]; } return self; } - (void)dealloc { if (mFileName) { [mFileName release]; } if (mAudioExtractionSession){ MovieAudioExtractionEnd(mAudioExtractionSession); } if (mQTMovie) { [mQTMovie release]; } if (mExtractionLayoutPtr) { free(mExtractionLayoutPtr); } [mLock release]; [mProgressInfo release]; [super dealloc]; } #pragma mark ---- public ---- // main method call that will produce an AIFF file - it will try to // export the movie on a separate thread but if it can't will schedule // callbacks on the main thread - (OSStatus)exportFromMovie:(QTMovie *)inMovie toFile:(NSString *)inFullPath { BOOL continueExport = YES; Handle cloneHandle = NULL; NSString *directory; OSStatus err = noErr; // sanity if (nil == inMovie || nil == inFullPath) return paramErr; // if we're busy already doing an export return if (![mLock tryLock]) return kObjectInUseErr; mIsExporting = YES; // if the client implemented a progress proc. call it now if (TRUE == mDelegateShouldContinueOp) { [mProgressInfo setPhase:AIFFWriterExportBegin]; [mProgressInfo setProgressValue:nil]; [mProgressInfo setExportStatus:nil]; continueExport = [[self delegate] shouldContinueOperationWithProgressInfo:mProgressInfo]; if (NO == continueExport) goto bail; } directory = [inFullPath stringByDeletingLastPathComponent]; mFileName = [[NSString alloc] initWithString:[inFullPath lastPathComponent]]; // retain the QTMovie object passed in, we need it for the duration of // the export regardless of what the client decides to do with it mQTMovie = [inMovie retain]; // if the file already exists, delete it err = FSPathMakeRef((const UInt8*)[inFullPath fileSystemRepresentation], &mFileRef, false); if (err == noErr) { err = FSDeleteObject(&mFileRef); if (err) goto bail; } err = FSPathMakeRef((const UInt8*)[directory fileSystemRepresentation], &mParentRef, NULL); if (err) goto bail; // set the movies extraction duration in floating-point seconds [self setMovieExtractionDuration]; while (mIsExporting) [self exportOnMainThreadCallBack:nil]; bail: if (cloneHandle) DisposeHandle(cloneHandle); if (err) [self exportCompletedNotification:err]; return err; } - (BOOL) isExporting { return mIsExporting; } #pragma mark ---- private ---- // this callback is scheduled on the main thread - In order to keep from locking up the UI, // it does one slice of export, writes it to file and then reschedule itself -(void)exportOnMainThreadCallBack:(id)inObject { BOOL continueExport = YES; OSStatus err; // prepare for extraction if this is the first entry if (NULL == mAudioExtractionSession) { err = [self configureExtractionSessionWithMovie: [mQTMovie quickTimeMovie]]; if (err) goto bail; } // create the file if (0 == mExportFileID) { err = AudioFileCreate(&mParentRef, (CFStringRef)mFileName, kAudioFileAIFFType, &mOutputASBD, 0, &mFileRef, &mExportFileID); if (err) goto bail; // set the channel labels we grabbed from the source if (NULL != mExtractionLayoutPtr) { err = AudioFileSetProperty(mExportFileID, kAudioFilePropertyChannelLayout, mExtractionLayoutSize, (void *)mExtractionLayoutPtr); if (err) goto bail; } } // on entry if there's no samples left we're done if (mSamplesRemaining == 0) mExtractionComplete = YES; // perform some extraction if (!mExtractionComplete) { // if the client implemented a progress proc. call it now if (TRUE == mDelegateShouldContinueOp) { NSNumber *progressValue = [NSNumber numberWithFloat:(float)((float)mSamplesCompleated / (float)mTotalNumberOfSamples)]; [mProgressInfo setPhase:AIFFWriterExportPercent]; [mProgressInfo setProgressValue:progressValue]; [mProgressInfo setExportStatus:nil]; continueExport = [[self delegate] shouldContinueOperationWithProgressInfo:mProgressInfo]; if (NO == continueExport) { err = userCanceledErr; } } // read numSamplesThisSlice number of samples SInt64 numSamplesThisSlice = mSamplesRemaining; if ((numSamplesThisSlice > kMaxExtractionPacketCount) || (numSamplesThisSlice == -1)) numSamplesThisSlice = kMaxExtractionPacketCount; // extract the audio and write it to the file err = [self extractAudioToFile:&numSamplesThisSlice]; if (err) goto bail; if (mSamplesRemaining != -1) { mSamplesRemaining -= numSamplesThisSlice; mSamplesCompleated += numSamplesThisSlice; if (mSamplesRemaining == 0) mExtractionComplete = YES; } } bail: if (err || mExtractionComplete) { // we're done either way so close the file if (mExportFileID) AudioFileClose(mExportFileID); if (err && mExportFileID) { // if we erred out, delete the file FSDeleteObject(&mFileRef); mExportFileID = 0; } // call the completion routine to clean up [self exportCompletedNotification:[NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil]]; } /* else { // reschedule to perform this routine again on the next run loop cycle [self performSelectorOnMainThread:@selector(exportOnMainThreadCallBack:) withObject:(id)nil waitUntilDone:NO]; }*/ } // this method will be performed on a background thread - (void)exportExtractionOnWorkerThread:(id)inObject { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; BOOL continueExport = YES; OSStatus err; [NSThread setThreadPriority:[NSThread threadPriority]+.1]; // attach the movie to this thread err = EnterMoviesOnThread(0); if (err) goto bail;; err = AttachMovieToCurrentThread(mCloneMovie); if (err) goto bail; // prepare for extraction if (NULL == mAudioExtractionSession) { err = [self configureExtractionSessionWithMovie:mCloneMovie]; if (err) goto done; } // create the file if (0 == mExportFileID) { err = AudioFileCreate(&mParentRef, (CFStringRef)mFileName, kAudioFileAIFFType, &mOutputASBD, 0, &mFileRef, &mExportFileID); if (err) goto done; // set the channel labels we grabbed from the source if (NULL != mExtractionLayoutPtr) { err = AudioFileSetProperty(mExportFileID, kAudioFilePropertyChannelLayout, mExtractionLayoutSize, (void *)mExtractionLayoutPtr); if (err) goto done; } } // loop until stopped from an external event, or finished the entire extraction while (YES == continueExport && NO == mExtractionComplete) { if (mSamplesRemaining == 0) mExtractionComplete = YES; if (!mExtractionComplete) { // if the client implemented a progress proc. call it now we wait for the // progress fuction to return before continuing so we can check the return code if (TRUE == mDelegateShouldContinueOp) { NSNumber *progressValue = [NSNumber numberWithFloat:(float)((float)mSamplesCompleated / (float)mTotalNumberOfSamples)]; [mProgressInfo setPhase:AIFFWriterExportPercent]; [mProgressInfo setProgressValue:progressValue]; [mProgressInfo setExportStatus:nil]; [[self delegate] performSelectorOnMainThread:@selector(shouldContinueOperationWithProgressInfo:) withObject:(id)mProgressInfo waitUntilDone:YES]; continueExport = [[self delegate] shouldContinueOperationWithProgressInfo:mProgressInfo]; if (NO == continueExport) { err = userCanceledErr; break; } } // read numSamplesThisSlice number of samples SInt64 numSamplesThisSlice = mSamplesRemaining; if ((numSamplesThisSlice > kMaxExtractionPacketCount) || (numSamplesThisSlice == -1)) numSamplesThisSlice = kMaxExtractionPacketCount; // extract the audio and write it to the file err = [self extractAudioToFile:&numSamplesThisSlice]; if (err) break; if (mSamplesRemaining != -1) { mSamplesRemaining -= numSamplesThisSlice; mSamplesCompleated += numSamplesThisSlice; } } } done: // detach the exported movie from this thread DetachMovieFromCurrentThread(mCloneMovie); ExitMoviesOnThread(); if (mExportFileID) AudioFileClose(mExportFileID); if (err && mExportFileID) { // if we erred out, delete the file FSDeleteObject(&mFileRef); mExportFileID = 0; } bail: // call the completion routine to clean up on the main thread [self performSelectorOnMainThread:@selector(exportCompletedNotification:) withObject:(id)[NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil] waitUntilDone:NO]; [pool release]; } // extract a slice of PCM audio and write it to an AIFF file - audio extraction proceeds serially // from the last position, 'ploc' specifies the file offset that this buffer should be written to // could be optimized by supplying a buffer, but for now it is simply allocated and released in each call - (OSStatus)extractAudioToFile:(SInt64 *)ioNumSamples { AudioBufferList bufList; UInt32 bufsize; char *buffer = NULL; UInt32 flags; UInt32 numFrames; OSStatus err; numFrames = *ioNumSamples; bufsize = (numFrames * mOutputASBD.mBytesPerFrame); buffer = (char *)malloc(bufsize); if (NULL == buffer) { err = memFullErr; goto bail; } // always extract interleaved data, since that's all we can write to an AIFF file bufList.mNumberBuffers = 1; bufList.mBuffers[0].mNumberChannels = mOutputASBD.mChannelsPerFrame; bufList.mBuffers[0].mDataByteSize = bufsize; bufList.mBuffers[0].mData = buffer; // read the number of requested samples from the movie err = MovieAudioExtractionFillBuffer(mAudioExtractionSession, &numFrames, &bufList, &flags); if (err) goto bail; // write it to the file if (numFrames > 0) { err = AudioFileWritePackets(mExportFileID, false, numFrames * mOutputASBD.mBytesPerPacket, NULL, mLocationInFile, &numFrames, buffer); if (err) goto bail; mLocationInFile += numFrames; } bail: if (NULL != buffer) free(buffer); if (err) numFrames = 0; *ioNumSamples = numFrames; mExtractionComplete = (flags & kQTMovieAudioExtractionComplete); return err; } // get the default extraction layout for this movie, expanded into individual channel descriptions // NOTE: the channel layout returned by this routine must be deallocated by the client // If 'asbd' is non-NULL, fill it with the default extraction asbd, which contains the // highest sample rate among the sound tracks that will be contributing. // 'outLayoutSize' and 'asbd' may be nil. - (OSStatus)getDefaultExtractionInfo { OSStatus err; // get the size of the extraction output layout err = MovieAudioExtractionGetPropertyInfo(mAudioExtractionSession, kQTPropertyClass_MovieAudioExtraction_Audio, kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, NULL, &mExtractionLayoutSize, NULL); if (err) goto bail; // allocate memory for the layout mExtractionLayoutPtr = (AudioChannelLayout *)calloc(1, mExtractionLayoutSize); if (NULL == mExtractionLayoutPtr) { err = memFullErr; goto bail; } // get the layout for the current extraction configuration err = MovieAudioExtractionGetProperty(mAudioExtractionSession, kQTPropertyClass_MovieAudioExtraction_Audio, kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, mExtractionLayoutSize, mExtractionLayoutPtr, NULL); if (err) goto bail; // get the audio stream basic description err = MovieAudioExtractionGetProperty(mAudioExtractionSession, kQTPropertyClass_MovieAudioExtraction_Audio, kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, sizeof(AudioStreamBasicDescription), &mSourceASBD, NULL); bail: return err; } // this method prepare the specified movie for extraction by opening an extraction session, configuring // and setting the output ASBD and the output layout if one exists - it also sets the start time to 0 // and calculates the total number of samples to export - (OSStatus) configureExtractionSessionWithMovie:(Movie)inMovie { OSStatus err; // open a movie audio extraction session err = MovieAudioExtractionBegin(inMovie, 0, &mAudioExtractionSession); if (err) goto bail; err = [self getDefaultExtractionInfo]; if (err) goto bail; // set the output ASBD to 16-bit interleaved PCM big-endian integers // we start with the default ASBD which has set the sample rate to the // highest rate among all audio tracks mOutputASBD = mSourceASBD; mOutputASBD.mFormatID = kAudioFormatLinearPCM; mOutputASBD.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsPacked; mOutputASBD.mFramesPerPacket = 1; mOutputASBD.mBitsPerChannel = 16; mOutputASBD.mBytesPerFrame = 2 * mOutputASBD.mChannelsPerFrame; mOutputASBD.mBytesPerPacket = 2 * mOutputASBD.mChannelsPerFrame; // set the extraction ASBD err = MovieAudioExtractionSetProperty(mAudioExtractionSession, kQTPropertyClass_MovieAudioExtraction_Audio, kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, sizeof(mOutputASBD), &mOutputASBD); if (err) goto bail; // set the output layout if (mExtractionLayoutPtr) { err = MovieAudioExtractionSetProperty(mAudioExtractionSession, kQTPropertyClass_MovieAudioExtraction_Audio, kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, mExtractionLayoutSize, mExtractionLayoutPtr); if (err) goto bail; } // set the extraction start time - we always start at zero, but you don't have to TimeRecord startTime = { 0, 0, GetMovieTimeScale(inMovie), GetMovieTimeBase(inMovie) }; err = MovieAudioExtractionSetProperty(mAudioExtractionSession, kQTPropertyClass_MovieAudioExtraction_Movie, kQTMovieAudioExtractionMoviePropertyID_CurrentTime, sizeof(TimeRecord), &startTime); if (err) goto bail; // set the number of total samples to export mSamplesRemaining = mMovieDuration ? (mMovieDuration * mOutputASBD.mSampleRate) : -1; mTotalNumberOfSamples = mSamplesRemaining; bail: return err; } // calculate the duration of the longest audio track in the movie // if the audio tracks end at time N and the movie is much // longer we don't want to keep extracting - the API will happily // return zeroes until it reaches the movie duration -(void)setMovieExtractionDuration { TimeValue maxDuration = 0; UInt8 i; SInt32 trackCount = GetMovieTrackCount([mQTMovie quickTimeMovie]); if (trackCount) { for (i = 1; i < trackCount + 1; i++) { Track aTrack = GetMovieIndTrackType([mQTMovie quickTimeMovie], i, SoundMediaType, movieTrackMediaType); if (aTrack) { TimeValue aDuration = GetTrackDuration(aTrack); if (aDuration > maxDuration) maxDuration = aDuration; } } mMovieDuration = (Float64)maxDuration / (Float64)GetMovieTimeScale([mQTMovie quickTimeMovie]); } } // this completion method gets called at the end of the extraction session or may be called // earlier if an error has occured - its main purpose is to clean up the world so an AIFFWriter // instance can be used over and over again // // in this particular case if we completed successfully we launch QTPlayer with the .aif file // and if an error occurs we pass it back to the client though the progress info object - (void) exportCompletedNotification:(NSError *)inError { /*if (noErr == [inError code]) { CFURLRef url = CFURLCreateFromFSRef(kCFAllocatorDefault, &mFileRef); NSWorkspace *ws = [NSWorkspace sharedWorkspace]; [ws openFile:[(NSURL *)url path] withApplication:@"QuickTime Player"]; CFRelease(url); }*/ if (mFileName) { [mFileName release]; mFileName = nil; } if (mAudioExtractionSession){ MovieAudioExtractionEnd(mAudioExtractionSession); mAudioExtractionSession = NULL; } if (mQTMovie) { [mQTMovie release]; mQTMovie = nil; } mMovieDuration = 0; if (mCloneMovie) { DisposeMovie(mCloneMovie); mCloneMovie = NULL; } mExtractionComplete = NO; mIsExporting = NO; mLocationInFile = 0; mSamplesRemaining = 0; mSamplesCompleated = 0; mTotalNumberOfSamples = 0; if (mExtractionLayoutPtr) { free(mExtractionLayoutPtr); mExtractionLayoutPtr = NULL; } mExtractionLayoutSize = 0; mExportFileID = 0; [mLock unlock]; // if the client implemented a progress proc. call it now if (TRUE == mDelegateShouldContinueOp) { [mProgressInfo setPhase:AIFFWriterExportEnd]; [mProgressInfo setProgressValue:nil]; [mProgressInfo setExportStatus:([inError code] ? inError : nil)]; [[self delegate] shouldContinueOperationWithProgressInfo:mProgressInfo]; } } #pragma mark ---- delegate ---- // methods to support setting up a delegate of this class - (id)delegate { return mDelegate; } - (void)setDelegate:(id)inDelegate { mDelegate = inDelegate; mDelegateShouldContinueOp = [mDelegate respondsToSelector:@selector(shouldContinueOperationWithProgressInfo:)]; } @end milkytracker-0.90.85+dfsg/src/compression/DecompressorZIP.cpp0000755000175000017500000000426611172163710023321 0ustar admin2admin2/* * compression/DecompressorZIP.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorZIP.cpp * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #include "DecompressorZIP.h" #include "XMFile.h" #include "ZipExtractor.h" // -- ZIP -------------------------------------------------------------------- DecompressorZIP::DecompressorZIP(const PPSystemString& filename) : DecompressorBase(filename) { } bool DecompressorZIP::identify(XMFile& f) { const PPSystemString filename(f.getFileName()); PPSystemString ext = filename.getExtension(); if ((ext.compareToNoCase(".ZIP") != 0) && (ext.compareToNoCase(".MDZ") != 0)) return false; ZipExtractor extractor(filename); pp_int32 error = 0; bool res = extractor.parseZip(error, false, NULL); return (res && error == 0); } const PPSimpleVector& DecompressorZIP::getDescriptors(Hints hint) const { descriptors.clear(); descriptors.add(new Descriptor("zip", "ZIP Archive")); if (hint == HintModules || hint == HintAll) descriptors.add(new Descriptor("mdz", "Zipped Module")); return descriptors; } bool DecompressorZIP::decompress(const PPSystemString& outFilename, Hints hint) { ZipExtractor extractor(fileName); pp_int32 error = 0; bool res = extractor.parseZip(error, true, &outFilename); return (res && error == 0); } DecompressorBase* DecompressorZIP::clone() { return new DecompressorZIP(fileName); } static Decompressor::RegisterDecompressor registerDecompressor; milkytracker-0.90.85+dfsg/src/compression/DecompressorPP20.h0000755000175000017500000000312511172163710022776 0ustar admin2admin2/* * compression/DecompressorPP20.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorPP20.h * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #ifndef __DECOMPRESSOR_PP20_H__ #define __DECOMPRESSOR_PP20_H__ #include "Decompressor.h" /***************************************************************************** * PowerPacker decompressor *****************************************************************************/ class DecompressorPP20 : public DecompressorBase { public: DecompressorPP20(const PPSystemString& fileName); virtual bool identify(XMFile& f); // this type of archive can contain any file type virtual bool doesServeHint(Hints hint) { return true; } virtual const PPSimpleVector& getDescriptors(Hints hint) const; virtual bool decompress(const PPSystemString& outFileName, Hints hint); virtual DecompressorBase* clone(); }; #endif milkytracker-0.90.85+dfsg/src/compression/ZipExtractor.h0000644000175000017500000000222411172163710022361 0ustar admin2admin2/* * compression/ZipExtractor.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ZipExtractor.h * milkytracker_universal * * Created by Peter Barth on 31.01.07. * */ #ifndef __ARCHIVEEXTRACTOR_H__ #define __ARCHIVEEXTRACTOR_H__ #include "BasicTypes.h" class ZipExtractor { private: PPSystemString archivePath; public: ZipExtractor(const PPSystemString& archivePath); bool parseZip(pp_int32& err, bool extract, const PPSystemString* outFile); }; #endif milkytracker-0.90.85+dfsg/src/compression/DecompressorLZX.cpp0000755000175000017500000000437411172163710023334 0ustar admin2admin2/* * compression/DecompressorLZX.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorLZX.cpp * milkytracker_universal * * Created by Peter Barth on 17.04.09. * */ #include "DecompressorLZX.h" #include "XMFile.h" #include "XModule.h" #include "unlzx.h" struct ModuleIdentificator : public Unlzx::FileIdentificator { virtual bool identify(const PPSystemString& filename) const { XMFile file(filename); mp_ubyte buff[XModule::IdentificationBufferSize]; memset(buff, 0, sizeof(buff)); file.read(buff, 1, sizeof(buff)); return XModule::identifyModule(buff) != NULL; } }; DecompressorLZX::DecompressorLZX(const PPSystemString& filename) : DecompressorBase(filename) { } bool DecompressorLZX::identify(XMFile& f) { f.seek(0); char buffer[3]; f.read(buffer, 1, 3); return (buffer[0] == 76) && (buffer[1] == 90) && (buffer[2] == 88); } const PPSimpleVector& DecompressorLZX::getDescriptors(Hints hint) const { descriptors.clear(); descriptors.add(new Descriptor("lzx", "LZX Archive")); return descriptors; } bool DecompressorLZX::decompress(const PPSystemString& outFilename, Hints hint) { // If client requests something else than a module we can't deal we that if (hint != HintAll && hint != HintModules) return false; ModuleIdentificator identificator; Unlzx unlzx(fileName, &identificator); return unlzx.extractFile(true, &outFilename); } DecompressorBase* DecompressorLZX::clone() { return new DecompressorLZX(fileName); } static Decompressor::RegisterDecompressor registerDecompressor; milkytracker-0.90.85+dfsg/src/compression/DecompressorLHA.cpp0000755000175000017500000000655411172163710023265 0ustar admin2admin2/* * compression/DecompressorLHA.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorLHA.cpp * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #include "DecompressorLHA.h" #include "XMFile.h" #include "XModule.h" #include "unlha32.h" // -- LHA -------------------------------------------------------------------- class XMFileStreamer : public CLhaArchive::StreamerBase { private: XMFile& f; pp_uint32 currentPos; protected: virtual pp_uint8 get(pp_uint32 pos) { pp_uint8 result; if (currentPos != pos) { f.seek(pos); result = f.readByte(); currentPos = f.pos(); } else { result = f.readByte(); currentPos = f.pos(); } return result; } public: XMFileStreamer(XMFile& f) : f(f) { currentPos = f.pos(); } virtual void read(void* buffer, pp_uint32 from, pp_uint32 len) { if (currentPos != from) { f.seek(from); f.read(buffer, 1, len); currentPos = f.pos(); } else { f.read(buffer, 1, len); currentPos = f.pos(); } } }; struct ModuleIdentifyNotifier : public CLhaArchive::IDNotifier { virtual bool identify(void* buffer, pp_uint32 len) const { mp_ubyte buff[XModule::IdentificationBufferSize]; memset(buff, 0, sizeof(buff)); memcpy(buff, buffer, len > sizeof(buff) ? sizeof(buff) : len); return XModule::identifyModule(buff) != NULL; } }; DecompressorLHA::DecompressorLHA(const PPSystemString& filename) : DecompressorBase(filename) { } bool DecompressorLHA::identify(XMFile& f) { f.seek(0); XMFileStreamer streamer(f); CLhaArchive archive(streamer, f.size(), NULL); bool res = archive.IsArchive() != 0; return res; } const PPSimpleVector& DecompressorLHA::getDescriptors(Hints hint) const { descriptors.clear(); descriptors.add(new Descriptor("lha", "LHA Archive")); return descriptors; } bool DecompressorLHA::decompress(const PPSystemString& outFilename, Hints hint) { XMFile f(fileName); if (!f.isOpen()) return false; XMFileStreamer streamer(f); ModuleIdentifyNotifier idnotifier; CLhaArchive archive(streamer, f.size(), &idnotifier); if (!archive.IsArchive()) return false; pp_uint32 result = archive.ExtractFile(); if (result && archive.GetOutputFile()) { const char* id = XModule::identifyModule(archive.GetOutputFile()); if (id) { XMFile outFile(outFilename, true); if (!outFile.isOpenForWriting()) return false; outFile.write(archive.GetOutputFile(), 1, archive.GetOutputFileLength()); return true; } } return false; } DecompressorBase* DecompressorLHA::clone() { return new DecompressorLHA(fileName); } static Decompressor::RegisterDecompressor registerDecompressor; milkytracker-0.90.85+dfsg/src/compression/DecompressorUMX.cpp0000755000175000017500000000550711172163710023327 0ustar admin2admin2/* * compression/DecompressorUMX.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorUMX.cpp * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #include "DecompressorUMX.h" #include "XMFile.h" #include "LittleEndian.h" // -- UMX -------------------------------------------------------------------- DecompressorUMX::DecompressorUMX(const PPSystemString& fileName) : DecompressorBase(fileName) { } bool DecompressorUMX::identify(XMFile& f) { f.seek(0); mp_dword id = f.readDword(); // UMX ID return (id == 0x9E2A83C1); } const PPSimpleVector& DecompressorUMX::getDescriptors(Hints hint) const { descriptors.clear(); descriptors.add(new Descriptor("umx", "Unreal Data File")); return descriptors; } #define TEST_SIZE 1500 #define MAGIC4(a,b,c,d) \ (((pp_uint32)(a)<<24)|((pp_uint32)(b)<<16)|((pp_uint32)(c)<<8)|(d)) #define MAGIC_IMPM MAGIC4('I','M','P','M') #define MAGIC_SCRM MAGIC4('S','C','R','M') #define MAGIC_M_K_ MAGIC4('M','.','K','.') bool DecompressorUMX::decompress(const PPSystemString& outFileName, Hints hint) { // If client requests something else than a module we can't deal we that if (hint != HintAll && hint != HintModules) return false; XMFile f(fileName); int i; pp_uint8 *buf, *b; int len, offset = -1; if ((b = buf = new pp_uint8[0x10000]) == NULL) return false; f.read(buf, 1, TEST_SIZE); for (i = 0; i < TEST_SIZE; i++, b++) { pp_uint32 id; id = BigEndian::GET_DWORD(b); if (!memcmp(b, "Extended Module:", 16)) { offset = i; break; } if (id == MAGIC_IMPM) { offset = i; break; } if (i > 44 && id == MAGIC_SCRM) { offset = i - 44; break; } if (i > 1080 && id == MAGIC_M_K_) { offset = i - 1080; break; } } if (offset < 0) { delete[] buf; return false; } f.seek(offset); XMFile fOut(outFileName, true); do { len = f.read(buf, 1, 0x10000); fOut.write(buf, 1, len); } while (len == 0x10000); delete[] buf; return true; } DecompressorBase* DecompressorUMX::clone() { return new DecompressorUMX(fileName); } static Decompressor::RegisterDecompressor registerDecompressor; milkytracker-0.90.85+dfsg/src/compression/DecompressorUMX.h0000755000175000017500000000317411172163710022772 0ustar admin2admin2/* * compression/DecompressorUMX.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorUMX.h * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #ifndef __DECOMPRESSOR_UMX_H__ #define __DECOMPRESSOR_UMX_H__ #include "Decompressor.h" /***************************************************************************** * Unreal Music (UMX) "decompressor" *****************************************************************************/ class DecompressorUMX : public DecompressorBase { public: DecompressorUMX(const PPSystemString& fileName); virtual bool identify(XMFile& f); // this type of archive only contain modules virtual bool doesServeHint(Hints hint) { return (hint == HintAll || hint == HintModules); } virtual const PPSimpleVector& getDescriptors(Hints hint) const; virtual bool decompress(const PPSystemString& outFileName, Hints hint); virtual DecompressorBase* clone(); }; #endif milkytracker-0.90.85+dfsg/src/compression/unlzx.h0000755000175000017500000000674711172163710021124 0ustar admin2admin2/* ** LZX Extract in (supposedly) portable C. ** ** Based on unlzx 1.0 by David Tritscher. ** Rewritten by Oliver Gantert ** ** Compiled with vbcc/Amiga and lcc/Win32 */ #ifndef unlzx_unlzx_h #undef AMIGA #define UNLZX_VERSION "2.16" #define UNLZX_VERDATE "14.11.2000" /* #define UNLZX_DEBUG #define UNLZX_TIME */ #if defined(AMIGA) #include LONG mkdir(STRPTR path, UWORD perm); #endif #include "BasicTypes.h" class XMFile; class Unlzx { public: struct FileIdentificator { virtual bool identify(const PPSystemString& filename) const = 0; }; private: struct filename_node { struct filename_node * next; unsigned long length; unsigned long crc; unsigned char filename[256]; }; struct UnLZX { unsigned char match_pattern[256]; signed long use_outdir; unsigned char output_dir[768]; unsigned char work_buffer[1024]; signed long mode; unsigned char info_header[10]; unsigned char archive_header[32]; unsigned char header_filename[256]; unsigned char header_comment[256]; unsigned long pack_size; unsigned long unpack_size; unsigned long crc; unsigned long year; unsigned long month; unsigned long day; unsigned long hour; unsigned long minute; unsigned long second; unsigned char attributes; unsigned char pack_mode; struct filename_node *filename_list; unsigned char read_buffer[16384]; unsigned char decrunch_buffer[66560]; unsigned char *source; unsigned char *destination; unsigned char *source_end; unsigned char *destination_end; unsigned long decrunch_method; unsigned long decrunch_length; unsigned long last_offset; unsigned long global_control; signed long global_shift; unsigned char offset_len[8]; unsigned short offset_table[128]; unsigned char huffman20_len[20]; unsigned short huffman20_table[96]; unsigned char literal_len[768]; unsigned short literal_table[5120]; unsigned long sum; const PPSystemString* temporaryFile; }; PPSystemString archiveFilename; const FileIdentificator* identificator; UnLZX* unlzx; void mkdir(const char* name, int len); struct UnLZX *unlzx_init(void); void unlzx_free(struct UnLZX *unlzx); int pmatch(const char *mask, const char *name); void just_wait(void); unsigned long argopt(unsigned char * ao_strg, unsigned long ao_argc, unsigned char **ao_argv); void crc_calc(unsigned char *memory, unsigned long length, struct UnLZX *unlzx); signed long make_decode_table(signed long number_symbols, signed long table_size, unsigned char *length, unsigned short *table); signed long read_literal_table(struct UnLZX *unlzx); void decrunch(struct UnLZX *unlzx); XMFile* open_output(const PPSystemString& filename); signed long extract_normal(XMFile* in_file, struct UnLZX *unlzx, bool& found); signed long extract_store(XMFile* in_file, struct UnLZX *unlzx, bool& found); signed long extract_unknown(XMFile* in_file, struct UnLZX *unlzx, bool& found); signed long extract_archive(XMFile* in_file, struct UnLZX *unlzx, bool& found); signed long view_archive(XMFile* in_file, struct UnLZX *unlzx); signed long process_archive(const PPSystemString& filename, struct UnLZX *unlzx, bool& found); public: Unlzx(const PPSystemString& archiveFilename, const FileIdentificator* identificator = NULL); ~Unlzx(); bool extractFile(bool extract, const PPSystemString* outFilename); }; #define PMATCH_MAXSTRLEN 512 /* max string length */ #define make_percent(p,m) ((p*100)/m) #endif /* unlzx_unlzx_h */ milkytracker-0.90.85+dfsg/src/compression/PP20.cpp0000644000175000017500000003407310737746457020773 0ustar admin2admin2/* ppcrack 0.1 - decrypts PowerPacker encrypted data files with brute force * by Stuart Caie , this software is in the Public Domain * * The whole keyspace is scanned, unless you supply the -key argument, where * that key (in hexadecimal) to key FFFFFFFF is scanned. * * Anything which decrypts then decrunches to valid data is saved to disk * as . * * As a bonus, if any file is a PowerPacker data file, but not encrypted, * it will be decrunched anyway, and saved as .decrunched * * - changed to work with UADE (mld) * Thanks to Kyzer for help and support. */ /* Code from Heikki Orsila's amigadepack 0.02 to replace previous * PowerPack depacker with license issues. * * You'll probably want to use ppcrack stand-alone to crack encrypted * powerpack files once instead of using brute force at each replay. * * $Id: ppdepack.c,v 1.2 2007/10/08 16:38:29 cmatsuoka Exp $ * * Modified for xmp by Claudio Matsuoka, 08/2007 * - merged mld's checks from the old depack sources. Original credits: * - corrupt file and data detection * (thanks to Don Adan and Dirk Stoecker for help and infos) * - implemeted "efficiency" checks * - further detection based on code by Georg Hoermann */ /* changed into class to work with milkytracker */ #include "PP20.h" #include "LittleEndian.h" #define val(p) ((p)[0]<<16 | (p)[1] << 8 | (p)[2]) const char* PP20::PP_ID = "PP20"; PP20::PP20() { //statusString = _pp20_txt_uncompressed; } bool PP20::isCompressed(const void* source, const pp_uint32 size) { // Check minimum input size, PP20 ID, and efficiency table. if ( size<8 ) { return false; } // We hope that every file with a valid signature and a valid // efficiency table is PP-compressed actually. const char* idPtr = (const char*)source; if ( strncmp(idPtr,PP_ID,4) != 0 ) { //statusString = _pp20_txt_uncompressed; return false; } return checkEfficiency(idPtr+4); } bool PP20::checkEfficiency(const void* source) { const pp_uint32 PP_BITS_FAST = 0x09090909; const pp_uint32 PP_BITS_MEDIOCRE = 0x090a0a0a; const pp_uint32 PP_BITS_GOOD = 0x090a0b0b; const pp_uint32 PP_BITS_VERYGOOD = 0x090a0c0c; const pp_uint32 PP_BITS_BEST = 0x090a0c0d; // Copy efficiency table. memcpy(efficiency,(const pp_uint8*)source,4); pp_uint32 eff = BigEndian::GET_DWORD(efficiency); if (( eff != PP_BITS_FAST ) && ( eff != PP_BITS_MEDIOCRE ) && ( eff != PP_BITS_GOOD ) && ( eff != PP_BITS_VERYGOOD ) && ( eff != PP_BITS_BEST )) { //statusString = _pp20_txt_unrecognized; return false; } /* // Define string describing compression encoding used. switch ( eff) { case PP_BITS_FAST: statusString = _pp20_txt_fast; break; case PP_BITS_MEDIOCRE: statusString = _pp20_txt_mediocre; break; case PP_BITS_GOOD: statusString = _pp20_txt_good; break; case PP_BITS_VERYGOOD: statusString = _pp20_txt_verygood; break; case PP_BITS_BEST: statusString = _pp20_txt_best; break; } */ return true; } inline void ppDecryptCopy(pp_uint8 *src, pp_uint8 *dest, pp_uint32 len, pp_uint32 key) { pp_uint8 a = (key>>24) & 0xFF; pp_uint8 b = (key>>16) & 0xFF; pp_uint8 c = (key>> 8) & 0xFF; pp_uint8 d = (key ) & 0xFF; len = (len + 3) >> 2; while (len--) { *dest++ = *src++ ^ a; *dest++ = *src++ ^ b; *dest++ = *src++ ^ c; *dest++ = *src++ ^ d; } } #define PP_READ_BITS(nbits, var) do { \ bit_cnt = (nbits); \ while (bits_left < bit_cnt) { \ if (buf_src < src) return 0; /* out of source bits */ \ bit_buffer |= (*--buf_src << bits_left); \ bits_left += 8; \ } \ (var) = 0; \ bits_left -= bit_cnt; \ while (bit_cnt--) { \ (var) = ((var) << 1) | (bit_buffer & 1); \ bit_buffer >>= 1; \ } \ } while(0) #define PP_BYTE_OUT(byte) do { \ if (out <= dest) return 0; /* output overflow */ \ *--out = (byte); \ written++; \ } while (0) pp_int32 PP20::ppDecrunch(pp_uint8 *src, pp_uint8 *dest, pp_uint8 *offset_lens, pp_uint32 src_len, pp_uint32 dest_len, pp_uint8 skip_bits) { pp_uint8 *buf_src, *out, *dest_end, bits_left = 0, bit_cnt; pp_uint32 bit_buffer = 0, x, todo, offbits, offset, written=0; if (src == NULL || dest == NULL || offset_lens == NULL) return 0; /* set up input and output pointers */ buf_src = src + src_len; out = dest_end = dest + dest_len; /* skip the first few bits */ PP_READ_BITS(skip_bits, x); /* while there are input bits left */ while (written < dest_len) { PP_READ_BITS(1, x); if (x == 0) { /* 1bit==0: literal, then match. 1bit==1: just match */ todo = 1; do { PP_READ_BITS(2, x); todo += x; } while (x == 3); while (todo--) { PP_READ_BITS(8, x); PP_BYTE_OUT(x); } /* should we end decoding on a literal, break out of the main loop */ if (written == dest_len) break; } /* match: read 2 bits for initial offset bitlength / match length */ PP_READ_BITS(2, x); offbits = offset_lens[x]; todo = x+2; if (x == 3) { PP_READ_BITS(1, x); if (x==0) offbits = 7; PP_READ_BITS(offbits, offset); do { PP_READ_BITS(3, x); todo += x; } while (x == 7); } else { PP_READ_BITS(offbits, offset); } if ((out + offset) >= dest_end) return 0; /* match overflow */ while (todo--) { x = out[offset]; PP_BYTE_OUT(x); } } /* all output bytes written without error */ return 1; /* return (src == buf_src) ? 1 : 0; */ } #ifdef WANT_PP2X_DECRYPTING /* this pretends to decrunch a data stream. If it wasn't decrypted * exactly right, it will access match offsets that don't exist, or * request match lengths that there isn't enough data for, or will * underrun or overrun the theoretical output buffer */ inline pp_int32 ppValidate(pp_uint8 *src, pp_uint8 *offset_lens, pp_uint32 src_len, pp_uint32 dest_len, pp_uint8 skip_bits) { pp_uint8 *buf_src, bits_left = 0, bit_cnt; pp_uint32 bit_buffer = 0, x, todo, offbits, offset, written=0; if (src == NULL || offset_lens == NULL) return 0; /* set up input pointer */ buf_src = src + src_len; /* skip the first few bits */ PP_READ_BITS(skip_bits, x); /* while there are input bits left */ while (written < dest_len) { PP_READ_BITS(1, x); if (x == 0) { /* 1bit==0: literal, then match. 1bit==1: just match */ todo = 1; do { PP_READ_BITS(2, x); todo += x; } while (x == 3); written += todo; if (written > dest_len) return 0; while (todo--) PP_READ_BITS(8, x); /* should we end decoding on a literal, break out of the main loop */ if (written == dest_len) break; } /* match: read 2 bits for initial offset bitlength / match length */ PP_READ_BITS(2, x); offbits = offset_lens[x]; todo = x+2; if (x == 3) { PP_READ_BITS(1, x); if (x==0) offbits = 7; PP_READ_BITS(offbits, offset); do { PP_READ_BITS(3, x); todo += x; } while (x == 7); } else { PP_READ_BITS(offbits, offset); } if (offset >= written) return 0; /* match overflow */ written += todo; if (written > dest_len) return 0; } /* all output bytes written without error */ return 1; } #endif pp_int32 PP20::ppcrack(pp_uint8** destRef, pp_uint8 *data, pp_uint32 len) { /* PP FORMAT: * 1 longword identifier 'PP20' or 'PX20' * [1 word checksum (if 'PX20') $ssss] * 1 longword efficiency $eeeeeeee * X longwords crunched file $cccccccc,$cccccccc,... * 1 longword decrunch info 'decrlen' << 8 | '8 bits other info' */ pp_int32 success=0; pp_uint8 *output, crypted; pp_uint32 outlen; if (len < 16) { //fprintf(stderr, "File is too short to be a PP file (%u bytes)\n", len); globalError = true; outlen = 0; goto byebye; } if (data[0]=='P' && data[1]=='P' && data[2]=='2' && data[3]=='0') { if (len & 0x03) { //fprintf(stderr, "File length is not a multiple of 4\n"); globalError = true; outlen = 0; goto byebye; } crypted = 0; } else if (data[0]=='P' && data[1]=='X' && data[2]=='2' && data[3]=='0') { if ((len-2) & 0x03) { //fprintf(stderr, "(file length - 2) is not a multiple of 4\n"); globalError = true; outlen = 0; goto byebye; } crypted = 1; } else { //fprintf(stderr, "File does not have the PP signature\n"); globalError = true; outlen = 0; goto byebye; } outlen = (data[len-4]<<16) | (data[len-3]<<8) | data[len-2]; /* fprintf(stderr, "decrunched length = %u bytes\n", outlen); */ output = *destRef = new pp_uint8[outlen]; if (output == NULL) { //fprintf(stderr, "out of memory!\n"); globalError = true; outlen = 0; goto byebye; } if (crypted == 0) { /*fprintf(stderr, "not encrypted, decrunching anyway\n"); */ if (ppDecrunch(&data[8], output, &data[4], len-12, outlen, data[len-1])) { /* fprintf(stderr, "Decrunch successful! "); */ //savefile(fo, (void *) output, outlen); } else { success=-1; } } else { #ifdef WANT_PP2X_DECRYPTING /* brute-force calculate the key */ pp_uint32 key = key_start; /* shortcut to halve keyspace: * PowerPacker alternates between two operations - literal and match. * The FIRST operation must be literal, as there's no data been output * to match yet, so the first BIT in the compressed stream must be set * to 0. The '8 bits other info' is actually the number of bits unused * in the first longword. We must ignore these. * * So we know which bit is the first one in the compressed stream, and * that is matched a bit in the decryption XOR key. * * We know the encrypted value of the first bit, and we know it must * actually be 0 when decrypted. So, if the value is 1, then that bit * of the decryption key must be 1, to invert that bit to a 0. If the * value is 0, then that bit of the decryption key must be 0, to leave * that bit set at 0. * * Given the knowledge of exactly one of the bits in the keys, we can * reject all keys that do not have the appropriate value for this bit. */ pp_uint32 drop_mask = 1 << data[len-1]; pp_uint32 drop_value = ( (data[len-8]<<24) | (data[len-7]<<16) | (data[len-6]<<8) | data[len-5] ) & drop_mask; pp_uint8 *temp = new pp_uint8[len-14]; //fprintf(stderr, "\nEncrypted. Hang on, while trying to find the right key...\n"); if (temp == NULL) { //fprintf(stderr, "out of memory!\n"); globalError = true; outlen = 0; goto byebye; } do { //if ((key & 0xFFF) == 0) { //fprintf(stderr, "key %08x\r", key); //fflush(stdout); //} if ((key & drop_mask) != drop_value) continue; /* decrypt with this key */ ppDecryptCopy(&data[10], temp, len-14, key); if (ppValidate(temp, &data[6], len-14, outlen, data[len-1])) { //fprintf(stderr, "key %08x success!\n", key); ppDecrunch(temp, output, &data[6], len-14, outlen, data[len-1]); /* key_match = key */ /* sprintf(output_name, "%s.%08x", name, key); */ savefile(fo, output, outlen); break; } } while (key++ != 0xFFFFFFFF); delete[] temp; //fprintf(stderr, "All keys done!\n"); #else //fprintf(stderr, "\nWarning: support for encrypted powerpacker files not compiled in.\n"); success=-1; #endif } byebye: if (success == -1) outlen = 0; return outlen; } pp_int32 PP20::ppdepack(pp_uint8 *src, pp_uint32 s, pp_uint8** destRef) { pp_int32 success; key_start = 0; success = ppcrack(destRef, (pp_uint8 *)src, s); return success; } pp_uint32 PP20::decompress(const void* source, pp_uint32 size, pp_uint8** destRef) { pp_uint32 outputLen = 0; pp_uint8 *packed /*, *unpacked */; pp_int32 plen = size, unplen; globalError = false; // assume no error if ( !isCompressed(source,size) ) { outputLen = 0; goto byebye; } // ------------------------------ //counter = 0; /* Amiga longwords are only on even addresses. * The pp20 data format has the length stored in a longword * after the packed data, so I guess a file that is not even * is probl not a valid pp20 file. Thanks for Don Adan for * reminding me on this! - mld */ if ((plen != (plen / 2) * 2)) { //fprintf(stderr, "filesize not even\n"); outputLen = 0; globalError = true; goto byebye; } packed = const_cast(reinterpret_cast(source)); /* Hmmh... original pp20 only support efficiency from 9 9 9 9 up to 9 10 12 13, afaik * but the xfd detection code says this... *sigh* * * move.l 4(a0),d0 * cmp.b #9,d0 * blo.b .Exit * and.l #$f0f0f0f0,d0 * bne.s .Exit */ if (((packed[4] < 9) || (packed[5] < 9) || (packed[6] < 9) || (packed[7] < 9))) { //fprintf(stderr, "invalid efficiency\n"); outputLen = 0; globalError = true; goto byebye; } if (((((val (packed +4) ) * 256 ) + packed[7] ) & 0xf0f0f0f0) != 0 ) { //fprintf(stderr, "invalid efficiency(?)\n"); outputLen = 0; globalError = true; goto byebye; } unplen = val (packed + plen - 4); if (!unplen) { //fprintf(stderr, "not a powerpacked file\n"); outputLen = 0; globalError = true; goto byebye; } if ( *destRef != 0 ) { delete[] *destRef; } outputLen = ppdepack (packed, plen, destRef); if (outputLen == 0) { //fprintf(stderr, "error while decrunching data..."); globalError = true; goto byebye; } // ------------------------------ // Finished. byebye: if (outputLen == 0) // not successful { delete[] *destRef; } return outputLen; } milkytracker-0.90.85+dfsg/src/compression/DecompressorQT.mm0000755000175000017500000000573111172163710023030 0ustar admin2admin2/* * compression/DecompressorQT.mm * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorQT.mm * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #include "DecompressorQT.h" #include "XMFile.h" #import #import #import "AIFFWriter.h" // -- QT -------------------------------------------------------------------- DecompressorQT::DecompressorQT(const PPSystemString& filename) : DecompressorBase(filename) { } bool DecompressorQT::identify(XMFile& f) { bool res = true; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSString* filename = [NSString stringWithUTF8String:f.getFileName()]; NSError* qtError = nil; QTMovie* movie = [QTMovie movieWithFile:filename error:&qtError]; if (nil != qtError) { res = false; } else { res = [[movie attributeForKey:QTMovieHasAudioAttribute] boolValue] != NO; } [pool release]; return res; } const PPSimpleVector& DecompressorQT::getDescriptors(Hints hint) const { descriptors.clear(); // TODO: add wild card support //descriptors.add(new Descriptor("*", "Quicktime Content")); return descriptors; } bool DecompressorQT::decompress(const PPSystemString& outFilename, Hints hint) { // If client requests something else than a sample we can't deal we that if (hint != HintAll && hint != HintSamples) return false; bool res = true; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSString* filename = [NSString stringWithUTF8String:fileName]; NSError* qtError = nil; QTMovie* movie = [QTMovie movieWithFile:filename error:&qtError]; if (nil == qtError) { AIFFWriter* aiffWriter = [[AIFFWriter alloc] init]; if (TRUE == [[movie attributeForKey:QTMovieHasAudioAttribute] boolValue]) { OSStatus err = [aiffWriter exportFromMovie:movie toFile:[NSString stringWithUTF8String:outFilename]]; if (err != noErr) { res = false; } } else { // movie contains no audio track res = false; } [aiffWriter release]; } else { // Some error has occured res = false; } [pool release]; return res; } DecompressorBase* DecompressorQT::clone() { return new DecompressorQT(fileName); } static Decompressor::RegisterDecompressor registerDecompressor; milkytracker-0.90.85+dfsg/src/compression/lha/0000755000175000017500000000000011317506056020323 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/compression/lha/dhuf.inl0000755000175000017500000001164411027666433021772 0ustar admin2admin2/************************************************************** title dhuf.c *************************************************************** Dynamic Huffman routine H.Yoshizaki **************************************************************/ #define N_CHAR (256 + 60 - THRESHOLD + 1) #define TREESIZE_C (N_CHAR * 2) #define TREESIZE_P (128 * 2) #define TREESIZE (TREESIZE_C + TREESIZE_P) #define ROOT_C 0 #define ROOT_P TREESIZE_C void CLhaArchive::InitDecodeTables() { short *pDecodeTables = (short *)m_pDecoderData; child = pDecodeTables; parent = pDecodeTables + TREESIZE; block = pDecodeTables + TREESIZE*2; edge = pDecodeTables + TREESIZE*3; stock = pDecodeTables + TREESIZE*4; node = pDecodeTables + TREESIZE*5; freq = (unsigned short *)(pDecodeTables + TREESIZE*6); } void CLhaArchive::start_c_dyn() { int i, j, f; n1 = ((int)n_max >= 256 + maxmatch - THRESHOLD + 1) ? 512 : n_max - 1; for (i = 0; i < TREESIZE_C; i++) { stock[i] = i; block[i] = 0; } for (i = 0, j = n_max * 2 - 2; i < (int)n_max; i++, j--) { freq[j] = 1; child[j] = ~i; node[i] = j; block[j] = 1; } avail = 2; edge[1] = n_max - 1; i = n_max * 2 - 2; while (j >= 0) { f = freq[j] = freq[i] + freq[i - 1]; child[j] = i; parent[i] = parent[i - 1] = j; if (f == freq[j + 1]) { edge[block[j] = block[j + 1]] = j; } else { edge[block[j] = stock[avail++]] = j; } i -= 2; j--; } } void CLhaArchive::start_p_dyn() { freq[ROOT_P] = 1; child[ROOT_P] = ~(N_CHAR); node[N_CHAR] = ROOT_P; edge[block[ROOT_P] = stock[avail++]] = ROOT_P; most_p = ROOT_P; total_p = 0; nn = 1 << dicbit; nextcount = 64; } void CLhaArchive::decode_start_dyn() { n_max = 286; maxmatch = MAXMATCH; init_getbits(); start_c_dyn(); start_p_dyn(); } void CLhaArchive::reconst(int start, int end) { int i, j, k, l, b; unsigned int f, g; for (i = j = start; i < end; i++) { if ((k = child[i]) < 0) { freq[j] = (freq[i] + 1) / 2; child[j] = k; j++; } if (edge[b = block[i]] == i) { stock[--avail] = b; } } j--; i = end - 1; l = end - 2; while (i >= start) { while (i >= l) { freq[i] = freq[j]; child[i] = child[j]; i--, j--; } f = freq[l] + freq[l + 1]; for (k = start; f < freq[k]; k++); while(j >= k) { freq[i] = freq[j]; child[i] = child[j]; i--, j--; } freq[i] = f; child[i] = l + 1; i--; l -= 2; } f = 0; for (i = start; i < end; i++) { if ((j = child[i]) < 0) node[~j] = i; else parent[j] = parent[j - 1] = i; if ((g = freq[i]) == f) { block[i] = b; } else { edge[b = block[i] = stock[avail++]] = i; f = g; } } } int CLhaArchive::swap_inc(int p) { int b, q, r, s; b = block[p]; if ((q = edge[b]) != p) { /* swap for leader */ r = child[p]; s = child[q]; child[p] = s; child[q] = r; if (r >= 0) parent[r] = parent[r - 1] = q; else node[~r] = q; if (s >= 0) parent[s] = parent[s - 1] = p; else node[~s] = p; p = q; goto Adjust; } else if (b == block[p + 1]) { Adjust: edge[b]++; if (++freq[p] == freq[p - 1]) { block[p] = block[p - 1]; } else { edge[block[p] = stock[avail++]] = p; /* create block */ } } else if (++freq[p] == freq[p - 1]) { stock[--avail] = b; /* delete block */ block[p] = block[p - 1]; } return parent[p]; } void CLhaArchive::update_c(int p) { int q; if (freq[ROOT_C] == 0x8000) { reconst(0, n_max * 2 - 1); } freq[ROOT_C]++; q = node[p]; do { q = swap_inc(q); } while (q != ROOT_C); } void CLhaArchive::update_p(int p) { int q; if (total_p == 0x8000) { reconst(ROOT_P, most_p + 1); total_p = freq[ROOT_P]; freq[ROOT_P] = 0xffff; } q = node[p + N_CHAR]; while (q != ROOT_P) { q = swap_inc(q); } total_p++; } void CLhaArchive::make_new_node(int p) { int q, r; r = most_p + 1; q = r + 1; node[~(child[r] = child[most_p])] = r; child[q] = ~(p + N_CHAR); child[most_p] = q; freq[r] = freq[most_p]; freq[q] = 0; block[r] = block[most_p]; if (most_p == ROOT_P) { freq[ROOT_P] = 0xffff; edge[block[ROOT_P]]++; } parent[r] = parent[q] = most_p; edge[block[q] = stock[avail++]] = node[p + N_CHAR] = most_p = q; update_p(p); } unsigned short CLhaArchive::decode_c_dyn() { int c; short buf, cnt; c = child[ROOT_C]; buf = bitbuf; cnt = 0; do { c = child[c - (buf < 0)]; buf <<= 1; if (++cnt == 16) { fillbuf(16); buf = bitbuf; cnt = 0; } } while (c > 0); fillbuf((unsigned char)cnt); c = ~c; update_c(c); if (c == n1) c += getbits(8); return c; } unsigned short CLhaArchive::decode_p_dyn() { int c; short buf, cnt; while (count > nextcount) { make_new_node(nextcount / 64); if ((nextcount += 64) >= (unsigned int)nn) nextcount = 0xffffffff; } c = child[ROOT_P]; buf = bitbuf; cnt = 0; while (c > 0) { c = child[c - (buf < 0)]; buf <<= 1; if (++cnt == 16) { fillbuf(16); buf = bitbuf; cnt = 0; } } fillbuf((unsigned char)cnt); c = (~c) - N_CHAR; update_p(c); return (c << 6) + getbits(6); } milkytracker-0.90.85+dfsg/src/compression/lha/header.inl0000755000175000017500000001224611252224630022260 0ustar admin2admin2/*----------------------------------------------------------------------*/ /* header.c (from lharc.c) -- header manipulate functions */ /* Original by Y.Tagawa */ /* modified Dec 16 1991 by M.Oki */ /*----------------------------------------------------------------------*/ static int calc_sum(char *p, int len) { int sum; for (sum = 0; len; len --) sum += *p++; return sum & 0xff; } /*----------------------------------------------------------------------*/ /* build header functions */ /*----------------------------------------------------------------------*/ bool CLhaArchive::get_header(pp_uint32 &fp, LzHeader *hdr) //---------------------------------------------------- { int header_size; int name_length; char data[LZHEADER_STRAGE]; char dirname[FILENAME_LENGTH]; int dir_length = 0; int checksum; unsigned char uc; memset(hdr, 0, sizeof(LzHeader)); if (!lharead(&uc, 1, 1, fp)) return false; header_size = uc; if ((!header_size) || (header_size > LZHEADER_STRAGE - I_HEADER_CHECKSUM)) return false; if (lharead(data + I_HEADER_CHECKSUM, 1, header_size - 1, fp) < header_size - 1) return false; setup_get(data + I_HEADER_LEVEL); hdr->header_level = get_byte(); if (hdr->header_level != 2 && lharead(data + header_size, sizeof (char), 2, fp) < 2) { return false; } setup_get (data + I_HEADER_CHECKSUM); checksum = get_byte(); hdr->header_size = header_size; memcpy(hdr->method, data + I_METHOD, METHOD_TYPE_STRAGE); setup_get (data + I_PACKED_SIZE); hdr->packed_size = get_longword(); if ((unsigned long)hdr->packed_size > m_dwStreamLen) return false; hdr->original_size = get_longword(); if ((unsigned long)hdr->original_size > 0x4000000) return false; hdr->last_modified_stamp = get_longword(); hdr->attribute = get_byte(); if ((hdr->header_level = get_byte ()) != 2) { if (calc_sum(data + I_METHOD, header_size) != checksum) { #ifdef LHADEBUG Log("WARNING: Archive Checksum error\n"); Log("header_level = %d\n", hdr->header_level); Log("header_size = %d\n", hdr->header_size); Log("packed_size = %d\n", hdr->packed_size); Log("original_size = %d\n", hdr->original_size); #endif if ((hdr->header_level > 3) || (hdr->packed_size > hdr->original_size)) return false; } name_length = get_byte(); for (int i = 0; i < name_length; i ++) hdr->name[i] = (char)get_byte(); hdr->name[name_length] = '\0'; } else { name_length = 0; } // defaults for other type hdr->unix_mode = UNIX_FILE_REGULAR | UNIX_RW_RW_RW; // EXTEND FORMAT if (header_size - name_length >= 24) { hdr->crc = get_word(); hdr->extend_type = get_byte(); hdr->has_crc = true; } else // Generic with CRC if (header_size - name_length == 22) { hdr->crc = get_word (); hdr->extend_type = EXTEND_GENERIC; hdr->has_crc = true; } else // Generic no CRC if (header_size - name_length == 20) { hdr->extend_type = EXTEND_GENERIC; hdr->has_crc = false; } else { return false; } if (hdr->extend_type == EXTEND_UNIX && hdr->header_level == 0) { hdr->minor_version = get_byte(); hdr->unix_last_modified_stamp = get_longword(); hdr->unix_mode = get_word(); get_word(); // hdr->unix_uid = get_word(); get_word(); // hdr->unix_gid = get_word(); return true; } if (hdr->header_level > 0) { // Extend Header if (hdr->header_level != 2) setup_get(data + hdr->header_size); char *ptr = get_ptr; while((header_size = get_word()) != 0) { if (hdr->header_level != 2 && ((data + LZHEADER_STRAGE - get_ptr < header_size) || (lharead(get_ptr, sizeof(char), header_size, fp) < header_size))) { return false; } switch (get_byte()) { // Header CRC case 0: setup_get(get_ptr + header_size - 3); break; // File Name case 1: { if (header_size >= 256+3) return false; for (int i = 0; i < header_size - 3; i++) hdr->name[i] = (char)get_byte(); hdr->name[header_size - 3] = '\0'; } break; // Directory case 2: { if (header_size >= FILENAME_LENGTH+3) return false; for (int i = 0; i < header_size - 3; i++) dirname[i] = (char)get_byte (); dirname[header_size - 3] = '\0'; dir_length = header_size-3; } break; // MS-DOS attribute case 0x40: if (hdr->extend_type == EXTEND_MSDOS || hdr->extend_type == EXTEND_HUMAN || hdr->extend_type == EXTEND_GENERIC) hdr->attribute = (unsigned char)get_word(); break; // UNIX Permission case 0x50: if (hdr->extend_type == EXTEND_UNIX) hdr->unix_mode = get_word(); break; // UNIX gid and uid case 0x51: if (hdr->extend_type == EXTEND_UNIX) { get_word(); //hdr->unix_gid = get_word(); get_word(); //hdr->unix_uid = get_word(); } break; // UNIX last modified time case 0x54: if (hdr->extend_type == EXTEND_UNIX) hdr->unix_last_modified_stamp = get_longword(); break; // Other headers default: setup_get(get_ptr + header_size - 3); break; } } if (hdr->header_level != 2 && get_ptr - ptr != 2) { hdr->packed_size -= get_ptr - ptr - 2; hdr->header_size += get_ptr - ptr - 2; } } if (dir_length) { strcat(dirname, hdr->name); strcpy(hdr->name, dirname); name_length += dir_length; } return true; } milkytracker-0.90.85+dfsg/src/compression/lha/larc.inl0000755000175000017500000000246311027666433021764 0ustar admin2admin2/*********************************************************** larc.c -- extract *.lzs ***********************************************************/ #define MAGIC0 18 #define MAGIC5 19 unsigned short CLhaArchive::decode_c_lzs(void) { if (getbits(1)) { return getbits(8); } else { matchpos = getbits(11); return getbits(4) + 0x100; } } unsigned short CLhaArchive::decode_p_lzs(void) { return (loc - matchpos - MAGIC0) & 0x7ff; } void CLhaArchive::decode_start_lzs(void) { init_getbits(); } unsigned short CLhaArchive::decode_c_lz5(void) { int c; if (flagcnt == 0) { flagcnt = 8; flag = m_lpStream[LzInterface.infile++]; } flagcnt--; c = m_lpStream[LzInterface.infile++]; if ((flag & 1) == 0) { matchpos = c; c = m_lpStream[LzInterface.infile++]; matchpos += (c & 0xf0) << 4; c &= 0x0f; c += 0x100; } flag >>= 1; return c; } unsigned short CLhaArchive::decode_p_lz5(void) { return (loc - matchpos - MAGIC5) & 0xfff; } void CLhaArchive::decode_start_lz5(unsigned char *text) { int i; flagcnt = 0; for (i = 0; i < 256; i++) memset(&text[i * 13 + 18], i, 13); for (i = 0; i < 256; i++) text[256 * 13 + 18 + i] = i; for (i = 0; i < 256; i++) text[256 * 13 + 256 + 18 + i] = 255 - i; memset(&text[256 * 13 + 512 + 18], 0, 128); memset(&text[256 * 13 + 512 + 128 + 18], ' ', 128 - 18); } milkytracker-0.90.85+dfsg/src/compression/lha/unlha32.h0000755000175000017500000001042311027677074021762 0ustar admin2admin2#ifndef UNLHA32_LIB_H #define UNLHA32_LIB_H #include "BasicTypes.h" typedef struct LzHeader { unsigned char header_size; char method[5]; long packed_size; long original_size; long last_modified_stamp; unsigned char attribute; unsigned char header_level; char name[256]; unsigned short crc; bool has_crc; unsigned char extend_type; unsigned char minor_version; unsigned long unix_last_modified_stamp; unsigned short unix_mode; } LzHeader; typedef struct _LzInterfacing { pp_uint32 infile; pp_uint8* outfile; unsigned long original; unsigned long packed; int dicbit; int method; } LzInterfacing; //=============== class CLhaArchive //=============== { public: class StreamerBase { protected: virtual pp_uint8 get(pp_uint32 pos) = 0; public: pp_uint8 operator[](pp_uint32 index) { return get(index); } virtual void read(void* buffer, pp_uint32 from, pp_uint32 len) = 0; }; struct IDNotifier { virtual bool identify(void* buffer, pp_uint32 len) const = 0; }; enum { MAXMATCH = 256 }; // formerly F (not more than UCHAR_MAX + 1) enum { THRESHOLD = 3 }; // choose optimal value enum { NC = 255 + MAXMATCH + 2 - THRESHOLD }; public: CLhaArchive(StreamerBase& streamer, pp_uint32 dwMemLength, IDNotifier* notifier = NULL); ~CLhaArchive(); public: pp_uint8* GetOutputFile() const { return m_lpOutputFile; } pp_uint32 GetOutputFileLength() const { return m_dwOutputLen; } bool IsArchive(); bool ExtractFile(); protected: StreamerBase& m_lpStream; // LHA file data pp_uint32 m_dwStreamLen; // LHA file size IDNotifier* m_notifier; pp_uint32 m_dwStreamPos; // LHA file position pp_uint8* m_lpOutputFile; pp_uint32 m_dwOutputLen; pp_uint8 *m_pDecoderData; protected: char *get_ptr; unsigned short crc, bitbuf; unsigned char subbitbuf, bitcount; unsigned short crctable[256]; LzInterfacing LzInterface; unsigned int n_max; unsigned short total_p; int avail, n1, most_p, nn; unsigned long count, nextcount, compsize; short *child, *parent, *block, *edge, *stock, *node; unsigned short *freq; unsigned char *buf; unsigned short bufsiz, blocksize; unsigned int np; int flag, flagcnt, matchpos, prev_char; unsigned short dicsiz, dicbit, maxmatch, loc; unsigned short left[2 * NC - 1], right[2 * NC - 1]; protected: void setup_get(char *p) { get_ptr = p; } int get_byte() { return (*get_ptr++ & 0xff); } unsigned short get_word() { int b0, b1; b0 = get_byte(); b1 = get_byte(); return (b1 << 8) + b0; } long get_longword() { long b0, b1, b2, b3; b0 = get_byte(); b1 = get_byte(); b2 = get_byte(); b3 = get_byte(); return (b3 << 24) + (b2 << 16) + (b1 << 8) + b0; } bool get_header(pp_uint32 &fp, LzHeader *hdr); void make_crctable(); unsigned short calccrc(unsigned char *p , int n); void init_getbits(); unsigned short getbits(unsigned int n); void fillbuf(unsigned char n); int lharead(void *, int, int, pp_uint32 &fp); // fread equivalent void fwrite_crc(unsigned char *p, int n, pp_uint8* &fp); void extract_one(pp_uint32 &afp, LzHeader *hdr); pp_uint8* open_with_make_path(const char *, int size); int decode_lzhuf(pp_uint32 &infp, pp_uint8* outfp, long original_size, long packed_size, int method); void decode(LzInterfacing *pinterface); void make_table(unsigned int nchar, unsigned char *bitlen, unsigned int tablebits, unsigned short *table); protected: // dhuf.cpp void InitDecodeTables(); void start_c_dyn(); void start_p_dyn(); void decode_start_dyn(); void reconst(int start, int end); int swap_inc(int p); void update_c(int p); void update_p(int p); void make_new_node(int p); unsigned short decode_c_dyn(); unsigned short decode_p_dyn(); protected: // huf.cpp void InitHufTables(); void decode_start_st1(); void read_pt_len(short nn, short nbit, short i_special); void read_c_len(); unsigned short decode_c_st1(); unsigned short decode_p_st1(); protected: // shuf.cpp void decode_start_st0(); void decode_start_fix(); unsigned short decode_c_st0(); unsigned short decode_p_st0(); void read_tree_p(); void read_tree_c(); void ready_made(int method); protected: // larc.cpp unsigned short decode_c_lzs(); unsigned short decode_p_lzs(); unsigned short decode_c_lz5(); unsigned short decode_p_lz5(); void decode_start_lzs(); void decode_start_lz5(unsigned char *); }; #endif // UNLHA32_LIB_H milkytracker-0.90.85+dfsg/src/compression/lha/slide.inl0000755000175000017500000000522011027666433022135 0ustar admin2admin2/*********************************************************** slide.c -- sliding dictionary with percolating update ***********************************************************/ /* static decode_option decode_define[7] = { // lh1 {decode_c_dyn, decode_p_st0, decode_start_fix}, // lh2 {decode_c_dyn, decode_p_dyn, decode_start_dyn}, // lh3 {decode_c_st0, decode_p_st0, decode_start_st0}, // lh4 {decode_c_st1, decode_p_st1, decode_start_st1}, // lh5 {decode_c_st1, decode_p_st1, decode_start_st1}, // lzs {decode_c_lzs, decode_p_lzs, decode_start_lzs}, // lz5 {decode_c_lz5, decode_p_lz5, decode_start_lz5} }; */ void CLhaArchive::decode(LzInterfacing *pinterface) { int dicsiz1, offset; unsigned char *text; dicbit = pinterface->dicbit; compsize = pinterface->packed; crc = 0; prev_char = -1; dicsiz = 1 << dicbit; text = new unsigned char[dicsiz]; if (!text) return; memset(text, ' ', dicsiz); #ifdef LHADEBUG Log("Initializing Decode...\n"); #endif switch(pinterface->method - 1) { case 1: decode_start_dyn(); break; case 2: decode_start_st0(); break; case 3: decode_start_st1(); break; case 4: decode_start_st1(); break; case 5: decode_start_lzs(); break; case 6: decode_start_lz5(text); break; default: decode_start_fix(); break; } #ifdef LHADEBUG Log("Starting Decode (original size=%d)...\n", pinterface->original); #endif dicsiz1 = dicsiz - 1; offset = (pinterface->method == 6) ? 0x100 - 2 : 0x100 - 3; count = 0; loc = 0; while (count < pinterface->original) { int c; switch(pinterface->method - 1) { case 2: c = decode_c_st0(); break; case 3: c = decode_c_st1(); break; case 4: c = decode_c_st1(); break; case 5: c = decode_c_lzs(); break; case 6: c = decode_c_lz5(); break; default: c = decode_c_dyn(); break; } if (c <= 255) { text[loc++] = c; if (loc == dicsiz) { fwrite_crc(text, dicsiz, pinterface->outfile); loc = 0; } count++; } else { int d; switch(pinterface->method - 1) { case 1: d = decode_p_dyn(); break; case 2: d = decode_p_st0(); break; case 3: d = decode_p_st1(); break; case 4: d = decode_p_st1(); break; case 5: d = decode_p_lzs(); break; case 6: d = decode_p_lz5(); break; default: d = decode_p_st0(); break; } int j = c - offset; int i = (loc - d - 1) & dicsiz1; count += j; for (int k = 0; k < j; k++) { c = text[(i + k) & dicsiz1]; text[loc++] = c; if (loc == dicsiz) { fwrite_crc(text, dicsiz, pinterface->outfile); loc = 0; } } } } if (loc != 0) { fwrite_crc(text, loc, pinterface->outfile); } delete text; #ifdef LHADEBUG Log("Decoding Done!\n"); #endif } milkytracker-0.90.85+dfsg/src/compression/lha/shuf.inl0000755000175000017500000000625111027666433022007 0ustar admin2admin2/*********************************************************** shuf.c -- extract static Huffman coding ***********************************************************/ #define N1 286 /* alphabet size */ #define N2 (2 * N1 - 1) /* # of nodes in Huffman tree */ #define EXTRABITS 8 /* >= log2(F-THRESHOLD+258-N1) */ #define BUFBITS 16 /* >= log2(MAXBUF) */ #define LENFIELD 4 /* bit size of length field for tree output */ #define NP0 (8 * 1024 / 64) #define NP2 (NP0 * 2 - 1) void CLhaArchive::decode_start_st0() { n_max = 286; maxmatch = MAXMATCH; init_getbits(); np = 1 << (MAX_DICBIT - 6); } const int fixed[2][16] = { {3, 0x01, 0x04, 0x0c, 0x18, 0x30, 0}, /* old compatible */ {2, 0x01, 0x01, 0x03, 0x06, 0x0D, 0x1F, 0x4E, 0} /* 8K buf */ }; void CLhaArchive::ready_made(int method) { int i, j; unsigned int code, weight; const int *tbl; tbl = fixed[method]; j = *tbl++; weight = 1 << (16 - j); code = 0; for (i = 0; i < (int)np; i++) { while (*tbl == i) { j++; tbl++; weight >>= 1; } gpHufData->pt_len[i] = j; gpHufData->pt_code[i] = code; code += weight; } } void CLhaArchive::read_tree_c() /* read tree from file */ { int i, c; i = 0; while (i < N1) { if (getbits(1)) gpHufData->c_len[i] = getbits(LENFIELD) + 1; else gpHufData->c_len[i] = 0; if (++i == 3 && gpHufData->c_len[0] == 1 && gpHufData->c_len[1] == 1 && gpHufData->c_len[2] == 1) { c = getbits(CBIT); for (i = 0; i < N1; i++) gpHufData->c_len[i] = 0; for (i = 0; i < 4096; i++) gpHufData->c_table[i] = c; return; } } make_table(N1, gpHufData->c_len, 12, gpHufData->c_table); } void CLhaArchive::read_tree_p() /* read tree from file */ { int i, c; i = 0; while (i < NP0) { gpHufData->pt_len[i] = (unsigned char)getbits(LENFIELD); if (++i == 3 && gpHufData->pt_len[0] == 1 && gpHufData->pt_len[1] == 1 && gpHufData->pt_len[2] == 1) { c = getbits(MAX_DICBIT - 6); for (i = 0; i < NP0; i++) gpHufData->c_len[i] = 0; for (i = 0; i < 256; i++) gpHufData->c_table[i] = c; return; } } } void CLhaArchive::decode_start_fix() { n_max = 314; maxmatch = 60; init_getbits(); np = 1 << (12 - 6); start_c_dyn(); ready_made(0); make_table(np, gpHufData->pt_len, 8, gpHufData->pt_table); } unsigned short CLhaArchive::decode_c_st0() { int i, j; if (blocksize == 0) { /* read block head */ blocksize = getbits(BUFBITS); /* read block blocksize */ read_tree_c(); if (getbits(1)) { read_tree_p(); } else { ready_made(1); } make_table(NP0, gpHufData->pt_len, 8, gpHufData->pt_table); } blocksize--; j = gpHufData->c_table[bitbuf >> 4]; if (j < N1) fillbuf(gpHufData->c_len[j]); else { fillbuf(12); i = bitbuf; do { j = ((short)i < 0) ? right[j] : left[j]; i <<= 1; } while (j >= N1); fillbuf(gpHufData->c_len[j] - 12); } if (j == N1 - 1) j += getbits(EXTRABITS); return j; } unsigned short CLhaArchive::decode_p_st0() { int j = gpHufData->pt_table[bitbuf >> 8]; if (j < (int)np) { fillbuf(gpHufData->pt_len[j]); } else { int i; fillbuf(8); i = bitbuf; do { j = ((short)i < 0) ? right[j] : left[j]; i <<= 1; } while (j >= (int)np); fillbuf(gpHufData->pt_len[j] - 8); } return (j << 6) + getbits(6); } milkytracker-0.90.85+dfsg/src/compression/lha/huf.inl0000755000175000017500000000642411027666433021626 0ustar admin2admin2/*********************************************************** huf.c -- new static Huffman ***********************************************************/ #define NP (MAX_DICBIT + 1) #define NT (USHRT_BIT + 3) #define PBIT 4 /* smallest integer such that (1 << PBIT) > NP */ #define TBIT 5 /* smallest integer such that (1 << TBIT) > NT */ #define NPT 0x80 typedef struct _HUFDATA { unsigned char c_len[CLhaArchive::NC], pt_len[NPT]; unsigned short c_freq[2 * CLhaArchive::NC - 1], c_table[4096], c_code[CLhaArchive::NC], p_freq[2 * NP - 1], pt_table[256], pt_code[NPT], t_freq[2 * NT - 1]; } HUFDATA; HUFDATA *gpHufData = NULL; void CLhaArchive::InitHufTables() { gpHufData = (HUFDATA *)(m_pDecoderData + 4096); } /***** decoding *****/ void CLhaArchive::read_pt_len(short nn, short nbit, short i_special) { short i, c, n; n = getbits(nbit); if (n == 0) { c = getbits(nbit); for (i = 0; i < nn; i++) gpHufData->pt_len[i] = 0; for (i = 0; i < 256; i++) gpHufData->pt_table[i] = c; } else { i = 0; while (i < n) { c = bitbuf >> (16 - 3); if (c == 7) { unsigned short mask = 1 << (16 - 4); while (mask & bitbuf) { mask >>= 1; c++; } } fillbuf((c < 7) ? 3 : c - 3); gpHufData->pt_len[i++] = (unsigned char)c; if (i == i_special) { c = getbits(2); while (--c >= 0) gpHufData->pt_len[i++] = 0; } } while (i < nn) gpHufData->pt_len[i++] = 0; make_table(nn, gpHufData->pt_len, 8, gpHufData->pt_table); } } void CLhaArchive::read_c_len() { short i, c, n; n = getbits(CBIT); if (n == 0) { c = getbits(CBIT); for (i = 0; i < NC; i++) gpHufData->c_len[i] = 0; for (i = 0; i < 4096; i++) gpHufData->c_table[i] = c; } else { i = 0; while (i < n) { c = gpHufData->pt_table[bitbuf >> (16 - 8)]; if (c >= NT) { unsigned short mask = 1 << (16 - 9); do { c = (bitbuf & mask) ? right[c] : left[c]; mask >>= 1; } while (c >= NT); } fillbuf(gpHufData->pt_len[c]); if (c <= 2) { if (c == 0) c = 1; else if (c == 1) c = getbits(4) + 3; else c = getbits(CBIT) + 20; while (--c >= 0) gpHufData->c_len[i++] = 0; } else gpHufData->c_len[i++] = c - 2; } while (i < NC) gpHufData->c_len[i++] = 0; make_table(NC, gpHufData->c_len, 12, gpHufData->c_table); } } unsigned short CLhaArchive::decode_c_st1() { unsigned short j, mask; #ifdef LHADEBUG if (!gpHufData) { Log("gpHufData is NULL!!!!"); return 0; } #endif if (blocksize == 0) { blocksize = getbits(16); read_pt_len(NT, TBIT, 3); read_c_len(); read_pt_len(NP, PBIT, -1); } blocksize--; j = gpHufData->c_table[bitbuf >> 4]; if (j < NC) fillbuf(gpHufData->c_len[j]); else { fillbuf(12); mask = 1 << (16 - 1); do { j = (bitbuf & mask) ? right[j] : left[j]; mask >>= 1; } while (j >= NC); fillbuf(gpHufData->c_len[j] - 12); } return j; } unsigned short CLhaArchive::decode_p_st1() { unsigned short j, mask; j = gpHufData->pt_table[bitbuf >> (16 - 8)]; if (j < NP) fillbuf(gpHufData->pt_len[j]); else { fillbuf(8); mask = 1 << (16 - 1); do { j = (bitbuf & mask) ? right[j] : left[j]; mask >>= 1; } while (j >= NP); fillbuf(gpHufData->pt_len[j] - 8); } if (j != 0) j = (1 << (j - 1)) + getbits(j - 1); return j; } void CLhaArchive::decode_start_st1() { init_getbits(); blocksize = 0; } milkytracker-0.90.85+dfsg/src/compression/lha/lharc.h0000755000175000017500000000603011027666433021573 0ustar admin2admin2 /*----------------------------------------------------------------------*/ /* OTHER DIFINITIONS */ /*----------------------------------------------------------------------*/ #define FILENAME_LENGTH 1024 /*----------------------------------------------------------------------*/ /* LHarc FILE DEFINITIONS */ /*----------------------------------------------------------------------*/ #define METHOD_TYPE_STRAGE 5 #define LZHUFF0_METHOD "-lh0-" #define LZHUFF1_METHOD "-lh1-" #define LZHUFF2_METHOD "-lh2-" #define LZHUFF3_METHOD "-lh3-" #define LZHUFF4_METHOD "-lh4-" #define LZHUFF5_METHOD "-lh5-" #define LARC4_METHOD "-lz4-" #define LARC5_METHOD "-lz5-" #define LZHDIRS_METHOD "-lhd-" #define I_HEADER_SIZE 0 #define I_HEADER_CHECKSUM 1 #define I_METHOD 2 #define I_PACKED_SIZE 7 #define I_ORIGINAL_SIZE 11 #define I_LAST_MODIFIED_STAMP 15 #define I_ATTRIBUTE 19 #define I_HEADER_LEVEL 20 #define I_NAME_LENGTH 21 #define I_NAME 22 #define I_CRC 22 /* + name_length */ #define I_EXTEND_TYPE 24 /* + name_length */ #define I_MINOR_VERSION 25 /* + name_length */ #define I_UNIX_LAST_MODIFIED_STAMP 26 /* + name_length */ #define I_UNIX_MODE 30 /* + name_length */ #define I_UNIX_UID 32 /* + name_length */ #define I_UNIX_GID 34 /* + name_length */ #define I_UNIX_EXTEND_BOTTOM 36 /* + name_length */ #define I_GENERIC_HEADER_BOTTOM I_EXTEND_TYPE #define EXTEND_GENERIC 0 #define EXTEND_UNIX 'U' #define EXTEND_MSDOS 'M' #define EXTEND_MACOS 'm' #define EXTEND_OS9 '9' #define EXTEND_OS2 '2' #define EXTEND_OS68K 'K' #define EXTEND_OS386 '3' /* OS-9000??? */ #define EXTEND_HUMAN 'H' #define EXTEND_CPM 'C' #define EXTEND_FLEX 'F' #define EXTEND_RUNSER 'R' /* this OS type is not official */ #define EXTEND_TOWNSOS 'T' #define EXTEND_XOSK 'X' /*------------------------------*/ #define GENERIC_ATTRIBUTE 0x20 #define GENERIC_DIRECTORY_ATTRIBUTE 0x10 #define HEADER_LEVEL0 0x00 #define HEADER_LEVEL1 0x01 #define HEADER_LEVEL2 0x02 #define CURRENT_UNIX_MINOR_VERSION 0x00 #define DELIM ('/') #define DELIM2 (0xff) #define DELIMSTR "/" #define OSK_RW_RW_RW 0000033 #define OSK_FILE_REGULAR 0000000 #define OSK_DIRECTORY_PERM 0000200 #define OSK_SHARED_PERM 0000100 #define OSK_OTHER_EXEC_PERM 0000040 #define OSK_OTHER_WRITE_PERM 0000020 #define OSK_OTHER_READ_PERM 0000010 #define OSK_OWNER_EXEC_PERM 0000004 #define OSK_OWNER_WRITE_PERM 0000002 #define OSK_OWNER_READ_PERM 0000001 #define UNIX_FILE_TYPEMASK 0170000 #define UNIX_FILE_REGULAR 0100000 #define UNIX_FILE_DIRECTORY 0040000 #define UNIX_SETUID 0004000 #define UNIX_SETGID 0002000 #define UNIX_STYCKYBIT 0001000 #define UNIX_OWNER_READ_PERM 0000400 #define UNIX_OWNER_WRITE_PERM 0000200 #define UNIX_OWNER_EXEC_PERM 0000100 #define UNIX_GROUP_READ_PERM 0000040 #define UNIX_GROUP_WRITE_PERM 0000020 #define UNIX_GROUP_EXEC_PERM 0000010 #define UNIX_OTHER_READ_PERM 0000004 #define UNIX_OTHER_WRITE_PERM 0000002 #define UNIX_OTHER_EXEC_PERM 0000001 #define UNIX_RW_RW_RW 0000666 #define LZHEADER_STRAGE 4096 milkytracker-0.90.85+dfsg/src/compression/lha/slidehuf.h0000755000175000017500000000076111027666433022312 0ustar admin2admin2/* * slidehuf.h -- part of LHa for UNIX */ #ifndef __SLIDEHUF_H__ #define __SLIDEHUF_H__ #define CHAR_BIT 8 #define UCHAR_MAX 255 #define USHRT_MAX 65535 #define SHRT_MAX 32767 #define SHRT_MIN (SHRT_MAX-USHRT_MAX) /* from slide.c */ #define MAX_DICBIT 13 #define MAX_DICSIZ (1 << MAX_DICBIT) #define MATCHBIT 8 /* bits for MAXMATCH - THRESHOLD */ /* from huf.c */ #define CBIT 9 /* $\lfloor \log_2 NC \rfloor + 1$ */ #define USHRT_BIT 16 /* (CHAR_BIT * sizeof(ushort)) */ #endif milkytracker-0.90.85+dfsg/src/compression/lha/extract.inl0000755000175000017500000000213211027666433022506 0ustar admin2admin2/*********************************************************** extract.c -- extract file from archive ***********************************************************/ int CLhaArchive::decode_lzhuf(pp_uint32 &infp, pp_uint8* outfp, long original_size, long packed_size, int method) { LzInterface.method = method; LzInterface.dicbit = 13; // method + 8; LzInterface.infile = infp; LzInterface.outfile = outfp; LzInterface.original = original_size; LzInterface.packed = packed_size; #ifdef LHADEBUG Log("Decode_lzhuf: method=%d\n", method); #endif switch (method) { case 0: case 8: { int len1 = m_dwOutputLen - (int)(outfp - m_lpOutputFile); int len2 = m_dwStreamLen - infp; int len = (len1 < len2) ? len1 : len2; for (int i=0; i> bitlen */ unsigned short start[17]; /* first code of bitlen */ unsigned short total; unsigned int i; int j, k, l, m, n, avail; unsigned short *p; avail = nchar; /* initialize */ for (i = 1; i <= 16; i++) { count[i] = 0; weight[i] = 1 << (16 - i); } /* count */ for (i = 0; i < nchar; i++) count[bitlen[i]]++; /* calculate first code */ total = 0; for (i = 1; i <= 16; i++) { start[i] = total; total += weight[i] * count[i]; } if ((total & 0xffff) != 0) { return; } /* shift data for make table. */ m = 16 - tablebits; for (i = 1; i <= tablebits; i++) { start[i] >>= m; weight[i] >>= m; } /* initialize */ j = start[tablebits + 1] >> m; k = 1 << tablebits; if (j != 0) for (i = j; i < (unsigned int)k; i++) table[i] = 0; /* create table and tree */ for (j = 0; j < (int)nchar; j++) { k = bitlen[j]; if (k == 0) continue; l = start[k] + weight[k]; if (k <= (int)tablebits) { /* code in table */ for (i = start[k]; i < (unsigned int)l; i++) table[i] = j; } else { /* code not in table */ p = &table[(i = start[k]) >> m]; i <<= tablebits; n = k - tablebits; /* make tree (n length) */ while (--n >= 0) { if (*p == 0) { right[avail] = left[avail] = 0; *p = avail++; } if (i & 0x8000) p = &right[*p]; else p = &left[*p]; i <<= 1; } *p = j; } start[k] = l; } } milkytracker-0.90.85+dfsg/src/compression/lha/unlha.cpp0000755000175000017500000001032011172415322022127 0ustar admin2admin2#include "unlha32.h" #include "lharc.h" #undef CHAR_BIT #undef UCHAR_MAX #undef USHRT_MAX #undef SHRT_MAX #undef SHRT_MIN #include "slidehuf.h" #include "header.inl" #include "lhext.inl" #include "extract.inl" #include "slide.inl" #include "maketbl.inl" #include "dhuf.inl" #include "huf.inl" #include "shuf.inl" #include "larc.inl" CLhaArchive::CLhaArchive(/*pp_uint8* lpStream*/StreamerBase& streamer, pp_uint32 dwMemLength, IDNotifier* notifier) : m_lpStream(streamer), m_notifier(notifier) //--------------------------------------------------------------------------------- { // File Read //m_lpStream = lpStream; m_dwStreamLen = dwMemLength; m_dwStreamPos = 0; // File Write m_lpOutputFile = 0; m_dwOutputLen = 0; m_pDecoderData = NULL; } CLhaArchive::~CLhaArchive() //------------------------- { if (m_lpOutputFile) { delete[] m_lpOutputFile; m_lpOutputFile = NULL; } if (m_pDecoderData) { delete[] m_pDecoderData; m_pDecoderData = NULL; } } bool CLhaArchive::IsArchive() //--------------------------- { LzHeader hdr; pp_uint32 pos = 0; if (!get_header(pos, &hdr)) return false; #ifdef LHADEBUG Log("LHA Archive\n"); #endif return true; } bool CLhaArchive::ExtractFile() //----------------------------- { LzHeader hdr; //if (!m_lpStream) return false; if (!m_pDecoderData) { m_pDecoderData = new pp_uint8[65536]; // 64K of data - should be enough if (!m_pDecoderData) return false; } // Init misc tables InitDecodeTables(); InitHufTables(); make_crctable(); // extract each files while (get_header(m_dwStreamPos, &hdr)) { #ifdef LHADEBUG Log("%d bytes packed in %s\n", hdr.packed_size, hdr.name); #endif blocksize = 0; long pos = m_dwStreamPos; extract_one(m_dwStreamPos, &hdr); if (m_notifier && m_lpOutputFile && m_dwOutputLen) { if (m_notifier->identify(m_lpOutputFile, m_dwOutputLen)) break; } m_dwStreamPos = pos + hdr.packed_size; } #ifdef LHADEBUG if (m_lpOutputFile) { Log("%d bytes extracted\n", m_dwOutputLen); } #endif return (m_lpOutputFile) ? true : false; } int CLhaArchive::lharead(void *p, int sz1, int sz2, pp_uint32 &fp) //------------------------------------------------------------ { int sz = sz1 * sz2; int bytesavailable = m_dwStreamLen - fp; if (sz > bytesavailable) sz = bytesavailable; if ((sz <= 0) || (!p) /*|| (!m_lpStream)*/) return 0; //memcpy(p, m_lpStream + fp, sz); m_lpStream.read(p, fp, sz); fp += sz; return sz; } #define CRCPOLY 0xA001 // CRC-16 #define UPDATE_CRC(c) \ crc = crctable[(crc ^ (c)) & 0xFF] ^ (crc >> CHAR_BIT) void CLhaArchive::make_crctable() //------------------------------- { for (unsigned int i = 0; i < 256; i++) { unsigned int r = i; for (unsigned int j = 0; j < CHAR_BIT; j++) if (r & 1) r = (r >> 1) ^ CRCPOLY; else r >>= 1; crctable[i] = r; } } unsigned short CLhaArchive::calccrc(unsigned char *p , int n) //----------------------------------------------------------- { while (n-- > 0) UPDATE_CRC(*p++); return crc; } void CLhaArchive::fwrite_crc(unsigned char *p, int n, pp_uint8* &fp) //--------------------------------------------------------------- { #ifdef LHADEBUG Log("Writing %d bytes", n); #endif calccrc(p, n); if (fp) { int len = m_dwOutputLen - (int)(fp - m_lpOutputFile); if (n > len) n = len; for (int i=0; i bitcount) { n -= bitcount; bitbuf = (bitbuf << bitcount) + (subbitbuf >> (CHAR_BIT - bitcount)); subbitbuf = 0; if (compsize != 0) { compsize--; if (LzInterface.infile < m_dwStreamLen) subbitbuf = (unsigned char)m_lpStream[LzInterface.infile++]; } bitcount = CHAR_BIT; } bitcount -= n; bitbuf = (bitbuf << n) + (subbitbuf >> (CHAR_BIT - n)); subbitbuf <<= n; } void CLhaArchive::init_getbits() //------------------------------ { bitbuf = 0; subbitbuf = 0; bitcount = 0; fillbuf(2 * CHAR_BIT); } unsigned short CLhaArchive::getbits(unsigned int n) //------------------------------------------------- { unsigned short x; n &= 0xff; x = bitbuf >> (2 * CHAR_BIT - n); fillbuf(n); return x; } milkytracker-0.90.85+dfsg/src/compression/lha/lhext.inl0000755000175000017500000000350011027666433022160 0ustar admin2admin2/*----------------------------------------------------------------------*/ /* LHarc Extract Command */ /* This is part of LHarc UNIX Archiver Driver */ /* */ /* Copyright(C) MCMLXXXIX Yooichi.Tagawa */ /* */ /* V0.00 Original 1988.05.23 Y.Tagawa */ /* V1.00 Fixed 1989.09.22 Y.Tagawa */ /* V0.03 LHa for UNIX 1991.12.17 M.Oki */ /*----------------------------------------------------------------------*/ pp_uint8* CLhaArchive::open_with_make_path(const char *, int size) //------------------------------------------------------------- { if (m_lpOutputFile) { if (size < (int)m_dwOutputLen) return NULL; delete[] m_lpOutputFile; m_dwOutputLen = 0; m_lpOutputFile = NULL; } m_dwOutputLen = size; m_lpOutputFile = new pp_uint8[size]; return m_lpOutputFile; } const char *methods[10] = { "-lh0-", "-lh1-", "-lh2-", "-lh3-", "-lh4-", "-lh5-", "-lzs-", "-lz5-", "-lz4-", NULL }; void CLhaArchive::extract_one(pp_uint32 &afp, LzHeader *hdr) //------------------------------------------------------ { pp_uint8* fp; // output file int method; if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_REGULAR) { for (method = 0; ; method++) { if (methods[method] == NULL) { #ifdef LHADEBUG CHAR s[6]; memcpy(s, hdr->method, 5); s[5] = 0; Log("Unknown method skipped (%s)...\n", s); #endif return; } if (!strncmp(hdr->method, methods[method], 5)) break; } if ((fp = open_with_make_path(hdr->name, hdr->original_size)) != NULL) { int crc = decode_lzhuf(afp, fp, hdr->original_size, hdr->packed_size, method); if (hdr->has_crc && crc != hdr->crc) { #ifdef LHADEBUG Log("CRC error\n"); #endif } } } #ifdef LHADEBUG else { Log("Nothing to do for %s\n", hdr->name); } #endif } milkytracker-0.90.85+dfsg/src/compression/DecompressorLHA.h0000755000175000017500000000315011172163710022717 0ustar admin2admin2/* * compression/DecompressorLHA.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorLHA.h * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #ifndef __DECOMPRESSOR_LHA_H__ #define __DECOMPRESSOR_LHA_H__ #include "Decompressor.h" /***************************************************************************** * LHA decompressor *****************************************************************************/ class DecompressorLHA : public DecompressorBase { public: DecompressorLHA(const PPSystemString& filename); virtual bool identify(XMFile& f); // this type of archive only contain modules virtual bool doesServeHint(Hints hint) { return (hint == HintAll || hint == HintModules); } virtual const PPSimpleVector& getDescriptors(Hints hint) const; virtual bool decompress(const PPSystemString& outFilename, Hints hint); virtual DecompressorBase* clone(); }; #endif milkytracker-0.90.85+dfsg/src/compression/AIFFWriter.h0000755000175000017500000001433011027457602021636 0ustar admin2admin2/* File: AIFFWriter.h Author: QuickTime DTS Change History (most recent first): <1> 11/10/05 initial release © Copyright 2005 - 2006 Apple Computer, Inc. All rights reserved. IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple's copyrights in this original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #import #import #import #import // maximum size in frames of the MovieAudioExtractionFillBuffer calls #define kMaxExtractionPacketCount 4096 // this object is busy exporting error code #define kObjectInUseErr 1000 // constants for shouldContinueOperation delegate method typedef enum { AIFFWriterExportBegin = 0, AIFFWriterExportPercent = 10, AIFFWriterExportEnd = 20 } AIFFWriterExportOperationPhase; // ProgressInfo object passed back to the delegate // if it implements shouldContinueOperationWithProgressInfo: // progressValue will contain a valid NSNumber object with a // value between 0 and 1.0 when phase is AIFFWriterExportPercent @interface AIFFWriterProgressInfo : NSObject { @private AIFFWriterExportOperationPhase phase; // one of the state enums NSNumber *progressValue; // value is between 0 and 1.0 valid only for AIFFWriterExportPercent phase NSError *exportStatus; } - (AIFFWriterExportOperationPhase)phase; - (NSNumber *)progressValue; - (NSError *)exportStatus; @end // invoked on a delegate to provide progress @interface NSObject (AIFFWriterExportDelegate) - (BOOL)shouldContinueOperationWithProgressInfo:(id)inProgressInfo; @end // AIFFWriter object // A single instance of this object can be used to extract audio // from a QuickTime movie (via a QTKit Movie object) and will write // an AIFF file preserving the audio layout from the Movie @interface AIFFWriter : NSObject { @private NSString *mFileName; // file name for the new .aiff file FSRef mFileRef; // file reference for this file FSRef mParentRef; QTMovie *mQTMovie; // movie to extract audio from Float64 mMovieDuration; // movie duration Movie mCloneMovie; // copy of the source movie for thread migration MovieAudioExtractionRef mAudioExtractionSession; // QT Audio Extraction Session Reference BOOL mExtractionComplete; // are we done yet? BOOL mIsExporting; // is the object busy SInt64 mLocationInFile; // location to write new data SInt64 mSamplesRemaining; // how much more do we need to pull from the source? SInt64 mSamplesCompleated; // hom much have we done - used to drive progress UI SInt64 mTotalNumberOfSamples; // total number of samples to extract AudioStreamBasicDescription mSourceASBD; // audio stream basic description of the source movie AudioStreamBasicDescription mOutputASBD; // the asbd we're asking for AudioChannelLayout * mExtractionLayoutPtr; // the audio channel layout of the source UInt32 mExtractionLayoutSize; // the size of the audio chanel layout AudioFileID mExportFileID; // file identifier for the new .aiff file NSLock * mLock; // lock protecting reentrance AIFFWriterProgressInfo * mProgressInfo; // progress info object passed to the progress callback id mDelegate; // a delegate object to call with progress info... BOOL mDelegateShouldContinueOp; // ...but only if it actually implemented the callback } - (OSStatus)exportFromMovie:(QTMovie *)inMovie toFile:(NSString *)inFullPath; - (BOOL)isExporting; @end // the client of AIFFWriter should set itself as a delegate if it // wants to handle shouldContinueOperationWithProgressInfo @interface AIFFWriter (AIFFWriterDelegate) - (id)delegate; - (void)setDelegate:(id)delegate; @end milkytracker-0.90.85+dfsg/src/compression/Makefile.am0000644000175000017500000000206111254507623021613 0ustar admin2admin2SUBDIRS = zziplib/generic noinst_LIBRARIES = libcompression.a libcompression_a_SOURCES = PP20.cpp ZipExtractor.cpp zziplib/MyIO.cpp \ Decompressor.cpp DecompressorUMX.cpp DecompressorPP20.cpp lha/unlha.cpp \ DecompressorZIP.cpp DecompressorLHA.cpp DecompressorGZIP.cpp \ DecompressorLZX.cpp unlzx.cpp noinst_HEADERS = PP20.h ZipExtractor.h zziplib/MyIO.h DecompressorLHA.h \ DecompressorUMX.h DecompressorGZIP.h AIFFWriter.h Decompressor.h \ DecompressorPP20.h DecompressorQT.h lha/lharc.h DecompressorZIP.h \ DecompressorLZX.h unlzx.h \ lha/dhuf.inl lha/extract.inl lha/header.inl lha/huf.inl lha/larc.inl \ lha/lharc.h lha/lhext.inl lha/maketbl.inl lha/shuf.inl lha/slidehuf.h \ lha/slide.inl lha/unlha32.h EXTRA_DIST = DecompressorQT.mm AIFFWriter.m INCLUDES = -I$(top_srcdir)/src/milkyplay -I$(top_srcdir)/src/ppui \ -I$(top_srcdir)/src/ppui/osinterface/posix/ \ -I$(top_srcdir)/src/compression/lha -I$(top_srcdir)/src/compression/zziplib/ \ -I$(top_srcdir)/src/compression/zziplib/generic #INCLUDES = -I../ppui -I../ppui/osinterface -I../ppui/osinterface/posix milkytracker-0.90.85+dfsg/src/compression/DecompressorGZIP.cpp0000755000175000017500000000447611172163710023433 0ustar admin2admin2/* * compression/DecompressorGZIP.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorGZIP.cpp * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #include "DecompressorGZIP.h" #include "XMFile.h" #include "LittleEndian.h" #include "zlib.h" // -- GZIP -------------------------------------------------------------------- DecompressorGZIP::DecompressorGZIP(const PPSystemString& fileName) : DecompressorBase(fileName) { } bool DecompressorGZIP::identify(XMFile& f) { f.seek(0); mp_dword id = f.readDword(); // GZIP ID return (id == 0x08088B1F); } const PPSimpleVector& DecompressorGZIP::getDescriptors(Hints hint) const { descriptors.clear(); descriptors.add(new Descriptor("gz", "GZIP Archive")); return descriptors; } bool DecompressorGZIP::decompress(const PPSystemString& outFileName, Hints hint) { gzFile *gz_input_file = NULL; int len = 0; pp_uint8 *buf; if ((gz_input_file = (void **)gzopen (fileName.getStrBuffer(), "r")) == NULL) return false; if ((buf = new pp_uint8[0x10000]) == NULL) return false; XMFile fOut(outFileName, true); while (true) { len = gzread (gz_input_file, buf, 0x10000); if (len < 0) { delete[] buf; return false; } if (len == 0) break; fOut.write(buf, 1, len); } if (gzclose (gz_input_file) != Z_OK) { delete[] buf; return false; } delete[] buf; return true; } DecompressorBase* DecompressorGZIP::clone() { return new DecompressorGZIP(fileName); } static Decompressor::RegisterDecompressor registerDecompressor; milkytracker-0.90.85+dfsg/src/compression/DecompressorLZX.h0000755000175000017500000000315011172163710022770 0ustar admin2admin2/* * compression/DecompressorLZX.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorLZX.h * milkytracker_universal * * Created by Peter Barth on 17.04.09. * */ #ifndef __DECOMPRESSOR_LZX_H__ #define __DECOMPRESSOR_LZX_H__ #include "Decompressor.h" /***************************************************************************** * LZX decompressor *****************************************************************************/ class DecompressorLZX : public DecompressorBase { public: DecompressorLZX(const PPSystemString& filename); virtual bool identify(XMFile& f); // this type of archive only contain modules virtual bool doesServeHint(Hints hint) { return (hint == HintAll || hint == HintModules); } virtual const PPSimpleVector& getDescriptors(Hints hint) const; virtual bool decompress(const PPSystemString& outFilename, Hints hint); virtual DecompressorBase* clone(); }; #endif milkytracker-0.90.85+dfsg/src/compression/ZipExtractor.cpp0000644000175000017500000001056611172163710022724 0ustar admin2admin2/* * compression/ZipExtractor.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ZipExtractor.cpp * milkytracker_universal * * Created by Peter Barth on 31.01.07. * */ #ifdef VERBOSE #include #endif #include "ZipExtractor.h" #include "XModule.h" #include "XMFile.h" #include "MyIO.h" #include "zzip_lib.h" ZipExtractor::ZipExtractor(const PPSystemString& archivePath) : archivePath(archivePath) { } bool ZipExtractor::parseZip(pp_int32& err, bool extract, const PPSystemString* outFile) { int i; __zzipfd fd; ZZIP_DIR * dir; zzip_error_t rv; #ifdef VERBOSE printf("Opening zip file `%s'... ", (const char*)archivePath); #endif { const SYSCHAR* fileName = archivePath; fd = Myopen((const zzip_char_t*)fileName, O_RDONLY); if (fd == (__zzipfd)-1) { err = 1; return false; } if (! (dir = zzip_dir_fdopen(fd, &rv))) { err = 2; return false; } } #ifdef VERBOSE printf("OK.\n"); printf("{check...\n"); #endif { struct zzip_dir_hdr * hdr = dir->hdr0; if (hdr == NULL) { #ifdef VERBOSE printf ("could not find first header in dir_hdr"); #endif err = 3; zzip_dir_close(dir); return false; } else { while (1) { #ifdef VERBOSE printf("\ncompression method: %d", hdr->d_compr); if (hdr->d_compr == 0) printf(" (stored)"); else if (hdr->d_compr == 8) printf(" (deflated)"); else printf(" (unknown)"); printf("\ncrc32: %x\n", hdr->d_crc32); printf("compressed size: %d\n", hdr->d_csize); printf("uncompressed size: %d\n", hdr->d_usize); printf("offset of file in archive: %d\n", hdr->d_off); printf("filename: %s\n\n", hdr->d_name); #endif { ZZIP_FILE *fp; mp_ubyte* buf = new mp_ubyte[16384]; if (buf == NULL) { err = 6; zzip_dir_close(dir); return false; } memset(buf, 0, 16384); const char *name = hdr->d_name; #ifdef VERBOSE printf("Opening file `%s' in zip archive... ", name); #endif fp = zzip_file_open(dir, (char *)name, ZZIP_CASEINSENSITIVE); if (! fp) { #ifdef VERBOSE printf("error %d: %s\n", zzip_error(dir), zzip_strerror_of(dir)); #endif err = 7; delete[] buf; zzip_dir_close(dir); return false; } else { #ifdef VERBOSE printf("OK.\n"); printf("Contents of the file:\n"); #endif i = zzip_file_read(fp, (char*)buf, 16384); const char* id = XModule::identifyModule(buf); if (id) { if (extract) { XMFile f(*outFile, true); f.write(buf, 1, i); while (0 < (i = zzip_file_read(fp, (char*)buf, 16384))) { f.write(buf, 1, i); } if (i < 0) { #ifdef VERBOSE printf("error %d\n", zzip_error(dir)); #endif err = 4; delete[] buf; zzip_file_close(fp); zzip_dir_close(dir); return false; } } delete[] buf; err = 0; zzip_file_close(fp); zzip_dir_close(dir); return true; } zzip_file_close(fp); } delete[] buf; } if (hdr->d_reclen == 0) break; char* temp = (char*)hdr; temp+=hdr->d_reclen; hdr = (zzip_dir_hdr*)temp; //(char *)hdr += hdr->d_reclen; } } } #ifdef VERBOSE printf ("\n}\n"); #endif zzip_dir_close(dir); err = 5; return false; } milkytracker-0.90.85+dfsg/src/compression/PP20.h0000644000175000017500000000455610737746457020443 0ustar admin2admin2/* ppcrack 0.1 - decrypts PowerPacker encrypted data files with brute force * by Stuart Caie , this software is in the Public Domain * * The whole keyspace is scanned, unless you supply the -key argument, where * that key (in hexadecimal) to key FFFFFFFF is scanned. * * Anything which decrypts then decrunches to valid data is saved to disk * as . * * As a bonus, if any file is a PowerPacker data file, but not encrypted, * it will be decrunched anyway, and saved as .decrunched * * - changed to work with UADE (mld) * Thanks to Kyzer for help and support. */ /* Code from Heikki Orsila's amigadepack 0.02 to replace previous * PowerPack depacker with license issues. * * You'll probably want to use ppcrack stand-alone to crack encrypted * powerpack files once instead of using brute force at each replay. * * $Id: ppdepack.c,v 1.2 2007/10/08 16:38:29 cmatsuoka Exp $ * * Modified for xmp by Claudio Matsuoka, 08/2007 * - merged mld's checks from the old depack sources. Original credits: * - corrupt file and data detection * (thanks to Don Adan and Dirk Stoecker for help and infos) * - implemeted "efficiency" checks * - further detection based on code by Georg Hoermann */ /* changed into class to work with milkytracker */ #ifndef __PP20_H__ #define __PP20_H__ #include "BasicTypes.h" class PP20 { public: PP20(); bool isCompressed(const void* source, const pp_uint32 size); // If successful, allocates a new buffer containing the // uncompresse data and returns the uncompressed length. // Else, returns 0. pp_uint32 decompress(const void* source, pp_uint32 size, pp_uint8** destRef); private: bool checkEfficiency(const void* source); pp_int32 ppDecrunch(pp_uint8 *src, pp_uint8 *dest, pp_uint8 *offset_lens, pp_uint32 src_len, pp_uint32 dest_len, pp_uint8 skip_bits); pp_int32 ppValidate(pp_uint8 *src, pp_uint8 *offset_lens, pp_uint32 src_len, pp_uint32 dest_len, pp_uint8 skip_bits); pp_int32 ppcrack(pp_uint8** destRef, pp_uint8 *data, pp_uint32 len); pp_int32 ppdepack(pp_uint8 *src, pp_uint32 s, pp_uint8** destRef); static const char* PP_ID; pp_uint8 efficiency[4]; bool globalError; // exception-free version of code pp_uint32 key_start; }; #endif /* PP_DECOMPRESSOR_H */ milkytracker-0.90.85+dfsg/src/compression/DecompressorQT.h0000755000175000017500000000346511172163710022650 0ustar admin2admin2/* * compression/DecompressorQT.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorQT.h * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #ifndef __DECOMPRESSOR_QT_H__ #define __DECOMPRESSOR_QT_H__ #include "Decompressor.h" /***************************************************************************** * QT decompressor * This class uses QTKit to extract the audio from quicktime media content * to an uncompressed 16 bit AIFF file which MilkyTracker can read directly. * Note: QTKit is only available on OS X 10.4 and later. *****************************************************************************/ class DecompressorQT : public DecompressorBase { public: DecompressorQT(const PPSystemString& filename); virtual bool identify(XMFile& f); // this type of archive can only contain samples virtual bool doesServeHint(Hints hint) { return (hint == HintAll || hint == HintSamples); } virtual const PPSimpleVector& getDescriptors(Hints hint) const; virtual bool decompress(const PPSystemString& outFilename, Hints hint); virtual DecompressorBase* clone(); }; #endif milkytracker-0.90.85+dfsg/src/compression/unlzx.cpp0000755000175000017500000010451511174147337021460 0ustar admin2admin2/* ** LZX Extract in (supposedly) portable C. ** ** Based on unlzx 1.0 by David Tritscher. ** Rewritten by Oliver Gantert ** ** Compiled with vbcc/Amiga and lcc/Win32 */ #include "unlzx.h" #include "XMFile.h" #if !defined(_WIN32_WCE) #include #endif #ifdef AMIGA static unsigned char *version_string = "$VER: UnLZX " UNLZX_VERSION " (" UNLZX_VERDATE ")"; #endif /* AMIGA */ const unsigned char *month_str[16] = { (unsigned char*)"jan", (unsigned char*)"feb", (unsigned char*)"mar", (unsigned char*)"apr", (unsigned char*)"may", (unsigned char*)"jun", (unsigned char*)"jul", (unsigned char*)"aug", (unsigned char*)"sep", (unsigned char*)"oct", (unsigned char*)"nov", (unsigned char*)"dec", (unsigned char*)"?13", (unsigned char*)"?14", (unsigned char*)"?15", (unsigned char*)"?16" }; const unsigned long crc_table[256] = { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; const unsigned char table_one[32] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e }; const unsigned long table_two[32]= { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384,24576,32768,49152 }; const unsigned long table_three[16]= { 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383,32767 }; const unsigned char table_four[34]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; /* -------------------------------------------------------------------------- */ void Unlzx::mkdir(const char* name, int len) { } struct Unlzx::UnLZX *Unlzx::unlzx_init(void) { struct UnLZX *unlzx = NULL; if (unlzx = (struct UnLZX *)malloc(sizeof(struct UnLZX))) { memset(unlzx, 0, sizeof(struct UnLZX)); unlzx->match_pattern[0] = '*'; } return(unlzx); } void Unlzx::unlzx_free(struct UnLZX *unlzx) { if (unlzx) { free(unlzx); } } int Unlzx::pmatch(const char *mask, const char *name) { int calls = 0, wild = 0, q = 0; const char * m = mask, * n = name, * ma = mask, * na = name; for(;;) { if (++calls > PMATCH_MAXSTRLEN) return(1); if (*m == '*') { while (*m == '*') ++m; wild = 1; ma = m; na = n; } if (!*m) { if (!*n) return(0); for (--m; (m > mask) && (*m == '?'); --m); if ((*m == '*') && (m > mask) && (m[-1] != '\\')) return(0); if (!wild) return(1); m = ma; } else if (!*n) { while(*m == '*') ++m; return(*m != 0); } if ((*m == '\\') && ((m[1] == '*') || (m[1] == '?'))) { ++m; q = 1; } else { q = 0; } if ((tolower(*m) != tolower(*n)) && ((*m != '?') || q)) { if (!wild) return(1); m = ma; n = ++na; } else { if (*m) ++m; if (*n) ++n; } } } void Unlzx::just_wait(void) { /* Under certain conditions UnLZX needs to wait some cycles for disk access to finish. This only seems to happen on fast CPUs, but it doesn't hurt anyway... */ } unsigned long Unlzx::argopt(unsigned char * ao_strg, unsigned long ao_argc, unsigned char **ao_argv) { while(ao_argc > 1) { if (!strcmp((char*)ao_strg, (char*)ao_argv[ao_argc - 1])) return(ao_argc - 1); ao_argc--; } return(0); } void Unlzx::crc_calc(unsigned char *memory, unsigned long length, struct UnLZX *unlzx) { unsigned long temp; if (length) { temp = ~unlzx->sum; do { temp = crc_table[(*memory++ ^ temp) & 255] ^ (temp >> 8); } while(--length); unlzx->sum = ~temp; } } signed long Unlzx::make_decode_table(signed long number_symbols, signed long table_size, unsigned char *length, unsigned short *table) { unsigned char bit_num = 0; signed long symbol, abort = 0; unsigned long leaf, table_mask, bit_mask, pos, fill, next_symbol, reverse; pos = 0; table_mask = 1 << table_size; bit_mask = table_mask >> 1; bit_num++; while ((!abort) && (bit_num <= table_size)) { for (symbol = 0; symbol < number_symbols; symbol++) { if (length[symbol] == bit_num) { reverse = pos; leaf = 0; fill = table_size; do { leaf = (leaf << 1)+(reverse & 1); reverse >>= 1; } while (--fill); if ((pos += bit_mask) > table_mask) { abort = 1; break; } fill = bit_mask; next_symbol = 1 << bit_num; do { table[leaf] = (unsigned short)symbol; leaf += next_symbol; } while (--fill); } } bit_mask >>= 1; bit_num++; } if ((!abort) && (pos != table_mask)) { for (symbol = pos; symbol < (signed)table_mask; symbol++) { reverse = symbol; leaf = 0; fill = table_size; do { leaf = (leaf << 1)+(reverse & 1); reverse >>= 1; } while (--fill); table[leaf] = 0; } next_symbol = table_mask >> 1; pos <<= 16; table_mask <<= 16; bit_mask = 32768; while((!abort) && (bit_num <= 16)) { for(symbol = 0; symbol < number_symbols; symbol++) { if (length[symbol] == bit_num) { reverse = pos >> 16; leaf = 0; fill = table_size; do { leaf = (leaf << 1)+(reverse & 1); reverse >>= 1; } while (--fill); for (fill = 0; fill < (unsigned)(bit_num - table_size); fill++) { if (!table[leaf]) { table[(next_symbol << 1)] = 0; table[(next_symbol << 1) + 1] = 0; table[leaf] = (unsigned short)(next_symbol++); } leaf = (unsigned short)(table[leaf] << 1); leaf += (pos >> (15 - fill)) & 1; } table[leaf] = (unsigned short)symbol; if ((pos += bit_mask) > table_mask) { abort = 1; break; } } } bit_mask >>= 1; bit_num++; } } if (pos != table_mask) abort = 1; return(abort); } signed long Unlzx::read_literal_table(struct UnLZX *unlzx) { signed long shift = unlzx->global_shift, abort = 0; unsigned long control = unlzx->global_control, temp, symbol, pos, count, fix, max_symbol; if (shift < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } unlzx->decrunch_method = control & 7; control >>= 3; if ((shift -= 3) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } if ((!abort) && (unlzx->decrunch_method == 3)) { for (temp = 0; temp < 8; temp++) { unlzx->offset_len[temp] = (unsigned char)(control & 7); control >>= 3; if ((shift -= 3) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } } abort = make_decode_table(8, 7, unlzx->offset_len, unlzx->offset_table); } if (!abort) { unlzx->decrunch_length = (control & 255) << 16; control >>= 8; if ((shift -= 8) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } unlzx->decrunch_length += (control & 255) << 8; control >>= 8; if ((shift -= 8) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } unlzx->decrunch_length += (control & 255); control >>= 8; if ((shift -= 8) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } } if ((!abort) && (unlzx->decrunch_method != 1)) { pos = 0; fix = 1; max_symbol = 256; do { for (temp = 0; temp < 20; temp++) { unlzx->huffman20_len[temp] = (unsigned char)(control & 15); control >>= 4; if ((shift -= 4) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } } if (abort = make_decode_table(20, 6, unlzx->huffman20_len, unlzx->huffman20_table)) break; do { if ((symbol = unlzx->huffman20_table[control & 63]) >= 20) { do { symbol = unlzx->huffman20_table[((control >> 6) & 1) + (symbol << 1)]; if (!shift--) { shift += 16; control += *unlzx->source++ << 24; control += *unlzx->source++ << 16; } control >>= 1; } while(symbol >= 20); temp = 6; } else { temp = unlzx->huffman20_len[symbol]; } control >>= temp; if ((shift -= temp) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } switch(symbol) { case 17: case 18: if(symbol == 17) { temp = 4; count = 3; } else { temp = 6 - fix; count = 19; } count += (control & table_three[temp]) + fix; control >>= temp; if ((shift -= temp) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } while ((pos < max_symbol) && (count--)) unlzx->literal_len[pos++] = 0; break; case 19: count = (control & 1) + 3 + fix; if (!shift--) { shift += 16; control += *unlzx->source++ << 24; control += *unlzx->source++ << 16; } control >>= 1; if ((symbol = unlzx->huffman20_table[control & 63]) >= 20) { do { symbol = unlzx->huffman20_table[((control >> 6) & 1) + (symbol << 1)]; if (!shift--) { shift += 16; control += *unlzx->source++ << 24; control += *unlzx->source++ << 16; } control >>= 1; } while(symbol >= 20); temp = 6; } else { temp = unlzx->huffman20_len[symbol]; } control >>= temp; if ((shift -= temp) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } symbol = table_four[unlzx->literal_len[pos] + 17 - symbol]; while ((pos < max_symbol) && (count--)) unlzx->literal_len[pos++] = (unsigned char)symbol; break; default: symbol = table_four[unlzx->literal_len[pos] + 17 - symbol]; unlzx->literal_len[pos++] = (unsigned char)symbol; break; } } while(pos < max_symbol); fix--; max_symbol += 512; } while(max_symbol == 768); if(!abort) abort = make_decode_table(768, 12, unlzx->literal_len, unlzx->literal_table); } unlzx->global_control = control; unlzx->global_shift = shift; return(abort); } void Unlzx::decrunch(struct UnLZX *unlzx) { unsigned long control = unlzx->global_control, temp, symbol, count; signed long shift = unlzx->global_shift; unsigned char *string; do { if ((symbol = unlzx->literal_table[control & 4095]) >= 768) { control >>= 12; if ((shift -= 12) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } do { symbol = unlzx->literal_table[(control & 1) + (symbol << 1)]; if (!shift--) { shift += 16; control += *unlzx->source++ << 24; control += *unlzx->source++ << 16; } control >>= 1; } while(symbol >= 768); } else { temp = unlzx->literal_len[symbol]; control >>= temp; if ((shift -= temp) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } } if (symbol < 256) { *unlzx->destination++ = (unsigned char)symbol; } else { symbol -= 256; count = table_two[temp = symbol & 31]; temp = table_one[temp]; if ((temp >= 3) && (unlzx->decrunch_method == 3)) { temp -= 3; count += ((control & table_three[temp]) << 3); control >>= temp; if ((shift -= temp) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } count += (temp = unlzx->offset_table[control & 127]); temp = unlzx->offset_len[temp]; } else { count += control & table_three[temp]; if (!count) count = unlzx->last_offset; } control >>= temp; if ((shift -= temp) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } unlzx->last_offset = count; count = table_two[temp = (symbol >> 5) & 15] + 3; temp = table_one[temp]; count += (control & table_three[temp]); control >>= temp; if ((shift -= temp) < 0) { shift += 16; control += *unlzx->source++ << (8 + shift); control += *unlzx->source++ << shift; } string = (unlzx->decrunch_buffer + unlzx->last_offset < unlzx->destination) ? unlzx->destination - unlzx->last_offset : unlzx->destination + 65536 - unlzx->last_offset; do { *unlzx->destination++ = *string++; } while(--count); } } while((unlzx->destination < unlzx->destination_end) && (unlzx->source < unlzx->source_end)); unlzx->global_control = control; unlzx->global_shift = shift; } XMFile* Unlzx::open_output(const PPSystemString& filename) { XMFile *file = new XMFile(filename, true); if (!file->isOpenForWriting()) return NULL; return(file); } signed long Unlzx::extract_normal(XMFile* in_file, struct UnLZX *unlzx, bool& found) { found = false; struct filename_node *node; XMFile *out_file = NULL; unsigned char *pos, *temp; unsigned long count; signed long abort = 0; unlzx->global_control = 0; unlzx->global_shift = -16; unlzx->last_offset = 1; unlzx->unpack_size = 0; unlzx->decrunch_length = 0; for(count = 0; count < 8; count++) unlzx->offset_len[count] = 0; for(count = 0; count < 768; count ++) unlzx->literal_len[count] = 0; unlzx->source_end = (unlzx->source = unlzx->read_buffer + 16384) - 1024; pos = unlzx->destination_end = unlzx->destination = unlzx->decrunch_buffer + 65794; for (node = unlzx->filename_list; (!abort) && node; node = node->next) { unlzx->sum = 0; if (unlzx->use_outdir) { strcpy((char*)unlzx->work_buffer, (char*)unlzx->output_dir); strcat((char*)unlzx->work_buffer, (char*)node->filename); } else { strcpy((char*)unlzx->work_buffer, (char*)node->filename); } fflush(stdout); if (!pmatch((char*)unlzx->match_pattern, (char*)node->filename)) { #ifdef UNLZX_DEBUG printf("Extracting \"%s\"...", (char *)node->filename); #endif out_file = unlzx->temporaryFile ? open_output(*(unlzx->temporaryFile)) : open_output(PPSystemString((const char*)unlzx->work_buffer)); } else { out_file = NULL; } unlzx->unpack_size = node->length; while(unlzx->unpack_size > 0) { if (pos == unlzx->destination) { if(unlzx->source >= unlzx->source_end) { temp = unlzx->read_buffer; if (count = temp - unlzx->source + 16384) { do { *temp++ = *unlzx->source++; } while(--count); } unlzx->source = unlzx->read_buffer; count = unlzx->source - temp + 16384; if (unlzx->pack_size < count) count = unlzx->pack_size; if (in_file->read(temp, 1, count) != count) { #ifdef UNLZX_DEBUG printf("\n"); if (ferror(in_file)) { perror("FRead(Data)"); } else { fprintf(stderr, "EOF: Data\n"); } #endif abort = 1; break; } unlzx->pack_size -= count; temp += count; if (unlzx->source >= temp) break; } if (unlzx->decrunch_length <= 0) { if (read_literal_table(unlzx)) break; } if (unlzx->destination >= unlzx->decrunch_buffer + 65794) { if (count = unlzx->destination - unlzx->decrunch_buffer - 65536) { temp = (unlzx->destination = unlzx->decrunch_buffer) + 65536; do { *unlzx->destination++ = *temp++; } while(--count); } pos = unlzx->destination; } unlzx->destination_end = unlzx->destination + unlzx->decrunch_length; if(unlzx->destination_end > unlzx->decrunch_buffer + 65794) unlzx->destination_end = unlzx->decrunch_buffer + 65794; temp = unlzx->destination; decrunch(unlzx); unlzx->decrunch_length -= (unlzx->destination - temp); } count = unlzx->destination - pos; if (count > unlzx->unpack_size) count = unlzx->unpack_size; crc_calc(pos, count, unlzx); if (out_file) { if (out_file->write(pos, 1, count) != count) { #ifdef UNLZX_DEBUG perror("FWrite"); #endif delete out_file; out_file = 0; } } unlzx->unpack_size -= count; pos += count; } if (out_file) { PPSystemString fileName = out_file->getFileName(); delete out_file; if (!abort) { #ifdef UNLZX_DEBUG printf(" crc %s\n", (char *)((node->crc == unlzx->sum) ? "good" : "bad")); #endif if (identificator) found = identificator->identify(fileName); } } } return(abort); } signed long Unlzx::extract_store(XMFile* in_file, struct UnLZX *unlzx, bool& found) { struct filename_node *node; XMFile *out_file = NULL; unsigned long count; signed long abort = 0; for (node = unlzx->filename_list; (!abort) && (node); node = node->next) { unlzx->sum = 0; if (unlzx->use_outdir) { strcpy((char*)unlzx->work_buffer, (char*)unlzx->output_dir); strcat((char*)unlzx->work_buffer, (char*)node->filename); } else { strcpy((char*)unlzx->work_buffer, (char*)node->filename); } fflush(stdout); if (!pmatch((char*)unlzx->match_pattern, (char*)node->filename)) { #ifdef UNLZX_DEBUG printf("Storing \"%s\"...", (char *)node->filename); #endif out_file = unlzx->temporaryFile ? open_output(*(unlzx->temporaryFile)) : open_output(PPSystemString((const char*)unlzx->work_buffer)); } else { out_file = 0; } unlzx->unpack_size = node->length; if (unlzx->unpack_size > unlzx->pack_size) unlzx->unpack_size = unlzx->pack_size; while (unlzx->unpack_size > 0) { count = (unlzx->unpack_size > 16384) ? 16384 : unlzx->unpack_size; if (in_file->read(unlzx->read_buffer, 1, count) != count) { #ifdef UNLZX_DEBUG printf("\n"); if (ferror(in_file)) { perror("FRead(Data)"); } else { fprintf(stderr, "EOF: Data\n"); } #endif abort = 1; break; } unlzx->pack_size -= count; crc_calc(unlzx->read_buffer, count, unlzx); if (out_file) { if (out_file->write(unlzx->read_buffer, 1, count) != count) { #ifdef UNLZX_DEBUG perror("FWrite"); #endif delete out_file; out_file = 0; } } unlzx->unpack_size -= count; } if (out_file) { PPSystemString fileName = out_file->getFileName(); delete out_file; if (!abort) { #ifdef UNLZX_DEBUG printf(" crc %s\n", (char *)((node->crc == unlzx->sum) ? "good" : "bad")); #endif if (identificator) found = identificator->identify(fileName); } } } return(abort); } signed long Unlzx::extract_unknown(XMFile *in_file, struct UnLZX *unlzx, bool& found) { struct filename_node *node; for (node = unlzx->filename_list; (node); node = node->next) { #ifdef UNLZX_DEBUG printf("Unknown \"%s\"\n", (char *)node->filename); #endif } return(0); } signed long Unlzx::extract_archive(XMFile *in_file, struct UnLZX *unlzx, bool& found) { unsigned long temp; struct filename_node **filename_next; struct filename_node *node; struct filename_node *temp_node; signed long actual, abort, result = 1; unlzx->filename_list = 0; filename_next = &unlzx->filename_list; do { abort = 1; actual = in_file->read(unlzx->archive_header, 1, 31); if (!in_file->isEOF()) { if (actual) { if (actual == 31) { unlzx->sum = 0; unlzx->crc = (unlzx->archive_header[29] << 24) + (unlzx->archive_header[28] << 16) + (unlzx->archive_header[27] << 8) + unlzx->archive_header[26]; unlzx->archive_header[29] = unlzx->archive_header[28] = unlzx->archive_header[27] = unlzx->archive_header[26] = 0; crc_calc(unlzx->archive_header, 31, unlzx); temp = unlzx->archive_header[30]; actual = in_file->read(unlzx->header_filename, 1, temp); if (!in_file->isEOF()) { if (actual == temp) { unlzx->header_filename[temp] = 0; crc_calc(unlzx->header_filename, temp, unlzx); temp = unlzx->archive_header[14]; actual = in_file->read(unlzx->header_comment, 1, temp); if (!in_file->isEOF()) { if (actual == temp) { unlzx->header_comment[temp] = 0; crc_calc(unlzx->header_comment, temp, unlzx); if (unlzx->sum == unlzx->crc) { unlzx->unpack_size = (unlzx->archive_header[5] << 24) + (unlzx->archive_header[4] << 16) + (unlzx->archive_header[3] << 8) + unlzx->archive_header[2]; unlzx->pack_size = (unlzx->archive_header[9] << 24) + (unlzx->archive_header[8] << 16) + (unlzx->archive_header[7] << 8) + unlzx->archive_header[6]; unlzx->pack_mode = unlzx->archive_header[11]; unlzx->crc = (unlzx->archive_header[25] << 24) + (unlzx->archive_header[24] << 16) + (unlzx->archive_header[23] << 8) + unlzx->archive_header[22]; if (node = (struct filename_node *)malloc(sizeof(struct filename_node))) { *filename_next = node; filename_next = &(node->next); node->next = 0; node->length = unlzx->unpack_size; node->crc = unlzx->crc; for (temp = 0; node->filename[temp] = unlzx->header_filename[temp]; temp++); if (unlzx->pack_size) { switch(unlzx->pack_mode) { case 0: abort = extract_store(in_file, unlzx, found); break; case 2: abort = extract_normal(in_file, unlzx, found); break; default: abort = extract_unknown(in_file, unlzx, found); break; } if (found) { abort = 1; result = 0; } if (abort) break; temp_node = unlzx->filename_list; while (node = temp_node) { temp_node = node->next; free(node); } unlzx->filename_list = 0; filename_next = &unlzx->filename_list; in_file->seek(unlzx->pack_size, XMFile::SeekOffsetTypeCurrent); } else { abort = 0; } } #ifdef UNLZX_DEBUG else { fprintf(stderr, "MAlloc(Filename_node)\n"); } #endif } #ifdef UNLZX_DEBUG else { fprintf(stderr, "CRC: Archive_Header\n"); } #endif } #ifdef UNLZX_DEBUG else { fprintf(stderr, "EOF: Header_Comment\n"); } #endif } #ifdef UNLZX_DEBUG else { perror("FRead(Header_Comment)"); } #endif } #ifdef UNLZX_DEBUG else { fprintf(stderr, "EOF: Header_Filename\n"); } #endif } #ifdef UNLZX_DEBUG else { perror("FRead(Header_Filename)"); } #endif } #ifdef UNLZX_DEBUG else { fprintf(stderr, "EOF: Archive_Header\n"); } #endif } else { result = 0; } } #ifdef UNLZX_DEBUG else { perror("FRead(Archive_Header)"); } #endif } while(!abort); temp_node = unlzx->filename_list; while(node = temp_node) { temp_node = node->next; free(node); } return(result); } signed long Unlzx::view_archive(XMFile* in_file, struct UnLZX *unlzx) { unsigned long temp, total_pack = 0, total_unpack = 0, total_files = 0, merge_size = 0; signed long actual, abort, result = 1; int percent; printf("Unpacked Packed Time Date Attrib Name\n"); printf("-------- -------- -------- ----------- -------- ----\n"); do { abort = 1; actual = in_file->read(unlzx->archive_header, 1, 31); if (!in_file->isEOF()) { if (actual) { if (actual == 31) { unlzx->sum = 0; unlzx->crc = (unlzx->archive_header[29] << 24) + (unlzx->archive_header[28] << 16) + (unlzx->archive_header[27] << 8) + unlzx->archive_header[26]; unlzx->archive_header[29] = unlzx->archive_header[28] = unlzx->archive_header[27] = unlzx->archive_header[26] = 0; crc_calc(unlzx->archive_header, 31, unlzx); temp = unlzx->archive_header[30]; actual = in_file->read(unlzx->header_filename, 1, temp); if (!in_file->isEOF()) { if (actual == temp) { unlzx->header_filename[temp] = 0; crc_calc(unlzx->header_filename, temp, unlzx); temp = unlzx->archive_header[14]; actual = in_file->read(unlzx->header_comment, 1, temp); if (!in_file->isEOF()) { if (actual == temp) { unlzx->header_comment[temp] = 0; crc_calc(unlzx->header_comment, temp, unlzx); if (unlzx->sum == unlzx->crc) { unlzx->attributes = unlzx->archive_header[0]; unlzx->unpack_size = (unlzx->archive_header[5] << 24) + (unlzx->archive_header[4] << 16) + (unlzx->archive_header[3] << 8) + unlzx->archive_header[2]; unlzx->pack_size = (unlzx->archive_header[9] << 24) + (unlzx->archive_header[8] << 16) + (unlzx->archive_header[7] << 8) + unlzx->archive_header[6]; temp = (unlzx->archive_header[18] << 24) + (unlzx->archive_header[19] << 16) + (unlzx->archive_header[20] << 8) + unlzx->archive_header[21]; unlzx->year = ((temp >> 17) & 63) + 1970; unlzx->month = (temp >> 23) & 15; unlzx->day = (temp >> 27) & 31; unlzx->hour = (temp >> 12) & 31; unlzx->minute = (temp >> 6) & 63; unlzx->second = temp & 63; total_pack += unlzx->pack_size; total_unpack += unlzx->unpack_size; total_files++; merge_size += unlzx->unpack_size; printf("%8ld ", (long)unlzx->unpack_size); if (unlzx->archive_header[12] & 1) { printf(" n/a "); } else { printf("%8ld ", (long)unlzx->pack_size); } printf("%02ld:%02ld:%02ld ", (long)unlzx->hour, (long)unlzx->minute, (long)unlzx->second); printf("%2ld-%s-%4ld ", (long)unlzx->day, (char *)month_str[unlzx->month], (long)unlzx->year); printf("%c%c%c%c%c%c%c%c ", ((unlzx->attributes & 32) ? 'h' : '-'), ((unlzx->attributes & 64) ? 's' : '-'), ((unlzx->attributes & 128) ? 'p' : '-'), ((unlzx->attributes & 16) ? 'a' : '-'), ((unlzx->attributes & 1) ? 'r' : '-'), ((unlzx->attributes & 2) ? 'w' : '-'), ((unlzx->attributes & 8) ? 'e' : '-'), ((unlzx->attributes & 4) ? 'd' : '-')); printf("\"%s\"\n", (char *)unlzx->header_filename); if(unlzx->header_comment[0]) printf(": \"%s\"\n", (char *)unlzx->header_comment); if ((unlzx->archive_header[12] & 1) && unlzx->pack_size) { percent = make_percent(unlzx->pack_size, merge_size); printf("%8ld %8ld Merged (%3d%%)\n", (long)merge_size, (long)unlzx->pack_size, (int)percent); } if (unlzx->pack_size) { merge_size = 0; in_file->seek(unlzx->pack_size, XMFile::SeekOffsetTypeCurrent); abort = 0; just_wait(); } else { abort = 0; } } #ifdef UNLZX_DEBUG else { fprintf(stderr, "CRC: Archive_Header\n"); } #endif } #ifdef UNLZX_DEBUG else { fprintf(stderr, "EOF: Header_Comment\n"); } #endif } #ifdef UNLZX_DEBUG else { perror("FRead(Header_Comment)"); } #endif } #ifdef UNLZX_DEBUG else { fprintf(stderr, "EOF: Header_Filename\n"); } #endif } #ifdef UNLZX_DEBUG else { perror("FRead(Header_Filename)"); } #endif } #ifdef UNLZX_DEBUG else { fprintf(stderr, "EOF: Archive_Header\n"); } #endif } else { printf("-------- -------- -------- ----------- -------- ----\n"); percent = make_percent(total_pack, total_unpack); printf("%8ld %8ld (%3d%%) ", (long)total_unpack, (long)total_pack, (int)percent); printf("%ld file%s\n", (long)total_files, (char *)((total_files == 1) ? "" : "s")); result = 0; } } #ifdef UNLZX_DEBUG else { perror("FRead(Archive_Header)"); } #endif } while(!abort); return(result); } signed long Unlzx::process_archive(const PPSystemString& filename, struct UnLZX *unlzx, bool& found) { signed long result = 1, actual; XMFile* in_file = new XMFile(filename); { actual = in_file->read(unlzx->info_header, 1, 10); if (!in_file->isEOF()) { if (actual == 10) { if ((unlzx->info_header[0] == 76) && (unlzx->info_header[1] == 90) && (unlzx->info_header[2] == 88)) { switch (unlzx->mode) { case 1: result = extract_archive(in_file, unlzx, found); break; case 2: result = view_archive(in_file, unlzx); break; } } #ifdef UNLZX_DEBUG else { fprintf(stderr, "Info_Header: Bad ID\n"); } #endif } #ifdef UNLZX_DEBUG else { fprintf(stderr, "EOF: Info_Header\n"); } #endif } #ifdef UNLZX_DEBUG else { perror("FRead(Info_Header)"); } #endif delete in_file; } #ifdef UNLZX_DEBUG else { perror("FOpen(Archive)"); } #endif return(result); } #if 0 int main(int argc, char **argv) { #ifdef UNLZX_TIME int init_time, time_taken; #endif int result = 0; unsigned long option; unsigned char tmp; struct UnLZX *unlzx; if (unlzx = unlzx_init()) { if (option = argopt((unsigned char*)"-p", (unsigned long)argc, (unsigned char**)argv)) { if (++option < argc) { strcpy((char*)unlzx->match_pattern, (char*)argv[option]); } } if (option = argopt((unsigned char*)"-o", (unsigned long)argc, (unsigned char **)argv)) { if (++option < argc) { strcpy((char*)unlzx->output_dir, (char*)argv[option]); unlzx->use_outdir = 1; tmp = strlen((char*)unlzx->output_dir) - 1; #ifdef AMIGA if ((unlzx->output_dir[tmp] != '/') && (unlzx->output_dir[tmp] != ':')) { unlzx->output_dir[tmp+1] = '/'; #else if (unlzx->output_dir[tmp] != '\\') { unlzx->output_dir[tmp+1] = '\\'; #endif /* AMIGA */ unlzx->output_dir[tmp+2] = '\0'; } } } if (option = argopt((unsigned char*)"-v", (unsigned long)argc, (unsigned char **)argv)) { unlzx->mode = 2; } else if (option = argopt((unsigned char*)"-x", (unsigned long)argc, (unsigned char **)argv)) { unlzx->mode = 1; } else { result = 1; } if ((!result) && (++option < argc)) { #ifdef UNLZX_TIME init_time = (int)time(NULL); #endif result = process_archive((unsigned char*)argv[option], unlzx); #ifdef UNLZX_TIME time_taken = (int)time(NULL) - init_time; printf("Time taken: %ds\n", time_taken); #endif } else { printf( "Usage: %s \n", (char *)argv[0] ); printf( "\t-v : list archive\n" "\t-x : extract archive\n" "\t-p : only matching files\n" "\t-o : destination path\n" ); result = 2; } unlzx_free(unlzx); } return(result); } #endif Unlzx::Unlzx(const PPSystemString& archiveFilename, const FileIdentificator* identificator) : archiveFilename(archiveFilename) , identificator(identificator) , unlzx(NULL) { } Unlzx::~Unlzx() { if (unlzx) unlzx_free(unlzx); } bool Unlzx::extractFile(bool extract, const PPSystemString* outFilename) { int result = 0; if (unlzx = unlzx_init()) { if (extract) { unlzx->mode = 1; unlzx->temporaryFile = outFilename; bool found = false; // TODO: make this all type safe result = process_archive(archiveFilename, unlzx, found); return found && (result == 0); } } return false; } milkytracker-0.90.85+dfsg/src/compression/Decompressor.h0000755000175000017500000000526111150223367022400 0ustar admin2admin2/* * tracker/Decompressor.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Decompressor.h * MilkyTracker * * Created by Peter Barth on 19.10.07. * */ #ifndef __DECOMPRESSOR_H__ #define __DECOMPRESSOR_H__ #include "BasicTypes.h" #include "SimpleVector.h" class XMFile; class DecompressorBase { public: enum Hints { HintAll, HintModules, HintInstruments, HintSamples, HintPatterns, HintTracks }; DecompressorBase(const PPSystemString& fileName) : fileName(fileName) { } virtual ~DecompressorBase() { } virtual bool identify(XMFile& f) = 0; virtual bool identify(); virtual bool doesServeHint(Hints hint) = 0; virtual const PPSimpleVector& getDescriptors(Hints hint) const = 0; virtual bool decompress(const PPSystemString& outFileName, Hints hint) = 0; static void removeFile(const PPSystemString& fileName); virtual void setFilename(const PPSystemString& filename); virtual DecompressorBase* clone() = 0; protected: PPSystemString fileName; mutable PPSimpleVector descriptors; }; /***************************************************************************** * Generic decompressor *****************************************************************************/ class Decompressor : public DecompressorBase { public: Decompressor(const PPSystemString& fileName); virtual bool identify(XMFile& f); virtual bool doesServeHint(Hints hint); virtual const PPSimpleVector& getDescriptors(Hints hint) const; virtual bool decompress(const PPSystemString& outFileName, Hints hint); virtual DecompressorBase* clone(); virtual void setFilename(const PPSystemString& filename); private: void adjustFilenames(const PPSystemString& filename); PPSimpleVector decompressors; public: static PPSimpleVector& decompressorList(); template struct RegisterDecompressor { RegisterDecompressor() { Decompressor::decompressorList().add(new type("")); } }; }; #endif milkytracker-0.90.85+dfsg/src/compression/Decompressor.cpp0000755000175000017500000000664211150223367022737 0ustar admin2admin2/* * tracker/Decompressor.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Decompressor.cpp * MilkyTracker * * Created by Peter Barth on 19.10.07. * */ #include "Decompressor.h" #include "XMFile.h" void DecompressorBase::removeFile(const PPSystemString& fileName) { XMFile::remove(fileName); } bool DecompressorBase::identify() { XMFile f(fileName); return identify(f); } void DecompressorBase::setFilename(const PPSystemString& filename) { this->fileName = filename; } Decompressor::Decompressor(const PPSystemString& fileName) : DecompressorBase(fileName) { for (pp_int32 i = 0; i < decompressorList().size(); i++) { DecompressorBase* decompressor = decompressorList().get(i)->clone(); decompressors.add(decompressor); } adjustFilenames(fileName); } bool Decompressor::identify(XMFile& f) { for (pp_int32 i = 0; i < decompressors.size(); i++) { if (decompressors.get(i)->identify(f)) { return true; } } return false; } bool Decompressor::doesServeHint(Hints hint) { for (pp_int32 i = 0; i < decompressors.size(); i++) { if (decompressors.get(i)->doesServeHint(hint)) return true; } return false; } struct DescriptorSortRule : public PPSimpleVector::SortRule { virtual pp_int32 compare(const Descriptor& left, const Descriptor& right) const { return left.description.compareTo(right.description); } }; const PPSimpleVector& Decompressor::getDescriptors(Hints hint) const { descriptors.clear(); for (pp_int32 i = 0; i < decompressors.size(); i++) { if (decompressors.get(i)->doesServeHint(hint)) { const PPSimpleVector& src = decompressors.get(i)->getDescriptors(hint); for (pp_int32 j = 0; j < src.size(); j++) { descriptors.add(new Descriptor(*src.get(j))); } } } DescriptorSortRule sortRule; descriptors.sort(sortRule); return descriptors; } bool Decompressor::decompress(const PPSystemString& outFileName, Hints hint) { bool result = false; for (pp_int32 i = 0; i < decompressors.size(); i++) { if (decompressors.get(i)->identify()) { result = decompressors.get(i)->decompress(outFileName, hint); break; } } if (!result) removeFile(outFileName); return result; } DecompressorBase* Decompressor::clone() { return new Decompressor(fileName); } void Decompressor::setFilename(const PPSystemString& filename) { DecompressorBase::setFilename(fileName); adjustFilenames(fileName); } void Decompressor::adjustFilenames(const PPSystemString& filename) { for (pp_int32 i = 0; i < decompressors.size(); i++) decompressors.get(i)->setFilename(filename); } PPSimpleVector& Decompressor::decompressorList() { static PPSimpleVector decompressorList; return decompressorList; } milkytracker-0.90.85+dfsg/src/compression/Makefile.in0000644000175000017500000005624311317506534021637 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = src/compression DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libcompression_a_AR = $(AR) $(ARFLAGS) libcompression_a_LIBADD = am_libcompression_a_OBJECTS = PP20.$(OBJEXT) ZipExtractor.$(OBJEXT) \ MyIO.$(OBJEXT) Decompressor.$(OBJEXT) \ DecompressorUMX.$(OBJEXT) DecompressorPP20.$(OBJEXT) \ unlha.$(OBJEXT) DecompressorZIP.$(OBJEXT) \ DecompressorLHA.$(OBJEXT) DecompressorGZIP.$(OBJEXT) \ DecompressorLZX.$(OBJEXT) unlzx.$(OBJEXT) libcompression_a_OBJECTS = $(am_libcompression_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libcompression_a_SOURCES) DIST_SOURCES = $(libcompression_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ SUBDIRS = zziplib/generic noinst_LIBRARIES = libcompression.a libcompression_a_SOURCES = PP20.cpp ZipExtractor.cpp zziplib/MyIO.cpp \ Decompressor.cpp DecompressorUMX.cpp DecompressorPP20.cpp lha/unlha.cpp \ DecompressorZIP.cpp DecompressorLHA.cpp DecompressorGZIP.cpp \ DecompressorLZX.cpp unlzx.cpp noinst_HEADERS = PP20.h ZipExtractor.h zziplib/MyIO.h DecompressorLHA.h \ DecompressorUMX.h DecompressorGZIP.h AIFFWriter.h Decompressor.h \ DecompressorPP20.h DecompressorQT.h lha/lharc.h DecompressorZIP.h \ DecompressorLZX.h unlzx.h \ lha/dhuf.inl lha/extract.inl lha/header.inl lha/huf.inl lha/larc.inl \ lha/lharc.h lha/lhext.inl lha/maketbl.inl lha/shuf.inl lha/slidehuf.h \ lha/slide.inl lha/unlha32.h EXTRA_DIST = DecompressorQT.mm AIFFWriter.m INCLUDES = -I$(top_srcdir)/src/milkyplay -I$(top_srcdir)/src/ppui \ -I$(top_srcdir)/src/ppui/osinterface/posix/ \ -I$(top_srcdir)/src/compression/lha -I$(top_srcdir)/src/compression/zziplib/ \ -I$(top_srcdir)/src/compression/zziplib/generic all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .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) --gnu src/compression/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/compression/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-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libcompression.a: $(libcompression_a_OBJECTS) $(libcompression_a_DEPENDENCIES) -rm -f libcompression.a $(libcompression_a_AR) libcompression.a $(libcompression_a_OBJECTS) $(libcompression_a_LIBADD) $(RANLIB) libcompression.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Decompressor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DecompressorGZIP.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DecompressorLHA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DecompressorLZX.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DecompressorPP20.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DecompressorUMX.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DecompressorZIP.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MyIO.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PP20.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ZipExtractor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unlha.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unlzx.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` MyIO.o: zziplib/MyIO.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MyIO.o -MD -MP -MF $(DEPDIR)/MyIO.Tpo -c -o MyIO.o `test -f 'zziplib/MyIO.cpp' || echo '$(srcdir)/'`zziplib/MyIO.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/MyIO.Tpo $(DEPDIR)/MyIO.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='zziplib/MyIO.cpp' object='MyIO.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MyIO.o `test -f 'zziplib/MyIO.cpp' || echo '$(srcdir)/'`zziplib/MyIO.cpp MyIO.obj: zziplib/MyIO.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MyIO.obj -MD -MP -MF $(DEPDIR)/MyIO.Tpo -c -o MyIO.obj `if test -f 'zziplib/MyIO.cpp'; then $(CYGPATH_W) 'zziplib/MyIO.cpp'; else $(CYGPATH_W) '$(srcdir)/zziplib/MyIO.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/MyIO.Tpo $(DEPDIR)/MyIO.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='zziplib/MyIO.cpp' object='MyIO.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MyIO.obj `if test -f 'zziplib/MyIO.cpp'; then $(CYGPATH_W) 'zziplib/MyIO.cpp'; else $(CYGPATH_W) '$(srcdir)/zziplib/MyIO.cpp'; fi` unlha.o: lha/unlha.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT unlha.o -MD -MP -MF $(DEPDIR)/unlha.Tpo -c -o unlha.o `test -f 'lha/unlha.cpp' || echo '$(srcdir)/'`lha/unlha.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/unlha.Tpo $(DEPDIR)/unlha.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='lha/unlha.cpp' object='unlha.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o unlha.o `test -f 'lha/unlha.cpp' || echo '$(srcdir)/'`lha/unlha.cpp unlha.obj: lha/unlha.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT unlha.obj -MD -MP -MF $(DEPDIR)/unlha.Tpo -c -o unlha.obj `if test -f 'lha/unlha.cpp'; then $(CYGPATH_W) 'lha/unlha.cpp'; else $(CYGPATH_W) '$(srcdir)/lha/unlha.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/unlha.Tpo $(DEPDIR)/unlha.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='lha/unlha.cpp' object='unlha.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o unlha.obj `if test -f 'lha/unlha.cpp'; then $(CYGPATH_W) 'lha/unlha.cpp'; else $(CYGPATH_W) '$(srcdir)/lha/unlha.cpp'; fi` # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done 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: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ 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: ctags-recursive $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive 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-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags ctags-recursive distclean \ distclean-compile distclean-generic 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 installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am #INCLUDES = -I../ppui -I../ppui/osinterface -I../ppui/osinterface/posix # 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: milkytracker-0.90.85+dfsg/src/compression/DecompressorPP20.cpp0000755000175000017500000000441411172163710023333 0ustar admin2admin2/* * compression/DecompressorPP20.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorPP20.cpp * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #include "DecompressorPP20.h" #include "PP20.h" #include "XMFile.h" // -- PP20 ------------------------------------------------------------------- DecompressorPP20::DecompressorPP20(const PPSystemString& fileName) : DecompressorBase(fileName) { } bool DecompressorPP20::identify(XMFile& f) { f.seek(0); mp_dword id = f.readDword(); // PP20 return (id == 0x30325050); } const PPSimpleVector& DecompressorPP20::getDescriptors(Hints hint) const { descriptors.clear(); descriptors.add(new Descriptor("pp", "Powerpacker Archive")); return descriptors; } bool DecompressorPP20::decompress(const PPSystemString& outFileName, Hints hint) { XMFile f(fileName); unsigned int size = f.size(); unsigned char* buffer = new unsigned char[size]; f.read(buffer, 1, size); PP20 pp20; if (!pp20.isCompressed(buffer, size)) { delete buffer; return false; } XMFile fOut(outFileName, true); pp_uint8* outBuffer = NULL; unsigned resultSize = pp20.decompress(buffer, size, &outBuffer); // delete this, it was allocated delete[] buffer; // if resultSize is 0 there is nothing more to deallocate if (resultSize == 0) return false; fOut.write(outBuffer, 1, resultSize); delete[] outBuffer; return true; } DecompressorBase* DecompressorPP20::clone() { return new DecompressorPP20(fileName); } static Decompressor::RegisterDecompressor registerDecompressor; milkytracker-0.90.85+dfsg/src/compression/zlib/0000755000175000017500000000000011317506052020513 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/compression/zlib/generic/0000755000175000017500000000000011317506055022132 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/compression/zlib/generic/crc32.cpp0000644000175000017500000003136310737746457023601 0ustar admin2admin2/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results in about a * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* @(#) $Id$ */ /* Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection on the static variables used to control the first-use generation 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(). */ #ifdef MAKECRCH # include # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ #include "zutil.h" /* for STDC and FAR definitions */ #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. */ #ifdef BYFOUR # define REV(w) (((w)>>24)+(((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, const unsigned char FAR *, unsigned)); # define TBLS 8 #else # define TBLS 1 #endif /* BYFOUR */ /* Local functions for crc concatenation */ 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)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; local unsigned long FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH local void write_table OF((FILE *, const unsigned long FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRCs on data a byte at a time for all combinations of CRC register values and incoming bytes. The remaining tables allow for word-at-a-time CRC calculation for both big-endian and little- endian machines, where a word is four bytes. */ local void make_crc_table() { unsigned long c; int n, k; unsigned long 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}; /* See if another task is already doing this (not thread-safe, but better than nothing -- significantly reduces duration of vulnerability in case the advice about DYNAMIC_CRC_TABLE is ignored) */ if (first) { 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]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (unsigned long)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; } #ifdef BYFOUR /* generate crc for each value followed by one, two, and three zeros, 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); 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); } } #endif /* BYFOUR */ crc_table_empty = 0; } else { /* not first */ /* wait for the other guy to finish (not efficient, but rare) */ while (crc_table_empty) ; } #ifdef MAKECRCH /* write out CRC tables to crc32.h */ { FILE *out; out = fopen("crc32.h", "w"); 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, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR fprintf(out, "#ifdef BYFOUR\n"); for (k = 1; k < 8; k++) { fprintf(out, " },\n {\n"); write_table(out, crc_table[k]); } fprintf(out, "#endif\n"); # endif /* BYFOUR */ fprintf(out, " }\n};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH local void write_table(out, table) FILE *out; const unsigned long FAR *table; { int n; for (n = 0; n < 256; n++) fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== * Tables of CRC-32s of all single-byte values, made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= * This function can be used by asm versions of crc32() */ const unsigned long 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; } /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, unsigned len) { if (buf == Z_NULL) return 0UL; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { u4 endian; endian = 1; if (*((unsigned char *)(&endian))) return crc32_little(crc, buf, len); else return crc32_big(crc, buf, len); } #endif /* BYFOUR */ crc = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return crc ^ 0xffffffffUL; } #ifdef BYFOUR /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ local unsigned long crc32_little(unsigned long crc, const unsigned char FAR *buf, unsigned len) { register u4 c; register const u4 FAR *buf4; c = (u4)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; while (len >= 32) { DOLIT32; len -= 32; } while (len >= 4) { DOLIT4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); } while (--len); c = ~c; return (unsigned long)c; } /* ========================================================================= */ #define DOBIG4 c ^= *++buf4; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ local unsigned long crc32_big(unsigned long crc, const unsigned char FAR *buf, unsigned len) { register u4 c; register const u4 FAR *buf4; c = REV((u4)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--; while (len >= 32) { DOBIG32; len -= 32; } while (len >= 4) { DOBIG4; len -= 4; } buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; return (unsigned long)(REV(c)); } #endif /* BYFOUR */ #define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ /* ========================================================================= */ local unsigned long gf2_matrix_times(unsigned long *mat, unsigned long vec) { unsigned long sum; sum = 0; while (vec) { if (vec & 1) sum ^= *mat; vec >>= 1; mat++; } return sum; } /* ========================================================================= */ local void gf2_matrix_square(unsigned long *square, unsigned long *mat) { int n; for (n = 0; n < GF2_DIM; n++) square[n] = gf2_matrix_times(mat, mat[n]); } /* ========================================================================= */ uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ /* degenerate case */ if (len2 == 0) return crc1; /* put operator for one zero bit in odd */ odd[0] = 0xedb88320L; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; row <<= 1; } /* put operator for two zero bits in even */ gf2_matrix_square(even, odd); /* put operator for four zero bits in odd */ gf2_matrix_square(odd, even); /* apply len2 zeros to crc1 (first square will put the operator for one zero byte, eight zero bits, in even) */ do { /* apply zeros operator for this bit of len2 */ gf2_matrix_square(even, odd); if (len2 & 1) crc1 = gf2_matrix_times(even, crc1); len2 >>= 1; /* if no more bits set, then done */ if (len2 == 0) break; /* another iteration of the loop with odd and even swapped */ gf2_matrix_square(odd, even); if (len2 & 1) crc1 = gf2_matrix_times(odd, crc1); len2 >>= 1; /* if no more bits set, then done */ } while (len2 != 0); /* return combined crc */ crc1 ^= crc2; return crc1; } milkytracker-0.90.85+dfsg/src/compression/zlib/generic/inffixed.h0000644000175000017500000001430710737746457024125 0ustar admin2admin2 /* inffixed.h -- table for decoding fixed codes * 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. */ static const code lenfix[512] = { {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, {0,9,255} }; static const code distfix[32] = { {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, {22,5,193},{64,5,0} }; milkytracker-0.90.85+dfsg/src/compression/zlib/generic/zutil.cpp0000644000175000017500000001566710737746457024045 0ustar admin2admin2/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ "file error", /* Z_ERRNO (-1) */ "stream error", /* Z_STREAM_ERROR (-2) */ "data error", /* Z_DATA_ERROR (-3) */ "insufficient memory", /* Z_MEM_ERROR (-4) */ "buffer error", /* Z_BUF_ERROR (-5) */ "incompatible version",/* Z_VERSION_ERROR (-6) */ ""}; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } uLong ZEXPORT zlibCompileFlags() { uLong flags; flags = 0; switch (sizeof(uInt)) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } switch (sizeof(uLong)) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } switch (sizeof(voidpf)) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } switch (sizeof(z_off_t)) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; default: flags += 3 << 6; } #ifdef DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif #ifdef ZLIB_WINAPI flags += 1 << 10; #endif #ifdef BUILDFIXED flags += 1 << 12; #endif #ifdef DYNAMIC_CRC_TABLE flags += 1 << 13; #endif #ifdef NO_GZCOMPRESS flags += 1L << 16; #endif #ifdef NO_GZIP flags += 1L << 17; #endif #ifdef PKZIP_BUG_WORKAROUND flags += 1L << 20; #endif #ifdef FASTEST flags += 1L << 21; #endif #ifdef STDC # ifdef NO_vsnprintf flags += 1L << 25; # ifdef HAS_vsprintf_void flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void flags += 1L << 26; # endif # endif #else flags += 1L << 24; # ifdef NO_snprintf flags += 1L << 25; # ifdef HAS_sprintf_void flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void flags += 1L << 26; # endif # endif #endif return flags; } #ifdef DEBUG # ifndef verbose # define verbose 0 # endif int z_verbose = verbose; void z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(int err) { return ERR_MSG(err); } #if defined(_WIN32_WCE) /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ int errno = 0; #endif #ifndef HAVE_MEMCPY void zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifdef SYS16BIT #ifdef __TURBOC__ /* Turbo C in 16-bit mode */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } #endif /* __TURBOC__ */ #ifdef M_I86 /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } void zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); } #endif /* M_I86 */ #endif /* SYS16BIT */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp malloc OF((uInt size)); extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf zcalloc ( voidpf opaque, unsigned items, unsigned size ) { if (opaque) items += size - size; /* make compiler happy */ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } void zcfree ( voidpf opaque, voidpf ptr ) { free(ptr); if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ milkytracker-0.90.85+dfsg/src/compression/zlib/generic/trees.cpp0000644000175000017500000012342710737746457024012 0ustar admin2admin2/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2005 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* @(#) $Id$ */ /* #define GEN_TREES_H */ #include "deflate.h" #ifdef DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * 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. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); local void set_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); local void copy_block OF((deflate_state *s, charf *buf, unsigned len, int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (value << s->bi_valid); put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= value << s->bi_valid; s->bi_valid += length; } } #else /* !DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ s->bi_buf |= (val << s->bi_valid);\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* DEBUG */ /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void _tr_init(deflate_state *s) { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = &static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = &static_bl_desc; 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; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(deflate_state *s) { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap( deflate_state *s, ct_data *tree, int k ) { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen( deflate_state *s, tree_desc *desc ) { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (bits + xbits); if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); } if (overflow == 0) return; Trace((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if ((unsigned) tree[m].Len != (unsigned) bits) { Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((long)bits - (long)tree[m].Len) *(long)tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes ( ct_data *tree, int max_code, ushf *bl_count ) { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ush code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = (code + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? s->depth[n] : s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree ( deflate_state *s, ct_data *tree, int max_code ) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree ( deflate_state *s, ct_data *tree, int max_code ) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(deflate_state *s) { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*(max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees( deflate_state *s, int lcodes, int dcodes, int blcodes ) { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void _tr_stored_block( deflate_state *s, charf *buf, ulg stored_len, int eof ) { send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; #endif copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== * 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 _tr_align(deflate_state *s) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG 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; } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ void _tr_flush_block( deflate_state *s, charf *buf, ulg stored_len, int eof ) { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is binary or text */ if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) set_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, eof); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+eof, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+eof, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (eof) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*eof)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int _tr_tally ( deflate_state *s, unsigned dist, unsigned lc ) { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block( deflate_state *s, ct_data *ltree, ct_data *dtree ) { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== * Set the data type to BINARY or TEXT, using a crude approximation: * set it to Z_TEXT if all symbols are either printable characters (33 to 255) * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. * IN assertion: the fields Freq of dyn_ltree are set. */ local void set_data_type(deflate_state *s) { int n; for (n = 0; n < 9; n++) if (s->dyn_ltree[n].Freq != 0) break; if (n == 9) for (n = 14; n < 32; n++) if (s->dyn_ltree[n].Freq != 0) break; s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse( unsigned code, int len ) { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(deflate_state *s) { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(deflate_state *s) { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } /* =========================================================================== * Copy a stored block, storing first the length and its * one's complement if requested. */ local void copy_block( deflate_state *s, charf *buf, unsigned len, int header ) { bi_windup(s); /* align on byte boundary */ s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); put_short(s, (ush)~len); #ifdef DEBUG s->bits_sent += 2*16; #endif } #ifdef DEBUG s->bits_sent += (ulg)len<<3; #endif while (len--) { put_byte(s, *buf++); } } milkytracker-0.90.85+dfsg/src/compression/zlib/generic/crc32.h0000644000175000017500000007355010737746457023252 0ustar admin2admin2/* crc32.h -- tables for rapid CRC calculation * Generated automatically by crc32.c */ local const unsigned long FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL #ifdef BYFOUR }, { 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, 0x9324fd72UL }, { 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, 0xbe9834edUL }, { 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, 0xde0506f1UL }, { 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, 0x8def022dUL }, { 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, 0x72fd2493UL }, { 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, 0xed3498beUL }, { 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, 0xf10605deUL #endif } }; milkytracker-0.90.85+dfsg/src/compression/zlib/generic/gzio.cpp0000755000175000017500000007422411033672344023622 0ustar admin2admin2/* gzio.c -- IO on .gz files * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h * * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. */ /* @(#) $Id$ */ #include #include "zutil.h" #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif #ifndef Z_BUFSIZE # ifdef MAXSEG_64K # define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ # else # define Z_BUFSIZE 16384 # endif #endif #ifndef Z_PRINTF_BUFSIZE # define Z_PRINTF_BUFSIZE 4096 #endif #ifdef __MVS__ # pragma map (fdopen , "\174\174FDOPEN") FILE *fdopen(int, const char *); #endif #ifndef STDC extern voidp malloc OF((uInt size)); extern void free OF((voidpf ptr)); #endif #define ALLOC(size) malloc(size) #define TRYFREE(p) {if (p) free(p);} static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ /* gzip flag byte */ #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ #define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ #define COMMENT 0x10 /* bit 4 set: file comment present */ #define RESERVED 0xE0 /* bits 5..7: reserved */ typedef struct gz_stream { z_stream stream; int z_err; /* error code for last stream operation */ int z_eof; /* set if end of input file */ FILE *file; /* .gz file */ Byte *inbuf; /* input buffer */ Byte *outbuf; /* output buffer */ uLong crc; /* crc32 of uncompressed data */ char *msg; /* error message */ char *path; /* path name for debugging only */ int transparent; /* 1 if input file is not a .gz file */ char mode; /* 'w' or 'r' */ z_off_t start; /* start of compressed data in file (header skipped) */ z_off_t in; /* bytes into deflate or inflate */ z_off_t out; /* bytes out of deflate or inflate */ int back; /* one character push-back */ int last; /* true if push-back is last character */ } gz_stream; local gzFile gz_open OF((const char *path, const char *mode, int fd)); local int do_flush OF((gzFile file, int flush)); local int get_byte OF((gz_stream *s)); local void check_header OF((gz_stream *s)); local int destroy OF((gz_stream *s)); local void putLong OF((FILE *file, uLong x)); local uLong getLong OF((gz_stream *s)); /* =========================================================================== Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb"). The file is given either by file descriptor or path name (if fd == -1). gz_open returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ local gzFile gz_open ( const char *path, const char *mode, int fd) { int err; int level = Z_DEFAULT_COMPRESSION; /* compression level */ int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ char *p = (char*)mode; gz_stream *s; char fmode[80]; /* copy of mode, without the compression level */ char *m = fmode; if (!path || !mode) return Z_NULL; s = (gz_stream *)ALLOC(sizeof(gz_stream)); if (!s) return Z_NULL; s->stream.zalloc = (alloc_func)0; s->stream.zfree = (free_func)0; s->stream.opaque = (voidpf)0; s->stream.next_in = s->inbuf = Z_NULL; s->stream.next_out = s->outbuf = Z_NULL; s->stream.avail_in = s->stream.avail_out = 0; s->file = NULL; s->z_err = Z_OK; s->z_eof = 0; s->in = 0; s->out = 0; s->back = EOF; s->crc = crc32(0L, Z_NULL, 0); s->msg = NULL; s->transparent = 0; s->path = (char*)ALLOC(strlen(path)+1); if (s->path == NULL) { return destroy(s), (gzFile)Z_NULL; } strcpy(s->path, path); /* do this early for debugging */ s->mode = '\0'; do { if (*p == 'r') s->mode = 'r'; if (*p == 'w' || *p == 'a') s->mode = 'w'; if (*p >= '0' && *p <= '9') { level = *p - '0'; } else if (*p == 'f') { strategy = Z_FILTERED; } else if (*p == 'h') { strategy = Z_HUFFMAN_ONLY; } else if (*p == 'R') { strategy = Z_RLE; } else { *m++ = *p; /* copy the mode */ } } while (*p++ && m != fmode + sizeof(fmode)); if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateInit2(&(s->stream), level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); /* windowBits is passed < 0 to suppress zlib header */ s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); #endif if (err != Z_OK || s->outbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } else { s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); err = inflateInit2(&(s->stream), -MAX_WBITS); /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are * present after the compressed stream. */ if (err != Z_OK || s->inbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } s->stream.avail_out = Z_BUFSIZE; errno = 0; s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); if (s->file == NULL) { return destroy(s), (gzFile)Z_NULL; } if (s->mode == 'w') { /* Write a very simple .gz header: */ fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); s->start = 10L; /* We use 10L instead of ftell(s->file) to because ftell causes an * fflush on some systems. This version of the library doesn't use * start anyway in write mode, so this initialization is not * necessary. */ } else { check_header(s); /* skip the .gz header */ s->start = ftell(s->file) - s->stream.avail_in; } return (gzFile)s; } /* =========================================================================== Opens a gzip (.gz) file for reading or writing. */ gzFile ZEXPORT gzopen ( const char *path, const char *mode) { return gz_open (path, mode, -1); } /* =========================================================================== Associate a gzFile with the file descriptor fd. fd is not dup'ed here to mimic the behavio(u)r of fdopen. */ gzFile ZEXPORT gzdopen ( int fd, const char *mode) { char name[46]; /* allow for up to 128-bit integers */ if (fd < 0) return (gzFile)Z_NULL; sprintf(name, "", fd); /* for debugging */ return gz_open (name, mode, fd); } /* =========================================================================== * Update the compression level and strategy */ int ZEXPORT gzsetparams ( gzFile file, int level, int strategy) { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; /* Make room to allow flushing */ if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; } s->stream.avail_out = Z_BUFSIZE; } return deflateParams (&(s->stream), level, strategy); } /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int get_byte( gz_stream *s) { if (s->z_eof) return EOF; if (s->stream.avail_in == 0) { errno = 0; s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) s->z_err = Z_ERRNO; return EOF; } s->stream.next_in = s->inbuf; } s->stream.avail_in--; return *(s->stream.next_in)++; } /* =========================================================================== Check the gzip header of a gz_stream opened for reading. Set the stream mode to transparent if the gzip magic header is not present; set s->err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. IN assertion: the stream s has already been created sucessfully; s->stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files. */ local void check_header( gz_stream *s) { int method; /* method byte */ int flags; /* flags byte */ uInt len; int c; /* Assure two bytes in the buffer so we can peek ahead -- handle case where first byte of header is at the end of the buffer after the last gzip segment */ len = s->stream.avail_in; if (len < 2) { if (len) s->inbuf[0] = s->stream.next_in[0]; errno = 0; len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; s->stream.avail_in += len; s->stream.next_in = s->inbuf; if (s->stream.avail_in < 2) { s->transparent = s->stream.avail_in; return; } } /* Peek ahead to check the gzip magic header */ if (s->stream.next_in[0] != gz_magic[0] || s->stream.next_in[1] != gz_magic[1]) { s->transparent = 1; return; } s->stream.avail_in -= 2; s->stream.next_in += 2; /* Check the rest of the gzip header */ method = get_byte(s); flags = get_byte(s); if (method != Z_DEFLATED || (flags & RESERVED) != 0) { s->z_err = Z_DATA_ERROR; return; } /* Discard time, xflags and OS code: */ for (len = 0; len < 6; len++) (void)get_byte(s); if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ len = (uInt)get_byte(s); len += ((uInt)get_byte(s))<<8; /* len is garbage if EOF but the loop below will quit anyway */ while (len-- != 0 && get_byte(s) != EOF) ; } if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ for (len = 0; len < 2; len++) (void)get_byte(s); } s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; } /* =========================================================================== * Cleanup then free the given gz_stream. Return a zlib error code. Try freeing in the reverse order of allocations. */ local int destroy ( gz_stream *s) { int err = Z_OK; if (!s) return Z_STREAM_ERROR; TRYFREE(s->msg); if (s->stream.state != NULL) { if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateEnd(&(s->stream)); #endif } else if (s->mode == 'r') { err = inflateEnd(&(s->stream)); } } if (s->file != NULL && fclose(s->file)) { #ifdef ESPIPE if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ #endif err = Z_ERRNO; } if (s->z_err < 0) err = s->z_err; TRYFREE(s->inbuf); TRYFREE(s->outbuf); TRYFREE(s->path); TRYFREE(s); return err; } /* =========================================================================== Reads the given number of uncompressed bytes from the compressed file. gzread returns the number of bytes actually read (0 for end of file). */ int ZEXPORT gzread ( gzFile file, voidp buf, unsigned len) { gz_stream *s = (gz_stream*)file; Bytef *start = (Bytef*)buf; /* starting point for crc computation */ Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; if (s->z_err == Z_STREAM_END) return 0; /* EOF */ next_out = (Byte*)buf; s->stream.next_out = (Bytef*)buf; s->stream.avail_out = len; if (s->stream.avail_out && s->back != EOF) { *next_out++ = s->back; s->stream.next_out++; s->stream.avail_out--; s->back = EOF; s->out++; start++; if (s->last) { s->z_err = Z_STREAM_END; return 1; } } while (s->stream.avail_out != 0) { if (s->transparent) { /* Copy first the lookahead bytes: */ uInt n = s->stream.avail_in; if (n > s->stream.avail_out) n = s->stream.avail_out; if (n > 0) { zmemcpy(s->stream.next_out, s->stream.next_in, n); next_out += n; s->stream.next_out = next_out; s->stream.next_in += n; s->stream.avail_out -= n; s->stream.avail_in -= n; } if (s->stream.avail_out > 0) { s->stream.avail_out -= (uInt)fread(next_out, 1, s->stream.avail_out, s->file); } len -= s->stream.avail_out; s->in += len; s->out += len; if (len == 0) s->z_eof = 1; return (int)len; } if (s->stream.avail_in == 0 && !s->z_eof) { errno = 0; s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) { s->z_err = Z_ERRNO; break; } } s->stream.next_in = s->inbuf; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = inflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err == Z_STREAM_END) { /* Check CRC and original size */ s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); start = s->stream.next_out; if (getLong(s) != s->crc) { s->z_err = Z_DATA_ERROR; } else { (void)getLong(s); /* The uncompressed length returned by above getlong() may be * different from s->out in case of concatenated .gz files. * Check for such files: */ check_header(s); if (s->z_err == Z_OK) { inflateReset(&(s->stream)); s->crc = crc32(0L, Z_NULL, 0); } } } if (s->z_err != Z_OK || s->z_eof) break; } s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); if (len == s->stream.avail_out && (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) return -1; return (int)(len - s->stream.avail_out); } /* =========================================================================== Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ int ZEXPORT gzgetc( gzFile file) { unsigned char c; return gzread(file, &c, 1) == 1 ? c : -1; } /* =========================================================================== Push one byte back onto the stream. */ int ZEXPORT gzungetc( int c, gzFile file) { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; s->back = c; s->out--; s->last = (s->z_err == Z_STREAM_END); if (s->last) s->z_err = Z_OK; s->z_eof = 0; return c; } /* =========================================================================== Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. The current implementation is not optimized at all. */ char * ZEXPORT gzgets( gzFile file, char *buf, int len) { char *b = buf; if (buf == Z_NULL || len <= 0) return Z_NULL; while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; *buf = '\0'; return b == buf && len > 0 ? Z_NULL : b; } #ifndef NO_GZCOMPRESS /* =========================================================================== Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of bytes actually written (0 in case of error). */ int ZEXPORT gzwrite ( gzFile file, voidpc buf, unsigned len) { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.next_in = (Bytef*)buf; s->stream.avail_in = len; while (s->stream.avail_in != 0) { if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; break; } s->stream.avail_out = Z_BUFSIZE; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err != Z_OK) break; } s->crc = crc32(s->crc, (const Bytef *)buf, len); return (int)(len - s->stream.avail_in); } /* =========================================================================== Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). */ #ifdef STDC #include int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) { char buf[Z_PRINTF_BUFSIZE]; va_list va; int len; buf[sizeof(buf) - 1] = 0; va_start(va, format); #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void (void)vsprintf(buf, format, va); va_end(va); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = vsprintf(buf, format, va); va_end(va); # endif #else # ifdef HAS_vsnprintf_void (void)vsnprintf(buf, sizeof(buf), format, va); va_end(va); len = strlen(buf); # else len = vsnprintf(buf, sizeof(buf), format, va); va_end(va); # endif #endif if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, (unsigned)len); } #else /* not ANSI C */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { char buf[Z_PRINTF_BUFSIZE]; int len; buf[sizeof(buf) - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void sprintf(buf, 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 < sizeof(buf); len++) if (buf[len] == 0) break; # else len = sprintf(buf, 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(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); len = strlen(buf); # else len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, len); } #endif /* =========================================================================== Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ int ZEXPORT gzputc( gzFile file, int c) { unsigned char cc = (unsigned char) c; /* required for big endian systems */ return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; } /* =========================================================================== Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ int ZEXPORT gzputs( gzFile file, const char *s) { return gzwrite(file, (char*)s, (unsigned)strlen(s)); } /* =========================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. */ local int do_flush ( gzFile file, int flush) { uInt len; int done = 0; gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.avail_in = 0; /* should be zero already anyway */ for (;;) { len = Z_BUFSIZE - s->stream.avail_out; if (len != 0) { if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { s->z_err = Z_ERRNO; return Z_ERRNO; } s->stream.next_out = s->outbuf; s->stream.avail_out = Z_BUFSIZE; } if (done) break; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), flush); s->out -= s->stream.avail_out; /* Ignore the second of two consecutive flushes: */ if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; /* deflate has finished flushing only when it hasn't used up * all the available space in the output buffer: */ done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; } return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } int ZEXPORT gzflush ( gzFile file, int flush) { gz_stream *s = (gz_stream*)file; int err = do_flush (file, flush); if (err) return err; fflush(s->file); return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } #endif /* NO_GZCOMPRESS */ /* =========================================================================== Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error. SEEK_END is not implemented, returns error. In this version of the library, gzseek can be extremely slow. */ z_off_t ZEXPORT gzseek ( gzFile file, z_off_t offset, int whence) { gz_stream *s = (gz_stream*)file; if (s == NULL || whence == SEEK_END || s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { return -1L; } if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return -1L; #else if (whence == SEEK_SET) { offset -= s->in; } if (offset < 0) return -1L; /* At this point, offset is the number of zero bytes to write. */ if (s->inbuf == Z_NULL) { s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ if (s->inbuf == Z_NULL) return -1L; zmemzero(s->inbuf, Z_BUFSIZE); } while (offset > 0) { uInt size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (uInt)offset; size = gzwrite(file, s->inbuf, size); if (size == 0) return -1L; offset -= size; } return s->in; #endif } /* Rest of function is for reading only */ /* compute absolute position */ if (whence == SEEK_CUR) { offset += s->out; } if (offset < 0) return -1L; if (s->transparent) { /* map to fseek */ s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; s->in = s->out = offset; return offset; } /* For a negative seek, rewind and use positive seek */ if (offset >= s->out) { offset -= s->out; } else if (gzrewind(file) < 0) { return -1L; } /* offset is now the number of bytes to skip. */ if (offset != 0 && s->outbuf == Z_NULL) { s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); if (s->outbuf == Z_NULL) return -1L; } if (offset && s->back != EOF) { s->back = EOF; s->out++; offset--; if (s->last) s->z_err = Z_STREAM_END; } while (offset > 0) { int size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (int)offset; size = gzread(file, s->outbuf, (uInt)size); if (size <= 0) return -1L; offset -= size; } return s->out; } /* =========================================================================== Rewinds input file. */ int ZEXPORT gzrewind ( gzFile file) { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return -1; s->z_err = Z_OK; s->z_eof = 0; s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; s->crc = crc32(0L, Z_NULL, 0); if (!s->transparent) (void)inflateReset(&s->stream); s->in = 0; s->out = 0; return fseek(s->file, s->start, SEEK_SET); } /* =========================================================================== Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. */ z_off_t ZEXPORT gztell ( gzFile file) { return gzseek(file, 0L, SEEK_CUR); } /* =========================================================================== Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ int ZEXPORT gzeof ( gzFile file) { gz_stream *s = (gz_stream*)file; /* With concatenated compressed files that can have embedded * crc trailers, z_eof is no longer the only/best indicator of EOF * on a gz_stream. Handle end-of-stream error explicitly here. */ if (s == NULL || s->mode != 'r') return 0; if (s->z_eof) return 1; return s->z_err == Z_STREAM_END; } /* =========================================================================== Returns 1 if reading and doing so transparently, otherwise zero. */ int ZEXPORT gzdirect ( gzFile file) { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return 0; return s->transparent; } /* =========================================================================== Outputs a long in LSB order to the given file */ local void putLong ( FILE *file, uLong x) { int n; for (n = 0; n < 4; n++) { fputc((int)(x & 0xff), file); x >>= 8; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets z_err in case of error. */ local uLong getLong ( gz_stream *s) { uLong x = (uLong)get_byte(s); int c; x += ((uLong)get_byte(s))<<8; x += ((uLong)get_byte(s))<<16; c = get_byte(s); if (c == EOF) s->z_err = Z_DATA_ERROR; x += ((uLong)c)<<24; return x; } /* =========================================================================== Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. */ int ZEXPORT gzclose ( gzFile file) { gz_stream *s = (gz_stream*)file; if (s == NULL) return Z_STREAM_ERROR; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return Z_STREAM_ERROR; #else if (do_flush (file, Z_FINISH) != Z_OK) return destroy((gz_stream*)file); putLong (s->file, s->crc); putLong (s->file, (uLong)(s->in & 0xffffffff)); #endif } return destroy((gz_stream*)file); } #ifdef STDC # define zstrerror(errnum) strerror(errnum) #else # define zstrerror(errnum) "" #endif /* =========================================================================== Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ const char * ZEXPORT gzerror ( gzFile file, int *errnum) { char *m; gz_stream *s = (gz_stream*)file; if (s == NULL) { *errnum = Z_STREAM_ERROR; return (const char*)ERR_MSG(Z_STREAM_ERROR); } *errnum = s->z_err; if (*errnum == Z_OK) return (const char*)""; m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); TRYFREE(s->msg); s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); strcpy(s->msg, s->path); strcat(s->msg, ": "); strcat(s->msg, m); return (const char*)s->msg; } /* =========================================================================== Clear the error and end-of-file flags, and do the same for the real file. */ void ZEXPORT gzclearerr ( gzFile file) { gz_stream *s = (gz_stream*)file; if (s == NULL) return; if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; s->z_eof = 0; clearerr(s->file); } milkytracker-0.90.85+dfsg/src/compression/zlib/generic/inffast.cpp0000644000175000017500000003033710737746457024317 0ustar admin2admin2/* inffast.c -- fast decoding * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifndef ASMINF /* Allow machine dependent optimization for post-increment or pre-increment. Based on testing to date, Pre-increment preferred for: - PowerPC G3 (Adler) - MIPS R5000 (Randers-Pehrson) Post-increment preferred for: - none No measurable difference: - Pentium III (Anderson) - M68060 (Nikl) */ #ifdef POSTINC # define OFF 0 # define PUP(a) *(a)++ #else # define OFF 1 # define PUP(a) *++(a) #endif /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the inflate execution time is spent in this routine. Entry assumptions: state->mode == LEN strm->avail_in >= 6 strm->avail_out >= 258 start >= strm->avail_out state->bits < 8 On return, state->mode is one of: LEN -- ran out of enough output space or enough available input TYPE -- reached end of block code, inflate() to interpret next block BAD -- error in block data Notes: - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ void inflate_fast(z_streamp strm, unsigned start) { struct inflate_state FAR *state; unsigned char FAR *in; /* local strm->next_in */ unsigned char FAR *last; /* while in < last, enough input available */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ #ifdef INFLATE_STRICT unsigned dmax; /* maximum distance from zlib header */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ code const FAR *lcode; /* local strm->lencode */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ code _this; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ unsigned dist; /* match distance */ unsigned char FAR *from; /* where to copy match from */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in - OFF; last = in + (strm->avail_in - 5); out = strm->next_out - OFF; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); #ifdef INFLATE_STRICT dmax = state->dmax; #endif wsize = state->wsize; whave = state->whave; write = state->write; window = state->window; hold = state->hold; bits = state->bits; lcode = state->lencode; dcode = state->distcode; lmask = (1U << state->lenbits) - 1; dmask = (1U << state->distbits) - 1; /* decode literals and length/distances until end-of-block or not enough input data or output space */ do { if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } _this = lcode[hold & lmask]; dolen: op = (unsigned)(_this.bits); hold >>= op; bits -= op; op = (unsigned)(_this.op); if (op == 0) { /* literal */ Tracevv((stderr, _this.val >= 0x20 && _this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", _this.val)); PUP(out) = (unsigned char)(_this.val); } else if (op & 16) { /* length base */ len = (unsigned)(_this.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } _this = dcode[hold & dmask]; dodist: op = (unsigned)(_this.bits); hold >>= op; bits -= op; op = (unsigned)(_this.op); if (op & 16) { /* distance base */ dist = (unsigned)(_this.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } } dist += (unsigned)hold & ((1U << op) - 1); #ifdef INFLATE_STRICT if (dist > dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif hold >>= op; bits -= op; Tracevv((stderr, "inflate: distance %u\n", dist)); op = (unsigned)(out - beg); /* max distance in output */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } from = window - OFF; if (write == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } else if (write < op) { /* wrap around window */ from += wsize + write - op; op -= write; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; if (write < len) { /* some from start of window */ op = write; len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } } else { /* contiguous in window */ from += write - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } while (len > 2); if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } } else if ((op & 64) == 0) { /* 2nd level distance code */ _this = dcode[_this.val + (hold & ((1U << op) - 1))]; goto dodist; } else { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } } else if ((op & 64) == 0) { /* 2nd level length code */ _this = lcode[_this.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } else { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } } while (in < last && out < end); /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ len = bits >> 3; in -= len; bits -= len << 3; hold &= (1U << bits) - 1; /* update state and return */ strm->next_in = in + OFF; strm->next_out = out + OFF; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); state->hold = hold; state->bits = bits; return; } /* inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - Three separate decoding do-loops for direct, window, and write == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes - Swapping literal/length else - Swapping window/direct else - Larger unrolled copy loops (three is about right) - Moving len -= 3 statement into middle of loop */ #endif /* !ASMINF */ milkytracker-0.90.85+dfsg/src/compression/zlib/generic/compress.cpp0000644000175000017500000000447310737746457024522 0ustar admin2admin2/* compress.c -- compress a memory buffer * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 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, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; #endif stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* =========================================================================== */ int ZEXPORT compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } /* =========================================================================== If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ uLong ZEXPORT compressBound (uLong sourceLen) { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; } milkytracker-0.90.85+dfsg/src/compression/zlib/generic/inftrees.h0000644000175000017500000000450510737746457024147 0ustar admin2admin2/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* 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. */ /* Structure for decoding tables. Each entry provides either the information needed to do the operation requested by the code that indexed that table entry, or it provides a pointer to another table that indexes more bits of the code. op indicates whether the entry is a pointer to another table, a literal, a length or distance, an end-of-block, or an invalid code. For a table pointer, the low four bits of op is the number of index bits of that table. For a length or distance, the low four bits of op is the number of extra bits to get after the code. bits is the number of bits in this code or part of the code to drop off of the bit buffer. val is the actual byte to output in the case of a literal, the base length or distance, or the offset from the current table to the next table. Each entry is four bytes. */ typedef struct { unsigned char op; /* operation, extra bits, table bits */ unsigned char bits; /* bits in this part of the code */ unsigned short val; /* offset in table or code value */ } code; /* op values as set by inflate_table(): 00000000 - literal 0000tttt - table link, tttt != 0 is the number of table index bits 0001eeee - length or distance, eeee is the number of extra bits 01100000 - end of block 01000000 - invalid code */ /* Maximum size of dynamic tree. The maximum found in a long but non- exhaustive search was 1444 code structures (852 for length/literals and 592 for distances, the latter actually the result of an exhaustive search). The true maximum is not known, but the value below is more than safe. */ #define ENOUGH 2048 #define MAXD 592 /* Type of code to build for inftable() */ typedef enum { CODES, LENS, DISTS } codetype; extern int inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); milkytracker-0.90.85+dfsg/src/compression/zlib/generic/infback.cpp0000644000175000017500000005314010737746457024257 0ustar admin2admin2/* infback.c -- inflate using a call-back interface * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* This code is largely copied from inflate.c. Normally either infback.o or inflate.o would be linked into an application--not both. The interface with inffast.c is retained so that optimized assembler-coded versions of inflate_fast() can be used with either inflate.c or infback.c. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size ) { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL || window == Z_NULL || windowBits < 8 || windowBits > 15) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->dmax = 32768U; state->wbits = windowBits; state->wsize = 1U << windowBits; state->window = window; state->write = 0; state->whave = 0; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } /* Macros for inflateBack(): */ /* Load returned state from inflate_fast() */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Set state from registers for inflate_fast() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Assure that some input is available. If input is requested, but denied, then return a Z_BUF_ERROR from inflateBack(). */ #define PULL() \ do { \ if (have == 0) { \ have = in(in_desc, &next); \ if (have == 0) { \ next = Z_NULL; \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflateBack() with an error if there is no input available. */ #define PULLBYTE() \ do { \ PULL(); \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflateBack() with an error. */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Assure that some output space is available, by writing out the window if it's full. If the write fails, return from inflateBack() with a Z_BUF_ERROR. */ #define ROOM() \ do { \ if (left == 0) { \ put = state->window; \ left = state->wsize; \ state->whave = left; \ if (out(out_desc, put, left)) { \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* strm provides the memory allocation functions and window buffer on input, and provides information on the unused input on return. For Z_DATA_ERROR returns, strm will also provide an error message. in() and out() are the call-back input and output functions. When inflateBack() needs more input, it calls in(). When inflateBack() has filled the window with output, or when it completes with data in the window, it calls out() to write out the data. The application must not change the provided input until in() is called again or inflateBack() returns. The application must not change the window/output buffer until inflateBack() returns. in() and out() are called with a descriptor parameter provided in the inflateBack() call. This parameter can be a structure that provides the information required to do the read or write, as well as accumulated information on the input and output such as totals and check values. in() should return zero on failure. out() should return non-zero on failure. If either in() or out() fails, than inflateBack() returns a Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it was in() or out() that caused in the error. Otherwise, inflateBack() returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format error, or Z_MEM_ERROR if it could not allocate memory for the state. inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc ) { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code _this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* Check that the strm exists and that the state was initialized */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* Reset the state */ strm->msg = Z_NULL; state->mode = TYPE; state->last = 0; state->whave = 0; next = strm->next_in; have = next != Z_NULL ? strm->avail_in : 0; hold = 0; bits = 0; put = state->window; left = state->wsize; /* Inflate until end of block marked as last */ for (;;) switch (state->mode) { case TYPE: /* determine and dispatch block type */ if (state->last) { BYTEBITS(); state->mode = DONE; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: /* get and verify stored block length */ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); /* copy stored block from input to output */ while (state->length != 0) { copy = state->length; PULL(); ROOM(); if (copy > have) copy = have; if (copy > left) copy = left; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: /* get dynamic table entries descriptor */ NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); /* get code length code lengths (not a typo) */ state->have = 0; while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); /* get length and distance code code lengths */ state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { _this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(_this.bits) <= bits) break; PULLBYTE(); } if (_this.val < 16) { NEEDBITS(_this.bits); DROPBITS(_this.bits); state->lens[state->have++] = _this.val; } else { if (_this.val == 16) { NEEDBITS(_this.bits + 2); DROPBITS(_this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = (unsigned)(state->lens[state->have - 1]); copy = 3 + BITS(2); DROPBITS(2); } else if (_this.val == 17) { NEEDBITS(_this.bits + 3); DROPBITS(_this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(_this.bits + 7); DROPBITS(_this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: /* use inflate_fast() if we have enough input and output */ if (have >= 6 && left >= 258) { RESTORE(); if (state->whave < state->wsize) state->whave = state->wsize - left; inflate_fast(strm, state->wsize); LOAD(); break; } /* get a literal, length, or end-of-block code */ for (;;) { _this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(_this.bits) <= bits) break; PULLBYTE(); } if (_this.op && (_this.op & 0xf0) == 0) { last = _this; for (;;) { _this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + _this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(_this.bits); state->length = (unsigned)_this.val; /* process literal */ if (_this.op == 0) { Tracevv((stderr, _this.val >= 0x20 && _this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", _this.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; } /* process end of block */ if (_this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ if (_this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ state->extra = (unsigned)(_this.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); /* get distance code */ for (;;) { _this = state->distcode[BITS(state->distbits)]; if ((unsigned)(_this.bits) <= bits) break; PULLBYTE(); } if ((_this.op & 0xf0) == 0) { last = _this; for (;;) { _this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + _this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(_this.bits); if (_this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)_this.val; /* get distance extra bits, if any */ state->extra = (unsigned)(_this.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } if (state->offset > state->wsize - (state->whave < state->wsize ? left : 0)) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); /* copy match from window to output */ do { ROOM(); copy = state->wsize - state->offset; if (copy < left) { from = put + copy; copy = left - copy; } else { from = put - state->offset; copy = left; } if (copy > state->length) copy = state->length; state->length -= copy; left -= copy; do { *put++ = *from++; } while (--copy); } while (state->length != 0); break; case DONE: /* inflate stream terminated properly -- write leftover output */ ret = Z_STREAM_END; if (left < state->wsize) { if (out(out_desc, state->window, state->wsize - left)) ret = Z_BUF_ERROR; } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; default: /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } /* Return unused input */ inf_leave: strm->next_in = next; strm->avail_in = have; return ret; } int ZEXPORT inflateBackEnd(z_streamp strm) { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } milkytracker-0.90.85+dfsg/src/compression/zlib/generic/zconf.h0000644000175000017500000002251010737746457023443 0ustar admin2admin2/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define deflatePrime z_deflatePrime # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define zError z_zError # define alloc_func z_alloc_func # define free_func z_free_func # define in_func z_in_func # define out_func z_out_func # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(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 * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # 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" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) # define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ milkytracker-0.90.85+dfsg/src/compression/zlib/generic/zutil.h0000644000175000017500000001531310737746457023476 0ustar admin2admin2/* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* 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. */ /* @(#) $Id$ */ #ifndef ZUTIL_H #define ZUTIL_H #define ZLIB_INTERNAL #include "zlib.h" #ifdef STDC # ifndef _WIN32_WCE # include # endif # include # include #endif #ifdef NO_ERRNO_H # ifdef _WIN32_WCE /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. We rename it to * avoid conflict with other libraries that use the same workaround. */ # define errno z_errno # endif extern int errno; #else # ifndef _WIN32_WCE # include # endif #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ return (strm->msg = (char*)ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default memLevel */ #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ /* target dependencies */ #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 # endif # else /* MSC or DJGPP */ # include # endif #endif #ifdef AMIGA # define OS_CODE 0x01 #endif #if defined(VAXC) || defined(VMS) # define OS_CODE 0x02 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif #if defined(ATARI) || defined(atarist) # define OS_CODE 0x05 #endif #ifdef OS2 # define OS_CODE 0x06 # ifdef M_I86 #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() */ # endif # endif #endif #ifdef TOPS20 # define OS_CODE 0x0a #endif #ifdef WIN32 # ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ # define OS_CODE 0x0b # endif #endif #ifdef __50SERIES /* Prime/PRIMOS */ # define OS_CODE 0x0f #endif #if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif #if (defined(_MSC_VER) && (_MSC_VER > 600)) # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED typedef int ptrdiff_t; # define _PTRDIFF_T_DEFINED # endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif #endif /* common defaults */ #ifndef OS_CODE # define OS_CODE 0x03 /* assume Unix */ #endif #ifndef F_OPEN # define F_OPEN(name, mode) fopen((name), (mode)) #endif /* 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) # define vsnprintf _vsnprintf # endif # endif # ifdef __SASC # define NO_vsnprintf # endif #endif #ifdef VMS # define NO_vsnprintf #endif #if defined(pyr) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) /* Use our own functions for small and medium model with MSC <= 5.0. * You may have to use the same strategy for Borland C (untested). * The __SC__ check is for Symantec. */ # define NO_MEMCPY #endif #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) # define HAVE_MEMCPY #endif #ifdef HAVE_MEMCPY # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ # define zmemcpy _fmemcpy # define zmemcmp _fmemcmp # define zmemzero(dest, len) _fmemset(dest, 0, len) # else # define zmemcpy memcpy # define zmemcmp memcmp # define zmemzero(dest, len) memset(dest, 0, len) # endif #else extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); extern void zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include extern int z_verbose; extern void z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} # define Tracevv(x) {if (z_verbose>1) fprintf x ;} # define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} # define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} #else # define Assert(cond,msg) # define Trace(x) # define Tracev(x) # define Tracevv(x) # define Tracec(c,x) # define Tracecv(c,x) #endif voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void zcfree OF((voidpf opaque, voidpf ptr)); #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);} #endif /* ZUTIL_H */ milkytracker-0.90.85+dfsg/src/compression/zlib/generic/trees.h0000644000175000017500000002037410737746457023454 0ustar admin2admin2/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 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, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; milkytracker-0.90.85+dfsg/src/compression/zlib/generic/uncompr.cpp0000644000175000017500000000400610737746457024342 0ustar admin2admin2/* uncompr.c -- decompress a memory buffer * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. 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. */ int ZEXPORT uncompress ( Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen ) { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit(&stream); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) return Z_DATA_ERROR; return err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } milkytracker-0.90.85+dfsg/src/compression/zlib/generic/inflate.cpp0000644000175000017500000013725510737746457024316 0ustar admin2admin2/* inflate.c -- zlib decompression * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Change history: * * 1.2.beta0 24 Nov 2002 * - First version -- complete rewrite of inflate to simplify code, avoid * creation of window when not needed, minimize use of window when it is * needed, make inffast.c even faster, implement gzip decoding, and to * improve code readability and style over the previous zlib inflate code * * 1.2.beta1 25 Nov 2002 * - Use pointers for available input and output checking in inffast.c * - Remove input and output counters in inffast.c * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 * - Remove unnecessary second byte pull from length extra in inffast.c * - Unroll direct copy to three copies per loop in inffast.c * * 1.2.beta2 4 Dec 2002 * - Change external routine names to reduce potential conflicts * - Correct filename to inffixed.h for fixed tables in inflate.c * - Make hbuf[] unsigned char to match parameter type in inflate.c * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) * to avoid negation problem on Alphas (64 bit) in inflate.c * * 1.2.beta3 22 Dec 2002 * - Add comments on state->bits assertion in inffast.c * - Add comments on op field in inftrees.h * - Fix bug in reuse of allocated window after inflateReset() * - Remove bit fields--back to byte structure for speed * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths * - Change post-increments to pre-increments in inflate_fast(), PPC biased? * - Add compile time option, POSTINC, to use post-increments instead (Intel?) * - Make MATCH copy in inflate() much faster for when inflate_fast() not used * - Use local copies of stream next and avail values, as well as local bit * buffer and bit count in inflate()--for speed when inflate_fast() not used * * 1.2.beta4 1 Jan 2003 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings * - Move a comment on output buffer sizes from inffast.c to inflate.c * - Add comments in inffast.c to introduce the inflate_fast() routine * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed * - Pull out common write == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new * source file infback.c to provide a call-back interface to inflate for * programs like gzip and unzip -- uses window as output buffer to avoid * window copying * * 1.2.beta5 1 Jan 2003 * - Improved inflateBack() interface to allow the caller to provide initial * input in strm. * - Fixed stored blocks bug in inflateBack() * * 1.2.beta6 4 Jan 2003 * - Added comments in inffast.c on effectiveness of POSTINC * - Typecasting all around to reduce compiler warnings * - Changed loops from while (1) or do {} while (1) to for (;;), again to * make compilers happy * - Changed type of window in inflateBackInit() to unsigned char * * * 1.2.beta7 27 Jan 2003 * - Changed many types to unsigned or unsigned short to avoid warnings * - Added inflateCopy() function * * 1.2.0 9 Mar 2003 * - Changed inflateBack() interface to provide separate opaque descriptors * for the in() and out() functions * - Changed inflateBack() argument and in_func typedef to swap the length * and buffer address return values for the input function * - Check next_in and next_out for Z_NULL on entry to inflate() * * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED # endif #endif /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, unsigned out)); #ifdef BUILDFIXED void makefixed OF((void)); #endif local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, unsigned len)); int ZEXPORT inflateReset(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; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; strm->adler = 1; /* to support ill-conceived Java test suite */ state->mode = HEAD; state->last = 0; state->havedict = 0; state->dmax = 32768U; state->head = Z_NULL; state->wsize = 0; state->whave = 0; state->write = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflatePrime(z_streamp strm, int bits, int value ) { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; state->hold += value << state->bits; state->bits += bits; return Z_OK; } int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, const char *version, int stream_size ) { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; if (windowBits < 0) { state->wrap = 0; windowBits = -windowBits; } else { state->wrap = (windowBits >> 4) + 1; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; #endif } if (windowBits < 8 || windowBits > 15) { ZFREE(strm, state); strm->state = Z_NULL; return Z_STREAM_ERROR; } state->wbits = (unsigned)windowBits; state->window = Z_NULL; return inflateReset(strm); } int ZEXPORT inflateInit_(z_streamp strm, const char *version, int stream_size ) { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } #ifdef MAKEFIXED #include /* Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also defines BUILDFIXED, so the tables are built on the fly. makefixed() writes those tables to stdout, which would be piped to inffixed.h. A small program can simply call makefixed to do this: void makefixed(void); int main(void) { makefixed(); return 0; } Then that can be linked with zlib built with MAKEFIXED defined and run: a.out > inffixed.h */ void makefixed() { unsigned low, size; struct inflate_state state; fixedtables(&state); puts(" /* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by makefixed()."); puts(" */"); puts(""); puts(" /* WARNING: this file should *not* be used by applications."); puts(" It is part of the implementation of this library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); size = 1U << 9; printf(" static const code lenfix[%u] = {", size); 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); if (++low == size) break; putchar(','); } puts("\n };"); size = 1U << 5; printf("\n static const code distfix[%u] = {", size); low = 0; for (;;) { if ((low % 6) == 0) printf("\n "); printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); } #endif /* MAKEFIXED */ /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this inflate call, but the end of the deflate stream has not been reached yet. It is also called to create a window for dictionary data when a dictionary is loaded. Providing output buffers larger than 32K to inflate() should provide a speed advantage, since only the last 32K of output is copied to the sliding window upon return from inflate(), and since all distances after the first 32K of output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ local int updatewindow(z_streamp strm, unsigned out ) { struct inflate_state FAR *state; unsigned copy, dist; state = (struct inflate_state FAR *)strm->state; /* if it hasn't been done already, allocate space for the window */ if (state->window == Z_NULL) { state->window = (unsigned char FAR *) ZALLOC(strm, 1U << state->wbits, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; } /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; state->write = 0; state->whave = 0; } /* copy state->wsize or less output bytes into the circular window */ copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); state->write = 0; state->whave = state->wsize; } else { dist = state->wsize - state->write; if (dist > copy) dist = copy; zmemcpy(state->window + state->write, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); state->write = copy; state->whave = state->wsize; } else { state->write += dist; if (state->write == state->wsize) state->write = 0; if (state->whave < state->wsize) state->whave += dist; } } return 0; } /* Macros for inflate(): */ /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP # define UPDATE(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else # define UPDATE(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ #ifdef GUNZIP # define CRC2(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ check = crc32(check, hbuf, 2); \ } while (0) # define CRC4(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ hbuf[2] = (unsigned char)((word) >> 16); \ hbuf[3] = (unsigned char)((word) >> 24); \ check = crc32(check, hbuf, 4); \ } while (0) #endif /* Load registers with state in inflate() for speed */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Restore state from registers in inflate() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflate(). */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ 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 structured roughly as follows: for (;;) switch (state) { ... case STATEn: if (not enough input data or output space to make progress) return; ... make progress ... state = STATEm; break; ... } so when inflate() is called again, the same case is attempted again, and if the appropriate resources are provided, the machine proceeds to the next state. The NEEDBITS() macro is usually the way the state evaluates whether it can proceed or should return. NEEDBITS() does the return if the requested bits are not available. The typical use of the BITS macros is: NEEDBITS(n); ... do something with BITS(n) ... DROPBITS(n); where NEEDBITS(n) either returns from inflate() if there isn't enough input left to load n bits into the accumulator, or it continues. BITS(n) gives the low n bits in the accumulator. When done, DROPBITS(n) drops the low n bits off the accumulator. INITBITS() clears the accumulator and sets the number of available bits to zero. BYTEBITS() discards just enough bits to put the accumulator on a byte boundary. After BYTEBITS() and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return if there is no input available. The decoding of variable length codes uses PULLBYTE() directly in order to pull just enough bytes to decode the next code, and no more. Some states loop until they get enough input, making sure that enough state information is maintained to continue the loop where it left off if NEEDBITS() returns in the loop. For example, want, need, and keep would all have to actually be part of the saved state in case NEEDBITS() returns: case STATEw: while (want < need) { NEEDBITS(n); keep[want++] = BITS(n); DROPBITS(n); } state = STATEx; case STATEx: As shown above, if the next state is also the next case, then the break is omitted. A state may also return if there is not enough output space available to complete that state. Those states are copying stored data, writing a literal byte, and copying a matching string. When returning, a "goto inf_leave" is used to update the total counters, update the check value, and determine whether any progress has been made during that inflate() call in order to return the proper return code. Progress is defined as a change in either strm->avail_in or strm->avail_out. When there is a window, goto inf_leave will update the window with the last output written. If a goto inf_leave occurs in the middle of decompression and there is no window currently, goto inf_leave will create one and copy output to the window for the next call of inflate(). In this implementation, the flush parameter of inflate() only affects the return code (per zlib.h). inflate() always writes as much as possible to strm->next_out, given the space available and the provided input--the effect documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers the allocation of and copying into a sliding window until necessary, which provides the effect documented in zlib.h for Z_FINISH when the entire input stream available. So the only thing the flush parameter actually does is: when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it will return Z_BUF_ERROR if it has not reached the end of the stream. */ int ZEXPORT inflate(z_streamp strm, int flush ) { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code _this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ LOAD(); in = have; out = left; ret = Z_OK; for (;;) switch (state->mode) { case HEAD: if (state->wrap == 0) { state->mode = TYPEDO; break; } NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); state->mode = FLAGS; break; } state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ #else if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { strm->msg = (char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } DROPBITS(4); len = BITS(4) + 8; if (len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; } state->dmax = 1U << len; Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) { strm->msg = (char *)"unknown header flags set"; state->mode = BAD; break; } if (state->head != Z_NULL) state->head->text = (int)((hold >> 8) & 1); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->head != Z_NULL) state->head->time = hold; if (state->flags & 0x0200) CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: NEEDBITS(16); if (state->head != Z_NULL) { state->head->xflags = (int)(hold & 0xff); state->head->os = (int)(hold >> 8); } if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); state->length = (unsigned)(hold); if (state->head != Z_NULL) state->head->extra_len = (unsigned)hold; if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); } else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && state->head->extra != Z_NULL) { len = state->head->extra_len - state->length; zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); } if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; state->length -= copy; } if (state->length) goto inf_leave; } state->length = 0; state->mode = NAME; case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->name != Z_NULL && state->length < state->head->name_max) state->head->name[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->comment != Z_NULL && state->length < state->head->comm_max) state->head->comment[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if (hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; } INITBITS(); } if (state->head != Z_NULL) { state->head->hcrc = (int)((state->flags >> 9) & 1); state->head->done = 1; } strm->adler = state->check = crc32(0L, Z_NULL, 0); state->mode = TYPE; break; #endif case DICTID: NEEDBITS(32); strm->adler = state->check = REVERSE(hold); INITBITS(); state->mode = DICT; case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: if (flush == Z_BLOCK) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); state->mode = CHECK; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); state->mode = COPY; case COPY: copy = state->length; if (copy) { if (copy > have) copy = have; if (copy > left) copy = left; if (copy == 0) goto inf_leave; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; break; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { _this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(_this.bits) <= bits) break; PULLBYTE(); } if (_this.val < 16) { NEEDBITS(_this.bits); DROPBITS(_this.bits); state->lens[state->have++] = _this.val; } else { if (_this.val == 16) { NEEDBITS(_this.bits + 2); DROPBITS(_this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (_this.val == 17) { NEEDBITS(_this.bits + 3); DROPBITS(_this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(_this.bits + 7); DROPBITS(_this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); break; } for (;;) { _this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(_this.bits) <= bits) break; PULLBYTE(); } if (_this.op && (_this.op & 0xf0) == 0) { last = _this; for (;;) { _this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + _this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(_this.bits); state->length = (unsigned)_this.val; if ((int)(_this.op) == 0) { Tracevv((stderr, _this.val >= 0x20 && _this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", _this.val)); state->mode = LIT; break; } if (_this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } if (_this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } state->extra = (unsigned)(_this.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); state->mode = DIST; case DIST: for (;;) { _this = state->distcode[BITS(state->distbits)]; if ((unsigned)(_this.bits) <= bits) break; PULLBYTE(); } if ((_this.op & 0xf0) == 0) { last = _this; for (;;) { _this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + _this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(_this.bits); if (_this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)_this.val; state->extra = (unsigned)(_this.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif if (state->offset > state->whave + out - left) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->write) { copy -= state->write; from = state->window + (state->wsize - copy); } else from = state->window + (state->write - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ from = put - state->offset; copy = state->length; } if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = *from++; } while (--copy); if (state->length == 0) state->mode = LEN; break; case LIT: if (left == 0) goto inf_leave; *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; case CHECK: if (state->wrap) { NEEDBITS(32); out -= left; strm->total_out += out; state->total += out; if (out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; if (( #ifdef GUNZIP state->flags ? hold : #endif REVERSE(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: check matches trailer\n")); } #ifdef GUNZIP state->mode = LENGTH; case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); if (hold != (state->total & 0xffffffffUL)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: length matches trailer\n")); } #endif state->mode = DONE; case DONE: ret = Z_STREAM_END; goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR; } /* Return from inflate(), updating the total counts and the check value. If there was no progress during the inflate() call, return a buffer error. Call updatewindow() to create and/or update the window state. Note: a memory error from inflate() is non-recoverable. */ inf_leave: RESTORE(); if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) if (updatewindow(strm, out)) { state->mode = MEM; return Z_MEM_ERROR; } in -= strm->avail_in; out -= strm->avail_out; strm->total_in += in; strm->total_out += out; state->total += out; if (state->wrap && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; } int ZEXPORT inflateEnd(z_streamp strm) { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength ) { struct inflate_state FAR *state; unsigned long id; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; /* check for correct dictionary id */ if (state->mode == DICT) { id = adler32(0L, Z_NULL, 0); id = adler32(id, dictionary, dictLength); if (id != state->check) return Z_DATA_ERROR; } /* copy dictionary to window */ if (updatewindow(strm, strm->avail_out)) { 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; } int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head ) { struct inflate_state FAR *state; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; /* save header structure */ state->head = head; head->done = 0; return Z_OK; } /* Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found or when out of input. When called, *have is the number of pattern bytes found in order so far, in 0..3. On return *have is updated to the new state. If on return *have equals four, then the pattern was found and the return value is how many bytes were read including the last byte of the pattern. If *have is less than four, then the pattern has not been found yet and the return value is len. In the latter case, syncsearch() can be called again with more data and the *have state. *have is initialized to zero for the first call. */ local unsigned syncsearch(unsigned FAR *have, unsigned char FAR *buf, unsigned len ) { unsigned got; unsigned next; got = *have; next = 0; while (next < len && got < 4) { if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) got++; else if (buf[next]) got = 0; else got = 4 - got; next++; } *have = got; return next; } int ZEXPORT inflateSync(z_streamp strm) { unsigned len; /* number of bytes to look at or looked at */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; /* check parameters */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; state->hold <<= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { buf[len++] = (unsigned char)(state->hold); state->hold >>= 8; state->bits -= 8; } state->have = 0; syncsearch(&(state->have), buf, len); } /* search available input */ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); strm->avail_in -= len; strm->next_in += len; strm->total_in += len; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; state->mode = TYPE; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(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; return state->mode == STORED && state->bits == 0; } int ZEXPORT inflateCopy(z_streamp dest, z_streamp source ) { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; unsigned wsize; /* check input */ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; /* allocate space */ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR; window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *) ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); if (window == Z_NULL) { ZFREE(source, copy); return Z_MEM_ERROR; } } /* copy state */ zmemcpy(dest, source, sizeof(z_stream)); zmemcpy(copy, state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); copy->distcode = copy->codes + (state->distcode - state->codes); } copy->next = copy->codes + (state->next - state->codes); if (window != Z_NULL) { wsize = 1U << state->wbits; zmemcpy(window, state->window, wsize); } copy->window = window; dest->state = (struct internal_state FAR *)copy; return Z_OK; } milkytracker-0.90.85+dfsg/src/compression/zlib/generic/deflate.h0000644000175000017500000002752210737746457023740 0ustar admin2admin2/* deflate.h -- internal compression state * Copyright (C) 1995-2004 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* 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. */ /* @(#) $Id$ */ #ifndef DEFLATE_H #define DEFLATE_H #include "zutil.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip encoding should be left enabled. */ #ifndef NO_GZIP # define GZIP #endif /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 #define COMMENT_STATE 91 #define HCRC_STATE 103 #define BUSY_STATE 113 #define FINISH_STATE 666 /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ uInt pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ uInt gzindex; /* where in extra, name, or comment */ Byte method; /* STORED (for zip only) or DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ 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 */ 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 */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ 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 */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ /* in trees.c */ void _tr_init OF((deflate_state *s)); int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); void _tr_align OF((deflate_state *s)); void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch _length_code[]; extern uch _dist_code[]; #else extern const uch _length_code[]; extern const uch _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (length); \ ush dist = (distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif /* DEFLATE_H */ milkytracker-0.90.85+dfsg/src/compression/zlib/generic/inffast.h0000644000175000017500000000062710737746457023763 0ustar admin2admin2/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* 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. */ void inflate_fast OF((z_streamp strm, unsigned start)); milkytracker-0.90.85+dfsg/src/compression/zlib/generic/inflate.h0000644000175000017500000001343410737746457023753 0ustar admin2admin2/* inflate.h -- internal inflate state definition * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* 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. */ /* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif /* Possible inflate modes between inflate() calls */ typedef enum { HEAD, /* i: waiting for magic header */ FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ EXLEN, /* i: waiting for extra length (gzip) */ EXTRA, /* i: waiting for extra bytes (gzip) */ NAME, /* i: waiting for end of file name (gzip) */ COMMENT, /* i: waiting for end of comment (gzip) */ HCRC, /* i: waiting for header crc (gzip) */ DICTID, /* i: waiting for dictionary check value */ DICT, /* waiting for inflateSetDictionary() call */ TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ LEN, /* i: waiting for length/lit code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ MATCH, /* o: waiting for output space to copy string */ LIT, /* o: waiting for output space to write literal */ CHECK, /* i: waiting for 32-bit check value */ LENGTH, /* i: waiting for 32-bit length (gzip) */ DONE, /* finished check, done -- remain here until reset */ BAD, /* got a data error -- remain here until reset */ MEM, /* got an inflate() memory error -- remain here until reset */ SYNC /* looking for synchronization bytes to restart inflate() */ } inflate_mode; /* State transitions between above modes - (most modes can go to the BAD or MEM mode -- not shown for clarity) Process header: HEAD -> (gzip) or (zlib) (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME NAME -> COMMENT -> HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE Read deflate blocks: TYPE -> STORED or TABLE or LEN or CHECK STORED -> COPY -> TYPE TABLE -> LENLENS -> CODELENS -> LEN Read deflate codes: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN Process trailer: CHECK -> LENGTH -> DONE */ /* state maintained between inflate() calls. Approximately 7K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ gz_headerp head; /* where to save gzip header information */ /* sliding window */ unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ unsigned bits; /* number of bits in "in" */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */ /* for table and code decoding */ unsigned extra; /* extra bits needed */ /* fixed and dynamic code tables */ code const FAR *lencode; /* starting table for length/literal codes */ code const FAR *distcode; /* starting table for distance codes */ unsigned lenbits; /* index bits for lencode */ unsigned distbits; /* index bits for distcode */ /* dynamic table building */ unsigned ncode; /* number of code length code lengths */ unsigned nlen; /* number of length code lengths */ unsigned ndist; /* number of distance code lengths */ unsigned have; /* number of code lengths in lens[] */ code FAR *next; /* next available space in codes[] */ unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ }; milkytracker-0.90.85+dfsg/src/compression/zlib/generic/deflate.cpp0000644000175000017500000017423510737746457024277 0ustar admin2admin2/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://www.ietf.org/rfc/rfc1951.txt * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $Id$ */ #include "deflate.h" const char deflate_copyright[] = " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; /* 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 include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #endif local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ #ifndef NO_DUMMY_DECL struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_( z_streamp strm, int level, const char *version, int stream_size ) { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_( z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size ) { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->wrap = wrap; s->gzhead = Z_NULL; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary ( z_streamp strm, const Bytef *dictionary, uInt dictLength ) { deflate_state *s; uInt length = dictLength; uInt n; IPos hash_head = 0; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || strm->state->wrap == 2 || (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) return Z_STREAM_ERROR; s = strm->state; if (s->wrap) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; if (length > MAX_DIST(s)) { length = MAX_DIST(s); dictionary += dictLength - length; /* use the tail of the dictionary */ } 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); } if (hash_head) hash_head = 0; /* to make compiler happy */ return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (z_streamp strm) { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); lm_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateSetHeader ( z_streamp strm, gz_headerp head ) { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime ( z_streamp strm, int bits, int value ) { 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)); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams( z_streamp strm, int level, int strategy ) { deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if (func != configuration_table[level].func && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_PARTIAL_FLUSH); } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= */ int ZEXPORT deflateTune( z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain ) { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; s->good_match = good_length; s->max_lazy_match = max_lazy; s->nice_match = nice_length; s->max_chain_length = max_chain; return Z_OK; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds * for every combination of windowBits and memLevel, as well as wrap. * But even the conservative upper bound of about 14% expansion does not * seem onerous for output buffer allocation. */ uLong ZEXPORT deflateBound( z_streamp strm, uLong sourceLen ) { deflate_state *s; uLong destLen; /* conservative upper bound */ destLen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; /* if can't get parameters, return conservative bound */ if (strm == Z_NULL || strm->state == Z_NULL) return destLen; /* if not default parameters, return conservative bound */ s = strm->state; if (s->w_bits != 15 || s->hash_bits != 8 + 7) return destLen; /* default settings: return tight bound for that case */ return compressBound(sourceLen); } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB ( deflate_state *s, uInt b ) { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(z_streamp strm) { unsigned len = strm->state->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, strm->state->pending_out, len); strm->next_out += len; strm->state->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; } } /* ========================================================================= */ int ZEXPORT deflate ( z_streamp strm, int flush) { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_FINISH || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the header */ if (s->status == INIT_STATE) { #ifdef GZIP if (s->wrap == 2) { strm->adler = crc32(0L, Z_NULL, 0); put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); if (s->gzhead == NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, OS_CODE); s->status = BUSY_STATE; } else { put_byte(s, (s->gzhead->text ? 1 : 0) + (s->gzhead->hcrc ? 2 : 0) + (s->gzhead->extra == Z_NULL ? 0 : 4) + (s->gzhead->name == Z_NULL ? 0 : 8) + (s->gzhead->comment == Z_NULL ? 0 : 16) ); put_byte(s, (Byte)(s->gzhead->time & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); if (s->gzhead->extra != NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } if (s->gzhead->hcrc) strm->adler = crc32(strm->adler, s->pending_buf, s->pending); s->gzindex = 0; s->status = EXTRA_STATE; } } else #endif { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); } } #ifdef GZIP if (s->status == EXTRA_STATE) { if (s->gzhead->extra != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) break; } put_byte(s, s->gzhead->extra[s->gzindex]); s->gzindex++; } if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (s->gzindex == s->gzhead->extra_len) { s->gzindex = 0; s->status = NAME_STATE; } } else s->status = NAME_STATE; } if (s->status == NAME_STATE) { if (s->gzhead->name != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->name[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) { s->gzindex = 0; s->status = COMMENT_STATE; } } else s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { if (s->gzhead->comment != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->comment[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) s->status = HCRC_STATE; } else s->status = HCRC_STATE; } if (s->status == HCRC_STATE) { if (s->gzhead->hcrc) { if (s->pending + 2 > s->pending_buf_size) flush_pending(strm); if (s->pending + 2 <= s->pending_buf_size) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); strm->adler = crc32(0L, Z_NULL, 0); s->status = BUSY_STATE; } } else s->status = BUSY_STATE; } #endif /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * 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 && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (z_streamp strm) { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != EXTRA_STATE && status != NAME_STATE && status != COMMENT_STATE && status != HCRC_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy ( z_streamp dest, z_streamp source ) { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; zmemcpy(dest, 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)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* 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(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf( z_streamp strm, Bytef *buf, unsigned size ) { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, strm->next_in, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, strm->next_in, len); } #endif zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (deflate_state *s) { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifndef FASTEST #ifdef ASMV match_init(); /* initialize the asm code */ #endif #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match( deflate_state *s, IPos cur_match ) { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2. Note that the checks below * for insufficient lookahead only occur occasionally for performance * reasons. Therefore uninitialized memory will be accessed, and * conditional jumps will be made that depend on those values. * However the length of the match is limited to the lookahead, so * the output of deflate is not affected by the uninitialized values. */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #endif /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for level == 1 or strategy == Z_RLE only */ local uInt longest_match_fast( deflate_state *s, IPos cur_match ) { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(deflate_state *s) { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ /* %%% avoid this when Z_RLE */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) return; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); 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 MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif } /* 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. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, eof) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (eof)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, eof) { \ FLUSH_BLOCK_ONLY(s, eof); \ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(deflate_state *s, int flush ) { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast( deflate_state *s, int flush ) { IPos hash_head = NIL; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ #ifdef FASTEST if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { s->match_length = longest_match_fast (s, hash_head); } #else if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } #endif /* longest_match() or longest_match_fast() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow( deflate_state *s, int flush ) { IPos hash_head = NIL; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } /* longest_match() or longest_match_fast() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _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; } #endif /* FASTEST */ #if 0 /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ uInt run; /* length of run */ uInt max; /* maximum length of run */ uInt prev; /* byte at distance one to match */ Bytef *scan; /* scan for end of run */ 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. */ if (s->lookahead < MAX_MATCH) { fill_window(s); if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ run = 0; if (s->strstart > 0) { /* if there is a previous byte, that is */ max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; scan = s->window + s->strstart - 1; prev = *scan++; do { if (*scan++ != prev) break; } while (++run < max); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ if (run >= MIN_MATCH) { check_match(s, s->strstart, s->strstart - 1, run); _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); s->lookahead -= run; s->strstart += run; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif milkytracker-0.90.85+dfsg/src/compression/zlib/generic/adler32.cpp0000644000175000017500000001062010737746457024112 0ustar admin2admin2/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" #define BASE 65521UL /* 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 */ #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #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 */ #ifdef NO_DIVIDE # define MOD(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); \ if (a >= BASE) a -= BASE; \ } while (0) # define MOD4(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); \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE # define MOD4(a) a %= BASE #endif /* ========================================================================= */ uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) { unsigned long sum2; unsigned n; /* split Adler-32 into component sums */ sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; /* in case user likes doing a byte at a time, keep it fast */ if (len == 1) { adler += buf[0]; if (adler >= BASE) adler -= BASE; sum2 += adler; if (sum2 >= BASE) sum2 -= BASE; return adler | (sum2 << 16); } /* initial Adler-32 value (deferred check for len == 1 speed) */ if (buf == Z_NULL) return 1L; /* in case short lengths are provided, keep it somewhat fast */ if (len < 16) { while (len--) { adler += *buf++; sum2 += adler; } if (adler >= BASE) adler -= BASE; MOD4(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } /* do length NMAX blocks -- requires just one modulo operation */ while (len >= NMAX) { len -= NMAX; n = NMAX / 16; /* NMAX is divisible by 16 */ do { DO16(buf); /* 16 sums unrolled */ buf += 16; } while (--n); MOD(adler); MOD(sum2); } /* do remaining bytes (less than NMAX, still just one modulo) */ if (len) { /* avoid modulos if none remaining */ while (len >= 16) { len -= 16; DO16(buf); buf += 16; } while (len--) { adler += *buf++; sum2 += adler; } MOD(adler); MOD(sum2); } /* return recombined sums */ return adler | (sum2 << 16); } /* ========================================================================= */ uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) { unsigned long sum1; unsigned long sum2; unsigned rem; /* the derivation of this formula is left as an exercise for the reader */ rem = (unsigned)(len2 % BASE); sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 > BASE) sum1 -= BASE; if (sum1 > BASE) sum1 -= BASE; if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); if (sum2 > BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } milkytracker-0.90.85+dfsg/src/compression/zlib/generic/zlib.h0000644000175000017500000020121410737746457023264 0ustar admin2admin2/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.3, July 18th, 2005 Copyright (C) 1995-2005 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 arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu 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). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.3" #define ZLIB_VERNUM 0x1230 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. This library can optionally read and write gzip streams in memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { 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 */ 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 */ 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 */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; typedef gz_header FAR *gz_headerp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_FIXED 4 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumualte before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. 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. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it gets to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. inflate() should normally be called until it returns Z_STREAM_END or an 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. 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 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 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, 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 only if the checksum is correct. inflate() will decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically. 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. 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 been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid method). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, 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). 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 used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size in deflate or deflate2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. In addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) 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(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters. deflateTune() can be called after deflateInit() or deflateInit2(), and returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(). This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less 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. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information in the provided gz_header structure are written to the gzip header (xflag is ignored -- the extra flags are set according to the compression level). The caller must assure that, if not Z_NULL, name and comment are terminated with a zero byte, and that if extra is not Z_NULL, that extra_len bytes are available there. If hcrc is true, a gzip header crc is included. Note that the current versions of the command-line version of gzip (up through version 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, 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. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ 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 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. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int bits, int value)); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the middle of a byte. The provided bits will be used before any bytes are used from next_in. This function should only be used with raw inflate, and should be used before the first inflate() call after inflateInit2() or inflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the input. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be no gzip header information forthcoming. Note that Z_BLOCK can be used to force inflate() to return immediately after header processing is complete and before any actual data is decompressed. The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, terminated with a zero unless the length is greater than comm_max. When any of extra, name, or comment are not Z_NULL and the respective field is not present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. 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 allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is more efficient than inflate() for file i/o applications in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. This function trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. This function can be used to compress a whole file at once if the input file is mmap'ed. compress 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. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 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, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. 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. */ typedef voidp gzFile; ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h", or 'R' for run-length encoding as in "wb1R". (See the description of deflateInit2 for more information about the strategy parameter.) 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. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen() associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (in the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd), mode) closes the file descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). gzdopen returns NULL if there was insufficient memory to allocate the (de)compression state. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ 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. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). The number of uncompressed bytes written is limited to 4095. The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ 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. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read again later. Only one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if a character has been pushed but not read yet, or if c is -1. The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. */ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); /* Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns 1 if file is being read directly without decompression, otherwise zero. */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); /* 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. */ 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 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. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); /* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and len2. */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, sizeof(z_stream)) #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); #ifdef __cplusplus } #endif #endif /* ZLIB_H */ milkytracker-0.90.85+dfsg/src/compression/zlib/generic/inftrees.cpp0000644000175000017500000003265210737746457024506 0ustar admin2admin2/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #define MAXBITS 15 const char inflate_copyright[] = " inflate 1.2.3 Copyright 1995-2005 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 include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* Build a set of tables to decode the provided canonical Huffman code. The code lengths are lens[0..codes-1]. The result starts at *table, whose indices are 0..2^bits-1. work is a writable array of at least lens shorts, which is used as a work area. type is the type of code to be generated, CODES, LENS, or DISTS. On return, zero is success, -1 is an invalid code, and +1 means that ENOUGH isn't enough. table on return points to the next available entry's address. bits is the requested root table index bits, and on return it is the actual root table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ int inflate_table(codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work ) { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ unsigned root; /* number of index bits for root table */ unsigned curr; /* number of index bits for current table */ unsigned drop; /* code bits to drop for sub-table */ int left; /* number of prefix codes available */ unsigned used; /* code entries in table used */ unsigned huff; /* Huffman code */ unsigned incr; /* for incrementing code, index */ unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ code _this; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ int end; /* use base and extra for symbol > end */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 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, 201, 196}; 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, 8193, 12289, 16385, 24577, 0, 0}; static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64}; /* Process a set of code lengths to create a canonical Huffman code. The code lengths are lens[0..codes-1]. Each length corresponds to the symbols 0..codes-1. The Huffman code is generated by first sorting the symbols by length from short to long, and retaining the symbol order for codes with equal lengths. Then the code starts with all zero bits for the first code of the shortest length, and the codes are integer increments for the same length, and zeros are appended as the length increases. For the deflate format, these bits are stored backwards from their more natural integer increment ordering, and so when the decoding tables are built in the large loop below, the integer codes are incremented backwards. This routine assumes, but does not check, that all of the entries in lens[] are in the range 0..MAXBITS. The caller must assure this. 1..MAXBITS is interpreted as that code length. zero means that that symbol does not occur in this code. The codes are sorted by computing a count of codes for each length, creating from that a table of starting indices for each length in the sorted table, and then entering the symbols in order in the sorted table. The sorted table is work[], with that space being provided by the caller. The length counts are used for other purposes as well, i.e. finding the minimum and maximum length codes, determining if there are any codes at all, checking for a valid set of lengths, and looking ahead at length counts to determine sub-table sizes when building the decoding tables. */ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ for (len = 0; len <= MAXBITS; len++) count[len] = 0; for (sym = 0; sym < codes; sym++) count[lens[sym]]++; /* bound code lengths, force root to be within code lengths */ root = *bits; for (max = MAXBITS; max >= 1; max--) if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ _this.op = (unsigned char)64; /* invalid code marker */ _this.bits = (unsigned char)1; _this.val = (unsigned short)0; *(*table)++ = _this; /* make a table to force an error */ *(*table)++ = _this; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } for (min = 1; min <= MAXBITS; min++) if (count[min] != 0) break; if (root < min) root = min; /* check for an over-subscribed or incomplete set of lengths */ left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) return -1; /* over-subscribed */ } if (left > 0 && (type == CODES || max != 1)) return -1; /* incomplete set */ /* generate offsets into symbol table for each length for sorting */ offs[1] = 0; for (len = 1; len < MAXBITS; len++) offs[len + 1] = offs[len] + count[len]; /* sort symbols by length, by symbol order within each length */ for (sym = 0; sym < codes; sym++) if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; /* Create and fill in decoding tables. In this loop, the table being filled is at next and has curr index bits. The code being used is huff with length len. That code is converted to an index by dropping drop bits off of the bottom. For codes where len is less than drop + curr, those top drop + curr - len bits are incremented through all values to fill the table with replicated entries. root is the number of index bits for the root table. When len exceeds root, sub-tables are created pointed to by the root entry with an index of the low root bits of huff. This is saved in low to check for when a new sub-table should be started. drop is zero when the root table is being filled, and drop is root when sub-tables are being filled. When a new sub-table is needed, it is necessary to look ahead in the code lengths to determine what size sub-table is needed. The length counts are used for this, and so count[] is decremented as codes are entered in the tables. used keeps track of how many table entries have been allocated from the provided *table space. It is checked when a LENS table is being made against the space in *table, ENOUGH, minus the maximum space needed by the worst case distance code, MAXD. This should never happen, but the sufficiency of ENOUGH has not been proven exhaustively, hence the check. This assumes that when type == LENS, bits == 9. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This routine permits incomplete codes, so another loop after this one fills in the rest of the decoding tables with invalid code markers. */ /* set up for code type */ switch (type) { case CODES: base = extra = work; /* dummy value--not used */ end = 19; break; case LENS: base = lbase; base -= 257; extra = lext; extra -= 257; end = 256; break; default: /* DISTS */ base = dbase; extra = dext; end = -1; } /* initialize state for loop */ huff = 0; /* starting code */ sym = 0; /* starting code symbol */ len = min; /* starting code length */ next = *table; /* current table to fill in */ curr = root; /* current table index bits */ drop = 0; /* current bits to drop from code for index */ low = (unsigned)(-1); /* trigger new sub-table when len > root */ used = 1U << root; /* use root table entries */ mask = used - 1; /* mask for comparing low */ /* check available table space */ if (type == LENS && used >= ENOUGH - MAXD) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ _this.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { _this.op = (unsigned char)0; _this.val = work[sym]; } else if ((int)(work[sym]) > end) { _this.op = (unsigned char)(extra[work[sym]]); _this.val = base[work[sym]]; } else { _this.op = (unsigned char)(32 + 64); /* end of block */ _this.val = 0; } /* replicate for those indices with low len bits equal to huff */ incr = 1U << (len - drop); fill = 1U << curr; min = fill; /* save offset to next table */ do { fill -= incr; next[(huff >> drop) + fill] = _this; } while (fill != 0); /* 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; /* go to next symbol, update count, len */ sym++; if (--(count[len]) == 0) { if (len == max) break; len = lens[work[sym]]; } /* create new sub-table if needed */ if (len > root && (huff & mask) != low) { /* if first time, transition to sub-tables */ if (drop == 0) drop = root; /* increment past last table */ next += min; /* here min is 1 << curr */ /* determine length of next table */ curr = len - drop; left = (int)(1 << curr); while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) break; curr++; left <<= 1; } /* check for enough space */ used += 1U << curr; if (type == LENS && used >= ENOUGH - MAXD) return 1; /* point entry in root table to sub-table */ low = huff & mask; (*table)[low].op = (unsigned char)curr; (*table)[low].bits = (unsigned char)root; (*table)[low].val = (unsigned short)(next - *table); } } /* 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. */ _this.op = (unsigned char)64; /* invalid code marker */ _this.bits = (unsigned char)(len - drop); _this.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; _this.bits = (unsigned char)len; } /* put invalid code marker in table */ next[huff >> drop] = _this; /* 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; } /* set return parameters */ *table += used; *bits = root; return 0; } milkytracker-0.90.85+dfsg/src/compression/DecompressorZIP.h0000755000175000017500000000315011172163710022755 0ustar admin2admin2/* * compression/DecompressorZIP.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DecompressorZIP.h * milkytracker_universal * * Created by Peter Barth on 22.06.08. * */ #ifndef __DECOMPRESSOR_ZIP_H__ #define __DECOMPRESSOR_ZIP_H__ #include "Decompressor.h" /***************************************************************************** * ZIP decompressor *****************************************************************************/ class DecompressorZIP : public DecompressorBase { public: DecompressorZIP(const PPSystemString& filename); virtual bool identify(XMFile& f); // this type of archive only contain modules virtual bool doesServeHint(Hints hint) { return (hint == HintAll || hint == HintModules); } virtual const PPSimpleVector& getDescriptors(Hints hint) const; virtual bool decompress(const PPSystemString& outFilename, Hints hint); virtual DecompressorBase* clone(); }; #endif milkytracker-0.90.85+dfsg/src/Makefile.am0000644000175000017500000000017211135201273017241 0ustar admin2admin2SUBDIRS = milkyplay ${RTMIDI_DIR} ppui fx compression tracker DIST_SUBDIRS = milkyplay midi ppui fx compression tracker milkytracker-0.90.85+dfsg/src/fx/0000755000175000017500000000000011317506534015634 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/fx/ParticleScene.cpp0000644000175000017500000001132211150223367021053 0ustar admin2admin2/* * fx/ParticleScene.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "Math3d.h" #include "ParticleScene.h" #include "ParticleEmitter.h" #include "ParticleFun.h" #include "TexturedPlane.h" #include "TCBSpline.h" #include "Camera.h" #define MAXKEYS 1000 #define TIME_SCALE 20 static TCBSpline* cameraPosTrackSpline = new TCBSpline(MAXKEYS); static TCBSpline* cameraTargetTrackSpline = new TCBSpline(MAXKEYS); static TCBSpline* emitterTrackSpline = new TCBSpline(MAXKEYS); static TCBSpline* cameraRollTrackSpline = new TCBSpline(MAXKEYS); static int Time = 0; TCBSpline::TKey genPosKey(int Time) { int offset = (rand()&31)-15; float t = (((Time-offset)/99.0f)*512*16.0f); float radius = (float)(rand()&31)+20.0f; float py = (rand()%60)-30.0f; float px = (float)sin((float)t/128.0f*M_PI)*radius; float pz = (float)cos((float)t/128.0f*M_PI)*radius; VectorFloat v(px, py, pz); TCBSpline::TKey k; k.ti = Time*TIME_SCALE; k.t = 0.90f; k.c = 0.0f; k.b = 0.0f; k.v = v; return k; } TCBSpline::TKey genTargetKey(int Time) { return genPosKey(Time); /*float t = (Time/99.0f)*512*32.0f; float radius = 5.0f; //(float)(rand()&3); float py = (rand()&7)-4.0f; float px = (float)sin((float)t/128.0f*M_PI)*radius; float pz = (float)cos((float)t/128.0f*M_PI)*radius; VectorFloat v(px, py, pz); TCBSpline::TKey k; k.ti = Time*TIME_SCALE; k.t = 1.0f; k.c = 0.0f; k.b = 0.0f; k.v = v; return k;*/ } TCBSpline::TKey genRollKey(int Time) { float px = (rand()%360)-180.0f; float py = 0.0f; float pz = 0.0f; VectorFloat v(px, py, pz); TCBSpline::TKey k; k.ti = Time*TIME_SCALE; k.t = 1.0f; k.c = 0.0f; k.b = 0.0f; k.v = v; return k; } ParticleScene::ParticleScene(int width, int height, int gridshift) { this->width = width; this->height = height; particleFX = new ParticleEmitter(width, height, 192, 1, 1000); particleFX->setZOffset(0); particleFun = new ParticleFun(width, height, 192); texturedGrid = new TexturedPlane(width, height, gridshift); for (Time = 0; Time < MAXKEYS; Time++) { TCBSpline::TKey k = genPosKey(Time); cameraPosTrackSpline->setKey(Time, k); k = genTargetKey(Time); emitterTrackSpline->setKey(Time, k); float xo = (rand()&15)-7.0f; float yo = (rand()&15)-7.0f; float zo = (rand()&15)-7.0f; k.v.x+=xo; k.v.y+=yo; k.v.z+=zo; cameraTargetTrackSpline->setKey(Time, k); k = genRollKey(Time); cameraRollTrackSpline->setKey(Time, k); } time = 0.0f; } ParticleScene::~ParticleScene() { delete texturedGrid; delete particleFX; delete particleFun; } void ParticleScene::update(float syncFrac) { Camera cam; cam.position = cameraPosTrackSpline->getPos(time).convertToFixedPoint(); cam.target = cameraTargetTrackSpline->getPos(time).convertToFixedPoint(); cam.bank = 0.0f; //cam.bank = cameraRollTrackSpline->getPos(time).x; time+=syncFrac*0.15f; if (time > cameraPosTrackSpline->getKey(MAXKEYS-1)->ti) { time = 0.0f; } // update particle emitter stuff VectorFP emitterPos = emitterTrackSpline->getPos(time).convertToFixedPoint(); reinterpret_cast(particleFX)->setEmitter(0, emitterPos); particleFX->update(syncFrac); MatrixFP m1 =cam.getMatrix(), m2 = particleFX->getMatrix(); MatrixFP m = m1*m2; particleFX->setMatrix(m); // update particle fun particleFun->update(syncFrac); m2 = particleFun->getMatrix(); m = m1*m2; particleFun->setMatrix(m); // update grid raytracer m = cam.getMatrixInverse(); reinterpret_cast(texturedGrid)->setMatrix(m); reinterpret_cast(texturedGrid)->setCOP(cam.position); reinterpret_cast(texturedGrid)->setLight(cam.target); texturedGrid->update(syncFrac); } void drawInt(int i, unsigned short* vScreen, int pitch, int x, unsigned int y, unsigned short col); void ParticleScene::render(unsigned short* vscreen, unsigned int pitch) { texturedGrid->render(vscreen, pitch); particleFX->render(vscreen, pitch); particleFun->render(vscreen, pitch); //drawInt((int)time, vscreen, pitch, 0, 239-8, 31); } milkytracker-0.90.85+dfsg/src/fx/TexturedPlane.h0000644000175000017500000000234311150223367020566 0ustar admin2admin2/* * fx/TexturedPlane.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef TEXTUREDPLANE__H #define TEXTUREDPLANE__H #include "TexturedGrid.h" #include "Math3d.h" class TexturedPlane : public TexturedGrid { private: MatrixFP rotMatrix; VectorFP cop; VectorFP light; public: TexturedPlane(int width, int height, int gridshift); void setMatrix(MatrixFP& matrix) { rotMatrix = matrix; } void setCOP(VectorFP& cop) { this->cop = cop; } void setLight(VectorFP& light) { this->light = light; } virtual void update(float syncFrac); }; #endif milkytracker-0.90.85+dfsg/src/fx/Twister.h0000644000175000017500000000314511150223367017444 0ustar admin2admin2/* * fx/Twister.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef TWISTER__H #define TWISTER__H #include "FXInterface.h" #include "Math3d.h" #define NUMPOINTS 4 class Twister : public FXInterface { private: int center; unsigned short* texture; int* zbuffer; struct MyVertex { VectorFP p; int u; }; MyVertex sourcePoints[NUMPOINTS+1]; MyVertex newPoints[NUMPOINTS+1]; int sinTable[1024]; int cosTable[1024]; int mySin(int phi) { int t = (phi&255); int s1 = sinTable[(phi>>8)&1023]; int s2 = sinTable[((phi>>8)+1)&1023]; return (s1*(255-t)+t*s2)>>8; } int myCos(int phi) { int t = (phi&255); int s1 = cosTable[(phi>>8)&1023]; int s2 = cosTable[((phi>>8)+1)&1023]; return (s1*(255-t)+t*s2)>>8; } public: Twister(int width, int height, int center = -1); ~Twister(); void render(unsigned short* vscreen, unsigned int pitch); void update(float syncFrac); }; #endif milkytracker-0.90.85+dfsg/src/fx/TCBSplineTest.cpp0000644000175000017500000000741511150223367020765 0ustar admin2admin2/* * fx/TCBSplineTest.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "TCBSplineTest.h" #include "TCBSpline.h" #include "Math3d.h" #include "Filter.h" #define RGB2SHORT(r,g,b) ((((r>>3))<<11)+(((g>>2))<<5)+((b>>3))) static void setPixel(float* buffer,int width, int height, int x,int y,float r,float g,float b) { if (y>=0&&x>=0&&y1.0f) r = 1.0f; g+=buffer[offset*3+1]; if (g>1.0f) g = 1.0f; b+=buffer[offset*3+2]; if (b>1.0f) b = 1.0f; buffer[offset*3] = r; buffer[offset*3+1] = g; buffer[offset*3+2] = b; } } static void setBlock(float* buffer,int width, int height, int x,int y,float r,float g,float b) { for (int i = y; i < y+4; i++) for (int j = x; j < x+4; j++) setPixel(buffer, width, height, j, i, r,g,b); } TCBSplineTest::TCBSplineTest(int width, int height) { this->width = width; this->height = height; buffer = new float[width*height*3]; } TCBSplineTest::~TCBSplineTest() { delete buffer; } static void drawSplines(TCBSpline* spline, int maxDots, int maxTime, float* buffer, int width, int height, float r, float g, float b) { for (int j = 0; j < maxDots; j++) { float curTime = (float)(j / (float)maxDots)*(float)maxTime; VectorFloat pos = spline->getPos(curTime); setBlock(buffer, width, height, (int)pos.x, (int)pos.y, r, g, b); } } #define MAX_KEYS 500 #define MAX_TIME 2000 static TCBSpline* spline = new TCBSpline(MAX_KEYS); void TCBSplineTest::render(unsigned short* vscreen, unsigned int pitch) { int i; memset(buffer,0, width*height*3*sizeof(float)); for (i = 0; i < MAX_KEYS; i++) { int x = rand()%width; int y = rand()%height; VectorFloat v((float)x, (float)y, 0.0f); spline->setKey(i, v, (int)(((1.0f/((float)MAX_KEYS-1.0f))*(float)i)*MAX_TIME)); } /*keys[0].v.set(159.0f-40.0f,119.0f-40.0f,0.0f); keys[0].ti = 0.0f*MAX_TIME; keys[0].t = 0.5f; keys[1].v.set(159.0f+40.0f,119.0f-40.0f,0.0f); keys[1].ti = 0.25f*MAX_TIME; keys[1].t = 0.5f; keys[2].v.set(159.0f+40.0f,119.0f+40.0f,0.0f); keys[2].ti = 0.5f*MAX_TIME; keys[2].t = 0.5f; keys[3].v.set(159.0f-40.0f,119.0f+40.0f,0.0f); keys[3].ti = 0.75f*MAX_TIME; keys[3].t = 0.5f; keys[4].v.set(159.0f-40.0f,119.0f-40.0f,0.0f); keys[4].ti = 1.0f*MAX_TIME; keys[4].t = 0.5f;*/ drawSplines(spline, 100000, MAX_TIME, buffer, width, height, (5.0f/255.0f)*1.0f, (4.0f/255.0f)*1.0f, (2.0f/255.0f)*1.0f); for (i = 0; i < MAX_KEYS; i++) { int x = rand()%width; int y = rand()%height; VectorFloat v((float)x, (float)y, 0.0f); spline->setKey(i, v, (int)(((1.0f/((float)MAX_KEYS-1.0f))*(float)i)*MAX_TIME)); } drawSplines(spline, 100000, MAX_TIME, buffer, width, height, (0.0f/255.0f)*1.0f, (1.0f/255.0f)*1.0f, (4.0f/255.0f)*1.0f); int offs = 0; for (i = 0; i < height; i++) for (int j = 0; j < width; j++) { vscreen[i*pitch+j] = RGB2SHORT((int)(buffer[offs]*127.0f),(int)(buffer[offs+1]*127.0f),(int)(buffer[offs+2]*127.0f)); offs+=3; } //Filter::applyRadial(vscreen, 320, 240, 320, 159, 119, 8192, 1); } void TCBSplineTest::update(float SyncFrac) { } milkytracker-0.90.85+dfsg/src/fx/ParticleEmitter.h0000644000175000017500000000272011150223367021076 0ustar admin2admin2/* * fx/ParticleEmitter.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PARTICLEEMITTER__H #define PARTICLEEMITTER__H #include "ParticleFX.h" #include "Math3d.h" class ParticleEmitter : public ParticleFX { private: unsigned short* flareTexture[3]; unsigned short* temp; unsigned short* buffer; unsigned int numEmitters; unsigned short* emitterTexture[6]; Particle* emitters; int currentParticleIndex; int maxParticles; public: ParticleEmitter(int width, int height, int FOV, int numEmitters, int maxParticles); virtual ~ParticleEmitter(); void setEmitter(unsigned int index, VectorFP& pos) { if (index < numEmitters) emitters[index].pos = pos; } virtual void update(float syncFrac); virtual void render(unsigned short* vscreen, unsigned int pitch); }; #endif milkytracker-0.90.85+dfsg/src/fx/ParticleFun.h0000644000175000017500000000207211150223367020215 0ustar admin2admin2/* * fx/ParticleFun.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PARTICLEFUN__H #define PARTICLEFUN__H #include "ParticleFX.h" #include "Math3d.h" class ParticleFun : public ParticleFX { private: unsigned short* flareTexture; float phi; public: ParticleFun(int width, int height, int FOV); virtual ~ParticleFun(); virtual void update(float syncFrac); }; #endif milkytracker-0.90.85+dfsg/src/fx/Texture.cpp0000644000175000017500000001705411150223367020002 0ustar admin2admin2/* * fx/Texture.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "Math3d.h" #include "Texture.h" #include "TCBSpline.h" #define RGB2SHORT(r,g,b) ((((r>>3))<<11)+(((g>>2))<<5)+((b>>3))) #define MAX_KEYS 50 #define MAX_TIME 200 static void setPixel(int* buffer,int x,int y,int r,int g,int b) { int offset = (y&255)*256+(x&255); r+=buffer[offset*3]; if (r>65536) r = 65536; g+=buffer[offset*3+1]; if (g>65536) g = 65536; b+=buffer[offset*3+2]; if (b>65536) b = 65536; buffer[offset*3] = r; buffer[offset*3+1] = g; buffer[offset*3+2] = b; } static void setBlock(int* buffer,int x,int y,int blockSize, int r,int g,int b) { for (int i = y; i < y+blockSize; i++) for (int j = x; j < x+blockSize; j++) setPixel(buffer, j, i, r,g,b); } static void drawSplines(TCBSpline* spline, int maxDots, int maxTime, int* buffer, int blockSize, int r, int g, int b) { float rMaxdots = (1.0f / (float)maxDots) * maxTime; for (int j = 0; j < maxDots; j++) { float curTime = (float)j * rMaxdots; VectorFloat pos = spline->getPos(curTime); //int shade = pos.z*65536.0f; setBlock(buffer, (int)pos.x, (int)pos.y, blockSize, r, g, b); } } void Texture::createSplineTexture(unsigned char* tex, int numBlocks, int blockSize) { TCBSpline* spline = new TCBSpline(MAX_KEYS); int* buffer = new int[256*256*3]; memset(buffer, 0, 256*256*3*sizeof(int)); int i; for (i = 0; i < MAX_KEYS; i++) { int x = rand()%256; int y = rand()%256; int z = rand()%256; VectorFloat v((float)x, (float)y, (float)z/255.0f); spline->setKey(i, v, (int)(((1.0f/((float)MAX_KEYS-1.0f))*(float)i)*MAX_TIME)); } drawSplines(spline, numBlocks, MAX_TIME, buffer, blockSize, (5*65536/255)>>1, (4*65536/255)>>1, (65536*2/255)>>1); for (i = 0; i < MAX_KEYS; i++) { int x = rand()%256; int y = rand()%256; int z = rand()%256; VectorFloat v((float)x, (float)y, (float)z/255.0f); spline->setKey(i, v, (int)(((1.0f/((float)MAX_KEYS-1.0f))*(float)i)*MAX_TIME)); } drawSplines(spline, numBlocks, MAX_TIME, buffer, blockSize, (0*65536/255)>>1, (65536/255)>>1, (4*65536/255)>>1); for (i = 0; i < 256*256; i++) { tex[i*3] = (int)(buffer[i*3]*255)>>16; tex[i*3+1] = (int)(buffer[i*3+1]*255)>>16; tex[i*3+2] = (int)(buffer[i*3+2]*255)>>16; } delete[] buffer; delete spline; } void Texture::createFlareTexture(unsigned char* tex, int r,int g,int b, float pw /*= 4.0f*/, unsigned int size /*= 256*/) { int hx = size>>1; int hy = size>>1; float maxlen = (float)sqrt(pow(size*0.5,2)); float fac = 1.0f/maxlen; for (unsigned int y = 0; y < size; y++) for (unsigned int x = 0; x < size; x++) { int offset = (y*size+x)*3; int px = x - hx; int py = y - hy; float v = (float)(px*px+py*py); float len = (float)sqrt(v); if (len > maxlen) len = maxlen; v = (float)(sin((1.0f-(len*fac))*(M_PI/2.0f))); float fc = (float)pow(v,pw); //float fc = (float)pow(1.0f-(len*fac),pw); tex[offset] = (unsigned char)(r*fc); tex[offset+1] = (unsigned char)(g*fc); tex[offset+2] = (unsigned char)(b*fc); } } static int CalcLight(unsigned char* heightmap, int texmapsize, int x1,int y1,int x2,int y2,int depth, int smooth) { int l,ran; ran = (texmapsize<>depth; l = (((int)heightmap[y1*texmapsize+x1]+(int)heightmap[y2*texmapsize+x2]) >> 1) + (rand()%ran)-(ran>>1); if (l<1) l = 1; else if (l>255) l = 255; return l; } static void GenRandom(unsigned char* heightmap, int texmapsize, int x1,int y1,int x2,int y2,int depth, int smooth) { int xh,yh; int light; xh = (x1+x2) >> 1; yh = (y1+y2) >> 1; if (heightmap[y1*texmapsize+xh] == 0) heightmap[y1*texmapsize+xh] = CalcLight(heightmap, texmapsize,x1,y1,x2,y1,depth, smooth); if (heightmap[y2*texmapsize+xh] == 0) heightmap[y2*texmapsize+xh] = CalcLight(heightmap, texmapsize,x1,y2,x2,y2,depth, smooth); if (heightmap[yh*texmapsize+x1] == 0) heightmap[yh*texmapsize+x1] = CalcLight(heightmap, texmapsize,x1,y1,x1,y2,depth, smooth); if (heightmap[yh*texmapsize+x2] == 0) heightmap[yh*texmapsize+x2] = CalcLight(heightmap, texmapsize,x2,y1,x2,y2,depth, smooth); light = CalcLight(heightmap, texmapsize,x1,y1,x2,y2,depth, smooth) + CalcLight(heightmap, texmapsize,x1,y2,x2,y1,depth, smooth); if (light>511) light = 511; heightmap[yh*texmapsize+xh] = light >> 1; if ((1<>shifter,srcImage[i*3+1]>>shifter,srcImage[i*3+2]>>shifter); } void Texture::blur24(unsigned char* tex, unsigned int width, unsigned int height, unsigned int passes /*= 1*/) { unsigned char* dst = new unsigned char[width*height*3]; memcpy(dst, tex, width*height*3); for (unsigned int j = 0; j < passes; j++) { for (unsigned int y = 1; y < height-1; y++) for (unsigned int x = 1; x < width-1; x++) { int y1p = (y+1); int y1m = (y-1); int x1p = (x+1); int x1m = (x-1); for (int i = 0; i < 3; i++) { int c = (tex[(y*width+x)*3+i] + tex[(y1m*width+x)*3+i] + tex[(y1p*width+x)*3+i] + tex[(y*width+x1m)*3+i] + tex[(y*width+x1p)*3+i])/5; dst[(y*width+x)*3+i] = c; } } memcpy(tex, dst, width*height*3); } delete[] dst; } milkytracker-0.90.85+dfsg/src/fx/TwisterFX.h0000644000175000017500000000232111150223367017675 0ustar admin2admin2/* * fx/TwisterFX.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TwisterFX.h * MilkyTracker * * Created by Peter Barth on 26.11.05. * */ #ifndef TWISTERFX__H #define TWISTERFX__H #include "BasicTypes.h" #include "FXAbstract.h" class FXInterface; class TwisterFX : public FXAbstract { private: FXInterface* fx; pp_uint16* vscreen; pp_uint32 realw, realh; public: TwisterFX(pp_int32 w, pp_int32 h); ~TwisterFX(); virtual void update(pp_uint32 syncFrac); virtual void render(pp_uint8* buffer); }; #endif milkytracker-0.90.85+dfsg/src/fx/TCBSpline.cpp0000644000175000017500000001036311150223367020121 0ustar admin2admin2/* * fx/TCBSpline.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "TCBSpline.h" TCBSpline::TCBSpline(int numKeys) { if (numKeys == 0) numKeys++; this->numKeys = numKeys; keys = new TKey[numKeys]; for (int i = 0; i < numKeys; i++) { keys[i].v.set(0.0f,0.0f,0.0f); keys[i].t = keys[i].c = keys[i].b = 0.0f; keys[i].ti = 0; } } TCBSpline::~TCBSpline() { delete[] keys; } void TCBSpline::setKey(int index, VectorFloat& v, int time, float tension, float continuity, float bias) { if (index < numKeys) { keys[index].v = v; keys[index].ti = time; keys[index].t = tension; keys[index].c = continuity; keys[index].b = bias; } } VectorFloat TCBSpline::getLastPos(int i) { VectorFloat lastPos; if (i>0) lastPos = keys[i-1].v; else lastPos = keys[numKeys-1].v; return lastPos; } VectorFloat TCBSpline::getNextPos(int i) { VectorFloat nextPos; if (i keys[numKeys-1].ti) return -1; if (startIndex >= endIndex) return -1; if (curTime >= keys[startIndex].ti && curTime < keys[startIndex+1].ti) return startIndex; if (startIndex + 1 == endIndex) return startIndex; int mid = (startIndex+endIndex) >> 1; if (curTime >= keys[startIndex].ti && curTime < keys[mid].ti) { return findKey(curTime, startIndex, mid); } else if (curTime >= keys[mid].ti && curTime <= keys[endIndex].ti) { return findKey(curTime, mid, endIndex); } else { return keys[endIndex].ti; } } VectorFloat TCBSpline::getPos(float curTime) { VectorFloat pos(0.0f,0.0f,0.0f); int i = findKey((int)curTime, 0, numKeys-1); if (i != -1) { /*for (int i = 0; i < numKeys-1; i++) { // okay "i" must be the current key if (curTime >= keys[i].ti && curTime < keys[i+1].ti) {*/ float deltai = (float)(keys[i+1].ti - keys[i].ti); float t = (float)(curTime - keys[i].ti); float v = t/deltai; VectorFloat curPos = keys[i].v; VectorFloat nextPos = getNextPos(i); VectorFloat lastPos = getLastPos(i); // incoming tangent vector for the current point VectorFloat Ti = calcTi(i); // outgoing tangent vector for the current point VectorFloat To = calcTo(i); // incoming tangent vector for the next point VectorFloat Ti1 = calcTi(i+1); // outgoing tangent vector for the next point VectorFloat To1 = calcTo(i+1); VectorFloat Ai = curPos; VectorFloat Bi = deltai * To; VectorFloat Ci = (3.0f * (nextPos - curPos)) - (deltai * ((2.0f * To) + Ti1)); VectorFloat Di = (-2.0f * (nextPos - curPos)) + (deltai * (To + Ti1)); float v2 = v*v; float v3 = v2*v; pos = Ai + (v*Bi) + (v2*Ci) + (v3*Di); /* break; } }*/ } return pos; } milkytracker-0.90.85+dfsg/src/fx/TexturedPlane.cpp0000644000175000017500000001317011150223367021121 0ustar admin2admin2/* * fx/TexturedPlane.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "TexturedPlane.h" #include "Texture.h" #include "Math3d.h" #include "Filter.h" #define AMBIENT_LIGHT 96*65536 TexturedPlane::TexturedPlane(int width, int height, int gridshift) : TexturedGrid(width, height, gridshift) { /*unsigned char* texture = new unsigned char[256*256*3]; Texture::createSplineTexture(texture); Texture::convert24to16(this->texture, texture, 256*256, 1); delete texture;*/ } void TexturedPlane::update(float syncFrac) { int gridSizeX = gridWidth; int gridSizeY = gridHeight; int x,y; VectorFP* gridPt = grid; MatrixFP m = rotMatrix; VectorFP d, d2, p = cop, light = this->light; int hx = width>>1; int hy = height>>1; int gridshift = this->gridshift; int FPP = 12; int textureshift = 6; int scalex = (65536*320/width)<0) { t = fpdiv(65536*50-p.y,d.y); iz = (p.z+fpmul(t,d.z)); ix = (p.x+fpmul(t,d.x)); iy = (p.y+fpmul(t,d.y)); intersection = true; //gridPt->x = (ix+65536)<y = (iz)<x = ((ix>>4)+65536)<y = ((iz>>4))<x = (-ix+65536)<y = (iz)<x = ((-ix>>4)+65536)<y = ((iz>>4))<x = -12345678; gridPt->y = -12345678;*/ /*if (d.y>0) { t = fpdiv(65536*64-p.y,d.y); if (t > 0 && t < 0x01000000) { iz = (p.z+fpmul(t,d.z)); ix = (p.x+fpmul(t,d.x)); iy = (p.y+fpmul(t,d.y)); if ((ix<=65536*64)&&(ix>=-65536*64)) { intersection = true; gridPt->x = ((ix>>6)+65536)<y = ((iz>>6))< 0 && t < 0x01000000) { iz = (p.z+fpmul(t,d.z)); ix = (p.x+fpmul(t,d.x)); iy = (p.y+fpmul(t,d.y)); if ((ix<=65536*64)&&(ix>=-65536*64)) { intersection = true; gridPt->x = (-(ix>>6)+65536)<y = ((iz>>6))<0)) { t = fpdiv(65536*64-p.x,d.x); if (t > 0 && t < 0x01000000) { iz = (p.z+fpmul(t,d.z)); ix = (p.x+fpmul(t,d.x)); iy = (p.y+fpmul(t,d.y)); if ((iy<=65536*65)&&(iy>=-65536*65)) { intersection = true; gridPt->x = ((iy>>6)+65536)<y = ((iz>>6))< 0 && t < 0x01000000) { iz = (p.z+fpmul(t,d.z)); ix = (p.x+fpmul(t,d.x)); iy = (p.y+fpmul(t,d.y)); //if ((iy<=65536)&&(iy>=-65536)) //{ intersection = true; gridPt->x = (-(iy>>6)+65536)<y = ((iz>>6))<x = (int)((fabs(phi)/M_PI)*128.0f*65536.0f); gridPt->x = fpmul(gridPt->x, s); gridPt->y = fpmul(gridPt->y, s);*/ if (intersection) { int h, diz = t>>2; if (diz<0) h = AMBIENT_LIGHT; else if (diz<(1<<(31-6))) h = (diz<<6)-200*65536; else h = AMBIENT_LIGHT; if (h>AMBIENT_LIGHT) h = AMBIENT_LIGHT; if (h<0) h = 0; gridPt->z = AMBIENT_LIGHT-h; //grid[y][x].z = fpmul((255*65536-h)>>1,l); int dx = abs(ix - light.x)>>8; int dy = abs(iy - light.y)>>8; int dz = abs(iz - light.z)>>8; if (dx <= 65536 && dy <= 65536 && dz <= 65536) { int sdist = (fpmul(dx,dx)+fpmul(dy,dy)+fpmul(dz,dz))<<6; if (sdist == 0) sdist=65536; int dist = fpdiv(65536,sdist); if (dist > 65536) dist = 65536; dist = fpmul(dist, dist) << 1; //if (dist < 4096) dist = 4096; //gridPt->z = fpmul(gridPt->z, dist); gridPt->z += dist*256; if (gridPt->z > 256*65536) gridPt->z = 256*65536; } } else gridPt->z = 0; //else // gridPt->z = fpmul(gridPt->z, /*4096*/0); gridPt++; } } milkytracker-0.90.85+dfsg/src/fx/Twister.cpp0000644000175000017500000001537111150223367020003 0ustar admin2admin2/* * fx/Twister.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "Twister.h" #include "Math3d.h" #include "Texture.h" #define PRGB2SHORT(r,g,b) (((unsigned short)((r))<<11)+((unsigned short)((g))<<5)+(unsigned short)((b))) static float phi = 0.0f; static int heightFieldOffset = 0; Twister::Twister(int width, int height, int center) { int i; this->width = width; this->height = height; if (center == -1) this->center = height>>1; else this->center = center; unsigned char* rgbTex = new unsigned char[256*256*3]; unsigned char* rgbTex2 = new unsigned char[256*256*3]; texture = new unsigned short[256*256]; Texture::createSplineTexture(rgbTex); Texture::createPlasmaTexture(rgbTex2, 256, 5, 192, 140, 63); for (i = 0; i < 256*256; i++) { int r = (rgbTex2[i*3]>>0) - (rgbTex[i*3]*0) + 31*2; int g = (rgbTex2[i*3+1]>>0) - (rgbTex[i*3+1]*0) + 31*2; int b = (rgbTex2[i*3+2]>>0) - (rgbTex[i*3+2]*0) + 64*2; if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; rgbTex[i*3] = r; rgbTex[i*3+1] = g; rgbTex[i*3+2] = b; } Texture::convert24to16(texture, rgbTex, 256*256, 1); for (i = 0; i < 1024; i++) { float phi = (i/512.0f)*(float)M_PI; sinTable[i] = (int)((float)sin(phi)*65536.0f); cosTable[i] = (int)((float)cos(phi)*65536.0f); } delete rgbTex; delete rgbTex2; zbuffer = new int[height]; } Twister::~Twister() { delete zbuffer; delete texture; } void Twister::update(float syncFrac) { phi+=(syncFrac*0.01f); heightFieldOffset+=(int)(65536.0f*syncFrac); } void Twister::render(unsigned short* vscreen, unsigned int pitch) { int XMAX = width; int YMAX = height; //unsigned int bgColor = RGB2SHORT(31*4,7*4,15*4); unsigned int bgColor = 0; unsigned int fill = (bgColor<<16) | bgColor; int twistStep = (int)((float)sin(phi*4.0f)*256.0f); for (int j = 0; j < YMAX; j++) { unsigned int* vPtr = (unsigned int*)(vscreen+j*pitch); for (int i = 0; i < XMAX>>1; i++) *vPtr++ = fill; } int beta = (int)((sin(phi)/M_PI)*512.0f*256.0f); //int beta = 0; int theta = beta>>6; int* zBuffer = zbuffer; int scale = (YMAX*65536)/200; int center = this->center; for (int scanline = 0; scanline < XMAX; scanline++) { //VectorFP sourcePoints[4] = {{-64*65536,0,64*65536},{64*65536,0,64*65536},{-64*65536,0,-64*65536},{64*65536,0,-64*65536}}; for (int j = 0; j < NUMPOINTS; j++) { sourcePoints[j].u = (j*(256/NUMPOINTS))*2; //int radius = 64+(heightmap[((scanline+(heightFieldOffset>>16))&255)*256+(sourcePoints[j].u&255)]>>2); //int radius = 64+(mySin((scanline<<11)+theta)>>11); int radius = 64; //sourcePoints[j].p.x = (int)(-sin(((float)j/(float)NUMPOINTS)*2*M_PI+beta)*radius*65536.0f); //sourcePoints[j].p.y = 0; //sourcePoints[j].p.z = (int)(-cos(((float)j/(float)NUMPOINTS)*2*M_PI+beta)*radius*65536.0f); sourcePoints[j].p.x = -mySin(((1024*256/NUMPOINTS)*j+beta*4))*radius+(sinTable[theta&1023]*0); sourcePoints[j].p.y = 0; sourcePoints[j].p.z = -myCos(((1024*256/NUMPOINTS)*j+beta*4))*radius; } theta+=4; beta+=-(mySin(theta*256)*twistStep)>>15; sourcePoints[NUMPOINTS].p = sourcePoints[0].p; sourcePoints[NUMPOINTS].u = 256*2; int i; for (i = 0; i < YMAX; i++) zBuffer[i] = -0x7fffffff; for (i = 0; i < NUMPOINTS; i++) { MyVertex *p1; MyVertex *p2; p1 = &sourcePoints[i]; p2 = &sourcePoints[i+1]; if (p2->p.x-p1->p.x>0) { int x1,x2,z1,z2,u1,u2; x1 = (fpmul(p1->p.x, scale)>>16)+center; x2 = (fpmul(p2->p.x, scale)>>16)+center; z1 = (p1->p.z>>14); z2 = (p2->p.z>>14); u1 = (p1->u); u2 = (p2->u); int stepu = 0,stepz = 0; if (x2!=x1) { stepu = (u2-u1)*65536/(x2-x1); stepz = (z2-z1)*65536/(x2-x1); } int su = u1*65536, sz = z1*65536; if (x1 < 0) { su+=-x1*stepu; sz+=-x1*stepz; x1 = 0; } if (x2 > YMAX) { x2 = YMAX; } unsigned short *texline = texture+((((heightFieldOffset>>16)+scanline)<<1)&255)*256; unsigned short *vLine = (unsigned short*)vscreen+x1*pitch+scanline; for (int px = x1; px < x2; px++) { if (sz>zBuffer[px]) { int INTENSITY = ((sz>>16)+(32)); if (INTENSITY<0) INTENSITY = 0; if (INTENSITY>256) INTENSITY = 256; INTENSITY = (INTENSITY*INTENSITY)>>7; int TEXEL = texline[((su>>16)&255)]; /*int r=TEXEL; r*=INTENSITY; r>>=8; r&=0xf800; int g=TEXEL&0x7e0; g*=INTENSITY; g>>=8; g&=0x7e0; int b=TEXEL&0x1f; b*=INTENSITY; b>>=8; *vLine = r+g+b;*/ int rgb16_1 = bgColor; int rgb16_2 = TEXEL; int b = (((rgb16_1&31)<<8)+INTENSITY*((rgb16_2&31)-(rgb16_1&31)))>>8; int g = ((((rgb16_1>>5)&63)<<8)+INTENSITY*(((rgb16_2>>5)&63)-((rgb16_1>>5)&63)))>>8; int r = (((rgb16_1>>11)<<8)+INTENSITY*((rgb16_2>>11)-(rgb16_1>>11)))>>8; if (r>31) r = 31; if (g>63) g = 63; if (b>31) b = 31; *vLine = PRGB2SHORT(r,g,b); //*vLine = RGB2SHORT((INTENSITY*255)>>8,(INTENSITY*255)>>8,(INTENSITY*255)>>8); //*vLine = TEXEL; //buffptr[scanline*320+px] = texture[((heightFieldOffset+scanline)&255)*256+((su>>16)&255)]; zBuffer[px] = sz; vLine+=pitch; } /*int INTENSITY = sz>>16; if (INTENSITY<0) INTENSITY = 0; if (INTENSITY>255) INTENSITY = 255; int TEXEL = texture[scanline*256+((su>>16)&255)]; //vir[vidink+x2] = tex[((((sv>>8)&0xff00)+((su>>16)&0xff)))]; int r=TEXEL; r*=INTENSITY; r>>=8; r&=0xf800; int g=TEXEL&0x7e0; g*=INTENSITY; g>>=8; g&=0x7e0; int b=TEXEL&0x1f; b*=INTENSITY; b>>=8; buffptr[scanline*320+px] = r+g+b;*/ su+=stepu; sz+=stepz; } } } } } milkytracker-0.90.85+dfsg/src/fx/fpmath.cpp0000644000175000017500000001175411150223367017622 0ustar admin2admin2/* * fx/fpmath.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "fpmath.h" #ifdef _MIPS_ extern "C" { // Use extern "c" fopp_int32r C++ file only void __asm(char*, ...); }; #pragma intrinsic(__asm) // this is actually optional pp_int32 fpmul(pp_int32 a, pp_int32 b) { __asm("mult $4,$5"); __asm("mflo $11"); __asm("mfhi $12"); __asm("srl $13,$11,16"); __asm("sll $14,$12,16"); __asm("or $2,$13,$14"); } pp_int32 fpdiv(pp_int32 n,pp_int32 d) { __asm("addu $10,$5,$0;" "and $15,$10,-2147483648;" "beq $15, 0, $34;" "negu $5,$5;" "$34:;" "addu $10,$5,$0;" "li $11,3;" "and $12,$10,1073741824;" "bne $12,0,$36;" "$35:;" "sll $10,$10,1;" "sll $11,$11,1;" "and $12,$10,1073741824;" "beq $12,0,$35;" "$36:;" "addu $6,$11,$0;"); __asm("mult $5,$6"); __asm("mflo $11"); __asm("mfhi $12"); __asm("srl $13,$11,16"); __asm("sll $14,$12,16"); __asm("or $8,$13,$14"); __asm("mult $4,$6"); __asm("mflo $11"); __asm("mfhi $12"); __asm("srl $13,$11,16"); __asm("sll $14,$12,16"); __asm("or $9,$13,$14"); __asm("addiu $24,$0,2"); __asm("sll $24,$24,16"); __asm("subu $10,$24,$8"); __asm("mult $10,$8"); __asm("mflo $11"); __asm("mfhi $12"); __asm("srl $13,$11,16"); __asm("sll $14,$12,16"); __asm("or $8,$13,$14"); __asm("mult $10,$9"); __asm("mflo $11"); __asm("mfhi $12"); __asm("srl $13,$11,16"); __asm("sll $14,$12,16"); __asm("or $9,$13,$14"); __asm("subu $10,$24,$8"); __asm("mult $10,$8"); __asm("mflo $11"); __asm("mfhi $12"); __asm("srl $13,$11,16"); __asm("sll $14,$12,16"); __asm("or $8,$13,$14"); __asm("mult $10,$9"); __asm("mflo $11"); __asm("mfhi $12"); __asm("srl $13,$11,16"); __asm("sll $14,$12,16"); __asm("or $9,$13,$14"); __asm("subu $10,$24,$8"); __asm("mult $10,$9"); __asm("mflo $11"); __asm("mfhi $12"); __asm("srl $13,$11,16"); __asm("sll $14,$12,16"); __asm("or $2,$13,$14"); __asm("beq $15, 0, $37;" "negu $2,$2;" "$37:"); } #else pp_int32 fpmul(pp_int32 a,pp_int32 b) { return ((pp_int32)(((pp_int64)(a)*(pp_int64)(b))>>16)); } pp_int32 fpdiv(pp_int32 n,pp_int32 d) { /*if (d==0) { return 0; }*/ pp_int32 g,t0,t1,t2; pp_int32 sign=d&0x80000000; if(sign) d=-d; //we need a good guess to start the Newton-Raphson interation //the logic that follows is from a suggestion by David Seal (dseal@acorn.co.uk) found at: //http://www.poppyfields.net/acorn/tech/division.shtml (toward the bottom) g=3; pp_int32 td=d; while((td&0x40000000)==0) { td<<=1; g<<=1; } //now we have our guess for the modified Newton-Raphson iteration //the following iterative convergence algorithm is from: //Cavanagh, J. 1984. Digital Computer Arithmetic. McGraw-Hill. Page 284. t1=fpmul(g,d); //t1=g*d t2=fpmul(g,n); //t2=g*n t0=0x20000-t1; //t0=2-t1 t1=fpmul(t0,t1); //t1=(2-(g*d))*(g*d) t2=fpmul(t0,t2); //t2=(2-(g*d))*(g*n) t0=0x20000-t1; //t0=2-((2-(g*d))*(g*d)) t1=fpmul(t0,t1); //t1=(2-((2-(g*d))*(g*d)))*(2-(g*d))*(g*d) t2=fpmul(t0,t2); //t2=(2-((2-(g*d))*(g*d)))*(2-(g*d))*(g*n) t0=0x20000-t1; //t0=2-((2-((2-(g*d))*(g*d)))*(2-(g*d))*(g*d)) t0=fpmul(t0,t2); //t0=(2-((2-((2-(g*d))*(g*d)))*(2-(g*d))*(g*d)))* // (2-((2-(g*d))*(g*d)))*(2-(g*d))*(g*n)*/ if(sign) t0=-t0; //divisionprofilecounter++; return t0; } #endif #define step(shift) \ if((0x40000000l >> shift) + root <= value) \ { \ value -= (0x40000000l >> shift) + root; \ root = (root >> 1) | (0x40000000l >> shift); \ } \ else \ { \ root = root >> 1; \ } pp_int32 fpsqrt(pp_int32 value) { pp_int32 root = 0; /*step( 0); step( 2); step( 4); step( 6); step( 8); step(10); step(12); step(14); step(16); step(18); step(20); step(22); step(24); step(26); step(28); step(30);*/ for (pp_int32 i = 0; i <= 30; i+=2) step(i); // round to the nearest integer, cuts max error in half if(root < value) { ++root; } root <<= 8; return root; } milkytracker-0.90.85+dfsg/src/fx/ParticleFun.cpp0000644000175000017500000002235411150223367020555 0ustar admin2admin2/* * fx/ParticleFun.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////// // custom class for the PHAL logo ///////////////////////////////////////////////////////////// #include "BasicTypes.h" #include "ParticleFun.h" #include "Math3d.h" #include "Filter.h" #include "Texture.h" static unsigned char fontTable[] = {0,0,0,0,0,0,0,0, 126,129,165,129,189,153,129,126, 126,255,219,255,255,195,231,126, 0,238,254,254,124,56,16,0, 16,56,124,254,124,56,16,0, 24,60,24,255,255,74,24,0, 16,56,124,254,254,146,56,0, 0,0,24,60,24,0,0,0, 255,255,231,195,231,255,255,255, 0,60,66,129,129,66,60,0, 255,195,189,126,126,189,195,255, 31,7,13,124,198,198,124,0, 0,126,195,195,126,24,126,24, 4,6,7,4,4,252,248,0, 12,10,13,11,249,241,15,15, 129,67,61,39,37,63,87,255, 0,0,96,120,126,120,96,0, 0,0,6,30,126,30,6,0, 24,126,24,24,24,24,126,24, 102,102,102,102,102,0,102,0, 255,182,118,54,54,54,54,0, 126,129,124,66,66,62,129,126, 0,0,0,126,126,0,0,0, 24,126,24,24,126,24,0,255, 24,126,24,24,24,24,24,0, 24,24,24,24,24,126,24,0, 0,4,6,255,6,4,0,0, 0,32,96,255,96,32,0,0, 0,0,0,192,192,192,255,0, 0,36,102,255,102,36,0,0, 0,0,16,56,124,254,0,0, 0,0,0,254,124,56,16,0, 0,0,0,0,0,0,0,0, 48,120,120,120,48,0,48,0, 204,102,51,0,0,0,0,0, 0,54,127,54,54,127,54,0, 124,214,208,124,22,214,124,16, 227,166,236,24,55,101,199,0, 56,76,56,69,198,206,122,1, 6,12,24,0,0,0,0,0, 12,24,24,24,24,24,24,12, 96,48,48,48,48,48,48,96, 16,84,56,254,56,84,16,0, 0,24,24,126,24,24,0,0, 0,0,0,0,0,0,24,48, 0,0,0,126,0,0,0,0, 0,0,0,0,0,0,48,0, 0,3,6,12,24,48,96,0, 124,206,222,254,238,206,124,0, 28,60,28,28,28,28,28,0, 124,206,14,28,56,112,254,0, 124,206,14,60,14,206,124,0, 206,206,206,206,254,14,14,0, 254,224,224,252,14,14,252,0, 124,230,224,252,230,230,124,0, 254,6,14,28,56,56,56,0, 124,230,230,124,230,230,124,0, 124,206,206,126,14,14,252,0, 0,48,0,0,0,48,0,0, 0,48,0,0,0,48,96,0, 0,24,48,96,48,24,0,0, 0,0,126,0,126,0,0,0, 0,48,24,12,24,48,0,0, 124,198,14,28,56,0,56,0, 124,198,222,222,220,192,124,0, 124,230,230,230,254,230,230,0, 252,230,230,252,230,230,252,0, 124,230,224,224,230,230,124,0, 252,230,230,230,230,230,252,0, 254,224,224,254,224,224,254,0, 254,224,224,254,224,224,224,0, 124,230,224,238,230,230,124,0, 230,230,230,254,230,230,230,0, 56,56,56,56,56,56,56,0, 14,14,14,14,206,206,124,0, 230,236,248,240,248,236,230,0, 224,224,224,224,224,224,254,0, 198,238,254,214,198,198,198,0, 198,230,246,254,238,230,230,0, 124,230,230,230,230,230,124,0, 252,230,230,252,224,224,224,0, 124,230,230,230,230,234,116,2, 252,230,230,252,230,230,230,0, 124,230,224,124,14,206,124,0, 254,56,56,56,56,56,56,0, 230,230,230,230,230,230,124,0, 230,230,230,230,230,124,56,0, 198,198,198,214,214,254,252,0, 227,118,60,24,60,110,199,0, 230,230,124,56,56,56,56,0, 254,14,28,56,112,224,254,0, 28,24,24,24,24,24,24,28, 0,96,48,24,12,6,3,0, 112,48,48,48,48,48,48,112, 24,60,102,195,0,0,0,0, 0,0,0,0,0,0,0,255, 48,24,12,0,0,0,0,0, 0,0,124,14,126,206,126,0, 192,192,252,230,230,230,252,0, 0,0,124,230,224,230,124,0, 6,6,126,206,206,206,126,0, 0,0,124,230,254,224,126,0, 60,112,112,252,112,112,112,0, 0,0,124,206,206,126,14,124, 192,192,252,230,230,230,230,0, 24,0,24,56,56,56,56,0, 12,0,12,28,28,28,28,248, 192,192,204,216,240,216,204,0, 24,24,56,56,56,56,56,0, 0,0,252,214,214,214,214,0, 0,0,252,230,230,230,230,0, 0,0,124,230,230,230,124,0, 0,0,252,230,230,252,224,224, 0,0,126,206,206,126,14,14, 0,0,252,230,224,224,224,0, 0,0,126,224,124,14,252,0, 24,24,126,56,56,56,56,0, 0,0,230,230,230,230,126,0, 0,0,230,230,230,108,56,0, 0,0,214,214,214,214,252,0, 0,0,230,124,56,124,206,0, 0,0,206,206,206,126,14,252, 0,0,254,28,56,112,254,0, 12,24,24,48,24,24,12,0, 24,24,24,24,24,24,24,24, 96,48,48,24,48,48,96,0, 112,219,14,0,0,0,0,0, 0,0,16,40,68,254,0,0, 255,128,128,128,128,128,128,128, 255,0,0,0,0,0,0,0, 255,1,1,1,1,1,1,1, 128,128,128,128,128,128,128,128, 1,1,1,1,1,1,1,1, 128,128,128,128,128,128,128,255, 0,0,0,0,0,0,0,255, 1,1,1,1,1,1,1,255, 128,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,128, 0,0,0,0,0,0,0,1, 128,192,224,240,248,252,254,255, 255,127,63,31,15,7,3,1, 255,255,192,192,192,192,192,192, 255,255,0,0,0,0,0,0, 255,255,3,3,3,3,3,3, 192,192,192,192,192,192,192,192, 3,3,3,3,3,3,3,3, 192,192,192,192,192,192,255,255, 0,0,0,0,0,0,255,255, 3,3,3,3,3,3,255,255, 192,192,0,0,0,0,0,0, 3,3,0,0,0,0,0,0, 0,0,0,0,0,0,192,192, 0,0,0,0,0,0,3,3, 0,0,0,170,0,0,0,0, 0,252,252,252,252,252,252,0, 0,126,126,126,126,126,126,0, 0,63,63,63,63,63,63,0, 0,31,31,31,31,31,31,0, 0,15,15,15,15,15,15,0, 0,7,7,7,7,7,7,0, 0,3,3,3,3,3,3,0, 0,1,1,1,1,1,1,0, 0,128,128,128,128,128,128,0, 0,192,192,192,192,192,192,0, 0,224,224,224,224,224,224,0, 0,240,240,240,240,240,240,0, 0,248,248,248,248,248,248,0, 170,214,170,214,170,214,170,214, 255,255,0,0,0,16,56,124, 255,255,0,0,0,0,0,254, 255,255,0,0,16,56,124,254, 255,255,0,195,231,255,219,195, 0,0,0,0,24,0,0,0, 0,192,192,192,192,192,192,192, 0,216,216,216,216,216,216,216, 0,219,219,219,219,219,219,219, 0,96,96,96,96,96,96,96, 0,108,108,108,108,108,108,108, 0,109,109,109,109,109,109,109, 0,128,128,128,128,128,128,128, 0,176,176,176,176,176,176,176, 0,182,182,182,182,182,182,182, 0,0,24,60,60,24,0,0, 0,0,0,248,24,248,24,24, 54,54,54,246,6,246,54,54, 54,54,54,54,54,54,54,54, 0,0,0,254,6,246,54,54, 54,54,54,246,6,254,0,0, 54,54,54,254,0,0,0,0, 24,24,24,248,24,248,0,0, 0,0,0,248,24,24,24,24, 24,24,24,31,0,0,0,0, 24,24,24,255,0,0,0,0, 0,0,0,255,24,24,24,24, 24,24,24,31,24,24,24,24, 0,0,0,255,0,0,0,0, 24,24,24,255,24,24,24,24, 24,24,24,31,24,31,24,24, 54,54,54,55,54,54,54,54, 54,54,54,55,48,63,0,0, 0,0,0,63,48,55,54,54, 54,54,54,247,0,255,0,0, 0,0,0,255,0,247,54,54, 54,54,54,55,48,55,54,54, 0,0,0,255,0,255,0,0, 54,54,54,247,0,247,54,54, 24,24,24,255,0,255,0,0, 54,54,54,255,0,0,0,0, 0,0,0,255,0,255,24,24, 0,0,0,255,54,54,54,54, 54,54,54,63,0,0,0,0, 24,24,24,31,24,31,0,0, 0,0,0,31,24,31,24,24, 0,0,0,63,54,54,54,54, 54,54,54,255,54,54,54,54, 24,24,24,255,24,255,24,24, 24,24,24,248,0,0,0,0, 0,0,0,31,24,24,24,24, 255,255,255,255,255,255,255,255, 0,0,0,0,255,255,255,255, 240,240,240,240,240,240,240,240, 15,15,15,15,15,15,15,15, 255,255,255,255,0,0,0,0, 0,0,119,152,152,119,0,0, 28,54,102,252,198,198,252,192, 254,98,96,96,96,96,96,0, 0,0,255,102,102,102,102,0, 254,98,48,24,48,98,254,0, 0,0,63,102,198,204,120,0, 0,0,51,51,51,62,48,240, 0,0,255,24,24,24,24,0, 60,24,60,102,102,60,24,60, 0,124,198,254,198,124,0,0, 0,126,195,195,195,102,231,0, 30,25,60,102,198,204,120,0, 0,0,102,153,153,102,0,0, 0,3,124,206,230,124,192,0, 0,62,192,254,192,62,0,0, 0,126,195,195,195,195,0,0, 0,254,0,254,0,254,0,0, 24,24,126,24,24,126,0,0, 112,24,12,24,112,0,254,0, 28,48,96,48,28,0,254,0, 0,14,27,24,24,24,24,24, 24,24,24,24,24,216,112,0, 0,24,0,126,0,24,0,0, 0,118,220,0,118,220,0,0, 60,102,60,0,0,0,0,0, 0,24,60,24,0,0,0,0, 0,0,0,0,24,0,0,0, 15,12,12,12,236,108,56,0, 216,236,204,204,0,0,0,0, 240,48,192,240,0,0,0,0, 0,0,0,60,60,60,60,0, 0,0,0,0,0,0,0,0 }; #define NUMPARTICLES 64*12 #define TEXTURESIZE 32 // what the hell is the ARM compiler doing here??? #pragma optimize("",off) ParticleFun::ParticleFun(int width, int height, int FOV) : ParticleFX(width, height, NUMPARTICLES, FOV) { phi = 0.0f; setZOffset(0); int i; unsigned char *texture = new unsigned char[TEXTURESIZE*TEXTURESIZE*3]; /*FILE* f = fopen("y:/stuff/demo/flare.tga","rb"); fseek(f,18,SEEK_SET); fread(texture,TEXTURESIZE*TEXTURESIZE,3,f); fclose(f);*/ Texture::createFlareTexture(texture, 127, 255, 64, 4.0f, TEXTURESIZE); flareTexture = new unsigned short[TEXTURESIZE*TEXTURESIZE]; Texture::convert24to16(flareTexture, texture, TEXTURESIZE*TEXTURESIZE, 0); delete texture; for (i = 0; i < NUMPARTICLES; i++) { particles[i].pos.x = particles[i].pos.y = particles[i].pos.z = 0; particles[i].texture = flareTexture; particles[i].size = 0; particles[i].grow = 0; } unsigned int x,y; i = 0; const char* chr = "MilkyTracker"; int sLen = (int)strlen(chr); for (int l = 0; l < sLen; l++) { for (y=0;y<8;y++) for (x=0;x<8;x++) if ((((fontTable[(chr[l]*8)+y]>>(7-x))&1))==1) { particles[i].pos.x = (l*8+x)*32768-(sLen*8>>1)*32768; particles[i].pos.y = y*32768-4*32768; particles[i].pos.z = 0*65536; particles[i].size = 32768; particles[i].direction.x = 0; particles[i].direction.y = 0; particles[i].direction.z = 0; particles[i].texture = flareTexture; particles[i].textureHeight = particles[i].textureWidth = TEXTURESIZE; i++; } } } #pragma optimize("",on) ParticleFun::~ParticleFun() { delete flareTexture; } void ParticleFun::update(float syncFrac) { MatrixFP m1,m2,m3; m1.setRotY(phi*0.1f); //m2.setRotZ(phi*0.05f); m3.setRotX(phi*0.075f); rotMatrix = m1/**m2*/*m3; phi+=syncFrac*0.25f; } milkytracker-0.90.85+dfsg/src/fx/ParticleBlobs.cpp0000644000175000017500000001151011150223367021056 0ustar admin2admin2/* * fx/ParticleBlobs.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "ParticleBlobs.h" #include "Math3d.h" #include "Filter.h" #include "Texture.h" #define GRIDSIZE 8 #define NUMPARTICLES (GRIDSIZE*GRIDSIZE*GRIDSIZE) struct Blob { int x,y,z; int strength; }; static Blob blobs[] = {{128,128,0,65536/8},{100,100,0,65536/8},{100,100,0,65536/8}}; #define MAXCLAMP 65536 #define TEXTURESIZE 64 ParticleBlobs::ParticleBlobs(int width, int height) : ParticleFX(width, height, NUMPARTICLES) { setZOffset(30*65536); temp = new unsigned short[width*height]; //buffer = new unsigned short[pitch*height]; int i; unsigned char *texture = new unsigned char[TEXTURESIZE*TEXTURESIZE*3]; /*FILE* f = fopen("y:/stuff/demo/flare.tga","rb"); fseek(f,18,SEEK_SET); fread(texture,TEXTURESIZE*TEXTURESIZE,3,f); fclose(f);*/ Texture::createFlareTexture(texture, 224, 191, 64, 4.0f, TEXTURESIZE); flareTexture[0] = new unsigned short[TEXTURESIZE*TEXTURESIZE]; flareTexture[1] = new unsigned short[TEXTURESIZE*TEXTURESIZE]; flareTexture[2] = new unsigned short[TEXTURESIZE*TEXTURESIZE]; for (i = 0; i < TEXTURESIZE*TEXTURESIZE*3; i++) texture[i]>>=1; for (i = 0; i < TEXTURESIZE*TEXTURESIZE; i++) { //texture[i*3] = texture[i*3+1] = 0; flareTexture[0][i] = RGB2SHORT(texture[i*3],texture[i*3+1],texture[i*3+2]); flareTexture[1][i] = RGB2SHORT(texture[i*3+2],texture[i*3+1],texture[i*3]); flareTexture[2][i] = RGB2SHORT(texture[i*3+1],texture[i*3+2],texture[i*3]); } delete texture; i = 0; for (int z = 0; z < GRIDSIZE; z++) for (int y = 0; y < GRIDSIZE; y++) for (int x = 0; x < GRIDSIZE; x++) { float fx = (x-((GRIDSIZE-1)*0.5f))*2.0f; float fy = (y-((GRIDSIZE-1)*0.5f))*2.0f; float fz = (z-((GRIDSIZE-1)*0.5f))*2.0f; int texture = rand()%3; particles[i].pos.x = int(fx*65536.0f); particles[i].pos.y = int(fy*65536.0f); particles[i].pos.z = int(fz*65536.0f); particles[i].texture = flareTexture[texture]; particles[i].textureWidth = particles[i].textureHeight = TEXTURESIZE; i++; } } ParticleBlobs::~ParticleBlobs() { for (int i = 0; i < 3; i++) delete flareTexture[i]; //delete buffer; delete temp; } void ParticleBlobs::update(float SyncFrac) { double phi = ::PPGetTickCount()*0.001f*0.5f;; blobs[0].x = (int)(sin(phi*4.0f)*4.0f*65536.0f); blobs[0].y = (int)(cos(phi*4.0f)*4.0f*65536.0f); blobs[0].z = (int)(sin(phi*4.0f)*4.0f*65536.0f); blobs[1].x = (int)(cos(-phi*2.0f)*4.0f*65536.0f); blobs[1].y = (int)(sin(phi*2.0f)*4.0f*65536.0f); blobs[1].z = (int)(cos(phi*2.0f)*4.0f*65536.0f); blobs[2].x = (int)(cos(-phi*3.0f)*6.0f*65536.0f); blobs[2].y = (int)(cos(phi*3.0f)*3.0f*65536.0f); blobs[2].z = (int)(sin(phi*3.0f)*5.0f*65536.0f); MatrixFP rotMatrix,mx,my,mz; mx.setRotX((float)(phi*0.75f)); my.setRotY((float)phi); mz.setRotZ((float)(phi*0.5f)); rotMatrix = (mx*my); rotMatrix = mz*rotMatrix; this->rotMatrix = rotMatrix; int numBlobs = sizeof(blobs)/sizeof(Blob); for (int i = 0; i < NUMPARTICLES; i++) { int scale = 32768; for (int j = 0; j < numBlobs; j++) { int dx = fpmul((blobs[j].x-particles[i].pos.x),blobs[j].strength); int dy = fpmul((blobs[j].y-particles[i].pos.y),blobs[j].strength); int dz = fpmul((blobs[j].z-particles[i].pos.z),blobs[j].strength); int sd = fpmul(dx,dx)+fpmul(dy,dy)+fpmul(dz,dz); if (sd<(0.707f*0.707f*65536)) scale += (fpmul(sd,sd)-sd+16384)*4; } if (scale>=MAXCLAMP) scale = MAXCLAMP; scale = fpmul(scale,scale); scale = fpmul(scale,scale); particles[i].size = scale; } } void ParticleBlobs::render(unsigned short* vscreen, unsigned int pitch) { int height = this->height; int width = this->width>>1; unsigned int bgColor = 0; unsigned int fill = (bgColor<<16) | bgColor; for (int j = 0; j < height; j++) { unsigned int* vPtr = (unsigned int*)(vscreen+j*pitch); for (int i = 0; i < width; i++) *vPtr++ = fill; } ParticleFX::render(vscreen, pitch); Filter::stylize(vscreen, temp, this->width, this->height, pitch, this->width, 100, 70, 60, 255, 192, 100); //Filter::applyRadial(vscreen, this->width, this->height, pitch, this->width>>1, this->height>>1, 8192, 1); } milkytracker-0.90.85+dfsg/src/fx/Camera.cpp0000644000175000017500000001020211150223367017516 0ustar admin2admin2/* * fx/Camera.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Camera.h" Camera::Camera() { position.x = position.y = position.z = 0; target.x = target.y = target.z = 0; bank = lens = 0.0f; trackPositionMatrix.setID(); trackTargetMatrix.setID(); } Camera::Camera(VectorFP& pos, VectorFP& target) { trackPositionMatrix.setID(); trackTargetMatrix.setID(); bank = lens = 0.0f; position = pos; target = target; } //////////// // Camera // //////////// static float getAngle(VectorFloat vec1,VectorFloat vec2) { float cosPhi = (vec1*vec2)/(vec1.length()*vec2.length()); if (vec1.y>=vec2.y) return (float)acos(cosPhi); else return -(float)acos(cosPhi); } MatrixFP Camera::getMatrix() { VectorFloat target,target2,veca,vecb; float rotangle,rotx,roty,rotz; MatrixFP cm; // 3ds style vectors /*cm.form[0][0] = 65536; cm.form[0][1] = 0; cm.form[0][2] = 0; cm.form[0][3] = 0; cm.form[1][0] = 0; cm.form[1][1] = 0; cm.form[1][2] = 65536; cm.form[1][3] = 0; cm.form[2][0] = 0; cm.form[2][1] = 65536; cm.form[2][2] = 0; cm.form[2][3] = 0; cm.form[3][0] = 0; cm.form[3][1] = 0; cm.form[3][2] = 0; cm.form[3][3] = 65536;*/ cm.setID(); MatrixFP im = (cm*trackPositionMatrix); VectorFP pos=im*this->position; im = (cm*trackTargetMatrix); VectorFP targ=im*this->target; veca.x=1.0f; veca.y=0.0f; veca.z=0.0f; vecb.x=(targ.z-pos.z)/65536.0f; vecb.y=(targ.x-pos.x)/65536.0f; vecb.z=0.0f; roty=getAngle(veca,vecb); target.x=(targ.x-pos.x)/65536.0f; target.y=(targ.z-pos.z)/65536.0f; rotangle=-roty; //target2.x=(target.x*(float)cos(rotangle))-(target.y*(float)sin(rotangle)); target2.y=(target.x*(float)sin(rotangle))+(target.y*(float)cos(rotangle)); vecb.x=target2.y; vecb.y=(targ.y-pos.y)/65536.0f; vecb.z=0.0f; rotx=-getAngle(veca,vecb); rotz=(float)-(bank/180.0f*M_PI); MatrixFP rotX,rotY,rotZ,tm; rotX.setRotX(rotx); rotY.setRotY(roty); rotZ.setRotZ(rotz); tm.setSubtract(pos); /*MatrixFP m = rotZ*rotX*rotY; rotX.setRotX(-rotx); rotY.setRotY(-roty); rotZ.setRotZ(-rotz); MatrixFP m2 = rotY*rotX*rotZ; MatrixFP m3 = m*m2;*/ im = tm*cm; im = rotY*im; im = rotX*im; im = rotZ*im; return im; } MatrixFP Camera::getMatrixInverse() { VectorFloat target,target2,veca,vecb; float rotangle,rotx,roty,rotz; MatrixFP cm; // .3ds style vectors /*cm.form[0][0] = 65536; cm.form[0][1] = 0; cm.form[0][2] = 0; cm.form[0][3] = 0; cm.form[1][0] = 0; cm.form[1][1] = 0; cm.form[1][2] = 65536; cm.form[1][3] = 0; cm.form[2][0] = 0; cm.form[2][1] = 65536; cm.form[2][2] = 0; cm.form[2][3] = 0; cm.form[3][0] = 0; cm.form[3][1] = 0; cm.form[3][2] = 0; cm.form[3][3] = 65536;*/ cm.setID(); MatrixFP im = (cm*trackPositionMatrix); VectorFP pos=im*this->position; im = (cm*trackTargetMatrix); VectorFP targ=im*this->target; veca.x=1.0f; veca.y=0.0f; veca.z=0.0f; vecb.x=(targ.z-pos.z)/65536.0f; vecb.y=(targ.x-pos.x)/65536.0f; vecb.z=0.0f; roty=getAngle(veca,vecb); target.x=(targ.x-pos.x)/65536.0f; target.y=(targ.z-pos.z)/65536.0f; rotangle=-roty; //target2.x=(target.x*(float)cos(rotangle))-(target.y*(float)sin(rotangle)); target2.y=(target.x*(float)sin(rotangle))+(target.y*(float)cos(rotangle)); vecb.x=target2.y; vecb.y=(targ.y-pos.y)/65536.0f; vecb.z=0.0f; rotx=-getAngle(veca,vecb); rotz=(float)-(bank/180.0f*M_PI); MatrixFP rotX,rotY,rotZ,tm; //tm.setSubtract(pos); //MatrixFP m = rotZ*rotX*rotY; rotX.setRotX(-rotx); rotY.setRotY(-roty); rotZ.setRotZ(-rotz); im = rotX*rotZ; return rotY*im; } milkytracker-0.90.85+dfsg/src/fx/PictureGlow.h0000644000175000017500000000363011150223367020246 0ustar admin2admin2/* * fx/PictureGlow.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PICTUREGLOW__H #define PICTUREGLOW__H #include "FXInterface.h" #include "Filter.h" class PictureGlow : public FXInterface { private: unsigned short* pictureBuffer; int scale, resShift; unsigned short* glowBuffer1; unsigned short* glowBuffer2; public: PictureGlow(int w, int h, int rShift, unsigned short* picture) : resShift(resShift), pictureBuffer(picture) { width = w; height = h; scale = 0; glowBuffer1 = new unsigned short[w*h]; glowBuffer2 = new unsigned short[w*h]; } ~PictureGlow() { delete glowBuffer1; delete glowBuffer2; } void setScale(int scale) { this->scale = scale; } virtual void render(unsigned short* vscreen, unsigned int pitch) { int x,y; unsigned int* dstDW = (unsigned int*)vscreen; unsigned int* srcDW = (unsigned int*)pictureBuffer; for (y = 0; y < height; y++) { for (x = 0; x < width>>1; x++) { *dstDW = *srcDW; srcDW++; dstDW++; } dstDW+=(pitch-width)>>1; } Filter::glow(vscreen, width, height, pitch, glowBuffer1, glowBuffer2, resShift, scale); } virtual void update(float syncFrac) { scale-=(int)(syncFrac*1024.0f); if (scale < 0) scale = 0; } }; #endif milkytracker-0.90.85+dfsg/src/fx/Starfield.h0000644000175000017500000000243711150223367017723 0ustar admin2admin2/* * fx/Starfield.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Fire.h * MyFirstCarbonProject * * Created by Peter Barth on Wed Feb 20 2002. * */ #ifndef STARFIELD__H #define STARFIELD__H #include "BasicTypes.h" #include "FXAbstract.h" #include "Math3d.h" class Starfield : public FXAbstract { private: VectorFP* stars; const pp_int32 numStars; public: Starfield(pp_int32 w, pp_int32 h); virtual ~Starfield(); virtual void render(pp_uint8* buffer); virtual void update(pp_uint32 syncFrac); void setPixel(pp_int32 x, pp_int32 y, const PPColor& color, pp_uint8* buffer); }; #endif milkytracker-0.90.85+dfsg/src/fx/TwisterFX.cpp0000644000175000017500000000351211150223367020233 0ustar admin2admin2/* * fx/TwisterFX.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TwisterFX.cpp * MilkyTracker * * Created by Peter Barth on 26.11.05. * */ #include "TwisterFX.h" //#include "Twister.h" #include "ParticleBlobs.h" #include "ParticleScene.h" #include "TCBSplineTest.h" #include "TexturedGrid.h" #include "Twister.h" #include "PictureGlow.h" TwisterFX::TwisterFX(pp_int32 w, pp_int32 h) : FXAbstract(w,h) { //twister = NULL; //vscreen = NULL; //fx = new Twister(w, h); realw = ((w >> 3) + 1) << 3; realh = ((h >> 3) + 1) << 3; fx = new TexturedGrid(realw, realh, 3); vscreen = new pp_uint16[realw * realh]; } TwisterFX::~TwisterFX() { delete fx; delete[] vscreen; } void TwisterFX::update(pp_uint32 syncFrac) { fx->update(syncFrac*(1.0f/65536.0f)); } void TwisterFX::render(pp_uint8* buffer) { fx->render(vscreen, realw); pp_int32 w = width; pp_int32 h = height; pp_uint8* dst = buffer; pp_uint16* src = vscreen; for (pp_int32 y = 0; y < h; y++) { for (pp_int32 x = 0; x < w; x++) { *dst = (*src >> 11)<<3; *(dst+1) = (*src >> 5)<<2; *(dst+2) = (*src&0x1f)<<3; dst+=3; src++; } src+=realw - w; } } milkytracker-0.90.85+dfsg/src/fx/fpmath.h0000644000175000017500000000206011150223367017255 0ustar admin2admin2/* * fx/fpmath.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef FPMATH_H #define FPMATH_H #include "BasicTypes.h" #define fpceil(x) ((x+65535)>>16) // 16.16 fixed point multiply pp_int32 fpmul(pp_int32 a, pp_int32 b); // 16.16 fixed point division pp_int32 fpdiv(pp_int32 n, pp_int32 d); // 16.16 fixed point squareroot pp_int32 fpsqrt(pp_int32 value); #endif milkytracker-0.90.85+dfsg/src/fx/Makefile.am0000644000175000017500000000131611135201273017657 0ustar admin2admin2noinst_LIBRARIES = libfx.a libfx_a_SOURCES = Camera.cpp Filter.cpp Fire.cpp Math3d.cpp ParticleBlobs.cpp \ ParticleEmitter.cpp ParticleFX.cpp ParticleFun.cpp ParticleScene.cpp \ Starfield.cpp TCBSpline.cpp TCBSplineTest.cpp Texture.cpp TexturedGrid.cpp \ TexturedPlane.cpp Twister.cpp TwisterFX.cpp fpmath.cpp noinst_HEADERS = Camera.h FXAbstract.h FXInterface.h Filter.h Fire.h Math3d.h \ ParticleBlobs.h ParticleEmitter.h ParticleFX.h ParticleFun.h ParticleScene.h \ PictureGlow.h Starfield.h TCBSpline.h TCBSplineTest.h Texture.h TexturedGrid.h \ TexturedPlane.h Twister.h TwisterFX.h fpmath.h INCLUDES = -I$(top_srcdir)/src/ppui -I$(top_srcdir)/src/ppui/osinterface \ -I$(top_srcdir)/src/ppui/osinterface/posix milkytracker-0.90.85+dfsg/src/fx/ParticleEmitter.cpp0000644000175000017500000002567311150223367021445 0ustar admin2admin2/* * fx/ParticleEmitter.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "ParticleEmitter.h" #include "Math3d.h" #include "Filter.h" #include "Texture.h" #undef LENSE_REFLECTION // emitter size is hardcoded at 64 pixels ;) #define TEXTURESIZE_PARTICLE 16 #ifdef LENSE_REFLECTION void createRingTexture(unsigned char* texture, int size, int outer, int inner, int r, int g, int b, float innerShade = 0.0f, float outerShade = 0.0f) { float hx = size>>1; float hy = size>>1; float mid = (outer+inner)>>1; float c = (outer-inner)*0.5f; for (int y = 0; y < size; y++) for (int x = 0; x < size; x++) { float px = x-hx; float py = y-hy; float dist = sqrt(px*px+py*py); float s = 1.0f-(abs(mid-dist)/c); s = (float)pow(sin(s*(M_PI/2.0f)),4.0f); if (mid-dist >= 0) { s+=innerShade; } else s+=outerShade; if (s >= 1.0f) s = 1.0f; if (dist >= inner && dist <= outer) { texture[(y*size+x)*3] = r*s; texture[(y*size+x)*3+1] = g*s; texture[(y*size+x)*3+2] = b*s; } else if (dist < inner) { texture[(y*size+x)*3] = r*innerShade; texture[(y*size+x)*3+1] = g*innerShade; texture[(y*size+x)*3+2] = b*innerShade; } else { texture[(y*size+x)*3] = r*outerShade; texture[(y*size+x)*3+1] = g*outerShade; texture[(y*size+x)*3+2] = b*outerShade; } } } #endif ParticleEmitter::ParticleEmitter(int width, int height, int FOV, int numEmitters, int maxParticles) : ParticleFX(width, height, maxParticles+numEmitters, FOV) { this->maxParticles = maxParticles; setZOffset(0); //temp = new unsigned short[width*height]; //buffer = new unsigned short[width*height]; int i; unsigned char *texture = new unsigned char[TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE*3]; Texture::createFlareTexture(texture, 224, 191, 64, 4.0f, TEXTURESIZE_PARTICLE); flareTexture[0] = new unsigned short[TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE]; flareTexture[1] = new unsigned short[TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE]; flareTexture[2] = new unsigned short[TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE]; for (i = 0; i < TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE*3; i++) texture[i]>>=1; for (i = 0; i < TEXTURESIZE_PARTICLE*TEXTURESIZE_PARTICLE; i++) { //texture[i*3] = texture[i*3+1] = 0; flareTexture[0][i] = RGB2SHORT(texture[i*3],texture[i*3+1],texture[i*3+2]); flareTexture[1][i] = RGB2SHORT(texture[i*3+2],texture[i*3+1],texture[i*3]); flareTexture[2][i] = RGB2SHORT(texture[i*3+1],texture[i*3+2],texture[i*3]); } delete texture; emitterTexture[0] = new unsigned short[64*64]; #ifdef LENSE_REFLECTION emitterTexture[1] = new unsigned short[64*64]; emitterTexture[2] = new unsigned short[64*64]; emitterTexture[3] = new unsigned short[64*64]; emitterTexture[4] = new unsigned short[64*64]; emitterTexture[5] = new unsigned short[64*64]; #endif texture = new unsigned char[64*64*3]; Texture::createFlareTexture(texture, 224, 191, 64, 4.0f, 64); float len = (float)sqrt((float)32*32*2); for (i = 0; i < 64; i++) { float dist = (float)pow((float)(len-sqrt((double)((i-32)*(i-32)*2)))/len,2); int r = texture[(i*64+i)*3]; int g = texture[(i*64+i)*3+1]; int b = texture[(i*64+i)*3+2]; r+=(int)(255*dist); if (r>255) r = 255; g+=(int)(191*dist); if (g>255) g = 255; b+=(int)(64*dist); if (b>255) b = 255; texture[(i*64+i)*3] = r; texture[(i*64+i)*3+1] = g; texture[(i*64+i)*3+2] = b; r = texture[(i*64+63-i)*3]; g = texture[(i*64+63-i)*3+1]; b = texture[(i*64+63-i)*3+2]; r+=(int)(255*dist); if (r>255) r = 255; g+=(int)(191*dist); if (g>255) g = 255; b+=(int)(64*dist); if (b>255) b = 255; texture[(i*64+63-i)*3] = r; texture[(i*64+63-i)*3+1] = g; texture[(i*64+63-i)*3+2] = b; r = texture[(i*64+31)*3]; g = texture[(i*64+31)*3+1]; b = texture[(i*64+31)*3+2]; r+=(int)(255*dist); if (r>255) r = 255; g+=(int)(191*dist); if (g>255) g = 255; b+=(int)(64*dist); if (b>255) b = 255; texture[(i*64+31)*3] = r; texture[(i*64+31)*3+1] = g; texture[(i*64+31)*3+2] = b; r = texture[(31*64+i)*3]; g = texture[(31*64+i)*3+1]; b = texture[(31*64+i)*3+2]; r+=(int)(255*dist); if (r>255) r = 255; g+=(int)(191*dist); if (g>255) g = 255; b+=(int)(64*dist); if (b>255) b = 255; texture[(32*64+i)*3] = r; texture[(32*64+i)*3+1] = g; texture[(32*64+i)*3+2] = b; } // spikey Texture::blur24(texture, 64, 64, 2); Texture::convert24to16(emitterTexture[0], texture, 64*64, 0); #ifdef LENSE_REFLECTION // green ring createRingTexture(texture, 64, 28, 19, 64>>1, 224>>1, 96>>1, 0.0f); Texture::convert24to16(emitterTexture[1], texture, 64*64, 0); // blue ring createRingTexture(texture, 64, 28, 19, 0, 96>>1, 224>>1, 0.4f); Texture::convert24to16(emitterTexture[2], texture, 64*64, 0); // orange ring createRingTexture(texture, 64, 28, 19, 224>>1, 128>>1, 32>>1, 0.4f); Texture::convert24to16(emitterTexture[3], texture, 64*64, 0); // blue ball Texture::createFlareTexture(texture, 0, 96>>1, 224>>1, 1.0f, 64); Texture::convert24to16(emitterTexture[4], texture, 64*64, 0); // red ball Texture::createFlareTexture(texture, 255>>1, 96>>1, 32>>1, 1.0f, 64); Texture::convert24to16(emitterTexture[5], texture, 64*64, 0); #endif delete texture; this->numEmitters = numEmitters; emitters = new Particle[numEmitters]; // create emitters for (i = 0; i < numEmitters; i++) { emitters[i].pos.x = 0; emitters[i].pos.y = 0; emitters[i].pos.z = 0; emitters[i].size = 65536*4; emitters[i].texture = emitterTexture[0]; emitters[i].textureHeight = emitters[i].textureWidth = 64; } for (i = 0; i < maxParticles+numEmitters; i++) { particles[i].pos.x = particles[i].pos.y = particles[i].pos.z = 0; particles[i].texture = flareTexture[0]; particles[i].size = 0; particles[i].grow = 0; } currentParticleIndex = numEmitters; } ParticleEmitter::~ParticleEmitter() { for (int i = 0; i < 3; i++) delete flareTexture[i]; //delete buffer; //delete temp; delete emitterTexture[0]; #ifdef LENSE_REFLECTION delete emitterTexture[1]; delete emitterTexture[2]; delete emitterTexture[3]; delete emitterTexture[4]; delete emitterTexture[5]; #endif delete emitters; } void ParticleEmitter::update(float syncFrac) { int syncFracFP = (int)(syncFrac*65536.0f)<<1; /*int speed = fpmul(syncFracFP, 16384*4); int i; rotMatrix.setID(); particles[0] = emitter; static int j = 1; for (i = 0; i < 10; i++) { particles[j].pos = emitter.pos; particles[j].pos.x += (((rand()&255)-127)<<11); particles[j].pos.z += (((rand()&255)-127)<<11); particles[j].size = 32768; particles[j].direction.x = 0; particles[j].direction.y = -fpmul(((rand()&255)<<8),speed); particles[j].direction.z = 0; particles[j].texture = flareTexture[rand()%3]; particles[j].textureHeight = particles[j].textureWidth = TEXTURESIZE_PARTICLE; j++; if (j>NUMPARTICLES) j = 1; } for (i = 1; i < NUMPARTICLES+1; i++) { particles[i].pos = particles[i].pos+particles[i].direction; //if (particles[i].size >= 256) //{ // particles[i].size -= (syncFracFP>>8); //} //else // particles[i].size = 0; }*/ int speed = fpmul(syncFracFP, 16384); unsigned int i; rotMatrix.setID(); particles[0] = *emitters; unsigned int j = currentParticleIndex; for (unsigned int k = 0; k < numEmitters; k++) { for (i = 0; i < 10; i++) { particles[j].pos = emitters[k].pos; particles[j].size = 32768*2; particles[j].grow = 256; particles[j].direction.x = fpmul(((rand()&255)<<8)-32768,speed); particles[j].direction.y = -fpmul(((rand()&255)<<8)-32768,speed); particles[j].direction.z = fpmul(((rand()&255)<<8)-32768,speed); particles[j].texture = flareTexture[rand()%3]; particles[j].textureHeight = particles[j].textureWidth = TEXTURESIZE_PARTICLE; j++; if (j >= maxParticles+numEmitters) j = numEmitters; } } currentParticleIndex = j; for (i = numEmitters; i < maxParticles+numEmitters; i++) { particles[i].pos = particles[i].pos+particles[i].direction; if (particles[i].size >= particles[i].grow) { particles[i].size -= fpmul(particles[i].grow,syncFracFP<<2); } else particles[i].size = 0; } } void ParticleEmitter::render(unsigned short* vscreen, unsigned int pitch) { ParticleFX::render(vscreen, pitch); #ifdef LENSE_REFLECTION for (int i = 0; i < numEmitters; i++) { // draw lens-flare reflections VectorFP v = rotMatrix*emitters[i].pos; int z = v.z+zOffset; if (z>65536) { if (emitters[i].size) { int rz = fpdiv(65536,z); int ix = (fpmul((v.x),rz)*FOV)+(width>>1)*65536; int iy = (fpmul((v.y),rz)*FOV)+(height>>1)*65536; int size = fpmul((emitters[i].size>>1)*FOV,rz); int ix2 = (width-1)*65536-ix; int iy2 = (height-1)*65536-iy; int dx = ix2-ix; int dy = iy2-iy; int ix3 = (ix+ix2)>>1; int iy3 = (iy+iy2)>>1; Sprite spr; spr.tx = (ix+fpmul(dx,65536*3)); spr.ty = (iy+fpmul(dy,65536*3)); spr.xsize = size<<2; spr.ysize = size<<2; spr.xres = emitters[i].textureWidth-1; spr.yres = emitters[i].textureHeight-1; spr.xoffset = 0; spr.yoffset = 0; spr.texturexres = emitters[i].textureWidth; spr.flags = 0; spr.texture = emitterTexture[4]; drawSprite(vscreen,width, height, pitch, &spr); spr.tx = (ix+fpmul(dx,65536)); spr.ty = (iy+fpmul(dy,65536)); spr.xsize = fpmul(size,65536+32768); spr.ysize = fpmul(size,65536+32768); spr.texture = emitterTexture[1]; drawSprite(vscreen,width, height, pitch, &spr); spr.tx = ix3; spr.ty = iy3; spr.xsize = size>>2; spr.ysize = size>>2; spr.texture = emitterTexture[5]; drawSprite(vscreen,width, height, pitch, &spr); spr.tx = (ix+ix3)>>1; spr.ty = (iy+iy3)>>1; spr.xsize = size; spr.ysize = size; spr.texture = emitterTexture[2]; drawSprite(vscreen,width, height, pitch, &spr); spr.tx = (ix+fpmul(dx,65536*2)); spr.ty = (iy+fpmul(dy,65536*2)); spr.xsize = size; spr.ysize = size; spr.texture = emitterTexture[3]; drawSprite(vscreen,width, height, pitch, &spr); spr.tx = (ix+fpmul(dx,65536*3+32768)); spr.ty = (iy+fpmul(dy,65536*3+32768)); spr.xsize = size>>1; spr.ysize = size>>1; spr.texture = emitterTexture[5]; drawSprite(vscreen,width, height, pitch, &spr); } } } #endif } milkytracker-0.90.85+dfsg/src/fx/Texture.h0000644000175000017500000000273111150223367017443 0ustar admin2admin2/* * fx/Texture.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef TEXTURE__H #define TEXTURE__H class Texture { public: static void createSplineTexture(unsigned char* tex, int numBlocks = 10000, int blockSize = 16); static void createFlareTexture(unsigned char* tex, int r,int g,int b, float pw = 4.0f, unsigned int size = 256); static void createPlasmaTexture(unsigned char* tex, unsigned int size = 256, int smooth = 3, int r = 255, int g = 255, int b = 255); static void convert24to16(unsigned short* dstImage, unsigned char* srcImage, int size = 256*256, unsigned int shifter = 0); static void blur24(unsigned char* tex, unsigned int width, unsigned int height, unsigned int passes = 1); }; #endif milkytracker-0.90.85+dfsg/src/fx/TCBSplineTest.h0000644000175000017500000000200011150223367020413 0ustar admin2admin2/* * fx/TCBSplineTest.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "FXInterface.h" class TCBSplineTest : public FXInterface { private: float* buffer; public: TCBSplineTest(int width, int height); ~TCBSplineTest(); void render(unsigned short* vscreen, unsigned int pitch); void update(float syncFrac); }; milkytracker-0.90.85+dfsg/src/fx/ParticleFX.h0000644000175000017500000000357111150223367020007 0ustar admin2admin2/* * fx/ParticleFX.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PARTICLEFX__H #define PARTICLEFX__H #include "FXInterface.h" #include "Math3d.h" class ParticleFX : public FXInterface { protected: struct Particle { VectorFP pos; VectorFP direction; int size; int grow; unsigned short* texture; int textureWidth, textureHeight; }; struct Sprite { int tx,ty; int xsize,ysize; int xres,yres; int xoffset,yoffset; unsigned short zval; int flags; int shade; unsigned int texturexres; unsigned short *texture; }; int FOV; int zOffset; Particle* particles; unsigned int numParticles; MatrixFP rotMatrix; public: ParticleFX(int width, int height, int numParticles, int FOV = -1); virtual ~ParticleFX(); virtual void render(unsigned short* vscreen, unsigned int pitch); virtual void update(float syncFrac) = 0; void setFOV(int FOV) { this->FOV = FOV; } void setZOffset(int zOffset) { this->zOffset = zOffset; } void setMatrix(MatrixFP& matrix) { rotMatrix = matrix; } MatrixFP getMatrix() { return rotMatrix; } static void drawSprite(unsigned short *buffer, int XMAX, int YMAX, int PITCH, Sprite* spr); }; #endif milkytracker-0.90.85+dfsg/src/fx/Math3d.cpp0000644000175000017500000003434311150223367017462 0ustar admin2admin2/* * fx/Math3d.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Math3d.h" ///////////////////// // VectorFP struct // ///////////////////// VectorFP operator*(pp_int32 s,VectorFP v2) { VectorFP v = {fpmul(v2.x,s),fpmul(v2.y,s),fpmul(v2.z,s)}; return v; } VectorFP operator+ (VectorFP v1,VectorFP v2) { VectorFP v = {v1.x+v2.x,v1.y+v2.y,v1.z+v2.z}; return v; } VectorFP operator- (VectorFP v1,VectorFP v2) { VectorFP v = {v1.x-v2.x,v1.y-v2.y,v1.z-v2.z}; return v; } VectorFP operator- (VectorFP v) { VectorFP vr = {-v.x,-v.y,-v.z}; return vr; } pp_int32 operator* (VectorFP v1,VectorFP v2) { return fpmul(v1.x,v2.x)+fpmul(v1.y,v2.y)+fpmul(v1.z,v2.z); } // vector product VectorFP operator ^(VectorFP v1,VectorFP v2) { VectorFP v; v.x=fpmul(v1.y,v2.z)-fpmul(v1.z,v2.y); v.y=fpmul(v1.z,v2.x)-fpmul(v1.x,v2.z); v.z=fpmul(v1.x,v2.y)-fpmul(v1.y,v2.x); return v; } /////////////////////// // VectorFloat class // /////////////////////// VectorFloat::VectorFloat() { } VectorFloat::VectorFloat(float nx,float ny,float nz) { x = nx; y = ny; z = nz; } VectorFloat::VectorFloat(VectorFP vector) { x = vector.x*(1.0f/65536.0f); y = vector.y*(1.0f/65536.0f); z = vector.z*(1.0f/65536.0f); } void VectorFloat::set(float nx,float ny,float nz) { x = nx; y = ny; z = nz; } void VectorFloat::set(VectorFP vector) { x = vector.x*(1.0f/65536.0f); y = vector.y*(1.0f/65536.0f); z = vector.z*(1.0f/65536.0f); } float VectorFloat::length() { return (float)sqrt(x*x+y*y+z*z); } void VectorFloat::normalize() { float len = (float)sqrt(x*x+y*y+z*z); if (len>0.0f) { x/=len; y/=len; z/=len; } } void VectorFloat::readFromFile(FILE *f) { fread(&x,4,1,f); fread(&y,4,1,f); fread(&z,4,1,f); } VectorFP VectorFloat::convertToFixedPoint() { VectorFP v; v.x = (pp_int32 )(x*65536.0f); v.y = (pp_int32 )(y*65536.0f); v.z = (pp_int32 )(z*65536.0f); return v; } VectorFloat operator*(float s,VectorFloat v2) { VectorFloat v(v2.x*s,v2.y*s,v2.z*s); return v; } VectorFloat operator+ (VectorFloat v1,VectorFloat v2) { VectorFloat v(v1.x+v2.x,v1.y+v2.y,v1.z+v2.z); return v; } VectorFloat operator- (VectorFloat v1,VectorFloat v2) { VectorFloat v(v1.x-v2.x,v1.y-v2.y,v1.z-v2.z); return v; } VectorFloat operator- (VectorFloat v) { VectorFloat vr(-v.x,-v.y,-v.z); return vr; } float operator* (VectorFloat v1,VectorFloat v2) { return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z; } // vector product VectorFloat operator ^(VectorFloat v1,VectorFloat v2) { VectorFloat v; v.x=(v1.y*v2.z)-(v1.z*v2.y); v.y=(v1.z*v2.x)-(v1.x*v2.z); v.z=(v1.x*v2.y)-(v1.y*v2.x); return v; } /////////////////////// // MatrixFloat class // /////////////////////// void MatrixFloat::setID() { form[0][0] = 1.0f; form[0][1] = 0.0f; form[0][2] = 0.0f; form[0][3] = 0.0f; form[1][0] = 0.0f; form[1][1] = 1.0f; form[1][2] = 0.0f; form[1][3] = 0.0f; form[2][0] = 0.0f; form[2][1] = 0.0f; form[2][2] = 1.0f; form[2][3] = 0.0f; form[3][0] = 0.0f; form[3][1] = 0.0f; form[3][2] = 0.0f; form[3][3] = 1.0f; } void MatrixFloat::setRotX(float phi) { form[0][0] = 1.0f; form[0][1] = 0.0f; form[0][2] = 0.0f; form[0][3] = 0.0f; form[1][0] = 0.0f; form[1][1] = (float)cos(phi); form[1][2] = -(float)sin(phi); form[1][3] = 0.0f; form[2][0] = 0.0f; form[2][1] = (float)sin(phi); form[2][2] = (float)cos(phi); form[2][3] = 0.0f; form[3][0] = 0.0f; form[3][1] = 0.0f; form[3][2] = 0.0f; form[3][3] = 1.0f; } void MatrixFloat::setRotY(float phi) { form[0][0] = (float)cos(phi); form[0][1] = 0.0f; form[0][2] = (float)sin(phi); form[0][3] = 0.0f; form[1][0] = 0.0f; form[1][1] = 1.0f; form[1][2] = 0.0f; form[1][3] = 0.0f; form[2][0] = -(float)sin(phi); form[2][1] = 0.0f; form[2][2] = (float)cos(phi); form[2][3] = 0.0f; form[3][0] = 0.0f; form[3][1] = 0.0f; form[3][2] = 0.0f; form[3][3] = 1.0f; } void MatrixFloat::setRotZ(float phi) { form[0][0] = (float)cos(phi); form[0][1] = -(float)sin(phi); form[0][2] = 0.0f; form[0][3] = 0.0f; form[1][0] = (float)sin(phi); form[1][1] = (float)cos(phi); form[1][2] = 0.0f; form[1][3] = 0.0f; form[2][0] = 0.0f; form[2][1] = 0.0f; form[2][2] = 1.0f; form[2][3] = 0.0f; form[3][0] = 0.0f; form[3][1] = 0.0f; form[3][2] = 0.0f; form[3][3] = 1.0f; } void MatrixFloat::setScale(VectorFloat v) { form[0][0] = v.x; form[0][1] = 0.0f; form[0][2] = 0.0f; form[0][3] = 0.0f; form[1][0] = 0.0f; form[1][1] = v.y; form[1][2] = 0.0f; form[1][3] = 0.0f; form[2][0] = 0.0f; form[2][1] = 0.0f; form[2][2] = v.z; form[2][3] = 0.0f; form[3][0] = 0.0f; form[3][1] = 0.0f; form[3][2] = 0.0f; form[3][3] = 1.0f; } void MatrixFloat::setTranslate(VectorFloat v) { form[0][0] = 1.0f; form[0][1] = 0.0f; form[0][2] = 0.0f; form[0][3] = v.x; form[1][0] = 0.0f; form[1][1] = 1.0f; form[1][2] = 0.0f; form[1][3] = v.y; form[2][0] = 0.0f; form[2][1] = 0.0f; form[2][2] = 1.0f; form[2][3] = v.z; form[3][0] = 0.0f; form[3][1] = 0.0f; form[3][2] = 0.0f; form[3][3] = 1.0f; } void MatrixFloat::setSubtract(VectorFloat v) { form[0][0] = 1.0f; form[0][1] = 0.0f; form[0][2] = 0.0f; form[0][3] = -v.x; form[1][0] = 0.0f; form[1][1] = 1.0f; form[1][2] = 0.0f; form[1][3] = -v.y; form[2][0] = 0.0f; form[2][1] = 0.0f; form[2][2] = 1.0f; form[2][3] = -v.z; form[3][0] = 0.0f; form[3][1] = 0.0f; form[3][2] = 0.0f; form[3][3] = 1.0f; } MatrixFloat operator* (MatrixFloat m1,MatrixFloat m2) { pp_int32 i,j,k; MatrixFloat mr; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { mr.form[i][j] = 0.0f; for (k = 0; k < 4; k++) mr.form[i][j] += m1.form[i][k]*m2.form[k][j]; } return mr; } VectorFloat operator* (MatrixFloat m,VectorFloat v) { VectorFloat vr; vr.x = (m.form[0][0]*v.x)+(m.form[0][1]*v.y)+(m.form[0][2]*v.z)+(m.form[0][3]*1.0f); vr.y = (m.form[1][0]*v.x)+(m.form[1][1]*v.y)+(m.form[1][2]*v.z)+(m.form[1][3]*1.0f); vr.z = (m.form[2][0]*v.x)+(m.form[2][1]*v.y)+(m.form[2][2]*v.z)+(m.form[2][3]*1.0f); return vr; } //////////////////// // MatrixFP class // //////////////////// // default constructor MatrixFP::MatrixFP() { } // convert floating point matrix into fixed point matrix MatrixFP::MatrixFP(MatrixFloat matrix) { for (pp_int32 i = 0; i < 4; i++) for (pp_int32 j = 0; j < 4; j++) form[i][j] = (pp_int32 )(matrix.form[i][j]*65536.0f); } void MatrixFP::setID() { form[0][0] = 65536; form[0][1] = 0; form[0][2] = 0; form[0][3] = 0; form[1][0] = 0; form[1][1] = 65536; form[1][2] = 0; form[1][3] = 0; form[2][0] = 0; form[2][1] = 0; form[2][2] = 65536; form[2][3] = 0; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; form[3][3] = 65536; } void MatrixFP::setRotX(float phi) { form[0][0] = 65536; form[0][1] = 0; form[0][2] = 0; form[0][3] = 0; form[1][0] = 0; form[1][1] = (pp_int32 )(cos(phi)*65536.0f); form[1][2] = (pp_int32 )(-sin(phi)*65536.0f); form[1][3] = 0; form[2][0] = 0; form[2][1] = (pp_int32 )(sin(phi)*65536.0f); form[2][2] = (pp_int32 )(cos(phi)*65536); form[2][3] = 0; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; form[3][3] = 65536; } void MatrixFP::setRotY(float phi) { form[0][0] = (pp_int32 )(cos(phi)*65536.0f); form[0][1] = 0; form[0][2] = (pp_int32 )(sin(phi)*65536.0f); form[0][3] = 0; form[1][0] = 0; form[1][1] = 65536; form[1][2] = 0; form[1][3] = 0; form[2][0] = (pp_int32 )(-sin(phi)*65536.0f); form[2][1] = 0; form[2][2] = (pp_int32 )(cos(phi)*65536.0f); form[2][3] = 0; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; form[3][3] = 65536; } void MatrixFP::setRotZ(float phi) { form[0][0] = (pp_int32 )(cos(phi)*65536.0f); form[0][1] = (pp_int32 )(-sin(phi)*65536.0f); form[0][2] = 0; form[0][3] = 0; form[1][0] = (pp_int32 )(sin(phi)*65536.0f); form[1][1] = (pp_int32 )(cos(phi)*65536.0f); form[1][2] = 0; form[1][3] = 0; form[2][0] = 0; form[2][1] = 0; form[2][2] = 65536; form[2][3] = 0; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; form[3][3] = 65536; } void MatrixFP::setRotXYZ(float phiX,float phiY,float phiZ) { MatrixFP m1,m2,m3,mr; m1.setRotX(phiX); m2.setRotY(phiY); m3.setRotZ(phiZ); mr = m2*m1; mr = mr*m3; memcpy(&form,&mr.form,sizeof(form)); } void MatrixFP::setScale(VectorFloat v) { form[0][0] = (pp_int32 )(v.x*65536.0f); form[0][1] = 0; form[0][2] = 0; form[0][3] = 0; form[1][0] = 0; form[1][1] = (pp_int32 )(v.y*65536.0f); form[1][2] = 0; form[1][3] = 0; form[2][0] = 0; form[2][1] = 0; form[2][2] = (pp_int32 )(v.z*65536.0f); form[2][3] = 0; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; form[3][3] = 65536; } void MatrixFP::setScale(VectorFP v) { form[0][0] = v.x; form[0][1] = 0; form[0][2] = 0; form[0][3] = 0; form[1][0] = 0; form[1][1] = v.y; form[1][2] = 0; form[1][3] = 0; form[2][0] = 0; form[2][1] = 0; form[2][2] = v.z; form[2][3] = 0; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; form[3][3] = 65536; } void MatrixFP::setTranslate(VectorFP v) { form[0][0] = 65536; form[0][1] = 0; form[0][2] = 0; form[0][3] = v.x; form[1][0] = 0; form[1][1] = 65536; form[1][2] = 0; form[1][3] = v.y; form[2][0] = 0; form[2][1] = 0; form[2][2] = 65536; form[2][3] = v.z; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; form[3][3] = 65536; } void MatrixFP::setSubtract(VectorFP v) { form[0][0] = 65536; form[0][1] = 0; form[0][2] = 0; form[0][3] = -v.x; form[1][0] = 0; form[1][1] = 65536; form[1][2] = 0; form[1][3] = -v.y; form[2][0] = 0; form[2][1] = 0; form[2][2] = 65536; form[2][3] = -v.z; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; form[3][3] = 65536; } void MatrixFP::stripTranslation() { form[0][3] = 0; form[1][3] = 0; form[2][3] = 0; form[3][3] = 65536; form[3][0] = 0; form[3][1] = 0; form[3][2] = 0; } MatrixFP operator* (MatrixFP &m1,MatrixFP &m2) { pp_int32 i,j,k; MatrixFP mr; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { mr.form[i][j] = 0; for (k = 0; k < 4; k++) mr.form[i][j] += fpmul(m1.form[i][k],m2.form[k][j]); } return mr; } VectorFP operator* (MatrixFP &m,VectorFP &v) { VectorFP vr; vr.x = fpmul(m.form[0][0],v.x)+fpmul(m.form[0][1],v.y)+fpmul(m.form[0][2],v.z)+m.form[0][3]; vr.y = fpmul(m.form[1][0],v.x)+fpmul(m.form[1][1],v.y)+fpmul(m.form[1][2],v.z)+m.form[1][3]; vr.z = fpmul(m.form[2][0],v.x)+fpmul(m.form[2][1],v.y)+fpmul(m.form[2][2],v.z)+m.form[2][3]; return vr; } //////////////////////////////// // floating point quaternions // //////////////////////////////// void QuaternionFloat::normalize() { float len1 = (w*w)+(v.x*v.x)+(v.y*v.y)+(v.z*v.z); len1 = 1.0f/(float)sqrt(len1); w*=len1; v.x*=len1; v.y*=len1; v.z*=len1; } QuaternionFP QuaternionFloat::convertToFixedPoint() { QuaternionFP q; q.v = v.convertToFixedPoint(); q.w = (pp_int32 )(w*65536.0f); return q; } QuaternionFloat operator *(QuaternionFloat q1,float s) { QuaternionFloat q; q.w=s*q1.w; q.v.x=s*q1.v.x; q.v.y=s*q1.v.y; q.v.z=s*q1.v.z; return q; }; QuaternionFloat operator +(QuaternionFloat q1,QuaternionFloat q2) { QuaternionFloat q; q.w=q1.w+q2.w; q.v.x=q1.v.x+q2.v.x; q.v.y=q1.v.y+q2.v.y; q.v.z=q1.v.z+q2.v.z; return q; }; QuaternionFloat operator -(QuaternionFloat q1,QuaternionFloat q2) { QuaternionFloat q; q.w=q1.w-q2.w; q.v.x=q1.v.x-q2.v.x; q.v.y=q1.v.y-q2.v.y; q.v.z=q1.v.z-q2.v.z; return q; } QuaternionFloat operator *(QuaternionFloat q1,QuaternionFloat q2) { QuaternionFloat q; q.w=(q1.w*q2.w)-(q1.v*q2.v); q.v=(q1.w*q2.v)+(q2.w*q1.v)+(q1.v^q2.v); return q; } MatrixFP quaternionToMatrixFP(QuaternionFloat q) { MatrixFP m; m.form[0][0]=(pp_int32 )((1.0f-(2.0f*q.v.y*q.v.y)-(2.0f*q.v.z*q.v.z))*65536.0f); m.form[0][1]=(pp_int32 )((2.0f*q.v.x*q.v.y+2.0f*q.w*q.v.z)*65536.0f); m.form[0][2]=(pp_int32 )((2.0f*q.v.x*q.v.z-2.0f*q.w*q.v.y)*65536.0f); m.form[0][3]=0; m.form[1][0]=(pp_int32 )((2.0f*q.v.x*q.v.y-2.0f*q.w*q.v.z)*65536.0f); m.form[1][1]=(pp_int32 )((1.0f-(2.0f*q.v.x*q.v.x)-(2.0f*q.v.z*q.v.z))*65536.0f); m.form[1][2]=(pp_int32 )((2.0f*q.v.y*q.v.z+2.0f*q.w*q.v.x)*65536.0f); m.form[1][3]=0; m.form[2][0]=(pp_int32 )((2.0f*q.v.x*q.v.z+2.0f*q.w*q.v.y)*65536.0f); m.form[2][1]=(pp_int32 )((2.0f*q.v.y*q.v.z-2.0f*q.w*q.v.x)*65536.0f); m.form[2][2]=(pp_int32 )((1.0f-(2.0f*q.v.x*q.v.x)-(2.0f*q.v.y*q.v.y))*65536.0f); m.form[2][3]=0; m.form[3][0] = m.form[3][1] = m.form[3][2] = 0; m.form[3][3] = 65536; return m; } ///////////////////////////// // Fixed Point Quaternions // ///////////////////////////// QuaternionFP operator *(QuaternionFP &q1,pp_int32 s) { QuaternionFP q; q.w=fpmul(s,q1.w); q.v.x=fpmul(s,q1.v.x); q.v.y=fpmul(s,q1.v.y); q.v.z=fpmul(s,q1.v.z); return q; }; QuaternionFP operator +(QuaternionFP &q1,QuaternionFP &q2) { QuaternionFP q; q.w=q1.w+q2.w; q.v.x=q1.v.x+q2.v.x; q.v.y=q1.v.y+q2.v.y; q.v.z=q1.v.z+q2.v.z; return q; }; QuaternionFP operator -(QuaternionFP &q1,QuaternionFP &q2) { QuaternionFP q; q.w=q1.w-q2.w; q.v.x=q1.v.x-q2.v.x; q.v.y=q1.v.y-q2.v.y; q.v.z=q1.v.z-q2.v.z; return q; } QuaternionFP operator *(QuaternionFP &q1,QuaternionFP &q2) { QuaternionFP q; q.w=fpmul(q1.w,q2.w)-q1.v*q2.v; q.v=(q1.w*q2.v)+(q2.w*q1.v)+(q1.v^q2.v); return q; } MatrixFP quaternionToMatrixFP(QuaternionFP &q) { MatrixFP m; m.form[0][0]=(pp_int32 )((65536-(2*fpmul(q.v.y,q.v.y))-(2*fpmul(q.v.z,q.v.z)))); m.form[0][1]=(pp_int32 )((2*fpmul(q.v.x,q.v.y)+2*fpmul(q.w,q.v.z))); m.form[0][2]=(pp_int32 )((2*fpmul(q.v.x,q.v.z)-2*fpmul(q.w,q.v.y))); m.form[0][3]=0; m.form[1][0]=(pp_int32 )((2*fpmul(q.v.x,q.v.y)-2*fpmul(q.w,q.v.z))); m.form[1][1]=(pp_int32 )((65536-(2*fpmul(q.v.x,q.v.x))-(2*fpmul(q.v.z,q.v.z)))); m.form[1][2]=(pp_int32 )((2*fpmul(q.v.y,q.v.z)+2*fpmul(q.w,q.v.x))); m.form[1][3]=0; m.form[2][0]=(pp_int32 )((2*fpmul(q.v.x,q.v.z)+2*fpmul(q.w,q.v.y))); m.form[2][1]=(pp_int32 )((2*fpmul(q.v.y,q.v.z)-2*fpmul(q.w,q.v.x))); m.form[2][2]=(pp_int32 )((65536-(2*fpmul(q.v.x,q.v.x))-(2*fpmul(q.v.y,q.v.y)))); m.form[2][3]=0; m.form[3][0] = m.form[3][1] = m.form[3][2] = 0; m.form[3][3] = 65536; return m; } milkytracker-0.90.85+dfsg/src/fx/TexturedGrid.cpp0000644000175000017500000002542011150223367020750 0ustar admin2admin2/* * fx/TexturedGrid.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "TexturedGrid.h" #include "Math3d.h" #include "Filter.h" #include "Texture.h" #define PRGB2SHORT(r,g,b) ((((r))<<11)+(((g))<<5)+((b))) #define RGB2SHORT(r,g,b) ((((r>>3))<<11)+(((g>>2))<<5)+((b>>3))) #define TEXTURESIZE 256 #define REDMASK (0x1F<<11) #define GREENMASK (0x3F<<5) #define BLUEMASK 0x1F TexturedGrid::TexturedGrid(int width, int height, int gridshift) { this->width = width; this->height = height; this->gridshift = gridshift; this->gridsize = 1 << gridshift; this->gridWidth = (width>>gridshift)+1; this->gridHeight = (height>>gridshift)+1; grid = new VectorFP[gridWidth*gridHeight]; this->texture = NULL; // we're not rendering anything until texture is set this->buffer = new unsigned short[width*height]; // for debugging, load texture int i; /*unsigned char *texture = new unsigned char[TEXTURESIZE*TEXTURESIZE*3]; //FILE* f = fopen("/demo/t2new.tga","rb"); //fseek(f,18,SEEK_SET); //fread(texture,TEXTURESIZE*TEXTURESIZE,3,f); //fclose(f); Texture::createSplineTexture(texture); this->texture = new unsigned short[TEXTURESIZE*TEXTURESIZE]; for (i = 0; i < TEXTURESIZE*TEXTURESIZE; i++) { this->texture[i] = RGB2SHORT(texture[i*3]>>0,texture[i*3+1]>>0,texture[i*3+2]>>0); } delete texture;*/ unsigned char* rgbTex = new unsigned char[256*256*3]; unsigned char* rgbTex2 = new unsigned char[256*256*3]; texture = new unsigned short[256*256]; Texture::createSplineTexture(rgbTex); /*Texture::createPlasmaTexture(rgbTex2, 256, 3, 255, 255, 255); for (i = 0; i < 256*256; i++) { int r = (rgbTex2[i*3]>>0) - (rgbTex[i*3]>>0) + 63*2; int g = (rgbTex2[i*3+1]>>0) - (rgbTex[i*3+1]>>0) + 31*2; int b = (rgbTex2[i*3+2]>>0) - (rgbTex[i*3+2]>>0) + 9*2; if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; rgbTex[i*3] = r; rgbTex[i*3+1] = g; rgbTex[i*3+2] = b; }*/ Texture::convert24to16(texture, rgbTex, 256*256, 1); delete[] rgbTex; delete[] rgbTex2; for (i = 0; i < 1024; i++) sintab[i] = (int)(sin((float)i/512.0f*M_PI)*65536.0f); } TexturedGrid::~TexturedGrid() { if (grid) delete[] grid; if (buffer) delete[] buffer; if (texture) delete[] texture; } struct Blob { int x,y,z; int strength; }; static Blob blobs[] = {{128,128,0,65536/16},{100,100,0,65536/16},{100,100,0,65536/16}}; #define MAXCLAMP 65536 void TexturedGrid::update(float syncFrac) { int gridSizeX = gridWidth; int gridSizeY = gridHeight; int x,y; VectorFP* gridPt = grid; float phi = ::PPGetTickCount()*0.001f*0.5f;; blobs[0].x = (int)(sin(phi*4.0f)*8.0f*65536.0f); blobs[0].y = (int)(cos(phi*4.0f)*8.0f*65536.0f); blobs[0].z = (int)(sin(phi*4.0f)*8.0f*65536.0f); blobs[1].x = (int)(cos(-phi*2.0f)*8.0f*65536.0f); blobs[1].y = (int)(sin(phi*2.0f)*8.0f*65536.0f); blobs[1].z = (int)(cos(phi*2.0f)*8.0f*65536.0f); blobs[2].x = (int)(cos(-phi*3.0f)*12.0f*65536.0f); blobs[2].y = (int)(cos(phi*3.0f)*6.0f*65536.0f); blobs[2].z = (int)(sin(phi*3.0f)*10.0f*65536.0f); int numBlobs = sizeof(blobs)/sizeof(Blob); int pulse = (int)((sin(phi*16.0f)+1.0f)*32768.0f); int phiFP = (int)(phi*1024.0f); MatrixFP m; m.setRotZ(phi); for (y = 0; y < gridSizeY; y++) for ( x = 0; x < gridSizeX; x++) { VectorFP p; p.x = ((x-(gridSizeX>>1))<<16); p.y = ((y-(gridSizeY>>1))<<16); p.z = 0; p = m*p; int xOffset = /*0*/sintab[((p.x>>11)+phiFP)&1023]*32; int yOffset = /*0*/sintab[((p.y>>11)+phiFP)&1023]*32; //int xOffset = 0; //int yOffset = 0; gridPt->x = (((p.x>>1)-(gridSizeX<<15))<<4)+yOffset; gridPt->y = (((p.y>>1)-(gridSizeY<<15))<<4)+xOffset; gridPt->z = 256*65536; ////////////////////////////////////////////////////////////////////// // blob stuff ////////////////////////////////////////////////////////////////////// /*VectorFP p; p.x = ((x-(gridSizeX>>1))<<16); p.y = ((y-(gridSizeY>>1))<<16); p.z = 0.0f; /*int scale = 32768; for (int j = 0; j < numBlobs; j++) { int dx = fpmul((blobs[j].x-p.x),blobs[j].strength); int dy = fpmul((blobs[j].y-p.y),blobs[j].strength); int dz = fpmul((blobs[j].z-p.z),blobs[j].strength); int sd = fpmul(dx,dx)+fpmul(dy,dy)+fpmul(dz,dz); if (sd<(0.707f*0.707f*65536)) scale += (fpmul(sd,sd)-sd+16384)*4; } if (scale>=MAXCLAMP) scale = MAXCLAMP; scale = fpmul(scale,scale); scale = fpmul(scale,scale); gridPt->x = fpdiv(p.x,scale+32768)<<4; gridPt->y = fpdiv(p.y,scale+32768)<<4; gridPt->z = 256*65536;*/ ////////////////////////////////////////////////////////////////////// // airbag ////////////////////////////////////////////////////////////////////// /*int len = fpsqrt(fpmul(p.x-blobs[0].x,p.x-blobs[0].x)+fpmul(p.y-blobs[0].y,p.y-blobs[0].y)); if (len>16*65536) len = 16*65536; int scale = len>>4; scale = fpmul(scale,scale); scale = fpmul(scale,scale); scale = fpmul(scale,scale); scale = 65536-fpmul((65536-scale),pulse); gridPt->x = fpmul(p.x,(scale<<2)+165536); gridPt->y = fpmul(p.y,(scale<<2)+165536); gridPt->z = 256*65536;*/ ////////////////////////////////////////////////////////////////////// // scale waves ////////////////////////////////////////////////////////////////////// /*int len = fpsqrt(fpmul(p.x-blobs[0].x,p.x-blobs[0].x)+fpmul(p.y-blobs[0].y,p.y-blobs[0].y)+fpmul(p.z,p.z)); int scale = 65536-((sintab[((len>>10)+phiFP)&1023]+65536)>>1); scale = fpmul(scale,scale); //scale = fpmul(scale,scale); //scale = fpmul(scale,scale); //scale = 65536-fpmul((65536-scale),pulse); gridPt->x = fpmul(p.x,(scale<<2)+165536); gridPt->y = fpmul(p.y,(scale<<2)+165536); gridPt->z = 256*65536;*/ ////////////////////////////////////////////////////////////////////// // displacement waves ////////////////////////////////////////////////////////////////////// /*int cx = 0;//blobs[0].x; int cy = 0;//blobs[0].y; int dx = cx - p.x; int dy = cy - p.y; int len = fpsqrt(fpmul(dx,dx)+fpmul(dy,dy)); if (len) { dx = fpdiv(dx, len); dy = fpdiv(dy, len); } int scale = sintab[((len>>10)-(phiFP<<1))&1023]; //scale = fpmul(scale,scale); //scale = fpmul(scale,scale); //scale = fpmul(scale,scale); //scale = 65536-fpmul((65536-scale),pulse); gridPt->x = ((p.x+(phiFP<<4))<<3)+(fpmul(dx,scale<<5)); gridPt->y = (p.y<<3)+(fpmul(dy,scale<<5)); gridPt->z = 128*(scale+65536+8192);*/ gridPt++; } phi+=0.1f; } void TexturedGrid::render(unsigned short* vscreen, unsigned int pitch) { if (texture == NULL) return; int x,y; unsigned short* tex = texture; int GRIDSIZE = gridsize; int GRIDSHIFT = gridshift; int PITCH = pitch; int gridSizeX = gridWidth-1; int gridSizeY = gridHeight-1; for (y=0;yx; int sv1 = gridul->y; int si1 = gridul->z; int su2 = gridur->x; int sv2 = gridur->y; int si2 = gridur->z; int du1 = (gridll->x-gridul->x)>>GRIDSHIFT; int dv1 = (gridll->y-gridul->y)>>GRIDSHIFT; int di1 = (gridll->z-gridul->z)>>GRIDSHIFT; int du2 = (gridlr->x-gridur->x)>>GRIDSHIFT; int dv2 = (gridlr->y-gridur->y)>>GRIDSHIFT; int di2 = (gridlr->z-gridur->z)>>GRIDSHIFT; int y2,x2; for (y2=0;y2>GRIDSHIFT; int su = su1; int fv = (sv2-sv1)>>GRIDSHIFT; int sv = sv1; int fi = (si2-si1)>>GRIDSHIFT; int si = si1; for (x2=0;x2>8)&0xff00)+((su>>16)&0xff))); //unsigned int rgb = tex[ofs]; //int r = ((rgb>>11)*si)>>24; //int g = (((rgb>>5)&0x3f)*si)>>24; //int b = ((rgb&0x1f)*si)>>24; //*vscreenPtr = PRGB2Short(r,g,b); //if (si <= 256*65536) //{ unsigned int wRGB = tex[((((sv>>8)&0xff00)+((su>>16)&0xff)))]; unsigned int lTemp = (((wRGB&(REDMASK|BLUEMASK))<<11)|((wRGB & GREENMASK) >> 5))*(si>>19); *vscreenPtr = ((lTemp >> (11 + 5)) & (REDMASK | BLUEMASK))|(lTemp & GREENMASK); /*} else { int shade = (si-256*65536)>>16; unsigned int rgb16_1 = tex[((((sv>>8)&0xff00)+((su>>16)&0xff)))]; unsigned int rgb16_2 = RGB2SHORT(shade,shade,shade); unsigned int result = (rgb16_1&0xF800)+(rgb16_2&0xF800); if (result>0xF800) result = 0xF800; unsigned int t = (rgb16_1&0x7E0)+(rgb16_2&0x7E0); if (t>0x7E0) t = 0x7E0; result|=t; t = (rgb16_1&0x1F)+(rgb16_2&0x1F); if (t>0x1F) t = 0x1F; result|=t; *vscreenPtr = result; }*/ //*vscreenPtr = tex[((((sv>>8)&0xff00)+((su>>16)&0xff)))]; // enable for motion blur /*unsigned int mask=0x07e0f81f; int texel = tex[((((sv>>8)&0xff00)+((su>>16)&0xff)))]; int pixel = *vscreenPtr; texel = ((texel<<16) | texel)&mask; pixel = ((pixel<<16) | pixel)&mask; int mix =((((texel-pixel)*(10))>>5)+pixel)&mask; *vscreenPtr = (mix | (mix>>16))&0xffff;*/ su+=fu; sv+=fv; si+=fi; vscreenPtr++; } su1+=du1; su2+=du2; sv1+=dv1; sv2+=dv2; si1+=di1; si2+=di2; vscreenPtr+=(PITCH-GRIDSIZE); } } } /*double phi = GetTickCount()*0.01f; int scale = (sin(phi)+1.0f) * 65536.0f * 2.0f; Filter::glow(vscreen, width, height, pitch, glowBuffer1, glowBuffer2, 2, scale);*/ double phi = ::PPGetTickCount()*0.001f; //phi = 0.0f; int cx = (int)(sin(-phi)*(width*(1.0/3.0f))+(width*(1.0/2.0f))); int cy = (int)(cos(-phi)*(height*(1.0/3.0f))+(height*(1.0/2.0f))); //int radius = sin(phi)*2048 + 2048; int radius = 2048; Filter::applyRadial(vscreen, width, height, pitch, cx, cy, radius, 1); //Filter::applyBoxed(vscreen, buffer, width, height, pitch, 2); //Filter<160,120>::applyBoxed(vscreen, buffer, 4); //memcpy(vscreen, buffer, width*height*2); } milkytracker-0.90.85+dfsg/src/fx/Camera.h0000644000175000017500000000205211150223367017167 0ustar admin2admin2/* * fx/Camera.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef CAMERA__H #define CAMERA__H #include "Math3d.h" class Camera { public: VectorFP position,target; float bank,lens; MatrixFP trackPositionMatrix,trackTargetMatrix; Camera(); Camera(VectorFP& pos, VectorFP& target); MatrixFP getMatrix(); MatrixFP getMatrixInverse(); }; #endif milkytracker-0.90.85+dfsg/src/fx/FXInterface.h0000644000175000017500000000200411150223367020132 0ustar admin2admin2/* * fx/FXInterface.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef FXINTERFACE__H #define FXINTERFACE__H class FXInterface { protected: int width, height; public: virtual ~FXInterface() {} virtual void render(unsigned short* vscreen, unsigned int pitch) = 0; virtual void update(float syncFrac) = 0; }; #endif milkytracker-0.90.85+dfsg/src/fx/ParticleFX.cpp0000644000175000017500000001074711150223367020345 0ustar admin2admin2/* * fx/ParticleFX.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "ParticleFX.h" #include "Math3d.h" #include "Filter.h" #define PRGB2SHORT(r,g,b) ((((r))<<11)+(((g))<<5)+((b))) #define RGB2SHORT(r,g,b) ((((r>>3))<<11)+(((g>>2))<<5)+((b>>3))) // draw glenzed/scaled sprite into virtual screen // (subpixel/texel accurate) void ParticleFX::drawSprite(unsigned short *buffer, int XMAX, int YMAX, int PITCH, Sprite* spr) { int xmax = XMAX<<16; int ymax = YMAX<<16; int xmaxdec = xmax-(1<<16); int ymaxdec = ymax-(1<<16); int x,y,fx,sy,adder,ady,adx; int stepx,stepy,ky,zy,kx,zx; unsigned short *vidink; int xsize = spr->xsize; int ysize = spr->ysize; int tx = spr->tx; int ty = spr->ty; if (xsize == 0) return; if (ysize == 0) return; stepx = fpdiv(65536*spr->xres,xsize); stepy = fpdiv(65536*spr->yres,ysize); ty-=(ysize>>1); tx-=(xsize>>1); ky = zx = zy = kx = 0; if ((spr->flags&1)) { zx = spr->xres<<16; stepx=-stepx; } if (ty<0) { ky+=(-ty); zy+=fpmul(-ty,stepy); } if (tx<0) { kx+=(-tx); zx+=fpmul(-tx,stepx); } if ((ty+ysize)>ymaxdec) ysize-=(ty+ysize)-ymax; if ((tx+xsize)>xmaxdec) xsize-=(tx+xsize)-xmax; if (ky>=ysize) return; if (kx>=xsize) return; if ((ysize+ty)<0) return; if ((xsize+tx)<0) return; adx = stepx; ady = stepy; int y1 = ky+ty; int y2 = ty+ysize; int x1 = kx+tx; int x2 = tx+xsize; int ry1 = fpceil(y1); int ry2 = fpceil(y2); int rx1 = fpceil(x1); int rx2 = fpceil(x2); if (rx2>(xmax>>16)) rx2=xmax>>16; if (ry2>(ymax>>16)) ry2=ymax>>16; int width = rx2-rx1; int height = ry2-ry1; if (!width) return; if (!height) return; int prestep = (fpceil(y1)<<16)-y1; zy+=fpmul(prestep,stepy); sy=zy; prestep = (rx1<<16)-x1; fx = (zx+fpmul(prestep,stepx)); vidink = (ry1*PITCH+rx1)+buffer; adder = ((PITCH-rx2)+rx1); for (y=0;y>16)+spr->yoffset)*spr->texturexres))+spr->texture; int ofs = fx+(spr->xoffset<<16); for (x=0;x>16]; unsigned int result = (rgb16_1&0xF800)+(rgb16_2&0xF800); if (result>0xF800) result = 0xF800; unsigned int t = (rgb16_1&0x7E0)+(rgb16_2&0x7E0); if (t>0x7E0) t = 0x7E0; result|=t; t = (rgb16_1&0x1F)+(rgb16_2&0x1F); if (t>0x1F) t = 0x1F; result|=t; *vidink++ = result; ofs+=adx; } vidink+=adder; sy+=ady; } } ParticleFX::ParticleFX(int width, int height, int numParticles, int FOV) { this->width = width; this->height = height; if (FOV != -1) this->FOV = FOV; else this->FOV = (this->width * 256) / 320; zOffset = 0; particles = new Particle[numParticles]; this->numParticles = numParticles; } ParticleFX::~ParticleFX() { if (particles) delete particles; } void ParticleFX::render(unsigned short* vscreen, unsigned int pitch) { int XMAX = width; int YMAX = height; int PITCH = pitch; MatrixFP rotMatrix = this->rotMatrix; int zOffset = this->zOffset; int FOV = this->FOV; for (unsigned int i = 0; i < numParticles; i++) { VectorFP v = rotMatrix*particles[i].pos; int z = v.z+zOffset; if (z>65536) { if (particles[i].size > 0) { int rz = fpdiv(65536,z); int x = (fpmul((v.x),rz)*FOV)+(XMAX>>1)*65536; int y = (fpmul((v.y),rz)*FOV)+(YMAX>>1)*65536; int size = fpmul((particles[i].size*4)*FOV,rz); Sprite spr; spr.tx = x; spr.ty = y; spr.xsize = size; spr.ysize = size; spr.xres = particles[i].textureWidth-1; spr.yres = particles[i].textureHeight-1; spr.xoffset = 0; spr.yoffset = 0; spr.texturexres = particles[i].textureWidth; spr.flags = 0; spr.texture = particles[i].texture; drawSprite(vscreen,XMAX, YMAX, PITCH, &spr); } } } } void ParticleFX::update(float SyncFrac) { } milkytracker-0.90.85+dfsg/src/fx/Filter.cpp0000644000175000017500000003154511150223367017570 0ustar admin2admin2/* * fx/Filter.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "fpmath.h" #include "Filter.h" #define PRGB2Short(r,g,b) ((((r))<<11)+(((g))<<5)+((b))) void Filter::applyRadialToSector(unsigned short *buffer, int width, int height,int pitch, int xCenter,int yCenter,int xBound,int yBound, int radius, int style) { int stx=-1,sty=-1; if (yBound>yCenter) sty=1; if (xBound>xCenter) stx=1; int i = yCenter; switch (style) { case 0: while (i!=yBound) { int j = xCenter; unsigned short *line = buffer+i*pitch; int vs = (((yCenter-i)*radius))+(i<<16); int v0=(vs>>16)*pitch; int b=(vs>>11)&31; int v1=v0+pitch; while (j!=xBound) { int h0,h1,h2,h3; int at;//,c,col; int u0,u1; int us = (((xCenter-j)*radius))+(j<<16); unsigned int mask=0x07e0f81f; u0=(us>>16); at=(us>>11)&31; u1=u0+1; h0=buffer[(u0+v0)]; h2=buffer[(u0+v1)]; h1=buffer[(u1+v0)]; h3=buffer[(u1+v1)]; h1 = ((h1<<16) | h1)&mask; h2 = ((h2<<16) | h2)&mask; h3 = ((h3<<16) | h3)&mask; h0 = ((h0<<16) | h0)&mask; int blend_top =((((h1-h0)*(at))>>5)+h0)&mask; int blend_bot =((((h3-h2)*(at))>>5)+h2)&mask; int total = ((((blend_bot - blend_top)*(b))>>5)+blend_top)&mask; int source = line[j]; source = ((source<<16) | source)&mask; int mix =((((source-total)*(15))>>5)+total)&mask; line[j] = (mix | (mix>>16))&0xffff;//( (total & 0xF7DE) >> 1) + ( (source & 0xF7DE) >> 1); j+=stx; } i+=sty; } break; case 1: while (i!=yBound) { int j = xCenter; unsigned short *line = buffer+i*pitch; int vs = (((yCenter-i)*radius))+(i<<16); int v0=(vs>>16)*pitch; int b=(vs>>11)&31; int v1=v0+pitch; while (j!=xBound) { int h0,h1,h2,h3; int at;//,c,col; int u0,u1; int us = (((xCenter-j)*radius))+(j<<16); unsigned int mask=0x07e0f81f; u0=(us>>16); at=(us>>11)&31; u1=u0+1; h0=buffer[(u0+v0)]; h2=buffer[(u0+v1)]; h1=buffer[(u1+v0)]; h3=buffer[(u1+v1)]; h1 = ((h1<<16) | h1)&mask; h2 = ((h2<<16) | h2)&mask; h3 = ((h3<<16) | h3)&mask; h0 = ((h0<<16) | h0)&mask; int blend_top =((((h1-h0)*(at))>>5)+h0)&mask; int blend_bot =((((h3-h2)*(at))>>5)+h2)&mask; int total = ((((blend_bot - blend_top)*(b))>>5)+blend_top)&mask; int source = line[j]; total = (total | (total>>16))&0xffff; int r = ((source>>11)+((total>>11))); r-=4; if (r<0) r = 0; if (r>0x1f) r = 0x1f; int g = (((source>>5)&0x3f)+(((total>>5)&0x3f))); g-=8; if (g<0) g = 0; if (g>0x3f) g = 0x3f; int bc = ((source&0x1f)+((total&0x1f))); bc-=4; if (bc<0) bc = 0; if (bc>0x1f) bc = 0x1f; line[j] = (r<<11)+(g<<5)+bc; j+=stx; } i+=sty; } break; } } void Filter::applyRadial(unsigned short *buffer, int width, int height,int pitch, int xCenter,int yCenter, int radius, int style) { applyRadialToSector(buffer,width, height, pitch, xCenter-1, yCenter-1, 0, 0, radius, style); applyRadialToSector(buffer,width, height, pitch, xCenter, yCenter-1, width, 0, radius, style); applyRadialToSector(buffer,width, height, pitch, xCenter-1, yCenter, 0, height, radius, style); applyRadialToSector(buffer,width, height, pitch, xCenter, yCenter, width, height, radius, style); } void Filter::applyHorizontal(unsigned short *src, unsigned short *dst, int width, int height, int pitch, int boxw) { int x,y; if (boxw<0) { memcpy(dst,src,pitch*height*2); // deal with degenerate kernel sizes return; } if (boxw>=width) boxw=width-1; int mul=65536/(boxw*2+1); for (y=0;y>11; totg+=(src[x]>>5)&0x3f; totb+=src[x]&0x1f; } for (x=0;xboxw) { totr-=src[(-boxw-1)]>>11; totg-=(src[(-boxw-1)]>>5)&0x3f; totb-=src[(-boxw-1)]&0x1f; } if (x+boxw>11; totg+=(src[boxw]>>5)&0x3f; totb+=src[boxw]&0x1f; } int finalr = (totr*mul)>>16; int finalg = (totg*mul)>>16; int finalb = (totb*mul)>>16; *dst = (finalr<<11)+(finalg<<5)+finalb; dst++; src++; } } } void Filter::applyVertical(unsigned short *src, unsigned short *dst, int width, int height, int pitch, int boxw) { int x,y; if (boxw<0) { memcpy(dst,src,pitch*height*2); // deal with degenerate kernel sizes return; } if (boxw>=width) boxw=width-1; int mul=65536/(boxw*2+1); for (x=0;x>11; totg+=(*srcPtr>>5)&0x3f; totb+=*srcPtr&0x1f; srcPtr+=width; } srcPtr = src+x; unsigned short* dstPtr = dst+x; int offsm = (-boxw-1)*pitch; int offsp = boxw*pitch; for (y=0;yboxw) { totr-=srcPtr[offsm]>>11; totg-=(srcPtr[offsm]>>5)&0x3f; totb-=srcPtr[offsm]&0x1f; } if (y+boxw>11; totg+=(srcPtr[offsp]>>5)&0x3f; totb+=srcPtr[offsp]&0x1f; } int finalr = (totr*mul)>>16; int finalg = (totg*mul)>>16; int finalb = (totb*mul)>>16; *dstPtr = (finalr<<11)+(finalg<<5)+finalb; dstPtr+=width; srcPtr+=width; } } } void Filter::applyBoxed(unsigned short *srcImage, unsigned short *dstImage, int width, int height, int pitch, int boxw) { if (boxw<0) { return; } //int pitch = width; int x,y; int mul = 65536/(boxw*2+1); { unsigned short* src = srcImage; if (boxw>=width) boxw=width-1; for (y=0;y>11; totg+=(src[x]>>5)&0x3f; totb+=src[x]&0x1f; } unsigned short* dst = dstImage+y; for (x=0;xboxw) { totr-=src[(-boxw-1)]>>11; totg-=(src[(-boxw-1)]>>5)&0x3f; totb-=src[(-boxw-1)]&0x1f; } if (x+boxw>11; totg+=(src[boxw]>>5)&0x3f; totb+=src[boxw]&0x1f; } int finalr = (totr*mul)>>16; int finalg = (totg*mul)>>16; int finalb = (totb*mul)>>16; *dst = (finalr<<11)+(finalg<<5)+finalb; dst+=height; src++; } } } { if (boxw>=height) boxw=height-1; unsigned short* src = dstImage; for (x=0;x>11; totg+=(src[y]>>5)&0x3f; totb+=src[y]&0x1f; } unsigned short* dst = srcImage+x; for (y=0;yboxw) { totr-=src[(-boxw-1)]>>11; totg-=(src[(-boxw-1)]>>5)&0x3f; totb-=src[(-boxw-1)]&0x1f; } if (y+boxw>11; totg+=(src[boxw]>>5)&0x3f; totb+=src[boxw]&0x1f; } int finalr = (totr*mul)>>16; int finalg = (totg*mul)>>16; int finalb = (totb*mul)>>16; *dst = (finalr<<11)+(finalg<<5)+finalb; //*dst = *src; src++; dst+=width; } } } } void Filter::stylize(unsigned short* srcImage, unsigned short* tmpImage, int width, int height, int srcPitch, int tmpPitch, int minr, int ming, int minb, int maxr, int maxg, int maxb) { int x,y; minb>>=3; ming>>=2; ming<<=5; minr>>=3; minr<<=11; maxb>>=3; maxg>>=2; maxg<<=5; maxr>>=3; maxr<<=11; unsigned short* dst = srcImage; unsigned short* src = tmpImage; unsigned int* dstDW = (unsigned int*)dst; unsigned int* srcDW = (unsigned int*)src; for (y = 0; y < height; y++) { for (x = 0; x < width>>1; x++) { *srcDW = *dstDW; srcDW++; dstDW++; } srcDW+=(tmpPitch-width)>>1; dstDW+=(srcPitch-width)>>1; } dst = srcImage; src = tmpImage; //memcpy(tmpImage, srcImage, pitch*height*2); int y2; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { //if (*src > RGB2SHORT(50,50,150) && // *src < RGB2SHORT(150,120,200)) if ((*src&0x1f) > (minb) && (*src&0x1f) < (maxb) && (*src&(0x3f<<5)) > (ming) && (*src&(0x3f<<5)) < (maxg) && (*src&(0x1f<<11)) > (minr) && (*src&(0x1f<<11)) < (maxr)) { int b = (*src&0x1f)>>2; int g = ((*src>>5)&0x3f)>>2; int r = ((*src>>11)&0x1f)>>2; int from = y-64; int to = y+64; int adder = 256/64; int shade = 0; if (from < 0) { shade+=-from*adder; from = 0; } if (to>height) to = height; unsigned short* ptr = srcImage+(from*srcPitch+x); for (y2 = from; y2 < to; y2++) { if (y2 == y) adder = -adder; int r2 = ((*ptr>>11)&0x1f) + ((r*shade)>>8); int g2 = ((*ptr>>5)&0x3f) + ((g*shade)>>8); int b2 = (*ptr&0x1f) + ((b*shade)>>8); if (r2 > 0x1f) r2 = 0x1f; if (g2 > 0x3f) g2 = 0x3f; if (b2 > 0x1f) b2 = 0x1f; *ptr = PRGB2SHORT(r2,g2,b2); ptr+=width; shade+=adder; } from = x-64; to = x+64; shade = 0; adder = 256/64; if (from < 0) { shade+=-from*adder; from = 0; } if (to>width) to = width; ptr = srcImage+(y*srcPitch+from); for (y2 = from; y2 < to; y2++) { if (y2 == x) adder = -adder; int r2 = ((*ptr>>11)&0x1f) + ((r*shade)>>8); int g2 = ((*ptr>>5)&0x3f) + ((g*shade)>>8); int b2 = (*ptr&0x1f) + ((b*shade)>>8); if (r2 > 0x1f) r2 = 0x1f; if (g2 > 0x3f) g2 = 0x3f; if (b2 > 0x1f) b2 = 0x1f; *ptr = PRGB2SHORT(r2,g2,b2); ptr++; shade+=adder; } } src++; } src+=tmpPitch-width; } } void Filter::glow(unsigned short* srcImage, int width, int height, int pitch, unsigned short* glowBuffer1, unsigned short* glowBuffer2, unsigned int cellSizeShift, unsigned int scale, unsigned int boxw) { if (scale < 512) scale = 512; int gWidth = width>>cellSizeShift; int gHeight = height>>cellSizeShift; int x,y,x2,y2; unsigned short* ptr = glowBuffer1; for (y = 0; y < gHeight; y++) for (x = 0; x < gWidth; x++) *ptr++ = srcImage[(y<>11)<<16,scale), g1 = fpmul((rgb1&0x7E0)<<11,scale), b1 = fpmul((rgb1&31)<<16,scale); int r2 = fpmul((rgb2>>11)<<16,scale), g2 = fpmul((rgb2&0x7E0)<<11,scale), b2 = fpmul((rgb2&31)<<16,scale); int r3 = fpmul((rgb3>>11)<<16,scale), g3 = fpmul((rgb3&0x7E0)<<11,scale), b3 = fpmul((rgb3&31)<<16,scale); int r4 = fpmul((rgb4>>11)<<16,scale), g4 = fpmul((rgb4&0x7E0)<<11,scale), b4 = fpmul((rgb4&31)<<16,scale); int dr1 = (r4-r1)>>cellSizeShift; int dr2 = (r3-r2)>>cellSizeShift; int dg1 = (g4-g1)>>cellSizeShift; int dg2 = (g3-g2)>>cellSizeShift; int db1 = (b4-b1)>>cellSizeShift; int db2 = (b3-b2)>>cellSizeShift; ptr = srcImage+(y<>cellSizeShift; int sr = r1; int fg = (g2-g1)>>cellSizeShift; int sg = g1; int fb = (b2-b1)>>cellSizeShift; int sb = b1; for (x2=0;x2<(1<>16) + ((*ptr>>11)&31); if (r>31) r = 31; int g = (sg>>16) + ((*ptr>>5)&63); if (g>63) g = 63; int b = (sb>>16) + ((*ptr>>0)&31); if (b>31) b = 31; *ptr++ = PRGB2Short(r,g,b); sr+=fr; sg+=fg; sb+=fb; } ptr+=(pitch-(1<. * */ #ifndef MATH3D_H #define MATH3D_H // because of "FILE" #include #include #include "fpmath.h" #ifndef M_PI #define M_PI 3.1415 #endif struct VectorFP { pp_int32 x,y,z; }; #define setVectorFP(v,x,y,z) \ v.x = x; \ v.y = y; \ v.z = z; VectorFP operator*(pp_int32 s,VectorFP v2); VectorFP operator+ (VectorFP v1,VectorFP v2); VectorFP operator- (VectorFP v1,VectorFP v2); VectorFP operator- (VectorFP v); pp_int32 operator* (VectorFP v1,VectorFP v2); // floating point based 3-dimensional vector class class VectorFloat { public: float x,y,z; VectorFloat(); VectorFloat(float x,float y,float z); VectorFloat(VectorFP vector); void set(float nx,float ny,float nz); void set(VectorFP vector); float length(); void normalize(); VectorFP convertToFixedPoint(); void readFromFile(FILE *f); }; // multiply vector with scalar // result is a new vector VectorFloat operator* (float s,VectorFloat v2); // add two vectors // result is a new vector VectorFloat operator+ (VectorFloat v1,VectorFloat v2); // subtract two vectors // result is a new vector VectorFloat operator- (VectorFloat v1,VectorFloat v2); // dot product of two vectors // result is a scalar float operator* (VectorFloat v1,VectorFloat v2); // vector product of two vectors // result is a vector VectorFloat operator^ (VectorFloat v1,VectorFloat v2); // floating point based 4x4 matrix class class MatrixFloat { public: float form[4][4]; void setID(); void setRotX(float phi); void setRotY(float phi); void setRotZ(float phi); void setScale(VectorFloat v); void setTranslate(VectorFloat v); void setSubtract(VectorFloat v); }; // "multiply" two matrices // result is a new 4x4 matrix MatrixFloat operator* (MatrixFloat m1,MatrixFloat m2); // transform vector by matrix // result is a new vector VectorFloat operator* (MatrixFloat m,VectorFloat v); // fixed point based 4x4 matrix class class MatrixFP { public: pp_int32 form[4][4]; MatrixFP(); MatrixFP(MatrixFloat matrix); void setID(); void setRotX(float phi); void setRotY(float phi); void setRotZ(float phi); void setRotXYZ(float phiX,float phiY,float phiZ); void setScale(VectorFloat v); void setScale(VectorFP v); void setTranslate(VectorFP v); void setSubtract(VectorFP v); void stripTranslation(); }; // "multiply" two matrices // result is a new 4x4 matrix MatrixFP operator* (MatrixFP &m1,MatrixFP &m2); // transform fixed point vector by matrix // result is a new vector VectorFP operator* (MatrixFP &m,VectorFP &v); struct QuaternionFP { pp_int32 w; VectorFP v; }; class QuaternionFloat { public: float w; VectorFloat v; void normalize(); QuaternionFP convertToFixedPoint(); }; QuaternionFloat operator *(QuaternionFloat q1,float s); QuaternionFloat operator +(QuaternionFloat q1,QuaternionFloat q2); QuaternionFloat operator -(QuaternionFloat q1,QuaternionFloat q2); QuaternionFloat operator *(QuaternionFloat q1,QuaternionFloat q2); MatrixFP quaternionToMatrixFP(QuaternionFloat q); #define Quaternion QuaternionFP Quaternion normalize(Quaternion &q1); Quaternion operator *(Quaternion &q1,pp_int32 s); Quaternion operator +(Quaternion &q1,Quaternion &q2); Quaternion operator -(Quaternion &q1,Quaternion &q2); Quaternion operator *(Quaternion &q1,Quaternion &q2); MatrixFP quaternionToMatrixFP(Quaternion &q); #endif milkytracker-0.90.85+dfsg/src/fx/Filter.h0000644000175000017500000000426311150223367017232 0ustar admin2admin2/* * fx/Filter.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef FILTER_H #define FILTER_H #define PRGB2SHORT(r,g,b) ((((r))<<11)+(((g))<<5)+((b))) #define RGB2SHORT(r,g,b) ((((r>>3))<<11)+(((g>>2))<<5)+((b>>3))) class Filter { private: static void applyRadialToSector(unsigned short *buffer,int width, int height,int pitch, int xCenter,int yCenter,int xBound,int yBound, int radius, int style = 0); public: static void applyRadial(unsigned short *buffer,int width, int height,int pitch, int xCenter,int yCenter, int radius, int style = 0); static void applyHorizontal(unsigned short *src, unsigned short *dst, int width, int height, int pitch, int boxw); static void applyVertical(unsigned short *src, unsigned short *dst, int width, int height, int pitch, int boxw); static void applyBoxed(unsigned short *srcImage, unsigned short *dstImage, int width, int height, int pitch, int boxw); static void stylize(unsigned short* srcImage, unsigned short* tmpImage, int width, int height, int srcPitch, int tmpPitch, int minr, int ming, int minb, int maxr, int maxg, int maxb); static void glow(unsigned short* srcImage, int width, int height, int pitch, unsigned short* glowBuffer1, unsigned short* glowBuffer2, unsigned int cellSizeShift, unsigned int scale = 65536*2, unsigned int boxw = 4); }; #endif milkytracker-0.90.85+dfsg/src/fx/Makefile.in0000644000175000017500000003536111317506534017711 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = src/fx DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libfx_a_AR = $(AR) $(ARFLAGS) libfx_a_LIBADD = am_libfx_a_OBJECTS = Camera.$(OBJEXT) Filter.$(OBJEXT) Fire.$(OBJEXT) \ Math3d.$(OBJEXT) ParticleBlobs.$(OBJEXT) \ ParticleEmitter.$(OBJEXT) ParticleFX.$(OBJEXT) \ ParticleFun.$(OBJEXT) ParticleScene.$(OBJEXT) \ Starfield.$(OBJEXT) TCBSpline.$(OBJEXT) \ TCBSplineTest.$(OBJEXT) Texture.$(OBJEXT) \ TexturedGrid.$(OBJEXT) TexturedPlane.$(OBJEXT) \ Twister.$(OBJEXT) TwisterFX.$(OBJEXT) fpmath.$(OBJEXT) libfx_a_OBJECTS = $(am_libfx_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libfx_a_SOURCES) DIST_SOURCES = $(libfx_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ noinst_LIBRARIES = libfx.a libfx_a_SOURCES = Camera.cpp Filter.cpp Fire.cpp Math3d.cpp ParticleBlobs.cpp \ ParticleEmitter.cpp ParticleFX.cpp ParticleFun.cpp ParticleScene.cpp \ Starfield.cpp TCBSpline.cpp TCBSplineTest.cpp Texture.cpp TexturedGrid.cpp \ TexturedPlane.cpp Twister.cpp TwisterFX.cpp fpmath.cpp noinst_HEADERS = Camera.h FXAbstract.h FXInterface.h Filter.h Fire.h Math3d.h \ ParticleBlobs.h ParticleEmitter.h ParticleFX.h ParticleFun.h ParticleScene.h \ PictureGlow.h Starfield.h TCBSpline.h TCBSplineTest.h Texture.h TexturedGrid.h \ TexturedPlane.h Twister.h TwisterFX.h fpmath.h INCLUDES = -I$(top_srcdir)/src/ppui -I$(top_srcdir)/src/ppui/osinterface \ -I$(top_srcdir)/src/ppui/osinterface/posix all: all-am .SUFFIXES: .SUFFIXES: .cpp .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) --gnu src/fx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/fx/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-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libfx.a: $(libfx_a_OBJECTS) $(libfx_a_DEPENDENCIES) -rm -f libfx.a $(libfx_a_AR) libfx.a $(libfx_a_OBJECTS) $(libfx_a_LIBADD) $(RANLIB) libfx.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Camera.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Filter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Fire.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Math3d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParticleBlobs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParticleEmitter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParticleFX.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParticleFun.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ParticleScene.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Starfield.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TCBSpline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TCBSplineTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Texture.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TexturedGrid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TexturedPlane.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Twister.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TwisterFX.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpmath.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` 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 $(LIBRARIES) $(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-generic clean-noinstLIBRARIES 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 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-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic 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 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: milkytracker-0.90.85+dfsg/src/fx/Fire.cpp0000644000175000017500000000774211150223367017232 0ustar admin2admin2/* * fx/Fire.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Fire.cpp * MyFirstCarbonProject * * Created by Peter Barth on Wed Feb 20 2002. * */ #include "Fire.h" #include "Math3d.h" Fire::Fire(pp_int32 w, pp_int32 h) : FXAbstract(w, h) { w>>=1; h>>=1; workbuffer = new pp_uint16[w*(h+2)]; memset(workbuffer, 0, w*(h+2)*sizeof(pp_uint16)); buildColorLUT(); } Fire::~Fire() { delete workbuffer; } /////////////////////////////////////////////// // Schicke Farbtabelle bauen /////////////////////////////////////////////// void Fire::buildColorLUT() { struct TColor { pp_uint8 r,g,b; }; struct TColorKey { TColor color; pp_uint32 t; }; const pp_uint32 NUMKEYS = 5; TColorKey colorKeys[NUMKEYS]; colorKeys[4].color.r = 255; colorKeys[4].color.g = 255; colorKeys[4].color.b = 255; colorKeys[4].t = 192; colorKeys[3].color.r = 255; colorKeys[3].color.g = 255; colorKeys[3].color.b = 0; colorKeys[3].t = 160; colorKeys[2].color.r = 255; colorKeys[2].color.g = 0; colorKeys[2].color.b = 0; colorKeys[2].t = 96; colorKeys[1].color.r = 0; colorKeys[1].color.g = 0; colorKeys[1].color.b = 32; colorKeys[1].t = 32; colorKeys[0].color.r = 0; colorKeys[0].color.g = 0; colorKeys[0].color.b = 0; colorKeys[0].t = 0; for (pp_uint32 i = 0; i < NUMKEYS-1; i++) { for (pp_uint32 j = colorKeys[i].t; j < colorKeys[i+1].t; j++) { float t = (float)(j - colorKeys[i].t) / (float)(colorKeys[i+1].t - colorKeys[i].t); pp_uint32 r = (pp_uint32)((1.0f - t) * colorKeys[i].color.r + t * colorKeys[i+1].color.r); pp_uint32 g = (pp_uint32)((1.0f - t) * colorKeys[i].color.g + t * colorKeys[i+1].color.g); pp_uint32 b = (pp_uint32)((1.0f - t) * colorKeys[i].color.b + t * colorKeys[i+1].color.b); colorLUT[j][0] = (pp_uint8)r; colorLUT[j][1] = (pp_uint8)g; colorLUT[j][2] = (pp_uint8)b; } } for (pp_uint32 j = colorKeys[NUMKEYS-1].t; j < 256; j++) { colorLUT[j][0] = (pp_uint8)colorKeys[2].color.r; colorLUT[j][1] = (pp_uint8)colorKeys[2].color.g; colorLUT[j][2] = (pp_uint8)colorKeys[2].color.b; } } /////////////////////////////////////////////// // BURN, BURN /////////////////////////////////////////////// void Fire::render(pp_uint8* buffer) { pp_int32 x,y,i; pp_int32 h = height>>1; pp_int32 w = width>>1; for (i = 0; i < w/8; i++) { x = rand()%w; workbuffer[(h+1)*w+x] = (rand()&255) << 8; } unsigned short* vptr = workbuffer; for (y = 0; y < h+1; y++) { *vptr++; for (x = 1; x < w; x++) { pp_uint32 c = (vptr[w] + vptr[-1] + vptr[+1] + vptr[0]) >> 2; if (c>=64) c-=64; else c = 0; *vptr++ = (pp_uint16)c; } } vptr = workbuffer; pp_uint8* buff2 = buffer + width*3; pp_uint8* buff = buffer; for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { pp_int16 c = *vptr>>8; *buff++ = colorLUT[c][0]; // rot *buff++ = colorLUT[c][1]; // gruen *buff++ = colorLUT[c][2]; // blau *buff++ = colorLUT[c][0]; // rot *buff++ = colorLUT[c][1]; // gruen *buff++ = colorLUT[c][2]; // blau *buff2++ = colorLUT[c][0]; // rot *buff2++ = colorLUT[c][1]; // gruen *buff2++ = colorLUT[c][2]; // blau *buff2++ = colorLUT[c][0]; // rot *buff2++ = colorLUT[c][1]; // gruen *buff2++ = colorLUT[c][2]; // blau*/ vptr++; } buff+=w*2*3; buff2+=w*2*3; } } milkytracker-0.90.85+dfsg/src/fx/ParticleScene.h0000644000175000017500000000230211150223367020516 0ustar admin2admin2/* * fx/ParticleScene.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PARTICLESCENE__H #define PARTICLESCENE__H #include "FXInterface.h" class ParticleFX; class TexturedGrid; class ParticleScene : public FXInterface { private: float time; ParticleFX *particleFX; ParticleFX *particleFun; TexturedGrid *texturedGrid; public: ParticleScene(int width, int height, int gridshift); ~ParticleScene(); void render(unsigned short* vscreen, unsigned int pitch); void update(float syncFrac); }; #endif milkytracker-0.90.85+dfsg/src/fx/Fire.h0000644000175000017500000000221711150223367016667 0ustar admin2admin2/* * fx/Fire.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Fire.h * MyFirstCarbonProject * * Created by Peter Barth on Wed Feb 20 2002. * */ #ifndef FIRE__H #define FIRE__H #include "BasicTypes.h" #include "FXAbstract.h" class Fire : public FXAbstract { private: pp_uint16* workbuffer; pp_uint8 colorLUT[256][3]; void buildColorLUT(); public: Fire(pp_int32 w, pp_int32 h); virtual ~Fire(); virtual void render(pp_uint8* buffer); }; #endif milkytracker-0.90.85+dfsg/src/fx/TexturedGrid.h0000644000175000017500000000260711150223367020417 0ustar admin2admin2/* * fx/TexturedGrid.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef TEXTUREDGRID__H #define TEXTUREDGRID__H #include "FXInterface.h" struct VectorFP; class TexturedGrid : public FXInterface { protected: int fov; int gridshift; int gridsize; // must be 1 << GRIDSHIFT VectorFP* grid; int gridWidth, gridHeight; unsigned short* texture; unsigned short* buffer; int sintab[1024]; public: TexturedGrid(int width, int height, int gridshift); virtual ~TexturedGrid(); void setTexture(unsigned short* texture) { this->texture = texture; } // from FXInterface virtual void render(unsigned short* vscreen, unsigned int pitch); virtual void update(float syncFrac); }; #endif milkytracker-0.90.85+dfsg/src/fx/ParticleBlobs.h0000644000175000017500000000224011150223367020523 0ustar admin2admin2/* * fx/ParticleBlobs.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PARTICLEBLOBS__H #define PARTICLEBLOBS__H #include "ParticleFX.h" #include "Math3d.h" class ParticleBlobs : public ParticleFX { unsigned short* flareTexture[3]; unsigned short* temp; unsigned short* buffer; public: ParticleBlobs(int width, int height); virtual ~ParticleBlobs(); virtual void render(unsigned short* vscreen, unsigned int pitch); virtual void update(float syncFrac); }; #endif milkytracker-0.90.85+dfsg/src/fx/FXAbstract.h0000644000175000017500000000224511150223367020004 0ustar admin2admin2/* * fx/FXAbstract.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * FXAbstract.h * MilkyTracker * * Created by Peter Barth on 25.11.05. * */ #ifndef FXABSTRACT__H #define FXABSTRACT__H #include "BasicTypes.h" class FXAbstract { protected: pp_uint32 width, height; public: FXAbstract(pp_uint32 w, pp_uint32 h) : width(w), height(h) { } virtual ~FXAbstract() {} virtual void update(pp_uint32 syncFrac) { } virtual void render(pp_uint8* buffer) = 0; }; #endif milkytracker-0.90.85+dfsg/src/fx/Starfield.cpp0000644000175000017500000000535411150223367020257 0ustar admin2admin2/* * fx/Starfield.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Starfield.cpp * MyFirstCarbonProject * * Created by Peter Barth on Wed Feb 20 2002. * */ #include "Starfield.h" #include "Math3d.h" Starfield::Starfield(pp_int32 w, pp_int32 h) : FXAbstract(w, h), numStars(2000) { stars = new VectorFP[numStars]; for (pp_int32 i = 0; i < numStars; i++) { stars[i].x = (((rand()&255)<<8) - 32768)>>2; stars[i].y = (((rand()&255)<<8) - 32768)>>2; stars[i].z = (((rand()&255)<<8))>>2; } } Starfield::~Starfield() { delete[] stars; } /////////////////////////////////////////////// // BURN, BURN /////////////////////////////////////////////// void Starfield::render(pp_uint8* buffer) { memset(buffer, 0, width*height*3); pp_int32 centerx = width*65536/2; pp_int32 centery = height*65536/2; MatrixFP m; for (pp_int32 i = 0; i < numStars; i++) { VectorFP f = stars[i]; if (f.z > 0) { pp_int32 px = (fpdiv(f.x*200, f.z) + centerx)>>16; pp_int32 py = (fpdiv(f.y*200, f.z) + centery)>>16; pp_int32 c = 255-(f.z>>6); if (c < 0) c = 0; if (c > 255) c = 255; PPColor col(c,c,c); setPixel(px, py, col, buffer); } } //phi+=0.01f; } void Starfield::update(pp_uint32 syncFrac) { for (pp_int32 i = 0; i < numStars; i++) { stars[i].z-=syncFrac>>9; if (stars[i].z < 0) { stars[i].z = ((65535>>2) + 2048) + stars[i].z; } } } void Starfield::setPixel(pp_int32 x, pp_int32 y, const PPColor& color, pp_uint8* buffer) { if (x < 0 || x >= (signed)width-1 || y < 0 || y >= (signed)height-1) return; pp_int32 offset = y*width+x; buffer[offset*3] = (pp_uint8)color.r; buffer[offset*3+1] = (pp_uint8)color.g; buffer[offset*3+2] = (pp_uint8)color.b; /*buffer[(offset+1)*3] = color.r; buffer[(offset+1)*3+1] = color.g; buffer[(offset+1)*3+2] = color.b; buffer[(offset+width)*3] = color.r; buffer[(offset+width)*3+1] = color.g; buffer[(offset+width)*3+2] = color.b; buffer[(offset+width+1)*3] = color.r; buffer[(offset+width+1)*3+1] = color.g; buffer[(offset+width+1)*3+2] = color.b;*/ } milkytracker-0.90.85+dfsg/src/fx/TCBSpline.h0000644000175000017500000000276211150223367017572 0ustar admin2admin2/* * fx/TCBSpline.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef TCBSPLINE__H #define TCBSPLINE__H #include "Math3d.h" class TCBSpline { public: struct TKey { int ti; VectorFloat v; float t,c,b; }; private: TKey* keys; int numKeys; VectorFloat getLastPos(int i); VectorFloat getNextPos(int i); VectorFloat calcTi(int i); VectorFloat calcTo(int i); int findKey(int curTime,int startIndex, int endIndex); public: TCBSpline(int numKeys); ~TCBSpline(); void setKey(int index, VectorFloat& v, int time, float tension = 0, float continuity = 0, float bias = 0); void setKey(int index, TKey& key) { if (index < numKeys) keys[index] = key; } TKey* getKey(int index) { if (index < numKeys) return &keys[index]; else return &keys[0];} VectorFloat getPos(float curTime); }; #endif milkytracker-0.90.85+dfsg/src/midi/0000755000175000017500000000000011317506534016141 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/midi/win32/0000755000175000017500000000000011317506056017102 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/midi/win32/MIDIInDevice.cpp0000644000175000017500000003300410766710716021746 0ustar admin2admin2/******************************************************************************* * MIDIInDevice.cpp - Implementation for CMIDIInDevice and related * classes. * * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Contact: jabberdabber@hotmail.com * * Last modified: 09/02/2003 ******************************************************************************/ //-------------------------------------------------------------------- // Dependencies //-------------------------------------------------------------------- #include "MIDIInDevice.h" #include "midi.h" //-------------------------------------------------------------------- // Using declarations //-------------------------------------------------------------------- using midi::CMIDIInDevice; using midi::CMIDIReceiver; using midi::CMIDIInException; //-------------------------------------------------------------------- // CMIDIInHeader implementation //-------------------------------------------------------------------- // Constructor CMIDIInDevice::CMIDIInHeader::CMIDIInHeader(HMIDIIN DevHandle, LPSTR Buffer, DWORD BufferLength) : m_DevHandle(DevHandle) { // Initialize header m_MIDIHdr.lpData = Buffer; m_MIDIHdr.dwBufferLength = BufferLength; m_MIDIHdr.dwFlags = 0; // Prepare header MMRESULT Result = ::midiInPrepareHeader(DevHandle, &m_MIDIHdr, sizeof m_MIDIHdr); // If an error occurred, throw exception if(Result != MMSYSERR_NOERROR) { throw CMIDIInException(Result); } } // Destructor CMIDIInDevice::CMIDIInHeader::~CMIDIInHeader() { ::midiInUnprepareHeader(m_DevHandle, &m_MIDIHdr, sizeof m_MIDIHdr); } // Add system exclusive buffer to queue void CMIDIInDevice::CMIDIInHeader::AddSysExBuffer() { MMRESULT Result = ::midiInAddBuffer(m_DevHandle, &m_MIDIHdr, sizeof m_MIDIHdr); // If an error occurred, throw exception if(Result != MMSYSERR_NOERROR) { throw CMIDIInException(Result); } } //-------------------------------------------------------------------- // CHeaderQueue implementation //-------------------------------------------------------------------- // Constructor CMIDIInDevice::CHeaderQueue::CHeaderQueue() { ::InitializeCriticalSection(&m_CriticalSection); } // Destructor CMIDIInDevice::CHeaderQueue::~CHeaderQueue() { RemoveAll(); ::DeleteCriticalSection(&m_CriticalSection); } // Add header to queue void CMIDIInDevice::CHeaderQueue::AddHeader( CMIDIInDevice::CMIDIInHeader *Header) { ::EnterCriticalSection(&m_CriticalSection); m_HdrQueue.push(Header); ::LeaveCriticalSection(&m_CriticalSection); } // Remove header from queue void CMIDIInDevice::CHeaderQueue::RemoveHeader() { ::EnterCriticalSection(&m_CriticalSection); if(!m_HdrQueue.empty()) { delete m_HdrQueue.front(); m_HdrQueue.pop(); } ::LeaveCriticalSection(&m_CriticalSection); } // Empty header queue void CMIDIInDevice::CHeaderQueue::RemoveAll() { ::EnterCriticalSection(&m_CriticalSection); while(!m_HdrQueue.empty()) { delete m_HdrQueue.front(); m_HdrQueue.pop(); } ::LeaveCriticalSection(&m_CriticalSection); } // Determines if the header queue is empty bool CMIDIInDevice::CHeaderQueue::IsEmpty() { bool Result; ::EnterCriticalSection(&m_CriticalSection); Result = m_HdrQueue.empty(); ::LeaveCriticalSection(&m_CriticalSection); return Result; } //-------------------------------------------------------------------- // CMIDIInDevice implementation //-------------------------------------------------------------------- // Constructs CMIDIInDevice object in an closed state CMIDIInDevice::CMIDIInDevice() : m_hThread(NULL), m_threadID(0), m_Receiver(0), m_State(CLOSED) { // If we are unable to create signalling event, throw exception if(!CreateEvent()) { throw CMIDIInEventFailure(); } } // Constructs CMIDIInDevice object in an closed state and initializes the // MIDI receiver CMIDIInDevice::CMIDIInDevice(CMIDIReceiver &Receiver) : m_hThread(NULL), m_threadID(0), m_Receiver(&Receiver), m_State(CLOSED) { // If we are unable to create signalling event, throw exception if(!CreateEvent()) { throw CMIDIInEventFailure(); } } // Constructs CMIDIInDevice object in an opened state CMIDIInDevice::CMIDIInDevice(UINT DeviceId, CMIDIReceiver &Receiver) : m_hThread(NULL), m_threadID(0), m_Receiver(&Receiver), m_State(CLOSED) { // Open device Open(DeviceId); // If we are unable to create signalling event, throw exception if(!CreateEvent()) { Close(); throw CMIDIInEventFailure(); } } // Destruction CMIDIInDevice::~CMIDIInDevice() { // Close device Close(); // Close handle to signalling event ::CloseHandle(m_Event); } // Opens the MIDI input device void CMIDIInDevice::Open(UINT DeviceId) { // Makes sure the previous device, if any, is closed before // opening another one Close(); // Open MIDI input device MMRESULT Result = ::midiInOpen(&m_DevHandle, DeviceId, reinterpret_cast(MidiInProc), reinterpret_cast(this), CALLBACK_FUNCTION); // If we are able to open the device, change state if(Result == MMSYSERR_NOERROR) { m_State = OPENED; } // Else opening failed, throw exception else { throw CMIDIInException(Result); } } // Closes the MIDI input device void CMIDIInDevice::Close() { // If the device is recording, stop recording before closing the // device if(m_State == RECORDING) { StopRecording(); } // If the device is opened... if(m_State == OPENED) { // Close the device MMRESULT Result = ::midiInClose(m_DevHandle); // If a failure occurred, throw exception if(Result != MMSYSERR_NOERROR) { throw CMIDIInException(Result); } // Change state m_State = CLOSED; } } // Adds a buffer for receiving system exclusive messages void CMIDIInDevice::AddSysExBuffer(LPSTR Buffer, DWORD BufferLength) { CMIDIInHeader *Header = NULL; try { // Create new header Header = new CMIDIInHeader(m_DevHandle, Buffer, BufferLength); } // If memory allocation failed, throw exception catch(const std::bad_alloc &) { throw CMIDIInMemFailure(); } // If preparation for the header failed, rethrow exception catch(const CMIDIInDevice &) { throw; } try { // Add header to queue Header->AddSysExBuffer(); m_HdrQueue.AddHeader(Header); } // If we are unable to add the buffer to the queue, delete header // and throw exception catch(const CMIDIInDevice &) { delete Header; throw; } } // Starts the recording process void CMIDIInDevice::StartRecording(ThreadPriority RecordingThreadPriority/* = MIDI_THREAD_PRIORITY_NORMAL*/) { static const int WinThreadPriorities[5] = { THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST }; // Only begin recording if the MIDI input device has been opened if(m_State == OPENED) { // Change state m_State = RECORDING; //m_Thread = ::AfxBeginThread((AFX_THREADPROC)HeaderProc, this); if (!m_hThread) { m_hThread = CreateThread(NULL, 0, &HeaderProc, (void*)this, 0, &m_threadID); if (RecordingThreadPriority >= 0 && RecordingThreadPriority < (signed)sizeof(WinThreadPriorities) / (signed)sizeof(int)) SetThreadPriority(m_hThread, WinThreadPriorities[RecordingThreadPriority]); } // Start recording MMRESULT Result = ::midiInStart(m_DevHandle); // If recording attempt failed... if(Result != MMSYSERR_NOERROR) { // Revert back to opened state m_State = OPENED; // Signal the worker thread to finish ::SetEvent(m_Event); ::WaitForSingleObject(m_hThread, INFINITE); // Throw exception throw CMIDIInException(Result); } } } // Stops the recording process void CMIDIInDevice::StopRecording() { // If the device is in fact recording... if(m_State == RECORDING) { // Change state m_State = OPENED; // Signal the worker thread to finish ::SetEvent(m_Event); ::WaitForSingleObject(m_hThread, INFINITE); // Reset the MIDI input device ::midiInReset(m_DevHandle); // Empty header queue m_HdrQueue.RemoveAll(); } } // Registers the MIDI receiver. Returns the previous receiver. CMIDIReceiver *CMIDIInDevice::SetReceiver(CMIDIReceiver &Receiver) { CMIDIReceiver *PrevReceiver = m_Receiver; m_Receiver = &Receiver; return PrevReceiver; } // Determines if the MIDI input device is opened bool CMIDIInDevice::IsOpen() const { return ((m_State == OPENED) || (m_State == RECORDING)); } // Determines if the MIDI input device is recording bool CMIDIInDevice::IsRecording() const { return (m_State == RECORDING); } // Gets Id for this device UINT CMIDIInDevice::GetDevID() const { UINT DeviceID; MMRESULT Result = ::midiInGetID(m_DevHandle, &DeviceID); if(Result != MMSYSERR_NOERROR) { throw CMIDIInException(Result); } return DeviceID; } // Gets the capabilities of a particular MIDI input device void CMIDIInDevice::GetDevCaps(UINT DeviceId, MIDIINCAPS &Caps) { MMRESULT Result = ::midiInGetDevCaps(DeviceId, &Caps, sizeof Caps); // If we are not able to retrieve device capabilities, throw // exception if(Result != MMSYSERR_NOERROR) { throw CMIDIInException(Result); } } // Creates event for signalling header thread bool CMIDIInDevice::CreateEvent() { bool Result = true; m_Event = ::CreateEvent(NULL, FALSE, FALSE, NULL); // If event creation failed, record failure if(m_Event == NULL) { Result = false; } return Result; } // Called by Windows when a MIDI input event occurs void CALLBACK CMIDIInDevice::MidiInProc(HMIDIIN MidiIn, UINT Msg, DWORD Instance, DWORD Param1, DWORD Param2) { CMIDIInDevice *Device; Device = reinterpret_cast(Instance); if(Device->m_Receiver != 0) { switch(Msg) { case MIM_DATA: // Short message received Device->m_Receiver->ReceiveMsg(Param1, Param2); break; case MIM_ERROR: // Invalid short message received Device->m_Receiver->OnError(Param1, Param2); break; case MIM_LONGDATA: // System exclusive message received if(Device->m_State == RECORDING) { // Retrieve data, send it to receiver, and notify header // thread that we are done with the system exclusive // message MIDIHDR *MidiHdr = reinterpret_cast(Param1); Device->m_Receiver->ReceiveMsg(MidiHdr->lpData, MidiHdr->dwBytesRecorded, Param2); ::SetEvent(Device->m_Event); } break; case MIM_LONGERROR: // Invalid system exclusive message received if(Device->m_State == RECORDING) { // Retrieve data, send it to receiver, and notify header // thread that we are done with the system exclusive // message MIDIHDR *MidiHdr = reinterpret_cast(Param1); Device->m_Receiver->OnError(MidiHdr->lpData, MidiHdr->dwBytesRecorded, Param2); ::SetEvent(Device->m_Event); } break; } } } // Header worker thread DWORD CMIDIInDevice::HeaderProc(LPVOID Parameter) { CMIDIInDevice *Device; Device = reinterpret_cast(Parameter); // Continue while the MIDI input device is recording while(Device->m_State == RECORDING) { ::WaitForSingleObject(Device->m_Event, INFINITE); // Make sure we are still recording if(Device->m_State == RECORDING) { // Remove the finished header Device->m_HdrQueue.RemoveHeader(); } } return 0; } milkytracker-0.90.85+dfsg/src/midi/win32/LongMsg.cpp0000644000175000017500000000474510766710716021175 0ustar admin2admin2/* CLongMsg.cpp Implementation for the CLongMsg class. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Leslie Sanford (jabberdabber@hotmail.com) Last modified: 12/14/2002 */ //--------------------------------------------------------------------- // Dependencies //--------------------------------------------------------------------- #include "LongMsg.h" // Using declaration using midi::CLongMsg; //--------------------------------------------------------------------- // CLongMsg implementation //--------------------------------------------------------------------- // Default constructor CLongMsg::CLongMsg() : m_Msg(0), m_Length(0) {} // Constructor CLongMsg::CLongMsg(const char *Msg, DWORD Length) : m_Msg(0), m_Length(0) { SetMsg(Msg, Length); } // Constructor CLongMsg::CLongMsg(const CLongMsg &Msg) : CMIDIMsg(Msg) { m_Msg = 0; m_Length = 0; *this = Msg; } // Destructor CLongMsg::~CLongMsg() { // Release resources for this object if they exist if(m_Msg != 0) { delete [] m_Msg; } } // Assignment CLongMsg &CLongMsg::operator = (const CLongMsg &Msg) { // Test for self assignment if(this != &Msg) { SetMsg(Msg.m_Msg, Msg.m_Length); } return *this; } // Sets message void CLongMsg::SetMsg(const char *Msg, DWORD Length) { // Release old message if it exists if(m_Msg != 0) { delete [] m_Msg; } // // Allocate and initialize new message // m_Msg = new char[Length]; m_Length = Length; for(DWORD i = 0; i < m_Length; i++) { m_Msg[i] = Msg[i]; } } // Subscripting char &CLongMsg::operator [] (int i) { // Bounds checking if((signed)m_Length == 0 || i < 0 || i >= (signed)m_Length) { throw CLongMsgIndexOutOfBounds(); } return m_Msg[i]; } milkytracker-0.90.85+dfsg/src/midi/win32/ShortMsg.cpp0000644000175000017500000001355210766710716021371 0ustar admin2admin2/* ShortMsg.cpp Implementation for the CShortMsg class This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Leslie Sanford (jabberdabber@hotmail.com) Last modified: 08/19/2003 */ //--------------------------------------------------------------------- // Dependencies //--------------------------------------------------------------------- #include "midi.h" #include "ShortMsg.h" #include "MIDIInDevice.h" // Using declaration using midi::CShortMsg; //--------------------------------------------------------------------- // CShortMsg implementation //--------------------------------------------------------------------- // Constructor CShortMsg::CShortMsg(DWORD TimeStamp) : m_Msg(0), m_MsgNoStatus(0) { SetTimeStamp(TimeStamp); } // Constructor CShortMsg::CShortMsg(DWORD Msg, DWORD TimeStamp) : m_Msg(Msg) { unsigned char DataByte1 = GetData1(); unsigned char DataByte2 = GetData2(); m_MsgNoStatus = PackShortMsg(DataByte1, DataByte2); SetTimeStamp(TimeStamp); } // Constructor CShortMsg::CShortMsg(unsigned char Status, unsigned char Data1, unsigned char Data2, DWORD TimeStamp) { SetMsg(Status, Data1, Data2); m_MsgNoStatus = PackShortMsg(Data1, Data2); SetTimeStamp(TimeStamp); } // Constructor CShortMsg::CShortMsg(unsigned char Command, unsigned char Channel, unsigned char Data1, unsigned char Data2, DWORD TimeStamp) { SetMsg(Command, Channel, Data1, Data2); m_MsgNoStatus = PackShortMsg(Data1, Data2); SetTimeStamp(TimeStamp); } // Gets message const char *CShortMsg::GetMsg() const { return reinterpret_cast(&m_Msg); } // Gets status byte unsigned char CShortMsg::GetStatus() const { unsigned char Status; unsigned char Dummy; UnpackShortMsg(m_Msg, Status, Dummy, Dummy); return Status; } // Gets MIDI channel unsigned char CShortMsg::GetChannel() const { unsigned char Channel; unsigned char Dummy; UnpackShortMsg(m_Msg, Dummy, Channel, Dummy, Dummy); return Channel; } // Gets command code unsigned char CShortMsg::GetCommand() const { unsigned char Command; unsigned char Dummy; UnpackShortMsg(m_Msg, Command, Dummy, Dummy, Dummy); return Command; } // Gets data byte 1 unsigned char CShortMsg::GetData1() const { unsigned char Data1; unsigned char Dummy; UnpackShortMsg(m_Msg, Dummy, Dummy, Data1, Dummy); return Data1; } // Gets data byte 2 unsigned char CShortMsg::GetData2() const { unsigned char Data2; unsigned char Dummy; UnpackShortMsg(m_Msg, Dummy, Dummy, Dummy, Data2); return Data2; } // Sets message void CShortMsg::SetMsg(unsigned char Status, unsigned char Data1, unsigned char Data2) { m_Msg = PackShortMsg(Status, Data1, Data2); m_MsgNoStatus = PackShortMsg(Data1, Data2); } // Sets message void CShortMsg::SetMsg(unsigned char Command, unsigned char Channel, unsigned char Data1, unsigned char Data2) { m_Msg = PackShortMsg(Command, Channel, Data1, Data2); m_MsgNoStatus = PackShortMsg(Data1, Data2); } // Packs data into short message without status byte DWORD CShortMsg::PackShortMsg(unsigned char DataByte1, unsigned char DataByte2) { DWORD Msg = DataByte1; Msg |= DataByte2 << midi::SHORT_MSG_SHIFT; return Msg; } // Packs data into short message with status byte DWORD CShortMsg::PackShortMsg(unsigned char Status, unsigned char DataByte1, unsigned char DataByte2) { DWORD Msg = Status; Msg |= DataByte1 << midi::SHORT_MSG_SHIFT; Msg |= DataByte2 << midi::SHORT_MSG_SHIFT * 2; return Msg; } // Packs data into short channel message DWORD CShortMsg::PackShortMsg(unsigned char Command, unsigned char Channel, unsigned char DataByte1, unsigned char DataByte2) { DWORD Msg = Command | Channel; Msg |= DataByte1 << midi::SHORT_MSG_SHIFT; Msg |= DataByte2 << midi::SHORT_MSG_SHIFT * 2; return Msg; } // Unpacks short message void CShortMsg::UnpackShortMsg(DWORD Msg, unsigned char &Status, unsigned char &DataByte1, unsigned char &DataByte2) { Status = static_cast(Msg); DataByte1 = static_cast (Msg >> midi::SHORT_MSG_SHIFT); DataByte2 = static_cast (Msg >> midi::SHORT_MSG_SHIFT * 2); } // Unpacks short channel message void CShortMsg::UnpackShortMsg(DWORD Msg, unsigned char &Command, unsigned char &Channel, unsigned char &DataByte1, unsigned char &DataByte2) { Command = static_cast(Msg & ~midi::SHORT_MSG_MASK); Channel = static_cast(Msg & midi::SHORT_MSG_MASK); DataByte1 = static_cast (Msg >> midi::SHORT_MSG_SHIFT); DataByte2 = static_cast (Msg >> midi::SHORT_MSG_SHIFT * 2); } milkytracker-0.90.85+dfsg/src/midi/win32/MIDIInDevice.h0000644000175000017500000002263710766710716021425 0ustar admin2admin2#ifndef MIDI_IN_DEVICE_H #define MIDI_IN_DEVICE_H /******************************************************************************* * MIDIInDevice.h - Interface for CMIDIInDevice and related classes. * * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Contact: jabberdabber@hotmail.com * * Last modified: 07/30/2003 * * Note: You must link to the winmm.lib to use these classes. ******************************************************************************/ #pragma warning(disable:4786) // Disable annoying template warnings //-------------------------------------------------------------------- // Dependencies //-------------------------------------------------------------------- // Necessary for Windows data types #include #include #ifdef _UNICODE #include #endif // Necessary for exception classes derived from std::exception #include // Necessary for header queue used by CHeaderQueue #include namespace midi { //---------------------------------------------------------------- // UnicodeToAnsi converts the Unicode string pszW to an ANSI string // and returns the ANSI string through ppszA. Space for the // the converted string is allocated by UnicodeToAnsi. //---------------------------------------------------------------- static HRESULT __fastcall UnicodeToAnsi(LPCWSTR pszW, LPSTR pszA) { ULONG cbAnsi, cCharacters; DWORD dwError; // If input is null then just return the same. if (pszW == NULL) { strcpy(pszA, ""); return NOERROR; } cCharacters = wcslen(pszW)+1; // Determine number of bytes to be allocated for ANSI string. An // ANSI string can have at most 2 bytes per character (for Double // Byte Character Strings.) cbAnsi = cCharacters*2; // Convert to ANSI. if (0 == WideCharToMultiByte(CP_ACP, 0, pszW, cCharacters, pszA, cbAnsi, NULL, NULL)) { dwError = GetLastError(); strcpy(pszA, ""); return HRESULT_FROM_WIN32(dwError); } return NOERROR; } //---------------------------------------------------------------- // Class declarations //---------------------------------------------------------------- //---------------------------------------------------------------- // CMIDIReceiver // // An abstract class representing objects that receive messages // from CMIDIInDevice objects. A CMIDIReceiver object registers // itself with a CMIDIInDevice object. It will then receive all // messages that are recorded. //---------------------------------------------------------------- class CMIDIReceiver { public: virtual ~CMIDIReceiver() {} // Receives short messages virtual void ReceiveMsg(DWORD Msg, DWORD TimeStamp) = 0; // Receives long messages virtual void ReceiveMsg(LPSTR Msg, DWORD BytesRecorded, DWORD TimeStamp) = 0; // Called when an invalid short message is received virtual void OnError(DWORD Msg, DWORD TimeStamp) = 0; // Called when an invalid long message is received virtual void OnError(LPSTR Msg, DWORD BytesRecorded, DWORD TimeStamp) = 0; }; //---------------------------------------------------------------- // CMIDIInDevice exception classes //---------------------------------------------------------------- // Encapsulates the midiInGetErrorText messages class CMIDIInException : public std::exception { public: CMIDIInException(MMRESULT ErrCode) throw() { #ifdef _UNICODE ::midiInGetErrorText(ErrCode, m_ErrMsgW, sizeof m_ErrMsgW); UnicodeToAnsi(m_ErrMsgW, m_ErrMsg); #else ::midiInGetErrorText(ErrCode, m_ErrMsg, sizeof m_ErrMsg); #endif } const char *what() const throw() { return m_ErrMsg; } private: #ifdef _UNICODE WCHAR m_ErrMsgW[128]; char m_ErrMsg[256]; #else char m_ErrMsg[128]; #endif }; // Thrown when memory allocation fails within a CMIDIInDevice // object class CMIDIInMemFailure : public std::bad_alloc { public: const char *what() const throw() { return "Memory allocation within a CMIDIInDevice object " "failed."; } }; // Thrown when a CMIDIInDevice is unable to create a signalling // event class CMIDIInEventFailure : public std::exception { public: const char *what() const throw() { return "Unable to create a signalling event for " "CMIDIInDevice object."; } }; // Thrown when a CMIDIInDevice is unable to create a worker thread class CMIDIInThreadFailure : public std::exception { public: const char *what() const throw() { return "Unable to create worker thread for CMIDIInDevice " "object."; } }; //---------------------------------------------------------------- // CMIDIInDevice // // This class represents MIDI input devices. //---------------------------------------------------------------- class CMIDIInDevice { public: enum ThreadPriority { MIDI_THREAD_PRIORITY_LOWEST = 0, MIDI_THREAD_PRIORITY_BELOW_NORMAL = 1, MIDI_THREAD_PRIORITY_NORMAL = 2, MIDI_THREAD_PRIORITY_ABOVE_NORMAL = 3, MIDI_THREAD_PRIORITY_HIGHEST = 4 }; // For constructing a CMIDIInDevice object in an closed state CMIDIInDevice(); // For constructing a CMIDIInDevice object in an closed state and // initializing the MIDI receiver CMIDIInDevice(CMIDIReceiver &Receiver); // For constructing a CMIDIInDevice object in an opened state CMIDIInDevice(UINT DeviceId, CMIDIReceiver &Receiver); // Destruction ~CMIDIInDevice(); // Opens the MIDI input device void Open(UINT DeviceId); // Closes the MIDI input device void Close(); // Adds a buffer to receive system exclusive messages void AddSysExBuffer(LPSTR Buffer, DWORD BufferLength); // Starts the recording process void StartRecording(ThreadPriority RecordingThreadPriority = MIDI_THREAD_PRIORITY_NORMAL); // Stops the recording process void StopRecording(); // Sets the current MIDI receiver. Returns the previous // receiver. CMIDIReceiver *SetReceiver(CMIDIReceiver &Receiver); // Returns true if the device is open bool IsOpen() const; // Returns true if the device is recording bool IsRecording() const; // Gets Id for this device UINT GetDevID() const; // Gets the number of MIDI input devices on this system static UINT GetNumDevs() { return midiInGetNumDevs(); } // Gets the capabilities of a particular MIDI input device // The results are stored in the MIDIINCAPS parameter. static void GetDevCaps(UINT DeviceId, MIDIINCAPS &Caps); // Private methods private: // Copying and assignment not allowed CMIDIInDevice(const CMIDIInDevice &); CMIDIInDevice &operator = (const CMIDIInDevice &); // Creates an event for signalling the header thread bool CreateEvent(); // Called by Windows when a MIDI input event occurs static void CALLBACK MidiInProc(HMIDIIN MidiIn, UINT Msg, DWORD Instance, DWORD Param1, DWORD Param2); // Thread function for managing headers static DWORD WINAPI HeaderProc(LPVOID Parameter); // Private class declarations private: // Encapsulates the MIDIHDR structure for MIDI input class CMIDIInHeader { public: CMIDIInHeader(HMIDIIN DevHandle, LPSTR Buffer, DWORD BufferLength); ~CMIDIInHeader(); // Add the buffer for receiving system exclusive messages void AddSysExBuffer(); private: HMIDIIN m_DevHandle; MIDIHDR m_MIDIHdr; }; // Thread safe queue for storing CMIDIInHeader objects class CHeaderQueue { public: CHeaderQueue(); ~CHeaderQueue(); void AddHeader(CMIDIInHeader *Header); void RemoveHeader(); void RemoveAll(); bool IsEmpty(); private: std::queue m_HdrQueue; CRITICAL_SECTION m_CriticalSection; }; // Private attributes and constants private: HMIDIIN m_DevHandle; HANDLE m_Event; //CWinThread *m_Thread; HANDLE m_hThread; DWORD m_threadID; CMIDIReceiver *m_Receiver; CHeaderQueue m_HdrQueue; enum State { CLOSED, OPENED, RECORDING } m_State; }; } #endif milkytracker-0.90.85+dfsg/src/midi/win32/LongMsg.h0000644000175000017500000000523710766710716020637 0ustar admin2admin2#ifndef LONG_MSG_H #define LONG_MSG_H /* LongMsg.h CLongMsg class declaration. This class represents a system exclusive MIDI message. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Leslie Sanford (jabberdabber@hotmail.com) Last modified: 12/14/2002 */ //--------------------------------------------------------------------- // Dependencies //--------------------------------------------------------------------- #include "MIDIMsg.h" // For CMIDIMsg base class #include // For std::exception namespace midi { //----------------------------------------------------------------- // CLongMsgIndexOutOfBounds class // // An exception class. Thrown when an index to a CLongMsg object is // out of bounds. //----------------------------------------------------------------- class CLongMsgIndexOutOfBounds : public std::exception { public: const char *what() const throw() { return "Index to CLongMsg object is out of bounds."; } }; //----------------------------------------------------------------- // CLongMsg class // // This class represents system exclusive messages. //----------------------------------------------------------------- class CLongMsg : public CMIDIMsg { public: // Constructors/Destructor CLongMsg(); CLongMsg(const char *Msg, DWORD Length); CLongMsg(const CLongMsg &Msg); virtual ~CLongMsg(); // Assignment CLongMsg &operator = (const CLongMsg &Msg); // Accessors/Mutators DWORD GetLength() const { return m_Length; } const char *GetMsg() const { return m_Msg;} void SetMsg(const char *Msg, DWORD Length); protected: // Subscript access. This is for derived classes to use in order // to access the individual bytes within a CLongMsg object. char &operator [] (int i); private: char *m_Msg; DWORD m_Length; }; } #endif milkytracker-0.90.85+dfsg/src/midi/win32/MIDIMsg.h0000644000175000017500000000407310766710716020457 0ustar admin2admin2#ifndef MIDI_MSG_H #define MIDI_MSG_H /* MIDIMsg.h Interface for the CMIDIMsg class. This is the base class for all MIDI message classes. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Leslie Sanford (jabberdabber@hotmail.com) Last modified: 12/14/2002 */ //--------------------------------------------------------------------- // Dependencies //--------------------------------------------------------------------- #include // For DWORD data type //--------------------------------------------------------------------- // Forward declarations //--------------------------------------------------------------------- namespace midi { class CMIDIOutDevice; } namespace midi { //------------------------------------------------------------------ // CMIDIMsg class // // This class represents the base class for all MIDI messages. //------------------------------------------------------------------ class CMIDIMsg { public: virtual ~CMIDIMsg() {} // Gets the MIDI message length virtual DWORD GetLength() const = 0; // Gets the MIDI message virtual const char *GetMsg() const = 0; // Get/Set time stamp DWORD GetTimeStamp() const { return m_TimeStamp; } void SetTimeStamp(DWORD TimeStamp) { m_TimeStamp = TimeStamp; } private: DWORD m_TimeStamp; }; } #endif milkytracker-0.90.85+dfsg/src/midi/win32/ShortMsg.h0000644000175000017500000000741410766710716021036 0ustar admin2admin2#ifndef SHORT_MSG_H #define SHORT_MSG_H /* ShortMsg.h CShortMsg class declaration. This class represents short MIDI messages. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Leslie Sanford (jabberdabber@hotmail.com) Last modified: 08/19/2003 */ //--------------------------------------------------------------------- // Dependencies //--------------------------------------------------------------------- #include "MIDIMsg.h" // For CMIDIMsg base class namespace midi { // Constants const DWORD SHORT_MSG_LENGTH = 3; //----------------------------------------------------------------- // CShortMsg class // // This class represents short MIDI messages. //----------------------------------------------------------------- class CShortMsg : public CMIDIMsg { public: // Constructors explicit CShortMsg(DWORD TimeStamp = 0); CShortMsg(DWORD Msg, DWORD TimeStamp = 0); CShortMsg(unsigned char Status, unsigned char Data1, unsigned char Data2, DWORD TimeStamp); CShortMsg(unsigned char Command, unsigned char Channel, unsigned char Data1, unsigned char Data2, DWORD TimeStamp); // // Accessors // DWORD GetLength() const { return midi::SHORT_MSG_LENGTH; } const char *GetMsg() const; unsigned char GetStatus() const; unsigned char GetChannel() const; unsigned char GetCommand() const; unsigned char GetData1() const; unsigned char GetData2() const; // // Mutators // void SetMsg(unsigned char Status, unsigned char Data1, unsigned char Data2); void SetMsg(unsigned char Command, unsigned char Channel, unsigned char Data1, unsigned char Data2); // // Class methods // // Packs short messages without status byte static DWORD PackShortMsg(unsigned char DataByte1, unsigned char DataByte2); // Packs short messages with status byte static DWORD PackShortMsg(unsigned char Status, unsigned char DataByte1, unsigned char DataByte2); // Packs short channel messages static DWORD PackShortMsg(unsigned char Command, unsigned char Channel, unsigned char DataByte1, unsigned char DataByte2); // Unpacks short messages static void UnpackShortMsg(DWORD Msg, unsigned char &Status, unsigned char &DataByte1, unsigned char &DataByte2); // Unpacks short channel messages static void UnpackShortMsg(DWORD Msg, unsigned char &Command, unsigned char &Channel, unsigned char &DataByte1, unsigned char &DataByte2); private: DWORD m_Msg; DWORD m_MsgNoStatus; }; } #endif milkytracker-0.90.85+dfsg/src/midi/win32/midi.h0000644000175000017500000000613110766710716020205 0ustar admin2admin2#ifndef MIDI_H #define MIDI_H /******************************************************************************* * midi.h - Common MIDI declarations. * * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Contact: jabberdabber@hotmail.com * * Last modified: 09/22/2003 ******************************************************************************/ namespace midi { //---------------------------------------------------------------- // Constants //---------------------------------------------------------------- // Status byte for Active Sensing message const unsigned char ACTIVE_SENSING = 0xFE; // Command value for Channel Pressure (Aftertouch) const unsigned char CHANNEL_PRESSURE = 0xD0; // Status byte for Continue message const unsigned char CONTINUE = 0xFB; // Command value for Control Change message const unsigned char CONTROL_CHANGE = 0xB0; // Status byte for System Exclusive message const unsigned char SYSTEM_EXCLUSIVE = 0xF0; // Status byte for End of System Exclusive message const unsigned char END_OF_EXCLUSIVE = 0xF7; // Status byte for MIDI Time Code Quarter Fram message const unsigned char MIDI_TIME_CODE = 0xF1; // Command value for Note Off message const unsigned char NOTE_OFF = 0x80; // Command value for Note On message const unsigned char NOTE_ON = 0x90; // Command value for Pitch Bend message const unsigned char PITCH_BEND = 0xE0; // Command value for Polyphonic Key Pressure (Aftertouch) const unsigned char POLY_PRESSURE = 0xA0; // Command value for Program Change message const unsigned char PROGRAM_CHANGE = 0xC0; // Status byte for Song Position Pointer message const unsigned char SONG_POSITION_POINTER = 0xF2; // Status byte for MIDI Song Select message const unsigned char SONG_SELECT = 0xF3; // Status byte for Start message const unsigned char START = 0xFA; // Status byte for Stop message const unsigned char STOP = 0xFC; // Status byte for System Reset message const unsigned char SYSTEM_RESET = 0xFF; // Status byte for Timing Clock message const unsigned char TIMING_CLOCK = 0xF8; // Status byte for Tune Request message const unsigned char TUNE_REQUEST = 0xF6; // // For unpacking and packing short messages // const unsigned char SHORT_MSG_MASK = 15; const unsigned char SHORT_MSG_SHIFT = 8; } #endif milkytracker-0.90.85+dfsg/src/midi/win32/MidiReceiver_win32.cpp0000644000175000017500000000545110740273367023211 0ustar admin2admin2/* * midi/win32/MidiReceiver_win32.cpp * * Copyright 2008 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "MidiReceiver_win32.h" #include #include "ShortMsg.h" #include "Tracker.h" #include "PPMutex.h" #include "MidiTools.h" using midi::CMIDIInDevice; using midi::CMIDIReceiver; MidiReceiver::MidiReceiver(Tracker& theTracker, PPMutex& mutex) : tracker(theTracker), criticalSection(mutex), recordVelocity(false), velocityAmplify(100) { } // Function called to receive short messages void MidiReceiver::ReceiveMsg(DWORD Msg, DWORD TimeStamp) { midi::CShortMsg ShortMsg(Msg, TimeStamp); int command = static_cast(ShortMsg.GetCommand()); if (command >= 128 && command <= 143) { int note = static_cast(ShortMsg.GetData1()); // One octave less note -= 12; if (note < 1) note = 1; criticalSection.lock(); tracker.sendNoteUp(note); criticalSection.unlock(); } else if (command >= 144 && command <= 159) { int note = static_cast(ShortMsg.GetData1()); // One octave less note -= 12; if (note < 1) note = 1; int velocity = static_cast(ShortMsg.GetData2()); if (velocity == 0) { criticalSection.lock(); tracker.sendNoteUp(note); criticalSection.unlock(); } else { criticalSection.lock(); tracker.sendNoteDown(note, recordVelocity ? vol126to255(velocity-1, velocityAmplify) : -1); criticalSection.unlock(); } } /*std::cout << "Command: " << static_cast(ShortMsg.GetCommand()); std::cout << "\nChannel: " << static_cast(ShortMsg.GetChannel()); std::cout << "\nDataByte1: " << static_cast(ShortMsg.GetData1()); std::cout << "\nDataByte2: " << static_cast(ShortMsg.GetData2()); std::cout << "\nTimeStamp: " << static_cast(ShortMsg.GetTimeStamp()); std::cout << "\n\n";*/ } // Receives long messages void MidiReceiver::ReceiveMsg(LPSTR Msg, DWORD BytesRecorded, DWORD TimeStamp) { } // Called when an invalid short message is received void MidiReceiver::OnError(DWORD Msg, DWORD TimeStamp) { } // Called when an invalid long message is received void MidiReceiver::OnError(LPSTR Msg, DWORD BytesRecorded, DWORD TimeStamp) { } milkytracker-0.90.85+dfsg/src/midi/win32/MidiReceiver_win32.h0000644000175000017500000000325010740273367022651 0ustar admin2admin2/* * midi/win32/MidiReceiver_win32.h * * Copyright 2008 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __MIDIRECEIVER_H__ #define __MIDIRECEIVER_H__ #include "MIDIInDevice.h" class Tracker; class PPMutex; class MidiReceiver : public midi::CMIDIReceiver { private: Tracker& tracker; PPMutex& criticalSection; bool recordVelocity; int velocityAmplify; public: MidiReceiver(Tracker& theTracker, PPMutex& mutex); void setRecordVelocity(bool recVelocity) { recordVelocity = recVelocity; } void setVelocityAmplify(int amplify) { velocityAmplify = amplify; } // Receives short messages virtual void ReceiveMsg(DWORD Msg, DWORD TimeStamp); // Receives long messages virtual void ReceiveMsg(LPSTR Msg, DWORD BytesRecorded, DWORD TimeStamp); // Called when an invalid short message is received virtual void OnError(DWORD Msg, DWORD TimeStamp); // Called when an invalid long message is received virtual void OnError(LPSTR Msg, DWORD BytesRecorded, DWORD TimeStamp); }; #endif milkytracker-0.90.85+dfsg/src/midi/Makefile.am0000644000175000017500000000136311135201273020166 0ustar admin2admin2noinst_LIBRARIES = libmidi.a libmidi_a_SOURCES = posix/MidiReceiver_pthread.cpp rtmidi/RtMidi.cpp noinst_HEADERS = posix/MidiReceiver_pthread.h rtmidi/RtError.h rtmidi/RtMidi.h \ MidiTools.h AM_CPPFLAGS=-D__LINUX_ALSASEQ__ -D__LINUX__ -DMILKYTRACKER ${ALSA_CFLAGS} \ ${SDL_CFLAGS} INCLUDES = -I$(top_srcdir)/src/milkyplay -I$(top_srcdir)/src/ppui \ -I$(top_srcdir)/src/tracker -I$(top_srcdir)/src/ppui/osinterface \ -I$(top_srcdir)/src/ppui/osinterface/sdl \ -I$(top_srcdir)/src/ppui/osinterface/posix -I$(top_srcdir)/src/midi/rtmidi EXTRA_DIST = win32/LongMsg.cpp win32/LongMsg.h win32/MIDIInDevice.cpp \ win32/MIDIInDevice.h win32/MIDIMsg.h win32/MidiReceiver_win32.cpp \ win32/MidiReceiver_win32.h win32/ShortMsg.cpp win32/ShortMsg.h win32/midi.h milkytracker-0.90.85+dfsg/src/midi/Makefile.in0000644000175000017500000004172411317506534020216 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = src/midi DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libmidi_a_AR = $(AR) $(ARFLAGS) libmidi_a_LIBADD = am_libmidi_a_OBJECTS = MidiReceiver_pthread.$(OBJEXT) RtMidi.$(OBJEXT) libmidi_a_OBJECTS = $(am_libmidi_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libmidi_a_SOURCES) DIST_SOURCES = $(libmidi_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ noinst_LIBRARIES = libmidi.a libmidi_a_SOURCES = posix/MidiReceiver_pthread.cpp rtmidi/RtMidi.cpp noinst_HEADERS = posix/MidiReceiver_pthread.h rtmidi/RtError.h rtmidi/RtMidi.h \ MidiTools.h AM_CPPFLAGS = -D__LINUX_ALSASEQ__ -D__LINUX__ -DMILKYTRACKER ${ALSA_CFLAGS} \ ${SDL_CFLAGS} INCLUDES = -I$(top_srcdir)/src/milkyplay -I$(top_srcdir)/src/ppui \ -I$(top_srcdir)/src/tracker -I$(top_srcdir)/src/ppui/osinterface \ -I$(top_srcdir)/src/ppui/osinterface/sdl \ -I$(top_srcdir)/src/ppui/osinterface/posix -I$(top_srcdir)/src/midi/rtmidi EXTRA_DIST = win32/LongMsg.cpp win32/LongMsg.h win32/MIDIInDevice.cpp \ win32/MIDIInDevice.h win32/MIDIMsg.h win32/MidiReceiver_win32.cpp \ win32/MidiReceiver_win32.h win32/ShortMsg.cpp win32/ShortMsg.h win32/midi.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .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) --gnu src/midi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/midi/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-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmidi.a: $(libmidi_a_OBJECTS) $(libmidi_a_DEPENDENCIES) -rm -f libmidi.a $(libmidi_a_AR) libmidi.a $(libmidi_a_OBJECTS) $(libmidi_a_LIBADD) $(RANLIB) libmidi.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MidiReceiver_pthread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RtMidi.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` MidiReceiver_pthread.o: posix/MidiReceiver_pthread.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MidiReceiver_pthread.o -MD -MP -MF $(DEPDIR)/MidiReceiver_pthread.Tpo -c -o MidiReceiver_pthread.o `test -f 'posix/MidiReceiver_pthread.cpp' || echo '$(srcdir)/'`posix/MidiReceiver_pthread.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/MidiReceiver_pthread.Tpo $(DEPDIR)/MidiReceiver_pthread.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='posix/MidiReceiver_pthread.cpp' object='MidiReceiver_pthread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MidiReceiver_pthread.o `test -f 'posix/MidiReceiver_pthread.cpp' || echo '$(srcdir)/'`posix/MidiReceiver_pthread.cpp MidiReceiver_pthread.obj: posix/MidiReceiver_pthread.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MidiReceiver_pthread.obj -MD -MP -MF $(DEPDIR)/MidiReceiver_pthread.Tpo -c -o MidiReceiver_pthread.obj `if test -f 'posix/MidiReceiver_pthread.cpp'; then $(CYGPATH_W) 'posix/MidiReceiver_pthread.cpp'; else $(CYGPATH_W) '$(srcdir)/posix/MidiReceiver_pthread.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/MidiReceiver_pthread.Tpo $(DEPDIR)/MidiReceiver_pthread.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='posix/MidiReceiver_pthread.cpp' object='MidiReceiver_pthread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MidiReceiver_pthread.obj `if test -f 'posix/MidiReceiver_pthread.cpp'; then $(CYGPATH_W) 'posix/MidiReceiver_pthread.cpp'; else $(CYGPATH_W) '$(srcdir)/posix/MidiReceiver_pthread.cpp'; fi` RtMidi.o: rtmidi/RtMidi.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT RtMidi.o -MD -MP -MF $(DEPDIR)/RtMidi.Tpo -c -o RtMidi.o `test -f 'rtmidi/RtMidi.cpp' || echo '$(srcdir)/'`rtmidi/RtMidi.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/RtMidi.Tpo $(DEPDIR)/RtMidi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='rtmidi/RtMidi.cpp' object='RtMidi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o RtMidi.o `test -f 'rtmidi/RtMidi.cpp' || echo '$(srcdir)/'`rtmidi/RtMidi.cpp RtMidi.obj: rtmidi/RtMidi.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT RtMidi.obj -MD -MP -MF $(DEPDIR)/RtMidi.Tpo -c -o RtMidi.obj `if test -f 'rtmidi/RtMidi.cpp'; then $(CYGPATH_W) 'rtmidi/RtMidi.cpp'; else $(CYGPATH_W) '$(srcdir)/rtmidi/RtMidi.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/RtMidi.Tpo $(DEPDIR)/RtMidi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='rtmidi/RtMidi.cpp' object='RtMidi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o RtMidi.obj `if test -f 'rtmidi/RtMidi.cpp'; then $(CYGPATH_W) 'rtmidi/RtMidi.cpp'; else $(CYGPATH_W) '$(srcdir)/rtmidi/RtMidi.cpp'; fi` 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 $(LIBRARIES) $(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-generic clean-noinstLIBRARIES 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 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-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic 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 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: milkytracker-0.90.85+dfsg/src/midi/posix/0000755000175000017500000000000011317506056017302 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/midi/posix/MidiReceiver_pthread.cpp0000644000175000017500000000600311150223367024057 0ustar admin2admin2/* * midi/posix/MidiReceiver_pthread.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * MidiReceiver.cpp * MilkyTracker * * Created by Peter Barth on 08.04.06. * */ #include "MidiReceiver_pthread.h" #include "Tracker.h" #include "PPMutex.h" #include "RtMidi.h" #include "RtError.h" #include "PPSystem.h" #include #include "MidiTools.h" MidiReceiver::MidiReceiver(MidiEventHandler& midiEventHandler) : midiEventHandler(midiEventHandler), midiin(NULL), recordVelocity(false), velocityAmplify(100) { } MidiReceiver::~MidiReceiver() { if (midiin) delete midiin; } bool MidiReceiver::startRecording(unsigned int deviceID) { if (midiin) { delete midiin; midiin = NULL; } try { midiin = new RtMidiIn(); midiin->openPort(deviceID); } catch (RtError &error) { error.printMessage(); goto cleanup; } // Set our callback function. This should be done immediately after // opening the port to avoid having incoming messages written to the // queue instead of sent to the callback function. midiin->setCallback(&receiverCallback, this); // ignore sysex, timing, or active sensing messages. midiin->ignoreTypes(true, true, true); return true; cleanup: delete midiin; midiin = NULL; return false; } void MidiReceiver::stopRecording() { delete midiin; midiin = NULL; } void MidiReceiver::processMessage(double deltatime, std::vector* message, int offset) { int command = static_cast(message->at(offset)); if (command >= 128 && command <= 143) { int note = static_cast(message->at(offset+1)); // One octave less note -= 12; if (note < 1) note = 1; midiEventHandler.keyUp(note); } else if (command >= 144 && command <= 159) { int note = static_cast(message->at(offset+1)); // One octave less note -= 12; if (note < 1) note = 1; int velocity = static_cast(message->at(offset+2)); if (velocity == 0) { midiEventHandler.keyUp(note); } else { midiEventHandler.keyDown(note, recordVelocity ? vol126to255(velocity-1, velocityAmplify) : 0xff); } } } void MidiReceiver::receiverCallback(double deltatime, std::vector* message, void* userData) { MidiReceiver* midiReceiver = reinterpret_cast(userData); if (message->size() == 3) { midiReceiver->processMessage(deltatime, message, 0); } } milkytracker-0.90.85+dfsg/src/midi/posix/MidiReceiver_pthread.h0000644000175000017500000000335411150223367023532 0ustar admin2admin2/* * midi/posix/MidiReceiver_pthread.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * MidiReceiver.h * MilkyTracker * * Created by Peter Barth on 08.04.06. * */ #ifndef __MIDIRECEIVER_H__ #define __MIDIRECEIVER_H__ #include class RtMidiIn; class MidiReceiver { public: class MidiEventHandler { public: virtual void keyDown(int note, int volume) = 0; virtual void keyUp(int note) = 0; }; private: MidiEventHandler& midiEventHandler; RtMidiIn* midiin; bool recordVelocity; int velocityAmplify; std::vector message; static void receiverCallback(double deltatime, std::vector* message, void* userData); void processMessage(double deltatime, std::vector* message, int offset); public: MidiReceiver(MidiEventHandler& midiEventHandler); ~MidiReceiver(); void setRecordVelocity(bool recVelocity) { recordVelocity = recVelocity; } void setVelocityAmplify(int amplify) { velocityAmplify = amplify; } bool startRecording(unsigned int deviceID); void stopRecording(); }; #endif milkytracker-0.90.85+dfsg/src/midi/MidiTools.h0000644000175000017500000000034710737746457020240 0ustar admin2admin2#ifndef __MIDITOOLS_H__ #define __MIDITOOLS_H__ static inline int vol126to255(int vol, int amplify) { int finalVol = (((vol <= 126 ? (vol*133300)>>16 : 255)) * amplify) / 100; return finalVol <= 255 ? finalVol : 255; } #endif milkytracker-0.90.85+dfsg/src/midi/rtmidi/0000755000175000017500000000000011317506057017431 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/midi/rtmidi/RtMidi.h0000644000175000017500000002417710737746457021024 0ustar admin2admin2/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2006 Gary P. Scavone 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ /**********************************************************************/ // RtMidi: Version 1.0.6 #ifndef RTMIDI_H #define RTMIDI_H #include "RtError.h" #include class RtMidi { public: //! Pure virtual openPort() function. virtual void openPort( unsigned int portNumber = 0 ) = 0; //! Pure virtual openVirtualPort() function. virtual void openVirtualPort( const std::string portName = std::string( "RtMidi" ) ) = 0; //! Pure virtual getPortCount() function. virtual unsigned int getPortCount() = 0; //! Pure virtual getPortName() function. virtual std::string getPortName( unsigned int portNumber = 0 ) = 0; //! Pure virtual closePort() function. virtual void closePort( void ) = 0; protected: RtMidi(); virtual ~RtMidi() {}; // A basic error reporting function for internal use in the RtMidi // subclasses. The behavior of this function can be modified to // suit specific needs. void error( RtError::Type type ); void *apiData_; bool connected_; std::string errorString_; }; /**********************************************************************/ /*! \class RtMidiIn \brief A realtime MIDI input class. This class provides a common, platform-independent API for realtime MIDI input. It allows access to a single MIDI input port. Incoming MIDI messages are either saved to a queue for retrieval using the getMessage() function or immediately passed to a user-specified callback function. Create multiple instances of this class to connect to more than one MIDI device at the same time. With the OS-X and Linux ALSA MIDI APIs, it is also possible to open a virtual input port to which other MIDI software clients can connect. by Gary P. Scavone, 2003-2004. */ /**********************************************************************/ #include #include class RtMidiIn : public RtMidi { public: //! User callback function type definition. typedef void (*RtMidiCallback)( double timeStamp, std::vector *message, void *userData); //! Default constructor. /*! An exception will be thrown if a MIDI system initialization error occurs. */ RtMidiIn(); //! If a MIDI connection is still open, it will be closed by the destructor. ~RtMidiIn(); //! Open a MIDI input connection. /*! An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. */ void openPort( unsigned int portNumber = 0 ); //! Create a virtual input port, with optional name, to allow software connections (OS X and ALSA only). /*! This function creates a virtual MIDI input port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X and Linux ALSA APIs (the function does nothing for the other APIs). */ void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) ); //! Set a callback function to be invoked for incoming MIDI messages. /*! The callback function will be called whenever an incoming MIDI message is received. While not absolutely necessary, it is best to set the callback function before opening a MIDI port to avoid leaving some messages in the queue. */ void setCallback( RtMidiCallback callback, void *userData = 0 ); //! Cancel use of the current callback function (if one exists). /*! Subsequent incoming MIDI messages will be written to the queue and can be retrieved with the \e getMessage function. */ void cancelCallback(); //! Close an open MIDI connection (if one exists). void closePort( void ); //! Return the number of available MIDI input ports. unsigned int getPortCount(); //! Return a string identifier for the specified MIDI input port number. /*! An exception is thrown if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Set the maximum number of MIDI messages to be saved in the queue. /*! If the queue size limit is reached, incoming messages will be ignored. The default limit is 1024. */ void setQueueSizeLimit( unsigned int queueSize ); //! Specify whether certain MIDI message types should be queued or ignored during input. /*! By default, MIDI timing and active sensing messages are ignored during message input because of their relative high data rates. MIDI sysex messages are ignored by default as well. Variable values of "true" imply that the respective message type will be ignored. */ void ignoreTypes( bool midiSysex = true, bool midiTime = true, bool midiSense = true ); //! Fill the user-provided vector with the data bytes for the next available MIDI message in the input queue and return the event delta-time in seconds. /*! This function returns immediately whether a new message is available or not. A valid message is indicated by a non-zero vector size. An exception is thrown if an error occurs during message retrieval or an input connection was not previously established. */ double getMessage( std::vector *message ); // A MIDI structure used internally by the class to store incoming // messages. Each message represents one and only one MIDI message. struct MidiMessage { std::vector bytes; double timeStamp; // Default constructor. MidiMessage() :bytes(3), timeStamp(0.0) {} }; // The RtMidiInData structure is used to pass private class data to // the MIDI input handling function or thread. struct RtMidiInData { std::queue queue; unsigned int queueLimit; unsigned char ignoreFlags; bool doInput; bool firstMessage; void *apiData; bool usingCallback; void *userCallback; void *userData; // Default constructor. RtMidiInData() : queueLimit(1024), ignoreFlags(7), doInput(false), firstMessage(true), apiData(0), usingCallback(false), userCallback(0), userData(0) {} }; private: void initialize( void ); RtMidiInData inputData_; }; /**********************************************************************/ /*! \class RtMidiOut \brief A realtime MIDI output class. This class provides a common, platform-independent API for MIDI output. It allows one to probe available MIDI output ports, to connect to one such port, and to send MIDI bytes immediately over the connection. Create multiple instances of this class to connect to more than one MIDI device at the same time. by Gary P. Scavone, 2003-2004. */ /**********************************************************************/ class RtMidiOut : public RtMidi { public: //! Default constructor. /*! An exception will be thrown if a MIDI system initialization error occurs. */ RtMidiOut(); //! The destructor closes any open MIDI connections. ~RtMidiOut(); //! Open a MIDI output connection. /*! An optional port number greater than 0 can be specified. Otherwise, the default or first port found is opened. An exception is thrown if an error occurs while attempting to make the port connection. */ void openPort( unsigned int portNumber = 0 ); //! Close an open MIDI connection (if one exists). void closePort(); //! Create a virtual output port, with optional name, to allow software connections (OS X and ALSA only). /*! This function creates a virtual MIDI output port to which other software applications can connect. This type of functionality is currently only supported by the Macintosh OS-X and Linux ALSA APIs (the function does nothing with the other APIs). An exception is thrown if an error occurs while attempting to create the virtual port. */ void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) ); //! Return the number of available MIDI output ports. unsigned int getPortCount(); //! Return a string identifier for the specified MIDI port type and number. /*! An exception is thrown if an invalid port specifier is provided. */ std::string getPortName( unsigned int portNumber = 0 ); //! Immediately send a single message out an open MIDI output port. /*! An exception is thrown if an error occurs during output or an output connection was not previously established. */ void sendMessage( std::vector *message ); private: void initialize( void ); }; #endif milkytracker-0.90.85+dfsg/src/midi/rtmidi/RtMidi.cpp0000644000175000017500000020672710737746457021362 0ustar admin2admin2/**********************************************************************/ /*! \class RtMidi \brief An abstract base class for realtime MIDI input/output. This class implements some common functionality for the realtime MIDI input/output subclasses RtMidiIn and RtMidiOut. RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/ RtMidi: realtime MIDI i/o C++ classes Copyright (c) 2003-2006 Gary P. Scavone 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ /**********************************************************************/ // RtMidi: Version 1.0.6 #include "RtMidi.h" #include //*********************************************************************// // Common RtMidi Definitions //*********************************************************************// RtMidi :: RtMidi() : apiData_( 0 ), connected_( false ) { } void RtMidi :: error( RtError::Type type ) { if (type == RtError::WARNING) { std::cerr << '\n' << errorString_ << "\n\n"; } else if (type == RtError::DEBUG_WARNING) { #if defined(__RTMIDI_DEBUG__) std::cerr << '\n' << errorString_ << "\n\n"; #endif } else { std::cerr << '\n' << errorString_ << "\n\n"; throw RtError( errorString_, type ); } } //*********************************************************************// // Common RtMidiIn Definitions //*********************************************************************// RtMidiIn :: RtMidiIn() : RtMidi() { this->initialize(); } void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { if ( inputData_.usingCallback ) { errorString_ = "RtMidiIn::setCallback: a callback function is already set!"; error( RtError::WARNING ); return; } if ( !callback ) { errorString_ = "RtMidiIn::setCallback: callback function value is invalid!"; error( RtError::WARNING ); return; } inputData_.userCallback = (void *) callback; inputData_.userData = userData; inputData_.usingCallback = true; } void RtMidiIn :: cancelCallback() { if ( !inputData_.usingCallback ) { errorString_ = "RtMidiIn::cancelCallback: no callback function was set!"; error( RtError::WARNING ); return; } inputData_.userCallback = 0; inputData_.userData = 0; inputData_.usingCallback = false; } void RtMidiIn :: setQueueSizeLimit( unsigned int queueSize ) { inputData_.queueLimit = queueSize; } void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { inputData_.ignoreFlags = 0; if ( midiSysex ) inputData_.ignoreFlags = 0x01; if ( midiTime ) inputData_.ignoreFlags |= 0x02; if ( midiSense ) inputData_.ignoreFlags |= 0x04; } double RtMidiIn :: getMessage( std::vector *message ) { message->clear(); if ( inputData_.usingCallback ) { errorString_ = "RtMidiIn::getNextMessage: a user callback is currently set for this port."; error( RtError::WARNING ); return 0.0; } if ( inputData_.queue.size() == 0 ) return 0.0; // Copy queued message to the vector pointer argument and then "pop" it. std::vector *bytes = &(inputData_.queue.front().bytes); message->assign( bytes->begin(), bytes->end() ); double deltaTime = inputData_.queue.front().timeStamp; inputData_.queue.pop(); return deltaTime; } //*********************************************************************// // Common RtMidiOut Definitions //*********************************************************************// RtMidiOut :: RtMidiOut() : RtMidi() { this->initialize(); } //*********************************************************************// // API: Macintosh OS-X //*********************************************************************// // API information found at: // - http://developer. apple .com/audio/pdf/coreaudio.pdf #if defined(__MACOSX_CORE__) // The CoreMIDI API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // OS-X CoreMIDI header files. #include #include // A structure to hold variables related to the CoreMIDI API // implementation. struct CoreMidiData { MIDIClientRef client; MIDIPortRef port; MIDIEndpointRef endpoint; MIDIEndpointRef destinationId; unsigned long long lastTime; }; //*********************************************************************// // API: OS-X // Class Definitions: RtMidiIn //*********************************************************************// void midiInputCallback( const MIDIPacketList *list, void *procRef, void *srcRef ) { RtMidiIn::RtMidiInData *data = static_cast (procRef); CoreMidiData *apiData = static_cast (data->apiData); bool continueSysex = false; unsigned char status; unsigned short nBytes, iByte, size; unsigned long long time; RtMidiIn::MidiMessage message; const MIDIPacket *packet = &list->packet[0]; for ( unsigned int i=0; inumPackets; ++i ) { // My interpretation of the CoreMIDI documentation: all message // types, except sysex, are complete within a packet and there may // be several of them in a single packet. Sysex messages can be // broken across multiple packets but are bundled alone within a // packet. I'm assuming that sysex messages, if segmented, must // be complete within the same MIDIPacketList. nBytes = packet->length; if ( nBytes == 0 ) continue; // Calculate time stamp. message.timeStamp = 0.0; if ( data->firstMessage ) data->firstMessage = false; else { time = packet->timeStamp; time -= apiData->lastTime; time = AudioConvertHostTimeToNanos( time ); message.timeStamp = time * 0.000000001; } apiData->lastTime = packet->timeStamp; iByte = 0; if ( continueSysex ) { // We have a continuing, segmented sysex message. if ( !(data->ignoreFlags & 0x01) ) { // If we're not ignoring sysex messages, copy the entire packet. for ( unsigned int j=0; jdata[j] ); } if ( packet->data[nBytes] == 0xF7 ) continueSysex = false; if ( !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback && message.bytes.size() > 0 ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } else { while ( iByte < nBytes ) { size = 0; // We are expecting that the next byte in the packet is a status byte. status = packet->data[iByte]; if ( !(status & 0x80) ) break; // Determine the number of bytes in the MIDI message. if ( status < 0xC0 ) size = 3; else if ( status < 0xE0 ) size = 2; else if ( status < 0xF0 ) size = 3; else if ( status == 0xF0 ) { // A MIDI sysex if ( data->ignoreFlags & 0x01 ) { size = 0; iByte = nBytes; } else size = nBytes - iByte; if ( packet->data[nBytes] == 0xF7 ) continueSysex = false; } else if ( status < 0xF3 ) { if ( status == 0xF1 && (data->ignoreFlags & 0x02) ) { // A MIDI time code message and we're ignoring it. size = 0; iByte += 3; } else size = 3; } else if ( status == 0xF3 ) size = 2; else if ( status == 0xF8 ) { size = 1; if ( data->ignoreFlags & 0x02 ) { // A MIDI timing tick message and we're ignoring it. size = 0; iByte += 3; } } else if ( status == 0xFE && (data->ignoreFlags & 0x04) ) { // A MIDI active sensing message and we're ignoring it. size = 0; iByte += 1; } else size = 1; // Copy the MIDI data to our vector. if ( size ) { message.bytes.assign( &packet->data[iByte], &packet->data[iByte+size] ); if ( !continueSysex ) { // If not a continuing sysex message, invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } iByte += size; } } } packet = MIDIPacketNext(packet); } } void RtMidiIn :: initialize( void ) { // Set up our client. MIDIClientRef client; OSStatus result = MIDIClientCreate( CFSTR("RtMidi Input Client"), NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "RtMidiIn::initialize: error creating OS-X MIDI client object."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; inputData_.apiData = (void *) data; } void RtMidiIn :: openPort( unsigned int portNumber ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = MIDIGetNumberOfSources(); if (nSrc < 1) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nSrc ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIInputPortCreate( data->client, CFSTR("RtMidi MIDI Input Port"), midiInputCallback, (void *)&inputData_, &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error creating OS-X MIDI input port."; error( RtError::DRIVER_ERROR ); } // Get the desired input source identifier. MIDIEndpointRef endpoint = MIDIGetSource( portNumber ); if ( endpoint == NULL ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error getting MIDI input source reference."; error( RtError::DRIVER_ERROR ); } // Make the connection. result = MIDIPortConnectSource( port, endpoint, NULL ); if ( result != noErr ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiIn::openPort: error connecting OS-X MIDI input port."; error( RtError::DRIVER_ERROR ); } // Save our api-specific port information. data->port = port; connected_ = true; } void RtMidiIn :: openVirtualPort( const std::string portName ) { CoreMidiData *data = static_cast (apiData_); // Create a virtual MIDI input destination. MIDIEndpointRef endpoint; OSStatus result = MIDIDestinationCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), midiInputCallback, (void *)&inputData_, &endpoint ); if ( result != noErr ) { errorString_ = "RtMidiIn::openVirtualPort: error creating virtual OS-X MIDI destination."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->endpoint = endpoint; } void RtMidiIn :: closePort( void ) { if ( connected_ ) { CoreMidiData *data = static_cast (apiData_); MIDIPortDispose( data->port ); connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } unsigned int RtMidiIn :: getPortCount() { return MIDIGetNumberOfSources(); } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { CFStringRef nameRef; MIDIEndpointRef portRef; std::ostringstream ost; char name[128]; if ( portNumber >= MIDIGetNumberOfSources() ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } portRef = MIDIGetSource( portNumber ); MIDIObjectGetStringProperty( portRef, kMIDIPropertyName, &nameRef ); CFStringGetCString( nameRef, name, sizeof(name), 0); CFRelease( nameRef ); std::string stringName = name; return stringName; } //*********************************************************************// // API: OS-X // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { return MIDIGetNumberOfDestinations(); } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { CFStringRef nameRef; MIDIEndpointRef portRef; std::ostringstream ost; char name[128]; if ( portNumber >= MIDIGetNumberOfDestinations() ) { ost << "RtMidiOut::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } portRef = MIDIGetDestination( portNumber ); MIDIObjectGetStringProperty( portRef, kMIDIPropertyName, &nameRef ); CFStringGetCString( nameRef, name, sizeof(name), 0); CFRelease( nameRef ); std::string stringName = name; return stringName; } void RtMidiOut :: initialize( void ) { // Set up our client. MIDIClientRef client; OSStatus result = MIDIClientCreate( CFSTR("RtMidi Output Client"), NULL, NULL, &client ); if ( result != noErr ) { errorString_ = "RtMidiOut::initialize: error creating OS-X MIDI client object."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. CoreMidiData *data = (CoreMidiData *) new CoreMidiData; data->client = client; data->endpoint = 0; apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nDest = MIDIGetNumberOfDestinations(); if (nDest < 1) { errorString_ = "RtMidiOut::openPort: no MIDI output destinations found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nDest ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIPortRef port; CoreMidiData *data = static_cast (apiData_); OSStatus result = MIDIOutputPortCreate( data->client, CFSTR("RtMidi Virtual MIDI Output Port"), &port ); if ( result != noErr ) { MIDIClientDispose( data->client ); errorString_ = "RtMidiOut::openPort: error creating OS-X MIDI output port."; error( RtError::DRIVER_ERROR ); } // Get the desired output port identifier. MIDIEndpointRef destination = MIDIGetDestination( portNumber ); if ( destination == NULL ) { MIDIPortDispose( port ); MIDIClientDispose( data->client ); errorString_ = "RtMidiOut::openPort: error getting MIDI output destination reference."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->port = port; data->destinationId = destination; connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { CoreMidiData *data = static_cast (apiData_); MIDIPortDispose( data->port ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { CoreMidiData *data = static_cast (apiData_); if ( data->endpoint ) { errorString_ = "RtMidiOut::openVirtualPort: a virtual output port already exists!"; error( RtError::WARNING ); return; } // Create a virtual MIDI output source. MIDIEndpointRef endpoint; OSStatus result = MIDISourceCreate( data->client, CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ), &endpoint ); if ( result != noErr ) { errorString_ = "RtMidiOut::initialize: error creating OS-X virtual MIDI source."; error( RtError::DRIVER_ERROR ); } // Save our api-specific connection information. data->endpoint = endpoint; } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. CoreMidiData *data = static_cast (apiData_); MIDIClientDispose( data->client ); if ( data->endpoint ) MIDIEndpointDispose( data->endpoint ); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { unsigned int nBytes = message->size(); // Pad the buffer for extra (unknown) structure data. Byte buffer[nBytes+32]; MIDIPacketList *pktlist = (MIDIPacketList *) buffer; MIDIPacket *curPacket = MIDIPacketListInit( pktlist ); MIDITimeStamp timeStamp = 0; curPacket = MIDIPacketListAdd( pktlist, sizeof(buffer), curPacket, timeStamp, nBytes, &message->at(0) ); CoreMidiData *data = static_cast (apiData_); // Send to any destinations that may have connected to us. OSStatus result; if ( data->endpoint ) { result = MIDIReceived( data->endpoint, pktlist ); if ( result != noErr ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI to virtual destinations."; error( RtError::WARNING ); } } // And send to an explicit destination port if we're connected. if ( connected_ ) { result = MIDISend( data->port, data->destinationId, pktlist ); if ( result != noErr ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message to port."; error( RtError::WARNING ); } } } #endif // __MACOSX_CORE__ //*********************************************************************// // API: LINUX ALSA SEQUENCER //*********************************************************************// // API information found at: // - http://www.alsa-project.org/documentation.php#Library #if defined(__LINUX_ALSASEQ__) // The ALSA Sequencer API is based on the use of a callback function for // MIDI input. // // Thanks to Pedro Lopez-Cabanillas for help with the ALSA sequencer // time stamps and other assorted fixes!!! #include #include // ALSA header file. #include // A structure to hold variables related to the ALSA API // implementation. struct AlsaMidiData { snd_seq_t *seq; int vport; snd_seq_port_subscribe_t *subscription; snd_midi_event_t *coder; unsigned int bufferSize; unsigned char *buffer; pthread_t thread; unsigned long long lastTime; int queue_id; // an input queue is needed to get timestamped events }; #define PORT_TYPE( pinfo, bits ) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) //*********************************************************************// // API: LINUX ALSA // Class Definitions: RtMidiIn //*********************************************************************// extern "C" void *alsaMidiHandler( void *ptr ) { RtMidiIn::RtMidiInData *data = static_cast (ptr); AlsaMidiData *apiData = static_cast (data->apiData); long nBytes; unsigned long long time, lastTime; bool continueSysex = false; RtMidiIn::MidiMessage message; snd_seq_event_t *ev; int result; apiData->bufferSize = 32; result = snd_midi_event_new( 0, &apiData->coder ); if ( result < 0 ) { data->doInput = false; std::cerr << "\nRtMidiIn::alsaMidiHandler: error initializing MIDI event parser!\n\n"; return 0; } unsigned char *buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; std::cerr << "\nRtMidiIn::alsaMidiHandler: error initializing buffer memory!\n\n"; return 0; } snd_midi_event_init( apiData->coder ); snd_midi_event_no_status( apiData->coder, 1 ); // suppress running status messages while ( data->doInput ) { if ( snd_seq_event_input_pending( apiData->seq, 1 ) == 0 ) { // No data pending ... sleep a bit. usleep( 1000 ); continue; } // If here, there should be data. result = snd_seq_event_input( apiData->seq, &ev ); if ( result == -ENOSPC ) { std::cerr << "\nRtMidiIn::alsaMidiHandler: MIDI input buffer overrun!\n\n"; continue; } else if ( result <= 0 ) { std::cerr << "RtMidiIn::alsaMidiHandler: unknown MIDI input error!\n"; continue; } // This is a bit weird, but we now have to decode an ALSA MIDI // event (back) into MIDI bytes. We'll ignore non-MIDI types. message.bytes.clear(); switch ( ev->type ) { case SND_SEQ_EVENT_PORT_SUBSCRIBED: #if defined(__RTMIDI_DEBUG__) std::cout << "RtMidiIn::alsaMidiHandler: port connection made!\n"; #endif break; case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: std::cerr << "RtMidiIn::alsaMidiHandler: port connection has closed!\n"; data->doInput = false; break; case SND_SEQ_EVENT_QFRAME: // MIDI time code if ( data->ignoreFlags & 0x02 ) break; case SND_SEQ_EVENT_TICK: // MIDI timing tick if ( data->ignoreFlags & 0x02 ) break; case SND_SEQ_EVENT_SENSING: // Active sensing if ( data->ignoreFlags & 0x04 ) break; case SND_SEQ_EVENT_SYSEX: if ( (data->ignoreFlags & 0x01) ) break; if ( ev->data.ext.len > apiData->bufferSize ) { apiData->bufferSize = ev->data.ext.len; free( buffer ); buffer = (unsigned char *) malloc( apiData->bufferSize ); if ( buffer == NULL ) { data->doInput = false; std::cerr << "\nRtMidiIn::alsaMidiHandler: error resizing buffer memory!\n\n"; break; } } default: nBytes = snd_midi_event_decode( apiData->coder, buffer, apiData->bufferSize, ev ); if ( nBytes <= 0 ) { #if defined(__RTMIDI_DEBUG__) std::cerr << "\nRtMidiIn::alsaMidiHandler: event parsing error or not a MIDI event!\n\n"; #endif break; } // The ALSA sequencer has a maximum buffer size for MIDI sysex // events of 256 bytes. If a device sends sysex messages larger // than this, they are segmented into 256 byte chunks. So, // we'll watch for this and concatenate sysex chunks into a // single sysex message if necessary. if ( !continueSysex ) message.bytes.assign( buffer, &buffer[nBytes] ); else message.bytes.insert( message.bytes.end(), buffer, &buffer[nBytes] ); continueSysex = ( ev->type == SND_SEQ_EVENT_SYSEX && message.bytes.back() != 0xF7 ); if ( continueSysex ) break; // Calculate the time stamp: message.timeStamp = 0.0; // Method 1: Use the system time. //(void)gettimeofday(&tv, (struct timezone *)NULL); //time = (tv.tv_sec * 1000000) + tv.tv_usec; // Method 2: Use the ALSA sequencer event time data. // (thanks to Pedro Lopez-Cabanillas!). time = ( ev->time.time.tv_sec * 1000000 ) + ( ev->time.time.tv_nsec/1000 ); lastTime = time; time -= apiData->lastTime; apiData->lastTime = lastTime; if ( data->firstMessage == true ) data->firstMessage = false; else message.timeStamp = time * 0.000001; } snd_seq_free_event(ev); if ( message.bytes.size() == 0 ) continue; if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } } if ( buffer ) free( buffer ); snd_midi_event_free( apiData->coder ); apiData->coder = 0; return 0; } void RtMidiIn :: initialize( void ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK); if ( result < 0 ) { errorString_ = "RtMidiIn::initialize: error creating ALSA sequencer input client object."; error( RtError::DRIVER_ERROR ); } // Set client name. snd_seq_set_client_name(seq, "RtMidi Input Client"); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->vport = -1; apiData_ = (void *) data; inputData_.apiData = (void *) data; // Create the input queue data->queue_id = snd_seq_alloc_named_queue(seq, "RtMidi Queue"); // Set arbitrary tempo (mm=100) and resolution (240) snd_seq_queue_tempo_t *qtempo; snd_seq_queue_tempo_alloca(&qtempo); snd_seq_queue_tempo_set_tempo(qtempo, 600000); snd_seq_queue_tempo_set_ppq(qtempo, 240); snd_seq_set_queue_tempo(data->seq, data->queue_id, qtempo); snd_seq_drain_output(data->seq); } // This function is used to count or get the pinfo structure for a given port number. unsigned int portInfo( snd_seq_t *seq, snd_seq_port_info_t *pinfo, unsigned int type, int portNumber ) { snd_seq_client_info_t *cinfo; int client; int count = 0; snd_seq_client_info_alloca( &cinfo ); snd_seq_client_info_set_client( cinfo, -1 ); while ( snd_seq_query_next_client( seq, cinfo ) >= 0 ) { client = snd_seq_client_info_get_client( cinfo ); if ( client == 0 ) continue; // Reset query info snd_seq_port_info_set_client( pinfo, client ); snd_seq_port_info_set_port( pinfo, -1 ); while ( snd_seq_query_next_port( seq, pinfo ) >= 0 ) { if ( !PORT_TYPE( pinfo, type ) ) continue; if ( count == portNumber ) return 1; count++; } } // If a negative portNumber was used, return the port count. if ( portNumber < 0 ) return count; return 0; } void RtMidiIn :: openPort( unsigned int portNumber ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = this->getPortCount(); if (nSrc < 1) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); std::ostringstream ost; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) == 0 ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } snd_seq_addr_t sender, receiver; sender.client = snd_seq_port_info_get_client( pinfo ); sender.port = snd_seq_port_info_get_port( pinfo ); receiver.client = snd_seq_client_id( data->seq ); if ( data->vport < 0 ) { snd_seq_port_info_set_client( pinfo, 0 ); snd_seq_port_info_set_port( pinfo, 0 ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); snd_seq_port_info_set_name(pinfo, "RtMidi Input"); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "RtMidiIn::openPort: ALSA error creating input port."; error( RtError::DRIVER_ERROR ); } } receiver.port = data->vport; // Make subscription snd_seq_port_subscribe_malloc( &data->subscription ); snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { errorString_ = "RtMidiIn::openPort: ALSA error making port connection."; error( RtError::DRIVER_ERROR ); } if ( inputData_.doInput == false ) { // Start the input queue snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); snd_seq_port_info_set_capability( pinfo, SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE ); snd_seq_port_info_set_type( pinfo, SND_SEQ_PORT_TYPE_MIDI_GENERIC | SND_SEQ_PORT_TYPE_APPLICATION ); snd_seq_port_info_set_midi_channels(pinfo, 16); snd_seq_port_info_set_timestamping(pinfo, 1); snd_seq_port_info_set_timestamp_real(pinfo, 1); snd_seq_port_info_set_timestamp_queue(pinfo, data->queue_id); snd_seq_port_info_set_name(pinfo, portName.c_str()); data->vport = snd_seq_create_port(data->seq, pinfo); if ( data->vport < 0 ) { errorString_ = "RtMidiIn::openVirtualPort: ALSA error creating virtual port."; error( RtError::DRIVER_ERROR ); } } if ( inputData_.doInput == false ) { // Start the input queue snd_seq_start_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_OTHER); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, alsaMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } } } void RtMidiIn :: closePort( void ) { if ( connected_ ) { AlsaMidiData *data = static_cast (apiData_); snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); // Stop the input queue snd_seq_stop_queue( data->seq, data->queue_id, NULL ); snd_seq_drain_output( data->seq ); connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Shutdown the input thread. AlsaMidiData *data = static_cast (apiData_); if ( inputData_.doInput ) { inputData_.doInput = false; pthread_join( data->thread, NULL ); } // Cleanup. if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); snd_seq_free_queue( data->seq, data->queue_id ); snd_seq_close( data->seq ); delete data; } unsigned int RtMidiIn :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, -1 ); } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, (int) portNumber ) ) { std::string stringName = std::string( snd_seq_port_info_get_name( pinfo ) ); return stringName; } // If we get here, we didn't find a match. errorString_ = "RtMidiIn::getPortName: error looking for port name!"; error( RtError::INVALID_PARAMETER ); return 0; } //*********************************************************************// // API: LINUX ALSA // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); return portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, -1 ); } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) ) { std::string stringName = std::string( snd_seq_port_info_get_name( pinfo ) ); return stringName; } // If we get here, we didn't find a match. errorString_ = "RtMidiOut::getPortName: error looking for port name!"; error( RtError::INVALID_PARAMETER ); return 0; } void RtMidiOut :: initialize( void ) { // Set up the ALSA sequencer client. snd_seq_t *seq; int result = snd_seq_open(&seq, "default", SND_SEQ_OPEN_OUTPUT, 0); if ( result < 0 ) { errorString_ = "RtMidiOut::initialize: error creating ALSA sequencer client object."; error( RtError::DRIVER_ERROR ); } // Set client name. snd_seq_set_client_name(seq, "RtMidi Output Client"); // Save our api-specific connection information. AlsaMidiData *data = (AlsaMidiData *) new AlsaMidiData; data->seq = seq; data->vport = -1; data->bufferSize = 32; data->coder = 0; data->buffer = 0; result = snd_midi_event_new( data->bufferSize, &data->coder ); if ( result < 0 ) { delete data; errorString_ = "RtMidiOut::initialize: error initializing MIDI event parser!\n\n"; error( RtError::DRIVER_ERROR ); } data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { delete data; errorString_ = "RtMidiOut::initialize: error allocating buffer memory!\n\n"; error( RtError::MEMORY_ERROR ); } snd_midi_event_init( data->coder ); apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nSrc = this->getPortCount(); if (nSrc < 1) { errorString_ = "RtMidiOut::openPort: no MIDI output sources found!"; error( RtError::NO_DEVICES_FOUND ); } snd_seq_port_info_t *pinfo; snd_seq_port_info_alloca( &pinfo ); std::ostringstream ost; AlsaMidiData *data = static_cast (apiData_); if ( portInfo( data->seq, pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, (int) portNumber ) == 0 ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } snd_seq_addr_t sender, receiver; receiver.client = snd_seq_port_info_get_client( pinfo ); receiver.port = snd_seq_port_info_get_port( pinfo ); sender.client = snd_seq_client_id( data->seq ); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, "RtMidi Output", SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC ); if ( data->vport < 0 ) { errorString_ = "RtMidiOut::openPort: ALSA error creating output port."; error( RtError::DRIVER_ERROR ); } } sender.port = data->vport; // Make subscription snd_seq_port_subscribe_malloc( &data->subscription ); snd_seq_port_subscribe_set_sender(data->subscription, &sender); snd_seq_port_subscribe_set_dest(data->subscription, &receiver); snd_seq_port_subscribe_set_time_update(data->subscription, 1); snd_seq_port_subscribe_set_time_real(data->subscription, 1); if ( snd_seq_subscribe_port(data->seq, data->subscription) ) { errorString_ = "RtMidiOut::openPort: ALSA error making port connection."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { AlsaMidiData *data = static_cast (apiData_); snd_seq_unsubscribe_port( data->seq, data->subscription ); snd_seq_port_subscribe_free( data->subscription ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { AlsaMidiData *data = static_cast (apiData_); if ( data->vport < 0 ) { data->vport = snd_seq_create_simple_port( data->seq, portName.c_str(), SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ, SND_SEQ_PORT_TYPE_MIDI_GENERIC ); if ( data->vport < 0 ) { errorString_ = "RtMidiOut::openVirtualPort: ALSA error creating virtual port."; error( RtError::DRIVER_ERROR ); } } } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. AlsaMidiData *data = static_cast (apiData_); if ( data->vport >= 0 ) snd_seq_delete_port( data->seq, data->vport ); if ( data->coder ) snd_midi_event_free( data->coder ); if ( data->buffer ) free( data->buffer ); snd_seq_close( data->seq ); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { int result; AlsaMidiData *data = static_cast (apiData_); unsigned int nBytes = message->size(); if ( nBytes > data->bufferSize ) { data->bufferSize = nBytes; result = snd_midi_event_resize_buffer ( data->coder, nBytes); if ( result != 0 ) { errorString_ = "RtMidiOut::sendMessage: ALSA error resizing MIDI event buffer."; error( RtError::DRIVER_ERROR ); } free (data->buffer); data->buffer = (unsigned char *) malloc( data->bufferSize ); if ( data->buffer == NULL ) { errorString_ = "RtMidiOut::initialize: error allocating buffer memory!\n\n"; error( RtError::MEMORY_ERROR ); } } snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_source(&ev, data->vport); snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); for ( unsigned int i=0; ibuffer[i] = message->at(i); result = snd_midi_event_encode( data->coder, data->buffer, (long)nBytes, &ev ); if ( result < (int)nBytes ) { errorString_ = "RtMidiOut::sendMessage: event parsing error!"; error( RtError::WARNING ); return; } // Send the event. result = snd_seq_event_output(data->seq, &ev); if ( result < 0 ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message to port."; error( RtError::WARNING ); } snd_seq_drain_output(data->seq); } #endif // __LINUX_ALSA__ //*********************************************************************// // API: IRIX MD //*********************************************************************// // API information gleamed from: // http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?cmd=getdoc&coll=0650&db=man&fname=3%20mdIntro // If the Makefile doesn't work, try the following: // CC -o midiinfo -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp midiinfo.cpp -lpthread -lmd // CC -o midiout -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp midiout.cpp -lpthread -lmd // CC -o qmidiin -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp qmidiin.cpp -lpthread -lmd // CC -o cmidiin -LANG:std -D__IRIX_MD__ -I../ ../RtMidi.cpp cmidiin.cpp -lpthread -lmd #if defined(__IRIX_MD__) #include #include #include // Irix MIDI header file. #include // A structure to hold variables related to the IRIX API // implementation. struct IrixMidiData { MDport port; pthread_t thread; }; //*********************************************************************// // API: IRIX // Class Definitions: RtMidiIn //*********************************************************************// extern "C" void *irixMidiHandler( void *ptr ) { RtMidiIn::RtMidiInData *data = static_cast (ptr); IrixMidiData *apiData = static_cast (data->apiData); bool continueSysex = false; unsigned char status; unsigned short size; MDevent event; int fd = mdGetFd( apiData->port ); if ( fd < 0 ) { data->doInput = false; std::cerr << "\nRtMidiIn::irixMidiHandler: error getting port descriptor!\n\n"; return 0; } fd_set mask, rmask; FD_ZERO( &mask ); FD_SET( fd, &mask ); struct timeval timeout = {0, 0}; RtMidiIn::MidiMessage message; int result; while ( data->doInput ) { rmask = mask; timeout.tv_sec = 0; timeout.tv_usec = 0; if ( select( fd+1, &rmask, NULL, NULL, &timeout ) <= 0 ) { // No data pending ... sleep a bit. usleep( 1000 ); continue; } // If here, there should be data. result = mdReceive( apiData->port, &event, 1); if ( result <= 0 ) { std::cerr << "\nRtMidiIn::irixMidiHandler: MIDI input read error!\n\n"; continue; } message.timeStamp = event.stamp * 0.000000001; size = 0; status = event.msg[0]; if ( !(status & 0x80) ) continue; if ( status == 0xF0 ) { // Sysex message ... can be segmented across multiple messages. if ( !(data->ignoreFlags & 0x01) ) { if ( continueSysex ) { // We have a continuing, segmented sysex message. Append // the new bytes to our existing message. for ( int i=0; iusingCallback && message.bytes.size() > 0 ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } } mdFree( NULL ); continue; } else if ( status < 0xC0 ) size = 3; else if ( status < 0xE0 ) size = 2; else if ( status < 0xF0 ) size = 3; else if ( status < 0xF3 ) { if ( status == 0xF1 && !(data->ignoreFlags & 0x02) ) { // A MIDI time code message and we're not ignoring it. size = 3; } } else if ( status == 0xF3 ) size = 2; else if ( status == 0xF8 ) { if ( !(data->ignoreFlags & 0x02) ) { // A MIDI timing tick message and we're not ignoring it. size = 1; } } else if ( status == 0xFE ) { // MIDI active sensing if ( !(data->ignoreFlags & 0x04) ) size = 1; } else size = 1; // Copy the MIDI data to our vector. if ( size ) { message.bytes.assign( &event.msg[0], &event.msg[size] ); // Invoke the user callback function or queue the message. if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( message.timeStamp, &message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } message.bytes.clear(); } } return 0; } void RtMidiIn :: initialize( void ) { // Initialize the Irix MIDI system. At the moment, we will not // worry about a return value of zero (ports) because there is a // chance the user could plug something in after instantiation. int nPorts = mdInit(); // Create our api-specific connection information. IrixMidiData *data = (IrixMidiData *) new IrixMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; } void RtMidiIn :: openPort( unsigned int portNumber ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } int nPorts = mdInit(); if (nPorts < 1) { errorString_ = "RtMidiIn::openPort: no Irix MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } IrixMidiData *data = static_cast (apiData_); data->port = mdOpenInPort( mdGetName(portNumber) ); if ( data->port == NULL ) { ost << "RtMidiIn::openPort: Irix error opening the port (" << portNumber << ")."; errorString_ = ost.str(); error( RtError::DRIVER_ERROR ); } mdSetStampMode(data->port, MD_DELTASTAMP); // Start our MIDI input thread. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_RR); inputData_.doInput = true; int err = pthread_create(&data->thread, &attr, irixMidiHandler, &inputData_); pthread_attr_destroy(&attr); if (err) { mdClosePort( data->port ); inputData_.doInput = false; errorString_ = "RtMidiIn::openPort: error starting MIDI input thread!"; error( RtError::THREAD_ERROR ); } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Irix MIDI API. errorString_ = "RtMidiIn::openVirtualPort: cannot be implemented in Irix MIDI API!"; error( RtError::WARNING ); } void RtMidiIn :: closePort( void ) { if ( connected_ ) { IrixMidiData *data = static_cast (apiData_); mdClosePort( data->port ); connected_ = false; // Shutdown the input thread. inputData_.doInput = false; pthread_join( data->thread, NULL ); } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. IrixMidiData *data = static_cast (apiData_); delete data; } unsigned int RtMidiIn :: getPortCount() { int nPorts = mdInit(); if ( nPorts >= 0 ) return nPorts; else return 0; } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { int nPorts = mdInit(); std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } std::string stringName = std::string( mdGetName( portNumber ) ); return stringName; } //*********************************************************************// // API: IRIX MD // Class Definitions: RtMidiOut //*********************************************************************// unsigned int RtMidiOut :: getPortCount() { int nPorts = mdInit(); if ( nPorts >= 0 ) return nPorts; else return 0; } std::string RtMidiOut :: getPortName( unsigned int portNumber ) { int nPorts = mdInit(); std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } std::string stringName = std::string( mdGetName( portNumber ) ); return stringName; } void RtMidiOut :: initialize( void ) { // Initialize the Irix MIDI system. At the moment, we will not // worry about a return value of zero (ports) because there is a // chance the user could plug something in after instantiation. int nPorts = mdInit(); // Create our api-specific connection information. IrixMidiData *data = (IrixMidiData *) new IrixMidiData; apiData_ = (void *) data; } void RtMidiOut :: openPort( unsigned int portNumber ) { if ( connected_ ) { errorString_ = "RtMidiOut::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } int nPorts = mdInit(); if (nPorts < 1) { errorString_ = "RtMidiOut::openPort: no Irix MIDI output sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nPorts ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } IrixMidiData *data = static_cast (apiData_); data->port = mdOpenOutPort( mdGetName(portNumber) ); if ( data->port == NULL ) { ost << "RtMidiOut::openPort: Irix error opening the port (" << portNumber << ")."; errorString_ = ost.str(); error( RtError::DRIVER_ERROR ); } mdSetStampMode(data->port, MD_NOSTAMP); connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { IrixMidiData *data = static_cast (apiData_); mdClosePort( data->port ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Irix MIDI API. errorString_ = "RtMidiOut::openVirtualPort: cannot be implemented in Irix MIDI API!"; error( RtError::WARNING ); } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. IrixMidiData *data = static_cast (apiData_); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { int result; MDevent event; IrixMidiData *data = static_cast (apiData_); char *buffer = 0; unsigned int nBytes = message->size(); if ( nBytes == 0 ) return; event.stamp = 0; if ( message->at(0) == 0xF0 ) { if ( nBytes < 3 ) return; // check for bogus sysex event.msg[0] = 0xF0; event.msglen = nBytes; buffer = (char *) malloc( nBytes ); for ( int i=0; iat(i); event.sysexmsg = buffer; } else { for ( int i=0; iat(i); } // Send the event. result = mdSend( data->port, &event, 1 ); if ( buffer ) free( buffer ); if ( result < 1 ) { errorString_ = "RtMidiOut::sendMessage: IRIX error sending MIDI message!"; error( RtError::WARNING ); return; } } #endif // __IRIX_MD__ //*********************************************************************// // API: Windows Multimedia Library (MM) //*********************************************************************// // API information deciphered from: // - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_midi_reference.asp // Thanks to Jean-Baptiste Berruchon for the sysex code. #if defined(__WINDOWS_MM__) // The Windows MM API is based on the use of a callback function for // MIDI input. We convert the system specific time stamps to delta // time values. // Windows MM MIDI header files. #include #include // A structure to hold variables related to the CoreMIDI API // implementation. struct WinMidiData { HMIDIIN inHandle; // Handle to Midi Input Device HMIDIOUT outHandle; // Handle to Midi Output Device DWORD lastTime; RtMidiIn::MidiMessage message; LPMIDIHDR sysexBuffer; }; #define RT_SYSEX_BUFFER_SIZE 1024 //*********************************************************************// // API: Windows MM // Class Definitions: RtMidiIn //*********************************************************************// static void CALLBACK midiInputCallback( HMIDIOUT hmin, UINT inputStatus, DWORD instancePtr, DWORD midiMessage, DWORD timestamp ) { if ( inputStatus != MIM_DATA && inputStatus != MIM_LONGDATA ) return; //RtMidiIn::RtMidiInData *data = static_cast (instancePtr); RtMidiIn::RtMidiInData *data = (RtMidiIn::RtMidiInData *)instancePtr; WinMidiData *apiData = static_cast (data->apiData); // Calculate time stamp. apiData->message.timeStamp = 0.0; if ( data->firstMessage == true ) data->firstMessage = false; else apiData->message.timeStamp = (double) ( timestamp - apiData->lastTime ) * 0.001; apiData->lastTime = timestamp; if ( inputStatus == MIM_DATA ) { // Channel or system message // Make sure the first byte is a status byte. unsigned char status = (unsigned char) (midiMessage & 0x000000FF); if ( !(status & 0x80) ) return; // Determine the number of bytes in the MIDI message. unsigned short nBytes = 1; if ( status < 0xC0 ) nBytes = 3; else if ( status < 0xE0 ) nBytes = 2; else if ( status < 0xF0 ) nBytes = 3; else if ( status < 0xF3 ) { // A MIDI time code message and we're ignoring it. if ( status == 0xF1 && (data->ignoreFlags & 0x02) ) return; nBytes = 3; } else if ( status == 0xF3 ) nBytes = 2; else if ( status == 0xF8 && (data->ignoreFlags & 0x02) ) { // A MIDI timing tick message and we're ignoring it. return; } else if ( status == 0xFE && (data->ignoreFlags & 0x04) ) { // A MIDI active sensing message and we're ignoring it. return; } // Copy bytes to our MIDI message. unsigned char *ptr = (unsigned char *) &midiMessage; for ( int i=0; imessage.bytes.push_back( *ptr++ ); } else if ( !(data->ignoreFlags & 0x01) ) { // Sysex message and we're not ignoring it MIDIHDR *sysex = ( MIDIHDR *) midiMessage; for ( int i=0; i<(int)sysex->dwBytesRecorded; i++ ) apiData->message.bytes.push_back( sysex->lpData[i] ); // When the callback has to be unaffected (application closes), // it seems WinMM calls it with an empty sysex to de-queue the buffer // If the buffer is requeued afer that message, the PC suddenly reboots // after one or two minutes (JB). if ( apiData->sysexBuffer->dwBytesRecorded > 0 ) { MMRESULT result = midiInAddBuffer( apiData->inHandle, apiData->sysexBuffer, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) std::cerr << "\nRtMidiIn::midiInputCallback: error sending sysex to Midi device!!\n\n"; } } if ( data->usingCallback ) { RtMidiIn::RtMidiCallback callback = (RtMidiIn::RtMidiCallback) data->userCallback; callback( apiData->message.timeStamp, &apiData->message.bytes, data->userData ); } else { // As long as we haven't reached our queue size limit, push the message. if ( data->queueLimit > data->queue.size() ) data->queue.push( apiData->message ); else std::cerr << "\nRtMidiIn: message queue limit reached!!\n\n"; } // Clear the vector for the next input message. Note that doing // this here allows our code to work for sysex messages which are // segmented across multiple buffers. apiData->message.bytes.clear(); } void RtMidiIn :: initialize( void ) { // We'll issue a warning here if no devices are available but not // throw an error since the user can plugin something later. unsigned int nDevices = midiInGetNumDevs(); if ( nDevices == 0 ) { errorString_ = "RtMidiIn::initialize: no MIDI input devices currently available."; error( RtError::WARNING ); } // Save our api-specific connection information. WinMidiData *data = (WinMidiData *) new WinMidiData; apiData_ = (void *) data; inputData_.apiData = (void *) data; data->message.bytes.clear(); // needs to be empty for first input message } void RtMidiIn :: openPort( unsigned int portNumber ) { if ( connected_ ) { errorString_ = "RtMidiIn::openPort: a valid connection already exists!"; error( RtError::WARNING ); return; } unsigned int nDevices = midiInGetNumDevs(); if (nDevices == 0) { errorString_ = "RtMidiIn::openPort: no MIDI input sources found!"; error( RtError::NO_DEVICES_FOUND ); } std::ostringstream ost; if ( portNumber >= nDevices ) { ost << "RtMidiIn::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiInOpen( &data->inHandle, portNumber, (DWORD)&midiInputCallback, (DWORD)&inputData_, CALLBACK_FUNCTION ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiIn::openPort: error creating Windows MM MIDI input port."; error( RtError::DRIVER_ERROR ); } // Allocate and init the sysex buffer. data->sysexBuffer = (MIDIHDR*) new char[ sizeof(MIDIHDR) ]; data->sysexBuffer->lpData = new char[1024]; data->sysexBuffer->dwBufferLength = 1024; data->sysexBuffer->dwFlags = 0; result = midiInPrepareHeader( data->inHandle, data->sysexBuffer, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port (PrepareHeader)."; error( RtError::DRIVER_ERROR ); } // Register the buffer. result = midiInAddBuffer( data->inHandle, data->sysexBuffer, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port (AddBuffer)."; error( RtError::DRIVER_ERROR ); } result = midiInStart( data->inHandle ); if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error starting Windows MM MIDI input port."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiIn :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "RtMidiIn::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtError::WARNING ); } void RtMidiIn :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); midiInReset( data->inHandle ); midiInStop( data->inHandle ); int result = midiInUnprepareHeader(data->inHandle, data->sysexBuffer, sizeof(MIDIHDR)); delete [] data->sysexBuffer->lpData; delete [] data->sysexBuffer; if ( result != MMSYSERR_NOERROR ) { midiInClose( data->inHandle ); errorString_ = "RtMidiIn::openPort: error closing Windows MM MIDI input port (midiInUnprepareHeader)."; error( RtError::DRIVER_ERROR ); } midiInClose( data->inHandle ); connected_ = false; } } RtMidiIn :: ~RtMidiIn() { // Close a connection if it exists. closePort(); // Cleanup. WinMidiData *data = static_cast (apiData_); delete data; } unsigned int RtMidiIn :: getPortCount() { return midiInGetNumDevs(); } std::string RtMidiIn :: getPortName( unsigned int portNumber ) { unsigned int nDevices = midiInGetNumDevs(); if ( portNumber >= nDevices ) { std::ostringstream ost; ost << "RtMidiIn::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIINCAPS deviceCaps; MMRESULT result = midiInGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIINCAPS)); // For some reason, we need to copy character by character with // UNICODE (thanks to Eduardo Coutinho!). //std::string stringName = std::string( deviceCaps.szPname ); char nameString[MAXPNAMELEN]; for( int i=0; i= nDevices ) { std::ostringstream ost; ost << "RtMidiOut::getPortName: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } MIDIOUTCAPS deviceCaps; MMRESULT result = midiOutGetDevCaps( portNumber, &deviceCaps, sizeof(MIDIOUTCAPS)); // For some reason, we need to copy character by character with // UNICODE (thanks to Eduardo Coutinho!). //std::string stringName = std::string( deviceCaps.szPname ); char nameString[MAXPNAMELEN]; for( int i=0; i= nDevices ) { ost << "RtMidiOut::openPort: the 'portNumber' argument (" << portNumber << ") is invalid."; errorString_ = ost.str(); error( RtError::INVALID_PARAMETER ); } WinMidiData *data = static_cast (apiData_); MMRESULT result = midiOutOpen( &data->outHandle, portNumber, (DWORD)NULL, (DWORD)NULL, CALLBACK_NULL ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiOut::openPort: error creating Windows MM MIDI output port."; error( RtError::DRIVER_ERROR ); } connected_ = true; } void RtMidiOut :: closePort( void ) { if ( connected_ ) { WinMidiData *data = static_cast (apiData_); midiOutReset( data->outHandle ); midiOutClose( data->outHandle ); connected_ = false; } } void RtMidiOut :: openVirtualPort( std::string portName ) { // This function cannot be implemented for the Windows MM MIDI API. errorString_ = "RtMidiOut::openVirtualPort: cannot be implemented in Windows MM MIDI API!"; error( RtError::WARNING ); } RtMidiOut :: ~RtMidiOut() { // Close a connection if it exists. closePort(); // Cleanup. WinMidiData *data = static_cast (apiData_); delete data; } void RtMidiOut :: sendMessage( std::vector *message ) { unsigned int nBytes = message->size(); if ( nBytes == 0 ) { errorString_ = "RtMidiOut::sendMessage: message argument is empty!"; error( RtError::WARNING ); return; } MMRESULT result; WinMidiData *data = static_cast (apiData_); if ( message->at(0) == 0xF0 ) { // Sysex message // Allocate buffer for sysex data. char *buffer = (char *) malloc( nBytes ); if ( buffer == NULL ) { errorString_ = "RtMidiOut::sendMessage: error allocating sysex message memory!"; error( RtError::MEMORY_ERROR ); } // Copy data to buffer. for ( unsigned int i=0; iat(i); // Create and prepare MIDIHDR structure. MIDIHDR sysex; sysex.lpData = (LPSTR) buffer; sysex.dwBufferLength = nBytes; sysex.dwFlags = 0; result = midiOutPrepareHeader( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "RtMidiOut::sendMessage: error preparing sysex header."; error( RtError::DRIVER_ERROR ); } // Send the message. result = midiOutLongMsg( data->outHandle, &sysex, sizeof(MIDIHDR) ); if ( result != MMSYSERR_NOERROR ) { free( buffer ); errorString_ = "RtMidiOut::sendMessage: error sending sysex message."; error( RtError::DRIVER_ERROR ); } // Unprepare the buffer and MIDIHDR. while ( MIDIERR_STILLPLAYING == midiOutUnprepareHeader( data->outHandle, &sysex, sizeof (MIDIHDR) ) ) Sleep( 1 ); free( buffer ); } else { // Channel or system message. // Make sure the message size isn't too big. if ( nBytes > 3 ) { errorString_ = "RtMidiOut::sendMessage: message size is greater than 3 bytes (and not sysex)!"; error( RtError::WARNING ); return; } // Pack MIDI bytes into double word. DWORD packet; unsigned char *ptr = (unsigned char *) &packet; for ( unsigned int i=0; iat(i); ptr++; } // Send the message immediately. result = midiOutShortMsg( data->outHandle, packet ); if ( result != MMSYSERR_NOERROR ) { errorString_ = "RtMidiOut::sendMessage: error sending MIDI message."; error( RtError::DRIVER_ERROR ); } } } #endif // __WINDOWS_MM__ milkytracker-0.90.85+dfsg/src/midi/rtmidi/RtError.h0000644000175000017500000000374610737746457021232 0ustar admin2admin2/************************************************************************/ /*! \class RtError \brief Exception handling class for RtAudio & RtMidi. The RtError class is quite simple but it does allow errors to be "caught" by RtError::Type. See the RtAudio and RtMidi documentation to know which methods can throw an RtError. */ /************************************************************************/ #ifndef RTERROR_H #define RTERROR_H #include #include class RtError { public: //! Defined RtError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ INVALID_STREAM, /*!< An invalid stream ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; protected: std::string message_; Type type_; public: //! The constructor. RtError(const std::string& message, Type type = RtError::UNSPECIFIED) : message_(message), type_(type) {} //! The destructor. virtual ~RtError(void) {}; //! Prints thrown error message to stderr. virtual void printMessage(void) { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) { return message_; } //! Returns the thrown error message as a C string. virtual const char *getMessageString(void) { return message_.c_str(); } }; #endif milkytracker-0.90.85+dfsg/src/Makefile.in0000644000175000017500000003757711317506534017307 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ SUBDIRS = milkyplay ${RTMIDI_DIR} ppui fx compression tracker DIST_SUBDIRS = milkyplay midi ppui fx compression tracker all: all-recursive .SUFFIXES: $(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) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/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): # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done 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: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ 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: ctags-recursive $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive 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-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic ctags \ ctags-recursive distclean distclean-generic 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 \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-recursive 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: milkytracker-0.90.85+dfsg/src/tracker/0000755000175000017500000000000011317506534016652 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/tracker/SamplePlayer.cpp0000644000175000017500000000412611150223367021752 0ustar admin2admin2/* * tracker/SamplePlayer.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SamplePlayer.cpp * MilkyTracker * * Created by Peter Barth on 13.12.07. * */ #include "SamplePlayer.h" #include "ModuleEditor.h" #include "SampleEditor.h" #include "PlayerController.h" void SamplePlayer::playSample(const TXMSample& smp, pp_uint32 note, pp_int32 rangeStart/* = -1*/, pp_int32 rangeEnd/* = -1*/) { playerController.playSample(smp, note, rangeStart, rangeEnd); } void SamplePlayer::playSample(pp_int32 insIndex, pp_int32 smpIndex, pp_uint32 note) { playSample(*moduleEditor.getSampleInfo(insIndex, smpIndex), note); } void SamplePlayer::playSample(pp_int32 insIndex, pp_uint32 note) { const mp_ubyte* nbu = moduleEditor.getSampleTable(insIndex); pp_int32 smpIndex = nbu[note]; playSample(insIndex, smpIndex, note); } void SamplePlayer::playCurrentSample(pp_uint32 note) { playSample(*moduleEditor.getSampleEditor()->getSample(), note); } void SamplePlayer::playCurrentSampleSelectionRange(pp_uint32 note) { SampleEditor* sampleEditor = moduleEditor.getSampleEditor(); if (sampleEditor->getLogicalSelectionStart() != -1 && sampleEditor->getLogicalSelectionStart() != -1) { playSample(*sampleEditor->getSample(), note, sampleEditor->getLogicalSelectionStart(), sampleEditor->getLogicalSelectionEnd()); } } void SamplePlayer::stopSamplePlayback() { playerController.stopSample(); } milkytracker-0.90.85+dfsg/src/tracker/RecorderLogic.h0000755000175000017500000000407711150223367021554 0ustar admin2admin2/* * tracker/PlayerLogic.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * RecorderLogic.h * MilkyTracker * * Created by Peter Barth on 09.04.08. * */ #ifndef __RECORDERLOGIC_H__ #define __RECORDERLOGIC_H__ #include "BasicTypes.h" class PPEvent; class PatternEditorControl; class RecorderLogic { private: class Tracker& tracker; struct TKeyInfo { pp_int32 note, ins; pp_int32 channel, pos, row; class PlayerController* playerController; }; TKeyInfo* keys; pp_int32 keyVolume; bool recordMode; bool recordKeyOff; bool recordNoteDelay; public: RecorderLogic(Tracker& tracker); ~RecorderLogic(); void setKeyVolume(pp_int32 keyVolume) { this->keyVolume = keyVolume; } void setRecordMode(bool recordMode) { this->recordMode = recordMode; } bool getRecordMode() const { return recordMode; } void setRecordKeyOff(bool recordKeyOff) { this->recordKeyOff = recordKeyOff; } bool getRecordKeyOff() const { return recordKeyOff; } void setRecordNoteDelay(bool recordNoteDelay) { this->recordNoteDelay = recordNoteDelay; } bool setRecordNoteDelay() const { return recordNoteDelay; } void reset(); void sendNoteDownToPatternEditor(PPEvent* event, pp_int32 note, PatternEditorControl* patternEditorControl); void sendNoteUpToPatternEditor(PPEvent* event, pp_int32 note, PatternEditorControl* patternEditorControl); void init(); void initToggleEdit(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/SampleEditorControlToolHandler.cpp0000644000175000017500000003315211150223367025442 0ustar admin2admin2/* * tracker/SampleEditorControlToolHandler.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SampleEditorControlToolHandler.cpp * MilkyTracker * * Created by Peter Barth on 20.10.05. * */ #include "SampleEditorControl.h" #include "DialogWithValues.h" #include "DialogResample.h" #include "DialogGroupSelection.h" #include "DialogEQ.h" #include "SimpleVector.h" #include "FilterParameters.h" bool SampleEditorControl::invokeToolParameterDialog(SampleEditorControl::ToolHandlerResponder::SampleToolTypes type) { if (dialog) { delete dialog; dialog = NULL; } toolHandlerResponder->setSampleToolType(type); switch (type) { case ToolHandlerResponder::SampleToolTypeNew: dialog = new DialogWithValues(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "Create new sample"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterOneValue); static_cast(dialog)->setValueOneCaption("Enter size in samples:"); static_cast(dialog)->setValueOneRange(3, 1024*1024*10-1, 0); if (lastValues.newSampleSize != SampleEditorControlLastValues::invalidIntValue()) static_cast(dialog)->setValueOne((float)lastValues.newSampleSize); else static_cast(dialog)->setValueOne(100.0f); break; case ToolHandlerResponder::SampleToolTypeVolume: dialog = new DialogWithValues(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "Boost sample volume"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterOneValue); static_cast(dialog)->setValueOneCaption("Enter new volume in percent:"); static_cast(dialog)->setValueOneRange(-10000.0f, 10000.0f, 2); static_cast(dialog)->setValueOne(lastValues.boostSampleVolume != SampleEditorControlLastValues::invalidFloatValue() ? lastValues.boostSampleVolume : 100.0f); break; case ToolHandlerResponder::SampleToolTypeFade: dialog = new DialogWithValues(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "Fade sample"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues); static_cast(dialog)->setValueOneCaption("Enter start volume in percent:"); static_cast(dialog)->setValueTwoCaption("Enter end volume in percent:"); static_cast(dialog)->setValueOneRange(-10000.0f, 10000.0f, 2); static_cast(dialog)->setValueTwoRange(-10000.0f, 10000.0f, 2); static_cast(dialog)->setValueOne(lastValues.fadeSampleVolumeStart != SampleEditorControlLastValues::invalidFloatValue() ? lastValues.fadeSampleVolumeStart : 100.0f); static_cast(dialog)->setValueTwo(lastValues.fadeSampleVolumeEnd != SampleEditorControlLastValues::invalidFloatValue() ? lastValues.fadeSampleVolumeEnd : 100.0f); break; case ToolHandlerResponder::SampleToolTypeDCOffset: dialog = new DialogWithValues(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "DC offset"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterOneValue); static_cast(dialog)->setValueOneCaption("Enter offset in percent [-100..100]"); static_cast(dialog)->setValueOneRange(-100, 100.0f, 2); static_cast(dialog)->setValueOne(lastValues.DCOffset != SampleEditorControlLastValues::invalidFloatValue() ? lastValues.DCOffset : 0.0f); break; case ToolHandlerResponder::SampleToolTypeResample: dialog = new DialogResample(parentScreen, toolHandlerResponder, PP_DEFAULT_ID); if (sampleEditor->isValidSample()) { if (lastValues.resampleInterpolationType != SampleEditorControlLastValues::invalidIntValue()) static_cast(dialog)->setInterpolationType(lastValues.resampleInterpolationType); static_cast(dialog)->setAdjustFtAndRelnote(lastValues.adjustFtAndRelnote); static_cast(dialog)->setRelNote(sampleEditor->getRelNoteNum()); static_cast(dialog)->setFineTune(sampleEditor->getFinetune()); static_cast(dialog)->setSize(sampleEditor->getSampleLen()); } break; case ToolHandlerResponder::SampleToolTypeEQ3Band: dialog = new DialogEQ(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, DialogEQ::EQ3Bands); if (lastValues.hasEQ3BandValues) { for (pp_int32 i = 0; i < 3; i++) static_cast(dialog)->setBandParam(i, lastValues.EQ3BandValues[i]); } break; case ToolHandlerResponder::SampleToolTypeEQ10Band: dialog = new DialogEQ(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, DialogEQ::EQ10Bands); if (lastValues.hasEQ10BandValues) { for (pp_int32 i = 0; i < 10; i++) static_cast(dialog)->setBandParam(i, lastValues.EQ10BandValues[i]); } break; case ToolHandlerResponder::SampleToolTypeGenerateSilence: dialog = new DialogWithValues(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "Insert silence"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterOneValue); static_cast(dialog)->setValueOneCaption("Enter size in samples:"); static_cast(dialog)->setValueOneRange(3, 1024*1024*10-1, 0); if (lastValues.silenceSize != SampleEditorControlLastValues::invalidIntValue()) static_cast(dialog)->setValueOne((float)lastValues.silenceSize); else static_cast(dialog)->setValueOne(100.0f); break; case ToolHandlerResponder::SampleToolTypeGenerateNoise: { PPSimpleVector noiseFilterTypes; noiseFilterTypes.add(new PPString("White")); noiseFilterTypes.add(new PPString("Pink")); noiseFilterTypes.add(new PPString("Brown")); dialog = new DialogGroupSelection(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "Select noise type"PPSTR_PERIODS, noiseFilterTypes); break; } case ToolHandlerResponder::SampleToolTypeGenerateSine: case ToolHandlerResponder::SampleToolTypeGenerateSquare: case ToolHandlerResponder::SampleToolTypeGenerateTriangle: case ToolHandlerResponder::SampleToolTypeGenerateSawtooth: { dialog = new DialogWithValues(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "Generate waveform"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues); static_cast(dialog)->setValueOneCaption("Volume in percent:"); static_cast(dialog)->setValueTwoCaption("Number of periods:"); static_cast(dialog)->setValueOneRange(-1000.0f, 1000.0f, 2); static_cast(dialog)->setValueTwoRange(0.0f, 1000.0f, 1); static_cast(dialog)->setValueOne(lastValues.waveFormVolume != SampleEditorControlLastValues::invalidFloatValue() ? lastValues.waveFormVolume : 100.0f); static_cast(dialog)->setValueTwo(lastValues.waveFormNumPeriods != SampleEditorControlLastValues::invalidFloatValue() ? lastValues.waveFormNumPeriods : 1.0f); break; } } dialog->show(); return true; } bool SampleEditorControl::invokeTool(ToolHandlerResponder::SampleToolTypes type) { if (!sampleEditor->isValidSample()) return false; switch (type) { case ToolHandlerResponder::SampleToolTypeNew: { FilterParameters par(2); lastValues.newSampleSize = (pp_int32)static_cast(dialog)->getValueOne(); par.setParameter(0, FilterParameters::Parameter(lastValues.newSampleSize)); par.setParameter(1, FilterParameters::Parameter(sampleEditor->is16Bit() ? 16 : 8)); sampleEditor->tool_newSample(&par); break; } case ToolHandlerResponder::SampleToolTypeVolume: { lastValues.boostSampleVolume = static_cast(dialog)->getValueOne(); FilterParameters par(2); par.setParameter(0, FilterParameters::Parameter(lastValues.boostSampleVolume / 100.0f)); par.setParameter(1, FilterParameters::Parameter(lastValues.boostSampleVolume / 100.0f)); sampleEditor->tool_scaleSample(&par); break; } case ToolHandlerResponder::SampleToolTypeFade: { lastValues.fadeSampleVolumeStart = static_cast(dialog)->getValueOne(); lastValues.fadeSampleVolumeEnd = static_cast(dialog)->getValueTwo(); FilterParameters par(2); par.setParameter(0, FilterParameters::Parameter(lastValues.fadeSampleVolumeStart / 100.0f)); par.setParameter(1, FilterParameters::Parameter(lastValues.fadeSampleVolumeEnd / 100.0f)); sampleEditor->tool_scaleSample(&par); break; } case ToolHandlerResponder::SampleToolTypeDCOffset: { FilterParameters par(1); lastValues.DCOffset = static_cast(dialog)->getValueOne(); par.setParameter(0, FilterParameters::Parameter(lastValues.DCOffset / 100.0f)); sampleEditor->tool_DCOffsetSample(&par); break; } case ToolHandlerResponder::SampleToolTypeResample: { lastValues.resampleInterpolationType = static_cast(dialog)->getInterpolationType(); lastValues.adjustFtAndRelnote = static_cast(dialog)->getAdjustFtAndRelnote(); FilterParameters par(3); par.setParameter(0, FilterParameters::Parameter(static_cast(dialog)->getC4Speed())); par.setParameter(1, FilterParameters::Parameter(static_cast(lastValues.resampleInterpolationType))); par.setParameter(2, FilterParameters::Parameter(lastValues.adjustFtAndRelnote ? 1 : 0)); sampleEditor->tool_resampleSample(&par); break; } case ToolHandlerResponder::SampleToolTypeEQ3Band: case ToolHandlerResponder::SampleToolTypeEQ10Band: { pp_uint32 numBands = static_cast(dialog)->getNumBandsAsInt(); float* last = NULL; if (numBands == 3) { lastValues.hasEQ3BandValues = true; last = lastValues.EQ3BandValues; } else { lastValues.hasEQ10BandValues = true; last = lastValues.EQ10BandValues; } FilterParameters par(numBands); for (pp_uint32 i = 0; i < numBands; i++) { float val = static_cast(dialog)->getBandParam(i); if (last) last[i] = val; par.setParameter(i, FilterParameters::Parameter(val)); } sampleEditor->tool_eqSample(&par); break; } case ToolHandlerResponder::SampleToolTypeGenerateSilence: { FilterParameters par(1); par.setParameter(0, FilterParameters::Parameter((pp_int32)(static_cast(dialog)->getValueOne()))); sampleEditor->tool_generateSilence(&par); break; } case ToolHandlerResponder::SampleToolTypeGenerateNoise: { FilterParameters par(1); par.setParameter(0, FilterParameters::Parameter((pp_int32)(static_cast(dialog)->getSelection()))); sampleEditor->tool_generateNoise(&par); break; } case ToolHandlerResponder::SampleToolTypeGenerateSine: { lastValues.waveFormVolume = static_cast(dialog)->getValueOne(); lastValues.waveFormNumPeriods = static_cast(dialog)->getValueTwo(); FilterParameters par(2); par.setParameter(0, FilterParameters::Parameter(lastValues.waveFormVolume/100.0f)); par.setParameter(1, FilterParameters::Parameter(lastValues.waveFormNumPeriods)); sampleEditor->tool_generateSine(&par); break; } case ToolHandlerResponder::SampleToolTypeGenerateSquare: { lastValues.waveFormVolume = static_cast(dialog)->getValueOne(); lastValues.waveFormNumPeriods = static_cast(dialog)->getValueTwo(); FilterParameters par(2); par.setParameter(0, FilterParameters::Parameter(lastValues.waveFormVolume/100.0f)); par.setParameter(1, FilterParameters::Parameter(lastValues.waveFormNumPeriods)); sampleEditor->tool_generateSquare(&par); break; } case ToolHandlerResponder::SampleToolTypeGenerateTriangle: { lastValues.waveFormVolume = static_cast(dialog)->getValueOne(); lastValues.waveFormNumPeriods = static_cast(dialog)->getValueTwo(); FilterParameters par(2); par.setParameter(0, FilterParameters::Parameter(lastValues.waveFormVolume/100.0f)); par.setParameter(1, FilterParameters::Parameter(lastValues.waveFormNumPeriods)); sampleEditor->tool_generateTriangle(&par); break; } case ToolHandlerResponder::SampleToolTypeGenerateSawtooth: { lastValues.waveFormVolume = static_cast(dialog)->getValueOne(); lastValues.waveFormNumPeriods = static_cast(dialog)->getValueTwo(); FilterParameters par(2); par.setParameter(0, FilterParameters::Parameter(lastValues.waveFormVolume/100.0f)); par.setParameter(1, FilterParameters::Parameter(lastValues.waveFormNumPeriods)); sampleEditor->tool_generateSawtooth(&par); break; } } return true; } SampleEditorControl::ToolHandlerResponder::ToolHandlerResponder(SampleEditorControl& theSampleEditorControl) : sampleEditorControl(theSampleEditorControl), sampleToolType(SampleToolTypeNone) { } pp_int32 SampleEditorControl::ToolHandlerResponder::ActionOkay(PPObject* sender) { sampleEditorControl.invokeTool(sampleToolType); return 0; } pp_int32 SampleEditorControl::ToolHandlerResponder::ActionCancel(PPObject* sender) { return 0; } milkytracker-0.90.85+dfsg/src/tracker/LogoBig.cpp0000644000175000017500001605177511150223367020721 0ustar admin2admin2/* * tracker/LogoBig.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "LogoBig.h" const pp_uint32 LogoBig::width = 540; const pp_uint32 LogoBig::height = 450; const pp_uint8 LogoBig::rawData[] = { 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,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,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,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,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,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,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,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,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,0x07,0x06,0x09, 0x5e,0x63,0x7f,0x6c,0x77,0x9b,0x60,0x68,0x85,0x5d,0x65,0x82,0x49,0x4e,0x66,0x41, 0x47,0x5f,0x33,0x37,0x4a,0x2c,0x2e,0x3f,0x24,0x26,0x34,0x19,0x19,0x22,0x16,0x16, 0x1d,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,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,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,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,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,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,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,0x0f,0x0e, 0x11,0x66,0x6c,0x88,0x6a,0x75,0x9a,0x63,0x6f,0x95,0x53,0x5c,0x7c,0x3c,0x3d,0x52, 0x41,0x46,0x60,0x48,0x50,0x72,0x51,0x5b,0x83,0x52,0x5a,0x84,0x52,0x5b,0x85,0x52, 0x5d,0x88,0x55,0x60,0x8a,0x56,0x62,0x8b,0x5a,0x65,0x8d,0x52,0x5a,0x7c,0x54,0x5c, 0x7b,0x4f,0x54,0x6e,0x4d,0x51,0x68,0x49,0x4c,0x60,0x41,0x42,0x50,0x3e,0x3f,0x4c, 0x29,0x28,0x30,0x2c,0x2b,0x33,0x03,0x03,0x03,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,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,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,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,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,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,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,0x1f, 0x1e,0x20,0x8b,0x90,0xa8,0x7a,0x85,0xa5,0x67,0x74,0x99,0x4b,0x4d,0x67,0x2b,0x1f, 0x25,0x25,0x1a,0x1f,0x24,0x1a,0x1f,0x22,0x18,0x1c,0x1e,0x15,0x18,0x23,0x1b,0x23, 0x29,0x22,0x30,0x31,0x2c,0x3f,0x3b,0x39,0x53,0x45,0x47,0x69,0x4d,0x57,0x7f,0x54, 0x5f,0x89,0x57,0x63,0x8c,0x5b,0x67,0x8e,0x60,0x6d,0x93,0x69,0x74,0x99,0x6f,0x7b, 0x9f,0x76,0x82,0xa3,0x7d,0x89,0xa8,0x85,0x90,0xad,0x90,0x9a,0xb5,0x94,0x9d,0xb8, 0x8e,0x94,0xab,0x90,0x93,0xa9,0x8b,0x8d,0xa0,0x7a,0x7b,0x8d,0x69,0x69,0x7e,0x4a, 0x4a,0x5c,0x48,0x48,0x5b,0x2a,0x2a,0x34,0x27,0x26,0x30,0x0c,0x0c,0x0f,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,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,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,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,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,0x02,0x02,0x02,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,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, 0x31,0x2f,0x32,0xbb,0xbe,0xca,0x98,0xa1,0xbb,0x7a,0x85,0xa5,0x44,0x3e,0x4f,0x3d, 0x2e,0x39,0x38,0x2a,0x33,0x31,0x24,0x2b,0x2e,0x22,0x28,0x2b,0x1f,0x26,0x2c,0x20, 0x26,0x28,0x1d,0x22,0x28,0x1d,0x23,0x28,0x1c,0x22,0x24,0x1a,0x1f,0x23,0x19,0x1d, 0x24,0x19,0x1e,0x25,0x1b,0x22,0x2b,0x26,0x32,0x36,0x35,0x48,0x41,0x44,0x5d,0x4c, 0x51,0x6f,0x5a,0x63,0x84,0x67,0x74,0x99,0x6e,0x7a,0x9d,0x73,0x7e,0xa1,0x79,0x84, 0xa5,0x81,0x8b,0xaa,0x83,0x8d,0xac,0x85,0x90,0xaf,0x89,0x93,0xb0,0x82,0x8c,0xab, 0x75,0x81,0xa3,0x6d,0x79,0x9c,0x6a,0x76,0x9a,0x69,0x75,0x9a,0x69,0x74,0x99,0x65, 0x71,0x96,0x50,0x55,0x79,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,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,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,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,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,0x49,0x4d,0x56,0x82,0x8d,0xa9,0x28,0x2d,0x3b,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,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,0x45,0x43,0x46,0xd1,0xd4,0xdd,0xb5,0xbb,0xce,0x72,0x75,0x8c,0x3c,0x2f,0x38, 0x40,0x31,0x3c,0x45,0x35,0x41,0x3e,0x2f,0x39,0x33,0x25,0x2d,0x2f,0x22,0x29,0x30, 0x23,0x2a,0x2f,0x23,0x2a,0x2f,0x22,0x29,0x30,0x23,0x2b,0x32,0x25,0x2c,0x30,0x23, 0x2b,0x31,0x24,0x2c,0x33,0x25,0x2d,0x32,0x25,0x2d,0x34,0x26,0x2e,0x34,0x27,0x2f, 0x36,0x28,0x30,0x36,0x28,0x31,0x38,0x29,0x32,0x38,0x2a,0x33,0x41,0x38,0x46,0x48, 0x43,0x57,0x51,0x50,0x66,0x5c,0x5f,0x79,0x64,0x6b,0x89,0x6e,0x7a,0x9d,0x6f,0x7b, 0x9f,0x6b,0x76,0x9b,0x66,0x72,0x98,0x63,0x6f,0x95,0x5f,0x6c,0x93,0x5f,0x6b,0x92, 0x5c,0x69,0x90,0x53,0x5e,0x89,0x52,0x4f,0x7a,0x31,0x2b,0x3e,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,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,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,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,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,0x61,0x5b,0x68,0xa2,0xaa,0xc1,0x71,0x7d,0xa0,0x5b,0x67,0x8e, 0x15,0x18,0x20,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,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,0x61,0x5e,0x61,0xdd,0xde,0xe6,0xc2,0xc7,0xd7,0x4d,0x45,0x51,0x3c,0x2d, 0x37,0x42,0x33,0x3e,0x43,0x33,0x3e,0x46,0x36,0x42,0x3d,0x2e,0x39,0x32,0x25,0x2c, 0x30,0x23,0x2a,0x2f,0x23,0x2a,0x2e,0x22,0x29,0x2f,0x22,0x29,0x2f,0x22,0x29,0x31, 0x24,0x2b,0x31,0x24,0x2b,0x34,0x26,0x2e,0x35,0x27,0x30,0x38,0x29,0x33,0x3a,0x2c, 0x35,0x3c,0x2e,0x37,0x3f,0x30,0x3b,0x41,0x31,0x3c,0x47,0x37,0x43,0x48,0x38,0x45, 0x4c,0x3b,0x49,0x4d,0x3c,0x4a,0x50,0x3f,0x4d,0x50,0x3f,0x4d,0x52,0x40,0x4f,0x52, 0x40,0x4f,0x51,0x43,0x55,0x51,0x48,0x5e,0x51,0x4d,0x66,0x53,0x54,0x71,0x56,0x5b, 0x7d,0x57,0x60,0x86,0x53,0x5e,0x88,0x54,0x50,0x79,0x5a,0x52,0x79,0x61,0x50,0x6f, 0x08,0x07,0x0a,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,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,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,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,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,0xa7,0xa7,0xb8,0x88,0x92,0xb0,0x56,0x63, 0x8b,0x56,0x63,0x8b,0x51,0x5b,0x7f,0x08,0x09,0x0c,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,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,0x7a,0x76,0x79,0xeb,0xed,0xf1,0xa2,0xa2,0xad,0x35,0x29,0x32,0x3c, 0x2d,0x37,0x40,0x30,0x3b,0x43,0x33,0x3e,0x42,0x33,0x3e,0x44,0x34,0x40,0x3e,0x2f, 0x39,0x31,0x24,0x2c,0x30,0x23,0x2a,0x30,0x23,0x2b,0x2e,0x22,0x28,0x2f,0x22,0x29, 0x2f,0x22,0x29,0x2f,0x22,0x29,0x31,0x24,0x2c,0x34,0x27,0x2f,0x34,0x27,0x2f,0x34, 0x27,0x2f,0x36,0x29,0x31,0x35,0x28,0x31,0x3f,0x30,0x3b,0x41,0x31,0x3c,0x47,0x37, 0x43,0x4c,0x3b,0x48,0x51,0x3f,0x4e,0x56,0x43,0x53,0x5a,0x47,0x58,0x5f,0x4c,0x5e, 0x63,0x4f,0x62,0x65,0x51,0x65,0x62,0x4f,0x62,0x5f,0x4b,0x5e,0x5c,0x49,0x5a,0x57, 0x44,0x55,0x50,0x3e,0x4d,0x2c,0x20,0x26,0x56,0x4f,0x78,0x5c,0x52,0x79,0x5a,0x52, 0x79,0x64,0x53,0x73,0x49,0x3b,0x51,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,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,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,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,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,0x14,0x10,0x14,0xb1,0xb7,0xca,0x65, 0x72,0x98,0x64,0x53,0x76,0x55,0x60,0x8a,0x55,0x60,0x8a,0x46,0x50,0x6d,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,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,0x92,0x8f,0x92,0xee,0xef,0xf4,0x5c,0x56,0x5d,0x31,0x24,0x2b, 0x3a,0x2c,0x35,0x3f,0x30,0x3b,0x42,0x33,0x3e,0x41,0x31,0x3c,0x44,0x34,0x3f,0x44, 0x34,0x3f,0x3e,0x2f,0x3a,0x32,0x25,0x2c,0x31,0x24,0x2c,0x30,0x23,0x2a,0x31,0x24, 0x2b,0x31,0x24,0x2b,0x32,0x25,0x2c,0x30,0x23,0x2a,0x32,0x25,0x2c,0x34,0x27,0x2f, 0x35,0x27,0x30,0x2c,0x21,0x28,0x36,0x29,0x32,0x2b,0x21,0x27,0x3e,0x2f,0x39,0x39, 0x2b,0x35,0x45,0x36,0x41,0x4b,0x3a,0x47,0x51,0x40,0x4f,0x55,0x43,0x53,0x5b,0x48, 0x59,0x61,0x4d,0x60,0x62,0x4e,0x61,0x67,0x53,0x68,0x69,0x54,0x69,0x68,0x54,0x68, 0x67,0x53,0x67,0x61,0x4d,0x60,0x5c,0x49,0x5b,0x2d,0x21,0x28,0x5c,0x4d,0x6e,0x64, 0x53,0x75,0x5b,0x52,0x79,0x63,0x53,0x77,0x64,0x4f,0x6d,0x16,0x13,0x1b,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,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,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,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,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,0x2c,0x26,0x30, 0xa2,0xa1,0xb3,0x67,0x73,0x98,0x54,0x50,0x79,0x60,0x6d,0x94,0x53,0x5e,0x89,0x55, 0x60,0x8a,0x26,0x2a,0x3a,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,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,0x06,0x06,0x06,0x96,0x95,0x9b,0xe9,0xeb,0xf0,0x3a,0x30,0x37,0x34,0x27, 0x2f,0x3b,0x2c,0x36,0x41,0x31,0x3c,0x42,0x32,0x3e,0x41,0x32,0x3d,0x44,0x34,0x40, 0x43,0x33,0x3e,0x47,0x36,0x43,0x41,0x31,0x3c,0x34,0x26,0x2e,0x33,0x26,0x2e,0x33, 0x26,0x2e,0x31,0x24,0x2b,0x31,0x24,0x2c,0x31,0x24,0x2c,0x32,0x24,0x2c,0x33,0x26, 0x2e,0x34,0x26,0x2e,0x34,0x27,0x2e,0x21,0x18,0x1e,0x35,0x28,0x2f,0x27,0x1d,0x25, 0x3e,0x2e,0x3a,0x2c,0x21,0x28,0x42,0x33,0x3e,0x4b,0x3a,0x47,0x51,0x3f,0x4e,0x54, 0x42,0x51,0x5a,0x47,0x58,0x5f,0x4c,0x5e,0x65,0x51,0x65,0x66,0x52,0x66,0x67,0x53, 0x67,0x68,0x54,0x68,0x66,0x52,0x66,0x62,0x4e,0x62,0x59,0x47,0x57,0x2c,0x20,0x27, 0x50,0x42,0x5d,0x64,0x4e,0x6c,0x60,0x53,0x77,0x5e,0x53,0x79,0x64,0x4e,0x6c,0x52, 0x48,0x67,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,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,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,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,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,0x40,0x39,0x4a,0x84,0x77,0x88,0x86,0x91,0xaf,0x52,0x57,0x82,0x5c,0x69,0x90, 0x60,0x6c,0x93,0x52,0x5c,0x86,0x52,0x5e,0x83,0x0b,0x0c,0x10,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,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,0x0c,0x0b,0x0d,0xa6,0xa7,0xaf,0xa5,0xa3,0xa9,0x2f,0x23,0x2a,0x38, 0x2a,0x33,0x40,0x30,0x3b,0x41,0x31,0x3c,0x40,0x31,0x3c,0x41,0x32,0x3d,0x43,0x33, 0x3e,0x44,0x34,0x40,0x44,0x34,0x40,0x48,0x37,0x44,0x3e,0x2f,0x3a,0x37,0x29,0x32, 0x35,0x27,0x30,0x36,0x28,0x30,0x35,0x27,0x2f,0x32,0x24,0x2c,0x34,0x27,0x2f,0x35, 0x28,0x30,0x36,0x28,0x30,0x35,0x27,0x2f,0x34,0x27,0x2e,0x24,0x1b,0x21,0x3b,0x2c, 0x36,0x29,0x1f,0x26,0x40,0x30,0x3c,0x29,0x20,0x26,0x41,0x32,0x3d,0x49,0x38,0x45, 0x50,0x3e,0x4d,0x54,0x42,0x51,0x5b,0x48,0x59,0x60,0x4c,0x5f,0x64,0x50,0x64,0x68, 0x53,0x68,0x68,0x54,0x68,0x66,0x52,0x66,0x65,0x51,0x65,0x62,0x4e,0x62,0x56,0x43, 0x53,0x2d,0x21,0x27,0x42,0x36,0x4b,0x63,0x4b,0x67,0x64,0x53,0x76,0x5e,0x53,0x79, 0x64,0x53,0x73,0x64,0x53,0x76,0x29,0x26,0x36,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,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,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,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,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,0x53,0x48,0x5c,0x5f,0x4d,0x5f,0x9a,0xa0,0xb7,0x56,0x62, 0x8b,0x53,0x5e,0x89,0x66,0x73,0x98,0x57,0x64,0x8c,0x55,0x60,0x8a,0x44,0x4d,0x66, 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,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,0x18,0x18,0x19,0xb5,0xb7,0xbf,0x65,0x60,0x68,0x33,0x26,0x2e, 0x3c,0x2d,0x37,0x40,0x31,0x3c,0x41,0x32,0x3d,0x43,0x33,0x3e,0x41,0x32,0x3d,0x43, 0x33,0x3e,0x43,0x33,0x3f,0x45,0x35,0x41,0x40,0x30,0x3c,0x3a,0x2c,0x37,0x39,0x2c, 0x36,0x2f,0x23,0x2b,0x33,0x26,0x2f,0x37,0x29,0x32,0x37,0x29,0x32,0x36,0x29,0x31, 0x37,0x29,0x32,0x36,0x28,0x30,0x36,0x28,0x30,0x35,0x28,0x31,0x2f,0x23,0x2b,0x2a, 0x1f,0x25,0x3e,0x2e,0x38,0x2d,0x22,0x2a,0x3f,0x2f,0x3a,0x30,0x25,0x2d,0x3b,0x2e, 0x38,0x4a,0x39,0x47,0x51,0x3f,0x4e,0x56,0x43,0x53,0x5c,0x49,0x5b,0x61,0x4d,0x60, 0x64,0x50,0x64,0x66,0x52,0x66,0x69,0x54,0x69,0x68,0x53,0x68,0x64,0x50,0x64,0x62, 0x4e,0x61,0x50,0x3e,0x4d,0x2c,0x20,0x26,0x39,0x2e,0x40,0x62,0x4a,0x66,0x64,0x53, 0x75,0x60,0x53,0x77,0x64,0x53,0x76,0x64,0x50,0x71,0x57,0x4d,0x6e,0x02,0x02,0x02, 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,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, 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,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, 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,0x66,0x54,0x6a,0x5e,0x4b,0x5d,0x9d, 0x99,0xa8,0x60,0x6c,0x93,0x52,0x5d,0x86,0x67,0x73,0x99,0x64,0x71,0x96,0x53,0x5f, 0x89,0x5a,0x65,0x8e,0x21,0x24,0x2f,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,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x23,0x22,0x24,0xce,0xd2,0xda,0x48,0x3f,0x46,0x38,0x2a, 0x33,0x3f,0x2f,0x3a,0x43,0x33,0x3e,0x41,0x31,0x3c,0x43,0x33,0x3f,0x43,0x33,0x3e, 0x43,0x33,0x3e,0x42,0x32,0x3d,0x3d,0x2f,0x3a,0x3a,0x2d,0x38,0x3e,0x31,0x3b,0x45, 0x36,0x44,0x2a,0x21,0x29,0x28,0x1f,0x27,0x33,0x27,0x2f,0x2d,0x22,0x29,0x30,0x24, 0x2c,0x36,0x29,0x32,0x39,0x2b,0x34,0x3a,0x2c,0x35,0x3a,0x2c,0x35,0x38,0x29,0x33, 0x2b,0x20,0x27,0x36,0x29,0x32,0x3e,0x2e,0x39,0x36,0x29,0x32,0x3f,0x30,0x3c,0x3e, 0x30,0x3b,0x33,0x28,0x31,0x47,0x36,0x44,0x52,0x40,0x4f,0x55,0x42,0x52,0x5d,0x4a, 0x5c,0x60,0x4d,0x5f,0x65,0x51,0x65,0x68,0x53,0x68,0x69,0x54,0x69,0x66,0x51,0x65, 0x66,0x52,0x66,0x62,0x4e,0x61,0x4c,0x3b,0x48,0x2c,0x20,0x26,0x31,0x27,0x33,0x63, 0x4c,0x69,0x64,0x4f,0x6d,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x50,0x6f,0x64,0x52, 0x72,0x36,0x36,0x4a,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,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,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,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,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,0x03,0x03,0x04,0x73,0x5e,0x76, 0x60,0x4c,0x5f,0x80,0x76,0x84,0x83,0x8d,0xac,0x53,0x5e,0x88,0x69,0x74,0x99,0x6c, 0x77,0x9b,0x5a,0x65,0x8d,0x52,0x5d,0x86,0x55,0x5e,0x80,0x03,0x03,0x04,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x34,0x37,0xc4,0xc7,0xcf,0x35,0x28,0x30,0x3e, 0x2f,0x39,0x42,0x33,0x3e,0x43,0x33,0x3e,0x42,0x33,0x3e,0x42,0x32,0x3d,0x43,0x33, 0x3e,0x43,0x33,0x3f,0x3d,0x2f,0x39,0x3c,0x2e,0x39,0x3f,0x32,0x3d,0x3b,0x30,0x3a, 0x27,0x20,0x27,0x0b,0x09,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x09,0x0b,0x2c, 0x22,0x2a,0x30,0x25,0x2d,0x2c,0x21,0x29,0x2c,0x21,0x28,0x33,0x26,0x2e,0x3a,0x2c, 0x36,0x39,0x2b,0x34,0x37,0x2a,0x33,0x3d,0x2e,0x38,0x40,0x30,0x3b,0x43,0x32,0x3e, 0x41,0x31,0x3d,0x46,0x36,0x42,0x40,0x32,0x3d,0x43,0x34,0x40,0x50,0x3f,0x4d,0x57, 0x44,0x55,0x5f,0x4c,0x5e,0x62,0x4f,0x62,0x66,0x52,0x66,0x6a,0x55,0x6a,0x6b,0x56, 0x6c,0x69,0x54,0x69,0x67,0x53,0x67,0x63,0x4f,0x63,0x46,0x35,0x42,0x2f,0x22,0x29, 0x2b,0x21,0x2a,0x64,0x4e,0x6d,0x62,0x4b,0x66,0x62,0x53,0x77,0x60,0x53,0x77,0x64, 0x53,0x76,0x62,0x4a,0x66,0x52,0x4e,0x77,0x0c,0x0c,0x10,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,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,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,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,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,0x0e,0x0f, 0x14,0x70,0x5b,0x72,0x61,0x4d,0x60,0x61,0x50,0x60,0xb4,0xba,0xcd,0x52,0x5c,0x86, 0x5d,0x69,0x91,0x71,0x7c,0xa0,0x67,0x73,0x99,0x52,0x5d,0x86,0x58,0x65,0x8d,0x30, 0x35,0x43,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,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x45,0x49,0xb4,0xb5,0xbd,0x37,0x29,0x31, 0x43,0x33,0x3e,0x43,0x33,0x3f,0x42,0x33,0x3e,0x42,0x32,0x3e,0x42,0x32,0x3d,0x42, 0x33,0x3d,0x3e,0x30,0x3c,0x3f,0x31,0x3d,0x46,0x37,0x45,0x31,0x28,0x32,0x13,0x10, 0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x0e,0x11,0x2e,0x24,0x2d,0x32,0x27,0x30,0x2b, 0x21,0x28,0x2b,0x20,0x28,0x31,0x26,0x2e,0x38,0x2b,0x34,0x3f,0x31,0x3a,0x40,0x31, 0x3c,0x42,0x32,0x3e,0x43,0x33,0x3f,0x47,0x37,0x43,0x49,0x39,0x45,0x4c,0x3b,0x49, 0x51,0x3f,0x4e,0x59,0x46,0x57,0x60,0x4c,0x5f,0x63,0x4f,0x62,0x68,0x54,0x68,0x6b, 0x57,0x6c,0x68,0x54,0x69,0x68,0x53,0x68,0x68,0x54,0x69,0x66,0x51,0x65,0x41,0x31, 0x3c,0x31,0x24,0x2b,0x25,0x1a,0x1f,0x62,0x52,0x73,0x5e,0x46,0x62,0x64,0x53,0x76, 0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x52,0x72,0x62,0x4a,0x65,0x46,0x49,0x65,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,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,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,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,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,0x1b,0x1e,0x27,0x6d,0x58,0x6e,0x62,0x4e,0x62,0x5d,0x49,0x5b,0xb8,0xb7, 0xc1,0x56,0x62,0x8b,0x54,0x5f,0x89,0x71,0x7c,0xa0,0x6d,0x79,0x9c,0x5e,0x6a,0x92, 0x52,0x57,0x83,0x5b,0x65,0x8a,0x08,0x09,0x0b,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x5b,0x5f,0xb0,0xb1,0xb9,0x3a,0x2b, 0x35,0x45,0x35,0x41,0x46,0x36,0x42,0x44,0x34,0x3f,0x44,0x34,0x40,0x45,0x34,0x41, 0x41,0x32,0x3e,0x41,0x34,0x40,0x45,0x37,0x45,0x2b,0x23,0x2b,0x08,0x07,0x08,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, 0x15,0x11,0x15,0x2f,0x26,0x2e,0x32,0x27,0x30,0x2e,0x23,0x2b,0x2d,0x23,0x2a,0x2d, 0x22,0x2a,0x36,0x29,0x32,0x41,0x33,0x3e,0x48,0x38,0x45,0x49,0x39,0x46,0x4c,0x3b, 0x49,0x54,0x42,0x51,0x57,0x44,0x54,0x5a,0x47,0x58,0x5f,0x4c,0x5e,0x65,0x51,0x65, 0x67,0x53,0x67,0x6c,0x57,0x6d,0x6b,0x57,0x6c,0x6c,0x58,0x6e,0x6a,0x55,0x6a,0x64, 0x50,0x64,0x3a,0x2b,0x35,0x2f,0x23,0x2a,0x28,0x1d,0x22,0x58,0x4a,0x69,0x5f,0x47, 0x63,0x64,0x52,0x73,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x4a,0x66, 0x64,0x53,0x76,0x21,0x20,0x2a,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,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,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,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,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,0x28,0x2c,0x3b,0x6b,0x56,0x6b,0x62,0x4e,0x62,0x60, 0x4c,0x5f,0x98,0x90,0x9a,0x69,0x75,0x9a,0x52,0x53,0x7d,0x6c,0x79,0x9c,0x71,0x7c, 0xa0,0x6a,0x75,0x9a,0x54,0x60,0x8a,0x57,0x63,0x8c,0x3c,0x42,0x55,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,0x00,0x00,0x00,0x00,0x72,0x70,0x76,0xb6,0xb6,0xbf,0x3d, 0x2f,0x39,0x48,0x37,0x44,0x48,0x37,0x44,0x49,0x38,0x45,0x48,0x38,0x46,0x46,0x38, 0x45,0x49,0x3a,0x48,0x41,0x35,0x42,0x1f,0x1a,0x20,0x02,0x02,0x02,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,0x18,0x13,0x18,0x37,0x2c,0x37, 0x37,0x2b,0x36,0x2f,0x24,0x2c,0x2f,0x24,0x2c,0x2f,0x25,0x2d,0x37,0x2a,0x34,0x41, 0x33,0x3f,0x4f,0x3e,0x4c,0x54,0x41,0x51,0x5b,0x48,0x59,0x5d,0x4a,0x5c,0x63,0x4f, 0x63,0x68,0x53,0x68,0x6b,0x56,0x6c,0x6b,0x56,0x6c,0x6c,0x57,0x6d,0x6a,0x55,0x6a, 0x69,0x55,0x6a,0x67,0x52,0x67,0x35,0x27,0x30,0x32,0x25,0x2c,0x27,0x1c,0x21,0x4f, 0x41,0x5c,0x62,0x4a,0x66,0x64,0x4e,0x6c,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x64,0x53,0x76,0x5e,0x46,0x62,0x50,0x56,0x79,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,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,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,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,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,0x36,0x37,0x4b,0x66,0x52,0x66, 0x62,0x4e,0x62,0x61,0x4d,0x60,0x72,0x63,0x72,0x92,0x9c,0xb7,0x52,0x50,0x7b,0x65, 0x72,0x98,0x74,0x80,0xa1,0x6e,0x7a,0x9d,0x62,0x6d,0x94,0x53,0x5e,0x88,0x60,0x6b, 0x90,0x10,0x11,0x14,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,0x03,0x03,0x03,0x81,0x81,0x8b,0xba,0xbf,0xcf, 0x44,0x35,0x42,0x4a,0x39,0x46,0x4f,0x3d,0x4b,0x4d,0x3c,0x4b,0x49,0x3a,0x48,0x48, 0x3a,0x48,0x38,0x2d,0x38,0x15,0x11,0x16,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,0x1a,0x16,0x1b,0x38,0x2c,0x38,0x38,0x2c,0x37,0x33,0x28,0x31, 0x32,0x27,0x30,0x32,0x27,0x30,0x37,0x2b,0x36,0x45,0x35,0x42,0x53,0x42,0x52,0x61, 0x4d,0x60,0x66,0x51,0x66,0x69,0x55,0x6a,0x6b,0x56,0x6c,0x6e,0x59,0x6f,0x6c,0x58, 0x6e,0x6f,0x5a,0x70,0x6a,0x55,0x6b,0x61,0x4e,0x60,0x36,0x28,0x30,0x31,0x24,0x2b, 0x27,0x1c,0x21,0x44,0x39,0x50,0x64,0x4e,0x6c,0x62,0x4a,0x66,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x4a,0x66,0x64,0x52,0x73,0x3a,0x39, 0x4a,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,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,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,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,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,0x42,0x41, 0x58,0x65,0x51,0x65,0x62,0x4e,0x62,0x62,0x4e,0x62,0x5e,0x4b,0x5d,0xac,0xb2,0xc4, 0x52,0x55,0x80,0x62,0x6d,0x94,0x75,0x81,0xa2,0x72,0x7d,0xa0,0x6b,0x76,0x9b,0x56, 0x62,0x8b,0x5b,0x66,0x8e,0x48,0x4e,0x62,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,0x04,0x04,0x05,0x4e,0x53,0x6e,0x64,0x6f, 0x95,0x49,0x39,0x48,0x4c,0x3b,0x49,0x4d,0x3c,0x4a,0x47,0x39,0x46,0x44,0x36,0x44, 0x2d,0x25,0x2e,0x0c,0x0a,0x0c,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,0x1c,0x18, 0x1f,0x3b,0x30,0x3c,0x3c,0x30,0x3b,0x37,0x2b,0x35,0x35,0x29,0x33,0x38,0x2c,0x37, 0x3b,0x30,0x3b,0x43,0x35,0x42,0x56,0x45,0x56,0x6a,0x55,0x6b,0x6d,0x58,0x6f,0x6e, 0x59,0x70,0x6f,0x5a,0x70,0x6c,0x58,0x6d,0x6b,0x56,0x6c,0x5b,0x48,0x5a,0x37,0x29, 0x32,0x31,0x24,0x2b,0x29,0x1e,0x23,0x3d,0x31,0x44,0x64,0x53,0x73,0x5e,0x46,0x62, 0x62,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x76,0x5e, 0x46,0x62,0x52,0x50,0x78,0x04,0x04,0x05,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, 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,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, 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,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,0x53,0x4f,0x6a,0x64,0x50,0x63,0x62,0x4e,0x62,0x62,0x4e,0x62,0x60,0x4c, 0x5f,0xa1,0x9f,0xac,0x53,0x5e,0x89,0x5c,0x69,0x90,0x72,0x7d,0xa0,0x75,0x81,0xa2, 0x6e,0x7a,0x9d,0x62,0x6d,0x94,0x55,0x62,0x8b,0x63,0x6e,0x92,0x12,0x13,0x15,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,0x05,0x04,0x04,0x42,0x44,0x5d,0x5c, 0x69,0x90,0x3c,0x32,0x3f,0x43,0x33,0x3f,0x4a,0x39,0x47,0x3a,0x2e,0x39,0x1f,0x19, 0x1f,0x05,0x04,0x05,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,0x1b,0x18,0x20,0x3f,0x34,0x40,0x42,0x35, 0x42,0x3d,0x30,0x3c,0x3c,0x30,0x3c,0x3e,0x31,0x3e,0x40,0x34,0x41,0x43,0x36,0x44, 0x53,0x43,0x53,0x65,0x53,0x67,0x6e,0x5a,0x70,0x6e,0x5a,0x70,0x6b,0x56,0x6b,0x55, 0x42,0x52,0x36,0x28,0x31,0x2f,0x22,0x29,0x2a,0x1e,0x24,0x34,0x29,0x36,0x64,0x53, 0x76,0x5e,0x46,0x62,0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x63,0x4b,0x67,0x64,0x4d,0x6b,0x42,0x43,0x5a,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,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,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,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,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,0x69,0x5e,0x7a,0x62,0x4f,0x62,0x62,0x4e,0x62,0x62, 0x4e,0x62,0x61,0x4d,0x60,0x8b,0x82,0x8f,0x6f,0x7b,0x9f,0x54,0x5f,0x89,0x6c,0x77, 0x9c,0x76,0x82,0xa3,0x71,0x7c,0x9f,0x6e,0x7a,0x9d,0x56,0x62,0x8b,0x5d,0x69,0x91, 0x4a,0x50,0x61,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,0x22,0x19,0x1f, 0x4a,0x4f,0x6d,0x41,0x42,0x59,0x2b,0x1f,0x25,0x2c,0x20,0x26,0x2b,0x1f,0x26,0x0c, 0x09,0x0b,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,0x1a,0x1a,0x23,0x42,0x3a,0x4a,0x47,0x39,0x48,0x42,0x36,0x43,0x41,0x34, 0x41,0x42,0x36,0x44,0x44,0x37,0x45,0x44,0x38,0x46,0x4b,0x3e,0x4d,0x5a,0x49,0x5b, 0x67,0x53,0x68,0x50,0x3e,0x4d,0x34,0x26,0x2e,0x31,0x24,0x2b,0x2b,0x1f,0x25,0x2d, 0x22,0x2c,0x62,0x53,0x77,0x5f,0x47,0x63,0x64,0x53,0x74,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x76,0x5f,0x47,0x63,0x52,0x4f,0x78, 0x14,0x13,0x19,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,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,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,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,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,0x03,0x03,0x04,0x77,0x67,0x83,0x62,0x4e,0x62, 0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62,0x6a,0x5a,0x6a,0x99,0xa1,0xbb,0x52, 0x4f,0x7b,0x67,0x73,0x99,0x7a,0x84,0xa5,0x73,0x7e,0xa1,0x6f,0x7b,0x9f,0x5e,0x6b, 0x92,0x57,0x63,0x8c,0x68,0x73,0x96,0x0e,0x0f,0x11,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,0x20,0x18,0x1d,0x4a,0x4f,0x6c,0x2e,0x24,0x2d,0x2f,0x22,0x29,0x2e,0x22,0x29, 0x32,0x25,0x2d,0x0c,0x09,0x0b,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,0x1a,0x1d,0x26,0x42, 0x39,0x4b,0x47,0x3b,0x4a,0x45,0x38,0x46,0x44,0x37,0x45,0x46,0x38,0x47,0x46,0x39, 0x48,0x46,0x3a,0x48,0x47,0x39,0x47,0x3f,0x31,0x3c,0x34,0x26,0x2e,0x2d,0x21,0x28, 0x29,0x1d,0x23,0x23,0x19,0x1e,0x62,0x53,0x77,0x62,0x4a,0x65,0x64,0x4e,0x6c,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x50, 0x6f,0x60,0x48,0x65,0x51,0x55,0x73,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,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,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,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,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,0x12,0x13,0x18,0x76,0x61, 0x79,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62,0x5f,0x4b,0x5d, 0xb3,0xb7,0xc6,0x52,0x53,0x7e,0x5f,0x6c,0x93,0x75,0x81,0xa3,0x75,0x81,0xa3,0x6f, 0x7b,0x9f,0x6a,0x76,0x9a,0x55,0x62,0x8b,0x60,0x6c,0x93,0x4a,0x4f,0x5e,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,0x1a,0x13,0x17,0x45,0x47,0x5e,0x2c,0x20,0x26,0x2f,0x22, 0x29,0x31,0x24,0x2b,0x35,0x28,0x30,0x06,0x05,0x06,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,0x1a,0x1a,0x23,0x40,0x39,0x4a,0x49,0x3c,0x4c,0x47, 0x3a,0x48,0x47,0x3a,0x49,0x43,0x37,0x45,0x45,0x38,0x45,0x30,0x25,0x2d,0x30,0x23, 0x2a,0x2e,0x22,0x28,0x28,0x1d,0x22,0x23,0x18,0x1d,0x5a,0x4e,0x6f,0x64,0x4c,0x69, 0x62,0x4a,0x66,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x62,0x53,0x77,0x5f,0x47,0x63,0x5a,0x52,0x79,0x2b,0x29,0x36,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,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,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,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,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,0x20, 0x23,0x2c,0x73,0x5e,0x75,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e, 0x62,0x61,0x4d,0x60,0xa1,0x9c,0xa8,0x5d,0x69,0x91,0x5d,0x69,0x91,0x71,0x7c,0xa0, 0x79,0x83,0xa4,0x72,0x7d,0xa0,0x6e,0x7a,0x9d,0x5c,0x67,0x90,0x58,0x64,0x8d,0x6f, 0x7a,0x9a,0x0d,0x0d,0x0e,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,0x1e,0x16,0x1b,0x45,0x44,0x5a,0x2b, 0x20,0x27,0x34,0x26,0x2e,0x38,0x2a,0x33,0x39,0x2b,0x34,0x0d,0x0a,0x0d,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,0x02,0x02,0x02, 0x1a,0x1d,0x26,0x3c,0x38,0x4b,0x49,0x3c,0x4b,0x45,0x38,0x47,0x42,0x35,0x43,0x28, 0x1e,0x25,0x2e,0x22,0x29,0x2d,0x21,0x27,0x28,0x1d,0x23,0x22,0x18,0x1c,0x51,0x44, 0x61,0x64,0x52,0x71,0x60,0x48,0x64,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x73,0x60,0x48,0x65,0x57, 0x5c,0x7e,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,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,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,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,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,0x2e,0x32,0x40,0x6f,0x5a,0x71,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62, 0x4e,0x62,0x62,0x4e,0x62,0x61,0x4d,0x60,0x86,0x7b,0x89,0x83,0x8e,0xac,0x54,0x5f, 0x89,0x6c,0x79,0x9c,0x7b,0x85,0xa7,0x75,0x81,0xa3,0x6f,0x7b,0x9f,0x64,0x71,0x96, 0x56,0x62,0x8b,0x64,0x6f,0x95,0x46,0x4b,0x58,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,0x1c,0x15,0x1a, 0x51,0x53,0x6c,0x30,0x24,0x2b,0x37,0x29,0x31,0x3c,0x2d,0x37,0x3e,0x2f,0x3a,0x21, 0x1b,0x22,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,0x02,0x02,0x02,0x1b,0x1a,0x24,0x42,0x37,0x45, 0x44,0x38,0x45,0x23,0x1a,0x21,0x27,0x1d,0x23,0x2a,0x1e,0x24,0x28,0x1d,0x22,0x22, 0x18,0x1c,0x46,0x3b,0x53,0x64,0x53,0x76,0x5b,0x43,0x5d,0x64,0x53,0x76,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x63,0x4b,0x67,0x63,0x53,0x77,0x3c,0x3b,0x4d,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,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,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,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,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,0x38,0x3d,0x50,0x6e,0x59,0x70,0x62,0x4e,0x62, 0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62,0x64,0x53,0x63,0xb5, 0xbb,0xce,0x52,0x53,0x7e,0x6e,0x7a,0x9d,0x77,0x82,0xa4,0x76,0x82,0xa3,0x6f,0x7b, 0x9f,0x6a,0x75,0x9a,0x58,0x64,0x8c,0x58,0x64,0x8d,0x6c,0x77,0x95,0x05,0x05,0x05, 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,0x1d,0x16,0x1b,0x54,0x57,0x70,0x37,0x29,0x33,0x3c,0x2d,0x37,0x41,0x31,0x3c, 0x40,0x31,0x3d,0x32,0x28,0x32,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,0x02,0x02,0x02,0x32,0x28,0x32,0x23,0x1a,0x1f,0x21,0x18,0x1e,0x2a,0x1e,0x24, 0x26,0x1b,0x20,0x22,0x18,0x1c,0x3e,0x33,0x47,0x62,0x53,0x77,0x5c,0x44,0x5f,0x64, 0x53,0x75,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x64,0x53,0x75,0x62,0x4a,0x66,0x55,0x5d,0x85,0x09,0x09,0x0c, 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,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, 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,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, 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,0x43,0x44,0x5d,0x6b,0x56, 0x6c,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x62, 0x5b,0x48,0x5a,0xbe,0xbd,0xc9,0x53,0x5e,0x89,0x6c,0x77,0x9b,0x7d,0x88,0xa8,0x7a, 0x84,0xa5,0x72,0x7d,0xa0,0x6c,0x79,0x9c,0x62,0x6e,0x94,0x52,0x5c,0x86,0x65,0x71, 0x96,0x3c,0x3f,0x47,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,0x1e,0x17,0x1c,0x5a,0x5c,0x74,0x3d,0x2f,0x3a,0x42,0x32, 0x3e,0x45,0x35,0x41,0x41,0x33,0x3e,0x3b,0x30,0x3b,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,0x17,0x13,0x18,0x26,0x1d,0x23,0x1e,0x15, 0x1a,0x29,0x1d,0x23,0x26,0x1b,0x20,0x23,0x18,0x1d,0x34,0x2a,0x39,0x60,0x53,0x77, 0x60,0x48,0x65,0x64,0x50,0x6f,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x63,0x4c,0x69,0x64,0x53, 0x76,0x52,0x52,0x69,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,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,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,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,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,0x5d, 0x52,0x6a,0x66,0x52,0x66,0x62,0x4e,0x61,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e, 0x62,0x62,0x4e,0x62,0x5f,0x4c,0x5e,0xa0,0x9b,0xa6,0x65,0x72,0x96,0x5d,0x6a,0x91, 0x83,0x8d,0xac,0x7c,0x88,0xa8,0x74,0x80,0xa2,0x6e,0x7a,0x9d,0x6b,0x76,0x9b,0x54, 0x5f,0x89,0x57,0x63,0x8c,0x68,0x71,0x8a,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,0x1e,0x17,0x1d,0x62,0x63,0x7d,0x4e, 0x43,0x53,0x4b,0x3a,0x47,0x4b,0x3a,0x48,0x43,0x34,0x40,0x41,0x34,0x40,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,0x02,0x02,0x02,0x27, 0x1e,0x24,0x1e,0x16,0x1a,0x23,0x19,0x1e,0x23,0x19,0x1d,0x21,0x17,0x1b,0x2c,0x22, 0x2d,0x60,0x53,0x77,0x64,0x4f,0x6d,0x63,0x4c,0x69,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64, 0x53,0x75,0x63,0x4b,0x67,0x56,0x62,0x89,0x13,0x12,0x18,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,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,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,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,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,0x6a,0x57,0x6d,0x64,0x50,0x64,0x62,0x4e,0x61,0x62,0x4e,0x61,0x62, 0x4e,0x61,0x62,0x4e,0x61,0x62,0x4e,0x62,0x61,0x4d,0x60,0x80,0x75,0x83,0x83,0x8d, 0xac,0x52,0x54,0x7e,0x83,0x8d,0xac,0x7d,0x88,0xa8,0x76,0x82,0xa3,0x72,0x7d,0xa0, 0x6c,0x77,0x9c,0x5f,0x6b,0x92,0x52,0x5d,0x86,0x6b,0x77,0x9b,0x2d,0x2f,0x33,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,0x0a,0x08,0x0a, 0x67,0x69,0x83,0x6b,0x6e,0x89,0x53,0x41,0x51,0x56,0x43,0x53,0x50,0x3f,0x4d,0x58, 0x47,0x57,0x1a,0x16,0x1c,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,0x1f,0x17,0x1d,0x20,0x17,0x1c,0x1f,0x16,0x1a,0x23,0x19,0x1d,0x22, 0x18,0x1c,0x23,0x1a,0x20,0x60,0x53,0x77,0x64,0x50,0x71,0x62,0x4a,0x65,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x4e,0x6d,0x64,0x53,0x75,0x52,0x56,0x74,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,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,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,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,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,0x73,0x5f,0x77,0x63,0x4f,0x63,0x62,0x4e,0x61, 0x62,0x4e,0x61,0x62,0x4e,0x61,0x61,0x4d,0x60,0x62,0x4e,0x61,0x61,0x4d,0x60,0x62, 0x52,0x63,0xc9,0xce,0xdb,0x52,0x52,0x7d,0x7a,0x85,0xa5,0x80,0x8b,0xaa,0x77,0x83, 0xa4,0x71,0x7c,0xa0,0x6e,0x7a,0x9d,0x6a,0x75,0x9a,0x52,0x5d,0x86,0x5c,0x69,0x90, 0x61,0x68,0x7c,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,0x40,0x3e,0x4d,0x7d,0x88,0xa8,0x70,0x5f,0x78,0x6f,0x5a,0x71, 0x6f,0x5a,0x71,0x73,0x5e,0x76,0x4e,0x4c,0x66,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,0x0f,0x0b,0x0e,0x21,0x18,0x1d,0x1c,0x14,0x17, 0x23,0x18,0x1d,0x21,0x17,0x1b,0x1a,0x12,0x15,0x5d,0x50,0x73,0x64,0x52,0x71,0x5d, 0x45,0x60,0x62,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x75,0x62,0x4a,0x66, 0x52,0x57,0x82,0x26,0x25,0x32,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,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,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,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,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,0x03,0x03,0x04,0x78,0x63,0x7d,0x64,0x50, 0x63,0x62,0x4e,0x61,0x62,0x4e,0x61,0x62,0x4e,0x61,0x61,0x4d,0x60,0x61,0x4d,0x60, 0x61,0x4d,0x60,0x5a,0x47,0x58,0xd6,0xd4,0xda,0x55,0x60,0x8a,0x6d,0x79,0x9c,0x82, 0x8c,0xab,0x7a,0x85,0xa5,0x72,0x7d,0xa0,0x6e,0x7a,0x9d,0x6b,0x76,0x9b,0x5b,0x67, 0x90,0x52,0x5d,0x88,0x6a,0x75,0x99,0x1a,0x1b,0x1e,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,0x74,0x78,0x92,0x81,0x8b, 0xa9,0x72,0x5d,0x75,0x73,0x5e,0x76,0x73,0x5e,0x76,0x73,0x65,0x83,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,0x02,0x02,0x02,0x24,0x1b, 0x20,0x1a,0x13,0x16,0x1f,0x15,0x19,0x1f,0x16,0x19,0x1d,0x13,0x17,0x53,0x47,0x66, 0x64,0x53,0x75,0x5e,0x46,0x62,0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x63,0x4b,0x67,0x64,0x53,0x75,0x58,0x5e,0x81,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,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,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,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,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,0x77, 0x69,0x89,0x66,0x52,0x66,0x62,0x4e,0x61,0x61,0x4d,0x60,0x61,0x4d,0x60,0x61,0x4d, 0x60,0x61,0x4d,0x60,0x61,0x4d,0x60,0x5d,0x49,0x5b,0xaa,0xa4,0xac,0x77,0x83,0xa4, 0x5b,0x66,0x8e,0x83,0x8d,0xac,0x7c,0x88,0xa8,0x75,0x81,0xa2,0x6e,0x7a,0x9d,0x6c, 0x79,0x9c,0x64,0x71,0x96,0x52,0x5a,0x84,0x56,0x62,0x8b,0x4a,0x50,0x61,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,0x17, 0x16,0x1b,0x89,0x90,0xac,0x7a,0x71,0x8b,0x75,0x60,0x79,0x76,0x61,0x7a,0x77,0x67, 0x83,0x3d,0x43,0x58,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,0x1e,0x17,0x1c,0x1c,0x14,0x18,0x1c,0x13,0x16,0x1e,0x15,0x19,0x1c,0x13, 0x16,0x49,0x3e,0x58,0x60,0x53,0x77,0x5d,0x45,0x5f,0x64,0x53,0x76,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x75,0x62,0x4a,0x66,0x52,0x57,0x82,0x35,0x34, 0x47,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,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,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,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,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,0x50,0x4d,0x67,0x69,0x54,0x69,0x61,0x4d,0x60,0x61,0x4d,0x60,0x61, 0x4d,0x60,0x60,0x4c,0x5f,0x61,0x4d,0x60,0x61,0x4d,0x60,0x5e,0x4b,0x5d,0x7f,0x75, 0x82,0xb3,0xba,0xcc,0x55,0x60,0x8a,0x83,0x8d,0xac,0x7e,0x89,0xa9,0x75,0x81,0xa3, 0x71,0x7c,0xa0,0x6b,0x76,0x9b,0x6b,0x76,0x9b,0x57,0x63,0x8c,0x52,0x54,0x80,0x64, 0x6f,0x90,0x06,0x07,0x07,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,0x4a,0x49,0x57,0x90,0x9a,0xb5,0x78,0x64,0x7e,0x78, 0x64,0x7e,0x78,0x65,0x7f,0x61,0x63,0x86,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,0x14,0x10,0x14,0x21,0x18,0x1d,0x1a,0x11,0x15,0x1d, 0x14,0x18,0x1d,0x14,0x18,0x40,0x37,0x4d,0x5e,0x53,0x79,0x5f,0x47,0x63,0x64,0x53, 0x73,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x5e,0x53,0x79,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x4f,0x6d,0x64, 0x53,0x75,0x56,0x5f,0x86,0x09,0x08,0x0b,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, 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,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, 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,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,0x28,0x2c,0x39,0x6e,0x5a,0x70,0x61,0x4d,0x60, 0x61,0x4d,0x60,0x61,0x4d,0x60,0x61,0x4d,0x60,0x61,0x4d,0x60,0x61,0x4d,0x60,0x61, 0x4d,0x60,0x5f,0x50,0x5f,0xb0,0xb7,0xca,0x5b,0x67,0x90,0x7e,0x8a,0xa9,0x80,0x8a, 0xaa,0x77,0x83,0xa4,0x71,0x7c,0xa0,0x6c,0x79,0x9c,0x6b,0x76,0x9b,0x64,0x6f,0x95, 0x52,0x50,0x7c,0x58,0x65,0x8d,0x35,0x39,0x44,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,0x82,0x83,0x99, 0x8e,0x8f,0xa8,0x78,0x64,0x7e,0x78,0x66,0x81,0x67,0x65,0x8a,0x35,0x39,0x45,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,0x02,0x02,0x02,0x27,0x1c,0x23, 0x17,0x10,0x12,0x1d,0x14,0x18,0x1f,0x15,0x19,0x35,0x2b,0x3c,0x5e,0x53,0x79,0x62, 0x4a,0x66,0x64,0x4d,0x6b,0x5e,0x53,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x5e,0x53, 0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77, 0x62,0x53,0x77,0x62,0x4a,0x65,0x52,0x4f,0x7a,0x42,0x3d,0x58,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,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,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,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,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,0x0f,0x10,0x14,0x76,0x61, 0x7a,0x62,0x4e,0x61,0x61,0x4d,0x60,0x60,0x4c,0x5f,0x61,0x4d,0x60,0x60,0x4c,0x5f, 0x5f,0x4c,0x5e,0x60,0x4c,0x5f,0x57,0x45,0x55,0xc0,0xc3,0xcd,0x6c,0x79,0x9c,0x6b, 0x77,0x9b,0x7e,0x89,0xa9,0x77,0x83,0xa4,0x71,0x7c,0xa0,0x6e,0x7a,0x9d,0x6b,0x76, 0x9b,0x69,0x74,0x99,0x55,0x60,0x8a,0x52,0x52,0x7d,0x61,0x6a,0x84,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,0x13,0x13,0x16,0x9d,0xa3,0xba,0x83,0x79,0x93,0x78,0x69,0x85,0x75,0x69,0x89, 0x65,0x6f,0x8b,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,0x20,0x18,0x1e,0x18,0x11,0x14,0x1c,0x13,0x17,0x1f,0x15,0x19,0x28,0x20,0x2a, 0x5c,0x52,0x79,0x64,0x52,0x72,0x63,0x4b,0x69,0x5b,0x52,0x79,0x5c,0x52,0x79,0x5c, 0x52,0x79,0x5c,0x52,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53, 0x79,0x60,0x53,0x77,0x5e,0x53,0x79,0x64,0x53,0x73,0x63,0x4b,0x67,0x53,0x52,0x7b, 0x12,0x10,0x16,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,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,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,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,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,0x04, 0x05,0x06,0x5e,0x55,0x6f,0x66,0x52,0x66,0x60,0x4c,0x5f,0x61,0x4d,0x60,0x61,0x4d, 0x60,0x61,0x4d,0x60,0x5f,0x4c,0x5e,0x61,0x4d,0x60,0x5a,0x47,0x58,0x9c,0x98,0xa4, 0x8a,0x93,0xb1,0x66,0x72,0x98,0x7e,0x8a,0xa9,0x79,0x84,0xa5,0x71,0x7c,0xa0,0x6d, 0x7a,0x9d,0x6b,0x76,0x9b,0x69,0x74,0x99,0x60,0x6d,0x93,0x52,0x4f,0x7a,0x67,0x74, 0x99,0x20,0x22,0x26,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,0x4b,0x4a,0x56,0xa7,0xaf,0xc4,0x7a,0x6c, 0x89,0x78,0x69,0x88,0x67,0x6b,0x90,0x1f,0x21,0x26,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,0x13,0x0f,0x12,0x1d,0x15,0x1a,0x19,0x12,0x15,0x1d,0x14, 0x17,0x1c,0x13,0x16,0x58,0x50,0x77,0x64,0x53,0x76,0x63,0x4b,0x67,0x5a,0x52,0x79, 0x58,0x50,0x79,0x57,0x50,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5c,0x52,0x79,0x5c, 0x52,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x62,0x4a, 0x66,0x64,0x53,0x75,0x4b,0x49,0x69,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,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,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,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,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,0x2f,0x31,0x42,0x70,0x5b,0x72,0x60,0x4c,0x5f,0x5f, 0x4c,0x5e,0x5f,0x4c,0x5e,0x5f,0x4c,0x5e,0x5f,0x4c,0x5e,0x60,0x4c,0x5f,0x5e,0x4a, 0x5d,0x71,0x68,0x79,0xb0,0xb7,0xca,0x5e,0x6b,0x92,0x7e,0x89,0xa9,0x75,0x81,0xa2, 0x71,0x7c,0xa0,0x6b,0x76,0x9b,0x6b,0x76,0x9b,0x6a,0x75,0x9a,0x63,0x6f,0x95,0x52, 0x5d,0x86,0x52,0x5c,0x86,0x53,0x59,0x6b,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,0x89, 0x8a,0x9d,0x93,0x8f,0xa7,0x78,0x69,0x88,0x72,0x68,0x8a,0x62,0x6b,0x84,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,0x04,0x03,0x04,0x25,0x1c,0x22,0x18, 0x11,0x13,0x1c,0x13,0x16,0x1c,0x13,0x16,0x48,0x43,0x63,0x5d,0x52,0x79,0x64,0x4d, 0x6a,0x54,0x50,0x79,0x54,0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x57,0x50,0x79, 0x57,0x50,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5c,0x52,0x79,0x5d,0x52,0x79,0x5e, 0x53,0x79,0x64,0x53,0x76,0x5f,0x47,0x63,0x52,0x4f,0x7b,0x26,0x25,0x32,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,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,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,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,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,0x11,0x13,0x18,0x78,0x66,0x80, 0x61,0x4d,0x60,0x60,0x4c,0x5f,0x5f,0x4b,0x5d,0x5f,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e, 0x4b,0x5d,0x5e,0x4b,0x5d,0x59,0x4b,0x5c,0xc2,0xc8,0xd7,0x5c,0x67,0x90,0x76,0x82, 0xa3,0x73,0x7e,0xa1,0x6e,0x7a,0x9d,0x6c,0x79,0x9c,0x6c,0x79,0x9c,0x6c,0x79,0x9c, 0x64,0x71,0x96,0x5d,0x69,0x91,0x5b,0x52,0x79,0x71,0x7c,0x9c,0x0b,0x0b,0x0c,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,0x0e,0x0e,0x10,0xab,0xaf,0xc3,0x7e,0x72,0x8f,0x78,0x69,0x88,0x65, 0x6b,0x8e,0x16,0x17,0x1b,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, 0x21,0x19,0x1e,0x1b,0x13,0x16,0x1d,0x14,0x17,0x1c,0x13,0x16,0x3c,0x36,0x51,0x53, 0x50,0x7b,0x65,0x52,0x6f,0x53,0x50,0x7a,0x53,0x50,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x53,0x4f,0x7a,0x55,0x50,0x79,0x55,0x50,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79, 0x5a,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x64,0x4e,0x6c,0x64,0x52,0x71,0x55, 0x5b,0x7d,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,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,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,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,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,0x04,0x04, 0x05,0x5e,0x59,0x78,0x64,0x50,0x64,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5f,0x4c,0x5e, 0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x54,0x41,0x51,0xb4,0xb8,0xc7,0x60, 0x6c,0x93,0x66,0x73,0x98,0x71,0x7c,0x9f,0x6e,0x7a,0x9d,0x6c,0x79,0x9c,0x6c,0x77, 0x9c,0x6b,0x76,0x9b,0x67,0x73,0x99,0x62,0x6e,0x94,0x52,0x4f,0x7a,0x5b,0x67,0x90, 0x47,0x4b,0x55,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,0x47,0x45,0x4f,0xa9,0xac,0xc2, 0x79,0x6a,0x88,0x6f,0x67,0x89,0x4d,0x54,0x6c,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,0x16,0x11,0x15,0x20,0x18,0x1c,0x1c,0x14,0x17,0x1d,0x14,0x18, 0x32,0x2c,0x3f,0x57,0x57,0x82,0x67,0x56,0x74,0x55,0x55,0x7e,0x54,0x56,0x81,0x54, 0x54,0x80,0x54,0x52,0x7c,0x53,0x50,0x7b,0x53,0x50,0x7b,0x54,0x50,0x7a,0x55,0x52, 0x79,0x56,0x52,0x79,0x57,0x50,0x79,0x58,0x50,0x79,0x5a,0x52,0x79,0x60,0x53,0x77, 0x63,0x4b,0x67,0x52,0x57,0x82,0x35,0x35,0x48,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,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,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,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,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,0x35,0x37,0x4a,0x6c,0x57,0x6d,0x5e,0x4b,0x5d,0x5e,0x4b, 0x5d,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x57,0x44,0x54, 0x89,0x89,0x9b,0x7b,0x85,0xa7,0x5a,0x65,0x8e,0x6f,0x7b,0x9f,0x6c,0x79,0x9c,0x6c, 0x77,0x9c,0x6b,0x76,0x9b,0x6b,0x76,0x9b,0x69,0x74,0x99,0x63,0x6e,0x94,0x54,0x5f, 0x89,0x52,0x50,0x7c,0x6b,0x73,0x8d,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,0x86,0x86,0x97,0x95,0x91,0xaa,0x78,0x69,0x88,0x63,0x61,0x84,0x11,0x12,0x17, 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,0x04,0x03,0x04,0x29,0x1e,0x24,0x1c,0x13, 0x17,0x1d,0x14,0x18,0x29,0x21,0x2b,0x60,0x6c,0x92,0x5f,0x5c,0x84,0x5e,0x62,0x8a, 0x5e,0x6a,0x90,0x5c,0x65,0x8d,0x5b,0x5c,0x85,0x58,0x58,0x82,0x58,0x57,0x81,0x57, 0x55,0x7e,0x56,0x54,0x7d,0x56,0x54,0x7d,0x57,0x54,0x7b,0x57,0x53,0x7b,0x5a,0x53, 0x7a,0x5b,0x53,0x7a,0x65,0x54,0x76,0x64,0x54,0x77,0x5a,0x63,0x88,0x09,0x08,0x0b, 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,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, 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,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, 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,0x18,0x1a,0x22,0x74,0x5f,0x77,0x5e, 0x4b,0x5d,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e,0x4b, 0x5d,0x59,0x47,0x58,0x69,0x64,0x76,0x98,0xa1,0xba,0x52,0x5d,0x86,0x6c,0x79,0x9c, 0x6d,0x7a,0x9d,0x6c,0x79,0x9c,0x6a,0x75,0x9a,0x6b,0x76,0x9b,0x6a,0x75,0x9a,0x63, 0x6f,0x95,0x5c,0x69,0x90,0x55,0x50,0x79,0x60,0x6d,0x93,0x2c,0x2c,0x2f,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,0x0a,0x0b,0x0c,0xac,0xb0,0xc2,0x85,0x7b,0x95,0x78,0x69, 0x88,0x4d,0x4b,0x65,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,0x26, 0x1d,0x23,0x1e,0x14,0x19,0x1f,0x15,0x19,0x1e,0x15,0x19,0x7f,0x89,0xa6,0x75,0x80, 0xa2,0x6e,0x79,0x9c,0x7b,0x88,0xa8,0x74,0x80,0xa2,0x6f,0x7a,0x9d,0x6b,0x75,0x9a, 0x67,0x73,0x98,0x67,0x73,0x98,0x67,0x72,0x98,0x66,0x71,0x98,0x63,0x6d,0x93,0x60, 0x6c,0x93,0x5d,0x69,0x90,0x5b,0x66,0x8e,0x58,0x5d,0x86,0x57,0x56,0x81,0x64,0x6e, 0x95,0x49,0x49,0x5f,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,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,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,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,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,0x04,0x04,0x05, 0x6d,0x5f,0x78,0x5f,0x4b,0x5e,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5e, 0x4b,0x5d,0x5e,0x4b,0x5d,0x5c,0x49,0x5b,0x58,0x4c,0x5e,0x9b,0xa4,0xbc,0x54,0x5f, 0x89,0x65,0x72,0x98,0x6c,0x79,0x9c,0x6c,0x79,0x9c,0x6c,0x79,0x9c,0x6b,0x76,0x9b, 0x6a,0x75,0x9a,0x67,0x73,0x99,0x60,0x6c,0x93,0x52,0x52,0x7d,0x52,0x5d,0x86,0x64, 0x69,0x76,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,0x3b,0x3a,0x42,0xad, 0xb1,0xc5,0x79,0x69,0x85,0x71,0x61,0x7b,0x28,0x21,0x29,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,0x03, 0x02,0x03,0x06,0x07,0x09,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,0x17,0x12,0x16,0x22,0x19,0x1d,0x1f,0x16,0x1a,0x1d,0x14,0x18,0xa3, 0xa5,0xb3,0xc2,0xc9,0xd9,0x9c,0xa5,0xc1,0xb5,0xbe,0xd2,0xaf,0xb7,0xcc,0xa9,0xb1, 0xc8,0xa1,0xa9,0xc3,0x9b,0xa3,0xbf,0x95,0xa0,0xbb,0x90,0x9a,0xb8,0x8c,0x96,0xb4, 0x85,0x90,0xb0,0x81,0x8b,0xab,0x7d,0x86,0xa9,0x77,0x83,0xa5,0x73,0x7e,0xa1,0x6a, 0x73,0x99,0x73,0x7d,0xa2,0x6b,0x6f,0x8a,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, 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,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, 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,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,0x36,0x34,0x45,0x64,0x50,0x63,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d, 0x5e,0x4b,0x5d,0x5d,0x4a,0x5c,0x5d,0x4a,0x5c,0x5d,0x49,0x5b,0x52,0x41,0x51,0x84, 0x8e,0xab,0x62,0x6d,0x94,0x5d,0x69,0x91,0x6b,0x77,0x9b,0x6c,0x77,0x9c,0x6c,0x79, 0x9c,0x6c,0x77,0x9c,0x6b,0x76,0x9b,0x69,0x74,0x99,0x63,0x6e,0x94,0x55,0x60,0x8a, 0x52,0x4f,0x7a,0x73,0x7d,0x9b,0x09,0x09,0x09,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,0x7c,0x7a,0x8b,0x93,0x90,0xa4,0x92,0x9b,0xb5,0x62,0x6c,0x93,0x52, 0x5c,0x84,0x43,0x49,0x68,0x13,0x13,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0x02,0x43,0x4c,0x69,0x34,0x3a,0x4c,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,0x07,0x06,0x07,0x2a,0x1f,0x26,0x21,0x17,0x1b, 0x20,0x17,0x1b,0x86,0x84,0x8e,0xe8,0xeb,0xf6,0xb4,0xbc,0xd2,0xc9,0xcf,0xe1,0xc3, 0xc9,0xdd,0xba,0xc1,0xd8,0xb3,0xba,0xd2,0xab,0xb3,0xcc,0xaa,0xb2,0xcc,0xa5,0xad, 0xc7,0xa1,0xaa,0xc6,0x9d,0xa5,0xc1,0x98,0xa2,0xbf,0x94,0x9f,0xbc,0x92,0x9b,0xb9, 0x8d,0x96,0xb5,0x84,0x8d,0xaf,0x85,0x90,0xb0,0x94,0x9b,0xb4,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,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,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,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,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,0x16,0x17,0x1f,0x6e,0x59,0x70,0x5d,0x4a, 0x5c,0x5d,0x4a,0x5c,0x5d,0x49,0x5b,0x5d,0x49,0x5b,0x5d,0x49,0x5b,0x5c,0x49,0x5b, 0x55,0x43,0x53,0x69,0x6d,0x89,0x80,0x8b,0xaa,0x53,0x5e,0x88,0x6c,0x79,0x9c,0x6b, 0x77,0x9b,0x6c,0x79,0x9c,0x6c,0x79,0x9c,0x6b,0x76,0x9b,0x6a,0x75,0x9a,0x65,0x72, 0x98,0x5d,0x6a,0x91,0x54,0x50,0x79,0x5d,0x6a,0x91,0x4e,0x4f,0x54,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,0x07,0x06,0x08,0x7d,0x7b,0x8b,0xa8,0xad,0xc2, 0xab,0xb2,0xc7,0xa3,0xab,0xc2,0x94,0x9d,0xb8,0x66,0x73,0x98,0x51,0x5a,0x82,0x3f, 0x43,0x60,0x0b,0x0c,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x03,0x04,0x39,0x41,0x5a,0x6f,0x78,0x95,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,0x28,0x1f, 0x25,0x23,0x19,0x1d,0x21,0x17,0x1b,0x67,0x62,0x6b,0xf2,0xf6,0xff,0xba,0xc2,0xd8, 0xd1,0xd8,0xe8,0xcf,0xd6,0xe8,0xc3,0xca,0xde,0xbe,0xc6,0xdb,0xb8,0xc0,0xd7,0xb7, 0xbf,0xd7,0xb0,0xb9,0xd3,0xab,0xb4,0xcf,0xa7,0xb0,0xcb,0xa5,0xad,0xc9,0x9f,0xa9, 0xc4,0x9b,0xa5,0xc3,0x9a,0xa3,0xc0,0x93,0x9d,0xbb,0x93,0x9b,0xbb,0xb3,0xbc,0xd2, 0x22,0x21,0x27,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,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,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,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,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,0x07,0x08,0x0a,0x70, 0x5d,0x74,0x5e,0x4a,0x5c,0x5d,0x49,0x5b,0x5d,0x49,0x5b,0x5b,0x48,0x5a,0x5b,0x48, 0x5a,0x5a,0x47,0x58,0x56,0x44,0x54,0x5b,0x59,0x72,0x99,0xa2,0xbb,0x52,0x57,0x82, 0x69,0x74,0x99,0x6b,0x76,0x9b,0x6c,0x79,0x9c,0x6c,0x79,0x9c,0x6b,0x76,0x9b,0x6b, 0x77,0x9b,0x6a,0x75,0x9a,0x62,0x6d,0x94,0x52,0x53,0x7e,0x52,0x4f,0x7b,0x70,0x77, 0x8c,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,0x2d,0x2c, 0x32,0x29,0x26,0x2c,0x4b,0x3b,0x4b,0x61,0x5f,0x6e,0x97,0x9e,0xb1,0xa4,0xab,0xc1, 0x9f,0xa8,0xbf,0x93,0x9c,0xb8,0x74,0x80,0xa1,0x51,0x5b,0x85,0x43,0x4c,0x6f,0x1c, 0x20,0x2e,0x2b,0x2d,0x44,0x4a,0x55,0x77,0x81,0x8c,0xa8,0x33,0x37,0x43,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,0x1a,0x14,0x19,0x29,0x1d,0x23,0x26,0x1b,0x20,0x47,0x3e,0x45,0xf5,0xf8, 0xff,0xbb,0xc3,0xd9,0xce,0xd5,0xe7,0xd1,0xd7,0xe8,0xca,0xd1,0xe5,0xc1,0xc9,0xde, 0xbb,0xc4,0xd9,0xb8,0xc0,0xd7,0xb2,0xbb,0xd5,0xb2,0xba,0xd3,0xac,0xb5,0xd0,0xaa, 0xb3,0xcf,0xa5,0xaf,0xcb,0xa2,0xab,0xc8,0x9d,0xa7,0xc4,0x95,0x9d,0xbf,0x92,0x9a, 0xba,0xaf,0xb8,0xd0,0x4e,0x4d,0x5b,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,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,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,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,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,0x3b,0x3a,0x4f,0x61,0x4e,0x61,0x5c,0x49,0x5a,0x5b,0x48,0x59,0x5a, 0x47,0x58,0x5b,0x48,0x59,0x5a,0x47,0x58,0x57,0x44,0x55,0x53,0x4a,0x5d,0xac,0xb3, 0xc8,0x53,0x5d,0x88,0x60,0x6d,0x94,0x6b,0x77,0x9b,0x6e,0x7a,0x9d,0x6d,0x79,0x9c, 0x6b,0x77,0x9b,0x6a,0x75,0x9a,0x6b,0x76,0x9b,0x66,0x72,0x98,0x58,0x65,0x8d,0x64, 0x53,0x76,0x5e,0x6b,0x92,0x23,0x23,0x23,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,0x0d,0x0c,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x39,0x3c,0x44,0x8c,0x91,0xa4,0xa2,0xaa,0xc0,0xa3,0xab,0xc2, 0x9a,0xa2,0xbb,0x83,0x8d,0xac,0x61,0x6c,0x92,0x8f,0x99,0xb4,0x5a,0x60,0x70,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,0x08,0x06,0x08,0x35,0x27,0x31,0x2f,0x22,0x29,0x2f, 0x22,0x29,0xdf,0xe1,0xec,0xbb,0xc3,0xd8,0xbf,0xc7,0xda,0xcb,0xd1,0xe1,0xc3,0xca, 0xde,0xbb,0xc2,0xd8,0xb4,0xbc,0xd3,0xb2,0xba,0xd2,0xb0,0xb8,0xcf,0xad,0xb4,0xcf, 0xa9,0xb1,0xcb,0xa5,0xad,0xc9,0x9f,0xa8,0xc4,0x9c,0xa5,0xc3,0x96,0xa1,0xc0,0x92, 0x9c,0xbb,0x8b,0x8b,0xad,0xa1,0xab,0xc8,0x73,0x75,0x88,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,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,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,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,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,0x17,0x19,0x21,0x6c,0x57,0x6d,0x5b,0x48,0x59, 0x5a,0x47,0x58,0x5a,0x47,0x58,0x5a,0x47,0x58,0x5a,0x47,0x58,0x58,0x45,0x56,0x4d, 0x3d,0x4c,0xaf,0xb5,0xc8,0x5c,0x69,0x90,0x58,0x64,0x8d,0x6d,0x79,0x9c,0x6b,0x77, 0x9b,0x6c,0x79,0x9c,0x6d,0x79,0x9c,0x6c,0x79,0x9c,0x6c,0x79,0x9c,0x69,0x74,0x99, 0x5e,0x6b,0x92,0x5b,0x52,0x79,0x52,0x5d,0x86,0x66,0x69,0x71,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x21,0x20,0x26,0x6b,0x6f,0x7f,0x8e,0x95,0xa9,0x93,0x9b,0xb0,0x3a,0x3d,0x46, 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,0x32,0x27,0x30, 0x35,0x27,0x30,0x2e,0x22,0x29,0xa9,0xa9,0xb6,0xb3,0xbb,0xd0,0xab,0xb3,0xc9,0xbe, 0xc4,0xd7,0xb7,0xbe,0xd1,0xb0,0xb8,0xce,0xa8,0xb0,0xc8,0xa4,0xac,0xc4,0xa0,0xa9, 0xc2,0x9c,0xa4,0xc0,0x95,0x9f,0xbb,0x93,0x9c,0xbb,0x8a,0x93,0xb4,0x88,0x92,0xb2, 0x82,0x8d,0xaf,0x7e,0x88,0xac,0x73,0x73,0x9a,0x74,0x80,0xa5,0x75,0x7b,0x98,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,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,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,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,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,0x09,0x09,0x0c,0x75,0x61, 0x7a,0x5b,0x48,0x59,0x5a,0x47,0x58,0x5a,0x47,0x58,0x5a,0x47,0x58,0x5a,0x47,0x58, 0x58,0x45,0x56,0x4f,0x3d,0x4b,0x8f,0x93,0xa7,0x7c,0x86,0xa7,0x53,0x5e,0x88,0x6b, 0x77,0x9b,0x6d,0x79,0x9c,0x6d,0x79,0x9c,0x6b,0x77,0x9b,0x6c,0x79,0x9c,0x6b,0x76, 0x9b,0x6a,0x75,0x9a,0x64,0x71,0x96,0x52,0x58,0x83,0x55,0x50,0x79,0x77,0x81,0x9b, 0x03,0x03,0x03,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,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,0x25,0x1d,0x24,0x37,0x2a,0x34,0x2f,0x22,0x29,0x80,0x7e,0x8a,0xaf,0xb5,0xca, 0x94,0x9c,0xb8,0xb0,0xb7,0xcb,0xa9,0xb1,0xc6,0x9d,0xa7,0xc0,0x98,0xa1,0xbb,0x92, 0x9c,0xb9,0x8d,0x98,0xb4,0x8a,0x93,0xb1,0x86,0x91,0xb0,0x82,0x8c,0xac,0x7a,0x84, 0xa7,0x75,0x80,0xa4,0x71,0x7b,0xa0,0x69,0x75,0x9b,0x5c,0x5f,0x8a,0x5c,0x5a,0x84, 0x6d,0x78,0x9c,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,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,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,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,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,0x41,0x3e,0x53,0x5f,0x4b,0x5e,0x59,0x46,0x57,0x5a,0x47,0x58,0x59,0x46, 0x57,0x59,0x46,0x57,0x59,0x46,0x57,0x51,0x3f,0x4e,0x72,0x71,0x83,0x93,0x9d,0xb8, 0x52,0x55,0x81,0x69,0x74,0x9a,0x6e,0x7a,0x9d,0x6c,0x79,0x9c,0x6e,0x7a,0x9d,0x6d, 0x79,0x9c,0x6b,0x76,0x9b,0x6b,0x77,0x9b,0x6a,0x75,0x9a,0x5a,0x65,0x8d,0x63,0x53, 0x77,0x62,0x6d,0x94,0x43,0x43,0x43,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,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,0x0d,0x0b,0x0d,0x3e,0x30,0x3b,0x31,0x24,0x2b,0x5d,0x56, 0x62,0xb1,0xb8,0xcb,0x7d,0x88,0xa8,0xa3,0xab,0xc2,0x9b,0xa5,0xbf,0x92,0x9b,0xb5, 0x89,0x92,0xb1,0x84,0x8e,0xad,0x82,0x8c,0xab,0x7b,0x86,0xa7,0x79,0x84,0xa5,0x72, 0x7d,0xa1,0x6d,0x79,0x9f,0x69,0x74,0x9a,0x63,0x71,0x96,0x5e,0x6b,0x92,0x54,0x5e, 0x88,0x57,0x53,0x7a,0x60,0x6d,0x94,0x19,0x18,0x20,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,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,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,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,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,0x19,0x1b,0x24,0x67,0x52,0x67,0x59,0x46,0x57,0x59, 0x46,0x57,0x58,0x45,0x56,0x58,0x46,0x56,0x58,0x45,0x56,0x54,0x42,0x51,0x5b,0x53, 0x64,0x90,0x99,0xb4,0x52,0x56,0x82,0x60,0x6d,0x93,0x6d,0x7a,0x9d,0x6e,0x7a,0x9d, 0x6f,0x7b,0x9f,0x6d,0x7a,0x9d,0x6e,0x7a,0x9d,0x6c,0x79,0x9c,0x6b,0x77,0x9b,0x62, 0x6d,0x94,0x52,0x50,0x7b,0x52,0x54,0x80,0x7c,0x7f,0x89,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,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,0x3a,0x2d,0x38,0x33, 0x26,0x2e,0x41,0x37,0x40,0xb7,0xbc,0xcf,0x6f,0x7b,0x9f,0x95,0x9f,0xb9,0x98,0xa1, 0xba,0x8b,0x95,0xb2,0x82,0x8d,0xac,0x7c,0x88,0xa8,0x79,0x83,0xa4,0x76,0x82,0xa3, 0x72,0x7d,0xa1,0x6f,0x7b,0x9f,0x6a,0x75,0x9a,0x65,0x72,0x96,0x60,0x6c,0x93,0x5b, 0x67,0x90,0x52,0x5d,0x86,0x5f,0x53,0x79,0x58,0x64,0x8c,0x35,0x35,0x46,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,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,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,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,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,0x08,0x09,0x0b,0x71,0x5c,0x73, 0x59,0x46,0x57,0x58,0x45,0x56,0x58,0x45,0x56,0x57,0x44,0x55,0x57,0x44,0x55,0x55, 0x43,0x53,0x4d,0x40,0x4e,0x99,0xa2,0xbb,0x5b,0x66,0x8e,0x56,0x63,0x8b,0x6f,0x7b, 0x9f,0x6e,0x7a,0x9d,0x71,0x7c,0xa0,0x71,0x7c,0xa0,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f, 0x6d,0x7a,0x9d,0x6a,0x75,0x9a,0x54,0x5f,0x89,0x57,0x50,0x79,0x85,0x8f,0xab,0x0f, 0x0f,0x0f,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,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, 0x28,0x20,0x27,0x38,0x2a,0x34,0x30,0x23,0x2b,0xb0,0xb6,0xc6,0x72,0x7d,0xa0,0x8a, 0x94,0xb1,0x95,0x9f,0xb9,0x89,0x93,0xb0,0x7e,0x89,0xa9,0x7a,0x85,0xa5,0x74,0x80, 0xa2,0x73,0x7e,0xa1,0x6d,0x79,0x9c,0x6b,0x76,0x9b,0x66,0x73,0x98,0x64,0x6f,0x95, 0x5e,0x6a,0x91,0x5a,0x65,0x8d,0x55,0x60,0x8a,0x60,0x53,0x77,0x53,0x5e,0x88,0x4c, 0x4d,0x66,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,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,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,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,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,0x4e,0x42,0x53,0x59,0x47,0x58,0x58,0x45,0x56,0x57,0x44,0x55,0x56,0x43,0x53, 0x56,0x44,0x54,0x55,0x43,0x53,0x4a,0x39,0x47,0x92,0x98,0xaf,0x67,0x74,0x99,0x52, 0x55,0x81,0x6c,0x77,0x9c,0x71,0x7c,0xa0,0x72,0x7d,0xa0,0x71,0x7c,0xa0,0x73,0x7e, 0xa1,0x72,0x7d,0xa1,0x71,0x7c,0x9f,0x71,0x7c,0x9f,0x5d,0x6a,0x91,0x5a,0x52,0x79, 0x62,0x6d,0x94,0x5c,0x5d,0x5f,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,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,0x0f,0x0c,0x0f,0x3d,0x2f,0x3a,0x31,0x24,0x2c,0x90,0x92,0xa2, 0x7e,0x8a,0xa9,0x7c,0x86,0xa7,0x94,0x9f,0xb8,0x88,0x92,0xb0,0x7b,0x86,0xa7,0x74, 0x80,0xa2,0x6f,0x7c,0x9f,0x6f,0x7b,0x9f,0x6b,0x77,0x9b,0x67,0x74,0x99,0x63,0x6f, 0x95,0x60,0x6c,0x93,0x5d,0x69,0x91,0x57,0x64,0x8c,0x54,0x5f,0x89,0x64,0x53,0x76, 0x52,0x4f,0x7b,0x53,0x57,0x77,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,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,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,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,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,0x1d,0x1b,0x23,0x5d,0x49,0x5b,0x57,0x44,0x55,0x56,0x43, 0x53,0x56,0x43,0x53,0x56,0x43,0x53,0x56,0x43,0x53,0x4d,0x3c,0x4a,0x7c,0x7d,0x92, 0x7c,0x86,0xa7,0x52,0x55,0x80,0x69,0x75,0x9a,0x73,0x7e,0xa1,0x71,0x7d,0xa0,0x74, 0x80,0xa2,0x74,0x80,0xa2,0x74,0x80,0xa2,0x72,0x7d,0xa0,0x73,0x7e,0xa1,0x67,0x73, 0x99,0x52,0x5b,0x85,0x52,0x55,0x81,0x86,0x8b,0x9a,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,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,0x3c,0x2f,0x3a,0x33,0x26, 0x2e,0x73,0x72,0x81,0x90,0x9a,0xb5,0x6f,0x7b,0x9f,0x92,0x9b,0xb7,0x85,0x90,0xaf, 0x7b,0x86,0xa7,0x6f,0x7b,0x9f,0x6d,0x79,0x9c,0x6b,0x76,0x9b,0x69,0x74,0x99,0x65, 0x71,0x96,0x62,0x6d,0x94,0x5e,0x6a,0x91,0x5c,0x67,0x90,0x57,0x63,0x8c,0x54,0x5f, 0x89,0x60,0x53,0x77,0x5d,0x52,0x79,0x55,0x5f,0x85,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,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,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,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,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,0x08,0x08,0x0b,0x66,0x52,0x66,0x56, 0x44,0x54,0x56,0x43,0x53,0x55,0x43,0x53,0x54,0x42,0x51,0x54,0x42,0x51,0x4f,0x3e, 0x4c,0x65,0x60,0x71,0x93,0x9c,0xb8,0x52,0x5d,0x86,0x60,0x6c,0x93,0x71,0x7c,0xa0, 0x73,0x7e,0xa1,0x75,0x81,0xa3,0x76,0x82,0xa3,0x76,0x82,0xa3,0x76,0x82,0xa3,0x73, 0x7e,0xa1,0x72,0x7d,0xa0,0x5a,0x66,0x8e,0x52,0x50,0x7c,0x84,0x8e,0xac,0x21,0x21, 0x21,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,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,0x29, 0x21,0x29,0x38,0x2a,0x33,0x57,0x51,0x5d,0x96,0xa0,0xba,0x69,0x74,0x99,0x92,0x9c, 0xb7,0x86,0x91,0xaf,0x79,0x83,0xa4,0x71,0x7c,0x9f,0x69,0x74,0x99,0x67,0x74,0x99, 0x65,0x71,0x96,0x62,0x6d,0x94,0x5f,0x6b,0x92,0x5b,0x67,0x90,0x5a,0x65,0x8d,0x55, 0x62,0x8b,0x54,0x5f,0x89,0x55,0x50,0x79,0x64,0x53,0x76,0x52,0x5d,0x86,0x0a,0x0a, 0x0d,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,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,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,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,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,0x02,0x02,0x03, 0x58,0x48,0x5b,0x54,0x42,0x52,0x54,0x42,0x51,0x54,0x42,0x51,0x54,0x42,0x51,0x54, 0x42,0x51,0x51,0x3f,0x4e,0x53,0x48,0x58,0xa5,0xad,0xc3,0x58,0x64,0x8d,0x57,0x63, 0x8c,0x71,0x7c,0xa0,0x74,0x80,0xa1,0x77,0x83,0xa4,0x79,0x84,0xa5,0x7a,0x85,0xa5, 0x76,0x82,0xa3,0x75,0x81,0xa2,0x76,0x82,0xa3,0x66,0x73,0x98,0x52,0x52,0x7c,0x64, 0x71,0x96,0x74,0x75,0x77,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,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,0x12,0x0f,0x12,0x3c,0x2e,0x38,0x3f,0x36,0x40,0xa7,0xaf,0xc4,0x65, 0x71,0x96,0x8e,0x99,0xb4,0x85,0x90,0xad,0x76,0x82,0xa3,0x6d,0x79,0x9c,0x66,0x73, 0x98,0x65,0x72,0x98,0x62,0x6e,0x94,0x60,0x6d,0x93,0x5d,0x69,0x91,0x5b,0x66,0x8e, 0x56,0x63,0x8b,0x55,0x60,0x8a,0x54,0x5f,0x89,0x52,0x4f,0x7a,0x64,0x52,0x72,0x52, 0x57,0x82,0x25,0x22,0x30,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,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,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,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,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,0x2d,0x27,0x33,0x5a,0x47,0x58,0x54,0x42,0x51,0x53,0x41,0x51, 0x54,0x42,0x51,0x53,0x41,0x51,0x53,0x41,0x51,0x4a,0x3a,0x47,0xa6,0xad,0xc2,0x6a, 0x75,0x9a,0x53,0x5e,0x88,0x6d,0x79,0x9c,0x76,0x82,0xa3,0x79,0x84,0xa5,0x7a,0x85, 0xa5,0x7d,0x88,0xa8,0x7d,0x88,0xa8,0x7b,0x85,0xa7,0x79,0x84,0xa5,0x72,0x7e,0xa1, 0x55,0x60,0x8a,0x54,0x5f,0x89,0x9b,0xa1,0xb1,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,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,0x3a,0x2d,0x37,0x35,0x27,0x2f, 0xa7,0xae,0xc1,0x64,0x71,0x96,0x86,0x91,0xaf,0x88,0x92,0xb0,0x79,0x83,0xa4,0x6b, 0x76,0x9b,0x66,0x72,0x98,0x63,0x6f,0x95,0x62,0x6d,0x94,0x5e,0x6a,0x92,0x5b,0x67, 0x90,0x58,0x65,0x8d,0x57,0x63,0x8c,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x50,0x7b, 0x64,0x4e,0x6c,0x52,0x54,0x7e,0x38,0x33,0x49,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,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,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,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,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,0x0c,0x0c,0x10,0x63,0x4f,0x62,0x53,0x41, 0x51,0x53,0x41,0x51,0x52,0x40,0x4f,0x52,0x40,0x4f,0x51,0x40,0x4f,0x4c,0x3b,0x48, 0x8d,0x8f,0xa3,0x7e,0x8a,0xa9,0x52,0x5d,0x86,0x67,0x73,0x99,0x77,0x83,0xa4,0x7a, 0x85,0xa5,0x7c,0x88,0xa8,0x80,0x8a,0xaa,0x7e,0x8a,0xa9,0x7d,0x88,0xa8,0x7b,0x86, 0xa7,0x7a,0x84,0xa5,0x65,0x72,0x96,0x52,0x56,0x81,0x80,0x8b,0xaa,0x36,0x36,0x36, 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,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,0x2b,0x21, 0x29,0x38,0x2a,0x33,0x8b,0x8c,0x9e,0x79,0x84,0xa4,0x80,0x8a,0xaa,0x88,0x92,0xb0, 0x79,0x84,0xa5,0x6c,0x79,0x9c,0x66,0x72,0x98,0x60,0x6d,0x94,0x5e,0x6b,0x92,0x5c, 0x69,0x90,0x5a,0x65,0x8d,0x58,0x64,0x8c,0x56,0x62,0x8b,0x54,0x5f,0x89,0x52,0x5c, 0x85,0x52,0x53,0x7d,0x64,0x53,0x74,0x52,0x4f,0x7b,0x46,0x40,0x5d,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,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,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,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,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,0x05,0x05,0x07,0x62, 0x4f,0x63,0x53,0x41,0x51,0x52,0x40,0x4f,0x51,0x40,0x4f,0x51,0x40,0x4f,0x51,0x40, 0x4f,0x4c,0x3b,0x49,0x72,0x70,0x83,0xa4,0xac,0xc3,0x55,0x60,0x8a,0x5a,0x66,0x8e, 0x76,0x82,0xa3,0x7d,0x88,0xa8,0x7d,0x88,0xa8,0x7e,0x8a,0xa9,0x83,0x8d,0xac,0x83, 0x8d,0xac,0x7e,0x8a,0xa9,0x7e,0x8a,0xa9,0x72,0x7d,0xa0,0x52,0x5d,0x86,0x63,0x6f, 0x95,0x81,0x82,0x86,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,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,0x13,0x0f,0x13,0x3c,0x2e,0x39,0x6d,0x6b,0x7b,0x90,0x99,0xb4,0x74,0x80, 0xa2,0x88,0x92,0xb0,0x7a,0x84,0xa5,0x6d,0x79,0x9d,0x64,0x6f,0x95,0x60,0x6c,0x93, 0x5e,0x6b,0x92,0x5b,0x67,0x90,0x5a,0x65,0x8d,0x57,0x63,0x8c,0x55,0x60,0x8a,0x53, 0x5e,0x89,0x52,0x5d,0x88,0x52,0x56,0x81,0x64,0x53,0x76,0x53,0x50,0x7a,0x4f,0x49, 0x6d,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,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,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,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,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,0x3a,0x30,0x3c,0x55,0x42,0x52,0x51,0x40,0x4f,0x51,0x3f,0x4e,0x51, 0x3f,0x4e,0x50,0x3f,0x4d,0x4f,0x3e,0x4c,0x5a,0x52,0x63,0xc8,0xcc,0xda,0x62,0x6e, 0x94,0x52,0x53,0x7e,0x75,0x81,0xa2,0x7d,0x89,0xa8,0x82,0x8c,0xab,0x84,0x90,0xad, 0x84,0x90,0xad,0x85,0x90,0xad,0x83,0x8d,0xac,0x82,0x8c,0xab,0x7e,0x89,0xa9,0x5e, 0x6b,0x92,0x54,0x5f,0x89,0x9c,0xa2,0xb4,0x03,0x03,0x03,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,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,0x3c,0x2e,0x39,0x57,0x51,0x5e,0xa7, 0xaf,0xc4,0x6a,0x75,0x9a,0x8a,0x94,0xb1,0x7b,0x86,0xa7,0x6d,0x79,0x9d,0x65,0x71, 0x96,0x5f,0x6b,0x92,0x5f,0x6b,0x92,0x5c,0x67,0x90,0x5a,0x66,0x8e,0x56,0x63,0x8b, 0x55,0x60,0x8a,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x56,0x81,0x62,0x53,0x77,0x55, 0x50,0x79,0x53,0x4f,0x77,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,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,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,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,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,0x18,0x15,0x1c,0x5c,0x49,0x5a,0x50,0x3e,0x4d, 0x50,0x3e,0x4d,0x4f,0x3e,0x4c,0x4f,0x3e,0x4c,0x4f,0x3d,0x4b,0x4a,0x3d,0x4b,0xca, 0xd0,0xdd,0x74,0x80,0xa2,0x53,0x50,0x7a,0x72,0x7d,0xa1,0x82,0x8c,0xab,0x84,0x90, 0xad,0x85,0x90,0xad,0x86,0x91,0xaf,0x86,0x91,0xaf,0x84,0x90,0xad,0x85,0x90,0xad, 0x82,0x8c,0xab,0x72,0x7d,0xa0,0x52,0x5c,0x85,0x85,0x90,0xad,0x41,0x41,0x41,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,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,0x2b,0x22,0x2a, 0x46,0x3a,0x47,0xaf,0xb5,0xca,0x67,0x73,0x99,0x83,0x8e,0xac,0x7e,0x89,0xa9,0x71, 0x7c,0x9f,0x65,0x71,0x96,0x60,0x6c,0x93,0x5d,0x6a,0x91,0x5b,0x67,0x90,0x58,0x65, 0x8d,0x57,0x63,0x8c,0x55,0x60,0x8a,0x53,0x5f,0x89,0x53,0x5e,0x88,0x52,0x58,0x83, 0x52,0x4f,0x7a,0x57,0x50,0x79,0x52,0x50,0x7b,0x09,0x08,0x0b,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,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,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,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,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,0x08,0x08,0x0b,0x64,0x50, 0x64,0x50,0x3e,0x4d,0x4f,0x3e,0x4c,0x4f,0x3e,0x4c,0x4f,0x3d,0x4b,0x4f,0x3d,0x4c, 0x47,0x36,0x43,0xaf,0xb3,0xc1,0x92,0x9b,0xb7,0x55,0x50,0x79,0x65,0x71,0x96,0x82, 0x8c,0xab,0x88,0x92,0xb0,0x88,0x92,0xb0,0x8b,0x95,0xb2,0x8b,0x95,0xb2,0x8b,0x95, 0xb2,0x86,0x91,0xaf,0x86,0x91,0xaf,0x7c,0x88,0xa8,0x56,0x63,0x8b,0x6b,0x76,0x9b, 0x85,0x88,0x8d,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,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,0x16,0x11,0x15,0x40,0x30,0x3c,0xa5,0xab,0xbd,0x71,0x7c,0xa0,0x7a,0x84,0xa5, 0x81,0x8b,0xab,0x71,0x7c,0xa0,0x67,0x73,0x98,0x5f,0x6c,0x93,0x5d,0x6a,0x91,0x5d, 0x69,0x91,0x58,0x64,0x8d,0x57,0x64,0x8c,0x55,0x62,0x8b,0x54,0x5f,0x89,0x52,0x5d, 0x86,0x52,0x5c,0x86,0x52,0x4f,0x7a,0x5d,0x52,0x79,0x52,0x50,0x7b,0x1e,0x1b,0x26, 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,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, 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,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, 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,0x47,0x39,0x47,0x51,0x3f,0x4e,0x4f,0x3e,0x4c,0x4f,0x3e,0x4c,0x4f,0x3d, 0x4c,0x4e,0x3c,0x4a,0x49,0x38,0x45,0x8a,0x8a,0x98,0xb0,0xb7,0xca,0x52,0x4f,0x7a, 0x5c,0x67,0x90,0x80,0x8a,0xaa,0x84,0x90,0xad,0x8a,0x94,0xb1,0x8d,0x96,0xb3,0x8d, 0x98,0xb3,0x8a,0x94,0xb1,0x8b,0x95,0xb2,0x8a,0x94,0xb1,0x83,0x8d,0xac,0x67,0x74, 0x99,0x55,0x60,0x8a,0x9d,0xa4,0xb8,0x09,0x09,0x09,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,0x9a,0x9d,0xa6,0x70,0x71,0x77,0x15,0x15,0x17,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,0x3f,0x30,0x3c,0x8a,0x8b,0x9e,0x81,0x8c, 0xab,0x6f,0x7b,0x9f,0x83,0x8d,0xac,0x73,0x7e,0xa1,0x67,0x74,0x99,0x62,0x6e,0x94, 0x5d,0x6a,0x91,0x5c,0x69,0x90,0x5b,0x67,0x8e,0x57,0x64,0x8c,0x56,0x62,0x8b,0x54, 0x5f,0x89,0x53,0x5d,0x88,0x52,0x5b,0x85,0x52,0x52,0x7d,0x63,0x53,0x77,0x52,0x4f, 0x7a,0x32,0x2d,0x3f,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,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,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,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,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,0x20,0x1a,0x21,0x53,0x41,0x50,0x4e,0x3c,0x4a,0x4e, 0x3c,0x4a,0x4d,0x3b,0x49,0x4c,0x3b,0x49,0x4a,0x39,0x46,0x6a,0x65,0x75,0xcb,0xd0, 0xdd,0x52,0x56,0x81,0x53,0x5e,0x88,0x85,0x90,0xad,0x8a,0x94,0xb1,0x8a,0x94,0xb1, 0x8d,0x98,0xb3,0x90,0x99,0xb4,0x8c,0x95,0xb2,0x8e,0x99,0xb4,0x8c,0x96,0xb2,0x89, 0x93,0xb0,0x7c,0x86,0xa8,0x52,0x5d,0x88,0x7d,0x88,0xa8,0x47,0x48,0x49,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,0x08,0x07,0x08,0x59, 0x47,0x59,0x83,0x75,0x86,0xb8,0xbf,0xd0,0xaa,0xb1,0xc7,0xce,0xd2,0xde,0x88,0x8b, 0x94,0x33,0x35,0x3a,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,0x30,0x25,0x2e,0x6d, 0x6a,0x7a,0x94,0x9d,0xb8,0x66,0x73,0x98,0x83,0x8d,0xac,0x76,0x81,0xa3,0x69,0x75, 0x9a,0x63,0x6e,0x94,0x5e,0x6b,0x92,0x5d,0x6a,0x91,0x5b,0x66,0x8e,0x57,0x64,0x8c, 0x56,0x62,0x8b,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x5c,0x86,0x52,0x54,0x7e,0x64, 0x53,0x74,0x5c,0x52,0x79,0x40,0x3a,0x53,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, 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,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, 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,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,0x0b,0x09,0x0c,0x61,0x4d,0x60, 0x4e,0x3c,0x4a,0x4d,0x3b,0x49,0x4c,0x3b,0x49,0x4c,0x3b,0x49,0x4c,0x3b,0x49,0x53, 0x49,0x59,0xd3,0xd7,0xe2,0x58,0x65,0x8d,0x52,0x4f,0x7a,0x81,0x8b,0xaa,0x88,0x92, 0xb0,0x90,0x99,0xb4,0x90,0x99,0xb4,0x92,0x9c,0xb7,0x8e,0x99,0xb4,0x92,0x9c,0xb7, 0x90,0x9a,0xb5,0x8b,0x95,0xb2,0x82,0x8c,0xab,0x5c,0x67,0x90,0x5e,0x6a,0x91,0x80, 0x83,0x8e,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, 0x61,0x4d,0x61,0x62,0x4f,0x61,0xc3,0xc4,0xcf,0x92,0x9c,0xb7,0x83,0x8e,0xac,0xc2, 0xc8,0xd7,0xd2,0xd7,0xe1,0xca,0xcf,0xdb,0x9f,0xa4,0xb3,0x4d,0x50,0x5a,0x0a,0x0b, 0x0d,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, 0x1b,0x15,0x1b,0x5d,0x55,0x65,0xa4,0xac,0xc2,0x66,0x72,0x98,0x7d,0x89,0xa8,0x77, 0x83,0xa4,0x6b,0x76,0x9b,0x63,0x6f,0x95,0x5f,0x6b,0x92,0x5e,0x6b,0x92,0x5c,0x69, 0x90,0x58,0x64,0x8d,0x56,0x63,0x8b,0x55,0x62,0x8b,0x53,0x5f,0x89,0x52,0x5c,0x86, 0x52,0x55,0x81,0x64,0x53,0x76,0x60,0x53,0x77,0x4b,0x44,0x64,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,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,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,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,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,0x03,0x03, 0x04,0x57,0x47,0x59,0x51,0x40,0x4f,0x4c,0x3b,0x49,0x4d,0x3b,0x49,0x4c,0x3b,0x49, 0x4c,0x3b,0x49,0x47,0x38,0x44,0xb7,0xbd,0xcd,0x6e,0x7a,0x9d,0x5d,0x52,0x79,0x79, 0x84,0xa5,0x89,0x93,0xb0,0x8c,0x95,0xb2,0x92,0x9b,0xb7,0x93,0x9c,0xb8,0x94,0x9d, 0xb8,0x92,0x9b,0xb7,0x92,0x9b,0xb7,0x8c,0x95,0xb2,0x89,0x93,0xb0,0x6b,0x76,0x9b, 0x53,0x5f,0x89,0x91,0x9a,0xb2,0x0c,0x0c,0x0c,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,0x44,0x36,0x44,0x61,0x4d,0x60,0x88,0x7c,0x8d,0xab,0xb2,0xc7,0x80,0x8b,0xaa, 0x8a,0x94,0xb1,0x8a,0x94,0xb1,0xe5,0xe7,0xee,0xd9,0xdd,0xe6,0xcc,0xd1,0xde,0xbb, 0xc1,0xd2,0x9d,0xa5,0xbb,0x5d,0x62,0x74,0x1c,0x1f,0x26,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,0x04,0x03,0x04,0x4c,0x3e,0x4c,0xaa,0xb2,0xc7,0x74,0x80,0xa2, 0x74,0x80,0xa2,0x7a,0x84,0xa5,0x6c,0x77,0x9b,0x64,0x6f,0x95,0x5f,0x6c,0x93,0x5d, 0x6a,0x91,0x5b,0x67,0x90,0x58,0x64,0x8d,0x57,0x63,0x8c,0x55,0x60,0x8a,0x54,0x5f, 0x89,0x53,0x5e,0x88,0x52,0x5b,0x85,0x63,0x53,0x77,0x64,0x53,0x76,0x51,0x4b,0x70, 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,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, 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,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, 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,0x32,0x2a,0x34,0x56,0x44,0x54,0x4b,0x3a,0x48,0x4b,0x3a, 0x48,0x4b,0x3a,0x47,0x4a,0x39,0x47,0x46,0x36,0x42,0x95,0x96,0xa9,0x8c,0x96,0xb3, 0x5e,0x53,0x79,0x72,0x7d,0xa0,0x8a,0x94,0xb1,0x90,0x99,0xb4,0x90,0x9a,0xb5,0x94, 0x9d,0xb8,0x96,0xa0,0xba,0x95,0x9f,0xb9,0x91,0x9b,0xb5,0x90,0x99,0xb4,0x8a,0x94, 0xb1,0x7a,0x85,0xa7,0x52,0x5d,0x88,0x6f,0x7c,0x9f,0x54,0x55,0x56,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,0x07,0x06,0x07,0x61,0x4d,0x60,0x5f,0x4c,0x5e,0xb6,0xb6,0xc6,0x79,0x83, 0xa4,0x8b,0x94,0xb1,0x8c,0x96,0xb2,0x80,0x8a,0xaa,0xb4,0xbb,0xce,0xe6,0xe8,0xee, 0xd9,0xdd,0xe6,0xce,0xd2,0xdf,0xb9,0xc0,0xd1,0xa2,0xaa,0xc1,0x8c,0x96,0xb3,0x63, 0x6c,0x88,0x2e,0x32,0x40,0x05,0x06,0x07,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,0x2f,0x24,0x2c,0x9e,0xa4, 0xb8,0x85,0x90,0xaf,0x69,0x75,0x9a,0x7b,0x86,0xa7,0x6d,0x7a,0x9d,0x65,0x71,0x96, 0x5f,0x6c,0x93,0x5d,0x6a,0x91,0x5c,0x67,0x90,0x5a,0x66,0x8e,0x57,0x64,0x8c,0x56, 0x62,0x8b,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x5c,0x86,0x57,0x50,0x79,0x64,0x53, 0x76,0x53,0x4f,0x78,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,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,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,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,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,0x0f,0x0d,0x11,0x5e,0x4b,0x5d,0x4c, 0x3b,0x49,0x4b,0x3a,0x47,0x4a,0x39,0x47,0x4a,0x39,0x47,0x49,0x38,0x45,0x78,0x76, 0x86,0xc1,0xc7,0xd6,0x52,0x4f,0x7a,0x69,0x75,0x9a,0x89,0x93,0xb0,0x90,0x99,0xb4, 0x91,0x9a,0xb5,0x91,0x9b,0xb5,0x95,0x9f,0xb9,0x95,0x9f,0xb9,0x95,0x9f,0xb9,0x92, 0x9b,0xb7,0x90,0x99,0xb4,0x88,0x92,0xb0,0x5b,0x67,0x8e,0x5e,0x6a,0x91,0x7c,0x81, 0x8f,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,0x61,0x4d,0x60,0x60,0x4c,0x5f,0x80,0x74,0x85,0x83, 0x8e,0xac,0x73,0x7e,0xa1,0x8a,0x93,0xb1,0x91,0x9a,0xb5,0x86,0x91,0xaf,0x7a,0x84, 0xa5,0xf0,0xf1,0xf5,0xed,0xef,0xf2,0xe0,0xe2,0xea,0xc6,0xcb,0xd9,0xb1,0xb8,0xcb, 0x9a,0xa3,0xbc,0x88,0x92,0xb0,0x77,0x83,0xa4,0x68,0x74,0x96,0x3b,0x42,0x58,0x10, 0x12,0x19,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,0x17, 0x12,0x16,0x85,0x87,0x9a,0x8c,0x96,0xb2,0x64,0x6f,0x95,0x7a,0x85,0xa5,0x6e,0x7b, 0x9d,0x65,0x71,0x96,0x60,0x6d,0x93,0x5e,0x6b,0x92,0x5c,0x69,0x90,0x5b,0x66,0x8e, 0x58,0x64,0x8c,0x56,0x62,0x8b,0x54,0x60,0x8a,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52, 0x4f,0x7b,0x64,0x53,0x74,0x52,0x4f,0x7a,0x0c,0x0b,0x0f,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,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,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,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,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,0x04,0x04,0x05, 0x5c,0x4a,0x5c,0x4c,0x3b,0x49,0x4a,0x39,0x47,0x4a,0x39,0x47,0x4a,0x39,0x47,0x48, 0x37,0x44,0x5b,0x55,0x64,0xd0,0xd5,0xe0,0x52,0x55,0x80,0x5b,0x67,0x8e,0x86,0x91, 0xaf,0x8e,0x99,0xb4,0x94,0x9d,0xb8,0x93,0x9c,0xb7,0x95,0x9f,0xb9,0x95,0x9f,0xb9, 0x98,0xa1,0xba,0x93,0x9c,0xb7,0x90,0x99,0xb4,0x8b,0x95,0xb2,0x6e,0x7a,0x9d,0x55, 0x62,0x8b,0x83,0x8e,0xab,0x11,0x11,0x12,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,0x2d,0x23,0x2c,0x5f,0x4b,0x5d,0x5d,0x49,0x5b, 0x99,0x9e,0xb4,0x60,0x6d,0x93,0x7b,0x86,0xa7,0x83,0x8d,0xac,0x90,0x99,0xb4,0x8d, 0x98,0xb3,0x9b,0xa4,0xbc,0x6f,0x66,0x6c,0xc9,0xc5,0xc7,0xfa,0xfa,0xfc,0xe6,0xe8, 0xee,0xc9,0xce,0xdb,0xab,0xb3,0xc8,0x92,0x9b,0xb7,0x7b,0x85,0xa7,0x6d,0x79,0x9c, 0x66,0x72,0x98,0x64,0x6f,0x95,0x4a,0x52,0x6f,0x21,0x25,0x32,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,0x03,0x02,0x03,0x72,0x6e,0x7f,0x94,0x9d,0xb8,0x5f,0x6b,0x92,0x73, 0x7e,0xa1,0x71,0x7c,0xa0,0x66,0x72,0x98,0x60,0x6c,0x93,0x5e,0x6b,0x92,0x5c,0x69, 0x90,0x5b,0x67,0x90,0x58,0x64,0x8c,0x56,0x63,0x8b,0x55,0x60,0x8a,0x53,0x5f,0x89, 0x52,0x5d,0x88,0x52,0x50,0x7c,0x64,0x4f,0x6e,0x52,0x4f,0x7a,0x23,0x20,0x2d,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,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,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,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,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,0x2c,0x24,0x2d,0x50,0x3e,0x4d,0x4a,0x39,0x47,0x4a,0x39,0x47, 0x49,0x38,0x46,0x48,0x37,0x44,0x49,0x3d,0x4a,0xbc,0xc2,0xd2,0x5a,0x65,0x8d,0x53, 0x5e,0x88,0x81,0x8b,0xab,0x8e,0x99,0xb4,0x91,0x9b,0xb5,0x95,0x9f,0xb9,0x95,0x9f, 0xb9,0x95,0x9f,0xb9,0x98,0xa1,0xba,0x94,0x9d,0xb8,0x92,0x9b,0xb7,0x8a,0x94,0xb1, 0x81,0x8b,0xab,0x54,0x5f,0x89,0x6b,0x76,0x9b,0x56,0x58,0x5c,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,0x03,0x03,0x03,0x64,0x50,0x64,0x64,0x50, 0x64,0x7d,0x72,0x83,0x66,0x72,0x98,0x6b,0x77,0x9b,0x81,0x8b,0xaa,0x80,0x8b,0xaa, 0x86,0x91,0xaf,0x9a,0xa3,0xbc,0xc4,0xc4,0xca,0x34,0x27,0x2f,0x39,0x2b,0x34,0x7f, 0x75,0x7b,0xed,0xec,0xed,0xf1,0xf2,0xf6,0xcb,0xd0,0xdd,0xac,0xb4,0xc9,0x94,0x9d, 0xb8,0x7e,0x89,0xa9,0x6b,0x76,0x9b,0x62,0x6d,0x94,0x5c,0x67,0x90,0x5c,0x67,0x90, 0x56,0x62,0x87,0x31,0x37,0x4c,0x0a,0x0b,0x10,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,0x50,0x4b,0x58,0x9f,0xa8,0xbf, 0x5e,0x6b,0x92,0x69,0x74,0x9a,0x72,0x7d,0xa0,0x65,0x72,0x98,0x60,0x6c,0x93,0x5e, 0x6b,0x92,0x5c,0x69,0x90,0x5b,0x67,0x90,0x5a,0x65,0x8d,0x56,0x63,0x8b,0x56,0x62, 0x8b,0x54,0x5f,0x89,0x53,0x5d,0x88,0x52,0x55,0x80,0x64,0x4d,0x6b,0x52,0x4f,0x7a, 0x35,0x30,0x44,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,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,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,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,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,0x07,0x06,0x08,0x61,0x4d,0x60,0x4c,0x3b, 0x48,0x4a,0x39,0x47,0x49,0x38,0x46,0x48,0x37,0x44,0x41,0x31,0x3c,0xb6,0xba,0xc9, 0x5e,0x6b,0x92,0x52,0x4f,0x7b,0x80,0x8a,0xaa,0x8c,0x95,0xb2,0x94,0x9d,0xb8,0x95, 0x9f,0xb9,0x98,0xa1,0xba,0x95,0x9f,0xb9,0x95,0x9f,0xb9,0x95,0x9f,0xb9,0x92,0x9b, 0xb7,0x8c,0x95,0xb2,0x88,0x92,0xb0,0x5e,0x6b,0x92,0x58,0x64,0x8c,0x76,0x7c,0x8f, 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,0x47,0x3a,0x48,0x6f, 0x5b,0x71,0x70,0x5b,0x72,0x9e,0xa3,0xb9,0x56,0x63,0x8b,0x7d,0x88,0xa8,0x80,0x8a, 0xaa,0x7b,0x86,0xa7,0x77,0x83,0xa4,0xba,0xc1,0xd1,0x90,0x88,0x8d,0x36,0x28,0x30, 0x3a,0x2c,0x36,0x42,0x32,0x3d,0x55,0x45,0x52,0xb6,0xae,0xb5,0xf6,0xf7,0xf9,0xcb, 0xd0,0xdd,0xa8,0xb0,0xc6,0x8e,0x98,0xb4,0x7c,0x86,0xa7,0x6e,0x7a,0x9d,0x60,0x6d, 0x93,0x5b,0x66,0x8e,0x56,0x62,0x8b,0x54,0x5f,0x89,0x52,0x5d,0x83,0x40,0x49,0x67, 0x1e,0x23,0x30,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,0x26,0x21, 0x28,0xa0,0xa9,0xc0,0x6e,0x7a,0x9d,0x5e,0x6a,0x92,0x6e,0x7b,0x9d,0x67,0x73,0x99, 0x60,0x6c,0x93,0x5e,0x6b,0x92,0x5d,0x6a,0x91,0x5c,0x69,0x90,0x5a,0x65,0x8d,0x56, 0x63,0x8b,0x56,0x62,0x8b,0x54,0x5f,0x89,0x53,0x5e,0x89,0x52,0x5c,0x86,0x64,0x4c, 0x69,0x52,0x4f,0x7a,0x43,0x3e,0x59,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,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,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,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,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,0x4b, 0x3d,0x4c,0x4f,0x3e,0x4c,0x49,0x38,0x46,0x48,0x37,0x44,0x48,0x37,0x44,0x46,0x36, 0x42,0x95,0x95,0xa4,0x6b,0x77,0x9b,0x52,0x4f,0x7b,0x71,0x7c,0xa0,0x8a,0x94,0xb1, 0x92,0x9c,0xb7,0x91,0x9b,0xb5,0x95,0x9f,0xb9,0x98,0xa1,0xba,0x95,0x9f,0xb9,0x94, 0x9d,0xb8,0x93,0x9c,0xb7,0x8e,0x99,0xb4,0x89,0x93,0xb0,0x72,0x7d,0xa0,0x53,0x5e, 0x88,0x7c,0x87,0xa6,0x1a,0x1b,0x1c,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,0x05,0x04,0x05, 0x6f,0x5a,0x71,0x73,0x5e,0x76,0x88,0x7b,0x91,0x5f,0x6b,0x92,0x62,0x6e,0x94,0x86, 0x91,0xaf,0x7c,0x86,0xa7,0x74,0x80,0xa2,0x69,0x75,0x9a,0xde,0xe0,0xe8,0x5d,0x4f, 0x59,0x4a,0x39,0x46,0x4e,0x3d,0x4b,0x51,0x3f,0x4e,0x57,0x45,0x55,0x5c,0x49,0x5b, 0x83,0x73,0x83,0xdb,0xd8,0xde,0xbe,0xc3,0xd3,0x9f,0xa7,0xbf,0x81,0x8b,0xaa,0x6f, 0x7b,0x9f,0x62,0x6d,0x94,0x5b,0x67,0x8e,0x57,0x63,0x8c,0x54,0x60,0x8a,0x52,0x5d, 0x86,0x52,0x4f,0x7b,0x57,0x50,0x79,0x4a,0x4c,0x72,0x31,0x38,0x52,0x17,0x1a,0x26, 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,0x03,0x02,0x03,0x9f,0xa6,0xbe,0x7b,0x85,0xa7,0x57,0x63,0x8c,0x6a,0x75, 0x9a,0x66,0x72,0x98,0x60,0x6c,0x93,0x5f,0x6b,0x92,0x5c,0x69,0x90,0x5c,0x69,0x90, 0x5a,0x65,0x8d,0x58,0x64,0x8d,0x56,0x62,0x8b,0x54,0x5f,0x89,0x53,0x5f,0x89,0x52, 0x5d,0x88,0x64,0x4f,0x6e,0x54,0x50,0x79,0x4b,0x47,0x66,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,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,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,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,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,0x17,0x13,0x18,0x55,0x42,0x52,0x48,0x37,0x44,0x48,0x37,0x44,0x48, 0x37,0x44,0x47,0x37,0x44,0x75,0x71,0x80,0x83,0x8d,0xac,0x52,0x50,0x7b,0x64,0x6f, 0x95,0x84,0x8e,0xad,0x8d,0x98,0xb3,0x96,0xa0,0xba,0x95,0x9f,0xb9,0x95,0x9f,0xb9, 0x98,0xa1,0xba,0x96,0xa0,0xb9,0x93,0x9c,0xb7,0x90,0x99,0xb4,0x89,0x93,0xb0,0x82, 0x8c,0xab,0x55,0x60,0x8a,0x69,0x74,0x99,0x57,0x59,0x61,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,0x36,0x2b,0x36,0x6d,0x59,0x6f,0x74,0x5f,0x77,0x9e,0xa3,0xba,0x52,0x5d,0x86, 0x83,0x8d,0xac,0x83,0x8d,0xac,0x7c,0x88,0xa8,0x6f,0x7c,0x9f,0x6e,0x7a,0x9d,0xc0, 0xbf,0xc4,0x46,0x38,0x46,0x6a,0x55,0x6b,0x6f,0x5a,0x71,0x70,0x5b,0x72,0x70,0x5b, 0x72,0x73,0x5e,0x75,0x72,0x5d,0x74,0x75,0x60,0x78,0xae,0xa3,0xb0,0xca,0xcd,0xda, 0xa4,0xac,0xc3,0x85,0x90,0xad,0x6b,0x76,0x9b,0x63,0x6e,0x95,0x5d,0x69,0x91,0x57, 0x64,0x8c,0x56,0x62,0x8b,0x56,0x62,0x8b,0x52,0x57,0x82,0x57,0x50,0x79,0x55,0x50, 0x79,0x52,0x54,0x80,0x4d,0x55,0x7c,0x37,0x3a,0x57,0x1b,0x1c,0x2a,0x02,0x02,0x03, 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,0x8f,0x96,0xad,0x89,0x93,0xb0,0x54, 0x5f,0x89,0x60,0x6d,0x93,0x65,0x72,0x98,0x60,0x6d,0x93,0x5d,0x6a,0x91,0x5c,0x67, 0x90,0x5b,0x67,0x90,0x5a,0x65,0x8d,0x57,0x64,0x8c,0x55,0x60,0x8a,0x55,0x60,0x8a, 0x54,0x5f,0x89,0x52,0x5d,0x88,0x60,0x53,0x77,0x5c,0x52,0x79,0x51,0x4f,0x73,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,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,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,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,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,0x03,0x02,0x03,0x60,0x4c,0x5f,0x49,0x38,0x45, 0x48,0x37,0x44,0x47,0x37,0x44,0x47,0x37,0x44,0x57,0x4e,0x5d,0x9d,0xa5,0xbe,0x52, 0x5d,0x88,0x5a,0x65,0x8d,0x82,0x8c,0xab,0x8d,0x98,0xb3,0x91,0x9b,0xb5,0x96,0xa0, 0xb9,0x96,0xa0,0xb9,0x98,0xa1,0xba,0x99,0xa2,0xbb,0x94,0x9d,0xb8,0x8e,0x99,0xb4, 0x8c,0x96,0xb3,0x88,0x92,0xb0,0x5f,0x6b,0x92,0x56,0x63,0x8b,0x83,0x89,0x9d,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,0x03,0x03,0x03,0x60,0x4c,0x5f,0x6a,0x55,0x6b,0x87,0x79,0x8e,0x5b,0x67, 0x90,0x63,0x6e,0x95,0x88,0x92,0xb0,0x82,0x8c,0xab,0x7c,0x86,0xa8,0x69,0x75,0x9a, 0x7e,0x89,0xa9,0x69,0x69,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x18,0x1e,0x55, 0x4a,0x5f,0x6d,0x62,0x80,0x69,0x67,0x8a,0x68,0x66,0x8b,0x73,0x69,0x8a,0x78,0x68, 0x85,0x87,0x74,0x8a,0xbc,0xb8,0xc4,0xb2,0xb9,0xcb,0x8c,0x95,0xb2,0x6c,0x77,0x9b, 0x60,0x6c,0x93,0x5c,0x69,0x90,0x58,0x65,0x8d,0x56,0x63,0x8b,0x55,0x62,0x8b,0x53, 0x5f,0x89,0x52,0x52,0x7c,0x5a,0x52,0x79,0x52,0x50,0x7b,0x52,0x5a,0x84,0x52,0x56, 0x81,0x49,0x4b,0x71,0x23,0x24,0x35,0x03,0x03,0x04,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,0x6e,0x74,0x8a, 0x8e,0x98,0xb3,0x55,0x60,0x8a,0x5a,0x66,0x8e,0x65,0x71,0x96,0x5f,0x6c,0x93,0x5d, 0x6a,0x91,0x5c,0x69,0x90,0x5b,0x66,0x8e,0x5a,0x66,0x8e,0x57,0x63,0x8c,0x56,0x62, 0x8b,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x4f,0x7a,0x5e,0x53,0x79, 0x53,0x53,0x7c,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,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,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,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,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,0x5f,0x4d, 0x61,0x4d,0x3c,0x4a,0x47,0x37,0x44,0x48,0x37,0x44,0x46,0x36,0x42,0x47,0x38,0x46, 0xb2,0xb9,0xcc,0x57,0x63,0x8c,0x52,0x58,0x84,0x7d,0x88,0xa8,0x8d,0x98,0xb3,0x92, 0x9c,0xb7,0x94,0x9f,0xb8,0x95,0x9f,0xb9,0x99,0xa2,0xbb,0x98,0xa1,0xbb,0x94,0x9d, 0xb8,0x91,0x9b,0xb5,0x8e,0x99,0xb4,0x88,0x92,0xb0,0x73,0x7e,0xa1,0x52,0x55,0x81, 0x83,0x8d,0xac,0x24,0x24,0x25,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,0x22,0x1b,0x21,0x55,0x42,0x52,0x60,0x4c,0x5f,0x9a, 0x9e,0xb5,0x52,0x55,0x81,0x7c,0x88,0xa8,0x83,0x8e,0xac,0x80,0x8a,0xaa,0x7c,0x88, 0xa8,0x65,0x72,0x96,0xa1,0xa9,0xc1,0x21,0x21,0x22,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x17,0x43,0x47,0x5f,0x67, 0x70,0x93,0x69,0x73,0x97,0x68,0x69,0x8f,0x78,0x69,0x86,0x99,0x8a,0x9a,0xbe,0xc0, 0xcc,0x96,0xa0,0xb9,0x6f,0x7b,0x9f,0x62,0x6d,0x94,0x5e,0x6a,0x91,0x58,0x65,0x8d, 0x57,0x63,0x8c,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x56,0x81,0x54, 0x50,0x79,0x5d,0x52,0x79,0x52,0x4f,0x7b,0x52,0x55,0x81,0x37,0x36,0x56,0x1f,0x1f, 0x2f,0x05,0x05,0x07,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,0x3f,0x45,0x54,0x93,0x9c,0xb8,0x5d,0x6a,0x91,0x52,0x5b,0x85,0x65,0x71,0x96, 0x5f,0x6c,0x93,0x5c,0x69,0x90,0x5c,0x67,0x90,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x58, 0x64,0x8c,0x56,0x63,0x8b,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x50, 0x7b,0x60,0x53,0x77,0x52,0x55,0x80,0x06,0x06,0x07,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,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,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,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,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,0x30,0x2a,0x35,0x54,0x42,0x51,0x48,0x37,0x44,0x47,0x37,0x44,0x47,0x37, 0x44,0x44,0x34,0x40,0x9d,0xa0,0xb3,0x5d,0x6a,0x91,0x52,0x52,0x7c,0x77,0x83,0xa4, 0x89,0x93,0xb0,0x91,0x9a,0xb5,0x95,0x9f,0xb9,0x95,0x9f,0xb9,0x99,0xa2,0xbb,0x94, 0x9d,0xb8,0x95,0x9f,0xb9,0x92,0x9b,0xb7,0x8e,0x99,0xb4,0x8a,0x94,0xb1,0x80,0x8a, 0xaa,0x52,0x5d,0x88,0x6d,0x7a,0x9d,0x65,0x67,0x6e,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,0x45,0x34,0x40,0x4e,0x3c,0x4a, 0x71,0x64,0x75,0x54,0x5f,0x89,0x5b,0x66,0x8e,0x82,0x8c,0xab,0x83,0x8e,0xac,0x7c, 0x86,0xa7,0x76,0x82,0xa3,0x65,0x72,0x96,0xb2,0xb4,0xc6,0x0b,0x0b,0x0f,0x08,0x08, 0x0b,0x04,0x04,0x05,0x02,0x02,0x02,0x00,0x00,0x00,0x06,0x05,0x07,0x0a,0x0a,0x0d, 0x04,0x04,0x06,0x00,0x00,0x00,0x2e,0x32,0x40,0x68,0x72,0x8f,0x70,0x7b,0x9c,0x68, 0x67,0x8c,0x7b,0x67,0x7e,0xa7,0x9f,0xac,0x9c,0xa6,0xbe,0x72,0x7d,0xa0,0x5f,0x6c, 0x93,0x58,0x65,0x8d,0x5a,0x65,0x8d,0x57,0x64,0x8c,0x56,0x62,0x8b,0x54,0x5f,0x89, 0x54,0x5f,0x89,0x52,0x5d,0x86,0x52,0x50,0x7b,0x60,0x53,0x77,0x62,0x53,0x77,0x55, 0x50,0x79,0x46,0x45,0x6c,0x41,0x40,0x63,0x25,0x23,0x38,0x06,0x06,0x09,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,0x12,0x14,0x19,0x93,0x9c,0xb8,0x6c,0x77,0x9c,0x52,0x52, 0x7d,0x62,0x6d,0x94,0x60,0x6c,0x93,0x5c,0x69,0x90,0x5b,0x67,0x90,0x5a,0x66,0x8e, 0x58,0x64,0x8d,0x57,0x63,0x8c,0x56,0x62,0x8b,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53, 0x5e,0x88,0x52,0x55,0x80,0x60,0x53,0x77,0x52,0x56,0x81,0x19,0x17,0x20,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,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,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,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,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,0x0c,0x0b,0x0f,0x5c,0x49,0x5b,0x47,0x37,0x44,0x46, 0x36,0x42,0x46,0x36,0x42,0x45,0x35,0x41,0x80,0x80,0x91,0x6b,0x77,0x9b,0x52,0x52, 0x7d,0x6b,0x76,0x9b,0x88,0x92,0xaf,0x8d,0x98,0xb3,0x93,0x9c,0xb7,0x96,0xa0,0xb9, 0x95,0x9f,0xb9,0x98,0xa1,0xba,0x93,0x9c,0xb7,0x95,0x9f,0xb9,0x92,0x9c,0xb7,0x8b, 0x94,0xb2,0x85,0x90,0xad,0x5d,0x6a,0x91,0x58,0x64,0x8c,0x90,0x96,0xa9,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,0x15,0x10,0x14,0x47,0x36, 0x43,0x4e,0x3c,0x4a,0x83,0x8a,0xa5,0x52,0x4f,0x7b,0x6d,0x79,0x9c,0x83,0x8d,0xac, 0x7d,0x88,0xa8,0x7d,0x88,0xa8,0x71,0x7d,0xa0,0x74,0x80,0xa2,0x8f,0x8c,0x95,0x09, 0x09,0x0d,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x06,0x02,0x02,0x03,0x04,0x04, 0x05,0x05,0x04,0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x1c,0x1e,0x25,0x58,0x5e,0x71,0x6f,0x78,0x96,0x68,0x68,0x8d,0x8a,0x79,0x8f,0x9c, 0x9d,0xb2,0x7c,0x88,0xa8,0x5c,0x69,0x90,0x54,0x5f,0x8a,0x57,0x63,0x8c,0x57,0x63, 0x8c,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x89,0x52,0x5d,0x86,0x52,0x5b,0x85, 0x52,0x4f,0x7a,0x64,0x4f,0x6e,0x63,0x4b,0x67,0x64,0x53,0x76,0x52,0x4f,0x7a,0x51, 0x4e,0x7a,0x32,0x30,0x4b,0x07,0x07,0x0a,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,0x8b,0x94,0xb0,0x74, 0x80,0xa2,0x52,0x50,0x7c,0x5c,0x67,0x90,0x5e,0x6a,0x92,0x5b,0x67,0x90,0x5b,0x66, 0x8e,0x5a,0x65,0x8d,0x58,0x64,0x8d,0x57,0x63,0x8c,0x56,0x62,0x8b,0x55,0x60,0x8a, 0x54,0x5f,0x89,0x53,0x5f,0x89,0x52,0x56,0x82,0x64,0x53,0x76,0x52,0x55,0x81,0x2a, 0x26,0x36,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,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,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,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,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,0x66,0x52,0x66, 0x49,0x38,0x45,0x47,0x37,0x44,0x46,0x36,0x42,0x45,0x35,0x41,0x62,0x5e,0x6e,0x88, 0x92,0xb0,0x53,0x5d,0x88,0x60,0x6c,0x93,0x83,0x8d,0xac,0x8d,0x96,0xb3,0x94,0x9d, 0xb8,0x92,0x9b,0xb7,0x95,0x9f,0xb9,0x98,0xa1,0xba,0x96,0xa0,0xb9,0x95,0x9f,0xb9, 0x91,0x9b,0xb5,0x8c,0x95,0xb2,0x86,0x91,0xaf,0x72,0x7d,0xa0,0x53,0x5f,0x89,0x88, 0x92,0xb0,0x2c,0x2c,0x2c,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,0x44, 0x34,0x40,0x4a,0x39,0x47,0x6d,0x60,0x6f,0x52,0x5c,0x86,0x57,0x63,0x8c,0x79,0x83, 0xa4,0x7d,0x88,0xa8,0x7b,0x86,0xa7,0x7d,0x88,0xa8,0x67,0x73,0x98,0x95,0x9f,0xb9, 0x3c,0x3c,0x3d,0x02,0x02,0x03,0x04,0x04,0x05,0x08,0x08,0x0b,0x08,0x09,0x0c,0x05, 0x05,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x05,0x06,0x07,0x03,0x04,0x04,0x37,0x3a,0x43, 0x6e,0x76,0x8d,0x6c,0x77,0x9a,0x98,0x94,0xad,0x8c,0x95,0xb0,0x6c,0x77,0x9c,0x53, 0x5e,0x88,0x57,0x63,0x8c,0x57,0x63,0x8c,0x56,0x62,0x8b,0x53,0x5e,0x88,0x52,0x5d, 0x88,0x52,0x5d,0x86,0x52,0x5a,0x84,0x52,0x57,0x82,0x52,0x4f,0x7a,0x64,0x53,0x75, 0x64,0x52,0x72,0x64,0x4c,0x69,0x64,0x53,0x75,0x52,0x4f,0x7a,0x2a,0x28,0x40,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, 0x77,0x7f,0x9d,0x7b,0x86,0xa7,0x52,0x56,0x82,0x55,0x60,0x8a,0x5e,0x6a,0x91,0x5b, 0x67,0x8e,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x57,0x64,0x8c,0x58,0x64,0x8c,0x56,0x62, 0x8b,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x5d,0x86,0x64,0x52,0x71, 0x52,0x52,0x7d,0x38,0x35,0x4b,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,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,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,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,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,0x4a,0x3c,0x4b,0x4c,0x3b,0x49,0x46,0x36,0x42,0x46,0x36,0x42,0x46,0x35,0x41, 0x4d,0x43,0x51,0xa1,0xa9,0xc0,0x55,0x60,0x8a,0x56,0x62,0x8b,0x80,0x8b,0xaa,0x8b, 0x94,0xb1,0x90,0x99,0xb4,0x93,0x9c,0xb7,0x96,0xa0,0xba,0x95,0x9f,0xb9,0x94,0x9d, 0xb8,0x95,0x9f,0xb9,0x90,0x9a,0xb5,0x8c,0x96,0xb2,0x88,0x92,0xb0,0x80,0x8a,0xaa, 0x5a,0x66,0x8e,0x6f,0x7b,0x9f,0x6e,0x70,0x76,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, 0x1b,0x15,0x19,0x47,0x36,0x43,0x4e,0x3c,0x4a,0x86,0x8e,0xa7,0x52,0x50,0x7b,0x64, 0x71,0x96,0x7a,0x84,0xa5,0x7c,0x88,0xa8,0x7a,0x85,0xa7,0x7d,0x89,0xa9,0x5c,0x67, 0x90,0xb2,0xb6,0xc8,0x21,0x1b,0x21,0x0e,0x0c,0x0e,0x07,0x06,0x07,0x02,0x02,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x08,0x12,0x13, 0x17,0x0d,0x0e,0x10,0x03,0x03,0x03,0x02,0x02,0x02,0x6a,0x71,0x83,0x7c,0x87,0xa5, 0xa5,0xa6,0xbc,0x80,0x8a,0xaa,0x57,0x63,0x8c,0x52,0x5c,0x86,0x53,0x5e,0x89,0x54, 0x5f,0x89,0x54,0x5f,0x89,0x52,0x5d,0x86,0x52,0x5c,0x86,0x52,0x57,0x83,0x52,0x55, 0x80,0x52,0x54,0x7e,0x52,0x50,0x7b,0x5a,0x52,0x79,0x64,0x4f,0x6e,0x63,0x4b,0x67, 0x5f,0x53,0x77,0x33,0x31,0x4f,0x21,0x21,0x34,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,0x58,0x5f,0x79,0x77,0x83,0xa4,0x57,0x63,0x8c,0x52,0x54,0x80, 0x5c,0x67,0x90,0x5a,0x65,0x8d,0x58,0x64,0x8d,0x58,0x64,0x8c,0x57,0x64,0x8c,0x56, 0x62,0x8b,0x55,0x62,0x8b,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x89,0x52,0x5d, 0x88,0x64,0x50,0x71,0x52,0x52,0x7c,0x43,0x40,0x5c,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,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,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,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,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,0x1a,0x15,0x1b,0x53,0x41,0x50,0x47,0x37,0x43,0x45,0x35, 0x41,0x45,0x35,0x41,0x42,0x33,0x3f,0xa4,0xac,0xc0,0x5e,0x6b,0x92,0x52,0x5d,0x86, 0x80,0x8b,0xaa,0x89,0x93,0xb0,0x8e,0x98,0xb3,0x93,0x9c,0xb7,0x92,0x9b,0xb7,0x95, 0x9f,0xb9,0x98,0xa1,0xba,0x95,0x9f,0xb9,0x91,0x9b,0xb5,0x8e,0x99,0xb4,0x8a,0x94, 0xb1,0x83,0x8e,0xac,0x5e,0x6a,0x91,0x5e,0x6b,0x92,0x8f,0x96,0xa9,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,0x02,0x02,0x02,0x47,0x37,0x44,0x4b,0x3a,0x47,0x6c,0x60,0x6e,0x55,0x60,0x8a, 0x53,0x5f,0x89,0x6c,0x77,0x9b,0x7b,0x85,0xa7,0x7b,0x86,0xa7,0x7c,0x88,0xa8,0x74, 0x80,0xa2,0x66,0x73,0x98,0xa7,0xa6,0xaf,0x05,0x04,0x05,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,0x2b,0x2c,0x31,0x7d,0x85,0x9c,0x89,0x92,0xae,0x8b,0x92,0xae,0x58,0x64,0x8d, 0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x5a,0x84,0x52,0x5d,0x88,0x52,0x5b,0x85,0x52, 0x5b,0x85,0x52,0x56,0x81,0x52,0x53,0x7e,0x52,0x53,0x7d,0x52,0x54,0x7e,0x52,0x55, 0x81,0x52,0x4f,0x7a,0x64,0x53,0x73,0x62,0x53,0x77,0x3d,0x42,0x64,0x29,0x2c,0x46, 0x20,0x23,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x42,0x54,0x7a,0x84,0xa5,0x5e,0x6a, 0x92,0x52,0x4f,0x7a,0x5a,0x65,0x8d,0x58,0x64,0x8d,0x57,0x63,0x8c,0x57,0x63,0x8c, 0x56,0x62,0x8b,0x56,0x62,0x8b,0x56,0x62,0x8b,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53, 0x5e,0x88,0x53,0x5e,0x88,0x64,0x53,0x74,0x52,0x50,0x7b,0x4b,0x4a,0x6a,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,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,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,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,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,0x05,0x04,0x05,0x5d,0x49,0x5b,0x45, 0x35,0x41,0x46,0x36,0x42,0x44,0x34,0x40,0x3f,0x30,0x3a,0x8d,0x90,0xa3,0x6a,0x75, 0x9a,0x52,0x57,0x82,0x6f,0x7c,0x9f,0x88,0x92,0xb0,0x8e,0x99,0xb4,0x91,0x9b,0xb5, 0x95,0x9f,0xb9,0x99,0xa2,0xbb,0x96,0xa0,0xb9,0x94,0x9d,0xb8,0x93,0x9d,0xb8,0x91, 0x9b,0xb5,0x8c,0x95,0xb2,0x85,0x90,0xad,0x6e,0x7a,0x9d,0x55,0x60,0x8a,0x90,0x99, 0xb4,0x2d,0x2d,0x2d,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,0x15,0x10,0x13,0x49,0x39,0x46,0x50,0x3e,0x4d,0x97,0x9b, 0xb1,0x52,0x4f,0x7b,0x60,0x6d,0x94,0x6e,0x7a,0x9d,0x7a,0x84,0xa5,0x7c,0x86,0xa7, 0x80,0x8a,0xaa,0x67,0x74,0x99,0x81,0x8b,0xaa,0x64,0x64,0x66,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,0x15,0x16,0x19,0x59,0x5f, 0x71,0x8a,0x93,0xaf,0x6d,0x79,0x9c,0x52,0x52,0x7d,0x5d,0x52,0x79,0x52,0x50,0x7b, 0x52,0x5c,0x86,0x52,0x58,0x83,0x52,0x55,0x81,0x52,0x56,0x81,0x52,0x54,0x7e,0x52, 0x57,0x82,0x52,0x5c,0x86,0x53,0x5e,0x88,0x54,0x5f,0x89,0x52,0x5b,0x85,0x52,0x4f, 0x7a,0x45,0x4e,0x74,0x33,0x37,0x52,0x29,0x2c,0x44,0x11,0x10,0x19,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x15,0x1a,0x7a, 0x85,0xa5,0x6b,0x76,0x9b,0x52,0x4f,0x7a,0x56,0x62,0x8b,0x57,0x64,0x8c,0x57,0x63, 0x8c,0x56,0x62,0x8b,0x55,0x62,0x8b,0x55,0x62,0x8b,0x56,0x62,0x8b,0x54,0x5f,0x89, 0x54,0x5f,0x89,0x53,0x5e,0x88,0x53,0x5e,0x88,0x64,0x53,0x75,0x52,0x4f,0x7a,0x50, 0x52,0x75,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,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,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,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,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, 0x49,0x3b,0x49,0x49,0x38,0x45,0x44,0x34,0x40,0x46,0x35,0x41,0x40,0x30,0x3b,0x6b, 0x6a,0x7c,0x77,0x83,0xa4,0x52,0x56,0x81,0x62,0x6d,0x94,0x8a,0x93,0xb1,0x8a,0x94, 0xb1,0x91,0x9a,0xb5,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x96,0xa0,0xb9,0x98,0xa1,0xba, 0x94,0x9d,0xb8,0x8d,0x98,0xb3,0x8d,0x98,0xb3,0x86,0x91,0xaf,0x7c,0x86,0xa8,0x57, 0x64,0x8c,0x7b,0x86,0xa7,0x75,0x77,0x7a,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,0x42,0x32,0x3e,0x4f,0x3d,0x4b,0x70, 0x61,0x70,0x55,0x60,0x8a,0x53,0x5e,0x88,0x66,0x72,0x98,0x6c,0x77,0x9c,0x76,0x82, 0xa3,0x7b,0x86,0xa7,0x7d,0x89,0xa9,0x58,0x64,0x8d,0x96,0xa0,0xba,0x1e,0x1e,0x1e, 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,0x03,0x04,0x04,0x44,0x47,0x53,0x82,0x89,0xa8,0x58,0x64, 0x8d,0x54,0x50,0x79,0x57,0x50,0x79,0x52,0x50,0x7b,0x52,0x54,0x80,0x52,0x57,0x83, 0x52,0x5b,0x85,0x52,0x5d,0x88,0x55,0x60,0x8a,0x57,0x64,0x8c,0x5d,0x69,0x91,0x65, 0x71,0x96,0x67,0x74,0x99,0x55,0x60,0x8a,0x55,0x61,0x88,0x38,0x3d,0x59,0x28,0x23, 0x3b,0x0d,0x0a,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x76,0x82,0xa2,0x6d,0x7a,0x9d,0x52,0x5a,0x84,0x52,0x5c,0x85,0x57, 0x63,0x8c,0x56,0x62,0x8b,0x55,0x60,0x8a,0x55,0x60,0x8a,0x54,0x60,0x8a,0x55,0x60, 0x8a,0x54,0x5f,0x89,0x54,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5e,0x88,0x62,0x53,0x77, 0x52,0x4f,0x7a,0x52,0x57,0x7d,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,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,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,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,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,0x1f,0x19,0x20,0x4e,0x3d,0x4b,0x44,0x34,0x40,0x46,0x36,0x42, 0x42,0x33,0x3e,0x53,0x4e,0x5e,0x89,0x93,0xb0,0x52,0x5a,0x84,0x5d,0x69,0x91,0x84, 0x8e,0xad,0x8b,0x94,0xb1,0x8e,0x99,0xb4,0x92,0x9c,0xb7,0x95,0x9f,0xb9,0x98,0xa1, 0xba,0x95,0x9f,0xb9,0x95,0x9f,0xb9,0x91,0x9b,0xb5,0x8e,0x99,0xb4,0x8a,0x93,0xb1, 0x84,0x8e,0xad,0x5b,0x67,0x90,0x66,0x72,0x98,0x96,0x9c,0xac,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,0x07,0x05,0x06,0x4c,0x3b,0x48, 0x54,0x42,0x52,0x9f,0xa2,0xb7,0x52,0x54,0x7e,0x5c,0x67,0x90,0x64,0x71,0x96,0x6b, 0x77,0x9b,0x77,0x83,0xa4,0x7a,0x85,0xa5,0x75,0x81,0xa2,0x5e,0x6a,0x91,0x9d,0xa1, 0xaf,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,0x03, 0x03,0x04,0x5d,0x5d,0x6d,0x6a,0x72,0x97,0x52,0x52,0x7d,0x5a,0x52,0x79,0x53,0x4f, 0x7a,0x52,0x54,0x80,0x52,0x5d,0x86,0x54,0x5f,0x89,0x58,0x64,0x8d,0x5e,0x6b,0x92, 0x69,0x74,0x99,0x74,0x80,0xa2,0x7e,0x89,0xa9,0x7e,0x89,0xa9,0x67,0x73,0x99,0x52, 0x55,0x81,0x40,0x2f,0x44,0x2e,0x20,0x32,0x16,0x12,0x1a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x7d,0x9b,0x6f,0x7b,0x9f,0x54,0x5f,0x89, 0x52,0x50,0x7b,0x55,0x62,0x8b,0x55,0x60,0x8a,0x54,0x5f,0x89,0x54,0x5f,0x89,0x54, 0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x53,0x5f,0x89,0x52,0x5d, 0x88,0x5e,0x52,0x79,0x58,0x50,0x79,0x53,0x5c,0x86,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,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,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,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,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,0x06,0x05,0x06,0x54,0x42,0x51,0x44,0x34, 0x40,0x46,0x35,0x41,0x43,0x33,0x3e,0x42,0x38,0x44,0x96,0xa0,0xba,0x55,0x62,0x8a, 0x56,0x62,0x8b,0x7e,0x89,0xa9,0x88,0x92,0xb0,0x8d,0x98,0xb3,0x91,0x9b,0xb5,0x94, 0x9d,0xb8,0x94,0x9d,0xb8,0x99,0xa2,0xbb,0x95,0x9f,0xb9,0x94,0x9d,0xb8,0x91,0x9a, 0xb5,0x89,0x93,0xb0,0x85,0x90,0xad,0x69,0x75,0x9a,0x57,0x63,0x8b,0x92,0x9c,0xb7, 0x2d,0x2d,0x2d,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,0x2c,0x22, 0x29,0x51,0x3f,0x4e,0x74,0x66,0x76,0x5e,0x6a,0x91,0x53,0x5e,0x88,0x62,0x6d,0x94, 0x62,0x6e,0x94,0x6c,0x79,0x9c,0x74,0x80,0xa1,0x7c,0x88,0xa8,0x6a,0x76,0x9a,0x6d, 0x79,0x9c,0x6f,0x71,0x77,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,0x15,0x14,0x16,0x7b,0x7a,0x93,0x55, 0x60,0x8a,0x55,0x50,0x79,0x5b,0x52,0x79,0x52,0x50,0x7b,0x57,0x63,0x8c,0x5e,0x6a, 0x91,0x65,0x72,0x98,0x71,0x7c,0xa0,0x80,0x8b,0xaa,0x89,0x93,0xb0,0x83,0x8d,0xac, 0x6c,0x79,0x9c,0x52,0x5c,0x86,0x57,0x3f,0x5a,0x34,0x23,0x35,0x2c,0x1e,0x30,0x2c, 0x23,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x6e,0x86,0x7b,0x86, 0xa7,0x58,0x65,0x8d,0x57,0x50,0x79,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x88, 0x54,0x5f,0x89,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x53,0x5f,0x89,0x53, 0x5e,0x89,0x53,0x5e,0x89,0x58,0x50,0x79,0x5d,0x52,0x79,0x52,0x5d,0x88,0x0a,0x0a, 0x0e,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,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,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,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,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,0x51, 0x41,0x50,0x47,0x37,0x43,0x45,0x35,0x41,0x44,0x34,0x40,0x3a,0x2c,0x35,0x96,0x9d, 0xb5,0x60,0x6d,0x94,0x52,0x5d,0x86,0x74,0x80,0xa1,0x86,0x91,0xaf,0x8b,0x95,0xb2, 0x91,0x9a,0xb5,0x93,0x9c,0xb7,0x95,0x9f,0xb9,0x94,0x9d,0xb8,0x95,0x9f,0xb9,0x92, 0x9b,0xb7,0x90,0x9a,0xb5,0x8c,0x95,0xb2,0x88,0x92,0xb0,0x7a,0x85,0xa7,0x54,0x5f, 0x89,0x7a,0x85,0xa5,0x7a,0x7b,0x7d,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,0x06, 0x05,0x06,0x4c,0x3b,0x49,0x55,0x43,0x52,0x99,0x9d,0xb3,0x52,0x55,0x81,0x5c,0x69, 0x90,0x5e,0x6a,0x92,0x60,0x6d,0x93,0x6b,0x76,0x9b,0x72,0x7d,0xa0,0x79,0x84,0xa5, 0x5c,0x67,0x90,0x7c,0x88,0xa8,0x34,0x35,0x37,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,0x6a,0x61,0x71,0x6e,0x75,0x97,0x53,0x5e,0x89,0x52,0x4f,0x7a,0x52, 0x50,0x7c,0x5a,0x65,0x8e,0x6b,0x77,0x9b,0x80,0x8a,0xaa,0x89,0x93,0xb0,0x8a,0x94, 0xb1,0x7b,0x86,0xa7,0x60,0x6c,0x93,0x53,0x4f,0x7a,0x64,0x52,0x72,0x53,0x3b,0x53, 0x28,0x1b,0x28,0x2c,0x1f,0x30,0x26,0x23,0x3b,0x09,0x0a,0x10,0x00,0x00,0x00,0x43, 0x45,0x56,0x81,0x8c,0xab,0x63,0x6f,0x95,0x55,0x50,0x79,0x52,0x5d,0x88,0x54,0x5f, 0x89,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53,0x5e,0x88,0x53,0x5f,0x89, 0x53,0x5f,0x89,0x53,0x5e,0x89,0x53,0x5e,0x88,0x52,0x4f,0x7a,0x62,0x53,0x77,0x52, 0x5d,0x88,0x1b,0x1a,0x23,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,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,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,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,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,0x2c,0x23,0x2c,0x49,0x38,0x45,0x44,0x34,0x40,0x44,0x34,0x40,0x3e, 0x2f,0x39,0x6e,0x72,0x8b,0x60,0x6c,0x93,0x52,0x52,0x7c,0x6c,0x77,0x9b,0x88,0x92, 0xb0,0x8a,0x94,0xb1,0x8e,0x99,0xb4,0x93,0x9c,0xb7,0x92,0x9b,0xb7,0x93,0x9c,0xb7, 0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x91,0x9a,0xb5,0x8d,0x98,0xb3,0x86,0x91,0xaf,0x83, 0x8d,0xac,0x58,0x65,0x8d,0x67,0x73,0x99,0xa8,0xac,0xb8,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,0x1f,0x18,0x1d,0x4e,0x3c,0x4a,0x77,0x6a,0x78,0x56,0x63,0x8a,0x52, 0x5d,0x88,0x5f,0x6b,0x92,0x5b,0x67,0x90,0x5f,0x6b,0x92,0x69,0x74,0x99,0x73,0x7e, 0xa1,0x6e,0x7a,0x9d,0x55,0x60,0x8a,0x86,0x90,0xac,0x03,0x03,0x03,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,0x0b,0x0a,0x0b,0x6c,0x6b,0x78, 0x7d,0x88,0xa6,0x6a,0x75,0x9a,0x5d,0x69,0x91,0x66,0x72,0x98,0x7d,0x88,0xa8,0x8c, 0x96,0xb3,0x84,0x90,0xad,0x6f,0x7b,0x9f,0x57,0x63,0x8c,0x63,0x53,0x77,0x64,0x53, 0x73,0x62,0x4a,0x65,0x57,0x3f,0x5a,0x25,0x18,0x27,0x2d,0x20,0x31,0x26,0x24,0x3d, 0x19,0x1c,0x2a,0x17,0x15,0x1c,0x89,0x93,0xae,0x6d,0x79,0x9c,0x52,0x52,0x7c,0x52, 0x55,0x80,0x53,0x5e,0x89,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e, 0x88,0x53,0x5e,0x89,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x50,0x7b, 0x64,0x53,0x74,0x52,0x5d,0x88,0x2a,0x28,0x38,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,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,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,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,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,0x11,0x0d,0x11,0x4c,0x3b,0x49,0x45,0x35,0x41, 0x44,0x34,0x40,0x40,0x31,0x3b,0x55,0x55,0x6c,0x62,0x6e,0x94,0x58,0x50,0x79,0x62, 0x6e,0x94,0x86,0x91,0xaf,0x89,0x93,0xb0,0x8d,0x98,0xb3,0x91,0x9a,0xb5,0x93,0x9c, 0xb7,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x96,0xa0,0xb9,0x92,0x9c,0xb7,0x8e,0x99,0xb4, 0x89,0x93,0xb0,0x84,0x8e,0xac,0x67,0x73,0x99,0x5a,0x66,0x8e,0x9d,0xa5,0xbf,0x2d, 0x2d,0x2d,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,0x46,0x36,0x42,0x51,0x40,0x4e,0x9c,0x9b,0xac, 0x52,0x5c,0x86,0x5f,0x6b,0x92,0x5d,0x69,0x91,0x5a,0x65,0x8d,0x5d,0x69,0x91,0x67, 0x74,0x99,0x6c,0x77,0x9b,0x5e,0x6a,0x92,0x54,0x5f,0x89,0x6d,0x73,0x84,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,0x21,0x21,0x21,0x94,0x96,0x9e,0x98,0xa1,0xbb,0x7d,0x88,0xa8, 0x6e,0x7a,0x9d,0x7e,0x89,0xa9,0x7d,0x89,0xa8,0x62,0x6e,0x94,0x52,0x53,0x7e,0x64, 0x53,0x76,0x64,0x53,0x73,0x63,0x4b,0x67,0x60,0x48,0x65,0x3d,0x2c,0x41,0x28,0x1c, 0x2c,0x2d,0x21,0x31,0x29,0x22,0x3b,0x14,0x17,0x20,0x65,0x6a,0x82,0x76,0x82,0xa3, 0x52,0x5d,0x86,0x52,0x50,0x7b,0x53,0x5e,0x89,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53, 0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e, 0x88,0x52,0x55,0x80,0x64,0x53,0x74,0x53,0x5e,0x88,0x36,0x35,0x4a,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,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,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,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,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,0x03,0x03,0x03,0x54,0x42, 0x51,0x44,0x34,0x40,0x43,0x33,0x3f,0x42,0x32,0x3e,0x4c,0x47,0x59,0x6d,0x7a,0x9d, 0x58,0x52,0x79,0x5a,0x65,0x8d,0x84,0x8e,0xad,0x89,0x93,0xb1,0x8c,0x96,0xb2,0x91, 0x9a,0xb5,0x92,0x9b,0xb7,0x96,0xa0,0xba,0x94,0x9d,0xb8,0x92,0x9c,0xb7,0x94,0x9d, 0xb8,0x90,0x99,0xb4,0x8a,0x94,0xb1,0x86,0x91,0xaf,0x74,0x80,0xa2,0x58,0x65,0x8d, 0x7c,0x88,0xa8,0x7f,0x7f,0x80,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,0x06,0x05,0x06,0x48,0x37,0x44,0x61,0x53, 0x60,0x5d,0x68,0x90,0x54,0x5f,0x89,0x63,0x6e,0x95,0x58,0x65,0x8d,0x56,0x62,0x8b, 0x5a,0x65,0x8d,0x64,0x6f,0x95,0x66,0x72,0x98,0x52,0x5c,0x86,0x58,0x64,0x8d,0x43, 0x47,0x50,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,0x54,0x54, 0x54,0xc1,0xc4,0xcd,0xa4,0xac,0xc3,0x75,0x81,0xa2,0x5b,0x67,0x8e,0x53,0x5e,0x89, 0x57,0x50,0x79,0x62,0x53,0x77,0x64,0x53,0x73,0x63,0x4b,0x67,0x60,0x48,0x65,0x5f, 0x47,0x64,0x2d,0x20,0x31,0x2d,0x20,0x31,0x2d,0x21,0x31,0x27,0x23,0x3a,0x45,0x47, 0x5d,0x7e,0x89,0xa9,0x57,0x63,0x8c,0x52,0x4f,0x7a,0x52,0x5d,0x88,0x52,0x5d,0x86, 0x52,0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53, 0x5e,0x88,0x53,0x5e,0x88,0x52,0x5a,0x84,0x63,0x53,0x77,0x52,0x5d,0x88,0x44,0x45, 0x5e,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,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,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,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,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,0x39,0x2e,0x38,0x44,0x34,0x40,0x44,0x34,0x40,0x44,0x34,0x40,0x43,0x39, 0x46,0x71,0x7c,0xa0,0x56,0x50,0x79,0x52,0x53,0x7e,0x80,0x8a,0xaa,0x88,0x92,0xb0, 0x8a,0x94,0xb1,0x90,0x9a,0xb5,0x91,0x9b,0xb5,0x95,0x9f,0xb9,0x93,0x9c,0xb7,0x94, 0x9d,0xb8,0x94,0x9d,0xb8,0x95,0x9f,0xb9,0x8c,0x96,0xb3,0x88,0x92,0xaf,0x7e,0x89, 0xa9,0x5c,0x69,0x90,0x64,0x71,0x96,0xa3,0xa8,0xb4,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,0x35,0x28,0x31,0x49, 0x38,0x45,0x90,0x8c,0x9c,0x52,0x50,0x7c,0x5f,0x6c,0x93,0x5f,0x6c,0x93,0x55,0x60, 0x8a,0x52,0x5d,0x88,0x58,0x65,0x8d,0x5d,0x6a,0x91,0x5b,0x66,0x8e,0x52,0x4f,0x7a, 0x6c,0x77,0x9c,0x14,0x15,0x17,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,0x08,0x08,0x08,0x8f,0x8f,0x8f,0xb2,0xb9,0xcc,0x69,0x74, 0x99,0x52,0x4f,0x7a,0x64,0x52,0x72,0x64,0x53,0x74,0x64,0x53,0x74,0x64,0x4e,0x6c, 0x62,0x4a,0x65,0x60,0x48,0x65,0x36,0x28,0x3c,0x2d,0x24,0x39,0x2e,0x24,0x38,0x2d, 0x21,0x31,0x29,0x2c,0x46,0x83,0x8d,0xac,0x5e,0x6b,0x92,0x52,0x4f,0x7a,0x52,0x5c, 0x86,0x52,0x5d,0x88,0x52,0x5a,0x84,0x52,0x5b,0x85,0x52,0x5d,0x88,0x52,0x5d,0x88, 0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x64,0x53,0x76,0x52, 0x5d,0x86,0x4d,0x50,0x6d,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,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,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,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,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,0x1f,0x19,0x1f,0x48,0x37,0x44,0x44,0x34,0x40,0x44, 0x34,0x40,0x3e,0x2f,0x39,0x6e,0x78,0x99,0x52,0x5d,0x86,0x5f,0x53,0x77,0x74,0x80, 0xa2,0x84,0x90,0xad,0x8a,0x93,0xb1,0x8c,0x96,0xb2,0x91,0x9b,0xb5,0x95,0x9f,0xb9, 0x95,0x9f,0xb9,0x96,0xa0,0xb9,0x93,0x9c,0xb7,0x91,0x9a,0xb5,0x8d,0x98,0xb3,0x89, 0x93,0xb0,0x81,0x8b,0xaa,0x69,0x74,0x99,0x5d,0x69,0x91,0x8b,0x95,0xb2,0x2d,0x2d, 0x2d,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, 0x44,0x34,0x40,0x57,0x47,0x55,0x6c,0x77,0x99,0x52,0x5d,0x86,0x63,0x6f,0x95,0x58, 0x64,0x8c,0x52,0x5c,0x86,0x52,0x5a,0x84,0x58,0x65,0x8d,0x5f,0x6b,0x92,0x52,0x5a, 0x84,0x52,0x50,0x7c,0x62,0x6b,0x87,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,0x20, 0x20,0x20,0x9d,0xa2,0xad,0x60,0x6d,0x93,0x5c,0x52,0x79,0x64,0x4f,0x6e,0x64,0x4c, 0x6a,0x63,0x4b,0x67,0x62,0x4a,0x65,0x60,0x48,0x64,0x4d,0x39,0x51,0x2e,0x24,0x39, 0x28,0x22,0x3b,0x28,0x22,0x3b,0x26,0x24,0x3d,0x74,0x80,0xa2,0x65,0x71,0x96,0x52, 0x50,0x7c,0x52,0x57,0x82,0x52,0x5d,0x86,0x52,0x5a,0x84,0x52,0x5b,0x85,0x52,0x5d, 0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53,0x5e,0x88, 0x63,0x53,0x77,0x52,0x5b,0x85,0x55,0x59,0x7b,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,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,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,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,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,0x0a,0x08,0x0b,0x52,0x40,0x50, 0x46,0x36,0x42,0x44,0x34,0x40,0x41,0x32,0x3d,0x62,0x66,0x82,0x5c,0x69,0x90,0x64, 0x52,0x72,0x73,0x7e,0xa1,0x82,0x8c,0xab,0x89,0x93,0xb0,0x8c,0x96,0xb2,0x91,0x9b, 0xb5,0x95,0x9f,0xb9,0x94,0x9d,0xb8,0x95,0x9f,0xb9,0x95,0x9f,0xb9,0x93,0x9c,0xb8, 0x91,0x9a,0xb5,0x8b,0x95,0xb2,0x88,0x92,0xaf,0x71,0x7c,0xa0,0x58,0x65,0x8d,0x73, 0x7e,0xa1,0x70,0x71,0x77,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,0x1d,0x15,0x1a,0x46,0x35,0x41,0x8a,0x83,0x91,0x53,0x5e,0x89,0x5a,0x65,0x8d, 0x65,0x71,0x96,0x53,0x5e,0x88,0x52,0x52,0x7d,0x52,0x52,0x7d,0x54,0x5f,0x89,0x58, 0x64,0x8d,0x55,0x50,0x79,0x52,0x56,0x81,0x42,0x48,0x59,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,0x46,0x47,0x49,0x83,0x8b,0xa8,0x52, 0x55,0x80,0x64,0x4f,0x6e,0x60,0x4a,0x65,0x5d,0x45,0x5f,0x5e,0x46,0x62,0x62,0x4a, 0x65,0x30,0x24,0x38,0x2a,0x24,0x3b,0x26,0x22,0x3b,0x26,0x28,0x41,0x6f,0x78,0x96, 0x6b,0x76,0x9b,0x52,0x5c,0x85,0x52,0x52,0x7d,0x52,0x5d,0x86,0x52,0x57,0x83,0x52, 0x57,0x83,0x52,0x5c,0x86,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e, 0x89,0x53,0x5e,0x89,0x63,0x54,0x79,0x53,0x54,0x81,0x5b,0x61,0x86,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,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,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,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,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,0x4d,0x3d,0x4b,0x47,0x37,0x44,0x44,0x34,0x40,0x43,0x33,0x3e,0x56,0x55,0x6d, 0x6a,0x76,0x9a,0x62,0x4a,0x66,0x65,0x72,0x96,0x83,0x8d,0xac,0x84,0x90,0xad,0x8b, 0x94,0xb1,0x8e,0x98,0xb4,0x93,0x9c,0xb7,0x91,0x9a,0xb5,0x92,0x9b,0xb7,0x92,0x9b, 0xb7,0x92,0x9b,0xb7,0x8e,0x99,0xb4,0x8b,0x94,0xb1,0x89,0x93,0xb0,0x7b,0x86,0xa7, 0x5b,0x66,0x8e,0x66,0x73,0x98,0x92,0x98,0xa9,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,0x42,0x32,0x3e,0x48,0x39,0x45,0x82,0x88,0xa3,0x52,0x53, 0x7e,0x63,0x6e,0x94,0x5d,0x69,0x91,0x52,0x55,0x80,0x54,0x50,0x79,0x52,0x50,0x7b, 0x54,0x60,0x8a,0x54,0x5f,0x89,0x63,0x53,0x77,0x55,0x60,0x8a,0x23,0x26,0x2c,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, 0x07,0x07,0x07,0x6b,0x6e,0x75,0x5e,0x6b,0x92,0x64,0x53,0x74,0x5f,0x47,0x63,0x58, 0x40,0x5a,0x5b,0x43,0x5d,0x37,0x28,0x3b,0x2c,0x24,0x39,0x26,0x22,0x3b,0x26,0x24, 0x3c,0x49,0x4e,0x69,0x6d,0x79,0x9d,0x55,0x62,0x8b,0x52,0x4f,0x7a,0x52,0x5b,0x85, 0x52,0x57,0x83,0x52,0x55,0x81,0x52,0x5c,0x86,0x52,0x5c,0x86,0x52,0x5d,0x88,0x53, 0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f,0x89,0x60,0x55,0x7b,0x55,0x54,0x80,0x5e,0x67, 0x8e,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,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,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,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,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,0x2c,0x23,0x2c,0x4b,0x3a,0x47,0x44,0x34,0x40,0x43,0x33, 0x3e,0x4c,0x46,0x58,0x6f,0x7b,0x9f,0x64,0x50,0x6f,0x57,0x64,0x8c,0x80,0x8b,0xaa, 0x85,0x90,0xaf,0x89,0x93,0xb0,0x8e,0x99,0xb4,0x90,0x99,0xb4,0x94,0x9d,0xb8,0x96, 0xa0,0xb9,0x91,0x9b,0xb5,0x92,0x9c,0xb7,0x90,0x99,0xb4,0x8e,0x99,0xb4,0x89,0x93, 0xb0,0x7e,0x89,0xa9,0x63,0x6e,0x94,0x58,0x64,0x8d,0x8e,0x99,0xb4,0x2a,0x2a,0x2b, 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,0x08,0x06,0x07,0x45,0x34,0x40,0x6c,0x61,0x6f,0x5b, 0x67,0x8e,0x52,0x54,0x7e,0x62,0x6d,0x94,0x55,0x62,0x8b,0x52,0x4f,0x7a,0x5a,0x52, 0x79,0x52,0x50,0x7b,0x52,0x5d,0x86,0x52,0x50,0x7c,0x64,0x52,0x73,0x59,0x65,0x8b, 0x05,0x06,0x07,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,0x19,0x19,0x19,0x61,0x69,0x81, 0x52,0x4f,0x7a,0x60,0x48,0x65,0x58,0x41,0x5b,0x45,0x32,0x47,0x2e,0x22,0x35,0x28, 0x22,0x3b,0x26,0x22,0x3b,0x32,0x36,0x50,0x6e,0x7b,0x9d,0x58,0x65,0x8d,0x52,0x4f, 0x7a,0x52,0x5a,0x84,0x52,0x57,0x82,0x52,0x54,0x7e,0x52,0x5c,0x86,0x52,0x5c,0x86, 0x52,0x5d,0x86,0x52,0x5d,0x89,0x54,0x5f,0x8a,0x55,0x62,0x8c,0x58,0x54,0x7e,0x57, 0x55,0x82,0x60,0x6d,0x98,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,0x71, 0x72,0x78,0x63,0x64,0x67,0x03,0x03,0x03,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, 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,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, 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,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,0x11,0x0e,0x11,0x4f,0x3d,0x4c,0x44, 0x34,0x40,0x43,0x33,0x3e,0x40,0x35,0x41,0x71,0x7c,0xa0,0x54,0x50,0x79,0x52,0x4f, 0x7a,0x7c,0x88,0xa8,0x85,0x90,0xad,0x88,0x92,0xb0,0x8b,0x95,0xb2,0x90,0x9a,0xb5, 0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x96,0xa0,0xb9,0x92,0x9b,0xb7,0x8c, 0x95,0xb2,0x8b,0x95,0xb2,0x85,0x90,0xad,0x6d,0x7a,0x9d,0x53,0x5e,0x88,0x7d,0x88, 0xa8,0x70,0x72,0x77,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,0x3a,0x2c,0x36,0x49,0x38,0x45, 0x8d,0x8c,0x9f,0x52,0x4f,0x7b,0x58,0x64,0x8c,0x5e,0x6b,0x92,0x52,0x53,0x7e,0x5d, 0x52,0x79,0x5c,0x52,0x79,0x52,0x50,0x7b,0x52,0x58,0x83,0x5e,0x53,0x79,0x63,0x53, 0x77,0x42,0x4b,0x66,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,0x08,0x08,0x08,0x6f,0x73,0x7c,0x5a,0x66,0x8e,0x64,0x53,0x75,0x62,0x4a,0x66, 0x2e,0x20,0x32,0x2e,0x24,0x37,0x2c,0x24,0x3b,0x29,0x2d,0x45,0x6f,0x7b,0x9f,0x5b, 0x66,0x8e,0x55,0x50,0x79,0x52,0x53,0x7e,0x52,0x56,0x81,0x52,0x53,0x7d,0x52,0x56, 0x81,0x52,0x5b,0x85,0x53,0x5e,0x88,0x54,0x5f,0x8b,0x55,0x60,0x8c,0x57,0x64,0x91, 0x57,0x56,0x83,0x5b,0x57,0x85,0x62,0x6e,0x9b,0x0d,0x0d,0x11,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, 0x1d,0x1d,0x26,0xce,0xd0,0xda,0xcf,0xd2,0xdd,0x9e,0x9f,0xa3,0x06,0x06,0x06,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,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,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,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,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,0x03,0x03,0x03, 0x56,0x43,0x53,0x46,0x35,0x42,0x43,0x33,0x3e,0x39,0x2a,0x34,0x6a,0x74,0x95,0x54, 0x5f,0x8a,0x64,0x53,0x75,0x7e,0x89,0xa9,0x81,0x8c,0xab,0x86,0x91,0xaf,0x8a,0x94, 0xb1,0x91,0x9a,0xb5,0x93,0x9c,0xb7,0x93,0x9c,0xb7,0x95,0x9f,0xb9,0x92,0x9c,0xb7, 0x95,0x9f,0xb9,0x8e,0x99,0xb4,0x8b,0x95,0xb2,0x85,0x90,0xad,0x79,0x84,0xa5,0x56, 0x62,0x8b,0x67,0x74,0x99,0x9c,0xa1,0xaf,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,0x46,0x36, 0x42,0x50,0x40,0x4f,0x7f,0x88,0xa8,0x57,0x50,0x79,0x5f,0x6c,0x93,0x58,0x64,0x8c, 0x54,0x50,0x79,0x64,0x53,0x76,0x60,0x53,0x77,0x52,0x4f,0x7a,0x52,0x56,0x81,0x64, 0x4e,0x6d,0x53,0x50,0x7a,0x27,0x2c,0x3c,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,0x43,0x44,0x45,0x70,0x7a, 0x96,0x52,0x50,0x7c,0x33,0x28,0x3d,0x2d,0x21,0x33,0x2e,0x21,0x33,0x26,0x22,0x3b, 0x6c,0x77,0x9b,0x57,0x63,0x8c,0x54,0x50,0x79,0x54,0x50,0x79,0x52,0x55,0x80,0x52, 0x52,0x7c,0x52,0x53,0x7e,0x53,0x5b,0x86,0x54,0x5e,0x8a,0x55,0x60,0x8d,0x57,0x64, 0x91,0x5a,0x66,0x92,0x5b,0x5b,0x8a,0x5d,0x58,0x88,0x62,0x6f,0x9b,0x1c,0x1b,0x25, 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,0x77,0x70,0x83,0xd5,0xd8,0xe1,0xb7,0xbc,0xcc,0xb1,0xb7,0xc8, 0x8c,0x8e,0x92,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,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,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,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,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,0x38,0x2d,0x37,0x48,0x38,0x45,0x43,0x33,0x3e,0x3c,0x2d,0x37, 0x5d,0x62,0x7e,0x60,0x6c,0x93,0x64,0x4d,0x6b,0x74,0x80,0xa2,0x83,0x8d,0xac,0x83, 0x8e,0xac,0x89,0x93,0xb0,0x8c,0x96,0xb2,0x93,0x9c,0xb7,0x94,0x9d,0xb8,0x94,0x9d, 0xb8,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x8e,0x99,0xb4,0x8b,0x95,0xb2,0x88,0x92,0xaf, 0x81,0x8c,0xab,0x60,0x6d,0x93,0x5a,0x65,0x8d,0x9f,0xa7,0xbf,0x2c,0x2c,0x2c,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,0x12, 0x0e,0x11,0x4c,0x3b,0x48,0x78,0x6f,0x7e,0x5e,0x6a,0x91,0x52,0x4f,0x7b,0x5e,0x6b, 0x92,0x52,0x5c,0x85,0x5f,0x53,0x77,0x64,0x53,0x74,0x63,0x53,0x77,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x60,0x48,0x65,0x52,0x53,0x7e,0x0b,0x0d,0x11,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,0x3b,0x3b,0x3b, 0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x15,0x15,0x15,0x70,0x75,0x85,0x35,0x3a,0x57,0x2d,0x24,0x39,0x2d,0x20, 0x31,0x2e,0x24,0x37,0x4e,0x56,0x79,0x54,0x5f,0x89,0x52,0x4f,0x7a,0x60,0x53,0x77, 0x52,0x53,0x7d,0x52,0x50,0x7d,0x53,0x54,0x80,0x54,0x5a,0x86,0x56,0x5f,0x8b,0x57, 0x64,0x91,0x5a,0x65,0x93,0x5b,0x67,0x95,0x5c,0x63,0x91,0x63,0x5b,0x86,0x60,0x6d, 0x9a,0x2c,0x2b,0x3b,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,0x1d,0x1d,0x27,0x9c,0x93,0xa7,0xd2,0xd6,0xde,0xb0,0xb5, 0xc7,0x93,0x9c,0xb4,0xaa,0xb0,0xc1,0x69,0x6c,0x6f,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,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,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,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,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,0x1c,0x16,0x1c,0x4b,0x3a,0x47,0x43,0x33, 0x3f,0x3d,0x2e,0x38,0x51,0x50,0x66,0x6e,0x7a,0x9d,0x63,0x4b,0x67,0x69,0x74,0x99, 0x7e,0x89,0xa9,0x85,0x90,0xaf,0x88,0x92,0xb0,0x8d,0x96,0xb3,0x90,0x99,0xb4,0x93, 0x9c,0xb7,0x94,0x9d,0xb8,0x92,0x9b,0xb7,0x95,0x9f,0xb9,0x8e,0x99,0xb4,0x8e,0x99, 0xb4,0x89,0x93,0xb0,0x84,0x90,0xad,0x6d,0x79,0x9c,0x55,0x60,0x8a,0x86,0x91,0xaf, 0x78,0x79,0x7c,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,0x4b,0x3a,0x47,0x53,0x41,0x50,0x91,0x8f,0xa3,0x52,0x58,0x83,0x52, 0x5d,0x88,0x5a,0x66,0x8e,0x52,0x4f,0x7a,0x64,0x52,0x71,0x64,0x4f,0x6e,0x5d,0x52, 0x79,0x52,0x4f,0x7a,0x64,0x53,0x76,0x5e,0x47,0x63,0x44,0x4d,0x70,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,0x05,0x05, 0x05,0x71,0x71,0x71,0x1d,0x1d,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x3e,0x47,0x26, 0x27,0x40,0x2e,0x21,0x33,0x2b,0x1e,0x2e,0x34,0x34,0x52,0x53,0x5e,0x89,0x52,0x4f, 0x7a,0x64,0x53,0x76,0x52,0x50,0x7b,0x53,0x52,0x7d,0x54,0x54,0x7e,0x55,0x58,0x85, 0x57,0x62,0x8e,0x5a,0x66,0x92,0x5b,0x67,0x95,0x5d,0x6a,0x98,0x5c,0x69,0x95,0x63, 0x5a,0x85,0x62,0x6f,0x9b,0x37,0x37,0x49,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,0x53,0x5a,0x78,0xa8,0xa1,0xb1,0xcb, 0xcf,0xda,0xab,0xb2,0xc4,0x84,0x8e,0xa9,0x7c,0x85,0xa1,0x94,0xa0,0xb2,0x2f,0x30, 0x39,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,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,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,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,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,0x08,0x07,0x08,0x4e, 0x3d,0x4b,0x44,0x34,0x40,0x3e,0x2f,0x39,0x48,0x42,0x54,0x6f,0x7b,0x9f,0x5f,0x53, 0x77,0x57,0x63,0x8c,0x7c,0x88,0xa8,0x81,0x8b,0xaa,0x88,0x92,0xb0,0x8b,0x95,0xb2, 0x90,0x99,0xb4,0x91,0x9a,0xb5,0x92,0x9b,0xb7,0x94,0x9d,0xb8,0x95,0x9f,0xb9,0x94, 0x9d,0xb8,0x8e,0x99,0xb4,0x8b,0x95,0xb2,0x86,0x91,0xaf,0x7c,0x88,0xa8,0x55,0x60, 0x8a,0x6f,0x7b,0x9f,0xab,0xae,0xb8,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,0x54,0x42,0x51,0x60,0x4e,0x60,0x91,0x9a,0xb5, 0x54,0x50,0x79,0x57,0x63,0x8c,0x54,0x5f,0x89,0x60,0x53,0x77,0x64,0x4d,0x6a,0x64, 0x4d,0x6b,0x5d,0x52,0x79,0x53,0x4f,0x7a,0x60,0x48,0x65,0x64,0x50,0x6e,0x2b,0x30, 0x46,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,0x1d,0x1d,0x1e,0x72,0x72,0x72,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,0x13,0x16,0x1d,0x2f,0x24,0x38,0x29,0x1c,0x2c,0x38,0x2c,0x42,0x52, 0x5d,0x86,0x52,0x4f,0x7a,0x64,0x52,0x73,0x52,0x4f,0x7b,0x53,0x53,0x7d,0x54,0x54, 0x80,0x56,0x5d,0x8a,0x58,0x5f,0x8d,0x5a,0x64,0x91,0x5b,0x67,0x94,0x5c,0x69,0x95, 0x5c,0x69,0x95,0x58,0x56,0x83,0x6b,0x79,0xa0,0x48,0x49,0x5e,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,0x24,0x27,0x32,0x73,0x69,0x8a, 0xae,0xad,0xb8,0xc9,0xce,0xd9,0xaa,0xb1,0xc2,0x7e,0x88,0xa4,0x66,0x71,0x92,0x63, 0x6d,0x8d,0x6a,0x73,0x95,0x0b,0x0b,0x0f,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, 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,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, 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,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,0x4a,0x3a,0x48,0x46,0x36,0x42,0x41,0x31,0x3c,0x3f,0x34,0x40,0x6e, 0x7a,0x9d,0x52,0x53,0x7d,0x52,0x4f,0x7b,0x7b,0x86,0xa7,0x7e,0x8a,0xa9,0x85,0x90, 0xaf,0x8a,0x93,0xb1,0x8d,0x98,0xb3,0x91,0x9b,0xb5,0x92,0x9b,0xb7,0x92,0x9c,0xb7, 0x95,0x9f,0xb9,0x92,0x9b,0xb7,0x92,0x9b,0xb7,0x8c,0x95,0xb2,0x89,0x93,0xb1,0x82, 0x8c,0xab,0x5b,0x67,0x90,0x5d,0x6a,0x91,0xb3,0xba,0xcc,0x2c,0x2c,0x2d,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,0x10,0x0d,0x0f,0x5c,0x49,0x5a,0x7d,0x71, 0x84,0x71,0x7c,0x9f,0x5b,0x52,0x79,0x57,0x63,0x8c,0x52,0x50,0x7b,0x64,0x52,0x73, 0x62,0x4a,0x66,0x64,0x50,0x6e,0x5c,0x52,0x79,0x57,0x50,0x79,0x50,0x39,0x50,0x64, 0x53,0x75,0x16,0x17,0x23,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,0x44,0x44,0x44,0x4d,0x4d,0x4d,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,0x2a,0x1e,0x2e, 0x35,0x27,0x39,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x64,0x53,0x75,0x52,0x4f,0x7b,0x53, 0x53,0x7d,0x54,0x55,0x82,0x56,0x57,0x84,0x58,0x5c,0x89,0x58,0x64,0x92,0x5c,0x69, 0x95,0x5e,0x6b,0x96,0x63,0x6e,0x99,0x58,0x64,0x90,0x7d,0x89,0xaa,0x56,0x57,0x6e, 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,0x5d,0x65, 0x82,0x65,0x51,0x65,0xbc,0xbd,0xc9,0xc4,0xc7,0xd3,0xa5,0xac,0xbf,0x7d,0x86,0xa3, 0x5c,0x67,0x86,0x4a,0x55,0x73,0x59,0x64,0x88,0x54,0x5f,0x82,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,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,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,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,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,0x2f,0x26,0x2f,0x4c,0x3b,0x49,0x42,0x33,0x3e, 0x3a,0x2c,0x35,0x69,0x72,0x93,0x57,0x63,0x8c,0x60,0x53,0x77,0x77,0x83,0xa4,0x80, 0x8b,0xaa,0x81,0x8b,0xaa,0x88,0x92,0xb0,0x8c,0x96,0xb2,0x91,0x9b,0xb5,0x91,0x9b, 0xb5,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x92,0x9b,0xb7,0x8d,0x98,0xb3, 0x8b,0x95,0xb2,0x84,0x90,0xad,0x66,0x72,0x98,0x55,0x60,0x8a,0x8e,0x98,0xb4,0x75, 0x76,0x77,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,0x48,0x39,0x46,0x61, 0x4e,0x61,0x95,0x8f,0xa2,0x5e,0x6a,0x91,0x52,0x4f,0x7a,0x54,0x5f,0x89,0x5f,0x53, 0x77,0x63,0x4b,0x69,0x60,0x48,0x65,0x64,0x52,0x73,0x5d,0x52,0x79,0x64,0x53,0x75, 0x52,0x3b,0x52,0x51,0x4d,0x75,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,0x63,0x63,0x63,0x24,0x24,0x25, 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,0x2c,0x21,0x31,0x33,0x2a,0x42,0x52,0x5d,0x86,0x52,0x50,0x7b,0x5d,0x52,0x79, 0x52,0x57,0x82,0x55,0x60,0x8a,0x56,0x63,0x8c,0x5c,0x67,0x92,0x62,0x6e,0x98,0x6a, 0x76,0x9f,0x6f,0x7c,0xa3,0x76,0x83,0xa8,0x80,0x8b,0xac,0x72,0x7d,0xa2,0xa2,0xaa, 0xc3,0x54,0x58,0x73,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,0x29, 0x2d,0x38,0x78,0x69,0x88,0x4d,0x3c,0x49,0xc8,0xcc,0xd6,0xbf,0xc4,0xd1,0xa3,0xaa, 0xbe,0x73,0x7d,0x9b,0x5b,0x65,0x88,0x49,0x53,0x73,0x44,0x50,0x71,0x66,0x74,0xa4, 0x2f,0x36,0x48,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,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,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,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,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,0x16,0x12,0x16,0x4e,0x3d, 0x4b,0x43,0x33,0x3e,0x3c,0x2d,0x37,0x5c,0x60,0x7c,0x5d,0x6a,0x91,0x64,0x53,0x74, 0x71,0x7c,0x9f,0x7e,0x89,0xa9,0x80,0x8b,0xaa,0x85,0x90,0xad,0x8b,0x94,0xb1,0x8e, 0x99,0xb4,0x91,0x9b,0xb5,0x91,0x9a,0xb5,0x96,0xa0,0xba,0x93,0x9c,0xb7,0x93,0x9c, 0xb8,0x8c,0x96,0xb3,0x8c,0x96,0xb3,0x88,0x92,0xb0,0x72,0x7e,0xa1,0x57,0x63,0x8c, 0x74,0x80,0xa2,0xaa,0xad,0xb8,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, 0x5c,0x49,0x5a,0x68,0x54,0x68,0xa3,0xa6,0xb9,0x53,0x5e,0x88,0x52,0x50,0x7b,0x52, 0x53,0x7d,0x64,0x52,0x72,0x60,0x48,0x64,0x62,0x4b,0x66,0x64,0x53,0x75,0x62,0x53, 0x77,0x5f,0x47,0x63,0x5a,0x41,0x5c,0x3b,0x38,0x55,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,0x0c,0x0c,0x0c,0x74,0x74, 0x75,0x05,0x05,0x05,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,0x30,0x2b,0x44,0x76,0x81,0xa2,0x63,0x6e, 0x95,0x52,0x5d,0x88,0x55,0x62,0x8b,0x54,0x5f,0x8a,0x53,0x5e,0x8a,0x54,0x58,0x84, 0x55,0x56,0x82,0x55,0x54,0x80,0x54,0x55,0x83,0x54,0x5e,0x8a,0x56,0x62,0x8c,0x56, 0x62,0x8b,0x76,0x82,0xa4,0x51,0x55,0x76,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,0x5b,0x64,0x82,0x68,0x53,0x68,0x52,0x44,0x4f,0xca,0xce,0xd9,0xc0, 0xc4,0xd1,0x9f,0xa5,0xbb,0x71,0x7b,0x99,0x58,0x62,0x85,0x4d,0x58,0x7b,0x3f,0x49, 0x69,0x41,0x4a,0x6d,0x71,0x7d,0xb3,0x05,0x05,0x06,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,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,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,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,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,0x06, 0x05,0x06,0x56,0x43,0x53,0x44,0x34,0x40,0x3e,0x2f,0x39,0x51,0x4f,0x67,0x62,0x6e, 0x94,0x64,0x53,0x76,0x62,0x6e,0x94,0x7b,0x86,0xa7,0x83,0x8d,0xac,0x84,0x90,0xad, 0x89,0x93,0xb0,0x8d,0x98,0xb3,0x90,0x9a,0xb5,0x93,0x9d,0xb8,0x92,0x9c,0xb7,0x94, 0x9d,0xb8,0x94,0x9d,0xb8,0x90,0x9a,0xb5,0x90,0x9a,0xb5,0x88,0x92,0xb0,0x80,0x8b, 0xaa,0x5c,0x69,0x90,0x60,0x6d,0x93,0x9b,0xa4,0xbc,0x20,0x20,0x20,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,0x09,0x07,0x09,0x61,0x4d,0x60,0x70,0x5f,0x73,0xa4,0xac,0xc3,0x52,0x50,0x7b, 0x52,0x50,0x7c,0x5d,0x52,0x79,0x62,0x4a,0x66,0x5f,0x47,0x63,0x63,0x4c,0x69,0x64, 0x53,0x75,0x64,0x53,0x76,0x55,0x3d,0x56,0x5f,0x47,0x63,0x20,0x1d,0x2c,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,0x31, 0x31,0x31,0x5c,0x5d,0x5d,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,0x27,0x1f,0x29,0x82, 0x8c,0xab,0x52,0x52,0x7d,0x64,0x4e,0x6d,0x64,0x53,0x76,0x5c,0x52,0x79,0x5a,0x52, 0x7a,0x5b,0x53,0x7a,0x5c,0x53,0x7a,0x5a,0x52,0x7a,0x53,0x50,0x7b,0x53,0x54,0x80, 0x52,0x5d,0x89,0x52,0x5a,0x84,0x6b,0x75,0x9a,0x58,0x5f,0x81,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2f,0x32,0x3e,0x76,0x69,0x89,0x59,0x46,0x57,0x5f,0x53,0x5f, 0xca,0xce,0xd9,0xbc,0xc2,0xd0,0x98,0xa0,0xb3,0x6c,0x77,0x96,0x54,0x5e,0x83,0x4c, 0x56,0x7a,0x45,0x52,0x77,0x3a,0x42,0x60,0x54,0x5e,0x89,0x4c,0x55,0x7a,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,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,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,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,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,0x47,0x39,0x46,0x49,0x38,0x45,0x40,0x30,0x3b,0x48, 0x42,0x54,0x6a,0x75,0x9a,0x5a,0x52,0x79,0x56,0x63,0x8b,0x7a,0x85,0xa5,0x7e,0x8a, 0xa9,0x83,0x8e,0xac,0x88,0x92,0xb0,0x8c,0x96,0xb2,0x90,0x99,0xb4,0x94,0x9d,0xb8, 0x91,0x9b,0xb5,0x94,0x9d,0xb8,0x93,0x9d,0xb8,0x93,0x9c,0xb7,0x8d,0x98,0xb3,0x89, 0x93,0xb0,0x86,0x91,0xaf,0x67,0x73,0x99,0x57,0x63,0x8c,0x7c,0x86,0xa7,0x66,0x68, 0x6c,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,0x35,0x2b,0x35,0x66,0x52,0x66,0x82,0x76,0x8b,0x93,0x9c, 0xb7,0x58,0x50,0x79,0x52,0x4f,0x7a,0x64,0x52,0x72,0x60,0x48,0x65,0x60,0x48,0x64, 0x64,0x52,0x72,0x64,0x53,0x75,0x64,0x50,0x71,0x50,0x39,0x50,0x64,0x50,0x71,0x03, 0x03,0x04,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,0x54,0x54,0x54,0x38,0x38,0x38,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, 0x1d,0x18,0x1e,0x69,0x71,0x94,0x52,0x4f,0x7b,0x64,0x4c,0x6a,0x63,0x53,0x77,0x5f, 0x53,0x77,0x5e,0x53,0x79,0x5c,0x52,0x79,0x5e,0x53,0x79,0x58,0x52,0x79,0x52,0x4f, 0x7a,0x52,0x53,0x7d,0x52,0x5c,0x86,0x52,0x5b,0x85,0x69,0x75,0x99,0x60,0x67,0x87, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x04,0x05,0x06,0x6a,0x74,0x95,0x6c,0x57,0x6d,0x57,0x44, 0x54,0x6d,0x63,0x6e,0xc9,0xcc,0xd8,0xbb,0xc0,0xce,0x95,0x9d,0xb2,0x67,0x73,0x93, 0x51,0x5d,0x81,0x4a,0x56,0x79,0x46,0x51,0x77,0x46,0x4e,0x73,0x42,0x4a,0x6d,0x68, 0x73,0xac,0x15,0x18,0x1e,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,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,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,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,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,0x11,0x0e,0x11,0x4d,0x3c,0x4a, 0x41,0x32,0x3d,0x3f,0x34,0x41,0x6a,0x76,0x9a,0x52,0x52,0x7c,0x52,0x50,0x7c,0x79, 0x84,0xa5,0x7e,0x89,0xa9,0x81,0x8c,0xab,0x88,0x92,0xb0,0x8a,0x94,0xb1,0x8c,0x96, 0xb2,0x90,0x99,0xb4,0x91,0x9a,0xb5,0x94,0x9d,0xb8,0x93,0x9d,0xb8,0x91,0x9a,0xb5, 0x90,0x99,0xb4,0x8e,0x98,0xb4,0x88,0x92,0xb0,0x77,0x82,0xa4,0x5a,0x65,0x8d,0x66, 0x73,0x98,0x8f,0x94,0xa2,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,0x62,0x4e,0x61,0x68,0x53,0x68,0x94, 0x8e,0xa1,0x7b,0x85,0xa7,0x60,0x53,0x77,0x5a,0x52,0x79,0x64,0x4c,0x69,0x60,0x48, 0x65,0x63,0x4b,0x67,0x64,0x52,0x71,0x64,0x53,0x74,0x60,0x48,0x65,0x4d,0x36,0x4c, 0x52,0x44,0x5f,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x0b,0x0b,0x0b,0x69,0x6a,0x6a,0x15,0x15,0x15,0x13,0x13,0x13, 0x33,0x33,0x34,0x4a,0x4a,0x4a,0x45,0x45,0x45,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,0x11,0x0e,0x11,0x75,0x7a,0x96,0x52,0x53,0x7e,0x64,0x4d,0x6b, 0x62,0x53,0x77,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x58, 0x50,0x79,0x52,0x4f,0x7a,0x52,0x54,0x7e,0x52,0x5d,0x88,0x52,0x5c,0x86,0x66,0x72, 0x98,0x69,0x73,0x93,0x0b,0x09,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x51,0x67,0x78,0x69,0x87,0x62, 0x4e,0x61,0x56,0x43,0x53,0x76,0x6e,0x79,0xc8,0xcb,0xd8,0xb8,0xbe,0xcb,0x91,0x99, 0xb0,0x62,0x6e,0x8d,0x50,0x5b,0x80,0x48,0x52,0x74,0x46,0x4f,0x76,0x4c,0x54,0x7b, 0x44,0x4c,0x6f,0x4b,0x54,0x7e,0x67,0x73,0xa0,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,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,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,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,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,0x51,0x3f,0x4e,0x44,0x34,0x40,0x3c,0x2d,0x37,0x67,0x70,0x94,0x53,0x5e,0x88, 0x60,0x53,0x77,0x77,0x83,0xa4,0x7d,0x89,0xa9,0x82,0x8c,0xab,0x84,0x8e,0xad,0x88, 0x92,0xb0,0x8c,0x96,0xb2,0x91,0x9a,0xb5,0x91,0x9a,0xb5,0x95,0x9f,0xb9,0x92,0x9c, 0xb7,0x91,0x9a,0xb5,0x91,0x9a,0xb5,0x8e,0x98,0xb4,0x89,0x93,0xb0,0x83,0x8d,0xac, 0x60,0x6c,0x93,0x5b,0x67,0x90,0x96,0xa0,0xba,0x1d,0x1e,0x1e,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,0x04,0x03,0x04,0x67,0x53,0x67, 0x6a,0x55,0x6b,0xa7,0xa7,0xb9,0x60,0x6d,0x94,0x64,0x53,0x74,0x64,0x53,0x76,0x63, 0x4b,0x67,0x62,0x4a,0x66,0x64,0x52,0x72,0x64,0x53,0x74,0x64,0x53,0x74,0x55,0x3d, 0x56,0x54,0x3d,0x55,0x25,0x1f,0x2a,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, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x04,0x04,0x04,0x43,0x43,0x43,0x79,0x79,0x7a,0x69,0x6a, 0x6a,0x75,0x75,0x76,0x59,0x59,0x59,0x42,0x42,0x42,0x23,0x23,0x23,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,0x02,0x02,0x02,0x7f,0x7d,0x95,0x52,0x53, 0x7d,0x63,0x4c,0x69,0x62,0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x79,0x60,0x53,0x77, 0x5d,0x52,0x79,0x58,0x50,0x79,0x52,0x4f,0x7a,0x52,0x53,0x7e,0x53,0x5e,0x88,0x52, 0x5d,0x86,0x62,0x6d,0x94,0x79,0x82,0xa3,0x52,0x4e,0x76,0x0c,0x09,0x0c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x07,0x67,0x69,0x8d, 0x6a,0x55,0x6a,0x60,0x4c,0x5f,0x54,0x42,0x51,0x80,0x7a,0x85,0xc8,0xcb,0xd8,0xb8, 0xbc,0xcb,0x8b,0x94,0xac,0x60,0x6a,0x8b,0x4e,0x5b,0x7e,0x47,0x51,0x74,0x45,0x4e, 0x76,0x4c,0x56,0x7d,0x4f,0x58,0x80,0x46,0x4f,0x74,0x84,0x93,0xd9,0x22,0x25,0x30, 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,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, 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,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, 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,0x4c,0x3b,0x4a,0x49,0x38,0x45,0x3f,0x30,0x3a,0x5e,0x62, 0x80,0x5a,0x66,0x8e,0x64,0x53,0x73,0x69,0x75,0x9a,0x7a,0x85,0xa7,0x7d,0x89,0xa9, 0x82,0x8c,0xab,0x89,0x93,0xb0,0x8d,0x96,0xb3,0x8d,0x98,0xb3,0x92,0x9b,0xb7,0x92, 0x9b,0xb7,0x95,0x9f,0xb9,0x93,0x9c,0xb8,0x91,0x9b,0xb5,0x8e,0x99,0xb4,0x89,0x93, 0xb0,0x83,0x8d,0xac,0x6d,0x7a,0x9d,0x55,0x62,0x8b,0x7a,0x85,0xa7,0x65,0x65,0x68, 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,0x23,0x1c, 0x23,0x6b,0x56,0x6c,0x6d,0x58,0x6e,0xb0,0xb7,0xc9,0x55,0x60,0x8a,0x64,0x4f,0x6e, 0x64,0x53,0x74,0x62,0x4a,0x66,0x64,0x4d,0x6b,0x64,0x53,0x76,0x64,0x52,0x72,0x64, 0x4f,0x6e,0x4b,0x34,0x4a,0x5d,0x45,0x60,0x06,0x05,0x07,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x0d,0x0d,0x0d,0x36,0x37,0x37,0x5d,0x5d,0x5d,0x7c,0x7d,0x7d,0x89,0x89,0x8a,0x66, 0x66,0x66,0x21,0x21,0x21,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c, 0x67,0x7c,0x52,0x53,0x7e,0x64,0x4c,0x69,0x62,0x53,0x77,0x60,0x53,0x77,0x5f,0x53, 0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x5c,0x52,0x79,0x52,0x4f,0x7a,0x52,0x53,0x7d, 0x53,0x5e,0x87,0x52,0x5d,0x88,0x5d,0x6a,0x91,0x77,0x82,0xa4,0x52,0x56,0x82,0x4e, 0x3f,0x57,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x4c, 0x66,0x75,0x60,0x78,0x62,0x4e,0x62,0x5e,0x4b,0x5d,0x51,0x40,0x4f,0x8a,0x84,0x90, 0xc7,0xca,0xd7,0xb5,0xba,0xc8,0x89,0x91,0xaa,0x5d,0x67,0x8a,0x4d,0x59,0x7c,0x46, 0x51,0x74,0x45,0x4e,0x76,0x4c,0x56,0x7f,0x53,0x5d,0x89,0x45,0x4d,0x74,0x5e,0x68, 0x9b,0x77,0x81,0xba,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,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,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,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,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,0x27,0x1f,0x26,0x4a,0x39,0x47,0x41, 0x32,0x3d,0x55,0x55,0x6e,0x62,0x6d,0x94,0x64,0x4e,0x6c,0x60,0x6c,0x93,0x79,0x84, 0xa5,0x7e,0x89,0xa9,0x81,0x8b,0xaa,0x84,0x8e,0xac,0x8a,0x93,0xb1,0x8b,0x95,0xb2, 0x90,0x99,0xb4,0x91,0x9b,0xb5,0x95,0x9f,0xb9,0x92,0x9b,0xb7,0x92,0x9c,0xb7,0x8d, 0x98,0xb3,0x8c,0x96,0xb3,0x86,0x91,0xaf,0x7b,0x86,0xa7,0x5a,0x65,0x8d,0x65,0x72, 0x96,0x96,0x9a,0xa5,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,0x59,0x48,0x5a,0x6d,0x58,0x6e,0x72,0x60,0x74,0xab,0xb3,0xc8,0x52,0x55, 0x80,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x50,0x6f,0x64,0x53,0x74,0x64,0x53,0x74, 0x64,0x53,0x74,0x64,0x4d,0x6b,0x4b,0x34,0x4a,0x5e,0x48,0x64,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,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x08,0x08,0x08,0x2b,0x2b,0x2b,0x51,0x51, 0x52,0x77,0x78,0x78,0x8b,0x8b,0x8c,0x66,0x66,0x66,0x3b,0x3c,0x3c,0x20,0x20,0x20, 0x6b,0x6b,0x6b,0x0f,0x0f,0x0f,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x5d,0x59,0x6d,0x52,0x5a,0x83,0x63,0x4c,0x69,0x62,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5c,0x52,0x79,0x53,0x4f, 0x7a,0x52,0x53,0x7d,0x52,0x5d,0x87,0x52,0x5d,0x87,0x5a,0x66,0x8d,0x73,0x7e,0xa0, 0x54,0x5f,0x89,0x4b,0x3b,0x56,0x2c,0x21,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0x07,0x0a,0x77,0x68,0x86,0x68,0x53,0x68,0x60,0x4c,0x5f,0x5e,0x4b,0x5d,0x4f,0x3e, 0x4c,0x7a,0x73,0x7e,0xc7,0xcb,0xd7,0xb2,0xb8,0xc8,0x83,0x8b,0xa5,0x5c,0x66,0x88, 0x4d,0x55,0x78,0x46,0x4f,0x74,0x45,0x4e,0x76,0x4b,0x56,0x7f,0x54,0x5e,0x8a,0x4c, 0x55,0x7f,0x41,0x48,0x6a,0x83,0x8e,0xd1,0x31,0x34,0x48,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,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,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,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,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,0x07,0x06,0x07, 0x50,0x3f,0x4d,0x43,0x33,0x3f,0x4d,0x48,0x5c,0x69,0x74,0x99,0x64,0x53,0x74,0x56, 0x62,0x8b,0x75,0x81,0xa3,0x7c,0x86,0xa8,0x7d,0x89,0xa9,0x84,0x90,0xad,0x88,0x92, 0xb0,0x8a,0x94,0xb1,0x8e,0x99,0xb4,0x92,0x9b,0xb7,0x92,0x9c,0xb7,0x91,0x9b,0xb5, 0x94,0x9d,0xb8,0x90,0x9a,0xb5,0x8d,0x98,0xb3,0x8a,0x93,0xb1,0x84,0x90,0xad,0x64, 0x6f,0x95,0x57,0x64,0x8c,0xa0,0xa8,0xbf,0x18,0x18,0x18,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,0x68,0x53,0x68,0x68,0x54,0x68,0x7c,0x6f,0x82,0x98, 0xa1,0xba,0x52,0x4f,0x7a,0x64,0x53,0x76,0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53, 0x76,0x64,0x53,0x76,0x64,0x53,0x75,0x5e,0x46,0x60,0x54,0x3c,0x55,0x29,0x20,0x2c, 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,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x3c,0x3d,0x3d,0x8c,0x8c,0x8d,0x85, 0x85,0x86,0x7c,0x7d,0x7d,0x74,0x75,0x75,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6e,0x6e, 0x6e,0x7f,0x80,0x80,0x81,0x82,0x82,0x65,0x65,0x66,0x59,0x5a,0x5a,0x4b,0x4b,0x4c, 0x3b,0x3b,0x3b,0x29,0x29,0x29,0x16,0x16,0x16,0x07,0x07,0x07,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x43,0x41,0x54,0x53,0x58,0x81,0x63,0x4d,0x6a, 0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5c, 0x52,0x79,0x52,0x4f,0x7a,0x52,0x52,0x7c,0x52,0x5d,0x87,0x53,0x5e,0x87,0x57,0x64, 0x8b,0x77,0x82,0xa3,0x57,0x63,0x8b,0x4c,0x3e,0x5b,0x2c,0x1f,0x31,0x25,0x1a,0x25, 0x00,0x00,0x00,0x48,0x47,0x60,0x73,0x5e,0x76,0x61,0x4d,0x60,0x5f,0x4c,0x5e,0x5d, 0x49,0x5b,0x4e,0x3c,0x4a,0x7d,0x76,0x81,0xc8,0xcb,0xd7,0xaf,0xb4,0xc6,0x7e,0x86, 0xa3,0x57,0x5f,0x84,0x4a,0x55,0x78,0x45,0x4f,0x74,0x45,0x4e,0x76,0x4a,0x55,0x7f, 0x54,0x5d,0x8a,0x58,0x60,0x93,0x3f,0x46,0x67,0x5a,0x63,0x8f,0x7e,0x84,0xc7,0x03, 0x03,0x04,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,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,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,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,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,0x50,0x3f,0x4e,0x44,0x34,0x40,0x48,0x3c,0x4c,0x69,0x75,0x9a, 0x5a,0x52,0x79,0x52,0x4f,0x7a,0x76,0x82,0xa3,0x7b,0x86,0xa7,0x7d,0x89,0xa9,0x83, 0x8d,0xac,0x85,0x90,0xad,0x8b,0x94,0xb1,0x90,0x99,0xb4,0x91,0x9a,0xb5,0x94,0x9d, 0xb8,0x95,0x9f,0xb9,0x91,0x9a,0xb5,0x91,0x9a,0xb5,0x8d,0x98,0xb3,0x8c,0x96,0xb3, 0x86,0x91,0xaf,0x74,0x80,0xa2,0x56,0x62,0x8b,0x80,0x8b,0xaa,0x61,0x62,0x64,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,0x5e,0x4b,0x5d,0x5b,0x48,0x5a, 0x8b,0x83,0x94,0x80,0x8a,0xaa,0x5b,0x52,0x79,0x5d,0x52,0x79,0x5a,0x52,0x79,0x5c, 0x52,0x79,0x5d,0x52,0x79,0x62,0x53,0x77,0x64,0x53,0x76,0x5a,0x41,0x5b,0x5d,0x45, 0x60,0x09,0x07,0x0a,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,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x1f,0x1f,0x1f, 0x2b,0x2b,0x2b,0x24,0x24,0x24,0x1a,0x1a,0x1a,0x11,0x11,0x11,0x0b,0x0b,0x0b,0x0a, 0x0a,0x0a,0x0c,0x0c,0x0d,0x81,0x82,0x82,0x20,0x20,0x21,0x1c,0x1c,0x1d,0x2d,0x2e, 0x2e,0x3e,0x3e,0x3f,0x4e,0x4f,0x4f,0x5d,0x5d,0x5e,0x6c,0x6c,0x6c,0x70,0x70,0x70, 0x62,0x62,0x62,0x48,0x48,0x49,0x28,0x28,0x28,0x09,0x09,0x09,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x33,0x33,0x46,0x53,0x5d, 0x85,0x64,0x4d,0x6b,0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x5c,0x52,0x79,0x53,0x4f,0x7a,0x52,0x52,0x7d,0x52,0x5d,0x87,0x53, 0x5e,0x87,0x53,0x5f,0x88,0x75,0x80,0xa2,0x5b,0x67,0x8f,0x4b,0x41,0x62,0x2c,0x1f, 0x32,0x23,0x19,0x26,0x21,0x19,0x21,0x6d,0x67,0x89,0x69,0x54,0x69,0x5d,0x49,0x5b, 0x5e,0x4b,0x5d,0x5c,0x49,0x5a,0x4c,0x3b,0x48,0x87,0x82,0x8e,0xc7,0xca,0xd7,0xab, 0xb2,0xc3,0x77,0x82,0x9f,0x55,0x5f,0x83,0x48,0x54,0x76,0x45,0x4e,0x74,0x46,0x4e, 0x74,0x4a,0x55,0x7f,0x53,0x5e,0x89,0x58,0x61,0x92,0x52,0x5a,0x83,0x3f,0x45,0x65, 0x7c,0x83,0xc4,0x3e,0x40,0x5d,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,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,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,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,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,0x1f,0x18,0x1e,0x49,0x38,0x45,0x42,0x33, 0x3e,0x68,0x73,0x97,0x52,0x54,0x80,0x64,0x53,0x74,0x73,0x7e,0xa1,0x7a,0x84,0xa5, 0x7d,0x88,0xa8,0x81,0x8c,0xab,0x88,0x92,0xb0,0x88,0x92,0xb0,0x8d,0x98,0xb3,0x90, 0x99,0xb4,0x91,0x9b,0xb5,0x92,0x9b,0xb7,0x93,0x9c,0xb7,0x91,0x9a,0xb6,0x8b,0x95, 0xb2,0x8b,0x94,0xb1,0x87,0x91,0xaf,0x7e,0x89,0xa8,0x5e,0x6a,0x91,0x66,0x73,0x98, 0x8b,0x8f,0x9c,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,0x03,0x02,0x03,0x50,0x3e, 0x4d,0x50,0x3f,0x4d,0xa0,0x9d,0xac,0x6f,0x7b,0x9f,0x55,0x50,0x79,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x56,0x50,0x79,0x58,0x50,0x79,0x5f,0x53,0x77,0x64,0x53,0x75,0x57, 0x3f,0x58,0x64,0x4d,0x6a,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,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x03,0x03,0x02,0x03,0x03,0x36,0x36,0x37,0x60,0x61,0x61,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02, 0x03,0x0a,0x0a,0x0b,0x25,0x25,0x25,0x46,0x46,0x47,0x67,0x67,0x68,0x76,0x77,0x77, 0x5e,0x5e,0x5e,0x36,0x37,0x37,0x07,0x07,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x29, 0x2b,0x3b,0x53,0x5d,0x84,0x64,0x4d,0x6b,0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5c,0x52,0x79,0x53,0x4f,0x7a,0x52,0x52,0x7c, 0x52,0x5d,0x85,0x53,0x5e,0x87,0x53,0x5e,0x87,0x75,0x80,0xa1,0x60,0x6c,0x92,0x4c, 0x43,0x65,0x2d,0x20,0x32,0x24,0x19,0x26,0x28,0x1d,0x29,0x78,0x69,0x88,0x60,0x4c, 0x5f,0x5b,0x48,0x5a,0x5d,0x49,0x5b,0x5a,0x47,0x58,0x4b,0x3a,0x47,0x8f,0x8a,0x96, 0xc6,0xca,0xd6,0xa9,0xb0,0xc2,0x71,0x7b,0x99,0x52,0x5d,0x81,0x48,0x54,0x76,0x44, 0x4e,0x74,0x46,0x4e,0x73,0x4a,0x53,0x7d,0x51,0x5d,0x89,0x58,0x61,0x92,0x5e,0x67, 0x95,0x44,0x4a,0x6c,0x5a,0x5f,0x8e,0x82,0x87,0xcb,0x05,0x05,0x07,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,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,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,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,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,0x05,0x04,0x05,0x4c, 0x3b,0x49,0x44,0x34,0x40,0x5f,0x65,0x84,0x55,0x60,0x8a,0x64,0x4c,0x6a,0x6a,0x76, 0x9a,0x76,0x82,0xa3,0x7c,0x86,0xa8,0x7e,0x8a,0xa9,0x83,0x8d,0xac,0x86,0x91,0xaf, 0x8b,0x95,0xb2,0x8f,0x98,0xb3,0x91,0x9b,0xb6,0x91,0x9a,0xb6,0x91,0x9a,0xb6,0x91, 0x9a,0xb6,0x91,0x9b,0xb6,0x8b,0x95,0xb2,0x89,0x92,0xb0,0x83,0x8d,0xab,0x6c,0x77, 0x9b,0x5b,0x66,0x8d,0x8f,0x99,0xb4,0x12,0x12,0x12,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,0x02, 0x02,0x02,0x48,0x37,0x44,0x47,0x37,0x43,0x9b,0x9f,0xb5,0x67,0x73,0x99,0x57,0x50, 0x79,0x54,0x5f,0x89,0x55,0x60,0x8a,0x52,0x56,0x82,0x53,0x50,0x79,0x57,0x50,0x79, 0x64,0x4f,0x6d,0x58,0x41,0x5b,0x40,0x35,0x4a,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,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03, 0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x77,0x77,0x78,0x2a,0x2a,0x2a, 0x04,0x04,0x05,0x04,0x04,0x05,0x06,0x06,0x07,0x3d,0x3d,0x3d,0x37,0x37,0x37,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02, 0x03,0x0d,0x0d,0x0d,0x31,0x31,0x31,0x6f,0x6f,0x6f,0x8f,0x8f,0x90,0x0a,0x0a,0x0a, 0x02,0x02,0x02,0x20,0x23,0x32,0x52,0x5a,0x84,0x64,0x51,0x70,0x62,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5d,0x52,0x79,0x54,0x51, 0x79,0x53,0x51,0x7c,0x53,0x5c,0x84,0x53,0x5e,0x87,0x52,0x5d,0x87,0x6c,0x77,0x9b, 0x6e,0x7a,0x9c,0x4b,0x44,0x68,0x2c,0x1f,0x31,0x24,0x19,0x27,0x37,0x2a,0x3a,0x78, 0x65,0x80,0x5d,0x4a,0x5c,0x5a,0x47,0x58,0x5d,0x49,0x5b,0x5a,0x47,0x58,0x4b,0x3a, 0x48,0x95,0x90,0x9b,0xc7,0xcb,0xd8,0xa2,0xa9,0xbe,0x6e,0x77,0x96,0x52,0x5d,0x80, 0x46,0x54,0x75,0x44,0x4e,0x73,0x44,0x4e,0x74,0x49,0x52,0x7c,0x50,0x5b,0x87,0x59, 0x61,0x90,0x5e,0x66,0x94,0x51,0x58,0x7f,0x43,0x46,0x68,0x76,0x7a,0xb6,0x44,0x47, 0x67,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,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,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,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,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,0x4f,0x3d,0x4b,0x45,0x35,0x41,0x57,0x57,0x72,0x5c,0x67,0x90,0x64, 0x4c,0x6a,0x63,0x6e,0x94,0x73,0x7e,0xa1,0x77,0x83,0xa4,0x7d,0x88,0xa8,0x82,0x8c, 0xab,0x84,0x8f,0xac,0x89,0x93,0xb0,0x8c,0x97,0xb2,0x91,0x9b,0xb6,0x93,0x9c,0xb7, 0x8f,0x98,0xb3,0x90,0x99,0xb4,0x8f,0x98,0xb3,0x8b,0x95,0xb2,0x89,0x93,0xb0,0x85, 0x90,0xae,0x79,0x82,0xa3,0x5d,0x69,0x90,0x74,0x7f,0xa0,0x58,0x59,0x5c,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,0x02,0x02,0x02,0x41,0x32,0x3d,0x43,0x34,0x3f,0x9d,0xa7,0xbf,0x60, 0x6d,0x94,0x5e,0x52,0x79,0x57,0x63,0x8c,0x5a,0x65,0x8d,0x5a,0x66,0x8e,0x55,0x60, 0x8a,0x52,0x55,0x80,0x63,0x4b,0x67,0x63,0x4c,0x69,0x14,0x11,0x18,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x02,0x03, 0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x03, 0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04, 0x05,0x04,0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x51,0x51,0x52,0x84,0x84,0x85, 0x87,0x87,0x88,0x89,0x89,0x89,0x3d,0x3d,0x3d,0x03,0x03,0x04,0x03,0x03,0x04,0x03, 0x03,0x04,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x21,0x21,0x21,0x2b,0x2b, 0x2b,0x02,0x02,0x03,0x02,0x02,0x02,0x1c,0x20,0x2d,0x52,0x5d,0x88,0x65,0x54,0x76, 0x62,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5d, 0x52,0x79,0x53,0x50,0x7a,0x53,0x51,0x7b,0x53,0x5d,0x85,0x54,0x5e,0x87,0x52,0x5d, 0x87,0x64,0x6f,0x95,0x65,0x71,0x95,0x54,0x4a,0x6d,0x2d,0x20,0x32,0x24,0x19,0x26, 0x35,0x28,0x38,0x71,0x5c,0x73,0x5d,0x49,0x5b,0x5a,0x47,0x58,0x5b,0x48,0x59,0x57, 0x45,0x55,0x4a,0x39,0x47,0xa2,0xa0,0xab,0xc2,0xc7,0xd5,0x9d,0xa5,0xb9,0x6a,0x74, 0x94,0x4f,0x58,0x7d,0x46,0x53,0x76,0x43,0x4e,0x72,0x44,0x4e,0x73,0x48,0x52,0x79, 0x4f,0x59,0x84,0x58,0x60,0x8f,0x5f,0x65,0x94,0x5f,0x67,0x95,0x49,0x4c,0x71,0x5a, 0x5e,0x8b,0x84,0x84,0xc1,0x05,0x05,0x07,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, 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,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, 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,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,0x3b,0x2e,0x39,0x45,0x35,0x41,0x51,0x4c,0x61, 0x5f,0x6c,0x93,0x63,0x4b,0x69,0x58,0x64,0x8c,0x75,0x81,0xa2,0x7a,0x84,0xa6,0x7c, 0x87,0xa7,0x80,0x8a,0xaa,0x83,0x8d,0xac,0x88,0x92,0xaf,0x8c,0x97,0xb2,0x8f,0x98, 0xb3,0x90,0x99,0xb4,0x91,0x9a,0xb6,0x8d,0x98,0xb3,0x90,0x9a,0xb4,0x8c,0x97,0xb2, 0x88,0x92,0xaf,0x84,0x8f,0xac,0x7e,0x89,0xa8,0x63,0x6f,0x94,0x60,0x6c,0x92,0x84, 0x88,0x93,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,0x05,0x04,0x04,0x3f,0x30,0x3b,0x47,0x39,0x44, 0xa1,0xa9,0xc1,0x5f,0x6c,0x93,0x5d,0x52,0x79,0x5b,0x66,0x8e,0x5c,0x69,0x90,0x5c, 0x67,0x90,0x58,0x64,0x8c,0x55,0x60,0x8a,0x64,0x50,0x71,0x52,0x4f,0x7a,0x03,0x03, 0x04,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03, 0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05, 0x04,0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x06,0x04,0x05,0x05,0x04, 0x05,0x05,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x1e,0x1f,0x20,0x8f,0x8f, 0x90,0x57,0x57,0x58,0x2f,0x30,0x31,0x2f,0x30,0x31,0x65,0x65,0x67,0x5f,0x5f,0x61, 0x05,0x05,0x06,0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x02, 0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x1a,0x1c,0x29,0x52,0x5c, 0x86,0x64,0x53,0x75,0x63,0x54,0x78,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x5d,0x53,0x79,0x55,0x51,0x79,0x52,0x50,0x7b,0x53,0x5d,0x85,0x54, 0x5e,0x87,0x54,0x5d,0x87,0x5e,0x6a,0x90,0x66,0x72,0x97,0x51,0x4a,0x71,0x2e,0x21, 0x33,0x24,0x19,0x27,0x31,0x24,0x33,0x6d,0x59,0x6f,0x5c,0x49,0x5a,0x5a,0x48,0x59, 0x5b,0x48,0x59,0x56,0x43,0x53,0x47,0x37,0x43,0xa9,0xa8,0xb3,0xc3,0xc8,0xd5,0x98, 0xa0,0xb6,0x63,0x6e,0x8f,0x4e,0x5a,0x7d,0x47,0x52,0x76,0x43,0x4e,0x73,0x44,0x4e, 0x73,0x48,0x52,0x79,0x4e,0x58,0x83,0x59,0x60,0x8e,0x5f,0x65,0x94,0x60,0x67,0x95, 0x5b,0x5f,0x8b,0x53,0x54,0x7c,0x78,0x78,0xae,0x3b,0x3c,0x51,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,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,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,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,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,0x21,0x1a,0x1f,0x46,0x36, 0x42,0x4b,0x40,0x52,0x66,0x72,0x98,0x62,0x53,0x77,0x52,0x56,0x81,0x72,0x7e,0xa0, 0x76,0x81,0xa2,0x7b,0x85,0xa6,0x7f,0x89,0xa9,0x7f,0x89,0xa9,0x85,0x90,0xae,0x8a, 0x94,0xb1,0x8c,0x97,0xb2,0x91,0x9a,0xb6,0x90,0x9a,0xb4,0x94,0x9e,0xb8,0x90,0x99, 0xb4,0x8c,0x97,0xb2,0x8c,0x97,0xb2,0x88,0x92,0xaf,0x82,0x8c,0xab,0x6f,0x7b,0x9e, 0x55,0x60,0x89,0x96,0x9f,0xb7,0x13,0x13,0x13,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,0x09,0x07,0x08,0x3e,0x2f, 0x39,0x4f,0x43,0x50,0xa1,0xa9,0xc1,0x5b,0x67,0x8e,0x56,0x50,0x79,0x5b,0x66,0x8e, 0x5e,0x6b,0x92,0x5d,0x6a,0x91,0x5b,0x67,0x90,0x52,0x5d,0x88,0x64,0x4c,0x6a,0x4f, 0x5a,0x81,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02, 0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04, 0x05,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07, 0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x12, 0x12,0x13,0x86,0x86,0x86,0x1d,0x1e,0x1f,0x06,0x06,0x07,0x06,0x06,0x07,0x1c,0x1d, 0x1e,0x93,0x93,0x94,0x05,0x06,0x06,0x66,0x66,0x67,0x50,0x50,0x51,0x04,0x05,0x05, 0x0f,0x0f,0x10,0x34,0x34,0x35,0x0b,0x0b,0x0c,0x03,0x03,0x04,0x02,0x03,0x03,0x1a, 0x1c,0x29,0x52,0x56,0x81,0x64,0x53,0x76,0x63,0x53,0x77,0x60,0x54,0x78,0x60,0x53, 0x77,0x60,0x54,0x78,0x60,0x54,0x78,0x5e,0x54,0x79,0x55,0x51,0x79,0x52,0x50,0x7b, 0x53,0x58,0x82,0x53,0x5d,0x87,0x53,0x5d,0x84,0x5b,0x67,0x8d,0x6a,0x76,0x99,0x56, 0x50,0x79,0x2f,0x21,0x35,0x25,0x19,0x27,0x2d,0x21,0x30,0x6a,0x56,0x6b,0x5f,0x4c, 0x5e,0x59,0x47,0x58,0x5a,0x48,0x59,0x55,0x44,0x54,0x4a,0x39,0x46,0xae,0xae,0xb9, 0xc0,0xc5,0xd2,0x93,0x9b,0xb3,0x62,0x6d,0x8d,0x4e,0x58,0x7d,0x47,0x50,0x76,0x44, 0x4e,0x73,0x43,0x4e,0x73,0x47,0x52,0x7a,0x4e,0x58,0x83,0x59,0x61,0x8f,0x5f,0x65, 0x94,0x60,0x67,0x95,0x62,0x66,0x93,0x55,0x58,0x81,0x66,0x67,0x97,0x47,0x47,0x5a, 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,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, 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,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, 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,0x0b, 0x08,0x0a,0x46,0x36,0x42,0x47,0x38,0x45,0x66,0x71,0x97,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x6f,0x7c,0x9e,0x75,0x80,0xa1,0x79,0x83,0xa3,0x7d,0x88,0xa7,0x7f,0x8a,0xa9, 0x83,0x8f,0xac,0x89,0x93,0xb0,0x8c,0x97,0xb2,0x8f,0x98,0xb3,0x90,0x9a,0xb4,0x91, 0x9a,0xb6,0x91,0x9b,0xb6,0x8c,0x97,0xb2,0x8b,0x95,0xb2,0x89,0x93,0xb0,0x82,0x8d, 0xab,0x79,0x82,0xa3,0x55,0x62,0x8a,0x77,0x82,0xa3,0x52,0x53,0x56,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,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,0x0f, 0x0c,0x0e,0x3e,0x2f,0x39,0x5b,0x53,0x64,0x9b,0xa4,0xbc,0x5a,0x66,0x8e,0x5b,0x52, 0x79,0x56,0x63,0x8b,0x60,0x6d,0x94,0x5e,0x6b,0x92,0x5d,0x6a,0x91,0x52,0x53,0x7e, 0x64,0x53,0x75,0x2a,0x2f,0x44,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03, 0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04, 0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06, 0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x06,0x06,0x07, 0x06,0x06,0x07,0x07,0x08,0x09,0x34,0x35,0x36,0x68,0x68,0x6a,0x66,0x66,0x68,0x63, 0x63,0x65,0x67,0x68,0x69,0x38,0x38,0x3a,0x06,0x06,0x07,0x06,0x06,0x07,0x78,0x79, 0x7a,0x05,0x05,0x06,0x54,0x54,0x55,0x7c,0x7c,0x7d,0x21,0x21,0x22,0x04,0x04,0x05, 0x03,0x03,0x04,0x1a,0x1d,0x29,0x53,0x57,0x80,0x64,0x53,0x76,0x62,0x53,0x77,0x61, 0x54,0x78,0x60,0x54,0x78,0x60,0x54,0x78,0x61,0x54,0x78,0x5e,0x54,0x79,0x54,0x51, 0x79,0x53,0x51,0x7b,0x53,0x59,0x84,0x53,0x5d,0x87,0x53,0x5d,0x85,0x57,0x63,0x8b, 0x71,0x7d,0x9f,0x53,0x50,0x7b,0x30,0x22,0x35,0x25,0x19,0x27,0x2a,0x1e,0x2b,0x69, 0x55,0x6a,0x5f,0x4c,0x5e,0x59,0x47,0x58,0x5a,0x48,0x59,0x54,0x43,0x52,0x47,0x37, 0x44,0xbe,0xbf,0xcb,0xbf,0xc3,0xd1,0x90,0x99,0xb1,0x5e,0x6b,0x8c,0x4c,0x58,0x7c, 0x45,0x50,0x75,0x44,0x4c,0x73,0x43,0x4d,0x73,0x47,0x52,0x7a,0x50,0x59,0x83,0x59, 0x62,0x8f,0x5f,0x66,0x95,0x62,0x67,0x95,0x60,0x64,0x92,0x54,0x57,0x7e,0x63,0x64, 0x92,0x45,0x44,0x58,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,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,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,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,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,0x46,0x36,0x42,0x46,0x36,0x42,0x61,0x68,0x88,0x52, 0x5c,0x85,0x60,0x53,0x77,0x6b,0x76,0x9a,0x73,0x7e,0xa0,0x77,0x82,0xa3,0x7b,0x85, 0xa6,0x7d,0x88,0xa8,0x82,0x8c,0xab,0x87,0x91,0xaf,0x8a,0x94,0xb1,0x8d,0x98,0xb3, 0x92,0x9b,0xb6,0x8f,0x98,0xb3,0x91,0x9a,0xb6,0x90,0x9a,0xb4,0x8d,0x98,0xb3,0x8b, 0x95,0xb2,0x84,0x8f,0xac,0x7f,0x8a,0xa9,0x5c,0x67,0x8f,0x57,0x64,0x8b,0x7c,0x7f, 0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x17,0x11,0x15,0x3f,0x30,0x3a,0x65,0x61,0x74,0x9b,0xa4,0xbc,0x58, 0x65,0x8d,0x5a,0x52,0x79,0x5a,0x65,0x8d,0x65,0x71,0x96,0x63,0x6f,0x95,0x5f,0x6c, 0x93,0x52,0x50,0x7c,0x57,0x50,0x79,0x0d,0x0f,0x15,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,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x05,0x05,0x06, 0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06, 0x06,0x07,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07, 0x09,0x07,0x08,0x09,0x07,0x07,0x09,0x07,0x08,0x09,0x07,0x07,0x09,0x0f,0x10,0x12, 0x1f,0x1f,0x20,0x20,0x21,0x21,0x15,0x15,0x16,0x07,0x07,0x09,0x06,0x07,0x09,0x06, 0x07,0x09,0x78,0x79,0x7a,0x4a,0x4a,0x4b,0x5f,0x60,0x61,0x0d,0x0e,0x0e,0x05,0x05, 0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x1b,0x1c,0x28,0x53,0x5b,0x83,0x63,0x53,0x75, 0x62,0x53,0x77,0x60,0x53,0x77,0x61,0x54,0x78,0x60,0x54,0x78,0x61,0x54,0x78,0x5f, 0x54,0x7a,0x57,0x51,0x79,0x53,0x50,0x7b,0x53,0x5b,0x83,0x53,0x5e,0x88,0x53,0x5d, 0x85,0x55,0x60,0x89,0x6b,0x77,0x98,0x53,0x54,0x7c,0x33,0x25,0x38,0x24,0x19,0x26, 0x30,0x24,0x31,0x68,0x54,0x69,0x60,0x4d,0x60,0x59,0x47,0x58,0x5a,0x48,0x59,0x54, 0x43,0x52,0x47,0x37,0x43,0xc4,0xc6,0xd1,0xbf,0xc3,0xd1,0x8b,0x94,0xac,0x5c,0x66, 0x89,0x4c,0x58,0x7c,0x46,0x51,0x75,0x43,0x4d,0x71,0x43,0x4d,0x72,0x48,0x52,0x7a, 0x50,0x5a,0x84,0x59,0x62,0x8f,0x5f,0x66,0x95,0x63,0x67,0x95,0x60,0x63,0x90,0x53, 0x56,0x7d,0x65,0x65,0x92,0x3d,0x3e,0x4e,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, 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,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, 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,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,0x42,0x33,0x3f,0x48,0x37,0x44, 0x5d,0x5f,0x79,0x5f,0x6c,0x92,0x63,0x53,0x77,0x62,0x6e,0x93,0x72,0x7e,0xa0,0x75, 0x80,0xa2,0x7c,0x85,0xa6,0x7c,0x87,0xa7,0x83,0x8d,0xab,0x83,0x8f,0xac,0x88,0x92, 0xaf,0x8c,0x97,0xb2,0x8c,0x97,0xb2,0x91,0x99,0xb5,0x91,0x99,0xb5,0x91,0x99,0xb5, 0x8d,0x96,0xb2,0x89,0x93,0xb0,0x89,0x93,0xb0,0x82,0x8c,0xaa,0x6b,0x77,0x9a,0x53, 0x58,0x82,0x7c,0x86,0xa4,0x0b,0x0b,0x0b,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x1e,0x17,0x1c,0x3d,0x2e,0x39,0x6d,0x6d,0x83, 0x98,0xa1,0xba,0x57,0x64,0x8c,0x58,0x50,0x79,0x5b,0x67,0x8e,0x66,0x73,0x98,0x63, 0x6e,0x95,0x62,0x6e,0x94,0x5e,0x52,0x79,0x52,0x4f,0x7a,0x02,0x02,0x03,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,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05, 0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x08, 0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x08,0x09,0x08,0x08,0x0a,0x08, 0x08,0x0a,0x08,0x08,0x0a,0x09,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09, 0x0a,0x09,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x08,0x0a,0x08,0x08,0x0a, 0x08,0x08,0x0a,0x07,0x08,0x09,0x72,0x73,0x74,0x6a,0x6b,0x6c,0x15,0x15,0x16,0x06, 0x06,0x07,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x1a,0x19,0x22,0x52,0x54, 0x7e,0x63,0x54,0x76,0x62,0x54,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x61,0x54,0x78,0x5f,0x54,0x7a,0x58,0x51,0x7a,0x53,0x50,0x7b,0x53,0x58,0x82,0x54, 0x5f,0x88,0x53,0x5e,0x86,0x54,0x5e,0x87,0x63,0x6c,0x8e,0x37,0x36,0x4a,0x37,0x29, 0x3d,0x25,0x1a,0x28,0x36,0x28,0x35,0x68,0x55,0x69,0x5e,0x4c,0x5e,0x58,0x46,0x57, 0x5a,0x48,0x59,0x54,0x42,0x51,0x47,0x37,0x43,0xc3,0xc5,0xd0,0xbf,0xc3,0xd1,0x85, 0x90,0xab,0x5b,0x65,0x88,0x4b,0x56,0x7a,0x47,0x53,0x76,0x43,0x4d,0x71,0x43,0x4c, 0x6f,0x48,0x51,0x79,0x50,0x5a,0x84,0x59,0x62,0x8f,0x5f,0x66,0x95,0x63,0x67,0x95, 0x5f,0x62,0x8f,0x53,0x55,0x7c,0x66,0x66,0x93,0x3a,0x3b,0x4c,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,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,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,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,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,0x22,0x1b, 0x21,0x51,0x3f,0x4e,0x56,0x52,0x6a,0x6c,0x79,0x9b,0x5a,0x52,0x79,0x58,0x65,0x8c, 0x6f,0x7b,0x9e,0x75,0x80,0xa1,0x79,0x83,0xa3,0x7e,0x88,0xa8,0x80,0x8a,0xaa,0x85, 0x90,0xae,0x87,0x91,0xaf,0x8b,0x93,0xb1,0x8f,0x97,0xb2,0x8b,0x93,0xb1,0x8f,0x97, 0xb2,0x8f,0x97,0xb2,0x8c,0x96,0xb1,0x8c,0x96,0xb1,0x8a,0x93,0xb0,0x87,0x90,0xae, 0x79,0x82,0xa3,0x53,0x5e,0x88,0x63,0x6e,0x94,0x48,0x49,0x4d,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,0x2a,0x20,0x26,0x3c,0x2e, 0x38,0x75,0x78,0x90,0x93,0x9c,0xb7,0x5e,0x6b,0x92,0x5e,0x53,0x79,0x5e,0x6b,0x92, 0x66,0x72,0x98,0x65,0x72,0x96,0x63,0x6e,0x95,0x64,0x53,0x76,0x52,0x5a,0x84,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,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04, 0x03,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x05,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x07, 0x09,0x07,0x07,0x09,0x07,0x08,0x09,0x07,0x08,0x09,0x08,0x08,0x0a,0x09,0x09,0x0a, 0x09,0x09,0x0a,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x0a, 0x0a,0x0c,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09, 0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x08,0x0a,0x08,0x09,0x0a,0x08,0x08,0x0a, 0x08,0x08,0x0a,0x07,0x08,0x09,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x06,0x19, 0x17,0x20,0x52,0x54,0x7f,0x63,0x53,0x76,0x61,0x54,0x76,0x5f,0x53,0x76,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x57,0x50,0x79,0x52,0x4f,0x7a, 0x52,0x57,0x82,0x53,0x5e,0x88,0x52,0x5d,0x86,0x52,0x5d,0x86,0x65,0x6f,0x93,0x02, 0x02,0x02,0x34,0x28,0x39,0x24,0x19,0x27,0x33,0x25,0x33,0x6a,0x56,0x6b,0x60,0x4d, 0x60,0x59,0x47,0x58,0x5a,0x48,0x59,0x52,0x40,0x4f,0x4e,0x3f,0x4a,0xcf,0xd3,0xde, 0xbd,0xc3,0xd0,0x83,0x8c,0xa8,0x56,0x62,0x84,0x4b,0x55,0x7b,0x46,0x4f,0x75,0x43, 0x4e,0x73,0x41,0x4a,0x6e,0x45,0x4f,0x74,0x4f,0x59,0x83,0x59,0x62,0x8f,0x60,0x67, 0x95,0x63,0x67,0x95,0x60,0x63,0x8e,0x56,0x57,0x7d,0x69,0x67,0x97,0x3c,0x3c,0x4d, 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,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, 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,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, 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,0x06,0x05,0x07,0x57,0x44,0x55,0x51,0x48,0x5c,0x71,0x7c,0x9f,0x52,0x4f, 0x7b,0x52,0x5b,0x84,0x6f,0x7b,0x9e,0x73,0x7e,0xa0,0x75,0x80,0xa2,0x7c,0x85,0xa7, 0x7f,0x89,0xa9,0x83,0x8d,0xac,0x85,0x90,0xae,0x89,0x92,0xaf,0x8c,0x96,0xb1,0x8f, 0x97,0xb2,0x8f,0x97,0xb2,0x8f,0x98,0xb3,0x91,0x99,0xb5,0x8c,0x96,0xb1,0x88,0x91, 0xae,0x85,0x8f,0xad,0x7c,0x88,0xa8,0x5b,0x66,0x8f,0x52,0x59,0x82,0x6b,0x6f,0x7e, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02, 0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x37, 0x29,0x32,0x3d,0x2e,0x39,0x7b,0x82,0x9c,0x92,0x9c,0xb7,0x60,0x6d,0x93,0x5d,0x52, 0x79,0x64,0x6f,0x95,0x65,0x72,0x98,0x66,0x72,0x98,0x5d,0x6a,0x91,0x64,0x52,0x72, 0x4d,0x57,0x7e,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, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x03,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x04,0x04,0x04, 0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07, 0x06,0x06,0x07,0x06,0x06,0x08,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x09,0x07, 0x08,0x0a,0x08,0x09,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x09,0x0a, 0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c, 0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0b,0x0d,0x0a,0x0b,0x0d,0x0a,0x0a,0x0d,0x0a, 0x0a,0x0d,0x0a,0x0a,0x0d,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x09,0x0a, 0x0b,0x08,0x09,0x0a,0x08,0x08,0x0a,0x07,0x08,0x09,0x06,0x07,0x09,0x06,0x06,0x08, 0x06,0x06,0x08,0x1a,0x18,0x21,0x52,0x57,0x80,0x63,0x53,0x75,0x61,0x54,0x76,0x5f, 0x54,0x76,0x5f,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x57,0x50, 0x79,0x52,0x4f,0x7a,0x52,0x55,0x81,0x53,0x5e,0x88,0x53,0x5e,0x89,0x52,0x5b,0x84, 0x75,0x80,0xa1,0x02,0x02,0x02,0x04,0x04,0x04,0x26,0x1c,0x28,0x2f,0x21,0x2f,0x6d, 0x59,0x6f,0x5e,0x4c,0x5e,0x58,0x46,0x57,0x5a,0x48,0x59,0x53,0x41,0x50,0x55,0x46, 0x53,0xd1,0xd5,0xdf,0xbe,0xc3,0xd2,0x82,0x8b,0xa7,0x56,0x60,0x83,0x49,0x56,0x7b, 0x45,0x50,0x75,0x44,0x4e,0x72,0x41,0x4b,0x6e,0x43,0x4e,0x74,0x4d,0x57,0x83,0x59, 0x61,0x8e,0x5e,0x66,0x95,0x62,0x66,0x95,0x60,0x63,0x8f,0x57,0x59,0x7c,0x6e,0x6c, 0x97,0x3c,0x3d,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,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,0x2c,0x2e,0x31,0x98,0x9a,0xa0,0xc8,0xc8,0xca,0xdd,0xdd,0xdd,0x0b,0x0b,0x0b, 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,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, 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,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,0x54,0x42,0x52,0x4c,0x3d,0x4d,0x75, 0x80,0xa2,0x55,0x60,0x89,0x53,0x4f,0x7a,0x6f,0x7b,0x9e,0x72,0x7e,0xa0,0x75,0x80, 0xa1,0x79,0x82,0xa3,0x7e,0x88,0xa7,0x7f,0x89,0xa9,0x83,0x8e,0xab,0x88,0x91,0xae, 0x8b,0x93,0xb0,0x8c,0x94,0xb1,0x90,0x99,0xb5,0x8e,0x97,0xb2,0x8c,0x96,0xb2,0x8c, 0x97,0xb2,0x89,0x93,0xb0,0x83,0x8e,0xab,0x81,0x8b,0xaa,0x69,0x74,0x98,0x52,0x54, 0x7f,0x7a,0x83,0xa2,0x0a,0x0b,0x0b,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 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,0x3e,0x2f,0x39,0x3c,0x2e,0x38,0x7f,0x88,0xa6,0x8e,0x99,0xb4,0x5d, 0x6a,0x91,0x5d,0x52,0x79,0x64,0x71,0x96,0x67,0x73,0x98,0x65,0x72,0x96,0x54,0x5f, 0x89,0x64,0x50,0x6f,0x38,0x3f,0x58,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03, 0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x03, 0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x06,0x06,0x06,0x06, 0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x08,0x0a, 0x08,0x08,0x0a,0x09,0x09,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a, 0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d,0x0a,0x0a,0x0d,0x0a,0x0b,0x0d,0x0a,0x0b, 0x0d,0x0b,0x0b,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0e,0x0b,0x0c,0x0e, 0x0b,0x0c,0x0e,0x0a,0x0b,0x0d,0x0b,0x0b,0x0e,0x0a,0x0b,0x0d,0x0a,0x0a,0x0d,0x0a, 0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x09,0x09,0x0a,0x07,0x08, 0x09,0x07,0x08,0x09,0x06,0x07,0x09,0x1b,0x18,0x21,0x52,0x5c,0x84,0x62,0x54,0x76, 0x62,0x53,0x77,0x5f,0x54,0x76,0x5f,0x54,0x76,0x5f,0x53,0x76,0x60,0x53,0x77,0x5e, 0x53,0x79,0x58,0x50,0x79,0x52,0x4f,0x7a,0x52,0x55,0x80,0x52,0x5c,0x85,0x53,0x5e, 0x88,0x52,0x57,0x81,0x83,0x8d,0xab,0x0b,0x0c,0x0e,0x02,0x02,0x02,0x12,0x0e,0x11, 0x2c,0x1f,0x2c,0x6d,0x59,0x6f,0x5b,0x48,0x5a,0x5a,0x47,0x58,0x5a,0x47,0x58,0x51, 0x40,0x4e,0x5b,0x4d,0x59,0xd1,0xd5,0xe0,0xbe,0xc2,0xd1,0x7e,0x88,0xa4,0x55,0x60, 0x84,0x49,0x54,0x79,0x46,0x50,0x75,0x44,0x4d,0x72,0x40,0x4b,0x6d,0x42,0x4e,0x72, 0x4d,0x58,0x81,0x57,0x60,0x8e,0x5e,0x67,0x95,0x62,0x67,0x95,0x60,0x62,0x8f,0x57, 0x5a,0x7e,0x6f,0x6e,0x98,0x44,0x43,0x55,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x49, 0x4a,0x4f,0x89,0x90,0xaa,0x73,0x7d,0x9c,0xb9,0xbc,0xc6,0xd3,0xd5,0xda,0xff,0xff, 0xff,0xe8,0xe8,0xe8,0x15,0x15,0x15,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,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,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,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,0x1e,0x18,0x1e, 0x4e,0x3c,0x4a,0x6e,0x75,0x94,0x5a,0x66,0x8d,0x63,0x53,0x77,0x6a,0x75,0x99,0x71, 0x7c,0x9e,0x75,0x80,0xa2,0x77,0x82,0xa3,0x7c,0x85,0xa7,0x7d,0x88,0xa8,0x82,0x8b, 0xaa,0x87,0x90,0xae,0x89,0x93,0xb0,0x8a,0x93,0xb0,0x8b,0x96,0xb1,0x8c,0x97,0xb2, 0x8e,0x97,0xb2,0x8c,0x96,0xb2,0x8a,0x94,0xb1,0x87,0x91,0xae,0x83,0x8e,0xac,0x73, 0x7f,0xa0,0x52,0x5c,0x84,0x64,0x70,0x96,0x40,0x40,0x44,0x03,0x03,0x04,0x03,0x03, 0x04,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05, 0x05,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x03,0x04,0x03, 0x03,0x04,0x03,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x3e,0x2f,0x39,0x3e,0x2f,0x39,0x7d,0x88,0xa8, 0x8e,0x99,0xb4,0x5b,0x67,0x90,0x5d,0x52,0x79,0x66,0x72,0x98,0x69,0x74,0x99,0x65, 0x72,0x96,0x52,0x56,0x81,0x5c,0x52,0x79,0x22,0x26,0x37,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05, 0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06, 0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x07,0x09,0x07,0x08,0x0a,0x07,0x08, 0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0c, 0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0b, 0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0e,0x0c,0x0d, 0x0f,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x0c,0x0d,0x0e,0x0c,0x0d,0x0f,0x0b,0x0c,0x0e, 0x0b,0x0b,0x0e,0x0b,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x09, 0x0a,0x0b,0x09,0x09,0x0a,0x08,0x09,0x0a,0x08,0x08,0x0a,0x1c,0x19,0x22,0x52,0x5d, 0x84,0x5f,0x54,0x77,0x62,0x53,0x76,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x54,0x76, 0x5f,0x54,0x76,0x5e,0x53,0x79,0x5a,0x52,0x79,0x52,0x4f,0x7a,0x52,0x55,0x7f,0x52, 0x5d,0x87,0x53,0x5e,0x88,0x52,0x5c,0x84,0x87,0x91,0xae,0x1d,0x1c,0x21,0x02,0x02, 0x02,0x02,0x02,0x02,0x27,0x1d,0x27,0x6c,0x57,0x6d,0x5a,0x48,0x5a,0x58,0x46,0x56, 0x59,0x46,0x57,0x4e,0x3e,0x4b,0x60,0x51,0x5f,0xd0,0xd4,0xde,0xbd,0xc0,0xcf,0x7d, 0x88,0xa4,0x55,0x5f,0x83,0x49,0x55,0x7a,0x46,0x4f,0x75,0x44,0x4d,0x70,0x41,0x4c, 0x6e,0x41,0x4d,0x71,0x4a,0x55,0x7f,0x57,0x60,0x8d,0x5f,0x67,0x94,0x61,0x67,0x96, 0x60,0x62,0x8f,0x57,0x58,0x7e,0x6f,0x70,0x99,0x42,0x42,0x53,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 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,0x0d,0x0d,0x0d, 0x88,0x8e,0xa1,0x60,0x6d,0x91,0x52,0x5d,0x80,0x7c,0x86,0xa1,0xda,0xdc,0xe5,0xe7, 0xe9,0xef,0xfa,0xfa,0xfc,0xfc,0xfc,0xfd,0xf0,0xf1,0xf1,0x1e,0x1e,0x1e,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,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,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,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,0x07,0x05,0x06,0x50,0x3e,0x4d,0x63,0x66,0x81,0x65,0x71,0x95,0x62,0x53,0x77, 0x63,0x6f,0x94,0x6f,0x7b,0x9e,0x74,0x7f,0xa1,0x76,0x82,0xa3,0x7c,0x86,0xa6,0x7c, 0x87,0xa7,0x80,0x8a,0xa9,0x84,0x8f,0xad,0x88,0x92,0xaf,0x88,0x92,0xae,0x8c,0x97, 0xb1,0x8c,0x97,0xb1,0x8c,0x97,0xb1,0x8e,0x98,0xb2,0x89,0x93,0xaf,0x89,0x93,0xaf, 0x84,0x8f,0xac,0x7c,0x88,0xa6,0x57,0x61,0x8a,0x54,0x5e,0x87,0x70,0x75,0x81,0x04, 0x04,0x05,0x04,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x06,0x05,0x04,0x06,0x05,0x04, 0x06,0x05,0x04,0x06,0x05,0x04,0x06,0x05,0x04,0x06,0x05,0x04,0x06,0x05,0x04,0x05, 0x04,0x04,0x05,0x04,0x03,0x04,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x3e,0x2f,0x39,0x3c,0x2e, 0x39,0x75,0x80,0xa1,0x8f,0x98,0xb3,0x5c,0x67,0x8f,0x56,0x50,0x79,0x66,0x73,0x97, 0x66,0x72,0x97,0x69,0x74,0x98,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x12,0x14,0x1b,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x05,0x04,0x04,0x05,0x04,0x04, 0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x05,0x06,0x07, 0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x07,0x09,0x07,0x08,0x0a,0x08, 0x09,0x0a,0x09,0x09,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0b, 0x0e,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0c,0x0d,0x10, 0x0c,0x0d,0x10,0x0d,0x0e,0x10,0x0d,0x0e,0x10,0x0d,0x0e,0x10,0x0d,0x0e,0x10,0x0e, 0x0e,0x11,0x0e,0x0e,0x11,0x0d,0x0e,0x11,0x0e,0x0e,0x11,0x0d,0x0e,0x11,0x0e,0x0e, 0x11,0x0d,0x0e,0x10,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x0b,0x0c,0x0e,0x0b,0x0b,0x0e, 0x0a,0x0b,0x0d,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09,0x0a,0x08,0x09,0x0a,0x17, 0x16,0x1c,0x53,0x5d,0x86,0x5c,0x53,0x78,0x61,0x54,0x76,0x60,0x53,0x76,0x5f,0x53, 0x77,0x5f,0x54,0x76,0x5f,0x54,0x76,0x5e,0x53,0x78,0x57,0x51,0x78,0x52,0x4f,0x79, 0x52,0x55,0x7d,0x52,0x5d,0x87,0x53,0x5e,0x88,0x52,0x5d,0x87,0x94,0x9e,0xb7,0x31, 0x30,0x36,0x02,0x02,0x02,0x02,0x03,0x03,0x1c,0x17,0x1c,0x67,0x52,0x67,0x58,0x47, 0x57,0x58,0x46,0x57,0x57,0x44,0x55,0x4e,0x3e,0x4c,0x67,0x59,0x68,0xd1,0xd5,0xdf, 0xba,0xbe,0xce,0x7a,0x84,0xa2,0x52,0x5d,0x82,0x4b,0x56,0x7a,0x47,0x50,0x75,0x42, 0x4e,0x72,0x41,0x4b,0x6f,0x40,0x4c,0x70,0x4b,0x55,0x7f,0x56,0x5f,0x8d,0x5e,0x67, 0x94,0x63,0x68,0x96,0x5e,0x61,0x8e,0x54,0x56,0x7d,0x6e,0x6e,0x97,0x40,0x40,0x51, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x3a,0x3a, 0x3a,0x85,0x8e,0xa9,0x4e,0x59,0x7d,0x4c,0x56,0x7c,0x5b,0x68,0x8e,0xba,0xc1,0xd2, 0xde,0xe1,0xe9,0xef,0xf0,0xf5,0xf0,0xf1,0xf5,0xee,0xf0,0xf4,0xe1,0xe3,0xeb,0xe5, 0xe7,0xec,0x2e,0x2e,0x2e,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,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,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,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,0x59,0x46,0x58,0x5d,0x5a,0x74,0x6c,0x77, 0x9b,0x5b,0x52,0x79,0x58,0x64,0x8c,0x6e,0x7a,0x9c,0x71,0x7c,0x9f,0x74,0x80,0xa2, 0x79,0x83,0xa3,0x7a,0x84,0xa5,0x7e,0x89,0xa8,0x82,0x8e,0xaa,0x84,0x8f,0xac,0x87, 0x91,0xad,0x8a,0x92,0xaf,0x8c,0x97,0xb1,0x90,0x99,0xb4,0x8e,0x96,0xb1,0x8a,0x94, 0xb0,0x8a,0x92,0xaf,0x84,0x8f,0xac,0x81,0x8a,0xa9,0x65,0x71,0x96,0x51,0x4f,0x7b, 0x83,0x8b,0xa3,0x07,0x07,0x08,0x05,0x04,0x05,0x05,0x04,0x06,0x06,0x05,0x06,0x06, 0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05, 0x06,0x06,0x05,0x06,0x05,0x04,0x05,0x04,0x04,0x05,0x04,0x03,0x04,0x04,0x03,0x04, 0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,0x3c, 0x2e,0x39,0x3f,0x30,0x3a,0x6e,0x7b,0x9c,0x91,0x9b,0xb6,0x55,0x60,0x89,0x52,0x4f, 0x7b,0x67,0x73,0x98,0x6a,0x76,0x99,0x65,0x72,0x97,0x5c,0x52,0x79,0x52,0x57,0x81, 0x07,0x07,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x03,0x03,0x02,0x03,0x04,0x03,0x03,0x05,0x03,0x03,0x05,0x04,0x04,0x05,0x04, 0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06, 0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x08,0x09,0x0a, 0x08,0x09,0x0a,0x09,0x09,0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d,0x0a, 0x0b,0x0e,0x0b,0x0c,0x0f,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x0d,0x0e, 0x10,0x0d,0x0e,0x11,0x0e,0x0e,0x12,0x0e,0x0f,0x12,0x0e,0x10,0x12,0x0e,0x0e,0x12, 0x0e,0x0e,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e, 0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0e,0x11,0x0d,0x0e,0x11,0x0c,0x0d, 0x0f,0x0c,0x0d,0x0f,0x0c,0x0d,0x0e,0x0b,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0c, 0x09,0x0a,0x0b,0x17,0x16,0x1d,0x53,0x5d,0x86,0x5c,0x53,0x78,0x62,0x54,0x77,0x5f, 0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x54,0x76,0x5e,0x54,0x78,0x5b,0x53, 0x78,0x52,0x50,0x79,0x53,0x54,0x7e,0x53,0x5e,0x85,0x53,0x5e,0x88,0x55,0x61,0x89, 0x99,0xa2,0xba,0x47,0x45,0x4b,0x02,0x02,0x02,0x03,0x03,0x04,0x12,0x0f,0x13,0x66, 0x52,0x66,0x58,0x47,0x57,0x57,0x45,0x56,0x55,0x43,0x53,0x4e,0x3d,0x4c,0x6b,0x5d, 0x6b,0xd1,0xd5,0xdf,0xb9,0xbf,0xce,0x7a,0x83,0xa1,0x52,0x5d,0x83,0x47,0x53,0x79, 0x45,0x4f,0x74,0x42,0x4e,0x72,0x41,0x49,0x6f,0x40,0x4c,0x70,0x48,0x52,0x7b,0x54, 0x5e,0x8a,0x5d,0x65,0x94,0x62,0x68,0x97,0x5d,0x60,0x8b,0x53,0x56,0x7c,0x6a,0x6c, 0x96,0x3e,0x3e,0x4e,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,0x48, 0x48,0x4a,0x7b,0x85,0xa4,0x4a,0x54,0x79,0x4d,0x55,0x7d,0x58,0x64,0x8d,0x62,0x6e, 0x94,0xd1,0xd5,0xe0,0xe7,0xe9,0xef,0xee,0xef,0xf4,0xea,0xed,0xf1,0xe1,0xe3,0xeb, 0xc7,0xcc,0xda,0xca,0xcf,0xdd,0xeb,0xed,0xf3,0x41,0x41,0x41,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,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,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,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,0x34,0x2a,0x34,0x5c, 0x53,0x6a,0x6f,0x7b,0x9e,0x52,0x4f,0x7a,0x52,0x5d,0x85,0x6a,0x76,0x9a,0x70,0x7b, 0x9e,0x73,0x7e,0xa0,0x76,0x81,0xa2,0x78,0x83,0xa2,0x7e,0x88,0xa7,0x80,0x8a,0xa8, 0x82,0x8c,0xaa,0x88,0x91,0xae,0x88,0x91,0xaf,0x89,0x91,0xae,0x8f,0x97,0xb2,0x8f, 0x97,0xb2,0x8b,0x94,0xaf,0x89,0x90,0xad,0x85,0x8e,0xac,0x81,0x8a,0xa8,0x70,0x7a, 0x9c,0x52,0x51,0x7b,0x6c,0x77,0x99,0x3e,0x3e,0x43,0x05,0x05,0x06,0x06,0x05,0x06, 0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06, 0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x04, 0x05,0x04,0x03,0x04,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x3e,0x2f,0x3a,0x3e,0x2f,0x39,0x6c,0x79,0x9b,0x91,0x9b,0xb6,0x52, 0x57,0x82,0x52,0x4f,0x7b,0x69,0x74,0x98,0x69,0x75,0x99,0x65,0x71,0x95,0x64,0x53, 0x75,0x55,0x62,0x89,0x02,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03, 0x04,0x03,0x03,0x05,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x05,0x03,0x03,0x05, 0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x08,0x06, 0x06,0x08,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09, 0x0a,0x09,0x0a,0x0b,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e, 0x0a,0x0b,0x0e,0x0b,0x0c,0x0f,0x0c,0x0d,0x0f,0x0d,0x0e,0x10,0x0d,0x0e,0x11,0x0e, 0x0e,0x12,0x0e,0x0e,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0f,0x11,0x14,0x10,0x11, 0x14,0x0f,0x11,0x13,0x10,0x11,0x14,0x0f,0x11,0x13,0x10,0x11,0x14,0x0f,0x10,0x12, 0x0f,0x11,0x13,0x0f,0x10,0x12,0x10,0x11,0x14,0x0f,0x10,0x13,0x0e,0x0f,0x12,0x0e, 0x0f,0x12,0x0e,0x0e,0x11,0x0d,0x0e,0x11,0x0e,0x0e,0x11,0x0d,0x0e,0x10,0x0c,0x0d, 0x0e,0x0b,0x0c,0x0e,0x0a,0x0a,0x0c,0x16,0x15,0x1d,0x54,0x5f,0x87,0x55,0x51,0x78, 0x61,0x53,0x76,0x5f,0x54,0x76,0x60,0x54,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5e, 0x54,0x79,0x5d,0x53,0x79,0x52,0x50,0x79,0x53,0x54,0x7d,0x52,0x5d,0x85,0x53,0x5f, 0x88,0x57,0x62,0x8a,0x98,0xa1,0xba,0x5b,0x58,0x5d,0x03,0x03,0x04,0x03,0x03,0x04, 0x06,0x05,0x07,0x65,0x52,0x65,0x57,0x45,0x55,0x58,0x46,0x57,0x54,0x43,0x52,0x4e, 0x3c,0x4b,0x6b,0x5c,0x6b,0xd1,0xd4,0xde,0xb7,0xbd,0xcd,0x76,0x80,0xa0,0x50,0x5d, 0x82,0x47,0x54,0x79,0x44,0x4e,0x73,0x41,0x4d,0x6f,0x41,0x4c,0x6d,0x3f,0x4b,0x6e, 0x46,0x52,0x78,0x53,0x5c,0x87,0x5c,0x66,0x94,0x61,0x68,0x96,0x5b,0x5d,0x8b,0x52, 0x53,0x79,0x68,0x6a,0x97,0x3a,0x3a,0x4b,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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, 0x4e,0x50,0x57,0x65,0x71,0x93,0x48,0x52,0x78,0x4f,0x50,0x79,0x53,0x5e,0x88,0x5a, 0x65,0x8d,0x9c,0xa5,0xbe,0xd8,0xdb,0xe5,0xeb,0xee,0xf2,0xea,0xeb,0xf1,0xeb,0xed, 0xf1,0xda,0xdd,0xe6,0xbc,0xc2,0xd3,0xba,0xc0,0xd1,0xc4,0xca,0xd8,0xe6,0xe8,0xf0, 0x41,0x41,0x41,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,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,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,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, 0x12,0x0f,0x12,0x5a,0x4c,0x60,0x72,0x7e,0xa0,0x52,0x56,0x81,0x52,0x4f,0x7a,0x68, 0x74,0x99,0x70,0x7b,0x9d,0x71,0x7b,0x9e,0x74,0x80,0xa0,0x78,0x82,0xa2,0x7a,0x86, 0xa5,0x80,0x8a,0xa9,0x82,0x8c,0xaa,0x85,0x8e,0xac,0x89,0x90,0xae,0x89,0x91,0xae, 0x8a,0x94,0xae,0x88,0x91,0xad,0x89,0x94,0xae,0x87,0x8f,0xab,0x85,0x8e,0xaa,0x80, 0x8b,0xa8,0x7a,0x84,0xa3,0x52,0x5b,0x85,0x57,0x63,0x8a,0x68,0x6c,0x77,0x05,0x05, 0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08, 0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06, 0x05,0x06,0x05,0x04,0x05,0x04,0x03,0x04,0x04,0x03,0x04,0x03,0x03,0x04,0x03,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x03,0x03,0x03,0x3c,0x2d,0x38,0x3e,0x2f,0x39,0x6b,0x76,0x9a, 0x91,0x9a,0xb4,0x52,0x54,0x7f,0x52,0x50,0x7b,0x69,0x74,0x98,0x6a,0x75,0x99,0x5e, 0x6a,0x91,0x64,0x53,0x76,0x53,0x5e,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x03,0x03,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x04,0x04,0x05,0x04,0x05, 0x06,0x04,0x04,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x09, 0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08, 0x09,0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x0a,0x0b,0x0e,0x0b,0x0c, 0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x10,0x0d,0x0e,0x10,0x0d,0x0e,0x10,0x0e,0x0e,0x11, 0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0f,0x11,0x14,0x0f,0x11,0x14,0x0f,0x11,0x14,0x10, 0x12,0x15,0x10,0x12,0x15,0x11,0x12,0x16,0x11,0x12,0x16,0x11,0x12,0x16,0x11,0x12, 0x16,0x11,0x12,0x15,0x11,0x12,0x15,0x10,0x12,0x15,0x11,0x12,0x15,0x10,0x12,0x15, 0x10,0x12,0x15,0x10,0x11,0x14,0x10,0x11,0x14,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e, 0x0e,0x11,0x0c,0x0d,0x0f,0x0c,0x0c,0x0e,0x0a,0x0b,0x0d,0x18,0x17,0x1f,0x53,0x5d, 0x86,0x54,0x51,0x78,0x60,0x53,0x75,0x5f,0x53,0x76,0x5f,0x54,0x77,0x60,0x53,0x76, 0x5f,0x53,0x77,0x5e,0x53,0x79,0x5a,0x52,0x79,0x53,0x50,0x7a,0x53,0x53,0x7c,0x53, 0x5e,0x85,0x55,0x60,0x88,0x57,0x62,0x8a,0x84,0x8f,0xad,0x6e,0x69,0x6f,0x03,0x04, 0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x66,0x54,0x67,0x53,0x42,0x51,0x55,0x44,0x54, 0x52,0x41,0x50,0x4e,0x3d,0x4b,0x6a,0x5b,0x6a,0xd1,0xd4,0xde,0xb7,0xbd,0xcd,0x73, 0x7e,0x9b,0x50,0x5b,0x81,0x48,0x54,0x7a,0x45,0x4e,0x73,0x40,0x4d,0x71,0x40,0x4a, 0x6c,0x3f,0x4a,0x6d,0x45,0x4e,0x77,0x4f,0x59,0x82,0x5b,0x62,0x91,0x5e,0x67,0x96, 0x59,0x5d,0x89,0x50,0x52,0x78,0x67,0x68,0x95,0x35,0x36,0x48,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,0x50,0x54,0x5f,0x57,0x62,0x86,0x49,0x51,0x76,0x51,0x51,0x7a,0x52,0x57,0x83, 0x5a,0x66,0x8e,0x5b,0x66,0x8e,0xc9,0xcf,0xdb,0xe3,0xe6,0xed,0xeb,0xee,0xf2,0xe6, 0xe7,0xee,0xeb,0xed,0xf1,0xd6,0xd9,0xe3,0xbe,0xc3,0xd3,0xb4,0xbb,0xce,0xb3,0xba, 0xce,0xc0,0xc6,0xd6,0xdd,0xe1,0xeb,0x37,0x37,0x37,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,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,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,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,0x04,0x03,0x04,0x5e,0x4b,0x5e,0x6d,0x78,0x99,0x55,0x62,0x8a, 0x52,0x4f,0x79,0x64,0x70,0x94,0x6b,0x78,0x9b,0x70,0x7b,0x9d,0x73,0x7f,0x9f,0x77, 0x80,0xa1,0x7b,0x85,0xa5,0x7e,0x88,0xa7,0x81,0x8b,0xa8,0x81,0x8b,0xa7,0x86,0x8f, 0xab,0x86,0x90,0xac,0x88,0x92,0xad,0x8c,0x95,0xaf,0x88,0x92,0xad,0x86,0x8f,0xac, 0x84,0x8d,0xaa,0x81,0x8a,0xa7,0x7f,0x89,0xa6,0x59,0x65,0x8c,0x51,0x53,0x7d,0x8a, 0x92,0xa7,0x09,0x09,0x0a,0x06,0x06,0x08,0x06,0x06,0x07,0x07,0x06,0x08,0x07,0x06, 0x08,0x07,0x06,0x08,0x07,0x06,0x08,0x07,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x05,0x06,0x06,0x05,0x06,0x05,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04, 0x03,0x04,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x3e,0x2f,0x3a,0x3e,0x2f, 0x39,0x6a,0x75,0x99,0x93,0x9c,0xb7,0x52,0x50,0x7b,0x52,0x52,0x7d,0x6b,0x76,0x9a, 0x69,0x74,0x98,0x5a,0x65,0x8c,0x62,0x53,0x77,0x3d,0x45,0x60,0x00,0x00,0x00,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03, 0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x05,0x03,0x03,0x05,0x04,0x04,0x05,0x04, 0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x06,0x06,0x09,0x08,0x08,0x0a,0x0b,0x0a, 0x0e,0x0e,0x0d,0x11,0x10,0x0e,0x13,0x11,0x0f,0x14,0x11,0x0f,0x14,0x10,0x0f,0x14, 0x10,0x0f,0x14,0x13,0x12,0x17,0x14,0x12,0x18,0x12,0x11,0x16,0x0b,0x0c,0x0e,0x0c, 0x0d,0x10,0x0c,0x0d,0x0f,0x0c,0x0d,0x10,0x0d,0x0e,0x10,0x0d,0x0e,0x11,0x0e,0x0f, 0x12,0x0e,0x0f,0x12,0x0f,0x11,0x14,0x0f,0x10,0x13,0x10,0x11,0x15,0x11,0x12,0x16, 0x11,0x12,0x16,0x11,0x12,0x16,0x12,0x12,0x16,0x12,0x12,0x16,0x12,0x12,0x16,0x12, 0x13,0x16,0x13,0x14,0x18,0x12,0x13,0x17,0x12,0x12,0x16,0x12,0x13,0x16,0x12,0x13, 0x16,0x11,0x12,0x16,0x11,0x12,0x15,0x11,0x12,0x15,0x11,0x12,0x15,0x10,0x12,0x14, 0x10,0x11,0x14,0x0f,0x10,0x12,0x0e,0x0f,0x12,0x0d,0x0e,0x10,0x0b,0x0c,0x0e,0x18, 0x17,0x1f,0x52,0x51,0x7a,0x5a,0x53,0x77,0x60,0x53,0x75,0x5f,0x53,0x76,0x5f,0x54, 0x77,0x5f,0x54,0x76,0x60,0x54,0x76,0x5e,0x54,0x78,0x5b,0x52,0x79,0x53,0x4f,0x7a, 0x52,0x52,0x7c,0x52,0x5d,0x84,0x53,0x5e,0x88,0x55,0x60,0x88,0x75,0x80,0xa1,0x7e, 0x7a,0x7f,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x04,0x05,0x65,0x51,0x66,0x52,0x40, 0x50,0x55,0x43,0x53,0x50,0x3f,0x4e,0x4c,0x3b,0x49,0x68,0x5b,0x68,0xcd,0xd2,0xdc, 0xb7,0xbd,0xcc,0x73,0x7d,0x9d,0x50,0x5d,0x82,0x48,0x53,0x77,0x44,0x4f,0x73,0x41, 0x4b,0x6e,0x40,0x48,0x6b,0x3f,0x4a,0x6a,0x43,0x4c,0x74,0x4b,0x55,0x80,0x58,0x60, 0x8d,0x5e,0x68,0x95,0x58,0x5d,0x88,0x4f,0x52,0x79,0x65,0x66,0x95,0x32,0x33,0x46, 0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02, 0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x52,0x58,0x68,0x54,0x5e,0x83,0x4b,0x4e,0x75,0x52,0x4f,0x7b,0x52,0x52, 0x7d,0x57,0x63,0x8c,0x5d,0x6a,0x91,0x94,0x9d,0xb8,0xd8,0xdb,0xe5,0xeb,0xee,0xf2, 0xe9,0xea,0xf0,0xe5,0xe7,0xee,0xe8,0xea,0xf0,0xcf,0xd3,0xdf,0xc0,0xc6,0xd6,0xb7, 0xbc,0xcf,0xaf,0xb7,0xca,0xaf,0xb7,0xca,0xbb,0xc1,0xd2,0xda,0xdd,0xe8,0x31,0x31, 0x31,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,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,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,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,0x5a,0x47,0x5a,0x65,0x6a, 0x8b,0x5c,0x66,0x8f,0x54,0x50,0x78,0x61,0x6b,0x92,0x6b,0x77,0x9a,0x70,0x7b,0x9d, 0x72,0x7d,0x9f,0x74,0x7f,0x9f,0x77,0x81,0xa2,0x7b,0x84,0xa4,0x7f,0x88,0xa6,0x81, 0x8a,0xa7,0x85,0x8e,0xab,0x87,0x8f,0xac,0x86,0x8f,0xac,0x87,0x92,0xad,0x87,0x92, 0xad,0x86,0x90,0xad,0x84,0x8e,0xab,0x84,0x8e,0xab,0x7e,0x88,0xa5,0x68,0x71,0x95, 0x51,0x4e,0x77,0x76,0x80,0xa1,0x37,0x37,0x3a,0x06,0x06,0x07,0x07,0x06,0x09,0x06, 0x06,0x08,0x07,0x06,0x09,0x07,0x06,0x09,0x07,0x06,0x08,0x06,0x06,0x08,0x06,0x06, 0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x05,0x04,0x05, 0x04,0x04,0x05,0x04,0x03,0x04,0x04,0x03,0x04,0x04,0x03,0x04,0x04,0x03,0x04,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x02,0x02,0x02,0x05,0x04,0x05,0x3e, 0x2f,0x3a,0x3f,0x30,0x3c,0x6e,0x7a,0x9c,0x93,0x9c,0xb7,0x52,0x4f,0x7b,0x52,0x5b, 0x84,0x6a,0x76,0x99,0x69,0x74,0x98,0x54,0x5f,0x88,0x52,0x4f,0x7a,0x2b,0x31,0x43, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03, 0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x06, 0x04,0x04,0x06,0x05,0x05,0x06,0x07,0x06,0x09,0x0a,0x0a,0x0d,0x0f,0x0e,0x12,0x15, 0x12,0x17,0x19,0x16,0x1b,0x1b,0x18,0x1e,0x1d,0x19,0x20,0x1e,0x1a,0x22,0x1e,0x1a, 0x22,0x1e,0x1a,0x22,0x20,0x1c,0x23,0x26,0x20,0x29,0x23,0x1f,0x26,0x16,0x15,0x1b, 0x0e,0x0f,0x12,0x0d,0x0e,0x11,0x0d,0x0e,0x11,0x0d,0x0e,0x11,0x0e,0x0f,0x13,0x0f, 0x10,0x13,0x0f,0x11,0x14,0x10,0x11,0x15,0x10,0x11,0x15,0x11,0x12,0x16,0x11,0x12, 0x16,0x11,0x12,0x16,0x12,0x13,0x16,0x12,0x14,0x17,0x12,0x14,0x17,0x12,0x14,0x17, 0x13,0x14,0x18,0x13,0x15,0x19,0x13,0x15,0x19,0x13,0x15,0x19,0x13,0x14,0x18,0x12, 0x14,0x17,0x13,0x14,0x18,0x12,0x14,0x17,0x12,0x13,0x16,0x12,0x13,0x16,0x12,0x12, 0x16,0x11,0x12,0x16,0x11,0x12,0x16,0x10,0x12,0x14,0x0f,0x10,0x13,0x0e,0x0f,0x12, 0x0c,0x0d,0x0f,0x14,0x14,0x19,0x52,0x51,0x79,0x56,0x51,0x78,0x61,0x53,0x76,0x5f, 0x54,0x75,0x5f,0x53,0x76,0x5f,0x53,0x76,0x5f,0x54,0x76,0x60,0x54,0x77,0x5c,0x53, 0x78,0x52,0x50,0x79,0x52,0x50,0x7b,0x52,0x5b,0x84,0x53,0x5e,0x88,0x54,0x5f,0x88, 0x6a,0x75,0x9a,0x8c,0x88,0x8c,0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x05,0x06,0x65, 0x52,0x67,0x52,0x41,0x50,0x55,0x44,0x55,0x50,0x3f,0x4e,0x4b,0x3a,0x49,0x66,0x59, 0x66,0xcd,0xd3,0xdc,0xb5,0xbb,0xcb,0x71,0x7c,0x9b,0x50,0x5b,0x81,0x48,0x54,0x79, 0x45,0x4e,0x73,0x40,0x4c,0x6e,0x40,0x48,0x6c,0x3f,0x49,0x6c,0x40,0x4b,0x71,0x49, 0x54,0x7c,0x56,0x5e,0x8b,0x5d,0x66,0x94,0x57,0x5d,0x86,0x4f,0x52,0x79,0x63,0x66, 0x95,0x30,0x30,0x45,0x02,0x03,0x03,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03, 0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x02, 0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 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,0x53,0x5a,0x6d,0x4b,0x56,0x79,0x46,0x47,0x6c,0x52,0x4f,0x7a,0x52, 0x4f,0x7b,0x54,0x5f,0x89,0x60,0x6d,0x94,0x6d,0x79,0x9d,0xd0,0xd5,0xe0,0xe2,0xe5, 0xed,0xed,0xee,0xf2,0xe6,0xe8,0xee,0xea,0xeb,0xf1,0xe2,0xe5,0xeb,0xc7,0xcc,0xda, 0xbb,0xc2,0xd2,0xb9,0xc0,0xd1,0xb4,0xba,0xce,0xab,0xb2,0xc7,0xa9,0xb1,0xc7,0xb9, 0xc0,0xd1,0xce,0xd1,0xde,0x1e,0x1e,0x1e,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, 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,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, 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,0x3d, 0x31,0x3e,0x5e,0x5d,0x7a,0x5f,0x6b,0x91,0x5d,0x52,0x77,0x5d,0x68,0x8f,0x6a,0x75, 0x9a,0x6d,0x79,0x9c,0x70,0x7a,0x9d,0x73,0x7d,0x9e,0x78,0x82,0xa2,0x78,0x83,0xa2, 0x7c,0x85,0xa5,0x7f,0x88,0xa6,0x80,0x8b,0xa8,0x85,0x8e,0xab,0x86,0x8f,0xac,0x86, 0x8e,0xab,0x86,0x8f,0xac,0x85,0x8e,0xab,0x86,0x8f,0xac,0x82,0x8b,0xa8,0x7e,0x88, 0xa6,0x74,0x7e,0x9f,0x50,0x51,0x7a,0x5c,0x67,0x8d,0x6a,0x6d,0x76,0x07,0x06,0x09, 0x07,0x06,0x09,0x07,0x07,0x09,0x08,0x07,0x09,0x08,0x07,0x09,0x07,0x06,0x09,0x07, 0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x05, 0x06,0x06,0x05,0x06,0x05,0x04,0x06,0x05,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x05, 0x05,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x05,0x05,0x04,0x05,0x04,0x03,0x04,0x04, 0x03,0x04,0x04,0x03,0x04,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x09,0x07,0x08,0x3d,0x2f,0x39,0x41,0x33,0x3e,0x6b,0x76,0x9a,0x97,0xa0,0xb9,0x53, 0x50,0x7a,0x53,0x5f,0x88,0x6c,0x77,0x9a,0x67,0x73,0x98,0x52,0x4f,0x7b,0x52,0x54, 0x7e,0x1d,0x21,0x2c,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03, 0x03,0x05,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x05,0x03,0x03,0x05,0x04,0x04, 0x06,0x05,0x05,0x06,0x07,0x07,0x0a,0x0d,0x0b,0x0e,0x12,0x0f,0x14,0x18,0x15,0x1a, 0x1c,0x18,0x1e,0x1e,0x1a,0x21,0x20,0x1b,0x22,0x21,0x1c,0x24,0x21,0x1d,0x25,0x22, 0x1d,0x25,0x22,0x1e,0x26,0x22,0x1e,0x26,0x23,0x1e,0x27,0x22,0x1e,0x26,0x1d,0x1a, 0x21,0x11,0x11,0x15,0x14,0x13,0x18,0x16,0x15,0x1a,0x19,0x17,0x1c,0x10,0x11,0x15, 0x0f,0x11,0x14,0x10,0x11,0x15,0x10,0x11,0x15,0x11,0x12,0x16,0x12,0x12,0x16,0x12, 0x13,0x17,0x12,0x13,0x17,0x12,0x14,0x17,0x13,0x15,0x19,0x13,0x15,0x19,0x14,0x15, 0x19,0x15,0x16,0x1a,0x15,0x16,0x1a,0x15,0x16,0x1a,0x15,0x16,0x1a,0x15,0x16,0x1a, 0x15,0x16,0x1a,0x14,0x16,0x1a,0x14,0x16,0x1a,0x13,0x15,0x19,0x13,0x15,0x18,0x13, 0x15,0x18,0x13,0x14,0x18,0x12,0x14,0x17,0x12,0x13,0x16,0x11,0x12,0x16,0x10,0x12, 0x14,0x0e,0x0f,0x12,0x0d,0x0e,0x10,0x15,0x15,0x1b,0x53,0x51,0x79,0x52,0x50,0x78, 0x60,0x53,0x75,0x5f,0x54,0x75,0x5f,0x53,0x76,0x5f,0x53,0x75,0x5f,0x53,0x76,0x5f, 0x53,0x76,0x5c,0x53,0x78,0x53,0x50,0x79,0x52,0x51,0x7a,0x52,0x5c,0x85,0x54,0x5f, 0x88,0x55,0x5f,0x87,0x61,0x6d,0x92,0x97,0x92,0x98,0x05,0x05,0x06,0x05,0x05,0x06, 0x04,0x05,0x06,0x62,0x50,0x64,0x4e,0x3e,0x4b,0x53,0x43,0x51,0x4e,0x3f,0x4d,0x4b, 0x3b,0x49,0x59,0x4a,0x58,0xce,0xd3,0xdd,0xb0,0xb7,0xc8,0x71,0x7c,0x9c,0x51,0x5c, 0x80,0x4a,0x55,0x79,0x45,0x4f,0x74,0x41,0x4c,0x6f,0x3f,0x4a,0x6b,0x3f,0x47,0x6b, 0x40,0x4b,0x70,0x47,0x52,0x79,0x53,0x5d,0x88,0x5d,0x64,0x92,0x57,0x5d,0x86,0x55, 0x58,0x80,0x61,0x63,0x94,0x2d,0x2e,0x43,0x03,0x03,0x04,0x02,0x03,0x03,0x03,0x03, 0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x3d,0x43,0x50,0x4e,0x59,0x7e,0x43,0x43,0x66,0x51,0x4e,0x79, 0x52,0x50,0x7b,0x52,0x5d,0x86,0x5d,0x6a,0x91,0x74,0x80,0xa2,0xd0,0xd5,0xe0,0xd9, 0xdd,0xe6,0xd0,0xcf,0xd5,0xa7,0x9e,0xab,0xe0,0xe1,0xe6,0xfa,0xfc,0xfc,0xeb,0xed, 0xf1,0xcc,0xd1,0xde,0xbc,0xc2,0xd3,0xb7,0xbe,0xcf,0xb2,0xb9,0xcb,0xac,0xb4,0xc8, 0xa8,0xb0,0xc6,0xa7,0xaf,0xc4,0xb2,0xb9,0xcc,0xc3,0xc8,0xd6,0x0e,0x0e,0x0e,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,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,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,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,0x02,0x02,0x02, 0x02,0x02,0x02,0x28,0x20,0x28,0x5b,0x56,0x6f,0x6d,0x7a,0x9d,0x5a,0x52,0x78,0x59, 0x63,0x8b,0x68,0x73,0x97,0x6b,0x76,0x98,0x70,0x7a,0x9c,0x6f,0x7a,0x9c,0x72,0x7d, 0x9d,0x77,0x80,0xa1,0x7b,0x85,0xa3,0x7d,0x86,0xa4,0x82,0x8b,0xa8,0x83,0x8c,0xa8, 0x84,0x8d,0xa9,0x85,0x8e,0xaa,0x86,0x90,0xab,0x86,0x90,0xab,0x84,0x8d,0xaa,0x84, 0x8c,0xa9,0x7e,0x86,0xa5,0x7a,0x84,0xa2,0x52,0x5d,0x85,0x54,0x5f,0x86,0x94,0x99, 0xaa,0x07,0x06,0x09,0x08,0x07,0x0a,0x07,0x07,0x09,0x07,0x07,0x09,0x08,0x07,0x0a, 0x08,0x07,0x09,0x08,0x07,0x09,0x07,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06, 0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x05,0x04,0x06,0x06,0x05, 0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06, 0x06,0x05,0x06,0x05,0x04,0x06,0x05,0x04,0x05,0x05,0x04,0x06,0x04,0x03,0x04,0x04, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x02,0x03,0x03,0x02, 0x03,0x02,0x02,0x03,0x0d,0x0a,0x0c,0x3d,0x2e,0x3a,0x41,0x34,0x3f,0x6d,0x79,0x9b, 0x95,0x9f,0xb8,0x54,0x50,0x79,0x5b,0x66,0x8d,0x6a,0x75,0x99,0x6b,0x76,0x9a,0x53, 0x50,0x7a,0x54,0x5f,0x88,0x12,0x15,0x1d,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x05,0x03,0x03,0x05,0x04,0x04,0x05,0x04,0x04,0x06,0x05, 0x05,0x06,0x07,0x06,0x09,0x0b,0x0a,0x0e,0x12,0x0f,0x14,0x18,0x15,0x1a,0x1c,0x19, 0x1f,0x1e,0x1a,0x22,0x20,0x1c,0x23,0x21,0x1c,0x24,0x21,0x1d,0x25,0x21,0x1d,0x24, 0x1f,0x1b,0x23,0x1e,0x1a,0x22,0x1b,0x18,0x1f,0x1b,0x18,0x1f,0x1a,0x17,0x1e,0x17, 0x16,0x1c,0x14,0x13,0x19,0x15,0x14,0x19,0x17,0x16,0x1b,0x1e,0x1b,0x22,0x1f,0x1c, 0x24,0x19,0x17,0x1e,0x10,0x12,0x16,0x11,0x12,0x16,0x12,0x12,0x16,0x12,0x13,0x17, 0x12,0x14,0x18,0x13,0x14,0x18,0x14,0x16,0x1a,0x14,0x16,0x1a,0x14,0x16,0x1a,0x15, 0x16,0x1b,0x15,0x16,0x1b,0x16,0x17,0x1b,0x15,0x16,0x1b,0x15,0x16,0x1a,0x15,0x16, 0x1b,0x15,0x16,0x1b,0x15,0x16,0x1b,0x15,0x16,0x1b,0x15,0x16,0x1a,0x15,0x16,0x1a, 0x14,0x16,0x1a,0x13,0x15,0x18,0x13,0x14,0x18,0x13,0x14,0x18,0x12,0x14,0x17,0x12, 0x13,0x16,0x11,0x12,0x16,0x10,0x11,0x14,0x0e,0x0f,0x12,0x15,0x15,0x1c,0x52,0x50, 0x78,0x52,0x50,0x78,0x62,0x54,0x74,0x5f,0x53,0x75,0x5e,0x53,0x75,0x5f,0x53,0x76, 0x5f,0x54,0x76,0x5f,0x53,0x76,0x5d,0x54,0x78,0x54,0x51,0x78,0x52,0x51,0x7a,0x53, 0x5b,0x82,0x55,0x5f,0x87,0x54,0x5e,0x86,0x5e,0x6a,0x90,0xa3,0xa0,0xa5,0x06,0x06, 0x06,0x06,0x06,0x06,0x04,0x05,0x06,0x5b,0x4b,0x5c,0x4e,0x3e,0x4b,0x52,0x41,0x51, 0x4e,0x3f,0x4d,0x4a,0x3a,0x48,0x56,0x47,0x55,0xcb,0xd0,0xdb,0xb1,0xb7,0xc8,0x6c, 0x78,0x99,0x51,0x5d,0x80,0x4b,0x56,0x79,0x45,0x4e,0x73,0x41,0x4b,0x6f,0x3e,0x48, 0x6b,0x3e,0x47,0x6a,0x3f,0x4a,0x6c,0x44,0x50,0x78,0x51,0x59,0x84,0x5c,0x62,0x8f, 0x56,0x5b,0x85,0x56,0x59,0x81,0x60,0x62,0x94,0x32,0x32,0x4a,0x03,0x03,0x04,0x03, 0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04, 0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04, 0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x26,0x29,0x30,0x53,0x5f,0x86,0x42,0x42,0x65,0x4f,0x4d, 0x77,0x52,0x4f,0x7b,0x52,0x5a,0x84,0x58,0x64,0x8c,0x64,0x6f,0x95,0xcf,0xd3,0xdf, 0xa7,0xa5,0xaf,0x32,0x2b,0x33,0x37,0x2c,0x37,0x1b,0x15,0x1b,0x00,0x00,0x00,0x48, 0x48,0x48,0xdb,0xdb,0xdb,0xf8,0xf9,0xfa,0xd1,0xd6,0xe0,0xb7,0xbe,0xcf,0xad,0xb4, 0xc9,0xa9,0xb0,0xc6,0xa7,0xaf,0xc4,0xa2,0xab,0xc2,0xa1,0xa9,0xc1,0xaa,0xb2,0xc7, 0xc6,0xcd,0xdc,0x08,0x08,0x08,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,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x10,0x0d,0x10,0x5c,0x51,0x66,0x82,0x8e,0xaa, 0x51,0x4e,0x79,0x54,0x5e,0x87,0x67,0x72,0x95,0x6a,0x74,0x98,0x6e,0x78,0x9a,0x70, 0x7b,0x9c,0x71,0x7c,0x9d,0x74,0x7e,0x9f,0x78,0x82,0xa1,0x78,0x84,0xa1,0x7e,0x86, 0xa5,0x82,0x8b,0xa7,0x83,0x8b,0xa8,0x84,0x8c,0xa9,0x84,0x8c,0xa9,0x86,0x8e,0xaa, 0x84,0x8d,0xa9,0x81,0x8a,0xa7,0x81,0x8a,0xa7,0x7a,0x84,0xa2,0x5f,0x69,0x8e,0x50, 0x50,0x79,0x91,0x99,0xb2,0x35,0x35,0x37,0x08,0x07,0x0a,0x09,0x08,0x0a,0x08,0x07, 0x0a,0x09,0x07,0x0a,0x08,0x07,0x0a,0x07,0x06,0x09,0x07,0x06,0x09,0x07,0x06,0x08, 0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06, 0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x07,0x06,0x08,0x07,0x06,0x08,0x07,0x06, 0x09,0x07,0x06,0x09,0x07,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07, 0x06,0x05,0x06,0x05,0x05,0x06,0x05,0x04,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x04, 0x03,0x05,0x04,0x03,0x05,0x04,0x03,0x04,0x11,0x0e,0x10,0x3d,0x2e,0x3a,0x42,0x33, 0x3e,0x72,0x7d,0xa0,0x93,0x9c,0xb7,0x54,0x50,0x79,0x5e,0x6b,0x91,0x6b,0x76,0x9a, 0x69,0x74,0x98,0x52,0x4f,0x7a,0x57,0x63,0x8c,0x0b,0x0c,0x10,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02, 0x03,0x03,0x03,0x04,0x03,0x03,0x05,0x03,0x03,0x05,0x04,0x04,0x06,0x06,0x06,0x08, 0x09,0x09,0x0d,0x0e,0x0d,0x12,0x12,0x11,0x16,0x17,0x14,0x1a,0x1c,0x18,0x1e,0x1e, 0x1a,0x21,0x1f,0x1b,0x22,0x20,0x1c,0x23,0x1f,0x1b,0x22,0x1e,0x1a,0x22,0x1e,0x1a, 0x22,0x20,0x1c,0x24,0x1f,0x1b,0x22,0x1d,0x1a,0x21,0x1a,0x17,0x1e,0x16,0x15,0x1c, 0x1a,0x19,0x22,0x1b,0x1c,0x24,0x19,0x1b,0x22,0x1d,0x1e,0x26,0x20,0x1e,0x28,0x26, 0x22,0x2b,0x23,0x20,0x2a,0x1c,0x1a,0x22,0x12,0x13,0x19,0x12,0x12,0x17,0x12,0x13, 0x17,0x13,0x15,0x19,0x15,0x16,0x1a,0x15,0x16,0x1a,0x16,0x17,0x1b,0x16,0x18,0x1c, 0x16,0x17,0x1c,0x16,0x16,0x1b,0x16,0x17,0x1c,0x45,0x3d,0x4c,0x8c,0x8a,0x99,0x67, 0x6f,0x8b,0x30,0x34,0x44,0x17,0x19,0x1d,0x16,0x18,0x1d,0x16,0x18,0x1c,0x16,0x18, 0x1d,0x16,0x16,0x1b,0x16,0x16,0x1b,0x15,0x16,0x1a,0x14,0x16,0x1a,0x14,0x16,0x1a, 0x13,0x15,0x19,0x12,0x14,0x17,0x12,0x13,0x16,0x10,0x12,0x14,0x0e,0x0f,0x12,0x16, 0x16,0x1c,0x52,0x51,0x78,0x52,0x51,0x79,0x5e,0x53,0x75,0x5d,0x53,0x77,0x5e,0x53, 0x75,0x5f,0x53,0x76,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5d,0x54,0x78,0x54,0x51,0x78, 0x53,0x51,0x7b,0x53,0x5b,0x82,0x54,0x5e,0x87,0x54,0x5e,0x87,0x5d,0x68,0x8f,0xaa, 0xa8,0xac,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x05,0x06,0x50,0x41,0x52,0x4f,0x3f, 0x4d,0x51,0x41,0x51,0x4c,0x3d,0x4a,0x48,0x3a,0x45,0x53,0x44,0x51,0xcb,0xd0,0xdb, 0xac,0xb1,0xc4,0x68,0x72,0x96,0x50,0x5c,0x81,0x4b,0x55,0x78,0x45,0x4e,0x73,0x41, 0x4b,0x6e,0x3e,0x48,0x6b,0x3d,0x46,0x67,0x3c,0x48,0x6a,0x43,0x4e,0x72,0x4b,0x57, 0x7e,0x58,0x5f,0x8a,0x55,0x5a,0x83,0x55,0x59,0x82,0x60,0x64,0x92,0x32,0x32,0x4b, 0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x04, 0x05,0x05,0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04, 0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,0x17,0x19,0x1d,0x56,0x62,0x89,0x42,0x45,0x69,0x4c, 0x4c,0x73,0x52,0x50,0x7b,0x52,0x56,0x81,0x56,0x62,0x8b,0x71,0x7c,0x9f,0xce,0xce, 0xd9,0x2d,0x2c,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x5a,0x5a,0xf9,0xf9,0xf9,0xe5, 0xe7,0xee,0xb9,0xc0,0xd1,0xa9,0xb1,0xc6,0xa3,0xab,0xc2,0xa0,0xa8,0xc0,0x9a,0xa3, 0xbc,0x9b,0xa4,0xbc,0xab,0xb3,0xc9,0xb6,0xbb,0xcb,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,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x04,0x05,0x60,0x50, 0x65,0x89,0x92,0xae,0x52,0x4e,0x79,0x52,0x59,0x82,0x65,0x71,0x94,0x69,0x73,0x96, 0x6c,0x76,0x99,0x6f,0x79,0x9b,0x70,0x7b,0x9c,0x74,0x7e,0x9e,0x75,0x7f,0x9e,0x78, 0x83,0xa0,0x7c,0x85,0xa3,0x7f,0x88,0xa5,0x81,0x89,0xa6,0x83,0x8b,0xa8,0x83,0x8b, 0xa8,0x84,0x8f,0xaa,0x82,0x8c,0xa9,0x81,0x8a,0xa7,0x7e,0x87,0xa5,0x7b,0x84,0xa2, 0x6b,0x77,0x98,0x50,0x4e,0x78,0x6b,0x76,0x97,0x79,0x78,0x7d,0x09,0x08,0x0b,0x09, 0x08,0x0b,0x09,0x08,0x0b,0x08,0x07,0x0a,0x08,0x07,0x0a,0x08,0x07,0x0a,0x07,0x06, 0x09,0x07,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x06,0x08,0x07,0x06,0x08,0x08,0x07,0x09,0x08, 0x07,0x0a,0x08,0x07,0x0a,0x09,0x07,0x0a,0x08,0x07,0x0a,0x08,0x07,0x0a,0x09,0x07, 0x0a,0x07,0x06,0x08,0x07,0x06,0x08,0x07,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07, 0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x07,0x05,0x04,0x06,0x18,0x13,0x17,0x3f, 0x30,0x3b,0x42,0x33,0x3e,0x76,0x81,0xa2,0x8d,0x98,0xb3,0x54,0x50,0x79,0x60,0x6c, 0x92,0x69,0x75,0x99,0x66,0x72,0x97,0x51,0x4f,0x7a,0x5a,0x65,0x8d,0x06,0x06,0x08, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02, 0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x05,0x05,0x06,0x08,0x09, 0x0a,0x0e,0x0e,0x12,0x19,0x1b,0x23,0x22,0x26,0x30,0x20,0x22,0x2d,0x20,0x1c,0x24, 0x20,0x1c,0x23,0x20,0x1c,0x24,0x20,0x1c,0x23,0x20,0x1c,0x23,0x1e,0x1a,0x22,0x1e, 0x1a,0x21,0x21,0x1d,0x25,0x2a,0x25,0x2e,0x2a,0x25,0x2e,0x29,0x23,0x2e,0x27,0x23, 0x2e,0x24,0x23,0x2e,0x2a,0x2e,0x3c,0x34,0x38,0x43,0x33,0x37,0x43,0x32,0x36,0x42, 0x2e,0x32,0x41,0x31,0x32,0x43,0x2f,0x2d,0x3d,0x2c,0x2e,0x3d,0x22,0x22,0x2e,0x1b, 0x1b,0x26,0x16,0x18,0x1f,0x15,0x16,0x1b,0x17,0x19,0x1e,0x19,0x1a,0x1e,0x19,0x1a, 0x1e,0x18,0x19,0x1d,0x16,0x18,0x1c,0x16,0x17,0x1b,0x4c,0x44,0x54,0x57,0x4a,0x5b, 0xa7,0xaa,0xb9,0x74,0x7d,0x9b,0x59,0x62,0x84,0x27,0x2b,0x36,0x17,0x19,0x1e,0x17, 0x19,0x1e,0x17,0x19,0x1e,0x16,0x18,0x1d,0x16,0x17,0x1c,0x16,0x18,0x1c,0x16,0x17, 0x1b,0x16,0x16,0x1b,0x14,0x16,0x1a,0x13,0x15,0x19,0x12,0x14,0x17,0x11,0x12,0x15, 0x0f,0x10,0x12,0x16,0x16,0x1c,0x53,0x51,0x78,0x52,0x50,0x78,0x5c,0x53,0x77,0x5c, 0x53,0x77,0x5e,0x53,0x75,0x5f,0x53,0x76,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5d,0x54, 0x79,0x56,0x51,0x78,0x53,0x50,0x7b,0x52,0x58,0x82,0x53,0x5f,0x87,0x54,0x5f,0x87, 0x5c,0x68,0x8e,0xb4,0xb1,0xb7,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x47, 0x3a,0x48,0x50,0x3f,0x4e,0x50,0x3f,0x4f,0x4c,0x3d,0x4b,0x47,0x38,0x44,0x4f,0x41, 0x4e,0xca,0xcf,0xda,0xa7,0xae,0xc1,0x64,0x6d,0x91,0x4e,0x59,0x7f,0x4b,0x54,0x79, 0x46,0x4f,0x74,0x41,0x4c,0x70,0x3e,0x48,0x6a,0x3d,0x46,0x69,0x3c,0x46,0x67,0x41, 0x4b,0x6e,0x49,0x54,0x7a,0x55,0x5c,0x86,0x54,0x58,0x82,0x56,0x5a,0x84,0x60,0x64, 0x93,0x31,0x32,0x49,0x04,0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x06, 0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x05,0x05,0x04,0x05,0x05,0x04, 0x05,0x05,0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x02,0x03, 0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x0e,0x0f,0x11,0x5b,0x66,0x8d,0x46,0x4a,0x6e, 0x47,0x48,0x6c,0x52,0x50,0x7b,0x52,0x53,0x7e,0x53,0x5e,0x89,0x75,0x81,0xa2,0xbb, 0xbb,0xc1,0x08,0x08,0x08,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, 0x0e,0x0e,0x0e,0xcb,0xcb,0xcb,0xf7,0xf8,0xf9,0xbf,0xc4,0xd5,0xa3,0xab,0xc2,0x9d, 0xa7,0xbf,0x9b,0xa3,0xbc,0x98,0xa1,0xba,0x98,0xa1,0xba,0xa8,0xb2,0xca,0x8c,0x91, 0x9c,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,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x04,0x04, 0x03,0x05,0x46,0x39,0x47,0x7c,0x83,0x9f,0x52,0x5b,0x84,0x51,0x4f,0x7a,0x61,0x6c, 0x91,0x68,0x71,0x95,0x6a,0x74,0x96,0x6d,0x76,0x99,0x6e,0x79,0x9b,0x74,0x7d,0x9d, 0x75,0x7f,0x9f,0x78,0x81,0xa0,0x79,0x83,0xa1,0x7c,0x87,0xa3,0x7f,0x89,0xa6,0x83, 0x8c,0xa9,0x81,0x8b,0xa7,0x81,0x8a,0xa7,0x83,0x8e,0xa8,0x80,0x8a,0xa6,0x7d,0x87, 0xa4,0x7c,0x86,0xa2,0x77,0x80,0xa0,0x50,0x54,0x7c,0x54,0x5e,0x86,0x94,0x98,0xa7, 0x09,0x09,0x0c,0x09,0x09,0x0b,0x09,0x08,0x0b,0x09,0x08,0x0a,0x08,0x07,0x0a,0x08, 0x07,0x0a,0x07,0x06,0x08,0x07,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06, 0x06,0x06,0x05,0x06,0x06,0x06,0x08,0x07,0x06,0x08,0x08,0x07,0x09,0x08,0x07,0x0a, 0x09,0x08,0x0a,0x0a,0x09,0x0b,0x0a,0x09,0x0b,0x0a,0x09,0x0b,0x0a,0x09,0x0b,0x0a, 0x0a,0x0c,0x0a,0x0a,0x0c,0x09,0x08,0x0a,0x09,0x08,0x0a,0x08,0x07,0x09,0x08,0x07, 0x0a,0x08,0x07,0x0a,0x07,0x06,0x09,0x07,0x06,0x09,0x07,0x06,0x08,0x07,0x06,0x08, 0x1b,0x16,0x1b,0x3f,0x30,0x3b,0x42,0x33,0x3e,0x7b,0x86,0xa6,0x89,0x93,0xb0,0x51, 0x4e,0x79,0x62,0x6e,0x93,0x6b,0x76,0x9a,0x65,0x71,0x97,0x51,0x51,0x7b,0x5f,0x6b, 0x91,0x03,0x03,0x04,0x02,0x02,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x05,0x04,0x04,0x05,0x06,0x06,0x07,0x0a, 0x0b,0x0d,0x19,0x1a,0x1d,0x26,0x29,0x2e,0x3a,0x3d,0x48,0x47,0x4b,0x57,0x32,0x36, 0x43,0x24,0x22,0x2e,0x24,0x20,0x2a,0x21,0x1e,0x27,0x20,0x1e,0x27,0x23,0x20,0x2a, 0x28,0x25,0x30,0x2a,0x27,0x34,0x2d,0x2a,0x38,0x31,0x2d,0x3c,0x2a,0x29,0x38,0x29, 0x29,0x38,0x28,0x27,0x36,0x26,0x26,0x35,0x30,0x34,0x41,0x3a,0x3e,0x49,0x3b,0x3e, 0x48,0x35,0x38,0x42,0x2d,0x32,0x3e,0x30,0x34,0x45,0x43,0x49,0x5a,0x3f,0x45,0x56, 0x33,0x37,0x4a,0x2e,0x30,0x40,0x26,0x26,0x33,0x3a,0x3c,0x43,0x1c,0x1e,0x26,0x20, 0x21,0x24,0x1e,0x1e,0x21,0x1b,0x1c,0x1e,0x19,0x1a,0x1e,0x45,0x3e,0x4d,0x5a,0x4d, 0x5e,0x47,0x40,0x4a,0xa8,0xab,0xb9,0x76,0x80,0x9c,0x5d,0x68,0x8a,0x51,0x5a,0x77, 0x18,0x1a,0x1e,0x18,0x1a,0x1f,0x18,0x1a,0x1e,0x18,0x1a,0x1e,0x17,0x19,0x1e,0x17, 0x19,0x1e,0x16,0x18,0x1d,0x16,0x18,0x1c,0x16,0x17,0x1b,0x15,0x16,0x1a,0x13,0x15, 0x18,0x12,0x13,0x16,0x10,0x11,0x14,0x13,0x13,0x17,0x56,0x51,0x77,0x5b,0x53,0x77, 0x5c,0x53,0x77,0x5c,0x54,0x77,0x5d,0x53,0x77,0x5e,0x53,0x75,0x5f,0x53,0x76,0x5f, 0x54,0x76,0x5b,0x53,0x79,0x56,0x51,0x79,0x52,0x51,0x7a,0x52,0x57,0x81,0x53,0x5e, 0x86,0x54,0x5f,0x87,0x5b,0x66,0x8d,0xb7,0xb5,0xbc,0x06,0x06,0x08,0x06,0x06,0x07, 0x06,0x06,0x07,0x3e,0x32,0x3e,0x53,0x42,0x51,0x4f,0x3f,0x4e,0x4c,0x3c,0x49,0x47, 0x37,0x43,0x50,0x41,0x4f,0xcb,0xd0,0xdb,0x9d,0xa6,0xbc,0x61,0x6b,0x8f,0x4e,0x5b, 0x7f,0x49,0x54,0x78,0x46,0x4f,0x74,0x42,0x4c,0x6f,0x3f,0x48,0x69,0x3e,0x46,0x67, 0x3d,0x47,0x68,0x3f,0x4a,0x6c,0x48,0x53,0x76,0x53,0x5a,0x81,0x53,0x58,0x82,0x57, 0x5a,0x86,0x63,0x64,0x95,0x31,0x32,0x4a,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x05, 0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06, 0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x04,0x05,0x04, 0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 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,0x07,0x07,0x08,0x61,0x6b,0x8d,0x47,0x52, 0x76,0x3d,0x3e,0x5e,0x50,0x4e,0x79,0x52,0x52,0x7c,0x54,0x5f,0x89,0x79,0x84,0xa5, 0x96,0x94,0x97,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,0x78,0x78,0x78,0xfc,0xfc,0xfd, 0xbc,0xc2,0xd2,0x9d,0xa5,0xbf,0x9b,0xa3,0xbc,0x99,0xa2,0xbb,0x96,0xa0,0xb9,0x95, 0x9e,0xb9,0xa4,0xaf,0xcb,0x52,0x56,0x5e,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, 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,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, 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,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x00,0x00, 0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x03,0x05, 0x04,0x04,0x05,0x05,0x05,0x06,0x1e,0x18,0x1f,0x73,0x74,0x8f,0x59,0x62,0x8a,0x51, 0x4e,0x78,0x5e,0x69,0x8e,0x67,0x72,0x95,0x67,0x71,0x94,0x6a,0x76,0x98,0x6e,0x79, 0x9a,0x6f,0x79,0x9a,0x76,0x7f,0x9e,0x75,0x80,0x9e,0x78,0x83,0xa1,0x7b,0x86,0xa3, 0x7d,0x87,0xa5,0x7f,0x89,0xa6,0x82,0x8b,0xa7,0x82,0x8b,0xa7,0x81,0x89,0xa6,0x81, 0x89,0xa6,0x7f,0x87,0xa5,0x7a,0x83,0xa0,0x77,0x81,0x9e,0x58,0x61,0x88,0x50,0x52, 0x7a,0x8a,0x92,0xab,0x31,0x30,0x33,0x0a,0x09,0x0c,0x09,0x09,0x0b,0x09,0x08,0x0a, 0x09,0x08,0x0b,0x09,0x08,0x0a,0x07,0x06,0x09,0x07,0x06,0x08,0x07,0x06,0x08,0x06, 0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x06,0x09,0x08,0x07,0x09,0x09,0x08, 0x0a,0x0a,0x09,0x0c,0x0b,0x0a,0x0c,0x0b,0x0a,0x0c,0x0c,0x0a,0x0e,0x0d,0x0b,0x0e, 0x0c,0x0b,0x0e,0x0c,0x0b,0x0e,0x0c,0x0a,0x0e,0x0b,0x0a,0x0e,0x0a,0x0a,0x0c,0x0a, 0x09,0x0b,0x09,0x08,0x0a,0x09,0x08,0x0a,0x09,0x08,0x0a,0x09,0x08,0x0a,0x09,0x08, 0x0a,0x08,0x07,0x0a,0x21,0x1a,0x21,0x3e,0x31,0x3b,0x41,0x33,0x3f,0x81,0x8c,0xaa, 0x83,0x8e,0xab,0x51,0x4f,0x7a,0x65,0x72,0x97,0x69,0x74,0x99,0x64,0x70,0x95,0x51, 0x55,0x7f,0x5e,0x69,0x8f,0x03,0x03,0x04,0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03, 0x04,0x03,0x03,0x05,0x03,0x04,0x05,0x04,0x04,0x05,0x05,0x06,0x07,0x09,0x0a,0x0b, 0x0d,0x0e,0x10,0x1d,0x1e,0x21,0x32,0x34,0x3a,0x45,0x47,0x50,0x4f,0x53,0x5e,0x52, 0x56,0x64,0x36,0x3b,0x4c,0x2a,0x2a,0x39,0x2a,0x2a,0x3a,0x2a,0x2a,0x39,0x2b,0x2b, 0x3a,0x30,0x2c,0x3a,0x33,0x2d,0x3b,0x30,0x2a,0x36,0x2e,0x28,0x32,0x2e,0x28,0x32, 0x2a,0x27,0x33,0x2a,0x2a,0x3a,0x30,0x34,0x44,0x3e,0x42,0x50,0x4a,0x4e,0x5a,0x45, 0x49,0x55,0x2b,0x2e,0x38,0x20,0x22,0x2a,0x25,0x27,0x2e,0x20,0x20,0x2c,0x2e,0x32, 0x41,0x56,0x5b,0x68,0x4b,0x50,0x5e,0x55,0x59,0x66,0x47,0x4b,0x57,0x4c,0x4e,0x56, 0x5f,0x60,0x62,0x41,0x41,0x42,0x2b,0x2b,0x2c,0x20,0x21,0x22,0x46,0x40,0x4e,0x5f, 0x51,0x62,0x48,0x3d,0x49,0x47,0x40,0x4a,0xae,0xb1,0xbf,0x77,0x81,0x9c,0x5c,0x68, 0x8a,0x57,0x61,0x83,0x43,0x4a,0x60,0x1a,0x1b,0x20,0x19,0x1b,0x20,0x19,0x1a,0x1f, 0x18,0x1a,0x1f,0x18,0x1a,0x1e,0x17,0x19,0x1e,0x17,0x19,0x1e,0x16,0x18,0x1d,0x16, 0x18,0x1c,0x14,0x16,0x1a,0x13,0x14,0x18,0x11,0x12,0x15,0x13,0x14,0x19,0x59,0x53, 0x77,0x5a,0x53,0x77,0x5b,0x52,0x77,0x5c,0x54,0x77,0x5f,0x53,0x75,0x5e,0x53,0x75, 0x5f,0x53,0x75,0x5f,0x53,0x76,0x5d,0x53,0x78,0x55,0x50,0x78,0x52,0x51,0x79,0x52, 0x56,0x7e,0x54,0x5e,0x86,0x56,0x60,0x88,0x5a,0x65,0x8c,0xb7,0xb7,0xc1,0x06,0x06, 0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x37,0x2d,0x37,0x53,0x43,0x53,0x4f,0x3e,0x4c, 0x4a,0x3a,0x48,0x45,0x36,0x42,0x4b,0x3d,0x49,0xc8,0xcc,0xd8,0x97,0xa0,0xb8,0x61, 0x69,0x8e,0x4e,0x5a,0x7f,0x4b,0x54,0x7a,0x45,0x4f,0x73,0x42,0x4c,0x6e,0x3f,0x49, 0x69,0x3d,0x47,0x67,0x3c,0x45,0x66,0x3e,0x48,0x69,0x47,0x50,0x72,0x50,0x5a,0x80, 0x53,0x57,0x7e,0x55,0x58,0x84,0x63,0x64,0x96,0x33,0x33,0x4b,0x04,0x05,0x05,0x05, 0x05,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06, 0x07,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x05,0x05,0x06, 0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x03,0x02, 0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,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,0x03,0x03,0x03,0x6d,0x76,0x90,0x4f, 0x59,0x82,0x3c,0x3e,0x5c,0x4c,0x4a,0x71,0x52,0x52,0x7d,0x53,0x5e,0x88,0x86,0x91, 0xaf,0x8e,0x8a,0x8e,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,0x5a,0x5a,0x5a,0xfd,0xfd,0xfe,0xb7,0xbe,0xd0,0x99,0xa2,0xbb,0x98,0xa1,0xba, 0x96,0xa0,0xba,0x95,0x9f,0xb9,0x97,0xa0,0xbc,0xa9,0xb5,0xd5,0x2b,0x2b,0x2b,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x02,0x02,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x04,0x04,0x05,0x03,0x03, 0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x04, 0x05,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06, 0x05,0x06,0x04,0x03,0x05,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x03,0x05,0x05,0x04, 0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x0b,0x0a,0x0d,0x6a,0x66,0x81, 0x63,0x6d,0x92,0x51,0x4e,0x77,0x5a,0x65,0x8a,0x65,0x6f,0x93,0x65,0x6f,0x93,0x69, 0x75,0x97,0x6c,0x75,0x97,0x6f,0x79,0x9a,0x70,0x7a,0x9a,0x74,0x7e,0x9e,0x78,0x81, 0xa0,0x7a,0x83,0xa2,0x7b,0x86,0xa2,0x7e,0x88,0xa5,0x80,0x89,0xa6,0x83,0x8b,0xa6, 0x80,0x88,0xa4,0x7f,0x88,0xa4,0x7d,0x86,0xa2,0x7d,0x85,0xa3,0x79,0x81,0x9f,0x66, 0x6f,0x92,0x50,0x50,0x76,0x6a,0x73,0x95,0x67,0x68,0x6e,0x0a,0x0a,0x0d,0x0a,0x09, 0x0c,0x0a,0x09,0x0b,0x0a,0x09,0x0b,0x09,0x08,0x0a,0x08,0x07,0x0a,0x07,0x06,0x08, 0x07,0x06,0x08,0x07,0x06,0x08,0x07,0x06,0x08,0x07,0x06,0x09,0x08,0x07,0x09,0x09, 0x07,0x0a,0x0a,0x08,0x0a,0x0a,0x0a,0x0c,0x0c,0x0b,0x0e,0x0d,0x0b,0x0f,0x0e,0x0c, 0x0f,0x0e,0x0c,0x0f,0x0e,0x0d,0x11,0x0e,0x0c,0x10,0x0e,0x0c,0x0f,0x0d,0x0b,0x0e, 0x0d,0x0b,0x0e,0x0b,0x0a,0x0d,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a, 0x0a,0x0d,0x0a,0x0a,0x0c,0x0a,0x09,0x0c,0x23,0x1b,0x22,0x3f,0x30,0x3b,0x43,0x34, 0x40,0x88,0x92,0xaf,0x7d,0x87,0xa7,0x51,0x53,0x7d,0x65,0x71,0x97,0x66,0x72,0x98, 0x63,0x6e,0x94,0x53,0x5d,0x86,0x50,0x5a,0x79,0x04,0x04,0x06,0x04,0x04,0x06,0x04, 0x04,0x06,0x03,0x04,0x05,0x04,0x04,0x06,0x05,0x05,0x06,0x06,0x06,0x08,0x0a,0x0a, 0x0e,0x16,0x18,0x1d,0x21,0x23,0x2a,0x2a,0x2e,0x39,0x4b,0x4f,0x5b,0x62,0x66,0x74, 0x70,0x76,0x84,0x72,0x78,0x86,0x60,0x66,0x76,0x42,0x47,0x5b,0x3d,0x42,0x57,0x43, 0x4a,0x5d,0x42,0x48,0x5c,0x36,0x36,0x4a,0x32,0x32,0x45,0x31,0x33,0x45,0x36,0x3a, 0x4c,0x3a,0x3e,0x50,0x42,0x46,0x57,0x4f,0x54,0x63,0x4f,0x54,0x63,0x46,0x4a,0x5a, 0x3e,0x44,0x53,0x35,0x3a,0x48,0x35,0x39,0x46,0x2c,0x2f,0x37,0x22,0x23,0x2a,0x28, 0x2a,0x30,0x3c,0x3e,0x46,0x48,0x4b,0x56,0x57,0x5a,0x65,0x5e,0x60,0x69,0x68,0x6a, 0x6f,0x6f,0x6f,0x6f,0x73,0x73,0x73,0x5a,0x5a,0x5a,0x3b,0x3b,0x3b,0x54,0x4d,0x58, 0x66,0x57,0x67,0x4c,0x3f,0x4c,0x3f,0x35,0x3f,0x45,0x3d,0x46,0xaf,0xb4,0xc1,0x7b, 0x84,0x9f,0x5a,0x66,0x88,0x58,0x62,0x85,0x5d,0x69,0x8a,0x36,0x3b,0x4d,0x1a,0x1b, 0x21,0x1a,0x1b,0x21,0x1a,0x1b,0x20,0x19,0x1a,0x1f,0x18,0x1a,0x1f,0x17,0x19,0x1e, 0x17,0x19,0x1e,0x16,0x18,0x1d,0x15,0x16,0x1a,0x14,0x16,0x1a,0x12,0x13,0x16,0x13, 0x14,0x19,0x59,0x54,0x77,0x5a,0x53,0x77,0x5c,0x53,0x77,0x5d,0x53,0x77,0x5d,0x53, 0x77,0x5c,0x53,0x77,0x5f,0x53,0x76,0x5f,0x53,0x76,0x5c,0x52,0x78,0x56,0x50,0x78, 0x52,0x50,0x79,0x52,0x55,0x7c,0x54,0x5e,0x86,0x55,0x5f,0x87,0x5a,0x66,0x8c,0xb0, 0xb2,0xbf,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x2f,0x28,0x31,0x54,0x44, 0x53,0x4d,0x3d,0x4b,0x49,0x3a,0x46,0x45,0x36,0x42,0x4c,0x3e,0x4a,0xc9,0xcc,0xd8, 0x93,0x9d,0xb5,0x5e,0x69,0x8e,0x4d,0x5a,0x7f,0x4b,0x54,0x7c,0x47,0x4e,0x74,0x41, 0x4c,0x6e,0x3e,0x49,0x6a,0x3d,0x46,0x67,0x3c,0x45,0x66,0x3d,0x46,0x67,0x42,0x4c, 0x70,0x4c,0x55,0x7b,0x4f,0x55,0x7b,0x54,0x58,0x81,0x64,0x65,0x94,0x34,0x35,0x4c, 0x05,0x05,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06, 0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x06, 0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x05,0x05,0x04,0x04,0x05,0x03,0x03,0x04, 0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x72,0x79,0x8c, 0x54,0x60,0x88,0x3d,0x3f,0x5e,0x48,0x46,0x6b,0x52,0x52,0x7c,0x53,0x5e,0x89,0x88, 0x92,0xb0,0x7d,0x76,0x7b,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,0x3e,0x3e,0x3e,0xfb,0xfb,0xfb,0xbc,0xc2, 0xd2,0x99,0xa2,0xbb,0x96,0xa0,0xb9,0x95,0x9f,0xb9,0x94,0x9d,0xb8,0x9b,0xa5,0xc0, 0xb7,0xc1,0xdf,0x0e,0x0e,0x0e,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,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,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,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x06,0x06,0x09,0x09,0x0a,0x09,0x09,0x0a,0x07, 0x08,0x09,0x06,0x07,0x08,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06, 0x07,0x07,0x07,0x09,0x09,0x09,0x0b,0x0a,0x0b,0x0e,0x0c,0x0e,0x11,0x0b,0x0c,0x10, 0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x09,0x08,0x0a,0x07,0x06,0x09,0x06,0x06,0x07,0x06, 0x05,0x07,0x08,0x09,0x0a,0x0d,0x0e,0x10,0x0e,0x0f,0x12,0x0a,0x0a,0x0e,0x07,0x07, 0x0a,0x5d,0x56,0x6c,0x69,0x74,0x96,0x50,0x4e,0x76,0x59,0x62,0x88,0x64,0x6e,0x91, 0x65,0x70,0x92,0x67,0x72,0x93,0x6b,0x74,0x96,0x6e,0x77,0x99,0x6e,0x78,0x99,0x72, 0x7c,0x9b,0x77,0x81,0xa0,0x78,0x82,0xa0,0x7a,0x84,0xa2,0x7e,0x87,0xa4,0x7f,0x88, 0xa5,0x7e,0x87,0xa3,0x7e,0x88,0xa5,0x7d,0x86,0xa3,0x7f,0x88,0xa4,0x7c,0x84,0xa2, 0x79,0x81,0x9e,0x71,0x7b,0x9a,0x50,0x50,0x77,0x57,0x60,0x85,0x85,0x8b,0x9c,0x0a, 0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x0a,0x09,0x0c,0x0a,0x09,0x0b,0x08,0x07, 0x0a,0x08,0x07,0x0a,0x07,0x07,0x09,0x07,0x07,0x09,0x08,0x07,0x0a,0x08,0x07,0x0a, 0x08,0x07,0x0a,0x09,0x08,0x0a,0x0a,0x09,0x0b,0x0b,0x0a,0x0d,0x0c,0x0b,0x0e,0x0e, 0x0c,0x10,0x0e,0x0d,0x11,0x10,0x0e,0x12,0x10,0x0e,0x12,0x11,0x0e,0x13,0x0f,0x0e, 0x12,0x0e,0x0d,0x10,0x0e,0x0c,0x10,0x0d,0x0b,0x0f,0x0c,0x0b,0x0e,0x0c,0x0a,0x0e, 0x0c,0x0b,0x0e,0x0c,0x0b,0x0e,0x0b,0x0a,0x0e,0x0b,0x0a,0x0e,0x23,0x1c,0x22,0x3e, 0x30,0x3a,0x43,0x33,0x40,0x8e,0x95,0xb1,0x75,0x81,0xa2,0x51,0x51,0x7c,0x66,0x72, 0x98,0x68,0x73,0x98,0x5f,0x6c,0x91,0x53,0x5e,0x87,0x40,0x49,0x63,0x05,0x05,0x06, 0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x06,0x06,0x08,0x0b,0x0a,0x0d,0x10, 0x0e,0x12,0x17,0x17,0x1f,0x2b,0x2f,0x3c,0x32,0x36,0x47,0x37,0x3c,0x4f,0x66,0x6a, 0x7a,0x7f,0x83,0x92,0x82,0x87,0x96,0x7b,0x81,0x91,0x69,0x6f,0x82,0x5a,0x61,0x75, 0x5e,0x65,0x7a,0x62,0x68,0x7b,0x5a,0x60,0x73,0x51,0x57,0x6a,0x5f,0x65,0x76,0x66, 0x6c,0x7a,0x6f,0x73,0x82,0x76,0x7b,0x88,0x76,0x7b,0x87,0x71,0x75,0x82,0x61,0x66, 0x74,0x51,0x56,0x65,0x46,0x4a,0x5a,0x44,0x49,0x57,0x46,0x4b,0x57,0x35,0x38,0x43, 0x25,0x27,0x32,0x28,0x2b,0x33,0x3d,0x3e,0x45,0x4f,0x52,0x58,0x4c,0x4e,0x55,0x63, 0x65,0x68,0x72,0x72,0x72,0x76,0x76,0x76,0x72,0x72,0x72,0x6d,0x6d,0x6d,0x6a,0x66, 0x6d,0x7f,0x73,0x7f,0x78,0x6f,0x77,0x65,0x5b,0x63,0x3c,0x32,0x3c,0x42,0x3b,0x44, 0xaf,0xb3,0xc1,0x81,0x8b,0xa4,0x56,0x61,0x85,0x55,0x5f,0x83,0x60,0x69,0x8a,0x5c, 0x66,0x87,0x1a,0x1b,0x21,0x1a,0x1c,0x21,0x1a,0x1c,0x21,0x1a,0x1b,0x21,0x19,0x1a, 0x1f,0x18,0x1a,0x1e,0x17,0x19,0x1e,0x16,0x18,0x1d,0x16,0x17,0x1b,0x14,0x16,0x1a, 0x12,0x13,0x17,0x14,0x16,0x1a,0x59,0x53,0x77,0x5a,0x52,0x77,0x5b,0x52,0x77,0x5c, 0x53,0x77,0x5c,0x53,0x77,0x5e,0x54,0x75,0x5e,0x53,0x75,0x5d,0x54,0x78,0x5d,0x54, 0x78,0x57,0x51,0x78,0x53,0x50,0x79,0x53,0x54,0x7d,0x53,0x5d,0x86,0x54,0x5f,0x87, 0x5a,0x65,0x8c,0xa6,0xab,0xbc,0x06,0x07,0x08,0x06,0x07,0x08,0x06,0x06,0x08,0x25, 0x20,0x27,0x55,0x45,0x55,0x4a,0x3b,0x49,0x49,0x39,0x46,0x43,0x34,0x40,0x4a,0x3c, 0x48,0xc5,0xca,0xd7,0x8f,0x98,0xb0,0x5d,0x68,0x8c,0x4f,0x5a,0x81,0x48,0x52,0x7a, 0x47,0x4f,0x74,0x41,0x4b,0x6e,0x3f,0x49,0x69,0x3c,0x45,0x67,0x3d,0x44,0x65,0x3d, 0x46,0x67,0x41,0x49,0x6d,0x4a,0x51,0x77,0x4d,0x55,0x79,0x52,0x54,0x7f,0x62,0x64, 0x94,0x33,0x33,0x4c,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07, 0x06,0x06,0x07,0x06,0x07,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06, 0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x06,0x05,0x05,0x06,0x04,0x05,0x05,0x04,0x05, 0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,0x60,0x63, 0x6c,0x62,0x6d,0x94,0x41,0x44,0x66,0x44,0x42,0x66,0x52,0x53,0x7d,0x53,0x5f,0x89, 0x7c,0x88,0xa8,0x7e,0x76,0x7c,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,0x2b, 0x2b,0x2b,0xf9,0xfa,0xfa,0xb5,0xbc,0xcf,0x9a,0xa3,0xbc,0x99,0xa2,0xbb,0x96,0xa0, 0xb9,0x94,0x9d,0xb9,0x9f,0xa9,0xc6,0xae,0xb7,0xd3,0x03,0x03,0x03,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x03,0x04,0x04,0x05,0x08,0x08,0x09,0x0b,0x0c,0x0d,0x0f,0x10,0x12, 0x0e,0x0f,0x11,0x0e,0x0e,0x10,0x0b,0x0c,0x0e,0x0a,0x0a,0x0b,0x0d,0x0d,0x0e,0x0e, 0x0f,0x10,0x0d,0x0e,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0f,0x10,0x11,0x16,0x15,0x16, 0x1c,0x14,0x16,0x1c,0x12,0x12,0x18,0x0f,0x0e,0x14,0x0e,0x0c,0x11,0x0c,0x0b,0x0e, 0x0a,0x09,0x0c,0x08,0x08,0x0a,0x0d,0x0e,0x11,0x13,0x14,0x17,0x13,0x15,0x18,0x0e, 0x0e,0x12,0x09,0x08,0x0b,0x33,0x2e,0x3c,0x75,0x7d,0x9d,0x51,0x4d,0x77,0x53,0x5d, 0x84,0x62,0x6c,0x90,0x63,0x6d,0x91,0x67,0x71,0x92,0x68,0x72,0x95,0x6c,0x75,0x97, 0x6d,0x77,0x98,0x73,0x7d,0x9c,0x75,0x7f,0x9d,0x78,0x82,0xa0,0x7a,0x84,0xa0,0x7c, 0x86,0xa3,0x7c,0x85,0xa2,0x7c,0x86,0xa2,0x80,0x89,0xa4,0x7d,0x86,0xa2,0x7c,0x85, 0xa1,0x7b,0x84,0xa1,0x78,0x80,0x9e,0x75,0x7d,0x9b,0x54,0x5e,0x83,0x50,0x53,0x7b, 0x7e,0x86,0xa2,0x26,0x26,0x2a,0x0b,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x0a, 0x09,0x0c,0x0a,0x09,0x0b,0x08,0x07,0x0a,0x08,0x07,0x0a,0x08,0x07,0x0a,0x08,0x07, 0x0a,0x08,0x07,0x0a,0x09,0x08,0x0a,0x09,0x08,0x0a,0x0a,0x0a,0x0c,0x0b,0x0a,0x0d, 0x0d,0x0b,0x0f,0x0e,0x0d,0x10,0x0f,0x0e,0x12,0x11,0x0e,0x13,0x11,0x0f,0x13,0x11, 0x0f,0x14,0x10,0x0e,0x13,0x0f,0x0e,0x12,0x0e,0x0d,0x11,0x0e,0x0d,0x11,0x0e,0x0c, 0x0f,0x0e,0x0c,0x0f,0x0e,0x0c,0x0f,0x0e,0x0d,0x11,0x0d,0x0c,0x0f,0x0d,0x0b,0x0f, 0x23,0x1c,0x23,0x3e,0x30,0x3b,0x42,0x33,0x3f,0x8f,0x98,0xb3,0x6d,0x79,0x9d,0x51, 0x52,0x7d,0x66,0x73,0x98,0x66,0x72,0x98,0x5d,0x69,0x8f,0x56,0x60,0x89,0x38,0x3f, 0x55,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x0b,0x0a,0x0d, 0x17,0x15,0x1a,0x1f,0x1e,0x27,0x28,0x26,0x32,0x35,0x36,0x49,0x3e,0x3e,0x53,0x52, 0x5a,0x6e,0x79,0x7e,0x8f,0x81,0x87,0x97,0x78,0x7e,0x90,0x6b,0x72,0x86,0x6e,0x76, 0x89,0x7c,0x82,0x92,0x7c,0x82,0x92,0x7a,0x80,0x8f,0x6e,0x74,0x83,0x66,0x6b,0x7b, 0x6f,0x74,0x82,0x76,0x7b,0x87,0x7e,0x82,0x8e,0x85,0x89,0x94,0x86,0x8a,0x96,0x7f, 0x83,0x8f,0x75,0x7a,0x85,0x6a,0x6f,0x7c,0x62,0x67,0x73,0x5a,0x5e,0x6b,0x52,0x57, 0x64,0x42,0x47,0x55,0x38,0x3c,0x4a,0x36,0x3a,0x46,0x38,0x3b,0x44,0x57,0x59,0x5e, 0x51,0x52,0x56,0x4f,0x50,0x52,0x6e,0x6e,0x6e,0x79,0x79,0x79,0x7d,0x7d,0x7d,0x87, 0x85,0x87,0x8d,0x83,0x8d,0x96,0x8f,0x94,0x94,0x8d,0x92,0x6a,0x61,0x69,0x3b,0x32, 0x3a,0x3d,0x35,0x3e,0xb0,0xb4,0xc1,0x85,0x8e,0xa7,0x56,0x61,0x84,0x55,0x60,0x83, 0x61,0x6b,0x8b,0x5c,0x66,0x86,0x1a,0x1c,0x22,0x1a,0x1c,0x22,0x1a,0x1d,0x22,0x1b, 0x1d,0x22,0x1a,0x1b,0x21,0x1a,0x1b,0x20,0x18,0x1a,0x1f,0x18,0x1a,0x1e,0x17,0x19, 0x1e,0x16,0x16,0x1b,0x13,0x15,0x19,0x11,0x12,0x15,0x56,0x51,0x76,0x58,0x53,0x77, 0x5c,0x53,0x77,0x5c,0x54,0x77,0x5c,0x53,0x77,0x5d,0x53,0x77,0x5e,0x53,0x75,0x5e, 0x54,0x75,0x5d,0x54,0x78,0x58,0x51,0x79,0x53,0x50,0x79,0x53,0x54,0x7c,0x52,0x5d, 0x86,0x54,0x5f,0x88,0x5a,0x64,0x8a,0x9d,0xa4,0xb7,0x07,0x08,0x0a,0x06,0x07,0x08, 0x06,0x07,0x08,0x17,0x14,0x19,0x58,0x46,0x58,0x49,0x39,0x47,0x48,0x38,0x46,0x43, 0x33,0x40,0x4b,0x3d,0x48,0xc4,0xca,0xd7,0x90,0x99,0xb3,0x5d,0x69,0x8e,0x4f,0x58, 0x7f,0x4a,0x54,0x79,0x46,0x4e,0x73,0x41,0x4c,0x6e,0x3f,0x49,0x69,0x3d,0x46,0x66, 0x3c,0x44,0x66,0x3e,0x45,0x66,0x41,0x48,0x6b,0x48,0x4e,0x74,0x4e,0x52,0x78,0x50, 0x54,0x7a,0x62,0x63,0x94,0x32,0x31,0x4a,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06, 0x07,0x06,0x07,0x08,0x06,0x07,0x08,0x07,0x07,0x09,0x06,0x07,0x08,0x06,0x07,0x08, 0x06,0x07,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x06,0x05, 0x05,0x06,0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03, 0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x2a, 0x2b,0x2e,0x7b,0x86,0xa7,0x47,0x51,0x75,0x3d,0x3c,0x5d,0x52,0x53,0x7c,0x53,0x5e, 0x89,0x7b,0x86,0xa7,0x80,0x79,0x7e,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,0x45,0x45,0x45,0xf9,0xf9,0xfa,0xad,0xb4,0xc9,0x96, 0xa0,0xba,0x98,0xa1,0xba,0x96,0xa0,0xb9,0x94,0x9d,0xb9,0xa4,0xae,0xcd,0x99,0xa2, 0xb0,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x04,0x08,0x08,0x09,0x0e,0x0e,0x0f,0x13,0x14, 0x16,0x1a,0x1a,0x1c,0x16,0x16,0x18,0x13,0x14,0x16,0x11,0x12,0x14,0x0f,0x10,0x12, 0x14,0x15,0x16,0x1d,0x1e,0x20,0x14,0x15,0x17,0x12,0x13,0x16,0x10,0x11,0x16,0x13, 0x15,0x1a,0x17,0x19,0x20,0x19,0x1b,0x23,0x18,0x18,0x21,0x17,0x16,0x1e,0x13,0x13, 0x1a,0x10,0x10,0x16,0x0e,0x0e,0x12,0x0d,0x0c,0x0f,0x0c,0x0d,0x11,0x11,0x12,0x16, 0x12,0x12,0x16,0x0c,0x0d,0x11,0x0b,0x0a,0x0e,0x13,0x12,0x17,0x77,0x7f,0x9c,0x50, 0x55,0x7c,0x51,0x5b,0x82,0x5f,0x6a,0x8c,0x64,0x6c,0x90,0x66,0x6e,0x91,0x67,0x71, 0x92,0x6b,0x74,0x96,0x6d,0x77,0x98,0x71,0x7b,0x9b,0x73,0x7d,0x9d,0x77,0x82,0x9f, 0x79,0x82,0xa0,0x7a,0x84,0xa0,0x7a,0x85,0xa1,0x7d,0x87,0xa3,0x7e,0x86,0xa2,0x7c, 0x84,0xa0,0x7b,0x83,0x9f,0x7a,0x82,0x9e,0x77,0x80,0x9d,0x76,0x7e,0x9c,0x5f,0x69, 0x8c,0x4f,0x4c,0x75,0x65,0x6f,0x90,0x60,0x61,0x69,0x0c,0x0b,0x0f,0x0c,0x0b,0x0e, 0x0b,0x0a,0x0e,0x0b,0x0a,0x0e,0x0a,0x09,0x0c,0x09,0x08,0x0a,0x09,0x08,0x0b,0x08, 0x07,0x0a,0x08,0x07,0x0a,0x09,0x08,0x0a,0x0a,0x09,0x0b,0x0a,0x09,0x0c,0x0a,0x0a, 0x0d,0x0c,0x0b,0x0e,0x0e,0x0d,0x10,0x0f,0x0e,0x12,0x11,0x0f,0x13,0x12,0x0f,0x14, 0x12,0x10,0x15,0x12,0x10,0x15,0x12,0x0f,0x14,0x10,0x0e,0x13,0x10,0x0e,0x12,0x0e, 0x0d,0x11,0x0e,0x0d,0x11,0x0e,0x0d,0x11,0x0e,0x0d,0x11,0x0e,0x0d,0x11,0x0e,0x0c, 0x11,0x0e,0x0c,0x11,0x22,0x1b,0x22,0x3d,0x2f,0x3b,0x42,0x33,0x3f,0x9c,0xa3,0xbb, 0x75,0x81,0xa2,0x51,0x5c,0x86,0x66,0x72,0x98,0x66,0x73,0x98,0x5a,0x65,0x8c,0x57, 0x62,0x8a,0x31,0x37,0x4b,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x09,0x07,0x07, 0x0a,0x0e,0x0e,0x12,0x1f,0x1f,0x2a,0x30,0x35,0x45,0x33,0x33,0x46,0x3b,0x3a,0x4f, 0x43,0x4a,0x61,0x68,0x6e,0x82,0x78,0x7e,0x90,0x74,0x7a,0x8d,0x76,0x7d,0x8e,0x74, 0x7a,0x8e,0x76,0x7e,0x90,0x7f,0x86,0x96,0x83,0x89,0x97,0x7f,0x84,0x92,0x75,0x79, 0x87,0x6a,0x6e,0x7d,0x66,0x6a,0x78,0x63,0x67,0x74,0x70,0x74,0x7e,0x7a,0x7e,0x89, 0x7d,0x81,0x8c,0x7a,0x7e,0x8a,0x76,0x7b,0x88,0x78,0x7d,0x88,0x76,0x7a,0x86,0x68, 0x6e,0x7a,0x56,0x5b,0x6a,0x48,0x4e,0x5e,0x3f,0x45,0x55,0x3b,0x40,0x50,0x41,0x44, 0x4f,0x59,0x5a,0x60,0x4e,0x50,0x54,0x45,0x46,0x49,0x62,0x62,0x62,0x7d,0x7d,0x7d, 0x7c,0x7c,0x7c,0xa0,0x99,0x9f,0xa6,0x9f,0xa5,0x9d,0x97,0x9b,0x99,0x92,0x97,0x61, 0x59,0x5f,0x3c,0x33,0x3c,0x45,0x3d,0x45,0xb1,0xb5,0xc3,0x8a,0x93,0xaa,0x53,0x5e, 0x83,0x52,0x5c,0x81,0x60,0x6a,0x8b,0x5f,0x6a,0x8a,0x1a,0x1b,0x20,0x1a,0x1c,0x22, 0x1b,0x1d,0x22,0x1a,0x1c,0x22,0x1a,0x1c,0x21,0x19,0x1a,0x1f,0x19,0x1a,0x1f,0x18, 0x1a,0x1f,0x18,0x1a,0x1e,0x16,0x18,0x1d,0x14,0x16,0x1a,0x12,0x12,0x16,0x55,0x52, 0x76,0x58,0x53,0x76,0x59,0x53,0x77,0x5c,0x54,0x77,0x5c,0x53,0x77,0x5d,0x53,0x77, 0x5e,0x54,0x75,0x5e,0x53,0x75,0x5d,0x54,0x77,0x5a,0x53,0x78,0x52,0x50,0x79,0x52, 0x53,0x7b,0x52,0x5d,0x86,0x55,0x5f,0x88,0x59,0x65,0x8b,0x90,0x9a,0xb3,0x08,0x09, 0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x0a,0x09,0x0c,0x5a,0x49,0x5b,0x48,0x39,0x45, 0x49,0x39,0x46,0x42,0x33,0x3f,0x4d,0x40,0x4b,0xc3,0xc9,0xd4,0x90,0x99,0xb1,0x5d, 0x68,0x8c,0x4e,0x58,0x7d,0x4a,0x54,0x7a,0x45,0x50,0x73,0x42,0x4d,0x6e,0x3e,0x48, 0x69,0x3c,0x45,0x66,0x3a,0x45,0x65,0x3e,0x46,0x67,0x3f,0x48,0x6b,0x46,0x4b,0x70, 0x4b,0x4f,0x76,0x4d,0x51,0x76,0x61,0x63,0x91,0x31,0x32,0x48,0x06,0x06,0x06,0x06, 0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x08,0x09,0x07,0x07, 0x09,0x06,0x07,0x08,0x07,0x07,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07, 0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x03, 0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,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, 0x09,0x0a,0x0b,0x7e,0x88,0xa6,0x50,0x5a,0x7f,0x40,0x40,0x61,0x4f,0x50,0x7a,0x54, 0x5f,0x89,0x79,0x84,0xa5,0x86,0x7f,0x84,0x0e,0x0b,0x0d,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,0x6d,0x6d,0x6d, 0xee,0xf0,0xf4,0xa8,0xb0,0xc6,0x96,0xa0,0xba,0x95,0x9f,0xb9,0x95,0x9f,0xb9,0x97, 0xa0,0xbc,0xaf,0xbb,0xd9,0x5a,0x5a,0x5a,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, 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,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, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x0a,0x0a,0x0a,0x16, 0x16,0x17,0x1e,0x1e,0x20,0x1c,0x1d,0x1e,0x17,0x18,0x1a,0x15,0x16,0x18,0x14,0x15, 0x17,0x16,0x17,0x1a,0x1a,0x1c,0x1e,0x20,0x22,0x24,0x1d,0x1e,0x21,0x21,0x22,0x26, 0x1a,0x1d,0x22,0x18,0x1a,0x21,0x1a,0x1c,0x25,0x1c,0x1d,0x27,0x1e,0x1e,0x28,0x1c, 0x1c,0x26,0x1a,0x1a,0x22,0x16,0x16,0x1e,0x13,0x12,0x18,0x12,0x11,0x16,0x0e,0x0e, 0x12,0x0e,0x0e,0x14,0x0e,0x0e,0x12,0x0c,0x0b,0x10,0x0e,0x0d,0x11,0x0f,0x0e,0x13, 0x7c,0x7e,0x97,0x51,0x5a,0x81,0x50,0x53,0x7a,0x5f,0x69,0x8c,0x61,0x6a,0x8d,0x63, 0x6b,0x8e,0x66,0x70,0x91,0x68,0x72,0x93,0x6c,0x77,0x96,0x6d,0x78,0x98,0x72,0x7c, 0x9a,0x75,0x7f,0x9e,0x77,0x81,0x9f,0x79,0x82,0x9f,0x7a,0x84,0xa1,0x7b,0x85,0xa0, 0x7c,0x85,0xa1,0x7c,0x83,0xa0,0x7b,0x83,0x9f,0x7b,0x83,0x9f,0x78,0x81,0x9d,0x75, 0x7e,0x9a,0x6f,0x77,0x96,0x4f,0x4e,0x76,0x56,0x60,0x84,0x76,0x7b,0x8c,0x0d,0x0c, 0x11,0x0c,0x0c,0x0f,0x0c,0x0b,0x0e,0x0b,0x0a,0x0e,0x0a,0x0a,0x0d,0x0a,0x09,0x0c, 0x0a,0x09,0x0c,0x08,0x08,0x0b,0x08,0x08,0x0a,0x09,0x09,0x0c,0x09,0x09,0x0b,0x0a, 0x0a,0x0d,0x0b,0x0a,0x0e,0x0d,0x0c,0x0f,0x0e,0x0d,0x12,0x0f,0x0e,0x12,0x11,0x0f, 0x14,0x12,0x10,0x15,0x12,0x11,0x16,0x12,0x10,0x15,0x12,0x10,0x15,0x12,0x0f,0x14, 0x12,0x0f,0x14,0x10,0x0e,0x13,0x10,0x0e,0x13,0x0f,0x0e,0x12,0x0f,0x0e,0x12,0x11, 0x0f,0x13,0x12,0x10,0x15,0x0f,0x0e,0x12,0x21,0x1b,0x22,0x3e,0x30,0x3b,0x42,0x33, 0x3f,0x9f,0xa7,0xbe,0x69,0x74,0x99,0x51,0x52,0x7d,0x66,0x72,0x97,0x68,0x73,0x98, 0x57,0x63,0x8a,0x5a,0x64,0x8c,0x29,0x2e,0x3f,0x06,0x06,0x09,0x07,0x07,0x0a,0x07, 0x08,0x0a,0x08,0x08,0x0a,0x13,0x14,0x1a,0x2d,0x31,0x3e,0x42,0x48,0x59,0x3d,0x42, 0x56,0x40,0x46,0x5c,0x51,0x58,0x6d,0x6b,0x72,0x84,0x73,0x79,0x8b,0x72,0x7a,0x8b, 0x77,0x7e,0x8e,0x6e,0x76,0x8a,0x71,0x78,0x8b,0x7a,0x81,0x92,0x83,0x88,0x97,0x79, 0x7f,0x8e,0x67,0x6e,0x7e,0x5e,0x62,0x73,0x62,0x68,0x78,0x5a,0x5f,0x71,0x61,0x67, 0x78,0x74,0x78,0x86,0x7a,0x7e,0x8a,0x7a,0x7e,0x8b,0x79,0x7e,0x8a,0x7f,0x83,0x8f, 0x82,0x86,0x92,0x79,0x7e,0x8a,0x72,0x76,0x84,0x71,0x76,0x84,0x6b,0x70,0x7e,0x57, 0x5d,0x6a,0x51,0x55,0x61,0x52,0x56,0x60,0x6b,0x6e,0x75,0x75,0x76,0x7a,0x72,0x73, 0x75,0x85,0x85,0x86,0x91,0x8c,0x91,0x88,0x81,0x86,0xa4,0x9e,0xa2,0x9d,0x98,0x9c, 0x89,0x83,0x88,0x5d,0x55,0x5c,0x38,0x2f,0x38,0x42,0x3a,0x43,0xb0,0xb4,0xc1,0x8b, 0x94,0xab,0x53,0x60,0x84,0x52,0x5c,0x81,0x60,0x6b,0x8c,0x61,0x6a,0x8c,0x2b,0x2f, 0x3b,0x1a,0x1b,0x20,0x1a,0x1c,0x22,0x1a,0x1c,0x21,0x1a,0x1c,0x22,0x1a,0x1b,0x20, 0x1a,0x1b,0x20,0x19,0x1a,0x1f,0x18,0x1a,0x1e,0x17,0x19,0x1e,0x14,0x16,0x1a,0x12, 0x13,0x16,0x55,0x51,0x76,0x57,0x50,0x76,0x59,0x53,0x77,0x5b,0x53,0x77,0x5c,0x53, 0x77,0x5c,0x53,0x77,0x5e,0x53,0x75,0x5e,0x53,0x75,0x5f,0x54,0x75,0x5a,0x53,0x78, 0x53,0x50,0x78,0x52,0x51,0x7b,0x52,0x5c,0x84,0x55,0x5f,0x88,0x58,0x63,0x8a,0x86, 0x90,0xac,0x12,0x12,0x15,0x08,0x08,0x0a,0x07,0x08,0x0a,0x07,0x07,0x09,0x59,0x49, 0x5a,0x46,0x37,0x43,0x47,0x38,0x44,0x42,0x33,0x3f,0x4b,0x3e,0x49,0xc4,0xca,0xd6, 0x8d,0x96,0xaf,0x5e,0x69,0x8e,0x52,0x5b,0x81,0x4a,0x54,0x7a,0x46,0x4f,0x73,0x41, 0x4b,0x6d,0x3f,0x49,0x6a,0x3d,0x44,0x66,0x3a,0x45,0x64,0x3d,0x46,0x65,0x3f,0x46, 0x6a,0x42,0x49,0x6d,0x47,0x4b,0x72,0x48,0x4c,0x71,0x5e,0x61,0x8d,0x33,0x33,0x47, 0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x09,0x08, 0x08,0x0a,0x07,0x08,0x09,0x07,0x08,0x09,0x07,0x07,0x09,0x07,0x08,0x09,0x06,0x07, 0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06, 0x05,0x05,0x06,0x04,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02, 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x6d,0x75,0x8f,0x53,0x5e,0x85,0x43,0x44,0x68,0x50,0x52,0x7b, 0x53,0x5f,0x89,0x6f,0x7b,0x9f,0x90,0x8d,0x93,0x1c,0x15,0x18,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,0xa1,0xa1,0xa1,0xd9,0xdd,0xe6,0x9f,0xa7,0xbf,0x95,0x9f,0xb9, 0x96,0xa0,0xba,0x94,0x9d,0xb8,0x9a,0xa4,0xc0,0xbe,0xc9,0xe7,0x19,0x19,0x19,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,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,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,0x11,0x11,0x11,0x18,0x19,0x19,0x12,0x12,0x12,0x05,0x05,0x05,0x06,0x06,0x07, 0x0c,0x0c,0x0e,0x17,0x18,0x19,0x1d,0x1e,0x1f,0x1f,0x20,0x22,0x1f,0x21,0x24,0x1a, 0x1b,0x1e,0x1a,0x1a,0x1d,0x27,0x29,0x2e,0x2d,0x2e,0x33,0x26,0x27,0x2b,0x26,0x28, 0x2c,0x32,0x34,0x39,0x2e,0x30,0x36,0x27,0x2a,0x31,0x22,0x26,0x2e,0x20,0x22,0x2e, 0x21,0x24,0x2f,0x1f,0x1f,0x2a,0x1e,0x1e,0x29,0x1b,0x1a,0x24,0x19,0x18,0x21,0x16, 0x15,0x1c,0x15,0x14,0x1b,0x17,0x1a,0x20,0x15,0x16,0x1c,0x10,0x0f,0x16,0x0f,0x0e, 0x13,0x0f,0x0f,0x14,0x79,0x7a,0x8d,0x59,0x64,0x88,0x50,0x4e,0x75,0x5c,0x64,0x88, 0x61,0x69,0x8b,0x62,0x6b,0x8c,0x64,0x6c,0x8d,0x66,0x70,0x91,0x69,0x74,0x95,0x6c, 0x76,0x96,0x72,0x7b,0x99,0x72,0x7c,0x9c,0x77,0x81,0x9f,0x78,0x81,0x9e,0x78,0x81, 0x9f,0x7b,0x85,0xa0,0x7b,0x84,0x9f,0x7b,0x83,0x9f,0x79,0x81,0x9e,0x78,0x80,0x9e, 0x78,0x7f,0x9d,0x78,0x80,0x9d,0x71,0x7a,0x98,0x51,0x5a,0x80,0x4f,0x51,0x78,0x78, 0x80,0x9d,0x25,0x24,0x29,0x0d,0x0c,0x11,0x0d,0x0c,0x11,0x0c,0x0c,0x0f,0x0b,0x0b, 0x0e,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x09,0x08,0x0b,0x0a,0x0a,0x0d, 0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0b,0x0b,0x0e,0x0e,0x0d,0x11,0x0e,0x0e,0x12,0x10, 0x0f,0x13,0x11,0x0f,0x14,0x12,0x11,0x16,0x12,0x11,0x16,0x13,0x11,0x16,0x13,0x11, 0x16,0x12,0x11,0x16,0x12,0x10,0x15,0x11,0x0f,0x14,0x10,0x0f,0x13,0x10,0x0e,0x13, 0x11,0x0f,0x14,0x16,0x13,0x1a,0x1b,0x18,0x1f,0x15,0x12,0x17,0x1c,0x17,0x1d,0x3e, 0x2f,0x3b,0x42,0x32,0x3f,0xb2,0xb7,0xc7,0x64,0x70,0x96,0x51,0x59,0x82,0x69,0x75, 0x99,0x68,0x74,0x98,0x59,0x64,0x8c,0x5d,0x68,0x8f,0x24,0x27,0x37,0x08,0x08,0x0a, 0x09,0x09,0x0c,0x0c,0x0d,0x11,0x15,0x14,0x1c,0x23,0x25,0x32,0x3e,0x42,0x53,0x4c, 0x53,0x66,0x4d,0x54,0x68,0x52,0x59,0x6e,0x5d,0x64,0x78,0x66,0x6e,0x81,0x66,0x6d, 0x80,0x66,0x6d,0x80,0x67,0x6e,0x81,0x66,0x6d,0x80,0x69,0x6f,0x83,0x76,0x7c,0x8e, 0x7a,0x80,0x90,0x66,0x6c,0x7e,0x51,0x56,0x68,0x56,0x5b,0x6b,0x60,0x66,0x77,0x5f, 0x66,0x7a,0x62,0x69,0x7d,0x71,0x77,0x87,0x78,0x7d,0x8c,0x71,0x76,0x86,0x71,0x76, 0x84,0x7a,0x7f,0x8b,0x7e,0x82,0x8e,0x75,0x7a,0x86,0x78,0x7c,0x89,0x82,0x86,0x92, 0x86,0x8a,0x95,0x7e,0x82,0x8e,0x75,0x79,0x84,0x6f,0x73,0x7e,0x82,0x86,0x8f,0x92, 0x95,0x9b,0x86,0x88,0x8e,0x7d,0x7e,0x81,0x90,0x8b,0x90,0x7d,0x78,0x7b,0x8f,0x89, 0x8d,0x99,0x94,0x9a,0x7c,0x77,0x7e,0x49,0x41,0x4a,0x36,0x2c,0x35,0x43,0x3d,0x46, 0xb0,0xb4,0xc1,0x92,0x9a,0xb0,0x53,0x5d,0x83,0x52,0x5d,0x83,0x60,0x6b,0x8c,0x61, 0x6b,0x8c,0x53,0x5c,0x78,0x19,0x1b,0x20,0x19,0x1b,0x20,0x1a,0x1b,0x20,0x1a,0x1c, 0x22,0x1a,0x1b,0x20,0x19,0x1b,0x20,0x19,0x1b,0x20,0x18,0x1a,0x1e,0x17,0x19,0x1d, 0x15,0x16,0x1a,0x13,0x14,0x18,0x55,0x52,0x76,0x56,0x51,0x76,0x5a,0x52,0x77,0x5b, 0x52,0x76,0x5c,0x53,0x77,0x5c,0x53,0x77,0x5c,0x52,0x77,0x5e,0x53,0x75,0x5e,0x53, 0x75,0x5a,0x53,0x77,0x54,0x51,0x78,0x52,0x52,0x7a,0x52,0x5b,0x84,0x56,0x60,0x88, 0x57,0x63,0x89,0x7c,0x85,0xa4,0x21,0x20,0x23,0x08,0x09,0x0a,0x08,0x08,0x0a,0x07, 0x07,0x09,0x56,0x46,0x57,0x47,0x39,0x45,0x48,0x39,0x45,0x42,0x34,0x40,0x4a,0x3c, 0x47,0xc4,0xc9,0xd6,0x8d,0x97,0xb0,0x5a,0x65,0x8b,0x4f,0x5a,0x80,0x4b,0x54,0x7a, 0x47,0x51,0x75,0x41,0x4d,0x6d,0x3e,0x48,0x6a,0x3d,0x44,0x66,0x3a,0x46,0x65,0x3d, 0x45,0x66,0x3f,0x45,0x68,0x42,0x47,0x6b,0x44,0x4a,0x6e,0x44,0x46,0x6d,0x5b,0x5c, 0x8a,0x3b,0x37,0x50,0x06,0x06,0x06,0x06,0x06,0x08,0x06,0x07,0x09,0x08,0x08,0x0a, 0x08,0x08,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x08,0x0a,0x07, 0x08,0x09,0x07,0x08,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06, 0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05, 0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x50,0x56,0x66,0x57,0x63,0x89,0x42,0x42,0x64,0x4d,0x4e, 0x77,0x52,0x5d,0x88,0x64,0x71,0x96,0x9a,0x9b,0xa3,0x21,0x17,0x1c,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,0x02,0x02,0x02,0xcf,0xcf,0xcf,0xc2,0xc8, 0xd7,0x99,0xa2,0xbb,0x96,0xa0,0xba,0x99,0xa2,0xbb,0x95,0x9f,0xba,0x9e,0xa7,0xc4, 0xa4,0xaf,0xcd,0x02,0x02,0x02,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,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,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,0x03, 0x03,0x03,0x26,0x26,0x26,0x1f,0x1f,0x20,0x1a,0x1a,0x1a,0x26,0x27,0x27,0x27,0x27, 0x27,0x0d,0x0e,0x0e,0x14,0x14,0x16,0x1b,0x1c,0x1e,0x23,0x25,0x29,0x32,0x34,0x3a, 0x44,0x46,0x4e,0x35,0x37,0x3d,0x2a,0x2c,0x30,0x3a,0x3d,0x42,0x43,0x46,0x4d,0x36, 0x39,0x3f,0x31,0x32,0x39,0x37,0x39,0x3e,0x38,0x3a,0x40,0x32,0x35,0x3d,0x2c,0x2f, 0x38,0x2a,0x2e,0x38,0x26,0x2a,0x35,0x22,0x26,0x32,0x22,0x22,0x2e,0x21,0x22,0x2e, 0x20,0x22,0x2e,0x1d,0x1e,0x28,0x1a,0x1a,0x24,0x1b,0x1e,0x26,0x24,0x26,0x2d,0x15, 0x16,0x1e,0x12,0x12,0x18,0x12,0x12,0x18,0x5e,0x5f,0x70,0x63,0x6f,0x90,0x50,0x4d, 0x74,0x5a,0x63,0x85,0x5e,0x67,0x8a,0x61,0x68,0x8a,0x61,0x6a,0x8c,0x65,0x6e,0x90, 0x67,0x71,0x92,0x6a,0x75,0x95,0x6d,0x78,0x97,0x72,0x7c,0x9c,0x76,0x80,0x9e,0x78, 0x81,0x9e,0x78,0x82,0x9e,0x7a,0x83,0xa0,0x78,0x81,0x9e,0x79,0x81,0x9d,0x7a,0x81, 0x9d,0x78,0x80,0x9c,0x76,0x7e,0x9a,0x77,0x7f,0x9c,0x73,0x7b,0x99,0x5e,0x69,0x8b, 0x4f,0x4d,0x74,0x5e,0x67,0x89,0x54,0x55,0x5c,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0d, 0x0d,0x11,0x0c,0x0c,0x11,0x0c,0x0c,0x10,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a, 0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0d,0x0c,0x11,0x0e,0x0d,0x11, 0x0f,0x0e,0x13,0x10,0x0f,0x14,0x11,0x10,0x16,0x12,0x11,0x16,0x12,0x11,0x16,0x14, 0x12,0x17,0x13,0x12,0x16,0x12,0x11,0x16,0x1d,0x1c,0x20,0x2c,0x2b,0x2f,0x24,0x23, 0x28,0x16,0x14,0x1a,0x13,0x12,0x17,0x1d,0x19,0x20,0x2b,0x25,0x2f,0x1f,0x1b,0x22, 0x1f,0x1a,0x20,0x3e,0x30,0x3b,0x42,0x33,0x3f,0xb1,0xb4,0xc3,0x61,0x6d,0x93,0x51, 0x52,0x7d,0x68,0x74,0x98,0x69,0x74,0x98,0x5d,0x69,0x90,0x5f,0x6b,0x91,0x1f,0x23, 0x30,0x0a,0x0a,0x0e,0x10,0x11,0x16,0x1c,0x1d,0x27,0x27,0x27,0x36,0x33,0x34,0x47, 0x44,0x4a,0x5e,0x51,0x57,0x6c,0x5d,0x64,0x79,0x58,0x60,0x75,0x4c,0x52,0x66,0x4a, 0x50,0x62,0x49,0x4f,0x62,0x4e,0x54,0x69,0x57,0x5e,0x6f,0x5e,0x64,0x76,0x6a,0x70, 0x82,0x72,0x78,0x89,0x68,0x6e,0x7f,0x49,0x4e,0x60,0x48,0x4e,0x5e,0x55,0x5a,0x6b, 0x62,0x67,0x79,0x5c,0x62,0x76,0x66,0x6c,0x7e,0x6f,0x75,0x86,0x6d,0x73,0x85,0x66, 0x6c,0x7f,0x67,0x6d,0x7e,0x70,0x75,0x82,0x75,0x7a,0x85,0x72,0x76,0x82,0x76,0x7a, 0x86,0x82,0x86,0x91,0x87,0x8a,0x96,0x89,0x8d,0x96,0x85,0x88,0x93,0x7e,0x82,0x8d, 0x88,0x8c,0x96,0x96,0x99,0xa1,0x89,0x8c,0x94,0x7d,0x7e,0x83,0x94,0x90,0x97,0x7f, 0x7d,0x82,0x6e,0x6a,0x72,0x69,0x66,0x72,0x4e,0x49,0x55,0x3f,0x37,0x43,0x38,0x2e, 0x38,0x35,0x2e,0x35,0xaf,0xb2,0xbe,0x94,0x9d,0xb2,0x54,0x5e,0x84,0x52,0x5d,0x83, 0x61,0x6c,0x8e,0x61,0x6c,0x8c,0x62,0x6c,0x8c,0x23,0x26,0x2f,0x18,0x1a,0x1e,0x19, 0x1a,0x1f,0x1a,0x1b,0x20,0x1a,0x1b,0x20,0x19,0x1b,0x20,0x19,0x1b,0x20,0x19,0x1a, 0x1f,0x17,0x1a,0x1e,0x16,0x17,0x1b,0x12,0x14,0x18,0x53,0x52,0x74,0x55,0x51,0x76, 0x59,0x53,0x77,0x5b,0x52,0x77,0x5c,0x53,0x76,0x5c,0x53,0x77,0x5c,0x53,0x77,0x5e, 0x53,0x75,0x5e,0x53,0x75,0x5a,0x53,0x78,0x54,0x51,0x78,0x52,0x4f,0x79,0x52,0x59, 0x82,0x54,0x5e,0x87,0x56,0x62,0x89,0x75,0x80,0x9f,0x30,0x2e,0x31,0x08,0x09,0x0a, 0x08,0x08,0x0a,0x07,0x08,0x0a,0x54,0x43,0x54,0x45,0x37,0x43,0x49,0x39,0x46,0x42, 0x35,0x41,0x4a,0x3c,0x47,0xc3,0xc9,0xd5,0x8e,0x97,0xb2,0x5b,0x68,0x8c,0x50,0x5b, 0x80,0x4b,0x55,0x79,0x48,0x51,0x76,0x42,0x4d,0x70,0x3f,0x48,0x6a,0x3b,0x44,0x65, 0x3a,0x45,0x65,0x3b,0x44,0x64,0x3f,0x45,0x68,0x41,0x48,0x6a,0x43,0x48,0x70,0x43, 0x43,0x65,0x55,0x55,0x81,0x4b,0x43,0x5d,0x06,0x06,0x08,0x06,0x07,0x09,0x08,0x08, 0x0a,0x08,0x09,0x0a,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09,0x0a, 0x09,0x09,0x0a,0x08,0x09,0x0a,0x08,0x08,0x0a,0x07,0x08,0x09,0x06,0x07,0x09,0x06, 0x06,0x07,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x04,0x04, 0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,0x27,0x29,0x2f,0x5e,0x69,0x8f,0x3c,0x3c,0x5b,0x44, 0x45,0x69,0x52,0x5d,0x86,0x62,0x6d,0x94,0xa7,0xa9,0xb4,0x21,0x18,0x1b,0x0b,0x08, 0x0a,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,0x1f, 0x1f,0x1f,0xeb,0xed,0xed,0xad,0xb4,0xc9,0x99,0xa2,0xbb,0x96,0xa0,0xb9,0x95,0x9f, 0xb9,0x96,0xa0,0xbb,0xa0,0xab,0xc7,0x8b,0x95,0xa0,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,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,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, 0x13,0x13,0x13,0x2f,0x2f,0x2f,0x30,0x30,0x31,0x03,0x03,0x03,0x04,0x05,0x05,0x0d, 0x0e,0x0e,0x2f,0x30,0x31,0x35,0x36,0x38,0x2d,0x2f,0x35,0x39,0x3d,0x45,0x44,0x48, 0x52,0x56,0x5a,0x66,0x66,0x6a,0x76,0x57,0x5b,0x66,0x46,0x4a,0x52,0x48,0x4a,0x52, 0x4c,0x4e,0x57,0x47,0x4a,0x52,0x42,0x44,0x4c,0x36,0x3a,0x41,0x34,0x36,0x3e,0x33, 0x36,0x3e,0x34,0x37,0x41,0x35,0x38,0x42,0x32,0x36,0x41,0x2e,0x32,0x3e,0x2c,0x30, 0x3c,0x34,0x38,0x43,0x3b,0x3e,0x4a,0x37,0x3b,0x46,0x2a,0x2e,0x39,0x27,0x2a,0x34, 0x2e,0x31,0x39,0x27,0x2a,0x31,0x18,0x1a,0x22,0x14,0x13,0x1a,0x3d,0x3e,0x4c,0x6d, 0x75,0x93,0x50,0x4d,0x74,0x58,0x5f,0x82,0x5f,0x66,0x87,0x5e,0x66,0x88,0x62,0x69, 0x8a,0x64,0x6c,0x8c,0x65,0x6e,0x90,0x69,0x74,0x94,0x6d,0x78,0x96,0x71,0x7b,0x9a, 0x73,0x7c,0x9c,0x77,0x81,0x9e,0x77,0x80,0x9e,0x78,0x82,0x9e,0x7a,0x82,0x9f,0x79, 0x81,0x9d,0x79,0x81,0x9c,0x78,0x80,0x9c,0x79,0x80,0x9c,0x74,0x7c,0x99,0x74,0x7b, 0x99,0x6d,0x75,0x93,0x4f,0x4f,0x74,0x52,0x5c,0x81,0x76,0x79,0x8b,0x0f,0x0f,0x15, 0x0f,0x0e,0x14,0x0e,0x0e,0x13,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0c,0x0c,0x11,0x0a, 0x0a,0x0e,0x0a,0x0a,0x0e,0x0b,0x0b,0x0f,0x0b,0x0b,0x0f,0x0c,0x0c,0x10,0x0d,0x0d, 0x12,0x0e,0x0e,0x13,0x0f,0x0f,0x14,0x11,0x10,0x16,0x12,0x11,0x16,0x12,0x12,0x17, 0x14,0x12,0x19,0x14,0x12,0x18,0x14,0x12,0x19,0x14,0x12,0x18,0x28,0x28,0x2c,0x33, 0x33,0x37,0x28,0x26,0x2c,0x3a,0x38,0x3d,0x2f,0x2e,0x32,0x2c,0x2b,0x2f,0x22,0x1e, 0x26,0x22,0x1e,0x26,0x22,0x1c,0x24,0x3e,0x30,0x3c,0x41,0x33,0x3f,0xb3,0xb4,0xc1, 0x60,0x6b,0x92,0x51,0x53,0x7d,0x69,0x75,0x98,0x6a,0x77,0x9a,0x5e,0x6a,0x91,0x62, 0x6f,0x93,0x1b,0x1d,0x28,0x0d,0x0d,0x11,0x1a,0x19,0x22,0x27,0x28,0x36,0x34,0x3a, 0x4b,0x4c,0x52,0x66,0x5e,0x65,0x78,0x59,0x60,0x76,0x53,0x5a,0x70,0x44,0x4a,0x5d, 0x3d,0x42,0x54,0x3e,0x42,0x53,0x4d,0x52,0x63,0x56,0x5c,0x6c,0x66,0x6a,0x7a,0x6c, 0x71,0x80,0x6a,0x70,0x80,0x5b,0x62,0x73,0x57,0x5e,0x6f,0x53,0x58,0x69,0x4e,0x53, 0x63,0x53,0x58,0x67,0x54,0x59,0x69,0x55,0x5b,0x6a,0x63,0x68,0x78,0x6a,0x70,0x80, 0x66,0x6d,0x7e,0x59,0x5f,0x72,0x59,0x5f,0x72,0x66,0x6b,0x7b,0x6f,0x74,0x82,0x75, 0x7a,0x87,0x78,0x7d,0x8a,0x7e,0x82,0x8e,0x80,0x84,0x8f,0x83,0x87,0x92,0x85,0x89, 0x94,0x83,0x87,0x92,0x8c,0x90,0x9a,0x91,0x94,0x9e,0x88,0x8b,0x95,0x77,0x7a,0x81, 0x9b,0x98,0xa0,0x92,0x91,0x98,0x64,0x63,0x70,0x4f,0x4e,0x63,0x42,0x3d,0x4f,0x43, 0x3f,0x4e,0x46,0x3d,0x49,0x36,0x2f,0x37,0xa5,0xa8,0xb5,0x97,0x9d,0xb2,0x55,0x60, 0x85,0x53,0x5e,0x83,0x62,0x6d,0x90,0x62,0x6c,0x8e,0x5b,0x67,0x89,0x55,0x5f,0x79, 0x17,0x19,0x1d,0x17,0x19,0x1e,0x19,0x1a,0x1f,0x19,0x1a,0x20,0x1a,0x1c,0x22,0x1a, 0x1c,0x21,0x1a,0x1b,0x20,0x18,0x1a,0x1e,0x16,0x17,0x1c,0x13,0x15,0x19,0x53,0x51, 0x74,0x55,0x51,0x75,0x55,0x50,0x76,0x59,0x52,0x77,0x5c,0x53,0x76,0x5c,0x53,0x77, 0x5c,0x52,0x77,0x5c,0x53,0x77,0x5c,0x53,0x77,0x5b,0x53,0x77,0x57,0x51,0x77,0x51, 0x50,0x78,0x52,0x58,0x81,0x54,0x5e,0x87,0x56,0x62,0x88,0x71,0x7c,0x9c,0x3d,0x3b, 0x40,0x08,0x09,0x0a,0x08,0x09,0x0a,0x07,0x08,0x0a,0x52,0x44,0x53,0x46,0x38,0x44, 0x47,0x39,0x45,0x42,0x33,0x3f,0x4a,0x3e,0x49,0xc5,0xc9,0xd6,0x8d,0x96,0xb0,0x5c, 0x67,0x8b,0x50,0x5c,0x82,0x4c,0x56,0x7b,0x48,0x51,0x75,0x44,0x4c,0x6e,0x3f,0x48, 0x6a,0x3c,0x46,0x66,0x3a,0x44,0x65,0x3a,0x43,0x63,0x3f,0x47,0x67,0x42,0x47,0x6c, 0x44,0x47,0x6e,0x41,0x42,0x66,0x51,0x52,0x7a,0x5f,0x4f,0x73,0x08,0x09,0x0b,0x07, 0x07,0x09,0x07,0x08,0x0a,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x09,0x0a, 0x0b,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09,0x0a,0x08,0x09,0x0a,0x08,0x08,0x0a, 0x07,0x08,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x06,0x05, 0x05,0x06,0x04,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x0a,0x0b,0x0d,0x63,0x6e,0x91,0x42,0x46,0x69, 0x3f,0x40,0x61,0x52,0x5d,0x86,0x62,0x6e,0x93,0xc4,0xc7,0xd0,0x22,0x19,0x1d,0x12, 0x0d,0x10,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,0x57,0x57,0x57,0xdf,0xe1,0xe9,0x9d,0xa7,0xbf,0x98, 0xa1,0xba,0x96,0xa0,0xb9,0x95,0x9f,0xb9,0x97,0xa1,0xbb,0xa9,0xb4,0xd5,0x48,0x48, 0x48,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,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,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,0x0d,0x0d,0x0d,0x20,0x20,0x20,0x11,0x11,0x11,0x19,0x19,0x1a,0x03,0x03,0x03, 0x07,0x07,0x08,0x11,0x12,0x12,0x26,0x27,0x2a,0x37,0x3a,0x3f,0x46,0x4a,0x56,0x51, 0x56,0x63,0x5a,0x5f,0x6d,0x67,0x6c,0x79,0x69,0x6e,0x7b,0x5e,0x62,0x6e,0x5a,0x5f, 0x6a,0x5e,0x61,0x6c,0x50,0x54,0x5f,0x47,0x4a,0x54,0x41,0x44,0x4d,0x42,0x44,0x4d, 0x3d,0x40,0x48,0x3e,0x41,0x4a,0x3f,0x42,0x4b,0x41,0x44,0x4e,0x3f,0x42,0x4c,0x3e, 0x41,0x4b,0x3c,0x40,0x4a,0x43,0x47,0x52,0x4d,0x51,0x5a,0x49,0x4c,0x56,0x3d,0x40, 0x4b,0x31,0x35,0x3f,0x39,0x3c,0x45,0x3b,0x3e,0x46,0x2f,0x32,0x3a,0x22,0x26,0x2e, 0x2f,0x33,0x3e,0x78,0x7e,0x98,0x53,0x4d,0x71,0x58,0x5c,0x7e,0x60,0x65,0x86,0x60, 0x66,0x87,0x60,0x67,0x88,0x63,0x6b,0x8b,0x65,0x6d,0x8e,0x68,0x70,0x91,0x6a,0x75, 0x95,0x6c,0x77,0x95,0x73,0x7d,0x9a,0x75,0x7e,0x9c,0x77,0x80,0x9e,0x7a,0x83,0x9f, 0x78,0x81,0x9e,0x77,0x7f,0x9b,0x78,0x7e,0x9b,0x78,0x7f,0x9b,0x77,0x7e,0x9a,0x76, 0x7d,0x9a,0x74,0x7c,0x98,0x6f,0x78,0x96,0x52,0x5b,0x7f,0x4f,0x4e,0x74,0x72,0x78, 0x96,0x1f,0x1e,0x24,0x10,0x10,0x16,0x10,0x10,0x16,0x10,0x0f,0x15,0x0e,0x0e,0x14, 0x0e,0x0e,0x14,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0c,0x0c,0x10,0x0d,0x0d,0x12,0x0e, 0x0e,0x12,0x0e,0x0e,0x13,0x0e,0x0e,0x14,0x10,0x10,0x16,0x12,0x11,0x16,0x12,0x11, 0x17,0x14,0x12,0x19,0x14,0x13,0x1a,0x14,0x13,0x19,0x14,0x13,0x19,0x14,0x13,0x19, 0x33,0x32,0x37,0x1c,0x1b,0x21,0x12,0x11,0x17,0x14,0x13,0x19,0x24,0x24,0x29,0x29, 0x28,0x2d,0x1b,0x18,0x1e,0x22,0x1e,0x26,0x26,0x20,0x28,0x41,0x32,0x3d,0x40,0x32, 0x3e,0xb2,0xb2,0xbf,0x5d,0x69,0x8f,0x51,0x4e,0x79,0x6e,0x7a,0x9d,0x6d,0x79,0x9d, 0x5e,0x6b,0x92,0x63,0x6e,0x92,0x17,0x19,0x22,0x12,0x11,0x16,0x21,0x1f,0x2a,0x32, 0x36,0x46,0x5f,0x65,0x76,0x77,0x7d,0x8e,0x73,0x79,0x8c,0x5e,0x66,0x7b,0x4c,0x52, 0x67,0x42,0x46,0x5a,0x44,0x49,0x5a,0x55,0x5a,0x6a,0x62,0x68,0x78,0x66,0x6c,0x7d, 0x62,0x67,0x78,0x68,0x6e,0x7f,0x67,0x6e,0x7f,0x69,0x6e,0x80,0x62,0x68,0x7a,0x5b, 0x61,0x72,0x51,0x56,0x66,0x49,0x4e,0x5e,0x43,0x48,0x56,0x46,0x4b,0x5a,0x51,0x56, 0x66,0x5e,0x64,0x76,0x60,0x66,0x78,0x53,0x5a,0x6e,0x51,0x57,0x6a,0x5b,0x61,0x72, 0x66,0x6c,0x7d,0x6e,0x75,0x85,0x6e,0x74,0x85,0x74,0x7a,0x8a,0x79,0x7e,0x8e,0x78, 0x7d,0x8c,0x74,0x78,0x86,0x7e,0x82,0x8d,0x86,0x8a,0x96,0x8e,0x91,0x9d,0x88,0x8d, 0x97,0x82,0x84,0x8c,0x9a,0x98,0xa2,0x96,0x95,0x9e,0x75,0x75,0x80,0x4e,0x4c,0x5a, 0x40,0x3c,0x48,0x3c,0x35,0x41,0x4a,0x43,0x4d,0x51,0x4c,0x55,0x8a,0x89,0x93,0x9a, 0xa1,0xb5,0x56,0x61,0x86,0x54,0x5f,0x84,0x62,0x6d,0x90,0x63,0x6d,0x90,0x57,0x62, 0x86,0x5d,0x69,0x8a,0x3d,0x43,0x56,0x17,0x19,0x1e,0x17,0x19,0x1e,0x19,0x1a,0x20, 0x1a,0x1b,0x20,0x1a,0x1b,0x20,0x19,0x1b,0x20,0x18,0x1a,0x1e,0x16,0x17,0x1b,0x14, 0x16,0x1a,0x54,0x50,0x75,0x55,0x51,0x76,0x56,0x51,0x76,0x59,0x52,0x77,0x5c,0x53, 0x77,0x5c,0x53,0x77,0x5c,0x52,0x77,0x5e,0x53,0x75,0x5e,0x53,0x75,0x5a,0x52,0x77, 0x57,0x51,0x77,0x51,0x50,0x79,0x52,0x56,0x7e,0x53,0x5e,0x86,0x57,0x63,0x89,0x6f, 0x7a,0x9b,0x4a,0x47,0x4c,0x09,0x0a,0x0b,0x08,0x09,0x0a,0x07,0x08,0x0a,0x51,0x42, 0x51,0x4f,0x3f,0x4d,0x43,0x34,0x40,0x42,0x34,0x3f,0x4d,0x3f,0x4c,0xc5,0xc9,0xd6, 0x8d,0x96,0xaf,0x5b,0x67,0x8a,0x50,0x5c,0x81,0x4b,0x56,0x7c,0x48,0x53,0x75,0x42, 0x4e,0x6f,0x3e,0x47,0x69,0x3a,0x44,0x65,0x39,0x44,0x64,0x3b,0x43,0x65,0x3e,0x46, 0x66,0x42,0x47,0x6b,0x46,0x49,0x6d,0x40,0x41,0x63,0x51,0x51,0x79,0x63,0x50,0x70, 0x30,0x28,0x35,0x07,0x07,0x09,0x07,0x08,0x0a,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0a, 0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09,0x0a,0x08,0x09, 0x0a,0x08,0x08,0x0a,0x07,0x08,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07, 0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03, 0x03,0x04,0x02,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x64,0x6e,0x89,0x49,0x53, 0x78,0x3c,0x3c,0x5d,0x4e,0x58,0x7f,0x5d,0x69,0x90,0xc7,0xcc,0xd9,0x32,0x2a,0x2d, 0x20,0x17,0x1b,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,0x93,0x93,0x93, 0xbb,0xc1,0xd2,0x98,0xa1,0xba,0x96,0xa0,0xba,0x94,0x9d,0xb8,0x95,0x9f,0xb9,0x98, 0xa2,0xbd,0xb5,0xc1,0xe4,0x0d,0x0d,0x0d,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, 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,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,0x17,0x17,0x17,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x06,0x06,0x12,0x12,0x14,0x21,0x22,0x26,0x32,0x34,0x3a,0x46,0x4a,0x53, 0x5e,0x62,0x6e,0x60,0x65,0x73,0x5e,0x63,0x71,0x64,0x69,0x76,0x5d,0x61,0x6e,0x51, 0x55,0x62,0x59,0x5e,0x6a,0x62,0x67,0x76,0x5a,0x5f,0x6e,0x50,0x54,0x61,0x4e,0x52, 0x5d,0x4e,0x52,0x5c,0x4b,0x4e,0x58,0x46,0x4a,0x52,0x4e,0x52,0x5a,0x52,0x56,0x5e, 0x52,0x56,0x5e,0x4d,0x50,0x59,0x4b,0x4f,0x58,0x46,0x4a,0x54,0x43,0x47,0x52,0x43, 0x47,0x52,0x3d,0x41,0x4c,0x32,0x36,0x42,0x32,0x36,0x41,0x48,0x4a,0x53,0x4a,0x4d, 0x55,0x32,0x36,0x3f,0x2a,0x2d,0x37,0x84,0x8b,0xa2,0x58,0x50,0x70,0x54,0x54,0x76, 0x5f,0x63,0x82,0x5f,0x64,0x83,0x60,0x66,0x85,0x60,0x67,0x88,0x62,0x6a,0x8b,0x65, 0x6e,0x8e,0x69,0x73,0x91,0x6b,0x76,0x95,0x71,0x7c,0x9a,0x73,0x7e,0x9b,0x77,0x80, 0x9d,0x76,0x81,0x9d,0x76,0x7f,0x9b,0x7a,0x81,0x9d,0x77,0x7e,0x9a,0x78,0x7e,0x9a, 0x77,0x7e,0x9b,0x76,0x7d,0x9a,0x75,0x7c,0x99,0x71,0x78,0x95,0x5c,0x65,0x87,0x4e, 0x4c,0x72,0x59,0x63,0x85,0x4f,0x4f,0x5a,0x12,0x12,0x18,0x12,0x12,0x18,0x12,0x11, 0x17,0x11,0x11,0x17,0x11,0x11,0x16,0x0f,0x0f,0x15,0x10,0x10,0x16,0x0e,0x0f,0x14, 0x0f,0x0f,0x15,0x10,0x0f,0x15,0x10,0x0f,0x15,0x10,0x10,0x16,0x12,0x11,0x17,0x12, 0x12,0x17,0x12,0x12,0x19,0x14,0x13,0x1a,0x2f,0x2d,0x33,0x38,0x37,0x3d,0x3a,0x39, 0x3f,0x3a,0x39,0x3e,0x3e,0x3b,0x41,0x19,0x16,0x1e,0x19,0x16,0x1e,0x18,0x16,0x1c, 0x15,0x13,0x1a,0x14,0x13,0x1a,0x1c,0x19,0x20,0x24,0x20,0x28,0x27,0x22,0x2a,0x41, 0x34,0x3f,0x41,0x33,0x3e,0xae,0xad,0xb9,0x5a,0x67,0x8c,0x52,0x5d,0x86,0x75,0x81, 0xa2,0x72,0x7e,0x9f,0x64,0x70,0x95,0x64,0x6f,0x94,0x16,0x17,0x20,0x17,0x18,0x21, 0x29,0x2d,0x3b,0x56,0x5b,0x6c,0x7b,0x81,0x91,0x7b,0x81,0x92,0x6f,0x76,0x8a,0x5e, 0x66,0x7b,0x54,0x5a,0x70,0x4e,0x53,0x67,0x52,0x59,0x6a,0x5a,0x61,0x72,0x60,0x66, 0x77,0x62,0x68,0x7a,0x64,0x6a,0x7c,0x64,0x6a,0x7c,0x64,0x6a,0x7b,0x5f,0x65,0x77, 0x5a,0x5e,0x6d,0x52,0x56,0x66,0x4e,0x51,0x5f,0x46,0x4a,0x58,0x3e,0x41,0x4e,0x3e, 0x40,0x4d,0x3e,0x40,0x50,0x45,0x49,0x5a,0x41,0x47,0x5b,0x42,0x47,0x5f,0x47,0x4e, 0x64,0x51,0x56,0x6b,0x5e,0x64,0x77,0x66,0x6c,0x7e,0x66,0x6c,0x80,0x6d,0x73,0x87, 0x73,0x7a,0x8d,0x74,0x7a,0x8c,0x6c,0x72,0x83,0x6a,0x6f,0x7e,0x6f,0x74,0x82,0x76, 0x7a,0x89,0x7f,0x83,0x8e,0x77,0x7b,0x85,0x86,0x86,0x94,0x85,0x85,0x90,0x89,0x87, 0x8f,0x62,0x60,0x69,0x5b,0x54,0x5e,0x4f,0x48,0x52,0x4f,0x49,0x52,0x5d,0x58,0x60, 0x91,0x90,0x9a,0xa0,0xa6,0xb9,0x58,0x64,0x85,0x50,0x54,0x79,0x63,0x6f,0x90,0x62, 0x6d,0x8f,0x56,0x62,0x86,0x55,0x5f,0x84,0x60,0x6a,0x8b,0x19,0x1b,0x20,0x17,0x19, 0x1e,0x18,0x1a,0x1e,0x19,0x1a,0x20,0x1a,0x1c,0x21,0x1a,0x1b,0x21,0x18,0x1a,0x1e, 0x16,0x17,0x1c,0x14,0x15,0x19,0x53,0x50,0x73,0x53,0x51,0x76,0x55,0x50,0x76,0x5a, 0x53,0x77,0x5b,0x52,0x77,0x5c,0x53,0x77,0x5c,0x52,0x77,0x5c,0x53,0x77,0x5c,0x53, 0x77,0x5a,0x52,0x77,0x57,0x51,0x77,0x51,0x50,0x78,0x52,0x55,0x7f,0x53,0x5c,0x85, 0x56,0x62,0x88,0x72,0x7d,0x9d,0x55,0x53,0x58,0x09,0x0a,0x0b,0x09,0x09,0x0b,0x07, 0x08,0x0a,0x4b,0x3d,0x4b,0x52,0x42,0x51,0x42,0x34,0x3e,0x42,0x34,0x3f,0x52,0x45, 0x51,0xc5,0xc9,0xd6,0x8e,0x97,0xb1,0x5b,0x65,0x8c,0x50,0x5a,0x82,0x4c,0x55,0x7b, 0x49,0x53,0x77,0x41,0x4d,0x6f,0x40,0x49,0x6c,0x3c,0x44,0x64,0x3a,0x43,0x64,0x3a, 0x42,0x64,0x3f,0x46,0x67,0x41,0x47,0x6a,0x45,0x48,0x6c,0x42,0x43,0x64,0x4f,0x4f, 0x75,0x62,0x4e,0x6d,0x34,0x29,0x3b,0x13,0x12,0x16,0x07,0x08,0x0a,0x08,0x09,0x0a, 0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0a,0x0c,0x09, 0x0a,0x0b,0x09,0x09,0x0a,0x08,0x08,0x0a,0x07,0x08,0x09,0x06,0x07,0x09,0x06,0x06, 0x08,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x05,0x05,0x06, 0x04,0x04,0x05,0x03,0x04,0x05,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,0x53,0x59,0x6c,0x55, 0x5f,0x84,0x40,0x45,0x68,0x4c,0x56,0x7e,0x5a,0x65,0x8c,0xb6,0xbd,0xcf,0x51,0x4a, 0x4d,0x20,0x17,0x1b,0x05,0x04,0x06,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,0x09,0x09,0x09,0xd5,0xd5,0xd7,0xa1,0xa9,0xc1,0x93,0x9c,0xb8,0x96,0xa0,0xba, 0x94,0x9d,0xb8,0x94,0x9d,0xb8,0xa0,0xaa,0xc5,0xaf,0xba,0xcf,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,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,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,0x1b,0x1b,0x1b,0x10,0x10,0x10,0x00, 0x00,0x00,0x02,0x02,0x02,0x0a,0x0a,0x0b,0x1c,0x1d,0x20,0x25,0x26,0x2c,0x43,0x47, 0x51,0x59,0x5d,0x6a,0x63,0x67,0x74,0x5f,0x63,0x70,0x53,0x58,0x64,0x4e,0x53,0x5e, 0x49,0x4d,0x59,0x42,0x46,0x52,0x47,0x4b,0x58,0x53,0x59,0x68,0x5a,0x5e,0x6d,0x5c, 0x62,0x6f,0x6c,0x6f,0x7a,0x71,0x74,0x7e,0x62,0x66,0x72,0x56,0x5a,0x65,0x55,0x59, 0x63,0x5c,0x5f,0x67,0x5a,0x5e,0x66,0x59,0x5b,0x64,0x56,0x5a,0x64,0x4b,0x4f,0x5a, 0x43,0x47,0x52,0x3b,0x40,0x4c,0x36,0x3b,0x48,0x32,0x36,0x43,0x30,0x34,0x41,0x40, 0x44,0x4e,0x55,0x58,0x60,0x4d,0x50,0x5a,0x3a,0x3e,0x48,0x75,0x7c,0x90,0x54,0x4e, 0x71,0x55,0x4e,0x6f,0x60,0x62,0x80,0x61,0x63,0x82,0x61,0x64,0x84,0x60,0x65,0x85, 0x62,0x69,0x88,0x63,0x6c,0x8c,0x66,0x6f,0x8f,0x6a,0x74,0x93,0x75,0x80,0x9c,0x7f, 0x89,0xa2,0x83,0x8b,0xa6,0x78,0x83,0x9e,0x76,0x80,0x9b,0x76,0x7f,0x9b,0x78,0x7f, 0x9b,0x77,0x7d,0x99,0x76,0x7d,0x98,0x74,0x7b,0x98,0x74,0x7b,0x98,0x71,0x78,0x96, 0x66,0x6e,0x8e,0x4e,0x4d,0x73,0x4f,0x57,0x7c,0x63,0x67,0x7b,0x13,0x13,0x1a,0x13, 0x13,0x1a,0x13,0x13,0x1a,0x13,0x13,0x1a,0x12,0x12,0x1a,0x12,0x12,0x18,0x12,0x12, 0x18,0x12,0x12,0x18,0x12,0x12,0x18,0x12,0x12,0x18,0x12,0x12,0x18,0x12,0x12,0x18, 0x12,0x12,0x19,0x14,0x13,0x1a,0x14,0x14,0x1b,0x16,0x15,0x1c,0x1e,0x1c,0x24,0x20, 0x1d,0x24,0x22,0x1e,0x26,0x25,0x20,0x2a,0x38,0x33,0x3c,0x28,0x23,0x2d,0x29,0x24, 0x2e,0x28,0x23,0x2d,0x22,0x1e,0x26,0x1e,0x1b,0x23,0x23,0x1f,0x28,0x26,0x22,0x2b, 0x26,0x21,0x2a,0x41,0x33,0x3f,0x40,0x33,0x3f,0xaf,0xae,0xb8,0x5c,0x69,0x8e,0x5a, 0x65,0x8e,0x7c,0x88,0xa7,0x74,0x80,0xa1,0x68,0x73,0x97,0x65,0x70,0x93,0x17,0x19, 0x22,0x26,0x28,0x32,0x40,0x45,0x52,0x6e,0x72,0x82,0x83,0x89,0x97,0x76,0x7c,0x8f, 0x69,0x70,0x85,0x5a,0x62,0x78,0x54,0x5b,0x71,0x52,0x59,0x6b,0x4f,0x55,0x65,0x53, 0x59,0x66,0x56,0x5c,0x6c,0x55,0x5b,0x6c,0x53,0x57,0x69,0x52,0x55,0x66,0x4b,0x4e, 0x5e,0x4a,0x4b,0x5b,0x47,0x49,0x59,0x45,0x46,0x56,0x41,0x43,0x54,0x3a,0x3c,0x4b, 0x36,0x37,0x49,0x38,0x3a,0x4c,0x3a,0x3e,0x50,0x3e,0x42,0x56,0x42,0x44,0x5b,0x44, 0x46,0x5e,0x46,0x4c,0x65,0x49,0x4e,0x66,0x4b,0x52,0x66,0x57,0x5d,0x72,0x59,0x60, 0x75,0x5f,0x66,0x7c,0x65,0x6c,0x82,0x66,0x6d,0x82,0x66,0x6d,0x82,0x68,0x6e,0x83, 0x69,0x6f,0x80,0x6c,0x72,0x81,0x6c,0x71,0x7d,0x6a,0x6e,0x7c,0x69,0x6b,0x81,0x74, 0x77,0x87,0x99,0x97,0x9c,0x84,0x81,0x85,0x8c,0x86,0x8a,0x88,0x82,0x86,0x6b,0x64, 0x6c,0x55,0x50,0x56,0x8b,0x8a,0x93,0xa3,0xaa,0xbc,0x5d,0x66,0x88,0x50,0x56,0x7b, 0x63,0x6e,0x8f,0x64,0x6f,0x90,0x61,0x6b,0x8e,0x54,0x58,0x7e,0x5a,0x65,0x89,0x4b, 0x53,0x6c,0x17,0x19,0x1e,0x18,0x1a,0x1f,0x1a,0x1b,0x20,0x1a,0x1b,0x21,0x1a,0x1b, 0x21,0x19,0x1a,0x20,0x17,0x19,0x1e,0x14,0x16,0x1a,0x52,0x50,0x73,0x52,0x50,0x77, 0x54,0x51,0x76,0x58,0x52,0x76,0x5a,0x52,0x77,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5c, 0x53,0x77,0x5c,0x53,0x77,0x5b,0x52,0x77,0x58,0x51,0x77,0x52,0x50,0x79,0x52,0x54, 0x7c,0x53,0x5d,0x86,0x56,0x62,0x88,0x77,0x80,0xa0,0x5e,0x5b,0x61,0x09,0x0a,0x0b, 0x08,0x09,0x0a,0x08,0x09,0x0a,0x42,0x36,0x43,0x52,0x42,0x52,0x42,0x34,0x3f,0x3f, 0x32,0x3c,0x61,0x57,0x63,0xc4,0xc8,0xd5,0x8d,0x97,0xb1,0x59,0x65,0x8a,0x52,0x5d, 0x82,0x4c,0x55,0x7b,0x49,0x52,0x75,0x44,0x4d,0x72,0x3f,0x49,0x6a,0x3a,0x45,0x66, 0x39,0x42,0x63,0x3b,0x43,0x65,0x3e,0x43,0x66,0x41,0x46,0x68,0x45,0x48,0x6d,0x41, 0x43,0x66,0x4e,0x4f,0x74,0x58,0x47,0x62,0x34,0x28,0x3a,0x30,0x2c,0x40,0x07,0x08, 0x0a,0x08,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d,0x0a,0x0b,0x0d, 0x0a,0x0a,0x0d,0x0a,0x0a,0x0c,0x09,0x09,0x0a,0x08,0x09,0x0a,0x08,0x08,0x0a,0x07, 0x08,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x06,0x06,0x05,0x06, 0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x03, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x34,0x3c, 0x61,0x6c,0x90,0x43,0x4c,0x6e,0x47,0x50,0x76,0x58,0x64,0x8b,0x9e,0xa6,0xbe,0x83, 0x7f,0x7f,0x19,0x11,0x15,0x12,0x0e,0x11,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,0x3f,0x3f,0x3f,0xcb,0xd0,0xdd,0x96,0xa0, 0xb9,0x96,0xa0,0xb9,0x98,0xa1,0xba,0x94,0x9d,0xb8,0x95,0x9f,0xb9,0x9f,0xa8,0xc7, 0x75,0x75,0x75,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,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,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,0x37,0x37,0x37, 0x0a,0x0a,0x0a,0x00,0x00,0x00,0x06,0x06,0x06,0x15,0x16,0x18,0x2e,0x2f,0x35,0x38, 0x3b,0x43,0x52,0x57,0x62,0x62,0x66,0x73,0x5c,0x60,0x6b,0x4e,0x52,0x5d,0x3c,0x40, 0x4a,0x32,0x36,0x40,0x2e,0x31,0x3c,0x28,0x2b,0x36,0x2e,0x32,0x3d,0x3d,0x42,0x4e, 0x4b,0x50,0x5c,0x58,0x5d,0x6a,0x6a,0x6e,0x7a,0x72,0x76,0x82,0x76,0x7a,0x86,0x71, 0x75,0x80,0x61,0x65,0x70,0x57,0x5c,0x67,0x4c,0x51,0x5e,0x4f,0x53,0x60,0x56,0x5a, 0x65,0x59,0x5d,0x67,0x53,0x57,0x62,0x46,0x4a,0x56,0x40,0x44,0x51,0x3d,0x41,0x4e, 0x3a,0x3e,0x4b,0x38,0x3d,0x4a,0x47,0x4a,0x56,0x60,0x63,0x6c,0x5d,0x5f,0x69,0x71, 0x77,0x89,0x51,0x50,0x73,0x5a,0x51,0x70,0x61,0x61,0x7f,0x5d,0x61,0x82,0x5e,0x62, 0x83,0x62,0x65,0x84,0x62,0x68,0x86,0x62,0x69,0x89,0x5f,0x67,0x88,0x62,0x6b,0x8b, 0x7b,0x83,0x9f,0x8f,0x97,0xae,0x97,0x9e,0xb3,0x87,0x90,0xa8,0x7b,0x85,0xa0,0x78, 0x80,0x9c,0x78,0x7f,0x9b,0x78,0x7e,0x9a,0x76,0x7d,0x98,0x75,0x7c,0x98,0x72,0x78, 0x96,0x71,0x78,0x95,0x6d,0x75,0x93,0x51,0x5a,0x7e,0x4e,0x4d,0x74,0x68,0x70,0x8f, 0x21,0x21,0x28,0x16,0x16,0x1e,0x16,0x16,0x1e,0x16,0x16,0x1e,0x16,0x16,0x1e,0x15, 0x16,0x1d,0x15,0x15,0x1d,0x15,0x16,0x1d,0x15,0x16,0x1d,0x15,0x16,0x1d,0x14,0x15, 0x1c,0x15,0x15,0x1c,0x15,0x14,0x1c,0x16,0x15,0x1d,0x42,0x42,0x48,0x1b,0x1a,0x22, 0x20,0x1d,0x26,0x26,0x22,0x2c,0x2e,0x28,0x33,0x33,0x2d,0x38,0x36,0x2e,0x3a,0x36, 0x2e,0x3a,0x38,0x30,0x3d,0x3a,0x31,0x3e,0x35,0x2e,0x3c,0x2e,0x2a,0x36,0x2d,0x28, 0x35,0x2c,0x27,0x32,0x24,0x1f,0x28,0x3f,0x35,0x43,0x55,0x4a,0x55,0xb9,0xba,0xc4, 0x70,0x78,0x9a,0x64,0x6e,0x92,0x81,0x8a,0xa7,0x76,0x81,0xa1,0x6e,0x78,0x9a,0x67, 0x72,0x95,0x1a,0x1c,0x25,0x28,0x2c,0x36,0x48,0x4d,0x5c,0x6e,0x72,0x82,0x7a,0x80, 0x90,0x6a,0x71,0x86,0x5e,0x66,0x7a,0x56,0x5e,0x72,0x56,0x5a,0x6d,0x4a,0x4e,0x5e, 0x42,0x43,0x50,0x40,0x41,0x4e,0x42,0x43,0x52,0x42,0x43,0x52,0x43,0x43,0x52,0x41, 0x41,0x52,0x3c,0x3d,0x4e,0x3a,0x3a,0x4d,0x3b,0x3b,0x4e,0x3c,0x3c,0x4f,0x3c,0x3a, 0x4d,0x3a,0x37,0x4a,0x40,0x38,0x4a,0x40,0x3a,0x4c,0x43,0x3c,0x4e,0x44,0x3e,0x53, 0x44,0x42,0x56,0x43,0x42,0x5a,0x48,0x46,0x5e,0x49,0x47,0x61,0x4a,0x4a,0x63,0x51, 0x57,0x6f,0x55,0x5a,0x72,0x59,0x5e,0x75,0x5e,0x64,0x7b,0x61,0x69,0x80,0x6c,0x73, 0x89,0x74,0x7b,0x8e,0x78,0x7e,0x90,0x7e,0x84,0x92,0x7d,0x81,0x8c,0x70,0x73,0x80, 0x69,0x6a,0x7e,0x66,0x68,0x7c,0xa2,0x9f,0xa2,0xa1,0x9d,0x9f,0x9f,0x9b,0x9d,0xa4, 0x9f,0xa2,0x95,0x8f,0x93,0x5b,0x57,0x5e,0x76,0x74,0x7e,0x92,0x98,0xaa,0x56,0x60, 0x81,0x57,0x61,0x84,0x6d,0x76,0x95,0x68,0x73,0x93,0x65,0x70,0x91,0x5a,0x64,0x88, 0x54,0x5e,0x81,0x5c,0x67,0x89,0x17,0x19,0x1e,0x18,0x1a,0x1f,0x19,0x1a,0x20,0x1a, 0x1b,0x21,0x1a,0x1b,0x21,0x19,0x1a,0x20,0x16,0x18,0x1d,0x14,0x16,0x1a,0x52,0x50, 0x72,0x53,0x50,0x76,0x53,0x51,0x76,0x56,0x50,0x76,0x5a,0x52,0x77,0x5c,0x52,0x77, 0x5c,0x52,0x77,0x5c,0x53,0x77,0x5e,0x53,0x75,0x5a,0x52,0x77,0x59,0x53,0x77,0x52, 0x50,0x78,0x52,0x52,0x7b,0x53,0x5d,0x85,0x56,0x62,0x88,0x77,0x82,0xa1,0x6b,0x67, 0x6d,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x07,0x08,0x0a,0x3b,0x31,0x3c,0x57,0x47,0x57, 0x43,0x35,0x40,0x40,0x33,0x3d,0x61,0x58,0x62,0xc5,0xc8,0xd5,0x8c,0x96,0xaf,0x5a, 0x65,0x8d,0x52,0x5c,0x83,0x4d,0x56,0x7b,0x4b,0x53,0x78,0x46,0x4e,0x71,0x3e,0x49, 0x6a,0x3d,0x45,0x64,0x38,0x42,0x62,0x39,0x43,0x63,0x3e,0x43,0x66,0x42,0x46,0x68, 0x47,0x48,0x6d,0x41,0x43,0x64,0x4c,0x4d,0x74,0x55,0x42,0x5c,0x2f,0x23,0x34,0x2d, 0x2c,0x45,0x25,0x25,0x31,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0b, 0x0d,0x0a,0x0b,0x0e,0x0a,0x0b,0x0d,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x08,0x09,0x0a, 0x08,0x08,0x0a,0x07,0x08,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06, 0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x04, 0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x11, 0x14,0x72,0x7e,0x9d,0x4a,0x54,0x78,0x44,0x4e,0x70,0x58,0x63,0x89,0x8d,0x97,0xb3, 0xb4,0xb1,0xb2,0x19,0x11,0x14,0x1d,0x13,0x18,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,0x98, 0x98,0x98,0xb2,0xb8,0xcb,0x94,0x9d,0xb7,0x99,0xa2,0xbb,0x95,0x9f,0xb9,0x95,0x9f, 0xb9,0x95,0x9f,0xb9,0xa9,0xb3,0xd2,0x19,0x19,0x19,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,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,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,0x09,0x09,0x09,0x1a,0x1a, 0x1a,0x3a,0x3a,0x3a,0x03,0x03,0x03,0x00,0x00,0x00,0x08,0x08,0x09,0x1f,0x21,0x23, 0x3a,0x3d,0x44,0x3e,0x42,0x4c,0x49,0x4e,0x5a,0x4c,0x50,0x5c,0x42,0x46,0x50,0x32, 0x36,0x40,0x22,0x22,0x2e,0x21,0x20,0x2b,0x1e,0x1e,0x28,0x1a,0x1a,0x22,0x1a,0x1b, 0x25,0x1f,0x22,0x2a,0x29,0x2c,0x36,0x3f,0x42,0x4d,0x4b,0x4f,0x5c,0x65,0x6a,0x76, 0x6e,0x72,0x7f,0x76,0x7b,0x87,0x74,0x78,0x83,0x62,0x66,0x74,0x4a,0x4f,0x61,0x46, 0x4c,0x5e,0x4b,0x50,0x5f,0x52,0x56,0x65,0x52,0x57,0x65,0x4f,0x54,0x62,0x45,0x4a, 0x59,0x45,0x4a,0x57,0x4c,0x51,0x5c,0x55,0x59,0x64,0x54,0x58,0x63,0x52,0x56,0x62, 0x59,0x5d,0x68,0x69,0x70,0x81,0x55,0x5e,0x81,0x5b,0x53,0x72,0x5e,0x5d,0x7c,0x5f, 0x60,0x81,0x5c,0x61,0x81,0x61,0x62,0x80,0x62,0x65,0x82,0x58,0x5e,0x7f,0x55,0x5b, 0x7e,0x5f,0x66,0x87,0x68,0x73,0x91,0x96,0x9d,0xb2,0xa3,0xa9,0xba,0x98,0x9f,0xb4, 0x7d,0x85,0xa1,0x77,0x80,0x9d,0x78,0x81,0x9c,0x78,0x7f,0x9b,0x75,0x7c,0x98,0x75, 0x7b,0x97,0x73,0x7b,0x97,0x70,0x77,0x95,0x6d,0x76,0x93,0x5b,0x64,0x85,0x4e,0x4d, 0x71,0x58,0x62,0x84,0x45,0x46,0x52,0x17,0x18,0x20,0x18,0x18,0x21,0x18,0x1a,0x22, 0x18,0x19,0x22,0x17,0x18,0x21,0x18,0x19,0x22,0x17,0x19,0x21,0x17,0x18,0x21,0x17, 0x18,0x21,0x17,0x18,0x21,0x18,0x18,0x21,0x16,0x16,0x1e,0x2c,0x2c,0x34,0x1c,0x1a, 0x23,0x23,0x20,0x2a,0x2a,0x24,0x2f,0x2e,0x28,0x33,0x35,0x2e,0x3a,0x3a,0x32,0x3f, 0x3a,0x32,0x3f,0x3c,0x33,0x42,0x41,0x39,0x48,0x44,0x3e,0x52,0x3f,0x3e,0x56,0x3a, 0x3b,0x50,0x32,0x32,0x43,0x2c,0x2a,0x39,0x1f,0x1e,0x27,0x45,0x3c,0x48,0x6b,0x63, 0x6f,0xc6,0xc8,0xd1,0x82,0x89,0xa4,0x70,0x79,0x96,0x85,0x8f,0xaa,0x7f,0x89,0xa5, 0x75,0x80,0x9e,0x6e,0x79,0x98,0x2c,0x2e,0x39,0x30,0x34,0x40,0x4a,0x50,0x60,0x61, 0x67,0x78,0x62,0x68,0x7b,0x57,0x5d,0x71,0x4a,0x4e,0x62,0x47,0x4a,0x5a,0x42,0x44, 0x52,0x3d,0x3d,0x4a,0x38,0x37,0x42,0x3b,0x3a,0x48,0x3a,0x3a,0x4a,0x3c,0x3c,0x4b, 0x3b,0x3b,0x4d,0x3b,0x39,0x4c,0x3d,0x39,0x4d,0x40,0x3b,0x4f,0x42,0x3c,0x51,0x42, 0x3e,0x53,0x46,0x3f,0x56,0x49,0x40,0x54,0x49,0x3f,0x51,0x4a,0x3f,0x51,0x4a,0x40, 0x52,0x4a,0x41,0x55,0x47,0x40,0x55,0x45,0x40,0x56,0x46,0x42,0x59,0x48,0x45,0x5c, 0x47,0x45,0x5e,0x48,0x4c,0x65,0x4e,0x54,0x6d,0x55,0x5a,0x72,0x58,0x5f,0x75,0x5c, 0x63,0x7b,0x64,0x6c,0x82,0x6e,0x74,0x8a,0x7c,0x82,0x94,0x89,0x8d,0x9a,0x92,0x95, 0x9d,0xa3,0xa5,0xaa,0x9d,0x9c,0xa8,0x73,0x77,0x89,0xb3,0xb1,0xb1,0xb5,0xb2,0xb3, 0xad,0xaa,0xab,0xae,0xa9,0xad,0x9e,0x99,0x9c,0x58,0x55,0x60,0x62,0x62,0x71,0x89, 0x90,0xa3,0x5d,0x67,0x86,0x64,0x6c,0x8b,0x79,0x82,0x9e,0x71,0x7b,0x98,0x67,0x71, 0x92,0x62,0x6d,0x8f,0x53,0x5d,0x80,0x57,0x62,0x85,0x53,0x5b,0x78,0x17,0x19,0x1e, 0x19,0x1b,0x20,0x1a,0x1c,0x21,0x1a,0x1b,0x21,0x19,0x1a,0x20,0x17,0x19,0x1e,0x15, 0x16,0x1a,0x52,0x4e,0x71,0x51,0x50,0x76,0x53,0x51,0x76,0x56,0x50,0x76,0x58,0x51, 0x76,0x5b,0x51,0x77,0x5c,0x52,0x77,0x5c,0x53,0x77,0x5c,0x53,0x77,0x5b,0x52,0x77, 0x59,0x52,0x77,0x52,0x50,0x78,0x52,0x52,0x7b,0x52,0x5c,0x85,0x55,0x62,0x88,0x79, 0x83,0xa2,0x75,0x74,0x79,0x0a,0x0a,0x0d,0x08,0x09,0x0a,0x08,0x09,0x0a,0x32,0x2b, 0x34,0x5a,0x4a,0x5c,0x42,0x34,0x3f,0x40,0x33,0x3d,0x5e,0x55,0x60,0xc9,0xcd,0xd7, 0x8e,0x98,0xb1,0x5c,0x69,0x8b,0x50,0x5c,0x82,0x4c,0x57,0x7c,0x49,0x52,0x76,0x44, 0x4f,0x70,0x3f,0x49,0x6b,0x3c,0x44,0x64,0x38,0x40,0x60,0x39,0x42,0x64,0x3e,0x43, 0x66,0x40,0x46,0x66,0x45,0x49,0x6d,0x41,0x44,0x66,0x4d,0x4d,0x74,0x4c,0x3b,0x52, 0x2c,0x22,0x32,0x2b,0x28,0x41,0x30,0x30,0x46,0x07,0x08,0x0a,0x0a,0x0a,0x0c,0x0a, 0x0a,0x0c,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a, 0x0c,0x09,0x0a,0x0b,0x08,0x09,0x0a,0x07,0x08,0x09,0x07,0x07,0x09,0x06,0x07,0x09, 0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x04, 0x04,0x05,0x04,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x03,0x03,0x7d,0x84,0x9c,0x5a,0x65,0x8b,0x48,0x52,0x76,0x53,0x5e,0x84,0x7f,0x8a, 0xa9,0xdb,0xda,0xda,0x1a,0x12,0x15,0x1d,0x15,0x18,0x07,0x05,0x07,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,0x0f,0x0f,0x0f,0xcb,0xce,0xd4,0x9f,0xa8,0xc0,0x95,0x9f,0xb9,0x96, 0xa0,0xb9,0x99,0xa2,0xbb,0x99,0xa2,0xbb,0x9a,0xa2,0xbe,0xa4,0xaf,0xcb,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,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,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,0x27, 0x27,0x27,0x1c,0x1b,0x1c,0x10,0x10,0x10,0x00,0x00,0x00,0x02,0x02,0x02,0x08,0x09, 0x0a,0x24,0x26,0x29,0x39,0x3c,0x44,0x3a,0x3e,0x4b,0x40,0x45,0x53,0x38,0x3b,0x47, 0x2b,0x2e,0x39,0x21,0x20,0x2c,0x24,0x20,0x29,0x23,0x1e,0x27,0x21,0x1e,0x26,0x19, 0x17,0x1f,0x15,0x16,0x1e,0x16,0x15,0x1c,0x16,0x16,0x1e,0x1f,0x22,0x2c,0x42,0x45, 0x4e,0x53,0x57,0x63,0x5d,0x62,0x71,0x66,0x6b,0x7a,0x66,0x6a,0x7a,0x6a,0x6e,0x7d, 0x61,0x66,0x75,0x50,0x56,0x66,0x4c,0x52,0x62,0x4a,0x50,0x62,0x48,0x4e,0x60,0x4c, 0x52,0x62,0x4b,0x51,0x5f,0x4c,0x52,0x5f,0x5a,0x5e,0x6b,0x6d,0x70,0x7a,0x76,0x79, 0x81,0x6d,0x70,0x7a,0x5d,0x61,0x6c,0x5c,0x62,0x74,0x62,0x6d,0x8d,0x5c,0x58,0x79, 0x5d,0x5b,0x7c,0x63,0x60,0x7b,0x61,0x60,0x7f,0x5f,0x61,0x80,0x60,0x60,0x7d,0x54, 0x58,0x78,0x61,0x65,0x85,0x94,0x95,0xa4,0x62,0x6b,0x8a,0x74,0x7c,0x99,0xa3,0xaa, 0xbb,0xa3,0xa9,0xbb,0x8b,0x93,0xac,0x78,0x81,0x9d,0x76,0x7f,0x9c,0x76,0x7e,0x9a, 0x75,0x7c,0x98,0x75,0x7d,0x98,0x74,0x7b,0x97,0x72,0x78,0x95,0x70,0x77,0x94,0x66, 0x6e,0x8e,0x4e,0x50,0x74,0x51,0x59,0x7d,0x5d,0x62,0x77,0x1a,0x1a,0x24,0x1a,0x1b, 0x25,0x1b,0x1d,0x26,0x1d,0x1d,0x28,0x1d,0x1d,0x27,0x1d,0x1e,0x27,0x1a,0x1c,0x26, 0x1a,0x1c,0x26,0x1a,0x1b,0x25,0x1b,0x1d,0x26,0x24,0x24,0x2d,0x2b,0x2b,0x34,0x3c, 0x3b,0x45,0x2e,0x2a,0x36,0x2d,0x27,0x32,0x2e,0x28,0x34,0x2f,0x2a,0x36,0x32,0x2c, 0x38,0x38,0x30,0x3e,0x3a,0x32,0x40,0x3e,0x36,0x45,0x42,0x3c,0x50,0x42,0x45,0x5c, 0x4a,0x50,0x67,0x41,0x46,0x5c,0x35,0x36,0x49,0x2c,0x2e,0x3e,0x2d,0x30,0x3b,0x52, 0x4b,0x58,0x5a,0x51,0x60,0xa0,0xa3,0xae,0x5b,0x63,0x80,0x58,0x5b,0x7a,0x6c,0x6c, 0x86,0x72,0x78,0x96,0x7d,0x85,0xa2,0x7e,0x88,0xa4,0x49,0x4d,0x59,0x3e,0x42,0x4f, 0x4a,0x4f,0x61,0x55,0x5a,0x6a,0x4d,0x50,0x60,0x3e,0x42,0x50,0x32,0x32,0x41,0x2e, 0x2e,0x3b,0x30,0x2f,0x3e,0x31,0x2e,0x3e,0x31,0x2e,0x3e,0x33,0x2f,0x41,0x36,0x35, 0x46,0x3a,0x36,0x4a,0x3e,0x39,0x4e,0x46,0x3e,0x53,0x48,0x41,0x55,0x4a,0x42,0x56, 0x4e,0x44,0x58,0x4e,0x46,0x5a,0x4f,0x45,0x59,0x4e,0x43,0x59,0x4c,0x42,0x56,0x4d, 0x42,0x56,0x50,0x46,0x5a,0x54,0x4a,0x61,0x52,0x4a,0x63,0x4e,0x49,0x62,0x4d,0x48, 0x62,0x4e,0x48,0x60,0x4c,0x46,0x5e,0x48,0x45,0x5e,0x48,0x46,0x5f,0x4a,0x4b,0x64, 0x4a,0x4e,0x67,0x4c,0x4f,0x6a,0x4e,0x4f,0x6b,0x50,0x58,0x72,0x65,0x6d,0x82,0x7b, 0x81,0x92,0x91,0x94,0x9e,0xac,0xac,0xb2,0xc6,0xc2,0xc6,0xc0,0xbd,0xc0,0xbf,0xbd, 0xbd,0xbb,0xb8,0xba,0xb4,0xb1,0xb2,0xac,0xa8,0xab,0x9d,0x98,0x9d,0x61,0x5e,0x66, 0x69,0x67,0x75,0x89,0x8f,0xa4,0x62,0x6c,0x8a,0x65,0x6d,0x8b,0x7d,0x85,0xa1,0x78, 0x81,0x9c,0x6a,0x73,0x93,0x62,0x6d,0x8e,0x5b,0x66,0x88,0x52,0x58,0x7d,0x59,0x64, 0x87,0x1e,0x20,0x29,0x18,0x1a,0x1f,0x19,0x1b,0x20,0x19,0x1b,0x20,0x19,0x1a,0x20, 0x18,0x1a,0x1e,0x16,0x16,0x1b,0x52,0x4f,0x72,0x51,0x50,0x76,0x53,0x51,0x76,0x55, 0x50,0x76,0x56,0x51,0x76,0x5a,0x51,0x76,0x5c,0x52,0x77,0x5b,0x52,0x77,0x5b,0x52, 0x77,0x5d,0x53,0x78,0x58,0x52,0x77,0x53,0x50,0x78,0x52,0x51,0x7b,0x52,0x5c,0x83, 0x55,0x61,0x88,0x77,0x82,0xa0,0x7f,0x7c,0x82,0x0a,0x0a,0x0d,0x08,0x09,0x0a,0x08, 0x09,0x0a,0x2b,0x23,0x2b,0x59,0x49,0x5a,0x40,0x33,0x3d,0x43,0x34,0x3f,0x57,0x4d, 0x57,0xcc,0xcf,0xda,0x8f,0x97,0xb2,0x5a,0x67,0x8b,0x50,0x5b,0x81,0x4b,0x56,0x7d, 0x49,0x52,0x78,0x45,0x4f,0x70,0x3f,0x49,0x6b,0x3c,0x45,0x65,0x38,0x41,0x62,0x39, 0x42,0x63,0x3d,0x43,0x66,0x41,0x42,0x66,0x44,0x4a,0x6f,0x41,0x46,0x66,0x4d,0x4d, 0x74,0x49,0x38,0x4e,0x2b,0x20,0x2f,0x2c,0x27,0x3e,0x2c,0x2b,0x45,0x3c,0x3c,0x4c, 0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a, 0x0b,0x0d,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x09,0x09,0x0a,0x08,0x09,0x0a,0x07,0x08, 0x0a,0x07,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x05,0x06, 0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03, 0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x5c,0x61,0x6c,0x6a,0x75,0x99,0x52,0x5d,0x82,0x58,0x63,0x89,0x7a, 0x83,0xa4,0xee,0xf0,0xf0,0x22,0x1a,0x1c,0x19,0x11,0x15,0x18,0x12,0x16,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,0x4b,0x4b,0x4b,0xc7,0xcc,0xda, 0x99,0xa2,0xbb,0x99,0xa1,0xba,0x9a,0xa3,0xbc,0x9a,0xa3,0xbc,0x99,0xa2,0xbb,0xa2, 0xab,0xc3,0x6d,0x71,0x71,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,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,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,0x27,0x27,0x27,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x02,0x02,0x06,0x06,0x06,0x15,0x16,0x1a,0x2f,0x32,0x3b,0x45,0x4a,0x56,0x49,0x4e, 0x5c,0x33,0x37,0x43,0x22,0x22,0x2e,0x25,0x20,0x2a,0x25,0x20,0x28,0x25,0x20,0x29, 0x23,0x1f,0x29,0x1f,0x1c,0x25,0x17,0x16,0x1d,0x12,0x14,0x1a,0x16,0x18,0x1d,0x18, 0x18,0x20,0x23,0x25,0x31,0x38,0x3d,0x4b,0x51,0x56,0x65,0x58,0x5e,0x6f,0x5b,0x62, 0x74,0x63,0x69,0x7a,0x64,0x6a,0x7a,0x64,0x6a,0x79,0x66,0x6c,0x79,0x5a,0x5f,0x6e, 0x4f,0x55,0x66,0x45,0x4b,0x5f,0x41,0x47,0x5b,0x47,0x4d,0x5f,0x58,0x5d,0x6a,0x67, 0x6b,0x77,0x70,0x73,0x7f,0x7c,0x7f,0x88,0x76,0x7a,0x82,0x72,0x76,0x82,0x82,0x8b, 0xa3,0x6f,0x72,0x8f,0x5b,0x5d,0x80,0x64,0x5e,0x7a,0x5c,0x57,0x71,0x60,0x5d,0x79, 0x56,0x55,0x72,0x52,0x49,0x69,0x78,0x7a,0x91,0x61,0x59,0x63,0x86,0x8c,0xa2,0x51, 0x5a,0x7f,0x90,0x98,0xae,0xa4,0xaa,0xbb,0x97,0x9d,0xb3,0x81,0x89,0xa3,0x76,0x7e, 0x9a,0x76,0x7f,0x9a,0x75,0x7c,0x99,0x73,0x7a,0x96,0x72,0x7b,0x97,0x72,0x7a,0x97, 0x70,0x78,0x95,0x6a,0x73,0x92,0x50,0x59,0x7d,0x4f,0x52,0x77,0x63,0x6c,0x8a,0x23, 0x25,0x2f,0x20,0x23,0x2e,0x25,0x28,0x35,0x27,0x27,0x35,0x29,0x27,0x34,0x26,0x25, 0x32,0x22,0x22,0x2e,0x1f,0x20,0x2b,0x1e,0x1f,0x2a,0x21,0x22,0x2d,0x3d,0x3e,0x46, 0x3b,0x3b,0x45,0x43,0x40,0x4c,0x3b,0x34,0x42,0x33,0x2d,0x3a,0x31,0x2a,0x37,0x30, 0x2a,0x36,0x31,0x2a,0x36,0x34,0x2e,0x3a,0x3a,0x32,0x40,0x3b,0x37,0x49,0x3e,0x43, 0x59,0x43,0x4a,0x5e,0x3c,0x42,0x56,0x3c,0x39,0x4c,0x3a,0x35,0x45,0x2b,0x2a,0x3a, 0x34,0x38,0x45,0x4b,0x47,0x58,0x46,0x3e,0x50,0x8e,0x8b,0x97,0x40,0x42,0x58,0x3b, 0x3c,0x4e,0x45,0x47,0x54,0x51,0x51,0x63,0x6f,0x6e,0x8c,0x6e,0x77,0x96,0x4f,0x54, 0x61,0x4b,0x4f,0x5e,0x4c,0x50,0x5e,0x46,0x4a,0x59,0x3a,0x3c,0x4c,0x30,0x30,0x3f, 0x31,0x2c,0x3a,0x36,0x2e,0x3a,0x3a,0x32,0x41,0x3e,0x36,0x45,0x41,0x3a,0x4a,0x42, 0x3c,0x4f,0x42,0x3f,0x55,0x4a,0x43,0x5a,0x4e,0x44,0x57,0x48,0x3d,0x4e,0x48,0x3e, 0x50,0x4c,0x42,0x54,0x4b,0x3f,0x52,0x42,0x39,0x48,0x46,0x3a,0x4b,0x47,0x3b,0x4e, 0x40,0x36,0x46,0x3b,0x32,0x41,0x48,0x3e,0x4f,0x52,0x47,0x5b,0x5a,0x4e,0x63,0x59, 0x4f,0x66,0x58,0x4e,0x66,0x56,0x4c,0x65,0x54,0x4a,0x62,0x4d,0x4a,0x62,0x4a,0x48, 0x62,0x4c,0x49,0x63,0x4d,0x4b,0x66,0x4d,0x4a,0x66,0x53,0x4e,0x67,0x56,0x4d,0x64, 0x4a,0x48,0x62,0x51,0x59,0x71,0x76,0x7b,0x8d,0x93,0x97,0xa2,0xb4,0xb2,0xba,0xbe, 0xbc,0xbf,0xc3,0xc1,0xc2,0xbc,0xb9,0xba,0xb6,0xb2,0xb4,0xa5,0xa1,0xa4,0x88,0x84, 0x8d,0x5d,0x5a,0x64,0x6a,0x68,0x75,0x8c,0x92,0xa6,0x63,0x6d,0x8b,0x63,0x6c,0x8c, 0x7d,0x86,0xa0,0x78,0x80,0x9c,0x67,0x71,0x90,0x62,0x6c,0x8c,0x5f,0x6b,0x8b,0x52, 0x54,0x78,0x52,0x5c,0x80,0x5a,0x65,0x84,0x18,0x1a,0x1e,0x19,0x1b,0x20,0x1a,0x1b, 0x21,0x19,0x1b,0x20,0x18,0x1a,0x1f,0x16,0x17,0x1b,0x52,0x4e,0x72,0x52,0x50,0x76, 0x51,0x50,0x76,0x54,0x50,0x76,0x56,0x50,0x76,0x5a,0x51,0x76,0x5c,0x52,0x77,0x5b, 0x52,0x77,0x5b,0x52,0x77,0x5d,0x53,0x78,0x59,0x52,0x77,0x54,0x51,0x77,0x52,0x51, 0x7b,0x52,0x5b,0x83,0x55,0x61,0x88,0x78,0x84,0xa1,0x88,0x84,0x8a,0x09,0x0a,0x0c, 0x09,0x0a,0x0b,0x08,0x09,0x0a,0x22,0x1d,0x23,0x60,0x4f,0x62,0x41,0x34,0x40,0x41, 0x34,0x3f,0x57,0x4e,0x59,0xcb,0xce,0xd9,0x91,0x9a,0xb4,0x5c,0x69,0x8e,0x52,0x5c, 0x82,0x4d,0x57,0x7d,0x49,0x53,0x79,0x45,0x4e,0x70,0x3f,0x49,0x6b,0x3c,0x45,0x66, 0x39,0x43,0x63,0x3a,0x42,0x64,0x3d,0x43,0x64,0x40,0x45,0x69,0x45,0x4a,0x6e,0x41, 0x48,0x6a,0x4d,0x51,0x78,0x46,0x36,0x4c,0x2b,0x1f,0x2e,0x2c,0x27,0x3d,0x32,0x2f, 0x4b,0x54,0x5a,0x7f,0x0d,0x0d,0x10,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e, 0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0d,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x08, 0x09,0x0a,0x07,0x08,0x0a,0x07,0x07,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06, 0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x04,0x05, 0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x24,0x25,0x28,0x82,0x8c,0xab,0x5b,0x68,0x8e,0x58,0x65,0x89, 0x75,0x80,0xa1,0xe9,0xec,0xf0,0x48,0x43,0x45,0x15,0x0d,0x10,0x22,0x18,0x1d,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,0xbc,0xbc,0xbc,0xac,0xb3,0xc8,0x99,0xa1,0xbb,0x9d,0xa7,0xbf,0x9d,0xa7,0xbf, 0x9d,0xa5,0xbe,0xa0,0xa8,0xbf,0xb1,0xba,0xd6,0x17,0x17,0x17,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,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,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,0x15,0x15,0x15,0x20,0x20,0x20,0x1f,0x1e,0x1f, 0x2a,0x2a,0x2a,0x21,0x20,0x21,0x06,0x06,0x08,0x16,0x17,0x1c,0x34,0x37,0x42,0x4b, 0x50,0x5d,0x50,0x54,0x62,0x35,0x39,0x44,0x25,0x24,0x31,0x26,0x22,0x2c,0x26,0x22, 0x2a,0x27,0x25,0x31,0x26,0x26,0x34,0x24,0x22,0x2e,0x1e,0x1b,0x24,0x1a,0x16,0x1e, 0x19,0x16,0x1c,0x1b,0x19,0x21,0x21,0x1e,0x29,0x28,0x27,0x36,0x33,0x33,0x46,0x41, 0x47,0x5c,0x56,0x5d,0x70,0x5b,0x62,0x74,0x5a,0x60,0x73,0x5a,0x60,0x72,0x5f,0x65, 0x74,0x6a,0x6e,0x7b,0x64,0x69,0x76,0x53,0x59,0x6a,0x46,0x4d,0x62,0x4a,0x4f,0x62, 0x4e,0x54,0x66,0x52,0x58,0x68,0x5c,0x62,0x6f,0x62,0x67,0x76,0x67,0x6c,0x79,0x7c, 0x80,0x89,0x9a,0xa1,0xb3,0x87,0x89,0xa1,0x70,0x7a,0x97,0x5c,0x60,0x82,0x61,0x5b, 0x75,0x51,0x4f,0x66,0x4d,0x4c,0x65,0x51,0x48,0x63,0x83,0x81,0x96,0x4c,0x42,0x4d, 0x6b,0x6c,0x7d,0x59,0x62,0x85,0x63,0x6d,0x8e,0xa3,0xa8,0xbb,0xa3,0xa8,0xbc,0x88, 0x90,0xa8,0x7a,0x83,0x9e,0x76,0x7f,0x9b,0x76,0x7e,0x9a,0x76,0x7d,0x99,0x72,0x7b, 0x97,0x72,0x7b,0x97,0x70,0x79,0x95,0x6b,0x75,0x93,0x5b,0x66,0x86,0x57,0x54,0x76, 0x5a,0x65,0x86,0x4c,0x51,0x5e,0x2d,0x31,0x3d,0x31,0x36,0x46,0x32,0x33,0x46,0x32, 0x30,0x42,0x31,0x2e,0x3e,0x2c,0x2b,0x3a,0x27,0x26,0x35,0x22,0x23,0x30,0x21,0x22, 0x2e,0x20,0x22,0x2d,0x22,0x22,0x2e,0x30,0x2c,0x3a,0x3d,0x36,0x44,0x3a,0x32,0x40, 0x32,0x2b,0x38,0x30,0x2a,0x37,0x32,0x2c,0x39,0x39,0x32,0x41,0x3f,0x39,0x4a,0x3c, 0x3b,0x50,0x40,0x40,0x58,0x3e,0x3d,0x53,0x3d,0x36,0x47,0x3a,0x30,0x3d,0x3c,0x32, 0x3e,0x3a,0x31,0x3d,0x3b,0x30,0x3c,0x49,0x3d,0x4d,0x3a,0x2f,0x3c,0x6a,0x69,0x70, 0x39,0x3b,0x4f,0x39,0x3a,0x4a,0x3e,0x3d,0x49,0x38,0x38,0x45,0x3b,0x39,0x46,0x66, 0x5f,0x78,0x36,0x3b,0x4d,0x3f,0x42,0x4f,0x3e,0x40,0x4e,0x33,0x36,0x47,0x34,0x32, 0x42,0x3a,0x31,0x3e,0x3c,0x32,0x40,0x3f,0x36,0x44,0x45,0x3b,0x4d,0x4a,0x40,0x52, 0x4e,0x43,0x59,0x51,0x47,0x5b,0x53,0x49,0x5e,0x52,0x46,0x5a,0x42,0x37,0x46,0x38, 0x2e,0x3a,0x39,0x2e,0x3d,0x45,0x3a,0x4a,0x45,0x3a,0x4a,0x40,0x36,0x46,0x3a,0x32, 0x3f,0x37,0x2f,0x3b,0x34,0x2c,0x38,0x30,0x28,0x33,0x32,0x2b,0x37,0x3c,0x32,0x41, 0x51,0x46,0x59,0x58,0x4b,0x60,0x59,0x4e,0x63,0x5a,0x4e,0x66,0x5a,0x50,0x67,0x59, 0x4f,0x67,0x56,0x4c,0x64,0x55,0x4b,0x62,0x54,0x4c,0x64,0x4e,0x4b,0x67,0x50,0x4e, 0x6a,0x56,0x4f,0x6a,0x4e,0x4d,0x6a,0x4e,0x50,0x6c,0x56,0x5e,0x76,0x6f,0x75,0x89, 0x8d,0x8f,0xa1,0x96,0x97,0xa4,0xa3,0xa3,0xac,0x9e,0x9d,0xa5,0x97,0x96,0x9f,0x87, 0x86,0x90,0x6f,0x6e,0x7a,0x5e,0x5b,0x67,0x70,0x6f,0x7d,0x98,0x9f,0xaf,0x70,0x79, 0x94,0x5f,0x68,0x87,0x71,0x7a,0x96,0x6e,0x78,0x94,0x63,0x6c,0x8c,0x60,0x6b,0x8a, 0x61,0x6b,0x8b,0x5b,0x65,0x87,0x52,0x51,0x76,0x57,0x62,0x85,0x31,0x36,0x45,0x18, 0x1a,0x1f,0x19,0x1a,0x20,0x1a,0x1b,0x21,0x18,0x1a,0x1e,0x16,0x17,0x1c,0x50,0x4d, 0x6e,0x51,0x50,0x76,0x53,0x50,0x75,0x53,0x50,0x75,0x56,0x4f,0x76,0x58,0x51,0x76, 0x5a,0x51,0x77,0x5c,0x53,0x77,0x5b,0x52,0x77,0x5d,0x53,0x77,0x5a,0x52,0x77,0x55, 0x50,0x77,0x51,0x50,0x79,0x52,0x5a,0x82,0x54,0x61,0x87,0x7b,0x85,0xa2,0x92,0x8f, 0x94,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x08,0x09,0x0a,0x1a,0x15,0x1b,0x65,0x52,0x67, 0x42,0x35,0x40,0x41,0x34,0x3e,0x57,0x4d,0x58,0xcb,0xce,0xd8,0x90,0x99,0xb3,0x5d, 0x69,0x8f,0x4f,0x5a,0x82,0x4d,0x57,0x7e,0x48,0x53,0x79,0x45,0x4d,0x70,0x41,0x49, 0x6d,0x3d,0x46,0x65,0x3a,0x41,0x60,0x39,0x42,0x61,0x3d,0x42,0x64,0x40,0x46,0x67, 0x45,0x4c,0x6f,0x41,0x47,0x6b,0x4c,0x53,0x76,0x40,0x39,0x56,0x28,0x1e,0x2d,0x30, 0x27,0x3c,0x3b,0x39,0x59,0x52,0x54,0x7c,0x4d,0x4e,0x62,0x09,0x0a,0x0b,0x0a,0x0b, 0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0a,0x0b,0x0d,0x0a,0x0a,0x0c, 0x09,0x0a,0x0b,0x08,0x09,0x0a,0x08,0x09,0x0a,0x07,0x07,0x09,0x06,0x07,0x09,0x06, 0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x06,0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x04, 0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x06,0x9a,0xa1,0xb4,0x71,0x7c,0x9f,0x5e,0x6b, 0x91,0x6c,0x78,0x9a,0xcd,0xd0,0xdd,0x96,0x92,0x94,0x17,0x0f,0x11,0x20,0x16,0x1a, 0x02,0x02,0x02,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,0x30,0x30,0x30,0xe3,0xe5,0xec,0xa1,0xa9,0xc0,0x9d,0xa7, 0xbf,0xa5,0xac,0xc3,0xa3,0xab,0xc2,0xa3,0xab,0xc1,0xa5,0xae,0xc4,0x9d,0xa5,0xb6, 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,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, 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,0x19,0x19, 0x19,0x16,0x15,0x16,0x0b,0x0a,0x0b,0x0d,0x0d,0x0e,0x0a,0x0a,0x0d,0x22,0x25,0x2d, 0x40,0x45,0x51,0x40,0x45,0x53,0x3b,0x40,0x4d,0x2e,0x32,0x3f,0x28,0x2a,0x38,0x29, 0x25,0x30,0x28,0x22,0x2c,0x2a,0x25,0x2e,0x2d,0x27,0x32,0x29,0x26,0x32,0x23,0x24, 0x31,0x1c,0x1c,0x26,0x1a,0x16,0x1e,0x1a,0x17,0x1e,0x20,0x1c,0x24,0x2c,0x26,0x31, 0x37,0x30,0x3e,0x3d,0x38,0x4a,0x3f,0x42,0x57,0x4d,0x53,0x68,0x56,0x5b,0x70,0x57, 0x5e,0x70,0x59,0x5f,0x71,0x5f,0x65,0x74,0x5d,0x62,0x6f,0x5f,0x63,0x71,0x56,0x5c, 0x6c,0x48,0x4f,0x63,0x46,0x4c,0x61,0x51,0x56,0x66,0x61,0x66,0x72,0x69,0x6e,0x7b, 0x59,0x5f,0x72,0x50,0x56,0x69,0x85,0x8d,0xa2,0x91,0x92,0xa8,0x96,0x9c,0xb0,0x86, 0x8e,0xa7,0x5d,0x60,0x82,0x5b,0x55,0x6e,0x4a,0x46,0x60,0x56,0x46,0x5e,0x8c,0x88, 0x99,0x54,0x4a,0x55,0x50,0x4a,0x57,0x76,0x7c,0x98,0x55,0x5e,0x83,0x95,0x9c,0xb0, 0xaa,0xb1,0xc1,0x9a,0xa0,0xb5,0x81,0x89,0xa3,0x77,0x80,0x9d,0x76,0x7f,0x9b,0x76, 0x7d,0x99,0x72,0x7c,0x98,0x74,0x7d,0x99,0x71,0x7a,0x96,0x6e,0x78,0x95,0x6b,0x75, 0x93,0x63,0x65,0x84,0x66,0x70,0x8f,0x6e,0x74,0x87,0x3d,0x41,0x4d,0x3b,0x40,0x4e, 0x37,0x3d,0x4e,0x35,0x38,0x4a,0x33,0x32,0x46,0x33,0x32,0x45,0x30,0x2e,0x40,0x28, 0x28,0x36,0x25,0x27,0x34,0x25,0x26,0x34,0x26,0x26,0x34,0x33,0x2f,0x3e,0x40,0x38, 0x47,0x3c,0x35,0x44,0x34,0x2e,0x3b,0x32,0x2d,0x3b,0x3b,0x34,0x44,0x42,0x3b,0x4e, 0x40,0x3f,0x55,0x45,0x43,0x5c,0x44,0x41,0x56,0x3a,0x33,0x42,0x35,0x2e,0x3a,0x32, 0x2c,0x38,0x2f,0x2a,0x39,0x32,0x2d,0x3a,0x38,0x30,0x3d,0x4b,0x3d,0x4c,0x3b,0x31, 0x3e,0x75,0x72,0x78,0x42,0x45,0x5c,0x41,0x45,0x58,0x46,0x49,0x55,0x3a,0x3a,0x45, 0x31,0x31,0x3b,0x3a,0x39,0x47,0x40,0x36,0x45,0x2f,0x33,0x42,0x32,0x35,0x46,0x3c, 0x35,0x45,0x41,0x37,0x46,0x3e,0x33,0x41,0x42,0x3a,0x4a,0x46,0x3e,0x51,0x4e,0x46, 0x5c,0x52,0x4b,0x61,0x56,0x4b,0x60,0x59,0x4b,0x5f,0x56,0x48,0x5d,0x4e,0x42,0x52, 0x40,0x33,0x42,0x38,0x2e,0x39,0x3b,0x30,0x3e,0x45,0x39,0x48,0x46,0x3a,0x4a,0x3e, 0x32,0x41,0x37,0x2e,0x3a,0x32,0x29,0x32,0x2f,0x26,0x31,0x2a,0x22,0x2c,0x29,0x20, 0x29,0x33,0x29,0x34,0x4c,0x3f,0x50,0x52,0x45,0x59,0x52,0x46,0x59,0x53,0x47,0x5b, 0x55,0x49,0x5e,0x56,0x49,0x5e,0x53,0x46,0x5a,0x4e,0x42,0x55,0x4d,0x40,0x52,0x56, 0x4b,0x61,0x56,0x4e,0x67,0x56,0x4f,0x68,0x50,0x4e,0x6a,0x51,0x57,0x74,0x54,0x5d, 0x76,0x56,0x5e,0x76,0x70,0x74,0x8c,0x77,0x7b,0x8e,0x77,0x7a,0x8b,0x6c,0x6f,0x81, 0x60,0x63,0x76,0x5a,0x5c,0x6e,0x5f,0x5f,0x6e,0x6b,0x68,0x77,0x65,0x61,0x70,0xa1, 0xa4,0xb2,0x78,0x82,0x9a,0x57,0x61,0x80,0x60,0x69,0x87,0x63,0x6d,0x8a,0x61,0x6b, 0x89,0x5f,0x6a,0x88,0x62,0x6c,0x8c,0x60,0x6b,0x8c,0x51,0x5b,0x81,0x52,0x57,0x7c, 0x5d,0x67,0x89,0x19,0x1c,0x21,0x18,0x1a,0x1f,0x18,0x1a,0x1f,0x17,0x1a,0x1e,0x16, 0x17,0x1c,0x50,0x4e,0x6e,0x52,0x51,0x77,0x51,0x50,0x77,0x52,0x50,0x76,0x55,0x50, 0x76,0x59,0x51,0x76,0x5a,0x51,0x77,0x5a,0x52,0x77,0x5c,0x53,0x77,0x5c,0x52,0x78, 0x5b,0x52,0x78,0x54,0x50,0x77,0x51,0x50,0x79,0x52,0x57,0x80,0x55,0x5f,0x87,0x77, 0x83,0xa0,0x96,0x93,0x9a,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x0e,0x0d, 0x0f,0x60,0x4f,0x62,0x42,0x34,0x40,0x42,0x34,0x3f,0x58,0x4e,0x59,0xc7,0xcc,0xd7, 0x8f,0x97,0xb2,0x61,0x6b,0x90,0x53,0x5d,0x83,0x4e,0x58,0x7f,0x4a,0x54,0x7a,0x46, 0x4f,0x73,0x41,0x49,0x6a,0x3c,0x46,0x65,0x3a,0x41,0x61,0x39,0x41,0x61,0x3b,0x41, 0x61,0x3f,0x46,0x67,0x43,0x4a,0x6e,0x40,0x48,0x6a,0x4c,0x53,0x76,0x3e,0x3d,0x5d, 0x28,0x1e,0x2d,0x31,0x27,0x3a,0x42,0x40,0x62,0x52,0x4f,0x78,0x5d,0x66,0x8b,0x16, 0x15,0x1a,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c, 0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x09,0x09,0x0a,0x08,0x09,0x0a, 0x07,0x07,0x09,0x06,0x07,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x05, 0x06,0x06,0x05,0x06,0x06,0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x03, 0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x85,0x8f,0x8d,0x97,0xb3,0x72, 0x7d,0x9f,0x73,0x7e,0xa0,0xaa,0xb2,0xc7,0xcc,0xcb,0xcc,0x18,0x10,0x13,0x1b,0x12, 0x15,0x1f,0x18,0x1c,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,0x84,0x84,0x84,0xc3, 0xc8,0xd7,0xa3,0xab,0xc2,0xa7,0xad,0xc4,0xa7,0xaf,0xc4,0xa9,0xb2,0xc6,0xa8,0xb0, 0xc6,0xb4,0xbc,0xd5,0x34,0x34,0x34,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,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,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,0x32,0x32,0x32,0x05,0x05,0x06,0x0b,0x0c, 0x10,0x26,0x2a,0x32,0x3e,0x42,0x4e,0x35,0x39,0x46,0x2a,0x2e,0x3a,0x30,0x34,0x40, 0x37,0x3b,0x48,0x27,0x26,0x35,0x2a,0x25,0x2f,0x2d,0x27,0x32,0x2e,0x28,0x33,0x2a, 0x2a,0x39,0x33,0x37,0x42,0x1e,0x22,0x2b,0x17,0x15,0x1b,0x17,0x14,0x1a,0x1a,0x17, 0x1e,0x2a,0x24,0x2e,0x36,0x2f,0x3d,0x3e,0x36,0x46,0x43,0x3b,0x4d,0x42,0x3e,0x52, 0x42,0x42,0x59,0x46,0x4d,0x63,0x50,0x58,0x6d,0x5b,0x61,0x72,0x5e,0x63,0x72,0x5d, 0x61,0x6e,0x60,0x64,0x71,0x56,0x5c,0x6d,0x53,0x5a,0x6b,0x4e,0x54,0x67,0x5c,0x62, 0x72,0x7f,0x83,0x8e,0x85,0x88,0x90,0x6b,0x6e,0x7b,0x69,0x6f,0x8a,0x5c,0x5a,0x7e, 0x82,0x87,0xa1,0xa8,0xaf,0xbf,0x7e,0x87,0xa2,0x61,0x5d,0x78,0x48,0x43,0x5c,0x55, 0x42,0x58,0x96,0x91,0x9e,0x5e,0x55,0x60,0x30,0x27,0x31,0x75,0x79,0x8f,0x67,0x70, 0x8f,0x78,0x82,0x9e,0xad,0xb3,0xc3,0xa6,0xab,0xbe,0x8b,0x92,0xaa,0x77,0x81,0x9d, 0x76,0x80,0x9d,0x75,0x7f,0x9b,0x7a,0x84,0x9e,0x7d,0x86,0x9f,0x7f,0x88,0xa2,0x7e, 0x87,0xa1,0x80,0x8a,0xa3,0x78,0x81,0x9d,0x81,0x81,0x9b,0x8a,0x92,0xa9,0x64,0x68, 0x75,0x57,0x5c,0x6a,0x4b,0x50,0x5e,0x45,0x4a,0x59,0x36,0x3b,0x4e,0x36,0x35,0x47, 0x36,0x35,0x47,0x2e,0x2d,0x3e,0x29,0x2a,0x39,0x29,0x29,0x38,0x2a,0x29,0x38,0x33, 0x2f,0x3e,0x3e,0x36,0x46,0x3e,0x36,0x46,0x3a,0x33,0x43,0x3e,0x36,0x47,0x41,0x3d, 0x51,0x42,0x42,0x5a,0x47,0x44,0x5b,0x4a,0x42,0x56,0x37,0x33,0x44,0x2a,0x27,0x34, 0x2e,0x2a,0x39,0x2f,0x2b,0x3a,0x30,0x2c,0x3b,0x31,0x2e,0x3c,0x34,0x2e,0x3e,0x56, 0x48,0x5a,0x53,0x43,0x54,0x94,0x8f,0x98,0x4a,0x50,0x6c,0x50,0x58,0x71,0x60,0x66, 0x78,0x52,0x54,0x64,0x40,0x40,0x4e,0x3a,0x39,0x47,0x21,0x19,0x1f,0x2e,0x2a,0x38, 0x33,0x30,0x40,0x45,0x39,0x47,0x44,0x38,0x47,0x46,0x3d,0x4c,0x49,0x40,0x52,0x4f, 0x46,0x5a,0x54,0x4b,0x60,0x56,0x4b,0x61,0x56,0x49,0x5b,0x52,0x45,0x58,0x4f,0x42, 0x54,0x4a,0x3c,0x4e,0x41,0x35,0x42,0x36,0x2d,0x38,0x38,0x2d,0x38,0x39,0x2d,0x39, 0x36,0x2a,0x35,0x39,0x2d,0x38,0x39,0x2c,0x36,0x33,0x27,0x2f,0x27,0x1d,0x23,0x26, 0x1c,0x22,0x26,0x1d,0x22,0x2e,0x22,0x2a,0x46,0x38,0x46,0x53,0x45,0x56,0x55,0x46, 0x59,0x54,0x47,0x5b,0x52,0x45,0x58,0x4e,0x42,0x55,0x4c,0x41,0x53,0x48,0x3d,0x4e, 0x38,0x2e,0x3b,0x40,0x34,0x42,0x4e,0x41,0x52,0x56,0x48,0x5c,0x58,0x4c,0x62,0x4e, 0x4b,0x67,0x4e,0x50,0x6b,0x4b,0x4e,0x6a,0x58,0x58,0x74,0x55,0x59,0x72,0x53,0x57, 0x6f,0x50,0x54,0x6c,0x4b,0x47,0x5f,0x48,0x44,0x5b,0x59,0x59,0x6c,0x64,0x61,0x71, 0x62,0x5d,0x6b,0x82,0x80,0x8d,0x8d,0x94,0xa7,0x5b,0x65,0x83,0x58,0x63,0x82,0x61, 0x6b,0x88,0x62,0x6c,0x89,0x5f,0x68,0x88,0x61,0x6b,0x8c,0x61,0x6d,0x8d,0x5e,0x68, 0x8a,0x52,0x53,0x77,0x56,0x61,0x84,0x34,0x3a,0x4a,0x18,0x1a,0x1f,0x19,0x1a,0x20, 0x17,0x19,0x1e,0x16,0x18,0x1c,0x50,0x4f,0x6e,0x51,0x51,0x76,0x51,0x50,0x76,0x52, 0x50,0x75,0x55,0x50,0x77,0x58,0x52,0x76,0x5b,0x51,0x77,0x5c,0x52,0x77,0x5b,0x52, 0x77,0x5d,0x53,0x78,0x5b,0x52,0x78,0x56,0x50,0x77,0x51,0x50,0x79,0x51,0x57,0x7f, 0x54,0x60,0x87,0x72,0x7d,0x9d,0xa1,0x9d,0xa3,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x09, 0x0a,0x0b,0x08,0x09,0x0a,0x61,0x50,0x63,0x45,0x37,0x43,0x40,0x33,0x3d,0x52,0x48, 0x52,0xc6,0xca,0xd6,0x94,0x9c,0xb5,0x5e,0x69,0x8e,0x50,0x5b,0x82,0x4e,0x59,0x7f, 0x48,0x54,0x78,0x45,0x4f,0x73,0x42,0x4b,0x6b,0x3c,0x45,0x66,0x39,0x41,0x61,0x3a, 0x40,0x61,0x3a,0x41,0x63,0x3f,0x46,0x66,0x43,0x4c,0x6f,0x42,0x49,0x6c,0x4b,0x53, 0x78,0x47,0x45,0x68,0x2b,0x20,0x2f,0x2e,0x23,0x33,0x51,0x4d,0x71,0x55,0x51,0x77, 0x53,0x57,0x7f,0x55,0x57,0x6c,0x0a,0x0b,0x0e,0x0c,0x0e,0x10,0x0c,0x0d,0x0f,0x0b, 0x0c,0x0e,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x09,0x0a, 0x0b,0x08,0x09,0x0a,0x07,0x08,0x0a,0x06,0x07,0x08,0x06,0x07,0x08,0x06,0x06,0x08, 0x06,0x06,0x07,0x05,0x06,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x04, 0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x40,0x40,0x43,0xb1,0xb8,0xca, 0x89,0x93,0xb0,0x79,0x84,0xa6,0x9d,0xa5,0xbd,0xed,0xec,0xee,0x20,0x18,0x1b,0x19, 0x11,0x13,0x22,0x18,0x1d,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, 0x03,0x03,0x03,0xda,0xdb,0xdd,0xb0,0xb8,0xca,0xa9,0xb1,0xc6,0xab,0xb2,0xc8,0xac, 0xb3,0xc8,0xac,0xb4,0xc8,0xac,0xb4,0xc9,0xcd,0xd5,0xed,0x04,0x04,0x04,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,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,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,0x1d,0x1d,0x1d,0x17, 0x16,0x17,0x0a,0x0a,0x0d,0x1a,0x1d,0x25,0x28,0x2b,0x36,0x25,0x28,0x32,0x20,0x23, 0x2e,0x35,0x39,0x43,0x46,0x49,0x54,0x2d,0x31,0x3e,0x2a,0x2a,0x3a,0x2b,0x2e,0x3e, 0x2e,0x2a,0x39,0x31,0x36,0x43,0x32,0x35,0x3e,0x18,0x18,0x21,0x14,0x12,0x16,0x12, 0x10,0x14,0x17,0x14,0x19,0x27,0x22,0x2b,0x36,0x2e,0x3c,0x3d,0x35,0x45,0x43,0x3a, 0x4a,0x47,0x3e,0x51,0x49,0x41,0x54,0x46,0x41,0x56,0x43,0x42,0x5a,0x47,0x4e,0x66, 0x59,0x5f,0x70,0x57,0x5c,0x6a,0x5a,0x5e,0x6a,0x62,0x66,0x73,0x62,0x67,0x75,0x50, 0x56,0x69,0x55,0x5b,0x6e,0x6b,0x71,0x80,0x89,0x8c,0x95,0x8f,0x91,0x99,0x8d,0x8f, 0xa0,0x58,0x5e,0x80,0x5f,0x5b,0x7e,0x60,0x69,0x88,0x66,0x6f,0x8a,0x5b,0x5c,0x7a, 0x52,0x4d,0x68,0x50,0x3e,0x52,0x93,0x8e,0x9b,0x66,0x5f,0x69,0x28,0x21,0x2b,0x49, 0x47,0x56,0x7d,0x85,0x9e,0x60,0x6a,0x8c,0xa3,0xa9,0xbb,0xb0,0xb4,0xc4,0x9a,0xa2, 0xb7,0x7e,0x88,0xa2,0x78,0x82,0x9d,0x7d,0x85,0xa0,0x86,0x8f,0xa7,0x8a,0x93,0xaa, 0x8a,0x93,0xab,0x8f,0x97,0xaf,0x8b,0x94,0xac,0x7e,0x87,0xa2,0x84,0x83,0x9c,0x8c, 0x95,0xad,0x85,0x8a,0x98,0x6c,0x71,0x7e,0x5f,0x64,0x72,0x4a,0x50,0x60,0x3a,0x3e, 0x52,0x39,0x37,0x4c,0x36,0x35,0x47,0x2e,0x2e,0x3f,0x2b,0x2c,0x3c,0x2e,0x2e,0x3e, 0x32,0x30,0x40,0x36,0x32,0x42,0x3d,0x36,0x46,0x41,0x39,0x4a,0x43,0x3c,0x4e,0x46, 0x3e,0x52,0x42,0x40,0x57,0x45,0x43,0x5b,0x4e,0x44,0x58,0x42,0x3a,0x4b,0x2c,0x29, 0x36,0x2d,0x2a,0x37,0x2f,0x2c,0x3b,0x30,0x2d,0x3b,0x31,0x2e,0x3d,0x32,0x2e,0x3e, 0x32,0x2f,0x3e,0x53,0x48,0x5d,0x53,0x45,0x59,0x94,0x8f,0x9a,0x4a,0x53,0x71,0x53, 0x5b,0x77,0x6c,0x74,0x89,0x67,0x6d,0x84,0x63,0x65,0x7c,0x54,0x53,0x68,0x2a,0x21, 0x2a,0x31,0x2a,0x35,0x3e,0x35,0x43,0x43,0x37,0x46,0x44,0x3a,0x4a,0x49,0x3e,0x50, 0x4d,0x41,0x54,0x52,0x44,0x59,0x54,0x47,0x5a,0x52,0x46,0x5a,0x50,0x42,0x56,0x4a, 0x3e,0x4e,0x46,0x3a,0x4a,0x41,0x34,0x43,0x38,0x2b,0x38,0x32,0x27,0x31,0x2f,0x23, 0x2d,0x2e,0x22,0x2d,0x3a,0x2d,0x38,0x4e,0x3e,0x4e,0x48,0x3a,0x49,0x4a,0x3b,0x4a, 0x4e,0x3e,0x4e,0x53,0x43,0x55,0x54,0x44,0x56,0x4e,0x3e,0x4e,0x56,0x46,0x57,0x5e, 0x50,0x65,0x58,0x4e,0x66,0x52,0x4c,0x64,0x54,0x49,0x5e,0x4e,0x42,0x53,0x49,0x3c, 0x4e,0x3c,0x32,0x40,0x30,0x28,0x32,0x2d,0x24,0x2e,0x33,0x29,0x33,0x41,0x34,0x42, 0x51,0x44,0x56,0x57,0x4e,0x66,0x4d,0x4b,0x66,0x4c,0x4a,0x64,0x5a,0x55,0x71,0x53, 0x4b,0x62,0x56,0x49,0x5e,0x56,0x48,0x5c,0x53,0x47,0x5a,0x4d,0x44,0x59,0x4e,0x4c, 0x61,0x55,0x51,0x60,0x54,0x4c,0x5a,0x57,0x52,0x5e,0x94,0x98,0xa7,0x63,0x6b,0x87, 0x53,0x5d,0x7d,0x5f,0x69,0x87,0x60,0x6a,0x87,0x61,0x6c,0x8a,0x61,0x6b,0x8c,0x61, 0x6d,0x8d,0x61,0x6b,0x8c,0x55,0x60,0x84,0x51,0x5a,0x7f,0x5c,0x67,0x89,0x1a,0x1c, 0x22,0x17,0x19,0x1e,0x17,0x19,0x1e,0x16,0x18,0x1d,0x50,0x4e,0x6d,0x51,0x50,0x77, 0x52,0x51,0x77,0x53,0x51,0x76,0x53,0x50,0x76,0x58,0x52,0x77,0x59,0x51,0x77,0x5c, 0x52,0x77,0x5c,0x53,0x77,0x5b,0x52,0x77,0x5a,0x52,0x77,0x58,0x52,0x77,0x51,0x50, 0x78,0x52,0x56,0x7e,0x53,0x5e,0x86,0x6e,0x78,0x9a,0xa9,0xa6,0xad,0x0a,0x0a,0x0c, 0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x08,0x09,0x0a,0x5d,0x4c,0x5e,0x47,0x39,0x45,0x3e, 0x31,0x3d,0x4a,0x40,0x49,0xc4,0xca,0xd6,0x90,0x99,0xb2,0x61,0x6c,0x91,0x53,0x5d, 0x82,0x4e,0x59,0x7f,0x48,0x54,0x78,0x46,0x50,0x74,0x41,0x4c,0x6b,0x3c,0x46,0x65, 0x3a,0x42,0x63,0x38,0x40,0x60,0x3a,0x42,0x63,0x3f,0x43,0x65,0x43,0x4a,0x6c,0x44, 0x4c,0x6f,0x4c,0x54,0x78,0x34,0x34,0x4c,0x30,0x25,0x34,0x30,0x24,0x36,0x5b,0x51, 0x73,0x55,0x51,0x77,0x54,0x51,0x79,0x5b,0x64,0x89,0x19,0x19,0x1f,0x0b,0x0c,0x0e, 0x0c,0x0d,0x0f,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a, 0x0a,0x0c,0x09,0x0a,0x0b,0x08,0x09,0x0a,0x07,0x08,0x0a,0x07,0x07,0x09,0x06,0x07, 0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x06,0x05,0x05,0x06,0x05,0x05,0x06, 0x04,0x05,0x06,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x0d,0x0d,0x0e,0xc2,0xc7, 0xd2,0xb0,0xb7,0xca,0x89,0x92,0xb1,0x90,0x98,0xb4,0xea,0xeb,0xef,0x48,0x41,0x44, 0x19,0x11,0x14,0x21,0x17,0x1b,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,0x38,0x38,0x38,0xcf,0xd3,0xdf,0xad,0xb4,0xc9, 0xaf,0xb5,0xc9,0xb2,0xb9,0xcc,0xb1,0xb8,0xcb,0xaf,0xb5,0xc9,0xb6,0xbd,0xd4,0x9c, 0xa2,0xa2,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,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,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,0x02,0x02,0x02, 0x26,0x26,0x26,0x08,0x08,0x08,0x06,0x06,0x07,0x0e,0x0f,0x15,0x19,0x1b,0x23,0x1a, 0x1c,0x24,0x16,0x16,0x1e,0x1f,0x22,0x2d,0x2e,0x32,0x3e,0x2b,0x2f,0x3e,0x34,0x38, 0x46,0x29,0x2d,0x3b,0x29,0x28,0x37,0x37,0x3b,0x46,0x2d,0x30,0x39,0x17,0x16,0x1d, 0x12,0x10,0x15,0x10,0x0e,0x12,0x12,0x0f,0x13,0x1e,0x1a,0x21,0x2f,0x29,0x36,0x3e, 0x35,0x44,0x46,0x3e,0x4f,0x4a,0x3f,0x53,0x4c,0x42,0x55,0x4a,0x42,0x56,0x4a,0x43, 0x58,0x4b,0x43,0x5a,0x45,0x44,0x5e,0x4d,0x54,0x67,0x50,0x56,0x67,0x53,0x5a,0x6b, 0x5e,0x64,0x75,0x5d,0x62,0x72,0x54,0x5a,0x6c,0x4e,0x55,0x6a,0x62,0x69,0x7a,0x85, 0x88,0x91,0xaa,0xa9,0xb3,0x7d,0x86,0x9f,0x62,0x59,0x7a,0x5b,0x56,0x72,0x57,0x55, 0x70,0x56,0x54,0x70,0x55,0x51,0x6d,0x52,0x41,0x55,0x8c,0x87,0x96,0x6b,0x63,0x6e, 0x28,0x21,0x2b,0x2c,0x27,0x32,0x8d,0x92,0xa8,0x64,0x6c,0x8d,0x88,0x8f,0xa9,0xaa, 0xaf,0xc1,0xa5,0xac,0xbe,0x87,0x90,0xa9,0x79,0x82,0xa0,0x7a,0x83,0x9f,0x7d,0x87, 0xa0,0x78,0x82,0x9e,0x7c,0x86,0xa0,0x85,0x8e,0xa7,0x88,0x91,0xaa,0x7e,0x87,0xa2, 0x75,0x77,0x93,0x75,0x7f,0x9c,0x82,0x8a,0x9e,0x6b,0x71,0x7e,0x64,0x69,0x77,0x50, 0x56,0x67,0x3c,0x41,0x56,0x3c,0x3a,0x50,0x3a,0x39,0x4e,0x32,0x32,0x45,0x2e,0x2f, 0x40,0x32,0x32,0x43,0x37,0x34,0x46,0x3a,0x35,0x46,0x3f,0x38,0x4a,0x45,0x3c,0x4e, 0x49,0x3f,0x52,0x49,0x40,0x52,0x46,0x41,0x56,0x4a,0x40,0x53,0x40,0x37,0x46,0x32, 0x2d,0x3a,0x2b,0x29,0x37,0x32,0x32,0x43,0x31,0x30,0x42,0x32,0x2f,0x3e,0x32,0x2f, 0x3e,0x32,0x30,0x40,0x33,0x30,0x41,0x54,0x4a,0x60,0x55,0x48,0x5c,0x8e,0x88,0x94, 0x51,0x59,0x79,0x57,0x61,0x80,0x74,0x7e,0x94,0x72,0x7b,0x91,0x68,0x71,0x8a,0x5d, 0x62,0x7e,0x22,0x21,0x2d,0x29,0x28,0x36,0x3e,0x36,0x47,0x47,0x3e,0x4e,0x4a,0x40, 0x52,0x4b,0x42,0x52,0x4e,0x42,0x53,0x52,0x45,0x58,0x52,0x46,0x59,0x51,0x43,0x56, 0x4d,0x40,0x51,0x4a,0x3c,0x4d,0x47,0x3a,0x4a,0x42,0x34,0x43,0x37,0x2b,0x36,0x2f, 0x23,0x2d,0x33,0x28,0x32,0x41,0x33,0x3f,0x5c,0x4c,0x60,0x54,0x4e,0x66,0x59,0x4d, 0x63,0x57,0x4d,0x64,0x56,0x4d,0x64,0x53,0x4d,0x66,0x4f,0x4c,0x66,0x5a,0x4e,0x66, 0x5b,0x51,0x69,0x58,0x52,0x6d,0x52,0x52,0x6e,0x4f,0x50,0x6c,0x4e,0x4d,0x66,0x4f, 0x48,0x60,0x50,0x44,0x56,0x48,0x3a,0x49,0x3a,0x2e,0x39,0x32,0x27,0x32,0x32,0x29, 0x32,0x2f,0x26,0x30,0x38,0x2e,0x39,0x5a,0x4e,0x62,0x54,0x4d,0x66,0x4e,0x4a,0x63, 0x62,0x55,0x6d,0x43,0x34,0x40,0x33,0x26,0x2f,0x3d,0x2f,0x39,0x4f,0x42,0x52,0x4c, 0x41,0x54,0x3e,0x3b,0x4a,0x4e,0x48,0x54,0x4a,0x3f,0x4d,0x3c,0x32,0x3e,0x74,0x70, 0x7c,0x76,0x7d,0x95,0x51,0x5a,0x7a,0x57,0x60,0x80,0x60,0x6a,0x87,0x62,0x6c,0x8b, 0x64,0x6f,0x8e,0x63,0x6d,0x8e,0x62,0x6d,0x8f,0x60,0x69,0x8c,0x51,0x5b,0x81,0x55, 0x60,0x83,0x4a,0x53,0x6e,0x16,0x18,0x1d,0x16,0x18,0x1d,0x16,0x17,0x1c,0x4f,0x4c, 0x6b,0x51,0x50,0x77,0x51,0x50,0x76,0x51,0x50,0x76,0x55,0x50,0x76,0x58,0x51,0x76, 0x59,0x51,0x77,0x5b,0x51,0x77,0x5a,0x52,0x77,0x5a,0x52,0x77,0x5b,0x52,0x77,0x56, 0x50,0x77,0x51,0x50,0x78,0x51,0x54,0x7d,0x52,0x5d,0x85,0x66,0x71,0x94,0xa7,0xa4, 0xad,0x0a,0x0a,0x0d,0x09,0x0a,0x0b,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x58,0x49,0x5b, 0x4a,0x3b,0x49,0x3f,0x31,0x3d,0x4a,0x40,0x49,0xc3,0xc7,0xd5,0x94,0x9c,0xb5,0x5e, 0x69,0x8e,0x50,0x5b,0x83,0x4e,0x59,0x7f,0x4a,0x55,0x79,0x47,0x51,0x73,0x42,0x4c, 0x6c,0x3d,0x47,0x66,0x3a,0x45,0x64,0x39,0x40,0x60,0x3a,0x42,0x61,0x3f,0x43,0x65, 0x43,0x4c,0x6d,0x44,0x4c,0x6d,0x4a,0x52,0x76,0x33,0x37,0x50,0x17,0x16,0x1b,0x38, 0x31,0x47,0x56,0x51,0x76,0x53,0x50,0x78,0x57,0x52,0x78,0x52,0x55,0x7c,0x58,0x5a, 0x70,0x0c,0x0d,0x0f,0x0c,0x0d,0x10,0x0c,0x0d,0x0f,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e, 0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x08,0x08,0x0a,0x07, 0x07,0x09,0x06,0x07,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x06,0x06,0x05,0x06, 0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x05, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0xa3, 0xa5,0xaf,0xc7,0xcc,0xd8,0xb2,0xb9,0xcc,0x9b,0xa3,0xbd,0xd1,0xd6,0xe0,0x8e,0x8a, 0x8c,0x16,0x0f,0x12,0x1c,0x13,0x17,0x15,0x10,0x14,0x02,0x02,0x02,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,0xc8,0xc9, 0xca,0xb8,0xbe,0xcf,0xb1,0xb8,0xcb,0xb0,0xb7,0xca,0xb1,0xb8,0xcb,0xb1,0xb8,0xcb, 0xb0,0xb6,0xcb,0xc1,0xca,0xe2,0x1e,0x1e,0x1e,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,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,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,0x02,0x02,0x02,0x28,0x28,0x28,0x02,0x02,0x02,0x04,0x03,0x04,0x06,0x06,0x07, 0x09,0x0a,0x0d,0x0f,0x10,0x16,0x13,0x14,0x1a,0x16,0x16,0x1e,0x1d,0x1e,0x28,0x26, 0x28,0x35,0x26,0x27,0x35,0x25,0x23,0x2f,0x26,0x26,0x34,0x2a,0x2e,0x3a,0x1b,0x1a, 0x25,0x16,0x14,0x1a,0x12,0x10,0x14,0x0f,0x0e,0x11,0x11,0x0e,0x12,0x1a,0x16,0x1b, 0x2c,0x26,0x31,0x41,0x38,0x47,0x4d,0x42,0x54,0x4e,0x44,0x57,0x4e,0x43,0x59,0x49, 0x43,0x59,0x4b,0x43,0x59,0x4a,0x42,0x57,0x4f,0x46,0x5b,0x46,0x46,0x5e,0x45,0x47, 0x61,0x49,0x4f,0x66,0x55,0x5b,0x71,0x5f,0x65,0x76,0x5f,0x65,0x76,0x4c,0x53,0x67, 0x43,0x49,0x61,0x5a,0x61,0x73,0xa3,0xa1,0xab,0xaa,0xaf,0xc0,0x66,0x69,0x86,0x5b, 0x56,0x73,0x53,0x51,0x6b,0x51,0x50,0x6a,0x50,0x4f,0x6a,0x57,0x45,0x5a,0x76,0x74, 0x89,0x8a,0x83,0x8e,0x2b,0x22,0x2c,0x25,0x1e,0x28,0x6b,0x6d,0x7d,0x75,0x7d,0x99, 0x67,0x71,0x92,0xa0,0xa6,0xb9,0xa7,0xac,0xbf,0x94,0x9c,0xb1,0x7d,0x86,0xa1,0x78, 0x82,0x9c,0x74,0x7d,0x99,0x6d,0x76,0x93,0x6b,0x74,0x90,0x72,0x7b,0x97,0x7a,0x82, 0x9e,0x78,0x81,0x9d,0x6c,0x72,0x91,0x6e,0x74,0x92,0x79,0x83,0x9e,0x65,0x6b,0x7c, 0x64,0x6a,0x7c,0x5c,0x62,0x76,0x4e,0x54,0x6b,0x42,0x45,0x5d,0x3e,0x3e,0x54,0x37, 0x38,0x4c,0x32,0x37,0x4a,0x32,0x34,0x45,0x34,0x33,0x46,0x38,0x35,0x47,0x42,0x3a, 0x4c,0x46,0x3e,0x50,0x4b,0x42,0x55,0x4a,0x41,0x55,0x3f,0x37,0x48,0x3f,0x37,0x47, 0x3d,0x36,0x48,0x3b,0x37,0x48,0x32,0x32,0x43,0x3a,0x3c,0x52,0x39,0x37,0x4b,0x3a, 0x36,0x48,0x36,0x33,0x45,0x33,0x32,0x42,0x34,0x32,0x44,0x57,0x4d,0x65,0x59,0x4c, 0x62,0x8b,0x84,0x92,0x52,0x5c,0x7d,0x5b,0x66,0x86,0x7e,0x87,0x9f,0x79,0x82,0x9b, 0x73,0x7b,0x95,0x64,0x6d,0x89,0x20,0x23,0x2d,0x2c,0x2e,0x3d,0x38,0x36,0x4a,0x44, 0x3e,0x52,0x4b,0x42,0x56,0x4e,0x43,0x56,0x4e,0x42,0x53,0x4c,0x40,0x51,0x4d,0x3f, 0x50,0x4c,0x3e,0x4f,0x4b,0x3e,0x4c,0x4a,0x3b,0x4b,0x46,0x39,0x46,0x42,0x34,0x41, 0x3e,0x32,0x3d,0x49,0x3b,0x49,0x5a,0x49,0x5b,0x5e,0x4e,0x62,0x5f,0x4e,0x62,0x5e, 0x51,0x67,0x5a,0x4f,0x67,0x58,0x4e,0x66,0x58,0x4d,0x65,0x57,0x4c,0x62,0x57,0x4b, 0x61,0x52,0x4b,0x64,0x50,0x4b,0x64,0x53,0x4e,0x66,0x52,0x4f,0x6b,0x52,0x56,0x72, 0x52,0x59,0x73,0x4f,0x56,0x70,0x4c,0x4a,0x65,0x4c,0x48,0x62,0x4f,0x47,0x5e,0x4f, 0x40,0x52,0x35,0x2a,0x34,0x30,0x27,0x31,0x34,0x2a,0x34,0x4e,0x3f,0x51,0x5c,0x52, 0x69,0x5a,0x4f,0x67,0x64,0x55,0x6d,0x45,0x35,0x42,0x32,0x25,0x2d,0x48,0x38,0x46, 0x52,0x43,0x55,0x36,0x2d,0x38,0x2f,0x28,0x32,0x37,0x2e,0x38,0x3a,0x2e,0x39,0x41, 0x33,0x40,0x45,0x3b,0x45,0x8f,0x96,0xa6,0x61,0x6a,0x89,0x4f,0x5a,0x7b,0x62,0x6c, 0x8a,0x63,0x6e,0x8d,0x65,0x70,0x8f,0x63,0x6f,0x8f,0x62,0x6d,0x8f,0x60,0x6b,0x8c, 0x59,0x62,0x85,0x52,0x5a,0x7f,0x5c,0x66,0x88,0x1d,0x20,0x29,0x16,0x18,0x1d,0x16, 0x17,0x1c,0x4f,0x4d,0x6c,0x52,0x51,0x77,0x51,0x50,0x76,0x51,0x50,0x77,0x52,0x51, 0x76,0x55,0x50,0x76,0x59,0x51,0x76,0x59,0x51,0x77,0x5b,0x51,0x77,0x5a,0x52,0x77, 0x5b,0x52,0x77,0x56,0x50,0x77,0x51,0x50,0x78,0x52,0x54,0x7c,0x52,0x5d,0x85,0x62, 0x6c,0x90,0xa0,0xa0,0xab,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x09,0x0a, 0x0c,0x55,0x46,0x56,0x4d,0x3e,0x4d,0x3e,0x31,0x3c,0x49,0x3e,0x48,0xc2,0xc6,0xd4, 0x92,0x9a,0xb3,0x62,0x6c,0x91,0x53,0x5d,0x82,0x4e,0x59,0x80,0x4a,0x55,0x7a,0x47, 0x50,0x74,0x41,0x4b,0x6c,0x3e,0x45,0x69,0x3a,0x42,0x63,0x3a,0x41,0x61,0x3a,0x41, 0x60,0x3e,0x45,0x65,0x43,0x4a,0x6e,0x44,0x4b,0x6d,0x4b,0x53,0x76,0x33,0x39,0x52, 0x0b,0x0c,0x0e,0x30,0x2b,0x3c,0x52,0x52,0x7b,0x53,0x55,0x7c,0x57,0x52,0x77,0x53, 0x50,0x78,0x58,0x63,0x88,0x24,0x25,0x2c,0x0c,0x0d,0x10,0x0c,0x0d,0x0f,0x0b,0x0c, 0x0e,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0c,0x09,0x0a,0x0b, 0x09,0x09,0x0b,0x08,0x09,0x0a,0x07,0x07,0x09,0x06,0x07,0x08,0x06,0x06,0x08,0x06, 0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05, 0x06,0x04,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x02,0x02,0x03, 0x52,0x53,0x57,0xca,0xce,0xdc,0xbf,0xc6,0xd4,0xab,0xb2,0xc7,0xc2,0xc8,0xd5,0xcf, 0xcd,0xcf,0x1a,0x11,0x15,0x19,0x11,0x14,0x25,0x1b,0x21,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x30,0x30,0x30,0xca,0xcf,0xdd,0xb1,0xb8,0xcb,0xb2,0xb9,0xcc,0xb2,0xb9, 0xcb,0xb2,0xb9,0xcb,0xb1,0xb8,0xcb,0xb4,0xba,0xce,0xc8,0xd1,0xe7,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x02, 0x03,0x04,0x03,0x04,0x06,0x05,0x06,0x0d,0x0e,0x12,0x18,0x1a,0x22,0x1b,0x1e,0x27, 0x20,0x22,0x2e,0x1f,0x20,0x2b,0x1a,0x1a,0x23,0x1a,0x1a,0x23,0x22,0x26,0x2f,0x22, 0x26,0x2e,0x16,0x16,0x1d,0x14,0x12,0x16,0x12,0x0f,0x14,0x10,0x0e,0x12,0x12,0x0f, 0x13,0x1b,0x16,0x1d,0x2f,0x28,0x33,0x46,0x3c,0x4e,0x4f,0x44,0x57,0x52,0x48,0x5c, 0x4e,0x47,0x5e,0x46,0x42,0x5b,0x45,0x42,0x5a,0x46,0x43,0x59,0x4c,0x44,0x5a,0x50, 0x46,0x5b,0x4a,0x46,0x5e,0x47,0x47,0x61,0x4f,0x56,0x6e,0x5b,0x62,0x76,0x62,0x68, 0x79,0x5c,0x62,0x73,0x48,0x4e,0x63,0x43,0x42,0x5b,0x63,0x67,0x7c,0xb1,0xb6,0xc3, 0xab,0xa9,0xb8,0x5c,0x67,0x86,0x54,0x56,0x75,0x4f,0x50,0x6c,0x4b,0x4b,0x66,0x56, 0x45,0x5a,0x63,0x62,0x7b,0x98,0x92,0x9c,0x2f,0x27,0x31,0x24,0x1d,0x27,0x3b,0x39, 0x44,0x8e,0x94,0xa9,0x5b,0x64,0x87,0x8b,0x94,0xac,0x9e,0xa6,0xb9,0x99,0xa2,0xb6, 0x81,0x8b,0xa5,0x7a,0x83,0x9f,0x77,0x80,0x9a,0x71,0x79,0x94,0x6a,0x74,0x8f,0x6a, 0x72,0x8f,0x6f,0x78,0x94,0x73,0x7d,0x98,0x6c,0x75,0x93,0x70,0x74,0x92,0x76,0x80, 0x9c,0x6a,0x71,0x85,0x5c,0x63,0x77,0x5a,0x62,0x78,0x5f,0x66,0x7d,0x5e,0x65,0x7b, 0x4d,0x54,0x6a,0x41,0x47,0x5d,0x46,0x4c,0x5e,0x42,0x46,0x57,0x33,0x38,0x4a,0x32, 0x31,0x42,0x3b,0x37,0x49,0x39,0x33,0x42,0x3d,0x35,0x46,0x3c,0x35,0x46,0x3c,0x38, 0x4b,0x49,0x42,0x57,0x3e,0x3d,0x53,0x3a,0x3a,0x4e,0x3b,0x3b,0x51,0x3c,0x3d,0x52, 0x39,0x38,0x4c,0x3a,0x36,0x48,0x37,0x34,0x46,0x34,0x32,0x43,0x35,0x33,0x46,0x59, 0x4f,0x67,0x5a,0x4e,0x65,0x83,0x7a,0x8a,0x5d,0x66,0x85,0x5c,0x67,0x8a,0x7c,0x85, 0xa0,0x7e,0x88,0xa3,0x75,0x7f,0x9a,0x67,0x72,0x8e,0x21,0x25,0x2f,0x29,0x2c,0x3a, 0x32,0x32,0x44,0x46,0x40,0x54,0x4e,0x44,0x59,0x4e,0x43,0x56,0x4a,0x3e,0x4e,0x46, 0x3a,0x49,0x46,0x39,0x47,0x4b,0x3d,0x4c,0x4a,0x3c,0x4c,0x4b,0x3d,0x4d,0x4f,0x41, 0x51,0x56,0x48,0x5a,0x5d,0x50,0x66,0x5f,0x53,0x6c,0x5e,0x52,0x68,0x55,0x45,0x56, 0x4f,0x3f,0x4f,0x5f,0x4f,0x62,0x5e,0x4e,0x63,0x54,0x45,0x56,0x5a,0x49,0x5d,0x59, 0x4a,0x5e,0x56,0x49,0x5c,0x52,0x48,0x5e,0x4a,0x46,0x5e,0x4c,0x48,0x5e,0x4b,0x49, 0x62,0x4e,0x54,0x6f,0x5b,0x62,0x7c,0x5e,0x66,0x7f,0x53,0x5b,0x75,0x4e,0x51,0x6c, 0x4c,0x4b,0x66,0x51,0x49,0x61,0x4a,0x3b,0x4a,0x32,0x27,0x31,0x2e,0x24,0x2d,0x36, 0x2c,0x38,0x5c,0x4c,0x61,0x5e,0x52,0x6a,0x63,0x58,0x74,0x58,0x4e,0x65,0x52,0x45, 0x57,0x57,0x48,0x5a,0x43,0x38,0x46,0x35,0x2b,0x37,0x2e,0x23,0x2d,0x31,0x26,0x2f, 0x38,0x2c,0x34,0x49,0x3b,0x49,0x3b,0x2e,0x38,0x8c,0x88,0x92,0x7f,0x88,0x9f,0x50, 0x5b,0x7e,0x5e,0x69,0x8a,0x66,0x72,0x91,0x66,0x72,0x92,0x66,0x70,0x91,0x65,0x6f, 0x90,0x60,0x6a,0x8c,0x5d,0x68,0x8a,0x52,0x5c,0x81,0x58,0x62,0x85,0x3c,0x43,0x58, 0x16,0x17,0x1c,0x15,0x16,0x1b,0x4e,0x4c,0x6a,0x51,0x51,0x77,0x51,0x50,0x77,0x51, 0x50,0x77,0x53,0x50,0x75,0x55,0x4f,0x76,0x58,0x51,0x75,0x59,0x52,0x77,0x5a,0x51, 0x77,0x5a,0x52,0x77,0x5b,0x52,0x77,0x57,0x52,0x77,0x51,0x50,0x78,0x51,0x53,0x7b, 0x52,0x5d,0x85,0x5d,0x69,0x8e,0x9c,0x9d,0xaa,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a, 0x0a,0x0d,0x09,0x09,0x0b,0x50,0x42,0x51,0x4f,0x41,0x4f,0x3e,0x31,0x3c,0x42,0x36, 0x41,0xc0,0xc4,0xd2,0x8c,0x96,0xb0,0x60,0x6a,0x8f,0x54,0x5e,0x84,0x4e,0x59,0x81, 0x4b,0x55,0x7b,0x47,0x50,0x76,0x41,0x4a,0x6d,0x3e,0x46,0x69,0x39,0x44,0x63,0x39, 0x3f,0x5f,0x3a,0x40,0x60,0x3f,0x42,0x65,0x42,0x48,0x6b,0x44,0x4b,0x6d,0x49,0x50, 0x77,0x33,0x39,0x51,0x0c,0x0d,0x0f,0x0a,0x0b,0x0e,0x50,0x56,0x76,0x54,0x5e,0x86, 0x52,0x50,0x78,0x57,0x51,0x77,0x53,0x52,0x79,0x5c,0x64,0x83,0x0c,0x0d,0x0f,0x0c, 0x0d,0x0f,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a, 0x0c,0x09,0x0a,0x0b,0x08,0x09,0x0a,0x07,0x08,0x0a,0x08,0x08,0x0a,0x07,0x07,0x09, 0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x06,0x05,0x05,0x06,0x04, 0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x02,0x02, 0x03,0x0d,0x0d,0x0e,0xc1,0xc7,0xd5,0xbe,0xc4,0xd4,0xb2,0xb8,0xcb,0xb5,0xbc,0xce, 0xf1,0xf2,0xf3,0x2c,0x26,0x28,0x18,0x10,0x12,0x1f,0x15,0x1a,0x12,0x0d,0x11,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,0xbb,0xbe,0xc1,0xba,0xc0,0xd1,0xb0, 0xb7,0xca,0xb2,0xb9,0xcb,0xb0,0xb8,0xcb,0xb1,0xb9,0xcb,0xb2,0xb8,0xcb,0xbd,0xc4, 0xd8,0x5d,0x5d,0x5d,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x04,0x03,0x05,0x07,0x06,0x09,0x10,0x11, 0x16,0x1d,0x20,0x29,0x22,0x25,0x31,0x1c,0x1e,0x28,0x11,0x11,0x16,0x10,0x0f,0x15, 0x13,0x15,0x1b,0x12,0x14,0x1a,0x10,0x0f,0x15,0x11,0x0e,0x13,0x10,0x0e,0x12,0x12, 0x0f,0x12,0x14,0x11,0x16,0x1d,0x18,0x1e,0x32,0x2c,0x37,0x48,0x3e,0x50,0x4e,0x44, 0x57,0x50,0x47,0x5c,0x4a,0x48,0x61,0x4a,0x4d,0x66,0x49,0x4f,0x66,0x46,0x46,0x60, 0x46,0x45,0x5e,0x52,0x47,0x5e,0x52,0x47,0x5d,0x4c,0x47,0x5e,0x46,0x47,0x61,0x52, 0x5a,0x70,0x6a,0x70,0x7f,0x6b,0x6f,0x7e,0x56,0x5c,0x6e,0x4f,0x56,0x6a,0x4d,0x51, 0x6b,0x95,0x9b,0xae,0xbb,0xb8,0xc1,0xac,0xb0,0xbe,0x6e,0x76,0x8e,0x57,0x5f,0x7e, 0x51,0x53,0x6f,0x51,0x42,0x58,0x55,0x51,0x6e,0xa6,0xa0,0xaa,0x36,0x2b,0x37,0x25, 0x1e,0x29,0x24,0x1f,0x28,0x88,0x8d,0xa1,0x67,0x6f,0x8f,0x69,0x73,0x93,0x95,0x9c, 0xb2,0x9a,0xa2,0xb6,0x8d,0x95,0xac,0x79,0x84,0x9f,0x79,0x83,0x9d,0x7a,0x82,0x9b, 0x7c,0x84,0x9d,0x75,0x7e,0x97,0x6a,0x74,0x90,0x64,0x6e,0x8d,0x5f,0x68,0x89,0x64, 0x66,0x85,0x6c,0x75,0x93,0x6f,0x76,0x8e,0x5d,0x64,0x78,0x58,0x5f,0x76,0x5d,0x64, 0x7c,0x67,0x6f,0x85,0x66,0x6e,0x82,0x59,0x60,0x75,0x58,0x5f,0x73,0x56,0x5c,0x6d, 0x3f,0x44,0x54,0x2f,0x34,0x44,0x30,0x30,0x41,0x3a,0x36,0x49,0x39,0x34,0x45,0x39, 0x35,0x48,0x39,0x38,0x4c,0x3a,0x3b,0x50,0x42,0x48,0x5d,0x41,0x46,0x5a,0x39,0x3e, 0x52,0x37,0x37,0x4a,0x36,0x35,0x47,0x36,0x34,0x46,0x3c,0x36,0x48,0x3e,0x38,0x49, 0x38,0x36,0x48,0x59,0x4f,0x68,0x5a,0x4e,0x64,0x77,0x6d,0x7f,0x5e,0x67,0x87,0x61, 0x6c,0x8d,0x7f,0x88,0xa4,0x80,0x89,0xa4,0x76,0x80,0x9c,0x69,0x73,0x91,0x27,0x27, 0x35,0x2b,0x2b,0x3b,0x38,0x36,0x4a,0x49,0x42,0x56,0x4d,0x44,0x57,0x4a,0x40,0x50, 0x49,0x3c,0x4c,0x4b,0x3c,0x4b,0x4d,0x3e,0x4d,0x4e,0x3e,0x4e,0x4e,0x3e,0x4e,0x54, 0x45,0x56,0x59,0x4e,0x63,0x5d,0x52,0x6b,0x5a,0x52,0x6e,0x59,0x52,0x6d,0x5a,0x4f, 0x67,0x56,0x4a,0x5d,0x56,0x46,0x5a,0x56,0x46,0x58,0x56,0x47,0x59,0x59,0x4c,0x61, 0x59,0x4e,0x66,0x54,0x4d,0x66,0x51,0x4a,0x62,0x4d,0x47,0x5f,0x48,0x44,0x5c,0x4c, 0x45,0x5a,0x50,0x46,0x5b,0x4a,0x46,0x5e,0x4c,0x4e,0x66,0x52,0x59,0x72,0x52,0x5a, 0x76,0x52,0x56,0x72,0x4f,0x50,0x6c,0x54,0x4e,0x66,0x58,0x4a,0x5d,0x4e,0x40,0x50, 0x3f,0x32,0x3e,0x36,0x29,0x33,0x42,0x34,0x41,0x5e,0x51,0x66,0x66,0x5b,0x77,0x56, 0x52,0x6d,0x55,0x4f,0x69,0x4a,0x3f,0x52,0x42,0x36,0x45,0x38,0x2e,0x39,0x33,0x28, 0x31,0x35,0x2a,0x34,0x3c,0x2d,0x38,0x48,0x38,0x45,0x48,0x3a,0x48,0x55,0x4b,0x55, 0xa5,0xab,0xbb,0x60,0x6b,0x8d,0x57,0x60,0x84,0x69,0x73,0x94,0x68,0x74,0x93,0x67, 0x73,0x92,0x65,0x6f,0x90,0x61,0x6d,0x8e,0x5f,0x68,0x8b,0x51,0x5b,0x7f,0x54,0x5f, 0x82,0x57,0x62,0x83,0x16,0x17,0x1d,0x15,0x16,0x1c,0x4c,0x4c,0x69,0x51,0x53,0x77, 0x51,0x50,0x77,0x50,0x4f,0x75,0x52,0x50,0x76,0x55,0x4f,0x75,0x58,0x50,0x75,0x5a, 0x50,0x76,0x5a,0x51,0x77,0x5a,0x51,0x77,0x5a,0x52,0x77,0x56,0x50,0x77,0x51,0x4f, 0x78,0x51,0x50,0x7a,0x52,0x5c,0x84,0x5c,0x68,0x8d,0x93,0x96,0xa6,0x0a,0x0b,0x0e, 0x0a,0x0a,0x0d,0x09,0x09,0x0b,0x09,0x09,0x0b,0x4a,0x3d,0x4b,0x51,0x42,0x51,0x3f, 0x31,0x3d,0x41,0x36,0x3f,0xbc,0xc1,0xd0,0x85,0x8f,0xac,0x5d,0x69,0x8e,0x51,0x5c, 0x83,0x4e,0x59,0x81,0x4c,0x55,0x7b,0x47,0x53,0x77,0x41,0x4c,0x6e,0x3e,0x47,0x6a, 0x39,0x42,0x63,0x39,0x40,0x61,0x3a,0x3f,0x60,0x3d,0x40,0x64,0x42,0x48,0x6b,0x43, 0x4a,0x6c,0x4a,0x52,0x76,0x33,0x39,0x52,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x24,0x22, 0x2d,0x5d,0x69,0x8c,0x52,0x51,0x79,0x59,0x53,0x77,0x56,0x51,0x77,0x54,0x5e,0x85, 0x22,0x23,0x2c,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b, 0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x08,0x08, 0x0a,0x07,0x08,0x0a,0x07,0x07,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x08, 0x06,0x06,0x08,0x05,0x06,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04, 0x04,0x05,0x02,0x02,0x03,0x8f,0x95,0xa3,0xb9,0xbf,0xd0,0xb7,0xbd,0xce,0xaf,0xb6, 0xc9,0xe2,0xe4,0xea,0x67,0x61,0x64,0x17,0x0f,0x11,0x1a,0x12,0x14,0x24,0x1b,0x1f, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x2e,0x2e,0x2e, 0xcb,0xd0,0xdd,0xb2,0xb9,0xcb,0xb1,0xb7,0xca,0xb3,0xb9,0xcb,0xb2,0xb9,0xcb,0xb3, 0xb9,0xcc,0xb2,0xb9,0xcc,0xcc,0xd4,0xed,0x07,0x07,0x07,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x04,0x04, 0x03,0x05,0x06,0x05,0x07,0x0d,0x0e,0x12,0x16,0x18,0x1f,0x16,0x18,0x20,0x0a,0x0a, 0x0e,0x1e,0x1e,0x20,0x1e,0x1e,0x21,0x09,0x08,0x0b,0x0a,0x0a,0x0d,0x0b,0x0a,0x0d, 0x0e,0x0c,0x0f,0x13,0x10,0x15,0x18,0x14,0x19,0x1e,0x1a,0x20,0x32,0x2a,0x35,0x46, 0x3d,0x4d,0x4d,0x42,0x55,0x4d,0x44,0x58,0x46,0x45,0x5f,0x50,0x57,0x6e,0x5b,0x62, 0x77,0x4f,0x55,0x6c,0x47,0x4a,0x62,0x49,0x46,0x60,0x54,0x49,0x5e,0x51,0x46,0x5d, 0x48,0x44,0x5a,0x45,0x47,0x60,0x65,0x6a,0x7b,0x72,0x76,0x82,0x62,0x67,0x75,0x52, 0x59,0x6c,0x5a,0x60,0x74,0x6c,0x73,0x90,0x75,0x79,0x97,0x94,0x98,0xae,0x76,0x7e, 0x96,0x5f,0x67,0x83,0x54,0x58,0x76,0x58,0x48,0x5d,0x50,0x4a,0x67,0xa1,0x9b,0xa5, 0x41,0x38,0x43,0x26,0x1f,0x2a,0x22,0x1c,0x26,0x57,0x59,0x67,0x7e,0x84,0x9e,0x57, 0x62,0x86,0x8b,0x93,0xab,0x94,0x9c,0xb2,0x93,0x9b,0xb1,0x80,0x88,0xa3,0x7d,0x85, 0x9f,0x88,0x90,0xa7,0x82,0x8a,0xa0,0x66,0x6f,0x89,0x61,0x64,0x82,0x68,0x67,0x84, 0x66,0x64,0x82,0x57,0x55,0x77,0x58,0x5c,0x7f,0x6a,0x75,0x92,0x5c,0x64,0x77,0x5b, 0x62,0x77,0x59,0x61,0x78,0x63,0x6a,0x81,0x6a,0x71,0x86,0x68,0x70,0x83,0x5f,0x66, 0x7b,0x59,0x5f,0x72,0x46,0x4c,0x5d,0x33,0x38,0x46,0x2e,0x32,0x42,0x2e,0x2e,0x40, 0x31,0x30,0x42,0x2e,0x2e,0x3f,0x31,0x30,0x42,0x32,0x31,0x42,0x33,0x32,0x44,0x33, 0x32,0x45,0x34,0x33,0x46,0x34,0x33,0x46,0x34,0x33,0x46,0x34,0x33,0x46,0x3e,0x38, 0x49,0x46,0x3a,0x4a,0x41,0x39,0x4a,0x5a,0x50,0x68,0x5b,0x4e,0x64,0x6d,0x62,0x75, 0x5c,0x65,0x85,0x60,0x6b,0x8c,0x82,0x8b,0xa5,0x7c,0x84,0xa2,0x76,0x7f,0x9b,0x6b, 0x73,0x92,0x31,0x2f,0x3f,0x37,0x33,0x44,0x3c,0x38,0x4b,0x49,0x42,0x56,0x4b,0x41, 0x54,0x4a,0x3f,0x52,0x4e,0x40,0x52,0x52,0x45,0x56,0x52,0x43,0x53,0x4f,0x41,0x51, 0x55,0x46,0x59,0x5a,0x4e,0x63,0x5e,0x52,0x69,0x5f,0x53,0x6a,0x5f,0x53,0x6b,0x5d, 0x53,0x6c,0x59,0x50,0x6a,0x51,0x48,0x60,0x53,0x48,0x5c,0x53,0x48,0x5d,0x50,0x48, 0x5e,0x4c,0x49,0x62,0x4e,0x4b,0x66,0x4e,0x4d,0x67,0x4e,0x4e,0x68,0x4d,0x4c,0x66, 0x4a,0x47,0x61,0x4a,0x44,0x5a,0x4e,0x43,0x58,0x51,0x46,0x59,0x52,0x48,0x5a,0x52, 0x48,0x5d,0x54,0x4a,0x60,0x57,0x4d,0x65,0x5a,0x4f,0x66,0x59,0x4c,0x61,0x52,0x42, 0x54,0x4a,0x3c,0x4a,0x4d,0x3e,0x4d,0x4e,0x3e,0x4e,0x3e,0x31,0x3d,0x4f,0x3f,0x4f, 0x6b,0x5d,0x77,0x67,0x5f,0x7d,0x5a,0x51,0x69,0x45,0x3c,0x4e,0x3d,0x33,0x40,0x37, 0x2c,0x37,0x36,0x2b,0x36,0x38,0x2c,0x36,0x3e,0x31,0x3d,0x45,0x35,0x42,0x53,0x42, 0x52,0x3f,0x33,0x3e,0xae,0xab,0xb2,0x88,0x92,0xab,0x52,0x5d,0x83,0x68,0x74,0x93, 0x6b,0x75,0x95,0x68,0x74,0x94,0x62,0x6e,0x90,0x62,0x6e,0x8f,0x5c,0x68,0x8a,0x50, 0x59,0x7f,0x55,0x61,0x83,0x53,0x5c,0x7b,0x15,0x16,0x1b,0x14,0x16,0x1b,0x4c,0x4b, 0x69,0x51,0x52,0x77,0x50,0x50,0x76,0x50,0x4f,0x75,0x52,0x50,0x75,0x53,0x4f,0x75, 0x58,0x50,0x75,0x59,0x51,0x76,0x5a,0x52,0x77,0x5b,0x52,0x77,0x5c,0x52,0x77,0x59, 0x52,0x77,0x52,0x4f,0x78,0x52,0x51,0x79,0x51,0x5b,0x83,0x5a,0x67,0x8a,0x90,0x95, 0xa8,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x09,0x0b,0x43,0x37,0x44, 0x54,0x45,0x55,0x3f,0x32,0x3d,0x41,0x35,0x40,0xba,0xbf,0xce,0x80,0x8a,0xa7,0x5c, 0x68,0x8f,0x53,0x5d,0x84,0x4d,0x58,0x81,0x4b,0x55,0x7b,0x48,0x53,0x77,0x44,0x4d, 0x70,0x3e,0x47,0x69,0x3a,0x44,0x64,0x39,0x41,0x62,0x39,0x40,0x60,0x3d,0x40,0x63, 0x41,0x47,0x6b,0x43,0x4a,0x6c,0x48,0x50,0x74,0x35,0x39,0x52,0x0d,0x0e,0x10,0x0c, 0x0d,0x0f,0x0a,0x0a,0x0d,0x4f,0x52,0x6a,0x53,0x5d,0x85,0x56,0x51,0x77,0x5a,0x53, 0x77,0x52,0x53,0x7a,0x66,0x6d,0x87,0x0d,0x0e,0x10,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f, 0x0b,0x0c,0x0e,0x0b,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x09, 0x0a,0x0c,0x09,0x0a,0x0b,0x08,0x09,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x06,0x07, 0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x08,0x05,0x06,0x07,0x05,0x05,0x06, 0x04,0x05,0x06,0x04,0x04,0x06,0x41,0x44,0x4c,0xb7,0xbd,0xce,0xc2,0xc6,0xd5,0xb6, 0xbc,0xce,0xcb,0xce,0xdc,0xb1,0xaf,0xb0,0x1c,0x13,0x16,0x17,0x0f,0x12,0x22,0x19, 0x1d,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,0xb7,0xb9,0xbc,0xb8,0xbf,0xd0,0xad,0xb4,0xc9,0xb0,0xb8,0xca, 0xb1,0xb8,0xcb,0xb2,0xb8,0xcb,0xb1,0xb7,0xcb,0xb7,0xbe,0xd4,0x9b,0xa1,0xa8,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,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,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,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x03,0x03, 0x03,0x02,0x03,0x03,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x05,0x06,0x07,0x07, 0x07,0x0a,0x05,0x05,0x06,0x1c,0x1b,0x1c,0x1c,0x1c,0x1d,0x05,0x05,0x06,0x06,0x06, 0x07,0x07,0x06,0x09,0x0b,0x0a,0x0c,0x13,0x11,0x15,0x1a,0x16,0x1b,0x20,0x1a,0x22, 0x2e,0x26,0x30,0x40,0x36,0x43,0x49,0x3f,0x50,0x4c,0x42,0x55,0x44,0x42,0x59,0x47, 0x4c,0x65,0x4e,0x56,0x6e,0x53,0x5a,0x72,0x4d,0x52,0x6b,0x49,0x4c,0x64,0x48,0x46, 0x5e,0x52,0x48,0x5e,0x4f,0x46,0x5c,0x44,0x41,0x59,0x4e,0x53,0x6a,0x6c,0x71,0x80, 0x6f,0x73,0x7e,0x5e,0x63,0x72,0x5c,0x63,0x74,0x63,0x65,0x83,0x5d,0x5b,0x80,0x6c, 0x60,0x80,0x61,0x62,0x85,0x5a,0x64,0x83,0x52,0x56,0x74,0x5c,0x4e,0x66,0x51,0x48, 0x64,0x8e,0x8a,0x98,0x47,0x3d,0x49,0x27,0x20,0x2a,0x23,0x1d,0x28,0x32,0x2e,0x3a, 0x8e,0x95,0xaa,0x58,0x61,0x85,0x74,0x7e,0x9b,0x8c,0x94,0xad,0x8c,0x95,0xab,0x7f, 0x86,0xa1,0x70,0x77,0x94,0x6d,0x75,0x8e,0x5f,0x66,0x81,0x61,0x60,0x77,0x61,0x5c, 0x74,0x66,0x5f,0x77,0x69,0x61,0x79,0x5f,0x58,0x74,0x60,0x58,0x77,0x5f,0x61,0x83, 0x56,0x5d,0x75,0x57,0x5e,0x72,0x58,0x5f,0x75,0x65,0x6b,0x7f,0x72,0x78,0x8a,0x6e, 0x74,0x86,0x5d,0x64,0x7a,0x4e,0x56,0x6c,0x42,0x48,0x5a,0x3a,0x3f,0x4e,0x36,0x3a, 0x4b,0x32,0x36,0x47,0x2e,0x30,0x40,0x2e,0x2e,0x3e,0x2e,0x2e,0x3f,0x30,0x2f,0x41, 0x32,0x30,0x42,0x32,0x32,0x43,0x33,0x32,0x45,0x33,0x32,0x45,0x34,0x33,0x46,0x34, 0x33,0x46,0x3d,0x37,0x49,0x47,0x3a,0x4a,0x44,0x3b,0x4b,0x59,0x4f,0x68,0x59,0x4c, 0x62,0x66,0x59,0x6c,0x5c,0x65,0x84,0x5b,0x65,0x88,0x79,0x82,0x9f,0x7d,0x85,0xa2, 0x78,0x80,0x9c,0x6f,0x75,0x92,0x39,0x35,0x46,0x44,0x3e,0x52,0x49,0x42,0x57,0x4a, 0x42,0x56,0x4a,0x41,0x54,0x49,0x3f,0x52,0x50,0x46,0x59,0x52,0x46,0x58,0x50,0x43, 0x55,0x53,0x47,0x58,0x58,0x4c,0x63,0x54,0x4e,0x69,0x53,0x50,0x6b,0x5d,0x52,0x6b, 0x5f,0x53,0x6a,0x5e,0x52,0x6a,0x5e,0x52,0x6b,0x5b,0x50,0x6a,0x5a,0x4f,0x67,0x54, 0x4e,0x67,0x4e,0x4d,0x69,0x51,0x56,0x70,0x57,0x5e,0x78,0x5a,0x60,0x7a,0x58,0x5f, 0x78,0x55,0x5b,0x75,0x52,0x59,0x72,0x4f,0x53,0x6d,0x4a,0x4d,0x66,0x48,0x44,0x5c, 0x50,0x46,0x5b,0x50,0x44,0x56,0x4e,0x40,0x52,0x50,0x42,0x52,0x55,0x46,0x56,0x5a, 0x4a,0x5c,0x54,0x44,0x56,0x45,0x36,0x44,0x44,0x36,0x42,0x4e,0x3e,0x4e,0x4d,0x3e, 0x4d,0x3e,0x30,0x3c,0x59,0x47,0x5a,0x72,0x5e,0x76,0x5d,0x4c,0x5e,0x4e,0x40,0x51, 0x41,0x35,0x43,0x39,0x2f,0x3c,0x3b,0x2e,0x3a,0x3e,0x31,0x3b,0x41,0x33,0x3f,0x47, 0x38,0x45,0x50,0x40,0x4f,0x50,0x41,0x51,0x6a,0x60,0x6a,0xc3,0xc8,0xd3,0x5a,0x66, 0x8a,0x63,0x6e,0x91,0x6c,0x77,0x97,0x69,0x75,0x95,0x65,0x70,0x91,0x62,0x6d,0x8f, 0x5d,0x68,0x8b,0x51,0x5b,0x81,0x56,0x61,0x85,0x4e,0x57,0x77,0x14,0x16,0x1a,0x13, 0x15,0x1a,0x4c,0x4b,0x69,0x51,0x52,0x77,0x50,0x50,0x76,0x50,0x4f,0x75,0x51,0x4f, 0x76,0x53,0x4f,0x75,0x57,0x51,0x75,0x56,0x51,0x75,0x5c,0x53,0x77,0x5a,0x52,0x77, 0x5a,0x52,0x77,0x59,0x52,0x77,0x52,0x4f,0x78,0x51,0x51,0x79,0x51,0x5c,0x83,0x59, 0x64,0x89,0x8a,0x8f,0xa5,0x0a,0x0b,0x0e,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x09,0x0a, 0x0c,0x3a,0x30,0x3b,0x55,0x46,0x56,0x42,0x34,0x3f,0x3a,0x2e,0x38,0xb7,0xbe,0xcd, 0x81,0x8b,0xa9,0x5d,0x69,0x8e,0x53,0x5e,0x87,0x4e,0x5a,0x82,0x4d,0x56,0x7c,0x4a, 0x52,0x78,0x43,0x4d,0x6f,0x3e,0x48,0x6b,0x39,0x44,0x64,0x3a,0x41,0x62,0x3a,0x41, 0x61,0x3b,0x40,0x62,0x42,0x47,0x6b,0x44,0x4b,0x6e,0x49,0x50,0x75,0x37,0x3c,0x55, 0x0d,0x0e,0x11,0x0c,0x0d,0x0f,0x0a,0x0b,0x0e,0x13,0x14,0x19,0x61,0x6d,0x8f,0x52, 0x50,0x78,0x5a,0x53,0x77,0x55,0x52,0x77,0x5d,0x69,0x8c,0x1b,0x1b,0x21,0x0c,0x0d, 0x0f,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e, 0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x07,0x08,0x0a,0x07, 0x08,0x0a,0x06,0x07,0x0a,0x06,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06, 0x07,0x05,0x06,0x07,0x05,0x05,0x06,0x0c,0x0e,0x10,0xb0,0xb5,0xc6,0xc9,0xcd,0xd9, 0xbd,0xc3,0xd3,0xbb,0xc0,0xd2,0xe2,0xe1,0xe3,0x27,0x1e,0x22,0x19,0x11,0x15,0x1b, 0x13,0x16,0x14,0x0f,0x13,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x30,0x30,0x30,0xcc,0xd2,0xde,0xb2,0xb9, 0xcb,0xb0,0xb8,0xca,0xaf,0xb5,0xc9,0xb1,0xb7,0xca,0xb1,0xb8,0xcb,0xb1,0xb9,0xcb, 0xc2,0xca,0xe1,0x29,0x29,0x29,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x0e,0x0e,0x0f,0x23,0x23,0x24,0x03, 0x03,0x04,0x05,0x05,0x06,0x07,0x06,0x08,0x0a,0x09,0x0b,0x11,0x0e,0x12,0x17,0x13, 0x19,0x1e,0x19,0x1f,0x27,0x21,0x2a,0x33,0x2b,0x36,0x40,0x36,0x45,0x46,0x3b,0x4b, 0x49,0x40,0x53,0x46,0x42,0x58,0x48,0x46,0x5f,0x4a,0x4a,0x64,0x4a,0x4e,0x69,0x4b, 0x51,0x6a,0x49,0x49,0x62,0x4c,0x47,0x5e,0x50,0x47,0x5e,0x4a,0x45,0x5b,0x44,0x42, 0x5b,0x5a,0x61,0x74,0x6f,0x74,0x82,0x68,0x6e,0x7a,0x5b,0x61,0x72,0x66,0x6b,0x86, 0x5f,0x60,0x84,0x6a,0x58,0x71,0x50,0x48,0x5d,0x61,0x58,0x72,0x5a,0x5a,0x79,0x58, 0x50,0x6d,0x5b,0x4d,0x67,0x7d,0x79,0x8c,0x56,0x4d,0x59,0x29,0x22,0x2b,0x23,0x1d, 0x27,0x24,0x1f,0x29,0x7f,0x84,0x97,0x70,0x7a,0x97,0x5c,0x67,0x8a,0x8a,0x92,0xaa, 0x84,0x8b,0xa5,0x80,0x81,0x99,0x67,0x66,0x7b,0x63,0x62,0x79,0x62,0x62,0x7a,0x5e, 0x5c,0x72,0x58,0x53,0x69,0x5a,0x55,0x6a,0x5c,0x56,0x6c,0x58,0x53,0x6c,0x5b,0x52, 0x6e,0x67,0x61,0x7e,0x5b,0x59,0x74,0x46,0x4d,0x64,0x52,0x58,0x6d,0x5f,0x66,0x78, 0x70,0x76,0x86,0x6f,0x76,0x86,0x64,0x6b,0x7f,0x4c,0x52,0x6a,0x43,0x4a,0x5d,0x46, 0x4c,0x5e,0x3d,0x42,0x56,0x3c,0x40,0x55,0x37,0x3a,0x4e,0x32,0x36,0x47,0x30,0x32, 0x43,0x31,0x31,0x43,0x34,0x36,0x4a,0x36,0x37,0x4b,0x35,0x34,0x46,0x35,0x33,0x46, 0x35,0x33,0x46,0x34,0x33,0x46,0x36,0x35,0x48,0x43,0x3b,0x4a,0x45,0x3b,0x4a,0x5d, 0x52,0x69,0x58,0x4c,0x61,0x60,0x51,0x65,0x5f,0x69,0x87,0x5d,0x66,0x88,0x79,0x82, 0x9e,0x7d,0x85,0xa1,0x78,0x7f,0x9b,0x70,0x75,0x91,0x39,0x36,0x47,0x42,0x3e,0x52, 0x49,0x44,0x5a,0x4c,0x45,0x5a,0x4e,0x44,0x59,0x50,0x46,0x5b,0x53,0x48,0x5b,0x53, 0x47,0x5a,0x52,0x46,0x59,0x54,0x4a,0x5e,0x55,0x4b,0x63,0x57,0x4d,0x64,0x59,0x4d, 0x63,0x5a,0x4e,0x61,0x5b,0x4d,0x61,0x5d,0x51,0x66,0x5e,0x51,0x66,0x5e,0x52,0x69, 0x5a,0x52,0x6c,0x53,0x51,0x6c,0x52,0x5a,0x76,0x60,0x68,0x82,0x60,0x68,0x82,0x5c, 0x64,0x7f,0x5a,0x62,0x7e,0x5b,0x63,0x7e,0x62,0x69,0x82,0x5e,0x66,0x80,0x5a,0x61, 0x7b,0x4e,0x52,0x6c,0x4e,0x4a,0x62,0x50,0x44,0x56,0x4e,0x3f,0x4f,0x4e,0x3f,0x4e, 0x4e,0x40,0x50,0x54,0x44,0x56,0x52,0x42,0x54,0x4a,0x3b,0x4a,0x43,0x36,0x42,0x42, 0x33,0x40,0x42,0x33,0x40,0x3a,0x2d,0x36,0x38,0x2b,0x35,0x4e,0x3e,0x4d,0x56,0x44, 0x55,0x56,0x45,0x56,0x4a,0x3c,0x4c,0x43,0x37,0x44,0x3f,0x32,0x3f,0x3f,0x32,0x3f, 0x45,0x36,0x43,0x48,0x39,0x47,0x4d,0x3c,0x4b,0x58,0x47,0x59,0x44,0x36,0x42,0xc4, 0xc3,0xc8,0x78,0x82,0xa0,0x58,0x62,0x87,0x6b,0x76,0x97,0x6a,0x76,0x96,0x69,0x74, 0x95,0x63,0x6e,0x8f,0x5e,0x68,0x8b,0x50,0x5b,0x80,0x56,0x60,0x84,0x52,0x5d,0x7f, 0x13,0x15,0x1a,0x13,0x15,0x1a,0x49,0x48,0x65,0x50,0x52,0x77,0x50,0x50,0x76,0x50, 0x4f,0x75,0x51,0x4f,0x76,0x53,0x4f,0x75,0x57,0x51,0x75,0x58,0x51,0x76,0x5b,0x51, 0x77,0x5a,0x52,0x77,0x59,0x52,0x77,0x58,0x52,0x77,0x53,0x51,0x77,0x51,0x50,0x79, 0x51,0x59,0x82,0x58,0x63,0x88,0x80,0x87,0x9f,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x09, 0x0a,0x0c,0x0a,0x0a,0x0d,0x34,0x2c,0x36,0x59,0x48,0x5b,0x43,0x35,0x40,0x36,0x2b, 0x34,0xb8,0xbe,0xcd,0x7e,0x87,0xa6,0x5e,0x6a,0x8f,0x53,0x5e,0x86,0x4e,0x5a,0x82, 0x4e,0x58,0x7f,0x4a,0x53,0x78,0x44,0x4f,0x73,0x3f,0x47,0x6c,0x3c,0x44,0x65,0x39, 0x42,0x61,0x3a,0x3f,0x60,0x3d,0x40,0x62,0x40,0x48,0x69,0x45,0x4d,0x6f,0x4a,0x51, 0x76,0x37,0x3c,0x55,0x0d,0x0e,0x11,0x0d,0x0e,0x10,0x0c,0x0d,0x0f,0x0a,0x0b,0x0e, 0x53,0x58,0x70,0x52,0x50,0x79,0x5a,0x53,0x77,0x5c,0x53,0x77,0x52,0x56,0x7d,0x5f, 0x65,0x7e,0x0c,0x0d,0x10,0x0d,0x0e,0x11,0x0c,0x0d,0x10,0x0c,0x0d,0x0f,0x0b,0x0c, 0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d, 0x08,0x09,0x0b,0x08,0x09,0x0a,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x07,0x0a,0x06, 0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x05,0x06,0x8d,0x92,0xa0,0xbe,0xc3, 0xd2,0xcb,0xd0,0xdb,0xb9,0xbd,0xcd,0xdb,0xdf,0xe5,0x4e,0x46,0x4c,0x22,0x18,0x1c, 0x1a,0x12,0x16,0x22,0x18,0x1d,0x03,0x03,0x04,0x03,0x03,0x05,0x02,0x02,0x04,0x02, 0x02,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,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,0xcd, 0xcf,0xd3,0xba,0xc0,0xd0,0xac,0xb3,0xc8,0xb1,0xb7,0xca,0xb1,0xb7,0xca,0xb2,0xb8, 0xcb,0xb0,0xb7,0xca,0xb4,0xbb,0xce,0xbc,0xc5,0xdc,0x02,0x02,0x02,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0d,0x0e, 0x0e,0x0e,0x0e,0x04,0x03,0x05,0x06,0x06,0x07,0x0a,0x09,0x0b,0x0e,0x0b,0x0e,0x12, 0x0f,0x13,0x16,0x13,0x18,0x1c,0x18,0x1e,0x24,0x1e,0x27,0x2f,0x28,0x32,0x38,0x31, 0x3e,0x3f,0x37,0x48,0x46,0x3d,0x4e,0x48,0x42,0x56,0x4b,0x44,0x5a,0x4b,0x46,0x5e, 0x4a,0x47,0x62,0x4a,0x4a,0x65,0x4b,0x4a,0x64,0x4d,0x49,0x62,0x4f,0x49,0x61,0x4b, 0x48,0x60,0x49,0x46,0x60,0x48,0x4d,0x66,0x5e,0x65,0x77,0x69,0x6e,0x7e,0x67,0x6e, 0x7c,0x7b,0x7f,0x92,0x7e,0x87,0xa2,0x5e,0x5b,0x7d,0x62,0x59,0x75,0x50,0x49,0x60, 0x59,0x53,0x6b,0x51,0x4d,0x6e,0x5b,0x4e,0x6a,0x6b,0x6b,0x83,0x6d,0x66,0x71,0x29, 0x21,0x2c,0x25,0x1f,0x29,0x27,0x20,0x2b,0x4d,0x4d,0x5c,0x90,0x96,0xab,0x54,0x60, 0x84,0x7b,0x84,0x9f,0x81,0x84,0x9c,0x68,0x68,0x7b,0x67,0x68,0x7b,0x6f,0x70,0x88, 0x67,0x6d,0x87,0x66,0x6b,0x84,0x68,0x68,0x7f,0x67,0x65,0x7e,0x67,0x64,0x7d,0x59, 0x5b,0x76,0x50,0x4b,0x69,0x5d,0x58,0x72,0x6c,0x66,0x7f,0x3e,0x3f,0x55,0x44,0x4a, 0x5e,0x52,0x59,0x6b,0x5f,0x66,0x78,0x66,0x6c,0x7e,0x62,0x69,0x7d,0x59,0x5f,0x73, 0x4b,0x52,0x66,0x4d,0x54,0x68,0x41,0x46,0x5c,0x41,0x43,0x5b,0x3e,0x41,0x58,0x3a, 0x3f,0x53,0x36,0x3b,0x4e,0x33,0x39,0x4a,0x38,0x3d,0x4e,0x3a,0x3f,0x52,0x36,0x3c, 0x4e,0x34,0x35,0x48,0x33,0x33,0x46,0x35,0x37,0x4a,0x35,0x35,0x48,0x39,0x36,0x47, 0x3e,0x37,0x47,0x61,0x53,0x6b,0x59,0x4c,0x62,0x5e,0x4e,0x63,0x61,0x6c,0x8a,0x5c, 0x67,0x89,0x7b,0x84,0xa1,0x7e,0x85,0xa0,0x7b,0x80,0x9b,0x6e,0x73,0x90,0x32,0x32, 0x42,0x3c,0x3a,0x4d,0x47,0x42,0x58,0x50,0x48,0x5f,0x52,0x48,0x5e,0x52,0x48,0x5d, 0x53,0x4a,0x5e,0x56,0x4c,0x62,0x53,0x4a,0x61,0x4c,0x49,0x62,0x4e,0x4a,0x63,0x52, 0x4c,0x65,0x59,0x4e,0x64,0x59,0x4a,0x5c,0x5a,0x4c,0x5f,0x5a,0x4e,0x62,0x5b,0x4c, 0x5f,0x5a,0x4a,0x5c,0x5b,0x4c,0x5f,0x5c,0x4e,0x62,0x52,0x50,0x6c,0x56,0x5e,0x7a, 0x59,0x61,0x7d,0x5a,0x62,0x7d,0x5a,0x62,0x7e,0x5d,0x65,0x7f,0x5d,0x65,0x80,0x56, 0x5e,0x7b,0x52,0x58,0x76,0x52,0x51,0x6f,0x5c,0x52,0x6b,0x59,0x4b,0x5e,0x51,0x42, 0x52,0x4e,0x3f,0x4f,0x4e,0x3f,0x4f,0x50,0x41,0x52,0x53,0x43,0x55,0x54,0x44,0x56, 0x4e,0x3f,0x4f,0x46,0x37,0x45,0x40,0x32,0x3e,0x3e,0x30,0x3c,0x3d,0x2f,0x3a,0x40, 0x33,0x3f,0x58,0x45,0x56,0x5b,0x49,0x5b,0x52,0x44,0x54,0x4b,0x3d,0x4c,0x44,0x38, 0x45,0x43,0x35,0x42,0x46,0x37,0x44,0x4a,0x3b,0x49,0x4d,0x3c,0x4b,0x54,0x45,0x55, 0x4f,0x40,0x4f,0x7b,0x74,0x7c,0x96,0x9f,0xb4,0x59,0x64,0x88,0x64,0x6f,0x91,0x6c, 0x76,0x96,0x69,0x74,0x95,0x64,0x6f,0x90,0x5c,0x68,0x8b,0x50,0x5a,0x7f,0x56,0x61, 0x85,0x4e,0x57,0x78,0x13,0x15,0x1a,0x14,0x16,0x1a,0x49,0x48,0x64,0x50,0x51,0x77, 0x50,0x4f,0x75,0x50,0x4e,0x75,0x51,0x4f,0x74,0x52,0x4e,0x74,0x57,0x50,0x75,0x59, 0x51,0x76,0x5b,0x52,0x76,0x5a,0x52,0x77,0x59,0x52,0x77,0x59,0x52,0x77,0x53,0x51, 0x77,0x51,0x50,0x79,0x52,0x59,0x80,0x56,0x62,0x87,0x7d,0x84,0xa1,0x0a,0x0b,0x0e, 0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x29,0x23,0x2b,0x5c,0x4a,0x5d,0x48, 0x3a,0x46,0x33,0x28,0x32,0xb8,0xbe,0xcd,0x7f,0x88,0xa6,0x5d,0x69,0x8f,0x52,0x5c, 0x84,0x4e,0x5b,0x82,0x4d,0x55,0x7e,0x4a,0x54,0x79,0x44,0x4e,0x73,0x41,0x49,0x6d, 0x3c,0x44,0x66,0x3a,0x41,0x61,0x3a,0x40,0x60,0x3d,0x40,0x63,0x40,0x47,0x69,0x45, 0x4d,0x6f,0x49,0x51,0x75,0x37,0x39,0x52,0x0e,0x0e,0x12,0x0e,0x10,0x12,0x0d,0x0e, 0x10,0x0b,0x0c,0x0e,0x35,0x3c,0x50,0x52,0x58,0x80,0x56,0x51,0x77,0x5a,0x53,0x77, 0x57,0x51,0x77,0x56,0x62,0x87,0x12,0x14,0x19,0x0d,0x0e,0x11,0x0c,0x0d,0x10,0x0c, 0x0d,0x10,0x0c,0x0d,0x10,0x0b,0x0c,0x0f,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a, 0x0e,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x06,0x07,0x0a, 0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x07,0x09,0x06,0x07,0x09,0x40,0x43,0x4c,0xbb, 0xc0,0xcf,0xd2,0xd6,0xdf,0xd0,0xd5,0xdf,0xd9,0xdb,0xe3,0x9a,0x94,0x99,0x30,0x24, 0x2b,0x22,0x18,0x1d,0x22,0x18,0x1d,0x09,0x07,0x0a,0x03,0x03,0x05,0x03,0x03,0x05, 0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 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,0x44,0x44,0x44,0xcc,0xd2,0xde,0xb0,0xb8,0xcb,0xb0,0xb7,0xca,0xaf, 0xb7,0xc9,0xb1,0xb9,0xcb,0xb1,0xb8,0xcb,0xb1,0xb7,0xcb,0xb7,0xbf,0xd5,0x6b,0x6b, 0x6b,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x00,0x00,0x00,0x07,0x07,0x07,0x1d,0x1d,0x1d,0x10,0x10,0x11,0x04,0x04, 0x04,0x16,0x16,0x17,0x17,0x17,0x18,0x06,0x06,0x06,0x0b,0x0a,0x0c,0x12,0x0e,0x12, 0x16,0x12,0x16,0x18,0x14,0x19,0x1a,0x16,0x1c,0x22,0x1c,0x24,0x28,0x22,0x2a,0x31, 0x29,0x34,0x3d,0x35,0x44,0x3c,0x3a,0x4e,0x3e,0x3c,0x52,0x41,0x43,0x5a,0x45,0x42, 0x59,0x4a,0x44,0x5a,0x4e,0x46,0x5d,0x4a,0x48,0x61,0x4b,0x4a,0x64,0x4b,0x49,0x63, 0x4d,0x49,0x62,0x4b,0x4a,0x64,0x4d,0x4b,0x66,0x4a,0x49,0x63,0x51,0x59,0x70,0x6a, 0x71,0x81,0x76,0x7a,0x88,0x83,0x86,0x96,0x96,0x9d,0xb2,0x8b,0x8d,0xa2,0x64,0x6e, 0x8c,0x60,0x59,0x73,0x4e,0x4b,0x61,0x53,0x4e,0x68,0x58,0x4d,0x68,0x60,0x60,0x7c, 0x8f,0x89,0x94,0x2a,0x23,0x2f,0x29,0x21,0x2c,0x2b,0x23,0x31,0x31,0x2d,0x38,0x95, 0x99,0xaf,0x65,0x70,0x91,0x5f,0x6a,0x8c,0x81,0x87,0xa1,0x7c,0x7d,0x95,0x7a,0x7b, 0x94,0x6b,0x72,0x8d,0x6c,0x76,0x8d,0x6b,0x74,0x8a,0x66,0x6f,0x86,0x62,0x6b,0x83, 0x62,0x6a,0x83,0x5f,0x68,0x82,0x4c,0x4f,0x70,0x55,0x55,0x74,0x5f,0x62,0x7f,0x45, 0x4a,0x5d,0x3b,0x41,0x52,0x42,0x48,0x5b,0x4a,0x50,0x62,0x55,0x5b,0x6e,0x5c,0x63, 0x76,0x61,0x67,0x7b,0x5a,0x61,0x75,0x50,0x56,0x6a,0x46,0x4c,0x60,0x3e,0x44,0x59, 0x3b,0x41,0x56,0x3b,0x41,0x55,0x3c,0x42,0x55,0x39,0x3f,0x52,0x34,0x39,0x4b,0x35, 0x3a,0x4b,0x39,0x3e,0x4f,0x37,0x3c,0x4e,0x32,0x36,0x47,0x39,0x3e,0x50,0x3d,0x42, 0x55,0x39,0x38,0x4d,0x33,0x32,0x45,0x5a,0x50,0x68,0x58,0x4b,0x5f,0x5e,0x4e,0x63, 0x70,0x76,0x91,0x58,0x63,0x86,0x74,0x7f,0x9c,0x7f,0x86,0xa1,0x7d,0x82,0x9d,0x71, 0x75,0x92,0x34,0x33,0x45,0x37,0x36,0x4a,0x40,0x3e,0x55,0x4a,0x45,0x5d,0x4e,0x47, 0x5e,0x4f,0x48,0x60,0x4e,0x49,0x61,0x4d,0x48,0x61,0x48,0x46,0x5f,0x47,0x46,0x60, 0x46,0x46,0x5e,0x47,0x46,0x5e,0x56,0x4c,0x62,0x5a,0x4e,0x64,0x5a,0x4e,0x64,0x5a, 0x4e,0x62,0x5a,0x4c,0x5f,0x59,0x49,0x5c,0x58,0x49,0x5a,0x58,0x48,0x5a,0x5b,0x4e, 0x62,0x5c,0x51,0x6a,0x56,0x50,0x6b,0x52,0x51,0x6e,0x51,0x54,0x71,0x52,0x53,0x71, 0x52,0x50,0x6e,0x57,0x52,0x6c,0x5d,0x52,0x6b,0x5e,0x52,0x6a,0x5e,0x52,0x6a,0x57, 0x4c,0x62,0x56,0x47,0x59,0x4c,0x3d,0x4c,0x4a,0x3b,0x4a,0x4b,0x3e,0x4c,0x50,0x42, 0x52,0x57,0x46,0x59,0x58,0x47,0x59,0x4a,0x3b,0x4a,0x41,0x32,0x3e,0x41,0x33,0x3e, 0x44,0x36,0x42,0x45,0x36,0x43,0x55,0x44,0x55,0x64,0x50,0x64,0x5a,0x49,0x5b,0x51, 0x42,0x53,0x49,0x3a,0x4b,0x44,0x37,0x45,0x47,0x39,0x47,0x4c,0x3c,0x4a,0x4e,0x3f, 0x4d,0x52,0x42,0x51,0x58,0x47,0x59,0x49,0x3d,0x49,0xac,0xaf,0xbc,0x68,0x74,0x95, 0x5a,0x64,0x8a,0x68,0x74,0x94,0x67,0x72,0x92,0x61,0x6d,0x8e,0x5c,0x68,0x8a,0x51, 0x5b,0x80,0x58,0x62,0x85,0x4a,0x53,0x71,0x14,0x15,0x1a,0x14,0x16,0x1a,0x3d,0x3d, 0x55,0x4f,0x51,0x76,0x50,0x4e,0x75,0x50,0x4e,0x74,0x51,0x4e,0x75,0x54,0x4e,0x75, 0x57,0x50,0x75,0x55,0x4f,0x75,0x5a,0x51,0x76,0x5a,0x51,0x76,0x5a,0x52,0x77,0x59, 0x52,0x77,0x55,0x50,0x77,0x51,0x4f,0x79,0x51,0x57,0x80,0x54,0x60,0x86,0x72,0x7c, 0x99,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x21,0x1c,0x23, 0x5e,0x4d,0x60,0x46,0x38,0x45,0x31,0x26,0x2f,0xb4,0xba,0xc8,0x80,0x8a,0xa7,0x60, 0x6b,0x90,0x54,0x5e,0x87,0x4f,0x5b,0x82,0x4d,0x57,0x7c,0x4a,0x54,0x7a,0x46,0x4f, 0x71,0x41,0x49,0x6d,0x3c,0x46,0x66,0x39,0x43,0x63,0x3a,0x3f,0x60,0x3d,0x40,0x62, 0x3f,0x46,0x67,0x45,0x4a,0x6e,0x4a,0x51,0x76,0x37,0x36,0x50,0x0e,0x10,0x12,0x0f, 0x11,0x14,0x0e,0x0e,0x12,0x0d,0x0e,0x11,0x0a,0x0b,0x0e,0x5b,0x65,0x84,0x53,0x53, 0x7b,0x5b,0x53,0x77,0x5b,0x53,0x77,0x52,0x54,0x7b,0x55,0x59,0x6f,0x0d,0x0e,0x11, 0x0d,0x0e,0x10,0x0e,0x0e,0x12,0x0c,0x0d,0x10,0x0c,0x0d,0x10,0x0c,0x0d,0x0f,0x0b, 0x0c,0x0f,0x0a,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x08,0x09, 0x0b,0x07,0x08,0x0a,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x07,0x0a,0x0b,0x0b,0x0f, 0x6f,0x7b,0x99,0xb3,0xb8,0xca,0xdd,0xe0,0xe6,0xf2,0xf3,0xf4,0xd8,0xd6,0xd9,0x39, 0x2d,0x36,0x2c,0x20,0x28,0x25,0x1b,0x20,0x23,0x19,0x20,0x03,0x04,0x05,0x03,0x04, 0x05,0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04, 0x02,0x02,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 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,0x02,0x02,0x02,0xd6,0xd8,0xdd,0xb9,0xbf,0xd0, 0xaf,0xb5,0xc9,0xb0,0xb7,0xca,0xb2,0xb9,0xcb,0xb2,0xb9,0xcb,0xb1,0xb8,0xca,0xb2, 0xb9,0xcc,0xe5,0xef,0xff,0x0d,0x0d,0x0d,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, 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,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,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x04,0x04,0x13,0x13,0x13,0x1c, 0x1c,0x1d,0x24,0x24,0x24,0x1e,0x1e,0x1e,0x18,0x18,0x19,0x08,0x06,0x08,0x10,0x0d, 0x10,0x19,0x14,0x1a,0x1e,0x18,0x1e,0x20,0x1a,0x21,0x22,0x1c,0x23,0x28,0x22,0x2a, 0x30,0x29,0x33,0x37,0x2e,0x3a,0x3e,0x36,0x45,0x3d,0x3a,0x4e,0x3f,0x45,0x59,0x47, 0x4c,0x5f,0x43,0x46,0x5b,0x44,0x42,0x5a,0x4c,0x44,0x5a,0x4e,0x47,0x5e,0x4c,0x4a, 0x66,0x4c,0x4a,0x64,0x4b,0x49,0x62,0x4a,0x49,0x62,0x4b,0x49,0x63,0x4c,0x4e,0x68, 0x50,0x57,0x70,0x64,0x6b,0x7f,0x7a,0x7f,0x8d,0x8e,0x91,0x9b,0xac,0xb0,0xbf,0xb3, 0xb3,0xc0,0x9e,0x9f,0xb0,0x5e,0x68,0x88,0x54,0x50,0x68,0x4b,0x46,0x60,0x56,0x49, 0x61,0x59,0x5c,0x79,0x9a,0x96,0xa3,0x2c,0x25,0x30,0x2a,0x24,0x30,0x2f,0x26,0x34, 0x30,0x28,0x36,0x72,0x76,0x86,0x82,0x8a,0xa3,0x53,0x5f,0x83,0x80,0x89,0xa2,0x79, 0x83,0x9c,0x76,0x7e,0x98,0x74,0x7e,0x96,0x72,0x7a,0x92,0x71,0x79,0x92,0x70,0x77, 0x8e,0x6e,0x76,0x8d,0x6a,0x72,0x8a,0x6a,0x72,0x8b,0x56,0x60,0x7d,0x4f,0x54,0x73, 0x5d,0x66,0x81,0x5f,0x65,0x77,0x3d,0x41,0x4e,0x3e,0x43,0x52,0x40,0x46,0x56,0x46, 0x4a,0x5a,0x4d,0x52,0x62,0x5a,0x5f,0x71,0x5f,0x66,0x79,0x5c,0x62,0x76,0x59,0x5f, 0x72,0x43,0x4a,0x5f,0x3b,0x3f,0x55,0x3a,0x3e,0x52,0x3e,0x43,0x59,0x3f,0x46,0x5a, 0x3a,0x3f,0x52,0x33,0x37,0x49,0x38,0x3e,0x4e,0x39,0x3e,0x4e,0x33,0x38,0x48,0x35, 0x3a,0x4a,0x40,0x46,0x56,0x3c,0x42,0x54,0x36,0x36,0x4a,0x50,0x48,0x5f,0x58,0x4b, 0x5f,0x5e,0x4f,0x62,0x88,0x89,0x9b,0x58,0x62,0x87,0x79,0x82,0xa0,0x7e,0x86,0xa2, 0x7d,0x83,0x9e,0x6f,0x75,0x92,0x35,0x36,0x47,0x37,0x37,0x4c,0x3e,0x3e,0x55,0x42, 0x42,0x5a,0x44,0x42,0x5a,0x45,0x43,0x5c,0x46,0x44,0x5d,0x46,0x44,0x5d,0x44,0x43, 0x5b,0x42,0x44,0x5c,0x4a,0x50,0x66,0x46,0x4c,0x62,0x46,0x43,0x5d,0x4f,0x49,0x61, 0x6e,0x65,0x79,0x6e,0x66,0x79,0x6b,0x62,0x74,0x64,0x5a,0x6d,0x5a,0x4c,0x60,0x59, 0x4a,0x5e,0x57,0x47,0x5a,0x58,0x4b,0x5e,0x5a,0x4e,0x66,0x4f,0x4e,0x6a,0x50,0x4e, 0x6b,0x53,0x4e,0x6a,0x5b,0x50,0x66,0x5a,0x4e,0x62,0x5b,0x4f,0x64,0x5c,0x51,0x69, 0x53,0x4b,0x62,0x4e,0x46,0x5b,0x58,0x4a,0x5d,0x49,0x3b,0x49,0x42,0x34,0x41,0x3c, 0x31,0x3e,0x42,0x36,0x45,0x4b,0x3c,0x4c,0x4c,0x3d,0x4b,0x41,0x32,0x3f,0x3f,0x31, 0x3d,0x41,0x32,0x3e,0x44,0x35,0x42,0x46,0x37,0x45,0x4c,0x3c,0x4d,0x63,0x50,0x65, 0x62,0x50,0x64,0x54,0x44,0x55,0x4c,0x3d,0x4d,0x49,0x3a,0x49,0x49,0x3c,0x4a,0x4d, 0x3d,0x4c,0x50,0x3f,0x4f,0x52,0x42,0x51,0x58,0x47,0x59,0x4f,0x40,0x4f,0x88,0x81, 0x8a,0x83,0x8e,0xa8,0x5a,0x67,0x8a,0x67,0x71,0x93,0x68,0x74,0x93,0x64,0x6e,0x90, 0x5d,0x67,0x8b,0x51,0x55,0x7c,0x55,0x61,0x84,0x45,0x4e,0x6b,0x12,0x14,0x19,0x13, 0x15,0x1a,0x32,0x31,0x45,0x3f,0x40,0x5f,0x4f,0x4e,0x74,0x50,0x4e,0x74,0x51,0x4e, 0x75,0x53,0x4e,0x74,0x56,0x50,0x75,0x57,0x50,0x75,0x5a,0x50,0x76,0x5a,0x51,0x76, 0x5a,0x52,0x77,0x5b,0x51,0x77,0x53,0x50,0x77,0x51,0x4f,0x78,0x51,0x55,0x7e,0x53, 0x5e,0x85,0x70,0x7b,0x9a,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a, 0x0d,0x17,0x15,0x1a,0x5e,0x4d,0x60,0x47,0x39,0x46,0x32,0x28,0x31,0xb3,0xb7,0xc5, 0x81,0x8b,0xa9,0x5e,0x6b,0x8f,0x55,0x61,0x88,0x4f,0x5b,0x84,0x4e,0x58,0x7f,0x4b, 0x55,0x7a,0x47,0x52,0x75,0x41,0x4b,0x6d,0x3e,0x47,0x69,0x3a,0x42,0x63,0x3a,0x40, 0x61,0x3b,0x40,0x5f,0x40,0x47,0x68,0x45,0x4a,0x6d,0x4a,0x4b,0x70,0x37,0x38,0x50, 0x0f,0x11,0x14,0x11,0x12,0x16,0x10,0x11,0x15,0x0e,0x10,0x12,0x0d,0x0e,0x11,0x5d, 0x5e,0x6a,0x58,0x63,0x87,0x53,0x50,0x77,0x5c,0x53,0x77,0x54,0x51,0x77,0x5f,0x6a, 0x8c,0x0d,0x0e,0x11,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0d,0x0e,0x11, 0x0c,0x0d,0x10,0x0c,0x0d,0x0f,0x0a,0x0c,0x0e,0x0a,0x0c,0x0e,0x0a,0x0a,0x0d,0x0a, 0x0a,0x0d,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x07,0x08,0x0a,0x07,0x08, 0x0a,0x24,0x21,0x2f,0x50,0x4e,0x79,0x8b,0x95,0xaf,0xd0,0xd4,0xdd,0xf1,0xf2,0xf2, 0x4d,0x41,0x4b,0x38,0x2c,0x36,0x2a,0x1e,0x26,0x2d,0x21,0x28,0x0e,0x0b,0x0e,0x04, 0x05,0x06,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03, 0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x57,0x57, 0x57,0xc9,0xce,0xda,0xac,0xb3,0xc8,0xad,0xb4,0xc9,0xaf,0xb7,0xc9,0xb1,0xb8,0xcb, 0xb0,0xb7,0xca,0xb1,0xb7,0xcb,0xc7,0xce,0xe6,0x95,0x95,0x95,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x00,0x00,0x00,0x0d,0x0d,0x0e,0x17,0x17,0x17,0x0f,0x0f,0x10,0x0a, 0x08,0x0a,0x14,0x10,0x14,0x1e,0x18,0x1e,0x23,0x1d,0x24,0x24,0x1e,0x25,0x26,0x20, 0x28,0x2a,0x22,0x2b,0x2f,0x27,0x32,0x36,0x2e,0x3a,0x3d,0x33,0x43,0x3e,0x38,0x49, 0x3c,0x3b,0x51,0x41,0x43,0x59,0x42,0x44,0x5a,0x43,0x40,0x57,0x49,0x42,0x58,0x4a, 0x44,0x5a,0x4c,0x48,0x60,0x4f,0x4c,0x66,0x50,0x4a,0x62,0x4e,0x48,0x60,0x4b,0x48, 0x62,0x4d,0x4d,0x68,0x54,0x5b,0x76,0x5e,0x65,0x7c,0x68,0x6e,0x82,0x7d,0x81,0x8d, 0xa8,0xab,0xb9,0xb4,0xb7,0xc5,0xbe,0xbc,0xc7,0x9d,0xa2,0xb2,0x51,0x56,0x73,0x4e, 0x4d,0x66,0x51,0x45,0x5d,0x55,0x55,0x72,0x89,0x88,0x98,0x35,0x2d,0x39,0x2a,0x22, 0x2e,0x2f,0x27,0x35,0x32,0x29,0x38,0x40,0x40,0x4c,0x93,0x98,0xad,0x59,0x63,0x86, 0x73,0x7c,0x9a,0x81,0x89,0xa2,0x79,0x82,0x9b,0x78,0x81,0x99,0x74,0x7c,0x96,0x74, 0x7e,0x96,0x74,0x7c,0x95,0x73,0x7b,0x94,0x70,0x79,0x91,0x71,0x79,0x91,0x66,0x6f, 0x89,0x57,0x5b,0x79,0x5f,0x68,0x84,0x6e,0x76,0x8b,0x3d,0x41,0x4d,0x3d,0x42,0x4e, 0x3e,0x42,0x4f,0x3a,0x3f,0x4e,0x3b,0x40,0x51,0x3e,0x44,0x56,0x4a,0x50,0x63,0x51, 0x57,0x6a,0x52,0x58,0x6d,0x42,0x49,0x60,0x3e,0x3f,0x56,0x3e,0x3e,0x54,0x43,0x46, 0x5e,0x45,0x4a,0x63,0x40,0x46,0x5b,0x3a,0x3f,0x52,0x3b,0x41,0x52,0x40,0x46,0x58, 0x3d,0x42,0x53,0x38,0x3d,0x4e,0x37,0x3d,0x4e,0x42,0x46,0x56,0x3c,0x42,0x52,0x40, 0x40,0x53,0x5c,0x4f,0x63,0x60,0x50,0x64,0x90,0x89,0x9a,0x5a,0x65,0x89,0x76,0x7f, 0x9e,0x7b,0x83,0xa1,0x7d,0x85,0xa0,0x73,0x79,0x96,0x37,0x3a,0x4c,0x3a,0x3d,0x51, 0x40,0x43,0x5a,0x43,0x44,0x5d,0x44,0x43,0x5c,0x42,0x42,0x5a,0x42,0x43,0x5c,0x42, 0x46,0x5e,0x50,0x57,0x6d,0x6e,0x73,0x84,0x83,0x87,0x93,0x7f,0x83,0x8e,0x5a,0x5f, 0x72,0x46,0x47,0x5e,0x40,0x3f,0x54,0x41,0x3f,0x55,0x4c,0x4a,0x5e,0x60,0x5c,0x71, 0x68,0x64,0x79,0x56,0x4c,0x61,0x72,0x69,0x78,0x54,0x48,0x5b,0x55,0x48,0x5c,0x67, 0x5d,0x71,0x69,0x5f,0x73,0x61,0x53,0x65,0x58,0x48,0x5b,0x56,0x47,0x59,0x59,0x4a, 0x5e,0x5a,0x4e,0x65,0x4e,0x46,0x5b,0x4a,0x42,0x55,0x51,0x42,0x53,0x43,0x37,0x43, 0x3b,0x32,0x3f,0x3a,0x30,0x3e,0x35,0x2d,0x38,0x34,0x2c,0x36,0x34,0x2b,0x35,0x3a, 0x2d,0x36,0x3b,0x2e,0x38,0x3f,0x32,0x3d,0x42,0x35,0x41,0x47,0x38,0x46,0x4a,0x3c, 0x4b,0x50,0x41,0x52,0x67,0x55,0x6a,0x5b,0x4a,0x5d,0x50,0x40,0x50,0x4d,0x3e,0x4e, 0x4d,0x3d,0x4d,0x4e,0x3e,0x4e,0x51,0x41,0x51,0x54,0x43,0x53,0x56,0x44,0x56,0x56, 0x45,0x56,0x4f,0x43,0x4f,0x9e,0xa4,0xb6,0x69,0x74,0x94,0x60,0x6a,0x8d,0x67,0x71, 0x92,0x64,0x6f,0x90,0x5d,0x68,0x8a,0x50,0x55,0x7b,0x54,0x60,0x84,0x40,0x49,0x65, 0x12,0x14,0x19,0x12,0x14,0x1a,0x30,0x2f,0x42,0x2d,0x2d,0x44,0x41,0x3f,0x60,0x4f, 0x4d,0x74,0x52,0x4e,0x73,0x52,0x4e,0x74,0x56,0x50,0x75,0x59,0x50,0x75,0x5b,0x50, 0x76,0x5a,0x50,0x76,0x5a,0x51,0x77,0x5b,0x51,0x77,0x54,0x4f,0x76,0x51,0x4f,0x78, 0x50,0x55,0x7d,0x52,0x5d,0x83,0x6e,0x79,0x98,0x0f,0x10,0x13,0x0b,0x0c,0x0f,0x0a, 0x0b,0x0e,0x0a,0x0a,0x0d,0x10,0x0f,0x14,0x5f,0x4d,0x61,0x42,0x34,0x40,0x34,0x2a, 0x33,0xb4,0xb7,0xc5,0x83,0x8c,0xaa,0x60,0x6b,0x90,0x54,0x60,0x88,0x4f,0x5c,0x84, 0x4d,0x58,0x80,0x4c,0x55,0x79,0x47,0x52,0x75,0x41,0x4c,0x6e,0x3d,0x48,0x69,0x3a, 0x42,0x63,0x3b,0x40,0x61,0x3a,0x3f,0x60,0x3f,0x45,0x68,0x45,0x49,0x6e,0x4a,0x4a, 0x6e,0x38,0x37,0x51,0x12,0x12,0x16,0x12,0x14,0x18,0x12,0x13,0x17,0x11,0x12,0x16, 0x0e,0x0f,0x12,0x11,0x11,0x15,0x7f,0x87,0xa2,0x51,0x54,0x7b,0x5c,0x53,0x77,0x5a, 0x53,0x77,0x52,0x5d,0x84,0x44,0x46,0x56,0x0d,0x0e,0x11,0x0e,0x0f,0x12,0x0e,0x0e, 0x12,0x0d,0x0e,0x11,0x0d,0x0e,0x11,0x0c,0x0d,0x10,0x0c,0x0d,0x10,0x0b,0x0c,0x0e, 0x0b,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x08,0x09,0x0b,0x08, 0x09,0x0b,0x07,0x08,0x0a,0x26,0x22,0x2c,0x61,0x52,0x73,0x50,0x59,0x81,0xd7,0xdb, 0xe3,0x7f,0x7a,0x7e,0x3c,0x30,0x3a,0x35,0x28,0x32,0x2c,0x20,0x29,0x2d,0x22,0x2b, 0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04, 0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03, 0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,0x05,0x05,0x05,0xdd,0xe0,0xe7,0xb3,0xb9,0xcc,0xac,0xb4,0xc8,0xaf,0xb7, 0xc9,0xaf,0xb5,0xc9,0xb1,0xb8,0xcb,0xb0,0xb7,0xca,0xb8,0xc0,0xd6,0xf5,0xff,0xff, 0x19,0x19,0x19,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,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,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,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x02, 0x03,0x02,0x02,0x02,0x1a,0x1a,0x1a,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03, 0x05,0x04,0x05,0x0a,0x09,0x0b,0x13,0x10,0x14,0x1b,0x16,0x1c,0x23,0x1e,0x26,0x24, 0x1f,0x27,0x26,0x22,0x2a,0x2c,0x25,0x2e,0x30,0x29,0x33,0x34,0x2d,0x39,0x38,0x30, 0x3e,0x3a,0x33,0x43,0x3a,0x36,0x4a,0x3e,0x3a,0x50,0x42,0x41,0x59,0x43,0x40,0x56, 0x48,0x40,0x53,0x4b,0x43,0x56,0x4c,0x45,0x5b,0x52,0x4a,0x61,0x56,0x4d,0x64,0x53, 0x4c,0x63,0x50,0x4b,0x63,0x4e,0x4c,0x67,0x4e,0x55,0x71,0x56,0x5d,0x77,0x65,0x6c, 0x82,0x7a,0x7f,0x8d,0x99,0x9d,0xac,0x97,0x9e,0xb1,0xad,0xad,0xbb,0x9d,0xa2,0xb2, 0x64,0x6c,0x86,0x4c,0x4e,0x69,0x4c,0x42,0x5b,0x54,0x54,0x70,0x87,0x85,0x94,0x42, 0x3c,0x48,0x2b,0x24,0x2f,0x2f,0x26,0x34,0x33,0x2a,0x39,0x28,0x22,0x2e,0x93,0x98, 0xaa,0x78,0x81,0x9d,0x62,0x6c,0x8d,0x85,0x8e,0xa6,0x7d,0x86,0xa0,0x7b,0x84,0x9e, 0x7a,0x83,0x9d,0x79,0x82,0x9c,0x7b,0x83,0x9b,0x78,0x80,0x99,0x74,0x7e,0x96,0x72, 0x7b,0x93,0x71,0x79,0x92,0x59,0x61,0x7f,0x5b,0x63,0x81,0x6f,0x78,0x90,0x4e,0x52, 0x5e,0x3b,0x3f,0x4a,0x3a,0x3e,0x4b,0x33,0x36,0x48,0x3c,0x39,0x4d,0x42,0x3e,0x52, 0x3e,0x3d,0x53,0x3d,0x3e,0x55,0x3e,0x41,0x57,0x3e,0x3f,0x56,0x3d,0x3e,0x54,0x3e, 0x40,0x57,0x42,0x44,0x5c,0x46,0x49,0x62,0x42,0x47,0x5e,0x3e,0x44,0x58,0x3e,0x43, 0x56,0x41,0x47,0x5a,0x45,0x4a,0x5e,0x46,0x4c,0x5c,0x46,0x4c,0x5a,0x42,0x47,0x56, 0x42,0x46,0x54,0x39,0x3c,0x47,0x5f,0x53,0x66,0x61,0x50,0x63,0x79,0x70,0x85,0x59, 0x65,0x89,0x79,0x84,0xa2,0x78,0x81,0x9f,0x76,0x7e,0x9c,0x72,0x7a,0x96,0x3d,0x42, 0x55,0x3f,0x46,0x5b,0x45,0x4a,0x63,0x47,0x4b,0x64,0x46,0x48,0x61,0x42,0x42,0x5a, 0x40,0x42,0x5a,0x47,0x4e,0x66,0x6e,0x74,0x86,0x90,0x95,0xa1,0x9e,0xa2,0xaa,0x8e, 0x92,0x9e,0x65,0x6a,0x7f,0x4a,0x50,0x69,0x47,0x4a,0x64,0x40,0x3f,0x56,0x3e,0x3c, 0x52,0x3e,0x3d,0x53,0x59,0x58,0x6c,0x6a,0x67,0x7a,0x53,0x4e,0x63,0x4e,0x45,0x5a, 0x51,0x46,0x5a,0x55,0x49,0x5a,0x61,0x54,0x63,0x68,0x5d,0x6b,0x6b,0x5f,0x6f,0x65, 0x59,0x69,0x58,0x4a,0x5c,0x59,0x4a,0x5e,0x4b,0x42,0x53,0x46,0x3b,0x4c,0x46,0x39, 0x46,0x3f,0x33,0x40,0x41,0x36,0x45,0x44,0x3a,0x49,0x3e,0x34,0x41,0x32,0x2a,0x36, 0x32,0x2a,0x35,0x34,0x2a,0x36,0x3c,0x2e,0x3a,0x3c,0x2e,0x3a,0x3e,0x30,0x3c,0x42, 0x33,0x40,0x49,0x3a,0x48,0x4a,0x3c,0x4b,0x57,0x49,0x5c,0x63,0x51,0x66,0x58,0x47, 0x59,0x52,0x43,0x53,0x52,0x42,0x52,0x51,0x41,0x51,0x52,0x41,0x52,0x54,0x43,0x53, 0x56,0x44,0x56,0x58,0x47,0x59,0x4f,0x40,0x4f,0x92,0x8e,0x99,0x79,0x83,0xa0,0x59, 0x64,0x88,0x62,0x6c,0x8e,0x64,0x6f,0x90,0x5b,0x67,0x89,0x50,0x52,0x78,0x55,0x60, 0x84,0x3d,0x45,0x5e,0x13,0x15,0x1a,0x12,0x14,0x1a,0x30,0x2e,0x41,0x2d,0x2b,0x44, 0x2c,0x29,0x41,0x4b,0x4a,0x6e,0x52,0x4e,0x74,0x53,0x4e,0x74,0x57,0x50,0x74,0x58, 0x50,0x75,0x5a,0x50,0x76,0x5a,0x51,0x77,0x5b,0x51,0x77,0x5a,0x51,0x77,0x54,0x4f, 0x76,0x51,0x4f,0x78,0x50,0x54,0x7d,0x52,0x5d,0x83,0x6c,0x76,0x97,0x1c,0x1c,0x21, 0x0b,0x0c,0x0f,0x0b,0x0c,0x0f,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x5a,0x4a,0x5d,0x44, 0x36,0x42,0x36,0x2a,0x33,0xac,0xaf,0xbe,0x82,0x8c,0xa8,0x60,0x6a,0x8f,0x54,0x5e, 0x87,0x51,0x5c,0x83,0x4f,0x5a,0x80,0x4c,0x55,0x7b,0x46,0x50,0x75,0x41,0x4d,0x70, 0x3e,0x49,0x69,0x3a,0x41,0x63,0x3b,0x40,0x60,0x3a,0x40,0x60,0x3f,0x45,0x67,0x42, 0x48,0x6b,0x49,0x4a,0x6d,0x39,0x38,0x52,0x15,0x16,0x1a,0x15,0x16,0x1a,0x15,0x16, 0x1a,0x12,0x14,0x18,0x11,0x12,0x15,0x0e,0x0e,0x12,0x74,0x73,0x80,0x58,0x64,0x88, 0x56,0x50,0x77,0x5c,0x53,0x77,0x52,0x50,0x78,0x61,0x68,0x88,0x0d,0x0e,0x11,0x0e, 0x0f,0x12,0x0d,0x0e,0x12,0x0e,0x0e,0x12,0x0d,0x0e,0x11,0x0d,0x0e,0x11,0x0c,0x0d, 0x0f,0x0c,0x0d,0x10,0x0b,0x0c,0x0f,0x0b,0x0c,0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0d, 0x0a,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x0a,0x0c,0x2c,0x24,0x33,0x61,0x4e,0x6b,0x5c, 0x51,0x76,0xa9,0xaa,0xb4,0x35,0x29,0x31,0x3d,0x2f,0x3a,0x32,0x26,0x30,0x3d,0x2f, 0x3a,0x18,0x13,0x19,0x05,0x05,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06, 0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x03, 0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x7c,0x7c,0x7d,0xbe,0xc3,0xd3,0xac, 0xb2,0xc8,0xac,0xb3,0xc8,0xaf,0xb7,0xc9,0xaf,0xb5,0xc9,0xb0,0xb8,0xcb,0xb2,0xb8, 0xcd,0xcd,0xd5,0xee,0xbc,0xbc,0xbc,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,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,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, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x04,0x27,0x26,0x27,0x03,0x02,0x03,0x03,0x03, 0x04,0x04,0x03,0x04,0x07,0x06,0x07,0x0e,0x0b,0x0e,0x15,0x11,0x16,0x1b,0x16,0x1c, 0x20,0x1c,0x23,0x25,0x20,0x29,0x2a,0x25,0x2f,0x2d,0x26,0x30,0x31,0x29,0x34,0x36, 0x2e,0x3a,0x3a,0x32,0x42,0x37,0x30,0x3e,0x3b,0x36,0x45,0x3b,0x39,0x4d,0x42,0x3f, 0x54,0x48,0x42,0x57,0x49,0x41,0x53,0x4a,0x41,0x54,0x4e,0x43,0x58,0x50,0x46,0x5d, 0x54,0x4d,0x65,0x57,0x4e,0x68,0x56,0x4e,0x68,0x50,0x4d,0x67,0x4d,0x4e,0x69,0x50, 0x59,0x72,0x67,0x6f,0x85,0x8a,0x8e,0x9a,0xa7,0xa9,0xb6,0x92,0x99,0xaf,0x6f,0x71, 0x8d,0x62,0x6b,0x89,0x5b,0x65,0x82,0x54,0x57,0x74,0x4e,0x46,0x5f,0x49,0x4b,0x68, 0x84,0x80,0x8f,0x58,0x51,0x5c,0x2c,0x24,0x2f,0x2e,0x25,0x33,0x35,0x2b,0x3b,0x2f, 0x28,0x35,0x68,0x6c,0x7a,0x91,0x98,0xae,0x65,0x70,0x90,0x7f,0x8a,0xa3,0x84,0x8d, 0xa5,0x7c,0x86,0xa1,0x7d,0x86,0xa0,0x7d,0x86,0xa0,0x7e,0x86,0x9f,0x7e,0x86,0x9f, 0x7a,0x82,0x9b,0x79,0x81,0x99,0x74,0x7d,0x96,0x60,0x69,0x86,0x59,0x62,0x80,0x67, 0x70,0x8b,0x63,0x68,0x77,0x37,0x3b,0x46,0x39,0x3d,0x48,0x32,0x34,0x46,0x42,0x3b, 0x4e,0x4a,0x42,0x53,0x4a,0x42,0x54,0x4a,0x42,0x56,0x4e,0x44,0x58,0x4e,0x45,0x5a, 0x42,0x3f,0x55,0x3e,0x3e,0x53,0x3e,0x3f,0x56,0x43,0x49,0x60,0x44,0x4a,0x61,0x3f, 0x45,0x5a,0x3a,0x40,0x52,0x3f,0x45,0x58,0x47,0x4e,0x60,0x4a,0x4f,0x5f,0x43,0x48, 0x56,0x39,0x3e,0x4e,0x3c,0x40,0x50,0x33,0x37,0x42,0x5e,0x51,0x64,0x5e,0x4d,0x61, 0x6e,0x61,0x75,0x74,0x7f,0x9d,0x7e,0x88,0xa5,0x79,0x83,0xa1,0x74,0x7f,0x9c,0x6f, 0x79,0x96,0x47,0x4d,0x63,0x46,0x4e,0x65,0x4a,0x52,0x6a,0x49,0x4f,0x69,0x47,0x4c, 0x66,0x45,0x49,0x62,0x46,0x4c,0x63,0x52,0x59,0x6f,0x75,0x7b,0x8e,0x98,0x9b,0xa6, 0x9a,0x9d,0xa6,0x92,0x95,0x9f,0x7b,0x81,0x8f,0x67,0x6e,0x81,0x56,0x5e,0x74,0x47, 0x4e,0x66,0x41,0x42,0x5a,0x3c,0x3c,0x52,0x3d,0x3d,0x4e,0x4d,0x4a,0x5d,0x3e,0x3b, 0x51,0x40,0x3d,0x52,0x46,0x3d,0x4f,0x49,0x3e,0x50,0x4a,0x3f,0x51,0x4a,0x41,0x52, 0x4e,0x44,0x55,0x5a,0x51,0x61,0x6e,0x64,0x72,0x52,0x43,0x54,0x47,0x3c,0x4d,0x41, 0x37,0x46,0x45,0x39,0x47,0x49,0x3c,0x4a,0x4e,0x40,0x51,0x56,0x47,0x59,0x4c,0x3e, 0x4f,0x3b,0x30,0x3c,0x3b,0x2f,0x3b,0x3c,0x30,0x3c,0x42,0x33,0x40,0x40,0x32,0x3e, 0x3e,0x31,0x3d,0x3f,0x32,0x3e,0x46,0x38,0x46,0x4d,0x3e,0x4e,0x4a,0x3c,0x4b,0x60, 0x52,0x68,0x60,0x4e,0x62,0x57,0x46,0x58,0x54,0x44,0x55,0x54,0x45,0x56,0x55,0x44, 0x55,0x54,0x43,0x54,0x55,0x44,0x55,0x58,0x47,0x58,0x53,0x43,0x53,0x5e,0x51,0x5e, 0x9a,0xa1,0xb6,0x60,0x6a,0x8d,0x58,0x62,0x87,0x61,0x6c,0x8e,0x5b,0x66,0x89,0x50, 0x53,0x78,0x54,0x5f,0x83,0x39,0x40,0x57,0x12,0x14,0x19,0x12,0x14,0x19,0x2f,0x2d, 0x41,0x2c,0x2c,0x43,0x2b,0x28,0x41,0x3c,0x3b,0x58,0x51,0x4e,0x73,0x56,0x50,0x74, 0x57,0x50,0x75,0x58,0x50,0x75,0x5a,0x51,0x77,0x5b,0x51,0x77,0x5b,0x51,0x77,0x5a, 0x51,0x76,0x54,0x50,0x76,0x51,0x4f,0x77,0x50,0x53,0x7c,0x52,0x5d,0x83,0x6a,0x75, 0x96,0x21,0x22,0x27,0x0c,0x0d,0x10,0x0b,0x0c,0x0f,0x0b,0x0c,0x0f,0x0a,0x0b,0x0e, 0x5b,0x4a,0x5e,0x46,0x38,0x45,0x36,0x2b,0x34,0xab,0xac,0xbc,0x82,0x8c,0xa9,0x60, 0x6b,0x90,0x55,0x60,0x88,0x51,0x5c,0x83,0x4f,0x5b,0x81,0x4c,0x56,0x7b,0x48,0x50, 0x78,0x42,0x4d,0x70,0x40,0x48,0x6c,0x3d,0x46,0x66,0x3b,0x40,0x63,0x3d,0x41,0x63, 0x3f,0x46,0x67,0x42,0x48,0x6b,0x49,0x49,0x6c,0x3a,0x39,0x52,0x16,0x18,0x1c,0x16, 0x18,0x1c,0x16,0x18,0x1d,0x15,0x16,0x1a,0x12,0x14,0x18,0x0f,0x11,0x14,0x23,0x1d, 0x23,0x85,0x8d,0xa6,0x52,0x51,0x79,0x5c,0x53,0x77,0x56,0x51,0x77,0x52,0x5d,0x83, 0x28,0x2a,0x35,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0d, 0x0e,0x11,0x0d,0x0e,0x11,0x0c,0x0d,0x10,0x0c,0x0d,0x10,0x0b,0x0c,0x0f,0x0a,0x0b, 0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x3f,0x33,0x46, 0x61,0x4d,0x6a,0x50,0x4e,0x79,0x65,0x5d,0x62,0x40,0x32,0x3e,0x3e,0x30,0x3b,0x38, 0x2b,0x34,0x5b,0x4b,0x5e,0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06, 0x07,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06, 0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x05,0x03, 0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,0x14,0x14,0x14, 0xd3,0xd7,0xe2,0xad,0xb4,0xc9,0xaa,0xb2,0xc6,0xac,0xb4,0xc8,0xad,0xb4,0xc9,0xb0, 0xb7,0xca,0xac,0xb4,0xc8,0xb7,0xbf,0xd5,0xeb,0xf6,0xff,0x2b,0x2b,0x2b,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x06,0x05,0x06,0x29,0x28,0x2a,0x05, 0x04,0x05,0x06,0x05,0x06,0x07,0x06,0x07,0x0c,0x0a,0x0c,0x12,0x0e,0x12,0x1b,0x16, 0x1b,0x20,0x1a,0x21,0x22,0x1c,0x23,0x24,0x1f,0x27,0x2c,0x26,0x31,0x2c,0x25,0x2f, 0x31,0x29,0x34,0x35,0x2c,0x38,0x39,0x31,0x3e,0x39,0x31,0x3e,0x3c,0x35,0x45,0x3c, 0x39,0x4c,0x43,0x3d,0x51,0x49,0x3e,0x51,0x4a,0x40,0x52,0x4b,0x41,0x53,0x4d,0x43, 0x57,0x4e,0x46,0x5c,0x52,0x4a,0x62,0x55,0x4e,0x68,0x55,0x4e,0x67,0x51,0x4b,0x65, 0x4a,0x4a,0x64,0x4d,0x54,0x6f,0x61,0x69,0x7f,0x86,0x8b,0x9a,0xb5,0xb6,0xbf,0xba, 0xbe,0xcc,0x85,0x89,0xa1,0x59,0x60,0x80,0x58,0x61,0x7f,0x58,0x5e,0x7b,0x57,0x4a, 0x65,0x4f,0x48,0x65,0x7d,0x7c,0x8e,0x70,0x6a,0x74,0x29,0x22,0x2c,0x2c,0x24,0x31, 0x34,0x2a,0x3a,0x35,0x2d,0x3c,0x35,0x37,0x40,0x99,0x9f,0xb2,0x73,0x7c,0x9a,0x70, 0x7a,0x98,0x88,0x91,0xaa,0x81,0x8b,0xa5,0x7f,0x89,0xa2,0x7e,0x87,0xa1,0x80,0x88, 0xa2,0x7e,0x87,0xa0,0x7e,0x87,0x9f,0x7c,0x84,0x9d,0x78,0x81,0x99,0x6c,0x75,0x90, 0x5b,0x63,0x82,0x60,0x69,0x84,0x78,0x7d,0x8f,0x32,0x35,0x3f,0x36,0x38,0x42,0x32, 0x35,0x43,0x36,0x34,0x46,0x3f,0x3a,0x4d,0x4b,0x41,0x52,0x51,0x42,0x53,0x52,0x46, 0x57,0x50,0x45,0x58,0x4e,0x43,0x57,0x48,0x40,0x53,0x3f,0x3c,0x50,0x3f,0x3e,0x53, 0x40,0x44,0x5a,0x43,0x49,0x5e,0x43,0x49,0x5b,0x3d,0x42,0x53,0x42,0x49,0x5c,0x4e, 0x54,0x65,0x4d,0x52,0x62,0x43,0x48,0x59,0x3c,0x42,0x53,0x33,0x37,0x45,0x43,0x3c, 0x4c,0x56,0x46,0x57,0x62,0x55,0x65,0x84,0x8e,0xa9,0x9a,0xa3,0xbb,0x84,0x8c,0xaa, 0x76,0x81,0x9e,0x70,0x79,0x97,0x4b,0x53,0x69,0x4a,0x50,0x67,0x4f,0x56,0x6e,0x4f, 0x56,0x6f,0x4b,0x52,0x6e,0x4d,0x55,0x6d,0x49,0x4f,0x66,0x4e,0x55,0x6b,0x6a,0x71, 0x84,0x89,0x8e,0x9a,0x9c,0x9e,0xa6,0x9f,0xa2,0xaa,0x96,0x9a,0xa3,0x8f,0x93,0x9e, 0x77,0x7d,0x8c,0x5d,0x64,0x77,0x55,0x5b,0x6e,0x4e,0x55,0x69,0x42,0x48,0x5c,0x36, 0x37,0x4a,0x33,0x32,0x45,0x34,0x32,0x45,0x37,0x35,0x48,0x3c,0x36,0x47,0x3c,0x37, 0x49,0x3e,0x38,0x4a,0x3e,0x39,0x4b,0x43,0x3b,0x4d,0x46,0x3c,0x4e,0x4a,0x3f,0x4f, 0x48,0x3c,0x4b,0x41,0x36,0x45,0x49,0x3b,0x4a,0x4e,0x41,0x50,0x52,0x43,0x54,0x55, 0x46,0x57,0x47,0x3b,0x4c,0x45,0x3a,0x48,0x4a,0x3c,0x4a,0x4c,0x3e,0x4b,0x51,0x42, 0x52,0x4e,0x3e,0x4e,0x49,0x3a,0x49,0x4b,0x3d,0x4c,0x51,0x42,0x53,0x53,0x45,0x56, 0x50,0x42,0x52,0x4c,0x41,0x51,0x66,0x55,0x6a,0x5c,0x4b,0x5d,0x55,0x46,0x57,0x56, 0x46,0x58,0x56,0x44,0x56,0x54,0x45,0x56,0x55,0x45,0x56,0x57,0x47,0x57,0x56,0x45, 0x56,0x4d,0x3e,0x4d,0x9c,0x9a,0xa5,0x76,0x80,0x9e,0x56,0x61,0x86,0x5e,0x68,0x8b, 0x5b,0x66,0x89,0x50,0x51,0x77,0x55,0x60,0x83,0x34,0x3b,0x50,0x12,0x14,0x1a,0x11, 0x12,0x17,0x2e,0x2c,0x3f,0x2c,0x2b,0x43,0x2b,0x28,0x41,0x31,0x2f,0x4a,0x52,0x4e, 0x74,0x54,0x4e,0x75,0x58,0x50,0x75,0x59,0x50,0x75,0x5a,0x51,0x77,0x5a,0x51,0x77, 0x5c,0x52,0x77,0x5a,0x51,0x76,0x54,0x50,0x76,0x51,0x4f,0x78,0x50,0x53,0x7b,0x51, 0x5c,0x83,0x69,0x74,0x95,0x2a,0x2a,0x30,0x0c,0x0d,0x11,0x0b,0x0c,0x0f,0x0b,0x0c, 0x10,0x0b,0x0c,0x0f,0x5b,0x4b,0x5f,0x48,0x3b,0x49,0x37,0x2b,0x35,0xa7,0xa8,0xb7, 0x84,0x8d,0xaa,0x60,0x6b,0x8f,0x54,0x5e,0x87,0x51,0x5c,0x83,0x50,0x5c,0x82,0x4c, 0x57,0x7e,0x4a,0x54,0x78,0x44,0x4f,0x72,0x3f,0x49,0x6c,0x3d,0x45,0x66,0x3e,0x40, 0x63,0x3d,0x41,0x61,0x3f,0x46,0x67,0x41,0x47,0x6c,0x49,0x4a,0x6b,0x3a,0x39,0x51, 0x16,0x18,0x1d,0x18,0x1a,0x1e,0x18,0x1a,0x1e,0x16,0x17,0x1c,0x14,0x16,0x1a,0x11, 0x12,0x16,0x19,0x17,0x1b,0x86,0x87,0x95,0x55,0x60,0x86,0x58,0x53,0x77,0x5c,0x53, 0x77,0x56,0x62,0x86,0x68,0x6d,0x86,0x0e,0x0e,0x12,0x0e,0x0f,0x12,0x0e,0x10,0x13, 0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0d,0x0e,0x11,0x0c,0x0e,0x11,0x0c, 0x0e,0x11,0x0b,0x0d,0x10,0x0b,0x0c,0x0f,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a, 0x0d,0x50,0x42,0x5a,0x60,0x4c,0x6a,0x57,0x62,0x88,0x49,0x3f,0x46,0x44,0x36,0x42, 0x46,0x37,0x44,0x44,0x36,0x42,0x3e,0x34,0x41,0x06,0x06,0x09,0x06,0x06,0x08,0x06, 0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x05, 0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06, 0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0xb2,0xb2,0xb5,0xb7,0xbe,0xcf,0xa8,0xaf,0xc4,0xaa,0xb2,0xc6, 0xab,0xb2,0xc7,0xad,0xb4,0xc8,0xab,0xb2,0xc8,0xac,0xb4,0xca,0xc2,0xcd,0xe7,0xcb, 0xcc,0xcc,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x1c,0x1b,0x1c, 0x2c,0x2a,0x2c,0x06,0x04,0x05,0x08,0x06,0x07,0x0a,0x08,0x0a,0x11,0x0e,0x11,0x1b, 0x16,0x1b,0x23,0x1d,0x23,0x25,0x1e,0x25,0x26,0x1e,0x26,0x27,0x20,0x29,0x2a,0x22, 0x2c,0x2a,0x23,0x2c,0x2e,0x26,0x30,0x33,0x2a,0x36,0x39,0x30,0x3c,0x3c,0x34,0x42, 0x3f,0x37,0x46,0x42,0x39,0x4a,0x43,0x3a,0x4d,0x45,0x3a,0x4a,0x47,0x3e,0x4e,0x4b, 0x42,0x56,0x4d,0x45,0x5a,0x4e,0x46,0x5e,0x52,0x4c,0x65,0x56,0x4e,0x67,0x55,0x4d, 0x66,0x4e,0x4a,0x62,0x47,0x46,0x60,0x49,0x50,0x6a,0x51,0x58,0x72,0x5e,0x66,0x7c, 0x8f,0x93,0xa2,0xb6,0xba,0xca,0xaf,0xb0,0xbf,0x88,0x89,0x9f,0x6b,0x74,0x8f,0x62, 0x6b,0x87,0x54,0x4c,0x69,0x56,0x46,0x5f,0x6f,0x70,0x85,0x92,0x8d,0x96,0x28,0x20, 0x2b,0x2c,0x24,0x30,0x30,0x27,0x36,0x36,0x2d,0x3e,0x1e,0x1b,0x23,0x91,0x96,0xa9, 0x84,0x8e,0xa7,0x63,0x6d,0x8f,0x88,0x90,0xaa,0x84,0x8e,0xa7,0x81,0x89,0xa5,0x80, 0x89,0xa3,0x82,0x8b,0xa4,0x81,0x89,0xa3,0x7f,0x89,0xa1,0x7d,0x85,0x9e,0x7a,0x84, 0x9b,0x76,0x7f,0x98,0x5d,0x67,0x85,0x5c,0x65,0x82,0x75,0x7b,0x92,0x45,0x49,0x53, 0x30,0x33,0x3e,0x2e,0x32,0x41,0x2e,0x32,0x42,0x33,0x32,0x45,0x46,0x3f,0x52,0x4f, 0x43,0x56,0x52,0x43,0x54,0x51,0x43,0x54,0x50,0x43,0x56,0x4e,0x42,0x55,0x4a,0x41, 0x53,0x49,0x41,0x56,0x41,0x3f,0x55,0x3e,0x3d,0x52,0x3d,0x42,0x56,0x37,0x3a,0x4d, 0x3b,0x3e,0x54,0x42,0x42,0x5a,0x43,0x49,0x61,0x43,0x49,0x5e,0x4a,0x50,0x63,0x42, 0x46,0x57,0x31,0x30,0x3d,0x44,0x38,0x45,0x4e,0x41,0x4f,0x85,0x8d,0xa9,0x9d,0xa4, 0xbc,0xa0,0xa7,0xbe,0x84,0x8d,0xa9,0x71,0x7b,0x98,0x4e,0x55,0x6a,0x4e,0x54,0x69, 0x56,0x5e,0x74,0x56,0x5e,0x76,0x58,0x60,0x79,0x50,0x57,0x6f,0x4a,0x51,0x6a,0x51, 0x59,0x6f,0x6e,0x74,0x86,0x96,0x9a,0xa3,0xac,0xae,0xb3,0xac,0xae,0xb3,0xa6,0xa9, 0xaf,0xa5,0xa8,0xae,0x90,0x94,0x9e,0x78,0x7d,0x8a,0x6c,0x71,0x7e,0x66,0x6c,0x7a, 0x59,0x5e,0x6f,0x4e,0x54,0x66,0x42,0x47,0x59,0x36,0x39,0x4a,0x34,0x36,0x48,0x36, 0x36,0x46,0x32,0x34,0x43,0x36,0x37,0x46,0x39,0x36,0x48,0x3e,0x39,0x4b,0x3e,0x3a, 0x4c,0x45,0x3c,0x4d,0x47,0x3d,0x4d,0x46,0x3c,0x4b,0x47,0x3c,0x4b,0x48,0x3c,0x4c, 0x4a,0x3d,0x4d,0x42,0x38,0x47,0x41,0x38,0x47,0x42,0x38,0x47,0x47,0x3b,0x4a,0x49, 0x3d,0x4e,0x4b,0x3f,0x50,0x49,0x3e,0x4e,0x45,0x3a,0x4a,0x4e,0x42,0x52,0x53,0x48, 0x5a,0x52,0x47,0x5b,0x4f,0x45,0x58,0x48,0x3e,0x4e,0x4f,0x46,0x59,0x62,0x52,0x66, 0x57,0x47,0x59,0x56,0x45,0x56,0x58,0x46,0x58,0x57,0x45,0x57,0x54,0x45,0x56,0x56, 0x45,0x56,0x58,0x47,0x58,0x50,0x40,0x4f,0x6c,0x61,0x6d,0x91,0x9a,0xb1,0x5a,0x65, 0x8a,0x55,0x60,0x85,0x5b,0x66,0x89,0x50,0x50,0x77,0x53,0x5e,0x82,0x31,0x36,0x4a, 0x13,0x15,0x1a,0x12,0x13,0x19,0x2e,0x2d,0x3f,0x2c,0x2b,0x43,0x2c,0x29,0x41,0x2c, 0x2a,0x43,0x52,0x4e,0x74,0x55,0x4e,0x74,0x57,0x50,0x75,0x5b,0x51,0x76,0x5a,0x51, 0x77,0x5a,0x51,0x77,0x5b,0x51,0x77,0x5b,0x51,0x76,0x55,0x4f,0x76,0x51,0x4f,0x77, 0x50,0x52,0x7a,0x51,0x5c,0x82,0x68,0x74,0x95,0x34,0x33,0x39,0x0c,0x0d,0x11,0x0c, 0x0d,0x11,0x0c,0x0d,0x10,0x0b,0x0d,0x10,0x52,0x44,0x55,0x4c,0x3e,0x4d,0x37,0x2a, 0x36,0xa3,0xa4,0xb2,0x83,0x8d,0xaa,0x61,0x6d,0x90,0x53,0x5e,0x87,0x4f,0x5b,0x84, 0x50,0x5b,0x83,0x4d,0x57,0x7e,0x4a,0x55,0x79,0x46,0x4e,0x73,0x41,0x4b,0x6d,0x3f, 0x45,0x67,0x3d,0x42,0x64,0x3e,0x42,0x62,0x3f,0x46,0x66,0x42,0x45,0x68,0x47,0x47, 0x6b,0x3c,0x3b,0x55,0x16,0x17,0x1c,0x17,0x19,0x1e,0x18,0x1a,0x1e,0x16,0x18,0x1d, 0x16,0x17,0x1c,0x12,0x14,0x18,0x11,0x12,0x16,0x2b,0x24,0x2b,0x7a,0x82,0x9e,0x52, 0x50,0x77,0x55,0x50,0x77,0x58,0x52,0x77,0x54,0x61,0x85,0x10,0x12,0x14,0x0e,0x0f, 0x12,0x0f,0x10,0x14,0x0f,0x10,0x14,0x0e,0x10,0x14,0x0e,0x0f,0x13,0x0e,0x0e,0x12, 0x0d,0x0e,0x12,0x0d,0x0e,0x11,0x0c,0x0e,0x11,0x0c,0x0d,0x10,0x0b,0x0c,0x0f,0x0a, 0x0b,0x0e,0x0a,0x0b,0x0e,0x56,0x44,0x5d,0x60,0x4e,0x6c,0x6a,0x76,0x99,0x3d,0x32, 0x3a,0x4d,0x3e,0x4c,0x50,0x40,0x4f,0x54,0x43,0x54,0x06,0x06,0x08,0x07,0x07,0x0a, 0x06,0x06,0x09,0x06,0x06,0x09,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x06, 0x06,0x08,0x06,0x06,0x07,0x06,0x05,0x07,0x06,0x06,0x07,0x07,0x07,0x08,0x05,0x05, 0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x05, 0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x30,0x30,0x30,0xc8,0xce,0xda,0xa4,0xac, 0xc2,0xa5,0xad,0xc3,0xa9,0xaf,0xc6,0xa9,0xb0,0xc6,0xa8,0xb0,0xc4,0xa5,0xad,0xc3, 0xac,0xb5,0xce,0xd1,0xdc,0xfb,0x3e,0x3e,0x3e,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,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,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,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x04,0x04,0x03,0x04,0x05,0x03, 0x04,0x04,0x03,0x04,0x06,0x04,0x05,0x08,0x06,0x07,0x0a,0x07,0x09,0x0d,0x0a,0x0c, 0x14,0x10,0x13,0x1e,0x17,0x1e,0x26,0x1f,0x26,0x2a,0x22,0x2a,0x2a,0x22,0x2a,0x2a, 0x22,0x2a,0x29,0x22,0x2a,0x28,0x21,0x29,0x2b,0x24,0x2e,0x30,0x29,0x33,0x39,0x31, 0x3e,0x42,0x3a,0x4a,0x46,0x3d,0x4f,0x46,0x3d,0x4f,0x45,0x3c,0x4d,0x43,0x3a,0x4a, 0x46,0x3b,0x4c,0x49,0x40,0x52,0x4b,0x44,0x5a,0x4d,0x47,0x60,0x51,0x4d,0x67,0x55, 0x4e,0x68,0x55,0x4d,0x66,0x50,0x48,0x60,0x47,0x44,0x5b,0x46,0x48,0x61,0x49,0x4f, 0x69,0x4a,0x52,0x6b,0x52,0x58,0x71,0x82,0x8b,0xa5,0xa0,0xa4,0xb8,0xa0,0x9e,0xaf, 0x67,0x71,0x8e,0x63,0x6d,0x89,0x4c,0x4b,0x6d,0x57,0x44,0x5b,0x61,0x62,0x7c,0xb0, 0xab,0xb3,0x2b,0x23,0x2d,0x2b,0x23,0x2f,0x2f,0x27,0x34,0x37,0x2d,0x3e,0x2b,0x25, 0x2f,0x64,0x67,0x74,0x96,0x9d,0xb2,0x68,0x72,0x94,0x7b,0x86,0xa1,0x88,0x90,0xaa, 0x82,0x8b,0xa7,0x82,0x8b,0xa6,0x82,0x8b,0xa5,0x82,0x8b,0xa4,0x83,0x8c,0xa4,0x81, 0x89,0xa1,0x7e,0x87,0x9f,0x7c,0x84,0x9c,0x65,0x6e,0x8b,0x5d,0x65,0x84,0x70,0x79, 0x91,0x63,0x67,0x75,0x2a,0x2d,0x3a,0x2b,0x2f,0x3e,0x2d,0x31,0x41,0x36,0x35,0x48, 0x3c,0x3a,0x4e,0x46,0x41,0x56,0x52,0x47,0x5b,0x55,0x48,0x5a,0x54,0x46,0x57,0x50, 0x42,0x55,0x4e,0x42,0x55,0x4e,0x43,0x56,0x4e,0x44,0x58,0x48,0x42,0x56,0x40,0x3c, 0x50,0x3a,0x38,0x4c,0x3a,0x38,0x4d,0x44,0x3f,0x53,0x4b,0x45,0x5a,0x43,0x42,0x59, 0x41,0x45,0x5b,0x3f,0x45,0x57,0x29,0x2b,0x38,0x3c,0x30,0x3c,0x44,0x35,0x43,0x87, 0x8f,0xa9,0x99,0xa0,0xba,0xa2,0xaa,0xbf,0x9d,0xa5,0xb9,0x78,0x81,0x9e,0x58,0x5e, 0x72,0x52,0x59,0x6c,0x5e,0x66,0x7d,0x62,0x6a,0x82,0x5b,0x63,0x7d,0x56,0x5e,0x76, 0x58,0x60,0x76,0x63,0x6a,0x7e,0x86,0x8a,0x98,0x9e,0xa1,0xaa,0xab,0xad,0xb3,0xb2, 0xb4,0xb9,0xb4,0xb6,0xba,0xab,0xae,0xb4,0x98,0x9c,0xa5,0x8c,0x90,0x9a,0x82,0x86, 0x92,0x77,0x7b,0x86,0x6a,0x6f,0x7c,0x5b,0x61,0x71,0x50,0x56,0x66,0x4a,0x50,0x61, 0x46,0x4a,0x5c,0x39,0x3e,0x4e,0x37,0x3a,0x4a,0x33,0x33,0x45,0x36,0x34,0x47,0x36, 0x34,0x47,0x39,0x35,0x46,0x3e,0x37,0x4a,0x3f,0x37,0x48,0x3e,0x37,0x46,0x3c,0x35, 0x45,0x3a,0x34,0x44,0x3a,0x32,0x42,0x37,0x32,0x41,0x3a,0x33,0x43,0x3f,0x36,0x46, 0x43,0x39,0x49,0x44,0x3a,0x4a,0x47,0x3d,0x4d,0x4c,0x3f,0x51,0x4d,0x3f,0x4f,0x4f, 0x41,0x52,0x4d,0x41,0x52,0x45,0x3c,0x4e,0x43,0x3b,0x4d,0x3e,0x36,0x46,0x37,0x30, 0x3f,0x59,0x4e,0x63,0x5b,0x4c,0x60,0x57,0x47,0x59,0x58,0x47,0x58,0x57,0x47,0x58, 0x56,0x46,0x57,0x56,0x46,0x57,0x58,0x47,0x58,0x54,0x44,0x54,0x4c,0x3c,0x4a,0xa8, 0xa7,0xb3,0x6c,0x77,0x98,0x54,0x5f,0x85,0x58,0x62,0x86,0x50,0x50,0x76,0x53,0x5c, 0x82,0x2e,0x32,0x45,0x14,0x16,0x1c,0x12,0x13,0x19,0x2c,0x2a,0x3c,0x2c,0x2b,0x43, 0x2c,0x29,0x41,0x2c,0x29,0x40,0x51,0x4c,0x72,0x57,0x50,0x75,0x5a,0x50,0x76,0x5a, 0x50,0x76,0x5a,0x51,0x77,0x5a,0x51,0x77,0x5c,0x52,0x77,0x5a,0x52,0x77,0x55,0x4f, 0x76,0x51,0x4f,0x77,0x51,0x53,0x7b,0x51,0x5c,0x83,0x67,0x72,0x92,0x38,0x37,0x3f, 0x0c,0x0e,0x11,0x0c,0x0d,0x11,0x0b,0x0d,0x10,0x0b,0x0c,0x10,0x40,0x36,0x44,0x4c, 0x3e,0x4c,0x36,0x2a,0x34,0xa0,0xa2,0xaf,0x83,0x8d,0xa9,0x61,0x6c,0x90,0x55,0x61, 0x88,0x53,0x5d,0x86,0x50,0x5b,0x82,0x4e,0x59,0x7f,0x4a,0x54,0x7a,0x47,0x4f,0x74, 0x44,0x4c,0x6d,0x40,0x47,0x69,0x3d,0x41,0x64,0x3e,0x41,0x63,0x3e,0x42,0x64,0x42, 0x45,0x67,0x46,0x46,0x6b,0x3a,0x39,0x54,0x16,0x16,0x1b,0x17,0x19,0x1e,0x18,0x1a, 0x1e,0x18,0x1a,0x1e,0x18,0x1a,0x1f,0x16,0x17,0x1c,0x13,0x15,0x19,0x23,0x1e,0x25, 0x7e,0x7f,0x8d,0x51,0x53,0x79,0x55,0x50,0x77,0x56,0x50,0x76,0x65,0x6f,0x92,0x51, 0x54,0x62,0x0d,0x0e,0x11,0x10,0x11,0x14,0x10,0x12,0x16,0x10,0x11,0x15,0x0f,0x10, 0x14,0x0e,0x10,0x14,0x0e,0x0f,0x13,0x0e,0x0f,0x12,0x0d,0x0e,0x12,0x0c,0x0e,0x11, 0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0a,0x0b,0x0e,0x59,0x46,0x60,0x60,0x4e,0x6c,0x87, 0x91,0xaa,0x37,0x2a,0x34,0x55,0x44,0x55,0x53,0x43,0x53,0x5b,0x4a,0x5c,0x06,0x06, 0x09,0x07,0x07,0x0a,0x07,0x08,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a, 0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x08,0x06, 0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05, 0x06,0x04,0x04,0x06,0x04,0x03,0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,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,0xce, 0xd0,0xd8,0xa9,0xb1,0xc7,0xa0,0xa8,0xc0,0xa2,0xaa,0xc1,0xa4,0xac,0xc2,0xa3,0xaa, 0xc1,0xa0,0xa8,0xbf,0x9f,0xaa,0xc2,0xb0,0xba,0xd8,0xc9,0xd5,0xe8,0x02,0x02,0x02, 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,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, 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,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x05,0x06, 0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x06,0x08,0x06,0x07,0x0a,0x07,0x09,0x0d,0x0a, 0x0c,0x12,0x0d,0x10,0x19,0x13,0x17,0x22,0x1a,0x20,0x29,0x20,0x28,0x2f,0x25,0x2e, 0x30,0x26,0x30,0x2e,0x24,0x2e,0x2b,0x23,0x2c,0x28,0x22,0x2a,0x29,0x22,0x2b,0x2e, 0x28,0x32,0x36,0x2e,0x3b,0x3e,0x37,0x46,0x46,0x3e,0x51,0x49,0x41,0x54,0x49,0x41, 0x55,0x47,0x3f,0x53,0x46,0x3c,0x4e,0x47,0x3d,0x4f,0x48,0x43,0x5a,0x4a,0x4a,0x64, 0x4f,0x4e,0x6a,0x51,0x4e,0x69,0x52,0x4c,0x66,0x4e,0x47,0x5d,0x4a,0x43,0x5a,0x43, 0x42,0x5a,0x46,0x4a,0x63,0x4b,0x52,0x6b,0x49,0x4d,0x66,0x5d,0x5f,0x81,0x66,0x70, 0x8f,0x7a,0x7a,0x93,0x5d,0x67,0x86,0x5c,0x60,0x80,0x51,0x56,0x76,0x57,0x46,0x5c, 0x58,0x58,0x73,0xae,0xaa,0xb2,0x35,0x2d,0x38,0x2c,0x23,0x2f,0x30,0x26,0x34,0x37, 0x2d,0x3e,0x36,0x2e,0x3d,0x2e,0x2f,0x37,0x9d,0xa3,0xb6,0x82,0x8b,0xa5,0x66,0x71, 0x92,0x8b,0x95,0xac,0x84,0x8e,0xa8,0x83,0x8b,0xa6,0x83,0x8b,0xa6,0x86,0x8f,0xa7, 0x82,0x8c,0xa4,0x87,0x8f,0xa6,0x81,0x89,0xa1,0x7e,0x87,0x9e,0x70,0x7a,0x94,0x5d, 0x67,0x85,0x66,0x70,0x8b,0x7f,0x86,0x97,0x27,0x2b,0x38,0x2a,0x2e,0x3b,0x32,0x32, 0x44,0x39,0x37,0x4b,0x3c,0x3b,0x51,0x43,0x40,0x56,0x49,0x44,0x5a,0x53,0x49,0x5f, 0x57,0x4d,0x61,0x57,0x4a,0x5e,0x52,0x47,0x5a,0x52,0x46,0x5a,0x52,0x45,0x57,0x51, 0x46,0x5a,0x4c,0x42,0x56,0x3e,0x3c,0x50,0x3b,0x3b,0x4f,0x3a,0x3a,0x4e,0x3d,0x3a, 0x50,0x3e,0x3e,0x54,0x3c,0x3a,0x4f,0x36,0x34,0x46,0x2a,0x28,0x35,0x3c,0x31,0x3e, 0x40,0x32,0x3e,0x7e,0x81,0x99,0x95,0x9e,0xb6,0xa2,0xaa,0xbf,0x9f,0xa6,0xbb,0x95, 0x9b,0xb1,0x68,0x6c,0x84,0x50,0x56,0x69,0x62,0x69,0x7f,0x6a,0x72,0x89,0x66,0x6e, 0x83,0x5e,0x66,0x7b,0x5a,0x61,0x75,0x65,0x6b,0x7e,0x8c,0x90,0x9d,0xa4,0xa7,0xae, 0xb2,0xb5,0xb9,0xb9,0xba,0xbe,0xb8,0xb9,0xbd,0xb0,0xb2,0xb7,0x9e,0xa1,0xaa,0x8b, 0x90,0x9c,0x7f,0x84,0x92,0x7d,0x82,0x8f,0x70,0x74,0x83,0x61,0x66,0x76,0x52,0x57, 0x68,0x49,0x4e,0x5f,0x4a,0x4f,0x5f,0x4d,0x52,0x65,0x4a,0x4f,0x62,0x39,0x38,0x4e, 0x45,0x48,0x57,0x40,0x42,0x52,0x3e,0x40,0x51,0x36,0x35,0x48,0x39,0x36,0x46,0x3d, 0x37,0x48,0x3c,0x36,0x47,0x3e,0x36,0x48,0x39,0x33,0x42,0x38,0x32,0x42,0x3e,0x36, 0x46,0x45,0x3a,0x4a,0x47,0x3b,0x4b,0x4f,0x41,0x52,0x56,0x47,0x5a,0x54,0x46,0x5a, 0x51,0x45,0x56,0x4c,0x40,0x51,0x48,0x3d,0x4e,0x3d,0x36,0x46,0x32,0x2f,0x3e,0x2a, 0x29,0x37,0x29,0x26,0x34,0x34,0x30,0x3f,0x60,0x52,0x67,0x59,0x4a,0x5d,0x58,0x47, 0x59,0x57,0x46,0x58,0x56,0x46,0x57,0x55,0x45,0x56,0x57,0x46,0x57,0x57,0x47,0x57, 0x4f,0x3f,0x4e,0x81,0x78,0x81,0x81,0x8a,0xa6,0x59,0x63,0x88,0x52,0x5c,0x81,0x52, 0x51,0x76,0x53,0x5d,0x81,0x2a,0x2e,0x3f,0x14,0x16,0x1c,0x12,0x14,0x1a,0x29,0x29, 0x3a,0x2c,0x2b,0x42,0x2b,0x28,0x41,0x2b,0x29,0x3f,0x53,0x4d,0x71,0x57,0x50,0x75, 0x59,0x50,0x76,0x5b,0x51,0x76,0x5b,0x51,0x76,0x5b,0x51,0x77,0x5b,0x51,0x77,0x5b, 0x52,0x77,0x55,0x4f,0x76,0x50,0x4f,0x77,0x50,0x52,0x7a,0x51,0x5c,0x83,0x67,0x73, 0x93,0x44,0x43,0x4b,0x0c,0x0e,0x12,0x0d,0x0e,0x12,0x0b,0x0d,0x10,0x0b,0x0c,0x0f, 0x38,0x2f,0x3b,0x4b,0x3d,0x4c,0x34,0x2a,0x33,0x9b,0x9b,0xa9,0x84,0x8e,0xaa,0x63, 0x6e,0x90,0x55,0x61,0x88,0x51,0x5c,0x83,0x51,0x5b,0x81,0x4e,0x59,0x7f,0x4c,0x55, 0x79,0x47,0x4f,0x75,0x42,0x4c,0x6e,0x40,0x47,0x69,0x3d,0x41,0x63,0x3d,0x41,0x60, 0x3f,0x44,0x66,0x41,0x43,0x65,0x47,0x46,0x6a,0x39,0x37,0x54,0x12,0x14,0x18,0x16, 0x18,0x1d,0x1a,0x1b,0x21,0x19,0x1a,0x20,0x19,0x1a,0x1f,0x19,0x1b,0x20,0x16,0x18, 0x1e,0x17,0x18,0x1c,0x30,0x28,0x31,0x7b,0x83,0x9e,0x51,0x59,0x80,0x61,0x6d,0x8f, 0x84,0x8c,0xa9,0x80,0x88,0xa0,0x0d,0x0e,0x11,0x0e,0x0f,0x13,0x10,0x12,0x16,0x11, 0x12,0x16,0x11,0x12,0x16,0x0f,0x11,0x15,0x0f,0x10,0x14,0x0e,0x0f,0x13,0x0e,0x0f, 0x12,0x0d,0x0e,0x12,0x0d,0x0e,0x12,0x0c,0x0e,0x11,0x0b,0x0c,0x10,0x5b,0x48,0x62, 0x60,0x51,0x71,0xa9,0xaf,0xc0,0x3d,0x2f,0x3a,0x53,0x42,0x53,0x51,0x40,0x52,0x5a, 0x4a,0x5c,0x06,0x07,0x0a,0x07,0x07,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09, 0x0b,0x08,0x09,0x0b,0x08,0x08,0x0b,0x07,0x08,0x0a,0x07,0x08,0x0a,0x06,0x06,0x09, 0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x05,0x07,0x05, 0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x03, 0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x56,0x56,0x56,0xb8,0xbf,0xd0,0x99,0xa2,0xbb,0x9b,0xa4,0xbc,0x9d, 0xa5,0xbe,0x9c,0xa4,0xbe,0x99,0xa1,0xbb,0x98,0xa2,0xbb,0x9c,0xa5,0xc2,0xbb,0xc6, 0xea,0x50,0x56,0x58,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,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,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,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x04,0x06,0x04,0x05,0x06,0x05,0x06, 0x08,0x06,0x07,0x09,0x06,0x08,0x0a,0x07,0x09,0x0a,0x08,0x0a,0x0b,0x09,0x0a,0x0f, 0x0b,0x0e,0x12,0x0e,0x11,0x19,0x12,0x16,0x20,0x19,0x1e,0x2a,0x21,0x2a,0x31,0x26, 0x30,0x35,0x2a,0x34,0x36,0x2a,0x36,0x31,0x27,0x31,0x2d,0x24,0x2e,0x29,0x22,0x2b, 0x28,0x22,0x2b,0x2b,0x26,0x30,0x32,0x2a,0x36,0x38,0x30,0x3d,0x43,0x3a,0x49,0x4b, 0x42,0x53,0x4c,0x43,0x59,0x49,0x43,0x59,0x46,0x41,0x56,0x45,0x3f,0x54,0x45,0x42, 0x58,0x4a,0x49,0x63,0x4e,0x4c,0x68,0x4e,0x4d,0x68,0x4c,0x4b,0x66,0x4a,0x46,0x5e, 0x4c,0x45,0x5b,0x4a,0x42,0x58,0x43,0x43,0x5b,0x4e,0x56,0x6e,0x5c,0x64,0x7a,0x5d, 0x65,0x84,0x5a,0x5f,0x83,0x60,0x5f,0x80,0x58,0x5b,0x7e,0x5e,0x61,0x81,0x5f,0x5d, 0x7b,0x59,0x46,0x5d,0x55,0x56,0x71,0xa5,0xa1,0xac,0x4d,0x44,0x50,0x2b,0x23,0x2e, 0x2f,0x27,0x34,0x38,0x2d,0x3d,0x39,0x30,0x41,0x14,0x13,0x18,0x8e,0x92,0xa4,0x90, 0x98,0xaf,0x5d,0x69,0x8b,0x87,0x90,0xa9,0x86,0x90,0xa9,0x84,0x8d,0xa8,0x83,0x8d, 0xa8,0x85,0x8f,0xa8,0x87,0x90,0xa9,0x84,0x8c,0xa6,0x85,0x8d,0xa5,0x82,0x8b,0xa2, 0x7a,0x82,0x9b,0x61,0x6b,0x89,0x61,0x6b,0x88,0x8a,0x90,0xa4,0x46,0x4a,0x54,0x29, 0x2a,0x3a,0x32,0x32,0x43,0x3a,0x3a,0x4e,0x3e,0x3d,0x52,0x41,0x40,0x56,0x43,0x42, 0x5a,0x4b,0x46,0x5e,0x52,0x4a,0x62,0x56,0x4c,0x63,0x57,0x4c,0x62,0x55,0x49,0x5d, 0x54,0x49,0x5c,0x53,0x48,0x5b,0x52,0x47,0x5c,0x4e,0x44,0x59,0x42,0x3e,0x52,0x3d, 0x3c,0x51,0x3d,0x40,0x53,0x3e,0x41,0x56,0x3a,0x3a,0x4e,0x36,0x34,0x46,0x30,0x2e, 0x3d,0x3f,0x34,0x42,0x3c,0x2f,0x3b,0x67,0x63,0x76,0x8c,0x96,0xad,0xa0,0xa8,0xbd, 0x9f,0xa6,0xbb,0x95,0x9d,0xb2,0x7b,0x7d,0x94,0x4f,0x55,0x67,0x60,0x67,0x7d,0x6a, 0x71,0x88,0x68,0x70,0x86,0x62,0x69,0x7d,0x61,0x67,0x7b,0x6b,0x71,0x82,0x93,0x97, 0xa2,0xaa,0xac,0xb2,0xb5,0xb6,0xba,0xb6,0xb7,0xbb,0xb6,0xb8,0xbc,0xaf,0xb1,0xb7, 0x9e,0xa1,0xaa,0x8d,0x91,0x9e,0x86,0x8b,0x99,0x81,0x86,0x95,0x7a,0x7f,0x8d,0x6f, 0x75,0x85,0x5b,0x62,0x74,0x50,0x56,0x68,0x47,0x4e,0x61,0x44,0x4a,0x5e,0x43,0x4a, 0x5e,0x43,0x49,0x5f,0x4f,0x55,0x66,0x4d,0x52,0x63,0x3e,0x43,0x58,0x3d,0x42,0x56, 0x3c,0x3a,0x4f,0x3a,0x37,0x4c,0x3f,0x3a,0x4c,0x43,0x3a,0x4d,0x3f,0x38,0x48,0x44, 0x3a,0x4c,0x4c,0x42,0x55,0x4e,0x42,0x55,0x52,0x45,0x56,0x55,0x48,0x5a,0x56,0x4a, 0x5e,0x51,0x47,0x5a,0x4e,0x44,0x57,0x48,0x3f,0x51,0x3e,0x36,0x47,0x2e,0x2e,0x3e, 0x27,0x27,0x35,0x24,0x26,0x33,0x23,0x23,0x30,0x44,0x44,0x55,0x53,0x4c,0x61,0x5e, 0x4f,0x64,0x59,0x48,0x5b,0x58,0x47,0x58,0x56,0x46,0x57,0x54,0x44,0x55,0x56,0x46, 0x57,0x58,0x47,0x58,0x54,0x43,0x53,0x4c,0x3d,0x4b,0xa7,0xaa,0xb8,0x65,0x6f,0x91, 0x52,0x5c,0x81,0x50,0x50,0x77,0x52,0x5d,0x81,0x25,0x29,0x38,0x15,0x17,0x1e,0x13, 0x15,0x1b,0x29,0x28,0x39,0x2c,0x2a,0x43,0x2c,0x29,0x41,0x2c,0x29,0x41,0x55,0x4f, 0x73,0x57,0x50,0x75,0x5a,0x51,0x75,0x5b,0x51,0x76,0x5b,0x51,0x77,0x5b,0x51,0x77, 0x5c,0x52,0x77,0x5a,0x52,0x77,0x55,0x4f,0x76,0x50,0x4e,0x77,0x50,0x52,0x79,0x51, 0x5d,0x83,0x66,0x71,0x92,0x48,0x46,0x4f,0x0e,0x0f,0x13,0x0d,0x0e,0x12,0x0e,0x0e, 0x12,0x0c,0x0d,0x10,0x32,0x2a,0x35,0x4c,0x3e,0x4c,0x31,0x27,0x2f,0x99,0x9a,0xa6, 0x83,0x8c,0xa9,0x62,0x6e,0x90,0x56,0x62,0x88,0x52,0x5d,0x85,0x52,0x5c,0x83,0x4e, 0x59,0x80,0x4b,0x55,0x7b,0x47,0x4f,0x76,0x45,0x4d,0x70,0x3f,0x47,0x69,0x3f,0x42, 0x65,0x3d,0x3f,0x61,0x3f,0x41,0x64,0x42,0x43,0x65,0x46,0x46,0x6a,0x39,0x38,0x54, 0x14,0x15,0x1a,0x18,0x1a,0x1f,0x1b,0x1d,0x23,0x1b,0x1d,0x22,0x1c,0x1e,0x24,0x1a, 0x1d,0x22,0x1a,0x1d,0x22,0x18,0x1a,0x1f,0x2b,0x25,0x2d,0x52,0x4d,0x58,0x83,0x8c, 0xa5,0x84,0x8f,0xa8,0x87,0x90,0xaa,0x88,0x92,0xab,0x2c,0x2e,0x37,0x0e,0x0e,0x12, 0x10,0x11,0x15,0x11,0x12,0x16,0x11,0x12,0x16,0x10,0x12,0x16,0x10,0x12,0x16,0x10, 0x12,0x16,0x0e,0x10,0x14,0x0e,0x0f,0x13,0x0e,0x0e,0x12,0x0d,0x0e,0x12,0x0c,0x0d, 0x11,0x5c,0x49,0x63,0x5e,0x51,0x73,0xc0,0xc3,0xca,0x41,0x33,0x3e,0x56,0x46,0x57, 0x4f,0x40,0x4f,0x50,0x43,0x54,0x07,0x07,0x0a,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x0a, 0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x0a, 0x0d,0x08,0x08,0x0b,0x08,0x08,0x0b,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07, 0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04, 0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x0a,0x0a,0x0a,0xcf,0xd2,0xdf,0x9d,0xa5,0xbe, 0x92,0x9b,0xb7,0x95,0x9f,0xb9,0x93,0x9c,0xb7,0x93,0x9c,0xb7,0x93,0x9c,0xb7,0x92, 0x9c,0xb8,0x9f,0xac,0xca,0xbf,0xcd,0xf6,0x05,0x05,0x05,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x04, 0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x05,0x04,0x05,0x06,0x05,0x06,0x07,0x06, 0x06,0x0a,0x07,0x09,0x0c,0x0a,0x0b,0x0f,0x0b,0x0e,0x12,0x0e,0x10,0x16,0x11,0x14, 0x15,0x10,0x13,0x16,0x11,0x15,0x1b,0x15,0x1a,0x20,0x1a,0x1f,0x29,0x1f,0x27,0x30, 0x26,0x2f,0x36,0x2b,0x36,0x38,0x2d,0x38,0x38,0x2d,0x38,0x35,0x2a,0x36,0x31,0x28, 0x32,0x2c,0x26,0x2f,0x2a,0x24,0x2f,0x2a,0x26,0x30,0x2f,0x29,0x35,0x35,0x2e,0x3a, 0x3e,0x34,0x42,0x47,0x3a,0x49,0x4f,0x43,0x55,0x50,0x47,0x5c,0x48,0x45,0x5d,0x44, 0x42,0x5a,0x45,0x43,0x5b,0x47,0x46,0x5f,0x4a,0x4a,0x64,0x4c,0x4c,0x66,0x4c,0x4a, 0x66,0x4a,0x48,0x62,0x4c,0x46,0x5d,0x4c,0x42,0x56,0x44,0x40,0x56,0x47,0x4e,0x65, 0x66,0x6d,0x80,0x76,0x7e,0x95,0x80,0x88,0xa3,0x8f,0x8f,0xa6,0x5c,0x62,0x85,0x61, 0x61,0x81,0x5c,0x5f,0x7e,0x59,0x4c,0x63,0x4e,0x4d,0x6b,0x95,0x90,0x9f,0x80,0x78, 0x81,0x2b,0x22,0x2d,0x30,0x27,0x34,0x38,0x2e,0x3e,0x3a,0x30,0x41,0x24,0x1f,0x27, 0x52,0x54,0x60,0x9a,0xa2,0xb6,0x5f,0x6b,0x8c,0x70,0x7a,0x9a,0x88,0x91,0xab,0x85, 0x8e,0xa9,0x88,0x90,0xaa,0x88,0x91,0xaa,0x89,0x92,0xaa,0x89,0x91,0xa9,0x89,0x92, 0xa8,0x88,0x90,0xa6,0x82,0x8a,0xa1,0x68,0x71,0x8f,0x5c,0x66,0x85,0x80,0x88,0x9d, 0x6d,0x70,0x7d,0x28,0x2a,0x39,0x2f,0x2e,0x3e,0x37,0x36,0x47,0x3d,0x3a,0x4e,0x45, 0x40,0x55,0x49,0x44,0x5a,0x4a,0x46,0x5c,0x4f,0x49,0x61,0x55,0x4d,0x64,0x59,0x4e, 0x66,0x59,0x4d,0x63,0x56,0x4a,0x5f,0x5d,0x52,0x66,0x5c,0x52,0x66,0x55,0x4a,0x60, 0x52,0x48,0x5d,0x47,0x41,0x56,0x3f,0x3e,0x53,0x3d,0x40,0x53,0x3e,0x3e,0x52,0x3c, 0x3a,0x4e,0x36,0x33,0x47,0x3a,0x30,0x3e,0x3b,0x2e,0x39,0x4f,0x48,0x56,0x80,0x86, 0x9d,0x9b,0xa2,0xb7,0x9b,0xa3,0xb7,0x92,0x99,0xad,0x7c,0x7f,0x94,0x4a,0x4f,0x62, 0x5b,0x62,0x78,0x62,0x6a,0x7f,0x66,0x6d,0x82,0x73,0x79,0x8a,0x72,0x78,0x89,0x7f, 0x84,0x92,0x9b,0x9f,0xa7,0xaa,0xac,0xb2,0xa2,0xa5,0xad,0xab,0xae,0xb5,0xaf,0xb1, 0xb7,0xb2,0xb4,0xb9,0xa9,0xab,0xb2,0x99,0x9d,0xa6,0x96,0x99,0xa3,0x9a,0x9d,0xa6, 0x8c,0x8f,0x9b,0x76,0x7c,0x8a,0x63,0x6a,0x7b,0x58,0x5e,0x71,0x4a,0x52,0x65,0x4b, 0x52,0x63,0x4d,0x52,0x64,0x52,0x57,0x68,0x52,0x59,0x69,0x43,0x4a,0x5d,0x3d,0x42, 0x57,0x42,0x41,0x58,0x43,0x42,0x5b,0x42,0x42,0x5b,0x43,0x43,0x5a,0x3e,0x3b,0x52, 0x3d,0x38,0x4a,0x3e,0x39,0x4b,0x42,0x3c,0x4f,0x4a,0x42,0x56,0x4e,0x46,0x5b,0x4f, 0x46,0x5b,0x52,0x48,0x5e,0x4c,0x45,0x5c,0x49,0x42,0x58,0x41,0x3c,0x50,0x35,0x34, 0x46,0x2c,0x2d,0x3d,0x26,0x2a,0x37,0x24,0x27,0x33,0x23,0x26,0x32,0x6a,0x6d,0x82, 0x83,0x84,0x95,0x5e,0x53,0x67,0x5b,0x4c,0x60,0x58,0x48,0x5a,0x55,0x46,0x57,0x52, 0x43,0x54,0x55,0x46,0x56,0x57,0x47,0x57,0x58,0x47,0x58,0x4d,0x3e,0x4d,0x8d,0x84, 0x8e,0x75,0x80,0x9d,0x56,0x60,0x85,0x50,0x50,0x76,0x51,0x5b,0x80,0x22,0x26,0x33, 0x16,0x18,0x1e,0x14,0x16,0x1c,0x26,0x26,0x36,0x2d,0x2b,0x44,0x2b,0x2a,0x41,0x2d, 0x29,0x42,0x55,0x4f,0x74,0x5a,0x51,0x75,0x5a,0x51,0x75,0x5b,0x51,0x76,0x5b,0x51, 0x77,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5a,0x51,0x77,0x55,0x50,0x77,0x50,0x4f,0x77, 0x51,0x52,0x79,0x51,0x5c,0x83,0x65,0x6f,0x91,0x4e,0x4e,0x57,0x0e,0x0f,0x13,0x0e, 0x0e,0x12,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x2c,0x26,0x30,0x4d,0x40,0x4f,0x31,0x27, 0x30,0x92,0x93,0x9f,0x82,0x8c,0xa8,0x62,0x6e,0x90,0x55,0x61,0x87,0x53,0x5e,0x86, 0x51,0x5c,0x82,0x4e,0x59,0x80,0x4c,0x57,0x7b,0x48,0x53,0x77,0x44,0x4c,0x71,0x40, 0x47,0x6a,0x3d,0x42,0x66,0x3e,0x40,0x62,0x3f,0x40,0x63,0x42,0x43,0x64,0x45,0x45, 0x69,0x39,0x39,0x53,0x15,0x16,0x1a,0x1a,0x1b,0x21,0x1e,0x20,0x26,0x1f,0x22,0x28, 0x1e,0x21,0x27,0x1e,0x21,0x27,0x1d,0x1f,0x26,0x1b,0x1d,0x22,0x1f,0x1f,0x25,0x36, 0x2d,0x36,0x8b,0x8f,0xa2,0x83,0x8c,0xa6,0x87,0x90,0xa9,0x88,0x92,0xab,0x7d,0x85, 0x9d,0x0e,0x0f,0x12,0x0f,0x11,0x15,0x12,0x12,0x17,0x12,0x13,0x18,0x12,0x12,0x17, 0x11,0x12,0x16,0x0f,0x11,0x16,0x0f,0x10,0x15,0x0e,0x10,0x14,0x0e,0x10,0x14,0x0e, 0x0f,0x14,0x0c,0x0e,0x12,0x5d,0x48,0x64,0x50,0x4e,0x74,0xc0,0xbe,0xc0,0x43,0x35, 0x41,0x56,0x45,0x57,0x51,0x41,0x51,0x44,0x3a,0x48,0x08,0x09,0x0c,0x0a,0x0b,0x0e, 0x0b,0x0c,0x10,0x0b,0x0d,0x11,0x0b,0x0d,0x11,0x0c,0x0d,0x11,0x0b,0x0c,0x10,0x21, 0x23,0x25,0x0a,0x0c,0x0f,0x09,0x0a,0x0d,0x09,0x09,0x0c,0x08,0x08,0x0a,0x06,0x06, 0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07, 0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x03,0x05,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,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,0x94,0x95, 0x98,0xa7,0xaf,0xc4,0x8c,0x96,0xb2,0x8b,0x95,0xb1,0x8c,0x98,0xb3,0x8d,0x96,0xb3, 0x8d,0x98,0xb3,0x8e,0x99,0xb4,0x91,0x9b,0xb8,0xac,0xb8,0xdb,0x5f,0x66,0x73,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03, 0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x05,0x06,0x07,0x06,0x06,0x0a, 0x07,0x09,0x0d,0x0a,0x0c,0x10,0x0c,0x0f,0x13,0x0e,0x12,0x19,0x12,0x16,0x21,0x1a, 0x1f,0x25,0x1d,0x23,0x26,0x1e,0x25,0x22,0x1a,0x1f,0x27,0x1f,0x26,0x2b,0x22,0x2a, 0x31,0x26,0x2f,0x36,0x2a,0x35,0x3d,0x31,0x3d,0x3f,0x33,0x3f,0x3e,0x32,0x3f,0x3e, 0x32,0x3e,0x39,0x2f,0x3a,0x32,0x2c,0x37,0x2c,0x27,0x35,0x2a,0x27,0x34,0x2f,0x2a, 0x38,0x35,0x2e,0x3c,0x3a,0x32,0x40,0x42,0x36,0x44,0x49,0x3b,0x4b,0x52,0x46,0x58, 0x50,0x47,0x5d,0x46,0x45,0x5e,0x47,0x46,0x60,0x47,0x47,0x61,0x48,0x47,0x62,0x4a, 0x49,0x64,0x4b,0x4a,0x66,0x4b,0x4a,0x66,0x49,0x47,0x61,0x4c,0x43,0x58,0x49,0x41, 0x54,0x3f,0x3e,0x55,0x50,0x57,0x6b,0x70,0x76,0x8b,0x99,0xa1,0xb6,0xb2,0xb1,0xbf, 0x94,0x97,0xad,0x5f,0x61,0x82,0x66,0x64,0x80,0x53,0x4c,0x6a,0x51,0x46,0x62,0x84, 0x81,0x92,0x95,0x8e,0x96,0x2e,0x25,0x2f,0x2d,0x24,0x30,0x35,0x2b,0x39,0x3b,0x30, 0x41,0x32,0x29,0x36,0x27,0x28,0x2f,0xa0,0xa5,0xb7,0x72,0x7e,0x9c,0x5f,0x69,0x8d, 0x88,0x91,0xab,0x85,0x8e,0xa9,0x85,0x8e,0xa9,0x88,0x91,0xaa,0x8b,0x94,0xab,0x8f, 0x99,0xaf,0x8e,0x97,0xad,0x8e,0x96,0xab,0x8b,0x93,0xa9,0x79,0x82,0x9b,0x61,0x69, 0x89,0x72,0x7a,0x94,0x8a,0x8e,0x9e,0x2c,0x30,0x3e,0x33,0x32,0x44,0x3b,0x36,0x49, 0x45,0x3c,0x4e,0x4f,0x44,0x56,0x6e,0x65,0x74,0x63,0x5b,0x6c,0x51,0x47,0x5e,0x55, 0x4b,0x62,0x59,0x4e,0x64,0x5a,0x4e,0x65,0x60,0x56,0x6b,0x6c,0x62,0x75,0x6a,0x61, 0x74,0x65,0x5c,0x6f,0x56,0x4a,0x61,0x55,0x4a,0x5f,0x4d,0x44,0x59,0x42,0x3e,0x52, 0x46,0x3f,0x52,0x43,0x3c,0x50,0x3f,0x38,0x4a,0x3b,0x31,0x3f,0x36,0x2b,0x35,0x3b, 0x31,0x3b,0x69,0x6d,0x81,0x85,0x8a,0x9c,0x8e,0x93,0xa6,0x88,0x8d,0xa1,0x79,0x7c, 0x90,0x42,0x46,0x57,0x53,0x59,0x6e,0x58,0x5d,0x73,0x5b,0x61,0x75,0x71,0x75,0x84, 0x73,0x77,0x87,0x77,0x7a,0x89,0x76,0x7b,0x8a,0x78,0x7d,0x8c,0x77,0x7b,0x8d,0x90, 0x95,0xa2,0xa5,0xa8,0xaf,0xaa,0xad,0xb3,0xa2,0xa6,0xad,0x92,0x96,0xa1,0x96,0x9a, 0xa3,0xa2,0xa4,0xab,0x9a,0x9c,0xa5,0x8e,0x92,0x9b,0x82,0x86,0x92,0x6e,0x74,0x82, 0x5e,0x63,0x75,0x54,0x5a,0x6c,0x52,0x58,0x69,0x56,0x5c,0x6b,0x55,0x5a,0x69,0x4a, 0x50,0x61,0x3e,0x3e,0x54,0x3e,0x3d,0x53,0x3c,0x3c,0x52,0x3e,0x43,0x59,0x43,0x47, 0x5f,0x42,0x43,0x5b,0x42,0x47,0x5a,0x3a,0x3c,0x50,0x37,0x38,0x4b,0x3b,0x38,0x4c, 0x43,0x41,0x55,0x48,0x46,0x5e,0x4a,0x49,0x63,0x47,0x46,0x60,0x45,0x47,0x60,0x3b, 0x3d,0x52,0x44,0x4a,0x5a,0x46,0x4c,0x5a,0x38,0x3d,0x4a,0x26,0x2a,0x36,0x3c,0x40, 0x51,0x72,0x79,0x91,0x9a,0x9b,0xaa,0x83,0x83,0x96,0x61,0x54,0x69,0x58,0x48,0x5b, 0x54,0x45,0x57,0x51,0x42,0x53,0x55,0x45,0x56,0x57,0x46,0x58,0x59,0x48,0x59,0x53, 0x43,0x53,0x53,0x44,0x52,0x9b,0xa0,0xb5,0x5a,0x66,0x8a,0x50,0x4f,0x76,0x50,0x5a, 0x7f,0x20,0x23,0x2e,0x17,0x19,0x20,0x14,0x16,0x1c,0x28,0x28,0x38,0x2d,0x2b,0x44, 0x2e,0x2b,0x43,0x2d,0x2b,0x41,0x57,0x50,0x73,0x57,0x50,0x75,0x5a,0x51,0x75,0x5b, 0x51,0x75,0x5a,0x51,0x77,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5b,0x51,0x77,0x58,0x52, 0x77,0x51,0x4f,0x78,0x51,0x53,0x7a,0x52,0x5c,0x82,0x66,0x72,0x93,0x55,0x52,0x5c, 0x0f,0x11,0x15,0x0e,0x0f,0x13,0x0e,0x0f,0x12,0x0c,0x0d,0x11,0x27,0x23,0x2a,0x52, 0x44,0x53,0x32,0x28,0x31,0x92,0x93,0x9f,0x86,0x8f,0xaa,0x61,0x6d,0x90,0x55,0x62, 0x88,0x51,0x5c,0x85,0x50,0x5c,0x83,0x50,0x5a,0x80,0x4d,0x58,0x7e,0x48,0x54,0x79, 0x44,0x4d,0x72,0x40,0x48,0x6c,0x3e,0x43,0x68,0x3f,0x42,0x64,0x3f,0x40,0x63,0x42, 0x43,0x65,0x47,0x46,0x69,0x3a,0x3a,0x55,0x16,0x18,0x1d,0x1d,0x1f,0x25,0x22,0x24, 0x2b,0x22,0x24,0x2b,0x21,0x23,0x2a,0x22,0x24,0x2b,0x1e,0x21,0x28,0x1e,0x21,0x27, 0x1b,0x1e,0x23,0x35,0x2f,0x37,0x39,0x31,0x3a,0x86,0x8e,0xa8,0x87,0x90,0xaa,0x88, 0x91,0xaa,0x8d,0x94,0xad,0x1b,0x1c,0x21,0x0f,0x11,0x15,0x11,0x12,0x16,0x12,0x14, 0x19,0x12,0x14,0x19,0x12,0x12,0x17,0x11,0x12,0x16,0x10,0x12,0x16,0x10,0x11,0x16, 0x0f,0x11,0x15,0x0e,0x0f,0x14,0x15,0x14,0x1a,0x5d,0x48,0x62,0x4f,0x59,0x80,0x9b, 0x96,0x9b,0x46,0x38,0x44,0x59,0x47,0x59,0x50,0x40,0x50,0x4c,0x44,0x4f,0x2d,0x2d, 0x30,0x2e,0x2f,0x33,0x24,0x25,0x29,0x0f,0x11,0x15,0x0e,0x10,0x15,0x11,0x13,0x18, 0x2a,0x2b,0x2f,0x3c,0x3e,0x41,0x2c,0x2c,0x30,0x0f,0x10,0x14,0x0a,0x0a,0x0e,0x09, 0x09,0x0c,0x09,0x09,0x0c,0x07,0x07,0x0a,0x07,0x06,0x0a,0x06,0x06,0x09,0x06,0x06, 0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06, 0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x29,0x29,0x2a,0xbb,0xc2,0xd2,0x8c,0x95,0xb2,0x86,0x91,0xaf,0x88,0x91, 0xaf,0x8b,0x95,0xb2,0x8b,0x94,0xb1,0x8a,0x94,0xb2,0x8a,0x94,0xb0,0x99,0xa3,0xc4, 0xc0,0xce,0xf6,0x04,0x04,0x05,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,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,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,0x02,0x02,0x02,0x03,0x03, 0x04,0x03,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x05,0x03,0x04,0x05,0x03, 0x04,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x07,0x06,0x06,0x0a,0x08,0x0a, 0x0d,0x0a,0x0c,0x11,0x0e,0x11,0x16,0x11,0x15,0x1a,0x14,0x19,0x1e,0x16,0x1c,0x22, 0x1b,0x21,0x29,0x20,0x27,0x2c,0x22,0x2a,0x2c,0x22,0x2a,0x2d,0x23,0x2b,0x2e,0x23, 0x2c,0x32,0x27,0x30,0x3a,0x2e,0x3a,0x3e,0x32,0x3e,0x41,0x35,0x41,0x42,0x36,0x43, 0x45,0x38,0x46,0x45,0x39,0x47,0x41,0x37,0x46,0x3b,0x34,0x43,0x33,0x2f,0x3f,0x31, 0x2e,0x3e,0x32,0x31,0x42,0x37,0x32,0x42,0x39,0x33,0x44,0x3e,0x36,0x46,0x45,0x3a, 0x49,0x4b,0x3d,0x4c,0x52,0x46,0x57,0x4e,0x48,0x5e,0x49,0x48,0x62,0x49,0x4a,0x64, 0x48,0x49,0x63,0x49,0x49,0x62,0x49,0x48,0x63,0x4a,0x4a,0x66,0x4a,0x49,0x64,0x48, 0x44,0x5b,0x4a,0x40,0x53,0x43,0x3d,0x4f,0x3d,0x3b,0x51,0x4b,0x51,0x6a,0x7e,0x87, 0xa0,0xa3,0xa6,0xb7,0x9f,0xa1,0xb3,0x62,0x6b,0x8b,0x69,0x63,0x7d,0x59,0x55,0x71, 0x57,0x48,0x5f,0x74,0x74,0x88,0xaa,0xa5,0xac,0x35,0x29,0x34,0x2a,0x21,0x2d,0x33, 0x28,0x36,0x3a,0x30,0x40,0x38,0x2f,0x3f,0x0c,0x0b,0x0f,0x7f,0x84,0x93,0x8f,0x97, 0xaf,0x5a,0x66,0x8b,0x82,0x8b,0xa7,0x87,0x90,0xab,0x86,0x8f,0xaa,0x88,0x90,0xac, 0x92,0x9a,0xb0,0x98,0xa1,0xb6,0x9a,0xa2,0xb5,0x98,0x9f,0xb4,0x95,0x9c,0xb0,0x8b, 0x93,0xa8,0x69,0x72,0x8f,0x68,0x72,0x8e,0x8a,0x91,0xa6,0x44,0x48,0x56,0x35,0x33, 0x46,0x41,0x3b,0x4e,0x47,0x3f,0x52,0x4d,0x43,0x56,0x68,0x5d,0x6d,0x6f,0x66,0x74, 0x60,0x56,0x68,0x52,0x47,0x5c,0x74,0x6c,0x7c,0x5f,0x55,0x6a,0x75,0x6b,0x7e,0x5f, 0x55,0x6a,0x56,0x4a,0x60,0x6a,0x60,0x72,0x5a,0x51,0x64,0x57,0x4c,0x62,0x57,0x4c, 0x61,0x53,0x47,0x5b,0x51,0x45,0x5a,0x4b,0x41,0x53,0x44,0x3a,0x4b,0x3c,0x30,0x3c, 0x2d,0x22,0x2a,0x2e,0x24,0x2c,0x5a,0x5a,0x6a,0x6f,0x73,0x83,0x7c,0x7f,0x90,0x7d, 0x7f,0x91,0x76,0x76,0x8a,0x3a,0x38,0x4c,0x46,0x46,0x5e,0x49,0x4a,0x64,0x48,0x4b, 0x64,0x56,0x5a,0x6f,0x50,0x55,0x6d,0x53,0x58,0x6d,0x56,0x5a,0x6f,0x52,0x57,0x6c, 0x56,0x5d,0x71,0x62,0x66,0x79,0x72,0x75,0x85,0x7f,0x82,0x90,0x88,0x8c,0x99,0x81, 0x86,0x94,0x82,0x87,0x96,0x8e,0x92,0x9e,0x96,0x9a,0xa3,0x9a,0x9d,0xa5,0x98,0x9b, 0xa3,0x84,0x88,0x93,0x6a,0x6f,0x7e,0x5b,0x61,0x72,0x59,0x5e,0x6e,0x5a,0x5f,0x6e, 0x5c,0x61,0x6f,0x55,0x5a,0x69,0x50,0x55,0x65,0x4e,0x53,0x63,0x49,0x4e,0x5f,0x3d, 0x42,0x56,0x3f,0x43,0x5a,0x40,0x46,0x5d,0x3f,0x45,0x5a,0x48,0x4d,0x60,0x3c,0x3f, 0x52,0x36,0x36,0x49,0x37,0x35,0x48,0x42,0x3d,0x52,0x46,0x45,0x5e,0x4a,0x4a,0x65, 0x47,0x47,0x61,0x3d,0x3d,0x52,0x3b,0x41,0x52,0x4e,0x52,0x60,0x46,0x4b,0x58,0x2b, 0x2f,0x3b,0x52,0x59,0x74,0x71,0x78,0x91,0xa4,0xa7,0xb3,0x95,0x98,0xa8,0x86,0x86, 0x96,0x58,0x4d,0x61,0x50,0x42,0x54,0x52,0x44,0x55,0x55,0x46,0x56,0x57,0x47,0x58, 0x58,0x48,0x59,0x58,0x47,0x58,0x4d,0x3e,0x4d,0x97,0x91,0x9b,0x6a,0x74,0x96,0x50, 0x56,0x7d,0x50,0x5a,0x80,0x1d,0x1e,0x29,0x16,0x19,0x20,0x14,0x16,0x1d,0x26,0x26, 0x36,0x2c,0x2c,0x43,0x2d,0x2a,0x42,0x2d,0x2a,0x42,0x59,0x51,0x74,0x5a,0x51,0x75, 0x5b,0x51,0x75,0x5b,0x50,0x76,0x5a,0x51,0x77,0x5c,0x52,0x77,0x5c,0x53,0x77,0x5a, 0x51,0x77,0x58,0x52,0x77,0x51,0x4f,0x78,0x51,0x53,0x7a,0x52,0x5c,0x82,0x66,0x70, 0x92,0x5a,0x57,0x62,0x0f,0x11,0x16,0x0f,0x11,0x15,0x0e,0x10,0x14,0x0e,0x0f,0x13, 0x22,0x1f,0x26,0x51,0x43,0x53,0x38,0x2d,0x36,0x8b,0x89,0x97,0x86,0x90,0xaa,0x63, 0x6f,0x92,0x56,0x62,0x88,0x52,0x5c,0x84,0x51,0x5c,0x83,0x4f,0x59,0x80,0x4c,0x57, 0x7c,0x47,0x53,0x79,0x45,0x4f,0x73,0x43,0x4a,0x6c,0x3f,0x44,0x68,0x3d,0x40,0x63, 0x40,0x41,0x64,0x42,0x42,0x65,0x46,0x46,0x6b,0x3a,0x3b,0x55,0x18,0x1a,0x1f,0x1f, 0x22,0x28,0x25,0x27,0x2f,0x26,0x28,0x30,0x24,0x27,0x2e,0x22,0x25,0x2d,0x22,0x24, 0x2b,0x21,0x23,0x2a,0x1e,0x21,0x27,0x25,0x24,0x2b,0x38,0x31,0x3b,0x72,0x76,0x87, 0x85,0x8e,0xa8,0x8d,0x94,0xad,0x9b,0xa2,0xb6,0x71,0x75,0x82,0x0f,0x11,0x15,0x11, 0x12,0x17,0x12,0x14,0x19,0x13,0x14,0x1a,0x12,0x14,0x1a,0x12,0x13,0x19,0x12,0x13, 0x18,0x11,0x12,0x17,0x10,0x12,0x17,0x0f,0x11,0x16,0x23,0x1e,0x29,0x5b,0x47,0x62, 0x60,0x6b,0x8e,0x6f,0x68,0x6e,0x4a,0x3a,0x49,0x59,0x48,0x5a,0x51,0x41,0x51,0x1d, 0x1a,0x21,0x0c,0x0e,0x12,0x0e,0x10,0x15,0x12,0x12,0x18,0x17,0x19,0x1e,0x29,0x2a, 0x2f,0x55,0x56,0x5a,0x2c,0x2e,0x33,0x14,0x15,0x1b,0x2a,0x2b,0x30,0x24,0x26,0x2b, 0x0b,0x0d,0x11,0x0a,0x0b,0x0f,0x0a,0x0a,0x0d,0x09,0x09,0x0b,0x07,0x07,0x0a,0x07, 0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05, 0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04,0x03,0x05,0x04,0x03,0x05, 0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,0xc6,0xc9,0xd3,0x98,0xa1,0xba,0x82, 0x8d,0xab,0x84,0x8e,0xac,0x85,0x8e,0xad,0x86,0x92,0xaf,0x86,0x91,0xaf,0x89,0x93, 0xb1,0x8d,0x97,0xb5,0xa2,0xb0,0xd4,0x5d,0x64,0x77,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,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,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,0x0a, 0x0a,0x0d,0x16,0x16,0x19,0x0d,0x0e,0x0f,0x04,0x03,0x05,0x05,0x04,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x04,0x03,0x03,0x05,0x03,0x04,0x06,0x05,0x06,0x06,0x05,0x06,0x08, 0x06,0x07,0x0a,0x08,0x0a,0x09,0x06,0x08,0x08,0x06,0x06,0x0a,0x07,0x09,0x0c,0x09, 0x0a,0x11,0x0d,0x10,0x16,0x12,0x16,0x1e,0x17,0x1d,0x24,0x1d,0x23,0x27,0x1f,0x26, 0x2a,0x21,0x28,0x29,0x20,0x28,0x2b,0x22,0x2a,0x2d,0x23,0x2b,0x2d,0x23,0x2b,0x31, 0x27,0x31,0x35,0x2a,0x35,0x3a,0x2f,0x3a,0x3e,0x32,0x3f,0x44,0x37,0x45,0x46,0x39, 0x47,0x47,0x3a,0x49,0x47,0x3c,0x4b,0x46,0x3b,0x4b,0x41,0x39,0x4a,0x3d,0x37,0x49, 0x38,0x36,0x4a,0x3b,0x3a,0x50,0x3c,0x3d,0x52,0x3d,0x3a,0x51,0x3a,0x39,0x4d,0x39, 0x37,0x4b,0x3c,0x38,0x4a,0x48,0x3e,0x50,0x50,0x41,0x52,0x56,0x4a,0x5e,0x4a,0x49, 0x63,0x49,0x4a,0x65,0x4a,0x4b,0x66,0x4a,0x4b,0x66,0x4a,0x4a,0x66,0x4a,0x4a,0x65, 0x4a,0x49,0x63,0x48,0x46,0x60,0x47,0x40,0x56,0x42,0x3a,0x4d,0x41,0x3b,0x4e,0x4c, 0x44,0x58,0x5e,0x5d,0x7e,0x6c,0x73,0x90,0x78,0x7b,0x95,0x66,0x6e,0x8b,0x6b,0x65, 0x80,0x58,0x51,0x6b,0x52,0x41,0x56,0x63,0x62,0x7c,0xaf,0xaa,0xb2,0x41,0x36,0x3f, 0x28,0x21,0x2b,0x2e,0x25,0x32,0x38,0x2d,0x3f,0x3b,0x30,0x45,0x15,0x14,0x1b,0x54, 0x57,0x62,0xa1,0xa6,0xba,0x69,0x74,0x95,0x72,0x7d,0x9d,0x87,0x90,0xab,0x85,0x8f, 0xaa,0x89,0x91,0xac,0x95,0x9c,0xb2,0x9c,0xa4,0xb9,0x9e,0xa4,0xb8,0x9a,0xa1,0xb5, 0x9a,0xa1,0xb4,0x95,0x9b,0xb0,0x7c,0x85,0x9e,0x70,0x7a,0x95,0x85,0x8d,0xa3,0x6f, 0x73,0x82,0x37,0x3c,0x50,0x3e,0x3e,0x55,0x40,0x3f,0x56,0x49,0x44,0x5b,0x6f,0x67, 0x76,0x5f,0x51,0x63,0x52,0x47,0x5a,0x51,0x46,0x58,0x58,0x4b,0x5d,0x6d,0x62,0x72, 0x6c,0x62,0x72,0x57,0x4c,0x60,0x56,0x4c,0x61,0x64,0x5a,0x6d,0x62,0x57,0x6b,0x56, 0x4a,0x60,0x56,0x4b,0x5f,0x57,0x4b,0x5f,0x55,0x49,0x5b,0x50,0x46,0x58,0x4c,0x42, 0x52,0x41,0x34,0x42,0x28,0x1e,0x24,0x26,0x1d,0x23,0x58,0x58,0x67,0x6a,0x6b,0x7c, 0x70,0x72,0x82,0x72,0x72,0x82,0x6c,0x67,0x79,0x47,0x3b,0x4c,0x4d,0x42,0x54,0x51, 0x46,0x57,0x50,0x46,0x58,0x4d,0x43,0x56,0x4a,0x42,0x57,0x46,0x41,0x57,0x44,0x3f, 0x56,0x44,0x3f,0x57,0x45,0x42,0x59,0x46,0x43,0x5b,0x46,0x48,0x5f,0x49,0x4b,0x62, 0x61,0x65,0x76,0x6e,0x74,0x84,0x6d,0x72,0x85,0x73,0x7a,0x8b,0x85,0x8a,0x96,0x95, 0x99,0xa2,0x97,0x9a,0xa4,0x86,0x8a,0x96,0x6e,0x73,0x81,0x5f,0x65,0x75,0x5d,0x62, 0x73,0x5a,0x60,0x73,0x5c,0x62,0x73,0x5d,0x62,0x71,0x5d,0x61,0x6e,0x5b,0x60,0x6c, 0x56,0x5b,0x69,0x50,0x56,0x65,0x50,0x55,0x64,0x55,0x5a,0x69,0x3e,0x44,0x59,0x3f, 0x46,0x5a,0x47,0x4d,0x60,0x40,0x44,0x56,0x34,0x37,0x49,0x35,0x34,0x46,0x3e,0x3b, 0x50,0x46,0x44,0x5a,0x49,0x47,0x62,0x43,0x42,0x5a,0x3a,0x3c,0x51,0x3a,0x3e,0x50, 0x45,0x4a,0x58,0x47,0x48,0x59,0x5e,0x57,0x6e,0x71,0x73,0x8b,0xaa,0xad,0xb8,0x99, 0x9e,0xad,0x91,0x97,0xa8,0x8e,0x8e,0x9a,0x51,0x45,0x56,0x53,0x46,0x56,0x55,0x46, 0x57,0x57,0x48,0x59,0x58,0x48,0x5a,0x59,0x48,0x5a,0x52,0x42,0x51,0x5e,0x51,0x5e, 0x85,0x8f,0xa8,0x52,0x5d,0x83,0x4f,0x5a,0x7e,0x19,0x1b,0x24,0x17,0x1a,0x21,0x16, 0x17,0x1e,0x26,0x26,0x34,0x2c,0x2c,0x43,0x2d,0x2a,0x42,0x30,0x2b,0x42,0x59,0x51, 0x73,0x59,0x51,0x74,0x5a,0x51,0x74,0x5b,0x50,0x76,0x5c,0x52,0x77,0x5c,0x52,0x77, 0x5c,0x53,0x77,0x5b,0x52,0x77,0x55,0x51,0x77,0x52,0x4f,0x78,0x51,0x52,0x79,0x51, 0x5c,0x82,0x65,0x6f,0x91,0x5f,0x5d,0x68,0x10,0x12,0x16,0x0f,0x11,0x15,0x0f,0x11, 0x15,0x0e,0x0f,0x13,0x1d,0x1c,0x22,0x52,0x44,0x54,0x3c,0x30,0x3b,0x8a,0x8a,0x96, 0x84,0x8e,0xa9,0x64,0x6f,0x93,0x58,0x64,0x89,0x53,0x5d,0x84,0x51,0x5c,0x83,0x4f, 0x5a,0x80,0x4d,0x58,0x7f,0x4b,0x54,0x7b,0x45,0x4f,0x73,0x43,0x4c,0x70,0x3f,0x44, 0x69,0x3f,0x43,0x64,0x40,0x41,0x66,0x42,0x42,0x67,0x47,0x47,0x6c,0x3a,0x3b,0x55, 0x1a,0x1c,0x22,0x22,0x25,0x2c,0x26,0x28,0x2f,0x26,0x28,0x30,0x26,0x29,0x31,0x24, 0x27,0x2e,0x21,0x23,0x2a,0x21,0x23,0x2a,0x20,0x22,0x2a,0x1e,0x20,0x26,0x3a,0x34, 0x3e,0x41,0x3b,0x46,0x91,0x99,0xaf,0x9a,0xa0,0xb5,0xab,0xb1,0xc1,0xa0,0xa5,0xb5, 0x10,0x12,0x16,0x12,0x13,0x17,0x12,0x13,0x19,0x13,0x16,0x1a,0x13,0x15,0x1a,0x12, 0x15,0x1a,0x12,0x14,0x19,0x12,0x13,0x19,0x12,0x13,0x18,0x11,0x12,0x17,0x2f,0x28, 0x35,0x5c,0x48,0x63,0x90,0x98,0xb0,0x42,0x39,0x41,0x4d,0x3e,0x4d,0x57,0x46,0x59, 0x54,0x44,0x55,0x09,0x0a,0x0d,0x0e,0x0f,0x13,0x12,0x14,0x1a,0x14,0x16,0x1c,0x34, 0x37,0x3c,0x2c,0x2f,0x34,0x2a,0x2c,0x31,0x19,0x1b,0x21,0x16,0x18,0x1e,0x1e,0x20, 0x25,0x30,0x32,0x37,0x1a,0x1b,0x1f,0x0d,0x0e,0x12,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e, 0x0a,0x0a,0x0d,0x09,0x09,0x0c,0x07,0x07,0x0a,0x07,0x06,0x0a,0x06,0x06,0x09,0x06, 0x06,0x08,0x06,0x06,0x08,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04, 0x06,0x04,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,0x5f,0x61,0x63, 0xa8,0xb0,0xc6,0x82,0x8c,0xab,0x7e,0x89,0xa9,0x82,0x8c,0xab,0x82,0x8d,0xac,0x84, 0x8e,0xad,0x84,0x90,0xad,0x84,0x8e,0xad,0x90,0x9c,0xbd,0xb0,0xc0,0xe7,0x04,0x04, 0x04,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,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,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, 0x04,0x04,0x06,0x1a,0x1b,0x1e,0x21,0x22,0x26,0x0a,0x0b,0x0e,0x06,0x06,0x07,0x08, 0x08,0x0a,0x06,0x05,0x06,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x03,0x05,0x03,0x04,0x06,0x05,0x06,0x09,0x06,0x08,0x0a,0x07,0x09,0x0a,0x08,0x0a, 0x0a,0x08,0x0a,0x0f,0x0b,0x0e,0x16,0x11,0x14,0x12,0x0e,0x11,0x0e,0x0a,0x0b,0x0e, 0x0a,0x0c,0x14,0x0f,0x12,0x1c,0x16,0x1a,0x22,0x1b,0x22,0x28,0x20,0x28,0x2e,0x24, 0x2e,0x31,0x27,0x31,0x34,0x2a,0x33,0x32,0x28,0x32,0x31,0x27,0x30,0x32,0x27,0x31, 0x35,0x2a,0x35,0x36,0x2c,0x37,0x3b,0x30,0x3c,0x3e,0x34,0x41,0x45,0x39,0x48,0x47, 0x3d,0x4c,0x47,0x3e,0x4e,0x44,0x3b,0x4b,0x42,0x3a,0x4b,0x40,0x38,0x4a,0x3b,0x37, 0x4a,0x3a,0x3a,0x4e,0x3e,0x42,0x58,0x43,0x4a,0x61,0x4a,0x51,0x68,0x45,0x4b,0x62, 0x41,0x46,0x5c,0x41,0x45,0x5a,0x3e,0x42,0x56,0x3e,0x3d,0x52,0x4b,0x41,0x55,0x52, 0x45,0x56,0x57,0x4c,0x62,0x4a,0x49,0x63,0x4a,0x4a,0x66,0x4a,0x4c,0x66,0x4a,0x4c, 0x66,0x4a,0x4a,0x65,0x47,0x46,0x61,0x46,0x45,0x5f,0x42,0x40,0x56,0x41,0x3a,0x4e, 0x42,0x3a,0x4b,0x4a,0x3c,0x4c,0x5f,0x55,0x6d,0x5f,0x54,0x6e,0x5f,0x51,0x6c,0x53, 0x5c,0x7b,0x57,0x5a,0x76,0x59,0x53,0x6b,0x50,0x3e,0x52,0x5a,0x5b,0x75,0xa2,0x9f, 0xa9,0x45,0x3d,0x47,0x26,0x1f,0x28,0x2c,0x23,0x2e,0x36,0x2c,0x3b,0x39,0x30,0x44, 0x25,0x26,0x32,0x22,0x22,0x28,0xa2,0xa7,0xb9,0x81,0x8a,0xa7,0x66,0x70,0x94,0x87, 0x90,0xac,0x88,0x92,0xac,0x85,0x8e,0xa9,0x8b,0x94,0xad,0x97,0x9e,0xb3,0x98,0x9f, 0xb4,0x9b,0xa2,0xb5,0x97,0x9e,0xb2,0x9a,0xa1,0xb2,0x8f,0x97,0xab,0x83,0x8a,0xa2, 0x8c,0x94,0xaa,0x9e,0xa4,0xb3,0x63,0x69,0x78,0x61,0x67,0x79,0x71,0x76,0x87,0x66, 0x66,0x7b,0x6f,0x68,0x79,0x55,0x48,0x5b,0x56,0x48,0x5b,0x55,0x4a,0x5d,0x53,0x46, 0x58,0x55,0x46,0x57,0x55,0x46,0x57,0x53,0x44,0x56,0x55,0x47,0x5a,0x5d,0x52,0x63, 0x5b,0x50,0x63,0x53,0x47,0x5c,0x52,0x48,0x5b,0x54,0x49,0x5e,0x56,0x4d,0x61,0x56, 0x4b,0x60,0x54,0x49,0x5c,0x4e,0x40,0x51,0x3c,0x2e,0x38,0x24,0x1a,0x1f,0x5d,0x5f, 0x6c,0x65,0x68,0x77,0x67,0x68,0x77,0x68,0x6a,0x78,0x5e,0x5b,0x69,0x4d,0x43,0x50, 0x4d,0x44,0x52,0x52,0x49,0x57,0x54,0x4a,0x5a,0x53,0x4a,0x59,0x50,0x45,0x54,0x4a, 0x3e,0x4e,0x4c,0x3f,0x50,0x4b,0x41,0x52,0x4b,0x43,0x57,0x4c,0x45,0x5a,0x4e,0x46, 0x5a,0x4e,0x46,0x5a,0x46,0x45,0x5b,0x49,0x4c,0x62,0x4c,0x50,0x67,0x4c,0x51,0x6a, 0x6a,0x6f,0x81,0x7d,0x82,0x90,0x8c,0x90,0x9c,0x87,0x8b,0x97,0x7a,0x7e,0x8d,0x68, 0x6e,0x7e,0x64,0x6a,0x7a,0x5b,0x62,0x75,0x57,0x5e,0x73,0x5f,0x66,0x76,0x60,0x65, 0x74,0x62,0x67,0x73,0x64,0x69,0x74,0x62,0x66,0x72,0x65,0x69,0x75,0x65,0x6a,0x76, 0x64,0x69,0x74,0x4f,0x56,0x66,0x41,0x47,0x5d,0x46,0x4b,0x5f,0x4a,0x4e,0x5f,0x41, 0x44,0x56,0x39,0x3c,0x4e,0x3e,0x3a,0x50,0x44,0x3f,0x55,0x41,0x3f,0x56,0x42,0x47, 0x5c,0x35,0x3a,0x4c,0x34,0x38,0x49,0x64,0x60,0x75,0x5e,0x59,0x6a,0x7b,0x76,0x89, 0xac,0xaf,0xba,0x9b,0xa1,0xb0,0x8e,0x93,0xa7,0x87,0x8d,0xa3,0x81,0x7b,0x88,0x54, 0x46,0x57,0x55,0x47,0x58,0x57,0x48,0x5a,0x58,0x49,0x5a,0x58,0x48,0x5a,0x57,0x47, 0x58,0x4d,0x3f,0x4e,0x90,0x8e,0x9e,0x5e,0x68,0x8b,0x4e,0x56,0x7c,0x17,0x19,0x21, 0x18,0x1a,0x22,0x16,0x17,0x1e,0x26,0x26,0x36,0x2d,0x2c,0x45,0x2e,0x2b,0x44,0x2f, 0x2b,0x42,0x58,0x51,0x74,0x59,0x51,0x74,0x5a,0x51,0x75,0x5a,0x50,0x75,0x5c,0x51, 0x76,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5a,0x52,0x76,0x55,0x50,0x77,0x51,0x4f,0x77, 0x52,0x52,0x79,0x51,0x5b,0x82,0x62,0x6e,0x8f,0x5f,0x5d,0x69,0x11,0x12,0x16,0x10, 0x12,0x16,0x0f,0x11,0x15,0x0f,0x11,0x15,0x18,0x17,0x1d,0x50,0x43,0x53,0x3e,0x34, 0x3e,0x86,0x83,0x90,0x84,0x8f,0xaa,0x65,0x6f,0x94,0x56,0x62,0x88,0x53,0x5d,0x85, 0x51,0x5c,0x82,0x4f,0x5a,0x82,0x4d,0x58,0x7f,0x4a,0x54,0x7c,0x48,0x4f,0x75,0x43, 0x4d,0x72,0x43,0x48,0x6c,0x3f,0x43,0x66,0x41,0x44,0x66,0x43,0x43,0x68,0x47,0x47, 0x6c,0x3c,0x3b,0x56,0x1c,0x1e,0x23,0x23,0x26,0x2d,0x29,0x2b,0x34,0x28,0x2a,0x33, 0x25,0x27,0x2f,0x26,0x28,0x30,0x25,0x27,0x2f,0x22,0x26,0x2d,0x22,0x24,0x2b,0x21, 0x23,0x2a,0x33,0x30,0x3a,0x3a,0x33,0x3d,0x90,0x91,0x9e,0xa5,0xab,0xbc,0xad,0xb3, 0xc3,0xa6,0xac,0xbe,0x2a,0x2c,0x33,0x12,0x13,0x18,0x14,0x16,0x1b,0x15,0x16,0x1d, 0x15,0x17,0x1d,0x15,0x17,0x1d,0x14,0x16,0x1c,0x14,0x16,0x1b,0x13,0x15,0x1a,0x12, 0x13,0x19,0x38,0x2e,0x3f,0x5d,0x4b,0x68,0xbf,0xc4,0xcf,0x34,0x29,0x31,0x51,0x42, 0x52,0x56,0x47,0x57,0x58,0x47,0x5a,0x0a,0x0a,0x0e,0x10,0x12,0x16,0x14,0x16,0x1c, 0x19,0x1a,0x22,0x1a,0x1c,0x23,0x1b,0x1e,0x25,0x1b,0x1e,0x25,0x1d,0x1e,0x26,0x1a, 0x1d,0x23,0x19,0x1b,0x22,0x20,0x22,0x28,0x1c,0x1e,0x24,0x10,0x12,0x17,0x0e,0x0f, 0x14,0x0d,0x0e,0x12,0x0b,0x0c,0x10,0x0a,0x0b,0x0f,0x09,0x09,0x0c,0x08,0x08,0x0b, 0x07,0x06,0x0a,0x07,0x06,0x0a,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x05,0x07,0x05, 0x05,0x06,0x05,0x05,0x06,0x05,0x04,0x06,0x04,0x03,0x05,0x03,0x03,0x04,0x03,0x03, 0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x10,0x10,0x10,0xb8,0xbf,0xd0,0x89,0x93,0xb1,0x7d,0x88,0xa9,0x7d,0x89,0xa9, 0x7e,0x89,0xa9,0x80,0x8a,0xaa,0x81,0x8b,0xaa,0x81,0x8c,0xab,0x85,0x90,0xaf,0x9a, 0xa8,0xca,0x5c,0x63,0x6e,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,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,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,0x06,0x06,0x09,0x26,0x28,0x2d,0x2a,0x2c,0x31,0x10,0x11,0x16, 0x04,0x03,0x04,0x0b,0x0a,0x0d,0x0e,0x0e,0x12,0x0e,0x0c,0x0e,0x07,0x06,0x06,0x05, 0x03,0x04,0x06,0x05,0x06,0x0b,0x09,0x0a,0x12,0x0e,0x11,0x15,0x10,0x14,0x15,0x10, 0x14,0x12,0x0e,0x12,0x12,0x0e,0x11,0x15,0x10,0x13,0x1d,0x16,0x1a,0x1a,0x13,0x17, 0x14,0x0e,0x12,0x17,0x11,0x15,0x20,0x18,0x1e,0x28,0x1e,0x26,0x2e,0x24,0x2d,0x32, 0x28,0x32,0x37,0x2c,0x37,0x3b,0x30,0x3b,0x3e,0x32,0x3e,0x3f,0x33,0x40,0x3e,0x32, 0x3f,0x3e,0x32,0x3f,0x3b,0x32,0x3f,0x3a,0x33,0x42,0x3c,0x35,0x45,0x3c,0x36,0x48, 0x3d,0x3a,0x4e,0x3e,0x3e,0x54,0x40,0x3f,0x55,0x3a,0x39,0x4d,0x36,0x35,0x48,0x35, 0x36,0x48,0x3a,0x40,0x52,0x4d,0x53,0x65,0x52,0x58,0x6b,0x56,0x5c,0x6f,0x50,0x57, 0x6d,0x49,0x50,0x67,0x4a,0x51,0x68,0x4a,0x52,0x69,0x48,0x4e,0x66,0x44,0x47,0x5f, 0x42,0x41,0x58,0x4e,0x45,0x5a,0x55,0x4a,0x5e,0x52,0x4b,0x63,0x4c,0x4a,0x66,0x4b, 0x4a,0x65,0x4a,0x4a,0x65,0x49,0x49,0x63,0x46,0x47,0x60,0x42,0x42,0x5a,0x41,0x40, 0x56,0x3f,0x3e,0x52,0x3e,0x3b,0x4e,0x46,0x3e,0x4e,0x5d,0x52,0x69,0x3d,0x38,0x4a, 0x40,0x35,0x47,0x5e,0x57,0x71,0x53,0x58,0x74,0x5a,0x59,0x72,0x50,0x42,0x58,0x4f, 0x50,0x6c,0x92,0x90,0x9e,0x50,0x49,0x53,0x25,0x1f,0x27,0x27,0x20,0x29,0x31,0x27, 0x36,0x39,0x30,0x43,0x2d,0x2e,0x3f,0x09,0x08,0x0a,0x8c,0x91,0xa1,0x9b,0xa2,0xb8, 0x65,0x6f,0x93,0x7e,0x88,0xa6,0x8b,0x93,0xae,0x8a,0x92,0xac,0x89,0x92,0xab,0x88, 0x91,0xa8,0x8a,0x92,0xa9,0x8c,0x94,0xa8,0x8f,0x97,0xaa,0x96,0x9d,0xb0,0x9e,0xa4, 0xb6,0x90,0x98,0xac,0x94,0x9d,0xb1,0xb2,0xb8,0xc7,0x93,0x97,0xa2,0x82,0x86,0x95, 0x79,0x7f,0x8f,0x60,0x68,0x7d,0x4d,0x4c,0x64,0x56,0x4a,0x5e,0x57,0x4b,0x60,0x55, 0x4a,0x60,0x55,0x4a,0x60,0x55,0x4a,0x5d,0x53,0x45,0x56,0x4f,0x40,0x51,0x50,0x41, 0x52,0x55,0x45,0x56,0x53,0x47,0x58,0x50,0x46,0x57,0x52,0x47,0x5c,0x56,0x4a,0x60, 0x56,0x4b,0x62,0x59,0x4d,0x62,0x5a,0x4e,0x62,0x58,0x4a,0x5d,0x4d,0x3e,0x4d,0x32, 0x26,0x2f,0x55,0x54,0x60,0x66,0x69,0x79,0x6a,0x6d,0x7c,0x6c,0x6d,0x7d,0x6f,0x6f, 0x7e,0x58,0x4e,0x5d,0x50,0x44,0x54,0x4c,0x3f,0x4e,0x49,0x3d,0x4b,0x46,0x3a,0x46, 0x48,0x3a,0x48,0x48,0x3a,0x49,0x41,0x34,0x42,0x4a,0x3b,0x4b,0x4c,0x3f,0x51,0x4c, 0x41,0x52,0x4c,0x41,0x53,0x4e,0x42,0x56,0x4e,0x43,0x56,0x4e,0x46,0x5c,0x4e,0x48, 0x5d,0x4e,0x46,0x5b,0x47,0x4c,0x62,0x5c,0x60,0x74,0x75,0x7a,0x8a,0x7e,0x82,0x91, 0x79,0x7e,0x8d,0x71,0x76,0x86,0x6e,0x73,0x82,0x63,0x69,0x7a,0x5c,0x63,0x76,0x5d, 0x63,0x76,0x62,0x67,0x77,0x65,0x6a,0x77,0x6a,0x6f,0x7b,0x71,0x76,0x80,0x71,0x75, 0x80,0x72,0x76,0x81,0x71,0x75,0x80,0x6c,0x71,0x7c,0x62,0x67,0x74,0x53,0x59,0x6a, 0x51,0x56,0x69,0x57,0x5c,0x6c,0x4c,0x51,0x61,0x3a,0x3e,0x52,0x40,0x44,0x57,0x36, 0x39,0x4b,0x2d,0x30,0x3f,0x38,0x3b,0x46,0x4e,0x4e,0x60,0x65,0x60,0x72,0x64,0x5f, 0x6d,0x7a,0x75,0x85,0xaf,0xb3,0xbb,0x9e,0xa3,0xb2,0x8b,0x92,0xa6,0x6f,0x78,0x93, 0x84,0x8a,0x9f,0x68,0x5c,0x6c,0x55,0x48,0x58,0x57,0x49,0x5a,0x59,0x49,0x5b,0x58, 0x49,0x5a,0x58,0x48,0x5a,0x53,0x45,0x55,0x63,0x59,0x66,0x6f,0x79,0x97,0x4c,0x56, 0x78,0x16,0x19,0x21,0x18,0x1a,0x22,0x16,0x19,0x20,0x25,0x24,0x33,0x2f,0x2c,0x45, 0x30,0x2d,0x43,0x30,0x2b,0x42,0x58,0x51,0x72,0x59,0x51,0x74,0x5c,0x51,0x73,0x5c, 0x51,0x74,0x5b,0x51,0x76,0x5c,0x52,0x76,0x5c,0x52,0x77,0x5a,0x51,0x76,0x5a,0x52, 0x77,0x52,0x51,0x77,0x52,0x52,0x79,0x52,0x5c,0x80,0x62,0x6c,0x8e,0x63,0x63,0x70, 0x12,0x14,0x19,0x12,0x12,0x17,0x11,0x12,0x16,0x10,0x12,0x16,0x14,0x15,0x1a,0x4c, 0x40,0x4f,0x3e,0x33,0x3e,0x86,0x83,0x8f,0x83,0x8d,0xa9,0x63,0x6f,0x93,0x58,0x63, 0x87,0x53,0x5e,0x85,0x4f,0x5a,0x82,0x4f,0x5a,0x82,0x4f,0x58,0x81,0x4a,0x54,0x7c, 0x48,0x53,0x78,0x46,0x4e,0x73,0x43,0x48,0x6d,0x41,0x44,0x69,0x42,0x44,0x67,0x45, 0x45,0x6a,0x47,0x47,0x6b,0x3e,0x3d,0x59,0x1c,0x1e,0x23,0x24,0x26,0x2e,0x27,0x2a, 0x32,0x29,0x2b,0x34,0x27,0x2a,0x32,0x25,0x27,0x30,0x22,0x26,0x2e,0x24,0x26,0x2e, 0x24,0x26,0x2e,0x23,0x26,0x2e,0x24,0x26,0x2d,0x3c,0x36,0x42,0x5b,0x57,0x61,0xc3, 0xc5,0xcf,0xa7,0xac,0xbd,0x97,0xa0,0xb4,0x66,0x6c,0x7c,0x13,0x15,0x1a,0x15,0x17, 0x1d,0x17,0x19,0x1f,0x18,0x1a,0x21,0x19,0x1b,0x22,0x18,0x1a,0x21,0x17,0x1a,0x20, 0x16,0x19,0x1f,0x13,0x15,0x1a,0x3e,0x32,0x43,0x5e,0x50,0x6f,0xcf,0xd0,0xd5,0x3a, 0x2e,0x39,0x55,0x45,0x57,0x5b,0x49,0x5c,0x5e,0x4d,0x61,0x0b,0x0d,0x11,0x13,0x15, 0x1b,0x17,0x1a,0x20,0x1a,0x1d,0x24,0x1e,0x21,0x29,0x20,0x22,0x2a,0x20,0x23,0x2b, 0x22,0x25,0x2d,0x22,0x24,0x2c,0x20,0x22,0x2a,0x1d,0x1f,0x26,0x19,0x1b,0x22,0x2b, 0x2c,0x32,0x28,0x2a,0x2f,0x10,0x12,0x16,0x0e,0x10,0x15,0x0d,0x0e,0x12,0x0b,0x0c, 0x10,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x08, 0x06,0x06,0x07,0x06,0x05,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x03, 0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 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,0x99,0x9e,0xa9,0x93,0x9c,0xb7,0x7c,0x88, 0xa8,0x7a,0x85,0xa5,0x7d,0x88,0xa8,0x80,0x8a,0xaa,0x80,0x8b,0xaa,0x80,0x8a,0xaa, 0x83,0x8e,0xac,0x8a,0x94,0xb5,0xb3,0xc1,0xee,0x03,0x03,0x03,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,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,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,0x07,0x07,0x0a,0x2d,0x2f,0x35,0x3f,0x42, 0x48,0x27,0x2a,0x30,0x0f,0x0e,0x12,0x0f,0x0d,0x10,0x18,0x18,0x21,0x1c,0x1e,0x27, 0x16,0x12,0x17,0x0a,0x08,0x0a,0x0f,0x0c,0x0e,0x1a,0x14,0x19,0x25,0x1e,0x25,0x28, 0x20,0x28,0x27,0x1f,0x26,0x23,0x1c,0x22,0x20,0x1a,0x20,0x1b,0x16,0x1a,0x1e,0x16, 0x1c,0x1c,0x15,0x1a,0x1c,0x16,0x1a,0x27,0x1e,0x26,0x33,0x29,0x32,0x39,0x2e,0x39, 0x3a,0x2f,0x3a,0x3d,0x32,0x3e,0x40,0x34,0x42,0x44,0x38,0x46,0x46,0x3b,0x4a,0x45, 0x3b,0x4b,0x40,0x38,0x49,0x38,0x34,0x45,0x33,0x32,0x45,0x37,0x37,0x4a,0x39,0x39, 0x4e,0x3d,0x42,0x58,0x4f,0x55,0x6a,0x4f,0x56,0x6b,0x49,0x51,0x68,0x46,0x4e,0x62, 0x3e,0x43,0x57,0x4a,0x51,0x62,0x5e,0x63,0x73,0x64,0x6a,0x7a,0x60,0x66,0x76,0x5b, 0x61,0x72,0x59,0x5f,0x71,0x53,0x5a,0x6e,0x4e,0x56,0x6c,0x50,0x58,0x6f,0x4e,0x56, 0x6e,0x49,0x50,0x69,0x46,0x49,0x62,0x46,0x46,0x5f,0x45,0x44,0x5d,0x50,0x49,0x61, 0x56,0x4e,0x67,0x50,0x4d,0x66,0x4a,0x49,0x63,0x45,0x44,0x5d,0x43,0x44,0x5c,0x42, 0x43,0x5b,0x43,0x42,0x5a,0x43,0x42,0x5a,0x3e,0x3d,0x53,0x40,0x3c,0x4f,0x54,0x4a, 0x60,0x41,0x3c,0x50,0x34,0x2d,0x3e,0x4c,0x46,0x5e,0x5e,0x5c,0x79,0x55,0x58,0x74, 0x4b,0x42,0x5b,0x4b,0x44,0x61,0x84,0x84,0x95,0x5f,0x58,0x63,0x23,0x1d,0x26,0x24, 0x1d,0x27,0x2c,0x23,0x30,0x38,0x2f,0x41,0x32,0x2f,0x43,0x08,0x07,0x0a,0x52,0x54, 0x5f,0xa8,0xad,0xbf,0x74,0x7d,0x9e,0x6b,0x77,0x98,0x87,0x92,0xad,0x7d,0x87,0xa1, 0x7e,0x87,0xa1,0x81,0x89,0xa2,0x81,0x85,0x9e,0x7e,0x82,0x9a,0x7d,0x84,0x9c,0x8a, 0x91,0xa4,0x94,0x9a,0xad,0x8b,0x93,0xa7,0x8b,0x93,0xa8,0x9f,0xa6,0xb8,0x9d,0xa2, 0xae,0x87,0x8b,0x97,0x85,0x8a,0x97,0x72,0x78,0x8a,0x53,0x5b,0x72,0x4e,0x4b,0x65, 0x54,0x4d,0x65,0x4e,0x49,0x61,0x4a,0x46,0x5e,0x4c,0x46,0x5d,0x53,0x49,0x5e,0x55, 0x49,0x5c,0x55,0x46,0x58,0x50,0x41,0x52,0x52,0x42,0x53,0x55,0x46,0x58,0x53,0x4a, 0x5d,0x52,0x47,0x5e,0x54,0x48,0x5e,0x55,0x4a,0x5e,0x59,0x4c,0x5f,0x59,0x4a,0x5e, 0x50,0x43,0x54,0x3d,0x30,0x3c,0x41,0x3c,0x46,0x6c,0x70,0x81,0x71,0x75,0x85,0x71, 0x72,0x82,0x5e,0x5b,0x70,0x5a,0x4b,0x5d,0x56,0x46,0x5a,0x55,0x45,0x57,0x4f,0x41, 0x50,0x51,0x41,0x52,0x50,0x42,0x52,0x54,0x46,0x58,0x56,0x49,0x5d,0x56,0x49,0x5d, 0x5b,0x4e,0x62,0x58,0x49,0x5d,0x56,0x46,0x58,0x51,0x42,0x54,0x4e,0x41,0x53,0x4d, 0x40,0x52,0x4d,0x41,0x54,0x50,0x44,0x56,0x4e,0x46,0x5c,0x47,0x45,0x5c,0x50,0x54, 0x69,0x63,0x66,0x7a,0x71,0x76,0x86,0x78,0x7d,0x8c,0x71,0x76,0x86,0x6b,0x72,0x82, 0x6e,0x72,0x83,0x5f,0x66,0x79,0x5e,0x65,0x77,0x65,0x6a,0x79,0x6a,0x6e,0x7b,0x74, 0x78,0x82,0x78,0x7c,0x87,0x78,0x7c,0x87,0x76,0x7a,0x85,0x76,0x7a,0x85,0x7d,0x81, 0x8c,0x6f,0x73,0x7f,0x5f,0x65,0x72,0x5c,0x62,0x72,0x53,0x58,0x6a,0x52,0x57,0x68, 0x56,0x5c,0x6c,0x56,0x5a,0x66,0x3a,0x3d,0x46,0x2c,0x2d,0x39,0x5f,0x59,0x69,0x5b, 0x55,0x63,0x51,0x4c,0x5a,0x6e,0x69,0x76,0xb1,0xb4,0xbd,0x9d,0xa3,0xb2,0x89,0x8f, 0xa4,0x68,0x73,0x8e,0x5d,0x66,0x86,0x87,0x8a,0x9d,0x59,0x4b,0x5d,0x57,0x49,0x5b, 0x57,0x4a,0x5b,0x58,0x4a,0x5b,0x59,0x4a,0x5b,0x59,0x4a,0x5d,0x53,0x45,0x58,0x7e, 0x81,0x97,0x4d,0x56,0x77,0x19,0x1b,0x24,0x19,0x1b,0x24,0x17,0x1a,0x21,0x25,0x25, 0x33,0x2f,0x2c,0x45,0x2f,0x2e,0x44,0x30,0x2c,0x42,0x57,0x4f,0x73,0x59,0x51,0x73, 0x5b,0x51,0x73,0x5b,0x51,0x75,0x5b,0x52,0x76,0x5b,0x52,0x77,0x5c,0x52,0x77,0x5a, 0x51,0x76,0x5a,0x52,0x76,0x52,0x51,0x77,0x51,0x51,0x78,0x53,0x5d,0x81,0x62,0x6c, 0x8f,0x60,0x60,0x6f,0x13,0x15,0x1a,0x13,0x15,0x1a,0x11,0x12,0x16,0x11,0x12,0x16, 0x10,0x12,0x16,0x4a,0x3d,0x4b,0x3d,0x32,0x3e,0x84,0x80,0x8b,0x81,0x89,0xa6,0x63, 0x6e,0x92,0x58,0x64,0x88,0x53,0x5e,0x85,0x51,0x5d,0x82,0x4f,0x5a,0x82,0x4e,0x57, 0x80,0x4c,0x56,0x7e,0x48,0x53,0x79,0x46,0x4e,0x73,0x42,0x49,0x6d,0x41,0x45,0x6a, 0x41,0x45,0x66,0x44,0x44,0x69,0x46,0x46,0x69,0x3e,0x3f,0x5a,0x2f,0x30,0x37,0x3b, 0x3d,0x44,0x33,0x36,0x41,0x28,0x2c,0x37,0x24,0x27,0x32,0x24,0x27,0x32,0x26,0x29, 0x32,0x27,0x2a,0x33,0x27,0x2a,0x32,0x26,0x29,0x31,0x25,0x27,0x2f,0x3d,0x39,0x45, 0x3c,0x36,0x41,0xbc,0xbe,0xc4,0xb8,0xbc,0xc7,0xac,0xb2,0xc1,0x85,0x8d,0xa5,0x17, 0x19,0x1e,0x18,0x1a,0x20,0x1a,0x1b,0x22,0x1b,0x1e,0x26,0x1e,0x21,0x28,0x1e,0x20, 0x27,0x1d,0x1f,0x27,0x1b,0x1e,0x26,0x16,0x17,0x1e,0x42,0x35,0x49,0x50,0x4d,0x73, 0xc3,0xc3,0xc5,0x3d,0x30,0x3c,0x58,0x48,0x59,0x5b,0x4a,0x5d,0x62,0x52,0x66,0x0e, 0x0f,0x13,0x16,0x18,0x1e,0x1a,0x1d,0x24,0x1e,0x21,0x28,0x21,0x23,0x2c,0x22,0x25, 0x2e,0x26,0x29,0x32,0x27,0x2a,0x33,0x28,0x2b,0x34,0x27,0x2a,0x33,0x22,0x26,0x2e, 0x20,0x23,0x2b,0x1c,0x1e,0x26,0x18,0x1a,0x21,0x16,0x19,0x1f,0x14,0x16,0x1c,0x12, 0x13,0x19,0x0e,0x10,0x15,0x0d,0x0e,0x13,0x0b,0x0b,0x0f,0x09,0x09,0x0c,0x08,0x08, 0x0b,0x07,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06, 0x05,0x04,0x06,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x36,0x37,0x3a,0xa2, 0xaa,0xc1,0x7e,0x8a,0xa9,0x75,0x81,0xa2,0x79,0x84,0xa5,0x7b,0x86,0xa7,0x7d,0x88, 0xa8,0x7d,0x89,0xa9,0x7d,0x89,0xa8,0x7e,0x8b,0xaa,0x91,0x9e,0xc3,0x4f,0x56,0x5e, 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,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, 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,0x02,0x02,0x02, 0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x09,0x07,0x09,0x1b, 0x1d,0x23,0x31,0x34,0x3b,0x2a,0x2c,0x35,0x16,0x13,0x19,0x0e,0x0b,0x0e,0x1e,0x1a, 0x22,0x25,0x26,0x34,0x23,0x22,0x2f,0x1d,0x17,0x1e,0x1a,0x15,0x1a,0x2a,0x21,0x2a, 0x30,0x27,0x31,0x34,0x2a,0x35,0x33,0x2a,0x33,0x34,0x2a,0x34,0x33,0x2a,0x34,0x2f, 0x26,0x31,0x2c,0x23,0x2d,0x2f,0x27,0x31,0x35,0x2c,0x36,0x3c,0x32,0x3e,0x47,0x3c, 0x4b,0x49,0x3e,0x4f,0x47,0x3e,0x4f,0x44,0x3b,0x4b,0x43,0x3b,0x4b,0x44,0x3c,0x4e, 0x42,0x3c,0x4e,0x40,0x3c,0x4f,0x3a,0x39,0x4d,0x37,0x39,0x4c,0x39,0x3e,0x52,0x3c, 0x41,0x56,0x3f,0x40,0x57,0x4a,0x52,0x66,0x5d,0x63,0x77,0x5d,0x63,0x78,0x5a,0x62, 0x78,0x59,0x61,0x75,0x53,0x5a,0x6e,0x67,0x6d,0x7f,0x73,0x7a,0x8a,0x74,0x7a,0x8b, 0x6d,0x73,0x86,0x68,0x6d,0x7e,0x66,0x6b,0x7c,0x5f,0x66,0x77,0x5d,0x64,0x77,0x5c, 0x63,0x79,0x56,0x5e,0x75,0x5e,0x66,0x7b,0x5d,0x64,0x78,0x5a,0x61,0x76,0x51,0x58, 0x6e,0x48,0x4a,0x64,0x50,0x4c,0x66,0x58,0x50,0x68,0x56,0x4e,0x67,0x4b,0x48,0x60, 0x42,0x42,0x5a,0x42,0x44,0x5b,0x43,0x43,0x5a,0x43,0x43,0x5b,0x41,0x42,0x59,0x3d, 0x3b,0x51,0x4c,0x44,0x59,0x51,0x4b,0x62,0x34,0x2f,0x41,0x44,0x3c,0x53,0x57,0x52, 0x6a,0x56,0x5e,0x7a,0x50,0x48,0x64,0x53,0x46,0x5f,0x77,0x79,0x8e,0x85,0x80,0x8b, 0x21,0x1c,0x24,0x21,0x1b,0x25,0x26,0x20,0x2b,0x36,0x2a,0x3b,0x31,0x2f,0x43,0x12, 0x12,0x16,0x20,0x22,0x25,0xaa,0xb0,0xc4,0x8c,0x95,0xb0,0x5d,0x6a,0x8e,0x86,0x8f, 0xab,0x78,0x80,0x9a,0x71,0x76,0x90,0x6b,0x70,0x84,0x63,0x66,0x78,0x61,0x63,0x75, 0x65,0x67,0x78,0x79,0x79,0x8f,0x73,0x78,0x90,0x69,0x70,0x8b,0x56,0x5d,0x7d,0x5b, 0x65,0x83,0x81,0x88,0x9b,0x5d,0x62,0x70,0x6e,0x74,0x82,0x75,0x7a,0x88,0x67,0x6d, 0x80,0x4b,0x52,0x6c,0x4a,0x49,0x63,0x48,0x46,0x60,0x46,0x44,0x5d,0x46,0x44,0x5b, 0x4c,0x46,0x5e,0x52,0x49,0x5e,0x55,0x49,0x5d,0x59,0x49,0x5b,0x55,0x45,0x57,0x52, 0x42,0x52,0x56,0x46,0x59,0x55,0x48,0x5c,0x52,0x46,0x5a,0x52,0x46,0x59,0x54,0x46, 0x57,0x56,0x48,0x5a,0x50,0x45,0x57,0x42,0x37,0x44,0x3a,0x30,0x3a,0x6d,0x6f,0x80, 0x6e,0x71,0x81,0x71,0x72,0x83,0x62,0x60,0x76,0x58,0x4b,0x5f,0x56,0x47,0x5a,0x58, 0x48,0x5a,0x5b,0x4b,0x5f,0x53,0x47,0x59,0x54,0x4a,0x5e,0x5d,0x52,0x6a,0x56,0x4c, 0x63,0x57,0x4c,0x62,0x5f,0x53,0x6b,0x5e,0x51,0x67,0x5c,0x4e,0x65,0x5a,0x4e,0x62, 0x59,0x4b,0x5e,0x56,0x46,0x58,0x4f,0x40,0x51,0x4c,0x3e,0x4d,0x4f,0x44,0x56,0x4e, 0x47,0x5d,0x46,0x45,0x5b,0x48,0x48,0x61,0x5a,0x5f,0x72,0x71,0x76,0x85,0x6e,0x75, 0x84,0x6c,0x72,0x82,0x70,0x76,0x86,0x6a,0x6f,0x80,0x60,0x67,0x7a,0x61,0x67,0x7a, 0x6a,0x6e,0x7b,0x6f,0x73,0x7e,0x76,0x7a,0x85,0x7a,0x7e,0x88,0x76,0x7a,0x85,0x76, 0x7a,0x85,0x82,0x86,0x91,0x7e,0x82,0x8e,0x72,0x76,0x82,0x6e,0x72,0x7f,0x6a,0x6e, 0x7a,0x61,0x66,0x73,0x60,0x65,0x74,0x54,0x5a,0x6d,0x54,0x57,0x62,0x5c,0x5a,0x68, 0x54,0x4e,0x5e,0x5f,0x5a,0x67,0x56,0x51,0x5e,0x6b,0x67,0x76,0xb8,0xba,0xc3,0xa9, 0xae,0xba,0x8a,0x91,0xa4,0x61,0x6b,0x89,0x56,0x62,0x82,0x58,0x62,0x84,0x87,0x84, 0x93,0x57,0x4a,0x5b,0x57,0x4a,0x5c,0x58,0x4a,0x5c,0x57,0x4a,0x5c,0x59,0x4b,0x5f, 0x57,0x4b,0x5f,0x6f,0x69,0x7c,0x55,0x5d,0x7b,0x1b,0x1e,0x27,0x19,0x1b,0x24,0x18, 0x1a,0x22,0x24,0x25,0x33,0x30,0x2d,0x45,0x30,0x2e,0x45,0x30,0x2c,0x43,0x55,0x4e, 0x71,0x5b,0x51,0x72,0x5b,0x51,0x72,0x5c,0x51,0x74,0x5b,0x52,0x76,0x5b,0x52,0x77, 0x5b,0x52,0x77,0x5a,0x52,0x77,0x5a,0x51,0x76,0x53,0x51,0x77,0x52,0x52,0x79,0x53, 0x5d,0x81,0x62,0x6d,0x8f,0x6a,0x6a,0x79,0x16,0x17,0x1d,0x15,0x16,0x1b,0x13,0x15, 0x1a,0x12,0x14,0x19,0x12,0x12,0x17,0x47,0x3b,0x48,0x3b,0x31,0x3c,0x85,0x81,0x8b, 0x79,0x83,0xa1,0x62,0x6e,0x91,0x59,0x65,0x8b,0x53,0x5e,0x85,0x51,0x5d,0x84,0x4f, 0x5b,0x83,0x4e,0x59,0x82,0x4d,0x57,0x7e,0x49,0x54,0x7a,0x45,0x4d,0x74,0x45,0x4b, 0x70,0x43,0x45,0x6a,0x43,0x44,0x66,0x43,0x44,0x69,0x47,0x47,0x6a,0x3d,0x3d,0x5a, 0x45,0x46,0x4b,0x38,0x3a,0x44,0x41,0x41,0x4d,0x43,0x42,0x51,0x2b,0x2a,0x3a,0x2a, 0x2a,0x39,0x2f,0x30,0x40,0x4f,0x52,0x5b,0x2c,0x30,0x39,0x2a,0x2d,0x36,0x27,0x2a, 0x32,0x3a,0x37,0x42,0x3d,0x37,0x43,0x7c,0x7a,0x85,0xba,0xbf,0xc9,0xb0,0xb6,0xc3, 0x72,0x7c,0x99,0x20,0x23,0x2b,0x1a,0x1c,0x23,0x1e,0x21,0x29,0x22,0x24,0x2c,0x24, 0x27,0x2f,0x24,0x27,0x30,0x23,0x26,0x2f,0x20,0x23,0x2b,0x19,0x1b,0x22,0x46,0x37, 0x4c,0x4d,0x52,0x79,0xa8,0xa6,0xaa,0x41,0x34,0x40,0x5d,0x4c,0x60,0x5d,0x4d,0x61, 0x65,0x56,0x6b,0x12,0x14,0x1a,0x1d,0x1f,0x27,0x20,0x23,0x2b,0x23,0x26,0x2f,0x26, 0x29,0x32,0x27,0x2a,0x33,0x2a,0x2e,0x38,0x2b,0x2f,0x39,0x2e,0x31,0x3b,0x2a,0x2e, 0x37,0x2a,0x2d,0x37,0x27,0x2a,0x33,0x23,0x26,0x2e,0x1f,0x22,0x29,0x1d,0x1f,0x27, 0x1c,0x1e,0x26,0x19,0x1a,0x22,0x14,0x16,0x1b,0x11,0x12,0x18,0x0e,0x10,0x15,0x0c, 0x0d,0x12,0x0a,0x0a,0x0e,0x09,0x09,0x0b,0x07,0x06,0x09,0x06,0x06,0x08,0x06,0x06, 0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x04,0x03,0x05,0x03,0x03,0x04, 0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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, 0x05,0x05,0x05,0xac,0xb3,0xc8,0x88,0x92,0xaf,0x74,0x80,0xa2,0x75,0x81,0xa3,0x7a, 0x85,0xa5,0x7a,0x85,0xa7,0x7b,0x86,0xa7,0x7b,0x85,0xa7,0x7c,0x88,0xa8,0x80,0x8b, 0xae,0xab,0xba,0xe8,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02, 0x05,0x03,0x04,0x12,0x0e,0x12,0x16,0x16,0x1d,0x1c,0x19,0x20,0x17,0x12,0x17,0x0f, 0x0c,0x0e,0x17,0x12,0x16,0x26,0x22,0x2a,0x2a,0x29,0x37,0x2e,0x28,0x34,0x2d,0x26, 0x2e,0x31,0x28,0x32,0x34,0x2b,0x36,0x36,0x2d,0x39,0x3a,0x30,0x3d,0x3e,0x33,0x41, 0x40,0x35,0x42,0x3a,0x32,0x3f,0x39,0x32,0x42,0x34,0x33,0x46,0x34,0x33,0x46,0x38, 0x36,0x4a,0x3f,0x3e,0x54,0x42,0x40,0x56,0x42,0x3f,0x56,0x42,0x3e,0x52,0x42,0x3c, 0x50,0x41,0x3d,0x51,0x3e,0x3d,0x53,0x3e,0x3e,0x54,0x41,0x46,0x5c,0x45,0x4b,0x5e, 0x50,0x56,0x68,0x52,0x58,0x6b,0x4c,0x52,0x67,0x4c,0x52,0x67,0x59,0x5f,0x72,0x61, 0x68,0x7a,0x64,0x6a,0x7e,0x5e,0x65,0x79,0x61,0x67,0x7c,0x6e,0x75,0x88,0x75,0x7a, 0x8d,0x70,0x76,0x8a,0x6c,0x72,0x86,0x6a,0x71,0x84,0x6e,0x74,0x85,0x6b,0x72,0x82, 0x67,0x6d,0x7f,0x66,0x6d,0x80,0x65,0x6b,0x7f,0x72,0x78,0x89,0x76,0x7b,0x8b,0x71, 0x77,0x87,0x64,0x6a,0x7d,0x54,0x5a,0x70,0x4a,0x4c,0x67,0x4e,0x4d,0x68,0x56,0x4e, 0x68,0x55,0x4d,0x66,0x46,0x46,0x5f,0x41,0x47,0x5e,0x42,0x46,0x5e,0x44,0x48,0x60, 0x46,0x4c,0x63,0x40,0x43,0x5a,0x47,0x42,0x57,0x51,0x4c,0x63,0x3a,0x34,0x47,0x3a, 0x33,0x45,0x43,0x41,0x56,0x54,0x55,0x70,0x46,0x4a,0x69,0x52,0x43,0x5a,0x6b,0x6f, 0x87,0xa8,0xa7,0xb0,0x23,0x1d,0x25,0x1d,0x18,0x1f,0x22,0x1a,0x24,0x30,0x25,0x35, 0x33,0x2e,0x43,0x2a,0x2b,0x35,0x04,0x04,0x05,0x8f,0x94,0xa4,0xa4,0xac,0xc1,0x61, 0x6b,0x91,0x75,0x7f,0x9f,0x85,0x8f,0xaa,0x7e,0x85,0x9f,0x6e,0x73,0x88,0x64,0x69, 0x7b,0x5e,0x61,0x74,0x59,0x5c,0x6c,0x58,0x5a,0x6a,0x55,0x56,0x67,0x4d,0x4d,0x5c, 0x38,0x38,0x49,0x3c,0x3a,0x4b,0x64,0x5c,0x69,0x4f,0x46,0x55,0x38,0x3d,0x4e,0x5c, 0x61,0x6e,0x66,0x6b,0x7b,0x5a,0x61,0x75,0x47,0x47,0x61,0x46,0x45,0x5e,0x45,0x44, 0x5d,0x45,0x43,0x5b,0x45,0x44,0x5d,0x4a,0x45,0x5d,0x50,0x47,0x5c,0x55,0x4a,0x5e, 0x58,0x4b,0x5e,0x5a,0x4a,0x5e,0x52,0x42,0x53,0x51,0x42,0x52,0x53,0x43,0x54,0x53, 0x45,0x56,0x52,0x44,0x56,0x52,0x44,0x56,0x51,0x45,0x58,0x44,0x38,0x47,0x33,0x2a, 0x34,0x73,0x77,0x87,0x77,0x7c,0x8d,0x77,0x79,0x8a,0x6b,0x6b,0x7f,0x51,0x46,0x5b, 0x50,0x43,0x55,0x53,0x44,0x56,0x58,0x4a,0x5d,0x4f,0x44,0x58,0x57,0x4c,0x62,0x58, 0x4e,0x65,0x54,0x4a,0x61,0x4f,0x46,0x5b,0x5e,0x53,0x6c,0x5d,0x52,0x6a,0x59,0x51, 0x69,0x58,0x50,0x68,0x58,0x50,0x68,0x59,0x4f,0x66,0x59,0x4e,0x63,0x56,0x47,0x5a, 0x4e,0x40,0x52,0x4e,0x44,0x58,0x51,0x47,0x5d,0x51,0x48,0x5e,0x48,0x48,0x62,0x5a, 0x5f,0x72,0x66,0x6a,0x7b,0x69,0x6e,0x7f,0x6a,0x70,0x81,0x6a,0x71,0x82,0x6d,0x73, 0x84,0x69,0x6f,0x81,0x69,0x6e,0x7f,0x72,0x76,0x82,0x71,0x75,0x80,0x74,0x79,0x83, 0x77,0x7b,0x86,0x78,0x7d,0x88,0x7e,0x82,0x8e,0x83,0x87,0x92,0x7d,0x82,0x8e,0x79, 0x7d,0x89,0x71,0x75,0x82,0x65,0x69,0x76,0x60,0x65,0x71,0x4f,0x56,0x66,0x4c,0x51, 0x63,0x70,0x6b,0x7c,0x66,0x62,0x6f,0x60,0x5c,0x6a,0x61,0x5e,0x6b,0x7a,0x77,0x84, 0xbb,0xbe,0xc7,0xb0,0xb4,0xc0,0x8c,0x93,0xa7,0x5f,0x69,0x87,0x51,0x5c,0x7e,0x4e, 0x52,0x76,0x62,0x6e,0x8c,0x68,0x5e,0x6f,0x57,0x4a,0x5c,0x57,0x4a,0x5b,0x57,0x4a, 0x5c,0x57,0x4b,0x5f,0x58,0x4d,0x62,0x5b,0x52,0x67,0x5c,0x60,0x7a,0x1c,0x1e,0x28, 0x1a,0x1d,0x26,0x17,0x1a,0x22,0x25,0x25,0x32,0x30,0x2e,0x45,0x30,0x2e,0x45,0x31, 0x2d,0x43,0x56,0x4f,0x70,0x5a,0x50,0x71,0x5b,0x51,0x73,0x5c,0x51,0x73,0x5b,0x52, 0x76,0x5b,0x52,0x76,0x5c,0x52,0x76,0x5a,0x51,0x76,0x58,0x51,0x76,0x53,0x51,0x77, 0x52,0x52,0x79,0x53,0x5a,0x80,0x60,0x6b,0x8d,0x6b,0x6b,0x79,0x16,0x19,0x1e,0x16, 0x18,0x1d,0x15,0x16,0x1b,0x14,0x16,0x1a,0x12,0x13,0x18,0x44,0x3a,0x48,0x3b,0x31, 0x3b,0x83,0x7f,0x87,0x7a,0x83,0xa2,0x62,0x6d,0x91,0x59,0x64,0x88,0x53,0x60,0x86, 0x51,0x5d,0x84,0x50,0x5b,0x83,0x4f,0x5a,0x82,0x4e,0x59,0x7f,0x4a,0x54,0x7b,0x47, 0x52,0x77,0x44,0x4c,0x71,0x43,0x46,0x6c,0x42,0x44,0x69,0x44,0x44,0x69,0x45,0x45, 0x68,0x3b,0x3c,0x59,0x16,0x18,0x1f,0x2d,0x2d,0x38,0x48,0x45,0x51,0x52,0x4d,0x5b, 0x3a,0x34,0x44,0x37,0x34,0x43,0x49,0x48,0x57,0x46,0x4a,0x56,0x40,0x42,0x4c,0x2a, 0x2d,0x36,0x29,0x2c,0x35,0x31,0x31,0x3b,0x3f,0x39,0x46,0x4a,0x47,0x53,0xbf,0xc2, 0xca,0x96,0x9d,0xb1,0x5b,0x67,0x89,0x2a,0x2e,0x3c,0x1e,0x21,0x28,0x23,0x26,0x2e, 0x26,0x29,0x32,0x29,0x2c,0x36,0x2b,0x2e,0x37,0x29,0x2c,0x36,0x26,0x2a,0x33,0x1b, 0x1e,0x26,0x4b,0x3a,0x51,0x56,0x61,0x84,0x86,0x82,0x88,0x47,0x3a,0x48,0x61,0x50, 0x65,0x60,0x50,0x65,0x6a,0x5a,0x71,0x18,0x1a,0x21,0x24,0x27,0x31,0x2b,0x2f,0x3a, 0x2e,0x32,0x3d,0x2a,0x2d,0x38,0x2b,0x2e,0x39,0x2e,0x32,0x3d,0x32,0x35,0x40,0x33, 0x36,0x42,0x30,0x34,0x3e,0x2f,0x32,0x3e,0x2a,0x2e,0x38,0x29,0x2c,0x36,0x26,0x29, 0x32,0x25,0x28,0x31,0x22,0x25,0x2e,0x1e,0x20,0x28,0x19,0x1b,0x22,0x16,0x18,0x1e, 0x13,0x16,0x1b,0x10,0x12,0x17,0x0c,0x0e,0x12,0x0a,0x0b,0x0f,0x09,0x09,0x0b,0x07, 0x06,0x09,0x06,0x06,0x08,0x06,0x05,0x07,0x05,0x05,0x06,0x05,0x04,0x06,0x04,0x04, 0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,0x72,0x77,0x82,0x95,0x9f,0xb9,0x79,0x84,0xa5, 0x72,0x7d,0xa0,0x73,0x7e,0xa1,0x76,0x82,0xa3,0x77,0x83,0xa4,0x79,0x84,0xa5,0x79, 0x83,0xa4,0x7a,0x85,0xa7,0x8b,0x98,0xbe,0x40,0x45,0x4e,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,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x03,0x05,0x03,0x04,0x06,0x04,0x05,0x08,0x06,0x07,0x0b,0x09,0x0a,0x10,0x0d,0x0f, 0x16,0x12,0x16,0x1c,0x16,0x1c,0x21,0x1a,0x21,0x26,0x1e,0x26,0x2c,0x25,0x2f,0x31, 0x2b,0x39,0x2f,0x2e,0x3f,0x31,0x30,0x42,0x32,0x31,0x42,0x35,0x31,0x40,0x39,0x33, 0x45,0x3b,0x34,0x44,0x3d,0x36,0x46,0x39,0x36,0x47,0x3a,0x3a,0x4e,0x3e,0x43,0x58, 0x3f,0x45,0x5a,0x3e,0x44,0x59,0x3e,0x44,0x5a,0x40,0x40,0x57,0x40,0x3e,0x56,0x42, 0x42,0x5a,0x43,0x46,0x5e,0x42,0x43,0x5b,0x40,0x44,0x5a,0x46,0x4e,0x62,0x57,0x5d, 0x6f,0x60,0x65,0x76,0x68,0x6e,0x7e,0x66,0x6b,0x7e,0x5d,0x63,0x75,0x52,0x59,0x6c, 0x57,0x5e,0x71,0x5e,0x64,0x78,0x5e,0x66,0x7a,0x56,0x5e,0x73,0x4f,0x57,0x70,0x56, 0x5f,0x77,0x57,0x5f,0x79,0x52,0x5a,0x75,0x52,0x5a,0x74,0x55,0x5b,0x74,0x5f,0x66, 0x7a,0x69,0x6e,0x7f,0x6e,0x72,0x82,0x71,0x76,0x86,0x70,0x76,0x86,0x76,0x7b,0x8a, 0x7a,0x7f,0x8e,0x7a,0x7e,0x8e,0x6e,0x73,0x85,0x5e,0x66,0x79,0x52,0x5a,0x71,0x4a, 0x50,0x6a,0x4c,0x4c,0x67,0x4c,0x4c,0x67,0x4b,0x53,0x6b,0x4e,0x55,0x6a,0x4a,0x52, 0x69,0x48,0x4f,0x67,0x4a,0x51,0x69,0x4a,0x50,0x65,0x3d,0x3d,0x54,0x51,0x4d,0x65, 0x42,0x3f,0x55,0x3b,0x32,0x44,0x3e,0x3b,0x4e,0x55,0x52,0x69,0x49,0x4d,0x68,0x51, 0x40,0x57,0x60,0x66,0x81,0xa9,0xa9,0xb4,0x42,0x3a,0x42,0x1c,0x15,0x1d,0x1e,0x17, 0x20,0x2b,0x20,0x2d,0x37,0x2e,0x42,0x37,0x38,0x46,0x04,0x03,0x04,0x51,0x53,0x5d, 0xab,0xb2,0xc4,0x84,0x8d,0xab,0x61,0x6e,0x91,0x82,0x8c,0xa9,0x7f,0x88,0xa4,0x7b, 0x81,0x9b,0x78,0x7e,0x95,0x75,0x79,0x8f,0x70,0x73,0x89,0x66,0x68,0x7e,0x5a,0x5c, 0x6d,0x48,0x49,0x58,0x38,0x39,0x47,0x2d,0x2d,0x3d,0x3b,0x3a,0x44,0x3f,0x38,0x3e, 0x34,0x2e,0x3a,0x30,0x35,0x43,0x43,0x4a,0x5a,0x42,0x49,0x5f,0x43,0x45,0x5d,0x46, 0x46,0x5f,0x46,0x45,0x5e,0x46,0x44,0x5d,0x45,0x44,0x5d,0x45,0x43,0x5b,0x46,0x43, 0x5a,0x4f,0x46,0x5c,0x54,0x4a,0x5e,0x56,0x4a,0x5e,0x5a,0x4a,0x5d,0x50,0x42,0x50, 0x51,0x41,0x51,0x56,0x46,0x58,0x56,0x48,0x5a,0x52,0x46,0x59,0x4f,0x44,0x56,0x44, 0x3a,0x4a,0x34,0x29,0x33,0x73,0x76,0x87,0x7a,0x7d,0x8e,0x7b,0x7e,0x8e,0x74,0x74, 0x87,0x4d,0x44,0x5a,0x4e,0x41,0x52,0x4b,0x3f,0x50,0x4e,0x42,0x52,0x50,0x45,0x58, 0x52,0x48,0x5e,0x55,0x4a,0x61,0x57,0x4d,0x63,0x51,0x47,0x5d,0x51,0x48,0x5d,0x4d, 0x46,0x5a,0x50,0x49,0x60,0x56,0x4e,0x66,0x59,0x50,0x6a,0x5a,0x51,0x6a,0x59,0x51, 0x69,0x59,0x4f,0x66,0x50,0x42,0x52,0x3f,0x35,0x42,0x3d,0x33,0x42,0x4f,0x44,0x59, 0x53,0x49,0x5c,0x48,0x46,0x5e,0x56,0x5b,0x6f,0x64,0x69,0x7a,0x73,0x78,0x88,0x78, 0x7d,0x8d,0x78,0x7e,0x8d,0x75,0x7a,0x8a,0x6e,0x74,0x84,0x7f,0x83,0x8e,0x7b,0x7f, 0x8a,0x77,0x7b,0x87,0x72,0x76,0x85,0x79,0x7e,0x8b,0x7c,0x81,0x8e,0x7a,0x7f,0x8e, 0x80,0x85,0x91,0x7a,0x7e,0x8b,0x6c,0x70,0x7e,0x5a,0x5e,0x6b,0x5a,0x5f,0x6b,0x46, 0x4c,0x5f,0x55,0x53,0x6e,0x51,0x4e,0x65,0x5c,0x5a,0x6b,0x71,0x6e,0x7c,0x68,0x66, 0x74,0x85,0x84,0x91,0xbe,0xc2,0xcb,0xaf,0xb3,0xc0,0x8c,0x92,0xa6,0x5a,0x63,0x81, 0x4f,0x57,0x7b,0x4e,0x51,0x75,0x50,0x53,0x77,0x78,0x7c,0x90,0x57,0x4a,0x5d,0x56, 0x49,0x5b,0x56,0x49,0x5b,0x58,0x4b,0x60,0x61,0x56,0x6d,0x65,0x61,0x7f,0x3d,0x42, 0x56,0x1c,0x1f,0x29,0x1a,0x1e,0x26,0x18,0x1a,0x22,0x25,0x26,0x32,0x30,0x2f,0x47, 0x31,0x2f,0x45,0x31,0x2d,0x43,0x58,0x4f,0x6f,0x5a,0x50,0x71,0x5b,0x51,0x72,0x5c, 0x51,0x73,0x5d,0x51,0x74,0x5b,0x52,0x76,0x5c,0x52,0x77,0x5c,0x52,0x76,0x5a,0x52, 0x77,0x54,0x50,0x76,0x52,0x51,0x78,0x53,0x59,0x7f,0x60,0x6b,0x8d,0x71,0x71,0x80, 0x18,0x1a,0x1e,0x18,0x1a,0x1f,0x17,0x1a,0x1e,0x16,0x18,0x1d,0x14,0x16,0x1a,0x42, 0x38,0x44,0x3e,0x33,0x3f,0x81,0x7d,0x85,0x7c,0x87,0xa2,0x63,0x6e,0x92,0x5a,0x65, 0x8b,0x54,0x60,0x86,0x51,0x5d,0x85,0x50,0x5b,0x82,0x4f,0x59,0x81,0x4d,0x57,0x80, 0x4b,0x55,0x7c,0x48,0x51,0x78,0x45,0x4b,0x71,0x44,0x4a,0x6d,0x43,0x45,0x69,0x43, 0x44,0x69,0x44,0x44,0x69,0x3b,0x39,0x56,0x16,0x17,0x1e,0x30,0x2f,0x3c,0x4c,0x49, 0x57,0x53,0x4d,0x5b,0x5a,0x53,0x62,0x4d,0x48,0x57,0x4a,0x49,0x59,0x3f,0x42,0x50, 0x41,0x44,0x4f,0x2a,0x2e,0x37,0x29,0x2b,0x35,0x2b,0x2c,0x36,0x40,0x3b,0x48,0x3b, 0x36,0x41,0x90,0x93,0x9f,0x80,0x89,0xa2,0x53,0x5d,0x81,0x41,0x3f,0x55,0x21,0x23, 0x2b,0x26,0x28,0x31,0x2a,0x2d,0x36,0x2e,0x32,0x3d,0x33,0x36,0x41,0x2f,0x33,0x3e, 0x2b,0x2e,0x39,0x1e,0x20,0x28,0x4d,0x3e,0x55,0x65,0x70,0x90,0x57,0x50,0x56,0x4a, 0x3d,0x4b,0x64,0x54,0x6b,0x63,0x55,0x6a,0x6d,0x62,0x7b,0x20,0x22,0x2b,0x2e,0x32, 0x3d,0x34,0x38,0x45,0x36,0x3a,0x46,0x34,0x38,0x43,0x34,0x37,0x43,0x35,0x39,0x44, 0x36,0x3a,0x46,0x34,0x38,0x43,0x32,0x36,0x42,0x31,0x34,0x40,0x2c,0x30,0x3a,0x2c, 0x30,0x3a,0x2e,0x32,0x3d,0x31,0x34,0x3f,0x2a,0x2e,0x38,0x22,0x26,0x2f,0x1f,0x22, 0x2a,0x1d,0x1f,0x27,0x1a,0x1d,0x25,0x15,0x17,0x1e,0x10,0x12,0x17,0x0c,0x0d,0x12, 0x0a,0x0a,0x0e,0x08,0x08,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x05,0x07,0x05, 0x05,0x06,0x05,0x04,0x06,0x04,0x04,0x05,0x04,0x03,0x05,0x03,0x03,0x04,0x03,0x03, 0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x15,0x12,0x19,0x28, 0x23,0x2e,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,0x26,0x27,0x29,0xa8,0xb0, 0xc6,0x7c,0x88,0xa8,0x72,0x7d,0xa0,0x72,0x7e,0xa1,0x74,0x80,0xa2,0x73,0x7e,0xa1, 0x76,0x82,0xa3,0x76,0x82,0xa3,0x76,0x82,0xa3,0x78,0x85,0xa8,0x9b,0xab,0xd7,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,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,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x03,0x02,0x03,0x05,0x03,0x05,0x03,0x02,0x03,0x03, 0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x03, 0x04,0x05,0x04,0x05,0x04,0x03,0x04,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x02,0x03,0x05, 0x04,0x05,0x08,0x06,0x08,0x0b,0x09,0x0b,0x0f,0x0c,0x0f,0x13,0x0e,0x12,0x14,0x0f, 0x13,0x1b,0x16,0x1c,0x21,0x1b,0x22,0x26,0x1f,0x27,0x29,0x23,0x2d,0x2d,0x27,0x32, 0x2f,0x29,0x36,0x30,0x2c,0x3a,0x32,0x31,0x42,0x35,0x36,0x49,0x37,0x37,0x4b,0x37, 0x37,0x4b,0x3a,0x3a,0x4f,0x3a,0x3d,0x52,0x39,0x3c,0x51,0x3a,0x3e,0x52,0x3f,0x45, 0x5a,0x42,0x47,0x5e,0x3e,0x43,0x5a,0x40,0x46,0x5c,0x49,0x50,0x64,0x42,0x4a,0x5f, 0x40,0x40,0x56,0x45,0x49,0x62,0x49,0x50,0x68,0x4c,0x53,0x6a,0x50,0x56,0x6b,0x5a, 0x61,0x74,0x66,0x6a,0x7d,0x66,0x6b,0x7c,0x5e,0x63,0x75,0x4e,0x54,0x69,0x43,0x49, 0x60,0x44,0x42,0x5b,0x43,0x43,0x5a,0x44,0x43,0x5b,0x42,0x41,0x57,0x46,0x42,0x57, 0x51,0x47,0x5d,0x54,0x4a,0x60,0x56,0x4b,0x62,0x52,0x4a,0x63,0x4b,0x4a,0x62,0x49, 0x47,0x61,0x49,0x4d,0x66,0x58,0x5e,0x72,0x64,0x69,0x7a,0x67,0x6c,0x7c,0x6c,0x70, 0x7e,0x6f,0x74,0x82,0x71,0x76,0x84,0x6e,0x72,0x83,0x69,0x6e,0x80,0x61,0x68,0x7a, 0x5c,0x63,0x77,0x5a,0x61,0x78,0x61,0x68,0x7e,0x64,0x6a,0x7f,0x66,0x6c,0x80,0x62, 0x69,0x7d,0x53,0x5a,0x71,0x4b,0x52,0x6b,0x4e,0x55,0x6b,0x52,0x59,0x6a,0x41,0x46, 0x56,0x4b,0x4c,0x68,0x49,0x46,0x5e,0x3f,0x36,0x4a,0x3c,0x3a,0x4d,0x40,0x3e,0x50, 0x4b,0x4d,0x66,0x4f,0x3e,0x54,0x51,0x57,0x75,0xaa,0xaa,0xb5,0x60,0x5a,0x60,0x1a, 0x15,0x1b,0x1b,0x15,0x1c,0x24,0x1c,0x26,0x36,0x2b,0x3c,0x38,0x39,0x4c,0x03,0x02, 0x03,0x1f,0x20,0x24,0xad,0xb4,0xc6,0x9d,0xa5,0xbc,0x5c,0x69,0x8e,0x7a,0x84,0xa3, 0x7e,0x87,0xa4,0x7a,0x84,0xa0,0x7b,0x82,0x9c,0x7b,0x83,0x9a,0x7a,0x82,0x99,0x74, 0x7c,0x94,0x71,0x77,0x8e,0x69,0x6a,0x7f,0x4c,0x4c,0x5c,0x30,0x31,0x40,0x37,0x38, 0x45,0x50,0x4c,0x51,0x2b,0x22,0x2b,0x2d,0x29,0x35,0x2e,0x33,0x42,0x3a,0x40,0x52, 0x3d,0x40,0x56,0x42,0x44,0x5c,0x46,0x46,0x5e,0x47,0x46,0x61,0x47,0x49,0x62,0x46, 0x45,0x5e,0x45,0x43,0x5d,0x46,0x44,0x5d,0x4c,0x46,0x5d,0x52,0x47,0x5c,0x56,0x4b, 0x60,0x5a,0x4b,0x5e,0x55,0x45,0x56,0x55,0x45,0x56,0x5a,0x4a,0x5d,0x59,0x4a,0x5f, 0x54,0x49,0x5d,0x49,0x3e,0x51,0x3b,0x30,0x3e,0x63,0x62,0x72,0x7d,0x81,0x93,0x80, 0x85,0x97,0x7d,0x7f,0x91,0x54,0x4f,0x66,0x49,0x3f,0x50,0x53,0x46,0x5a,0x4f,0x42, 0x54,0x4b,0x41,0x53,0x4f,0x45,0x59,0x57,0x4f,0x62,0x58,0x4f,0x65,0x5b,0x52,0x67, 0x69,0x60,0x73,0x5f,0x57,0x6a,0x54,0x4b,0x5f,0x4c,0x44,0x59,0x4c,0x45,0x5b,0x4e, 0x47,0x5e,0x53,0x4b,0x60,0x4d,0x44,0x59,0x50,0x45,0x5a,0x55,0x47,0x5b,0x42,0x37, 0x46,0x4a,0x3b,0x4a,0x4c,0x3e,0x4d,0x55,0x47,0x5b,0x48,0x46,0x5e,0x57,0x5d,0x70, 0x6a,0x6f,0x7f,0x85,0x89,0x95,0x8b,0x8f,0x9b,0x8c,0x8f,0x9b,0x7c,0x81,0x90,0x72, 0x78,0x88,0x85,0x89,0x94,0x89,0x8e,0x97,0x75,0x7a,0x88,0x76,0x7b,0x8b,0x76,0x7b, 0x8b,0x73,0x79,0x8a,0x79,0x7e,0x8e,0x86,0x8b,0x96,0x82,0x86,0x90,0x66,0x6a,0x77, 0x52,0x57,0x64,0x4c,0x51,0x65,0x5b,0x56,0x71,0x59,0x5a,0x71,0x50,0x50,0x65,0x66, 0x64,0x73,0x6e,0x6c,0x7a,0x89,0x88,0x95,0xc5,0xc8,0xd1,0xb0,0xb6,0xc2,0x8b,0x94, 0xa9,0x5e,0x67,0x85,0x4f,0x58,0x7a,0x4e,0x53,0x77,0x5d,0x53,0x72,0x53,0x5e,0x81, 0x6f,0x67,0x77,0x56,0x4a,0x5d,0x58,0x4d,0x60,0x65,0x59,0x70,0x56,0x59,0x78,0x2d, 0x31,0x3f,0x1e,0x21,0x2b,0x1d,0x20,0x2a,0x1c,0x1e,0x28,0x18,0x1a,0x23,0x20,0x21, 0x2d,0x31,0x2f,0x48,0x31,0x2e,0x45,0x31,0x2c,0x43,0x57,0x4f,0x71,0x5a,0x50,0x71, 0x5a,0x51,0x71,0x5c,0x51,0x72,0x5d,0x51,0x74,0x5b,0x51,0x76,0x5b,0x51,0x76,0x5b, 0x51,0x77,0x5a,0x52,0x76,0x56,0x50,0x76,0x52,0x51,0x78,0x54,0x5b,0x81,0x61,0x6c, 0x8e,0x75,0x75,0x85,0x1a,0x1d,0x22,0x1c,0x1e,0x24,0x1c,0x1e,0x23,0x1a,0x1b,0x21, 0x17,0x19,0x1e,0x3e,0x36,0x42,0x41,0x36,0x42,0x7c,0x76,0x7e,0x7b,0x84,0xa2,0x66, 0x70,0x93,0x5a,0x65,0x8b,0x54,0x60,0x87,0x53,0x5d,0x85,0x50,0x5b,0x82,0x51,0x5b, 0x83,0x4e,0x58,0x81,0x4b,0x56,0x7c,0x4a,0x52,0x7a,0x46,0x4e,0x73,0x44,0x47,0x6c, 0x44,0x46,0x6a,0x43,0x44,0x69,0x45,0x45,0x6a,0x38,0x38,0x54,0x16,0x15,0x1d,0x28, 0x25,0x32,0x47,0x43,0x50,0x7e,0x79,0x83,0x74,0x6c,0x78,0x82,0x7d,0x87,0x61,0x60, 0x6d,0x3b,0x3d,0x4c,0x47,0x4a,0x55,0x2e,0x31,0x3b,0x2a,0x2d,0x36,0x24,0x27,0x30, 0x40,0x3c,0x48,0x3d,0x38,0x44,0x65,0x64,0x71,0x76,0x80,0x9a,0x51,0x51,0x76,0x52, 0x4e,0x67,0x23,0x26,0x2f,0x28,0x2b,0x34,0x2e,0x31,0x3b,0x32,0x35,0x40,0x35,0x39, 0x44,0x34,0x38,0x43,0x2e,0x32,0x3d,0x22,0x24,0x2d,0x50,0x41,0x58,0x74,0x7d,0x9a, 0x33,0x2a,0x33,0x4c,0x40,0x4e,0x62,0x53,0x66,0x66,0x57,0x6d,0x68,0x64,0x83,0x29, 0x2c,0x36,0x33,0x37,0x44,0x3b,0x40,0x4d,0x3e,0x43,0x51,0x39,0x3e,0x4a,0x38,0x3c, 0x49,0x37,0x3b,0x48,0x34,0x38,0x45,0x31,0x35,0x41,0x2e,0x32,0x3d,0x2e,0x32,0x3e, 0x30,0x34,0x3e,0x31,0x35,0x40,0x37,0x3b,0x48,0x3a,0x3e,0x4a,0x34,0x38,0x44,0x2a, 0x2e,0x38,0x24,0x27,0x30,0x24,0x27,0x30,0x21,0x24,0x2d,0x1a,0x1d,0x24,0x12,0x14, 0x1a,0x0e,0x0f,0x14,0x0a,0x0a,0x0e,0x09,0x08,0x0b,0x07,0x07,0x0a,0x06,0x06,0x08, 0x06,0x06,0x07,0x06,0x05,0x07,0x05,0x04,0x06,0x05,0x04,0x06,0x04,0x03,0x05,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x1c,0x19,0x21, 0x2c,0x27,0x34,0x29,0x24,0x30,0x20,0x1c,0x26,0x00,0x00,0x00,0x17,0x15,0x1b,0x31, 0x2b,0x39,0x2c,0x27,0x33,0x03,0x03,0x04,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,0x02, 0x02,0x02,0xc3,0xc9,0xd6,0x8d,0x98,0xb3,0x71,0x7c,0x9f,0x6e,0x7a,0x9d,0x6f,0x7b, 0x9f,0x72,0x7e,0xa1,0x73,0x7e,0xa1,0x73,0x7e,0xa1,0x74,0x80,0xa2,0x74,0x80,0xa2, 0x84,0x92,0xb7,0x2f,0x33,0x3e,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x05,0x04,0x05,0x05,0x04,0x06, 0x06,0x04,0x06,0x05,0x04,0x05,0x05,0x04,0x05,0x06,0x05,0x06,0x06,0x04,0x05,0x06, 0x04,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x05,0x04,0x05,0x05,0x03, 0x04,0x05,0x03,0x04,0x04,0x03,0x04,0x05,0x04,0x05,0x06,0x04,0x06,0x07,0x06,0x06, 0x0c,0x0a,0x0c,0x0f,0x0d,0x0f,0x10,0x0d,0x10,0x0e,0x0b,0x0e,0x12,0x0e,0x12,0x18, 0x13,0x18,0x1c,0x17,0x1d,0x23,0x1d,0x25,0x26,0x22,0x2a,0x2a,0x25,0x2f,0x2b,0x28, 0x35,0x2d,0x2a,0x39,0x30,0x2e,0x40,0x32,0x32,0x44,0x31,0x30,0x41,0x33,0x32,0x44, 0x38,0x36,0x4a,0x3c,0x3b,0x51,0x42,0x42,0x5a,0x46,0x4c,0x64,0x4a,0x50,0x66,0x56, 0x5b,0x6d,0x59,0x5f,0x72,0x56,0x5c,0x70,0x4e,0x56,0x6b,0x5a,0x61,0x76,0x5f,0x66, 0x7a,0x56,0x5c,0x72,0x44,0x4a,0x62,0x45,0x48,0x61,0x46,0x4b,0x65,0x49,0x51,0x68, 0x56,0x5c,0x71,0x5c,0x61,0x75,0x5b,0x61,0x74,0x4e,0x52,0x68,0x40,0x3e,0x54,0x48, 0x3f,0x51,0x4c,0x42,0x52,0x4d,0x40,0x52,0x4d,0x40,0x50,0x49,0x3d,0x4d,0x46,0x3a, 0x4a,0x46,0x39,0x48,0x46,0x39,0x48,0x4b,0x41,0x51,0x4c,0x43,0x56,0x49,0x43,0x5a, 0x46,0x42,0x5b,0x46,0x43,0x5d,0x46,0x44,0x5c,0x49,0x44,0x5b,0x45,0x46,0x5e,0x4d, 0x52,0x67,0x54,0x59,0x6c,0x58,0x5e,0x6e,0x61,0x65,0x76,0x66,0x6b,0x7d,0x62,0x68, 0x7a,0x5e,0x65,0x77,0x5e,0x65,0x77,0x62,0x69,0x7d,0x6b,0x72,0x84,0x6e,0x75,0x87, 0x71,0x77,0x87,0x6b,0x72,0x82,0x5d,0x63,0x76,0x5a,0x61,0x76,0x5e,0x64,0x76,0x5b, 0x61,0x71,0x57,0x5c,0x69,0x51,0x58,0x71,0x46,0x49,0x65,0x4a,0x41,0x59,0x41,0x3e, 0x54,0x39,0x38,0x4a,0x41,0x43,0x58,0x4d,0x40,0x58,0x47,0x48,0x6a,0x95,0x99,0xaa, 0x82,0x7d,0x81,0x19,0x13,0x19,0x18,0x12,0x17,0x20,0x18,0x21,0x33,0x28,0x35,0x31, 0x32,0x48,0x10,0x10,0x11,0x02,0x02,0x02,0x93,0x98,0xa8,0xa7,0xae,0xc3,0x65,0x71, 0x96,0x68,0x73,0x97,0x7f,0x89,0xa6,0x7a,0x83,0xa2,0x7e,0x87,0xa1,0x7e,0x86,0xa0, 0x7d,0x85,0x9d,0x7e,0x85,0x9c,0x78,0x7f,0x96,0x6d,0x73,0x8a,0x6c,0x6d,0x7f,0x40, 0x41,0x54,0x3c,0x3c,0x4e,0x68,0x64,0x6f,0x3d,0x38,0x41,0x1e,0x1e,0x2a,0x2a,0x2e, 0x3a,0x35,0x3a,0x48,0x36,0x3a,0x4c,0x3b,0x3e,0x53,0x42,0x45,0x5c,0x47,0x4e,0x66, 0x5c,0x64,0x7a,0x4e,0x56,0x6e,0x4a,0x51,0x6a,0x4a,0x51,0x6a,0x47,0x4e,0x66,0x4b, 0x52,0x6a,0x49,0x50,0x6a,0x4a,0x4a,0x64,0x59,0x4d,0x61,0x55,0x46,0x57,0x55,0x45, 0x56,0x57,0x47,0x59,0x59,0x4a,0x5c,0x4f,0x45,0x58,0x4a,0x3d,0x4c,0x54,0x4d,0x5d, 0x81,0x84,0x96,0x87,0x8c,0x9f,0x84,0x87,0x9a,0x68,0x68,0x7e,0x42,0x39,0x48,0x56, 0x4a,0x5f,0x56,0x49,0x5d,0x5a,0x50,0x62,0x5c,0x54,0x64,0x5b,0x53,0x65,0x58,0x4e, 0x62,0x56,0x4c,0x61,0x5a,0x50,0x65,0x62,0x58,0x6c,0x65,0x5d,0x72,0x66,0x5f,0x72, 0x61,0x5a,0x6e,0x58,0x50,0x66,0x53,0x49,0x60,0x56,0x4b,0x61,0x56,0x4b,0x62,0x55, 0x4a,0x5f,0x47,0x3c,0x4e,0x53,0x46,0x5a,0x4d,0x3e,0x4e,0x51,0x42,0x54,0x55,0x4a, 0x5e,0x4a,0x46,0x5f,0x52,0x56,0x6b,0x76,0x79,0x88,0x8f,0x93,0x9d,0x99,0x9c,0xa5, 0x9c,0x9f,0xa7,0x83,0x88,0x96,0x71,0x76,0x8a,0x80,0x85,0x93,0x7a,0x80,0x8e,0x7a, 0x7f,0x8e,0x79,0x7e,0x8e,0x73,0x79,0x8a,0x70,0x76,0x87,0x79,0x7e,0x8c,0x86,0x8a, 0x95,0x76,0x7a,0x85,0x5f,0x64,0x70,0x6a,0x6a,0x7e,0x6e,0x6e,0x81,0x7f,0x7f,0x8c, 0x5d,0x5d,0x6f,0x59,0x57,0x67,0x64,0x63,0x6f,0x79,0x77,0x85,0xb6,0xba,0xc6,0xab, 0xaf,0xbe,0x93,0x9a,0xaf,0x6e,0x77,0x92,0x53,0x5c,0x7d,0x4c,0x56,0x78,0x58,0x52, 0x73,0x5d,0x53,0x73,0x71,0x78,0x8e,0x5c,0x51,0x65,0x69,0x5c,0x75,0x48,0x4f,0x68, 0x1f,0x23,0x2e,0x1e,0x21,0x2b,0x1e,0x22,0x2c,0x1e,0x21,0x2b,0x1c,0x1f,0x29,0x1a, 0x1c,0x25,0x22,0x23,0x2f,0x32,0x31,0x47,0x30,0x2e,0x45,0x33,0x2f,0x47,0x57,0x50, 0x72,0x5a,0x50,0x71,0x5a,0x51,0x71,0x5c,0x51,0x73,0x5b,0x51,0x75,0x5c,0x51,0x76, 0x5c,0x52,0x77,0x5b,0x50,0x76,0x5a,0x51,0x77,0x56,0x51,0x77,0x51,0x50,0x78,0x54, 0x59,0x7f,0x63,0x6d,0x8f,0x7c,0x7e,0x8c,0x1f,0x22,0x27,0x20,0x22,0x27,0x1e,0x1f, 0x26,0x1c,0x1e,0x24,0x19,0x1a,0x1f,0x3b,0x34,0x3f,0x43,0x38,0x44,0x7a,0x76,0x7d, 0x7e,0x88,0xa3,0x66,0x70,0x93,0x5b,0x68,0x8b,0x54,0x60,0x87,0x52,0x5d,0x85,0x51, 0x5c,0x85,0x51,0x5b,0x83,0x4e,0x5a,0x81,0x4b,0x56,0x7e,0x4a,0x53,0x79,0x47,0x4e, 0x74,0x45,0x4b,0x70,0x43,0x46,0x6b,0x45,0x46,0x6b,0x44,0x44,0x69,0x38,0x37,0x55, 0x17,0x17,0x1f,0x2a,0x26,0x33,0x36,0x31,0x40,0x43,0x3b,0x4a,0x47,0x3d,0x4d,0x4e, 0x47,0x56,0x50,0x4e,0x5c,0x37,0x38,0x46,0x49,0x4b,0x56,0x2a,0x2e,0x37,0x27,0x2a, 0x34,0x26,0x2a,0x32,0x41,0x3e,0x4c,0x3e,0x37,0x44,0x46,0x41,0x4c,0x63,0x6d,0x8c, 0x50,0x50,0x75,0x5b,0x56,0x75,0x26,0x28,0x31,0x2a,0x2e,0x37,0x32,0x36,0x41,0x33, 0x37,0x42,0x35,0x39,0x45,0x37,0x3b,0x47,0x31,0x34,0x3f,0x2a,0x2b,0x35,0x54,0x45, 0x5c,0x88,0x90,0xa4,0x38,0x2d,0x39,0x51,0x44,0x55,0x64,0x56,0x6a,0x6f,0x62,0x7a, 0x62,0x6c,0x8a,0x2e,0x32,0x3d,0x35,0x39,0x46,0x3e,0x42,0x50,0x3e,0x43,0x51,0x38, 0x3c,0x4a,0x34,0x38,0x45,0x31,0x35,0x40,0x2e,0x32,0x3d,0x2b,0x2f,0x3a,0x2c,0x2f, 0x3a,0x2e,0x32,0x3e,0x32,0x36,0x42,0x35,0x39,0x44,0x36,0x3a,0x46,0x36,0x3a,0x46, 0x36,0x3a,0x46,0x32,0x35,0x41,0x27,0x2a,0x35,0x22,0x25,0x2e,0x20,0x23,0x2c,0x19, 0x1b,0x23,0x12,0x14,0x1a,0x0e,0x0f,0x14,0x0c,0x0b,0x10,0x0a,0x0a,0x0d,0x08,0x07, 0x0a,0x08,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x05,0x06,0x05,0x04,0x06, 0x05,0x04,0x06,0x04,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x10,0x0f, 0x13,0x2c,0x26,0x32,0x08,0x08,0x0b,0x03,0x03,0x04,0x39,0x32,0x42,0x26,0x22,0x2d, 0x26,0x22,0x2c,0x0b,0x0a,0x0d,0x1d,0x1a,0x22,0x2d,0x27,0x34,0x0f,0x0d,0x12,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,0x76,0x77,0x7a,0xa4,0xac,0xc2,0x73,0x7e,0xa1,0x6b, 0x76,0x9b,0x6c,0x77,0x9b,0x6e,0x7a,0x9d,0x6f,0x7b,0x9f,0x71,0x7c,0xa0,0x71,0x7d, 0xa0,0x6f,0x7b,0x9f,0x73,0x7e,0xa4,0x8e,0x9d,0xcd,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,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,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x05,0x04,0x05,0x06,0x05, 0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x07,0x06,0x07,0x07,0x06,0x07, 0x08,0x06,0x08,0x08,0x06,0x08,0x08,0x06,0x09,0x08,0x06,0x08,0x08,0x06,0x08,0x08, 0x06,0x08,0x07,0x06,0x07,0x08,0x06,0x08,0x08,0x06,0x08,0x08,0x06,0x08,0x0d,0x0a, 0x0d,0x15,0x11,0x16,0x16,0x12,0x16,0x14,0x10,0x15,0x16,0x12,0x16,0x1a,0x15,0x1a, 0x1d,0x18,0x1e,0x1f,0x1b,0x22,0x22,0x1e,0x27,0x25,0x22,0x2c,0x24,0x23,0x30,0x29, 0x28,0x36,0x2e,0x2d,0x3e,0x33,0x32,0x43,0x38,0x37,0x4c,0x3b,0x3b,0x50,0x3d,0x3c, 0x52,0x3c,0x3b,0x50,0x43,0x3e,0x51,0x46,0x3f,0x52,0x40,0x3d,0x52,0x3e,0x3e,0x54, 0x42,0x45,0x5d,0x5b,0x62,0x76,0x66,0x6c,0x7e,0x6b,0x71,0x83,0x64,0x6b,0x7e,0x63, 0x6a,0x7e,0x67,0x6e,0x83,0x59,0x61,0x78,0x49,0x4a,0x65,0x48,0x47,0x61,0x49,0x48, 0x62,0x46,0x45,0x5e,0x46,0x46,0x5f,0x46,0x4a,0x61,0x45,0x42,0x5a,0x47,0x40,0x55, 0x41,0x39,0x48,0x3d,0x33,0x42,0x3e,0x34,0x42,0x40,0x36,0x43,0x3e,0x34,0x41,0x3e, 0x34,0x42,0x3e,0x36,0x46,0x3d,0x38,0x4b,0x42,0x3a,0x4e,0x49,0x3f,0x52,0x46,0x40, 0x54,0x43,0x3e,0x56,0x44,0x41,0x58,0x49,0x42,0x56,0x4e,0x44,0x59,0x52,0x46,0x5a, 0x53,0x47,0x5a,0x4e,0x46,0x5e,0x47,0x43,0x5c,0x46,0x45,0x5c,0x48,0x4c,0x65,0x53, 0x5a,0x6e,0x5c,0x62,0x76,0x60,0x66,0x79,0x5c,0x63,0x76,0x5b,0x62,0x76,0x61,0x67, 0x7a,0x61,0x66,0x7a,0x65,0x6b,0x7c,0x6c,0x71,0x80,0x69,0x6e,0x7e,0x6a,0x6f,0x7f, 0x6c,0x72,0x81,0x66,0x6b,0x7a,0x60,0x66,0x73,0x75,0x7c,0x8f,0x6c,0x72,0x89,0x4f, 0x4e,0x69,0x45,0x41,0x5a,0x3c,0x39,0x4b,0x42,0x43,0x57,0x42,0x3d,0x5b,0x47,0x43, 0x64,0x80,0x86,0x9c,0x9f,0x9b,0xa1,0x1b,0x13,0x18,0x15,0x10,0x14,0x1c,0x14,0x1b, 0x2e,0x23,0x31,0x30,0x2e,0x44,0x32,0x31,0x37,0x02,0x02,0x02,0x59,0x5d,0x66,0xad, 0xb5,0xc8,0x7b,0x86,0xa6,0x5a,0x65,0x8c,0x7d,0x87,0xa5,0x7b,0x84,0xa4,0x7e,0x88, 0xa3,0x81,0x8a,0xa5,0x80,0x8a,0xa2,0x80,0x87,0xa0,0x77,0x80,0x98,0x74,0x79,0x90, 0x6e,0x72,0x89,0x5d,0x5e,0x76,0x4e,0x4e,0x69,0x6f,0x71,0x85,0x5c,0x5e,0x67,0x1e, 0x20,0x26,0x27,0x2a,0x34,0x2f,0x34,0x40,0x31,0x36,0x44,0x34,0x39,0x4a,0x3b,0x41, 0x56,0x44,0x48,0x60,0x4a,0x51,0x6b,0x4a,0x4d,0x67,0x4e,0x56,0x6f,0x53,0x5b,0x72, 0x68,0x6e,0x83,0x74,0x7a,0x8b,0x74,0x7a,0x8a,0x65,0x6c,0x80,0x48,0x46,0x60,0x56, 0x4a,0x5f,0x56,0x46,0x59,0x54,0x45,0x56,0x54,0x44,0x56,0x52,0x43,0x54,0x4d,0x3e, 0x4d,0x4b,0x3f,0x4e,0x7b,0x78,0x8b,0x83,0x84,0x98,0x80,0x83,0x95,0x76,0x77,0x8a, 0x3b,0x33,0x41,0x54,0x49,0x5d,0x5f,0x54,0x66,0x69,0x5f,0x70,0x5d,0x54,0x65,0x57, 0x4f,0x5f,0x56,0x4e,0x5e,0x4e,0x43,0x56,0x54,0x49,0x5c,0x55,0x49,0x5d,0x57,0x4d, 0x62,0x5a,0x50,0x66,0x5d,0x55,0x6b,0x5b,0x53,0x69,0x58,0x4e,0x64,0x58,0x4e,0x65, 0x58,0x4e,0x65,0x54,0x4a,0x60,0x46,0x3e,0x4e,0x52,0x46,0x5b,0x4a,0x3f,0x50,0x4e, 0x3f,0x4e,0x52,0x44,0x57,0x53,0x4a,0x5e,0x4d,0x48,0x62,0x52,0x56,0x6d,0x76,0x7a, 0x89,0x89,0x8e,0x99,0x96,0x99,0xa3,0x96,0x9a,0xa5,0x71,0x78,0x8b,0x6d,0x74,0x88, 0x71,0x76,0x89,0x78,0x7d,0x8d,0x7a,0x7f,0x8e,0x7b,0x80,0x90,0x71,0x77,0x89,0x6e, 0x74,0x86,0x6f,0x75,0x86,0x76,0x7b,0x89,0x7c,0x7e,0x8c,0x7b,0x7a,0x8b,0x7a,0x79, 0x88,0x8e,0x8c,0x96,0x7e,0x7c,0x87,0x56,0x53,0x61,0x59,0x56,0x62,0x6e,0x6d,0x78, 0xb0,0xb4,0xbe,0xa5,0xa9,0xb8,0x90,0x98,0xac,0x77,0x7f,0x9a,0x58,0x61,0x7f,0x4c, 0x55,0x76,0x4e,0x4f,0x73,0x5a,0x4c,0x67,0x50,0x5a,0x7d,0x73,0x71,0x83,0x35,0x3b, 0x4c,0x1c,0x1e,0x28,0x1e,0x21,0x2b,0x1f,0x22,0x2d,0x1f,0x22,0x2d,0x1f,0x22,0x2c, 0x1d,0x1f,0x2a,0x1a,0x1c,0x25,0x20,0x20,0x2c,0x32,0x2f,0x47,0x31,0x2f,0x45,0x32, 0x2d,0x45,0x57,0x4f,0x71,0x5a,0x50,0x71,0x5b,0x51,0x72,0x5b,0x51,0x74,0x5b,0x51, 0x76,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5b,0x52,0x77,0x5a,0x51,0x76,0x56,0x50,0x77, 0x53,0x51,0x78,0x54,0x58,0x7f,0x64,0x6e,0x90,0x81,0x82,0x91,0x23,0x25,0x2b,0x23, 0x26,0x2c,0x21,0x22,0x29,0x1e,0x20,0x26,0x1a,0x1c,0x21,0x36,0x31,0x3c,0x45,0x3a, 0x46,0x74,0x6e,0x77,0x7b,0x84,0xa1,0x63,0x6e,0x91,0x5b,0x68,0x8b,0x55,0x61,0x86, 0x53,0x5d,0x86,0x51,0x5c,0x82,0x51,0x5b,0x83,0x4e,0x59,0x81,0x4c,0x56,0x7f,0x4a, 0x54,0x7b,0x48,0x50,0x76,0x45,0x4b,0x71,0x44,0x46,0x6c,0x44,0x46,0x6a,0x44,0x45, 0x6a,0x38,0x37,0x55,0x18,0x17,0x20,0x2a,0x27,0x35,0x3a,0x33,0x43,0x46,0x3c,0x4c, 0x49,0x3d,0x4d,0x44,0x3b,0x4b,0x48,0x42,0x50,0x48,0x47,0x54,0x38,0x3b,0x46,0x28, 0x2b,0x36,0x26,0x29,0x32,0x26,0x2a,0x33,0x3a,0x39,0x45,0x41,0x3a,0x47,0x3f,0x36, 0x42,0x59,0x60,0x7d,0x53,0x5d,0x80,0x56,0x52,0x74,0x29,0x2b,0x35,0x27,0x2a,0x34, 0x2e,0x31,0x3c,0x32,0x35,0x41,0x35,0x39,0x45,0x39,0x3e,0x4b,0x30,0x34,0x3f,0x32, 0x30,0x3d,0x58,0x48,0x60,0x95,0x98,0xa9,0x3d,0x31,0x3c,0x56,0x48,0x59,0x6a,0x5b, 0x71,0x66,0x63,0x84,0x5b,0x63,0x7e,0x2e,0x31,0x3d,0x32,0x36,0x42,0x35,0x3a,0x46, 0x35,0x39,0x46,0x32,0x36,0x42,0x30,0x34,0x3f,0x2e,0x32,0x3e,0x2a,0x2e,0x3a,0x2a, 0x2e,0x3a,0x2e,0x32,0x3d,0x32,0x36,0x41,0x36,0x3a,0x46,0x36,0x3a,0x45,0x31,0x34, 0x40,0x2e,0x31,0x3d,0x2d,0x31,0x3d,0x2e,0x32,0x3e,0x29,0x2c,0x36,0x22,0x25,0x2e, 0x1c,0x1e,0x27,0x17,0x1a,0x22,0x13,0x14,0x1a,0x0f,0x0f,0x15,0x0d,0x0d,0x12,0x0a, 0x0a,0x0e,0x09,0x08,0x0b,0x08,0x07,0x0a,0x08,0x07,0x0a,0x06,0x06,0x08,0x06,0x06, 0x07,0x05,0x05,0x06,0x05,0x04,0x06,0x04,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04, 0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x1b,0x18,0x1f,0x1b,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0a, 0x0d,0x16,0x14,0x1b,0x04,0x04,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0e,0x12, 0x27,0x22,0x2d,0x1d,0x19,0x22,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,0x25,0x25,0x26,0xc8,0xcc,0xda, 0x7e,0x89,0xa9,0x6a,0x76,0x9a,0x6b,0x76,0x9b,0x6c,0x79,0x9c,0x6b,0x77,0x9b,0x6d, 0x79,0x9c,0x6e,0x7a,0x9d,0x71,0x7c,0xa0,0x6e,0x7a,0x9d,0x78,0x85,0xac,0x29,0x2e, 0x2e,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,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,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x03, 0x03,0x05,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x08,0x07,0x06,0x09,0x08,0x07, 0x09,0x08,0x07,0x0a,0x1e,0x1c,0x1f,0x14,0x13,0x15,0x0a,0x08,0x0a,0x0a,0x08,0x0a, 0x0a,0x09,0x0a,0x0b,0x0a,0x0c,0x0c,0x0a,0x0d,0x0e,0x0a,0x0e,0x0e,0x0b,0x0e,0x0e, 0x0c,0x0f,0x17,0x13,0x19,0x20,0x1a,0x21,0x22,0x1b,0x22,0x1e,0x19,0x1e,0x1b,0x18, 0x20,0x1a,0x18,0x1f,0x1d,0x1a,0x22,0x1d,0x1b,0x25,0x1f,0x1f,0x2a,0x26,0x29,0x36, 0x2a,0x2e,0x3b,0x2e,0x32,0x42,0x35,0x36,0x49,0x3a,0x3a,0x4e,0x3f,0x3e,0x56,0x42, 0x41,0x59,0x43,0x42,0x5a,0x47,0x45,0x5d,0x51,0x4a,0x62,0x4c,0x46,0x5c,0x42,0x3f, 0x55,0x3e,0x3e,0x52,0x3e,0x3e,0x54,0x42,0x48,0x5e,0x56,0x5e,0x76,0x63,0x6a,0x7f, 0x61,0x68,0x7d,0x66,0x6d,0x82,0x66,0x6d,0x82,0x50,0x57,0x71,0x48,0x47,0x62,0x4e, 0x47,0x5d,0x50,0x46,0x5a,0x4d,0x45,0x59,0x4a,0x42,0x56,0x4b,0x42,0x56,0x4a,0x42, 0x52,0x42,0x39,0x46,0x3e,0x35,0x42,0x3d,0x34,0x42,0x42,0x38,0x47,0x42,0x3a,0x4a, 0x3e,0x38,0x4a,0x3a,0x36,0x47,0x35,0x32,0x43,0x36,0x33,0x44,0x3b,0x36,0x47,0x43, 0x3b,0x4c,0x43,0x3c,0x4a,0x43,0x3b,0x49,0x46,0x3a,0x4a,0x48,0x3c,0x4d,0x4a,0x40, 0x51,0x4e,0x40,0x50,0x50,0x42,0x52,0x52,0x42,0x53,0x56,0x46,0x56,0x56,0x48,0x5c, 0x53,0x4a,0x61,0x4a,0x47,0x61,0x46,0x46,0x5f,0x51,0x57,0x6c,0x5d,0x62,0x75,0x5a, 0x61,0x73,0x5d,0x64,0x77,0x5e,0x65,0x77,0x5d,0x62,0x74,0x62,0x68,0x78,0x6a,0x70, 0x7e,0x73,0x78,0x85,0x78,0x7d,0x89,0x6a,0x6f,0x7e,0x5c,0x62,0x71,0x71,0x76,0x88, 0x87,0x8e,0xa1,0x75,0x73,0x88,0x42,0x42,0x5e,0x4a,0x48,0x5f,0x52,0x51,0x6a,0x47, 0x48,0x65,0x51,0x46,0x64,0x6d,0x74,0x8f,0xc6,0xc5,0xc9,0x1d,0x14,0x18,0x16,0x10, 0x14,0x19,0x12,0x19,0x28,0x1f,0x29,0x33,0x2c,0x42,0x43,0x43,0x4d,0x00,0x00,0x00, 0x1f,0x20,0x24,0xaf,0xb6,0xc9,0x97,0xa0,0xb9,0x56,0x61,0x89,0x7c,0x88,0xa6,0x81, 0x8b,0xa8,0x7f,0x88,0xa6,0x83,0x8d,0xa8,0x85,0x8e,0xa9,0x84,0x8e,0xa6,0x7e,0x86, 0xa1,0x78,0x7e,0x98,0x74,0x79,0x92,0x6b,0x6f,0x89,0x4b,0x51,0x71,0x5d,0x66,0x80, 0x85,0x88,0x94,0x1a,0x1b,0x21,0x22,0x24,0x2c,0x2b,0x2e,0x3a,0x31,0x35,0x42,0x33, 0x38,0x46,0x37,0x3d,0x4e,0x3b,0x41,0x56,0x46,0x49,0x62,0x49,0x4a,0x65,0x4a,0x4c, 0x67,0x4c,0x53,0x6e,0x66,0x6d,0x82,0x73,0x7a,0x8c,0x74,0x7a,0x8b,0x5c,0x63,0x79, 0x47,0x4b,0x64,0x48,0x46,0x60,0x50,0x4a,0x62,0x58,0x4d,0x62,0x58,0x4b,0x5e,0x56, 0x48,0x5b,0x51,0x43,0x54,0x4c,0x3e,0x4d,0x74,0x70,0x82,0x7c,0x79,0x8c,0x7f,0x7f, 0x92,0x79,0x79,0x8d,0x3a,0x32,0x40,0x51,0x46,0x5b,0x57,0x4c,0x62,0x56,0x4b,0x60, 0x52,0x47,0x5a,0x50,0x44,0x57,0x60,0x57,0x65,0x48,0x3d,0x4d,0x45,0x3a,0x4a,0x48, 0x3d,0x4c,0x4e,0x42,0x53,0x53,0x47,0x5c,0x55,0x4a,0x5f,0x56,0x4c,0x61,0x56,0x4b, 0x61,0x53,0x4a,0x5f,0x4f,0x45,0x58,0x4f,0x45,0x58,0x47,0x3e,0x4f,0x44,0x3a,0x4b, 0x48,0x3b,0x4b,0x4c,0x3e,0x4d,0x4e,0x3e,0x4f,0x52,0x43,0x55,0x53,0x49,0x5e,0x4b, 0x48,0x62,0x51,0x56,0x6c,0x6c,0x72,0x85,0x77,0x7e,0x8e,0x8b,0x8f,0x9d,0x7f,0x86, 0x96,0x6a,0x72,0x86,0x72,0x78,0x8a,0x71,0x77,0x89,0x74,0x7a,0x8a,0x7c,0x82,0x91, 0x7b,0x80,0x90,0x71,0x76,0x87,0x6f,0x76,0x87,0x68,0x6f,0x82,0x7e,0x7f,0x94,0x86, 0x86,0x97,0x76,0x76,0x85,0x82,0x80,0x8a,0x8a,0x88,0x90,0x62,0x5e,0x69,0x4a,0x47, 0x52,0x68,0x65,0x70,0xb6,0xb8,0xc1,0xa4,0xa8,0xb6,0x89,0x90,0xa4,0x6d,0x75,0x8f, 0x53,0x57,0x76,0x49,0x4c,0x6d,0x4d,0x4d,0x71,0x5a,0x4c,0x65,0x5b,0x52,0x71,0x55, 0x5d,0x7a,0x1d,0x1f,0x28,0x1d,0x1f,0x2a,0x1e,0x22,0x2c,0x1f,0x22,0x2d,0x20,0x23, 0x2e,0x1e,0x22,0x2c,0x1d,0x20,0x2a,0x1a,0x1d,0x26,0x20,0x21,0x2b,0x32,0x30,0x48, 0x30,0x2e,0x44,0x2f,0x2b,0x42,0x56,0x4f,0x71,0x5a,0x50,0x71,0x5b,0x51,0x71,0x5d, 0x51,0x74,0x5e,0x52,0x75,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5b,0x52,0x77,0x5a,0x52, 0x77,0x59,0x53,0x77,0x53,0x51,0x78,0x55,0x59,0x7f,0x65,0x6f,0x90,0x85,0x86,0x95, 0x29,0x2b,0x32,0x26,0x29,0x30,0x24,0x26,0x2d,0x22,0x24,0x2a,0x1e,0x20,0x26,0x33, 0x2f,0x39,0x46,0x3b,0x47,0x6f,0x68,0x72,0x78,0x82,0x9f,0x64,0x6f,0x92,0x5a,0x67, 0x8a,0x56,0x61,0x87,0x54,0x5e,0x86,0x52,0x5d,0x83,0x51,0x5b,0x84,0x4f,0x5a,0x82, 0x4e,0x58,0x80,0x4c,0x55,0x7b,0x48,0x50,0x76,0x45,0x4d,0x73,0x45,0x47,0x6d,0x45, 0x46,0x6a,0x44,0x45,0x6a,0x39,0x38,0x55,0x1a,0x1a,0x23,0x2c,0x2a,0x38,0x3d,0x39, 0x4c,0x4b,0x42,0x53,0x4e,0x41,0x52,0x4a,0x3d,0x4c,0x47,0x3b,0x4a,0x3c,0x34,0x44, 0x46,0x46,0x51,0x52,0x54,0x5d,0x3e,0x42,0x49,0x48,0x4a,0x52,0x49,0x49,0x52,0x4b, 0x42,0x50,0x47,0x3d,0x4b,0x68,0x67,0x7a,0x6f,0x79,0x96,0x4f,0x4d,0x74,0x3a,0x37, 0x47,0x20,0x22,0x2b,0x26,0x2a,0x33,0x2c,0x30,0x3a,0x2e,0x32,0x3e,0x32,0x35,0x41, 0x2a,0x2e,0x38,0x38,0x32,0x43,0x57,0x4b,0x67,0x9c,0x9b,0xa6,0x46,0x39,0x46,0x60, 0x50,0x65,0x6e,0x63,0x7f,0x62,0x69,0x8a,0x2d,0x30,0x3d,0x2b,0x2f,0x3b,0x31,0x35, 0x41,0x32,0x36,0x42,0x32,0x37,0x43,0x33,0x38,0x43,0x35,0x39,0x45,0x35,0x39,0x44, 0x32,0x36,0x42,0x30,0x34,0x40,0x31,0x35,0x40,0x33,0x37,0x44,0x35,0x39,0x46,0x34, 0x39,0x46,0x2e,0x32,0x3e,0x29,0x2c,0x38,0x29,0x2d,0x38,0x2e,0x31,0x3d,0x29,0x2d, 0x38,0x22,0x25,0x2f,0x1b,0x1e,0x26,0x19,0x1b,0x24,0x16,0x19,0x21,0x12,0x11,0x17, 0x0e,0x0e,0x12,0x0c,0x0b,0x0e,0x0a,0x0a,0x0d,0x09,0x08,0x0a,0x08,0x07,0x0a,0x06, 0x06,0x08,0x06,0x06,0x07,0x06,0x05,0x06,0x05,0x04,0x06,0x05,0x04,0x06,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x1b,0x18,0x20,0x25,0x21,0x2b,0x1b,0x18,0x1f,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,0xdc,0xde,0xe4,0x8e,0x99,0xb4,0x6a,0x76,0x9a,0x67,0x73,0x99,0x6a,0x75,0x9a, 0x6a,0x75,0x9a,0x6a,0x75,0x9a,0x6b,0x77,0x9b,0x6c,0x77,0x9c,0x6c,0x79,0x9c,0x6c, 0x77,0x9c,0x8e,0x9d,0xce,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,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,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x05,0x04,0x04,0x05, 0x04,0x05,0x06,0x06,0x06,0x07,0x0a,0x0b,0x0d,0x15,0x15,0x18,0x13,0x14,0x17,0x22, 0x23,0x25,0x27,0x27,0x2a,0x0c,0x0c,0x0f,0x1e,0x1e,0x20,0x2c,0x2c,0x2d,0x29,0x28, 0x2a,0x0a,0x0a,0x0c,0x0c,0x0a,0x0d,0x11,0x0e,0x11,0x13,0x10,0x13,0x17,0x12,0x17, 0x1a,0x15,0x1a,0x1b,0x17,0x1e,0x1b,0x16,0x1c,0x23,0x1d,0x24,0x22,0x1e,0x25,0x1a, 0x1a,0x24,0x18,0x18,0x21,0x1a,0x1a,0x22,0x1c,0x1e,0x28,0x24,0x27,0x32,0x31,0x34, 0x3e,0x3c,0x3f,0x49,0x3f,0x43,0x4e,0x3e,0x42,0x51,0x3a,0x40,0x52,0x3c,0x42,0x56, 0x40,0x44,0x5a,0x44,0x45,0x5e,0x46,0x46,0x5e,0x47,0x46,0x60,0x49,0x48,0x62,0x4a, 0x49,0x63,0x49,0x4b,0x66,0x48,0x4e,0x64,0x42,0x46,0x5c,0x41,0x40,0x56,0x43,0x42, 0x59,0x48,0x4a,0x63,0x4b,0x52,0x6d,0x59,0x61,0x78,0x52,0x59,0x74,0x4a,0x4a,0x63, 0x4f,0x46,0x5b,0x4d,0x45,0x57,0x4a,0x42,0x55,0x49,0x3f,0x52,0x48,0x3e,0x51,0x44, 0x3b,0x4b,0x3e,0x37,0x44,0x3e,0x36,0x45,0x43,0x3b,0x4c,0x4a,0x42,0x56,0x48,0x43, 0x58,0x46,0x43,0x59,0x4a,0x46,0x5c,0x4b,0x47,0x5c,0x47,0x42,0x55,0x3f,0x3a,0x4a, 0x3e,0x38,0x47,0x3a,0x32,0x3e,0x36,0x2f,0x3a,0x36,0x2f,0x3c,0x38,0x2e,0x3a,0x3c, 0x33,0x41,0x3e,0x32,0x40,0x39,0x2e,0x3a,0x3c,0x31,0x3d,0x39,0x2d,0x38,0x3b,0x2f, 0x3a,0x4d,0x3e,0x4e,0x57,0x47,0x5a,0x56,0x49,0x5d,0x55,0x4a,0x60,0x47,0x46,0x5e, 0x55,0x5b,0x71,0x5e,0x65,0x78,0x5e,0x63,0x77,0x5f,0x66,0x7a,0x5a,0x61,0x76,0x5d, 0x63,0x75,0x67,0x6c,0x7b,0x76,0x7b,0x87,0x84,0x87,0x90,0x7a,0x7e,0x88,0x5a,0x5e, 0x69,0x55,0x59,0x69,0x6b,0x71,0x86,0x69,0x68,0x7e,0x45,0x46,0x61,0x46,0x49,0x62, 0x51,0x51,0x6b,0x4a,0x4c,0x6a,0x57,0x48,0x61,0x5f,0x67,0x85,0xde,0xde,0xe0,0x2c, 0x23,0x28,0x21,0x18,0x1b,0x17,0x11,0x15,0x24,0x1a,0x23,0x36,0x2b,0x3d,0x48,0x48, 0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x9c,0xac,0xac,0xb3,0xc7,0x62,0x6d,0x93, 0x69,0x74,0x98,0x7e,0x88,0xa8,0x7f,0x89,0xa6,0x80,0x8a,0xa8,0x84,0x8d,0xaa,0x82, 0x8c,0xa9,0x84,0x8d,0xa8,0x7f,0x87,0xa3,0x79,0x82,0x9c,0x71,0x7a,0x95,0x54,0x5d, 0x7d,0x52,0x5a,0x7b,0x89,0x90,0xa3,0x37,0x39,0x3e,0x1c,0x1e,0x24,0x24,0x26,0x2e, 0x2d,0x31,0x3c,0x33,0x37,0x45,0x36,0x3b,0x4a,0x38,0x3e,0x4e,0x3a,0x3f,0x54,0x42, 0x48,0x5f,0x48,0x4b,0x66,0x53,0x5a,0x75,0x66,0x6e,0x85,0x6a,0x72,0x89,0x6c,0x73, 0x88,0x5e,0x66,0x7d,0x56,0x5e,0x76,0x5a,0x62,0x79,0x52,0x5a,0x73,0x4e,0x56,0x70, 0x4b,0x4b,0x66,0x51,0x4a,0x63,0x51,0x48,0x5a,0x54,0x45,0x57,0x74,0x6e,0x83,0x7b, 0x76,0x89,0x7e,0x79,0x8d,0x7d,0x7a,0x8e,0x40,0x38,0x46,0x4e,0x45,0x58,0x56,0x4c, 0x63,0x58,0x4e,0x64,0x58,0x4c,0x62,0x59,0x4c,0x62,0x5e,0x53,0x66,0x60,0x56,0x66, 0x4f,0x45,0x55,0x47,0x3d,0x4d,0x46,0x3c,0x4c,0x45,0x3b,0x4a,0x4c,0x42,0x51,0x4e, 0x43,0x53,0x4d,0x41,0x53,0x4c,0x41,0x53,0x4b,0x40,0x51,0x4d,0x40,0x53,0x4b,0x40, 0x52,0x42,0x38,0x48,0x3d,0x33,0x40,0x3e,0x33,0x40,0x49,0x3a,0x4a,0x4a,0x3c,0x4c, 0x4e,0x3e,0x50,0x51,0x47,0x5c,0x48,0x47,0x60,0x52,0x59,0x72,0x61,0x69,0x81,0x69, 0x70,0x86,0x7a,0x82,0x93,0x76,0x7c,0x8f,0x6e,0x75,0x8a,0x71,0x78,0x8a,0x6e,0x75, 0x87,0x6e,0x74,0x86,0x70,0x76,0x88,0x6f,0x75,0x87,0x69,0x6f,0x83,0x71,0x76,0x8d, 0x8a,0x8b,0x9f,0x7c,0x7e,0x90,0x86,0x87,0x94,0x67,0x68,0x76,0x7a,0x78,0x82,0x62, 0x60,0x6b,0x4d,0x4a,0x54,0x5c,0x59,0x63,0xb9,0xbb,0xc1,0xa7,0xac,0xb7,0x86,0x8c, 0xa2,0x63,0x6b,0x87,0x4c,0x4e,0x6d,0x48,0x48,0x6a,0x4c,0x4a,0x6e,0x5a,0x50,0x6c, 0x58,0x49,0x63,0x4e,0x4f,0x73,0x3c,0x41,0x4d,0x1d,0x1f,0x2a,0x1f,0x22,0x2d,0x20, 0x22,0x2e,0x20,0x23,0x2e,0x20,0x22,0x2e,0x1e,0x20,0x2a,0x1a,0x1d,0x26,0x1c,0x1e, 0x27,0x32,0x30,0x48,0x30,0x2d,0x44,0x2f,0x2b,0x42,0x57,0x4f,0x71,0x5a,0x51,0x71, 0x5b,0x51,0x73,0x5d,0x51,0x74,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5c,0x54,0x77,0x5c, 0x52,0x77,0x5b,0x53,0x77,0x5a,0x53,0x78,0x54,0x52,0x79,0x57,0x5b,0x80,0x65,0x6f, 0x90,0x88,0x89,0x99,0x2c,0x2e,0x36,0x2c,0x2e,0x36,0x2a,0x2d,0x34,0x27,0x2a,0x31, 0x22,0x25,0x2a,0x32,0x2e,0x37,0x48,0x3e,0x4a,0x6c,0x65,0x6d,0x7a,0x84,0x9f,0x60, 0x6a,0x8b,0x58,0x64,0x85,0x56,0x62,0x87,0x54,0x5e,0x86,0x52,0x5d,0x86,0x51,0x5b, 0x83,0x4f,0x5b,0x82,0x4e,0x57,0x7f,0x4c,0x55,0x7c,0x48,0x52,0x78,0x47,0x4c,0x73, 0x45,0x48,0x6f,0x45,0x46,0x6c,0x44,0x44,0x68,0x3c,0x3a,0x56,0x1e,0x1c,0x26,0x2f, 0x2c,0x3a,0x43,0x3a,0x4c,0x4f,0x43,0x55,0x54,0x46,0x57,0x4f,0x41,0x52,0x49,0x3d, 0x4d,0x3e,0x36,0x45,0x2f,0x2f,0x3c,0x3f,0x41,0x4c,0x3d,0x41,0x4a,0x3e,0x41,0x4a, 0x29,0x2b,0x35,0x52,0x48,0x5a,0x4d,0x42,0x53,0x5b,0x52,0x63,0x81,0x89,0xa1,0x4c, 0x50,0x76,0x48,0x41,0x54,0x1a,0x1d,0x25,0x1f,0x22,0x2b,0x26,0x29,0x33,0x27,0x2b, 0x36,0x28,0x2c,0x36,0x24,0x28,0x32,0x3d,0x36,0x48,0x4f,0x4d,0x6e,0x8e,0x89,0x94, 0x56,0x47,0x59,0x6b,0x5c,0x73,0x62,0x61,0x83,0x33,0x38,0x47,0x25,0x29,0x33,0x2d, 0x32,0x3d,0x2f,0x33,0x3f,0x31,0x35,0x42,0x35,0x39,0x45,0x3a,0x3e,0x4a,0x3e,0x42, 0x4f,0x3f,0x43,0x50,0x3d,0x41,0x4e,0x36,0x3a,0x46,0x32,0x36,0x43,0x36,0x3a,0x47, 0x38,0x3c,0x4a,0x33,0x37,0x45,0x2f,0x33,0x40,0x2a,0x2e,0x3a,0x28,0x2c,0x37,0x27, 0x2a,0x36,0x27,0x2a,0x35,0x25,0x28,0x33,0x20,0x23,0x2e,0x1f,0x22,0x2d,0x1d,0x1f, 0x29,0x15,0x14,0x1c,0x0f,0x0e,0x13,0x0d,0x0c,0x0f,0x0b,0x0a,0x0e,0x0a,0x09,0x0b, 0x09,0x08,0x0a,0x07,0x07,0x09,0x06,0x06,0x07,0x06,0x05,0x06,0x05,0x05,0x06,0x05, 0x04,0x06,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x0f,0x0d,0x11,0x3c,0x35,0x46,0x24,0x20,0x2a, 0x02,0x02,0x02,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,0x0f,0x0d,0x12,0x11,0x0f,0x13,0x02,0x02,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7b,0x7b,0x7c,0xa5,0xad,0xc3,0x6e,0x7a,0x9d,0x65,0x71, 0x96,0x65,0x72,0x98,0x67,0x73,0x99,0x69,0x74,0x99,0x6b,0x76,0x9b,0x69,0x74,0x99, 0x6a,0x75,0x9a,0x69,0x74,0x99,0x76,0x86,0xb0,0x1c,0x1c,0x1c,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x05,0x05,0x06,0x06, 0x06,0x08,0x08,0x09,0x09,0x09,0x0a,0x0a,0x0b,0x0d,0x10,0x10,0x12,0x2b,0x2c,0x2c, 0x2c,0x2c,0x2d,0x1a,0x1b,0x1c,0x25,0x26,0x29,0x19,0x19,0x1c,0x16,0x16,0x19,0x16, 0x17,0x1a,0x24,0x24,0x27,0x33,0x33,0x35,0x10,0x0f,0x13,0x15,0x12,0x17,0x1a,0x16, 0x1b,0x21,0x1b,0x22,0x29,0x22,0x2a,0x26,0x1f,0x27,0x1b,0x17,0x1e,0x1b,0x18,0x1f, 0x19,0x1a,0x22,0x1c,0x1e,0x27,0x22,0x25,0x2e,0x29,0x2b,0x34,0x30,0x33,0x3d,0x3c, 0x3f,0x49,0x4a,0x4e,0x57,0x52,0x56,0x5f,0x56,0x5a,0x63,0x51,0x55,0x5f,0x53,0x57, 0x62,0x56,0x5b,0x68,0x55,0x5a,0x6a,0x4e,0x55,0x6a,0x4f,0x56,0x6c,0x56,0x5c,0x72, 0x59,0x60,0x74,0x5e,0x64,0x77,0x5f,0x66,0x79,0x65,0x6b,0x7d,0x60,0x67,0x7b,0x4a, 0x4a,0x62,0x44,0x42,0x56,0x47,0x44,0x59,0x4b,0x4a,0x61,0x4c,0x4d,0x66,0x52,0x4e, 0x66,0x55,0x4e,0x64,0x53,0x4a,0x60,0x4f,0x47,0x5b,0x4c,0x45,0x56,0x4e,0x46,0x5a, 0x47,0x40,0x52,0x46,0x3e,0x4f,0x44,0x3f,0x52,0x46,0x45,0x5a,0x47,0x47,0x5e,0x4a, 0x49,0x5f,0x49,0x47,0x5e,0x4a,0x47,0x5e,0x4a,0x47,0x5d,0x4a,0x47,0x5e,0x4b,0x47, 0x5a,0x47,0x41,0x53,0x43,0x3d,0x4d,0x34,0x30,0x3c,0x30,0x2c,0x36,0x32,0x2b,0x36, 0x35,0x2e,0x3a,0x35,0x2d,0x3a,0x32,0x2a,0x36,0x2e,0x26,0x2f,0x30,0x27,0x31,0x32, 0x28,0x32,0x36,0x2d,0x36,0x3e,0x33,0x41,0x44,0x39,0x47,0x4d,0x40,0x50,0x56,0x47, 0x59,0x57,0x4a,0x5f,0x4f,0x4a,0x61,0x4a,0x4b,0x65,0x51,0x58,0x71,0x58,0x5f,0x76, 0x50,0x58,0x6e,0x50,0x56,0x6b,0x59,0x5f,0x70,0x6e,0x72,0x7f,0x86,0x89,0x92,0x85, 0x88,0x8f,0x62,0x65,0x6d,0x4d,0x51,0x5d,0x56,0x5c,0x73,0x4d,0x4d,0x67,0x48,0x43, 0x5d,0x3f,0x45,0x5f,0x47,0x4c,0x67,0x4b,0x50,0x6d,0x57,0x49,0x64,0x55,0x5d,0x80, 0xc5,0xc8,0xd1,0x54,0x4c,0x50,0x1f,0x17,0x1a,0x1e,0x16,0x1c,0x1e,0x16,0x1f,0x33, 0x27,0x36,0x3e,0x3e,0x53,0x04,0x04,0x04,0x00,0x00,0x00,0x5e,0x62,0x6c,0xae,0xb6, 0xc8,0x76,0x82,0xa3,0x5b,0x66,0x8d,0x77,0x82,0xa3,0x7a,0x84,0xa5,0x7c,0x88,0xa6, 0x81,0x8b,0xa9,0x85,0x8e,0xab,0x83,0x8c,0xa9,0x83,0x8c,0xa8,0x7f,0x88,0xa2,0x7a, 0x84,0x9f,0x6a,0x73,0x90,0x4f,0x58,0x7c,0x76,0x7f,0x99,0x65,0x68,0x70,0x16,0x19, 0x1e,0x1e,0x20,0x27,0x26,0x29,0x32,0x2e,0x32,0x3e,0x34,0x38,0x46,0x34,0x39,0x47, 0x37,0x3c,0x4c,0x46,0x4c,0x5e,0x4e,0x55,0x6a,0x5a,0x62,0x7a,0x63,0x6b,0x84,0x65, 0x6e,0x86,0x67,0x6f,0x86,0x6b,0x73,0x88,0x6e,0x76,0x8a,0x7c,0x82,0x93,0x70,0x77, 0x8a,0x75,0x7b,0x8e,0x6e,0x76,0x89,0x4b,0x4f,0x6a,0x47,0x46,0x5f,0x52,0x4b,0x63, 0x62,0x63,0x80,0x74,0x75,0x8f,0x7d,0x78,0x90,0x7b,0x74,0x89,0x52,0x47,0x57,0x46, 0x3e,0x4e,0x53,0x49,0x5e,0x57,0x4c,0x63,0x5a,0x4e,0x62,0x5a,0x4b,0x60,0x59,0x4c, 0x61,0x61,0x57,0x6a,0x6a,0x60,0x71,0x52,0x46,0x5a,0x4b,0x40,0x53,0x48,0x3d,0x4e, 0x50,0x46,0x58,0x5c,0x54,0x64,0x47,0x3e,0x4e,0x45,0x3d,0x4d,0x44,0x3b,0x4b,0x42, 0x38,0x48,0x43,0x39,0x49,0x42,0x38,0x48,0x3a,0x33,0x41,0x36,0x2f,0x3c,0x40,0x36, 0x44,0x47,0x3a,0x49,0x49,0x3b,0x4a,0x4b,0x3f,0x4f,0x4e,0x44,0x59,0x4a,0x47,0x62, 0x4e,0x55,0x71,0x56,0x5e,0x79,0x6c,0x74,0x8a,0x87,0x8c,0x9c,0x76,0x7c,0x90,0x6e, 0x76,0x8a,0x6b,0x72,0x86,0x66,0x6e,0x82,0x5d,0x64,0x7b,0x56,0x5e,0x76,0x70,0x77, 0x8a,0x83,0x89,0x9e,0x89,0x8a,0x9d,0x86,0x87,0x97,0x8f,0x8f,0x9c,0x82,0x82,0x8c, 0x60,0x5f,0x6c,0x63,0x62,0x6d,0x5c,0x5a,0x65,0x64,0x63,0x6e,0xb3,0xb6,0xbe,0xa0, 0xa5,0xb2,0x82,0x89,0x9e,0x5e,0x66,0x83,0x4c,0x4e,0x6d,0x48,0x48,0x6a,0x4b,0x4a, 0x6e,0x53,0x4f,0x70,0x56,0x46,0x60,0x5a,0x4e,0x6a,0x47,0x50,0x6c,0x1e,0x20,0x2a, 0x21,0x24,0x2e,0x21,0x24,0x2e,0x20,0x23,0x2e,0x20,0x23,0x2e,0x1e,0x20,0x2a,0x1c, 0x1e,0x27,0x1a,0x1c,0x24,0x32,0x2f,0x47,0x2f,0x2e,0x44,0x31,0x2d,0x44,0x57,0x4f, 0x72,0x5b,0x51,0x71,0x5d,0x51,0x73,0x5b,0x51,0x76,0x5e,0x52,0x75,0x5c,0x53,0x77, 0x5d,0x54,0x77,0x5d,0x54,0x78,0x5b,0x53,0x77,0x5a,0x53,0x77,0x57,0x53,0x79,0x58, 0x5a,0x7f,0x67,0x70,0x91,0x89,0x8b,0x9b,0x30,0x32,0x3a,0x2e,0x31,0x38,0x2f,0x32, 0x39,0x2d,0x2f,0x36,0x28,0x2a,0x30,0x31,0x30,0x39,0x49,0x40,0x4b,0x64,0x5d,0x67, 0x77,0x81,0x9d,0x5e,0x68,0x87,0x56,0x61,0x82,0x57,0x62,0x89,0x53,0x5d,0x85,0x53, 0x5d,0x85,0x52,0x5c,0x84,0x4f,0x5a,0x83,0x4e,0x5a,0x81,0x4c,0x55,0x7d,0x4a,0x52, 0x79,0x47,0x4c,0x73,0x45,0x48,0x6f,0x45,0x47,0x6c,0x45,0x44,0x69,0x40,0x3d,0x5b, 0x21,0x1e,0x26,0x34,0x30,0x3e,0x47,0x3e,0x4e,0x50,0x42,0x52,0x53,0x44,0x56,0x54, 0x46,0x56,0x4c,0x40,0x50,0x42,0x3a,0x49,0x36,0x31,0x41,0x2a,0x2a,0x3a,0x28,0x2c, 0x39,0x2a,0x2e,0x38,0x29,0x2c,0x35,0x4f,0x47,0x57,0x54,0x49,0x5a,0x53,0x47,0x58, 0x92,0x97,0xab,0x4e,0x58,0x7d,0x52,0x49,0x5f,0x1a,0x1c,0x24,0x1e,0x20,0x29,0x21, 0x24,0x2e,0x23,0x26,0x30,0x22,0x25,0x2e,0x20,0x22,0x2c,0x42,0x3a,0x4d,0x4c,0x56, 0x79,0x81,0x78,0x86,0x67,0x57,0x6e,0x61,0x60,0x81,0x39,0x40,0x52,0x1e,0x20,0x29, 0x2a,0x2e,0x39,0x2e,0x33,0x40,0x32,0x36,0x42,0x36,0x3a,0x46,0x3c,0x40,0x4d,0x3e, 0x43,0x51,0x43,0x48,0x56,0x46,0x4b,0x59,0x43,0x48,0x56,0x3e,0x42,0x4f,0x3a,0x3e, 0x4c,0x36,0x3c,0x4a,0x3a,0x3e,0x4c,0x35,0x3a,0x47,0x32,0x36,0x44,0x30,0x34,0x42, 0x2d,0x31,0x3d,0x2a,0x2e,0x3b,0x29,0x2c,0x39,0x26,0x29,0x34,0x22,0x26,0x31,0x4a, 0x4c,0x55,0x1d,0x1e,0x29,0x16,0x15,0x1d,0x11,0x10,0x16,0x0e,0x0d,0x11,0x0d,0x0b, 0x0f,0x0a,0x0a,0x0c,0x09,0x08,0x0b,0x08,0x07,0x0a,0x07,0x07,0x09,0x06,0x06,0x07, 0x05,0x05,0x06,0x05,0x04,0x06,0x05,0x04,0x06,0x03,0x03,0x04,0x03,0x03,0x04,0x03, 0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x1a,0x17, 0x1e,0x2f,0x2a,0x37,0x07,0x06,0x07,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,0x0f,0x0d,0x12,0x27,0x22,0x2d,0x27,0x22, 0x2e,0x0d,0x0b,0x0f,0x00,0x00,0x00,0x1e,0x1a,0x22,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0xb8,0xbe,0xd0,0x74, 0x80,0xa2,0x62,0x6d,0x94,0x62,0x6e,0x94,0x64,0x6f,0x95,0x64,0x71,0x96,0x64,0x71, 0x96,0x67,0x73,0x98,0x67,0x73,0x98,0x65,0x72,0x98,0x66,0x72,0x99,0x75,0x84,0xb2, 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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x05,0x05,0x06, 0x06,0x06,0x0e,0x0e,0x0f,0x1a,0x1a,0x1c,0x1f,0x1f,0x21,0x26,0x26,0x27,0x23,0x24, 0x26,0x1a,0x1a,0x1d,0x18,0x19,0x1b,0x17,0x18,0x1b,0x21,0x22,0x24,0x33,0x33,0x35, 0x2e,0x2f,0x32,0x17,0x18,0x1a,0x0b,0x0c,0x0f,0x50,0x50,0x53,0x26,0x25,0x2a,0x16, 0x14,0x1a,0x1f,0x1a,0x21,0x27,0x22,0x2c,0x26,0x20,0x28,0x22,0x1e,0x26,0x17,0x16, 0x1d,0x18,0x1a,0x22,0x1d,0x1f,0x26,0x2b,0x2e,0x35,0x3a,0x3d,0x44,0x4c,0x4e,0x56, 0x58,0x5b,0x64,0x5e,0x62,0x6d,0x64,0x68,0x74,0x66,0x6a,0x76,0x6a,0x6d,0x78,0x6d, 0x71,0x7a,0x6c,0x70,0x7a,0x6c,0x6f,0x7b,0x69,0x6e,0x7a,0x67,0x6c,0x7a,0x71,0x76, 0x86,0x7a,0x80,0x8c,0x7d,0x81,0x8e,0x81,0x85,0x90,0x7b,0x7f,0x8b,0x79,0x7e,0x8c, 0x76,0x7c,0x89,0x5d,0x65,0x7b,0x53,0x54,0x6e,0x55,0x51,0x68,0x4c,0x4a,0x60,0x47, 0x46,0x5c,0x46,0x45,0x59,0x4a,0x46,0x59,0x4c,0x46,0x58,0x4d,0x46,0x58,0x4f,0x4a, 0x5d,0x49,0x45,0x58,0x44,0x42,0x57,0x47,0x47,0x5e,0x50,0x55,0x6e,0x59,0x61,0x76, 0x55,0x5c,0x75,0x51,0x52,0x6b,0x4f,0x4f,0x67,0x4c,0x4e,0x67,0x4e,0x52,0x6a,0x4b, 0x51,0x67,0x48,0x4a,0x60,0x45,0x43,0x59,0x41,0x3f,0x54,0x34,0x32,0x42,0x2e,0x2c, 0x3a,0x2a,0x29,0x36,0x2e,0x2a,0x36,0x32,0x2c,0x38,0x34,0x2b,0x37,0x32,0x2a,0x36, 0x36,0x2c,0x38,0x39,0x2f,0x3c,0x3e,0x32,0x40,0x40,0x35,0x42,0x3e,0x32,0x3f,0x41, 0x36,0x44,0x44,0x38,0x46,0x48,0x3b,0x4a,0x55,0x46,0x58,0x5a,0x4d,0x62,0x52,0x4b, 0x63,0x49,0x49,0x63,0x48,0x4e,0x67,0x41,0x47,0x5e,0x47,0x4e,0x61,0x55,0x5a,0x6b, 0x6e,0x72,0x7f,0x7b,0x7e,0x87,0x7a,0x7c,0x82,0x62,0x64,0x6f,0x5a,0x60,0x76,0x4a, 0x4b,0x64,0x44,0x3e,0x58,0x40,0x48,0x65,0x47,0x4d,0x6b,0x4a,0x52,0x71,0x54,0x49, 0x66,0x51,0x5b,0x7d,0x91,0x9a,0xae,0x76,0x72,0x75,0x1d,0x14,0x18,0x27,0x1d,0x23, 0x1b,0x13,0x1b,0x2f,0x24,0x31,0x33,0x34,0x4b,0x23,0x24,0x26,0x00,0x00,0x00,0x22, 0x23,0x27,0xb0,0xb7,0xca,0x92,0x9b,0xb7,0x52,0x5c,0x85,0x79,0x84,0xa5,0x7a,0x86, 0xa6,0x7a,0x84,0xa5,0x81,0x8b,0xa9,0x80,0x8a,0xa8,0x80,0x8c,0xa8,0x82,0x8c,0xa9, 0x7f,0x89,0xa6,0x7a,0x84,0xa1,0x72,0x7c,0x9b,0x51,0x5b,0x7f,0x5d,0x68,0x89,0x83, 0x89,0x9c,0x17,0x19,0x1e,0x24,0x26,0x30,0x2b,0x2f,0x3b,0x2e,0x32,0x40,0x2d,0x31, 0x3e,0x2f,0x34,0x41,0x3b,0x40,0x4e,0x4e,0x53,0x62,0x5b,0x61,0x71,0x65,0x6c,0x81, 0x69,0x70,0x87,0x6a,0x72,0x89,0x6e,0x75,0x8b,0x72,0x79,0x8e,0x79,0x80,0x93,0x82, 0x88,0x99,0x83,0x8a,0x9a,0x94,0x99,0xa5,0x88,0x8e,0x9d,0x5f,0x67,0x7f,0x5b,0x64, 0x7c,0x6c,0x71,0x88,0x71,0x78,0x93,0x86,0x8e,0xa8,0x78,0x81,0x9d,0x72,0x73,0x91, 0x61,0x58,0x6f,0x44,0x3e,0x52,0x4d,0x43,0x58,0x52,0x48,0x5d,0x56,0x4b,0x62,0x5a, 0x4e,0x65,0x5b,0x50,0x67,0x5b,0x50,0x68,0x59,0x4e,0x66,0x57,0x4b,0x61,0x54,0x47, 0x5d,0x53,0x47,0x5d,0x52,0x47,0x5d,0x5f,0x55,0x67,0x5c,0x52,0x64,0x4c,0x42,0x55, 0x47,0x3e,0x4f,0x46,0x3c,0x4d,0x45,0x3c,0x4d,0x42,0x39,0x49,0x40,0x37,0x47,0x35, 0x2f,0x3b,0x3c,0x34,0x42,0x42,0x37,0x44,0x48,0x3a,0x4a,0x4a,0x3c,0x4c,0x4d,0x41, 0x52,0x4d,0x44,0x59,0x4d,0x4c,0x66,0x4f,0x50,0x6e,0x5d,0x66,0x7e,0x71,0x78,0x8d, 0x7e,0x84,0x96,0x75,0x7c,0x8e,0x6b,0x72,0x86,0x66,0x6e,0x82,0x5f,0x66,0x7d,0x56, 0x5e,0x76,0x68,0x70,0x85,0x8f,0x94,0xa6,0x99,0x99,0xa8,0x8f,0x8e,0x9b,0x8f,0x8e, 0x99,0x81,0x80,0x8a,0x6d,0x6b,0x76,0x61,0x60,0x6d,0x62,0x62,0x6d,0x6b,0x6a,0x75, 0xb4,0xb6,0xc0,0x98,0x9d,0xab,0x6f,0x78,0x8f,0x54,0x5e,0x7c,0x4c,0x4b,0x6c,0x4b, 0x4a,0x6c,0x52,0x4e,0x6f,0x55,0x50,0x73,0x5c,0x4c,0x68,0x54,0x43,0x5d,0x59,0x52, 0x72,0x34,0x38,0x46,0x20,0x23,0x2e,0x22,0x25,0x30,0x22,0x24,0x2f,0x20,0x23,0x2e, 0x1e,0x22,0x2b,0x1d,0x1f,0x29,0x1a,0x1e,0x26,0x32,0x31,0x48,0x31,0x2e,0x44,0x3b, 0x36,0x4f,0x5a,0x51,0x71,0x5b,0x51,0x72,0x5c,0x51,0x73,0x5e,0x51,0x74,0x5e,0x52, 0x75,0x5d,0x54,0x77,0x5d,0x54,0x78,0x5c,0x52,0x78,0x5b,0x53,0x77,0x5b,0x54,0x78, 0x57,0x53,0x79,0x56,0x59,0x7e,0x64,0x6f,0x90,0x8f,0x92,0xa1,0x32,0x35,0x3c,0x34, 0x36,0x3e,0x36,0x38,0x3f,0x32,0x36,0x3d,0x30,0x32,0x3a,0x34,0x33,0x3b,0x4b,0x42, 0x4e,0x64,0x5c,0x67,0x7e,0x87,0xa2,0x5d,0x68,0x87,0x59,0x63,0x85,0x56,0x62,0x88, 0x53,0x5d,0x85,0x53,0x5d,0x85,0x50,0x5b,0x84,0x4f,0x5b,0x83,0x4f,0x5b,0x81,0x4c, 0x55,0x7d,0x4b,0x54,0x7b,0x48,0x4e,0x75,0x46,0x4b,0x70,0x45,0x46,0x6b,0x46,0x45, 0x6a,0x40,0x3d,0x5a,0x23,0x20,0x2a,0x3c,0x35,0x45,0x4c,0x41,0x52,0x51,0x42,0x52, 0x52,0x43,0x55,0x56,0x47,0x5a,0x4f,0x43,0x56,0x46,0x3e,0x4e,0x3b,0x36,0x47,0x32, 0x32,0x43,0x2e,0x30,0x40,0x2e,0x32,0x3e,0x2e,0x31,0x3a,0x3d,0x3a,0x47,0x59,0x4d, 0x60,0x57,0x49,0x5c,0x87,0x88,0x9a,0x52,0x5c,0x80,0x57,0x4c,0x67,0x19,0x1b,0x23, 0x1e,0x21,0x2a,0x20,0x23,0x2e,0x21,0x23,0x2e,0x21,0x24,0x2e,0x1f,0x22,0x2c,0x45, 0x3c,0x51,0x59,0x64,0x83,0x6e,0x61,0x77,0x66,0x5f,0x7e,0x47,0x4e,0x65,0x1d,0x1e, 0x27,0x26,0x29,0x33,0x2e,0x32,0x3e,0x33,0x38,0x44,0x36,0x3b,0x48,0x3d,0x41,0x4e, 0x42,0x46,0x54,0x48,0x4d,0x5a,0x4d,0x52,0x5f,0x4c,0x50,0x5e,0x46,0x4b,0x59,0x42, 0x46,0x55,0x3c,0x41,0x50,0x3a,0x3e,0x4e,0x3a,0x3f,0x4e,0x39,0x3e,0x4d,0x36,0x3c, 0x4a,0x36,0x3a,0x49,0x35,0x3a,0x47,0x34,0x39,0x46,0x2f,0x34,0x41,0x2a,0x2e,0x3b, 0x23,0x27,0x33,0x1f,0x20,0x2b,0x1c,0x1c,0x26,0x1e,0x1d,0x25,0x17,0x15,0x1c,0x21, 0x1f,0x24,0x16,0x15,0x19,0x0c,0x0b,0x0f,0x0a,0x09,0x0c,0x09,0x08,0x0a,0x07,0x06, 0x09,0x06,0x06,0x07,0x06,0x05,0x06,0x05,0x05,0x06,0x05,0x04,0x06,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x24,0x20,0x2a,0x14,0x12,0x17,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,0x0c,0x0b,0x0f,0x06,0x05,0x07,0x00,0x00,0x00,0x1d,0x1a,0x22,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc9,0xcc,0xd5,0x83,0x8d,0xac,0x64,0x71,0x96,0x5e,0x6b,0x92,0x63,0x6e,0x95,0x62, 0x6e,0x94,0x62,0x6d,0x94,0x64,0x71,0x96,0x64,0x71,0x96,0x64,0x6f,0x95,0x63,0x6f, 0x95,0x75,0x82,0xb0,0x0d,0x0f,0x10,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,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,0x02,0x02,0x02,0x04,0x04,0x04, 0x06,0x06,0x06,0x0a,0x0b,0x0c,0x1e,0x1e,0x20,0x36,0x37,0x3a,0x52,0x53,0x56,0x5f, 0x60,0x62,0x5a,0x5a,0x5d,0x42,0x44,0x46,0x3a,0x3b,0x3e,0x37,0x39,0x3d,0x32,0x33, 0x37,0x38,0x39,0x3d,0x28,0x2a,0x2d,0x18,0x1a,0x1c,0x0f,0x10,0x12,0x21,0x23,0x25, 0x4a,0x4b,0x4e,0x1f,0x1e,0x24,0x1b,0x18,0x20,0x21,0x1d,0x26,0x1e,0x1b,0x24,0x1b, 0x1e,0x27,0x26,0x29,0x30,0x33,0x35,0x3b,0x3a,0x3d,0x43,0x4f,0x51,0x57,0x64,0x66, 0x6c,0x73,0x76,0x7c,0x7e,0x80,0x88,0x7a,0x7e,0x88,0x75,0x79,0x85,0x76,0x7a,0x86, 0x7f,0x83,0x8c,0x87,0x8a,0x91,0x82,0x85,0x8d,0x77,0x7b,0x85,0x7b,0x7e,0x87,0x81, 0x85,0x8d,0x89,0x8b,0x94,0x8b,0x8e,0x98,0x8d,0x90,0x9a,0x8f,0x93,0x9c,0x8b,0x8e, 0x99,0x86,0x8a,0x96,0x81,0x85,0x91,0x73,0x78,0x89,0x56,0x5e,0x76,0x55,0x56,0x6e, 0x55,0x55,0x6e,0x55,0x55,0x6e,0x53,0x53,0x6d,0x52,0x52,0x6a,0x55,0x51,0x68,0x53, 0x51,0x69,0x4a,0x4b,0x63,0x4b,0x51,0x67,0x5c,0x61,0x76,0x63,0x6a,0x80,0x5f,0x68, 0x7d,0x62,0x6a,0x7f,0x5d,0x65,0x7c,0x58,0x5f,0x7a,0x5b,0x63,0x7d,0x5e,0x66,0x7e, 0x66,0x6d,0x82,0x63,0x6a,0x7e,0x57,0x5e,0x75,0x4c,0x52,0x6a,0x49,0x4e,0x61,0x47, 0x4a,0x5a,0x3e,0x3f,0x4e,0x36,0x36,0x43,0x2e,0x2b,0x39,0x34,0x2d,0x3a,0x32,0x2b, 0x36,0x32,0x2a,0x36,0x35,0x2f,0x3a,0x3a,0x32,0x41,0x41,0x3a,0x49,0x42,0x39,0x46, 0x3f,0x34,0x42,0x43,0x37,0x46,0x3a,0x2f,0x3b,0x33,0x2a,0x34,0x36,0x2c,0x37,0x42, 0x35,0x42,0x55,0x45,0x56,0x57,0x4b,0x60,0x4a,0x45,0x5c,0x40,0x40,0x56,0x3d,0x42, 0x57,0x41,0x46,0x5c,0x4d,0x53,0x66,0x5b,0x61,0x6f,0x73,0x76,0x7f,0x77,0x7a,0x81, 0x7c,0x82,0x96,0x6c,0x70,0x8a,0x5b,0x59,0x6f,0x4a,0x4f,0x69,0x45,0x4b,0x68,0x48, 0x50,0x6e,0x56,0x48,0x65,0x4b,0x54,0x78,0x77,0x81,0x9e,0x98,0x96,0x99,0x1a,0x11, 0x14,0x25,0x1a,0x21,0x29,0x1e,0x25,0x26,0x1d,0x27,0x2f,0x2d,0x45,0x3f,0x40,0x45, 0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xa2,0xb3,0xa6,0xae,0xc3,0x53,0x5e,0x87,0x66, 0x73,0x97,0x78,0x82,0xa3,0x77,0x82,0xa3,0x79,0x84,0xa5,0x7e,0x89,0xa7,0x80,0x89, 0xa7,0x7c,0x87,0xa5,0x7a,0x83,0xa0,0x76,0x80,0x9e,0x72,0x7c,0x9a,0x58,0x60,0x85, 0x54,0x58,0x7d,0x7f,0x82,0x9b,0x3b,0x3e,0x48,0x34,0x38,0x46,0x35,0x3a,0x4a,0x35, 0x3a,0x4a,0x30,0x34,0x43,0x33,0x37,0x46,0x3f,0x45,0x54,0x51,0x56,0x65,0x5c,0x61, 0x71,0x5e,0x65,0x79,0x5a,0x62,0x7a,0x5a,0x63,0x7d,0x5e,0x66,0x81,0x64,0x6b,0x85, 0x76,0x7d,0x91,0x84,0x8a,0x9b,0x8a,0x90,0xa0,0x9e,0xa2,0xad,0x86,0x8c,0x9c,0x71, 0x78,0x8e,0x7b,0x82,0x95,0x85,0x8a,0x9d,0x8b,0x90,0xa4,0x9e,0xa6,0xbd,0x91,0x9a, 0xb3,0x7b,0x85,0xa1,0x66,0x69,0x87,0x49,0x4d,0x67,0x4a,0x4a,0x64,0x4c,0x49,0x62, 0x50,0x4a,0x62,0x4f,0x4a,0x64,0x51,0x4d,0x68,0x54,0x50,0x6a,0x57,0x50,0x6a,0x5d, 0x52,0x6a,0x5d,0x51,0x69,0x5a,0x4f,0x64,0x59,0x4c,0x62,0x58,0x4d,0x63,0x6b,0x62, 0x73,0x53,0x49,0x5d,0x51,0x46,0x5b,0x51,0x45,0x59,0x4f,0x44,0x59,0x4c,0x42,0x55, 0x4b,0x40,0x52,0x49,0x3f,0x51,0x3f,0x36,0x45,0x41,0x38,0x46,0x47,0x3a,0x49,0x4d, 0x3e,0x4e,0x4e,0x41,0x52,0x4b,0x42,0x56,0x4a,0x4c,0x64,0x4e,0x4e,0x6a,0x55,0x5e, 0x78,0x62,0x6a,0x82,0x6d,0x73,0x89,0x79,0x7e,0x91,0x71,0x77,0x8a,0x6a,0x70,0x85, 0x66,0x6d,0x82,0x60,0x67,0x7c,0x69,0x6f,0x83,0x92,0x97,0xa7,0xa8,0xa7,0xb6,0x8d, 0x8d,0x9a,0x84,0x84,0x8e,0x7e,0x7c,0x86,0x6e,0x6e,0x79,0x72,0x71,0x7d,0x62,0x62, 0x6e,0x6f,0x6f,0x7a,0xb4,0xb8,0xc2,0x9b,0xa0,0xaf,0x6c,0x75,0x8c,0x4b,0x52,0x72, 0x49,0x49,0x6a,0x52,0x4d,0x6e,0x55,0x4f,0x70,0x5d,0x52,0x70,0x5d,0x52,0x70,0x53, 0x44,0x5d,0x56,0x4a,0x63,0x43,0x4a,0x67,0x21,0x24,0x2e,0x22,0x25,0x30,0x22,0x25, 0x30,0x20,0x23,0x2e,0x1e,0x22,0x2b,0x1d,0x20,0x29,0x1a,0x1d,0x25,0x31,0x30,0x47, 0x33,0x2f,0x46,0x57,0x50,0x71,0x58,0x51,0x73,0x59,0x51,0x74,0x5d,0x51,0x73,0x5e, 0x52,0x75,0x5d,0x53,0x77,0x5d,0x53,0x77,0x5c,0x53,0x77,0x5c,0x52,0x78,0x5d,0x54, 0x79,0x5c,0x53,0x77,0x57,0x53,0x79,0x57,0x59,0x7d,0x65,0x6f,0x90,0x91,0x94,0xa2, 0x36,0x3a,0x41,0x39,0x3b,0x43,0x3a,0x3d,0x45,0x3a,0x3d,0x45,0x35,0x37,0x3e,0x34, 0x35,0x3b,0x4e,0x45,0x52,0x5b,0x54,0x5e,0x85,0x8d,0xa6,0x5e,0x67,0x86,0x59,0x66, 0x86,0x58,0x63,0x87,0x54,0x5e,0x85,0x53,0x5d,0x83,0x52,0x5d,0x84,0x52,0x5d,0x84, 0x4e,0x5a,0x81,0x4c,0x57,0x80,0x4b,0x55,0x7c,0x4a,0x50,0x77,0x47,0x4c,0x72,0x45, 0x47,0x6d,0x47,0x46,0x6a,0x43,0x3e,0x5b,0x2e,0x28,0x32,0x42,0x3a,0x4a,0x4e,0x42, 0x53,0x51,0x42,0x53,0x53,0x44,0x55,0x55,0x48,0x5a,0x4f,0x45,0x57,0x4a,0x40,0x52, 0x3f,0x3a,0x4d,0x36,0x36,0x49,0x33,0x34,0x46,0x31,0x36,0x44,0x32,0x36,0x42,0x2a, 0x2d,0x36,0x5b,0x50,0x63,0x5a,0x4d,0x60,0x74,0x71,0x85,0x56,0x61,0x84,0x58,0x51, 0x72,0x1a,0x1c,0x24,0x1e,0x21,0x2a,0x20,0x23,0x2e,0x20,0x23,0x2e,0x1f,0x22,0x2d, 0x1f,0x22,0x2c,0x4f,0x44,0x5c,0x6e,0x78,0x93,0x64,0x5f,0x7c,0x57,0x60,0x7e,0x1e, 0x20,0x29,0x25,0x28,0x33,0x2e,0x32,0x3e,0x33,0x37,0x44,0x38,0x3d,0x4a,0x45,0x4a, 0x56,0x51,0x56,0x62,0x72,0x77,0x81,0x8d,0x90,0x98,0x6d,0x71,0x7d,0x55,0x5a,0x67, 0x49,0x4e,0x5c,0x44,0x4a,0x58,0x41,0x46,0x56,0x40,0x45,0x55,0x3f,0x44,0x54,0x3d, 0x42,0x52,0x3a,0x3f,0x4f,0x3a,0x3e,0x4e,0x3b,0x3f,0x4e,0x3b,0x40,0x4f,0x38,0x3d, 0x4b,0x34,0x39,0x46,0x2e,0x32,0x40,0x26,0x2a,0x37,0x2a,0x2a,0x35,0x53,0x53,0x59, 0x5c,0x5b,0x5f,0x52,0x50,0x55,0x34,0x33,0x36,0x2e,0x2d,0x30,0x16,0x16,0x18,0x09, 0x08,0x0a,0x07,0x06,0x09,0x07,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x04, 0x06,0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x10,0x0e,0x12,0x10,0x0e,0x12,0x02, 0x02,0x02,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,0x76,0x77,0x79,0x9a,0xa2,0xbb,0x6a,0x75,0x9a,0x5e,0x6b,0x92, 0x5e,0x6b,0x92,0x60,0x6c,0x93,0x62,0x6d,0x94,0x62,0x6d,0x94,0x60,0x6d,0x93,0x62, 0x6d,0x94,0x60,0x6c,0x93,0x66,0x72,0x9b,0x58,0x63,0x88,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,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,0x02,0x02,0x02,0x03,0x03, 0x03,0x05,0x05,0x06,0x08,0x08,0x09,0x13,0x13,0x15,0x33,0x35,0x37,0x63,0x65,0x68, 0x82,0x83,0x86,0x87,0x88,0x8c,0x7f,0x81,0x85,0x68,0x69,0x6d,0x5b,0x5e,0x62,0x5a, 0x5d,0x62,0x5a,0x5b,0x61,0x58,0x59,0x5e,0x4a,0x4c,0x51,0x32,0x34,0x38,0x21,0x22, 0x24,0x17,0x18,0x1a,0x39,0x39,0x3c,0x39,0x3a,0x3f,0x29,0x2a,0x32,0x22,0x26,0x2e, 0x29,0x2b,0x33,0x37,0x3a,0x41,0x4d,0x4f,0x57,0x53,0x56,0x5e,0x5e,0x61,0x69,0x6e, 0x72,0x79,0x7b,0x7e,0x86,0x88,0x8a,0x92,0x90,0x92,0x99,0x89,0x8c,0x95,0x7d,0x82, 0x8d,0x7f,0x83,0x8e,0x88,0x8b,0x94,0x8f,0x91,0x97,0x86,0x89,0x90,0x81,0x84,0x8e, 0x86,0x89,0x92,0x8d,0x8f,0x98,0x92,0x95,0x9c,0x94,0x97,0xa1,0x96,0x9a,0xa3,0x96, 0x98,0xa2,0x93,0x97,0xa0,0x91,0x93,0x9d,0x8c,0x8f,0x9a,0x80,0x84,0x92,0x70,0x76, 0x88,0x61,0x69,0x7e,0x5a,0x61,0x7a,0x5b,0x64,0x7a,0x5f,0x66,0x7e,0x58,0x5e,0x76, 0x54,0x5b,0x72,0x5d,0x62,0x78,0x66,0x6c,0x81,0x6e,0x73,0x87,0x75,0x7a,0x8c,0x76, 0x7c,0x8d,0x77,0x7d,0x8e,0x77,0x7e,0x8f,0x74,0x7a,0x8c,0x71,0x77,0x8b,0x72,0x79, 0x8d,0x7b,0x81,0x93,0x7c,0x82,0x92,0x7a,0x80,0x92,0x76,0x7c,0x8d,0x69,0x6f,0x82, 0x62,0x67,0x78,0x57,0x5b,0x6b,0x4d,0x50,0x60,0x46,0x47,0x58,0x3a,0x38,0x4a,0x3a, 0x32,0x41,0x33,0x2c,0x39,0x30,0x29,0x35,0x2f,0x2a,0x35,0x30,0x2a,0x36,0x32,0x2d, 0x3a,0x38,0x30,0x3f,0x41,0x37,0x47,0x46,0x3c,0x4c,0x46,0x38,0x47,0x3c,0x32,0x3e, 0x33,0x29,0x33,0x33,0x2a,0x34,0x3e,0x32,0x3e,0x4e,0x3f,0x4f,0x52,0x47,0x5b,0x43, 0x41,0x57,0x42,0x42,0x5a,0x42,0x45,0x5d,0x3e,0x45,0x5a,0x41,0x47,0x5b,0x50,0x56, 0x66,0x62,0x66,0x71,0x87,0x8d,0xa2,0x91,0x98,0xae,0x78,0x74,0x87,0x58,0x5d,0x74, 0x48,0x4e,0x6a,0x47,0x4f,0x6b,0x4b,0x43,0x61,0x47,0x4a,0x6d,0x6a,0x74,0x95,0xc0, 0xbe,0xc0,0x18,0x10,0x13,0x22,0x18,0x1d,0x2d,0x21,0x28,0x27,0x1d,0x26,0x36,0x2d, 0x41,0x52,0x52,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x62,0x6d,0xae,0xb4,0xc9, 0x62,0x6d,0x93,0x53,0x5e,0x88,0x78,0x82,0xa3,0x72,0x7e,0xa0,0x78,0x83,0xa3,0x79, 0x84,0xa4,0x7b,0x85,0xa4,0x79,0x84,0xa2,0x71,0x77,0x93,0x6f,0x74,0x8e,0x6c,0x72, 0x8d,0x60,0x66,0x83,0x50,0x4a,0x6e,0x6b,0x6f,0x8c,0x5d,0x5e,0x6e,0x2c,0x30,0x3e, 0x2f,0x34,0x43,0x2f,0x33,0x42,0x2c,0x2f,0x3d,0x2e,0x32,0x41,0x36,0x3b,0x4a,0x42, 0x46,0x57,0x4d,0x52,0x65,0x4e,0x55,0x69,0x4a,0x52,0x6a,0x4e,0x55,0x6f,0x4e,0x54, 0x70,0x55,0x5c,0x76,0x6e,0x74,0x8a,0x80,0x86,0x98,0x7d,0x82,0x96,0x7e,0x83,0x96, 0x6e,0x75,0x8b,0x74,0x7b,0x90,0x86,0x8c,0x9d,0x85,0x8b,0x9c,0x97,0x99,0xa9,0xa5, 0xac,0xc1,0xa3,0xab,0xc0,0x91,0x99,0xb2,0x82,0x8a,0xa5,0x5c,0x63,0x7b,0x5a,0x62, 0x7a,0x52,0x5a,0x76,0x50,0x50,0x6d,0x51,0x4f,0x6c,0x51,0x53,0x6f,0x50,0x50,0x6e, 0x53,0x50,0x6c,0x5a,0x52,0x6c,0x5f,0x53,0x6c,0x60,0x53,0x6a,0x5f,0x52,0x69,0x5b, 0x51,0x69,0x69,0x5e,0x73,0x5e,0x54,0x67,0x53,0x48,0x5c,0x52,0x47,0x5b,0x52,0x46, 0x5b,0x51,0x46,0x5a,0x4f,0x44,0x57,0x4f,0x44,0x55,0x50,0x44,0x57,0x46,0x3c,0x4c, 0x43,0x3a,0x49,0x51,0x44,0x55,0x50,0x42,0x53,0x4d,0x40,0x51,0x4d,0x46,0x5a,0x4b, 0x4e,0x69,0x5a,0x62,0x7b,0x5e,0x66,0x7f,0x64,0x6c,0x84,0x68,0x70,0x86,0x68,0x6f, 0x84,0x6a,0x70,0x85,0x6d,0x73,0x87,0x6e,0x74,0x87,0x71,0x76,0x88,0x90,0x94,0xa2, 0xaa,0xa9,0xb7,0x9f,0x9e,0xab,0x8e,0x8e,0x99,0x82,0x81,0x8b,0x6f,0x6e,0x7a,0x71, 0x71,0x7c,0x68,0x68,0x73,0x66,0x66,0x71,0xb5,0xb9,0xc2,0xa3,0xa8,0xb7,0x76,0x7e, 0x96,0x4d,0x50,0x71,0x4b,0x4a,0x6b,0x54,0x4d,0x6e,0x5c,0x51,0x6f,0x5d,0x52,0x70, 0x5d,0x51,0x6e,0x57,0x47,0x61,0x4b,0x3e,0x54,0x5b,0x50,0x6b,0x2a,0x2e,0x3b,0x22, 0x26,0x30,0x21,0x25,0x2f,0x20,0x23,0x2e,0x1f,0x22,0x2c,0x1d,0x20,0x29,0x1a,0x1d, 0x25,0x39,0x37,0x51,0x4c,0x48,0x67,0x57,0x50,0x72,0x59,0x51,0x73,0x5c,0x51,0x73, 0x5d,0x51,0x73,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5c,0x52,0x77,0x5d,0x53,0x78,0x5f, 0x55,0x7b,0x5c,0x54,0x79,0x5b,0x54,0x77,0x56,0x52,0x78,0x58,0x59,0x7e,0x68,0x71, 0x91,0x9c,0x9e,0xad,0x3c,0x3f,0x47,0x3e,0x41,0x49,0x3f,0x42,0x4a,0x3c,0x3e,0x46, 0x37,0x3a,0x41,0x31,0x33,0x3a,0x51,0x48,0x55,0x5a,0x52,0x5c,0x8d,0x93,0xaa,0x5f, 0x69,0x85,0x5a,0x63,0x85,0x58,0x63,0x87,0x54,0x5e,0x85,0x54,0x5e,0x84,0x53,0x5e, 0x84,0x52,0x5d,0x83,0x4f,0x5b,0x82,0x4d,0x59,0x80,0x4c,0x56,0x7c,0x4a,0x53,0x7a, 0x48,0x4c,0x73,0x46,0x47,0x6f,0x48,0x47,0x6b,0x44,0x40,0x5b,0x36,0x2c,0x36,0x46, 0x3a,0x49,0x4f,0x42,0x52,0x51,0x42,0x53,0x54,0x45,0x56,0x55,0x49,0x5c,0x50,0x46, 0x59,0x4b,0x42,0x56,0x40,0x3c,0x4f,0x39,0x38,0x4c,0x36,0x36,0x4a,0x36,0x3a,0x4a, 0x36,0x3a,0x46,0x2e,0x31,0x3b,0x56,0x4d,0x60,0x5a,0x4e,0x62,0x62,0x5b,0x72,0x57, 0x62,0x84,0x56,0x4f,0x72,0x1a,0x1d,0x26,0x20,0x22,0x2d,0x22,0x25,0x2f,0x22,0x26, 0x31,0x22,0x24,0x2f,0x22,0x25,0x2f,0x55,0x4a,0x64,0x7f,0x87,0x9f,0x52,0x56,0x72, 0x19,0x1b,0x23,0x21,0x24,0x2e,0x2c,0x30,0x3b,0x31,0x36,0x42,0x37,0x3c,0x4a,0x42, 0x47,0x55,0x58,0x5e,0x6a,0x77,0x7b,0x85,0x75,0x79,0x84,0x6a,0x6f,0x7b,0x65,0x6a, 0x76,0x57,0x5c,0x6a,0x4b,0x51,0x5f,0x45,0x4a,0x5a,0x43,0x49,0x58,0x42,0x46,0x57, 0x41,0x46,0x57,0x3e,0x43,0x54,0x3a,0x3f,0x50,0x3e,0x43,0x53,0x40,0x45,0x55,0x45, 0x4a,0x59,0x42,0x46,0x56,0x3c,0x41,0x50,0x39,0x3e,0x4d,0x34,0x39,0x48,0x32,0x36, 0x44,0x58,0x58,0x61,0x5f,0x5f,0x65,0x3b,0x3a,0x3f,0x14,0x12,0x17,0x1b,0x1a,0x1d, 0x2e,0x2d,0x31,0x21,0x20,0x23,0x08,0x07,0x09,0x07,0x06,0x08,0x06,0x06,0x07,0x05, 0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x04,0x03,0x05,0x04,0x04,0x06,0x05,0x05, 0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x02,0x02,0x03,0x1a,0x17,0x1f,0x30,0x2b,0x38, 0x0c,0x0a,0x0d,0x02,0x02,0x02,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,0x1f,0x1f,0x20,0xb2,0xb9,0xcc,0x73,0x7e, 0xa1,0x5e,0x6a,0x92,0x5c,0x69,0x90,0x5d,0x69,0x91,0x5e,0x6a,0x92,0x5e,0x6b,0x92, 0x5e,0x6b,0x92,0x5e,0x6b,0x92,0x5f,0x6c,0x93,0x5d,0x6a,0x92,0x74,0x84,0xb5,0x05, 0x06,0x06,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,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,0x02, 0x02,0x02,0x04,0x04,0x04,0x07,0x07,0x07,0x0b,0x0b,0x0c,0x23,0x24,0x26,0x4d,0x4e, 0x52,0x82,0x82,0x86,0x95,0x96,0x9b,0x92,0x93,0x99,0x80,0x82,0x87,0x70,0x72,0x78, 0x70,0x72,0x76,0x80,0x81,0x86,0x85,0x86,0x8b,0x74,0x76,0x7b,0x66,0x68,0x6d,0x5a, 0x5c,0x61,0x4e,0x4f,0x53,0x39,0x3a,0x3d,0x2f,0x30,0x33,0x3b,0x3c,0x40,0x52,0x55, 0x58,0x44,0x46,0x4d,0x47,0x4a,0x50,0x4e,0x50,0x57,0x59,0x5b,0x64,0x66,0x6a,0x72, 0x73,0x76,0x80,0x7c,0x80,0x89,0x82,0x86,0x90,0x8d,0x8f,0x99,0x93,0x96,0x9e,0x88, 0x8b,0x95,0x7e,0x82,0x8e,0x7e,0x82,0x8d,0x81,0x84,0x8e,0x80,0x83,0x8e,0x7b,0x7f, 0x8a,0x79,0x7e,0x8a,0x7f,0x84,0x91,0x8c,0x90,0x9c,0x94,0x98,0xa2,0x9c,0xa0,0xa8, 0x9f,0xa2,0xaa,0xa0,0xa3,0xab,0x9d,0xa0,0xaa,0x9a,0x9d,0xa6,0x98,0x9b,0xa2,0x8f, 0x93,0x9d,0x86,0x8a,0x96,0x7a,0x80,0x8f,0x7b,0x81,0x90,0x81,0x86,0x94,0x82,0x87, 0x96,0x76,0x7d,0x8d,0x6d,0x73,0x86,0x6f,0x76,0x88,0x6e,0x74,0x87,0x70,0x76,0x8a, 0x75,0x7a,0x8d,0x7a,0x80,0x91,0x77,0x7e,0x8f,0x79,0x7e,0x8f,0x80,0x86,0x95,0x85, 0x8a,0x99,0x8a,0x8e,0x9c,0x89,0x8e,0x9d,0x86,0x8c,0x9b,0x82,0x87,0x97,0x7d,0x82, 0x93,0x77,0x7c,0x8e,0x70,0x76,0x86,0x66,0x6c,0x7d,0x5a,0x5e,0x70,0x50,0x53,0x65, 0x3f,0x42,0x56,0x40,0x3a,0x4c,0x41,0x37,0x46,0x39,0x31,0x3f,0x32,0x2c,0x3a,0x2e, 0x29,0x35,0x2d,0x29,0x34,0x2e,0x2a,0x36,0x32,0x2b,0x36,0x39,0x2f,0x3d,0x43,0x39, 0x49,0x47,0x3b,0x4a,0x48,0x3a,0x4a,0x42,0x36,0x42,0x3d,0x32,0x3e,0x42,0x36,0x43, 0x4c,0x3e,0x4e,0x4e,0x45,0x57,0x45,0x44,0x5d,0x45,0x44,0x5d,0x42,0x42,0x5a,0x3f, 0x3e,0x56,0x3e,0x3e,0x53,0x3e,0x3e,0x55,0x65,0x6e,0x8a,0x82,0x89,0xa1,0x88,0x84, 0x98,0x68,0x6a,0x82,0x50,0x57,0x71,0x46,0x4d,0x68,0x42,0x48,0x68,0x44,0x41,0x63, 0x58,0x61,0x80,0xd2,0xd4,0xda,0x1a,0x12,0x16,0x21,0x17,0x1b,0x28,0x1e,0x22,0x34, 0x28,0x2f,0x36,0x29,0x39,0x56,0x55,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x2a, 0x2e,0xb1,0xb8,0xca,0x83,0x8d,0xac,0x53,0x51,0x7d,0x72,0x7d,0x9e,0x71,0x7c,0x9f, 0x72,0x7e,0xa0,0x73,0x7f,0xa0,0x79,0x84,0xa4,0x75,0x7d,0x9d,0x66,0x6c,0x87,0x60, 0x66,0x7f,0x5d,0x62,0x7a,0x57,0x5c,0x72,0x3d,0x39,0x55,0x46,0x49,0x61,0x6e,0x6d, 0x80,0x26,0x23,0x2d,0x24,0x26,0x33,0x26,0x2a,0x36,0x28,0x2b,0x37,0x2c,0x30,0x3e, 0x2e,0x33,0x41,0x2f,0x34,0x42,0x36,0x3b,0x4b,0x3b,0x41,0x52,0x3d,0x42,0x57,0x41, 0x46,0x5c,0x46,0x47,0x61,0x47,0x48,0x62,0x49,0x4f,0x66,0x53,0x59,0x6f,0x51,0x56, 0x6e,0x58,0x5f,0x76,0x55,0x5d,0x76,0x5e,0x67,0x7f,0x6b,0x73,0x89,0x7a,0x80,0x94, 0x8d,0x90,0xa1,0xa1,0xa9,0xbe,0xab,0xb2,0xc6,0x9f,0xa6,0xbd,0x97,0x9f,0xb7,0x71, 0x77,0x8c,0x69,0x71,0x86,0x5f,0x68,0x81,0x5e,0x67,0x81,0x5e,0x66,0x81,0x56,0x5e, 0x7b,0x52,0x58,0x75,0x52,0x50,0x6d,0x55,0x51,0x6c,0x5a,0x52,0x6d,0x5e,0x52,0x6a, 0x5f,0x53,0x6b,0x5e,0x54,0x6d,0x6b,0x62,0x78,0x67,0x5c,0x71,0x60,0x56,0x69,0x54, 0x48,0x5c,0x53,0x47,0x5b,0x51,0x45,0x59,0x50,0x44,0x56,0x4f,0x42,0x54,0x51,0x44, 0x56,0x4c,0x42,0x54,0x48,0x3f,0x51,0x4f,0x44,0x57,0x53,0x46,0x58,0x51,0x44,0x56, 0x4e,0x46,0x5d,0x55,0x5a,0x72,0x65,0x6c,0x81,0x6a,0x72,0x87,0x6a,0x72,0x88,0x6a, 0x72,0x87,0x6a,0x71,0x86,0x6a,0x70,0x85,0x70,0x76,0x8a,0x7a,0x80,0x92,0x7f,0x84, 0x93,0x7b,0x81,0x91,0x97,0x98,0xac,0xa3,0xa3,0xb0,0xa4,0xa4,0xae,0x8c,0x8b,0x96, 0x5e,0x60,0x72,0x6d,0x6e,0x79,0x66,0x66,0x70,0x66,0x65,0x6e,0xb4,0xb7,0xc1,0xa6, 0xab,0xb8,0x7b,0x83,0x9b,0x54,0x55,0x75,0x51,0x4b,0x6b,0x5a,0x4d,0x6c,0x5c,0x4d, 0x6b,0x5e,0x4e,0x6d,0x5c,0x4b,0x65,0x59,0x48,0x61,0x49,0x3a,0x50,0x52,0x45,0x5d, 0x39,0x3f,0x57,0x22,0x26,0x30,0x21,0x24,0x2e,0x20,0x23,0x2e,0x1f,0x22,0x2c,0x1e, 0x20,0x29,0x1b,0x1e,0x26,0x4a,0x4a,0x69,0x55,0x50,0x71,0x57,0x50,0x73,0x59,0x51, 0x73,0x5e,0x54,0x74,0x5d,0x52,0x74,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5c,0x52,0x77, 0x5c,0x52,0x77,0x5d,0x53,0x77,0x5d,0x54,0x78,0x5b,0x54,0x78,0x57,0x54,0x79,0x5d, 0x5e,0x82,0x74,0x7d,0x9a,0xa9,0xac,0xb8,0x45,0x47,0x4f,0x41,0x44,0x4c,0x41,0x44, 0x4c,0x3c,0x3f,0x46,0x37,0x3a,0x41,0x2e,0x30,0x37,0x50,0x47,0x54,0x55,0x4d,0x58, 0x91,0x99,0xad,0x5e,0x67,0x84,0x5b,0x65,0x86,0x58,0x64,0x88,0x53,0x5e,0x85,0x53, 0x5e,0x86,0x53,0x5e,0x87,0x52,0x5c,0x84,0x52,0x5b,0x82,0x4f,0x59,0x80,0x4d,0x56, 0x7f,0x4b,0x54,0x7d,0x48,0x4f,0x73,0x46,0x4b,0x70,0x48,0x48,0x6c,0x48,0x42,0x5e, 0x39,0x2e,0x3a,0x49,0x3c,0x4c,0x52,0x44,0x55,0x53,0x44,0x56,0x56,0x46,0x59,0x56, 0x4a,0x5e,0x54,0x4a,0x5f,0x4b,0x45,0x5b,0x3f,0x3e,0x55,0x3a,0x3b,0x50,0x38,0x3a, 0x4e,0x37,0x3c,0x4c,0x38,0x3d,0x4a,0x33,0x37,0x42,0x40,0x3c,0x4b,0x5a,0x50,0x63, 0x5b,0x50,0x66,0x51,0x5d,0x80,0x58,0x51,0x73,0x22,0x23,0x2f,0x23,0x26,0x32,0x26, 0x29,0x34,0x26,0x2a,0x35,0x25,0x29,0x33,0x25,0x28,0x33,0x68,0x65,0x79,0x71,0x78, 0x8d,0x21,0x24,0x2e,0x22,0x25,0x2f,0x2a,0x2e,0x39,0x2e,0x32,0x3f,0x33,0x38,0x46, 0x3e,0x42,0x50,0x4c,0x51,0x5e,0x60,0x65,0x71,0x5f,0x63,0x71,0x5a,0x5f,0x6d,0x5b, 0x60,0x6e,0x5a,0x5f,0x6e,0x56,0x5c,0x6a,0x50,0x55,0x65,0x46,0x4b,0x5c,0x41,0x46, 0x57,0x3e,0x44,0x55,0x3b,0x42,0x53,0x3c,0x42,0x52,0x3d,0x42,0x52,0x3c,0x42,0x52, 0x40,0x46,0x56,0x4e,0x53,0x62,0x43,0x49,0x5a,0x42,0x47,0x57,0x40,0x45,0x56,0x3a, 0x3e,0x4f,0x32,0x37,0x47,0x29,0x2a,0x3a,0x22,0x22,0x2e,0x18,0x17,0x20,0x13,0x12, 0x18,0x0e,0x0e,0x12,0x10,0x0f,0x12,0x28,0x27,0x2a,0x21,0x20,0x22,0x07,0x06,0x09, 0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x05,0x07,0x05,0x05,0x06,0x1e,0x1b,0x23,0x2a, 0x25,0x32,0x15,0x13,0x1a,0x08,0x08,0x0b,0x10,0x0e,0x13,0x29,0x24,0x30,0x26,0x22, 0x2d,0x0a,0x09,0x0d,0x03,0x02,0x03,0x02,0x02,0x02,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,0xc5, 0xca,0xd6,0x7c,0x88,0xa8,0x60,0x6c,0x93,0x5a,0x66,0x8e,0x5b,0x66,0x8e,0x5c,0x67, 0x90,0x5c,0x69,0x90,0x5d,0x69,0x91,0x5d,0x69,0x91,0x5d,0x69,0x91,0x5c,0x69,0x90, 0x64,0x72,0x9d,0x3e,0x48,0x5e,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,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, 0x02,0x02,0x02,0x02,0x02,0x02,0x05,0x05,0x05,0x08,0x08,0x09,0x0f,0x0f,0x11,0x33, 0x35,0x38,0x54,0x56,0x5a,0x7a,0x7b,0x7f,0x88,0x8a,0x8f,0x84,0x86,0x8d,0x6a,0x6e, 0x74,0x64,0x66,0x6d,0x7c,0x7e,0x81,0x96,0x97,0x9a,0x99,0x9a,0x9e,0x7e,0x7f,0x86, 0x6c,0x6f,0x76,0x6a,0x6d,0x74,0x6a,0x6d,0x74,0x5e,0x5f,0x66,0x4c,0x4e,0x52,0x44, 0x46,0x4b,0x62,0x65,0x69,0x65,0x68,0x6d,0x5b,0x5d,0x62,0x5c,0x5e,0x65,0x62,0x66, 0x6e,0x6f,0x72,0x7d,0x7e,0x82,0x8b,0x82,0x86,0x91,0x83,0x87,0x92,0x81,0x85,0x90, 0x84,0x88,0x92,0x7c,0x80,0x8a,0x77,0x7a,0x86,0x73,0x76,0x81,0x74,0x77,0x82,0x73, 0x77,0x84,0x6c,0x72,0x82,0x6e,0x74,0x86,0x77,0x7d,0x8e,0x86,0x8b,0x98,0x91,0x95, 0xa1,0x9e,0xa1,0xaa,0xa2,0xa6,0xae,0xa3,0xa6,0xaf,0xa2,0xa6,0xae,0xa2,0xa4,0xac, 0x9e,0xa1,0xa9,0x98,0x9c,0xa5,0x94,0x98,0xa2,0x8e,0x93,0x9d,0x90,0x93,0x9e,0x92, 0x96,0xa1,0x8f,0x93,0x9f,0x8c,0x91,0x9d,0x89,0x8e,0x9b,0x81,0x86,0x95,0x77,0x7d, 0x8f,0x71,0x77,0x8a,0x78,0x7e,0x90,0x7d,0x83,0x93,0x7e,0x83,0x94,0x80,0x85,0x95, 0x86,0x8c,0x99,0x8c,0x91,0x9e,0x90,0x95,0xa1,0x8e,0x92,0x9f,0x8a,0x90,0x9e,0x83, 0x8a,0x99,0x7a,0x81,0x92,0x79,0x7f,0x91,0x75,0x7a,0x8c,0x6e,0x74,0x86,0x64,0x6a, 0x7e,0x59,0x5f,0x75,0x4b,0x51,0x66,0x40,0x41,0x57,0x3e,0x3a,0x4e,0x3b,0x36,0x4a, 0x38,0x34,0x47,0x33,0x2e,0x3e,0x32,0x2c,0x38,0x31,0x2b,0x37,0x2f,0x29,0x34,0x2b, 0x25,0x2f,0x2c,0x26,0x2f,0x38,0x2e,0x3b,0x44,0x39,0x49,0x4a,0x3c,0x4b,0x47,0x3a, 0x48,0x43,0x36,0x44,0x42,0x36,0x42,0x4b,0x3e,0x4d,0x4e,0x45,0x5a,0x44,0x43,0x5c, 0x45,0x43,0x5c,0x46,0x42,0x59,0x46,0x41,0x55,0x4b,0x42,0x57,0x54,0x55,0x74,0x65, 0x6d,0x8d,0x62,0x61,0x78,0x52,0x53,0x6c,0x46,0x4d,0x66,0x46,0x4d,0x69,0x42,0x4a, 0x68,0x49,0x43,0x62,0x51,0x5a,0x78,0xa2,0xa6,0xb3,0x3f,0x38,0x3a,0x21,0x17,0x1b, 0x26,0x1b,0x20,0x32,0x26,0x2d,0x38,0x2b,0x3a,0x45,0x45,0x5a,0x14,0x14,0x14,0x00, 0x00,0x00,0x00,0x00,0x00,0x9c,0xa2,0xb3,0x9a,0xa3,0xbd,0x53,0x5e,0x85,0x5f,0x6c, 0x93,0x73,0x7e,0xa0,0x70,0x7b,0x9d,0x73,0x7e,0xa0,0x73,0x7f,0xa1,0x72,0x7c,0x9d, 0x70,0x79,0x99,0x6f,0x75,0x92,0x63,0x68,0x82,0x50,0x55,0x6b,0x37,0x3c,0x52,0x34, 0x34,0x4c,0x5a,0x5b,0x6f,0x3d,0x36,0x41,0x24,0x22,0x2d,0x22,0x25,0x30,0x25,0x29, 0x34,0x2e,0x32,0x40,0x30,0x34,0x43,0x2e,0x32,0x3f,0x2b,0x2f,0x3d,0x2b,0x2f,0x3c, 0x2c,0x30,0x3e,0x31,0x34,0x45,0x36,0x36,0x49,0x3d,0x3c,0x51,0x40,0x3f,0x54,0x42, 0x40,0x56,0x43,0x41,0x58,0x43,0x42,0x58,0x45,0x41,0x59,0x46,0x42,0x5a,0x47,0x46, 0x60,0x56,0x5d,0x73,0x6f,0x73,0x89,0x86,0x8d,0xa5,0xa2,0xa9,0xbe,0xa1,0xa8,0xbe, 0x9b,0xa3,0xba,0x78,0x7d,0x92,0x6e,0x75,0x8a,0x6b,0x73,0x8a,0x71,0x78,0x8e,0x74, 0x7b,0x91,0x6a,0x72,0x89,0x62,0x69,0x82,0x52,0x59,0x76,0x52,0x53,0x71,0x52,0x51, 0x6e,0x58,0x52,0x6c,0x5e,0x52,0x6a,0x5e,0x52,0x6a,0x5e,0x52,0x6a,0x5f,0x53,0x69, 0x70,0x66,0x7a,0x59,0x4e,0x63,0x54,0x47,0x5a,0x51,0x44,0x57,0x50,0x44,0x56,0x4f, 0x43,0x55,0x50,0x44,0x57,0x51,0x46,0x59,0x46,0x3d,0x4e,0x4a,0x40,0x52,0x4f,0x45, 0x57,0x53,0x48,0x5b,0x57,0x4c,0x61,0x4e,0x4b,0x66,0x54,0x5a,0x75,0x6c,0x72,0x87, 0x7e,0x82,0x95,0x6e,0x76,0x8a,0x62,0x6a,0x80,0x68,0x70,0x85,0x7a,0x80,0x92,0x87, 0x8d,0x9a,0x96,0x9a,0xa3,0x82,0x87,0x94,0x74,0x78,0x95,0x91,0x94,0xa7,0xa9,0xa8, 0xb4,0xa2,0xa1,0xaa,0x6b,0x6c,0x7e,0x5a,0x5d,0x6e,0x60,0x60,0x6b,0x5c,0x5b,0x65, 0xad,0xb0,0xb8,0x9d,0xa2,0xb0,0x7c,0x84,0x9b,0x5c,0x5c,0x7b,0x53,0x4c,0x6b,0x5a, 0x4c,0x69,0x5c,0x4c,0x6a,0x5d,0x4a,0x65,0x5c,0x49,0x63,0x59,0x47,0x61,0x4d,0x3d, 0x54,0x48,0x3b,0x50,0x55,0x4e,0x69,0x23,0x25,0x31,0x22,0x25,0x2e,0x22,0x24,0x2e, 0x20,0x23,0x2d,0x1e,0x21,0x2a,0x1c,0x1e,0x26,0x4d,0x4a,0x69,0x56,0x50,0x72,0x57, 0x50,0x73,0x5d,0x54,0x73,0x6a,0x61,0x7f,0x5e,0x54,0x75,0x5e,0x52,0x75,0x5f,0x55, 0x76,0x63,0x59,0x79,0x62,0x59,0x7b,0x62,0x59,0x7d,0x6b,0x63,0x83,0x61,0x59,0x7b, 0x5a,0x56,0x7a,0x62,0x64,0x85,0x78,0x81,0x9d,0xb0,0xb2,0xbd,0x46,0x4a,0x52,0x46, 0x49,0x51,0x42,0x44,0x4d,0x3e,0x41,0x48,0x38,0x3a,0x42,0x2e,0x31,0x37,0x4d,0x45, 0x52,0x50,0x49,0x53,0x95,0x9d,0xb0,0x5e,0x68,0x85,0x5b,0x65,0x86,0x59,0x63,0x87, 0x53,0x5e,0x84,0x53,0x5e,0x86,0x53,0x5e,0x86,0x52,0x5c,0x86,0x51,0x5c,0x83,0x4f, 0x5a,0x81,0x4d,0x57,0x80,0x4b,0x56,0x7c,0x4b,0x51,0x78,0x45,0x4c,0x72,0x49,0x4a, 0x6f,0x49,0x44,0x60,0x3a,0x32,0x3e,0x4b,0x3f,0x4f,0x52,0x44,0x56,0x56,0x46,0x58, 0x58,0x49,0x5b,0x58,0x4c,0x60,0x56,0x4b,0x61,0x49,0x48,0x62,0x46,0x4d,0x64,0x3f, 0x45,0x5a,0x3a,0x3d,0x51,0x36,0x3c,0x4e,0x38,0x3d,0x4a,0x35,0x39,0x45,0x2a,0x2c, 0x36,0x5b,0x50,0x64,0x5b,0x50,0x64,0x52,0x59,0x7c,0x58,0x52,0x74,0x2e,0x2f,0x3f, 0x28,0x2b,0x36,0x2a,0x2e,0x3a,0x2a,0x2e,0x3a,0x2b,0x2f,0x3b,0x2c,0x30,0x3c,0x35, 0x39,0x45,0x2b,0x2f,0x3b,0x2a,0x2e,0x3a,0x2c,0x30,0x3c,0x2e,0x33,0x40,0x32,0x36, 0x44,0x39,0x3e,0x4b,0x41,0x45,0x53,0x4e,0x52,0x61,0x5e,0x62,0x70,0x5c,0x60,0x6f, 0x69,0x6d,0x7b,0x7f,0x82,0x8e,0x73,0x77,0x85,0x5b,0x61,0x6f,0x4f,0x55,0x65,0x46, 0x4c,0x5d,0x41,0x46,0x57,0x3b,0x40,0x51,0x38,0x3d,0x4e,0x37,0x3c,0x4d,0x37,0x3c, 0x4d,0x39,0x3e,0x4f,0x3b,0x41,0x52,0x3e,0x44,0x55,0x3e,0x44,0x55,0x3e,0x43,0x54, 0x49,0x4e,0x5e,0x47,0x4d,0x5c,0x3a,0x40,0x4f,0x2e,0x32,0x41,0x23,0x25,0x32,0x1c, 0x1c,0x26,0x16,0x16,0x1e,0x10,0x0f,0x15,0x0c,0x0b,0x0e,0x19,0x18,0x1a,0x29,0x28, 0x2b,0x0d,0x0c,0x0f,0x07,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x3d,0x35,0x47, 0x07,0x07,0x0a,0x17,0x16,0x1c,0x30,0x2b,0x38,0x36,0x30,0x3f,0x32,0x2d,0x3b,0x18, 0x16,0x1e,0x06,0x05,0x07,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,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,0x77,0x79,0x7e,0x88,0x92,0xb0,0x5f,0x6c,0x93,0x58,0x65,0x8d,0x5a, 0x65,0x8d,0x5a,0x65,0x8d,0x5a,0x66,0x8e,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x5b,0x66, 0x8e,0x5b,0x66,0x8e,0x5d,0x69,0x93,0x81,0x92,0xcd,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,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,0x02,0x02,0x02,0x03,0x03,0x03,0x05,0x05,0x06,0x0a,0x0a,0x0a, 0x18,0x19,0x1a,0x3f,0x41,0x45,0x50,0x52,0x57,0x5a,0x5b,0x62,0x67,0x69,0x71,0x6a, 0x6d,0x76,0x54,0x56,0x5f,0x5c,0x5e,0x65,0x7a,0x7a,0x7e,0x90,0x90,0x93,0x93,0x93, 0x96,0x7d,0x7f,0x86,0x6e,0x72,0x7c,0x6f,0x72,0x7e,0x71,0x74,0x7e,0x71,0x74,0x7d, 0x77,0x7a,0x80,0x74,0x76,0x7e,0x6d,0x6f,0x76,0x66,0x67,0x6d,0x62,0x64,0x6a,0x68, 0x6a,0x70,0x73,0x76,0x7f,0x7f,0x83,0x8d,0x82,0x86,0x91,0x82,0x86,0x8f,0x82,0x86, 0x8e,0x7d,0x80,0x89,0x78,0x7c,0x86,0x72,0x74,0x7f,0x6f,0x72,0x7c,0x6e,0x6e,0x7a, 0x6a,0x6c,0x79,0x5b,0x5f,0x70,0x52,0x59,0x6f,0x50,0x58,0x6e,0x5b,0x62,0x78,0x6e, 0x73,0x86,0x82,0x86,0x95,0x95,0x99,0xa2,0x9f,0xa2,0xab,0xa3,0xa6,0xaf,0xa3,0xa6, 0xaf,0xa2,0xa5,0xae,0x9f,0xa2,0xab,0x9a,0x9d,0xa6,0x96,0x9a,0xa3,0x97,0x9a,0xa4, 0x99,0x9c,0xa6,0x96,0x99,0xa3,0x93,0x98,0xa2,0x92,0x96,0xa2,0x8c,0x91,0x9e,0x84, 0x8a,0x99,0x79,0x7e,0x91,0x75,0x7b,0x8e,0x76,0x7d,0x8e,0x7e,0x84,0x94,0x81,0x86, 0x96,0x88,0x8c,0x9a,0x95,0x99,0xa3,0x98,0x9b,0xa6,0x90,0x93,0x9f,0x87,0x8c,0x99, 0x83,0x88,0x96,0x7a,0x7f,0x8e,0x72,0x78,0x8a,0x70,0x76,0x8a,0x6e,0x75,0x8a,0x70, 0x76,0x8a,0x69,0x71,0x86,0x62,0x6a,0x81,0x5c,0x64,0x7c,0x5c,0x62,0x7a,0x4f,0x54, 0x6b,0x43,0x47,0x5c,0x3d,0x3e,0x53,0x40,0x3e,0x54,0x4c,0x48,0x5d,0x51,0x47,0x56, 0x3b,0x36,0x47,0x3f,0x3c,0x4a,0x42,0x3d,0x4a,0x3a,0x36,0x41,0x39,0x33,0x3d,0x33, 0x29,0x33,0x3a,0x2f,0x3b,0x3f,0x33,0x40,0x3f,0x33,0x3f,0x40,0x33,0x3f,0x51,0x43, 0x54,0x44,0x43,0x5b,0x4a,0x50,0x69,0x47,0x49,0x62,0x44,0x42,0x58,0x43,0x42,0x5a, 0x54,0x5d,0x7c,0x57,0x60,0x81,0x53,0x54,0x71,0x48,0x49,0x64,0x3f,0x45,0x5f,0x3f, 0x45,0x5f,0x42,0x4b,0x67,0x51,0x44,0x60,0x49,0x52,0x73,0x8d,0x93,0xa4,0x60,0x5d, 0x5e,0x1d,0x14,0x18,0x26,0x1b,0x20,0x2a,0x1f,0x26,0x4c,0x3b,0x4a,0x3c,0x3e,0x54, 0x3a,0x3a,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x69,0x74,0xa9,0xb0,0xc6,0x60, 0x6c,0x92,0x53,0x5e,0x88,0x74,0x7f,0xa1,0x70,0x7b,0x9e,0x70,0x7b,0x9e,0x71,0x7c, 0x9f,0x70,0x7b,0x9d,0x6e,0x78,0x9a,0x6b,0x76,0x96,0x67,0x6f,0x90,0x63,0x69,0x85, 0x51,0x55,0x6f,0x41,0x3b,0x58,0x54,0x57,0x70,0x58,0x55,0x62,0x1a,0x18,0x1f,0x19, 0x1b,0x22,0x20,0x23,0x2c,0x29,0x2c,0x39,0x2c,0x31,0x3e,0x2d,0x32,0x3f,0x2d,0x31, 0x3e,0x24,0x27,0x31,0x21,0x24,0x2c,0x22,0x26,0x30,0x27,0x29,0x35,0x2e,0x2e,0x3d, 0x2d,0x2c,0x3b,0x31,0x30,0x40,0x3c,0x39,0x4d,0x45,0x3f,0x54,0x4a,0x41,0x54,0x4b, 0x41,0x54,0x4a,0x41,0x55,0x44,0x40,0x57,0x48,0x47,0x5e,0x54,0x58,0x75,0x7a,0x80, 0x9a,0x82,0x8a,0xa1,0x7f,0x87,0xa1,0x66,0x6b,0x84,0x58,0x5e,0x78,0x65,0x6d,0x82, 0x6e,0x76,0x8a,0x6e,0x76,0x8c,0x69,0x71,0x87,0x66,0x6e,0x86,0x60,0x68,0x81,0x68, 0x70,0x86,0x66,0x6e,0x85,0x4f,0x51,0x6e,0x55,0x4f,0x6a,0x59,0x50,0x69,0x5b,0x52, 0x6a,0x59,0x52,0x6c,0x60,0x5e,0x77,0x7a,0x71,0x84,0x75,0x6b,0x7b,0x5e,0x52,0x65, 0x53,0x47,0x5b,0x52,0x46,0x59,0x53,0x47,0x5c,0x53,0x49,0x5d,0x46,0x3d,0x4e,0x4d, 0x43,0x56,0x48,0x3f,0x50,0x53,0x47,0x5b,0x55,0x4a,0x5d,0x5d,0x52,0x69,0x4e,0x4c, 0x69,0x5a,0x62,0x79,0x6b,0x72,0x86,0x67,0x6f,0x85,0x5b,0x63,0x7d,0x64,0x6b,0x82, 0x76,0x7d,0x8f,0x8e,0x93,0xa0,0xa5,0xa7,0xae,0x92,0x96,0xa0,0x74,0x77,0x93,0x71, 0x74,0x8f,0xa0,0xa0,0xaf,0xaa,0xa9,0xb1,0x85,0x84,0x91,0x57,0x58,0x68,0x55,0x56, 0x60,0x58,0x57,0x5f,0xa9,0xad,0xb5,0x93,0x99,0xa8,0x74,0x7c,0x95,0x61,0x61,0x80, 0x57,0x4f,0x6e,0x5a,0x4c,0x67,0x5c,0x48,0x63,0x5c,0x49,0x63,0x59,0x45,0x5e,0x57, 0x46,0x5e,0x51,0x42,0x5a,0x43,0x37,0x4b,0x56,0x4a,0x64,0x31,0x36,0x48,0x22,0x25, 0x2f,0x22,0x25,0x2f,0x20,0x23,0x2d,0x1e,0x20,0x29,0x1c,0x1e,0x26,0x4b,0x49,0x66, 0x56,0x50,0x72,0x57,0x50,0x73,0x5a,0x51,0x73,0x5e,0x53,0x74,0x5d,0x52,0x74,0x61, 0x56,0x77,0x69,0x5e,0x7e,0x70,0x69,0x87,0x71,0x69,0x88,0x78,0x71,0x8e,0x7a,0x73, 0x90,0x6b,0x64,0x84,0x61,0x5e,0x7f,0x6c,0x6d,0x8d,0x79,0x82,0x9d,0xa7,0xa9,0xb6, 0x51,0x54,0x5b,0x4e,0x52,0x59,0x42,0x46,0x4e,0x40,0x43,0x4b,0x3a,0x3c,0x44,0x31, 0x33,0x3a,0x4d,0x46,0x53,0x4c,0x45,0x4f,0x9b,0xa1,0xb2,0x5f,0x68,0x85,0x5a,0x65, 0x85,0x59,0x64,0x88,0x54,0x5e,0x85,0x53,0x5d,0x86,0x53,0x5e,0x85,0x53,0x5e,0x86, 0x52,0x5d,0x83,0x4e,0x5a,0x81,0x4e,0x58,0x80,0x4c,0x56,0x7d,0x4b,0x55,0x79,0x46, 0x4d,0x73,0x49,0x4a,0x6e,0x47,0x43,0x5d,0x3c,0x32,0x3e,0x4b,0x40,0x50,0x52,0x46, 0x58,0x58,0x48,0x5a,0x59,0x49,0x5c,0x59,0x4a,0x5e,0x56,0x4b,0x60,0x4a,0x49,0x62, 0x4b,0x52,0x6a,0x4d,0x53,0x69,0x3e,0x43,0x59,0x39,0x3e,0x51,0x3a,0x3f,0x4e,0x38, 0x3c,0x4a,0x2e,0x31,0x3e,0x59,0x51,0x65,0x5c,0x52,0x67,0x55,0x56,0x75,0x59,0x56, 0x78,0x3e,0x40,0x54,0x2e,0x32,0x3e,0x2f,0x33,0x41,0x32,0x36,0x43,0x32,0x36,0x43, 0x34,0x38,0x45,0x33,0x37,0x45,0x2f,0x33,0x42,0x30,0x35,0x42,0x32,0x36,0x43,0x32, 0x37,0x46,0x37,0x3c,0x4a,0x3b,0x40,0x4e,0x42,0x46,0x56,0x4d,0x52,0x61,0x62,0x67, 0x75,0x96,0x99,0xa3,0xaa,0xad,0xb5,0xa8,0xab,0xb3,0x74,0x7a,0x87,0x5b,0x61,0x71, 0x4a,0x50,0x61,0x42,0x47,0x58,0x3d,0x42,0x53,0x36,0x3b,0x4c,0x32,0x37,0x47,0x2f, 0x34,0x45,0x30,0x35,0x46,0x32,0x36,0x47,0x34,0x39,0x4a,0x35,0x3a,0x4b,0x36,0x3a, 0x4b,0x36,0x3b,0x4c,0x3e,0x43,0x53,0x4a,0x4f,0x5e,0x4b,0x50,0x5e,0x3e,0x43,0x51, 0x2b,0x2f,0x3c,0x1e,0x20,0x2a,0x18,0x18,0x21,0x13,0x13,0x1a,0x0f,0x0e,0x14,0x0b, 0x0b,0x0e,0x1e,0x1e,0x21,0x28,0x27,0x2a,0x19,0x19,0x1b,0x0a,0x0b,0x0e,0x11,0x11, 0x17,0x38,0x32,0x42,0x0d,0x0e,0x12,0x0f,0x11,0x15,0x3f,0x38,0x49,0x33,0x2f,0x3d, 0x3f,0x38,0x4a,0x0a,0x0a,0x0d,0x07,0x06,0x0a,0x06,0x06,0x08,0x04,0x04,0x06,0x03, 0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02,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,0x27,0x28,0x28,0x96,0xa0,0xb9,0x5f,0x6c,0x93, 0x57,0x63,0x8c,0x57,0x63,0x8c,0x57,0x64,0x8c,0x58,0x65,0x8d,0x58,0x64,0x8d,0x5a, 0x65,0x8d,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x58,0x64,0x8d,0x67,0x77,0xa6,0x2b,0x31, 0x37,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,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,0x02,0x02,0x02,0x03,0x03,0x03,0x05,0x05, 0x06,0x0a,0x0a,0x0a,0x22,0x23,0x26,0x46,0x47,0x4b,0x4d,0x4f,0x55,0x4a,0x4b,0x52, 0x5a,0x5d,0x65,0x61,0x63,0x6c,0x4e,0x51,0x5a,0x53,0x56,0x5d,0x69,0x6b,0x72,0x76, 0x78,0x7e,0x75,0x77,0x7e,0x74,0x77,0x81,0x71,0x75,0x7f,0x75,0x78,0x83,0x73,0x77, 0x83,0x75,0x7a,0x86,0x7f,0x82,0x8e,0x81,0x84,0x8d,0x7a,0x7e,0x86,0x6b,0x6e,0x76, 0x66,0x68,0x6e,0x7b,0x7e,0x85,0x87,0x8a,0x95,0x87,0x8b,0x97,0x85,0x89,0x95,0x7f, 0x82,0x8c,0x72,0x74,0x7e,0x6e,0x71,0x7b,0x6d,0x6e,0x7a,0x66,0x69,0x74,0x63,0x66, 0x73,0x5e,0x62,0x72,0x57,0x5b,0x6e,0x46,0x47,0x60,0x4a,0x47,0x61,0x4e,0x4a,0x62, 0x4b,0x49,0x63,0x51,0x56,0x6f,0x6c,0x71,0x84,0x88,0x8c,0x98,0x94,0x97,0xa0,0x9b, 0x9e,0xa6,0x9f,0xa3,0xac,0xa1,0xa3,0xad,0x9b,0x9f,0xa9,0x94,0x98,0xa2,0x96,0x9a, 0xa3,0x9d,0x9f,0xa9,0x9b,0x9e,0xa8,0x97,0x9b,0xa6,0x94,0x98,0xa4,0x92,0x96,0xa2, 0x8e,0x92,0x9f,0x88,0x8e,0x9d,0x81,0x87,0x97,0x7c,0x82,0x94,0x7c,0x82,0x94,0x7e, 0x83,0x94,0x82,0x88,0x96,0x8d,0x92,0x9e,0x9e,0xa2,0xaa,0x9a,0x9c,0xa4,0x89,0x8d, 0x98,0x80,0x84,0x93,0x78,0x7c,0x8d,0x6e,0x74,0x86,0x60,0x66,0x7c,0x5a,0x60,0x76, 0x5a,0x62,0x79,0x68,0x70,0x86,0x6a,0x72,0x88,0x69,0x71,0x87,0x66,0x6e,0x86,0x68, 0x70,0x87,0x70,0x78,0x8b,0x63,0x6a,0x7f,0x4b,0x52,0x68,0x51,0x56,0x6e,0x4e,0x4c, 0x69,0x55,0x4e,0x64,0x53,0x48,0x56,0x40,0x34,0x41,0x3b,0x33,0x42,0x3b,0x33,0x43, 0x37,0x31,0x3f,0x34,0x2b,0x37,0x2e,0x28,0x35,0x47,0x3f,0x4a,0x3d,0x33,0x3f,0x41, 0x35,0x41,0x4a,0x3b,0x4b,0x43,0x42,0x5a,0x5a,0x61,0x74,0x5b,0x62,0x76,0x46,0x4d, 0x65,0x44,0x45,0x5e,0x59,0x61,0x7d,0x5a,0x64,0x82,0x4e,0x50,0x6d,0x3e,0x3e,0x5a, 0x3b,0x40,0x5b,0x3e,0x45,0x60,0x40,0x48,0x63,0x49,0x41,0x5f,0x47,0x45,0x6a,0x8a, 0x90,0xa5,0x7d,0x79,0x7d,0x1c,0x14,0x17,0x27,0x1c,0x22,0x29,0x1e,0x23,0x3c,0x2d, 0x37,0x43,0x40,0x5c,0x56,0x55,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x2c,0x30, 0xaf,0xb7,0xca,0x7a,0x84,0xa4,0x53,0x56,0x7f,0x6b,0x78,0x9b,0x6c,0x79,0x9a,0x6b, 0x76,0x9b,0x6c,0x79,0x9b,0x6f,0x7a,0x9c,0x6f,0x7a,0x9b,0x6b,0x76,0x97,0x67,0x71, 0x93,0x63,0x6d,0x8c,0x5e,0x67,0x86,0x4a,0x46,0x6a,0x4b,0x54,0x74,0x6d,0x72,0x88, 0x10,0x12,0x16,0x12,0x13,0x19,0x17,0x19,0x21,0x1f,0x22,0x2d,0x27,0x2a,0x38,0x2d, 0x32,0x42,0x31,0x36,0x48,0x2a,0x2e,0x3c,0x25,0x28,0x34,0x24,0x28,0x33,0x28,0x2c, 0x39,0x32,0x33,0x46,0x2e,0x2d,0x3e,0x2c,0x2a,0x38,0x2e,0x29,0x35,0x33,0x2b,0x37, 0x42,0x37,0x46,0x4b,0x3d,0x4d,0x47,0x39,0x47,0x3b,0x31,0x3d,0x3f,0x33,0x40,0x4c, 0x3e,0x4e,0x63,0x5b,0x70,0x6c,0x63,0x7a,0x71,0x66,0x7d,0x62,0x55,0x69,0x50,0x46, 0x5a,0x47,0x45,0x5e,0x48,0x49,0x62,0x4a,0x4d,0x67,0x4b,0x50,0x6b,0x54,0x5b,0x75, 0x64,0x6c,0x82,0x69,0x70,0x84,0x67,0x6f,0x85,0x4f,0x57,0x72,0x4e,0x4c,0x67,0x50, 0x4d,0x67,0x56,0x4e,0x67,0x53,0x4e,0x6a,0x51,0x4f,0x6d,0x5e,0x52,0x6b,0x61,0x55, 0x6a,0x70,0x65,0x76,0x63,0x57,0x6b,0x59,0x4d,0x62,0x57,0x4c,0x61,0x56,0x4a,0x60, 0x53,0x4a,0x60,0x55,0x4a,0x61,0x50,0x46,0x5a,0x43,0x3b,0x4b,0x4f,0x46,0x59,0x55, 0x4c,0x63,0x52,0x52,0x6f,0x5e,0x66,0x7f,0x69,0x6f,0x86,0x6d,0x74,0x8a,0x65,0x6d, 0x84,0x66,0x6e,0x84,0x71,0x77,0x8a,0x8a,0x8e,0x9c,0xa9,0xaa,0xb0,0x9b,0x9e,0xa5, 0x83,0x85,0x9b,0x73,0x77,0x8f,0x90,0x92,0xa3,0x9f,0x9f,0xa8,0x8a,0x89,0x94,0x63, 0x62,0x6f,0x4d,0x4c,0x58,0x4f,0x4e,0x56,0xab,0xae,0xb7,0x92,0x97,0xa7,0x73,0x7c, 0x94,0x65,0x64,0x80,0x5d,0x52,0x6e,0x5a,0x48,0x63,0x5b,0x47,0x5f,0x5b,0x47,0x61, 0x58,0x45,0x5e,0x54,0x43,0x5b,0x53,0x42,0x59,0x46,0x38,0x4b,0x4b,0x3f,0x54,0x47, 0x45,0x5f,0x20,0x23,0x2c,0x22,0x25,0x2e,0x20,0x23,0x2d,0x1e,0x21,0x2a,0x1d,0x1f, 0x27,0x49,0x48,0x65,0x56,0x51,0x73,0x57,0x50,0x73,0x58,0x51,0x73,0x5a,0x52,0x74, 0x64,0x5a,0x7a,0x6a,0x61,0x7f,0x67,0x5d,0x7d,0x68,0x61,0x81,0x6d,0x66,0x85,0x7e, 0x78,0x93,0x82,0x7c,0x97,0x7e,0x78,0x93,0x70,0x6d,0x8b,0x74,0x76,0x92,0x7a,0x83, 0x9d,0xa1,0xa4,0xb3,0x53,0x56,0x5e,0x4f,0x52,0x5a,0x46,0x49,0x51,0x49,0x4c,0x53, 0x4a,0x4d,0x54,0x3a,0x3d,0x43,0x4b,0x45,0x51,0x4b,0x42,0x4e,0x9f,0xa5,0xb4,0x62, 0x6c,0x88,0x5b,0x64,0x84,0x5c,0x66,0x89,0x57,0x62,0x88,0x54,0x60,0x87,0x52,0x5e, 0x85,0x52,0x5d,0x86,0x52,0x5d,0x84,0x4f,0x5b,0x82,0x4e,0x5a,0x81,0x4c,0x57,0x7f, 0x4b,0x55,0x7a,0x47,0x51,0x78,0x48,0x4b,0x6e,0x44,0x41,0x5d,0x39,0x2e,0x3a,0x4a, 0x3e,0x4f,0x54,0x46,0x5a,0x59,0x49,0x5b,0x5a,0x4a,0x5c,0x5a,0x4c,0x60,0x58,0x4c, 0x62,0x52,0x4a,0x62,0x47,0x46,0x60,0x44,0x46,0x5e,0x42,0x42,0x5a,0x3c,0x3e,0x53, 0x37,0x3c,0x50,0x35,0x3a,0x4a,0x32,0x36,0x43,0x44,0x42,0x52,0x5b,0x53,0x68,0x59, 0x56,0x73,0x60,0x5d,0x7e,0x52,0x53,0x6e,0x36,0x3a,0x47,0x37,0x3b,0x49,0x3a,0x3e, 0x4c,0x3a,0x3e,0x4d,0x3a,0x3f,0x4d,0x38,0x3d,0x4a,0x37,0x3c,0x4a,0x37,0x3c,0x4a, 0x36,0x3c,0x4a,0x38,0x3d,0x4b,0x38,0x3e,0x4c,0x3d,0x42,0x51,0x42,0x48,0x57,0x4b, 0x51,0x61,0x5e,0x64,0x72,0x73,0x77,0x85,0x6b,0x70,0x7e,0x5e,0x63,0x72,0x54,0x5a, 0x6a,0x4d,0x52,0x63,0x46,0x4c,0x5c,0x3f,0x46,0x56,0x3a,0x3e,0x50,0x33,0x38,0x4a, 0x31,0x34,0x45,0x30,0x31,0x42,0x30,0x30,0x41,0x2f,0x30,0x41,0x2e,0x33,0x43,0x30, 0x35,0x45,0x34,0x39,0x49,0x3d,0x42,0x51,0x48,0x4d,0x5b,0x55,0x5a,0x69,0x52,0x56, 0x65,0x46,0x4b,0x59,0x36,0x3b,0x49,0x26,0x2a,0x36,0x1e,0x20,0x2a,0x19,0x1b,0x24, 0x16,0x18,0x1f,0x0f,0x0f,0x14,0x0c,0x0b,0x10,0x17,0x17,0x1b,0x2a,0x2b,0x2e,0x46, 0x46,0x4c,0x31,0x2d,0x3b,0x2a,0x27,0x31,0x2b,0x2a,0x33,0x3c,0x37,0x46,0x23,0x25, 0x2a,0x1a,0x1c,0x22,0x15,0x16,0x1e,0x0e,0x0e,0x12,0x0a,0x0a,0x0d,0x07,0x08,0x0a, 0x06,0x06,0x08,0x04,0x05,0x06,0x02,0x03,0x04,0x02,0x02,0x02,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,0x04,0x04,0x04,0xa8,0xb0, 0xc6,0x60,0x6c,0x93,0x54,0x60,0x8a,0x55,0x60,0x8a,0x56,0x62,0x8b,0x57,0x63,0x8c, 0x57,0x64,0x8c,0x58,0x64,0x8c,0x58,0x64,0x8c,0x58,0x65,0x8d,0x58,0x64,0x8d,0x5d, 0x6a,0x95,0x83,0x96,0xd4,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,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,0x02,0x02,0x02,0x03, 0x03,0x03,0x06,0x06,0x07,0x0a,0x0a,0x0b,0x22,0x23,0x26,0x3e,0x40,0x44,0x40,0x42, 0x46,0x3a,0x3a,0x3f,0x5a,0x5b,0x61,0x6c,0x6e,0x76,0x5e,0x61,0x69,0x52,0x56,0x5f, 0x5b,0x5e,0x66,0x5a,0x5e,0x69,0x5d,0x61,0x6e,0x64,0x68,0x74,0x6b,0x6f,0x7a,0x6d, 0x71,0x7c,0x70,0x74,0x80,0x7a,0x7e,0x8a,0x82,0x86,0x92,0x84,0x87,0x92,0x85,0x88, 0x92,0x80,0x82,0x8c,0x7a,0x7e,0x86,0x85,0x88,0x91,0x8b,0x8f,0x9b,0x88,0x8c,0x99, 0x82,0x85,0x91,0x76,0x79,0x83,0x62,0x66,0x73,0x58,0x5c,0x6c,0x52,0x56,0x66,0x4a, 0x4f,0x63,0x45,0x47,0x5f,0x46,0x45,0x5d,0x47,0x46,0x5f,0x4f,0x4a,0x62,0x57,0x4c, 0x62,0x58,0x4b,0x60,0x58,0x4c,0x63,0x49,0x47,0x61,0x55,0x5b,0x74,0x76,0x7b,0x8a, 0x8a,0x8e,0x99,0x92,0x95,0x9e,0x98,0x9a,0xa4,0x9b,0x9e,0xa9,0x93,0x98,0xa4,0x91, 0x96,0xa2,0x90,0x94,0xa0,0x97,0x9a,0xa6,0x97,0x9a,0xa6,0x96,0x9a,0xa5,0x92,0x96, 0xa2,0x91,0x96,0xa2,0x8f,0x94,0xa2,0x8d,0x91,0x9f,0x8b,0x90,0x9e,0x86,0x8b,0x9c, 0x7f,0x84,0x95,0x7b,0x81,0x92,0x7d,0x81,0x91,0x85,0x8a,0x96,0x8f,0x92,0x9e,0x8a, 0x8e,0x99,0x7d,0x82,0x91,0x6e,0x74,0x87,0x63,0x6a,0x7e,0x51,0x57,0x70,0x47,0x49, 0x62,0x45,0x43,0x5a,0x45,0x43,0x5a,0x48,0x4c,0x65,0x5d,0x64,0x7e,0x6c,0x74,0x8b, 0x6e,0x75,0x8b,0x6b,0x73,0x8a,0x76,0x7d,0x91,0x70,0x76,0x8b,0x58,0x5f,0x76,0x5d, 0x64,0x7f,0x50,0x53,0x71,0x57,0x4f,0x67,0x53,0x4c,0x5e,0x55,0x4a,0x57,0x41,0x35, 0x43,0x3d,0x32,0x3f,0x35,0x2d,0x38,0x31,0x27,0x33,0x2d,0x23,0x2e,0x2e,0x28,0x33, 0x49,0x41,0x48,0x3a,0x2f,0x3b,0x44,0x38,0x46,0x44,0x3e,0x50,0x45,0x4b,0x60,0x54, 0x5a,0x6d,0x4a,0x50,0x66,0x42,0x42,0x5a,0x4b,0x4a,0x67,0x55,0x5e,0x80,0x4e,0x50, 0x6c,0x43,0x42,0x5b,0x3a,0x40,0x5b,0x3d,0x45,0x60,0x43,0x4a,0x66,0x40,0x3e,0x5d, 0x52,0x45,0x5f,0x7b,0x83,0x9e,0xab,0xa9,0xaa,0x19,0x11,0x14,0x26,0x1b,0x20,0x28, 0x1e,0x22,0x31,0x24,0x2c,0x61,0x4f,0x63,0x56,0x57,0x63,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0xa0,0xa7,0xb8,0x95,0x9f,0xb9,0x55,0x60,0x88,0x60,0x6d,0x92, 0x6a,0x75,0x9a,0x6a,0x75,0x98,0x6a,0x75,0x99,0x6a,0x75,0x9a,0x6a,0x76,0x98,0x69, 0x74,0x95,0x67,0x73,0x93,0x63,0x6c,0x8e,0x63,0x6d,0x8b,0x4c,0x57,0x79,0x48,0x47, 0x6b,0x62,0x6a,0x87,0x3b,0x3b,0x43,0x14,0x13,0x1a,0x19,0x19,0x21,0x23,0x22,0x2f, 0x23,0x22,0x30,0x33,0x32,0x45,0x32,0x32,0x43,0x30,0x30,0x41,0x34,0x34,0x47,0x30, 0x30,0x42,0x31,0x31,0x42,0x39,0x38,0x4c,0x3e,0x3b,0x4f,0x46,0x3d,0x4f,0x44,0x3b, 0x4b,0x3c,0x33,0x3f,0x2f,0x27,0x32,0x31,0x29,0x33,0x2f,0x25,0x30,0x23,0x1b,0x22, 0x21,0x19,0x1f,0x22,0x19,0x1f,0x2e,0x28,0x31,0x2f,0x2b,0x32,0x33,0x2f,0x35,0x31, 0x29,0x31,0x33,0x26,0x2f,0x4b,0x3c,0x4d,0x50,0x44,0x56,0x4e,0x44,0x56,0x4d,0x42, 0x57,0x45,0x43,0x5b,0x46,0x47,0x61,0x4a,0x4e,0x68,0x4b,0x50,0x6b,0x4b,0x4c,0x67, 0x4c,0x4a,0x66,0x4f,0x4b,0x65,0x51,0x4b,0x64,0x58,0x4d,0x64,0x5a,0x4f,0x66,0x5c, 0x51,0x68,0x5e,0x52,0x68,0x66,0x5b,0x70,0x75,0x6b,0x7f,0x5d,0x51,0x69,0x58,0x4e, 0x67,0x55,0x4d,0x66,0x52,0x4c,0x65,0x51,0x4d,0x66,0x55,0x4d,0x66,0x55,0x4b,0x61, 0x57,0x4d,0x64,0x50,0x47,0x5d,0x58,0x52,0x6e,0x52,0x53,0x70,0x5b,0x63,0x7e,0x6a, 0x72,0x88,0x6c,0x74,0x8a,0x72,0x78,0x8c,0x7a,0x7f,0x91,0x8a,0x8e,0x9a,0xa7,0xaa, 0xae,0xa1,0xa2,0xa7,0x93,0x95,0xa4,0x7f,0x81,0x95,0x84,0x86,0x97,0x8a,0x8b,0x99, 0x7b,0x7b,0x88,0x6d,0x6c,0x77,0x52,0x4f,0x5a,0x49,0x46,0x4f,0xac,0xaf,0xb9,0x93, 0x99,0xa9,0x71,0x7a,0x92,0x69,0x67,0x83,0x6a,0x5e,0x77,0x5f,0x4f,0x68,0x59,0x45, 0x5f,0x5b,0x47,0x61,0x57,0x44,0x5c,0x54,0x41,0x59,0x52,0x41,0x58,0x48,0x38,0x4d, 0x41,0x34,0x47,0x55,0x47,0x61,0x22,0x24,0x2f,0x21,0x24,0x2e,0x20,0x23,0x2d,0x1f, 0x22,0x2b,0x1c,0x1f,0x27,0x47,0x45,0x62,0x56,0x51,0x73,0x57,0x50,0x73,0x58,0x51, 0x73,0x5d,0x53,0x73,0x65,0x5b,0x79,0x63,0x59,0x79,0x5f,0x55,0x75,0x5a,0x51,0x72, 0x53,0x4c,0x6c,0x68,0x62,0x7e,0x77,0x70,0x8c,0x7e,0x79,0x93,0x7e,0x7c,0x95,0x79, 0x79,0x94,0x7b,0x83,0x9d,0x99,0x9e,0xaf,0x56,0x59,0x60,0x58,0x5a,0x62,0x50,0x53, 0x5b,0x4e,0x51,0x58,0x4d,0x4f,0x56,0x3b,0x3e,0x44,0x4a,0x44,0x51,0x4f,0x46,0x53, 0xa0,0xa6,0xb5,0x6c,0x75,0x8f,0x69,0x71,0x8e,0x6a,0x74,0x94,0x63,0x6e,0x90,0x59, 0x63,0x89,0x53,0x5e,0x85,0x52,0x5d,0x85,0x51,0x5b,0x84,0x52,0x5d,0x84,0x4f,0x5b, 0x82,0x4d,0x58,0x80,0x4a,0x55,0x7b,0x49,0x52,0x78,0x46,0x4b,0x6e,0x40,0x41,0x5e, 0x33,0x2c,0x37,0x4a,0x3e,0x4f,0x55,0x48,0x5a,0x5a,0x4d,0x61,0x5c,0x51,0x67,0x5a, 0x50,0x69,0x58,0x4e,0x66,0x51,0x4a,0x63,0x4a,0x49,0x62,0x47,0x46,0x5f,0x46,0x45, 0x5e,0x46,0x45,0x5e,0x42,0x40,0x58,0x3a,0x3a,0x4f,0x33,0x36,0x49,0x2f,0x33,0x42, 0x3e,0x3e,0x4d,0x5d,0x59,0x73,0x61,0x61,0x7f,0x5c,0x5e,0x7b,0x3c,0x40,0x4e,0x3d, 0x41,0x4f,0x3e,0x43,0x51,0x40,0x45,0x53,0x3f,0x44,0x52,0x3b,0x41,0x4f,0x3b,0x40, 0x4e,0x39,0x3e,0x4d,0x39,0x3e,0x4d,0x3b,0x40,0x4f,0x3c,0x40,0x50,0x3c,0x42,0x52, 0x44,0x4a,0x5a,0x51,0x56,0x66,0x68,0x6e,0x7c,0x6a,0x6e,0x7e,0x62,0x67,0x76,0x5a, 0x60,0x70,0x52,0x58,0x69,0x4a,0x50,0x5f,0x41,0x46,0x58,0x3a,0x3f,0x52,0x35,0x39, 0x4b,0x35,0x36,0x49,0x35,0x34,0x46,0x37,0x35,0x46,0x38,0x34,0x45,0x32,0x30,0x42, 0x2e,0x2e,0x3f,0x31,0x36,0x46,0x3f,0x44,0x52,0x4e,0x52,0x61,0x59,0x5e,0x6c,0x5e, 0x62,0x6f,0x51,0x56,0x63,0x43,0x49,0x56,0x3c,0x41,0x4f,0x30,0x34,0x41,0x23,0x26, 0x32,0x1f,0x22,0x2c,0x1b,0x1e,0x27,0x13,0x14,0x1b,0x0f,0x0f,0x14,0x0f,0x10,0x16, 0x12,0x13,0x19,0x1a,0x1c,0x22,0x2e,0x2e,0x35,0x32,0x32,0x3c,0x54,0x50,0x5e,0x75, 0x76,0x7b,0x53,0x56,0x5c,0x2e,0x31,0x38,0x21,0x23,0x2b,0x13,0x15,0x1b,0x0b,0x0b, 0x0f,0x09,0x0a,0x0c,0x06,0x07,0x0a,0x05,0x05,0x06,0x02,0x03,0x04,0x02,0x02,0x02, 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,0x74,0x78,0x82,0x67,0x73,0x99,0x54,0x60,0x8a,0x54,0x5f,0x89,0x55,0x60, 0x8a,0x55,0x62,0x8b,0x55,0x62,0x8a,0x57,0x63,0x8c,0x56,0x62,0x8b,0x57,0x63,0x8c, 0x57,0x63,0x8c,0x58,0x64,0x8d,0x73,0x83,0xb9,0x12,0x15,0x15,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,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, 0x02,0x02,0x02,0x04,0x04,0x04,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x16,0x16,0x17,0x29, 0x2a,0x2d,0x34,0x36,0x39,0x39,0x3a,0x3e,0x52,0x54,0x57,0x7c,0x7e,0x82,0x7e,0x7f, 0x83,0x5a,0x5c,0x62,0x54,0x56,0x5e,0x52,0x56,0x60,0x58,0x5c,0x68,0x5e,0x62,0x6e, 0x5d,0x60,0x6b,0x5f,0x63,0x6e,0x6a,0x6e,0x7a,0x7f,0x84,0x8f,0x88,0x8b,0x97,0x87, 0x8a,0x96,0x8a,0x8e,0x99,0x89,0x8d,0x96,0x8a,0x8e,0x98,0x8c,0x90,0x9c,0x8a,0x8e, 0x9b,0x84,0x87,0x93,0x7a,0x7c,0x87,0x60,0x64,0x74,0x4d,0x51,0x65,0x41,0x46,0x59, 0x3e,0x3d,0x52,0x42,0x3e,0x53,0x4d,0x42,0x56,0x4a,0x41,0x53,0x4c,0x42,0x55,0x4d, 0x45,0x5a,0x56,0x4c,0x62,0x5a,0x4d,0x62,0x58,0x4a,0x5d,0x48,0x40,0x53,0x43,0x42, 0x5b,0x58,0x5e,0x73,0x74,0x7a,0x8b,0x89,0x8c,0x99,0x8e,0x92,0x9d,0x90,0x94,0xa1, 0x8c,0x90,0x9e,0x8a,0x8f,0x9d,0x8a,0x8e,0x9c,0x8d,0x92,0x9f,0x90,0x95,0xa2,0x8e, 0x92,0xa1,0x8b,0x90,0x9e,0x8a,0x90,0x9e,0x8b,0x91,0x9e,0x87,0x8c,0x9a,0x85,0x8a, 0x98,0x80,0x85,0x94,0x76,0x7a,0x8b,0x6b,0x70,0x82,0x66,0x6a,0x7e,0x66,0x6c,0x80, 0x68,0x6e,0x7e,0x62,0x66,0x76,0x52,0x56,0x6a,0x44,0x49,0x5e,0x40,0x41,0x57,0x41, 0x3e,0x55,0x46,0x40,0x54,0x46,0x3f,0x53,0x45,0x3f,0x53,0x43,0x3f,0x55,0x42,0x42, 0x59,0x5a,0x62,0x7b,0x72,0x7a,0x8e,0x7c,0x82,0x96,0x77,0x7e,0x91,0x76,0x7d,0x8f, 0x5e,0x66,0x7a,0x5f,0x67,0x82,0x52,0x54,0x73,0x52,0x4e,0x6a,0x4e,0x43,0x5b,0x56, 0x50,0x62,0x56,0x4a,0x58,0x40,0x33,0x40,0x39,0x2f,0x3b,0x35,0x2c,0x36,0x2f,0x26, 0x30,0x2d,0x23,0x2d,0x2b,0x29,0x33,0x3d,0x37,0x3c,0x33,0x2a,0x35,0x34,0x2e,0x3b, 0x2f,0x2e,0x3f,0x34,0x38,0x4a,0x38,0x3d,0x51,0x31,0x31,0x42,0x40,0x46,0x5d,0x61, 0x6a,0x89,0x67,0x6a,0x85,0x5f,0x5b,0x71,0x46,0x4c,0x66,0x3f,0x47,0x63,0x43,0x4d, 0x6b,0x42,0x4a,0x6c,0x54,0x41,0x59,0x63,0x6d,0x8d,0xd3,0xd2,0xd3,0x19,0x11,0x14, 0x25,0x1a,0x1f,0x2a,0x1f,0x24,0x2a,0x1f,0x25,0x46,0x36,0x42,0x47,0x4c,0x65,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x6d,0x78,0xa7,0xaf,0xc5,0x63,0x6f, 0x94,0x56,0x61,0x89,0x6e,0x7a,0x9e,0x66,0x72,0x96,0x68,0x74,0x98,0x68,0x73,0x97, 0x69,0x75,0x99,0x69,0x73,0x97,0x69,0x74,0x96,0x63,0x6d,0x8e,0x5b,0x66,0x87,0x55, 0x5c,0x7d,0x4e,0x49,0x69,0x59,0x5b,0x7a,0x61,0x5e,0x6d,0x20,0x1a,0x22,0x21,0x1c, 0x23,0x24,0x20,0x2a,0x30,0x2c,0x3c,0x38,0x36,0x49,0x3a,0x39,0x4e,0x3a,0x39,0x4c, 0x36,0x35,0x48,0x3b,0x38,0x4b,0x44,0x40,0x56,0x46,0x42,0x57,0x46,0x42,0x57,0x49, 0x41,0x54,0x4a,0x41,0x52,0x4e,0x43,0x55,0x4e,0x42,0x54,0x4f,0x42,0x54,0x4d,0x3f, 0x50,0x40,0x33,0x40,0x30,0x25,0x2d,0x25,0x1b,0x21,0x29,0x24,0x2e,0x30,0x2b,0x33, 0x35,0x30,0x37,0x32,0x2c,0x34,0x1a,0x12,0x16,0x29,0x1f,0x26,0x3d,0x31,0x3b,0x4a, 0x3c,0x4a,0x4e,0x3f,0x50,0x50,0x42,0x52,0x50,0x42,0x52,0x4f,0x40,0x50,0x53,0x45, 0x57,0x54,0x48,0x5c,0x55,0x4a,0x5f,0x56,0x4b,0x5f,0x57,0x4a,0x5d,0x56,0x46,0x58, 0x56,0x46,0x57,0x5b,0x4f,0x65,0x5c,0x50,0x65,0x5f,0x53,0x6a,0x6b,0x66,0x7d,0x66, 0x63,0x7c,0x57,0x52,0x6d,0x52,0x4e,0x68,0x4f,0x4c,0x67,0x4e,0x4d,0x68,0x4f,0x4c, 0x67,0x53,0x4e,0x68,0x58,0x50,0x6b,0x4a,0x43,0x59,0x57,0x4e,0x66,0x59,0x52,0x6d, 0x52,0x52,0x6f,0x62,0x6a,0x83,0x72,0x79,0x8e,0x76,0x7d,0x90,0x7e,0x84,0x95,0x8d, 0x92,0x9e,0xa3,0xa5,0xab,0xa4,0xa6,0xaa,0x9c,0x9e,0xaa,0x8c,0x8c,0x9a,0x7e,0x80, 0x91,0x6a,0x6d,0x81,0x6a,0x6c,0x7e,0x68,0x68,0x77,0x66,0x63,0x6d,0x5b,0x58,0x5f, 0xb7,0xb8,0xc0,0x97,0x9e,0xad,0x6d,0x76,0x8f,0x65,0x64,0x80,0x6c,0x5f,0x77,0x60, 0x4d,0x65,0x59,0x45,0x5e,0x58,0x44,0x5d,0x55,0x41,0x5b,0x52,0x3f,0x56,0x4e,0x3d, 0x53,0x4b,0x3b,0x51,0x3f,0x32,0x45,0x4c,0x3f,0x55,0x31,0x34,0x48,0x20,0x23,0x2d, 0x21,0x23,0x2d,0x1f,0x22,0x2a,0x1d,0x20,0x27,0x49,0x47,0x62,0x55,0x51,0x73,0x57, 0x50,0x73,0x59,0x51,0x73,0x5c,0x52,0x72,0x5d,0x53,0x74,0x5d,0x54,0x74,0x5b,0x51, 0x72,0x59,0x4b,0x68,0x47,0x3d,0x57,0x4f,0x49,0x67,0x61,0x5c,0x77,0x73,0x6d,0x87, 0x81,0x7e,0x96,0x7d,0x7c,0x94,0x7c,0x80,0x99,0x99,0x9e,0xae,0x5b,0x5e,0x66,0x66, 0x68,0x6f,0x5f,0x62,0x6a,0x4e,0x50,0x58,0x3f,0x42,0x4a,0x38,0x3a,0x42,0x50,0x4c, 0x57,0x5e,0x56,0x62,0xa5,0xa9,0xb7,0x7c,0x83,0x9b,0x76,0x7f,0x98,0x77,0x7f,0x9b, 0x71,0x79,0x98,0x65,0x6e,0x8f,0x57,0x60,0x84,0x53,0x5d,0x83,0x50,0x5c,0x85,0x52, 0x5c,0x84,0x4f,0x5b,0x81,0x4e,0x58,0x80,0x4d,0x58,0x7f,0x49,0x53,0x79,0x46,0x4c, 0x73,0x43,0x46,0x63,0x31,0x2a,0x36,0x4a,0x3e,0x4e,0x56,0x4a,0x5c,0x5b,0x50,0x66, 0x50,0x4e,0x6b,0x50,0x52,0x6e,0x4e,0x4e,0x6a,0x4d,0x4e,0x6a,0x4c,0x50,0x6b,0x4c, 0x4c,0x68,0x4c,0x4a,0x65,0x50,0x4b,0x65,0x4b,0x49,0x62,0x44,0x42,0x5a,0x3d,0x3c, 0x52,0x36,0x3a,0x4e,0x35,0x3a,0x48,0x4b,0x50,0x65,0x61,0x61,0x80,0x5c,0x5e,0x7a, 0x3c,0x42,0x50,0x3e,0x42,0x52,0x3f,0x44,0x52,0x40,0x45,0x54,0x3f,0x44,0x52,0x3e, 0x43,0x52,0x3c,0x41,0x50,0x3c,0x40,0x50,0x3f,0x44,0x53,0x40,0x45,0x54,0x42,0x46, 0x56,0x42,0x48,0x59,0x4d,0x52,0x63,0x5a,0x60,0x6f,0x67,0x6d,0x7b,0x62,0x68,0x78, 0x5c,0x62,0x72,0x57,0x5c,0x6d,0x49,0x4e,0x5f,0x41,0x46,0x58,0x3b,0x42,0x53,0x37, 0x39,0x4c,0x39,0x37,0x4b,0x3a,0x38,0x4b,0x3c,0x37,0x4a,0x3c,0x36,0x48,0x3b,0x36, 0x46,0x3a,0x34,0x44,0x32,0x31,0x42,0x32,0x36,0x47,0x46,0x4c,0x5b,0x55,0x5a,0x69, 0x5b,0x61,0x6f,0x59,0x5e,0x6d,0x49,0x4e,0x5b,0x3e,0x43,0x52,0x3c,0x41,0x4f,0x36, 0x3b,0x48,0x2d,0x31,0x3c,0x22,0x26,0x30,0x1d,0x1f,0x29,0x21,0x22,0x2a,0x13,0x15, 0x1c,0x1f,0x21,0x27,0x32,0x33,0x39,0x2d,0x2e,0x35,0x54,0x56,0x5b,0x5c,0x5c,0x65, 0x77,0x75,0x7f,0x90,0x92,0x96,0x7e,0x7f,0x86,0x49,0x4b,0x54,0x2e,0x31,0x3a,0x1e, 0x20,0x26,0x0e,0x0f,0x14,0x09,0x0a,0x0d,0x07,0x08,0x0a,0x04,0x05,0x06,0x02,0x02, 0x03,0x02,0x02,0x02,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,0x2e,0x2f,0x31,0x75,0x81,0xa2,0x54,0x60,0x8a,0x53, 0x5e,0x88,0x54,0x60,0x8a,0x54,0x5f,0x89,0x55,0x60,0x8a,0x55,0x62,0x8a,0x56,0x62, 0x8b,0x56,0x62,0x8b,0x56,0x62,0x8b,0x56,0x63,0x8b,0x61,0x6e,0x9d,0x67,0x76,0xa1, 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,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,0x02,0x02,0x02,0x03,0x03,0x03,0x06,0x06,0x06,0x0a,0x0a,0x0a, 0x0f,0x0f,0x10,0x16,0x16,0x17,0x21,0x22,0x23,0x31,0x32,0x36,0x57,0x59,0x5c,0x8b, 0x8b,0x8e,0x89,0x8a,0x8b,0x61,0x61,0x63,0x54,0x56,0x5a,0x49,0x4c,0x54,0x53,0x57, 0x60,0x57,0x5a,0x63,0x4f,0x52,0x5a,0x58,0x5b,0x65,0x66,0x69,0x74,0x76,0x7a,0x86, 0x81,0x84,0x90,0x8a,0x8e,0x97,0x8f,0x92,0x9d,0x8e,0x92,0x9c,0x92,0x95,0x9f,0x8f, 0x93,0x9e,0x89,0x8d,0x98,0x81,0x83,0x8e,0x72,0x76,0x83,0x4b,0x51,0x67,0x3f,0x3d, 0x52,0x3f,0x3a,0x4b,0x40,0x3b,0x4f,0x4a,0x42,0x57,0x49,0x42,0x59,0x54,0x4a,0x61, 0x52,0x50,0x6c,0x51,0x4f,0x6c,0x52,0x50,0x6e,0x4d,0x4c,0x67,0x47,0x44,0x5a,0x4e, 0x47,0x5e,0x4f,0x4d,0x69,0x49,0x4a,0x65,0x50,0x57,0x6e,0x72,0x79,0x8e,0x82,0x88, 0x98,0x86,0x8b,0x9b,0x81,0x86,0x97,0x82,0x88,0x98,0x82,0x87,0x98,0x89,0x8e,0x9d, 0x88,0x8e,0x9d,0x83,0x8a,0x9a,0x7d,0x82,0x93,0x7c,0x82,0x92,0x7b,0x80,0x8f,0x7a, 0x7e,0x8e,0x79,0x7e,0x8d,0x75,0x7a,0x8a,0x6b,0x71,0x83,0x5c,0x62,0x79,0x47,0x47, 0x60,0x44,0x42,0x5a,0x44,0x42,0x5a,0x42,0x40,0x57,0x3f,0x3d,0x52,0x3a,0x38,0x4a, 0x3c,0x38,0x4a,0x41,0x3c,0x4e,0x41,0x3c,0x4f,0x3c,0x38,0x4a,0x38,0x36,0x47,0x3c, 0x39,0x4e,0x41,0x3e,0x56,0x46,0x46,0x5f,0x5f,0x67,0x80,0x7e,0x84,0x96,0x8e,0x93, 0xa0,0x8c,0x91,0x9e,0x76,0x7a,0x8b,0x71,0x79,0x92,0x50,0x58,0x77,0x4d,0x4c,0x6c, 0x56,0x4c,0x66,0x4e,0x46,0x61,0x61,0x5c,0x6f,0x4f,0x42,0x51,0x40,0x35,0x43,0x34, 0x2d,0x3a,0x31,0x2b,0x38,0x30,0x28,0x32,0x2c,0x24,0x2d,0x2e,0x2d,0x36,0x27,0x22, 0x24,0x28,0x21,0x29,0x22,0x1e,0x27,0x22,0x20,0x2b,0x25,0x24,0x31,0x29,0x28,0x36, 0x34,0x37,0x49,0x5a,0x62,0x7d,0x61,0x65,0x80,0x6e,0x69,0x7e,0x4e,0x55,0x6f,0x40, 0x47,0x64,0x44,0x4c,0x6b,0x49,0x54,0x75,0x53,0x3f,0x58,0x56,0x60,0x85,0xe4,0xe6, 0xe8,0x2b,0x23,0x25,0x24,0x19,0x1e,0x2b,0x20,0x26,0x29,0x1e,0x24,0x34,0x27,0x2f, 0x75,0x61,0x7a,0x11,0x12,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x30,0x35,0xab, 0xb3,0xc8,0x76,0x81,0xa2,0x53,0x56,0x7f,0x6c,0x77,0x9b,0x64,0x70,0x95,0x65,0x72, 0x96,0x65,0x71,0x96,0x66,0x72,0x97,0x68,0x73,0x98,0x67,0x71,0x95,0x60,0x6b,0x8c, 0x5d,0x65,0x84,0x5b,0x5e,0x7c,0x4e,0x47,0x67,0x4e,0x4f,0x6e,0x6b,0x6b,0x81,0x24, 0x1e,0x25,0x21,0x1b,0x22,0x25,0x20,0x29,0x2f,0x2a,0x38,0x32,0x2f,0x3f,0x37,0x34, 0x46,0x3c,0x3a,0x4e,0x43,0x3e,0x53,0x4b,0x42,0x56,0x4e,0x45,0x58,0x4e,0x45,0x58, 0x4d,0x43,0x57,0x48,0x3e,0x4f,0x49,0x3d,0x4d,0x4e,0x41,0x52,0x52,0x45,0x57,0x52, 0x46,0x58,0x53,0x46,0x59,0x54,0x48,0x5b,0x55,0x46,0x59,0x51,0x43,0x52,0x4a,0x3d, 0x4c,0x48,0x41,0x4c,0x47,0x41,0x4b,0x4f,0x47,0x53,0x3b,0x2e,0x38,0x43,0x35,0x42, 0x49,0x3b,0x4a,0x4b,0x3c,0x4b,0x50,0x41,0x52,0x4c,0x3e,0x4e,0x45,0x36,0x43,0x32, 0x26,0x2f,0x42,0x34,0x42,0x4f,0x41,0x50,0x52,0x42,0x54,0x52,0x43,0x54,0x52,0x42, 0x53,0x4f,0x41,0x50,0x52,0x42,0x53,0x5b,0x4b,0x5e,0x5c,0x4c,0x5f,0x5b,0x50,0x66, 0x52,0x50,0x6d,0x63,0x61,0x7b,0x6b,0x69,0x82,0x5d,0x5b,0x75,0x52,0x50,0x6d,0x50, 0x4f,0x6b,0x50,0x51,0x6d,0x51,0x50,0x6e,0x52,0x51,0x6d,0x54,0x4f,0x6a,0x4f,0x47, 0x5f,0x5b,0x51,0x69,0x57,0x52,0x6d,0x52,0x53,0x71,0x5d,0x65,0x7f,0x5d,0x65,0x7f, 0x60,0x69,0x82,0x73,0x7a,0x8d,0xa0,0xa2,0xaa,0xab,0xad,0xb1,0xa5,0xa6,0xaf,0xa2, 0xa1,0xaa,0x8e,0x8e,0x99,0x83,0x85,0x94,0x78,0x7a,0x8c,0x84,0x85,0x92,0x8b,0x8a, 0x90,0x7e,0x7b,0x80,0xc9,0xcb,0xcf,0xa1,0xa5,0xb3,0x6c,0x73,0x8e,0x5a,0x57,0x75, 0x63,0x56,0x70,0x5d,0x4a,0x62,0x57,0x43,0x5b,0x57,0x41,0x5b,0x52,0x3f,0x57,0x4d, 0x3a,0x51,0x4d,0x3c,0x52,0x4a,0x3a,0x50,0x38,0x2c,0x3c,0x42,0x36,0x4a,0x4a,0x47, 0x62,0x20,0x23,0x2d,0x21,0x24,0x2d,0x1f,0x22,0x2a,0x1e,0x21,0x29,0x45,0x43,0x5c, 0x55,0x52,0x73,0x58,0x51,0x73,0x5b,0x51,0x71,0x5b,0x51,0x71,0x5d,0x53,0x73,0x5a, 0x51,0x72,0x5e,0x51,0x71,0x56,0x49,0x67,0x40,0x38,0x4f,0x47,0x3e,0x57,0x4c,0x46, 0x63,0x68,0x62,0x7d,0x7b,0x78,0x8f,0x84,0x82,0x99,0x80,0x83,0x9b,0x98,0x9e,0xaf, 0x5e,0x61,0x68,0x59,0x5c,0x64,0x51,0x54,0x5d,0x47,0x4a,0x53,0x3f,0x42,0x4a,0x41, 0x43,0x4a,0x65,0x63,0x6d,0x71,0x6b,0x76,0x9c,0xa1,0xb0,0x79,0x81,0x97,0x6f,0x77, 0x91,0x6d,0x76,0x93,0x6e,0x76,0x95,0x6e,0x77,0x95,0x61,0x6a,0x8c,0x57,0x61,0x86, 0x55,0x5f,0x85,0x56,0x61,0x86,0x56,0x60,0x87,0x52,0x5d,0x82,0x4e,0x58,0x7f,0x4c, 0x56,0x7b,0x48,0x52,0x76,0x46,0x49,0x65,0x33,0x2a,0x36,0x4b,0x3f,0x50,0x56,0x49, 0x5c,0x56,0x4e,0x68,0x51,0x55,0x72,0x58,0x61,0x7a,0x52,0x5a,0x76,0x52,0x5a,0x74, 0x53,0x5b,0x76,0x51,0x59,0x74,0x4e,0x4e,0x6a,0x52,0x4e,0x68,0x51,0x4c,0x66,0x4a, 0x49,0x63,0x45,0x43,0x5c,0x3e,0x3f,0x55,0x3a,0x40,0x52,0x3b,0x41,0x51,0x42,0x46, 0x56,0x3d,0x42,0x51,0x3d,0x42,0x51,0x3e,0x42,0x52,0x40,0x45,0x54,0x3e,0x42,0x52, 0x3e,0x42,0x52,0x41,0x46,0x55,0x3e,0x42,0x53,0x40,0x45,0x54,0x46,0x4a,0x59,0x47, 0x4c,0x5b,0x4a,0x4f,0x5f,0x54,0x5a,0x69,0x67,0x6c,0x7b,0x6e,0x72,0x81,0x70,0x74, 0x83,0x6a,0x6f,0x7e,0x5e,0x64,0x73,0x53,0x58,0x69,0x44,0x4a,0x5a,0x3d,0x42,0x53, 0x37,0x39,0x4d,0x39,0x38,0x4c,0x3b,0x38,0x4b,0x3b,0x37,0x4a,0x3b,0x36,0x48,0x3b, 0x36,0x46,0x3a,0x34,0x44,0x3a,0x33,0x42,0x38,0x33,0x44,0x36,0x36,0x49,0x43,0x4a, 0x5c,0x4e,0x54,0x65,0x4e,0x55,0x66,0x44,0x4a,0x5c,0x37,0x3d,0x4e,0x36,0x3b,0x49, 0x35,0x39,0x47,0x36,0x3a,0x47,0x35,0x39,0x46,0x2e,0x32,0x3e,0x26,0x2a,0x35,0x1e, 0x20,0x2a,0x4e,0x50,0x57,0x73,0x74,0x7a,0x56,0x58,0x5e,0x31,0x34,0x3d,0x4f,0x52, 0x5a,0x6b,0x6e,0x74,0x80,0x82,0x89,0x74,0x76,0x7c,0x4c,0x4e,0x56,0x2b,0x2e,0x36, 0x2a,0x2e,0x34,0x25,0x27,0x2e,0x13,0x15,0x1a,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x04, 0x04,0x06,0x02,0x02,0x02,0x02,0x02,0x02,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,0x07,0x07,0x07,0x92,0x9b,0xb5, 0x5a,0x66,0x8e,0x52,0x5d,0x86,0x53,0x5e,0x88,0x53,0x5e,0x89,0x54,0x5f,0x89,0x55, 0x60,0x8a,0x54,0x60,0x8a,0x55,0x62,0x8b,0x55,0x60,0x8a,0x55,0x60,0x8a,0x59,0x65, 0x90,0x7b,0x8b,0xc9,0x04,0x05,0x05,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,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,0x02,0x02,0x02,0x03,0x03,0x03,0x05,0x05, 0x06,0x07,0x08,0x08,0x0c,0x0d,0x0e,0x12,0x12,0x14,0x18,0x19,0x1a,0x25,0x26,0x28, 0x45,0x46,0x49,0x6e,0x6f,0x72,0x71,0x72,0x74,0x62,0x62,0x65,0x64,0x66,0x68,0x4f, 0x51,0x56,0x50,0x52,0x56,0x4f,0x51,0x56,0x46,0x49,0x50,0x4d,0x50,0x5a,0x55,0x59, 0x66,0x62,0x66,0x73,0x6f,0x73,0x7e,0x81,0x85,0x90,0x8b,0x90,0x9a,0x94,0x97,0xa1, 0x96,0x9a,0xa3,0x94,0x96,0x9e,0x8d,0x8f,0x97,0x84,0x87,0x91,0x61,0x66,0x79,0x40, 0x3e,0x53,0x3e,0x39,0x4b,0x42,0x3e,0x50,0x4b,0x47,0x5e,0x4d,0x48,0x60,0x55,0x4c, 0x63,0x5e,0x53,0x6c,0x52,0x51,0x6e,0x52,0x51,0x6e,0x52,0x54,0x71,0x49,0x4b,0x66, 0x3e,0x3e,0x56,0x4b,0x47,0x5f,0x56,0x51,0x6d,0x52,0x50,0x6e,0x47,0x46,0x60,0x54, 0x5c,0x75,0x71,0x78,0x8d,0x77,0x7e,0x91,0x7a,0x81,0x93,0x7c,0x82,0x95,0x7e,0x84, 0x96,0x81,0x86,0x98,0x79,0x7f,0x92,0x73,0x7a,0x8c,0x6e,0x74,0x86,0x6e,0x74,0x87, 0x71,0x76,0x88,0x6e,0x74,0x86,0x6e,0x74,0x86,0x6a,0x6f,0x83,0x5c,0x62,0x77,0x50, 0x55,0x6c,0x42,0x42,0x58,0x42,0x3e,0x52,0x45,0x3d,0x4e,0x45,0x3d,0x4f,0x46,0x3e, 0x51,0x54,0x4b,0x62,0x56,0x4f,0x6a,0x52,0x50,0x6d,0x52,0x52,0x6f,0x50,0x53,0x70, 0x4e,0x54,0x70,0x4f,0x56,0x70,0x4e,0x54,0x6e,0x4e,0x54,0x6f,0x58,0x60,0x7a,0x76, 0x7c,0x8e,0x85,0x8a,0x97,0x8e,0x92,0x9e,0x95,0x99,0xa3,0x90,0x97,0xac,0x58,0x5e, 0x7e,0x55,0x50,0x6e,0x4f,0x4d,0x6d,0x57,0x4e,0x69,0x4d,0x49,0x67,0x69,0x62,0x73, 0x49,0x3c,0x4b,0x36,0x30,0x3e,0x31,0x2d,0x3a,0x2d,0x28,0x35,0x2a,0x24,0x2e,0x24, 0x21,0x2b,0x36,0x35,0x3a,0x1a,0x15,0x18,0x20,0x1a,0x21,0x22,0x1e,0x26,0x2f,0x2a, 0x35,0x37,0x31,0x3e,0x2f,0x2e,0x40,0x4e,0x55,0x70,0x4a,0x4b,0x66,0x52,0x4b,0x62, 0x45,0x4a,0x68,0x4a,0x52,0x70,0x49,0x52,0x72,0x4c,0x57,0x7a,0x58,0x43,0x5b,0x4d, 0x4d,0x75,0xd3,0xd6,0xde,0x52,0x4c,0x4f,0x24,0x1a,0x1f,0x2b,0x1f,0x26,0x2a,0x1e, 0x24,0x2f,0x23,0x2a,0x68,0x54,0x68,0x28,0x2a,0x31,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0x02,0xa4,0xaa,0xbc,0x90,0x99,0xb4,0x53,0x58,0x81,0x5f,0x6c,0x92,0x68, 0x73,0x98,0x62,0x6d,0x93,0x66,0x72,0x97,0x63,0x70,0x95,0x65,0x72,0x96,0x64,0x71, 0x95,0x61,0x6d,0x8f,0x5f,0x66,0x86,0x5c,0x5f,0x7d,0x4f,0x51,0x70,0x4d,0x45,0x65, 0x5e,0x5f,0x7a,0x44,0x3f,0x49,0x26,0x1f,0x27,0x2b,0x26,0x2e,0x33,0x2e,0x3b,0x36, 0x32,0x42,0x39,0x35,0x47,0x40,0x3a,0x4c,0x44,0x3a,0x4b,0x46,0x3a,0x4a,0x46,0x3a, 0x4a,0x46,0x3a,0x4a,0x42,0x38,0x46,0x3e,0x33,0x40,0x40,0x34,0x42,0x49,0x3c,0x4b, 0x4e,0x42,0x52,0x4e,0x43,0x56,0x4e,0x46,0x5b,0x4b,0x46,0x5e,0x4d,0x48,0x60,0x52, 0x4b,0x61,0x5a,0x4d,0x64,0x70,0x67,0x7b,0x6d,0x65,0x78,0x6e,0x67,0x7a,0x4f,0x44, 0x54,0x4a,0x3f,0x50,0x4f,0x44,0x56,0x54,0x49,0x5d,0x42,0x3b,0x4c,0x45,0x3c,0x4e, 0x47,0x3c,0x4c,0x40,0x34,0x40,0x43,0x36,0x43,0x4b,0x3c,0x4b,0x4a,0x3d,0x4b,0x51, 0x42,0x52,0x52,0x44,0x55,0x4e,0x3e,0x4e,0x56,0x46,0x58,0x5d,0x51,0x68,0x5d,0x50, 0x66,0x5b,0x4b,0x5e,0x5b,0x4f,0x66,0x5c,0x4f,0x65,0x61,0x58,0x6f,0x67,0x66,0x7f, 0x6d,0x6d,0x85,0x6f,0x6f,0x87,0x63,0x65,0x7f,0x5e,0x5f,0x7a,0x56,0x55,0x72,0x55, 0x51,0x6d,0x4c,0x46,0x5e,0x57,0x51,0x6c,0x56,0x52,0x6d,0x53,0x51,0x6d,0x52,0x51, 0x6e,0x52,0x51,0x6e,0x51,0x54,0x72,0x69,0x70,0x86,0x9f,0xa2,0xaa,0xb3,0xb4,0xb7, 0xb5,0xb6,0xbb,0xb7,0xb4,0xba,0xb0,0xae,0xb3,0xa8,0xa6,0xae,0xa6,0xa5,0xac,0xa4, 0xa3,0xab,0xa6,0xa4,0xa8,0x9b,0x98,0x9c,0xd0,0xd1,0xd6,0xae,0xb2,0xbc,0x72,0x79, 0x92,0x5e,0x5c,0x79,0x61,0x55,0x6d,0x5f,0x4c,0x64,0x57,0x43,0x5b,0x57,0x41,0x5a, 0x52,0x3e,0x56,0x4d,0x3a,0x51,0x4d,0x3b,0x52,0x49,0x3a,0x50,0x3b,0x2d,0x41,0x3a, 0x2e,0x40,0x5c,0x4e,0x68,0x2c,0x30,0x3a,0x21,0x24,0x2d,0x20,0x23,0x2c,0x1e,0x20, 0x28,0x44,0x42,0x5b,0x56,0x51,0x72,0x58,0x51,0x73,0x58,0x51,0x73,0x5c,0x52,0x72, 0x5d,0x53,0x73,0x5a,0x51,0x72,0x5d,0x51,0x71,0x5a,0x4e,0x6d,0x51,0x46,0x61,0x43, 0x3c,0x54,0x4c,0x43,0x5e,0x63,0x5d,0x79,0x82,0x80,0x96,0x88,0x87,0x9c,0x85,0x86, 0x9e,0x98,0x9e,0xaf,0x5d,0x60,0x69,0x5e,0x62,0x6a,0x61,0x63,0x6b,0x5a,0x5e,0x66, 0x52,0x56,0x5e,0x56,0x58,0x5f,0x78,0x77,0x7e,0x7d,0x77,0x81,0x90,0x94,0xa4,0x77, 0x7f,0x95,0x6d,0x75,0x8d,0x66,0x6e,0x8b,0x68,0x71,0x8f,0x77,0x7e,0x9a,0x77,0x7f, 0x9b,0x69,0x72,0x92,0x61,0x6b,0x8d,0x65,0x6e,0x8f,0x61,0x6c,0x8e,0x5d,0x68,0x8a, 0x59,0x63,0x87,0x56,0x5f,0x82,0x51,0x5b,0x7c,0x44,0x4b,0x6b,0x31,0x2d,0x3a,0x4a, 0x41,0x52,0x56,0x4b,0x60,0x4e,0x4d,0x69,0x57,0x60,0x7b,0x65,0x6e,0x85,0x5d,0x66, 0x7e,0x4f,0x56,0x72,0x50,0x57,0x72,0x53,0x5a,0x76,0x50,0x55,0x72,0x50,0x4e,0x6a, 0x52,0x4e,0x68,0x4e,0x4c,0x66,0x49,0x48,0x62,0x43,0x43,0x5b,0x3e,0x43,0x59,0x3e, 0x43,0x56,0x42,0x47,0x56,0x40,0x45,0x55,0x3f,0x44,0x54,0x3f,0x44,0x54,0x40,0x46, 0x55,0x42,0x47,0x56,0x41,0x46,0x56,0x42,0x47,0x57,0x4a,0x4f,0x5e,0x56,0x5a,0x68, 0x61,0x65,0x70,0x64,0x68,0x73,0x6a,0x6e,0x7a,0x6f,0x74,0x82,0x6e,0x73,0x82,0x6b, 0x71,0x80,0x67,0x6e,0x7c,0x5e,0x64,0x74,0x52,0x57,0x67,0x45,0x4b,0x5c,0x3d,0x42, 0x53,0x36,0x3b,0x4d,0x35,0x35,0x48,0x3a,0x37,0x4a,0x3b,0x37,0x49,0x38,0x35,0x46, 0x33,0x31,0x42,0x32,0x30,0x40,0x37,0x32,0x42,0x38,0x32,0x42,0x37,0x32,0x42,0x36, 0x34,0x46,0x38,0x39,0x4d,0x3a,0x40,0x54,0x39,0x3b,0x50,0x36,0x36,0x4a,0x31,0x30, 0x42,0x2a,0x2d,0x3b,0x2a,0x2e,0x3b,0x2e,0x32,0x3e,0x38,0x3d,0x49,0x40,0x44,0x50, 0x3a,0x3f,0x4a,0x31,0x34,0x3f,0x46,0x49,0x52,0x51,0x53,0x5a,0x30,0x34,0x3e,0x6a, 0x6c,0x74,0x7c,0x7e,0x84,0x72,0x73,0x7a,0x56,0x57,0x5e,0x3a,0x3e,0x45,0x28,0x2a, 0x32,0x17,0x19,0x1e,0x13,0x14,0x19,0x15,0x16,0x1c,0x11,0x12,0x16,0x12,0x13,0x16, 0x09,0x0a,0x0c,0x02,0x02,0x03,0x02,0x02,0x02,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,0x89,0x8d,0x9e,0x62,0x6e,0x94,0x53,0x5e,0x88,0x52,0x5d,0x88,0x53,0x5d,0x88, 0x53,0x5e,0x88,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x55, 0x60,0x8a,0x54,0x5f,0x89,0x63,0x72,0xa4,0x39,0x41,0x55,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,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,0x02,0x02,0x02,0x02, 0x02,0x02,0x04,0x04,0x04,0x06,0x06,0x07,0x0a,0x0a,0x0a,0x0f,0x0f,0x10,0x14,0x14, 0x16,0x1a,0x1a,0x1d,0x23,0x24,0x26,0x34,0x35,0x37,0x3e,0x3e,0x40,0x4a,0x4b,0x4e, 0x5b,0x5c,0x5e,0x4f,0x51,0x55,0x3e,0x3f,0x43,0x37,0x38,0x3b,0x2e,0x30,0x36,0x2e, 0x32,0x3f,0x36,0x3c,0x4e,0x4a,0x51,0x62,0x5e,0x63,0x74,0x75,0x7a,0x87,0x88,0x8b, 0x96,0x96,0x99,0xa1,0x9a,0x9b,0xa2,0x95,0x96,0x9c,0x94,0x95,0x9b,0x7e,0x81,0x8d, 0x40,0x3f,0x56,0x49,0x40,0x53,0x52,0x49,0x5f,0x58,0x4d,0x63,0x4d,0x44,0x56,0x55, 0x4b,0x5e,0x5d,0x4d,0x60,0x5f,0x52,0x68,0x52,0x50,0x6e,0x51,0x52,0x6f,0x52,0x56, 0x73,0x43,0x46,0x5d,0x42,0x42,0x5b,0x46,0x44,0x5c,0x51,0x4b,0x65,0x52,0x51,0x6e, 0x4d,0x4d,0x67,0x47,0x4f,0x66,0x69,0x71,0x88,0x70,0x78,0x8d,0x73,0x7a,0x8e,0x75, 0x7c,0x91,0x77,0x7e,0x92,0x74,0x7b,0x90,0x69,0x71,0x87,0x65,0x6c,0x82,0x64,0x6a, 0x80,0x64,0x6a,0x7f,0x63,0x6a,0x7e,0x5e,0x63,0x78,0x56,0x5b,0x6e,0x4b,0x4f,0x64, 0x44,0x48,0x5e,0x3c,0x3d,0x52,0x3a,0x3a,0x4e,0x42,0x3f,0x54,0x4f,0x48,0x5e,0x48, 0x42,0x57,0x54,0x4f,0x66,0x56,0x53,0x6e,0x52,0x50,0x6e,0x52,0x53,0x70,0x52,0x56, 0x73,0x53,0x5a,0x76,0x56,0x5f,0x79,0x5a,0x63,0x7a,0x58,0x60,0x78,0x52,0x5a,0x72, 0x60,0x68,0x7e,0x7c,0x82,0x92,0x98,0x9b,0xa5,0x8e,0x93,0x9d,0x89,0x8d,0x9a,0xa3, 0xa9,0xbb,0x77,0x7b,0x97,0x56,0x52,0x70,0x52,0x50,0x6f,0x4e,0x4e,0x6e,0x4f,0x45, 0x5f,0x56,0x58,0x70,0x60,0x53,0x67,0x3c,0x35,0x46,0x32,0x30,0x3d,0x2a,0x28,0x34, 0x29,0x24,0x2f,0x24,0x20,0x2a,0x2c,0x2a,0x32,0x38,0x34,0x36,0x1c,0x17,0x1c,0x29, 0x23,0x2c,0x3a,0x32,0x40,0x42,0x38,0x47,0x3b,0x34,0x43,0x44,0x46,0x63,0x3f,0x3d, 0x5a,0x45,0x3c,0x55,0x42,0x44,0x63,0x5a,0x64,0x81,0x5c,0x65,0x85,0x58,0x61,0x84, 0x5d,0x4d,0x6b,0x53,0x4c,0x73,0xbd,0xc2,0xd0,0x7b,0x76,0x77,0x23,0x18,0x1d,0x2d, 0x21,0x28,0x2c,0x20,0x26,0x2e,0x21,0x28,0x56,0x43,0x53,0x3a,0x40,0x51,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x6e,0x79,0x9c,0xa4,0xbe,0x5b,0x66,0x8d, 0x58,0x64,0x8b,0x69,0x75,0x99,0x62,0x6d,0x94,0x64,0x71,0x96,0x62,0x6e,0x94,0x64, 0x70,0x94,0x63,0x6f,0x94,0x61,0x6d,0x92,0x60,0x6a,0x8c,0x5d,0x62,0x82,0x55,0x58, 0x78,0x50,0x48,0x67,0x58,0x5a,0x76,0x5e,0x5c,0x6b,0x2a,0x23,0x2c,0x2d,0x26,0x31, 0x30,0x2a,0x36,0x33,0x2e,0x3c,0x35,0x2f,0x3e,0x39,0x32,0x3f,0x3d,0x33,0x3f,0x3e, 0x32,0x40,0x3c,0x32,0x3f,0x3a,0x32,0x3e,0x36,0x2d,0x39,0x32,0x2a,0x34,0x32,0x29, 0x34,0x39,0x2e,0x3b,0x42,0x36,0x43,0x47,0x3d,0x4c,0x4b,0x42,0x56,0x49,0x43,0x59, 0x46,0x43,0x5a,0x45,0x44,0x5c,0x51,0x4c,0x66,0x6d,0x6b,0x88,0x73,0x6f,0x89,0x76, 0x6f,0x87,0x5b,0x51,0x66,0x46,0x3e,0x52,0x48,0x42,0x57,0x48,0x46,0x61,0x4b,0x51, 0x6c,0x4d,0x55,0x6f,0x47,0x4a,0x64,0x45,0x3f,0x55,0x40,0x38,0x46,0x40,0x36,0x45, 0x46,0x39,0x49,0x47,0x3d,0x4f,0x4f,0x44,0x57,0x4e,0x3f,0x50,0x54,0x45,0x56,0x5a, 0x4f,0x66,0x5d,0x4f,0x64,0x58,0x47,0x5a,0x5d,0x4d,0x60,0x5c,0x4d,0x61,0x5b,0x4f, 0x63,0x5b,0x50,0x69,0x53,0x4f,0x6a,0x55,0x54,0x71,0x5e,0x5e,0x79,0x63,0x61,0x7c, 0x69,0x67,0x80,0x6e,0x6a,0x82,0x63,0x5f,0x77,0x52,0x50,0x6e,0x52,0x51,0x6e,0x55, 0x52,0x6d,0x58,0x52,0x6d,0x54,0x52,0x6d,0x51,0x50,0x6e,0x62,0x6a,0x82,0x9b,0x9e, 0xa8,0xb0,0xb2,0xb6,0xb5,0xb7,0xba,0xc3,0xc1,0xc6,0xb7,0xb4,0xb9,0xb4,0xb3,0xb9, 0xb2,0xb0,0xb6,0xaa,0xa8,0xae,0xa6,0xa4,0xa8,0xa2,0xa0,0xa3,0xd5,0xd6,0xd9,0xbd, 0xbf,0xc7,0x92,0x98,0xa9,0x72,0x71,0x8c,0x77,0x6c,0x81,0x64,0x51,0x68,0x56,0x42, 0x5b,0x55,0x40,0x58,0x52,0x3e,0x55,0x4c,0x39,0x4f,0x4a,0x38,0x4d,0x48,0x39,0x4d, 0x3e,0x30,0x43,0x3c,0x2e,0x41,0x58,0x4a,0x63,0x40,0x45,0x57,0x22,0x24,0x2e,0x20, 0x23,0x2c,0x1d,0x1f,0x27,0x42,0x40,0x59,0x56,0x51,0x72,0x58,0x50,0x71,0x5a,0x51, 0x71,0x5a,0x51,0x74,0x5d,0x53,0x73,0x5c,0x52,0x72,0x59,0x4f,0x70,0x56,0x4d,0x6d, 0x56,0x4e,0x6c,0x4e,0x45,0x63,0x4c,0x45,0x5f,0x5f,0x5a,0x75,0x82,0x7f,0x95,0x83, 0x80,0x97,0x7f,0x81,0x99,0x99,0x9e,0xaf,0x6d,0x6f,0x77,0x76,0x79,0x80,0x7a,0x7c, 0x83,0x74,0x76,0x7e,0x67,0x6a,0x71,0x66,0x68,0x6f,0x78,0x77,0x7f,0x81,0x7c,0x86, 0x95,0x98,0xa8,0x87,0x8d,0xa1,0x7f,0x86,0x9a,0x70,0x79,0x92,0x70,0x78,0x92,0x7f, 0x86,0x9f,0x87,0x8e,0xa7,0x81,0x88,0xa2,0x79,0x80,0x9e,0x7a,0x81,0x9d,0x74,0x7b, 0x99,0x73,0x7c,0x9a,0x77,0x80,0x9c,0x6f,0x77,0x96,0x5c,0x64,0x85,0x49,0x52,0x70, 0x2b,0x2c,0x3c,0x46,0x40,0x56,0x56,0x4b,0x62,0x4f,0x4e,0x6a,0x5a,0x62,0x7d,0x66, 0x6e,0x86,0x5d,0x64,0x7e,0x4f,0x51,0x6e,0x4f,0x4e,0x6a,0x50,0x52,0x6f,0x51,0x56, 0x72,0x51,0x51,0x6e,0x50,0x4e,0x6a,0x4e,0x4c,0x67,0x4b,0x4a,0x64,0x47,0x47,0x62, 0x43,0x48,0x60,0x42,0x48,0x5d,0x46,0x4b,0x5d,0x43,0x48,0x59,0x43,0x49,0x5a,0x42, 0x47,0x57,0x45,0x4a,0x59,0x46,0x4b,0x5a,0x47,0x4d,0x5c,0x53,0x58,0x66,0x6a,0x6e, 0x78,0x81,0x83,0x8a,0x8a,0x8d,0x92,0x82,0x85,0x8d,0x80,0x84,0x8e,0x82,0x86,0x92, 0x6f,0x74,0x82,0x65,0x6a,0x7a,0x5c,0x62,0x72,0x4d,0x52,0x64,0x41,0x47,0x58,0x3d, 0x42,0x52,0x36,0x3a,0x4b,0x32,0x36,0x47,0x32,0x32,0x45,0x37,0x36,0x47,0x38,0x34, 0x46,0x31,0x30,0x42,0x2b,0x2b,0x3b,0x2a,0x2a,0x3a,0x2d,0x2c,0x3c,0x32,0x2e,0x3e, 0x34,0x30,0x3f,0x35,0x31,0x41,0x34,0x32,0x42,0x33,0x32,0x45,0x33,0x32,0x44,0x32, 0x2f,0x40,0x2c,0x2a,0x39,0x23,0x23,0x30,0x26,0x29,0x35,0x28,0x2c,0x37,0x2e,0x31, 0x3b,0x39,0x3d,0x48,0x3d,0x40,0x4b,0x3a,0x3e,0x4a,0x3b,0x3f,0x4b,0x40,0x44,0x4e, 0x62,0x64,0x6d,0x86,0x88,0x8f,0x90,0x91,0x96,0x81,0x82,0x88,0x47,0x4a,0x51,0x2c, 0x2e,0x35,0x1e,0x1f,0x23,0x0e,0x0e,0x12,0x08,0x09,0x0b,0x09,0x0a,0x0d,0x14,0x16, 0x19,0x20,0x22,0x26,0x12,0x12,0x15,0x02,0x02,0x03,0x02,0x02,0x02,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,0x45,0x46,0x4b,0x72,0x7d,0xa0,0x54,0x5f,0x89,0x52,0x5c, 0x86,0x52,0x5d,0x86,0x53,0x5e,0x88,0x53,0x5e,0x89,0x53,0x5e,0x88,0x53,0x5f,0x89, 0x53,0x5e,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x5a,0x65,0x92,0x7b,0x8b,0xcb,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,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,0x02,0x02,0x02,0x03,0x03,0x04,0x06,0x06,0x06,0x08,0x08,0x09,0x0b, 0x0b,0x0c,0x0f,0x10,0x11,0x14,0x15,0x16,0x19,0x1a,0x1c,0x1d,0x1e,0x20,0x20,0x21, 0x24,0x25,0x26,0x29,0x2a,0x2b,0x2e,0x2e,0x2e,0x32,0x28,0x2a,0x2d,0x22,0x22,0x26, 0x1e,0x20,0x28,0x2e,0x29,0x36,0x42,0x39,0x49,0x48,0x42,0x57,0x47,0x4c,0x66,0x64, 0x6a,0x7e,0x73,0x79,0x87,0x86,0x8a,0x93,0x8d,0x8e,0x96,0x8f,0x91,0x97,0x82,0x85, 0x91,0x4a,0x4e,0x64,0x4a,0x41,0x53,0x4e,0x43,0x54,0x46,0x3c,0x4d,0x3e,0x34,0x41, 0x4e,0x43,0x55,0x54,0x4b,0x62,0x58,0x4d,0x63,0x5d,0x51,0x69,0x51,0x4f,0x6d,0x51, 0x58,0x74,0x51,0x58,0x74,0x42,0x42,0x5b,0x42,0x41,0x58,0x53,0x4c,0x64,0x4e,0x49, 0x60,0x4e,0x4d,0x68,0x52,0x51,0x6d,0x47,0x48,0x61,0x53,0x5a,0x70,0x6d,0x75,0x8a, 0x6e,0x76,0x8c,0x6a,0x72,0x89,0x6a,0x72,0x8a,0x68,0x70,0x87,0x5c,0x65,0x7e,0x56, 0x5e,0x7a,0x50,0x54,0x6f,0x4f,0x56,0x71,0x49,0x4e,0x66,0x44,0x48,0x5e,0x3c,0x40, 0x54,0x39,0x37,0x4c,0x3b,0x39,0x4d,0x4a,0x44,0x5b,0x51,0x4e,0x68,0x50,0x4e,0x6a, 0x52,0x51,0x6e,0x4b,0x49,0x60,0x5d,0x5c,0x77,0x56,0x54,0x72,0x52,0x51,0x6f,0x52, 0x52,0x6e,0x52,0x50,0x6e,0x51,0x4f,0x6d,0x4f,0x4e,0x6a,0x48,0x46,0x60,0x44,0x43, 0x5b,0x44,0x48,0x60,0x4e,0x54,0x6c,0x62,0x69,0x7f,0x6f,0x75,0x84,0x6e,0x72,0x82, 0x7b,0x81,0x8f,0x99,0xa0,0xb4,0x70,0x75,0x8f,0x61,0x62,0x7f,0x5b,0x5a,0x7c,0x54, 0x54,0x73,0x56,0x4c,0x67,0x48,0x45,0x63,0x6b,0x69,0x7d,0x56,0x48,0x5d,0x3c,0x3a, 0x4b,0x32,0x30,0x3e,0x29,0x27,0x33,0x25,0x24,0x2e,0x26,0x25,0x2f,0x3a,0x37,0x3c, 0x3b,0x34,0x39,0x2b,0x23,0x2c,0x3c,0x32,0x3f,0x44,0x39,0x48,0x3d,0x34,0x42,0x48, 0x44,0x5f,0x42,0x40,0x5e,0x44,0x3d,0x58,0x40,0x3e,0x5f,0x52,0x5b,0x7c,0x5d,0x66, 0x88,0x58,0x63,0x86,0x54,0x4f,0x73,0x5f,0x50,0x72,0xa2,0xa9,0xbf,0xa6,0xa3,0xa4, 0x20,0x16,0x1a,0x2d,0x21,0x28,0x2d,0x21,0x28,0x2b,0x1f,0x25,0x45,0x35,0x41,0x49, 0x49,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x36,0x3b,0xa9,0xb0, 0xc6,0x6b,0x76,0x9a,0x54,0x5f,0x87,0x67,0x73,0x98,0x60,0x6c,0x92,0x62,0x6d,0x94, 0x60,0x6d,0x93,0x62,0x6d,0x94,0x62,0x6d,0x93,0x61,0x6c,0x90,0x5f,0x69,0x8d,0x5c, 0x64,0x86,0x5b,0x61,0x82,0x4d,0x48,0x6b,0x4e,0x52,0x74,0x6a,0x6b,0x84,0x2b,0x25, 0x2c,0x26,0x1f,0x27,0x27,0x21,0x2a,0x2a,0x24,0x2e,0x2b,0x25,0x2e,0x2d,0x26,0x30, 0x30,0x27,0x32,0x32,0x2a,0x33,0x2e,0x27,0x32,0x2e,0x26,0x31,0x2b,0x24,0x2e,0x29, 0x23,0x2c,0x2a,0x23,0x2c,0x2c,0x24,0x2e,0x2f,0x28,0x32,0x35,0x2c,0x37,0x3d,0x33, 0x40,0x44,0x3a,0x49,0x48,0x3e,0x4f,0x48,0x3e,0x4e,0x51,0x46,0x59,0x68,0x60,0x79, 0x77,0x70,0x89,0x78,0x71,0x8a,0x66,0x5f,0x76,0x46,0x41,0x56,0x43,0x42,0x5a,0x48, 0x4f,0x68,0x56,0x5e,0x76,0x63,0x6b,0x80,0x5a,0x62,0x79,0x46,0x46,0x60,0x41,0x3d, 0x52,0x44,0x3f,0x55,0x47,0x42,0x55,0x3b,0x3b,0x50,0x3e,0x3b,0x4f,0x51,0x45,0x59, 0x56,0x4a,0x5d,0x58,0x4d,0x62,0x5b,0x4c,0x60,0x54,0x45,0x56,0x5a,0x49,0x5c,0x5c, 0x4d,0x61,0x5a,0x4a,0x5e,0x5a,0x4b,0x5f,0x5b,0x4e,0x63,0x5b,0x51,0x6a,0x52,0x50, 0x6d,0x52,0x52,0x70,0x52,0x50,0x6e,0x5e,0x5d,0x78,0x69,0x68,0x81,0x52,0x51,0x6e, 0x52,0x52,0x70,0x52,0x51,0x6e,0x55,0x52,0x6e,0x52,0x51,0x6e,0x52,0x52,0x6e,0x50, 0x58,0x73,0x79,0x7f,0x90,0x9e,0xa1,0xaa,0xaa,0xac,0xb1,0xc6,0xc2,0xc7,0xc3,0xc0, 0xc4,0xbd,0xbb,0xc0,0xb9,0xb8,0xbe,0xb1,0xaf,0xb5,0xa9,0xa7,0xab,0xa6,0xa4,0xa7, 0xd7,0xd8,0xdb,0xc6,0xc8,0xcf,0xa7,0xad,0xba,0x99,0x9e,0xb1,0x98,0x91,0xa3,0x75, 0x66,0x7b,0x5a,0x46,0x5e,0x56,0x3f,0x5a,0x51,0x3e,0x54,0x4b,0x37,0x4e,0x4a,0x36, 0x4c,0x45,0x33,0x48,0x3f,0x2e,0x42,0x33,0x26,0x35,0x51,0x43,0x59,0x4b,0x53,0x6e, 0x21,0x24,0x2d,0x20,0x22,0x2b,0x1e,0x20,0x27,0x3f,0x3f,0x56,0x56,0x50,0x72,0x58, 0x51,0x72,0x59,0x51,0x73,0x5c,0x52,0x72,0x5d,0x52,0x73,0x5c,0x51,0x72,0x5a,0x51, 0x71,0x56,0x4d,0x6d,0x59,0x53,0x73,0x54,0x4e,0x6e,0x50,0x4c,0x68,0x62,0x5d,0x75, 0x78,0x74,0x8b,0x79,0x76,0x8d,0x76,0x78,0x91,0x91,0x98,0xab,0x69,0x6c,0x74,0x7e, 0x80,0x87,0x82,0x85,0x8c,0x7a,0x7e,0x84,0x6d,0x70,0x77,0x5a,0x5d,0x65,0x64,0x64, 0x6c,0x82,0x7c,0x87,0x9c,0x9f,0xad,0x97,0x9d,0xae,0x87,0x8d,0xa1,0x7a,0x80,0x98, 0x78,0x7f,0x98,0x85,0x8b,0xa2,0x89,0x8f,0xa6,0x86,0x8d,0xa4,0x85,0x8c,0xa5,0x85, 0x8c,0xa5,0x7d,0x85,0xa0,0x82,0x89,0xa3,0x84,0x8b,0xa5,0x68,0x71,0x8e,0x4a,0x53, 0x77,0x40,0x46,0x64,0x2a,0x27,0x33,0x46,0x3d,0x4e,0x52,0x4a,0x60,0x4e,0x4d,0x69, 0x52,0x5a,0x76,0x56,0x5e,0x7a,0x51,0x54,0x70,0x4f,0x4e,0x6a,0x52,0x4e,0x69,0x50, 0x4e,0x6b,0x50,0x52,0x6e,0x50,0x50,0x6d,0x4f,0x4e,0x6a,0x4e,0x4c,0x67,0x4c,0x4b, 0x66,0x49,0x4a,0x64,0x46,0x4c,0x65,0x48,0x4e,0x64,0x4a,0x51,0x63,0x4c,0x52,0x63, 0x4d,0x52,0x64,0x4e,0x52,0x63,0x4e,0x53,0x62,0x51,0x56,0x64,0x5f,0x63,0x6f,0x76, 0x7a,0x82,0x90,0x92,0x96,0xa2,0xa3,0xa5,0xa2,0xa2,0xa6,0x91,0x93,0x9a,0x82,0x86, 0x90,0x7b,0x80,0x8d,0x6a,0x6e,0x7e,0x5d,0x62,0x73,0x51,0x56,0x68,0x43,0x49,0x5a, 0x3e,0x42,0x54,0x37,0x3c,0x4c,0x33,0x38,0x48,0x2f,0x33,0x42,0x2e,0x32,0x42,0x30, 0x30,0x41,0x30,0x2f,0x40,0x2c,0x2d,0x3d,0x27,0x2b,0x3a,0x25,0x28,0x35,0x25,0x26, 0x34,0x26,0x26,0x35,0x29,0x28,0x37,0x2a,0x29,0x36,0x2b,0x2a,0x37,0x2a,0x29,0x38, 0x27,0x26,0x35,0x26,0x24,0x32,0x20,0x20,0x2b,0x1e,0x20,0x2a,0x22,0x25,0x2e,0x28, 0x2b,0x35,0x28,0x2b,0x35,0x2a,0x2d,0x36,0x2d,0x30,0x3a,0x2f,0x33,0x3d,0x44,0x48, 0x52,0x58,0x5b,0x65,0x5e,0x62,0x6a,0x89,0x8a,0x90,0x85,0x86,0x8b,0x72,0x72,0x77, 0x4a,0x4c,0x50,0x26,0x27,0x2b,0x15,0x16,0x1a,0x0c,0x0e,0x10,0x06,0x07,0x09,0x06, 0x06,0x07,0x0e,0x0e,0x11,0x19,0x1a,0x1e,0x0c,0x0d,0x0f,0x02,0x02,0x03,0x02,0x02, 0x02,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,0x12,0x13,0x14,0x8e,0x99,0xb4,0x5a, 0x65,0x8d,0x52,0x56,0x81,0x52,0x5a,0x84,0x52,0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d, 0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5e,0x8a, 0x66,0x73,0xa8,0x19,0x1c,0x21,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04, 0x06,0x06,0x06,0x08,0x08,0x09,0x0b,0x0c,0x0d,0x0f,0x10,0x12,0x12,0x13,0x15,0x17, 0x17,0x1a,0x1a,0x1a,0x1c,0x1b,0x1c,0x1e,0x1d,0x1e,0x20,0x1d,0x1e,0x20,0x1e,0x1f, 0x22,0x21,0x22,0x26,0x1b,0x1c,0x26,0x35,0x2d,0x39,0x43,0x3a,0x48,0x48,0x40,0x52, 0x4a,0x46,0x5e,0x4c,0x4c,0x66,0x51,0x58,0x71,0x5d,0x63,0x76,0x5c,0x61,0x75,0x5e, 0x64,0x78,0x44,0x45,0x5b,0x48,0x3f,0x51,0x4b,0x42,0x52,0x45,0x3d,0x4d,0x3d,0x36, 0x44,0x4f,0x43,0x54,0x55,0x4a,0x60,0x4f,0x48,0x60,0x49,0x46,0x5d,0x44,0x40,0x56, 0x45,0x46,0x5e,0x50,0x57,0x6f,0x4d,0x54,0x6c,0x41,0x42,0x5a,0x45,0x42,0x58,0x55, 0x4e,0x67,0x5a,0x52,0x6a,0x4c,0x47,0x60,0x4b,0x4a,0x64,0x51,0x50,0x6d,0x4a,0x4a, 0x63,0x47,0x4c,0x65,0x5b,0x63,0x7c,0x5f,0x68,0x82,0x56,0x5f,0x7b,0x52,0x59,0x76, 0x52,0x56,0x74,0x52,0x51,0x6e,0x55,0x4b,0x62,0x44,0x41,0x56,0x40,0x3d,0x51,0x42, 0x3e,0x53,0x46,0x3e,0x4f,0x5b,0x4b,0x5f,0x53,0x48,0x5c,0x54,0x48,0x5b,0x5e,0x52, 0x6a,0x52,0x51,0x6c,0x48,0x4b,0x62,0x4f,0x50,0x65,0x5f,0x5d,0x77,0x56,0x54,0x70, 0x52,0x51,0x6e,0x54,0x52,0x6d,0x57,0x52,0x6d,0x4e,0x48,0x60,0x4c,0x45,0x59,0x48, 0x42,0x57,0x42,0x40,0x57,0x43,0x42,0x5a,0x44,0x45,0x5c,0x48,0x47,0x62,0x4b,0x52, 0x6c,0x5a,0x5f,0x72,0x66,0x6a,0x7a,0x8a,0x91,0xa6,0x6d,0x71,0x8d,0x5a,0x5c,0x7a, 0x5b,0x5d,0x80,0x5c,0x5a,0x78,0x51,0x51,0x6f,0x50,0x44,0x5d,0x54,0x58,0x73,0x65, 0x5d,0x72,0x50,0x4f,0x66,0x3f,0x3f,0x50,0x32,0x31,0x3f,0x29,0x29,0x34,0x27,0x27, 0x31,0x2e,0x2e,0x37,0x3b,0x33,0x39,0x37,0x30,0x36,0x34,0x2a,0x35,0x3d,0x32,0x40, 0x3a,0x32,0x3f,0x3f,0x40,0x5b,0x47,0x49,0x69,0x49,0x43,0x5f,0x44,0x41,0x64,0x49, 0x54,0x77,0x51,0x5b,0x80,0x53,0x5e,0x84,0x4e,0x4f,0x77,0x61,0x4d,0x6b,0x8e,0x98, 0xb3,0xcb,0xc9,0xcb,0x1d,0x14,0x17,0x2c,0x20,0x26,0x2f,0x22,0x29,0x2d,0x20,0x27, 0x3b,0x2c,0x36,0x6b,0x59,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x02,0x02,0xa0,0xa6,0xba,0x83,0x8d,0xac,0x53,0x5e,0x87,0x5e,0x6a,0x91,0x60,0x6d, 0x92,0x5e,0x6a,0x91,0x5f,0x6c,0x92,0x5f,0x6b,0x92,0x5f,0x6a,0x91,0x61,0x6c,0x91, 0x5f,0x69,0x8f,0x5d,0x67,0x8a,0x58,0x63,0x86,0x4a,0x53,0x78,0x48,0x46,0x6a,0x60, 0x68,0x85,0x41,0x42,0x4b,0x12,0x11,0x16,0x19,0x16,0x1c,0x20,0x1a,0x22,0x25,0x1e, 0x26,0x26,0x20,0x29,0x28,0x22,0x2a,0x29,0x22,0x2a,0x28,0x22,0x2b,0x28,0x22,0x2a, 0x28,0x21,0x2a,0x28,0x21,0x2a,0x28,0x22,0x2a,0x29,0x22,0x2b,0x29,0x22,0x2b,0x29, 0x23,0x2c,0x2d,0x26,0x30,0x32,0x2b,0x36,0x39,0x30,0x3d,0x3a,0x31,0x3e,0x3f,0x33, 0x3f,0x4d,0x41,0x51,0x65,0x5c,0x6c,0x73,0x67,0x7c,0x74,0x6b,0x84,0x46,0x42,0x57, 0x46,0x44,0x5b,0x48,0x48,0x62,0x4b,0x52,0x6c,0x51,0x59,0x71,0x49,0x4d,0x66,0x44, 0x43,0x5b,0x3f,0x3e,0x56,0x3e,0x43,0x5a,0x45,0x4c,0x62,0x47,0x4e,0x63,0x3c,0x42, 0x57,0x38,0x38,0x4c,0x3f,0x3e,0x53,0x4e,0x47,0x5e,0x55,0x4a,0x60,0x5a,0x4a,0x5c, 0x5a,0x4a,0x5b,0x5a,0x4a,0x5d,0x57,0x47,0x5a,0x56,0x46,0x58,0x5a,0x4a,0x5e,0x5b, 0x50,0x65,0x57,0x50,0x6a,0x51,0x4f,0x6c,0x52,0x50,0x6d,0x69,0x67,0x81,0x58,0x56, 0x73,0x52,0x53,0x72,0x52,0x52,0x70,0x52,0x52,0x6f,0x53,0x52,0x6e,0x52,0x52,0x6f, 0x52,0x55,0x72,0x51,0x57,0x74,0x66,0x6d,0x83,0x8e,0x92,0x9e,0xa4,0xa6,0xae,0xc5, 0xc2,0xc8,0xc9,0xc7,0xca,0xc2,0xc1,0xc5,0xb9,0xb9,0xbf,0xaf,0xaf,0xb6,0xaf,0xae, 0xb2,0xab,0xa9,0xab,0xd7,0xd7,0xda,0xc7,0xca,0xd1,0xb4,0xb8,0xc3,0xa8,0xad,0xbc, 0x92,0x97,0xac,0x75,0x67,0x7d,0x5c,0x49,0x60,0x55,0x41,0x59,0x52,0x3d,0x54,0x4d, 0x39,0x50,0x4a,0x36,0x4c,0x44,0x32,0x47,0x3f,0x2e,0x41,0x2f,0x22,0x31,0x50,0x41, 0x58,0x56,0x5f,0x81,0x20,0x22,0x2b,0x1e,0x22,0x2a,0x1d,0x1f,0x27,0x40,0x3e,0x54, 0x55,0x50,0x71,0x58,0x51,0x72,0x59,0x52,0x73,0x5a,0x51,0x74,0x5c,0x52,0x73,0x5c, 0x51,0x72,0x5a,0x50,0x71,0x5a,0x4d,0x6b,0x56,0x49,0x66,0x59,0x4f,0x6f,0x59,0x55, 0x73,0x57,0x54,0x6e,0x6c,0x68,0x81,0x76,0x74,0x8b,0x78,0x7a,0x93,0x95,0x9b,0xad, 0x73,0x76,0x7e,0x82,0x86,0x8d,0x85,0x88,0x8e,0x7d,0x80,0x86,0x6e,0x71,0x78,0x56, 0x59,0x60,0x5b,0x5a,0x62,0x77,0x72,0x7d,0x7a,0x7d,0x8d,0x63,0x69,0x7e,0x5b,0x62, 0x7a,0x6c,0x74,0x8e,0x74,0x7a,0x94,0x78,0x7e,0x96,0x7a,0x81,0x9a,0x7c,0x83,0x9b, 0x80,0x87,0x9e,0x84,0x8a,0xa2,0x83,0x89,0xa0,0x78,0x7e,0x98,0x68,0x70,0x8d,0x51, 0x55,0x77,0x4c,0x4e,0x6c,0x42,0x47,0x65,0x2a,0x2a,0x39,0x3d,0x3b,0x51,0x49,0x47, 0x61,0x4e,0x4e,0x6a,0x50,0x54,0x72,0x51,0x55,0x72,0x51,0x54,0x70,0x4e,0x4d,0x69, 0x4e,0x4c,0x68,0x4e,0x4f,0x6c,0x50,0x56,0x73,0x50,0x55,0x72,0x4e,0x53,0x6f,0x4e, 0x52,0x6e,0x4c,0x51,0x6c,0x4a,0x52,0x6b,0x4a,0x51,0x6a,0x4d,0x54,0x6a,0x52,0x59, 0x6c,0x56,0x5d,0x6e,0x5c,0x62,0x72,0x63,0x68,0x76,0x6c,0x71,0x7c,0x75,0x78,0x82, 0x89,0x8c,0x92,0x9d,0x9e,0xa2,0xaa,0xaa,0xac,0xb0,0xb0,0xb1,0xaa,0xaa,0xad,0x92, 0x95,0x9b,0x7a,0x7e,0x8a,0x6b,0x70,0x7f,0x62,0x67,0x77,0x57,0x5d,0x6e,0x4a,0x4f, 0x62,0x40,0x46,0x57,0x3b,0x41,0x51,0x35,0x3a,0x4a,0x32,0x37,0x46,0x2f,0x34,0x42, 0x2d,0x31,0x40,0x2c,0x30,0x40,0x2b,0x2e,0x3e,0x2a,0x2e,0x3d,0x27,0x2b,0x38,0x25, 0x28,0x34,0x22,0x25,0x31,0x20,0x22,0x2e,0x21,0x22,0x2e,0x20,0x20,0x2c,0x1f,0x1f, 0x2a,0x1e,0x1e,0x2a,0x1c,0x1d,0x27,0x1c,0x1e,0x27,0x1e,0x21,0x2a,0x20,0x22,0x2b, 0x22,0x25,0x2d,0x26,0x29,0x31,0x24,0x26,0x2f,0x26,0x28,0x31,0x27,0x2a,0x32,0x27, 0x2a,0x32,0x2d,0x2f,0x37,0x49,0x4b,0x52,0x5a,0x5a,0x62,0x5a,0x5c,0x62,0x60,0x60, 0x65,0x2d,0x2e,0x32,0x15,0x16,0x1a,0x10,0x11,0x14,0x0e,0x10,0x12,0x0f,0x10,0x13, 0x06,0x07,0x0a,0x04,0x04,0x06,0x06,0x06,0x07,0x0d,0x0e,0x10,0x0e,0x0f,0x12,0x0a, 0x0a,0x0c,0x04,0x04,0x05,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, 0x99,0xa0,0xb5,0x63,0x6e,0x95,0x52,0x5a,0x84,0x52,0x55,0x81,0x52,0x57,0x83,0x52, 0x5a,0x84,0x52,0x5d,0x86,0x52,0x5d,0x86,0x52,0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d, 0x88,0x53,0x5d,0x88,0x58,0x63,0x92,0x64,0x71,0xa5,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,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,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x04,0x04,0x05,0x06,0x06,0x06,0x08,0x09,0x09,0x0a,0x0b,0x0c, 0x0e,0x0e,0x10,0x10,0x11,0x12,0x12,0x13,0x15,0x16,0x16,0x18,0x16,0x17,0x1a,0x17, 0x18,0x1a,0x1c,0x1d,0x1f,0x27,0x29,0x2d,0x1e,0x1d,0x27,0x39,0x30,0x3c,0x4c,0x42, 0x55,0x53,0x4c,0x64,0x51,0x47,0x5d,0x51,0x46,0x58,0x53,0x49,0x5e,0x4a,0x47,0x5f, 0x46,0x43,0x5a,0x47,0x42,0x56,0x42,0x37,0x46,0x45,0x3a,0x49,0x50,0x48,0x5e,0x48, 0x42,0x56,0x4a,0x43,0x5a,0x5e,0x52,0x6a,0x5d,0x52,0x68,0x55,0x50,0x6b,0x50,0x4f, 0x6c,0x50,0x4f,0x6c,0x4e,0x55,0x6f,0x57,0x5d,0x74,0x4c,0x54,0x6b,0x4c,0x52,0x6e, 0x4c,0x4f,0x6a,0x51,0x50,0x6e,0x52,0x50,0x6e,0x51,0x4e,0x69,0x4a,0x46,0x5e,0x49, 0x46,0x5e,0x4e,0x4c,0x67,0x4c,0x4b,0x65,0x46,0x46,0x5e,0x51,0x55,0x72,0x52,0x58, 0x75,0x52,0x52,0x70,0x52,0x50,0x6e,0x4b,0x47,0x5d,0x44,0x3c,0x4d,0x48,0x3e,0x4f, 0x54,0x46,0x58,0x53,0x45,0x57,0x50,0x43,0x54,0x5a,0x49,0x5b,0x5f,0x4f,0x64,0x53, 0x48,0x5e,0x4d,0x48,0x5f,0x48,0x4a,0x64,0x5a,0x5d,0x74,0x67,0x66,0x7e,0x65,0x62, 0x7a,0x5a,0x57,0x72,0x55,0x52,0x6e,0x55,0x52,0x6e,0x4a,0x46,0x5d,0x49,0x44,0x59, 0x4b,0x45,0x5a,0x4a,0x46,0x5e,0x4b,0x4d,0x67,0x52,0x5a,0x75,0x58,0x60,0x79,0x4e, 0x4d,0x69,0x4d,0x54,0x6f,0x69,0x6f,0x82,0x67,0x6c,0x7b,0x7a,0x80,0x96,0x7d,0x80, 0x96,0x61,0x65,0x82,0x55,0x57,0x77,0x63,0x5d,0x7c,0x57,0x54,0x70,0x56,0x4b,0x66, 0x46,0x4a,0x6a,0x69,0x6a,0x81,0x53,0x4f,0x69,0x54,0x55,0x6d,0x42,0x42,0x55,0x35, 0x34,0x44,0x2d,0x2d,0x39,0x2c,0x2d,0x38,0x38,0x32,0x39,0x3e,0x36,0x3d,0x2b,0x23, 0x2a,0x2e,0x26,0x2f,0x2b,0x24,0x2e,0x35,0x36,0x4c,0x4c,0x4c,0x6b,0x4b,0x44,0x61, 0x48,0x44,0x66,0x4a,0x54,0x79,0x4e,0x58,0x7f,0x52,0x5e,0x85,0x51,0x5c,0x84,0x5c, 0x44,0x60,0x74,0x80,0xa1,0xe8,0xe8,0xed,0x1f,0x16,0x1a,0x2c,0x1f,0x26,0x2f,0x23, 0x2a,0x2d,0x21,0x28,0x32,0x24,0x2c,0x6a,0x56,0x6b,0x09,0x0a,0x0d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x73,0x80,0x98,0xa1,0xba,0x52,0x5b,0x83,0x58, 0x64,0x8c,0x62,0x6d,0x93,0x5d,0x6a,0x90,0x5d,0x69,0x90,0x5e,0x6b,0x91,0x5f,0x6b, 0x92,0x5d,0x6a,0x91,0x5f,0x6b,0x8f,0x60,0x6a,0x8d,0x5a,0x66,0x8a,0x55,0x5f,0x83, 0x50,0x4a,0x6e,0x56,0x61,0x82,0x68,0x6e,0x7e,0x0a,0x0a,0x0d,0x0b,0x0c,0x10,0x12, 0x10,0x16,0x1a,0x17,0x1e,0x1e,0x1a,0x22,0x21,0x1d,0x25,0x22,0x1e,0x26,0x23,0x1e, 0x26,0x25,0x1f,0x28,0x25,0x1f,0x27,0x26,0x20,0x29,0x26,0x20,0x29,0x27,0x21,0x2a, 0x27,0x21,0x2a,0x27,0x21,0x2a,0x28,0x21,0x2a,0x29,0x22,0x2b,0x2b,0x24,0x2e,0x2d, 0x26,0x2e,0x2d,0x24,0x2e,0x2f,0x24,0x2d,0x42,0x3e,0x47,0x42,0x3e,0x47,0x62,0x59, 0x69,0x4b,0x42,0x54,0x43,0x42,0x5a,0x49,0x49,0x63,0x49,0x4a,0x65,0x48,0x47,0x62, 0x46,0x45,0x5e,0x46,0x43,0x5a,0x44,0x42,0x5b,0x4c,0x53,0x68,0x5b,0x62,0x74,0x58, 0x5e,0x72,0x46,0x4d,0x61,0x3c,0x42,0x56,0x34,0x37,0x4a,0x2e,0x2e,0x3f,0x3c,0x3b, 0x50,0x4d,0x46,0x5a,0x54,0x4a,0x5e,0x58,0x4a,0x5e,0x54,0x44,0x56,0x50,0x41,0x51, 0x55,0x46,0x57,0x5a,0x4a,0x5e,0x5a,0x4e,0x65,0x58,0x50,0x68,0x56,0x50,0x6a,0x6b, 0x66,0x7e,0x62,0x5b,0x74,0x52,0x51,0x6e,0x52,0x52,0x70,0x52,0x52,0x6e,0x52,0x51, 0x6f,0x52,0x54,0x72,0x52,0x5a,0x77,0x53,0x5c,0x79,0x5e,0x66,0x7f,0x7a,0x80,0x92, 0x9d,0xa0,0xa9,0xc3,0xc1,0xc7,0xcc,0xc9,0xcc,0xc5,0xc3,0xc6,0xb9,0xb8,0xbe,0xb5, 0xb4,0xbb,0xb2,0xb1,0xb6,0xab,0xa9,0xac,0xd4,0xd5,0xd9,0xc5,0xc7,0xce,0xb1,0xb5, 0xc1,0x9e,0xa3,0xb2,0x8b,0x91,0xa4,0x6b,0x71,0x8b,0x67,0x55,0x6b,0x58,0x44,0x5a, 0x54,0x3f,0x56,0x4e,0x38,0x50,0x49,0x36,0x4b,0x45,0x32,0x47,0x3f,0x2d,0x40,0x32, 0x22,0x31,0x56,0x46,0x5f,0x53,0x5d,0x80,0x20,0x22,0x2b,0x1f,0x22,0x2a,0x1e,0x20, 0x27,0x35,0x35,0x47,0x56,0x50,0x71,0x58,0x50,0x71,0x5a,0x52,0x73,0x5a,0x52,0x75, 0x5d,0x52,0x74,0x5c,0x51,0x73,0x5b,0x51,0x72,0x59,0x4e,0x6f,0x58,0x4d,0x6d,0x55, 0x4c,0x6c,0x54,0x4d,0x6e,0x51,0x49,0x66,0x50,0x4b,0x6b,0x5d,0x5c,0x7b,0x71,0x73, 0x8e,0x94,0x9b,0xae,0x82,0x84,0x8b,0x7f,0x82,0x89,0x7e,0x81,0x89,0x7b,0x7e,0x85, 0x6b,0x6e,0x76,0x62,0x64,0x6b,0x64,0x65,0x6c,0x7d,0x78,0x82,0x67,0x6a,0x7b,0x49, 0x50,0x6a,0x49,0x4a,0x64,0x4b,0x4d,0x6c,0x50,0x59,0x7b,0x5b,0x63,0x82,0x61,0x68, 0x86,0x71,0x78,0x91,0x8c,0x92,0xa6,0x8f,0x94,0xaa,0x7e,0x83,0x9b,0x55,0x5e,0x7b, 0x50,0x53,0x73,0x4b,0x4c,0x67,0x4c,0x51,0x72,0x4e,0x57,0x73,0x43,0x47,0x55,0x4b, 0x52,0x67,0x4a,0x52,0x6b,0x4e,0x51,0x6e,0x50,0x51,0x6e,0x50,0x50,0x6c,0x55,0x5c, 0x78,0x4e,0x52,0x6e,0x4d,0x4b,0x67,0x4e,0x4e,0x6a,0x52,0x5a,0x75,0x55,0x5d,0x77, 0x57,0x5f,0x79,0x57,0x5f,0x78,0x59,0x61,0x79,0x5a,0x62,0x79,0x4e,0x55,0x6d,0x4f, 0x56,0x6d,0x56,0x5c,0x6f,0x5e,0x64,0x76,0x6e,0x72,0x81,0x7a,0x7e,0x8a,0x7e,0x82, 0x8b,0x8b,0x8e,0x96,0x9b,0x9e,0xa3,0xa3,0xa5,0xa9,0xaa,0xab,0xae,0xac,0xac,0xaf, 0x9d,0x9e,0xa4,0x7e,0x82,0x8c,0x68,0x6e,0x7c,0x5b,0x61,0x72,0x56,0x5c,0x6e,0x52, 0x59,0x6a,0x4a,0x50,0x62,0x42,0x47,0x59,0x39,0x3e,0x4e,0x35,0x3a,0x4a,0x32,0x37, 0x47,0x30,0x34,0x43,0x2e,0x33,0x42,0x2d,0x31,0x40,0x2b,0x2f,0x3e,0x29,0x2d,0x3a, 0x29,0x2c,0x39,0x23,0x27,0x32,0x21,0x24,0x2e,0x1e,0x20,0x2a,0x1c,0x1e,0x28,0x1a, 0x1c,0x26,0x1a,0x1d,0x26,0x18,0x1a,0x23,0x16,0x19,0x21,0x1a,0x1c,0x24,0x22,0x24, 0x2c,0x21,0x23,0x2a,0x1e,0x22,0x29,0x1f,0x22,0x29,0x1f,0x22,0x29,0x1f,0x22,0x29, 0x21,0x23,0x2a,0x1e,0x21,0x27,0x1d,0x1f,0x26,0x1a,0x1d,0x22,0x48,0x4a,0x4e,0x3f, 0x41,0x45,0x32,0x32,0x36,0x0b,0x0c,0x10,0x0f,0x11,0x13,0x12,0x13,0x17,0x12,0x14, 0x17,0x10,0x11,0x14,0x0b,0x0c,0x0e,0x04,0x04,0x05,0x02,0x02,0x02,0x06,0x07,0x09, 0x16,0x16,0x1a,0x1a,0x1a,0x1b,0x0a,0x0a,0x0b,0x02,0x02,0x02,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,0x5d,0x60,0x68,0x71,0x7c,0xa0,0x54,0x5f,0x89,0x52,0x55,0x80, 0x52,0x55,0x81,0x52,0x56,0x81,0x52,0x5a,0x84,0x52,0x5a,0x84,0x52,0x5c,0x85,0x52, 0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5e,0x89,0x6a,0x79,0xb0,0x05,0x06, 0x06,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x05,0x05,0x06,0x06, 0x06,0x07,0x07,0x08,0x0a,0x0a,0x0b,0x0b,0x0c,0x0e,0x0d,0x0e,0x0e,0x0f,0x10,0x12, 0x12,0x12,0x15,0x1a,0x1a,0x1d,0x1f,0x20,0x23,0x1c,0x1e,0x22,0x22,0x20,0x2a,0x3c, 0x35,0x44,0x49,0x42,0x56,0x51,0x4a,0x62,0x5b,0x4f,0x65,0x4a,0x3c,0x4b,0x40,0x36, 0x44,0x41,0x39,0x4a,0x40,0x3a,0x4a,0x47,0x3e,0x4e,0x4c,0x43,0x56,0x56,0x4e,0x68, 0x59,0x52,0x6e,0x4d,0x47,0x5f,0x55,0x4e,0x67,0x5e,0x52,0x6a,0x5b,0x52,0x6a,0x50, 0x4f,0x6d,0x52,0x5a,0x76,0x56,0x5e,0x79,0x5e,0x67,0x80,0x69,0x71,0x87,0x72,0x7a, 0x8e,0x73,0x7a,0x8e,0x6a,0x72,0x89,0x5e,0x67,0x81,0x51,0x56,0x72,0x52,0x50,0x6e, 0x52,0x4f,0x6c,0x48,0x43,0x5a,0x45,0x42,0x56,0x4b,0x4a,0x63,0x4d,0x4b,0x65,0x48, 0x44,0x5c,0x4d,0x4c,0x67,0x52,0x53,0x71,0x4f,0x48,0x5f,0x46,0x3e,0x50,0x4f,0x44, 0x55,0x5a,0x49,0x5c,0x60,0x4f,0x63,0x52,0x46,0x57,0x5b,0x4c,0x60,0x5d,0x4d,0x60, 0x60,0x55,0x6d,0x52,0x51,0x6e,0x4c,0x50,0x6a,0x4e,0x51,0x6c,0x5f,0x5e,0x78,0x61, 0x5f,0x77,0x5c,0x59,0x72,0x56,0x54,0x70,0x57,0x54,0x6f,0x57,0x54,0x6f,0x4e,0x4b, 0x65,0x4d,0x4b,0x66,0x52,0x52,0x6e,0x52,0x54,0x72,0x66,0x6e,0x86,0x77,0x7e,0x92, 0x7f,0x86,0x96,0x6c,0x73,0x88,0x62,0x6a,0x7e,0x70,0x77,0x8a,0x76,0x7c,0x8b,0x7b, 0x83,0x9b,0x6e,0x70,0x8b,0x70,0x71,0x8b,0x50,0x58,0x75,0x58,0x56,0x74,0x5d,0x59, 0x77,0x50,0x49,0x68,0x4e,0x45,0x63,0x5c,0x61,0x7c,0x68,0x5e,0x74,0x55,0x58,0x74, 0x55,0x57,0x70,0x49,0x4b,0x60,0x39,0x3a,0x4b,0x34,0x34,0x43,0x37,0x34,0x41,0x40, 0x38,0x40,0x3f,0x39,0x3e,0x14,0x0f,0x12,0x18,0x12,0x17,0x28,0x25,0x35,0x43,0x42, 0x64,0x4c,0x44,0x65,0x51,0x48,0x6b,0x4c,0x55,0x7d,0x4f,0x58,0x80,0x52,0x5c,0x85, 0x55,0x62,0x89,0x5c,0x45,0x60,0x68,0x73,0x97,0xea,0xed,0xf1,0x3f,0x39,0x3b,0x29, 0x1e,0x24,0x2f,0x23,0x2a,0x30,0x23,0x2a,0x2e,0x21,0x28,0x5b,0x48,0x59,0x1c,0x1f, 0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x35,0x3b,0xa1,0xaa,0xc1, 0x5b,0x66,0x8d,0x52,0x5d,0x87,0x5e,0x6b,0x91,0x5d,0x69,0x90,0x5d,0x6a,0x91,0x5d, 0x69,0x90,0x5f,0x6b,0x92,0x5e,0x6a,0x90,0x60,0x6b,0x92,0x5d,0x69,0x8f,0x5f,0x6a, 0x8e,0x5b,0x67,0x8b,0x4e,0x4c,0x73,0x4f,0x57,0x7e,0x73,0x7b,0x98,0x1b,0x1b,0x1d, 0x0a,0x0a,0x0c,0x0b,0x0c,0x0f,0x0c,0x0e,0x11,0x0e,0x0f,0x14,0x0f,0x11,0x16,0x11, 0x12,0x17,0x12,0x12,0x18,0x14,0x13,0x1a,0x16,0x15,0x1c,0x18,0x17,0x1e,0x1a,0x18, 0x20,0x1c,0x18,0x1f,0x1e,0x1a,0x22,0x20,0x1b,0x23,0x22,0x1d,0x24,0x23,0x1e,0x26, 0x24,0x1e,0x27,0x25,0x1f,0x27,0x26,0x1e,0x27,0x2e,0x22,0x2a,0x48,0x46,0x4f,0x43, 0x41,0x4a,0x44,0x41,0x4a,0x43,0x36,0x44,0x43,0x3f,0x53,0x46,0x49,0x62,0x4a,0x52, 0x6a,0x4f,0x56,0x6e,0x4a,0x51,0x6a,0x46,0x44,0x5d,0x46,0x45,0x5c,0x45,0x46,0x60, 0x4d,0x54,0x69,0x4f,0x56,0x6a,0x41,0x47,0x5c,0x3c,0x42,0x56,0x3e,0x43,0x59,0x3b, 0x3f,0x54,0x38,0x3b,0x4e,0x3e,0x3e,0x54,0x4f,0x45,0x5a,0x56,0x4a,0x5d,0x54,0x44, 0x56,0x4e,0x3e,0x4e,0x53,0x43,0x54,0x57,0x48,0x5a,0x59,0x4a,0x5c,0x5a,0x4e,0x63, 0x5b,0x50,0x67,0x72,0x69,0x7c,0x76,0x6c,0x80,0x5a,0x55,0x6f,0x52,0x52,0x6e,0x52, 0x52,0x6f,0x52,0x52,0x6f,0x52,0x56,0x73,0x54,0x5c,0x78,0x57,0x60,0x7c,0x5a,0x62, 0x7d,0x6a,0x72,0x86,0x87,0x8c,0x9a,0xb1,0xb1,0xba,0xc5,0xc3,0xc7,0xc3,0xc1,0xc5, 0xbb,0xba,0xc0,0xb8,0xb8,0xbe,0xb2,0xb1,0xb6,0xaa,0xa9,0xac,0xcf,0xd1,0xd4,0xc0, 0xc3,0xcb,0xa6,0xaa,0xb6,0x8e,0x93,0xa4,0x84,0x8b,0x9e,0x88,0x8f,0xa3,0x6c,0x66, 0x83,0x6a,0x58,0x6e,0x61,0x4d,0x62,0x4f,0x3b,0x53,0x4a,0x37,0x4c,0x46,0x33,0x49, 0x3e,0x2c,0x3f,0x3a,0x2b,0x3d,0x5b,0x4a,0x65,0x52,0x5b,0x80,0x1f,0x22,0x2a,0x20, 0x22,0x2b,0x1d,0x1f,0x27,0x33,0x31,0x43,0x52,0x4d,0x6c,0x57,0x50,0x72,0x5a,0x52, 0x73,0x5d,0x52,0x73,0x5d,0x52,0x74,0x5c,0x51,0x74,0x5c,0x51,0x73,0x5b,0x51,0x71, 0x5a,0x4f,0x70,0x56,0x4c,0x6d,0x55,0x4a,0x6a,0x4b,0x40,0x5b,0x4f,0x44,0x5e,0x59, 0x4f,0x6b,0x50,0x53,0x76,0x7d,0x86,0x9d,0x6a,0x6d,0x76,0x66,0x6a,0x73,0x66,0x6a, 0x76,0x6b,0x6f,0x79,0x63,0x66,0x6f,0x62,0x66,0x6c,0x66,0x68,0x6e,0x80,0x7c,0x86, 0x6e,0x70,0x80,0x47,0x4e,0x6a,0x44,0x44,0x5c,0x37,0x37,0x4b,0x45,0x42,0x59,0x57, 0x54,0x72,0x56,0x55,0x75,0x60,0x69,0x86,0x7c,0x82,0x9b,0x78,0x7f,0x96,0x64,0x6b, 0x86,0x4f,0x58,0x77,0x50,0x50,0x6e,0x4d,0x52,0x72,0x59,0x62,0x80,0x62,0x69,0x81, 0x4f,0x54,0x61,0x53,0x5a,0x6f,0x4a,0x4b,0x65,0x51,0x4b,0x65,0x56,0x4e,0x66,0x50, 0x4d,0x66,0x4e,0x51,0x6c,0x4e,0x56,0x70,0x4c,0x4d,0x68,0x4c,0x4a,0x65,0x4c,0x4e, 0x69,0x4e,0x55,0x71,0x52,0x5a,0x73,0x53,0x5b,0x73,0x52,0x5a,0x72,0x50,0x57,0x6e, 0x4f,0x56,0x6d,0x54,0x5a,0x6f,0x58,0x5f,0x72,0x63,0x6a,0x7a,0x7a,0x7f,0x8d,0x80, 0x84,0x90,0x7a,0x7e,0x88,0x77,0x7c,0x87,0x8a,0x8d,0x96,0x8e,0x91,0x99,0x8e,0x91, 0x99,0x93,0x96,0x9c,0x7f,0x83,0x8e,0x6a,0x6f,0x7d,0x5d,0x62,0x72,0x57,0x5d,0x6e, 0x4f,0x56,0x68,0x4e,0x53,0x66,0x49,0x4e,0x60,0x3f,0x45,0x56,0x39,0x3e,0x4f,0x36, 0x3b,0x4c,0x35,0x3a,0x4a,0x33,0x38,0x47,0x32,0x36,0x46,0x2e,0x32,0x41,0x2b,0x2f, 0x3d,0x28,0x2c,0x38,0x24,0x28,0x34,0x22,0x24,0x30,0x1e,0x1f,0x2a,0x1b,0x1d,0x26, 0x1a,0x1c,0x26,0x1a,0x1c,0x25,0x1a,0x1c,0x25,0x18,0x1a,0x22,0x15,0x17,0x1e,0x1a, 0x1c,0x22,0x1e,0x21,0x28,0x1d,0x1f,0x26,0x17,0x1a,0x20,0x16,0x18,0x1e,0x14,0x16, 0x1c,0x15,0x17,0x1d,0x14,0x16,0x1b,0x16,0x17,0x1d,0x14,0x16,0x1b,0x11,0x12,0x17, 0x0f,0x11,0x15,0x0d,0x0e,0x12,0x0b,0x0c,0x10,0x10,0x11,0x14,0x1b,0x1c,0x20,0x1f, 0x20,0x24,0x0e,0x0f,0x11,0x08,0x08,0x0a,0x06,0x07,0x08,0x03,0x03,0x04,0x02,0x02, 0x02,0x03,0x04,0x05,0x11,0x12,0x14,0x16,0x16,0x18,0x0b,0x0b,0x0c,0x02,0x02,0x02, 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,0x22,0x23,0x25,0x8b,0x95,0xb2,0x57,0x64, 0x8c,0x52,0x54,0x80,0x52,0x54,0x80,0x52,0x56,0x81,0x52,0x57,0x82,0x52,0x5a,0x84, 0x52,0x5b,0x85,0x52,0x5c,0x86,0x52,0x5d,0x88,0x52,0x5d,0x86,0x52,0x5d,0x88,0x58, 0x64,0x92,0x33,0x39,0x51,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,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,0x02,0x02,0x02,0x02, 0x02,0x03,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x06,0x07,0x08,0x08,0x09,0x0a,0x0a, 0x0c,0x0b,0x0c,0x0e,0x15,0x16,0x18,0x23,0x25,0x27,0x1a,0x1c,0x1e,0x20,0x22,0x27, 0x2d,0x31,0x40,0x3a,0x39,0x4e,0x46,0x40,0x55,0x52,0x46,0x57,0x52,0x42,0x54,0x4b, 0x3c,0x4a,0x51,0x42,0x52,0x54,0x49,0x5e,0x59,0x4e,0x63,0x57,0x4f,0x66,0x52,0x51, 0x6e,0x54,0x50,0x6b,0x47,0x44,0x5b,0x45,0x43,0x5d,0x51,0x50,0x6c,0x5c,0x52,0x6a, 0x50,0x4e,0x6c,0x56,0x5e,0x79,0x5e,0x67,0x80,0x63,0x6a,0x83,0x70,0x78,0x8d,0x7e, 0x85,0x96,0x86,0x8c,0x9c,0x86,0x8c,0x9c,0x82,0x88,0x99,0x7e,0x85,0x96,0x69,0x71, 0x88,0x54,0x5c,0x78,0x52,0x53,0x71,0x52,0x51,0x6e,0x46,0x45,0x5e,0x43,0x3f,0x54, 0x48,0x41,0x56,0x4c,0x45,0x5d,0x4b,0x45,0x5c,0x4a,0x46,0x5c,0x4f,0x45,0x5a,0x4d, 0x41,0x52,0x5e,0x50,0x65,0x5e,0x4e,0x61,0x59,0x4e,0x64,0x50,0x49,0x60,0x5a,0x54, 0x6f,0x5f,0x59,0x72,0x58,0x57,0x73,0x58,0x5a,0x75,0x57,0x59,0x75,0x53,0x53,0x6f, 0x55,0x53,0x6f,0x58,0x55,0x70,0x5c,0x5a,0x74,0x61,0x5f,0x78,0x60,0x5e,0x78,0x5a, 0x5a,0x76,0x58,0x57,0x73,0x5a,0x56,0x6f,0x58,0x52,0x6d,0x56,0x51,0x6d,0x52,0x56, 0x74,0x70,0x76,0x8c,0x82,0x88,0x98,0x83,0x8a,0x99,0x7a,0x7e,0x8c,0x6f,0x74,0x82, 0x68,0x6d,0x7a,0x86,0x8e,0xa5,0x70,0x74,0x91,0x53,0x54,0x73,0x4f,0x55,0x6f,0x4a, 0x4d,0x6b,0x5c,0x57,0x74,0x57,0x55,0x72,0x55,0x46,0x5e,0x51,0x57,0x75,0x7c,0x78, 0x8b,0x5a,0x55,0x71,0x56,0x5a,0x76,0x55,0x59,0x74,0x52,0x53,0x6d,0x49,0x49,0x5f, 0x48,0x45,0x5a,0x2d,0x2a,0x35,0x3f,0x38,0x3e,0x27,0x24,0x26,0x06,0x05,0x06,0x17, 0x16,0x1f,0x44,0x42,0x64,0x4e,0x47,0x68,0x55,0x4c,0x6e,0x4e,0x58,0x7f,0x50,0x5a, 0x82,0x52,0x5d,0x87,0x56,0x62,0x8a,0x60,0x49,0x64,0x55,0x61,0x8a,0xf1,0xf3,0xf5, 0x6b,0x65,0x67,0x27,0x1c,0x22,0x31,0x24,0x2b,0x31,0x24,0x2c,0x2f,0x22,0x29,0x51, 0x40,0x4f,0x30,0x35,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06, 0x07,0x9f,0xa7,0xbb,0x74,0x7f,0xa0,0x52,0x4f,0x7a,0x5f,0x6b,0x91,0x5c,0x67,0x8f, 0x5c,0x69,0x8f,0x5d,0x6a,0x90,0x5e,0x6a,0x91,0x5f,0x6b,0x92,0x5f,0x6b,0x91,0x5e, 0x6b,0x91,0x61,0x6b,0x91,0x5d,0x6a,0x8f,0x50,0x56,0x7f,0x50,0x4d,0x76,0x69,0x75, 0x95,0x55,0x56,0x5d,0x09,0x0a,0x0b,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0d,0x0e,0x10, 0x0e,0x0f,0x12,0x0f,0x10,0x13,0x10,0x11,0x14,0x11,0x12,0x16,0x11,0x12,0x16,0x12, 0x12,0x16,0x11,0x12,0x16,0x12,0x12,0x17,0x12,0x12,0x17,0x11,0x12,0x17,0x12,0x12, 0x18,0x14,0x13,0x1a,0x16,0x14,0x1b,0x17,0x16,0x1d,0x1a,0x17,0x1e,0x25,0x1f,0x26, 0x4c,0x47,0x53,0x56,0x54,0x61,0x55,0x53,0x5f,0x4b,0x42,0x4f,0x3e,0x36,0x47,0x3f, 0x3e,0x54,0x45,0x4b,0x62,0x5c,0x62,0x76,0x5e,0x65,0x78,0x46,0x4e,0x64,0x46,0x42, 0x58,0x47,0x43,0x5a,0x43,0x42,0x5a,0x40,0x42,0x5a,0x40,0x43,0x5a,0x3e,0x42,0x58, 0x3e,0x42,0x58,0x39,0x3c,0x50,0x37,0x3a,0x4d,0x3c,0x3e,0x53,0x42,0x3f,0x55,0x50, 0x46,0x5a,0x54,0x46,0x57,0x4b,0x3c,0x4d,0x4f,0x40,0x50,0x53,0x44,0x55,0x55,0x46, 0x57,0x5a,0x4a,0x5c,0x5a,0x4a,0x5e,0x5c,0x4e,0x62,0x6c,0x60,0x74,0x73,0x6a,0x80, 0x60,0x5f,0x7a,0x5a,0x5a,0x76,0x5f,0x5f,0x7b,0x55,0x5a,0x77,0x52,0x5a,0x77,0x55, 0x5d,0x79,0x5a,0x62,0x7e,0x66,0x6e,0x86,0x8a,0x8e,0x9c,0x9e,0xa0,0xad,0xaf,0xaf, 0xb6,0xb9,0xb8,0xbd,0xb8,0xb6,0xbc,0xb1,0xb1,0xb8,0xa8,0xa9,0xb1,0xac,0xab,0xb1, 0xcf,0xd0,0xd5,0xbc,0xbf,0xc7,0x96,0x9c,0xac,0x78,0x80,0x97,0x80,0x87,0x9a,0x7d, 0x84,0x9a,0x70,0x78,0x92,0x77,0x66,0x7b,0x69,0x57,0x6b,0x57,0x42,0x59,0x4b,0x37, 0x4e,0x48,0x36,0x4b,0x49,0x36,0x4c,0x41,0x30,0x44,0x5d,0x4d,0x68,0x53,0x5e,0x7e, 0x1e,0x22,0x2a,0x1f,0x22,0x2a,0x1d,0x1f,0x26,0x2f,0x2e,0x3f,0x37,0x33,0x49,0x52, 0x4c,0x6b,0x5a,0x51,0x73,0x5c,0x52,0x73,0x5c,0x51,0x73,0x5d,0x52,0x73,0x5c,0x51, 0x74,0x5c,0x51,0x73,0x5b,0x50,0x71,0x58,0x4f,0x70,0x55,0x4c,0x6c,0x48,0x3e,0x58, 0x3e,0x36,0x4c,0x47,0x3d,0x54,0x50,0x4a,0x66,0x58,0x5c,0x79,0x4a,0x4c,0x5a,0x49, 0x4e,0x59,0x4d,0x52,0x63,0x4e,0x54,0x65,0x4e,0x52,0x5f,0x58,0x5b,0x63,0x5a,0x5c, 0x63,0x74,0x6e,0x79,0x70,0x70,0x80,0x45,0x4b,0x66,0x42,0x43,0x5b,0x36,0x36,0x4b, 0x32,0x32,0x47,0x34,0x33,0x47,0x34,0x34,0x49,0x4c,0x49,0x63,0x52,0x4e,0x69,0x51, 0x50,0x6c,0x4a,0x4e,0x6f,0x49,0x4f,0x70,0x50,0x54,0x74,0x4e,0x55,0x77,0x60,0x69, 0x86,0x62,0x6a,0x82,0x46,0x4b,0x58,0x44,0x4b,0x61,0x4c,0x47,0x5f,0x56,0x4a,0x5e, 0x57,0x4c,0x60,0x55,0x4b,0x62,0x4b,0x4a,0x64,0x4a,0x52,0x6b,0x4a,0x51,0x6b,0x4a, 0x48,0x62,0x49,0x48,0x62,0x4a,0x48,0x63,0x48,0x49,0x62,0x45,0x4b,0x64,0x42,0x49, 0x5f,0x42,0x49,0x5d,0x4e,0x55,0x68,0x53,0x5a,0x6e,0x55,0x5b,0x6f,0x64,0x6a,0x7a, 0x66,0x6b,0x7c,0x6c,0x71,0x81,0x6f,0x74,0x82,0x6a,0x6f,0x7d,0x72,0x77,0x85,0x7c, 0x80,0x8c,0x82,0x86,0x90,0x84,0x88,0x92,0x70,0x75,0x82,0x61,0x66,0x76,0x59,0x5e, 0x6f,0x51,0x57,0x6a,0x4d,0x53,0x66,0x46,0x4d,0x60,0x42,0x49,0x5b,0x41,0x46,0x57, 0x3c,0x41,0x52,0x3a,0x3e,0x4e,0x36,0x3b,0x4b,0x33,0x37,0x46,0x31,0x36,0x44,0x2c, 0x30,0x3e,0x28,0x2c,0x39,0x23,0x27,0x33,0x22,0x25,0x30,0x1f,0x22,0x2d,0x1c,0x1e, 0x28,0x1a,0x1c,0x26,0x1a,0x1c,0x25,0x1a,0x1c,0x25,0x16,0x18,0x20,0x14,0x16,0x1c, 0x12,0x12,0x19,0x14,0x16,0x1c,0x14,0x16,0x1c,0x12,0x14,0x1a,0x11,0x12,0x18,0x0e, 0x10,0x15,0x0e,0x0e,0x14,0x0d,0x0e,0x12,0x0c,0x0d,0x12,0x0b,0x0c,0x10,0x0a,0x0b, 0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x0c,0x0e,0x12,0x16,0x17,0x1b, 0x1c,0x1d,0x20,0x15,0x16,0x19,0x07,0x08,0x09,0x06,0x06,0x07,0x0d,0x0e,0x10,0x0c, 0x0d,0x0e,0x0b,0x0c,0x0e,0x05,0x06,0x06,0x0e,0x0f,0x12,0x14,0x15,0x17,0x0b,0x0b, 0x0c,0x03,0x03,0x03,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,0x07,0x07,0x07,0x9d, 0xa5,0xbe,0x60,0x6c,0x93,0x52,0x55,0x80,0x52,0x53,0x7e,0x52,0x54,0x7e,0x52,0x55, 0x81,0x52,0x57,0x83,0x52,0x57,0x83,0x52,0x5b,0x85,0x52,0x5c,0x86,0x52,0x5c,0x86, 0x52,0x5d,0x86,0x52,0x5d,0x87,0x6e,0x7e,0xb7,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,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, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x04,0x05,0x04,0x04,0x05,0x06, 0x06,0x07,0x07,0x07,0x09,0x0b,0x0c,0x0e,0x1e,0x1f,0x22,0x22,0x22,0x26,0x25,0x26, 0x29,0x33,0x35,0x3a,0x35,0x39,0x47,0x3a,0x36,0x48,0x40,0x37,0x46,0x3b,0x31,0x3d, 0x3a,0x2f,0x3b,0x42,0x35,0x42,0x58,0x48,0x5a,0x5a,0x4e,0x65,0x56,0x50,0x6a,0x52, 0x52,0x70,0x52,0x52,0x6f,0x4c,0x4a,0x65,0x45,0x44,0x5c,0x45,0x49,0x61,0x51,0x54, 0x70,0x50,0x55,0x71,0x60,0x68,0x80,0x63,0x6c,0x84,0x65,0x6d,0x85,0x73,0x7a,0x8e, 0x80,0x86,0x98,0x8b,0x90,0xa0,0x91,0x96,0xa3,0x92,0x96,0xa3,0x93,0x98,0xa6,0x91, 0x96,0xa4,0x83,0x89,0x9a,0x73,0x7a,0x8f,0x68,0x70,0x87,0x5a,0x62,0x7e,0x52,0x59, 0x76,0x52,0x52,0x6f,0x4e,0x4a,0x63,0x4a,0x46,0x5c,0x52,0x4b,0x64,0x56,0x4e,0x66, 0x55,0x4a,0x60,0x50,0x42,0x53,0x5f,0x4e,0x62,0x5f,0x4e,0x62,0x51,0x46,0x5b,0x53, 0x4e,0x68,0x57,0x56,0x73,0x57,0x56,0x72,0x57,0x57,0x74,0x57,0x59,0x74,0x58,0x58, 0x73,0x56,0x54,0x70,0x5a,0x56,0x6f,0x67,0x64,0x7c,0x6e,0x6d,0x82,0x6a,0x6a,0x80, 0x62,0x62,0x7b,0x5b,0x5a,0x74,0x62,0x5a,0x72,0x60,0x58,0x6e,0x5c,0x53,0x6a,0x5a, 0x52,0x6a,0x58,0x51,0x6a,0x4f,0x51,0x6e,0x6a,0x72,0x87,0x74,0x7b,0x8c,0x7a,0x7e, 0x8d,0x84,0x88,0x94,0x76,0x79,0x84,0x80,0x86,0x99,0x76,0x76,0x8f,0x60,0x66,0x87, 0x51,0x58,0x74,0x46,0x4b,0x68,0x56,0x53,0x6f,0x5c,0x58,0x76,0x54,0x49,0x65,0x4a, 0x49,0x6a,0x78,0x7c,0x91,0x67,0x57,0x6c,0x5a,0x56,0x75,0x57,0x56,0x74,0x55,0x56, 0x72,0x55,0x55,0x71,0x56,0x54,0x6f,0x30,0x2c,0x3d,0x33,0x2f,0x39,0x3d,0x38,0x3d, 0x12,0x10,0x11,0x0d,0x0d,0x12,0x47,0x43,0x68,0x4d,0x47,0x6b,0x5c,0x4d,0x6e,0x4f, 0x56,0x7e,0x51,0x5c,0x85,0x52,0x5d,0x88,0x55,0x60,0x89,0x63,0x52,0x74,0x52,0x4f, 0x7b,0xdc,0xdf,0xe7,0x92,0x8e,0x8f,0x24,0x19,0x1e,0x31,0x24,0x2c,0x31,0x24,0x2c, 0x31,0x24,0x2b,0x44,0x34,0x40,0x41,0x40,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6d,0x72,0x80,0x8d,0x98,0xb3,0x58,0x50,0x79,0x55,0x60, 0x89,0x5e,0x6b,0x91,0x5b,0x67,0x8f,0x5c,0x69,0x8f,0x5c,0x67,0x8f,0x5d,0x6a,0x90, 0x61,0x6d,0x93,0x5f,0x6b,0x92,0x5f,0x6b,0x91,0x5e,0x6b,0x91,0x57,0x62,0x8b,0x5c, 0x52,0x77,0x5d,0x69,0x8d,0x7a,0x80,0x92,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b, 0x0e,0x0b,0x0c,0x0e,0x0d,0x0e,0x0f,0x0e,0x0e,0x11,0x0e,0x10,0x12,0x0f,0x11,0x13, 0x0f,0x11,0x14,0x0f,0x10,0x13,0x10,0x12,0x15,0x11,0x12,0x16,0x10,0x12,0x15,0x10, 0x12,0x15,0x10,0x12,0x16,0x11,0x12,0x16,0x11,0x12,0x16,0x10,0x12,0x17,0x10,0x11, 0x16,0x13,0x12,0x19,0x3f,0x38,0x44,0x6f,0x70,0x81,0x6e,0x6e,0x7d,0x5f,0x59,0x69, 0x2e,0x28,0x33,0x34,0x31,0x41,0x36,0x3b,0x4e,0x47,0x4e,0x60,0x42,0x48,0x5c,0x3a, 0x38,0x4e,0x42,0x3c,0x4e,0x47,0x3f,0x53,0x47,0x42,0x56,0x43,0x42,0x5a,0x45,0x44, 0x5d,0x43,0x45,0x5d,0x42,0x44,0x5c,0x3c,0x40,0x55,0x32,0x35,0x46,0x35,0x38,0x4c, 0x35,0x35,0x48,0x35,0x34,0x46,0x3e,0x36,0x46,0x45,0x3a,0x49,0x44,0x38,0x46,0x51, 0x43,0x54,0x55,0x46,0x57,0x56,0x46,0x57,0x55,0x45,0x56,0x58,0x48,0x5a,0x5c,0x4e, 0x62,0x60,0x56,0x6d,0x65,0x63,0x7b,0x69,0x67,0x80,0x67,0x67,0x80,0x69,0x6b,0x85, 0x52,0x58,0x75,0x52,0x5a,0x78,0x56,0x5e,0x7a,0x67,0x6f,0x86,0x8a,0x90,0x9e,0x92, 0x95,0xa5,0x88,0x8b,0x9c,0x9b,0x9b,0xa6,0xab,0xaa,0xaf,0xab,0xaa,0xb1,0xa0,0xa1, 0xaa,0xa6,0xa5,0xab,0xcb,0xcd,0xd3,0xb6,0xba,0xc4,0x86,0x8e,0xa3,0x7d,0x85,0x9b, 0x80,0x87,0x9a,0x74,0x7c,0x93,0x6a,0x72,0x8d,0x61,0x6a,0x89,0x6c,0x5a,0x70,0x64, 0x51,0x65,0x53,0x3f,0x55,0x4d,0x39,0x4f,0x55,0x41,0x59,0x42,0x31,0x44,0x5e,0x4e, 0x68,0x51,0x5a,0x7d,0x1f,0x22,0x2a,0x1e,0x21,0x29,0x1b,0x1e,0x25,0x2e,0x2d,0x3d, 0x32,0x2e,0x44,0x35,0x2e,0x47,0x5a,0x51,0x74,0x5c,0x52,0x73,0x5c,0x51,0x73,0x5d, 0x51,0x74,0x5d,0x52,0x74,0x5d,0x51,0x74,0x5c,0x51,0x73,0x5a,0x50,0x71,0x58,0x4d, 0x6f,0x4b,0x41,0x5c,0x40,0x37,0x4e,0x43,0x3c,0x52,0x46,0x3e,0x58,0x56,0x52,0x68, 0x43,0x3d,0x4d,0x37,0x3c,0x4a,0x39,0x3e,0x50,0x3a,0x41,0x53,0x3f,0x45,0x56,0x51, 0x55,0x5f,0x56,0x58,0x5e,0x68,0x63,0x6f,0x64,0x65,0x74,0x47,0x4f,0x69,0x3f,0x41, 0x5c,0x3c,0x3b,0x53,0x37,0x37,0x4d,0x33,0x34,0x48,0x30,0x32,0x46,0x31,0x32,0x46, 0x31,0x31,0x45,0x2e,0x30,0x43,0x2f,0x32,0x46,0x3e,0x3c,0x53,0x54,0x51,0x6d,0x57, 0x56,0x76,0x50,0x59,0x79,0x52,0x5a,0x76,0x2d,0x32,0x42,0x40,0x3c,0x51,0x51,0x46, 0x5a,0x56,0x4b,0x5f,0x54,0x4c,0x63,0x4e,0x4a,0x62,0x4b,0x48,0x61,0x47,0x47,0x61, 0x47,0x4b,0x65,0x47,0x46,0x5f,0x49,0x46,0x5e,0x46,0x45,0x5e,0x45,0x43,0x5d,0x3a, 0x3b,0x50,0x3b,0x40,0x51,0x42,0x47,0x56,0x40,0x45,0x55,0x3f,0x45,0x57,0x3a,0x40, 0x52,0x45,0x4c,0x63,0x45,0x4b,0x62,0x4b,0x52,0x67,0x5b,0x62,0x73,0x66,0x6c,0x7d, 0x71,0x76,0x84,0x7a,0x7e,0x8c,0x7e,0x82,0x8f,0x7f,0x84,0x8f,0x6d,0x72,0x80,0x5c, 0x62,0x72,0x57,0x5d,0x6e,0x4e,0x54,0x66,0x43,0x49,0x5e,0x3f,0x43,0x5a,0x3d,0x42, 0x58,0x3e,0x43,0x56,0x3c,0x42,0x52,0x37,0x3d,0x4c,0x32,0x36,0x46,0x2e,0x33,0x42, 0x2b,0x2f,0x3d,0x29,0x2d,0x3a,0x23,0x27,0x33,0x21,0x24,0x2f,0x20,0x23,0x2e,0x20, 0x23,0x2e,0x1b,0x1e,0x27,0x19,0x1a,0x23,0x18,0x1a,0x23,0x16,0x16,0x1e,0x15,0x15, 0x1c,0x12,0x12,0x18,0x10,0x10,0x16,0x10,0x10,0x16,0x0e,0x0e,0x13,0x0e,0x0e,0x13, 0x0c,0x0c,0x11,0x0c,0x0c,0x10,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x09, 0x08,0x0b,0x07,0x07,0x0a,0x07,0x06,0x09,0x06,0x06,0x09,0x07,0x07,0x0a,0x10,0x11, 0x14,0x1e,0x20,0x23,0x1a,0x1b,0x1e,0x11,0x12,0x16,0x05,0x05,0x06,0x04,0x04,0x05, 0x0e,0x0f,0x11,0x0f,0x10,0x11,0x13,0x13,0x14,0x0c,0x0c,0x0e,0x10,0x11,0x13,0x0f, 0x10,0x12,0x08,0x08,0x09,0x02,0x02,0x02,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,0x87,0x8c,0x9d,0x6e,0x7a,0x9d,0x52,0x5d,0x88,0x52,0x52,0x7d,0x52, 0x54,0x7e,0x52,0x55,0x80,0x52,0x55,0x81,0x52,0x57,0x83,0x52,0x5a,0x84,0x52,0x58, 0x84,0x52,0x5c,0x86,0x52,0x5d,0x86,0x52,0x5d,0x86,0x5c,0x67,0x98,0x13,0x16,0x1a, 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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04, 0x03,0x04,0x04,0x04,0x05,0x06,0x07,0x07,0x0a,0x10,0x0f,0x14,0x17,0x19,0x1f,0x2a, 0x2a,0x2e,0x2f,0x31,0x34,0x26,0x28,0x2e,0x24,0x25,0x32,0x38,0x31,0x3e,0x40,0x36, 0x44,0x45,0x39,0x47,0x48,0x3b,0x4a,0x4f,0x41,0x51,0x55,0x46,0x58,0x57,0x4e,0x66, 0x51,0x56,0x72,0x53,0x5b,0x78,0x52,0x54,0x72,0x52,0x58,0x75,0x50,0x58,0x70,0x59, 0x60,0x76,0x67,0x6e,0x84,0x6f,0x76,0x8a,0x74,0x7a,0x8e,0x6e,0x74,0x8a,0x6f,0x77, 0x8c,0x73,0x7a,0x8e,0x82,0x88,0x99,0x91,0x96,0xa3,0x95,0x9a,0xa6,0x96,0x9b,0xa8, 0x99,0x9d,0xaa,0x97,0x9c,0xa9,0x92,0x96,0xa3,0x8b,0x91,0x9f,0x86,0x8b,0x9b,0x7c, 0x82,0x96,0x71,0x78,0x8e,0x5e,0x67,0x81,0x52,0x58,0x76,0x52,0x51,0x6f,0x4e,0x4c, 0x68,0x46,0x44,0x5e,0x49,0x47,0x5f,0x52,0x4a,0x63,0x50,0x49,0x5f,0x50,0x46,0x5b, 0x4d,0x48,0x5f,0x54,0x52,0x70,0x58,0x5a,0x76,0x58,0x5b,0x77,0x57,0x5b,0x77,0x58, 0x5b,0x77,0x57,0x57,0x74,0x56,0x55,0x72,0x67,0x66,0x7d,0x78,0x78,0x8b,0x7e,0x7d, 0x8f,0x76,0x78,0x8c,0x65,0x64,0x7d,0x63,0x5b,0x72,0x61,0x5a,0x6f,0x57,0x52,0x66, 0x4e,0x46,0x5b,0x51,0x4a,0x61,0x4f,0x4a,0x62,0x4e,0x4c,0x67,0x53,0x5a,0x75,0x66, 0x6d,0x83,0x62,0x67,0x79,0x75,0x79,0x86,0x9e,0xa1,0xa7,0xa3,0xa7,0xb6,0x9b,0x96, 0xa5,0x75,0x78,0x92,0x4e,0x52,0x72,0x43,0x48,0x64,0x50,0x4e,0x6a,0x5c,0x59,0x74, 0x4e,0x4c,0x6a,0x54,0x49,0x65,0x6c,0x71,0x8c,0x72,0x6a,0x7b,0x69,0x59,0x71,0x66, 0x5b,0x77,0x5d,0x57,0x75,0x5a,0x56,0x72,0x58,0x54,0x71,0x37,0x33,0x48,0x2d,0x2b, 0x3b,0x43,0x3e,0x47,0x4b,0x47,0x4b,0x09,0x08,0x0b,0x48,0x48,0x6b,0x4c,0x49,0x70, 0x5f,0x4f,0x70,0x50,0x54,0x7d,0x50,0x5b,0x84,0x52,0x5d,0x86,0x53,0x5e,0x88,0x60, 0x53,0x77,0x62,0x53,0x77,0xc2,0xc7,0xd6,0xb9,0xb7,0xb8,0x26,0x1b,0x20,0x2f,0x23, 0x2a,0x33,0x26,0x2e,0x31,0x24,0x2c,0x3d,0x2e,0x38,0x61,0x50,0x64,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x34,0x3b,0x9c,0xa4,0xbe,0x52, 0x53,0x7e,0x52,0x4f,0x7a,0x5d,0x69,0x90,0x5a,0x66,0x8d,0x5b,0x67,0x8f,0x5d,0x69, 0x90,0x5d,0x6a,0x8f,0x5d,0x68,0x90,0x5f,0x6c,0x92,0x5f,0x6b,0x92,0x5f,0x6b,0x91, 0x5e,0x6a,0x90,0x54,0x50,0x78,0x55,0x5f,0x88,0x7d,0x86,0xa4,0x23,0x24,0x25,0x09, 0x09,0x0a,0x0a,0x0a,0x0b,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0d,0x0e, 0x10,0x0d,0x0e,0x10,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0e,0x10,0x12,0x0e,0x0f,0x12, 0x0e,0x10,0x13,0x0e,0x10,0x13,0x0f,0x10,0x14,0x0f,0x10,0x14,0x0f,0x11,0x15,0x10, 0x11,0x16,0x0e,0x10,0x14,0x0d,0x0e,0x12,0x2a,0x25,0x2f,0x77,0x7e,0x91,0x79,0x7e, 0x8f,0x77,0x79,0x8b,0x1e,0x1a,0x21,0x1b,0x1b,0x26,0x26,0x2a,0x36,0x29,0x2c,0x39, 0x27,0x29,0x36,0x2c,0x2b,0x3a,0x3a,0x35,0x46,0x44,0x3e,0x50,0x46,0x40,0x55,0x47, 0x43,0x5a,0x49,0x47,0x61,0x47,0x46,0x61,0x45,0x46,0x5e,0x41,0x43,0x5a,0x37,0x3b, 0x4e,0x30,0x35,0x46,0x31,0x35,0x46,0x33,0x35,0x48,0x38,0x37,0x4b,0x42,0x3d,0x51, 0x4a,0x42,0x54,0x46,0x3c,0x4d,0x48,0x3b,0x4b,0x53,0x44,0x55,0x54,0x44,0x56,0x56, 0x46,0x57,0x5a,0x4a,0x5c,0x59,0x4e,0x63,0x59,0x50,0x68,0x55,0x4f,0x6a,0x50,0x4e, 0x6b,0x6b,0x6c,0x83,0x51,0x56,0x72,0x53,0x5a,0x76,0x55,0x5d,0x79,0x5a,0x63,0x7d, 0x76,0x7d,0x90,0x8f,0x94,0xa5,0x7f,0x82,0x97,0x71,0x74,0x89,0x92,0x92,0x9a,0x9b, 0x9a,0xa1,0x8a,0x8b,0x95,0x86,0x86,0x8f,0xc5,0xc6,0xcd,0xb7,0xbb,0xc7,0x8b,0x92, 0xa7,0x8f,0x94,0xa6,0x8e,0x94,0xa6,0x7b,0x82,0x9a,0x79,0x80,0x99,0x66,0x70,0x8c, 0x66,0x62,0x82,0x66,0x53,0x69,0x58,0x44,0x5c,0x5d,0x48,0x62,0x56,0x41,0x5a,0x44, 0x33,0x47,0x5f,0x4e,0x69,0x4f,0x54,0x76,0x1e,0x21,0x29,0x1d,0x20,0x28,0x1a,0x1d, 0x24,0x2e,0x2c,0x3d,0x31,0x2e,0x44,0x31,0x2c,0x41,0x4c,0x45,0x63,0x5c,0x51,0x72, 0x5c,0x51,0x74,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5e,0x52,0x75,0x5e,0x51,0x74,0x5a, 0x51,0x74,0x57,0x4e,0x71,0x55,0x4a,0x6a,0x4c,0x41,0x5b,0x54,0x47,0x62,0x4d,0x43, 0x5d,0x54,0x4e,0x63,0x47,0x40,0x50,0x2f,0x34,0x44,0x34,0x39,0x4b,0x37,0x3a,0x4e, 0x3a,0x3f,0x50,0x4d,0x51,0x5a,0x5c,0x5e,0x64,0x72,0x6c,0x78,0x65,0x64,0x74,0x4f, 0x57,0x72,0x41,0x45,0x61,0x42,0x41,0x5f,0x40,0x41,0x5c,0x3b,0x3c,0x54,0x3a,0x3c, 0x56,0x37,0x3b,0x53,0x31,0x35,0x4a,0x2d,0x31,0x45,0x2d,0x2f,0x42,0x2e,0x2f,0x41, 0x31,0x33,0x46,0x45,0x44,0x5d,0x48,0x47,0x61,0x4c,0x4a,0x64,0x33,0x2a,0x34,0x46, 0x3a,0x4a,0x4f,0x46,0x5b,0x4a,0x48,0x62,0x4b,0x4f,0x6a,0x4a,0x50,0x6a,0x48,0x47, 0x61,0x45,0x44,0x5c,0x44,0x43,0x5b,0x46,0x45,0x5c,0x46,0x44,0x5b,0x3d,0x3c,0x52, 0x36,0x37,0x4b,0x39,0x3e,0x52,0x49,0x4f,0x61,0x4a,0x4f,0x60,0x46,0x4d,0x5f,0x3e, 0x42,0x59,0x3a,0x3a,0x50,0x3d,0x3d,0x53,0x43,0x42,0x5a,0x42,0x42,0x5a,0x43,0x47, 0x5f,0x4f,0x56,0x6b,0x59,0x5f,0x72,0x62,0x68,0x7a,0x69,0x6e,0x7e,0x69,0x6e,0x7d, 0x5e,0x63,0x73,0x56,0x5c,0x6c,0x51,0x56,0x68,0x42,0x48,0x5d,0x3f,0x3f,0x55,0x36, 0x35,0x4a,0x31,0x32,0x43,0x36,0x3c,0x4d,0x36,0x3b,0x4a,0x32,0x36,0x46,0x2e,0x32, 0x40,0x2a,0x2e,0x3b,0x27,0x2b,0x38,0x24,0x27,0x33,0x20,0x23,0x2e,0x1e,0x20,0x2b, 0x1a,0x1d,0x26,0x1a,0x1e,0x26,0x19,0x1a,0x23,0x17,0x18,0x20,0x17,0x17,0x1f,0x15, 0x14,0x1c,0x12,0x12,0x1a,0x10,0x10,0x16,0x0f,0x0f,0x15,0x0e,0x0e,0x12,0x0d,0x0c, 0x11,0x0c,0x0c,0x0f,0x0b,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x09,0x0c,0x09,0x09,0x0b, 0x08,0x08,0x0a,0x08,0x07,0x0a,0x07,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x07, 0x08,0x0a,0x14,0x16,0x18,0x1f,0x21,0x24,0x19,0x1a,0x1e,0x0e,0x10,0x13,0x04,0x04, 0x06,0x02,0x02,0x03,0x0a,0x0a,0x0c,0x0e,0x0e,0x0f,0x19,0x1a,0x1b,0x16,0x18,0x1a, 0x0f,0x0f,0x12,0x13,0x13,0x15,0x0b,0x0b,0x0c,0x03,0x03,0x03,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,0x41,0x43,0x48,0x81,0x8c,0xab,0x56,0x62,0x8b, 0x52,0x53,0x7d,0x52,0x53,0x7d,0x52,0x54,0x7e,0x52,0x54,0x80,0x52,0x57,0x82,0x52, 0x57,0x82,0x52,0x57,0x82,0x52,0x58,0x84,0x52,0x57,0x83,0x52,0x5a,0x84,0x54,0x5c, 0x88,0x51,0x5a,0x85,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,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,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x05,0x05,0x06,0x11,0x0e,0x12,0x23,0x1e,0x26, 0x20,0x23,0x2e,0x2e,0x30,0x36,0x25,0x26,0x2b,0x1f,0x21,0x26,0x29,0x2c,0x36,0x2d, 0x2c,0x3c,0x3c,0x36,0x46,0x49,0x3f,0x51,0x52,0x44,0x55,0x55,0x46,0x57,0x55,0x49, 0x5c,0x4d,0x4c,0x68,0x62,0x6a,0x83,0x55,0x5d,0x79,0x5a,0x62,0x7c,0x6e,0x75,0x8b, 0x76,0x7c,0x90,0x7c,0x82,0x92,0x80,0x86,0x95,0x85,0x8a,0x99,0x7f,0x85,0x95,0x6f, 0x76,0x8a,0x67,0x6e,0x85,0x6b,0x73,0x89,0x7f,0x86,0x96,0x91,0x96,0xa2,0x96,0x9a, 0xa7,0x98,0x9d,0xa8,0x99,0x9e,0xa9,0x98,0x9d,0xa8,0x96,0x9a,0xa6,0x91,0x96,0xa2, 0x91,0x96,0xa3,0x91,0x96,0xa2,0x8b,0x90,0xa0,0x7e,0x85,0x96,0x6a,0x72,0x89,0x53, 0x5b,0x74,0x42,0x48,0x60,0x41,0x44,0x5b,0x47,0x48,0x62,0x4b,0x4c,0x68,0x4e,0x50, 0x6b,0x51,0x51,0x6d,0x52,0x52,0x70,0x53,0x55,0x72,0x56,0x5d,0x7a,0x5b,0x62,0x7d, 0x5c,0x63,0x7e,0x59,0x60,0x7b,0x56,0x5a,0x76,0x5e,0x5f,0x7a,0x75,0x76,0x8a,0x7d, 0x80,0x92,0x7e,0x82,0x95,0x74,0x78,0x8e,0x60,0x5f,0x78,0x62,0x5a,0x72,0x60,0x58, 0x6f,0x54,0x4d,0x62,0x4b,0x46,0x5a,0x47,0x42,0x53,0x45,0x40,0x52,0x52,0x4a,0x60, 0x4b,0x4c,0x67,0x67,0x6e,0x84,0x5e,0x64,0x77,0x6a,0x6e,0x7c,0x88,0x8a,0x93,0xb4, 0xb8,0xc5,0xb3,0xaf,0xb9,0xa2,0xa3,0xb5,0x63,0x6b,0x86,0x48,0x4f,0x6c,0x4c,0x4c, 0x66,0x54,0x52,0x6c,0x53,0x53,0x72,0x55,0x49,0x65,0x5a,0x60,0x7f,0x8e,0x8e,0x9d, 0x59,0x48,0x5b,0x63,0x51,0x66,0x68,0x56,0x6c,0x69,0x59,0x71,0x66,0x5a,0x75,0x4e, 0x43,0x5b,0x32,0x2b,0x3e,0x33,0x31,0x43,0x5a,0x53,0x5f,0x34,0x33,0x34,0x48,0x47, 0x6c,0x4d,0x4a,0x71,0x60,0x50,0x71,0x50,0x51,0x7c,0x51,0x59,0x82,0x52,0x5d,0x87, 0x54,0x5f,0x88,0x52,0x50,0x7b,0x64,0x52,0x73,0xa1,0xa9,0xc0,0xde,0xdd,0xdf,0x23, 0x18,0x1d,0x31,0x24,0x2b,0x36,0x28,0x30,0x32,0x25,0x2d,0x39,0x2b,0x34,0x6b,0x57, 0x6d,0x02,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x07, 0x9a,0xa2,0xb9,0x64,0x71,0x96,0x64,0x4e,0x6c,0x5e,0x6b,0x91,0x5a,0x65,0x8d,0x5a, 0x66,0x8d,0x5c,0x67,0x8f,0x5c,0x69,0x8e,0x5d,0x69,0x8f,0x5f,0x6a,0x91,0x5e,0x6a, 0x91,0x61,0x6c,0x92,0x61,0x6c,0x92,0x52,0x58,0x82,0x52,0x50,0x79,0x6a,0x77,0x99, 0x62,0x65,0x6b,0x07,0x07,0x09,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a, 0x0a,0x0d,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0d,0x0e,0x10,0x0c,0x0d, 0x10,0x0e,0x0e,0x11,0x17,0x17,0x1b,0x25,0x25,0x29,0x2a,0x2b,0x2e,0x2d,0x2e,0x31, 0x2a,0x2b,0x2e,0x22,0x23,0x26,0x1a,0x1b,0x1d,0x0c,0x0d,0x11,0x12,0x11,0x15,0x52, 0x57,0x73,0x81,0x87,0x9b,0x82,0x87,0x9a,0x2f,0x2c,0x35,0x14,0x16,0x1b,0x20,0x22, 0x28,0x21,0x23,0x2a,0x1e,0x22,0x2a,0x1f,0x20,0x2b,0x2c,0x2b,0x3b,0x37,0x35,0x46, 0x3e,0x38,0x4a,0x43,0x3e,0x52,0x47,0x45,0x5c,0x49,0x48,0x62,0x49,0x48,0x62,0x45, 0x45,0x5e,0x3f,0x3f,0x56,0x3b,0x41,0x55,0x39,0x3e,0x52,0x38,0x3d,0x50,0x39,0x3b, 0x4f,0x3a,0x3a,0x4e,0x3e,0x3a,0x4e,0x49,0x40,0x52,0x48,0x3e,0x50,0x48,0x3b,0x49, 0x51,0x42,0x53,0x57,0x47,0x5a,0x58,0x48,0x5a,0x5a,0x4a,0x5d,0x5b,0x50,0x66,0x59, 0x50,0x68,0x50,0x4e,0x6a,0x4f,0x4e,0x6a,0x50,0x52,0x6f,0x52,0x5a,0x76,0x56,0x5e, 0x7a,0x5a,0x62,0x7d,0x5f,0x68,0x81,0x74,0x7a,0x8f,0x8e,0x90,0xa1,0x64,0x68,0x80, 0x6e,0x71,0x84,0x84,0x84,0x8d,0x74,0x74,0x7d,0x6a,0x69,0x72,0xb1,0xb2,0xba,0xbb, 0xbe,0xc8,0xa3,0xa9,0xb6,0x95,0x99,0xa9,0x93,0x98,0xa9,0x8a,0x90,0xa3,0x76,0x7d, 0x95,0x62,0x6c,0x88,0x65,0x6e,0x8e,0x64,0x50,0x68,0x61,0x52,0x71,0x5f,0x4a,0x66, 0x59,0x44,0x5d,0x4a,0x38,0x4c,0x5e,0x4d,0x68,0x4f,0x4f,0x73,0x1d,0x1f,0x27,0x1c, 0x1e,0x26,0x1a,0x1c,0x22,0x2c,0x2b,0x3b,0x30,0x2e,0x44,0x31,0x2b,0x42,0x50,0x49, 0x68,0x5c,0x51,0x73,0x5b,0x51,0x76,0x5d,0x52,0x75,0x5e,0x51,0x74,0x5e,0x52,0x75, 0x5e,0x51,0x74,0x5e,0x51,0x74,0x5b,0x50,0x71,0x55,0x4d,0x6f,0x55,0x4b,0x6b,0x54, 0x4b,0x68,0x54,0x4a,0x68,0x61,0x5c,0x75,0x42,0x40,0x52,0x30,0x35,0x44,0x33,0x38, 0x4a,0x34,0x39,0x4a,0x38,0x3c,0x4a,0x3d,0x40,0x4a,0x3d,0x3f,0x46,0x5b,0x56,0x61, 0x61,0x60,0x71,0x51,0x5a,0x76,0x45,0x47,0x63,0x43,0x46,0x63,0x44,0x48,0x66,0x3d, 0x41,0x5d,0x3b,0x40,0x5c,0x3a,0x40,0x5d,0x3a,0x40,0x5a,0x33,0x39,0x51,0x35,0x38, 0x4f,0x36,0x38,0x51,0x38,0x38,0x50,0x48,0x44,0x5b,0x2a,0x2c,0x3c,0x27,0x27,0x37, 0x1c,0x16,0x1a,0x42,0x39,0x49,0x45,0x44,0x5d,0x48,0x4d,0x66,0x51,0x59,0x72,0x51, 0x59,0x71,0x4a,0x4c,0x66,0x46,0x45,0x5e,0x3b,0x39,0x4d,0x43,0x41,0x56,0x47,0x44, 0x5b,0x3f,0x3e,0x54,0x40,0x41,0x58,0x42,0x49,0x5d,0x4b,0x51,0x61,0x4d,0x52,0x62, 0x4a,0x50,0x62,0x42,0x48,0x5e,0x41,0x43,0x5b,0x38,0x3a,0x4e,0x3a,0x3a,0x4f,0x41, 0x40,0x57,0x44,0x42,0x5a,0x43,0x43,0x5b,0x42,0x48,0x60,0x47,0x4e,0x64,0x4f,0x56, 0x6a,0x52,0x58,0x6a,0x52,0x58,0x68,0x4e,0x54,0x64,0x45,0x4b,0x5e,0x3d,0x3d,0x53, 0x36,0x35,0x49,0x36,0x35,0x48,0x32,0x34,0x46,0x2a,0x2f,0x3d,0x2b,0x2f,0x3c,0x2b, 0x2f,0x3e,0x2a,0x2d,0x3b,0x26,0x2a,0x37,0x25,0x28,0x35,0x21,0x24,0x30,0x1e,0x21, 0x2b,0x1c,0x1e,0x27,0x1b,0x1c,0x25,0x1b,0x1b,0x24,0x1b,0x1b,0x25,0x1b,0x1a,0x22, 0x19,0x18,0x20,0x17,0x16,0x1e,0x13,0x12,0x18,0x10,0x10,0x16,0x0e,0x0e,0x14,0x0e, 0x0d,0x12,0x0d,0x0c,0x11,0x0b,0x0a,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x09, 0x0c,0x09,0x08,0x0b,0x08,0x08,0x0a,0x08,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x08, 0x06,0x06,0x07,0x0a,0x0a,0x0d,0x18,0x19,0x1b,0x20,0x22,0x26,0x1a,0x1a,0x1f,0x0d, 0x0e,0x11,0x05,0x06,0x07,0x02,0x02,0x03,0x06,0x06,0x08,0x08,0x08,0x0a,0x12,0x12, 0x14,0x15,0x16,0x19,0x14,0x15,0x17,0x1a,0x1b,0x1e,0x0d,0x0d,0x0e,0x02,0x02,0x02, 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,0x11,0x12,0x13,0x91,0x9a, 0xb5,0x5e,0x6a,0x91,0x52,0x54,0x7e,0x52,0x50,0x7c,0x52,0x52,0x7d,0x52,0x53,0x7e, 0x52,0x53,0x7e,0x52,0x54,0x7e,0x52,0x56,0x82,0x52,0x55,0x81,0x52,0x58,0x84,0x52, 0x57,0x83,0x52,0x57,0x83,0x64,0x6b,0xa1,0x03,0x03,0x03,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,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,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x05,0x08,0x07,0x09,0x19,0x14, 0x1a,0x30,0x2a,0x34,0x26,0x26,0x33,0x2b,0x2e,0x36,0x23,0x25,0x2b,0x28,0x2a,0x2f, 0x32,0x36,0x3e,0x2f,0x33,0x41,0x30,0x34,0x45,0x37,0x36,0x4a,0x4a,0x42,0x56,0x51, 0x48,0x5e,0x4c,0x47,0x5e,0x4e,0x55,0x6e,0x61,0x69,0x81,0x63,0x6b,0x84,0x74,0x7b, 0x8f,0x83,0x8a,0x9a,0x8a,0x8f,0x9d,0x8a,0x8e,0x9c,0x8b,0x90,0x9e,0x8e,0x93,0x9f, 0x7f,0x86,0x95,0x62,0x69,0x7f,0x52,0x5a,0x74,0x62,0x69,0x7f,0x77,0x7e,0x8e,0x87, 0x8d,0x9c,0x8e,0x94,0xa1,0x95,0x99,0xa6,0x9a,0x9e,0xa9,0x9c,0xa0,0xab,0x99,0x9d, 0xa7,0x96,0x9a,0xa6,0x92,0x97,0xa4,0x92,0x96,0xa3,0x95,0x99,0xa6,0x8f,0x94,0xa2, 0x82,0x88,0x99,0x77,0x7e,0x91,0x6c,0x74,0x8a,0x64,0x6b,0x83,0x52,0x5a,0x75,0x56, 0x5f,0x79,0x58,0x60,0x7a,0x57,0x60,0x7b,0x57,0x5f,0x7a,0x59,0x61,0x7c,0x5e,0x66, 0x7f,0x5e,0x66,0x7f,0x57,0x60,0x7a,0x56,0x5c,0x77,0x59,0x5a,0x76,0x61,0x62,0x7b, 0x75,0x76,0x8c,0x7e,0x83,0x95,0x76,0x7a,0x8f,0x6b,0x6b,0x83,0x6a,0x65,0x7b,0x66, 0x5f,0x76,0x5c,0x55,0x6e,0x57,0x52,0x6c,0x52,0x4b,0x62,0x48,0x41,0x55,0x53,0x47, 0x5b,0x50,0x45,0x59,0x4c,0x47,0x5e,0x52,0x59,0x71,0x60,0x66,0x7a,0x79,0x7e,0x8b, 0x98,0x9a,0xa0,0xaf,0xb3,0xc0,0xa4,0xa1,0xb0,0x8e,0x91,0xa7,0x78,0x7f,0x98,0x52, 0x59,0x75,0x4c,0x4e,0x6a,0x50,0x4f,0x6a,0x54,0x54,0x71,0x50,0x48,0x65,0x4d,0x51, 0x73,0x8e,0x93,0xa7,0x5a,0x4f,0x5d,0x55,0x45,0x55,0x5c,0x4b,0x5d,0x60,0x4d,0x62, 0x63,0x52,0x66,0x5f,0x4e,0x63,0x33,0x28,0x39,0x33,0x2b,0x3b,0x33,0x34,0x47,0x81, 0x80,0x86,0x41,0x40,0x63,0x4f,0x4b,0x74,0x5e,0x51,0x74,0x51,0x51,0x7a,0x51,0x5a, 0x83,0x51,0x5c,0x87,0x54,0x5f,0x88,0x52,0x57,0x81,0x64,0x4e,0x6c,0x85,0x90,0xae, 0xeb,0xee,0xf2,0x30,0x27,0x2b,0x30,0x23,0x2a,0x34,0x27,0x2f,0x35,0x27,0x30,0x34, 0x27,0x2f,0x62,0x4e,0x61,0x12,0x13,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5d,0x62,0x72,0x82,0x8d,0xab,0x64,0x52,0x71,0x5b,0x66,0x8d, 0x5b,0x67,0x8f,0x5a,0x65,0x8c,0x5b,0x66,0x8d,0x5c,0x67,0x8f,0x5d,0x6a,0x8f,0x5d, 0x6a,0x90,0x5f,0x6b,0x92,0x5e,0x6a,0x91,0x5d,0x6a,0x90,0x5a,0x65,0x8b,0x58,0x53, 0x78,0x5e,0x69,0x90,0x89,0x90,0xa1,0x06,0x06,0x08,0x07,0x08,0x09,0x08,0x09,0x0a, 0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x28,0x29,0x2e,0x9e, 0xa0,0xa3,0x76,0x78,0x7b,0x0b,0x0c,0x0e,0x14,0x15,0x18,0x1c,0x1d,0x20,0x16,0x18, 0x1a,0x12,0x13,0x16,0x1b,0x1c,0x20,0x21,0x22,0x25,0x18,0x19,0x1d,0x0c,0x0d,0x10, 0x0b,0x0b,0x0f,0x4b,0x45,0x5c,0x74,0x7e,0x98,0x8c,0x93,0xa7,0x57,0x53,0x61,0x10, 0x12,0x15,0x1a,0x1c,0x22,0x1f,0x22,0x28,0x22,0x25,0x2c,0x24,0x26,0x2e,0x29,0x2c, 0x39,0x2c,0x2e,0x3e,0x2e,0x2e,0x3e,0x36,0x33,0x45,0x3e,0x3a,0x4e,0x43,0x42,0x5a, 0x48,0x46,0x60,0x48,0x46,0x61,0x44,0x43,0x5c,0x42,0x45,0x5e,0x42,0x47,0x5e,0x3f, 0x42,0x59,0x3d,0x3e,0x55,0x3b,0x3c,0x52,0x3a,0x3a,0x4e,0x41,0x3c,0x50,0x4a,0x41, 0x54,0x4c,0x42,0x52,0x47,0x3b,0x4b,0x52,0x45,0x57,0x57,0x48,0x5a,0x5a,0x4a,0x5c, 0x5c,0x4e,0x62,0x5a,0x50,0x69,0x4f,0x4e,0x6a,0x4e,0x4e,0x6a,0x4e,0x4f,0x6b,0x50, 0x54,0x71,0x53,0x5b,0x77,0x56,0x5f,0x7a,0x5b,0x64,0x7e,0x59,0x62,0x7b,0x63,0x68, 0x82,0x6a,0x6f,0x84,0x5a,0x5f,0x76,0x7b,0x7b,0x87,0x78,0x79,0x84,0x64,0x64,0x6e, 0x9a,0x9c,0xa4,0xad,0xb1,0xba,0xa1,0xa6,0xb2,0x90,0x95,0xa5,0x8a,0x8f,0xa1,0x86, 0x8b,0x9e,0x7d,0x83,0x99,0x73,0x7c,0x95,0x70,0x79,0x96,0x61,0x68,0x88,0x6a,0x5d, 0x78,0x60,0x4d,0x6b,0x59,0x44,0x5d,0x4a,0x38,0x4d,0x5c,0x4b,0x67,0x4c,0x4f,0x71, 0x1b,0x1e,0x25,0x1b,0x1e,0x25,0x1a,0x1b,0x22,0x2c,0x2b,0x3b,0x31,0x2e,0x44,0x32, 0x2d,0x43,0x58,0x4f,0x71,0x59,0x51,0x74,0x5d,0x52,0x74,0x5d,0x52,0x75,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x5e,0x53,0x75,0x5e,0x52,0x75,0x5d,0x51,0x73,0x58,0x4f,0x72, 0x57,0x4e,0x6f,0x53,0x4d,0x6c,0x4c,0x49,0x6b,0x5e,0x5d,0x7b,0x3e,0x41,0x50,0x34, 0x38,0x43,0x37,0x3b,0x49,0x39,0x3e,0x4b,0x3a,0x3d,0x48,0x36,0x3a,0x42,0x30,0x32, 0x3a,0x49,0x45,0x50,0x59,0x57,0x69,0x4d,0x55,0x74,0x45,0x47,0x64,0x45,0x48,0x64, 0x47,0x4b,0x6b,0x46,0x49,0x6a,0x44,0x4a,0x68,0x40,0x48,0x66,0x40,0x47,0x67,0x3a, 0x40,0x5c,0x37,0x3c,0x57,0x35,0x3b,0x54,0x37,0x3a,0x52,0x36,0x36,0x4b,0x2a,0x2b, 0x3c,0x2a,0x2c,0x3d,0x24,0x1e,0x26,0x37,0x31,0x3e,0x46,0x40,0x55,0x45,0x43,0x5b, 0x49,0x4b,0x66,0x4a,0x50,0x6a,0x42,0x40,0x59,0x49,0x43,0x58,0x4a,0x45,0x5b,0x40, 0x3c,0x51,0x42,0x3d,0x52,0x40,0x3f,0x54,0x39,0x39,0x4d,0x39,0x3d,0x51,0x46,0x4c, 0x5e,0x4c,0x52,0x62,0x4f,0x55,0x65,0x4b,0x51,0x64,0x43,0x4a,0x60,0x41,0x45,0x5d, 0x3d,0x3d,0x52,0x39,0x38,0x4d,0x3f,0x3c,0x4f,0x40,0x3f,0x56,0x40,0x44,0x5a,0x41, 0x43,0x5b,0x3f,0x46,0x5b,0x42,0x48,0x5b,0x45,0x4a,0x5c,0x42,0x47,0x58,0x38,0x3e, 0x51,0x32,0x31,0x43,0x32,0x32,0x44,0x35,0x35,0x49,0x31,0x36,0x46,0x2c,0x31,0x3e, 0x25,0x29,0x35,0x1f,0x22,0x2c,0x1c,0x1f,0x28,0x20,0x24,0x2e,0x22,0x25,0x2f,0x23, 0x25,0x2f,0x1f,0x21,0x2c,0x1f,0x1f,0x29,0x1e,0x1d,0x26,0x1d,0x1c,0x26,0x1d,0x1b, 0x24,0x1c,0x1a,0x23,0x1c,0x1a,0x23,0x1a,0x19,0x21,0x15,0x14,0x1b,0x10,0x0f,0x16, 0x0e,0x0e,0x12,0x0d,0x0d,0x11,0x0c,0x0c,0x0f,0x0c,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a, 0x0a,0x0d,0x0a,0x0a,0x0d,0x08,0x07,0x0a,0x08,0x08,0x0a,0x07,0x07,0x09,0x07,0x06, 0x09,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x09,0x12,0x13,0x16,0x1d,0x1e,0x21, 0x1d,0x1e,0x22,0x12,0x13,0x17,0x0e,0x0e,0x12,0x0e,0x0f,0x12,0x0c,0x0d,0x0f,0x05, 0x06,0x07,0x07,0x08,0x0a,0x0e,0x0e,0x11,0x14,0x15,0x17,0x12,0x13,0x14,0x06,0x06, 0x07,0x02,0x02,0x02,0x02,0x02,0x02,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,0x9f,0xa6,0xba,0x6a,0x75,0x9a,0x52,0x57,0x82,0x52,0x4f,0x7b,0x52,0x52, 0x7c,0x52,0x52,0x7c,0x52,0x52,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x55,0x80, 0x52,0x55,0x80,0x52,0x55,0x81,0x52,0x55,0x81,0x58,0x5d,0x8b,0x21,0x22,0x35,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x06,0x06,0x08,0x09, 0x0a,0x0c,0x12,0x10,0x16,0x1f,0x1c,0x26,0x1d,0x1e,0x29,0x1e,0x20,0x26,0x20,0x22, 0x27,0x2e,0x30,0x36,0x39,0x3b,0x42,0x39,0x3d,0x46,0x3e,0x42,0x4e,0x32,0x36,0x47, 0x39,0x37,0x4a,0x3f,0x3f,0x56,0x45,0x44,0x5e,0x4b,0x53,0x6b,0x64,0x6b,0x81,0x73, 0x7a,0x8e,0x85,0x8a,0x9a,0x94,0x98,0xa4,0x89,0x8e,0x9c,0x7e,0x83,0x94,0x82,0x87, 0x96,0x89,0x8e,0x9c,0x6a,0x70,0x82,0x43,0x46,0x5e,0x46,0x45,0x5d,0x56,0x5b,0x75, 0x70,0x75,0x89,0x7a,0x7e,0x90,0x80,0x86,0x97,0x8c,0x92,0xa1,0x98,0x9d,0xa8,0x9e, 0xa2,0xad,0x9e,0xa2,0xac,0x97,0x9a,0xa6,0x94,0x99,0xa5,0x95,0x9a,0xa6,0x97,0x9c, 0xa9,0x95,0x9a,0xa6,0x93,0x98,0xa4,0x8e,0x94,0xa2,0x84,0x8a,0x99,0x72,0x78,0x8c, 0x62,0x6a,0x7f,0x61,0x68,0x7e,0x65,0x6c,0x82,0x6a,0x72,0x88,0x68,0x6f,0x87,0x66, 0x6e,0x85,0x5f,0x68,0x7f,0x59,0x61,0x7b,0x58,0x5e,0x78,0x5a,0x5b,0x76,0x5b,0x5b, 0x76,0x5f,0x5f,0x7a,0x66,0x68,0x7f,0x6e,0x72,0x8a,0x6e,0x6d,0x84,0x73,0x70,0x84, 0x77,0x74,0x86,0x73,0x70,0x85,0x66,0x64,0x7c,0x5b,0x52,0x6a,0x4e,0x46,0x5b,0x48, 0x42,0x53,0x46,0x3f,0x51,0x49,0x42,0x55,0x44,0x43,0x5c,0x5e,0x63,0x76,0x65,0x6a, 0x7b,0x78,0x7d,0x89,0x84,0x88,0x91,0xb4,0xb7,0xc5,0xb7,0xb2,0xbd,0x7a,0x7f,0x9b, 0x5c,0x64,0x83,0x51,0x59,0x75,0x49,0x4c,0x6b,0x4d,0x4d,0x67,0x51,0x52,0x6d,0x48, 0x4c,0x6c,0x4e,0x48,0x67,0x75,0x7e,0x97,0x7d,0x77,0x85,0x52,0x41,0x52,0x58,0x48, 0x59,0x56,0x45,0x55,0x57,0x46,0x57,0x57,0x46,0x56,0x2f,0x25,0x33,0x2e,0x24,0x31, 0x33,0x29,0x39,0x3f,0x42,0x58,0x4d,0x4b,0x6c,0x4f,0x4e,0x77,0x5e,0x51,0x75,0x55, 0x4f,0x77,0x51,0x56,0x81,0x52,0x5d,0x85,0x53,0x5f,0x88,0x54,0x5f,0x88,0x64,0x52, 0x72,0x77,0x82,0xa3,0xf0,0xf1,0xf5,0x4f,0x48,0x4c,0x2e,0x21,0x28,0x36,0x28,0x30, 0x35,0x27,0x2f,0x34,0x27,0x2f,0x51,0x3f,0x4e,0x26,0x25,0x33,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x2f,0x38,0x90,0x99,0xb4,0x52,0x4f, 0x7a,0x52,0x5c,0x85,0x5d,0x6a,0x90,0x5a,0x65,0x8c,0x5d,0x6a,0x8f,0x5c,0x67,0x8f, 0x5c,0x69,0x8f,0x5c,0x67,0x8e,0x5e,0x6a,0x91,0x5d,0x69,0x90,0x5d,0x68,0x90,0x5a, 0x66,0x8e,0x52,0x4f,0x79,0x53,0x5d,0x86,0x80,0x8b,0xa8,0x2e,0x2f,0x31,0x06,0x06, 0x07,0x07,0x08,0x09,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x20,0x1b,0x22, 0x66,0x64,0x73,0xba,0xbd,0xc8,0xd4,0xd4,0xd9,0x93,0x97,0xa0,0x41,0x42,0x47,0x0a, 0x0b,0x0e,0x0b,0x0d,0x10,0x0c,0x0d,0x10,0x0c,0x0d,0x10,0x0c,0x0d,0x11,0x0c,0x0e, 0x12,0x0b,0x0c,0x0f,0x0b,0x0c,0x0f,0x41,0x37,0x45,0x5e,0x69,0x8d,0x94,0x9b,0xb0, 0x82,0x83,0x97,0x0b,0x0c,0x0e,0x15,0x16,0x1b,0x1c,0x1e,0x25,0x22,0x25,0x2b,0x23, 0x26,0x2d,0x27,0x2a,0x33,0x2a,0x2d,0x3a,0x29,0x2c,0x3a,0x2a,0x2a,0x39,0x30,0x2f, 0x41,0x3a,0x3a,0x4e,0x42,0x40,0x58,0x45,0x43,0x5b,0x46,0x45,0x5e,0x46,0x46,0x5f, 0x47,0x4a,0x64,0x47,0x4d,0x66,0x44,0x46,0x5f,0x3f,0x3f,0x56,0x3f,0x3e,0x56,0x3e, 0x3d,0x53,0x42,0x3d,0x52,0x49,0x41,0x54,0x4a,0x42,0x53,0x48,0x3e,0x4e,0x53,0x46, 0x58,0x5a,0x4a,0x5d,0x5b,0x4e,0x62,0x5a,0x50,0x68,0x4f,0x4e,0x69,0x4e,0x4c,0x67, 0x4e,0x4e,0x6a,0x4e,0x4e,0x6a,0x50,0x51,0x6e,0x51,0x58,0x75,0x56,0x5f,0x7a,0x61, 0x68,0x80,0x5a,0x5d,0x7a,0x59,0x5c,0x71,0x56,0x58,0x6d,0x6a,0x6c,0x79,0x73,0x73, 0x7f,0x68,0x68,0x72,0x98,0x9a,0xa3,0x9c,0xa0,0xac,0x96,0x9b,0xaa,0x88,0x8f,0x9f, 0x7d,0x83,0x97,0x80,0x86,0x9a,0x8a,0x91,0xa5,0x87,0x8e,0xa4,0x71,0x7a,0x95,0x5f, 0x68,0x88,0x66,0x5c,0x79,0x66,0x57,0x72,0x5e,0x48,0x61,0x4e,0x3c,0x52,0x5d,0x4c, 0x67,0x4a,0x4c,0x6d,0x1a,0x1c,0x24,0x1b,0x1e,0x26,0x19,0x1b,0x22,0x2a,0x29,0x39, 0x31,0x2e,0x43,0x30,0x2a,0x41,0x55,0x4c,0x6d,0x5a,0x51,0x74,0x5d,0x51,0x73,0x5d, 0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x53,0x75,0x5e,0x53,0x75,0x5e,0x51, 0x74,0x5a,0x51,0x74,0x58,0x50,0x72,0x58,0x51,0x71,0x4e,0x4e,0x70,0x56,0x61,0x80, 0x47,0x49,0x56,0x34,0x37,0x40,0x36,0x3a,0x45,0x36,0x3a,0x43,0x34,0x37,0x41,0x31, 0x33,0x3b,0x2a,0x2d,0x34,0x40,0x3b,0x47,0x57,0x55,0x68,0x4d,0x53,0x75,0x45,0x46, 0x65,0x47,0x47,0x66,0x4b,0x4c,0x6e,0x4a,0x4e,0x71,0x48,0x4d,0x6f,0x46,0x4c,0x6e, 0x43,0x4d,0x6e,0x44,0x4c,0x6e,0x3e,0x45,0x65,0x39,0x3f,0x5a,0x36,0x3b,0x55,0x33, 0x37,0x4d,0x2f,0x31,0x45,0x31,0x33,0x47,0x1e,0x1a,0x22,0x31,0x2b,0x38,0x46,0x3d, 0x4e,0x48,0x41,0x55,0x4c,0x47,0x5e,0x47,0x41,0x57,0x4f,0x47,0x5c,0x56,0x4b,0x62, 0x4f,0x49,0x60,0x4c,0x47,0x5f,0x45,0x41,0x58,0x3f,0x3d,0x54,0x40,0x3f,0x55,0x3f, 0x3f,0x56,0x45,0x4b,0x5e,0x6d,0x71,0x7d,0x5d,0x62,0x70,0x4d,0x53,0x66,0x42,0x48, 0x5e,0x41,0x44,0x5c,0x40,0x42,0x59,0x3e,0x3d,0x53,0x38,0x37,0x4b,0x35,0x36,0x48, 0x35,0x38,0x4a,0x3a,0x3a,0x4f,0x3d,0x3c,0x52,0x3a,0x3e,0x51,0x37,0x3d,0x4c,0x32, 0x37,0x45,0x28,0x2b,0x38,0x2a,0x2b,0x3a,0x31,0x31,0x42,0x33,0x36,0x47,0x35,0x39, 0x48,0x32,0x36,0x45,0x2e,0x32,0x41,0x2b,0x2f,0x3d,0x26,0x2a,0x36,0x29,0x2b,0x37, 0x2c,0x2e,0x39,0x2a,0x2b,0x37,0x27,0x27,0x32,0x22,0x22,0x2d,0x1f,0x1e,0x28,0x1e, 0x1d,0x26,0x1d,0x1c,0x25,0x1b,0x19,0x21,0x1b,0x19,0x22,0x1b,0x1a,0x22,0x18,0x17, 0x1e,0x10,0x0f,0x16,0x0e,0x0e,0x12,0x0d,0x0c,0x11,0x0d,0x0c,0x10,0x0c,0x0c,0x0f, 0x0a,0x0a,0x0e,0x0a,0x09,0x0c,0x0a,0x09,0x0c,0x08,0x08,0x0a,0x08,0x08,0x0a,0x08, 0x07,0x0a,0x07,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x09,0x0a, 0x0c,0x16,0x16,0x19,0x1d,0x1e,0x22,0x14,0x16,0x19,0x1a,0x1c,0x20,0x21,0x22,0x26, 0x16,0x17,0x1a,0x0d,0x0e,0x0f,0x10,0x12,0x14,0x16,0x16,0x1a,0x18,0x19,0x1a,0x0f, 0x10,0x11,0x04,0x04,0x05,0x02,0x02,0x02,0x02,0x02,0x02,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,0x63,0x65,0x6c,0x81,0x8b,0xab,0x53,0x5e,0x88,0x52, 0x50,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x53, 0x7d,0x52,0x53,0x7e,0x52,0x54,0x7e,0x52,0x55,0x80,0x52,0x54,0x7e,0x53,0x56,0x82, 0x5e,0x61,0x94,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,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,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x02,0x03,0x05,0x05,0x06, 0x0c,0x0d,0x0e,0x11,0x12,0x14,0x11,0x12,0x16,0x17,0x19,0x1e,0x20,0x22,0x28,0x23, 0x25,0x2a,0x26,0x28,0x2e,0x34,0x37,0x41,0x42,0x46,0x4c,0x4d,0x50,0x58,0x3d,0x41, 0x4f,0x36,0x36,0x49,0x44,0x3e,0x52,0x40,0x3e,0x56,0x45,0x44,0x5d,0x51,0x58,0x6f, 0x69,0x6f,0x84,0x7a,0x80,0x91,0x92,0x96,0xa2,0x9b,0x9f,0xa7,0x88,0x8e,0x9b,0x76, 0x7e,0x90,0x74,0x7a,0x8d,0x5d,0x61,0x72,0x3c,0x3d,0x50,0x42,0x3f,0x54,0x46,0x42, 0x58,0x50,0x52,0x6e,0x62,0x68,0x7e,0x72,0x77,0x8a,0x76,0x7d,0x90,0x7e,0x84,0x96, 0x8e,0x93,0xa1,0x9d,0xa1,0xaa,0x9f,0xa2,0xac,0x9a,0x9e,0xa8,0x96,0x9a,0xa6,0x96, 0x9b,0xa8,0x97,0x9c,0xa9,0x97,0x9b,0xa8,0x9a,0x9e,0xa9,0x95,0x9a,0xa6,0x85,0x8a, 0x99,0x6d,0x73,0x86,0x63,0x6a,0x7e,0x62,0x6a,0x7e,0x69,0x70,0x84,0x70,0x77,0x8a, 0x6a,0x71,0x86,0x5e,0x66,0x7e,0x58,0x5e,0x78,0x58,0x5a,0x75,0x5a,0x5b,0x74,0x62, 0x60,0x78,0x64,0x62,0x7a,0x65,0x63,0x7b,0x62,0x63,0x7c,0x65,0x65,0x7d,0x71,0x70, 0x85,0x79,0x76,0x88,0x76,0x76,0x89,0x72,0x70,0x85,0x6d,0x67,0x7c,0x54,0x4d,0x62, 0x48,0x41,0x53,0x46,0x40,0x52,0x49,0x42,0x57,0x45,0x44,0x5d,0x45,0x49,0x5f,0x55, 0x5a,0x6b,0x65,0x69,0x78,0x73,0x78,0x84,0x76,0x7a,0x85,0x9c,0x9f,0xb2,0xb7,0xb2, 0xbb,0x92,0x97,0xad,0x57,0x56,0x78,0x4c,0x4f,0x6e,0x4a,0x4f,0x6f,0x50,0x50,0x6c, 0x4d,0x4d,0x68,0x4a,0x51,0x70,0x4f,0x47,0x67,0x5d,0x66,0x85,0x9e,0x9f,0xaf,0x4f, 0x3f,0x4f,0x58,0x46,0x57,0x57,0x46,0x56,0x55,0x44,0x54,0x52,0x42,0x51,0x30,0x26, 0x32,0x27,0x1e,0x29,0x2a,0x1f,0x2c,0x36,0x2a,0x3b,0x53,0x53,0x77,0x50,0x4e,0x7a, 0x5b,0x51,0x77,0x63,0x52,0x75,0x51,0x4f,0x7a,0x52,0x5c,0x85,0x52,0x5d,0x85,0x55, 0x60,0x89,0x64,0x52,0x72,0x5e,0x6b,0x91,0xf0,0xf1,0xf6,0x6f,0x6b,0x70,0x29,0x1e, 0x24,0x37,0x29,0x32,0x37,0x29,0x32,0x34,0x26,0x2e,0x49,0x38,0x45,0x42,0x3a,0x4a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x07,0x89, 0x93,0xab,0x5c,0x67,0x90,0x56,0x50,0x79,0x60,0x6c,0x92,0x5d,0x6a,0x90,0x5c,0x67, 0x8f,0x5c,0x67,0x8f,0x5c,0x67,0x8f,0x5c,0x67,0x8f,0x5c,0x69,0x8e,0x5b,0x66,0x8d, 0x5b,0x65,0x8d,0x5b,0x65,0x8d,0x51,0x55,0x7e,0x54,0x50,0x78,0x6a,0x74,0x98,0x7b, 0x7c,0x7f,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x08, 0x0a,0x35,0x2c,0x37,0x56,0x52,0x5f,0x9e,0xa2,0xb1,0xab,0xac,0xb6,0xac,0xad,0xb7, 0xc1,0xc0,0xc9,0x9a,0x99,0xa2,0x18,0x17,0x1c,0x0a,0x0c,0x0e,0x0a,0x0b,0x0e,0x0a, 0x0b,0x0e,0x0b,0x0c,0x10,0x0a,0x0c,0x0f,0x0a,0x0a,0x0e,0x2e,0x27,0x30,0x50,0x57, 0x7b,0x95,0x9d,0xb4,0x96,0x9e,0xb4,0x20,0x1d,0x24,0x10,0x12,0x15,0x19,0x1a,0x20, 0x42,0x44,0x48,0x43,0x44,0x49,0x34,0x37,0x3d,0x2f,0x31,0x39,0x25,0x28,0x32,0x26, 0x2a,0x36,0x28,0x2b,0x3a,0x31,0x31,0x42,0x39,0x38,0x4d,0x3e,0x3d,0x53,0x42,0x40, 0x58,0x45,0x44,0x5d,0x47,0x47,0x60,0x47,0x4a,0x64,0x46,0x49,0x63,0x44,0x45,0x5d, 0x45,0x45,0x5e,0x45,0x45,0x5e,0x44,0x43,0x5b,0x42,0x42,0x58,0x49,0x42,0x56,0x4b, 0x42,0x55,0x45,0x3b,0x4b,0x54,0x47,0x5a,0x5a,0x4e,0x64,0x57,0x4e,0x66,0x52,0x4d, 0x66,0x4e,0x4b,0x66,0x4e,0x4d,0x68,0x4f,0x4e,0x6a,0x50,0x4e,0x6b,0x51,0x50,0x6e, 0x54,0x5c,0x78,0x66,0x6e,0x85,0x7b,0x7e,0x93,0x62,0x66,0x79,0x53,0x55,0x66,0x5e, 0x5e,0x6c,0x68,0x68,0x72,0x67,0x67,0x72,0x94,0x98,0xa4,0x85,0x8c,0x9d,0x6e,0x76, 0x8e,0x6f,0x78,0x8e,0x77,0x7d,0x92,0x86,0x8b,0x9f,0x90,0x96,0xa9,0x87,0x8e,0xa3, 0x6c,0x74,0x8f,0x4f,0x59,0x7b,0x5d,0x55,0x75,0x79,0x6c,0x84,0x7a,0x68,0x7d,0x5e, 0x4b,0x61,0x5b,0x4a,0x65,0x4a,0x4a,0x6c,0x19,0x1b,0x22,0x1a,0x1d,0x24,0x1a,0x1b, 0x22,0x2a,0x29,0x37,0x31,0x2e,0x44,0x30,0x2b,0x41,0x54,0x4c,0x6d,0x5c,0x52,0x73, 0x5b,0x52,0x75,0x5d,0x52,0x75,0x5e,0x52,0x75,0x5e,0x51,0x75,0x5e,0x53,0x75,0x5e, 0x53,0x75,0x5c,0x52,0x77,0x5d,0x52,0x75,0x5b,0x52,0x74,0x5b,0x54,0x74,0x55,0x54, 0x76,0x60,0x6b,0x88,0x4f,0x51,0x5d,0x31,0x34,0x3d,0x33,0x36,0x3e,0x32,0x34,0x3d, 0x2f,0x32,0x3a,0x2b,0x2e,0x36,0x25,0x27,0x2e,0x3c,0x37,0x42,0x5a,0x56,0x69,0x4e, 0x58,0x7b,0x46,0x47,0x65,0x47,0x48,0x66,0x4d,0x4f,0x71,0x4c,0x4f,0x73,0x4c,0x51, 0x76,0x4b,0x53,0x77,0x49,0x53,0x77,0x49,0x53,0x77,0x46,0x4f,0x72,0x40,0x48,0x67, 0x3b,0x41,0x5d,0x37,0x3c,0x55,0x35,0x3a,0x50,0x37,0x3b,0x51,0x21,0x20,0x2b,0x2c, 0x27,0x32,0x39,0x35,0x46,0x3f,0x3b,0x4e,0x48,0x41,0x54,0x49,0x40,0x53,0x56,0x4b, 0x60,0x55,0x4a,0x61,0x4c,0x47,0x5e,0x48,0x46,0x5e,0x49,0x46,0x5e,0x45,0x43,0x5b, 0x41,0x42,0x59,0x3e,0x43,0x59,0x59,0x5e,0x6d,0x84,0x87,0x90,0x67,0x6b,0x79,0x42, 0x49,0x5d,0x42,0x42,0x5a,0x41,0x42,0x5a,0x3e,0x42,0x57,0x3b,0x41,0x55,0x3c,0x42, 0x54,0x39,0x3f,0x4f,0x2e,0x32,0x43,0x29,0x2a,0x38,0x2d,0x2d,0x3d,0x29,0x2c,0x3a, 0x2b,0x2f,0x3b,0x31,0x33,0x40,0x31,0x32,0x40,0x34,0x35,0x45,0x34,0x36,0x45,0x35, 0x36,0x46,0x38,0x3a,0x48,0x36,0x39,0x46,0x34,0x36,0x44,0x2f,0x32,0x3f,0x2b,0x2d, 0x3a,0x2d,0x2d,0x3a,0x2f,0x2f,0x3c,0x2e,0x2e,0x3a,0x2a,0x29,0x35,0x27,0x26,0x31, 0x26,0x24,0x2f,0x23,0x21,0x2c,0x21,0x1f,0x29,0x1b,0x1a,0x22,0x1a,0x18,0x20,0x1b, 0x19,0x21,0x18,0x17,0x1f,0x10,0x0f,0x15,0x0d,0x0d,0x12,0x0d,0x0d,0x11,0x0c,0x0b, 0x0f,0x0b,0x0b,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x09,0x0c,0x08,0x08,0x0a, 0x08,0x07,0x0a,0x08,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06, 0x05,0x06,0x06,0x06,0x08,0x0b,0x0c,0x0e,0x0e,0x0f,0x12,0x0d,0x0e,0x10,0x1b,0x1c, 0x1e,0x1e,0x1f,0x22,0x1c,0x1d,0x1f,0x16,0x17,0x1a,0x17,0x19,0x1b,0x18,0x19,0x1b, 0x12,0x13,0x15,0x08,0x09,0x0a,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x25,0x26,0x27,0xa4,0xac,0xc2, 0x5a,0x65,0x8e,0x52,0x50,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52, 0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x54, 0x7e,0x52,0x54,0x7e,0x5d,0x5f,0x91,0x07,0x07,0x0a,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x04,0x05,0x04, 0x06,0x0a,0x0a,0x0d,0x11,0x12,0x14,0x15,0x16,0x19,0x17,0x18,0x1c,0x17,0x19,0x1d, 0x21,0x22,0x27,0x2a,0x2c,0x31,0x3b,0x3e,0x49,0x4e,0x52,0x5b,0x58,0x5b,0x64,0x5e, 0x61,0x6d,0x41,0x46,0x59,0x3f,0x3e,0x54,0x48,0x42,0x55,0x4a,0x42,0x58,0x45,0x44, 0x5e,0x56,0x5e,0x74,0x6e,0x74,0x86,0x83,0x88,0x96,0x96,0x9a,0xa3,0xa2,0xa3,0xab, 0x8f,0x93,0xa0,0x79,0x7e,0x8f,0x5b,0x5f,0x74,0x3b,0x3a,0x4e,0x41,0x3d,0x4f,0x48, 0x43,0x59,0x53,0x4f,0x6a,0x4f,0x4e,0x6a,0x52,0x5a,0x72,0x65,0x6c,0x80,0x6e,0x75, 0x89,0x74,0x7b,0x8f,0x82,0x87,0x97,0x92,0x97,0xa4,0x9a,0x9e,0xa9,0x9a,0x9e,0xa9, 0x98,0x9c,0xa9,0x95,0x99,0xa6,0x96,0x9b,0xa8,0x99,0x9d,0xa9,0x9a,0x9e,0xaa,0x93, 0x97,0xa4,0x7f,0x86,0x94,0x66,0x6d,0x80,0x5d,0x64,0x77,0x5a,0x60,0x74,0x5c,0x63, 0x76,0x60,0x67,0x7c,0x5c,0x63,0x7a,0x55,0x5c,0x72,0x56,0x56,0x6e,0x5e,0x5e,0x73, 0x64,0x62,0x79,0x62,0x62,0x7a,0x62,0x62,0x7a,0x62,0x62,0x7a,0x5f,0x61,0x7a,0x6a, 0x66,0x7c,0x75,0x73,0x86,0x76,0x76,0x8a,0x74,0x72,0x87,0x76,0x71,0x84,0x69,0x63, 0x77,0x58,0x4f,0x67,0x4a,0x46,0x5c,0x43,0x42,0x59,0x3f,0x3e,0x54,0x4a,0x4e,0x63, 0x60,0x63,0x75,0x7a,0x7e,0x8a,0x67,0x6a,0x76,0x5d,0x60,0x6e,0x49,0x4e,0x5f,0x5a, 0x60,0x80,0x7f,0x7d,0x93,0x85,0x8a,0xa4,0x60,0x67,0x89,0x53,0x53,0x73,0x49,0x4d, 0x6b,0x50,0x50,0x6d,0x52,0x52,0x6f,0x4e,0x53,0x72,0x4a,0x46,0x67,0x4c,0x55,0x78, 0x9a,0x9f,0xb3,0x62,0x56,0x63,0x58,0x46,0x58,0x56,0x45,0x56,0x54,0x43,0x53,0x53, 0x41,0x51,0x3c,0x2f,0x3c,0x26,0x1c,0x28,0x25,0x1c,0x26,0x29,0x1e,0x2b,0x57,0x4c, 0x6c,0x50,0x4d,0x79,0x5c,0x51,0x77,0x63,0x52,0x73,0x52,0x4f,0x7a,0x52,0x5a,0x83, 0x52,0x5d,0x85,0x55,0x60,0x89,0x63,0x53,0x77,0x52,0x55,0x80,0xe6,0xe7,0xee,0x90, 0x8d,0x93,0x25,0x1a,0x1f,0x35,0x27,0x30,0x38,0x29,0x32,0x35,0x27,0x2f,0x40,0x30, 0x3b,0x52,0x43,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4f,0x54,0x63,0x7b,0x86,0xa7,0x5a,0x52,0x79,0x63,0x6f,0x94,0x63, 0x6e,0x94,0x5d,0x6a,0x90,0x5d,0x6a,0x8f,0x5a,0x66,0x8d,0x5b,0x66,0x8d,0x5b,0x66, 0x8c,0x58,0x64,0x8a,0x58,0x63,0x8c,0x56,0x61,0x8a,0x4e,0x58,0x7f,0x3e,0x35,0x51, 0x33,0x38,0x53,0x61,0x60,0x6e,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06, 0x06,0x08,0x08,0x08,0x0a,0x34,0x2c,0x36,0x7d,0x7e,0x8e,0x93,0x99,0xaa,0x2c,0x25, 0x2d,0x4a,0x42,0x4c,0xad,0xac,0xb8,0xd1,0xd4,0xd9,0xbb,0xbd,0xc7,0x82,0x83,0x8e, 0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x10, 0x0f,0x13,0x55,0x4e,0x67,0x8c,0x94,0xae,0x9b,0xa2,0xb8,0x54,0x4b,0x5a,0x0e,0x0e, 0x12,0x16,0x17,0x1c,0x1e,0x20,0x25,0x3d,0x3e,0x44,0x30,0x33,0x39,0x4a,0x4c,0x51, 0x1d,0x1e,0x26,0x1e,0x20,0x29,0x22,0x25,0x2f,0x27,0x2b,0x38,0x2e,0x32,0x42,0x37, 0x37,0x4b,0x3e,0x3d,0x53,0x40,0x3e,0x56,0x41,0x40,0x57,0x42,0x43,0x5b,0x43,0x46, 0x5e,0x44,0x46,0x5f,0x46,0x4a,0x62,0x47,0x49,0x63,0x49,0x4a,0x65,0x4a,0x49,0x63, 0x46,0x45,0x5e,0x47,0x43,0x5a,0x4c,0x44,0x59,0x48,0x3f,0x4f,0x50,0x45,0x59,0x55, 0x4c,0x63,0x52,0x4c,0x65,0x52,0x4c,0x66,0x52,0x4e,0x67,0x52,0x4e,0x69,0x52,0x4e, 0x6a,0x4f,0x4e,0x6a,0x50,0x57,0x72,0x62,0x6a,0x82,0x7c,0x80,0x94,0x7b,0x7c,0x8d, 0x63,0x65,0x74,0x53,0x53,0x5f,0x58,0x58,0x60,0x59,0x59,0x62,0x8c,0x8f,0x9e,0x74, 0x77,0x90,0x5e,0x60,0x7d,0x56,0x59,0x7a,0x7a,0x80,0x96,0x8b,0x92,0xa5,0x8a,0x90, 0xa4,0x7b,0x82,0x99,0x65,0x6d,0x88,0x4d,0x56,0x79,0x58,0x52,0x74,0x7f,0x74,0x8b, 0x85,0x76,0x89,0x66,0x55,0x69,0x5f,0x4c,0x65,0x49,0x49,0x6a,0x18,0x1a,0x21,0x1a, 0x1c,0x22,0x18,0x1a,0x21,0x2a,0x28,0x36,0x30,0x2e,0x44,0x30,0x2b,0x41,0x53,0x4b, 0x6b,0x5a,0x51,0x73,0x5d,0x51,0x73,0x5d,0x52,0x75,0x5e,0x52,0x75,0x5e,0x51,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x53,0x75,0x5e,0x53,0x75,0x5e,0x53,0x75,0x5c, 0x55,0x77,0x57,0x56,0x79,0x60,0x6a,0x8a,0x4d,0x4f,0x5b,0x2e,0x31,0x3a,0x2e,0x31, 0x3a,0x2b,0x2e,0x36,0x28,0x2a,0x32,0x26,0x28,0x2f,0x20,0x22,0x29,0x37,0x33,0x3d, 0x5d,0x58,0x6a,0x52,0x5b,0x7f,0x46,0x46,0x65,0x46,0x46,0x65,0x4f,0x4f,0x75,0x4f, 0x51,0x77,0x4f,0x51,0x77,0x4e,0x52,0x79,0x4d,0x56,0x7d,0x4c,0x57,0x7e,0x4d,0x56, 0x7c,0x49,0x51,0x76,0x46,0x4e,0x6f,0x43,0x4c,0x6b,0x44,0x4a,0x67,0x41,0x44,0x5d, 0x2e,0x2f,0x3f,0x1e,0x1e,0x29,0x2c,0x2c,0x3b,0x37,0x36,0x4a,0x3b,0x35,0x47,0x48, 0x40,0x54,0x51,0x49,0x5f,0x47,0x45,0x5c,0x42,0x43,0x5b,0x40,0x44,0x5b,0x41,0x43, 0x5a,0x3e,0x43,0x59,0x40,0x46,0x5a,0x53,0x57,0x66,0x6a,0x6e,0x7a,0x67,0x6a,0x76, 0x45,0x4a,0x5c,0x3e,0x40,0x56,0x42,0x41,0x58,0x40,0x40,0x57,0x3f,0x45,0x59,0x48, 0x4d,0x5b,0x62,0x64,0x6e,0x5a,0x5d,0x67,0x3c,0x41,0x50,0x32,0x36,0x46,0x29,0x2c, 0x3a,0x2a,0x2c,0x39,0x30,0x31,0x3f,0x35,0x35,0x44,0x35,0x35,0x44,0x35,0x35,0x44, 0x34,0x34,0x43,0x33,0x34,0x43,0x35,0x36,0x44,0x35,0x36,0x45,0x33,0x34,0x42,0x32, 0x32,0x3f,0x2f,0x2e,0x3b,0x2c,0x2b,0x37,0x2c,0x2b,0x37,0x2a,0x29,0x35,0x29,0x27, 0x34,0x27,0x25,0x30,0x26,0x24,0x2f,0x25,0x23,0x2d,0x24,0x21,0x2c,0x1e,0x1d,0x25, 0x19,0x17,0x1e,0x18,0x16,0x1d,0x13,0x12,0x18,0x0d,0x0d,0x12,0x0b,0x0b,0x0f,0x0b, 0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x09,0x0d,0x0a,0x0a,0x0d,0x0a,0x09,0x0c,0x09,0x09, 0x0b,0x09,0x08,0x0b,0x08,0x07,0x0a,0x07,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x08, 0x06,0x06,0x07,0x06,0x05,0x06,0x05,0x05,0x06,0x06,0x05,0x07,0x06,0x05,0x07,0x07, 0x08,0x0a,0x10,0x11,0x12,0x0e,0x0e,0x0f,0x0e,0x0e,0x0f,0x0f,0x10,0x12,0x12,0x12, 0x14,0x10,0x10,0x12,0x09,0x0a,0x0a,0x03,0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x05,0x05, 0x06,0xbe,0xc3,0xd3,0x66,0x73,0x98,0x52,0x50,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52, 0x53,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7d,0x55,0x56,0x81,0x31,0x32,0x4c,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x05,0x04,0x05,0x06, 0x04,0x06,0x09,0x07,0x0a,0x0b,0x0c,0x10,0x12,0x13,0x16,0x16,0x18,0x1c,0x1d,0x1e, 0x22,0x21,0x22,0x26,0x28,0x2a,0x2e,0x38,0x3a,0x43,0x50,0x54,0x60,0x5b,0x5e,0x69, 0x64,0x68,0x72,0x65,0x69,0x74,0x4d,0x52,0x64,0x41,0x42,0x58,0x42,0x41,0x57,0x43, 0x41,0x56,0x47,0x4e,0x66,0x66,0x6d,0x7e,0x81,0x86,0x93,0x86,0x8b,0x99,0x8e,0x92, 0x9e,0x98,0x9b,0xa5,0x8d,0x92,0x9d,0x70,0x75,0x86,0x40,0x42,0x58,0x40,0x3e,0x4f, 0x52,0x4e,0x68,0x52,0x4e,0x67,0x56,0x52,0x6b,0x4e,0x4e,0x68,0x4a,0x4e,0x69,0x53, 0x5a,0x72,0x62,0x69,0x7f,0x6c,0x73,0x89,0x75,0x7b,0x8f,0x80,0x86,0x96,0x8a,0x90, 0x9f,0x93,0x98,0xa6,0x96,0x9a,0xa7,0x95,0x9a,0xa7,0x92,0x97,0xa5,0x94,0x99,0xa6, 0x94,0x99,0xa5,0x8f,0x94,0xa1,0x7e,0x84,0x93,0x6a,0x70,0x81,0x5c,0x63,0x76,0x56, 0x5c,0x6e,0x58,0x5e,0x72,0x58,0x5e,0x73,0x56,0x5e,0x73,0x51,0x59,0x6f,0x59,0x5a, 0x72,0x62,0x62,0x77,0x63,0x65,0x7d,0x66,0x6a,0x82,0x67,0x6a,0x82,0x66,0x6b,0x84, 0x65,0x66,0x7e,0x66,0x68,0x7e,0x6d,0x6e,0x84,0x71,0x72,0x87,0x6f,0x6e,0x83,0x6d, 0x67,0x7d,0x64,0x5d,0x74,0x54,0x4e,0x67,0x42,0x3f,0x53,0x3d,0x38,0x49,0x38,0x35, 0x47,0x3a,0x39,0x4d,0x47,0x4a,0x61,0x6a,0x6e,0x7b,0x7f,0x82,0x8c,0x6e,0x70,0x7a, 0x53,0x57,0x65,0x45,0x48,0x64,0x57,0x50,0x6c,0x5d,0x61,0x83,0x81,0x86,0x9f,0x5a, 0x61,0x82,0x50,0x56,0x76,0x49,0x4c,0x6a,0x51,0x51,0x6b,0x52,0x54,0x71,0x47,0x4d, 0x6e,0x4c,0x48,0x6b,0x83,0x89,0xa4,0x86,0x81,0x8f,0x55,0x44,0x55,0x56,0x45,0x56, 0x54,0x43,0x54,0x53,0x41,0x51,0x44,0x35,0x43,0x26,0x1c,0x26,0x24,0x1b,0x25,0x26, 0x1c,0x27,0x46,0x3c,0x55,0x51,0x4e,0x79,0x5d,0x52,0x78,0x63,0x4f,0x6d,0x52,0x50, 0x7b,0x52,0x5b,0x84,0x52,0x5c,0x85,0x53,0x5f,0x88,0x55,0x50,0x79,0x58,0x50,0x79, 0xcc,0xd1,0xde,0xb6,0xb5,0xba,0x21,0x17,0x1b,0x35,0x27,0x2f,0x39,0x2a,0x33,0x37, 0x29,0x32,0x40,0x30,0x3b,0x5c,0x4a,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x2e,0x36,0x8e,0x98,0xb3,0x52,0x5a,0x84, 0x56,0x63,0x8a,0x6b,0x76,0x9a,0x64,0x6f,0x94,0x5f,0x6c,0x92,0x5b,0x66,0x8d,0x5a, 0x66,0x8d,0x57,0x64,0x8b,0x56,0x62,0x89,0x54,0x60,0x88,0x3c,0x43,0x64,0x29,0x2c, 0x45,0x2a,0x24,0x3d,0x28,0x24,0x3d,0x3f,0x40,0x56,0x33,0x34,0x34,0x04,0x05,0x06, 0x04,0x05,0x06,0x05,0x06,0x06,0x0e,0x0d,0x0f,0x34,0x2b,0x35,0x93,0x99,0xae,0x8e, 0x94,0xa7,0x29,0x21,0x29,0x33,0x29,0x30,0x35,0x2a,0x33,0x99,0x96,0x9f,0xcb,0xcb, 0xd2,0xc4,0xc6,0xd0,0x9f,0xa1,0xae,0x2f,0x32,0x38,0x0a,0x0a,0x0d,0x09,0x0a,0x0d, 0x0a,0x0a,0x0e,0x0b,0x0c,0x0f,0x35,0x2e,0x3b,0x74,0x7f,0x9e,0x9c,0xa2,0xb9,0x83, 0x83,0x96,0x0d,0x0e,0x11,0x15,0x16,0x1b,0x1b,0x1e,0x23,0x1e,0x20,0x26,0x1e,0x21, 0x26,0x3c,0x3e,0x43,0x24,0x26,0x2b,0x16,0x18,0x1e,0x17,0x19,0x20,0x1d,0x20,0x28, 0x25,0x28,0x34,0x2e,0x32,0x42,0x39,0x3e,0x52,0x3e,0x42,0x58,0x3d,0x43,0x58,0x3d, 0x42,0x56,0x3b,0x3f,0x55,0x3e,0x3e,0x54,0x40,0x40,0x57,0x41,0x42,0x59,0x45,0x47, 0x60,0x49,0x4a,0x65,0x4a,0x4a,0x65,0x47,0x46,0x60,0x45,0x43,0x5b,0x46,0x3f,0x52, 0x41,0x3a,0x4b,0x47,0x40,0x54,0x42,0x3d,0x53,0x45,0x42,0x59,0x4e,0x4b,0x64,0x4e, 0x4b,0x64,0x4f,0x4c,0x65,0x4f,0x4c,0x66,0x4a,0x4b,0x66,0x61,0x68,0x7d,0x7e,0x80, 0x92,0x85,0x86,0x93,0x79,0x7a,0x86,0x5f,0x5e,0x69,0x52,0x50,0x58,0x4c,0x4a,0x51, 0x84,0x87,0x94,0x73,0x76,0x8e,0x62,0x60,0x7b,0x59,0x5c,0x7b,0x6c,0x74,0x8e,0x86, 0x8d,0xa1,0x84,0x8b,0xa0,0x76,0x7e,0x96,0x69,0x71,0x8c,0x60,0x69,0x87,0x66,0x62, 0x80,0x7d,0x72,0x8c,0x90,0x83,0x94,0x6e,0x5d,0x71,0x5f,0x50,0x67,0x46,0x47,0x68, 0x16,0x19,0x1f,0x19,0x1b,0x22,0x18,0x1a,0x21,0x28,0x27,0x33,0x30,0x2d,0x44,0x2e, 0x2a,0x40,0x51,0x49,0x68,0x59,0x50,0x73,0x5d,0x51,0x73,0x5d,0x51,0x74,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75, 0x5c,0x53,0x77,0x5d,0x55,0x77,0x56,0x56,0x78,0x5f,0x69,0x8a,0x50,0x51,0x5f,0x28, 0x2b,0x33,0x29,0x2b,0x34,0x2a,0x2c,0x34,0x26,0x29,0x30,0x22,0x24,0x2b,0x1e,0x21, 0x26,0x33,0x2f,0x38,0x5e,0x56,0x69,0x51,0x5b,0x7e,0x47,0x48,0x66,0x44,0x42,0x63, 0x4e,0x4d,0x74,0x50,0x50,0x78,0x50,0x51,0x7a,0x50,0x55,0x7d,0x50,0x55,0x7e,0x4f, 0x58,0x7f,0x4e,0x58,0x81,0x4e,0x58,0x80,0x4d,0x57,0x7c,0x4a,0x55,0x78,0x49,0x52, 0x74,0x49,0x51,0x70,0x28,0x2e,0x3f,0x1c,0x1e,0x26,0x2a,0x2e,0x3a,0x36,0x36,0x4a, 0x41,0x3e,0x53,0x48,0x43,0x59,0x46,0x43,0x5a,0x40,0x42,0x59,0x45,0x4a,0x5c,0x47, 0x4d,0x5c,0x52,0x57,0x68,0x40,0x45,0x53,0x4e,0x53,0x60,0x5f,0x63,0x6e,0x48,0x4c, 0x5a,0x41,0x46,0x55,0x3e,0x43,0x55,0x3d,0x3d,0x52,0x42,0x41,0x58,0x40,0x41,0x57, 0x46,0x4a,0x5c,0x6a,0x6c,0x74,0x72,0x74,0x7a,0x56,0x59,0x62,0x41,0x45,0x50,0x38, 0x3c,0x4a,0x34,0x36,0x44,0x35,0x35,0x43,0x34,0x34,0x42,0x34,0x35,0x44,0x34,0x34, 0x43,0x32,0x32,0x40,0x31,0x31,0x3f,0x30,0x31,0x3e,0x32,0x33,0x41,0x34,0x35,0x43, 0x33,0x32,0x40,0x32,0x31,0x3e,0x2d,0x2c,0x39,0x2a,0x2a,0x36,0x2a,0x28,0x35,0x29, 0x28,0x34,0x28,0x26,0x32,0x27,0x25,0x30,0x26,0x24,0x2e,0x25,0x23,0x2e,0x25,0x22, 0x2d,0x20,0x1e,0x27,0x1a,0x18,0x20,0x17,0x16,0x1c,0x11,0x10,0x16,0x0d,0x0c,0x11, 0x0c,0x0c,0x10,0x0b,0x0b,0x0e,0x0a,0x0a,0x0d,0x09,0x09,0x0c,0x09,0x09,0x0b,0x08, 0x08,0x0a,0x07,0x07,0x09,0x08,0x07,0x0a,0x08,0x07,0x0a,0x07,0x06,0x09,0x06,0x06, 0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x05,0x07,0x05,0x05,0x06,0x05,0x05,0x06, 0x05,0x04,0x06,0x04,0x04,0x06,0x05,0x06,0x07,0x03,0x03,0x05,0x04,0x05,0x06,0x05, 0x06,0x06,0x06,0x07,0x08,0x06,0x06,0x07,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x99,0x9e,0xa9,0x72,0x7d,0xa0,0x52,0x53,0x7e,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b, 0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7d,0x64, 0x64,0x98,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x05,0x03,0x04,0x05,0x04,0x04,0x0b,0x09,0x0b,0x0e,0x0d,0x10,0x0c,0x0e,0x12,0x17, 0x19,0x1e,0x1f,0x21,0x26,0x26,0x29,0x2d,0x32,0x34,0x3a,0x4c,0x50,0x5b,0x5c,0x61, 0x6b,0x66,0x6a,0x75,0x6d,0x71,0x7a,0x65,0x69,0x72,0x4f,0x56,0x67,0x42,0x46,0x5d, 0x43,0x43,0x5b,0x43,0x43,0x5b,0x58,0x5e,0x71,0x84,0x88,0x92,0x98,0x9b,0xa3,0x8b, 0x8f,0x9b,0x83,0x88,0x96,0x87,0x8c,0x99,0x7a,0x7e,0x8e,0x55,0x59,0x6e,0x43,0x44, 0x59,0x4b,0x4c,0x63,0x52,0x52,0x6e,0x52,0x52,0x6e,0x54,0x51,0x6a,0x56,0x4e,0x66, 0x4d,0x4a,0x64,0x4a,0x4a,0x66,0x4c,0x53,0x6e,0x57,0x60,0x7a,0x66,0x6e,0x85,0x6e, 0x76,0x8a,0x7a,0x81,0x93,0x87,0x8d,0x9d,0x8e,0x92,0xa2,0x91,0x96,0xa4,0x92,0x98, 0xa6,0x90,0x96,0xa3,0x90,0x95,0xa2,0x8c,0x92,0x9e,0x82,0x88,0x96,0x71,0x76,0x86, 0x60,0x66,0x78,0x57,0x5d,0x6f,0x52,0x5a,0x6e,0x52,0x5a,0x6e,0x4f,0x57,0x6e,0x51, 0x58,0x6f,0x5d,0x5e,0x77,0x65,0x6a,0x81,0x69,0x71,0x87,0x6a,0x71,0x88,0x6a,0x70, 0x87,0x68,0x6e,0x86,0x68,0x6d,0x84,0x69,0x6c,0x84,0x6e,0x6f,0x86,0x6e,0x6f,0x86, 0x67,0x67,0x7f,0x62,0x5f,0x76,0x57,0x53,0x6e,0x4c,0x46,0x5b,0x42,0x3c,0x4d,0x3a, 0x34,0x44,0x37,0x36,0x47,0x3e,0x3c,0x50,0x3e,0x3c,0x51,0x3d,0x3f,0x55,0x62,0x65, 0x73,0x9b,0x9d,0xa2,0x8a,0x8b,0x91,0x74,0x73,0x85,0x56,0x53,0x68,0x63,0x69,0x87, 0x8e,0x91,0xa7,0x7d,0x81,0x98,0x5c,0x64,0x81,0x49,0x51,0x71,0x4d,0x4d,0x6a,0x4f, 0x4f,0x6d,0x4c,0x53,0x73,0x4f,0x49,0x6b,0x67,0x70,0x90,0xa5,0xa7,0xb6,0x4f,0x3d, 0x4d,0x58,0x45,0x56,0x56,0x43,0x54,0x52,0x40,0x4f,0x4e,0x3e,0x4b,0x24,0x1b,0x25, 0x24,0x1a,0x24,0x24,0x1a,0x24,0x3a,0x2f,0x44,0x51,0x4e,0x79,0x5a,0x51,0x78,0x64, 0x53,0x75,0x52,0x4f,0x7a,0x52,0x57,0x82,0x52,0x5b,0x84,0x53,0x5e,0x87,0x52,0x50, 0x7b,0x5f,0x53,0x77,0xad,0xb4,0xc9,0xd7,0xd8,0xdf,0x20,0x16,0x1a,0x34,0x27,0x2f, 0x3b,0x2c,0x36,0x38,0x29,0x32,0x3c,0x2e,0x38,0x60,0x4d,0x5f,0x06,0x05,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x07,0x93,0x9b, 0xb3,0x64,0x71,0x96,0x52,0x4f,0x7a,0x6a,0x76,0x99,0x69,0x75,0x99,0x60,0x6d,0x93, 0x5c,0x69,0x8f,0x58,0x64,0x8b,0x55,0x60,0x89,0x53,0x5e,0x88,0x3c,0x43,0x65,0x27, 0x29,0x42,0x27,0x2a,0x43,0x27,0x25,0x3d,0x27,0x24,0x3d,0x31,0x35,0x4b,0x60,0x5f, 0x64,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x14,0x11,0x16,0x34,0x2a,0x35, 0x98,0x9e,0xb4,0x79,0x7e,0x94,0x05,0x06,0x07,0x11,0x0f,0x12,0x2e,0x24,0x2c,0x36, 0x2b,0x33,0x6b,0x64,0x6e,0xc0,0xbf,0xc9,0xc6,0xc8,0xd1,0x9f,0xa5,0xb2,0x61,0x65, 0x72,0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x0b,0x0d,0x10,0x11,0x10,0x15,0x59,0x5f,0x82, 0x9a,0xa1,0xb8,0x9a,0xa2,0xb7,0x21,0x1e,0x24,0x15,0x16,0x1b,0x1b,0x1d,0x22,0x1e, 0x1f,0x26,0x1d,0x1f,0x25,0x23,0x25,0x2a,0x39,0x3b,0x3f,0x1a,0x1c,0x20,0x16,0x19, 0x1d,0x25,0x27,0x2c,0x2d,0x2f,0x35,0x34,0x38,0x41,0x44,0x49,0x56,0x49,0x4e,0x5e, 0x4c,0x52,0x62,0x46,0x4b,0x5d,0x3b,0x41,0x52,0x35,0x3a,0x4c,0x37,0x38,0x4b,0x3a, 0x39,0x4e,0x3c,0x3d,0x52,0x42,0x43,0x5b,0x45,0x46,0x5f,0x46,0x47,0x60,0x42,0x42, 0x59,0x42,0x3f,0x55,0x40,0x3c,0x4e,0x3f,0x3b,0x4f,0x42,0x41,0x59,0x42,0x42,0x59, 0x40,0x40,0x56,0x41,0x3f,0x56,0x46,0x42,0x57,0x54,0x4a,0x61,0x45,0x42,0x59,0x4d, 0x53,0x66,0x75,0x77,0x86,0x8b,0x8b,0x95,0x89,0x89,0x92,0x7f,0x7e,0x86,0x68,0x66, 0x6d,0x59,0x57,0x5c,0x8c,0x8e,0x99,0x72,0x7a,0x90,0x5f,0x5f,0x7a,0x5b,0x5a,0x76, 0x52,0x58,0x78,0x6b,0x72,0x8b,0x6f,0x78,0x90,0x6a,0x72,0x8c,0x6e,0x77,0x92,0x70, 0x79,0x94,0x71,0x6f,0x8c,0x7d,0x75,0x8d,0x8f,0x81,0x90,0x76,0x65,0x78,0x64,0x53, 0x6a,0x45,0x44,0x62,0x16,0x17,0x1e,0x17,0x19,0x1f,0x16,0x19,0x1e,0x26,0x25,0x32, 0x2f,0x2d,0x43,0x2f,0x2b,0x40,0x52,0x49,0x69,0x58,0x50,0x72,0x5a,0x51,0x74,0x5d, 0x51,0x74,0x5d,0x51,0x74,0x5e,0x52,0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x51, 0x75,0x5e,0x52,0x75,0x5e,0x52,0x74,0x5c,0x53,0x76,0x55,0x52,0x78,0x5d,0x66,0x88, 0x4e,0x50,0x5e,0x26,0x28,0x30,0x26,0x29,0x31,0x25,0x27,0x2e,0x22,0x25,0x2c,0x21, 0x23,0x2a,0x1d,0x1f,0x25,0x2e,0x2b,0x34,0x5a,0x52,0x66,0x51,0x5b,0x7f,0x48,0x48, 0x69,0x41,0x41,0x5e,0x4e,0x4e,0x74,0x51,0x4f,0x78,0x51,0x52,0x7b,0x51,0x54,0x7d, 0x50,0x55,0x7f,0x51,0x58,0x81,0x50,0x5a,0x82,0x50,0x5b,0x83,0x4e,0x58,0x81,0x50, 0x5a,0x7f,0x4d,0x58,0x7c,0x4e,0x59,0x7b,0x2d,0x32,0x44,0x1c,0x1e,0x23,0x2c,0x2f, 0x3a,0x33,0x37,0x4a,0x3e,0x3c,0x52,0x42,0x40,0x56,0x3f,0x3e,0x55,0x53,0x57,0x6f, 0x64,0x6c,0x84,0x63,0x6b,0x81,0x5e,0x66,0x7f,0x5e,0x66,0x7e,0x49,0x4e,0x5b,0x3c, 0x40,0x4d,0x3b,0x40,0x4d,0x3c,0x41,0x4f,0x37,0x3d,0x4e,0x38,0x3e,0x51,0x3a,0x3e, 0x52,0x3e,0x45,0x57,0x4b,0x50,0x5c,0x73,0x75,0x7b,0x59,0x5b,0x63,0x4f,0x51,0x5b, 0x39,0x3b,0x48,0x39,0x39,0x47,0x37,0x37,0x45,0x34,0x34,0x42,0x34,0x34,0x42,0x34, 0x34,0x42,0x32,0x32,0x40,0x31,0x30,0x3e,0x32,0x31,0x3f,0x32,0x32,0x3f,0x32,0x31, 0x3f,0x32,0x32,0x3f,0x31,0x30,0x3d,0x30,0x2e,0x3b,0x2d,0x2b,0x38,0x2a,0x29,0x35, 0x29,0x27,0x34,0x28,0x27,0x32,0x27,0x25,0x31,0x26,0x24,0x30,0x25,0x23,0x2e,0x23, 0x21,0x2b,0x20,0x1e,0x28,0x1b,0x1a,0x22,0x14,0x13,0x1a,0x11,0x11,0x17,0x0f,0x0f, 0x14,0x0d,0x0d,0x12,0x0c,0x0c,0x11,0x0c,0x0b,0x10,0x0b,0x0b,0x0f,0x0a,0x0a,0x0d, 0x0a,0x09,0x0c,0x09,0x09,0x0c,0x08,0x08,0x0a,0x07,0x07,0x09,0x08,0x07,0x0a,0x07, 0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x05,0x07,0x05,0x05, 0x06,0x05,0x05,0x06,0x05,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x05, 0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,0x4e,0x50,0x56,0x7b,0x86,0xa7,0x52, 0x57,0x82,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b, 0x52,0x52,0x7c,0x5a,0x58,0x88,0x0e,0x0e,0x13,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x04,0x03,0x04,0x07,0x06,0x06,0x16,0x12,0x17,0x13,0x11,0x16, 0x10,0x10,0x16,0x1d,0x1e,0x24,0x29,0x2b,0x30,0x29,0x2b,0x34,0x3c,0x3f,0x4a,0x57, 0x5b,0x67,0x5e,0x63,0x71,0x69,0x6d,0x77,0x65,0x69,0x74,0x59,0x5e,0x6d,0x47,0x4e, 0x63,0x49,0x50,0x67,0x4a,0x51,0x69,0x4d,0x54,0x6b,0x6a,0x70,0x80,0x96,0x9a,0x9f, 0xa6,0xa6,0xad,0x95,0x98,0xa2,0x7e,0x85,0x94,0x72,0x76,0x8a,0x64,0x67,0x7e,0x4b, 0x4d,0x62,0x47,0x48,0x5e,0x54,0x54,0x6e,0x54,0x52,0x6d,0x55,0x51,0x6b,0x54,0x50, 0x6a,0x50,0x4c,0x66,0x51,0x4a,0x60,0x4c,0x49,0x62,0x4a,0x4a,0x65,0x4c,0x52,0x6e, 0x55,0x5c,0x76,0x63,0x6b,0x83,0x6e,0x76,0x8b,0x76,0x7d,0x91,0x7d,0x83,0x96,0x85, 0x8b,0x9c,0x87,0x8e,0x9e,0x86,0x8b,0x9b,0x84,0x8a,0x99,0x86,0x8b,0x99,0x7e,0x83, 0x91,0x6d,0x72,0x82,0x5e,0x63,0x73,0x55,0x5a,0x6b,0x55,0x5a,0x6c,0x58,0x5e,0x72, 0x5c,0x62,0x76,0x5e,0x65,0x79,0x61,0x67,0x7e,0x66,0x6e,0x86,0x69,0x6f,0x88,0x69, 0x6e,0x86,0x66,0x6e,0x85,0x69,0x71,0x88,0x6a,0x70,0x86,0x65,0x69,0x81,0x67,0x6a, 0x82,0x69,0x6b,0x82,0x60,0x5e,0x79,0x57,0x55,0x6f,0x57,0x4e,0x66,0x55,0x4a,0x60, 0x42,0x3a,0x4a,0x3e,0x37,0x48,0x3c,0x3b,0x50,0x3f,0x42,0x58,0x3f,0x3f,0x56,0x3e, 0x3c,0x52,0x42,0x46,0x58,0x6a,0x6e,0x77,0xb3,0xb3,0xb5,0xc6,0xc1,0xc9,0xad,0xa8, 0xb0,0x90,0x91,0xa3,0x9d,0x9e,0xb0,0x7b,0x7d,0x90,0x5b,0x5e,0x78,0x48,0x4c,0x68, 0x46,0x4b,0x6a,0x4b,0x4e,0x6b,0x4e,0x55,0x74,0x4a,0x48,0x6d,0x52,0x5d,0x82,0x8b, 0x94,0xac,0x60,0x54,0x61,0x57,0x45,0x56,0x55,0x42,0x53,0x52,0x40,0x4f,0x50,0x3f, 0x4e,0x29,0x1f,0x29,0x23,0x1a,0x24,0x23,0x1a,0x22,0x2f,0x26,0x35,0x51,0x4e,0x79, 0x5e,0x53,0x79,0x64,0x53,0x74,0x56,0x50,0x79,0x52,0x56,0x80,0x52,0x58,0x82,0x53, 0x5e,0x88,0x52,0x55,0x80,0x64,0x53,0x76,0x8e,0x98,0xb3,0xf2,0xf4,0xf7,0x2f,0x26, 0x2c,0x33,0x26,0x2e,0x3c,0x2d,0x37,0x39,0x2b,0x34,0x3c,0x2d,0x37,0x57,0x45,0x55, 0x1a,0x16,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5a,0x5e,0x6e,0x81,0x8c,0xab,0x5f,0x53,0x79,0x5c,0x67,0x8f,0x6a,0x75, 0x99,0x62,0x6e,0x93,0x5b,0x67,0x8d,0x56,0x62,0x8a,0x54,0x5f,0x88,0x4b,0x55,0x7d, 0x29,0x2c,0x44,0x27,0x27,0x3f,0x27,0x2a,0x42,0x26,0x2a,0x43,0x2a,0x25,0x3c,0x2a, 0x2c,0x45,0x55,0x54,0x65,0x08,0x09,0x0a,0x03,0x03,0x04,0x03,0x03,0x04,0x1d,0x18, 0x1e,0x41,0x3c,0x4a,0x93,0x9b,0xb2,0x44,0x3e,0x4d,0x05,0x05,0x06,0x05,0x06,0x07, 0x05,0x06,0x07,0x12,0x0f,0x12,0x36,0x2a,0x32,0x3c,0x2f,0x3b,0xa7,0xa5,0xb1,0xb5, 0xb9,0xc7,0x9e,0xa5,0xb5,0x7c,0x80,0x91,0x1b,0x1c,0x22,0x0b,0x0c,0x0f,0x0c,0x0e, 0x10,0x50,0x49,0x60,0x93,0x9c,0xb4,0x9b,0xa3,0xb8,0x5b,0x54,0x65,0x14,0x15,0x1a, 0x19,0x1a,0x20,0x1c,0x1e,0x23,0x1a,0x1c,0x22,0x19,0x1b,0x20,0x27,0x29,0x2e,0x39, 0x3a,0x3f,0x36,0x38,0x3d,0x33,0x36,0x3d,0x33,0x34,0x3b,0x47,0x49,0x4e,0x51,0x54, 0x5a,0x62,0x66,0x6f,0x68,0x6b,0x77,0x56,0x5c,0x69,0x4c,0x51,0x61,0x42,0x46,0x57, 0x34,0x39,0x4a,0x35,0x37,0x4a,0x39,0x39,0x4e,0x3f,0x3f,0x56,0x43,0x44,0x5c,0x43, 0x43,0x5b,0x40,0x40,0x56,0x3e,0x3d,0x52,0x3e,0x3d,0x51,0x40,0x3e,0x52,0x3f,0x3f, 0x56,0x42,0x46,0x5e,0x45,0x46,0x60,0x47,0x45,0x5f,0x45,0x41,0x56,0x48,0x40,0x53, 0x47,0x41,0x55,0x3c,0x42,0x56,0x57,0x5b,0x6b,0x68,0x69,0x76,0x69,0x68,0x73,0x62, 0x61,0x6a,0x5e,0x5d,0x66,0x54,0x52,0x59,0x93,0x95,0x9d,0x87,0x8e,0x9e,0x57,0x62, 0x7f,0x58,0x59,0x76,0x4e,0x51,0x6c,0x50,0x59,0x77,0x54,0x5d,0x7c,0x54,0x5e,0x7d, 0x62,0x6c,0x8a,0x6a,0x73,0x90,0x62,0x60,0x80,0x68,0x60,0x7d,0x75,0x65,0x79,0x67, 0x55,0x68,0x5e,0x4d,0x65,0x4a,0x45,0x62,0x16,0x18,0x1e,0x16,0x19,0x1f,0x15,0x16, 0x1c,0x26,0x25,0x30,0x30,0x2d,0x42,0x2e,0x29,0x40,0x51,0x49,0x68,0x57,0x4f,0x71, 0x5b,0x51,0x75,0x5d,0x51,0x73,0x5e,0x51,0x75,0x5e,0x52,0x74,0x5e,0x51,0x75,0x5e, 0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x53,0x75,0x53,0x51, 0x78,0x59,0x63,0x86,0x4b,0x4c,0x5a,0x21,0x23,0x2a,0x22,0x25,0x2c,0x21,0x23,0x2a, 0x20,0x22,0x29,0x1e,0x21,0x26,0x1b,0x1d,0x22,0x28,0x25,0x2e,0x59,0x4e,0x61,0x50, 0x58,0x7c,0x49,0x47,0x6b,0x3f,0x3e,0x5c,0x4e,0x4c,0x74,0x50,0x4f,0x77,0x51,0x51, 0x7a,0x51,0x52,0x7c,0x51,0x54,0x7c,0x50,0x56,0x80,0x51,0x59,0x82,0x51,0x5c,0x85, 0x51,0x5c,0x84,0x52,0x5c,0x84,0x52,0x5d,0x83,0x53,0x5e,0x82,0x48,0x52,0x6d,0x1b, 0x1d,0x23,0x2b,0x2e,0x37,0x37,0x3c,0x4a,0x37,0x3a,0x4e,0x3a,0x3a,0x4f,0x47,0x43, 0x5a,0x63,0x65,0x81,0x4d,0x54,0x70,0x4f,0x52,0x6c,0x4f,0x51,0x69,0x4e,0x51,0x6b, 0x5d,0x64,0x7b,0x30,0x34,0x3e,0x33,0x37,0x43,0x32,0x37,0x44,0x34,0x38,0x46,0x37, 0x3c,0x4c,0x3a,0x3f,0x4e,0x41,0x46,0x52,0x43,0x47,0x52,0x42,0x45,0x4e,0x50,0x53, 0x5c,0x4a,0x4a,0x55,0x35,0x35,0x43,0x35,0x35,0x42,0x35,0x35,0x42,0x36,0x35,0x42, 0x34,0x34,0x42,0x33,0x32,0x40,0x32,0x32,0x3f,0x33,0x32,0x40,0x35,0x34,0x42,0x36, 0x35,0x43,0x34,0x34,0x41,0x30,0x30,0x3d,0x2e,0x2c,0x39,0x2e,0x2c,0x39,0x2b,0x2a, 0x36,0x29,0x28,0x34,0x28,0x27,0x32,0x28,0x26,0x32,0x25,0x24,0x2f,0x23,0x22,0x2c, 0x20,0x1f,0x29,0x1f,0x1d,0x27,0x1a,0x1a,0x21,0x15,0x15,0x1c,0x11,0x11,0x16,0x0f, 0x0f,0x15,0x0e,0x0e,0x14,0x0d,0x0d,0x11,0x0c,0x0c,0x10,0x0b,0x0b,0x0f,0x0b,0x0b, 0x0f,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x09,0x09,0x0c,0x09,0x09,0x0b,0x07,0x07,0x09, 0x08,0x07,0x0a,0x07,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06, 0x06,0x07,0x06,0x05,0x07,0x05,0x05,0x06,0x05,0x04,0x06,0x04,0x04,0x06,0x03,0x03, 0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,0x15,0x16,0x18, 0x82,0x8c,0xab,0x53,0x5e,0x89,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x4f, 0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x54,0x51,0x7e,0x40,0x3e,0x61,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x03,0x05,0x04,0x05,0x0d,0x0a,0x0d,0x14,0x11,0x15,0x1a,0x16, 0x1d,0x18,0x18,0x21,0x1f,0x21,0x28,0x2e,0x30,0x37,0x32,0x36,0x41,0x38,0x3b,0x46, 0x46,0x4a,0x56,0x59,0x5c,0x69,0x66,0x6a,0x73,0x68,0x6b,0x74,0x63,0x67,0x71,0x5a, 0x5e,0x6e,0x5c,0x62,0x75,0x60,0x67,0x7b,0x66,0x6d,0x82,0x66,0x6e,0x82,0x76,0x7b, 0x8c,0x92,0x96,0x9e,0x9b,0x9e,0xa6,0x89,0x8e,0x9a,0x6f,0x73,0x88,0x62,0x66,0x7c, 0x52,0x55,0x6a,0x46,0x46,0x5b,0x45,0x43,0x58,0x57,0x55,0x6e,0x57,0x53,0x6d,0x5a, 0x53,0x6c,0x5a,0x51,0x6a,0x4e,0x48,0x5f,0x43,0x40,0x55,0x46,0x42,0x59,0x46,0x45, 0x5e,0x48,0x4a,0x65,0x4c,0x53,0x6e,0x54,0x5c,0x75,0x62,0x6a,0x82,0x66,0x6e,0x86, 0x6a,0x72,0x89,0x71,0x78,0x8e,0x77,0x7e,0x92,0x76,0x7c,0x8e,0x73,0x79,0x8a,0x76, 0x7c,0x8b,0x71,0x76,0x84,0x6a,0x6e,0x7c,0x5e,0x63,0x72,0x54,0x59,0x69,0x55,0x5a, 0x6a,0x5f,0x65,0x76,0x61,0x68,0x7b,0x5f,0x66,0x7b,0x5f,0x67,0x7e,0x64,0x6b,0x83, 0x65,0x6c,0x85,0x67,0x6e,0x85,0x67,0x6e,0x86,0x67,0x6e,0x86,0x65,0x6a,0x82,0x65, 0x6a,0x81,0x69,0x6a,0x82,0x68,0x6d,0x83,0x65,0x66,0x7d,0x59,0x56,0x6e,0x52,0x49, 0x5c,0x48,0x3e,0x4e,0x3c,0x34,0x42,0x3e,0x36,0x46,0x3a,0x39,0x4e,0x3c,0x3d,0x52, 0x3e,0x42,0x58,0x3d,0x42,0x56,0x3d,0x41,0x54,0x43,0x47,0x56,0x5f,0x62,0x6e,0xaa, 0xa3,0xae,0xc4,0xbe,0xc4,0xa5,0xa3,0xb2,0x7d,0x7e,0x95,0x70,0x72,0x8a,0x5d,0x61, 0x7c,0x46,0x45,0x62,0x48,0x49,0x64,0x48,0x4a,0x67,0x4d,0x53,0x73,0x4b,0x53,0x76, 0x4c,0x4a,0x71,0x71,0x7a,0x9a,0x7f,0x7b,0x88,0x54,0x41,0x52,0x55,0x43,0x54,0x50, 0x3f,0x4f,0x4f,0x3e,0x4d,0x2f,0x24,0x2e,0x23,0x1a,0x23,0x21,0x19,0x21,0x28,0x1f, 0x2b,0x51,0x4e,0x79,0x5b,0x52,0x79,0x64,0x50,0x71,0x57,0x50,0x79,0x52,0x57,0x81, 0x52,0x57,0x81,0x52,0x5b,0x85,0x52,0x5d,0x86,0x64,0x53,0x76,0x6b,0x76,0x9b,0xee, 0xef,0xf4,0x4b,0x46,0x4d,0x33,0x25,0x2d,0x3c,0x2d,0x37,0x3b,0x2c,0x36,0x39,0x2b, 0x34,0x50,0x3e,0x4d,0x2e,0x26,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x30,0x38,0x90,0x9a,0xb5,0x52,0x52,0x7d,0x52, 0x52,0x7d,0x69,0x74,0x98,0x64,0x71,0x95,0x5a,0x65,0x8d,0x53,0x5e,0x87,0x52,0x5a, 0x83,0x3c,0x3d,0x5e,0x27,0x25,0x3e,0x27,0x28,0x40,0x28,0x2a,0x42,0x29,0x2c,0x44, 0x26,0x23,0x3c,0x27,0x29,0x41,0x40,0x40,0x55,0x43,0x42,0x45,0x03,0x03,0x04,0x03, 0x03,0x04,0x22,0x1c,0x22,0x52,0x51,0x61,0x97,0x9e,0xb3,0x2c,0x24,0x2c,0x05,0x05, 0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x08,0x35,0x29,0x32, 0x3c,0x30,0x3b,0x7a,0x74,0x80,0xa4,0xa8,0xb8,0x9a,0xa2,0xb6,0x98,0x9f,0xb4,0x23, 0x26,0x2c,0x0d,0x0e,0x12,0x21,0x1e,0x25,0x7f,0x89,0xa4,0x9b,0xa2,0xb8,0x88,0x8a, 0x9e,0x12,0x12,0x16,0x17,0x19,0x1e,0x18,0x1a,0x1f,0x19,0x1b,0x20,0x16,0x19,0x1e, 0x16,0x17,0x1d,0x43,0x44,0x49,0x2d,0x2f,0x36,0x22,0x25,0x2e,0x22,0x26,0x30,0x24, 0x27,0x30,0x3f,0x42,0x48,0x4f,0x50,0x57,0x46,0x49,0x52,0x4f,0x53,0x5f,0x5d,0x61, 0x6f,0x57,0x5d,0x6d,0x42,0x47,0x5b,0x3c,0x42,0x55,0x3e,0x44,0x56,0x3c,0x3e,0x54, 0x41,0x40,0x58,0x41,0x40,0x58,0x3e,0x3e,0x55,0x3c,0x3b,0x51,0x3a,0x3a,0x4e,0x3a, 0x3e,0x53,0x44,0x4a,0x5a,0x49,0x4e,0x60,0x3e,0x45,0x5a,0x42,0x42,0x5a,0x47,0x46, 0x5f,0x45,0x40,0x55,0x3e,0x37,0x48,0x3b,0x39,0x4e,0x44,0x48,0x5d,0x5a,0x5a,0x69, 0x5a,0x58,0x60,0x59,0x57,0x60,0x5a,0x59,0x62,0x54,0x53,0x5c,0x8f,0x92,0x9b,0x8b, 0x91,0xa1,0x66,0x6e,0x88,0x52,0x5a,0x7a,0x52,0x56,0x72,0x4b,0x52,0x6f,0x48,0x4d, 0x6a,0x47,0x4c,0x66,0x55,0x59,0x79,0x52,0x5a,0x7c,0x50,0x50,0x74,0x58,0x50,0x70, 0x5f,0x4d,0x65,0x52,0x3f,0x55,0x5b,0x49,0x61,0x4b,0x45,0x62,0x14,0x16,0x1d,0x16, 0x17,0x1e,0x14,0x16,0x1b,0x24,0x22,0x2d,0x2e,0x2b,0x41,0x2e,0x2a,0x3f,0x51,0x49, 0x69,0x58,0x4f,0x71,0x5b,0x51,0x75,0x5d,0x51,0x74,0x5e,0x52,0x75,0x5e,0x51,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5f,0x52,0x75,0x5e,0x53,0x76,0x5e,0x52,0x75,0x5e, 0x52,0x75,0x54,0x51,0x76,0x56,0x61,0x85,0x51,0x52,0x60,0x1e,0x21,0x28,0x1f,0x22, 0x28,0x20,0x22,0x29,0x1e,0x21,0x28,0x1d,0x1f,0x27,0x19,0x1b,0x22,0x22,0x21,0x28, 0x57,0x4c,0x5e,0x50,0x52,0x77,0x49,0x47,0x6b,0x3e,0x3d,0x5a,0x4e,0x4c,0x73,0x50, 0x4f,0x77,0x51,0x50,0x7a,0x51,0x51,0x7a,0x51,0x53,0x7c,0x52,0x55,0x7f,0x51,0x59, 0x82,0x51,0x5c,0x86,0x52,0x5c,0x86,0x53,0x5e,0x87,0x54,0x60,0x87,0x58,0x63,0x88, 0x60,0x6a,0x8d,0x1d,0x1f,0x23,0x2d,0x30,0x38,0x36,0x3a,0x45,0x37,0x3c,0x4d,0x47, 0x42,0x59,0x49,0x44,0x5a,0x79,0x79,0x8d,0x50,0x51,0x6d,0x47,0x49,0x65,0x4b,0x4b, 0x65,0x4c,0x4c,0x66,0x4c,0x50,0x6b,0x5c,0x60,0x6c,0x26,0x2a,0x35,0x2a,0x2e,0x3a, 0x30,0x34,0x42,0x33,0x37,0x45,0x32,0x36,0x44,0x36,0x3a,0x47,0x39,0x3d,0x49,0x48, 0x49,0x55,0x3c,0x3c,0x48,0x34,0x34,0x41,0x36,0x35,0x42,0x36,0x35,0x42,0x35,0x34, 0x42,0x35,0x34,0x42,0x33,0x32,0x40,0x32,0x31,0x3e,0x34,0x33,0x40,0x37,0x35,0x43, 0x37,0x35,0x43,0x38,0x36,0x44,0x35,0x34,0x41,0x31,0x2f,0x3c,0x2c,0x2b,0x38,0x2b, 0x2a,0x36,0x2a,0x29,0x36,0x27,0x27,0x32,0x26,0x25,0x30,0x21,0x21,0x2c,0x1f,0x1f, 0x28,0x1c,0x1d,0x26,0x1b,0x1b,0x23,0x19,0x19,0x21,0x16,0x15,0x1d,0x13,0x13,0x19, 0x10,0x10,0x16,0x0f,0x0f,0x14,0x0e,0x0e,0x12,0x0d,0x0d,0x11,0x0c,0x0b,0x10,0x0b, 0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x09,0x09,0x0c,0x09,0x09,0x0b,0x08,0x08, 0x0b,0x08,0x07,0x0a,0x07,0x07,0x0a,0x07,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07, 0x06,0x06,0x07,0x06,0x05,0x07,0x06,0x05,0x07,0x05,0x05,0x06,0x04,0x04,0x06,0x03, 0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03, 0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,0x86,0x91,0xaf,0x58,0x64,0x8d,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x6b,0x68, 0xa1,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,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, 0x02,0x02,0x02,0x03,0x03,0x03,0x06,0x05,0x06,0x0c,0x0a,0x0d,0x12,0x11,0x16,0x16, 0x16,0x1e,0x19,0x19,0x22,0x20,0x23,0x2d,0x31,0x34,0x3d,0x3b,0x3f,0x4a,0x4b,0x4e, 0x56,0x4f,0x52,0x59,0x55,0x59,0x62,0x5f,0x62,0x6e,0x6a,0x6e,0x77,0x63,0x66,0x70, 0x5c,0x61,0x6e,0x5f,0x65,0x75,0x6c,0x72,0x84,0x75,0x7a,0x8d,0x79,0x7f,0x92,0x77, 0x7e,0x91,0x7b,0x82,0x92,0x8a,0x8f,0x9b,0x86,0x89,0x96,0x62,0x67,0x7e,0x5a,0x5e, 0x76,0x51,0x52,0x6c,0x43,0x42,0x58,0x42,0x41,0x54,0x58,0x54,0x6c,0x5a,0x55,0x6e, 0x5c,0x56,0x6f,0x5e,0x55,0x6c,0x5a,0x4e,0x63,0x42,0x3e,0x52,0x30,0x2f,0x40,0x32, 0x32,0x42,0x3c,0x3c,0x52,0x42,0x43,0x5a,0x46,0x49,0x62,0x48,0x4f,0x69,0x51,0x57, 0x71,0x5a,0x62,0x7a,0x5a,0x62,0x7b,0x5c,0x65,0x7d,0x5f,0x66,0x7c,0x5f,0x65,0x78, 0x60,0x66,0x76,0x63,0x68,0x76,0x64,0x6a,0x76,0x5f,0x65,0x74,0x57,0x5d,0x6e,0x52, 0x58,0x6a,0x52,0x59,0x6c,0x64,0x6a,0x7e,0x66,0x6e,0x82,0x60,0x68,0x7d,0x60,0x67, 0x7e,0x64,0x6b,0x82,0x62,0x68,0x81,0x5f,0x66,0x7e,0x5e,0x65,0x7c,0x5e,0x64,0x7c, 0x5d,0x63,0x7a,0x5b,0x5e,0x73,0x61,0x63,0x78,0x64,0x68,0x7d,0x65,0x6a,0x7f,0x53, 0x53,0x6a,0x4a,0x42,0x56,0x45,0x3d,0x4f,0x3f,0x39,0x4a,0x3e,0x37,0x48,0x38,0x37, 0x4b,0x38,0x36,0x4a,0x39,0x3b,0x50,0x4a,0x4e,0x5f,0x42,0x47,0x58,0x40,0x45,0x54, 0x4a,0x4e,0x63,0x59,0x57,0x71,0x8e,0x8b,0x9c,0x86,0x88,0x9e,0x66,0x69,0x87,0x61, 0x64,0x7f,0x4c,0x50,0x6d,0x4c,0x47,0x63,0x47,0x45,0x61,0x45,0x47,0x63,0x48,0x4f, 0x6d,0x51,0x59,0x7c,0x4c,0x4a,0x71,0x5f,0x6b,0x8e,0x92,0x95,0xa9,0x4c,0x3b,0x49, 0x56,0x43,0x54,0x53,0x41,0x50,0x4f,0x3f,0x4d,0x3c,0x2f,0x3b,0x23,0x1a,0x22,0x22, 0x19,0x22,0x24,0x1b,0x26,0x50,0x4d,0x77,0x52,0x4f,0x7a,0x64,0x52,0x72,0x58,0x50, 0x79,0x52,0x55,0x80,0x52,0x57,0x82,0x52,0x5d,0x88,0x54,0x60,0x8a,0x64,0x53,0x75, 0x5c,0x69,0x90,0xe5,0xe7,0xed,0x67,0x64,0x6c,0x2e,0x22,0x29,0x3d,0x2e,0x38,0x3c, 0x2d,0x37,0x3b,0x2c,0x36,0x4b,0x3a,0x47,0x42,0x36,0x44,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x09,0x95,0x9d,0xb5, 0x5d,0x69,0x91,0x5b,0x52,0x79,0x60,0x6d,0x93,0x66,0x72,0x97,0x5a,0x66,0x8d,0x53, 0x5e,0x87,0x52,0x55,0x80,0x29,0x27,0x41,0x26,0x22,0x3c,0x27,0x26,0x3f,0x3f,0x45, 0x68,0x3d,0x43,0x63,0x3f,0x47,0x68,0x2d,0x29,0x44,0x33,0x35,0x4e,0x66,0x65,0x6c, 0x02,0x02,0x03,0x02,0x03,0x03,0x2b,0x23,0x2c,0x62,0x60,0x72,0x9c,0xa2,0xb5,0x0a, 0x09,0x0b,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x06, 0x07,0x06,0x06,0x08,0x1c,0x17,0x1d,0x3c,0x2f,0x3b,0x62,0x58,0x66,0x9c,0x9f,0xb0, 0x9a,0xa1,0xb6,0x9a,0xa1,0xb6,0x46,0x49,0x53,0x10,0x10,0x14,0x59,0x57,0x73,0x99, 0xa1,0xb7,0x9a,0xa1,0xb7,0x32,0x2f,0x39,0x15,0x16,0x1b,0x16,0x18,0x1e,0x16,0x18, 0x1d,0x16,0x18,0x1c,0x16,0x17,0x1c,0x25,0x27,0x2b,0x1d,0x1f,0x24,0x1e,0x20,0x26, 0x20,0x23,0x2c,0x20,0x22,0x2c,0x1c,0x1f,0x27,0x17,0x19,0x1f,0x16,0x19,0x1f,0x1f, 0x22,0x2a,0x3e,0x42,0x50,0x5e,0x63,0x72,0x68,0x6d,0x7d,0x52,0x57,0x6d,0x48,0x4f, 0x64,0x52,0x59,0x6a,0x47,0x4e,0x62,0x42,0x49,0x5f,0x3f,0x43,0x5a,0x3e,0x3f,0x56, 0x3d,0x42,0x56,0x52,0x57,0x64,0x5f,0x62,0x6a,0x5c,0x60,0x6b,0x4a,0x50,0x62,0x3f, 0x3f,0x56,0x45,0x44,0x5c,0x47,0x46,0x5e,0x43,0x41,0x57,0x3c,0x39,0x4b,0x3a,0x3d, 0x52,0x5e,0x5c,0x68,0x50,0x4d,0x54,0x4f,0x4c,0x53,0x52,0x51,0x59,0x57,0x55,0x5d, 0x8d,0x90,0x9a,0x85,0x8d,0x9e,0x62,0x6b,0x86,0x5b,0x64,0x82,0x52,0x5b,0x7b,0x50, 0x58,0x76,0x44,0x4d,0x67,0x3e,0x44,0x5d,0x3f,0x45,0x5f,0x3a,0x40,0x59,0x41,0x3d, 0x5a,0x52,0x4f,0x73,0x61,0x51,0x6b,0x5a,0x4a,0x5d,0x5c,0x4a,0x63,0x4a,0x45,0x62, 0x12,0x14,0x1a,0x14,0x16,0x1c,0x12,0x14,0x1a,0x24,0x21,0x2b,0x2e,0x2a,0x41,0x2d, 0x29,0x3f,0x51,0x49,0x69,0x57,0x4f,0x71,0x5c,0x51,0x73,0x5d,0x51,0x74,0x5e,0x51, 0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5f,0x52,0x76,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x55,0x51,0x77,0x56,0x61,0x85,0x51,0x52,0x60,0x1b, 0x1e,0x24,0x1e,0x20,0x27,0x1b,0x1e,0x27,0x1e,0x1e,0x29,0x20,0x1f,0x2a,0x17,0x19, 0x21,0x1b,0x1b,0x21,0x58,0x4b,0x5d,0x4f,0x53,0x78,0x49,0x48,0x6c,0x3d,0x3b,0x57, 0x4e,0x4c,0x73,0x50,0x4d,0x78,0x51,0x4e,0x79,0x52,0x50,0x79,0x51,0x53,0x7b,0x52, 0x55,0x7e,0x51,0x57,0x80,0x51,0x5b,0x84,0x51,0x5c,0x84,0x54,0x5f,0x87,0x55,0x61, 0x89,0x57,0x63,0x89,0x6a,0x74,0x95,0x3e,0x41,0x49,0x2d,0x2f,0x37,0x36,0x39,0x43, 0x4e,0x4c,0x5d,0x47,0x45,0x58,0x48,0x41,0x56,0x6e,0x69,0x7a,0x6d,0x6e,0x84,0x48, 0x4c,0x68,0x48,0x4a,0x65,0x49,0x48,0x65,0x4a,0x48,0x65,0x57,0x5c,0x76,0x22,0x24, 0x2d,0x26,0x2a,0x34,0x2b,0x2f,0x3b,0x2d,0x32,0x3e,0x2e,0x32,0x3e,0x2e,0x32,0x3f, 0x32,0x33,0x40,0x33,0x33,0x41,0x34,0x34,0x42,0x36,0x35,0x42,0x38,0x37,0x44,0x38, 0x38,0x44,0x35,0x34,0x41,0x33,0x33,0x3f,0x32,0x30,0x3d,0x31,0x2f,0x3d,0x33,0x31, 0x3f,0x34,0x32,0x40,0x33,0x33,0x3f,0x33,0x32,0x3f,0x32,0x31,0x3e,0x2f,0x2e,0x3b, 0x2b,0x2a,0x36,0x25,0x25,0x30,0x23,0x23,0x2e,0x20,0x21,0x2b,0x1b,0x1d,0x26,0x19, 0x1b,0x23,0x18,0x19,0x22,0x17,0x18,0x21,0x17,0x17,0x1f,0x14,0x16,0x1c,0x12,0x12, 0x19,0x11,0x11,0x17,0x10,0x10,0x16,0x0e,0x0e,0x14,0x0d,0x0d,0x12,0x0d,0x0d,0x12, 0x0c,0x0b,0x10,0x0b,0x0b,0x0f,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x09, 0x08,0x0b,0x09,0x08,0x0b,0x08,0x08,0x0a,0x08,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06, 0x09,0x06,0x06,0x08,0x06,0x05,0x07,0x06,0x05,0x07,0x05,0x05,0x06,0x05,0x05,0x06, 0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,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,0x63,0x6a,0x7c,0x62,0x6e,0x94,0x52,0x50, 0x7c,0x54,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x5b,0x57,0x8a,0x16,0x15,0x1c,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, 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,0x02,0x02,0x02,0x04,0x03,0x04,0x08,0x06,0x09,0x0e,0x0e,0x12, 0x13,0x13,0x1a,0x19,0x1a,0x22,0x1e,0x1f,0x2a,0x2a,0x2e,0x3a,0x34,0x39,0x48,0x4c, 0x50,0x5a,0x5a,0x5d,0x64,0x54,0x57,0x62,0x55,0x59,0x65,0x69,0x6c,0x75,0x6d,0x71, 0x7a,0x61,0x65,0x70,0x5f,0x65,0x73,0x71,0x76,0x86,0x80,0x86,0x95,0x81,0x86,0x97, 0x7f,0x85,0x97,0x7a,0x7f,0x93,0x76,0x7b,0x8e,0x75,0x78,0x89,0x68,0x6b,0x7f,0x52, 0x55,0x6e,0x4e,0x4d,0x64,0x43,0x3f,0x53,0x44,0x40,0x54,0x56,0x52,0x6b,0x5a,0x56, 0x70,0x5b,0x56,0x6f,0x5d,0x57,0x6e,0x5c,0x55,0x6b,0x4a,0x42,0x54,0x35,0x32,0x42, 0x2c,0x2c,0x3a,0x2e,0x2f,0x3e,0x35,0x35,0x48,0x3c,0x3b,0x50,0x43,0x43,0x5b,0x47, 0x47,0x60,0x45,0x46,0x5f,0x48,0x4e,0x64,0x4a,0x52,0x68,0x4a,0x51,0x66,0x47,0x4e, 0x61,0x42,0x49,0x5b,0x4a,0x4e,0x5e,0x52,0x57,0x64,0x57,0x5c,0x6a,0x52,0x58,0x69, 0x50,0x56,0x6a,0x47,0x4e,0x63,0x45,0x47,0x61,0x52,0x5a,0x70,0x5c,0x63,0x79,0x56, 0x5e,0x76,0x53,0x5b,0x74,0x51,0x58,0x73,0x50,0x52,0x6d,0x4a,0x4d,0x66,0x48,0x4e, 0x66,0x4c,0x52,0x66,0x4d,0x52,0x66,0x4e,0x52,0x65,0x54,0x5a,0x6b,0x5e,0x65,0x77, 0x64,0x6a,0x7e,0x4f,0x56,0x6c,0x42,0x43,0x5a,0x3f,0x3e,0x56,0x3b,0x3c,0x51,0x3a, 0x3a,0x4e,0x3a,0x3a,0x4e,0x3a,0x36,0x48,0x37,0x37,0x4a,0x4e,0x53,0x65,0x5f,0x64, 0x72,0x58,0x5d,0x6b,0x4a,0x4c,0x65,0x5b,0x4e,0x68,0x53,0x4b,0x66,0x55,0x50,0x6f, 0x52,0x51,0x71,0x69,0x6b,0x84,0x68,0x6a,0x81,0x4f,0x51,0x6d,0x41,0x42,0x5f,0x43, 0x47,0x62,0x44,0x4a,0x68,0x51,0x5a,0x7a,0x4c,0x4a,0x71,0x50,0x59,0x81,0x8b,0x93, 0xae,0x51,0x45,0x51,0x55,0x43,0x54,0x52,0x41,0x50,0x4f,0x3d,0x4d,0x47,0x37,0x45, 0x24,0x1a,0x23,0x22,0x18,0x22,0x24,0x1b,0x24,0x52,0x4f,0x78,0x52,0x4f,0x7a,0x64, 0x52,0x71,0x58,0x50,0x79,0x52,0x55,0x80,0x52,0x57,0x82,0x52,0x5c,0x86,0x55,0x60, 0x8a,0x64,0x53,0x75,0x53,0x5e,0x88,0xd6,0xd9,0xe3,0x87,0x86,0x91,0x2a,0x1e,0x24, 0x3c,0x2e,0x38,0x3d,0x2e,0x39,0x3b,0x2d,0x36,0x46,0x35,0x42,0x53,0x43,0x55,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5b,0x5f,0x70,0x76,0x82,0xa3,0x52,0x4f,0x7a,0x55,0x60,0x8a,0x69,0x74,0x98, 0x5b,0x67,0x8d,0x52,0x5d,0x85,0x52,0x50,0x7c,0x26,0x23,0x3b,0x26,0x22,0x3b,0x2b, 0x28,0x44,0x50,0x5b,0x86,0x55,0x62,0x8a,0x5a,0x65,0x8c,0x53,0x4f,0x79,0x5b,0x66, 0x8d,0x96,0x98,0xa8,0x14,0x14,0x14,0x02,0x03,0x03,0x2f,0x27,0x30,0x6a,0x68,0x76, 0x51,0x51,0x5c,0x03,0x03,0x04,0x03,0x03,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x04, 0x05,0x06,0x04,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x0e,0x0d,0x10,0x3c,0x2f, 0x3b,0x49,0x3d,0x49,0x7b,0x7e,0x90,0x97,0x9d,0xb5,0x9a,0xa1,0xb6,0x82,0x88,0x9c, 0x49,0x3f,0x4f,0x92,0x9a,0xb3,0x99,0xa1,0xb6,0x6e,0x6b,0x7e,0x15,0x16,0x1a,0x16, 0x17,0x1c,0x16,0x18,0x1c,0x16,0x17,0x1c,0x16,0x18,0x1d,0x18,0x1a,0x1e,0x18,0x1a, 0x1f,0x19,0x1b,0x20,0x1a,0x1b,0x21,0x16,0x18,0x1e,0x15,0x17,0x1d,0x14,0x16,0x1c, 0x15,0x16,0x1d,0x18,0x1a,0x22,0x22,0x26,0x2f,0x30,0x35,0x43,0x46,0x4b,0x5b,0x60, 0x64,0x75,0x5a,0x60,0x73,0x4e,0x54,0x68,0x5b,0x61,0x72,0x56,0x5c,0x6c,0x50,0x56, 0x69,0x45,0x4b,0x61,0x43,0x4a,0x5f,0x5a,0x5f,0x6f,0x6a,0x6e,0x76,0x70,0x73,0x7a, 0x61,0x66,0x74,0x3f,0x43,0x5a,0x46,0x4c,0x63,0x47,0x4e,0x66,0x42,0x46,0x5e,0x3d, 0x44,0x59,0x46,0x4b,0x59,0x6c,0x69,0x71,0x43,0x40,0x47,0x3b,0x38,0x3e,0x4a,0x47, 0x4f,0x52,0x51,0x58,0x91,0x94,0x9f,0x90,0x98,0xaa,0x72,0x7a,0x94,0x61,0x6a,0x87, 0x57,0x60,0x80,0x54,0x5e,0x7e,0x4c,0x55,0x73,0x45,0x4e,0x6a,0x45,0x4d,0x6a,0x3d, 0x43,0x5f,0x41,0x3d,0x5a,0x52,0x50,0x73,0x68,0x5c,0x76,0x5c,0x4b,0x5f,0x5d,0x4c, 0x67,0x47,0x42,0x5e,0x12,0x14,0x1a,0x13,0x16,0x1b,0x12,0x13,0x19,0x21,0x1e,0x27, 0x2d,0x2a,0x3f,0x2e,0x29,0x3e,0x52,0x49,0x69,0x58,0x4f,0x71,0x5b,0x51,0x76,0x5e, 0x51,0x74,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5f,0x53,0x76,0x5f,0x53, 0x76,0x5f,0x53,0x75,0x5e,0x52,0x75,0x5e,0x53,0x75,0x55,0x51,0x77,0x56,0x61,0x85, 0x55,0x55,0x66,0x1a,0x1b,0x22,0x1a,0x1b,0x23,0x21,0x20,0x2c,0x27,0x24,0x30,0x22, 0x20,0x2b,0x16,0x16,0x1e,0x14,0x15,0x19,0x59,0x4a,0x5b,0x52,0x54,0x7b,0x4a,0x47, 0x6c,0x3c,0x3a,0x57,0x4e,0x4c,0x73,0x51,0x4e,0x78,0x51,0x4e,0x78,0x51,0x50,0x79, 0x51,0x51,0x7a,0x52,0x52,0x7c,0x51,0x55,0x7e,0x51,0x59,0x82,0x52,0x5d,0x86,0x54, 0x5f,0x87,0x56,0x61,0x89,0x58,0x64,0x8a,0x60,0x6b,0x8f,0x81,0x8a,0xa3,0x9e,0xa2, 0xae,0x7f,0x80,0x8c,0x50,0x4c,0x5b,0x4c,0x47,0x57,0x43,0x3f,0x50,0x43,0x3c,0x4d, 0x90,0x93,0xa1,0x51,0x58,0x74,0x4b,0x4d,0x67,0x4a,0x4d,0x69,0x49,0x4d,0x69,0x4e, 0x52,0x6e,0x5a,0x5d,0x69,0x26,0x29,0x32,0x2c,0x2f,0x3a,0x31,0x34,0x40,0x31,0x33, 0x3f,0x2f,0x30,0x3d,0x2f,0x2f,0x3d,0x32,0x32,0x3e,0x35,0x35,0x42,0x38,0x37,0x44, 0x38,0x37,0x44,0x37,0x37,0x43,0x33,0x32,0x3f,0x33,0x32,0x3f,0x32,0x2f,0x3d,0x30, 0x2d,0x3a,0x2d,0x2b,0x38,0x2e,0x2d,0x3a,0x2e,0x2d,0x3a,0x2e,0x2d,0x3a,0x2d,0x2d, 0x39,0x2b,0x2a,0x36,0x27,0x26,0x32,0x21,0x21,0x2b,0x1c,0x1d,0x27,0x19,0x1b,0x24, 0x18,0x1a,0x22,0x17,0x19,0x21,0x16,0x17,0x1f,0x16,0x16,0x1e,0x14,0x15,0x1c,0x12, 0x13,0x1a,0x12,0x12,0x18,0x11,0x11,0x17,0x0f,0x0f,0x15,0x0e,0x0e,0x13,0x0d,0x0d, 0x12,0x0c,0x0c,0x11,0x0c,0x0b,0x10,0x0c,0x0c,0x10,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e, 0x09,0x09,0x0c,0x09,0x09,0x0c,0x09,0x09,0x0c,0x08,0x08,0x0a,0x08,0x08,0x0a,0x07, 0x07,0x0a,0x07,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x05, 0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x05,0x03, 0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x2f,0x32,0x3a,0x6c, 0x77,0x9b,0x52,0x5a,0x84,0x53,0x4f,0x7a,0x54,0x50,0x79,0x54,0x50,0x79,0x53,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x53,0x50,0x7c,0x4c,0x4a,0x73,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,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,0x02,0x02,0x02,0x03,0x03,0x03,0x06,0x05,0x06,0x0b,0x0a, 0x0c,0x0f,0x0e,0x14,0x15,0x14,0x1b,0x1c,0x1e,0x27,0x23,0x25,0x32,0x2c,0x2c,0x3c, 0x3d,0x42,0x4f,0x52,0x56,0x60,0x59,0x5e,0x68,0x53,0x58,0x65,0x5a,0x5f,0x6a,0x6d, 0x71,0x7a,0x72,0x76,0x7f,0x65,0x6a,0x78,0x75,0x79,0x87,0x8d,0x92,0x9e,0x92,0x97, 0xa3,0x86,0x8c,0x9b,0x7b,0x82,0x93,0x6e,0x74,0x89,0x62,0x66,0x7a,0x5c,0x5f,0x75, 0x52,0x55,0x6e,0x4c,0x49,0x5e,0x47,0x43,0x56,0x4a,0x46,0x5a,0x55,0x51,0x6a,0x59, 0x55,0x6e,0x58,0x56,0x6d,0x5b,0x55,0x6b,0x5a,0x54,0x6a,0x50,0x4a,0x5f,0x3f,0x3a, 0x4a,0x37,0x32,0x41,0x34,0x30,0x3f,0x31,0x31,0x42,0x2f,0x2f,0x40,0x33,0x33,0x45, 0x3e,0x3c,0x51,0x42,0x40,0x56,0x3e,0x3e,0x53,0x38,0x3c,0x4f,0x3a,0x3f,0x52,0x3a, 0x3e,0x4f,0x38,0x3c,0x4a,0x36,0x3a,0x4a,0x37,0x3b,0x4c,0x42,0x47,0x56,0x46,0x4b, 0x5a,0x44,0x49,0x59,0x4c,0x52,0x62,0x48,0x4f,0x63,0x45,0x45,0x5d,0x43,0x44,0x5d, 0x43,0x43,0x5b,0x43,0x43,0x5c,0x47,0x47,0x62,0x49,0x48,0x62,0x48,0x47,0x62,0x44, 0x45,0x5d,0x40,0x45,0x5a,0x45,0x4a,0x5c,0x4a,0x4e,0x61,0x56,0x5b,0x6b,0x5f,0x63, 0x75,0x66,0x6c,0x7e,0x66,0x6d,0x7f,0x5c,0x62,0x76,0x50,0x56,0x6b,0x43,0x4a,0x60, 0x3e,0x45,0x5a,0x3c,0x42,0x56,0x39,0x3e,0x52,0x3f,0x45,0x58,0x3c,0x42,0x56,0x4e, 0x54,0x67,0x72,0x76,0x84,0x6e,0x73,0x81,0x57,0x5f,0x79,0x5d,0x4e,0x66,0x59,0x4d, 0x66,0x50,0x4c,0x69,0x54,0x51,0x71,0x5c,0x5d,0x78,0x66,0x67,0x7f,0x5d,0x5e,0x78, 0x48,0x4b,0x67,0x40,0x46,0x63,0x43,0x48,0x66,0x4b,0x53,0x71,0x4f,0x56,0x7c,0x4e, 0x4b,0x74,0x75,0x7f,0x9f,0x76,0x70,0x7e,0x53,0x41,0x51,0x50,0x40,0x4f,0x4f,0x3d, 0x4d,0x4d,0x3b,0x4a,0x23,0x1a,0x23,0x23,0x1a,0x23,0x2b,0x20,0x2a,0x51,0x4d,0x75, 0x52,0x4f,0x7a,0x64,0x53,0x74,0x5a,0x52,0x79,0x52,0x54,0x7e,0x52,0x57,0x82,0x52, 0x57,0x82,0x54,0x5f,0x89,0x53,0x50,0x79,0x52,0x55,0x81,0xc0,0xc6,0xd5,0xa9,0xaa, 0xb3,0x27,0x1c,0x22,0x3b,0x2d,0x36,0x3f,0x30,0x3b,0x3d,0x2e,0x39,0x43,0x33,0x3f, 0x60,0x4f,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2f,0x31,0x39,0x86,0x91,0xaf,0x53,0x5e,0x89,0x52,0x4f, 0x7a,0x62,0x6e,0x93,0x5b,0x67,0x8f,0x52,0x5d,0x87,0x45,0x42,0x68,0x26,0x22,0x3b, 0x26,0x22,0x3b,0x50,0x51,0x7b,0x53,0x5e,0x87,0x56,0x62,0x8b,0x5c,0x68,0x90,0x51, 0x5c,0x84,0x53,0x5e,0x87,0x90,0x9a,0xb5,0x64,0x65,0x65,0x02,0x03,0x03,0x0d,0x0b, 0x0e,0x41,0x42,0x48,0x13,0x14,0x16,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x05, 0x04,0x04,0x06,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x06,0x07,0x06, 0x06,0x09,0x0c,0x0b,0x0e,0x3c,0x30,0x3b,0x45,0x37,0x45,0x47,0x4a,0x5a,0x87,0x8f, 0xaa,0x9a,0xa1,0xb6,0x93,0x9b,0xb1,0x83,0x8b,0xa7,0x99,0xa0,0xb6,0x95,0x9c,0xb3, 0x1c,0x1c,0x22,0x14,0x16,0x1a,0x14,0x16,0x1a,0x14,0x16,0x1a,0x15,0x16,0x1a,0x16, 0x17,0x1c,0x17,0x19,0x1e,0x18,0x1a,0x1e,0x16,0x18,0x1d,0x12,0x13,0x16,0x0e,0x0f, 0x12,0x0e,0x0e,0x12,0x0f,0x10,0x14,0x14,0x15,0x1a,0x18,0x1a,0x20,0x20,0x22,0x2a, 0x28,0x2b,0x37,0x34,0x39,0x48,0x56,0x5b,0x6a,0x5e,0x62,0x70,0x47,0x4c,0x5c,0x59, 0x5e,0x6a,0x55,0x5a,0x69,0x55,0x5a,0x6a,0x4e,0x55,0x67,0x4a,0x50,0x63,0x4f,0x54, 0x63,0x56,0x5a,0x67,0x54,0x59,0x66,0x40,0x46,0x5c,0x43,0x47,0x5f,0x73,0x78,0x86, 0x5c,0x61,0x6f,0x43,0x48,0x56,0x58,0x5b,0x62,0x78,0x76,0x7e,0x71,0x6f,0x77,0x51, 0x4f,0x58,0x4d,0x49,0x50,0x47,0x45,0x4c,0x90,0x92,0x9d,0x9a,0xa0,0xb1,0x81,0x88, 0xa0,0x6c,0x73,0x8f,0x58,0x63,0x82,0x56,0x61,0x82,0x55,0x60,0x83,0x53,0x5c,0x7f, 0x4f,0x58,0x7a,0x41,0x4a,0x66,0x3a,0x39,0x55,0x50,0x49,0x6a,0x62,0x59,0x76,0x6a, 0x5b,0x70,0x61,0x50,0x6b,0x41,0x3f,0x5b,0x11,0x12,0x18,0x12,0x14,0x1a,0x11,0x12, 0x17,0x21,0x1e,0x26,0x2a,0x28,0x40,0x2f,0x29,0x3f,0x52,0x49,0x6a,0x58,0x4f,0x71, 0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x5f,0x53,0x76,0x5f,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x75,0x56,0x51, 0x77,0x55,0x60,0x85,0x58,0x58,0x69,0x18,0x1a,0x20,0x17,0x1a,0x21,0x1a,0x1a,0x24, 0x1c,0x1c,0x26,0x17,0x18,0x20,0x14,0x16,0x1c,0x11,0x12,0x16,0x57,0x48,0x5a,0x55, 0x59,0x83,0x4d,0x49,0x6d,0x3d,0x3a,0x55,0x4d,0x4b,0x73,0x50,0x4e,0x78,0x51,0x4f, 0x78,0x51,0x4f,0x79,0x51,0x50,0x7a,0x52,0x52,0x7c,0x52,0x54,0x7e,0x52,0x58,0x81, 0x51,0x5c,0x86,0x53,0x5e,0x87,0x55,0x60,0x88,0x59,0x63,0x8b,0x5c,0x67,0x8b,0x61, 0x6c,0x8e,0x71,0x7a,0x97,0x7e,0x86,0x9e,0x83,0x8a,0x9e,0x90,0x93,0xa0,0x7a,0x79, 0x84,0x4d,0x45,0x53,0x74,0x76,0x87,0x55,0x5d,0x7b,0x4c,0x50,0x6e,0x4b,0x4d,0x6a, 0x4b,0x4f,0x6b,0x4f,0x52,0x6f,0x67,0x6b,0x80,0x26,0x29,0x32,0x2e,0x31,0x3c,0x33, 0x34,0x42,0x32,0x33,0x40,0x2f,0x2f,0x3c,0x2f,0x2e,0x3a,0x30,0x30,0x3c,0x34,0x34, 0x41,0x36,0x36,0x42,0x35,0x34,0x42,0x34,0x32,0x40,0x33,0x31,0x3f,0x32,0x30,0x3d, 0x2f,0x2d,0x3a,0x2b,0x2a,0x36,0x29,0x28,0x34,0x29,0x28,0x34,0x2a,0x28,0x35,0x2a, 0x29,0x35,0x29,0x27,0x34,0x27,0x26,0x31,0x25,0x23,0x2e,0x1d,0x1c,0x27,0x18,0x1a, 0x22,0x17,0x19,0x22,0x17,0x19,0x22,0x16,0x17,0x1f,0x16,0x16,0x1e,0x15,0x16,0x1d, 0x13,0x15,0x1b,0x12,0x12,0x19,0x12,0x12,0x18,0x10,0x10,0x16,0x0f,0x0f,0x15,0x0e, 0x0e,0x13,0x0d,0x0d,0x11,0x0c,0x0c,0x11,0x0c,0x0b,0x10,0x0b,0x0b,0x0f,0x0a,0x0a, 0x0e,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x09,0x09,0x0c,0x09,0x08,0x0b,0x08,0x08,0x0a, 0x07,0x07,0x0a,0x07,0x06,0x09,0x06,0x06,0x09,0x07,0x06,0x09,0x06,0x06,0x08,0x06, 0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04, 0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x05, 0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03, 0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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, 0x09,0x0a,0x0c,0x74,0x80,0xa2,0x54,0x60,0x8a,0x52,0x4f,0x7a,0x56,0x50,0x79,0x55, 0x50,0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x53,0x4f,0x7a,0x53,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x6b,0x66,0x9e, 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,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,0x02,0x02,0x02,0x06,0x05,0x06,0x09, 0x08,0x0b,0x0f,0x0e,0x12,0x13,0x11,0x16,0x17,0x16,0x1e,0x20,0x21,0x2d,0x2a,0x2a, 0x39,0x30,0x36,0x45,0x45,0x4a,0x58,0x5b,0x5f,0x6c,0x62,0x67,0x75,0x6c,0x71,0x7c, 0x73,0x77,0x82,0x6a,0x6f,0x81,0x6e,0x74,0x83,0x70,0x76,0x86,0x8a,0x8f,0x9b,0x9b, 0x9f,0xa9,0x97,0x9b,0xa6,0x81,0x86,0x97,0x6d,0x71,0x86,0x5a,0x5e,0x76,0x4e,0x51, 0x6a,0x4a,0x4b,0x64,0x46,0x44,0x58,0x45,0x42,0x55,0x46,0x44,0x57,0x52,0x4e,0x65, 0x54,0x50,0x67,0x54,0x50,0x66,0x56,0x50,0x66,0x56,0x4f,0x64,0x55,0x4e,0x63,0x46, 0x41,0x53,0x3e,0x38,0x47,0x3c,0x35,0x43,0x40,0x39,0x48,0x3d,0x36,0x47,0x34,0x31, 0x41,0x2c,0x2b,0x3b,0x32,0x31,0x41,0x37,0x35,0x46,0x39,0x36,0x4a,0x34,0x33,0x46, 0x31,0x31,0x42,0x2e,0x2f,0x3f,0x2a,0x2d,0x3b,0x2a,0x2d,0x3b,0x2c,0x2f,0x3e,0x2f, 0x33,0x42,0x32,0x37,0x47,0x39,0x3e,0x4e,0x52,0x57,0x66,0x46,0x4c,0x5f,0x40,0x40, 0x57,0x47,0x42,0x58,0x4e,0x44,0x58,0x49,0x42,0x57,0x45,0x43,0x5b,0x48,0x47,0x62, 0x47,0x48,0x62,0x48,0x4e,0x66,0x4e,0x55,0x6b,0x4f,0x56,0x6a,0x4a,0x50,0x63,0x54, 0x5a,0x6c,0x59,0x5e,0x6f,0x63,0x6a,0x7a,0x60,0x65,0x76,0x59,0x5f,0x70,0x52,0x58, 0x6b,0x42,0x4a,0x5e,0x40,0x46,0x5b,0x3e,0x43,0x56,0x36,0x3a,0x4b,0x43,0x48,0x56, 0x52,0x57,0x68,0x4c,0x52,0x67,0x5b,0x62,0x75,0x62,0x67,0x78,0x67,0x6f,0x86,0x4f, 0x48,0x63,0x50,0x49,0x65,0x58,0x58,0x74,0x53,0x53,0x6e,0x59,0x59,0x73,0x59,0x5a, 0x74,0x58,0x59,0x74,0x4e,0x51,0x70,0x44,0x47,0x66,0x43,0x49,0x69,0x4a,0x50,0x70, 0x51,0x59,0x7b,0x4d,0x4e,0x76,0x61,0x6d,0x92,0x8c,0x8c,0x9e,0x4e,0x3d,0x4b,0x52, 0x41,0x50,0x50,0x3f,0x4e,0x4c,0x3b,0x4a,0x25,0x1b,0x24,0x23,0x19,0x23,0x27,0x1c, 0x26,0x50,0x4b,0x71,0x52,0x4f,0x7a,0x64,0x52,0x73,0x5e,0x53,0x79,0x52,0x53,0x7e, 0x52,0x55,0x81,0x52,0x57,0x82,0x53,0x5f,0x89,0x52,0x50,0x7b,0x52,0x4f,0x7a,0xb2, 0xb9,0xcb,0xcc,0xd0,0xd9,0x25,0x1a,0x20,0x3a,0x2b,0x35,0x41,0x32,0x3d,0x3f,0x30, 0x3a,0x3f,0x30,0x3a,0x65,0x51,0x65,0x05,0x05,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x0b,0x91,0x9a,0xb3,0x62, 0x6d,0x94,0x54,0x50,0x79,0x5c,0x67,0x8f,0x5f,0x6b,0x91,0x52,0x5d,0x87,0x39,0x36, 0x57,0x26,0x22,0x3b,0x42,0x3e,0x62,0x52,0x55,0x80,0x54,0x5f,0x88,0x58,0x64,0x8b, 0x5b,0x66,0x8f,0x5a,0x65,0x8d,0x51,0x4f,0x7a,0x74,0x7f,0xa1,0xba,0xbb,0xbe,0x02, 0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x05,0x06, 0x05,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x0d,0x0b,0x0f,0x40,0x32,0x3e,0x46, 0x38,0x46,0x57,0x51,0x69,0x73,0x7c,0x9a,0x98,0xa0,0xb5,0x81,0x8a,0xa7,0x98,0x9f, 0xb6,0x97,0x9f,0xb5,0x55,0x53,0x63,0x10,0x12,0x16,0x11,0x12,0x16,0x11,0x12,0x16, 0x12,0x14,0x18,0x13,0x15,0x19,0x14,0x16,0x1a,0x14,0x15,0x19,0x11,0x12,0x16,0x0e, 0x0f,0x13,0x0c,0x0d,0x10,0x0a,0x0b,0x0e,0x0b,0x0d,0x10,0x10,0x12,0x16,0x14,0x16, 0x1a,0x16,0x18,0x1e,0x1c,0x1e,0x25,0x24,0x27,0x32,0x37,0x3b,0x48,0x67,0x6a,0x72, 0x3a,0x3e,0x4a,0x36,0x3a,0x46,0x50,0x54,0x60,0x59,0x5e,0x6a,0x55,0x5a,0x69,0x4a, 0x50,0x62,0x3a,0x3f,0x52,0x3a,0x40,0x4f,0x46,0x4b,0x5b,0x46,0x4c,0x5e,0x47,0x4d, 0x60,0x63,0x69,0x76,0x7e,0x82,0x8a,0x74,0x76,0x7c,0x3e,0x41,0x48,0x60,0x5e,0x69, 0x6b,0x6a,0x74,0x6f,0x6d,0x76,0x50,0x4e,0x56,0x47,0x44,0x4b,0x89,0x8c,0x96,0x8f, 0x97,0xa9,0x7f,0x86,0x9e,0x6c,0x76,0x92,0x59,0x65,0x85,0x57,0x62,0x85,0x57,0x62, 0x86,0x55,0x60,0x84,0x52,0x5d,0x82,0x4b,0x54,0x77,0x3d,0x3f,0x5d,0x3d,0x39,0x54, 0x62,0x53,0x71,0x59,0x4b,0x66,0x5a,0x49,0x64,0x3d,0x3c,0x5b,0x0f,0x11,0x16,0x11, 0x12,0x18,0x0f,0x11,0x16,0x1e,0x1c,0x23,0x2a,0x2d,0x44,0x32,0x2e,0x46,0x4e,0x46, 0x67,0x57,0x4d,0x70,0x5c,0x51,0x76,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x53,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5e,0x54,0x76,0x5e, 0x53,0x76,0x59,0x53,0x77,0x54,0x5e,0x84,0x57,0x59,0x6a,0x18,0x1a,0x20,0x17,0x19, 0x1f,0x16,0x19,0x1e,0x18,0x1a,0x20,0x16,0x17,0x1c,0x14,0x16,0x1a,0x0f,0x10,0x14, 0x53,0x45,0x56,0x53,0x55,0x7d,0x4d,0x4a,0x6e,0x3c,0x39,0x55,0x51,0x4d,0x73,0x51, 0x4f,0x78,0x51,0x4f,0x78,0x51,0x4f,0x78,0x51,0x4f,0x79,0x52,0x52,0x7c,0x52,0x53, 0x7c,0x52,0x55,0x7f,0x52,0x5b,0x84,0x53,0x5d,0x86,0x55,0x60,0x88,0x58,0x63,0x8b, 0x5b,0x65,0x89,0x5d,0x68,0x8a,0x61,0x6b,0x8c,0x69,0x71,0x8f,0x74,0x7c,0x95,0x7d, 0x84,0x9a,0x88,0x8f,0xa0,0x92,0x98,0xa7,0x78,0x80,0x96,0x59,0x61,0x81,0x52,0x5c, 0x7a,0x4e,0x52,0x6f,0x4e,0x51,0x6e,0x4f,0x52,0x6f,0x5a,0x5d,0x7a,0x4b,0x4d,0x57, 0x2b,0x2e,0x39,0x30,0x31,0x3d,0x2f,0x30,0x3d,0x2c,0x2d,0x39,0x2e,0x2e,0x3a,0x31, 0x30,0x3c,0x33,0x33,0x40,0x33,0x32,0x3f,0x33,0x32,0x3f,0x33,0x30,0x3e,0x30,0x2e, 0x3b,0x2e,0x2b,0x39,0x2a,0x29,0x36,0x28,0x27,0x33,0x28,0x25,0x31,0x27,0x25,0x30, 0x28,0x25,0x31,0x27,0x25,0x30,0x26,0x24,0x30,0x24,0x22,0x2d,0x1e,0x1e,0x27,0x18, 0x1a,0x22,0x17,0x19,0x21,0x17,0x18,0x20,0x16,0x17,0x1f,0x16,0x16,0x1e,0x15,0x16, 0x1d,0x13,0x15,0x1b,0x12,0x13,0x1a,0x12,0x12,0x18,0x10,0x10,0x16,0x0f,0x0f,0x15, 0x0e,0x0e,0x13,0x0e,0x0e,0x12,0x0d,0x0d,0x11,0x0c,0x0c,0x11,0x0c,0x0b,0x10,0x0b, 0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x09,0x08,0x0b,0x08,0x08, 0x0b,0x08,0x08,0x0b,0x07,0x07,0x0a,0x07,0x06,0x09,0x07,0x07,0x0a,0x07,0x06,0x09, 0x07,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06, 0x05,0x07,0x06,0x05,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x05,0x05,0x06,0x04,0x04, 0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05, 0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,0x7a,0x86,0xa5,0x5a,0x65,0x8e,0x52,0x4f,0x7b, 0x57,0x50,0x79,0x56,0x50,0x79,0x56,0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x54, 0x50,0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x54,0x50, 0x79,0x5f,0x59,0x89,0x17,0x16,0x1f,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,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,0x02,0x02,0x02,0x04,0x03,0x04, 0x09,0x0a,0x0c,0x0e,0x0f,0x13,0x11,0x12,0x17,0x18,0x1a,0x22,0x23,0x27,0x31,0x2f, 0x33,0x41,0x39,0x3e,0x4c,0x48,0x4d,0x5c,0x64,0x69,0x77,0x72,0x77,0x84,0x7a,0x7e, 0x8a,0x78,0x7d,0x8a,0x72,0x77,0x86,0x7f,0x84,0x90,0x86,0x8a,0x96,0x91,0x95,0xa1, 0x9c,0x9f,0xa9,0x98,0x9b,0xa6,0x86,0x89,0x98,0x6e,0x72,0x86,0x5d,0x60,0x78,0x4d, 0x4f,0x69,0x48,0x47,0x5e,0x45,0x42,0x55,0x43,0x40,0x52,0x46,0x43,0x56,0x50,0x4c, 0x62,0x4e,0x4c,0x60,0x4d,0x46,0x59,0x4c,0x43,0x55,0x4d,0x45,0x57,0x4d,0x45,0x56, 0x4a,0x41,0x52,0x46,0x3b,0x4b,0x43,0x38,0x46,0x42,0x37,0x45,0x42,0x36,0x45,0x40, 0x36,0x43,0x39,0x32,0x3e,0x34,0x2e,0x3b,0x32,0x2e,0x3c,0x34,0x30,0x3f,0x35,0x32, 0x43,0x37,0x33,0x45,0x3c,0x38,0x4a,0x41,0x3b,0x4d,0x3c,0x37,0x48,0x34,0x32,0x41, 0x32,0x30,0x3f,0x32,0x2f,0x3f,0x32,0x31,0x42,0x32,0x30,0x41,0x34,0x34,0x47,0x38, 0x37,0x4a,0x45,0x3d,0x4e,0x48,0x3b,0x4a,0x46,0x39,0x47,0x4e,0x40,0x50,0x4f,0x47, 0x5d,0x47,0x46,0x5f,0x46,0x46,0x5f,0x4b,0x4c,0x66,0x4d,0x4e,0x66,0x44,0x44,0x58, 0x49,0x43,0x54,0x43,0x46,0x5a,0x4f,0x54,0x67,0x4c,0x52,0x65,0x4b,0x52,0x65,0x4c, 0x52,0x64,0x46,0x4b,0x5e,0x3e,0x45,0x58,0x3d,0x42,0x56,0x3a,0x40,0x50,0x2f,0x33, 0x41,0x32,0x36,0x45,0x4b,0x51,0x62,0x56,0x5c,0x70,0x58,0x5e,0x71,0x5c,0x62,0x73, 0x73,0x7a,0x91,0x84,0x80,0x8f,0xa1,0x9a,0xa7,0x7d,0x7a,0x8d,0x4e,0x4d,0x69,0x4d, 0x4c,0x6b,0x4f,0x4f,0x6f,0x52,0x54,0x73,0x4d,0x50,0x72,0x4a,0x4d,0x6f,0x44,0x4a, 0x6a,0x49,0x4f,0x6e,0x54,0x5d,0x7e,0x4c,0x56,0x7e,0x58,0x62,0x89,0xa0,0xa7,0xbc, 0x46,0x37,0x44,0x51,0x40,0x50,0x51,0x3f,0x4e,0x4c,0x3b,0x48,0x26,0x1d,0x27,0x23, 0x19,0x22,0x24,0x1a,0x23,0x50,0x49,0x6c,0x52,0x4f,0x7a,0x64,0x53,0x76,0x5f,0x53, 0x77,0x52,0x52,0x7d,0x52,0x53,0x7e,0x52,0x58,0x83,0x52,0x5d,0x88,0x52,0x5a,0x84, 0x5e,0x53,0x79,0xa1,0xaa,0xc1,0xe7,0xe9,0xef,0x3d,0x33,0x38,0x38,0x2a,0x33,0x42, 0x32,0x3d,0x41,0x31,0x3c,0x40,0x31,0x3b,0x5b,0x48,0x59,0x17,0x17,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x5d,0x62,0x72,0x74,0x80,0xa2,0x52,0x53,0x7e,0x52,0x5d,0x88,0x65,0x71,0x95,0x54, 0x60,0x89,0x3a,0x38,0x5a,0x26,0x22,0x3b,0x4f,0x50,0x79,0x52,0x5d,0x85,0x55,0x60, 0x89,0x5b,0x66,0x8d,0x5d,0x6a,0x90,0x61,0x6c,0x93,0x51,0x51,0x7c,0x5d,0x69,0x8f, 0xc9,0xce,0xda,0x25,0x25,0x25,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x04,0x04,0x04, 0x06,0x04,0x04,0x06,0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x09, 0x09,0x09,0x0c,0x37,0x2b,0x37,0x4a,0x3d,0x4b,0x55,0x4c,0x63,0x5f,0x69,0x8d,0x7a, 0x84,0xa2,0x95,0x9c,0xb4,0x97,0x9e,0xb5,0x90,0x95,0xab,0x14,0x16,0x1a,0x0f,0x10, 0x15,0x0e,0x0f,0x13,0x0f,0x11,0x15,0x10,0x12,0x16,0x12,0x12,0x16,0x10,0x11,0x15, 0x0e,0x0f,0x12,0x0d,0x0e,0x11,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x12, 0x13,0x1a,0x15,0x16,0x1d,0x12,0x13,0x17,0x13,0x15,0x19,0x16,0x18,0x1e,0x1c,0x1e, 0x26,0x2a,0x2d,0x37,0x46,0x49,0x52,0x36,0x3a,0x46,0x35,0x3a,0x48,0x42,0x46,0x54, 0x4e,0x52,0x5e,0x4f,0x54,0x61,0x3b,0x3f,0x4e,0x35,0x39,0x48,0x3b,0x41,0x50,0x46, 0x4b,0x5b,0x57,0x5c,0x69,0x5e,0x62,0x6f,0x76,0x79,0x83,0x8e,0x8f,0x93,0x78,0x7a, 0x7e,0x59,0x57,0x62,0x5d,0x5c,0x66,0x65,0x64,0x6d,0x57,0x55,0x5e,0x4b,0x49,0x50, 0x84,0x85,0x8e,0x83,0x8a,0x9e,0x71,0x7a,0x93,0x6a,0x73,0x90,0x5b,0x65,0x86,0x59, 0x64,0x88,0x58,0x65,0x88,0x56,0x63,0x87,0x55,0x60,0x86,0x51,0x5c,0x80,0x46,0x48, 0x6a,0x3d,0x39,0x58,0x46,0x39,0x50,0x4d,0x39,0x4d,0x5b,0x46,0x5e,0x3d,0x3e,0x5d, 0x0f,0x11,0x16,0x0f,0x11,0x16,0x0e,0x10,0x15,0x1d,0x1a,0x21,0x31,0x34,0x4a,0x31, 0x2e,0x47,0x4d,0x45,0x66,0x56,0x4d,0x6f,0x5b,0x51,0x76,0x5e,0x51,0x75,0x5e,0x52, 0x76,0x5e,0x53,0x76,0x5f,0x52,0x76,0x5f,0x53,0x77,0x5f,0x53,0x76,0x5f,0x54,0x76, 0x5e,0x54,0x76,0x5e,0x53,0x76,0x58,0x53,0x77,0x52,0x5c,0x83,0x5b,0x5c,0x6f,0x16, 0x18,0x1e,0x18,0x1a,0x1f,0x16,0x18,0x1d,0x16,0x19,0x1e,0x15,0x16,0x1b,0x13,0x14, 0x19,0x10,0x11,0x15,0x4e,0x41,0x51,0x54,0x58,0x7e,0x4e,0x4b,0x6f,0x3c,0x39,0x55, 0x50,0x4c,0x72,0x52,0x4f,0x78,0x51,0x4e,0x78,0x51,0x4f,0x78,0x50,0x4f,0x78,0x51, 0x50,0x7a,0x52,0x52,0x7c,0x52,0x55,0x7f,0x52,0x5b,0x83,0x53,0x5e,0x86,0x55,0x5f, 0x88,0x57,0x62,0x89,0x5a,0x65,0x8a,0x5d,0x67,0x8a,0x62,0x6c,0x8c,0x67,0x72,0x8f, 0x77,0x7f,0x98,0x81,0x89,0x9e,0x83,0x8a,0xa0,0x86,0x8d,0xa1,0x85,0x8b,0xa0,0x71, 0x7a,0x94,0x5f,0x67,0x88,0x57,0x5f,0x7e,0x50,0x53,0x72,0x50,0x52,0x70,0x56,0x58, 0x75,0x6d,0x6f,0x7f,0x25,0x28,0x31,0x29,0x2b,0x36,0x2a,0x2a,0x36,0x28,0x28,0x34, 0x2b,0x2b,0x37,0x2f,0x2e,0x3b,0x31,0x30,0x3d,0x33,0x31,0x3f,0x32,0x30,0x3d,0x2e, 0x2c,0x39,0x2b,0x29,0x36,0x29,0x27,0x34,0x28,0x26,0x32,0x27,0x25,0x30,0x26,0x24, 0x30,0x25,0x23,0x2e,0x25,0x23,0x2f,0x24,0x22,0x2d,0x20,0x1f,0x29,0x1c,0x1c,0x25, 0x18,0x19,0x22,0x16,0x17,0x20,0x16,0x17,0x1f,0x16,0x16,0x1e,0x16,0x16,0x1e,0x14, 0x16,0x1c,0x13,0x14,0x1b,0x13,0x13,0x1a,0x12,0x12,0x1a,0x11,0x11,0x17,0x0f,0x0f, 0x15,0x0f,0x0f,0x14,0x0e,0x0e,0x13,0x0d,0x0d,0x12,0x0d,0x0d,0x12,0x0c,0x0c,0x10, 0x0b,0x0b,0x0f,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09, 0x09,0x0c,0x09,0x08,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0a,0x07,0x07,0x0a,0x07,0x07, 0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08, 0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x05,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x05, 0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x04, 0x05,0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x04, 0x02,0x02,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x59,0x5f,0x71,0x62,0x6d, 0x93,0x52,0x52,0x7d,0x57,0x50,0x79,0x58,0x50,0x79,0x57,0x50,0x79,0x57,0x50,0x79, 0x56,0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x56, 0x50,0x79,0x55,0x50,0x79,0x59,0x54,0x80,0x4c,0x48,0x6d,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,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,0x02,0x02, 0x02,0x05,0x05,0x06,0x0d,0x0e,0x12,0x1a,0x1c,0x22,0x2a,0x2d,0x33,0x36,0x39,0x42, 0x3e,0x42,0x4d,0x47,0x4c,0x58,0x52,0x56,0x64,0x5f,0x64,0x74,0x6e,0x74,0x83,0x7d, 0x81,0x8d,0x72,0x78,0x86,0x71,0x76,0x86,0x81,0x86,0x92,0x7e,0x83,0x92,0x93,0x97, 0xa2,0x9e,0xa1,0xaa,0x98,0x9a,0xa5,0x89,0x8a,0x99,0x77,0x7a,0x8c,0x62,0x66,0x7d, 0x4e,0x52,0x6a,0x48,0x46,0x5c,0x43,0x40,0x52,0x46,0x42,0x54,0x4c,0x48,0x5b,0x4e, 0x4b,0x60,0x4c,0x47,0x5a,0x48,0x42,0x54,0x45,0x3c,0x4c,0x40,0x36,0x43,0x3e,0x34, 0x42,0x3e,0x34,0x41,0x3c,0x32,0x3e,0x36,0x2b,0x36,0x35,0x2a,0x35,0x38,0x2e,0x38, 0x3a,0x2e,0x3a,0x38,0x2d,0x39,0x37,0x2e,0x3a,0x38,0x30,0x3c,0x3a,0x32,0x3e,0x3c, 0x36,0x45,0x3e,0x39,0x49,0x3e,0x36,0x46,0x40,0x39,0x48,0x46,0x3d,0x4e,0x49,0x3f, 0x50,0x49,0x40,0x52,0x46,0x3e,0x4f,0x45,0x3d,0x4e,0x44,0x3e,0x4e,0x41,0x3b,0x4b, 0x40,0x3a,0x4a,0x42,0x3b,0x4b,0x45,0x3c,0x4b,0x4b,0x3f,0x50,0x4e,0x40,0x51,0x4a, 0x3c,0x4b,0x51,0x45,0x57,0x4f,0x47,0x5d,0x4b,0x46,0x5e,0x4a,0x49,0x62,0x49,0x47, 0x5e,0x42,0x3d,0x4d,0x39,0x32,0x3d,0x43,0x3d,0x4c,0x42,0x42,0x56,0x42,0x43,0x57, 0x42,0x45,0x5a,0x3e,0x42,0x56,0x39,0x3e,0x51,0x31,0x36,0x46,0x2e,0x33,0x42,0x31, 0x34,0x3f,0x29,0x2c,0x36,0x25,0x28,0x35,0x33,0x38,0x49,0x5b,0x61,0x71,0x6d,0x71, 0x7e,0x69,0x6e,0x7a,0x7a,0x83,0x9b,0x94,0x90,0x9c,0xa4,0x9d,0xa7,0xa2,0x9d,0xa9, 0x59,0x59,0x76,0x56,0x4d,0x6b,0x50,0x4c,0x6c,0x4e,0x4e,0x70,0x4c,0x4e,0x6d,0x47, 0x49,0x6a,0x4e,0x4e,0x6e,0x3d,0x43,0x5d,0x4d,0x54,0x73,0x52,0x5b,0x80,0x53,0x5d, 0x84,0x86,0x8e,0xab,0x66,0x5d,0x68,0x4f,0x3e,0x4d,0x50,0x3e,0x4d,0x4d,0x3d,0x4a, 0x2b,0x21,0x2b,0x23,0x1a,0x23,0x22,0x19,0x22,0x4f,0x47,0x68,0x52,0x4f,0x7a,0x62, 0x53,0x77,0x64,0x53,0x76,0x52,0x52,0x7d,0x52,0x55,0x80,0x52,0x57,0x82,0x52,0x5d, 0x88,0x53,0x5e,0x88,0x62,0x4a,0x66,0x89,0x93,0xb0,0xef,0xf0,0xf5,0x5d,0x56,0x5b, 0x35,0x27,0x2f,0x43,0x33,0x3e,0x41,0x32,0x3d,0x40,0x30,0x3b,0x55,0x43,0x53,0x26, 0x26,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x32,0x34,0x3c,0x8a,0x94,0xb1,0x57,0x63,0x8c,0x52,0x5c,0x86, 0x67,0x73,0x98,0x5a,0x65,0x8c,0x52,0x57,0x81,0x32,0x31,0x4e,0x52,0x55,0x80,0x54, 0x5f,0x88,0x57,0x63,0x8b,0x58,0x65,0x8c,0x5e,0x6a,0x90,0x5f,0x6c,0x92,0x53,0x5f, 0x89,0x51,0x5b,0x85,0x94,0x9e,0xb8,0x7d,0x7d,0x7d,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x02, 0x03,0x04,0x03,0x04,0x05,0x04,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x08,0x06,0x06, 0x08,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x08,0x0b,0x31,0x28,0x33,0x50,0x41,0x52, 0x56,0x4a,0x5e,0x5a,0x66,0x8b,0x7c,0x87,0xa3,0x99,0xa0,0xb5,0x97,0x9f,0xb4,0x42, 0x43,0x4e,0x0b,0x0d,0x10,0x0c,0x0e,0x11,0x0c,0x0e,0x11,0x0d,0x0e,0x12,0x0e,0x0e, 0x12,0x0d,0x0e,0x12,0x0b,0x0c,0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0c,0x0a,0x0b,0x0e, 0x0b,0x0c,0x0f,0x0c,0x0e,0x11,0x0d,0x0f,0x13,0x0e,0x0f,0x13,0x0f,0x11,0x14,0x10, 0x11,0x16,0x11,0x12,0x16,0x16,0x18,0x1e,0x22,0x26,0x2f,0x2e,0x32,0x3e,0x2b,0x2f, 0x3e,0x31,0x36,0x44,0x43,0x48,0x56,0x52,0x56,0x63,0x3c,0x41,0x4e,0x32,0x37,0x45, 0x3a,0x3e,0x4d,0x41,0x46,0x54,0x5a,0x5e,0x6a,0x76,0x7a,0x82,0x87,0x89,0x90,0x73, 0x76,0x7e,0x8b,0x8c,0x8e,0x7e,0x7d,0x83,0x5b,0x59,0x63,0x62,0x60,0x69,0x60,0x5d, 0x66,0x49,0x48,0x4f,0x85,0x85,0x8f,0x80,0x88,0x9c,0x65,0x6e,0x8a,0x64,0x6c,0x8a, 0x5b,0x66,0x88,0x59,0x64,0x88,0x5a,0x66,0x8a,0x58,0x65,0x8a,0x56,0x60,0x88,0x52, 0x5e,0x83,0x4a,0x50,0x75,0x41,0x3f,0x60,0x42,0x37,0x4d,0x3b,0x2c,0x3d,0x4c,0x3c, 0x52,0x3e,0x41,0x5d,0x0e,0x0f,0x14,0x0e,0x10,0x15,0x0e,0x0f,0x14,0x18,0x17,0x1d, 0x36,0x39,0x4e,0x30,0x2f,0x4a,0x4d,0x44,0x64,0x56,0x4d,0x70,0x5c,0x51,0x77,0x5c, 0x52,0x77,0x5e,0x52,0x75,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x53,0x77,0x5f,0x53, 0x77,0x5f,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5a,0x54,0x77,0x51,0x58,0x7f, 0x58,0x5a,0x6d,0x16,0x17,0x1d,0x16,0x18,0x1e,0x16,0x17,0x1d,0x16,0x18,0x1d,0x14, 0x16,0x1a,0x12,0x14,0x19,0x10,0x12,0x16,0x48,0x3d,0x4c,0x57,0x5b,0x80,0x4f,0x4b, 0x70,0x40,0x3c,0x58,0x50,0x4b,0x71,0x54,0x50,0x77,0x51,0x4e,0x78,0x50,0x4f,0x78, 0x51,0x4f,0x78,0x51,0x4e,0x79,0x51,0x51,0x7b,0x52,0x54,0x7c,0x52,0x58,0x81,0x52, 0x5d,0x84,0x54,0x5f,0x88,0x57,0x62,0x89,0x59,0x64,0x88,0x5b,0x65,0x89,0x5f,0x69, 0x8a,0x68,0x71,0x8f,0x76,0x7f,0x99,0x82,0x8a,0xa1,0x89,0x8f,0xa4,0x8b,0x93,0xa6, 0x91,0x99,0xaa,0x90,0x96,0xab,0x71,0x79,0x96,0x62,0x6b,0x8b,0x58,0x5d,0x7a,0x52, 0x55,0x73,0x52,0x55,0x72,0x63,0x65,0x7f,0x2f,0x32,0x3b,0x21,0x22,0x2d,0x23,0x24, 0x30,0x25,0x27,0x32,0x2a,0x2a,0x36,0x2e,0x2d,0x3a,0x31,0x2f,0x3d,0x30,0x2e,0x3c, 0x2c,0x2a,0x37,0x28,0x27,0x32,0x27,0x25,0x30,0x27,0x24,0x30,0x26,0x24,0x2f,0x26, 0x23,0x2e,0x26,0x23,0x2e,0x23,0x21,0x2c,0x20,0x1e,0x28,0x1a,0x1a,0x23,0x18,0x17, 0x20,0x17,0x18,0x20,0x16,0x16,0x1e,0x15,0x16,0x1d,0x15,0x16,0x1d,0x15,0x16,0x1d, 0x15,0x15,0x1d,0x14,0x15,0x1c,0x13,0x13,0x1a,0x12,0x12,0x1a,0x12,0x12,0x18,0x10, 0x10,0x16,0x0f,0x0f,0x15,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0d,0x0d, 0x11,0x0d,0x0d,0x12,0x10,0x0f,0x16,0x0c,0x0b,0x10,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e, 0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x09,0x08,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0a,0x08, 0x08,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x06,0x09,0x07,0x07,0x0a,0x06,0x06, 0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x05,0x07,0x05,0x05,0x06, 0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04, 0x04,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03, 0x05,0x03,0x03,0x05,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,0x20, 0x22,0x28,0x67,0x74,0x98,0x52,0x5b,0x84,0x54,0x50,0x79,0x5a,0x52,0x79,0x5a,0x52, 0x79,0x58,0x50,0x79,0x58,0x50,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x57,0x50,0x79, 0x57,0x50,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x58,0x51,0x7b,0x72,0x68,0x9e,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,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,0x02, 0x02,0x02,0x02,0x02,0x02,0x07,0x07,0x0a,0x18,0x19,0x1d,0x3a,0x3c,0x41,0x51,0x53, 0x58,0x4f,0x52,0x5a,0x4b,0x4e,0x5a,0x55,0x59,0x64,0x66,0x6a,0x76,0x6e,0x73,0x81, 0x72,0x77,0x85,0x67,0x6e,0x7e,0x6d,0x72,0x82,0x83,0x87,0x92,0x87,0x8c,0x97,0x8f, 0x93,0x9e,0x95,0x98,0xa2,0x92,0x93,0x9f,0x82,0x85,0x93,0x71,0x73,0x86,0x5e,0x61, 0x7a,0x4e,0x52,0x6c,0x45,0x42,0x58,0x43,0x41,0x53,0x47,0x43,0x57,0x4e,0x48,0x5c, 0x4a,0x45,0x5a,0x48,0x42,0x55,0x44,0x3e,0x4e,0x44,0x3b,0x4b,0x42,0x3a,0x49,0x3e, 0x33,0x40,0x39,0x2e,0x39,0x33,0x28,0x32,0x2b,0x22,0x2a,0x20,0x19,0x1e,0x29,0x1f, 0x27,0x32,0x28,0x32,0x39,0x2e,0x39,0x38,0x2d,0x38,0x3a,0x31,0x3d,0x3e,0x35,0x42, 0x3c,0x34,0x41,0x3d,0x34,0x42,0x3f,0x37,0x45,0x40,0x37,0x45,0x3e,0x33,0x41,0x41, 0x35,0x42,0x42,0x36,0x43,0x43,0x37,0x46,0x49,0x3c,0x4c,0x4e,0x42,0x53,0x4e,0x43, 0x54,0x44,0x3b,0x4a,0x3e,0x36,0x43,0x3a,0x32,0x40,0x3b,0x32,0x41,0x39,0x33,0x42, 0x42,0x3a,0x4a,0x42,0x39,0x47,0x45,0x3c,0x4c,0x46,0x3d,0x4e,0x48,0x3e,0x50,0x48, 0x3f,0x50,0x47,0x3e,0x4d,0x3e,0x34,0x41,0x32,0x2a,0x35,0x38,0x2f,0x3a,0x3b,0x34, 0x44,0x38,0x36,0x48,0x3a,0x38,0x4b,0x3a,0x36,0x48,0x32,0x2f,0x3e,0x2a,0x27,0x33, 0x22,0x22,0x2d,0x23,0x26,0x2e,0x22,0x25,0x2d,0x22,0x26,0x30,0x28,0x2c,0x38,0x52, 0x56,0x5f,0x6e,0x71,0x78,0x79,0x7b,0x84,0x7c,0x84,0x9a,0x7f,0x7c,0x8b,0xa6,0xa0, 0xab,0xa1,0x9b,0xa7,0x6c,0x69,0x80,0x57,0x4d,0x6b,0x50,0x4c,0x6b,0x59,0x5a,0x79, 0x60,0x61,0x7f,0x4d,0x50,0x6e,0x4d,0x4c,0x6a,0x4a,0x4d,0x6c,0x50,0x57,0x78,0x53, 0x5d,0x80,0x4e,0x58,0x80,0x70,0x7b,0x9c,0x8a,0x86,0x93,0x49,0x38,0x47,0x51,0x3f, 0x4e,0x4e,0x3d,0x4a,0x34,0x28,0x33,0x23,0x19,0x23,0x23,0x19,0x22,0x4e,0x45,0x63, 0x52,0x4f,0x7a,0x63,0x53,0x77,0x62,0x53,0x77,0x52,0x50,0x7c,0x52,0x54,0x7e,0x52, 0x55,0x81,0x52,0x5c,0x86,0x54,0x5f,0x89,0x62,0x4a,0x66,0x6e,0x7a,0x9d,0xcf,0xd2, 0xdf,0x7d,0x77,0x7c,0x31,0x24,0x2c,0x42,0x32,0x3e,0x43,0x33,0x3f,0x42,0x32,0x3d, 0x51,0x3f,0x4e,0x39,0x36,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x0e,0x92,0x9c,0xb6,0x6d,0x79, 0x9c,0x54,0x5f,0x89,0x5d,0x6a,0x91,0x60,0x6d,0x92,0x53,0x5e,0x87,0x52,0x57,0x81, 0x52,0x5c,0x85,0x55,0x62,0x89,0x57,0x63,0x8b,0x5c,0x69,0x8f,0x5e,0x6b,0x91,0x5f, 0x6c,0x92,0x5e,0x6b,0x91,0x51,0x51,0x7c,0x70,0x7b,0x9f,0xd4,0xd4,0xd5,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x06,0x04,0x05,0x06,0x05, 0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x0a,0x08,0x09, 0x0b,0x33,0x2a,0x36,0x54,0x44,0x54,0x57,0x4a,0x5f,0x5b,0x66,0x8b,0x96,0x9e,0xb4, 0x99,0xa0,0xb5,0x96,0x9d,0xb3,0x0e,0x0f,0x13,0x0b,0x0c,0x10,0x0a,0x0c,0x0f,0x0a, 0x0c,0x0f,0x0b,0x0d,0x10,0x0a,0x0c,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0c,0x0a,0x0a, 0x0d,0x0e,0x0e,0x12,0x12,0x11,0x16,0x13,0x12,0x17,0x12,0x12,0x17,0x13,0x13,0x18, 0x12,0x13,0x1a,0x0f,0x10,0x16,0x12,0x12,0x19,0x17,0x19,0x21,0x20,0x22,0x2d,0x26, 0x29,0x36,0x2a,0x2e,0x3d,0x2f,0x33,0x43,0x3c,0x42,0x52,0x56,0x5a,0x69,0x46,0x4a, 0x58,0x42,0x46,0x54,0x4a,0x4e,0x5a,0x4e,0x52,0x5f,0x5e,0x61,0x6c,0x79,0x7b,0x84, 0x7e,0x82,0x8a,0x8c,0x8e,0x94,0x77,0x79,0x7d,0x7d,0x7c,0x80,0x63,0x5f,0x67,0x5c, 0x59,0x60,0x63,0x60,0x67,0x4e,0x4c,0x53,0x8a,0x8c,0x95,0x89,0x90,0xa3,0x64,0x6d, 0x8a,0x5d,0x67,0x87,0x59,0x65,0x87,0x58,0x65,0x88,0x5b,0x67,0x8c,0x5a,0x66,0x8c, 0x59,0x64,0x8c,0x56,0x61,0x88,0x4e,0x56,0x7d,0x49,0x48,0x6d,0x45,0x3d,0x5b,0x41, 0x30,0x43,0x44,0x37,0x4c,0x3e,0x3c,0x56,0x0e,0x0f,0x14,0x0e,0x0f,0x14,0x0d,0x0e, 0x12,0x17,0x16,0x1b,0x38,0x3a,0x4f,0x35,0x32,0x4d,0x4d,0x44,0x64,0x55,0x4d,0x70, 0x5c,0x52,0x77,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f, 0x52,0x76,0x5f,0x53,0x77,0x5f,0x54,0x77,0x5f,0x54,0x77,0x5f,0x54,0x76,0x5c,0x53, 0x77,0x53,0x55,0x7b,0x59,0x5a,0x70,0x15,0x16,0x1c,0x16,0x18,0x1e,0x16,0x17,0x1d, 0x15,0x16,0x1b,0x14,0x15,0x1a,0x12,0x14,0x18,0x10,0x11,0x16,0x42,0x38,0x46,0x5a, 0x5f,0x84,0x50,0x4b,0x70,0x45,0x3f,0x5c,0x53,0x4d,0x70,0x54,0x50,0x77,0x52,0x4e, 0x78,0x51,0x4f,0x78,0x51,0x4e,0x78,0x51,0x4e,0x79,0x51,0x4f,0x7a,0x51,0x53,0x7c, 0x52,0x5a,0x82,0x52,0x5d,0x86,0x53,0x5e,0x88,0x54,0x61,0x87,0x57,0x62,0x88,0x5b, 0x66,0x8a,0x5f,0x69,0x8b,0x63,0x6e,0x8d,0x72,0x7a,0x97,0x80,0x88,0xa0,0x88,0x8f, 0xa5,0x8f,0x95,0xab,0x96,0x9c,0xb0,0x99,0x9f,0xb2,0x96,0x9d,0xb0,0x72,0x7b,0x97, 0x62,0x6a,0x87,0x56,0x57,0x75,0x51,0x53,0x72,0x56,0x59,0x77,0x67,0x6a,0x77,0x1b, 0x1d,0x26,0x21,0x23,0x2d,0x26,0x27,0x32,0x2b,0x2b,0x36,0x2e,0x2c,0x39,0x2d,0x2c, 0x38,0x2b,0x2a,0x35,0x28,0x25,0x32,0x27,0x24,0x30,0x26,0x23,0x2e,0x26,0x23,0x2e, 0x25,0x22,0x2d,0x24,0x22,0x2c,0x22,0x1f,0x2a,0x1c,0x1b,0x24,0x18,0x17,0x20,0x16, 0x16,0x1e,0x15,0x16,0x1d,0x16,0x16,0x1e,0x15,0x15,0x1d,0x14,0x15,0x1c,0x14,0x15, 0x1c,0x14,0x14,0x1b,0x13,0x14,0x1a,0x13,0x13,0x1a,0x12,0x12,0x1a,0x11,0x11,0x17, 0x10,0x11,0x16,0x10,0x10,0x16,0x0e,0x0e,0x14,0x0e,0x0e,0x13,0x0e,0x0e,0x12,0x0e, 0x0e,0x12,0x0d,0x0d,0x12,0x0c,0x0c,0x11,0x1f,0x1e,0x2d,0x2e,0x32,0x41,0x0c,0x0c, 0x10,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x08,0x08,0x0b,0x08,0x08,0x0a, 0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07, 0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06, 0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x05,0x07,0x06,0x05,0x07,0x05,0x05,0x06, 0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x04, 0x04,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02, 0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x06,0x07,0x09,0x71,0x7c,0x9f,0x54,0x60,0x89,0x52,0x4f,0x7a,0x5b, 0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x58,0x50,0x79,0x5a,0x52, 0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x58,0x50,0x79,0x58,0x50,0x79, 0x68,0x5f,0x8d,0x14,0x12,0x1b,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,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,0x03,0x03,0x03,0x0f,0x0e,0x10,0x24,0x24,0x27,0x3c,0x3d,0x40,0x58, 0x59,0x5e,0x6d,0x6e,0x72,0x66,0x68,0x6e,0x62,0x65,0x6c,0x62,0x66,0x6e,0x6f,0x73, 0x7d,0x74,0x79,0x85,0x67,0x6e,0x7d,0x76,0x7b,0x88,0x8b,0x8f,0x98,0x96,0x99,0xa0, 0x9a,0x9d,0xa5,0x9c,0x9f,0xa7,0x8b,0x8e,0x9b,0x77,0x7a,0x8a,0x65,0x68,0x7e,0x52, 0x56,0x6f,0x4e,0x4e,0x68,0x4a,0x46,0x5e,0x46,0x42,0x55,0x49,0x45,0x5a,0x4a,0x45, 0x58,0x46,0x3e,0x50,0x3e,0x36,0x44,0x3e,0x36,0x45,0x41,0x3a,0x4a,0x45,0x3d,0x4e, 0x45,0x3c,0x4c,0x3d,0x32,0x3f,0x30,0x26,0x2f,0x26,0x1d,0x24,0x22,0x1a,0x21,0x1d, 0x16,0x1a,0x1f,0x18,0x1d,0x26,0x1e,0x25,0x31,0x26,0x30,0x34,0x29,0x32,0x38,0x2e, 0x39,0x3a,0x31,0x3d,0x3a,0x32,0x3f,0x3a,0x32,0x3e,0x3a,0x32,0x3f,0x3c,0x32,0x3f, 0x3e,0x32,0x3e,0x3f,0x32,0x3f,0x3b,0x2f,0x3c,0x37,0x2d,0x37,0x36,0x2c,0x36,0x39, 0x31,0x3c,0x3e,0x35,0x43,0x43,0x39,0x46,0x46,0x3b,0x4a,0x47,0x3d,0x4c,0x41,0x36, 0x42,0x3d,0x33,0x40,0x40,0x38,0x47,0x3c,0x35,0x44,0x3b,0x35,0x44,0x40,0x3a,0x4a, 0x41,0x3a,0x4a,0x42,0x39,0x49,0x42,0x38,0x46,0x42,0x36,0x45,0x34,0x2c,0x37,0x32, 0x2a,0x35,0x36,0x2e,0x3a,0x38,0x31,0x3e,0x3a,0x32,0x3f,0x36,0x2e,0x3a,0x36,0x2d, 0x3a,0x31,0x2b,0x36,0x2a,0x27,0x33,0x26,0x24,0x2f,0x1f,0x21,0x2c,0x2f,0x32,0x3a, 0x43,0x46,0x4e,0x4e,0x51,0x57,0x53,0x56,0x5a,0x66,0x68,0x6e,0x7d,0x7f,0x93,0x83, 0x7e,0x8d,0x84,0x82,0x96,0x9e,0x99,0xa6,0x89,0x84,0x95,0x60,0x5e,0x79,0x53,0x50, 0x6f,0x5e,0x5e,0x7a,0x64,0x65,0x84,0x59,0x5a,0x79,0x46,0x49,0x6a,0x46,0x4d,0x6e, 0x4d,0x55,0x77,0x55,0x5f,0x83,0x4f,0x51,0x7a,0x60,0x6a,0x90,0x9b,0x9e,0xaf,0x41, 0x32,0x3c,0x51,0x3f,0x4f,0x4d,0x3d,0x4a,0x3d,0x2f,0x3b,0x23,0x19,0x23,0x22,0x19, 0x22,0x4d,0x43,0x5f,0x52,0x4f,0x7a,0x60,0x53,0x77,0x64,0x53,0x76,0x52,0x50,0x7b, 0x52,0x54,0x7e,0x52,0x55,0x80,0x52,0x5b,0x85,0x55,0x60,0x8a,0x64,0x4d,0x6b,0x5c, 0x69,0x90,0xcf,0xd2,0xdf,0x9a,0x97,0x9c,0x2f,0x22,0x29,0x41,0x32,0x3d,0x45,0x35, 0x41,0x42,0x32,0x3e,0x4b,0x3a,0x48,0x50,0x46,0x59,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e, 0x63,0x72,0x7b,0x85,0xa7,0x58,0x65,0x8d,0x54,0x5f,0x89,0x65,0x71,0x95,0x56,0x63, 0x8a,0x52,0x5c,0x85,0x53,0x5e,0x87,0x55,0x60,0x89,0x58,0x65,0x8c,0x5d,0x6a,0x90, 0x5e,0x6a,0x91,0x5e,0x6b,0x91,0x60,0x6d,0x93,0x52,0x57,0x81,0x5b,0x66,0x8f,0xc5, 0xca,0xd8,0x39,0x39,0x39,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04, 0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x08,0x06, 0x06,0x09,0x07,0x08,0x0a,0x0a,0x0a,0x0e,0x51,0x42,0x52,0x54,0x44,0x54,0x58,0x4b, 0x61,0x74,0x7f,0x9f,0x99,0xa1,0xb6,0x98,0x9f,0xb5,0x50,0x54,0x62,0x0a,0x0a,0x0e, 0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x0a,0x0c,0x09, 0x0a,0x0c,0x0c,0x0c,0x10,0x12,0x11,0x16,0x13,0x12,0x17,0x14,0x13,0x18,0x16,0x15, 0x1a,0x18,0x18,0x20,0x1d,0x1e,0x28,0x16,0x17,0x1f,0x1a,0x19,0x22,0x21,0x20,0x2c, 0x21,0x21,0x2c,0x1f,0x20,0x2b,0x24,0x25,0x32,0x2c,0x2e,0x3e,0x3a,0x3e,0x4f,0x69, 0x6d,0x77,0x68,0x6d,0x79,0x5f,0x64,0x71,0x65,0x69,0x72,0x67,0x6a,0x75,0x6e,0x72, 0x7b,0x7e,0x81,0x8a,0x8a,0x8c,0x93,0x8b,0x8e,0x93,0x82,0x83,0x87,0x7f,0x7d,0x81, 0x88,0x84,0x88,0x84,0x81,0x85,0x85,0x82,0x85,0x71,0x6d,0x71,0xa3,0xa3,0xa9,0xa2, 0xa7,0xb7,0x73,0x7c,0x94,0x5f,0x69,0x88,0x59,0x64,0x86,0x59,0x65,0x88,0x5b,0x66, 0x8b,0x5b,0x68,0x8e,0x59,0x65,0x8e,0x56,0x62,0x8a,0x4f,0x59,0x82,0x4c,0x4f,0x77, 0x4c,0x47,0x6b,0x51,0x3f,0x56,0x4e,0x3f,0x57,0x3c,0x38,0x54,0x0d,0x0e,0x12,0x0e, 0x0f,0x13,0x0e,0x0e,0x13,0x13,0x12,0x17,0x39,0x3b,0x4f,0x3b,0x39,0x56,0x4b,0x44, 0x62,0x56,0x4c,0x6f,0x5c,0x51,0x77,0x5d,0x52,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76, 0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x53,0x77,0x5f,0x53,0x76,0x5f,0x54,0x77,0x5e, 0x54,0x76,0x5c,0x54,0x77,0x53,0x52,0x79,0x58,0x5a,0x70,0x16,0x17,0x1d,0x16,0x18, 0x1e,0x15,0x17,0x1c,0x15,0x16,0x1b,0x14,0x16,0x1b,0x13,0x15,0x1a,0x10,0x12,0x16, 0x3b,0x33,0x3f,0x5c,0x61,0x87,0x4f,0x4b,0x70,0x45,0x40,0x5d,0x53,0x4c,0x70,0x56, 0x50,0x77,0x51,0x4f,0x77,0x52,0x50,0x78,0x51,0x4e,0x78,0x51,0x4e,0x78,0x51,0x4f, 0x79,0x51,0x53,0x7b,0x52,0x55,0x7f,0x52,0x5c,0x86,0x52,0x5e,0x86,0x54,0x60,0x86, 0x59,0x63,0x88,0x5b,0x66,0x8a,0x5e,0x69,0x8b,0x65,0x6f,0x90,0x6d,0x77,0x94,0x79, 0x83,0x9d,0x86,0x8e,0xa5,0x91,0x97,0xad,0x99,0xa0,0xb3,0x9f,0xa5,0xb6,0xa4,0xa9, 0xb9,0x95,0x9c,0xb1,0x6f,0x77,0x94,0x5c,0x60,0x7d,0x54,0x57,0x73,0x53,0x55,0x73, 0x6b,0x6e,0x85,0x1f,0x21,0x2a,0x21,0x23,0x2e,0x27,0x28,0x32,0x2c,0x2b,0x37,0x2b, 0x2a,0x36,0x2a,0x28,0x34,0x43,0x44,0x5b,0x2f,0x2e,0x3d,0x26,0x24,0x2f,0x25,0x23, 0x2e,0x26,0x23,0x2e,0x24,0x21,0x2c,0x1f,0x1d,0x26,0x1a,0x19,0x21,0x16,0x17,0x1e, 0x15,0x15,0x1d,0x15,0x15,0x1d,0x14,0x14,0x1b,0x13,0x14,0x1b,0x13,0x14,0x1b,0x14, 0x15,0x1b,0x13,0x14,0x1a,0x13,0x13,0x1a,0x12,0x13,0x1a,0x12,0x12,0x18,0x11,0x12, 0x17,0x10,0x11,0x16,0x10,0x10,0x16,0x0e,0x0e,0x14,0x0e,0x0e,0x13,0x0e,0x0e,0x12, 0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0b,0x0b,0x0f,0x24,0x21,0x30,0x66, 0x70,0x91,0x3c,0x43,0x5c,0x11,0x12,0x19,0x0b,0x0b,0x0e,0x0a,0x0a,0x0d,0x09,0x08, 0x0b,0x08,0x08,0x0a,0x09,0x09,0x0b,0x09,0x09,0x0b,0x07,0x07,0x0a,0x07,0x07,0x0a, 0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x06,0x0a,0x06,0x06,0x09,0x06, 0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06, 0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07, 0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x04,0x04,0x06,0x03,0x04,0x05,0x03, 0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02, 0x04,0x02,0x02,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,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,0x74,0x7e,0x9c,0x5c,0x69,0x8f, 0x52,0x4f,0x7b,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5b,0x52,0x79,0x5b,0x52,0x79,0x5a, 0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52, 0x79,0x5a,0x52,0x79,0x60,0x58,0x82,0x4f,0x47,0x6a,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,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,0x0b,0x0b,0x0b,0x26,0x26,0x26,0x29,0x2a,0x2c, 0x2f,0x31,0x37,0x53,0x55,0x5a,0x70,0x72,0x76,0x7a,0x7b,0x7f,0x7a,0x7c,0x80,0x73, 0x76,0x7c,0x6e,0x72,0x7b,0x6e,0x73,0x82,0x7b,0x80,0x8c,0x97,0x9a,0xa2,0xa2,0xa5, 0xab,0xa6,0xa8,0xae,0x9c,0x9e,0xa6,0x93,0x96,0xa1,0x7a,0x7e,0x8e,0x5d,0x62,0x7a, 0x52,0x50,0x6a,0x56,0x4e,0x66,0x52,0x4c,0x62,0x4d,0x47,0x5b,0x46,0x42,0x56,0x41, 0x3c,0x4c,0x39,0x32,0x3f,0x31,0x29,0x34,0x2e,0x26,0x2f,0x34,0x2e,0x39,0x3c,0x35, 0x42,0x3f,0x37,0x46,0x3d,0x35,0x42,0x35,0x2c,0x37,0x2a,0x21,0x28,0x22,0x1a,0x20, 0x1e,0x16,0x1b,0x1a,0x13,0x17,0x18,0x12,0x16,0x1a,0x14,0x19,0x22,0x1a,0x20,0x27, 0x1e,0x25,0x2d,0x23,0x2c,0x31,0x28,0x32,0x30,0x28,0x32,0x30,0x28,0x32,0x2c,0x25, 0x2e,0x2f,0x26,0x2f,0x32,0x28,0x33,0x34,0x2a,0x34,0x35,0x2a,0x34,0x33,0x29,0x33, 0x35,0x2b,0x35,0x3a,0x2e,0x3a,0x3f,0x34,0x41,0x44,0x39,0x46,0x43,0x37,0x46,0x46, 0x3a,0x47,0x42,0x35,0x42,0x42,0x35,0x42,0x45,0x37,0x44,0x3d,0x30,0x3d,0x3f,0x33, 0x40,0x46,0x3c,0x4c,0x46,0x3e,0x50,0x46,0x3e,0x51,0x46,0x3e,0x4f,0x48,0x3d,0x4c, 0x3a,0x2e,0x3a,0x36,0x2d,0x37,0x39,0x2f,0x3c,0x3a,0x32,0x3f,0x39,0x30,0x3c,0x37, 0x2e,0x3a,0x3e,0x33,0x41,0x3c,0x32,0x40,0x38,0x2e,0x3a,0x34,0x2a,0x34,0x2e,0x29, 0x36,0x40,0x43,0x4e,0x68,0x6a,0x6e,0x65,0x66,0x6a,0x4f,0x50,0x54,0x6d,0x70,0x76, 0x90,0x8d,0x9d,0x9c,0x95,0x9f,0x87,0x83,0x95,0x6c,0x69,0x80,0x84,0x81,0x95,0x6b, 0x69,0x82,0x51,0x4c,0x69,0x54,0x54,0x71,0x56,0x59,0x79,0x4e,0x50,0x72,0x50,0x54, 0x74,0x48,0x51,0x71,0x49,0x50,0x72,0x54,0x5e,0x81,0x4f,0x58,0x7f,0x59,0x62,0x88, 0x95,0x9e,0xb6,0x4c,0x41,0x4c,0x4f,0x3d,0x4d,0x4e,0x3d,0x4a,0x40,0x32,0x3e,0x23, 0x1a,0x23,0x22,0x19,0x22,0x4c,0x41,0x5b,0x52,0x4f,0x7a,0x60,0x53,0x77,0x63,0x53, 0x77,0x52,0x50,0x7b,0x52,0x52,0x7d,0x52,0x57,0x82,0x52,0x5a,0x84,0x54,0x5f,0x89, 0x60,0x53,0x77,0x56,0x62,0x8b,0xc8,0xcc,0xda,0xb7,0xb7,0xbd,0x2b,0x1f,0x25,0x40, 0x31,0x3c,0x45,0x35,0x41,0x45,0x35,0x41,0x4a,0x39,0x46,0x62,0x50,0x64,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x34,0x36,0x3e,0x89,0x93,0xb0,0x5f,0x6b,0x92,0x52,0x5d,0x88,0x63, 0x6f,0x95,0x5a,0x66,0x8d,0x54,0x60,0x89,0x54,0x60,0x89,0x56,0x62,0x8a,0x5a,0x65, 0x8c,0x5c,0x67,0x8f,0x5c,0x69,0x8f,0x5e,0x6a,0x90,0x5e,0x6b,0x91,0x57,0x64,0x8b, 0x52,0x53,0x7e,0x9d,0xa5,0xbe,0x99,0x9a,0x9a,0x00,0x00,0x00,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06, 0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x09,0x07,0x07,0x0a,0x13,0x12,0x16,0x51, 0x42,0x52,0x56,0x46,0x58,0x56,0x4b,0x61,0x92,0x9a,0xb3,0x98,0xa0,0xb6,0x79,0x80, 0x92,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x09,0x0a,0x0d,0x09,0x0a,0x0c, 0x09,0x09,0x0c,0x09,0x0a,0x0c,0x0f,0x0f,0x12,0x12,0x11,0x16,0x13,0x12,0x17,0x14, 0x13,0x18,0x15,0x14,0x1a,0x18,0x16,0x1d,0x1e,0x1e,0x28,0x1f,0x20,0x29,0x1e,0x1f, 0x29,0x1d,0x1e,0x28,0x18,0x18,0x20,0x16,0x16,0x1e,0x20,0x1d,0x26,0x28,0x25,0x32, 0x2a,0x2b,0x3a,0x4e,0x53,0x5f,0x6d,0x72,0x7b,0x72,0x76,0x80,0x6d,0x70,0x7a,0x6f, 0x73,0x7c,0x79,0x7c,0x86,0x83,0x86,0x8e,0x96,0x99,0x9e,0xa0,0xa2,0xa5,0xa3,0xa4, 0xa6,0xa3,0xa2,0xa5,0xa6,0xa3,0xa7,0xb2,0xaf,0xb1,0xaf,0xae,0xb0,0x94,0x91,0x93, 0xb1,0xb2,0xb6,0xa8,0xae,0xbb,0x81,0x89,0xa0,0x67,0x70,0x8d,0x59,0x65,0x87,0x58, 0x65,0x88,0x5b,0x66,0x8c,0x5b,0x68,0x8e,0x5b,0x65,0x8e,0x56,0x63,0x8b,0x50,0x5b, 0x84,0x4f,0x52,0x7a,0x4e,0x4a,0x70,0x5a,0x45,0x5f,0x5a,0x4b,0x68,0x38,0x36,0x52, 0x0c,0x0d,0x11,0x0d,0x0e,0x12,0x0b,0x0c,0x10,0x12,0x12,0x16,0x3c,0x3e,0x4f,0x3d, 0x3b,0x5b,0x4d,0x44,0x64,0x54,0x49,0x6d,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5f,0x52, 0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x76, 0x5f,0x54,0x77,0x5e,0x54,0x76,0x5e,0x54,0x76,0x53,0x52,0x78,0x56,0x59,0x70,0x16, 0x18,0x1e,0x16,0x18,0x1e,0x16,0x17,0x1d,0x16,0x17,0x1d,0x16,0x17,0x1d,0x13,0x15, 0x1a,0x10,0x12,0x16,0x36,0x2e,0x3a,0x5e,0x62,0x87,0x50,0x4d,0x70,0x45,0x3f,0x5a, 0x51,0x4a,0x6d,0x56,0x50,0x77,0x54,0x4f,0x77,0x51,0x4f,0x79,0x51,0x4f,0x78,0x51, 0x4f,0x78,0x51,0x50,0x7a,0x52,0x52,0x7b,0x52,0x55,0x7f,0x51,0x5b,0x83,0x51,0x5d, 0x86,0x55,0x60,0x87,0x58,0x63,0x88,0x5a,0x65,0x8b,0x5f,0x6b,0x8d,0x62,0x6c,0x8f, 0x6a,0x75,0x94,0x75,0x7e,0x99,0x82,0x8b,0xa4,0x90,0x97,0xad,0x99,0xa0,0xb2,0xa0, 0xa6,0xb7,0xa7,0xad,0xbc,0xa8,0xaf,0xbe,0x8e,0x96,0xac,0x6a,0x70,0x8c,0x5a,0x5d, 0x79,0x55,0x56,0x74,0x5c,0x60,0x7b,0x43,0x46,0x50,0x26,0x29,0x33,0x2a,0x2a,0x36, 0x2c,0x2b,0x37,0x2a,0x28,0x34,0x43,0x3c,0x4d,0x4c,0x4e,0x68,0x47,0x49,0x65,0x46, 0x49,0x63,0x47,0x48,0x65,0x3f,0x3e,0x55,0x2c,0x29,0x38,0x17,0x17,0x1f,0x13,0x14, 0x1b,0x14,0x15,0x1c,0x14,0x14,0x1b,0x12,0x13,0x1a,0x13,0x14,0x1a,0x12,0x13,0x1a, 0x12,0x13,0x1a,0x12,0x12,0x19,0x12,0x12,0x19,0x12,0x12,0x18,0x12,0x12,0x18,0x11, 0x11,0x17,0x10,0x10,0x16,0x10,0x10,0x16,0x0f,0x0f,0x15,0x0e,0x0e,0x13,0x0e,0x0e, 0x13,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0d,0x0d,0x11,0x0c,0x0b,0x10,0x14,0x12,0x17, 0x4a,0x3e,0x54,0x6b,0x75,0x94,0x5a,0x64,0x89,0x5a,0x64,0x87,0x23,0x24,0x2d,0x0a, 0x0a,0x0e,0x08,0x08,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0b,0x09,0x09, 0x0b,0x08,0x08,0x0a,0x08,0x08,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x06,0x0a, 0x06,0x06,0x09,0x07,0x06,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06, 0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06, 0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06, 0x04,0x05,0x06,0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x02, 0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x49,0x4f, 0x60,0x5f,0x6c,0x92,0x52,0x55,0x7f,0x5a,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79, 0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5b, 0x52,0x79,0x5c,0x52,0x79,0x5a,0x52,0x79,0x5f,0x55,0x7d,0x7b,0x6e,0xa2,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,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,0x03,0x02,0x03,0x18,0x17, 0x18,0x74,0x75,0x77,0x4c,0x4f,0x53,0x5c,0x5e,0x63,0x7a,0x7a,0x7e,0x88,0x8a,0x8d, 0x8a,0x8c,0x8f,0x7f,0x81,0x87,0x71,0x76,0x81,0x86,0x8a,0x93,0x97,0x9a,0xa1,0x9f, 0xa2,0xa9,0xa3,0xa6,0xad,0xa0,0xa3,0xaa,0x8f,0x91,0x9d,0x79,0x7c,0x8e,0x5b,0x61, 0x7a,0x58,0x51,0x6a,0x57,0x4e,0x64,0x52,0x4a,0x5f,0x4c,0x43,0x56,0x46,0x41,0x52, 0x3b,0x36,0x44,0x2c,0x26,0x2f,0x22,0x1b,0x22,0x20,0x19,0x1f,0x20,0x1a,0x20,0x27, 0x21,0x29,0x2f,0x29,0x33,0x32,0x2a,0x35,0x30,0x29,0x33,0x29,0x21,0x29,0x22,0x1a, 0x20,0x1e,0x16,0x1b,0x1a,0x12,0x17,0x19,0x12,0x16,0x16,0x10,0x14,0x14,0x0e,0x12, 0x16,0x11,0x14,0x1a,0x14,0x18,0x1e,0x16,0x1b,0x1f,0x18,0x1e,0x1e,0x16,0x1c,0x1f, 0x18,0x1e,0x1d,0x16,0x1c,0x25,0x1d,0x24,0x2c,0x24,0x2b,0x36,0x2a,0x34,0x36,0x2a, 0x35,0x30,0x25,0x2e,0x2e,0x24,0x2c,0x2e,0x24,0x2d,0x32,0x26,0x30,0x3a,0x2d,0x38, 0x3e,0x30,0x3c,0x42,0x35,0x42,0x3f,0x32,0x3e,0x41,0x34,0x40,0x43,0x35,0x42,0x3d, 0x2f,0x3b,0x36,0x2a,0x35,0x32,0x26,0x2f,0x36,0x2a,0x33,0x3e,0x31,0x3d,0x3f,0x32, 0x3e,0x47,0x39,0x46,0x44,0x36,0x44,0x43,0x36,0x43,0x4a,0x3d,0x4d,0x49,0x42,0x56, 0x4a,0x3d,0x4d,0x46,0x39,0x47,0x4a,0x3d,0x4d,0x48,0x3b,0x4a,0x46,0x3a,0x4a,0x3a, 0x2e,0x3a,0x35,0x2b,0x36,0x2e,0x32,0x42,0x62,0x64,0x6a,0x5e,0x5e,0x62,0x5a,0x5c, 0x5e,0x84,0x87,0x8f,0x8f,0x88,0x97,0x9c,0x94,0x9f,0x86,0x81,0x93,0x69,0x66,0x7e, 0x5b,0x5a,0x7a,0x5b,0x5b,0x79,0x54,0x4d,0x6d,0x50,0x4c,0x6c,0x51,0x4e,0x70,0x4e, 0x4d,0x70,0x4b,0x4b,0x6e,0x48,0x4b,0x6f,0x49,0x51,0x73,0x4e,0x56,0x77,0x51,0x5a, 0x81,0x50,0x5a,0x82,0x7f,0x89,0xa7,0x6c,0x65,0x70,0x4c,0x3b,0x4a,0x4e,0x3c,0x4a, 0x45,0x36,0x43,0x23,0x1a,0x23,0x22,0x19,0x22,0x4b,0x3f,0x55,0x52,0x4f,0x7a,0x5e, 0x53,0x79,0x64,0x53,0x75,0x52,0x4f,0x7b,0x52,0x53,0x7e,0x52,0x55,0x81,0x52,0x5a, 0x84,0x54,0x60,0x8a,0x52,0x4f,0x7a,0x52,0x5a,0x84,0xc0,0xc6,0xd6,0xd5,0xd7,0xde, 0x29,0x1e,0x23,0x40,0x31,0x3c,0x46,0x36,0x42,0x45,0x35,0x41,0x46,0x35,0x42,0x69, 0x56,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x0e,0x7e,0x85,0x9f,0x6c,0x79,0x9c, 0x52,0x5a,0x84,0x5d,0x6a,0x91,0x60,0x6d,0x93,0x56,0x63,0x8a,0x56,0x62,0x8a,0x57, 0x63,0x8b,0x5a,0x65,0x8c,0x5b,0x66,0x8d,0x5c,0x69,0x8f,0x5e,0x6a,0x90,0x5e,0x6b, 0x91,0x5c,0x67,0x8f,0x52,0x4f,0x7a,0x71,0x7d,0x9f,0xe6,0xe6,0xe7,0x0a,0x0a,0x0b, 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x05,0x05, 0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x07,0x09, 0x07,0x08,0x0a,0x0e,0x0d,0x10,0x4f,0x41,0x51,0x62,0x52,0x65,0x62,0x6d,0x8e,0x72, 0x77,0x84,0x14,0x15,0x1a,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x08,0x09, 0x0c,0x08,0x09,0x0c,0x08,0x09,0x0b,0x09,0x0a,0x0c,0x0d,0x0e,0x11,0x13,0x12,0x16, 0x13,0x12,0x17,0x13,0x12,0x17,0x15,0x13,0x19,0x16,0x16,0x1a,0x1a,0x19,0x20,0x1d, 0x1d,0x25,0x1f,0x1f,0x28,0x1b,0x1b,0x23,0x16,0x18,0x1e,0x11,0x12,0x18,0x20,0x1c, 0x25,0x2b,0x26,0x2f,0x2a,0x26,0x32,0x26,0x2a,0x37,0x3e,0x42,0x4e,0x52,0x56,0x62, 0x64,0x68,0x72,0x6a,0x6e,0x78,0x71,0x74,0x7e,0x79,0x7c,0x85,0x83,0x86,0x8e,0xa4, 0xa5,0xaa,0xab,0xac,0xae,0xac,0xac,0xaf,0xb0,0xad,0xb3,0xb8,0xb6,0xb9,0xb7,0xb6, 0xb7,0xa4,0xa2,0xa3,0xb4,0xb3,0xb6,0xa9,0xaf,0xbb,0x89,0x90,0xa4,0x74,0x7c,0x96, 0x62,0x6d,0x8c,0x5d,0x69,0x8c,0x5d,0x6a,0x8f,0x5b,0x68,0x8f,0x5b,0x65,0x8e,0x59, 0x64,0x8c,0x52,0x5c,0x85,0x50,0x54,0x7e,0x4f,0x4c,0x74,0x5c,0x46,0x63,0x5b,0x4d, 0x6c,0x39,0x38,0x55,0x0c,0x0d,0x11,0x0c,0x0e,0x12,0x0c,0x0d,0x11,0x0e,0x0e,0x12, 0x3f,0x40,0x51,0x3e,0x3d,0x5e,0x49,0x42,0x62,0x54,0x4b,0x6d,0x5c,0x51,0x77,0x5e, 0x52,0x75,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x53, 0x77,0x5f,0x53,0x76,0x5f,0x54,0x77,0x5e,0x54,0x76,0x5f,0x55,0x77,0x54,0x52,0x78, 0x56,0x5a,0x72,0x16,0x18,0x1e,0x16,0x18,0x1e,0x16,0x19,0x1e,0x16,0x19,0x1e,0x16, 0x18,0x1e,0x14,0x16,0x1a,0x12,0x13,0x17,0x31,0x2b,0x35,0x63,0x66,0x8d,0x51,0x4c, 0x73,0x44,0x3d,0x59,0x52,0x4b,0x6e,0x56,0x50,0x77,0x54,0x50,0x77,0x53,0x4f,0x79, 0x51,0x4f,0x79,0x52,0x4f,0x79,0x52,0x50,0x7a,0x52,0x52,0x7c,0x52,0x57,0x80,0x51, 0x5b,0x83,0x53,0x5d,0x87,0x54,0x60,0x87,0x58,0x62,0x88,0x5b,0x66,0x8b,0x5e,0x69, 0x8d,0x65,0x6f,0x91,0x69,0x74,0x94,0x74,0x7e,0x9b,0x7d,0x85,0xa1,0x8c,0x93,0xab, 0x98,0x9e,0xb2,0xa0,0xa6,0xb8,0xa7,0xad,0xbd,0xac,0xb0,0xbf,0xab,0xaf,0xbf,0x82, 0x89,0xa1,0x64,0x66,0x81,0x5c,0x5e,0x7b,0x5a,0x5e,0x7a,0x6b,0x6e,0x80,0x2a,0x2c, 0x38,0x2a,0x2b,0x36,0x2a,0x29,0x35,0x28,0x26,0x32,0x4c,0x42,0x54,0x4c,0x49,0x61, 0x46,0x47,0x63,0x46,0x42,0x5e,0x47,0x40,0x5c,0x47,0x3f,0x5d,0x47,0x44,0x61,0x49, 0x48,0x69,0x40,0x41,0x5d,0x25,0x25,0x33,0x13,0x13,0x1b,0x11,0x12,0x17,0x12,0x12, 0x18,0x11,0x11,0x17,0x12,0x12,0x18,0x12,0x12,0x18,0x11,0x11,0x17,0x11,0x11,0x17, 0x11,0x11,0x16,0x10,0x10,0x16,0x10,0x10,0x16,0x0e,0x0e,0x14,0x0e,0x0e,0x14,0x0e, 0x0e,0x12,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0c,0x0c,0x10,0x0b,0x0b, 0x0f,0x44,0x37,0x46,0x4b,0x41,0x56,0x78,0x80,0x9e,0x58,0x64,0x88,0x4f,0x4d,0x76, 0x53,0x5c,0x82,0x42,0x46,0x52,0x0d,0x0e,0x11,0x09,0x08,0x0b,0x08,0x08,0x0a,0x08, 0x08,0x0b,0x08,0x08,0x0b,0x09,0x09,0x0c,0x08,0x08,0x0b,0x08,0x08,0x0a,0x07,0x07, 0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a, 0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x06, 0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06, 0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x03,0x04,0x05, 0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02, 0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x22,0x24,0x29,0x64,0x71,0x95,0x52,0x5c,0x84,0x55,0x50,0x79,0x5d,0x52, 0x79,0x5c,0x52,0x79,0x5d,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79, 0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5e,0x52,0x7a,0x70, 0x62,0x91,0x10,0x0e,0x15,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,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,0x02,0x02,0x02,0x0f, 0x0e,0x0f,0x51,0x51,0x53,0x4d,0x4f,0x52,0x48,0x4a,0x50,0x68,0x69,0x6e,0x7c,0x7e, 0x81,0x8a,0x8b,0x90,0x80,0x82,0x8a,0x7e,0x82,0x8a,0x7e,0x82,0x8d,0x9b,0x9d,0xa2, 0x96,0x99,0xa0,0x8e,0x92,0x9b,0x86,0x8a,0x96,0x7f,0x84,0x93,0x74,0x78,0x8a,0x62, 0x67,0x7e,0x50,0x50,0x6b,0x59,0x4f,0x65,0x51,0x47,0x5a,0x46,0x3d,0x4e,0x3c,0x34, 0x42,0x32,0x2b,0x36,0x26,0x1f,0x28,0x1d,0x17,0x1d,0x18,0x13,0x18,0x17,0x13,0x17, 0x16,0x12,0x16,0x1a,0x14,0x19,0x1a,0x15,0x1a,0x1c,0x16,0x1b,0x1d,0x16,0x1c,0x1b, 0x15,0x1a,0x1a,0x14,0x18,0x18,0x12,0x16,0x16,0x11,0x14,0x15,0x0f,0x12,0x12,0x0e, 0x11,0x12,0x0d,0x10,0x12,0x0d,0x10,0x12,0x0e,0x10,0x12,0x0e,0x10,0x14,0x0e,0x12, 0x16,0x12,0x15,0x19,0x12,0x16,0x1b,0x15,0x1a,0x23,0x1b,0x21,0x29,0x1f,0x26,0x2b, 0x22,0x2a,0x2c,0x22,0x2a,0x2a,0x20,0x28,0x27,0x1e,0x25,0x27,0x1e,0x25,0x28,0x1e, 0x26,0x2e,0x24,0x2c,0x33,0x28,0x32,0x38,0x2c,0x36,0x38,0x2c,0x36,0x39,0x2e,0x38, 0x35,0x2a,0x34,0x38,0x2b,0x35,0x2f,0x24,0x2d,0x2c,0x22,0x29,0x27,0x1e,0x23,0x2b, 0x21,0x28,0x2f,0x24,0x2d,0x37,0x2b,0x35,0x3f,0x32,0x3e,0x46,0x39,0x46,0x42,0x36, 0x42,0x43,0x36,0x43,0x48,0x3a,0x4a,0x4c,0x3e,0x4e,0x4e,0x3f,0x4f,0x4e,0x44,0x56, 0x4c,0x44,0x59,0x47,0x3e,0x4e,0x38,0x2d,0x38,0x35,0x2e,0x3b,0x36,0x3a,0x45,0x3e, 0x40,0x45,0x58,0x59,0x5a,0x8e,0x92,0xa0,0x74,0x6c,0x7e,0x74,0x6e,0x80,0x73,0x70, 0x83,0x74,0x6f,0x84,0x59,0x52,0x73,0x5b,0x54,0x75,0x59,0x59,0x77,0x63,0x63,0x7f, 0x59,0x59,0x7a,0x4f,0x4e,0x70,0x57,0x58,0x79,0x54,0x56,0x77,0x49,0x51,0x76,0x51, 0x59,0x7e,0x55,0x60,0x84,0x50,0x55,0x7e,0x6d,0x79,0x9b,0x7b,0x7a,0x8d,0x44,0x34, 0x41,0x4e,0x3c,0x4a,0x49,0x3a,0x45,0x23,0x19,0x23,0x22,0x19,0x22,0x43,0x37,0x4c, 0x52,0x4f,0x7a,0x62,0x53,0x77,0x64,0x52,0x72,0x52,0x4f,0x7a,0x52,0x52,0x7d,0x52, 0x54,0x80,0x52,0x5a,0x84,0x54,0x5f,0x89,0x52,0x57,0x82,0x52,0x4f,0x7a,0xb5,0xbc, 0xce,0xde,0xe1,0xe9,0x3a,0x31,0x37,0x3c,0x2d,0x37,0x48,0x38,0x45,0x45,0x35,0x41, 0x44,0x34,0x40,0x64,0x50,0x64,0x0e,0x0f,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x55, 0x65,0x7b,0x85,0xa7,0x53,0x5e,0x88,0x5c,0x69,0x90,0x67,0x73,0x98,0x58,0x65,0x8c, 0x56,0x63,0x8a,0x55,0x60,0x89,0x58,0x64,0x8c,0x58,0x65,0x8c,0x5c,0x67,0x8f,0x5c, 0x69,0x8f,0x5d,0x69,0x90,0x5d,0x6a,0x90,0x52,0x53,0x7e,0x56,0x62,0x8a,0xd0,0xd4, 0xdf,0x5c,0x5c,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x04,0x03, 0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06, 0x09,0x06,0x06,0x09,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0c,0x33,0x32,0x44, 0x75,0x79,0x83,0x0a,0x0a,0x0d,0x08,0x09,0x0b,0x09,0x0a,0x0d,0x09,0x0a,0x0c,0x09, 0x0a,0x0d,0x08,0x09,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x07,0x08,0x0a,0x0a,0x0b, 0x0d,0x0f,0x0f,0x13,0x13,0x12,0x17,0x14,0x13,0x18,0x15,0x13,0x19,0x15,0x14,0x1a, 0x16,0x16,0x1b,0x18,0x16,0x1d,0x19,0x19,0x1e,0x1a,0x1a,0x20,0x1a,0x1a,0x21,0x16, 0x16,0x1c,0x13,0x13,0x1a,0x25,0x20,0x2a,0x2f,0x29,0x34,0x2e,0x28,0x35,0x23,0x25, 0x32,0x35,0x38,0x42,0x45,0x49,0x56,0x52,0x57,0x64,0x58,0x5c,0x69,0x61,0x65,0x70, 0x6a,0x6e,0x77,0x84,0x87,0x8e,0x9b,0x9c,0x9f,0x94,0x94,0x98,0xa8,0xa6,0xab,0xae, 0xac,0xb0,0xac,0xab,0xaf,0xa1,0x9f,0xa3,0xb1,0xb1,0xb5,0x99,0x9d,0xab,0x83,0x8b, 0x9e,0x6d,0x76,0x8f,0x65,0x6f,0x8d,0x69,0x73,0x93,0x63,0x6d,0x91,0x5d,0x6a,0x8f, 0x5a,0x65,0x8e,0x59,0x63,0x8c,0x52,0x5d,0x86,0x51,0x56,0x80,0x50,0x4d,0x77,0x5f, 0x4b,0x69,0x5e,0x50,0x70,0x39,0x39,0x54,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0b,0x0c, 0x0f,0x0e,0x0e,0x12,0x43,0x43,0x53,0x43,0x44,0x67,0x49,0x42,0x61,0x54,0x4b,0x6d, 0x5c,0x51,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x76,0x5f,0x54,0x77,0x5e,0x54,0x76,0x5f,0x55, 0x78,0x57,0x53,0x79,0x51,0x55,0x70,0x16,0x18,0x1e,0x17,0x1a,0x1f,0x17,0x1a,0x1f, 0x17,0x19,0x1e,0x16,0x18,0x1e,0x15,0x16,0x1b,0x12,0x14,0x18,0x2d,0x27,0x31,0x6f, 0x72,0x9d,0x55,0x4f,0x76,0x44,0x3e,0x59,0x52,0x4b,0x6d,0x56,0x50,0x77,0x59,0x51, 0x77,0x53,0x4f,0x79,0x52,0x4f,0x79,0x52,0x4f,0x79,0x52,0x51,0x7a,0x52,0x53,0x7b, 0x52,0x54,0x7d,0x51,0x56,0x80,0x53,0x5d,0x87,0x53,0x60,0x87,0x58,0x63,0x89,0x5a, 0x66,0x8b,0x5f,0x69,0x8e,0x64,0x70,0x91,0x6b,0x75,0x96,0x71,0x7a,0x9a,0x78,0x81, 0x9e,0x84,0x8d,0xa6,0x92,0x99,0xae,0xa0,0xa5,0xb7,0xa8,0xae,0xbf,0xac,0xb1,0xc0, 0xac,0xb1,0xbf,0xa8,0xae,0xbe,0x74,0x78,0x91,0x63,0x65,0x7e,0x5d,0x61,0x7c,0x6d, 0x72,0x8b,0x39,0x3c,0x46,0x26,0x28,0x33,0x24,0x24,0x2f,0x25,0x23,0x2f,0x4d,0x42, 0x54,0x4d,0x42,0x55,0x49,0x4c,0x66,0x45,0x42,0x61,0x45,0x3a,0x56,0x45,0x39,0x54, 0x44,0x39,0x52,0x42,0x39,0x55,0x43,0x3c,0x58,0x47,0x40,0x5e,0x47,0x44,0x65,0x37, 0x39,0x51,0x19,0x19,0x24,0x11,0x11,0x17,0x11,0x11,0x16,0x10,0x10,0x16,0x10,0x11, 0x16,0x11,0x11,0x16,0x10,0x10,0x16,0x0f,0x0f,0x15,0x0f,0x0f,0x15,0x0e,0x0e,0x14, 0x0e,0x0e,0x12,0x0e,0x0e,0x13,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0c,0x0c,0x11,0x0c, 0x0c,0x10,0x2a,0x22,0x2c,0x4a,0x3b,0x4a,0x4c,0x42,0x58,0x89,0x90,0xa9,0x56,0x5f, 0x84,0x50,0x4d,0x74,0x4f,0x50,0x77,0x50,0x59,0x80,0x4c,0x53,0x71,0x15,0x15,0x1c, 0x08,0x08,0x0b,0x08,0x08,0x0a,0x08,0x08,0x0a,0x08,0x08,0x0a,0x07,0x07,0x0a,0x08, 0x08,0x0a,0x08,0x08,0x0a,0x08,0x08,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07, 0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x08,0x08,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a, 0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06, 0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05, 0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04, 0x03,0x03,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x0a,0x72,0x7d,0x9f,0x54,0x5f,0x88,0x55, 0x50,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53, 0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79, 0x5e,0x53,0x79,0x68,0x5c,0x86,0x41,0x3a,0x54,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x03,0x1f,0x1e,0x1f,0x19,0x19,0x1c,0x1f,0x21,0x26,0x50,0x52,0x56,0x6b, 0x6e,0x72,0x77,0x7a,0x7e,0x7c,0x7e,0x87,0x83,0x86,0x8d,0x8d,0x8e,0x93,0x98,0x9a, 0x9e,0x9e,0x9f,0xa4,0x80,0x85,0x90,0x66,0x6d,0x80,0x66,0x6c,0x81,0x5e,0x65,0x7c, 0x5a,0x61,0x7a,0x52,0x58,0x73,0x52,0x51,0x6c,0x56,0x4d,0x64,0x49,0x3f,0x50,0x38, 0x30,0x3d,0x27,0x21,0x29,0x1c,0x17,0x1d,0x17,0x13,0x18,0x14,0x10,0x14,0x11,0x0e, 0x11,0x11,0x0e,0x11,0x10,0x0d,0x10,0x10,0x0d,0x0f,0x10,0x0c,0x0f,0x10,0x0d,0x0f, 0x12,0x0e,0x11,0x14,0x0f,0x12,0x15,0x10,0x13,0x14,0x0f,0x12,0x12,0x0e,0x11,0x10, 0x0c,0x0e,0x0f,0x0b,0x0e,0x0e,0x0b,0x0d,0x0e,0x0a,0x0d,0x0e,0x0a,0x0d,0x0e,0x0a, 0x0e,0x0e,0x0a,0x0e,0x11,0x0d,0x0f,0x13,0x0e,0x12,0x17,0x12,0x16,0x1c,0x16,0x1a, 0x20,0x18,0x1e,0x22,0x1a,0x20,0x27,0x1e,0x25,0x24,0x1b,0x22,0x22,0x1a,0x20,0x22, 0x1a,0x1f,0x23,0x1b,0x21,0x26,0x1d,0x23,0x2b,0x21,0x29,0x2e,0x23,0x2c,0x30,0x26, 0x2f,0x2c,0x22,0x2a,0x2d,0x24,0x2c,0x2b,0x21,0x29,0x2a,0x1f,0x27,0x2a,0x1f,0x26, 0x28,0x1e,0x26,0x28,0x1e,0x24,0x28,0x1e,0x25,0x2e,0x22,0x2a,0x36,0x2a,0x34,0x42, 0x35,0x42,0x42,0x35,0x42,0x45,0x37,0x45,0x47,0x3a,0x49,0x49,0x3b,0x4a,0x4e,0x41, 0x51,0x4f,0x46,0x5b,0x47,0x46,0x5e,0x47,0x42,0x56,0x40,0x36,0x45,0x35,0x2b,0x36, 0x2c,0x27,0x33,0x36,0x3a,0x41,0x52,0x54,0x56,0x82,0x87,0x9d,0x62,0x5c,0x71,0x56, 0x50,0x6a,0x66,0x62,0x79,0x6f,0x6a,0x7f,0x54,0x51,0x6e,0x61,0x54,0x71,0x66,0x65, 0x82,0x81,0x7d,0x93,0x64,0x62,0x7e,0x56,0x56,0x74,0x6b,0x6a,0x86,0x58,0x58,0x78, 0x49,0x4a,0x6f,0x4d,0x54,0x7b,0x55,0x60,0x84,0x4d,0x50,0x7a,0x5c,0x68,0x8a,0x7a, 0x7f,0x9c,0x42,0x33,0x3f,0x4d,0x3c,0x4a,0x4b,0x3b,0x47,0x23,0x19,0x22,0x22,0x19, 0x22,0x3c,0x30,0x42,0x52,0x4f,0x7a,0x62,0x53,0x77,0x63,0x4c,0x69,0x52,0x4f,0x7b, 0x52,0x53,0x7d,0x52,0x55,0x80,0x52,0x57,0x83,0x53,0x5f,0x89,0x56,0x62,0x8b,0x5b, 0x52,0x79,0xad,0xb4,0xc9,0xe3,0xe6,0xed,0x53,0x4c,0x52,0x38,0x2a,0x33,0x47,0x37, 0x44,0x47,0x37,0x44,0x45,0x35,0x41,0x59,0x47,0x58,0x1e,0x21,0x2b,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x2f,0x31,0x39,0x82,0x8b,0xa6,0x5b,0x67,0x8e,0x5a,0x66,0x8e,0x6b,0x76, 0x9b,0x5c,0x67,0x90,0x58,0x64,0x8b,0x57,0x63,0x8b,0x57,0x64,0x8b,0x58,0x65,0x8c, 0x5b,0x66,0x8d,0x5c,0x69,0x8f,0x5c,0x69,0x8f,0x5d,0x69,0x90,0x56,0x62,0x8a,0x52, 0x4f,0x7a,0xa2,0xaa,0xc1,0xb9,0xb9,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04, 0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x06,0x07,0x06, 0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x08,0x09, 0x0c,0x08,0x09,0x0c,0x07,0x08,0x0a,0x09,0x09,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0c, 0x09,0x0a,0x0c,0x08,0x09,0x0c,0x08,0x09,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08, 0x09,0x0b,0x08,0x09,0x0b,0x09,0x0a,0x0c,0x0f,0x0f,0x13,0x13,0x12,0x17,0x14,0x12, 0x17,0x15,0x14,0x1a,0x16,0x15,0x1a,0x17,0x16,0x1b,0x17,0x16,0x1c,0x18,0x16,0x1d, 0x19,0x18,0x1e,0x1c,0x1d,0x24,0x18,0x19,0x20,0x15,0x14,0x1c,0x22,0x1e,0x28,0x2e, 0x29,0x34,0x30,0x2a,0x36,0x25,0x25,0x32,0x2f,0x33,0x41,0x3d,0x41,0x4f,0x52,0x56, 0x64,0x5e,0x62,0x6e,0x4f,0x53,0x60,0x5f,0x62,0x6c,0x7f,0x81,0x84,0x89,0x8a,0x8b, 0x91,0x90,0x97,0x7f,0x81,0x8f,0x67,0x6a,0x7e,0x5f,0x62,0x75,0x88,0x8b,0x98,0x85, 0x8a,0x9d,0x73,0x7b,0x90,0x5e,0x66,0x82,0x61,0x6c,0x8a,0x78,0x81,0x9d,0x6a,0x74, 0x95,0x5f,0x6b,0x8f,0x5a,0x67,0x8c,0x58,0x64,0x8c,0x53,0x5e,0x87,0x51,0x5b,0x84, 0x51,0x4e,0x78,0x61,0x4b,0x69,0x5e,0x51,0x74,0x37,0x37,0x53,0x0b,0x0d,0x10,0x0b, 0x0d,0x10,0x0a,0x0b,0x0f,0x09,0x0a,0x0d,0x47,0x45,0x53,0x47,0x50,0x73,0x49,0x42, 0x60,0x54,0x4b,0x6d,0x5c,0x51,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x77,0x5f,0x54,0x76,0x5f,0x54,0x77,0x5f, 0x55,0x76,0x5e,0x55,0x76,0x57,0x53,0x78,0x52,0x56,0x72,0x17,0x1a,0x1f,0x18,0x1a, 0x20,0x18,0x1a,0x20,0x18,0x1a,0x1f,0x18,0x1a,0x1e,0x15,0x16,0x1b,0x12,0x14,0x18, 0x26,0x22,0x2a,0x78,0x7b,0xa9,0x58,0x53,0x7b,0x43,0x3e,0x58,0x52,0x4a,0x6d,0x58, 0x51,0x77,0x59,0x52,0x77,0x55,0x51,0x78,0x53,0x50,0x79,0x52,0x50,0x79,0x52,0x50, 0x7a,0x52,0x52,0x7c,0x51,0x53,0x7b,0x52,0x58,0x81,0x52,0x5c,0x87,0x54,0x5f,0x87, 0x58,0x63,0x89,0x5b,0x67,0x8c,0x61,0x6c,0x90,0x65,0x70,0x93,0x6c,0x76,0x96,0x6f, 0x7a,0x98,0x76,0x80,0x9d,0x81,0x89,0xa5,0x8d,0x94,0xac,0x9a,0xa1,0xb4,0xa5,0xab, 0xbd,0xac,0xb0,0xc0,0xae,0xb4,0xc2,0xaf,0xb4,0xc1,0x9c,0xa0,0xb1,0x6a,0x6c,0x87, 0x60,0x64,0x7d,0x63,0x67,0x84,0x59,0x5d,0x6b,0x1e,0x21,0x2a,0x1d,0x1e,0x27,0x1d, 0x1c,0x25,0x4f,0x45,0x57,0x4f,0x42,0x56,0x4c,0x46,0x5a,0x4c,0x51,0x70,0x43,0x40, 0x60,0x43,0x39,0x55,0x42,0x37,0x50,0x40,0x37,0x4f,0x3f,0x35,0x4e,0x42,0x37,0x4f, 0x43,0x37,0x50,0x42,0x39,0x54,0x43,0x3d,0x5a,0x47,0x44,0x65,0x31,0x31,0x49,0x17, 0x17,0x21,0x0f,0x0f,0x16,0x0e,0x0e,0x14,0x0f,0x0f,0x15,0x0f,0x0f,0x15,0x0e,0x0e, 0x13,0x0e,0x0e,0x13,0x0e,0x0e,0x13,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0d,0x0d,0x12, 0x0c,0x0c,0x11,0x0c,0x0c,0x10,0x41,0x35,0x43,0x4a,0x3b,0x4b,0x4c,0x41,0x54,0x8c, 0x93,0xac,0x50,0x59,0x80,0x56,0x4f,0x73,0x4f,0x4d,0x76,0x5c,0x50,0x71,0x5d,0x50, 0x72,0x51,0x59,0x81,0x23,0x26,0x33,0x09,0x09,0x0d,0x08,0x08,0x0b,0x09,0x08,0x0b, 0x08,0x08,0x0a,0x08,0x08,0x0a,0x08,0x08,0x0b,0x09,0x09,0x0b,0x09,0x09,0x0b,0x09, 0x09,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0b,0x09,0x09,0x0c,0x09,0x09, 0x0c,0x09,0x09,0x0c,0x08,0x08,0x0b,0x08,0x08,0x0b,0x07,0x08,0x0a,0x07,0x07,0x0a, 0x07,0x07,0x0a,0x06,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06, 0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x07,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x04, 0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x05,0x02,0x02,0x04,0x02,0x02,0x04, 0x02,0x02,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x89,0xa7, 0x58,0x65,0x8c,0x52,0x4f,0x7a,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e, 0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53, 0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x63,0x57,0x80,0x7d,0x70,0xa2,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,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,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x03,0x1c,0x1b,0x1c,0x3c,0x3b,0x3d,0x13,0x13,0x17,0x26,0x28,0x2e, 0x44,0x46,0x4b,0x5e,0x60,0x66,0x72,0x75,0x7d,0x75,0x78,0x82,0x8d,0x8e,0x92,0x8e, 0x8e,0x93,0x93,0x96,0x9a,0x8a,0x8e,0x98,0x6a,0x71,0x83,0x56,0x5e,0x76,0x5d,0x63, 0x7b,0x58,0x5e,0x78,0x56,0x5b,0x76,0x52,0x55,0x70,0x56,0x4f,0x69,0x51,0x46,0x5a, 0x42,0x37,0x46,0x2b,0x24,0x2d,0x17,0x13,0x17,0x11,0x0e,0x11,0x0e,0x0b,0x0e,0x0e, 0x0b,0x0e,0x0b,0x09,0x0b,0x0a,0x09,0x0b,0x0a,0x09,0x0a,0x09,0x06,0x08,0x0a,0x07, 0x0a,0x0c,0x0a,0x0c,0x0e,0x0a,0x0e,0x0e,0x0b,0x0e,0x0e,0x0a,0x0d,0x0e,0x0a,0x0d, 0x0d,0x0a,0x0c,0x0c,0x09,0x0a,0x0c,0x09,0x0b,0x0d,0x0a,0x0c,0x0b,0x09,0x0a,0x0b, 0x09,0x0a,0x0c,0x09,0x0a,0x0d,0x0a,0x0c,0x0f,0x0b,0x0e,0x11,0x0d,0x0f,0x14,0x0f, 0x12,0x19,0x12,0x16,0x1b,0x14,0x19,0x1e,0x16,0x1c,0x1e,0x17,0x1c,0x1e,0x17,0x1c, 0x1f,0x17,0x1c,0x1e,0x16,0x1c,0x1e,0x16,0x1b,0x1e,0x16,0x1b,0x22,0x1a,0x20,0x22, 0x1a,0x20,0x26,0x1c,0x23,0x24,0x1b,0x21,0x24,0x1c,0x22,0x26,0x1d,0x24,0x21,0x19, 0x1e,0x1f,0x17,0x1c,0x21,0x18,0x1e,0x23,0x1b,0x20,0x27,0x1d,0x25,0x2a,0x1f,0x26, 0x2d,0x22,0x2a,0x35,0x29,0x33,0x3e,0x32,0x3e,0x44,0x36,0x44,0x46,0x39,0x47,0x45, 0x38,0x46,0x4a,0x3d,0x4c,0x4c,0x42,0x55,0x47,0x42,0x56,0x42,0x3a,0x4a,0x34,0x2d, 0x39,0x28,0x27,0x36,0x2a,0x29,0x38,0x32,0x36,0x43,0x6c,0x6f,0x74,0x80,0x83,0x99, 0x5c,0x57,0x6c,0x56,0x50,0x6b,0x5a,0x56,0x71,0x63,0x5e,0x75,0x5e,0x57,0x6f,0x5e, 0x59,0x74,0x6e,0x6d,0x88,0x89,0x88,0x9c,0x7d,0x7a,0x91,0x68,0x67,0x81,0x61,0x60, 0x7c,0x54,0x55,0x76,0x4c,0x4a,0x6e,0x4c,0x53,0x79,0x51,0x5d,0x81,0x4f,0x59,0x80, 0x52,0x5c,0x82,0x79,0x85,0xa4,0x4b,0x3f,0x4c,0x49,0x39,0x46,0x4b,0x3a,0x47,0x24, 0x1a,0x23,0x22,0x19,0x22,0x37,0x2c,0x3b,0x52,0x4f,0x7a,0x5e,0x53,0x79,0x64,0x4c, 0x69,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x54,0x7e,0x52,0x55,0x81,0x52,0x5d,0x88, 0x57,0x64,0x8c,0x58,0x50,0x79,0x81,0x8b,0xaa,0xdd,0xe0,0xe8,0x71,0x6c,0x74,0x39, 0x2b,0x34,0x45,0x35,0x41,0x49,0x38,0x45,0x46,0x36,0x42,0x58,0x45,0x56,0x2c,0x2f, 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x07,0x64,0x6a,0x7f,0x6e,0x7a,0x9d,0x54, 0x5f,0x8a,0x6b,0x76,0x9b,0x60,0x6c,0x93,0x58,0x64,0x8c,0x56,0x62,0x8a,0x57,0x64, 0x8b,0x58,0x64,0x8b,0x5a,0x65,0x8c,0x5b,0x67,0x8f,0x5c,0x67,0x8f,0x5c,0x67,0x8f, 0x5c,0x69,0x8f,0x54,0x50,0x79,0x72,0x7d,0x9f,0xe2,0xe4,0xea,0x22,0x22,0x22,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x05,0x06, 0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x07,0x0a,0x06,0x07,0x0a,0x07, 0x07,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09, 0x0b,0x08,0x09,0x0c,0x09,0x09,0x0c,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b, 0x08,0x09,0x0b,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x0c, 0x0d,0x10,0x11,0x11,0x15,0x14,0x13,0x18,0x15,0x13,0x19,0x16,0x15,0x1a,0x16,0x16, 0x1b,0x16,0x16,0x1b,0x17,0x16,0x1c,0x1b,0x1a,0x22,0x1e,0x1d,0x26,0x18,0x18,0x1e, 0x15,0x14,0x1c,0x1e,0x1b,0x24,0x2d,0x27,0x32,0x33,0x2d,0x38,0x30,0x2c,0x3b,0x2f, 0x31,0x42,0x36,0x3b,0x4b,0x40,0x44,0x4f,0x50,0x53,0x5e,0x5f,0x62,0x6a,0x66,0x67, 0x6d,0x66,0x69,0x6e,0x64,0x65,0x73,0x55,0x49,0x5d,0x56,0x46,0x57,0x4e,0x42,0x54, 0x63,0x5c,0x6f,0x5a,0x5e,0x79,0x51,0x59,0x75,0x50,0x55,0x74,0x57,0x5a,0x79,0x65, 0x6f,0x8e,0x65,0x6f,0x8f,0x5c,0x67,0x8b,0x58,0x64,0x8b,0x58,0x63,0x8a,0x52,0x5d, 0x87,0x52,0x5c,0x84,0x51,0x4e,0x78,0x62,0x4f,0x6c,0x5e,0x52,0x75,0x37,0x39,0x55, 0x0b,0x0c,0x10,0x0a,0x0b,0x0f,0x0a,0x0c,0x0f,0x09,0x0a,0x0c,0x49,0x46,0x52,0x50, 0x5b,0x7e,0x47,0x40,0x5e,0x55,0x4a,0x6e,0x5c,0x51,0x77,0x5f,0x52,0x76,0x5f,0x52, 0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x54,0x78,0x5f,0x53,0x77,0x5f,0x54,0x77, 0x5f,0x53,0x76,0x5f,0x55,0x77,0x5f,0x55,0x77,0x5b,0x55,0x79,0x50,0x54,0x71,0x18, 0x1a,0x1f,0x19,0x1a,0x20,0x1a,0x1b,0x21,0x1a,0x1b,0x21,0x18,0x1a,0x1f,0x16,0x17, 0x1c,0x14,0x15,0x1a,0x20,0x1e,0x25,0x78,0x79,0xa2,0x59,0x55,0x7d,0x44,0x3e,0x59, 0x51,0x4b,0x6b,0x59,0x51,0x77,0x56,0x50,0x77,0x54,0x50,0x77,0x53,0x50,0x79,0x52, 0x50,0x79,0x52,0x50,0x7a,0x52,0x53,0x7c,0x51,0x55,0x7e,0x52,0x58,0x81,0x54,0x5e, 0x87,0x54,0x5f,0x87,0x58,0x63,0x89,0x5d,0x68,0x8d,0x60,0x6a,0x8e,0x65,0x70,0x93, 0x6a,0x74,0x96,0x70,0x7b,0x9a,0x75,0x7f,0x9c,0x80,0x89,0xa3,0x87,0x8f,0xa8,0x94, 0x9c,0xb1,0xa1,0xa7,0xba,0xab,0xb0,0xbf,0xae,0xb2,0xc2,0xaf,0xb4,0xc1,0xac,0xb1, 0xc0,0x8f,0x93,0xa6,0x67,0x6a,0x86,0x65,0x6b,0x87,0x51,0x53,0x69,0x1c,0x1e,0x27, 0x16,0x17,0x20,0x17,0x18,0x20,0x51,0x46,0x59,0x4c,0x41,0x54,0x41,0x37,0x46,0x55, 0x56,0x69,0x51,0x59,0x79,0x47,0x44,0x65,0x49,0x3f,0x5b,0x45,0x3b,0x53,0x44,0x3a, 0x51,0x3f,0x36,0x4e,0x3e,0x31,0x4a,0x3e,0x32,0x49,0x3c,0x30,0x47,0x3d,0x32,0x49, 0x3e,0x37,0x50,0x43,0x40,0x5d,0x4a,0x4f,0x70,0x34,0x38,0x4e,0x19,0x1b,0x24,0x0f, 0x0f,0x16,0x0f,0x0f,0x14,0x0e,0x0e,0x13,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0e,0x0e, 0x12,0x0d,0x0d,0x12,0x0b,0x0b,0x0f,0x17,0x14,0x1b,0x4b,0x3c,0x4d,0x4a,0x3c,0x4b, 0x4c,0x41,0x56,0x7d,0x85,0xa1,0x4f,0x55,0x7c,0x5d,0x50,0x71,0x56,0x4f,0x73,0x5e, 0x4d,0x6d,0x5b,0x46,0x63,0x5f,0x4a,0x66,0x50,0x4d,0x75,0x3a,0x40,0x5b,0x11,0x11, 0x18,0x08,0x08,0x0a,0x09,0x09,0x0b,0x08,0x08,0x0b,0x09,0x09,0x0b,0x09,0x09,0x0b, 0x08,0x08,0x0b,0x09,0x09,0x0b,0x09,0x09,0x0c,0x09,0x09,0x0c,0x09,0x09,0x0c,0x09, 0x0a,0x0d,0x09,0x09,0x0c,0x08,0x08,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0b,0x08,0x08, 0x0b,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a, 0x06,0x07,0x0a,0x06,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x06,0x07,0x05, 0x06,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03, 0x05,0x03,0x03,0x05,0x02,0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x5c,0x62,0x75,0x5b,0x67,0x8d,0x52,0x4f,0x7b,0x5d,0x52,0x79,0x5e,0x53,0x79, 0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e, 0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x55,0x7c,0x75,0x67, 0x96,0x07,0x06,0x09,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,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,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x22,0x21,0x22,0x3e,0x3d,0x3f,0x11,0x12, 0x17,0x27,0x2a,0x30,0x3c,0x3f,0x47,0x4a,0x4e,0x5d,0x6f,0x72,0x7d,0x7e,0x81,0x87, 0x91,0x91,0x94,0x8f,0x90,0x94,0x86,0x88,0x90,0x73,0x79,0x86,0x51,0x58,0x72,0x55, 0x5d,0x77,0x5a,0x61,0x7a,0x58,0x5e,0x79,0x52,0x57,0x72,0x55,0x50,0x6a,0x56,0x49, 0x5e,0x46,0x3a,0x49,0x33,0x2a,0x35,0x1b,0x16,0x1b,0x10,0x0d,0x10,0x0d,0x0a,0x0d, 0x0a,0x09,0x0b,0x09,0x08,0x0a,0x06,0x06,0x07,0x07,0x06,0x07,0x07,0x06,0x07,0x07, 0x06,0x07,0x08,0x06,0x08,0x0a,0x07,0x0a,0x0a,0x08,0x0a,0x07,0x06,0x06,0x04,0x02, 0x03,0x02,0x02,0x02,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,0x02, 0x02,0x02,0x06,0x04,0x06,0x12,0x0d,0x0f,0x18,0x12,0x16,0x1a,0x12,0x17,0x18,0x12, 0x16,0x18,0x12,0x16,0x1a,0x13,0x17,0x1b,0x14,0x19,0x1a,0x13,0x18,0x1a,0x12,0x17, 0x15,0x0f,0x12,0x0c,0x0a,0x0b,0x09,0x06,0x08,0x09,0x06,0x08,0x0d,0x0a,0x0c,0x1e, 0x16,0x1c,0x1e,0x17,0x1d,0x22,0x1a,0x1f,0x1f,0x18,0x1f,0x21,0x19,0x1f,0x20,0x19, 0x1d,0x20,0x19,0x1e,0x1f,0x17,0x1d,0x22,0x1b,0x22,0x2f,0x26,0x2f,0x3d,0x31,0x3e, 0x41,0x34,0x42,0x45,0x38,0x46,0x4a,0x3e,0x4d,0x42,0x35,0x42,0x3e,0x32,0x3e,0x39, 0x2f,0x3a,0x2c,0x26,0x31,0x1e,0x1e,0x29,0x24,0x27,0x33,0x33,0x38,0x46,0x83,0x86, 0x8f,0xa1,0x9c,0xad,0x70,0x6b,0x7f,0x54,0x50,0x6c,0x52,0x49,0x66,0x4e,0x46,0x62, 0x56,0x4f,0x6a,0x80,0x79,0x8c,0x8a,0x85,0x98,0x7e,0x7b,0x91,0x8c,0x89,0x9e,0x8d, 0x8c,0xa1,0x82,0x81,0x99,0x6b,0x6d,0x8c,0x4e,0x4d,0x72,0x4b,0x4e,0x73,0x4e,0x58, 0x7e,0x50,0x5a,0x82,0x4c,0x56,0x7c,0x77,0x82,0xa1,0x5a,0x54,0x64,0x43,0x33,0x3f, 0x4b,0x3a,0x47,0x24,0x1a,0x23,0x22,0x19,0x22,0x2f,0x25,0x31,0x52,0x4f,0x7b,0x5e, 0x53,0x79,0x64,0x4d,0x6b,0x52,0x52,0x7c,0x52,0x50,0x7c,0x52,0x56,0x81,0x52,0x56, 0x82,0x52,0x5d,0x86,0x57,0x63,0x8c,0x5b,0x52,0x79,0x66,0x73,0x98,0xd2,0xd7,0xe1, 0x8e,0x8a,0x93,0x36,0x29,0x31,0x46,0x35,0x41,0x49,0x38,0x46,0x46,0x36,0x42,0x52, 0x40,0x50,0x3e,0x3b,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x43,0x51, 0x7e,0x8a,0xa9,0x52,0x58,0x84,0x6b,0x76,0x9b,0x63,0x6f,0x95,0x57,0x64,0x8b,0x55, 0x60,0x89,0x56,0x62,0x8a,0x57,0x63,0x8a,0x5a,0x65,0x8c,0x5b,0x67,0x8d,0x5b,0x67, 0x8f,0x5e,0x6a,0x91,0x5d,0x69,0x90,0x52,0x54,0x7e,0x54,0x5f,0x88,0xb5,0xbc,0xcf, 0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03, 0x05,0x04,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x07,0x09, 0x06,0x06,0x09,0x07,0x08,0x0a,0x07,0x07,0x0a,0x08,0x09,0x0c,0x07,0x08,0x0a,0x07, 0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0c,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09, 0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x07,0x08,0x0a, 0x07,0x08,0x0a,0x08,0x09,0x0b,0x0a,0x0b,0x0d,0x0f,0x0f,0x12,0x14,0x12,0x18,0x15, 0x14,0x1a,0x15,0x14,0x1a,0x16,0x16,0x1a,0x16,0x16,0x1a,0x18,0x16,0x1d,0x1a,0x1a, 0x20,0x1a,0x1a,0x20,0x1a,0x1a,0x20,0x16,0x17,0x1d,0x1b,0x1a,0x22,0x2c,0x26,0x31, 0x34,0x2e,0x3a,0x34,0x2f,0x3e,0x2f,0x2e,0x40,0x26,0x2a,0x36,0x33,0x36,0x3e,0x4c, 0x4f,0x56,0x65,0x67,0x6c,0x46,0x4a,0x52,0x3b,0x37,0x49,0x45,0x37,0x45,0x3f,0x32, 0x3e,0x43,0x35,0x43,0x64,0x59,0x68,0x69,0x62,0x79,0x57,0x54,0x6e,0x4f,0x4e,0x68, 0x40,0x45,0x5d,0x57,0x61,0x82,0x70,0x79,0x97,0x62,0x6d,0x8e,0x5a,0x66,0x8a,0x58, 0x62,0x89,0x52,0x5d,0x87,0x52,0x58,0x83,0x51,0x4e,0x79,0x62,0x4c,0x69,0x60,0x52, 0x75,0x37,0x3b,0x56,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0a,0x0a,0x0e,0x09,0x0a,0x0c, 0x49,0x47,0x52,0x57,0x62,0x86,0x46,0x40,0x5f,0x55,0x4b,0x6e,0x5d,0x52,0x77,0x5d, 0x52,0x78,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x54,0x78,0x60,0x53, 0x77,0x5f,0x54,0x77,0x5f,0x54,0x76,0x5f,0x55,0x77,0x5f,0x55,0x77,0x5d,0x56,0x79, 0x50,0x54,0x72,0x18,0x1a,0x20,0x19,0x1a,0x20,0x1a,0x1c,0x22,0x1a,0x1c,0x22,0x1a, 0x1b,0x21,0x16,0x18,0x1d,0x15,0x16,0x1b,0x1b,0x1b,0x20,0x76,0x76,0x9c,0x58,0x53, 0x7e,0x43,0x3e,0x59,0x52,0x4b,0x6c,0x59,0x51,0x77,0x56,0x50,0x77,0x54,0x50,0x77, 0x53,0x51,0x78,0x52,0x50,0x7a,0x52,0x50,0x7a,0x52,0x53,0x7c,0x52,0x55,0x7e,0x52, 0x5b,0x84,0x53,0x5d,0x86,0x54,0x60,0x88,0x57,0x62,0x89,0x5b,0x67,0x8b,0x5f,0x6b, 0x8f,0x65,0x70,0x93,0x68,0x73,0x95,0x6f,0x7a,0x99,0x76,0x80,0x9d,0x7b,0x85,0x9f, 0x82,0x8b,0xa5,0x8d,0x94,0xac,0x9d,0xa4,0xb6,0xa7,0xac,0xbd,0xaa,0xb0,0xc0,0xae, 0xb4,0xc2,0xaf,0xb2,0xc1,0xa9,0xac,0xbb,0x87,0x8d,0xa4,0x55,0x58,0x72,0x3e,0x3f, 0x55,0x34,0x36,0x41,0x16,0x16,0x1e,0x16,0x16,0x1e,0x52,0x47,0x5a,0x4e,0x43,0x54, 0x3f,0x35,0x43,0x32,0x29,0x35,0x5f,0x65,0x7d,0x4c,0x4d,0x71,0x53,0x4a,0x6b,0x51, 0x49,0x67,0x4d,0x43,0x60,0x4a,0x3d,0x56,0x45,0x39,0x51,0x41,0x36,0x4d,0x3c,0x30, 0x46,0x38,0x2c,0x43,0x35,0x2c,0x43,0x36,0x2f,0x47,0x3d,0x34,0x50,0x42,0x40,0x5d, 0x4c,0x4f,0x70,0x50,0x5b,0x7e,0x33,0x3a,0x51,0x13,0x14,0x1b,0x0d,0x0d,0x12,0x0d, 0x0d,0x12,0x0c,0x0c,0x11,0x0d,0x0d,0x12,0x0c,0x0c,0x10,0x30,0x29,0x34,0x5c,0x4b, 0x5f,0x50,0x41,0x52,0x4c,0x41,0x56,0x7d,0x85,0xa1,0x4f,0x56,0x7d,0x5e,0x50,0x70, 0x5e,0x4d,0x6c,0x5b,0x46,0x63,0x5b,0x45,0x61,0x5a,0x45,0x60,0x5c,0x47,0x63,0x5f, 0x50,0x6f,0x50,0x59,0x80,0x1f,0x20,0x2a,0x0a,0x0a,0x0d,0x09,0x09,0x0c,0x09,0x09, 0x0c,0x09,0x09,0x0c,0x09,0x09,0x0d,0x0a,0x0a,0x0d,0x09,0x09,0x0c,0x0a,0x0a,0x0d, 0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x09,0x09,0x0c,0x09, 0x09,0x0c,0x09,0x09,0x0c,0x09,0x09,0x0c,0x08,0x09,0x0b,0x08,0x08,0x0b,0x08,0x08, 0x0b,0x07,0x08,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x07,0x0a,0x06,0x06,0x09, 0x06,0x06,0x08,0x05,0x06,0x07,0x05,0x06,0x07,0x04,0x05,0x06,0x04,0x05,0x06,0x04, 0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x02,0x02,0x04,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x2e,0x34,0x62,0x6e,0x93,0x52,0x50,0x7b,0x5e,0x53, 0x79,0x60,0x53,0x77,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79, 0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60, 0x53,0x77,0x6a,0x5d,0x88,0x2f,0x29,0x3a,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, 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, 0x02,0x02,0x02,0x02,0x02,0x02,0x09,0x09,0x09,0x1f,0x1e,0x1f,0x46,0x46,0x47,0x2f, 0x2f,0x33,0x1e,0x21,0x26,0x34,0x36,0x3d,0x40,0x44,0x4f,0x70,0x73,0x7b,0x87,0x8a, 0x90,0x87,0x8a,0x8e,0x97,0x97,0x9a,0x87,0x89,0x8e,0x62,0x67,0x76,0x47,0x4e,0x66, 0x4e,0x4a,0x64,0x4f,0x50,0x6d,0x50,0x53,0x70,0x50,0x4f,0x6c,0x58,0x50,0x68,0x57, 0x49,0x5c,0x46,0x3a,0x4a,0x3a,0x2f,0x3b,0x26,0x1e,0x26,0x14,0x10,0x14,0x0d,0x0a, 0x0e,0x0a,0x08,0x0a,0x07,0x06,0x08,0x05,0x04,0x06,0x05,0x04,0x05,0x06,0x06,0x06, 0x07,0x06,0x07,0x05,0x04,0x05,0x02,0x02,0x02,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,0x03,0x02, 0x02,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x07,0x06,0x06, 0x0f,0x0c,0x0e,0x16,0x10,0x13,0x18,0x12,0x17,0x1a,0x13,0x18,0x1e,0x16,0x1c,0x20, 0x18,0x1e,0x21,0x19,0x1e,0x22,0x1a,0x1f,0x26,0x1e,0x24,0x28,0x20,0x28,0x29,0x21, 0x2a,0x2e,0x25,0x2e,0x38,0x2e,0x3a,0x46,0x39,0x48,0x46,0x3a,0x49,0x42,0x36,0x43, 0x3e,0x32,0x3e,0x36,0x2c,0x37,0x2a,0x24,0x2e,0x1a,0x1a,0x23,0x19,0x1b,0x24,0x2e, 0x32,0x3d,0x8a,0x8f,0x9b,0xa4,0x9b,0xa7,0x88,0x80,0x8f,0x54,0x4f,0x6d,0x52,0x4a, 0x67,0x57,0x4b,0x65,0x50,0x46,0x61,0x7c,0x75,0x89,0xa5,0x9f,0xad,0x8a,0x85,0x97, 0x89,0x85,0x99,0x95,0x94,0xa6,0x8e,0x8e,0xa3,0x76,0x76,0x91,0x58,0x5a,0x7b,0x51, 0x51,0x75,0x4c,0x55,0x7a,0x51,0x5c,0x82,0x50,0x4e,0x78,0x6e,0x78,0x9a,0x6b,0x6b, 0x83,0x3d,0x2e,0x3a,0x4a,0x39,0x47,0x24,0x1b,0x24,0x22,0x19,0x22,0x2e,0x24,0x2e, 0x52,0x4f,0x7a,0x5c,0x52,0x79,0x64,0x4d,0x6b,0x52,0x50,0x7b,0x52,0x52,0x7d,0x52, 0x54,0x7e,0x52,0x57,0x82,0x52,0x5c,0x86,0x55,0x60,0x8a,0x52,0x4f,0x7a,0x58,0x64, 0x8d,0xd6,0xd9,0xe3,0xa9,0xa8,0xb2,0x33,0x26,0x2e,0x47,0x36,0x43,0x49,0x38,0x45, 0x48,0x37,0x44,0x4e,0x3c,0x4a,0x55,0x48,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2b,0x2c,0x33,0x7c,0x84,0x9f,0x56,0x62,0x8b,0x5c,0x67,0x90,0x69,0x74,0x99, 0x5b,0x67,0x8e,0x56,0x63,0x8a,0x56,0x62,0x8a,0x56,0x63,0x8a,0x58,0x64,0x8b,0x58, 0x64,0x8c,0x5a,0x65,0x8d,0x5b,0x67,0x8d,0x5d,0x69,0x90,0x56,0x63,0x8a,0x53,0x4f, 0x7a,0x81,0x8b,0xaa,0xcf,0xd0,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06, 0x08,0x06,0x07,0x09,0x06,0x06,0x09,0x07,0x07,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a, 0x08,0x09,0x0b,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x07, 0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09, 0x0b,0x07,0x08,0x0a,0x08,0x09,0x0b,0x07,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0c, 0x0d,0x0d,0x10,0x13,0x11,0x16,0x15,0x14,0x19,0x15,0x14,0x1a,0x16,0x16,0x1b,0x18, 0x17,0x1d,0x1a,0x1a,0x1f,0x1b,0x1a,0x21,0x1b,0x1b,0x21,0x1b,0x1b,0x20,0x18,0x19, 0x1f,0x18,0x17,0x20,0x29,0x23,0x2e,0x32,0x2b,0x36,0x31,0x2c,0x39,0x2b,0x29,0x37, 0x28,0x2c,0x36,0x39,0x3b,0x42,0x56,0x58,0x5e,0x4f,0x53,0x60,0x40,0x3c,0x51,0x48, 0x3b,0x4b,0x46,0x39,0x47,0x41,0x34,0x41,0x67,0x5f,0x6e,0x69,0x68,0x81,0x59,0x59, 0x77,0x51,0x55,0x72,0x44,0x49,0x63,0x4a,0x50,0x6e,0x66,0x70,0x8e,0x70,0x78,0x97, 0x60,0x6b,0x8e,0x59,0x64,0x8a,0x53,0x5e,0x88,0x51,0x5c,0x84,0x51,0x4f,0x79,0x62, 0x4c,0x69,0x62,0x53,0x74,0x37,0x3e,0x58,0x0a,0x0b,0x0f,0x0a,0x0b,0x0e,0x09,0x0a, 0x0d,0x07,0x07,0x0a,0x48,0x43,0x4f,0x5e,0x6a,0x8c,0x44,0x3f,0x61,0x54,0x4a,0x6d, 0x5d,0x52,0x77,0x5d,0x52,0x78,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x54,0x78,0x60,0x53,0x77,0x5f,0x53,0x77,0x5f,0x54,0x76,0x5f,0x55,0x77,0x5f,0x55, 0x78,0x5f,0x56,0x77,0x51,0x53,0x72,0x19,0x1a,0x20,0x1a,0x1c,0x22,0x1a,0x1d,0x22, 0x1a,0x1c,0x22,0x19,0x1b,0x20,0x17,0x19,0x1e,0x16,0x17,0x1b,0x16,0x16,0x1b,0x76, 0x75,0x95,0x58,0x56,0x80,0x45,0x3f,0x59,0x52,0x49,0x6a,0x5a,0x52,0x77,0x58,0x52, 0x77,0x54,0x50,0x78,0x51,0x50,0x78,0x51,0x50,0x78,0x51,0x50,0x79,0x52,0x53,0x7c, 0x52,0x55,0x7e,0x52,0x5a,0x82,0x52,0x5d,0x86,0x55,0x5f,0x88,0x59,0x64,0x8b,0x5e, 0x6a,0x8d,0x60,0x6b,0x8f,0x65,0x6f,0x93,0x6a,0x74,0x95,0x6d,0x78,0x97,0x75,0x7e, 0x9b,0x7a,0x83,0x9e,0x81,0x8b,0xa5,0x8e,0x95,0xab,0x96,0x9c,0xb1,0xa3,0xa9,0xbb, 0xa9,0xad,0xbf,0xae,0xb4,0xc2,0xaf,0xb4,0xc1,0xaa,0xb0,0xbf,0xa4,0xa9,0xba,0x4a, 0x4b,0x61,0x3d,0x3e,0x54,0x43,0x44,0x58,0x16,0x17,0x1f,0x16,0x17,0x1f,0x54,0x49, 0x5d,0x52,0x46,0x59,0x42,0x38,0x47,0x32,0x2a,0x35,0x29,0x23,0x2c,0x4e,0x57,0x79, 0x53,0x4c,0x6f,0x56,0x4e,0x6f,0x58,0x4e,0x6e,0x58,0x4c,0x6d,0x54,0x49,0x67,0x4e, 0x41,0x5f,0x49,0x3c,0x56,0x41,0x36,0x4f,0x3a,0x30,0x49,0x35,0x2d,0x44,0x34,0x2d, 0x44,0x37,0x32,0x49,0x3e,0x3a,0x54,0x43,0x40,0x5f,0x4e,0x51,0x73,0x58,0x60,0x83, 0x31,0x32,0x3e,0x0c,0x0c,0x11,0x0d,0x0d,0x12,0x0c,0x0c,0x11,0x0b,0x0b,0x0f,0x3d, 0x32,0x41,0x5b,0x4a,0x5e,0x5b,0x4a,0x5e,0x58,0x4e,0x61,0x90,0x97,0xae,0x50,0x5a, 0x81,0x5e,0x50,0x6e,0x5a,0x46,0x62,0x54,0x40,0x5a,0x54,0x40,0x59,0x58,0x43,0x5c, 0x57,0x42,0x5b,0x54,0x3f,0x5a,0x5d,0x48,0x64,0x50,0x4e,0x76,0x37,0x3c,0x50,0x0e, 0x0f,0x12,0x09,0x09,0x0c,0x09,0x09,0x0c,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a, 0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e, 0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x09, 0x09,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x08,0x0b,0x07,0x08,0x0a,0x07,0x07, 0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x05,0x06,0x07, 0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x03,0x04,0x05,0x03,0x03,0x05,0x03, 0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0e,0x0f,0x72,0x7d,0x9f,0x52, 0x57,0x82,0x5c,0x52,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x5e,0x53,0x79,0x60,0x53,0x77,0x66,0x58,0x7f,0x78,0x67,0x95,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,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,0x0d,0x0d,0x0d,0x25,0x25,0x25,0x19,0x19,0x19, 0x0a,0x09,0x0b,0x11,0x12,0x17,0x29,0x2b,0x32,0x3b,0x3e,0x46,0x5a,0x5c,0x63,0x7e, 0x80,0x86,0x6f,0x72,0x7a,0x75,0x76,0x7d,0x7c,0x7e,0x82,0x5c,0x60,0x6a,0x3e,0x3f, 0x56,0x4b,0x46,0x5e,0x54,0x4d,0x66,0x53,0x4e,0x68,0x55,0x4e,0x68,0x58,0x4d,0x62, 0x4f,0x41,0x52,0x3e,0x32,0x3e,0x2f,0x25,0x2e,0x26,0x1e,0x25,0x1e,0x18,0x1e,0x12, 0x0e,0x12,0x0a,0x08,0x0a,0x06,0x06,0x07,0x05,0x04,0x06,0x04,0x04,0x05,0x05,0x04, 0x05,0x02,0x02,0x02,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,0x06,0x05,0x06,0x0e,0x0a, 0x0c,0x0d,0x0a,0x0c,0x0d,0x0a,0x0c,0x0e,0x0a,0x0d,0x11,0x0d,0x0f,0x13,0x0f,0x12, 0x16,0x11,0x15,0x1a,0x14,0x18,0x1a,0x15,0x1a,0x1a,0x15,0x1a,0x1d,0x17,0x1e,0x22, 0x1b,0x22,0x25,0x1e,0x26,0x2c,0x24,0x2d,0x2e,0x26,0x2f,0x42,0x38,0x45,0x43,0x37, 0x45,0x42,0x36,0x43,0x3f,0x34,0x41,0x37,0x2e,0x39,0x2a,0x25,0x2e,0x1b,0x1a,0x22, 0x1a,0x18,0x20,0x26,0x24,0x2f,0x7a,0x81,0x97,0x88,0x7d,0x89,0x75,0x69,0x7a,0x59, 0x55,0x71,0x56,0x4d,0x6b,0x5a,0x4d,0x66,0x54,0x48,0x60,0x52,0x4c,0x64,0x80,0x79, 0x8b,0x8e,0x88,0x98,0x8b,0x85,0x96,0x87,0x81,0x95,0x7c,0x79,0x90,0x7b,0x79,0x90, 0x6b,0x68,0x80,0x58,0x57,0x78,0x4c,0x4d,0x73,0x4f,0x59,0x80,0x4f,0x4f,0x78,0x60, 0x6c,0x8f,0x73,0x7b,0x97,0x3c,0x2d,0x37,0x48,0x38,0x45,0x25,0x1c,0x25,0x22,0x19, 0x22,0x29,0x1f,0x28,0x51,0x4e,0x77,0x5c,0x52,0x79,0x64,0x4e,0x6c,0x52,0x50,0x7b, 0x52,0x52,0x7d,0x52,0x54,0x80,0x52,0x57,0x82,0x52,0x57,0x83,0x53,0x5f,0x89,0x52, 0x52,0x7c,0x52,0x5b,0x85,0xc9,0xce,0xdb,0xc6,0xc6,0xd1,0x31,0x24,0x2b,0x43,0x33, 0x3e,0x4b,0x3a,0x47,0x48,0x37,0x44,0x4c,0x3b,0x49,0x59,0x48,0x59,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x8e,0x97,0xae,0x6c,0x77,0x9c,0x52,0x5d, 0x88,0x6b,0x76,0x9b,0x5c,0x69,0x90,0x55,0x62,0x8b,0x54,0x5f,0x88,0x56,0x63,0x8a, 0x58,0x64,0x8b,0x58,0x64,0x8c,0x58,0x64,0x8c,0x5b,0x66,0x8d,0x5c,0x67,0x8f,0x5c, 0x69,0x8f,0x52,0x4f,0x7a,0x60,0x6c,0x92,0xc5,0xc9,0xd7,0x40,0x40,0x41,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x04,0x04,0x06,0x04,0x05,0x06,0x05, 0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x07,0x0a,0x06,0x07, 0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b, 0x08,0x09,0x0b,0x08,0x09,0x0b,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08, 0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09, 0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x0d,0x0e,0x11,0x12,0x12,0x16,0x15,0x14,0x1a, 0x17,0x16,0x1c,0x18,0x17,0x1d,0x1a,0x1a,0x20,0x1b,0x1a,0x21,0x1b,0x1a,0x21,0x1b, 0x1a,0x20,0x1b,0x1a,0x20,0x18,0x19,0x1f,0x16,0x16,0x1e,0x1f,0x1c,0x25,0x26,0x22, 0x2c,0x2a,0x26,0x31,0x27,0x24,0x30,0x34,0x37,0x42,0x3e,0x42,0x4c,0x47,0x4d,0x5e, 0x44,0x42,0x58,0x41,0x3b,0x50,0x37,0x35,0x46,0x30,0x2d,0x3b,0x5a,0x58,0x68,0x60, 0x6a,0x82,0x59,0x61,0x7c,0x4f,0x58,0x76,0x47,0x4c,0x65,0x3c,0x41,0x5a,0x4a,0x54, 0x72,0x64,0x6d,0x8c,0x6d,0x76,0x96,0x65,0x6f,0x90,0x5a,0x65,0x8b,0x51,0x5c,0x86, 0x51,0x4f,0x79,0x61,0x4b,0x66,0x5d,0x53,0x75,0x35,0x3b,0x54,0x0a,0x0c,0x0f,0x0a, 0x0b,0x0f,0x09,0x0a,0x0d,0x07,0x08,0x0b,0x44,0x42,0x4c,0x61,0x6d,0x8f,0x46,0x42, 0x5f,0x54,0x4b,0x6d,0x5d,0x52,0x77,0x5d,0x52,0x78,0x5f,0x52,0x76,0x60,0x53,0x77, 0x60,0x53,0x77,0x5f,0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x77,0x5f,0x54,0x77,0x5f, 0x54,0x76,0x5f,0x55,0x77,0x5e,0x56,0x77,0x51,0x51,0x70,0x1a,0x1b,0x21,0x1b,0x1d, 0x22,0x1b,0x1d,0x22,0x1a,0x1c,0x22,0x1a,0x1c,0x22,0x18,0x1a,0x1f,0x16,0x17,0x1c, 0x12,0x13,0x17,0x73,0x71,0x8c,0x59,0x57,0x81,0x46,0x3f,0x5b,0x51,0x48,0x69,0x5a, 0x52,0x77,0x59,0x52,0x77,0x55,0x51,0x77,0x53,0x4f,0x79,0x52,0x51,0x79,0x52,0x50, 0x7a,0x52,0x53,0x7c,0x52,0x55,0x7e,0x53,0x5c,0x84,0x52,0x5d,0x86,0x55,0x61,0x88, 0x57,0x63,0x89,0x5c,0x67,0x8c,0x60,0x6a,0x8e,0x64,0x6f,0x92,0x69,0x73,0x95,0x6f, 0x7a,0x99,0x74,0x7d,0x9c,0x7b,0x85,0xa0,0x80,0x88,0xa3,0x8b,0x93,0xaa,0x91,0x98, 0xaf,0x9e,0xa5,0xb8,0xa7,0xac,0xbd,0xad,0xb1,0xc1,0xae,0xb2,0xc1,0xac,0xb0,0xbf, 0xa8,0xac,0xbb,0x58,0x57,0x6b,0x40,0x41,0x56,0x40,0x40,0x57,0x25,0x27,0x32,0x17, 0x18,0x20,0x45,0x3d,0x4e,0x53,0x47,0x5a,0x48,0x3d,0x4e,0x34,0x2c,0x38,0x29,0x23, 0x2c,0x44,0x43,0x56,0x4c,0x55,0x79,0x57,0x4e,0x70,0x56,0x4e,0x70,0x59,0x4f,0x70, 0x59,0x4e,0x70,0x59,0x4f,0x71,0x58,0x4c,0x6f,0x4c,0x45,0x67,0x45,0x3d,0x5a,0x40, 0x38,0x54,0x3c,0x32,0x4e,0x38,0x31,0x49,0x37,0x33,0x4c,0x3d,0x39,0x54,0x4e,0x53, 0x71,0x8b,0x91,0xa6,0x81,0x86,0x9a,0x10,0x10,0x15,0x0c,0x0c,0x11,0x0c,0x0c,0x10, 0x0b,0x0b,0x0f,0x3c,0x31,0x3f,0x5a,0x49,0x5d,0x59,0x4a,0x5c,0x5e,0x52,0x65,0xc3, 0xc6,0xd0,0x53,0x5d,0x83,0x5e,0x4d,0x6c,0x59,0x44,0x5e,0x51,0x3c,0x54,0x52,0x3c, 0x55,0x52,0x3c,0x55,0x51,0x3d,0x54,0x4d,0x39,0x50,0x50,0x3a,0x53,0x58,0x43,0x5c, 0x60,0x52,0x74,0x48,0x51,0x6f,0x17,0x19,0x1f,0x0b,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a, 0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0b,0x0f,0x0b,0x0b,0x0f,0x0a,0x0b, 0x0f,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d, 0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x09,0x0c,0x09,0x09,0x0c,0x08, 0x09,0x0b,0x08,0x08,0x0b,0x07,0x08,0x0a,0x07,0x07,0x0a,0x06,0x07,0x0a,0x06,0x06, 0x09,0x06,0x06,0x09,0x06,0x06,0x07,0x05,0x06,0x07,0x04,0x05,0x06,0x04,0x04,0x06, 0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x02, 0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x88,0x92,0xaf,0x55,0x62,0x8a,0x57,0x50,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x55,0x7a,0x77,0x67,0x94, 0x0c,0x0a,0x0f,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,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,0x02,0x02,0x02,0x25,0x25,0x25,0x0e,0x0e, 0x0e,0x05,0x04,0x05,0x07,0x07,0x09,0x12,0x14,0x18,0x2c,0x2e,0x34,0x41,0x43,0x4a, 0x62,0x66,0x6d,0x75,0x77,0x7e,0x66,0x6a,0x72,0x6b,0x6e,0x73,0x66,0x6a,0x72,0x3f, 0x45,0x5b,0x46,0x44,0x5d,0x4a,0x49,0x63,0x4e,0x4c,0x66,0x56,0x4c,0x62,0x52,0x43, 0x54,0x3c,0x2f,0x3a,0x28,0x1e,0x26,0x26,0x1d,0x23,0x20,0x18,0x1d,0x16,0x11,0x14, 0x12,0x0e,0x11,0x0c,0x0a,0x0d,0x07,0x06,0x08,0x04,0x04,0x05,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,0x0a,0x08,0x0a,0x09,0x06,0x08,0x08,0x06,0x08,0x09,0x07,0x09,0x0b,0x09, 0x0a,0x12,0x0e,0x12,0x15,0x12,0x18,0x12,0x0e,0x12,0x12,0x0f,0x12,0x12,0x0f,0x12, 0x13,0x11,0x15,0x15,0x12,0x16,0x1a,0x17,0x1d,0x26,0x20,0x28,0x34,0x2c,0x38,0x42, 0x36,0x43,0x46,0x3a,0x48,0x47,0x3a,0x49,0x42,0x36,0x44,0x39,0x2f,0x3b,0x2b,0x25, 0x2f,0x1e,0x1b,0x24,0x23,0x1d,0x24,0x3c,0x37,0x45,0x51,0x51,0x75,0x5b,0x52,0x67, 0x60,0x55,0x69,0x73,0x6c,0x82,0x5c,0x57,0x73,0x53,0x49,0x67,0x5b,0x55,0x6f,0x52, 0x46,0x5f,0x4d,0x45,0x60,0x57,0x55,0x72,0x78,0x75,0x8d,0x78,0x72,0x86,0x84,0x7d, 0x90,0x81,0x7c,0x90,0x6e,0x68,0x81,0x5d,0x57,0x76,0x55,0x53,0x76,0x50,0x5a,0x80, 0x4f,0x51,0x78,0x53,0x60,0x87,0x83,0x8e,0xaa,0x47,0x3b,0x47,0x45,0x35,0x41,0x26, 0x1c,0x26,0x21,0x19,0x21,0x27,0x1e,0x27,0x51,0x4c,0x74,0x5a,0x52,0x79,0x64,0x4d, 0x6a,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x54,0x7e,0x52,0x57,0x82,0x52,0x5a,0x84, 0x53,0x5f,0x89,0x52,0x5d,0x86,0x52,0x50,0x7c,0xb2,0xb9,0xcc,0xdf,0xe1,0xe9,0x35, 0x2a,0x31,0x41,0x31,0x3d,0x49,0x38,0x45,0x49,0x38,0x45,0x49,0x38,0x46,0x64,0x51, 0x65,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,0x69,0x6d,0x78,0x8b, 0x94,0xb1,0x52,0x58,0x83,0x67,0x73,0x98,0x62,0x6d,0x94,0x56,0x63,0x8b,0x54,0x5f, 0x89,0x56,0x62,0x8a,0x56,0x63,0x8a,0x57,0x64,0x8b,0x5a,0x66,0x8d,0x5a,0x66,0x8d, 0x5b,0x67,0x8f,0x5c,0x67,0x8f,0x52,0x5d,0x87,0x52,0x56,0x80,0x91,0x9a,0xb4,0x94, 0x95,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x04,0x05, 0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x08,0x05,0x06,0x07,0x06, 0x06,0x08,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x0a,0x08,0x09,0x0b,0x07,0x08, 0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b, 0x08,0x09,0x0b,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x08,0x0a,0x08, 0x08,0x0a,0x08,0x09,0x0b,0x09,0x0a,0x0c,0x0a,0x0b,0x0e,0x0c,0x0d,0x10,0x0f,0x0f, 0x12,0x12,0x12,0x16,0x16,0x15,0x1a,0x18,0x17,0x1d,0x1a,0x19,0x1f,0x1a,0x1a,0x20, 0x1a,0x1a,0x20,0x1a,0x1a,0x1f,0x1a,0x1a,0x1f,0x19,0x19,0x1f,0x19,0x19,0x1f,0x14, 0x14,0x1a,0x16,0x15,0x1c,0x22,0x1e,0x27,0x2a,0x26,0x32,0x2a,0x2a,0x38,0x42,0x46, 0x54,0x48,0x4e,0x5e,0x47,0x4b,0x61,0x46,0x46,0x57,0x45,0x44,0x4f,0x34,0x34,0x3b, 0x63,0x65,0x6e,0x6a,0x71,0x87,0x59,0x61,0x7a,0x52,0x5c,0x77,0x49,0x53,0x70,0x40, 0x47,0x61,0x45,0x4b,0x67,0x4c,0x53,0x71,0x55,0x59,0x79,0x63,0x6c,0x8d,0x66,0x6e, 0x90,0x54,0x5e,0x85,0x50,0x4f,0x79,0x61,0x4b,0x68,0x5e,0x52,0x75,0x32,0x39,0x52, 0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0a,0x0a,0x0e,0x08,0x09,0x0b,0x44,0x40,0x4b,0x65, 0x6f,0x93,0x43,0x40,0x61,0x53,0x4a,0x6b,0x5c,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52, 0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x77, 0x5f,0x54,0x76,0x5f,0x55,0x76,0x5f,0x55,0x77,0x5e,0x57,0x77,0x52,0x51,0x72,0x1a, 0x1c,0x22,0x1b,0x1e,0x23,0x1c,0x1e,0x24,0x1b,0x1e,0x23,0x1a,0x1c,0x22,0x1a,0x1b, 0x21,0x16,0x18,0x1d,0x14,0x15,0x19,0x6d,0x6b,0x82,0x5b,0x59,0x85,0x4c,0x44,0x62, 0x4f,0x48,0x68,0x59,0x52,0x77,0x56,0x51,0x77,0x55,0x51,0x77,0x52,0x50,0x79,0x52, 0x50,0x79,0x52,0x51,0x7a,0x52,0x53,0x7a,0x53,0x58,0x80,0x52,0x5b,0x83,0x53,0x5e, 0x87,0x55,0x5f,0x87,0x59,0x64,0x8a,0x5b,0x68,0x8c,0x5f,0x6a,0x8e,0x63,0x6f,0x91, 0x6b,0x75,0x96,0x6e,0x79,0x98,0x73,0x7d,0x9b,0x7a,0x83,0xa0,0x80,0x89,0xa5,0x87, 0x8f,0xa7,0x8e,0x96,0xad,0x9a,0xa0,0xb5,0xa1,0xa8,0xb9,0xa7,0xaa,0xbd,0xa9,0xae, 0xbe,0xaa,0xad,0xbf,0xa6,0xab,0xbb,0x91,0x95,0xa6,0x4e,0x4d,0x61,0x40,0x41,0x57, 0x43,0x45,0x57,0x16,0x17,0x1f,0x1d,0x1c,0x26,0x4c,0x41,0x54,0x49,0x3e,0x4f,0x38, 0x2f,0x3c,0x29,0x23,0x2d,0x26,0x21,0x29,0x58,0x5d,0x77,0x4d,0x4c,0x72,0x56,0x4e, 0x70,0x57,0x4f,0x72,0x59,0x4f,0x70,0x59,0x4f,0x71,0x5a,0x50,0x71,0x51,0x4d,0x73, 0x4e,0x4a,0x70,0x4c,0x49,0x6d,0x48,0x43,0x65,0x42,0x3b,0x5a,0x3d,0x3b,0x55,0x4b, 0x4c,0x66,0x63,0x69,0x81,0x9c,0xa0,0xb0,0xa7,0xac,0xbc,0x58,0x5a,0x63,0x0c,0x0c, 0x10,0x0a,0x0a,0x0e,0x0b,0x0b,0x0f,0x39,0x2f,0x3c,0x57,0x47,0x59,0x55,0x44,0x56, 0x59,0x4d,0x60,0xc5,0xc8,0xd2,0x66,0x70,0x92,0x59,0x50,0x73,0x58,0x43,0x5c,0x51, 0x3d,0x54,0x4e,0x3a,0x50,0x4d,0x37,0x4f,0x4b,0x37,0x4d,0x49,0x35,0x4b,0x48,0x34, 0x4a,0x4c,0x38,0x4e,0x54,0x3f,0x59,0x60,0x4e,0x6b,0x52,0x50,0x79,0x1a,0x1b,0x28, 0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x0b,0x0b,0x0f,0x0b,0x0b,0x10,0x0b,0x0b,0x10,0x0c, 0x0c,0x10,0x0c,0x0c,0x10,0x0c,0x0c,0x10,0x0c,0x0c,0x10,0x0a,0x0b,0x0f,0x0a,0x0a, 0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d, 0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x09,0x0c,0x08,0x08,0x0b,0x07,0x07,0x0a,0x07, 0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06, 0x08,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x05, 0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x7f,0x84,0x94,0x60,0x6d,0x92,0x55,0x50,0x79,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x78,0x6d,0x5e,0x87,0x2d,0x26,0x37,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,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,0x02,0x02,0x02,0x26, 0x26,0x26,0x02,0x02,0x03,0x04,0x03,0x04,0x07,0x06,0x08,0x0e,0x0f,0x13,0x24,0x26, 0x2c,0x42,0x45,0x4a,0x5e,0x61,0x66,0x74,0x76,0x7c,0x74,0x77,0x7e,0x72,0x75,0x7b, 0x60,0x65,0x73,0x4f,0x56,0x6e,0x4a,0x4e,0x69,0x4f,0x48,0x60,0x52,0x47,0x59,0x48, 0x3a,0x49,0x2b,0x21,0x29,0x1e,0x16,0x1a,0x1c,0x14,0x18,0x1b,0x13,0x17,0x15,0x0e, 0x12,0x0f,0x0b,0x0e,0x0c,0x09,0x0b,0x0a,0x09,0x0b,0x06,0x06,0x07,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,0x04,0x03,0x04,0x07,0x06,0x07,0x06,0x06,0x06,0x07, 0x06,0x07,0x09,0x08,0x0a,0x23,0x24,0x27,0x33,0x33,0x35,0x35,0x35,0x38,0x23,0x22, 0x23,0x09,0x08,0x0a,0x09,0x09,0x0c,0x0c,0x0b,0x0f,0x12,0x11,0x16,0x20,0x1b,0x22, 0x32,0x2c,0x38,0x3e,0x33,0x40,0x46,0x3a,0x47,0x47,0x3a,0x4a,0x43,0x37,0x44,0x39, 0x2f,0x3b,0x2a,0x25,0x2e,0x1d,0x1a,0x22,0x22,0x1d,0x24,0x40,0x3c,0x4f,0x58,0x4a, 0x64,0x56,0x45,0x5c,0x71,0x69,0x7d,0x89,0x81,0x95,0x6d,0x67,0x80,0x53,0x4b,0x68, 0x54,0x4d,0x69,0x58,0x49,0x61,0x5a,0x4b,0x63,0x59,0x4d,0x69,0x59,0x51,0x6f,0x61, 0x5e,0x78,0x7f,0x7a,0x8e,0x81,0x7a,0x8e,0x77,0x71,0x87,0x6d,0x68,0x82,0x61,0x5e, 0x7e,0x51,0x56,0x7d,0x4f,0x55,0x7e,0x50,0x53,0x7d,0x75,0x80,0xa2,0x5d,0x57,0x66, 0x40,0x30,0x3b,0x24,0x1a,0x23,0x21,0x19,0x21,0x25,0x1d,0x25,0x50,0x4b,0x71,0x57, 0x50,0x79,0x64,0x4e,0x6d,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x56, 0x81,0x52,0x5a,0x84,0x53,0x5e,0x88,0x53,0x5e,0x88,0x57,0x50,0x79,0x8e,0x98,0xb3, 0xe8,0xe9,0xef,0x49,0x40,0x48,0x41,0x31,0x3c,0x49,0x38,0x46,0x4c,0x3b,0x48,0x49, 0x38,0x46,0x60,0x4c,0x5f,0x0b,0x0b,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x2e,0x30,0x33,0x8e,0x98,0xb4,0x5c,0x67,0x90,0x5b,0x66,0x8e,0x65,0x72,0x98,0x58, 0x64,0x8d,0x55,0x60,0x8a,0x55,0x60,0x89,0x55,0x62,0x8a,0x58,0x64,0x8b,0x58,0x64, 0x8c,0x58,0x64,0x8c,0x5b,0x66,0x8d,0x5c,0x67,0x8f,0x57,0x64,0x8b,0x52,0x4f,0x7a, 0x6b,0x77,0x9a,0xc9,0xcd,0xd7,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07, 0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x07, 0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09, 0x0b,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x08,0x0a,0x08,0x09,0x0b,0x09,0x0a,0x0c, 0x08,0x09,0x0a,0x08,0x09,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x0b,0x0c,0x0f,0x0e, 0x0f,0x12,0x10,0x11,0x14,0x0f,0x11,0x14,0x12,0x11,0x16,0x16,0x16,0x1b,0x18,0x18, 0x1d,0x19,0x18,0x1e,0x19,0x19,0x1e,0x19,0x18,0x1e,0x19,0x19,0x1e,0x1b,0x1b,0x22, 0x1c,0x1c,0x22,0x1a,0x19,0x1f,0x15,0x15,0x1a,0x17,0x16,0x1e,0x26,0x26,0x33,0x30, 0x2e,0x40,0x4c,0x51,0x61,0x62,0x67,0x74,0x53,0x57,0x66,0x50,0x50,0x5d,0x45,0x44, 0x4c,0x3a,0x37,0x3d,0x67,0x68,0x70,0x6f,0x76,0x8b,0x56,0x5f,0x7b,0x4d,0x57,0x75, 0x4b,0x55,0x75,0x4a,0x53,0x73,0x46,0x4e,0x6a,0x43,0x4b,0x66,0x3c,0x41,0x5a,0x47, 0x4c,0x69,0x4c,0x54,0x75,0x4a,0x53,0x77,0x4c,0x4a,0x73,0x60,0x4e,0x6c,0x5b,0x52, 0x77,0x33,0x37,0x4f,0x0b,0x0c,0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0d,0x07,0x08,0x0a, 0x41,0x3e,0x48,0x68,0x74,0x96,0x45,0x40,0x61,0x50,0x46,0x67,0x5d,0x52,0x77,0x5d, 0x52,0x78,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x54,0x78,0x5f,0x53,0x77,0x60,0x53, 0x77,0x5f,0x53,0x77,0x5f,0x53,0x76,0x5f,0x55,0x76,0x5f,0x55,0x77,0x5e,0x56,0x77, 0x52,0x51,0x72,0x1b,0x1d,0x22,0x1b,0x1e,0x23,0x1c,0x1e,0x24,0x1c,0x1e,0x24,0x1b, 0x1d,0x22,0x1a,0x1b,0x21,0x18,0x1a,0x1e,0x15,0x16,0x1a,0x66,0x64,0x78,0x5c,0x5b, 0x87,0x4c,0x45,0x63,0x4d,0x48,0x67,0x59,0x51,0x77,0x56,0x50,0x77,0x55,0x51,0x77, 0x52,0x50,0x78,0x52,0x50,0x78,0x52,0x51,0x7a,0x52,0x53,0x7a,0x53,0x57,0x7f,0x52, 0x5d,0x84,0x53,0x5d,0x86,0x56,0x61,0x88,0x5a,0x64,0x8a,0x5a,0x67,0x8b,0x61,0x6b, 0x8f,0x65,0x6f,0x92,0x68,0x73,0x94,0x6d,0x78,0x98,0x72,0x7d,0x9b,0x78,0x83,0x9f, 0x7f,0x87,0xa2,0x86,0x8e,0xa6,0x8c,0x93,0xab,0x90,0x98,0xaf,0x9d,0xa4,0xb6,0xa3, 0xa8,0xbb,0xa5,0xaa,0xbd,0xa5,0xab,0xbc,0xa4,0xa9,0xba,0xa1,0xa4,0xb7,0x9a,0x9f, 0xb2,0x50,0x51,0x66,0x46,0x47,0x5c,0x26,0x27,0x30,0x16,0x17,0x20,0x16,0x17,0x1f, 0x27,0x24,0x2f,0x3d,0x35,0x43,0x2e,0x27,0x31,0x26,0x20,0x29,0x2c,0x26,0x30,0x58, 0x61,0x81,0x51,0x4c,0x70,0x57,0x4f,0x71,0x57,0x4f,0x72,0x5a,0x4f,0x70,0x59,0x4f, 0x71,0x54,0x4e,0x72,0x4d,0x4b,0x72,0x4e,0x4c,0x73,0x4d,0x52,0x78,0x59,0x62,0x85, 0x83,0x88,0x9f,0x8a,0x8e,0xa2,0x88,0x8d,0xa0,0xa5,0xa8,0xb7,0xae,0xb3,0xc0,0xa8, 0xad,0xbb,0x1e,0x1e,0x23,0x0a,0x0a,0x0e,0x0b,0x0b,0x0f,0x2f,0x27,0x32,0x52,0x42, 0x55,0x4e,0x3f,0x50,0x51,0x45,0x57,0x96,0x9d,0xb2,0x59,0x64,0x89,0x50,0x50,0x78, 0x5f,0x50,0x6d,0x52,0x3c,0x54,0x50,0x3b,0x52,0x4b,0x36,0x4e,0x4a,0x35,0x4c,0x48, 0x33,0x49,0x44,0x32,0x46,0x45,0x32,0x48,0x4a,0x36,0x4c,0x52,0x3d,0x55,0x5b,0x45, 0x60,0x67,0x57,0x78,0x2c,0x27,0x36,0x0b,0x0b,0x10,0x0b,0x0b,0x0f,0x0c,0x0c,0x10, 0x0c,0x0c,0x10,0x0c,0x0c,0x11,0x0c,0x0c,0x11,0x0c,0x0c,0x11,0x0c,0x0d,0x11,0x0c, 0x0c,0x11,0x0b,0x0c,0x10,0x0b,0x0b,0x0f,0x0b,0x0b,0x0f,0x0b,0x0b,0x0f,0x0b,0x0b, 0x0f,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x09,0x0c, 0x09,0x09,0x0c,0x08,0x09,0x0b,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06, 0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x04, 0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x4e,0x50,0x55,0x76,0x80,0xa2,0x52,0x4f, 0x7a,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x67,0x59,0x7f,0x5d,0x50,0x74,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,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, 0x04,0x03,0x04,0x26,0x26,0x26,0x02,0x02,0x02,0x04,0x03,0x04,0x06,0x05,0x06,0x0a, 0x0b,0x0e,0x21,0x22,0x27,0x47,0x49,0x4e,0x69,0x6a,0x6d,0x73,0x75,0x79,0x7c,0x7e, 0x83,0x71,0x73,0x7c,0x63,0x6a,0x7a,0x4e,0x55,0x6e,0x47,0x46,0x61,0x4b,0x3f,0x50, 0x3e,0x32,0x3e,0x2c,0x22,0x2a,0x1e,0x16,0x1b,0x1a,0x14,0x18,0x1a,0x14,0x18,0x19, 0x12,0x16,0x16,0x11,0x15,0x0e,0x0a,0x0d,0x10,0x0d,0x10,0x09,0x08,0x0a,0x05,0x04, 0x06,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,0x09,0x0a,0x0c,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,0x03,0x03,0x03, 0x04,0x03,0x04,0x04,0x03,0x04,0x0e,0x0e,0x0f,0x35,0x35,0x36,0x06,0x06,0x07,0x10, 0x10,0x12,0x31,0x32,0x33,0x13,0x14,0x14,0x08,0x08,0x0b,0x09,0x09,0x0c,0x0e,0x0d, 0x12,0x1b,0x18,0x1e,0x2d,0x27,0x33,0x3a,0x2f,0x3b,0x42,0x36,0x44,0x44,0x37,0x46, 0x40,0x35,0x42,0x37,0x2e,0x3a,0x2a,0x24,0x2e,0x1f,0x1b,0x24,0x28,0x22,0x2b,0x3a, 0x37,0x4d,0x3d,0x30,0x3f,0x57,0x44,0x5a,0x6f,0x68,0x7d,0x85,0x7e,0x91,0x7b,0x74, 0x8a,0x53,0x4c,0x68,0x58,0x4b,0x67,0x5e,0x50,0x6c,0x5a,0x4a,0x62,0x52,0x43,0x5a, 0x52,0x45,0x5c,0x5e,0x51,0x6b,0x58,0x51,0x6f,0x59,0x55,0x73,0x66,0x61,0x7c,0x5d, 0x57,0x74,0x4e,0x4a,0x6c,0x4c,0x4d,0x73,0x50,0x5a,0x82,0x50,0x4e,0x78,0x6b,0x77, 0x99,0x6b,0x6c,0x81,0x39,0x2c,0x35,0x23,0x1a,0x23,0x21,0x19,0x21,0x24,0x1a,0x23, 0x4f,0x4c,0x6f,0x56,0x50,0x79,0x64,0x4e,0x6c,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52, 0x55,0x80,0x52,0x57,0x83,0x52,0x5a,0x84,0x53,0x5e,0x89,0x56,0x63,0x8b,0x5d,0x52, 0x79,0x6f,0x7b,0x9f,0xf8,0xf8,0xfa,0x61,0x5b,0x63,0x3f,0x30,0x3b,0x4b,0x3a,0x48, 0x4b,0x3a,0x47,0x4b,0x3a,0x47,0x59,0x47,0x57,0x1c,0x19,0x1f,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,0x91,0x98,0xac,0x71,0x7d,0xa0,0x52,0x57,0x82, 0x69,0x74,0x99,0x5a,0x66,0x8e,0x56,0x62,0x8b,0x55,0x60,0x8a,0x55,0x60,0x89,0x56, 0x62,0x8a,0x56,0x62,0x8a,0x58,0x64,0x8c,0x5a,0x66,0x8d,0x5a,0x66,0x8d,0x5b,0x66, 0x8d,0x52,0x50,0x7c,0x54,0x60,0x89,0x97,0xa0,0xb9,0x61,0x62,0x64,0x00,0x00,0x00, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x05,0x04,0x04,0x06,0x04,0x05, 0x06,0x05,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x06,0x09, 0x06,0x07,0x09,0x06,0x07,0x09,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07, 0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09, 0x0b,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x0d, 0x0d,0x0e,0x10,0x0e,0x0f,0x12,0x0f,0x10,0x13,0x0e,0x10,0x13,0x0e,0x0e,0x11,0x11, 0x10,0x14,0x15,0x14,0x1a,0x18,0x17,0x1d,0x18,0x16,0x1d,0x18,0x17,0x1d,0x19,0x18, 0x1e,0x1c,0x1b,0x22,0x21,0x21,0x2a,0x1d,0x1d,0x23,0x1a,0x1a,0x1f,0x17,0x18,0x1d, 0x1d,0x1f,0x28,0x2b,0x2a,0x3a,0x32,0x33,0x46,0x50,0x56,0x65,0x65,0x68,0x75,0x63, 0x63,0x70,0x4b,0x4a,0x53,0x3b,0x39,0x40,0x6b,0x6b,0x74,0x75,0x7e,0x94,0x5d,0x67, 0x84,0x53,0x5d,0x7d,0x4f,0x5a,0x7b,0x50,0x5a,0x7c,0x4f,0x59,0x7b,0x4b,0x54,0x75, 0x43,0x4b,0x68,0x43,0x4a,0x67,0x46,0x4d,0x6d,0x45,0x4d,0x6e,0x46,0x47,0x6a,0x5a, 0x4a,0x66,0x5a,0x50,0x75,0x33,0x36,0x4f,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a, 0x0d,0x07,0x08,0x0a,0x3e,0x39,0x46,0x70,0x7b,0x9d,0x45,0x41,0x61,0x4f,0x46,0x65, 0x5d,0x52,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x5f, 0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x55, 0x77,0x5e,0x56,0x77,0x53,0x51,0x72,0x1a,0x1c,0x22,0x1b,0x1d,0x22,0x1c,0x1e,0x24, 0x1c,0x1e,0x24,0x1a,0x1d,0x22,0x19,0x1b,0x20,0x18,0x1a,0x1e,0x15,0x16,0x1b,0x5e, 0x59,0x6a,0x5d,0x5e,0x89,0x4c,0x47,0x65,0x4e,0x47,0x65,0x5a,0x52,0x77,0x58,0x52, 0x77,0x55,0x51,0x77,0x52,0x50,0x78,0x52,0x50,0x78,0x52,0x50,0x79,0x52,0x54,0x7b, 0x53,0x56,0x7e,0x52,0x5d,0x86,0x54,0x5e,0x86,0x56,0x61,0x89,0x57,0x62,0x8a,0x5b, 0x68,0x8c,0x62,0x6d,0x90,0x67,0x71,0x94,0x68,0x73,0x94,0x6d,0x78,0x98,0x72,0x7d, 0x9b,0x7a,0x84,0x9f,0x7d,0x86,0xa1,0x80,0x89,0xa3,0x86,0x8e,0xa7,0x8e,0x96,0xac, 0x94,0x9b,0xb0,0x9b,0xa2,0xb6,0x9e,0xa4,0xb8,0xa3,0xa8,0xbb,0xa2,0xa8,0xb9,0x9e, 0xa3,0xb5,0x96,0x9c,0xb0,0x95,0x99,0xad,0x60,0x62,0x78,0x55,0x56,0x66,0x16,0x17, 0x1f,0x16,0x17,0x1f,0x16,0x16,0x1e,0x20,0x1e,0x28,0x32,0x2c,0x38,0x2a,0x24,0x2e, 0x2a,0x24,0x2d,0x6a,0x67,0x74,0x50,0x58,0x7d,0x56,0x4e,0x72,0x57,0x4f,0x72,0x56, 0x4e,0x72,0x56,0x4e,0x72,0x52,0x4c,0x72,0x4e,0x4c,0x75,0x53,0x5e,0x83,0x87,0x90, 0xaa,0xa2,0xa8,0xbb,0xaf,0xb3,0xc3,0xa3,0xa8,0xba,0x92,0x97,0xad,0x96,0x9d,0xb0, 0xa5,0xa9,0xb9,0x9f,0xa4,0xb8,0x80,0x82,0x8a,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x20, 0x1c,0x23,0x4d,0x3e,0x4f,0x48,0x39,0x49,0x4a,0x3e,0x50,0x78,0x81,0x9e,0x54,0x5e, 0x85,0x4f,0x4e,0x75,0x58,0x4f,0x73,0x5f,0x50,0x70,0x54,0x3e,0x57,0x4c,0x36,0x4e, 0x4a,0x36,0x4c,0x46,0x32,0x48,0x45,0x32,0x47,0x43,0x30,0x45,0x42,0x30,0x43,0x45, 0x32,0x47,0x4e,0x3a,0x53,0x5a,0x46,0x61,0x6c,0x56,0x74,0x1c,0x1c,0x28,0x0c,0x0c, 0x10,0x0d,0x0d,0x12,0x0d,0x0d,0x12,0x0c,0x0c,0x11,0x0d,0x0d,0x12,0x0d,0x0e,0x12, 0x0d,0x0e,0x12,0x0d,0x0d,0x12,0x0d,0x0d,0x12,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0c, 0x0d,0x11,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0a,0x0b,0x0e,0x0a,0x0a, 0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x09,0x0c,0x08,0x09,0x0b,0x08,0x08,0x0b, 0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x05, 0x06,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03, 0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x35,0x35,0x39,0x8a, 0x94,0xb1,0x52,0x53,0x7d,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x55,0x7a,0x76,0x66,0x94,0x02, 0x02,0x02,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,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,0x0a,0x09,0x0a,0x2b,0x2b,0x2b,0x1c,0x1c,0x1c,0x02,0x02,0x02,0x04,0x03,0x04, 0x05,0x04,0x05,0x09,0x0a,0x0d,0x22,0x24,0x28,0x52,0x54,0x57,0x72,0x72,0x75,0x75, 0x76,0x7a,0x6a,0x6e,0x75,0x63,0x68,0x75,0x4e,0x56,0x6b,0x48,0x46,0x60,0x4a,0x43, 0x59,0x44,0x3a,0x48,0x46,0x3a,0x48,0x44,0x38,0x46,0x3d,0x34,0x42,0x36,0x2e,0x3a, 0x34,0x2a,0x36,0x30,0x27,0x32,0x1b,0x16,0x1a,0x12,0x0e,0x12,0x0c,0x0b,0x0e,0x08, 0x07,0x09,0x06,0x05,0x06,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,0x06,0x05,0x07,0x1e,0x1a,0x26,0x34, 0x32,0x4c,0x4e,0x59,0x7e,0xc0,0xc6,0xd5,0x7d,0x7e,0x82,0x05,0x05,0x05,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,0x02,0x02, 0x02,0x0e,0x0e,0x0e,0x0c,0x0c,0x0d,0x07,0x07,0x07,0x0c,0x0c,0x0d,0x0a,0x0a,0x0a, 0x02,0x02,0x03,0x09,0x0a,0x0a,0x1d,0x1e,0x1e,0x2c,0x2c,0x2c,0x33,0x33,0x33,0x2f, 0x30,0x31,0x38,0x39,0x3b,0x46,0x47,0x4d,0x32,0x2f,0x37,0x49,0x42,0x4c,0x4a,0x41, 0x4c,0x3c,0x31,0x3e,0x3a,0x2f,0x3b,0x32,0x2a,0x36,0x29,0x23,0x2d,0x21,0x1d,0x24, 0x3a,0x37,0x44,0x38,0x32,0x49,0x40,0x31,0x41,0x51,0x45,0x5f,0x70,0x6a,0x81,0x72, 0x6b,0x81,0x70,0x66,0x7d,0x64,0x5a,0x74,0x63,0x5c,0x77,0x5b,0x51,0x6f,0x5e,0x4f, 0x69,0x56,0x47,0x60,0x51,0x42,0x5a,0x48,0x3a,0x4d,0x52,0x42,0x57,0x42,0x34,0x46, 0x51,0x41,0x58,0x48,0x3a,0x50,0x40,0x36,0x4f,0x45,0x41,0x65,0x50,0x5a,0x7f,0x54, 0x51,0x79,0x5e,0x6a,0x8f,0x73,0x7a,0x97,0x3b,0x2c,0x37,0x24,0x1b,0x24,0x21,0x19, 0x21,0x22,0x19,0x21,0x4f,0x4a,0x6d,0x57,0x50,0x79,0x62,0x4a,0x66,0x52,0x52,0x7c, 0x52,0x52,0x7c,0x52,0x53,0x7e,0x52,0x56,0x81,0x52,0x55,0x81,0x53,0x5e,0x88,0x5a, 0x65,0x8d,0x57,0x50,0x79,0x57,0x63,0x8c,0xf0,0xf1,0xf5,0x78,0x74,0x7d,0x3c,0x2d, 0x37,0x4c,0x3b,0x49,0x4b,0x3a,0x47,0x4b,0x3a,0x47,0x56,0x43,0x53,0x2b,0x23,0x2c, 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,0x5f,0x62,0x6c,0x93,0x9d, 0xb8,0x54,0x5f,0x89,0x62,0x6e,0x94,0x5e,0x6a,0x92,0x55,0x60,0x8a,0x53,0x5f,0x89, 0x55,0x60,0x8a,0x55,0x60,0x89,0x57,0x64,0x8b,0x57,0x64,0x8b,0x58,0x64,0x8c,0x58, 0x65,0x8c,0x5b,0x66,0x8d,0x55,0x60,0x89,0x52,0x4f,0x7a,0x71,0x7c,0x9e,0xab,0xae, 0xb6,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x05,0x03, 0x03,0x05,0x04,0x04,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06, 0x09,0x06,0x06,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x09, 0x07,0x07,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0a,0x09, 0x0a,0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x09,0x0a,0x0c,0x09,0x0a, 0x0c,0x0a,0x0a,0x0d,0x0b,0x0c,0x0f,0x0d,0x0e,0x10,0x0e,0x0e,0x12,0x0e,0x0e,0x11, 0x0e,0x0e,0x11,0x0e,0x0e,0x11,0x0f,0x0f,0x13,0x14,0x13,0x18,0x17,0x17,0x1c,0x18, 0x17,0x1d,0x19,0x18,0x1e,0x1c,0x1c,0x23,0x21,0x21,0x2a,0x1e,0x1f,0x26,0x1b,0x1b, 0x21,0x1b,0x1b,0x20,0x1b,0x1c,0x23,0x1f,0x21,0x2b,0x27,0x2a,0x39,0x34,0x39,0x48, 0x55,0x58,0x65,0x6f,0x6f,0x79,0x52,0x50,0x58,0x40,0x3e,0x45,0x6e,0x6f,0x76,0x79, 0x81,0x9a,0x61,0x6b,0x89,0x57,0x61,0x83,0x53,0x5f,0x82,0x54,0x5f,0x83,0x53,0x5e, 0x80,0x50,0x59,0x7d,0x4e,0x58,0x7b,0x4e,0x57,0x79,0x49,0x52,0x75,0x48,0x52,0x76, 0x48,0x48,0x6c,0x56,0x48,0x63,0x55,0x4e,0x72,0x31,0x34,0x4c,0x0a,0x0c,0x0f,0x0a, 0x0b,0x0e,0x09,0x0a,0x0c,0x07,0x08,0x0a,0x3a,0x36,0x40,0x83,0x8d,0xa9,0x44,0x42, 0x63,0x4d,0x44,0x63,0x5d,0x52,0x77,0x5d,0x52,0x78,0x5f,0x52,0x76,0x60,0x53,0x77, 0x60,0x54,0x78,0x5f,0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f, 0x54,0x76,0x5f,0x55,0x77,0x5e,0x56,0x77,0x54,0x52,0x74,0x1a,0x1c,0x22,0x1b,0x1d, 0x22,0x1b,0x1d,0x22,0x1c,0x1e,0x24,0x1a,0x1c,0x22,0x19,0x1b,0x20,0x17,0x19,0x1e, 0x15,0x16,0x1b,0x53,0x4d,0x5c,0x5f,0x62,0x8e,0x4f,0x47,0x66,0x4d,0x47,0x64,0x5a, 0x52,0x76,0x57,0x50,0x77,0x54,0x51,0x77,0x52,0x50,0x78,0x52,0x50,0x78,0x52,0x50, 0x79,0x52,0x53,0x7a,0x52,0x57,0x7f,0x52,0x5d,0x84,0x54,0x5e,0x87,0x56,0x61,0x89, 0x5a,0x64,0x8b,0x5c,0x68,0x8d,0x62,0x6e,0x90,0x66,0x70,0x92,0x69,0x75,0x96,0x6e, 0x79,0x98,0x71,0x7b,0x9a,0x77,0x82,0x9e,0x7d,0x86,0xa1,0x80,0x8a,0xa4,0x83,0x8c, 0xa5,0x8e,0x95,0xad,0x9f,0xa5,0xb8,0xad,0xb3,0xc2,0xb3,0xb6,0xc4,0xb8,0xbb,0xc7, 0xb7,0xba,0xc6,0xb2,0xb5,0xc4,0xac,0xb0,0xbf,0xab,0xae,0xbc,0xb2,0xb4,0xc0,0x8a, 0x8d,0x99,0x16,0x18,0x20,0x16,0x17,0x1f,0x16,0x17,0x1f,0x16,0x16,0x1e,0x26,0x23, 0x2d,0x2e,0x27,0x32,0x2c,0x26,0x30,0x30,0x28,0x33,0x72,0x76,0x8d,0x4e,0x4c,0x73, 0x50,0x4d,0x71,0x4f,0x4c,0x73,0x4d,0x4d,0x74,0x4e,0x57,0x7f,0x69,0x72,0x95,0x9e, 0xa4,0xb9,0xa8,0xae,0xbf,0xa9,0xaf,0xc0,0xa9,0xae,0xbf,0x9f,0xa4,0xb7,0x97,0x9d, 0xb2,0x90,0x96,0xac,0x84,0x8a,0xa2,0x81,0x87,0xa1,0xa3,0xa9,0xba,0x37,0x37,0x3b, 0x0a,0x0a,0x0e,0x0e,0x0d,0x10,0x48,0x39,0x48,0x42,0x35,0x42,0x46,0x3b,0x4b,0x6f, 0x79,0x99,0x54,0x5f,0x85,0x4f,0x4c,0x74,0x59,0x50,0x73,0x5c,0x50,0x72,0x60,0x51, 0x72,0x58,0x43,0x5d,0x4a,0x35,0x4b,0x48,0x33,0x48,0x45,0x31,0x46,0x43,0x2f,0x44, 0x42,0x2e,0x41,0x3f,0x2d,0x40,0x46,0x33,0x48,0x54,0x40,0x58,0x61,0x4b,0x69,0x3b, 0x3f,0x5b,0x0c,0x0c,0x11,0x0d,0x0d,0x12,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0e,0x0e, 0x12,0x0e,0x0e,0x13,0x0e,0x0e,0x13,0x0e,0x0e,0x13,0x0e,0x0e,0x13,0x0e,0x0e,0x12, 0x0d,0x0e,0x12,0x0d,0x0e,0x12,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0c, 0x0c,0x11,0x0a,0x0b,0x0f,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x0a, 0x0d,0x09,0x09,0x0c,0x08,0x09,0x0c,0x07,0x08,0x0b,0x06,0x07,0x0a,0x06,0x06,0x09, 0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x03, 0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x0b,0x0c,0x0c,0xa6,0xae,0xc4,0x53,0x5e,0x88,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x6b,0x5c,0x85,0x18,0x15,0x1e,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,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,0x1d,0x1d,0x1d,0x13,0x13,0x13,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x03,0x04,0x03,0x05,0x0a,0x0b,0x0e,0x1b,0x1c,0x20,0x3a,0x3b,0x3f, 0x60,0x62,0x65,0x66,0x69,0x6e,0x5e,0x61,0x6a,0x41,0x46,0x59,0x40,0x3e,0x56,0x4b, 0x42,0x56,0x45,0x3c,0x4e,0x33,0x32,0x45,0x41,0x47,0x59,0x35,0x36,0x4a,0x29,0x2d, 0x3b,0x28,0x2b,0x39,0x2b,0x2f,0x3e,0x2a,0x2a,0x39,0x22,0x1e,0x25,0x0c,0x0a,0x0c, 0x0a,0x09,0x0b,0x08,0x07,0x09,0x06,0x06,0x07,0x02,0x02,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x09,0x07,0x0a,0x2d,0x22,0x2f,0x48,0x37,0x4b,0x63,0x52,0x73, 0x5e,0x53,0x79,0x53,0x53,0x7d,0x5b,0x67,0x90,0xcf,0xd2,0xdf,0xe7,0xe8,0xef,0xb5, 0xb8,0xc0,0x2d,0x2f,0x32,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,0x0a,0x0a,0x0b,0x08,0x08, 0x09,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05, 0x0c,0x0c,0x0d,0x23,0x23,0x24,0x33,0x33,0x36,0x33,0x34,0x38,0x2f,0x2c,0x32,0x2a, 0x26,0x2d,0x2a,0x24,0x2e,0x2f,0x27,0x32,0x2f,0x28,0x32,0x2d,0x26,0x31,0x27,0x22, 0x2c,0x26,0x20,0x28,0x52,0x4f,0x66,0x3a,0x34,0x4b,0x37,0x29,0x38,0x50,0x40,0x55, 0x50,0x4e,0x6a,0x61,0x5d,0x78,0x74,0x6b,0x81,0x71,0x67,0x7e,0x84,0x7c,0x91,0x71, 0x6a,0x83,0x56,0x4b,0x69,0x53,0x49,0x64,0x52,0x46,0x5f,0x57,0x48,0x5f,0x39,0x2c, 0x3d,0x33,0x28,0x37,0x37,0x2c,0x3c,0x3a,0x2e,0x3f,0x39,0x30,0x43,0x3c,0x38,0x55, 0x4d,0x51,0x78,0x5c,0x5c,0x82,0x63,0x6f,0x91,0x78,0x83,0xa3,0x44,0x37,0x44,0x25, 0x1c,0x25,0x21,0x19,0x21,0x22,0x18,0x21,0x4e,0x4a,0x6c,0x58,0x50,0x79,0x64,0x4e, 0x6c,0x52,0x52,0x7c,0x52,0x53,0x7e,0x52,0x54,0x7e,0x52,0x56,0x81,0x52,0x5a,0x84, 0x53,0x5e,0x89,0x5a,0x65,0x8d,0x54,0x50,0x79,0x52,0x5c,0x86,0xdb,0xdf,0xe8,0x90, 0x8f,0x99,0x39,0x2b,0x34,0x4a,0x39,0x47,0x4c,0x3b,0x48,0x4b,0x3a,0x47,0x50,0x3e, 0x4d,0x36,0x2c,0x37,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,0x21, 0x22,0x25,0xa1,0xa9,0xc1,0x5f,0x6c,0x93,0x54,0x5f,0x89,0x60,0x6d,0x94,0x56,0x63, 0x8b,0x54,0x5f,0x89,0x54,0x5f,0x89,0x56,0x62,0x8b,0x56,0x63,0x8a,0x57,0x63,0x8b, 0x58,0x64,0x8b,0x58,0x65,0x8c,0x5b,0x67,0x8f,0x57,0x64,0x8b,0x52,0x4f,0x7a,0x57, 0x63,0x8a,0xaf,0xb6,0xca,0x31,0x32,0x32,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x05,0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x06,0x07,0x06, 0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x09,0x07,0x07,0x0a,0x06,0x07, 0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x07,0x08,0x0a,0x07,0x08,0x0a, 0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08, 0x09,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d, 0x10,0x0b,0x0d,0x0f,0x0c,0x0d,0x10,0x0d,0x0e,0x10,0x0d,0x0e,0x10,0x0f,0x10,0x13, 0x13,0x13,0x17,0x17,0x17,0x1c,0x19,0x18,0x1e,0x1b,0x1a,0x20,0x1d,0x1d,0x23,0x1e, 0x1e,0x26,0x1e,0x1f,0x27,0x1d,0x1d,0x23,0x1c,0x1b,0x21,0x1c,0x1d,0x23,0x24,0x27, 0x30,0x2a,0x2e,0x3a,0x35,0x39,0x44,0x52,0x50,0x5c,0x5a,0x59,0x62,0x4b,0x48,0x50, 0x72,0x71,0x7a,0x7a,0x83,0x9a,0x60,0x69,0x89,0x56,0x60,0x84,0x57,0x61,0x85,0x57, 0x62,0x87,0x56,0x62,0x86,0x54,0x5f,0x83,0x52,0x5c,0x81,0x50,0x59,0x7d,0x4c,0x57, 0x7b,0x49,0x53,0x7a,0x4c,0x4d,0x74,0x5c,0x4a,0x67,0x50,0x4a,0x6b,0x2d,0x32,0x48, 0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x37,0x32,0x3c,0x8c, 0x94,0xaf,0x44,0x43,0x67,0x4c,0x42,0x61,0x5d,0x53,0x78,0x5d,0x53,0x78,0x5f,0x52, 0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x76, 0x5f,0x53,0x76,0x5f,0x55,0x77,0x5f,0x55,0x77,0x5e,0x56,0x76,0x56,0x52,0x73,0x1a, 0x1c,0x22,0x1b,0x1d,0x22,0x1b,0x1d,0x22,0x1b,0x1e,0x23,0x1a,0x1c,0x22,0x18,0x1a, 0x1f,0x17,0x1a,0x1e,0x15,0x16,0x1b,0x4a,0x44,0x50,0x65,0x6b,0x9d,0x4d,0x48,0x67, 0x4e,0x46,0x63,0x59,0x52,0x76,0x56,0x50,0x77,0x53,0x51,0x77,0x53,0x4f,0x78,0x52, 0x4f,0x78,0x52,0x50,0x79,0x52,0x53,0x7b,0x53,0x57,0x80,0x52,0x5d,0x84,0x53,0x5d, 0x86,0x56,0x61,0x89,0x5a,0x65,0x8b,0x5d,0x69,0x8e,0x61,0x6c,0x8f,0x66,0x70,0x93, 0x6b,0x76,0x96,0x6e,0x79,0x98,0x71,0x7b,0x9a,0x75,0x7f,0x9c,0x7a,0x84,0x9f,0x7e, 0x87,0xa2,0x81,0x8b,0xa4,0x8b,0x91,0xa4,0x9d,0x9c,0xa8,0x99,0x97,0xa1,0x95,0x91, 0x9b,0x8d,0x88,0x93,0x84,0x7d,0x8b,0x81,0x7a,0x88,0x8a,0x84,0x92,0x87,0x81,0x8f, 0x7f,0x77,0x87,0x1f,0x21,0x29,0x16,0x17,0x1f,0x16,0x17,0x1f,0x16,0x16,0x1e,0x16, 0x16,0x1e,0x15,0x16,0x1e,0x30,0x29,0x35,0x30,0x29,0x34,0x31,0x29,0x33,0x5c,0x57, 0x61,0x5b,0x66,0x87,0x4e,0x50,0x77,0x55,0x5f,0x85,0x71,0x7b,0x9a,0xb0,0xb5,0xc5, 0xaf,0xb4,0xc3,0xb2,0xb7,0xc6,0xb0,0xb5,0xc6,0xae,0xb2,0xc3,0xa1,0xa7,0xba,0x8f, 0x98,0xb0,0x7e,0x85,0xa2,0x62,0x69,0x8b,0x4a,0x53,0x75,0x45,0x4f,0x71,0x5f,0x67, 0x89,0x4b,0x4f,0x5e,0x0a,0x0a,0x0d,0x09,0x09,0x0c,0x42,0x35,0x42,0x3e,0x31,0x3c, 0x42,0x39,0x48,0x6b,0x74,0x96,0x54,0x5e,0x85,0x50,0x4d,0x75,0x5c,0x51,0x73,0x5c, 0x51,0x73,0x5c,0x50,0x73,0x5d,0x50,0x73,0x5f,0x48,0x62,0x4c,0x36,0x4c,0x46,0x32, 0x46,0x43,0x30,0x45,0x41,0x2e,0x40,0x40,0x2d,0x41,0x40,0x2e,0x42,0x4d,0x3a,0x51, 0x5f,0x53,0x75,0x3f,0x42,0x5e,0x0d,0x0d,0x12,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0e, 0x0e,0x14,0x0e,0x0f,0x14,0x0e,0x0e,0x14,0x0f,0x10,0x16,0x0f,0x0f,0x15,0x0f,0x10, 0x16,0x0e,0x0f,0x15,0x0e,0x0f,0x14,0x0e,0x0e,0x14,0x0e,0x0e,0x13,0x0e,0x0e,0x13, 0x0c,0x0d,0x12,0x0c,0x0d,0x11,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0a,0x0b,0x0f,0x0a, 0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x09,0x0c,0x08,0x08,0x0b,0x07,0x08, 0x0b,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x05,0x06,0x07, 0x04,0x05,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x04,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xae,0xb3,0xc1,0x5a,0x65,0x8d,0x5c,0x52,0x79, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x64,0x57,0x7c,0x40,0x38,0x50,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x24,0x23,0x24,0x07,0x07,0x07,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x04,0x05,0x09,0x0a,0x0c,0x13,0x15, 0x18,0x29,0x2a,0x2e,0x52,0x53,0x57,0x60,0x62,0x6a,0x54,0x58,0x63,0x42,0x47,0x59, 0x39,0x37,0x4a,0x3f,0x37,0x46,0x36,0x2f,0x3c,0x40,0x44,0x50,0x5e,0x62,0x6a,0x42, 0x46,0x4f,0x23,0x26,0x2e,0x1c,0x1f,0x28,0x2b,0x2f,0x3a,0x34,0x38,0x42,0x19,0x1a, 0x22,0x0d,0x0a,0x0d,0x0a,0x08,0x0a,0x08,0x07,0x0a,0x06,0x06,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x29,0x25,0x36,0x5f,0x47,0x63,0x5a,0x41,0x5c,0x55,0x3d, 0x56,0x56,0x3e,0x57,0x5e,0x46,0x60,0x65,0x4d,0x6a,0x5b,0x56,0x7d,0xaa,0xb2,0xc7, 0xc2,0xc7,0xd7,0xda,0xdd,0xe6,0xd7,0xda,0xe5,0x6d,0x70,0x78,0x06,0x06,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03, 0x03,0x04,0x04,0x05,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x09,0x09,0x09,0x0c, 0x0e,0x0d,0x12,0x15,0x12,0x18,0x1b,0x18,0x1f,0x22,0x1e,0x26,0x27,0x22,0x2b,0x29, 0x23,0x2d,0x26,0x21,0x2a,0x3a,0x36,0x41,0x51,0x4f,0x6a,0x4b,0x3d,0x53,0x38,0x27, 0x35,0x43,0x37,0x4a,0x42,0x38,0x4d,0x53,0x4a,0x66,0x66,0x61,0x7d,0x71,0x69,0x80, 0x6f,0x66,0x7d,0x63,0x5c,0x77,0x6a,0x65,0x7e,0x58,0x53,0x6f,0x55,0x4a,0x65,0x53, 0x49,0x64,0x46,0x38,0x4c,0x37,0x2c,0x3d,0x37,0x2d,0x3d,0x3a,0x2f,0x41,0x42,0x35, 0x47,0x3f,0x38,0x51,0x4e,0x4c,0x71,0x62,0x67,0x89,0x6c,0x70,0x92,0x7e,0x89,0xa6, 0x58,0x52,0x60,0x2b,0x21,0x29,0x20,0x18,0x20,0x21,0x18,0x20,0x4e,0x49,0x6a,0x5f, 0x53,0x79,0x63,0x4b,0x67,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x55, 0x80,0x52,0x5a,0x84,0x53,0x5f,0x89,0x58,0x65,0x8d,0x52,0x50,0x7b,0x52,0x4f,0x7a, 0xc7,0xcb,0xda,0xb4,0xb5,0xbe,0x34,0x27,0x2f,0x49,0x38,0x45,0x4e,0x3c,0x4a,0x4c, 0x3b,0x49,0x50,0x3e,0x4d,0x42,0x35,0x43,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,0x8b,0x91,0xa3,0x7b,0x85,0xa7,0x52,0x50,0x7b,0x5f, 0x6b,0x92,0x58,0x64,0x8c,0x55,0x60,0x8a,0x53,0x5f,0x89,0x54,0x5f,0x89,0x55,0x62, 0x8b,0x56,0x63,0x8a,0x58,0x64,0x8b,0x58,0x64,0x8c,0x58,0x65,0x8c,0x5b,0x66,0x8d, 0x54,0x5f,0x88,0x52,0x4f,0x7b,0x8c,0x97,0xb2,0x89,0x8b,0x8d,0x00,0x00,0x00,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x05,0x04,0x04,0x05,0x04,0x05,0x06, 0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x07,0x06, 0x06,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x07,0x07,0x0a,0x06,0x07, 0x09,0x07,0x08,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0b, 0x08,0x09,0x0b,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a, 0x0a,0x0d,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0c,0x0d, 0x10,0x0d,0x0e,0x11,0x0f,0x0f,0x13,0x12,0x12,0x16,0x16,0x16,0x1b,0x19,0x18,0x1e, 0x1b,0x1a,0x20,0x1d,0x1d,0x23,0x24,0x24,0x2e,0x22,0x22,0x2a,0x1d,0x1d,0x23,0x1b, 0x1b,0x21,0x23,0x24,0x2d,0x24,0x27,0x31,0x24,0x26,0x2f,0x41,0x3d,0x47,0x58,0x57, 0x5f,0x53,0x52,0x59,0x71,0x72,0x7b,0x7a,0x82,0x9b,0x5f,0x6a,0x89,0x56,0x61,0x85, 0x56,0x61,0x86,0x5a,0x64,0x8a,0x59,0x65,0x8b,0x57,0x62,0x89,0x55,0x61,0x87,0x54, 0x5e,0x83,0x50,0x5b,0x80,0x4d,0x58,0x7f,0x4c,0x50,0x78,0x5e,0x4b,0x68,0x56,0x4f, 0x73,0x2d,0x32,0x48,0x0a,0x0c,0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0c,0x08,0x09,0x0b, 0x3d,0x38,0x45,0x8f,0x99,0xb0,0x44,0x46,0x68,0x4c,0x42,0x61,0x5d,0x53,0x78,0x5d, 0x53,0x78,0x5d,0x52,0x78,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53, 0x77,0x5f,0x52,0x76,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x55,0x77,0x5f,0x56,0x77, 0x57,0x53,0x74,0x1a,0x1b,0x21,0x1a,0x1d,0x22,0x1b,0x1d,0x22,0x1a,0x1c,0x22,0x1a, 0x1b,0x21,0x19,0x1a,0x1f,0x16,0x18,0x1d,0x15,0x16,0x1b,0x3b,0x35,0x40,0x6d,0x7b, 0xae,0x4e,0x49,0x67,0x4b,0x44,0x61,0x5a,0x52,0x76,0x58,0x52,0x77,0x54,0x51,0x77, 0x52,0x4f,0x78,0x52,0x4f,0x78,0x52,0x4f,0x79,0x52,0x52,0x7b,0x53,0x56,0x7f,0x52, 0x5d,0x84,0x55,0x5f,0x87,0x56,0x63,0x88,0x5a,0x65,0x8a,0x5c,0x67,0x8c,0x62,0x6d, 0x8f,0x66,0x70,0x92,0x69,0x74,0x95,0x6d,0x78,0x97,0x72,0x7e,0x9b,0x76,0x80,0x9d, 0x70,0x77,0x90,0x49,0x41,0x51,0x44,0x3c,0x4c,0x45,0x3c,0x4b,0x44,0x3c,0x4b,0x48, 0x3e,0x4d,0x49,0x3f,0x50,0x4e,0x42,0x55,0x52,0x46,0x59,0x55,0x49,0x5d,0x58,0x4b, 0x5f,0x59,0x4d,0x62,0x3f,0x38,0x49,0x17,0x18,0x20,0x16,0x17,0x1f,0x16,0x17,0x1f, 0x16,0x16,0x1e,0x16,0x16,0x1e,0x15,0x16,0x1d,0x14,0x15,0x1c,0x35,0x2d,0x38,0x32, 0x2a,0x36,0x35,0x2c,0x38,0x95,0x93,0x9f,0x6b,0x73,0x93,0x98,0x9e,0xb3,0xb9,0xbd, 0xca,0xbb,0xbf,0xcc,0xb9,0xbe,0xcb,0xae,0xb3,0xc4,0x96,0x9e,0xb5,0x78,0x81,0xa0, 0x5b,0x67,0x8b,0x4f,0x57,0x7f,0x4f,0x58,0x80,0x4b,0x54,0x7a,0x42,0x4a,0x6d,0x44, 0x4d,0x6f,0x5f,0x69,0x89,0x50,0x54,0x64,0x09,0x09,0x0c,0x09,0x09,0x0b,0x3f,0x34, 0x3f,0x3b,0x2f,0x3a,0x40,0x36,0x44,0x61,0x6d,0x8f,0x50,0x5b,0x83,0x54,0x4e,0x74, 0x5c,0x51,0x73,0x5d,0x51,0x73,0x5d,0x51,0x74,0x5d,0x51,0x73,0x5d,0x51,0x73,0x60, 0x50,0x6f,0x4d,0x38,0x4f,0x45,0x30,0x45,0x42,0x2e,0x42,0x3f,0x2d,0x40,0x3f,0x2d, 0x3f,0x49,0x36,0x4c,0x5d,0x52,0x74,0x44,0x4b,0x6c,0x0d,0x0d,0x12,0x0e,0x0e,0x14, 0x0e,0x0e,0x14,0x0f,0x10,0x16,0x10,0x10,0x16,0x10,0x10,0x16,0x10,0x11,0x16,0x10, 0x11,0x16,0x10,0x11,0x16,0x10,0x10,0x16,0x0f,0x0f,0x15,0x0f,0x0f,0x15,0x0e,0x0f, 0x14,0x0e,0x0e,0x14,0x0e,0x0e,0x13,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0c,0x0d,0x12, 0x0b,0x0c,0x10,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09, 0x09,0x0c,0x08,0x08,0x0b,0x07,0x08,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06, 0x09,0x06,0x06,0x07,0x05,0x06,0x07,0x04,0x05,0x06,0x03,0x03,0x05,0x03,0x03,0x04, 0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x77,0x7b,0x82,0x65,0x71, 0x97,0x53,0x4f,0x78,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x61,0x54,0x78,0x6c,0x5d,0x86,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,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,0x02,0x02,0x02,0x00,0x00,0x00,0x22,0x21,0x22, 0x0b,0x0a,0x0b,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x04,0x06, 0x07,0x09,0x0e,0x0f,0x12,0x26,0x27,0x2b,0x52,0x54,0x57,0x6e,0x71,0x76,0x6a,0x6d, 0x74,0x55,0x5a,0x67,0x36,0x38,0x4c,0x32,0x2e,0x3e,0x2c,0x29,0x36,0x46,0x4a,0x56, 0x77,0x79,0x7e,0x58,0x5a,0x5e,0x22,0x25,0x30,0x28,0x20,0x28,0x29,0x22,0x2a,0x2a, 0x2c,0x34,0x16,0x17,0x1c,0x08,0x08,0x0a,0x08,0x08,0x0a,0x07,0x07,0x0a,0x03,0x03, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1d,0x2a,0x62,0x53,0x77,0x55,0x3d,0x56,0x4e, 0x37,0x4d,0x47,0x31,0x46,0x54,0x3d,0x55,0x5e,0x46,0x60,0x69,0x53,0x71,0x6d,0x5a, 0x76,0x76,0x81,0xa3,0x75,0x80,0xa1,0x84,0x8d,0xab,0xb8,0xbe,0xd0,0xd8,0xda,0xe5, 0xa8,0xac,0xb8,0x25,0x27,0x2b,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,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06, 0x07,0x07,0x07,0x0a,0x08,0x09,0x0c,0x0b,0x0b,0x0f,0x11,0x0f,0x14,0x17,0x15,0x1a, 0x1c,0x19,0x20,0x20,0x1c,0x23,0x1f,0x1b,0x23,0x4e,0x4d,0x61,0x40,0x3a,0x54,0x50, 0x3d,0x52,0x4b,0x38,0x4d,0x59,0x4d,0x69,0x56,0x48,0x61,0x52,0x49,0x65,0x53,0x49, 0x65,0x5b,0x4f,0x6c,0x56,0x4f,0x6d,0x55,0x4f,0x6b,0x5e,0x51,0x6c,0x5f,0x51,0x6a, 0x56,0x49,0x62,0x52,0x44,0x5c,0x4e,0x40,0x57,0x47,0x3a,0x4f,0x44,0x38,0x4d,0x46, 0x39,0x50,0x55,0x45,0x5e,0x45,0x3b,0x53,0x4a,0x46,0x69,0x53,0x5d,0x82,0x62,0x5c, 0x7e,0x7a,0x83,0xa2,0x71,0x70,0x83,0x36,0x29,0x33,0x1f,0x18,0x1f,0x21,0x18,0x20, 0x4d,0x48,0x67,0x5e,0x53,0x79,0x62,0x4a,0x66,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52, 0x53,0x7e,0x52,0x57,0x82,0x52,0x5d,0x86,0x54,0x5f,0x89,0x58,0x65,0x8d,0x53,0x5e, 0x88,0x64,0x53,0x76,0xac,0xb3,0xc8,0xd8,0xdb,0xe1,0x33,0x26,0x2e,0x4a,0x39,0x46, 0x4e,0x3c,0x4a,0x4c,0x3b,0x49,0x50,0x3f,0x4d,0x4c,0x3d,0x4c,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,0x53,0x56,0x5f,0x90,0x9a,0xb5, 0x52,0x54,0x80,0x53,0x5e,0x88,0x5b,0x67,0x8e,0x55,0x60,0x8a,0x53,0x5e,0x88,0x54, 0x5f,0x89,0x55,0x60,0x8a,0x56,0x62,0x8b,0x57,0x63,0x8b,0x57,0x63,0x8b,0x5a,0x65, 0x8d,0x58,0x64,0x8c,0x58,0x65,0x8c,0x52,0x4f,0x7a,0x63,0x6e,0x94,0xc9,0xcc,0xd6, 0x0a,0x0a,0x0a,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04, 0x05,0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07, 0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06, 0x07,0x09,0x06,0x07,0x09,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08, 0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x0a,0x0a,0x0d, 0x09,0x0a,0x0b,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0b, 0x0c,0x0e,0x0b,0x0d,0x0f,0x0d,0x0e,0x10,0x0c,0x0d,0x10,0x0e,0x0e,0x12,0x11,0x11, 0x15,0x16,0x16,0x1b,0x1a,0x19,0x20,0x1b,0x1a,0x20,0x1f,0x20,0x27,0x22,0x21,0x2a, 0x1d,0x1d,0x23,0x1b,0x1a,0x20,0x23,0x23,0x2c,0x25,0x27,0x31,0x1c,0x1e,0x24,0x32, 0x2d,0x35,0x45,0x42,0x4a,0x47,0x45,0x4d,0x6b,0x6b,0x73,0x77,0x7f,0x98,0x60,0x69, 0x89,0x56,0x61,0x84,0x57,0x63,0x88,0x5a,0x65,0x8b,0x5a,0x67,0x8c,0x59,0x65,0x8c, 0x58,0x64,0x8b,0x57,0x62,0x88,0x53,0x5f,0x85,0x50,0x5a,0x83,0x4f,0x54,0x7c,0x5f, 0x4e,0x6b,0x54,0x4e,0x74,0x2e,0x32,0x48,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a, 0x0d,0x08,0x08,0x0a,0x42,0x3c,0x49,0x93,0x9b,0xb3,0x45,0x47,0x6c,0x4a,0x42,0x5f, 0x5d,0x53,0x78,0x5d,0x53,0x78,0x5d,0x52,0x78,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f, 0x53,0x77,0x60,0x53,0x77,0x5f,0x52,0x76,0x5f,0x53,0x76,0x5f,0x55,0x76,0x5f,0x55, 0x77,0x5e,0x55,0x76,0x5a,0x54,0x75,0x1a,0x1b,0x21,0x1a,0x1d,0x22,0x1a,0x1c,0x22, 0x1a,0x1c,0x22,0x19,0x1a,0x20,0x18,0x1a,0x1f,0x17,0x19,0x1e,0x15,0x16,0x1a,0x34, 0x2e,0x38,0x74,0x83,0xb8,0x4d,0x47,0x68,0x4b,0x44,0x61,0x5b,0x52,0x76,0x58,0x52, 0x77,0x54,0x51,0x77,0x52,0x4f,0x78,0x52,0x4f,0x78,0x52,0x50,0x79,0x52,0x52,0x7b, 0x53,0x58,0x80,0x52,0x5d,0x86,0x55,0x5f,0x87,0x57,0x63,0x89,0x5b,0x66,0x8b,0x5c, 0x68,0x8d,0x62,0x6c,0x8f,0x64,0x70,0x92,0x68,0x74,0x94,0x6f,0x79,0x98,0x72,0x7e, 0x9a,0x76,0x7f,0x9c,0x74,0x7d,0x9a,0x48,0x40,0x50,0x43,0x3a,0x48,0x44,0x3a,0x4a, 0x46,0x3d,0x4d,0x4b,0x41,0x52,0x4d,0x44,0x54,0x52,0x47,0x5a,0x54,0x49,0x5d,0x57, 0x4b,0x5f,0x57,0x4c,0x60,0x41,0x3b,0x4b,0x17,0x19,0x22,0x17,0x19,0x21,0x16,0x18, 0x20,0x16,0x18,0x20,0x16,0x16,0x1e,0x15,0x16,0x1e,0x16,0x16,0x1e,0x14,0x16,0x1d, 0x2a,0x26,0x30,0x35,0x2d,0x39,0x35,0x2d,0x38,0x3d,0x34,0x3f,0xbd,0xbd,0xc5,0xaa, 0xae,0xbf,0x92,0x99,0xb0,0x7a,0x85,0xa0,0x65,0x6f,0x91,0x56,0x61,0x88,0x54,0x60, 0x86,0x55,0x60,0x87,0x54,0x5f,0x85,0x51,0x5a,0x82,0x50,0x5a,0x81,0x4c,0x56,0x7c, 0x43,0x4c,0x6d,0x45,0x50,0x70,0x65,0x6e,0x8e,0x5c,0x60,0x70,0x09,0x09,0x0c,0x08, 0x08,0x0b,0x3d,0x32,0x3c,0x3c,0x2f,0x3a,0x40,0x35,0x43,0x5a,0x64,0x8a,0x50,0x53, 0x7a,0x59,0x50,0x75,0x5d,0x50,0x73,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5d,0x51,0x73, 0x5e,0x51,0x74,0x5d,0x51,0x74,0x61,0x51,0x73,0x54,0x3e,0x56,0x43,0x2f,0x44,0x3f, 0x2c,0x40,0x3e,0x2b,0x3f,0x52,0x3d,0x54,0x5f,0x51,0x6f,0x4a,0x52,0x73,0x0e,0x0e, 0x13,0x0f,0x0f,0x15,0x0f,0x10,0x15,0x10,0x10,0x16,0x11,0x11,0x17,0x11,0x11,0x17, 0x10,0x11,0x16,0x11,0x12,0x18,0x11,0x12,0x17,0x10,0x11,0x17,0x10,0x11,0x16,0x10, 0x11,0x16,0x0f,0x10,0x16,0x0e,0x0f,0x15,0x0e,0x0f,0x14,0x0e,0x0e,0x13,0x0d,0x0e, 0x12,0x0c,0x0d,0x11,0x0c,0x0d,0x12,0x0b,0x0c,0x10,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e, 0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x08,0x09,0x0c,0x07,0x08,0x0b,0x07,0x07,0x0a,0x07, 0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x04,0x05, 0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x3f, 0x41,0x46,0x75,0x81,0xa2,0x51,0x4e,0x7a,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x6e, 0x5f,0x88,0x08,0x07,0x09,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,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,0x02,0x02, 0x02,0x19,0x19,0x19,0x18,0x18,0x18,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03, 0x03,0x03,0x04,0x04,0x04,0x06,0x08,0x09,0x0b,0x1e,0x1f,0x22,0x52,0x53,0x56,0x75, 0x76,0x7a,0x5e,0x62,0x6a,0x3d,0x42,0x4f,0x2d,0x2c,0x3c,0x2d,0x27,0x33,0x2d,0x27, 0x33,0x49,0x4e,0x5a,0x86,0x88,0x8d,0x62,0x63,0x69,0x28,0x26,0x33,0x18,0x12,0x16, 0x1d,0x16,0x1c,0x18,0x1a,0x1f,0x0e,0x0e,0x12,0x09,0x09,0x0c,0x08,0x08,0x0b,0x07, 0x07,0x09,0x02,0x02,0x02,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x16,0x4d,0x57,0x7d,0x64,0x52,0x72, 0x57,0x40,0x5a,0x5d,0x45,0x60,0x64,0x53,0x75,0x58,0x52,0x79,0x54,0x53,0x7e,0x58, 0x62,0x8a,0x75,0x81,0xa2,0xeb,0xed,0xf1,0xc4,0xca,0xd8,0xa0,0xa8,0xbf,0x8a,0x93, 0xaf,0x9c,0xa4,0xbc,0xc9,0xce,0xda,0xc2,0xc7,0xd5,0x59,0x5d,0x68,0x04,0x04,0x04, 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, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x04,0x04,0x04, 0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x08,0x0a,0x08,0x09,0x0c,0x0a,0x0a, 0x0e,0x0e,0x0d,0x12,0x12,0x11,0x16,0x16,0x14,0x1a,0x27,0x27,0x2f,0x52,0x59,0x76, 0x4b,0x43,0x60,0x42,0x35,0x49,0x4a,0x3e,0x56,0x50,0x48,0x61,0x60,0x5a,0x74,0x55, 0x4e,0x6b,0x54,0x49,0x64,0x51,0x45,0x5d,0x56,0x4a,0x64,0x50,0x4a,0x66,0x5b,0x4c, 0x66,0x56,0x47,0x5e,0x58,0x48,0x61,0x52,0x45,0x5d,0x51,0x43,0x5d,0x52,0x44,0x5c, 0x52,0x43,0x5b,0x52,0x44,0x5d,0x54,0x45,0x60,0x48,0x3c,0x55,0x3d,0x39,0x58,0x45, 0x4b,0x6c,0x56,0x4d,0x71,0x57,0x63,0x88,0x70,0x75,0x8d,0x3b,0x2c,0x37,0x1f,0x18, 0x1f,0x20,0x17,0x20,0x4d,0x48,0x66,0x5d,0x52,0x79,0x63,0x4c,0x69,0x52,0x4f,0x7b, 0x52,0x53,0x7d,0x52,0x56,0x81,0x52,0x55,0x81,0x52,0x5c,0x86,0x54,0x5f,0x89,0x5a, 0x65,0x8d,0x56,0x62,0x8b,0x64,0x4e,0x6d,0x95,0x9f,0xb9,0xea,0xeb,0xf1,0x40,0x35, 0x3d,0x4a,0x39,0x46,0x4e,0x3c,0x4a,0x4c,0x3b,0x49,0x4e,0x3d,0x4b,0x55,0x44,0x54, 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,0x17,0x18, 0x19,0xa8,0xaf,0xc4,0x60,0x6d,0x93,0x52,0x4f,0x7a,0x5b,0x66,0x8e,0x56,0x62,0x8b, 0x53,0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x55,0x62,0x8a,0x57, 0x63,0x8b,0x58,0x64,0x8c,0x5a,0x65,0x8c,0x58,0x64,0x8c,0x52,0x5c,0x85,0x52,0x5a, 0x83,0xab,0xb2,0xc8,0x5d,0x5d,0x5e,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x03,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x06, 0x07,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x09,0x06,0x06,0x08, 0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x07,0x08,0x0a,0x07, 0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x09,0x09,0x0b,0x08,0x09,0x0b,0x09,0x0a, 0x0c,0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x0d, 0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0b, 0x0d,0x0f,0x0d,0x0e,0x11,0x10,0x11,0x14,0x15,0x15,0x1a,0x1a,0x19,0x1f,0x1d,0x1d, 0x23,0x1e,0x1d,0x23,0x1d,0x1c,0x22,0x1b,0x1a,0x21,0x21,0x20,0x28,0x22,0x24,0x2c, 0x1b,0x1d,0x23,0x2c,0x29,0x30,0x34,0x2f,0x36,0x34,0x31,0x37,0x63,0x61,0x68,0x71, 0x7a,0x93,0x58,0x62,0x84,0x55,0x5f,0x84,0x58,0x62,0x89,0x5a,0x66,0x8b,0x5b,0x68, 0x8e,0x5a,0x65,0x8e,0x5a,0x65,0x8e,0x58,0x63,0x8c,0x54,0x61,0x89,0x52,0x5d,0x86, 0x50,0x55,0x7f,0x61,0x4d,0x6b,0x53,0x4f,0x76,0x2e,0x34,0x49,0x0a,0x0a,0x0e,0x0a, 0x0b,0x0e,0x09,0x0a,0x0d,0x07,0x08,0x0a,0x34,0x2d,0x38,0x94,0x9b,0xb3,0x45,0x4d, 0x71,0x49,0x43,0x5f,0x5d,0x53,0x78,0x5d,0x53,0x79,0x5f,0x52,0x76,0x5d,0x53,0x79, 0x5f,0x53,0x77,0x5f,0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5e, 0x54,0x76,0x5f,0x55,0x77,0x5e,0x56,0x77,0x5d,0x56,0x76,0x1a,0x1b,0x21,0x19,0x1b, 0x20,0x19,0x1b,0x20,0x1a,0x1b,0x21,0x19,0x1a,0x1f,0x18,0x1a,0x1e,0x16,0x18,0x1d, 0x14,0x16,0x1a,0x2f,0x29,0x33,0x7a,0x89,0xc1,0x4d,0x48,0x6a,0x4a,0x42,0x5f,0x5a, 0x51,0x76,0x58,0x52,0x77,0x54,0x50,0x77,0x53,0x4f,0x78,0x51,0x4f,0x78,0x51,0x50, 0x79,0x52,0x53,0x7d,0x53,0x56,0x7e,0x52,0x5d,0x84,0x55,0x5f,0x87,0x57,0x62,0x89, 0x5b,0x66,0x8b,0x5d,0x68,0x8d,0x60,0x6c,0x8e,0x66,0x70,0x92,0x69,0x74,0x94,0x6c, 0x76,0x96,0x70,0x7b,0x99,0x74,0x7e,0x9b,0x81,0x8b,0xaa,0x60,0x60,0x75,0x44,0x3b, 0x4b,0x46,0x3d,0x4d,0x49,0x3f,0x4f,0x4c,0x42,0x54,0x47,0x3f,0x4f,0x4b,0x41,0x53, 0x57,0x4c,0x60,0x56,0x4c,0x5f,0x24,0x22,0x2e,0x18,0x1a,0x22,0x17,0x1a,0x22,0x17, 0x19,0x21,0x17,0x18,0x20,0x16,0x18,0x20,0x16,0x17,0x1f,0x16,0x16,0x1e,0x15,0x16, 0x1d,0x14,0x15,0x1c,0x14,0x15,0x1c,0x3a,0x30,0x3e,0x36,0x2d,0x39,0x35,0x2c,0x37, 0x83,0x7f,0x8c,0x62,0x6e,0x8e,0x59,0x64,0x89,0x57,0x63,0x87,0x58,0x64,0x89,0x5c, 0x66,0x8c,0x5c,0x68,0x8d,0x5f,0x69,0x8e,0x5a,0x66,0x8b,0x53,0x5c,0x84,0x4f,0x58, 0x81,0x4b,0x54,0x7c,0x42,0x4a,0x6d,0x45,0x50,0x70,0x6c,0x75,0x94,0x70,0x74,0x81, 0x09,0x09,0x0c,0x08,0x08,0x0b,0x3c,0x2f,0x3a,0x3c,0x30,0x3b,0x3f,0x33,0x41,0x55, 0x60,0x87,0x50,0x4d,0x76,0x5d,0x51,0x73,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5d,0x51, 0x73,0x5e,0x51,0x74,0x5e,0x51,0x74,0x5d,0x51,0x74,0x5e,0x51,0x75,0x60,0x51,0x75, 0x5b,0x43,0x5e,0x3f,0x2d,0x3f,0x45,0x32,0x46,0x51,0x3d,0x55,0x5f,0x4a,0x68,0x4d, 0x50,0x74,0x0e,0x0f,0x14,0x10,0x10,0x16,0x11,0x11,0x17,0x12,0x12,0x18,0x12,0x12, 0x18,0x12,0x12,0x19,0x12,0x12,0x18,0x12,0x12,0x1a,0x12,0x12,0x19,0x12,0x12,0x19, 0x11,0x12,0x18,0x11,0x12,0x17,0x10,0x11,0x16,0x10,0x11,0x16,0x0e,0x0f,0x15,0x0e, 0x0f,0x15,0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0c,0x0d,0x12,0x0c,0x0d,0x11,0x0b,0x0c, 0x10,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x08,0x09,0x0b, 0x07,0x08,0x0b,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x07,0x05, 0x06,0x07,0x05,0x06,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x02,0x03, 0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x15,0x15,0x18,0x80,0x8a,0xa9,0x51,0x55,0x81,0x5f,0x52,0x76,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x67,0x59,0x7f,0x2d,0x27,0x38,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,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,0x02, 0x02,0x02,0x02,0x02,0x02,0x0a,0x0a,0x0a,0x23,0x23,0x23,0x02,0x02,0x03,0x02,0x02, 0x02,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x06,0x07,0x13,0x14,0x17, 0x36,0x37,0x3a,0x66,0x67,0x6b,0x6a,0x6b,0x71,0x3e,0x42,0x4e,0x28,0x29,0x37,0x26, 0x26,0x33,0x30,0x2a,0x36,0x45,0x4a,0x59,0x72,0x76,0x81,0x5b,0x5e,0x67,0x23,0x21, 0x2b,0x19,0x13,0x18,0x21,0x1d,0x25,0x1f,0x21,0x25,0x11,0x12,0x16,0x0a,0x0c,0x0f, 0x09,0x09,0x0c,0x06,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02, 0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x4f,0x6e,0x57,0x50, 0x79,0x64,0x50,0x71,0x5c,0x44,0x5e,0x64,0x50,0x6f,0x64,0x52,0x72,0x5f,0x53,0x7a, 0x55,0x53,0x7c,0x5b,0x63,0x8b,0xac,0xb4,0xc9,0xef,0xf1,0xf5,0xe0,0xe2,0xea,0xdb, 0xdf,0xe8,0xc0,0xc6,0xd5,0x92,0x9a,0xb5,0x82,0x8a,0xa9,0x9b,0xa3,0xbc,0xb7,0xbe, 0xcf,0x8d,0x94,0xa5,0x20,0x22,0x28,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x08,0x06, 0x07,0x09,0x07,0x08,0x0a,0x09,0x09,0x0b,0x0a,0x0a,0x0e,0x0c,0x0c,0x10,0x4e,0x54, 0x68,0x47,0x4e,0x70,0x53,0x44,0x5d,0x42,0x32,0x46,0x4c,0x43,0x5e,0x4e,0x47,0x61, 0x56,0x4f,0x67,0x5a,0x54,0x6c,0x57,0x51,0x6d,0x59,0x4f,0x6d,0x58,0x4d,0x6a,0x5a, 0x54,0x70,0x5c,0x4f,0x6b,0x5d,0x4d,0x68,0x59,0x4b,0x65,0x58,0x4c,0x66,0x53,0x45, 0x5f,0x56,0x46,0x61,0x56,0x47,0x61,0x56,0x47,0x62,0x4f,0x41,0x5a,0x46,0x39,0x51, 0x3e,0x37,0x51,0x3e,0x3e,0x5e,0x41,0x3e,0x60,0x46,0x44,0x68,0x6f,0x77,0x97,0x3e, 0x2f,0x3b,0x20,0x17,0x1f,0x21,0x18,0x20,0x4c,0x46,0x63,0x5b,0x52,0x79,0x64,0x4d, 0x6a,0x52,0x4f,0x7a,0x52,0x52,0x7d,0x52,0x54,0x80,0x52,0x56,0x81,0x52,0x5c,0x86, 0x54,0x5f,0x89,0x58,0x64,0x8c,0x5c,0x67,0x90,0x64,0x53,0x75,0x8e,0x98,0xb3,0xeb, 0xee,0xf2,0x53,0x4b,0x53,0x47,0x36,0x43,0x4e,0x3d,0x4b,0x4c,0x3b,0x49,0x4f,0x3e, 0x4c,0x5d,0x4a,0x5b,0x02,0x02,0x02,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,0x94,0x99,0xa4,0x88,0x92,0xb0,0x52,0x4f,0x7b,0x56,0x62, 0x8b,0x58,0x64,0x8c,0x53,0x5f,0x89,0x53,0x5f,0x89,0x54,0x5f,0x89,0x56,0x62,0x8b, 0x56,0x62,0x8b,0x56,0x62,0x8b,0x57,0x63,0x8b,0x58,0x64,0x8c,0x58,0x64,0x8c,0x57, 0x64,0x8b,0x52,0x4f,0x7a,0x7a,0x84,0xa6,0xba,0xbb,0xc0,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x04, 0x04,0x06,0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06, 0x08,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x07,0x09, 0x06,0x07,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08, 0x09,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x09,0x0a,0x0b,0x09,0x0a, 0x0c,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e, 0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0d,0x0e,0x10,0x0d,0x0e,0x11,0x0f,0x10,0x13,0x16, 0x16,0x1a,0x1a,0x1a,0x20,0x1d,0x1d,0x23,0x1d,0x1d,0x23,0x1c,0x1b,0x22,0x1c,0x1c, 0x22,0x1b,0x1c,0x22,0x17,0x19,0x1e,0x28,0x24,0x2c,0x2a,0x24,0x2b,0x23,0x1e,0x24, 0x5d,0x5b,0x60,0x71,0x7a,0x95,0x55,0x62,0x84,0x56,0x62,0x86,0x59,0x63,0x8a,0x5a, 0x67,0x8d,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x5b,0x67,0x8e,0x59,0x64,0x8b,0x55,0x61, 0x89,0x54,0x5f,0x87,0x51,0x59,0x82,0x62,0x4f,0x6c,0x54,0x51,0x77,0x2d,0x31,0x47, 0x0b,0x0c,0x0f,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x07,0x08,0x0a,0x2d,0x24,0x2f,0x92, 0x99,0xb1,0x45,0x4e,0x72,0x49,0x42,0x5e,0x5e,0x53,0x78,0x5d,0x53,0x78,0x5d,0x52, 0x78,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x76, 0x5f,0x54,0x76,0x5e,0x54,0x76,0x5e,0x55,0x76,0x5f,0x56,0x76,0x5d,0x56,0x76,0x19, 0x1a,0x20,0x18,0x1a,0x20,0x1a,0x1b,0x21,0x18,0x1a,0x1f,0x18,0x1a,0x1f,0x16,0x19, 0x1e,0x16,0x18,0x1c,0x14,0x16,0x1a,0x29,0x26,0x2d,0x7f,0x8c,0xc8,0x4f,0x4b,0x6c, 0x48,0x41,0x5c,0x5b,0x51,0x76,0x56,0x50,0x77,0x54,0x50,0x77,0x51,0x4f,0x78,0x51, 0x50,0x78,0x51,0x4f,0x79,0x52,0x52,0x7b,0x53,0x56,0x7e,0x52,0x5d,0x84,0x55,0x5f, 0x87,0x57,0x63,0x89,0x5b,0x66,0x8b,0x5d,0x69,0x8d,0x61,0x6c,0x8e,0x65,0x70,0x92, 0x67,0x73,0x93,0x6c,0x76,0x96,0x70,0x7b,0x99,0x72,0x7d,0x9a,0x7f,0x89,0xa9,0x72, 0x78,0x93,0x46,0x3d,0x4d,0x48,0x40,0x51,0x4c,0x42,0x54,0x47,0x3c,0x4d,0x44,0x3b, 0x4c,0x49,0x3e,0x50,0x41,0x3a,0x4b,0x18,0x1a,0x23,0x17,0x1a,0x22,0x17,0x1a,0x22, 0x17,0x1a,0x22,0x17,0x19,0x21,0x17,0x18,0x21,0x16,0x18,0x20,0x16,0x18,0x20,0x16, 0x16,0x1e,0x15,0x16,0x1d,0x14,0x16,0x1d,0x13,0x15,0x1c,0x2d,0x28,0x34,0x37,0x2e, 0x3b,0x34,0x2b,0x36,0x36,0x2d,0x38,0x7f,0x86,0xa0,0x5f,0x68,0x8b,0x5a,0x66,0x89, 0x58,0x64,0x89,0x56,0x62,0x88,0x54,0x5f,0x85,0x51,0x5c,0x83,0x51,0x5b,0x83,0x50, 0x55,0x7c,0x50,0x51,0x79,0x4c,0x4e,0x75,0x42,0x43,0x67,0x42,0x4a,0x6c,0x65,0x6d, 0x8f,0x70,0x75,0x85,0x09,0x09,0x0b,0x08,0x08,0x0a,0x38,0x2d,0x37,0x3c,0x2f,0x39, 0x3d,0x32,0x3f,0x54,0x60,0x86,0x50,0x4d,0x76,0x5d,0x51,0x74,0x5d,0x51,0x73,0x5d, 0x51,0x74,0x5e,0x51,0x75,0x5e,0x51,0x74,0x5e,0x51,0x74,0x5e,0x51,0x75,0x5e,0x51, 0x75,0x5e,0x51,0x75,0x5c,0x50,0x73,0x59,0x44,0x5e,0x49,0x36,0x4d,0x4f,0x3a,0x52, 0x5b,0x47,0x62,0x51,0x52,0x78,0x0f,0x0f,0x15,0x10,0x11,0x16,0x12,0x12,0x18,0x12, 0x12,0x18,0x12,0x12,0x1a,0x13,0x13,0x1a,0x12,0x13,0x1a,0x12,0x13,0x1a,0x13,0x13, 0x1a,0x12,0x13,0x1a,0x12,0x12,0x19,0x12,0x12,0x19,0x11,0x12,0x18,0x11,0x12,0x17, 0x0f,0x10,0x16,0x0f,0x10,0x16,0x0e,0x0f,0x15,0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0c, 0x0d,0x12,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a, 0x0d,0x09,0x0a,0x0d,0x08,0x09,0x0b,0x07,0x08,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09, 0x06,0x06,0x09,0x06,0x06,0x07,0x05,0x06,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x04, 0x04,0x06,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x85,0x8f,0xac,0x53,0x5e,0x88, 0x5a,0x51,0x78,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x56,0x7c,0x5c,0x4f,0x74,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,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,0x02,0x02,0x02,0x02,0x02,0x02,0x23,0x23,0x23,0x09, 0x09,0x09,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x05, 0x06,0x0a,0x0b,0x0d,0x23,0x24,0x26,0x4e,0x4f,0x52,0x5e,0x5f,0x65,0x61,0x63,0x6a, 0x61,0x63,0x6b,0x32,0x36,0x42,0x2c,0x2a,0x38,0x2f,0x2f,0x40,0x45,0x4a,0x59,0x32, 0x36,0x45,0x21,0x1d,0x25,0x14,0x12,0x19,0x16,0x18,0x1d,0x1e,0x20,0x22,0x13,0x15, 0x18,0x0a,0x0b,0x0e,0x07,0x06,0x09,0x02,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x35,0x49,0x52, 0x50,0x7c,0x64,0x53,0x74,0x62,0x53,0x77,0x5e,0x46,0x62,0x62,0x4a,0x65,0x64,0x4f, 0x6e,0x63,0x54,0x79,0x57,0x55,0x7e,0x5f,0x6a,0x90,0xbf,0xc4,0xd5,0xe5,0xe7,0xed, 0xd1,0xd6,0xe0,0xd3,0xd8,0xe2,0xd9,0xde,0xe7,0xcc,0xd1,0xde,0xa1,0xa9,0xc0,0x76, 0x80,0xa0,0x6f,0x7a,0x9d,0x85,0x90,0xad,0x91,0x9a,0xb6,0x51,0x56,0x63,0x03,0x04, 0x04,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x05,0x04,0x04,0x06,0x05,0x05,0x06, 0x04,0x05,0x06,0x06,0x06,0x08,0x06,0x07,0x0a,0x06,0x07,0x09,0x08,0x08,0x0a,0x24, 0x25,0x2e,0x58,0x61,0x82,0x50,0x49,0x6b,0x51,0x3f,0x56,0x52,0x40,0x58,0x54,0x47, 0x63,0x4c,0x41,0x5b,0x4b,0x43,0x5d,0x49,0x41,0x5b,0x4e,0x49,0x61,0x55,0x50,0x6a, 0x56,0x4d,0x68,0x5a,0x51,0x69,0x53,0x4b,0x67,0x5a,0x4c,0x68,0x56,0x49,0x64,0x57, 0x4b,0x65,0x57,0x48,0x64,0x59,0x4a,0x65,0x5a,0x4a,0x67,0x5b,0x49,0x66,0x55,0x45, 0x5f,0x4a,0x3d,0x57,0x43,0x3a,0x56,0x3e,0x3b,0x5b,0x3d,0x3c,0x5b,0x53,0x45,0x63, 0x63,0x6b,0x89,0x4e,0x43,0x52,0x20,0x17,0x1f,0x1f,0x17,0x1f,0x4c,0x46,0x62,0x5a, 0x52,0x79,0x63,0x4b,0x67,0x55,0x50,0x79,0x52,0x50,0x7b,0x52,0x53,0x7d,0x52,0x56, 0x82,0x52,0x5c,0x86,0x54,0x5f,0x89,0x58,0x64,0x8c,0x5f,0x6c,0x93,0x64,0x4f,0x6d, 0x7e,0x8a,0xa9,0xf8,0xf8,0xfa,0x6c,0x67,0x6f,0x47,0x37,0x43,0x4e,0x3d,0x4b,0x4c, 0x3b,0x49,0x4c,0x3b,0x49,0x5b,0x48,0x5a,0x0f,0x0c,0x10,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,0x5e,0x5f,0x63,0xa4,0xac,0xc3,0x55, 0x60,0x8a,0x52,0x50,0x7b,0x5a,0x66,0x8e,0x55,0x60,0x8a,0x53,0x5e,0x89,0x53,0x5f, 0x89,0x53,0x5f,0x89,0x56,0x62,0x8b,0x56,0x62,0x8b,0x56,0x63,0x8b,0x57,0x64,0x8b, 0x58,0x65,0x8c,0x58,0x64,0x8b,0x52,0x52,0x7d,0x55,0x62,0x89,0xc8,0xcd,0xdb,0x2d, 0x2d,0x2d,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04, 0x03,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x05, 0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x07, 0x09,0x06,0x07,0x09,0x07,0x08,0x0b,0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x08,0x0a, 0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0a,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x09, 0x0a,0x0c,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b, 0x0e,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0e,0x0e,0x12, 0x0e,0x0f,0x12,0x11,0x12,0x15,0x15,0x17,0x1b,0x1a,0x1b,0x20,0x1c,0x1b,0x21,0x1b, 0x1b,0x21,0x18,0x19,0x1e,0x16,0x17,0x1b,0x16,0x18,0x1c,0x23,0x20,0x27,0x29,0x23, 0x28,0x24,0x1d,0x23,0x62,0x5f,0x64,0x78,0x81,0x9d,0x57,0x63,0x87,0x57,0x62,0x87, 0x59,0x64,0x8a,0x5a,0x65,0x8e,0x5b,0x66,0x8f,0x5c,0x66,0x8e,0x5b,0x66,0x8c,0x5a, 0x65,0x8b,0x56,0x62,0x89,0x54,0x5f,0x88,0x52,0x5b,0x84,0x62,0x4f,0x6d,0x52,0x50, 0x79,0x2d,0x32,0x46,0x0b,0x0d,0x10,0x0c,0x0d,0x10,0x0a,0x0a,0x0e,0x08,0x09,0x0a, 0x29,0x21,0x2d,0x8c,0x93,0xac,0x47,0x50,0x75,0x49,0x41,0x5f,0x5d,0x53,0x78,0x5d, 0x53,0x78,0x5d,0x52,0x78,0x5d,0x53,0x79,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53, 0x77,0x5f,0x53,0x76,0x5e,0x53,0x76,0x5e,0x54,0x75,0x5e,0x55,0x77,0x5f,0x55,0x76, 0x5e,0x56,0x76,0x18,0x1a,0x1f,0x18,0x1a,0x20,0x19,0x1a,0x20,0x18,0x1a,0x1f,0x16, 0x18,0x1d,0x16,0x18,0x1d,0x15,0x16,0x1a,0x13,0x15,0x19,0x21,0x1e,0x25,0x83,0x8b, 0xc8,0x52,0x4d,0x70,0x48,0x41,0x5c,0x58,0x50,0x75,0x58,0x52,0x77,0x55,0x50,0x77, 0x51,0x4f,0x78,0x51,0x4f,0x78,0x52,0x50,0x7a,0x52,0x52,0x7a,0x52,0x56,0x7e,0x53, 0x5d,0x84,0x55,0x5f,0x87,0x57,0x62,0x88,0x5a,0x64,0x89,0x57,0x62,0x83,0x61,0x6d, 0x8f,0x65,0x6f,0x92,0x68,0x73,0x93,0x6d,0x76,0x96,0x70,0x7a,0x97,0x70,0x7a,0x99, 0x79,0x82,0xa1,0x7c,0x84,0xa0,0x4b,0x43,0x53,0x4b,0x42,0x55,0x4e,0x43,0x57,0x46, 0x3c,0x4f,0x35,0x2d,0x3b,0x1e,0x1c,0x25,0x1d,0x1d,0x28,0x1a,0x1a,0x24,0x17,0x1a, 0x22,0x18,0x1a,0x22,0x17,0x1a,0x22,0x17,0x1a,0x22,0x17,0x19,0x21,0x16,0x18,0x20, 0x16,0x18,0x20,0x16,0x17,0x1e,0x16,0x16,0x1e,0x15,0x16,0x1d,0x13,0x15,0x1c,0x13, 0x14,0x1b,0x3b,0x32,0x3f,0x36,0x2d,0x39,0x38,0x2d,0x3a,0x8c,0x8f,0xa2,0x5f,0x69, 0x8c,0x4f,0x58,0x80,0x4f,0x54,0x7d,0x50,0x52,0x79,0x50,0x50,0x78,0x50,0x4e,0x78, 0x50,0x4d,0x78,0x50,0x4d,0x76,0x50,0x4d,0x75,0x4c,0x4a,0x70,0x40,0x3e,0x61,0x40, 0x3d,0x5d,0x56,0x5f,0x83,0x5d,0x64,0x7b,0x08,0x08,0x0b,0x07,0x07,0x0a,0x35,0x2a, 0x34,0x3b,0x2e,0x38,0x3b,0x30,0x3d,0x54,0x5f,0x86,0x50,0x4d,0x76,0x5d,0x51,0x73, 0x5d,0x51,0x74,0x5e,0x51,0x74,0x5e,0x51,0x75,0x5e,0x51,0x74,0x5e,0x51,0x74,0x5e, 0x51,0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5d,0x50,0x74,0x5b,0x4b,0x69,0x49,0x37, 0x4d,0x49,0x37,0x4d,0x59,0x45,0x60,0x56,0x56,0x7d,0x0f,0x0f,0x15,0x11,0x11,0x17, 0x12,0x12,0x19,0x12,0x12,0x1a,0x13,0x14,0x1a,0x13,0x14,0x1b,0x13,0x14,0x1b,0x13, 0x14,0x1b,0x13,0x14,0x1b,0x13,0x14,0x1b,0x13,0x14,0x1a,0x12,0x13,0x1a,0x12,0x12, 0x19,0x12,0x12,0x19,0x11,0x12,0x18,0x10,0x11,0x16,0x10,0x11,0x16,0x0e,0x10,0x15, 0x0e,0x0f,0x15,0x0e,0x0e,0x13,0x0c,0x0e,0x12,0x0c,0x0d,0x11,0x0a,0x0c,0x0f,0x0a, 0x0b,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x08,0x09,0x0b,0x08,0x09,0x0c,0x07,0x08, 0x0b,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x05,0x06,0x07,0x06,0x06,0x07, 0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x02,0x03,0x04,0x02,0x03,0x04,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x6b,0x73, 0x89,0x5b,0x68,0x8e,0x54,0x4f,0x78,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x61,0x54,0x79,0x74,0x65, 0x93,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,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, 0x1c,0x1c,0x1c,0x11,0x11,0x11,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x03,0x06,0x06,0x07,0x0e,0x0e,0x0f,0x22,0x23,0x25,0x3a,0x3b, 0x3f,0x6f,0x71,0x75,0x76,0x79,0x7e,0x52,0x55,0x5e,0x34,0x39,0x48,0x2e,0x2c,0x3a, 0x30,0x27,0x31,0x10,0x0c,0x0e,0x17,0x12,0x16,0x14,0x16,0x1c,0x22,0x22,0x26,0x17, 0x18,0x1a,0x0a,0x0b,0x0d,0x05,0x05,0x06,0x03,0x03,0x04,0x02,0x02,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x13,0x15,0x1e, 0x50,0x5b,0x84,0x60,0x53,0x77,0x52,0x4f,0x7b,0x53,0x50,0x7a,0x5d,0x45,0x60,0x62, 0x4a,0x66,0x64,0x50,0x71,0x60,0x55,0x7a,0x57,0x55,0x7e,0x63,0x6d,0x93,0xd6,0xd9, 0xe2,0xe1,0xe3,0xea,0xd0,0xd5,0xe0,0xcf,0xd3,0xdf,0xcb,0xd1,0xdd,0xd1,0xd6,0xe1, 0xcc,0xd1,0xde,0xac,0xb3,0xc8,0x7b,0x84,0xa5,0x5e,0x69,0x91,0x6a,0x75,0x9a,0x96, 0xa0,0xba,0x84,0x8b,0x9e,0x19,0x1b,0x20,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,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x04, 0x05,0x03,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08, 0x06,0x06,0x09,0x57,0x5d,0x76,0x4c,0x55,0x7b,0x57,0x43,0x5f,0x52,0x3f,0x57,0x59, 0x4b,0x6a,0x54,0x4a,0x69,0x55,0x49,0x67,0x51,0x47,0x66,0x4f,0x45,0x61,0x54,0x4b, 0x65,0x54,0x4d,0x65,0x51,0x48,0x61,0x57,0x4d,0x65,0x5e,0x53,0x6d,0x53,0x48,0x64, 0x54,0x46,0x62,0x56,0x48,0x64,0x5a,0x4a,0x67,0x5d,0x4c,0x6a,0x5e,0x4b,0x68,0x5f, 0x4c,0x69,0x5a,0x4a,0x67,0x54,0x45,0x60,0x4f,0x42,0x5f,0x44,0x40,0x63,0x43,0x45, 0x68,0x56,0x48,0x64,0x55,0x5f,0x80,0x64,0x5f,0x6f,0x1f,0x16,0x1e,0x1f,0x16,0x1f, 0x47,0x41,0x5b,0x5d,0x52,0x79,0x63,0x4b,0x67,0x56,0x50,0x79,0x52,0x50,0x7b,0x52, 0x50,0x7c,0x52,0x55,0x81,0x52,0x5b,0x85,0x53,0x5e,0x88,0x5a,0x65,0x8d,0x60,0x6d, 0x93,0x64,0x53,0x74,0x69,0x74,0x99,0xeb,0xed,0xf1,0x83,0x81,0x89,0x45,0x35,0x41, 0x4f,0x3d,0x4b,0x52,0x40,0x4f,0x55,0x42,0x52,0x60,0x4d,0x60,0x1c,0x17,0x1c,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,0x14,0x14,0x14, 0xb9,0xbf,0xd0,0x73,0x7e,0xa1,0x60,0x53,0x77,0x5a,0x66,0x8e,0x55,0x60,0x8a,0x52, 0x5d,0x88,0x53,0x5e,0x88,0x54,0x5f,0x89,0x55,0x60,0x8a,0x56,0x62,0x8b,0x57,0x63, 0x8c,0x56,0x63,0x8b,0x57,0x63,0x8b,0x57,0x64,0x8b,0x54,0x60,0x89,0x52,0x4f,0x7a, 0x8a,0x93,0xb1,0x87,0x88,0x8a,0x00,0x00,0x00,0x02,0x02,0x02,0x0b,0x0b,0x0b,0x0d, 0x0d,0x0d,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x05,0x04,0x05,0x06, 0x05,0x05,0x06,0x04,0x05,0x06,0x0a,0x0b,0x0c,0x1e,0x1e,0x20,0x3a,0x3a,0x3b,0x31, 0x31,0x32,0x11,0x11,0x14,0x08,0x08,0x0a,0x12,0x10,0x14,0x0b,0x0a,0x0e,0x07,0x08, 0x0a,0x08,0x09,0x0b,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a, 0x08,0x09,0x0b,0x09,0x09,0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a, 0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0b,0x0c, 0x0f,0x0d,0x0e,0x10,0x0e,0x0f,0x12,0x10,0x11,0x15,0x13,0x14,0x18,0x15,0x17,0x1b, 0x17,0x17,0x1c,0x14,0x15,0x1a,0x13,0x15,0x19,0x12,0x14,0x17,0x13,0x15,0x19,0x1e, 0x1d,0x22,0x2a,0x23,0x29,0x24,0x1e,0x23,0x5b,0x58,0x5c,0x79,0x82,0x9e,0x5b,0x67, 0x8b,0x58,0x63,0x89,0x59,0x64,0x8c,0x5b,0x68,0x8e,0x5b,0x65,0x8d,0x5b,0x65,0x8d, 0x5b,0x65,0x8d,0x5a,0x64,0x8c,0x57,0x62,0x8a,0x55,0x5f,0x89,0x52,0x5d,0x86,0x63, 0x52,0x70,0x52,0x51,0x7a,0x2e,0x33,0x46,0x0a,0x0b,0x0e,0x0b,0x0c,0x0f,0x0a,0x0a, 0x0d,0x08,0x09,0x0a,0x28,0x21,0x2b,0x7d,0x83,0x9a,0x4b,0x53,0x78,0x4a,0x41,0x5e, 0x5d,0x52,0x78,0x5d,0x53,0x78,0x5f,0x52,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f, 0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x76,0x5f,0x55, 0x77,0x5f,0x55,0x77,0x5e,0x56,0x77,0x17,0x19,0x1e,0x19,0x1a,0x20,0x18,0x1a,0x1f, 0x18,0x1a,0x1f,0x16,0x18,0x1e,0x16,0x17,0x1b,0x14,0x16,0x1a,0x12,0x14,0x18,0x1c, 0x1b,0x20,0x85,0x83,0xbf,0x58,0x50,0x73,0x48,0x42,0x5c,0x58,0x50,0x74,0x56,0x4f, 0x77,0x56,0x50,0x77,0x51,0x4e,0x78,0x52,0x4f,0x79,0x52,0x50,0x7a,0x52,0x53,0x7c, 0x52,0x56,0x7f,0x53,0x5d,0x86,0x55,0x5f,0x87,0x57,0x62,0x88,0x56,0x60,0x84,0x3e, 0x43,0x5a,0x60,0x6c,0x8e,0x63,0x6f,0x90,0x68,0x73,0x93,0x6c,0x75,0x95,0x6c,0x77, 0x95,0x6f,0x79,0x97,0x73,0x7c,0x9b,0x83,0x8d,0xad,0x41,0x42,0x53,0x20,0x1f,0x2b, 0x29,0x25,0x32,0x2e,0x29,0x35,0x2d,0x28,0x34,0x29,0x24,0x30,0x26,0x22,0x2d,0x1e, 0x1e,0x29,0x19,0x1a,0x22,0x17,0x1a,0x22,0x17,0x1a,0x22,0x17,0x1a,0x22,0x17,0x19, 0x21,0x16,0x17,0x1f,0x16,0x18,0x1f,0x15,0x16,0x1e,0x16,0x16,0x1e,0x14,0x15,0x1c, 0x13,0x15,0x1c,0x13,0x14,0x1b,0x2b,0x27,0x32,0x3c,0x32,0x3f,0x40,0x36,0x43,0x59, 0x52,0x64,0x59,0x63,0x88,0x4f,0x4d,0x75,0x4f,0x4d,0x74,0x51,0x4d,0x75,0x51,0x4d, 0x76,0x52,0x4e,0x76,0x53,0x4e,0x76,0x54,0x4e,0x76,0x55,0x4e,0x75,0x52,0x4a,0x70, 0x44,0x3d,0x5c,0x3d,0x37,0x54,0x4d,0x54,0x76,0x55,0x5c,0x77,0x08,0x08,0x0b,0x07, 0x07,0x0a,0x32,0x27,0x31,0x3b,0x2e,0x39,0x3a,0x2f,0x3b,0x54,0x60,0x85,0x51,0x4d, 0x77,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x51,0x74,0x5e,0x51,0x74, 0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x51,0x74,0x5d, 0x4c,0x6b,0x4a,0x37,0x4d,0x48,0x35,0x4d,0x58,0x45,0x5f,0x58,0x57,0x82,0x10,0x11, 0x16,0x12,0x12,0x19,0x13,0x13,0x1a,0x13,0x14,0x1a,0x15,0x15,0x1d,0x15,0x16,0x1d, 0x15,0x16,0x1d,0x15,0x16,0x1d,0x15,0x16,0x1e,0x15,0x16,0x1d,0x13,0x14,0x1b,0x13, 0x14,0x1b,0x13,0x14,0x1b,0x13,0x14,0x1a,0x12,0x12,0x19,0x11,0x12,0x19,0x10,0x12, 0x17,0x0f,0x10,0x16,0x0e,0x10,0x15,0x0e,0x0e,0x13,0x0e,0x0e,0x13,0x0c,0x0e,0x12, 0x0b,0x0d,0x11,0x0a,0x0c,0x0f,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09, 0x0a,0x0c,0x07,0x08,0x0b,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x06,0x09,0x06,0x06, 0x08,0x06,0x06,0x07,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x04, 0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x02,0x4a,0x4e,0x5c,0x68,0x73,0x97,0x51,0x4e,0x79,0x5f,0x52,0x76,0x5f,0x52, 0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x6f,0x60,0x89,0x16,0x14,0x17,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, 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,0x19,0x18,0x19,0x16,0x16,0x16,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x05,0x06,0x06,0x0a, 0x0a,0x0b,0x1e,0x1f,0x21,0x51,0x52,0x55,0x72,0x74,0x78,0x65,0x67,0x6e,0x44,0x47, 0x52,0x28,0x27,0x36,0x29,0x21,0x29,0x16,0x11,0x15,0x20,0x1e,0x27,0x2d,0x2e,0x32, 0x1a,0x1a,0x1c,0x0a,0x0b,0x0c,0x05,0x06,0x06,0x04,0x04,0x05,0x02,0x02,0x03,0x02, 0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03, 0x05,0x50,0x5a,0x7b,0x63,0x53,0x77,0x54,0x50,0x79,0x52,0x53,0x7d,0x52,0x4f,0x7b, 0x5d,0x45,0x60,0x62,0x4b,0x66,0x65,0x53,0x72,0x5d,0x54,0x7a,0x57,0x55,0x7e,0x66, 0x72,0x96,0xde,0xe0,0xe9,0xde,0xe1,0xe9,0xd1,0xd5,0xe0,0xcf,0xd3,0xdf,0xcb,0xcf, 0xdd,0xc6,0xcb,0xd9,0xc8,0xcc,0xda,0xc7,0xcb,0xd9,0xa8,0xb1,0xc6,0x82,0x8c,0xab, 0x5a,0x65,0x8e,0x56,0x62,0x8a,0x7c,0x88,0xa8,0x83,0x8e,0xab,0x43,0x48,0x57,0x03, 0x03,0x04,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x03,0x03,0x05,0x03,0x03,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x05,0x05, 0x06,0x05,0x06,0x07,0x34,0x37,0x42,0x5c,0x67,0x8b,0x5e,0x4f,0x70,0x51,0x3e,0x56, 0x5d,0x4a,0x67,0x58,0x4d,0x6f,0x57,0x4c,0x6d,0x56,0x4b,0x6b,0x56,0x49,0x69,0x52, 0x47,0x66,0x54,0x46,0x64,0x51,0x45,0x63,0x51,0x44,0x60,0x50,0x45,0x63,0x58,0x4b, 0x68,0x55,0x47,0x65,0x57,0x49,0x66,0x5a,0x4b,0x69,0x5d,0x4d,0x6b,0x5f,0x4e,0x6c, 0x61,0x4d,0x6b,0x61,0x4e,0x6e,0x60,0x4c,0x69,0x5c,0x4a,0x67,0x5a,0x4b,0x69,0x51, 0x48,0x6a,0x47,0x49,0x6c,0x5a,0x4c,0x6b,0x4c,0x57,0x7f,0x72,0x74,0x89,0x1f,0x16, 0x1e,0x1f,0x16,0x1f,0x3f,0x3a,0x51,0x5b,0x52,0x79,0x62,0x4a,0x66,0x57,0x50,0x79, 0x52,0x4f,0x7b,0x52,0x52,0x7c,0x52,0x57,0x82,0x52,0x5d,0x88,0x53,0x5d,0x88,0x57, 0x63,0x8c,0x62,0x6e,0x94,0x5e,0x53,0x79,0x56,0x62,0x8b,0xe3,0xe6,0xed,0x9a,0x98, 0xa1,0x45,0x35,0x40,0x54,0x42,0x51,0x56,0x44,0x54,0x58,0x45,0x55,0x5e,0x4a,0x5c, 0x2a,0x22,0x2a,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,0x97,0x9a,0xa1,0x93,0x9d,0xb8,0x52,0x4f,0x7a,0x53,0x5e,0x88, 0x57,0x64,0x8c,0x53,0x5f,0x89,0x53,0x5d,0x88,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55, 0x60,0x8a,0x55,0x60,0x8a,0x56,0x63,0x8b,0x56,0x63,0x8a,0x58,0x65,0x8c,0x57,0x64, 0x8b,0x52,0x4f,0x7a,0x57,0x63,0x8b,0xbb,0xbf,0xcc,0x0a,0x0a,0x0b,0x00,0x00,0x00, 0x0e,0x0e,0x0e,0x23,0x23,0x23,0x0c,0x0c,0x0c,0x04,0x04,0x04,0x09,0x08,0x0a,0x15, 0x13,0x16,0x1e,0x1c,0x1f,0x1f,0x1e,0x20,0x20,0x1e,0x20,0x18,0x16,0x18,0x08,0x07, 0x0a,0x05,0x05,0x06,0x06,0x07,0x08,0x18,0x19,0x19,0x26,0x27,0x27,0x1d,0x1d,0x1e, 0x0a,0x0a,0x0c,0x27,0x27,0x29,0x1f,0x1f,0x21,0x08,0x08,0x0b,0x14,0x12,0x16,0x16, 0x14,0x1a,0x13,0x12,0x17,0x0e,0x0f,0x13,0x0c,0x0d,0x10,0x0a,0x0b,0x0e,0x09,0x0a, 0x0c,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x09,0x0a,0x0c, 0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0c,0x0f,0x0b,0x0c,0x0f,0x0a,0x0b,0x0e,0x0b, 0x0c,0x0f,0x0c,0x0d,0x10,0x0c,0x0e,0x11,0x0e,0x10,0x13,0x12,0x12,0x16,0x14,0x16, 0x1a,0x15,0x16,0x1a,0x14,0x16,0x1a,0x14,0x15,0x19,0x12,0x14,0x18,0x12,0x13,0x16, 0x12,0x12,0x16,0x1a,0x19,0x1e,0x2a,0x23,0x2a,0x25,0x1e,0x23,0x5c,0x59,0x5f,0x7a, 0x83,0xa1,0x5c,0x67,0x8c,0x58,0x64,0x8a,0x5a,0x64,0x8c,0x5a,0x65,0x8c,0x5b,0x66, 0x8f,0x5b,0x66,0x8f,0x5b,0x65,0x8d,0x5a,0x64,0x8c,0x58,0x63,0x8b,0x55,0x5f,0x89, 0x53,0x5e,0x87,0x62,0x52,0x70,0x53,0x51,0x79,0x2e,0x33,0x47,0x0b,0x0c,0x0f,0x0c, 0x0d,0x10,0x0a,0x0a,0x0d,0x08,0x09,0x0b,0x26,0x1f,0x29,0x8b,0x93,0xa9,0x50,0x5b, 0x7f,0x48,0x41,0x60,0x5d,0x52,0x78,0x5e,0x53,0x78,0x5d,0x52,0x78,0x5f,0x53,0x77, 0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x76,0x5e,0x53,0x76,0x5f, 0x54,0x76,0x5f,0x55,0x77,0x5e,0x56,0x76,0x5e,0x55,0x76,0x1b,0x1d,0x23,0x18,0x1a, 0x1f,0x18,0x1a,0x1f,0x17,0x19,0x1e,0x17,0x19,0x1e,0x16,0x17,0x1b,0x13,0x14,0x18, 0x12,0x12,0x16,0x15,0x15,0x19,0x97,0x89,0xba,0x5d,0x54,0x77,0x4a,0x43,0x5f,0x55, 0x4e,0x73,0x58,0x51,0x77,0x56,0x50,0x77,0x54,0x4f,0x77,0x52,0x4f,0x79,0x52,0x4f, 0x7a,0x52,0x53,0x7c,0x52,0x56,0x80,0x53,0x5d,0x84,0x55,0x5f,0x87,0x56,0x61,0x85, 0x4e,0x58,0x78,0x37,0x39,0x4d,0x4f,0x57,0x73,0x65,0x6f,0x90,0x67,0x71,0x91,0x6b, 0x74,0x94,0x6c,0x77,0x94,0x6e,0x77,0x95,0x70,0x7a,0x97,0x83,0x8d,0xad,0x51,0x57, 0x6e,0x26,0x24,0x30,0x2f,0x2a,0x36,0x31,0x2b,0x38,0x30,0x2a,0x37,0x2c,0x28,0x33, 0x26,0x22,0x2c,0x20,0x1f,0x2a,0x19,0x1b,0x24,0x19,0x1b,0x24,0x18,0x1a,0x23,0x18, 0x1a,0x22,0x17,0x1a,0x22,0x1c,0x1d,0x26,0x16,0x18,0x1f,0x16,0x17,0x1f,0x16,0x17, 0x1f,0x15,0x16,0x1e,0x13,0x15,0x1b,0x13,0x14,0x1b,0x13,0x14,0x1b,0x47,0x3c,0x4c, 0x4f,0x42,0x53,0x53,0x45,0x56,0x5d,0x64,0x86,0x4e,0x4f,0x77,0x56,0x4f,0x74,0x57, 0x50,0x74,0x57,0x50,0x75,0x59,0x50,0x76,0x59,0x50,0x76,0x5b,0x51,0x76,0x5b,0x51, 0x76,0x58,0x4d,0x70,0x48,0x3d,0x59,0x3d,0x32,0x4e,0x4a,0x50,0x6f,0x5d,0x65,0x7f, 0x08,0x08,0x0a,0x07,0x07,0x0a,0x29,0x21,0x29,0x39,0x2d,0x37,0x3a,0x2d,0x39,0x55, 0x60,0x86,0x50,0x4d,0x77,0x5d,0x51,0x74,0x5d,0x51,0x73,0x5e,0x51,0x74,0x5e,0x51, 0x74,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75, 0x5e,0x51,0x75,0x5e,0x4e,0x6d,0x4b,0x39,0x4f,0x47,0x35,0x4c,0x57,0x43,0x5d,0x5b, 0x59,0x85,0x11,0x11,0x17,0x12,0x13,0x1a,0x13,0x14,0x1b,0x14,0x15,0x1c,0x17,0x17, 0x1f,0x16,0x16,0x1e,0x16,0x16,0x1e,0x16,0x16,0x1e,0x15,0x16,0x1e,0x16,0x16,0x1e, 0x16,0x17,0x1e,0x16,0x17,0x1e,0x14,0x16,0x1c,0x13,0x15,0x1b,0x12,0x14,0x1a,0x12, 0x13,0x1a,0x12,0x13,0x1a,0x11,0x12,0x18,0x10,0x11,0x16,0x0f,0x10,0x16,0x0e,0x10, 0x15,0x0d,0x0e,0x13,0x0c,0x0d,0x12,0x0b,0x0c,0x10,0x0a,0x0c,0x0f,0x0a,0x0b,0x0e, 0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x08,0x09,0x0c,0x08,0x09,0x0b,0x07,0x07,0x0a,0x06, 0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05, 0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04, 0x02,0x03,0x04,0x02,0x02,0x02,0x23,0x26,0x2c,0x74,0x7f,0xa1,0x51,0x52,0x7d,0x5d, 0x52,0x78,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x68,0x5a,0x80,0x41,0x39,0x52,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,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,0x0c,0x0c,0x0c,0x3a,0x3a,0x3a,0x0c,0x0c, 0x0c,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x02,0x05,0x05,0x06,0x0e,0x0e,0x0f,0x28,0x29,0x2a,0x4e,0x4f,0x52,0x5e, 0x60,0x65,0x54,0x56,0x5c,0x29,0x2c,0x36,0x1d,0x1b,0x25,0x1a,0x1d,0x26,0x28,0x2a, 0x2f,0x17,0x18,0x1a,0x0b,0x0c,0x0d,0x06,0x06,0x06,0x05,0x05,0x06,0x03,0x03,0x04, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x33,0x3a,0x50,0x52,0x50,0x7b,0x64,0x53,0x74,0x52,0x50,0x7b,0x52,0x54, 0x7e,0x52,0x4f,0x7a,0x5d,0x45,0x5f,0x62,0x4a,0x66,0x64,0x53,0x74,0x5e,0x54,0x7a, 0x58,0x58,0x81,0x6b,0x75,0x99,0xdf,0xe1,0xea,0xd8,0xdb,0xe5,0xcf,0xd3,0xdf,0xce, 0xd2,0xdf,0xcb,0xcf,0xdd,0xc6,0xcb,0xd9,0xbe,0xc4,0xd3,0xb5,0xbc,0xcf,0xb8,0xbe, 0xcf,0xa5,0xad,0xc3,0x91,0x99,0xb4,0x65,0x71,0x96,0x53,0x5f,0x89,0x5c,0x69,0x90, 0x7a,0x84,0xa5,0x71,0x79,0x91,0x19,0x1a,0x1f,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,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x04, 0x04,0x06,0x04,0x04,0x06,0x0f,0x0f,0x14,0x69,0x73,0x91,0x50,0x4e,0x77,0x56,0x40, 0x5a,0x59,0x44,0x5f,0x59,0x50,0x73,0x5a,0x4f,0x71,0x5a,0x4e,0x70,0x58,0x4d,0x6e, 0x59,0x4d,0x6d,0x56,0x4b,0x6b,0x55,0x4a,0x69,0x53,0x49,0x68,0x56,0x48,0x67,0x56, 0x48,0x67,0x58,0x49,0x68,0x59,0x4a,0x68,0x5a,0x4c,0x6b,0x5d,0x4e,0x6d,0x5f,0x4f, 0x6d,0x61,0x50,0x6f,0x62,0x4e,0x6d,0x62,0x50,0x6f,0x61,0x4e,0x6c,0x60,0x4f,0x6c, 0x5e,0x4e,0x6c,0x58,0x4d,0x71,0x4c,0x49,0x72,0x55,0x4d,0x72,0x4e,0x4b,0x74,0x76, 0x7d,0x9a,0x27,0x1c,0x25,0x1f,0x16,0x1f,0x3b,0x37,0x4d,0x5a,0x52,0x79,0x62,0x4a, 0x66,0x5b,0x52,0x79,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x53,0x7e,0x52,0x5a,0x84, 0x53,0x5e,0x88,0x58,0x64,0x8c,0x5f,0x6c,0x92,0x53,0x50,0x79,0x57,0x50,0x79,0xd5, 0xd9,0xe3,0xb3,0xb4,0xbd,0x44,0x34,0x40,0x57,0x44,0x55,0x59,0x46,0x57,0x59,0x46, 0x57,0x61,0x4d,0x60,0x39,0x2f,0x3a,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,0x57,0x57,0x59,0xa7,0xaf,0xc4,0x5d,0x69, 0x91,0x57,0x50,0x79,0x58,0x64,0x8d,0x54,0x5f,0x89,0x52,0x5d,0x88,0x52,0x5d,0x88, 0x54,0x5f,0x89,0x55,0x60,0x8a,0x55,0x62,0x8b,0x55,0x60,0x8a,0x56,0x63,0x8b,0x57, 0x64,0x8b,0x57,0x64,0x8b,0x52,0x5d,0x85,0x52,0x4f,0x7a,0x92,0x9b,0xb6,0x5c,0x5d, 0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x12,0x2a,0x2a,0x2a,0x30,0x30,0x30, 0x30,0x2f,0x30,0x27,0x25,0x28,0x20,0x1e,0x21,0x1f,0x1d,0x1f,0x20,0x1f,0x21,0x2f, 0x2d,0x30,0x1c,0x1a,0x1d,0x12,0x10,0x13,0x26,0x25,0x27,0x24,0x24,0x26,0x0c,0x0d, 0x0e,0x05,0x06,0x06,0x06,0x06,0x07,0x21,0x21,0x23,0x2f,0x2f,0x30,0x1b,0x1b,0x1d, 0x09,0x09,0x0b,0x10,0x0e,0x13,0x1a,0x19,0x1e,0x1a,0x19,0x1f,0x16,0x16,0x1c,0x14, 0x14,0x1a,0x13,0x13,0x18,0x11,0x10,0x15,0x0f,0x0f,0x13,0x0c,0x0c,0x0f,0x0e,0x0e, 0x13,0x12,0x13,0x19,0x14,0x14,0x1a,0x12,0x12,0x18,0x16,0x14,0x1a,0x19,0x16,0x1c, 0x18,0x16,0x1c,0x13,0x12,0x18,0x0f,0x0f,0x15,0x0f,0x0f,0x15,0x10,0x10,0x16,0x10, 0x12,0x17,0x13,0x15,0x1a,0x15,0x16,0x1a,0x15,0x16,0x1a,0x15,0x16,0x1a,0x13,0x14, 0x18,0x12,0x12,0x16,0x0f,0x11,0x14,0x16,0x14,0x19,0x29,0x22,0x29,0x24,0x1e,0x23, 0x60,0x5d,0x61,0x7d,0x87,0xa4,0x5c,0x67,0x8c,0x58,0x63,0x8b,0x5a,0x65,0x8c,0x5a, 0x66,0x8e,0x5b,0x65,0x8d,0x5b,0x65,0x8d,0x5b,0x65,0x8d,0x5a,0x64,0x8c,0x57,0x63, 0x8b,0x55,0x61,0x89,0x54,0x5f,0x87,0x62,0x55,0x76,0x53,0x51,0x7a,0x2e,0x34,0x47, 0x0c,0x0d,0x10,0x0c,0x0d,0x10,0x0b,0x0c,0x0e,0x0a,0x0a,0x0d,0x2d,0x26,0x2f,0x8d, 0x93,0xa9,0x55,0x60,0x85,0x48,0x40,0x5f,0x5d,0x52,0x78,0x5d,0x53,0x78,0x5d,0x52, 0x78,0x5d,0x53,0x79,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x76, 0x5e,0x53,0x76,0x5f,0x54,0x76,0x5f,0x55,0x77,0x5f,0x56,0x76,0x5e,0x55,0x76,0x20, 0x20,0x28,0x18,0x1a,0x1f,0x17,0x19,0x1e,0x16,0x18,0x1e,0x16,0x17,0x1c,0x14,0x16, 0x1a,0x12,0x14,0x18,0x12,0x13,0x16,0x0f,0x10,0x13,0xa8,0x91,0xb2,0x5f,0x56,0x7b, 0x4c,0x45,0x62,0x56,0x4e,0x73,0x59,0x51,0x77,0x54,0x50,0x77,0x51,0x4f,0x78,0x52, 0x4f,0x79,0x52,0x4f,0x79,0x52,0x53,0x7c,0x52,0x56,0x80,0x53,0x5c,0x84,0x54,0x5e, 0x87,0x53,0x5e,0x82,0x4f,0x57,0x77,0x39,0x3d,0x51,0x35,0x34,0x45,0x6b,0x76,0x96, 0x66,0x71,0x92,0x68,0x73,0x92,0x6c,0x76,0x94,0x6c,0x76,0x94,0x6e,0x79,0x96,0x77, 0x82,0xa1,0x6e,0x77,0x94,0x29,0x26,0x32,0x30,0x2b,0x38,0x31,0x2b,0x38,0x2f,0x2a, 0x37,0x2b,0x27,0x34,0x1c,0x1d,0x26,0x17,0x18,0x21,0x17,0x19,0x21,0x1a,0x1c,0x25, 0x19,0x1a,0x23,0x19,0x1a,0x23,0x17,0x1a,0x22,0x19,0x1a,0x22,0x16,0x18,0x20,0x16, 0x18,0x1f,0x16,0x17,0x1e,0x15,0x16,0x1e,0x14,0x16,0x1d,0x13,0x15,0x1c,0x12,0x13, 0x1a,0x2d,0x28,0x33,0x5b,0x4d,0x62,0x5d,0x4d,0x63,0x62,0x5a,0x71,0x50,0x59,0x80, 0x53,0x4e,0x74,0x5a,0x50,0x74,0x5a,0x51,0x75,0x5b,0x51,0x76,0x5d,0x51,0x74,0x5d, 0x51,0x74,0x5d,0x51,0x74,0x5a,0x4d,0x70,0x49,0x3c,0x58,0x3c,0x31,0x48,0x48,0x4b, 0x6a,0x60,0x69,0x84,0x08,0x08,0x0a,0x07,0x07,0x0a,0x25,0x1e,0x25,0x38,0x2b,0x36, 0x37,0x2c,0x37,0x54,0x61,0x86,0x50,0x4d,0x77,0x5d,0x51,0x74,0x5e,0x51,0x74,0x5e, 0x51,0x74,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x5e,0x51,0x75,0x60,0x4f,0x70,0x4c,0x3a,0x51,0x47,0x36,0x4b, 0x55,0x44,0x5d,0x5d,0x5a,0x84,0x14,0x14,0x1a,0x14,0x14,0x1b,0x14,0x15,0x1c,0x15, 0x16,0x1d,0x17,0x17,0x1f,0x16,0x16,0x1e,0x16,0x17,0x1f,0x16,0x16,0x1e,0x16,0x18, 0x20,0x16,0x18,0x1f,0x16,0x17,0x1f,0x16,0x17,0x1e,0x15,0x16,0x1e,0x15,0x16,0x1e, 0x14,0x16,0x1d,0x12,0x14,0x1a,0x12,0x14,0x1a,0x12,0x12,0x19,0x10,0x12,0x17,0x0f, 0x11,0x16,0x0f,0x11,0x16,0x0e,0x10,0x15,0x0e,0x0e,0x13,0x0c,0x0e,0x12,0x0b,0x0d, 0x11,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x08,0x09,0x0b, 0x07,0x08,0x0a,0x07,0x08,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x04, 0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03, 0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x09,0x09,0x0a,0x7c,0x87,0xa7, 0x52,0x5d,0x86,0x5d,0x53,0x78,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x56,0x7c,0x6b,0x5e,0x86, 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,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,0x02,0x02,0x02,0x26, 0x26,0x26,0x26,0x26,0x27,0x2c,0x2c,0x2c,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x04, 0x05,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x06,0x06,0x07,0x0e,0x0e,0x0f, 0x1b,0x1c,0x1e,0x32,0x34,0x36,0x45,0x46,0x4a,0x38,0x3a,0x3e,0x21,0x22,0x25,0x1b, 0x1d,0x1e,0x15,0x16,0x17,0x0a,0x0a,0x0b,0x07,0x08,0x09,0x06,0x06,0x06,0x04,0x05, 0x05,0x03,0x04,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x16,0x19,0x25,0x5b,0x66,0x8d,0x64,0x52,0x73,0x53,0x50,0x7a,0x52, 0x52,0x7c,0x52,0x56,0x82,0x52,0x50,0x7b,0x5f,0x47,0x63,0x62,0x4a,0x66,0x64,0x53, 0x74,0x5c,0x54,0x7a,0x5a,0x5b,0x83,0x71,0x7b,0x9d,0xd7,0xd9,0xe3,0xd1,0xd5,0xe0, 0xd0,0xd5,0xe0,0xce,0xd1,0xdf,0xca,0xcf,0xdd,0xc4,0xc9,0xd8,0xbc,0xc2,0xd3,0xb0, 0xb7,0xcb,0xa3,0xac,0xc2,0x9a,0xa3,0xbc,0x93,0x9c,0xb8,0x90,0x99,0xb4,0x7c,0x88, 0xa8,0x53,0x5e,0x88,0x52,0x52,0x7c,0x66,0x73,0x98,0x86,0x90,0xac,0x43,0x47,0x55, 0x02,0x02,0x02,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x05,0x04,0x04,0x06,0x5c,0x62,0x78,0x56,0x60,0x87,0x5d, 0x46,0x62,0x50,0x39,0x51,0x61,0x51,0x72,0x5a,0x51,0x75,0x5a,0x51,0x74,0x59,0x50, 0x73,0x5a,0x4f,0x71,0x5a,0x4f,0x71,0x5a,0x4e,0x6f,0x58,0x4d,0x6e,0x58,0x4d,0x6d, 0x58,0x4c,0x6d,0x5c,0x4d,0x6c,0x5d,0x4d,0x6d,0x5e,0x4e,0x6d,0x5e,0x4f,0x70,0x60, 0x4f,0x6f,0x61,0x51,0x70,0x62,0x50,0x71,0x62,0x4f,0x6d,0x62,0x4f,0x6d,0x62,0x4d, 0x6c,0x61,0x4e,0x6c,0x60,0x4d,0x6d,0x5f,0x4f,0x71,0x4f,0x4c,0x74,0x4f,0x4c,0x75, 0x61,0x51,0x72,0x6a,0x75,0x98,0x33,0x29,0x35,0x1f,0x16,0x1e,0x2f,0x2c,0x3e,0x64, 0x53,0x76,0x62,0x4a,0x66,0x60,0x53,0x77,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x53, 0x7d,0x52,0x55,0x80,0x53,0x5e,0x88,0x56,0x63,0x8b,0x5e,0x6b,0x92,0x52,0x52,0x7d, 0x64,0x53,0x74,0xc4,0xc9,0xd8,0xcf,0xd1,0xdc,0x45,0x35,0x41,0x58,0x45,0x56,0x5e, 0x4b,0x5d,0x5d,0x4a,0x5c,0x62,0x4e,0x62,0x47,0x3a,0x49,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,0x0c,0x0c,0x0c,0xb4, 0xba,0xcb,0x7a,0x85,0xa7,0x5a,0x52,0x79,0x54,0x5f,0x8a,0x54,0x5f,0x89,0x53,0x5f, 0x89,0x53,0x5e,0x88,0x53,0x5f,0x89,0x55,0x60,0x8a,0x55,0x62,0x8b,0x56,0x62,0x8b, 0x56,0x62,0x8b,0x56,0x63,0x8b,0x57,0x63,0x8b,0x56,0x62,0x8a,0x53,0x4f,0x7a,0x63, 0x6e,0x93,0xaa,0xad,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02, 0x02,0x05,0x05,0x05,0x10,0x10,0x10,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x04, 0x02,0x03,0x04,0x0c,0x0c,0x0d,0x25,0x25,0x26,0x24,0x24,0x25,0x1d,0x1d,0x1f,0x06, 0x06,0x08,0x05,0x05,0x06,0x04,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x0c,0x0c, 0x0d,0x22,0x22,0x23,0x27,0x27,0x29,0x2a,0x2b,0x2d,0x0a,0x0a,0x0d,0x0f,0x0f,0x13, 0x17,0x16,0x1d,0x1f,0x1d,0x25,0x26,0x23,0x2d,0x28,0x25,0x2f,0x2a,0x25,0x2e,0x28, 0x25,0x2d,0x26,0x24,0x2c,0x29,0x27,0x2f,0x2d,0x2a,0x35,0x2c,0x2a,0x35,0x29,0x25, 0x2e,0x27,0x23,0x2d,0x26,0x23,0x2b,0x1f,0x1d,0x24,0x15,0x14,0x1a,0x11,0x11,0x16, 0x16,0x15,0x1c,0x1b,0x19,0x21,0x17,0x16,0x1e,0x13,0x15,0x1b,0x14,0x16,0x1a,0x14, 0x15,0x19,0x12,0x14,0x18,0x11,0x12,0x16,0x0f,0x11,0x14,0x13,0x12,0x16,0x2b,0x24, 0x2c,0x28,0x20,0x26,0x62,0x5e,0x65,0x7a,0x85,0xa2,0x5a,0x67,0x8c,0x58,0x63,0x8b, 0x59,0x64,0x8b,0x5a,0x65,0x8c,0x5a,0x65,0x8c,0x59,0x64,0x8b,0x59,0x64,0x8b,0x59, 0x64,0x8b,0x56,0x63,0x8a,0x55,0x5f,0x88,0x53,0x5f,0x87,0x63,0x54,0x76,0x53,0x51, 0x79,0x2e,0x33,0x44,0x0e,0x0e,0x12,0x0c,0x0e,0x11,0x0b,0x0c,0x0e,0x0a,0x0a,0x0d, 0x2a,0x24,0x2d,0x8b,0x92,0xa6,0x5b,0x66,0x89,0x45,0x3e,0x5e,0x5d,0x52,0x78,0x5e, 0x53,0x78,0x5d,0x53,0x79,0x5d,0x53,0x79,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53, 0x77,0x5f,0x53,0x76,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x55,0x76,0x5f,0x55,0x77, 0x5e,0x56,0x76,0x23,0x22,0x2c,0x17,0x19,0x1e,0x17,0x1a,0x1e,0x17,0x19,0x1e,0x16, 0x17,0x1c,0x14,0x16,0x1a,0x12,0x14,0x18,0x11,0x12,0x15,0x0f,0x10,0x13,0xa3,0x8f, 0xa7,0x62,0x57,0x7d,0x4a,0x45,0x63,0x56,0x4d,0x71,0x58,0x51,0x77,0x54,0x50,0x77, 0x54,0x4f,0x77,0x52,0x4f,0x79,0x52,0x4f,0x79,0x52,0x53,0x7b,0x52,0x55,0x7f,0x53, 0x5a,0x82,0x54,0x5f,0x87,0x52,0x5c,0x7f,0x4c,0x57,0x77,0x3c,0x41,0x58,0x21,0x1e, 0x22,0x68,0x71,0x8c,0x67,0x73,0x92,0x68,0x72,0x90,0x6a,0x74,0x93,0x6c,0x76,0x93, 0x6c,0x76,0x93,0x6f,0x7b,0x98,0x7b,0x86,0xa8,0x22,0x21,0x2d,0x2c,0x28,0x35,0x2e, 0x2a,0x36,0x29,0x26,0x32,0x22,0x21,0x2d,0x1e,0x1f,0x29,0x1b,0x1e,0x28,0x16,0x18, 0x1f,0x17,0x19,0x21,0x1d,0x1d,0x26,0x1c,0x1c,0x26,0x1a,0x1a,0x24,0x18,0x19,0x22, 0x17,0x19,0x21,0x16,0x18,0x20,0x16,0x17,0x1e,0x15,0x16,0x1e,0x15,0x16,0x1e,0x13, 0x15,0x1c,0x13,0x15,0x1b,0x12,0x13,0x1a,0x5b,0x4f,0x64,0x63,0x53,0x6a,0x61,0x52, 0x67,0x55,0x5b,0x7e,0x52,0x4d,0x73,0x5b,0x51,0x73,0x5c,0x51,0x73,0x5d,0x51,0x73, 0x5d,0x51,0x74,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5a,0x4e,0x71,0x49,0x3d,0x57,0x3b, 0x2f,0x47,0x45,0x45,0x67,0x65,0x6c,0x88,0x08,0x08,0x0a,0x07,0x07,0x0a,0x22,0x1b, 0x22,0x38,0x2b,0x36,0x36,0x2b,0x36,0x54,0x60,0x85,0x50,0x4d,0x77,0x5d,0x51,0x74, 0x5e,0x51,0x74,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e, 0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x4f,0x70,0x4d,0x3a, 0x52,0x48,0x36,0x4c,0x54,0x43,0x5b,0x5d,0x59,0x82,0x19,0x1a,0x22,0x15,0x15,0x1c, 0x16,0x16,0x1e,0x16,0x16,0x1e,0x17,0x17,0x20,0x17,0x18,0x20,0x17,0x19,0x22,0x17, 0x18,0x20,0x17,0x18,0x20,0x16,0x18,0x20,0x17,0x19,0x21,0x17,0x18,0x20,0x16,0x17, 0x1f,0x16,0x17,0x1e,0x15,0x16,0x1e,0x14,0x16,0x1d,0x13,0x15,0x1b,0x12,0x13,0x1a, 0x11,0x12,0x18,0x10,0x12,0x17,0x0f,0x11,0x16,0x0e,0x10,0x15,0x0e,0x10,0x15,0x0d, 0x0e,0x13,0x0c,0x0e,0x12,0x0b,0x0d,0x11,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a, 0x0d,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x07,0x08,0x0a,0x07,0x08,0x0a,0x06,0x06,0x09, 0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x03,0x04,0x05,0x03, 0x04,0x05,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02, 0x03,0x80,0x88,0xa3,0x57,0x64,0x8b,0x59,0x52,0x78,0x5f,0x53,0x77,0x5f,0x53,0x77, 0x5f,0x53,0x77,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x54, 0x79,0x84,0x73,0xa4,0x02,0x02,0x02,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,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,0x06,0x06,0x07,0x14,0x14,0x15,0x28, 0x28,0x28,0x0c,0x0c,0x0c,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x03,0x05,0x05,0x06,0x08,0x09,0x0a,0x10,0x11,0x12,0x1b,0x1c,0x1e,0x1c,0x1d,0x1f, 0x0d,0x0e,0x0f,0x0b,0x0b,0x0c,0x0b,0x0b,0x0d,0x08,0x08,0x09,0x06,0x07,0x08,0x06, 0x06,0x07,0x04,0x04,0x05,0x04,0x04,0x05,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x02, 0x02,0x00,0x00,0x00,0x04,0x04,0x07,0x52,0x5e,0x80,0x52,0x4f,0x7a,0x64,0x52,0x71, 0x52,0x4f,0x7a,0x52,0x52,0x7d,0x52,0x55,0x81,0x52,0x50,0x7c,0x5f,0x47,0x64,0x63, 0x4b,0x67,0x65,0x54,0x75,0x57,0x53,0x7b,0x5b,0x5d,0x85,0x90,0x99,0xb4,0xd6,0xd9, 0xe3,0xcf,0xd3,0xdf,0xd0,0xd3,0xdf,0xce,0xd2,0xdf,0xc8,0xce,0xdb,0xc3,0xc9,0xd8, 0xbb,0xc1,0xd2,0xb1,0xb7,0xca,0xa2,0xab,0xc2,0x9b,0xa4,0xbc,0x95,0x9f,0xb8,0x91, 0x9a,0xb5,0x8e,0x98,0xb3,0x88,0x92,0xb0,0x67,0x73,0x99,0x52,0x54,0x80,0x5f,0x6c, 0x93,0x81,0x8b,0xaa,0x66,0x6e,0x87,0x14,0x15,0x1a,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x03,0x05,0x38,0x3d,0x4b,0x66,0x70,0x94, 0x61,0x51,0x74,0x49,0x35,0x4b,0x5f,0x48,0x64,0x5b,0x51,0x75,0x5b,0x51,0x75,0x5b, 0x51,0x76,0x5d,0x51,0x73,0x5c,0x51,0x73,0x5e,0x51,0x73,0x5c,0x50,0x72,0x5b,0x4f, 0x71,0x5d,0x4f,0x71,0x5b,0x4f,0x71,0x5f,0x4f,0x70,0x60,0x50,0x71,0x60,0x50,0x72, 0x61,0x50,0x72,0x61,0x51,0x72,0x62,0x51,0x73,0x62,0x52,0x71,0x63,0x51,0x71,0x63, 0x4e,0x6c,0x62,0x4f,0x6d,0x62,0x4e,0x6c,0x62,0x4d,0x6c,0x62,0x51,0x72,0x58,0x50, 0x77,0x50,0x50,0x7b,0x62,0x4d,0x6c,0x5c,0x68,0x8f,0x4b,0x44,0x55,0x1f,0x16,0x1f, 0x2b,0x27,0x38,0x5b,0x52,0x79,0x64,0x4f,0x6d,0x5d,0x52,0x79,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x52,0x7c,0x52,0x55,0x80,0x53,0x5e,0x88,0x56,0x62,0x8b,0x5d,0x6a, 0x91,0x52,0x5c,0x85,0x64,0x50,0x6f,0xab,0xb2,0xc7,0xdb,0xde,0xe7,0x4e,0x40,0x4c, 0x5d,0x4a,0x5c,0x61,0x4e,0x60,0x61,0x4e,0x60,0x66,0x52,0x66,0x54,0x45,0x57,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,0x8e,0x90,0x96,0x90,0x99,0xb4,0x52,0x58,0x83,0x52,0x4f,0x7a,0x55, 0x62,0x8a,0x53,0x5e,0x88,0x52,0x5d,0x88,0x53,0x5e,0x89,0x54,0x5f,0x89,0x54,0x60, 0x8a,0x55,0x60,0x8a,0x56,0x63,0x8b,0x56,0x63,0x8b,0x57,0x63,0x8b,0x58,0x64,0x8b, 0x52,0x55,0x80,0x52,0x4f,0x7a,0xa3,0xab,0xc1,0x35,0x35,0x36,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x30,0x31,0x32,0x20,0x20,0x21, 0x05,0x06,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x05, 0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x12,0x12,0x14,0x34,0x34,0x36,0x08,0x08, 0x0b,0x0b,0x0b,0x0e,0x12,0x11,0x16,0x1d,0x1a,0x21,0x2a,0x26,0x2f,0x2d,0x29,0x32, 0x2f,0x2a,0x34,0x32,0x2d,0x37,0x31,0x2c,0x36,0x34,0x30,0x3c,0x3c,0x3a,0x4b,0x3c, 0x3b,0x4f,0x36,0x34,0x45,0x32,0x2e,0x3a,0x2f,0x2b,0x36,0x2d,0x2a,0x33,0x26,0x24, 0x2d,0x1a,0x18,0x1f,0x12,0x12,0x18,0x19,0x16,0x1e,0x22,0x1e,0x26,0x1d,0x1a,0x23, 0x16,0x15,0x1c,0x12,0x13,0x1a,0x12,0x13,0x18,0x11,0x12,0x16,0x0f,0x11,0x14,0x0f, 0x10,0x14,0x2d,0x24,0x2c,0x2b,0x23,0x29,0x5b,0x59,0x5e,0x79,0x84,0xa2,0x5a,0x67, 0x8c,0x59,0x63,0x8a,0x59,0x63,0x8b,0x59,0x65,0x8c,0x59,0x65,0x8c,0x5a,0x65,0x8c, 0x59,0x64,0x8b,0x57,0x63,0x8b,0x56,0x63,0x8a,0x55,0x5f,0x88,0x54,0x5e,0x87,0x60, 0x55,0x77,0x53,0x51,0x79,0x2f,0x34,0x44,0x0e,0x0f,0x12,0x0e,0x0e,0x12,0x0b,0x0c, 0x0e,0x0a,0x0a,0x0d,0x26,0x20,0x28,0x84,0x89,0x9e,0x5d,0x69,0x89,0x42,0x3f,0x5e, 0x5d,0x52,0x77,0x5e,0x53,0x78,0x5e,0x53,0x79,0x5d,0x53,0x79,0x5f,0x53,0x77,0x5f, 0x53,0x77,0x60,0x53,0x77,0x5f,0x53,0x76,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x55, 0x77,0x60,0x56,0x77,0x5e,0x56,0x77,0x27,0x27,0x31,0x18,0x1a,0x20,0x17,0x1a,0x1e, 0x16,0x18,0x1d,0x16,0x17,0x1b,0x14,0x15,0x1a,0x12,0x14,0x18,0x11,0x12,0x16,0x0e, 0x10,0x12,0x9a,0x8b,0x9c,0x68,0x5e,0x87,0x4c,0x45,0x62,0x53,0x4c,0x6f,0x58,0x51, 0x77,0x55,0x50,0x77,0x53,0x50,0x77,0x52,0x4f,0x79,0x52,0x4f,0x79,0x52,0x53,0x7b, 0x52,0x53,0x7d,0x53,0x5a,0x82,0x54,0x5e,0x86,0x51,0x5b,0x7d,0x4d,0x57,0x78,0x40, 0x45,0x5c,0x20,0x1d,0x22,0x43,0x46,0x59,0x76,0x80,0xa3,0x67,0x71,0x91,0x69,0x72, 0x92,0x69,0x73,0x91,0x6b,0x75,0x92,0x6c,0x75,0x92,0x81,0x8d,0xb0,0x30,0x34,0x44, 0x20,0x20,0x2b,0x22,0x22,0x2e,0x22,0x22,0x2e,0x20,0x20,0x2b,0x1d,0x1e,0x28,0x20, 0x22,0x2e,0x1a,0x1c,0x26,0x1b,0x1a,0x24,0x21,0x1e,0x28,0x28,0x24,0x2f,0x23,0x21, 0x2c,0x1d,0x1d,0x27,0x1a,0x1a,0x22,0x17,0x18,0x20,0x16,0x17,0x1f,0x16,0x17,0x1e, 0x16,0x17,0x1e,0x13,0x15,0x1c,0x13,0x15,0x1c,0x12,0x13,0x1a,0x19,0x19,0x21,0x63, 0x54,0x6a,0x5e,0x50,0x64,0x5e,0x54,0x6c,0x4f,0x53,0x7b,0x59,0x50,0x74,0x5c,0x51, 0x74,0x5d,0x51,0x73,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5b,0x4e,0x71, 0x48,0x3c,0x59,0x3a,0x2d,0x45,0x43,0x43,0x62,0x78,0x7f,0x98,0x08,0x08,0x0a,0x08, 0x08,0x0a,0x1c,0x18,0x1e,0x38,0x2a,0x35,0x36,0x29,0x35,0x54,0x5f,0x85,0x50,0x4d, 0x77,0x5b,0x51,0x75,0x5e,0x51,0x74,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x51,0x75, 0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x60, 0x4f,0x71,0x4f,0x3b,0x54,0x46,0x35,0x4d,0x52,0x41,0x59,0x62,0x59,0x81,0x1b,0x1b, 0x26,0x15,0x16,0x1d,0x17,0x18,0x20,0x17,0x18,0x21,0x18,0x19,0x22,0x18,0x19,0x22, 0x19,0x1a,0x22,0x19,0x1a,0x23,0x18,0x19,0x22,0x18,0x19,0x22,0x19,0x1a,0x22,0x17, 0x19,0x21,0x16,0x18,0x20,0x16,0x17,0x1f,0x16,0x17,0x1e,0x16,0x17,0x1e,0x14,0x16, 0x1d,0x13,0x15,0x1b,0x12,0x14,0x1a,0x11,0x12,0x18,0x10,0x12,0x17,0x0f,0x11,0x16, 0x0e,0x10,0x15,0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0c,0x0e,0x12,0x0b,0x0d,0x11,0x0b, 0x0c,0x10,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x08,0x09,0x0c,0x07,0x08,0x0b,0x07,0x08, 0x0a,0x06,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x04,0x06, 0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02, 0x03,0x04,0x02,0x02,0x03,0x69,0x6e,0x7f,0x65,0x71,0x97,0x51,0x4f,0x79,0x5f,0x53, 0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x74,0x64,0x8f,0x17,0x17,0x17,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,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,0x24,0x24,0x24,0x0d,0x0d,0x0d,0x00,0x00,0x00,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x03,0x03,0x04,0x04,0x05,0x06,0x05,0x06, 0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x05,0x05,0x06, 0x05,0x06,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x04,0x02, 0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x2e,0x34,0x4b,0x57,0x63,0x8b,0x64,0x4d, 0x6a,0x5a,0x52,0x79,0x52,0x50,0x7b,0x52,0x53,0x7d,0x52,0x57,0x83,0x52,0x55,0x80, 0x63,0x4b,0x67,0x62,0x4b,0x66,0x65,0x54,0x75,0x57,0x54,0x7b,0x5b,0x62,0x8b,0xb1, 0xb8,0xcb,0xd3,0xd7,0xe2,0xcf,0xd2,0xdf,0xce,0xd2,0xde,0xce,0xd2,0xdf,0xc8,0xce, 0xdb,0xc3,0xc9,0xd8,0xba,0xc0,0xd1,0xac,0xb2,0xc7,0xa1,0xaa,0xc1,0x9d,0xa5,0xbe, 0x95,0x9f,0xb8,0x93,0x9c,0xb7,0x90,0x99,0xb4,0x8c,0x95,0xb2,0x8d,0x96,0xb3,0x85, 0x90,0xad,0x60,0x6c,0x93,0x5b,0x67,0x8e,0x5d,0x6a,0x91,0x71,0x7d,0x9e,0x3b,0x40, 0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x02,0x03,0x1e,0x21,0x2b,0x60,0x6c, 0x8f,0x50,0x4d,0x79,0x4e,0x39,0x4f,0x55,0x3f,0x58,0x5e,0x51,0x74,0x5c,0x51,0x75, 0x5c,0x51,0x75,0x5c,0x51,0x75,0x5b,0x51,0x76,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5d, 0x51,0x73,0x5f,0x51,0x73,0x5d,0x51,0x73,0x5d,0x51,0x73,0x61,0x51,0x72,0x62,0x51, 0x73,0x61,0x51,0x74,0x62,0x52,0x74,0x62,0x51,0x73,0x62,0x52,0x72,0x63,0x52,0x72, 0x63,0x51,0x71,0x63,0x4f,0x6e,0x63,0x4f,0x70,0x63,0x4e,0x6d,0x63,0x4e,0x6d,0x63, 0x52,0x72,0x5c,0x51,0x78,0x51,0x4f,0x7a,0x63,0x52,0x73,0x52,0x57,0x81,0x5e,0x5d, 0x75,0x1f,0x16,0x1f,0x25,0x21,0x31,0x5a,0x52,0x79,0x64,0x4d,0x6b,0x60,0x53,0x77, 0x55,0x50,0x79,0x52,0x4f,0x7a,0x52,0x50,0x7c,0x52,0x54,0x80,0x52,0x5d,0x88,0x55, 0x60,0x8a,0x5c,0x67,0x90,0x56,0x62,0x8b,0x64,0x52,0x72,0x8c,0x96,0xb3,0xe1,0xe3, 0xea,0x62,0x57,0x63,0x5f,0x4c,0x5e,0x65,0x51,0x65,0x64,0x50,0x64,0x66,0x52,0x66, 0x62,0x51,0x66,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,0x45,0x45,0x46,0xaf,0xb5,0xca,0x66,0x73,0x98, 0x5d,0x52,0x79,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53, 0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x56,0x63,0x8b,0x56,0x63, 0x8b,0x57,0x63,0x8b,0x53,0x5e,0x88,0x5d,0x52,0x79,0x6a,0x75,0x99,0x86,0x88,0x8e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03, 0x04,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x05,0x06,0x04,0x04,0x06, 0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x05,0x06,0x07,0x0b,0x0a,0x0d,0x30, 0x2e,0x32,0x1e,0x1c,0x20,0x16,0x13,0x18,0x19,0x16,0x1c,0x1e,0x1a,0x22,0x26,0x20, 0x2a,0x24,0x20,0x28,0x1f,0x1d,0x26,0x22,0x20,0x29,0x2a,0x26,0x30,0x28,0x25,0x2e, 0x30,0x2d,0x3a,0x38,0x36,0x48,0x3b,0x3e,0x51,0x37,0x38,0x4a,0x3d,0x38,0x49,0x40, 0x39,0x46,0x3e,0x38,0x45,0x36,0x32,0x40,0x27,0x22,0x2d,0x1c,0x18,0x20,0x1d,0x1a, 0x22,0x21,0x1d,0x25,0x22,0x1e,0x26,0x1e,0x1a,0x23,0x16,0x16,0x1e,0x13,0x12,0x1a, 0x11,0x11,0x17,0x0f,0x10,0x15,0x2b,0x24,0x2b,0x2a,0x24,0x2a,0x5a,0x57,0x5c,0x7a, 0x85,0xa2,0x5a,0x67,0x8c,0x56,0x61,0x89,0x59,0x63,0x8b,0x57,0x64,0x8b,0x59,0x65, 0x8c,0x59,0x64,0x8b,0x59,0x64,0x8b,0x59,0x64,0x8b,0x57,0x62,0x8a,0x56,0x62,0x89, 0x54,0x5f,0x87,0x61,0x54,0x76,0x53,0x51,0x79,0x2e,0x34,0x44,0x0e,0x0f,0x12,0x0e, 0x0f,0x12,0x0c,0x0e,0x10,0x0a,0x0b,0x0e,0x25,0x20,0x27,0x7f,0x83,0x97,0x63,0x6d, 0x8f,0x41,0x3e,0x5e,0x5d,0x52,0x77,0x5e,0x53,0x78,0x5e,0x53,0x79,0x5e,0x53,0x79, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x54,0x76,0x5f,0x53,0x76,0x5f, 0x54,0x76,0x5f,0x55,0x77,0x5f,0x56,0x77,0x5f,0x57,0x77,0x2c,0x2b,0x36,0x18,0x1a, 0x1f,0x17,0x1a,0x1e,0x17,0x1a,0x1e,0x16,0x17,0x1c,0x14,0x15,0x1a,0x12,0x12,0x16, 0x10,0x11,0x15,0x0e,0x10,0x12,0x8d,0x82,0x8f,0x6e,0x64,0x8f,0x4d,0x44,0x62,0x54, 0x4c,0x6d,0x58,0x51,0x77,0x56,0x50,0x77,0x55,0x50,0x78,0x53,0x4f,0x79,0x52,0x4f, 0x79,0x52,0x51,0x7b,0x52,0x54,0x7d,0x53,0x5a,0x82,0x54,0x5e,0x86,0x50,0x59,0x7d, 0x4d,0x57,0x76,0x41,0x48,0x61,0x21,0x1e,0x23,0x28,0x26,0x2f,0x7e,0x8a,0xae,0x6a, 0x74,0x96,0x69,0x72,0x91,0x6a,0x73,0x91,0x69,0x73,0x90,0x68,0x73,0x90,0x77,0x82, 0xa2,0x54,0x5c,0x74,0x1e,0x20,0x2a,0x22,0x22,0x2e,0x27,0x26,0x32,0x2b,0x29,0x37, 0x24,0x23,0x2f,0x25,0x26,0x35,0x39,0x3f,0x56,0x28,0x25,0x31,0x2f,0x29,0x35,0x2d, 0x28,0x32,0x2f,0x29,0x34,0x2b,0x26,0x32,0x23,0x21,0x2c,0x1e,0x1d,0x27,0x19,0x19, 0x22,0x16,0x17,0x1f,0x16,0x16,0x1e,0x16,0x17,0x1e,0x14,0x16,0x1c,0x13,0x15,0x1b, 0x12,0x13,0x1a,0x58,0x4b,0x60,0x60,0x51,0x67,0x5e,0x4e,0x62,0x5e,0x67,0x87,0x50, 0x4d,0x74,0x5c,0x51,0x73,0x5c,0x51,0x73,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5d,0x51, 0x74,0x5b,0x4d,0x72,0x49,0x3c,0x59,0x3a,0x2d,0x43,0x43,0x43,0x63,0x6d,0x74,0x90, 0x08,0x08,0x0b,0x08,0x08,0x0b,0x1a,0x15,0x1c,0x36,0x2a,0x34,0x33,0x27,0x30,0x53, 0x5c,0x84,0x50,0x4e,0x77,0x5b,0x51,0x76,0x5e,0x51,0x74,0x5d,0x51,0x74,0x5e,0x51, 0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x60,0x51,0x72,0x51,0x3d,0x56,0x43,0x33,0x4a,0x54,0x42,0x5b,0x64, 0x59,0x80,0x20,0x21,0x2c,0x16,0x17,0x1f,0x18,0x19,0x22,0x19,0x1a,0x23,0x19,0x1a, 0x23,0x1a,0x1a,0x24,0x1a,0x1a,0x24,0x1a,0x1b,0x25,0x1a,0x1c,0x25,0x19,0x1a,0x23, 0x19,0x1a,0x22,0x18,0x1a,0x22,0x18,0x1a,0x22,0x17,0x1a,0x22,0x16,0x18,0x20,0x16, 0x18,0x1f,0x15,0x17,0x1e,0x14,0x16,0x1d,0x12,0x14,0x1a,0x12,0x13,0x1a,0x11,0x12, 0x18,0x10,0x12,0x17,0x10,0x12,0x17,0x0e,0x10,0x15,0x0e,0x0f,0x13,0x0d,0x0e,0x12, 0x0c,0x0d,0x11,0x0b,0x0c,0x10,0x0a,0x0c,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09, 0x0a,0x0c,0x07,0x08,0x0b,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06, 0x08,0x06,0x06,0x08,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04, 0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x42,0x44,0x4c,0x7f,0x89,0xa8,0x51, 0x54,0x7c,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x52, 0x76,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x69,0x59,0x81,0x3e,0x35,0x48,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,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,0x1a,0x1a,0x1a,0x12,0x12,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0d,0x21,0x21,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x02,0x03,0x04, 0x02,0x02,0x03,0x02,0x02,0x02,0x00,0x00,0x00,0x10,0x11,0x19,0x5a,0x65,0x8d,0x5f, 0x53,0x77,0x64,0x50,0x6f,0x52,0x4f,0x7a,0x52,0x50,0x7c,0x52,0x53,0x7d,0x52,0x57, 0x82,0x52,0x58,0x83,0x63,0x4b,0x69,0x63,0x4c,0x69,0x64,0x54,0x77,0x56,0x53,0x7c, 0x5c,0x66,0x8e,0xc7,0xcb,0xda,0xd3,0xd8,0xe1,0xcf,0xd3,0xdf,0xcf,0xd3,0xdf,0xcc, 0xd1,0xde,0xc8,0xcc,0xda,0xc2,0xc8,0xd7,0xba,0xc0,0xd1,0xad,0xb4,0xc9,0xa1,0xaa, 0xc1,0x9b,0xa4,0xbc,0x96,0xa0,0xb9,0x94,0x9d,0xb8,0x90,0x99,0xb4,0x8e,0x98,0xb3, 0x90,0x99,0xb4,0x92,0x9b,0xb7,0x8c,0x96,0xb2,0x73,0x7e,0xa1,0x5a,0x65,0x8d,0x52, 0x50,0x7c,0x5f,0x6b,0x92,0x5c,0x66,0x80,0x11,0x13,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x12,0x15,0x1c,0x55, 0x5e,0x83,0x50,0x50,0x7b,0x56,0x40,0x59,0x55,0x3f,0x57,0x5e,0x51,0x74,0x5c,0x51, 0x76,0x5c,0x51,0x76,0x5c,0x51,0x75,0x5c,0x51,0x75,0x5e,0x51,0x73,0x5e,0x51,0x73, 0x5e,0x51,0x73,0x5d,0x51,0x73,0x60,0x51,0x74,0x5c,0x51,0x76,0x5e,0x51,0x74,0x60, 0x51,0x75,0x62,0x52,0x74,0x62,0x52,0x74,0x62,0x51,0x74,0x62,0x52,0x73,0x62,0x52, 0x73,0x63,0x52,0x72,0x63,0x52,0x72,0x63,0x51,0x70,0x64,0x50,0x6f,0x64,0x4f,0x6d, 0x64,0x4f,0x6e,0x64,0x52,0x72,0x62,0x53,0x77,0x52,0x4f,0x7a,0x5b,0x52,0x79,0x55, 0x50,0x79,0x65,0x6b,0x8a,0x1f,0x16,0x1f,0x24,0x20,0x2f,0x55,0x50,0x79,0x62,0x4a, 0x66,0x62,0x53,0x77,0x57,0x50,0x79,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x54,0x80, 0x52,0x5d,0x86,0x55,0x62,0x8b,0x5a,0x65,0x8d,0x5c,0x67,0x90,0x64,0x53,0x75,0x72, 0x7d,0xa0,0xe6,0xe8,0xee,0x73,0x6b,0x78,0x62,0x4e,0x62,0x68,0x53,0x68,0x67,0x53, 0x67,0x69,0x54,0x69,0x71,0x61,0x7a,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,0x03,0x03,0x03,0xc8,0xcb, 0xd1,0x86,0x91,0xaf,0x56,0x50,0x79,0x52,0x53,0x7d,0x53,0x5e,0x88,0x52,0x5d,0x88, 0x53,0x5e,0x88,0x53,0x5e,0x89,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54,0x60,0x8a,0x55, 0x60,0x8a,0x56,0x62,0x8b,0x56,0x62,0x8a,0x56,0x62,0x8a,0x52,0x4f,0x7b,0x52,0x52, 0x7c,0x9d,0xa5,0xba,0x12,0x12,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04, 0x05,0x04,0x04,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07, 0x05,0x06,0x06,0x11,0x11,0x13,0x0d,0x0d,0x10,0x0e,0x0c,0x10,0x17,0x15,0x1b,0x1b, 0x18,0x1f,0x20,0x1b,0x23,0x18,0x16,0x1c,0x14,0x13,0x18,0x16,0x16,0x1b,0x19,0x16, 0x1e,0x14,0x13,0x19,0x18,0x16,0x1d,0x22,0x20,0x2a,0x32,0x33,0x42,0x3f,0x42,0x51, 0x45,0x4a,0x5a,0x3d,0x3d,0x50,0x45,0x45,0x58,0x48,0x4e,0x63,0x3e,0x3e,0x52,0x34, 0x2e,0x3b,0x23,0x1f,0x28,0x1e,0x1a,0x22,0x1d,0x1c,0x26,0x20,0x1f,0x2a,0x22,0x1e, 0x27,0x21,0x1d,0x25,0x20,0x1c,0x24,0x15,0x15,0x1c,0x28,0x23,0x2b,0x2c,0x24,0x2c, 0x5a,0x57,0x5c,0x77,0x82,0xa0,0x59,0x65,0x8b,0x56,0x62,0x89,0x56,0x62,0x8a,0x59, 0x63,0x8b,0x58,0x64,0x8b,0x59,0x64,0x8b,0x5a,0x64,0x8b,0x57,0x63,0x8a,0x56,0x62, 0x8a,0x57,0x63,0x89,0x55,0x60,0x87,0x5e,0x55,0x76,0x53,0x51,0x79,0x2b,0x31,0x42, 0x0f,0x10,0x14,0x0f,0x10,0x13,0x0d,0x0e,0x11,0x0a,0x0a,0x0d,0x21,0x1c,0x23,0x79, 0x7d,0x8f,0x63,0x6d,0x90,0x3f,0x3e,0x5f,0x5d,0x52,0x77,0x5e,0x53,0x78,0x5e,0x53, 0x78,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x54,0x76, 0x60,0x53,0x76,0x5f,0x54,0x76,0x5f,0x55,0x77,0x5f,0x56,0x77,0x5f,0x57,0x78,0x2f, 0x2d,0x39,0x19,0x1a,0x20,0x19,0x1a,0x20,0x18,0x1a,0x1e,0x16,0x17,0x1c,0x14,0x16, 0x1a,0x12,0x12,0x16,0x0f,0x11,0x14,0x0e,0x0e,0x12,0x80,0x79,0x82,0x76,0x69,0x9a, 0x4f,0x47,0x65,0x53,0x4b,0x6d,0x58,0x51,0x77,0x55,0x50,0x77,0x55,0x50,0x78,0x53, 0x4f,0x79,0x52,0x4f,0x79,0x52,0x50,0x7a,0x53,0x54,0x7d,0x53,0x57,0x80,0x53,0x5e, 0x84,0x50,0x59,0x7c,0x4c,0x56,0x75,0x44,0x4b,0x66,0x23,0x1e,0x23,0x24,0x20,0x26, 0x52,0x57,0x6f,0x75,0x81,0xa6,0x67,0x71,0x90,0x68,0x72,0x91,0x69,0x73,0x91,0x68, 0x73,0x90,0x6c,0x77,0x95,0x6f,0x7b,0x9b,0x1f,0x21,0x2c,0x28,0x26,0x33,0x30,0x2b, 0x39,0x33,0x2f,0x3d,0x2d,0x29,0x36,0x2d,0x2c,0x3f,0x4f,0x57,0x78,0x40,0x3e,0x52, 0x38,0x31,0x3e,0x38,0x32,0x3e,0x30,0x2a,0x35,0x2e,0x28,0x33,0x2e,0x28,0x34,0x2b, 0x26,0x32,0x22,0x20,0x2b,0x1c,0x1b,0x25,0x19,0x18,0x21,0x16,0x16,0x1e,0x15,0x16, 0x1d,0x13,0x15,0x1c,0x13,0x14,0x1a,0x21,0x1f,0x28,0x62,0x52,0x69,0x5f,0x50,0x66, 0x6e,0x63,0x7b,0x4f,0x58,0x7e,0x5a,0x51,0x74,0x5c,0x51,0x74,0x5d,0x51,0x73,0x5d, 0x51,0x74,0x5d,0x51,0x74,0x5b,0x4d,0x72,0x49,0x3c,0x59,0x3c,0x2d,0x43,0x41,0x41, 0x5e,0x66,0x6e,0x8e,0x09,0x09,0x0b,0x09,0x09,0x0c,0x15,0x12,0x17,0x37,0x2a,0x35, 0x32,0x27,0x30,0x53,0x5c,0x84,0x50,0x4e,0x77,0x5b,0x51,0x76,0x5e,0x51,0x74,0x5e, 0x51,0x75,0x5e,0x52,0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52, 0x75,0x5e,0x52,0x76,0x5e,0x52,0x75,0x61,0x50,0x73,0x52,0x3f,0x56,0x42,0x33,0x49, 0x51,0x40,0x59,0x68,0x5a,0x80,0x22,0x21,0x2e,0x18,0x19,0x22,0x1a,0x1a,0x24,0x1a, 0x1b,0x25,0x1b,0x1d,0x26,0x1b,0x1c,0x26,0x1b,0x1d,0x26,0x1b,0x1d,0x26,0x1b,0x1e, 0x27,0x1a,0x1c,0x26,0x1a,0x1c,0x26,0x19,0x1b,0x24,0x18,0x1a,0x23,0x18,0x1a,0x22, 0x16,0x19,0x20,0x16,0x19,0x21,0x16,0x18,0x20,0x16,0x18,0x1f,0x14,0x16,0x1d,0x12, 0x15,0x1b,0x12,0x13,0x1a,0x11,0x12,0x18,0x10,0x12,0x17,0x0f,0x11,0x16,0x0e,0x0f, 0x14,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0a,0x0c,0x0f,0x0a,0x0b,0x0e, 0x09,0x0a,0x0d,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06, 0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x06,0x07,0x04,0x04,0x06,0x03,0x04, 0x05,0x03,0x04,0x05,0x03,0x03,0x05,0x02,0x03,0x04,0x02,0x02,0x03,0x1d,0x1e,0x20, 0x9a,0xa2,0xbb,0x53,0x5f,0x87,0x5d,0x53,0x78,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f, 0x53,0x77,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x55,0x7a, 0x67,0x59,0x80,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,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,0x27,0x27,0x27,0x29,0x29,0x29,0x11,0x11,0x12,0x17, 0x17,0x18,0x17,0x17,0x18,0x00,0x00,0x00,0x0b,0x0b,0x0c,0x1c,0x1c,0x1d,0x1f,0x1f, 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x04,0x02,0x02, 0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x41,0x4b,0x69, 0x51,0x57,0x83,0x60,0x48,0x65,0x54,0x50,0x79,0x52,0x4f,0x7b,0x52,0x52,0x7c,0x52, 0x55,0x80,0x52,0x5b,0x84,0x52,0x5d,0x87,0x64,0x4f,0x6e,0x64,0x4d,0x6b,0x64,0x54, 0x79,0x56,0x54,0x7d,0x5e,0x69,0x90,0xd1,0xd6,0xe1,0xd1,0xd6,0xe0,0xce,0xd2,0xdf, 0xd0,0xd5,0xe0,0xcc,0xd1,0xde,0xc9,0xce,0xdb,0xc1,0xc7,0xd6,0xb9,0xc0,0xd1,0xad, 0xb4,0xc9,0xa1,0xaa,0xc2,0x9c,0xa5,0xbc,0x98,0xa1,0xbb,0x96,0xa0,0xb9,0x93,0x9c, 0xb8,0x90,0x9a,0xb5,0x93,0x9c,0xb8,0x94,0x9f,0xb8,0x92,0x9b,0xb7,0x8c,0x96,0xb2, 0x77,0x83,0xa4,0x5c,0x69,0x90,0x52,0x54,0x7e,0x60,0x6d,0x93,0x6a,0x76,0x97,0x30, 0x35,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x03,0x0f,0x11,0x16, 0x4f,0x59,0x7d,0x51,0x52,0x7c,0x5e,0x47,0x62,0x53,0x3e,0x55,0x60,0x51,0x75,0x5b, 0x50,0x76,0x5c,0x51,0x76,0x5c,0x51,0x76,0x5c,0x51,0x76,0x5e,0x51,0x74,0x5c,0x51, 0x75,0x5e,0x51,0x73,0x5d,0x51,0x73,0x60,0x51,0x74,0x60,0x51,0x74,0x60,0x51,0x74, 0x5e,0x51,0x75,0x5e,0x52,0x75,0x60,0x52,0x75,0x63,0x52,0x74,0x62,0x52,0x74,0x62, 0x52,0x74,0x62,0x52,0x73,0x63,0x52,0x73,0x63,0x52,0x73,0x63,0x52,0x72,0x64,0x52, 0x72,0x64,0x50,0x71,0x64,0x50,0x6f,0x64,0x52,0x72,0x64,0x53,0x76,0x53,0x4f,0x7a, 0x52,0x4f,0x7a,0x64,0x53,0x76,0x64,0x71,0x96,0x22,0x19,0x22,0x24,0x20,0x2f,0x53, 0x4f,0x78,0x5f,0x47,0x63,0x64,0x53,0x76,0x56,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x54,0x7e,0x52,0x5d,0x86,0x53,0x5f,0x89,0x58,0x65,0x8d,0x5a,0x66,0x8e, 0x63,0x4c,0x69,0x63,0x6f,0x95,0xe5,0xe7,0xee,0x80,0x7a,0x87,0x5f,0x4b,0x5e,0x6c, 0x57,0x6d,0x6b,0x56,0x6c,0x6d,0x58,0x6f,0x78,0x69,0x88,0x07,0x07,0x09,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,0x82,0x83,0x83,0xa4,0xac,0xc2,0x54,0x5f,0x89,0x64,0x53,0x76,0x53,0x5e, 0x88,0x52,0x5d,0x86,0x52,0x5d,0x86,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89, 0x54,0x5f,0x89,0x55,0x60,0x8a,0x56,0x62,0x8b,0x55,0x60,0x8a,0x56,0x62,0x8a,0x53, 0x5e,0x87,0x64,0x53,0x76,0x6d,0x7a,0x9c,0x66,0x68,0x6b,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x02,0x02,0x03,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x06,0x04,0x05,0x06,0x04,0x05, 0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x07,0x09, 0x0c,0x0b,0x0f,0x12,0x10,0x15,0x15,0x13,0x19,0x12,0x11,0x16,0x12,0x11,0x16,0x12, 0x12,0x16,0x13,0x12,0x16,0x13,0x12,0x16,0x14,0x13,0x17,0x19,0x18,0x1e,0x32,0x32, 0x3a,0x42,0x41,0x4c,0x44,0x46,0x52,0x3a,0x3c,0x4d,0x41,0x45,0x58,0x59,0x5e,0x70, 0x58,0x5f,0x72,0x45,0x4a,0x5e,0x38,0x37,0x48,0x2a,0x29,0x36,0x2f,0x32,0x3c,0x2c, 0x2f,0x38,0x1e,0x1f,0x2a,0x22,0x1e,0x26,0x22,0x1e,0x26,0x1d,0x1a,0x22,0x2a,0x23, 0x2e,0x2c,0x26,0x2f,0x59,0x55,0x5c,0x75,0x7f,0x9d,0x58,0x64,0x88,0x55,0x61,0x88, 0x57,0x63,0x89,0x58,0x64,0x8b,0x58,0x64,0x8b,0x5a,0x64,0x8b,0x5a,0x65,0x8c,0x58, 0x64,0x8a,0x58,0x62,0x8a,0x57,0x63,0x89,0x55,0x5f,0x87,0x5f,0x55,0x77,0x53,0x51, 0x79,0x29,0x2d,0x3e,0x10,0x12,0x15,0x0f,0x10,0x14,0x0e,0x0e,0x12,0x0a,0x0b,0x0e, 0x1e,0x1b,0x21,0x74,0x78,0x89,0x64,0x6e,0x90,0x40,0x3e,0x5e,0x5c,0x53,0x77,0x5d, 0x52,0x78,0x5e,0x53,0x78,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x5f,0x54,0x76,0x60,0x54,0x76,0x5f,0x55,0x76,0x5f,0x55,0x77,0x60,0x56,0x78, 0x5f,0x57,0x78,0x33,0x31,0x3e,0x19,0x1a,0x20,0x19,0x1b,0x20,0x17,0x19,0x1e,0x16, 0x17,0x1c,0x14,0x15,0x1a,0x12,0x12,0x16,0x0f,0x10,0x13,0x0e,0x0e,0x11,0x71,0x69, 0x75,0x7d,0x70,0xa0,0x52,0x48,0x68,0x51,0x4a,0x6c,0x58,0x51,0x77,0x55,0x50,0x77, 0x55,0x50,0x78,0x52,0x4f,0x79,0x52,0x4f,0x79,0x52,0x50,0x7a,0x53,0x54,0x7d,0x53, 0x57,0x80,0x53,0x5e,0x84,0x4e,0x58,0x7c,0x4c,0x57,0x76,0x47,0x4d,0x6b,0x22,0x1e, 0x23,0x28,0x23,0x29,0x31,0x30,0x3a,0x7b,0x87,0xab,0x68,0x71,0x93,0x65,0x6f,0x8d, 0x67,0x71,0x90,0x67,0x70,0x8f,0x67,0x70,0x8f,0x74,0x7e,0xa0,0x21,0x22,0x2e,0x2c, 0x29,0x36,0x32,0x2d,0x3a,0x31,0x2c,0x3a,0x28,0x26,0x32,0x4b,0x45,0x5e,0x5c,0x63, 0x81,0x54,0x51,0x74,0x5e,0x58,0x68,0x39,0x32,0x40,0x36,0x2f,0x3c,0x2a,0x24,0x2f, 0x29,0x23,0x2e,0x2a,0x25,0x30,0x30,0x29,0x35,0x28,0x24,0x2f,0x23,0x21,0x2b,0x1c, 0x1b,0x26,0x17,0x17,0x20,0x15,0x16,0x1d,0x13,0x14,0x1b,0x13,0x12,0x1a,0x59,0x4b, 0x60,0x62,0x53,0x69,0x6d,0x5c,0x75,0x63,0x69,0x8b,0x50,0x4d,0x74,0x5c,0x51,0x73, 0x5c,0x51,0x73,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5b,0x4e,0x71,0x49,0x3e,0x59,0x39, 0x2d,0x45,0x41,0x3e,0x5d,0x67,0x6d,0x8e,0x09,0x09,0x0b,0x09,0x09,0x0b,0x0e,0x0d, 0x11,0x33,0x28,0x33,0x31,0x26,0x2f,0x51,0x5b,0x83,0x50,0x4e,0x77,0x59,0x50,0x75, 0x5e,0x51,0x74,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e, 0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x61,0x50,0x73,0x53,0x3f, 0x58,0x44,0x33,0x4a,0x52,0x41,0x5a,0x67,0x5a,0x80,0x21,0x23,0x30,0x1a,0x1b,0x25, 0x1b,0x1c,0x26,0x1c,0x1e,0x28,0x1c,0x1e,0x28,0x1e,0x21,0x2b,0x1e,0x21,0x2b,0x1d, 0x1f,0x2a,0x1d,0x20,0x2a,0x1c,0x1e,0x28,0x1c,0x1e,0x28,0x1a,0x1d,0x26,0x1a,0x1c, 0x25,0x19,0x1b,0x23,0x19,0x1b,0x24,0x18,0x1a,0x22,0x17,0x1a,0x22,0x16,0x18,0x20, 0x15,0x17,0x1e,0x14,0x16,0x1c,0x12,0x14,0x1a,0x11,0x12,0x18,0x11,0x12,0x18,0x10, 0x11,0x16,0x0e,0x10,0x15,0x0e,0x0f,0x14,0x0c,0x0e,0x12,0x0c,0x0d,0x11,0x0b,0x0c, 0x10,0x0a,0x0c,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0c,0x08,0x09,0x0c,0x07,0x08,0x0a, 0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x05,0x06,0x04, 0x05,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03, 0x04,0x06,0x06,0x07,0xb8,0xbe,0xcf,0x5c,0x67,0x8f,0x5a,0x52,0x78,0x5f,0x53,0x77, 0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f, 0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x78,0x87,0x76,0xa8,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,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,0x02,0x02,0x02,0x29,0x29,0x29,0x0f,0x0f,0x0f, 0x20,0x20,0x20,0x25,0x25,0x25,0x26,0x26,0x26,0x24,0x24,0x24,0x20,0x21,0x21,0x25, 0x25,0x26,0x12,0x12,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x03,0x04,0x04,0x02,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x21, 0x2f,0x56,0x62,0x8a,0x64,0x4f,0x6d,0x64,0x53,0x76,0x52,0x4f,0x7a,0x52,0x4f,0x7b, 0x52,0x52,0x7c,0x52,0x54,0x7f,0x52,0x5b,0x84,0x53,0x5e,0x87,0x64,0x52,0x73,0x64, 0x4f,0x6d,0x60,0x54,0x79,0x56,0x54,0x7d,0x60,0x6b,0x92,0xd9,0xdb,0xe6,0xd1,0xd5, 0xe1,0xd0,0xd3,0xdf,0xd0,0xd3,0xe0,0xcb,0xd0,0xdd,0xc8,0xce,0xda,0xc1,0xc7,0xd7, 0xb9,0xbf,0xd0,0xab,0xb2,0xc8,0xa4,0xac,0xc2,0x9d,0xa7,0xbe,0x9b,0xa4,0xbc,0x9a, 0xa3,0xbc,0x98,0xa1,0xba,0x92,0x9b,0xb7,0x94,0x9d,0xb8,0x96,0xa0,0xb9,0x94,0x9d, 0xb8,0x90,0x99,0xb4,0x88,0x92,0xb0,0x7a,0x85,0xa5,0x53,0x5e,0x88,0x52,0x50,0x7b, 0x58,0x65,0x8d,0x64,0x6f,0x95,0x4c,0x56,0x73,0x0f,0x11,0x17,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x20,0x22, 0x30,0x4e,0x57,0x7a,0x51,0x53,0x7c,0x62,0x4b,0x68,0x52,0x3c,0x54,0x62,0x51,0x71, 0x5a,0x50,0x77,0x5c,0x51,0x77,0x5c,0x51,0x76,0x5c,0x51,0x76,0x5c,0x51,0x76,0x5c, 0x51,0x76,0x5e,0x51,0x74,0x5e,0x51,0x74,0x5e,0x51,0x74,0x5e,0x51,0x74,0x60,0x51, 0x74,0x5c,0x51,0x77,0x5e,0x51,0x75,0x60,0x52,0x75,0x61,0x52,0x75,0x61,0x52,0x75, 0x61,0x52,0x75,0x62,0x52,0x74,0x63,0x52,0x74,0x63,0x52,0x74,0x63,0x52,0x73,0x64, 0x53,0x73,0x64,0x52,0x72,0x64,0x52,0x72,0x64,0x4f,0x6e,0x64,0x52,0x72,0x64,0x53, 0x75,0x5c,0x52,0x79,0x52,0x4f,0x7b,0x64,0x53,0x74,0x56,0x62,0x8b,0x2b,0x24,0x31, 0x24,0x20,0x30,0x57,0x4f,0x77,0x5d,0x45,0x60,0x62,0x53,0x77,0x5a,0x52,0x79,0x52, 0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x53,0x7d,0x52,0x5a,0x84,0x53,0x5f,0x89,0x55,0x62, 0x8b,0x57,0x63,0x8c,0x64,0x4d,0x6a,0x5b,0x66,0x8e,0xdf,0xe1,0xe9,0x94,0x91,0x9e, 0x5c,0x49,0x5a,0x6b,0x57,0x6c,0x6f,0x5b,0x71,0x74,0x5f,0x78,0x73,0x69,0x8a,0x11, 0x13,0x18,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,0x24,0x24,0x24,0xcc,0xd1,0xde,0x6a,0x75,0x9a,0x64, 0x4f,0x6e,0x52,0x50,0x7c,0x52,0x5c,0x86,0x52,0x5b,0x85,0x52,0x5d,0x88,0x53,0x5e, 0x88,0x54,0x5f,0x89,0x54,0x60,0x8a,0x55,0x60,0x8a,0x55,0x60,0x8a,0x56,0x62,0x8b, 0x56,0x62,0x8b,0x55,0x60,0x89,0x5e,0x53,0x79,0x52,0x5a,0x83,0x94,0x9a,0xac,0x04, 0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04, 0x04,0x06,0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x05,0x06, 0x07,0x06,0x06,0x07,0x07,0x07,0x08,0x09,0x09,0x0b,0x0d,0x0c,0x0e,0x0f,0x0e,0x12, 0x11,0x10,0x14,0x11,0x11,0x15,0x13,0x12,0x16,0x13,0x12,0x16,0x14,0x13,0x17,0x18, 0x17,0x1c,0x22,0x21,0x28,0x26,0x26,0x2d,0x2b,0x2b,0x35,0x31,0x32,0x3f,0x3b,0x3d, 0x4b,0x45,0x4a,0x5a,0x57,0x5d,0x6e,0x58,0x5e,0x70,0x51,0x56,0x67,0x3e,0x44,0x56, 0x3a,0x3e,0x4c,0x3c,0x40,0x4b,0x2c,0x2f,0x39,0x1a,0x1a,0x23,0x1e,0x1a,0x22,0x13, 0x13,0x1a,0x27,0x21,0x2b,0x31,0x28,0x34,0x55,0x51,0x5a,0x74,0x7d,0x9c,0x58,0x63, 0x88,0x54,0x60,0x85,0x55,0x62,0x88,0x57,0x62,0x8a,0x5a,0x64,0x8b,0x5a,0x65,0x8b, 0x58,0x63,0x8b,0x59,0x64,0x8a,0x57,0x63,0x89,0x56,0x62,0x89,0x55,0x5f,0x86,0x5d, 0x55,0x77,0x52,0x51,0x79,0x26,0x2b,0x39,0x10,0x12,0x15,0x0f,0x11,0x14,0x0e,0x0e, 0x12,0x0c,0x0d,0x0f,0x1c,0x1a,0x1f,0x6e,0x6e,0x80,0x64,0x6f,0x91,0x40,0x3e,0x5f, 0x5b,0x52,0x76,0x5d,0x52,0x78,0x5e,0x53,0x78,0x5e,0x53,0x79,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x5f,0x54,0x76,0x5f,0x54,0x77,0x5f,0x55,0x76,0x60,0x55, 0x78,0x60,0x57,0x78,0x5f,0x58,0x78,0x36,0x33,0x41,0x1a,0x1b,0x21,0x1a,0x1b,0x21, 0x19,0x1a,0x1f,0x16,0x18,0x1d,0x14,0x16,0x1a,0x12,0x13,0x16,0x0f,0x10,0x13,0x0d, 0x0e,0x11,0x64,0x5c,0x66,0x83,0x74,0xa6,0x51,0x4b,0x69,0x52,0x4b,0x6a,0x58,0x51, 0x77,0x55,0x50,0x77,0x55,0x50,0x78,0x53,0x4f,0x79,0x52,0x4f,0x79,0x52,0x50,0x7a, 0x52,0x53,0x7c,0x52,0x56,0x7e,0x52,0x5b,0x82,0x4e,0x58,0x7d,0x4c,0x56,0x76,0x4a, 0x53,0x71,0x21,0x1e,0x23,0x2a,0x25,0x2b,0x27,0x23,0x2a,0x61,0x69,0x86,0x6f,0x7b, 0x9d,0x63,0x6e,0x8c,0x5e,0x68,0x84,0x66,0x70,0x8e,0x65,0x6f,0x8d,0x6c,0x77,0x9a, 0x35,0x37,0x49,0x2c,0x2a,0x37,0x32,0x2d,0x3a,0x30,0x2b,0x39,0x29,0x27,0x35,0x4d, 0x4a,0x61,0x5d,0x66,0x84,0x4d,0x4b,0x6d,0x64,0x69,0x85,0x51,0x4f,0x5c,0x28,0x26, 0x32,0x2a,0x26,0x32,0x2b,0x26,0x31,0x2d,0x27,0x32,0x2d,0x27,0x33,0x27,0x22,0x2c, 0x27,0x22,0x2b,0x28,0x23,0x2e,0x22,0x20,0x2a,0x1a,0x1a,0x22,0x16,0x16,0x1d,0x13, 0x14,0x1a,0x23,0x21,0x2a,0x64,0x54,0x6c,0x6c,0x5f,0x78,0x6a,0x66,0x85,0x51,0x5a, 0x81,0x59,0x50,0x74,0x5c,0x51,0x73,0x5d,0x51,0x73,0x5d,0x51,0x74,0x5b,0x4e,0x71, 0x4a,0x3d,0x59,0x38,0x2a,0x42,0x40,0x39,0x57,0x6a,0x71,0x90,0x09,0x0a,0x0d,0x0a, 0x0a,0x0e,0x0e,0x0d,0x12,0x32,0x27,0x30,0x2e,0x24,0x2c,0x52,0x5b,0x82,0x50,0x50, 0x78,0x59,0x50,0x75,0x5d,0x51,0x73,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x51,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x52,0x75,0x60, 0x50,0x74,0x54,0x40,0x5a,0x43,0x34,0x4a,0x52,0x40,0x5b,0x66,0x5a,0x80,0x23,0x25, 0x32,0x1c,0x1e,0x27,0x1e,0x20,0x2a,0x1e,0x21,0x2b,0x1f,0x22,0x2d,0x22,0x24,0x2f, 0x23,0x26,0x31,0x22,0x24,0x2f,0x21,0x24,0x2e,0x1f,0x22,0x2c,0x1e,0x21,0x2a,0x1c, 0x1e,0x29,0x1c,0x1e,0x28,0x1a,0x1e,0x26,0x1a,0x1c,0x25,0x19,0x1b,0x23,0x18,0x1a, 0x22,0x17,0x1a,0x22,0x17,0x19,0x21,0x16,0x18,0x1f,0x15,0x16,0x1d,0x13,0x15,0x1a, 0x12,0x14,0x1a,0x11,0x12,0x18,0x0f,0x11,0x16,0x0e,0x10,0x15,0x0e,0x0f,0x13,0x0d, 0x0e,0x12,0x0b,0x0d,0x10,0x0a,0x0c,0x0f,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x08,0x09, 0x0c,0x07,0x08,0x0b,0x07,0x08,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08, 0x06,0x06,0x08,0x05,0x06,0x07,0x04,0x05,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03, 0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0xa4,0xa8,0xb3,0x64,0x70,0x96,0x54,0x50, 0x78,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x52,0x76, 0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x75,0x66,0x92,0x12,0x12,0x12,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,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,0x0e,0x0e,0x0e,0x24,0x24,0x24,0x2f,0x2f, 0x2f,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x14,0x14,0x14, 0x12,0x12,0x13,0x0b,0x0b,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x06, 0x07,0x0a,0x50,0x5b,0x80,0x51,0x4e,0x79,0x60,0x48,0x64,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x54,0x7f,0x52,0x5b,0x84,0x53,0x5e,0x87, 0x62,0x53,0x77,0x64,0x4e,0x6c,0x62,0x54,0x79,0x57,0x55,0x7e,0x66,0x71,0x96,0xde, 0xe1,0xe8,0xcf,0xd3,0xdf,0xd0,0xd5,0xe0,0xd0,0xd3,0xdf,0xcb,0xd0,0xdd,0xc8,0xcc, 0xda,0xc2,0xc8,0xd7,0xb7,0xbe,0xcf,0xac,0xb3,0xc8,0xa3,0xac,0xc2,0xa1,0xa8,0xc0, 0x9c,0xa5,0xbe,0x9a,0xa3,0xbc,0x99,0xa2,0xbb,0x98,0xa1,0xba,0x96,0xa0,0xb9,0x96, 0xa0,0xb9,0x94,0x9d,0xb8,0x8e,0x98,0xb4,0x89,0x93,0xb0,0x83,0x8d,0xac,0x79,0x84, 0xa5,0x5d,0x69,0x91,0x52,0x4f,0x7a,0x52,0x53,0x7d,0x5d,0x69,0x91,0x60,0x6b,0x90, 0x2a,0x2f,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x09,0x15, 0x12,0x1a,0x42,0x4a,0x6c,0x52,0x50,0x7a,0x61,0x4a,0x64,0x4e,0x38,0x4f,0x5c,0x45, 0x60,0x5c,0x52,0x77,0x5b,0x50,0x77,0x5b,0x50,0x77,0x5c,0x51,0x77,0x5c,0x51,0x76, 0x5c,0x51,0x76,0x5c,0x51,0x76,0x5e,0x51,0x74,0x5c,0x51,0x76,0x5e,0x51,0x74,0x5c, 0x51,0x76,0x5e,0x51,0x75,0x5e,0x51,0x75,0x62,0x52,0x74,0x5e,0x52,0x75,0x5f,0x52, 0x75,0x61,0x51,0x75,0x61,0x52,0x75,0x62,0x52,0x74,0x63,0x52,0x74,0x63,0x52,0x74, 0x63,0x52,0x74,0x64,0x53,0x74,0x64,0x52,0x72,0x64,0x52,0x71,0x64,0x50,0x71,0x64, 0x52,0x71,0x64,0x52,0x73,0x63,0x53,0x77,0x53,0x4f,0x7a,0x64,0x53,0x75,0x52,0x4f, 0x7b,0x39,0x35,0x47,0x2b,0x27,0x39,0x5d,0x52,0x79,0x5e,0x46,0x62,0x5e,0x53,0x79, 0x57,0x50,0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x52,0x7d,0x52,0x58,0x84,0x53, 0x5e,0x88,0x54,0x5f,0x89,0x58,0x64,0x8c,0x64,0x4f,0x6e,0x53,0x5e,0x89,0xd0,0xd5, 0xe0,0xa8,0xa8,0xb6,0x5b,0x48,0x59,0x6d,0x59,0x6f,0x73,0x5e,0x76,0x78,0x64,0x7e, 0x6b,0x67,0x8a,0x1e,0x21,0x29,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,0xb8,0xb9,0xbc, 0x83,0x8d,0xac,0x5e,0x53,0x79,0x63,0x53,0x77,0x52,0x5b,0x85,0x52,0x5a,0x84,0x52, 0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60, 0x8a,0x56,0x62,0x8b,0x55,0x62,0x8a,0x54,0x5f,0x88,0x52,0x54,0x7e,0x60,0x53,0x77, 0x77,0x82,0xa3,0x43,0x44,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x05,0x06,0x04,0x04,0x05,0x05,0x05,0x06,0x05, 0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07, 0x08,0x08,0x07,0x09,0x09,0x0a,0x0c,0x0d,0x0c,0x10,0x10,0x0f,0x13,0x12,0x11,0x15, 0x15,0x13,0x19,0x19,0x17,0x1d,0x1c,0x19,0x20,0x1d,0x1a,0x21,0x1e,0x1c,0x24,0x21, 0x1e,0x28,0x25,0x23,0x2d,0x2e,0x2f,0x3d,0x44,0x47,0x55,0x4f,0x54,0x63,0x56,0x5b, 0x6c,0x52,0x58,0x66,0x4b,0x4f,0x5d,0x42,0x47,0x54,0x30,0x33,0x41,0x23,0x23,0x2e, 0x1a,0x1b,0x23,0x16,0x18,0x1e,0x24,0x21,0x28,0x31,0x2a,0x36,0x4f,0x4b,0x59,0x74, 0x7e,0x9b,0x5c,0x66,0x89,0x55,0x62,0x86,0x55,0x62,0x87,0x57,0x62,0x8a,0x59,0x64, 0x8b,0x59,0x64,0x8a,0x59,0x64,0x8b,0x58,0x63,0x8a,0x58,0x63,0x8a,0x57,0x62,0x88, 0x54,0x5e,0x85,0x5d,0x54,0x78,0x53,0x52,0x7a,0x27,0x2b,0x3a,0x10,0x12,0x15,0x10, 0x12,0x15,0x0e,0x0f,0x12,0x0c,0x0d,0x10,0x18,0x15,0x1a,0x68,0x67,0x78,0x65,0x6f, 0x91,0x40,0x40,0x5f,0x5c,0x52,0x77,0x5d,0x52,0x78,0x5e,0x53,0x78,0x5e,0x53,0x78, 0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x54,0x76,0x5f,0x54,0x77,0x5f,0x54,0x77,0x5f, 0x55,0x76,0x60,0x55,0x77,0x60,0x57,0x78,0x60,0x58,0x78,0x3c,0x38,0x47,0x1a,0x1b, 0x21,0x1a,0x1c,0x22,0x19,0x1a,0x1f,0x16,0x19,0x1e,0x15,0x16,0x1b,0x12,0x14,0x18, 0x0f,0x11,0x14,0x0e,0x0e,0x12,0x54,0x4e,0x57,0x88,0x78,0xaf,0x53,0x4b,0x6d,0x50, 0x49,0x6a,0x58,0x51,0x77,0x59,0x52,0x77,0x55,0x50,0x78,0x55,0x50,0x78,0x51,0x4f, 0x78,0x52,0x4f,0x7a,0x52,0x53,0x7b,0x52,0x54,0x7e,0x52,0x58,0x81,0x4e,0x58,0x7c, 0x4b,0x56,0x76,0x4f,0x58,0x7a,0x20,0x1c,0x21,0x2a,0x24,0x2a,0x2a,0x25,0x2c,0x39, 0x3a,0x48,0x7b,0x89,0xb0,0x65,0x6e,0x8e,0x4c,0x52,0x6d,0x50,0x57,0x71,0x64,0x6d, 0x8c,0x64,0x6e,0x8e,0x50,0x57,0x72,0x27,0x26,0x33,0x2e,0x2b,0x39,0x2a,0x27,0x35, 0x3d,0x37,0x48,0x4f,0x4a,0x5f,0x66,0x6e,0x8a,0x4c,0x4d,0x6e,0x4a,0x4c,0x6d,0x8f, 0x94,0xa4,0x3d,0x40,0x4d,0x24,0x23,0x2f,0x32,0x2d,0x39,0x34,0x2e,0x3a,0x35,0x2f, 0x3b,0x38,0x30,0x3d,0x2f,0x29,0x35,0x27,0x22,0x2c,0x29,0x23,0x2d,0x27,0x23,0x2e, 0x1d,0x1b,0x25,0x16,0x16,0x1e,0x13,0x13,0x1a,0x55,0x47,0x5c,0x6b,0x60,0x7b,0x61, 0x60,0x81,0x64,0x69,0x8a,0x4f,0x4e,0x75,0x5a,0x51,0x74,0x5c,0x51,0x74,0x5d,0x51, 0x73,0x5d,0x50,0x72,0x4b,0x40,0x5d,0x3a,0x2e,0x43,0x3f,0x39,0x56,0x6c,0x71,0x8a, 0x09,0x09,0x0c,0x0a,0x0a,0x0e,0x0d,0x0c,0x10,0x2e,0x24,0x2d,0x2b,0x21,0x29,0x51, 0x5a,0x82,0x50,0x4e,0x76,0x59,0x50,0x75,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5e,0x52, 0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5f,0x52,0x76,0x5e,0x52,0x75, 0x5e,0x52,0x76,0x60,0x51,0x74,0x55,0x41,0x5b,0x43,0x34,0x4a,0x52,0x40,0x59,0x66, 0x5a,0x7f,0x29,0x2b,0x3b,0x1e,0x20,0x2b,0x20,0x22,0x2e,0x22,0x26,0x31,0x26,0x29, 0x34,0x26,0x2a,0x36,0x28,0x2c,0x37,0x27,0x2b,0x36,0x25,0x28,0x33,0x22,0x26,0x31, 0x21,0x24,0x2e,0x20,0x22,0x2d,0x1e,0x22,0x2b,0x1e,0x20,0x29,0x1e,0x20,0x2a,0x1b, 0x1e,0x26,0x1a,0x1d,0x25,0x19,0x1b,0x22,0x18,0x1a,0x22,0x16,0x18,0x20,0x16,0x18, 0x1f,0x14,0x16,0x1d,0x13,0x16,0x1b,0x12,0x14,0x1a,0x12,0x13,0x19,0x10,0x12,0x16, 0x0e,0x10,0x15,0x0e,0x0f,0x14,0x0c,0x0e,0x12,0x0c,0x0d,0x11,0x0b,0x0c,0x0f,0x0a, 0x0c,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x08,0x09,0x0c,0x07,0x08,0x0b,0x06,0x07, 0x0a,0x06,0x07,0x09,0x06,0x06,0x08,0x05,0x06,0x07,0x04,0x05,0x06,0x04,0x05,0x06, 0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x78,0x7b,0x82,0x72, 0x7e,0x9f,0x52,0x4f,0x79,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53, 0x77,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76, 0x5f,0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x6b,0x5c,0x83,0x35, 0x2e,0x3e,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,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,0x17,0x17,0x17,0x23, 0x23,0x23,0x23,0x23,0x23,0x03,0x03,0x03,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x36,0x50,0x51,0x59,0x83,0x60,0x48,0x64,0x63,0x53,0x77,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x52,0x7d,0x52,0x56,0x80,0x52,0x5c, 0x85,0x53,0x5f,0x88,0x5e,0x53,0x79,0x64,0x50,0x71,0x5c,0x54,0x7a,0x58,0x58,0x81, 0x84,0x8e,0xac,0xe0,0xe2,0xea,0xd1,0xd6,0xe1,0xd1,0xd5,0xe0,0xd0,0xd3,0xdf,0xcc, 0xd1,0xde,0xc8,0xcc,0xda,0xc2,0xc9,0xd7,0xb7,0xbe,0xcf,0xac,0xb4,0xc9,0xa3,0xaa, 0xc1,0xa0,0xa9,0xc0,0x9c,0xa5,0xbe,0x9b,0xa4,0xbc,0x99,0xa2,0xbb,0x99,0xa2,0xbb, 0x98,0xa1,0xba,0x96,0xa0,0xb9,0x94,0x9d,0xb8,0x8e,0x98,0xb4,0x89,0x93,0xb0,0x81, 0x8c,0xab,0x7b,0x86,0xa7,0x75,0x81,0xa2,0x69,0x74,0x99,0x52,0x53,0x7d,0x52,0x4f, 0x7a,0x55,0x60,0x8a,0x56,0x62,0x8a,0x44,0x4d,0x6e,0x49,0x42,0x61,0x5c,0x4e,0x70, 0x64,0x53,0x74,0x63,0x52,0x73,0x63,0x52,0x72,0x61,0x4b,0x66,0x5a,0x41,0x5c,0x62, 0x4b,0x66,0x5d,0x52,0x77,0x5a,0x51,0x77,0x5b,0x51,0x77,0x5c,0x51,0x77,0x5c,0x51, 0x77,0x5c,0x51,0x77,0x5c,0x51,0x76,0x5e,0x51,0x74,0x5e,0x51,0x74,0x5e,0x51,0x74, 0x5c,0x51,0x77,0x5e,0x51,0x75,0x5e,0x51,0x75,0x60,0x52,0x75,0x61,0x52,0x75,0x5f, 0x52,0x75,0x5f,0x51,0x75,0x60,0x52,0x75,0x62,0x52,0x74,0x62,0x52,0x74,0x62,0x52, 0x76,0x63,0x52,0x74,0x63,0x52,0x74,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x52,0x72, 0x64,0x50,0x6f,0x64,0x53,0x73,0x64,0x53,0x73,0x64,0x53,0x76,0x5e,0x53,0x79,0x62, 0x53,0x77,0x64,0x52,0x71,0x3e,0x3f,0x5a,0x32,0x2b,0x3f,0x63,0x53,0x77,0x5c,0x44, 0x5e,0x5c,0x52,0x79,0x57,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x53,0x7e, 0x52,0x57,0x83,0x52,0x5d,0x88,0x54,0x5f,0x89,0x57,0x63,0x8c,0x64,0x50,0x71,0x52, 0x52,0x7d,0xc2,0xc8,0xd7,0xb6,0xb9,0xc7,0x59,0x46,0x57,0x6d,0x59,0x6f,0x78,0x65, 0x7f,0x78,0x69,0x85,0x6b,0x67,0x8a,0x29,0x2d,0x39,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,0x63,0x63,0x63,0xa0,0xa9,0xc0,0x55,0x60,0x8a,0x60,0x48,0x65,0x52,0x55,0x81, 0x52,0x57,0x83,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53, 0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x55,0x62,0x8b,0x55,0x62,0x8a,0x55,0x62, 0x8a,0x64,0x53,0x75,0x57,0x63,0x8b,0x7f,0x84,0x91,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05, 0x04,0x04,0x05,0x05,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x05, 0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x07,0x07,0x09,0x09,0x09, 0x0b,0x0c,0x0b,0x0f,0x14,0x12,0x17,0x1b,0x19,0x1f,0x1c,0x1a,0x20,0x1c,0x1a,0x20, 0x1d,0x1b,0x21,0x1d,0x1b,0x22,0x1f,0x1c,0x25,0x23,0x21,0x2b,0x2d,0x2d,0x38,0x37, 0x3a,0x4a,0x43,0x47,0x55,0x4e,0x52,0x5e,0x53,0x58,0x65,0x4f,0x54,0x62,0x42,0x46, 0x55,0x34,0x37,0x46,0x3b,0x3e,0x4a,0x39,0x3b,0x42,0x3b,0x3a,0x41,0x45,0x41,0x4a, 0x5e,0x5d,0x69,0x7f,0x87,0xa2,0x68,0x72,0x91,0x58,0x63,0x86,0x55,0x61,0x86,0x55, 0x61,0x88,0x58,0x63,0x89,0x57,0x63,0x8a,0x58,0x64,0x8a,0x58,0x64,0x8a,0x56,0x61, 0x87,0x56,0x61,0x87,0x54,0x5e,0x85,0x5d,0x55,0x77,0x53,0x51,0x79,0x27,0x2c,0x3b, 0x11,0x12,0x16,0x11,0x12,0x16,0x10,0x11,0x14,0x0e,0x0e,0x11,0x17,0x15,0x1a,0x66, 0x63,0x73,0x66,0x70,0x92,0x44,0x46,0x68,0x5c,0x52,0x76,0x5d,0x53,0x77,0x5e,0x53, 0x78,0x5e,0x53,0x78,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x54,0x76,0x5f,0x53,0x77, 0x5f,0x54,0x77,0x5f,0x55,0x77,0x60,0x55,0x78,0x61,0x57,0x78,0x60,0x59,0x78,0x3d, 0x39,0x49,0x1b,0x1d,0x22,0x1a,0x1d,0x22,0x19,0x1a,0x20,0x18,0x1a,0x1e,0x16,0x17, 0x1b,0x13,0x14,0x18,0x0f,0x11,0x14,0x0e,0x0e,0x12,0x45,0x3f,0x48,0x8c,0x7f,0xb5, 0x56,0x4e,0x6f,0x51,0x49,0x69,0x59,0x51,0x77,0x56,0x4f,0x77,0x55,0x50,0x78,0x55, 0x50,0x78,0x51,0x4f,0x78,0x52,0x4f,0x79,0x52,0x50,0x7a,0x52,0x54,0x7e,0x52,0x57, 0x80,0x4e,0x57,0x7c,0x4b,0x54,0x75,0x54,0x5f,0x82,0x20,0x1c,0x21,0x28,0x24,0x2a, 0x2e,0x28,0x2f,0x29,0x26,0x2e,0x6f,0x7b,0x9d,0x67,0x72,0x94,0x3c,0x42,0x58,0x3d, 0x42,0x58,0x3d,0x43,0x59,0x4d,0x55,0x6f,0x62,0x6d,0x8d,0x20,0x22,0x2e,0x23,0x23, 0x2f,0x21,0x22,0x2d,0x47,0x40,0x52,0x50,0x49,0x5d,0x65,0x6f,0x8b,0x4c,0x4d,0x70, 0x53,0x4f,0x6e,0x8b,0x8f,0x9e,0x8b,0x91,0xa1,0x43,0x43,0x54,0x31,0x2d,0x3a,0x33, 0x2d,0x3a,0x36,0x30,0x3d,0x39,0x32,0x40,0x37,0x30,0x3d,0x33,0x2d,0x39,0x2a,0x25, 0x2f,0x29,0x23,0x2d,0x28,0x23,0x2e,0x1e,0x1c,0x26,0x15,0x16,0x1d,0x29,0x25,0x2f, 0x69,0x5a,0x73,0x5f,0x5f,0x81,0x6e,0x62,0x7b,0x53,0x5c,0x82,0x52,0x4e,0x74,0x5a, 0x51,0x75,0x5c,0x51,0x74,0x5d,0x50,0x73,0x50,0x43,0x5e,0x3c,0x30,0x47,0x3f,0x38, 0x54,0x69,0x6e,0x84,0x09,0x09,0x0c,0x0a,0x0a,0x0e,0x0d,0x0d,0x12,0x2a,0x22,0x2a, 0x27,0x1f,0x27,0x50,0x53,0x7c,0x50,0x4d,0x75,0x5a,0x51,0x74,0x5d,0x51,0x74,0x5d, 0x51,0x74,0x5e,0x52,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5f,0x52, 0x76,0x5e,0x52,0x76,0x5e,0x52,0x76,0x60,0x51,0x75,0x58,0x44,0x5d,0x46,0x36,0x4d, 0x51,0x41,0x59,0x64,0x5b,0x81,0x2a,0x2c,0x3c,0x21,0x23,0x2e,0x25,0x29,0x34,0x28, 0x2c,0x38,0x2b,0x2f,0x3b,0x2e,0x32,0x3e,0x2e,0x32,0x3e,0x2c,0x30,0x3c,0x2a,0x2e, 0x3a,0x28,0x2c,0x37,0x26,0x2a,0x34,0x24,0x26,0x31,0x23,0x26,0x31,0x22,0x25,0x2e, 0x1f,0x22,0x2c,0x1e,0x21,0x2a,0x1c,0x1f,0x28,0x1c,0x1e,0x27,0x1a,0x1c,0x24,0x18, 0x1a,0x22,0x17,0x1a,0x21,0x16,0x18,0x1e,0x15,0x16,0x1d,0x13,0x15,0x1b,0x12,0x13, 0x19,0x11,0x12,0x17,0x10,0x12,0x16,0x10,0x12,0x16,0x0e,0x10,0x15,0x0c,0x0e,0x12, 0x0b,0x0c,0x10,0x0a,0x0b,0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x07, 0x08,0x0b,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x05,0x06, 0x07,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x03,0x03,0x04, 0x42,0x43,0x48,0x81,0x8b,0xaa,0x51,0x4f,0x7a,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52, 0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76, 0x64,0x56,0x7c,0x5c,0x4f,0x72,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,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, 0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,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,0x11,0x13,0x1b,0x52,0x5d,0x87,0x64,0x53,0x74,0x62,0x4a,0x66, 0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x52,0x7d,0x52, 0x56,0x80,0x52,0x5d,0x85,0x54,0x5f,0x88,0x53,0x4f,0x7a,0x65,0x53,0x72,0x5c,0x54, 0x7a,0x58,0x58,0x82,0xa3,0xab,0xc2,0xde,0xe1,0xe9,0xd3,0xd8,0xe2,0xd2,0xd7,0xe1, 0xd0,0xd3,0xe0,0xcb,0xd1,0xdd,0xc7,0xcb,0xd9,0xc1,0xc7,0xd6,0xb7,0xbc,0xcf,0xab, 0xb3,0xc8,0xa3,0xab,0xc2,0xa0,0xa8,0xc0,0x9d,0xa7,0xbf,0x9b,0xa4,0xbc,0x9a,0xa3, 0xbc,0x98,0xa1,0xba,0x99,0xa2,0xbb,0x95,0x9f,0xb9,0x93,0x9c,0xb7,0x8e,0x99,0xb4, 0x88,0x92,0xb0,0x83,0x8d,0xac,0x7b,0x86,0xa7,0x74,0x80,0xa2,0x72,0x7d,0xa0,0x6b, 0x76,0x9b,0x52,0x5d,0x88,0x5d,0x52,0x79,0x57,0x50,0x79,0x64,0x4c,0x6a,0x50,0x39, 0x52,0x5b,0x43,0x5d,0x57,0x40,0x5a,0x51,0x3b,0x51,0x40,0x2b,0x3e,0x56,0x3e,0x57, 0x62,0x52,0x72,0x5a,0x52,0x77,0x5b,0x51,0x77,0x5b,0x51,0x77,0x5a,0x51,0x77,0x5b, 0x51,0x77,0x5c,0x52,0x77,0x5c,0x51,0x77,0x5c,0x51,0x77,0x5c,0x51,0x77,0x5e,0x51, 0x75,0x5e,0x51,0x75,0x5c,0x51,0x76,0x5e,0x52,0x75,0x5e,0x52,0x75,0x60,0x52,0x75, 0x61,0x52,0x75,0x61,0x52,0x75,0x5e,0x52,0x75,0x60,0x52,0x75,0x61,0x52,0x75,0x62, 0x52,0x76,0x62,0x52,0x76,0x63,0x52,0x75,0x63,0x52,0x74,0x64,0x53,0x75,0x64,0x53, 0x75,0x64,0x52,0x72,0x63,0x4b,0x67,0x64,0x4e,0x6c,0x64,0x50,0x6f,0x64,0x53,0x74, 0x64,0x53,0x76,0x64,0x53,0x76,0x5a,0x41,0x5c,0x52,0x4e,0x77,0x4e,0x43,0x5f,0x64, 0x50,0x6f,0x57,0x3f,0x58,0x5c,0x52,0x79,0x5a,0x52,0x79,0x53,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x52,0x7c,0x52,0x55,0x80,0x52,0x5d,0x86,0x53,0x5f,0x89,0x56,0x63,0x8b, 0x62,0x53,0x77,0x57,0x50,0x79,0xbe,0xc3,0xd3,0xc7,0xcb,0xd9,0x5f,0x4c,0x5e,0x72, 0x5d,0x75,0x78,0x69,0x88,0x74,0x69,0x89,0x68,0x66,0x8c,0x35,0x39,0x48,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,0x0c,0x0c,0x0c,0xbf,0xc3,0xd1,0x64,0x71,0x96,0x60,0x48, 0x64,0x52,0x4f,0x7a,0x52,0x5c,0x86,0x52,0x5a,0x84,0x52,0x5d,0x86,0x52,0x5d,0x88, 0x53,0x5e,0x88,0x53,0x5e,0x88,0x54,0x5f,0x89,0x55,0x60,0x8a,0x54,0x5f,0x89,0x54, 0x60,0x8a,0x55,0x60,0x8a,0x52,0x4f,0x7a,0x57,0x50,0x79,0x7e,0x87,0xa7,0x25,0x25, 0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03, 0x04,0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x04,0x05, 0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06, 0x07,0x08,0x06,0x06,0x08,0x08,0x08,0x0a,0x0d,0x0d,0x0f,0x16,0x15,0x1a,0x1b,0x19, 0x1f,0x1c,0x1a,0x20,0x1c,0x1a,0x20,0x1d,0x1b,0x21,0x1d,0x1b,0x21,0x1e,0x1c,0x23, 0x22,0x20,0x29,0x26,0x25,0x31,0x2c,0x2e,0x3a,0x3a,0x3e,0x48,0x4a,0x4e,0x5b,0x51, 0x57,0x67,0x4f,0x53,0x63,0x47,0x4c,0x5c,0x56,0x5b,0x69,0x5e,0x61,0x6b,0x55,0x55, 0x60,0x64,0x61,0x6b,0x78,0x76,0x81,0x8c,0x94,0xac,0x71,0x7b,0x98,0x59,0x65,0x86, 0x53,0x5e,0x82,0x55,0x60,0x86,0x57,0x63,0x88,0x58,0x63,0x89,0x58,0x63,0x89,0x57, 0x62,0x89,0x56,0x62,0x87,0x55,0x60,0x86,0x55,0x5f,0x85,0x5c,0x54,0x77,0x53,0x51, 0x79,0x29,0x2e,0x3e,0x12,0x13,0x17,0x12,0x12,0x16,0x12,0x13,0x16,0x0e,0x0f,0x12, 0x14,0x12,0x16,0x5e,0x58,0x67,0x66,0x71,0x93,0x44,0x4b,0x6d,0x5a,0x4f,0x75,0x5d, 0x53,0x77,0x5d,0x53,0x78,0x5e,0x54,0x78,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x54, 0x76,0x60,0x53,0x77,0x5f,0x54,0x77,0x60,0x54,0x77,0x60,0x55,0x77,0x61,0x57,0x79, 0x61,0x59,0x79,0x41,0x3e,0x4e,0x1b,0x1d,0x22,0x1c,0x1e,0x23,0x19,0x1b,0x20,0x17, 0x19,0x1e,0x16,0x17,0x1c,0x12,0x14,0x18,0x11,0x12,0x15,0x0d,0x0e,0x11,0x33,0x31, 0x36,0x95,0x84,0xb9,0x58,0x50,0x72,0x4e,0x47,0x68,0x58,0x51,0x77,0x59,0x51,0x77, 0x55,0x50,0x78,0x54,0x50,0x78,0x51,0x4f,0x78,0x52,0x4f,0x79,0x52,0x50,0x7a,0x52, 0x52,0x7c,0x53,0x58,0x80,0x4d,0x57,0x7d,0x49,0x52,0x74,0x57,0x61,0x88,0x21,0x1c, 0x21,0x27,0x21,0x27,0x2d,0x27,0x2f,0x2c,0x26,0x2e,0x41,0x44,0x56,0x77,0x82,0xa6, 0x40,0x43,0x5b,0x3c,0x40,0x57,0x3c,0x40,0x58,0x3d,0x41,0x59,0x46,0x4c,0x65,0x20, 0x23,0x2d,0x1f,0x22,0x2c,0x1f,0x22,0x2b,0x4a,0x44,0x55,0x52,0x4a,0x5d,0x5c,0x65, 0x82,0x4e,0x4f,0x72,0x54,0x51,0x70,0x42,0x41,0x52,0x9f,0xa1,0xac,0x79,0x7c,0x92, 0x4d,0x4c,0x60,0x2e,0x2a,0x37,0x30,0x2a,0x37,0x32,0x2c,0x39,0x34,0x2e,0x3a,0x36, 0x30,0x3d,0x30,0x2a,0x36,0x20,0x1c,0x24,0x2b,0x26,0x31,0x2a,0x25,0x2f,0x19,0x19, 0x22,0x18,0x17,0x1f,0x54,0x47,0x5c,0x67,0x60,0x80,0x68,0x60,0x80,0x67,0x65,0x85, 0x4f,0x53,0x7c,0x56,0x50,0x74,0x5c,0x51,0x74,0x5b,0x50,0x73,0x53,0x43,0x62,0x42, 0x33,0x4e,0x44,0x39,0x56,0x55,0x5a,0x72,0x09,0x09,0x0c,0x0a,0x0a,0x0e,0x12,0x11, 0x16,0x28,0x21,0x29,0x25,0x1e,0x25,0x50,0x4e,0x76,0x56,0x4f,0x74,0x5b,0x50,0x73, 0x5d,0x51,0x73,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e, 0x52,0x75,0x5f,0x52,0x76,0x5e,0x52,0x76,0x5e,0x52,0x76,0x60,0x52,0x76,0x5a,0x45, 0x5e,0x47,0x37,0x4e,0x53,0x43,0x5b,0x65,0x5e,0x83,0x2d,0x31,0x41,0x26,0x2a,0x35, 0x2d,0x31,0x3d,0x2e,0x33,0x3f,0x32,0x36,0x42,0x32,0x36,0x43,0x32,0x36,0x43,0x2f, 0x34,0x40,0x2e,0x32,0x3e,0x2c,0x2f,0x3a,0x2a,0x2e,0x39,0x28,0x2c,0x37,0x28,0x2c, 0x36,0x27,0x2b,0x36,0x25,0x27,0x32,0x22,0x25,0x2e,0x1e,0x21,0x2a,0x1d,0x1f,0x28, 0x1a,0x1d,0x25,0x19,0x1b,0x23,0x19,0x1a,0x22,0x17,0x1a,0x21,0x16,0x18,0x1e,0x14, 0x16,0x1d,0x13,0x15,0x1b,0x12,0x14,0x1a,0x11,0x12,0x18,0x10,0x12,0x16,0x0f,0x10, 0x16,0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0b,0x0c,0x10,0x0a,0x0c,0x0f,0x0a,0x0a,0x0e, 0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x07,0x0a,0x06, 0x06,0x09,0x05,0x06,0x07,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x03,0x04, 0x05,0x03,0x03,0x05,0x1b,0x1c,0x1d,0x8f,0x98,0xb3,0x51,0x59,0x82,0x5e,0x53,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f, 0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52, 0x76,0x5f,0x52,0x76,0x60,0x53,0x78,0x7f,0x6e,0x9e,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,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,0x37,0x3e,0x54,0x52,0x5c,0x85,0x60,0x48, 0x65,0x5d,0x52,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b, 0x52,0x52,0x7c,0x52,0x5a,0x83,0x53,0x5e,0x87,0x54,0x60,0x89,0x52,0x4f,0x7a,0x65, 0x54,0x73,0x5a,0x54,0x7b,0x5b,0x5d,0x85,0xc4,0xca,0xd8,0xdf,0xe1,0xe9,0xd5,0xd8, 0xe2,0xd2,0xd6,0xe1,0xd1,0xd5,0xe0,0xcb,0xd0,0xdd,0xc7,0xcb,0xd9,0xc0,0xc6,0xd6, 0xb5,0xbc,0xcf,0xab,0xb2,0xc7,0xa5,0xad,0xc4,0xa1,0xaa,0xc0,0x9d,0xa7,0xbf,0x9a, 0xa3,0xbc,0x9b,0xa4,0xbc,0x98,0xa1,0xba,0x99,0xa2,0xbb,0x95,0x9f,0xb9,0x93,0x9c, 0xb8,0x8c,0x96,0xb3,0x88,0x92,0xb0,0x82,0x8c,0xab,0x7a,0x84,0xa5,0x73,0x7e,0xa1, 0x71,0x7c,0xa0,0x6c,0x77,0x9c,0x67,0x73,0x99,0x52,0x5d,0x88,0x52,0x5c,0x86,0x64, 0x53,0x75,0x53,0x3c,0x54,0x4c,0x35,0x4b,0x53,0x3c,0x54,0x54,0x3c,0x54,0x5b,0x44, 0x5e,0x5f,0x52,0x76,0x5b,0x51,0x77,0x5a,0x51,0x77,0x5a,0x51,0x77,0x5b,0x51,0x77, 0x5b,0x51,0x77,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5c, 0x52,0x77,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5f,0x52, 0x75,0x5f,0x52,0x75,0x5f,0x51,0x75,0x5d,0x52,0x77,0x61,0x52,0x75,0x5e,0x52,0x75, 0x60,0x52,0x75,0x63,0x52,0x75,0x63,0x52,0x75,0x63,0x52,0x75,0x63,0x52,0x75,0x64, 0x53,0x75,0x64,0x53,0x75,0x64,0x50,0x6f,0x64,0x52,0x73,0x64,0x53,0x75,0x64,0x4e, 0x6d,0x64,0x52,0x72,0x64,0x53,0x75,0x64,0x53,0x76,0x5b,0x43,0x5d,0x62,0x4a,0x66, 0x5c,0x4c,0x6a,0x64,0x53,0x74,0x63,0x4b,0x67,0x5b,0x52,0x79,0x5a,0x52,0x79,0x54, 0x50,0x79,0x52,0x4f,0x7a,0x52,0x50,0x7c,0x52,0x55,0x80,0x52,0x5d,0x86,0x54,0x5f, 0x89,0x56,0x62,0x8b,0x53,0x50,0x7a,0x64,0x53,0x74,0xad,0xb4,0xc9,0xc6,0xca,0xd9, 0x6d,0x5d,0x6e,0x75,0x60,0x79,0x75,0x69,0x89,0x6f,0x68,0x8a,0x68,0x67,0x8c,0x41, 0x46,0x59,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,0x91,0x92,0x96,0x73, 0x7e,0xa1,0x5f,0x53,0x77,0x64,0x4e,0x6c,0x52,0x57,0x83,0x52,0x57,0x83,0x52,0x5b, 0x85,0x52,0x5d,0x88,0x53,0x5d,0x88,0x53,0x5e,0x88,0x54,0x5f,0x89,0x55,0x60,0x8a, 0x56,0x62,0x8b,0x55,0x60,0x8a,0x54,0x60,0x8a,0x53,0x5e,0x87,0x64,0x53,0x75,0x60, 0x6d,0x92,0x85,0x86,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03, 0x03,0x04,0x02,0x02,0x03,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x04,0x04,0x04, 0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06, 0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x08,0x0a,0x0a,0x0d,0x10, 0x0f,0x13,0x15,0x14,0x19,0x1a,0x18,0x1e,0x1d,0x1b,0x21,0x1c,0x1a,0x20,0x1d,0x1b, 0x21,0x1f,0x1c,0x23,0x21,0x1e,0x26,0x23,0x21,0x29,0x25,0x22,0x2c,0x27,0x27,0x33, 0x31,0x32,0x42,0x3f,0x3d,0x50,0x40,0x3e,0x50,0x40,0x42,0x53,0x58,0x5b,0x6b,0x67, 0x6b,0x77,0x5e,0x61,0x6c,0x69,0x68,0x73,0x80,0x7f,0x8b,0x8f,0x96,0xab,0x76,0x7e, 0x99,0x64,0x6e,0x8d,0x59,0x63,0x85,0x59,0x64,0x86,0x5d,0x69,0x8b,0x5e,0x69,0x8d, 0x5b,0x66,0x8a,0x58,0x63,0x88,0x57,0x61,0x86,0x55,0x5f,0x85,0x53,0x5d,0x83,0x5b, 0x54,0x77,0x53,0x52,0x79,0x25,0x29,0x37,0x13,0x15,0x19,0x14,0x16,0x1a,0x12,0x14, 0x18,0x0e,0x10,0x13,0x0f,0x10,0x13,0x5d,0x54,0x63,0x68,0x73,0x95,0x46,0x4f,0x6f, 0x59,0x50,0x75,0x5c,0x53,0x78,0x5d,0x53,0x78,0x5e,0x54,0x78,0x5f,0x54,0x76,0x5f, 0x54,0x76,0x5f,0x54,0x76,0x60,0x53,0x77,0x5f,0x54,0x77,0x60,0x54,0x77,0x60,0x55, 0x77,0x60,0x57,0x77,0x61,0x59,0x79,0x43,0x3f,0x51,0x1b,0x1e,0x23,0x1b,0x1d,0x22, 0x1a,0x1c,0x22,0x17,0x1a,0x1e,0x15,0x16,0x1a,0x13,0x14,0x18,0x11,0x12,0x16,0x0e, 0x0e,0x12,0x22,0x20,0x25,0x9b,0x88,0xc1,0x5e,0x54,0x79,0x51,0x48,0x68,0x5a,0x52, 0x77,0x59,0x51,0x77,0x56,0x50,0x78,0x54,0x50,0x77,0x51,0x4f,0x79,0x52,0x4f,0x7a, 0x52,0x50,0x7a,0x52,0x53,0x7c,0x52,0x58,0x81,0x4e,0x55,0x7a,0x49,0x54,0x76,0x5a, 0x65,0x8d,0x22,0x1e,0x24,0x27,0x21,0x27,0x2c,0x26,0x2d,0x2d,0x27,0x2f,0x29,0x26, 0x2e,0x7a,0x86,0xab,0x62,0x6b,0x8b,0x3b,0x3f,0x56,0x3a,0x3f,0x56,0x3c,0x40,0x58, 0x3c,0x40,0x57,0x34,0x39,0x4c,0x1e,0x22,0x2b,0x1f,0x22,0x2c,0x4b,0x45,0x57,0x53, 0x4b,0x5e,0x5c,0x5f,0x79,0x4f,0x51,0x73,0x56,0x52,0x72,0x3b,0x39,0x4b,0x3f,0x39, 0x49,0x85,0x89,0x9a,0x68,0x6d,0x89,0x48,0x4a,0x61,0x26,0x26,0x33,0x23,0x22,0x2e, 0x26,0x24,0x30,0x28,0x25,0x31,0x24,0x22,0x2d,0x1a,0x18,0x20,0x24,0x20,0x29,0x2a, 0x25,0x30,0x22,0x1e,0x29,0x17,0x17,0x1f,0x32,0x2c,0x39,0x69,0x5b,0x74,0x5f,0x5e, 0x81,0x6d,0x60,0x79,0x59,0x5f,0x82,0x4f,0x4d,0x74,0x5b,0x51,0x72,0x5c,0x51,0x73, 0x55,0x47,0x65,0x4a,0x3b,0x54,0x48,0x3d,0x58,0x53,0x56,0x6f,0x11,0x12,0x16,0x10, 0x12,0x16,0x13,0x13,0x19,0x27,0x1f,0x28,0x24,0x1d,0x25,0x4f,0x4d,0x74,0x59,0x51, 0x73,0x5b,0x51,0x72,0x5c,0x51,0x73,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5f,0x52,0x75, 0x5f,0x53,0x76,0x5e,0x53,0x76,0x5f,0x52,0x76,0x5e,0x53,0x76,0x5e,0x52,0x76,0x5e, 0x52,0x75,0x5a,0x46,0x61,0x48,0x3a,0x50,0x53,0x45,0x5d,0x68,0x60,0x83,0x30,0x34, 0x42,0x2e,0x32,0x3e,0x34,0x38,0x44,0x35,0x39,0x46,0x34,0x38,0x45,0x36,0x3a,0x46, 0x34,0x38,0x45,0x32,0x36,0x42,0x31,0x35,0x42,0x30,0x33,0x40,0x2e,0x32,0x3e,0x2e, 0x31,0x3d,0x2d,0x31,0x3b,0x2c,0x30,0x3a,0x29,0x2c,0x37,0x26,0x29,0x32,0x22,0x24, 0x2e,0x1e,0x21,0x2a,0x1d,0x1f,0x28,0x1c,0x1e,0x26,0x1b,0x1e,0x26,0x1a,0x1c,0x23, 0x17,0x1a,0x21,0x16,0x17,0x1e,0x15,0x17,0x1e,0x13,0x15,0x1b,0x13,0x15,0x1a,0x11, 0x12,0x18,0x12,0x12,0x17,0x10,0x12,0x16,0x0e,0x0f,0x13,0x0c,0x0e,0x12,0x0c,0x0d, 0x11,0x0a,0x0c,0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x07,0x08,0x0b, 0x06,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x05,0x06,0x07,0x04,0x05,0x06,0x04, 0x05,0x06,0x04,0x05,0x06,0x03,0x03,0x05,0x05,0x05,0x06,0x96,0x9e,0xb7,0x53,0x5f, 0x88,0x5c,0x52,0x78,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76, 0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f, 0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x7a,0x69,0x98,0x06,0x06, 0x07,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,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,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x5a,0x74,0x52, 0x50,0x7c,0x64,0x53,0x74,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x50,0x7b,0x52,0x54,0x7e,0x52,0x58,0x82,0x53,0x5e,0x87,0x56,0x62,0x8a, 0x52,0x52,0x7d,0x65,0x54,0x74,0x58,0x54,0x7b,0x5c,0x60,0x89,0xd5,0xd8,0xe3,0xdb, 0xde,0xe7,0xd3,0xd7,0xe2,0xd3,0xd7,0xe1,0xd0,0xd3,0xdf,0xcb,0xd0,0xdd,0xc3,0xc9, 0xd8,0xbf,0xc4,0xd5,0xb5,0xbc,0xcf,0xaa,0xb2,0xc7,0xa4,0xad,0xc3,0xa0,0xa8,0xbf, 0x9c,0xa5,0xbe,0x9b,0xa3,0xbc,0x99,0xa1,0xbb,0x98,0xa1,0xba,0x98,0xa1,0xba,0x95, 0x9f,0xb9,0x91,0x9a,0xb5,0x8c,0x96,0xb3,0x86,0x91,0xaf,0x82,0x8c,0xab,0x7a,0x85, 0xa7,0x75,0x81,0xa2,0x72,0x7d,0xa1,0x6d,0x79,0x9c,0x66,0x73,0x98,0x62,0x6e,0x94, 0x5e,0x6a,0x91,0x52,0x4f,0x7a,0x64,0x52,0x71,0x64,0x4c,0x69,0x64,0x53,0x75,0x64, 0x53,0x76,0x64,0x53,0x75,0x63,0x51,0x72,0x5b,0x51,0x78,0x59,0x51,0x77,0x5a,0x51, 0x77,0x5b,0x51,0x77,0x5b,0x51,0x77,0x5c,0x51,0x77,0x5d,0x52,0x77,0x5c,0x52,0x77, 0x5c,0x52,0x77,0x5c,0x52,0x77,0x5c,0x52,0x77,0x5e,0x52,0x75,0x5f,0x52,0x75,0x5f, 0x51,0x75,0x5f,0x51,0x75,0x5f,0x51,0x75,0x5e,0x52,0x75,0x5f,0x52,0x75,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x61,0x52,0x76,0x61,0x52,0x76,0x62,0x52,0x76,0x63,0x52,0x75, 0x63,0x52,0x75,0x64,0x53,0x75,0x64,0x4f,0x6e,0x64,0x4e,0x6d,0x5b,0x4c,0x6b,0x60, 0x50,0x71,0x64,0x50,0x71,0x62,0x4a,0x65,0x64,0x53,0x75,0x64,0x53,0x75,0x60,0x48, 0x65,0x54,0x3d,0x55,0x62,0x4b,0x66,0x5a,0x41,0x5c,0x62,0x4a,0x66,0x5c,0x52,0x79, 0x58,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7c,0x52,0x53,0x7e,0x52, 0x5d,0x86,0x54,0x5f,0x89,0x55,0x60,0x8a,0x52,0x52,0x7c,0x64,0x4e,0x6c,0x96,0xa0, 0xba,0xc6,0xca,0xd9,0x7b,0x6d,0x7e,0x77,0x62,0x7b,0x6e,0x67,0x8a,0x68,0x66,0x8b, 0x68,0x70,0x95,0x50,0x57,0x6c,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, 0x41,0x41,0x41,0x8c,0x96,0xb3,0x54,0x60,0x8a,0x5d,0x45,0x5f,0x52,0x53,0x7e,0x52, 0x57,0x82,0x52,0x57,0x83,0x52,0x5b,0x85,0x52,0x5d,0x88,0x53,0x5e,0x89,0x53,0x5f, 0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x60,0x8a,0x55,0x60,0x8a,0x55,0x60,0x8a, 0x53,0x4f,0x7a,0x52,0x52,0x7d,0x99,0xa1,0xb7,0x10,0x10,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03, 0x04,0x05,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x05, 0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08, 0x08,0x08,0x0a,0x0b,0x0b,0x0e,0x10,0x0f,0x13,0x15,0x13,0x18,0x1a,0x17,0x1d,0x1d, 0x1a,0x20,0x1e,0x1b,0x22,0x21,0x1e,0x25,0x24,0x20,0x29,0x24,0x21,0x29,0x24,0x20, 0x2a,0x24,0x21,0x2b,0x30,0x2a,0x36,0x3e,0x36,0x46,0x42,0x3b,0x4b,0x42,0x3e,0x51, 0x45,0x45,0x5a,0x4f,0x53,0x65,0x52,0x55,0x65,0x60,0x5f,0x6e,0x6a,0x6a,0x77,0x7d, 0x84,0x9b,0x6b,0x73,0x8d,0x67,0x70,0x8c,0x64,0x6e,0x8b,0x68,0x72,0x91,0x6f,0x79, 0x96,0x72,0x7c,0x9a,0x73,0x7c,0x9a,0x6a,0x74,0x94,0x60,0x6a,0x8d,0x59,0x62,0x87, 0x54,0x5e,0x82,0x5c,0x54,0x77,0x54,0x56,0x7c,0x26,0x2a,0x39,0x16,0x17,0x1c,0x15, 0x16,0x1b,0x14,0x16,0x1a,0x0f,0x11,0x13,0x0d,0x0e,0x10,0x5c,0x4f,0x60,0x68,0x73, 0x96,0x44,0x4c,0x6f,0x56,0x4e,0x73,0x5d,0x53,0x78,0x5d,0x53,0x78,0x5d,0x53,0x78, 0x5f,0x54,0x76,0x5f,0x54,0x77,0x5f,0x54,0x77,0x60,0x53,0x76,0x5f,0x54,0x77,0x5f, 0x54,0x76,0x60,0x55,0x78,0x60,0x58,0x78,0x61,0x59,0x79,0x48,0x42,0x55,0x1c,0x1e, 0x23,0x1c,0x1e,0x23,0x1b,0x1d,0x22,0x19,0x1b,0x20,0x16,0x17,0x1c,0x13,0x15,0x19, 0x11,0x12,0x16,0x0e,0x0f,0x12,0x17,0x15,0x1a,0xa1,0x8b,0xc7,0x61,0x56,0x7d,0x4f, 0x47,0x66,0x5a,0x52,0x77,0x59,0x51,0x77,0x56,0x50,0x78,0x54,0x50,0x77,0x54,0x50, 0x78,0x51,0x4f,0x79,0x52,0x4f,0x7a,0x52,0x52,0x7b,0x52,0x55,0x7e,0x4d,0x56,0x7a, 0x49,0x50,0x73,0x5b,0x66,0x90,0x19,0x18,0x1f,0x28,0x22,0x2a,0x2a,0x24,0x2b,0x2d, 0x26,0x2e,0x29,0x25,0x2c,0x4f,0x53,0x6b,0x69,0x75,0x97,0x39,0x3e,0x55,0x3a,0x3e, 0x56,0x40,0x45,0x5d,0x3c,0x40,0x58,0x40,0x45,0x60,0x1f,0x22,0x2b,0x20,0x22,0x2c, 0x4b,0x45,0x57,0x54,0x4c,0x5e,0x5b,0x58,0x6e,0x50,0x52,0x75,0x57,0x53,0x73,0x3b, 0x37,0x47,0x3d,0x39,0x46,0x40,0x3a,0x49,0x62,0x67,0x7f,0x5e,0x67,0x83,0x4f,0x57, 0x72,0x23,0x26,0x32,0x1c,0x1e,0x28,0x1c,0x1d,0x27,0x1a,0x1c,0x25,0x1a,0x1a,0x24, 0x21,0x1f,0x29,0x24,0x20,0x2a,0x29,0x24,0x2f,0x22,0x1f,0x2a,0x1d,0x1c,0x26,0x5a, 0x4d,0x63,0x6a,0x5d,0x77,0x6b,0x60,0x7a,0x6c,0x68,0x86,0x4f,0x4e,0x75,0x5b,0x51, 0x72,0x5c,0x51,0x73,0x59,0x4b,0x6b,0x4e,0x3f,0x5b,0x4d,0x3f,0x58,0x5a,0x5a,0x76, 0x23,0x26,0x2b,0x1f,0x22,0x27,0x1a,0x1b,0x21,0x26,0x21,0x29,0x23,0x1e,0x25,0x4f, 0x4d,0x74,0x58,0x50,0x73,0x5a,0x50,0x72,0x5c,0x51,0x74,0x5d,0x51,0x74,0x5e,0x53, 0x75,0x5f,0x54,0x76,0x60,0x53,0x77,0x5f,0x54,0x76,0x5f,0x53,0x76,0x5e,0x53,0x76, 0x5e,0x52,0x76,0x5e,0x52,0x75,0x5b,0x47,0x62,0x49,0x3c,0x52,0x53,0x46,0x5d,0x65, 0x60,0x85,0x34,0x37,0x46,0x34,0x38,0x44,0x3a,0x3e,0x4b,0x39,0x3d,0x4a,0x38,0x3d, 0x4a,0x34,0x38,0x46,0x34,0x39,0x46,0x32,0x36,0x43,0x32,0x36,0x42,0x32,0x36,0x42, 0x30,0x34,0x40,0x30,0x34,0x3f,0x30,0x33,0x3e,0x2e,0x32,0x3d,0x2a,0x2e,0x38,0x26, 0x29,0x33,0x22,0x26,0x2f,0x20,0x23,0x2d,0x1f,0x22,0x2b,0x1f,0x22,0x2a,0x1e,0x20, 0x29,0x1c,0x1f,0x27,0x1a,0x1c,0x24,0x17,0x1a,0x21,0x15,0x16,0x1e,0x15,0x16,0x1e, 0x13,0x16,0x1c,0x12,0x14,0x1a,0x12,0x14,0x1a,0x11,0x12,0x17,0x0f,0x11,0x16,0x0e, 0x0e,0x13,0x0d,0x0e,0x12,0x0c,0x0e,0x12,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x09,0x0a, 0x0d,0x08,0x09,0x0b,0x07,0x08,0x0b,0x06,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08, 0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x80, 0x87,0x9b,0x59,0x63,0x8b,0x55,0x4f,0x77,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53, 0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77, 0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x6c, 0x5d,0x86,0x22,0x1d,0x23,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,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, 0x57,0x62,0x82,0x5b,0x52,0x79,0x57,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7c,0x52,0x54,0x7e,0x52,0x57,0x81,0x53,0x5e, 0x87,0x56,0x62,0x8a,0x52,0x5a,0x83,0x65,0x54,0x76,0x57,0x55,0x7d,0x5e,0x67,0x8d, 0xdf,0xe2,0xea,0xd8,0xdb,0xe5,0xd5,0xd9,0xe3,0xd3,0xd7,0xe1,0xcf,0xd2,0xdf,0xc9, 0xce,0xdb,0xc2,0xc8,0xd7,0xbc,0xc3,0xd3,0xb3,0xba,0xce,0xaa,0xb1,0xc6,0xa3,0xaa, 0xc2,0x9d,0xa7,0xbf,0x9b,0xa4,0xbc,0x9b,0xa4,0xbc,0x95,0x9f,0xb9,0x96,0xa0,0xba, 0x96,0xa0,0xb9,0x93,0x9c,0xb8,0x90,0x9a,0xb5,0x8c,0x96,0xb3,0x88,0x92,0xb0,0x80, 0x8b,0xaa,0x7a,0x85,0xa5,0x74,0x80,0xa2,0x71,0x7c,0xa0,0x6d,0x79,0x9c,0x66,0x73, 0x98,0x65,0x72,0x96,0x5e,0x6b,0x92,0x5e,0x53,0x79,0x64,0x4d,0x6a,0x64,0x4f,0x6e, 0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x63,0x4f,0x70,0x57,0x4f,0x78,0x5b, 0x51,0x78,0x59,0x51,0x77,0x5c,0x51,0x77,0x5c,0x52,0x77,0x5d,0x52,0x77,0x5d,0x51, 0x77,0x5d,0x52,0x77,0x5d,0x52,0x77,0x5d,0x51,0x77,0x5c,0x51,0x77,0x5e,0x51,0x75, 0x5e,0x51,0x75,0x5f,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x60,0x52,0x75,0x5e, 0x52,0x75,0x60,0x52,0x75,0x61,0x52,0x76,0x61,0x52,0x76,0x61,0x52,0x76,0x62,0x52, 0x76,0x61,0x52,0x76,0x64,0x53,0x76,0x64,0x53,0x74,0x5e,0x46,0x62,0x64,0x53,0x76, 0x3f,0x37,0x4d,0x4c,0x46,0x67,0x63,0x53,0x77,0x5e,0x46,0x62,0x64,0x52,0x72,0x64, 0x53,0x76,0x64,0x52,0x72,0x5b,0x43,0x5d,0x5f,0x48,0x64,0x58,0x40,0x5b,0x64,0x52, 0x72,0x5a,0x52,0x79,0x57,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x50,0x7c, 0x52,0x54,0x7e,0x52,0x5a,0x84,0x55,0x60,0x8a,0x54,0x60,0x8a,0x52,0x5d,0x88,0x63, 0x4b,0x67,0x84,0x8e,0xad,0xc3,0xc9,0xd8,0x87,0x7d,0x8d,0x78,0x67,0x83,0x6a,0x67, 0x8a,0x68,0x66,0x8c,0x68,0x72,0x96,0x5d,0x65,0x7d,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,0xa6,0xab,0xb9,0x62,0x6d,0x94,0x64,0x4e,0x6c, 0x52,0x4f,0x7a,0x52,0x55,0x80,0x52,0x57,0x83,0x52,0x5a,0x84,0x52,0x5d,0x86,0x53, 0x5e,0x88,0x53,0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x55,0x60, 0x8a,0x55,0x60,0x8a,0x52,0x57,0x82,0x63,0x53,0x77,0x64,0x71,0x95,0x6e,0x6e,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x04,0x04, 0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x06,0x06,0x06,0x04,0x05,0x06,0x06,0x06, 0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x08,0x08,0x0a,0x09,0x09,0x0c,0x0d,0x0d,0x10, 0x13,0x12,0x17,0x1a,0x18,0x1e,0x1e,0x1c,0x23,0x23,0x1f,0x27,0x24,0x21,0x29,0x24, 0x21,0x29,0x24,0x21,0x29,0x24,0x20,0x2a,0x27,0x23,0x2c,0x33,0x2c,0x3a,0x3c,0x35, 0x44,0x44,0x3d,0x4d,0x4e,0x44,0x56,0x4e,0x46,0x59,0x4c,0x44,0x57,0x50,0x49,0x5d, 0x55,0x50,0x61,0x67,0x6a,0x82,0x5a,0x5e,0x7b,0x5a,0x62,0x80,0x6b,0x72,0x8f,0x77, 0x80,0x99,0x75,0x7d,0x99,0x7c,0x84,0xa0,0x89,0x90,0xa9,0x88,0x90,0xa8,0x78,0x80, 0x9c,0x66,0x6e,0x8e,0x57,0x61,0x85,0x60,0x57,0x76,0x55,0x57,0x7b,0x2a,0x2e,0x3d, 0x17,0x19,0x1e,0x16,0x18,0x1d,0x15,0x16,0x1a,0x11,0x12,0x16,0x0e,0x0e,0x11,0x59, 0x4c,0x5c,0x6b,0x76,0x97,0x45,0x4d,0x6e,0x52,0x4b,0x71,0x5d,0x53,0x78,0x5d,0x53, 0x78,0x5d,0x53,0x78,0x5f,0x54,0x77,0x5f,0x54,0x77,0x5f,0x54,0x77,0x60,0x53,0x76, 0x5f,0x54,0x77,0x5f,0x54,0x76,0x60,0x55,0x77,0x61,0x57,0x78,0x61,0x58,0x78,0x49, 0x43,0x57,0x1e,0x1f,0x26,0x1c,0x1e,0x23,0x1b,0x1d,0x22,0x1a,0x1b,0x20,0x17,0x19, 0x1e,0x14,0x15,0x19,0x11,0x12,0x16,0x0f,0x11,0x13,0x11,0x12,0x15,0x9d,0x8b,0xc7, 0x67,0x5a,0x7f,0x4e,0x46,0x64,0x58,0x4f,0x73,0x59,0x51,0x77,0x56,0x50,0x77,0x54, 0x50,0x77,0x53,0x50,0x78,0x51,0x4f,0x79,0x52,0x4f,0x79,0x52,0x51,0x7a,0x52,0x52, 0x7b,0x4f,0x52,0x7a,0x48,0x52,0x74,0x5d,0x6b,0x98,0x17,0x18,0x20,0x25,0x21,0x28, 0x29,0x23,0x2a,0x2c,0x25,0x2e,0x2b,0x27,0x2e,0x2a,0x28,0x32,0x7b,0x89,0xad,0x47, 0x4d,0x69,0x38,0x3d,0x53,0x3a,0x3f,0x57,0x59,0x61,0x82,0x3b,0x40,0x58,0x22,0x24, 0x2e,0x1f,0x22,0x2b,0x46,0x41,0x51,0x54,0x4c,0x5f,0x55,0x4e,0x63,0x54,0x5d,0x7f, 0x58,0x54,0x73,0x41,0x3d,0x4f,0x3e,0x38,0x46,0x44,0x3d,0x4c,0x42,0x3c,0x4a,0x57, 0x5c,0x75,0x58,0x62,0x80,0x50,0x57,0x74,0x28,0x2c,0x39,0x1b,0x1e,0x26,0x1a,0x1c, 0x24,0x19,0x1b,0x24,0x1c,0x1b,0x26,0x1f,0x1e,0x27,0x26,0x21,0x2b,0x2b,0x26,0x31, 0x20,0x1e,0x28,0x25,0x23,0x2e,0x67,0x58,0x71,0x67,0x60,0x7e,0x65,0x61,0x80,0x57, 0x5a,0x7e,0x56,0x4f,0x74,0x5b,0x51,0x72,0x5a,0x4d,0x70,0x52,0x44,0x60,0x4e,0x40, 0x5a,0x59,0x59,0x74,0x39,0x38,0x43,0x2b,0x2e,0x35,0x2c,0x2d,0x34,0x32,0x30,0x38, 0x2a,0x26,0x2e,0x4e,0x4d,0x74,0x58,0x50,0x73,0x5a,0x51,0x72,0x5d,0x52,0x74,0x5f, 0x54,0x75,0x61,0x55,0x78,0x62,0x55,0x79,0x61,0x56,0x79,0x61,0x55,0x78,0x60,0x53, 0x77,0x5f,0x53,0x76,0x5f,0x52,0x76,0x5e,0x52,0x75,0x5c,0x48,0x63,0x4b,0x3c,0x54, 0x55,0x47,0x5f,0x68,0x64,0x87,0x36,0x3b,0x49,0x39,0x3d,0x49,0x3e,0x43,0x50,0x3e, 0x42,0x4f,0x3a,0x3e,0x4b,0x34,0x38,0x45,0x32,0x36,0x42,0x31,0x35,0x42,0x32,0x36, 0x42,0x32,0x36,0x42,0x33,0x37,0x43,0x33,0x37,0x43,0x31,0x35,0x41,0x2e,0x32,0x3d, 0x2a,0x2e,0x39,0x29,0x2c,0x36,0x25,0x28,0x32,0x25,0x28,0x31,0x22,0x26,0x2f,0x24, 0x26,0x30,0x22,0x25,0x2e,0x21,0x24,0x2c,0x1e,0x20,0x28,0x19,0x1b,0x23,0x18,0x1a, 0x22,0x16,0x19,0x20,0x15,0x16,0x1e,0x14,0x16,0x1c,0x12,0x15,0x1b,0x12,0x14,0x1a, 0x12,0x14,0x1a,0x0f,0x0f,0x15,0x0e,0x10,0x15,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0a, 0x0b,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x08,0x09,0x0b,0x07,0x07,0x0a,0x06,0x07, 0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06, 0x03,0x03,0x04,0x55,0x5a,0x69,0x5e,0x6b,0x91,0x51,0x4e,0x78,0x5e,0x52,0x75,0x5e, 0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53, 0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76, 0x5f,0x52,0x76,0x65,0x57,0x7d,0x45,0x3d,0x57,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,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,0x06,0x07,0x09,0x56,0x62,0x8a,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x52,0x7c,0x52,0x55,0x7f,0x52, 0x5a,0x83,0x53,0x5f,0x88,0x56,0x63,0x8a,0x53,0x5e,0x88,0x65,0x54,0x76,0x58,0x55, 0x7e,0x64,0x71,0x95,0xe3,0xe6,0xed,0xd9,0xdd,0xe6,0xd7,0xdb,0xe5,0xd3,0xd8,0xe2, 0xcf,0xd3,0xdf,0xc8,0xcc,0xda,0xc2,0xc8,0xd7,0xba,0xc1,0xd1,0xb1,0xb8,0xcb,0xa7, 0xaf,0xc4,0xa1,0xa9,0xc1,0x9d,0xa5,0xbf,0x9b,0xa4,0xbc,0x99,0xa2,0xbb,0x95,0x9f, 0xb9,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x93,0x9c,0xb7,0x90,0x9a,0xb5,0x8d,0x98,0xb3, 0x89,0x93,0xb0,0x81,0x8b,0xaa,0x79,0x84,0xa4,0x76,0x82,0xa3,0x71,0x7c,0xa0,0x6c, 0x77,0x9b,0x66,0x73,0x98,0x66,0x72,0x98,0x57,0x63,0x8c,0x64,0x53,0x76,0x63,0x4c, 0x69,0x64,0x53,0x74,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x73, 0x5e,0x52,0x76,0x5b,0x51,0x78,0x5b,0x51,0x78,0x5c,0x51,0x77,0x5b,0x51,0x77,0x5c, 0x51,0x77,0x5c,0x51,0x77,0x5c,0x51,0x77,0x5c,0x51,0x77,0x5c,0x51,0x77,0x5d,0x52, 0x77,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5f,0x52,0x76,0x5d,0x52,0x78,0x5f,0x52,0x76,0x61, 0x52,0x76,0x61,0x52,0x76,0x61,0x52,0x76,0x63,0x53,0x77,0x60,0x48,0x65,0x60,0x48, 0x64,0x51,0x4d,0x77,0x38,0x2b,0x36,0x4f,0x4b,0x64,0x52,0x4f,0x7a,0x5e,0x46,0x60, 0x64,0x4e,0x6c,0x64,0x53,0x76,0x64,0x53,0x75,0x63,0x4b,0x69,0x64,0x4e,0x6d,0x64, 0x53,0x76,0x5c,0x52,0x79,0x5a,0x52,0x79,0x57,0x50,0x79,0x55,0x50,0x79,0x52,0x4f, 0x7a,0x52,0x4f,0x7b,0x52,0x54,0x7e,0x52,0x5d,0x86,0x53,0x5e,0x88,0x55,0x60,0x8a, 0x56,0x62,0x8b,0x60,0x48,0x65,0x79,0x84,0xa5,0xd2,0xd6,0xe1,0x91,0x8a,0x9a,0x78, 0x68,0x83,0x68,0x66,0x8b,0x68,0x67,0x8d,0x6a,0x74,0x98,0x6b,0x74,0x8e,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,0x72,0x73,0x76,0x73,0x7e, 0xa1,0x52,0x4f,0x7b,0x64,0x53,0x76,0x52,0x55,0x80,0x52,0x55,0x80,0x52,0x57,0x82, 0x52,0x5b,0x85,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x89,0x53,0x5f,0x89,0x54, 0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x53,0x5f,0x89,0x5c,0x52,0x79,0x52,0x53, 0x7e,0x8f,0x96,0xaa,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03, 0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x04, 0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x06, 0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x07, 0x09,0x07,0x08,0x0a,0x0a,0x0b,0x0d,0x12,0x11,0x15,0x1c,0x19,0x1f,0x23,0x1f,0x27, 0x24,0x20,0x28,0x24,0x21,0x29,0x24,0x21,0x2a,0x23,0x20,0x29,0x20,0x1d,0x26,0x29, 0x24,0x2e,0x32,0x2c,0x38,0x3c,0x34,0x43,0x4a,0x3e,0x4e,0x4e,0x41,0x52,0x4e,0x42, 0x52,0x55,0x48,0x59,0x4c,0x44,0x51,0x52,0x52,0x66,0x4c,0x4e,0x65,0x5b,0x5d,0x7a, 0x66,0x6e,0x8a,0x72,0x79,0x94,0x6f,0x78,0x94,0x77,0x7e,0x99,0x88,0x8f,0xa7,0x90, 0x97,0xad,0x8a,0x92,0xa9,0x7a,0x82,0x9d,0x64,0x6c,0x8c,0x62,0x59,0x78,0x54,0x55, 0x79,0x2a,0x2e,0x3d,0x18,0x1a,0x22,0x16,0x19,0x20,0x16,0x17,0x1d,0x12,0x12,0x16, 0x0e,0x0e,0x12,0x55,0x47,0x57,0x6e,0x78,0x98,0x46,0x50,0x72,0x50,0x4a,0x6f,0x5d, 0x52,0x77,0x5c,0x53,0x78,0x5d,0x53,0x78,0x5f,0x53,0x77,0x5f,0x54,0x77,0x5f,0x53, 0x77,0x60,0x53,0x76,0x5f,0x54,0x77,0x5f,0x54,0x76,0x60,0x55,0x77,0x61,0x57,0x78, 0x61,0x58,0x78,0x4e,0x47,0x5b,0x1f,0x1f,0x26,0x1d,0x1f,0x24,0x1b,0x1d,0x22,0x19, 0x1a,0x1f,0x17,0x19,0x1e,0x14,0x15,0x19,0x11,0x12,0x16,0x0f,0x10,0x13,0x0d,0x0e, 0x10,0x9e,0x8a,0xc7,0x69,0x5d,0x83,0x4b,0x45,0x60,0x58,0x50,0x74,0x5a,0x51,0x77, 0x56,0x50,0x77,0x54,0x50,0x77,0x53,0x4f,0x78,0x51,0x4f,0x79,0x51,0x4f,0x79,0x52, 0x4f,0x7a,0x51,0x52,0x7a,0x4f,0x52,0x79,0x45,0x4e,0x6f,0x5c,0x68,0x94,0x1a,0x1b, 0x26,0x15,0x14,0x19,0x2b,0x24,0x2b,0x29,0x24,0x2b,0x2b,0x25,0x2d,0x28,0x24,0x2c, 0x64,0x6d,0x8e,0x5c,0x66,0x88,0x39,0x3d,0x53,0x38,0x3d,0x53,0x47,0x4e,0x6a,0x59, 0x63,0x84,0x41,0x42,0x60,0x1e,0x22,0x2a,0x29,0x2a,0x35,0x55,0x4d,0x61,0x55,0x4d, 0x61,0x69,0x71,0x8e,0x57,0x54,0x74,0x3c,0x3b,0x4e,0x3a,0x37,0x43,0x43,0x3e,0x4d, 0x46,0x40,0x4f,0x45,0x3e,0x4e,0x4f,0x4f,0x65,0x54,0x5b,0x7a,0x50,0x59,0x79,0x30, 0x34,0x47,0x1b,0x1e,0x26,0x1a,0x1c,0x24,0x1a,0x1c,0x24,0x1a,0x1a,0x22,0x1a,0x1a, 0x22,0x22,0x20,0x2a,0x23,0x20,0x2b,0x17,0x17,0x20,0x38,0x33,0x42,0x67,0x5f,0x7d, 0x66,0x60,0x7f,0x6a,0x60,0x7b,0x4f,0x51,0x77,0x59,0x51,0x73,0x5a,0x4e,0x71,0x53, 0x46,0x65,0x4e,0x41,0x5b,0x51,0x4f,0x6b,0x53,0x4c,0x5a,0x29,0x2b,0x32,0x2f,0x30, 0x38,0x3e,0x3b,0x45,0x38,0x35,0x3f,0x54,0x54,0x78,0x57,0x50,0x73,0x5b,0x51,0x72, 0x5e,0x54,0x75,0x62,0x56,0x78,0x64,0x59,0x7a,0x65,0x5a,0x7b,0x64,0x59,0x7b,0x62, 0x57,0x79,0x61,0x55,0x78,0x5f,0x54,0x76,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5c,0x47, 0x64,0x4b,0x3c,0x54,0x55,0x48,0x5f,0x6a,0x65,0x89,0x3d,0x42,0x51,0x3e,0x43,0x51, 0x43,0x48,0x56,0x42,0x46,0x55,0x3c,0x40,0x4e,0x34,0x38,0x45,0x31,0x35,0x42,0x2e, 0x32,0x3f,0x2f,0x33,0x3f,0x32,0x36,0x42,0x33,0x37,0x43,0x32,0x36,0x42,0x2f,0x32, 0x3e,0x2d,0x31,0x3c,0x2a,0x2d,0x38,0x27,0x2a,0x35,0x26,0x2a,0x34,0x27,0x2a,0x34, 0x28,0x2c,0x36,0x27,0x2a,0x35,0x27,0x2a,0x33,0x24,0x27,0x31,0x22,0x24,0x2d,0x1d, 0x1f,0x27,0x19,0x1b,0x23,0x18,0x1a,0x22,0x16,0x18,0x1f,0x14,0x16,0x1d,0x14,0x16, 0x1d,0x14,0x16,0x1c,0x12,0x14,0x1a,0x12,0x13,0x19,0x10,0x12,0x17,0x0e,0x10,0x15, 0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x09,0x0a,0x0d,0x08, 0x09,0x0b,0x07,0x08,0x0a,0x06,0x07,0x09,0x06,0x07,0x09,0x05,0x06,0x07,0x04,0x05, 0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x2f,0x33,0x3b,0x69,0x74,0x98,0x51,0x4e,0x79, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53, 0x77,0x5f,0x53,0x77,0x5f,0x52,0x76,0x62,0x55,0x7a,0x6b,0x5c,0x85,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,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,0x16,0x19,0x1f,0x52,0x5a,0x83,0x55,0x50,0x79,0x54,0x50, 0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x52,0x7c, 0x52,0x53,0x7e,0x52,0x58,0x82,0x54,0x5f,0x88,0x57,0x63,0x8b,0x55,0x60,0x8a,0x64, 0x54,0x79,0x57,0x55,0x80,0x79,0x84,0xa4,0xe1,0xe2,0xea,0xd8,0xdb,0xe5,0xd7,0xda, 0xe5,0xd3,0xd7,0xe1,0xcf,0xd3,0xdf,0xc7,0xcb,0xda,0xc1,0xc7,0xd6,0xb8,0xbf,0xd0, 0xad,0xb5,0xc9,0xa5,0xad,0xc3,0x9d,0xa7,0xbf,0x9b,0xa4,0xbc,0x9a,0xa3,0xbb,0x96, 0xa0,0xba,0x94,0x9d,0xb8,0x93,0x9c,0xb7,0x93,0x9c,0xb7,0x91,0x9a,0xb5,0x8e,0x99, 0xb4,0x8c,0x96,0xb2,0x86,0x91,0xaf,0x7e,0x8a,0xa9,0x7c,0x86,0xa8,0x76,0x82,0xa3, 0x72,0x7d,0xa0,0x6c,0x79,0x9c,0x6a,0x75,0x9a,0x63,0x6e,0x95,0x55,0x60,0x8a,0x63, 0x53,0x77,0x63,0x4b,0x67,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x53,0x76,0x64,0x53, 0x76,0x64,0x53,0x75,0x63,0x4f,0x70,0x5d,0x52,0x78,0x5a,0x51,0x78,0x5b,0x51,0x78, 0x5c,0x51,0x77,0x5b,0x51,0x77,0x5d,0x52,0x77,0x5d,0x52,0x77,0x5d,0x52,0x77,0x5d, 0x52,0x77,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52, 0x75,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5d,0x52,0x78, 0x5d,0x52,0x78,0x61,0x52,0x76,0x61,0x52,0x76,0x62,0x53,0x77,0x64,0x53,0x73,0x5c, 0x44,0x5f,0x64,0x53,0x73,0x50,0x54,0x6e,0x3c,0x2d,0x37,0x54,0x49,0x5b,0x54,0x5f, 0x89,0x5e,0x46,0x62,0x64,0x50,0x71,0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x75, 0x5f,0x53,0x77,0x5f,0x53,0x77,0x5c,0x52,0x79,0x5b,0x52,0x79,0x57,0x50,0x79,0x54, 0x50,0x79,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x53,0x7e,0x52,0x5b,0x85,0x53,0x5e, 0x88,0x55,0x60,0x8a,0x58,0x65,0x8d,0x60,0x48,0x65,0x6a,0x75,0x9a,0xd7,0xda,0xe5, 0x9a,0x96,0xa7,0x78,0x68,0x85,0x68,0x67,0x8c,0x68,0x6b,0x91,0x69,0x73,0x97,0x70, 0x79,0x99,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,0x18, 0x18,0x18,0x8f,0x98,0xb3,0x56,0x62,0x8b,0x64,0x4d,0x6b,0x52,0x52,0x7d,0x52,0x55, 0x80,0x52,0x56,0x81,0x52,0x5b,0x85,0x52,0x5d,0x86,0x53,0x5d,0x88,0x53,0x5e,0x89, 0x53,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5f,0x89,0x52, 0x56,0x82,0x64,0x53,0x76,0x6a,0x75,0x99,0x4f,0x50,0x52,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x03,0x03, 0x04,0x02,0x02,0x03,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05, 0x04,0x05,0x06,0x04,0x05,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06, 0x06,0x08,0x07,0x07,0x09,0x06,0x07,0x09,0x07,0x08,0x0a,0x0a,0x09,0x0c,0x11,0x10, 0x14,0x1e,0x1b,0x22,0x23,0x1f,0x28,0x24,0x20,0x2a,0x28,0x24,0x2e,0x28,0x23,0x2e, 0x20,0x1d,0x26,0x20,0x1d,0x26,0x28,0x23,0x2d,0x2f,0x29,0x35,0x3c,0x34,0x42,0x47, 0x3d,0x4d,0x4c,0x41,0x52,0x56,0x48,0x59,0x57,0x4a,0x5a,0x54,0x50,0x63,0x46,0x46, 0x5a,0x4d,0x4d,0x65,0x57,0x59,0x77,0x59,0x62,0x80,0x5f,0x68,0x86,0x66,0x6f,0x8d, 0x79,0x80,0x9a,0x89,0x8f,0xa6,0x8e,0x94,0xaa,0x8b,0x92,0xa8,0x78,0x7f,0x99,0x6a, 0x61,0x7c,0x54,0x54,0x77,0x28,0x2c,0x3c,0x1e,0x1e,0x29,0x1e,0x1d,0x28,0x18,0x19, 0x22,0x13,0x15,0x1a,0x0e,0x0f,0x12,0x51,0x43,0x53,0x6e,0x78,0x97,0x48,0x52,0x72, 0x4f,0x4a,0x6d,0x5d,0x52,0x77,0x5c,0x53,0x78,0x5f,0x53,0x76,0x5f,0x53,0x77,0x5f, 0x54,0x77,0x5f,0x53,0x77,0x60,0x53,0x76,0x5f,0x54,0x77,0x5f,0x55,0x76,0x5f,0x55, 0x77,0x60,0x56,0x78,0x5f,0x57,0x75,0x4b,0x45,0x58,0x24,0x23,0x2b,0x23,0x23,0x2a, 0x20,0x21,0x27,0x1c,0x1c,0x22,0x16,0x18,0x1d,0x15,0x16,0x1b,0x12,0x13,0x17,0x0f, 0x11,0x13,0x0d,0x0e,0x10,0x99,0x86,0xbc,0x6c,0x5f,0x87,0x4a,0x42,0x5f,0x59,0x51, 0x76,0x5a,0x51,0x77,0x59,0x52,0x77,0x56,0x4f,0x78,0x55,0x50,0x78,0x53,0x4f,0x79, 0x51,0x4f,0x79,0x52,0x4f,0x7a,0x52,0x51,0x7b,0x4f,0x52,0x77,0x43,0x47,0x69,0x5a, 0x65,0x92,0x1d,0x1e,0x2a,0x0e,0x0e,0x12,0x31,0x29,0x32,0x2a,0x24,0x2b,0x2a,0x23, 0x2b,0x2a,0x26,0x2e,0x2e,0x2f,0x3b,0x64,0x6f,0x93,0x37,0x3c,0x53,0x38,0x3b,0x53, 0x38,0x3d,0x54,0x58,0x61,0x83,0x56,0x5b,0x83,0x20,0x22,0x2c,0x1f,0x22,0x2b,0x51, 0x4a,0x5c,0x55,0x4d,0x61,0x74,0x79,0x8f,0x51,0x52,0x74,0x4b,0x4a,0x64,0x22,0x24, 0x2f,0x34,0x32,0x3e,0x41,0x3c,0x4b,0x48,0x42,0x52,0x49,0x42,0x52,0x4d,0x47,0x5b, 0x51,0x57,0x76,0x4f,0x58,0x7a,0x35,0x38,0x4d,0x1b,0x1e,0x26,0x19,0x1c,0x24,0x18, 0x1a,0x23,0x1a,0x1a,0x24,0x19,0x18,0x20,0x19,0x18,0x22,0x17,0x19,0x21,0x18,0x1a, 0x22,0x53,0x4a,0x5e,0x6a,0x60,0x7c,0x68,0x5a,0x73,0x5f,0x5f,0x7c,0x4f,0x4d,0x74, 0x5a,0x51,0x72,0x56,0x49,0x68,0x51,0x42,0x5f,0x44,0x3c,0x57,0x60,0x57,0x69,0x24, 0x22,0x29,0x24,0x25,0x2c,0x3b,0x39,0x42,0x3d,0x3a,0x44,0x5c,0x5c,0x7f,0x5b,0x55, 0x77,0x5c,0x52,0x72,0x5f,0x56,0x76,0x63,0x5a,0x7a,0x67,0x5e,0x7e,0x69,0x60,0x7f, 0x68,0x5e,0x7e,0x66,0x5d,0x7d,0x64,0x59,0x7a,0x61,0x56,0x78,0x5f,0x53,0x76,0x5e, 0x53,0x75,0x5c,0x48,0x64,0x4b,0x3c,0x54,0x57,0x48,0x61,0x67,0x66,0x8a,0x45,0x4a, 0x58,0x4a,0x4e,0x5c,0x4e,0x52,0x61,0x4a,0x4e,0x5d,0x41,0x45,0x53,0x39,0x3d,0x4a, 0x33,0x37,0x45,0x2f,0x33,0x40,0x2f,0x33,0x40,0x30,0x34,0x41,0x31,0x35,0x41,0x32, 0x36,0x42,0x2f,0x32,0x3e,0x2d,0x30,0x3b,0x2a,0x2e,0x39,0x28,0x2c,0x36,0x29,0x2d, 0x37,0x2b,0x2e,0x39,0x2a,0x2e,0x39,0x2a,0x2e,0x38,0x28,0x2b,0x36,0x28,0x2b,0x35, 0x26,0x28,0x31,0x1f,0x22,0x2b,0x1b,0x1e,0x26,0x1a,0x1d,0x25,0x17,0x1a,0x22,0x16, 0x19,0x20,0x15,0x17,0x1e,0x15,0x16,0x1e,0x14,0x16,0x1c,0x13,0x15,0x1b,0x12,0x14, 0x1a,0x0f,0x11,0x16,0x0e,0x10,0x15,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0a,0x0c,0x0f, 0x0a,0x0a,0x0e,0x08,0x09,0x0b,0x08,0x08,0x0b,0x07,0x07,0x0a,0x06,0x07,0x0a,0x06, 0x07,0x09,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x11,0x12,0x15,0x76,0x80, 0xa1,0x51,0x54,0x7e,0x5c,0x52,0x77,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f, 0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x60,0x53,0x77,0x79,0x69, 0x97,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,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,0x24,0x29,0x35,0x52,0x52,0x7c,0x55, 0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x52,0x7c,0x52,0x55,0x80,0x52,0x5d,0x85,0x54,0x5f,0x88,0x57,0x63,0x8b, 0x58,0x64,0x8c,0x64,0x55,0x79,0x57,0x55,0x7e,0x93,0x9d,0xb8,0xde,0xe1,0xe8,0xd6, 0xd9,0xe5,0xd6,0xd9,0xe3,0xd3,0xd7,0xe1,0xce,0xd2,0xde,0xc7,0xcb,0xd9,0xbe,0xc3, 0xd3,0xb5,0xbc,0xcf,0xab,0xb2,0xc8,0xa3,0xab,0xc2,0x9d,0xa5,0xbf,0x98,0xa1,0xba, 0x96,0xa0,0xba,0x95,0x9f,0xb9,0x93,0x9c,0xb7,0x92,0x9b,0xb7,0x91,0x9a,0xb5,0x90, 0x9a,0xb5,0x8d,0x98,0xb3,0x8a,0x94,0xb1,0x86,0x91,0xaf,0x81,0x8b,0xaa,0x7a,0x85, 0xa5,0x76,0x82,0xa3,0x72,0x7d,0xa0,0x6f,0x7b,0x9f,0x6d,0x79,0x9c,0x60,0x6d,0x94, 0x52,0x5d,0x88,0x64,0x53,0x73,0x64,0x4c,0x6a,0x64,0x53,0x74,0x64,0x53,0x75,0x64, 0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x50,0x6e,0x5e,0x52,0x76,0x5c,0x51, 0x78,0x5b,0x51,0x78,0x5b,0x51,0x78,0x5b,0x51,0x78,0x5d,0x52,0x77,0x5d,0x52,0x77, 0x5d,0x52,0x77,0x5d,0x52,0x77,0x5f,0x52,0x76,0x5d,0x52,0x78,0x5f,0x52,0x76,0x5f, 0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52, 0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x61,0x52,0x76,0x62,0x53,0x77,0x64,0x53,0x76, 0x64,0x53,0x76,0x5d,0x45,0x60,0x52,0x52,0x7c,0x46,0x3f,0x4b,0x44,0x34,0x40,0x38, 0x2c,0x37,0x59,0x65,0x8b,0x63,0x4b,0x67,0x63,0x4b,0x69,0x64,0x53,0x76,0x62,0x53, 0x77,0x5e,0x53,0x79,0x5f,0x53,0x79,0x5e,0x53,0x79,0x5d,0x52,0x79,0x5b,0x52,0x79, 0x56,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x52,0x7d,0x52, 0x5a,0x84,0x52,0x5d,0x88,0x54,0x5f,0x89,0x56,0x62,0x8b,0x63,0x4b,0x67,0x58,0x65, 0x8d,0xd8,0xdb,0xe5,0xa2,0xa2,0xb2,0x78,0x67,0x82,0x68,0x67,0x8d,0x68,0x6f,0x94, 0x6a,0x74,0x98,0x74,0x7e,0xa0,0x05,0x05,0x06,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,0x89,0x8d,0x95,0x65,0x72,0x98,0x64,0x53,0x75,0x54, 0x50,0x79,0x52,0x54,0x7e,0x52,0x54,0x80,0x52,0x58,0x83,0x52,0x5d,0x86,0x52,0x5d, 0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89, 0x54,0x5f,0x89,0x53,0x5f,0x89,0x62,0x53,0x77,0x52,0x5d,0x85,0x83,0x89,0x9a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02, 0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x04, 0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x05,0x06, 0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x07,0x08,0x09,0x07,0x08,0x0a,0x08, 0x08,0x0a,0x09,0x0a,0x0b,0x11,0x0f,0x13,0x1b,0x19,0x1f,0x1f,0x1d,0x25,0x27,0x22, 0x2c,0x2b,0x25,0x30,0x29,0x24,0x2e,0x23,0x1f,0x28,0x22,0x1f,0x28,0x26,0x21,0x2c, 0x2a,0x25,0x2f,0x38,0x30,0x3e,0x42,0x3a,0x4a,0x4e,0x42,0x55,0x59,0x4a,0x5b,0x61, 0x59,0x70,0x47,0x44,0x59,0x45,0x43,0x58,0x45,0x45,0x5b,0x52,0x51,0x6b,0x5c,0x5b, 0x76,0x62,0x61,0x7f,0x5c,0x65,0x85,0x72,0x79,0x93,0x81,0x88,0x9f,0x8d,0x93,0xa8, 0x88,0x8e,0xa5,0x76,0x6e,0x85,0x55,0x56,0x78,0x2b,0x2d,0x3e,0x29,0x26,0x32,0x29, 0x26,0x32,0x1f,0x1e,0x28,0x13,0x16,0x1c,0x0f,0x10,0x13,0x4c,0x40,0x4f,0x6c,0x76, 0x95,0x4a,0x55,0x75,0x4c,0x49,0x6b,0x5d,0x52,0x77,0x5c,0x53,0x78,0x5f,0x53,0x76, 0x5f,0x53,0x77,0x5f,0x54,0x77,0x5f,0x53,0x77,0x60,0x53,0x76,0x5f,0x54,0x77,0x5f, 0x54,0x76,0x5f,0x55,0x77,0x5f,0x55,0x77,0x5c,0x54,0x71,0x4e,0x46,0x5c,0x25,0x24, 0x2c,0x24,0x23,0x2c,0x23,0x23,0x2b,0x22,0x23,0x2a,0x1d,0x1e,0x23,0x18,0x18,0x1e, 0x12,0x13,0x17,0x10,0x11,0x14,0x0e,0x0e,0x11,0x92,0x7e,0xb0,0x70,0x62,0x8b,0x4a, 0x43,0x5f,0x59,0x51,0x76,0x5b,0x51,0x77,0x5a,0x52,0x77,0x56,0x4f,0x78,0x57,0x50, 0x78,0x53,0x4f,0x79,0x52,0x50,0x79,0x51,0x4f,0x7a,0x52,0x50,0x7b,0x4f,0x50,0x78, 0x42,0x44,0x65,0x5a,0x64,0x90,0x21,0x21,0x2f,0x0d,0x0e,0x11,0x1e,0x1b,0x21,0x2c, 0x25,0x2d,0x28,0x23,0x2b,0x2a,0x26,0x2e,0x26,0x22,0x2a,0x57,0x62,0x84,0x50,0x59, 0x7a,0x37,0x3b,0x53,0x37,0x3c,0x53,0x3f,0x44,0x5f,0x54,0x5f,0x82,0x3e,0x40,0x59, 0x1f,0x22,0x2b,0x3f,0x3b,0x4a,0x55,0x4d,0x61,0x5d,0x58,0x6c,0x5b,0x64,0x84,0x57, 0x54,0x74,0x23,0x26,0x30,0x20,0x22,0x2b,0x24,0x25,0x2f,0x2d,0x2d,0x37,0x47,0x41, 0x50,0x4f,0x47,0x58,0x54,0x4a,0x5e,0x51,0x53,0x70,0x4f,0x53,0x75,0x42,0x43,0x5e, 0x1b,0x1e,0x27,0x1e,0x1e,0x28,0x22,0x20,0x2b,0x21,0x1f,0x2a,0x1a,0x19,0x23,0x16, 0x16,0x1f,0x16,0x18,0x1f,0x1f,0x1f,0x28,0x61,0x54,0x6b,0x63,0x55,0x6c,0x5b,0x4f, 0x64,0x51,0x5a,0x7e,0x55,0x50,0x73,0x58,0x4d,0x6e,0x53,0x46,0x64,0x4b,0x3f,0x58, 0x48,0x44,0x5e,0x2e,0x28,0x32,0x14,0x15,0x19,0x31,0x2d,0x34,0x3a,0x36,0x3f,0x61, 0x61,0x81,0x64,0x5f,0x7f,0x61,0x59,0x77,0x5f,0x57,0x77,0x65,0x5d,0x7c,0x6a,0x63, 0x81,0x70,0x69,0x85,0x77,0x71,0x8d,0x72,0x6a,0x88,0x72,0x6b,0x88,0x67,0x5e,0x7d, 0x62,0x58,0x78,0x62,0x57,0x79,0x5f,0x4e,0x69,0x4c,0x3f,0x55,0x53,0x46,0x5e,0x60, 0x5f,0x83,0x42,0x47,0x56,0x4b,0x51,0x5f,0x52,0x57,0x66,0x51,0x56,0x64,0x4a,0x4f, 0x5d,0x44,0x49,0x56,0x3e,0x42,0x50,0x39,0x3d,0x4a,0x36,0x3a,0x47,0x33,0x38,0x44, 0x32,0x36,0x42,0x31,0x35,0x41,0x30,0x34,0x40,0x2f,0x33,0x3e,0x2c,0x2f,0x3b,0x2a, 0x2e,0x39,0x2a,0x2d,0x38,0x2b,0x2f,0x3a,0x2e,0x31,0x3c,0x2d,0x30,0x3b,0x2a,0x2e, 0x38,0x2a,0x2e,0x37,0x29,0x2c,0x35,0x23,0x26,0x30,0x1e,0x22,0x2a,0x1d,0x1f,0x28, 0x1c,0x1e,0x26,0x18,0x1a,0x22,0x18,0x1a,0x22,0x17,0x1a,0x21,0x15,0x17,0x1e,0x14, 0x16,0x1d,0x12,0x14,0x1a,0x12,0x13,0x19,0x10,0x12,0x17,0x0e,0x0f,0x14,0x0d,0x0e, 0x12,0x0c,0x0d,0x11,0x0a,0x0b,0x0e,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x07,0x08,0x0a, 0x06,0x07,0x0a,0x06,0x07,0x0a,0x05,0x06,0x07,0x05,0x05,0x06,0x04,0x05,0x06,0x05, 0x05,0x07,0x7b,0x85,0xa3,0x52,0x5c,0x86,0x5a,0x51,0x77,0x5e,0x52,0x75,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76, 0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f, 0x53,0x77,0x6f,0x60,0x8b,0x08,0x07,0x0a,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, 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,0x32,0x38,0x4b, 0x52,0x50,0x7b,0x55,0x50,0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x50,0x7b,0x52,0x53,0x7d,0x52,0x55,0x80,0x52,0x5d,0x85,0x54,0x5f, 0x89,0x57,0x64,0x8c,0x5a,0x66,0x8d,0x5d,0x53,0x7a,0x57,0x56,0x81,0xb9,0xbf,0xd1, 0xdb,0xdf,0xe7,0xd3,0xd8,0xe2,0xd6,0xda,0xe3,0xd3,0xd7,0xe1,0xcc,0xd2,0xde,0xc6, 0xcb,0xd9,0xbc,0xc3,0xd3,0xb3,0xba,0xce,0xaa,0xb1,0xc7,0xa1,0xa9,0xc1,0x9d,0xa7, 0xbe,0x99,0xa2,0xbb,0x95,0x9f,0xb9,0x93,0x9c,0xb7,0x92,0x9b,0xb7,0x90,0x9a,0xb5, 0x90,0x9a,0xb5,0x90,0x99,0xb4,0x8c,0x96,0xb2,0x89,0x93,0xb0,0x83,0x8d,0xac,0x81, 0x8b,0xaa,0x7a,0x84,0xa5,0x75,0x81,0xa3,0x73,0x7e,0xa1,0x6f,0x7b,0x9f,0x6e,0x7a, 0x9d,0x64,0x71,0x96,0x52,0x52,0x7c,0x64,0x50,0x6f,0x64,0x4e,0x6c,0x64,0x53,0x75, 0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x53,0x74,0x64, 0x53,0x75,0x5d,0x52,0x78,0x5b,0x51,0x78,0x5b,0x51,0x78,0x5c,0x51,0x78,0x5d,0x52, 0x78,0x5d,0x52,0x78,0x5d,0x52,0x78,0x5d,0x52,0x78,0x5f,0x52,0x76,0x5f,0x52,0x76, 0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f, 0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5e,0x53,0x79,0x60,0x53,0x77,0x62,0x53, 0x77,0x55,0x50,0x79,0x62,0x4b,0x66,0x64,0x50,0x71,0x5d,0x64,0x82,0x35,0x27,0x30, 0x54,0x42,0x51,0x0a,0x08,0x0b,0x4d,0x56,0x70,0x60,0x53,0x77,0x5f,0x47,0x63,0x60, 0x53,0x77,0x5e,0x53,0x79,0x60,0x53,0x77,0x5f,0x53,0x79,0x5c,0x52,0x79,0x5c,0x52, 0x79,0x58,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b, 0x52,0x54,0x7e,0x52,0x55,0x81,0x52,0x5d,0x88,0x56,0x62,0x8b,0x57,0x63,0x8c,0x60, 0x48,0x64,0x52,0x5c,0x85,0xd3,0xd7,0xe1,0xac,0xae,0xbf,0x78,0x68,0x84,0x68,0x6d, 0x92,0x68,0x6b,0x91,0x6a,0x74,0x98,0x73,0x7e,0xa0,0x0e,0x0f,0x12,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,0x43,0x43,0x44,0x81,0x8c,0xab, 0x52,0x50,0x7c,0x64,0x4e,0x6d,0x52,0x54,0x80,0x52,0x54,0x7e,0x52,0x56,0x81,0x52, 0x58,0x83,0x52,0x5d,0x86,0x53,0x5e,0x88,0x53,0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f, 0x89,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5f,0x89,0x52,0x52,0x7c,0x5d,0x52,0x79, 0x71,0x7c,0x9f,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02, 0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x09, 0x07,0x07,0x09,0x07,0x08,0x0a,0x08,0x09,0x0a,0x0a,0x0a,0x0b,0x0d,0x0e,0x10,0x14, 0x13,0x18,0x1e,0x1a,0x22,0x26,0x21,0x2b,0x27,0x22,0x2c,0x27,0x22,0x2c,0x2b,0x25, 0x30,0x2a,0x24,0x2f,0x20,0x1c,0x25,0x25,0x20,0x2a,0x34,0x2e,0x3a,0x43,0x3a,0x4a, 0x4b,0x41,0x51,0x60,0x5f,0x76,0x50,0x4d,0x66,0x44,0x43,0x59,0x3b,0x3d,0x51,0x3b, 0x3c,0x50,0x3e,0x3d,0x52,0x45,0x43,0x58,0x5a,0x57,0x72,0x60,0x61,0x7e,0x5e,0x67, 0x85,0x6e,0x76,0x8e,0x7c,0x81,0x99,0x79,0x6f,0x83,0x61,0x61,0x80,0x35,0x39,0x4b, 0x2a,0x27,0x33,0x2b,0x27,0x34,0x24,0x22,0x2d,0x16,0x16,0x1e,0x10,0x12,0x15,0x47, 0x3c,0x49,0x6e,0x77,0x93,0x4b,0x56,0x78,0x4b,0x48,0x6a,0x5c,0x53,0x77,0x5d,0x53, 0x78,0x5f,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x60,0x53,0x76, 0x5f,0x54,0x77,0x5f,0x54,0x76,0x5f,0x55,0x76,0x5f,0x55,0x75,0x5a,0x52,0x6f,0x4e, 0x47,0x5c,0x24,0x23,0x2c,0x23,0x23,0x2e,0x25,0x23,0x2f,0x25,0x23,0x2e,0x1f,0x20, 0x2a,0x1d,0x1e,0x25,0x18,0x19,0x1e,0x11,0x13,0x16,0x0e,0x0f,0x12,0x89,0x77,0xa6, 0x73,0x65,0x90,0x4c,0x42,0x5d,0x59,0x4f,0x73,0x5b,0x51,0x77,0x5a,0x52,0x78,0x56, 0x50,0x78,0x57,0x50,0x78,0x53,0x4f,0x79,0x53,0x4f,0x79,0x51,0x4f,0x79,0x51,0x50, 0x79,0x4f,0x50,0x78,0x40,0x42,0x60,0x5a,0x5f,0x8d,0x26,0x25,0x36,0x0b,0x0d,0x0f, 0x0f,0x0f,0x13,0x34,0x2c,0x35,0x28,0x23,0x2a,0x2a,0x25,0x2d,0x29,0x25,0x2c,0x32, 0x34,0x44,0x66,0x73,0x9d,0x39,0x3e,0x57,0x37,0x3b,0x52,0x37,0x3b,0x53,0x4d,0x56, 0x76,0x56,0x5a,0x7f,0x1f,0x22,0x2b,0x23,0x25,0x2e,0x55,0x4c,0x60,0x56,0x4e,0x61, 0x74,0x7e,0x96,0x54,0x52,0x73,0x27,0x2a,0x36,0x1f,0x22,0x2a,0x1f,0x22,0x2c,0x20, 0x23,0x2c,0x1e,0x22,0x2a,0x3e,0x3a,0x48,0x54,0x4c,0x5e,0x58,0x4f,0x63,0x55,0x50, 0x6a,0x50,0x50,0x72,0x4b,0x47,0x67,0x2b,0x27,0x33,0x2e,0x29,0x36,0x2e,0x28,0x35, 0x2a,0x25,0x31,0x1c,0x19,0x22,0x19,0x19,0x22,0x1a,0x1a,0x22,0x2c,0x28,0x34,0x55, 0x48,0x5c,0x4e,0x43,0x55,0x50,0x4c,0x5f,0x4f,0x58,0x7e,0x58,0x50,0x73,0x5a,0x4e, 0x6c,0x55,0x49,0x66,0x4e,0x44,0x5b,0x54,0x4f,0x60,0x33,0x33,0x39,0x45,0x42,0x4a, 0x3b,0x38,0x40,0x62,0x5d,0x7c,0x63,0x5d,0x7a,0x62,0x5b,0x79,0x60,0x57,0x76,0x66, 0x5e,0x7c,0x6b,0x64,0x81,0x72,0x6d,0x89,0x7d,0x78,0x92,0x7d,0x79,0x93,0x86,0x82, 0x9c,0x76,0x70,0x8b,0x6e,0x67,0x84,0x71,0x6a,0x87,0x6a,0x5e,0x76,0x51,0x43,0x58, 0x53,0x44,0x5e,0x56,0x51,0x75,0x30,0x2f,0x40,0x37,0x3d,0x4e,0x46,0x4a,0x59,0x4c, 0x50,0x5e,0x4e,0x52,0x61,0x4d,0x52,0x5e,0x4a,0x4e,0x5c,0x46,0x4a,0x58,0x42,0x46, 0x54,0x3d,0x42,0x4e,0x38,0x3d,0x49,0x36,0x3a,0x46,0x33,0x37,0x43,0x32,0x36,0x42, 0x2d,0x31,0x3c,0x2c,0x30,0x3a,0x2c,0x2f,0x3a,0x2b,0x2f,0x3a,0x2e,0x32,0x3d,0x2e, 0x32,0x3c,0x2c,0x2f,0x3a,0x2a,0x2e,0x38,0x29,0x2c,0x36,0x26,0x29,0x32,0x22,0x25, 0x2e,0x1f,0x22,0x2b,0x1e,0x20,0x29,0x1c,0x1e,0x26,0x19,0x1b,0x23,0x19,0x1b,0x22, 0x16,0x19,0x20,0x16,0x17,0x1e,0x14,0x16,0x1d,0x13,0x15,0x1b,0x12,0x13,0x19,0x0f, 0x10,0x16,0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x09,0x0a, 0x0d,0x08,0x09,0x0c,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x06,0x09,0x05,0x05,0x06, 0x05,0x05,0x06,0x05,0x05,0x06,0x6c,0x74,0x8d,0x57,0x62,0x8b,0x56,0x4f,0x77,0x5e, 0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x53, 0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77, 0x5f,0x53,0x77,0x5f,0x53,0x77,0x68,0x59,0x7f,0x1d,0x1a,0x24,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,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,0x42,0x49,0x62,0x52,0x4f,0x7a,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x57,0x83,0x52, 0x5d,0x88,0x55,0x60,0x8a,0x57,0x63,0x8b,0x57,0x64,0x8c,0x58,0x52,0x7a,0x56,0x57, 0x83,0xd0,0xd3,0xe0,0xd9,0xde,0xe7,0xd3,0xd8,0xe2,0xd2,0xd6,0xe1,0xd0,0xd5,0xe0, 0xca,0xcf,0xdd,0xc2,0xc8,0xd7,0xb9,0xc0,0xd1,0xaf,0xb5,0xc9,0xa7,0xaf,0xc4,0xa0, 0xa8,0xc0,0x99,0xa2,0xbb,0x96,0xa0,0xb9,0x94,0x9d,0xb8,0x92,0x9b,0xb7,0x91,0x9b, 0xb5,0x91,0x9b,0xb5,0x91,0x9a,0xb5,0x90,0x99,0xb4,0x8b,0x95,0xb2,0x89,0x93,0xb0, 0x83,0x8d,0xac,0x7e,0x8a,0xa9,0x77,0x83,0xa4,0x74,0x80,0xa2,0x72,0x7e,0xa1,0x74, 0x80,0xa1,0x72,0x7d,0xa0,0x63,0x6f,0x95,0x57,0x50,0x79,0x64,0x50,0x6f,0x64,0x52, 0x72,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x75, 0x64,0x53,0x75,0x64,0x52,0x71,0x60,0x53,0x77,0x5c,0x52,0x79,0x5b,0x51,0x78,0x5d, 0x52,0x78,0x5d,0x52,0x78,0x5d,0x52,0x78,0x5d,0x52,0x78,0x5d,0x52,0x78,0x5d,0x52, 0x78,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76, 0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x60,0x53,0x77,0x5e,0x53,0x79,0x60, 0x53,0x77,0x5a,0x52,0x79,0x5e,0x53,0x79,0x5c,0x44,0x5e,0x52,0x54,0x7f,0x47,0x45, 0x54,0x3c,0x2d,0x37,0x50,0x3f,0x50,0x00,0x00,0x00,0x44,0x49,0x57,0x52,0x5d,0x86, 0x5c,0x44,0x5f,0x62,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e, 0x53,0x79,0x5c,0x52,0x79,0x58,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x55,0x81,0x52,0x5d,0x86,0x55,0x60,0x8a, 0x55,0x60,0x8a,0x64,0x4e,0x6c,0x52,0x4f,0x7a,0xc9,0xce,0xdb,0xb8,0xbe,0xcf,0x78, 0x66,0x81,0x68,0x69,0x8e,0x68,0x72,0x96,0x6d,0x77,0x9a,0x74,0x7f,0xa1,0x1a,0x1c, 0x22,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,0x03,0x03, 0x03,0x99,0xa0,0xb1,0x5a,0x66,0x8e,0x63,0x4c,0x69,0x52,0x4f,0x7a,0x52,0x53,0x7e, 0x52,0x57,0x83,0x52,0x56,0x81,0x52,0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53, 0x5e,0x88,0x53,0x5f,0x89,0x54,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5e,0x89,0x52,0x5d, 0x88,0x63,0x53,0x77,0x52,0x5d,0x85,0x81,0x84,0x8e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x04,0x05,0x04, 0x04,0x05,0x04,0x05,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06, 0x07,0x06,0x06,0x08,0x07,0x07,0x09,0x08,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b, 0x09,0x0a,0x0b,0x0b,0x0c,0x0e,0x12,0x11,0x17,0x26,0x23,0x2b,0x34,0x2f,0x38,0x42, 0x3d,0x46,0x30,0x2a,0x34,0x31,0x2a,0x35,0x38,0x33,0x3d,0x31,0x2f,0x37,0x23,0x20, 0x2a,0x39,0x30,0x3d,0x42,0x3a,0x47,0x56,0x5b,0x74,0x40,0x46,0x62,0x3e,0x44,0x60, 0x41,0x44,0x5f,0x39,0x3b,0x51,0x36,0x39,0x4b,0x39,0x39,0x4c,0x3d,0x3d,0x52,0x41, 0x40,0x56,0x4f,0x4d,0x66,0x50,0x55,0x73,0x5c,0x63,0x7f,0x72,0x69,0x7d,0x5a,0x5b, 0x7a,0x2e,0x30,0x42,0x2a,0x29,0x36,0x2a,0x29,0x37,0x24,0x23,0x31,0x1a,0x1d,0x25, 0x16,0x18,0x1c,0x44,0x3a,0x47,0x6c,0x74,0x8e,0x4d,0x58,0x78,0x49,0x47,0x68,0x5c, 0x53,0x77,0x5d,0x53,0x78,0x5f,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53, 0x77,0x60,0x53,0x76,0x5f,0x54,0x77,0x5f,0x54,0x76,0x60,0x55,0x76,0x5f,0x55,0x77, 0x5b,0x53,0x70,0x51,0x49,0x5f,0x23,0x24,0x2d,0x2a,0x28,0x36,0x37,0x30,0x3e,0x36, 0x2f,0x3d,0x2b,0x27,0x33,0x1e,0x1f,0x29,0x1d,0x1d,0x23,0x17,0x17,0x1c,0x11,0x12, 0x15,0x82,0x70,0x9c,0x76,0x69,0x94,0x4a,0x43,0x5d,0x57,0x4d,0x71,0x5a,0x52,0x76, 0x5a,0x52,0x78,0x5a,0x52,0x78,0x57,0x50,0x78,0x55,0x50,0x78,0x52,0x4f,0x79,0x52, 0x50,0x79,0x51,0x4f,0x78,0x50,0x4f,0x78,0x40,0x41,0x5e,0x58,0x5c,0x8b,0x29,0x2a, 0x3d,0x0a,0x0b,0x0e,0x0c,0x0d,0x10,0x2a,0x25,0x2e,0x2b,0x24,0x2c,0x29,0x23,0x2b, 0x29,0x24,0x2d,0x27,0x23,0x2b,0x5b,0x66,0x8b,0x49,0x51,0x6f,0x37,0x3c,0x54,0x35, 0x39,0x52,0x37,0x3c,0x54,0x52,0x5d,0x81,0x27,0x29,0x35,0x1f,0x22,0x2a,0x4f,0x47, 0x5a,0x56,0x4d,0x61,0x76,0x7e,0x97,0x51,0x59,0x7b,0x31,0x32,0x43,0x20,0x23,0x2e, 0x21,0x22,0x2d,0x22,0x23,0x30,0x1e,0x22,0x2c,0x1e,0x21,0x2a,0x22,0x24,0x2e,0x4d, 0x46,0x58,0x59,0x4f,0x64,0x59,0x4f,0x64,0x52,0x4e,0x6b,0x51,0x4b,0x6b,0x2a,0x29, 0x38,0x27,0x24,0x30,0x2b,0x26,0x32,0x28,0x24,0x2f,0x22,0x1e,0x28,0x25,0x21,0x2d, 0x20,0x1e,0x29,0x34,0x2e,0x3c,0x43,0x39,0x49,0x3c,0x34,0x40,0x59,0x5e,0x76,0x54, 0x56,0x7c,0x64,0x5b,0x7a,0x66,0x5c,0x78,0x66,0x5d,0x74,0x6c,0x63,0x79,0x76,0x72, 0x80,0x6e,0x6a,0x73,0x4c,0x4a,0x54,0x67,0x64,0x81,0x66,0x61,0x7e,0x63,0x5e,0x7b, 0x5f,0x58,0x75,0x62,0x5a,0x78,0x67,0x60,0x7d,0x6b,0x65,0x81,0x6c,0x66,0x83,0x6a, 0x67,0x85,0x74,0x73,0x8f,0x7b,0x78,0x91,0x81,0x7c,0x94,0x83,0x7f,0x96,0x7a,0x71, 0x87,0x55,0x49,0x5f,0x56,0x46,0x60,0x52,0x52,0x70,0x38,0x30,0x3c,0x36,0x32,0x41, 0x30,0x35,0x45,0x3e,0x43,0x50,0x47,0x4c,0x59,0x4a,0x4e,0x5c,0x4a,0x4f,0x5d,0x4a, 0x4e,0x5d,0x4a,0x4f,0x5d,0x4a,0x4f,0x5d,0x45,0x4a,0x57,0x3e,0x42,0x4f,0x37,0x3b, 0x47,0x33,0x37,0x43,0x31,0x35,0x40,0x2e,0x32,0x3d,0x2a,0x2e,0x39,0x2d,0x30,0x3b, 0x2d,0x30,0x3a,0x2d,0x30,0x3b,0x2c,0x30,0x3a,0x2a,0x2e,0x38,0x28,0x2b,0x36,0x26, 0x2a,0x33,0x26,0x29,0x32,0x25,0x27,0x31,0x23,0x26,0x2e,0x1e,0x22,0x2a,0x1c,0x1f, 0x27,0x19,0x1c,0x24,0x18,0x1a,0x22,0x16,0x19,0x21,0x16,0x18,0x20,0x14,0x16,0x1c, 0x12,0x14,0x1a,0x11,0x12,0x18,0x0e,0x10,0x15,0x0d,0x0e,0x12,0x0b,0x0d,0x10,0x0a, 0x0b,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x06,0x07,0x0a,0x06,0x06, 0x09,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x54,0x5a,0x6a,0x60,0x6c,0x90, 0x52,0x4f,0x78,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e, 0x52,0x75,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53, 0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x62,0x55,0x7c,0x40,0x37,0x4f, 0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x4b,0x55,0x76,0x52,0x4f,0x7a,0x55,0x50,0x79,0x54,0x50, 0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x54,0x7e, 0x52,0x56,0x81,0x52,0x5d,0x86,0x55,0x60,0x8a,0x58,0x64,0x8d,0x58,0x65,0x8d,0x53, 0x50,0x7a,0x54,0x5c,0x86,0xdb,0xdf,0xe8,0xd5,0xd9,0xe2,0xd1,0xd5,0xe0,0xcc,0xd1, 0xde,0xca,0xcf,0xdd,0xc3,0xc9,0xd7,0xbc,0xc2,0xd3,0xb3,0xba,0xcc,0xab,0xb2,0xc7, 0xa4,0xac,0xc2,0x9c,0xa5,0xbe,0x99,0xa1,0xbb,0x96,0xa0,0xb9,0x94,0x9d,0xb8,0x93, 0x9c,0xb7,0x92,0x9b,0xb7,0x90,0x99,0xb4,0x90,0x99,0xb4,0x8e,0x98,0xb3,0x8a,0x94, 0xb1,0x88,0x92,0xb0,0x83,0x8e,0xac,0x7d,0x88,0xa8,0x7a,0x84,0xa5,0x73,0x7e,0xa1, 0x72,0x7d,0xa0,0x79,0x84,0xa4,0x72,0x7d,0xa0,0x5e,0x6b,0x92,0x63,0x53,0x77,0x64, 0x52,0x72,0x64,0x53,0x73,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53, 0x76,0x64,0x53,0x76,0x64,0x53,0x74,0x63,0x4b,0x69,0x63,0x53,0x77,0x5e,0x53,0x79, 0x5c,0x52,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e, 0x53,0x79,0x60,0x53,0x77,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x5e,0x53,0x79,0x52,0x4f,0x7a,0x60,0x48,0x64,0x64,0x4f,0x6e,0x62, 0x6c,0x8e,0x32,0x26,0x2d,0x54,0x42,0x51,0x1a,0x16,0x1c,0x00,0x00,0x00,0x2c,0x2e, 0x33,0x5f,0x6b,0x92,0x62,0x4a,0x65,0x62,0x53,0x77,0x5f,0x53,0x77,0x5e,0x53,0x79, 0x5e,0x53,0x79,0x5b,0x52,0x79,0x5a,0x52,0x79,0x56,0x50,0x79,0x56,0x50,0x79,0x53, 0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x52,0x7c,0x52,0x55,0x81,0x52,0x5c, 0x85,0x54,0x5f,0x89,0x56,0x62,0x8b,0x64,0x53,0x74,0x64,0x53,0x75,0xb7,0xbe,0xcf, 0xcc,0xd1,0xde,0x7f,0x6e,0x87,0x68,0x6d,0x93,0x68,0x72,0x97,0x6b,0x76,0x9a,0x75, 0x7f,0xa1,0x23,0x26,0x2e,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,0x6c,0x6d,0x70,0x6e,0x7a,0x9d,0x5d,0x52,0x79,0x64,0x53, 0x76,0x52,0x54,0x7e,0x52,0x54,0x80,0x52,0x56,0x81,0x52,0x5a,0x84,0x52,0x5d,0x88, 0x52,0x5d,0x88,0x53,0x5e,0x89,0x53,0x5e,0x89,0x53,0x5f,0x89,0x53,0x5f,0x89,0x54, 0x5f,0x89,0x53,0x5f,0x89,0x52,0x4f,0x7a,0x60,0x53,0x77,0x74,0x7f,0xa0,0x23,0x23, 0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x52,0x52,0x52,0x32,0x32,0x32, 0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x06, 0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x08,0x09,0x08,0x09, 0x0a,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0b,0x0c,0x10,0x1a,0x19,0x1f, 0x2f,0x2c,0x34,0x4c,0x48,0x4f,0x3f,0x3a,0x43,0x42,0x3d,0x46,0x39,0x32,0x3d,0x43, 0x3d,0x46,0x56,0x52,0x5a,0x2d,0x27,0x31,0x3d,0x35,0x41,0x5a,0x62,0x7a,0x44,0x4c, 0x6a,0x41,0x49,0x67,0x3f,0x47,0x66,0x44,0x48,0x64,0x3f,0x41,0x5a,0x3b,0x3c,0x52, 0x3d,0x3e,0x53,0x3b,0x3b,0x4e,0x3e,0x3d,0x50,0x54,0x50,0x68,0x55,0x57,0x78,0x6a, 0x66,0x7f,0x61,0x65,0x82,0x37,0x3d,0x50,0x2f,0x2f,0x40,0x30,0x35,0x45,0x34,0x39, 0x46,0x30,0x32,0x39,0x2a,0x2a,0x2e,0x45,0x3c,0x49,0x69,0x70,0x87,0x4e,0x58,0x7b, 0x47,0x45,0x68,0x59,0x51,0x74,0x5d,0x52,0x77,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f, 0x52,0x76,0x5f,0x53,0x77,0x60,0x53,0x76,0x5f,0x54,0x77,0x5f,0x54,0x76,0x60,0x54, 0x76,0x60,0x55,0x77,0x5d,0x55,0x73,0x50,0x49,0x60,0x24,0x24,0x30,0x34,0x2f,0x3e, 0x3e,0x36,0x46,0x3d,0x35,0x44,0x35,0x2e,0x3b,0x22,0x20,0x2a,0x1d,0x1d,0x23,0x1b, 0x1a,0x20,0x18,0x17,0x1c,0x75,0x65,0x8c,0x79,0x6b,0x97,0x4c,0x42,0x5e,0x57,0x4d, 0x6e,0x59,0x52,0x76,0x5b,0x52,0x78,0x5b,0x52,0x77,0x57,0x50,0x78,0x57,0x50,0x78, 0x53,0x4f,0x79,0x52,0x50,0x79,0x51,0x4f,0x79,0x51,0x4e,0x78,0x3f,0x3f,0x5d,0x5b, 0x5c,0x89,0x2d,0x2d,0x42,0x0a,0x0a,0x0d,0x0b,0x0c,0x0f,0x12,0x12,0x16,0x38,0x30, 0x3a,0x2a,0x24,0x2c,0x2a,0x25,0x2d,0x28,0x24,0x2c,0x3b,0x3e,0x54,0x5d,0x6a,0x91, 0x3e,0x44,0x5f,0x37,0x3b,0x53,0x36,0x3a,0x51,0x3f,0x45,0x61,0x47,0x48,0x66,0x20, 0x22,0x2b,0x31,0x30,0x3c,0x56,0x4d,0x60,0x70,0x73,0x89,0x59,0x62,0x83,0x4f,0x4c, 0x6c,0x28,0x26,0x34,0x2a,0x28,0x36,0x28,0x26,0x33,0x25,0x24,0x31,0x22,0x22,0x2e, 0x20,0x20,0x2b,0x1e,0x20,0x2a,0x3e,0x3a,0x49,0x59,0x4f,0x64,0x58,0x4e,0x63,0x55, 0x4d,0x67,0x51,0x4c,0x6a,0x2f,0x2d,0x40,0x25,0x22,0x2e,0x2e,0x29,0x35,0x26,0x22, 0x2d,0x20,0x1d,0x26,0x28,0x25,0x2f,0x21,0x1f,0x2a,0x37,0x30,0x3d,0x37,0x31,0x3e, 0x3a,0x35,0x42,0x5d,0x68,0x8a,0x59,0x58,0x7c,0x78,0x6f,0x89,0x7d,0x74,0x8a,0x76, 0x6f,0x82,0x79,0x73,0x86,0x78,0x75,0x8d,0x71,0x6e,0x8a,0x70,0x6e,0x8a,0x6d,0x6a, 0x85,0x67,0x62,0x7d,0x62,0x5b,0x77,0x64,0x5d,0x79,0x65,0x5e,0x7b,0x66,0x61,0x7d, 0x62,0x5d,0x7b,0x58,0x51,0x71,0x5a,0x53,0x73,0x6d,0x6a,0x86,0x86,0x82,0x99,0x8a, 0x85,0x9b,0x85,0x7d,0x91,0x68,0x60,0x75,0x58,0x4b,0x66,0x52,0x51,0x6e,0x32,0x29, 0x33,0x36,0x2f,0x3c,0x2a,0x2a,0x38,0x2e,0x32,0x3f,0x38,0x3d,0x4a,0x40,0x44,0x51, 0x45,0x49,0x56,0x4b,0x50,0x5e,0x53,0x58,0x66,0x55,0x5a,0x67,0x52,0x56,0x64,0x4a, 0x4f,0x5d,0x3f,0x43,0x50,0x45,0x49,0x54,0x34,0x38,0x44,0x2b,0x2f,0x3a,0x2c,0x2f, 0x3a,0x2b,0x2e,0x3a,0x2b,0x2e,0x3a,0x2c,0x2f,0x39,0x28,0x2c,0x37,0x26,0x2a,0x35, 0x27,0x2a,0x34,0x26,0x2a,0x34,0x28,0x2b,0x35,0x29,0x2c,0x36,0x26,0x28,0x32,0x21, 0x23,0x2d,0x1d,0x1f,0x28,0x1a,0x1d,0x26,0x18,0x1a,0x23,0x17,0x1a,0x22,0x17,0x1a, 0x21,0x15,0x17,0x1e,0x12,0x14,0x1a,0x11,0x12,0x19,0x0f,0x11,0x16,0x0e,0x0e,0x13, 0x0c,0x0d,0x11,0x0b,0x0c,0x10,0x0a,0x0b,0x0e,0x09,0x0a,0x0d,0x08,0x09,0x0c,0x07, 0x07,0x0a,0x06,0x07,0x09,0x06,0x06,0x08,0x05,0x06,0x07,0x05,0x06,0x07,0x36,0x39, 0x43,0x6b,0x77,0x98,0x50,0x4f,0x79,0x5e,0x53,0x76,0x5e,0x52,0x75,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53, 0x78,0x59,0x4e,0x70,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x56,0x60,0x85,0x53,0x4f,0x7a,0x55, 0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50, 0x7b,0x52,0x54,0x7e,0x52,0x57,0x82,0x53,0x5d,0x88,0x55,0x60,0x8a,0x58,0x65,0x8d, 0x57,0x64,0x8c,0x53,0x52,0x7b,0x58,0x64,0x8d,0xdf,0xe2,0xe9,0xce,0xd2,0xde,0xce, 0xd1,0xde,0xc8,0xcc,0xdb,0xc3,0xc9,0xd8,0xbb,0xc1,0xd2,0xb5,0xbc,0xcf,0xaf,0xb5, 0xc9,0xa5,0xad,0xc3,0xa0,0xa8,0xbf,0x9b,0xa4,0xbc,0x98,0xa1,0xba,0x95,0x9f,0xb9, 0x93,0x9c,0xb8,0x91,0x9b,0xb5,0x91,0x9a,0xb5,0x8e,0x98,0xb3,0x8e,0x99,0xb4,0x8e, 0x98,0xb3,0x8b,0x94,0xb1,0x84,0x90,0xad,0x82,0x8c,0xab,0x7e,0x89,0xa9,0x77,0x83, 0xa4,0x75,0x81,0xa2,0x74,0x80,0xa2,0x7e,0x8a,0xa9,0x6e,0x7a,0x9d,0x56,0x62,0x8b, 0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x75,0x64, 0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x4f,0x6e,0x64,0x52, 0x72,0x60,0x53,0x77,0x5d,0x52,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79, 0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x5e,0x53,0x79,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x55,0x50,0x79,0x5d,0x52,0x79,0x5b,0x43,0x5d, 0x52,0x5d,0x86,0x6e,0x6c,0x79,0x3c,0x2e,0x38,0x69,0x55,0x6a,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0x07,0x08,0x6e,0x79,0x9a,0x64,0x50,0x6f,0x64,0x53,0x76,0x5e,0x53, 0x79,0x5c,0x52,0x79,0x5d,0x52,0x79,0x58,0x50,0x79,0x57,0x50,0x79,0x55,0x50,0x79, 0x55,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52, 0x55,0x80,0x52,0x5b,0x85,0x53,0x5f,0x89,0x55,0x60,0x8a,0x64,0x53,0x74,0x60,0x48, 0x65,0xa9,0xb0,0xc6,0xd7,0xda,0xe5,0x87,0x77,0x8e,0x68,0x6a,0x8f,0x68,0x72,0x97, 0x6c,0x76,0x9a,0x76,0x81,0xa2,0x2c,0x30,0x3b,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,0x18,0x18,0x18,0x90,0x98,0xb3,0x52, 0x5a,0x84,0x64,0x50,0x71,0x52,0x50,0x7b,0x52,0x53,0x7d,0x52,0x55,0x81,0x52,0x57, 0x82,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x54,0x5f,0x89, 0x54,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5f,0x89,0x52,0x5c,0x86,0x64,0x53,0x74,0x52, 0x58,0x83,0x74,0x78,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x26,0x26,0x54,0x54, 0x54,0x1d,0x1d,0x1d,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02, 0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06, 0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x09,0x07,0x08,0x09,0x07, 0x07,0x09,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0a, 0x0d,0x0c,0x0c,0x0f,0x16,0x17,0x1b,0x2e,0x2c,0x32,0x1b,0x18,0x1f,0x2c,0x28,0x30, 0x4b,0x45,0x4e,0x4c,0x46,0x50,0x56,0x52,0x59,0x4a,0x43,0x4c,0x4a,0x43,0x4d,0x66, 0x6f,0x88,0x49,0x53,0x72,0x48,0x4f,0x71,0x47,0x50,0x71,0x45,0x4e,0x6f,0x42,0x49, 0x69,0x47,0x4a,0x67,0x47,0x48,0x64,0x42,0x42,0x5a,0x40,0x3f,0x53,0x50,0x4b,0x63, 0x5f,0x58,0x75,0x58,0x50,0x6d,0x54,0x59,0x7b,0x37,0x3d,0x50,0x33,0x32,0x46,0x34, 0x34,0x46,0x3e,0x42,0x4e,0x3e,0x40,0x46,0x3b,0x3d,0x41,0x47,0x3f,0x4a,0x6a,0x6f, 0x86,0x4e,0x58,0x7b,0x47,0x46,0x69,0x59,0x50,0x6f,0x5f,0x52,0x75,0x5e,0x53,0x76, 0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x53,0x77,0x60,0x53,0x76,0x5f,0x54,0x77,0x5f, 0x54,0x76,0x5f,0x55,0x76,0x60,0x56,0x77,0x5f,0x56,0x76,0x53,0x4c,0x65,0x25,0x25, 0x30,0x32,0x30,0x3f,0x3a,0x36,0x47,0x3b,0x36,0x46,0x33,0x2e,0x3b,0x21,0x20,0x2a, 0x1e,0x1e,0x25,0x1b,0x1b,0x21,0x1a,0x1a,0x1f,0x68,0x5a,0x7c,0x7a,0x6b,0x97,0x4c, 0x43,0x5f,0x55,0x4c,0x6a,0x5b,0x52,0x77,0x5a,0x52,0x78,0x5b,0x52,0x77,0x57,0x50, 0x78,0x57,0x50,0x78,0x55,0x50,0x78,0x52,0x4f,0x79,0x51,0x4e,0x79,0x50,0x4e,0x78, 0x3d,0x3c,0x5c,0x59,0x5a,0x88,0x32,0x32,0x4a,0x0a,0x0a,0x0d,0x0b,0x0c,0x0f,0x0d, 0x0e,0x11,0x41,0x38,0x45,0x33,0x2b,0x36,0x2a,0x24,0x2c,0x2a,0x25,0x2d,0x29,0x25, 0x2e,0x63,0x6e,0x9a,0x50,0x5b,0x7d,0x39,0x3e,0x59,0x34,0x39,0x51,0x35,0x3a,0x51, 0x4d,0x54,0x75,0x20,0x23,0x2b,0x22,0x24,0x2e,0x56,0x4d,0x61,0x56,0x4d,0x60,0x65, 0x6e,0x8c,0x4e,0x4e,0x72,0x35,0x32,0x44,0x2f,0x2a,0x39,0x2f,0x2b,0x38,0x31,0x2c, 0x3a,0x33,0x2e,0x3b,0x31,0x2c,0x3a,0x28,0x26,0x32,0x1e,0x1f,0x2a,0x32,0x30,0x3e, 0x57,0x4d,0x61,0x58,0x4d,0x62,0x57,0x4d,0x64,0x52,0x4d,0x69,0x39,0x34,0x48,0x2f, 0x29,0x36,0x2b,0x26,0x32,0x1a,0x19,0x21,0x1d,0x1c,0x24,0x1c,0x1b,0x26,0x1b,0x1b, 0x25,0x37,0x32,0x3e,0x33,0x2d,0x38,0x48,0x45,0x53,0x59,0x65,0x86,0x6d,0x67,0x85, 0x72,0x6a,0x86,0x62,0x5c,0x77,0x5e,0x5b,0x74,0x6d,0x6a,0x84,0x71,0x6f,0x89,0x72, 0x6f,0x89,0x75,0x72,0x8b,0x7a,0x76,0x8f,0x78,0x73,0x8a,0x71,0x6c,0x86,0x6a,0x68, 0x85,0x6b,0x6a,0x87,0x6b,0x6a,0x86,0x5b,0x59,0x79,0x59,0x51,0x71,0x58,0x55,0x75, 0x7f,0x7c,0x92,0x9f,0x9a,0xab,0xac,0xa6,0xb2,0x9b,0x94,0xa0,0x76,0x72,0x88,0x52, 0x54,0x75,0x2f,0x29,0x34,0x2b,0x28,0x36,0x25,0x27,0x34,0x2a,0x2e,0x3a,0x2d,0x31, 0x3d,0x31,0x35,0x41,0x38,0x3c,0x49,0x44,0x49,0x56,0x54,0x58,0x66,0x5a,0x5f,0x6d, 0x5a,0x60,0x6e,0x57,0x5c,0x6a,0x4c,0x51,0x5e,0x50,0x54,0x60,0x58,0x5b,0x66,0x32, 0x37,0x44,0x2c,0x2f,0x3c,0x2a,0x2e,0x39,0x2a,0x2d,0x39,0x29,0x2c,0x37,0x27,0x2b, 0x36,0x27,0x2a,0x35,0x26,0x29,0x34,0x26,0x29,0x33,0x29,0x2c,0x36,0x29,0x2c,0x36, 0x26,0x29,0x33,0x20,0x23,0x2d,0x1d,0x20,0x29,0x1a,0x1d,0x26,0x1a,0x1c,0x24,0x18, 0x1a,0x22,0x17,0x1a,0x21,0x16,0x18,0x1f,0x14,0x16,0x1d,0x12,0x13,0x1a,0x10,0x12, 0x17,0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0b,0x0c,0x10,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e, 0x09,0x0a,0x0c,0x07,0x08,0x0a,0x07,0x07,0x0a,0x06,0x06,0x08,0x05,0x06,0x07,0x06, 0x06,0x07,0x19,0x1b,0x21,0x71,0x7d,0x9e,0x50,0x53,0x7e,0x5c,0x52,0x77,0x5e,0x51, 0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75, 0x5e,0x52,0x76,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x5e,0x53,0x76,0x67,0x5a,0x80,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x0a,0x0b,0x0f,0x55,0x60,0x89, 0x54,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7b,0x52,0x52,0x7c,0x52,0x54,0x7e,0x52,0x58,0x83,0x53,0x5e,0x88,0x56,0x62, 0x8b,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x52,0x56,0x81,0x6a,0x74,0x99,0xd2,0xd7,0xe1, 0xc8,0xcc,0xda,0xc6,0xca,0xd8,0xc3,0xc9,0xd7,0xc0,0xc4,0xd5,0xb8,0xbe,0xd0,0xb0, 0xb7,0xca,0xaa,0xb2,0xc8,0xa3,0xaa,0xc1,0x9f,0xa8,0xbf,0x99,0xa2,0xbb,0x96,0xa0, 0xba,0x94,0x9d,0xb8,0x93,0x9c,0xb7,0x93,0x9c,0xb7,0x90,0x9a,0xb5,0x8e,0x99,0xb4, 0x8d,0x96,0xb3,0x8b,0x94,0xb2,0x8a,0x93,0xb1,0x86,0x91,0xaf,0x81,0x8c,0xab,0x7c, 0x88,0xa8,0x77,0x82,0xa4,0x72,0x7e,0xa1,0x76,0x82,0xa3,0x83,0x8d,0xac,0x6e,0x7a, 0x9d,0x52,0x55,0x81,0x64,0x53,0x76,0x64,0x53,0x74,0x64,0x53,0x75,0x64,0x53,0x76, 0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x74,0x64,0x53,0x74,0x64, 0x53,0x74,0x64,0x4e,0x6d,0x64,0x53,0x76,0x56,0x50,0x79,0x5d,0x52,0x79,0x5e,0x53, 0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x52,0x4f,0x7a,0x60,0x48, 0x65,0x64,0x4f,0x6e,0x6c,0x77,0x99,0x3d,0x31,0x39,0x51,0x3f,0x4e,0x30,0x29,0x34, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x7b,0x8e,0x58,0x50,0x79,0x64, 0x52,0x72,0x5e,0x53,0x79,0x5c,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x57,0x50, 0x79,0x56,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x52,0x7c,0x52,0x53,0x7e,0x52,0x5a,0x84,0x53,0x5d,0x88,0x57,0x63,0x8c,0x60, 0x53,0x77,0x5f,0x48,0x64,0x98,0xa1,0xba,0xd7,0xda,0xe5,0x8a,0x7d,0x92,0x68,0x69, 0x8f,0x6a,0x74,0x98,0x6a,0x75,0x99,0x73,0x7e,0xa0,0x34,0x39,0x47,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, 0x8a,0x8d,0x95,0x60,0x6d,0x93,0x63,0x53,0x77,0x5d,0x52,0x79,0x52,0x52,0x7d,0x52, 0x54,0x80,0x52,0x55,0x81,0x52,0x5c,0x86,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e, 0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5e,0x89,0x53,0x5e,0x88, 0x54,0x50,0x79,0x5e,0x53,0x79,0x76,0x80,0xa0,0x17,0x17,0x17,0x05,0x05,0x05,0x53, 0x53,0x53,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02, 0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x04,0x05,0x03,0x04, 0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x08, 0x07,0x07,0x09,0x07,0x08,0x09,0x08,0x09,0x0a,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0a, 0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0d,0x15,0x16,0x18,0x29,0x2a,0x2b,0x0c,0x0d, 0x11,0x13,0x12,0x18,0x1a,0x18,0x1f,0x4f,0x4c,0x53,0x32,0x30,0x37,0x23,0x1f,0x28, 0x4a,0x43,0x4b,0x7a,0x81,0x9a,0x61,0x69,0x88,0x57,0x60,0x82,0x50,0x59,0x7d,0x4c, 0x55,0x77,0x57,0x60,0x7e,0x45,0x4e,0x6e,0x43,0x48,0x67,0x48,0x4b,0x67,0x4c,0x48, 0x64,0x50,0x49,0x64,0x5b,0x51,0x6d,0x61,0x52,0x6b,0x53,0x51,0x70,0x36,0x34,0x45, 0x35,0x30,0x3f,0x31,0x2f,0x40,0x3b,0x3d,0x4a,0x41,0x42,0x4a,0x37,0x39,0x3e,0x43, 0x3d,0x47,0x68,0x6c,0x7f,0x50,0x5a,0x7c,0x48,0x46,0x69,0x57,0x4e,0x70,0x5f,0x52, 0x75,0x5e,0x53,0x76,0x5f,0x53,0x76,0x5f,0x52,0x76,0x5f,0x53,0x77,0x60,0x53,0x76, 0x5f,0x54,0x76,0x60,0x54,0x76,0x5f,0x55,0x76,0x60,0x55,0x77,0x5e,0x55,0x75,0x56, 0x4e,0x68,0x23,0x24,0x2e,0x2d,0x2b,0x3a,0x34,0x32,0x42,0x32,0x30,0x3f,0x2b,0x29, 0x36,0x21,0x21,0x2a,0x1e,0x1f,0x26,0x1e,0x1d,0x23,0x1b,0x1a,0x20,0x5c,0x53,0x6e, 0x78,0x69,0x94,0x4e,0x44,0x60,0x52,0x4a,0x67,0x5c,0x52,0x77,0x5b,0x51,0x77,0x5b, 0x52,0x77,0x5a,0x52,0x78,0x57,0x50,0x78,0x56,0x50,0x78,0x53,0x4f,0x79,0x52,0x4f, 0x79,0x51,0x4e,0x78,0x3d,0x3b,0x5c,0x5a,0x59,0x89,0x38,0x35,0x52,0x09,0x0a,0x0c, 0x0b,0x0c,0x0f,0x0b,0x0d,0x10,0x14,0x13,0x19,0x47,0x3c,0x4a,0x2c,0x26,0x2f,0x2a, 0x25,0x2d,0x29,0x24,0x2c,0x44,0x49,0x64,0x5b,0x66,0x8e,0x46,0x4d,0x6c,0x35,0x38, 0x50,0x35,0x39,0x51,0x37,0x3c,0x55,0x30,0x32,0x45,0x20,0x22,0x2b,0x54,0x4c,0x5e, 0x56,0x4d,0x61,0x7d,0x85,0x9b,0x53,0x5c,0x7e,0x50,0x4b,0x6a,0x2c,0x2a,0x38,0x31, 0x2c,0x3a,0x37,0x30,0x3e,0x3c,0x34,0x42,0x3c,0x34,0x42,0x36,0x2f,0x3d,0x26,0x25, 0x32,0x1c,0x1e,0x28,0x1f,0x20,0x29,0x48,0x41,0x51,0x51,0x47,0x5a,0x4c,0x45,0x5c, 0x51,0x4b,0x69,0x3d,0x36,0x4a,0x2e,0x28,0x34,0x26,0x20,0x2b,0x20,0x1d,0x26,0x23, 0x21,0x2b,0x1e,0x1d,0x28,0x1f,0x1e,0x28,0x36,0x2f,0x3c,0x2f,0x28,0x33,0x52,0x54, 0x68,0x50,0x52,0x76,0x5d,0x51,0x71,0x61,0x54,0x72,0x5c,0x56,0x79,0x78,0x78,0x92, 0x7e,0x7c,0x93,0x7c,0x79,0x91,0x85,0x82,0x99,0x8b,0x88,0x9d,0x91,0x8d,0xa0,0x86, 0x84,0x9b,0x80,0x80,0x9a,0x82,0x85,0x9f,0x83,0x83,0x9c,0x7b,0x79,0x92,0x66,0x66, 0x83,0x5f,0x5f,0x7d,0x83,0x80,0x95,0xae,0xaa,0xb8,0xbd,0xb8,0xc1,0xb3,0xae,0xb5, 0xaa,0xa6,0xb1,0x7e,0x83,0x98,0x26,0x2a,0x36,0x29,0x2d,0x37,0x2b,0x2e,0x39,0x2b, 0x2f,0x3a,0x2b,0x2e,0x3a,0x2b,0x2f,0x3b,0x2e,0x32,0x3e,0x36,0x3a,0x46,0x46,0x4b, 0x58,0x52,0x57,0x65,0x5a,0x5e,0x6d,0x5b,0x60,0x6e,0x55,0x5a,0x67,0x47,0x4d,0x5b, 0x4d,0x52,0x62,0x50,0x54,0x63,0x38,0x3d,0x4c,0x2c,0x30,0x3e,0x29,0x2c,0x39,0x28, 0x2b,0x37,0x27,0x2a,0x36,0x25,0x28,0x33,0x26,0x29,0x33,0x26,0x29,0x33,0x27,0x2a, 0x34,0x26,0x2a,0x33,0x23,0x27,0x31,0x21,0x24,0x2d,0x1e,0x20,0x29,0x1a,0x1c,0x25, 0x1a,0x1c,0x24,0x18,0x1a,0x22,0x18,0x1a,0x22,0x16,0x19,0x20,0x14,0x16,0x1d,0x12, 0x14,0x1a,0x10,0x12,0x17,0x0e,0x10,0x15,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0a,0x0b, 0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0c,0x07,0x08,0x0a,0x07,0x07,0x0a,0x06,0x07,0x0a, 0x06,0x06,0x08,0x06,0x06,0x07,0x08,0x08,0x0b,0x7d,0x87,0xa5,0x51,0x5c,0x86,0x5b, 0x51,0x77,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x53,0x76,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x52,0x76,0x5e,0x53,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x64,0x58,0x7e,0x0a,0x09,0x0c,0x02, 0x02,0x02,0x02,0x02,0x02,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,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,0x1a,0x1d, 0x28,0x53,0x5d,0x88,0x54,0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x52,0x7c,0x52,0x53,0x7e,0x52,0x5a,0x84,0x53, 0x5f,0x89,0x56,0x62,0x8b,0x5a,0x65,0x8d,0x5b,0x66,0x8e,0x52,0x5c,0x86,0x7a,0x85, 0xa7,0xca,0xcf,0xdd,0xc4,0xca,0xd8,0xc2,0xc7,0xd7,0xbe,0xc3,0xd5,0xba,0xc1,0xd1, 0xb4,0xba,0xce,0xab,0xb2,0xc8,0xa7,0xaf,0xc4,0xa2,0xaa,0xc0,0x9b,0xa4,0xbc,0x98, 0xa1,0xbb,0x94,0x9f,0xb8,0x94,0x9d,0xb8,0x93,0x9c,0xb7,0x93,0x9c,0xb8,0x90,0x9a, 0xb5,0x8e,0x99,0xb4,0x8c,0x95,0xb2,0x89,0x93,0xb0,0x88,0x92,0xb0,0x84,0x8e,0xad, 0x80,0x8a,0xaa,0x7a,0x85,0xa5,0x77,0x82,0xa4,0x75,0x81,0xa2,0x7d,0x89,0xa9,0x89, 0x93,0xb0,0x6f,0x7b,0x9f,0x57,0x50,0x79,0x64,0x53,0x76,0x64,0x53,0x73,0x64,0x53, 0x75,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x75, 0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x4d,0x6b,0x64,0x53,0x75,0x56,0x50,0x79,0x5a, 0x52,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x56,0x50,0x79,0x5f, 0x53,0x77,0x5b,0x43,0x5d,0x52,0x4f,0x7b,0x78,0x76,0x83,0x39,0x2b,0x34,0x67,0x53, 0x67,0x03,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x6d,0x71, 0x54,0x5f,0x89,0x63,0x4b,0x69,0x5c,0x52,0x79,0x5b,0x52,0x79,0x5a,0x52,0x79,0x58, 0x50,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x53,0x7e,0x52,0x57,0x82,0x52,0x5d,0x88, 0x56,0x62,0x8b,0x55,0x50,0x79,0x63,0x4b,0x67,0x89,0x93,0xb0,0xcb,0xd0,0xdd,0x8f, 0x84,0x98,0x69,0x67,0x8b,0x6a,0x74,0x98,0x6d,0x77,0x9b,0x78,0x82,0xa3,0x3a,0x40, 0x52,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,0x43,0x44,0x44,0x80,0x8a,0xaa,0x52,0x4f,0x7b,0x64,0x50,0x71, 0x52,0x52,0x7d,0x52,0x54,0x7e,0x52,0x55,0x80,0x52,0x5a,0x84,0x52,0x5b,0x85,0x52, 0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f, 0x89,0x53,0x5e,0x89,0x52,0x53,0x7e,0x64,0x53,0x75,0x52,0x56,0x81,0x68,0x6c,0x74, 0x1d,0x1d,0x1d,0x61,0x61,0x61,0x1d,0x1d,0x1d,0x00,0x00,0x00,0x19,0x19,0x19,0x1b, 0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x02,0x03,0x02, 0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06, 0x07,0x05,0x06,0x06,0x06,0x07,0x08,0x07,0x08,0x09,0x08,0x09,0x0a,0x09,0x09,0x0a, 0x09,0x0a,0x0b,0x0a,0x0a,0x0d,0x0a,0x0b,0x0d,0x0a,0x0a,0x0d,0x10,0x11,0x12,0x2c, 0x2c,0x2e,0x0c,0x0d,0x0f,0x0c,0x0d,0x10,0x0d,0x0e,0x12,0x23,0x23,0x28,0x0f,0x0f, 0x14,0x19,0x18,0x1c,0x3c,0x33,0x3d,0x6f,0x79,0x95,0x5e,0x66,0x89,0x64,0x6c,0x8b, 0x67,0x6f,0x8e,0x67,0x70,0x8f,0x77,0x7f,0x99,0x53,0x5a,0x7b,0x4a,0x53,0x73,0x45, 0x49,0x6c,0x48,0x4a,0x6a,0x51,0x4d,0x6c,0x57,0x4f,0x6d,0x5d,0x4d,0x65,0x53,0x4f, 0x6a,0x36,0x32,0x41,0x35,0x31,0x40,0x32,0x2f,0x3e,0x2f,0x2e,0x3d,0x3b,0x3c,0x47, 0x43,0x43,0x4b,0x4c,0x48,0x51,0x68,0x6b,0x7b,0x52,0x5b,0x7c,0x48,0x46,0x6a,0x57, 0x4e,0x6f,0x5f,0x52,0x75,0x5e,0x53,0x76,0x5f,0x53,0x76,0x60,0x53,0x77,0x60,0x54, 0x77,0x60,0x54,0x76,0x5f,0x54,0x76,0x5f,0x54,0x75,0x60,0x55,0x77,0x60,0x55,0x77, 0x5a,0x51,0x71,0x53,0x4a,0x67,0x2b,0x28,0x36,0x35,0x30,0x3f,0x3a,0x34,0x43,0x38, 0x31,0x40,0x2e,0x2a,0x37,0x25,0x23,0x30,0x1f,0x20,0x29,0x1e,0x1e,0x25,0x1b,0x1a, 0x20,0x52,0x4a,0x62,0x78,0x69,0x93,0x4e,0x46,0x62,0x51,0x49,0x66,0x5b,0x51,0x77, 0x5c,0x52,0x77,0x5a,0x52,0x78,0x5b,0x51,0x78,0x58,0x50,0x78,0x57,0x50,0x78,0x55, 0x50,0x78,0x52,0x4f,0x79,0x51,0x4e,0x78,0x3d,0x3c,0x5a,0x5c,0x5a,0x8a,0x3f,0x3d, 0x5c,0x09,0x0a,0x0c,0x0a,0x0a,0x0e,0x0b,0x0d,0x10,0x0e,0x0e,0x12,0x2d,0x29,0x34, 0x33,0x2c,0x36,0x2c,0x26,0x2e,0x2a,0x26,0x2e,0x2d,0x2a,0x36,0x62,0x6e,0x9a,0x52, 0x5c,0x80,0x39,0x3f,0x59,0x35,0x39,0x52,0x34,0x39,0x50,0x40,0x42,0x5e,0x1e,0x21, 0x29,0x3e,0x3a,0x48,0x57,0x4d,0x60,0x7b,0x80,0x96,0x65,0x70,0x8c,0x4d,0x4d,0x71, 0x2d,0x2c,0x3e,0x2f,0x2a,0x37,0x38,0x31,0x3f,0x3e,0x35,0x43,0x3e,0x36,0x43,0x39, 0x32,0x3f,0x2b,0x27,0x34,0x1d,0x1e,0x29,0x1a,0x1d,0x25,0x1a,0x1d,0x24,0x3a,0x34, 0x41,0x38,0x33,0x3e,0x54,0x4e,0x6c,0x53,0x4b,0x6a,0x29,0x26,0x31,0x2d,0x28,0x34, 0x1f,0x1b,0x23,0x2c,0x28,0x33,0x2a,0x26,0x31,0x23,0x22,0x2c,0x24,0x22,0x2d,0x33, 0x2c,0x39,0x31,0x2b,0x37,0x4f,0x50,0x6d,0x49,0x3f,0x58,0x56,0x47,0x5e,0x63,0x59, 0x79,0x5d,0x5d,0x7f,0x70,0x71,0x8b,0x7a,0x7a,0x92,0x87,0x86,0x9c,0x8b,0x89,0x9f, 0x8c,0x89,0x9f,0x87,0x85,0x9c,0x8f,0x8f,0xa5,0x9a,0x9a,0xaf,0x97,0x97,0xab,0x93, 0x91,0xa5,0x92,0x91,0xa5,0x8f,0x8d,0xa1,0x98,0x95,0xa7,0xb2,0xaf,0xbb,0xc0,0xbb, 0xc5,0xbc,0xb7,0xbe,0xb5,0xb1,0xbb,0xa3,0xa4,0xb2,0x7a,0x7a,0x7a,0x6d,0x6e,0x72, 0x54,0x56,0x5e,0x3e,0x42,0x4c,0x33,0x36,0x42,0x2e,0x31,0x3d,0x2e,0x33,0x3f,0x32, 0x36,0x43,0x39,0x3d,0x49,0x44,0x48,0x56,0x4e,0x52,0x60,0x56,0x5a,0x68,0x52,0x56, 0x65,0x4a,0x50,0x60,0x46,0x4c,0x60,0x4d,0x53,0x66,0x5b,0x5f,0x70,0x38,0x3d,0x4f, 0x2c,0x31,0x3f,0x29,0x2d,0x3a,0x26,0x2a,0x36,0x26,0x29,0x34,0x24,0x28,0x32,0x24, 0x27,0x32,0x23,0x26,0x31,0x23,0x26,0x30,0x20,0x23,0x2e,0x1f,0x22,0x2b,0x1d,0x20, 0x29,0x1a,0x1d,0x26,0x19,0x1b,0x24,0x19,0x1b,0x23,0x18,0x1a,0x22,0x16,0x18,0x20, 0x16,0x17,0x1e,0x12,0x15,0x1b,0x11,0x12,0x18,0x0e,0x10,0x15,0x0d,0x0e,0x12,0x0c, 0x0e,0x12,0x0b,0x0c,0x10,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x08,0x09,0x0c,0x07,0x08, 0x0b,0x06,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x77,0x7f,0x99, 0x56,0x62,0x89,0x55,0x4f,0x77,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e, 0x53,0x76,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52, 0x76,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x61,0x56,0x7b, 0x21,0x1d,0x29,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x2a,0x2f,0x3f,0x52,0x55,0x81,0x55,0x50,0x79,0x55,0x50,0x79,0x54,0x50, 0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x54,0x80, 0x52,0x5a,0x84,0x53,0x5f,0x89,0x56,0x62,0x8b,0x5a,0x65,0x8d,0x5b,0x67,0x90,0x54, 0x5f,0x89,0x80,0x8a,0xaa,0xbf,0xc4,0xd5,0xc2,0xc8,0xd7,0xc0,0xc6,0xd6,0xbf,0xc4, 0xd5,0xb8,0xbe,0xd0,0xb2,0xb8,0xcb,0xab,0xb2,0xc7,0xa2,0xab,0xc2,0x9f,0xa7,0xbf, 0x9c,0xa4,0xbe,0x95,0x9f,0xb9,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x91, 0x9b,0xb5,0x8e,0x98,0xb3,0x8d,0x96,0xb3,0x8a,0x94,0xb1,0x89,0x93,0xb0,0x88,0x92, 0xb0,0x83,0x8d,0xac,0x81,0x8c,0xab,0x7b,0x86,0xa7,0x76,0x82,0xa3,0x72,0x7d,0xa0, 0x8c,0x96,0xb2,0x92,0x9b,0xb5,0x65,0x72,0x96,0x63,0x53,0x77,0x63,0x53,0x77,0x64, 0x53,0x74,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53, 0x75,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x53,0x75,0x64,0x50,0x6e,0x64,0x4c,0x6a, 0x5c,0x52,0x79,0x52,0x4f,0x7a,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e, 0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x52,0x4f,0x7a,0x5f,0x47,0x63,0x63,0x4b,0x67,0x62,0x6d,0x92,0x48,0x3d,0x43,0x4b, 0x3a,0x47,0x3b,0x31,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3b,0x3b,0x3c,0x6e,0x7a,0x9d,0x62,0x4a,0x66,0x60,0x53,0x77,0x5c,0x52,0x79, 0x5a,0x52,0x79,0x5a,0x52,0x79,0x57,0x50,0x79,0x56,0x50,0x79,0x55,0x50,0x79,0x52, 0x4f,0x7a,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x53,0x7d,0x52,0x57, 0x82,0x52,0x5d,0x88,0x56,0x63,0x8b,0x54,0x50,0x79,0x60,0x48,0x64,0x82,0x8c,0xab, 0xcf,0xd3,0xdd,0x86,0x7f,0x91,0x5a,0x56,0x73,0x51,0x59,0x75,0x54,0x5c,0x79,0x65, 0x6e,0x8c,0x42,0x48,0x5c,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,0x9b,0xa1,0xb2,0x55,0x62, 0x8a,0x64,0x50,0x71,0x5a,0x52,0x79,0x52,0x52,0x7d,0x52,0x53,0x7d,0x52,0x56,0x81, 0x52,0x5a,0x84,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53, 0x5f,0x89,0x54,0x5f,0x89,0x53,0x5e,0x89,0x52,0x5d,0x88,0x5c,0x52,0x79,0x5c,0x52, 0x79,0x6f,0x7a,0x9a,0x47,0x47,0x47,0x44,0x44,0x44,0x0a,0x0a,0x0a,0x00,0x00,0x00, 0x03,0x03,0x03,0x2b,0x2b,0x2b,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x03,0x04,0x05,0x03,0x03,0x04,0x04,0x04,0x05,0x05, 0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x08,0x08,0x08,0x0a,0x07,0x08, 0x09,0x08,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d, 0x0a,0x0b,0x0e,0x2a,0x2b,0x2c,0x13,0x14,0x16,0x0c,0x0d,0x0e,0x0c,0x0d,0x0f,0x0d, 0x0e,0x11,0x0e,0x0f,0x12,0x17,0x16,0x1a,0x3e,0x36,0x3f,0x71,0x7a,0x97,0x53,0x5d, 0x82,0x51,0x5b,0x80,0x52,0x5b,0x82,0x52,0x5c,0x80,0x6e,0x76,0x94,0x56,0x5e,0x80, 0x4e,0x56,0x79,0x4c,0x54,0x75,0x4a,0x4f,0x71,0x48,0x4b,0x6d,0x49,0x48,0x68,0x57, 0x49,0x60,0x51,0x4b,0x65,0x39,0x33,0x42,0x34,0x30,0x3f,0x38,0x33,0x44,0x35,0x31, 0x41,0x30,0x30,0x40,0x3a,0x3c,0x47,0x4f,0x4b,0x55,0x65,0x65,0x75,0x54,0x5d,0x7c, 0x48,0x46,0x6a,0x56,0x4e,0x6f,0x5e,0x52,0x75,0x5e,0x52,0x75,0x61,0x55,0x78,0x65, 0x5a,0x7c,0x66,0x5c,0x7d,0x63,0x58,0x79,0x62,0x56,0x79,0x60,0x55,0x77,0x61,0x56, 0x78,0x5f,0x56,0x77,0x58,0x4f,0x6f,0x5e,0x52,0x6d,0x3d,0x35,0x43,0x42,0x39,0x48, 0x45,0x3c,0x4d,0x42,0x3a,0x4b,0x3a,0x33,0x43,0x32,0x2d,0x3b,0x26,0x24,0x30,0x1e, 0x1e,0x26,0x1d,0x1c,0x22,0x48,0x42,0x56,0x7a,0x6c,0x98,0x51,0x48,0x66,0x4e,0x45, 0x60,0x5e,0x52,0x75,0x5b,0x52,0x77,0x5a,0x52,0x78,0x5a,0x51,0x78,0x5b,0x52,0x78, 0x57,0x50,0x78,0x55,0x50,0x78,0x54,0x50,0x78,0x51,0x4f,0x79,0x3d,0x3a,0x5a,0x5b, 0x58,0x87,0x42,0x41,0x62,0x09,0x0a,0x0c,0x0a,0x0a,0x0e,0x0b,0x0c,0x0f,0x0d,0x0e, 0x11,0x10,0x12,0x17,0x45,0x3a,0x49,0x2d,0x27,0x30,0x2d,0x27,0x30,0x2c,0x27,0x30, 0x4e,0x52,0x74,0x55,0x5f,0x86,0x4a,0x52,0x72,0x35,0x38,0x51,0x34,0x38,0x4f,0x36, 0x39,0x51,0x2d,0x2e,0x3e,0x20,0x23,0x2c,0x56,0x4d,0x60,0x61,0x63,0x7b,0x73,0x7b, 0x94,0x50,0x59,0x7a,0x30,0x31,0x44,0x25,0x24,0x31,0x36,0x2f,0x3e,0x3e,0x36,0x44, 0x3f,0x36,0x45,0x38,0x31,0x3e,0x27,0x25,0x32,0x1b,0x1e,0x27,0x1b,0x1e,0x25,0x1a, 0x1d,0x24,0x34,0x30,0x3b,0x37,0x30,0x3c,0x54,0x4f,0x6c,0x54,0x4d,0x6c,0x23,0x22, 0x2f,0x28,0x24,0x2f,0x29,0x24,0x2e,0x27,0x22,0x2c,0x2c,0x26,0x32,0x2d,0x28,0x34, 0x2a,0x26,0x31,0x2e,0x29,0x36,0x32,0x2a,0x38,0x3e,0x34,0x42,0x3e,0x3a,0x53,0x40, 0x35,0x49,0x61,0x52,0x6d,0x58,0x52,0x72,0x59,0x54,0x75,0x5a,0x5a,0x7b,0x64,0x65, 0x83,0x62,0x62,0x81,0x67,0x69,0x87,0x7a,0x79,0x91,0x8f,0x8e,0xa2,0x9b,0x9a,0xad, 0x9c,0x9b,0xad,0x9b,0x9a,0xad,0x99,0x99,0xad,0x9a,0x99,0xad,0x9b,0x9b,0xad,0xa5, 0xa3,0xb2,0xbe,0xb9,0xc3,0xbf,0xbb,0xc1,0xc1,0xbf,0xc8,0xc2,0xc3,0xcd,0xb0,0xb0, 0xb0,0xb0,0xb0,0xb0,0xa7,0xa7,0xa8,0x76,0x77,0x7d,0x4e,0x52,0x5b,0x3a,0x3e,0x4a, 0x38,0x3d,0x4a,0x3a,0x3f,0x4c,0x3d,0x42,0x4f,0x40,0x45,0x52,0x44,0x49,0x56,0x46, 0x4b,0x5a,0x46,0x4a,0x5a,0x46,0x4c,0x5e,0x46,0x4c,0x62,0x46,0x4d,0x62,0x50,0x57, 0x6b,0x58,0x5d,0x6f,0x3a,0x3e,0x50,0x2c,0x31,0x40,0x27,0x2a,0x38,0x26,0x29,0x36, 0x2b,0x2e,0x39,0x25,0x28,0x33,0x22,0x26,0x30,0x1f,0x22,0x2d,0x21,0x23,0x2d,0x1e, 0x21,0x2a,0x1c,0x1f,0x28,0x1a,0x1e,0x26,0x1a,0x1c,0x25,0x18,0x1a,0x22,0x18,0x1a, 0x22,0x17,0x19,0x21,0x16,0x17,0x1e,0x12,0x14,0x1a,0x11,0x12,0x18,0x0f,0x10,0x16, 0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0b,0x0d,0x11,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x08, 0x09,0x0c,0x08,0x09,0x0c,0x07,0x07,0x0a,0x06,0x07,0x0a,0x06,0x06,0x08,0x06,0x06, 0x08,0x5d,0x62,0x76,0x5c,0x68,0x8d,0x50,0x4e,0x78,0x5e,0x52,0x75,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e, 0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x52,0x76,0x5e,0x53, 0x76,0x60,0x55,0x78,0x3b,0x34,0x4a,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,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,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,0x3b,0x42,0x58,0x52,0x52,0x7d,0x55,0x50,0x79,0x55, 0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50, 0x7c,0x52,0x55,0x80,0x52,0x5c,0x86,0x53,0x5f,0x89,0x57,0x64,0x8c,0x5a,0x65,0x8e, 0x55,0x62,0x8a,0x52,0x4f,0x7b,0x6c,0x77,0x9b,0x9b,0xa4,0xbc,0xbe,0xc3,0xd5,0xc1, 0xc7,0xd7,0xbf,0xc4,0xd5,0xb9,0xc0,0xd1,0xb2,0xb9,0xcb,0xab,0xb3,0xc8,0xa1,0xa9, 0xc0,0x9b,0xa4,0xbc,0x98,0xa1,0xbb,0x94,0x9d,0xb8,0x93,0x9c,0xb8,0x92,0x9b,0xb7, 0x91,0x9b,0xb5,0x90,0x9a,0xb5,0x8c,0x96,0xb3,0x8b,0x95,0xb2,0x8b,0x95,0xb2,0x88, 0x92,0xb0,0x84,0x8e,0xac,0x83,0x8d,0xac,0x7d,0x89,0xa9,0x79,0x84,0xa5,0x73,0x7e, 0xa1,0x75,0x81,0xa3,0x9b,0xa4,0xbc,0x92,0x9c,0xb7,0x58,0x65,0x8d,0x5d,0x52,0x79, 0x62,0x53,0x77,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64, 0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x53,0x74,0x64,0x53,0x74,0x64,0x52, 0x72,0x63,0x4c,0x69,0x63,0x53,0x77,0x52,0x4f,0x7a,0x5a,0x52,0x79,0x5e,0x53,0x79, 0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x58,0x50,0x79,0x5f,0x53,0x77,0x56,0x3e,0x57,0x5a,0x52,0x79,0x86,0x85,0x92, 0x3c,0x2e,0x38,0x64,0x50,0x63,0x06,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x8b,0x94,0xad,0x64,0x53,0x73,0x64,0x52, 0x72,0x5b,0x52,0x79,0x5a,0x52,0x79,0x58,0x52,0x79,0x58,0x50,0x79,0x57,0x50,0x79, 0x56,0x50,0x79,0x53,0x50,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52, 0x52,0x7d,0x52,0x55,0x80,0x52,0x5d,0x86,0x55,0x62,0x8b,0x52,0x4f,0x7b,0x60,0x48, 0x64,0x7b,0x85,0xa7,0xc7,0xc9,0xd3,0x67,0x64,0x71,0x2e,0x2c,0x3b,0x20,0x23,0x2d, 0x23,0x27,0x32,0x3f,0x45,0x59,0x3e,0x44,0x59,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,0x6c, 0x6d,0x6f,0x72,0x7d,0xa1,0x64,0x53,0x75,0x64,0x52,0x73,0x52,0x52,0x7d,0x52,0x53, 0x7e,0x52,0x55,0x80,0x52,0x57,0x83,0x52,0x5a,0x84,0x52,0x5d,0x88,0x53,0x5e,0x88, 0x70,0x7a,0x9c,0x5c,0x66,0x8f,0x53,0x5e,0x89,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52, 0x52,0x7d,0x64,0x53,0x75,0x52,0x56,0x81,0x8c,0x8e,0x94,0x1f,0x1f,0x1f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x15,0x23,0x23,0x23,0x0b,0x0b,0x0b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x10, 0x10,0x10,0x0c,0x0c,0x0c,0x05,0x05,0x05,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x04,0x05,0x03,0x04,0x05, 0x03,0x03,0x04,0x05,0x05,0x06,0x04,0x04,0x05,0x06,0x06,0x07,0x06,0x06,0x07,0x07, 0x08,0x09,0x08,0x08,0x0a,0x08,0x09,0x0a,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0b, 0x0d,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x23,0x23,0x25,0x47,0x48,0x49,0x0b,0x0c,0x0e, 0x0c,0x0d,0x0f,0x0d,0x0e,0x10,0x0e,0x0e,0x11,0x14,0x13,0x16,0x40,0x36,0x3f,0x71, 0x7a,0x98,0x54,0x5e,0x84,0x52,0x5b,0x81,0x53,0x5c,0x82,0x53,0x5b,0x81,0x64,0x6b, 0x8d,0x6b,0x72,0x91,0x61,0x69,0x8a,0x50,0x55,0x7a,0x50,0x54,0x77,0x4e,0x51,0x72, 0x4a,0x4a,0x68,0x52,0x48,0x61,0x52,0x4c,0x65,0x3f,0x37,0x46,0x35,0x2f,0x3d,0x39, 0x33,0x43,0x3c,0x36,0x47,0x37,0x33,0x44,0x31,0x30,0x40,0x46,0x45,0x52,0x60,0x5f, 0x70,0x58,0x5e,0x7b,0x4b,0x49,0x6c,0x55,0x4e,0x6f,0x5d,0x51,0x74,0x5e,0x51,0x74, 0x62,0x56,0x78,0x6c,0x61,0x81,0x71,0x68,0x85,0x6f,0x65,0x84,0x6e,0x64,0x83,0x62, 0x59,0x79,0x5c,0x51,0x74,0x5b,0x51,0x72,0x5e,0x52,0x70,0x66,0x57,0x72,0x45,0x3b, 0x4a,0x46,0x3d,0x4d,0x4a,0x40,0x52,0x4a,0x41,0x54,0x44,0x3d,0x4f,0x3c,0x36,0x46, 0x32,0x2e,0x3d,0x25,0x23,0x30,0x1e,0x1e,0x26,0x3c,0x36,0x47,0x7c,0x6e,0x9a,0x55, 0x4f,0x6a,0x4c,0x44,0x5f,0x5e,0x53,0x75,0x5c,0x53,0x77,0x5b,0x52,0x78,0x5c,0x52, 0x77,0x5c,0x52,0x78,0x5a,0x52,0x78,0x56,0x50,0x78,0x54,0x50,0x78,0x52,0x4f,0x79, 0x3e,0x3c,0x5b,0x59,0x56,0x84,0x47,0x45,0x68,0x09,0x0a,0x0c,0x0a,0x0b,0x0e,0x0b, 0x0d,0x10,0x0d,0x0e,0x12,0x0f,0x10,0x15,0x2c,0x28,0x32,0x37,0x2e,0x39,0x2e,0x28, 0x32,0x2f,0x29,0x33,0x46,0x44,0x5f,0x5d,0x67,0x92,0x50,0x56,0x7b,0x40,0x44,0x62, 0x35,0x37,0x4e,0x35,0x36,0x4e,0x37,0x37,0x50,0x1e,0x21,0x29,0x49,0x42,0x52,0x56, 0x4d,0x5f,0x74,0x7a,0x91,0x5f,0x69,0x87,0x4b,0x4c,0x6c,0x1e,0x1f,0x2a,0x2a,0x27, 0x34,0x3a,0x32,0x40,0x3e,0x35,0x44,0x36,0x2f,0x3d,0x22,0x21,0x2d,0x1a,0x1e,0x26, 0x1a,0x1d,0x24,0x1a,0x1c,0x24,0x28,0x26,0x2f,0x36,0x30,0x3c,0x51,0x4c,0x69,0x54, 0x4f,0x6e,0x23,0x22,0x2f,0x1c,0x1c,0x26,0x24,0x22,0x2c,0x28,0x24,0x2e,0x28,0x22, 0x2d,0x28,0x23,0x2e,0x2b,0x26,0x31,0x2a,0x26,0x31,0x2d,0x27,0x33,0x38,0x2e,0x38, 0x3f,0x38,0x47,0x3f,0x39,0x52,0x44,0x39,0x4f,0x5b,0x4d,0x67,0x61,0x55,0x71,0x62, 0x55,0x6f,0x51,0x42,0x57,0x4e,0x40,0x55,0x62,0x59,0x77,0x6b,0x6d,0x8a,0x90,0x8f, 0xa3,0x9e,0x9c,0xad,0x99,0x98,0xa9,0x94,0x93,0xa7,0x8d,0x8d,0xa4,0x8b,0x8c,0xa3, 0x8e,0x90,0xa5,0x98,0x98,0xac,0xb2,0xae,0xbb,0xc8,0xc6,0xcc,0xcf,0xce,0xd5,0xd0, 0xd0,0xd8,0xc0,0xc0,0xc0,0xc2,0xc2,0xc2,0xc1,0xc1,0xc1,0xa6,0xa7,0xa9,0x6c,0x6f, 0x7a,0x4d,0x52,0x60,0x4a,0x4e,0x5e,0x4f,0x54,0x63,0x50,0x56,0x65,0x4e,0x53,0x63, 0x4b,0x51,0x61,0x49,0x4e,0x5e,0x44,0x4a,0x5a,0x3e,0x45,0x57,0x42,0x49,0x5e,0x45, 0x4b,0x62,0x46,0x4c,0x63,0x53,0x59,0x6e,0x57,0x5d,0x6f,0x45,0x45,0x57,0x36,0x37, 0x46,0x3c,0x3e,0x4c,0x40,0x43,0x4d,0x36,0x39,0x42,0x22,0x25,0x2f,0x20,0x23,0x2e, 0x1f,0x22,0x2c,0x1e,0x20,0x2a,0x1c,0x1e,0x28,0x1b,0x1e,0x26,0x19,0x1b,0x24,0x18, 0x1a,0x22,0x17,0x19,0x21,0x16,0x17,0x1f,0x15,0x16,0x1e,0x12,0x14,0x1a,0x11,0x12, 0x18,0x0f,0x11,0x16,0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0b,0x0d,0x11,0x0a,0x0b,0x0f, 0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x08,0x09,0x0c,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06, 0x06,0x09,0x06,0x07,0x0a,0x40,0x44,0x51,0x65,0x70,0x94,0x50,0x4e,0x79,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x51,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e, 0x52,0x76,0x5e,0x52,0x76,0x61,0x56,0x79,0x56,0x4c,0x6c,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x47,0x4f,0x6b,0x52,0x50,0x7c, 0x57,0x50,0x79,0x56,0x50,0x79,0x55,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7b,0x52,0x52,0x7c,0x52,0x55,0x81,0x52,0x5d,0x88,0x54,0x5f,0x89,0x52,0x5d, 0x86,0x52,0x50,0x7b,0x52,0x55,0x80,0x5d,0x6a,0x91,0xb0,0xb7,0xca,0xa5,0xad,0xc3, 0x9a,0xa2,0xbb,0xa4,0xac,0xc3,0xb7,0xbc,0xcf,0xbb,0xc1,0xd2,0xb5,0xbc,0xcf,0xac, 0xb3,0xc8,0xa4,0xac,0xc2,0x9b,0xa4,0xbc,0x96,0xa0,0xb9,0x93,0x9c,0xb7,0x92,0x9b, 0xb7,0x92,0x9b,0xb5,0x92,0x9b,0xb7,0x8e,0x99,0xb4,0x8a,0x94,0xb1,0x8b,0x94,0xb1, 0x89,0x93,0xb0,0x86,0x91,0xaf,0x82,0x8c,0xab,0x80,0x8a,0xaa,0x7c,0x86,0xa7,0x77, 0x83,0xa4,0x72,0x7d,0xa0,0x81,0x8b,0xab,0xa0,0xa8,0xc0,0x91,0x9a,0xb5,0x52,0x57, 0x83,0x5f,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76, 0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x74,0x64,0x53,0x74,0x64, 0x53,0x75,0x64,0x53,0x73,0x64,0x4c,0x69,0x64,0x52,0x73,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x53,0x4f,0x7a,0x60,0x48,0x65,0x5f,0x47,0x63,0x64,0x71, 0x95,0x51,0x45,0x4b,0x4f,0x3d,0x4c,0x41,0x36,0x43,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x90,0x9a,0x52, 0x4f,0x7b,0x63,0x4b,0x69,0x5c,0x52,0x79,0x5a,0x52,0x79,0x58,0x50,0x79,0x58,0x52, 0x79,0x56,0x50,0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x53,0x50,0x79,0x52,0x4f,0x7a, 0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x55,0x80,0x52,0x5a,0x84,0x55,0x60,0x8a,0x52, 0x52,0x7d,0x64,0x52,0x72,0x69,0x74,0x98,0xa5,0xa8,0xaf,0x3f,0x3e,0x46,0xba,0xb9, 0xbb,0xfa,0xfa,0xfa,0xee,0xee,0xee,0x3d,0x3f,0x47,0x35,0x39,0x4b,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,0x15,0x15,0x15,0x9f,0xa7,0xbc,0x52,0x54,0x80,0x64,0x50,0x6f,0x52, 0x4f,0x7a,0x52,0x52,0x7d,0x52,0x54,0x80,0x52,0x55,0x80,0x52,0x58,0x83,0x71,0x79, 0x9b,0x6a,0x73,0x98,0x7f,0x87,0xa5,0x73,0x7c,0x9e,0x6a,0x73,0x97,0x54,0x5f,0x89, 0x53,0x5e,0x89,0x52,0x5d,0x86,0x5c,0x52,0x79,0x7a,0x70,0x8d,0xaa,0xaf,0xc0,0x1d, 0x1d,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20, 0x20,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06, 0x20,0x20,0x20,0x1c,0x1c,0x1c,0x20,0x20,0x20,0x24,0x24,0x24,0x19,0x19,0x19,0x06, 0x06,0x06,0x16,0x16,0x17,0x13,0x13,0x14,0x02,0x03,0x03,0x02,0x02,0x03,0x03,0x04, 0x05,0x03,0x04,0x05,0x04,0x04,0x05,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07, 0x06,0x06,0x08,0x06,0x07,0x09,0x08,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a, 0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x13,0x14,0x17,0x40,0x41, 0x43,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0d,0x0e,0x0f,0x0d,0x0e,0x10,0x10,0x10,0x12, 0x3a,0x2f,0x39,0x73,0x7d,0x9b,0x54,0x5e,0x83,0x53,0x5a,0x81,0x53,0x58,0x80,0x53, 0x59,0x81,0x5b,0x60,0x87,0x5f,0x64,0x88,0x6c,0x71,0x91,0x52,0x58,0x7c,0x51,0x54, 0x78,0x50,0x51,0x74,0x4b,0x4b,0x6c,0x52,0x48,0x61,0x53,0x4f,0x6b,0x41,0x38,0x47, 0x3e,0x36,0x45,0x3a,0x33,0x42,0x39,0x32,0x40,0x38,0x31,0x40,0x37,0x31,0x3f,0x36, 0x32,0x42,0x56,0x54,0x66,0x61,0x67,0x81,0x55,0x57,0x75,0x5e,0x57,0x76,0x61,0x58, 0x79,0x5c,0x51,0x73,0x5d,0x51,0x73,0x61,0x55,0x77,0x63,0x5a,0x7b,0x67,0x5f,0x7f, 0x6d,0x65,0x85,0x66,0x5c,0x7a,0x5a,0x4e,0x6a,0x5e,0x51,0x6f,0x61,0x53,0x6e,0x67, 0x59,0x74,0x49,0x3f,0x4f,0x49,0x40,0x51,0x49,0x40,0x51,0x48,0x3f,0x50,0x46,0x3e, 0x4f,0x43,0x3b,0x4d,0x3e,0x39,0x4b,0x33,0x30,0x40,0x24,0x22,0x2e,0x2d,0x2a,0x37, 0x7b,0x6c,0x97,0x58,0x4e,0x6c,0x4b,0x41,0x5b,0x5d,0x52,0x74,0x5c,0x52,0x77,0x5d, 0x52,0x77,0x5c,0x52,0x77,0x5b,0x53,0x78,0x5a,0x52,0x78,0x57,0x50,0x78,0x55,0x50, 0x78,0x52,0x4f,0x79,0x43,0x41,0x62,0x57,0x55,0x82,0x4d,0x4b,0x6f,0x09,0x0a,0x0c, 0x0a,0x0a,0x0d,0x0b,0x0d,0x0f,0x0e,0x0e,0x12,0x0f,0x11,0x15,0x11,0x13,0x18,0x48, 0x3c,0x4b,0x31,0x2a,0x34,0x2f,0x29,0x33,0x2f,0x2b,0x34,0x65,0x69,0x99,0x53,0x57, 0x7d,0x50,0x53,0x77,0x39,0x3b,0x55,0x35,0x36,0x4e,0x35,0x36,0x4e,0x30,0x32,0x44, 0x29,0x2a,0x34,0x56,0x4c,0x5e,0x62,0x5e,0x72,0x76,0x80,0x97,0x4f,0x52,0x74,0x22, 0x25,0x30,0x21,0x20,0x2c,0x31,0x2b,0x39,0x33,0x2d,0x3a,0x35,0x31,0x44,0x1c,0x1d, 0x27,0x1a,0x1d,0x24,0x1a,0x1c,0x23,0x19,0x1b,0x22,0x18,0x1a,0x21,0x36,0x2f,0x3b, 0x54,0x4e,0x6d,0x55,0x50,0x70,0x21,0x21,0x2c,0x16,0x18,0x20,0x1a,0x1a,0x23,0x1e, 0x1d,0x27,0x24,0x21,0x2b,0x26,0x22,0x2c,0x25,0x21,0x2b,0x24,0x20,0x2a,0x1f,0x1e, 0x28,0x25,0x20,0x2b,0x34,0x2a,0x35,0x45,0x41,0x57,0x46,0x3f,0x5a,0x44,0x38,0x4d, 0x3e,0x33,0x46,0x31,0x28,0x36,0x2a,0x22,0x30,0x28,0x21,0x2d,0x4d,0x3e,0x52,0x56, 0x54,0x74,0x80,0x7f,0x94,0x90,0x8e,0xa1,0x86,0x85,0x99,0x7c,0x7c,0x93,0x7a,0x7b, 0x94,0x81,0x83,0x9c,0x85,0x86,0x9f,0x8c,0x8d,0xa4,0xa3,0xa2,0xb3,0xc0,0xbe,0xc7, 0xd0,0xcf,0xd7,0xd4,0xd4,0xdc,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc3,0xc3,0xc3,0xa2, 0xa5,0xab,0x75,0x7a,0x86,0x5e,0x63,0x72,0x5c,0x62,0x71,0x66,0x6b,0x7a,0x65,0x6a, 0x7a,0x5d,0x62,0x73,0x58,0x5e,0x70,0x56,0x5c,0x6e,0x4c,0x52,0x65,0x3f,0x45,0x5a, 0x3e,0x43,0x5a,0x45,0x4b,0x62,0x45,0x4b,0x62,0x45,0x4b,0x62,0x4c,0x52,0x67,0x52, 0x54,0x66,0x50,0x50,0x60,0x41,0x41,0x4f,0x2d,0x2f,0x3c,0x3f,0x41,0x4c,0x27,0x29, 0x34,0x21,0x24,0x2e,0x1e,0x22,0x2b,0x1e,0x21,0x2a,0x1c,0x1e,0x28,0x1b,0x1e,0x26, 0x1a,0x1d,0x26,0x19,0x1b,0x23,0x18,0x1a,0x22,0x16,0x18,0x20,0x13,0x16,0x1c,0x12, 0x14,0x1a,0x11,0x12,0x18,0x0f,0x11,0x16,0x0e,0x0f,0x14,0x0c,0x0e,0x12,0x0c,0x0d, 0x12,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x09,0x0c,0x08,0x08,0x0b, 0x08,0x08,0x0b,0x07,0x07,0x0a,0x06,0x07,0x0a,0x25,0x28,0x30,0x6c,0x77,0x9a,0x50, 0x51,0x7b,0x5c,0x51,0x77,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x5e,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x62,0x55,0x7a,0x66,0x59,0x80,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x57,0x62, 0x83,0x52,0x4f,0x7a,0x57,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x55,0x81,0x52,0x55,0x80,0x55, 0x50,0x79,0x57,0x50,0x79,0x5a,0x66,0x8e,0x94,0x9e,0xb8,0xa2,0xa9,0xbf,0xe3,0xe6, 0xed,0xc9,0xce,0xdb,0xbb,0xc2,0xd2,0xa3,0xab,0xc2,0x8d,0x98,0xb3,0x98,0xa1,0xba, 0xab,0xb2,0xc7,0xb1,0xb8,0xcb,0xa7,0xaf,0xc4,0x9d,0xa7,0xbf,0x95,0x9f,0xb9,0x92, 0x9b,0xb7,0x8d,0x98,0xb3,0x8e,0x98,0xb3,0x8d,0x98,0xb3,0x8e,0x99,0xb4,0x8a,0x94, 0xb1,0x88,0x92,0xb0,0x89,0x93,0xb0,0x86,0x91,0xaf,0x80,0x8b,0xaa,0x7c,0x88,0xa8, 0x7b,0x86,0xa7,0x76,0x82,0xa3,0x72,0x7d,0xa0,0x8e,0x98,0xb3,0xa1,0xa9,0xc1,0x8b, 0x95,0xb2,0x55,0x50,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x75,0x64,0x53, 0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x74, 0x64,0x53,0x74,0x64,0x53,0x73,0x64,0x53,0x73,0x64,0x4e,0x6c,0x63,0x4c,0x69,0x56, 0x50,0x79,0x52,0x50,0x7b,0x57,0x50,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53, 0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x5a,0x52,0x79,0x52,0x4f,0x7a,0x5a,0x41,0x5b,0x56, 0x50,0x79,0x9b,0x99,0xa2,0x3b,0x2c,0x36,0x61,0x4d,0x60,0x06,0x05,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6c,0x6c,0x6e,0x5f,0x6b,0x92,0x5f,0x47,0x64,0x5d,0x52,0x79,0x5a,0x52,0x79,0x5a, 0x52,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x54,0x50, 0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7c,0x52,0x55,0x80,0x52,0x5a,0x84, 0x54,0x5f,0x89,0x52,0x55,0x80,0x5a,0x52,0x79,0x54,0x5f,0x83,0x6a,0x6c,0x76,0x4f, 0x4f,0x51,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x8d,0x8d,0x90,0x2d,0x2d, 0x3e,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,0x87,0x89,0x8e,0x60,0x6c,0x93, 0x64,0x52,0x73,0x64,0x53,0x75,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x55,0x81,0x52, 0x58,0x83,0x93,0x99,0xb2,0x85,0x8d,0xaa,0x64,0x6e,0x93,0x73,0x7c,0x9e,0x72,0x7b, 0x9e,0x62,0x6c,0x92,0x61,0x6b,0x92,0x7a,0x82,0xa3,0x93,0x93,0xac,0xa1,0x95,0xa6, 0x8b,0x8d,0xa9,0x53,0x56,0x5e,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,0x17,0x17,0x17,0x1a,0x1a,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x09, 0x1a,0x1a,0x1a,0x2b,0x2b,0x2b,0x30,0x30,0x30,0x24,0x24,0x24,0x24,0x24,0x25,0x16, 0x17,0x17,0x08,0x08,0x09,0x03,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x05,0x05, 0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x07,0x08,0x08,0x0a,0x08,0x08,0x0a, 0x09,0x0a,0x0b,0x0a,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0a, 0x0b,0x0e,0x38,0x39,0x3c,0x0e,0x0f,0x11,0x0c,0x0d,0x0f,0x0b,0x0c,0x0e,0x0d,0x0e, 0x10,0x0c,0x0d,0x0f,0x3b,0x2f,0x3a,0x71,0x7c,0x9a,0x54,0x5e,0x84,0x52,0x58,0x80, 0x53,0x59,0x80,0x52,0x5b,0x81,0x52,0x58,0x80,0x58,0x5c,0x84,0x6e,0x72,0x91,0x54, 0x57,0x7e,0x54,0x56,0x7b,0x51,0x53,0x76,0x4c,0x4c,0x6f,0x54,0x4b,0x66,0x53,0x51, 0x6d,0x42,0x3a,0x4a,0x43,0x39,0x49,0x46,0x3d,0x4e,0x43,0x3b,0x4b,0x3b,0x33,0x41, 0x32,0x2c,0x39,0x3b,0x32,0x40,0x52,0x4a,0x5a,0x54,0x59,0x74,0x4c,0x4d,0x6e,0x56, 0x4f,0x6f,0x5d,0x52,0x73,0x5c,0x4f,0x6e,0x58,0x4c,0x6a,0x56,0x4c,0x69,0x56,0x4d, 0x68,0x5c,0x54,0x70,0x61,0x59,0x75,0x5b,0x54,0x6e,0x5a,0x53,0x6c,0x61,0x59,0x72, 0x65,0x5b,0x74,0x6a,0x61,0x7b,0x4e,0x48,0x58,0x4f,0x48,0x59,0x4e,0x46,0x57,0x4a, 0x40,0x52,0x45,0x3d,0x4d,0x40,0x38,0x48,0x38,0x33,0x43,0x32,0x2e,0x3d,0x28,0x25, 0x31,0x25,0x23,0x2e,0x7c,0x6e,0x9a,0x59,0x50,0x6f,0x45,0x3f,0x57,0x5b,0x52,0x72, 0x5c,0x52,0x77,0x5d,0x53,0x77,0x5c,0x53,0x77,0x5b,0x52,0x78,0x5b,0x53,0x78,0x5a, 0x52,0x78,0x57,0x50,0x78,0x54,0x50,0x78,0x3c,0x39,0x57,0x58,0x55,0x7f,0x52,0x50, 0x77,0x0a,0x0b,0x0c,0x0c,0x0b,0x0f,0x0b,0x0c,0x0f,0x0e,0x0e,0x12,0x0f,0x10,0x15, 0x10,0x12,0x16,0x2e,0x2b,0x35,0x3a,0x33,0x3d,0x33,0x2c,0x37,0x31,0x2c,0x35,0x50, 0x4f,0x71,0x5a,0x5d,0x87,0x50,0x54,0x78,0x4d,0x4f,0x71,0x36,0x36,0x4e,0x34,0x35, 0x4d,0x36,0x37,0x4f,0x1f,0x21,0x29,0x50,0x48,0x5a,0x56,0x4d,0x5f,0x8a,0x91,0xa4, 0x58,0x62,0x82,0x47,0x47,0x61,0x1e,0x1e,0x29,0x2a,0x27,0x33,0x22,0x21,0x2d,0x33, 0x34,0x4b,0x1e,0x21,0x2b,0x1a,0x1c,0x23,0x1a,0x1c,0x22,0x19,0x1b,0x22,0x18,0x1a, 0x21,0x30,0x2b,0x36,0x53,0x4e,0x6e,0x55,0x50,0x70,0x33,0x31,0x42,0x16,0x17,0x1e, 0x16,0x18,0x20,0x17,0x18,0x20,0x19,0x19,0x21,0x1a,0x1a,0x23,0x16,0x16,0x1e,0x18, 0x18,0x21,0x18,0x19,0x22,0x16,0x18,0x1f,0x2c,0x26,0x30,0x2f,0x27,0x32,0x45,0x47, 0x60,0x46,0x3e,0x5a,0x3e,0x34,0x48,0x34,0x2b,0x3c,0x2e,0x26,0x35,0x2d,0x25,0x33, 0x42,0x36,0x49,0x4e,0x48,0x65,0x5d,0x5b,0x75,0x6e,0x6d,0x84,0x6c,0x6c,0x84,0x5f, 0x5f,0x79,0x6a,0x6c,0x85,0x72,0x75,0x8f,0x78,0x7a,0x95,0x87,0x89,0xa1,0x9f,0x9f, 0xb3,0xae,0xae,0xbc,0xbd,0xbf,0xcc,0xbb,0xbd,0xca,0xb0,0xb2,0xb7,0xb5,0xb6,0xba, 0xaf,0xb1,0xb6,0x91,0x95,0xa1,0x77,0x7d,0x8e,0x73,0x79,0x89,0x72,0x77,0x86,0x74, 0x79,0x87,0x71,0x76,0x86,0x6a,0x70,0x80,0x6a,0x70,0x81,0x62,0x69,0x7b,0x56,0x5c, 0x6f,0x44,0x4a,0x60,0x3e,0x40,0x56,0x41,0x43,0x5a,0x42,0x48,0x60,0x46,0x4d,0x65, 0x4a,0x51,0x68,0x42,0x46,0x5e,0x3a,0x39,0x4e,0x33,0x32,0x45,0x2c,0x2c,0x3c,0x39, 0x3b,0x48,0x37,0x3a,0x45,0x21,0x24,0x2e,0x1e,0x22,0x2b,0x1e,0x22,0x2b,0x1c,0x1e, 0x29,0x1c,0x1e,0x27,0x1a,0x1e,0x26,0x1a,0x1c,0x25,0x18,0x1a,0x22,0x16,0x17,0x1e, 0x14,0x16,0x1d,0x12,0x14,0x1a,0x11,0x12,0x18,0x0f,0x11,0x16,0x0e,0x0f,0x15,0x0d, 0x0e,0x12,0x0c,0x0d,0x11,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x0a, 0x0d,0x09,0x0a,0x0d,0x08,0x08,0x0b,0x07,0x08,0x0a,0x07,0x07,0x0a,0x0f,0x10,0x14, 0x74,0x7e,0x9e,0x50,0x5a,0x82,0x5c,0x51,0x76,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e, 0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52, 0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x61,0x55,0x78, 0x76,0x66,0x92,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,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,0x04, 0x04,0x06,0x5e,0x6a,0x92,0x52,0x4f,0x7a,0x57,0x50,0x79,0x55,0x50,0x79,0x53,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x4f,0x7b,0x57,0x50,0x79, 0x5a,0x52,0x79,0x52,0x4f,0x7a,0x64,0x6f,0x95,0xa8,0xaf,0xc4,0x85,0x8e,0xac,0x69, 0x73,0x98,0x72,0x6d,0x8b,0xc7,0xc4,0xcb,0xd6,0xd9,0xe3,0xca,0xcf,0xdb,0xb4,0xbb, 0xce,0x98,0xa1,0xba,0x82,0x8c,0xab,0x93,0x9c,0xb7,0xa9,0xb0,0xc6,0xa1,0xa9,0xc0, 0x9b,0xa3,0xbc,0x92,0x9b,0xb7,0x8d,0x98,0xb3,0x8c,0x96,0xb3,0x8a,0x94,0xb1,0x8c, 0x95,0xb2,0x88,0x92,0xb0,0x88,0x92,0xaf,0x86,0x91,0xaf,0x80,0x8b,0xaa,0x80,0x8a, 0xaa,0x7a,0x85,0xa7,0x79,0x83,0xa4,0x74,0x80,0xa2,0x74,0x80,0xa2,0x9c,0xa4,0xbe, 0xa8,0xb0,0xc6,0x80,0x8a,0xaa,0x62,0x53,0x77,0x62,0x53,0x77,0x63,0x53,0x77,0x64, 0x53,0x76,0x64,0x53,0x76,0x63,0x53,0x77,0x64,0x53,0x76,0x63,0x53,0x77,0x64,0x53, 0x76,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x52,0x72,0x64,0x53,0x74,0x64,0x50,0x6f, 0x62,0x4a,0x66,0x62,0x53,0x77,0x52,0x52,0x7c,0x52,0x4f,0x7a,0x5e,0x53,0x79,0x5e, 0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x52,0x53,0x7d,0x64,0x4e,0x6c, 0x60,0x4a,0x65,0x68,0x73,0x97,0x4c,0x40,0x46,0x4a,0x39,0x46,0x39,0x2f,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x2d,0x2d,0x2d,0x80,0x8a,0xaa,0x62,0x4a,0x66,0x64,0x50,0x71, 0x5b,0x52,0x79,0x5a,0x52,0x79,0x58,0x50,0x79,0x57,0x50,0x79,0x55,0x50,0x79,0x56, 0x50,0x79,0x55,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x53, 0x7e,0x52,0x57,0x82,0x53,0x5e,0x88,0x52,0x5a,0x84,0x56,0x4e,0x76,0x3f,0x48,0x67, 0x3c,0x3e,0x44,0xd9,0xd9,0xda,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x81, 0x82,0x86,0x33,0x32,0x44,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,0x2f,0x2f, 0x2f,0x8b,0x95,0xb2,0x56,0x50,0x79,0x64,0x50,0x6f,0x52,0x4f,0x7a,0x52,0x53,0x7d, 0x52,0x55,0x80,0x54,0x57,0x82,0x9f,0xa4,0xba,0x74,0x7c,0x9d,0x53,0x5e,0x88,0x69, 0x72,0x97,0x79,0x81,0xa2,0x84,0x8b,0xa9,0x7c,0x84,0xa3,0x78,0x81,0xa1,0x60,0x6a, 0x90,0x61,0x57,0x7c,0x64,0x53,0x74,0x68,0x72,0x91,0x05,0x05,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x24,0x24,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x04,0x04,0x1a,0x1a,0x1a,0x02,0x02,0x02, 0x0a,0x0a,0x0b,0x1b,0x1c,0x1c,0x23,0x23,0x24,0x1a,0x1a,0x1b,0x0b,0x0b,0x0c,0x04, 0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x08,0x06,0x07, 0x08,0x08,0x08,0x0a,0x08,0x09,0x0a,0x20,0x21,0x22,0x2f,0x2f,0x31,0x2d,0x2e,0x30, 0x21,0x22,0x24,0x10,0x11,0x12,0x30,0x31,0x34,0x29,0x2a,0x2c,0x0b,0x0c,0x0e,0x0c, 0x0d,0x0f,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x39,0x2f,0x38,0x6f,0x7a,0x99,0x53,0x5d, 0x85,0x52,0x58,0x7e,0x52,0x58,0x80,0x52,0x58,0x7f,0x52,0x5b,0x81,0x70,0x73,0x94, 0x74,0x77,0x96,0x53,0x57,0x7d,0x54,0x57,0x7c,0x50,0x53,0x78,0x50,0x4d,0x72,0x58, 0x4e,0x6c,0x54,0x52,0x70,0x42,0x3b,0x4b,0x45,0x3b,0x4b,0x4a,0x3e,0x4f,0x4a,0x40, 0x52,0x47,0x3d,0x4f,0x37,0x2f,0x3c,0x33,0x2b,0x37,0x51,0x46,0x56,0x58,0x59,0x73, 0x4d,0x47,0x62,0x4c,0x3f,0x58,0x4a,0x3f,0x58,0x4c,0x40,0x59,0x4a,0x3f,0x59,0x4b, 0x41,0x5b,0x4e,0x45,0x5f,0x58,0x4e,0x6b,0x5b,0x51,0x6f,0x5b,0x52,0x6f,0x5d,0x53, 0x6f,0x63,0x5a,0x77,0x5b,0x55,0x70,0x60,0x5a,0x74,0x45,0x41,0x50,0x4c,0x46,0x57, 0x4f,0x4a,0x5b,0x4e,0x49,0x5a,0x48,0x42,0x52,0x3f,0x39,0x48,0x32,0x2e,0x3c,0x28, 0x26,0x33,0x22,0x21,0x2d,0x1e,0x1e,0x26,0x7d,0x6e,0x9a,0x5b,0x51,0x70,0x45,0x3e, 0x54,0x5b,0x52,0x72,0x5e,0x52,0x75,0x5d,0x53,0x77,0x5c,0x53,0x77,0x5d,0x53,0x78, 0x5c,0x53,0x78,0x5a,0x53,0x78,0x58,0x51,0x78,0x55,0x50,0x79,0x3f,0x3b,0x59,0x59, 0x55,0x7f,0x59,0x55,0x7d,0x11,0x11,0x13,0x15,0x14,0x19,0x16,0x16,0x1a,0x14,0x14, 0x18,0x13,0x13,0x18,0x12,0x13,0x18,0x15,0x17,0x1d,0x4d,0x43,0x52,0x36,0x2f,0x3a, 0x33,0x2d,0x38,0x34,0x30,0x3d,0x64,0x64,0x93,0x51,0x52,0x77,0x50,0x52,0x75,0x3f, 0x3f,0x5b,0x35,0x35,0x4d,0x35,0x36,0x4d,0x33,0x34,0x47,0x31,0x2f,0x3b,0x56,0x4d, 0x60,0x76,0x79,0x8e,0x70,0x7a,0x94,0x50,0x59,0x79,0x23,0x27,0x34,0x23,0x22,0x2e, 0x1a,0x1d,0x26,0x2b,0x2f,0x3f,0x46,0x48,0x65,0x21,0x23,0x2d,0x19,0x1b,0x22,0x21, 0x22,0x2a,0x50,0x48,0x5a,0x42,0x39,0x48,0x50,0x4e,0x6f,0x55,0x50,0x72,0x39,0x36, 0x4b,0x15,0x17,0x1e,0x16,0x17,0x1e,0x16,0x19,0x20,0x15,0x17,0x1e,0x16,0x18,0x1f, 0x16,0x19,0x20,0x16,0x18,0x1f,0x16,0x18,0x1f,0x16,0x17,0x1e,0x18,0x18,0x1f,0x2e, 0x27,0x32,0x32,0x2c,0x38,0x41,0x41,0x5f,0x4a,0x41,0x5b,0x42,0x39,0x4e,0x3b,0x31, 0x46,0x3a,0x31,0x45,0x4e,0x41,0x59,0x50,0x48,0x63,0x50,0x49,0x66,0x50,0x4a,0x68, 0x53,0x50,0x6e,0x53,0x4f,0x6d,0x56,0x55,0x74,0x60,0x62,0x80,0x67,0x69,0x85,0x82, 0x83,0x9b,0x9a,0x9a,0xad,0xa7,0xa8,0xb7,0xb4,0xb6,0xc5,0xaa,0xae,0xbf,0x9d,0xa1, 0xac,0x9f,0xa2,0xad,0x9a,0x9e,0xaa,0x8a,0x8f,0x9e,0x81,0x86,0x96,0x81,0x86,0x96, 0x83,0x88,0x96,0x82,0x87,0x94,0x81,0x86,0x93,0x81,0x86,0x94,0x81,0x86,0x94,0x72, 0x78,0x8a,0x5c,0x63,0x76,0x49,0x50,0x64,0x3e,0x43,0x58,0x41,0x46,0x5d,0x43,0x48, 0x60,0x46,0x4c,0x64,0x4c,0x53,0x6a,0x45,0x4b,0x62,0x40,0x40,0x57,0x3a,0x3a,0x4e, 0x34,0x33,0x46,0x30,0x30,0x40,0x43,0x44,0x50,0x40,0x43,0x4d,0x4a,0x4c,0x55,0x1f, 0x22,0x2c,0x1f,0x22,0x2c,0x1e,0x20,0x2a,0x1b,0x1e,0x27,0x1a,0x1c,0x24,0x18,0x1a, 0x22,0x16,0x18,0x1f,0x14,0x16,0x1d,0x12,0x14,0x1a,0x11,0x12,0x18,0x0f,0x11,0x16, 0x0f,0x11,0x16,0x0e,0x0f,0x14,0x0c,0x0d,0x12,0x0a,0x0b,0x0f,0x0a,0x0a,0x0e,0x0a, 0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x08,0x09,0x0b,0x07,0x08, 0x0a,0x07,0x08,0x0a,0x79,0x81,0x9f,0x51,0x5c,0x84,0x59,0x51,0x77,0x5d,0x51,0x74, 0x5d,0x51,0x74,0x5d,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e, 0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52, 0x75,0x61,0x54,0x79,0x74,0x65,0x91,0x0a,0x0a,0x0e,0x03,0x03,0x04,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x10,0x12,0x1a,0x5c,0x67,0x90,0x52,0x4f,0x7a,0x57,0x50,0x79,0x55, 0x50,0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x5d,0x52,0x79,0x64,0x52, 0x71,0x64,0x53,0x74,0x56,0x63,0x8b,0xa6,0xae,0xc4,0xaa,0xb1,0xc5,0x72,0x7c,0x9f, 0x69,0x73,0x97,0x25,0x25,0x32,0x00,0x00,0x00,0x43,0x35,0x42,0x80,0x75,0x80,0xd0, 0xcf,0xd6,0xd1,0xd5,0xe0,0xc0,0xc6,0xd5,0xaa,0xb2,0xc7,0x77,0x83,0xa4,0x80,0x8a, 0xaa,0x90,0x9a,0xb5,0x9d,0xa5,0xbe,0x96,0xa0,0xb9,0x90,0x99,0xb4,0x8d,0x96,0xb3, 0x89,0x93,0xb1,0x86,0x91,0xaf,0x84,0x8e,0xac,0x85,0x90,0xad,0x81,0x8c,0xab,0x7d, 0x89,0xa8,0x7d,0x88,0xa8,0x7a,0x85,0xa5,0x76,0x82,0xa3,0x74,0x80,0xa2,0x81,0x8b, 0xaa,0xad,0xb5,0xc9,0xad,0xb5,0xc9,0x65,0x72,0x96,0x60,0x53,0x77,0x5d,0x52,0x79, 0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x63, 0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x74,0x64,0x52,0x73,0x64,0x53, 0x74,0x64,0x52,0x72,0x64,0x4d,0x6a,0x64,0x52,0x72,0x52,0x50,0x7b,0x52,0x53,0x7d, 0x55,0x50,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x52,0x4f,0x7a,0x64,0x53, 0x75,0x57,0x40,0x5a,0x52,0x4f,0x7a,0x8d,0x8a,0x92,0x3b,0x2c,0x36,0x5b,0x48,0x59, 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,0x9a,0xa2,0xb4,0x64,0x53, 0x76,0x62,0x4a,0x66,0x5b,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x57,0x50,0x79, 0x55,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x50,0x7b,0x52,0x53,0x7d,0x52,0x55,0x81,0x53,0x5e,0x88,0x52,0x5d,0x86,0x58,0x4b, 0x6b,0x2d,0x2d,0x45,0x44,0x45,0x47,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff, 0xfa,0xfa,0xfa,0x1a,0x1b,0x24,0x48,0x43,0x59,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,0x93,0x97,0xa3,0x56,0x63,0x8b,0x64,0x53,0x73,0x62,0x53, 0x77,0x52,0x50,0x7c,0x52,0x53,0x7d,0x62,0x64,0x8b,0xa7,0xaa,0xbe,0x5e,0x67,0x8e, 0x55,0x60,0x8a,0x59,0x64,0x8c,0x5d,0x67,0x8f,0x6b,0x74,0x98,0x57,0x61,0x8a,0x53, 0x5e,0x88,0x52,0x5d,0x88,0x52,0x53,0x7e,0x64,0x4d,0x6b,0x52,0x56,0x81,0x4d,0x51, 0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0d,0x0d,0x22,0x22,0x22,0x02,0x02,0x02,0x00, 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x08,0x09,0x09,0x19,0x19,0x19, 0x28,0x29,0x2a,0x24,0x24,0x25,0x09,0x0a,0x0a,0x05,0x06,0x06,0x06,0x06,0x07,0x12, 0x13,0x14,0x2e,0x2f,0x2f,0x1a,0x1b,0x1c,0x08,0x09,0x0a,0x08,0x09,0x0a,0x23,0x23, 0x24,0x10,0x10,0x12,0x0a,0x0a,0x0d,0x0b,0x0c,0x0f,0x17,0x18,0x1a,0x1b,0x1c,0x1e, 0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x35,0x2b,0x34,0x6f, 0x79,0x99,0x53,0x5c,0x83,0x53,0x57,0x7f,0x53,0x57,0x80,0x53,0x57,0x7f,0x53,0x59, 0x80,0x67,0x6d,0x8e,0x77,0x7a,0x98,0x54,0x58,0x7e,0x53,0x56,0x7c,0x50,0x52,0x77, 0x50,0x4e,0x73,0x5d,0x52,0x70,0x56,0x57,0x76,0x43,0x3b,0x4c,0x45,0x3b,0x4a,0x49, 0x3e,0x4e,0x4c,0x41,0x52,0x4a,0x40,0x52,0x41,0x38,0x47,0x38,0x30,0x3c,0x4e,0x43, 0x53,0x59,0x5a,0x74,0x4b,0x44,0x60,0x48,0x3d,0x54,0x46,0x3a,0x51,0x4b,0x3e,0x57, 0x52,0x45,0x61,0x57,0x4b,0x6a,0x56,0x4a,0x6a,0x56,0x4b,0x6b,0x56,0x4c,0x6b,0x55, 0x4c,0x6a,0x54,0x4a,0x69,0x56,0x4d,0x6c,0x51,0x4d,0x65,0x56,0x50,0x6a,0x3a,0x39, 0x46,0x42,0x40,0x4e,0x48,0x44,0x54,0x4a,0x43,0x55,0x48,0x41,0x52,0x41,0x3b,0x4b, 0x30,0x2e,0x3c,0x25,0x26,0x30,0x22,0x22,0x2a,0x20,0x20,0x26,0x7a,0x6e,0x96,0x5e, 0x53,0x73,0x47,0x3f,0x56,0x59,0x52,0x6f,0x5e,0x53,0x75,0x5c,0x53,0x77,0x5c,0x53, 0x78,0x5d,0x53,0x77,0x5e,0x54,0x78,0x5b,0x53,0x78,0x5a,0x53,0x78,0x57,0x50,0x79, 0x43,0x3c,0x5a,0x5a,0x54,0x7d,0x61,0x59,0x84,0x1b,0x18,0x1d,0x1f,0x1c,0x22,0x20, 0x1d,0x23,0x20,0x1e,0x25,0x1e,0x1d,0x24,0x1a,0x19,0x20,0x15,0x17,0x1d,0x32,0x31, 0x3e,0x42,0x39,0x45,0x37,0x31,0x3d,0x33,0x2d,0x37,0x58,0x57,0x7c,0x55,0x56,0x7c, 0x50,0x51,0x75,0x50,0x51,0x74,0x38,0x38,0x50,0x35,0x34,0x4d,0x35,0x36,0x4e,0x1e, 0x21,0x29,0x53,0x4a,0x5c,0x56,0x4d,0x5e,0x87,0x8e,0xa3,0x59,0x62,0x83,0x4d,0x54, 0x72,0x1b,0x1d,0x27,0x1a,0x1c,0x23,0x1a,0x1d,0x23,0x46,0x4c,0x69,0x45,0x48,0x66, 0x28,0x28,0x31,0x59,0x4d,0x62,0x58,0x4c,0x62,0x7e,0x82,0x98,0x6e,0x77,0x94,0x4e, 0x57,0x7b,0x30,0x31,0x45,0x15,0x16,0x1e,0x15,0x17,0x1e,0x16,0x18,0x1e,0x15,0x17, 0x1e,0x16,0x18,0x1e,0x16,0x17,0x1e,0x16,0x17,0x1e,0x16,0x18,0x1e,0x15,0x17,0x1e, 0x16,0x17,0x1e,0x1f,0x1e,0x26,0x30,0x29,0x32,0x35,0x31,0x3f,0x45,0x42,0x60,0x4d, 0x42,0x5d,0x4a,0x40,0x59,0x46,0x3b,0x52,0x44,0x38,0x4e,0x52,0x44,0x5c,0x5c,0x4d, 0x67,0x56,0x49,0x60,0x54,0x45,0x5c,0x5f,0x51,0x6a,0x5d,0x52,0x6f,0x56,0x51,0x70, 0x59,0x5a,0x78,0x6c,0x6d,0x88,0x8d,0x8d,0xa1,0x94,0x95,0xa6,0xa2,0xa4,0xb7,0xa0, 0xa4,0xb6,0x95,0x99,0xa6,0x97,0x9b,0xa8,0x93,0x98,0xa6,0x8f,0x94,0xa2,0x82,0x87, 0x97,0x7f,0x86,0x96,0x84,0x8a,0x99,0x89,0x8d,0x9a,0x8f,0x93,0x9f,0x91,0x95,0xa2, 0x8a,0x8f,0x9d,0x7c,0x82,0x92,0x6f,0x75,0x86,0x59,0x60,0x72,0x49,0x50,0x63,0x40, 0x46,0x5b,0x3f,0x46,0x5b,0x44,0x48,0x60,0x46,0x4b,0x64,0x4a,0x52,0x6a,0x49,0x50, 0x68,0x46,0x4d,0x65,0x3e,0x42,0x58,0x37,0x37,0x4b,0x33,0x37,0x47,0x35,0x38,0x46, 0x25,0x29,0x34,0x2b,0x2f,0x3a,0x2e,0x32,0x3c,0x29,0x2c,0x36,0x1e,0x22,0x2b,0x1a, 0x1c,0x25,0x18,0x1a,0x22,0x16,0x18,0x20,0x14,0x16,0x1d,0x13,0x15,0x1b,0x12,0x13, 0x1a,0x10,0x12,0x17,0x0f,0x11,0x16,0x0e,0x0e,0x14,0x0c,0x0d,0x12,0x0c,0x0d,0x11, 0x0a,0x0b,0x0f,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09, 0x0a,0x0d,0x09,0x09,0x0c,0x07,0x08,0x0a,0x67,0x6f,0x87,0x58,0x61,0x87,0x55,0x4f, 0x76,0x5d,0x52,0x75,0x5d,0x52,0x75,0x5d,0x52,0x75,0x5d,0x52,0x75,0x5d,0x51,0x74, 0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e, 0x52,0x75,0x5e,0x52,0x75,0x60,0x55,0x78,0x73,0x63,0x8d,0x1d,0x19,0x24,0x03,0x03, 0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,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,0x1f,0x22,0x30,0x57,0x63,0x8c,0x54,0x50,0x79, 0x57,0x50,0x79,0x56,0x50,0x79,0x55,0x50,0x79,0x60,0x53,0x77,0x64,0x4d,0x6b,0x64, 0x4e,0x6c,0x52,0x53,0x7e,0x8b,0x95,0xb2,0xc4,0xca,0xd8,0x87,0x90,0xad,0x89,0x93, 0xb0,0x74,0x7e,0xa0,0x55,0x43,0x53,0x18,0x13,0x17,0x00,0x00,0x00,0x00,0x00,0x00, 0x23,0x1b,0x22,0x4c,0x3b,0x49,0x8b,0x82,0x8b,0xc9,0xca,0xd3,0xc3,0xc9,0xd8,0xb5, 0xbc,0xcf,0xa4,0xac,0xc2,0x7b,0x85,0xa7,0x6f,0x7c,0x9f,0x84,0x8e,0xac,0x93,0x9c, 0xb8,0x92,0x9b,0xb7,0x88,0x92,0xb0,0x85,0x90,0xad,0x83,0x8e,0xac,0x81,0x8b,0xaa, 0x7e,0x89,0xa9,0x7d,0x88,0xa8,0x7a,0x85,0xa7,0x77,0x82,0xa4,0x73,0x7e,0xa1,0x6f, 0x7b,0x9f,0x90,0x99,0xb4,0xb8,0xbf,0xd0,0xad,0xb5,0xc9,0x56,0x63,0x8b,0x60,0x53, 0x77,0x60,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76, 0x64,0x53,0x76,0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x75,0x64, 0x53,0x73,0x64,0x53,0x73,0x64,0x52,0x72,0x64,0x4d,0x6a,0x63,0x4b,0x67,0x55,0x50, 0x79,0x52,0x55,0x81,0x52,0x50,0x7b,0x5d,0x52,0x79,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5a,0x52,0x79,0x53, 0x4f,0x7a,0x55,0x3d,0x56,0x64,0x53,0x73,0x7d,0x86,0xa3,0x42,0x35,0x3d,0x49,0x38, 0x45,0x23,0x1d,0x24,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,0x83, 0x87,0x8f,0x52,0x5b,0x85,0x5e,0x46,0x62,0x5c,0x52,0x79,0x5a,0x52,0x79,0x57,0x50, 0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x55,0x81,0x52,0x5d,0x88,0x51, 0x5d,0x86,0x4c,0x3f,0x5a,0x1e,0x1b,0x29,0xd5,0xd5,0xd5,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xbf,0xbf,0xc0,0x29,0x28,0x37,0x5b,0x54,0x6f,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,0x4c,0x4c,0x4e,0x73,0x7e,0xa1,0x64, 0x53,0x76,0x64,0x53,0x74,0x52,0x4f,0x7a,0x56,0x56,0x7f,0x95,0x96,0xae,0x9f,0xa2, 0xb8,0x58,0x61,0x89,0x55,0x60,0x8a,0x54,0x5f,0x8a,0x52,0x5d,0x88,0x53,0x5e,0x88, 0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x5a,0x52,0x79,0x64, 0x4f,0x6e,0x69,0x74,0x92,0x0a,0x0a,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x12,0x2d,0x2d,0x2d,0x0b,0x0b,0x0b, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03, 0x03,0x03,0x03,0x04,0x03,0x04,0x05,0x1c,0x1c,0x1d,0x24,0x24,0x25,0x05,0x06,0x06, 0x05,0x06,0x06,0x12,0x12,0x13,0x26,0x27,0x28,0x27,0x27,0x29,0x19,0x19,0x1b,0x08, 0x09,0x0a,0x20,0x21,0x22,0x38,0x38,0x3a,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0b, 0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e, 0x32,0x29,0x31,0x69,0x73,0x92,0x53,0x5d,0x82,0x53,0x57,0x7e,0x52,0x58,0x7f,0x52, 0x58,0x7f,0x52,0x56,0x7e,0x64,0x67,0x8b,0x79,0x7b,0x9a,0x54,0x56,0x7c,0x53,0x57, 0x7c,0x50,0x53,0x7a,0x50,0x4d,0x73,0x5c,0x51,0x70,0x57,0x57,0x79,0x43,0x3b,0x4c, 0x42,0x39,0x49,0x46,0x3c,0x4c,0x49,0x3e,0x4f,0x47,0x3d,0x4c,0x40,0x36,0x44,0x3a, 0x31,0x3e,0x4e,0x41,0x50,0x5a,0x5c,0x75,0x4a,0x45,0x60,0x4f,0x43,0x5d,0x51,0x44, 0x5e,0x53,0x46,0x62,0x55,0x49,0x68,0x55,0x49,0x69,0x56,0x4b,0x6b,0x56,0x4b,0x6b, 0x56,0x4c,0x6c,0x56,0x4a,0x69,0x55,0x4c,0x69,0x55,0x4c,0x69,0x4d,0x44,0x61,0x52, 0x49,0x64,0x31,0x2e,0x3b,0x3b,0x36,0x45,0x42,0x3c,0x4c,0x46,0x3f,0x50,0x46,0x40, 0x50,0x41,0x3b,0x4b,0x32,0x30,0x3e,0x26,0x26,0x30,0x24,0x24,0x2b,0x22,0x20,0x27, 0x76,0x6a,0x92,0x5e,0x55,0x75,0x49,0x40,0x5a,0x56,0x4d,0x6c,0x5e,0x52,0x75,0x5e, 0x53,0x75,0x5c,0x52,0x77,0x5d,0x53,0x77,0x5b,0x52,0x78,0x5e,0x54,0x78,0x5c,0x53, 0x78,0x58,0x52,0x79,0x41,0x3c,0x5a,0x59,0x52,0x7b,0x66,0x5d,0x87,0x1d,0x1a,0x20, 0x20,0x1c,0x23,0x22,0x1f,0x26,0x24,0x22,0x29,0x25,0x21,0x29,0x24,0x22,0x2a,0x21, 0x20,0x27,0x1f,0x1f,0x27,0x5a,0x4d,0x61,0x3f,0x36,0x42,0x38,0x32,0x3d,0x3c,0x37, 0x47,0x5f,0x5f,0x88,0x50,0x51,0x75,0x50,0x51,0x74,0x46,0x47,0x65,0x35,0x35,0x4d, 0x35,0x36,0x4e,0x35,0x38,0x4d,0x38,0x35,0x41,0x56,0x4d,0x5e,0x82,0x87,0x9c,0x70, 0x78,0x93,0x50,0x5a,0x7b,0x29,0x2c,0x3b,0x1a,0x1c,0x23,0x19,0x1b,0x22,0x22,0x25, 0x30,0x4e,0x57,0x7a,0x55,0x4c,0x61,0x59,0x4e,0x62,0xa8,0xaa,0xb7,0x96,0x9c,0xaf, 0x61,0x66,0x79,0x2d,0x30,0x3c,0x15,0x17,0x1e,0x14,0x16,0x1d,0x15,0x16,0x1e,0x15, 0x17,0x1e,0x15,0x17,0x1e,0x15,0x16,0x1e,0x15,0x16,0x1e,0x15,0x17,0x1e,0x15,0x16, 0x1d,0x14,0x16,0x1c,0x13,0x15,0x1b,0x16,0x16,0x1d,0x27,0x24,0x2c,0x34,0x2d,0x38, 0x47,0x46,0x66,0x52,0x48,0x62,0x50,0x45,0x5f,0x48,0x3d,0x52,0x3e,0x32,0x45,0x41, 0x35,0x48,0x44,0x37,0x4a,0x3b,0x2f,0x40,0x36,0x2b,0x3a,0x3e,0x31,0x41,0x61,0x50, 0x69,0x63,0x58,0x75,0x59,0x55,0x75,0x58,0x59,0x77,0x61,0x61,0x7c,0x72,0x73,0x89, 0x7e,0x84,0x9c,0x91,0x96,0xaa,0x93,0x97,0xa5,0x9a,0x9e,0xaa,0x97,0x9b,0xa7,0x8e, 0x93,0xa1,0x83,0x89,0x99,0x7c,0x82,0x94,0x81,0x87,0x97,0x87,0x8e,0x9d,0x93,0x97, 0xa5,0x98,0x9c,0xa8,0x92,0x97,0xa4,0x8e,0x92,0x9f,0x8a,0x8f,0x9d,0x77,0x7d,0x8d, 0x6a,0x70,0x82,0x5b,0x62,0x74,0x4d,0x54,0x68,0x46,0x4c,0x63,0x45,0x49,0x62,0x47, 0x4d,0x66,0x4a,0x51,0x6a,0x4c,0x54,0x6c,0x49,0x50,0x67,0x45,0x4b,0x62,0x42,0x48, 0x5c,0x39,0x3e,0x4f,0x31,0x36,0x43,0x3a,0x3e,0x4a,0x42,0x46,0x52,0x37,0x3b,0x46, 0x26,0x29,0x33,0x1b,0x1e,0x27,0x18,0x1a,0x22,0x17,0x19,0x21,0x15,0x16,0x1e,0x13, 0x16,0x1c,0x12,0x14,0x1a,0x11,0x12,0x18,0x10,0x12,0x17,0x0e,0x10,0x15,0x0d,0x0e, 0x12,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0b,0x0c,0x10,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e, 0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x09,0x09,0x0c,0x4a,0x4f,0x61,0x5b, 0x66,0x8c,0x51,0x4d,0x76,0x5c,0x51,0x74,0x5d,0x51,0x74,0x5d,0x51,0x74,0x5d,0x52, 0x75,0x5d,0x52,0x75,0x5d,0x51,0x75,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5f,0x53,0x77,0x70,0x61,0x8c,0x32, 0x2c,0x3f,0x03,0x04,0x05,0x03,0x04,0x05,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x2e,0x35,0x48,0x53,0x5e, 0x88,0x54,0x50,0x79,0x58,0x50,0x79,0x60,0x53,0x77,0x64,0x4c,0x69,0x60,0x48,0x64, 0x55,0x50,0x79,0x7d,0x88,0xa8,0xe1,0xe3,0xea,0x9c,0xa4,0xbc,0x91,0x9a,0xb6,0xb2, 0xb8,0xcc,0x6e,0x67,0x8a,0x44,0x34,0x40,0x39,0x2b,0x34,0x2f,0x24,0x2d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x2a,0x34,0x48,0x38,0x43, 0x82,0x7c,0x86,0xbe,0xc2,0xd0,0xbe,0xc3,0xd3,0xb5,0xbb,0xce,0x95,0x9f,0xb9,0x6d, 0x79,0x9c,0x65,0x72,0x96,0x77,0x83,0xa4,0x89,0x93,0xb0,0x86,0x91,0xaf,0x81,0x8b, 0xaa,0x80,0x8a,0xaa,0x7c,0x88,0xa8,0x79,0x84,0xa5,0x79,0x83,0xa4,0x74,0x80,0xa2, 0x72,0x7e,0xa1,0x77,0x83,0xa4,0xa9,0xb0,0xc6,0xc0,0xc6,0xd6,0xac,0xb4,0xc8,0x52, 0x52,0x7d,0x62,0x53,0x77,0x5d,0x52,0x79,0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53, 0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76, 0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x53,0x73,0x64,0x52,0x72,0x64,0x4f,0x6e,0x62, 0x4b,0x66,0x60,0x53,0x77,0x52,0x55,0x81,0x52,0x55,0x80,0x55,0x50,0x79,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x52,0x55,0x80,0x5d,0x45,0x60,0x5b,0x44,0x5e,0x56,0x62,0x8b,0x8c,0x86,0x8c,0x3e, 0x2f,0x39,0x52,0x41,0x50,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,0x51,0x52,0x54,0x60,0x6c,0x93,0x62,0x4a,0x65,0x64,0x53,0x76,0x5a, 0x52,0x79,0x58,0x50,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x56,0x50,0x79,0x55,0x50, 0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50,0x7c,0x52,0x53,0x7e, 0x52,0x5a,0x84,0x4c,0x56,0x7c,0x36,0x2f,0x43,0x3c,0x39,0x3e,0xfc,0xfc,0xfc,0xff, 0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0x1e,0x1e,0x24,0x43,0x3d,0x51,0x6b,0x60, 0x7d,0x02,0x02,0x02,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,0x03,0x03,0x03, 0x8e,0x95,0xa9,0x52,0x4f,0x7b,0x62,0x4a,0x66,0x68,0x60,0x83,0x8c,0x8c,0xa7,0x8a, 0x8a,0xa6,0x62,0x65,0x8d,0x53,0x5b,0x84,0x52,0x5b,0x85,0x53,0x5e,0x88,0x53,0x5e, 0x89,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5d,0x86, 0x52,0x57,0x82,0x62,0x4a,0x66,0x52,0x55,0x80,0x57,0x59,0x61,0x00,0x00,0x00,0x04, 0x04,0x04,0x29,0x29,0x29,0x08,0x08,0x08,0x00,0x00,0x00,0x21,0x21,0x21,0x09,0x09, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x06,0x47,0x47, 0x48,0x24,0x25,0x25,0x0d,0x0d,0x0e,0x0b,0x0b,0x0c,0x27,0x27,0x28,0x15,0x16,0x18, 0x27,0x27,0x29,0x08,0x08,0x0a,0x1b,0x1c,0x1d,0x0c,0x0c,0x0d,0x0a,0x0a,0x0c,0x0a, 0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0b,0x0c, 0x0e,0x0b,0x0c,0x0e,0x2f,0x27,0x2f,0x68,0x71,0x91,0x52,0x5c,0x84,0x52,0x57,0x7e, 0x53,0x57,0x7e,0x52,0x55,0x7c,0x52,0x55,0x7d,0x66,0x68,0x8c,0x78,0x79,0x97,0x54, 0x57,0x7e,0x54,0x57,0x7c,0x51,0x53,0x78,0x50,0x4f,0x73,0x59,0x4f,0x6f,0x54,0x57, 0x79,0x3d,0x37,0x48,0x3b,0x34,0x43,0x42,0x3a,0x49,0x45,0x3b,0x4a,0x42,0x39,0x49, 0x3c,0x34,0x42,0x36,0x2f,0x3b,0x47,0x3b,0x49,0x59,0x5a,0x74,0x47,0x44,0x62,0x4a, 0x41,0x5b,0x52,0x48,0x66,0x54,0x49,0x66,0x54,0x49,0x68,0x56,0x4b,0x6b,0x57,0x4d, 0x6d,0x59,0x4d,0x6e,0x5a,0x4e,0x6e,0x5a,0x4d,0x6e,0x59,0x4e,0x6e,0x57,0x4e,0x6d, 0x50,0x47,0x65,0x56,0x4d,0x68,0x3a,0x33,0x42,0x3e,0x36,0x46,0x42,0x3a,0x4a,0x42, 0x3a,0x4a,0x42,0x3a,0x4a,0x3b,0x35,0x45,0x2e,0x2c,0x3a,0x26,0x26,0x31,0x25,0x24, 0x2d,0x22,0x22,0x28,0x71,0x65,0x8a,0x61,0x56,0x77,0x4a,0x41,0x5a,0x54,0x4c,0x69, 0x5e,0x53,0x75,0x5e,0x52,0x75,0x5d,0x52,0x77,0x5c,0x53,0x77,0x5d,0x53,0x78,0x5e, 0x54,0x78,0x5b,0x53,0x78,0x59,0x52,0x79,0x46,0x41,0x5e,0x5d,0x54,0x7c,0x68,0x5e, 0x8a,0x21,0x1e,0x25,0x25,0x21,0x29,0x2b,0x26,0x30,0x2f,0x29,0x33,0x30,0x2b,0x35, 0x30,0x2b,0x36,0x2e,0x29,0x34,0x2a,0x27,0x31,0x3a,0x39,0x48,0x4e,0x44,0x53,0x3d, 0x37,0x43,0x34,0x2f,0x39,0x62,0x5f,0x86,0x53,0x54,0x78,0x51,0x51,0x74,0x50,0x51, 0x75,0x3a,0x3a,0x52,0x34,0x34,0x4d,0x35,0x35,0x4e,0x24,0x26,0x31,0x55,0x4b,0x5d, 0x56,0x4c,0x5e,0x90,0x97,0xab,0x55,0x60,0x80,0x50,0x58,0x78,0x1a,0x1c,0x24,0x19, 0x1b,0x22,0x18,0x1a,0x21,0x48,0x50,0x6f,0x57,0x5a,0x77,0xbd,0xbc,0xc6,0xbc,0xbf, 0xc7,0x73,0x77,0x83,0x15,0x16,0x1e,0x15,0x16,0x1d,0x15,0x16,0x1e,0x15,0x16,0x1e, 0x15,0x16,0x1e,0x14,0x16,0x1d,0x16,0x17,0x1e,0x15,0x16,0x1e,0x14,0x16,0x1d,0x15, 0x17,0x1e,0x13,0x15,0x1b,0x13,0x15,0x1b,0x13,0x15,0x1a,0x12,0x13,0x19,0x13,0x14, 0x1a,0x39,0x34,0x41,0x47,0x4d,0x6f,0x4e,0x45,0x63,0x52,0x46,0x61,0x52,0x45,0x5d, 0x46,0x3b,0x4f,0x4a,0x3d,0x51,0x4f,0x44,0x55,0x4e,0x43,0x52,0x49,0x3f,0x4c,0x3d, 0x32,0x40,0x3c,0x30,0x3f,0x5a,0x4a,0x61,0x64,0x55,0x6f,0x60,0x53,0x6d,0x5a,0x4e, 0x68,0x4d,0x4b,0x67,0x61,0x66,0x83,0x71,0x78,0x90,0x86,0x8a,0x99,0x92,0x97,0xa4, 0x92,0x96,0xa4,0x8a,0x8f,0x9d,0x82,0x88,0x98,0x7b,0x82,0x94,0x82,0x88,0x9a,0x89, 0x8e,0x9e,0x8e,0x93,0xa2,0x93,0x97,0xa5,0x97,0x9b,0xa7,0x9b,0x9f,0xaa,0x9c,0x9f, 0xaa,0x90,0x95,0xa2,0x84,0x8a,0x99,0x7c,0x82,0x92,0x6c,0x72,0x86,0x5d,0x64,0x79, 0x4e,0x55,0x6e,0x48,0x4d,0x66,0x48,0x4d,0x66,0x4a,0x51,0x6a,0x4c,0x54,0x6c,0x4d, 0x54,0x6b,0x52,0x59,0x6e,0x53,0x5a,0x6c,0x49,0x4e,0x5f,0x47,0x4c,0x5b,0x4a,0x4f, 0x5c,0x3d,0x41,0x4c,0x28,0x2b,0x36,0x1e,0x22,0x2c,0x1d,0x20,0x2a,0x1a,0x1d,0x26, 0x16,0x19,0x21,0x15,0x16,0x1e,0x13,0x15,0x1b,0x12,0x13,0x19,0x10,0x11,0x16,0x0f, 0x10,0x16,0x0e,0x0e,0x14,0x0e,0x0e,0x13,0x0c,0x0d,0x12,0x0c,0x0d,0x11,0x0b,0x0c, 0x10,0x0b,0x0c,0x10,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d, 0x2e,0x31,0x3c,0x62,0x6d,0x90,0x50,0x4e,0x76,0x5c,0x51,0x74,0x5c,0x51,0x74,0x5c, 0x51,0x74,0x5c,0x51,0x74,0x5d,0x51,0x74,0x5d,0x52,0x75,0x5d,0x52,0x75,0x5d,0x52, 0x75,0x5d,0x51,0x75,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x52,0x75, 0x6b,0x5c,0x86,0x4c,0x41,0x5f,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x02, 0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x41, 0x48,0x62,0x52,0x58,0x83,0x58,0x50,0x79,0x64,0x53,0x75,0x5f,0x47,0x64,0x64,0x52, 0x73,0x58,0x65,0x8d,0xc2,0xc7,0xd6,0xbf,0xc4,0xd4,0x87,0x91,0xaf,0xb9,0xc0,0xd1, 0xae,0xb5,0xc9,0x4f,0x3e,0x4c,0x39,0x2b,0x34,0x3e,0x2f,0x39,0x46,0x36,0x42,0x46, 0x36,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1e,0x17,0x1c,0x45,0x35,0x41,0x45,0x37,0x43,0x88,0x85,0x8f,0xc1,0xc4,0xd3, 0xbb,0xc1,0xd2,0xad,0xb4,0xc9,0x8c,0x96,0xb3,0x66,0x73,0x98,0x62,0x6d,0x94,0x74, 0x80,0xa2,0x82,0x8c,0xab,0x7e,0x89,0xa9,0x7c,0x88,0xa8,0x77,0x83,0xa4,0x74,0x80, 0xa2,0x72,0x7d,0xa0,0x6f,0x7b,0x9f,0x83,0x8d,0xac,0xb9,0xbf,0xd0,0xc3,0xc8,0xd7, 0x93,0x9c,0xb8,0x5b,0x52,0x79,0x5e,0x53,0x79,0x5d,0x52,0x79,0x64,0x53,0x76,0x64, 0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53, 0x76,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x52,0x72,0x64,0x50,0x71, 0x64,0x52,0x73,0x62,0x4b,0x66,0x64,0x52,0x72,0x52,0x57,0x82,0x54,0x5f,0x89,0x52, 0x50,0x7b,0x5d,0x52,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x52,0x50,0x7c,0x64,0x53,0x74,0x5a,0x41,0x5b,0x5e,0x53,0x79,0xa4,0xa9,0xbb, 0x45,0x37,0x40,0x4d,0x3c,0x4a,0x0d,0x0a,0x0d,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,0x0c,0x0c,0x0c,0x79,0x83,0xa2,0x64,0x52,0x73, 0x62,0x4a,0x66,0x5a,0x52,0x79,0x5a,0x52,0x79,0x58,0x50,0x79,0x57,0x50,0x79,0x57, 0x50,0x79,0x56,0x50,0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x50, 0x7b,0x52,0x53,0x7d,0x50,0x58,0x80,0x40,0x48,0x68,0x21,0x1d,0x2b,0xcc,0xcc,0xcc, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xde,0xde,0xde,0x22,0x22,0x2e,0x5b, 0x50,0x67,0x76,0x67,0x84,0x04,0x04,0x05,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,0x0c,0x0c,0x0c,0x63,0x65,0x6b,0x6b,0x75,0x9a,0x7f,0x6c,0x83,0x9f,0x95,0xa9, 0x89,0x87,0xa4,0x56,0x57,0x80,0x52,0x55,0x81,0x52,0x5a,0x84,0x52,0x5c,0x86,0x52, 0x5c,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e, 0x88,0x52,0x5d,0x88,0x52,0x5b,0x85,0x5c,0x52,0x79,0x64,0x4d,0x6b,0x70,0x7b,0x99, 0x14,0x15,0x15,0x2f,0x2f,0x2f,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x25,0x25,0x25,0x25, 0x25,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x04,0x05,0x05,0x04, 0x04,0x05,0x05,0x06,0x06,0x16,0x16,0x17,0x2c,0x2c,0x2d,0x24,0x24,0x24,0x25,0x25, 0x25,0x0a,0x0b,0x0c,0x32,0x33,0x34,0x23,0x23,0x24,0x2f,0x2f,0x31,0x13,0x14,0x15, 0x0a,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0b, 0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x2b,0x25,0x2c,0x65,0x6f,0x8e,0x52,0x5b, 0x82,0x52,0x58,0x80,0x52,0x55,0x7e,0x52,0x54,0x7b,0x52,0x54,0x7c,0x6a,0x6e,0x8f, 0x73,0x75,0x95,0x53,0x55,0x7c,0x54,0x56,0x7c,0x53,0x55,0x79,0x50,0x51,0x75,0x58, 0x51,0x6f,0x4e,0x54,0x76,0x34,0x32,0x42,0x34,0x30,0x40,0x3d,0x35,0x45,0x3f,0x37, 0x46,0x3c,0x34,0x43,0x36,0x2f,0x3d,0x31,0x2b,0x37,0x46,0x39,0x49,0x5a,0x5c,0x75, 0x46,0x44,0x63,0x44,0x3d,0x58,0x50,0x47,0x66,0x53,0x48,0x67,0x55,0x4a,0x69,0x58, 0x4d,0x6d,0x5a,0x4f,0x70,0x5b,0x50,0x71,0x5d,0x51,0x72,0x5c,0x51,0x72,0x5c,0x51, 0x72,0x5b,0x51,0x71,0x51,0x48,0x67,0x59,0x4e,0x6b,0x43,0x3a,0x4a,0x43,0x3a,0x49, 0x45,0x3c,0x4c,0x54,0x4b,0x5a,0x49,0x40,0x4f,0x3e,0x36,0x46,0x32,0x2e,0x3c,0x29, 0x27,0x34,0x24,0x25,0x2f,0x22,0x23,0x2b,0x69,0x5e,0x81,0x62,0x57,0x78,0x4d,0x45, 0x5e,0x53,0x4a,0x66,0x5e,0x53,0x75,0x5c,0x52,0x77,0x5f,0x53,0x75,0x5c,0x53,0x78, 0x5d,0x53,0x78,0x5d,0x53,0x78,0x5c,0x52,0x78,0x5e,0x53,0x78,0x4b,0x44,0x62,0x5d, 0x55,0x7a,0x70,0x65,0x8e,0x2b,0x26,0x2f,0x2e,0x28,0x32,0x34,0x2d,0x39,0x3c,0x33, 0x42,0x3f,0x35,0x44,0x3f,0x36,0x44,0x3e,0x36,0x43,0x3b,0x35,0x41,0x37,0x33,0x3e, 0x65,0x58,0x6d,0x4a,0x40,0x4e,0x3d,0x37,0x43,0x46,0x41,0x55,0x58,0x58,0x7f,0x53, 0x52,0x74,0x53,0x52,0x74,0x51,0x51,0x75,0x38,0x38,0x50,0x35,0x35,0x4d,0x39,0x3a, 0x51,0x34,0x31,0x3d,0x56,0x4d,0x5e,0x82,0x85,0x99,0x6c,0x76,0x92,0x53,0x5e,0x80, 0x25,0x28,0x35,0x19,0x1a,0x22,0x17,0x19,0x1f,0x16,0x19,0x1f,0x5c,0x66,0x84,0xbc, 0xbe,0xc5,0x15,0x17,0x1e,0x16,0x17,0x1e,0x15,0x16,0x1d,0x15,0x16,0x1e,0x15,0x17, 0x1e,0x14,0x16,0x1d,0x14,0x16,0x1d,0x14,0x16,0x1d,0x15,0x16,0x1e,0x14,0x16,0x1d, 0x14,0x16,0x1d,0x14,0x16,0x1d,0x12,0x14,0x1a,0x12,0x14,0x1a,0x12,0x13,0x19,0x10, 0x12,0x17,0x10,0x11,0x16,0x2e,0x31,0x3d,0x4b,0x52,0x72,0x50,0x46,0x64,0x53,0x47, 0x62,0x59,0x4c,0x65,0x52,0x46,0x59,0x53,0x48,0x59,0x67,0x5d,0x6d,0x7e,0x75,0x81, 0x86,0x7e,0x8a,0x66,0x5d,0x69,0x3e,0x33,0x40,0x40,0x33,0x44,0x58,0x48,0x5d,0x5d, 0x4d,0x65,0x5c,0x4c,0x64,0x53,0x47,0x5e,0x4b,0x4a,0x68,0x4d,0x54,0x70,0x64,0x6a, 0x7e,0x7f,0x86,0x96,0x81,0x87,0x97,0x80,0x86,0x96,0x7d,0x83,0x94,0x81,0x87,0x97, 0x82,0x88,0x9a,0x84,0x8a,0x9a,0x86,0x8c,0x9d,0x8a,0x90,0x9f,0x94,0x98,0xa6,0x9d, 0xa1,0xac,0x9e,0xa2,0xac,0x98,0x9c,0xa7,0x92,0x97,0xa4,0x8e,0x93,0xa1,0x83,0x89, 0x98,0x7a,0x7f,0x92,0x69,0x71,0x86,0x57,0x5f,0x77,0x4e,0x55,0x6f,0x4d,0x55,0x6f, 0x4e,0x56,0x70,0x51,0x58,0x71,0x54,0x5c,0x73,0x5b,0x62,0x77,0x5a,0x60,0x73,0x56, 0x5b,0x6d,0x52,0x56,0x66,0x41,0x46,0x52,0x2e,0x32,0x3d,0x29,0x2d,0x38,0x2e,0x31, 0x3b,0x25,0x28,0x32,0x1a,0x1d,0x26,0x16,0x18,0x1f,0x13,0x15,0x1c,0x11,0x12,0x19, 0x11,0x12,0x18,0x10,0x11,0x16,0x0f,0x10,0x16,0x0e,0x0e,0x14,0x0d,0x0e,0x12,0x0c, 0x0d,0x12,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x0a,0x0a, 0x0e,0x0a,0x0a,0x0e,0x19,0x1a,0x20,0x64,0x6e,0x91,0x50,0x4d,0x77,0x5c,0x51,0x74, 0x5c,0x51,0x74,0x5c,0x51,0x74,0x5d,0x52,0x75,0x5c,0x51,0x75,0x5c,0x51,0x75,0x5d, 0x51,0x75,0x5d,0x52,0x75,0x5d,0x52,0x75,0x5d,0x52,0x75,0x5d,0x51,0x75,0x5e,0x51, 0x75,0x5e,0x52,0x75,0x67,0x58,0x81,0x62,0x54,0x79,0x05,0x05,0x06,0x04,0x04,0x06, 0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,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,0x51,0x5a,0x79,0x52,0x50,0x7b,0x64,0x4f,0x6e,0x64,0x4c,0x69,0x52, 0x4f,0x7a,0x84,0x8e,0xad,0xe0,0xe2,0xeb,0x95,0x9e,0xb8,0x90,0x99,0xb5,0xcd,0xd2, 0xde,0x6c,0x76,0x9a,0x3c,0x2d,0x37,0x36,0x28,0x30,0x42,0x33,0x3e,0x43,0x33,0x3f, 0x43,0x33,0x3f,0x47,0x37,0x43,0x32,0x28,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x06,0x34,0x28,0x31,0x3f,0x30, 0x3a,0x47,0x3a,0x43,0x8f,0x8c,0x96,0xc4,0xc8,0xd7,0xb7,0xbe,0xcf,0xa0,0xa9,0xc0, 0x88,0x92,0xaf,0x6c,0x77,0x9c,0x5d,0x6a,0x91,0x6f,0x7c,0x9f,0x7c,0x86,0xa7,0x75, 0x81,0xa3,0x75,0x81,0xa2,0x71,0x7c,0xa0,0x6d,0x79,0x9d,0x93,0x9c,0xb8,0xc7,0xcb, 0xd9,0xc9,0xcf,0xdb,0x76,0x82,0xa3,0x5f,0x53,0x79,0x5c,0x52,0x79,0x5f,0x53,0x77, 0x62,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x63,0x53,0x77,0x63,0x53,0x77,0x64, 0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x52, 0x73,0x64,0x52,0x72,0x64,0x52,0x72,0x64,0x4f,0x6e,0x63,0x4c,0x69,0x52,0x4f,0x7a, 0x56,0x62,0x8b,0x52,0x5c,0x86,0x54,0x50,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x50,0x38,0x50,0x64,0x4d,0x6b,0x82,0x8c, 0xab,0x7e,0x75,0x7a,0x47,0x37,0x44,0x4d,0x3c,0x4b,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,0x6f,0x76, 0x87,0x52,0x50,0x7c,0x5b,0x43,0x5d,0x5b,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79, 0x58,0x50,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x55,0x50,0x79,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x52,0x7d,0x49,0x4e,0x74,0x2e,0x35,0x4c,0x4c,0x4c, 0x51,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x7e,0x7e,0x80, 0x3a,0x36,0x48,0x6a,0x5a,0x71,0x78,0x69,0x88,0x07,0x07,0x09,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,0x0f,0x0f,0x0f,0x2a,0x2b,0x2b,0xbd,0xc2,0xcf,0xaf,0xa7, 0xb8,0x82,0x6f,0x87,0x59,0x55,0x7f,0x52,0x52,0x7c,0x52,0x53,0x7e,0x52,0x56,0x82, 0x52,0x5a,0x84,0x52,0x5c,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53, 0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x57,0x82,0x62,0x4a, 0x65,0x52,0x52,0x7c,0x60,0x63,0x6c,0x28,0x28,0x28,0x21,0x21,0x21,0x0a,0x0a,0x0a, 0x19,0x19,0x19,0x25,0x25,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03, 0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x05,0x06,0x06,0x08,0x09,0x09,0x2c, 0x2c,0x2d,0x1b,0x1b,0x1c,0x07,0x07,0x09,0x13,0x13,0x15,0x19,0x19,0x1a,0x0d,0x0d, 0x0f,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d, 0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x29,0x22,0x2a,0x64, 0x6e,0x8e,0x52,0x5c,0x82,0x52,0x55,0x7e,0x52,0x54,0x7c,0x53,0x54,0x7b,0x52,0x53, 0x7b,0x6a,0x6c,0x8e,0x75,0x75,0x95,0x54,0x55,0x7c,0x54,0x56,0x7c,0x54,0x55,0x7a, 0x54,0x53,0x76,0x5d,0x55,0x71,0x4f,0x57,0x77,0x31,0x2f,0x3f,0x30,0x2d,0x3c,0x39, 0x33,0x42,0x3b,0x34,0x43,0x37,0x31,0x3f,0x32,0x2c,0x3a,0x2e,0x28,0x34,0x45,0x38, 0x47,0x5c,0x5c,0x74,0x47,0x49,0x69,0x42,0x3d,0x57,0x50,0x49,0x68,0x54,0x4b,0x6c, 0x57,0x4d,0x6d,0x5a,0x4f,0x71,0x5c,0x51,0x73,0x5e,0x51,0x75,0x5e,0x53,0x75,0x5e, 0x52,0x75,0x5e,0x53,0x75,0x5d,0x52,0x73,0x52,0x4b,0x69,0x59,0x4f,0x6c,0x46,0x3d, 0x4e,0x44,0x3a,0x4a,0x45,0x3d,0x4d,0x5b,0x53,0x61,0x60,0x59,0x66,0x57,0x50,0x5e, 0x49,0x42,0x51,0x37,0x32,0x40,0x29,0x27,0x34,0x21,0x23,0x2c,0x5f,0x56,0x75,0x65, 0x5b,0x7c,0x4f,0x46,0x61,0x52,0x48,0x65,0x5e,0x52,0x75,0x5e,0x53,0x75,0x5e,0x52, 0x75,0x5e,0x53,0x76,0x5d,0x53,0x77,0x5d,0x53,0x78,0x5e,0x53,0x77,0x5e,0x53,0x77, 0x55,0x4b,0x6a,0x5d,0x54,0x79,0x73,0x67,0x92,0x30,0x2a,0x35,0x35,0x2c,0x39,0x44, 0x39,0x47,0x4a,0x3e,0x4e,0x4a,0x3f,0x4f,0x45,0x3b,0x4b,0x41,0x39,0x47,0x42,0x3a, 0x48,0x43,0x3a,0x48,0x4c,0x46,0x57,0x59,0x4d,0x5e,0x46,0x3d,0x4b,0x38,0x32,0x3d, 0x66,0x61,0x88,0x58,0x55,0x75,0x54,0x52,0x74,0x53,0x53,0x75,0x4c,0x4c,0x6e,0x35, 0x35,0x4e,0x34,0x36,0x4e,0x28,0x2b,0x39,0x51,0x47,0x5a,0x55,0x4b,0x5e,0x8d,0x94, 0xa8,0x5b,0x65,0x86,0x56,0x61,0x82,0x19,0x1b,0x23,0x16,0x19,0x1f,0x16,0x17,0x1e, 0x2d,0x32,0x41,0x16,0x17,0x1e,0x15,0x16,0x1d,0x14,0x16,0x1d,0x15,0x16,0x1e,0x15, 0x17,0x1e,0x15,0x16,0x1e,0x14,0x16,0x1d,0x14,0x16,0x1d,0x15,0x16,0x1d,0x16,0x16, 0x1e,0x17,0x17,0x20,0x17,0x17,0x1f,0x16,0x16,0x1e,0x13,0x14,0x1b,0x12,0x13,0x19, 0x11,0x13,0x19,0x11,0x12,0x18,0x0f,0x11,0x16,0x1f,0x22,0x2a,0x50,0x56,0x78,0x4e, 0x46,0x65,0x52,0x46,0x62,0x56,0x4a,0x63,0x56,0x4b,0x5e,0x56,0x4c,0x5b,0x6a,0x60, 0x6e,0x8e,0x85,0x91,0x9f,0x99,0xa3,0x8d,0x85,0x91,0x55,0x4c,0x57,0x3b,0x30,0x3d, 0x5d,0x4c,0x63,0x67,0x56,0x6f,0x65,0x55,0x6e,0x57,0x47,0x5d,0x52,0x48,0x62,0x49, 0x45,0x5c,0x42,0x49,0x60,0x66,0x6d,0x80,0x63,0x6a,0x80,0x6b,0x72,0x86,0x76,0x7d, 0x90,0x7f,0x85,0x96,0x83,0x89,0x9a,0x7e,0x83,0x96,0x7e,0x84,0x96,0x81,0x87,0x9a, 0x8d,0x92,0xa2,0x96,0x9a,0xa7,0x99,0x9e,0xaa,0x96,0x9b,0xa8,0x95,0x9a,0xa6,0x92, 0x97,0xa5,0x8f,0x95,0xa2,0x8e,0x93,0xa1,0x83,0x8a,0x9a,0x6e,0x76,0x8b,0x5d,0x65, 0x7e,0x53,0x5b,0x77,0x51,0x58,0x74,0x4f,0x57,0x73,0x52,0x5a,0x73,0x56,0x5e,0x76, 0x5b,0x62,0x78,0x5b,0x62,0x75,0x5c,0x62,0x72,0x51,0x56,0x65,0x47,0x4b,0x5a,0x3e, 0x43,0x4f,0x3e,0x42,0x4e,0x36,0x3a,0x44,0x26,0x29,0x32,0x1a,0x1c,0x24,0x15,0x16, 0x1e,0x12,0x14,0x1a,0x11,0x12,0x18,0x10,0x12,0x17,0x0f,0x11,0x16,0x0e,0x0f,0x15, 0x0e,0x0f,0x15,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0c,0x0c,0x11,0x0c, 0x0d,0x11,0x0b,0x0b,0x0f,0x0a,0x0b,0x0f,0x0c,0x0e,0x12,0x5f,0x6b,0x8d,0x50,0x4f, 0x77,0x5c,0x51,0x74,0x5c,0x52,0x74,0x5c,0x51,0x74,0x5c,0x51,0x74,0x5c,0x51,0x74, 0x5d,0x51,0x74,0x5d,0x52,0x75,0x5c,0x52,0x75,0x5c,0x52,0x75,0x5d,0x51,0x75,0x5d, 0x52,0x75,0x5d,0x52,0x75,0x5d,0x52,0x75,0x65,0x57,0x7d,0x76,0x67,0x94,0x05,0x06, 0x07,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x04, 0x02,0x02,0x03,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x5d,0x69,0x8d,0x5e,0x53,0x79,0x64,0x53,0x75, 0x53,0x5e,0x88,0xbb,0xc1,0xd1,0xb7,0xbd,0xcf,0x83,0x8d,0xab,0xad,0xb4,0xc9,0xce, 0xd2,0xde,0x55,0x42,0x52,0x2d,0x21,0x27,0x37,0x29,0x31,0x42,0x32,0x3d,0x41,0x32, 0x3d,0x42,0x32,0x3e,0x42,0x32,0x3e,0x45,0x35,0x41,0x53,0x40,0x50,0x05,0x04,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x19,0x1f,0x43,0x33,0x3f,0x3c,0x2d,0x37,0x49,0x3e,0x46,0x98,0x96, 0xa1,0xc1,0xc7,0xd6,0xad,0xb4,0xc9,0x96,0xa0,0xb9,0x7e,0x89,0xa9,0x66,0x72,0x98, 0x62,0x6d,0x94,0x71,0x7c,0xa0,0x74,0x80,0xa2,0x6f,0x7b,0x9f,0x75,0x81,0xa3,0xac, 0xb4,0xc9,0xcf,0xd3,0xdf,0xc6,0xcb,0xd9,0x5d,0x6a,0x91,0x5f,0x53,0x79,0x5a,0x52, 0x79,0x5d,0x52,0x79,0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76, 0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x75,0x64, 0x53,0x74,0x64,0x52,0x73,0x64,0x52,0x72,0x64,0x52,0x72,0x64,0x50,0x6f,0x63,0x4b, 0x67,0x5e,0x53,0x79,0x55,0x62,0x8b,0x53,0x5e,0x88,0x52,0x50,0x7b,0x5e,0x53,0x79, 0x60,0x53,0x77,0x56,0x50,0x79,0x54,0x5f,0x89,0x56,0x3e,0x57,0x5a,0x41,0x5c,0x55, 0x60,0x8a,0xc2,0xbe,0xc1,0x41,0x31,0x3c,0x51,0x3f,0x4e,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,0x4f,0x51,0x58,0x5c,0x67,0x90,0x5d,0x45,0x5f,0x64,0x53,0x74,0x5b,0x52, 0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x58,0x50,0x79,0x57,0x50,0x79,0x55,0x50,0x79, 0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x50,0x50,0x79,0x3e,0x40,0x60,0x1c, 0x1f,0x2d,0xd6,0xd6,0xd6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8, 0xf8,0x1a,0x19,0x22,0x52,0x49,0x5f,0x72,0x5e,0x76,0x78,0x68,0x83,0x0a,0x0a,0x0d, 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,0x05,0x05,0x05,0x44,0x44,0x44,0xaf, 0xb1,0xb8,0x69,0x6c,0x91,0x62,0x4b,0x66,0x5e,0x53,0x79,0x52,0x52,0x7c,0x52,0x54, 0x7e,0x52,0x55,0x80,0x52,0x58,0x84,0x52,0x5c,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88, 0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52, 0x5b,0x85,0x5a,0x52,0x79,0x62,0x4a,0x65,0x67,0x72,0x93,0x0f,0x0f,0x10,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x03,0x03,0x04,0x05,0x05,0x06, 0x05,0x05,0x06,0x10,0x10,0x11,0x10,0x10,0x11,0x06,0x07,0x08,0x06,0x07,0x08,0x07, 0x07,0x09,0x08,0x08,0x0a,0x08,0x08,0x0a,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x0a,0x0a, 0x0b,0x0a,0x0a,0x0d,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e, 0x26,0x21,0x27,0x5f,0x69,0x89,0x52,0x5c,0x82,0x52,0x56,0x7e,0x53,0x53,0x7c,0x52, 0x53,0x7b,0x53,0x54,0x7a,0x61,0x62,0x86,0x77,0x79,0x96,0x5b,0x5c,0x82,0x54,0x55, 0x7b,0x54,0x56,0x7b,0x56,0x55,0x77,0x5f,0x56,0x73,0x54,0x5b,0x79,0x30,0x2f,0x3e, 0x2f,0x2c,0x3b,0x37,0x32,0x40,0x3a,0x33,0x43,0x38,0x32,0x40,0x32,0x2d,0x3a,0x2b, 0x26,0x33,0x48,0x3b,0x4b,0x5e,0x5d,0x74,0x4b,0x4e,0x6c,0x45,0x3e,0x5a,0x52,0x49, 0x69,0x57,0x4d,0x6f,0x5a,0x4f,0x71,0x5d,0x51,0x73,0x5e,0x52,0x75,0x5f,0x53,0x76, 0x5f,0x53,0x76,0x5f,0x54,0x77,0x5e,0x54,0x75,0x5d,0x52,0x74,0x54,0x4b,0x6b,0x5a, 0x4f,0x6c,0x49,0x3f,0x52,0x42,0x3a,0x49,0x46,0x3b,0x4c,0x53,0x4a,0x59,0x54,0x4c, 0x5c,0x4d,0x44,0x53,0x54,0x4b,0x5a,0x61,0x5a,0x66,0x31,0x2c,0x3a,0x23,0x21,0x2e, 0x55,0x4f,0x6d,0x65,0x5c,0x80,0x51,0x48,0x64,0x4f,0x46,0x61,0x5e,0x52,0x74,0x5e, 0x53,0x75,0x5e,0x53,0x75,0x5d,0x53,0x78,0x5d,0x53,0x77,0x5d,0x53,0x78,0x5e,0x53, 0x77,0x5f,0x53,0x77,0x54,0x4b,0x6a,0x5e,0x53,0x78,0x72,0x67,0x94,0x34,0x2e,0x3b, 0x3b,0x32,0x3f,0x4e,0x40,0x51,0x55,0x46,0x58,0x55,0x47,0x59,0x51,0x44,0x55,0x49, 0x3e,0x4e,0x44,0x3b,0x4a,0x44,0x3b,0x49,0x44,0x3c,0x4a,0x64,0x56,0x6b,0x52,0x46, 0x57,0x3d,0x37,0x43,0x52,0x4c,0x67,0x5b,0x58,0x7b,0x57,0x54,0x75,0x55,0x54,0x75, 0x53,0x52,0x74,0x3b,0x3b,0x56,0x34,0x34,0x4c,0x37,0x3a,0x52,0x2f,0x2c,0x38,0x55, 0x4a,0x5d,0x7a,0x7b,0x90,0x7e,0x86,0x9e,0x57,0x62,0x83,0x51,0x57,0x73,0x17,0x18, 0x1f,0x15,0x16,0x1e,0x15,0x16,0x1d,0x15,0x16,0x1d,0x14,0x16,0x1c,0x14,0x16,0x1d, 0x15,0x16,0x1e,0x15,0x16,0x1e,0x15,0x17,0x1e,0x14,0x16,0x1d,0x16,0x16,0x1e,0x1a, 0x1a,0x22,0x20,0x1e,0x27,0x23,0x20,0x2a,0x23,0x20,0x2a,0x22,0x1e,0x28,0x1e,0x1b, 0x24,0x15,0x14,0x1c,0x11,0x12,0x18,0x10,0x12,0x16,0x0f,0x10,0x16,0x0d,0x0f,0x13, 0x52,0x5c,0x7e,0x4d,0x46,0x69,0x52,0x47,0x63,0x53,0x48,0x61,0x5b,0x50,0x65,0x59, 0x4e,0x61,0x5a,0x4d,0x5e,0x78,0x6f,0x7d,0x98,0x91,0x9d,0x95,0x8e,0x99,0x62,0x59, 0x65,0x38,0x2e,0x39,0x32,0x28,0x34,0x57,0x47,0x5b,0x68,0x56,0x70,0x57,0x47,0x5d, 0x4f,0x44,0x5b,0x4a,0x41,0x57,0x40,0x3f,0x56,0x47,0x4d,0x66,0x4a,0x4f,0x6a,0x57, 0x5e,0x76,0x6a,0x72,0x86,0x7a,0x81,0x92,0x82,0x88,0x99,0x7d,0x83,0x96,0x7a,0x80, 0x93,0x7d,0x84,0x97,0x82,0x89,0x9a,0x8a,0x8f,0x9f,0x8f,0x95,0xa3,0x93,0x98,0xa6, 0x97,0x9c,0xa8,0x95,0x9a,0xa7,0x95,0x9a,0xa7,0x97,0x9c,0xa8,0x92,0x97,0xa5,0x7f, 0x86,0x97,0x6a,0x72,0x89,0x57,0x5f,0x7b,0x52,0x58,0x76,0x51,0x56,0x72,0x50,0x56, 0x72,0x4f,0x57,0x72,0x52,0x59,0x72,0x57,0x5e,0x75,0x5f,0x66,0x7a,0x62,0x68,0x7a, 0x63,0x69,0x78,0x56,0x5b,0x6a,0x4e,0x53,0x60,0x47,0x4c,0x57,0x3b,0x3f,0x4a,0x2a, 0x2d,0x36,0x19,0x1b,0x23,0x13,0x15,0x1b,0x12,0x13,0x1a,0x11,0x12,0x18,0x10,0x11, 0x16,0x0f,0x10,0x16,0x0e,0x0f,0x14,0x0e,0x0f,0x15,0x0e,0x0e,0x12,0x0d,0x0e,0x12, 0x0d,0x0e,0x12,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0c,0x0d,0x12,0x54, 0x5e,0x7e,0x50,0x4e,0x76,0x59,0x51,0x75,0x5b,0x51,0x73,0x5b,0x51,0x73,0x5b,0x51, 0x74,0x5b,0x51,0x74,0x5c,0x51,0x74,0x5c,0x51,0x74,0x5c,0x51,0x74,0x5c,0x51,0x74, 0x5d,0x52,0x75,0x5c,0x52,0x75,0x5d,0x52,0x75,0x5e,0x52,0x75,0x63,0x55,0x7c,0x7a, 0x6a,0x98,0x09,0x08,0x0b,0x05,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04, 0x06,0x04,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x09,0x09,0x0e,0x5d,0x69,0x91,0x52,0x4f, 0x7a,0x64,0x70,0x95,0xc7,0xcc,0xd9,0x95,0x9e,0xb8,0x8a,0x94,0xb1,0xc1,0xc6,0xd6, 0x6f,0x7a,0x9d,0x4b,0x3a,0x48,0x33,0x26,0x2e,0x3c,0x2d,0x37,0x3e,0x2f,0x3a,0x3e, 0x2f,0x39,0x3f,0x30,0x3a,0x42,0x32,0x3d,0x42,0x32,0x3d,0x45,0x35,0x41,0x49,0x38, 0x45,0x4b,0x3c,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x07,0x49,0x38,0x45,0x41, 0x31,0x3c,0x36,0x28,0x30,0x4a,0x42,0x4a,0x9f,0xa0,0xaa,0xbe,0xc3,0xd3,0xa2,0xaa, 0xc1,0x8a,0x94,0xb1,0x72,0x7d,0xa0,0x5a,0x65,0x8d,0x5e,0x6a,0x92,0x6f,0x7b,0x9f, 0x83,0x8e,0xac,0xc9,0xce,0xdb,0xd3,0xd8,0xe2,0xc6,0xcb,0xd9,0x53,0x5e,0x88,0x60, 0x53,0x77,0x5c,0x52,0x79,0x5e,0x53,0x79,0x5f,0x53,0x77,0x63,0x53,0x77,0x64,0x53, 0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76, 0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x52,0x72,0x64,0x52,0x72,0x64,0x52,0x72,0x64, 0x4f,0x6d,0x63,0x4b,0x67,0x64,0x53,0x74,0x53,0x5d,0x88,0x54,0x5f,0x89,0x52,0x5d, 0x88,0x56,0x50,0x79,0x5b,0x52,0x79,0x58,0x64,0x8c,0x64,0x4f,0x6e,0x56,0x3e,0x57, 0x57,0x50,0x79,0xb4,0xba,0xca,0x58,0x4c,0x55,0x50,0x3e,0x4d,0x1e,0x17,0x1d,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,0x19,0x1a,0x1b,0x6f,0x7b,0x9f,0x64,0x53,0x76,0x63, 0x4b,0x67,0x5c,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52, 0x79,0x55,0x50,0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x49,0x48,0x6f, 0x2d,0x2e,0x46,0x5a,0x5a,0x5f,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xfd, 0xfd,0xfd,0xd6,0xd6,0xd6,0x26,0x25,0x31,0x60,0x54,0x6a,0x74,0x5f,0x77,0x77,0x62, 0x7b,0x0d,0x0d,0x11,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,0x03,0x03,0x03,0x24,0x24,0x24, 0x5a,0x5a,0x5a,0x77,0x78,0x7a,0x65,0x72,0x96,0x64,0x4f,0x6e,0x64,0x50,0x6f,0x52, 0x4f,0x7a,0x52,0x52,0x7d,0x52,0x54,0x7e,0x52,0x57,0x82,0x52,0x5a,0x84,0x52,0x5c, 0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88, 0x52,0x5d,0x88,0x52,0x5c,0x86,0x52,0x57,0x82,0x5f,0x47,0x63,0x52,0x50,0x7b,0x57, 0x5c,0x67,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04, 0x05,0x04,0x04,0x05,0x04,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07, 0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x08,0x09,0x07,0x08,0x09,0x08,0x09,0x0a,0x0a, 0x0a,0x0b,0x0a,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0a,0x0b, 0x0e,0x0b,0x0b,0x0e,0x21,0x1d,0x22,0x5d,0x66,0x86,0x52,0x5c,0x83,0x52,0x57,0x7f, 0x53,0x53,0x7c,0x53,0x52,0x79,0x53,0x52,0x79,0x61,0x62,0x85,0x8e,0x8f,0xa7,0x7f, 0x7f,0x9c,0x5a,0x5c,0x80,0x54,0x56,0x7a,0x55,0x55,0x78,0x62,0x58,0x73,0x55,0x5e, 0x7c,0x2f,0x2e,0x3b,0x2f,0x2c,0x3b,0x35,0x30,0x40,0x38,0x32,0x41,0x36,0x31,0x40, 0x31,0x2c,0x3a,0x2c,0x28,0x34,0x47,0x3b,0x4b,0x5f,0x5d,0x72,0x4c,0x50,0x70,0x46, 0x40,0x5c,0x51,0x4a,0x6a,0x58,0x4f,0x71,0x5c,0x51,0x73,0x5e,0x52,0x75,0x5e,0x53, 0x75,0x5f,0x53,0x76,0x60,0x53,0x76,0x5f,0x54,0x77,0x5f,0x53,0x76,0x5c,0x52,0x75, 0x55,0x4c,0x6b,0x59,0x4e,0x6b,0x49,0x3f,0x52,0x3e,0x36,0x46,0x41,0x39,0x49,0x50, 0x48,0x57,0x57,0x4f,0x5e,0x4b,0x3f,0x50,0x4b,0x3f,0x4f,0x59,0x50,0x5e,0x54,0x4e, 0x5b,0x28,0x26,0x33,0x4a,0x45,0x5f,0x63,0x5a,0x7d,0x51,0x49,0x65,0x4f,0x46,0x60, 0x5e,0x53,0x74,0x5e,0x52,0x75,0x5e,0x53,0x75,0x5f,0x53,0x76,0x5d,0x53,0x77,0x5d, 0x53,0x78,0x5e,0x53,0x79,0x5e,0x53,0x77,0x52,0x49,0x69,0x5a,0x51,0x74,0x6b,0x5f, 0x88,0x36,0x2f,0x3e,0x38,0x30,0x3c,0x49,0x3d,0x4c,0x51,0x44,0x55,0x54,0x46,0x57, 0x53,0x46,0x58,0x51,0x44,0x56,0x4a,0x3f,0x51,0x44,0x3b,0x4b,0x43,0x3b,0x49,0x4a, 0x43,0x53,0x5e,0x50,0x63,0x44,0x3c,0x4a,0x36,0x32,0x3e,0x66,0x60,0x85,0x59,0x55, 0x76,0x58,0x54,0x74,0x55,0x52,0x74,0x50,0x50,0x72,0x34,0x34,0x4c,0x34,0x34,0x4b, 0x2b,0x30,0x40,0x4d,0x44,0x55,0x55,0x4a,0x5c,0x96,0x9c,0xae,0x66,0x70,0x8f,0x58, 0x63,0x85,0x3e,0x40,0x54,0x15,0x16,0x1d,0x14,0x16,0x1c,0x14,0x16,0x1c,0x14,0x16, 0x1d,0x14,0x16,0x1c,0x15,0x16,0x1e,0x16,0x16,0x1e,0x15,0x16,0x1e,0x15,0x16,0x1e, 0x18,0x17,0x20,0x27,0x22,0x2d,0x2b,0x26,0x30,0x2c,0x26,0x31,0x2b,0x26,0x31,0x2a, 0x25,0x2f,0x28,0x23,0x2d,0x1a,0x19,0x21,0x11,0x12,0x17,0x0f,0x10,0x16,0x0e,0x0f, 0x13,0x0c,0x0e,0x12,0x53,0x5e,0x82,0x4e,0x49,0x6c,0x54,0x49,0x67,0x56,0x4a,0x65, 0x5c,0x51,0x69,0x58,0x4d,0x60,0x4b,0x41,0x52,0x55,0x4a,0x5a,0x73,0x6b,0x78,0x79, 0x71,0x7d,0x5c,0x51,0x5f,0x3e,0x35,0x41,0x2c,0x22,0x2d,0x32,0x27,0x33,0x45,0x36, 0x47,0x3f,0x31,0x40,0x48,0x3c,0x51,0x4b,0x41,0x56,0x42,0x46,0x5b,0x47,0x4b,0x64, 0x4a,0x49,0x64,0x4d,0x4d,0x69,0x56,0x5e,0x76,0x6a,0x71,0x86,0x7a,0x7f,0x92,0x7f, 0x86,0x97,0x7d,0x84,0x96,0x7c,0x83,0x97,0x7e,0x85,0x98,0x80,0x87,0x99,0x82,0x89, 0x9a,0x8b,0x91,0xa1,0x91,0x96,0xa4,0x92,0x98,0xa6,0x96,0x9a,0xa7,0x9a,0x9f,0xaa, 0x97,0x9b,0xa8,0x87,0x8e,0x9e,0x74,0x7b,0x90,0x64,0x6c,0x86,0x56,0x5e,0x7a,0x52, 0x5a,0x77,0x51,0x56,0x73,0x50,0x57,0x73,0x4f,0x56,0x72,0x51,0x58,0x72,0x59,0x62, 0x79,0x61,0x68,0x7d,0x62,0x69,0x7a,0x5f,0x65,0x74,0x5a,0x5e,0x6d,0x52,0x56,0x63, 0x4e,0x52,0x5e,0x42,0x45,0x4f,0x28,0x2a,0x33,0x16,0x18,0x1f,0x13,0x14,0x1b,0x12, 0x13,0x1a,0x10,0x12,0x17,0x11,0x12,0x17,0x10,0x11,0x16,0x0f,0x11,0x16,0x0e,0x0f, 0x14,0x0e,0x0f,0x15,0x0e,0x0e,0x13,0x0e,0x0e,0x13,0x0d,0x0e,0x12,0x0d,0x0e,0x12, 0x0c,0x0e,0x12,0x41,0x49,0x65,0x50,0x50,0x78,0x57,0x50,0x75,0x5b,0x51,0x74,0x5b, 0x52,0x74,0x5b,0x52,0x74,0x5b,0x51,0x74,0x5b,0x51,0x73,0x5b,0x51,0x73,0x5c,0x52, 0x74,0x5c,0x51,0x74,0x5c,0x51,0x75,0x5d,0x51,0x75,0x5d,0x52,0x75,0x5d,0x52,0x75, 0x60,0x53,0x7a,0x76,0x66,0x93,0x12,0x10,0x17,0x06,0x06,0x09,0x06,0x06,0x08,0x06, 0x06,0x08,0x05,0x06,0x07,0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x03,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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, 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,0x17,0x19,0x25,0x65, 0x71,0x96,0x91,0x9b,0xb4,0xcd,0xd1,0xdd,0x92,0x9b,0xb6,0x9c,0xa5,0xbd,0xe8,0xea, 0xf0,0x77,0x63,0x7c,0x44,0x34,0x3f,0x36,0x28,0x31,0x3e,0x2f,0x39,0x3d,0x2e,0x38, 0x3f,0x2f,0x3a,0x3f,0x30,0x3b,0x3f,0x30,0x3a,0x40,0x31,0x3c,0x43,0x33,0x3f,0x45, 0x35,0x40,0x48,0x37,0x44,0x5e,0x4a,0x5c,0x27,0x20,0x28,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x16,0x11,0x15,0x49,0x38,0x45,0x3d,0x2e,0x39,0x32,0x25,0x2d,0x52, 0x4a,0x52,0x9d,0xa0,0xae,0xab,0xb3,0xc8,0x94,0x9f,0xb8,0x7d,0x89,0xa9,0x64,0x6f, 0x95,0x5f,0x6b,0x92,0x93,0x9c,0xb7,0xd3,0xd7,0xe2,0xd5,0xd8,0xe2,0xb4,0xba,0xce, 0x52,0x50,0x7b,0x5a,0x52,0x79,0x5b,0x52,0x79,0x5c,0x52,0x79,0x60,0x53,0x77,0x62, 0x53,0x77,0x63,0x53,0x77,0x64,0x53,0x76,0x63,0x53,0x77,0x63,0x53,0x77,0x64,0x53, 0x76,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x52,0x72,0x64,0x52,0x72, 0x64,0x52,0x72,0x64,0x50,0x6f,0x64,0x4d,0x6b,0x64,0x4f,0x6d,0x52,0x55,0x80,0x55, 0x62,0x8b,0x55,0x60,0x8a,0x52,0x55,0x80,0x5a,0x66,0x8e,0x5a,0x52,0x79,0x53,0x3c, 0x54,0x62,0x53,0x77,0x7c,0x88,0xa8,0x85,0x7d,0x85,0x4b,0x3a,0x47,0x4b,0x3b,0x48, 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,0x6d,0x75,0x8e, 0x52,0x53,0x7e,0x5c,0x44,0x5e,0x60,0x53,0x77,0x5b,0x52,0x79,0x5a,0x52,0x79,0x5a, 0x52,0x79,0x57,0x50,0x79,0x56,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x50,0x4d, 0x77,0x3e,0x3c,0x5d,0x1b,0x1c,0x2a,0xd7,0xd7,0xd7,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x84,0x84,0x85,0x3c,0x36,0x47,0x6a,0x58,0x6f,0x70, 0x5b,0x72,0x75,0x60,0x78,0x0f,0x0e,0x14,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,0x08,0x08, 0x08,0x29,0x29,0x29,0x54,0x54,0x54,0x5e,0x5e,0x5e,0x6c,0x73,0x88,0x52,0x52,0x7d, 0x62,0x4a,0x66,0x5a,0x52,0x79,0x52,0x50,0x7c,0x52,0x53,0x7d,0x52,0x55,0x80,0x52, 0x5a,0x84,0x52,0x5c,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e, 0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5c,0x86,0x52,0x5a,0x84,0x56,0x50,0x79, 0x5d,0x45,0x60,0x65,0x70,0x94,0x16,0x16,0x18,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, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x03, 0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x05,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06, 0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x08,0x09, 0x08,0x09,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d,0x0b, 0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x1e,0x1b,0x1f,0x5d,0x65,0x86,0x52,0x5c, 0x82,0x53,0x54,0x7d,0x53,0x53,0x7b,0x52,0x51,0x78,0x53,0x52,0x79,0x53,0x51,0x79, 0x5c,0x5b,0x81,0x90,0x90,0xa8,0x86,0x87,0xa0,0x5a,0x5c,0x81,0x55,0x55,0x7a,0x63, 0x59,0x76,0x58,0x62,0x80,0x2f,0x2d,0x39,0x2f,0x2c,0x3a,0x34,0x30,0x3f,0x38,0x32, 0x42,0x35,0x30,0x40,0x2e,0x2c,0x39,0x2a,0x28,0x34,0x43,0x39,0x49,0x5b,0x58,0x6a, 0x4c,0x52,0x73,0x45,0x40,0x5d,0x52,0x49,0x6a,0x59,0x50,0x73,0x5b,0x51,0x76,0x5c, 0x52,0x77,0x5f,0x53,0x76,0x5f,0x53,0x77,0x60,0x53,0x77,0x5f,0x54,0x77,0x5f,0x53, 0x76,0x5d,0x52,0x74,0x55,0x4c,0x6b,0x57,0x4d,0x6b,0x47,0x3f,0x52,0x37,0x31,0x3f, 0x3d,0x35,0x45,0x49,0x41,0x52,0x6a,0x63,0x6f,0x4a,0x3e,0x4f,0x4d,0x40,0x50,0x4a, 0x3f,0x4f,0x52,0x4b,0x58,0x3a,0x37,0x43,0x3d,0x39,0x50,0x64,0x5a,0x7d,0x52,0x4b, 0x67,0x4c,0x44,0x5e,0x5e,0x53,0x74,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5f,0x53,0x75, 0x5e,0x53,0x76,0x5e,0x53,0x78,0x5f,0x53,0x78,0x5e,0x53,0x77,0x54,0x4a,0x68,0x5a, 0x50,0x72,0x6c,0x5f,0x86,0x36,0x30,0x3f,0x33,0x2b,0x37,0x41,0x37,0x45,0x4a,0x3e, 0x4e,0x4d,0x41,0x51,0x51,0x44,0x55,0x56,0x48,0x5a,0x55,0x48,0x59,0x4c,0x41,0x51, 0x43,0x3b,0x4a,0x43,0x3b,0x49,0x5a,0x4f,0x62,0x4d,0x43,0x53,0x3d,0x36,0x42,0x5e, 0x56,0x74,0x60,0x5a,0x7b,0x59,0x55,0x74,0x58,0x54,0x74,0x52,0x51,0x73,0x39,0x39, 0x53,0x32,0x32,0x4a,0x33,0x34,0x4b,0x21,0x22,0x2a,0x53,0x49,0x5b,0x69,0x64,0x77, 0x92,0x99,0xac,0x5c,0x66,0x88,0x58,0x63,0x85,0x1c,0x20,0x29,0x13,0x16,0x1b,0x14, 0x16,0x1c,0x13,0x16,0x1c,0x12,0x15,0x1b,0x17,0x17,0x1f,0x1e,0x1d,0x26,0x17,0x17, 0x20,0x14,0x16,0x1d,0x16,0x16,0x1e,0x1a,0x19,0x22,0x20,0x1e,0x27,0x23,0x20,0x2a, 0x23,0x1f,0x29,0x22,0x1e,0x27,0x1e,0x1a,0x23,0x13,0x13,0x1a,0x10,0x11,0x16,0x0f, 0x10,0x16,0x0e,0x0f,0x14,0x0d,0x0f,0x13,0x50,0x5b,0x7f,0x50,0x4a,0x6e,0x56,0x4a, 0x69,0x58,0x4d,0x69,0x5a,0x50,0x67,0x50,0x47,0x59,0x3f,0x35,0x46,0x3e,0x34,0x44, 0x4a,0x3e,0x4e,0x57,0x4d,0x5b,0x4e,0x43,0x52,0x3e,0x34,0x41,0x38,0x2f,0x3b,0x36, 0x2c,0x39,0x37,0x2a,0x38,0x36,0x2a,0x36,0x41,0x36,0x49,0x49,0x3e,0x50,0x3d,0x3c, 0x4f,0x45,0x4a,0x5f,0x49,0x48,0x62,0x4e,0x4b,0x66,0x51,0x4f,0x6a,0x57,0x5d,0x76, 0x6a,0x71,0x86,0x78,0x7e,0x92,0x7a,0x82,0x94,0x7a,0x82,0x95,0x7a,0x82,0x96,0x7d, 0x83,0x97,0x7f,0x86,0x99,0x81,0x87,0x9a,0x88,0x8e,0x9e,0x8e,0x93,0xa2,0x93,0x98, 0xa5,0x94,0x99,0xa6,0x91,0x96,0xa4,0x8f,0x94,0xa2,0x89,0x8e,0x9f,0x75,0x7c,0x92, 0x65,0x6c,0x86,0x59,0x62,0x7d,0x56,0x5e,0x7a,0x53,0x5b,0x78,0x52,0x5a,0x76,0x50, 0x58,0x73,0x4f,0x56,0x72,0x4f,0x56,0x6f,0x51,0x58,0x6d,0x56,0x5b,0x6c,0x59,0x5e, 0x6d,0x5c,0x60,0x6c,0x62,0x66,0x70,0x59,0x5d,0x68,0x48,0x4b,0x55,0x25,0x27,0x2f, 0x14,0x16,0x1d,0x13,0x14,0x1a,0x12,0x13,0x1a,0x12,0x12,0x19,0x11,0x12,0x18,0x10, 0x12,0x17,0x0f,0x10,0x16,0x0f,0x10,0x16,0x0f,0x11,0x16,0x0f,0x10,0x16,0x0e,0x0f, 0x15,0x0e,0x0f,0x14,0x0e,0x0f,0x15,0x2f,0x35,0x48,0x4f,0x53,0x7a,0x55,0x50,0x74, 0x5a,0x52,0x73,0x5a,0x52,0x74,0x5b,0x52,0x73,0x5b,0x51,0x73,0x5b,0x51,0x73,0x5b, 0x52,0x73,0x5b,0x51,0x74,0x5b,0x51,0x74,0x5b,0x51,0x74,0x5c,0x52,0x74,0x5c,0x52, 0x74,0x5c,0x51,0x75,0x5e,0x53,0x77,0x71,0x62,0x8e,0x20,0x1d,0x29,0x07,0x07,0x0a, 0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x06,0x07,0x05,0x06,0x07,0x04, 0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x04,0x02,0x03, 0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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, 0x1e,0x23,0x31,0xd3,0xd6,0xe1,0xd6,0xd9,0xe4,0x9f,0xa8,0xbf,0xa7,0xae,0xc4,0xea, 0xeb,0xf1,0x63,0x4f,0x62,0x38,0x2a,0x33,0x3c,0x2d,0x37,0x3e,0x2f,0x3a,0x3b,0x2c, 0x36,0x3e,0x2f,0x39,0x3c,0x2e,0x38,0x3e,0x2f,0x3a,0x40,0x31,0x3c,0x43,0x33,0x3f, 0x43,0x33,0x3f,0x45,0x35,0x41,0x48,0x37,0x44,0x4c,0x3b,0x49,0x51,0x42,0x53,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,0x35,0x29,0x33, 0x4e,0x3d,0x4b,0x41,0x31,0x3c,0x34,0x26,0x2e,0x5a,0x54,0x5e,0x9d,0xa1,0xb2,0xa3, 0xab,0xc2,0x89,0x93,0xb1,0x73,0x7e,0xa1,0x92,0x9b,0xb7,0xb7,0xbe,0xd0,0xc1,0xc6, 0xd6,0x91,0x9a,0xb5,0x52,0x4f,0x7a,0x57,0x50,0x79,0x5d,0x52,0x79,0x5c,0x52,0x79, 0x5f,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x62,0x53,0x77,0x62,0x53,0x77,0x62, 0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x52, 0x72,0x64,0x52,0x72,0x64,0x52,0x72,0x64,0x50,0x6f,0x64,0x4e,0x6c,0x63,0x4b,0x67, 0x52,0x4f,0x7a,0x54,0x5f,0x89,0x58,0x64,0x8d,0x6e,0x7b,0x9d,0x53,0x4f,0x7a,0x52, 0x3b,0x53,0x63,0x4b,0x67,0x67,0x73,0x99,0xac,0xaa,0xb4,0x44,0x34,0x40,0x52,0x40, 0x4f,0x03,0x03,0x03,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,0x51,0x56,0x63,0x5a,0x66,0x8e,0x64,0x4d,0x6a,0x64,0x53,0x75,0x5c,0x52,0x79, 0x5b,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x54, 0x50,0x79,0x49,0x47,0x6d,0x2d,0x2c,0x44,0x59,0x59,0x5d,0xfc,0xfc,0xfc,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xfa,0xfa,0x32,0x31,0x35,0x51,0x47,0x5c, 0x71,0x5d,0x75,0x6e,0x59,0x6f,0x70,0x5b,0x72,0x13,0x12,0x18,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,0x4d,0x4d,0x4d,0x5a,0x5a,0x5a,0x3e,0x40, 0x44,0x65,0x71,0x96,0x64,0x4e,0x6d,0x64,0x50,0x71,0x52,0x4f,0x7b,0x52,0x52,0x7c, 0x52,0x53,0x7e,0x52,0x57,0x82,0x52,0x5b,0x85,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53, 0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5c, 0x86,0x52,0x55,0x80,0x60,0x48,0x64,0x52,0x4f,0x7a,0x65,0x6a,0x7b,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x05,0x05,0x04,0x04,0x05,0x05, 0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x07,0x07, 0x09,0x07,0x08,0x09,0x07,0x08,0x09,0x08,0x09,0x0a,0x08,0x09,0x0a,0x0a,0x0a,0x0b, 0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x1b,0x18,0x1d,0x5d, 0x65,0x86,0x53,0x59,0x81,0x53,0x55,0x7d,0x53,0x52,0x7a,0x53,0x51,0x78,0x52,0x50, 0x78,0x53,0x51,0x78,0x53,0x52,0x79,0x68,0x66,0x89,0x94,0x93,0xaa,0x89,0x89,0xa2, 0x58,0x58,0x7c,0x64,0x58,0x74,0x5b,0x63,0x84,0x32,0x30,0x3b,0x2e,0x2c,0x39,0x34, 0x30,0x3f,0x39,0x33,0x42,0x34,0x30,0x3f,0x2e,0x2a,0x38,0x29,0x26,0x32,0x3c,0x34, 0x44,0x52,0x51,0x62,0x4c,0x54,0x75,0x45,0x41,0x5f,0x50,0x49,0x68,0x5a,0x51,0x73, 0x5c,0x51,0x77,0x5e,0x53,0x76,0x5f,0x53,0x76,0x5f,0x53,0x77,0x60,0x53,0x77,0x5f, 0x54,0x76,0x5f,0x53,0x76,0x5e,0x53,0x75,0x56,0x4c,0x6d,0x52,0x49,0x67,0x45,0x3e, 0x53,0x2e,0x2b,0x39,0x34,0x30,0x3f,0x48,0x42,0x50,0x70,0x6a,0x76,0x4a,0x3f,0x4f, 0x4b,0x40,0x50,0x46,0x3b,0x4b,0x49,0x43,0x50,0x47,0x46,0x51,0x51,0x4f,0x60,0x73, 0x6c,0x8a,0x55,0x4f,0x6a,0x4c,0x43,0x5d,0x5e,0x53,0x74,0x5e,0x53,0x75,0x5e,0x52, 0x75,0x5f,0x52,0x75,0x5e,0x53,0x76,0x5f,0x53,0x76,0x5e,0x53,0x78,0x5e,0x53,0x77, 0x55,0x4a,0x6a,0x59,0x50,0x70,0x6b,0x5e,0x86,0x39,0x32,0x45,0x2d,0x29,0x34,0x35, 0x2f,0x3b,0x3b,0x32,0x40,0x43,0x38,0x47,0x4d,0x41,0x52,0x55,0x48,0x5a,0x51,0x45, 0x57,0x42,0x3a,0x4a,0x3b,0x36,0x43,0x3a,0x34,0x42,0x39,0x35,0x42,0x55,0x4b,0x5d, 0x43,0x3c,0x4a,0x3d,0x36,0x45,0x6c,0x62,0x87,0x59,0x55,0x74,0x59,0x54,0x73,0x55, 0x52,0x73,0x4f,0x4f,0x70,0x34,0x34,0x4a,0x32,0x32,0x4a,0x2d,0x31,0x44,0x39,0x34, 0x41,0x54,0x49,0x5b,0x91,0x95,0xa5,0x83,0x8b,0xa3,0x59,0x63,0x85,0x56,0x5f,0x80, 0x13,0x15,0x1b,0x13,0x15,0x1b,0x13,0x15,0x1b,0x13,0x15,0x1b,0x14,0x16,0x1d,0x1c, 0x1b,0x25,0x1c,0x1b,0x25,0x16,0x17,0x1f,0x15,0x16,0x1e,0x15,0x16,0x1e,0x16,0x16, 0x1e,0x17,0x16,0x1e,0x17,0x16,0x1e,0x14,0x14,0x1b,0x13,0x12,0x1a,0x10,0x11,0x16, 0x0f,0x11,0x16,0x0e,0x10,0x15,0x0d,0x0e,0x13,0x0a,0x0c,0x0f,0x4f,0x5a,0x80,0x53, 0x4c,0x6f,0x57,0x4d,0x6d,0x57,0x4b,0x6a,0x56,0x4b,0x63,0x51,0x48,0x5a,0x3f,0x36, 0x47,0x38,0x2e,0x3f,0x3d,0x31,0x44,0x3f,0x33,0x45,0x3e,0x32,0x43,0x47,0x3c,0x4a, 0x4d,0x42,0x4f,0x4c,0x41,0x4f,0x43,0x37,0x44,0x3c,0x2f,0x3d,0x44,0x39,0x4c,0x41, 0x35,0x44,0x3d,0x36,0x48,0x40,0x3e,0x53,0x46,0x43,0x5c,0x4f,0x4a,0x62,0x56,0x53, 0x6a,0x55,0x54,0x6e,0x5c,0x61,0x7a,0x65,0x6d,0x83,0x6a,0x72,0x89,0x75,0x7c,0x91, 0x7d,0x83,0x96,0x81,0x86,0x99,0x80,0x87,0x9a,0x7e,0x86,0x98,0x80,0x86,0x99,0x87, 0x8d,0x9e,0x8e,0x93,0xa2,0x8c,0x92,0xa2,0x8d,0x92,0xa2,0x95,0x9a,0xa7,0x96,0x9a, 0xa8,0x83,0x8a,0x9a,0x72,0x79,0x8f,0x66,0x6e,0x87,0x5d,0x65,0x7f,0x55,0x5d,0x7a, 0x52,0x58,0x76,0x51,0x57,0x74,0x4d,0x53,0x6e,0x47,0x4e,0x66,0x49,0x50,0x66,0x57, 0x5e,0x71,0x62,0x68,0x78,0x72,0x77,0x83,0x80,0x84,0x8f,0x7d,0x81,0x8b,0x6e,0x72, 0x7c,0x3c,0x3e,0x48,0x19,0x1b,0x23,0x14,0x16,0x1d,0x13,0x15,0x1c,0x12,0x14,0x1a, 0x12,0x12,0x19,0x11,0x12,0x18,0x11,0x12,0x18,0x10,0x12,0x17,0x11,0x12,0x18,0x11, 0x12,0x18,0x11,0x12,0x17,0x10,0x12,0x16,0x0f,0x10,0x16,0x23,0x26,0x34,0x4f,0x57, 0x7d,0x54,0x4f,0x74,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x51,0x73, 0x5a,0x51,0x73,0x5a,0x52,0x73,0x5b,0x52,0x73,0x5b,0x51,0x74,0x5c,0x52,0x74,0x5c, 0x52,0x74,0x5c,0x52,0x74,0x5b,0x51,0x74,0x5e,0x53,0x75,0x6d,0x5e,0x88,0x31,0x2c, 0x3f,0x08,0x09,0x0b,0x07,0x08,0x0a,0x06,0x07,0x09,0x06,0x06,0x09,0x06,0x06,0x08, 0x06,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x05,0x04, 0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0xed,0xee,0xf1,0xd4,0xd8,0xe2,0xd1,0xd5,0xe0, 0x70,0x7b,0x9e,0x45,0x35,0x41,0x35,0x28,0x30,0x40,0x30,0x3b,0x3e,0x2f,0x3a,0x3e, 0x2f,0x39,0x3c,0x2d,0x37,0x3d,0x2e,0x38,0x3c,0x2d,0x37,0x3f,0x30,0x3b,0x40,0x31, 0x3c,0x43,0x33,0x3f,0x44,0x34,0x3f,0x46,0x36,0x42,0x48,0x38,0x44,0x4a,0x39,0x46, 0x5d,0x49,0x5b,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,0x0d,0x0a,0x0c,0x5a,0x47,0x59,0x4d,0x3c,0x4a,0x3f,0x30,0x3b, 0x34,0x27,0x2f,0x64,0x5f,0x6a,0x9f,0xa3,0xb6,0x9b,0xa3,0xbc,0x9f,0xa7,0xbf,0x9b, 0xa4,0xbc,0x85,0x90,0xaf,0x57,0x63,0x8c,0x64,0x53,0x75,0x5e,0x53,0x79,0x5f,0x53, 0x77,0x58,0x50,0x79,0x5e,0x53,0x79,0x64,0x53,0x76,0x64,0x53,0x76,0x5e,0x53,0x79, 0x62,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x53,0x75,0x64, 0x53,0x74,0x64,0x52,0x72,0x64,0x52,0x72,0x64,0x50,0x6f,0x64,0x52,0x72,0x64,0x4f, 0x6e,0x63,0x4b,0x67,0x5e,0x53,0x79,0x53,0x5e,0x88,0x7b,0x86,0xa7,0x55,0x62,0x8a, 0x52,0x39,0x52,0x60,0x48,0x64,0x5b,0x66,0x8e,0x9f,0xa5,0xb9,0x50,0x43,0x4c,0x4f, 0x3d,0x4c,0x12,0x0e,0x11,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,0x28,0x29,0x2f,0x67,0x73,0x99,0x63,0x53,0x77,0x64,0x4e, 0x6c,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5b,0x52,0x79,0x5a,0x52,0x79, 0x56,0x50,0x79,0x52,0x4e,0x76,0x3e,0x3b,0x5c,0x1c,0x1b,0x29,0xd6,0xd6,0xd6,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe2,0xe2,0xe2,0x31,0x30, 0x36,0x5e,0x4f,0x64,0x75,0x60,0x78,0x6b,0x56,0x6c,0x6f,0x5a,0x71,0x15,0x14,0x1a, 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,0x20,0x20,0x20,0x5d, 0x5d,0x5d,0x11,0x11,0x11,0x87,0x8e,0xa0,0x52,0x52,0x7d,0x5f,0x47,0x63,0x53,0x4f, 0x7a,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x55,0x81,0x52,0x5a,0x84,0x52,0x5c,0x86, 0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52, 0x5d,0x88,0x52,0x5c,0x86,0x52,0x57,0x83,0x53,0x50,0x7a,0x5f,0x47,0x63,0x63,0x6f, 0x95,0x28,0x29,0x2c,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,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05, 0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06, 0x06,0x07,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x08,0x09,0x08,0x08,0x0a,0x08,0x09, 0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e, 0x18,0x16,0x1a,0x5e,0x66,0x87,0x53,0x5a,0x81,0x53,0x55,0x7e,0x53,0x52,0x7a,0x53, 0x51,0x78,0x53,0x50,0x78,0x52,0x50,0x78,0x52,0x51,0x79,0x54,0x52,0x79,0x62,0x63, 0x86,0x96,0x97,0xad,0x88,0x87,0xa1,0x75,0x6a,0x82,0x5b,0x65,0x85,0x36,0x34,0x40, 0x2e,0x2b,0x39,0x35,0x31,0x3f,0x39,0x33,0x43,0x35,0x31,0x3f,0x2e,0x2a,0x38,0x28, 0x27,0x32,0x3e,0x37,0x44,0x4b,0x47,0x54,0x53,0x5c,0x7a,0x47,0x44,0x63,0x50,0x46, 0x67,0x5b,0x51,0x74,0x5c,0x52,0x77,0x5c,0x53,0x77,0x5f,0x52,0x76,0x5f,0x54,0x77, 0x60,0x53,0x77,0x5f,0x54,0x76,0x5f,0x54,0x75,0x5e,0x53,0x75,0x57,0x4f,0x6f,0x4e, 0x49,0x65,0x42,0x3c,0x53,0x25,0x24,0x32,0x2f,0x2c,0x3b,0x52,0x4c,0x5a,0x63,0x5d, 0x6a,0x50,0x47,0x56,0x46,0x3d,0x4d,0x41,0x39,0x48,0x34,0x2e,0x3d,0x20,0x20,0x2c, 0x32,0x32,0x41,0x73,0x6b,0x89,0x71,0x6b,0x82,0x6a,0x64,0x77,0x61,0x57,0x76,0x5e, 0x53,0x75,0x5e,0x52,0x75,0x5f,0x52,0x75,0x5e,0x53,0x76,0x5f,0x53,0x76,0x5f,0x53, 0x76,0x5f,0x53,0x77,0x56,0x4b,0x6b,0x58,0x4f,0x6f,0x6a,0x5e,0x83,0x3c,0x36,0x4a, 0x30,0x2b,0x39,0x34,0x30,0x3e,0x39,0x32,0x41,0x3e,0x37,0x45,0x44,0x3b,0x4b,0x4b, 0x40,0x52,0x4a,0x3f,0x51,0x3e,0x37,0x46,0x35,0x30,0x3d,0x34,0x30,0x3d,0x32,0x30, 0x3d,0x4c,0x46,0x58,0x48,0x41,0x51,0x3b,0x36,0x42,0x64,0x5b,0x7c,0x5e,0x57,0x75, 0x5a,0x55,0x73,0x58,0x54,0x74,0x54,0x52,0x73,0x45,0x45,0x64,0x32,0x31,0x49,0x31, 0x33,0x4a,0x1a,0x1d,0x25,0x4d,0x42,0x54,0x54,0x49,0x5a,0x9c,0xa1,0xb2,0x66,0x70, 0x8f,0x58,0x62,0x85,0x3a,0x3e,0x53,0x12,0x14,0x1a,0x12,0x14,0x1a,0x12,0x14,0x1a, 0x12,0x14,0x1b,0x15,0x16,0x1e,0x1a,0x19,0x22,0x15,0x16,0x1e,0x15,0x16,0x1e,0x14, 0x16,0x1d,0x14,0x16,0x1d,0x13,0x14,0x1b,0x12,0x13,0x1a,0x11,0x12,0x19,0x10,0x12, 0x17,0x10,0x11,0x16,0x0e,0x0f,0x15,0x0e,0x0f,0x14,0x0d,0x0e,0x13,0x0a,0x0b,0x0f, 0x50,0x59,0x80,0x54,0x4e,0x72,0x58,0x4d,0x6d,0x57,0x4c,0x6c,0x52,0x47,0x64,0x4a, 0x40,0x56,0x3c,0x33,0x45,0x38,0x2f,0x41,0x3e,0x33,0x46,0x41,0x35,0x48,0x41,0x35, 0x47,0x51,0x45,0x55,0x52,0x48,0x56,0x4f,0x45,0x53,0x4e,0x43,0x50,0x40,0x33,0x42, 0x41,0x38,0x4a,0x3c,0x31,0x3e,0x42,0x38,0x46,0x46,0x3d,0x4e,0x43,0x3f,0x54,0x4a, 0x46,0x5b,0x58,0x52,0x68,0x69,0x65,0x7a,0x6b,0x6a,0x7e,0x5f,0x5e,0x79,0x5e,0x62, 0x7c,0x6d,0x74,0x8b,0x7f,0x85,0x97,0x83,0x8a,0x9a,0x81,0x87,0x9a,0x7d,0x83,0x97, 0x7d,0x83,0x97,0x80,0x86,0x99,0x84,0x8a,0x9c,0x88,0x8e,0x9e,0x8d,0x92,0xa2,0x95, 0x9a,0xa7,0x98,0x9d,0xaa,0x8f,0x95,0xa3,0x81,0x87,0x99,0x72,0x7a,0x90,0x66,0x6e, 0x87,0x56,0x5e,0x7a,0x52,0x56,0x73,0x51,0x53,0x70,0x4d,0x52,0x6e,0x4e,0x55,0x6e, 0x53,0x5a,0x72,0x5e,0x66,0x7a,0x62,0x67,0x7a,0x6a,0x70,0x81,0x76,0x7b,0x8a,0x81, 0x86,0x91,0x7a,0x7e,0x88,0x4a,0x4d,0x56,0x1e,0x21,0x2a,0x16,0x19,0x20,0x16,0x17, 0x1f,0x14,0x16,0x1d,0x12,0x14,0x1b,0x12,0x13,0x1a,0x13,0x15,0x1a,0x12,0x14,0x1a, 0x15,0x16,0x1d,0x15,0x17,0x1d,0x14,0x16,0x1c,0x12,0x14,0x1a,0x12,0x13,0x19,0x18, 0x1b,0x24,0x50,0x5a,0x7f,0x52,0x4f,0x74,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x51, 0x73,0x5a,0x51,0x73,0x5a,0x51,0x73,0x5a,0x52,0x72,0x5a,0x52,0x73,0x5b,0x51,0x73, 0x5b,0x52,0x73,0x5b,0x51,0x73,0x5b,0x52,0x73,0x5c,0x52,0x74,0x5c,0x52,0x74,0x68, 0x5b,0x83,0x44,0x3c,0x56,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x09,0x0a,0x0c,0x07,0x07, 0x0a,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x06,0x07, 0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04, 0x05,0x06,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 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,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,0x1e,0x1f,0x20,0xea,0xeb, 0xef,0xd7,0xdb,0xe5,0x78,0x66,0x80,0x4c,0x3b,0x49,0x49,0x38,0x45,0x43,0x33,0x3e, 0x3c,0x2d,0x37,0x3d,0x2e,0x38,0x3d,0x2e,0x38,0x3c,0x2e,0x38,0x3e,0x2f,0x39,0x3f, 0x2f,0x3a,0x40,0x31,0x3c,0x41,0x31,0x3d,0x43,0x33,0x3e,0x46,0x36,0x42,0x48,0x37, 0x44,0x4a,0x39,0x47,0x4e,0x3c,0x4b,0x35,0x2c,0x37,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,0x3b,0x2f, 0x3b,0x54,0x42,0x51,0x4a,0x39,0x47,0x3f,0x30,0x3a,0x3b,0x2e,0x38,0x6d,0x67,0x74, 0xa0,0xa7,0xbc,0x92,0x9b,0xb7,0x89,0x93,0xb0,0x52,0x55,0x81,0x64,0x4e,0x6c,0x60, 0x48,0x64,0x60,0x48,0x65,0x64,0x4f,0x6d,0x5f,0x47,0x64,0x5f,0x47,0x63,0x63,0x4c, 0x69,0x64,0x53,0x75,0x60,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x75, 0x64,0x53,0x74,0x64,0x53,0x73,0x64,0x53,0x73,0x64,0x52,0x72,0x64,0x53,0x73,0x64, 0x52,0x72,0x64,0x4f,0x6e,0x64,0x4c,0x69,0x64,0x4f,0x6d,0x56,0x62,0x8b,0x5a,0x66, 0x8e,0x60,0x48,0x65,0x5f,0x47,0x64,0x56,0x62,0x8b,0x7d,0x89,0xa7,0x64,0x5b,0x63, 0x4a,0x39,0x46,0x28,0x20,0x27,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,0x02,0x02,0x02,0x6d,0x78,0x97,0x52, 0x52,0x7d,0x60,0x48,0x65,0x60,0x53,0x77,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5b,0x52, 0x79,0x58,0x50,0x79,0x56,0x50,0x79,0x4b,0x48,0x6e,0x2d,0x2c,0x43,0x62,0x61,0x67, 0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5, 0xa6,0xa7,0x47,0x46,0x4f,0x65,0x53,0x68,0x73,0x5e,0x75,0x68,0x54,0x69,0x6d,0x58, 0x6e,0x19,0x16,0x1d,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, 0x02,0x02,0x02,0x63,0x63,0x63,0x1d,0x1d,0x1d,0x67,0x67,0x68,0x74,0x7e,0xa1,0x62, 0x4a,0x65,0x64,0x53,0x76,0x52,0x50,0x7b,0x52,0x53,0x7d,0x52,0x55,0x80,0x52,0x57, 0x82,0x52,0x5b,0x85,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88, 0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5d,0x86,0x52,0x5a,0x84,0x52,0x55,0x80,0x63, 0x4b,0x67,0x5e,0x53,0x79,0x64,0x6d,0x84,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,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x03,0x03, 0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x06,0x06,0x07, 0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x07,0x09,0x07, 0x08,0x09,0x08,0x09,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a, 0x0d,0x0a,0x0b,0x0d,0x13,0x12,0x16,0x5c,0x64,0x83,0x53,0x58,0x80,0x53,0x55,0x7e, 0x52,0x51,0x79,0x55,0x51,0x77,0x54,0x51,0x77,0x52,0x50,0x78,0x53,0x51,0x78,0x54, 0x51,0x79,0x54,0x53,0x7a,0x5e,0x60,0x82,0x74,0x74,0x92,0x83,0x7a,0x90,0x6d,0x75, 0x91,0x3f,0x3b,0x48,0x2d,0x2a,0x37,0x36,0x31,0x40,0x3b,0x34,0x43,0x37,0x31,0x40, 0x2e,0x2b,0x39,0x29,0x26,0x33,0x3d,0x36,0x44,0x42,0x3b,0x47,0x5c,0x62,0x7f,0x49, 0x46,0x6a,0x50,0x48,0x67,0x5b,0x51,0x74,0x5c,0x52,0x77,0x5d,0x53,0x77,0x5f,0x53, 0x76,0x5f,0x54,0x76,0x5f,0x53,0x77,0x5f,0x54,0x76,0x5f,0x54,0x75,0x5f,0x54,0x76, 0x58,0x50,0x6e,0x51,0x4a,0x66,0x46,0x42,0x56,0x43,0x44,0x4d,0x3d,0x3c,0x4a,0x55, 0x4f,0x5d,0x49,0x41,0x4f,0x47,0x40,0x4f,0x42,0x39,0x48,0x3e,0x36,0x46,0x2f,0x2b, 0x3a,0x1f,0x1f,0x2a,0x2c,0x2b,0x38,0x68,0x5e,0x80,0x56,0x4e,0x6a,0x69,0x62,0x76, 0x75,0x6c,0x87,0x70,0x65,0x84,0x62,0x56,0x78,0x5f,0x53,0x75,0x5e,0x53,0x76,0x5f, 0x53,0x76,0x5f,0x53,0x76,0x5f,0x53,0x77,0x56,0x4c,0x6d,0x57,0x4d,0x6c,0x69,0x5d, 0x83,0x3b,0x36,0x4b,0x25,0x23,0x2e,0x2d,0x2a,0x38,0x38,0x34,0x44,0x42,0x3b,0x4f, 0x43,0x3b,0x4e,0x44,0x3b,0x4b,0x40,0x37,0x48,0x35,0x2f,0x3e,0x33,0x2e,0x3d,0x36, 0x31,0x41,0x3a,0x36,0x47,0x3a,0x35,0x47,0x4d,0x43,0x57,0x3f,0x39,0x49,0x40,0x3b, 0x4e,0x63,0x5a,0x7b,0x5c,0x54,0x72,0x5a,0x54,0x72,0x59,0x53,0x71,0x52,0x51,0x73, 0x35,0x35,0x4f,0x31,0x30,0x49,0x2c,0x31,0x43,0x2d,0x29,0x34,0x53,0x48,0x59,0x6e, 0x67,0x78,0x87,0x8f,0xa6,0x59,0x63,0x86,0x57,0x61,0x84,0x19,0x1b,0x24,0x12,0x14, 0x1a,0x12,0x14,0x1a,0x14,0x16,0x1d,0x13,0x16,0x1c,0x14,0x16,0x1d,0x14,0x16,0x1d, 0x14,0x16,0x1d,0x14,0x16,0x1d,0x12,0x14,0x1b,0x12,0x13,0x1a,0x12,0x13,0x1a,0x12, 0x13,0x19,0x10,0x11,0x16,0x0f,0x10,0x16,0x0e,0x0f,0x15,0x0e,0x0e,0x13,0x0e,0x0f, 0x13,0x0c,0x0d,0x11,0x4f,0x59,0x80,0x55,0x4e,0x73,0x5a,0x4e,0x70,0x58,0x4d,0x6d, 0x56,0x4a,0x69,0x4d,0x41,0x5d,0x42,0x39,0x50,0x3e,0x34,0x49,0x41,0x36,0x4c,0x42, 0x37,0x4c,0x40,0x35,0x47,0x49,0x3d,0x4e,0x50,0x45,0x55,0x50,0x46,0x55,0x4d,0x42, 0x51,0x45,0x38,0x48,0x51,0x45,0x5e,0x45,0x38,0x47,0x48,0x3e,0x50,0x44,0x3c,0x4e, 0x3e,0x3c,0x51,0x45,0x42,0x59,0x51,0x4d,0x63,0x67,0x62,0x76,0x7a,0x73,0x84,0x71, 0x6a,0x7e,0x5a,0x5a,0x74,0x62,0x6a,0x82,0x7b,0x82,0x95,0x81,0x87,0x99,0x7f,0x86, 0x98,0x7a,0x81,0x95,0x79,0x80,0x94,0x7b,0x82,0x96,0x7e,0x84,0x97,0x83,0x8a,0x9b, 0x8c,0x92,0xa1,0x91,0x96,0xa4,0x96,0x9a,0xa8,0x95,0x9a,0xa7,0x8e,0x94,0xa3,0x7f, 0x86,0x98,0x6a,0x72,0x8a,0x58,0x60,0x7c,0x52,0x58,0x76,0x52,0x56,0x73,0x50,0x58, 0x73,0x4f,0x56,0x71,0x54,0x5c,0x74,0x5b,0x62,0x7a,0x5e,0x65,0x7a,0x65,0x6b,0x7e, 0x6f,0x75,0x86,0x78,0x7e,0x8c,0x6e,0x73,0x80,0x4a,0x4e,0x5b,0x2a,0x2e,0x37,0x1a, 0x1d,0x25,0x17,0x19,0x21,0x16,0x19,0x20,0x15,0x16,0x1e,0x14,0x16,0x1c,0x15,0x17, 0x1e,0x16,0x18,0x1e,0x19,0x1b,0x21,0x1a,0x1c,0x22,0x19,0x1a,0x20,0x16,0x17,0x1e, 0x16,0x17,0x1e,0x16,0x17,0x1f,0x51,0x5b,0x80,0x51,0x50,0x75,0x5a,0x52,0x73,0x5a, 0x52,0x73,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x52, 0x74,0x5b,0x52,0x74,0x5a,0x52,0x73,0x5b,0x52,0x73,0x5c,0x52,0x74,0x5c,0x52,0x73, 0x5b,0x51,0x73,0x62,0x57,0x7c,0x59,0x50,0x6f,0x0b,0x0c,0x0e,0x0d,0x0e,0x11,0x0b, 0x0c,0x0e,0x0a,0x0a,0x0d,0x0a,0x0a,0x0c,0x07,0x07,0x0a,0x07,0x08,0x0a,0x07,0x07, 0x09,0x06,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x06, 0x05,0x06,0x06,0x05,0x06,0x06,0x04,0x05,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03, 0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,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,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,0x0d,0x0d,0x0e,0xc5,0xc6,0xc7,0xe9,0xea,0xf0,0x78,0x69,0x87,0x5b,0x48, 0x59,0x48,0x38,0x44,0x41,0x31,0x3c,0x3f,0x30,0x3a,0x3e,0x2f,0x39,0x3e,0x2f,0x3a, 0x3f,0x30,0x3b,0x3f,0x30,0x3b,0x40,0x31,0x3c,0x41,0x31,0x3d,0x45,0x35,0x41,0x46, 0x36,0x42,0x47,0x37,0x43,0x4a,0x39,0x47,0x4c,0x3b,0x48,0x65,0x51,0x65,0x05,0x05, 0x07,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,0x16,0x11,0x16,0x5b,0x48,0x59,0x51,0x3f,0x4e,0x4b,0x3a, 0x47,0x44,0x34,0x3f,0x3b,0x2e,0x37,0x63,0x62,0x71,0x9a,0xa2,0xb9,0x52,0x5d,0x86, 0x57,0x50,0x79,0x5e,0x53,0x79,0x64,0x53,0x74,0x64,0x4d,0x6b,0x60,0x48,0x65,0x5d, 0x45,0x5f,0x52,0x3b,0x53,0x4f,0x37,0x4f,0x50,0x39,0x52,0x5b,0x43,0x5d,0x5f,0x47, 0x63,0x64,0x4c,0x69,0x64,0x52,0x73,0x64,0x53,0x74,0x64,0x53,0x74,0x64,0x52,0x72, 0x64,0x50,0x71,0x64,0x52,0x71,0x64,0x52,0x72,0x64,0x4e,0x6c,0x60,0x48,0x65,0x63, 0x4b,0x67,0x55,0x3e,0x57,0x5f,0x47,0x64,0x52,0x58,0x83,0x85,0x90,0xad,0x7a,0x77, 0x81,0x41,0x31,0x3c,0x2f,0x25,0x2e,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, 0x4e,0x54,0x67,0x56,0x62,0x8b,0x60,0x48,0x65,0x64,0x50,0x6f,0x5d,0x52,0x79,0x5c, 0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x55,0x4e,0x76,0x40,0x3d,0x5c,0x1c,0x1b, 0x2a,0xd4,0xd4,0xd4,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xfc,0xfc,0xfc,0x46,0x47,0x4b,0x61,0x60,0x6d,0x6b,0x58,0x6e,0x70,0x5b,0x72,0x66, 0x52,0x66,0x6b,0x56,0x6c,0x1c,0x19,0x1f,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,0x18,0x18,0x18,0x64,0x64,0x64,0x3c,0x3c,0x3c,0x2c,0x2c,0x2c, 0x94,0x9a,0xaf,0x58,0x50,0x79,0x60,0x48,0x65,0x52,0x4f,0x7a,0x52,0x52,0x7c,0x52, 0x54,0x7e,0x52,0x57,0x82,0x52,0x5b,0x85,0x52,0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d, 0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5b,0x85, 0x52,0x57,0x82,0x52,0x4f,0x7a,0x5c,0x44,0x5f,0x55,0x62,0x8b,0x3c,0x3f,0x46,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,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x05,0x05,0x05, 0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x06,0x06,0x07, 0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x08,0x09,0x08,0x09,0x0a,0x09,0x09,0x0a,0x0a, 0x0a,0x0c,0x0a,0x0a,0x0d,0x0b,0x0b,0x0e,0x11,0x0f,0x13,0x60,0x67,0x86,0x53,0x5d, 0x83,0x52,0x56,0x7f,0x52,0x51,0x7a,0x55,0x51,0x77,0x55,0x51,0x77,0x53,0x50,0x78, 0x53,0x51,0x78,0x54,0x51,0x78,0x54,0x53,0x7a,0x54,0x55,0x7a,0x5e,0x5d,0x80,0x78, 0x6d,0x84,0x66,0x6e,0x8d,0x56,0x54,0x5f,0x2e,0x2c,0x39,0x35,0x2f,0x3e,0x39,0x32, 0x41,0x36,0x30,0x3f,0x30,0x2c,0x39,0x29,0x27,0x33,0x3e,0x35,0x45,0x39,0x2f,0x3d, 0x61,0x69,0x84,0x4a,0x49,0x6b,0x50,0x46,0x65,0x5c,0x51,0x76,0x5c,0x52,0x77,0x5d, 0x53,0x77,0x5f,0x54,0x76,0x5f,0x54,0x76,0x5f,0x53,0x77,0x60,0x53,0x76,0x60,0x53, 0x76,0x5e,0x53,0x75,0x58,0x4f,0x6e,0x50,0x4a,0x65,0x4b,0x45,0x5b,0x3e,0x3f,0x49, 0x48,0x47,0x52,0x54,0x4e,0x5b,0x3e,0x36,0x46,0x3e,0x36,0x46,0x3e,0x36,0x46,0x3a, 0x33,0x42,0x31,0x2d,0x3c,0x25,0x24,0x30,0x26,0x27,0x34,0x68,0x5f,0x85,0x54,0x4d, 0x6c,0x4a,0x41,0x59,0x5c,0x51,0x70,0x6b,0x60,0x80,0x72,0x69,0x86,0x6b,0x61,0x80, 0x60,0x55,0x77,0x5f,0x53,0x76,0x60,0x53,0x76,0x5f,0x53,0x76,0x57,0x4d,0x6d,0x54, 0x4b,0x69,0x6e,0x62,0x8b,0x3e,0x39,0x50,0x20,0x1f,0x2a,0x28,0x26,0x34,0x33,0x32, 0x43,0x3a,0x38,0x4b,0x3e,0x39,0x4b,0x41,0x38,0x48,0x3a,0x33,0x43,0x35,0x30,0x40, 0x40,0x39,0x4b,0x43,0x3c,0x4e,0x40,0x3a,0x4d,0x36,0x31,0x41,0x43,0x3b,0x4d,0x46, 0x3d,0x50,0x3b,0x34,0x43,0x62,0x59,0x79,0x5b,0x53,0x71,0x5c,0x54,0x71,0x5a,0x53, 0x72,0x56,0x52,0x73,0x51,0x50,0x73,0x31,0x32,0x4a,0x30,0x2f,0x47,0x1d,0x1f,0x29, 0x4e,0x44,0x55,0x54,0x48,0x5a,0x92,0x94,0xa4,0x67,0x72,0x90,0x56,0x60,0x83,0x51, 0x5b,0x7c,0x13,0x14,0x1b,0x12,0x13,0x1a,0x12,0x14,0x1a,0x13,0x15,0x1b,0x16,0x16, 0x1e,0x17,0x17,0x1f,0x16,0x16,0x1e,0x14,0x15,0x1c,0x13,0x14,0x1b,0x12,0x13,0x1a, 0x12,0x13,0x19,0x11,0x12,0x18,0x11,0x11,0x17,0x11,0x12,0x17,0x11,0x11,0x16,0x10, 0x0f,0x15,0x0f,0x0f,0x15,0x10,0x10,0x16,0x4e,0x56,0x7c,0x57,0x4f,0x73,0x5a,0x4f, 0x71,0x5a,0x4e,0x70,0x58,0x4c,0x6d,0x56,0x4a,0x69,0x4e,0x43,0x5f,0x44,0x3a,0x52, 0x42,0x37,0x4d,0x45,0x39,0x51,0x41,0x36,0x4a,0x3a,0x2f,0x41,0x3f,0x35,0x45,0x44, 0x3b,0x49,0x40,0x33,0x44,0x3f,0x32,0x43,0x55,0x48,0x62,0x4f,0x43,0x55,0x4f,0x45, 0x5a,0x47,0x42,0x57,0x3e,0x3d,0x52,0x42,0x44,0x5a,0x47,0x45,0x5b,0x59,0x53,0x68, 0x72,0x68,0x7a,0x74,0x6a,0x7a,0x5d,0x58,0x71,0x56,0x5c,0x78,0x5e,0x65,0x7f,0x6c, 0x73,0x8a,0x76,0x7d,0x92,0x74,0x7b,0x91,0x72,0x79,0x8f,0x74,0x7c,0x91,0x77,0x7e, 0x93,0x7e,0x84,0x97,0x86,0x8c,0x9c,0x8d,0x92,0xa2,0x8e,0x94,0xa3,0x92,0x96,0xa5, 0x8e,0x94,0xa2,0x83,0x8a,0x9b,0x6e,0x76,0x8c,0x62,0x6a,0x84,0x5a,0x62,0x7d,0x52, 0x5a,0x77,0x51,0x58,0x75,0x4e,0x56,0x72,0x4c,0x53,0x6d,0x49,0x4f,0x69,0x52,0x5a, 0x72,0x61,0x68,0x7d,0x6b,0x72,0x84,0x71,0x77,0x87,0x69,0x6e,0x7e,0x58,0x5d,0x6a, 0x3e,0x42,0x4e,0x27,0x2a,0x34,0x1b,0x1e,0x26,0x18,0x1a,0x22,0x17,0x1a,0x21,0x16, 0x18,0x1f,0x17,0x19,0x20,0x1a,0x1c,0x22,0x1e,0x20,0x26,0x1e,0x21,0x26,0x1e,0x20, 0x26,0x1c,0x1e,0x25,0x1a,0x1d,0x24,0x19,0x1b,0x22,0x4f,0x59,0x7b,0x50,0x51,0x76, 0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a, 0x52,0x73,0x5a,0x53,0x73,0x5a,0x52,0x74,0x5a,0x52,0x74,0x5b,0x52,0x74,0x5b,0x53, 0x74,0x5b,0x52,0x73,0x5b,0x52,0x73,0x61,0x57,0x7a,0x68,0x5b,0x82,0x0f,0x10,0x13, 0x11,0x12,0x15,0x10,0x11,0x13,0x0d,0x0e,0x11,0x0c,0x0d,0x0f,0x0b,0x0c,0x0e,0x0a, 0x0a,0x0c,0x08,0x09,0x0a,0x08,0x09,0x0a,0x07,0x07,0x09,0x06,0x07,0x08,0x06,0x06, 0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x05,0x06,0x04,0x04,0x05, 0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x5a,0x5b,0x5e,0xd7, 0xd9,0xe1,0x82,0x8c,0xab,0x5c,0x49,0x5a,0x46,0x35,0x41,0x42,0x33,0x3e,0x41,0x31, 0x3d,0x3f,0x30,0x3b,0x3f,0x30,0x3b,0x40,0x31,0x3c,0x42,0x32,0x3e,0x43,0x33,0x3e, 0x46,0x35,0x42,0x46,0x36,0x42,0x47,0x37,0x43,0x4a,0x39,0x47,0x4c,0x3b,0x49,0x50, 0x3e,0x4d,0x6c,0x5e,0x77,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,0x03,0x03,0x03,0x59, 0x47,0x59,0x56,0x43,0x53,0x4e,0x3c,0x4a,0x44,0x34,0x40,0x39,0x2b,0x34,0x30,0x27, 0x2c,0x4a,0x4d,0x61,0x4d,0x55,0x75,0x51,0x5c,0x87,0x52,0x55,0x80,0x52,0x50,0x7b, 0x57,0x50,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x64,0x52,0x73,0x60,0x48,0x65,0x5d, 0x45,0x5f,0x57,0x3f,0x58,0x52,0x39,0x52,0x4f,0x38,0x4f,0x54,0x3d,0x55,0x5b,0x43, 0x5d,0x5e,0x46,0x62,0x62,0x4a,0x65,0x64,0x4c,0x69,0x64,0x4f,0x6e,0x64,0x4d,0x6b, 0x54,0x3c,0x54,0x5b,0x43,0x5d,0x64,0x53,0x74,0x55,0x50,0x79,0x81,0x8c,0xab,0x8c, 0x8b,0x97,0x3c,0x2d,0x37,0x3f,0x30,0x3c,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,0x26,0x29,0x30,0x5e,0x6b,0x92,0x64,0x53,0x75,0x60,0x48,0x64, 0x60,0x53,0x77,0x5d,0x52,0x79,0x5d,0x52,0x79,0x5b,0x52,0x79,0x51,0x4a,0x6d,0x30, 0x2d,0x44,0x4d,0x4d,0x52,0xfa,0xfa,0xfa,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xed,0xed,0xed,0x2f,0x31,0x38,0x75,0x75,0x86,0x6d,0x58,0x6e, 0x6e,0x59,0x70,0x65,0x51,0x65,0x6a,0x55,0x6b,0x1f,0x1a,0x21,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,0x61,0x62,0x65,0x56,0x62,0x8b,0x5f,0x47,0x63,0x64,0x53,0x76, 0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x55,0x80,0x52,0x5a,0x84,0x52,0x5c,0x86,0x52, 0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d, 0x88,0x52,0x5b,0x85,0x52,0x57,0x82,0x52,0x54,0x7e,0x64,0x50,0x71,0x64,0x4c,0x69, 0x69,0x72,0x8f,0x04,0x04,0x05,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,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x04, 0x05,0x05,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06, 0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x08,0x09,0x07,0x08,0x09, 0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0d,0x0d,0x0f,0x61, 0x67,0x86,0x53,0x5d,0x84,0x52,0x58,0x80,0x52,0x53,0x7a,0x58,0x51,0x77,0x54,0x51, 0x77,0x52,0x50,0x78,0x53,0x51,0x78,0x54,0x52,0x79,0x54,0x53,0x79,0x54,0x54,0x7a, 0x54,0x54,0x79,0x66,0x59,0x76,0x5c,0x66,0x84,0x4c,0x45,0x53,0x3b,0x3a,0x46,0x2f, 0x2b,0x39,0x32,0x2e,0x3c,0x32,0x2d,0x3b,0x2f,0x2b,0x38,0x2b,0x27,0x35,0x3d,0x35, 0x46,0x3b,0x32,0x40,0x68,0x6e,0x87,0x4b,0x50,0x74,0x4e,0x46,0x65,0x5b,0x50,0x75, 0x5c,0x52,0x77,0x5d,0x53,0x78,0x5e,0x54,0x78,0x5f,0x54,0x76,0x5f,0x54,0x77,0x60, 0x53,0x76,0x5f,0x53,0x76,0x5f,0x54,0x76,0x58,0x4f,0x6f,0x4f,0x48,0x65,0x4d,0x45, 0x5f,0x33,0x32,0x3e,0x40,0x3b,0x49,0x40,0x38,0x47,0x43,0x3a,0x4a,0x41,0x39,0x48, 0x3e,0x36,0x45,0x39,0x32,0x40,0x32,0x2e,0x3c,0x2e,0x2a,0x37,0x27,0x25,0x33,0x65, 0x5f,0x8c,0x53,0x4d,0x6c,0x49,0x43,0x5d,0x58,0x4f,0x6d,0x5e,0x52,0x75,0x62,0x57, 0x78,0x6f,0x66,0x84,0x72,0x68,0x86,0x64,0x59,0x7b,0x60,0x53,0x76,0x5f,0x54,0x76, 0x57,0x4d,0x6e,0x53,0x4a,0x68,0x72,0x64,0x8e,0x41,0x3a,0x52,0x22,0x1f,0x2a,0x28, 0x24,0x30,0x2d,0x2a,0x37,0x2c,0x2a,0x39,0x2d,0x2a,0x38,0x35,0x2e,0x3c,0x36,0x2f, 0x3d,0x39,0x32,0x42,0x42,0x3b,0x4b,0x43,0x3b,0x4c,0x40,0x39,0x4a,0x37,0x32,0x41, 0x33,0x2e,0x3c,0x53,0x47,0x5c,0x43,0x3b,0x4d,0x46,0x3e,0x53,0x5c,0x55,0x75,0x5a, 0x52,0x6f,0x5c,0x53,0x71,0x5a,0x52,0x71,0x56,0x51,0x73,0x4d,0x4c,0x6d,0x30,0x2f, 0x46,0x2d,0x30,0x44,0x28,0x25,0x2f,0x54,0x48,0x5a,0x54,0x48,0x5a,0x8e,0x95,0xaa, 0x58,0x63,0x86,0x54,0x5d,0x80,0x46,0x51,0x6e,0x12,0x13,0x1a,0x12,0x13,0x1a,0x16, 0x15,0x1d,0x21,0x1e,0x27,0x25,0x20,0x2a,0x22,0x1e,0x26,0x19,0x17,0x20,0x14,0x14, 0x1b,0x14,0x14,0x1a,0x14,0x14,0x1a,0x13,0x13,0x1a,0x15,0x14,0x1b,0x17,0x16,0x1d, 0x1a,0x17,0x1e,0x1a,0x18,0x1f,0x18,0x15,0x1b,0x14,0x12,0x18,0x4e,0x55,0x7b,0x56, 0x4e,0x73,0x5a,0x4f,0x71,0x5b,0x4f,0x71,0x5a,0x4e,0x70,0x58,0x4d,0x6d,0x54,0x49, 0x67,0x4a,0x40,0x5b,0x47,0x3d,0x57,0x4a,0x3f,0x59,0x46,0x3b,0x52,0x3b,0x31,0x45, 0x35,0x2b,0x3b,0x37,0x2d,0x3d,0x3a,0x2f,0x40,0x38,0x2c,0x3b,0x3d,0x33,0x47,0x43, 0x36,0x45,0x4e,0x44,0x57,0x4b,0x42,0x56,0x3e,0x3d,0x52,0x44,0x49,0x5f,0x46,0x44, 0x5d,0x4c,0x49,0x61,0x5e,0x55,0x6a,0x61,0x56,0x69,0x5c,0x52,0x67,0x52,0x50,0x6d, 0x53,0x56,0x73,0x59,0x61,0x7c,0x64,0x6a,0x84,0x66,0x6e,0x86,0x6a,0x72,0x8a,0x6e, 0x76,0x8e,0x72,0x79,0x8f,0x77,0x7e,0x93,0x7c,0x83,0x96,0x80,0x86,0x98,0x85,0x8a, 0x9b,0x86,0x8c,0x9c,0x8a,0x8f,0x9e,0x85,0x8b,0x9c,0x7b,0x81,0x95,0x6e,0x76,0x8d, 0x66,0x6e,0x87,0x5c,0x64,0x7e,0x54,0x5c,0x79,0x50,0x55,0x72,0x4d,0x4c,0x68,0x49, 0x48,0x62,0x4b,0x52,0x6b,0x5b,0x63,0x7a,0x62,0x69,0x7e,0x6b,0x72,0x84,0x6d,0x73, 0x84,0x69,0x6f,0x7e,0x56,0x5a,0x68,0x36,0x3a,0x46,0x25,0x28,0x32,0x1e,0x20,0x28, 0x1a,0x1c,0x24,0x19,0x1a,0x22,0x1a,0x1c,0x23,0x1d,0x1e,0x26,0x20,0x22,0x29,0x22, 0x25,0x2c,0x22,0x25,0x2c,0x22,0x25,0x2c,0x22,0x25,0x2c,0x20,0x23,0x2b,0x46,0x4f, 0x6a,0x50,0x51,0x76,0x58,0x52,0x74,0x59,0x52,0x72,0x5a,0x53,0x73,0x5a,0x53,0x74, 0x5a,0x54,0x74,0x5a,0x53,0x73,0x5a,0x52,0x73,0x5a,0x52,0x73,0x5a,0x53,0x74,0x5b, 0x52,0x74,0x5b,0x53,0x74,0x5c,0x53,0x74,0x5b,0x52,0x73,0x5f,0x54,0x77,0x75,0x66, 0x90,0x12,0x13,0x16,0x16,0x16,0x19,0x18,0x19,0x1b,0x13,0x14,0x16,0x11,0x12,0x13, 0x0e,0x0f,0x11,0x0e,0x0e,0x10,0x0c,0x0c,0x0e,0x0a,0x0a,0x0c,0x09,0x09,0x0a,0x07, 0x08,0x0a,0x07,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x06, 0x06,0x05,0x06,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05, 0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,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,0x1a,0x1b,0x1e,0x98,0x9c,0xab,0x83,0x8d,0xac,0x5e,0x4a,0x5d,0x47, 0x37,0x44,0x44,0x34,0x40,0x40,0x31,0x3b,0x40,0x30,0x3b,0x41,0x31,0x3c,0x42,0x33, 0x3e,0x44,0x34,0x40,0x44,0x34,0x40,0x47,0x36,0x43,0x48,0x38,0x45,0x4b,0x3a,0x47, 0x4d,0x3c,0x4a,0x4e,0x3c,0x4a,0x60,0x4d,0x5f,0x16,0x15,0x1d,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,0x29,0x22,0x2a,0x68,0x54,0x69,0x55,0x43,0x53,0x35, 0x27,0x30,0x2a,0x1e,0x24,0x23,0x19,0x1e,0x1f,0x16,0x19,0x1c,0x13,0x16,0x2b,0x26, 0x2d,0x38,0x37,0x44,0x40,0x42,0x56,0x48,0x4d,0x68,0x4a,0x52,0x76,0x52,0x52,0x7c, 0x52,0x4f,0x7a,0x57,0x50,0x79,0x62,0x53,0x77,0x64,0x53,0x76,0x64,0x4d,0x6b,0x5f, 0x47,0x63,0x58,0x40,0x5a,0x54,0x3d,0x55,0x50,0x39,0x52,0x4e,0x37,0x4e,0x4e,0x37, 0x4e,0x55,0x3d,0x55,0x5c,0x44,0x5f,0x64,0x4c,0x69,0x52,0x4f,0x7a,0x6a,0x75,0x9a, 0x8d,0x8d,0x9c,0x3d,0x2f,0x39,0x4b,0x3a,0x48,0x03,0x02,0x03,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,0x02,0x02,0x02,0x63,0x6d,0x8f,0x52,0x4f, 0x7a,0x5f,0x47,0x63,0x62,0x53,0x77,0x5e,0x53,0x79,0x5e,0x53,0x79,0x59,0x50,0x76, 0x45,0x3f,0x5d,0x1f,0x1d,0x2b,0xcc,0xcc,0xcd,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xfd, 0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xb2,0xb2,0xb4,0x42,0x46,0x50,0x85,0x85, 0x98,0x6b,0x57,0x6c,0x6b,0x56,0x6c,0x64,0x50,0x63,0x68,0x54,0x69,0x1a,0x16,0x1b, 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,0x0c,0x0c,0x0c,0x72,0x7b,0x99,0x63,0x53, 0x77,0x62,0x4a,0x66,0x52,0x4f,0x7a,0x52,0x52,0x7c,0x52,0x54,0x7e,0x52,0x57,0x82, 0x52,0x5b,0x85,0x52,0x5c,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5e,0x88,0x52, 0x5d,0x88,0x52,0x5d,0x88,0x52,0x5c,0x86,0x52,0x5a,0x84,0x52,0x55,0x80,0x52,0x4f, 0x7a,0x60,0x48,0x64,0x52,0x4f,0x7a,0x41,0x46,0x54,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,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03, 0x03,0x03,0x04,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x06,0x06,0x05, 0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x07, 0x09,0x07,0x08,0x09,0x08,0x09,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0b, 0x0a,0x0a,0x0c,0x64,0x6c,0x89,0x53,0x5d,0x85,0x52,0x59,0x81,0x52,0x53,0x7a,0x59, 0x52,0x77,0x55,0x50,0x77,0x54,0x51,0x77,0x53,0x51,0x78,0x53,0x52,0x79,0x54,0x54, 0x7b,0x54,0x55,0x7a,0x54,0x54,0x79,0x62,0x55,0x6f,0x5a,0x63,0x84,0x43,0x3f,0x4c, 0x43,0x42,0x4e,0x4d,0x4b,0x56,0x3a,0x38,0x44,0x2d,0x2b,0x38,0x2e,0x2b,0x38,0x2d, 0x29,0x36,0x3f,0x37,0x47,0x3c,0x32,0x40,0x6f,0x73,0x8b,0x4d,0x56,0x7a,0x4a,0x44, 0x62,0x5b,0x50,0x74,0x5c,0x52,0x77,0x5d,0x53,0x77,0x5f,0x53,0x76,0x5f,0x54,0x76, 0x5f,0x54,0x76,0x60,0x53,0x77,0x5f,0x54,0x76,0x5e,0x54,0x75,0x57,0x4e,0x6e,0x4f, 0x47,0x64,0x53,0x4a,0x65,0x2f,0x2a,0x37,0x3d,0x35,0x44,0x44,0x3a,0x4a,0x46,0x3c, 0x4b,0x44,0x3a,0x4a,0x40,0x38,0x47,0x3c,0x35,0x43,0x38,0x31,0x3f,0x34,0x2e,0x3b, 0x2d,0x28,0x35,0x60,0x5d,0x8b,0x50,0x4c,0x6d,0x48,0x44,0x5d,0x56,0x4c,0x6b,0x5e, 0x52,0x74,0x5e,0x53,0x75,0x5e,0x53,0x75,0x67,0x5b,0x7c,0x78,0x6f,0x8c,0x6e,0x62, 0x82,0x5f,0x54,0x77,0x5a,0x4f,0x6f,0x52,0x47,0x65,0x73,0x65,0x8f,0x45,0x3c,0x56, 0x21,0x1d,0x26,0x29,0x24,0x2e,0x31,0x2b,0x36,0x31,0x2a,0x36,0x2d,0x28,0x33,0x34, 0x2c,0x3a,0x3c,0x33,0x41,0x40,0x37,0x47,0x40,0x37,0x47,0x42,0x3a,0x4a,0x45,0x3b, 0x4c,0x40,0x37,0x47,0x3b,0x33,0x41,0x4d,0x42,0x55,0x50,0x44,0x58,0x3c,0x35,0x46, 0x60,0x56,0x76,0x5a,0x51,0x6d,0x5b,0x52,0x6f,0x5a,0x51,0x6f,0x5a,0x51,0x71,0x56, 0x50,0x73,0x39,0x38,0x51,0x2f,0x2e,0x45,0x1f,0x22,0x2f,0x3e,0x36,0x44,0x54,0x48, 0x5a,0x82,0x7f,0x8f,0x6b,0x74,0x93,0x54,0x5d,0x81,0x51,0x5c,0x80,0x3c,0x43,0x5e, 0x14,0x16,0x1d,0x16,0x15,0x1c,0x24,0x1f,0x29,0x2a,0x24,0x2e,0x28,0x23,0x2d,0x1f, 0x1c,0x25,0x16,0x16,0x1d,0x1e,0x1a,0x23,0x21,0x1d,0x26,0x21,0x1d,0x25,0x23,0x1f, 0x27,0x26,0x22,0x2a,0x28,0x22,0x2b,0x29,0x22,0x2c,0x26,0x21,0x2a,0x1f,0x1b,0x22, 0x4f,0x54,0x79,0x56,0x4e,0x72,0x5a,0x50,0x71,0x5c,0x50,0x72,0x5b,0x50,0x72,0x5a, 0x4e,0x71,0x59,0x4d,0x6e,0x56,0x4a,0x69,0x52,0x47,0x65,0x51,0x45,0x62,0x4e,0x42, 0x5d,0x44,0x39,0x51,0x3a,0x31,0x45,0x3c,0x31,0x45,0x3d,0x31,0x44,0x37,0x2d,0x3d, 0x39,0x30,0x44,0x2a,0x21,0x29,0x3c,0x30,0x3b,0x3f,0x32,0x40,0x44,0x39,0x48,0x4a, 0x42,0x54,0x4e,0x46,0x5e,0x52,0x4a,0x62,0x54,0x4b,0x62,0x53,0x48,0x5d,0x53,0x47, 0x5c,0x58,0x4e,0x66,0x53,0x53,0x6f,0x54,0x59,0x75,0x56,0x5e,0x7a,0x5d,0x65,0x7f, 0x6a,0x72,0x8a,0x6e,0x76,0x8d,0x6e,0x76,0x8e,0x71,0x79,0x8e,0x76,0x7d,0x92,0x76, 0x7e,0x92,0x76,0x7e,0x92,0x7a,0x81,0x95,0x7e,0x84,0x97,0x7e,0x85,0x97,0x85,0x8a, 0x9b,0x7e,0x84,0x97,0x72,0x7a,0x8f,0x68,0x70,0x88,0x5e,0x66,0x81,0x55,0x5d,0x7a, 0x50,0x50,0x6d,0x4d,0x4c,0x68,0x4c,0x4e,0x6a,0x52,0x59,0x72,0x60,0x67,0x7d,0x6d, 0x73,0x86,0x72,0x78,0x8a,0x6f,0x75,0x86,0x62,0x68,0x78,0x49,0x4e,0x5d,0x30,0x34, 0x40,0x24,0x27,0x32,0x1e,0x21,0x2a,0x1c,0x1e,0x27,0x1e,0x20,0x28,0x1f,0x22,0x2a, 0x22,0x25,0x2d,0x26,0x29,0x30,0x29,0x2b,0x33,0x2c,0x2e,0x36,0x2b,0x2e,0x36,0x26, 0x2a,0x32,0x40,0x48,0x5e,0x52,0x53,0x77,0x58,0x54,0x74,0x5a,0x54,0x74,0x5a,0x53, 0x73,0x5a,0x53,0x73,0x5a,0x53,0x73,0x5a,0x54,0x73,0x5a,0x53,0x73,0x5a,0x53,0x73, 0x5b,0x54,0x74,0x5b,0x53,0x74,0x5b,0x54,0x74,0x5c,0x54,0x75,0x5c,0x54,0x74,0x5e, 0x53,0x75,0x6f,0x64,0x8b,0x17,0x18,0x1c,0x1c,0x1d,0x20,0x22,0x22,0x25,0x1a,0x1a, 0x1d,0x15,0x16,0x19,0x12,0x13,0x16,0x11,0x12,0x13,0x0f,0x10,0x12,0x0d,0x0e,0x10, 0x0b,0x0c,0x0e,0x0a,0x0a,0x0c,0x08,0x09,0x0a,0x08,0x09,0x0a,0x07,0x07,0x09,0x07, 0x07,0x09,0x06,0x07,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x04,0x04, 0x05,0x04,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03, 0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x04,0x04,0x04,0x5e,0x62,0x6f, 0x8d,0x96,0xb2,0x6c,0x57,0x6d,0x47,0x36,0x43,0x44,0x34,0x40,0x42,0x33,0x3e,0x42, 0x32,0x3d,0x43,0x33,0x3e,0x44,0x34,0x40,0x45,0x35,0x41,0x47,0x37,0x44,0x4a,0x39, 0x46,0x4c,0x3b,0x48,0x4d,0x3b,0x49,0x4f,0x3d,0x4b,0x51,0x3f,0x4e,0x78,0x64,0x7e, 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, 0x23,0x1c,0x23,0x3d,0x2f,0x3a,0x40,0x31,0x3b,0x37,0x29,0x32,0x30,0x23,0x2b,0x2b, 0x1f,0x25,0x2b,0x1f,0x25,0x2b,0x1f,0x25,0x28,0x1c,0x22,0x23,0x19,0x1d,0x1e,0x15, 0x18,0x1d,0x15,0x18,0x35,0x2f,0x37,0x42,0x40,0x4e,0x4a,0x4d,0x62,0x4e,0x54,0x71, 0x51,0x5b,0x80,0x53,0x5e,0x88,0x52,0x55,0x80,0x52,0x4f,0x7a,0x5a,0x52,0x79,0x64, 0x53,0x75,0x64,0x4e,0x6c,0x64,0x4d,0x6b,0x5e,0x53,0x79,0x5e,0x53,0x79,0x8e,0x98, 0xb3,0x96,0x95,0xa4,0x3f,0x31,0x3b,0x4c,0x3b,0x49,0x08,0x06,0x08,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,0x49, 0x4f,0x63,0x52,0x57,0x83,0x63,0x4b,0x67,0x64,0x4f,0x6d,0x60,0x53,0x77,0x5e,0x53, 0x79,0x53,0x4a,0x6e,0x35,0x2f,0x46,0x41,0x40,0x46,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x53,0x54,0x59,0x5c, 0x61,0x70,0x91,0x94,0xa7,0x67,0x52,0x67,0x68,0x54,0x69,0x62,0x4e,0x62,0x68,0x53, 0x68,0x15,0x12,0x16,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,0x67, 0x69,0x70,0x52,0x5d,0x88,0x5f,0x47,0x63,0x5c,0x52,0x79,0x52,0x52,0x7c,0x52,0x53, 0x7e,0x52,0x55,0x81,0x52,0x5a,0x84,0x52,0x5c,0x86,0x52,0x5d,0x86,0x52,0x5d,0x88, 0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5b,0x85,0x52,0x57,0x83,0x52, 0x55,0x80,0x52,0x52,0x7d,0x60,0x53,0x77,0x5f,0x48,0x64,0x58,0x63,0x89,0x16,0x17, 0x1a,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x06, 0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x07, 0x07,0x09,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x08,0x09,0x08,0x09,0x0a,0x08,0x09, 0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x0b,0x63,0x69,0x85,0x53,0x5d,0x84,0x52,0x5a,0x82, 0x52,0x53,0x7a,0x58,0x51,0x77,0x55,0x51,0x77,0x55,0x51,0x77,0x53,0x51,0x78,0x53, 0x52,0x79,0x54,0x52,0x79,0x54,0x55,0x7a,0x54,0x54,0x79,0x62,0x53,0x6c,0x5c,0x65, 0x84,0x38,0x34,0x41,0x2f,0x2e,0x39,0x3f,0x3e,0x49,0x2b,0x28,0x36,0x2a,0x28,0x35, 0x2c,0x28,0x35,0x2c,0x27,0x34,0x3e,0x36,0x46,0x39,0x31,0x3f,0x6e,0x71,0x87,0x52, 0x5c,0x7f,0x49,0x43,0x62,0x59,0x4f,0x72,0x5c,0x52,0x77,0x5d,0x52,0x77,0x5e,0x53, 0x78,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x53,0x77,0x5f,0x54,0x76,0x5e,0x53,0x76, 0x55,0x4d,0x6b,0x4f,0x49,0x66,0x57,0x4b,0x66,0x34,0x2d,0x3a,0x3f,0x37,0x45,0x44, 0x3a,0x49,0x45,0x3b,0x4a,0x44,0x39,0x49,0x42,0x39,0x48,0x40,0x36,0x46,0x3d,0x35, 0x43,0x3a,0x32,0x40,0x31,0x2a,0x37,0x5d,0x5e,0x89,0x4b,0x4b,0x6e,0x45,0x40,0x5c, 0x53,0x4b,0x6a,0x5e,0x52,0x74,0x5e,0x52,0x74,0x5e,0x53,0x75,0x5f,0x52,0x75,0x60, 0x55,0x77,0x72,0x67,0x86,0x6c,0x62,0x82,0x5a,0x4f,0x6f,0x4d,0x42,0x5e,0x72,0x61, 0x8b,0x4c,0x41,0x5d,0x1e,0x1a,0x22,0x2c,0x26,0x30,0x36,0x2e,0x3a,0x37,0x2f,0x3c, 0x33,0x2c,0x38,0x3a,0x31,0x3e,0x42,0x39,0x47,0x43,0x3a,0x49,0x43,0x39,0x48,0x48, 0x3e,0x4d,0x4d,0x40,0x51,0x4c,0x3f,0x50,0x49,0x3d,0x4d,0x45,0x3b,0x4c,0x5f,0x50, 0x66,0x48,0x3e,0x51,0x49,0x41,0x58,0x5d,0x53,0x70,0x5a,0x51,0x6d,0x5a,0x52,0x70, 0x5b,0x51,0x6f,0x59,0x51,0x71,0x55,0x50,0x72,0x31,0x2f,0x47,0x2f,0x2d,0x43,0x13, 0x15,0x1c,0x4a,0x3f,0x50,0x54,0x47,0x59,0x84,0x85,0x99,0x57,0x62,0x85,0x50,0x5b, 0x80,0x4e,0x58,0x7d,0x3d,0x43,0x60,0x14,0x14,0x1c,0x18,0x17,0x1e,0x22,0x1e,0x27, 0x23,0x1e,0x28,0x1a,0x19,0x21,0x16,0x16,0x1d,0x21,0x1d,0x26,0x26,0x22,0x2a,0x29, 0x23,0x2c,0x2e,0x27,0x32,0x32,0x2a,0x35,0x32,0x2a,0x34,0x32,0x29,0x34,0x2d,0x26, 0x2f,0x23,0x1e,0x26,0x4e,0x55,0x79,0x54,0x4e,0x71,0x59,0x51,0x73,0x5a,0x51,0x75, 0x5b,0x51,0x75,0x5c,0x50,0x72,0x5b,0x4f,0x71,0x5a,0x4e,0x70,0x57,0x4d,0x6d,0x55, 0x49,0x69,0x52,0x47,0x65,0x4f,0x44,0x61,0x4a,0x3f,0x58,0x44,0x39,0x50,0x42,0x35, 0x4a,0x3a,0x30,0x41,0x3a,0x31,0x45,0x2d,0x22,0x2d,0x30,0x26,0x30,0x35,0x2a,0x35, 0x3d,0x31,0x3e,0x44,0x37,0x45,0x54,0x45,0x56,0x56,0x4b,0x60,0x55,0x4a,0x62,0x4e, 0x44,0x58,0x4b,0x41,0x55,0x54,0x4a,0x5f,0x51,0x4e,0x6a,0x53,0x54,0x72,0x53,0x5a, 0x77,0x58,0x60,0x7c,0x63,0x6a,0x85,0x6a,0x72,0x8a,0x6d,0x74,0x8c,0x6b,0x73,0x8b, 0x6d,0x75,0x8c,0x67,0x6f,0x88,0x65,0x6c,0x86,0x6b,0x73,0x8b,0x72,0x7a,0x90,0x77, 0x7e,0x93,0x7e,0x84,0x97,0x7f,0x86,0x98,0x79,0x80,0x94,0x6e,0x76,0x8d,0x62,0x6b, 0x85,0x57,0x5f,0x7a,0x52,0x56,0x73,0x51,0x52,0x6f,0x4f,0x4f,0x6c,0x4e,0x52,0x6e, 0x57,0x5e,0x78,0x66,0x6d,0x82,0x6d,0x74,0x88,0x6d,0x73,0x86,0x64,0x6a,0x7d,0x58, 0x5e,0x6e,0x46,0x4a,0x5a,0x30,0x35,0x42,0x25,0x28,0x34,0x20,0x22,0x2c,0x1f,0x22, 0x2a,0x22,0x24,0x2c,0x26,0x28,0x30,0x2a,0x2d,0x35,0x2e,0x31,0x39,0x33,0x36,0x3e, 0x32,0x35,0x3e,0x2b,0x2e,0x37,0x3d,0x43,0x55,0x52,0x55,0x78,0x56,0x54,0x75,0x59, 0x54,0x73,0x5a,0x55,0x74,0x5a,0x54,0x74,0x5a,0x54,0x74,0x5a,0x54,0x73,0x5a,0x54, 0x74,0x5a,0x55,0x74,0x5b,0x54,0x74,0x5b,0x54,0x74,0x5b,0x54,0x74,0x5c,0x54,0x74, 0x5c,0x54,0x74,0x5b,0x52,0x73,0x6a,0x60,0x84,0x1d,0x1d,0x22,0x1e,0x1f,0x22,0x21, 0x22,0x25,0x1d,0x1e,0x20,0x1a,0x1a,0x1c,0x18,0x18,0x1a,0x14,0x15,0x17,0x12,0x13, 0x16,0x0f,0x10,0x12,0x0d,0x0e,0x10,0x0b,0x0b,0x0e,0x0a,0x0a,0x0d,0x09,0x0a,0x0b, 0x08,0x09,0x0a,0x08,0x08,0x0a,0x08,0x09,0x0a,0x06,0x07,0x09,0x06,0x07,0x09,0x06, 0x06,0x07,0x05,0x06,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x05,0x03,0x03, 0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x26,0x29,0x32,0x75,0x7f,0x9b,0x77,0x63,0x7c,0x47,0x37,0x44, 0x44,0x34,0x3f,0x43,0x33,0x3f,0x42,0x33,0x3e,0x44,0x34,0x40,0x45,0x35,0x41,0x47, 0x37,0x44,0x4a,0x39,0x46,0x4a,0x39,0x47,0x4c,0x3b,0x49,0x4f,0x3d,0x4c,0x51,0x3f, 0x4e,0x5a,0x47,0x59,0x2f,0x2e,0x3f,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,0x02,0x02,0x02,0x0c,0x09,0x0c, 0x1f,0x18,0x1e,0x3c,0x2f,0x39,0x4a,0x39,0x46,0x4a,0x39,0x47,0x44,0x34,0x3f,0x42, 0x32,0x3d,0x39,0x2b,0x34,0x32,0x25,0x2c,0x30,0x23,0x2b,0x2e,0x22,0x29,0x2b,0x1f, 0x25,0x2b,0x1f,0x25,0x2a,0x1e,0x24,0x33,0x29,0x2f,0x51,0x49,0x50,0x64,0x5f,0x69, 0x77,0x78,0x86,0x85,0x89,0x9b,0x96,0x9f,0xb6,0x8e,0x99,0xb4,0x88,0x92,0xaf,0x8e, 0x98,0xb3,0x9b,0x96,0x9d,0x47,0x37,0x43,0x4c,0x3b,0x49,0x0b,0x09,0x0b,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,0x2b,0x2d,0x32,0x60,0x6c,0x93,0x62,0x53,0x77,0x60,0x4a,0x65,0x64, 0x53,0x76,0x5c,0x51,0x77,0x49,0x41,0x5e,0x22,0x1e,0x2d,0xc5,0xc5,0xc6,0xff,0xff, 0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xf2,0xf2,0xf2, 0x17,0x19,0x25,0x70,0x77,0x8a,0x9a,0x9e,0xb4,0x62,0x4e,0x62,0x64,0x50,0x64,0x62, 0x4e,0x62,0x68,0x53,0x68,0x0f,0x0c,0x0f,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,0x15,0x15,0x15,0x6d,0x77,0x98,0x64,0x53,0x76,0x64,0x4e,0x6d,0x52, 0x50,0x7b,0x52,0x52,0x7d,0x52,0x55,0x80,0x52,0x57,0x82,0x52,0x5a,0x84,0x52,0x5c, 0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5c,0x86, 0x52,0x5a,0x84,0x52,0x55,0x80,0x52,0x53,0x7e,0x52,0x4f,0x7b,0x63,0x4b,0x67,0x64, 0x52,0x72,0x4e,0x57,0x70,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04, 0x05,0x04,0x05,0x05,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07, 0x06,0x06,0x07,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x08,0x09,0x07,0x08,0x09,0x08, 0x08,0x0a,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x66,0x6b,0x86,0x54,0x5e, 0x85,0x52,0x5c,0x82,0x52,0x53,0x7b,0x54,0x51,0x77,0x55,0x51,0x77,0x55,0x52,0x77, 0x53,0x51,0x78,0x54,0x51,0x79,0x54,0x52,0x79,0x54,0x55,0x7b,0x54,0x53,0x79,0x62, 0x56,0x72,0x5d,0x66,0x84,0x3b,0x35,0x42,0x25,0x25,0x2f,0x3d,0x3c,0x46,0x30,0x2e, 0x3b,0x27,0x25,0x32,0x26,0x25,0x31,0x24,0x22,0x2e,0x37,0x32,0x40,0x37,0x2e,0x3b, 0x65,0x69,0x79,0x58,0x62,0x84,0x47,0x42,0x62,0x55,0x4c,0x6d,0x5c,0x52,0x77,0x5d, 0x52,0x77,0x5e,0x53,0x78,0x5f,0x53,0x76,0x5f,0x54,0x76,0x5f,0x54,0x76,0x5f,0x53, 0x76,0x5e,0x53,0x75,0x55,0x4b,0x6b,0x4e,0x47,0x64,0x54,0x49,0x64,0x31,0x2b,0x37, 0x3d,0x34,0x44,0x44,0x39,0x49,0x44,0x3a,0x49,0x44,0x3a,0x49,0x43,0x39,0x49,0x42, 0x38,0x46,0x3f,0x36,0x44,0x3d,0x34,0x42,0x35,0x2e,0x3a,0x5b,0x5f,0x85,0x4b,0x4c, 0x71,0x43,0x40,0x5c,0x51,0x49,0x68,0x5d,0x51,0x74,0x5e,0x52,0x75,0x5e,0x53,0x75, 0x5f,0x52,0x75,0x5e,0x53,0x75,0x61,0x55,0x78,0x7a,0x70,0x8c,0x5c,0x51,0x72,0x4b, 0x40,0x5b,0x6a,0x5d,0x83,0x4f,0x44,0x63,0x1e,0x1a,0x22,0x32,0x2a,0x35,0x3a,0x30, 0x3d,0x3a,0x32,0x3f,0x36,0x2e,0x3b,0x35,0x2f,0x3d,0x3f,0x36,0x45,0x44,0x3a,0x4a, 0x45,0x3c,0x4b,0x4a,0x3f,0x4f,0x4e,0x41,0x52,0x4f,0x42,0x53,0x4e,0x41,0x52,0x4b, 0x3f,0x4f,0x54,0x47,0x5b,0x58,0x4a,0x5e,0x3d,0x35,0x45,0x61,0x57,0x75,0x5a,0x50, 0x6c,0x5a,0x51,0x6e,0x5a,0x51,0x6e,0x5b,0x51,0x6f,0x5b,0x51,0x70,0x42,0x3c,0x56, 0x30,0x2e,0x45,0x25,0x27,0x37,0x18,0x18,0x1f,0x52,0x46,0x58,0x54,0x47,0x5a,0x73, 0x7a,0x96,0x51,0x5c,0x80,0x4e,0x58,0x7d,0x4d,0x58,0x7d,0x37,0x3e,0x57,0x13,0x13, 0x1a,0x14,0x14,0x1b,0x15,0x14,0x1b,0x12,0x12,0x18,0x11,0x11,0x16,0x14,0x13,0x1a, 0x1e,0x1a,0x22,0x27,0x22,0x2a,0x32,0x2a,0x35,0x34,0x2a,0x36,0x32,0x29,0x33,0x2e, 0x26,0x30,0x25,0x20,0x29,0x1e,0x1d,0x27,0x4c,0x53,0x78,0x51,0x4e,0x72,0x58,0x50, 0x74,0x59,0x51,0x76,0x5b,0x51,0x76,0x5b,0x51,0x76,0x5b,0x51,0x76,0x5d,0x50,0x72, 0x5a,0x4f,0x71,0x59,0x4d,0x6f,0x57,0x4b,0x6c,0x54,0x48,0x67,0x4f,0x44,0x61,0x4a, 0x40,0x5a,0x49,0x3c,0x53,0x42,0x36,0x4a,0x3f,0x35,0x4a,0x2f,0x26,0x2f,0x33,0x28, 0x33,0x36,0x2a,0x35,0x3f,0x32,0x41,0x42,0x35,0x42,0x4a,0x3c,0x4a,0x55,0x4a,0x5e, 0x54,0x4a,0x62,0x4e,0x46,0x5e,0x4a,0x43,0x58,0x4f,0x49,0x61,0x51,0x4b,0x65,0x52, 0x4f,0x6a,0x52,0x54,0x71,0x56,0x5e,0x7a,0x5e,0x66,0x80,0x65,0x6c,0x86,0x64,0x6d, 0x86,0x66,0x6e,0x87,0x66,0x6e,0x87,0x62,0x6a,0x84,0x5b,0x63,0x7e,0x5d,0x66,0x7f, 0x66,0x6e,0x87,0x6e,0x76,0x8d,0x76,0x7e,0x92,0x7e,0x83,0x96,0x7e,0x85,0x97,0x76, 0x7e,0x92,0x6a,0x72,0x8a,0x5f,0x68,0x82,0x58,0x61,0x7c,0x52,0x5a,0x77,0x52,0x55, 0x72,0x50,0x53,0x70,0x52,0x5a,0x75,0x5b,0x63,0x7c,0x65,0x6d,0x82,0x69,0x6f,0x83, 0x69,0x6f,0x83,0x69,0x6e,0x81,0x5d,0x63,0x74,0x42,0x48,0x57,0x2c,0x30,0x3e,0x26, 0x2a,0x36,0x29,0x2c,0x36,0x26,0x2a,0x32,0x29,0x2c,0x35,0x2b,0x2e,0x36,0x34,0x36, 0x3e,0x35,0x38,0x40,0x34,0x37,0x3f,0x2d,0x30,0x39,0x37,0x3c,0x4b,0x53,0x58,0x7b, 0x54,0x53,0x74,0x59,0x54,0x73,0x59,0x54,0x74,0x5a,0x55,0x74,0x5a,0x55,0x74,0x5a, 0x55,0x74,0x5a,0x55,0x74,0x5a,0x54,0x74,0x5b,0x55,0x75,0x5c,0x55,0x75,0x5c,0x55, 0x75,0x5b,0x54,0x74,0x5c,0x55,0x75,0x59,0x52,0x70,0x65,0x5c,0x80,0x1d,0x1e,0x23, 0x1b,0x1c,0x20,0x1e,0x1e,0x22,0x1c,0x1d,0x1f,0x1a,0x1b,0x1e,0x1a,0x1a,0x1d,0x16, 0x17,0x1a,0x15,0x16,0x17,0x13,0x13,0x16,0x11,0x12,0x13,0x0e,0x0e,0x12,0x0c,0x0d, 0x0f,0x0c,0x0c,0x0e,0x0a,0x0b,0x0d,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x08,0x09,0x0a, 0x07,0x08,0x0a,0x07,0x07,0x09,0x06,0x06,0x08,0x06,0x06,0x06,0x05,0x06,0x06,0x04, 0x05,0x06,0x04,0x04,0x05,0x03,0x04,0x04,0x03,0x04,0x04,0x03,0x03,0x04,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x0b,0x0c,0x0f,0x4f,0x56, 0x70,0x68,0x66,0x8b,0x45,0x35,0x41,0x44,0x34,0x40,0x44,0x34,0x3f,0x44,0x34,0x3f, 0x46,0x35,0x42,0x48,0x37,0x44,0x4b,0x3a,0x47,0x4c,0x3b,0x49,0x4c,0x3b,0x49,0x51, 0x3f,0x4e,0x51,0x3f,0x4e,0x54,0x42,0x51,0x6d,0x58,0x6e,0x08,0x08,0x0b,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,0x05,0x04,0x05, 0x0f,0x0b,0x0e,0x20,0x19,0x1f,0x39,0x2d,0x38,0x4d,0x3c,0x4a,0x52,0x40,0x4f,0x4c, 0x3b,0x48,0x46,0x36,0x42,0x40,0x31,0x3b,0x3b,0x2c,0x36,0x3b,0x2d,0x36,0x3e,0x2f, 0x39,0x38,0x2a,0x33,0x39,0x2a,0x33,0x3d,0x2e,0x38,0x40,0x30,0x3b,0x4d,0x3f,0x4b, 0x5d,0x53,0x61,0x52,0x45,0x52,0x4d,0x3c,0x49,0x53,0x41,0x50,0x13,0x0f,0x13,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,0x03,0x03,0x03,0x90,0x97,0xab,0x52,0x55,0x81, 0x62,0x4a,0x66,0x64,0x4f,0x6d,0x56,0x4c,0x6f,0x38,0x31,0x48,0x41,0x40,0x45,0xfc, 0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8,0xf8,0xff,0xff,0xff,0xff,0xff, 0xff,0xc3,0xc2,0xc3,0x20,0x23,0x34,0x7b,0x83,0x98,0x9c,0xa2,0xb8,0x5f,0x4b,0x5e, 0x62,0x4e,0x62,0x62,0x4e,0x62,0x68,0x53,0x68,0x0a,0x08,0x0a,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,0x68,0x6c,0x77,0x52,0x5b,0x85, 0x62,0x4a,0x66,0x58,0x52,0x79,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x55,0x81,0x52, 0x5a,0x84,0x52,0x5b,0x85,0x52,0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5d, 0x86,0x52,0x5b,0x85,0x52,0x57,0x83,0x52,0x55,0x81,0x52,0x54,0x7e,0x52,0x52,0x7c, 0x53,0x50,0x7a,0x5d,0x45,0x5f,0x52,0x53,0x7e,0x30,0x34,0x3d,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,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x03,0x03, 0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06, 0x07,0x05,0x06,0x06,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x09, 0x08,0x08,0x0a,0x08,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x68, 0x6e,0x89,0x55,0x5f,0x87,0x52,0x5d,0x83,0x52,0x53,0x7a,0x56,0x51,0x77,0x58,0x52, 0x78,0x55,0x52,0x77,0x52,0x50,0x78,0x53,0x51,0x79,0x54,0x54,0x7b,0x54,0x55,0x7b, 0x55,0x53,0x78,0x62,0x54,0x70,0x60,0x68,0x85,0x3e,0x37,0x43,0x1a,0x1d,0x25,0x24, 0x25,0x2e,0x47,0x47,0x50,0x20,0x20,0x2b,0x20,0x1f,0x2a,0x1e,0x1d,0x27,0x31,0x2b, 0x38,0x33,0x2b,0x37,0x5b,0x5c,0x6a,0x5c,0x67,0x88,0x48,0x44,0x66,0x54,0x4a,0x6b, 0x5c,0x52,0x76,0x5d,0x52,0x77,0x5e,0x53,0x78,0x5e,0x53,0x78,0x5e,0x53,0x78,0x5e, 0x54,0x78,0x5f,0x53,0x76,0x5e,0x53,0x75,0x55,0x4c,0x6a,0x4d,0x45,0x61,0x52,0x49, 0x63,0x2a,0x26,0x32,0x36,0x30,0x3d,0x3f,0x37,0x44,0x42,0x39,0x47,0x43,0x39,0x48, 0x43,0x39,0x48,0x43,0x39,0x48,0x41,0x37,0x45,0x3f,0x36,0x43,0x3a,0x31,0x3e,0x5a, 0x5a,0x7c,0x4e,0x4d,0x72,0x42,0x3f,0x5d,0x4d,0x46,0x62,0x5d,0x51,0x73,0x5e,0x52, 0x74,0x5e,0x53,0x75,0x5e,0x52,0x75,0x5e,0x53,0x76,0x5f,0x53,0x75,0x7a,0x70,0x8c, 0x5c,0x51,0x73,0x4b,0x41,0x5c,0x66,0x58,0x7e,0x52,0x47,0x67,0x1a,0x17,0x1e,0x2f, 0x28,0x33,0x36,0x2e,0x3a,0x39,0x31,0x3f,0x3a,0x31,0x3e,0x3b,0x32,0x40,0x41,0x37, 0x47,0x45,0x3c,0x4b,0x48,0x3d,0x4e,0x4c,0x41,0x50,0x50,0x42,0x53,0x50,0x43,0x53, 0x4f,0x42,0x53,0x4c,0x40,0x50,0x46,0x3c,0x4b,0x64,0x54,0x6a,0x4a,0x40,0x51,0x4e, 0x44,0x5d,0x5d,0x51,0x6b,0x5a,0x4d,0x69,0x5a,0x4e,0x6b,0x5a,0x50,0x6d,0x5a,0x51, 0x6f,0x57,0x4d,0x6c,0x33,0x2f,0x46,0x2f,0x2d,0x44,0x15,0x17,0x1f,0x32,0x2d,0x39, 0x54,0x46,0x59,0x79,0x75,0x86,0x5a,0x62,0x86,0x4f,0x59,0x7e,0x4d,0x58,0x7c,0x4e, 0x57,0x7b,0x36,0x3c,0x52,0x10,0x11,0x17,0x10,0x10,0x16,0x0f,0x10,0x16,0x0e,0x0f, 0x14,0x0e,0x0f,0x15,0x11,0x11,0x16,0x1a,0x17,0x1e,0x23,0x1e,0x27,0x26,0x22,0x2a, 0x24,0x1f,0x28,0x20,0x1d,0x26,0x1b,0x1b,0x25,0x1e,0x21,0x2c,0x51,0x5b,0x7e,0x53, 0x53,0x77,0x58,0x54,0x77,0x58,0x54,0x77,0x5a,0x53,0x77,0x5a,0x52,0x77,0x5c,0x53, 0x77,0x5c,0x51,0x77,0x5b,0x51,0x76,0x5c,0x50,0x72,0x5a,0x4f,0x71,0x58,0x4d,0x6d, 0x55,0x49,0x69,0x50,0x45,0x62,0x4f,0x42,0x5c,0x4a,0x3e,0x54,0x44,0x3a,0x51,0x36, 0x2b,0x38,0x3a,0x2e,0x3a,0x3f,0x32,0x41,0x41,0x35,0x43,0x3e,0x32,0x40,0x3f,0x33, 0x42,0x49,0x3e,0x51,0x4b,0x45,0x5c,0x48,0x46,0x5f,0x4b,0x47,0x62,0x4d,0x47,0x60, 0x4a,0x44,0x5c,0x4e,0x4a,0x62,0x51,0x4d,0x69,0x52,0x57,0x73,0x58,0x60,0x7b,0x5e, 0x66,0x80,0x5f,0x67,0x82,0x64,0x6b,0x85,0x66,0x6e,0x87,0x62,0x6a,0x83,0x5e,0x66, 0x81,0x5a,0x62,0x7d,0x59,0x61,0x7c,0x5f,0x68,0x81,0x72,0x79,0x8f,0x79,0x80,0x94, 0x7d,0x83,0x96,0x7b,0x82,0x96,0x75,0x7c,0x92,0x6c,0x74,0x8b,0x62,0x6a,0x83,0x59, 0x62,0x7d,0x53,0x5b,0x78,0x52,0x57,0x75,0x52,0x56,0x73,0x52,0x59,0x75,0x5a,0x61, 0x7a,0x66,0x6e,0x84,0x68,0x6f,0x84,0x6b,0x72,0x86,0x66,0x6c,0x7e,0x51,0x57,0x6a, 0x39,0x3e,0x4f,0x2f,0x34,0x43,0x2f,0x33,0x40,0x2f,0x33,0x3e,0x2f,0x32,0x3c,0x31, 0x34,0x3d,0x35,0x38,0x41,0x36,0x39,0x41,0x32,0x36,0x3e,0x2d,0x30,0x39,0x30,0x34, 0x40,0x53,0x5c,0x7e,0x55,0x54,0x74,0x59,0x54,0x73,0x59,0x54,0x73,0x5a,0x55,0x75, 0x5b,0x56,0x75,0x5b,0x56,0x75,0x5c,0x56,0x75,0x5c,0x56,0x75,0x5c,0x55,0x75,0x5c, 0x55,0x75,0x5c,0x55,0x75,0x5c,0x55,0x75,0x5e,0x56,0x75,0x59,0x51,0x71,0x61,0x58, 0x7a,0x21,0x21,0x29,0x19,0x1a,0x1e,0x19,0x1a,0x1e,0x19,0x1a,0x1e,0x19,0x1a,0x1e, 0x19,0x1a,0x1d,0x16,0x18,0x1a,0x16,0x17,0x1a,0x16,0x16,0x19,0x14,0x15,0x17,0x12, 0x13,0x16,0x0f,0x10,0x12,0x0f,0x10,0x12,0x0d,0x0e,0x10,0x0b,0x0c,0x0e,0x0a,0x0b, 0x0d,0x0a,0x0a,0x0c,0x09,0x09,0x0a,0x08,0x09,0x0a,0x07,0x08,0x0a,0x07,0x07,0x09, 0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x06,0x06,0x04,0x05,0x06,0x04,0x04,0x05,0x03, 0x04,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,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,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,0x30,0x33,0x44,0x66,0x66,0x8b,0x4c,0x3b,0x49,0x44,0x34, 0x40,0x45,0x35,0x41,0x46,0x36,0x42,0x48,0x37,0x44,0x4a,0x39,0x47,0x4d,0x3c,0x49, 0x4c,0x3b,0x49,0x4f,0x3e,0x4c,0x51,0x3f,0x4e,0x53,0x41,0x50,0x59,0x46,0x57,0x65, 0x5c,0x79,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, 0x04,0x03,0x03,0x0b,0x09,0x0b,0x1e,0x17,0x1d,0x34,0x29,0x33,0x48,0x39,0x46,0x5e, 0x4a,0x5c,0x66,0x52,0x66,0x61,0x4e,0x60,0x5c,0x49,0x5b,0x52,0x40,0x4f,0x55,0x43, 0x53,0x5f,0x4c,0x5e,0x64,0x50,0x64,0x67,0x53,0x68,0x60,0x4e,0x63,0x11,0x0e,0x11, 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,0x77,0x78, 0x7b,0x66,0x73,0x98,0x64,0x53,0x74,0x61,0x49,0x65,0x4e,0x42,0x5f,0x24,0x20,0x2f, 0xbd,0xbd,0xbd,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfd,0xfd,0xfd,0xff, 0xff,0xff,0xff,0xff,0xff,0x65,0x62,0x65,0x2f,0x30,0x48,0x86,0x8e,0xa7,0x9b,0xa2, 0xb9,0x5b,0x48,0x59,0x60,0x4d,0x60,0x62,0x4e,0x62,0x68,0x53,0x68,0x08,0x06,0x08, 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,0x1c,0x1c, 0x1d,0x6b,0x76,0x9a,0x64,0x53,0x76,0x64,0x53,0x73,0x52,0x50,0x7b,0x52,0x53,0x7d, 0x52,0x55,0x80,0x52,0x57,0x82,0x52,0x5a,0x84,0x52,0x5c,0x86,0x52,0x5c,0x86,0x52, 0x5d,0x86,0x52,0x5b,0x85,0x52,0x5b,0x85,0x52,0x5a,0x84,0x52,0x55,0x80,0x52,0x53, 0x7d,0x52,0x52,0x7c,0x52,0x4f,0x7b,0x64,0x53,0x76,0x5d,0x45,0x5f,0x5c,0x66,0x89, 0x11,0x11,0x11,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,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x05,0x05, 0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x07,0x07, 0x09,0x07,0x08,0x09,0x07,0x08,0x09,0x08,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b, 0x09,0x0a,0x0b,0x68,0x6e,0x89,0x55,0x60,0x87,0x52,0x5d,0x84,0x52,0x54,0x7c,0x58, 0x52,0x78,0x59,0x52,0x78,0x55,0x52,0x77,0x52,0x50,0x78,0x53,0x52,0x79,0x53,0x52, 0x7a,0x54,0x55,0x7c,0x54,0x52,0x78,0x62,0x56,0x73,0x64,0x6c,0x89,0x41,0x37,0x44, 0x2f,0x31,0x36,0x39,0x3b,0x41,0x40,0x42,0x49,0x1a,0x1d,0x26,0x1a,0x1c,0x25,0x18, 0x1a,0x22,0x2c,0x29,0x34,0x33,0x2c,0x36,0x55,0x55,0x60,0x62,0x6b,0x8c,0x4a,0x47, 0x6b,0x52,0x49,0x69,0x5c,0x52,0x77,0x5d,0x52,0x77,0x5e,0x53,0x78,0x5e,0x53,0x78, 0x5e,0x53,0x78,0x5e,0x54,0x78,0x5e,0x53,0x78,0x5f,0x53,0x75,0x56,0x4d,0x6b,0x4d, 0x46,0x61,0x52,0x49,0x66,0x20,0x1e,0x28,0x27,0x24,0x30,0x33,0x2d,0x3a,0x3c,0x34, 0x41,0x3e,0x35,0x44,0x40,0x37,0x46,0x41,0x37,0x46,0x41,0x37,0x45,0x3f,0x35,0x44, 0x3b,0x32,0x3f,0x59,0x57,0x76,0x53,0x51,0x76,0x41,0x3f,0x5c,0x4b,0x45,0x62,0x5c, 0x51,0x72,0x5d,0x51,0x74,0x5e,0x53,0x75,0x5e,0x52,0x75,0x5e,0x53,0x76,0x5f,0x53, 0x76,0x7a,0x70,0x8c,0x5c,0x51,0x72,0x4b,0x41,0x5d,0x65,0x56,0x7a,0x5b,0x50,0x71, 0x11,0x10,0x16,0x21,0x1d,0x26,0x29,0x24,0x2f,0x33,0x2b,0x38,0x38,0x30,0x3e,0x3c, 0x33,0x42,0x42,0x39,0x48,0x48,0x3d,0x4c,0x48,0x3d,0x4d,0x4e,0x41,0x52,0x50,0x42, 0x53,0x50,0x42,0x53,0x4e,0x41,0x52,0x4a,0x3f,0x4f,0x43,0x3a,0x49,0x46,0x3e,0x50, 0x51,0x47,0x5b,0x3d,0x37,0x46,0x64,0x54,0x72,0x5a,0x4b,0x67,0x5a,0x4d,0x68,0x5b, 0x4d,0x69,0x5a,0x50,0x6c,0x5a,0x51,0x6f,0x43,0x3c,0x55,0x32,0x2d,0x42,0x29,0x29, 0x3b,0x10,0x12,0x17,0x47,0x3d,0x4e,0x54,0x47,0x59,0x6c,0x71,0x8c,0x51,0x5c,0x7f, 0x4c,0x55,0x7a,0x4e,0x58,0x7d,0x4f,0x58,0x7c,0x3a,0x40,0x59,0x11,0x12,0x19,0x0e, 0x0f,0x14,0x0e,0x0f,0x14,0x0d,0x0e,0x13,0x0e,0x0e,0x13,0x0e,0x0e,0x14,0x14,0x16, 0x1d,0x20,0x22,0x29,0x26,0x29,0x2e,0x26,0x29,0x30,0x26,0x29,0x32,0x2d,0x30,0x3c, 0x59,0x64,0x85,0x58,0x59,0x7c,0x5a,0x59,0x7c,0x58,0x56,0x7b,0x59,0x55,0x79,0x5a, 0x54,0x78,0x58,0x53,0x77,0x5b,0x50,0x76,0x5c,0x51,0x76,0x5c,0x51,0x77,0x5d,0x51, 0x74,0x5b,0x50,0x72,0x5a,0x4d,0x6f,0x56,0x4a,0x6b,0x54,0x47,0x63,0x4d,0x43,0x5c, 0x48,0x3e,0x55,0x3b,0x2f,0x3c,0x42,0x36,0x45,0x45,0x38,0x46,0x46,0x38,0x48,0x3d, 0x32,0x3e,0x3c,0x2f,0x3e,0x3c,0x34,0x44,0x40,0x3b,0x50,0x45,0x42,0x59,0x48,0x46, 0x5e,0x48,0x46,0x5c,0x43,0x3e,0x53,0x49,0x43,0x5a,0x4e,0x49,0x62,0x51,0x4e,0x69, 0x52,0x55,0x71,0x56,0x5e,0x7a,0x5d,0x65,0x7f,0x62,0x69,0x83,0x66,0x6e,0x86,0x64, 0x6c,0x85,0x60,0x67,0x81,0x5e,0x66,0x80,0x57,0x60,0x7a,0x59,0x61,0x7c,0x6a,0x72, 0x89,0x76,0x7e,0x92,0x79,0x80,0x94,0x7b,0x82,0x96,0x7b,0x82,0x96,0x76,0x7d,0x92, 0x6c,0x74,0x8b,0x64,0x6b,0x85,0x5a,0x62,0x7e,0x54,0x5c,0x79,0x52,0x58,0x76,0x51, 0x56,0x73,0x4f,0x56,0x72,0x54,0x5c,0x76,0x5b,0x62,0x7a,0x64,0x6b,0x81,0x64,0x6b, 0x7f,0x5e,0x64,0x77,0x4a,0x50,0x63,0x3c,0x42,0x54,0x35,0x3a,0x4b,0x35,0x3a,0x47, 0x35,0x39,0x45,0x34,0x38,0x42,0x32,0x36,0x3f,0x32,0x36,0x3f,0x32,0x36,0x3e,0x2d, 0x30,0x3a,0x2c,0x31,0x3b,0x55,0x5e,0x80,0x54,0x54,0x75,0x5a,0x56,0x75,0x5a,0x57, 0x75,0x5b,0x57,0x75,0x5d,0x58,0x76,0x5d,0x58,0x76,0x5e,0x59,0x77,0x5e,0x58,0x76, 0x5e,0x58,0x76,0x5e,0x58,0x76,0x5e,0x57,0x76,0x5e,0x56,0x75,0x5e,0x57,0x75,0x59, 0x52,0x71,0x5e,0x55,0x75,0x25,0x26,0x30,0x1a,0x1c,0x21,0x19,0x1a,0x1e,0x18,0x1a, 0x1e,0x19,0x1a,0x1e,0x18,0x1a,0x1d,0x18,0x19,0x1d,0x18,0x19,0x1c,0x1a,0x1a,0x1d, 0x1b,0x1c,0x1e,0x19,0x1a,0x1c,0x16,0x17,0x19,0x14,0x15,0x17,0x11,0x12,0x14,0x0e, 0x0f,0x12,0x0c,0x0d,0x0e,0x0a,0x0b,0x0d,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09, 0x0a,0x07,0x08,0x0a,0x07,0x07,0x09,0x06,0x07,0x08,0x06,0x06,0x06,0x04,0x05,0x06, 0x05,0x05,0x06,0x04,0x05,0x06,0x03,0x04,0x04,0x03,0x04,0x04,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x15,0x15,0x1d,0x58, 0x56,0x77,0x71,0x5c,0x73,0x46,0x36,0x42,0x47,0x37,0x44,0x49,0x38,0x45,0x4a,0x39, 0x47,0x4d,0x3c,0x4a,0x4f,0x3d,0x4b,0x4e,0x3c,0x4a,0x50,0x3e,0x4d,0x53,0x41,0x50, 0x54,0x41,0x51,0x6a,0x55,0x6a,0x36,0x33,0x44,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,0x03,0x03,0x03,0x07,0x05,0x06,0x0a,0x08,0x09,0x08, 0x06,0x08,0x05,0x04,0x05,0x03,0x02,0x03,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,0x24,0x24,0x24,0x94,0x9d,0xb8,0x52,0x4f,0x7a,0x56,0x3f,0x59,0x40,0x35, 0x4b,0x29,0x27,0x30,0xf3,0xf3,0xf3,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xe8,0xe8,0xe8, 0xff,0xff,0xff,0xfd,0xfd,0xfd,0xf4,0xf4,0xf4,0x18,0x12,0x19,0x3b,0x3a,0x59,0x90, 0x98,0xb4,0x9a,0xa1,0xb8,0x56,0x43,0x53,0x60,0x4c,0x5f,0x62,0x4e,0x62,0x68,0x53, 0x68,0x05,0x04,0x05,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,0x6d,0x73,0x80,0x52,0x57,0x83,0x64,0x4d,0x6a,0x56,0x50, 0x79,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x55,0x80,0x52,0x57,0x82,0x52,0x57,0x83, 0x52,0x5a,0x84,0x52,0x5b,0x85,0x52,0x5a,0x84,0x52,0x5a,0x84,0x52,0x57,0x82,0x52, 0x55,0x80,0x52,0x53,0x7d,0x52,0x52,0x7c,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x5f,0x47, 0x63,0x64,0x53,0x76,0x67,0x6d,0x7d,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04, 0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06, 0x07,0x08,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x08,0x09,0x08,0x09,0x0a,0x08,0x09, 0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0b,0x69,0x6e,0x89,0x57,0x64,0x89,0x53,0x5e,0x86, 0x52,0x54,0x7c,0x58,0x54,0x78,0x57,0x52,0x78,0x55,0x52,0x78,0x52,0x50,0x78,0x53, 0x51,0x78,0x53,0x52,0x7a,0x54,0x57,0x7e,0x54,0x52,0x78,0x62,0x56,0x75,0x6d,0x75, 0x8f,0x3f,0x36,0x41,0x1d,0x1f,0x23,0x3e,0x3f,0x44,0x1e,0x20,0x26,0x1a,0x1c,0x22, 0x19,0x1b,0x22,0x17,0x19,0x1e,0x28,0x25,0x2e,0x34,0x2c,0x34,0x4b,0x48,0x52,0x6a, 0x74,0x93,0x4d,0x4d,0x72,0x4f,0x48,0x67,0x5c,0x51,0x77,0x5d,0x52,0x78,0x5e,0x53, 0x78,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x78,0x5d,0x53,0x78,0x5d,0x52,0x77, 0x56,0x4d,0x6b,0x50,0x49,0x64,0x56,0x4d,0x69,0x1b,0x1b,0x23,0x1d,0x1d,0x26,0x23, 0x20,0x2b,0x2e,0x29,0x35,0x37,0x30,0x3e,0x39,0x32,0x40,0x3b,0x33,0x41,0x3b,0x33, 0x41,0x3a,0x32,0x3f,0x36,0x2f,0x3b,0x53,0x52,0x6e,0x5a,0x56,0x7b,0x46,0x42,0x60, 0x4a,0x42,0x60,0x5a,0x4f,0x6f,0x5d,0x51,0x74,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5e, 0x53,0x75,0x5f,0x53,0x76,0x7a,0x70,0x8c,0x5c,0x51,0x73,0x4c,0x42,0x5e,0x60,0x53, 0x75,0x62,0x55,0x79,0x0b,0x0c,0x10,0x12,0x12,0x19,0x1a,0x18,0x20,0x22,0x20,0x29, 0x28,0x25,0x30,0x2e,0x29,0x36,0x3d,0x35,0x43,0x44,0x3a,0x48,0x44,0x3a,0x49,0x46, 0x3c,0x4b,0x4a,0x3e,0x4f,0x4b,0x3f,0x4f,0x48,0x3d,0x4e,0x43,0x3a,0x49,0x3a,0x31, 0x40,0x2a,0x26,0x33,0x54,0x4a,0x60,0x45,0x3d,0x4e,0x50,0x47,0x5d,0x5d,0x4e,0x68, 0x59,0x4b,0x65,0x5a,0x4c,0x67,0x5a,0x4d,0x69,0x5b,0x4e,0x6a,0x57,0x4d,0x6a,0x34, 0x2d,0x42,0x31,0x2c,0x42,0x1a,0x1b,0x27,0x0f,0x11,0x16,0x52,0x46,0x58,0x63,0x5d, 0x70,0x5f,0x69,0x88,0x4d,0x56,0x79,0x50,0x5c,0x7e,0x50,0x5c,0x7f,0x4f,0x59,0x7e, 0x50,0x59,0x7b,0x1d,0x20,0x2b,0x0d,0x0e,0x13,0x0c,0x0d,0x12,0x0c,0x0e,0x12,0x11, 0x12,0x16,0x28,0x2a,0x2d,0x3e,0x3e,0x41,0x43,0x44,0x46,0x3f,0x40,0x43,0x2a,0x2d, 0x35,0x6e,0x77,0x92,0x65,0x6f,0x8e,0x65,0x68,0x88,0x60,0x62,0x84,0x5a,0x5b,0x7e, 0x5a,0x59,0x7b,0x58,0x56,0x7a,0x57,0x52,0x78,0x58,0x51,0x76,0x5a,0x50,0x77,0x5c, 0x51,0x77,0x5c,0x52,0x77,0x5c,0x51,0x77,0x5d,0x51,0x73,0x5a,0x4e,0x6f,0x58,0x4b, 0x6a,0x51,0x47,0x62,0x49,0x40,0x57,0x40,0x34,0x42,0x47,0x3a,0x49,0x49,0x3b,0x4a, 0x4a,0x3c,0x4b,0x42,0x36,0x45,0x3a,0x31,0x3e,0x36,0x2f,0x3e,0x3c,0x34,0x46,0x44, 0x3e,0x52,0x48,0x43,0x5a,0x49,0x46,0x5e,0x45,0x43,0x5a,0x48,0x45,0x5c,0x4b,0x48, 0x61,0x4b,0x47,0x5f,0x4e,0x4b,0x66,0x51,0x55,0x70,0x57,0x5e,0x79,0x5e,0x66,0x80, 0x63,0x6b,0x85,0x66,0x6e,0x86,0x65,0x6d,0x85,0x61,0x68,0x82,0x5e,0x66,0x80,0x5c, 0x64,0x7e,0x64,0x6b,0x85,0x6d,0x75,0x8c,0x74,0x7b,0x91,0x76,0x7e,0x92,0x7a,0x81, 0x95,0x7a,0x82,0x96,0x75,0x7c,0x92,0x6c,0x74,0x8b,0x60,0x68,0x82,0x5a,0x62,0x7d, 0x54,0x5c,0x79,0x52,0x56,0x74,0x51,0x55,0x72,0x4f,0x53,0x70,0x4d,0x55,0x6f,0x57, 0x5f,0x77,0x60,0x68,0x7e,0x66,0x6d,0x81,0x5b,0x62,0x76,0x4a,0x51,0x64,0x3b,0x42, 0x55,0x39,0x3e,0x50,0x37,0x3c,0x4b,0x36,0x3a,0x47,0x36,0x3a,0x45,0x34,0x37,0x42, 0x32,0x36,0x3f,0x2f,0x32,0x3c,0x2c,0x2f,0x3a,0x58,0x61,0x82,0x56,0x56,0x77,0x5a, 0x57,0x75,0x5a,0x55,0x74,0x5a,0x57,0x75,0x5d,0x59,0x76,0x5e,0x59,0x77,0x5e,0x59, 0x78,0x5e,0x59,0x76,0x5e,0x59,0x77,0x5e,0x59,0x76,0x5e,0x59,0x77,0x5f,0x59,0x77, 0x5e,0x59,0x77,0x5b,0x53,0x73,0x5d,0x55,0x75,0x2c,0x2b,0x38,0x1a,0x1c,0x21,0x18, 0x1a,0x1f,0x19,0x1a,0x1f,0x17,0x18,0x1d,0x18,0x1a,0x1e,0x18,0x1a,0x1c,0x1a,0x1b, 0x1e,0x1d,0x1d,0x1f,0x1e,0x1f,0x21,0x1f,0x1f,0x21,0x1c,0x1d,0x1f,0x18,0x19,0x1b, 0x15,0x16,0x18,0x11,0x12,0x15,0x10,0x11,0x13,0x0e,0x0e,0x11,0x0d,0x0e,0x10,0x0c, 0x0d,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0c,0x08,0x09,0x0a,0x08,0x08,0x0a,0x07,0x08, 0x0a,0x06,0x07,0x09,0x05,0x05,0x06,0x04,0x05,0x06,0x03,0x04,0x04,0x03,0x04,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,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,0x05,0x05,0x07,0x45,0x40,0x56,0x78,0x69,0x88,0x4d,0x3c,0x4a,0x49, 0x38,0x45,0x4a,0x39,0x47,0x4d,0x3c,0x4a,0x4e,0x3d,0x4b,0x50,0x3e,0x4d,0x52,0x40, 0x4f,0x54,0x42,0x51,0x55,0x43,0x53,0x59,0x46,0x57,0x6e,0x5a,0x70,0x09,0x07,0x09, 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,0x9d,0xa1,0xaa,0x57,0x63,0x8b,0x53, 0x3f,0x56,0x2c,0x22,0x2f,0xa3,0xa2,0xa4,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xf7,0xf7, 0xf7,0xf2,0xf2,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0xcc,0xcd,0x23,0x1a,0x25, 0x43,0x40,0x64,0x84,0x8e,0xad,0x98,0xa1,0xb8,0x53,0x41,0x50,0x5f,0x4c,0x5e,0x62, 0x4e,0x62,0x68,0x53,0x68,0x04,0x03,0x04,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,0x24,0x24,0x25,0x69,0x74,0x98,0x64, 0x53,0x75,0x64,0x52,0x72,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x55, 0x80,0x52,0x57,0x82,0x52,0x5a,0x84,0x52,0x57,0x83,0x52,0x5a,0x84,0x52,0x57,0x83, 0x52,0x55,0x81,0x52,0x55,0x80,0x52,0x53,0x7d,0x52,0x52,0x7c,0x52,0x4f,0x7b,0x52, 0x4f,0x7a,0x5e,0x53,0x79,0x56,0x3e,0x57,0x53,0x5e,0x88,0x45,0x46,0x49,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x02,0x03, 0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x06,0x06,0x05,0x06,0x06, 0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x07,0x09,0x08,0x08,0x0a,0x07, 0x08,0x09,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0b,0x6e,0x72,0x89,0x57,0x63, 0x89,0x53,0x5d,0x86,0x52,0x54,0x7c,0x5a,0x54,0x78,0x59,0x54,0x78,0x56,0x52,0x78, 0x52,0x51,0x78,0x53,0x51,0x78,0x53,0x52,0x79,0x53,0x55,0x7c,0x54,0x52,0x78,0x5c, 0x55,0x77,0x76,0x7c,0x93,0x40,0x36,0x41,0x17,0x19,0x1e,0x18,0x1a,0x1e,0x18,0x1a, 0x1e,0x18,0x19,0x1e,0x18,0x19,0x1e,0x16,0x17,0x1b,0x24,0x21,0x28,0x35,0x2c,0x34, 0x3a,0x33,0x3b,0x73,0x7c,0x9a,0x4f,0x53,0x7b,0x4b,0x45,0x63,0x5b,0x51,0x76,0x5d, 0x52,0x78,0x5e,0x53,0x78,0x5e,0x53,0x79,0x5d,0x52,0x79,0x5e,0x53,0x78,0x5e,0x54, 0x78,0x5d,0x53,0x78,0x54,0x4c,0x6b,0x52,0x49,0x65,0x5c,0x52,0x70,0x18,0x18,0x1e, 0x1c,0x1b,0x22,0x1d,0x1d,0x25,0x24,0x22,0x2d,0x2a,0x27,0x33,0x31,0x2b,0x38,0x34, 0x2d,0x3b,0x35,0x2e,0x3b,0x34,0x2e,0x3a,0x31,0x2a,0x37,0x4b,0x49,0x63,0x59,0x57, 0x7c,0x47,0x42,0x61,0x47,0x40,0x5f,0x58,0x4e,0x6e,0x5c,0x51,0x73,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x5e,0x53,0x75,0x5f,0x53,0x75,0x78,0x6e,0x8b,0x66,0x5d,0x7c,0x4f, 0x45,0x61,0x5d,0x50,0x71,0x6f,0x60,0x88,0x0a,0x0b,0x0e,0x0d,0x0f,0x13,0x12,0x14, 0x19,0x1a,0x19,0x21,0x21,0x21,0x29,0x28,0x25,0x2f,0x2d,0x29,0x36,0x32,0x2d,0x3a, 0x36,0x30,0x3e,0x3b,0x34,0x42,0x3d,0x34,0x43,0x3b,0x33,0x42,0x37,0x30,0x3f,0x2e, 0x2a,0x38,0x24,0x23,0x2f,0x1d,0x1d,0x27,0x22,0x24,0x30,0x56,0x4c,0x60,0x40,0x38, 0x47,0x66,0x54,0x72,0x59,0x4b,0x66,0x5a,0x4b,0x65,0x5a,0x4b,0x66,0x5a,0x4b,0x67, 0x5b,0x4f,0x6c,0x3e,0x35,0x4d,0x32,0x2c,0x42,0x2f,0x2b,0x41,0x0f,0x11,0x16,0x2c, 0x28,0x33,0x53,0x45,0x58,0x6f,0x71,0x8a,0x57,0x61,0x81,0x51,0x5b,0x7e,0x55,0x5f, 0x82,0x52,0x5d,0x81,0x50,0x5c,0x80,0x55,0x60,0x83,0x3d,0x44,0x5a,0x0f,0x11,0x17, 0x0d,0x0d,0x12,0x12,0x11,0x17,0x1e,0x22,0x2a,0x38,0x3a,0x40,0x42,0x43,0x45,0x3e, 0x3e,0x41,0x39,0x3b,0x42,0x70,0x79,0x94,0x79,0x81,0x9c,0x7c,0x7f,0x9a,0x71,0x74, 0x90,0x5e,0x60,0x81,0x5c,0x5d,0x80,0x59,0x5a,0x7d,0x57,0x56,0x7a,0x55,0x51,0x76, 0x58,0x51,0x75,0x5a,0x51,0x77,0x5a,0x52,0x78,0x5d,0x54,0x78,0x5c,0x52,0x77,0x58, 0x50,0x72,0x56,0x4a,0x68,0x54,0x4a,0x66,0x49,0x41,0x58,0x43,0x39,0x49,0x4c,0x40, 0x51,0x4c,0x3e,0x4e,0x4a,0x3d,0x4d,0x4a,0x3c,0x4c,0x40,0x36,0x44,0x38,0x31,0x40, 0x3a,0x32,0x43,0x3e,0x37,0x48,0x46,0x3f,0x54,0x4b,0x46,0x5f,0x4c,0x4c,0x63,0x4a, 0x48,0x61,0x49,0x46,0x5d,0x47,0x44,0x5a,0x49,0x46,0x5f,0x4e,0x50,0x69,0x51,0x55, 0x6f,0x56,0x5c,0x76,0x5e,0x66,0x80,0x64,0x6d,0x85,0x65,0x6d,0x86,0x64,0x6c,0x85, 0x65,0x6d,0x86,0x65,0x6d,0x86,0x63,0x6a,0x84,0x66,0x6e,0x87,0x69,0x71,0x8a,0x6e, 0x76,0x8d,0x73,0x7a,0x90,0x79,0x80,0x94,0x77,0x7e,0x93,0x74,0x7b,0x91,0x6a,0x72, 0x8a,0x5f,0x67,0x82,0x59,0x62,0x7d,0x53,0x5b,0x79,0x52,0x58,0x76,0x50,0x53,0x71, 0x4e,0x51,0x6d,0x4d,0x54,0x6e,0x58,0x5f,0x78,0x62,0x69,0x7f,0x60,0x67,0x7d,0x55, 0x5b,0x71,0x47,0x4e,0x63,0x40,0x46,0x5a,0x3a,0x41,0x53,0x36,0x3c,0x4c,0x34,0x39, 0x47,0x36,0x3a,0x47,0x33,0x37,0x42,0x32,0x36,0x41,0x2e,0x32,0x3d,0x57,0x61,0x81, 0x5a,0x5a,0x79,0x5d,0x59,0x77,0x5d,0x59,0x77,0x5d,0x59,0x76,0x5e,0x59,0x77,0x5e, 0x59,0x78,0x5e,0x59,0x78,0x5e,0x59,0x78,0x5e,0x59,0x77,0x5e,0x59,0x77,0x5f,0x59, 0x78,0x60,0x59,0x78,0x5f,0x59,0x78,0x5d,0x57,0x75,0x5c,0x56,0x74,0x33,0x32,0x40, 0x1d,0x1f,0x25,0x1b,0x1d,0x22,0x1a,0x1b,0x21,0x1a,0x1b,0x20,0x18,0x1a,0x1e,0x1a, 0x1a,0x1f,0x1b,0x1c,0x1f,0x1e,0x1f,0x21,0x22,0x22,0x24,0x22,0x23,0x25,0x22,0x22, 0x24,0x1e,0x1e,0x21,0x1a,0x1a,0x1d,0x15,0x16,0x1a,0x12,0x13,0x16,0x12,0x12,0x15, 0x11,0x12,0x14,0x0f,0x10,0x12,0x0e,0x0e,0x10,0x0c,0x0c,0x0e,0x0a,0x0b,0x0d,0x09, 0x0a,0x0c,0x08,0x09,0x0a,0x07,0x07,0x09,0x06,0x07,0x09,0x05,0x06,0x07,0x05,0x05, 0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x05,0x02,0x03,0x04, 0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x25,0x23,0x2f, 0x6c,0x63,0x82,0x6c,0x57,0x6d,0x4a,0x39,0x47,0x4d,0x3c,0x4a,0x4e,0x3d,0x4b,0x50, 0x3e,0x4d,0x52,0x40,0x4f,0x54,0x42,0x51,0x55,0x43,0x53,0x56,0x43,0x53,0x62,0x4e, 0x61,0x5e,0x4c,0x5f,0x13,0x0f,0x13,0x0b,0x08,0x0a,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,0x5a,0x5b,0x5d, 0x6e,0x79,0x9a,0x46,0x3a,0x52,0x1a,0x13,0x1b,0xef,0xef,0xef,0xff,0xff,0xff,0xff, 0xff,0xff,0xda,0xda,0xda,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x75,0x75, 0x78,0x35,0x28,0x38,0x49,0x48,0x6e,0x81,0x8c,0xab,0x9d,0xa5,0xbb,0x51,0x3f,0x4e, 0x5f,0x4c,0x5e,0x62,0x4e,0x62,0x67,0x53,0x67,0x02,0x02,0x02,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, 0x68,0x6d,0x7c,0x52,0x53,0x7e,0x64,0x4c,0x69,0x55,0x50,0x79,0x52,0x52,0x7c,0x52, 0x53,0x7d,0x52,0x53,0x7e,0x52,0x55,0x80,0x52,0x57,0x82,0x52,0x57,0x82,0x52,0x55, 0x81,0x52,0x55,0x81,0x52,0x55,0x80,0x52,0x53,0x7d,0x52,0x52,0x7c,0x52,0x50,0x7b, 0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x60,0x48,0x64,0x53,0x3c,0x54,0x60, 0x6c,0x8e,0x1d,0x1d,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x04,0x04,0x05,0x04,0x05,0x05,0x04,0x05, 0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x08, 0x07,0x08,0x09,0x07,0x08,0x09,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0b,0x6e, 0x72,0x89,0x5a,0x64,0x8b,0x53,0x5f,0x86,0x52,0x55,0x7e,0x59,0x54,0x78,0x59,0x53, 0x77,0x57,0x51,0x78,0x54,0x51,0x77,0x53,0x51,0x78,0x53,0x52,0x7a,0x54,0x55,0x7c, 0x54,0x52,0x79,0x55,0x53,0x77,0x83,0x88,0x9b,0x3d,0x33,0x3c,0x1c,0x1c,0x20,0x16, 0x17,0x1b,0x16,0x17,0x1b,0x16,0x17,0x1b,0x16,0x18,0x1c,0x15,0x16,0x1a,0x1e,0x1e, 0x22,0x3a,0x2f,0x39,0x34,0x2d,0x34,0x75,0x7e,0x9a,0x51,0x5c,0x83,0x4b,0x44,0x63, 0x5a,0x50,0x74,0x5d,0x52,0x78,0x5e,0x53,0x78,0x5d,0x53,0x79,0x5e,0x53,0x79,0x5d, 0x52,0x79,0x5d,0x52,0x78,0x5e,0x53,0x78,0x54,0x4b,0x6b,0x52,0x49,0x68,0x60,0x54, 0x77,0x11,0x11,0x15,0x17,0x17,0x1b,0x1e,0x1c,0x23,0x23,0x21,0x29,0x23,0x21,0x2b, 0x27,0x23,0x2e,0x2a,0x26,0x31,0x2d,0x28,0x34,0x2d,0x28,0x33,0x2c,0x27,0x31,0x43, 0x42,0x5a,0x57,0x57,0x7b,0x44,0x40,0x5e,0x46,0x3f,0x5c,0x56,0x4d,0x6c,0x5c,0x51, 0x72,0x5d,0x51,0x74,0x5e,0x52,0x75,0x5f,0x52,0x75,0x5f,0x52,0x76,0x76,0x6b,0x89, 0x84,0x7b,0x95,0x61,0x58,0x72,0x58,0x4c,0x6c,0x7d,0x6a,0x99,0x15,0x12,0x18,0x19, 0x16,0x1e,0x21,0x1e,0x27,0x22,0x20,0x29,0x25,0x23,0x2b,0x28,0x25,0x2f,0x2a,0x28, 0x31,0x2b,0x28,0x32,0x2b,0x28,0x33,0x2d,0x2a,0x36,0x2f,0x2b,0x39,0x31,0x2d,0x3b, 0x2d,0x29,0x36,0x2a,0x27,0x33,0x26,0x25,0x2f,0x21,0x21,0x2a,0x1a,0x1c,0x24,0x51, 0x49,0x5d,0x49,0x40,0x50,0x5a,0x4e,0x67,0x6a,0x56,0x76,0x59,0x4a,0x66,0x59,0x4a, 0x64,0x5a,0x4a,0x66,0x5b,0x4c,0x68,0x5a,0x4f,0x6c,0x37,0x2f,0x46,0x31,0x2c,0x41, 0x23,0x23,0x33,0x0e,0x10,0x15,0x49,0x3c,0x4d,0x5a,0x4f,0x62,0x82,0x88,0xa0,0x55, 0x5f,0x7e,0x57,0x61,0x85,0x56,0x61,0x85,0x55,0x60,0x85,0x56,0x61,0x85,0x58,0x64, 0x86,0x5f,0x6a,0x88,0x47,0x4c,0x65,0x23,0x1f,0x28,0x1f,0x1a,0x20,0x23,0x25,0x32, 0x52,0x54,0x5b,0x7b,0x80,0x8d,0x76,0x7e,0x98,0x7a,0x81,0x9b,0x88,0x8e,0xa5,0x88, 0x8e,0xa4,0x78,0x7b,0x96,0x63,0x67,0x86,0x60,0x63,0x83,0x60,0x61,0x82,0x5a,0x5a, 0x7d,0x54,0x51,0x78,0x53,0x50,0x76,0x55,0x50,0x77,0x5a,0x54,0x78,0x5d,0x54,0x79, 0x5e,0x54,0x79,0x5a,0x52,0x74,0x54,0x49,0x67,0x53,0x4a,0x69,0x4a,0x44,0x5c,0x47, 0x3e,0x50,0x4e,0x43,0x55,0x4f,0x42,0x52,0x4c,0x3e,0x4e,0x4b,0x3d,0x4c,0x47,0x3b, 0x4d,0x3e,0x35,0x47,0x3a,0x33,0x44,0x3d,0x34,0x44,0x41,0x39,0x4a,0x4a,0x42,0x57, 0x4b,0x4a,0x62,0x4b,0x4c,0x62,0x49,0x49,0x5f,0x43,0x44,0x5a,0x48,0x4b,0x62,0x4b, 0x4f,0x69,0x51,0x52,0x6d,0x51,0x54,0x6e,0x53,0x5a,0x74,0x5e,0x66,0x7f,0x66,0x6e, 0x86,0x69,0x71,0x89,0x67,0x6f,0x88,0x67,0x6f,0x88,0x64,0x6c,0x85,0x62,0x6a,0x83, 0x64,0x6b,0x85,0x68,0x70,0x89,0x6b,0x73,0x8a,0x72,0x79,0x8f,0x77,0x7e,0x93,0x79, 0x80,0x94,0x6f,0x77,0x8e,0x68,0x70,0x89,0x5e,0x66,0x80,0x56,0x5f,0x7b,0x55,0x5d, 0x79,0x52,0x57,0x74,0x50,0x53,0x71,0x4e,0x53,0x6e,0x51,0x58,0x73,0x5a,0x62,0x7b, 0x62,0x6a,0x80,0x5c,0x64,0x7a,0x55,0x5d,0x72,0x53,0x5a,0x6e,0x4c,0x52,0x66,0x45, 0x4b,0x5e,0x3e,0x45,0x56,0x39,0x3e,0x4e,0x36,0x3a,0x48,0x33,0x37,0x44,0x32,0x36, 0x41,0x58,0x5f,0x7d,0x5d,0x5c,0x7a,0x5e,0x5b,0x79,0x5f,0x5c,0x79,0x5f,0x5c,0x79, 0x5f,0x5b,0x78,0x5e,0x5b,0x79,0x5e,0x5a,0x78,0x5f,0x5a,0x78,0x5f,0x5b,0x78,0x5f, 0x5b,0x78,0x5f,0x5a,0x78,0x5f,0x5a,0x79,0x60,0x5b,0x79,0x5d,0x58,0x75,0x5c,0x56, 0x74,0x38,0x37,0x47,0x1f,0x22,0x28,0x1e,0x20,0x26,0x1e,0x20,0x26,0x1c,0x1e,0x23, 0x1a,0x1c,0x21,0x1a,0x1b,0x20,0x1d,0x1e,0x22,0x1e,0x1f,0x22,0x22,0x23,0x26,0x23, 0x24,0x26,0x23,0x23,0x26,0x21,0x22,0x24,0x1b,0x1d,0x1f,0x17,0x18,0x1c,0x16,0x16, 0x1a,0x16,0x17,0x1a,0x15,0x16,0x19,0x14,0x15,0x17,0x11,0x12,0x14,0x0e,0x0f,0x12, 0x0d,0x0e,0x10,0x0a,0x0b,0x0d,0x09,0x0a,0x0c,0x08,0x09,0x0a,0x08,0x09,0x0a,0x07, 0x07,0x09,0x06,0x06,0x07,0x05,0x06,0x06,0x06,0x06,0x07,0x04,0x05,0x06,0x04,0x05, 0x06,0x04,0x05,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04, 0x02,0x02,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x02, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03, 0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,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,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,0x0e,0x0d,0x12,0x57,0x51,0x6b,0x78,0x67,0x83,0x4e,0x3c,0x4a, 0x4e,0x3d,0x4b,0x51,0x3f,0x4e,0x52,0x40,0x4f,0x54,0x42,0x51,0x55,0x43,0x53,0x56, 0x43,0x53,0x58,0x45,0x56,0x53,0x41,0x50,0x40,0x31,0x3b,0x49,0x38,0x46,0x45,0x37, 0x44,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,0x0c,0x0c,0x0c,0x8b,0x92,0xa3,0x2a,0x29,0x3f,0x86,0x84,0x86,0xfd,0xfd,0xfd, 0xff,0xff,0xff,0xf7,0xf7,0xf7,0xd0,0xd0,0xd0,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xf7, 0xf7,0xf7,0x1b,0x1a,0x24,0x46,0x37,0x4d,0x4f,0x4d,0x76,0x7d,0x89,0xa9,0xa0,0xa6, 0xbc,0x51,0x3f,0x4e,0x60,0x4c,0x5f,0x62,0x4e,0x62,0x68,0x53,0x68,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,0x22,0x23,0x24,0x63,0x6e,0x93,0x63,0x53,0x77,0x64,0x53,0x75, 0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x54,0x7e,0x52, 0x55,0x80,0x52,0x55,0x80,0x52,0x54,0x7e,0x52,0x53,0x7e,0x52,0x52,0x7d,0x52,0x52, 0x7c,0x52,0x50,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x5c,0x52,0x79, 0x50,0x39,0x52,0x63,0x4b,0x67,0x6a,0x71,0x87,0x03,0x03,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03, 0x03,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06, 0x07,0x06,0x07,0x08,0x06,0x07,0x08,0x07,0x08,0x09,0x08,0x08,0x0a,0x09,0x0a,0x0b, 0x0a,0x0a,0x0b,0x71,0x74,0x8c,0x5b,0x64,0x8b,0x54,0x5f,0x86,0x52,0x57,0x80,0x59, 0x53,0x78,0x59,0x53,0x77,0x55,0x51,0x77,0x53,0x51,0x79,0x52,0x50,0x78,0x53,0x52, 0x7a,0x53,0x56,0x7d,0x53,0x54,0x7a,0x53,0x51,0x79,0x8f,0x93,0xa3,0x3c,0x32,0x3b, 0x1f,0x1d,0x23,0x14,0x16,0x19,0x15,0x16,0x1a,0x15,0x16,0x1a,0x15,0x16,0x1a,0x13, 0x15,0x18,0x19,0x1a,0x1e,0x3b,0x30,0x3a,0x30,0x28,0x2f,0x79,0x80,0x97,0x54,0x60, 0x85,0x4d,0x47,0x67,0x57,0x4f,0x70,0x5e,0x53,0x78,0x5e,0x53,0x78,0x5b,0x52,0x79, 0x5d,0x53,0x79,0x5a,0x52,0x79,0x5c,0x52,0x78,0x5d,0x53,0x79,0x52,0x49,0x69,0x53, 0x4b,0x6b,0x5c,0x53,0x77,0x1a,0x19,0x1f,0x0f,0x10,0x13,0x17,0x18,0x1c,0x21,0x1f, 0x26,0x22,0x20,0x28,0x22,0x20,0x28,0x21,0x1f,0x28,0x22,0x1f,0x29,0x22,0x1f,0x28, 0x22,0x1f,0x28,0x36,0x37,0x4a,0x53,0x58,0x7e,0x41,0x3e,0x5c,0x44,0x3f,0x5b,0x56, 0x4c,0x6b,0x5c,0x51,0x73,0x5e,0x51,0x75,0x5e,0x53,0x76,0x5f,0x52,0x75,0x61,0x55, 0x78,0x74,0x69,0x88,0x71,0x66,0x84,0x62,0x58,0x73,0x55,0x48,0x67,0x7e,0x6b,0x9b, 0x16,0x13,0x19,0x28,0x22,0x2b,0x2e,0x27,0x32,0x2a,0x25,0x2f,0x26,0x22,0x2b,0x27, 0x23,0x2e,0x28,0x24,0x2f,0x28,0x25,0x30,0x28,0x26,0x30,0x29,0x28,0x32,0x2b,0x27, 0x34,0x2e,0x2b,0x38,0x31,0x2c,0x38,0x2e,0x29,0x37,0x2c,0x28,0x34,0x2a,0x26,0x31, 0x21,0x21,0x2b,0x21,0x22,0x2d,0x54,0x48,0x5c,0x42,0x39,0x49,0x79,0x62,0x84,0x5d, 0x4c,0x68,0x59,0x4a,0x65,0x5a,0x4a,0x65,0x5a,0x4b,0x67,0x5b,0x4d,0x69,0x53,0x49, 0x65,0x33,0x2c,0x42,0x30,0x2b,0x42,0x13,0x14,0x1b,0x19,0x18,0x1f,0x51,0x44,0x56, 0x85,0x82,0x93,0x69,0x73,0x90,0x54,0x5f,0x7f,0x58,0x64,0x87,0x58,0x64,0x87,0x5b, 0x65,0x89,0x5b,0x66,0x88,0x61,0x6a,0x8c,0x59,0x62,0x85,0x55,0x59,0x7a,0x4e,0x50, 0x6d,0x4d,0x52,0x6e,0x68,0x71,0x8c,0x7e,0x87,0xa0,0x6a,0x73,0x91,0x74,0x7d,0x96, 0x89,0x8f,0xa6,0x8d,0x93,0xa9,0x77,0x7e,0x97,0x66,0x6a,0x88,0x64,0x67,0x86,0x64, 0x67,0x86,0x5e,0x5f,0x81,0x54,0x54,0x77,0x51,0x4f,0x75,0x54,0x51,0x77,0x59,0x54, 0x7a,0x5d,0x58,0x7c,0x5e,0x58,0x7b,0x5a,0x54,0x77,0x50,0x4b,0x6c,0x4c,0x4a,0x6b, 0x46,0x42,0x5b,0x45,0x3c,0x4d,0x50,0x43,0x55,0x4c,0x3f,0x50,0x46,0x38,0x48,0x4a, 0x3c,0x4d,0x4a,0x3e,0x4e,0x44,0x3a,0x4a,0x3d,0x33,0x43,0x3c,0x32,0x42,0x3c,0x34, 0x45,0x41,0x3a,0x4a,0x49,0x46,0x5b,0x51,0x50,0x68,0x56,0x56,0x6e,0x53,0x56,0x6d, 0x58,0x5d,0x76,0x5a,0x60,0x7a,0x56,0x5b,0x76,0x51,0x55,0x70,0x51,0x53,0x6e,0x56, 0x5a,0x75,0x60,0x66,0x7e,0x66,0x6e,0x86,0x68,0x70,0x89,0x67,0x6f,0x88,0x60,0x67, 0x82,0x5f,0x67,0x82,0x64,0x6b,0x85,0x68,0x70,0x89,0x68,0x70,0x89,0x68,0x70,0x88, 0x6e,0x76,0x8d,0x75,0x7c,0x92,0x74,0x7b,0x91,0x6e,0x76,0x8d,0x66,0x6e,0x87,0x5d, 0x66,0x80,0x58,0x60,0x7c,0x55,0x5d,0x79,0x52,0x58,0x75,0x51,0x55,0x72,0x50,0x56, 0x72,0x54,0x5c,0x77,0x5d,0x66,0x7e,0x60,0x68,0x7f,0x5d,0x64,0x7c,0x5e,0x65,0x7b, 0x5b,0x62,0x77,0x59,0x5f,0x73,0x51,0x58,0x6b,0x41,0x47,0x5a,0x38,0x3e,0x4e,0x36, 0x3b,0x4a,0x36,0x3b,0x48,0x57,0x60,0x7a,0x67,0x65,0x82,0x6d,0x69,0x84,0x66,0x62, 0x7e,0x61,0x5e,0x7a,0x60,0x5d,0x79,0x60,0x5c,0x79,0x60,0x5c,0x79,0x60,0x5c,0x79, 0x61,0x5d,0x79,0x60,0x5c,0x79,0x60,0x5c,0x79,0x61,0x5c,0x79,0x60,0x5b,0x79,0x5f, 0x59,0x77,0x5b,0x56,0x74,0x3e,0x3d,0x4e,0x22,0x24,0x2b,0x22,0x24,0x2a,0x20,0x22, 0x29,0x1e,0x20,0x26,0x1d,0x1e,0x24,0x1e,0x1f,0x24,0x1e,0x1f,0x24,0x1e,0x20,0x24, 0x21,0x22,0x26,0x22,0x24,0x26,0x21,0x22,0x25,0x21,0x22,0x25,0x1d,0x1e,0x21,0x19, 0x1a,0x1e,0x19,0x1a,0x1e,0x1a,0x1b,0x1e,0x1a,0x1b,0x1e,0x19,0x1a,0x1c,0x15,0x16, 0x18,0x12,0x12,0x15,0x0e,0x0f,0x12,0x0c,0x0d,0x10,0x0b,0x0c,0x0e,0x0a,0x0b,0x0e, 0x0a,0x0a,0x0d,0x08,0x09,0x0a,0x08,0x08,0x0a,0x07,0x08,0x0a,0x06,0x07,0x09,0x06, 0x06,0x08,0x06,0x06,0x08,0x05,0x06,0x07,0x04,0x05,0x06,0x04,0x04,0x06,0x04,0x05, 0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06, 0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x39,0x35, 0x46,0x76,0x68,0x87,0x6b,0x56,0x6c,0x50,0x3f,0x4d,0x54,0x41,0x51,0x54,0x42,0x51, 0x56,0x43,0x53,0x57,0x44,0x55,0x54,0x42,0x51,0x38,0x2a,0x33,0x3c,0x2d,0x37,0x3a, 0x2b,0x35,0x63,0x4f,0x63,0x83,0x83,0x86,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,0x5f,0x60,0x64,0x1d,0x21,0x2e,0xe2,0xe1, 0xe2,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xce,0xce,0xce,0xed,0xed,0xed,0xff,0xff,0xff, 0xff,0xff,0xff,0xd7,0xd7,0xd7,0x1d,0x1c,0x2b,0x50,0x40,0x5a,0x57,0x50,0x79,0x80, 0x8a,0xaa,0xb2,0xb8,0xc9,0x50,0x3f,0x4d,0x5f,0x4b,0x5d,0x62,0x4e,0x62,0x59,0x47, 0x59,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,0x6b,0x70,0x7e,0x52,0x50, 0x7c,0x64,0x4e,0x6d,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c, 0x52,0x53,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7d,0x52,0x52,0x7d,0x52, 0x52,0x7c,0x52,0x50,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x55,0x50,0x79,0x64,0x53,0x76,0x4c,0x35,0x4b,0x54,0x50,0x79,0x66,0x69,0x70, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x05, 0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x08,0x09,0x08,0x09, 0x0a,0x08,0x08,0x0a,0x08,0x09,0x0a,0x75,0x78,0x8d,0x5b,0x65,0x8c,0x55,0x60,0x87, 0x52,0x5a,0x82,0x57,0x51,0x77,0x59,0x53,0x77,0x55,0x51,0x77,0x52,0x50,0x78,0x52, 0x51,0x78,0x53,0x53,0x7b,0x52,0x55,0x7c,0x53,0x54,0x7b,0x54,0x56,0x7d,0x97,0x9b, 0xa9,0x38,0x2f,0x38,0x29,0x24,0x2c,0x13,0x14,0x17,0x12,0x13,0x16,0x13,0x14,0x18, 0x12,0x14,0x17,0x12,0x12,0x16,0x15,0x15,0x19,0x3a,0x2f,0x39,0x29,0x21,0x26,0x78, 0x7c,0x91,0x58,0x63,0x87,0x4d,0x4a,0x6d,0x56,0x4d,0x6e,0x5e,0x53,0x78,0x5d,0x53, 0x78,0x5b,0x52,0x79,0x5b,0x52,0x79,0x5b,0x52,0x79,0x5b,0x52,0x79,0x5c,0x53,0x78, 0x52,0x49,0x69,0x53,0x4a,0x6a,0x5d,0x54,0x77,0x21,0x1e,0x27,0x0d,0x0e,0x10,0x11, 0x11,0x15,0x19,0x18,0x1d,0x1e,0x1d,0x23,0x1f,0x1d,0x24,0x20,0x1d,0x25,0x1f,0x1d, 0x25,0x1f,0x1d,0x24,0x1e,0x1c,0x23,0x2c,0x2d,0x3c,0x55,0x5b,0x83,0x44,0x42,0x62, 0x46,0x41,0x5c,0x56,0x4c,0x6c,0x5d,0x51,0x73,0x5e,0x52,0x75,0x5e,0x53,0x76,0x5f, 0x52,0x75,0x6a,0x5e,0x7f,0x70,0x64,0x84,0x5f,0x53,0x76,0x54,0x49,0x68,0x51,0x47, 0x63,0x7d,0x6c,0x99,0x1b,0x17,0x1e,0x21,0x1d,0x25,0x2b,0x25,0x2f,0x2e,0x27,0x32, 0x28,0x24,0x2f,0x26,0x22,0x2c,0x29,0x24,0x2f,0x2b,0x26,0x32,0x2d,0x28,0x34,0x2f, 0x2a,0x37,0x36,0x30,0x3d,0x39,0x31,0x40,0x39,0x31,0x3f,0x38,0x31,0x3e,0x36,0x2f, 0x3c,0x34,0x2d,0x3a,0x2e,0x29,0x35,0x1c,0x1b,0x25,0x4a,0x41,0x54,0x49,0x3f,0x4f, 0x66,0x56,0x74,0x64,0x51,0x70,0x58,0x49,0x64,0x59,0x4a,0x64,0x5a,0x49,0x66,0x5b, 0x4c,0x68,0x5b,0x4f,0x6c,0x3a,0x33,0x4a,0x31,0x2b,0x40,0x27,0x26,0x3b,0x0e,0x0f, 0x14,0x2c,0x26,0x31,0x51,0x44,0x57,0xa9,0xac,0xb9,0x4f,0x57,0x75,0x57,0x63,0x86, 0x5b,0x65,0x89,0x5e,0x69,0x8c,0x60,0x6b,0x8d,0x60,0x6a,0x8d,0x5c,0x66,0x88,0x58, 0x61,0x83,0x55,0x5d,0x7b,0x54,0x5a,0x7a,0x58,0x5c,0x7c,0x59,0x60,0x82,0x57,0x60, 0x82,0x78,0x80,0x9a,0x90,0x96,0xab,0x8f,0x96,0xaa,0x79,0x80,0x9a,0x67,0x6f,0x8c, 0x64,0x6a,0x88,0x69,0x6e,0x8b,0x63,0x65,0x84,0x58,0x58,0x7a,0x52,0x51,0x75,0x54, 0x53,0x78,0x5a,0x58,0x7c,0x5d,0x5a,0x7e,0x5e,0x5b,0x7e,0x5d,0x59,0x7a,0x53,0x51, 0x70,0x4d,0x4e,0x70,0x41,0x3f,0x58,0x46,0x3d,0x4e,0x41,0x38,0x48,0x4b,0x3f,0x50, 0x4d,0x42,0x52,0x48,0x3d,0x4d,0x47,0x3d,0x4d,0x47,0x3d,0x50,0x43,0x3a,0x4a,0x3d, 0x33,0x43,0x3b,0x33,0x42,0x3e,0x36,0x47,0x42,0x3d,0x50,0x4a,0x49,0x5f,0x53,0x54, 0x6a,0x56,0x58,0x6f,0x5a,0x5e,0x75,0x5b,0x61,0x7a,0x5d,0x65,0x7e,0x5c,0x62,0x7d, 0x53,0x59,0x74,0x53,0x57,0x71,0x56,0x5b,0x73,0x5e,0x65,0x7f,0x63,0x6b,0x85,0x5e, 0x67,0x82,0x60,0x68,0x82,0x65,0x6c,0x86,0x67,0x6f,0x88,0x69,0x71,0x89,0x66,0x6d, 0x86,0x62,0x6a,0x83,0x64,0x6b,0x85,0x6c,0x74,0x8b,0x72,0x79,0x8f,0x72,0x7a,0x90, 0x6e,0x76,0x8d,0x68,0x70,0x88,0x60,0x69,0x82,0x5a,0x62,0x7d,0x55,0x5e,0x7a,0x52, 0x59,0x76,0x52,0x57,0x75,0x52,0x5a,0x76,0x56,0x5f,0x7a,0x5b,0x63,0x7e,0x5b,0x63, 0x7d,0x5a,0x62,0x7a,0x5a,0x62,0x7a,0x5e,0x66,0x7c,0x5a,0x62,0x76,0x4e,0x55,0x69, 0x3f,0x45,0x58,0x3b,0x40,0x52,0x3c,0x42,0x50,0x5f,0x67,0x7d,0x72,0x72,0x8c,0x7d, 0x7a,0x91,0x71,0x6e,0x88,0x64,0x61,0x7d,0x62,0x5f,0x7c,0x62,0x5f,0x7b,0x62,0x5f, 0x7c,0x62,0x5e,0x7b,0x61,0x5d,0x79,0x62,0x5d,0x79,0x62,0x5e,0x7a,0x62,0x5d,0x7a, 0x62,0x5d,0x7a,0x5f,0x5a,0x77,0x5c,0x57,0x73,0x41,0x40,0x53,0x26,0x28,0x30,0x25, 0x27,0x2e,0x23,0x26,0x2d,0x21,0x23,0x2a,0x20,0x22,0x28,0x1e,0x20,0x26,0x1e,0x1f, 0x25,0x1e,0x1f,0x24,0x1e,0x20,0x25,0x21,0x22,0x26,0x1f,0x21,0x25,0x1e,0x1f,0x23, 0x1c,0x1e,0x22,0x1b,0x1d,0x21,0x1c,0x1d,0x21,0x1e,0x1e,0x22,0x1e,0x1f,0x22,0x1c, 0x1d,0x20,0x18,0x1a,0x1c,0x13,0x15,0x17,0x10,0x11,0x14,0x0e,0x0e,0x12,0x0d,0x0e, 0x11,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x0b,0x0c,0x0e,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e, 0x0a,0x0a,0x0d,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x07,0x08,0x0a,0x06,0x06,0x09,0x06, 0x06,0x08,0x06,0x06,0x08,0x05,0x06,0x07,0x05,0x06,0x07,0x05,0x05,0x06,0x05,0x06, 0x07,0x06,0x06,0x07,0x05,0x06,0x07,0x05,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06, 0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03, 0x04,0x05,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x1c,0x1a,0x22,0x67,0x5e,0x7b,0x76,0x61,0x7a,0x54,0x42, 0x51,0x55,0x42,0x52,0x56,0x43,0x53,0x57,0x44,0x55,0x3f,0x30,0x3b,0x35,0x27,0x2f, 0x36,0x28,0x30,0x3a,0x2b,0x35,0x77,0x62,0x7b,0xed,0xef,0xf3,0x20,0x20,0x21,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,0x14,0x14,0x15,0x69, 0x69,0x6c,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xa0,0xa0,0xa0,0xfc,0xfc, 0xfc,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x83,0x83,0x86,0x29,0x28,0x3e,0x57,0x44,0x5e, 0x62,0x53,0x77,0x7b,0x85,0xa7,0xcb,0xcc,0xd7,0x4f,0x3e,0x4c,0x5e,0x4b,0x5d,0x62, 0x4f,0x62,0x37,0x2d,0x38,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,0x25, 0x25,0x25,0x68,0x73,0x97,0x64,0x53,0x76,0x64,0x52,0x73,0x52,0x4f,0x7b,0x52,0x50, 0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7c, 0x52,0x52,0x7c,0x52,0x50,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x54,0x50,0x79,0x55,0x50,0x79,0x57,0x50,0x79,0x63,0x4b,0x67,0x4b,0x34, 0x4a,0x55,0x61,0x89,0x40,0x40,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x13,0x18,0x5d,0x60,0x6c,0x47,0x4b,0x55,0x13,0x15,0x1d,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05, 0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x08,0x07, 0x08,0x09,0x07,0x08,0x09,0x08,0x08,0x0a,0x09,0x0a,0x0b,0x72,0x74,0x89,0x5d,0x68, 0x8d,0x56,0x61,0x88,0x53,0x5d,0x85,0x58,0x51,0x77,0x58,0x51,0x77,0x54,0x50,0x77, 0x52,0x4f,0x78,0x52,0x50,0x78,0x52,0x51,0x7a,0x53,0x57,0x7e,0x53,0x55,0x7c,0x54, 0x5e,0x84,0xa2,0xa4,0xb1,0x37,0x2d,0x36,0x2b,0x26,0x2d,0x11,0x12,0x15,0x11,0x12, 0x15,0x11,0x12,0x15,0x12,0x12,0x16,0x10,0x12,0x14,0x0f,0x10,0x13,0x39,0x2f,0x38, 0x28,0x20,0x26,0x75,0x79,0x89,0x5e,0x69,0x8c,0x4d,0x4a,0x72,0x54,0x4a,0x6b,0x5e, 0x53,0x78,0x5d,0x53,0x78,0x5b,0x52,0x78,0x59,0x52,0x79,0x5a,0x52,0x79,0x59,0x52, 0x79,0x5c,0x52,0x78,0x53,0x49,0x69,0x52,0x4a,0x6a,0x5e,0x54,0x77,0x2a,0x25,0x31, 0x0b,0x0c,0x0e,0x0d,0x0e,0x0f,0x0f,0x10,0x12,0x13,0x13,0x17,0x17,0x17,0x1b,0x1b, 0x19,0x1f,0x1d,0x1b,0x22,0x1d,0x1b,0x22,0x1b,0x19,0x20,0x26,0x26,0x32,0x5a,0x62, 0x8c,0x49,0x47,0x6b,0x45,0x3f,0x5b,0x58,0x4e,0x6d,0x5d,0x51,0x73,0x5e,0x52,0x75, 0x5e,0x52,0x75,0x5f,0x52,0x76,0x69,0x5d,0x7f,0x70,0x65,0x84,0x5f,0x52,0x76,0x57, 0x4c,0x6c,0x4e,0x43,0x5f,0x7d,0x6c,0x99,0x22,0x1e,0x27,0x1a,0x17,0x1d,0x20,0x1d, 0x24,0x23,0x1e,0x27,0x21,0x1e,0x27,0x23,0x21,0x28,0x24,0x21,0x29,0x27,0x24,0x2e, 0x2a,0x27,0x32,0x2e,0x2a,0x36,0x38,0x30,0x3e,0x3c,0x34,0x42,0x3e,0x36,0x43,0x3d, 0x34,0x42,0x3b,0x33,0x41,0x3a,0x32,0x3f,0x38,0x30,0x3c,0x29,0x24,0x2f,0x22,0x1f, 0x2a,0x52,0x46,0x5a,0x49,0x3e,0x50,0x6f,0x59,0x7a,0x5b,0x4a,0x66,0x5a,0x4a,0x64, 0x5a,0x4a,0x64,0x5b,0x4b,0x67,0x5b,0x4d,0x69,0x5a,0x4e,0x6b,0x33,0x2b,0x41,0x2f, 0x2b,0x40,0x19,0x1a,0x25,0x0d,0x0e,0x13,0x38,0x2f,0x3d,0x84,0x7d,0x89,0x6f,0x78, 0x92,0x53,0x5b,0x7d,0x5e,0x69,0x8b,0x60,0x6a,0x8d,0x60,0x6b,0x8e,0x61,0x6b,0x8d, 0x5e,0x69,0x8b,0x59,0x62,0x85,0x5a,0x61,0x83,0x56,0x5d,0x7d,0x57,0x5b,0x7a,0x57, 0x5b,0x7b,0x55,0x5f,0x80,0x79,0x80,0x9a,0x8a,0x90,0xa5,0x85,0x8c,0xa1,0x7b,0x81, 0x99,0x61,0x6a,0x88,0x5e,0x67,0x86,0x7a,0x7f,0x98,0x76,0x7a,0x94,0x74,0x76,0x91, 0x6c,0x6c,0x89,0x67,0x66,0x87,0x63,0x63,0x85,0x63,0x63,0x84,0x62,0x60,0x82,0x5e, 0x5d,0x7e,0x54,0x56,0x75,0x52,0x55,0x77,0x3c,0x42,0x59,0x3e,0x3c,0x52,0x50,0x48, 0x5c,0x52,0x48,0x5c,0x58,0x4c,0x60,0x55,0x49,0x5d,0x48,0x3e,0x50,0x42,0x39,0x4a, 0x58,0x4f,0x60,0x5b,0x50,0x60,0x3f,0x37,0x47,0x3e,0x36,0x48,0x40,0x39,0x4d,0x42, 0x3e,0x51,0x48,0x46,0x5a,0x52,0x51,0x68,0x57,0x58,0x6f,0x59,0x5c,0x73,0x5b,0x61, 0x79,0x60,0x67,0x80,0x5d,0x65,0x7d,0x51,0x55,0x6c,0x4b,0x50,0x67,0x56,0x5c,0x75, 0x59,0x61,0x7c,0x59,0x62,0x7d,0x63,0x6a,0x84,0x66,0x6f,0x87,0x66,0x6e,0x87,0x65, 0x6c,0x86,0x63,0x6a,0x84,0x62,0x6a,0x83,0x62,0x6a,0x83,0x66,0x6e,0x87,0x6f,0x77, 0x8e,0x74,0x7b,0x91,0x73,0x7b,0x91,0x6f,0x77,0x8e,0x6a,0x72,0x8a,0x62,0x6a,0x83, 0x5b,0x64,0x7e,0x56,0x5e,0x7a,0x53,0x5b,0x77,0x52,0x57,0x74,0x53,0x5b,0x78,0x58, 0x61,0x7c,0x56,0x5e,0x7a,0x56,0x5e,0x79,0x5b,0x63,0x7d,0x6d,0x74,0x8a,0x61,0x68, 0x7e,0x5b,0x62,0x77,0x4e,0x55,0x69,0x42,0x49,0x5d,0x3e,0x43,0x56,0x68,0x6f,0x84, 0x84,0x84,0x9b,0x82,0x80,0x96,0x73,0x71,0x8a,0x67,0x65,0x81,0x66,0x63,0x7f,0x64, 0x62,0x7d,0x64,0x61,0x7d,0x64,0x61,0x7d,0x64,0x61,0x7d,0x63,0x60,0x7c,0x63,0x5f, 0x7b,0x62,0x5f,0x7b,0x62,0x5f,0x7b,0x61,0x5c,0x78,0x5c,0x59,0x74,0x48,0x46,0x59, 0x2a,0x2c,0x34,0x28,0x2a,0x32,0x26,0x28,0x2f,0x22,0x26,0x2c,0x22,0x25,0x2b,0x21, 0x22,0x29,0x1f,0x21,0x27,0x1f,0x21,0x26,0x1f,0x21,0x26,0x1f,0x21,0x26,0x1e,0x20, 0x25,0x1d,0x1f,0x23,0x1c,0x1e,0x22,0x1b,0x1d,0x22,0x1c,0x1e,0x22,0x1f,0x20,0x25, 0x1f,0x21,0x24,0x1d,0x1e,0x22,0x19,0x1a,0x1e,0x16,0x17,0x1a,0x11,0x12,0x16,0x10, 0x11,0x14,0x0e,0x0f,0x12,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0e,0x0f, 0x12,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0e,0x0e,0x12,0x0b,0x0d,0x0f,0x0a,0x0b,0x0e, 0x09,0x0a,0x0c,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x07,0x0a,0x06,0x07,0x09,0x06, 0x07,0x0a,0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06, 0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x05,0x06, 0x04,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x03,0x03,0x04,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x07,0x06,0x08,0x4e, 0x47,0x5e,0x78,0x69,0x87,0x6a,0x55,0x6b,0x57,0x44,0x54,0x4d,0x3c,0x4a,0x35,0x27, 0x2f,0x36,0x28,0x30,0x38,0x2a,0x33,0x3e,0x2f,0x3a,0x87,0x91,0xae,0xaf,0xb6,0xca, 0xd7,0xda,0xe2,0x18,0x19,0x1a,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,0xd3,0xd3,0xd4,0xff,0xff,0xff,0xff,0xff,0xff,0xd0,0xd0,0xd0,0xc0, 0xc0,0xc0,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xfa,0xfa,0xfa,0x35,0x34,0x3d,0x36,0x34, 0x51,0x5f,0x49,0x66,0x5f,0x53,0x79,0x76,0x81,0xa3,0xc7,0xc8,0xd2,0x51,0x3f,0x4e, 0x5e,0x4b,0x5d,0x64,0x50,0x64,0x25,0x1e,0x26,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,0x73,0x77,0x84,0x52,0x55,0x80,0x62,0x4a,0x66,0x58, 0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50, 0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x53,0x4f,0x7a,0x55,0x50,0x79,0x57,0x50,0x79,0x58,0x50,0x79,0x5b, 0x52,0x79,0x5a,0x41,0x5b,0x53,0x3c,0x54,0x6b,0x76,0x94,0x18,0x18,0x18,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x4b,0x53,0x6b,0xc5,0xca,0xd6,0xd1,0xd4,0xdd,0x72,0x7c,0x9c,0x51, 0x5b,0x7e,0x32,0x39,0x4f,0x12,0x14,0x1b,0x02,0x02,0x03,0x02,0x03,0x03,0x03,0x03, 0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x06,0x06, 0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x08,0x08,0x0a,0x08,0x09,0x0a,0x74, 0x77,0x8a,0x5e,0x6a,0x8f,0x57,0x62,0x8a,0x55,0x5f,0x8b,0x55,0x50,0x77,0x57,0x51, 0x77,0x55,0x50,0x77,0x52,0x4f,0x78,0x52,0x50,0x79,0x52,0x54,0x7c,0x53,0x58,0x80, 0x52,0x54,0x7c,0x53,0x5e,0x84,0x9a,0x9c,0xa7,0x37,0x2d,0x36,0x32,0x2b,0x35,0x10, 0x11,0x14,0x0f,0x10,0x13,0x0f,0x10,0x13,0x10,0x11,0x14,0x0f,0x11,0x13,0x0e,0x0f, 0x12,0x3a,0x2e,0x38,0x28,0x20,0x26,0x75,0x78,0x86,0x67,0x70,0x92,0x4f,0x4d,0x75, 0x50,0x47,0x69,0x5c,0x52,0x77,0x5d,0x53,0x78,0x5b,0x51,0x78,0x5a,0x53,0x79,0x5a, 0x53,0x79,0x59,0x52,0x79,0x5a,0x52,0x79,0x50,0x49,0x6a,0x50,0x47,0x68,0x5d,0x54, 0x78,0x34,0x2e,0x3d,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0d,0x0e,0x0f, 0x0c,0x0d,0x10,0x0f,0x0f,0x13,0x13,0x13,0x17,0x15,0x14,0x1a,0x15,0x13,0x18,0x1a, 0x1a,0x22,0x60,0x6b,0x99,0x4f,0x4c,0x74,0x45,0x3f,0x5c,0x59,0x4d,0x6e,0x5e,0x51, 0x74,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5f,0x52,0x76,0x60,0x55,0x78,0x78,0x6f,0x8c, 0x5f,0x53,0x76,0x59,0x4d,0x6d,0x4d,0x43,0x5f,0x73,0x65,0x90,0x2a,0x23,0x2e,0x10, 0x0f,0x13,0x1b,0x18,0x1e,0x1e,0x1b,0x21,0x20,0x1d,0x25,0x22,0x1f,0x27,0x25,0x22, 0x2b,0x2a,0x26,0x30,0x2b,0x27,0x32,0x2b,0x27,0x32,0x2f,0x2a,0x36,0x36,0x2f,0x3d, 0x3d,0x35,0x43,0x40,0x37,0x45,0x41,0x37,0x46,0x41,0x37,0x45,0x3c,0x33,0x41,0x37, 0x2e,0x3b,0x2e,0x28,0x33,0x39,0x32,0x42,0x50,0x44,0x56,0x66,0x56,0x73,0x60,0x4e, 0x6c,0x5a,0x49,0x64,0x59,0x4a,0x65,0x5b,0x4a,0x65,0x5c,0x4b,0x68,0x5c,0x4f,0x6d, 0x41,0x38,0x51,0x31,0x2b,0x40,0x2d,0x2a,0x40,0x0e,0x0f,0x14,0x1f,0x1c,0x25,0x3e, 0x34,0x43,0xae,0xab,0xb3,0x4e,0x57,0x75,0x5c,0x68,0x8a,0x61,0x6b,0x8e,0x64,0x6d, 0x8f,0x64,0x6e,0x90,0x62,0x6c,0x8d,0x5f,0x67,0x88,0x60,0x65,0x84,0x5b,0x5e,0x7d, 0x58,0x5b,0x78,0x57,0x59,0x76,0x59,0x5a,0x78,0x54,0x5d,0x7d,0x67,0x6f,0x8a,0x71, 0x78,0x8f,0x6d,0x75,0x91,0x57,0x59,0x7a,0x58,0x59,0x79,0x63,0x6c,0x89,0x8d,0x91, 0xa7,0xa0,0xa2,0xb4,0x98,0x98,0xae,0x83,0x83,0x9c,0x7e,0x7d,0x98,0x7b,0x7c,0x97, 0x74,0x75,0x90,0x6c,0x6d,0x8b,0x60,0x64,0x83,0x61,0x67,0x87,0x48,0x4f,0x64,0x40, 0x43,0x5a,0x4d,0x4a,0x62,0x56,0x4e,0x66,0x57,0x4d,0x62,0x56,0x4b,0x60,0x55,0x4a, 0x5f,0x4a,0x41,0x56,0x3e,0x37,0x49,0x51,0x4a,0x58,0x4e,0x45,0x54,0x42,0x3a,0x4b, 0x40,0x3a,0x4d,0x40,0x3b,0x4e,0x42,0x3d,0x4f,0x45,0x41,0x56,0x4c,0x4a,0x60,0x53, 0x53,0x6a,0x58,0x5a,0x73,0x5e,0x64,0x7a,0x62,0x67,0x7f,0x54,0x59,0x6e,0x48,0x4c, 0x62,0x4a,0x50,0x68,0x50,0x57,0x74,0x56,0x5e,0x7a,0x62,0x6a,0x84,0x66,0x6e,0x87, 0x66,0x6e,0x87,0x64,0x6c,0x85,0x64,0x6b,0x85,0x64,0x6b,0x85,0x63,0x6a,0x84,0x66, 0x6d,0x86,0x6a,0x72,0x8a,0x72,0x79,0x8f,0x72,0x7a,0x90,0x72,0x7a,0x90,0x6f,0x77, 0x8e,0x6a,0x72,0x8a,0x66,0x6d,0x86,0x5c,0x65,0x80,0x58,0x60,0x7c,0x54,0x5c,0x79, 0x52,0x59,0x76,0x52,0x59,0x76,0x52,0x58,0x75,0x52,0x57,0x75,0x52,0x5a,0x76,0x67, 0x6f,0x86,0x7c,0x83,0x95,0x6d,0x74,0x89,0x5c,0x64,0x7a,0x51,0x58,0x6e,0x4a,0x50, 0x65,0x70,0x75,0x8d,0x8d,0x8e,0xa5,0x94,0x93,0xa7,0x86,0x85,0x9a,0x72,0x71,0x89, 0x68,0x66,0x81,0x66,0x65,0x80,0x66,0x64,0x7e,0x65,0x63,0x7f,0x66,0x63,0x7f,0x66, 0x63,0x7f,0x65,0x62,0x7e,0x64,0x60,0x7d,0x64,0x60,0x7d,0x62,0x5d,0x7a,0x5f,0x5c, 0x77,0x4a,0x49,0x5e,0x2b,0x2e,0x36,0x2a,0x2e,0x35,0x2a,0x2c,0x34,0x27,0x2a,0x31, 0x25,0x28,0x2e,0x25,0x26,0x2e,0x23,0x26,0x2c,0x21,0x22,0x29,0x21,0x22,0x29,0x20, 0x22,0x28,0x1e,0x21,0x26,0x1e,0x20,0x26,0x1d,0x1e,0x24,0x1e,0x1f,0x24,0x1e,0x1f, 0x24,0x1f,0x21,0x26,0x1e,0x20,0x24,0x1c,0x1e,0x22,0x19,0x1a,0x1e,0x16,0x18,0x1c, 0x15,0x16,0x1a,0x12,0x14,0x17,0x11,0x12,0x16,0x10,0x11,0x14,0x11,0x12,0x16,0x10, 0x11,0x15,0x10,0x11,0x15,0x12,0x12,0x16,0x12,0x13,0x16,0x12,0x13,0x16,0x10,0x11, 0x15,0x0e,0x0f,0x13,0x0c,0x0e,0x11,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d, 0x08,0x09,0x0c,0x09,0x0a,0x0c,0x09,0x0a,0x0d,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08, 0x08,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0b,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x07, 0x09,0x06,0x06,0x09,0x06,0x06,0x07,0x05,0x06,0x07,0x05,0x05,0x06,0x04,0x04,0x06, 0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,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,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,0x2a,0x29,0x38,0x64,0x62,0x86,0x77,0x63,0x7c,0x38, 0x2a,0x33,0x35,0x27,0x2f,0x35,0x28,0x30,0x39,0x2b,0x34,0x78,0x69,0x86,0x9e,0xa6, 0xbe,0x91,0x9a,0xb6,0xa3,0xab,0xc2,0xbc,0xbe,0xc3,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,0x31,0x31,0x31,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xfc,0xfc,0xfc, 0x84,0x84,0x84,0xea,0xea,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xde,0xdd,0xde,0x1b, 0x1a,0x28,0x3f,0x3d,0x5e,0x63,0x4e,0x6d,0x60,0x53,0x77,0x73,0x7e,0xa1,0xc1,0xc3, 0xce,0x52,0x40,0x4f,0x5e,0x4b,0x5d,0x67,0x53,0x67,0x16,0x12,0x16,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,0x25,0x25,0x26,0x66,0x73,0x97, 0x64,0x53,0x74,0x64,0x4e,0x6c,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x54,0x50,0x79,0x56,0x50,0x79,0x57,0x50,0x79, 0x5a,0x52,0x79,0x5c,0x52,0x79,0x60,0x53,0x77,0x4f,0x38,0x4f,0x63,0x4b,0x67,0x6f, 0x76,0x8b,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x46,0x5c,0xcf,0xd3,0xde,0xf2,0xf2,0xf5, 0xa4,0xab,0xbe,0x57,0x62,0x85,0x53,0x5d,0x80,0x4b,0x54,0x73,0x1d,0x21,0x2e,0x02, 0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05, 0x05,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x08,0x06,0x07,0x08, 0x07,0x07,0x09,0x72,0x75,0x89,0x5e,0x6a,0x90,0x57,0x63,0x8a,0x57,0x61,0x8d,0x54, 0x50,0x78,0x54,0x51,0x77,0x54,0x51,0x77,0x52,0x50,0x78,0x52,0x50,0x7a,0x52,0x54, 0x7b,0x52,0x5a,0x82,0x53,0x54,0x7a,0x54,0x5e,0x84,0x9d,0x9e,0xa9,0x36,0x2c,0x34, 0x38,0x2f,0x39,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0e,0x0f,0x12,0x0f, 0x10,0x12,0x0e,0x0e,0x12,0x37,0x2d,0x36,0x27,0x1f,0x24,0x6b,0x6b,0x76,0x72,0x7c, 0x9b,0x50,0x52,0x7c,0x4e,0x47,0x69,0x5d,0x52,0x76,0x5d,0x53,0x78,0x5b,0x51,0x78, 0x5a,0x52,0x79,0x57,0x50,0x79,0x56,0x50,0x78,0x5a,0x52,0x79,0x50,0x49,0x6a,0x4f, 0x47,0x68,0x5d,0x53,0x78,0x3f,0x37,0x4a,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a, 0x0c,0x0a,0x0a,0x0d,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x09,0x0a,0x0b,0x0b,0x0b,0x0d, 0x0a,0x0b,0x0c,0x0c,0x0c,0x10,0x65,0x73,0xa5,0x52,0x50,0x78,0x47,0x42,0x61,0x56, 0x4d,0x6f,0x5e,0x52,0x75,0x5e,0x53,0x75,0x5f,0x52,0x75,0x5f,0x52,0x76,0x5e,0x53, 0x76,0x6f,0x64,0x84,0x72,0x68,0x86,0x6b,0x5f,0x7f,0x5f,0x54,0x70,0x75,0x64,0x8f, 0x33,0x2b,0x3a,0x07,0x07,0x0a,0x0c,0x0c,0x10,0x11,0x10,0x15,0x16,0x15,0x1a,0x1d, 0x1a,0x22,0x21,0x1e,0x26,0x26,0x23,0x2d,0x2a,0x27,0x31,0x2c,0x28,0x33,0x2e,0x2a, 0x35,0x35,0x2e,0x3b,0x38,0x31,0x3f,0x38,0x31,0x3f,0x39,0x31,0x3f,0x3c,0x33,0x42, 0x3d,0x34,0x43,0x3e,0x35,0x44,0x3f,0x35,0x43,0x3e,0x35,0x43,0x52,0x45,0x58,0x51, 0x44,0x56,0x69,0x54,0x73,0x5a,0x49,0x64,0x5a,0x49,0x64,0x5b,0x4a,0x65,0x5b,0x4d, 0x69,0x5c,0x4f,0x6d,0x5c,0x4f,0x6d,0x34,0x2c,0x42,0x31,0x2b,0x40,0x23,0x23,0x35, 0x0c,0x0e,0x12,0x2c,0x25,0x30,0x46,0x3a,0x49,0x77,0x7b,0x91,0x55,0x61,0x7f,0x63, 0x6c,0x8e,0x64,0x6e,0x90,0x66,0x71,0x92,0x65,0x6f,0x8f,0x65,0x6b,0x8c,0x65,0x67, 0x86,0x5f,0x61,0x7e,0x55,0x58,0x73,0x4d,0x50,0x6a,0x4d,0x4d,0x66,0x52,0x52,0x6c, 0x54,0x56,0x74,0x4f,0x56,0x75,0x5c,0x5a,0x78,0x50,0x49,0x61,0x56,0x4f,0x6a,0x52, 0x56,0x78,0x82,0x8a,0xa2,0x99,0x9e,0xb3,0x9c,0x9e,0xb1,0x8b,0x8c,0xa1,0x89,0x89, 0x9f,0x88,0x88,0x9f,0x86,0x86,0x9f,0x88,0x89,0xa0,0x7b,0x7e,0x99,0x6b,0x74,0x92, 0x52,0x59,0x6e,0x43,0x4a,0x62,0x4a,0x4a,0x65,0x4e,0x4b,0x66,0x51,0x4b,0x64,0x53, 0x4a,0x61,0x53,0x4b,0x63,0x50,0x4a,0x62,0x4a,0x44,0x5a,0x43,0x3c,0x4d,0x56,0x4e, 0x5d,0x50,0x47,0x59,0x40,0x38,0x48,0x3a,0x32,0x43,0x3e,0x36,0x49,0x41,0x3a,0x4e, 0x46,0x41,0x56,0x4a,0x47,0x5d,0x4b,0x4a,0x61,0x52,0x54,0x6b,0x5f,0x62,0x7a,0x5e, 0x64,0x7a,0x52,0x57,0x6e,0x4d,0x53,0x6e,0x51,0x57,0x73,0x55,0x5d,0x79,0x5f,0x68, 0x81,0x64,0x6c,0x86,0x66,0x6e,0x86,0x64,0x6b,0x85,0x62,0x6a,0x84,0x64,0x6b,0x85, 0x65,0x6c,0x86,0x66,0x6e,0x86,0x66,0x6e,0x87,0x6a,0x72,0x8a,0x6c,0x74,0x8b,0x6e, 0x76,0x8d,0x6f,0x77,0x8e,0x6e,0x76,0x8d,0x6a,0x72,0x8a,0x66,0x6f,0x88,0x5e,0x66, 0x82,0x5a,0x62,0x7e,0x56,0x5e,0x7a,0x54,0x5c,0x79,0x53,0x5a,0x77,0x52,0x59,0x76, 0x52,0x58,0x76,0x52,0x5a,0x77,0x73,0x7a,0x8f,0x86,0x8d,0x9c,0x6e,0x76,0x8a,0x64, 0x6b,0x81,0x61,0x67,0x7c,0x80,0x85,0x9c,0x87,0x8c,0xa4,0x9c,0x9c,0xaf,0x9a,0x99, 0xad,0x84,0x83,0x99,0x6f,0x6d,0x88,0x6a,0x69,0x83,0x6a,0x67,0x82,0x68,0x66,0x81, 0x67,0x65,0x81,0x67,0x65,0x81,0x67,0x64,0x80,0x66,0x63,0x7f,0x66,0x62,0x7e,0x63, 0x5f,0x7c,0x60,0x5c,0x78,0x50,0x4f,0x63,0x2e,0x31,0x3a,0x2e,0x30,0x39,0x2b,0x2e, 0x36,0x2a,0x2c,0x33,0x28,0x2a,0x32,0x29,0x2b,0x32,0x27,0x2a,0x31,0x26,0x28,0x2e, 0x26,0x28,0x2e,0x24,0x26,0x2c,0x22,0x25,0x2a,0x21,0x23,0x29,0x21,0x23,0x29,0x21, 0x22,0x28,0x22,0x23,0x28,0x20,0x22,0x26,0x1e,0x20,0x25,0x1d,0x1e,0x23,0x1a,0x1c, 0x21,0x18,0x1a,0x1e,0x17,0x19,0x1e,0x16,0x17,0x1c,0x16,0x16,0x1b,0x12,0x14,0x18, 0x12,0x14,0x18,0x14,0x15,0x1a,0x15,0x16,0x1b,0x16,0x17,0x1c,0x16,0x17,0x1c,0x16, 0x18,0x1d,0x15,0x16,0x1b,0x12,0x13,0x18,0x10,0x12,0x16,0x0e,0x0f,0x13,0x0b,0x0c, 0x10,0x0c,0x0d,0x10,0x0b,0x0c,0x0f,0x0a,0x0b,0x0f,0x0b,0x0c,0x10,0x0b,0x0c,0x0f, 0x0a,0x0c,0x0f,0x0a,0x0c,0x0f,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x08,0x09,0x0c,0x08, 0x09,0x0c,0x08,0x09,0x0b,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06, 0x07,0x05,0x06,0x07,0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x02,0x03,0x04, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x15,0x16,0x1b, 0x77,0x7e,0x95,0x7a,0x85,0xa5,0x68,0x70,0x95,0x6f,0x5a,0x71,0x3e,0x2f,0x39,0x88, 0x92,0xaf,0x8f,0x99,0xb4,0x8d,0x97,0xb3,0x7f,0x89,0xa9,0xa5,0xad,0xc3,0x62,0x67, 0x72,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,0xbb,0xbb,0xbb,0xfd,0xfd,0xfd,0xff,0xff, 0xff,0xe2,0xe2,0xe2,0x6b,0x6b,0x6b,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff, 0x9d,0x9d,0x9e,0x26,0x25,0x39,0x46,0x45,0x6a,0x64,0x4d,0x6a,0x60,0x53,0x77,0x6e, 0x7b,0x9d,0xc0,0xc0,0xcb,0x55,0x42,0x52,0x62,0x4e,0x61,0x6b,0x56,0x6c,0x08,0x07, 0x0a,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,0x59,0x5f,0x70,0x52,0x50,0x7b,0x5f,0x47,0x64,0x62,0x53,0x77,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x53,0x4f,0x7a,0x54,0x50,0x79,0x55,0x50,0x79,0x57,0x50, 0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5c,0x52,0x79,0x5e,0x53,0x79,0x64,0x4f,0x6e, 0x57,0x40,0x5a,0x5b,0x52,0x79,0x5f,0x62,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x11,0x17,0xc0,0xc5, 0xd2,0xf3,0xf4,0xf6,0xa5,0xaa,0xb4,0x39,0x3f,0x4e,0x42,0x4a,0x62,0x54,0x5f,0x81, 0x55,0x5f,0x83,0x14,0x16,0x1c,0x02,0x03,0x03,0x02,0x03,0x03,0x04,0x04,0x05,0x04, 0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06, 0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x6f,0x71,0x86,0x5e,0x6a,0x8f,0x58,0x63,0x8b, 0x57,0x62,0x8d,0x53,0x51,0x78,0x52,0x50,0x78,0x53,0x4f,0x78,0x52,0x50,0x78,0x52, 0x52,0x7a,0x52,0x53,0x7c,0x53,0x5b,0x83,0x52,0x51,0x7a,0x56,0x61,0x88,0xa4,0xa4, 0xae,0x35,0x2b,0x33,0x39,0x2f,0x3a,0x0d,0x0e,0x10,0x0e,0x0e,0x11,0x0e,0x0e,0x12, 0x0e,0x0e,0x12,0x0d,0x0e,0x10,0x0d,0x0e,0x0f,0x3a,0x2f,0x39,0x29,0x1f,0x26,0x4c, 0x48,0x50,0x7f,0x88,0xa5,0x52,0x5d,0x85,0x4d,0x46,0x69,0x58,0x50,0x73,0x5d,0x52, 0x78,0x5e,0x53,0x79,0x5a,0x52,0x79,0x56,0x50,0x79,0x56,0x51,0x79,0x58,0x50,0x79, 0x50,0x49,0x6a,0x4e,0x47,0x66,0x5d,0x53,0x78,0x48,0x3d,0x53,0x08,0x08,0x0a,0x08, 0x09,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x08,0x09,0x0a,0x08,0x09,0x0a,0x08,0x08, 0x0a,0x08,0x09,0x0a,0x07,0x08,0x0a,0x07,0x07,0x09,0x62,0x6f,0x9f,0x54,0x54,0x7e, 0x49,0x44,0x63,0x56,0x4c,0x6e,0x5e,0x51,0x75,0x5e,0x52,0x75,0x5f,0x52,0x75,0x5e, 0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x69,0x5f,0x7f,0x6f,0x63,0x83,0x68,0x5e, 0x7b,0x86,0x78,0x9c,0x49,0x3f,0x4f,0x06,0x06,0x07,0x07,0x08,0x0a,0x0a,0x0b,0x0d, 0x12,0x11,0x16,0x16,0x15,0x1b,0x18,0x17,0x1e,0x1d,0x1b,0x23,0x21,0x1f,0x28,0x25, 0x22,0x2c,0x2b,0x27,0x31,0x32,0x2c,0x38,0x31,0x2c,0x38,0x2f,0x2a,0x36,0x32,0x2b, 0x38,0x39,0x31,0x3e,0x3e,0x35,0x44,0x3f,0x36,0x45,0x43,0x39,0x49,0x48,0x3c,0x4c, 0x4a,0x3f,0x4f,0x58,0x49,0x5c,0x60,0x50,0x69,0x63,0x51,0x6a,0x5c,0x4b,0x66,0x5a, 0x49,0x64,0x5b,0x4a,0x66,0x5c,0x4b,0x67,0x5c,0x4e,0x6c,0x4c,0x43,0x5d,0x30,0x2a, 0x3e,0x30,0x2a,0x41,0x13,0x14,0x1c,0x0f,0x10,0x14,0x32,0x2b,0x37,0x8b,0x85,0x8f, 0x6d,0x74,0x8d,0x5f,0x69,0x89,0x66,0x70,0x93,0x69,0x73,0x93,0x6b,0x73,0x94,0x6c, 0x70,0x8f,0x6b,0x6c,0x8b,0x67,0x67,0x85,0x5e,0x5f,0x7a,0x4e,0x51,0x69,0x44,0x46, 0x5b,0x35,0x38,0x49,0x38,0x3b,0x4e,0x41,0x43,0x58,0x3b,0x3b,0x4e,0x30,0x2e,0x3d, 0x38,0x37,0x4a,0x56,0x51,0x6c,0x59,0x58,0x79,0x56,0x5c,0x7f,0x68,0x6e,0x8b,0x74, 0x77,0x90,0x7e,0x80,0x96,0x7f,0x80,0x98,0x8b,0x8c,0xa3,0x96,0x98,0xad,0x7f,0x83, 0x9b,0x6e,0x79,0x95,0x56,0x5d,0x73,0x4d,0x54,0x6b,0x4d,0x54,0x6e,0x4e,0x50,0x6b, 0x4a,0x4a,0x66,0x49,0x47,0x61,0x4a,0x49,0x63,0x4b,0x4a,0x64,0x48,0x46,0x60,0x46, 0x42,0x56,0x47,0x3f,0x4f,0x5e,0x56,0x64,0x38,0x31,0x3e,0x32,0x2b,0x37,0x3e,0x36, 0x47,0x3e,0x39,0x4a,0x43,0x3e,0x52,0x46,0x42,0x56,0x48,0x46,0x5b,0x4a,0x49,0x5f, 0x50,0x50,0x67,0x5b,0x5e,0x76,0x5e,0x65,0x7e,0x57,0x5f,0x7a,0x54,0x5c,0x78,0x56, 0x5e,0x7a,0x5f,0x67,0x81,0x61,0x69,0x82,0x62,0x6a,0x84,0x61,0x69,0x83,0x5e,0x66, 0x81,0x61,0x69,0x82,0x64,0x6b,0x85,0x65,0x6c,0x86,0x66,0x6e,0x87,0x66,0x6e,0x87, 0x68,0x70,0x89,0x67,0x6f,0x88,0x6a,0x72,0x8a,0x6b,0x73,0x8a,0x6b,0x73,0x8a,0x6b, 0x73,0x8a,0x68,0x70,0x89,0x63,0x6a,0x84,0x5d,0x66,0x80,0x5a,0x62,0x7e,0x56,0x5e, 0x7b,0x57,0x5f,0x7a,0x54,0x5d,0x79,0x54,0x5d,0x79,0x58,0x60,0x7b,0x71,0x78,0x8e, 0x8a,0x8f,0x9e,0x83,0x8a,0x9a,0x82,0x88,0x98,0x95,0x99,0xad,0x89,0x8e,0xa9,0x92, 0x93,0xa9,0x96,0x97,0xa9,0x86,0x85,0x9a,0x72,0x72,0x8b,0x6e,0x6d,0x87,0x6b,0x69, 0x85,0x6b,0x69,0x85,0x6a,0x67,0x83,0x6a,0x68,0x83,0x67,0x65,0x81,0x68,0x65,0x81, 0x66,0x65,0x80,0x65,0x61,0x7d,0x61,0x5f,0x7a,0x55,0x53,0x69,0x31,0x34,0x3d,0x30, 0x32,0x3b,0x2e,0x31,0x39,0x2c,0x2f,0x37,0x2c,0x2f,0x36,0x2e,0x30,0x36,0x30,0x32, 0x37,0x30,0x32,0x36,0x30,0x32,0x36,0x2e,0x30,0x36,0x2c,0x2e,0x34,0x2a,0x2b,0x32, 0x28,0x2a,0x30,0x29,0x2b,0x31,0x28,0x2a,0x2f,0x25,0x26,0x2c,0x22,0x24,0x2a,0x20, 0x22,0x28,0x1e,0x20,0x25,0x1d,0x1f,0x25,0x1d,0x1e,0x25,0x1b,0x1e,0x23,0x19,0x1a, 0x20,0x18,0x1a,0x1e,0x17,0x19,0x1e,0x17,0x19,0x1e,0x18,0x1a,0x1f,0x1a,0x1c,0x22, 0x1a,0x1c,0x22,0x1a,0x1d,0x22,0x19,0x1a,0x20,0x15,0x16,0x1c,0x12,0x14,0x19,0x13, 0x14,0x18,0x3e,0x3f,0x43,0x0e,0x10,0x15,0x0e,0x0f,0x14,0x0e,0x0f,0x14,0x0e,0x0f, 0x14,0x0e,0x0f,0x14,0x0e,0x0e,0x13,0x0d,0x0e,0x12,0x0c,0x0e,0x12,0x0b,0x0c,0x10, 0x0a,0x0b,0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0c,0x07,0x08,0x0b,0x07, 0x08,0x0a,0x06,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x07,0x04,0x05,0x06,0x04,0x04, 0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,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,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,0x12,0x13,0x17,0x5f,0x64,0x74,0xa6,0xae,0xc4, 0x84,0x8e,0xac,0x8c,0x96,0xb2,0x99,0xa2,0xbb,0x84,0x8f,0xad,0x77,0x82,0xa3,0x6b, 0x75,0x99,0x9d,0xa5,0xbc,0x18,0x1a,0x20,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,0x08,0x08,0x08,0xf3,0xf3,0xf3,0xff, 0xff,0xff,0xff,0xff,0xff,0x7a,0x7a,0x7a,0xaf,0xaf,0xaf,0xfd,0xfd,0xfd,0xff,0xff, 0xff,0xfa,0xfa,0xfa,0x40,0x3f,0x45,0x34,0x32,0x4d,0x4d,0x4b,0x73,0x63,0x4b,0x67, 0x64,0x53,0x76,0x72,0x7e,0xa1,0xbc,0xbb,0xc6,0x57,0x44,0x55,0x65,0x51,0x65,0x73, 0x5e,0x76,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,0x1d,0x1e,0x21,0x5c,0x69,0x8f,0x64,0x53,0x74,0x64,0x4c, 0x69,0x55,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x53,0x4f,0x7a,0x54,0x50,0x79,0x54,0x50,0x79,0x55,0x50,0x79,0x57, 0x50,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5e,0x53, 0x79,0x5e,0x53,0x79,0x63,0x4b,0x67,0x53,0x3c,0x54,0x54,0x5f,0x89,0x42,0x42,0x44, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x86,0x8c,0x9d,0xdf,0xe1,0xea,0xaf,0xb5,0xc4,0x25,0x24,0x2c,0x19,0x1c, 0x25,0x45,0x4d,0x67,0x57,0x62,0x82,0x58,0x62,0x87,0x22,0x26,0x32,0x02,0x03,0x03, 0x02,0x03,0x03,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x05,0x05,0x05,0x06,0x05, 0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x67,0x68,0x7f,0x5f,0x6b, 0x90,0x5a,0x65,0x8c,0x5a,0x66,0x92,0x52,0x50,0x79,0x52,0x4f,0x78,0x52,0x4f,0x78, 0x52,0x50,0x79,0x52,0x53,0x7b,0x52,0x54,0x7e,0x52,0x5a,0x82,0x52,0x52,0x7a,0x57, 0x62,0x88,0xa6,0xa6,0xaf,0x34,0x2a,0x33,0x3c,0x31,0x3c,0x0d,0x0e,0x0f,0x0c,0x0d, 0x0f,0x0d,0x0e,0x0f,0x0d,0x0e,0x0f,0x0c,0x0d,0x0f,0x0c,0x0c,0x0e,0x39,0x2e,0x36, 0x29,0x1f,0x25,0x20,0x19,0x1c,0x84,0x8a,0xa2,0x56,0x62,0x8a,0x4e,0x49,0x6d,0x56, 0x4c,0x6f,0x5d,0x52,0x78,0x5c,0x52,0x79,0x5a,0x52,0x79,0x54,0x50,0x79,0x55,0x50, 0x79,0x56,0x50,0x78,0x51,0x49,0x6d,0x4c,0x44,0x62,0x5b,0x52,0x77,0x4d,0x41,0x5a, 0x08,0x08,0x0a,0x07,0x08,0x09,0x08,0x09,0x0a,0x08,0x08,0x0a,0x08,0x09,0x0a,0x07, 0x08,0x0a,0x07,0x07,0x09,0x07,0x08,0x0a,0x07,0x08,0x0a,0x06,0x06,0x07,0x5c,0x68, 0x94,0x55,0x56,0x81,0x48,0x44,0x65,0x53,0x49,0x6a,0x5e,0x53,0x76,0x5e,0x52,0x75, 0x5e,0x52,0x76,0x5f,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x54,0x49,0x69,0x73,0x65,0x8d,0x5f,0x55,0x66,0x3f,0x3f,0x41,0x1f,0x20, 0x22,0x0a,0x0a,0x0d,0x11,0x11,0x16,0x15,0x14,0x19,0x16,0x15,0x1a,0x19,0x17,0x1e, 0x1b,0x1a,0x21,0x1f,0x1e,0x26,0x25,0x22,0x2c,0x2c,0x28,0x33,0x2d,0x29,0x34,0x2e, 0x29,0x35,0x32,0x2d,0x39,0x3c,0x34,0x42,0x3f,0x36,0x44,0x40,0x37,0x46,0x44,0x3b, 0x4b,0x45,0x3c,0x4c,0x46,0x3b,0x4b,0x4c,0x40,0x51,0x54,0x46,0x59,0x68,0x55,0x6f, 0x5e,0x4c,0x66,0x5c,0x4a,0x65,0x5b,0x49,0x64,0x5c,0x4a,0x65,0x5c,0x4a,0x67,0x5d, 0x4d,0x6a,0x35,0x2d,0x41,0x31,0x2a,0x40,0x2d,0x29,0x3d,0x0b,0x0c,0x10,0x2c,0x24, 0x2f,0x46,0x3a,0x48,0x9e,0x9e,0xab,0x5a,0x64,0x7e,0x69,0x74,0x95,0x6c,0x76,0x96, 0x6d,0x75,0x96,0x70,0x75,0x93,0x6f,0x72,0x8f,0x6d,0x6e,0x8a,0x67,0x68,0x84,0x61, 0x62,0x7d,0x51,0x53,0x6a,0x3e,0x41,0x54,0x35,0x39,0x4b,0x31,0x35,0x46,0x2f,0x31, 0x41,0x2f,0x30,0x40,0x32,0x33,0x44,0x37,0x36,0x4a,0x42,0x3e,0x54,0x56,0x51,0x6c, 0x56,0x54,0x71,0x50,0x4f,0x71,0x50,0x53,0x74,0x52,0x57,0x77,0x67,0x6a,0x88,0x76, 0x7b,0x96,0x67,0x6d,0x89,0x64,0x6f,0x8d,0x51,0x58,0x6e,0x52,0x5a,0x70,0x52,0x5a, 0x74,0x51,0x58,0x73,0x4b,0x52,0x6c,0x47,0x4b,0x65,0x49,0x4a,0x65,0x4a,0x4a,0x65, 0x48,0x46,0x60,0x46,0x44,0x5d,0x3b,0x37,0x48,0x4b,0x44,0x54,0x5b,0x53,0x63,0x3e, 0x37,0x45,0x42,0x39,0x4a,0x45,0x3d,0x51,0x46,0x40,0x56,0x45,0x41,0x56,0x45,0x41, 0x55,0x46,0x43,0x5a,0x4a,0x49,0x5f,0x4e,0x4e,0x63,0x52,0x54,0x6b,0x5a,0x5f,0x7a, 0x57,0x5f,0x7a,0x5a,0x62,0x7d,0x5d,0x66,0x7f,0x5f,0x67,0x82,0x5f,0x67,0x82,0x61, 0x69,0x82,0x61,0x69,0x82,0x62,0x6a,0x83,0x63,0x6a,0x84,0x64,0x6b,0x85,0x65,0x6c, 0x86,0x66,0x6d,0x86,0x65,0x6c,0x86,0x64,0x6b,0x85,0x64,0x6b,0x85,0x66,0x6d,0x86, 0x68,0x70,0x89,0x6a,0x72,0x8a,0x6a,0x72,0x8a,0x6a,0x72,0x8a,0x66,0x6e,0x87,0x61, 0x6a,0x83,0x5e,0x66,0x81,0x5a,0x63,0x7e,0x5a,0x62,0x7d,0x59,0x61,0x7d,0x57,0x5f, 0x7b,0x5b,0x64,0x7e,0x74,0x7b,0x90,0x97,0x9b,0xa8,0xa0,0xa4,0xae,0xb0,0xb3,0xc1, 0x9f,0xa2,0xb9,0x93,0x96,0xad,0x93,0x94,0xa9,0x87,0x88,0x9f,0x76,0x76,0x8e,0x71, 0x71,0x89,0x6f,0x6e,0x88,0x6e,0x6d,0x88,0x6c,0x6b,0x85,0x6c,0x6a,0x85,0x6b,0x69, 0x85,0x6a,0x69,0x84,0x69,0x67,0x81,0x67,0x64,0x80,0x62,0x60,0x7a,0x59,0x58,0x6f, 0x34,0x37,0x41,0x32,0x35,0x3e,0x30,0x33,0x3c,0x2f,0x32,0x3a,0x32,0x34,0x3a,0x36, 0x39,0x3e,0x3a,0x3c,0x41,0x3d,0x3e,0x42,0x40,0x41,0x44,0x3e,0x40,0x44,0x3c,0x3d, 0x42,0x36,0x37,0x3d,0x34,0x36,0x3c,0x36,0x37,0x3d,0x31,0x33,0x39,0x2a,0x2c,0x32, 0x26,0x29,0x2f,0x25,0x27,0x2e,0x23,0x25,0x2c,0x24,0x26,0x2e,0x23,0x26,0x2c,0x22, 0x25,0x2c,0x20,0x22,0x28,0x1c,0x1e,0x24,0x1b,0x1e,0x23,0x1a,0x1c,0x22,0x46,0x48, 0x4d,0x1b,0x1e,0x24,0x1d,0x1e,0x26,0x1e,0x20,0x26,0x1c,0x1e,0x24,0x1e,0x20,0x26, 0x47,0x49,0x4d,0x7f,0x80,0x83,0x7d,0x7e,0x80,0x78,0x79,0x7c,0x6c,0x6c,0x6f,0x12, 0x13,0x19,0x12,0x13,0x19,0x10,0x12,0x17,0x11,0x12,0x17,0x0e,0x10,0x15,0x0e,0x10, 0x15,0x0e,0x0f,0x14,0x0c,0x0e,0x12,0x0c,0x0d,0x11,0x0a,0x0b,0x0f,0x0a,0x0b,0x0e, 0x09,0x0a,0x0d,0x08,0x09,0x0c,0x07,0x08,0x0a,0x06,0x07,0x0a,0x06,0x07,0x09,0x06, 0x06,0x07,0x05,0x06,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x1a,0x1d,0x25,0xab,0xb3,0xc8,0xbb,0xc1,0xd2,0x8b,0x95,0xb1, 0x70,0x7a,0x9d,0x68,0x68,0x8e,0x68,0x72,0x96,0x77,0x80,0x99,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,0xa2,0xa2,0xa2, 0xff,0xff,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0x29,0x29,0x29,0xe7,0xe7,0xe7,0xff, 0xff,0xff,0xff,0xff,0xff,0xe7,0xe7,0xe7,0x19,0x18,0x25,0x3e,0x3c,0x5c,0x51,0x51, 0x7b,0x63,0x4b,0x67,0x64,0x53,0x74,0x71,0x7d,0xa0,0xb9,0xb7,0xc1,0x5d,0x4a,0x5c, 0x6c,0x57,0x6d,0x6c,0x5e,0x78,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,0x5a,0x5f,0x70,0x52, 0x50,0x7b,0x63,0x4b,0x67,0x63,0x53,0x77,0x54,0x50,0x79,0x54,0x50,0x79,0x54,0x50, 0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79, 0x57,0x50,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5e, 0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x5c,0x44,0x5f,0x57,0x40, 0x5a,0x6d,0x78,0x97,0x1a,0x1b,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x3a,0x47,0xb3,0xba,0xcc,0x98,0xa2,0xba,0x28, 0x23,0x2b,0x0c,0x0b,0x0e,0x20,0x24,0x2f,0x32,0x39,0x4c,0x54,0x5f,0x7e,0x55,0x60, 0x84,0x3c,0x3d,0x5b,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x05,0x05, 0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x64, 0x66,0x7c,0x5e,0x6a,0x8f,0x5a,0x66,0x8c,0x5b,0x67,0x93,0x53,0x50,0x79,0x52,0x4f, 0x78,0x52,0x4f,0x79,0x52,0x4f,0x7a,0x52,0x52,0x7b,0x52,0x55,0x7e,0x52,0x5d,0x86, 0x52,0x53,0x7a,0x5b,0x64,0x8b,0xa7,0xa6,0xae,0x32,0x28,0x30,0x3d,0x32,0x3c,0x0b, 0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0a,0x0b,0x0d,0x0a,0x0b, 0x0d,0x37,0x2c,0x35,0x2a,0x20,0x25,0x21,0x1a,0x1d,0x7c,0x7f,0x91,0x5f,0x6a,0x8f, 0x4c,0x49,0x72,0x52,0x4b,0x6c,0x5b,0x51,0x78,0x5b,0x52,0x79,0x5a,0x52,0x79,0x55, 0x50,0x79,0x53,0x50,0x79,0x55,0x51,0x79,0x50,0x49,0x6e,0x47,0x40,0x5e,0x5b,0x52, 0x77,0x52,0x48,0x64,0x06,0x07,0x08,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08, 0x06,0x07,0x08,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x07,0x09,0x06,0x06,0x07,0x05, 0x06,0x06,0x52,0x5d,0x87,0x57,0x58,0x84,0x49,0x46,0x67,0x4f,0x48,0x69,0x5e,0x53, 0x75,0x5f,0x52,0x75,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x56,0x4a,0x69,0x67,0x5a,0x81,0x52,0x44,0x5d,0x0a, 0x0b,0x0c,0x2d,0x2d,0x2f,0x0a,0x0b,0x0d,0x0e,0x0e,0x13,0x14,0x13,0x19,0x15,0x14, 0x1a,0x17,0x16,0x1d,0x18,0x17,0x1d,0x1a,0x18,0x20,0x1e,0x1c,0x24,0x24,0x21,0x2b, 0x2a,0x27,0x31,0x2c,0x28,0x33,0x32,0x2c,0x38,0x3d,0x35,0x43,0x3e,0x36,0x45,0x3f, 0x37,0x45,0x44,0x3b,0x4a,0x44,0x3b,0x4a,0x44,0x3a,0x49,0x40,0x37,0x45,0x4e,0x42, 0x53,0x5d,0x4e,0x65,0x5f,0x4e,0x67,0x5c,0x4b,0x64,0x5a,0x48,0x64,0x5c,0x4a,0x66, 0x5d,0x4a,0x66,0x5d,0x4b,0x67,0x54,0x46,0x60,0x31,0x28,0x3e,0x31,0x2a,0x3f,0x1e, 0x1f,0x2d,0x1b,0x18,0x1f,0x4d,0x3f,0x4f,0x7c,0x72,0x7e,0x79,0x80,0x94,0x63,0x6d, 0x89,0x70,0x7a,0x98,0x76,0x7f,0x9d,0x74,0x7c,0x99,0x74,0x79,0x95,0x72,0x76,0x91, 0x6e,0x72,0x8d,0x6b,0x6e,0x8a,0x64,0x68,0x83,0x59,0x5f,0x76,0x48,0x4d,0x63,0x3d, 0x41,0x54,0x35,0x39,0x4a,0x31,0x33,0x43,0x2e,0x2f,0x3f,0x2c,0x2c,0x3c,0x36,0x34, 0x45,0x42,0x3e,0x53,0x3c,0x38,0x4d,0x45,0x40,0x56,0x4d,0x44,0x5e,0x4f,0x46,0x5f, 0x58,0x50,0x6c,0x59,0x52,0x71,0x50,0x52,0x72,0x58,0x61,0x82,0x49,0x50,0x65,0x50, 0x57,0x6e,0x54,0x5b,0x75,0x54,0x5b,0x76,0x52,0x5a,0x72,0x4d,0x54,0x6b,0x46,0x4c, 0x65,0x47,0x49,0x62,0x47,0x46,0x60,0x46,0x44,0x5d,0x3a,0x37,0x4b,0x45,0x41,0x58, 0x52,0x4d,0x62,0x51,0x4c,0x5c,0x4c,0x46,0x54,0x4e,0x46,0x56,0x44,0x3c,0x4f,0x55, 0x50,0x64,0x46,0x41,0x56,0x45,0x3e,0x53,0x45,0x3f,0x54,0x48,0x46,0x5b,0x4b,0x4a, 0x60,0x4f,0x4f,0x67,0x54,0x58,0x71,0x55,0x5b,0x76,0x57,0x5f,0x7a,0x5e,0x65,0x80, 0x5e,0x67,0x82,0x5e,0x66,0x81,0x60,0x67,0x82,0x61,0x68,0x82,0x61,0x69,0x82,0x62, 0x6a,0x83,0x64,0x6b,0x85,0x63,0x6a,0x84,0x64,0x6b,0x85,0x65,0x6c,0x86,0x65,0x6c, 0x86,0x62,0x6a,0x84,0x64,0x6b,0x85,0x67,0x6f,0x88,0x6a,0x72,0x8a,0x6b,0x73,0x8a, 0x6a,0x72,0x8a,0x68,0x70,0x89,0x66,0x6f,0x88,0x61,0x6a,0x83,0x5f,0x67,0x82,0x5e, 0x66,0x81,0x5c,0x65,0x7f,0x5b,0x64,0x7e,0x6d,0x75,0x8c,0x90,0x95,0xa3,0xaa,0xac, 0xb5,0xc0,0xc1,0xcb,0xb0,0xb4,0xc7,0xa2,0xa3,0xb9,0x92,0x95,0xac,0x82,0x85,0x9d, 0x77,0x78,0x91,0x75,0x75,0x8e,0x72,0x72,0x8c,0x71,0x70,0x89,0x6f,0x6f,0x89,0x6e, 0x6d,0x88,0x6e,0x6c,0x86,0x6c,0x6b,0x85,0x6b,0x6a,0x85,0x68,0x65,0x81,0x64,0x62, 0x7c,0x5e,0x5b,0x74,0x38,0x3b,0x46,0x36,0x39,0x42,0x34,0x37,0x40,0x34,0x37,0x3f, 0x36,0x39,0x40,0x3e,0x40,0x45,0x46,0x47,0x4b,0x4d,0x4e,0x50,0x52,0x52,0x55,0x51, 0x52,0x55,0x4d,0x4e,0x52,0x44,0x46,0x4b,0x3e,0x40,0x46,0x3a,0x3d,0x43,0x36,0x38, 0x3e,0x55,0x58,0x5e,0x2a,0x2c,0x33,0x2a,0x2c,0x33,0x29,0x2b,0x33,0x2a,0x2c,0x34, 0x28,0x2a,0x32,0x26,0x29,0x30,0x22,0x25,0x2c,0x21,0x23,0x2a,0x30,0x32,0x3a,0x63, 0x64,0x69,0x4e,0x51,0x55,0x73,0x75,0x79,0x1f,0x22,0x29,0x23,0x26,0x2d,0x53,0x55, 0x59,0xa2,0xa3,0xa5,0x73,0x75,0x78,0x7a,0x7b,0x7f,0x69,0x6b,0x6e,0x4b,0x4d,0x51, 0x77,0x78,0x7b,0x6f,0x6f,0x74,0x70,0x72,0x75,0x26,0x27,0x2e,0x14,0x16,0x1b,0x29, 0x2b,0x30,0x4e,0x4f,0x53,0x5a,0x5c,0x5e,0x29,0x2b,0x2f,0x35,0x36,0x39,0x34,0x35, 0x39,0x33,0x34,0x37,0x33,0x34,0x37,0x21,0x21,0x24,0x08,0x09,0x0c,0x07,0x08,0x0b, 0x07,0x08,0x0a,0x06,0x07,0x09,0x06,0x06,0x08,0x05,0x06,0x07,0x04,0x04,0x06,0x03, 0x04,0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,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,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,0x0b,0x0c,0x0e,0xc4,0xc9, 0xd6,0xbc,0xc2,0xd3,0x71,0x7c,0x9e,0x68,0x66,0x8b,0x74,0x69,0x8a,0x68,0x72,0x97, 0x3c,0x41,0x52,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,0xec,0xec,0xec,0xff,0xff,0xff,0xfc,0xfc,0xfc,0x88,0x88,0x88,0x3c,0x3c,0x3c, 0xfc,0xfc,0xfc,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xb1,0xb0,0xb1,0x23,0x22,0x34,0x45, 0x42,0x67,0x52,0x52,0x7c,0x64,0x4e,0x6d,0x64,0x52,0x72,0x7b,0x85,0xa7,0xbb,0xb6, 0xbd,0x61,0x4d,0x60,0x72,0x5d,0x74,0x32,0x33,0x45,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, 0x1b,0x1c,0x1e,0x61,0x6b,0x91,0x62,0x53,0x77,0x62,0x4a,0x66,0x5a,0x52,0x79,0x55, 0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x56,0x50,0x79,0x57,0x50,0x79,0x57,0x50, 0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5b,0x52,0x79,0x5c,0x52,0x79, 0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x64, 0x53,0x76,0x58,0x41,0x5b,0x64,0x4e,0x6c,0x5b,0x65,0x80,0x05,0x05,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x70,0x86, 0x78,0x80,0xa1,0x3b,0x3b,0x4d,0x03,0x03,0x03,0x1d,0x21,0x2b,0x02,0x02,0x02,0x11, 0x13,0x19,0x56,0x42,0x5b,0x4b,0x35,0x4b,0x52,0x42,0x5b,0x1c,0x16,0x1a,0x03,0x03, 0x04,0x03,0x03,0x04,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x06,0x06, 0x05,0x06,0x06,0x60,0x62,0x7a,0x5e,0x6b,0x91,0x5a,0x65,0x8b,0x5b,0x68,0x95,0x52, 0x4f,0x79,0x51,0x4f,0x79,0x51,0x50,0x79,0x51,0x52,0x7a,0x51,0x53,0x7c,0x52,0x57, 0x81,0x52,0x5c,0x86,0x52,0x52,0x7a,0x5c,0x69,0x8e,0xa8,0xa6,0xad,0x32,0x27,0x2f, 0x3e,0x32,0x3c,0x0a,0x0b,0x0d,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x0a,0x0a,0x0b,0x0a, 0x0a,0x0c,0x0a,0x0a,0x0c,0x37,0x2c,0x35,0x2b,0x21,0x27,0x21,0x19,0x1e,0x73,0x76, 0x84,0x68,0x74,0x95,0x4f,0x4d,0x77,0x50,0x48,0x69,0x5a,0x51,0x78,0x5a,0x52,0x79, 0x5a,0x52,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x54,0x51,0x79,0x50,0x4a,0x6f,0x45, 0x3f,0x5c,0x5a,0x51,0x78,0x58,0x4c,0x6b,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x05, 0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07, 0x06,0x06,0x07,0x05,0x06,0x06,0x49,0x53,0x77,0x58,0x58,0x87,0x4b,0x48,0x6a,0x4d, 0x45,0x64,0x5e,0x53,0x75,0x5e,0x52,0x75,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53, 0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x56,0x4a,0x6a,0x65,0x57,0x7b, 0x5a,0x4d,0x68,0x08,0x08,0x0a,0x24,0x25,0x25,0x14,0x14,0x17,0x0a,0x0b,0x0f,0x10, 0x10,0x15,0x14,0x13,0x19,0x15,0x14,0x1a,0x16,0x16,0x1b,0x17,0x17,0x1d,0x18,0x17, 0x1e,0x1c,0x1a,0x22,0x22,0x1f,0x28,0x27,0x23,0x2d,0x2c,0x27,0x33,0x38,0x31,0x3e, 0x3d,0x35,0x43,0x3e,0x36,0x45,0x42,0x38,0x48,0x43,0x39,0x49,0x40,0x38,0x47,0x3e, 0x36,0x45,0x41,0x37,0x46,0x51,0x43,0x55,0x61,0x4f,0x68,0x58,0x48,0x61,0x59,0x47, 0x63,0x5c,0x4a,0x65,0x5c,0x49,0x64,0x5c,0x4a,0x66,0x5d,0x4b,0x68,0x39,0x2f,0x44, 0x31,0x2a,0x3e,0x2e,0x2a,0x40,0x12,0x12,0x17,0x4b,0x3e,0x4d,0x4d,0x3e,0x4f,0xb2, 0xaf,0xb5,0x61,0x6a,0x83,0x72,0x7d,0x9b,0x79,0x82,0x9f,0x7c,0x85,0x9e,0x7a,0x82, 0x9d,0x78,0x7e,0x98,0x76,0x7d,0x96,0x72,0x79,0x92,0x6e,0x74,0x8d,0x6a,0x70,0x8b, 0x61,0x69,0x84,0x5e,0x63,0x7f,0x5a,0x5b,0x74,0x3a,0x3c,0x4e,0x29,0x2c,0x39,0x24, 0x24,0x30,0x27,0x26,0x32,0x2d,0x2a,0x39,0x2b,0x29,0x38,0x2b,0x29,0x3a,0x2d,0x2a, 0x3a,0x30,0x2b,0x3c,0x38,0x32,0x44,0x4b,0x41,0x58,0x59,0x50,0x69,0x5a,0x5a,0x79, 0x3f,0x45,0x5b,0x4a,0x51,0x68,0x54,0x5b,0x73,0x56,0x5e,0x76,0x57,0x5e,0x75,0x56, 0x5d,0x72,0x52,0x58,0x6e,0x4f,0x56,0x6e,0x49,0x50,0x69,0x46,0x46,0x5f,0x45,0x44, 0x5d,0x44,0x42,0x5a,0x48,0x46,0x5e,0x4b,0x46,0x5d,0x50,0x49,0x5e,0x50,0x48,0x5d, 0x47,0x40,0x54,0x52,0x4f,0x5f,0x42,0x3e,0x51,0x44,0x3e,0x54,0x45,0x3f,0x54,0x48, 0x40,0x55,0x4a,0x45,0x5a,0x50,0x4c,0x63,0x4f,0x4e,0x66,0x4f,0x50,0x69,0x53,0x58, 0x74,0x56,0x5e,0x7a,0x5a,0x62,0x7e,0x5e,0x66,0x80,0x5e,0x66,0x81,0x60,0x68,0x82, 0x62,0x69,0x83,0x63,0x6b,0x85,0x66,0x6f,0x88,0x63,0x6b,0x85,0x62,0x6a,0x83,0x62, 0x6a,0x83,0x64,0x6b,0x85,0x63,0x6a,0x84,0x60,0x68,0x82,0x62,0x6a,0x84,0x68,0x70, 0x89,0x6a,0x72,0x8a,0x6b,0x73,0x8a,0x6c,0x74,0x8b,0x6a,0x72,0x8a,0x68,0x70,0x88, 0x68,0x70,0x89,0x68,0x70,0x89,0x67,0x6f,0x88,0x5f,0x67,0x82,0x68,0x70,0x89,0x7f, 0x86,0x99,0x99,0x9d,0xaa,0xba,0xbc,0xc7,0xb7,0xb9,0xcb,0xaa,0xac,0xc0,0x98,0x9a, 0xb2,0x88,0x8b,0xa5,0x7a,0x7d,0x98,0x76,0x77,0x91,0x76,0x75,0x8f,0x75,0x75,0x8d, 0x72,0x72,0x8c,0x72,0x71,0x8b,0x6f,0x6e,0x88,0x6e,0x6d,0x87,0x6c,0x6a,0x85,0x69, 0x68,0x82,0x65,0x64,0x7d,0x62,0x60,0x7a,0x3a,0x3e,0x48,0x37,0x3a,0x45,0x36,0x3a, 0x43,0x38,0x3b,0x44,0x3f,0x42,0x49,0x49,0x4a,0x4f,0x52,0x53,0x57,0x57,0x58,0x5a, 0x5d,0x5e,0x5f,0x5b,0x5c,0x5e,0x53,0x55,0x59,0x4a,0x4c,0x52,0x45,0x47,0x4f,0x40, 0x42,0x4b,0x38,0x3a,0x43,0x65,0x67,0x6e,0x4e,0x50,0x58,0x2e,0x32,0x3a,0x31,0x34, 0x3e,0x2e,0x31,0x3a,0x2c,0x2f,0x38,0x2a,0x2d,0x36,0x29,0x2c,0x34,0x3a,0x3c,0x43, 0x5d,0x5f,0x64,0x3f,0x42,0x49,0x26,0x29,0x30,0x22,0x24,0x2b,0x25,0x27,0x2f,0x83, 0x84,0x88,0xa0,0xa0,0xa4,0x71,0x72,0x76,0x41,0x43,0x49,0x52,0x53,0x58,0x2f,0x31, 0x37,0x2a,0x2c,0x32,0x37,0x39,0x40,0x27,0x29,0x31,0x62,0x64,0x68,0x6d,0x6f,0x74, 0x66,0x68,0x6c,0x5b,0x5c,0x61,0x5c,0x5d,0x62,0x4b,0x4c,0x51,0x4a,0x4b,0x50,0x37, 0x39,0x3c,0x35,0x37,0x3a,0x35,0x35,0x39,0x33,0x35,0x37,0x55,0x56,0x59,0x1b,0x1b, 0x1f,0x09,0x09,0x0c,0x07,0x08,0x0b,0x07,0x07,0x0a,0x06,0x07,0x09,0x06,0x06,0x08, 0x05,0x06,0x07,0x04,0x05,0x06,0x04,0x04,0x06,0x02,0x03,0x04,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,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,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,0x0e,0x0f,0x13,0xad,0xb4,0xc9,0x92,0x9b,0xb6,0x68,0x72,0x96,0x75,0x69, 0x89,0x78,0x69,0x86,0x66,0x6f,0x92,0x07,0x07,0x09,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,0x85,0x85,0x85,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xeb,0xeb,0xeb,0x1a,0x1a, 0x1a,0x92,0x92,0x92,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x5a,0x58,0x5c, 0x31,0x2f,0x48,0x4b,0x48,0x71,0x52,0x52,0x7d,0x63,0x4b,0x69,0x64,0x4d,0x6b,0x7e, 0x8a,0xa9,0xb1,0xab,0xb3,0x64,0x50,0x64,0x78,0x66,0x81,0x0b,0x0c,0x0e,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,0x59,0x5d,0x6c,0x52,0x54,0x7e,0x62,0x4a,0x66, 0x64,0x53,0x73,0x5a,0x52,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x5a,0x52,0x79,0x5a, 0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5b,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52, 0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x50,0x71,0x56,0x3e,0x57,0x64,0x50,0x6f,0x51, 0x58,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x14,0x16,0x1b,0x54,0x5d,0x7a,0x2b,0x2b,0x3b,0x03,0x03,0x04,0x39,0x40,0x54, 0x02,0x02,0x02,0x02,0x02,0x02,0x30,0x23,0x31,0x41,0x2c,0x3f,0x4d,0x37,0x4e,0x35, 0x2c,0x37,0x17,0x11,0x15,0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04, 0x05,0x05,0x05,0x06,0x05,0x06,0x06,0x61,0x63,0x79,0x62,0x6d,0x93,0x5b,0x65,0x8e, 0x5d,0x68,0x96,0x51,0x4f,0x79,0x51,0x50,0x79,0x51,0x50,0x79,0x52,0x52,0x7b,0x51, 0x54,0x7c,0x52,0x5d,0x84,0x52,0x5c,0x86,0x52,0x54,0x7c,0x62,0x6d,0x92,0xab,0xa9, 0xb0,0x31,0x27,0x2e,0x3e,0x32,0x3d,0x0a,0x0a,0x0b,0x0a,0x0a,0x0b,0x09,0x0a,0x0b, 0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x36,0x2c,0x34,0x29,0x20,0x25,0x22, 0x1a,0x1f,0x64,0x62,0x6d,0x73,0x7d,0x9b,0x51,0x53,0x7e,0x4d,0x47,0x6b,0x58,0x50, 0x77,0x5a,0x52,0x79,0x58,0x50,0x79,0x57,0x50,0x79,0x52,0x4f,0x7a,0x54,0x50,0x79, 0x50,0x4a,0x70,0x43,0x3d,0x59,0x5a,0x53,0x77,0x5f,0x53,0x75,0x04,0x04,0x05,0x04, 0x04,0x05,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x06, 0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x42,0x4a,0x6a,0x59,0x5b,0x88, 0x4e,0x4b,0x6f,0x4b,0x44,0x61,0x5e,0x52,0x75,0x5e,0x52,0x75,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x58,0x4a, 0x6a,0x62,0x55,0x7b,0x5d,0x51,0x70,0x13,0x11,0x15,0x1d,0x1e,0x1f,0x19,0x19,0x1c, 0x06,0x07,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x11,0x11,0x11,0x16,0x14,0x14,0x19,0x15, 0x15,0x1b,0x16,0x16,0x1c,0x18,0x17,0x1d,0x19,0x18,0x1f,0x1d,0x1a,0x23,0x20,0x1e, 0x27,0x27,0x24,0x2d,0x31,0x2b,0x37,0x36,0x2f,0x3c,0x3a,0x32,0x40,0x3c,0x34,0x41, 0x3e,0x35,0x44,0x3d,0x35,0x43,0x39,0x32,0x3f,0x40,0x37,0x46,0x5a,0x4c,0x63,0x59, 0x49,0x63,0x55,0x44,0x5d,0x58,0x47,0x61,0x5a,0x47,0x63,0x5c,0x49,0x65,0x5c,0x4a, 0x65,0x52,0x43,0x5c,0x30,0x28,0x3d,0x2f,0x29,0x3e,0x26,0x25,0x38,0x24,0x1f,0x27, 0x4b,0x3e,0x4d,0x66,0x5a,0x67,0x7f,0x83,0x90,0x6c,0x73,0x8c,0x7f,0x89,0xa4,0x85, 0x8e,0xa7,0x88,0x8f,0xa7,0x86,0x8d,0xa4,0x80,0x88,0xa1,0x7e,0x85,0x9e,0x78,0x80, 0x98,0x78,0x80,0x99,0x7d,0x83,0x9c,0x7f,0x86,0x9c,0x76,0x7e,0x96,0x5f,0x60,0x7d, 0x41,0x40,0x52,0x2a,0x2a,0x36,0x24,0x23,0x2f,0x24,0x23,0x2f,0x25,0x25,0x31,0x29, 0x27,0x35,0x2d,0x2b,0x3a,0x2d,0x2a,0x3b,0x32,0x2d,0x3f,0x4a,0x42,0x58,0x59,0x50, 0x68,0x5f,0x59,0x75,0x3d,0x3c,0x52,0x43,0x48,0x60,0x4c,0x53,0x6c,0x52,0x5a,0x71, 0x5a,0x61,0x76,0x64,0x6b,0x7e,0x69,0x6e,0x81,0x63,0x6a,0x7e,0x54,0x5c,0x73,0x46, 0x4a,0x63,0x45,0x46,0x5e,0x44,0x43,0x5c,0x46,0x45,0x5e,0x4a,0x47,0x5e,0x4e,0x49, 0x60,0x52,0x4a,0x61,0x51,0x4a,0x62,0x5c,0x59,0x6f,0x4c,0x48,0x5d,0x3c,0x38,0x4c, 0x42,0x3c,0x50,0x4b,0x44,0x59,0x4d,0x45,0x5a,0x4e,0x48,0x5d,0x4f,0x4a,0x60,0x4e, 0x4d,0x64,0x4d,0x4e,0x66,0x50,0x56,0x70,0x51,0x59,0x71,0x54,0x5b,0x74,0x56,0x5f, 0x78,0x5c,0x64,0x7f,0x5d,0x66,0x80,0x5e,0x66,0x81,0x63,0x6a,0x84,0x62,0x6a,0x83, 0x62,0x6a,0x83,0x62,0x6a,0x83,0x62,0x6a,0x83,0x63,0x6a,0x84,0x5d,0x65,0x7f,0x5e, 0x66,0x81,0x62,0x6a,0x84,0x66,0x6f,0x88,0x6a,0x72,0x8a,0x6e,0x76,0x8d,0x6e,0x76, 0x8d,0x6e,0x76,0x8c,0x6e,0x76,0x8c,0x73,0x7a,0x90,0x72,0x79,0x8f,0x67,0x70,0x88, 0x62,0x6a,0x83,0x6f,0x77,0x8e,0x7c,0x83,0x96,0xa4,0xa8,0xb9,0xac,0xb0,0xc4,0xa5, 0xa8,0xbd,0x90,0x94,0xae,0x84,0x89,0xa5,0x7e,0x82,0x9e,0x7e,0x81,0x9c,0x7b,0x7d, 0x96,0x78,0x79,0x92,0x76,0x76,0x8f,0x73,0x72,0x8c,0x70,0x70,0x8a,0x70,0x6f,0x89, 0x6e,0x6d,0x87,0x6b,0x6a,0x84,0x66,0x64,0x7e,0x65,0x64,0x7e,0x3d,0x41,0x4c,0x3a, 0x3e,0x47,0x39,0x3d,0x46,0x3e,0x41,0x4a,0x46,0x48,0x4f,0x4d,0x4f,0x55,0x55,0x56, 0x5a,0x5a,0x5c,0x60,0x5e,0x5e,0x63,0x5a,0x5c,0x62,0x52,0x56,0x5d,0x4e,0x50,0x59, 0x4a,0x4d,0x57,0x67,0x6a,0x72,0x55,0x59,0x63,0x44,0x48,0x51,0x71,0x74,0x7b,0x61, 0x65,0x6d,0x7e,0x81,0x89,0x7b,0x7d,0x83,0x5c,0x5e,0x65,0x32,0x35,0x3e,0x32,0x35, 0x3e,0x50,0x52,0x59,0x5d,0x5e,0x65,0x3e,0x41,0x48,0x3a,0x3d,0x44,0x2e,0x32,0x3a, 0x47,0x4a,0x51,0x80,0x82,0x87,0xa0,0xa2,0xa6,0x60,0x63,0x6a,0x50,0x52,0x58,0x4d, 0x4e,0x54,0x4a,0x4c,0x51,0x3c,0x3e,0x44,0x2e,0x31,0x39,0x2b,0x2e,0x36,0x27,0x2a, 0x33,0x30,0x32,0x3b,0x4c,0x4f,0x55,0x65,0x67,0x6c,0x31,0x34,0x3a,0x22,0x25,0x2c, 0x65,0x66,0x6a,0x12,0x14,0x1a,0x11,0x12,0x17,0x0e,0x10,0x15,0x0e,0x0f,0x13,0x45, 0x45,0x48,0x43,0x44,0x47,0x0a,0x0a,0x0d,0x09,0x0a,0x0d,0x08,0x08,0x0b,0x07,0x08, 0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05, 0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x0f,0x10,0x14,0xa4,0xac,0xc2,0x7e, 0x88,0xa8,0x68,0x69,0x8f,0x78,0x69,0x87,0x78,0x68,0x85,0x4c,0x53,0x6e,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,0x0e,0x0e,0x0e,0xec,0xec,0xec,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x98, 0x98,0x98,0x00,0x00,0x00,0xda,0xda,0xda,0xff,0xff,0xff,0xff,0xff,0xff,0xf4,0xf4, 0xf4,0x1a,0x14,0x1b,0x3f,0x3a,0x58,0x50,0x4d,0x79,0x52,0x54,0x7e,0x64,0x4c,0x69, 0x63,0x4c,0x69,0x77,0x83,0xa4,0xa1,0x98,0xa4,0x6b,0x56,0x6c,0x68,0x69,0x8f,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,0x0d,0x0e,0x0f,0x62,0x6e, 0x92,0x64,0x53,0x76,0x5f,0x47,0x64,0x5f,0x53,0x77,0x5a,0x52,0x79,0x5a,0x52,0x79, 0x5a,0x52,0x79,0x5b,0x52,0x79,0x5b,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c, 0x52,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x63,0x4b,0x67, 0x53,0x3b,0x53,0x52,0x50,0x7b,0x3c,0x3f,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x58,0x73,0x46,0x4e,0x68,0x49,0x52, 0x6d,0x4b,0x55,0x71,0x00,0x00,0x00,0x02,0x02,0x02,0x07,0x05,0x07,0x46,0x2f,0x44, 0x45,0x2f,0x44,0x41,0x3e,0x58,0x2f,0x23,0x2a,0x06,0x06,0x07,0x02,0x03,0x03,0x02, 0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x52,0x57,0x6b,0x63,0x6e, 0x92,0x5c,0x68,0x8f,0x60,0x6e,0x9a,0x51,0x4f,0x7a,0x52,0x52,0x7b,0x52,0x52,0x7b, 0x52,0x52,0x7c,0x52,0x56,0x7f,0x52,0x5b,0x83,0x52,0x5d,0x86,0x52,0x53,0x7c,0x64, 0x70,0x94,0xb0,0xae,0xb2,0x31,0x26,0x2e,0x3e,0x31,0x3c,0x08,0x08,0x0a,0x08,0x08, 0x0a,0x08,0x08,0x0a,0x07,0x08,0x09,0x08,0x08,0x0a,0x07,0x08,0x09,0x37,0x2b,0x33, 0x2a,0x21,0x26,0x23,0x1b,0x20,0x51,0x4e,0x57,0x84,0x8d,0xa6,0x54,0x5f,0x88,0x4e, 0x49,0x6e,0x55,0x4f,0x77,0x5a,0x52,0x79,0x5a,0x52,0x79,0x57,0x50,0x79,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x50,0x4c,0x72,0x40,0x3c,0x58,0x59,0x51,0x77,0x67,0x5c,0x82, 0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x03,0x04,0x05,0x04,0x05,0x06,0x04, 0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x04,0x04,0x06,0x38,0x3f, 0x59,0x58,0x5b,0x8b,0x4d,0x4a,0x71,0x4b,0x43,0x61,0x5d,0x51,0x73,0x5e,0x52,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x56,0x4c,0x6b,0x5c,0x4f,0x72,0x5b,0x51,0x73,0x22,0x1c,0x25,0x19,0x19, 0x1a,0x2f,0x2f,0x30,0x06,0x07,0x09,0x08,0x09,0x0b,0x08,0x09,0x0c,0x0a,0x0b,0x0d, 0x0d,0x0c,0x11,0x0f,0x10,0x14,0x14,0x13,0x19,0x15,0x16,0x1c,0x17,0x16,0x1d,0x18, 0x17,0x1d,0x19,0x17,0x1f,0x1c,0x19,0x21,0x20,0x1c,0x25,0x25,0x21,0x2b,0x29,0x24, 0x2e,0x2c,0x27,0x33,0x2f,0x29,0x35,0x30,0x2b,0x36,0x2b,0x27,0x31,0x24,0x21,0x2a, 0x43,0x39,0x47,0x5b,0x4a,0x63,0x56,0x46,0x5e,0x56,0x46,0x5e,0x57,0x47,0x61,0x5b, 0x48,0x63,0x5c,0x4a,0x65,0x5c,0x49,0x64,0x3b,0x2f,0x44,0x30,0x29,0x3e,0x30,0x28, 0x3e,0x1b,0x1a,0x26,0x4c,0x3f,0x4d,0x4c,0x3f,0x4e,0x8c,0x8a,0x96,0x61,0x67,0x7b, 0x84,0x8d,0xa6,0x8c,0x93,0xac,0x8f,0x97,0xaf,0x90,0x97,0xad,0x8f,0x95,0xac,0x8b, 0x90,0xa6,0x86,0x8a,0xa1,0x89,0x91,0xa8,0x98,0x9e,0xb2,0x95,0x9a,0xad,0x8d,0x94, 0xa8,0x79,0x81,0x98,0x5d,0x64,0x82,0x46,0x42,0x54,0x2a,0x29,0x36,0x28,0x27,0x32, 0x26,0x25,0x32,0x2f,0x2c,0x3a,0x4b,0x42,0x57,0x4a,0x43,0x59,0x3d,0x37,0x4a,0x5d, 0x52,0x6c,0x58,0x53,0x72,0x55,0x56,0x72,0x3e,0x3c,0x51,0x42,0x41,0x58,0x46,0x46, 0x60,0x48,0x4e,0x68,0x56,0x5e,0x74,0x6a,0x70,0x83,0x6b,0x72,0x83,0x65,0x6c,0x7f, 0x5c,0x63,0x79,0x53,0x5b,0x72,0x48,0x4b,0x66,0x47,0x46,0x5f,0x46,0x45,0x5e,0x49, 0x46,0x5e,0x4b,0x47,0x5e,0x4f,0x4a,0x62,0x4f,0x4a,0x62,0x57,0x54,0x6a,0x60,0x5f, 0x75,0x4a,0x47,0x61,0x46,0x41,0x57,0x44,0x3d,0x51,0x48,0x41,0x55,0x4e,0x47,0x5c, 0x4d,0x46,0x5a,0x48,0x42,0x56,0x41,0x3e,0x51,0x42,0x43,0x58,0x4f,0x54,0x6a,0x5d, 0x62,0x78,0x52,0x57,0x6c,0x5f,0x68,0x80,0x5d,0x66,0x80,0x5c,0x65,0x7f,0x5d,0x66, 0x80,0x5e,0x66,0x81,0x63,0x6a,0x84,0x63,0x6a,0x84,0x62,0x6a,0x83,0x62,0x6a,0x83, 0x5d,0x65,0x7f,0x5c,0x64,0x7f,0x5e,0x66,0x80,0x62,0x6a,0x83,0x68,0x70,0x89,0x6f, 0x77,0x8e,0x75,0x7c,0x92,0x71,0x78,0x8e,0x70,0x77,0x8d,0x75,0x7c,0x90,0x73,0x7a, 0x90,0x6a,0x72,0x89,0x62,0x6b,0x85,0x66,0x6f,0x88,0x6c,0x74,0x8b,0x87,0x8c,0xa5, 0x8a,0x91,0xad,0x8d,0x91,0xad,0x89,0x8d,0xaa,0x86,0x8a,0xa7,0x86,0x8a,0xa6,0x86, 0x8a,0xa6,0x86,0x89,0xa3,0x7e,0x81,0x9b,0x7a,0x7a,0x94,0x78,0x78,0x91,0x73,0x74, 0x8d,0x72,0x71,0x8b,0x6f,0x6f,0x89,0x6d,0x6c,0x85,0x68,0x68,0x81,0x66,0x65,0x80, 0x3e,0x42,0x4d,0x3d,0x41,0x4b,0x40,0x43,0x4e,0x43,0x46,0x4e,0x4a,0x4e,0x55,0x52, 0x54,0x5b,0x56,0x59,0x5f,0x58,0x5b,0x61,0x54,0x56,0x5e,0x53,0x56,0x5f,0x4e,0x52, 0x5c,0x4a,0x4e,0x5a,0x63,0x67,0x71,0x7b,0x7e,0x86,0x46,0x49,0x55,0x3a,0x3e,0x4a, 0x40,0x44,0x50,0x5f,0x62,0x6c,0x41,0x45,0x51,0x43,0x47,0x52,0x85,0x87,0x8e,0x90, 0x92,0x97,0x4c,0x4e,0x55,0x6d,0x6d,0x71,0x7f,0x7f,0x81,0x6d,0x6e,0x71,0x6f,0x70, 0x73,0x79,0x7b,0x81,0x8d,0x8e,0x93,0xa6,0xa8,0xac,0x8f,0x91,0x97,0x6a,0x6e,0x76, 0x65,0x67,0x6e,0x5c,0x5e,0x66,0x56,0x58,0x5f,0x4e,0x50,0x57,0x49,0x4b,0x52,0x42, 0x45,0x4c,0x37,0x3a,0x42,0x33,0x36,0x3e,0x3b,0x3e,0x46,0x3d,0x3f,0x46,0x3f,0x42, 0x47,0x32,0x34,0x3a,0x25,0x27,0x2e,0x1b,0x1e,0x24,0x16,0x17,0x1e,0x12,0x13,0x18, 0x0e,0x0f,0x14,0x0e,0x0f,0x13,0x51,0x51,0x54,0x0b,0x0b,0x0f,0x0a,0x0b,0x0e,0x09, 0x09,0x0c,0x07,0x08,0x0b,0x07,0x08,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x05,0x06, 0x07,0x04,0x04,0x06,0x03,0x04,0x05,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,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,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, 0x1a,0x1c,0x24,0x94,0x9d,0xb8,0x73,0x7e,0xa0,0x68,0x67,0x8c,0x78,0x68,0x83,0x78, 0x68,0x84,0x3a,0x39,0x4d,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,0xb5,0xb5,0xb5,0xfd,0xfd,0xfd,0xff,0xff,0xff, 0xe9,0xe9,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0xf7,0xff,0xff,0xff,0xff, 0xff,0xff,0xd1,0xd1,0xd1,0x24,0x1e,0x2b,0x50,0x42,0x5b,0x52,0x4f,0x7b,0x52,0x55, 0x81,0x64,0x4c,0x69,0x64,0x53,0x76,0x80,0x8a,0xaa,0x90,0x85,0x91,0x74,0x5f,0x78, 0x2b,0x2f,0x3a,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,0x46,0x4b,0x57,0x52,0x52,0x7d,0x60,0x48,0x64,0x64,0x4f,0x6e,0x5c,0x52, 0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79,0x5d,0x52,0x79,0x5d,0x52,0x79, 0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x62,0x53,0x77,0x60,0x48,0x64,0x5a,0x41,0x5c,0x58,0x62,0x89,0x20,0x20,0x22, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x05,0x06,0x3a, 0x42,0x57,0x49,0x53,0x6e,0x0e,0x0f,0x14,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02, 0x02,0x3c,0x2d,0x3f,0x58,0x41,0x5a,0x64,0x68,0x7f,0x31,0x24,0x2b,0x1f,0x18,0x1c, 0x02,0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x46, 0x4d,0x5c,0x65,0x71,0x96,0x5d,0x69,0x8f,0x62,0x6f,0x9c,0x52,0x52,0x7d,0x52,0x52, 0x7b,0x52,0x52,0x7c,0x52,0x55,0x7f,0x52,0x57,0x80,0x52,0x5c,0x86,0x53,0x5c,0x86, 0x52,0x50,0x7a,0x64,0x70,0x95,0xb1,0xaf,0xb4,0x2e,0x23,0x2b,0x3f,0x32,0x3c,0x07, 0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07, 0x09,0x35,0x2a,0x33,0x2b,0x21,0x27,0x26,0x1d,0x22,0x36,0x30,0x34,0x99,0xa0,0xb8, 0x5a,0x66,0x8e,0x4d,0x4a,0x72,0x52,0x4b,0x73,0x5a,0x52,0x79,0x5a,0x52,0x79,0x57, 0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x51,0x4d,0x74,0x40,0x3b,0x57,0x58,0x50, 0x75,0x6a,0x5f,0x89,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x03, 0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x04,0x05,0x03, 0x04,0x05,0x2d,0x32,0x48,0x58,0x5e,0x8d,0x4d,0x4b,0x73,0x4c,0x44,0x63,0x5a,0x4f, 0x71,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x57,0x4b,0x6c,0x5a,0x4e,0x70,0x5c,0x54,0x7a,0x31, 0x28,0x32,0x05,0x05,0x06,0x1d,0x1d,0x1f,0x06,0x07,0x09,0x06,0x07,0x0a,0x08,0x09, 0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x0c,0x0d,0x11,0x0d,0x0e,0x13, 0x10,0x10,0x15,0x12,0x12,0x17,0x15,0x14,0x1a,0x16,0x16,0x1c,0x18,0x17,0x1d,0x19, 0x18,0x1f,0x1b,0x1a,0x21,0x1f,0x1c,0x25,0x20,0x1d,0x27,0x1e,0x1c,0x24,0x1b,0x1a, 0x22,0x19,0x18,0x1f,0x1f,0x1c,0x25,0x4d,0x41,0x53,0x5b,0x4a,0x64,0x57,0x46,0x61, 0x55,0x44,0x5e,0x57,0x46,0x60,0x5b,0x49,0x64,0x5c,0x48,0x64,0x59,0x47,0x62,0x31, 0x29,0x3c,0x31,0x2a,0x3f,0x2f,0x2a,0x3e,0x26,0x22,0x2b,0x4d,0x3e,0x4e,0x54,0x46, 0x55,0x81,0x83,0x8e,0x75,0x7d,0x93,0x91,0x9b,0xb2,0x97,0x9e,0xb5,0x98,0x9f,0xb5, 0x97,0x9e,0xb3,0x8b,0x8f,0xa4,0x7e,0x81,0x94,0x7c,0x82,0x9d,0x9b,0xa2,0xb7,0x97, 0x9c,0xb1,0x88,0x8e,0xa3,0x82,0x88,0x9f,0x69,0x71,0x8b,0x60,0x5e,0x77,0x5b,0x55, 0x6c,0x4f,0x47,0x5c,0x33,0x2f,0x3e,0x31,0x2e,0x3c,0x59,0x4f,0x66,0x63,0x5a,0x75, 0x45,0x3e,0x52,0x56,0x4d,0x66,0x5a,0x56,0x74,0x54,0x55,0x73,0x41,0x3f,0x56,0x47, 0x43,0x5a,0x4a,0x46,0x5d,0x49,0x47,0x60,0x4a,0x4a,0x65,0x50,0x57,0x70,0x5e,0x65, 0x79,0x66,0x6c,0x7f,0x6a,0x70,0x82,0x6e,0x74,0x86,0x5a,0x61,0x78,0x4b,0x53,0x6c, 0x48,0x48,0x62,0x47,0x45,0x5c,0x48,0x45,0x5c,0x49,0x46,0x5e,0x4a,0x48,0x61,0x49, 0x48,0x62,0x52,0x52,0x6a,0x4a,0x49,0x62,0x4e,0x4c,0x66,0x51,0x4a,0x63,0x49,0x44, 0x58,0x45,0x3f,0x52,0x45,0x3e,0x52,0x47,0x40,0x53,0x4a,0x44,0x58,0x48,0x46,0x5b, 0x4f,0x50,0x66,0x66,0x6b,0x81,0x5b,0x61,0x74,0x61,0x69,0x80,0x60,0x69,0x82,0x5b, 0x64,0x7e,0x5b,0x63,0x7e,0x5d,0x66,0x80,0x64,0x6b,0x85,0x65,0x6c,0x86,0x64,0x6b, 0x85,0x63,0x6a,0x84,0x5e,0x66,0x80,0x5d,0x66,0x80,0x5f,0x66,0x82,0x62,0x6a,0x83, 0x69,0x71,0x89,0x6b,0x73,0x8a,0x72,0x7a,0x90,0x7a,0x82,0x96,0x74,0x7b,0x91,0x72, 0x79,0x8e,0x6f,0x76,0x8b,0x74,0x7b,0x90,0x75,0x7c,0x92,0x6e,0x76,0x8d,0x69,0x71, 0x89,0x7b,0x81,0x9c,0x7c,0x83,0xa3,0x82,0x87,0xa5,0x86,0x8b,0xa8,0x88,0x8d,0xa9, 0x8a,0x8e,0xaa,0x8a,0x8e,0xaa,0x86,0x8a,0xa6,0x82,0x85,0xa1,0x81,0x84,0x9e,0x7e, 0x7f,0x98,0x7a,0x7b,0x94,0x75,0x75,0x8e,0x71,0x71,0x8b,0x6e,0x6e,0x87,0x68,0x67, 0x81,0x69,0x68,0x83,0x42,0x46,0x52,0x42,0x46,0x51,0x44,0x47,0x52,0x48,0x4b,0x54, 0x4c,0x4f,0x58,0x53,0x56,0x5e,0x54,0x57,0x5f,0x52,0x56,0x5e,0x4f,0x52,0x5d,0x4e, 0x52,0x5d,0x4a,0x4e,0x5b,0x58,0x5c,0x67,0x8e,0x91,0x98,0x5a,0x5e,0x68,0x3d,0x42, 0x4e,0x3a,0x3f,0x4c,0x3b,0x40,0x4d,0x42,0x46,0x52,0x48,0x4b,0x57,0x4d,0x51,0x5b, 0x4f,0x53,0x5b,0x60,0x61,0x67,0x79,0x7a,0x7a,0x86,0x86,0x86,0x90,0x90,0x90,0x96, 0x96,0x96,0xa6,0xa6,0xa6,0xac,0xac,0xae,0xaf,0xb0,0xb3,0xaf,0xaf,0xb3,0x89,0x8c, 0x92,0x81,0x82,0x89,0x71,0x73,0x7a,0x71,0x73,0x7a,0x72,0x75,0x7b,0x5e,0x61,0x69, 0x54,0x56,0x5e,0x55,0x56,0x5d,0x49,0x4c,0x54,0x4b,0x4e,0x56,0x55,0x57,0x5d,0x63, 0x65,0x69,0x61,0x62,0x66,0x56,0x57,0x5b,0x40,0x42,0x47,0x2a,0x2c,0x32,0x1e,0x20, 0x26,0x18,0x1a,0x1f,0x13,0x14,0x1a,0x10,0x11,0x16,0x4f,0x50,0x53,0x1d,0x1e,0x23, 0x0b,0x0b,0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0c,0x08,0x09,0x0b,0x06,0x07,0x0a,0x06, 0x06,0x09,0x06,0x06,0x08,0x04,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03, 0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x19,0x1b,0x22,0x81,0x89,0xa6,0x71,0x7c,0x9e, 0x68,0x68,0x8e,0x77,0x62,0x7b,0x76,0x61,0x7a,0x2a,0x26,0x32,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,0x57,0x57,0x57,0xfc,0xfc,0xfc,0xff,0xff, 0xff,0xfc,0xfc,0xfc,0x6e,0x6e,0x6e,0x00,0x00,0x00,0x65,0x65,0x65,0xfd,0xfd,0xfd, 0xff,0xff,0xff,0xff,0xff,0xff,0x8d,0x8e,0x90,0x29,0x27,0x3d,0x53,0x49,0x68,0x54, 0x50,0x79,0x52,0x5a,0x84,0x64,0x4f,0x6e,0x52,0x4f,0x7a,0x88,0x92,0xb0,0x86,0x77, 0x86,0x6e,0x67,0x8a,0x07,0x08,0x09,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,0x08,0x08,0x09,0x52,0x5c,0x81,0x64,0x52,0x71,0x5e, 0x46,0x60,0x64,0x53,0x76,0x5e,0x53,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x5e,0x53, 0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x63,0x53,0x77,0x5c,0x44,0x5e,0x5f,0x47, 0x63,0x61,0x6b,0x87,0x07,0x08,0x08,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,0x02,0x02,0x02,0x02,0x02,0x02,0x6a,0x72,0x89,0xac,0xb2,0xc2,0x55,0x50, 0x5d,0x31,0x25,0x2b,0x19,0x13,0x16,0x02,0x02,0x03,0x02,0x03,0x03,0x03,0x03,0x04, 0x03,0x03,0x04,0x46,0x4c,0x5c,0x67,0x73,0x98,0x5d,0x6a,0x90,0x61,0x70,0x9d,0x53, 0x54,0x7d,0x52,0x53,0x7c,0x52,0x52,0x7b,0x52,0x54,0x7c,0x52,0x57,0x82,0x52,0x5d, 0x86,0x53,0x5d,0x86,0x53,0x50,0x7a,0x5f,0x6a,0x91,0xa9,0xa6,0xab,0x2e,0x24,0x2a, 0x3f,0x31,0x3c,0x06,0x07,0x08,0x06,0x07,0x08,0x06,0x07,0x08,0x06,0x07,0x08,0x06, 0x07,0x08,0x06,0x07,0x08,0x37,0x2a,0x32,0x2b,0x21,0x27,0x26,0x1c,0x22,0x1f,0x17, 0x1a,0xa2,0xa8,0xbc,0x66,0x72,0x97,0x4f,0x4c,0x77,0x50,0x4a,0x6f,0x58,0x50,0x79, 0x58,0x50,0x79,0x57,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x51,0x4e,0x75,0x3f, 0x3b,0x59,0x55,0x4d,0x76,0x68,0x5f,0x8d,0x02,0x03,0x03,0x03,0x03,0x04,0x02,0x03, 0x03,0x02,0x03,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03, 0x04,0x04,0x05,0x03,0x04,0x05,0x24,0x29,0x3a,0x59,0x61,0x90,0x4e,0x4c,0x74,0x4c, 0x43,0x64,0x5a,0x4e,0x6e,0x5e,0x52,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53, 0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x76,0x57,0x4c,0x6c,0x5a,0x4c,0x6d, 0x5e,0x56,0x7e,0x3c,0x31,0x3c,0x0a,0x0b,0x0c,0x1e,0x1e,0x20,0x1d,0x1d,0x20,0x06, 0x07,0x09,0x07,0x08,0x0a,0x07,0x08,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x0e,0x0a,0x0b, 0x0e,0x0a,0x0b,0x0e,0x0b,0x0c,0x10,0x0c,0x0e,0x12,0x0c,0x0e,0x13,0x0e,0x10,0x14, 0x10,0x11,0x16,0x11,0x12,0x17,0x12,0x12,0x18,0x12,0x12,0x18,0x13,0x13,0x19,0x15, 0x15,0x1b,0x17,0x16,0x1c,0x17,0x16,0x1d,0x17,0x16,0x1d,0x2d,0x28,0x32,0x59,0x4a, 0x62,0x5a,0x48,0x63,0x56,0x45,0x5f,0x57,0x45,0x60,0x5b,0x49,0x63,0x5c,0x48,0x63, 0x5c,0x49,0x64,0x3b,0x2f,0x44,0x31,0x29,0x3d,0x31,0x29,0x3e,0x2c,0x24,0x32,0x3d, 0x31,0x3f,0x4d,0x3e,0x4d,0x96,0x90,0x98,0x69,0x6e,0x7d,0x99,0xa0,0xb6,0xa0,0xa7, 0xbb,0x9f,0xa7,0xbc,0x9f,0xa5,0xba,0x94,0x99,0xac,0x7f,0x82,0x94,0x81,0x7e,0x94, 0x77,0x78,0x96,0x72,0x75,0x92,0x6d,0x70,0x8c,0x68,0x6f,0x8b,0x60,0x67,0x82,0x64, 0x6c,0x86,0x5a,0x61,0x81,0x62,0x5e,0x7b,0x50,0x4a,0x5f,0x35,0x31,0x41,0x3b,0x35, 0x47,0x52,0x4a,0x60,0x35,0x31,0x42,0x3b,0x35,0x48,0x5e,0x56,0x6f,0x56,0x54,0x70, 0x42,0x41,0x58,0x4e,0x44,0x59,0x51,0x46,0x5b,0x53,0x48,0x5e,0x50,0x49,0x62,0x4a, 0x49,0x62,0x46,0x4e,0x66,0x62,0x68,0x7a,0x70,0x76,0x86,0x76,0x7b,0x8a,0x6e,0x75, 0x86,0x68,0x6e,0x81,0x4f,0x56,0x6e,0x46,0x45,0x5e,0x47,0x46,0x5e,0x47,0x46,0x5e, 0x46,0x45,0x5e,0x47,0x46,0x60,0x48,0x48,0x62,0x49,0x48,0x62,0x4d,0x4b,0x64,0x51, 0x4d,0x67,0x53,0x4e,0x67,0x4b,0x46,0x5c,0x45,0x40,0x54,0x4e,0x49,0x5f,0x4e,0x47, 0x5c,0x4d,0x48,0x5d,0x4b,0x48,0x5e,0x57,0x5a,0x6e,0x63,0x6a,0x80,0x5e,0x65,0x7a, 0x61,0x6a,0x83,0x56,0x5f,0x7b,0x55,0x5d,0x79,0x5a,0x62,0x7d,0x60,0x68,0x82,0x65, 0x6c,0x86,0x65,0x6c,0x86,0x60,0x68,0x82,0x5d,0x65,0x80,0x5f,0x66,0x82,0x64,0x6b, 0x85,0x68,0x70,0x89,0x6a,0x72,0x8a,0x72,0x79,0x8f,0x77,0x7e,0x93,0x73,0x7a,0x90, 0x74,0x7b,0x91,0x7e,0x83,0x96,0x74,0x7b,0x90,0x72,0x79,0x8e,0x7a,0x82,0x95,0x85, 0x8b,0x9c,0x79,0x7f,0x93,0x7d,0x83,0x9d,0x76,0x7e,0x9f,0x7d,0x82,0xa1,0x81,0x86, 0xa5,0x89,0x8d,0xa9,0x89,0x8d,0xa9,0x88,0x8d,0xa9,0x82,0x87,0xa5,0x7e,0x82,0xa1, 0x7f,0x83,0xa0,0x81,0x84,0x9f,0x7f,0x81,0x9b,0x7d,0x7f,0x97,0x79,0x79,0x93,0x73, 0x72,0x8c,0x6a,0x69,0x82,0x6d,0x6d,0x88,0x46,0x4a,0x56,0x46,0x4a,0x56,0x46,0x4a, 0x55,0x4d,0x50,0x5a,0x4e,0x52,0x5c,0x51,0x54,0x5e,0x52,0x56,0x5e,0x52,0x55,0x5f, 0x52,0x55,0x5f,0x4f,0x53,0x5e,0x4b,0x4f,0x5c,0x79,0x7d,0x86,0x80,0x83,0x8c,0x45, 0x4a,0x58,0x3a,0x3e,0x4e,0x3a,0x3e,0x4e,0x42,0x47,0x55,0x56,0x5a,0x65,0x6c,0x6e, 0x75,0x66,0x69,0x6e,0x61,0x62,0x67,0x79,0x7a,0x7a,0x93,0x93,0x93,0x9e,0x9e,0x9e, 0xa7,0xa7,0xa7,0xb2,0xb2,0xb2,0xc0,0xc0,0xc0,0xba,0xba,0xba,0xb1,0xb2,0xb5,0xa5, 0xa6,0xaa,0x9d,0x9e,0xa2,0x94,0x96,0x9b,0x88,0x8a,0x92,0x89,0x8b,0x92,0x83,0x86, 0x8b,0x73,0x76,0x7d,0x6c,0x6f,0x76,0x62,0x65,0x6e,0x5b,0x5e,0x69,0x62,0x66,0x6f, 0x72,0x75,0x7b,0x7d,0x7e,0x83,0x81,0x82,0x86,0x75,0x76,0x7a,0x54,0x56,0x5a,0x3a, 0x3d,0x42,0x2c,0x2e,0x33,0x21,0x22,0x28,0x19,0x1b,0x20,0x12,0x14,0x19,0x35,0x37, 0x3b,0x3c,0x3c,0x40,0x0d,0x0e,0x12,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0c, 0x09,0x0a,0x0c,0x07,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x07,0x04,0x05,0x06,0x04, 0x04,0x06,0x03,0x04,0x05,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,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,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,0x10,0x11, 0x15,0x65,0x6d,0x85,0x6e,0x79,0x9c,0x68,0x67,0x8d,0x74,0x5f,0x77,0x6f,0x5b,0x72, 0x17,0x13,0x18,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,0xe2,0xe2,0xe2,0xfd, 0xfd,0xfd,0xfd,0xfd,0xfd,0xcf,0xcf,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0, 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0x30,0x31,0x32,0x3d,0x45,0x5f, 0x4e,0x4b,0x75,0x5e,0x53,0x79,0x52,0x53,0x7e,0x55,0x50,0x79,0x54,0x5f,0x89,0xa7, 0xaf,0xc4,0x7e,0x6b,0x80,0x4a,0x51,0x68,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,0x35,0x3a,0x45, 0x52,0x4f,0x7a,0x5f,0x47,0x63,0x62,0x4a,0x66,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e, 0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x39,0x2f,0x48,0x34,0x2b,0x43,0x49,0x3e,0x5c,0x5d, 0x4c,0x6a,0x58,0x40,0x5a,0x63,0x4c,0x69,0x5f,0x65,0x76,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,0x02,0x02,0x02,0x50,0x54,0x60,0xbb, 0xc0,0xd0,0x96,0x9c,0xaf,0x44,0x3e,0x4d,0x32,0x25,0x2c,0x16,0x11,0x14,0x02,0x02, 0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x47,0x4d,0x5e,0x69,0x74,0x99,0x5e,0x6a,0x91, 0x5e,0x6c,0x99,0x53,0x54,0x7e,0x52,0x54,0x7d,0x52,0x53,0x7b,0x52,0x57,0x82,0x52, 0x5a,0x82,0x52,0x5d,0x87,0x53,0x5d,0x87,0x53,0x50,0x7a,0x5d,0x6a,0x90,0xa8,0xa5, 0xaa,0x2f,0x25,0x2b,0x41,0x31,0x3d,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07, 0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x37,0x29,0x32,0x2b,0x21,0x27,0x28, 0x1e,0x23,0x1f,0x16,0x1a,0x95,0x99,0xa6,0x77,0x82,0xa2,0x51,0x52,0x7b,0x4c,0x48, 0x6d,0x57,0x50,0x79,0x5a,0x52,0x79,0x58,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a, 0x50,0x4d,0x77,0x41,0x3d,0x5d,0x50,0x4a,0x6f,0x66,0x5c,0x88,0x0d,0x0b,0x0f,0x02, 0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x1a,0x1d,0x29,0x59,0x63,0x91, 0x4f,0x4c,0x75,0x4b,0x45,0x65,0x59,0x4c,0x6f,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x58,0x4d, 0x6d,0x58,0x4c,0x6c,0x5c,0x56,0x7f,0x4e,0x3f,0x4d,0x33,0x33,0x34,0x25,0x25,0x25, 0x1d,0x1d,0x1f,0x06,0x06,0x09,0x07,0x07,0x0a,0x07,0x08,0x0b,0x08,0x09,0x0c,0x08, 0x09,0x0c,0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0f,0x0b,0x0c,0x10,0x0b,0x0c, 0x10,0x0b,0x0d,0x11,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0c,0x0d,0x11,0x0c,0x0e,0x12, 0x0c,0x0e,0x12,0x0e,0x0f,0x13,0x10,0x12,0x17,0x14,0x15,0x1b,0x16,0x16,0x1d,0x16, 0x16,0x1d,0x43,0x3a,0x4a,0x5c,0x4b,0x66,0x58,0x47,0x60,0x57,0x46,0x60,0x5a,0x48, 0x63,0x5a,0x47,0x63,0x5c,0x49,0x63,0x59,0x47,0x63,0x31,0x2a,0x3e,0x31,0x29,0x3d, 0x30,0x24,0x37,0x29,0x22,0x2e,0x4f,0x3f,0x4f,0x53,0x43,0x53,0x9c,0x9d,0xa3,0x8d, 0x91,0x9f,0xac,0xb2,0xc4,0xa8,0xaf,0xc2,0xa3,0xa9,0xbc,0x9f,0xa3,0xb8,0x96,0x9a, 0xae,0x87,0x89,0x9d,0x72,0x71,0x84,0x63,0x61,0x73,0x50,0x53,0x62,0x52,0x56,0x66, 0x68,0x69,0x83,0x74,0x7a,0x92,0x68,0x6f,0x8a,0x58,0x5b,0x79,0x5e,0x58,0x71,0x59, 0x52,0x69,0x4a,0x44,0x5a,0x3c,0x37,0x4a,0x2d,0x2a,0x38,0x2d,0x29,0x36,0x40,0x39, 0x4b,0x58,0x4d,0x61,0x4a,0x40,0x51,0x4a,0x3e,0x4e,0x4d,0x42,0x56,0x4e,0x43,0x56, 0x4f,0x46,0x5a,0x4f,0x48,0x5e,0x45,0x44,0x5d,0x4a,0x51,0x66,0x62,0x68,0x77,0x75, 0x7a,0x87,0x76,0x7b,0x88,0x6c,0x71,0x80,0x4b,0x52,0x68,0x46,0x45,0x5e,0x48,0x46, 0x61,0x48,0x46,0x60,0x47,0x46,0x61,0x49,0x48,0x62,0x4d,0x4a,0x62,0x4b,0x4a,0x65, 0x4d,0x4d,0x68,0x50,0x4d,0x68,0x52,0x4e,0x68,0x52,0x4d,0x67,0x50,0x4d,0x66,0x50, 0x4f,0x68,0x52,0x4e,0x66,0x51,0x4b,0x5f,0x51,0x4b,0x61,0x53,0x52,0x68,0x5f,0x64, 0x7b,0x5d,0x64,0x77,0x62,0x6a,0x81,0x5a,0x62,0x7e,0x55,0x5d,0x79,0x54,0x5c,0x78, 0x57,0x5f,0x7b,0x5e,0x66,0x81,0x60,0x68,0x82,0x5f,0x67,0x82,0x5f,0x66,0x82,0x61, 0x6a,0x83,0x66,0x6e,0x87,0x6a,0x72,0x8a,0x6a,0x72,0x8a,0x6c,0x74,0x8b,0x73,0x7a, 0x90,0x75,0x7c,0x92,0x75,0x7c,0x92,0x73,0x7a,0x8f,0x7c,0x82,0x95,0x7e,0x85,0x96, 0x7a,0x80,0x93,0x85,0x8a,0x9a,0x86,0x8d,0x9c,0x8a,0x8f,0xa6,0x79,0x80,0xa0,0x79, 0x7e,0x9e,0x7b,0x81,0xa0,0x80,0x85,0xa3,0x81,0x85,0xa4,0x80,0x85,0xa4,0x7d,0x82, 0xa1,0x7a,0x7f,0x9f,0x7c,0x81,0x9f,0x7c,0x81,0x9e,0x7b,0x80,0x9b,0x7d,0x7f,0x9a, 0x7c,0x7d,0x98,0x75,0x76,0x90,0x6d,0x6d,0x86,0x70,0x6f,0x8a,0x4c,0x51,0x5e,0x4b, 0x4f,0x5c,0x4b,0x50,0x5c,0x4e,0x52,0x5d,0x4d,0x51,0x5c,0x52,0x55,0x5f,0x5e,0x61, 0x6b,0x97,0x99,0x9e,0x5c,0x5e,0x68,0x58,0x5c,0x65,0x76,0x79,0x80,0x74,0x77,0x80, 0x42,0x47,0x55,0x3e,0x43,0x52,0x3a,0x3f,0x4e,0x43,0x48,0x56,0x57,0x5b,0x67,0x7e, 0x81,0x86,0x9d,0x9d,0x9d,0x8d,0x8d,0x8d,0x86,0x86,0x86,0x92,0x92,0x92,0xa6,0xa6, 0xa6,0xaf,0xaf,0xaf,0xba,0xba,0xba,0xbe,0xbe,0xbe,0xc0,0xc0,0xc0,0xbe,0xbe,0xbe, 0xb4,0xb5,0xb7,0xa8,0xaa,0xae,0xa5,0xa6,0xab,0x9a,0x9d,0xa3,0x94,0x96,0x9d,0x8f, 0x92,0x98,0x85,0x87,0x8e,0x79,0x7b,0x84,0x76,0x79,0x82,0x6a,0x6e,0x7a,0x63,0x68, 0x76,0x72,0x76,0x82,0x88,0x8b,0x92,0x93,0x95,0x9a,0x90,0x92,0x96,0x76,0x77,0x7e, 0x58,0x5a,0x61,0x4e,0x51,0x56,0x44,0x46,0x4b,0x2f,0x31,0x36,0x22,0x24,0x2a,0x1a, 0x1d,0x22,0x1d,0x1e,0x24,0x4a,0x4a,0x4f,0x80,0x80,0x83,0x5e,0x5f,0x61,0x0a,0x0c, 0x0f,0x0a,0x0b,0x0e,0x09,0x0a,0x0d,0x08,0x09,0x0c,0x07,0x08,0x0a,0x06,0x06,0x09, 0x06,0x06,0x08,0x04,0x05,0x06,0x04,0x05,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x02, 0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x3c,0x41,0x52,0x69,0x74,0x97,0x68,0x67, 0x8d,0x72,0x5d,0x74,0x65,0x52,0x67,0x09,0x07,0x09,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, 0x26,0x23,0x2f,0x59,0x4e,0x65,0x4d,0x44,0x57,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,0x9c,0x9c,0x9c, 0xfd,0xfd,0xfd,0xff,0xff,0xff,0xf2,0xf2,0xf2,0x21,0x21,0x21,0x00,0x00,0x00,0x00, 0x00,0x00,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xed,0xed,0xed,0x00,0x00, 0x00,0x5a,0x5d,0x65,0x61,0x6d,0x93,0x52,0x54,0x80,0x55,0x50,0x79,0x52,0x52,0x7c, 0x5b,0x66,0x8e,0xd2,0xd4,0xdf,0x77,0x69,0x89,0x12,0x13,0x17,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,0x02,0x02,0x02,0x52,0x5b,0x7c,0x64,0x53,0x73,0x58,0x41,0x5b,0x64,0x53,0x74, 0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5e,0x53,0x79,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x55,0x49,0x6a,0x2c,0x24,0x3a,0x2c,0x24,0x3a, 0x2d,0x25,0x3b,0x2f,0x27,0x3d,0x3d,0x2d,0x43,0x51,0x3b,0x54,0x52,0x50,0x7b,0x46, 0x49,0x51,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,0x02,0x02,0x02, 0x02,0x02,0x02,0x92,0x99,0xac,0xa0,0xa8,0xbd,0x7f,0x87,0xa3,0x3a,0x32,0x3c,0x32, 0x25,0x2c,0x13,0x0f,0x11,0x02,0x02,0x03,0x02,0x02,0x03,0x44,0x49,0x58,0x6c,0x78, 0x9a,0x5e,0x69,0x90,0x60,0x6e,0x9b,0x53,0x56,0x80,0x52,0x54,0x7e,0x52,0x53,0x7e, 0x52,0x55,0x7f,0x52,0x5a,0x83,0x52,0x5d,0x85,0x53,0x5f,0x88,0x53,0x50,0x7a,0x61, 0x6d,0x92,0xaa,0xa8,0xac,0x30,0x24,0x2c,0x40,0x31,0x3c,0x06,0x06,0x07,0x05,0x05, 0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x38,0x2a,0x34, 0x2b,0x21,0x28,0x28,0x1e,0x23,0x22,0x18,0x1d,0x81,0x82,0x8b,0x8b,0x95,0xaf,0x53, 0x5e,0x87,0x4b,0x47,0x6f,0x56,0x4f,0x78,0x58,0x50,0x79,0x57,0x50,0x79,0x55,0x50, 0x79,0x52,0x4f,0x7a,0x51,0x4e,0x78,0x41,0x3f,0x60,0x4d,0x46,0x6c,0x61,0x57,0x81, 0x1c,0x18,0x20,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x0f,0x12, 0x18,0x59,0x64,0x92,0x50,0x4d,0x76,0x4c,0x44,0x64,0x58,0x4c,0x6d,0x5e,0x53,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x58,0x4d,0x6d,0x52,0x48,0x68,0x59,0x53,0x7a,0x4e,0x3e,0x4d,0x06,0x07, 0x08,0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x07,0x0a,0x07,0x08,0x0a, 0x08,0x09,0x0b,0x08,0x09,0x0c,0x09,0x0a,0x0d,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a, 0x0b,0x0f,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0b,0x0d,0x11,0x0b,0x0d, 0x11,0x0c,0x0d,0x11,0x0b,0x0d,0x11,0x0b,0x0d,0x11,0x0c,0x0d,0x11,0x0e,0x0f,0x13, 0x10,0x11,0x17,0x14,0x14,0x1a,0x1c,0x19,0x21,0x56,0x4a,0x61,0x5f,0x4b,0x68,0x5a, 0x46,0x62,0x5a,0x48,0x63,0x5a,0x47,0x62,0x5a,0x47,0x63,0x5d,0x49,0x65,0x40,0x33, 0x48,0x31,0x29,0x3c,0x2f,0x25,0x36,0x2b,0x22,0x31,0x31,0x27,0x35,0x57,0x46,0x57, 0x94,0x8a,0x96,0x8f,0x91,0x9a,0xac,0xb0,0xbf,0xaf,0xb4,0xc6,0xa8,0xaf,0xc2,0xa2, 0xaa,0xbd,0x98,0xa0,0xb4,0x8e,0x94,0xa8,0x7e,0x82,0x96,0x6d,0x73,0x86,0x5c,0x60, 0x70,0x4e,0x50,0x5f,0x5c,0x5a,0x6e,0x65,0x6a,0x86,0x5e,0x64,0x7f,0x64,0x6b,0x84, 0x57,0x5a,0x77,0x5a,0x5a,0x78,0x5f,0x5b,0x77,0x5f,0x58,0x74,0x5b,0x52,0x6c,0x48, 0x40,0x54,0x3c,0x35,0x46,0x38,0x30,0x3b,0x3c,0x30,0x3b,0x44,0x36,0x44,0x45,0x38, 0x46,0x47,0x3e,0x4e,0x4a,0x3f,0x52,0x4c,0x42,0x56,0x4d,0x44,0x58,0x40,0x3f,0x56, 0x46,0x4c,0x5e,0x61,0x65,0x70,0x6e,0x72,0x7d,0x6c,0x71,0x7d,0x5c,0x62,0x73,0x46, 0x49,0x62,0x48,0x46,0x61,0x49,0x48,0x62,0x46,0x47,0x61,0x49,0x4c,0x66,0x4a,0x4f, 0x6a,0x57,0x5f,0x76,0x67,0x6f,0x83,0x50,0x55,0x6e,0x52,0x51,0x6b,0x52,0x4f,0x68, 0x51,0x4e,0x67,0x53,0x4f,0x68,0x56,0x52,0x6a,0x56,0x51,0x68,0x56,0x50,0x66,0x56, 0x51,0x67,0x54,0x53,0x6a,0x56,0x5b,0x70,0x57,0x5d,0x70,0x64,0x6c,0x85,0x5a,0x62, 0x7e,0x55,0x5d,0x7a,0x53,0x59,0x76,0x53,0x5b,0x78,0x5a,0x62,0x7e,0x5d,0x66,0x80, 0x5f,0x66,0x82,0x62,0x6a,0x84,0x66,0x6e,0x87,0x68,0x70,0x88,0x6a,0x72,0x8a,0x6a, 0x72,0x89,0x6d,0x75,0x8c,0x73,0x7a,0x90,0x76,0x7e,0x92,0x7e,0x85,0x97,0x7e,0x83, 0x96,0x84,0x8a,0x9b,0x8a,0x90,0xa0,0x8a,0x90,0x9f,0x87,0x8d,0x9d,0x93,0x96,0xab, 0x86,0x8c,0xa8,0x7f,0x85,0xa1,0x7a,0x80,0x9e,0x7a,0x80,0xa0,0x7a,0x81,0x9f,0x76, 0x7c,0x9d,0x78,0x7d,0x9d,0x7a,0x80,0x9f,0x7a,0x7f,0x9f,0x79,0x7d,0x9d,0x77,0x7c, 0x9a,0x75,0x79,0x97,0x76,0x79,0x95,0x74,0x76,0x92,0x73,0x75,0x8f,0x7b,0x7b,0x96, 0x5a,0x5e,0x6d,0x56,0x5b,0x68,0x55,0x59,0x66,0x53,0x57,0x63,0x59,0x5d,0x67,0x60, 0x64,0x6d,0x87,0x89,0x8f,0x83,0x84,0x8a,0x8c,0x8d,0x92,0x8f,0x90,0x95,0x7d,0x80, 0x86,0x51,0x55,0x60,0x45,0x4a,0x57,0x44,0x49,0x57,0x4e,0x52,0x60,0x5e,0x62,0x6e, 0x76,0x78,0x80,0x9a,0x9a,0x9b,0xa0,0xa0,0xa0,0x99,0x99,0x99,0x9c,0x9c,0x9c,0xa6, 0xa6,0xa6,0xaf,0xaf,0xaf,0xb6,0xb6,0xb6,0xb9,0xb9,0xba,0xba,0xba,0xbb,0xb9,0xb9, 0xba,0xb6,0xb7,0xba,0xaa,0xad,0xb1,0x9b,0x9e,0xa6,0x93,0x96,0xa0,0x92,0x96,0x9f, 0x91,0x93,0x9d,0x86,0x8a,0x94,0x7b,0x7f,0x8a,0x7a,0x7e,0x89,0x7c,0x80,0x8c,0x6a, 0x6f,0x7f,0x66,0x6c,0x7d,0x7b,0x80,0x8c,0x95,0x97,0x9e,0x9f,0xa1,0xa5,0x8a,0x8d, 0x92,0x61,0x65,0x70,0x58,0x5b,0x63,0x4e,0x48,0x59,0x4f,0x48,0x5a,0x4a,0x44,0x55, 0x44,0x40,0x4f,0x38,0x35,0x42,0x2f,0x2b,0x38,0x2a,0x28,0x34,0x35,0x30,0x3f,0x17, 0x17,0x1c,0x25,0x22,0x2d,0x39,0x37,0x40,0x37,0x35,0x3e,0x1f,0x1c,0x25,0x09,0x0a, 0x0d,0x09,0x0a,0x0c,0x07,0x08,0x0a,0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x05,0x06, 0x04,0x04,0x06,0x03,0x04,0x05,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,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,0x1d, 0x1f,0x28,0x69,0x72,0x90,0x6b,0x67,0x8a,0x6f,0x5a,0x71,0x55,0x45,0x56,0x03,0x02, 0x03,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,0x06,0x05,0x06,0x30,0x2e,0x3e,0x4f,0x45, 0x5a,0x69,0x55,0x6b,0x69,0x54,0x69,0x62,0x4e,0x62,0x6b,0x67,0x89,0x56,0x5b,0x69, 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,0x29,0x29, 0x29,0xf1,0xf1,0xf1,0xff,0xff,0xff,0xfc,0xfc,0xfc,0x89,0x89,0x89,0x00,0x00,0x00, 0x00,0x00,0x00,0x27,0x27,0x27,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xbc, 0xbc,0xbc,0x00,0x00,0x00,0x07,0x07,0x07,0xb8,0xb9,0xbd,0x77,0x82,0xa4,0x52,0x5d, 0x88,0x52,0x4f,0x7b,0x64,0x71,0x96,0xda,0xd5,0xdc,0x66,0x6e,0x91,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,0x2b,0x2e,0x36,0x52,0x4f,0x7b,0x5e,0x46, 0x62,0x5f,0x47,0x63,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5d,0x50,0x73,0x2d,0x24, 0x3a,0x2e,0x25,0x3b,0x41,0x37,0x52,0x32,0x2a,0x41,0x2d,0x24,0x3a,0x2e,0x21,0x32, 0x3c,0x2b,0x3f,0x55,0x62,0x89,0x22,0x23,0x27,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,0x02,0x02,0x02,0x3b,0x3f,0x49,0x8a,0x92,0xac,0x89,0x94,0xae, 0x71,0x77,0x90,0x32,0x26,0x2c,0x31,0x24,0x2b,0x0e,0x0b,0x0d,0x02,0x02,0x03,0x39, 0x3f,0x4e,0x69,0x74,0x98,0x5e,0x6b,0x91,0x60,0x6c,0x99,0x52,0x54,0x80,0x52,0x53, 0x7d,0x52,0x54,0x7e,0x52,0x54,0x7f,0x52,0x5a,0x82,0x52,0x5d,0x86,0x53,0x5e,0x88, 0x52,0x50,0x79,0x61,0x6d,0x92,0xaa,0xa8,0xac,0x30,0x24,0x2b,0x3c,0x2e,0x38,0x19, 0x15,0x1b,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x06,0x05,0x05, 0x06,0x3b,0x2d,0x36,0x2d,0x21,0x28,0x2b,0x20,0x26,0x25,0x1a,0x1f,0x69,0x66,0x6f, 0x9e,0xa5,0xb9,0x5e,0x6b,0x91,0x4c,0x4a,0x72,0x50,0x4d,0x75,0x55,0x50,0x79,0x55, 0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x51,0x4e,0x79,0x42,0x40,0x62,0x4c,0x46, 0x6a,0x5f,0x56,0x80,0x2c,0x25,0x31,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x04,0x05,0x06,0x07,0x59,0x65,0x94,0x51,0x4e,0x79,0x4d,0x45,0x65,0x56,0x4c, 0x6b,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77, 0x5f,0x53,0x77,0x5e,0x53,0x76,0x5b,0x50,0x71,0x4e,0x45,0x62,0x59,0x53,0x7d,0x4c, 0x3c,0x4b,0x10,0x0e,0x12,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x09,0x06,0x07, 0x0a,0x07,0x07,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0b,0x09,0x0a,0x0d,0x09,0x0a,0x0d, 0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0b,0x0c,0x10,0x0b, 0x0c,0x10,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0b,0x0d,0x11,0x0b,0x0c,0x10,0x0b,0x0c, 0x10,0x0b,0x0c,0x10,0x0b,0x0c,0x10,0x0c,0x0d,0x12,0x0d,0x0e,0x12,0x29,0x25,0x2e, 0x66,0x51,0x6c,0x5e,0x4a,0x67,0x5a,0x47,0x62,0x5a,0x47,0x62,0x5a,0x47,0x62,0x5c, 0x48,0x63,0x5e,0x4a,0x68,0x32,0x29,0x3d,0x31,0x26,0x38,0x2b,0x23,0x32,0x2d,0x24, 0x31,0x56,0x46,0x58,0x5e,0x4c,0x5f,0xbd,0xba,0xc0,0x90,0x94,0x9f,0xb5,0xbb,0xca, 0xaa,0xb1,0xc3,0xa5,0xac,0xbe,0x9e,0xa4,0xb7,0x95,0x9c,0xb0,0x8a,0x90,0xa5,0x7c, 0x80,0x95,0x6f,0x73,0x86,0x62,0x67,0x78,0x59,0x5d,0x6f,0x63,0x64,0x79,0x61,0x64, 0x7c,0x5c,0x60,0x7b,0x58,0x5f,0x7a,0x56,0x5b,0x7a,0x57,0x59,0x7a,0x58,0x5a,0x7b, 0x59,0x5a,0x7b,0x59,0x53,0x70,0x58,0x51,0x69,0x36,0x2c,0x38,0x2c,0x22,0x2a,0x3e, 0x32,0x3e,0x49,0x3e,0x4e,0x45,0x3e,0x50,0x43,0x3b,0x4b,0x45,0x3c,0x4e,0x4b,0x41, 0x54,0x4a,0x40,0x53,0x3a,0x39,0x4e,0x48,0x4d,0x5a,0x62,0x66,0x6e,0x70,0x73,0x7b, 0x58,0x5d,0x6d,0x43,0x42,0x5a,0x47,0x46,0x5e,0x47,0x46,0x60,0x46,0x48,0x61,0x48, 0x4f,0x67,0x56,0x5d,0x73,0x6e,0x74,0x85,0x6d,0x73,0x84,0x5d,0x63,0x76,0x58,0x5c, 0x72,0x54,0x55,0x6f,0x54,0x51,0x6a,0x56,0x50,0x69,0x57,0x50,0x69,0x57,0x51,0x69, 0x54,0x4f,0x65,0x50,0x4a,0x5f,0x4d,0x47,0x5c,0x4f,0x4e,0x63,0x56,0x5b,0x72,0x61, 0x67,0x7e,0x66,0x6e,0x86,0x5d,0x65,0x7f,0x53,0x5b,0x77,0x52,0x57,0x75,0x52,0x5a, 0x77,0x59,0x62,0x7e,0x5e,0x66,0x81,0x5f,0x68,0x82,0x61,0x6a,0x83,0x62,0x6a,0x84, 0x62,0x6a,0x84,0x65,0x6d,0x86,0x69,0x71,0x88,0x6b,0x73,0x8a,0x73,0x7a,0x8f,0x82, 0x89,0x9a,0x98,0x9c,0xa9,0xa0,0xa4,0xae,0xa0,0xa4,0xae,0xa2,0xa5,0xaf,0x98,0x9d, 0xa9,0xa2,0xa5,0xb7,0x94,0x99,0xb2,0x8b,0x90,0xaa,0x83,0x88,0xa5,0x81,0x85,0xa3, 0x7e,0x84,0xa2,0x7d,0x82,0xa1,0x7c,0x81,0xa0,0x7c,0x81,0xa1,0x7b,0x81,0xa0,0x78, 0x7d,0x9d,0x75,0x79,0x99,0x73,0x78,0x97,0x76,0x7a,0x99,0x7b,0x7e,0x9b,0x7d,0x80, 0x9a,0x88,0x8a,0xa4,0x70,0x75,0x83,0x6b,0x70,0x7d,0x6a,0x6e,0x7a,0x67,0x6b,0x77, 0x67,0x6b,0x76,0x86,0x89,0x90,0x98,0x9a,0x9f,0x75,0x76,0x7c,0x78,0x78,0x7e,0x63, 0x66,0x6c,0x53,0x57,0x61,0x4a,0x4e,0x5a,0x46,0x4b,0x59,0x54,0x59,0x66,0x6f,0x72, 0x7d,0x7e,0x80,0x87,0x8f,0x90,0x95,0xa1,0xa2,0xa2,0xa3,0xa3,0xa3,0xa3,0xa3,0xa3, 0xab,0xab,0xad,0xb0,0xb1,0xb3,0xaf,0xb0,0xb3,0xb1,0xb2,0xb5,0xb6,0xb6,0xb8,0xb8, 0xb8,0xba,0xb6,0xb7,0xba,0xad,0xaf,0xb5,0x96,0x9a,0xa6,0x7a,0x81,0x91,0x72,0x78, 0x8a,0x7d,0x82,0x91,0x82,0x86,0x95,0x70,0x76,0x86,0x6c,0x71,0x82,0x7e,0x82,0x8e, 0x78,0x7d,0x8a,0x65,0x6b,0x7e,0x6e,0x72,0x83,0x82,0x86,0x92,0x8f,0x92,0x9a,0x8c, 0x8f,0x96,0x6a,0x6e,0x7a,0x53,0x57,0x65,0x5e,0x61,0x6a,0x65,0x69,0x6e,0x69,0x6a, 0x6f,0x63,0x65,0x69,0x5a,0x5b,0x62,0x43,0x42,0x4c,0x38,0x37,0x42,0x31,0x2f,0x3b, 0x17,0x18,0x1f,0x10,0x11,0x16,0x26,0x23,0x2e,0x39,0x36,0x40,0x38,0x35,0x3f,0x2f, 0x29,0x37,0x1b,0x19,0x21,0x09,0x0a,0x0d,0x08,0x09,0x0b,0x07,0x08,0x0a,0x06,0x06, 0x09,0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x03,0x04, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x07,0x08,0x0a,0x4b,0x53,0x6a,0x6a,0x67,0x8a,0x70, 0x5b,0x72,0x44,0x37,0x44,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,0x25,0x1f,0x27,0x5b,0x4b,0x5d,0x5f,0x4b,0x5e,0x55, 0x43,0x53,0x52,0x40,0x50,0x53,0x41,0x50,0x56,0x43,0x53,0x5a,0x47,0x58,0x90,0x99, 0xb5,0x85,0x8e,0xa8,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,0xcb,0xcb,0xcb,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xd5,0xd5,0xd5,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x8f,0xfd,0xfd,0xfd,0xff,0xff,0xff, 0xff,0xff,0xff,0x61,0x61,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x12,0xca, 0xcb,0xcd,0x95,0x9f,0xb9,0x66,0x73,0x98,0x90,0x99,0xb4,0xbc,0xb3,0xbd,0x10,0x10, 0x16,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,0x49, 0x53,0x71,0x64,0x53,0x74,0x57,0x3f,0x58,0x64,0x53,0x74,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x3a,0x31,0x4a,0x2d,0x24,0x3a,0x40,0x36,0x51,0x5f,0x53,0x76,0x4c,0x41, 0x5f,0x30,0x27,0x3e,0x2c,0x1f,0x30,0x2e,0x21,0x32,0x48,0x4f,0x6c,0x0b,0x0b,0x0c, 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,0x02,0x02,0x02,0x5f,0x66, 0x7d,0x85,0x8e,0xaa,0x7b,0x84,0xa4,0x57,0x58,0x6d,0x32,0x26,0x2c,0x2e,0x22,0x28, 0x02,0x02,0x02,0x35,0x3a,0x4b,0x64,0x70,0x95,0x5e,0x69,0x90,0x61,0x6e,0x9b,0x52, 0x57,0x82,0x52,0x54,0x7e,0x52,0x53,0x7e,0x52,0x55,0x7f,0x52,0x57,0x82,0x52,0x5d, 0x84,0x53,0x5e,0x87,0x54,0x50,0x78,0x64,0x70,0x94,0xa6,0xa3,0xa8,0x31,0x24,0x2b, 0x3a,0x2d,0x36,0x2a,0x21,0x2a,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x04,0x05,0x04, 0x04,0x05,0x04,0x04,0x05,0x3a,0x2d,0x36,0x2d,0x21,0x28,0x2b,0x20,0x26,0x27,0x1c, 0x21,0x4b,0x47,0x4c,0xa9,0xae,0xbf,0x71,0x7c,0x9e,0x4e,0x53,0x7d,0x4d,0x4a,0x73, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x79,0x43, 0x41,0x63,0x4a,0x45,0x69,0x5c,0x54,0x7b,0x38,0x31,0x41,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x56,0x61,0x8c,0x51,0x4e,0x7a,0x4e, 0x47,0x68,0x55,0x4a,0x69,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53, 0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5e,0x53,0x76,0x5b,0x4f,0x71,0x52,0x48,0x68, 0x5c,0x56,0x80,0x49,0x3a,0x49,0x1f,0x19,0x21,0x04,0x05,0x06,0x05,0x06,0x07,0x06, 0x06,0x08,0x06,0x07,0x09,0x06,0x07,0x0a,0x07,0x08,0x0b,0x07,0x08,0x0b,0x08,0x09, 0x0c,0x08,0x09,0x0c,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0b,0x0e, 0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0f,0x0a,0x0b,0x0f,0x0a,0x0b,0x0f,0x0b, 0x0c,0x10,0x0a,0x0b,0x0f,0x0a,0x0b,0x0f,0x0a,0x0b,0x0f,0x0a,0x0b,0x0f,0x0a,0x0b, 0x0f,0x0a,0x0b,0x0f,0x4b,0x40,0x54,0x64,0x4f,0x6d,0x59,0x46,0x61,0x5a,0x47,0x62, 0x59,0x47,0x61,0x5b,0x47,0x63,0x5d,0x4a,0x65,0x5a,0x47,0x62,0x31,0x27,0x3c,0x30, 0x26,0x37,0x2a,0x20,0x30,0x32,0x28,0x37,0x62,0x50,0x64,0x7e,0x6e,0x80,0xaf,0xb0, 0xb4,0x98,0x9d,0xaa,0xb1,0xb7,0xc8,0xa8,0xaf,0xc1,0xa4,0xa9,0xbc,0x9b,0xa1,0xb5, 0x92,0x98,0xac,0x7e,0x83,0x95,0x74,0x79,0x8b,0x75,0x7b,0x8e,0x6d,0x72,0x87,0x68, 0x6d,0x83,0x63,0x68,0x7f,0x5c,0x60,0x77,0x5f,0x67,0x83,0x5a,0x63,0x7e,0x56,0x5c, 0x7a,0x56,0x5b,0x7a,0x54,0x58,0x78,0x4d,0x4f,0x6d,0x59,0x57,0x70,0x3d,0x34,0x41, 0x32,0x28,0x32,0x41,0x33,0x42,0x4b,0x40,0x52,0x44,0x3f,0x54,0x40,0x3a,0x4c,0x41, 0x39,0x4a,0x45,0x3c,0x4e,0x47,0x3e,0x50,0x43,0x3a,0x4c,0x35,0x36,0x48,0x54,0x58, 0x64,0x65,0x68,0x71,0x59,0x5e,0x6a,0x43,0x4a,0x5f,0x45,0x45,0x5e,0x45,0x43,0x5d, 0x45,0x46,0x5e,0x45,0x4b,0x62,0x54,0x5b,0x70,0x69,0x6e,0x7f,0x6f,0x74,0x82,0x7d, 0x82,0x8e,0x7c,0x81,0x8f,0x60,0x61,0x76,0x50,0x50,0x68,0x56,0x50,0x69,0x58,0x51, 0x6b,0x57,0x50,0x69,0x57,0x4f,0x67,0x50,0x49,0x5e,0x54,0x4e,0x64,0x55,0x4f,0x67, 0x56,0x54,0x6c,0x50,0x53,0x6b,0x5f,0x66,0x7e,0x64,0x6c,0x84,0x5a,0x62,0x7d,0x54, 0x5d,0x79,0x53,0x5b,0x78,0x55,0x5e,0x7a,0x57,0x60,0x7b,0x5a,0x62,0x7e,0x5c,0x65, 0x7f,0x5c,0x64,0x7e,0x5d,0x66,0x7f,0x60,0x69,0x82,0x62,0x6a,0x83,0x64,0x6d,0x86, 0x6a,0x72,0x89,0x78,0x7f,0x93,0x88,0x8e,0x9e,0x98,0x9d,0xaa,0xa0,0xa3,0xae,0xa3, 0xa6,0xb0,0xa2,0xa6,0xb0,0xb3,0xb5,0xc3,0xa4,0xa8,0xbe,0x99,0x9b,0xb3,0x8b,0x90, 0xab,0x85,0x89,0xa5,0x86,0x8b,0xa7,0x86,0x8a,0xa6,0x84,0x89,0xa6,0x82,0x88,0xa5, 0x7f,0x85,0xa2,0x7a,0x80,0x9e,0x77,0x7d,0x9d,0x76,0x7d,0x9c,0x82,0x85,0xa3,0x8a, 0x8e,0xa8,0x8a,0x8e,0xa7,0x90,0x92,0xac,0x7a,0x7f,0x8e,0x7c,0x81,0x8e,0x7e,0x82, 0x8d,0x7d,0x81,0x8c,0x7a,0x7e,0x88,0x6f,0x73,0x7e,0x65,0x69,0x73,0x62,0x65,0x6e, 0x5f,0x63,0x6d,0x5a,0x5e,0x69,0x90,0x93,0x9c,0x4c,0x51,0x60,0x53,0x58,0x66,0x6e, 0x72,0x7b,0x7e,0x81,0x89,0x8e,0x8e,0x93,0x9d,0x9d,0xa0,0xa2,0xa3,0xa5,0xa2,0xa2, 0xa6,0xa7,0xa8,0xab,0xae,0xb0,0xb3,0xab,0xad,0xb2,0xaa,0xac,0xb2,0xb4,0xb5,0xb9, 0xba,0xba,0xbb,0xb9,0xba,0xbb,0xb0,0xb2,0xb8,0x9a,0x9e,0xaa,0x7a,0x81,0x93,0x62, 0x6a,0x81,0x5e,0x66,0x7e,0x64,0x6b,0x81,0x65,0x6c,0x82,0x5d,0x64,0x7a,0x65,0x6b, 0x7e,0x7e,0x82,0x90,0x6a,0x70,0x81,0x5e,0x64,0x78,0x6a,0x70,0x80,0x7c,0x80,0x8c, 0x78,0x7c,0x87,0x65,0x6a,0x77,0x4e,0x53,0x63,0x56,0x5b,0x69,0x69,0x6c,0x74,0x6c, 0x6f,0x74,0x6b,0x6e,0x73,0x69,0x6c,0x71,0x62,0x63,0x6a,0x51,0x54,0x5a,0x4b,0x4e, 0x55,0x3d,0x3f,0x45,0x2b,0x2d,0x32,0x1e,0x20,0x26,0x16,0x18,0x1d,0x12,0x12,0x17, 0x0e,0x0e,0x13,0x23,0x20,0x2a,0x22,0x20,0x2a,0x0c,0x0d,0x10,0x0a,0x0a,0x0e,0x09, 0x0a,0x0c,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x07,0x09,0x05,0x05,0x06,0x05,0x05, 0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02, 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,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, 0x2e,0x32,0x40,0x68,0x65,0x88,0x6f,0x5a,0x70,0x2e,0x25,0x2e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x46,0x3a,0x49,0x65,0x52,0x67,0x5e,0x4a,0x5c,0x50,0x3e,0x4d, 0x4e,0x3d,0x4b,0x50,0x3e,0x4d,0x56,0x43,0x53,0x60,0x4c,0x5f,0x73,0x5e,0x75,0x69, 0x73,0x98,0xdd,0xe0,0xe9,0x71,0x7c,0x9b,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,0x7f,0x7f,0x7f,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xf3,0xf3,0xf3,0x35, 0x35,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0xd9,0xff,0xff, 0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0c,0x0c,0x0c,0xb1,0xb1,0xb1,0xcf,0xd3,0xdf,0xe6,0xe7,0xed,0x79, 0x71,0x7a,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,0x21,0x23,0x29,0x52,0x54,0x80,0x5c,0x44,0x5e,0x5f,0x47,0x63,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x4b,0x40,0x5f,0x2c,0x24,0x3a,0x30,0x27,0x3e,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x38,0x2d,0x45,0x29,0x1c,0x2c,0x2f,0x22, 0x34,0x3b,0x3e,0x51,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,0x32,0x38,0x4c,0x5a,0x66,0x8b,0x5c,0x67,0x8f,0x6a,0x76,0x96,0x44,0x3d, 0x4b,0x32,0x26,0x2c,0x27,0x1e,0x23,0x30,0x35,0x47,0x5f,0x6a,0x91,0x5e,0x69,0x91, 0x63,0x6f,0x9c,0x52,0x56,0x82,0x53,0x56,0x7f,0x53,0x55,0x7f,0x52,0x54,0x7d,0x52, 0x57,0x81,0x52,0x5d,0x84,0x53,0x5e,0x86,0x55,0x50,0x78,0x64,0x70,0x96,0xa1,0x9d, 0xa1,0x30,0x24,0x2b,0x38,0x2b,0x34,0x3d,0x31,0x3c,0x04,0x04,0x05,0x04,0x04,0x05, 0x04,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x3f,0x31,0x3b,0x2d,0x21,0x27,0x2c, 0x20,0x27,0x2a,0x1e,0x24,0x2d,0x24,0x29,0xb0,0xb4,0xc2,0x88,0x92,0xaf,0x53,0x5e, 0x87,0x4c,0x4a,0x72,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x43,0x40,0x64,0x47,0x43,0x69,0x54,0x4e,0x75,0x43,0x39,0x4f,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x02,0x02,0x02,0x4f,0x59,0x80, 0x52,0x50,0x7b,0x4f,0x48,0x6a,0x52,0x49,0x68,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e, 0x53,0x76,0x5f,0x52,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5e,0x53,0x76,0x5a,0x4e, 0x70,0x53,0x48,0x68,0x5b,0x57,0x84,0x49,0x39,0x47,0x2c,0x24,0x2e,0x04,0x05,0x06, 0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x09,0x06,0x07,0x0a,0x07,0x08,0x0a,0x07, 0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0c,0x09,0x0a,0x0d,0x09,0x0a, 0x0d,0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e, 0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0a, 0x0b,0x0e,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x11,0x10,0x16,0x64,0x50,0x6b,0x5e,0x49, 0x66,0x59,0x46,0x60,0x5b,0x47,0x62,0x5b,0x47,0x63,0x5a,0x46,0x61,0x5e,0x4a,0x67, 0x31,0x28,0x3c,0x32,0x27,0x39,0x2e,0x22,0x32,0x2d,0x23,0x32,0x47,0x39,0x4c,0x68, 0x56,0x6c,0xc3,0xbf,0xc6,0x9b,0x9e,0xa7,0xa5,0xab,0xbb,0xab,0xb1,0xc4,0xa7,0xae, 0xc1,0xa1,0xa8,0xbc,0x9c,0xa3,0xb7,0x91,0x97,0xac,0x89,0x8d,0xa3,0x83,0x89,0xa1, 0x7e,0x83,0x9c,0x78,0x7e,0x97,0x70,0x78,0x8e,0x68,0x6d,0x86,0x65,0x6d,0x87,0x64, 0x6c,0x85,0x58,0x5f,0x7c,0x58,0x60,0x7f,0x54,0x54,0x70,0x4c,0x4b,0x64,0x57,0x57, 0x70,0x32,0x2a,0x34,0x34,0x2b,0x35,0x43,0x36,0x43,0x50,0x42,0x53,0x4f,0x43,0x55, 0x4b,0x40,0x54,0x44,0x3d,0x4f,0x42,0x3c,0x4f,0x44,0x3e,0x50,0x44,0x3b,0x4d,0x3f, 0x39,0x4a,0x39,0x3e,0x52,0x53,0x57,0x66,0x5e,0x61,0x6d,0x5f,0x63,0x71,0x43,0x49, 0x60,0x42,0x42,0x59,0x44,0x43,0x5d,0x42,0x47,0x5e,0x48,0x4f,0x64,0x56,0x5d,0x6e, 0x6e,0x72,0x7f,0x82,0x86,0x8f,0x83,0x87,0x92,0x6f,0x74,0x85,0x54,0x57,0x6f,0x53, 0x50,0x69,0x55,0x4e,0x67,0x57,0x4f,0x68,0x57,0x4f,0x68,0x55,0x4e,0x65,0x54,0x4c, 0x64,0x54,0x4c,0x63,0x54,0x4e,0x65,0x51,0x4f,0x67,0x4f,0x51,0x68,0x5a,0x5f,0x77, 0x5e,0x65,0x7e,0x5a,0x62,0x7d,0x57,0x60,0x7b,0x57,0x5f,0x7b,0x56,0x5f,0x7b,0x5d, 0x65,0x7f,0x5a,0x62,0x7e,0x54,0x5d,0x7a,0x54,0x5c,0x79,0x5a,0x62,0x7d,0x5f,0x68, 0x81,0x64,0x6d,0x85,0x70,0x77,0x8d,0x79,0x80,0x94,0x7b,0x82,0x96,0x83,0x8a,0x9a, 0x8d,0x92,0xa2,0x96,0x9a,0xa7,0x9a,0x9e,0xab,0xb2,0xb4,0xc4,0xa4,0xa9,0xbf,0xa2, 0xa5,0xbb,0x91,0x95,0xaf,0x86,0x8a,0xa6,0x84,0x89,0xa5,0x86,0x8a,0xa7,0x87,0x8c, 0xa9,0x86,0x8b,0xa7,0x83,0x88,0xa5,0x7e,0x84,0xa1,0x7b,0x80,0x9f,0x75,0x7a,0x9a, 0x7f,0x84,0xa2,0x8a,0x8e,0xa9,0x8c,0x90,0xa9,0x91,0x95,0xaf,0x7f,0x86,0x95,0x82, 0x88,0x96,0x85,0x8a,0x96,0x85,0x89,0x95,0x82,0x86,0x92,0x79,0x7d,0x89,0x6b,0x70, 0x7e,0x63,0x68,0x76,0x61,0x66,0x74,0x5e,0x63,0x72,0x5a,0x5f,0x6f,0x62,0x67,0x76, 0x72,0x76,0x82,0x82,0x85,0x8d,0x8e,0x8f,0x96,0x9e,0x9e,0xa2,0xa9,0xa9,0xab,0xa8, 0xa9,0xab,0xa2,0xa4,0xa9,0xa2,0xa4,0xac,0xa4,0xa6,0xae,0x9c,0x9f,0xaa,0xa0,0xa3, 0xab,0xae,0xb0,0xb5,0xb2,0xb3,0xb7,0xb2,0xb4,0xb9,0xa1,0xa4,0xae,0x86,0x8a,0x9b, 0x68,0x6f,0x86,0x5b,0x63,0x7b,0x5a,0x62,0x79,0x5d,0x65,0x7c,0x5c,0x63,0x7a,0x5a, 0x61,0x78,0x5c,0x63,0x78,0x5e,0x65,0x79,0x56,0x5e,0x73,0x56,0x5d,0x72,0x5a,0x61, 0x73,0x5d,0x62,0x73,0x56,0x5d,0x6e,0x4d,0x53,0x64,0x47,0x4d,0x5e,0x53,0x58,0x66, 0x5e,0x63,0x6e,0x61,0x64,0x6d,0x5f,0x62,0x6a,0x5b,0x5e,0x66,0x5a,0x5d,0x65,0x5f, 0x62,0x68,0x60,0x63,0x68,0x59,0x5c,0x61,0x54,0x56,0x5a,0x41,0x42,0x46,0x2c,0x2e, 0x32,0x1c,0x1e,0x22,0x12,0x14,0x19,0x4d,0x4c,0x54,0x4c,0x4a,0x53,0x0f,0x10,0x14, 0x0d,0x0e,0x12,0x0b,0x0c,0x0f,0x09,0x0a,0x0c,0x07,0x08,0x0a,0x07,0x07,0x0a,0x06, 0x06,0x09,0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02, 0x03,0x02,0x02,0x02,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,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,0x27,0x2a,0x36,0x66,0x66,0x8b,0x70,0x5b,0x72, 0x1c,0x17,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14, 0x10,0x14,0x4d,0x3f,0x4f,0x5a,0x47,0x58,0x4d,0x3b,0x49,0x48,0x37,0x44,0x49,0x38, 0x46,0x4e,0x3d,0x4b,0x5d,0x49,0x5b,0x71,0x5d,0x74,0x78,0x69,0x88,0x6d,0x66,0x89, 0x73,0x69,0x8a,0x90,0x99,0xb5,0xac,0xb4,0xc8,0x69,0x73,0x96,0x02,0x02,0x03,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,0x2b,0x2b,0x2b,0xef,0xef,0xef,0xff,0xff,0xff,0xfd,0xfd,0xfd, 0xa2,0xa2,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0xf7, 0xf7,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xdf,0xdf,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x3f, 0xb9,0xb8,0xb9,0x14,0x13,0x14,0x22,0x22,0x22,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff, 0xff,0xff,0x88,0x88,0x88,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x57,0x6d,0x5f,0x53,0x77, 0x55,0x3d,0x56,0x64,0x52,0x73,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x30,0x28,0x3e, 0x2d,0x24,0x3a,0x58,0x4c,0x6d,0x60,0x53,0x77,0x60,0x53,0x77,0x58,0x4c,0x6e,0x32, 0x26,0x39,0x29,0x1c,0x2c,0x29,0x24,0x3b,0x33,0x35,0x41,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,0x55,0x5f,0x84,0x5b,0x66,0x8d,0x5c, 0x67,0x8f,0x63,0x6c,0x8d,0x32,0x27,0x2f,0x32,0x26,0x2c,0x3a,0x3c,0x51,0x5b,0x66, 0x8f,0x5c,0x68,0x8f,0x5a,0x68,0x93,0x52,0x54,0x81,0x52,0x55,0x7f,0x52,0x55,0x7f, 0x53,0x56,0x7f,0x52,0x57,0x80,0x52,0x5c,0x84,0x53,0x5e,0x86,0x58,0x50,0x78,0x66, 0x71,0x96,0xa0,0x9c,0xa1,0x32,0x25,0x2d,0x3a,0x2c,0x35,0x46,0x38,0x45,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x3d,0x30,0x3a, 0x2c,0x21,0x27,0x2c,0x21,0x27,0x2c,0x21,0x27,0x21,0x19,0x1d,0xae,0xb0,0xbc,0x99, 0xa1,0xbb,0x5d,0x6a,0x90,0x4c,0x4e,0x76,0x51,0x4e,0x78,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x45,0x42,0x66,0x48,0x44,0x66,0x50,0x4b,0x71, 0x4f,0x44,0x5f,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x02,0x02, 0x02,0x48,0x52,0x73,0x52,0x54,0x7d,0x4d,0x48,0x6d,0x52,0x48,0x68,0x5e,0x53,0x76, 0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5e, 0x53,0x76,0x59,0x4e,0x6f,0x53,0x48,0x67,0x5d,0x59,0x89,0x46,0x38,0x44,0x37,0x2e, 0x39,0x04,0x04,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x09,0x06,0x06,0x09, 0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x08,0x0b,0x07,0x08,0x0b,0x08,0x09,0x0b,0x08, 0x09,0x0c,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x0a,0x0a,0x0e,0x0a,0x0a, 0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e, 0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x30, 0x2a,0x37,0x67,0x4f,0x6e,0x5b,0x46,0x62,0x5a,0x46,0x61,0x5a,0x46,0x61,0x5b,0x47, 0x62,0x5e,0x49,0x64,0x47,0x37,0x4e,0x31,0x26,0x38,0x31,0x26,0x38,0x2d,0x21,0x31, 0x33,0x28,0x38,0x5b,0x4b,0x60,0x6c,0x5a,0x71,0xd6,0xd6,0xdb,0x90,0x95,0xa2,0xaa, 0xb0,0xc1,0xab,0xb1,0xc4,0xa5,0xab,0xbf,0xa3,0xa8,0xbd,0x9a,0xa0,0xb5,0x93,0x9a, 0xb1,0x8d,0x95,0xaa,0x86,0x8e,0xa5,0x80,0x87,0xa0,0x7a,0x81,0x99,0x73,0x7a,0x95, 0x6d,0x74,0x8c,0x63,0x69,0x82,0x5d,0x61,0x7d,0x5b,0x5d,0x78,0x44,0x43,0x59,0x44, 0x44,0x5a,0x57,0x59,0x6f,0x20,0x1b,0x22,0x31,0x2a,0x34,0x46,0x3b,0x4a,0x4f,0x44, 0x55,0x50,0x44,0x55,0x4f,0x44,0x56,0x4c,0x43,0x57,0x4b,0x43,0x57,0x4a,0x42,0x55, 0x49,0x3e,0x51,0x46,0x3c,0x4d,0x42,0x3b,0x4e,0x3c,0x3e,0x53,0x4c,0x52,0x61,0x4f, 0x53,0x61,0x38,0x3b,0x50,0x44,0x40,0x56,0x43,0x42,0x5a,0x40,0x40,0x56,0x40,0x46, 0x5a,0x4e,0x53,0x64,0x5a,0x5f,0x6e,0x6a,0x6e,0x7a,0x74,0x78,0x84,0x68,0x6e,0x7e, 0x53,0x57,0x6e,0x52,0x54,0x6d,0x55,0x54,0x6d,0x56,0x50,0x68,0x56,0x4e,0x66,0x56, 0x4e,0x67,0x55,0x4d,0x64,0x55,0x4c,0x63,0x55,0x4d,0x64,0x55,0x4e,0x67,0x4f,0x4c, 0x64,0x52,0x53,0x6c,0x59,0x5c,0x75,0x5e,0x62,0x7a,0x5a,0x62,0x7d,0x59,0x61,0x7c, 0x5a,0x62,0x7d,0x5e,0x66,0x80,0x5e,0x67,0x81,0x56,0x5e,0x7a,0x52,0x52,0x71,0x52, 0x53,0x71,0x53,0x5a,0x76,0x5a,0x62,0x7d,0x67,0x6f,0x86,0x76,0x7e,0x92,0x7c,0x83, 0x96,0x81,0x87,0x99,0x81,0x87,0x99,0x83,0x8a,0x9a,0x86,0x8b,0x9c,0x9f,0xa3,0xb7, 0x92,0x98,0xb3,0x95,0x99,0xb2,0x8e,0x92,0xad,0x82,0x87,0xa5,0x7f,0x85,0xa3,0x82, 0x87,0xa5,0x82,0x87,0xa5,0x82,0x87,0xa5,0x84,0x88,0xa5,0x82,0x87,0xa5,0x7f,0x85, 0xa2,0x80,0x85,0xa4,0x8a,0x8e,0xa9,0x92,0x95,0xae,0x96,0x99,0xb0,0x9d,0x9f,0xb6, 0x8c,0x91,0x9f,0x8d,0x91,0x9e,0x8a,0x8e,0x9c,0x85,0x8a,0x97,0x7e,0x83,0x92,0x76, 0x7b,0x8a,0x70,0x76,0x86,0x71,0x76,0x86,0x75,0x7a,0x8a,0x6e,0x74,0x84,0x68,0x6e, 0x7e,0x77,0x7c,0x8a,0x8d,0x90,0x9a,0x96,0x9a,0x9f,0x9d,0x9e,0xa2,0xa6,0xa7,0xab, 0xaf,0xb0,0xb3,0xaa,0xab,0xaf,0x9a,0x9d,0xa6,0x95,0x99,0xa3,0x97,0x9b,0xa6,0x99, 0x9d,0xa7,0x9a,0x9e,0xa7,0x9a,0x9e,0xa8,0x9a,0x9d,0xa8,0x96,0x9a,0xa6,0x88,0x8d, 0x9d,0x71,0x78,0x8d,0x64,0x6b,0x82,0x5e,0x66,0x7e,0x5b,0x62,0x7a,0x5e,0x65,0x7a, 0x5b,0x62,0x78,0x56,0x5d,0x73,0x52,0x59,0x6f,0x53,0x5a,0x6f,0x52,0x5a,0x6e,0x4f, 0x56,0x6a,0x4e,0x55,0x65,0x4a,0x50,0x5f,0x47,0x4d,0x5e,0x43,0x49,0x5b,0x46,0x4a, 0x5c,0x49,0x4e,0x5e,0x4b,0x51,0x5f,0x49,0x4e,0x5c,0x47,0x4c,0x5a,0x4b,0x50,0x5b, 0x56,0x59,0x62,0x65,0x67,0x6d,0x67,0x6a,0x6f,0x68,0x6a,0x6f,0x69,0x6a,0x6f,0x61, 0x62,0x66,0x50,0x52,0x55,0x3e,0x3f,0x43,0x1f,0x21,0x26,0x1d,0x1d,0x25,0x19,0x1a, 0x21,0x12,0x14,0x18,0x10,0x12,0x16,0x0d,0x0e,0x12,0x0b,0x0c,0x0f,0x09,0x0a,0x0d, 0x09,0x0a,0x0c,0x07,0x07,0x0a,0x07,0x08,0x0a,0x07,0x07,0x0a,0x05,0x05,0x06,0x04, 0x04,0x06,0x02,0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x34,0x39, 0x4a,0x5e,0x5e,0x81,0x6d,0x59,0x6f,0x0c,0x0a,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, 0x52,0x41,0x50,0x4f,0x3e,0x4c,0x46,0x35,0x41,0x46,0x36,0x42,0x47,0x37,0x44,0x61, 0x4d,0x60,0x68,0x66,0x8b,0x8b,0x94,0xb0,0x8a,0x91,0xa2,0x4d,0x51,0x5d,0x34,0x38, 0x44,0x29,0x2d,0x3a,0x38,0x2e,0x3a,0x63,0x6c,0x89,0x7b,0x84,0xa5,0x68,0x6b,0x90, 0x24,0x24,0x31,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,0xd1,0xd1,0xd1,0xff,0xff,0xff,0xff,0xff, 0xff,0xe3,0xe3,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x67,0x67,0x67,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x9b,0x9b,0x9b,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,0xaa,0xaa,0xaa,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x1a, 0x1d,0x5a,0x67,0x8d,0x5e,0x46,0x62,0x5c,0x44,0x5e,0x62,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x4e,0x43,0x62,0x2d,0x24,0x3a,0x36,0x2d,0x45,0x37,0x2e,0x47,0x42,0x37,0x53, 0x60,0x53,0x77,0x58,0x4a,0x6b,0x32,0x24,0x37,0x29,0x1c,0x2c,0x25,0x24,0x3d,0x1f, 0x21,0x27,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, 0x55,0x5f,0x85,0x5a,0x65,0x8d,0x5c,0x69,0x8f,0x59,0x62,0x84,0x31,0x25,0x2c,0x41, 0x3e,0x55,0x5b,0x66,0x8d,0x5c,0x68,0x8f,0x5d,0x67,0x91,0x52,0x56,0x81,0x52,0x54, 0x7d,0x52,0x53,0x7d,0x52,0x54,0x7d,0x52,0x56,0x81,0x52,0x5b,0x84,0x52,0x5d,0x84, 0x53,0x4f,0x79,0x64,0x71,0x95,0x9b,0x97,0x9c,0x2f,0x24,0x2b,0x38,0x2b,0x34,0x4b, 0x3c,0x49,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x03,0x03,0x02,0x02, 0x03,0x3d,0x2f,0x39,0x31,0x24,0x2c,0x2f,0x23,0x29,0x2f,0x23,0x2a,0x26,0x1c,0x21, 0x9f,0x9f,0xa8,0xaa,0xb1,0xc5,0x6c,0x77,0x9b,0x4e,0x58,0x80,0x50,0x50,0x78,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x48,0x45,0x69,0x43,0x41, 0x63,0x4e,0x4a,0x6e,0x5a,0x4e,0x70,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,0x43,0x4c,0x68,0x52,0x5d,0x84,0x4d,0x4b,0x73,0x52,0x49, 0x6a,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77, 0x5f,0x53,0x77,0x5e,0x53,0x76,0x59,0x4e,0x6f,0x55,0x48,0x67,0x5a,0x57,0x87,0x44, 0x36,0x42,0x48,0x3b,0x4a,0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x06, 0x08,0x06,0x06,0x09,0x06,0x07,0x09,0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x08,0x0b, 0x07,0x08,0x0b,0x07,0x08,0x0b,0x08,0x09,0x0c,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x09, 0x0a,0x0c,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x0a,0x0a,0x0e,0x0a,0x0a, 0x0e,0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x0a,0x0a,0x0e, 0x09,0x0a,0x0d,0x09,0x0a,0x0d,0x59,0x47,0x5f,0x5e,0x49,0x65,0x5a,0x46,0x61,0x5b, 0x46,0x62,0x5b,0x47,0x62,0x5c,0x48,0x62,0x5f,0x4b,0x67,0x31,0x25,0x38,0x31,0x28, 0x3a,0x2f,0x24,0x35,0x2c,0x21,0x32,0x3a,0x30,0x42,0x6d,0x5b,0x73,0x8c,0x7d,0x90, 0xbb,0xbc,0xc2,0x90,0x93,0xa1,0xae,0xb5,0xc7,0xa7,0xae,0xc2,0xa7,0xad,0xc0,0xa2, 0xa9,0xbe,0x9a,0xa1,0xb8,0x95,0x9c,0xb3,0x8e,0x96,0xae,0x89,0x91,0xa9,0x84,0x8b, 0xa5,0x7e,0x84,0x9f,0x6b,0x6f,0x87,0x61,0x66,0x7d,0x5a,0x5f,0x75,0x59,0x5e,0x77, 0x44,0x46,0x5d,0x4a,0x4e,0x65,0x4e,0x52,0x66,0x15,0x14,0x19,0x26,0x22,0x2c,0x3a, 0x33,0x42,0x4a,0x40,0x52,0x4f,0x44,0x55,0x50,0x45,0x57,0x50,0x45,0x58,0x50,0x45, 0x59,0x4d,0x44,0x57,0x4c,0x43,0x57,0x4b,0x40,0x53,0x4a,0x3f,0x51,0x43,0x3d,0x4f, 0x3e,0x3a,0x4f,0x3a,0x3b,0x4e,0x3a,0x38,0x4c,0x47,0x3f,0x52,0x4c,0x43,0x57,0x49, 0x42,0x57,0x3e,0x3d,0x53,0x3b,0x41,0x56,0x49,0x4e,0x5e,0x52,0x56,0x65,0x5a,0x60, 0x6f,0x59,0x5f,0x71,0x5b,0x60,0x73,0x59,0x5e,0x72,0x51,0x55,0x6c,0x53,0x52,0x6b, 0x57,0x51,0x6a,0x58,0x51,0x6a,0x56,0x4e,0x66,0x54,0x4b,0x61,0x54,0x4c,0x62,0x56, 0x4e,0x64,0x54,0x4e,0x65,0x51,0x4d,0x64,0x53,0x53,0x6c,0x58,0x5a,0x72,0x5c,0x60, 0x78,0x58,0x60,0x7a,0x5d,0x64,0x7e,0x62,0x6a,0x82,0x60,0x69,0x82,0x5c,0x65,0x7e, 0x50,0x58,0x75,0x50,0x51,0x6e,0x50,0x50,0x6e,0x52,0x5a,0x76,0x61,0x69,0x82,0x75, 0x7c,0x90,0x81,0x87,0x9a,0x8b,0x91,0xa0,0x89,0x8e,0x9f,0x81,0x87,0x9a,0x7e,0x84, 0x98,0x94,0x99,0xb1,0x83,0x8a,0xa7,0x81,0x86,0xa4,0x81,0x85,0xa3,0x7d,0x81,0xa0, 0x7c,0x80,0x9f,0x7e,0x82,0xa0,0x80,0x84,0xa2,0x88,0x8d,0xa8,0x8e,0x91,0xad,0x90, 0x95,0xad,0x91,0x95,0xaf,0x96,0x9a,0xb2,0xa6,0xa9,0xbd,0xac,0xae,0xc0,0xa9,0xaa, 0xbe,0xae,0xaf,0xc3,0x9c,0xa0,0xab,0x97,0x9c,0xa6,0x8e,0x93,0xa0,0x82,0x88,0x97, 0x77,0x7d,0x8d,0x74,0x7a,0x8a,0x77,0x7d,0x8e,0x7e,0x84,0x93,0x83,0x88,0x97,0x84, 0x89,0x98,0x7d,0x82,0x91,0x83,0x87,0x94,0x95,0x97,0xa0,0xa2,0xa3,0xa9,0xa2,0xa4, 0xa9,0xaa,0xac,0xb0,0xae,0xb0,0xb5,0xa6,0xa9,0xae,0x93,0x97,0xa2,0x8a,0x8f,0x9d, 0x8f,0x94,0xa2,0x92,0x96,0xa3,0x90,0x95,0xa2,0x8e,0x92,0xa0,0x86,0x8b,0x9a,0x7e, 0x84,0x95,0x72,0x79,0x8e,0x69,0x71,0x87,0x62,0x69,0x82,0x5e,0x66,0x7e,0x5a,0x61, 0x77,0x57,0x5e,0x74,0x52,0x58,0x6e,0x4e,0x54,0x68,0x4e,0x55,0x68,0x4e,0x53,0x67, 0x4a,0x51,0x64,0x46,0x4c,0x5e,0x40,0x46,0x56,0x3c,0x41,0x4e,0x3d,0x42,0x51,0x3e, 0x42,0x52,0x41,0x46,0x56,0x42,0x47,0x56,0x44,0x49,0x58,0x45,0x4a,0x57,0x40,0x44, 0x52,0x41,0x45,0x52,0x49,0x4d,0x56,0x56,0x59,0x61,0x5e,0x62,0x68,0x60,0x62,0x6a, 0x60,0x62,0x69,0x5b,0x5d,0x61,0x60,0x61,0x65,0x4c,0x4e,0x52,0x26,0x29,0x2e,0x1a, 0x1d,0x22,0x18,0x1a,0x1e,0x15,0x16,0x1b,0x12,0x13,0x18,0x0f,0x11,0x15,0x0d,0x0e, 0x12,0x0d,0x0e,0x11,0x0a,0x0c,0x0f,0x09,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e, 0x06,0x07,0x09,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x28,0x28,0x37,0x60,0x5e,0x81,0x6f,0x5b,0x71,0x03,0x02, 0x03,0x3a,0x2d,0x37,0x44,0x34,0x3f,0x46,0x36,0x42,0x5f,0x4c,0x5e,0x68,0x66,0x8b, 0x6f,0x79,0x99,0x51,0x59,0x70,0x29,0x2c,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x6e, 0x92,0x68,0x68,0x8d,0x50,0x4f,0x6a,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,0x9b,0x9b,0x9b,0xfa,0xfa,0xfa,0xfd, 0xfd,0xfd,0xf6,0xf6,0xf6,0x3e,0x3e,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb5,0xb5,0xb5,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xfd,0xfd,0xfd, 0x37,0x37,0x37,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,0xaa,0xaa, 0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77, 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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4d,0x51,0x5f,0x52,0x4f,0x7b,0x56,0x3e,0x57,0x64,0x4d, 0x6b,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x2e,0x26,0x3c,0x2d,0x24,0x3a,0x30,0x28, 0x3f,0x47,0x3c,0x59,0x60,0x53,0x77,0x60,0x53,0x77,0x59,0x49,0x69,0x2c,0x1f,0x2f, 0x2c,0x1f,0x30,0x29,0x2c,0x44,0x0c,0x0d,0x0f,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,0x5b,0x66,0x8c,0x5b,0x68,0x8f,0x5b,0x68,0x8f, 0x4e,0x50,0x6a,0x40,0x3e,0x53,0x59,0x64,0x8b,0x5c,0x67,0x8f,0x60,0x6e,0x98,0x52, 0x53,0x7d,0x52,0x54,0x7d,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x55,0x7f,0x52,0x57, 0x81,0x52,0x5a,0x83,0x58,0x50,0x75,0x5b,0x65,0x85,0x72,0x6d,0x72,0x23,0x1a,0x20, 0x2f,0x24,0x2b,0x48,0x38,0x45,0x02,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x41,0x32,0x3d,0x32,0x25,0x2d,0x32,0x25,0x2c,0x34,0x27, 0x2f,0x2d,0x21,0x27,0x8a,0x87,0x8e,0xb7,0xbd,0xcc,0x7f,0x89,0xa9,0x54,0x60,0x87, 0x50,0x52,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x4a, 0x47,0x6e,0x42,0x40,0x60,0x49,0x46,0x6b,0x64,0x5a,0x81,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x44,0x5a,0x54,0x5f,0x87,0x4f, 0x4c,0x74,0x51,0x47,0x68,0x5e,0x52,0x75,0x5e,0x53,0x76,0x5f,0x53,0x77,0x5f,0x53, 0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5e,0x53,0x76,0x5a,0x4f,0x70,0x55,0x4a,0x68, 0x5c,0x5a,0x8a,0x46,0x39,0x48,0x59,0x48,0x5a,0x04,0x04,0x06,0x04,0x04,0x06,0x04, 0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x09,0x06,0x07, 0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0b,0x07,0x08,0x0b, 0x08,0x09,0x0c,0x08,0x09,0x0c,0x08,0x09,0x0c,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x09, 0x0a,0x0c,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x09,0x0a, 0x0c,0x09,0x0a,0x0c,0x09,0x0a,0x0c,0x08,0x09,0x0c,0x17,0x16,0x1d,0x66,0x4f,0x6d, 0x5b,0x46,0x63,0x5b,0x47,0x62,0x5a,0x46,0x61,0x5a,0x46,0x61,0x5c,0x47,0x63,0x40, 0x32,0x48,0x31,0x27,0x3a,0x31,0x25,0x37,0x2c,0x21,0x30,0x30,0x23,0x35,0x67,0x57, 0x6e,0x70,0x5d,0x76,0xc0,0xb9,0xc2,0x9b,0x9f,0xa9,0x9f,0xa5,0xb5,0xac,0xb3,0xc6, 0xaa,0xb0,0xc3,0xa4,0xab,0xc0,0xa1,0xa8,0xbd,0x9a,0xa2,0xb9,0x95,0x9c,0xb4,0x8f, 0x98,0xb1,0x8b,0x92,0xac,0x85,0x8d,0xa7,0x7e,0x84,0x9e,0x6e,0x73,0x8c,0x64,0x6a, 0x82,0x67,0x6d,0x87,0x4d,0x51,0x68,0x57,0x5d,0x78,0x49,0x4e,0x5f,0x0e,0x0f,0x14, 0x1c,0x1a,0x22,0x2c,0x27,0x34,0x3a,0x34,0x43,0x48,0x3e,0x4f,0x4e,0x44,0x55,0x50, 0x44,0x58,0x51,0x46,0x5b,0x4e,0x45,0x59,0x4b,0x44,0x57,0x48,0x41,0x56,0x48,0x41, 0x55,0x46,0x3f,0x52,0x41,0x3c,0x4f,0x41,0x3c,0x4f,0x46,0x3f,0x53,0x4b,0x41,0x54, 0x4d,0x43,0x54,0x4e,0x44,0x57,0x4c,0x43,0x58,0x41,0x3e,0x53,0x39,0x3a,0x50,0x49, 0x4e,0x5e,0x51,0x56,0x66,0x57,0x5c,0x6b,0x69,0x6d,0x78,0x64,0x66,0x75,0x56,0x5a, 0x6d,0x53,0x55,0x6b,0x52,0x51,0x6a,0x58,0x51,0x6b,0x5a,0x53,0x6c,0x57,0x4f,0x67, 0x54,0x4b,0x62,0x54,0x4b,0x62,0x54,0x4c,0x65,0x53,0x4d,0x65,0x52,0x4d,0x66,0x53, 0x52,0x6c,0x57,0x58,0x70,0x59,0x5c,0x74,0x5a,0x61,0x78,0x60,0x68,0x80,0x62,0x69, 0x82,0x5c,0x65,0x7e,0x57,0x5f,0x7a,0x53,0x5c,0x76,0x55,0x5c,0x76,0x62,0x6b,0x82, 0x73,0x7a,0x8e,0x7d,0x83,0x95,0x81,0x87,0x99,0x82,0x88,0x99,0x87,0x8d,0x9d,0x85, 0x8a,0x9a,0x7d,0x83,0x96,0x8b,0x91,0xab,0x7c,0x83,0xa2,0x7a,0x7d,0x9c,0x79,0x7d, 0x9a,0x79,0x7c,0x98,0x78,0x7b,0x97,0x79,0x7b,0x98,0x7b,0x7d,0x99,0x80,0x82,0x9f, 0x87,0x89,0xa5,0x8a,0x8e,0xa7,0x8e,0x91,0xab,0x94,0x96,0xae,0xa6,0xa7,0xba,0xac, 0xac,0xbf,0xab,0xac,0xbe,0xaf,0xaf,0xc1,0x9d,0xa0,0xab,0x98,0x9b,0xa6,0x8c,0x90, 0x9e,0x81,0x85,0x95,0x7a,0x80,0x90,0x7c,0x82,0x91,0x81,0x86,0x96,0x85,0x8a,0x99, 0x85,0x8a,0x9a,0x8b,0x90,0x9d,0x8b,0x90,0x9e,0x8a,0x8e,0x9b,0x93,0x96,0xa1,0x9f, 0xa2,0xa9,0xa3,0xa6,0xad,0xa2,0xa5,0xad,0xa6,0xa9,0xaf,0x99,0x9c,0xa6,0x87,0x8d, 0x9b,0x86,0x8c,0x9b,0x92,0x96,0xa3,0x9c,0xa0,0xab,0x9a,0x9e,0xa9,0x93,0x98,0xa4, 0x8a,0x8f,0x9d,0x7c,0x82,0x94,0x72,0x79,0x8d,0x6a,0x71,0x88,0x65,0x6c,0x82,0x5a, 0x60,0x77,0x4f,0x56,0x6d,0x4d,0x52,0x68,0x48,0x4e,0x61,0x44,0x4a,0x5c,0x45,0x4a, 0x5e,0x45,0x4a,0x5f,0x42,0x47,0x5c,0x3d,0x42,0x56,0x3a,0x40,0x52,0x3a,0x3f,0x50, 0x3b,0x40,0x51,0x3c,0x40,0x52,0x3b,0x41,0x52,0x3e,0x42,0x54,0x3f,0x45,0x56,0x40, 0x45,0x56,0x3d,0x42,0x52,0x38,0x3d,0x4c,0x3a,0x3e,0x4c,0x40,0x43,0x50,0x4a,0x4e, 0x59,0x4e,0x52,0x5c,0x4a,0x4e,0x56,0x4c,0x50,0x57,0x55,0x58,0x5e,0x42,0x45,0x4a, 0x29,0x2b,0x33,0x29,0x2b,0x33,0x2b,0x2e,0x33,0x1f,0x21,0x26,0x17,0x19,0x1e,0x14, 0x15,0x1a,0x12,0x14,0x19,0x0e,0x10,0x14,0x0e,0x0f,0x12,0x0b,0x0d,0x10,0x0a,0x0b, 0x0e,0x0a,0x0a,0x0e,0x06,0x07,0x09,0x05,0x05,0x06,0x04,0x04,0x06,0x02,0x03,0x04, 0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x14,0x14,0x1b,0x67, 0x5c,0x78,0x66,0x53,0x67,0x49,0x38,0x45,0x76,0x61,0x7a,0x5c,0x5f,0x81,0x1a,0x1c, 0x25,0x21,0x25,0x30,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,0x1d,0x1d,0x28,0x68,0x66,0x8b,0x5e,0x59,0x78,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,0x5c,0x5c,0x5c,0xf9,0xf9,0xf9, 0xff,0xff,0xff,0xfc,0xfc,0xfc,0x9c,0x9c,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0xeb,0xff,0xff,0xff,0xff,0xff, 0xff,0xef,0xef,0xef,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,0x22,0x22,0x22,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0x88,0x88, 0x88,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,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x05,0x05,0x5c,0x65,0x85,0x64, 0x52,0x73,0x57,0x40,0x5a,0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x51,0x45,0x65,0x42, 0x37,0x53,0x52,0x47,0x67,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x52,0x43,0x5f,0x2a,0x1d,0x2d,0x2d,0x21,0x33,0x2d,0x31,0x45,0x04,0x04,0x05, 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,0x3d,0x44,0x5e,0x5c,0x69, 0x8f,0x5c,0x69,0x8f,0x5b,0x67,0x8e,0x43,0x41,0x57,0x57,0x63,0x8b,0x5a,0x65,0x8c, 0x5f,0x6c,0x98,0x52,0x53,0x7e,0x52,0x53,0x7d,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52, 0x53,0x7c,0x52,0x55,0x7f,0x50,0x56,0x7f,0x4d,0x44,0x64,0x38,0x3f,0x53,0x4a,0x49, 0x4a,0x64,0x61,0x63,0x25,0x1d,0x23,0x45,0x36,0x43,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x44,0x35,0x41,0x35,0x28,0x31,0x36, 0x28,0x32,0x38,0x2a,0x34,0x34,0x27,0x2f,0x6b,0x66,0x6d,0xc2,0xc6,0xd4,0x92,0x9c, 0xb7,0x5d,0x6a,0x90,0x4f,0x57,0x7f,0x52,0x52,0x7d,0x52,0x50,0x7c,0x52,0x50,0x7b, 0x52,0x50,0x7b,0x4a,0x47,0x6e,0x40,0x3d,0x5e,0x43,0x40,0x64,0x6c,0x62,0x90,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x3c,0x4d, 0x55,0x61,0x89,0x4f,0x4d,0x78,0x4e,0x47,0x68,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f, 0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5b,0x4f, 0x70,0x55,0x4a,0x69,0x59,0x57,0x86,0x46,0x3b,0x4b,0x5b,0x4a,0x5b,0x03,0x04,0x05, 0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x09,0x06, 0x06,0x08,0x06,0x07,0x09,0x06,0x07,0x0a,0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x08, 0x0a,0x07,0x08,0x0b,0x07,0x08,0x0b,0x07,0x08,0x0b,0x07,0x08,0x0b,0x07,0x08,0x0b, 0x07,0x08,0x0b,0x08,0x09,0x0b,0x08,0x09,0x0b,0x07,0x08,0x0b,0x08,0x09,0x0b,0x08, 0x09,0x0b,0x07,0x08,0x0b,0x07,0x08,0x0b,0x08,0x09,0x0b,0x07,0x08,0x0b,0x07,0x08, 0x0b,0x43,0x38,0x4a,0x5f,0x49,0x67,0x59,0x45,0x60,0x5b,0x47,0x62,0x5c,0x47,0x62, 0x5c,0x47,0x63,0x5f,0x4a,0x64,0x30,0x24,0x36,0x30,0x25,0x37,0x2e,0x22,0x33,0x2a, 0x20,0x2d,0x36,0x2b,0x3c,0x71,0x5e,0x76,0x73,0x61,0x7a,0xdc,0xdb,0xdf,0x9b,0x9f, 0xab,0xab,0xb1,0xc1,0xac,0xb3,0xc4,0xa7,0xad,0xc1,0xa3,0xaa,0xbf,0xa1,0xa9,0xbc, 0x9a,0xa2,0xb9,0x95,0x9d,0xb5,0x91,0x99,0xb2,0x8b,0x93,0xad,0x85,0x8c,0xa9,0x7f, 0x87,0xa1,0x78,0x7e,0x9a,0x69,0x70,0x8b,0x50,0x57,0x6d,0x66,0x6f,0x8a,0x42,0x47, 0x53,0x0c,0x0e,0x11,0x15,0x15,0x1b,0x21,0x20,0x2a,0x2f,0x2c,0x3a,0x38,0x34,0x43, 0x46,0x3d,0x4e,0x4c,0x41,0x53,0x4e,0x45,0x58,0x4c,0x45,0x5a,0x48,0x42,0x58,0x47, 0x41,0x57,0x47,0x41,0x57,0x46,0x41,0x54,0x41,0x3c,0x4f,0x41,0x3c,0x4f,0x41,0x3d, 0x4f,0x45,0x3d,0x51,0x4b,0x42,0x55,0x50,0x44,0x57,0x51,0x46,0x59,0x50,0x45,0x58, 0x47,0x40,0x54,0x3b,0x3d,0x52,0x48,0x4e,0x5d,0x52,0x56,0x62,0x58,0x5c,0x66,0x57, 0x5b,0x66,0x54,0x58,0x67,0x58,0x5b,0x6c,0x59,0x5c,0x6e,0x51,0x51,0x6a,0x57,0x51, 0x6b,0x59,0x53,0x6c,0x57,0x4f,0x67,0x56,0x4e,0x64,0x54,0x4c,0x62,0x54,0x4e,0x65, 0x52,0x4c,0x62,0x54,0x4e,0x67,0x55,0x50,0x6a,0x54,0x55,0x6d,0x5d,0x5f,0x75,0x5e, 0x62,0x7a,0x5e,0x64,0x7d,0x5a,0x61,0x7a,0x56,0x5e,0x77,0x56,0x5d,0x76,0x5a,0x62, 0x79,0x71,0x77,0x8a,0x82,0x87,0x95,0x84,0x89,0x97,0x7e,0x83,0x94,0x76,0x7c,0x8e, 0x75,0x7b,0x8e,0x7b,0x81,0x92,0x77,0x7d,0x90,0x86,0x8c,0xa6,0x78,0x7e,0x9c,0x75, 0x77,0x95,0x73,0x75,0x92,0x74,0x73,0x91,0x71,0x71,0x8f,0x70,0x70,0x8e,0x71,0x71, 0x8e,0x71,0x71,0x8f,0x73,0x72,0x90,0x74,0x74,0x92,0x77,0x77,0x94,0x7b,0x7b,0x97, 0x83,0x83,0x9d,0x8d,0x8c,0xa4,0x90,0x8f,0xa5,0x95,0x93,0xaa,0x86,0x88,0x97,0x80, 0x82,0x93,0x79,0x7b,0x8d,0x77,0x7a,0x8d,0x78,0x7a,0x8d,0x79,0x7d,0x8f,0x79,0x7d, 0x8f,0x79,0x7f,0x90,0x7b,0x82,0x92,0x89,0x8e,0x9d,0x8b,0x91,0x9e,0x8a,0x8e,0x9c, 0x87,0x8d,0x9a,0x8a,0x8e,0x9b,0x90,0x95,0xa1,0x92,0x97,0xa3,0x8d,0x91,0x9e,0x80, 0x85,0x96,0x7e,0x84,0x96,0x8d,0x92,0x9f,0x9b,0x9e,0xa9,0xa2,0xa4,0xae,0xa1,0xa5, 0xae,0x9a,0x9e,0xa9,0x90,0x95,0xa2,0x80,0x86,0x97,0x73,0x79,0x8d,0x67,0x6e,0x82, 0x5a,0x61,0x78,0x4f,0x56,0x6e,0x4a,0x51,0x66,0x44,0x4a,0x5d,0x3e,0x43,0x57,0x3b, 0x40,0x54,0x3c,0x3f,0x54,0x3e,0x3e,0x54,0x3c,0x3d,0x52,0x37,0x3a,0x4d,0x38,0x3a, 0x4d,0x3c,0x3e,0x51,0x3c,0x3f,0x51,0x3b,0x3e,0x4f,0x3b,0x3e,0x4f,0x3c,0x40,0x51, 0x3d,0x40,0x52,0x3e,0x42,0x53,0x3e,0x42,0x53,0x3b,0x3f,0x51,0x3a,0x3e,0x4f,0x38, 0x3c,0x4d,0x38,0x3d,0x4c,0x3a,0x3f,0x4d,0x3f,0x43,0x50,0x48,0x4c,0x57,0x4e,0x51, 0x5a,0x40,0x43,0x4c,0x32,0x35,0x3e,0x3a,0x3d,0x46,0x4e,0x50,0x57,0x38,0x3a,0x42, 0x1e,0x21,0x26,0x17,0x19,0x1f,0x14,0x16,0x1b,0x12,0x13,0x19,0x11,0x12,0x16,0x0e, 0x0e,0x13,0x0b,0x0c,0x10,0x09,0x0a,0x0d,0x06,0x07,0x0a,0x06,0x06,0x08,0x04,0x05, 0x06,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,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,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,0x64,0x5a,0x76,0x5e,0x5a,0x78,0x2f,0x2e,0x3f,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,0x5b,0x58,0x76,0x61,0x59,0x76,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,0x1f,0x1f,0x1f,0xec,0xec, 0xec,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xd0,0xd0,0xd0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x35,0x35,0xfc,0xfc,0xfc,0xff, 0xff,0xff,0xff,0xff,0xff,0xc4,0xc4,0xc4,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x31,0x33,0x3a,0x55,0x60,0x8a,0x5d,0x45,0x5f,0x60,0x4a,0x65,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x46,0x34,0x4b,0x2b,0x1d,0x2d,0x2e,0x24, 0x39,0x2f,0x33,0x42,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,0x5b,0x67,0x8d,0x5c,0x69,0x8f,0x5c,0x69,0x8f,0x59,0x66,0x8b,0x56,0x63, 0x8b,0x59,0x64,0x8c,0x6f,0x7d,0xa5,0x52,0x5d,0x87,0x52,0x52,0x7c,0x52,0x52,0x7d, 0x52,0x50,0x7c,0x52,0x52,0x7c,0x51,0x53,0x7c,0x46,0x49,0x6d,0x33,0x2d,0x41,0x66, 0x68,0x6d,0xd6,0xd6,0xd6,0x50,0x4d,0x50,0x24,0x1b,0x20,0x44,0x34,0x40,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x4a,0x39,0x46, 0x39,0x2b,0x35,0x3b,0x2c,0x37,0x3f,0x30,0x3a,0x41,0x31,0x3c,0x50,0x46,0x4e,0xcb, 0xd0,0xda,0xa6,0xae,0xc3,0x6e,0x7a,0x9c,0x50,0x5a,0x81,0x52,0x54,0x7e,0x52,0x50, 0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x4d,0x4c,0x75,0x41,0x3e,0x60,0x42,0x41,0x63, 0x6d,0x63,0x93,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x2a,0x2d,0x3a,0x57,0x63,0x8a,0x50,0x4e,0x79,0x4d,0x46,0x67,0x5f,0x52,0x76, 0x5f,0x52,0x76,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5f,0x53,0x77,0x5f,0x53,0x77,0x5f, 0x53,0x77,0x5b,0x50,0x71,0x55,0x4a,0x69,0x57,0x54,0x81,0x48,0x3f,0x4e,0x5a,0x49, 0x5a,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x05,0x06, 0x05,0x06,0x07,0x05,0x06,0x07,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x06, 0x07,0x0a,0x06,0x07,0x0a,0x07,0x07,0x0a,0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x08, 0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0b,0x07,0x08,0x0b,0x07,0x08,0x0b, 0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07,0x08,0x0a,0x07, 0x08,0x0a,0x07,0x08,0x0a,0x0a,0x0b,0x0f,0x64,0x4c,0x6a,0x5c,0x47,0x63,0x5a,0x45, 0x60,0x5c,0x47,0x62,0x5b,0x47,0x62,0x5b,0x46,0x61,0x41,0x33,0x48,0x30,0x24,0x36, 0x30,0x24,0x36,0x2a,0x1f,0x2e,0x2a,0x1e,0x2d,0x47,0x3b,0x50,0x73,0x61,0x7a,0x7e, 0x6f,0x87,0xd1,0xd1,0xd5,0x9c,0xa0,0xaf,0xa7,0xae,0xbf,0xa9,0xb0,0xc3,0xa5,0xac, 0xc1,0xa4,0xab,0xc0,0x9f,0xa6,0xbc,0x9c,0xa2,0xba,0x94,0x9c,0xb5,0x8f,0x96,0xb1, 0x8b,0x93,0xac,0x83,0x8b,0xa7,0x7f,0x87,0xa3,0x6c,0x73,0x8c,0x57,0x5d,0x73,0x75, 0x7d,0x99,0x30,0x32,0x3a,0x0d,0x0e,0x11,0x10,0x12,0x16,0x17,0x17,0x1d,0x21,0x21, 0x2a,0x2d,0x2b,0x39,0x39,0x33,0x42,0x42,0x39,0x4a,0x45,0x3d,0x50,0x45,0x40,0x54, 0x45,0x41,0x57,0x46,0x41,0x57,0x46,0x41,0x57,0x44,0x40,0x55,0x41,0x3c,0x4f,0x40, 0x3a,0x4e,0x3f,0x3a,0x4e,0x40,0x3b,0x4f,0x41,0x3c,0x4f,0x48,0x3e,0x51,0x4e,0x43, 0x55,0x51,0x47,0x59,0x51,0x46,0x58,0x4f,0x44,0x58,0x42,0x3e,0x52,0x39,0x3e,0x52, 0x46,0x4a,0x59,0x45,0x4a,0x5c,0x5e,0x62,0x6e,0x6a,0x6d,0x79,0x6e,0x6f,0x7e,0x5d, 0x60,0x73,0x55,0x56,0x6e,0x55,0x52,0x6c,0x58,0x51,0x69,0x57,0x4e,0x65,0x56,0x4e, 0x65,0x57,0x4f,0x67,0x55,0x4e,0x65,0x53,0x4d,0x64,0x53,0x4d,0x64,0x53,0x4f,0x69, 0x57,0x57,0x6f,0x5c,0x5d,0x74,0x5b,0x5e,0x75,0x56,0x5a,0x72,0x52,0x58,0x72,0x51, 0x58,0x71,0x55,0x5c,0x74,0x60,0x67,0x7d,0x7a,0x80,0x8f,0x88,0x8c,0x99,0x84,0x88, 0x96,0x7a,0x7f,0x8f,0x75,0x7a,0x8c,0x72,0x77,0x8a,0x74,0x7a,0x8d,0x83,0x8a,0xa2, 0x77,0x7b,0x98,0x6b,0x6e,0x8b,0x68,0x67,0x86,0x68,0x66,0x84,0x68,0x65,0x84,0x67, 0x65,0x83,0x67,0x65,0x83,0x67,0x64,0x82,0x66,0x62,0x80,0x66,0x62,0x80,0x67,0x64, 0x82,0x6b,0x67,0x87,0x70,0x6e,0x8a,0x71,0x6f,0x8c,0x73,0x71,0x8d,0x79,0x77,0x94, 0x6c,0x6d,0x82,0x6d,0x6e,0x82,0x6c,0x6d,0x82,0x6e,0x71,0x85,0x70,0x71,0x85,0x6e, 0x71,0x84,0x6d,0x6f,0x83,0x6e,0x73,0x87,0x72,0x79,0x8d,0x7a,0x7f,0x92,0x7a,0x7f, 0x92,0x79,0x7e,0x91,0x76,0x7d,0x90,0x76,0x7d,0x90,0x77,0x7e,0x91,0x7e,0x84,0x95, 0x7b,0x82,0x93,0x7a,0x82,0x93,0x81,0x86,0x97,0x8e,0x94,0xa2,0x97,0x9b,0xa6,0xa1, 0xa4,0xae,0xa2,0xa6,0xaf,0x9d,0xa1,0xab,0x8e,0x93,0xa1,0x7d,0x83,0x95,0x68,0x6e, 0x82,0x58,0x5e,0x75,0x4e,0x55,0x6d,0x49,0x4e,0x66,0x41,0x47,0x5b,0x3b,0x40,0x54, 0x3a,0x3c,0x51,0x3c,0x3b,0x52,0x3a,0x3a,0x4e,0x37,0x38,0x4a,0x35,0x35,0x46,0x35, 0x34,0x46,0x36,0x37,0x4a,0x3b,0x3d,0x4e,0x3c,0x3e,0x4f,0x3a,0x3d,0x4e,0x3a,0x3d, 0x4e,0x3a,0x3c,0x4d,0x3a,0x3b,0x4c,0x3b,0x3e,0x50,0x3c,0x40,0x50,0x3c,0x40,0x50, 0x3a,0x3e,0x4f,0x3a,0x3e,0x4f,0x3a,0x3e,0x4e,0x3a,0x3e,0x4e,0x3f,0x44,0x52,0x46, 0x4b,0x58,0x48,0x4c,0x58,0x3e,0x42,0x4e,0x36,0x3b,0x44,0x3a,0x3d,0x46,0x47,0x4b, 0x55,0x42,0x46,0x4f,0x29,0x2b,0x34,0x22,0x24,0x2b,0x25,0x26,0x2c,0x1b,0x1d,0x22, 0x16,0x17,0x1c,0x10,0x12,0x16,0x0e,0x0f,0x14,0x0b,0x0c,0x10,0x08,0x09,0x0c,0x07, 0x07,0x0a,0x06,0x06,0x07,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x02, 0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x02,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,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,0x13,0x12,0x18, 0x6c,0x61,0x7e,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,0xce, 0xce,0xce,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xea,0xea,0xea,0x0f,0x0f,0x0f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x97, 0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x73,0x73,0x73,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x64,0x79,0x57,0x50,0x79,0x5c,0x44,0x5e, 0x64,0x53,0x73,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x37, 0x28,0x3c,0x2c,0x1f,0x30,0x26,0x22,0x3b,0x2d,0x2f,0x38,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,0x0c,0x0e,0x13,0x55,0x60,0x89,0x5b,0x66,0x8d,0x5b, 0x67,0x8f,0x64,0x71,0x95,0x6f,0x7b,0x9e,0x81,0x8f,0xb3,0x7b,0x87,0xa7,0x5a,0x65, 0x8d,0x52,0x50,0x7a,0x52,0x50,0x7a,0x51,0x4f,0x7a,0x4b,0x4c,0x72,0x33,0x33,0x4e, 0x24,0x22,0x2b,0xcf,0xcf,0xd0,0x99,0x98,0x99,0x19,0x13,0x17,0x2c,0x22,0x29,0x4a, 0x39,0x46,0x0e,0x0c,0x0e,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x4f,0x3d,0x4b,0x41,0x31,0x3d,0x45,0x35,0x41,0x4a,0x3a,0x46,0x49,0x39,0x45, 0x3e,0x2f,0x39,0xd2,0xd5,0xdf,0xb2,0xb9,0xcc,0x80,0x8a,0xa9,0x54,0x60,0x87,0x51, 0x54,0x7f,0x52,0x52,0x7c,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x42,0x41, 0x64,0x3f,0x3d,0x60,0x63,0x5e,0x8f,0x06,0x05,0x06,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,0x1d,0x1f,0x28,0x5a,0x66,0x8f,0x51,0x51,0x7c,0x4c,0x46, 0x67,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76, 0x5f,0x53,0x77,0x5f,0x53,0x77,0x5d,0x51,0x74,0x55,0x4a,0x69,0x55,0x53,0x7f,0x4c, 0x44,0x56,0x56,0x43,0x55,0x03,0x03,0x05,0x03,0x03,0x04,0x04,0x04,0x06,0x04,0x04, 0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07, 0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x0a,0x06, 0x07,0x0a,0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x08, 0x0a,0x07,0x08,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0a, 0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x07,0x0a,0x07,0x08,0x0a,0x2d,0x28,0x36,0x62, 0x4b,0x67,0x5a,0x46,0x61,0x5a,0x46,0x60,0x5b,0x46,0x62,0x5c,0x47,0x62,0x5a,0x47, 0x61,0x31,0x25,0x36,0x2f,0x23,0x34,0x2e,0x21,0x31,0x2a,0x1f,0x2e,0x2c,0x21,0x2f, 0x59,0x4b,0x61,0x72,0x61,0x7a,0xa4,0x9a,0xaa,0xbb,0xbd,0xc4,0x91,0x94,0xa1,0xac, 0xb4,0xc5,0xa9,0xb0,0xc2,0xa6,0xae,0xc2,0xa2,0xaa,0xbf,0x9e,0xa6,0xbc,0x9a,0xa2, 0xba,0x93,0x9b,0xb4,0x8e,0x97,0xb1,0x88,0x91,0xaa,0x84,0x8c,0xa7,0x66,0x6d,0x84, 0x67,0x6f,0x87,0x7d,0x84,0xa1,0x14,0x15,0x18,0x0d,0x0e,0x12,0x0f,0x10,0x14,0x11, 0x12,0x16,0x13,0x15,0x1b,0x1a,0x1b,0x24,0x20,0x1f,0x29,0x29,0x25,0x31,0x30,0x2c, 0x3a,0x38,0x35,0x46,0x3f,0x3b,0x4e,0x44,0x40,0x54,0x44,0x41,0x56,0x44,0x40,0x55, 0x41,0x3d,0x50,0x40,0x3b,0x4f,0x3f,0x3a,0x4e,0x40,0x3b,0x4f,0x3f,0x3a,0x4d,0x3e, 0x39,0x4b,0x3c,0x37,0x48,0x44,0x3d,0x4f,0x4e,0x43,0x55,0x54,0x48,0x5a,0x54,0x45, 0x57,0x48,0x40,0x54,0x43,0x49,0x59,0x54,0x58,0x65,0x69,0x6d,0x79,0x7b,0x7f,0x8a, 0x76,0x79,0x85,0x66,0x6a,0x7b,0x5e,0x61,0x76,0x57,0x59,0x70,0x55,0x54,0x6e,0x56, 0x4f,0x68,0x57,0x4d,0x66,0x57,0x4e,0x66,0x5a,0x52,0x6b,0x57,0x4f,0x68,0x54,0x4d, 0x65,0x53,0x4d,0x64,0x51,0x4f,0x67,0x52,0x51,0x6b,0x54,0x55,0x6e,0x56,0x56,0x6f, 0x52,0x55,0x6d,0x50,0x53,0x6c,0x50,0x55,0x6e,0x59,0x5e,0x76,0x62,0x6a,0x7f,0x71, 0x76,0x89,0x7e,0x82,0x90,0x7c,0x81,0x8f,0x78,0x7d,0x8c,0x6c,0x72,0x84,0x6f,0x74, 0x88,0x7b,0x81,0x9a,0x70,0x73,0x8f,0x69,0x68,0x86,0x65,0x61,0x7e,0x65,0x61,0x7d, 0x64,0x5f,0x7b,0x65,0x60,0x7c,0x66,0x61,0x7e,0x66,0x61,0x7e,0x66,0x61,0x7e,0x65, 0x5f,0x7d,0x65,0x5f,0x7d,0x64,0x5f,0x7c,0x64,0x5e,0x7c,0x64,0x5e,0x7c,0x63,0x60, 0x7c,0x6b,0x66,0x84,0x5e,0x5c,0x74,0x60,0x5e,0x75,0x62,0x63,0x79,0x65,0x65,0x7c, 0x68,0x6a,0x7f,0x6b,0x6d,0x82,0x6d,0x6f,0x84,0x71,0x72,0x87,0x74,0x7a,0x8d,0x75, 0x7c,0x8f,0x74,0x7a,0x8e,0x72,0x79,0x8e,0x6f,0x76,0x8d,0x6d,0x74,0x8a,0x6d,0x74, 0x8a,0x72,0x78,0x8e,0x79,0x80,0x92,0x7f,0x86,0x96,0x8a,0x90,0x9e,0x96,0x9a,0xa6, 0x9c,0xa0,0xab,0x9b,0x9f,0xaa,0x97,0x9b,0xa7,0x90,0x95,0xa2,0x81,0x87,0x97,0x6a, 0x72,0x87,0x5a,0x60,0x76,0x51,0x56,0x6b,0x47,0x4c,0x62,0x3e,0x43,0x5a,0x3e,0x3f, 0x56,0x3e,0x3d,0x53,0x3d,0x3b,0x52,0x3a,0x3a,0x4f,0x37,0x36,0x4b,0x37,0x36,0x4a, 0x37,0x36,0x49,0x38,0x37,0x4b,0x39,0x38,0x4b,0x3a,0x3a,0x4b,0x39,0x3a,0x4b,0x37, 0x38,0x49,0x36,0x36,0x46,0x32,0x32,0x42,0x32,0x31,0x41,0x34,0x35,0x44,0x36,0x36, 0x46,0x36,0x39,0x49,0x37,0x3a,0x4a,0x38,0x3c,0x4b,0x3a,0x3d,0x4e,0x3a,0x3d,0x4e, 0x3d,0x41,0x51,0x41,0x44,0x54,0x40,0x44,0x53,0x3a,0x3e,0x4c,0x36,0x3a,0x46,0x3d, 0x40,0x4b,0x49,0x4c,0x57,0x42,0x46,0x51,0x33,0x36,0x41,0x38,0x3a,0x42,0x47,0x4a, 0x4e,0x34,0x36,0x3b,0x1e,0x21,0x26,0x14,0x16,0x1c,0x11,0x12,0x17,0x0d,0x0e,0x12, 0x0a,0x0b,0x0e,0x09,0x0a,0x0c,0x07,0x08,0x0a,0x06,0x06,0x08,0x04,0x05,0x06,0x04, 0x04,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x03,0x04,0x05,0x02,0x02, 0x03,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,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,0x5c,0x50,0x68,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, 0xa3,0xa3,0xa3,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xf7,0xf7,0xf7,0x4c,0x4c,0x4c,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xdb,0xdb,0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8,0xf8,0x0f,0x0f,0x0f, 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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x1a,0x1d,0x62,0x6c, 0x91,0x63,0x4b,0x67,0x5b,0x44,0x5f,0x56,0x49,0x68,0x4c,0x41,0x5e,0x48,0x3e,0x5a, 0x48,0x3e,0x59,0x4a,0x40,0x5c,0x51,0x46,0x64,0x59,0x4d,0x6e,0x5e,0x52,0x75,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x5d,0x51,0x74,0x55,0x4a,0x6a,0x4d,0x42,0x5f,0x49,0x3f,0x5a,0x48,0x3e,0x59, 0x4b,0x40,0x5c,0x56,0x48,0x66,0x3d,0x2c,0x41,0x2f,0x23,0x35,0x2c,0x2f,0x47,0x1d, 0x1e,0x22,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,0x32,0x39,0x50, 0x50,0x5c,0x84,0x50,0x5a,0x7d,0x49,0x54,0x72,0x4f,0x58,0x73,0x57,0x5f,0x7a,0x61, 0x6a,0x85,0x71,0x7b,0x99,0x5f,0x6a,0x92,0x52,0x50,0x7b,0x4e,0x4c,0x75,0x3d,0x3d, 0x5b,0x1f,0x1d,0x2d,0xb1,0xb0,0xb1,0xce,0xcf,0xcf,0x2f,0x2d,0x30,0x27,0x1d,0x24, 0x33,0x27,0x2f,0x4c,0x3b,0x48,0x28,0x20,0x28,0x02,0x02,0x02,0x02,0x02,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x58,0x46,0x57,0x49,0x3a,0x46,0x4e,0x3e,0x4b,0x54,0x41, 0x51,0x55,0x44,0x54,0x4e,0x3e,0x4b,0xcd,0xcf,0xd8,0xbb,0xc0,0xd1,0x93,0x9c,0xb7, 0x5e,0x6b,0x90,0x50,0x59,0x81,0x52,0x53,0x7d,0x52,0x52,0x7c,0x52,0x50,0x7b,0x52, 0x50,0x7c,0x44,0x43,0x66,0x3e,0x3b,0x5d,0x55,0x52,0x7f,0x1c,0x17,0x20,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,0x11,0x12,0x17,0x5e,0x6a,0x91,0x51, 0x54,0x80,0x4d,0x47,0x69,0x5e,0x51,0x75,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52, 0x76,0x5f,0x52,0x76,0x5f,0x53,0x77,0x5f,0x52,0x76,0x5e,0x53,0x76,0x59,0x4e,0x6e, 0x54,0x52,0x7e,0x54,0x4c,0x5e,0x53,0x41,0x51,0x04,0x05,0x07,0x03,0x03,0x04,0x03, 0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x06, 0x07,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08, 0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x09,0x06,0x07,0x0a,0x06, 0x07,0x0a,0x06,0x07,0x0a,0x06,0x07,0x0a,0x07,0x07,0x0a,0x06,0x07,0x0a,0x06,0x07, 0x0a,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x07,0x09,0x06,0x06,0x09,0x06,0x06,0x09, 0x06,0x07,0x09,0x59,0x45,0x5f,0x5c,0x47,0x62,0x5a,0x45,0x5e,0x5b,0x46,0x61,0x5c, 0x46,0x63,0x5d,0x47,0x63,0x41,0x32,0x47,0x2f,0x23,0x34,0x2f,0x23,0x34,0x2e,0x22, 0x33,0x2b,0x1f,0x2e,0x30,0x25,0x35,0x72,0x60,0x79,0x73,0x61,0x7a,0xaa,0xa7,0xb9, 0x9a,0x9f,0xa6,0x9b,0xa1,0xaf,0xac,0xb3,0xc6,0xa7,0xae,0xc2,0xa4,0xab,0xc0,0xa3, 0xaa,0xc0,0x9c,0xa4,0xba,0x98,0xa1,0xb8,0x94,0x9c,0xb4,0x8e,0x96,0xb0,0x87,0x8f, 0xa8,0x67,0x6e,0x83,0x76,0x7f,0x97,0x74,0x7c,0x90,0x0b,0x0c,0x0e,0x0d,0x0e,0x12, 0x0f,0x10,0x14,0x10,0x12,0x16,0x11,0x12,0x16,0x12,0x14,0x1a,0x14,0x16,0x1c,0x16, 0x18,0x20,0x1a,0x1b,0x24,0x21,0x23,0x2e,0x2c,0x2d,0x3a,0x36,0x35,0x47,0x3e,0x3b, 0x4f,0x42,0x3f,0x53,0x40,0x3d,0x50,0x3e,0x3a,0x4c,0x3e,0x3a,0x4c,0x3e,0x3a,0x4d, 0x3e,0x3a,0x4e,0x3b,0x37,0x49,0x38,0x37,0x46,0x38,0x37,0x46,0x3e,0x38,0x4a,0x4d, 0x41,0x52,0x51,0x45,0x58,0x44,0x40,0x55,0x40,0x46,0x56,0x55,0x5a,0x67,0x69,0x6d, 0x7a,0x71,0x75,0x82,0x72,0x77,0x83,0x73,0x78,0x86,0x72,0x77,0x88,0x62,0x67,0x7c, 0x5f,0x60,0x76,0x5c,0x5d,0x74,0x56,0x52,0x69,0x55,0x4e,0x66,0x57,0x4e,0x67,0x5b, 0x53,0x6d,0x58,0x50,0x6a,0x55,0x4e,0x66,0x52,0x4e,0x66,0x51,0x4e,0x66,0x52,0x4e, 0x68,0x53,0x51,0x69,0x56,0x55,0x6d,0x56,0x55,0x6e,0x55,0x56,0x6f,0x55,0x57,0x71, 0x56,0x5c,0x76,0x57,0x5d,0x75,0x5b,0x62,0x78,0x6c,0x71,0x84,0x6e,0x74,0x86,0x5f, 0x66,0x7b,0x61,0x65,0x7f,0x67,0x6d,0x8c,0x60,0x61,0x81,0x63,0x60,0x7f,0x63,0x5c, 0x7b,0x63,0x5a,0x77,0x5f,0x56,0x72,0x60,0x57,0x72,0x64,0x5a,0x79,0x64,0x5c,0x79, 0x64,0x5a,0x79,0x62,0x59,0x76,0x64,0x5a,0x77,0x62,0x59,0x74,0x5f,0x55,0x6e,0x5f, 0x54,0x6f,0x5d,0x53,0x70,0x63,0x59,0x77,0x57,0x51,0x6b,0x59,0x57,0x6f,0x5a,0x58, 0x72,0x59,0x5a,0x72,0x59,0x5b,0x74,0x5c,0x5e,0x77,0x61,0x64,0x7b,0x67,0x6a,0x80, 0x6e,0x73,0x89,0x6f,0x77,0x8c,0x6d,0x75,0x8a,0x6a,0x72,0x89,0x66,0x6e,0x86,0x62, 0x6a,0x82,0x67,0x6f,0x86,0x6f,0x76,0x8b,0x77,0x7e,0x92,0x82,0x87,0x98,0x8a,0x8f, 0x9e,0x8e,0x93,0xa1,0x91,0x96,0xa3,0x8d,0x92,0xa0,0x88,0x8e,0x9c,0x7d,0x82,0x94, 0x6e,0x76,0x8b,0x5d,0x65,0x7b,0x52,0x5a,0x6e,0x4e,0x53,0x66,0x45,0x46,0x5c,0x40, 0x40,0x58,0x41,0x40,0x57,0x3e,0x3d,0x54,0x3d,0x3a,0x51,0x3c,0x3a,0x50,0x3a,0x39, 0x4e,0x39,0x37,0x4b,0x38,0x36,0x48,0x36,0x35,0x46,0x36,0x33,0x45,0x34,0x34,0x43, 0x34,0x34,0x44,0x32,0x32,0x41,0x2f,0x2e,0x3e,0x2d,0x2c,0x3a,0x2d,0x2b,0x3a,0x2d, 0x2b,0x3a,0x2e,0x2d,0x3c,0x2e,0x2e,0x3d,0x2e,0x2f,0x3e,0x33,0x33,0x43,0x37,0x3a, 0x4a,0x3a,0x3d,0x4c,0x3b,0x3f,0x50,0x3e,0x41,0x51,0x3c,0x40,0x50,0x39,0x3e,0x4e, 0x38,0x3c,0x4b,0x40,0x45,0x53,0x49,0x4d,0x5a,0x43,0x48,0x55,0x41,0x44,0x51,0x4a, 0x4e,0x57,0x57,0x5a,0x62,0x4c,0x4e,0x54,0x2f,0x32,0x37,0x1f,0x21,0x27,0x19,0x1a, 0x20,0x13,0x15,0x1a,0x0e,0x0f,0x14,0x0c,0x0e,0x12,0x0a,0x0b,0x0e,0x08,0x09,0x0b, 0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x0a,0x06,0x07,0x0a,0x05, 0x06,0x07,0x03,0x04,0x05,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x20,0x1b,0x23,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,0x56,0x56,0x56,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xfa,0xfa,0xfa,0x92,0x92,0x92, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0xf6,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xe1,0xe1, 0xe1,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,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x52,0x56,0x64,0x4d,0x52,0x7b,0x47,0x35,0x49,0x35,0x2a,0x3a,0x1f,0x1b, 0x27,0x19,0x15,0x1f,0x18,0x15,0x1e,0x1c,0x18,0x23,0x29,0x23,0x33,0x3e,0x36,0x4d, 0x55,0x49,0x69,0x5f,0x52,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x54,0x48,0x68,0x38,0x30,0x46,0x22,0x1d,0x2a,0x1a,0x16, 0x20,0x18,0x15,0x1e,0x1d,0x19,0x24,0x33,0x2c,0x3f,0x54,0x46,0x61,0x5b,0x43,0x5e, 0x34,0x2f,0x4c,0x38,0x3b,0x51,0x0e,0x0e,0x10,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,0x46,0x4e,0x6d,0x30,0x36,0x4d,0x1b,0x1e,0x2b,0x17,0x1a,0x24, 0x18,0x1b,0x25,0x21,0x25,0x2f,0x3d,0x43,0x55,0x6a,0x74,0x93,0x67,0x72,0x98,0x44, 0x45,0x67,0x27,0x26,0x3a,0x8b,0x8b,0x8e,0xeb,0xeb,0xeb,0x68,0x69,0x6d,0x50,0x4c, 0x51,0x31,0x24,0x2c,0x39,0x2a,0x33,0x48,0x38,0x44,0x34,0x2a,0x34,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x4c,0x5f,0x52,0x40,0x4f,0x56, 0x45,0x55,0x5f,0x4d,0x5f,0x64,0x51,0x65,0x5f,0x4c,0x5f,0xc0,0xbf,0xc8,0xc1,0xc4, 0xd1,0xa4,0xac,0xc2,0x72,0x7d,0x9e,0x4f,0x5b,0x82,0x52,0x53,0x7e,0x52,0x50,0x7c, 0x52,0x50,0x7c,0x52,0x50,0x7c,0x47,0x46,0x6b,0x3c,0x3a,0x5b,0x55,0x52,0x7f,0x2a, 0x23,0x31,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,0x03,0x03,0x03, 0x63,0x70,0x93,0x51,0x5a,0x83,0x4c,0x47,0x6c,0x5c,0x50,0x72,0x5f,0x52,0x76,0x5f, 0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52, 0x76,0x5a,0x4e,0x6f,0x53,0x53,0x7c,0x53,0x4c,0x5e,0x4f,0x3e,0x4d,0x0a,0x0a,0x0d, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x04, 0x04,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x05,0x06,0x07,0x05,0x06, 0x07,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08, 0x06,0x06,0x08,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x06, 0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06, 0x09,0x06,0x06,0x08,0x06,0x06,0x08,0x19,0x17,0x1f,0x60,0x49,0x64,0x5a,0x45,0x5e, 0x5b,0x45,0x61,0x5c,0x46,0x62,0x5c,0x46,0x62,0x59,0x44,0x5f,0x30,0x22,0x35,0x2f, 0x23,0x34,0x2e,0x22,0x34,0x2d,0x22,0x32,0x2a,0x1f,0x2d,0x3f,0x33,0x46,0x73,0x60, 0x79,0x74,0x62,0x7b,0xbe,0xc0,0xcb,0x8d,0x90,0x9b,0x9f,0xa5,0xb4,0xa8,0xaf,0xc2, 0xa4,0xab,0xc0,0xa4,0xaa,0xbf,0xa0,0xa9,0xbe,0x9c,0xa2,0xb9,0x99,0xa0,0xb8,0x91, 0x9a,0xb3,0x80,0x86,0x9e,0x74,0x7a,0x8f,0x82,0x8a,0xa5,0x5f,0x63,0x70,0x0b,0x0c, 0x0f,0x0d,0x0e,0x11,0x0e,0x10,0x13,0x0f,0x11,0x14,0x11,0x12,0x16,0x12,0x14,0x18, 0x13,0x15,0x1a,0x15,0x16,0x1c,0x16,0x17,0x1d,0x17,0x1a,0x21,0x1a,0x1c,0x25,0x22, 0x25,0x30,0x29,0x2c,0x3b,0x31,0x31,0x42,0x33,0x32,0x42,0x36,0x34,0x45,0x39,0x36, 0x48,0x3b,0x37,0x49,0x3b,0x38,0x4a,0x3b,0x3a,0x4b,0x3d,0x3c,0x4b,0x3c,0x3a,0x4b, 0x3c,0x37,0x49,0x48,0x3d,0x4f,0x4d,0x42,0x54,0x47,0x40,0x55,0x3d,0x3e,0x52,0x45, 0x4a,0x5d,0x52,0x59,0x6c,0x5a,0x62,0x75,0x67,0x6d,0x7d,0x6e,0x74,0x83,0x6e,0x74, 0x86,0x70,0x76,0x89,0x7b,0x80,0x8f,0x72,0x74,0x85,0x5c,0x5c,0x72,0x52,0x4e,0x66, 0x54,0x4d,0x65,0x57,0x4f,0x69,0x5a,0x53,0x6d,0x59,0x53,0x6c,0x55,0x4e,0x67,0x52, 0x4e,0x66,0x55,0x4f,0x68,0x59,0x53,0x6c,0x66,0x62,0x79,0x66,0x64,0x7b,0x68,0x66, 0x7d,0x67,0x67,0x7e,0x64,0x64,0x7d,0x5d,0x5e,0x78,0x55,0x56,0x71,0x51,0x56,0x6f, 0x52,0x56,0x70,0x4e,0x54,0x6e,0x57,0x59,0x75,0x63,0x63,0x84,0x60,0x5c,0x7c,0x62, 0x5d,0x7d,0x63,0x5b,0x7b,0x60,0x57,0x74,0x5c,0x52,0x6c,0x5e,0x54,0x70,0x64,0x5a, 0x76,0x64,0x5a,0x78,0x61,0x57,0x74,0x60,0x56,0x72,0x63,0x59,0x76,0x62,0x58,0x74, 0x5f,0x53,0x6e,0x5e,0x54,0x6e,0x5d,0x53,0x6f,0x5f,0x56,0x72,0x53,0x4e,0x64,0x5a, 0x57,0x70,0x5c,0x5a,0x73,0x5a,0x5a,0x73,0x56,0x59,0x72,0x58,0x5a,0x74,0x5b,0x5d, 0x76,0x5f,0x63,0x7c,0x60,0x67,0x80,0x5e,0x66,0x7f,0x5b,0x64,0x7e,0x58,0x61,0x7b, 0x59,0x62,0x7c,0x5b,0x63,0x7e,0x60,0x68,0x81,0x6a,0x70,0x88,0x6f,0x76,0x8a,0x7a, 0x80,0x92,0x82,0x89,0x9a,0x85,0x8a,0x9b,0x82,0x88,0x98,0x7f,0x86,0x96,0x76,0x7d, 0x90,0x70,0x78,0x8b,0x62,0x6a,0x80,0x4f,0x56,0x6c,0x52,0x55,0x68,0x50,0x50,0x65, 0x47,0x46,0x5e,0x42,0x42,0x59,0x3f,0x3e,0x55,0x3d,0x3c,0x51,0x3a,0x38,0x4d,0x36, 0x35,0x48,0x34,0x32,0x46,0x35,0x33,0x44,0x33,0x31,0x42,0x32,0x30,0x40,0x32,0x2f, 0x40,0x31,0x2f,0x3e,0x32,0x31,0x40,0x31,0x2e,0x3e,0x2e,0x2c,0x3b,0x2b,0x2a,0x37, 0x2c,0x2b,0x39,0x2c,0x2b,0x3a,0x2c,0x2a,0x3a,0x2d,0x2b,0x3a,0x2c,0x2a,0x3a,0x2d, 0x2b,0x3b,0x2f,0x30,0x3f,0x32,0x35,0x44,0x36,0x37,0x48,0x37,0x3a,0x4a,0x37,0x3a, 0x4a,0x38,0x3a,0x4a,0x39,0x3c,0x4d,0x3e,0x42,0x52,0x42,0x46,0x56,0x42,0x45,0x54, 0x46,0x4b,0x5a,0x55,0x58,0x65,0x5a,0x5e,0x68,0x52,0x56,0x5e,0x40,0x42,0x4a,0x31, 0x33,0x39,0x25,0x27,0x2e,0x1d,0x1f,0x26,0x12,0x15,0x1a,0x12,0x14,0x1a,0x0f,0x10, 0x15,0x0b,0x0d,0x10,0x0b,0x0c,0x0f,0x08,0x09,0x0b,0x07,0x07,0x0a,0x08,0x09,0x0b, 0x09,0x0a,0x0d,0x0a,0x0a,0x0d,0x06,0x06,0x08,0x07,0x07,0x08,0x0f,0x0f,0x10,0x20, 0x21,0x22,0x2b,0x2c,0x2d,0x32,0x33,0x34,0x2a,0x2a,0x2c,0x13,0x13,0x14,0x04,0x04, 0x05,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,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,0x02,0x02,0x02,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,0x2b,0x2b,0x2b,0xec,0xec,0xec,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xc9,0xc9, 0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff, 0xff,0xff,0xac,0xac,0xac,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x09,0x4b,0x51,0x65,0x29,0x23,0x33,0x50, 0x4d,0x50,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb0,0xaf, 0xb1,0x55,0x51,0x5e,0x4c,0x42,0x5e,0x5e,0x51,0x74,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x52,0x76,0x4d,0x42,0x5f,0x34,0x2f,0x3c,0xde, 0xde,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x36,0x33,0x3a,0x3e,0x36, 0x4f,0x5e,0x48,0x64,0x62,0x4a,0x66,0x40,0x3e,0x62,0x43,0x47,0x5a,0x02,0x02,0x02, 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,0x29,0x2c,0x35,0xee,0xee, 0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x43,0x4d,0x51,0x59,0x75, 0x66,0x72,0x97,0x3e,0x46,0x5d,0x48,0x49,0x50,0xe7,0xe7,0xe7,0xd2,0xd2,0xd2,0x29, 0x2c,0x38,0x68,0x63,0x69,0x39,0x2a,0x33,0x3a,0x2c,0x35,0x44,0x35,0x40,0x37,0x2b, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x54,0x69, 0x5b,0x49,0x5b,0x62,0x4f,0x62,0x68,0x55,0x69,0x70,0x5c,0x73,0x6c,0x57,0x6d,0xa9, 0xa3,0xaf,0xc6,0xc8,0xd4,0xaf,0xb6,0xc9,0x83,0x8f,0xac,0x55,0x61,0x87,0x51,0x57, 0x81,0x52,0x53,0x7e,0x52,0x52,0x7d,0x52,0x52,0x7d,0x4a,0x48,0x70,0x3b,0x39,0x57, 0x51,0x4e,0x78,0x36,0x2d,0x3e,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,0x5f,0x69,0x8a,0x53,0x5e,0x87,0x4c,0x49,0x6e,0x59,0x4f,0x73, 0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f, 0x52,0x76,0x5f,0x52,0x76,0x5a,0x4f,0x71,0x51,0x52,0x7c,0x55,0x50,0x63,0x4c,0x3b, 0x4a,0x15,0x12,0x18,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05, 0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05, 0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06, 0x07,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08, 0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08,0x06, 0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x07,0x06,0x06,0x08,0x44,0x36, 0x4a,0x5e,0x47,0x62,0x5a,0x44,0x5e,0x5b,0x45,0x60,0x5b,0x45,0x60,0x5b,0x45,0x60, 0x3c,0x2d,0x42,0x2e,0x22,0x33,0x2f,0x23,0x34,0x2e,0x23,0x34,0x2b,0x20,0x30,0x29, 0x1e,0x2c,0x60,0x52,0x6c,0x73,0x61,0x7a,0x74,0x66,0x81,0xc5,0xc6,0xcc,0x85,0x87, 0x92,0xa3,0xaa,0xb9,0xa7,0xaf,0xc2,0xa3,0xac,0xc1,0xa1,0xa9,0xbe,0x9e,0xa6,0xbc, 0x9c,0xa3,0xb9,0x95,0x9d,0xb6,0x75,0x7c,0x90,0x7c,0x82,0x9a,0x91,0x99,0xb1,0x41, 0x42,0x49,0x0b,0x0c,0x0f,0x0c,0x0e,0x10,0x0e,0x0e,0x12,0x0f,0x10,0x13,0x10,0x11, 0x15,0x12,0x12,0x16,0x13,0x15,0x19,0x14,0x16,0x1a,0x15,0x16,0x1b,0x16,0x17,0x1d, 0x17,0x19,0x1e,0x18,0x1a,0x22,0x1a,0x1d,0x25,0x1d,0x20,0x29,0x1f,0x22,0x2c,0x24, 0x26,0x30,0x2a,0x2c,0x39,0x30,0x32,0x40,0x37,0x36,0x45,0x3e,0x3d,0x4b,0x3e,0x3d, 0x4d,0x3c,0x3b,0x4d,0x44,0x3d,0x50,0x4e,0x44,0x55,0x53,0x46,0x59,0x55,0x49,0x5e, 0x50,0x47,0x5c,0x53,0x4a,0x5e,0x57,0x4c,0x61,0x54,0x4b,0x61,0x4a,0x48,0x62,0x4f, 0x56,0x6e,0x65,0x6b,0x7e,0x6e,0x73,0x85,0x7b,0x81,0x8f,0x7c,0x80,0x8f,0x6b,0x6f, 0x81,0x56,0x55,0x6b,0x50,0x4e,0x65,0x53,0x4f,0x66,0x59,0x53,0x6c,0x5a,0x53,0x6d, 0x5b,0x53,0x6d,0x58,0x51,0x6a,0x56,0x4f,0x67,0x57,0x50,0x69,0x5c,0x55,0x6e,0x5e, 0x59,0x72,0x65,0x61,0x79,0x6b,0x69,0x80,0x6d,0x6b,0x83,0x6f,0x6d,0x85,0x6e,0x6c, 0x83,0x65,0x64,0x7b,0x55,0x52,0x6c,0x51,0x4e,0x69,0x5c,0x58,0x75,0x64,0x63,0x83, 0x61,0x5c,0x7c,0x64,0x5c,0x7d,0x64,0x5c,0x7d,0x64,0x5c,0x7c,0x62,0x5a,0x78,0x63, 0x5a,0x78,0x65,0x5c,0x7a,0x66,0x5c,0x7b,0x64,0x5a,0x78,0x64,0x5a,0x77,0x65,0x5c, 0x79,0x66,0x5c,0x79,0x66,0x5c,0x7b,0x65,0x5d,0x7c,0x65,0x5f,0x7d,0x68,0x63,0x80, 0x5c,0x58,0x70,0x5f,0x5c,0x75,0x5f,0x5d,0x77,0x5f,0x5e,0x78,0x5c,0x5d,0x78,0x5b, 0x5d,0x76,0x5d,0x61,0x79,0x5f,0x65,0x7d,0x5f,0x67,0x81,0x5a,0x62,0x7d,0x55,0x5d, 0x79,0x53,0x5c,0x77,0x57,0x60,0x7b,0x5e,0x65,0x7f,0x61,0x68,0x81,0x62,0x6a,0x82, 0x65,0x6d,0x83,0x6e,0x74,0x89,0x76,0x7c,0x8f,0x79,0x7f,0x92,0x78,0x7e,0x92,0x7a, 0x81,0x93,0x76,0x7b,0x8f,0x6a,0x72,0x86,0x55,0x5e,0x76,0x53,0x57,0x6f,0x58,0x58, 0x6c,0x53,0x52,0x67,0x48,0x46,0x5e,0x3d,0x3b,0x51,0x38,0x36,0x4a,0x36,0x35,0x48, 0x35,0x33,0x46,0x34,0x32,0x42,0x32,0x2f,0x3e,0x2f,0x2c,0x3b,0x2e,0x2a,0x38,0x2e, 0x2a,0x37,0x2b,0x2a,0x36,0x2c,0x29,0x36,0x2d,0x2a,0x37,0x2e,0x2b,0x38,0x29,0x27, 0x35,0x28,0x26,0x33,0x29,0x27,0x34,0x29,0x28,0x35,0x2a,0x28,0x35,0x2a,0x29,0x36, 0x2a,0x29,0x36,0x2a,0x29,0x36,0x2a,0x29,0x36,0x2b,0x2a,0x38,0x2d,0x2c,0x3b,0x2f, 0x2f,0x3d,0x31,0x31,0x3f,0x31,0x32,0x41,0x35,0x36,0x44,0x3a,0x3b,0x4a,0x3f,0x43, 0x52,0x41,0x45,0x55,0x45,0x49,0x58,0x55,0x5a,0x66,0x5a,0x5e,0x6a,0x58,0x5c,0x66, 0x57,0x5a,0x64,0x50,0x53,0x5b,0x3c,0x3e,0x43,0x26,0x28,0x2c,0x1d,0x1e,0x22,0x1c, 0x1e,0x22,0x17,0x18,0x1c,0x15,0x16,0x1a,0x13,0x15,0x18,0x0e,0x0f,0x12,0x0d,0x0e, 0x10,0x0f,0x10,0x13,0x16,0x17,0x1b,0x24,0x26,0x2a,0x2e,0x2f,0x32,0x37,0x39,0x3b, 0x3f,0x40,0x43,0x47,0x48,0x4b,0x52,0x53,0x55,0x66,0x67,0x6a,0x6a,0x6a,0x6d,0x52, 0x53,0x56,0x2b,0x2c,0x2e,0x0f,0x0f,0x10,0x06,0x06,0x06,0x02,0x02,0x02,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,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,0x03,0x03,0x03,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,0xd4,0xd4,0xd4,0xff,0xff,0xff,0xff,0xff,0xff,0xe6, 0xe6,0xe6,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xff,0xff,0xff, 0xff,0xff,0xff,0xfc,0xfc,0xfc,0x52,0x52,0x52,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,0x99,0x99,0x99, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x12,0x14, 0x9d,0x9e,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f, 0x6e,0x71,0x25,0x20,0x2e,0x3e,0x36,0x4d,0x55,0x49,0x69,0x5f,0x52,0x76,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x54,0x48,0x68, 0x32,0x2c,0x3f,0x70,0x6e,0x72,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9d, 0x9c,0x9e,0x29,0x24,0x34,0x4e,0x43,0x61,0x61,0x4b,0x67,0x64,0x53,0x73,0x4e,0x58, 0x81,0x46,0x49,0x56,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,0x77, 0x77,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7c,0x7c,0x7f,0x27,0x2c, 0x3f,0x4b,0x54,0x73,0x47,0x4f,0x6a,0x25,0x2a,0x3a,0xca,0xca,0xca,0xf4,0xf4,0xf4, 0x71,0x6f,0x74,0x41,0x47,0x5a,0x79,0x73,0x7b,0x3a,0x2b,0x34,0x3b,0x2c,0x36,0x45, 0x35,0x40,0x36,0x2a,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x6f,0x5a,0x71,0x67,0x53,0x67,0x6c,0x57,0x6d,0x74,0x5f,0x77,0x78,0x66,0x80, 0x78,0x64,0x7e,0x8c,0x7f,0x91,0xcf,0xd1,0xdc,0xb7,0xbd,0xcf,0x97,0xa0,0xb9,0x65, 0x70,0x95,0x52,0x5c,0x86,0x52,0x58,0x82,0x52,0x54,0x7f,0x52,0x55,0x7f,0x4e,0x4e, 0x76,0x38,0x37,0x54,0x4c,0x49,0x70,0x41,0x38,0x4f,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,0x57,0x60,0x7c,0x55,0x60,0x89,0x4b,0x48, 0x70,0x58,0x4f,0x72,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76, 0x5f,0x52,0x76,0x5f,0x52,0x76,0x5d,0x50,0x74,0x5a,0x4f,0x71,0x51,0x52,0x7a,0x57, 0x54,0x67,0x49,0x38,0x47,0x28,0x22,0x2c,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03, 0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x06, 0x04,0x04,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05, 0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x07,0x05,0x06, 0x07,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x07, 0x05,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x07,0x05,0x06,0x07,0x05,0x06,0x07,0x05, 0x05,0x06,0x0d,0x0b,0x0f,0x62,0x4a,0x67,0x5a,0x44,0x5f,0x5a,0x44,0x5f,0x5b,0x45, 0x60,0x5b,0x45,0x5e,0x56,0x40,0x5a,0x2d,0x22,0x32,0x2c,0x20,0x30,0x2e,0x22,0x33, 0x2d,0x20,0x32,0x29,0x1e,0x2d,0x2f,0x23,0x33,0x6f,0x5f,0x79,0x74,0x61,0x7a,0x73, 0x72,0x93,0xc2,0xc3,0xc9,0x8b,0x90,0x9c,0xa7,0xae,0xc0,0xa2,0xa9,0xbf,0xa2,0xa9, 0xbf,0xa0,0xa6,0xbc,0x9b,0xa3,0xb9,0x91,0x98,0xae,0x68,0x6d,0x7f,0x87,0x8f,0xa6, 0x9d,0xa5,0xb7,0x10,0x11,0x14,0x0a,0x0b,0x0e,0x0b,0x0c,0x0f,0x0d,0x0e,0x11,0x0f, 0x10,0x13,0x0f,0x10,0x13,0x10,0x12,0x15,0x12,0x13,0x17,0x13,0x15,0x19,0x14,0x16, 0x1a,0x17,0x19,0x1e,0x19,0x1a,0x20,0x18,0x1a,0x1f,0x2c,0x2f,0x33,0x1a,0x1c,0x22, 0x1d,0x1f,0x26,0x1f,0x21,0x29,0x22,0x24,0x2d,0x27,0x29,0x33,0x2c,0x2e,0x39,0x33, 0x34,0x42,0x37,0x38,0x49,0x3f,0x3b,0x4e,0x44,0x40,0x53,0x4f,0x46,0x5b,0x59,0x4c, 0x61,0x5b,0x4f,0x64,0x5a,0x4e,0x61,0x5a,0x4d,0x61,0x5b,0x4d,0x61,0x5b,0x4c,0x5f, 0x5a,0x4c,0x5f,0x56,0x4b,0x62,0x48,0x46,0x61,0x4b,0x52,0x6a,0x5e,0x65,0x79,0x6a, 0x70,0x81,0x68,0x6e,0x80,0x65,0x69,0x7b,0x5a,0x5a,0x6e,0x5a,0x59,0x6f,0x58,0x58, 0x6f,0x54,0x51,0x6c,0x59,0x53,0x6c,0x5a,0x53,0x6d,0x5a,0x53,0x6d,0x58,0x51,0x6a, 0x57,0x50,0x68,0x58,0x51,0x69,0x60,0x5a,0x72,0x67,0x62,0x7a,0x69,0x65,0x7c,0x6c, 0x69,0x7f,0x70,0x6d,0x84,0x71,0x6d,0x83,0x5c,0x56,0x6e,0x56,0x50,0x69,0x61,0x5a, 0x75,0x66,0x61,0x80,0x65,0x5c,0x79,0x68,0x5d,0x7a,0x68,0x5d,0x79,0x69,0x5d,0x79, 0x69,0x5d,0x79,0x68,0x5d,0x78,0x67,0x5c,0x78,0x67,0x5c,0x78,0x67,0x5c,0x78,0x67, 0x5c,0x78,0x66,0x5c,0x78,0x66,0x5c,0x79,0x67,0x5c,0x79,0x66,0x5c,0x79,0x65,0x5c, 0x77,0x66,0x5e,0x7b,0x5c,0x57,0x6f,0x5c,0x57,0x70,0x5b,0x57,0x70,0x59,0x58,0x72, 0x5a,0x5a,0x72,0x5d,0x5e,0x78,0x5f,0x61,0x7a,0x5f,0x65,0x7d,0x5d,0x63,0x7d,0x57, 0x5f,0x7a,0x52,0x5a,0x76,0x56,0x5f,0x7a,0x5e,0x66,0x7f,0x66,0x6e,0x86,0x65,0x6d, 0x85,0x65,0x6c,0x84,0x63,0x6b,0x82,0x62,0x6a,0x82,0x6a,0x72,0x87,0x73,0x7a,0x8e, 0x76,0x7d,0x90,0x78,0x7e,0x92,0x6c,0x73,0x8a,0x59,0x62,0x7c,0x52,0x59,0x74,0x58, 0x5c,0x73,0x5a,0x5a,0x70,0x52,0x4f,0x65,0x42,0x3f,0x54,0x36,0x34,0x47,0x33,0x32, 0x43,0x32,0x2f,0x3f,0x2e,0x2c,0x3a,0x2b,0x28,0x35,0x28,0x26,0x32,0x27,0x25,0x30, 0x26,0x23,0x2d,0x25,0x21,0x2a,0x26,0x22,0x2c,0x26,0x23,0x2e,0x26,0x23,0x2e,0x25, 0x22,0x2c,0x23,0x21,0x2b,0x23,0x21,0x2b,0x24,0x22,0x2e,0x26,0x25,0x30,0x26,0x25, 0x31,0x26,0x25,0x31,0x27,0x26,0x31,0x27,0x26,0x32,0x28,0x26,0x32,0x28,0x26,0x32, 0x29,0x26,0x33,0x2a,0x28,0x34,0x2a,0x29,0x36,0x2d,0x2c,0x3a,0x31,0x31,0x3e,0x32, 0x32,0x3e,0x3a,0x3a,0x48,0x3f,0x40,0x4f,0x41,0x44,0x53,0x4e,0x51,0x5e,0x58,0x5c, 0x69,0x5a,0x5e,0x6b,0x5a,0x5e,0x6a,0x5b,0x60,0x6a,0x55,0x59,0x62,0x46,0x4a,0x50, 0x43,0x45,0x4b,0x43,0x45,0x49,0x3d,0x3e,0x43,0x3d,0x3e,0x42,0x3c,0x3e,0x42,0x3c, 0x3e,0x42,0x3f,0x42,0x46,0x42,0x45,0x4a,0x43,0x46,0x4a,0x42,0x45,0x49,0x44,0x46, 0x4a,0x47,0x4a,0x50,0x48,0x4a,0x53,0x53,0x55,0x5c,0x64,0x66,0x6a,0x71,0x72,0x74, 0x76,0x76,0x79,0x69,0x6a,0x6d,0x50,0x51,0x53,0x3d,0x3e,0x42,0x38,0x3a,0x3c,0x29, 0x2a,0x2a,0x0b,0x0b,0x0b,0x02,0x02,0x02,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, 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,0xbe,0xbe,0xbe,0xfc,0xfc,0xfc,0xff,0xff,0xff, 0xf5,0xf5,0xf5,0x47,0x47,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb, 0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf4,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33, 0x33,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbd,0xbd,0xbd, 0x34,0x32,0x39,0x2e,0x28,0x39,0x49,0x3f,0x5b,0x59,0x4d,0x6e,0x5e,0x52,0x75,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x5d,0x51,0x74,0x4a,0x40,0x5b,0x24,0x1f,0x2c,0xbd,0xbd,0xbd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x43,0x41,0x48,0x39,0x32,0x49,0x5b,0x4c,0x6c,0x63, 0x4b,0x67,0x64,0x53,0x75,0x5d,0x6a,0x91,0x37,0x3b,0x43,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x11,0x11,0x11,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0x26, 0x26,0x31,0x36,0x3a,0x55,0x41,0x4b,0x6a,0x2a,0x2f,0x41,0x8d,0x8e,0x91,0xf0,0xf0, 0xf0,0xcf,0xcf,0xd0,0x1d,0x1c,0x2b,0x5a,0x62,0x7b,0x82,0x7c,0x85,0x3c,0x2d,0x38, 0x3a,0x2c,0x36,0x46,0x35,0x42,0x38,0x2b,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x74,0x5f,0x78,0x6e,0x59,0x6f,0x76,0x61,0x79,0x78,0x68, 0x82,0x73,0x69,0x89,0x75,0x69,0x88,0x82,0x73,0x8b,0xd9,0xdc,0xe4,0xbe,0xc3,0xd4, 0xa7,0xaf,0xc5,0x7b,0x85,0xa6,0x58,0x64,0x8b,0x52,0x5d,0x87,0x52,0x56,0x81,0x52, 0x54,0x7f,0x50,0x51,0x7a,0x39,0x39,0x56,0x4a,0x47,0x6e,0x51,0x48,0x69,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,0x4f,0x57,0x6f,0x58, 0x64,0x8b,0x4e,0x4b,0x74,0x57,0x4d,0x71,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5c,0x4f,0x72,0x5b,0x4f,0x72, 0x51,0x52,0x7b,0x5a,0x58,0x6d,0x48,0x37,0x45,0x42,0x36,0x45,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x04, 0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x05,0x06,0x04,0x05,0x06, 0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05, 0x05,0x06,0x05,0x06,0x07,0x05,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06, 0x07,0x05,0x06,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06, 0x05,0x05,0x06,0x05,0x06,0x07,0x05,0x05,0x06,0x30,0x27,0x37,0x5e,0x47,0x61,0x5a, 0x44,0x5e,0x5c,0x46,0x60,0x5c,0x46,0x5f,0x58,0x41,0x5b,0x3d,0x2e,0x42,0x2a,0x1e, 0x2e,0x2b,0x20,0x2f,0x2d,0x21,0x32,0x2d,0x21,0x32,0x2b,0x20,0x2f,0x44,0x35,0x49, 0x73,0x60,0x79,0x74,0x62,0x7c,0x89,0x92,0xaa,0xac,0xae,0xb7,0x9b,0xa0,0xad,0xa7, 0xad,0xc2,0xa2,0xa9,0xbf,0x9f,0xa6,0xbb,0x9b,0xa3,0xb9,0x7c,0x82,0x95,0x6f,0x75, 0x87,0x9d,0xa5,0xb9,0x79,0x7c,0x85,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x0b,0x0c,0x0e, 0x0b,0x0c,0x0f,0x0d,0x0e,0x11,0x0e,0x0f,0x12,0x10,0x11,0x14,0x11,0x12,0x16,0x11, 0x12,0x16,0x13,0x14,0x18,0x18,0x1a,0x1e,0x1a,0x1b,0x21,0x24,0x25,0x2b,0x3b,0x3d, 0x42,0x1f,0x21,0x27,0x1e,0x20,0x26,0x1e,0x20,0x26,0x1f,0x20,0x26,0x20,0x22,0x2a, 0x23,0x25,0x2d,0x26,0x29,0x33,0x2d,0x2d,0x3b,0x38,0x35,0x47,0x3f,0x3b,0x4d,0x47, 0x42,0x56,0x55,0x4b,0x5f,0x5b,0x4e,0x64,0x5b,0x4e,0x64,0x5b,0x4d,0x63,0x5b,0x4d, 0x62,0x5a,0x4d,0x62,0x58,0x4d,0x62,0x57,0x4b,0x5f,0x56,0x4b,0x60,0x55,0x4b,0x62, 0x4e,0x49,0x61,0x49,0x4a,0x64,0x4e,0x56,0x6d,0x5c,0x62,0x77,0x67,0x6a,0x7d,0x6c, 0x6e,0x82,0x5c,0x5f,0x75,0x50,0x52,0x6a,0x53,0x51,0x69,0x56,0x52,0x6c,0x59,0x52, 0x6c,0x59,0x53,0x6c,0x5a,0x53,0x6c,0x5a,0x54,0x6c,0x5d,0x56,0x6f,0x5d,0x57,0x6f, 0x5e,0x58,0x70,0x5f,0x57,0x70,0x60,0x58,0x6f,0x5f,0x57,0x6e,0x5c,0x52,0x6a,0x59, 0x50,0x68,0x65,0x5b,0x74,0x62,0x5c,0x7a,0x62,0x59,0x74,0x64,0x59,0x76,0x64,0x5a, 0x75,0x64,0x5a,0x75,0x64,0x5a,0x76,0x65,0x5a,0x76,0x66,0x5c,0x78,0x66,0x5c,0x78, 0x65,0x5c,0x78,0x64,0x5b,0x78,0x64,0x5a,0x77,0x63,0x5a,0x77,0x62,0x59,0x74,0x61, 0x57,0x73,0x5f,0x55,0x70,0x62,0x58,0x74,0x57,0x4e,0x65,0x5a,0x51,0x6a,0x59,0x52, 0x6a,0x57,0x53,0x6b,0x58,0x54,0x6d,0x5a,0x57,0x6f,0x60,0x5d,0x74,0x61,0x60,0x77, 0x5f,0x60,0x78,0x58,0x5c,0x74,0x56,0x5c,0x75,0x5f,0x67,0x7e,0x66,0x6e,0x83,0x67, 0x6e,0x85,0x5f,0x67,0x7f,0x5a,0x62,0x7b,0x56,0x5d,0x76,0x5b,0x63,0x7b,0x6e,0x75, 0x89,0x76,0x7d,0x90,0x74,0x7b,0x8f,0x6a,0x71,0x88,0x5e,0x67,0x80,0x57,0x5f,0x79, 0x52,0x5a,0x75,0x58,0x59,0x70,0x5a,0x5a,0x6c,0x52,0x50,0x62,0x3b,0x3a,0x4b,0x2f, 0x2e,0x3e,0x2c,0x2a,0x36,0x2a,0x26,0x32,0x26,0x22,0x2d,0x26,0x22,0x2d,0x25,0x22, 0x2c,0x24,0x21,0x2a,0x23,0x1f,0x29,0x24,0x1f,0x28,0x24,0x1f,0x29,0x24,0x20,0x2a, 0x23,0x1f,0x28,0x21,0x1e,0x27,0x23,0x21,0x2a,0x23,0x21,0x2a,0x23,0x21,0x2b,0x24, 0x22,0x2c,0x25,0x23,0x2e,0x26,0x24,0x2e,0x26,0x23,0x2e,0x25,0x22,0x2d,0x24,0x21, 0x2c,0x24,0x22,0x2d,0x25,0x23,0x2e,0x26,0x23,0x2e,0x27,0x25,0x31,0x28,0x26,0x32, 0x29,0x27,0x33,0x2a,0x29,0x35,0x2e,0x2d,0x39,0x33,0x32,0x40,0x39,0x39,0x46,0x45, 0x47,0x53,0x53,0x56,0x63,0x5d,0x61,0x6b,0x5d,0x60,0x6c,0x5a,0x5e,0x6a,0x54,0x58, 0x64,0x46,0x49,0x56,0x47,0x4b,0x56,0x4e,0x51,0x5a,0x50,0x53,0x5b,0x56,0x58,0x61, 0x51,0x55,0x5c,0x48,0x4b,0x54,0x47,0x4b,0x55,0x4a,0x4d,0x56,0x4a,0x4e,0x56,0x46, 0x49,0x50,0x46,0x49,0x52,0x46,0x4a,0x53,0x41,0x44,0x4f,0x4e,0x50,0x58,0x69,0x6a, 0x6f,0x72,0x73,0x76,0x73,0x74,0x78,0x6c,0x6e,0x72,0x60,0x62,0x68,0x4e,0x51,0x56, 0x4b,0x4c,0x52,0x46,0x47,0x4c,0x31,0x32,0x35,0x13,0x14,0x16,0x04,0x04,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x03,0x03,0x04,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x02,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,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,0xb0,0xb0,0xb0,0xfd,0xfd,0xfd,0xff,0xff, 0xff,0xf7,0xf7,0xf7,0x87,0x87,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44, 0x44,0x44,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xcf,0xcf,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x28,0x28,0x36,0x36,0x36,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77, 0x77,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7e,0x7d, 0x7f,0x22,0x1a,0x24,0x3a,0x32,0x47,0x4f,0x44,0x62,0x5d,0x50,0x73,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x58,0x4c,0x6d,0x3a,0x32,0x48,0x53,0x51, 0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbd,0xbd,0xbd,0x23,0x1f,0x2e, 0x49,0x40,0x5e,0x62,0x51,0x72,0x5f,0x47,0x64,0x5e,0x52,0x79,0x60,0x6b,0x90,0x1d, 0x1e,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x77,0x77,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x82,0x83,0x83,0x30,0x36,0x47,0x3c,0x43,0x62,0x2e,0x2c,0x44,0x4b,0x4c,0x53,0xe7, 0xe7,0xe7,0xf4,0xf4,0xf4,0x68,0x68,0x6d,0x2e,0x2d,0x45,0x7a,0x83,0x9e,0x8a,0x83, 0x8d,0x3d,0x2e,0x38,0x3d,0x2e,0x39,0x4a,0x39,0x46,0x33,0x28,0x33,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x63,0x7d,0x76,0x61,0x7a,0x78, 0x68,0x83,0x70,0x68,0x89,0x68,0x6a,0x8f,0x68,0x68,0x8d,0x78,0x6c,0x8a,0xe1,0xe3, 0xe9,0xc3,0xc8,0xd7,0xb3,0xba,0xcd,0x8c,0x97,0xb2,0x5f,0x6b,0x91,0x54,0x5f,0x88, 0x52,0x5c,0x84,0x52,0x55,0x7f,0x50,0x51,0x7a,0x3d,0x3d,0x5e,0x49,0x47,0x6d,0x61, 0x5b,0x86,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, 0x44,0x4a,0x5c,0x5c,0x69,0x8f,0x51,0x4f,0x7b,0x56,0x4d,0x71,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x52,0x76,0x5f,0x52,0x76,0x5c,0x4f, 0x72,0x5c,0x50,0x73,0x51,0x50,0x7b,0x5c,0x5b,0x72,0x46,0x36,0x42,0x5e,0x4e,0x62, 0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04, 0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06, 0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x04, 0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x04,0x05,0x06,0x04,0x05, 0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x05,0x05,0x06,0x06,0x06,0x07, 0x58,0x44,0x5d,0x5c,0x45,0x5f,0x5a,0x43,0x5e,0x5a,0x43,0x5d,0x58,0x40,0x5b,0x55, 0x40,0x58,0x2d,0x20,0x31,0x2a,0x1e,0x2e,0x2c,0x21,0x32,0x2d,0x22,0x33,0x2e,0x23, 0x33,0x2c,0x20,0x2f,0x66,0x53,0x6b,0x74,0x60,0x79,0x75,0x63,0x7d,0x6c,0x76,0x97, 0xa1,0xa5,0xa9,0xa0,0xa4,0xb3,0xa1,0xa9,0xbe,0x9c,0xa4,0xbb,0x98,0xa0,0xb6,0x6e, 0x73,0x85,0x88,0x8f,0xa1,0xb3,0xb8,0xc7,0x3b,0x3d,0x41,0x08,0x09,0x0b,0x09,0x0a, 0x0c,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0e,0x0e,0x12,0x0e,0x0f,0x12, 0x0f,0x10,0x13,0x10,0x12,0x15,0x12,0x12,0x16,0x16,0x17,0x1c,0x1f,0x1f,0x25,0x40, 0x41,0x45,0x46,0x48,0x4c,0x38,0x39,0x3f,0x20,0x22,0x28,0x20,0x22,0x28,0x21,0x22, 0x29,0x20,0x22,0x29,0x21,0x22,0x2a,0x21,0x22,0x2a,0x22,0x25,0x2f,0x2a,0x2a,0x36, 0x2f,0x2e,0x3d,0x37,0x35,0x47,0x47,0x41,0x56,0x56,0x4b,0x60,0x5a,0x4d,0x63,0x5b, 0x4f,0x63,0x5b,0x4f,0x63,0x5a,0x4d,0x62,0x57,0x4c,0x62,0x50,0x49,0x5f,0x50,0x48, 0x5e,0x55,0x4a,0x60,0x58,0x4b,0x62,0x58,0x4c,0x62,0x52,0x4b,0x64,0x4a,0x4a,0x66, 0x59,0x5e,0x75,0x6a,0x6e,0x81,0x5f,0x64,0x78,0x52,0x56,0x6c,0x53,0x54,0x6b,0x52, 0x52,0x6b,0x53,0x4e,0x69,0x54,0x4f,0x67,0x59,0x53,0x6a,0x64,0x5f,0x76,0x69,0x63, 0x7b,0x65,0x61,0x77,0x64,0x5e,0x74,0x61,0x59,0x6f,0x5b,0x52,0x69,0x5b,0x51,0x69, 0x5b,0x51,0x68,0x5a,0x51,0x69,0x67,0x5d,0x78,0x62,0x5c,0x79,0x61,0x58,0x75,0x64, 0x5a,0x77,0x65,0x5a,0x77,0x65,0x5b,0x77,0x64,0x5a,0x77,0x63,0x5a,0x76,0x62,0x5a, 0x75,0x62,0x59,0x75,0x62,0x59,0x75,0x60,0x57,0x73,0x60,0x57,0x71,0x5e,0x55,0x70, 0x5e,0x55,0x6f,0x5c,0x53,0x6d,0x5b,0x51,0x6b,0x60,0x57,0x74,0x51,0x4a,0x61,0x52, 0x4a,0x61,0x54,0x4c,0x64,0x54,0x4f,0x66,0x55,0x50,0x67,0x55,0x50,0x67,0x56,0x51, 0x69,0x58,0x55,0x6d,0x57,0x55,0x6c,0x56,0x57,0x6f,0x53,0x56,0x6e,0x50,0x55,0x6f, 0x54,0x5b,0x76,0x56,0x5e,0x77,0x56,0x5e,0x76,0x53,0x5a,0x74,0x50,0x58,0x72,0x5a, 0x62,0x79,0x6b,0x72,0x86,0x6a,0x71,0x86,0x65,0x6c,0x82,0x5e,0x66,0x7e,0x5a,0x62, 0x7a,0x55,0x5b,0x74,0x56,0x57,0x6d,0x56,0x56,0x69,0x52,0x52,0x62,0x44,0x44,0x52, 0x31,0x30,0x3e,0x2a,0x27,0x34,0x29,0x25,0x31,0x27,0x22,0x2d,0x26,0x22,0x2a,0x24, 0x20,0x28,0x24,0x20,0x29,0x25,0x20,0x29,0x24,0x1f,0x29,0x23,0x1f,0x28,0x23,0x1e, 0x27,0x22,0x1d,0x26,0x20,0x1c,0x24,0x1f,0x1c,0x25,0x21,0x1e,0x26,0x22,0x1e,0x27, 0x22,0x1f,0x28,0x22,0x1f,0x28,0x22,0x21,0x29,0x22,0x21,0x2a,0x22,0x1e,0x28,0x22, 0x1e,0x26,0x20,0x1d,0x25,0x20,0x1e,0x26,0x21,0x1f,0x26,0x22,0x1f,0x28,0x22,0x20, 0x2a,0x23,0x21,0x2a,0x24,0x23,0x2c,0x26,0x23,0x2e,0x26,0x26,0x31,0x29,0x28,0x34, 0x30,0x30,0x3b,0x44,0x45,0x51,0x4a,0x4b,0x58,0x51,0x53,0x5e,0x54,0x57,0x62,0x52, 0x56,0x61,0x4b,0x4e,0x5a,0x3e,0x40,0x4c,0x3d,0x40,0x4b,0x52,0x56,0x5f,0x5e,0x62, 0x6b,0x5b,0x5e,0x69,0x4e,0x51,0x5a,0x3f,0x43,0x4e,0x3d,0x40,0x4b,0x3e,0x40,0x4a, 0x3c,0x3f,0x4a,0x36,0x38,0x42,0x30,0x32,0x3b,0x2a,0x2a,0x33,0x29,0x2a,0x31,0x46, 0x47,0x4c,0x65,0x65,0x69,0x68,0x69,0x6e,0x63,0x64,0x68,0x5e,0x5e,0x64,0x52,0x52, 0x58,0x42,0x43,0x4c,0x3e,0x40,0x49,0x3f,0x42,0x4b,0x39,0x3a,0x42,0x2a,0x2a,0x2f, 0x1a,0x1a,0x1e,0x0d,0x0d,0x0e,0x0c,0x0c,0x0d,0x12,0x12,0x12,0x1c,0x1d,0x1e,0x21, 0x21,0x22,0x22,0x22,0x24,0x1e,0x1e,0x1f,0x14,0x15,0x16,0x0a,0x0a,0x0b,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,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,0x9a,0x9a,0x9a,0xfa,0xfa,0xfa,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xba,0xba,0xba,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x7f,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb0,0xb0,0xb0,0xe8,0xe8,0xe8,0xf9,0xf9,0xf9,0xe8,0xe8,0xe8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22, 0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0xcc,0xcc,0x3d, 0x3e,0x41,0x26,0x25,0x39,0x43,0x31,0x45,0x5b,0x4b,0x69,0x5e,0x51,0x75,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x51,0x75,0x4e, 0x43,0x61,0x29,0x24,0x33,0x9d,0x9c,0x9e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x50,0x4f,0x54,0x35,0x2f,0x45,0x54,0x4a,0x6d,0x64,0x4f,0x6e,0x60,0x48,0x65, 0x54,0x50,0x79,0x58,0x62,0x83,0x0d,0x0e,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff, 0xff,0xdd,0xdd,0xdd,0x00,0x00,0x00,0x57,0x59,0x5e,0x42,0x4a,0x62,0x19,0x1d,0x29, 0xd3,0xd3,0xd3,0xf7,0xf7,0xf7,0xcf,0xcf,0xd0,0x1e,0x1e,0x2d,0x40,0x43,0x64,0x8a, 0x94,0xaf,0xa0,0x95,0xa4,0x49,0x38,0x45,0x3e,0x2f,0x3a,0x4f,0x3d,0x4b,0x17,0x13, 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x68,0x89, 0x78,0x67,0x81,0x6e,0x68,0x89,0x68,0x6a,0x8e,0x6a,0x74,0x97,0x69,0x73,0x96,0x6f, 0x68,0x89,0xe2,0xe3,0xea,0xce,0xd1,0xdd,0xbb,0xc0,0xd1,0x98,0xa1,0xba,0x64,0x6f, 0x94,0x55,0x60,0x89,0x52,0x5b,0x84,0x52,0x55,0x80,0x50,0x52,0x7a,0x42,0x41,0x63, 0x48,0x47,0x6d,0x65,0x5f,0x92,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,0x37,0x3b,0x48,0x65,0x71,0x95,0x52,0x53,0x7e,0x54,0x4c,0x70, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5f, 0x52,0x76,0x5b,0x4f,0x72,0x5b,0x51,0x77,0x51,0x50,0x7a,0x5f,0x5e,0x77,0x43,0x33, 0x3f,0x70,0x5c,0x73,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x03, 0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04, 0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x05,0x06, 0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04, 0x04,0x06,0x04,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04, 0x06,0x04,0x04,0x06,0x16,0x13,0x1b,0x5f,0x47,0x62,0x5a,0x43,0x5d,0x5a,0x43,0x5d, 0x59,0x42,0x5c,0x55,0x3f,0x59,0x49,0x36,0x4d,0x2a,0x1d,0x2d,0x2c,0x1f,0x2f,0x2d, 0x21,0x32,0x2e,0x22,0x33,0x2d,0x21,0x32,0x2c,0x1f,0x2f,0x69,0x57,0x71,0x74,0x60, 0x79,0x76,0x65,0x7d,0xba,0xbd,0xc9,0x93,0x96,0x9d,0x9e,0xa5,0xb7,0x9d,0xa5,0xbb, 0x89,0x90,0xa5,0x72,0x78,0x88,0xa8,0xaf,0xc0,0xa5,0xa9,0xb2,0x06,0x07,0x09,0x08, 0x09,0x0b,0x09,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x0b,0x0d, 0x0f,0x0e,0x0e,0x12,0x0e,0x0f,0x12,0x21,0x22,0x24,0x20,0x22,0x25,0x17,0x18,0x1c, 0x2b,0x2b,0x2f,0x33,0x35,0x39,0x1b,0x1c,0x21,0x2e,0x2f,0x35,0x3f,0x40,0x45,0x25, 0x25,0x2c,0x22,0x22,0x2a,0x23,0x24,0x2c,0x23,0x25,0x2c,0x23,0x25,0x2c,0x23,0x25, 0x2d,0x22,0x25,0x2e,0x24,0x26,0x31,0x2a,0x2a,0x37,0x36,0x34,0x45,0x48,0x41,0x55, 0x54,0x49,0x5f,0x58,0x4d,0x62,0x5b,0x4e,0x63,0x59,0x4d,0x62,0x57,0x4c,0x62,0x4e, 0x47,0x5f,0x4a,0x45,0x5b,0x49,0x45,0x5b,0x4a,0x47,0x5e,0x52,0x4a,0x61,0x56,0x4c, 0x63,0x50,0x4b,0x63,0x4a,0x4a,0x64,0x50,0x55,0x6e,0x51,0x56,0x6e,0x56,0x5c,0x71, 0x54,0x57,0x6e,0x53,0x53,0x6b,0x52,0x4f,0x69,0x56,0x51,0x6b,0x62,0x5f,0x77,0x67, 0x64,0x7c,0x6c,0x68,0x7e,0x65,0x5f,0x77,0x66,0x5e,0x76,0x63,0x5a,0x71,0x5c,0x52, 0x69,0x5a,0x50,0x67,0x5b,0x51,0x68,0x5d,0x53,0x6b,0x6a,0x60,0x7a,0x63,0x5b,0x79, 0x62,0x58,0x75,0x64,0x59,0x77,0x65,0x5a,0x76,0x65,0x5a,0x77,0x66,0x5a,0x77,0x65, 0x5a,0x75,0x65,0x59,0x76,0x62,0x58,0x74,0x62,0x58,0x73,0x62,0x57,0x73,0x60,0x57, 0x71,0x60,0x57,0x71,0x62,0x58,0x73,0x5f,0x55,0x70,0x5b,0x51,0x6b,0x61,0x55,0x73, 0x4f,0x48,0x5e,0x4f,0x48,0x5e,0x52,0x4b,0x62,0x52,0x4c,0x62,0x53,0x4c,0x64,0x54, 0x4e,0x65,0x54,0x4e,0x65,0x56,0x4e,0x66,0x55,0x4f,0x67,0x52,0x50,0x69,0x52,0x4f, 0x69,0x51,0x4f,0x6b,0x4e,0x4e,0x6a,0x4d,0x50,0x6c,0x4c,0x52,0x6d,0x4d,0x54,0x6e, 0x51,0x59,0x72,0x5c,0x64,0x7c,0x61,0x68,0x7f,0x61,0x68,0x7e,0x60,0x67,0x7d,0x54, 0x5b,0x72,0x4c,0x52,0x68,0x4e,0x4e,0x60,0x4e,0x4e,0x5e,0x4c,0x4b,0x59,0x42,0x42, 0x50,0x34,0x33,0x42,0x2d,0x2a,0x37,0x2d,0x28,0x35,0x42,0x3f,0x48,0x3d,0x37,0x41, 0x26,0x22,0x2c,0x26,0x22,0x2b,0x26,0x21,0x2a,0x24,0x20,0x29,0x23,0x1f,0x28,0x22, 0x1e,0x27,0x22,0x1e,0x26,0x1f,0x1b,0x23,0x1e,0x1a,0x22,0x1d,0x1a,0x20,0x1d,0x1a, 0x20,0x1c,0x1a,0x20,0x1d,0x1a,0x21,0x1d,0x1a,0x22,0x1e,0x1b,0x22,0x1e,0x1b,0x23, 0x1e,0x1b,0x22,0x1e,0x1a,0x22,0x1d,0x1a,0x21,0x1e,0x1a,0x22,0x1e,0x1b,0x22,0x1e, 0x1b,0x22,0x1e,0x1b,0x22,0x1d,0x1a,0x22,0x1e,0x1a,0x22,0x1e,0x1d,0x23,0x24,0x22, 0x2a,0x2f,0x2f,0x3a,0x32,0x31,0x3c,0x36,0x36,0x41,0x36,0x36,0x41,0x3a,0x3a,0x45, 0x44,0x45,0x50,0x49,0x4b,0x55,0x41,0x42,0x4e,0x30,0x30,0x3b,0x2a,0x2b,0x36,0x42, 0x43,0x4e,0x4a,0x4d,0x56,0x41,0x42,0x4b,0x2a,0x2a,0x35,0x23,0x23,0x2e,0x26,0x26, 0x30,0x26,0x27,0x31,0x25,0x25,0x2e,0x22,0x20,0x29,0x1e,0x1c,0x25,0x1d,0x1a,0x22, 0x22,0x1f,0x27,0x3e,0x3d,0x42,0x57,0x56,0x5a,0x5b,0x5a,0x5e,0x5e,0x5c,0x60,0x57, 0x56,0x5a,0x4d,0x4c,0x52,0x44,0x42,0x4a,0x42,0x41,0x48,0x3e,0x3f,0x48,0x36,0x36, 0x3f,0x2d,0x2e,0x36,0x2a,0x2a,0x32,0x27,0x28,0x2e,0x32,0x33,0x39,0x3a,0x3c,0x40, 0x3e,0x40,0x43,0x37,0x38,0x3b,0x2a,0x2a,0x2c,0x1a,0x1a,0x1b,0x17,0x18,0x19,0x13, 0x13,0x15,0x14,0x15,0x16,0x07,0x07,0x08,0x06,0x06,0x06,0x05,0x04,0x06,0x03,0x03, 0x04,0x02,0x02,0x02,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,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,0x8f,0x8f,0x8f,0xf9,0xf9,0xf9, 0xff,0xff,0xff,0xfc,0xfc,0xfc,0xb9,0xb9,0xb9,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,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 0xf6,0xf6,0xf6,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa3,0xa3,0xa3,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff, 0xff,0xe5,0xe5,0xe5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66, 0x66,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 0x00,0x00,0x00,0x02,0x02,0x02,0x45,0x4d,0x68,0x60,0x4f,0x71,0x5d,0x45,0x60,0x62, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x5a,0x4e,0x70,0x3f,0x36,0x4e,0x36,0x33,0x3a,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xcd,0xcd,0xce,0x21,0x1d,0x2a,0x47,0x3f,0x5c,0x5d,0x51, 0x74,0x64,0x4d,0x6a,0x62,0x4b,0x67,0x52,0x50,0x7c,0x4f,0x57,0x71,0x02,0x02,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x29, 0x2b,0x9f,0x9f,0xa1,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0x61,0x61,0x66,0x2e,0x2e,0x46, 0x4b,0x50,0x77,0x93,0x9d,0xb9,0x9f,0x93,0xa3,0x6d,0x58,0x6e,0x55,0x43,0x53,0x59, 0x47,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x69,0x73,0x96,0x6b,0x67,0x89,0x68,0x67,0x8c,0x68,0x72,0x96,0x6c,0x77,0x99, 0x6c,0x76,0x99,0x69,0x67,0x8a,0xe1,0xe1,0xe6,0xdf,0xe1,0xe9,0xc2,0xc8,0xd6,0xa0, 0xa8,0xc0,0x6a,0x75,0x99,0x56,0x62,0x8a,0x52,0x58,0x83,0x52,0x55,0x80,0x50,0x51, 0x7b,0x44,0x44,0x68,0x46,0x44,0x6a,0x66,0x60,0x96,0x03,0x02,0x03,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,0x28,0x2b,0x34,0x6e,0x7a,0x9c,0x53,0x5e, 0x87,0x51,0x4b,0x71,0x5f,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x5e,0x53,0x79,0x59,0x4f,0x73,0x5c,0x51,0x77,0x51,0x52,0x7b,0x62, 0x63,0x7b,0x42,0x33,0x3e,0x6a,0x56,0x6c,0x02,0x03,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04, 0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x04,0x04, 0x06,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06, 0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x03, 0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x3d,0x2f,0x41,0x5b,0x43, 0x5d,0x59,0x42,0x5b,0x58,0x43,0x5b,0x59,0x44,0x5d,0x56,0x40,0x59,0x35,0x27,0x38, 0x2b,0x1e,0x2f,0x2e,0x20,0x32,0x2f,0x23,0x33,0x2f,0x23,0x33,0x2e,0x21,0x32,0x2e, 0x21,0x31,0x67,0x56,0x6f,0x74,0x61,0x7a,0x7d,0x6d,0x85,0xc0,0xc0,0xc9,0x87,0x8b, 0x96,0x92,0x97,0xa9,0x75,0x7b,0x8d,0x8a,0x92,0xa5,0xc1,0xc5,0xd4,0x45,0x46,0x49, 0x06,0x07,0x09,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09,0x0b,0x0a,0x0a,0x0c,0x0a, 0x0a,0x0d,0x0b,0x0c,0x0e,0x0c,0x0d,0x10,0x0d,0x0e,0x11,0x21,0x22,0x24,0x29,0x2b, 0x2d,0x33,0x34,0x37,0x3a,0x3b,0x3e,0x2d,0x2f,0x32,0x15,0x16,0x1a,0x18,0x1a,0x1e, 0x27,0x27,0x2c,0x3a,0x3a,0x40,0x23,0x24,0x2b,0x22,0x23,0x2a,0x24,0x25,0x2c,0x25, 0x26,0x2e,0x26,0x27,0x2f,0x27,0x28,0x30,0x26,0x28,0x31,0x26,0x27,0x32,0x29,0x2a, 0x37,0x32,0x33,0x42,0x3f,0x3b,0x4f,0x4e,0x45,0x58,0x54,0x49,0x5e,0x54,0x49,0x5f, 0x51,0x47,0x5d,0x4c,0x45,0x5b,0x48,0x42,0x58,0x47,0x47,0x5b,0x4f,0x50,0x61,0x4a, 0x4a,0x60,0x4c,0x48,0x5f,0x4d,0x49,0x61,0x4d,0x48,0x60,0x49,0x49,0x62,0x53,0x56, 0x6b,0x5c,0x60,0x71,0x5a,0x5e,0x6f,0x52,0x53,0x6a,0x50,0x50,0x69,0x54,0x50,0x6a, 0x61,0x5d,0x75,0x63,0x5f,0x77,0x64,0x60,0x79,0x5c,0x56,0x6e,0x5d,0x55,0x6c,0x5f, 0x55,0x6c,0x5f,0x54,0x6c,0x5e,0x53,0x6c,0x5e,0x53,0x6b,0x5f,0x54,0x6e,0x6c,0x63, 0x7d,0x62,0x5c,0x79,0x62,0x59,0x75,0x64,0x59,0x77,0x64,0x59,0x76,0x63,0x59,0x75, 0x62,0x59,0x75,0x62,0x58,0x75,0x62,0x58,0x74,0x62,0x58,0x73,0x61,0x57,0x73,0x61, 0x57,0x72,0x61,0x57,0x72,0x61,0x57,0x72,0x60,0x57,0x72,0x5f,0x55,0x70,0x5d,0x54, 0x6e,0x62,0x57,0x74,0x52,0x4a,0x60,0x53,0x4b,0x62,0x52,0x4a,0x62,0x51,0x4a,0x62, 0x50,0x4a,0x60,0x51,0x4a,0x60,0x54,0x4b,0x64,0x57,0x4f,0x67,0x56,0x4e,0x67,0x52, 0x4d,0x66,0x51,0x4d,0x67,0x50,0x4e,0x69,0x4d,0x4c,0x68,0x4c,0x4e,0x69,0x4c,0x4f, 0x6a,0x51,0x5a,0x73,0x5f,0x66,0x7e,0x66,0x6e,0x83,0x6a,0x72,0x86,0x68,0x6e,0x82, 0x5a,0x61,0x75,0x44,0x4a,0x5f,0x3a,0x3d,0x4f,0x43,0x43,0x53,0x48,0x48,0x56,0x49, 0x49,0x56,0x37,0x37,0x45,0x2f,0x2b,0x39,0x2e,0x2a,0x37,0x42,0x3e,0x49,0x8c,0x89, 0x90,0x4f,0x49,0x55,0x2f,0x2a,0x37,0x2b,0x26,0x32,0x26,0x22,0x2a,0x24,0x20,0x2a, 0x23,0x1f,0x27,0x22,0x1d,0x26,0x1e,0x1a,0x22,0x1d,0x19,0x20,0x1b,0x18,0x1f,0x1a, 0x17,0x1d,0x19,0x16,0x1c,0x18,0x17,0x1c,0x19,0x16,0x1c,0x19,0x17,0x1c,0x19,0x16, 0x1c,0x1a,0x17,0x1e,0x1a,0x18,0x1d,0x1a,0x18,0x1e,0x1a,0x18,0x1e,0x1a,0x18,0x1e, 0x1b,0x18,0x1e,0x1a,0x19,0x1e,0x1b,0x18,0x1e,0x1a,0x18,0x1e,0x1a,0x18,0x1e,0x1b, 0x18,0x1e,0x1e,0x1c,0x24,0x29,0x28,0x2f,0x2e,0x2c,0x35,0x32,0x30,0x3a,0x30,0x2f, 0x39,0x2c,0x2a,0x34,0x30,0x2f,0x3a,0x3a,0x3b,0x44,0x33,0x32,0x3d,0x27,0x26,0x30, 0x22,0x1f,0x2a,0x28,0x28,0x32,0x2b,0x2b,0x35,0x26,0x24,0x2e,0x20,0x20,0x29,0x22, 0x21,0x2a,0x20,0x1e,0x27,0x1c,0x1a,0x23,0x1c,0x1a,0x22,0x1c,0x1a,0x21,0x1b,0x19, 0x20,0x1b,0x1a,0x20,0x26,0x24,0x2b,0x44,0x43,0x47,0x57,0x56,0x5a,0x56,0x54,0x58, 0x4e,0x4e,0x51,0x48,0x46,0x4b,0x4b,0x4a,0x4e,0x52,0x52,0x56,0x49,0x47,0x4d,0x41, 0x3f,0x46,0x2d,0x2d,0x33,0x22,0x21,0x28,0x20,0x1f,0x26,0x21,0x21,0x29,0x26,0x26, 0x2e,0x26,0x27,0x2e,0x21,0x22,0x27,0x1b,0x1b,0x1f,0x18,0x18,0x1b,0x12,0x12,0x14, 0x18,0x19,0x1c,0x1a,0x1a,0x1e,0x1b,0x1c,0x1f,0x0e,0x0e,0x10,0x0c,0x0b,0x0e,0x0c, 0x0b,0x0e,0x0b,0x0a,0x0c,0x09,0x08,0x0a,0x06,0x06,0x07,0x04,0x04,0x05,0x02,0x02, 0x02,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,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,0x8e,0x8e,0x8e,0xf7,0xf7, 0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xc2,0xc2,0xc2,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,0x65,0x65,0x65,0xfd,0xfd,0xfd,0xff,0xff, 0xff,0xff,0xff,0xff,0xd6,0xd6,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0xf2,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x11,0x11,0x11,0xaa, 0xaa,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0x44,0x44, 0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x23,0x2a,0x54,0x5f,0x89, 0x5f,0x47,0x63,0x62,0x4b,0x66,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x52,0x76,0x50,0x45,0x63,0x2c,0x26,0x37, 0x7d,0x7c,0x7e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0x6e,0x72,0x32, 0x2c,0x41,0x51,0x48,0x6b,0x5e,0x53,0x79,0x64,0x52,0x72,0x64,0x4d,0x6b,0x52,0x5a, 0x84,0x3e,0x45,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0xcc,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x42,0x42,0x42,0xf5,0xf5,0xf5,0xfd,0xfd,0xfd,0xdb,0xdb,0xdb,0x1b,0x1c, 0x2a,0x3e,0x3f,0x60,0x50,0x53,0x7c,0x94,0x9f,0xba,0xa0,0x95,0xa3,0x6e,0x59,0x6f, 0x74,0x5f,0x77,0x60,0x5e,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x73,0x7d,0x9f,0x68,0x67,0x8c,0x68,0x72,0x95,0x6d,0x78, 0x9a,0x6c,0x77,0x99,0x6f,0x7a,0x9c,0x69,0x66,0x8a,0xce,0xcb,0xd1,0xf4,0xf5,0xf7, 0xd5,0xd9,0xe2,0xae,0xb4,0xc9,0x7b,0x85,0xa7,0x5b,0x66,0x8e,0x53,0x5e,0x89,0x52, 0x5d,0x86,0x50,0x53,0x7d,0x47,0x47,0x6c,0x45,0x43,0x67,0x5e,0x5a,0x8d,0x1b,0x16, 0x1e,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,0x17,0x19,0x1d,0x77, 0x82,0xa3,0x56,0x62,0x8a,0x4e,0x4a,0x73,0x5e,0x52,0x75,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x59,0x4f,0x75,0x5a,0x51,0x78, 0x51,0x4f,0x7b,0x62,0x65,0x7e,0x40,0x31,0x3c,0x68,0x54,0x69,0x04,0x05,0x06,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04, 0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x03,0x03, 0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x0a, 0x09,0x0e,0x58,0x42,0x5c,0x5a,0x44,0x5d,0x5a,0x44,0x5d,0x59,0x44,0x5d,0x59,0x43, 0x5c,0x56,0x40,0x59,0x30,0x23,0x34,0x2b,0x20,0x2f,0x2d,0x21,0x32,0x2e,0x23,0x33, 0x2d,0x21,0x33,0x2d,0x20,0x31,0x2e,0x23,0x33,0x67,0x54,0x6b,0x74,0x60,0x79,0x7e, 0x70,0x88,0xcd,0xcf,0xd4,0x88,0x8d,0x98,0x78,0x7f,0x91,0xa9,0xb0,0xc3,0x89,0x8b, 0x90,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x0a,0x07,0x08,0x0a, 0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0b,0x0c,0x0e,0x0c, 0x0d,0x10,0x0c,0x0d,0x10,0x0e,0x0e,0x12,0x10,0x11,0x14,0x10,0x12,0x14,0x10,0x11, 0x14,0x12,0x13,0x17,0x16,0x16,0x1b,0x33,0x34,0x39,0x2b,0x2c,0x32,0x20,0x22,0x28, 0x22,0x23,0x2a,0x22,0x23,0x2a,0x25,0x26,0x2e,0x26,0x28,0x30,0x29,0x2a,0x32,0x28, 0x2a,0x32,0x29,0x2a,0x33,0x2a,0x2d,0x36,0x2e,0x31,0x3e,0x35,0x35,0x45,0x40,0x3b, 0x4e,0x43,0x3e,0x52,0x43,0x3e,0x53,0x42,0x3d,0x52,0x40,0x3f,0x52,0x4a,0x4a,0x5b, 0x59,0x58,0x66,0x58,0x58,0x65,0x53,0x54,0x65,0x4f,0x4f,0x63,0x51,0x4f,0x64,0x55, 0x53,0x67,0x58,0x56,0x67,0x59,0x57,0x69,0x5d,0x5c,0x6e,0x59,0x59,0x6c,0x50,0x4f, 0x66,0x52,0x4f,0x67,0x56,0x51,0x69,0x58,0x52,0x6b,0x58,0x52,0x6b,0x57,0x51,0x6a, 0x57,0x52,0x6b,0x59,0x51,0x6a,0x5b,0x51,0x68,0x5a,0x50,0x68,0x58,0x4f,0x66,0x5a, 0x51,0x6a,0x66,0x60,0x7a,0x5d,0x57,0x74,0x5c,0x56,0x72,0x5f,0x58,0x75,0x5f,0x57, 0x75,0x5e,0x57,0x75,0x5e,0x57,0x75,0x5f,0x57,0x76,0x5f,0x58,0x76,0x5f,0x59,0x76, 0x60,0x59,0x77,0x61,0x59,0x78,0x62,0x5a,0x78,0x63,0x5b,0x79,0x64,0x5c,0x7b,0x64, 0x5b,0x79,0x62,0x5a,0x78,0x66,0x5e,0x7e,0x57,0x51,0x6a,0x57,0x51,0x6b,0x57,0x50, 0x6b,0x55,0x50,0x6a,0x57,0x52,0x6a,0x58,0x51,0x6a,0x59,0x52,0x6b,0x59,0x52,0x6c, 0x54,0x4f,0x69,0x52,0x4e,0x68,0x51,0x4f,0x69,0x4e,0x4d,0x69,0x4c,0x4c,0x67,0x4b, 0x4e,0x68,0x51,0x5a,0x73,0x60,0x67,0x7f,0x69,0x70,0x86,0x6d,0x75,0x88,0x6e,0x73, 0x85,0x62,0x68,0x76,0x52,0x57,0x68,0x42,0x49,0x5b,0x36,0x37,0x4a,0x42,0x41,0x52, 0x57,0x55,0x64,0x57,0x54,0x63,0x76,0x72,0x7e,0x53,0x4e,0x5b,0x4c,0x47,0x54,0x4e, 0x49,0x55,0x3d,0x37,0x46,0x61,0x5c,0x67,0x65,0x62,0x6b,0x3b,0x37,0x42,0x3c,0x37, 0x41,0x2a,0x26,0x2f,0x1f,0x1c,0x24,0x1a,0x16,0x1d,0x17,0x15,0x1a,0x16,0x13,0x18, 0x14,0x12,0x16,0x15,0x12,0x17,0x16,0x13,0x18,0x15,0x13,0x17,0x15,0x13,0x17,0x16, 0x13,0x18,0x16,0x14,0x18,0x15,0x13,0x18,0x16,0x14,0x19,0x16,0x15,0x1a,0x16,0x16, 0x1a,0x16,0x15,0x1a,0x16,0x15,0x1a,0x16,0x15,0x1a,0x17,0x16,0x1a,0x17,0x16,0x1b, 0x17,0x16,0x1b,0x18,0x16,0x1c,0x1a,0x18,0x1e,0x1c,0x1a,0x20,0x1f,0x1d,0x24,0x22, 0x20,0x28,0x25,0x22,0x2b,0x22,0x1f,0x28,0x21,0x1e,0x28,0x25,0x23,0x2d,0x22,0x1f, 0x28,0x1e,0x1c,0x24,0x1e,0x1b,0x24,0x1f,0x1d,0x26,0x20,0x1e,0x28,0x1e,0x1d,0x26, 0x1f,0x1e,0x27,0x23,0x21,0x2a,0x20,0x1e,0x26,0x1a,0x18,0x1f,0x19,0x17,0x1e,0x1a, 0x17,0x1e,0x19,0x17,0x1e,0x1a,0x19,0x1e,0x31,0x2e,0x33,0x3a,0x39,0x3e,0x3d,0x3b, 0x3f,0x3c,0x3c,0x3e,0x3b,0x39,0x3e,0x3e,0x3d,0x41,0x38,0x37,0x3b,0x3b,0x3a,0x3f, 0x35,0x35,0x38,0x2c,0x2b,0x30,0x22,0x20,0x26,0x1b,0x1a,0x20,0x1a,0x19,0x1f,0x1a, 0x19,0x1f,0x1a,0x1a,0x20,0x1a,0x18,0x1f,0x17,0x16,0x1c,0x13,0x13,0x18,0x10,0x0f, 0x14,0x11,0x10,0x14,0x13,0x13,0x17,0x13,0x12,0x17,0x10,0x0f,0x12,0x0e,0x0d,0x10, 0x0e,0x0d,0x10,0x0e,0x0e,0x11,0x0f,0x0e,0x11,0x10,0x0f,0x12,0x0f,0x0e,0x12,0x0c, 0x0b,0x0e,0x08,0x08,0x0a,0x06,0x05,0x06,0x03,0x02,0x03,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,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,0x79,0x79,0x79,0xf7, 0xf7,0xf7,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xce,0xce,0xce,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,0xc9,0xc9,0xc9,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x62,0x62,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xfa,0xfa,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x44,0x44,0x44, 0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0x11, 0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x48,0x4f,0x63,0x52,0x4f,0x7a,0x5c,0x44,0x5f,0x64,0x52,0x72,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5b,0x4f, 0x71,0x42,0x39,0x52,0x28,0x26,0x2e,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff, 0xde,0xde,0xde,0x1d,0x1a,0x26,0x43,0x3b,0x57,0x58,0x4f,0x74,0x5b,0x52,0x79,0x64, 0x4c,0x69,0x64,0x50,0x71,0x53,0x5e,0x87,0x22,0x25,0x2e,0x00,0x00,0x00,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0xd8,0xfd,0xfd,0xfd,0xfa,0xfa,0xfa,0x7e, 0x7f,0x80,0x33,0x39,0x4e,0x49,0x47,0x6e,0x54,0x5f,0x88,0x91,0x9a,0xb6,0xa2,0x97, 0xa4,0x71,0x5c,0x73,0x6d,0x67,0x89,0x4c,0x51,0x5f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x80,0xa2,0x68,0x72,0x96,0x6a, 0x74,0x97,0x70,0x7b,0x9d,0x7b,0x85,0xa5,0x68,0x6b,0x8f,0x5a,0x47,0x58,0x45,0x3d, 0x41,0xf2,0xf2,0xf3,0xf9,0xf9,0xfa,0xd6,0xd9,0xe3,0x9a,0xa2,0xbb,0x6e,0x7a,0x9d, 0x5e,0x6a,0x91,0x56,0x63,0x8b,0x50,0x5b,0x85,0x4a,0x4e,0x76,0x42,0x44,0x68,0x57, 0x54,0x82,0x35,0x2c,0x3e,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, 0x07,0x07,0x0a,0x7f,0x89,0xa9,0x5c,0x69,0x8f,0x4d,0x4a,0x73,0x5a,0x51,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x5c,0x52,0x79,0x5a,0x52, 0x79,0x55,0x4f,0x78,0x51,0x51,0x7c,0x64,0x69,0x83,0x3f,0x30,0x3b,0x5f,0x4c,0x5f, 0x09,0x08,0x0b,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02, 0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04, 0x03,0x03,0x04,0x03,0x03,0x04,0x2d,0x27,0x36,0x5a,0x44,0x5d,0x5a,0x44,0x5d,0x5a, 0x44,0x5d,0x59,0x41,0x5b,0x5a,0x43,0x5c,0x57,0x40,0x5b,0x2e,0x22,0x32,0x2c,0x20, 0x30,0x2d,0x21,0x32,0x2d,0x21,0x32,0x2d,0x20,0x31,0x2c,0x20,0x30,0x31,0x26,0x37, 0x5f,0x4e,0x63,0x71,0x5d,0x75,0x7f,0x76,0x8a,0xc7,0xcb,0xd5,0xa8,0xad,0xbd,0x86, 0x89,0x92,0x09,0x09,0x0b,0x05,0x06,0x07,0x05,0x06,0x07,0x06,0x06,0x07,0x06,0x06, 0x08,0x06,0x07,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0c,0x0a,0x0a,0x0d, 0x0a,0x0a,0x0d,0x0b,0x0c,0x0e,0x39,0x3a,0x3c,0x10,0x11,0x13,0x0d,0x0e,0x10,0x0e, 0x0e,0x12,0x0e,0x0e,0x12,0x0f,0x11,0x14,0x10,0x12,0x15,0x1f,0x20,0x23,0x32,0x32, 0x36,0x19,0x1a,0x1f,0x1e,0x1e,0x25,0x22,0x22,0x2a,0x25,0x26,0x2e,0x27,0x28,0x30, 0x29,0x2a,0x32,0x2a,0x2b,0x34,0x2c,0x2d,0x36,0x2a,0x2b,0x33,0x2a,0x2c,0x34,0x2b, 0x2e,0x37,0x2e,0x31,0x3e,0x34,0x35,0x45,0x3a,0x39,0x4a,0x3c,0x3a,0x4b,0x3d,0x3d, 0x4e,0x49,0x49,0x59,0x59,0x59,0x67,0x60,0x60,0x6b,0x62,0x60,0x6d,0x60,0x5e,0x6d, 0x60,0x5c,0x6c,0x5f,0x5c,0x6c,0x5a,0x57,0x67,0x56,0x53,0x65,0x59,0x55,0x67,0x5b, 0x57,0x69,0x58,0x54,0x67,0x52,0x4d,0x61,0x53,0x4e,0x65,0x53,0x4c,0x63,0x53,0x4b, 0x62,0x4e,0x49,0x60,0x4c,0x48,0x60,0x4e,0x48,0x60,0x52,0x4a,0x61,0x55,0x4d,0x64, 0x56,0x4e,0x66,0x5e,0x54,0x6e,0x69,0x62,0x7e,0x60,0x59,0x77,0x61,0x5a,0x78,0x63, 0x5c,0x7e,0x64,0x5f,0x80,0x62,0x5e,0x7f,0x61,0x5d,0x80,0x60,0x5c,0x7f,0x60,0x5d, 0x80,0x60,0x5d,0x80,0x62,0x5e,0x81,0x62,0x5e,0x80,0x63,0x5f,0x81,0x64,0x5f,0x80, 0x65,0x5e,0x7f,0x63,0x5d,0x7d,0x61,0x5b,0x7c,0x65,0x5e,0x82,0x52,0x4f,0x6b,0x52, 0x4f,0x6b,0x51,0x4e,0x6b,0x51,0x4f,0x6a,0x51,0x4f,0x6b,0x53,0x50,0x6c,0x53,0x50, 0x6b,0x53,0x50,0x6b,0x52,0x4e,0x69,0x50,0x4e,0x68,0x4d,0x4b,0x67,0x4b,0x4a,0x64, 0x4a,0x4a,0x65,0x4c,0x50,0x6b,0x51,0x59,0x72,0x5d,0x64,0x7c,0x67,0x6f,0x83,0x6a, 0x71,0x82,0x67,0x6c,0x79,0x60,0x64,0x71,0x5a,0x5e,0x6e,0x4a,0x4f,0x61,0x47,0x47, 0x58,0x58,0x55,0x65,0x50,0x4a,0x5c,0x4a,0x43,0x54,0x71,0x6b,0x77,0x7e,0x7a,0x84, 0x59,0x54,0x61,0x3d,0x38,0x44,0x31,0x2b,0x39,0x30,0x2c,0x37,0x46,0x41,0x4d,0x5f, 0x5d,0x65,0x40,0x3d,0x45,0x4f,0x4c,0x51,0x52,0x50,0x53,0x41,0x3f,0x41,0x23,0x22, 0x25,0x0b,0x0a,0x0c,0x0a,0x08,0x0a,0x0a,0x0a,0x0c,0x0e,0x0c,0x0f,0x0f,0x0e,0x11, 0x10,0x0f,0x12,0x11,0x0f,0x13,0x12,0x10,0x14,0x12,0x12,0x16,0x14,0x13,0x17,0x14, 0x13,0x17,0x14,0x13,0x17,0x14,0x12,0x16,0x13,0x12,0x16,0x13,0x12,0x16,0x13,0x12, 0x16,0x14,0x13,0x17,0x15,0x14,0x19,0x16,0x14,0x18,0x16,0x15,0x19,0x16,0x15,0x1a, 0x18,0x15,0x1b,0x18,0x16,0x1b,0x18,0x16,0x1d,0x19,0x17,0x1d,0x1a,0x17,0x1e,0x1a, 0x18,0x1f,0x1a,0x17,0x1e,0x1a,0x18,0x1f,0x1a,0x18,0x1e,0x1c,0x19,0x1f,0x1b,0x19, 0x20,0x1a,0x18,0x1f,0x19,0x16,0x1d,0x17,0x16,0x1c,0x16,0x14,0x1a,0x13,0x12,0x18, 0x12,0x12,0x16,0x13,0x12,0x17,0x14,0x12,0x17,0x16,0x15,0x1a,0x21,0x1f,0x22,0x21, 0x1e,0x22,0x27,0x26,0x29,0x2f,0x2e,0x32,0x2b,0x2a,0x2e,0x26,0x25,0x28,0x1e,0x1e, 0x22,0x1b,0x1a,0x1e,0x1b,0x19,0x1e,0x1a,0x1a,0x1e,0x18,0x16,0x1c,0x17,0x15,0x1a, 0x17,0x16,0x1b,0x17,0x16,0x1c,0x17,0x16,0x1c,0x17,0x15,0x1a,0x15,0x13,0x19,0x12, 0x11,0x16,0x0f,0x0e,0x12,0x0e,0x0d,0x10,0x0e,0x0e,0x11,0x0f,0x0e,0x11,0x0f,0x0e, 0x11,0x0e,0x0d,0x0f,0x0c,0x0b,0x0e,0x0e,0x0d,0x0f,0x0f,0x0e,0x12,0x12,0x10,0x14, 0x12,0x11,0x14,0x10,0x0f,0x12,0x0b,0x0b,0x0d,0x08,0x08,0x0a,0x06,0x05,0x06,0x02, 0x02,0x02,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,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,0x7b,0x7b,0x7b, 0xf7,0xf7,0xf7,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xd0,0xd0,0xd0,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, 0xf6,0xf6,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8,0xf8,0x02,0x02,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc, 0xcc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd, 0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0x55,0x55, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x0e,0x59,0x63,0x86,0x64,0x52,0x73,0x5f,0x47, 0x63,0x62,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x53,0x48,0x67,0x30,0x29,0x3b,0x6e,0x6d,0x70,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7e,0x7d,0x80,0x2e,0x28,0x3b,0x4f,0x46,0x68, 0x5b,0x52,0x79,0x5a,0x52,0x79,0x62,0x4a,0x66,0x5c,0x4d,0x6e,0x35,0x3c,0x55,0x26, 0x27,0x28,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x78,0x78,0xfa,0xfa,0xfa,0xfd,0xfd,0xfd, 0xd6,0xd6,0xd6,0x00,0x00,0x00,0x7d,0x80,0x8a,0x69,0x73,0x96,0x55,0x60,0x89,0x8d, 0x98,0xb3,0xa3,0x97,0xa5,0x78,0x67,0x81,0x66,0x6f,0x89,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x9f,0xb9, 0x6b,0x76,0x99,0x74,0x7f,0xa0,0x7a,0x84,0xa4,0x70,0x68,0x89,0x42,0x32,0x3e,0x22, 0x18,0x1c,0x1a,0x12,0x15,0x94,0x91,0x92,0xf7,0xf7,0xf9,0xc2,0xc7,0xd7,0x96,0xa0, 0xb9,0x79,0x84,0xa5,0x64,0x71,0x96,0x5b,0x67,0x90,0x54,0x60,0x89,0x4b,0x55,0x7b, 0x41,0x42,0x62,0x4f,0x4f,0x77,0x4f,0x46,0x64,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,0x79,0x82,0x9e,0x62,0x6d,0x93,0x4e,0x4e,0x75, 0x5a,0x50,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5a, 0x52,0x79,0x55,0x50,0x79,0x53,0x4f,0x7a,0x51,0x53,0x7f,0x6b,0x6f,0x8c,0x3f,0x30, 0x3a,0x5c,0x49,0x5b,0x18,0x16,0x1d,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02, 0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03, 0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x04,0x05,0x48,0x37,0x4d, 0x5a,0x44,0x5d,0x5a,0x43,0x5c,0x57,0x40,0x5b,0x59,0x41,0x5b,0x59,0x42,0x5c,0x58, 0x40,0x5b,0x2f,0x20,0x33,0x2c,0x1f,0x30,0x2d,0x20,0x32,0x2d,0x21,0x32,0x2d,0x20, 0x30,0x2d,0x21,0x32,0x34,0x2a,0x39,0x43,0x37,0x47,0x19,0x15,0x1a,0x30,0x32,0x3b, 0x31,0x34,0x3a,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x06,0x07,0x05, 0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x08,0x0a,0x07,0x08, 0x0a,0x09,0x09,0x0b,0x19,0x19,0x1b,0x19,0x19,0x1b,0x1e,0x1f,0x22,0x24,0x25,0x27, 0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0d,0x0e,0x11,0x0e,0x0e,0x12,0x0f,0x10,0x13,0x13, 0x14,0x18,0x2e,0x2f,0x32,0x2c,0x2e,0x31,0x1b,0x1c,0x20,0x1b,0x1c,0x22,0x22,0x22, 0x2a,0x24,0x26,0x2d,0x26,0x28,0x30,0x2a,0x2c,0x34,0x33,0x34,0x3c,0x2c,0x2d,0x34, 0x2a,0x2b,0x32,0x29,0x2a,0x31,0x2a,0x2d,0x34,0x2c,0x2f,0x38,0x2f,0x31,0x3e,0x36, 0x36,0x46,0x3a,0x38,0x4b,0x41,0x41,0x53,0x51,0x51,0x61,0x5e,0x5d,0x6b,0x67,0x66, 0x73,0x69,0x65,0x74,0x6a,0x65,0x75,0x67,0x62,0x72,0x61,0x5c,0x6b,0x5a,0x55,0x65, 0x58,0x53,0x62,0x57,0x52,0x62,0x58,0x51,0x63,0x55,0x4e,0x5f,0x52,0x4b,0x5e,0x50, 0x49,0x5d,0x50,0x49,0x5d,0x4d,0x48,0x5c,0x47,0x44,0x58,0x45,0x42,0x56,0x4a,0x44, 0x5a,0x4f,0x48,0x5f,0x4f,0x49,0x5f,0x61,0x56,0x6f,0x6c,0x64,0x81,0x64,0x59,0x77, 0x66,0x59,0x76,0x68,0x5c,0x79,0x69,0x5c,0x7b,0x66,0x5c,0x7c,0x62,0x5b,0x7c,0x5f, 0x5b,0x7c,0x5f,0x5b,0x7d,0x5f,0x5b,0x7d,0x60,0x5b,0x7d,0x62,0x5c,0x7d,0x63,0x5c, 0x7c,0x63,0x5d,0x7c,0x63,0x5d,0x7c,0x60,0x59,0x7a,0x5f,0x58,0x77,0x63,0x5d,0x7e, 0x50,0x4e,0x68,0x4f,0x4e,0x6a,0x4d,0x4d,0x68,0x4d,0x4d,0x68,0x4e,0x4d,0x68,0x4e, 0x4d,0x69,0x4d,0x4c,0x67,0x4d,0x4b,0x66,0x4d,0x4a,0x65,0x4c,0x4a,0x64,0x4a,0x49, 0x63,0x47,0x46,0x61,0x48,0x4a,0x64,0x4a,0x52,0x6b,0x4f,0x56,0x6e,0x59,0x60,0x75, 0x64,0x6a,0x7b,0x66,0x6b,0x7a,0x66,0x6b,0x79,0x6a,0x6e,0x7a,0x4e,0x52,0x63,0x47, 0x46,0x58,0x6c,0x6a,0x77,0x7d,0x7a,0x85,0x44,0x3d,0x4e,0x40,0x39,0x4a,0x3d,0x36, 0x45,0x35,0x2f,0x3e,0x36,0x32,0x3f,0x2d,0x2a,0x37,0x28,0x25,0x30,0x23,0x20,0x2a, 0x1b,0x19,0x20,0x2d,0x2b,0x2f,0x12,0x10,0x13,0x22,0x20,0x22,0x3b,0x3a,0x3b,0x47, 0x47,0x47,0x3d,0x3c,0x3d,0x1b,0x1a,0x1b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x05,0x05, 0x06,0x08,0x08,0x0a,0x0a,0x0a,0x0d,0x0c,0x0b,0x0e,0x0e,0x0d,0x10,0x10,0x0f,0x12, 0x12,0x11,0x15,0x12,0x12,0x16,0x13,0x12,0x16,0x12,0x12,0x16,0x12,0x11,0x15,0x12, 0x11,0x14,0x12,0x11,0x14,0x12,0x11,0x14,0x13,0x12,0x16,0x13,0x12,0x16,0x13,0x12, 0x16,0x14,0x12,0x17,0x14,0x12,0x17,0x14,0x12,0x17,0x14,0x12,0x17,0x15,0x13,0x18, 0x15,0x12,0x18,0x15,0x12,0x17,0x14,0x12,0x17,0x14,0x12,0x18,0x15,0x12,0x17,0x15, 0x13,0x18,0x15,0x12,0x18,0x15,0x12,0x18,0x14,0x12,0x17,0x12,0x10,0x15,0x11,0x0f, 0x13,0x0f,0x0e,0x12,0x0e,0x0c,0x10,0x0e,0x0d,0x10,0x10,0x0e,0x12,0x15,0x13,0x16, 0x22,0x20,0x24,0x19,0x16,0x1a,0x16,0x15,0x19,0x1c,0x1a,0x1e,0x16,0x15,0x19,0x13, 0x12,0x16,0x12,0x12,0x16,0x14,0x12,0x16,0x15,0x12,0x17,0x15,0x12,0x17,0x15,0x13, 0x18,0x15,0x13,0x17,0x15,0x13,0x17,0x14,0x12,0x17,0x13,0x12,0x16,0x12,0x11,0x15, 0x12,0x10,0x15,0x11,0x0f,0x13,0x10,0x0e,0x12,0x0e,0x0d,0x10,0x0c,0x0b,0x0e,0x0a, 0x0a,0x0c,0x0b,0x0a,0x0d,0x0a,0x0a,0x0c,0x08,0x07,0x09,0x08,0x08,0x0a,0x0b,0x0a, 0x0d,0x0e,0x0e,0x11,0x10,0x0e,0x12,0x0e,0x0e,0x11,0x0b,0x0a,0x0c,0x06,0x06,0x06, 0x02,0x02,0x03,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,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,0x7f,0x7f, 0x7f,0xf6,0xf6,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xdb,0xdb,0x08,0x08,0x08, 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,0x76,0x76,0x76,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd3,0xd3,0xd3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32, 0x32,0x32,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xf7,0xf7,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0x22,0x22, 0x22,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,0x33,0x35,0x3d,0x52, 0x5c,0x86,0x5f,0x47,0x63,0x63,0x4b,0x67,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5d,0x50,0x73,0x47,0x3d,0x58,0x1e, 0x1a,0x26,0xde,0xde,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0x28,0x26, 0x30,0x40,0x39,0x54,0x58,0x4f,0x74,0x5b,0x52,0x79,0x5e,0x51,0x75,0x4c,0x39,0x50, 0x25,0x21,0x31,0xac,0xad,0xae,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22, 0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0xe8,0xfd,0xfd, 0xfd,0xf7,0xf7,0xf7,0x5d,0x5d,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0xab,0xb7, 0x82,0x8c,0xab,0xa0,0xa8,0xc0,0x9f,0x93,0xa1,0x60,0x62,0x85,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb6,0xbc,0xce,0x90,0x99,0xb5,0x74,0x7f,0xa0,0x65,0x51,0x65,0x2e,0x22,0x29, 0x23,0x19,0x1d,0x1e,0x15,0x18,0x17,0x0f,0x12,0x1f,0x19,0x1a,0xfa,0xfb,0xfb,0xc7, 0xcc,0xda,0x9b,0xa4,0xbc,0x82,0x8d,0xab,0x6e,0x7a,0x9d,0x63,0x6f,0x95,0x59,0x65, 0x8d,0x4f,0x5a,0x82,0x42,0x48,0x6a,0x42,0x43,0x68,0x58,0x4e,0x72,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,0x6c,0x74,0x89,0x6b,0x76, 0x9a,0x4e,0x56,0x7e,0x55,0x4e,0x76,0x60,0x53,0x77,0x5e,0x53,0x79,0x5e,0x53,0x79, 0x5a,0x52,0x79,0x56,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x51,0x55,0x80,0x6d, 0x74,0x90,0x3d,0x2e,0x38,0x59,0x47,0x58,0x36,0x2f,0x3d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03, 0x04,0x13,0x11,0x19,0x59,0x42,0x5b,0x5a,0x44,0x5d,0x57,0x3f,0x5b,0x58,0x40,0x5b, 0x5a,0x43,0x5d,0x58,0x40,0x5b,0x59,0x42,0x5c,0x36,0x27,0x3a,0x2b,0x1f,0x2f,0x2c, 0x20,0x30,0x2c,0x20,0x30,0x2a,0x1e,0x2e,0x2d,0x20,0x30,0x02,0x02,0x03,0x02,0x03, 0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06, 0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x06,0x08,0x08, 0x09,0x0b,0x16,0x16,0x19,0x2b,0x2c,0x2d,0x26,0x27,0x28,0x28,0x28,0x2a,0x38,0x38, 0x3b,0x29,0x29,0x2c,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0e,0x0e,0x11, 0x0e,0x0f,0x12,0x0f,0x10,0x13,0x14,0x15,0x18,0x26,0x27,0x2b,0x38,0x39,0x3c,0x34, 0x36,0x39,0x33,0x33,0x39,0x33,0x33,0x39,0x3f,0x3f,0x45,0x50,0x51,0x57,0x5e,0x5f, 0x65,0x57,0x58,0x5d,0x50,0x51,0x56,0x45,0x45,0x4b,0x31,0x33,0x39,0x2a,0x2d,0x33, 0x2b,0x2e,0x36,0x2c,0x2e,0x3c,0x36,0x34,0x46,0x3d,0x3a,0x4d,0x42,0x43,0x55,0x51, 0x52,0x63,0x60,0x5e,0x6d,0x68,0x65,0x74,0x69,0x65,0x75,0x69,0x65,0x74,0x66,0x62, 0x71,0x61,0x5e,0x6d,0x5b,0x56,0x65,0x59,0x52,0x62,0x58,0x50,0x60,0x53,0x4d,0x5d, 0x51,0x4a,0x5c,0x50,0x49,0x5b,0x4f,0x49,0x5c,0x51,0x4a,0x5d,0x4c,0x47,0x5a,0x49, 0x46,0x58,0x48,0x42,0x57,0x48,0x42,0x56,0x4b,0x44,0x5a,0x5f,0x54,0x6d,0x6a,0x61, 0x7c,0x63,0x57,0x74,0x67,0x59,0x76,0x69,0x5b,0x76,0x68,0x57,0x71,0x68,0x58,0x73, 0x65,0x58,0x75,0x63,0x58,0x75,0x62,0x59,0x76,0x5f,0x58,0x76,0x5e,0x56,0x76,0x5e, 0x57,0x75,0x5e,0x56,0x74,0x5e,0x55,0x73,0x5e,0x55,0x73,0x5d,0x53,0x6f,0x5c,0x52, 0x6f,0x60,0x59,0x79,0x4d,0x48,0x61,0x48,0x47,0x61,0x47,0x46,0x60,0x46,0x45,0x5f, 0x47,0x46,0x5f,0x47,0x46,0x5f,0x47,0x46,0x60,0x48,0x48,0x62,0x49,0x48,0x63,0x49, 0x49,0x62,0x45,0x46,0x5e,0x40,0x44,0x5a,0x3e,0x44,0x59,0x46,0x4d,0x62,0x4f,0x56, 0x6a,0x56,0x5c,0x6f,0x5a,0x5f,0x6f,0x55,0x5a,0x69,0x56,0x5b,0x69,0x4a,0x4e,0x5e, 0x3a,0x39,0x4c,0x39,0x36,0x48,0x3b,0x36,0x48,0x45,0x3f,0x4e,0x3b,0x34,0x44,0x36, 0x2f,0x3e,0x2e,0x28,0x34,0x22,0x1f,0x29,0x1b,0x19,0x22,0x16,0x15,0x1b,0x12,0x0f, 0x14,0x0e,0x0c,0x0f,0x0b,0x0a,0x0d,0x09,0x08,0x0a,0x07,0x06,0x09,0x06,0x06,0x06, 0x05,0x04,0x05,0x04,0x03,0x04,0x06,0x06,0x07,0x0a,0x0a,0x0a,0x16,0x16,0x16,0x18, 0x18,0x18,0x02,0x02,0x02,0x03,0x03,0x04,0x05,0x05,0x06,0x07,0x07,0x09,0x09,0x09, 0x0a,0x0c,0x0b,0x0e,0x0d,0x0c,0x0e,0x0e,0x0e,0x11,0x10,0x0f,0x12,0x10,0x0f,0x12, 0x11,0x0f,0x13,0x12,0x10,0x13,0x12,0x0f,0x13,0x12,0x0f,0x13,0x11,0x0f,0x12,0x11, 0x0f,0x12,0x11,0x10,0x13,0x12,0x10,0x13,0x11,0x10,0x13,0x12,0x10,0x14,0x11,0x10, 0x14,0x13,0x11,0x16,0x14,0x12,0x16,0x12,0x10,0x15,0x12,0x10,0x13,0x11,0x0f,0x12, 0x11,0x0f,0x12,0x11,0x0f,0x12,0x11,0x0f,0x12,0x11,0x0f,0x13,0x11,0x10,0x13,0x12, 0x10,0x14,0x12,0x10,0x14,0x11,0x0f,0x13,0x0e,0x0e,0x11,0x0e,0x0d,0x11,0x10,0x0e, 0x12,0x12,0x11,0x14,0x16,0x14,0x18,0x12,0x10,0x14,0x0f,0x0e,0x12,0x0f,0x0e,0x11, 0x0f,0x0e,0x11,0x0f,0x0e,0x11,0x0f,0x0e,0x12,0x0f,0x0e,0x12,0x10,0x0e,0x12,0x10, 0x0f,0x12,0x10,0x0e,0x12,0x0e,0x0e,0x11,0x0e,0x0d,0x10,0x0e,0x0c,0x0f,0x0c,0x0a, 0x0e,0x0d,0x0b,0x0e,0x0d,0x0c,0x0f,0x0e,0x0c,0x0f,0x0c,0x0b,0x0e,0x0b,0x0a,0x0c, 0x09,0x08,0x0a,0x07,0x07,0x09,0x07,0x07,0x08,0x06,0x06,0x07,0x02,0x02,0x03,0x02, 0x02,0x02,0x03,0x03,0x04,0x06,0x06,0x06,0x08,0x07,0x09,0x08,0x08,0x0a,0x05,0x05, 0x06,0x02,0x02,0x02,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,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,0x69, 0x69,0x69,0xf5,0xf5,0xf5,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xd9,0xd9,0xd9,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,0xd5,0xd5,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd, 0xfd,0x86,0x86,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0xbf,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xf9,0xf9,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb, 0xbb,0xbb,0x11,0x11,0x11,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,0x55,0x5c,0x71,0x5a,0x52,0x79,0x5e,0x46,0x62,0x64,0x52,0x72,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x55,0x4a,0x6a,0x34,0x2d,0x41,0x50,0x4e,0x53,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x7d,0x7c,0x7e,0x2d,0x27,0x39,0x4e,0x45,0x66,0x5a,0x51,0x78,0x52,0x4b, 0x6f,0x3c,0x32,0x47,0x52,0x4e,0x53,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x99,0x99,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x9e,0x9e,0xfc, 0xfc,0xfc,0xfd,0xfd,0xfd,0xc7,0xc7,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb5,0xb2,0xbb,0xc4,0xc8,0xd6,0xa1,0x96,0xa6,0x13,0x14,0x18, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf3,0xf4,0xf7,0x6c,0x76,0x9a,0x42,0x32,0x3e,0x29,0x1d, 0x23,0x22,0x18,0x1d,0x1b,0x13,0x16,0x19,0x11,0x14,0x15,0x0e,0x10,0x10,0x0a,0x0b, 0xa4,0xa2,0xa2,0xe5,0xe7,0xee,0xaa,0xb2,0xc7,0x8b,0x95,0xb2,0x7c,0x86,0xa7,0x6b, 0x76,0x9b,0x60,0x6d,0x93,0x56,0x63,0x8a,0x43,0x4b,0x6d,0x41,0x42,0x65,0x63,0x5d, 0x8c,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,0x5f, 0x65,0x77,0x73,0x7e,0xa0,0x53,0x5e,0x86,0x52,0x4f,0x79,0x5d,0x52,0x79,0x5e,0x53, 0x79,0x5c,0x52,0x79,0x56,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x50,0x7b, 0x52,0x5c,0x85,0x73,0x7c,0x99,0x39,0x2c,0x35,0x52,0x41,0x51,0x55,0x4a,0x5f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x36,0x2b,0x3d,0x59,0x42,0x5d,0x58,0x40, 0x5c,0x56,0x3f,0x5a,0x59,0x42,0x5d,0x59,0x43,0x5e,0x59,0x42,0x5d,0x5a,0x43,0x5e, 0x3f,0x2e,0x41,0x2c,0x1e,0x2f,0x2b,0x20,0x2f,0x2a,0x1e,0x2e,0x27,0x1b,0x2a,0x2e, 0x21,0x32,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x03, 0x04,0x03,0x03,0x04,0x08,0x08,0x09,0x0b,0x0b,0x0c,0x06,0x06,0x07,0x0f,0x0f,0x10, 0x24,0x25,0x25,0x35,0x35,0x37,0x23,0x24,0x25,0x11,0x12,0x14,0x08,0x08,0x0b,0x07, 0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0e,0x0c,0x0d, 0x0f,0x0c,0x0d,0x0f,0x0f,0x0f,0x12,0x0f,0x10,0x13,0x10,0x11,0x14,0x11,0x12,0x16, 0x14,0x16,0x19,0x1d,0x1f,0x22,0x26,0x27,0x2b,0x2a,0x2b,0x2f,0x38,0x39,0x3e,0x3f, 0x40,0x45,0x50,0x51,0x57,0x43,0x44,0x49,0x46,0x47,0x4d,0x54,0x55,0x5b,0x65,0x66, 0x6c,0x5b,0x5c,0x61,0x3d,0x40,0x44,0x29,0x2c,0x35,0x2a,0x2a,0x3a,0x39,0x37,0x48, 0x43,0x3f,0x53,0x47,0x44,0x5a,0x47,0x48,0x5e,0x51,0x51,0x66,0x5a,0x58,0x6c,0x5e, 0x5b,0x6e,0x5f,0x5b,0x6e,0x5f,0x5c,0x6c,0x5f,0x5a,0x6b,0x63,0x5d,0x6d,0x61,0x5a, 0x6b,0x5e,0x57,0x68,0x5a,0x52,0x64,0x58,0x50,0x63,0x58,0x51,0x64,0x56,0x51,0x64, 0x56,0x52,0x65,0x56,0x53,0x65,0x56,0x53,0x65,0x52,0x4f,0x63,0x59,0x55,0x69,0x69, 0x5f,0x77,0x6b,0x65,0x7f,0x5c,0x54,0x70,0x62,0x58,0x73,0x68,0x5a,0x77,0x68,0x59, 0x75,0x67,0x59,0x73,0x66,0x59,0x73,0x65,0x58,0x73,0x64,0x57,0x73,0x62,0x56,0x73, 0x62,0x57,0x75,0x67,0x59,0x77,0x68,0x5b,0x77,0x68,0x5a,0x76,0x68,0x59,0x76,0x64, 0x56,0x71,0x63,0x55,0x6f,0x68,0x5b,0x7a,0x51,0x47,0x5c,0x48,0x44,0x5a,0x44,0x42, 0x57,0x41,0x3f,0x56,0x3c,0x3b,0x50,0x36,0x38,0x4b,0x3b,0x41,0x54,0x46,0x4c,0x60, 0x46,0x4e,0x62,0x46,0x4c,0x61,0x42,0x47,0x5b,0x39,0x3e,0x50,0x36,0x3a,0x4a,0x3e, 0x43,0x53,0x4e,0x52,0x62,0x56,0x5a,0x67,0x53,0x57,0x62,0x45,0x49,0x57,0x32,0x36, 0x46,0x2e,0x2d,0x3d,0x2d,0x2a,0x38,0x30,0x2b,0x39,0x31,0x2b,0x37,0x2e,0x28,0x34, 0x27,0x22,0x2d,0x1f,0x1b,0x23,0x16,0x14,0x1a,0x0e,0x0e,0x12,0x0c,0x0c,0x11,0x0b, 0x0b,0x0f,0x0a,0x0a,0x0d,0x09,0x08,0x0b,0x08,0x07,0x0a,0x06,0x06,0x07,0x05,0x05, 0x06,0x04,0x04,0x05,0x03,0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x12,0x12,0x12,0x1b,0x1b,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02, 0x02,0x03,0x03,0x03,0x04,0x05,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08, 0x0a,0x09,0x08,0x0a,0x0a,0x0a,0x0c,0x0b,0x0a,0x0d,0x0c,0x0a,0x0e,0x0c,0x0a,0x0e, 0x0a,0x0a,0x0b,0x09,0x08,0x0a,0x09,0x09,0x0a,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0d, 0x0c,0x0f,0x0e,0x0c,0x10,0x10,0x0e,0x12,0x12,0x0f,0x14,0x11,0x0f,0x12,0x0f,0x0e, 0x12,0x0f,0x0e,0x11,0x0f,0x0e,0x11,0x0f,0x0e,0x11,0x0e,0x0e,0x11,0x0e,0x0d,0x11, 0x0f,0x0e,0x11,0x0f,0x0e,0x12,0x0f,0x0e,0x11,0x0e,0x0c,0x0f,0x0b,0x0a,0x0d,0x0a, 0x09,0x0b,0x08,0x07,0x09,0x08,0x07,0x09,0x08,0x07,0x09,0x08,0x07,0x09,0x08,0x07, 0x09,0x08,0x07,0x09,0x08,0x07,0x09,0x08,0x07,0x09,0x08,0x07,0x09,0x08,0x07,0x09, 0x08,0x07,0x09,0x07,0x06,0x09,0x06,0x06,0x07,0x05,0x05,0x06,0x05,0x04,0x05,0x04, 0x03,0x05,0x04,0x03,0x04,0x04,0x04,0x05,0x05,0x04,0x06,0x05,0x05,0x06,0x05,0x04, 0x05,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02, 0x02,0x02,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,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, 0x75,0x75,0x75,0xf5,0xf5,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xd3,0xd3,0xd3,0x05, 0x05,0x05,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,0x19,0x19,0x19,0xf9,0xf9,0xf9,0xff,0xff,0xff,0xff, 0xff,0xff,0xf7,0xf7,0xf7,0x1a,0x1a,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x38,0x38,0x38,0xf9,0xf9,0xf9,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8,0xf8,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0x44,0x44,0x44,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,0x0f,0x0f,0x10,0x5b,0x65,0x88,0x64,0x50,0x6f, 0x5e,0x46,0x62,0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x5d,0x51,0x74,0x4a,0x40,0x5b,0x24,0x1f,0x2c,0xbd,0xbd,0xbd, 0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0x36,0x34,0x3c,0x3d,0x36,0x50,0x54, 0x4b,0x6f,0x47,0x40,0x5f,0x22,0x1f,0x2e,0xbd,0xbd,0xbd,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x23,0x23, 0xf4,0xf4,0xf4,0xfd,0xfd,0xfd,0xf7,0xf7,0xf7,0x43,0x43,0x43,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0b,0x0e,0x78,0x6d,0x7a,0x57,0x57, 0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x63,0x85,0x42,0x32,0x3d,0x24, 0x19,0x1e,0x1e,0x15,0x18,0x1a,0x12,0x14,0x17,0x0f,0x11,0x16,0x0f,0x11,0x16,0x0e, 0x10,0x12,0x0b,0x0c,0x30,0x2c,0x2d,0xf6,0xf7,0xf9,0xb7,0xbe,0xcf,0x9a,0xa3,0xbc, 0x82,0x8c,0xab,0x73,0x7e,0xa1,0x65,0x71,0x96,0x5a,0x66,0x8d,0x44,0x4d,0x6f,0x44, 0x48,0x6d,0x65,0x5f,0x90,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,0x4d,0x51,0x5f,0x7c,0x87,0xa7,0x5c,0x67,0x8f,0x52,0x4f,0x7a,0x5c, 0x52,0x79,0x5c,0x52,0x79,0x5a,0x52,0x79,0x55,0x50,0x79,0x52,0x4f,0x7a,0x52,0x50, 0x7b,0x52,0x53,0x7e,0x53,0x5f,0x88,0x7c,0x84,0xa0,0x36,0x29,0x31,0x4f,0x3e,0x4d, 0x73,0x5e,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x06,0x06,0x08,0x50, 0x3c,0x54,0x58,0x40,0x5b,0x56,0x40,0x5b,0x58,0x41,0x5b,0x59,0x43,0x5c,0x5a,0x44, 0x5d,0x5a,0x44,0x5d,0x59,0x43,0x5c,0x4c,0x38,0x4f,0x34,0x24,0x37,0x29,0x1e,0x2e, 0x26,0x1a,0x2a,0x28,0x1c,0x2c,0x2c,0x21,0x30,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x03,0x04,0x07,0x08,0x09,0x20,0x21,0x22,0x32,0x32,0x33,0x33,0x33, 0x34,0x2a,0x2a,0x2c,0x14,0x15,0x16,0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08, 0x06,0x06,0x08,0x06,0x06,0x08,0x07,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0c,0x09, 0x0a,0x0b,0x0a,0x0a,0x0d,0x0b,0x0b,0x0e,0x0c,0x0d,0x0f,0x0d,0x0e,0x10,0x0f,0x10, 0x12,0x10,0x12,0x15,0x12,0x12,0x16,0x12,0x14,0x17,0x15,0x16,0x1a,0x16,0x17,0x1b, 0x16,0x18,0x1c,0x1a,0x1b,0x20,0x31,0x33,0x38,0x34,0x35,0x3b,0x26,0x27,0x2e,0x28, 0x2a,0x31,0x2e,0x2f,0x36,0x47,0x48,0x4f,0x4f,0x50,0x55,0x41,0x43,0x4b,0x3e,0x38, 0x46,0x3e,0x36,0x47,0x50,0x47,0x57,0x60,0x59,0x6a,0x4d,0x45,0x5a,0x4b,0x46,0x5c, 0x4c,0x47,0x5f,0x4e,0x48,0x61,0x4f,0x4a,0x62,0x4e,0x4c,0x64,0x50,0x4f,0x66,0x5e, 0x5c,0x70,0x64,0x60,0x74,0x65,0x61,0x74,0x62,0x5e,0x72,0x60,0x5c,0x6f,0x5e,0x5a, 0x6f,0x5e,0x5d,0x70,0x63,0x63,0x75,0x6b,0x68,0x7a,0x74,0x72,0x82,0x79,0x76,0x87, 0x72,0x6f,0x81,0x7c,0x76,0x8b,0x72,0x71,0x8b,0x62,0x60,0x7c,0x64,0x61,0x7e,0x5e, 0x5a,0x7a,0x5c,0x55,0x73,0x60,0x56,0x73,0x64,0x57,0x74,0x64,0x57,0x73,0x64,0x58, 0x73,0x64,0x58,0x73,0x66,0x59,0x73,0x68,0x58,0x72,0x68,0x58,0x71,0x6a,0x5a,0x76, 0x6a,0x5c,0x78,0x67,0x59,0x74,0x65,0x57,0x73,0x6d,0x5e,0x7d,0x54,0x48,0x5d,0x4c, 0x43,0x58,0x42,0x3f,0x55,0x3d,0x3b,0x51,0x36,0x36,0x49,0x32,0x37,0x47,0x3a,0x3e, 0x4e,0x44,0x49,0x57,0x47,0x4d,0x5c,0x48,0x4d,0x5c,0x42,0x47,0x55,0x35,0x39,0x42, 0x3d,0x3f,0x48,0x4d,0x51,0x5a,0x55,0x59,0x64,0x51,0x56,0x61,0x40,0x45,0x54,0x33, 0x33,0x46,0x32,0x2f,0x3f,0x30,0x2b,0x38,0x27,0x24,0x30,0x26,0x22,0x2d,0x26,0x22, 0x2b,0x22,0x1e,0x27,0x1e,0x1a,0x22,0x16,0x15,0x1b,0x0f,0x0e,0x13,0x0c,0x0c,0x10, 0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x07,0x07,0x0a,0x06,0x06,0x08,0x06,0x06,0x07,0x05, 0x05,0x06,0x04,0x03,0x05,0x03,0x03,0x04,0x03,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x09,0x09,0x09,0x22,0x22,0x23,0x04,0x04,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x03, 0x05,0x04,0x03,0x04,0x03,0x03,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x04,0x03,0x04,0x07,0x06,0x08,0x09,0x07,0x0a,0x0a,0x09,0x0b,0x0c,0x0b,0x0e,0x0e, 0x0c,0x0f,0x0d,0x0c,0x0f,0x0d,0x0c,0x0e,0x0d,0x0b,0x0e,0x0c,0x0b,0x0e,0x0c,0x0a, 0x0e,0x0a,0x0a,0x0c,0x0a,0x0a,0x0b,0x0a,0x09,0x0a,0x09,0x08,0x0a,0x07,0x06,0x08, 0x05,0x04,0x06,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,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,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,0x75,0x75,0x75,0xf4,0xf4,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd, 0x0e,0x0e,0x0e,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,0x90,0x90,0x90,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xd6,0xd6,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf4, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,0x55,0x55,0x55,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x88,0x88,0x88,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,0x3c,0x3e, 0x44,0x52,0x55,0x80,0x62,0x4a,0x66,0x62,0x4a,0x66,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x58,0x4c,0x6d,0x3a,0x32, 0x48,0x34,0x32,0x39,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9d,0x9c,0x9e, 0x29,0x24,0x35,0x44,0x3c,0x59,0x35,0x30,0x46,0x51,0x50,0x56,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x7c,0x7d,0x7f,0x1e,0x20,0x25,0x00,0x00,0x00,0x00,0x00, 0x00,0xbe,0xbe,0xbe,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xc4,0xc4,0xc4,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,0x3e,0x31,0x3d, 0x30,0x23,0x2a,0x1c,0x13,0x16,0x18,0x10,0x12,0x16,0x0e,0x10,0x16,0x0f,0x11,0x16, 0x0e,0x11,0x14,0x0d,0x0f,0x12,0x0c,0x0d,0x0e,0x08,0x09,0xbb,0xba,0xba,0xc8,0xcc, 0xda,0x9d,0xa5,0xbe,0x86,0x91,0xaf,0x77,0x82,0xa4,0x69,0x75,0x9a,0x5c,0x69,0x90, 0x47,0x50,0x74,0x44,0x46,0x6d,0x5f,0x5e,0x8f,0x02,0x02,0x03,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,0x34,0x37,0x40,0x83,0x8d,0xab,0x64,0x71,0x95, 0x52,0x53,0x7e,0x58,0x50,0x79,0x5b,0x52,0x79,0x56,0x50,0x79,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x53,0x7d,0x52,0x5a,0x83,0x56,0x62,0x8a,0x8c,0x94,0xaf,0x34,0x28, 0x30,0x4f,0x3d,0x4d,0x75,0x60,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03, 0x02,0x02,0x03,0x1d,0x1a,0x25,0x58,0x41,0x5b,0x56,0x40,0x5a,0x55,0x3f,0x59,0x5a, 0x44,0x5d,0x59,0x43,0x5c,0x5a,0x44,0x5e,0x59,0x43,0x5c,0x59,0x44,0x5d,0x5a,0x45, 0x5e,0x4e,0x3a,0x52,0x2f,0x23,0x34,0x27,0x1b,0x2c,0x34,0x26,0x38,0x34,0x28,0x38, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x1d,0x1e,0x1f,0x1a,0x1a,0x1b,0x21, 0x22,0x23,0x1a,0x1a,0x1c,0x03,0x03,0x05,0x03,0x04,0x05,0x04,0x04,0x05,0x05,0x05, 0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09, 0x07,0x08,0x0a,0x08,0x09,0x0b,0x09,0x0a,0x0b,0x0a,0x0a,0x0d,0x0b,0x0c,0x0e,0x0b, 0x0c,0x0e,0x0d,0x0e,0x10,0x0f,0x10,0x12,0x11,0x12,0x15,0x11,0x12,0x16,0x13,0x15, 0x18,0x15,0x16,0x1a,0x16,0x17,0x1b,0x17,0x18,0x1c,0x2d,0x2e,0x33,0x31,0x32,0x37, 0x22,0x22,0x29,0x26,0x27,0x2e,0x28,0x29,0x31,0x2a,0x2a,0x32,0x2c,0x2c,0x34,0x36, 0x38,0x3f,0x40,0x42,0x4d,0x45,0x45,0x52,0x41,0x3e,0x4e,0x5b,0x56,0x66,0x52,0x4b, 0x5e,0x4c,0x43,0x58,0x4f,0x46,0x5b,0x4f,0x47,0x5e,0x4f,0x48,0x5f,0x4c,0x47,0x5f, 0x48,0x46,0x5f,0x4a,0x48,0x60,0x4e,0x50,0x68,0x59,0x59,0x6f,0x5f,0x5f,0x74,0x63, 0x63,0x77,0x64,0x64,0x7a,0x6b,0x6c,0x80,0x75,0x76,0x88,0x8a,0x89,0x98,0x8f,0x8e, 0x9b,0x8c,0x8b,0x99,0x91,0x8e,0x9e,0x97,0x94,0xa5,0x88,0x88,0x9f,0x80,0x7d,0x94, 0x78,0x77,0x92,0x6c,0x6c,0x89,0x67,0x65,0x82,0x67,0x66,0x82,0x5a,0x59,0x77,0x59, 0x54,0x73,0x5b,0x55,0x73,0x5b,0x54,0x73,0x5e,0x55,0x73,0x64,0x58,0x73,0x65,0x56, 0x70,0x65,0x55,0x6f,0x67,0x56,0x6f,0x65,0x55,0x6f,0x65,0x58,0x72,0x6f,0x5f,0x81, 0x52,0x48,0x5f,0x49,0x44,0x5a,0x40,0x3f,0x56,0x3b,0x3a,0x4f,0x34,0x3a,0x4b,0x37, 0x3c,0x4c,0x37,0x3c,0x4a,0x37,0x3c,0x4a,0x35,0x39,0x46,0x33,0x37,0x44,0x32,0x35, 0x41,0x2e,0x31,0x3b,0x35,0x38,0x42,0x40,0x43,0x4e,0x40,0x44,0x50,0x37,0x3b,0x47, 0x2a,0x2e,0x3d,0x2e,0x2c,0x3b,0x2d,0x29,0x36,0x29,0x24,0x2f,0x22,0x1f,0x29,0x21, 0x1d,0x26,0x1f,0x1b,0x22,0x1c,0x19,0x20,0x16,0x14,0x1a,0x11,0x0f,0x14,0x0c,0x0c, 0x10,0x0a,0x0a,0x0d,0x08,0x08,0x0b,0x06,0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x07, 0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x15,0x15,0x16,0x2c,0x2c, 0x2c,0x0d,0x0d,0x0d,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,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x04, 0x05,0x04,0x05,0x06,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x05,0x06,0x05, 0x05,0x06,0x05,0x04,0x06,0x04,0x04,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,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,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,0x85,0x85,0x85,0xf7,0xf7,0xf7,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xd2,0xd2, 0xd2,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,0xe0,0xe0, 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x85,0x85,0x85,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x54,0x54,0xfc,0xfc,0xfc,0xff, 0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xf3,0xf3,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x22,0x22,0x22,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0xcc,0xcc,0x22,0x22,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x4a,0x52,0x6b,0x62,0x53,0x77,0x5f,0x47,0x63,0x64,0x4d, 0x6b,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5e, 0x51,0x75,0x4e,0x43,0x61,0x29,0x24,0x33,0x9d,0x9c,0x9e,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x34,0x32,0x3a,0x2a,0x25,0x37,0x1e,0x1b,0x28,0xbd,0xbd,0xbd, 0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0x29,0x26,0x2e,0x3e,0x44,0x59,0x1b, 0x1c,0x1f,0x4e,0x4e,0x4e,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xf9,0xf9,0xf9,0x3d,0x3d, 0x3d,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,0x0d,0x0a,0x0c,0x2b,0x1f,0x25,0x19,0x10,0x13,0x16,0x0e,0x10,0x15,0x0e,0x10, 0x15,0x0e,0x10,0x15,0x0e,0x10,0x15,0x0d,0x0f,0x16,0x0e,0x10,0x11,0x0a,0x0b,0x4c, 0x48,0x49,0xdf,0xe2,0xea,0xa4,0xac,0xc2,0x8b,0x95,0xb2,0x77,0x83,0xa4,0x6a,0x75, 0x9a,0x5d,0x6a,0x91,0x4b,0x54,0x79,0x3f,0x46,0x67,0x5b,0x5c,0x88,0x1f,0x19,0x22, 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,0x1e,0x1f,0x24,0x8a,0x94, 0xb1,0x6d,0x79,0x9b,0x52,0x5d,0x87,0x54,0x50,0x79,0x5a,0x52,0x79,0x55,0x50,0x79, 0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x56,0x81,0x52,0x5d,0x87,0x5b,0x66,0x8d,0xab, 0xb2,0xc7,0x34,0x29,0x30,0x4b,0x3a,0x48,0x73,0x5e,0x75,0x04,0x04,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x41,0x32,0x45,0x58,0x41,0x5b, 0x55,0x3f,0x59,0x5b,0x44,0x5e,0x5b,0x44,0x5e,0x5b,0x44,0x5e,0x5b,0x44,0x5f,0x5a, 0x44,0x5e,0x5a,0x45,0x5e,0x59,0x44,0x5d,0x5c,0x46,0x5f,0x54,0x40,0x59,0x4c,0x38, 0x50,0x4f,0x3c,0x54,0x3e,0x31,0x43,0x02,0x02,0x03,0x05,0x05,0x06,0x28,0x28,0x29, 0x0b,0x0c,0x0d,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x05,0x03, 0x03,0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x06,0x06,0x07,0x06,0x06, 0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x08,0x09,0x0b,0x08,0x09,0x0a,0x09,0x0a,0x0b, 0x0a,0x0a,0x0c,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0e,0x0e,0x11,0x0f,0x10,0x12,0x10, 0x12,0x15,0x12,0x13,0x17,0x13,0x15,0x18,0x15,0x16,0x1a,0x15,0x16,0x1a,0x27,0x29, 0x2d,0x31,0x33,0x36,0x1b,0x1d,0x22,0x21,0x22,0x29,0x26,0x26,0x2e,0x28,0x29,0x31, 0x2a,0x2b,0x33,0x2d,0x2e,0x36,0x2d,0x2f,0x37,0x37,0x39,0x41,0x33,0x37,0x44,0x36, 0x37,0x47,0x4f,0x4d,0x5e,0x44,0x42,0x55,0x42,0x3e,0x52,0x49,0x42,0x58,0x4b,0x45, 0x5b,0x4a,0x46,0x5d,0x46,0x44,0x5d,0x45,0x43,0x5c,0x47,0x45,0x5e,0x48,0x48,0x62, 0x4e,0x51,0x69,0x5f,0x62,0x77,0x6c,0x6e,0x81,0x74,0x76,0x89,0x88,0x88,0x99,0x91, 0x91,0x9f,0x97,0x96,0xa2,0x9a,0x99,0xa5,0xa5,0xa2,0xb0,0xab,0xa9,0xb9,0x99,0x99, 0xad,0x93,0x91,0xa6,0x92,0x91,0xa6,0x89,0x89,0x9f,0x81,0x81,0x97,0x7a,0x79,0x92, 0x6f,0x6d,0x87,0x6d,0x6d,0x87,0x69,0x67,0x83,0x60,0x5f,0x7c,0x59,0x56,0x75,0x59, 0x53,0x71,0x5f,0x54,0x6f,0x5e,0x53,0x6e,0x60,0x54,0x6f,0x5c,0x50,0x68,0x5f,0x51, 0x6b,0x6a,0x5c,0x7e,0x4a,0x42,0x56,0x46,0x42,0x59,0x42,0x41,0x58,0x40,0x3e,0x56, 0x37,0x38,0x4c,0x32,0x36,0x46,0x2e,0x32,0x40,0x2c,0x2f,0x3c,0x29,0x2c,0x38,0x27, 0x2a,0x37,0x26,0x2a,0x35,0x28,0x2c,0x37,0x2a,0x2e,0x39,0x2b,0x2f,0x3a,0x2c,0x31, 0x3e,0x2d,0x30,0x40,0x2b,0x2b,0x3a,0x29,0x28,0x36,0x22,0x20,0x2b,0x1e,0x1d,0x26, 0x1e,0x1a,0x23,0x1b,0x18,0x1f,0x19,0x16,0x1d,0x16,0x13,0x1a,0x11,0x10,0x16,0x0c, 0x0c,0x10,0x0a,0x0a,0x0d,0x09,0x09,0x0b,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06, 0x08,0x06,0x05,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00, 0x00,0x00,0x0b,0x0b,0x0c,0x21,0x21,0x21,0x10,0x10,0x10,0x00,0x00,0x00,0x0d,0x0d, 0x0d,0x16,0x16,0x16,0x15,0x15,0x16,0x12,0x12,0x13,0x06,0x06,0x07,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,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,0x86,0x86,0x86,0xf5,0xf5,0xf5,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xda, 0xda,0xda,0x06,0x06,0x06,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,0x32, 0x32,0x32,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xf9,0xf9,0x19,0x19, 0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0xe5,0xe5,0xe5, 0xfd,0xfd,0xfd,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xf2,0xf2,0xf2,0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x77,0x77,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x55,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x11,0x4b,0x55,0x7b,0x64, 0x4f,0x6e,0x5c,0x44,0x5e,0x64,0x53,0x73,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x5a,0x4e,0x70,0x3f,0x37,0x4e,0x27,0x25,0x2c,0xee, 0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xad,0xac,0xad,0x12,0x10,0x17,0x6d,0x6c, 0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7e,0x7d,0x80,0x2d,0x22,0x2f, 0x32,0x30,0x4a,0x27,0x2a,0x35,0xd4,0xd4,0xd4,0xff,0xff,0xff,0xff,0xff,0xff,0xbe, 0xbe,0xbe,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,0x2a,0x1f,0x25,0x17,0x0f,0x11,0x14,0x0d, 0x0f,0x13,0x0c,0x0e,0x14,0x0d,0x0f,0x15,0x0e,0x10,0x16,0x0e,0x10,0x16,0x0e,0x11, 0x13,0x0c,0x0e,0x0d,0x08,0x08,0xcc,0xcc,0xce,0xac,0xb4,0xc8,0x90,0x99,0xb4,0x7c, 0x88,0xa8,0x6c,0x77,0x9b,0x5d,0x6a,0x91,0x4f,0x5a,0x7f,0x3b,0x42,0x60,0x54,0x55, 0x80,0x38,0x30,0x43,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,0x06, 0x06,0x08,0x8e,0x98,0xb2,0x76,0x81,0xa2,0x57,0x64,0x8b,0x52,0x4f,0x7b,0x55,0x50, 0x79,0x54,0x50,0x79,0x52,0x4f,0x7b,0x52,0x53,0x7e,0x52,0x5c,0x85,0x56,0x62,0x8a, 0x63,0x6e,0x93,0xcd,0xd1,0xde,0x3d,0x31,0x38,0x4a,0x3a,0x48,0x6f,0x5a,0x71,0x0c, 0x0d,0x11,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x0b,0x0a, 0x0f,0x5c,0x47,0x60,0x56,0x40,0x5a,0x56,0x3f,0x5a,0x59,0x41,0x5c,0x5b,0x44,0x5e, 0x5b,0x44,0x5e,0x5b,0x44,0x5f,0x5b,0x45,0x5f,0x5b,0x44,0x5f,0x5c,0x45,0x5f,0x5b, 0x44,0x5f,0x57,0x41,0x5b,0x4a,0x36,0x4d,0x57,0x43,0x5d,0x28,0x27,0x39,0x2a,0x2a, 0x2a,0x2a,0x2a,0x2a,0x2d,0x2d,0x2e,0x0d,0x0d,0x0e,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x02,0x03,0x02,0x02,0x03,0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x05, 0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x07,0x08, 0x0a,0x09,0x09,0x0b,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d,0x0a,0x0b,0x0e,0x0d,0x0e,0x10, 0x0e,0x0e,0x12,0x0f,0x11,0x13,0x11,0x12,0x15,0x12,0x12,0x16,0x12,0x14,0x17,0x13, 0x15,0x18,0x18,0x19,0x1d,0x2e,0x2f,0x33,0x17,0x18,0x1c,0x1e,0x1f,0x24,0x39,0x3a, 0x40,0x44,0x45,0x4a,0x3e,0x3e,0x45,0x40,0x41,0x49,0x41,0x42,0x4a,0x41,0x41,0x48, 0x2c,0x2e,0x36,0x2f,0x32,0x3a,0x3a,0x3c,0x49,0x54,0x56,0x63,0x38,0x3b,0x4b,0x36, 0x37,0x4a,0x3b,0x3b,0x50,0x3c,0x3c,0x52,0x3e,0x41,0x56,0x40,0x46,0x5b,0x42,0x48, 0x5e,0x48,0x4e,0x64,0x4e,0x54,0x6a,0x5a,0x60,0x75,0x6a,0x6f,0x82,0x71,0x75,0x88, 0x86,0x88,0x99,0x8b,0x8c,0x9a,0x90,0x90,0x9d,0x95,0x95,0xa2,0xa9,0xa5,0xb3,0xab, 0xaa,0xba,0x97,0x96,0xac,0x90,0x8e,0xa3,0x92,0x91,0xa6,0x90,0x8f,0xa4,0x8b,0x89, 0x9f,0x7b,0x7a,0x92,0x7b,0x7a,0x91,0x7f,0x7e,0x95,0x7c,0x7b,0x94,0x6d,0x6e,0x89, 0x63,0x64,0x82,0x55,0x55,0x76,0x53,0x4d,0x6b,0x56,0x4d,0x6a,0x59,0x4f,0x6b,0x55, 0x4a,0x65,0x58,0x4d,0x67,0x66,0x59,0x7a,0x42,0x3a,0x4d,0x3e,0x3a,0x4e,0x3b,0x3a, 0x4f,0x3b,0x3a,0x4f,0x35,0x34,0x48,0x2a,0x2e,0x3c,0x26,0x2a,0x36,0x26,0x2a,0x36, 0x27,0x2b,0x37,0x26,0x2a,0x36,0x26,0x2a,0x36,0x26,0x29,0x36,0x25,0x28,0x34,0x26, 0x29,0x36,0x2a,0x2d,0x3d,0x2f,0x2f,0x40,0x2c,0x2b,0x3b,0x24,0x23,0x30,0x1d,0x1c, 0x26,0x19,0x19,0x21,0x16,0x16,0x1e,0x14,0x14,0x1b,0x12,0x12,0x18,0x0f,0x0e,0x14, 0x0d,0x0d,0x11,0x0a,0x0a,0x0e,0x09,0x09,0x0b,0x08,0x08,0x0b,0x07,0x07,0x0a,0x06, 0x06,0x09,0x06,0x06,0x09,0x06,0x06,0x07,0x06,0x05,0x07,0x04,0x04,0x06,0x03,0x03, 0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x0a,0x2e,0x2e,0x2e,0x00, 0x00,0x00,0x0d,0x0d,0x0d,0x16,0x16,0x16,0x16,0x16,0x16,0x1c,0x1c,0x1c,0x0e,0x0e, 0x0f,0x30,0x30,0x30,0x12,0x12,0x12,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,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,0x87,0x87,0x87,0xf9,0xf9,0xf9,0xff,0xff,0xff,0xfc,0xfc,0xfc, 0xd0,0xd0,0xd0,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,0x9d,0x9d,0x9d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd2, 0xd2,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3, 0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xf3,0xf3,0xf3,0xfa,0xfa,0xfa, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xf5,0xf5,0x15,0x15,0x15,0x00, 0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0xdd,0xdd,0xdd,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x25,0x28,0x31,0x5d,0x52,0x79,0x60,0x48,0x65,0x5c,0x44,0x5e,0x64,0x53,0x76,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5f,0x52,0x76,0x51,0x46,0x65, 0x2e,0x28,0x39,0x7e,0x7d,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x47, 0x47,0x48,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xde,0xde,0xde,0x1b,0x19, 0x25,0x38,0x30,0x46,0x2f,0x24,0x31,0x73,0x73,0x77,0xfc,0xfc,0xfc,0xff,0xff,0xff, 0xf5,0xf5,0xf5,0x21,0x21,0x21,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,0x29,0x1f,0x24,0x1b, 0x12,0x15,0x12,0x0b,0x0d,0x13,0x0c,0x0e,0x14,0x0c,0x0e,0x15,0x0d,0x0f,0x16,0x0f, 0x11,0x16,0x0f,0x11,0x16,0x0e,0x10,0x10,0x0a,0x0b,0x66,0x63,0x64,0xc6,0xca,0xd9, 0x95,0x9f,0xb9,0x82,0x8c,0xab,0x6b,0x76,0x9b,0x60,0x6c,0x93,0x51,0x5d,0x82,0x3b, 0x41,0x60,0x51,0x56,0x82,0x4f,0x46,0x64,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,0x7e,0x86,0x9c,0x7f,0x89,0xa9,0x5e,0x6b,0x91,0x52, 0x52,0x7d,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x52,0x7d,0x52,0x57,0x82,0x53,0x5f, 0x88,0x57,0x64,0x8b,0x66,0x72,0x97,0xd8,0xdc,0xe5,0x47,0x3c,0x42,0x49,0x39,0x46, 0x6d,0x58,0x6e,0x20,0x21,0x2c,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,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x22,0x24,0x35,0x5e,0x47,0x63,0x54,0x3d,0x57,0x59,0x43, 0x5c,0x59,0x41,0x5c,0x5a,0x43,0x5d,0x5b,0x44,0x5f,0x5c,0x45,0x5f,0x5b,0x44,0x5f, 0x5c,0x45,0x5f,0x5c,0x45,0x5f,0x5d,0x46,0x61,0x54,0x3f,0x58,0x4c,0x37,0x4e,0x5c, 0x4b,0x66,0x24,0x28,0x35,0x03,0x03,0x03,0x10,0x10,0x10,0x0b,0x0b,0x0c,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x04,0x05, 0x03,0x04,0x05,0x04,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x05,0x06,0x06,0x06, 0x06,0x07,0x06,0x06,0x08,0x07,0x08,0x0a,0x09,0x09,0x0b,0x0a,0x0a,0x0c,0x0a,0x0b, 0x0d,0x0b,0x0c,0x0e,0x0d,0x0e,0x10,0x0e,0x0e,0x12,0x0f,0x10,0x12,0x0f,0x11,0x13, 0x10,0x12,0x15,0x12,0x12,0x16,0x12,0x14,0x17,0x13,0x14,0x18,0x15,0x16,0x1a,0x42, 0x42,0x45,0x26,0x27,0x2b,0x21,0x23,0x27,0x29,0x2a,0x32,0x3e,0x3f,0x47,0x40,0x41, 0x48,0x40,0x41,0x48,0x2c,0x2e,0x35,0x2d,0x2e,0x36,0x2f,0x31,0x39,0x3d,0x3f,0x48, 0x50,0x53,0x5b,0x40,0x44,0x4f,0x3e,0x42,0x4e,0x42,0x46,0x52,0x4b,0x4f,0x5b,0x4f, 0x53,0x5e,0x50,0x54,0x62,0x55,0x5a,0x69,0x57,0x5e,0x6f,0x5e,0x65,0x76,0x65,0x6b, 0x7e,0x67,0x6d,0x80,0x75,0x7a,0x8b,0x73,0x77,0x87,0x7a,0x7f,0x8d,0x84,0x87,0x95, 0x98,0x96,0xa7,0x99,0x9e,0xb1,0x88,0x89,0xa1,0x82,0x84,0x9a,0x82,0x84,0x9c,0x82, 0x83,0x9a,0x7b,0x7d,0x95,0x71,0x73,0x8c,0x76,0x78,0x91,0x80,0x83,0x9b,0x7b,0x7e, 0x97,0x72,0x75,0x90,0x6d,0x71,0x8e,0x5e,0x62,0x82,0x52,0x4e,0x6f,0x54,0x4b,0x68, 0x56,0x4c,0x68,0x51,0x47,0x61,0x54,0x4a,0x65,0x62,0x57,0x7a,0x3a,0x35,0x46,0x36, 0x34,0x46,0x32,0x32,0x43,0x31,0x30,0x42,0x30,0x32,0x43,0x2b,0x2e,0x3c,0x2c,0x30, 0x3b,0x2d,0x31,0x3d,0x2b,0x2f,0x3b,0x2c,0x2f,0x3c,0x2a,0x2e,0x3a,0x2b,0x2f,0x3b, 0x2a,0x2e,0x3a,0x26,0x29,0x35,0x25,0x29,0x36,0x28,0x28,0x36,0x23,0x23,0x30,0x1d, 0x1d,0x28,0x19,0x19,0x22,0x17,0x19,0x21,0x14,0x16,0x1d,0x12,0x13,0x1a,0x0e,0x0e, 0x14,0x0c,0x0c,0x11,0x0b,0x0b,0x0f,0x09,0x09,0x0c,0x09,0x09,0x0c,0x08,0x08,0x0b, 0x07,0x07,0x0a,0x07,0x06,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07,0x04, 0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x05,0x05,0x05,0x16,0x16,0x16,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,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,0x93,0x93,0x93,0xf7,0xf7,0xf7,0xff,0xff,0xff,0xff,0xff, 0xff,0xcd,0xcd,0xcd,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,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,0xff, 0xfd,0xfd,0xfd,0x81,0x81,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87, 0x87,0x87,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xb2,0xb2, 0xb2,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x26,0x26,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x11,0x11,0x11,0xaa,0xaa,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd, 0xdd,0xdd,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x3a,0x52,0x64,0x53,0x76,0x5e,0x46,0x62, 0x64,0x4f,0x6d,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x5c,0x50,0x72,0x45,0x3c,0x56,0x1e,0x1a,0x25,0xde,0xde,0xde,0xff,0xff,0xff, 0xff,0xff,0xff,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f, 0x6e,0x72,0x2c,0x27,0x3a,0x33,0x2e,0x44,0x1c,0x17,0x21,0xe5,0xe4,0xe5,0xfd,0xfd, 0xfd,0xfd,0xfd,0xfd,0xb0,0xb0,0xb0,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, 0x1b,0x14,0x17,0x1c,0x13,0x16,0x12,0x0c,0x0d,0x12,0x0b,0x0c,0x14,0x0d,0x0f,0x16, 0x0f,0x11,0x18,0x10,0x12,0x16,0x0f,0x11,0x16,0x0f,0x11,0x14,0x0d,0x0f,0x13,0x0d, 0x0e,0xcf,0xd1,0xd7,0xa1,0xa9,0xc1,0x80,0x8a,0xaa,0x6f,0x7b,0x9f,0x63,0x6f,0x95, 0x54,0x61,0x88,0x3d,0x46,0x65,0x4b,0x50,0x78,0x5e,0x57,0x81,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,0x67,0x6d,0x7d,0x85,0x90,0xae, 0x6a,0x75,0x99,0x53,0x5e,0x87,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x53,0x7e,0x52, 0x5d,0x87,0x56,0x62,0x8a,0x5b,0x66,0x8d,0x67,0x74,0x98,0xdd,0xe0,0xe8,0x50,0x45, 0x4b,0x49,0x38,0x45,0x6a,0x55,0x6a,0x37,0x38,0x4c,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,0x02,0x02,0x02,0x02,0x02,0x02,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,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x48,0x3f,0x5d,0x5a, 0x44,0x5e,0x57,0x40,0x5b,0x59,0x41,0x5c,0x59,0x41,0x5c,0x5a,0x43,0x5d,0x5a,0x43, 0x5d,0x5b,0x44,0x5e,0x5b,0x44,0x5e,0x5c,0x45,0x5f,0x5c,0x45,0x5f,0x5d,0x46,0x61, 0x52,0x3c,0x56,0x4f,0x3b,0x53,0x57,0x48,0x65,0x15,0x18,0x20,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05, 0x04,0x04,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x09,0x08,0x08,0x0a,0x08, 0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0d,0x0e, 0x10,0x0e,0x0f,0x12,0x0f,0x10,0x12,0x10,0x11,0x14,0x11,0x12,0x15,0x11,0x12,0x16, 0x12,0x13,0x17,0x12,0x13,0x17,0x14,0x15,0x18,0x16,0x16,0x1a,0x1a,0x1b,0x20,0x22, 0x22,0x28,0x26,0x27,0x2e,0x2a,0x2a,0x31,0x29,0x2a,0x30,0x2a,0x2b,0x32,0x2d,0x2e, 0x35,0x2f,0x30,0x38,0x40,0x42,0x49,0x56,0x57,0x5f,0x53,0x55,0x5d,0x58,0x5b,0x62, 0x6d,0x70,0x77,0x53,0x56,0x5e,0x51,0x54,0x5d,0x52,0x55,0x5f,0x53,0x58,0x66,0x56, 0x5c,0x6d,0x56,0x5c,0x6e,0x56,0x5d,0x6f,0x5a,0x60,0x72,0x5d,0x62,0x74,0x5e,0x63, 0x75,0x6a,0x6d,0x80,0x78,0x79,0x8d,0x76,0x7e,0x99,0x6a,0x6f,0x89,0x68,0x6d,0x88, 0x6a,0x6f,0x8c,0x6a,0x6f,0x8c,0x69,0x6e,0x8a,0x66,0x6b,0x89,0x6d,0x72,0x8f,0x79, 0x7e,0x98,0x70,0x74,0x91,0x6d,0x72,0x8f,0x6b,0x70,0x8d,0x5d,0x62,0x81,0x53,0x52, 0x73,0x52,0x4f,0x70,0x53,0x4e,0x6d,0x4f,0x48,0x65,0x4e,0x48,0x66,0x58,0x52,0x77, 0x2a,0x2a,0x39,0x2a,0x2a,0x39,0x2b,0x2c,0x3c,0x2b,0x2c,0x3c,0x2a,0x2e,0x3c,0x2f, 0x32,0x3d,0x3a,0x3e,0x47,0x41,0x44,0x4e,0x40,0x43,0x4e,0x3f,0x42,0x4c,0x3c,0x3f, 0x4a,0x3c,0x40,0x4a,0x3a,0x3d,0x48,0x2f,0x33,0x3d,0x24,0x27,0x32,0x20,0x22,0x2d, 0x1c,0x1e,0x28,0x1b,0x1e,0x26,0x19,0x1b,0x24,0x18,0x1a,0x22,0x15,0x16,0x1e,0x10, 0x12,0x17,0x0e,0x0f,0x15,0x0c,0x0d,0x11,0x0b,0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a, 0x0d,0x09,0x09,0x0b,0x08,0x08,0x0b,0x07,0x07,0x0a,0x07,0x06,0x0a,0x06,0x06,0x09, 0x06,0x06,0x09,0x05,0x05,0x06,0x05,0x05,0x06,0x03,0x03,0x05,0x03,0x03,0x04,0x03, 0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x9e,0x9e,0x9e,0xf8,0xf8,0xf8,0xff,0xff,0xff,0xfd, 0xfd,0xfd,0xcf,0xcf,0xcf,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,0x3e,0x3e,0x3e,0xfa,0xfa,0xfa,0xff,0xff, 0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0x38,0x38,0xf3,0xf3,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc5, 0xc5,0xc5,0x2a,0x2a,0x2a,0xf2,0xf2,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xfa,0xfa,0xfa,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x09,0x46,0x49, 0x6e,0x64,0x4f,0x6d,0x5e,0x46,0x62,0x64,0x53,0x75,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x55,0x49,0x69,0x34,0x2d,0x40,0x70,0x6e, 0x73,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xcd,0xcd,0xce,0x1f,0x1b,0x28,0x35,0x2f,0x45,0x27,0x22,0x33,0x99,0x98,0x9a,0xfc, 0xfc,0xfc,0xff,0xff,0xff,0xf3,0xf3,0xf3,0x39,0x3a,0x3e,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,0x20,0x16,0x1a,0x14,0x0d,0x0e,0x12,0x0c,0x0d, 0x14,0x0d,0x0f,0x16,0x0f,0x11,0x16,0x0f,0x11,0x16,0x0e,0x10,0x16,0x0e,0x10,0x17, 0x0f,0x12,0x16,0x0f,0x11,0x80,0x7c,0x7d,0xb4,0xbb,0xce,0x84,0x90,0xad,0x73,0x7e, 0xa1,0x64,0x71,0x96,0x5b,0x67,0x90,0x40,0x49,0x68,0x47,0x4e,0x72,0x67,0x62,0x95, 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,0x47,0x4a, 0x56,0x90,0x99,0xb4,0x75,0x7f,0xa1,0x58,0x64,0x8c,0x52,0x54,0x7e,0x52,0x53,0x7d, 0x52,0x55,0x80,0x53,0x5e,0x88,0x58,0x65,0x8c,0x5d,0x69,0x90,0x6b,0x76,0x9a,0xdd, 0xdf,0xe8,0x54,0x4b,0x50,0x48,0x37,0x44,0x67,0x52,0x67,0x4d,0x4d,0x68,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,0x02,0x02,0x02,0x00,0x00,0x00, 0x0d,0x10,0x15,0x5e,0x48,0x63,0x54,0x3e,0x57,0x5a,0x43,0x5d,0x59,0x41,0x5c,0x5a, 0x43,0x5d,0x59,0x41,0x5c,0x5a,0x43,0x5d,0x5a,0x43,0x5d,0x5b,0x44,0x5e,0x5b,0x44, 0x5e,0x5c,0x45,0x5f,0x5a,0x44,0x5e,0x4c,0x38,0x4f,0x53,0x3d,0x56,0x4e,0x43,0x61, 0x14,0x15,0x19,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x04, 0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x08, 0x07,0x08,0x0a,0x07,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a, 0x0b,0x0e,0x0b,0x0c,0x0e,0x0d,0x0e,0x10,0x0d,0x0e,0x10,0x0e,0x0f,0x12,0x0e,0x0f, 0x12,0x10,0x11,0x14,0x10,0x11,0x14,0x11,0x12,0x15,0x12,0x12,0x16,0x12,0x13,0x16, 0x16,0x18,0x1b,0x1a,0x1c,0x21,0x21,0x22,0x27,0x26,0x26,0x2d,0x26,0x27,0x2e,0x28, 0x29,0x2f,0x29,0x2a,0x31,0x30,0x31,0x39,0x39,0x3a,0x43,0x41,0x43,0x4c,0x50,0x52, 0x5a,0x4f,0x51,0x5a,0x46,0x49,0x51,0x46,0x4a,0x52,0x4a,0x4d,0x56,0x49,0x4c,0x57, 0x49,0x4e,0x5a,0x46,0x4a,0x59,0x47,0x4c,0x5b,0x4a,0x50,0x60,0x4d,0x52,0x62,0x4e, 0x53,0x63,0x4d,0x52,0x63,0x5f,0x61,0x75,0x6d,0x6e,0x84,0x66,0x6e,0x8a,0x5c,0x60, 0x7b,0x5e,0x62,0x7e,0x61,0x65,0x81,0x61,0x66,0x83,0x64,0x69,0x87,0x60,0x66,0x87, 0x62,0x68,0x88,0x64,0x6b,0x8b,0x60,0x66,0x87,0x5e,0x64,0x85,0x5c,0x62,0x82,0x57, 0x5a,0x7b,0x56,0x59,0x7a,0x54,0x58,0x79,0x53,0x56,0x75,0x4e,0x50,0x6f,0x4f,0x51, 0x71,0x59,0x5a,0x7e,0x2c,0x2f,0x3a,0x26,0x29,0x31,0x22,0x25,0x2e,0x26,0x2a,0x32, 0x2d,0x30,0x37,0x3d,0x3f,0x46,0x50,0x52,0x58,0x61,0x62,0x66,0x6a,0x6b,0x6e,0x62, 0x64,0x69,0x6e,0x6f,0x74,0x79,0x7b,0x7f,0x66,0x6a,0x70,0x42,0x46,0x4e,0x2a,0x2e, 0x39,0x21,0x25,0x2f,0x20,0x23,0x2d,0x1f,0x22,0x2c,0x1c,0x1e,0x27,0x1a,0x1c,0x25, 0x16,0x19,0x1f,0x12,0x14,0x1a,0x0f,0x10,0x16,0x0e,0x0e,0x13,0x0c,0x0c,0x10,0x0a, 0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x09,0x0c,0x09,0x09,0x0b,0x08,0x08, 0x0b,0x07,0x07,0x0a,0x07,0x07,0x0a,0x06,0x06,0x07,0x06,0x05,0x07,0x04,0x04,0x06, 0x03,0x03,0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,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,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0xa5,0xfa,0xfa,0xfa,0xff,0xff,0xff, 0xfc,0xfc,0xfc,0xc4,0xc4,0xc4,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,0xaf,0xaf,0xaf,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd0,0xd0,0xd0,0x00,0x00,0x00,0x00,0x00, 0x00,0x05,0x05,0x05,0xe2,0xe2,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd, 0xec,0xec,0xec,0x0f,0x0f,0x0f,0x00,0x00,0x00,0xf4,0xf4,0xf4,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xf8,0xf8,0xf8,0x1f,0x1f,0x1f,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x33,0x33,0x33,0xcc,0xcc,0xcc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1c,0x1e,0x24,0x51,0x4e,0x7a,0x62,0x4a,0x66,0x5e,0x46,0x62,0x64,0x53, 0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5d,0x51,0x74,0x4a, 0x40,0x5b,0x24,0x1f,0x2c,0xbd,0xbd,0xbd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x50,0x4f,0x54,0x2e,0x29,0x3b,0x31,0x2b,0x3f,0x21,0x1f,0x28, 0xef,0xef,0xef,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xa8,0xa6,0xa8,0x23,0x25,0x38,0x45, 0x4a,0x58,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,0x24,0x19,0x1e,0x15,0x0e, 0x10,0x13,0x0c,0x0e,0x13,0x0c,0x0e,0x15,0x0e,0x10,0x15,0x0e,0x10,0x16,0x0f,0x11, 0x18,0x10,0x13,0x1c,0x13,0x16,0x1f,0x15,0x19,0x28,0x1f,0x22,0xde,0xdf,0xe5,0x94, 0x9d,0xb8,0x76,0x82,0xa3,0x67,0x73,0x99,0x5c,0x67,0x90,0x46,0x4f,0x73,0x43,0x49, 0x6c,0x5f,0x62,0x94,0x11,0x10,0x14,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,0x26,0x29,0x2e,0x98,0xa1,0xba,0x7e,0x89,0xa9,0x60,0x6c,0x92,0x52,0x5d, 0x85,0x52,0x55,0x7f,0x52,0x5d,0x85,0x55,0x60,0x89,0x5b,0x66,0x8d,0x62,0x6d,0x93, 0x6e,0x7a,0x9c,0xde,0xe1,0xe9,0x5e,0x56,0x59,0x45,0x35,0x41,0x64,0x50,0x64,0x64, 0x62,0x85,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,0x27,0x27,0x39,0x5b,0x44,0x5f,0x53,0x3d,0x56, 0x57,0x41,0x5b,0x59,0x41,0x5c,0x59,0x41,0x5c,0x5a,0x43,0x5d,0x5b,0x44,0x5e,0x5a, 0x43,0x5d,0x5b,0x44,0x5e,0x5c,0x45,0x5f,0x5d,0x46,0x61,0x59,0x43,0x5d,0x4b,0x36, 0x4e,0x4f,0x3b,0x54,0x3f,0x3d,0x61,0x11,0x11,0x11,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x04,0x05,0x04,0x04,0x06,0x04,0x04, 0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x07,0x08,0x07,0x07,0x09,0x07,0x08,0x0a, 0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0d, 0x0e,0x10,0x0c,0x0c,0x0e,0x0d,0x0e,0x10,0x0d,0x0e,0x11,0x0f,0x10,0x12,0x0f,0x11, 0x13,0x10,0x11,0x14,0x12,0x13,0x16,0x16,0x16,0x1a,0x1a,0x1b,0x1f,0x1e,0x1e,0x24, 0x1f,0x20,0x26,0x23,0x23,0x2a,0x26,0x27,0x2e,0x2a,0x2c,0x33,0x32,0x33,0x3c,0x36, 0x38,0x42,0x3a,0x3d,0x49,0x40,0x42,0x4c,0x46,0x47,0x50,0x4c,0x4e,0x56,0x49,0x4a, 0x53,0x42,0x44,0x4d,0x40,0x43,0x4e,0x3e,0x41,0x4c,0x3e,0x42,0x4d,0x3f,0x43,0x4f, 0x3f,0x44,0x50,0x40,0x43,0x51,0x3f,0x43,0x51,0x5b,0x5a,0x6d,0x71,0x72,0x86,0x5a, 0x61,0x80,0x51,0x55,0x71,0x56,0x5a,0x77,0x58,0x5c,0x78,0x5a,0x5d,0x79,0x5c,0x5f, 0x7c,0x5c,0x60,0x7e,0x5c,0x61,0x81,0x5e,0x63,0x84,0x5d,0x63,0x84,0x5e,0x63,0x84, 0x5e,0x64,0x85,0x60,0x65,0x84,0x61,0x66,0x84,0x61,0x65,0x82,0x5e,0x61,0x7e,0x59, 0x5c,0x78,0x5b,0x5e,0x7a,0x61,0x62,0x80,0x35,0x38,0x41,0x2d,0x2f,0x36,0x2a,0x2c, 0x32,0x30,0x32,0x36,0x42,0x43,0x46,0x59,0x5a,0x5d,0x6f,0x70,0x72,0x81,0x81,0x82, 0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x9c,0x9c,0x9d,0x96,0x97,0x98,0x84,0x86,0x89,0x57, 0x59,0x60,0x34,0x37,0x41,0x2a,0x2e,0x38,0x27,0x2a,0x34,0x23,0x27,0x30,0x24,0x27, 0x30,0x1f,0x22,0x2a,0x1a,0x1c,0x24,0x14,0x16,0x1d,0x10,0x12,0x17,0x0e,0x0f,0x14, 0x0c,0x0c,0x10,0x0a,0x0b,0x0e,0x0b,0x0c,0x10,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x0a, 0x0a,0x0e,0x09,0x0a,0x0d,0x09,0x09,0x0c,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06, 0x08,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x00,0x00,0xbc,0xbc,0xbc,0xfc,0xfc,0xfc,0xfd,0xfd, 0xfd,0xfd,0xfd,0xfd,0xce,0xce,0xce,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, 0xeb,0xeb,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x73,0x73,0x73,0x00, 0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xf7,0xf7,0xf7,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0xfa, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf2,0xf2,0xf2,0x0d,0x0d,0x0d,0x00, 0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0x99,0x99,0x99,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0x55,0x55,0x55,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x3c,0x4d,0x5a,0x52,0x79,0x60, 0x48,0x64,0x60,0x48,0x65,0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x54,0x49,0x68,0x30,0x29,0x3b,0x5d,0x5c,0x5f,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xbd,0xbd,0xbd,0x21,0x1d,0x2b,0x35,0x2f,0x44,0x22,0x1e, 0x2c,0xb6,0xb6,0xb7,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xef,0xef,0xef,0x19,0x14,0x1c, 0x40,0x31,0x44,0x4c,0x54,0x7b,0x4a,0x4f,0x5e,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,0x29, 0x1e,0x25,0x1a,0x12,0x15,0x15,0x0d,0x0f,0x13,0x0c,0x0e,0x13,0x0c,0x0e,0x14,0x0d, 0x0f,0x17,0x0f,0x11,0x1b,0x13,0x16,0x23,0x18,0x1d,0x2b,0x1f,0x25,0x28,0x1c,0x22, 0x9d,0x99,0x9a,0xb9,0xc0,0xd1,0x80,0x8b,0xaa,0x69,0x74,0x99,0x5e,0x6b,0x92,0x4f, 0x5a,0x7e,0x40,0x48,0x69,0x56,0x5a,0x87,0x32,0x2e,0x3f,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,0x06,0x06,0x07,0x96,0x9e,0xb7,0x88,0x92,0xb0,0x6a, 0x75,0x9a,0x55,0x60,0x89,0x52,0x5d,0x87,0x53,0x5e,0x87,0x58,0x64,0x8c,0x60,0x6c, 0x92,0x67,0x73,0x98,0x75,0x80,0xa2,0xe4,0xe6,0xed,0x66,0x5e,0x62,0x45,0x34,0x40, 0x63,0x4f,0x63,0x68,0x66,0x8a,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,0x02,0x02,0x04,0x4b,0x41, 0x5d,0x53,0x3e,0x57,0x53,0x3d,0x55,0x5a,0x43,0x5d,0x59,0x41,0x5c,0x5a,0x43,0x5d, 0x5a,0x43,0x5d,0x5b,0x44,0x5e,0x5a,0x43,0x5d,0x5b,0x44,0x5f,0x5c,0x45,0x60,0x5c, 0x45,0x5f,0x56,0x3f,0x5b,0x4c,0x38,0x50,0x4f,0x3c,0x55,0x3f,0x49,0x67,0x0b,0x0b, 0x0b,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x03, 0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06, 0x07,0x07,0x07,0x09,0x07,0x08,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x0a,0x0a,0x0c, 0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0b,0x0c,0x0e,0x0c,0x0c,0x0e,0x0c, 0x0e,0x10,0x0d,0x0e,0x10,0x0e,0x0e,0x12,0x0f,0x10,0x13,0x11,0x12,0x14,0x15,0x16, 0x19,0x16,0x17,0x1b,0x1a,0x1c,0x21,0x1e,0x20,0x26,0x22,0x22,0x29,0x24,0x26,0x2d, 0x27,0x28,0x30,0x2d,0x2e,0x36,0x32,0x34,0x3e,0x36,0x37,0x45,0x3a,0x3e,0x4a,0x42, 0x45,0x4e,0x48,0x4a,0x52,0x41,0x42,0x4a,0x3b,0x3e,0x46,0x37,0x39,0x41,0x36,0x37, 0x3e,0x34,0x36,0x3e,0x33,0x36,0x3e,0x34,0x36,0x3f,0x37,0x3a,0x45,0x50,0x4d,0x63, 0x6b,0x69,0x80,0x4f,0x50,0x6f,0x4a,0x47,0x63,0x4f,0x4d,0x6c,0x4d,0x4b,0x6b,0x4c, 0x4b,0x6a,0x4c,0x4c,0x6c,0x50,0x52,0x70,0x54,0x58,0x75,0x59,0x5d,0x79,0x5e,0x61, 0x7f,0x60,0x64,0x82,0x64,0x69,0x85,0x65,0x68,0x85,0x65,0x69,0x85,0x67,0x6a,0x87, 0x64,0x67,0x83,0x5e,0x62,0x7b,0x5f,0x61,0x7d,0x62,0x62,0x80,0x3b,0x3f,0x48,0x36, 0x39,0x40,0x32,0x34,0x3a,0x3a,0x3d,0x41,0x57,0x58,0x5b,0x75,0x75,0x76,0x85,0x85, 0x85,0x8e,0x8e,0x8e,0x9e,0x9e,0x9e,0xa8,0xa8,0xa8,0xa7,0xa8,0xa8,0x9e,0x9e,0xa0, 0x86,0x87,0x8a,0x5a,0x5d,0x62,0x46,0x49,0x4f,0x3d,0x3f,0x47,0x31,0x35,0x3e,0x2e, 0x32,0x3b,0x2e,0x31,0x3a,0x2b,0x2e,0x38,0x22,0x25,0x2d,0x1a,0x1d,0x25,0x14,0x16, 0x1c,0x0f,0x10,0x16,0x0d,0x0e,0x12,0x0c,0x0d,0x12,0x0d,0x0e,0x12,0x0c,0x0e,0x12, 0x0b,0x0d,0x11,0x0b,0x0c,0x10,0x0a,0x0b,0x0e,0x0a,0x0a,0x0e,0x08,0x08,0x0b,0x07, 0x08,0x0a,0x06,0x06,0x09,0x06,0x06,0x07,0x05,0x05,0x06,0x03,0x04,0x05,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0xc7,0xc7,0xc7,0xff,0xff,0xff,0xff, 0xff,0xff,0xfa,0xfa,0xfa,0xbb,0xbb,0xbb,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,0x50,0x50,0x50,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xf4,0xf4,0xf4, 0x0e,0x0e,0x0e,0x00,0x00,0x00,0x9d,0x9d,0x9d,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff, 0xff,0xff,0xfc,0xfc,0xfc,0x87,0x87,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x13, 0x13,0xf7,0xf7,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xd3,0xd3,0xd3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,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,0x55,0x55,0x55,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03, 0x4b,0x55,0x71,0x60,0x53,0x77,0x5b,0x43,0x5d,0x63,0x4b,0x67,0x63,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x5e,0x51,0x74,0x4c,0x42,0x5e,0x27,0x22,0x31,0x9d,0x9c,0x9d, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x34,0x32,0x39,0x31,0x2a,0x3c,0x2e, 0x29,0x3b,0x4a,0x48,0x4e,0xf9,0xf9,0xf9,0xfd,0xfd,0xfd,0xff,0xff,0xff,0x98,0x97, 0x99,0x2b,0x26,0x38,0x53,0x43,0x5e,0x62,0x4c,0x69,0x52,0x56,0x81,0x35,0x39,0x46, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,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,0x15,0x10,0x14,0x20,0x17,0x1b,0x14,0x0d,0x0f,0x13,0x0c,0x0e,0x13, 0x0c,0x0e,0x15,0x0e,0x10,0x1a,0x11,0x14,0x22,0x18,0x1c,0x2b,0x1f,0x26,0x30,0x23, 0x2b,0x2f,0x23,0x2a,0x3a,0x31,0x35,0xdb,0xdd,0xe5,0x8b,0x95,0xb2,0x6e,0x7a,0x9d, 0x60,0x6d,0x94,0x54,0x60,0x85,0x40,0x48,0x68,0x51,0x56,0x80,0x4a,0x46,0x66,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,0x6d,0x73,0x85, 0x90,0x9a,0xb5,0x74,0x80,0xa2,0x5c,0x67,0x90,0x54,0x5f,0x89,0x57,0x63,0x8b,0x5e, 0x6a,0x91,0x66,0x73,0x97,0x6e,0x7b,0x9c,0x7f,0x89,0xa9,0xed,0xef,0xf4,0x72,0x6b, 0x6e,0x46,0x36,0x42,0x5e,0x4b,0x5d,0x6d,0x67,0x89,0x03,0x03,0x05,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,0x10,0x12,0x1a,0x5d,0x46,0x63,0x4f,0x3b,0x53,0x55,0x3f,0x58,0x59,0x40, 0x5b,0x5a,0x42,0x5c,0x5a,0x42,0x5c,0x5a,0x43,0x5d,0x5a,0x43,0x5d,0x5b,0x43,0x5e, 0x5c,0x45,0x5f,0x5c,0x45,0x60,0x5d,0x46,0x60,0x54,0x3e,0x58,0x4a,0x35,0x4c,0x51, 0x3d,0x55,0x46,0x50,0x6f,0x05,0x05,0x05,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x03,0x04,0x02,0x03,0x04,0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x05, 0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x08,0x07,0x07, 0x09,0x08,0x08,0x0a,0x08,0x08,0x0a,0x08,0x09,0x0a,0x09,0x09,0x0a,0x09,0x0a,0x0b, 0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0b,0x0c,0x0e,0x0c,0x0d,0x0f,0x0e,0x0e,0x11,0x0e, 0x0f,0x12,0x11,0x12,0x16,0x13,0x14,0x17,0x16,0x16,0x1a,0x18,0x19,0x1d,0x1b,0x1d, 0x22,0x1e,0x1f,0x26,0x20,0x22,0x28,0x22,0x23,0x2a,0x26,0x27,0x2e,0x26,0x28,0x33, 0x2d,0x2e,0x3a,0x31,0x35,0x42,0x36,0x3a,0x43,0x37,0x39,0x40,0x32,0x35,0x3a,0x2c, 0x2e,0x33,0x2a,0x2b,0x31,0x25,0x27,0x2f,0x22,0x24,0x2f,0x25,0x25,0x32,0x3c,0x36, 0x47,0x5d,0x4e,0x63,0x73,0x69,0x7e,0x57,0x4d,0x66,0x52,0x45,0x5e,0x56,0x4b,0x64, 0x57,0x4b,0x66,0x56,0x4c,0x67,0x55,0x4c,0x68,0x54,0x4b,0x68,0x4c,0x49,0x67,0x4a, 0x4a,0x68,0x4c,0x4d,0x6c,0x54,0x55,0x73,0x59,0x5c,0x78,0x5e,0x61,0x7c,0x65,0x66, 0x81,0x67,0x6a,0x84,0x65,0x67,0x81,0x5f,0x62,0x7b,0x60,0x62,0x7d,0x62,0x64,0x80, 0x42,0x46,0x52,0x3e,0x41,0x4b,0x3c,0x3e,0x46,0x45,0x46,0x4d,0x62,0x64,0x68,0x78, 0x79,0x7a,0x83,0x84,0x86,0x90,0x91,0x93,0x97,0x98,0x99,0xa0,0xa1,0xa4,0x98,0x9a, 0x9e,0x81,0x83,0x88,0x60,0x63,0x6a,0x56,0x59,0x61,0x52,0x54,0x5b,0x53,0x56,0x5d, 0x3f,0x42,0x4a,0x39,0x3c,0x45,0x39,0x3c,0x46,0x35,0x38,0x42,0x2a,0x2d,0x36,0x21, 0x23,0x2b,0x1a,0x1c,0x23,0x12,0x13,0x19,0x0e,0x10,0x15,0x0e,0x0f,0x13,0x0e,0x0f, 0x14,0x0e,0x0e,0x13,0x0d,0x0e,0x12,0x0c,0x0d,0x11,0x0b,0x0c,0x10,0x0a,0x0a,0x0e, 0x09,0x0a,0x0d,0x08,0x08,0x0b,0x07,0x07,0x0a,0x06,0x06,0x08,0x05,0x05,0x06,0x04, 0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x07,0x07,0x07,0xcd,0xcd,0xcd,0xfc,0xfc,0xfc, 0xff,0xff,0xff,0xfd,0xfd,0xfd,0xad,0xad,0xad,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xd0,0xd0,0xd0,0x00,0x00,0x00,0x6b,0x6b,0x6b,0xf9,0xf9,0xf9,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xb5,0xb5,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x05,0x05,0x05,0x15,0x15,0x15,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07, 0x07,0x07,0x07,0x07,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x18,0x19,0x1a,0x50,0x5b,0x81,0x64,0x50,0x6f,0x5c,0x44,0x5e, 0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x57,0x4b,0x6b,0x37,0x30,0x45,0x52,0x50, 0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9d,0x9c,0x9e,0x27,0x22,0x30, 0x37,0x2f,0x44,0x20,0x1c,0x28,0xca,0xca,0xcb,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xeb, 0xeb,0xeb,0x1a,0x17,0x21,0x40,0x38,0x52,0x59,0x4e,0x72,0x64,0x50,0x6f,0x64,0x4f, 0x6d,0x51,0x5c,0x84,0x27,0x2b,0x34,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,0x28,0x1c,0x22,0x16,0x0f,0x11, 0x13,0x0c,0x0e,0x15,0x0d,0x0f,0x1a,0x11,0x14,0x21,0x17,0x1b,0x2a,0x1e,0x25,0x32, 0x25,0x2d,0x31,0x24,0x2c,0x30,0x23,0x2b,0x28,0x1d,0x22,0xac,0xa9,0xab,0xa2,0xaa, 0xc1,0x74,0x80,0xa2,0x64,0x71,0x96,0x58,0x63,0x8a,0x42,0x4b,0x6b,0x49,0x53,0x78, 0x5a,0x58,0x83,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,0x49,0x4d,0x58,0x96,0xa0,0xb9,0x7d,0x88,0xa8,0x63,0x6f,0x95,0x5a,0x65,0x8d, 0x5b,0x67,0x90,0x63,0x6e,0x94,0x6e,0x7a,0x9c,0x79,0x83,0xa4,0x89,0x92,0xb0,0xeb, 0xed,0xf1,0x7d,0x76,0x79,0x43,0x33,0x3e,0x5b,0x48,0x59,0x76,0x69,0x88,0x0a,0x0b, 0x0f,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,0x2a,0x2a,0x3e,0x57,0x40,0x5b,0x52, 0x3d,0x55,0x5a,0x42,0x5c,0x5a,0x42,0x5c,0x5a,0x42,0x5c,0x5a,0x42,0x5c,0x5b,0x43, 0x5d,0x5b,0x43,0x5d,0x5c,0x44,0x5e,0x5b,0x43,0x5e,0x5c,0x44,0x5f,0x5b,0x44,0x5f, 0x51,0x3c,0x55,0x4a,0x35,0x4d,0x53,0x41,0x59,0x41,0x49,0x65,0x00,0x00,0x00,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03,0x04,0x02,0x02,0x03,0x03,0x04,0x05, 0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05, 0x06,0x06,0x06,0x06,0x08,0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x07,0x09,0x07,0x07, 0x09,0x07,0x08,0x0a,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0d, 0x0b,0x0c,0x0e,0x0d,0x0e,0x10,0x0e,0x0f,0x12,0x10,0x11,0x13,0x11,0x12,0x16,0x13, 0x14,0x18,0x15,0x16,0x1a,0x18,0x1a,0x1e,0x1c,0x1e,0x23,0x1e,0x21,0x26,0x21,0x22, 0x28,0x20,0x22,0x29,0x20,0x23,0x2d,0x26,0x26,0x32,0x25,0x26,0x33,0x27,0x2a,0x32, 0x26,0x29,0x2f,0x22,0x25,0x2d,0x1e,0x1f,0x2a,0x26,0x22,0x2d,0x2e,0x27,0x32,0x32, 0x2a,0x34,0x4c,0x3e,0x4e,0x58,0x46,0x57,0x5a,0x53,0x66,0x48,0x3e,0x53,0x4c,0x41, 0x58,0x52,0x46,0x5f,0x52,0x46,0x60,0x53,0x46,0x60,0x50,0x45,0x5f,0x51,0x45,0x5f, 0x53,0x48,0x62,0x52,0x49,0x66,0x50,0x49,0x65,0x49,0x46,0x65,0x4a,0x49,0x68,0x4c, 0x4e,0x6c,0x54,0x55,0x74,0x5e,0x60,0x7b,0x5f,0x60,0x78,0x5b,0x5c,0x74,0x5c,0x5e, 0x78,0x5c,0x5d,0x77,0x3f,0x42,0x4e,0x3e,0x42,0x4c,0x3d,0x40,0x4a,0x44,0x46,0x50, 0x52,0x54,0x5b,0x5f,0x61,0x65,0x6a,0x6a,0x6c,0x74,0x75,0x76,0x71,0x71,0x73,0x6f, 0x71,0x75,0x5c,0x60,0x67,0x4e,0x52,0x5a,0x4f,0x52,0x5d,0x53,0x57,0x61,0x56,0x59, 0x61,0x52,0x54,0x5d,0x44,0x47,0x4f,0x3a,0x3e,0x46,0x37,0x3a,0x42,0x34,0x37,0x40, 0x2c,0x2f,0x39,0x25,0x27,0x2f,0x1b,0x1e,0x25,0x14,0x16,0x1c,0x11,0x12,0x18,0x0f, 0x11,0x16,0x0f,0x11,0x16,0x0e,0x10,0x15,0x0e,0x10,0x15,0x0d,0x0e,0x12,0x0d,0x0e, 0x12,0x0b,0x0d,0x11,0x0a,0x0b,0x0e,0x09,0x0a,0x0d,0x07,0x08,0x0a,0x06,0x06,0x09, 0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x21,0x21,0x21,0xe1,0xe1,0xe1,0xff,0xff, 0xff,0xff,0xff,0xff,0xf9,0xf9,0xf9,0x9e,0x9e,0x9e,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,0xef,0xef,0xef,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0x7f,0x52,0x52,0x52,0xf2,0xf2,0xf2,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xde,0xde,0xde,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xbb,0xbb,0xbb,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,0x39,0x3a,0x40,0x52,0x54, 0x7e,0x5f,0x47,0x63,0x5d,0x46,0x60,0x62,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5d,0x51,0x74,0x49,0x3f,0x5a,0x22, 0x1d,0x2a,0xcd,0xcd,0xcd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x36,0x33, 0x3a,0x33,0x2c,0x3f,0x2e,0x28,0x39,0x67,0x66,0x6a,0xfa,0xfa,0xfa,0xff,0xff,0xff, 0xfd,0xfd,0xfd,0x88,0x87,0x8a,0x2e,0x29,0x3b,0x50,0x47,0x67,0x5d,0x52,0x78,0x60, 0x53,0x77,0x64,0x4f,0x6d,0x64,0x53,0x75,0x52,0x5f,0x85,0x1e,0x20,0x27,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,0x2b,0x20, 0x27,0x1a,0x12,0x15,0x17,0x0f,0x11,0x1b,0x12,0x15,0x22,0x18,0x1c,0x2a,0x1e,0x24, 0x2e,0x21,0x28,0x32,0x25,0x2d,0x31,0x24,0x2c,0x32,0x25,0x2d,0x2d,0x21,0x28,0x46, 0x3e,0x42,0xcb,0xd0,0xdd,0x81,0x8b,0xab,0x67,0x74,0x99,0x5c,0x67,0x90,0x47,0x51, 0x73,0x42,0x4c,0x6f,0x60,0x5f,0x8c,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,0x24,0x26,0x2b,0x9a,0xa3,0xbc,0x84,0x8e,0xad,0x6c,0x77, 0x9c,0x5f,0x6b,0x92,0x5f,0x6b,0x92,0x6b,0x76,0x9b,0x7a,0x84,0xa5,0x83,0x8d,0xac, 0x8a,0x94,0xb1,0xe0,0xe4,0xea,0x85,0x7f,0x82,0x42,0x33,0x3e,0x58,0x46,0x56,0x78, 0x69,0x86,0x18,0x1a,0x21,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,0x03,0x03,0x04, 0x4d,0x43,0x5f,0x52,0x3e,0x56,0x51,0x3c,0x55,0x5a,0x42,0x5c,0x5a,0x42,0x5c,0x5a, 0x42,0x5c,0x5b,0x43,0x5d,0x5b,0x43,0x5d,0x5c,0x44,0x5e,0x5b,0x43,0x5d,0x5c,0x44, 0x5f,0x5c,0x44,0x5f,0x5c,0x44,0x5f,0x53,0x3d,0x56,0x46,0x33,0x4b,0x59,0x47,0x67, 0x4f,0x55,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x03,0x04,0x04, 0x04,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06, 0x06,0x07,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x07,0x09,0x08,0x09, 0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0b,0x0c,0x0e,0x0d,0x0e,0x10,0x0e,0x0e,0x11, 0x0f,0x10,0x12,0x11,0x12,0x15,0x12,0x13,0x17,0x14,0x16,0x1a,0x16,0x18,0x1c,0x17, 0x19,0x1e,0x19,0x1b,0x20,0x1b,0x1d,0x22,0x1e,0x20,0x26,0x1e,0x20,0x2b,0x23,0x23, 0x30,0x21,0x23,0x2e,0x20,0x20,0x2b,0x1f,0x1e,0x2a,0x23,0x20,0x2a,0x29,0x22,0x2a, 0x29,0x21,0x2a,0x27,0x20,0x27,0x4d,0x3e,0x4c,0x5e,0x4f,0x5e,0x50,0x4d,0x63,0x42, 0x39,0x4d,0x47,0x3d,0x53,0x4c,0x42,0x59,0x4f,0x44,0x5d,0x4c,0x42,0x5c,0x4d,0x43, 0x5c,0x4c,0x42,0x5b,0x4d,0x43,0x5c,0x4f,0x44,0x5d,0x4f,0x45,0x5c,0x53,0x4b,0x68, 0x4d,0x49,0x68,0x4f,0x49,0x69,0x4f,0x4c,0x6b,0x4c,0x4b,0x6c,0x4c,0x4d,0x69,0x53, 0x55,0x6b,0x59,0x5a,0x72,0x56,0x57,0x6c,0x39,0x3b,0x43,0x37,0x3a,0x42,0x37,0x3a, 0x42,0x3e,0x41,0x49,0x48,0x4a,0x50,0x4f,0x51,0x56,0x54,0x55,0x5a,0x4a,0x4b,0x4f, 0x48,0x49,0x4c,0x43,0x45,0x4a,0x41,0x43,0x49,0x3f,0x42,0x4b,0x3d,0x41,0x4b,0x3a, 0x3e,0x49,0x3d,0x40,0x4a,0x3e,0x42,0x4b,0x3a,0x3d,0x46,0x36,0x38,0x40,0x30,0x32, 0x3a,0x2b,0x2e,0x36,0x2a,0x2e,0x36,0x26,0x29,0x31,0x1e,0x21,0x28,0x1a,0x1b,0x22, 0x19,0x1a,0x20,0x14,0x16,0x1b,0x11,0x12,0x17,0x10,0x12,0x16,0x0f,0x11,0x16,0x0e, 0x10,0x15,0x0e,0x0e,0x13,0x0e,0x0f,0x14,0x0d,0x0e,0x12,0x0a,0x0b,0x0f,0x09,0x0a, 0x0d,0x06,0x06,0x09,0x06,0x06,0x07,0x04,0x04,0x06,0x03,0x03,0x05,0x02,0x02,0x03, 0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x3f,0x3f,0x3f,0xe6,0xe6,0xe6,0xff, 0xff,0xff,0xff,0xff,0xff,0xf5,0xf5,0xf5,0x8a,0x8a,0x8a,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,0x60,0x60,0x60,0xfd,0xfd,0xfd, 0xff,0xff,0xff,0xfd,0xfd,0xfd,0xf9,0xf9,0xf9,0x73,0x73,0x73,0xea,0xea,0xea,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xed,0xed,0xed,0x32,0x32,0x32,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,0xbb,0xbb,0xbb,0xff,0xff, 0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x58,0x5c,0x6f,0x5d,0x52,0x79,0x58,0x40,0x5a,0x64,0x4c,0x6a,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x54,0x48,0x68, 0x32,0x2b,0x3e,0x6f,0x6e,0x71,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7d, 0x7c,0x7e,0x28,0x23,0x31,0x35,0x2e,0x42,0x1d,0x19,0x24,0xdd,0xdd,0xdd,0xff,0xff, 0xff,0xff,0xff,0xff,0xe5,0xe5,0xe6,0x1c,0x18,0x24,0x42,0x3b,0x55,0x5a,0x4f,0x74, 0x60,0x53,0x77,0x5e,0x53,0x79,0x60,0x53,0x77,0x64,0x4f,0x6d,0x64,0x52,0x72,0x52, 0x5d,0x84,0x1a,0x1c,0x21,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,0x1f,0x17,0x1d,0x28,0x1d,0x23,0x22,0x18,0x1c,0x26,0x1b,0x20,0x2d,0x20, 0x27,0x30,0x23,0x2a,0x33,0x26,0x2e,0x33,0x26,0x2e,0x32,0x25,0x2d,0x33,0x26,0x2e, 0x31,0x24,0x2b,0x27,0x1c,0x22,0xac,0xac,0xb3,0x8b,0x95,0xb2,0x6c,0x79,0x9c,0x5f, 0x6b,0x92,0x50,0x5a,0x80,0x41,0x4a,0x6a,0x54,0x5e,0x89,0x18,0x16,0x1f,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,0x04,0x04,0x04,0x97,0xa1,0xb8,0x8a, 0x94,0xb1,0x75,0x81,0xa2,0x67,0x73,0x99,0x6a,0x75,0x9a,0x71,0x7c,0xa0,0x80,0x8a, 0xaa,0x89,0x93,0xb0,0x91,0x9a,0xb5,0xd9,0xdd,0xe6,0x8b,0x86,0x8a,0x40,0x30,0x3b, 0x58,0x46,0x56,0x78,0x66,0x80,0x3a,0x3f,0x50,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,0x13,0x15,0x1d,0x5e,0x4b,0x69,0x4c,0x36,0x4e,0x54,0x3d,0x57, 0x5c,0x45,0x5f,0x5c,0x44,0x5f,0x5c,0x44,0x5e,0x5c,0x44,0x5f,0x5c,0x44,0x5e,0x5b, 0x44,0x5e,0x5c,0x44,0x5f,0x5d,0x45,0x61,0x5d,0x45,0x61,0x5b,0x44,0x5f,0x51,0x3f, 0x55,0x43,0x32,0x46,0x4f,0x4a,0x71,0x60,0x65,0x71,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03, 0x04,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x04,0x04,0x03,0x04,0x04,0x03,0x04,0x04, 0x07,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06, 0x06,0x08,0x06,0x07,0x09,0x07,0x08,0x0a,0x09,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b, 0x0d,0x0c,0x0d,0x0e,0x0d,0x0e,0x10,0x0e,0x0f,0x12,0x11,0x12,0x15,0x12,0x14,0x17, 0x14,0x16,0x1a,0x14,0x16,0x1a,0x16,0x17,0x1c,0x18,0x1a,0x1e,0x1a,0x1b,0x22,0x1c, 0x1d,0x27,0x1f,0x1f,0x2a,0x20,0x1f,0x2a,0x22,0x1f,0x2a,0x1b,0x1b,0x24,0x17,0x17, 0x1f,0x20,0x1c,0x23,0x20,0x1a,0x20,0x25,0x1c,0x23,0x4e,0x3d,0x4d,0x65,0x5b,0x6c, 0x4f,0x4c,0x66,0x47,0x3f,0x56,0x4e,0x44,0x5f,0x4c,0x42,0x5c,0x4a,0x41,0x5a,0x49, 0x40,0x59,0x49,0x41,0x5c,0x49,0x41,0x5b,0x4b,0x41,0x5c,0x4d,0x43,0x5d,0x50,0x45, 0x5f,0x54,0x49,0x64,0x54,0x4b,0x68,0x55,0x4d,0x69,0x58,0x4e,0x6b,0x58,0x4f,0x6c, 0x4d,0x47,0x63,0x42,0x41,0x5d,0x4f,0x51,0x6b,0x4c,0x4e,0x60,0x35,0x37,0x3e,0x33, 0x36,0x3e,0x33,0x36,0x3e,0x36,0x39,0x40,0x3b,0x3d,0x43,0x3f,0x41,0x46,0x3f,0x41, 0x46,0x39,0x3a,0x3f,0x3a,0x3c,0x42,0x39,0x3a,0x41,0x36,0x38,0x3f,0x3a,0x3d,0x45, 0x30,0x33,0x3d,0x29,0x2b,0x34,0x2d,0x30,0x3a,0x32,0x36,0x40,0x32,0x36,0x3f,0x2c, 0x2e,0x37,0x27,0x2a,0x32,0x24,0x27,0x2e,0x24,0x27,0x30,0x22,0x25,0x2e,0x1e,0x21, 0x28,0x1f,0x22,0x29,0x1e,0x21,0x26,0x1b,0x1e,0x23,0x15,0x16,0x1c,0x12,0x13,0x18, 0x11,0x12,0x18,0x11,0x12,0x18,0x11,0x12,0x17,0x12,0x14,0x19,0x12,0x14,0x1a,0x0f, 0x11,0x16,0x0c,0x0e,0x12,0x09,0x0a,0x0c,0x06,0x06,0x08,0x05,0x05,0x06,0x03,0x03, 0x05,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x62,0x62,0x62,0xf0,0xf0,0xf0, 0xff,0xff,0xff,0xfd,0xfd,0xfd,0xf3,0xf3,0xf3,0x5f,0x5f,0x5f,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,0xbf,0xbf, 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xdb,0xdb,0xd8,0xd8,0xd8, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf6,0xf6,0xf6,0x50,0x50,0x50,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,0xbb, 0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x06,0x06,0x06,0x5c,0x64,0x84,0x64,0x4d,0x6b,0x56, 0x3e,0x57,0x64,0x53,0x75,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5b,0x4f, 0x71,0x43,0x3a,0x53,0x29,0x26,0x30,0xdd,0xdd,0xde,0xff,0xff,0xff,0xff,0xff,0xff, 0xee,0xee,0xee,0x27,0x25,0x2d,0x34,0x2d,0x41,0x2c,0x26,0x37,0x84,0x83,0x86,0xfa, 0xfa,0xfa,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x7e,0x7d,0x81,0x31,0x2b,0x3d,0x53,0x48, 0x67,0x5d,0x52,0x78,0x5e,0x53,0x79,0x60,0x53,0x77,0x60,0x53,0x77,0x63,0x53,0x77, 0x64,0x4c,0x69,0x64,0x53,0x73,0x52,0x5b,0x80,0x16,0x17,0x1b,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,0x07,0x06,0x07,0x3c,0x2d,0x37,0x30,0x23,0x2a,0x32, 0x24,0x2c,0x34,0x27,0x2f,0x34,0x27,0x2f,0x37,0x29,0x32,0x36,0x28,0x31,0x36,0x28, 0x30,0x35,0x27,0x2f,0x34,0x26,0x2e,0x2d,0x21,0x28,0x5a,0x54,0x58,0x9f,0xa7,0xbf, 0x71,0x7c,0xa0,0x60,0x6d,0x94,0x58,0x64,0x8c,0x43,0x4c,0x6e,0x4d,0x56,0x7d,0x3f, 0x3a,0x53,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, 0x7b,0x82,0x93,0x94,0x9d,0xb8,0x82,0x8c,0xab,0x77,0x82,0xa4,0x7a,0x85,0xa5,0x7d, 0x88,0xa8,0x86,0x91,0xaf,0x8d,0x98,0xb3,0x92,0x9b,0xb5,0xc1,0xc7,0xd6,0x97,0x91, 0x95,0x41,0x31,0x3d,0x57,0x44,0x55,0x75,0x60,0x79,0x4a,0x51,0x67,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,0x2c,0x33,0x47,0x5a,0x45, 0x5f,0x4b,0x36,0x4e,0x58,0x40,0x5b,0x5c,0x44,0x5f,0x5d,0x45,0x5f,0x5d,0x45,0x5f, 0x5d,0x45,0x5f,0x5d,0x45,0x60,0x5d,0x45,0x60,0x5d,0x45,0x60,0x5d,0x45,0x61,0x5e, 0x46,0x62,0x5b,0x44,0x5e,0x52,0x3d,0x56,0x43,0x32,0x47,0x4e,0x4c,0x74,0x5a,0x5f, 0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02, 0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x06,0x04,0x04,0x05,0x04,0x05,0x06, 0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x07,0x08,0x0a,0x08, 0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0d,0x0e,0x10,0x0f,0x10, 0x13,0x10,0x11,0x14,0x11,0x12,0x16,0x13,0x15,0x18,0x13,0x15,0x19,0x16,0x17,0x1c, 0x18,0x1a,0x1e,0x18,0x1a,0x21,0x19,0x1b,0x23,0x18,0x1a,0x22,0x16,0x19,0x20,0x14, 0x16,0x1c,0x12,0x13,0x19,0x11,0x11,0x16,0x1a,0x16,0x1d,0x36,0x2b,0x35,0x52,0x41, 0x51,0x62,0x5d,0x73,0x4f,0x4a,0x65,0x4c,0x44,0x5d,0x52,0x49,0x66,0x50,0x48,0x63, 0x4e,0x47,0x62,0x4c,0x46,0x62,0x47,0x43,0x61,0x49,0x44,0x61,0x4c,0x44,0x60,0x4d, 0x45,0x60,0x50,0x46,0x62,0x53,0x49,0x64,0x54,0x4b,0x68,0x55,0x4c,0x68,0x57,0x4c, 0x68,0x58,0x4c,0x68,0x50,0x45,0x5d,0x4e,0x46,0x5f,0x45,0x43,0x5f,0x3e,0x3f,0x4f, 0x2f,0x32,0x3a,0x31,0x33,0x3b,0x30,0x32,0x3a,0x2c,0x2e,0x36,0x27,0x29,0x2f,0x2a, 0x2b,0x32,0x2d,0x2e,0x35,0x2b,0x2d,0x32,0x34,0x36,0x3c,0x3a,0x3d,0x43,0x3c,0x3e, 0x46,0x3d,0x3e,0x46,0x33,0x36,0x3e,0x27,0x2a,0x31,0x2a,0x2d,0x35,0x2a,0x2e,0x37, 0x2a,0x2d,0x36,0x26,0x2a,0x32,0x22,0x25,0x2d,0x1d,0x1f,0x28,0x1c,0x1e,0x28,0x1b, 0x1e,0x27,0x1c,0x1e,0x27,0x1c,0x1e,0x26,0x1c,0x1e,0x26,0x1c,0x1e,0x25,0x1d,0x1e, 0x25,0x17,0x19,0x1e,0x12,0x14,0x1a,0x13,0x15,0x1a,0x15,0x16,0x1c,0x18,0x1a,0x21, 0x1a,0x1c,0x23,0x16,0x17,0x1d,0x12,0x14,0x18,0x0b,0x0d,0x10,0x06,0x06,0x09,0x04, 0x04,0x06,0x03,0x03,0x05,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,0x72,0x72,0x72,0xf7,0xf7, 0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xed,0xed,0xed,0x63,0x63,0x63,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,0xf3,0xf3,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe6,0xe6, 0xe6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0x8e,0x8e,0x8e, 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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0x1f,0x1f,0x21, 0x51,0x59,0x82,0x5d,0x45,0x60,0x5e,0x46,0x62,0x64,0x53,0x76,0x60,0x53,0x77,0x5f, 0x52,0x76,0x50,0x45,0x63,0x2c,0x26,0x37,0x7d,0x7c,0x7e,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x7e,0x7d,0x80,0x29,0x24,0x33,0x34,0x2d,0x40,0x1a,0x17,0x21, 0xe5,0xe5,0xe6,0xff,0xff,0xff,0xff,0xff,0xff,0xd9,0xd9,0xd9,0x1f,0x1b,0x26,0x46, 0x3d,0x57,0x5c,0x50,0x72,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x64,0x53,0x76,0x63,0x4c,0x69,0x64,0x50,0x6f,0x52,0x5e,0x81, 0x0a,0x0a,0x0c,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,0x4b,0x4c, 0x52,0x19,0x19,0x20,0x06,0x05,0x06,0x00,0x00,0x00,0x02,0x02,0x02,0x40,0x31,0x3c, 0x3d,0x2e,0x38,0x3c,0x2d,0x37,0x3a,0x2b,0x35,0x3f,0x30,0x3b,0x3d,0x2e,0x38,0x39, 0x2b,0x34,0x39,0x2b,0x34,0x37,0x29,0x32,0x36,0x28,0x31,0x33,0x26,0x2e,0x26,0x1b, 0x20,0xa6,0xaa,0xb7,0x80,0x8a,0xaa,0x64,0x71,0x96,0x5b,0x67,0x8e,0x47,0x52,0x75, 0x47,0x4e,0x72,0x55,0x50,0x77,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,0x56,0x5b,0x65,0xa2,0xaa,0xc1,0x91,0x9a,0xb5,0x89,0x93,0xb1, 0x90,0x99,0xb4,0x9a,0xa2,0xbb,0x90,0x9a,0xb5,0x8e,0x99,0xb4,0x92,0x9b,0xb7,0xaf, 0xb5,0xc9,0xa2,0x9d,0xa0,0x40,0x30,0x3b,0x57,0x45,0x55,0x71,0x5c,0x73,0x52,0x5a, 0x75,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,0x02, 0x02,0x03,0x3f,0x3e,0x60,0x54,0x3e,0x58,0x4c,0x37,0x50,0x5c,0x44,0x5e,0x5d,0x45, 0x5f,0x5d,0x45,0x5f,0x5d,0x45,0x5f,0x5d,0x45,0x60,0x5e,0x46,0x60,0x5e,0x46,0x62, 0x5e,0x46,0x62,0x5f,0x47,0x63,0x5e,0x47,0x63,0x5f,0x47,0x64,0x4d,0x39,0x53,0x49, 0x38,0x4e,0x50,0x4e,0x79,0x50,0x54,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x04,0x04,0x03,0x04, 0x04,0x03,0x04,0x04,0x03,0x03,0x04,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x06,0x06, 0x06,0x07,0x08,0x07,0x07,0x09,0x09,0x0a,0x0b,0x09,0x0a,0x0b,0x0a,0x0b,0x0e,0x0b, 0x0c,0x0e,0x0d,0x0e,0x10,0x0e,0x0e,0x12,0x0f,0x10,0x13,0x11,0x12,0x16,0x12,0x14, 0x17,0x13,0x14,0x18,0x15,0x16,0x1a,0x16,0x18,0x1c,0x17,0x19,0x1e,0x17,0x1a,0x1e, 0x16,0x18,0x1e,0x14,0x16,0x1b,0x13,0x15,0x1a,0x11,0x12,0x18,0x13,0x13,0x1a,0x48, 0x3b,0x4b,0x56,0x47,0x59,0x5b,0x5f,0x7c,0x46,0x46,0x63,0x46,0x46,0x64,0x49,0x49, 0x69,0x48,0x48,0x67,0x46,0x45,0x65,0x44,0x46,0x66,0x44,0x46,0x65,0x44,0x43,0x64, 0x4c,0x47,0x66,0x4e,0x46,0x62,0x4f,0x45,0x61,0x53,0x49,0x65,0x55,0x4b,0x68,0x56, 0x4c,0x69,0x56,0x4d,0x6a,0x55,0x4c,0x69,0x4b,0x42,0x5c,0x4b,0x42,0x5c,0x49,0x44, 0x62,0x2e,0x30,0x3c,0x2d,0x30,0x39,0x2d,0x30,0x39,0x27,0x2a,0x32,0x22,0x23,0x2a, 0x1c,0x1e,0x23,0x1f,0x21,0x26,0x26,0x28,0x2e,0x2f,0x31,0x38,0x3d,0x3e,0x45,0x43, 0x46,0x4b,0x52,0x54,0x5a,0x5f,0x61,0x67,0x3a,0x3d,0x43,0x30,0x32,0x3b,0x29,0x2c, 0x35,0x26,0x2a,0x32,0x25,0x28,0x30,0x23,0x26,0x2e,0x1e,0x21,0x2a,0x1a,0x1b,0x24, 0x19,0x19,0x22,0x1a,0x1a,0x22,0x1a,0x1b,0x25,0x1a,0x1d,0x26,0x19,0x1b,0x23,0x1b, 0x1e,0x25,0x21,0x23,0x2a,0x1f,0x21,0x27,0x17,0x19,0x1e,0x15,0x16,0x1b,0x17,0x1a, 0x1f,0x1a,0x1d,0x23,0x1c,0x1e,0x25,0x1a,0x1c,0x22,0x18,0x1a,0x1e,0x0f,0x10,0x13, 0x06,0x07,0x0a,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x9b,0x9b,0x9b,0xf9, 0xf9,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xe5,0xe5,0xe5,0x3a,0x3a,0x3a,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,0x6a,0x6a,0x6a,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xfd, 0xfd,0xfd,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xc0,0xc0, 0xc0,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,0x40,0x40,0x48,0x55,0x50,0x79,0x58,0x41,0x5b,0x60,0x48,0x64, 0x60,0x53,0x77,0x5a,0x4e,0x70,0x3f,0x36,0x4e,0x36,0x33,0x3a,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xde,0xde,0xde,0x1c,0x18,0x23,0x34,0x2d,0x40,0x27,0x22, 0x30,0x9b,0x9b,0x9d,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xfa,0xfa,0xfa,0x6f,0x6d,0x71, 0x34,0x2d,0x41,0x55,0x4a,0x69,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x76,0x64,0x4d, 0x6b,0x64,0x53,0x74,0x58,0x62,0x83,0x07,0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x09,0x0b,0x3e, 0x31,0x3d,0xb9,0xbb,0xc9,0xb5,0xbc,0xcf,0x6d,0x76,0x92,0x20,0x24,0x34,0x05,0x04, 0x05,0x5c,0x49,0x5b,0x4a,0x39,0x46,0x44,0x34,0x40,0x43,0x33,0x3f,0x45,0x35,0x41, 0x40,0x31,0x3b,0x3f,0x30,0x3a,0x3d,0x2e,0x38,0x3c,0x2d,0x37,0x39,0x2b,0x34,0x38, 0x2a,0x33,0x2f,0x23,0x2a,0x6a,0x64,0x6a,0x99,0xa1,0xbb,0x6a,0x75,0x9a,0x5b,0x67, 0x90,0x4f,0x5a,0x7f,0x3f,0x47,0x68,0x5b,0x5a,0x85,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,0x28,0x2a,0x2f,0xaf,0xb5,0xca,0x9f,0xa8, 0xbf,0x96,0xa0,0xb9,0x9b,0xa3,0xbc,0xa3,0xab,0xc2,0x9f,0xa8,0xbf,0x96,0xa0,0xba, 0x95,0x9f,0xb9,0xa5,0xad,0xc4,0xa7,0xa3,0xa8,0x3f,0x30,0x3a,0x58,0x46,0x56,0x6a, 0x56,0x6b,0x5a,0x63,0x83,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,0x11,0x13,0x19,0x58,0x4c,0x70,0x4e,0x39,0x53,0x4f, 0x39,0x53,0x5d,0x45,0x60,0x5d,0x45,0x60,0x5e,0x46,0x60,0x5e,0x46,0x60,0x5e,0x46, 0x62,0x5f,0x47,0x63,0x5f,0x47,0x63,0x5f,0x47,0x63,0x5f,0x47,0x63,0x60,0x48,0x64, 0x5c,0x44,0x61,0x49,0x36,0x4d,0x51,0x40,0x5b,0x50,0x50,0x7d,0x47,0x4a,0x54,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,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04, 0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x09,0x08,0x09,0x0a, 0x08,0x09,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0c,0x0d,0x0f,0x0d,0x0e,0x11,0x0e, 0x0f,0x12,0x0f,0x11,0x14,0x12,0x13,0x16,0x13,0x14,0x18,0x15,0x16,0x1a,0x15,0x16, 0x1a,0x15,0x16,0x1b,0x16,0x17,0x1c,0x15,0x16,0x1b,0x13,0x15,0x1a,0x13,0x15,0x19, 0x1b,0x1a,0x21,0x52,0x48,0x5a,0x5e,0x55,0x67,0x58,0x61,0x7f,0x49,0x4c,0x67,0x51, 0x54,0x72,0x53,0x55,0x74,0x4b,0x4d,0x6f,0x49,0x49,0x6a,0x49,0x4c,0x6c,0x4c,0x4e, 0x6e,0x4a,0x4c,0x6d,0x48,0x47,0x69,0x50,0x4a,0x69,0x51,0x49,0x65,0x52,0x49,0x65, 0x54,0x4a,0x69,0x54,0x4c,0x6a,0x52,0x4b,0x6a,0x4c,0x48,0x67,0x3d,0x3b,0x57,0x3b, 0x3a,0x57,0x41,0x43,0x61,0x27,0x2a,0x32,0x2b,0x2e,0x37,0x29,0x2c,0x35,0x25,0x27, 0x2f,0x23,0x26,0x2e,0x22,0x25,0x2b,0x25,0x28,0x2e,0x32,0x34,0x3a,0x42,0x44,0x4a, 0x5c,0x5d,0x62,0x8e,0x8f,0x92,0xb7,0xb7,0xb9,0x9c,0x9c,0x9f,0x43,0x45,0x4c,0x32, 0x34,0x3d,0x26,0x2a,0x32,0x22,0x25,0x2e,0x21,0x23,0x2c,0x1e,0x22,0x2a,0x1b,0x1e, 0x27,0x1a,0x1a,0x23,0x1a,0x1a,0x22,0x1a,0x1a,0x24,0x1b,0x1d,0x26,0x1b,0x1e,0x27, 0x19,0x1b,0x24,0x19,0x1b,0x23,0x20,0x22,0x29,0x20,0x22,0x29,0x18,0x1a,0x1f,0x1a, 0x1b,0x20,0x16,0x18,0x1d,0x16,0x18,0x1e,0x1c,0x1e,0x22,0x1f,0x21,0x25,0x1d,0x1e, 0x22,0x16,0x18,0x1b,0x0a,0x0b,0x0e,0x04,0x05,0x06,0x03,0x03,0x04,0x02,0x02,0x02, 0x02,0x02,0x02,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,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,0xad,0xad,0xad, 0xfa,0xfa,0xfa,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xe2,0xe2,0xe2,0x15,0x15,0x15,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,0xc7,0xc7,0xc7,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5, 0xd5,0xd5,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,0x00,0x56,0x59,0x6c,0x64,0x52, 0x72,0x5a,0x41,0x5c,0x62,0x4f,0x6d,0x4e,0x44,0x61,0x2a,0x24,0x34,0x9d,0x9c,0x9e, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x70,0x6e,0x72,0x2c,0x26,0x37,0x30, 0x29,0x3b,0x27,0x25,0x2c,0xf4,0xf4,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xce,0xce, 0xce,0x22,0x1d,0x2a,0x49,0x3f,0x5a,0x5d,0x51,0x74,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62, 0x53,0x77,0x64,0x53,0x76,0x64,0x4f,0x6e,0x57,0x50,0x79,0x66,0x73,0x97,0x0b,0x0c, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x04,0x05,0x47,0x3a,0x49,0x73,0x69,0x89, 0x68,0x69,0x8f,0x6a,0x56,0x6b,0xc5,0xc9,0xd7,0xa5,0xad,0xc3,0x5a,0x65,0x8e,0x65, 0x71,0x97,0x08,0x07,0x09,0x75,0x60,0x78,0x65,0x51,0x64,0x52,0x40,0x4f,0x4b,0x3a, 0x48,0x48,0x38,0x44,0x47,0x37,0x44,0x44,0x34,0x3f,0x41,0x32,0x3d,0x3f,0x30,0x3a, 0x3c,0x2e,0x38,0x3e,0x2f,0x39,0x37,0x29,0x32,0x2e,0x22,0x29,0xae,0xb2,0xc2,0x72, 0x7d,0xa0,0x5b,0x66,0x8e,0x51,0x5c,0x84,0x3a,0x43,0x60,0x4d,0x52,0x7b,0x14,0x13, 0x19,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,0x02,0x02,0x02,0xa5, 0xab,0xbd,0xab,0xb3,0xc8,0x9d,0xa5,0xbe,0x9c,0xa5,0xbe,0xa9,0xb0,0xc6,0xa7,0xaf, 0xc4,0x9d,0xa7,0xbf,0x99,0xa2,0xbb,0xa3,0xab,0xc2,0xb5,0xb3,0xba,0x3c,0x2d,0x37, 0x58,0x46,0x56,0x69,0x55,0x6a,0x64,0x68,0x8c,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,0x28,0x2d,0x3f, 0x5b,0x48,0x66,0x46,0x34,0x49,0x56,0x3f,0x5a,0x5e,0x46,0x62,0x5d,0x46,0x60,0x5e, 0x46,0x62,0x5e,0x46,0x62,0x5e,0x46,0x62,0x5f,0x47,0x63,0x5f,0x47,0x63,0x60,0x48, 0x64,0x60,0x48,0x64,0x60,0x48,0x65,0x55,0x40,0x58,0x46,0x35,0x4b,0x56,0x44,0x5f, 0x51,0x50,0x7d,0x42,0x44,0x4b,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x05,0x06,0x05,0x05,0x06,0x06,0x06, 0x07,0x07,0x07,0x09,0x07,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0c,0x0b,0x0c,0x0e, 0x0c,0x0d,0x0f,0x0d,0x0e,0x11,0x0e,0x0e,0x12,0x0f,0x10,0x13,0x11,0x12,0x15,0x12, 0x13,0x16,0x14,0x16,0x19,0x13,0x15,0x19,0x14,0x15,0x19,0x13,0x15,0x19,0x13,0x15, 0x19,0x13,0x15,0x19,0x30,0x2c,0x36,0x58,0x4c,0x5d,0x76,0x74,0x86,0x54,0x5c,0x7b, 0x4d,0x4e,0x69,0x57,0x59,0x77,0x57,0x59,0x78,0x4c,0x50,0x72,0x52,0x4e,0x6f,0x4b, 0x4c,0x6e,0x50,0x51,0x73,0x4f,0x51,0x72,0x4b,0x4c,0x6e,0x4b,0x4a,0x6b,0x4c,0x49, 0x6a,0x4d,0x4a,0x6a,0x4c,0x49,0x6a,0x4c,0x49,0x69,0x49,0x47,0x68,0x45,0x44,0x64, 0x39,0x3a,0x56,0x3a,0x3d,0x56,0x45,0x47,0x63,0x27,0x2a,0x32,0x2b,0x2e,0x38,0x2a, 0x2e,0x37,0x27,0x2a,0x34,0x2d,0x30,0x3a,0x32,0x35,0x3e,0x37,0x3a,0x42,0x47,0x4a, 0x4f,0x67,0x68,0x6b,0xb1,0xb1,0xb3,0xc1,0xc2,0xc3,0x9a,0x9b,0x9e,0x6a,0x6c,0x72, 0x34,0x37,0x40,0x2a,0x2d,0x36,0x22,0x24,0x2e,0x1d,0x20,0x29,0x1a,0x1d,0x26,0x1a, 0x1a,0x22,0x1a,0x1a,0x22,0x1b,0x1a,0x22,0x1b,0x1a,0x22,0x19,0x19,0x22,0x19,0x1a, 0x23,0x18,0x1a,0x22,0x16,0x16,0x1e,0x15,0x16,0x1d,0x16,0x18,0x1e,0x17,0x19,0x1e, 0x18,0x1a,0x1e,0x21,0x22,0x26,0x15,0x16,0x1a,0x12,0x13,0x17,0x17,0x18,0x1c,0x1e, 0x20,0x24,0x22,0x22,0x26,0x1d,0x1e,0x22,0x10,0x12,0x15,0x07,0x08,0x0a,0x03,0x04, 0x05,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0xba,0xba, 0xba,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xc9,0xc9,0xc9,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,0xf3,0xf3,0xf3,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xe4,0xe4,0xe4,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,0x00,0x00,0x00,0x00,0x06, 0x06,0x06,0x54,0x5c,0x7b,0x62,0x4a,0x66,0x59,0x43,0x5c,0x49,0x3d,0x56,0x5a,0x57, 0x60,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xce,0xcd,0xce,0x20,0x1c,0x28, 0x34,0x2d,0x41,0x23,0x1e,0x2b,0xb4,0xb4,0xb5,0xff,0xff,0xff,0xff,0xff,0xff,0xfc, 0xfc,0xfc,0x4c,0x4a,0x4f,0x36,0x2f,0x43,0x57,0x4b,0x6b,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x53,0x77, 0x62,0x53,0x77,0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x52,0x71,0x54, 0x50,0x79,0x24,0x28,0x38,0x30,0x27,0x31,0x6c,0x5e,0x77,0x68,0x6d,0x93,0x75,0x69, 0x89,0x60,0x4c,0x5f,0x40,0x31,0x3b,0x4a,0x3b,0x47,0xc8,0xcd,0xda,0x83,0x8e,0xac, 0x52,0x52,0x7d,0x57,0x62,0x8b,0x1f,0x1e,0x28,0x75,0x61,0x79,0x6a,0x56,0x6b,0x65, 0x51,0x65,0x5c,0x49,0x5a,0x50,0x3f,0x4d,0x4a,0x39,0x46,0x49,0x38,0x46,0x46,0x36, 0x42,0x45,0x35,0x41,0x41,0x32,0x3d,0x3f,0x30,0x3b,0x3d,0x2e,0x39,0x33,0x26,0x2e, 0x71,0x6d,0x76,0x7c,0x86,0xa7,0x5b,0x66,0x8e,0x54,0x5f,0x88,0x3e,0x43,0x63,0x44, 0x46,0x6a,0x3f,0x3a,0x52,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,0x73,0x77,0x83,0xb1,0xb8,0xcb,0xa3,0xab,0xc2,0xa3,0xab,0xc2,0xa7, 0xaf,0xc4,0xa7,0xaf,0xc4,0x9d,0xa7,0xbf,0x9c,0xa4,0xbe,0x9c,0xa5,0xbe,0xc9,0xcc, 0xd5,0x3a,0x2c,0x35,0x59,0x46,0x57,0x6a,0x56,0x6b,0x68,0x68,0x8e,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,0x3d,0x3d,0x5d,0x53,0x3e,0x58,0x48,0x35,0x4d,0x5c,0x45,0x5f, 0x5e,0x46,0x62,0x5f,0x47,0x63,0x5e,0x46,0x62,0x5f,0x47,0x63,0x5f,0x47,0x63,0x5f, 0x47,0x63,0x5f,0x47,0x63,0x60,0x48,0x64,0x60,0x48,0x65,0x60,0x48,0x65,0x53,0x3c, 0x57,0x4c,0x38,0x50,0x5a,0x45,0x60,0x4f,0x4d,0x79,0x42,0x42,0x43,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x04, 0x05,0x06,0x04,0x04,0x05,0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x08,0x09, 0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0c,0x0d,0x0f,0x0c,0x0e,0x10,0x0e,0x0e,0x12, 0x0e,0x10,0x12,0x0f,0x10,0x13,0x10,0x12,0x15,0x12,0x12,0x16,0x12,0x13,0x16,0x12, 0x13,0x17,0x12,0x13,0x17,0x12,0x14,0x18,0x47,0x3e,0x4c,0x58,0x4c,0x5c,0x6c,0x71, 0x8c,0x4d,0x55,0x74,0x4b,0x4f,0x6e,0x52,0x56,0x77,0x54,0x56,0x77,0x50,0x53,0x75, 0x4c,0x4e,0x70,0x4d,0x50,0x73,0x51,0x54,0x75,0x50,0x51,0x73,0x4b,0x4d,0x71,0x51, 0x4d,0x6e,0x49,0x4a,0x6d,0x49,0x4a,0x6c,0x49,0x4a,0x6c,0x4a,0x49,0x6c,0x49,0x49, 0x6b,0x43,0x44,0x64,0x3a,0x3a,0x57,0x3a,0x3b,0x56,0x41,0x42,0x60,0x22,0x26,0x2f, 0x2b,0x2e,0x39,0x30,0x33,0x3e,0x32,0x36,0x42,0x34,0x37,0x42,0x38,0x3b,0x43,0x46, 0x48,0x4f,0x6d,0x6f,0x73,0x93,0x94,0x96,0xbb,0xbb,0xbc,0xb8,0xb9,0xbb,0x8e,0x8f, 0x93,0x52,0x54,0x5c,0x2a,0x2d,0x36,0x25,0x28,0x32,0x1f,0x22,0x2b,0x1a,0x1e,0x26, 0x19,0x19,0x22,0x1a,0x1a,0x22,0x1c,0x1a,0x22,0x1b,0x1a,0x22,0x19,0x18,0x21,0x16, 0x16,0x1e,0x15,0x16,0x1d,0x12,0x12,0x1a,0x12,0x11,0x17,0x10,0x10,0x16,0x0e,0x0e, 0x13,0x0e,0x0e,0x13,0x0e,0x0f,0x12,0x11,0x12,0x16,0x0e,0x0e,0x12,0x0d,0x0e,0x11, 0x11,0x12,0x16,0x1c,0x1d,0x21,0x21,0x22,0x26,0x1b,0x1c,0x20,0x16,0x17,0x1b,0x0d, 0x0e,0x11,0x05,0x06,0x06,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x18,0x18,0x18,0xd2, 0xd2,0xd2,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xc1,0xc1,0xc1,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,0x4c,0x4c,0x4c,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xf4,0xf4,0xf4,0x3e,0x3e,0x3e,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,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x1b,0x1c,0x50,0x59,0x80,0x5a,0x42,0x5c,0x4f, 0x3b,0x53,0x35,0x2c,0x3d,0x1d,0x19,0x24,0x18,0x15,0x1e,0x1a,0x17,0x21,0x25,0x20, 0x2e,0x34,0x2d,0x41,0x2e,0x28,0x39,0x4e,0x4c,0x51,0xf9,0xf9,0xf9,0xff,0xff,0xff, 0xff,0xff,0xff,0xc5,0xc4,0xc5,0x23,0x1e,0x2b,0x4a,0x40,0x5c,0x5e,0x51,0x74,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x53, 0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x53,0x75,0x64,0x53,0x75, 0x64,0x53,0x75,0x63,0x50,0x6e,0x5f,0x5e,0x81,0x78,0x69,0x88,0x60,0x4d,0x5f,0x35, 0x27,0x30,0x37,0x29,0x32,0x3b,0x2c,0x36,0x3f,0x2f,0x3a,0x61,0x55,0x61,0xca,0xcf, 0xdd,0x5f,0x6b,0x92,0x64,0x53,0x75,0x52,0x54,0x7e,0x61,0x68,0x85,0x74,0x60,0x78, 0x68,0x54,0x69,0x67,0x53,0x67,0x67,0x53,0x67,0x65,0x51,0x64,0x56,0x44,0x54,0x4d, 0x3b,0x49,0x4a,0x39,0x47,0x48,0x37,0x44,0x46,0x36,0x42,0x44,0x34,0x40,0x44,0x34, 0x40,0x3a,0x2c,0x35,0x34,0x29,0x30,0x7c,0x86,0xa3,0x5b,0x66,0x8e,0x53,0x5e,0x88, 0x43,0x47,0x6b,0x40,0x40,0x63,0x54,0x50,0x76,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,0x3e,0x41,0x48,0xb2,0xb9,0xcc,0xaa,0xb2,0xc7, 0xa3,0xab,0xc2,0xa5,0xad,0xc4,0xa5,0xad,0xc3,0x9c,0xa5,0xbe,0x99,0xa2,0xbb,0x99, 0xa1,0xbb,0xcf,0xd3,0xdf,0x45,0x38,0x40,0x5a,0x47,0x58,0x6a,0x56,0x6b,0x68,0x66, 0x8c,0x03,0x04,0x04,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,0x0d,0x0e,0x13,0x54,0x49,0x6d,0x4d,0x38, 0x51,0x4e,0x39,0x53,0x5d,0x46,0x62,0x5f,0x47,0x64,0x5f,0x48,0x64,0x5f,0x47,0x64, 0x60,0x48,0x64,0x5f,0x48,0x64,0x60,0x48,0x64,0x60,0x48,0x65,0x62,0x4a,0x66,0x60, 0x48,0x65,0x62,0x4a,0x66,0x50,0x3c,0x55,0x4e,0x38,0x52,0x5b,0x46,0x62,0x4d,0x54, 0x7e,0x39,0x39,0x3a,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03, 0x02,0x03,0x04,0x02,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x06,0x06,0x06, 0x07,0x08,0x06,0x06,0x08,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0b,0x0d,0x0b,0x0c, 0x0e,0x0c,0x0d,0x0f,0x0e,0x0e,0x11,0x0e,0x0e,0x12,0x0f,0x10,0x13,0x0f,0x11,0x14, 0x0f,0x11,0x14,0x11,0x12,0x16,0x12,0x12,0x16,0x15,0x16,0x1b,0x56,0x48,0x5a,0x59, 0x4b,0x5b,0x5a,0x64,0x85,0x48,0x4c,0x6d,0x4e,0x51,0x73,0x50,0x54,0x77,0x50,0x53, 0x76,0x50,0x54,0x77,0x50,0x54,0x76,0x50,0x53,0x75,0x50,0x53,0x75,0x4f,0x51,0x74, 0x4f,0x51,0x73,0x4c,0x4d,0x71,0x4f,0x50,0x72,0x4d,0x50,0x71,0x4c,0x4d,0x6f,0x4c, 0x4d,0x70,0x4c,0x4d,0x70,0x44,0x44,0x64,0x3b,0x3d,0x59,0x3b,0x3d,0x59,0x3d,0x3f, 0x5e,0x1e,0x20,0x29,0x22,0x26,0x2f,0x2b,0x2e,0x39,0x35,0x39,0x44,0x36,0x3a,0x43, 0x40,0x41,0x47,0x65,0x67,0x6b,0x86,0x88,0x8a,0x7e,0x7f,0x81,0xa4,0xa5,0xa7,0x87, 0x88,0x8c,0x4e,0x51,0x59,0x2b,0x2f,0x38,0x26,0x29,0x33,0x24,0x28,0x32,0x20,0x22, 0x2d,0x1a,0x1d,0x26,0x19,0x19,0x22,0x1e,0x1a,0x23,0x1b,0x19,0x22,0x19,0x18,0x21, 0x16,0x16,0x1e,0x13,0x16,0x1c,0x11,0x12,0x18,0x0e,0x0f,0x14,0x0e,0x0d,0x12,0x0b, 0x0b,0x0f,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x07,0x08,0x0a,0x08,0x09,0x0b,0x08,0x09, 0x0b,0x09,0x0a,0x0d,0x0b,0x0c,0x0e,0x0e,0x0f,0x12,0x12,0x14,0x17,0x16,0x17,0x1b, 0x16,0x18,0x1c,0x0f,0x10,0x13,0x07,0x07,0x09,0x02,0x02,0x03,0x02,0x02,0x02,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,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,0x1d,0x1d,0x1d, 0xe2,0xe2,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xf8,0xf8,0xa4,0xa4,0xa4,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, 0xa3,0xa3,0xa3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xf7,0xf7,0xf7,0x5f,0x5f,0x5f,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, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x37,0x3a, 0x53,0x4e,0x79,0x59,0x42,0x5c,0x52,0x3d,0x55,0x4e,0x40,0x5c,0x48,0x3e,0x59,0x49, 0x3f,0x5b,0x4b,0x41,0x5d,0x40,0x37,0x4f,0x20,0x1c,0x28,0xc6,0xc6,0xc7,0xfd,0xfd, 0xfd,0xff,0xff,0xff,0xf5,0xf5,0xf5,0x21,0x1e,0x25,0x38,0x31,0x46,0x57,0x4c,0x6c, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62, 0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x73,0x64,0x52,0x72,0x64,0x50, 0x71,0x64,0x52,0x72,0x64,0x52,0x72,0x4e,0x3b,0x4e,0x3a,0x2c,0x35,0x31,0x24,0x2b, 0x30,0x23,0x2b,0x33,0x25,0x2d,0x37,0x29,0x32,0x39,0x2b,0x34,0x3c,0x2d,0x37,0x78, 0x71,0x7c,0xc8,0xcc,0xda,0x52,0x54,0x7e,0x64,0x53,0x76,0x64,0x4c,0x69,0x67,0x72, 0x97,0x72,0x5e,0x75,0x67,0x53,0x68,0x66,0x52,0x66,0x68,0x54,0x68,0x69,0x55,0x6a, 0x69,0x55,0x6a,0x5f,0x4c,0x5e,0x4e,0x3c,0x4a,0x4b,0x3a,0x48,0x49,0x38,0x46,0x47, 0x37,0x44,0x46,0x36,0x42,0x42,0x32,0x3e,0x36,0x28,0x31,0x6b,0x6a,0x79,0x5d,0x69, 0x91,0x53,0x5e,0x88,0x4b,0x4d,0x75,0x42,0x42,0x64,0x56,0x53,0x7f,0x02,0x02,0x03, 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,0x06,0x07,0x07,0xac,0xb2, 0xc5,0xb1,0xb8,0xcb,0xad,0xb4,0xc9,0xb0,0xb7,0xca,0xb0,0xb7,0xca,0xa7,0xaf,0xc4, 0x98,0xa1,0xba,0x8c,0x95,0xb2,0xbf,0xc4,0xd5,0x66,0x5c,0x62,0x57,0x44,0x55,0x6a, 0x56,0x6b,0x68,0x66,0x8b,0x02,0x02,0x03,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,0x21, 0x26,0x34,0x5a,0x4a,0x69,0x4c,0x37,0x50,0x52,0x3c,0x55,0x5f,0x47,0x63,0x5f,0x47, 0x64,0x60,0x48,0x64,0x60,0x48,0x64,0x60,0x4a,0x65,0x60,0x48,0x64,0x62,0x4a,0x65, 0x60,0x48,0x65,0x62,0x4a,0x66,0x62,0x4a,0x66,0x60,0x48,0x65,0x50,0x3b,0x53,0x4b, 0x37,0x4f,0x5c,0x4b,0x67,0x4d,0x58,0x7f,0x31,0x32,0x33,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,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04, 0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x07,0x07,0x08,0x0a,0x09, 0x0a,0x0b,0x0a,0x0a,0x0d,0x0a,0x0b,0x0d,0x0b,0x0c,0x0e,0x0b,0x0c,0x0f,0x0d,0x0e, 0x10,0x0e,0x0e,0x12,0x0e,0x10,0x12,0x0e,0x10,0x12,0x0e,0x0f,0x13,0x2c,0x27,0x30, 0x57,0x49,0x5b,0x5f,0x55,0x68,0x52,0x5d,0x80,0x47,0x4a,0x69,0x4f,0x54,0x79,0x50, 0x54,0x78,0x50,0x54,0x77,0x50,0x54,0x78,0x50,0x54,0x77,0x50,0x53,0x77,0x4f,0x52, 0x76,0x50,0x53,0x78,0x50,0x53,0x76,0x50,0x52,0x75,0x50,0x52,0x76,0x50,0x53,0x75, 0x4f,0x50,0x73,0x50,0x51,0x74,0x4e,0x4f,0x72,0x44,0x46,0x64,0x3e,0x41,0x5d,0x3d, 0x3f,0x5c,0x3f,0x40,0x5d,0x1e,0x21,0x29,0x22,0x24,0x2e,0x29,0x2c,0x36,0x36,0x3a, 0x45,0x40,0x43,0x4c,0x4c,0x4f,0x54,0x63,0x63,0x68,0x5f,0x61,0x65,0x70,0x71,0x75, 0x67,0x6a,0x6e,0x3b,0x3e,0x45,0x2e,0x32,0x3b,0x28,0x2b,0x36,0x22,0x26,0x31,0x22, 0x26,0x31,0x1e,0x20,0x2b,0x1b,0x1b,0x25,0x1b,0x1a,0x22,0x1d,0x1a,0x22,0x1b,0x19, 0x21,0x16,0x16,0x1e,0x13,0x15,0x1b,0x12,0x13,0x1a,0x0e,0x10,0x15,0x0c,0x0d,0x11, 0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x07,0x07,0x0a,0x06,0x06,0x09,0x06,0x06,0x08,0x06, 0x06,0x08,0x06,0x06,0x09,0x06,0x07,0x09,0x07,0x08,0x0a,0x07,0x08,0x0a,0x09,0x0a, 0x0d,0x0e,0x0e,0x12,0x0f,0x11,0x14,0x0b,0x0c,0x0e,0x06,0x07,0x09,0x04,0x04,0x06, 0x02,0x02,0x02,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,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,0x52,0x52, 0x52,0xea,0xea,0xea,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xf7,0xf7,0xf7,0x9a,0x9a,0x9a, 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,0xbf,0xbf,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf9,0xf9,0xf9,0x73,0x73,0x73,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x52,0x53,0x5e,0x63,0x53,0x77,0x5c,0x44,0x5e,0x60,0x48,0x64, 0x64,0x53,0x76,0x60,0x53,0x77,0x55,0x4a,0x6a,0x35,0x2e,0x41,0x56,0x54,0x59,0xfa, 0xfa,0xfa,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xa8,0xa7,0xa9,0x28,0x22,0x31,0x4c,0x42, 0x5f,0x5e,0x51,0x74,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x74,0x64,0x50,0x71,0x64, 0x4e,0x6c,0x64,0x4c,0x69,0x64,0x4d,0x6b,0x63,0x4b,0x67,0x1d,0x13,0x17,0x48,0x37, 0x44,0x31,0x24,0x2b,0x2f,0x22,0x29,0x31,0x24,0x2c,0x34,0x27,0x2f,0x38,0x2a,0x33, 0x3b,0x2c,0x36,0x8f,0x8b,0x97,0xbc,0xc3,0xd3,0x55,0x50,0x79,0x52,0x50,0x7b,0x62, 0x4a,0x66,0x52,0x4f,0x7a,0x70,0x65,0x80,0x67,0x53,0x67,0x68,0x54,0x69,0x69,0x55, 0x6a,0x6b,0x56,0x6b,0x6a,0x55,0x6b,0x69,0x55,0x6a,0x67,0x53,0x67,0x57,0x44,0x55, 0x4e,0x3c,0x4a,0x4c,0x3b,0x49,0x4c,0x3b,0x48,0x4a,0x39,0x47,0x40,0x31,0x3b,0x44, 0x39,0x40,0x74,0x80,0xa1,0x52,0x5d,0x88,0x50,0x50,0x79,0x42,0x42,0x64,0x4a,0x48, 0x70,0x2c,0x28,0x38,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,0x79,0x7c,0x88,0xbb,0xc1,0xd2,0xba,0xc0,0xd1,0xbb,0xc1,0xd2,0xbf,0xc4, 0xd5,0xb5,0xbc,0xcf,0x9d,0xa7,0xbf,0x81,0x8b,0xaa,0xa4,0xac,0xc2,0x86,0x7f,0x84, 0x53,0x41,0x50,0x69,0x55,0x6a,0x75,0x69,0x89,0x05,0x05,0x06,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,0x39,0x41,0x5c,0x5d,0x4d,0x6c,0x48,0x35,0x4c,0x5a, 0x43,0x5d,0x60,0x48,0x65,0x60,0x48,0x64,0x60,0x48,0x65,0x60,0x4a,0x65,0x62,0x4a, 0x65,0x62,0x4a,0x65,0x60,0x4a,0x65,0x62,0x4a,0x66,0x62,0x4b,0x66,0x63,0x4b,0x67, 0x60,0x4a,0x65,0x4e,0x39,0x52,0x4c,0x38,0x52,0x60,0x4f,0x71,0x4e,0x58,0x7f,0x29, 0x2a,0x2d,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,0x02,0x02,0x02,0x02,0x03,0x04,0x03,0x03, 0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x05,0x05,0x06,0x06,0x06,0x07, 0x07,0x07,0x09,0x07,0x08,0x0a,0x08,0x09,0x0a,0x08,0x09,0x0a,0x0a,0x0a,0x0d,0x0a, 0x0b,0x0e,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0d,0x0e,0x11,0x0e,0x0e,0x12,0x0d,0x0e, 0x11,0x44,0x3a,0x48,0x57,0x49,0x5a,0x6d,0x6d,0x83,0x4f,0x59,0x7e,0x46,0x4e,0x6c, 0x50,0x58,0x7c,0x50,0x59,0x7d,0x4f,0x54,0x79,0x50,0x59,0x7c,0x50,0x54,0x78,0x50, 0x55,0x7a,0x50,0x55,0x7a,0x51,0x55,0x79,0x53,0x56,0x7a,0x54,0x57,0x7a,0x54,0x56, 0x78,0x53,0x55,0x77,0x52,0x54,0x76,0x52,0x53,0x76,0x51,0x52,0x75,0x44,0x45,0x64, 0x42,0x44,0x61,0x43,0x45,0x61,0x44,0x46,0x64,0x26,0x29,0x32,0x29,0x2c,0x36,0x32, 0x35,0x3f,0x3c,0x40,0x4a,0x4a,0x4d,0x55,0x4f,0x51,0x57,0x52,0x53,0x58,0x4c,0x4e, 0x53,0x42,0x45,0x4b,0x36,0x3a,0x42,0x2d,0x30,0x39,0x26,0x2a,0x34,0x22,0x25,0x30, 0x1f,0x22,0x2e,0x1f,0x21,0x2c,0x1e,0x1e,0x29,0x1b,0x1a,0x23,0x1e,0x1b,0x24,0x1e, 0x1a,0x22,0x1a,0x17,0x1e,0x17,0x16,0x1d,0x12,0x12,0x18,0x0f,0x11,0x16,0x0d,0x0e, 0x12,0x0a,0x0b,0x0f,0x09,0x0a,0x0c,0x06,0x06,0x09,0x06,0x06,0x08,0x06,0x06,0x07, 0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06,0x05,0x06,0x07,0x05, 0x05,0x06,0x05,0x06,0x07,0x06,0x07,0x09,0x09,0x0a,0x0b,0x0a,0x0a,0x0d,0x09,0x0a, 0x0b,0x08,0x09,0x0a,0x06,0x06,0x07,0x02,0x02,0x03,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,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,0x70, 0x70,0x70,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xf2,0xf2,0xf2,0x64,0x64, 0x64,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,0x89,0x89,0x89,0xfd,0xfd,0xfd,0xff,0xff, 0xff,0xff,0xff,0xff,0xf9,0xf9,0xf9,0x8c,0x8c,0x8c,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,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,0x67,0x6a,0x7d,0x64,0x52, 0x71,0x5d,0x45,0x5f,0x60,0x48,0x65,0x5f,0x50,0x73,0x46,0x3d,0x57,0x1f,0x1b,0x27, 0xd9,0xd9,0xd9,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xf1,0xf1,0x1f,0x1c,0x25,0x3d, 0x35,0x4c,0x59,0x4d,0x6f,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x62,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x50,0x71, 0x64,0x4e,0x6c,0x5b,0x45,0x5f,0x3d,0x2c,0x41,0x44,0x32,0x48,0x5d,0x45,0x60,0x2f, 0x23,0x2c,0x45,0x35,0x41,0x2b,0x1f,0x26,0x2d,0x21,0x28,0x31,0x24,0x2b,0x34,0x26, 0x2e,0x37,0x29,0x32,0x3a,0x2c,0x36,0xa2,0xa2,0xb0,0x9a,0xa3,0xbc,0x52,0x53,0x7d, 0x78,0x82,0xa2,0x52,0x4f,0x7a,0x63,0x4b,0x67,0x6b,0x72,0x95,0x69,0x55,0x6a,0x69, 0x55,0x6a,0x6a,0x55,0x6a,0x6a,0x55,0x6b,0x6b,0x56,0x6c,0x6b,0x56,0x6b,0x6a,0x55, 0x6a,0x68,0x54,0x69,0x60,0x4c,0x5f,0x52,0x40,0x4f,0x4e,0x3d,0x4b,0x4d,0x3c,0x4a, 0x4a,0x3a,0x47,0x3c,0x2d,0x37,0x8b,0x8a,0x96,0x5a,0x65,0x8e,0x52,0x52,0x7b,0x47, 0x46,0x6c,0x46,0x44,0x69,0x4c,0x46,0x64,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,0x3d,0x3e,0x44,0xc1,0xc7,0xd6,0xc4,0xca,0xd8,0xc2, 0xc8,0xd7,0xcf,0xd3,0xdf,0xca,0xcf,0xdb,0x8d,0x98,0xb3,0x5b,0x67,0x8e,0x55,0x60, 0x8a,0x80,0x7f,0x8c,0x4b,0x3a,0x48,0x68,0x54,0x68,0x78,0x69,0x87,0x1a,0x1c,0x22, 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,0x07,0x08,0x0a,0x4a,0x54,0x78, 0x56,0x46,0x64,0x4c,0x38,0x50,0x5f,0x48,0x63,0x62,0x4a,0x66,0x62,0x4a,0x66,0x62, 0x4a,0x66,0x62,0x4a,0x66,0x60,0x4a,0x65,0x62,0x4a,0x66,0x62,0x4a,0x66,0x63,0x4b, 0x67,0x63,0x4b,0x67,0x63,0x4b,0x69,0x62,0x4a,0x66,0x4f,0x3c,0x56,0x4f,0x3c,0x55, 0x62,0x50,0x74,0x50,0x5c,0x82,0x26,0x26,0x27,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,0x02, 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03, 0x04,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x07,0x08,0x0a,0x08,0x09,0x0a, 0x09,0x0a,0x0b,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0a,0x0a,0x0d,0x0b,0x0c,0x0e,0x0b, 0x0c,0x0e,0x15,0x14,0x19,0x57,0x49,0x5a,0x55,0x47,0x58,0x76,0x7d,0x97,0x4a,0x53, 0x75,0x48,0x51,0x72,0x50,0x59,0x7f,0x50,0x5a,0x7e,0x50,0x59,0x7e,0x51,0x5a,0x7e, 0x50,0x58,0x7b,0x50,0x58,0x7c,0x50,0x55,0x7a,0x51,0x57,0x7b,0x54,0x59,0x7d,0x56, 0x5a,0x7f,0x57,0x5b,0x7e,0x57,0x5a,0x7c,0x55,0x57,0x79,0x54,0x55,0x78,0x54,0x54, 0x77,0x44,0x46,0x62,0x44,0x46,0x62,0x48,0x4a,0x66,0x4a,0x4c,0x69,0x2f,0x33,0x3e, 0x34,0x38,0x42,0x3a,0x3e,0x49,0x43,0x46,0x50,0x4f,0x52,0x5a,0x52,0x55,0x5a,0x52, 0x53,0x58,0x45,0x46,0x4e,0x35,0x37,0x3f,0x2a,0x2d,0x36,0x22,0x25,0x2f,0x1f,0x22, 0x2d,0x1e,0x1e,0x2a,0x1e,0x1e,0x29,0x1e,0x1d,0x27,0x1e,0x1e,0x27,0x1e,0x1b,0x23, 0x1d,0x1a,0x21,0x1d,0x19,0x20,0x1a,0x16,0x1c,0x17,0x14,0x1a,0x11,0x10,0x16,0x0e, 0x0e,0x13,0x0b,0x0c,0x10,0x09,0x0a,0x0d,0x07,0x08,0x0a,0x06,0x06,0x08,0x05,0x05, 0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x04,0x05, 0x03,0x04,0x05,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x07,0x09,0x0a, 0x0a,0x0d,0x0c,0x0d,0x0f,0x0c,0x0d,0x0f,0x09,0x0a,0x0b,0x04,0x05,0x06,0x02,0x02, 0x02,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,0x02,0x02,0x02,0x02,0x02,0x02,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, 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, 0x70,0x70,0x70,0xf8,0xf8,0xf8,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xe8,0xe8,0xe8,0x4b, 0x4b,0x4b,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,0xc9, 0xc9,0xc9,0xf5,0xf5,0xf5,0xe9,0xe9,0xe9,0x76,0x76,0x76,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,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,0x06, 0x06,0x06,0x59,0x5f,0x7b,0x56,0x42,0x5b,0x53,0x3e,0x55,0x51,0x3d,0x55,0x32,0x2a, 0x3d,0x78,0x77,0x7a,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x9b,0x9a,0x9c, 0x2b,0x25,0x35,0x4f,0x44,0x62,0x5e,0x52,0x75,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x53,0x77,0x64,0x53,0x76,0x64,0x52, 0x72,0x64,0x4e,0x6c,0x62,0x4b,0x66,0x2e,0x20,0x32,0x2e,0x20,0x32,0x2c,0x1e,0x30, 0x22,0x17,0x23,0x43,0x34,0x40,0x3a,0x2c,0x36,0x2a,0x1e,0x24,0x2c,0x20,0x27,0x2e, 0x22,0x28,0x32,0x25,0x2d,0x35,0x27,0x2f,0x3a,0x2c,0x35,0xb7,0xbb,0xcb,0x66,0x73, 0x98,0x5d,0x6a,0x91,0x68,0x70,0x87,0x7c,0x85,0xa7,0x62,0x53,0x77,0x52,0x53,0x7e, 0x68,0x54,0x69,0x6c,0x57,0x6d,0x6b,0x56,0x6c,0x6c,0x57,0x6d,0x6c,0x58,0x6d,0x6c, 0x57,0x6d,0x6b,0x56,0x6c,0x6a,0x55,0x6a,0x69,0x54,0x69,0x67,0x53,0x68,0x59,0x46, 0x57,0x51,0x3f,0x4e,0x4f,0x3e,0x4c,0x47,0x37,0x44,0x54,0x49,0x50,0x79,0x83,0xa4, 0x52,0x54,0x7e,0x4e,0x4c,0x75,0x45,0x43,0x68,0x52,0x4e,0x76,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,0x07,0x07,0x08,0xbf,0xc2,0xce, 0xdb,0xdf,0xe8,0xd0,0xd5,0xe0,0x9d,0xa7,0xbf,0x69,0x75,0x9a,0x53,0x5e,0x88,0x52, 0x56,0x82,0x52,0x52,0x7d,0x6f,0x75,0x90,0x46,0x36,0x42,0x66,0x51,0x66,0x77,0x62, 0x7b,0x45,0x4b,0x5e,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,0x1e,0x20,0x26,0x4d,0x4d,0x77,0x4b,0x38,0x50,0x53,0x3d,0x56,0x62,0x4b,0x66, 0x62,0x4a,0x66,0x62,0x4a,0x66,0x62,0x4b,0x66,0x62,0x4a,0x66,0x62,0x4b,0x66,0x63, 0x4b,0x67,0x63,0x4b,0x67,0x63,0x4b,0x67,0x63,0x4b,0x69,0x64,0x4c,0x69,0x62,0x4b, 0x69,0x4d,0x3b,0x55,0x4e,0x3d,0x57,0x63,0x52,0x75,0x50,0x5d,0x81,0x21,0x22,0x23, 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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x04,0x02,0x02,0x03,0x03, 0x03,0x04,0x03,0x03,0x04,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x06,0x06,0x06,0x06, 0x07,0x07,0x07,0x09,0x07,0x08,0x0a,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x0a,0x0a,0x0d, 0x0a,0x0b,0x0e,0x0a,0x0b,0x0e,0x30,0x29,0x32,0x56,0x46,0x58,0x5a,0x4b,0x5c,0x6e, 0x79,0x98,0x44,0x4c,0x6a,0x4c,0x55,0x79,0x50,0x59,0x7f,0x50,0x5a,0x7f,0x50,0x59, 0x7f,0x50,0x5a,0x7e,0x50,0x5b,0x7e,0x51,0x58,0x7d,0x51,0x5a,0x7f,0x51,0x56,0x7d, 0x53,0x58,0x7d,0x55,0x5a,0x7f,0x58,0x5c,0x80,0x56,0x5b,0x7d,0x54,0x58,0x7a,0x55, 0x57,0x79,0x54,0x56,0x78,0x44,0x47,0x63,0x45,0x47,0x64,0x49,0x4b,0x68,0x49,0x4b, 0x65,0x2f,0x32,0x3c,0x35,0x38,0x42,0x3a,0x3e,0x47,0x44,0x47,0x50,0x4c,0x4e,0x56, 0x4d,0x4f,0x56,0x47,0x49,0x50,0x38,0x3b,0x44,0x2a,0x2e,0x37,0x1f,0x22,0x2d,0x1e, 0x1d,0x28,0x1e,0x1e,0x28,0x1e,0x1d,0x26,0x1e,0x1c,0x26,0x1e,0x1c,0x26,0x1f,0x1c, 0x24,0x1e,0x1a,0x22,0x1d,0x19,0x1f,0x1b,0x16,0x1d,0x1a,0x16,0x1a,0x16,0x13,0x18, 0x11,0x10,0x15,0x0c,0x0c,0x10,0x0a,0x0b,0x0e,0x08,0x08,0x0b,0x07,0x07,0x0a,0x06, 0x06,0x07,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x04,0x05,0x03,0x03, 0x04,0x03,0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04, 0x05,0x06,0x06,0x08,0x09,0x0a,0x0b,0x0c,0x0e,0x0b,0x0c,0x0e,0x0a,0x0a,0x0c,0x05, 0x06,0x06,0x03,0x03,0x04,0x02,0x03,0x03,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x03,0x06,0x06,0x07,0x07,0x07,0x09,0x06,0x07,0x08,0x05, 0x06,0x06,0x02,0x02,0x02,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,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,0x79,0x79,0x79,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xd5,0xd5,0xd5, 0x0a,0x0a,0x0a,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,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,0x10,0x10,0x10,0x2a,0x2e,0x41,0x39,0x2b,0x3c,0x36, 0x28,0x37,0x1c,0x15,0x1d,0xe8,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xeb, 0xeb,0x1a,0x16,0x20,0x41,0x38,0x50,0x5a,0x4e,0x70,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x53,0x77,0x64,0x53,0x76,0x64, 0x53,0x75,0x64,0x50,0x71,0x64,0x4c,0x69,0x50,0x3d,0x54,0x2d,0x20,0x31,0x2c,0x1f, 0x31,0x29,0x1c,0x2c,0x0b,0x05,0x07,0x46,0x37,0x43,0x30,0x23,0x2a,0x28,0x1d,0x23, 0x2b,0x1f,0x25,0x2d,0x21,0x27,0x32,0x25,0x2d,0x36,0x28,0x31,0x4e,0x43,0x4e,0xbe, 0xc3,0xd3,0x52,0x58,0x83,0x75,0x81,0xa3,0x3a,0x42,0x59,0x7f,0x83,0xa2,0x5e,0x6b, 0x92,0x64,0x50,0x71,0x63,0x63,0x83,0x6b,0x57,0x6c,0x6d,0x58,0x6f,0x6c,0x58,0x6d, 0x6c,0x57,0x6d,0x6b,0x57,0x6d,0x6a,0x56,0x6b,0x6b,0x56,0x6c,0x6a,0x55,0x6a,0x69, 0x54,0x69,0x68,0x54,0x69,0x63,0x4f,0x62,0x54,0x42,0x51,0x4e,0x3d,0x4b,0x41,0x32, 0x3d,0x94,0x95,0xa4,0x55,0x62,0x8b,0x50,0x4e,0x78,0x46,0x44,0x69,0x4b,0x49,0x70, 0x26,0x23,0x31,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,0x80,0x81,0x85,0xe5,0xe7,0xee,0x77,0x82,0xa4,0x54,0x5f,0x89,0x52,0x5a,0x84, 0x52,0x53,0x7d,0x52,0x4f,0x7a,0x64,0x53,0x76,0x64,0x6f,0x94,0x46,0x36,0x41,0x62, 0x4e,0x61,0x72,0x5e,0x75,0x68,0x6d,0x92,0x03,0x03,0x03,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,0x30,0x36,0x47,0x57,0x4b,0x6c,0x46,0x34, 0x4b,0x57,0x40,0x5c,0x63,0x4b,0x67,0x64,0x4c,0x69,0x63,0x4b,0x67,0x63,0x4b,0x67, 0x63,0x4b,0x67,0x63,0x4b,0x67,0x63,0x4b,0x69,0x63,0x4c,0x69,0x64,0x4c,0x69,0x64, 0x4c,0x69,0x64,0x4d,0x6b,0x62,0x4d,0x6c,0x52,0x40,0x5b,0x53,0x43,0x5f,0x60,0x52, 0x75,0x4f,0x59,0x7f,0x1c,0x1c,0x1d,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,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x06,0x04, 0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x08,0x07,0x07,0x09,0x08,0x09, 0x0a,0x09,0x0a,0x0b,0x08,0x09,0x0a,0x0a,0x0a,0x0c,0x4b,0x3d,0x4c,0x56,0x46,0x58, 0x7b,0x76,0x87,0x58,0x63,0x86,0x43,0x4c,0x6c,0x50,0x5b,0x81,0x51,0x5b,0x82,0x50, 0x5b,0x81,0x51,0x5b,0x82,0x50,0x5b,0x81,0x51,0x5b,0x80,0x50,0x5b,0x80,0x50,0x59, 0x7e,0x50,0x5a,0x7f,0x51,0x5a,0x7f,0x53,0x58,0x7c,0x53,0x57,0x7b,0x53,0x56,0x79, 0x52,0x56,0x78,0x54,0x56,0x78,0x54,0x56,0x75,0x47,0x48,0x64,0x46,0x49,0x63,0x4b, 0x4d,0x6a,0x3e,0x40,0x56,0x28,0x2b,0x33,0x2b,0x2e,0x36,0x30,0x33,0x3c,0x36,0x3a, 0x42,0x3a,0x3c,0x45,0x39,0x3d,0x45,0x34,0x37,0x40,0x2a,0x2d,0x36,0x1e,0x1f,0x2a, 0x1e,0x1d,0x26,0x22,0x1e,0x26,0x23,0x1f,0x28,0x21,0x1d,0x25,0x1e,0x1a,0x22,0x1e, 0x1a,0x22,0x1e,0x1a,0x22,0x1d,0x19,0x20,0x1b,0x17,0x1e,0x1a,0x16,0x1c,0x19,0x15, 0x1a,0x15,0x12,0x17,0x11,0x0f,0x14,0x0a,0x0a,0x0e,0x09,0x09,0x0c,0x07,0x08,0x0a, 0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x05,0x02, 0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x03,0x03,0x04,0x05,0x06,0x06,0x08,0x09,0x0a,0x0b,0x0a,0x0a,0x0c, 0x09,0x09,0x0a,0x06,0x07,0x08,0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x02, 0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x03,0x04,0x04,0x04,0x05,0x07,0x07,0x09,0x0b,0x0c,0x0e,0x0e,0x0e,0x11, 0x0e,0x10,0x12,0x11,0x12,0x15,0x0a,0x0a,0x0b,0x02,0x02,0x02,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,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,0x02, 0x02,0x02,0x99,0x99,0x99,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xd1,0xd1, 0xd1,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,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,0x66,0x66,0x66,0xba,0xba,0xba, 0x19,0x1c,0x28,0x1d,0x16,0x1e,0x93,0x92,0x93,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x7d,0x7c,0x7f,0x30,0x29,0x3b,0x52,0x47,0x66,0x5f,0x52,0x76,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x53,0x77,0x62,0x53,0x77, 0x64,0x53,0x76,0x64,0x53,0x73,0x64,0x4f,0x6d,0x62,0x4b,0x66,0x32,0x24,0x36,0x2d, 0x21,0x31,0x2b,0x1e,0x2e,0x23,0x18,0x24,0x1c,0x15,0x1a,0x42,0x32,0x3d,0x28,0x1d, 0x23,0x27,0x1c,0x21,0x2a,0x1e,0x24,0x2c,0x20,0x26,0x2f,0x22,0x29,0x34,0x27,0x2f, 0x75,0x70,0x7d,0xb2,0xb9,0xcc,0x52,0x50,0x7b,0xa0,0xa8,0xbf,0x31,0x20,0x2e,0x59, 0x45,0x5a,0x99,0xa2,0xbb,0x64,0x53,0x76,0x53,0x4f,0x79,0x6b,0x56,0x6c,0x6d,0x58, 0x6e,0x6e,0x59,0x70,0x6e,0x59,0x6f,0x6d,0x58,0x6e,0x6d,0x58,0x6e,0x6c,0x57,0x6d, 0x6b,0x56,0x6c,0x6a,0x55,0x6b,0x6a,0x55,0x6a,0x68,0x54,0x69,0x68,0x53,0x68,0x5c, 0x49,0x5a,0x4d,0x3b,0x49,0x64,0x59,0x63,0x63,0x6f,0x95,0x52,0x52,0x7c,0x49,0x49, 0x6e,0x46,0x45,0x6a,0x4a,0x47,0x68,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,0x25,0x26,0x28,0xb5,0xbc,0xcf,0x5a,0x66,0x8e,0x52,0x53, 0x7e,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x63,0x4b,0x69,0x52,0x55,0x80, 0x5a,0x4f,0x5c,0x5e,0x4b,0x5d,0x70,0x5b,0x72,0x78,0x69,0x88,0x2f,0x32,0x3c,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,0x3e, 0x46,0x63,0x55,0x46,0x64,0x4a,0x36,0x4d,0x5e,0x47,0x63,0x63,0x4b,0x67,0x64,0x4c, 0x6a,0x64,0x4c,0x69,0x63,0x4b,0x67,0x63,0x4b,0x67,0x64,0x4c,0x69,0x64,0x4d,0x6a, 0x64,0x4f,0x6d,0x64,0x4f,0x6d,0x64,0x4e,0x6d,0x64,0x50,0x71,0x60,0x4d,0x6b,0x4e, 0x3d,0x57,0x50,0x40,0x5c,0x60,0x50,0x75,0x4d,0x57,0x7a,0x1a,0x1a,0x1b,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x04,0x04,0x05,0x03,0x04,0x04,0x04,0x04,0x06,0x05,0x06,0x06,0x06, 0x06,0x07,0x06,0x06,0x07,0x07,0x07,0x09,0x07,0x08,0x0a,0x1a,0x16,0x1c,0x55,0x45, 0x56,0x57,0x47,0x58,0x82,0x87,0x9f,0x4e,0x59,0x7a,0x4b,0x54,0x76,0x52,0x5c,0x82, 0x51,0x5c,0x83,0x51,0x5c,0x82,0x51,0x5a,0x81,0x50,0x5a,0x80,0x51,0x5b,0x80,0x51, 0x5b,0x81,0x50,0x59,0x7e,0x50,0x5a,0x7f,0x50,0x5a,0x7e,0x50,0x58,0x7d,0x4f,0x54, 0x79,0x4f,0x53,0x79,0x4f,0x52,0x76,0x50,0x53,0x77,0x4b,0x4e,0x6c,0x42,0x44,0x61, 0x43,0x45,0x60,0x47,0x48,0x6a,0x24,0x27,0x30,0x20,0x22,0x29,0x22,0x25,0x2c,0x24, 0x27,0x2f,0x28,0x2b,0x35,0x26,0x2a,0x34,0x24,0x27,0x32,0x20,0x22,0x2d,0x1e,0x1e, 0x29,0x1f,0x1d,0x26,0x20,0x1c,0x25,0x20,0x1b,0x22,0x1f,0x1a,0x22,0x1e,0x19,0x1f, 0x1b,0x18,0x1e,0x1b,0x17,0x1e,0x1b,0x17,0x1e,0x1b,0x17,0x1d,0x1a,0x16,0x1c,0x1a, 0x16,0x1c,0x19,0x15,0x1a,0x14,0x12,0x16,0x0f,0x0e,0x12,0x0a,0x0a,0x0e,0x08,0x08, 0x0b,0x06,0x06,0x09,0x05,0x05,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x03,0x03,0x04, 0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x06,0x06,0x07, 0x08,0x08,0x09,0x0a,0x08,0x09,0x0a,0x06,0x07,0x09,0x06,0x06,0x06,0x06,0x07,0x09, 0x06,0x07,0x09,0x04,0x04,0x05,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x03,0x07,0x07,0x09,0x0a,0x0a,0x0d,0x0e,0x10,0x12,0x0d,0x0e, 0x0f,0x0a,0x0a,0x0b,0x0b,0x0c,0x0e,0x12,0x13,0x16,0x0d,0x0e,0x0f,0x03,0x03,0x04, 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,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, 0x0a,0x0a,0x0a,0xc9,0xc9,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xfa,0xfa,0xab, 0xab,0xab,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,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,0x6d,0x6d,0x6d,0xec,0xec,0xec,0xfd,0xfd, 0xfd,0x16,0x16,0x16,0x14,0x13,0x15,0x17,0x17,0x1e,0xf2,0xf2,0xf2,0xff,0xff,0xff, 0xff,0xff,0xff,0xe5,0xe4,0xe5,0x1d,0x19,0x24,0x45,0x3c,0x55,0x5c,0x50,0x72,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x62,0x53,0x77,0x64,0x53,0x75,0x64,0x52,0x72,0x64,0x4e,0x6c,0x58,0x43,0x5c, 0x2d,0x20,0x31,0x2d,0x20,0x31,0x29,0x1c,0x2c,0x1e,0x13,0x1f,0x39,0x2b,0x34,0x39, 0x2b,0x34,0x26,0x1b,0x20,0x27,0x1c,0x21,0x27,0x1c,0x22,0x2b,0x1f,0x25,0x2f,0x22, 0x29,0x34,0x26,0x2e,0x90,0x8f,0x9f,0x94,0x9d,0xb8,0x54,0x5f,0x89,0xb7,0xbd,0xcf, 0x28,0x16,0x22,0x22,0x11,0x1d,0x73,0x74,0x91,0x52,0x5a,0x84,0x64,0x52,0x72,0x6f, 0x68,0x83,0x6f,0x5a,0x71,0x6f,0x5a,0x71,0x6e,0x59,0x70,0x6e,0x59,0x70,0x6e,0x59, 0x70,0x6d,0x58,0x6e,0x6c,0x57,0x6d,0x6b,0x57,0x6c,0x6b,0x56,0x6c,0x6a,0x55,0x6a, 0x68,0x54,0x69,0x68,0x53,0x68,0x62,0x4e,0x61,0x4a,0x39,0x47,0x6d,0x73,0x8f,0x52, 0x57,0x83,0x4f,0x4f,0x79,0x42,0x42,0x64,0x52,0x52,0x7c,0x05,0x05,0x07,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,0xbd,0xbd,0xbe,0x66, 0x73,0x98,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x55,0x50,0x79,0x56,0x50,0x79,0x63,0x4b, 0x67,0x5e,0x53,0x79,0x66,0x61,0x72,0x59,0x46,0x57,0x6f,0x5b,0x71,0x76,0x61,0x7a, 0x62,0x67,0x8a,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,0x0b,0x0c,0x0f,0x49,0x49,0x72,0x52,0x41,0x5e,0x4f,0x3c,0x55,0x63, 0x4c,0x69,0x64,0x4c,0x69,0x64,0x4d,0x6a,0x64,0x4c,0x69,0x64,0x4e,0x6c,0x64,0x4e, 0x6c,0x64,0x4e,0x6c,0x64,0x4e,0x6c,0x64,0x4e,0x6c,0x64,0x4f,0x6e,0x64,0x52,0x71, 0x64,0x50,0x6f,0x5e,0x4b,0x69,0x4b,0x3d,0x57,0x50,0x41,0x5e,0x5f,0x4e,0x71,0x4f, 0x5a,0x7c,0x18,0x18,0x18,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x03,0x03,0x04, 0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x07,0x36, 0x2c,0x36,0x54,0x44,0x54,0x59,0x49,0x58,0x73,0x7d,0x9a,0x48,0x52,0x73,0x4f,0x59, 0x7e,0x51,0x5c,0x82,0x52,0x5d,0x83,0x51,0x5c,0x83,0x51,0x5c,0x83,0x51,0x5c,0x83, 0x51,0x5c,0x82,0x51,0x5c,0x82,0x50,0x5a,0x81,0x50,0x5b,0x80,0x51,0x5b,0x81,0x50, 0x5a,0x7e,0x50,0x57,0x7d,0x4e,0x54,0x7a,0x4e,0x51,0x77,0x4e,0x51,0x76,0x43,0x45, 0x66,0x3a,0x3c,0x59,0x3c,0x3e,0x5a,0x48,0x4a,0x6d,0x1a,0x1c,0x22,0x1b,0x1e,0x23, 0x1d,0x1f,0x26,0x1f,0x22,0x2a,0x1e,0x22,0x2a,0x1b,0x1e,0x27,0x1a,0x1a,0x24,0x1e, 0x1d,0x26,0x20,0x1d,0x26,0x1f,0x1b,0x22,0x1e,0x1a,0x21,0x1c,0x18,0x1e,0x1a,0x16, 0x1c,0x1a,0x16,0x1b,0x1a,0x16,0x1b,0x1a,0x16,0x1d,0x1a,0x16,0x1c,0x1a,0x16,0x1c, 0x19,0x15,0x1a,0x19,0x15,0x1a,0x17,0x13,0x18,0x13,0x11,0x16,0x0e,0x0d,0x10,0x0a, 0x0a,0x0d,0x07,0x07,0x0a,0x06,0x06,0x08,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03, 0x05,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02, 0x03,0x03,0x04,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x05,0x06,0x06,0x04,0x04, 0x05,0x06,0x06,0x06,0x07,0x08,0x09,0x06,0x06,0x07,0x03,0x03,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x03,0x08,0x09,0x0a,0x0c,0x0d,0x0f,0x0d, 0x0e,0x0f,0x05,0x06,0x06,0x02,0x02,0x02,0x05,0x06,0x06,0x0b,0x0c,0x0e,0x0a,0x0b, 0x0e,0x03,0x03,0x04,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,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,0x1f,0x1f,0x1f,0xde,0xde,0xde,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xf3,0xf3,0xf3, 0x80,0x80,0x80,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,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,0x0c,0x0c,0x0c,0xcc,0xcc,0xcc,0xfc,0xfc,0xfc,0xff, 0xff,0xff,0x8c,0x8c,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0xb0,0xff,0xff, 0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x62,0x61,0x64,0x32,0x2c,0x3f,0x54,0x49,0x69, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60, 0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x75,0x64,0x50,0x71,0x63,0x4c, 0x68,0x3f,0x2e,0x43,0x2d,0x21,0x31,0x2c,0x1f,0x31,0x27,0x1b,0x29,0x05,0x03,0x04, 0x49,0x38,0x45,0x31,0x24,0x2b,0x26,0x1b,0x20,0x25,0x1a,0x1f,0x27,0x1c,0x22,0x2b, 0x1f,0x25,0x2f,0x22,0x29,0x31,0x24,0x2b,0xa0,0xa5,0xb5,0x64,0x71,0x96,0x5c,0x69, 0x90,0x8a,0x94,0xb0,0x24,0x13,0x20,0x1d,0x0d,0x17,0x30,0x1d,0x2b,0x7e,0x88,0xa8, 0x60,0x53,0x77,0x58,0x61,0x89,0x6f,0x5a,0x71,0x70,0x5b,0x72,0x6f,0x5a,0x71,0x70, 0x5b,0x72,0x6f,0x5a,0x71,0x6d,0x59,0x6f,0x6d,0x58,0x6e,0x6c,0x57,0x6d,0x6b,0x57, 0x6c,0x6b,0x56,0x6c,0x6a,0x55,0x6a,0x69,0x54,0x69,0x67,0x53,0x68,0x5e,0x4b,0x5d, 0x52,0x4c,0x5f,0x52,0x5d,0x86,0x52,0x55,0x80,0x48,0x48,0x6d,0x4e,0x50,0x79,0x38, 0x38,0x50,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, 0x50,0x51,0x53,0x8b,0x95,0xb2,0x57,0x50,0x79,0x5e,0x53,0x79,0x55,0x50,0x79,0x5a, 0x52,0x79,0x64,0x4e,0x6d,0x64,0x4d,0x6b,0x5b,0x5c,0x78,0x50,0x3f,0x4d,0x6d,0x59, 0x6f,0x76,0x61,0x79,0x78,0x69,0x88,0x1c,0x1e,0x26,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,0x24,0x27,0x30,0x4e,0x4d,0x76, 0x4c,0x3c,0x55,0x57,0x45,0x5f,0x64,0x4f,0x6e,0x64,0x4f,0x6e,0x64,0x4f,0x6d,0x64, 0x4e,0x6c,0x64,0x4d,0x6b,0x64,0x50,0x6f,0x64,0x50,0x6f,0x64,0x50,0x6f,0x64,0x4f, 0x6e,0x64,0x4f,0x6e,0x64,0x52,0x71,0x64,0x52,0x72,0x5f,0x4e,0x6e,0x56,0x45,0x63, 0x4f,0x40,0x5d,0x5b,0x4c,0x6f,0x4d,0x58,0x78,0x15,0x15,0x16,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,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x03,0x03,0x04,0x04,0x04,0x05,0x04,0x05,0x06, 0x0b,0x0a,0x0d,0x51,0x42,0x51,0x53,0x43,0x53,0x81,0x79,0x88,0x5f,0x69,0x87,0x46, 0x4f,0x72,0x50,0x5c,0x81,0x52,0x5d,0x83,0x52,0x5d,0x83,0x52,0x5d,0x83,0x52,0x5c, 0x83,0x51,0x5d,0x83,0x51,0x5c,0x83,0x51,0x5b,0x81,0x51,0x5b,0x81,0x51,0x5c,0x82, 0x51,0x5b,0x81,0x50,0x5a,0x80,0x50,0x5a,0x7e,0x4f,0x58,0x7d,0x4f,0x54,0x7a,0x4e, 0x51,0x76,0x40,0x43,0x62,0x38,0x3a,0x57,0x3b,0x3d,0x58,0x4c,0x4f,0x78,0x17,0x1a, 0x1f,0x1a,0x1b,0x22,0x1a,0x1d,0x23,0x1e,0x21,0x28,0x1c,0x1e,0x26,0x1a,0x1b,0x25, 0x19,0x18,0x21,0x1b,0x19,0x22,0x1d,0x19,0x20,0x1d,0x19,0x1f,0x1a,0x17,0x1d,0x1a, 0x16,0x1b,0x18,0x14,0x1a,0x16,0x14,0x1a,0x16,0x14,0x1a,0x19,0x15,0x1a,0x1a,0x16, 0x1b,0x1a,0x16,0x1b,0x19,0x15,0x1a,0x18,0x14,0x1a,0x16,0x13,0x18,0x12,0x0f,0x13, 0x0d,0x0b,0x0f,0x09,0x09,0x0b,0x07,0x07,0x0a,0x05,0x05,0x06,0x04,0x04,0x06,0x03, 0x03,0x05,0x03,0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x03,0x04,0x05,0x02, 0x03,0x03,0x02,0x02,0x02,0x03,0x04,0x05,0x06,0x06,0x06,0x06,0x06,0x08,0x04,0x05, 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x07, 0x08,0x09,0x0a,0x06,0x06,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x03,0x07, 0x08,0x09,0x07,0x07,0x09,0x02,0x02,0x02,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, 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,0x47,0x47,0x47,0xf5,0xf5,0xf5,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xe8,0xe8, 0xe8,0x48,0x48,0x48,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,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,0x7b,0x7b,0x7b,0xf2,0xf2,0xf2,0xff,0xff,0xff, 0xff,0xff,0xff,0xf8,0xf8,0xf8,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x21,0x21,0x21,0xf7, 0xf7,0xf7,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xd1,0xd1,0xd1,0x1f,0x17,0x20,0x4b,0x3d, 0x56,0x5d,0x50,0x73,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x73,0x64, 0x4f,0x6e,0x5e,0x47,0x62,0x2d,0x20,0x31,0x2d,0x21,0x31,0x2c,0x1f,0x30,0x26,0x19, 0x28,0x0c,0x09,0x0b,0x49,0x38,0x46,0x28,0x1d,0x23,0x25,0x1a,0x1f,0x25,0x1a,0x1f, 0x28,0x1d,0x23,0x2b,0x1f,0x25,0x2d,0x21,0x28,0x33,0x25,0x2d,0xa7,0xae,0xc2,0x56, 0x62,0x8b,0x76,0x82,0xa3,0x5d,0x69,0x91,0x1d,0x0d,0x17,0x1c,0x0a,0x16,0x1d,0x0b, 0x17,0x65,0x53,0x73,0x65,0x71,0x96,0x52,0x4f,0x7a,0x6e,0x64,0x80,0x70,0x5b,0x72, 0x70,0x5c,0x73,0x6f,0x5b,0x71,0x6f,0x5a,0x71,0x6f,0x5a,0x71,0x6e,0x59,0x70,0x6e, 0x59,0x70,0x6c,0x58,0x6e,0x6b,0x57,0x6c,0x6b,0x56,0x6c,0x6a,0x55,0x6a,0x66,0x52, 0x66,0x5e,0x4c,0x5d,0x76,0x7b,0x96,0x6a,0x75,0x9a,0x60,0x6c,0x93,0x54,0x61,0x88, 0x4d,0x57,0x7e,0x52,0x52,0x79,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,0x02,0x02,0x03,0xb4,0xb8,0xc4,0x52,0x57,0x82,0x64,0x53,0x74, 0x5a,0x52,0x79,0x58,0x50,0x79,0x62,0x53,0x77,0x60,0x48,0x64,0x52,0x5c,0x81,0x4d, 0x3c,0x4a,0x6a,0x55,0x6b,0x75,0x60,0x79,0x78,0x64,0x7d,0x5f,0x61,0x83,0x02,0x02, 0x03,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,0x35,0x3b,0x4d,0x4e,0x48,0x6e,0x4a,0x3b,0x53,0x5f,0x4d,0x6c,0x64,0x4f,0x6e, 0x64,0x50,0x6f,0x64,0x4f,0x6d,0x64,0x52,0x72,0x64,0x4f,0x6e,0x64,0x50,0x6f,0x64, 0x50,0x71,0x64,0x52,0x72,0x64,0x52,0x72,0x64,0x52,0x72,0x64,0x53,0x73,0x64,0x53, 0x73,0x63,0x52,0x71,0x55,0x46,0x64,0x4a,0x3c,0x57,0x5c,0x4e,0x72,0x4b,0x54,0x73, 0x0f,0x0f,0x10,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x03, 0x04,0x04,0x04,0x05,0x28,0x1f,0x28,0x52,0x42,0x52,0x53,0x42,0x52,0x92,0x95,0xaa, 0x4d,0x56,0x75,0x4a,0x53,0x79,0x52,0x5d,0x84,0x53,0x5e,0x85,0x52,0x5e,0x85,0x53, 0x5d,0x84,0x53,0x5e,0x84,0x52,0x5c,0x83,0x52,0x5d,0x83,0x52,0x5c,0x83,0x51,0x5c, 0x83,0x51,0x5b,0x82,0x51,0x5b,0x81,0x51,0x5b,0x81,0x50,0x5a,0x81,0x50,0x59,0x7e, 0x4f,0x58,0x7e,0x4f,0x54,0x7b,0x3a,0x3d,0x5b,0x36,0x38,0x56,0x39,0x3a,0x58,0x52, 0x53,0x7c,0x16,0x19,0x1e,0x1a,0x1b,0x22,0x1c,0x1e,0x24,0x1a,0x1d,0x24,0x1a,0x1c, 0x24,0x18,0x18,0x21,0x16,0x15,0x1c,0x18,0x15,0x1b,0x1a,0x16,0x1b,0x1a,0x16,0x1a, 0x18,0x14,0x1a,0x16,0x12,0x18,0x14,0x12,0x16,0x13,0x11,0x16,0x16,0x13,0x18,0x1a, 0x16,0x1b,0x1b,0x16,0x1b,0x1c,0x16,0x1c,0x1a,0x16,0x1a,0x16,0x13,0x18,0x13,0x11, 0x16,0x0f,0x0d,0x11,0x0a,0x0a,0x0e,0x08,0x08,0x0a,0x06,0x06,0x08,0x05,0x05,0x06, 0x04,0x04,0x06,0x03,0x03,0x05,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x02,0x02,0x02,0x05,0x06,0x06,0x06, 0x06,0x07,0x04,0x04,0x05,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02, 0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x03,0x04,0x07,0x07,0x09,0x06,0x06,0x07,0x02,0x02,0x02,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,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,0x81,0x81, 0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x98,0x98,0x98,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xcd, 0xcd,0xcd,0x10,0x10,0x10,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,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,0x4b,0x4b,0x4b,0xeb,0xeb,0xeb,0xfd,0xfd,0xfd,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x54,0x54,0x54,0x00,0x00,0x00,0x00,0x00,0x00, 0xba,0xba,0xba,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xfa,0xfa,0xfa,0x53,0x51,0x56,0x32, 0x24,0x34,0x53,0x3d,0x54,0x64,0x53,0x76,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53, 0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x53,0x77,0x62,0x53,0x77,0x64,0x53,0x76, 0x64,0x52,0x72,0x64,0x4e,0x6c,0x46,0x34,0x4a,0x2d,0x21,0x31,0x2d,0x21,0x31,0x2a, 0x1e,0x2e,0x1d,0x12,0x1e,0x2b,0x20,0x27,0x3f,0x30,0x3a,0x23,0x19,0x1e,0x24,0x19, 0x1e,0x25,0x1a,0x1f,0x27,0x1c,0x21,0x2b,0x1f,0x25,0x2c,0x20,0x27,0x34,0x27,0x2f, 0xa7,0xaf,0xc4,0x52,0x50,0x7c,0x93,0x9c,0xb8,0x5c,0x44,0x5f,0x2e,0x1a,0x2b,0x1c, 0x0a,0x15,0x1c,0x0a,0x15,0x1e,0x0d,0x18,0x7b,0x85,0xa6,0x5e,0x6b,0x92,0x9a,0x9d, 0xb4,0x71,0x5c,0x73,0x70,0x5b,0x72,0x71,0x5c,0x73,0x70,0x5b,0x72,0x70,0x5b,0x72, 0x6f,0x5a,0x71,0x6e,0x59,0x70,0x6d,0x58,0x6e,0x6c,0x57,0x6d,0x6c,0x57,0x6d,0x68, 0x54,0x69,0x5c,0x49,0x5a,0x8f,0x8e,0xa1,0x7d,0x88,0xa8,0x79,0x84,0xa4,0x7d,0x88, 0xa8,0x7c,0x88,0xa8,0x6f,0x7b,0x9a,0x4f,0x51,0x70,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,0x69,0x69,0x6a,0x69,0x75, 0x9a,0x5c,0x52,0x79,0x60,0x53,0x77,0x53,0x4f,0x7a,0x5b,0x52,0x79,0x5c,0x44,0x5f, 0x52,0x53,0x7e,0x53,0x45,0x54,0x64,0x50,0x64,0x75,0x61,0x79,0x78,0x66,0x80,0x6f, 0x68,0x8a,0x2f,0x32,0x3a,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,0x02,0x02,0x02,0x45,0x4e,0x69,0x4b,0x40,0x63,0x50,0x40, 0x5b,0x64,0x52,0x6f,0x64,0x52,0x72,0x64,0x50,0x71,0x64,0x50,0x71,0x64,0x53,0x73, 0x64,0x53,0x73,0x64,0x52,0x72,0x64,0x52,0x73,0x64,0x52,0x73,0x64,0x53,0x74,0x64, 0x53,0x73,0x64,0x53,0x74,0x64,0x53,0x75,0x64,0x53,0x74,0x56,0x46,0x66,0x50,0x41, 0x5f,0x5c,0x4f,0x73,0x4b,0x54,0x71,0x06,0x06,0x07,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, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x03,0x02,0x02,0x03,0x03,0x03,0x04,0x46,0x38,0x45,0x52,0x42,0x51,0x5d,0x4d, 0x5d,0x78,0x81,0x9d,0x44,0x4e,0x6c,0x4f,0x5b,0x82,0x53,0x5e,0x86,0x53,0x5e,0x85, 0x53,0x5d,0x85,0x54,0x5f,0x85,0x54,0x5f,0x85,0x53,0x5f,0x84,0x54,0x5f,0x85,0x52, 0x5c,0x83,0x52,0x5d,0x84,0x51,0x5c,0x83,0x52,0x5c,0x83,0x51,0x5b,0x81,0x50,0x5a, 0x81,0x50,0x5b,0x82,0x50,0x59,0x7f,0x4e,0x56,0x7c,0x37,0x3b,0x5a,0x36,0x37,0x56, 0x3b,0x3b,0x5a,0x55,0x56,0x85,0x15,0x16,0x1c,0x17,0x1a,0x20,0x19,0x1a,0x22,0x19, 0x1b,0x23,0x16,0x17,0x20,0x16,0x15,0x1d,0x16,0x14,0x1a,0x14,0x12,0x16,0x14,0x12, 0x16,0x15,0x12,0x16,0x13,0x11,0x16,0x12,0x10,0x14,0x12,0x11,0x16,0x14,0x12,0x17, 0x17,0x14,0x1a,0x1a,0x16,0x1b,0x1a,0x15,0x1a,0x1a,0x16,0x1b,0x18,0x15,0x1a,0x15, 0x12,0x17,0x12,0x0f,0x14,0x0e,0x0c,0x10,0x09,0x09,0x0c,0x07,0x07,0x0a,0x06,0x06, 0x08,0x05,0x05,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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, 0x02,0x02,0x02,0x03,0x03,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x04,0x05,0x05, 0x06,0x06,0x04,0x05,0x05,0x04,0x04,0x05,0x02,0x03,0x03,0x02,0x02,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x05,0x05,0x06,0x06,0x07,0x03,0x03,0x04,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,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,0xc0, 0xc0,0xc0,0xfe,0xfe,0xfe,0x79,0x79,0x79,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x24,0x24,0x24,0xe2,0xe2,0xe2,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xf8,0xf8,0xf8, 0xa1,0xa1,0xa1,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,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,0x36,0x36,0x36,0xd1,0xd1,0xd1,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0x04,0x04,0x04,0x00,0x00, 0x00,0x1f,0x1f,0x1f,0xf8,0xf8,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xc3,0xc3, 0x21,0x24,0x2f,0x46,0x3f,0x5d,0x5b,0x43,0x5e,0x60,0x48,0x65,0x64,0x53,0x76,0x60, 0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62,0x53, 0x77,0x64,0x53,0x75,0x64,0x52,0x72,0x62,0x4b,0x69,0x2d,0x21,0x31,0x2d,0x20,0x31, 0x2c,0x1f,0x31,0x28,0x1b,0x2a,0x07,0x05,0x06,0x3e,0x2f,0x3a,0x31,0x24,0x2b,0x23, 0x19,0x1d,0x22,0x18,0x1c,0x23,0x19,0x1d,0x26,0x1b,0x20,0x28,0x1d,0x22,0x2c,0x20, 0x26,0x52,0x4c,0x58,0x98,0xa1,0xbb,0x52,0x4f,0x7a,0x9d,0xa7,0xbf,0x40,0x2b,0x3e, 0x36,0x22,0x33,0x47,0x30,0x46,0x1e,0x0d,0x18,0x19,0x09,0x14,0x35,0x22,0x33,0x80, 0x8b,0xaa,0xa8,0xad,0xc2,0x6b,0x57,0x6d,0x6c,0x57,0x6d,0x6f,0x5a,0x71,0x6e,0x59, 0x70,0x6f,0x5a,0x71,0x6e,0x5a,0x70,0x6f,0x5a,0x71,0x6e,0x59,0x70,0x6d,0x58,0x6e, 0x6b,0x57,0x6c,0x60,0x4c,0x5f,0x7c,0x76,0x88,0x90,0x99,0xb4,0x77,0x83,0xa4,0x83, 0x8d,0xac,0x82,0x8c,0xab,0x7a,0x85,0xa5,0x58,0x5d,0x7e,0x05,0x04,0x06,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,0x0c, 0x0c,0x0c,0x99,0xa1,0xb4,0x52,0x4f,0x7b,0x63,0x53,0x77,0x54,0x50,0x79,0x52,0x4f, 0x7a,0x62,0x4a,0x66,0x53,0x4f,0x7a,0x5d,0x57,0x6b,0x5c,0x49,0x5a,0x73,0x5e,0x76, 0x78,0x66,0x80,0x72,0x68,0x8a,0x80,0x8a,0xa8,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,0x0b,0x0c,0x0e,0x4c, 0x56,0x79,0x46,0x3b,0x58,0x58,0x48,0x65,0x64,0x53,0x75,0x64,0x53,0x74,0x64,0x53, 0x73,0x64,0x52,0x72,0x64,0x53,0x74,0x64,0x53,0x75,0x64,0x53,0x73,0x64,0x53,0x75, 0x64,0x53,0x74,0x64,0x53,0x75,0x64,0x53,0x76,0x63,0x53,0x77,0x64,0x53,0x76,0x62, 0x53,0x76,0x53,0x46,0x67,0x4c,0x40,0x5f,0x4d,0x4b,0x74,0x48,0x50,0x68,0x03,0x03, 0x04,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,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x03,0x17,0x14,0x17,0x4f,0x3e,0x4d,0x51, 0x40,0x50,0x8f,0x8c,0x99,0x55,0x61,0x7e,0x48,0x51,0x72,0x54,0x60,0x88,0x54,0x61, 0x87,0x54,0x5f,0x86,0x54,0x60,0x86,0x54,0x5f,0x86,0x54,0x60,0x86,0x54,0x60,0x86, 0x54,0x5f,0x86,0x54,0x5f,0x85,0x53,0x5e,0x84,0x52,0x5c,0x83,0x52,0x5c,0x83,0x51, 0x5b,0x83,0x50,0x5b,0x82,0x50,0x5a,0x82,0x50,0x5a,0x80,0x49,0x52,0x76,0x36,0x3b, 0x5b,0x37,0x3a,0x56,0x3a,0x3c,0x5c,0x4f,0x52,0x7d,0x14,0x16,0x1a,0x16,0x18,0x1e, 0x17,0x18,0x21,0x19,0x18,0x21,0x17,0x16,0x1e,0x13,0x13,0x1a,0x11,0x10,0x16,0x11, 0x0f,0x14,0x11,0x0f,0x13,0x11,0x0f,0x13,0x11,0x0e,0x12,0x10,0x0e,0x12,0x12,0x0f, 0x14,0x15,0x12,0x16,0x18,0x14,0x19,0x1a,0x16,0x1a,0x1a,0x16,0x1b,0x19,0x15,0x1a, 0x16,0x13,0x18,0x13,0x11,0x16,0x10,0x0e,0x12,0x0c,0x0b,0x0e,0x09,0x09,0x0c,0x07, 0x07,0x0a,0x06,0x06,0x08,0x04,0x04,0x06,0x03,0x03,0x05,0x02,0x02,0x04,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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, 0x04,0x05,0x05,0x06,0x06,0x07,0x06,0x06,0x07,0x05,0x06,0x06,0x05,0x05,0x06,0x03, 0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x03,0x05,0x06,0x06,0x05,0x06,0x06,0x02,0x02, 0x03,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,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,0xe7,0xe7,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0x85,0x85,0x85,0x2c, 0x2c,0x2c,0x72,0x72,0x72,0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0xe2,0xe2, 0xe2,0x54,0x54,0x54,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,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,0xb8,0xb8,0xb8,0xfb,0xfb,0xfb,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x30,0x30,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0xbc,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xf7, 0xf7,0x36,0x36,0x36,0x0b,0x0b,0x0c,0x56,0x5f,0x7d,0x57,0x50,0x79,0x62,0x4a,0x66, 0x60,0x48,0x65,0x64,0x53,0x75,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x62, 0x53,0x77,0x63,0x53,0x77,0x64,0x53,0x74,0x64,0x50,0x71,0x52,0x3d,0x56,0x2d,0x21, 0x31,0x2d,0x20,0x31,0x2c,0x1f,0x30,0x26,0x19,0x28,0x04,0x03,0x04,0x43,0x34,0x3f, 0x27,0x1b,0x21,0x21,0x17,0x1b,0x22,0x18,0x1c,0x23,0x18,0x1d,0x25,0x1a,0x1f,0x28, 0x1d,0x23,0x2b,0x1f,0x25,0x6d,0x6d,0x7e,0x79,0x84,0xa5,0x52,0x4f,0x7a,0x8c,0x95, 0xb2,0x22,0x10,0x1d,0x0e,0x00,0x07,0x46,0x30,0x45,0x47,0x31,0x46,0x20,0x0f,0x1a, 0x18,0x08,0x12,0x8b,0x94,0xaf,0xa8,0xaf,0xc4,0x72,0x61,0x76,0x6a,0x56,0x6b,0x6c, 0x57,0x6d,0x6c,0x57,0x6d,0x6c,0x57,0x6d,0x6b,0x57,0x6c,0x6b,0x57,0x6c,0x6c,0x57, 0x6d,0x6b,0x57,0x6c,0x62,0x4e,0x62,0x65,0x5b,0x6e,0xa0,0xa8,0xc0,0x7d,0x89,0xa9, 0x7e,0x8a,0xa9,0x82,0x8c,0xab,0x80,0x8b,0xaa,0x67,0x6f,0x90,0x0f,0x0c,0x11,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,0x6d,0x6e,0x6e,0x5a,0x66,0x8e,0x5b,0x52,0x79,0x5c, 0x52,0x79,0x52,0x50,0x7c,0x64,0x52,0x73,0x5e,0x53,0x79,0x60,0x61,0x7d,0x56,0x43, 0x53,0x71,0x5c,0x73,0x78,0x68,0x85,0x6d,0x67,0x8a,0x83,0x8d,0xac,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,0x1d,0x1e,0x23,0x48,0x4c,0x72,0x4e,0x40,0x5e,0x5e,0x4d,0x6d,0x64, 0x53,0x74,0x64,0x53,0x74,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53, 0x76,0x64,0x53,0x75,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76,0x64,0x53,0x76, 0x62,0x53,0x77,0x60,0x53,0x77,0x5e,0x53,0x77,0x52,0x47,0x6a,0x4b,0x44,0x67,0x4d, 0x4f,0x77,0x4a,0x51,0x62,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x3c,0x2f,0x3a, 0x4f,0x40,0x4d,0x50,0x3f,0x4e,0x95,0x9b,0xb1,0x47,0x50,0x70,0x4e,0x59,0x7f,0x54, 0x60,0x88,0x55,0x61,0x89,0x54,0x61,0x88,0x55,0x61,0x89,0x55,0x61,0x89,0x54,0x61, 0x88,0x54,0x60,0x87,0x54,0x5f,0x86,0x54,0x5f,0x86,0x54,0x60,0x86,0x53,0x5d,0x84, 0x53,0x5d,0x84,0x51,0x5c,0x83,0x51,0x5c,0x82,0x50,0x5a,0x82,0x50,0x5a,0x82,0x44, 0x4e,0x70,0x35,0x3a,0x58,0x34,0x39,0x57,0x3b,0x3f,0x5f,0x3f,0x43,0x63,0x14,0x16, 0x1a,0x13,0x15,0x1b,0x17,0x16,0x1e,0x1a,0x19,0x21,0x17,0x16,0x1d,0x12,0x12,0x17, 0x0e,0x0e,0x12,0x0c,0x0b,0x0f,0x0e,0x0c,0x10,0x0d,0x0b,0x0f,0x0c,0x0b,0x0e,0x0e, 0x0c,0x10,0x11,0x0e,0x12,0x14,0x11,0x16,0x18,0x13,0x19,0x18,0x13,0x18,0x19,0x14, 0x1a,0x16,0x13,0x18,0x13,0x11,0x16,0x12,0x0f,0x14,0x0e,0x0d,0x11,0x0b,0x0a,0x0e, 0x08,0x08,0x0b,0x06,0x06,0x09,0x05,0x05,0x06,0x04,0x04,0x06,0x03,0x03,0x04,0x02, 0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,0x02,0x02,0x03,0x04,0x05,0x05,0x06,0x06,0x07,0x06,0x06,0x07, 0x06,0x07,0x08,0x06,0x06,0x07,0x04,0x04,0x05,0x02,0x02,0x02,0x02,0x03,0x03,0x02, 0x03,0x03,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,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,0x95,0x95,0x95,0xfd,0xfd,0xfd,0xff,0xff,0xff, 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xf4,0xf4,0xf4,0xa4, 0xa4,0xa4,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,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,0x47,0x47,0x47,0xec,0xec,0xec,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb1,0xb1,0xb1, 0x03,0x03,0x03,0x00,0x00,0x00,0x21,0x21,0x21,0xf8,0xf8,0xf8,0xff,0xff,0xff,0xff, 0xff,0xff,0xbb,0xbb,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x26,0x2a,0x62,0x6d, 0x91,0x58,0x50,0x79,0x62,0x4a,0x66,0x62,0x4a,0x65,0x64,0x53,0x75,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x73,0x63,0x4f,0x6d,0x36, 0x28,0x3a,0x2d,0x20,0x31,0x2d,0x20,0x31,0x2b,0x1e,0x2e,0x1d,0x12,0x1d,0x1a,0x14, 0x18,0x3a,0x2c,0x35,0x23,0x18,0x1d,0x21,0x17,0x1b,0x22,0x18,0x1c,0x22,0x18,0x1d, 0x24,0x1a,0x1f,0x27,0x1c,0x21,0x2a,0x1e,0x25,0x7d,0x81,0x97,0x63,0x6e,0x95,0x52, 0x57,0x82,0x71,0x7c,0x9f,0x31,0x1e,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x2c, 0x3f,0x45,0x2f,0x44,0x36,0x21,0x33,0xa4,0xac,0xc2,0xa3,0xaa,0xc1,0x72,0x62,0x76, 0x69,0x54,0x69,0x6a,0x56,0x6b,0x6b,0x57,0x6c,0x6b,0x57,0x6c,0x6b,0x56,0x6c,0x6c, 0x57,0x6d,0x6b,0x57,0x6d,0x64,0x50,0x64,0x58,0x4b,0x5d,0xa5,0xab,0xc0,0x77,0x83, 0xa4,0x81,0x8b,0xaa,0x86,0x91,0xaf,0x80,0x8b,0xaa,0x74,0x7f,0x9f,0x1c,0x19,0x23, 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,0x09,0x09,0x09,0x88,0x91,0xad, 0x52,0x5d,0x88,0x5c,0x52,0x79,0x52,0x50,0x7b,0x54,0x50,0x79,0x64,0x53,0x74,0x5e, 0x67,0x8a,0x4f,0x3e,0x4c,0x6d,0x58,0x6e,0x78,0x67,0x82,0x68,0x66,0x8b,0x73,0x7c, 0x97,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,0x30,0x34,0x40,0x4e,0x4c,0x74, 0x55,0x45,0x65,0x60,0x4f,0x73,0x63,0x53,0x77,0x64,0x53,0x76,0x64,0x53,0x76,0x60, 0x53,0x77,0x62,0x53,0x77,0x62,0x53,0x77,0x62,0x53,0x77,0x62,0x53,0x77,0x60,0x53, 0x77,0x5e,0x53,0x79,0x5c,0x52,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79,0x5b,0x50,0x77, 0x4e,0x44,0x65,0x4a,0x43,0x64,0x4e,0x5a,0x81,0x3b,0x3f,0x4a,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,0x14,0x10, 0x13,0x4d,0x3b,0x4a,0x4f,0x3f,0x4d,0x69,0x5b,0x69,0x70,0x7c,0x97,0x47,0x51,0x72, 0x55,0x60,0x88,0x56,0x62,0x89,0x55,0x62,0x89,0x55,0x62,0x89,0x55,0x62,0x89,0x56, 0x61,0x89,0x55,0x62,0x89,0x55,0x62,0x89,0x55,0x61,0x89,0x55,0x61,0x88,0x54,0x5f, 0x86,0x54,0x60,0x86,0x53,0x5e,0x85,0x53,0x5e,0x84,0x52,0x5c,0x84,0x51,0x5b,0x82, 0x50,0x5b,0x82,0x3e,0x48,0x6a,0x34,0x3b,0x58,0x36,0x3a,0x58,0x3c,0x42,0x61,0x21, 0x23,0x32,0x12,0x14,0x19,0x13,0x14,0x1a,0x15,0x14,0x1b,0x1a,0x16,0x1e,0x16,0x14, 0x1a,0x0f,0x0f,0x14,0x0b,0x0b,0x0f,0x0a,0x0a,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0c, 0x0a,0x0a,0x0d,0x0d,0x0b,0x0e,0x10,0x0e,0x12,0x13,0x10,0x14,0x15,0x12,0x16,0x16, 0x12,0x17,0x14,0x12,0x16,0x13,0x11,0x16,0x13,0x11,0x15,0x11,0x0f,0x13,0x0e,0x0c, 0x0f,0x0a,0x0a,0x0d,0x07,0x07,0x0a,0x06,0x06,0x08,0x05,0x05,0x06,0x03,0x03,0x05, 0x02,0x02,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,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,0x02,0x02,0x03,0x04,0x04, 0x05,0x05,0x06,0x06,0x07,0x07,0x09,0x08,0x09,0x0a,0x06,0x06,0x07,0x02,0x02,0x02, 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,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,0xe9,0xe9, 0xe9,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xf8,0xf8,0xf8,0xd2,0xd2,0xd2, 0x41,0x41,0x41,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,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, 0x70,0x70,0x70,0xe5,0xe5,0xe5,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x2a,0x2a,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0xba,0xff,0xff,0xff, 0xff,0xff,0xff,0xf9,0xf9,0xf9,0x37,0x37,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x30,0x38,0x68,0x73,0x97,0x52,0x4f,0x7a,0x64,0x4e,0x6c,0x63,0x4b, 0x67,0x64,0x53,0x75,0x62,0x53,0x77,0x62,0x53,0x77,0x64,0x53,0x76,0x64,0x52,0x73, 0x5c,0x48,0x64,0x2d,0x21,0x31,0x2d,0x20,0x31,0x2c,0x1f,0x31,0x28,0x1b,0x2a,0x09, 0x06,0x08,0x39,0x2c,0x35,0x2f,0x23,0x2a,0x22,0x18,0x1c,0x20,0x16,0x1a,0x20,0x16, 0x1a,0x21,0x17,0x1b,0x23,0x19,0x1d,0x27,0x1c,0x21,0x2a,0x1e,0x24,0x87,0x8f,0xa8, 0x5a,0x65,0x8d,0x56,0x62,0x8b,0x52,0x58,0x84,0x60,0x4a,0x60,0x05,0x04,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x2e,0x1a,0x29,0x56,0x3f,0x57,0xa3,0xab,0xc2,0x9f,0xa7, 0xbe,0x7c,0x73,0x89,0x68,0x54,0x69,0x6a,0x55,0x6a,0x69,0x54,0x69,0x6b,0x56,0x6c, 0x6b,0x56,0x6c,0x6b,0x56,0x6c,0x67,0x53,0x67,0x55,0x45,0x55,0x91,0x96,0xaa,0x7d, 0x89,0xa9,0x80,0x8a,0xaa,0x89,0x93,0xb0,0x85,0x90,0xad,0x7d,0x89,0xa8,0x2f,0x2a, 0x3b,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,0x76,0x77,0x77,0x63,0x6f,0x95,0x52,0x53,0x7e,0x52,0x4f,0x7a,0x52,0x53,0x7e, 0x64,0x53,0x75,0x5b,0x66,0x8e,0x5f,0x52,0x60,0x68,0x53,0x68,0x78,0x65,0x7f,0x68, 0x67,0x8c,0x5e,0x65,0x79,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,0x3f,0x45,0x5b,0x48,0x47,0x6e,0x54,0x47,0x67,0x5d,0x50,0x74,0x60,0x53,0x77, 0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x60,0x53,0x77,0x5d, 0x52,0x79,0x5d,0x52,0x79,0x5c,0x52,0x79,0x56,0x50,0x79,0x58,0x52,0x79,0x5a,0x52, 0x79,0x57,0x50,0x79,0x5a,0x50,0x76,0x4b,0x3f,0x5e,0x45,0x43,0x69,0x4c,0x57,0x7c, 0x2d,0x30,0x38,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,0x35,0x29,0x32,0x4a,0x3a,0x47,0x4e,0x3d,0x4c,0x9c,0x9b,0xaa,0x56,0x61, 0x82,0x4c,0x57,0x7a,0x56,0x62,0x8b,0x55,0x62,0x8a,0x56,0x62,0x8b,0x56,0x63,0x8b, 0x55,0x62,0x8a,0x56,0x62,0x8a,0x57,0x63,0x8a,0x57,0x62,0x8a,0x56,0x62,0x8a,0x55, 0x61,0x89,0x55,0x61,0x89,0x54,0x60,0x88,0x54,0x60,0x87,0x53,0x5e,0x86,0x52,0x5e, 0x85,0x51,0x5b,0x83,0x51,0x5c,0x84,0x39,0x42,0x63,0x33,0x39,0x56,0x36,0x3b,0x59, 0x3e,0x44,0x68,0x12,0x14,0x19,0x13,0x15,0x1a,0x12,0x12,0x1a,0x13,0x13,0x1a,0x14, 0x12,0x19,0x11,0x10,0x15,0x0b,0x0b,0x0f,0x08,0x08,0x0b,0x07,0x06,0x0a,0x07,0x07, 0x0a,0x07,0x07,0x0a,0x08,0x08,0x0a,0x09,0x09,0x0c,0x0d,0x0b,0x0f,0x0e,0x0d,0x11, 0x10,0x0e,0x12,0x11,0x0f,0x13,0x11,0x0f,0x13,0x12,0x0f,0x14,0x11,0x0e,0x12,0x0f, 0x0d,0x11,0x0d,0x0b,0x0f,0x0a,0x09,0x0c,0x07,0x06,0x0a,0x05,0x05,0x06,0x03,0x04, 0x05,0x03,0x03,0x04,0x02,0x02,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,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,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x04,0x05,0x05,0x02,0x03, 0x03,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,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,0x2f,0x2f,0x2f,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xd3,0xd3,0xd3,0x6e,0x6e, 0x6e,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,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,0x76,0x76, 0x76,0xde,0xde,0xde,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xc2,0xc2,0xc2,0x02,0x02,0x02,0x00,0x00,0x00,0x20,0x20,0x20,0xf5,0xf5, 0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xbd,0xbd,0xbd,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x3d,0x48,0x71,0x7b,0x9e,0x52, 0x4f,0x7a,0x64,0x52,0x71,0x64,0x4f,0x6d,0x64,0x53,0x73,0x63,0x53,0x77,0x64,0x53, 0x75,0x64,0x52,0x72,0x43,0x31,0x47,0x2d,0x21,0x31,0x2d,0x20,0x31,0x2c,0x1f,0x30, 0x23,0x18,0x25,0x08,0x06,0x07,0x43,0x33,0x3e,0x27,0x1c,0x22,0x21,0x17,0x1b,0x1d, 0x14,0x17,0x1d,0x14,0x18,0x20,0x16,0x1a,0x21,0x17,0x1b,0x25,0x1a,0x20,0x28,0x1d, 0x23,0x88,0x91,0xae,0x52,0x52,0x7c,0x5e,0x6a,0x92,0x5a,0x4b,0x66,0x62,0x4e,0x62, 0x07,0x05,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x86,0xa7,0x9b, 0xa3,0xbc,0x9d,0xa5,0xbe,0x7a,0x71,0x86,0x65,0x51,0x65,0x67,0x53,0x68,0x69,0x54, 0x69,0x69,0x54,0x69,0x6a,0x55,0x6b,0x66,0x52,0x66,0x59,0x47,0x58,0x73,0x76,0x8b, 0x83,0x8d,0xac,0x80,0x8a,0xaa,0x96,0xa0,0xb9,0x8c,0x96,0xb3,0x82,0x8c,0xab,0x3e, 0x3f,0x57,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,0x96,0x9b,0xac,0x5d,0x6a,0x91,0x52,0x54, 0x7e,0x52,0x53,0x7d,0x5c,0x52,0x79,0x53,0x5e,0x88,0x75,0x6f,0x7f,0x61,0x4d,0x60, 0x77,0x62,0x7c,0x68,0x6a,0x8f,0x4a,0x4f,0x5f,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,0x04,0x04,0x05,0x4c,0x55,0x73,0x45,0x43,0x6a,0x4e,0x44, 0x66,0x5c,0x50,0x76,0x5e,0x53,0x79,0x5e,0x53,0x79,0x5d,0x52,0x79,0x5e,0x53,0x79, 0x5b,0x52,0x79,0x58,0x50,0x79,0x5a,0x52,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x57, 0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x5a,0x52,0x79,0x5b,0x4f,0x74,0x4a,0x41, 0x63,0x44,0x41,0x66,0x4d,0x57,0x79,0x1c,0x1d,0x21,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,0x0f,0x0c,0x0f,0x48,0x37,0x46,0x49,0x38,0x47,0x4b,0x3b,0x49,0x84, 0x8e,0xa7,0x4d,0x57,0x78,0x51,0x5c,0x81,0x57,0x62,0x8b,0x59,0x63,0x8b,0x59,0x63, 0x8b,0x5a,0x64,0x8c,0x59,0x63,0x8c,0x5a,0x64,0x8c,0x57,0x63,0x8b,0x58,0x63,0x8b, 0x57,0x63,0x8b,0x57,0x62,0x8b,0x55,0x62,0x8a,0x56,0x62,0x89,0x54,0x60,0x88,0x53, 0x5e,0x87,0x53,0x5e,0x87,0x52,0x5d,0x85,0x52,0x5d,0x84,0x36,0x3d,0x5b,0x33,0x3c, 0x57,0x35,0x3b,0x58,0x41,0x47,0x6b,0x13,0x14,0x19,0x13,0x15,0x1a,0x11,0x12,0x18, 0x10,0x10,0x16,0x0f,0x0f,0x14,0x0b,0x0b,0x0f,0x07,0x07,0x0a,0x06,0x06,0x09,0x06, 0x06,0x08,0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x09,0x07,0x07,0x0a,0x08,0x08, 0x0b,0x09,0x09,0x0c,0x0a,0x0a,0x0e,0x0b,0x0b,0x0e,0x0e,0x0c,0x10,0x0f,0x0d,0x11, 0x10,0x0e,0x12,0x0e,0x0c,0x10,0x0c,0x0a,0x0e,0x08,0x08,0x0a,0x06,0x06,0x07,0x04, 0x05,0x06,0x03,0x04,0x05,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,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,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,0x2e,0x2e,0x2e,0x35,0x35,0x35,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,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,0x10,0x10,0x10,0x8d,0x8d,0x8d,0xd7, 0xd7,0xd7,0xfa,0xfa,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc,0xfc,0xde,0xde,0xde,0xfc,0xfc,0xfc, 0xff,0xff,0xff,0xff,0xff,0xff,0x36,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0xad, 0xad,0xad,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0x25,0x25,0x25,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x48,0x49,0x55,0x77,0x83,0xa4,0x52,0x4f,0x7a,0x64,0x53,0x75,0x64,0x4f,0x6e,0x64, 0x4f,0x6d,0x64,0x53,0x73,0x5f,0x4c,0x6a,0x2e,0x21,0x33,0x2d,0x20,0x31,0x2d,0x20, 0x31,0x2a,0x1d,0x2d,0x19,0x10,0x18,0x0b,0x08,0x0a,0x39,0x2b,0x34,0x22,0x18,0x1c, 0x1f,0x15,0x19,0x1d,0x14,0x18,0x1d,0x14,0x18,0x20,0x16,0x1a,0x22,0x18,0x1c,0x26, 0x1b,0x20,0x31,0x27,0x2f,0x86,0x91,0xaf,0x52,0x52,0x7c,0x67,0x73,0x99,0x5c,0x48, 0x5c,0x60,0x4d,0x5f,0x62,0x4e,0x62,0x07,0x06,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x95,0x9f,0xb9,0x96,0xa0,0xb9,0x96,0xa0,0xba,0x67,0x55,0x68,0x63,0x4f,0x63,0x66, 0x52,0x66,0x67,0x53,0x67,0x68,0x54,0x69,0x65,0x51,0x65,0x5b,0x48,0x5a,0x6c,0x6a, 0x7d,0x98,0xa1,0xbb,0x86,0x91,0xaf,0x9c,0xa5,0xbe,0x9d,0xa5,0xbe,0x90,0x9a,0xb5, 0x52,0x56,0x73,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,0x2a,0x2b,0x2c,0x83, 0x8d,0xac,0x5b,0x66,0x8e,0x52,0x56,0x81,0x52,0x4f,0x7a,0x52,0x50,0x7c,0x74,0x77, 0x90,0x5e,0x4a,0x5d,0x76,0x62,0x7b,0x69,0x74,0x98,0x3a,0x3e,0x4a,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,0x14,0x15,0x16,0x5e, 0x69,0x89,0x43,0x40,0x66,0x4d,0x46,0x6a,0x5b,0x52,0x77,0x5b,0x52,0x79,0x5b,0x52, 0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x55,0x50,0x79,0x53,0x4f,0x7a,0x53,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x55, 0x50,0x79,0x58,0x50,0x77,0x4b,0x45,0x69,0x40,0x40,0x66,0x4c,0x54,0x70,0x06,0x07, 0x07,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,0x30,0x26,0x2f,0x47,0x37,0x43,0x49,0x39,0x46, 0x88,0x80,0x8a,0x68,0x72,0x91,0x49,0x53,0x75,0x58,0x64,0x8a,0x5a,0x65,0x8c,0x5a, 0x66,0x8c,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x59,0x65,0x8c,0x5a,0x64,0x8c,0x5a,0x64, 0x8c,0x59,0x64,0x8c,0x58,0x63,0x8b,0x56,0x62,0x8b,0x56,0x62,0x8a,0x56,0x62,0x89, 0x55,0x62,0x89,0x54,0x60,0x88,0x53,0x60,0x87,0x53,0x5e,0x87,0x4c,0x56,0x7e,0x33, 0x3b,0x59,0x33,0x3b,0x58,0x35,0x3c,0x5a,0x3f,0x48,0x6b,0x13,0x14,0x19,0x12,0x13, 0x18,0x0f,0x11,0x16,0x0e,0x0e,0x13,0x0a,0x0a,0x0e,0x07,0x07,0x0a,0x05,0x05,0x07, 0x03,0x04,0x05,0x03,0x04,0x05,0x04,0x04,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06, 0x06,0x09,0x06,0x07,0x0a,0x07,0x07,0x0a,0x07,0x08,0x0a,0x09,0x09,0x0c,0x0a,0x0a, 0x0e,0x0c,0x0b,0x0e,0x0e,0x0c,0x0f,0x0c,0x0a,0x0e,0x0a,0x09,0x0b,0x07,0x06,0x09, 0x06,0x05,0x07,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x03,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,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,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,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,0x57,0x57,0x57,0xc5,0xc5,0xc5,0xed,0xed,0xed, 0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xfa,0xfa,0xfa,0xcd,0xcd,0xcd,0x59,0x59,0x59,0xb8,0xb8, 0xb8,0xff,0xff,0xff,0xff,0xff,0xff,0xea,0xea,0xea,0x02,0x02,0x02,0x00,0x00,0x00, 0x03,0x03,0x03,0xf4,0xf4,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xbf,0xbf,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x55,0x62,0x79,0x84,0xa5,0x52,0x52,0x7c, 0x64,0x53,0x76,0x64,0x4d,0x6b,0x63,0x4b,0x67,0x46,0x34,0x4b,0x2d,0x21,0x31,0x2d, 0x20,0x31,0x2c,0x1f,0x31,0x27,0x1b,0x29,0x07,0x05,0x07,0x28,0x1f,0x25,0x31,0x24, 0x2b,0x23,0x19,0x1d,0x1d,0x14,0x17,0x1c,0x13,0x17,0x1d,0x14,0x17,0x20,0x16,0x1a, 0x22,0x17,0x1c,0x26,0x1b,0x20,0x4b,0x48,0x58,0x74,0x80,0xa2,0x5b,0x52,0x79,0x65, 0x71,0x96,0x59,0x45,0x58,0x5e,0x4a,0x5c,0x5f,0x4b,0x5d,0x5f,0x4b,0x5e,0x09,0x07, 0x09,0x00,0x00,0x00,0x7d,0x89,0xa8,0x91,0x9a,0xb5,0x78,0x74,0x8a,0x5f,0x4c,0x5e, 0x62,0x4e,0x62,0x64,0x50,0x64,0x66,0x52,0x66,0x63,0x4f,0x63,0x5a,0x47,0x58,0x5c, 0x54,0x66,0xb1,0xb8,0xcb,0x86,0x91,0xaf,0xaa,0xb2,0xc7,0xa8,0xaf,0xc4,0x9d,0xa5, 0xbe,0x62,0x67,0x86,0x04,0x04,0x05,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,0x8e,0x93,0xa0,0x67,0x73,0x99,0x57,0x63,0x8c,0x52,0x52,0x7d,0x52, 0x4f,0x7a,0x6b,0x75,0x9a,0x61,0x50,0x60,0x74,0x60,0x78,0x6d,0x77,0x9b,0x27,0x2a, 0x32,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,0x36,0x37,0x39,0x5b,0x66,0x8a,0x40,0x3e,0x63,0x4e,0x4a,0x6f,0x53, 0x4f,0x7a,0x55,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x52,0x7d, 0x52,0x50,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x50,0x4d,0x74,0x41,0x40,0x65,0x3e, 0x48,0x6a,0x42,0x49,0x5c,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,0x0b,0x08,0x0b,0x45,0x35,0x41,0x46,0x36, 0x42,0x48,0x38,0x44,0xae,0xb2,0xc2,0x55,0x5e,0x7e,0x51,0x5b,0x7f,0x59,0x65,0x8d, 0x5b,0x66,0x8f,0x5a,0x66,0x8d,0x5c,0x68,0x90,0x5a,0x65,0x8d,0x5a,0x66,0x8f,0x5a, 0x66,0x8e,0x5a,0x65,0x8c,0x5b,0x65,0x8e,0x5a,0x64,0x8c,0x57,0x63,0x8b,0x56,0x63, 0x8b,0x56,0x62,0x8b,0x55,0x62,0x89,0x55,0x61,0x89,0x55,0x61,0x89,0x53,0x5e,0x88, 0x47,0x52,0x75,0x33,0x3a,0x58,0x32,0x3a,0x57,0x35,0x3d,0x5a,0x3b,0x43,0x63,0x11, 0x12,0x16,0x12,0x12,0x16,0x0e,0x0f,0x12,0x0a,0x0c,0x0e,0x07,0x08,0x0a,0x05,0x06, 0x07,0x04,0x05,0x06,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x04,0x05, 0x04,0x05,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x06,0x06,0x09,0x07,0x07,0x0a,0x07, 0x07,0x0a,0x08,0x08,0x0a,0x0a,0x09,0x0b,0x0a,0x0a,0x0c,0x09,0x08,0x0a,0x08,0x07, 0x0a,0x06,0x06,0x07,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x04,0x02,0x02,0x03, 0x02,0x02,0x02,0x00,0x00,0x00,0x02,0x02,0x02,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,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,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,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,0x32,0x32,0x32,0xb8,0xb8,0xb8,0xee,0xee,0xee,0xfd,0xfd,0xfd,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xfd,0xfd,0xfd,0xf6,0xf6,0xf6,0xc0,0xc0,0xc0,0x45,0x45,0x45,0x00,0x00,0x00,0x1e, 0x1e,0x1e,0xf5,0xf5,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x5f,0x5f,0x00,0x00, 0x00,0x00,0x00,0x00,0x8f,0x8f,0x8f,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xf9,0xf9,0xf9, 0x34,0x34,0x34,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,0x5f,0x5f, 0x6c,0x7d,0x88,0xa8,0x52,0x55,0x80,0x63,0x53,0x77,0x61,0x49,0x66,0x2c,0x1e,0x2e, 0x2c,0x1f,0x30,0x2d,0x20,0x31,0x2c,0x1e,0x30,0x24,0x18,0x25,0x0c,0x08,0x0a,0x3e, 0x2f,0x3a,0x29,0x1e,0x24,0x23,0x18,0x1d,0x1b,0x12,0x15,0x1a,0x12,0x14,0x1d,0x13, 0x17,0x1f,0x15,0x19,0x22,0x17,0x1c,0x23,0x19,0x1e,0x5e,0x62,0x78,0x60,0x6d,0x94, 0x53,0x50,0x79,0x58,0x64,0x8c,0x57,0x44,0x55,0x5d,0x4a,0x5c,0x5c,0x49,0x5a,0x5c, 0x49,0x5a,0x5d,0x4a,0x5c,0x14,0x10,0x14,0x0c,0x04,0x05,0x8e,0x98,0xb3,0x5f,0x4e, 0x61,0x5f,0x4b,0x5d,0x61,0x4d,0x60,0x62,0x4e,0x62,0x62,0x4e,0x62,0x59,0x46,0x57, 0x59,0x50,0x64,0x8d,0x95,0xaf,0x86,0x91,0xaf,0xaa,0xb1,0xc7,0xb4,0xbb,0xce,0xa7, 0xaf,0xc4,0x79,0x7f,0x9c,0x0b,0x09,0x0d,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,0x32,0x33,0x37,0x98,0xa1,0xba,0x5c,0x69,0x90, 0x52,0x5d,0x86,0x52,0x4f,0x7a,0x5a,0x65,0x8d,0x77,0x6d,0x7e,0x70,0x5b,0x72,0x70, 0x7b,0x9e,0x19,0x1b,0x20,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,0x5a,0x5d,0x63,0x4e,0x5a,0x7d, 0x3e,0x3c,0x5f,0x50,0x4d,0x76,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52, 0x50,0x7c,0x52,0x50,0x7c,0x52,0x50,0x7c,0x52,0x50,0x7b,0x52,0x52,0x7d,0x52,0x52, 0x7c,0x52,0x56,0x81,0x52,0x58,0x83,0x52,0x5a,0x84,0x52,0x53,0x7e,0x52,0x53,0x7d, 0x4d,0x4d,0x75,0x3e,0x46,0x67,0x4e,0x58,0x79,0x44,0x45,0x4a,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,0x2a,0x20,0x28,0x44, 0x34,0x40,0x46,0x36,0x42,0x73,0x67,0x72,0x83,0x8d,0xa9,0x4d,0x57,0x78,0x58,0x64, 0x8b,0x5c,0x69,0x8f,0x5c,0x69,0x8f,0x5d,0x6a,0x90,0x5c,0x67,0x8f,0x5d,0x69,0x90, 0x5c,0x68,0x90,0x5c,0x68,0x90,0x5c,0x68,0x90,0x5c,0x68,0x8f,0x5a,0x65,0x8e,0x5a, 0x64,0x8c,0x59,0x64,0x8c,0x58,0x63,0x8b,0x56,0x62,0x8a,0x55,0x62,0x8a,0x55,0x61, 0x8a,0x54,0x60,0x88,0x40,0x4b,0x6b,0x32,0x3c,0x58,0x31,0x39,0x56,0x35,0x3d,0x5c, 0x33,0x38,0x53,0x0e,0x0e,0x12,0x0e,0x0e,0x11,0x0b,0x0c,0x0e,0x08,0x09,0x0a,0x06, 0x06,0x08,0x04,0x04,0x06,0x03,0x03,0x04,0x02,0x02,0x04,0x02,0x02,0x04,0x03,0x03, 0x04,0x03,0x03,0x05,0x03,0x04,0x05,0x04,0x05,0x06,0x04,0x05,0x06,0x05,0x05,0x06, 0x06,0x06,0x07,0x06,0x06,0x08,0x06,0x06,0x09,0x07,0x06,0x09,0x07,0x07,0x09,0x07, 0x06,0x09,0x06,0x05,0x07,0x04,0x04,0x06,0x03,0x03,0x05,0x02,0x02,0x04,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,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,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,0x37,0x37,0x37,0x94,0x94,0x94, 0xc4,0xc4,0xc4,0xe0,0xe0,0xe0,0xfb,0xfb,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfc, 0xfc,0xeb,0xeb,0xeb,0x9b,0x9b,0x9b,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x8c,0x8c,0x8c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x12, 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0xeb,0xfd,0xfd,0xfd,0xff,0xff, 0xff,0xcb,0xcb,0xcb,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,0x68,0x69,0x78,0x79,0x83,0xa4,0x52,0x50,0x7c,0x48,0x3a, 0x52,0x2d,0x21,0x31,0x2a,0x1e,0x2d,0x2b,0x1e,0x2e,0x29,0x1c,0x2c,0x1c,0x12,0x1b, 0x13,0x0e,0x12,0x38,0x2a,0x33,0x25,0x1a,0x1f,0x20,0x16,0x1a,0x1a,0x11,0x14,0x1b, 0x12,0x15,0x1c,0x13,0x16,0x1d,0x14,0x18,0x20,0x17,0x1b,0x23,0x18,0x1d,0x68,0x70, 0x8c,0x53,0x5e,0x88,0x52,0x4f,0x7a,0x57,0x4e,0x70,0x57,0x45,0x55,0x59,0x47,0x58, 0x5a,0x47,0x58,0x59,0x46,0x57,0x5a,0x47,0x58,0x5b,0x48,0x59,0x4b,0x38,0x48,0x7e, 0x84,0xa0,0x5c,0x49,0x5a,0x5e,0x4b,0x5d,0x62,0x4e,0x61,0x60,0x4c,0x5f,0x59,0x47, 0x58,0x69,0x61,0x72,0x8b,0x92,0xac,0x81,0x8b,0xaa,0xaf,0xb5,0xca,0xba,0xc1,0xd1, 0xb5,0xbc,0xcf,0x94,0x9b,0xb3,0x18,0x15,0x1d,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,0xb2,0xb5, 0xbe,0x69,0x74,0x9a,0x55,0x62,0x8b,0x58,0x50,0x79,0x52,0x5d,0x88,0x7f,0x81,0x98, 0x6c,0x57,0x6d,0x70,0x7b,0x9d,0x0f,0x10,0x13,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,0x73,0x77,0x85,0x40,0x4b,0x6d,0x43,0x41,0x67,0x52,0x50,0x7b,0x52,0x50,0x7b, 0x52,0x50,0x7c,0x52,0x52,0x7c,0x52,0x55,0x80,0x52,0x56,0x81,0x52,0x57,0x83,0x52, 0x57,0x82,0x52,0x5b,0x85,0x52,0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5d, 0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5c,0x85,0x45,0x4f,0x6e,0x76,0x7d,0x91, 0x1b,0x1b,0x1b,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,0x08,0x06,0x08, 0x41,0x32,0x3d,0x43,0x33,0x3e,0x46,0x36,0x42,0xb0,0xb0,0xbe,0x5e,0x68,0x88,0x51, 0x5b,0x7e,0x5c,0x69,0x8f,0x5d,0x69,0x90,0x5e,0x6b,0x91,0x5e,0x6b,0x91,0x5e,0x6a, 0x91,0x5f,0x6c,0x92,0x5e,0x6a,0x91,0x5e,0x6a,0x91,0x5d,0x69,0x90,0x5c,0x69,0x90, 0x5c,0x68,0x8f,0x5b,0x68,0x8e,0x5a,0x64,0x8c,0x5a,0x64,0x8c,0x57,0x62,0x8b,0x57, 0x62,0x8a,0x55,0x62,0x8a,0x54,0x61,0x89,0x38,0x42,0x61,0x33,0x39,0x56,0x31,0x38, 0x56,0x39,0x40,0x62,0x18,0x1c,0x26,0x0a,0x0a,0x0c,0x0a,0x0a,0x0c,0x07,0x08,0x0a, 0x06,0x06,0x07,0x04,0x05,0x06,0x03,0x03,0x05,0x02,0x02,0x02,0x02,0x02,0x03,0x02, 0x02,0x03,0x02,0x02,0x04,0x02,0x02,0x04,0x03,0x03,0x04,0x03,0x03,0x05,0x03,0x04, 0x05,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x05,0x06,0x05,0x05,0x06,0x05,0x05,0x06, 0x05,0x05,0x06,0x05,0x05,0x06,0x03,0x03,0x05,0x03,0x03,0x04,0x02,0x02,0x04,0x02, 0x02,0x03,0x02,0x02,0x02,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,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,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,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,0x4d,0x4d,0x4d,0x92,0x92,0x92,0xd3,0xd3,0xd3,0xfb,0xfb, 0xfb,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xf6,0xf6,0xf6,0xc9, 0xc9,0xc9,0x56,0x56,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff, 0xa8,0xa8,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x77,0x77,0xfd,0xfd,0xfd,0xff, 0xff,0xff,0xfa,0xfa,0xfa,0x54,0x54,0x54,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,0x6d,0x6e,0x7f,0x6d, 0x78,0x9c,0x29,0x22,0x3b,0x2e,0x21,0x33,0x2d,0x20,0x31,0x2a,0x1d,0x2d,0x24,0x18, 0x26,0x10,0x09,0x0d,0x1f,0x17,0x1d,0x2d,0x21,0x27,0x25,0x1a,0x1f,0x1b,0x12,0x15, 0x1a,0x11,0x14,0x1a,0x11,0x14,0x1d,0x14,0x17,0x1d,0x14,0x17,0x20,0x16,0x1a,0x24, 0x19,0x1e,0x6f,0x78,0x9a,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x59,0x46,0x5d,0x55,0x43, 0x53,0x57,0x44,0x55,0x56,0x44,0x54,0x57,0x44,0x55,0x58,0x46,0x56,0x59,0x46,0x57, 0x5a,0x47,0x58,0x5a,0x48,0x5a,0x5c,0x49,0x5a,0x5e,0x4b,0x5d,0x60,0x4c,0x5f,0x5b, 0x48,0x5a,0x59,0x48,0x57,0xa7,0xaf,0xc4,0x8d,0x98,0xb3,0xa5,0xad,0xc3,0xbf,0xc5, 0xd5,0xb4,0xb9,0xc9,0xa0,0xa6,0xbb,0x1d,0x1a,0x24,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,0xa0,0xa8,0xbd,0x56,0x63,0x8b,0x52,0x50,0x7b,0x52,0x52, 0x7d,0x7b,0x84,0xa6,0x71,0x5e,0x73,0x73,0x7e,0xa0,0x09,0x0a,0x0c,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,0x09,0x09,0x09,0x77,0x7d,0x90,0x3f,0x48,0x6c,0x48,0x48, 0x71,0x52,0x54,0x7e,0x52,0x55,0x81,0x52,0x56,0x81,0x52,0x58,0x83,0x52,0x5c,0x86, 0x52,0x5c,0x86,0x53,0x5e,0x89,0x53,0x5f,0x89,0x54,0x60,0x8a,0x54,0x60,0x8a,0x54, 0x5f,0x8a,0x55,0x60,0x8a,0x56,0x62,0x8b,0x56,0x63,0x8b,0x58,0x64,0x8c,0x4e,0x57, 0x7c,0x56,0x5e,0x76,0x97,0x9a,0x9d,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,0x26,0x1d,0x23,0x40,0x30,0x3b,0x42,0x32,0x3d,0x58,0x4a,0x55,0x8e,0x98,0xb3, 0x50,0x5a,0x79,0x5c,0x67,0x8c,0x60,0x6c,0x92,0x5e,0x6a,0x90,0x5e,0x6b,0x91,0x5f, 0x6b,0x91,0x60,0x6c,0x92,0x5f,0x6c,0x92,0x60,0x6c,0x92,0x5e,0x6b,0x91,0x5e,0x6a, 0x91,0x5d,0x69,0x90,0x5c,0x68,0x90,0x5b,0x68,0x8e,0x5a,0x66,0x8e,0x5a,0x65,0x8c, 0x5a,0x65,0x8c,0x59,0x63,0x8b,0x57,0x62,0x8a,0x54,0x60,0x86,0x34,0x3e,0x5b,0x33, 0x3a,0x58,0x30,0x38,0x54,0x3f,0x4a,0x6f,0x05,0x06,0x07,0x06,0x06,0x08,0x06,0x06, 0x07,0x05,0x05,0x06,0x04,0x05,0x06,0x03,0x03,0x05,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x04,0x02,0x02,0x03,0x02, 0x02,0x04,0x03,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x05,0x03,0x04,0x05,0x03,0x04, 0x05,0x04,0x04,0x06,0x03,0x03,0x05,0x03,0x03,0x04,0x02,0x02,0x04,0x02,0x02,0x04, 0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,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,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,0x2b,0x2b,0x2b,0xdf,0xdf,0xdf,0xf7,0xf7,0xf7,0xfd, 0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0xe0,0xe0,0xe0,0x87,0x87,0x87, 0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x3d,0x3d,0xfa,0xfa,0xfa,0xff,0xff, 0xff,0xff,0xff,0xff,0x36,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0xdd, 0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xd5,0xd5,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,0x53,0x54,0x68,0x2a,0x2c,0x44,0x2e,0x24,0x38,0x2d,0x20,0x31,0x2c, 0x1e,0x30,0x22,0x17,0x24,0x42,0x35,0x41,0x3e,0x2f,0x3a,0x29,0x1d,0x23,0x26,0x1b, 0x20,0x1a,0x11,0x14,0x1b,0x12,0x15,0x1b,0x12,0x15,0x1d,0x13,0x17,0x1d,0x14,0x18, 0x1e,0x15,0x19,0x23,0x18,0x1d,0x72,0x7e,0xa0,0x5a,0x52,0x79,0x52,0x53,0x7e,0x52, 0x3f,0x50,0x52,0x40,0x4f,0x54,0x42,0x51,0x55,0x42,0x52,0x56,0x44,0x54,0x57,0x44, 0x55,0x57,0x44,0x55,0x59,0x46,0x57,0x59,0x46,0x57,0x5a,0x47,0x58,0x5d,0x4a,0x5c, 0x5a,0x47,0x58,0x51,0x3f,0x4e,0xae,0xb1,0xc1,0xa3,0xab,0xc2,0x9d,0xa5,0xbe,0xc0, 0xc6,0xd6,0xc6,0xcb,0xd9,0xa4,0xa6,0xb7,0x25,0x25,0x37,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,0x03,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x46,0x51,0x69,0x74,0x98,0x53, 0x5d,0x88,0x56,0x62,0x8b,0x72,0x7d,0xa0,0x8b,0x81,0x95,0x75,0x80,0xa1,0x04,0x04, 0x05,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,0x1b,0x1b,0x1b,0x6e, 0x75,0x93,0x3c,0x44,0x66,0x4d,0x53,0x7c,0x52,0x57,0x82,0x52,0x5c,0x86,0x53,0x5e, 0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x56,0x63,0x8b,0x56,0x62,0x8b,0x57,0x64,0x8c, 0x56,0x63,0x8b,0x57,0x63,0x8c,0x5a,0x65,0x8d,0x58,0x65,0x8d,0x5a,0x65,0x8d,0x5b, 0x67,0x90,0x5e,0x6a,0x90,0x53,0x5e,0x7d,0x81,0x86,0x99,0x5a,0x5a,0x5a,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,0x09,0x07,0x08,0x3e,0x2f,0x3a,0x40,0x31,0x3c,0x41,0x32,0x3d,0xaf,0xac, 0xb5,0x67,0x71,0x92,0x54,0x5f,0x82,0x5f,0x6c,0x92,0x5f,0x6c,0x92,0x60,0x6c,0x92, 0x60,0x6c,0x92,0x60,0x6c,0x92,0x60,0x6d,0x92,0x60,0x6c,0x92,0x62,0x6e,0x93,0x60, 0x6c,0x92,0x5f,0x6c,0x92,0x60,0x6c,0x92,0x5d,0x6a,0x91,0x5c,0x68,0x90,0x5b,0x68, 0x8f,0x5a,0x66,0x8f,0x5a,0x65,0x8d,0x59,0x65,0x8c,0x57,0x63,0x8a,0x4d,0x57,0x7f, 0x35,0x3e,0x5c,0x33,0x3c,0x59,0x33,0x38,0x58,0x43,0x52,0x7b,0x03,0x03,0x04,0x03, 0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x05,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x03,0x02,0x02,0x04,0x02,0x02,0x04,0x02, 0x02,0x04,0x02,0x02,0x04,0x02,0x02,0x03,0x02,0x02,0x04,0x02,0x02,0x03,0x02,0x02, 0x03,0x02,0x02,0x02,0x02,0x02,0x02,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,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,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,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,0x87,0x87,0x87, 0xe2,0xe2,0xe2,0xf1,0xf1,0xf1,0xfa,0xfa,0xfa,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, 0xfd,0xfd,0xfa,0xfa,0xfa,0xdd,0xdd,0xdd,0x8e,0x8e,0x8e,0x0a,0x0a,0x0a,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,0xb0,0xb0,0xb0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x06,0x06,0x06,0x00,0x00,0x00,0x29,0x29, 0x29,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x5e,0x5e,0x5e,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,0x03,0x03,0x03,0x30,0x2f,0x42,0x26,0x25,0x3e, 0x2e,0x22,0x35,0x29,0x1c,0x2c,0x21,0x16,0x22,0x66,0x52,0x66,0x5a,0x47,0x58,0x37, 0x29,0x32,0x22,0x17,0x1c,0x1b,0x12,0x15,0x1b,0x13,0x16,0x1a,0x12,0x15,0x1a,0x11, 0x14,0x1d,0x14,0x18,0x1f,0x15,0x19,0x31,0x2c,0x37,0x6c,0x77,0x9b,0x62,0x53,0x77, 0x52,0x5d,0x88,0x4a,0x39,0x48,0x50,0x3e,0x4d,0x51,0x3f,0x4e,0x53,0x41,0x50,0x53, 0x41,0x50,0x54,0x42,0x51,0x56,0x43,0x53,0x56,0x44,0x54,0x58,0x45,0x56,0x5b,0x48, 0x59,0x59,0x46,0x57,0x51,0x40,0x4f,0x64,0x5b,0x69,0xb1,0xb8,0xcb,0x96,0xa0,0xba, 0xc4,0xc9,0xd8,0xbb,0xc1,0xd2,0x9f,0xa7,0xbc,0x26,0x28,0x42,0x2c,0x24,0x39,0x29, 0x24,0x36,0x02,0x02,0x03,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,0x1f,0x18,0x1d,0x38,0x2a,0x33,0x66,0x52,0x66,0x19,0x14, 0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x66,0x6f,0x8a,0x53,0x5f,0x89,0x5a,0x66,0x8e,0x6f,0x7b,0x9f,0xa0,0x9f,0xb4,0x7e, 0x88,0xa8,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,0x28,0x29,0x2b,0x54,0x5d,0x7e,0x3e,0x47,0x6a,0x50,0x5c,0x85,0x54, 0x5f,0x89,0x55,0x62,0x8b,0x55,0x60,0x8a,0x58,0x65,0x8d,0x58,0x65,0x8d,0x5b,0x66, 0x8e,0x5a,0x66,0x8e,0x5a,0x66,0x8e,0x5a,0x66,0x8e,0x5b,0x67,0x90,0x5c,0x67,0x90, 0x5f,0x6c,0x93,0x63,0x6f,0x95,0x69,0x73,0x98,0x6e,0x7a,0x9b,0x71,0x7a,0x93,0xab, 0xaf,0xb9,0x18,0x18,0x18,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,0x29,0x1f,0x26,0x3f,0x30,0x3b,0x3f,0x30,0x3b,0x44, 0x35,0x40,0x9b,0xa2,0xba,0x55,0x5e,0x7f,0x60,0x6b,0x90,0x60,0x6d,0x93,0x62,0x6d, 0x93,0x62,0x6e,0x93,0x63,0x6e,0x94,0x62,0x6e,0x93,0x62,0x6e,0x93,0x63,0x6e,0x93, 0x60,0x6d,0x92,0x62,0x6d,0x93,0x62,0x6d,0x93,0x5f,0x6c,0x92,0x5f,0x6c,0x92,0x5f, 0x6b,0x91,0x5e,0x6b,0x91,0x5d,0x69,0x91,0x5c,0x68,0x90,0x59,0x65,0x8d,0x57,0x64, 0x8c,0x46,0x51,0x74,0x35,0x3e,0x5c,0x34,0x3d,0x5a,0x35,0x3d,0x5a,0x46,0x55,0x7f, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,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,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,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,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,0x1f,0x1f,0x1f,0x6a,0x6a,0x6a,0x98,0x98,0x98, 0x94,0x94,0x94,0x5d,0x5d,0x5d,0x07,0x07,0x07,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, 0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0x73,0x73,0x73,0x00,0x00,0x00,0x00, 0x00,0x00,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xef,0xef,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,0x05,0x04, 0x06,0x2b,0x2c,0x40,0x26,0x22,0x3b,0x28,0x1b,0x2a,0x3b,0x2a,0x39,0x69,0x54,0x69, 0x4f,0x3e,0x4c,0x49,0x38,0x46,0x2b,0x1f,0x25,0x1a,0x11,0x14,0x1a,0x11,0x14,0x1a, 0x11,0x14,0x1b,0x12,0x15,0x1c,0x13,0x17,0x1d,0x14,0x18,0x42,0x44,0x57,0x5b,0x67, 0x90,0x64,0x53,0x75,0x52,0x50,0x7b,0x4b,0x3a,0x48,0x4d,0x3c,0x4a,0x4f,0x3d,0x4c, 0x4f,0x3d,0x4c,0x4c,0x3b,0x49,0x46,0x36,0x44,0x41,0x33,0x3f,0x40,0x33,0x3f,0x44, 0x36,0x42,0x4c,0x3b,0x4a,0x4e,0x3d,0x4c,0x4b,0x3d,0x49,0xb0,0xb8,0xcb,0x86,0x91, 0xaf,0xc1,0xc7,0xd7,0xcb,0xd0,0xdd,0xb9,0xbf,0xd0,0x2b,0x2d,0x46,0x2a,0x1e,0x2d, 0x2a,0x1d,0x2d,0x62,0x50,0x6e,0x4d,0x44,0x64,0x10,0x0e,0x15,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,0x1f,0x17,0x1c,0x34,0x27,0x2f,0x36,0x28,0x30,0x65, 0x51,0x65,0x66,0x52,0x66,0x3f,0x32,0x3f,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x25,0x27,0x32,0x58,0x64,0x8c,0x5b,0x67,0x90,0x6c,0x77,0x9c, 0xa7,0xaf,0xc5,0x81,0x8a,0xa7,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,0x4e,0x4c,0x56,0x45,0x4f,0x6e, 0x45,0x4e,0x72,0x54,0x5f,0x88,0x56,0x63,0x8b,0x58,0x65,0x8d,0x5c,0x67,0x90,0x5c, 0x69,0x90,0x5c,0x69,0x90,0x5d,0x69,0x91,0x5e,0x6b,0x92,0x5e,0x6a,0x92,0x60,0x6c, 0x93,0x60,0x6d,0x94,0x66,0x72,0x98,0x6a,0x76,0x9a,0x71,0x7d,0xa0,0x7a,0x85,0xa5, 0x7d,0x88,0xa3,0x90,0x96,0xaa,0x89,0x8a,0x8f,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,0x0d,0x0a,0x0c,0x3c,0x2e,0x38,0x3e,0x2f,0x39, 0x3f,0x30,0x3b,0x96,0x92,0x9e,0x61,0x6c,0x8a,0x54,0x5f,0x7f,0x60,0x6d,0x92,0x62, 0x6d,0x93,0x63,0x6f,0x94,0x64,0x6f,0x94,0x64,0x6f,0x94,0x64,0x6f,0x94,0x64,0x71, 0x95,0x65,0x71,0x95,0x65,0x71,0x95,0x63,0x6f,0x94,0x62,0x6e,0x93,0x62,0x6d,0x93, 0x60,0x6d,0x92,0x5f,0x6c,0x92,0x5f,0x6b,0x91,0x5e,0x6a,0x90,0x5c,0x69,0x8f,0x5b, 0x67,0x8d,0x59,0x64,0x8d,0x3f,0x47,0x69,0x35,0x3d,0x5a,0x35,0x3d,0x5b,0x39,0x42, 0x61,0x3e,0x46,0x68,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,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,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,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,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,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,0x50,0x50,0x50,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0x0f, 0x00,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0xf5,0xfd,0xfd,0xfd,0xff,0xff,0xff,0x94, 0x94,0x94,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,0x06,0x05,0x08,0x27,0x28,0x3e,0x2c,0x1f,0x30,0x59,0x45, 0x58,0x63,0x4f,0x62,0x4b,0x3a,0x48,0x46,0x36,0x42,0x31,0x24,0x2b,0x28,0x1d,0x23, 0x19,0x11,0x14,0x19,0x10,0x13,0x1a,0x12,0x15,0x1c,0x13,0x16,0x1d,0x14,0x17,0x56, 0x5d,0x77,0x52,0x5c,0x85,0x64,0x53,0x76,0x61,0x52,0x75,0x49,0x38,0x46,0x4c,0x3b, 0x49,0x4e,0x3d,0x4b,0x4b,0x3a,0x48,0x3b,0x2e,0x39,0x27,0x1e,0x25,0x19,0x13,0x18, 0x15,0x11,0x15,0x1a,0x15,0x19,0x2a,0x21,0x28,0x37,0x2b,0x34,0xb3,0xb9,0xca,0x86, 0x91,0xaf,0xb5,0xbc,0xcf,0xca,0xcf,0xdb,0xbd,0xc2,0xd2,0x36,0x37,0x4f,0x2d,0x21, 0x33,0x2c,0x1f,0x30,0x51,0x3b,0x54,0x57,0x40,0x5a,0x64,0x4c,0x69,0x5a,0x50,0x76, 0x28,0x25,0x36,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,0x16,0x11,0x14,0x33,0x26,0x2e,0x32,0x25,0x2d, 0xb3,0xb6,0xc7,0x58,0x64,0x8d,0x56,0x4b,0x62,0x66,0x52,0x66,0x68,0x53,0x68,0x32, 0x28,0x32,0x09,0x07,0x09,0x0c,0x09,0x0b,0x63,0x61,0x72,0x8a,0x94,0xb1,0x74,0x80, 0xa2,0x6d,0x79,0x9d,0xa3,0xab,0xc2,0x7f,0x85,0x9c,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,0x73,0x6d,0x7e,0x46,0x4f,0x6f,0x4c,0x56,0x7c,0x56,0x63,0x8b,0x5d,0x69,0x91, 0x5d,0x6a,0x91,0x5e,0x6a,0x91,0x5f,0x6c,0x93,0x60,0x6c,0x93,0x63,0x6f,0x95,0x63, 0x6f,0x95,0x64,0x71,0x96,0x66,0x72,0x98,0x6d,0x79,0x9c,0x76,0x82,0xa3,0x80,0x8b, 0xaa,0x88,0x92,0xb0,0x8e,0x98,0xb3,0x80,0x86,0x9d,0xa7,0xac,0xbb,0x43,0x44,0x46, 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,0x2e,0x22,0x2a,0x3c,0x2d, 0x37,0x3d,0x2e,0x39,0x42,0x34,0x3d,0x83,0x8d,0xa8,0x4f,0x58,0x79,0x61,0x6b,0x8f, 0x63,0x6f,0x94,0x64,0x71,0x95,0x64,0x71,0x95,0x64,0x71,0x95,0x65,0x71,0x95,0x66, 0x72,0x97,0x65,0x72,0x97,0x65,0x72,0x97,0x66,0x73,0x97,0x62,0x6e,0x93,0x63,0x6f, 0x94,0x63,0x6f,0x94,0x62,0x6d,0x93,0x5f,0x6c,0x92,0x5f,0x6c,0x92,0x5e,0x6b,0x91, 0x5e,0x6a,0x90,0x5c,0x69,0x8f,0x58,0x64,0x8c,0x39,0x42,0x61,0x34,0x3d,0x59,0x35, 0x3d,0x5c,0x3e,0x49,0x6d,0x1a,0x1f,0x28,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,0x02,0x02,0x02,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, 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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0x7c,0x7c, 0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x4a,0x4a,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, 0xf5,0xf5,0xf5,0x14,0x14,0x14,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,0x0f,0x0d,0x11,0x4a, 0x3c,0x54,0x65,0x51,0x65,0x51,0x40,0x4f,0x4b,0x3a,0x47,0x37,0x29,0x32,0x2e,0x21, 0x28,0x2d,0x20,0x27,0x27,0x1c,0x21,0x1a,0x12,0x15,0x19,0x11,0x13,0x1c,0x13,0x16, 0x1d,0x14,0x18,0x5e,0x68,0x89,0x64,0x53,0x76,0x5e,0x53,0x79,0x56,0x41,0x57,0x47, 0x37,0x44,0x4b,0x3a,0x47,0x4b,0x3a,0x47,0x43,0x34,0x41,0x2a,0x21,0x28,0x9f,0x9d, 0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7d,0x7f,0x66,0x68,0x71, 0x7c,0x85,0xa0,0xa2,0xaa,0xc1,0xc2,0xc8,0xd7,0xb8,0xbf,0xd0,0x49,0x4c,0x62,0x2d, 0x21,0x33,0x2c,0x1f,0x30,0x4c,0x38,0x50,0x64,0x4f,0x6d,0x64,0x53,0x74,0x62,0x4a, 0x65,0x5e,0x46,0x62,0x64,0x53,0x76,0x42,0x3c,0x5b,0x0b,0x0a,0x10,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,0x09,0x07,0x08,0x36,0x28,0x30,0x38,0x2c, 0x35,0xab,0xb0,0xc0,0xce,0xd1,0xde,0x55,0x62,0x8a,0x51,0x5c,0x85,0x62,0x4f,0x62, 0x67,0x53,0x67,0x64,0x50,0x63,0x3d,0x2e,0x39,0x3f,0x30,0x3b,0xb6,0xba,0xc9,0xce, 0xd2,0xde,0xb1,0xb8,0xcb,0x82,0x8c,0xab,0x96,0xa0,0xb9,0x49,0x4f,0x64,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,0x82,0x7e,0x91,0x4e,0x58,0x79,0x52,0x5c, 0x81,0x5f,0x6c,0x93,0x60,0x6c,0x93,0x63,0x6f,0x95,0x63,0x6f,0x95,0x65,0x72,0x98, 0x66,0x73,0x98,0x6a,0x75,0x9a,0x6b,0x76,0x9b,0x73,0x7e,0xa1,0x7a,0x84,0xa5,0x82, 0x8d,0xab,0x8a,0x93,0xb1,0x95,0x9f,0xb9,0x98,0xa1,0xba,0x8b,0x94,0xac,0x92,0x99, 0xab,0xae,0xb2,0xb9,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x10,0x13,0x3c, 0x2d,0x37,0x3c,0x2e,0x38,0x3c,0x2e,0x38,0x87,0x86,0x94,0x5a,0x65,0x85,0x59,0x63, 0x85,0x64,0x6f,0x94,0x66,0x72,0x97,0x64,0x6f,0x94,0x66,0x72,0x97,0x66,0x73,0x97, 0x67,0x73,0x97,0x66,0x73,0x97,0x67,0x73,0x98,0x65,0x71,0x95,0x66,0x73,0x97,0x64, 0x6f,0x94,0x64,0x6f,0x94,0x66,0x73,0x97,0x63,0x6f,0x94,0x62,0x6d,0x93,0x5f,0x6c, 0x92,0x5f,0x6b,0x91,0x5e,0x6a,0x91,0x5d,0x69,0x90,0x54,0x5e,0x82,0x38,0x41,0x60, 0x36,0x3e,0x5d,0x36,0x3e,0x5b,0x45,0x50,0x78,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,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,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,0x44,0x44,0x44, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff, 0xff,0xff,0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x9f,0xfd,0xfd, 0xfd,0xfd,0xfd,0xfd,0xb2,0xb2,0xb2,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, 0x0b,0x0a,0x0b,0x3e,0x2e,0x39,0x4a,0x39,0x47,0x4b,0x3a,0x47,0x47,0x37,0x43,0x2e, 0x21,0x28,0x2c,0x1f,0x26,0x2a,0x1e,0x25,0x2a,0x1e,0x24,0x27,0x1c,0x21,0x1d,0x14, 0x17,0x1b,0x12,0x15,0x1d,0x13,0x17,0x64,0x6f,0x94,0x64,0x4c,0x69,0x58,0x50,0x79, 0x40,0x31,0x3c,0x46,0x36,0x42,0x49,0x38,0x45,0x4b,0x3a,0x47,0x41,0x32,0x3e,0x23, 0x1b,0x21,0x9c,0x9b,0x9c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x82,0x82, 0x83,0x4b,0x50,0x5e,0x7c,0x84,0x9e,0xbb,0xc2,0xd2,0xb7,0xbc,0xcf,0x74,0x79,0x92, 0x2e,0x24,0x38,0x2c,0x1f,0x31,0x38,0x29,0x3c,0x64,0x4e,0x6d,0x60,0x53,0x77,0x5a, 0x52,0x79,0x5a,0x52,0x79,0x64,0x4f,0x6e,0x5c,0x45,0x5f,0x62,0x4a,0x65,0x5a,0x4f, 0x73,0x22,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x26,0x2f,0x38, 0x2b,0x36,0x8b,0x93,0xaa,0xbe,0xc3,0xd3,0xca,0xce,0xd8,0x52,0x5d,0x87,0x52,0x5d, 0x88,0x51,0x57,0x7d,0x67,0x53,0x67,0x5d,0x4a,0x5c,0x39,0x2b,0x34,0x63,0x5f,0x71, 0xc5,0xca,0xd8,0xda,0xde,0xe7,0xd0,0xd5,0xe0,0xa7,0xad,0xc4,0x94,0x9b,0xb1,0x15, 0x15,0x1c,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,0x2b,0x23,0x2a,0x87, 0x87,0x9b,0x4e,0x57,0x77,0x5a,0x65,0x88,0x64,0x6f,0x95,0x67,0x73,0x98,0x66,0x72, 0x98,0x69,0x74,0x9a,0x6a,0x75,0x9a,0x6f,0x7b,0x9f,0x71,0x7c,0xa0,0x79,0x84,0xa5, 0x83,0x8e,0xac,0x8e,0x98,0xb4,0x94,0x9d,0xb8,0x9d,0xa5,0xbf,0x9f,0xa8,0xc0,0x9c, 0xa5,0xbe,0x94,0x9c,0xb2,0xa4,0xa9,0xba,0x6a,0x6a,0x6e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x03, 0x35,0x27,0x30,0x3b,0x2c,0x36,0x3c,0x2d,0x37,0x40,0x31,0x3b,0x7a,0x84,0xa2,0x58, 0x63,0x83,0x62,0x6f,0x93,0x66,0x72,0x97,0x66,0x73,0x97,0x66,0x73,0x97,0x67,0x74, 0x98,0x67,0x73,0x98,0x67,0x73,0x98,0x69,0x75,0x99,0x67,0x73,0x98,0x69,0x74,0x98, 0x67,0x73,0x97,0x65,0x72,0x97,0x67,0x73,0x98,0x64,0x6f,0x94,0x64,0x6f,0x94,0x62, 0x6e,0x93,0x60,0x6d,0x92,0x60,0x6c,0x92,0x5e,0x6b,0x91,0x5c,0x69,0x8f,0x4b,0x56, 0x77,0x38,0x40,0x5f,0x38,0x3e,0x5d,0x38,0x40,0x60,0x4a,0x55,0x7f,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77, 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,0x60,0x60,0x60,0xfd,0xfd,0xfd, 0xff,0xff,0xff,0xc5,0xc5,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5, 0xd5,0xd5,0xfd,0xfd,0xfd,0xf4,0xf4,0xf4,0x1a,0x1a,0x1a,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,0x14,0x11,0x15,0x40,0x31,0x3d,0x31,0x24,0x2b,0x43,0x33,0x3e, 0x38,0x29,0x32,0x2e,0x21,0x28,0x2a,0x1f,0x25,0x2a,0x1e,0x25,0x28,0x1c,0x22,0x27, 0x1b,0x21,0x25,0x1a,0x1f,0x1f,0x15,0x19,0x20,0x18,0x1d,0x63,0x6e,0x94,0x62,0x4a, 0x66,0x54,0x50,0x78,0x3f,0x2f,0x3a,0x46,0x36,0x42,0x48,0x37,0x44,0x49,0x38,0x46, 0x40,0x31,0x3c,0x23,0x1b,0x21,0x9c,0x9b,0x9c,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x82,0x82,0x84,0x3f,0x44,0x55,0x9b,0xa1,0xb2,0xa9,0xb1,0xc6,0x8a,0x92, 0xac,0x2a,0x24,0x3b,0x2c,0x1f,0x30,0x2c,0x1f,0x31,0x63,0x4b,0x67,0x64,0x53,0x76, 0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x57,0x50,0x79,0x5a,0x52,0x79,0x63, 0x4b,0x67,0x5c,0x44,0x5e,0x64,0x52,0x71,0x3c,0x39,0x57,0x09,0x08,0x0d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x05, 0x49,0x44,0x5b,0x6a,0x72,0x92,0x95,0x9f,0xb9,0x9e,0xa2,0xb0,0x1d,0x1d,0x1f,0x39, 0x40,0x5d,0x52,0x5d,0x88,0x53,0x5e,0x88,0x5e,0x58,0x77,0x56,0x44,0x54,0x39,0x2a, 0x34,0x99,0xa0,0xb9,0xbf,0xc4,0xd5,0xcf,0xd3,0xdf,0xc8,0xcc,0xda,0xbe,0xc3,0xd3, 0x62,0x62,0x6d,0x03,0x02,0x03,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,0x4a,0x3e,0x49,0x7d,0x80,0x97,0x4d,0x56,0x75,0x60,0x6d,0x90,0x69, 0x75,0x9a,0x6b,0x76,0x9b,0x6c,0x77,0x9c,0x71,0x7c,0xa0,0x75,0x81,0xa2,0x7b,0x85, 0xa7,0x82,0x8c,0xab,0x91,0x9a,0xb5,0x9a,0xa3,0xbb,0xa3,0xab,0xc2,0xaa,0xb1,0xc7, 0xa7,0xaf,0xc4,0xa8,0xb0,0xc6,0xa4,0xac,0xc1,0x96,0x9d,0xb2,0x98,0x9b,0xaa,0x15, 0x16,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1f,0x17,0x1d,0x3b,0x2c,0x36,0x3b,0x2c,0x36,0x3b,0x2c,0x36,0x82,0x82,0x92, 0x5d,0x67,0x87,0x5d,0x67,0x8a,0x65,0x71,0x96,0x67,0x73,0x98,0x67,0x73,0x98,0x66, 0x73,0x97,0x6a,0x75,0x99,0x67,0x74,0x98,0x69,0x74,0x98,0x6a,0x76,0x99,0x69,0x74, 0x98,0x69,0x74,0x98,0x67,0x73,0x98,0x6a,0x75,0x99,0x65,0x72,0x97,0x65,0x72,0x97, 0x64,0x6f,0x94,0x62,0x6e,0x93,0x62,0x6d,0x93,0x60,0x6d,0x92,0x5e,0x6a,0x91,0x5e, 0x6a,0x91,0x44,0x4d,0x6d,0x36,0x41,0x5d,0x37,0x3f,0x5e,0x3d,0x45,0x66,0x3f,0x49, 0x6c,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,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,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,0x44,0x44,0x44, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xbf,0xbf, 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0x41,0x41,0x41,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0xf0,0xf0,0xfc,0xfc,0xfc,0xc1,0xc1,0xc1,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,0x4c,0x3c,0x49,0x33,0x26, 0x2e,0x30,0x23,0x2a,0x28,0x1c,0x22,0x2a,0x1e,0x25,0x28,0x1d,0x22,0x27,0x1c,0x22, 0x26,0x1b,0x20,0x25,0x1a,0x1f,0x23,0x19,0x1e,0x24,0x19,0x1e,0x36,0x33,0x42,0x5d, 0x69,0x91,0x62,0x4a,0x66,0x52,0x4f,0x7b,0x3f,0x2f,0x3a,0x45,0x35,0x41,0x46,0x36, 0x42,0x48,0x37,0x44,0x40,0x31,0x3d,0x23,0x1c,0x22,0x9c,0x9b,0x9c,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x80,0x82,0x53,0x57,0x63,0x9a,0xa0,0xb2,0x99, 0xa2,0xba,0x26,0x22,0x3b,0x2c,0x1f,0x30,0x2c,0x1f,0x31,0x62,0x4a,0x66,0x64,0x53, 0x74,0x5d,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x58,0x50,0x79,0x57,0x50,0x79, 0x57,0x50,0x79,0x55,0x50,0x79,0x60,0x53,0x77,0x5e,0x46,0x62,0x5f,0x47,0x64,0x59, 0x4e,0x70,0x1e,0x1d,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1d,0x1f,0x2e,0x54,0x5f,0x86,0x5e,0x67,0x85,0x55,0x5b,0x6a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x51,0x76,0x53,0x5e,0x88,0x53,0x5e,0x87,0x50, 0x49,0x61,0x7b,0x7d,0x91,0xab,0xb2,0xc7,0xb8,0xbf,0xd0,0xcb,0xd0,0xdd,0xc3,0xc9, 0xd8,0xab,0xb1,0xc1,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,0x67,0x58,0x65,0x6f,0x76,0x8e, 0x52,0x5c,0x7a,0x65,0x6f,0x93,0x6c,0x77,0x9b,0x6f,0x7c,0x9f,0x73,0x7e,0xa1,0x7b, 0x85,0xa7,0x83,0x8d,0xac,0x90,0x99,0xb4,0x9a,0xa3,0xbc,0xa3,0xab,0xc2,0xad,0xb4, 0xc9,0xaf,0xb7,0xca,0xb2,0xb9,0xcb,0xad,0xb4,0xc9,0xad,0xb5,0xc9,0xa3,0xaa,0xbe, 0x86,0x8e,0xa4,0x5f,0x65,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x08,0x06,0x08,0x3a,0x2b,0x35,0x3a,0x2c,0x36,0x3b,0x2c,0x36,0x44,0x36, 0x3f,0x77,0x80,0x9d,0x58,0x62,0x82,0x63,0x70,0x96,0x66,0x73,0x98,0x69,0x75,0x9a, 0x69,0x74,0x99,0x69,0x74,0x99,0x6a,0x75,0x99,0x6b,0x76,0x9a,0x6b,0x77,0x9a,0x6a, 0x76,0x99,0x6a,0x76,0x99,0x6b,0x76,0x9a,0x69,0x74,0x99,0x67,0x73,0x98,0x65,0x72, 0x95,0x67,0x73,0x97,0x64,0x6f,0x94,0x63,0x6f,0x94,0x62,0x6e,0x93,0x60,0x6c,0x92, 0x5f,0x6b,0x91,0x5d,0x69,0x8d,0x3d,0x45,0x64,0x38,0x40,0x5e,0x37,0x3f,0x5d,0x44, 0x50,0x74,0x20,0x24,0x36,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0x08,0x08,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x43,0x43,0x43,0xf4,0xf4,0xf4,0xf2,0xf2,0xf2,0x45,0x45,0x45, 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,0x5b, 0x48,0x59,0x35,0x27,0x2f,0x2b,0x1f,0x25,0x1b,0x13,0x16,0x25,0x1a,0x1f,0x28,0x1c, 0x22,0x26,0x1b,0x20,0x24,0x19,0x1e,0x24,0x19,0x1e,0x23,0x19,0x1e,0x23,0x18,0x1d, 0x48,0x4a,0x62,0x56,0x63,0x8b,0x62,0x4a,0x66,0x52,0x4f,0x7a,0x3f,0x30,0x3b,0x44, 0x34,0x40,0x46,0x36,0x42,0x49,0x38,0x45,0x40,0x31,0x3d,0x23,0x1b,0x22,0x9c,0x9b, 0x9c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x81,0x82,0x84,0x55,0x59,0x65, 0x99,0x9f,0xb1,0x33,0x36,0x54,0x29,0x1c,0x2c,0x2c,0x1f,0x30,0x4e,0x3a,0x52,0x64, 0x50,0x71,0x62,0x53,0x77,0x5a,0x52,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x57,0x50, 0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x56,0x50,0x79, 0x64,0x53,0x73,0x60,0x48,0x64,0x64,0x53,0x75,0x3c,0x3a,0x59,0x0c,0x0b,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x22,0x23,0x34,0x1a,0x1e,0x2a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x5c,0x86, 0x53,0x5e,0x89,0x5b,0x67,0x8c,0xd5,0xd8,0xe1,0xc3,0xc9,0xd8,0xbc,0xc2,0xd2,0xc1, 0xc6,0xd6,0xc0,0xc6,0xd5,0x1e,0x1f,0x23,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,0x05,0x04, 0x05,0x74,0x66,0x73,0x75,0x7e,0x97,0x5a,0x64,0x82,0x6f,0x7b,0x9d,0x75,0x81,0xa2, 0x7b,0x86,0xa7,0x83,0x8d,0xac,0x92,0x9c,0xb7,0x9c,0xa5,0xbe,0xad,0xb4,0xc9,0xb0, 0xb7,0xca,0xb4,0xbb,0xce,0xb8,0xbe,0xd0,0xb5,0xbc,0xcf,0xb4,0xbb,0xce,0xb2,0xb9, 0xcb,0xa5,0xac,0xc2,0x8d,0x96,0xad,0x82,0x8b,0xa3,0x23,0x26,0x2c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x21,0x29,0x3c,0x2d,0x37,0x3b,0x2d,0x36,0x3b, 0x2d,0x36,0x76,0x72,0x81,0x60,0x6b,0x8a,0x5c,0x68,0x8c,0x66,0x73,0x98,0x69,0x75, 0x9a,0x69,0x75,0x9a,0x6a,0x75,0x9a,0x6b,0x76,0x9b,0x6d,0x79,0x9c,0x6b,0x77,0x9b, 0x6c,0x79,0x9b,0x6b,0x76,0x9a,0x6d,0x79,0x9b,0x6a,0x76,0x99,0x6a,0x76,0x99,0x6b, 0x76,0x9a,0x67,0x74,0x98,0x67,0x73,0x98,0x65,0x72,0x95,0x64,0x71,0x95,0x63,0x6f, 0x94,0x63,0x6e,0x94,0x5f,0x6b,0x91,0x52,0x5d,0x80,0x3b,0x44,0x62,0x37,0x41,0x5d, 0x36,0x41,0x5e,0x4f,0x5e,0x86,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0x17, 0x17,0x17,0x4f,0x4f,0x4f,0x75,0x75,0x75,0x81,0x81,0x81,0x89,0x89,0x89,0x75,0x75, 0x75,0x44,0x44,0x44,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x53,0x53,0x53,0xfc,0xfc,0xfc,0xff,0xff,0xff,0x97,0x97,0x97,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0xf9,0xf9,0xf9,0xd1,0xd1, 0xd1,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,0x61,0x4e,0x60,0x37,0x29,0x32,0x27,0x1c,0x21,0x1b,0x12,0x15,0x19, 0x11,0x13,0x21,0x17,0x1b,0x24,0x19,0x1e,0x23,0x19,0x1e,0x22,0x18,0x1c,0x23,0x18, 0x1d,0x21,0x17,0x1b,0x54,0x5b,0x7a,0x53,0x5f,0x89,0x64,0x4c,0x69,0x52,0x4f,0x7a, 0x3f,0x30,0x3a,0x43,0x33,0x3e,0x45,0x35,0x41,0x49,0x38,0x46,0x41,0x32,0x3e,0x23, 0x1b,0x21,0x9c,0x9b,0x9c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x82,0x83, 0x84,0x5c,0x5f,0x69,0x4e,0x57,0x76,0x29,0x1c,0x2c,0x2c,0x1e,0x30,0x3c,0x2c,0x40, 0x64,0x4e,0x6c,0x64,0x53,0x76,0x5e,0x53,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79,0x58, 0x50,0x79,0x57,0x50,0x79,0x57,0x50,0x79,0x56,0x50,0x79,0x55,0x50,0x79,0x54,0x50, 0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x5a,0x52,0x79,0x64,0x4e,0x6d,0x64,0x4d,0x6a, 0x5b,0x50,0x75,0x27,0x25,0x39,0x02,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x27,0x2c,0x40,0x53,0x5e,0x88,0x63,0x6e,0x95,0xe2,0xe5,0xec,0xc3,0xc9,0xd8, 0xbc,0xc3,0xd3,0xc1,0xc7,0xd6,0x67,0x6a,0x72,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,0x0c,0x09,0x0c,0x86,0x79,0x86,0x77,0x80,0x98,0x62,0x69, 0x85,0x77,0x83,0xa2,0x84,0x8e,0xac,0x8b,0x95,0xb2,0x9a,0xa3,0xbb,0xab,0xb2,0xc7, 0xb1,0xb8,0xcb,0xbb,0xc1,0xd2,0xbf,0xc4,0xd5,0xc1,0xc7,0xd6,0xbe,0xc3,0xd3,0xba, 0xc0,0xd1,0xb7,0xbc,0xcf,0xa5,0xad,0xc3,0x90,0x98,0xb2,0x79,0x83,0x9d,0x6a,0x71, 0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x13,0x17,0x3c,0x2d,0x37,0x3c,0x2d,0x37, 0x3b,0x2d,0x36,0x4c,0x3f,0x49,0x77,0x7f,0x9c,0x5b,0x64,0x84,0x65,0x71,0x97,0x69, 0x75,0x9a,0x6a,0x75,0x9a,0x6b,0x76,0x9b,0x6c,0x77,0x9c,0x6d,0x79,0x9c,0x6b,0x76, 0x9b,0x6e,0x7a,0x9d,0x6b,0x77,0x9b,0x6c,0x77,0x9b,0x6d,0x79,0x9b,0x6c,0x79,0x9b, 0x6b,0x76,0x9a,0x6c,0x77,0x9b,0x6a,0x75,0x99,0x69,0x74,0x98,0x67,0x74,0x98,0x64, 0x71,0x95,0x64,0x6f,0x94,0x63,0x6f,0x94,0x62,0x6d,0x93,0x4a,0x54,0x74,0x3b,0x44, 0x62,0x37,0x40,0x5f,0x3a,0x45,0x63,0x49,0x53,0x7b,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0x4c,0x4c,0x4c,0x5d,0x5d,0x5d, 0x2b,0x2b,0x2b,0x0c,0x0c,0x0c,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x02,0x02,0x0c, 0x0c,0x0c,0x2c,0x2c,0x2c,0x80,0x80,0x80,0xce,0xce,0xce,0xab,0xab,0xab,0x53,0x53, 0x53,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0xb6,0xff,0xff,0xff,0xff,0xff,0xff, 0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0xb5,0xb5,0xf4, 0xf4,0xf4,0x72,0x72,0x72,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,0x5a,0x48,0x5a,0x37,0x29,0x32,0x26,0x1c,0x22, 0x1a,0x12,0x15,0x19,0x11,0x13,0x18,0x10,0x12,0x1f,0x15,0x19,0x22,0x18,0x1c,0x21, 0x17,0x1b,0x22,0x18,0x1c,0x20,0x17,0x1b,0x5e,0x67,0x8b,0x52,0x5d,0x88,0x64,0x53, 0x76,0x52,0x50,0x7b,0x3f,0x30,0x3a,0x44,0x34,0x3f,0x48,0x37,0x44,0x49,0x38,0x46, 0x42,0x33,0x3f,0x21,0x1a,0x20,0x9d,0x9d,0x9e,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x83,0x83,0x85,0x47,0x4c,0x5b,0x25,0x1a,0x28,0x2a,0x1e,0x2e,0x2d,0x21, 0x31,0x62,0x4b,0x68,0x64,0x53,0x75,0x5e,0x53,0x79,0x5a,0x52,0x79,0x5a,0x52,0x79, 0x57,0x4f,0x75,0x4d,0x46,0x6a,0x45,0x3f,0x5f,0x42,0x3c,0x5b,0x40,0x3c,0x5b,0x41, 0x3e,0x5d,0x47,0x43,0x66,0x51,0x4a,0x70,0x56,0x4f,0x77,0x5a,0x52,0x79,0x5a,0x52, 0x79,0x64,0x53,0x75,0x62,0x4a,0x66,0x64,0x52,0x72,0x44,0x41,0x64,0x11,0x11,0x1a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x4a,0x6f,0x5b,0x66,0x8e,0xca,0xcd, 0xd7,0x9e,0xa5,0xb6,0x9a,0xa0,0xae,0x46,0x4a,0x52,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,0x18,0x13,0x17,0x93, 0x88,0x93,0x7b,0x83,0x9b,0x6a,0x74,0x8e,0x8b,0x95,0xb2,0x99,0xa1,0xbb,0xa9,0xb1, 0xc6,0xb2,0xb9,0xcb,0xb9,0xc0,0xd1,0xc7,0xcb,0xda,0xc4,0xca,0xd8,0xc2,0xc8,0xd7, 0xbe,0xc3,0xd3,0xb5,0xbc,0xcf,0xad,0xb5,0xc9,0xa1,0xa9,0xc0,0x90,0x99,0xb4,0x80, 0x8a,0xa8,0x7d,0x86,0xa0,0x33,0x36,0x3f,0x07,0x05,0x06,0x3a,0x2c,0x36,0x3d,0x2e, 0x39,0x3c,0x2d,0x37,0x3c,0x2d,0x37,0x71,0x73,0x8a,0x5e,0x68,0x87,0x5f,0x6b,0x8d, 0x67,0x74,0x99,0x6b,0x76,0x9b,0x6a,0x75,0x9a,0x6c,0x77,0x9c,0x6b,0x76,0x9b,0x6c, 0x77,0x9b,0x6e,0x7a,0x9d,0x6d,0x7a,0x9d,0x6d,0x79,0x9c,0x6e,0x7a,0x9d,0x6c,0x79, 0x9b,0x6c,0x77,0x9a,0x6c,0x79,0x9b,0x6b,0x76,0x9a,0x6b,0x77,0x9a,0x66,0x73,0x97, 0x6a,0x75,0x99,0x65,0x71,0x95,0x64,0x6f,0x94,0x62,0x6d,0x93,0x62,0x6d,0x93,0x40, 0x4a,0x69,0x3b,0x43,0x5f,0x37,0x40,0x5d,0x3d,0x48,0x69,0x31,0x39,0x54,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,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,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,0x44,0x44,0x44, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0x2c,0x2c,0x2c,0x9e,0x9e,0x9e,0x50,0x50,0x50,0x07,0x07, 0x07,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,0x34, 0x34,0x34,0x5b,0x5b,0x5b,0x3b,0x3b,0x3b,0x00,0x00,0x00,0xeb,0xeb,0xeb,0xff,0xff, 0xff,0xff,0xff,0xff,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xcd,0xcd,0xcd,0xe0,0xe0,0xe0,0x07,0x07,0x07,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,0x15,0x11,0x15,0x2a,0x21, 0x28,0x25,0x1b,0x21,0x18,0x11,0x14,0x16,0x0e,0x10,0x17,0x10,0x12,0x18,0x10,0x12, 0x1c,0x13,0x16,0x20,0x16,0x1a,0x20,0x17,0x1b,0x1f,0x16,0x1a,0x62,0x6d,0x94,0x52, 0x5b,0x85,0x53,0x4f,0x7a,0x52,0x57,0x83,0x41,0x31,0x3d,0x44,0x34,0x40,0x48,0x37, 0x44,0x4b,0x3a,0x47,0x41,0x32,0x3e,0x29,0x28,0x31,0x9e,0x9f,0xa0,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x83,0x84,0x85,0x24,0x1c,0x29,0x25,0x1a,0x28,0x2d, 0x20,0x31,0x5b,0x45,0x61,0x64,0x50,0x71,0x62,0x53,0x77,0x5c,0x52,0x79,0x59,0x51, 0x78,0x54,0x4d,0x71,0x45,0x3f,0x5f,0x2e,0x2a,0x40,0x1c,0x1a,0x27,0x17,0x15,0x1f, 0x15,0x14,0x1e,0x18,0x17,0x23,0x24,0x22,0x34,0x39,0x34,0x4f,0x4f,0x48,0x6b,0x5b, 0x51,0x78,0x5d,0x52,0x79,0x5c,0x52,0x79,0x62,0x53,0x77,0x64,0x4d,0x6b,0x63,0x4b, 0x67,0x5c,0x52,0x79,0x2f,0x2e,0x46,0x04,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32, 0x39,0x52,0x71,0x75,0x80,0x4d,0x52,0x60,0x1e,0x20,0x26,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,0x20,0x19,0x1f,0xa1,0x98,0xa1,0x85,0x8b,0xa0,0x89,0x91,0xaa,0xa5, 0xad,0xc3,0xaf,0xb5,0xca,0xbf,0xc4,0xd5,0xc4,0xc9,0xd8,0xc6,0xca,0xd9,0xc3,0xc9, 0xd8,0xc6,0xcb,0xd9,0xbc,0xc3,0xd3,0xb7,0xbe,0xcf,0xaa,0xb2,0xc7,0x9c,0xa5,0xbe, 0x8e,0x99,0xb4,0x86,0x91,0xaf,0x74,0x7d,0x9a,0x7a,0x81,0x96,0x31,0x26,0x2e,0x3f, 0x30,0x3a,0x3e,0x2f,0x39,0x3e,0x2f,0x39,0x4f,0x48,0x59,0x67,0x72,0x96,0x5d,0x67, 0x88,0x65,0x72,0x97,0x6a,0x75,0x9a,0x6c,0x77,0x9c,0x6c,0x77,0x9b,0x6b,0x77,0x9b, 0x6e,0x7a,0x9d,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x6e,0x7a,0x9d,0x6e,0x7a,0x9d,0x6e, 0x7a,0x9d,0x6f,0x7b,0x9f,0x6e,0x7a,0x9c,0x6d,0x79,0x9b,0x6c,0x77,0x9a,0x6b,0x76, 0x9a,0x6b,0x76,0x9a,0x66,0x73,0x97,0x65,0x72,0x97,0x64,0x6f,0x94,0x64,0x6f,0x94, 0x5b,0x65,0x89,0x3d,0x45,0x63,0x38,0x40,0x5c,0x37,0x3f,0x5e,0x4b,0x55,0x79,0x17, 0x1a,0x26,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44, 0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x77,0x77,0x77,0xee,0xee, 0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0x21,0x21,0x21,0xab,0xab,0xab,0x52,0x52,0x52,0x05,0x05,0x05,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,0x31,0x31,0x31,0xfc, 0xfc,0xfc,0xff,0xff,0xff,0xa7,0xa7,0xa7,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xdc,0xdc,0xdc,0xaf,0xaf,0xaf,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,0x44,0x44,0x44,0x77,0x77,0x77,0x88,0x88,0x88,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0x77, 0x77,0x77,0x7e,0x7c,0x7e,0x20,0x1c,0x1f,0x11,0x0c,0x0f,0x0d,0x09,0x0a,0x12,0x0c, 0x0d,0x14,0x0d,0x10,0x15,0x0e,0x10,0x1c,0x13,0x16,0x1f,0x15,0x19,0x28,0x21,0x2a, 0x65,0x72,0x96,0x52,0x56,0x81,0x52,0x53,0x7e,0x54,0x5f,0x89,0x41,0x31,0x3c,0x44, 0x34,0x40,0x48,0x37,0x44,0x4b,0x3b,0x49,0x48,0x46,0x5a,0x3b,0x3f,0x4d,0x9d,0x9e, 0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7c,0x7d,0x80,0x15,0x0e,0x17, 0x28,0x1c,0x2b,0x3f,0x30,0x46,0x64,0x4f,0x6d,0x64,0x53,0x75,0x5e,0x53,0x79,0x59, 0x50,0x76,0x4e,0x47,0x69,0x3d,0x38,0x52,0x26,0x22,0x34,0x4f,0x4e,0x53,0xee,0xee, 0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xaf,0xb1,0x52,0x50,0x5f, 0x46,0x3f,0x60,0x5b,0x50,0x76,0x5e,0x53,0x79,0x5f,0x53,0x76,0x49,0x40,0x5f,0x41, 0x38,0x56,0x64,0x53,0x76,0x63,0x4c,0x69,0x64,0x50,0x71,0x51,0x49,0x6c,0x19,0x18, 0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x77,0x77,0x77,0x99,0x99,0x99,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,0x77,0x77,0x77,0x44,0x44,0x44,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x44,0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0x77,0x77, 0x77,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0x29,0x20,0x28,0xb1,0xaa,0xb1, 0x9a,0xa0,0xb3,0xa2,0xa9,0xbe,0xc1,0xc7,0xd6,0xda,0xde,0xe7,0xe0,0xe3,0xea,0xd6, 0xd9,0xe3,0xcb,0xd0,0xdd,0xc3,0xc9,0xd8,0xbe,0xc3,0xd3,0xb2,0xb9,0xcb,0xa2,0xaa, 0xc1,0x9b,0xa3,0xbc,0x8b,0x95,0xb2,0x86,0x91,0xaf,0x80,0x8a,0xa8,0x7a,0x83,0x9b, 0x60,0x5c,0x70,0x40,0x31,0x3c,0x3f,0x30,0x3b,0x40,0x32,0x3e,0x63,0x6a,0x8c,0x5c, 0x68,0x89,0x62,0x6c,0x8f,0x6a,0x75,0x9a,0x6b,0x76,0x9b,0x6d,0x79,0x9d,0x6d,0x7a, 0x9d,0x6d,0x7a,0x9d,0x6e,0x7a,0x9d,0x6d,0x79,0x9c,0x6f,0x7b,0x9f,0x6e,0x7a,0x9d, 0x6e,0x7a,0x9d,0x6e,0x7a,0x9d,0x6d,0x79,0x9c,0x6e,0x7b,0x9d,0x6c,0x77,0x9c,0x6c, 0x79,0x9b,0x6c,0x77,0x9a,0x69,0x75,0x99,0x69,0x74,0x98,0x66,0x72,0x97,0x63,0x6f, 0x94,0x63,0x6e,0x94,0x4f,0x5a,0x7b,0x3c,0x45,0x62,0x36,0x3f,0x5a,0x37,0x41,0x5e, 0x4c,0x5a,0x7f,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x44,0x44,0x44,0x00,0x00,0x00,0x66,0x66,0x66,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0x11,0x11, 0x11,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,0x9e,0x9e,0x9e,0x82,0x82,0x82,0x05,0x05,0x05,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, 0x93,0x93,0x93,0xff,0xff,0xff,0xff,0xff,0xff,0x36,0x36,0x36,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x33,0xe4,0xe4,0xe4,0x5b,0x5b,0x5b,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,0x11,0x11,0x11,0x77, 0x77,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcd,0xcd,0xcd,0x6a, 0x68,0x69,0x08,0x05,0x06,0x0d,0x08,0x09,0x13,0x0d,0x0f,0x18,0x0f,0x12,0x1b,0x12, 0x15,0x3d,0x3c,0x4f,0x66,0x73,0x98,0x52,0x50,0x7b,0x53,0x5e,0x88,0x57,0x64,0x8c, 0x42,0x32,0x3e,0x46,0x36,0x42,0x49,0x38,0x47,0x57,0x5d,0x7f,0x6a,0x75,0x90,0x30, 0x35,0x45,0x9f,0x9f,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7a,0x79, 0x7a,0x17,0x10,0x18,0x29,0x1f,0x2f,0x64,0x4c,0x6a,0x64,0x52,0x72,0x60,0x53,0x77, 0x58,0x4e,0x74,0x48,0x42,0x61,0x31,0x2c,0x41,0x1a,0x18,0x23,0x9d,0x9d,0x9f,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6e,0x6e,0x71,0x21,0x1f, 0x2f,0x38,0x34,0x4f,0x4e,0x47,0x6b,0x5d,0x52,0x78,0x39,0x30,0x4b,0x30,0x27,0x3e, 0x2d,0x24,0x39,0x2c,0x24,0x3a,0x3d,0x34,0x50,0x60,0x53,0x77,0x64,0x52,0x72,0x31, 0x22,0x35,0x2f,0x24,0x37,0x27,0x23,0x38,0x0d,0x0c,0x12,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x66,0x66,0x66,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee, 0xee,0x77,0x77,0x77,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,0xdd,0xdd,0xdd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,0x00,0x00,0x00,0x66,0x66,0x66,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee, 0xee,0x11,0x11,0x11,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,0x37,0x2b,0x35,0xc4,0xbf,0xc3,0xc2,0xc7,0xd2,0xcc,0xcf,0xd8,0xf0,0xf1,0xf5, 0xeb,0xee,0xf2,0xdd,0xe0,0xe8,0xc7,0xcb,0xda,0xbf,0xc4,0xd5,0xb7,0xbe,0xd0,0xac, 0xb3,0xc8,0x9f,0xa7,0xbf,0x95,0x9f,0xb9,0x8d,0x96,0xb3,0x88,0x92,0xb0,0x89,0x93, 0xb0,0x79,0x82,0x9c,0x78,0x80,0x9b,0x43,0x34,0x40,0x41,0x32,0x3d,0x54,0x53,0x6c, 0x63,0x70,0x93,0x5e,0x68,0x88,0x6a,0x75,0x99,0x6b,0x76,0x9b,0x6a,0x76,0x9a,0x6d, 0x7a,0x9d,0x6e,0x7a,0x9d,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x71,0x7c, 0xa0,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x71,0x7c,0xa0,0x6e,0x7a,0x9d, 0x6d,0x79,0x9c,0x6d,0x79,0x9c,0x6c,0x77,0x9c,0x69,0x74,0x98,0x69,0x74,0x98,0x65, 0x72,0x97,0x65,0x71,0x95,0x63,0x6f,0x94,0x44,0x4e,0x6c,0x38,0x40,0x5d,0x35,0x3f, 0x5a,0x36,0x40,0x5b,0x3d,0x48,0x6b,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,0x77,0x77,0x77,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77, 0x77,0x77,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,0x6d,0x6d,0x6d,0xdc,0xdc,0xdc,0x23,0x23,0x23,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,0xdc,0xdc,0xdc,0xff,0xff,0xff,0xff,0xff,0xff,0x08,0x08,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x5e,0x5e,0xd0,0xd0,0xd0,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,0x88,0x88,0x88, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0x47,0x46,0x46,0x0a,0x07,0x08,0x13, 0x0d,0x0e,0x18,0x10,0x13,0x4c,0x52,0x6b,0x65,0x72,0x98,0x52,0x55,0x80,0x53,0x5f, 0x89,0x57,0x64,0x8c,0x48,0x39,0x4c,0x45,0x35,0x41,0x4d,0x46,0x5b,0x82,0x8c,0xab, 0x54,0x5e,0x7f,0x38,0x3e,0x4c,0xa0,0xa0,0xa1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x7a,0x79,0x7a,0x17,0x11,0x19,0x4f,0x3f,0x58,0x64,0x4e,0x6c,0x62,0x51, 0x74,0x55,0x4b,0x6e,0x44,0x3c,0x59,0x2a,0x26,0x38,0x41,0x40,0x45,0xde,0xde,0xde, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbd,0xbd,0xbd,0x32,0x31,0x39,0x28, 0x26,0x3a,0x40,0x3d,0x5d,0x4f,0x4a,0x70,0x54,0x4f,0x76,0x37,0x31,0x4c,0x2a,0x24, 0x3b,0x30,0x29,0x42,0x59,0x4e,0x73,0x38,0x30,0x4b,0x2c,0x24,0x3c,0x43,0x3a,0x59, 0x35,0x2d,0x46,0x2d,0x24,0x39,0x2c,0x20,0x31,0x2b,0x1f,0x2f,0x25,0x1d,0x2f,0x13, 0x12,0x1c,0x34,0x34,0x34,0xcc,0xcc,0xcc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0x44,0x44,0x44,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,0xdd,0xdd, 0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,0x77,0x77,0x77, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,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,0x50,0x40,0x4e,0xd4,0xd0,0xd3,0xeb,0xeb, 0xed,0xee,0xef,0xf0,0xf1,0xf2,0xf5,0xd7,0xda,0xe5,0xc6,0xca,0xd9,0xba,0xc0,0xd1, 0xb1,0xb8,0xcb,0xa8,0xb0,0xc6,0x99,0xa2,0xbb,0x8e,0x99,0xb4,0x8a,0x94,0xb1,0x8a, 0x94,0xb1,0x89,0x93,0xb0,0x84,0x8e,0xa9,0x76,0x81,0x9a,0x5c,0x5a,0x71,0x47,0x3b, 0x4a,0x68,0x73,0x97,0x60,0x6a,0x8b,0x65,0x6f,0x92,0x6a,0x75,0x9a,0x6b,0x76,0x9b, 0x6d,0x7a,0x9d,0x6d,0x79,0x9c,0x6d,0x7a,0x9d,0x6f,0x7b,0x9f,0x71,0x7c,0x9f,0x6f, 0x7b,0x9f,0x71,0x7c,0x9f,0x6f,0x7b,0x9f,0x72,0x7d,0xa0,0x6f,0x7b,0x9f,0x6e,0x7a, 0x9d,0x6d,0x7a,0x9d,0x6d,0x79,0x9c,0x6e,0x7a,0x9d,0x6c,0x77,0x9b,0x6b,0x76,0x9b, 0x69,0x74,0x99,0x67,0x73,0x98,0x64,0x6f,0x94,0x5d,0x69,0x8b,0x3c,0x43,0x60,0x37, 0x3f,0x5a,0x37,0x3e,0x5a,0x3b,0x44,0x62,0x2e,0x34,0x4d,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,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,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,0x44,0x44,0x44, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd, 0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0xff,0xff, 0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0x44,0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x33,0x33,0x11,0x11,0x11,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,0xac,0xac,0xac,0xd9,0xd9,0xd9,0x0a,0x0a,0x0a,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,0x02,0x02,0x02,0xf8,0xf8,0xf8,0xff,0xff,0xff,0xa2,0xa2, 0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x79,0x79, 0xaf,0xaf,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0xcc,0xcc, 0xcc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xaa,0xaa,0xaa,0x77,0x77,0x77,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x77,0x77,0x77,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x68,0x67,0x68,0x0c,0x08,0x09,0x15,0x0e,0x10,0x54,0x5d,0x7a,0x64,0x6f,0x96,0x52, 0x55,0x80,0x54,0x5f,0x89,0x56,0x63,0x8b,0x52,0x4f,0x7a,0x4d,0x41,0x5a,0x76,0x82, 0xa3,0x66,0x72,0x98,0x57,0x62,0x81,0x4e,0x52,0x5b,0xa0,0xa1,0xa1,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x7a,0x79,0x7b,0x19,0x13,0x1c,0x58,0x43,0x5d,0x60, 0x4f,0x6d,0x4f,0x44,0x62,0x37,0x31,0x49,0x21,0x1d,0x2b,0x7e,0x7d,0x81,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7d,0x7d,0x81,0x1e,0x1d,0x2b, 0x32,0x30,0x49,0x44,0x41,0x64,0x4f,0x4c,0x76,0x52,0x4f,0x7a,0x54,0x50,0x79,0x4f, 0x4b,0x73,0x4d,0x46,0x6c,0x58,0x50,0x79,0x5c,0x52,0x79,0x5a,0x52,0x79,0x2f,0x29, 0x44,0x2a,0x25,0x3c,0x2a,0x24,0x3c,0x29,0x22,0x3b,0x27,0x21,0x39,0x25,0x1d,0x2d, 0x16,0x10,0x18,0x5a,0x59,0x5b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0x77,0x77,0x77,0x33,0x33,0x33,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x77,0x77, 0x77,0x77,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa, 0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0x44,0x44,0x44,0x00,0x00,0x00, 0x00,0x00,0x00,0x33,0x33,0x33,0x11,0x11,0x11,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,0x5c, 0x4a,0x5a,0xdd,0xda,0xdc,0xeb,0xeb,0xed,0xd2,0xd5,0xde,0xc8,0xcc,0xda,0xbf,0xc4, 0xd5,0xb1,0xb8,0xcb,0xaa,0xb1,0xc7,0x9d,0xa5,0xbe,0x94,0x9d,0xb8,0x90,0x9a,0xb5, 0x8d,0x98,0xb3,0x8b,0x95,0xb2,0x8d,0x96,0xb3,0x8b,0x94,0xb1,0x7b,0x85,0x9d,0x82, 0x8a,0xa6,0x64,0x6b,0x8d,0x65,0x6f,0x92,0x61,0x6b,0x8c,0x6b,0x76,0x9b,0x6c,0x79, 0x9c,0x6c,0x77,0x9b,0x6f,0x7b,0x9f,0x6e,0x7a,0x9d,0x6e,0x7a,0x9d,0x6f,0x7b,0x9f, 0x71,0x7c,0xa0,0x6f,0x7c,0x9f,0x6f,0x7b,0x9f,0x71,0x7c,0xa0,0x6f,0x7b,0x9f,0x71, 0x7c,0xa0,0x6e,0x7a,0x9d,0x6f,0x7b,0x9f,0x6e,0x7a,0x9d,0x6c,0x77,0x9c,0x69,0x75, 0x9a,0x6a,0x76,0x9a,0x6a,0x75,0x9a,0x65,0x72,0x98,0x64,0x71,0x96,0x50,0x5b,0x7b, 0x37,0x40,0x5b,0x34,0x3d,0x56,0x34,0x3c,0x56,0x3f,0x49,0x6b,0x06,0x07,0x09,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0x1d,0x1d,0x1d,0xcf,0xcf,0xcf,0xba,0xba,0xba,0x05,0x05,0x05,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,0x70,0x70,0x70,0xfd,0xfd,0xfd,0xff, 0xff,0xff,0x34,0x34,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x9d,0x9d,0x9d,0x9a,0x9a,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x22,0xee, 0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x88,0x88, 0x88,0x11,0x11,0x11,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,0x7b,0x7b,0x7b,0xee,0xee,0xee,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5a,0x58,0x59,0x12,0x0c,0x0e,0x50,0x57,0x73, 0x63,0x6e,0x94,0x52,0x53,0x7e,0x53,0x5e,0x88,0x56,0x63,0x8b,0x55,0x60,0x8a,0x56, 0x62,0x8b,0x5e,0x6b,0x92,0x5d,0x69,0x91,0x83,0x8a,0x9f,0x53,0x55,0x5d,0xa2,0xa2, 0xa2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7a,0x79,0x7b,0x32,0x26,0x34, 0x51,0x3f,0x57,0x4c,0x3f,0x5a,0x2c,0x27,0x3a,0x33,0x32,0x39,0xbd,0xbd,0xbd,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcd,0xcd,0xce,0x41,0x40,0x47,0x27,0x25, 0x38,0x3f,0x3b,0x59,0x4c,0x48,0x6e,0x50,0x4d,0x78,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x53,0x4f,0x7a,0x54,0x50,0x79,0x53, 0x4f,0x7a,0x53,0x50,0x7a,0x34,0x30,0x4e,0x27,0x23,0x3c,0x25,0x21,0x3a,0x20,0x1c, 0x31,0x13,0x11,0x1e,0x5a,0x59,0x5c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xab,0xab,0xab,0x22,0x22,0x22,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,0x66,0x66,0x66,0xee,0xee,0xee, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0x10,0x0c,0x0f,0x61,0x52,0x5e,0xea,0xe8,0xe9,0xbb,0xc0,0xce,0xb4, 0xbb,0xcb,0xb3,0xba,0xcc,0xac,0xb3,0xc8,0xa1,0xaa,0xc1,0x98,0xa1,0xba,0x90,0x99, 0xb4,0x90,0x99,0xb4,0x8b,0x95,0xb2,0x8e,0x99,0xb4,0x8e,0x99,0xb4,0x90,0x9a,0xb5, 0x89,0x93,0xad,0x7d,0x86,0xa0,0x77,0x83,0xa4,0x62,0x6d,0x90,0x69,0x74,0x98,0x6c, 0x79,0x9c,0x6d,0x79,0x9d,0x6c,0x77,0x9c,0x6e,0x7a,0x9d,0x6e,0x7a,0x9d,0x6f,0x7b, 0x9f,0x6f,0x7b,0x9f,0x72,0x7d,0xa0,0x6f,0x7c,0x9f,0x71,0x7c,0x9f,0x71,0x7c,0xa0, 0x71,0x7c,0xa0,0x71,0x7c,0xa0,0x6f,0x7b,0x9f,0x6d,0x79,0x9c,0x6e,0x7a,0x9d,0x6e, 0x7a,0x9d,0x6b,0x77,0x9b,0x69,0x74,0x99,0x65,0x72,0x98,0x65,0x72,0x98,0x64,0x6f, 0x95,0x43,0x4c,0x69,0x36,0x3d,0x58,0x33,0x3b,0x55,0x33,0x3b,0x54,0x3b,0x46,0x66, 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,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, 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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,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,0x32,0x32,0x32,0xe0,0xe0,0xe0,0xd8,0xd8,0xd8,0x07,0x07,0x07,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,0xbf,0xbf,0xbf, 0xff,0xff,0xff,0xff,0xff,0xff,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0xb1,0x7a,0x7a,0x7a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x11, 0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0xcc,0xcc,0x33, 0x33,0x33,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,0x07,0x05,0x07,0x29, 0x25,0x2a,0xad,0xac,0xad,0xac,0xab,0xac,0x48,0x47,0x47,0x0c,0x08,0x0a,0x15,0x0e, 0x10,0x4b,0x50,0x69,0x60,0x6c,0x93,0x52,0x50,0x7b,0x52,0x5d,0x88,0x56,0x63,0x8b, 0x56,0x63,0x8b,0x5a,0x65,0x8d,0x57,0x63,0x8c,0x81,0x8b,0xaa,0x92,0x98,0xaa,0x61, 0x62,0x67,0xa2,0xa2,0xa2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7b,0x7a, 0x7b,0x2a,0x20,0x2c,0x37,0x2d,0x3f,0x25,0x20,0x2e,0x6e,0x6e,0x71,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9d,0x9d,0x9f,0x1b,0x19,0x26,0x31, 0x2d,0x45,0x45,0x41,0x62,0x50,0x4d,0x74,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x41,0x3e,0x62,0x2f, 0x2b,0x46,0x20,0x1e,0x30,0x2f,0x2f,0x36,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x7e,0x7d,0x81,0x20,0x21,0x32,0x21,0x25,0x36,0x07,0x08,0x0b, 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,0x11,0x11,0x11,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x55,0x55,0x55,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,0xdd,0xdd,0xdd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,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,0x15,0x11,0x14,0x6a,0x5c,0x67, 0xd7,0xd9,0xe1,0xa2,0xa9,0xbc,0xa4,0xab,0xc0,0xa4,0xac,0xc2,0x9a,0xa3,0xbb,0x93, 0x9c,0xb8,0x90,0x99,0xb4,0x92,0x9c,0xb7,0x8e,0x99,0xb4,0x90,0x99,0xb4,0x91,0x9b, 0xb5,0x92,0x9b,0xb7,0x8d,0x98,0xb2,0x83,0x8b,0xa5,0x86,0x8e,0xaa,0x69,0x76,0x98, 0x6b,0x76,0x9b,0x6d,0x79,0x9d,0x6e,0x7b,0x9d,0x6e,0x7a,0x9d,0x6f,0x7c,0x9f,0x6f, 0x7c,0x9f,0x73,0x7e,0xa1,0x71,0x7c,0xa0,0x6f,0x7c,0x9f,0x73,0x7e,0xa1,0x72,0x7d, 0xa0,0x6f,0x7b,0x9f,0x71,0x7c,0xa0,0x71,0x7c,0x9f,0x71,0x7c,0x9f,0x6d,0x7a,0x9d, 0x6d,0x7a,0x9d,0x6c,0x77,0x9b,0x6a,0x75,0x9a,0x69,0x74,0x99,0x66,0x73,0x98,0x64, 0x71,0x96,0x5d,0x69,0x8c,0x36,0x3f,0x58,0x34,0x3b,0x54,0x2f,0x37,0x52,0x32,0x3a, 0x59,0x2f,0x36,0x51,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22,0x22,0x22,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,0x07,0x07,0x07,0xde,0xde,0xde,0xfd,0xfd,0xfd,0x16,0x16,0x16,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,0xec,0xec,0xec,0xff,0xff,0xff,0xb5,0xb5,0xb5,0x02,0x02,0x02,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0xc4,0x5e,0x5e,0x5e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0xcc,0xcc, 0x11,0x11,0x11,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,0x2f,0x27,0x31,0x2f,0x25,0x2f,0x20,0x19,0x1e,0x16,0x0f,0x12,0x16, 0x0e,0x11,0x1a,0x11,0x14,0x46,0x49,0x60,0x5e,0x6b,0x92,0x52,0x4f,0x7a,0x52,0x5d, 0x86,0x54,0x60,0x8a,0x55,0x60,0x8a,0x56,0x62,0x8b,0x64,0x71,0x96,0xa2,0xaa,0xc1, 0xa3,0xa7,0xb5,0x6d,0x6d,0x6f,0x9c,0x9c,0x9d,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x7c,0x7b,0x7c,0x17,0x12,0x19,0x25,0x21,0x28,0xad,0xac,0xad,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xde,0x50,0x4f,0x54,0x27,0x24,0x35, 0x3c,0x37,0x54,0x4c,0x46,0x6a,0x53,0x4e,0x76,0x55,0x50,0x79,0x54,0x50,0x79,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b, 0x51,0x4f,0x7b,0x42,0x40,0x63,0x20,0x20,0x30,0xbd,0xbd,0xbd,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x8a,0x8a,0x8b,0x15,0x13,0x1d,0x2d,0x29,0x3d,0x37,0x37, 0x54,0x39,0x40,0x5d,0x1f,0x24,0x34,0x03,0x03,0x04,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,0x11,0x11,0x11,0xdd,0xdd,0xdd,0xff,0xff, 0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,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,0xdd,0xdd, 0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22,0x22,0x22, 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,0x0c,0x09,0x0b,0x77,0x6b,0x74,0xcc,0xcf,0xdb,0x95,0x9b,0xb2,0x99,0xa2,0xba, 0x92,0x9b,0xb7,0x93,0x9c,0xb8,0x90,0x9a,0xb5,0x8c,0x96,0xb3,0x90,0x9a,0xb5,0x90, 0x99,0xb4,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x94,0x9d,0xb8,0x8e,0x98,0xb1,0x83,0x8c, 0xa5,0x80,0x8a,0xaa,0x6c,0x79,0x9c,0x6c,0x77,0x9c,0x6e,0x7a,0x9d,0x6e,0x7a,0x9d, 0x72,0x7d,0xa0,0x71,0x7c,0x9f,0x6f,0x7c,0x9f,0x72,0x7d,0xa0,0x72,0x7d,0xa0,0x72, 0x7d,0xa0,0x72,0x7d,0xa0,0x71,0x7c,0x9f,0x6e,0x7a,0x9d,0x71,0x7c,0x9f,0x6f,0x7b, 0x9f,0x6e,0x7a,0x9d,0x6c,0x77,0x9c,0x6b,0x76,0x9b,0x6b,0x76,0x9b,0x69,0x74,0x99, 0x69,0x74,0x99,0x65,0x72,0x98,0x4e,0x5a,0x79,0x34,0x3d,0x56,0x31,0x38,0x50,0x2f, 0x36,0x50,0x3c,0x46,0x6a,0x11,0x14,0x1e,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, 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,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,0x44,0x44,0x44, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd, 0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,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,0xd1,0xd1,0xd1,0xfc,0xfc,0xfc,0x6a,0x6a,0x6a, 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,0x3a,0x3a,0x3a,0xfc,0xfc,0xfc,0xff,0xff,0xff,0x44,0x44,0x44,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0xc9, 0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x22,0x22,0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x22,0x22,0x22,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,0x0e,0x0b,0x0e,0x62,0x50,0x64,0x4a,0x3a,0x48, 0x38,0x2b,0x34,0x1c,0x13,0x16,0x1c,0x13,0x16,0x3e,0x3d,0x4f,0x5e,0x6b,0x92,0x55, 0x50,0x79,0x52,0x50,0x7b,0x52,0x5d,0x86,0x52,0x5c,0x86,0x56,0x62,0x8b,0x8c,0x96, 0xb3,0xa7,0xaf,0xc4,0xd0,0xd1,0xd3,0x31,0x37,0x46,0x9b,0x9a,0x9b,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x79,0x78,0x79,0x48,0x48,0x49,0xee,0xee,0xee,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xad,0xac,0xad,0x26,0x24,0x2c,0x2f,0x2b, 0x3f,0x46,0x3f,0x60,0x52,0x4b,0x71,0x56,0x4f,0x78,0x55,0x50,0x79,0x55,0x50,0x79, 0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52, 0x7c,0x52,0x52,0x7d,0x4d,0x4e,0x76,0x35,0x36,0x52,0x41,0x42,0x49,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0x13,0x14,0x15,0x09,0x0a,0x0f,0x11, 0x11,0x1a,0x18,0x15,0x1d,0x15,0x14,0x1e,0x15,0x16,0x20,0x13,0x16,0x1f,0x09,0x0a, 0x0e,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,0x44, 0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x66,0x66,0x66,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb, 0xbb,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,0x1d,0x17,0x1b,0x8e,0x82,0x8c,0xb1,0xb7, 0xc7,0x8a,0x93,0xac,0x8a,0x93,0xb0,0x8c,0x96,0xb3,0x8d,0x96,0xb3,0x90,0x99,0xb4, 0x8e,0x99,0xb4,0x8e,0x99,0xb4,0x91,0x9a,0xb5,0x94,0x9d,0xb8,0x95,0x9f,0xb9,0x93, 0x9c,0xb7,0x8d,0x96,0xaf,0x8d,0x96,0xb1,0x71,0x7c,0x9f,0x6d,0x79,0x9d,0x6e,0x7a, 0x9d,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x72,0x7d,0xa0,0x73,0x7e,0xa1,0x73,0x7e,0xa1, 0x73,0x7e,0xa1,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x72,0x7d,0xa0,0x6f,0x7b,0x9f,0x6e, 0x7a,0x9d,0x71,0x7c,0x9f,0x6d,0x7a,0x9d,0x6d,0x7a,0x9d,0x6c,0x77,0x9b,0x6a,0x75, 0x9a,0x66,0x73,0x98,0x65,0x71,0x96,0x63,0x6f,0x95,0x3d,0x45,0x60,0x31,0x39,0x53, 0x2d,0x36,0x4f,0x2d,0x37,0x50,0x3f,0x48,0x6b,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77, 0x77,0x77,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,0x83,0x83,0x83,0xf9,0xf9,0xf9,0xfd,0xfd, 0xfd,0x09,0x09,0x09,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,0x97,0x97,0x97,0xff,0xff,0xff,0xff,0xff,0xff,0x0e, 0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x44,0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x77,0x77,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x99,0x99,0x99,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,0x47,0x3a, 0x49,0x6a,0x56,0x6b,0x4c,0x3b,0x49,0x2d,0x21,0x28,0x1c,0x13,0x16,0x36,0x33,0x40, 0x62,0x6d,0x94,0x63,0x53,0x77,0x56,0x50,0x79,0x52,0x50,0x7b,0x52,0x56,0x81,0x71, 0x7c,0x9f,0x99,0xa1,0xba,0xd5,0xd8,0xe2,0xac,0xaf,0xba,0x1b,0x13,0x1d,0x9b,0x9a, 0x9b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5e,0x5e,0x62,0x23,0x20,0x2f,0x39, 0x34,0x4d,0x4c,0x45,0x66,0x58,0x50,0x76,0x57,0x50,0x79,0x57,0x50,0x79,0x55,0x50, 0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52, 0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7d,0x48,0x49,0x6e,0x2a,0x2a,0x40,0x8d,0x8d, 0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa, 0xaa,0xaa,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x7b,0x7c,0x7c,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,0x44, 0x35,0x41,0xa6,0x9c,0xa6,0x92,0x9a,0xaf,0x80,0x8a,0xa5,0x85,0x90,0xad,0x8b,0x95, 0xb2,0x8e,0x99,0xb4,0x8c,0x96,0xb3,0x91,0x9a,0xb5,0x92,0x9c,0xb7,0x95,0x9f,0xb9, 0x95,0x9f,0xb9,0x94,0x9d,0xb8,0x92,0x9b,0xb5,0x8b,0x94,0xac,0x82,0x8c,0xab,0x6f, 0x7b,0x9f,0x6e,0x7a,0x9d,0x6f,0x7c,0x9f,0x71,0x7c,0xa0,0x71,0x7c,0xa0,0x72,0x7d, 0xa0,0x72,0x7d,0xa0,0x73,0x7e,0xa1,0x72,0x7d,0xa0,0x71,0x7c,0xa0,0x6f,0x7b,0x9f, 0x6f,0x7b,0x9f,0x6e,0x7b,0x9d,0x6f,0x7b,0x9f,0x6e,0x7b,0x9d,0x6c,0x79,0x9c,0x69, 0x75,0x9a,0x67,0x73,0x99,0x65,0x72,0x98,0x64,0x71,0x96,0x5b,0x65,0x88,0x35,0x3d, 0x57,0x2e,0x36,0x50,0x2d,0x33,0x4d,0x33,0x3c,0x58,0x34,0x3e,0x5c,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x66,0x66,0x66,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,0xe5,0xe5,0xe5,0xfc, 0xfc,0xfc,0xb2,0xb2,0xb2,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,0xd6,0xd6,0xd6,0xff,0xff,0xff, 0xd9,0xd9,0xd9,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x66,0x66,0x66,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,0x0b,0x09,0x0c,0x72,0x5d,0x74,0x5b,0x48,0x59,0x48,0x37,0x44,0x25,0x1a, 0x1f,0x2e,0x29,0x33,0x65,0x72,0x96,0x64,0x53,0x73,0x62,0x53,0x77,0x55,0x50,0x79, 0x56,0x62,0x8b,0x89,0x93,0xb0,0xaf,0xb5,0xca,0xeb,0xea,0xeb,0x44,0x46,0x5f,0x15, 0x10,0x1a,0x9b,0x9b,0x9b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0x29,0x28,0x2b,0x22,0x1f,0x2d, 0x43,0x3c,0x59,0x54,0x4c,0x70,0x59,0x51,0x77,0x5a,0x52,0x79,0x57,0x50,0x79,0x57, 0x50,0x79,0x55,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x53,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b, 0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x53,0x7d,0x45,0x46,0x69,0x23, 0x23,0x35,0xac,0xac,0xae,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xdd,0xdd,0xdd,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,0xdd,0xdd,0xdd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x7b,0x7c,0x7c,0x43,0x46,0x4d,0x0e,0x0f,0x11,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,0x0d,0x0a,0x0c,0x47,0x37,0x43,0xaa,0xa3,0xac,0x82,0x8b,0xa2,0x84, 0x8d,0xab,0x8a,0x94,0xb1,0x8b,0x95,0xb2,0x8e,0x98,0xb3,0x92,0x9b,0xb7,0x90,0x99, 0xb4,0x95,0x9f,0xb9,0x94,0x9d,0xb8,0x96,0xa0,0xb9,0x96,0xa0,0xb9,0x91,0x9a,0xb2, 0x94,0x9c,0xb4,0x72,0x7d,0xa0,0x6f,0x7b,0x9f,0x6e,0x7a,0x9d,0x6f,0x7c,0x9f,0x72, 0x7d,0xa0,0x71,0x7c,0x9f,0x72,0x7e,0xa1,0x72,0x7d,0xa0,0x73,0x7e,0xa1,0x74,0x80, 0xa2,0x72,0x7d,0xa1,0x6e,0x7a,0x9d,0x6f,0x7b,0x9f,0x6c,0x77,0x9c,0x6d,0x7a,0x9d, 0x6b,0x76,0x9b,0x6a,0x75,0x9a,0x69,0x74,0x9a,0x65,0x72,0x98,0x65,0x71,0x96,0x48, 0x53,0x72,0x33,0x3b,0x55,0x2f,0x35,0x4e,0x2c,0x33,0x4b,0x3f,0x4a,0x6b,0x15,0x19, 0x26,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,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,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,0x44,0x44,0x44,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,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,0x56,0x56,0x56, 0xf8,0xf8,0xf8,0xfc,0xfc,0xfc,0x58,0x58,0x58,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,0xf3,0xf3, 0xf3,0xff,0xff,0xff,0x6d,0x6d,0x6d,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,0xbb,0xbb, 0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x66,0x66,0x66,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,0x40,0x35,0x42,0x6a,0x55,0x6a,0x55, 0x42,0x52,0x3c,0x2d,0x37,0x2b,0x23,0x2b,0x6c,0x77,0x9b,0x64,0x53,0x74,0x5e,0x53, 0x79,0x52,0x4f,0x7a,0x71,0x7c,0x9f,0x8d,0x98,0xb3,0xdb,0xdf,0xe7,0x85,0x83,0x92, 0x18,0x14,0x18,0x19,0x18,0x1f,0x9b,0x9b,0x9b,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0x18,0x18, 0x1a,0x23,0x20,0x2f,0x45,0x3e,0x5b,0x56,0x4e,0x73,0x59,0x51,0x78,0x5a,0x52,0x79, 0x57,0x50,0x79,0x57,0x50,0x79,0x56,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x54, 0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c, 0x44,0x44,0x67,0x21,0x21,0x32,0xbd,0xbd,0xbe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,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,0x02,0x02,0x02,0x0f,0x11,0x18,0xdd,0xdd, 0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x64,0x64,0x64,0x74,0x77,0x80, 0xa0,0xa6,0xb5,0x40,0x42,0x49,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,0x34,0x27,0x2f,0x39,0x2c,0x34, 0x9f,0x9d,0xab,0x76,0x80,0x9a,0x83,0x8d,0xab,0x8a,0x94,0xb1,0x8c,0x96,0xb3,0x92, 0x9b,0xb5,0x92,0x9b,0xb7,0x91,0x9a,0xb5,0x95,0x9f,0xb9,0x96,0xa0,0xba,0x98,0xa1, 0xba,0x96,0xa0,0xb9,0x8b,0x93,0xab,0x85,0x90,0xad,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f, 0x72,0x7d,0xa0,0x72,0x7d,0xa0,0x71,0x7c,0x9f,0x72,0x7d,0xa0,0x72,0x7d,0xa0,0x71, 0x7c,0x9f,0x6e,0x7a,0x9d,0x71,0x7c,0x9f,0x6d,0x7a,0x9d,0x6e,0x7a,0x9d,0x6c,0x77, 0x9c,0x6b,0x76,0x9b,0x6b,0x76,0x9b,0x67,0x73,0x99,0x67,0x73,0x98,0x64,0x71,0x96, 0x60,0x6d,0x93,0x3b,0x41,0x5d,0x31,0x3b,0x53,0x2c,0x34,0x4d,0x30,0x37,0x52,0x44, 0x4f,0x77,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,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,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,0x00,0x00,0x00,0x44,0x44,0x44, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd, 0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,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,0xa8,0xa8,0xa8,0xfc,0xfc,0xfc,0xf9,0xf9,0xf9,0x1d,0x1d,0x1d,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,0x43, 0x43,0x43,0xfd,0xfd,0xfd,0xff,0xff,0xff,0x24,0x24,0x24,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,0xaa,0xaa,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,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,0x0a,0x08,0x0a, 0x72,0x5d,0x74,0x64,0x50,0x63,0x4c,0x3b,0x49,0x38,0x2b,0x34,0x75,0x81,0xa2,0x64, 0x53,0x75,0x56,0x50,0x79,0x58,0x64,0x8d,0x76,0x82,0xa3,0xa9,0xb1,0xc7,0xe6,0xe4, 0xe6,0x0e,0x0d,0x0f,0x00,0x00,0x00,0x07,0x05,0x07,0x9b,0x9b,0x9c,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xee,0xee,0xee,0x50,0x4e,0x53,0x29,0x24,0x36,0x40,0x3a,0x56,0x50,0x49, 0x6b,0x58,0x50,0x76,0x58,0x50,0x79,0x57,0x50,0x79,0x56,0x50,0x79,0x55,0x50,0x79, 0x54,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52, 0x7c,0x52,0x52,0x7c,0x45,0x46,0x69,0x23,0x23,0x35,0xac,0xac,0xae,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x67,0x67,0x68,0x0a,0x0b,0x10,0x12,0x14,0x1d,0x15, 0x17,0x21,0x15,0x17,0x22,0x15,0x17,0x22,0x15,0x17,0x22,0x15,0x18,0x22,0x15,0x17, 0x22,0x15,0x17,0x21,0x15,0x14,0x1f,0x18,0x15,0x1e,0x17,0x15,0x1e,0x15,0x15,0x20, 0x15,0x17,0x22,0x0d,0x0f,0x15,0x03,0x03,0x04,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,0x0f,0x11,0x19,0x38,0x40,0x59,0x1e, 0x22,0x2e,0xdd,0xdd,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x64,0x64, 0x65,0x7f,0x82,0x89,0xbe,0xc3,0xcf,0xc6,0xca,0xd9,0x87,0x8c,0x97,0x13,0x14,0x16, 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,0x0a,0x08, 0x09,0x31,0x24,0x2b,0x41,0x34,0x3b,0x99,0x9d,0xaf,0x73,0x7c,0x98,0x82,0x8b,0xa9, 0x8a,0x94,0xb1,0x92,0x9b,0xb7,0x90,0x9a,0xb5,0x94,0x9d,0xb8,0x93,0x9c,0xb8,0x99, 0xa2,0xbb,0x9a,0xa3,0xbb,0x99,0xa2,0xbb,0x94,0x9c,0xb3,0x96,0x9f,0xb7,0x72,0x7d, 0xa0,0x6f,0x7b,0x9f,0x72,0x7d,0xa0,0x6f,0x7b,0x9f,0x71,0x7c,0x9f,0x6f,0x7b,0x9f, 0x6f,0x7b,0x9f,0x71,0x7c,0x9f,0x71,0x7c,0xa0,0x6e,0x7a,0x9d,0x6d,0x79,0x9c,0x6d, 0x7a,0x9d,0x6d,0x79,0x9c,0x6a,0x76,0x9a,0x6a,0x75,0x9a,0x67,0x73,0x99,0x65,0x72, 0x98,0x65,0x72,0x98,0x54,0x5d,0x80,0x35,0x3d,0x58,0x2f,0x38,0x52,0x2f,0x35,0x4e, 0x38,0x3f,0x5f,0x34,0x3d,0x5c,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,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,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,0x00,0x00, 0x00,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44, 0x44,0x44,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,0xcc,0xcc,0xcc,0xfd,0xfd,0xfd,0xf6,0xf6,0xf6,0x04,0x04, 0x04,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,0xa0,0xa0,0xa0,0xff,0xff,0xff,0xfd,0xfd,0xfd,0x06,0x06,0x06,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,0x88,0x88,0x88,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xbb,0xbb,0xbb,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,0x46,0x39,0x47,0x6d,0x58,0x6e,0x56,0x44,0x54,0x4a,0x3a,0x47, 0x83,0x8e,0xac,0x63,0x53,0x77,0x52,0x5c,0x85,0x6b,0x76,0x9b,0x72,0x7d,0xa1,0xe3, 0xe6,0xed,0x55,0x51,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x79,0x79,0x79,0x59,0x58,0x59, 0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8e,0x8d,0x8f,0x1e, 0x1b,0x27,0x34,0x2f,0x45,0x49,0x43,0x63,0x55,0x4d,0x75,0x57,0x50,0x79,0x56,0x50, 0x79,0x56,0x50,0x79,0x55,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52, 0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x48,0x48,0x6d,0x29,0x29,0x3f,0x8d,0x8d, 0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8a,0x8a,0x8c,0x18,0x1b,0x27, 0x32,0x37,0x50,0x3d,0x43,0x63,0x3d,0x45,0x64,0x3d,0x46,0x64,0x3d,0x46,0x66,0x3d, 0x46,0x66,0x3d,0x46,0x66,0x3d,0x46,0x66,0x3d,0x46,0x66,0x3d,0x43,0x63,0x42,0x3c, 0x5b,0x49,0x3e,0x59,0x3e,0x3b,0x5b,0x3d,0x40,0x61,0x3d,0x46,0x64,0x25,0x2a,0x3d, 0x06,0x07,0x0b,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,0x28,0x26,0x3b,0x51,0x5c,0x85, 0x45,0x4e,0x6f,0x1f,0x23,0x31,0xdd,0xde,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x64,0x64,0x65,0x80,0x83,0x8a,0xc2,0xc5,0xd1,0xd6,0xd9,0xe3,0xce,0xd2, 0xde,0xbb,0xc0,0xce,0x5c,0x5f,0x67,0x06,0x07,0x07,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,0x0f,0x0b,0x0d,0x28,0x1e,0x23,0x2c,0x1f,0x26,0x51,0x45,0x4c,0xa4,0xa9, 0xba,0x6e,0x77,0x92,0x7c,0x86,0xa2,0x8a,0x94,0xb1,0x8e,0x99,0xb4,0x95,0x9f,0xb9, 0x93,0x9d,0xb8,0x96,0xa0,0xba,0x9a,0xa3,0xbc,0x9c,0xa4,0xbe,0x99,0xa2,0xba,0x96, 0x9f,0xb8,0x8a,0x93,0xb1,0x6e,0x7a,0x9d,0x6f,0x7c,0x9f,0x72,0x7e,0xa1,0x72,0x7d, 0xa0,0x72,0x7d,0xa0,0x6f,0x7c,0x9f,0x6f,0x7b,0x9f,0x6d,0x7a,0x9d,0x6e,0x7a,0x9d, 0x6c,0x77,0x9c,0x6d,0x79,0x9c,0x6a,0x76,0x9a,0x69,0x75,0x9a,0x67,0x73,0x99,0x69, 0x74,0x99,0x65,0x71,0x96,0x64,0x6f,0x95,0x43,0x4c,0x67,0x33,0x3d,0x55,0x31,0x36, 0x52,0x2f,0x36,0x50,0x49,0x55,0x7c,0x0f,0x11,0x18,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,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,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,0x00,0x00,0x00,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x44,0x44,0x44,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,0xd4,0xd4,0xd4,0xff,0xff,0xff,0xf8, 0xf8,0xf8,0x09,0x09,0x09,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,0xd5,0xd5,0xd5,0xff,0xff,0xff,0xa6,0xa6,0xa6, 0x02,0x02,0x02,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,0x44,0x44,0x44,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,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,0x0f,0x0c,0x0f,0x6b,0x57,0x6c,0x60,0x4c, 0x5f,0x53,0x42,0x51,0xb7,0xbe,0xcf,0x52,0x4f,0x7b,0x66,0x73,0x98,0x72,0x7d,0xa0, 0x89,0x93,0xb1,0xaf,0xac,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7b,0x7c, 0x7e,0x16,0x13,0x1b,0x32,0x2f,0x33,0xbd,0xbd,0xbd,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xcd,0xcd,0xce,0x32,0x31,0x38,0x2b,0x27,0x39,0x43,0x3d,0x5d,0x51, 0x4a,0x70,0x56,0x4f,0x77,0x55,0x50,0x79,0x54,0x50,0x79,0x54,0x50,0x79,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b, 0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x4d,0x4d,0x75,0x33, 0x34,0x4e,0x50,0x50,0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xee,0xee, 0xee,0x25,0x26,0x31,0x37,0x3d,0x59,0x4d,0x55,0x7c,0x51,0x5c,0x85,0x52,0x5c,0x86, 0x52,0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52, 0x5d,0x88,0x53,0x5e,0x88,0x52,0x5c,0x86,0x53,0x50,0x7a,0x64,0x53,0x74,0x5e,0x53, 0x79,0x4e,0x54,0x7e,0x42,0x4c,0x6b,0x1a,0x1e,0x2a,0x03,0x03,0x04,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,0x07,0x07,0x0a,0x3d,0x3a,0x59,0x53,0x51, 0x7e,0x58,0x63,0x91,0x55,0x61,0x8a,0x2a,0x2f,0x40,0xde,0xde,0xde,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x66,0x66,0x66,0x85,0x87,0x8d,0xc1,0xc4,0xd0,0xd5, 0xd8,0xe2,0xd3,0xd8,0xe2,0xd5,0xd8,0xe2,0xcb,0xd0,0xdd,0xb1,0xb6,0xc1,0x42,0x45, 0x4a,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,0x0b,0x08,0x0a,0x18,0x11,0x16,0x15,0x0f,0x13,0x2a,0x1f,0x26,0x2b, 0x1f,0x26,0x74,0x6a,0x71,0xab,0xb2,0xc3,0x79,0x83,0x9d,0x82,0x8b,0xa7,0x90,0x9a, 0xb5,0x92,0x9c,0xb7,0x93,0x9c,0xb7,0x99,0xa2,0xbb,0x9a,0xa3,0xbc,0x9d,0xa5,0xbe, 0x9b,0xa3,0xbc,0x96,0xa0,0xb7,0x98,0xa1,0xb8,0x74,0x80,0xa2,0x6e,0x7a,0x9d,0x6e, 0x7a,0x9d,0x6f,0x7c,0x9f,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x6e,0x7a, 0x9d,0x6d,0x79,0x9c,0x6d,0x7a,0x9d,0x6b,0x77,0x9b,0x6a,0x75,0x9a,0x6a,0x75,0x9a, 0x66,0x72,0x98,0x67,0x73,0x99,0x62,0x6e,0x94,0x5a,0x65,0x88,0x39,0x41,0x5d,0x33, 0x3c,0x56,0x30,0x37,0x53,0x35,0x3e,0x5b,0x52,0x59,0x87,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,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,0xc1,0xc1,0xc1, 0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0x65,0x65,0x65,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,0xf1,0xf1,0xf1,0xff,0xff, 0xff,0x56,0x56,0x56,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd, 0x22,0x22,0x22,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,0x3a, 0x2f,0x3a,0x5c,0x49,0x5b,0x57,0x44,0x55,0xc0,0xc3,0xd0,0x6e,0x7a,0x9d,0x74,0x80, 0xa2,0x77,0x83,0xa4,0xcc,0xd0,0xda,0x1f,0x1e,0x21,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x7c,0x7c,0x7d,0x22,0x27,0x38,0x2a,0x29,0x40,0x24,0x1b,0x26,0x7f,0x7d, 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5e,0x5e,0x62, 0x24,0x20,0x30,0x39,0x34,0x4f,0x4b,0x45,0x68,0x54,0x4e,0x76,0x54,0x50,0x79,0x54, 0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c, 0x51,0x51,0x7a,0x3f,0x40,0x60,0x1b,0x1c,0x2a,0xde,0xde,0xde,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x8c,0x8c,0x8f,0x21,0x24,0x35,0x3b,0x41,0x5f,0x4a,0x53, 0x78,0x50,0x5b,0x85,0x52,0x5d,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88, 0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f,0x89,0x50, 0x5b,0x85,0x4a,0x48,0x6f,0x4a,0x3d,0x56,0x27,0x24,0x37,0x5f,0x60,0x65,0xee,0xee, 0xef,0x7a,0x7b,0x7c,0x13,0x13,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x15,0x1e,0x51,0x49,0x6c,0x52, 0x4f,0x7a,0x61,0x61,0x94,0x7a,0x8a,0xc9,0x75,0x85,0xb7,0x41,0x46,0x51,0xdd,0xdd, 0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x65,0x65,0x65,0x9b,0x9b,0x9c, 0xca,0xcc,0xd6,0xe5,0xe7,0xed,0xd7,0xda,0xe5,0xd2,0xd7,0xe1,0xd5,0xd8,0xe2,0xd3, 0xd7,0xe2,0xcf,0xd2,0xdf,0x9a,0x9e,0xaa,0x27,0x29,0x2c,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,0x06,0x05,0x06,0x1a,0x13,0x19,0x18,0x10,0x16,0x17,0x0f,0x16, 0x22,0x19,0x1f,0x2d,0x21,0x28,0x2d,0x20,0x27,0xa6,0x9f,0xa3,0xa1,0xa8,0xbf,0x7b, 0x84,0xa0,0x89,0x92,0xac,0x8e,0x99,0xb4,0x93,0x9c,0xb7,0x94,0x9f,0xb8,0x96,0xa0, 0xba,0x9a,0xa3,0xbc,0x9c,0xa5,0xbe,0x98,0xa1,0xba,0x96,0x9f,0xb7,0x89,0x93,0xb0, 0x6e,0x7b,0x9d,0x6e,0x7a,0x9d,0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x6e,0x7a,0x9d,0x6f, 0x7c,0x9f,0x6c,0x77,0x9c,0x6c,0x79,0x9c,0x6b,0x76,0x9b,0x69,0x75,0x9a,0x69,0x75, 0x9a,0x66,0x72,0x98,0x65,0x72,0x96,0x63,0x6e,0x95,0x62,0x6e,0x94,0x4a,0x54,0x73, 0x36,0x3f,0x5b,0x33,0x3c,0x54,0x2f,0x38,0x52,0x41,0x4b,0x72,0x30,0x3b,0x56,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd, 0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,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,0x7c,0x7c,0x7c,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xc7,0xc7,0xc7,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,0x3c,0x3c,0x3c,0xfc, 0xfc,0xfc,0xff,0xff,0xff,0x22,0x22,0x22,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,0x33,0x33,0x33,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0x33,0x33,0x33,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,0x11,0x11,0x11,0xbb,0xbb,0xbb,0xaa,0xaa,0xaa, 0x33,0x33,0x33,0x07,0x06,0x07,0x4d,0x3e,0x4d,0x58,0x46,0x56,0xb1,0xb1,0xbe,0x93, 0x9c,0xb7,0x6f,0x7b,0x9f,0xac,0xb4,0xc8,0x7f,0x7c,0x84,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x79,0x79,0x79,0x26,0x1f,0x29,0x43,0x49,0x69,0x3d, 0x45,0x64,0x2e,0x26,0x35,0x51,0x4e,0x52,0xdd,0xdd,0xde,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xad,0xad,0xae,0x18,0x16,0x22,0x2f,0x2b,0x41,0x46,0x40,0x61, 0x51,0x4d,0x74,0x55,0x50,0x79,0x54,0x50,0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50, 0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x49,0x4a,0x6f,0x2d,0x2e,0x46,0x50,0x50,0x56, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8e,0x8e,0x91,0x1d, 0x20,0x2e,0x30,0x36,0x4e,0x40,0x47,0x68,0x48,0x52,0x78,0x4d,0x58,0x81,0x51,0x5c, 0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x50,0x5b,0x85,0x4d,0x58,0x7e, 0x48,0x52,0x76,0x40,0x48,0x68,0x32,0x38,0x51,0x1e,0x22,0x31,0x7d,0x7d,0x81,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xce,0xce,0xcf,0x15,0x18,0x22,0x05,0x06, 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x29,0x3b,0x5f,0x52,0x76, 0x5c,0x53,0x7b,0x57,0x54,0x82,0x71,0x7a,0xb6,0xb7,0xca,0xfe,0x60,0x61,0x73,0x11, 0x0d,0x10,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4e,0x4c, 0x4e,0x36,0x2e,0x34,0xd8,0xd8,0xd9,0xf5,0xf6,0xf8,0xf8,0xf8,0xfa,0xe5,0xe7,0xee, 0xd2,0xd7,0xe1,0xd7,0xda,0xe5,0xd6,0xd9,0xe3,0xd2,0xd7,0xe1,0xcb,0xd0,0xdd,0x7d, 0x81,0x8a,0x16,0x16,0x18,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,0x05,0x04,0x05,0x1a,0x13,0x18,0x19,0x12,0x17,0x19,0x12, 0x17,0x18,0x10,0x16,0x18,0x12,0x18,0x31,0x24,0x2c,0x31,0x24,0x2c,0x38,0x2c,0x33, 0xcb,0xc8,0xcb,0x96,0x9f,0xb7,0x7e,0x88,0xa2,0x8d,0x96,0xb1,0x93,0x9c,0xb7,0x95, 0x9f,0xb9,0x94,0x9f,0xb8,0x9b,0xa3,0xbc,0x9c,0xa5,0xbe,0x9c,0xa5,0xbe,0x99,0xa2, 0xba,0x9d,0xa5,0xbe,0x73,0x7e,0xa1,0x6e,0x7a,0x9d,0x6f,0x7c,0x9f,0x6e,0x7a,0x9d, 0x6e,0x7a,0x9d,0x6e,0x7a,0x9d,0x6c,0x79,0x9c,0x6b,0x76,0x9b,0x6a,0x75,0x9a,0x6a, 0x75,0x9a,0x6a,0x75,0x9a,0x66,0x72,0x98,0x66,0x72,0x98,0x62,0x6e,0x94,0x5c,0x69, 0x8d,0x3f,0x47,0x65,0x35,0x3e,0x58,0x30,0x39,0x54,0x33,0x3d,0x59,0x48,0x56,0x81, 0x05,0x06,0x09,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,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,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,0x00,0x00,0x00,0x00,0x00, 0x00,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44, 0x44,0x44,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,0x1a,0x1a,0x1a,0xf2,0xf2,0xf2,0xff,0xff,0xff,0xf9,0xf9, 0xf9,0x63,0x63,0x63,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, 0x98,0x98,0x98,0xfd,0xfd,0xfd,0xff,0xff,0xff,0x08,0x08,0x08,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,0x66,0x66,0x66,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x88,0x88, 0x88,0x11,0x11,0x11,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,0x77,0x77,0x77,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0x55,0x55,0x2f,0x25,0x2f,0x58,0x46,0x56, 0x95,0x8f,0x9e,0xad,0xb4,0xc9,0x6f,0x7b,0x9f,0xb8,0xba,0xc8,0x07,0x07,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x07,0x06,0x07, 0x3f,0x32,0x40,0x4d,0x51,0x74,0x45,0x4f,0x70,0x32,0x2b,0x3f,0x27,0x22,0x28,0xad, 0xac,0xad,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xde,0xde,0xde,0x41,0x3f, 0x45,0x28,0x25,0x38,0x3f,0x3b,0x59,0x4d,0x48,0x6e,0x52,0x4e,0x77,0x53,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x50,0x50,0x79,0x42,0x43, 0x64,0x26,0x27,0x3b,0x7e,0x7e,0x82,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xbd,0xbd,0xbe,0x40,0x41,0x48,0x1e,0x22,0x31,0x2a,0x30,0x46,0x35, 0x3c,0x57,0x3b,0x43,0x63,0x3d,0x46,0x66,0x3d,0x46,0x66,0x3e,0x46,0x66,0x3a,0x42, 0x5f,0x31,0x38,0x51,0x28,0x2e,0x41,0x1c,0x1f,0x2d,0x3f,0x41,0x47,0xbd,0xbd,0xbe, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xde,0x32,0x33,0x3b,0x34, 0x3b,0x53,0x4e,0x57,0x79,0x2a,0x30,0x45,0x0d,0x0c,0x13,0x47,0x3d,0x57,0x64,0x53, 0x76,0x63,0x56,0x7b,0x60,0x58,0x85,0x6a,0x78,0xa4,0xd2,0xda,0xed,0x32,0x25,0x2d, 0x28,0x1d,0x23,0x13,0x0e,0x11,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x50,0x4e,0x50,0x31,0x26,0x2f,0x41,0x32,0x3e,0x58,0x4c,0x55,0xee,0xef, 0xf4,0xfa,0xfa,0xfd,0xfa,0xfa,0xfc,0xdd,0xdf,0xe8,0xda,0xde,0xe7,0xd5,0xd8,0xe3, 0xd8,0xdb,0xe5,0xcf,0xd3,0xdf,0xbf,0xc4,0xd1,0x62,0x65,0x6d,0x0a,0x0b,0x0c,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,0x02,0x02,0x02,0x17,0x11,0x15,0x18,0x10,0x16,0x18, 0x11,0x17,0x19,0x12,0x18,0x19,0x12,0x18,0x29,0x28,0x3a,0x25,0x21,0x2f,0x34,0x26, 0x2e,0x33,0x26,0x2e,0x49,0x3c,0x43,0xda,0xdb,0xe0,0x8c,0x95,0xaf,0x80,0x88,0xa2, 0x8b,0x94,0xb1,0x92,0x9b,0xb7,0x96,0xa0,0xba,0x9a,0xa2,0xbb,0x9a,0xa3,0xbc,0x9f, 0xa7,0xbf,0xa0,0xa8,0xc0,0x9a,0xa3,0xbc,0x8a,0x93,0xb1,0x72,0x7d,0xa0,0x6f,0x7b, 0x9f,0x6e,0x7a,0x9d,0x6d,0x79,0x9c,0x6b,0x77,0x9b,0x6b,0x77,0x9b,0x6b,0x76,0x9b, 0x6b,0x76,0x9b,0x69,0x75,0x9a,0x67,0x73,0x99,0x64,0x71,0x96,0x66,0x72,0x98,0x62, 0x6d,0x94,0x4f,0x58,0x7c,0x3b,0x43,0x5e,0x34,0x3d,0x58,0x30,0x38,0x53,0x37,0x40, 0x61,0x37,0x40,0x5e,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,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,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,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0x44,0x44,0x44,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,0xac,0xac,0xac,0xff, 0xff,0xff,0xff,0xff,0xff,0xee,0xee,0xee,0x52,0x52,0x52,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,0xd0,0xd0,0xd0,0xff,0xff,0xff,0xc7,0xc7,0xc7,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,0x44,0x44,0x44,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xaa,0xaa,0x77,0x77,0x77,0x33,0x33, 0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x33,0x33,0x33,0x77,0x77,0x77,0xaa,0xaa,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x0c,0x0a, 0x0c,0x61,0x4d,0x61,0x84,0x78,0x89,0xc0,0xc6,0xd5,0xad,0xb4,0xc9,0x56,0x54,0x5c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,0x00,0x00,0x00,0x04,0x04,0x04,0x3a,0x2d,0x39,0x4d,0x49,0x65,0x4c,0x56,0x77, 0x35,0x33,0x4d,0x26,0x1d,0x28,0x70,0x6d,0x70,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x7e,0x7d,0x81,0x1f,0x1d,0x2b,0x33,0x30,0x49,0x46,0x43, 0x65,0x50,0x4d,0x76,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52, 0x52,0x7c,0x4e,0x4f,0x78,0x3f,0x40,0x61,0x25,0x26,0x39,0x7e,0x7e,0x82,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbc,0xbd,0xbd, 0x7d,0x7d,0x81,0x40,0x41,0x49,0x14,0x16,0x21,0x15,0x17,0x22,0x15,0x18,0x22,0x15, 0x18,0x22,0x13,0x15,0x1f,0x6e,0x70,0x74,0x7c,0x7d,0x80,0xde,0xde,0xde,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcd,0xcd,0xce,0x32,0x33,0x3b, 0x2e,0x2a,0x40,0x44,0x42,0x65,0x51,0x5c,0x85,0x5a,0x65,0x8e,0x5a,0x65,0x8d,0x52, 0x4f,0x7b,0x62,0x53,0x77,0x61,0x56,0x7d,0x74,0x81,0xa6,0x3c,0x2f,0x39,0x38,0x29, 0x32,0x41,0x32,0x3d,0x39,0x2c,0x37,0x18,0x12,0x17,0xdd,0xdd,0xdd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x51,0x4e,0x51,0x3b,0x2f,0x3a,0x56,0x44,0x54,0x54, 0x42,0x51,0x49,0x38,0x46,0x47,0x38,0x43,0x8d,0x85,0x8d,0xf5,0xf4,0xf7,0xf7,0xf8, 0xfa,0xe0,0xe2,0xea,0xd2,0xd7,0xe1,0xd0,0xd5,0xe0,0xcf,0xd3,0xdf,0xca,0xcf,0xdd, 0xb2,0xb8,0xc6,0x50,0x53,0x5b,0x06,0x06,0x07,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,0x18,0x11,0x17,0x17,0x0f,0x15, 0x18,0x11,0x17,0x19,0x12,0x17,0x1a,0x12,0x19,0x3e,0x3a,0x47,0x28,0x2a,0x43,0x26, 0x1f,0x31,0x3b,0x2c,0x36,0x34,0x27,0x2f,0x31,0x24,0x2c,0x67,0x5e,0x63,0xcc,0xd0, 0xdc,0x80,0x8a,0xa3,0x80,0x88,0xa1,0x94,0x9d,0xb8,0x98,0xa1,0xba,0x9a,0xa3,0xbb, 0x9f,0xa7,0xbf,0xa1,0xaa,0xc1,0xa1,0xaa,0xc1,0xa0,0xa9,0xc0,0x9c,0xa5,0xbe,0x75, 0x81,0xa2,0x71,0x7c,0xa0,0x6f,0x7b,0x9f,0x6e,0x7a,0x9d,0x6d,0x7a,0x9d,0x6c,0x77, 0x9b,0x69,0x75,0x9a,0x67,0x74,0x99,0x69,0x74,0x99,0x67,0x74,0x99,0x64,0x71,0x96, 0x62,0x6e,0x94,0x5f,0x6c,0x92,0x43,0x4c,0x6a,0x39,0x41,0x5e,0x35,0x3e,0x5a,0x32, 0x3d,0x58,0x42,0x52,0x75,0x17,0x1c,0x28,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, 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,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, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd,0xdd,0xdd,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,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, 0x02,0x02,0x02,0xe4,0xe4,0xe4,0xff,0xff,0xff,0xff,0xff,0xff,0xf2,0xf2,0xf2,0x86, 0x86,0x86,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,0xf1,0xf1,0xf1,0xff,0xff,0xff,0x7c,0x7c, 0x7c,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,0x22,0x22,0x22,0xaa,0xaa,0xaa, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0x44,0x44,0x44,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x39,0x47,0x78,0x68,0x7b,0xc9,0xce,0xdb,0xaf,0xb0, 0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x1d, 0x24,0x4c,0x41,0x57,0x4b,0x53,0x78,0x3f,0x3f,0x60,0x2f,0x24,0x32,0x42,0x3e,0x43, 0xcd,0xcd,0xcd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbd,0xbd,0xbd,0x32, 0x32,0x39,0x2a,0x28,0x3c,0x42,0x3f,0x5f,0x4e,0x4a,0x72,0x51,0x4e,0x79,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b, 0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x4e,0x4f,0x77,0x3f,0x41,0x61,0x26, 0x27,0x3b,0x50,0x50,0x56,0xde,0xde,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9d,0x9e,0xa0,0x1b,0x1f, 0x2c,0x32,0x3a,0x51,0x47,0x52,0x74,0x50,0x52,0x7c,0x5d,0x52,0x79,0x52,0x52,0x7d, 0x5a,0x65,0x8d,0x5c,0x69,0x90,0x56,0x63,0x8b,0x52,0x4f,0x7a,0x3f,0x30,0x3c,0x50, 0x3e,0x4d,0x63,0x4f,0x63,0x62,0x50,0x63,0x13,0x10,0x15,0x00,0x00,0x00,0xdd,0xdd, 0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x54,0x51,0x54,0x42,0x35,0x42, 0x5d,0x4b,0x5d,0x62,0x4e,0x61,0x5f,0x4b,0x5d,0x5b,0x48,0x59,0x52,0x40,0x50,0x48, 0x38,0x44,0x70,0x66,0x6e,0xe2,0xe1,0xe5,0xfc,0xfc,0xfd,0xed,0xef,0xf2,0xdb,0xdf, 0xe7,0xd0,0xd5,0xe0,0xc8,0xcc,0xda,0xc3,0xc8,0xd7,0xa5,0xac,0xbb,0x46,0x48,0x51, 0x02,0x02,0x02,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,0x18,0x11,0x15,0x15,0x0f, 0x13,0x15,0x0f,0x13,0x18,0x10,0x16,0x19,0x12,0x18,0x42,0x3c,0x47,0x3b,0x3c,0x51, 0x24,0x21,0x38,0x2d,0x20,0x31,0x2d,0x24,0x30,0x35,0x27,0x2f,0x2e,0x22,0x28,0x30, 0x23,0x2a,0x97,0x91,0x94,0xb0,0xb7,0xca,0x80,0x8a,0xa3,0x88,0x91,0xa9,0x98,0xa1, 0xba,0x9a,0xa3,0xbc,0x9d,0xa5,0xbf,0x9f,0xa7,0xbf,0xa0,0xa8,0xc0,0xa4,0xac,0xc3, 0xa2,0xab,0xc2,0x89,0x93,0xb0,0x71,0x7c,0x9f,0x72,0x7d,0xa0,0x6e,0x7a,0x9d,0x6e, 0x7a,0x9d,0x6c,0x77,0x9c,0x6b,0x76,0x9b,0x69,0x75,0x9a,0x65,0x72,0x98,0x66,0x73, 0x98,0x66,0x73,0x98,0x63,0x6e,0x95,0x56,0x60,0x83,0x3f,0x47,0x63,0x38,0x41,0x5d, 0x33,0x3d,0x56,0x37,0x43,0x61,0x44,0x50,0x75,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99,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,0xdd, 0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,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,0x34,0x34,0x34,0xea,0xea,0xea,0xfd,0xfd,0xfd, 0xff,0xff,0xff,0xfc,0xfc,0xfc,0xcb,0xcb,0xcb,0x3c,0x3c,0x3c,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,0x3f,0x3f,0x3f,0xfc,0xfc,0xfc,0xff, 0xff,0xff,0x42,0x42,0x42,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,0x44,0x44,0x44,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xcc,0xcc,0xcc,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x09,0x74,0x61,0x76,0xcb, 0xd0,0xdd,0x4b,0x49,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x14,0x10,0x13,0x48,0x3b,0x4a,0x4c,0x50,0x70,0x43,0x45, 0x68,0x38,0x2f,0x44,0x1e,0x16,0x1f,0x9e,0x9d,0x9f,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xee,0xee,0xee,0x5f,0x5e,0x63,0x24,0x22,0x33,0x39,0x37,0x53,0x4a, 0x47,0x6e,0x51,0x4e,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7d, 0x4e,0x4f,0x78,0x42,0x44,0x65,0x2d,0x2f,0x46,0x1a,0x1b,0x28,0x7d,0x7e,0x81,0xde, 0xde,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9c,0x9d,0x9f,0x44,0x45,0x4d,0x26, 0x2b,0x3e,0x3c,0x44,0x61,0x4c,0x56,0x7a,0x55,0x62,0x89,0x5a,0x65,0x8d,0x55,0x60, 0x8a,0x52,0x50,0x7c,0x52,0x4f,0x7a,0x54,0x5f,0x89,0x5c,0x67,0x90,0x5b,0x67,0x90, 0x54,0x59,0x7f,0x65,0x52,0x66,0x19,0x16,0x1d,0x02,0x02,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4d,0x4e, 0x50,0x40,0x3f,0x56,0x6e,0x5b,0x71,0x68,0x53,0x68,0x62,0x4e,0x62,0x62,0x4e,0x62, 0x61,0x4d,0x60,0x5d,0x4a,0x5c,0x57,0x44,0x54,0x4c,0x3b,0x48,0x58,0x4c,0x57,0xb6, 0xb3,0xb7,0xf5,0xf5,0xf8,0xe2,0xe5,0xeb,0xd2,0xd6,0xe1,0xc9,0xce,0xdb,0xbc,0xc3, 0xd3,0xb5,0xbb,0xce,0x8e,0x94,0xa6,0x35,0x38,0x40,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,0x16,0x10,0x14,0x12, 0x0c,0x10,0x12,0x0c,0x10,0x15,0x0f,0x13,0x18,0x11,0x17,0x3a,0x34,0x3f,0x3a,0x3a, 0x4f,0x28,0x2b,0x41,0x24,0x22,0x3a,0x2d,0x21,0x33,0x25,0x1c,0x2c,0x36,0x28,0x31, 0x31,0x24,0x2b,0x2a,0x1e,0x24,0x2f,0x24,0x2b,0xc7,0xc4,0xc6,0x9b,0xa4,0xbb,0x89, 0x91,0xa8,0x8b,0x94,0xaf,0x9f,0xa8,0xbf,0x9f,0xa7,0xbf,0xa0,0xa8,0xc0,0xa2,0xab, 0xc2,0xa3,0xab,0xc2,0xa5,0xad,0xc3,0xa1,0xaa,0xc1,0x77,0x82,0xa4,0x72,0x7d,0xa0, 0x6f,0x7b,0x9f,0x6f,0x7b,0x9f,0x6c,0x77,0x9b,0x6b,0x76,0x9b,0x66,0x73,0x98,0x67, 0x73,0x98,0x65,0x72,0x98,0x64,0x6f,0x95,0x62,0x6e,0x94,0x4a,0x53,0x71,0x3c,0x46, 0x63,0x37,0x40,0x5c,0x36,0x3f,0x5b,0x45,0x51,0x76,0x2c,0x34,0x4c,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x44,0x44,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x99,0x99,0x99, 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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44, 0x44,0x44,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,0x31,0x31, 0x31,0xe2,0xe2,0xe2,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xf4,0xf4,0xf4, 0xbc,0xbc,0xbc,0x55,0x55,0x55,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,0x13,0x13,0x13,0xb8,0xb8,0xb8, 0xff,0xff,0xff,0xff,0xff,0xff,0x16,0x16,0x16,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,0x77,0x77,0x77,0x77,0x77,0x77,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xdd,0xdd,0x77, 0x77,0x77,0x77,0x77,0x77,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x35,0x2d,0x36,0xbd,0xc0,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x07,0x08,0x3d, 0x2f,0x39,0x4d,0x48,0x60,0x49,0x52,0x76,0x39,0x37,0x54,0x2b,0x20,0x2c,0x60,0x5e, 0x61,0xee,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa0,0x9f,0xa3, 0x46,0x44,0x55,0x44,0x41,0x64,0x51,0x4e,0x78,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52, 0x7c,0x52,0x52,0x7c,0x52,0x53,0x7d,0x50,0x51,0x7a,0x48,0x49,0x6f,0x3c,0x3e,0x5d, 0x2b,0x2d,0x44,0x1c,0x1d,0x2c,0x41,0x42,0x49,0x7d,0x7e,0x81,0x8b,0x8c,0x8d,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xcd,0xcd,0xce,0x7c,0x7d,0x80,0x7e,0x7f,0x83,0x16,0x19,0x24,0x26,0x2b,0x3e, 0x37,0x40,0x5a,0x47,0x51,0x73,0x50,0x5c,0x82,0x56,0x63,0x8a,0x56,0x63,0x8b,0x58, 0x64,0x8d,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x55,0x60,0x8a,0x52,0x52,0x7c,0x52,0x4f, 0x7b,0x54,0x5f,0x89,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x3a,0x37,0x56,0x06,0x05,0x07, 0x02,0x02,0x03,0x00,0x00,0x00,0xdd,0xdd,0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x44,0x44,0x44,0x15,0x17,0x1d,0x61,0x69,0x8a,0x78,0x69,0x86,0x6c,0x58, 0x6e,0x64,0x50,0x63,0x62,0x4e,0x62,0x62,0x4e,0x62,0x62,0x4e,0x61,0x5f,0x4c,0x5e, 0x5a,0x47,0x58,0x51,0x3f,0x4e,0x54,0x46,0x53,0x91,0x8d,0x98,0xe1,0xe3,0xeb,0xdd, 0xe0,0xe8,0xc4,0xc9,0xd8,0xb5,0xbb,0xce,0xad,0xb4,0xc9,0xa8,0xb0,0xc6,0x97,0x9c, 0xaa,0x36,0x38,0x3c,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,0x15,0x0f,0x14, 0x11,0x0c,0x0f,0x0e,0x09,0x0c,0x10,0x0a,0x0e,0x15,0x0f,0x13,0x30,0x2a,0x35,0x32, 0x34,0x49,0x28,0x2a,0x40,0x26,0x2a,0x3f,0x27,0x2a,0x43,0x2c,0x24,0x39,0x2c,0x1f, 0x30,0x36,0x29,0x32,0x32,0x25,0x2c,0x2f,0x23,0x2a,0x2a,0x1e,0x24,0x3f,0x33,0x3a, 0xdb,0xdc,0xe1,0x93,0x9c,0xb4,0x86,0x8d,0xa5,0x96,0xa0,0xb8,0xa2,0xaa,0xc1,0xa2, 0xaa,0xc1,0xa7,0xaf,0xc4,0xa4,0xac,0xc3,0xa9,0xb1,0xc6,0xa9,0xb0,0xc6,0x8c,0x96, 0xb3,0x76,0x81,0xa3,0x71,0x7c,0x9f,0x6e,0x7b,0x9d,0x6c,0x77,0x9c,0x6a,0x75,0x9a, 0x69,0x75,0x9a,0x66,0x73,0x98,0x64,0x6f,0x95,0x63,0x6e,0x95,0x57,0x63,0x86,0x41, 0x4a,0x67,0x38,0x41,0x5e,0x35,0x3e,0x5a,0x36,0x43,0x60,0x54,0x62,0x90,0x03,0x04, 0x06,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,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,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,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,0xa5,0xa5,0xa5,0xf5,0xf5,0xf5,0xff,0xff, 0xff,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xf1,0xf1,0xf1,0xcd,0xcd,0xcd, 0xa1,0xa1,0xa1,0x8a,0x8a,0x8a,0x74,0x74,0x74,0x63,0x63,0x63,0x66,0x66,0x66,0x71, 0x71,0x71,0x87,0x87,0x87,0x99,0x99,0x99,0xaf,0xaf,0xaf,0xd5,0xd5,0xd5,0xea,0xea, 0xea,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xef,0xef,0xef,0x05,0x05,0x05,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,0x1d,0x1b,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x23,0x2b,0x4c,0x40,0x50,0x51,0x56,0x76,0x40, 0x44,0x66,0x35,0x2c,0x3d,0x1f,0x17,0x21,0x1a,0x15,0x1e,0x16,0x14,0x1e,0x1a,0x18, 0x24,0x26,0x24,0x37,0x39,0x37,0x53,0x4b,0x48,0x6d,0x51,0x4e,0x79,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52, 0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7d,0x52,0x53,0x7d,0x52,0x53, 0x7e,0x4f,0x51,0x7a,0x48,0x4b,0x71,0x40,0x42,0x64,0x35,0x39,0x55,0x2c,0x2e,0x46, 0x22,0x26,0x37,0x19,0x1c,0x28,0x15,0x17,0x22,0x15,0x17,0x22,0x15,0x17,0x22,0x15, 0x17,0x22,0x17,0x1a,0x25,0x1e,0x23,0x32,0x27,0x2d,0x41,0x30,0x36,0x4e,0x3b,0x43, 0x60,0x48,0x51,0x74,0x50,0x5a,0x81,0x55,0x61,0x89,0x56,0x62,0x8b,0x57,0x63,0x8c, 0x57,0x63,0x8c,0x57,0x64,0x8c,0x5a,0x65,0x8d,0x58,0x65,0x8d,0x5b,0x67,0x90,0x5a, 0x66,0x8e,0x56,0x62,0x8b,0x52,0x52,0x7c,0x52,0x50,0x7c,0x56,0x62,0x8b,0x5e,0x6a, 0x91,0x63,0x6e,0x94,0x0b,0x09,0x0d,0x00,0x00,0x00,0xdd,0xdd,0xdd,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,0x00,0x00,0x00,0x08,0x08,0x0b,0x3e, 0x44,0x57,0x64,0x62,0x86,0x74,0x5f,0x77,0x69,0x55,0x6a,0x62,0x4e,0x61,0x61,0x4d, 0x60,0x62,0x4e,0x61,0x61,0x4d,0x60,0x60,0x4c,0x5f,0x5d,0x49,0x5b,0x57,0x44,0x55, 0x57,0x48,0x55,0x95,0x91,0x9b,0xe5,0xe7,0xee,0xd5,0xd8,0xe3,0xbb,0xc1,0xd2,0xc0, 0xc6,0xd6,0xc9,0xce,0xdb,0xbb,0xc1,0xd2,0x81,0x87,0x97,0x0b,0x0c,0x0e,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,0x12,0x0d, 0x10,0x10,0x0a,0x0e,0x0d,0x09,0x0b,0x0d,0x09,0x0b,0x10,0x0a,0x0e,0x2c,0x27,0x32, 0x2e,0x30,0x47,0x25,0x27,0x3c,0x27,0x2a,0x40,0x2b,0x2d,0x45,0x29,0x2b,0x44,0x26, 0x22,0x3b,0x2e,0x21,0x34,0x28,0x1f,0x2b,0x36,0x28,0x31,0x30,0x23,0x2a,0x2b,0x1f, 0x26,0x29,0x1e,0x23,0x62,0x59,0x5f,0xce,0xd1,0xde,0x88,0x91,0xaa,0x8b,0x94,0xac, 0x99,0xa2,0xbb,0xa9,0xb0,0xc6,0xa8,0xaf,0xc4,0xa9,0xb1,0xc6,0xaa,0xb2,0xc7,0xaa, 0xb2,0xc7,0xa5,0xad,0xc4,0x7c,0x88,0xa8,0x74,0x80,0xa2,0x73,0x7e,0xa1,0x6d,0x79, 0x9c,0x6d,0x79,0x9c,0x6b,0x76,0x9b,0x64,0x71,0x96,0x65,0x71,0x96,0x60,0x6c,0x93, 0x4b,0x54,0x75,0x3f,0x48,0x65,0x39,0x41,0x5f,0x34,0x3b,0x57,0x43,0x4e,0x74,0x3f, 0x48,0x6c,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,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,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,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,0x3e, 0x3e,0x3e,0xd0,0xd0,0xd0,0xfa,0xfa,0xfa,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0xfe,0xfe,0xfe, 0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa, 0xfa,0xfa,0xed,0xed,0xed,0xf8,0xf8,0xf8,0xff,0xff,0xff,0xae,0xae,0xae,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x77,0x77,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x14,0x18, 0x45,0x35,0x41,0x4f,0x4d,0x65,0x49,0x51,0x75,0x49,0x41,0x5f,0x48,0x36,0x4c,0x48, 0x36,0x4c,0x4c,0x40,0x5c,0x48,0x44,0x67,0x50,0x4b,0x71,0x53,0x4f,0x78,0x53,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52, 0x52,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x54,0x7e,0x51,0x54,0x7f,0x4d,0x50, 0x7a,0x49,0x4e,0x74,0x44,0x4b,0x6e,0x40,0x47,0x67,0x3d,0x44,0x64,0x3d,0x45,0x64, 0x3d,0x46,0x66,0x3d,0x46,0x66,0x3e,0x47,0x67,0x43,0x4c,0x6f,0x48,0x52,0x76,0x4c, 0x56,0x7d,0x50,0x5c,0x84,0x54,0x5f,0x88,0x55,0x60,0x8a,0x56,0x62,0x8b,0x56,0x62, 0x8b,0x56,0x62,0x8b,0x57,0x63,0x8c,0x57,0x63,0x8c,0x58,0x64,0x8d,0x58,0x65,0x8d, 0x58,0x65,0x8d,0x5b,0x67,0x90,0x5d,0x69,0x91,0x5c,0x67,0x90,0x55,0x60,0x8a,0x52, 0x50,0x7b,0x53,0x5d,0x86,0x5d,0x6a,0x91,0x50,0x59,0x76,0x21,0x24,0x30,0xdd,0xdd, 0xdd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44,0x44,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0b,0x0f,0x3c,0x3f,0x55,0x74,0x67,0x86,0x71, 0x5c,0x74,0x63,0x4f,0x63,0x5a,0x47,0x58,0x5d,0x4a,0x5c,0x5e,0x4a,0x5d,0x5d,0x49, 0x5b,0x5d,0x49,0x5b,0x5c,0x49,0x5b,0x58,0x45,0x56,0x59,0x4a,0x56,0x92,0x8b,0x93, 0xe9,0xe9,0xec,0xf9,0xf9,0xfa,0xde,0xe1,0xe9,0xaf,0xb5,0xca,0x85,0x90,0xad,0x4b, 0x51,0x62,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,0x11, 0x0d,0x10,0x0d,0x09,0x0b,0x0a,0x06,0x08,0x0b,0x07,0x09,0x0d,0x09,0x0b,0x30,0x2c, 0x36,0x34,0x37,0x4f,0x25,0x26,0x3b,0x28,0x2a,0x41,0x2a,0x2c,0x43,0x2c,0x2e,0x47, 0x2b,0x2e,0x46,0x27,0x2a,0x43,0x2e,0x24,0x39,0x28,0x1f,0x2e,0x39,0x2b,0x34,0x32, 0x25,0x2c,0x2e,0x22,0x29,0x29,0x1e,0x23,0x29,0x1e,0x23,0x9c,0x95,0x99,0xb4,0xba, 0xcc,0x89,0x91,0xa9,0x9c,0xa3,0xba,0xa2,0xab,0xc2,0xa9,0xb0,0xc6,0xac,0xb4,0xc9, 0xaf,0xb7,0xca,0xad,0xb5,0xc9,0xb0,0xb7,0xca,0x8c,0x96,0xb3,0x76,0x82,0xa3,0x75, 0x81,0xa3,0x72,0x7d,0xa0,0x6d,0x79,0x9d,0x67,0x73,0x99,0x67,0x73,0x98,0x62,0x6e, 0x94,0x57,0x63,0x86,0x44,0x4e,0x6c,0x3d,0x45,0x64,0x38,0x41,0x5d,0x38,0x41,0x5d, 0x56,0x65,0x92,0x0c,0x0e,0x14,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,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,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,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,0x43,0x43,0x43,0xac,0xac,0xac,0xe8, 0xe8,0xe8,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe, 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf8,0xf8,0xf8,0xfb,0xfb,0xfb,0xff,0xff,0xff,0x62, 0x62,0x62,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,0x99,0x99,0x99,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0x09,0x07,0x08,0x36,0x29,0x33,0x48,0x3d,0x4c,0x59,0x60,0x83, 0x52,0x4f,0x7a,0x62,0x4a,0x66,0x5b,0x43,0x5d,0x64,0x50,0x6f,0x58,0x50,0x79,0x54, 0x50,0x79,0x54,0x50,0x79,0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b, 0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x53,0x7d,0x52,0x54,0x7e,0x52, 0x55,0x80,0x52,0x55,0x81,0x52,0x57,0x82,0x52,0x57,0x82,0x52,0x5a,0x84,0x52,0x5c, 0x86,0x52,0x5c,0x86,0x52,0x5c,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5e,0x88, 0x53,0x5e,0x89,0x53,0x5f,0x89,0x53,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x55, 0x60,0x8a,0x55,0x62,0x8b,0x56,0x62,0x8b,0x56,0x63,0x8b,0x56,0x63,0x8b,0x57,0x64, 0x8c,0x58,0x64,0x8d,0x5a,0x65,0x8d,0x5c,0x67,0x90,0x5c,0x67,0x90,0x5c,0x67,0x90, 0x5e,0x6b,0x92,0x5e,0x69,0x91,0x55,0x60,0x8a,0x55,0x56,0x80,0x44,0x4e,0x6c,0x20, 0x23,0x2f,0xdd,0xde,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0x44, 0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0c,0x0c,0x10,0x47,0x40,0x54,0x70,0x5b,0x72,0x58,0x45,0x56,0x50,0x3f,0x4d,0x50, 0x3f,0x4d,0x52,0x40,0x4f,0x51,0x3f,0x4e,0x4f,0x3e,0x4c,0x4f,0x3e,0x4c,0x4a,0x39, 0x47,0x44,0x34,0x40,0x3d,0x2f,0x38,0x65,0x5b,0x61,0xef,0xee,0xee,0xe3,0xe6,0xed, 0x80,0x8a,0xaa,0x6a,0x76,0x99,0x12,0x14,0x18,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, 0x14,0x0e,0x12,0x0d,0x09,0x0b,0x0b,0x07,0x09,0x12,0x0c,0x0e,0x19,0x11,0x14,0x63, 0x61,0x6b,0x63,0x6f,0x95,0x4c,0x56,0x78,0x52,0x5e,0x80,0x29,0x2b,0x42,0x2d,0x30, 0x47,0x2f,0x31,0x4a,0x2e,0x30,0x48,0x2a,0x2d,0x46,0x26,0x22,0x3c,0x2d,0x24,0x37, 0x3a,0x2e,0x39,0x37,0x29,0x32,0x2f,0x22,0x29,0x2b,0x1f,0x26,0x29,0x1e,0x24,0x32, 0x26,0x2d,0xdb,0xdb,0xe1,0x9c,0xa4,0xb8,0x91,0x9a,0xb1,0xa2,0xaa,0xc1,0xad,0xb5, 0xc9,0xb2,0xb9,0xcb,0xb4,0xbb,0xce,0xb3,0xba,0xcc,0xb5,0xbc,0xcf,0xac,0xb4,0xc8, 0x77,0x83,0xa4,0x74,0x80,0xa2,0x71,0x7c,0x9f,0x6d,0x79,0x9c,0x69,0x74,0x99,0x65, 0x72,0x98,0x62,0x6c,0x93,0x4a,0x54,0x74,0x3f,0x4a,0x67,0x3c,0x45,0x62,0x37,0x40, 0x5c,0x3c,0x45,0x66,0x4b,0x54,0x7e,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,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,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,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,0x29,0x29,0x29,0x84,0x84,0x84,0xdd,0xdd,0xdd,0xf1, 0xf1,0xf1,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf9,0xf9, 0xf9,0xf8,0xf8,0xf8,0xf6,0xf6,0xf6,0xf4,0xf4,0xf4,0xec,0xec,0xec,0xfd,0xfd,0xfd, 0xff,0xff,0xff,0x29,0x29,0x29,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,0x99,0x99, 0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77,0x77,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,0x23,0x1b, 0x22,0x40,0x32,0x3e,0x5a,0x5a,0x72,0x52,0x5c,0x85,0x64,0x53,0x74,0x5c,0x44,0x5e, 0x5f,0x47,0x64,0x62,0x53,0x77,0x54,0x50,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x53,0x7d, 0x52,0x53,0x7d,0x52,0x54,0x7e,0x52,0x55,0x80,0x52,0x55,0x81,0x52,0x55,0x81,0x52, 0x57,0x82,0x52,0x5a,0x84,0x52,0x5a,0x84,0x52,0x5b,0x85,0x52,0x5c,0x86,0x52,0x5d, 0x88,0x52,0x5d,0x88,0x53,0x5e,0x89,0x53,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5f,0x89, 0x54,0x5f,0x89,0x55,0x60,0x8a,0x56,0x62,0x8b,0x55,0x62,0x8b,0x56,0x63,0x8b,0x56, 0x63,0x8b,0x57,0x64,0x8c,0x57,0x64,0x8c,0x58,0x65,0x8d,0x5a,0x65,0x8d,0x5b,0x66, 0x8e,0x5c,0x69,0x90,0x5e,0x6b,0x92,0x5e,0x69,0x91,0x62,0x6d,0x94,0x60,0x6c,0x92, 0x47,0x50,0x6e,0x1e,0x1e,0x2a,0xdd,0xdd,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0x46,0x46,0x46,0x04,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x1f,0x4a,0x39,0x46, 0x31,0x24,0x2c,0x2b,0x1f,0x25,0x2d,0x21,0x28,0x2f,0x22,0x29,0x30,0x23,0x2a,0x30, 0x23,0x2a,0x31,0x24,0x2b,0x34,0x27,0x2f,0x32,0x25,0x2d,0x31,0x24,0x2b,0x33,0x27, 0x2d,0xc7,0xc5,0xc8,0xc6,0xcb,0xd9,0x6b,0x77,0x9b,0x49,0x51,0x6b,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,0x04,0x03, 0x03,0x15,0x0f,0x13,0x0f,0x0a,0x0c,0x13,0x0c,0x0e,0x14,0x0d,0x0f,0x19,0x11,0x14, 0x6f,0x6f,0x7d,0x62,0x6e,0x92,0x4b,0x54,0x75,0x52,0x5d,0x81,0x55,0x61,0x85,0x57, 0x61,0x85,0x31,0x33,0x4a,0x33,0x34,0x4b,0x32,0x34,0x4b,0x30,0x31,0x4a,0x27,0x2a, 0x43,0x2a,0x24,0x3b,0x26,0x1f,0x2e,0x38,0x2a,0x33,0x31,0x24,0x2b,0x2c,0x20,0x27, 0x28,0x1d,0x23,0x2a,0x1e,0x25,0x63,0x58,0x5f,0xbe,0xc3,0xd3,0x95,0x9d,0xb2,0x9c, 0xa4,0xba,0xad,0xb4,0xc9,0xb2,0xb9,0xcc,0xb7,0xbe,0xcf,0xb4,0xbb,0xce,0xb8,0xbe, 0xd0,0xb4,0xbb,0xce,0x8c,0x96,0xb3,0x79,0x84,0xa5,0x74,0x80,0xa2,0x6e,0x7b,0x9d, 0x67,0x73,0x99,0x66,0x73,0x98,0x5a,0x65,0x88,0x48,0x52,0x71,0x41,0x4b,0x69,0x3c, 0x44,0x62,0x37,0x41,0x5f,0x52,0x61,0x8d,0x0f,0x11,0x18,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,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,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,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,0x02,0x02,0x02,0x1e, 0x1e,0x1e,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x84, 0x84,0xfd,0xfd,0xfd,0xff,0xff,0xff,0x0c,0x0c,0x0c,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,0x99,0x99,0x99,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0x77, 0x77,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,0x10,0x0c,0x0f,0x39,0x2b,0x35,0x4e,0x45,0x54,0x60,0x6a, 0x8b,0x5a,0x52,0x79,0x60,0x48,0x64,0x5e,0x46,0x62,0x64,0x53,0x75,0x55,0x50,0x79, 0x53,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52, 0x7c,0x52,0x52,0x7c,0x52,0x52,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x54,0x7e, 0x52,0x55,0x81,0x52,0x57,0x82,0x52,0x57,0x83,0x52,0x5b,0x85,0x52,0x5b,0x85,0x52, 0x5c,0x86,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53,0x5f, 0x89,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54,0x60,0x8a,0x55,0x60,0x8a,0x56,0x62,0x8b, 0x56,0x62,0x8b,0x56,0x63,0x8b,0x57,0x63,0x8c,0x58,0x64,0x8d,0x5a,0x65,0x8e,0x5a, 0x65,0x8d,0x5b,0x66,0x8e,0x5b,0x67,0x90,0x5d,0x69,0x91,0x5e,0x6b,0x92,0x60,0x6d, 0x93,0x63,0x6d,0x94,0x53,0x5e,0x7c,0x28,0x2c,0x3a,0xde,0xde,0xde,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x5c,0x5d,0x61,0x10,0x11,0x13,0x06,0x06,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x12, 0x17,0x44,0x35,0x40,0x29,0x1d,0x23,0x1e,0x15,0x19,0x1d,0x14,0x18,0x20,0x16,0x1a, 0x20,0x16,0x1a,0x20,0x17,0x1b,0x21,0x17,0x1b,0x23,0x19,0x1e,0x25,0x1a,0x1f,0x27, 0x1c,0x21,0x27,0x1b,0x21,0x27,0x1c,0x21,0x83,0x81,0x87,0x8c,0x96,0xb2,0x60,0x6c, 0x93,0x1c,0x1f,0x25,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,0x07, 0x05,0x06,0x16,0x0f,0x14,0x12,0x0c,0x0e,0x12,0x0c,0x0d,0x12,0x0b,0x0d,0x1b,0x15, 0x16,0x80,0x83,0x92,0x60,0x6b,0x90,0x4a,0x54,0x76,0x50,0x5b,0x80,0x56,0x61,0x86, 0x5b,0x67,0x8e,0x65,0x71,0x96,0x67,0x73,0x95,0x37,0x39,0x50,0x37,0x39,0x4f,0x34, 0x36,0x4d,0x2d,0x30,0x47,0x26,0x25,0x3f,0x29,0x21,0x34,0x37,0x29,0x32,0x33,0x26, 0x2e,0x2e,0x22,0x29,0x2a,0x1e,0x25,0x2a,0x1e,0x24,0x2b,0x1f,0x26,0xa9,0xa7,0xb1, 0xad,0xb4,0xc8,0x99,0xa0,0xb3,0xac,0xb3,0xc7,0xb3,0xba,0xcc,0xb5,0xbb,0xce,0xba, 0xc0,0xd1,0xb9,0xbf,0xd0,0xb8,0xbe,0xd0,0xab,0xb3,0xc8,0x7b,0x85,0xa7,0x75,0x81, 0xa2,0x6e,0x7a,0x9d,0x6b,0x76,0x9b,0x66,0x73,0x98,0x53,0x5c,0x7c,0x48,0x52,0x71, 0x40,0x4b,0x6a,0x3b,0x44,0x60,0x40,0x4c,0x6e,0x4d,0x59,0x81,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,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,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,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,0xbb,0xbb,0xbb,0xff,0xff,0xff,0xea,0xea,0xea,0x02,0x02,0x02,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,0x04,0x03,0x03,0x2b, 0x21,0x28,0x3e,0x30,0x3b,0x63,0x63,0x7a,0x52,0x5d,0x86,0x64,0x4e,0x6d,0x5e,0x46, 0x62,0x63,0x4b,0x67,0x5a,0x52,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52, 0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7d,0x52,0x53, 0x7d,0x52,0x53,0x7e,0x52,0x55,0x80,0x52,0x55,0x81,0x52,0x57,0x82,0x52,0x57,0x83, 0x52,0x57,0x83,0x52,0x5b,0x85,0x52,0x5c,0x86,0x52,0x5c,0x86,0x53,0x5e,0x88,0x53, 0x5e,0x88,0x53,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5f,0x89,0x54,0x60,0x8a,0x54,0x60, 0x8a,0x55,0x60,0x8a,0x56,0x62,0x8b,0x56,0x62,0x8b,0x57,0x64,0x8c,0x57,0x64,0x8c, 0x58,0x64,0x8c,0x5b,0x66,0x8e,0x5a,0x66,0x8e,0x5b,0x67,0x90,0x5e,0x6a,0x91,0x5d, 0x6a,0x91,0x62,0x6d,0x93,0x64,0x6f,0x95,0x5f,0x68,0x8a,0x46,0x4c,0x62,0x2d,0x30, 0x3c,0x23,0x25,0x2d,0x21,0x23,0x2b,0x2b,0x2e,0x36,0x54,0x58,0x64,0x92,0x98,0xa8, 0x8a,0x8e,0x9c,0x1a,0x1b,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0b,0x08,0x0a,0x34,0x27,0x2f,0x25,0x1c,0x21,0x16,0x0e,0x10,0x15,0x0e, 0x10,0x17,0x0f,0x12,0x17,0x0f,0x11,0x17,0x0f,0x11,0x17,0x0f,0x12,0x18,0x10,0x12, 0x18,0x10,0x12,0x1c,0x13,0x16,0x1f,0x15,0x19,0x20,0x16,0x1a,0x1c,0x14,0x16,0x97, 0x9a,0xa8,0x64,0x6f,0x95,0x55,0x5d,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0a,0x07,0x09,0x17,0x10,0x15,0x16,0x0f,0x12,0x11,0x0b,0x0c,0x10,0x0a,0x0b,0x26, 0x21,0x22,0x8f,0x94,0xa3,0x60,0x6a,0x90,0x49,0x53,0x74,0x50,0x5b,0x80,0x55,0x5f, 0x84,0x58,0x63,0x8a,0x5e,0x6a,0x92,0x64,0x71,0x96,0x6e,0x7a,0x9d,0x74,0x7e,0x9d, 0x3b,0x3d,0x53,0x38,0x3a,0x51,0x32,0x34,0x4b,0x29,0x2c,0x44,0x26,0x22,0x3b,0x1f, 0x17,0x22,0x37,0x29,0x32,0x2e,0x22,0x29,0x2b,0x1f,0x26,0x2b,0x1f,0x25,0x2b,0x1f, 0x26,0x37,0x2c,0x32,0xc6,0xcb,0xd8,0xa5,0xab,0xbf,0xa0,0xa5,0xb9,0xb2,0xb9,0xcc, 0xb9,0xbf,0xd0,0xbc,0xc2,0xd2,0xbe,0xc3,0xd3,0xb9,0xc0,0xd1,0xb3,0xba,0xcc,0x89, 0x93,0xb1,0x75,0x81,0xa2,0x6e,0x7a,0x9d,0x6a,0x75,0x9a,0x5f,0x6c,0x8e,0x52,0x5b, 0x7a,0x47,0x52,0x6e,0x41,0x4b,0x69,0x40,0x48,0x68,0x5d,0x66,0x97,0x0f,0x12,0x18, 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,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, 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,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,0xe1,0xe1,0xe1,0xff,0xff,0xff,0x8a,0x8a,0x8a,0x02, 0x02,0x02,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,0x17,0x12,0x16,0x3a,0x2c,0x35,0x57,0x4f,0x5c,0x70, 0x77,0x94,0x57,0x50,0x79,0x62,0x4a,0x66,0x5f,0x47,0x63,0x64,0x52,0x72,0x57,0x50, 0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52, 0x52,0x7c,0x52,0x53,0x7d,0x52,0x53,0x7d,0x52,0x54,0x7e,0x52,0x55,0x80,0x52,0x55, 0x81,0x52,0x57,0x82,0x52,0x57,0x83,0x52,0x5a,0x84,0x52,0x5a,0x84,0x52,0x5d,0x86, 0x52,0x5c,0x86,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54, 0x60,0x8a,0x54,0x5f,0x89,0x55,0x62,0x8a,0x55,0x62,0x8b,0x56,0x62,0x8b,0x56,0x62, 0x8b,0x57,0x64,0x8c,0x58,0x65,0x8d,0x58,0x64,0x8d,0x5a,0x65,0x8e,0x5b,0x66,0x8e, 0x5d,0x69,0x91,0x5f,0x6b,0x92,0x60,0x6c,0x93,0x65,0x6f,0x95,0x6a,0x77,0x98,0x6a, 0x74,0x91,0x69,0x6f,0x88,0x6a,0x72,0x87,0x73,0x79,0x8b,0x7d,0x84,0x95,0x8d,0x94, 0xa7,0xa5,0xab,0xbf,0xb5,0xbe,0xce,0xbf,0xc4,0xd3,0x82,0x86,0x90,0x14,0x14,0x16, 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x07,0x2b,0x1f,0x26,0x1b,0x13,0x16,0x13, 0x0c,0x0d,0x12,0x0c,0x0d,0x11,0x0b,0x0c,0x12,0x0b,0x0c,0x13,0x0c,0x0d,0x14,0x0d, 0x0f,0x14,0x0d,0x0f,0x14,0x0d,0x0f,0x17,0x0f,0x11,0x1a,0x11,0x14,0x1d,0x14,0x18, 0x18,0x10,0x12,0x49,0x46,0x49,0x6e,0x7a,0x9d,0x66,0x73,0x98,0x2a,0x2c,0x32,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0f,0x0b,0x0e,0x1b,0x13,0x18,0x1a,0x11,0x14,0x11,0x0a,0x0c,0x0e,0x08,0x09, 0x36,0x32,0x32,0xb9,0xba,0xc6,0x65,0x6f,0x92,0x4b,0x54,0x75,0x51,0x5c,0x81,0x58, 0x64,0x8d,0x59,0x64,0x8c,0x5a,0x66,0x8e,0x5c,0x69,0x90,0x60,0x6d,0x93,0x69,0x74, 0x99,0x73,0x7e,0xa1,0x6f,0x78,0x96,0x3c,0x3d,0x53,0x38,0x3a,0x4f,0x2f,0x31,0x48, 0x26,0x28,0x42,0x25,0x1d,0x2d,0x35,0x28,0x31,0x33,0x26,0x2e,0x2d,0x21,0x28,0x2c, 0x20,0x26,0x2b,0x1f,0x26,0x2e,0x22,0x29,0x75,0x6f,0x76,0xbc,0xc2,0xd2,0x9a,0xa0, 0xb2,0xb2,0xb8,0xca,0xba,0xc1,0xd1,0xbc,0xc3,0xd3,0xc1,0xc7,0xd6,0xbb,0xc1,0xd2, 0xb9,0xbf,0xd0,0xa4,0xac,0xc3,0x77,0x83,0xa4,0x73,0x7e,0xa1,0x6b,0x76,0x9b,0x5a, 0x65,0x85,0x4f,0x5a,0x79,0x48,0x50,0x72,0x40,0x4c,0x69,0x49,0x54,0x77,0x56,0x62, 0x8e,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,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,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,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,0xf3,0xf3,0xf3,0xff,0xff,0xff, 0x41,0x41,0x41,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,0x08,0x06,0x08, 0x31,0x25,0x2d,0x3d,0x30,0x39,0x7e,0x7a,0x86,0x63,0x6d,0x93,0x63,0x53,0x77,0x60, 0x48,0x64,0x5e,0x46,0x62,0x63,0x4c,0x69,0x58,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b, 0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x53,0x7d,0x52, 0x54,0x7e,0x52,0x55,0x80,0x52,0x55,0x81,0x52,0x57,0x82,0x52,0x57,0x82,0x52,0x5b, 0x85,0x52,0x5b,0x85,0x52,0x5b,0x85,0x52,0x5c,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88, 0x53,0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x55,0x62,0x8a,0x56, 0x62,0x8b,0x56,0x62,0x8b,0x56,0x63,0x8b,0x57,0x63,0x8c,0x57,0x64,0x8c,0x5a,0x66, 0x8e,0x5c,0x67,0x8e,0x5c,0x69,0x91,0x5f,0x6c,0x92,0x60,0x6c,0x92,0x69,0x74,0x99, 0x6e,0x7a,0x9f,0x77,0x83,0xa3,0x85,0x8e,0xab,0x92,0x9a,0xb5,0x9d,0xa7,0xbe,0xa8, 0xb1,0xc4,0xb3,0xba,0xcb,0xb7,0xbe,0xcf,0xb7,0xbe,0xcf,0xb9,0xbf,0xd0,0xbe,0xc3, 0xd3,0xc2,0xc8,0xd6,0x62,0x65,0x6b,0x0f,0x10,0x11,0x06,0x04,0x05,0x27,0x1c,0x21, 0x1d,0x14,0x17,0x10,0x0a,0x0b,0x10,0x0a,0x0b,0x10,0x0a,0x0b,0x10,0x0a,0x0b,0x10, 0x0a,0x0b,0x12,0x0b,0x0d,0x11,0x0a,0x0c,0x15,0x0d,0x0f,0x16,0x0e,0x10,0x1a,0x11, 0x14,0x1d,0x13,0x17,0x19,0x11,0x14,0x22,0x1b,0x1e,0x81,0x8c,0xab,0x5b,0x67,0x90, 0x62,0x6b,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x17,0x1d,0x29,0x1e,0x25,0x1b,0x12,0x15,0x14,0x0d,0x0e,0x11,0x0b, 0x0c,0x4a,0x46,0x47,0xe9,0xe9,0xeb,0x7b,0x85,0xa2,0x4c,0x56,0x77,0x53,0x5d,0x84, 0x58,0x65,0x8d,0x58,0x65,0x8d,0x58,0x64,0x8d,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x5e, 0x6a,0x91,0x64,0x71,0x96,0x6d,0x79,0x9c,0x79,0x84,0xa4,0x77,0x80,0x9d,0x3d,0x3d, 0x54,0x37,0x39,0x4f,0x2d,0x2f,0x47,0x25,0x21,0x38,0x1f,0x16,0x1e,0x36,0x28,0x31, 0x30,0x23,0x2a,0x2c,0x20,0x27,0x2c,0x20,0x26,0x2d,0x21,0x28,0x30,0x23,0x2b,0xcb, 0xcd,0xd6,0xab,0xb2,0xc3,0xa5,0xab,0xbc,0xb9,0xc0,0xd1,0xbe,0xc3,0xd3,0xbc,0xc2, 0xd2,0xbb,0xc1,0xd2,0xb7,0xbe,0xcf,0xb4,0xbb,0xce,0x84,0x8e,0xac,0x74,0x80,0xa2, 0x66,0x71,0x93,0x5a,0x64,0x85,0x50,0x5b,0x7b,0x4b,0x56,0x75,0x46,0x51,0x70,0x63, 0x72,0xa3,0x11,0x13,0x18,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,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,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,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,0x2e,0x2e,0x2e,0xfc,0xfc, 0xfc,0xff,0xff,0xff,0x15,0x15,0x15,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,0x21,0x19,0x1f,0x3a,0x2b,0x35,0x50,0x44,0x4d, 0x8d,0x8f,0xa0,0x52,0x5d,0x88,0x64,0x53,0x73,0x5c,0x44,0x5e,0x58,0x40,0x5a,0x64, 0x52,0x71,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c, 0x52,0x53,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x54,0x7e,0x52,0x55,0x81,0x52, 0x57,0x82,0x52,0x57,0x83,0x52,0x57,0x83,0x52,0x5d,0x86,0x52,0x5d,0x86,0x52,0x5d, 0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5e,0x89,0x54,0x5f,0x89,0x55,0x62,0x8a, 0x55,0x62,0x8a,0x56,0x62,0x8b,0x56,0x62,0x8b,0x57,0x63,0x8c,0x58,0x64,0x8c,0x58, 0x64,0x8c,0x5a,0x65,0x8d,0x5c,0x67,0x8e,0x5c,0x69,0x90,0x5e,0x6a,0x90,0x63,0x6c, 0x92,0x6a,0x75,0x9b,0x71,0x7c,0x9f,0x7c,0x86,0xa4,0x89,0x92,0xaf,0x96,0x9f,0xb7, 0xa2,0xa9,0xc0,0xac,0xb3,0xc8,0xb5,0xbb,0xcc,0xbb,0xc1,0xd1,0xbf,0xc6,0xd5,0xc0, 0xc6,0xd5,0xbc,0xc3,0xd3,0xbb,0xc2,0xd1,0xbf,0xc4,0xd3,0xbf,0xc4,0xd5,0x2f,0x31, 0x36,0x3a,0x2c,0x36,0x28,0x1d,0x22,0x16,0x0e,0x10,0x12,0x0b,0x0d,0x11,0x0a,0x0c, 0x10,0x0a,0x0b,0x11,0x0a,0x0c,0x11,0x0b,0x0c,0x12,0x0c,0x0d,0x15,0x0e,0x10,0x1a, 0x12,0x15,0x1c,0x13,0x16,0x1e,0x15,0x19,0x1b,0x13,0x16,0x1d,0x17,0x1b,0x7e,0x8a, 0xa9,0x56,0x63,0x8b,0x5c,0x69,0x90,0x33,0x35,0x3b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x37,0x2b,0x35,0x35,0x27,0x30,0x1f,0x15,0x19,0x19,0x11,0x13,0x19, 0x11,0x13,0x43,0x3c,0x3e,0xf9,0xf8,0xf8,0xce,0xd2,0xda,0x58,0x62,0x83,0x55,0x60, 0x88,0x58,0x64,0x8c,0x57,0x64,0x8c,0x58,0x65,0x8d,0x5b,0x66,0x8e,0x5a,0x65,0x8d, 0x5a,0x65,0x8d,0x5c,0x67,0x90,0x60,0x6d,0x93,0x65,0x72,0x96,0x72,0x7d,0xa0,0x7d, 0x89,0xa9,0x67,0x6e,0x88,0x3b,0x3c,0x52,0x36,0x37,0x4e,0x27,0x2a,0x43,0x1f,0x18, 0x24,0x39,0x2b,0x34,0x32,0x24,0x2c,0x2d,0x21,0x27,0x2d,0x21,0x28,0x2e,0x21,0x28, 0x32,0x25,0x2c,0x5c,0x51,0x58,0xd7,0xda,0xe3,0xa1,0xa7,0xb8,0xb4,0xbb,0xcc,0xbe, 0xc3,0xd3,0xbf,0xc4,0xd5,0xbc,0xc2,0xd2,0xbc,0xc2,0xd3,0xb4,0xbb,0xce,0xa0,0xa8, 0xc0,0x74,0x80,0xa1,0x64,0x6e,0x91,0x5b,0x65,0x86,0x54,0x5e,0x7e,0x4d,0x57,0x79, 0x52,0x5f,0x83,0x59,0x64,0x8a,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,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,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,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,0x76, 0x76,0x76,0xfd,0xfd,0xfd,0xf2,0xf2,0xf2,0x03,0x03,0x03,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,0x0d,0x0a, 0x0d,0x35,0x29,0x32,0x36,0x28,0x30,0x6e,0x65,0x6f,0x61,0x6b,0x8d,0x52,0x4f,0x7a, 0x64,0x4e,0x6c,0x5f,0x48,0x64,0x60,0x4a,0x65,0x5d,0x52,0x79,0x55,0x50,0x79,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50, 0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x54,0x7e, 0x52,0x55,0x80,0x52,0x55,0x81,0x52,0x57,0x82,0x52,0x57,0x82,0x52,0x5c,0x86,0x52, 0x5c,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5e,0x89,0x53,0x5f, 0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x56,0x62,0x8b,0x56,0x62,0x8b, 0x56,0x63,0x8b,0x58,0x64,0x8c,0x57,0x64,0x8c,0x5b,0x66,0x8d,0x5b,0x67,0x90,0x5f, 0x6b,0x91,0x65,0x71,0x96,0x6b,0x75,0x9a,0x74,0x80,0xa0,0x7e,0x89,0xa8,0x8b,0x95, 0xb2,0x98,0xa1,0xb9,0xa3,0xac,0xc2,0xaf,0xb5,0xc9,0xb7,0xbe,0xcf,0xbc,0xc2,0xd2, 0xc0,0xc6,0xd5,0xc2,0xc8,0xd6,0xc2,0xc8,0xd7,0xc0,0xc6,0xd3,0xb8,0xbf,0xcf,0xb3, 0xba,0xcc,0xb0,0xb7,0xca,0x9f,0xa4,0xb7,0x53,0x49,0x56,0x2b,0x20,0x27,0x1f,0x15, 0x1a,0x1d,0x14,0x17,0x1c,0x13,0x16,0x1a,0x11,0x14,0x19,0x11,0x14,0x1a,0x12,0x15, 0x1a,0x12,0x15,0x1b,0x12,0x15,0x1f,0x15,0x19,0x20,0x16,0x1a,0x1f,0x15,0x19,0x2c, 0x26,0x2f,0x7b,0x86,0xa7,0x52,0x5d,0x88,0x52,0x4f,0x7a,0x65,0x6e,0x88,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x3a,0x48,0x2e,0x22,0x29,0x26,0x1b,0x20, 0x26,0x1b,0x20,0x25,0x1a,0x1f,0x2c,0x22,0x27,0xee,0xed,0xed,0xb5,0xb9,0xc9,0x63, 0x6e,0x95,0x57,0x64,0x8c,0x57,0x64,0x8c,0x58,0x64,0x8d,0x5a,0x65,0x8d,0x5a,0x66, 0x8e,0x5b,0x66,0x8e,0x5b,0x67,0x8e,0x5b,0x66,0x8e,0x5d,0x69,0x91,0x62,0x6e,0x94, 0x69,0x74,0x99,0x76,0x82,0xa3,0x80,0x8a,0xaa,0x4d,0x51,0x69,0x39,0x3a,0x51,0x2f, 0x31,0x48,0x23,0x1e,0x31,0x37,0x2a,0x33,0x36,0x28,0x31,0x2f,0x22,0x29,0x2d,0x21, 0x28,0x2e,0x22,0x29,0x31,0x24,0x2c,0x34,0x26,0x2e,0xd7,0xd6,0xd9,0xbc,0xc1,0xcf, 0xa3,0xaa,0xbe,0xba,0xc0,0xd1,0xb8,0xbe,0xd0,0xbe,0xc3,0xd3,0xb8,0xbe,0xd0,0xb5, 0xbc,0xcf,0xb0,0xb8,0xcb,0x77,0x82,0xa1,0x66,0x72,0x93,0x5c,0x67,0x89,0x55,0x5f, 0x81,0x50,0x59,0x7c,0x6d,0x7c,0xac,0x0e,0x10,0x12,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,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,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,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,0xa5,0xa5,0xa5,0xff,0xff,0xff,0xb0,0xb0,0xb0,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,0x00,0x03,0x02,0x03,0x27,0x1e,0x25,0x36,0x28,0x31,0x3e,0x31, 0x3a,0x66,0x66,0x7a,0x54,0x5e,0x88,0x60,0x53,0x77,0x64,0x4c,0x6a,0x60,0x48,0x64, 0x64,0x4d,0x6a,0x60,0x53,0x77,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52, 0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52, 0x7d,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52,0x54,0x7e,0x52,0x55,0x80,0x52,0x55,0x81, 0x52,0x5c,0x86,0x52,0x5c,0x86,0x52,0x5c,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53, 0x5e,0x88,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x56,0x62,0x8b,0x56,0x62, 0x8b,0x56,0x63,0x8b,0x57,0x63,0x8c,0x58,0x64,0x8d,0x57,0x64,0x8c,0x5b,0x66,0x8d, 0x5b,0x66,0x8e,0x5e,0x6a,0x91,0x65,0x6f,0x95,0x6a,0x76,0x9a,0x73,0x7e,0xa1,0x81, 0x8b,0xaa,0x8d,0x96,0xb1,0x9c,0xa4,0xbc,0xa5,0xad,0xc3,0xb1,0xb8,0xca,0xb9,0xbf, 0xcf,0xbc,0xc2,0xd2,0xbf,0xc4,0xd5,0xc2,0xc7,0xd7,0xc2,0xc8,0xd7,0xc1,0xc7,0xd6, 0xc0,0xc6,0xd5,0xba,0xc0,0xd0,0xac,0xb4,0xc8,0xa1,0xa9,0xc0,0x9a,0xa2,0xbb,0x92, 0x9b,0xb7,0x6d,0x71,0x87,0x37,0x2f,0x39,0x29,0x1e,0x24,0x26,0x1b,0x20,0x23,0x19, 0x1d,0x22,0x18,0x1d,0x24,0x19,0x1e,0x25,0x1a,0x1f,0x27,0x1c,0x21,0x2a,0x1e,0x24, 0x29,0x1d,0x23,0x6b,0x72,0x8e,0x64,0x6f,0x95,0x52,0x50,0x7b,0x52,0x50,0x7b,0x55, 0x60,0x8a,0x3b,0x3d,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x4b,0x5d,0x36,0x28, 0x31,0x2a,0x1e,0x24,0x2b,0x1f,0x25,0x2a,0x1f,0x25,0x2b,0x1f,0x25,0xa9,0xa4,0xa6, 0xab,0xb3,0xc8,0x64,0x71,0x96,0x57,0x64,0x8c,0x57,0x64,0x8c,0x58,0x64,0x8c,0x58, 0x64,0x8c,0x5a,0x66,0x8e,0x5c,0x67,0x90,0x5b,0x66,0x8e,0x5c,0x67,0x90,0x5b,0x66, 0x8e,0x5e,0x6a,0x91,0x63,0x6e,0x95,0x6b,0x76,0x9b,0x74,0x80,0xa2,0x7e,0x8a,0xa9, 0x43,0x44,0x5b,0x36,0x37,0x4f,0x28,0x2a,0x42,0x23,0x1a,0x22,0x3a,0x2b,0x35,0x33, 0x26,0x2e,0x2f,0x22,0x29,0x2f,0x23,0x2a,0x30,0x23,0x2a,0x34,0x27,0x2f,0x45,0x37, 0x40,0xe0,0xe2,0xe9,0xa5,0xab,0xbc,0xb3,0xba,0xcc,0xb9,0xbf,0xd0,0xb9,0xbf,0xd1, 0xb8,0xbf,0xd0,0xb8,0xbf,0xd0,0xb1,0xb8,0xca,0x92,0x9b,0xb3,0x6a,0x75,0x95,0x63, 0x6d,0x8d,0x5b,0x65,0x86,0x5f,0x6a,0x90,0x49,0x54,0x69,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,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,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,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,0xcc,0xcc,0xcc,0xfd,0xfd,0xfd,0x60,0x60,0x60, 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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15, 0x10,0x13,0x35,0x27,0x30,0x34,0x27,0x2f,0x4d,0x43,0x4d,0x60,0x66,0x85,0x52,0x50, 0x7c,0x64,0x52,0x72,0x62,0x4a,0x66,0x62,0x4a,0x66,0x64,0x52,0x72,0x58,0x50,0x79, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52, 0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x54,0x7e,0x52,0x54, 0x7e,0x52,0x55,0x80,0x52,0x58,0x84,0x52,0x5b,0x85,0x52,0x5b,0x85,0x52,0x5c,0x86, 0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53,0x5f,0x89,0x55, 0x60,0x8a,0x55,0x60,0x8a,0x55,0x62,0x8b,0x56,0x63,0x8b,0x56,0x63,0x8b,0x57,0x64, 0x8c,0x5a,0x66,0x8e,0x5b,0x67,0x8e,0x60,0x6c,0x91,0x64,0x6e,0x94,0x6c,0x75,0x9b, 0x75,0x80,0xa2,0x82,0x8c,0xab,0x90,0x98,0xb3,0x9c,0xa5,0xbc,0xa9,0xb0,0xc4,0xb2, 0xb9,0xca,0xb8,0xbe,0xcf,0xbe,0xc3,0xd2,0xc0,0xc6,0xd5,0xc1,0xc7,0xd6,0xc2,0xc8, 0xd7,0xc1,0xc7,0xd6,0xbf,0xc4,0xd5,0xba,0xc0,0xd0,0xb3,0xb9,0xcb,0xa5,0xad,0xc2, 0x95,0x9d,0xb7,0x8b,0x94,0xb0,0x88,0x90,0xaf,0x84,0x90,0xac,0x7c,0x88,0xa8,0x63, 0x69,0x85,0x43,0x3e,0x4e,0x35,0x2c,0x37,0x31,0x26,0x2e,0x2d,0x22,0x2a,0x2a,0x1f, 0x26,0x2d,0x23,0x2b,0x7d,0x84,0x9e,0x75,0x81,0xa2,0x53,0x5e,0x88,0x52,0x4f,0x7b, 0x55,0x60,0x8a,0x52,0x4f,0x7b,0x6b,0x73,0x8e,0x03,0x03,0x03,0x00,0x00,0x00,0x67, 0x53,0x68,0x3d,0x2e,0x38,0x2c,0x20,0x26,0x2d,0x21,0x27,0x33,0x26,0x2e,0x3b,0x2c, 0x36,0x71,0x64,0x6e,0xaf,0xb5,0xca,0x6a,0x75,0x9a,0x5a,0x65,0x8e,0x57,0x64,0x8c, 0x58,0x64,0x8c,0x58,0x64,0x8c,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x5a,0x66,0x8e,0x5b, 0x66,0x8e,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x5d,0x6a,0x91,0x63,0x6f,0x95,0x69,0x75, 0x9a,0x79,0x83,0xa4,0x75,0x80,0x9d,0x39,0x3a,0x51,0x30,0x32,0x4a,0x22,0x1c,0x2a, 0x3c,0x2d,0x37,0x36,0x28,0x30,0x30,0x23,0x2a,0x2f,0x22,0x29,0x32,0x24,0x2c,0x35, 0x27,0x30,0x39,0x2b,0x34,0xbc,0xb7,0xbc,0xbb,0xc1,0xcf,0xab,0xb2,0xc6,0xb7,0xbe, 0xcf,0xba,0xc1,0xd2,0xb9,0xc0,0xd1,0xb7,0xbe,0xcf,0xad,0xb4,0xc8,0xa7,0xad,0xc2, 0x6f,0x7b,0x9a,0x65,0x6f,0x91,0x5e,0x69,0x8b,0x66,0x73,0x9c,0x02,0x03,0x03,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,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,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,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,0xe4,0xe4,0xe4,0xff,0xff, 0xff,0x27,0x27,0x27,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,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x03,0x26,0x1d,0x23,0x33,0x26,0x2e,0x34, 0x26,0x2e,0x59,0x55,0x66,0x56,0x60,0x88,0x52,0x4f,0x7a,0x64,0x53,0x74,0x62,0x4a, 0x66,0x60,0x48,0x65,0x64,0x53,0x75,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7b, 0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52, 0x53,0x7d,0x52,0x53,0x7d,0x52,0x54,0x7e,0x52,0x55,0x80,0x52,0x57,0x83,0x52,0x58, 0x84,0x52,0x5c,0x86,0x52,0x5c,0x86,0x52,0x5d,0x88,0x52,0x5d,0x88,0x53,0x5f,0x89, 0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x60,0x8a,0x56,0x62,0x8b,0x55,0x62,0x8b,0x56, 0x63,0x8b,0x57,0x64,0x8c,0x5a,0x65,0x8e,0x5c,0x69,0x90,0x60,0x6c,0x91,0x66,0x71, 0x96,0x6c,0x76,0x9a,0x75,0x82,0xa2,0x84,0x8e,0xab,0x90,0x9a,0xb4,0xa0,0xa7,0xbe, 0xaa,0xb1,0xc6,0xb3,0xb9,0xcb,0xb9,0xbf,0xcf,0xbc,0xc2,0xd2,0xc0,0xc6,0xd3,0xc2, 0xc8,0xd7,0xc2,0xc8,0xd7,0xc2,0xc8,0xd7,0xbe,0xc3,0xd3,0xb9,0xc0,0xd0,0xb0,0xb7, 0xca,0xa8,0xad,0xc3,0x9c,0xa4,0xbb,0x8b,0x94,0xb0,0x79,0x84,0xa3,0x6d,0x71,0x95, 0x62,0x6c,0x92,0x65,0x6e,0x95,0x67,0x73,0x98,0x62,0x6e,0x94,0x77,0x82,0xa3,0x7c, 0x86,0xa7,0x79,0x84,0xa5,0x89,0x93,0xb0,0x75,0x81,0xa2,0x52,0x52,0x7d,0x53,0x4f, 0x7a,0x54,0x60,0x8a,0x5b,0x67,0x8e,0x52,0x52,0x7d,0x5b,0x66,0x8e,0x43,0x46,0x4d, 0x00,0x00,0x00,0x60,0x54,0x6d,0x53,0x41,0x51,0x34,0x27,0x2f,0x38,0x2a,0x33,0x46, 0x36,0x42,0x5c,0x49,0x5a,0x5e,0x4b,0x5d,0xa8,0xaa,0xb9,0x73,0x7e,0xa1,0x5c,0x67, 0x90,0x57,0x64,0x8c,0x58,0x64,0x8d,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x5a,0x65,0x8d, 0x5a,0x66,0x8e,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x5b,0x66,0x8e,0x5b,0x67,0x90,0x5e, 0x6b,0x92,0x65,0x72,0x98,0x71,0x7c,0x9f,0x7a,0x85,0xa7,0x5d,0x62,0x7c,0x36,0x37, 0x4e,0x27,0x26,0x3a,0x3c,0x2d,0x37,0x38,0x29,0x32,0x34,0x27,0x2f,0x31,0x24,0x2b, 0x33,0x26,0x2e,0x37,0x29,0x32,0x39,0x2b,0x34,0x3f,0x2f,0x3a,0xdd,0xdf,0xe6,0xb0, 0xb5,0xc6,0xb2,0xb9,0xcc,0xb5,0xbb,0xce,0xbb,0xc1,0xd2,0xb7,0xbc,0xcf,0xb2,0xb9, 0xcb,0xa8,0xaf,0xc3,0x89,0x92,0xad,0x67,0x73,0x94,0x61,0x6d,0x90,0x2d,0x32,0x43, 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,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, 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,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,0xf4, 0xf4,0xf4,0xff,0xff,0xff,0x0a,0x0a,0x0a,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, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x12,0x0e,0x11,0x2e,0x22,0x2a,0x32,0x25,0x2d,0x3e,0x32,0x3c,0x5d,0x60,0x78,0x53, 0x5e,0x88,0x58,0x50,0x79,0x64,0x4c,0x6a,0x5e,0x46,0x62,0x62,0x4a,0x66,0x64,0x53, 0x76,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b, 0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x52,0x7d,0x52,0x53,0x7d,0x52,0x53,0x7e,0x52, 0x56,0x82,0x52,0x57,0x82,0x52,0x5a,0x84,0x52,0x5a,0x84,0x52,0x5c,0x86,0x52,0x5d, 0x86,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a, 0x55,0x62,0x8b,0x56,0x62,0x8b,0x57,0x64,0x8c,0x58,0x65,0x8d,0x5b,0x67,0x8e,0x5f, 0x6b,0x90,0x64,0x6f,0x96,0x6d,0x79,0x9b,0x77,0x82,0xa3,0x85,0x8d,0xab,0x92,0x9b, 0xb5,0x9f,0xa7,0xbe,0xaa,0xb1,0xc7,0xb3,0xb9,0xcb,0xb9,0xbf,0xd0,0xbc,0xc2,0xd2, 0xbf,0xc4,0xd3,0xc1,0xc7,0xd5,0xc2,0xc8,0xd7,0xc0,0xc6,0xd6,0xbc,0xc2,0xd1,0xb5, 0xbe,0xce,0xaf,0xb5,0xc8,0xa5,0xad,0xc3,0x9b,0xa3,0xbb,0x90,0x99,0xb3,0x83,0x8e, 0xab,0x77,0x82,0xa3,0x63,0x6d,0x94,0x5d,0x5e,0x84,0x56,0x57,0x82,0x54,0x54,0x7e, 0x53,0x52,0x7d,0x52,0x57,0x82,0x52,0x4f,0x7a,0x55,0x50,0x79,0x5e,0x52,0x79,0x52, 0x4f,0x7a,0x55,0x60,0x8a,0x5a,0x65,0x8e,0x5c,0x67,0x90,0x54,0x60,0x8a,0x52,0x50, 0x7b,0x6b,0x74,0x8e,0x03,0x03,0x03,0x2b,0x2e,0x35,0x75,0x68,0x88,0x4b,0x3a,0x47, 0x51,0x3f,0x4e,0x60,0x4c,0x5f,0x68,0x54,0x69,0x5f,0x4c,0x5e,0x87,0x80,0x8b,0x7e, 0x8a,0xa9,0x5f,0x6b,0x92,0x57,0x64,0x8c,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x58,0x65, 0x8d,0x5a,0x65,0x8d,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x5a,0x65,0x8d,0x5b,0x67,0x90, 0x5a,0x66,0x8e,0x5c,0x69,0x90,0x5f,0x6b,0x92,0x65,0x72,0x98,0x72,0x7d,0xa0,0x7c, 0x88,0xa8,0x3d,0x3f,0x55,0x31,0x32,0x4a,0x2b,0x21,0x2c,0x3c,0x2d,0x37,0x38,0x2a, 0x33,0x35,0x27,0x2f,0x34,0x27,0x2f,0x37,0x29,0x32,0x3c,0x2d,0x37,0x3e,0x2f,0x3a, 0xa2,0x9a,0xa1,0xc1,0xc6,0xd2,0xac,0xb2,0xc6,0xb5,0xbc,0xcf,0xb9,0xbf,0xd0,0xb8, 0xbe,0xd0,0xb2,0xb9,0xcb,0xa9,0xb0,0xc4,0x9f,0xa7,0xbb,0x6d,0x78,0x99,0x4a,0x53, 0x6d,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,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,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,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, 0x0b,0x0b,0x0b,0xfa,0xfa,0xfa,0xcf,0xcf,0xcf,0x02,0x02,0x02,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x03,0x22,0x19,0x1f,0x31,0x25,0x2c, 0x31,0x24,0x2c,0x51,0x48,0x52,0x5c,0x63,0x82,0x52,0x5a,0x84,0x5f,0x53,0x79,0x64, 0x4e,0x6c,0x5f,0x48,0x64,0x64,0x4c,0x69,0x5c,0x52,0x79,0x52,0x4f,0x7a,0x52,0x50, 0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7d,0x52,0x53,0x7d, 0x52,0x53,0x7e,0x52,0x55,0x80,0x52,0x57,0x82,0x52,0x57,0x83,0x52,0x5a,0x84,0x52, 0x5c,0x85,0x52,0x5d,0x86,0x52,0x5d,0x86,0x53,0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f, 0x89,0x54,0x5f,0x89,0x55,0x60,0x8a,0x56,0x62,0x8b,0x56,0x62,0x8b,0x58,0x65,0x8d, 0x5b,0x66,0x8e,0x5e,0x6a,0x90,0x64,0x6f,0x95,0x6d,0x79,0x9b,0x77,0x81,0xa3,0x85, 0x8e,0xab,0x92,0x9a,0xb5,0xa0,0xa8,0xbf,0xaa,0xb2,0xc7,0xb2,0xba,0xcc,0xb8,0xbf, 0xd0,0xba,0xc1,0xd1,0xbf,0xc4,0xd3,0xc1,0xc7,0xd5,0xc2,0xc8,0xd6,0xc0,0xc6,0xd5, 0xbb,0xc1,0xd1,0xb4,0xba,0xcc,0xac,0xb3,0xc7,0xa3,0xa9,0xc0,0x99,0xa1,0xba,0x8e, 0x95,0xb2,0x82,0x8c,0xac,0x7a,0x83,0xa4,0x71,0x7c,0x9f,0x6a,0x74,0x99,0x67,0x74, 0x99,0x63,0x6e,0x95,0x5e,0x6a,0x92,0x5b,0x67,0x8e,0x56,0x62,0x8b,0x5a,0x66,0x8e, 0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x5b,0x66,0x8e,0x5a,0x65,0x8d,0x5a,0x65,0x8e,0x5a, 0x65,0x8d,0x55,0x50,0x79,0x55,0x60,0x8a,0x3b,0x3d,0x43,0x00,0x00,0x00,0xa9,0xae, 0xbd,0x6a,0x56,0x6b,0x56,0x44,0x54,0x66,0x51,0x66,0x65,0x51,0x65,0x60,0x4c,0x5f, 0x55,0x47,0x53,0x93,0x9c,0xb6,0x64,0x71,0x96,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x57, 0x63,0x8c,0x58,0x65,0x8d,0x5a,0x65,0x8e,0x5a,0x66,0x8e,0x5b,0x66,0x8e,0x58,0x64, 0x8d,0x5a,0x65,0x8d,0x5a,0x65,0x8e,0x5b,0x67,0x90,0x5d,0x6a,0x91,0x60,0x6c,0x93, 0x67,0x73,0x99,0x72,0x7d,0xa1,0x6f,0x77,0x97,0x3a,0x3b,0x52,0x26,0x22,0x31,0x41, 0x31,0x3d,0x3c,0x2e,0x38,0x38,0x2a,0x33,0x36,0x28,0x31,0x39,0x2b,0x34,0x3c,0x2d, 0x37,0x41,0x31,0x3c,0x45,0x35,0x41,0xd7,0xd9,0xe0,0xaf,0xb5,0xc4,0xb5,0xbb,0xce, 0xb7,0xbe,0xd0,0xba,0xc0,0xd1,0xb3,0xba,0xcc,0xac,0xb3,0xc7,0xa3,0xab,0xc1,0x74, 0x7d,0x97,0x10,0x12,0x18,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,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,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,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,0x4a,0x4a,0x4a,0xfc,0xfc,0xfc,0x8d,0x8d,0x8d,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,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,0x0e,0x0b,0x0e,0x2b,0x20,0x27,0x31,0x24,0x2b,0x31,0x24,0x2c,0x4d,0x48,0x57, 0x57,0x60,0x83,0x52,0x55,0x81,0x5d,0x52,0x79,0x64,0x4d,0x6b,0x5e,0x46,0x62,0x64, 0x4c,0x6a,0x53,0x50,0x79,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52, 0x7c,0x52,0x52,0x7d,0x52,0x53,0x7d,0x52,0x54,0x80,0x52,0x55,0x81,0x52,0x57,0x82, 0x52,0x57,0x82,0x52,0x57,0x83,0x52,0x5b,0x85,0x52,0x5c,0x86,0x52,0x5d,0x88,0x53, 0x5d,0x88,0x53,0x5e,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x62,0x8a,0x57,0x63, 0x8b,0x57,0x64,0x8c,0x5a,0x65,0x8e,0x5f,0x6b,0x91,0x65,0x6f,0x95,0x6d,0x76,0x9c, 0x77,0x83,0xa3,0x84,0x8e,0xac,0x93,0x9c,0xb5,0x9f,0xa8,0xbf,0xa9,0xb0,0xc6,0xb2, 0xb8,0xcc,0xb8,0xbf,0xd0,0xbc,0xc1,0xd2,0xbe,0xc3,0xd3,0xc0,0xc6,0xd5,0xc2,0xc8, 0xd6,0xbe,0xc3,0xd3,0xb8,0xbf,0xcf,0xb1,0xb8,0xcb,0xab,0xb2,0xc6,0x9f,0xa8,0xbe, 0x96,0xa0,0xb8,0x89,0x93,0xaf,0x81,0x8c,0xaa,0x76,0x83,0xa4,0x6f,0x7b,0x9f,0x6c, 0x77,0x9b,0x67,0x73,0x99,0x64,0x6f,0x96,0x63,0x6e,0x94,0x62,0x6d,0x94,0x5f,0x6b, 0x92,0x5e,0x6a,0x91,0x5c,0x69,0x90,0x5b,0x66,0x8e,0x58,0x64,0x8c,0x58,0x64,0x8c, 0x58,0x64,0x8c,0x5e,0x6a,0x92,0x52,0x5b,0x85,0x54,0x50,0x79,0x65,0x6e,0x86,0x00, 0x00,0x00,0x5c,0x5c,0x5c,0x76,0x68,0x88,0x51,0x3f,0x4e,0x64,0x50,0x63,0x63,0x4f, 0x63,0x5f,0x4c,0x5e,0x4d,0x3c,0x4a,0x8c,0x8c,0x9c,0x72,0x7d,0xa0,0x5a,0x65,0x8d, 0x56,0x62,0x8b,0x58,0x65,0x8d,0x57,0x64,0x8c,0x58,0x64,0x8c,0x58,0x64,0x8c,0x58, 0x64,0x8d,0x5a,0x65,0x8e,0x57,0x64,0x8c,0x5a,0x66,0x8e,0x5b,0x67,0x90,0x5b,0x66, 0x8e,0x5c,0x69,0x90,0x62,0x6d,0x94,0x6a,0x76,0x9a,0x76,0x82,0xa3,0x40,0x42,0x58, 0x31,0x30,0x43,0x47,0x36,0x43,0x41,0x31,0x3c,0x3a,0x2b,0x35,0x39,0x2a,0x34,0x3a, 0x2c,0x35,0x3e,0x2f,0x39,0x43,0x33,0x3e,0x46,0x36,0x42,0x8a,0x7f,0x88,0xbc,0xc2, 0xd0,0xaf,0xb4,0xc8,0xb5,0xbc,0xcf,0xb7,0xbc,0xcf,0xb2,0xb9,0xcc,0xb0,0xb7,0xca, 0xa8,0xb0,0xc4,0x88,0x8f,0xa3,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,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,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,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,0x88,0x88,0x88,0xfd,0xfd,0xfd,0x52,0x52, 0x52,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,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,0x1b,0x14,0x19,0x2e,0x21, 0x28,0x31,0x24,0x2b,0x33,0x26,0x2e,0x56,0x52,0x63,0x5c,0x67,0x8c,0x52,0x57,0x82, 0x55,0x50,0x79,0x64,0x53,0x75,0x5b,0x43,0x5d,0x64,0x50,0x6f,0x52,0x4f,0x7a,0x52, 0x4f,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52,0x52,0x7c,0x52,0x53,0x7d,0x52,0x53, 0x7d,0x52,0x54,0x80,0x52,0x56,0x82,0x52,0x57,0x83,0x52,0x58,0x83,0x52,0x5d,0x86, 0x52,0x5d,0x86,0x53,0x5e,0x88,0x53,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55, 0x60,0x8a,0x57,0x63,0x8b,0x57,0x63,0x8c,0x58,0x65,0x8d,0x5f,0x6b,0x91,0x64,0x71, 0x95,0x6c,0x76,0x9b,0x77,0x82,0xa2,0x83,0x8e,0xac,0x91,0x9a,0xb3,0x9d,0xa5,0xbe, 0xa8,0xb0,0xc4,0xb1,0xb8,0xca,0xb7,0xbe,0xcf,0xbc,0xc1,0xd1,0xbc,0xc3,0xd1,0xbf, 0xc3,0xd3,0xc0,0xc6,0xd5,0xba,0xc1,0xd1,0xb4,0xbc,0xce,0xaf,0xb5,0xc9,0xa7,0xad, 0xc3,0x9c,0xa7,0xbc,0x92,0x9b,0xb5,0x88,0x91,0xaf,0x7e,0x89,0xa7,0x76,0x82,0xa4, 0x6f,0x7b,0x9d,0x6c,0x76,0x9b,0x66,0x73,0x99,0x64,0x6f,0x96,0x63,0x6e,0x95,0x60, 0x6d,0x93,0x5f,0x6b,0x92,0x5d,0x6a,0x91,0x5d,0x69,0x91,0x5a,0x66,0x8e,0x58,0x64, 0x8c,0x56,0x63,0x8b,0x56,0x62,0x8b,0x5c,0x69,0x90,0x57,0x64,0x8c,0x57,0x50,0x79, 0x58,0x64,0x8c,0x34,0x36,0x3a,0x00,0x00,0x00,0x70,0x79,0x94,0x52,0x40,0x4f,0x5d, 0x49,0x5b,0x60,0x4c,0x5f,0x5f,0x4c,0x5e,0x54,0x42,0x51,0x6c,0x64,0x6d,0x84,0x8e, 0xad,0x5d,0x69,0x91,0x57,0x64,0x8c,0x58,0x64,0x8c,0x58,0x64,0x8c,0x58,0x64,0x8c, 0x58,0x65,0x8d,0x58,0x64,0x8d,0x58,0x65,0x8d,0x57,0x64,0x8c,0x58,0x64,0x8d,0x5a, 0x65,0x8d,0x5b,0x66,0x8e,0x5b,0x67,0x8e,0x5f,0x6c,0x93,0x64,0x71,0x96,0x71,0x7c, 0xa0,0x76,0x80,0xa1,0x37,0x39,0x4f,0x36,0x2a,0x37,0x42,0x33,0x3e,0x3e,0x2f,0x39, 0x3d,0x2e,0x38,0x3b,0x2d,0x36,0x3f,0x30,0x3a,0x44,0x34,0x40,0x49,0x38,0x45,0x4c, 0x3b,0x48,0xce,0xd0,0xd9,0xab,0xb2,0xc3,0xb4,0xbb,0xce,0xb4,0xbb,0xce,0xb8,0xbe, 0xd0,0xb1,0xb8,0xcb,0xac,0xb3,0xc8,0xa9,0xb0,0xc6,0x2b,0x2e,0x39,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,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,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,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,0xad,0xad,0xad,0xff, 0xff,0xff,0x2a,0x2a,0x2a,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,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,0x08,0x06,0x07,0x23,0x19,0x1f,0x2f,0x22,0x29,0x30,0x23,0x2a,0x37,0x2b, 0x33,0x5e,0x5c,0x6f,0x5e,0x6a,0x8f,0x52,0x5d,0x88,0x52,0x53,0x7e,0x64,0x52,0x72, 0x5e,0x46,0x60,0x64,0x53,0x75,0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7c,0x52, 0x52,0x7c,0x52,0x52,0x7c,0x52,0x53,0x7e,0x52,0x55,0x81,0x52,0x55,0x81,0x52,0x57, 0x82,0x52,0x58,0x83,0x52,0x5d,0x86,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53,0x5e,0x89, 0x54,0x5f,0x89,0x54,0x5f,0x89,0x56,0x62,0x8a,0x57,0x63,0x8c,0x58,0x65,0x8d,0x5e, 0x6a,0x91,0x63,0x6e,0x94,0x6c,0x77,0x9b,0x76,0x80,0xa2,0x82,0x8b,0xa9,0x90,0x98, 0xb3,0x9a,0xa3,0xbc,0xa5,0xad,0xc4,0xaf,0xb7,0xc8,0xb5,0xbc,0xce,0xba,0xc1,0xd0, 0xbc,0xc2,0xd2,0xbe,0xc2,0xd3,0xbb,0xc2,0xd1,0xb7,0xbe,0xcf,0xb3,0xb9,0xcc,0xab, 0xb2,0xc8,0xa3,0xab,0xc1,0x99,0xa1,0xba,0x8e,0x98,0xb3,0x83,0x8e,0xac,0x7b,0x85, 0xa5,0x75,0x81,0xa1,0x6d,0x79,0x9d,0x6a,0x75,0x9a,0x66,0x73,0x98,0x62,0x6e,0x95, 0x62,0x6d,0x94,0x60,0x6c,0x93,0x5f,0x6b,0x92,0x5e,0x6a,0x91,0x5b,0x67,0x90,0x5a, 0x65,0x8d,0x57,0x64,0x8c,0x56,0x62,0x8b,0x56,0x62,0x8b,0x58,0x64,0x8d,0x5c,0x69, 0x90,0x52,0x52,0x7d,0x5a,0x52,0x79,0x63,0x6b,0x82,0x00,0x00,0x00,0x57,0x57,0x58, 0x67,0x53,0x67,0x55,0x43,0x53,0x5e,0x4b,0x5d,0x5e,0x4b,0x5d,0x5a,0x47,0x58,0x45, 0x35,0x40,0x96,0x9d,0xb3,0x64,0x6f,0x95,0x5a,0x65,0x8d,0x58,0x64,0x8c,0x57,0x64, 0x8c,0x57,0x63,0x8c,0x58,0x64,0x8d,0x57,0x64,0x8c,0x58,0x65,0x8d,0x58,0x64,0x8d, 0x58,0x64,0x8d,0x58,0x64,0x8c,0x5b,0x66,0x8e,0x5a,0x66,0x8e,0x5a,0x66,0x8e,0x60, 0x6c,0x93,0x66,0x72,0x98,0x74,0x80,0xa2,0x44,0x48,0x61,0x2c,0x27,0x37,0x4a,0x39, 0x46,0x43,0x33,0x3f,0x3e,0x2f,0x39,0x3d,0x2e,0x38,0x41,0x32,0x3d,0x46,0x36,0x42, 0x4c,0x3b,0x49,0x4e,0x3d,0x4b,0x76,0x67,0x73,0xb5,0xbb,0xcb,0xab,0xb2,0xc6,0xb1, 0xb8,0xcb,0xb1,0xb8,0xcb,0xb3,0xba,0xcc,0xb1,0xb8,0xcb,0xaa,0xb2,0xc7,0x76,0x7d, 0x90,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,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,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,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, 0xce,0xce,0xce,0xfd,0xfd,0xfd,0x0e,0x0e,0x0e,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,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,0x11,0x0d,0x10,0x29, 0x1e,0x23,0x30,0x23,0x2a,0x2f,0x22,0x29,0x3c,0x32,0x3a,0x5e,0x60,0x75,0x5b,0x66, 0x8f,0x53,0x5e,0x88,0x52,0x50,0x7b,0x64,0x4f,0x6d,0x62,0x4a,0x65,0x60,0x53,0x77, 0x52,0x4f,0x7b,0x52,0x50,0x7b,0x52,0x52,0x7d,0x52,0x53,0x7e,0x52,0x54,0x7e,0x52, 0x53,0x7e,0x52,0x56,0x81,0x52,0x58,0x83,0x52,0x5a,0x84,0x52,0x5d,0x88,0x52,0x5d, 0x86,0x53,0x5e,0x88,0x53,0x5f,0x89,0x53,0x5f,0x89,0x55,0x60,0x89,0x56,0x62,0x8b, 0x58,0x64,0x8d,0x5e,0x6a,0x91,0x62,0x6d,0x94,0x6b,0x75,0x9a,0x74,0x7e,0xa1,0x7e, 0x89,0xa9,0x8d,0x98,0xb3,0x98,0xa1,0xba,0xa4,0xab,0xc1,0xab,0xb3,0xc7,0xb3,0xba, 0xcb,0xb7,0xbe,0xcf,0xb9,0xbf,0xd1,0xba,0xc0,0xd1,0xb8,0xbf,0xcf,0xb4,0xbb,0xce, 0xaf,0xb7,0xca,0xa7,0xb0,0xc4,0x9f,0xa7,0xbc,0x94,0x9d,0xb8,0x8a,0x94,0xb0,0x82, 0x8b,0xaa,0x79,0x84,0xa4,0x71,0x7c,0x9f,0x6d,0x7a,0x9d,0x6a,0x75,0x9a,0x66,0x72, 0x96,0x63,0x6f,0x94,0x60,0x6d,0x93,0x60,0x6c,0x93,0x5e,0x6b,0x92,0x5c,0x69,0x90, 0x5b,0x67,0x90,0x5a,0x66,0x8e,0x57,0x64,0x8c,0x57,0x63,0x8c,0x55,0x60,0x8a,0x55, 0x60,0x8a,0x5d,0x69,0x91,0x57,0x63,0x8b,0x54,0x50,0x79,0x5a,0x66,0x8e,0x25,0x26, 0x28,0x00,0x00,0x00,0x61,0x63,0x86,0x56,0x44,0x54,0x5d,0x49,0x5b,0x5e,0x4b,0x5d, 0x5d,0x49,0x5b,0x4c,0x3b,0x49,0x86,0x84,0x8e,0x72,0x7d,0xa0,0x5a,0x66,0x8e,0x5a, 0x65,0x8d,0x58,0x65,0x8d,0x56,0x63,0x8b,0x58,0x64,0x8d,0x57,0x64,0x8c,0x57,0x64, 0x8c,0x57,0x64,0x8c,0x57,0x64,0x8c,0x58,0x65,0x8d,0x58,0x65,0x8d,0x5a,0x65,0x8d, 0x58,0x65,0x8d,0x5c,0x67,0x90,0x62,0x6e,0x94,0x6d,0x79,0x9c,0x77,0x83,0xa4,0x32, 0x31,0x45,0x4c,0x3c,0x4a,0x48,0x37,0x44,0x43,0x33,0x3e,0x42,0x32,0x3d,0x42,0x33, 0x3e,0x49,0x38,0x45,0x4d,0x3c,0x4a,0x52,0x40,0x4f,0x54,0x41,0x51,0xc5,0xc5,0xcf, 0xa9,0xb0,0xc1,0xb2,0xb9,0xcc,0xb0,0xb7,0xca,0xb3,0xba,0xce,0xb1,0xb8,0xcb,0xac, 0xb4,0xc8,0xa7,0xaf,0xc4,0x1b,0x1e,0x25,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, 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,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, 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,0xdd,0xdd,0xdd,0xff,0xff,0xff,0x03,0x03,0x03,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,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,0x03,0x02,0x03,0x1b,0x13,0x18,0x2e,0x21,0x28,0x30,0x23,0x2a,0x30, 0x23,0x2a,0x41,0x37,0x40,0x5d,0x60,0x7b,0x5b,0x67,0x8e,0x52,0x5d,0x88,0x52,0x4f, 0x7a,0x64,0x52,0x72,0x64,0x53,0x75,0x56,0x50,0x79,0x52,0x4f,0x7a,0x52,0x52,0x7d, 0x52,0x52,0x7d,0x52,0x54,0x7e,0x52,0x54,0x80,0x52,0x55,0x81,0x52,0x58,0x83,0x52, 0x5b,0x85,0x52,0x5c,0x86,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5f,0x89,0x55,0x60, 0x89,0x55,0x60,0x8a,0x57,0x64,0x8d,0x5d,0x69,0x90,0x62,0x6d,0x94,0x6b,0x75,0x99, 0x74,0x7e,0xa1,0x7d,0x88,0xa7,0x8a,0x93,0xb1,0x95,0x9d,0xb8,0x9f,0xa8,0xbf,0xa8, 0xb0,0xc4,0xad,0xb4,0xc9,0xb3,0xb9,0xcc,0xb5,0xbc,0xce,0xb7,0xbc,0xce,0xb4,0xbb, 0xcc,0xb0,0xb5,0xc9,0xa9,0xb2,0xc6,0xa2,0xab,0xc1,0x9a,0xa3,0xbb,0x91,0x9b,0xb5, 0x89,0x93,0xb0,0x7e,0x88,0xa8,0x75,0x80,0xa2,0x71,0x7c,0x9f,0x6e,0x79,0x9c,0x69, 0x74,0x99,0x65,0x72,0x96,0x62,0x6e,0x94,0x60,0x6c,0x93,0x5f,0x6b,0x92,0x5e,0x6a, 0x91,0x5c,0x69,0x90,0x5b,0x67,0x90,0x58,0x64,0x8d,0x57,0x63,0x8c,0x55,0x62,0x8a, 0x55,0x60,0x8a,0x53,0x5e,0x89,0x5d,0x69,0x91,0x5c,0x69,0x90,0x52,0x55,0x81,0x52, 0x4f,0x7a,0x53,0x5a,0x6d,0x00,0x00,0x00,0x5a,0x5e,0x67,0x67,0x53,0x67,0x5a,0x47, 0x58,0x5d,0x49,0x5b,0x5b,0x48,0x5a,0x53,0x41,0x51,0x57,0x4b,0x54,0x90,0x99,0xb4, 0x5d,0x6a,0x91,0x57,0x64,0x8c,0x58,0x64,0x8c,0x58,0x65,0x8d,0x58,0x64,0x8c,0x57, 0x64,0x8c,0x57,0x64,0x8c,0x57,0x64,0x8c,0x58,0x64,0x8d,0x57,0x63,0x8c,0x58,0x64, 0x8d,0x58,0x65,0x8d,0x5a,0x65,0x8d,0x5a,0x65,0x8d,0x5d,0x69,0x91,0x64,0x71,0x96, 0x6f,0x7b,0x9f,0x48,0x4c,0x66,0x2b,0x21,0x2d,0x4d,0x3c,0x4a,0x47,0x36,0x43,0x47, 0x36,0x43,0x47,0x37,0x43,0x49,0x38,0x45,0x51,0x3f,0x4e,0x54,0x42,0x52,0x57,0x44, 0x55,0x78,0x68,0x77,0xb3,0xb8,0xc9,0xac,0xb3,0xc6,0xb1,0xb8,0xcb,0xb2,0xb9,0xcc, 0xb2,0xb9,0xcb,0xaf,0xb5,0xca,0xaa,0xb1,0xc7,0x60,0x65,0x77,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,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,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,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,0xe5,0xe5,0xe5,0xcc,0xcc,0xcc,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,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,0x09,0x07,0x08, 0x21,0x18,0x1d,0x2f,0x22,0x29,0x2f,0x22,0x29,0x2f,0x22,0x29,0x45,0x3d,0x48,0x5f, 0x65,0x84,0x5a,0x65,0x8d,0x52,0x5a,0x84,0x53,0x4f,0x7a,0x64,0x53,0x74,0x64,0x52, 0x72,0x5b,0x52,0x79,0x52,0x50,0x7b,0x52,0x52,0x7d,0x52,0x54,0x7e,0x52,0x54,0x80, 0x52,0x57,0x82,0x52,0x58,0x83,0x52,0x5a,0x84,0x52,0x5d,0x86,0x52,0x5d,0x88,0x53, 0x5d,0x88,0x54,0x60,0x89,0x55,0x60,0x8a,0x56,0x63,0x8c,0x5c,0x67,0x90,0x62,0x6d, 0x92,0x69,0x73,0x98,0x72,0x7b,0xa0,0x7d,0x88,0xa5,0x86,0x91,0xad,0x91,0x9a,0xb5, 0x9c,0xa5,0xbb,0xa3,0xac,0xc2,0xaa,0xb1,0xc6,0xad,0xb5,0xc9,0xb1,0xb8,0xcb,0xb1, 0xb8,0xca,0xaf,0xb7,0xc9,0xab,0xb2,0xc7,0xa5,0xac,0xc2,0x9d,0xa5,0xbc,0x96,0x9f, 0xb8,0x8d,0x96,0xb2,0x84,0x90,0xad,0x7c,0x86,0xa7,0x73,0x80,0xa1,0x71,0x7c,0x9f, 0x6c,0x77,0x9b,0x69,0x73,0x99,0x64,0x6f,0x95,0x62,0x6e,0x94,0x60,0x6c,0x93,0x60, 0x6c,0x93,0x5d,0x6a,0x91,0x5c,0x69,0x90,0x5a,0x65,0x8d,0x58,0x64,0x8d,0x57,0x63, 0x8c,0x55,0x60,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x88,0x58,0x64,0x8c,0x5d,0x69,0x91, 0x55,0x62,0x8b,0x52,0x4f,0x7a,0x5a,0x65,0x8d,0x0f,0x10,0x12,0x00,0x00,0x00,0x6a, 0x64,0x86,0x5f,0x4c,0x5e,0x5b,0x48,0x59,0x5b,0x48,0x59,0x57,0x45,0x55,0x46,0x36, 0x42,0x98,0x99,0xa7,0x69,0x74,0x99,0x58,0x64,0x8c,0x57,0x64,0x8c,0x57,0x63,0x8c, 0x58,0x64,0x8d,0x58,0x64,0x8c,0x57,0x63,0x8c,0x57,0x64,0x8c,0x58,0x64,0x8d,0x57, 0x63,0x8c,0x57,0x63,0x8c,0x58,0x64,0x8d,0x58,0x64,0x8d,0x5a,0x65,0x8d,0x5c,0x67, 0x90,0x5f,0x6b,0x92,0x67,0x73,0x99,0x73,0x7e,0xa1,0x2f,0x29,0x39,0x54,0x42,0x52, 0x4b,0x3a,0x47,0x48,0x37,0x44,0x4b,0x3a,0x48,0x4d,0x3c,0x4a,0x52,0x40,0x4f,0x57, 0x44,0x54,0x59,0x47,0x58,0x5d,0x49,0x5b,0xc1,0xc0,0xcc,0xb2,0xb9,0xcb,0xb0,0xb7, 0xca,0xb5,0xbc,0xcf,0xb1,0xb8,0xcb,0xb1,0xb8,0xcb,0xac,0xb3,0xc8,0xa7,0xaf,0xc5, 0x0e,0x10,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x0a,0x3a,0x2e, 0x39,0x3a,0x2e,0x3a,0x3f,0x33,0x40,0x4a,0x3c,0x4a,0x5b,0x4a,0x5d,0x5c,0x4b,0x5e, 0x5b,0x4a,0x5d,0x69,0x5a,0x6b,0xcb,0xc5,0xcb,0xf1,0xf0,0xf1,0xcc,0xcc,0xcc,0x3f, 0x3f,0x3f,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,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,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,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,0xec,0xec,0xec,0xa2, 0xa2,0xa2,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,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,0x0e,0x0a,0x0c,0x26,0x1c,0x21,0x2e,0x22,0x28, 0x2e,0x21,0x28,0x2f,0x22,0x29,0x48,0x43,0x51,0x5d,0x65,0x85,0x5a,0x65,0x8d,0x52, 0x58,0x84,0x5c,0x52,0x79,0x64,0x53,0x73,0x64,0x53,0x75,0x58,0x50,0x79,0x52,0x50, 0x7b,0x52,0x53,0x7e,0x52,0x55,0x81,0x52,0x56,0x81,0x52,0x57,0x82,0x52,0x5c,0x86, 0x52,0x5d,0x86,0x52,0x5d,0x88,0x54,0x5f,0x89,0x55,0x60,0x8a,0x56,0x62,0x8b,0x5b, 0x66,0x8e,0x62,0x6c,0x92,0x66,0x73,0x98,0x6f,0x7a,0x9d,0x79,0x84,0xa4,0x84,0x8e, 0xac,0x8d,0x98,0xb3,0x95,0x9f,0xb9,0x9f,0xa7,0xbf,0xa5,0xac,0xc2,0xa9,0xb0,0xc6, 0xaa,0xb2,0xc6,0xab,0xb2,0xc7,0xaa,0xb1,0xc7,0xa5,0xad,0xc3,0x9f,0xa7,0xbf,0x9a, 0xa1,0xbb,0x91,0x9a,0xb3,0x89,0x92,0xaf,0x82,0x8c,0xab,0x7b,0x85,0xa4,0x74,0x7e, 0xa2,0x6e,0x7b,0x9c,0x6a,0x76,0x9a,0x69,0x73,0x99,0x66,0x73,0x99,0x63,0x6e,0x95, 0x60,0x6d,0x93,0x5f,0x6c,0x93,0x5d,0x6a,0x91,0x5c,0x69,0x90,0x5a,0x65,0x8d,0x57, 0x64,0x8c,0x57,0x63,0x8c,0x55,0x60,0x8a,0x53,0x5e,0x88,0x52,0x5d,0x88,0x54,0x5f, 0x89,0x5e,0x6b,0x92,0x5b,0x67,0x90,0x52,0x50,0x7c,0x52,0x54,0x7e,0x3e,0x44,0x55, 0x00,0x00,0x00,0x65,0x6b,0x7c,0x70,0x5b,0x72,0x5a,0x47,0x58,0x5a,0x47,0x58,0x59, 0x46,0x57,0x4e,0x3d,0x4b,0x6e,0x66,0x6e,0x7d,0x88,0xa8,0x5a,0x65,0x8d,0x57,0x63, 0x8c,0x58,0x64,0x8c,0x56,0x63,0x8b,0x57,0x63,0x8c,0x57,0x64,0x8c,0x56,0x63,0x8b, 0x57,0x63,0x8c,0x56,0x62,0x8b,0x56,0x63,0x8b,0x57,0x63,0x8c,0x57,0x63,0x8c,0x5a, 0x65,0x8d,0x57,0x64,0x8c,0x5b,0x66,0x8e,0x63,0x6e,0x94,0x6e,0x7a,0x9d,0x40,0x40, 0x56,0x4f,0x3e,0x4e,0x50,0x3e,0x4c,0x4c,0x3b,0x49,0x4d,0x3c,0x4a,0x4f,0x3d,0x4c, 0x55,0x42,0x52,0x5a,0x47,0x58,0x5d,0x4a,0x5c,0x62,0x4e,0x61,0x78,0x67,0x78,0xbf, 0xc4,0xd5,0xb0,0xb7,0xca,0xaf,0xb5,0xca,0xb1,0xb8,0xcb,0xb2,0xb9,0xcc,0xaf,0xb7, 0xca,0xa9,0xb0,0xc6,0x56,0x5b,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x24,0x2c,0x5b, 0x48,0x5a,0x54,0x42,0x52,0x47,0x37,0x43,0x45,0x35,0x41,0x47,0x37,0x43,0x47,0x37, 0x43,0x4b,0x3a,0x47,0x8b,0x81,0x8a,0xd8,0xd9,0xe0,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, 0xfe,0xff,0xff,0x7a,0x7a,0x7b,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,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,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,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, 0xec,0xec,0xec,0x63,0x63,0x63,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,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,0x13,0x0e,0x10,0x2a,0x1f,0x25,0x2e,0x21,0x28,0x2e,0x22,0x28,0x2e,0x22,0x28, 0x45,0x40,0x4f,0x5b,0x62,0x82,0x58,0x64,0x8d,0x52,0x5b,0x85,0x52,0x4f,0x7a,0x64, 0x53,0x76,0x64,0x53,0x73,0x5b,0x52,0x79,0x52,0x50,0x7c,0x52,0x54,0x7e,0x52,0x57, 0x82,0x52,0x5a,0x84,0x52,0x5a,0x84,0x52,0x5d,0x88,0x53,0x5e,0x88,0x54,0x5e,0x89, 0x57,0x63,0x8a,0x5a,0x65,0x8d,0x5f,0x6b,0x91,0x65,0x6f,0x95,0x6d,0x77,0x9b,0x79, 0x83,0xa2,0x83,0x8b,0xaa,0x8c,0x95,0xb1,0x93,0x9c,0xb7,0x9a,0xa4,0xbb,0x9f,0xa9, 0xbf,0xa3,0xab,0xc1,0xa5,0xad,0xc3,0xa5,0xad,0xc3,0xa4,0xab,0xc1,0xa1,0xa9,0xc0, 0x9b,0xa3,0xbb,0x94,0x9c,0xb8,0x8d,0x98,0xb2,0x86,0x91,0xaf,0x80,0x8a,0xa8,0x77, 0x83,0xa3,0x72,0x7e,0xa1,0x6e,0x7b,0x9d,0x6c,0x77,0x9c,0x66,0x73,0x99,0x65,0x72, 0x98,0x63,0x6f,0x95,0x62,0x6d,0x94,0x5f,0x6c,0x93,0x5d,0x69,0x91,0x5b,0x67,0x8e, 0x58,0x65,0x8d,0x57,0x63,0x8c,0x56,0x62,0x8b,0x54,0x5f,0x89,0x52,0x5d,0x88,0x52, 0x5d,0x88,0x52,0x5c,0x86,0x5d,0x69,0x91,0x5e,0x6a,0x92,0x53,0x5e,0x88,0x52,0x4f, 0x7a,0x5d,0x69,0x8b,0x05,0x05,0x05,0x0e,0x0f,0x0f,0x6b,0x65,0x87,0x60,0x4c,0x5f, 0x58,0x45,0x56,0x57,0x44,0x55,0x52,0x40,0x50,0x41,0x32,0x3d,0x9e,0xa4,0xb8,0x62, 0x6e,0x94,0x56,0x63,0x8b,0x57,0x63,0x8c,0x57,0x64,0x8c,0x57,0x63,0x8c,0x56,0x63, 0x8b,0x57,0x63,0x8c,0x56,0x63,0x8b,0x56,0x62,0x8b,0x56,0x62,0x8b,0x56,0x63,0x8b, 0x56,0x63,0x8b,0x57,0x63,0x8c,0x58,0x64,0x8c,0x5a,0x65,0x8d,0x5c,0x67,0x90,0x65, 0x71,0x96,0x6d,0x78,0x9a,0x38,0x2b,0x3a,0x59,0x46,0x57,0x50,0x3f,0x4d,0x51,0x3f, 0x4e,0x51,0x3f,0x4e,0x58,0x45,0x56,0x5b,0x48,0x59,0x62,0x4e,0x61,0x61,0x4e,0x60, 0x62,0x4e,0x61,0xcb,0xc8,0xd0,0xb9,0xbf,0xd1,0xb1,0xb8,0xcb,0xb1,0xb8,0xcb,0xb3, 0xba,0xce,0xb0,0xb7,0xca,0xab,0xb3,0xc8,0xa4,0xac,0xc1,0x04,0x05,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x06,0x49,0x3a,0x47, 0x4c,0x3b,0x49,0x3a,0x2b,0x35,0x30,0x23,0x2b,0x30,0x23,0x2a,0x35,0x27,0x30,0x3c, 0x2d,0x37,0x59,0x4b,0x55,0xc3,0xbf,0xc6,0xd2,0xd7,0xe1,0xab,0xb3,0xc8,0xdd,0xdf, 0xe8,0xf5,0xf6,0xf8,0xfc,0xfd,0xfd,0x8b,0x8c,0x90,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,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,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,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,0xea,0xea,0xea,0x30,0x30,0x30,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,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,0x03,0x02,0x02,0x19,0x12,0x16,0x2d,0x21, 0x27,0x2d,0x21,0x28,0x2e,0x21,0x28,0x2e,0x22,0x28,0x42,0x3d,0x4b,0x5c,0x61,0x7e, 0x5f,0x6b,0x92,0x52,0x5c,0x85,0x52,0x4f,0x7a,0x64,0x53,0x76,0x64,0x52,0x73,0x5f, 0x53,0x79,0x52,0x50,0x7b,0x52,0x57,0x82,0x52,0x58,0x83,0x52,0x5c,0x86,0x53,0x5e, 0x88,0x53,0x5e,0x89,0x54,0x60,0x8a,0x58,0x64,0x8c,0x5d,0x69,0x90,0x63,0x6e,0x93, 0x6b,0x75,0x99,0x74,0x80,0xa1,0x7e,0x89,0xa8,0x88,0x91,0xad,0x90,0x9a,0xb4,0x95, 0xa0,0xb9,0x9c,0xa4,0xbc,0xa0,0xa8,0xbf,0xa1,0xaa,0xc1,0xa2,0xa9,0xc1,0xa0,0xa7, 0xc0,0x9c,0xa4,0xbc,0x95,0xa0,0xb9,0x90,0x9a,0xb5,0x8b,0x95,0xb1,0x83,0x8d,0xab, 0x7c,0x86,0xa5,0x75,0x81,0xa1,0x71,0x7d,0xa0,0x6e,0x7a,0x9d,0x6a,0x75,0x9a,0x69, 0x74,0x99,0x65,0x71,0x96,0x62,0x6e,0x94,0x60,0x6d,0x94,0x5f,0x6b,0x92,0x5d,0x6a, 0x91,0x5a,0x65,0x8e,0x58,0x65,0x8d,0x56,0x63,0x8b,0x55,0x62,0x8b,0x54,0x5f,0x89, 0x53,0x5e,0x88,0x52,0x5d,0x86,0x52,0x58,0x83,0x57,0x63,0x8c,0x5e,0x6a,0x91,0x58, 0x65,0x8d,0x52,0x4f,0x7a,0x5c,0x67,0x90,0x3d,0x40,0x48,0x00,0x00,0x00,0x5e,0x65, 0x7c,0x69,0x54,0x69,0x56,0x43,0x53,0x55,0x42,0x52,0x52,0x40,0x50,0x49,0x38,0x45, 0x86,0x82,0x8a,0x81,0x8b,0xaa,0x5a,0x65,0x8d,0x56,0x63,0x8b,0x56,0x62,0x8b,0x56, 0x62,0x8b,0x56,0x63,0x8b,0x56,0x63,0x8b,0x56,0x62,0x8b,0x55,0x62,0x8b,0x55,0x60, 0x8a,0x56,0x62,0x8b,0x56,0x63,0x8b,0x55,0x62,0x8b,0x56,0x63,0x8b,0x56,0x63,0x8b, 0x5b,0x66,0x8e,0x5e,0x6a,0x92,0x6a,0x76,0x9a,0x4b,0x43,0x59,0x5d,0x49,0x5b,0x56, 0x44,0x54,0x56,0x43,0x53,0x56,0x44,0x54,0x5b,0x48,0x5a,0x5f,0x4b,0x5e,0x64,0x50, 0x63,0x65,0x51,0x64,0x63,0x4f,0x63,0x75,0x65,0x74,0xd8,0xda,0xe4,0xaf,0xb5,0xca, 0xb2,0xb9,0xcc,0xb2,0xb9,0xcc,0xb3,0xba,0xcc,0xb2,0xb9,0xcc,0xb3,0xba,0xcc,0x48, 0x4c,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x14,0x19,0x4a,0x39, 0x46,0x38,0x2a,0x33,0x2b,0x1f,0x25,0x2d,0x21,0x28,0x2f,0x22,0x29,0x36,0x28,0x30, 0x3d,0x2e,0x38,0x8e,0x87,0x8e,0xc6,0xca,0xd7,0xaf,0xb5,0xc9,0x95,0x9f,0xb9,0x88, 0x92,0xb0,0xba,0xc1,0xd1,0xf0,0xf1,0xf6,0xfa,0xfc,0xfd,0x90,0x92,0x9c,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,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,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,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,0xda,0xda,0xda,0x15,0x15,0x15,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,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,0x06,0x05,0x06,0x1f,0x17,0x1b,0x2e,0x22,0x28,0x2d,0x21,0x28,0x2d,0x21, 0x28,0x2e,0x21,0x28,0x45,0x3e,0x48,0x67,0x6c,0x85,0x62,0x6d,0x94,0x52,0x5d,0x86, 0x52,0x4f,0x7a,0x5f,0x53,0x77,0x64,0x53,0x76,0x55,0x50,0x79,0x52,0x50,0x7b,0x52, 0x57,0x82,0x52,0x5d,0x86,0x53,0x5e,0x88,0x54,0x5f,0x89,0x57,0x63,0x8c,0x5c,0x67, 0x8e,0x5f,0x6b,0x91,0x69,0x73,0x99,0x71,0x7b,0x9f,0x7b,0x84,0xa5,0x83,0x8d,0xab, 0x8c,0x96,0xb2,0x92,0x9b,0xb7,0x99,0xa2,0xba,0x9b,0xa5,0xbc,0x9c,0xa7,0xbc,0x9c, 0xa7,0xbc,0x9c,0xa4,0xbc,0x98,0xa2,0xba,0x94,0x9b,0xb8,0x8d,0x98,0xb1,0x86,0x91, 0xaf,0x81,0x8c,0xab,0x7c,0x86,0xa7,0x76,0x81,0xa2,0x71,0x7c,0x9f,0x6b,0x77,0x9c, 0x6b,0x76,0x9b,0x69,0x74,0x99,0x65,0x71,0x96,0x62,0x6d,0x94,0x60,0x6c,0x93,0x5d, 0x6a,0x91,0x5c,0x69,0x90,0x5b,0x66,0x8e,0x57,0x64,0x8c,0x55,0x62,0x8a,0x54,0x60, 0x8a,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x58,0x83,0x52,0x5b,0x85,0x52,0x5d,0x88, 0x5e,0x6b,0x92,0x5d,0x69,0x91,0x52,0x58,0x83,0x53,0x5e,0x88,0x7a,0x82,0x96,0x00, 0x00,0x00,0x17,0x18,0x1a,0x75,0x60,0x79,0x58,0x46,0x56,0x52,0x40,0x50,0x51,0x40, 0x4f,0x4d,0x3b,0x49,0x51,0x44,0x4d,0xaf,0xb6,0xc9,0x63,0x6e,0x95,0x56,0x63,0x8b, 0x55,0x62,0x8b,0x56,0x62,0x8b,0x56,0x62,0x8b,0x55,0x62,0x8a,0x55,0x60,0x8a,0x55, 0x62,0x8b,0x55,0x62,0x8a,0x55,0x60,0x8a,0x56,0x62,0x8b,0x56,0x62,0x8b,0x56,0x62, 0x8b,0x56,0x62,0x8b,0x57,0x63,0x8c,0x5b,0x67,0x8e,0x62,0x6d,0x94,0x67,0x68,0x88, 0x58,0x45,0x57,0x5b,0x48,0x59,0x57,0x45,0x55,0x5a,0x47,0x58,0x5c,0x49,0x5a,0x60, 0x4d,0x5f,0x64,0x50,0x64,0x65,0x51,0x65,0x6a,0x55,0x6a,0x5f,0x4b,0x5e,0xd3,0xcf, 0xd5,0xc8,0xcc,0xda,0xb2,0xb9,0xcc,0xb7,0xbc,0xcf,0xba,0xc0,0xd1,0xb8,0xbe,0xd0, 0xba,0xc0,0xd1,0xa3,0xab,0xbf,0x08,0x06,0x08,0x1e,0x17,0x1d,0x44,0x34,0x3f,0x3c, 0x2d,0x37,0x2c,0x20,0x26,0x26,0x1b,0x20,0x27,0x1c,0x21,0x2e,0x21,0x28,0x35,0x27, 0x30,0x5c,0x50,0x58,0xbd,0xbc,0xc5,0xb4,0xbb,0xce,0x99,0xa1,0xbb,0x8c,0x96,0xb3, 0x89,0x93,0xb0,0x8a,0x93,0xb1,0x9f,0xa7,0xbf,0xee,0xf0,0xf4,0xe0,0xe2,0xea,0xa4, 0xa9,0xb4,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,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,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,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,0xa8,0xa8,0xa8,0x0a, 0x0a,0x0a,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,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,0x0b,0x08,0x0a,0x25, 0x1b,0x20,0x2e,0x21,0x28,0x2d,0x21,0x28,0x2d,0x21,0x28,0x2e,0x21,0x28,0x44,0x3c, 0x45,0x61,0x65,0x7d,0x5d,0x6a,0x91,0x52,0x5a,0x84,0x52,0x4f,0x7a,0x54,0x50,0x79, 0x56,0x50,0x79,0x5a,0x52,0x79,0x52,0x50,0x7b,0x53,0x5b,0x84,0x53,0x5e,0x88,0x56, 0x60,0x8a,0x5b,0x66,0x8d,0x5e,0x6a,0x90,0x65,0x6f,0x95,0x6d,0x79,0x9c,0x74,0x80, 0xa2,0x80,0x8b,0xaa,0x88,0x92,0xaf,0x8e,0x99,0xb3,0x94,0x9d,0xb8,0x99,0xa1,0xb9, 0x9b,0xa3,0xbb,0x9a,0xa3,0xbb,0x98,0xa0,0xb9,0x95,0x9f,0xb8,0x90,0x99,0xb4,0x8a, 0x95,0xb1,0x84,0x90,0xad,0x7e,0x8a,0xa9,0x79,0x83,0xa5,0x75,0x80,0xa2,0x71,0x7c, 0xa0,0x6c,0x79,0x9b,0x69,0x75,0x99,0x67,0x74,0x98,0x65,0x71,0x95,0x63,0x6f,0x95, 0x5f,0x6c,0x93,0x5f,0x6c,0x93,0x5d,0x69,0x91,0x5b,0x66,0x8e,0x58,0x64,0x8d,0x55, 0x62,0x8b,0x54,0x60,0x8a,0x52,0x5d,0x88,0x52,0x5d,0x86,0x52,0x58,0x84,0x52,0x54, 0x80,0x52,0x55,0x81,0x5d,0x69,0x91,0x5e,0x6a,0x91,0x5a,0x65,0x8d,0x52,0x50,0x7c, 0x74,0x80,0xa2,0x27,0x28,0x2b,0x00,0x00,0x00,0x51,0x53,0x70,0x64,0x50,0x64,0x51, 0x3f,0x4e,0x4f,0x3e,0x4c,0x4d,0x3b,0x49,0x42,0x32,0x3d,0xa6,0xa5,0xad,0x6e,0x7a, 0x9d,0x56,0x63,0x8b,0x55,0x60,0x8a,0x55,0x60,0x8a,0x54,0x60,0x8a,0x55,0x60,0x8a, 0x55,0x60,0x8a,0x55,0x60,0x8a,0x54,0x60,0x8a,0x55,0x60,0x8a,0x55,0x60,0x8a,0x55, 0x60,0x8a,0x55,0x60,0x8a,0x55,0x60,0x8a,0x56,0x63,0x8b,0x57,0x64,0x8c,0x57,0x63, 0x89,0x51,0x5b,0x7c,0x4d,0x3e,0x51,0x62,0x4f,0x61,0x5f,0x4c,0x5e,0x5c,0x49,0x5a, 0x5f,0x4c,0x5e,0x62,0x4e,0x62,0x68,0x54,0x69,0x6a,0x55,0x6b,0x69,0x55,0x6a,0x66, 0x52,0x66,0x6c,0x5c,0x6a,0xe4,0xe6,0xed,0xb9,0xbf,0xd0,0xb7,0xbe,0xcf,0xb9,0xc0, 0xd1,0xbe,0xc3,0xd3,0xbc,0xc3,0xd3,0xbb,0xc2,0xd2,0x5f,0x59,0x6a,0x36,0x29,0x31, 0x29,0x1d,0x23,0x22,0x18,0x1c,0x23,0x18,0x1d,0x26,0x1b,0x20,0x2e,0x21,0x28,0x3a, 0x2e,0x35,0x9f,0x99,0x9d,0xd6,0xd9,0xe3,0xa2,0xab,0xc2,0x92,0x9c,0xb7,0x8b,0x95, 0xb2,0x86,0x91,0xaf,0x83,0x8e,0xac,0x82,0x8d,0xab,0x6b,0x70,0x89,0xc6,0xc5,0xcb, 0xaf,0xb5,0xca,0xbb,0xc0,0xcd,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,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,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,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, 0x03,0x03,0x03,0x05,0x05,0x05,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,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,0x12,0x0d,0x10,0x2a,0x1f,0x24,0x2e,0x21,0x28,0x2e, 0x21,0x28,0x2e,0x21,0x28,0x2d,0x21,0x28,0x3f,0x36,0x41,0x5c,0x5d,0x75,0x5d,0x6a, 0x91,0x53,0x5f,0x89,0x52,0x53,0x7d,0x55,0x50,0x79,0x5c,0x52,0x79,0x5c,0x52,0x79, 0x53,0x50,0x7c,0x54,0x5a,0x83,0x57,0x62,0x8b,0x5d,0x67,0x90,0x62,0x6c,0x93,0x69, 0x74,0x99,0x72,0x7c,0x9f,0x7a,0x85,0xa5,0x82,0x8c,0xaa,0x8c,0x95,0xb2,0x91,0x9a, 0xb5,0x93,0x9d,0xb8,0x96,0xa0,0xba,0x95,0xa1,0xb9,0x94,0x9f,0xb7,0x91,0x9a,0xb5, 0x8e,0x99,0xb4,0x86,0x91,0xad,0x85,0x8e,0xac,0x7c,0x86,0xa7,0x76,0x82,0xa3,0x74, 0x80,0xa1,0x71,0x7b,0x9d,0x6c,0x77,0x9b,0x6a,0x75,0x9a,0x66,0x73,0x98,0x64,0x71, 0x95,0x62,0x6d,0x94,0x60,0x6c,0x93,0x5f,0x6b,0x92,0x5c,0x67,0x90,0x5a,0x65,0x8d, 0x57,0x64,0x8c,0x55,0x60,0x8a,0x54,0x5f,0x89,0x52,0x5d,0x88,0x52,0x58,0x84,0x52, 0x5a,0x84,0x52,0x55,0x80,0x52,0x53,0x7d,0x58,0x64,0x8c,0x5e,0x6a,0x92,0x5d,0x69, 0x91,0x52,0x55,0x80,0x5a,0x65,0x8d,0x5f,0x64,0x72,0x00,0x00,0x00,0x1a,0x1b,0x21, 0x72,0x5e,0x75,0x51,0x3f,0x4e,0x4d,0x3b,0x49,0x4c,0x3b,0x49,0x45,0x35,0x41,0x6b, 0x61,0x68,0x91,0x9a,0xb5,0x57,0x64,0x8c,0x55,0x62,0x8b,0x54,0x5f,0x89,0x54,0x60, 0x8a,0x54,0x5f,0x8a,0x54,0x5f,0x89,0x54,0x60,0x8a,0x55,0x60,0x8a,0x54,0x5f,0x89, 0x54,0x5f,0x89,0x55,0x60,0x8a,0x54,0x5f,0x89,0x55,0x62,0x8b,0x56,0x62,0x8b,0x50, 0x5d,0x83,0x47,0x50,0x73,0x4c,0x56,0x77,0x61,0x57,0x71,0x69,0x55,0x6b,0x65,0x51, 0x65,0x62,0x4e,0x61,0x63,0x4f,0x62,0x64,0x50,0x63,0x69,0x55,0x6a,0x6c,0x58,0x6e, 0x6e,0x59,0x6f,0x69,0x55,0x6a,0x50,0x3f,0x4d,0xd2,0xce,0xd2,0xcb,0xd0,0xdd,0xb7, 0xbe,0xd0,0xb8,0xbf,0xd0,0xbe,0xc3,0xd3,0xbb,0xc2,0xd2,0xbb,0xc1,0xd2,0x9c,0xa1, 0xb4,0x20,0x16,0x1a,0x1e,0x14,0x18,0x21,0x17,0x1b,0x25,0x1a,0x1f,0x2d,0x21,0x28, 0x65,0x5b,0x60,0xdf,0xdd,0xde,0xca,0xcf,0xdd,0xa0,0xa8,0xc0,0x94,0x9d,0xb8,0x90, 0x99,0xb4,0x89,0x93,0xb1,0x84,0x8e,0xad,0x82,0x8c,0xab,0x54,0x59,0x6e,0x1e,0x16, 0x19,0x2b,0x25,0x29,0x9f,0xa4,0xb6,0xc8,0xcc,0xda,0x0b,0x0c,0x0d,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,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02, 0x18,0x11,0x15,0x2d,0x21,0x28,0x2d,0x21,0x27,0x2d,0x21,0x28,0x2e,0x21,0x28,0x2d, 0x21,0x28,0x3e,0x35,0x3d,0x69,0x6a,0x7c,0x66,0x71,0x96,0x56,0x62,0x8b,0x52,0x58, 0x83,0x52,0x50,0x7b,0x5d,0x53,0x7a,0x65,0x55,0x79,0x5f,0x55,0x7c,0x57,0x5b,0x84, 0x5f,0x6a,0x91,0x65,0x71,0x96,0x6c,0x76,0x9b,0x75,0x80,0xa2,0x7d,0x88,0xa7,0x84, 0x8e,0xad,0x8d,0x96,0xb1,0x91,0x9a,0xb5,0x92,0x9c,0xb5,0x92,0x9b,0xb5,0x90,0x9a, 0xb5,0x8d,0x96,0xb2,0x8a,0x93,0xb0,0x84,0x90,0xad,0x81,0x8c,0xaa,0x7b,0x85,0xa5, 0x76,0x80,0xa2,0x71,0x7b,0x9f,0x6d,0x77,0x9c,0x6a,0x76,0x9b,0x69,0x74,0x9a,0x67, 0x73,0x99,0x65,0x72,0x96,0x62,0x6e,0x94,0x60,0x6d,0x93,0x5c,0x69,0x90,0x5b,0x67, 0x90,0x5b,0x66,0x8e,0x57,0x64,0x8c,0x55,0x60,0x8a,0x54,0x5f,0x89,0x52,0x5d,0x86, 0x52,0x58,0x84,0x52,0x56,0x81,0x52,0x55,0x80,0x52,0x52,0x7d,0x53,0x5e,0x88,0x5e, 0x6a,0x92,0x5c,0x69,0x90,0x55,0x60,0x8a,0x52,0x53,0x7e,0x7e,0x88,0xa4,0x07,0x08, 0x08,0x00,0x00,0x00,0x56,0x57,0x75,0x57,0x44,0x55,0x4c,0x3b,0x48,0x4a,0x39,0x47, 0x48,0x37,0x44,0x3c,0x2e,0x37,0xa6,0xaa,0xb9,0x5e,0x6b,0x92,0x55,0x60,0x8a,0x55, 0x60,0x8a,0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x60,0x8a,0x54,0x5f,0x89,0x55,0x60, 0x8a,0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x55,0x60,0x8a, 0x4f,0x5a,0x81,0x45,0x4e,0x72,0x41,0x4c,0x6d,0x46,0x52,0x72,0x5c,0x5f,0x7d,0x64, 0x52,0x68,0x6f,0x5a,0x71,0x6c,0x58,0x6d,0x6a,0x55,0x6b,0x6c,0x57,0x6d,0x6f,0x5a, 0x71,0x6e,0x5a,0x70,0x6e,0x5a,0x70,0x6c,0x58,0x6e,0x4f,0x3e,0x4c,0x61,0x53,0x5f, 0xe8,0xea,0xef,0xbc,0xc2,0xd3,0xbc,0xc3,0xd3,0xc1,0xc7,0xd7,0xc0,0xc6,0xd6,0xc0, 0xc6,0xd6,0xc2,0xc7,0xd7,0x38,0x31,0x39,0x25,0x1a,0x1f,0x28,0x1d,0x23,0x3b,0x2f, 0x35,0xab,0xa5,0xa9,0xf8,0xf8,0xfa,0xbf,0xc4,0xd5,0x9f,0xa8,0xbf,0x98,0xa1,0xba, 0x8d,0x98,0xb3,0x8a,0x93,0xb1,0x8d,0x98,0xb3,0x8d,0x98,0xb3,0x3e,0x42,0x51,0x07, 0x05,0x06,0x18,0x10,0x12,0x16,0x0f,0x11,0x34,0x2f,0x33,0xd5,0xd9,0xe3,0x22,0x23, 0x26,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,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,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,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x03,0x1b,0x14,0x17,0x2d,0x20,0x27, 0x2d,0x20,0x27,0x2c,0x20,0x27,0x2c,0x20,0x27,0x2c,0x20,0x27,0x3b,0x31,0x39,0x65, 0x65,0x78,0x69,0x73,0x96,0x5b,0x67,0x90,0x56,0x62,0x8b,0x54,0x5e,0x85,0x57,0x53, 0x7b,0x64,0x57,0x7c,0x5d,0x58,0x7e,0x5c,0x63,0x8b,0x65,0x71,0x95,0x6f,0x7a,0x9d, 0x76,0x82,0xa2,0x7e,0x89,0xa9,0x85,0x90,0xad,0x8a,0x95,0xb0,0x8c,0x96,0xb2,0x8c, 0x96,0xb3,0x8c,0x98,0xb2,0x8a,0x93,0xb0,0x86,0x90,0xaf,0x83,0x8d,0xab,0x7e,0x89, 0xa8,0x79,0x83,0xa3,0x73,0x7e,0xa1,0x6e,0x7b,0x9d,0x6c,0x77,0x9c,0x67,0x74,0x99, 0x66,0x72,0x98,0x64,0x71,0x96,0x64,0x71,0x96,0x62,0x6e,0x94,0x60,0x6d,0x93,0x5d, 0x6a,0x91,0x5b,0x66,0x8e,0x5a,0x65,0x8d,0x56,0x63,0x8b,0x55,0x60,0x8a,0x53,0x5e, 0x88,0x52,0x5d,0x86,0x52,0x56,0x82,0x52,0x56,0x82,0x52,0x53,0x7e,0x52,0x52,0x7d, 0x52,0x55,0x80,0x5d,0x6a,0x91,0x5e,0x6a,0x92,0x5b,0x66,0x8e,0x52,0x50,0x7c,0x6e, 0x7a,0x9d,0x48,0x49,0x4e,0x00,0x00,0x00,0x26,0x29,0x32,0x6b,0x57,0x6c,0x4b,0x3a, 0x47,0x47,0x37,0x44,0x46,0x36,0x42,0x3f,0x30,0x3a,0x82,0x7d,0x84,0x72,0x7d,0xa0, 0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x54,0x5f,0x89,0x53, 0x5f,0x89,0x55,0x60,0x8a,0x54,0x5f,0x89,0x54,0x5f,0x89,0x53,0x5f,0x89,0x53,0x5e, 0x89,0x4c,0x56,0x7d,0x41,0x4b,0x6e,0x3f,0x48,0x6b,0x3f,0x48,0x6a,0x43,0x4c,0x6e, 0x4d,0x56,0x76,0x5b,0x54,0x72,0x74,0x63,0x7c,0x72,0x5e,0x76,0x72,0x5d,0x76,0x72, 0x5e,0x75,0x72,0x5d,0x75,0x6f,0x5a,0x71,0x63,0x4f,0x62,0x56,0x43,0x53,0x4d,0x3c, 0x49,0x46,0x36,0x42,0xd0,0xcc,0xd0,0xc8,0xcc,0xda,0xbf,0xc4,0xd5,0xc6,0xca,0xd9, 0xc7,0xcb,0xd9,0xc2,0xc8,0xd7,0xc7,0xcb,0xd9,0x92,0x94,0xa5,0x31,0x24,0x2b,0x61, 0x5a,0x64,0xdb,0xda,0xdf,0xe3,0xe6,0xed,0xb8,0xbf,0xd0,0xa1,0xa9,0xc1,0x9a,0xa3, 0xbb,0x90,0x9a,0xb5,0x8b,0x94,0xb1,0x94,0x9d,0xb8,0xaa,0xb1,0xc3,0x3a,0x3c,0x43, 0x00,0x00,0x00,0x06,0x04,0x05,0x17,0x0f,0x11,0x16,0x0e,0x10,0x15,0x0e,0x10,0xd3, 0xd6,0xde,0x3b,0x3c,0x40,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,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,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,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,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,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0x03,0x04,0x1a,0x13,0x17,0x2c,0x1f,0x26,0x2c,0x20,0x26,0x2b,0x1f,0x25, 0x2a,0x1e,0x25,0x29,0x1e,0x23,0x33,0x29,0x2e,0x5f,0x5b,0x67,0x79,0x80,0x99,0x69, 0x74,0x99,0x5e,0x6a,0x91,0x56,0x62,0x8b,0x56,0x56,0x80,0x60,0x5a,0x80,0x5e,0x5c, 0x82,0x5f,0x6b,0x92,0x6c,0x76,0x9a,0x76,0x82,0xa3,0x7e,0x8a,0xa9,0x83,0x8c,0xab, 0x86,0x91,0xad,0x88,0x92,0xaf,0x88,0x92,0xaf,0x83,0x8d,0xac,0x82,0x8d,0xab,0x7c, 0x86,0xa7,0x77,0x83,0xa4,0x76,0x80,0xa2,0x6f,0x7c,0x9f,0x6d,0x79,0x9d,0x6a,0x75, 0x99,0x67,0x74,0x99,0x66,0x72,0x96,0x63,0x6e,0x95,0x62,0x6e,0x94,0x60,0x6d,0x94, 0x5f,0x6c,0x93,0x5d,0x6a,0x91,0x5b,0x66,0x8e,0x58,0x65,0x8d,0x58,0x64,0x8c,0x55, 0x60,0x8a,0x52,0x5d,0x88,0x52,0x5d,0x86,0x52,0x57,0x83,0x52,0x55,0x81,0x52,0x53, 0x7d,0x52,0x50,0x7c,0x52,0x50,0x7b,0x5c,0x67,0x90,0x5d,0x69,0x91,0x5c,0x69,0x90, 0x52,0x57,0x82,0x5b,0x67,0x8e,0x8b,0x8f,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x62, 0x5b,0x79,0x50,0x3e,0x4d,0x46,0x36,0x42,0x44,0x34,0x40,0x41,0x31,0x3c,0x43,0x38, 0x3f,0x8e,0x97,0xb1,0x58,0x64,0x8c,0x54,0x5f,0x89,0x54,0x5f,0x89,0x53,0x5e,0x89, 0x53,0x5e,0x89,0x53,0x5e,0x88,0x54,0x5f,0x89,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52, 0x5d,0x88,0x4b,0x55,0x7c,0x41,0x4b,0x6e,0x3e,0x47,0x6a,0x3d,0x47,0x6a,0x3e,0x47, 0x69,0x40,0x4b,0x6c,0x48,0x54,0x74,0x5e,0x5f,0x82,0x62,0x5d,0x7d,0x72,0x65,0x84, 0x75,0x67,0x83,0x75,0x60,0x7a,0x68,0x54,0x69,0x5d,0x4a,0x5c,0x5a,0x47,0x58,0x56, 0x44,0x54,0x52,0x40,0x4f,0x4b,0x3a,0x47,0x5e,0x50,0x5b,0xdb,0xdf,0xe7,0xc4,0xca, 0xd8,0xc6,0xcb,0xd9,0xca,0xcf,0xdd,0xc6,0xca,0xd9,0xca,0xcf,0xdb,0xc5,0xc9,0xd8, 0xcf,0xcd,0xd3,0xbb,0xc1,0xd2,0xba,0xc1,0xd1,0xad,0xb4,0xc9,0xa3,0xab,0xc2,0x9a, 0xa3,0xbc,0x93,0x9c,0xb8,0x8b,0x95,0xb2,0x9b,0xa3,0xbc,0xac,0xb1,0xbf,0x30,0x30, 0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x06,0x18,0x10,0x13,0x17,0x0f,0x11, 0x16,0x0e,0x11,0xc0,0xc2,0xcc,0x52,0x53,0x59,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,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,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,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,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,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,0x05,0x03,0x04,0x1a,0x13, 0x17,0x2a,0x1f,0x25,0x2b,0x1f,0x25,0x29,0x1e,0x23,0x29,0x1d,0x23,0x27,0x1c,0x21, 0x26,0x1b,0x20,0x4a,0x44,0x4d,0x70,0x73,0x87,0x75,0x80,0xa2,0x69,0x74,0x9a,0x5f, 0x6b,0x92,0x5b,0x66,0x8d,0x5c,0x5d,0x88,0x5e,0x5f,0x88,0x64,0x6f,0x93,0x6f,0x7a, 0x9d,0x79,0x84,0xa4,0x7c,0x88,0xa7,0x7e,0x8b,0xaa,0x80,0x8b,0xa9,0x7e,0x8a,0xa9, 0x7b,0x85,0xa5,0x79,0x83,0xa4,0x75,0x80,0xa2,0x71,0x7c,0x9f,0x6e,0x7a,0x9c,0x6a, 0x75,0x9a,0x67,0x74,0x99,0x66,0x71,0x96,0x63,0x6e,0x95,0x63,0x6f,0x94,0x60,0x6d, 0x93,0x60,0x6c,0x93,0x5e,0x6b,0x92,0x5c,0x67,0x90,0x5a,0x65,0x8e,0x58,0x65,0x8d, 0x55,0x62,0x8a,0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x5b,0x85,0x52,0x57,0x83,0x52, 0x53,0x7d,0x52,0x52,0x7c,0x52,0x50,0x7c,0x52,0x4f,0x7b,0x56,0x62,0x8b,0x5d,0x6a, 0x91,0x5c,0x69,0x90,0x57,0x63,0x8c,0x55,0x60,0x8a,0xa1,0xa9,0xc0,0x1e,0x1e,0x1f, 0x00,0x00,0x00,0x28,0x2c,0x38,0x63,0x4f,0x62,0x46,0x36,0x42,0x43,0x33,0x3e,0x41, 0x31,0x3c,0x38,0x2a,0x33,0x8c,0x8c,0x97,0x5e,0x6a,0x92,0x53,0x5e,0x89,0x53,0x5e, 0x88,0x53,0x5e,0x88,0x53,0x5e,0x88,0x52,0x5d,0x88,0x53,0x5e,0x88,0x53,0x5e,0x88, 0x53,0x5e,0x88,0x48,0x53,0x7a,0x40,0x4b,0x6d,0x3f,0x48,0x6c,0x3e,0x47,0x69,0x3d, 0x46,0x69,0x3e,0x47,0x6b,0x40,0x4b,0x6e,0x47,0x52,0x75,0x4f,0x59,0x7a,0x55,0x54, 0x74,0x73,0x64,0x7f,0x6a,0x55,0x6b,0x61,0x4d,0x61,0x65,0x51,0x65,0x64,0x50,0x63, 0x64,0x50,0x64,0x5e,0x4b,0x5d,0x57,0x44,0x54,0x56,0x44,0x54,0x4c,0x3b,0x49,0xd4, 0xd1,0xd5,0xd3,0xd7,0xe2,0xc7,0xcb,0xd9,0xc8,0xcc,0xda,0xc9,0xcf,0xdb,0xc8,0xcc, 0xda,0xe3,0xe6,0xed,0xfc,0xfc,0xfd,0xb7,0xbe,0xcf,0xb0,0xb7,0xca,0xa5,0xad,0xc3, 0x9b,0xa3,0xbc,0x93,0x9d,0xb8,0x92,0x9b,0xb7,0xa4,0xac,0xc3,0xaa,0xae,0xb8,0x1c, 0x1c,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x07,0x1d,0x14, 0x18,0x1a,0x12,0x15,0x17,0x0f,0x12,0xa6,0xaa,0xb7,0x66,0x69,0x71,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,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,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,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,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,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,0x05,0x04,0x04,0x1a,0x13,0x17,0x29,0x1e,0x23,0x28,0x1c, 0x22,0x26,0x1b,0x20,0x26,0x1b,0x20,0x25,0x1a,0x1f,0x25,0x1a,0x1f,0x34,0x2c,0x32, 0x5e,0x5e,0x6e,0x79,0x82,0x9f,0x75,0x80,0xa1,0x69,0x75,0x9b,0x66,0x72,0x96,0x60, 0x6c,0x92,0x5f,0x6a,0x91,0x64,0x6e,0x94,0x6c,0x77,0x9b,0x76,0x83,0xa3,0x77,0x82, 0xa3,0x77,0x83,0xa3,0x75,0x81,0xa2,0x73,0x7e,0xa0,0x71,0x7d,0xa0,0x6d,0x77,0x9b, 0x67,0x74,0x99,0x67,0x72,0x98,0x66,0x73,0x98,0x64,0x71,0x95,0x63,0x6e,0x95,0x63, 0x6f,0x94,0x5f,0x6c,0x93,0x5f,0x6c,0x93,0x5e,0x6b,0x92,0x5c,0x69,0x90,0x5b,0x66, 0x8e,0x57,0x63,0x8c,0x55,0x60,0x8a,0x54,0x5f,0x89,0x52,0x5d,0x88,0x52,0x5b,0x85, 0x52,0x54,0x7e,0x52,0x52,0x7d,0x52,0x52,0x7c,0x52,0x50,0x7c,0x52,0x4f,0x7b,0x52, 0x5d,0x88,0x5d,0x69,0x91,0x5c,0x67,0x90,0x58,0x64,0x8d,0x52,0x58,0x83,0x74,0x80, 0xa2,0x6d,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x44,0x55,0x4a,0x39,0x46, 0x40,0x31,0x3c,0x3e,0x2f,0x39,0x3a,0x2b,0x35,0x5c,0x52,0x58,0x71,0x7c,0xa0,0x54, 0x5f,0x89,0x53,0x5e,0x88,0x52,0x5d,0x88,0x52,0x5d,0x86,0x53,0x5d,0x88,0x52,0x5d, 0x86,0x50,0x5c,0x85,0x46,0x50,0x76,0x40,0x4a,0x6d,0x3f,0x4a,0x6c,0x3e,0x47,0x6b, 0x3d,0x46,0x69,0x3e,0x47,0x6b,0x3f,0x4a,0x6c,0x41,0x4b,0x6f,0x48,0x53,0x76,0x4d, 0x56,0x77,0x61,0x51,0x67,0x5b,0x48,0x5a,0x60,0x4d,0x60,0x61,0x4e,0x61,0x66,0x51, 0x66,0x67,0x52,0x67,0x6b,0x56,0x6c,0x68,0x54,0x69,0x65,0x51,0x65,0x5e,0x4a,0x5c, 0x58,0x45,0x56,0x65,0x55,0x63,0xe2,0xe5,0xeb,0xcc,0xd1,0xde,0xc8,0xce,0xdb,0xc8, 0xcc,0xda,0xc7,0xcb,0xda,0xf9,0xf9,0xfc,0xfe,0xfe,0xfe,0xb0,0xb7,0xca,0xa8,0xb0, 0xc6,0x9d,0xa5,0xbf,0x96,0xa0,0xba,0x98,0xa1,0xba,0xb3,0xba,0xcc,0xa5,0xa6,0xab, 0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08, 0x06,0x07,0x20,0x16,0x1a,0x1e,0x15,0x18,0x1b,0x12,0x15,0x9b,0x9e,0xaa,0x7e,0x81, 0x8b,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,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,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,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,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,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,0x05, 0x04,0x04,0x1b,0x13,0x17,0x26,0x1b,0x20,0x26,0x1b,0x20,0x25,0x1a,0x1f,0x23,0x19, 0x1d,0x23,0x18,0x1d,0x23,0x19,0x1d,0x26,0x1c,0x21,0x51,0x4e,0x58,0x77,0x7d,0x93, 0x82,0x8c,0xab,0x74,0x80,0xa0,0x6d,0x79,0x9c,0x64,0x6f,0x95,0x5f,0x6a,0x90,0x62, 0x6c,0x91,0x66,0x72,0x96,0x6e,0x7b,0x9d,0x6e,0x7b,0x9f,0x6e,0x79,0x9c,0x6a,0x76, 0x9a,0x67,0x74,0x98,0x67,0x73,0x98,0x64,0x71,0x95,0x64,0x71,0x95,0x62,0x6e,0x94, 0x62,0x6d,0x94,0x5f,0x6c,0x93,0x5e,0x6b,0x92,0x5f,0x6b,0x92,0x5d,0x69,0x91,0x5c, 0x67,0x90,0x58,0x64,0x8d,0x57,0x63,0x8b,0x55,0x60,0x8a,0x53,0x5e,0x89,0x52,0x5d, 0x88,0x52,0x5a,0x84,0x52,0x55,0x81,0x52,0x52,0x7d,0x52,0x52,0x7c,0x52,0x50,0x7b, 0x52,0x4f,0x7b,0x52,0x53,0x7d,0x5d,0x69,0x91,0x5b,0x67,0x90,0x58,0x64,0x8d,0x52, 0x54,0x7e,0x5f,0x6b,0x92,0x96,0x9b,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x4f,0x3f,0x4e,0x40,0x30,0x3b,0x3b,0x2c,0x36,0x39,0x2a,0x34,0x34,0x26,0x2e, 0x89,0x8f,0xa4,0x56,0x63,0x8b,0x52,0x5c,0x85,0x52,0x5d,0x86,0x52,0x5c,0x85,0x52, 0x5c,0x86,0x4f,0x5b,0x83,0x45,0x4c,0x72,0x40,0x47,0x6c,0x3e,0x46,0x6a,0x3e,0x44, 0x67,0x3d,0x41,0x65,0x3e,0x47,0x6b,0x3f,0x47,0x6c,0x41,0x4b,0x6e,0x45,0x4f,0x74, 0x56,0x62,0x81,0x1d,0x1e,0x24,0x0d,0x0b,0x0d,0x32,0x28,0x33,0x54,0x45,0x57,0x72, 0x5e,0x75,0x71,0x5d,0x74,0x70,0x5b,0x72,0x71,0x5c,0x73,0x70,0x5b,0x72,0x6e,0x59, 0x70,0x69,0x54,0x69,0x65,0x51,0x65,0x62,0x4e,0x61,0xe3,0xe1,0xe5,0xde,0xe1,0xe9, 0xce,0xd2,0xde,0xc9,0xcf,0xdb,0xc4,0xca,0xd8,0xfe,0xff,0xff,0xfe,0xfe,0xff,0xb2, 0xb9,0xcc,0xa5,0xad,0xc3,0x9b,0xa3,0xbc,0xa7,0xaf,0xc4,0xd2,0xd6,0xe1,0x9e,0x9e, 0x9e,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0a,0x07,0x09,0x28,0x1d,0x22,0x23,0x19,0x1e,0x20,0x16,0x1a,0x92, 0x93,0xa0,0x92,0x95,0xa2,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,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,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,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,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,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,0x06,0x04,0x05,0x1b,0x13,0x17,0x25, 0x1a,0x1f,0x23,0x19,0x1e,0x23,0x19,0x1d,0x23,0x18,0x1d,0x22,0x18,0x1c,0x22,0x18, 0x1c,0x22,0x18,0x1c,0x44,0x3d,0x44,0x79,0x7a,0x88,0x92,0x9b,0xb3,0x7d,0x89,0xa8, 0x71,0x7c,0xa0,0x65,0x71,0x96,0x5c,0x5e,0x86,0x5c,0x5b,0x83,0x5c,0x66,0x8e,0x62, 0x6d,0x93,0x66,0x73,0x98,0x64,0x6f,0x95,0x63,0x6f,0x95,0x62,0x6e,0x95,0x62,0x6d, 0x94,0x62,0x6d,0x94,0x5f,0x6c,0x93,0x5f,0x6b,0x92,0x5f,0x6c,0x93,0x5f,0x6b,0x92, 0x5c,0x69,0x90,0x5a,0x66,0x8e,0x5a,0x65,0x8d,0x56,0x63,0x8b,0x54,0x5f,0x89,0x53, 0x5e,0x89,0x52,0x5d,0x86,0x52,0x58,0x83,0x52,0x54,0x80,0x52,0x53,0x7e,0x52,0x52, 0x7c,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x5b,0x66,0x8e,0x5b,0x67,0x90, 0x5c,0x67,0x90,0x54,0x5f,0x89,0x58,0x65,0x8d,0x8b,0x94,0xb1,0x26,0x26,0x28,0x00, 0x00,0x00,0x00,0x00,0x00,0x25,0x1e,0x26,0x46,0x36,0x42,0x3a,0x2c,0x35,0x38,0x2a, 0x33,0x34,0x27,0x2f,0x70,0x6a,0x74,0x5d,0x69,0x91,0x52,0x5d,0x88,0x52,0x5a,0x84, 0x52,0x5c,0x85,0x4d,0x57,0x80,0x44,0x48,0x6f,0x41,0x47,0x6c,0x3e,0x45,0x69,0x3d, 0x41,0x65,0x3e,0x45,0x69,0x3e,0x46,0x6a,0x3f,0x45,0x6b,0x40,0x47,0x6c,0x44,0x4e, 0x73,0x5b,0x65,0x86,0x40,0x42,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x09,0x0c,0x25,0x28,0x35,0x48,0x4e,0x66,0x63,0x61,0x84,0x75, 0x69,0x89,0x78,0x66,0x81,0x76,0x61,0x7a,0x72,0x5d,0x75,0x6d,0x59,0x6f,0x82,0x71, 0x82,0xfd,0xfd,0xfd,0xdd,0xdf,0xe8,0xca,0xcf,0xdb,0xd7,0xda,0xe5,0xff,0xff,0xff, 0xfe,0xff,0xff,0xb9,0xbf,0xd1,0xb0,0xb7,0xca,0xc3,0xc8,0xd7,0xf8,0xf9,0xfa,0x78, 0x78,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x07,0x08,0x32,0x25,0x2c,0x29,0x1e,0x23, 0x26,0x1b,0x20,0x8a,0x89,0x96,0xac,0xb1,0xbe,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,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,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,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,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,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,0x05,0x04,0x04,0x1a,0x12,0x15,0x23,0x19,0x1d,0x23,0x19,0x1d,0x22, 0x18,0x1c,0x22,0x18,0x1c,0x22,0x18,0x1c,0x22,0x18,0x1c,0x22,0x18,0x1c,0x30,0x27, 0x2b,0x71,0x6d,0x75,0x9a,0x9f,0xb3,0x86,0x91,0xad,0x73,0x7e,0xa0,0x65,0x72,0x96, 0x58,0x64,0x8b,0x56,0x55,0x7e,0x56,0x56,0x80,0x58,0x65,0x8d,0x5d,0x6a,0x91,0x60, 0x6d,0x94,0x62,0x6d,0x94,0x5f,0x6b,0x92,0x5f,0x6c,0x93,0x5f,0x6b,0x92,0x5d,0x69, 0x91,0x5c,0x67,0x90,0x5b,0x67,0x90,0x5b,0x66,0x8e,0x58,0x64,0x8c,0x56,0x62,0x8b, 0x54,0x5f,0x89,0x53,0x5e,0x88,0x52,0x5d,0x86,0x52,0x57,0x83,0x52,0x55,0x80,0x52, 0x50,0x7b,0x52,0x50,0x7b,0x52,0x50,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x55,0x62, 0x8b,0x5c,0x67,0x90,0x5a,0x66,0x8e,0x58,0x64,0x8d,0x53,0x5e,0x88,0x6c,0x77,0x9b, 0x5e,0x61,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53,0x41,0x51,0x39, 0x2a,0x33,0x35,0x27,0x30,0x33,0x26,0x2e,0x3c,0x30,0x38,0x6e,0x78,0x99,0x52,0x5d, 0x86,0x50,0x57,0x82,0x4b,0x4f,0x77,0x44,0x48,0x6e,0x40,0x45,0x6a,0x40,0x45,0x69, 0x3d,0x41,0x65,0x3d,0x41,0x65,0x3e,0x40,0x65,0x3f,0x43,0x67,0x41,0x46,0x6c,0x44, 0x4d,0x72,0x5a,0x64,0x85,0x67,0x68,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x02,0x02,0x02,0x28,0x2b,0x33,0x4b,0x51,0x63,0x63,0x6d,0x8b,0x68,0x68,0x8d,0x78, 0x69,0x88,0x76,0x61,0x7a,0xe7,0xe3,0xe8,0xfc,0xfc,0xfd,0xd1,0xd6,0xe0,0xeb,0xee, 0xf2,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xd7,0xda,0xe5,0xe9,0xeb,0xf0,0xf6,0xf6,0xf6, 0x54,0x54,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x07,0x3a,0x2b, 0x35,0x2f,0x23,0x2a,0x2b,0x1f,0x26,0x82,0x81,0x8d,0xbf,0xc5,0xd4,0x02,0x02,0x02, 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,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, 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,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, 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,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,0x03,0x02,0x03, 0x18,0x11,0x13,0x23,0x18,0x1d,0x23,0x18,0x1d,0x21,0x17,0x1b,0x22,0x18,0x1c,0x21, 0x17,0x1b,0x22,0x18,0x1c,0x20,0x17,0x1b,0x21,0x17,0x1b,0x5c,0x55,0x5b,0x8d,0x8d, 0x99,0x99,0xa2,0xba,0x80,0x8b,0xaa,0x6e,0x7a,0x9d,0x5c,0x67,0x90,0x54,0x55,0x80, 0x53,0x52,0x7c,0x53,0x55,0x81,0x56,0x62,0x8a,0x5d,0x67,0x90,0x5c,0x69,0x90,0x5d, 0x69,0x91,0x5d,0x6a,0x91,0x5c,0x69,0x90,0x5b,0x66,0x8e,0x58,0x65,0x8d,0x57,0x63, 0x8c,0x55,0x60,0x8a,0x54,0x60,0x8a,0x53,0x5e,0x88,0x52,0x5c,0x86,0x52,0x56,0x81, 0x52,0x54,0x7e,0x52,0x52,0x7c,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52, 0x4f,0x7a,0x53,0x5e,0x88,0x5b,0x67,0x8e,0x5a,0x66,0x8e,0x58,0x65,0x8d,0x52,0x5c, 0x86,0x53,0x5e,0x88,0x7d,0x85,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3b,0x30,0x3d,0x40,0x31,0x3b,0x33,0x25,0x2d,0x31,0x24,0x2c,0x30,0x23,0x2b,0x73, 0x73,0x84,0x56,0x62,0x8a,0x47,0x4c,0x74,0x45,0x4b,0x71,0x41,0x46,0x6c,0x40,0x45, 0x6a,0x3e,0x41,0x65,0x3e,0x41,0x65,0x3e,0x3f,0x64,0x3f,0x41,0x66,0x41,0x46,0x6b, 0x45,0x4d,0x73,0x54,0x5f,0x83,0x87,0x89,0x90,0x03,0x03,0x03,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, 0x1d,0x1e,0x22,0x49,0x4d,0x5a,0x5d,0x65,0x7f,0x81,0x89,0xa7,0xfe,0xfe,0xff,0xe8, 0xe9,0xef,0xfa,0xfa,0xfc,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xe7, 0xe7,0x36,0x36,0x36,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,0x05, 0x04,0x05,0x42,0x33,0x3e,0x34,0x27,0x2f,0x34,0x27,0x2f,0x7c,0x79,0x86,0xc1,0xc7, 0xd6,0x13,0x14,0x17,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,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,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,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,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,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,0x16,0x10,0x12,0x21,0x18,0x1c, 0x22,0x18,0x1d,0x21,0x17,0x1b,0x22,0x17,0x1c,0x21,0x17,0x1b,0x20,0x16,0x1a,0x22, 0x18,0x1c,0x21,0x17,0x1b,0x2f,0x27,0x2b,0x6c,0x67,0x6d,0x96,0x9a,0xa8,0x93,0x9c, 0xb7,0x7b,0x85,0xa5,0x62,0x6d,0x94,0x55,0x60,0x89,0x52,0x50,0x7c,0x52,0x4f,0x7a, 0x52,0x52,0x7c,0x53,0x5e,0x89,0x5a,0x65,0x8d,0x5b,0x66,0x8e,0x58,0x65,0x8d,0x58, 0x64,0x8d,0x57,0x64,0x8c,0x55,0x62,0x8b,0x54,0x5f,0x89,0x52,0x5d,0x86,0x52,0x58, 0x83,0x52,0x55,0x81,0x52,0x53,0x7d,0x52,0x52,0x7c,0x52,0x50,0x7b,0x52,0x4f,0x7b, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x55,0x81,0x5b,0x66,0x8e,0x5a,0x65,0x8d,0x5a, 0x65,0x8d,0x55,0x62,0x8b,0x52,0x4f,0x7a,0x76,0x82,0xa3,0x22,0x23,0x26,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x03,0x03,0x52,0x40,0x50,0x36,0x28,0x31,0x2e,0x22,0x29, 0x2d,0x21,0x28,0x49,0x41,0x46,0x6c,0x76,0x94,0x46,0x50,0x76,0x43,0x46,0x6b,0x40, 0x44,0x69,0x3f,0x40,0x65,0x3e,0x3f,0x63,0x3f,0x41,0x66,0x3f,0x41,0x65,0x41,0x43, 0x67,0x44,0x45,0x6b,0x4f,0x5c,0x7e,0x95,0x99,0xa4,0x0b,0x0b,0x0b,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,0x10,0x10,0x12, 0x46,0x48,0x4d,0x69,0x69,0x69,0xae,0xae,0xae,0xff,0xff,0xff,0xff,0xff,0xff,0xd8, 0xd8,0xd8,0x1e,0x1e,0x1e,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,0x02,0x02,0x02,0x47,0x37,0x43,0x37,0x29,0x32,0x37,0x29,0x32,0x73, 0x6f,0x7d,0xc1,0xc7,0xd6,0x28,0x29,0x2e,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, 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,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, 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,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, 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,0x15,0x0f,0x11,0x24,0x19,0x1e,0x25,0x1a,0x1f,0x22,0x18,0x1d, 0x20,0x17,0x1b,0x21,0x17,0x1b,0x21,0x17,0x1b,0x22,0x18,0x1c,0x21,0x17,0x1b,0x20, 0x16,0x1a,0x39,0x31,0x35,0x79,0x76,0x7e,0x95,0x9b,0xae,0x83,0x8e,0xac,0x6e,0x7a, 0x9d,0x5f,0x6c,0x93,0x53,0x5e,0x88,0x52,0x50,0x7b,0x52,0x4f,0x7a,0x52,0x52,0x7c, 0x53,0x5e,0x89,0x56,0x62,0x8b,0x55,0x62,0x8a,0x54,0x60,0x8a,0x53,0x5e,0x88,0x52, 0x5d,0x86,0x52,0x57,0x82,0x52,0x53,0x7e,0x52,0x52,0x7d,0x52,0x50,0x7b,0x52,0x4f, 0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7b,0x52,0x50,0x7c,0x5b,0x66,0x8e, 0x58,0x65,0x8d,0x58,0x64,0x8c,0x57,0x63,0x8c,0x52,0x4f,0x7a,0x5a,0x66,0x8e,0x57, 0x5a,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x2f,0x3c,0x47,0x37, 0x44,0x31,0x24,0x2c,0x27,0x1d,0x22,0x25,0x1b,0x20,0x63,0x5f,0x65,0x65,0x6f,0x8d, 0x48,0x54,0x76,0x40,0x4a,0x6e,0x3f,0x43,0x66,0x3e,0x40,0x64,0x3f,0x3f,0x64,0x43, 0x43,0x69,0x44,0x45,0x6c,0x4b,0x56,0x7b,0x8c,0x92,0xa4,0x19,0x19,0x19,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,0x5c,0x49,0x5b,0x3c,0x2d,0x37, 0x39,0x2b,0x34,0x6c,0x67,0x75,0xc0,0xc6,0xd6,0x3b,0x3e,0x45,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,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,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,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,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,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,0x10,0x0c, 0x0e,0x25,0x1b,0x1f,0x27,0x1c,0x21,0x24,0x19,0x1e,0x21,0x17,0x1b,0x22,0x18,0x1c, 0x1f,0x15,0x19,0x20,0x16,0x1a,0x20,0x16,0x1a,0x20,0x16,0x1a,0x1f,0x16,0x19,0x4b, 0x45,0x4a,0x7c,0x7c,0x88,0x93,0x9b,0xb1,0x7b,0x86,0xa7,0x6d,0x79,0x9c,0x5e,0x6b, 0x92,0x55,0x60,0x8a,0x52,0x52,0x7d,0x52,0x4f,0x7b,0x52,0x50,0x7c,0x52,0x57,0x82, 0x52,0x5c,0x86,0x52,0x5b,0x85,0x52,0x55,0x81,0x52,0x54,0x7e,0x52,0x50,0x7b,0x52, 0x50,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f, 0x7a,0x5a,0x66,0x8e,0x58,0x64,0x8d,0x57,0x63,0x8c,0x57,0x63,0x8c,0x52,0x50,0x7c, 0x52,0x50,0x7c,0x88,0x8d,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x03,0x04,0x44,0x36,0x43,0x3a,0x2c,0x36,0x2c,0x21,0x28,0x27,0x1c,0x22,0x24,0x1a, 0x20,0x53,0x4e,0x54,0x6e,0x75,0x8c,0x5b,0x64,0x83,0x4b,0x56,0x77,0x41,0x4b,0x6e, 0x41,0x4b,0x6f,0x43,0x4a,0x6f,0x48,0x54,0x79,0x7e,0x88,0x9e,0x2a,0x2a,0x2a,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,0x60,0x4e, 0x62,0x57,0x44,0x55,0x41,0x31,0x3c,0x67,0x60,0x6e,0xbe,0xc3,0xd3,0x50,0x54,0x5e, 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,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, 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,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, 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,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,0x0d,0x09,0x0b,0x22,0x19,0x1e,0x28,0x1c, 0x22,0x27,0x1b,0x21,0x24,0x19,0x1e,0x20,0x16,0x1a,0x20,0x17,0x1b,0x20,0x16,0x1a, 0x1f,0x15,0x19,0x1f,0x15,0x19,0x1d,0x14,0x18,0x20,0x17,0x1c,0x4e,0x4a,0x53,0x75, 0x79,0x8b,0x8a,0x93,0xb0,0x7a,0x84,0xa5,0x67,0x73,0x99,0x5d,0x69,0x91,0x52,0x58, 0x83,0x53,0x4f,0x7a,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x50,0x7b,0x52,0x50,0x7c, 0x52,0x50,0x7b,0x52,0x4f,0x7b,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52, 0x4f,0x7a,0x52,0x4f,0x7a,0x57,0x63,0x8c,0x58,0x64,0x8d,0x57,0x63,0x8c,0x56,0x63, 0x8b,0x52,0x5d,0x86,0x58,0x52,0x79,0x97,0x9e,0xb3,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x17,0x1c,0x31,0x26,0x2e,0x2d, 0x22,0x29,0x2a,0x1f,0x26,0x23,0x1a,0x20,0x27,0x1f,0x24,0x56,0x55,0x5e,0x77,0x7c, 0x8e,0x7a,0x83,0x99,0x6d,0x75,0x91,0x6d,0x76,0x93,0x9b,0xa1,0xb3,0x48,0x48,0x48, 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,0x4c,0x3f,0x4f,0x71,0x5c,0x73,0x56,0x43,0x53,0x63,0x5a,0x68,0xbe,0xc3, 0xd3,0x66,0x6a,0x76,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,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,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,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,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,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,0x04,0x03,0x04,0x20,0x18,0x1d,0x2c,0x21,0x27,0x29,0x1d,0x23,0x23,0x19, 0x1e,0x21,0x17,0x1b,0x1f,0x15,0x19,0x1e,0x15,0x19,0x1e,0x14,0x18,0x1d,0x14,0x17, 0x1a,0x12,0x15,0x1a,0x12,0x15,0x28,0x21,0x25,0x60,0x5e,0x65,0x89,0x8d,0x9e,0x84, 0x90,0xad,0x6a,0x76,0x9a,0x5a,0x65,0x8d,0x52,0x5c,0x85,0x54,0x50,0x79,0x5a,0x52, 0x79,0x5c,0x52,0x79,0x54,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a, 0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x55,0x62,0x8b,0x58,0x64,0x8c,0x56, 0x62,0x8b,0x56,0x62,0x8b,0x53,0x5e,0x88,0x5d,0x52,0x79,0x7f,0x87,0x9e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0b,0x09,0x0b,0x23,0x1c,0x22,0x2c,0x22,0x2a,0x27,0x1e,0x25,0x20,0x17,0x1d,0x1d, 0x15,0x1a,0x20,0x17,0x1b,0x3c,0x36,0x3d,0x66,0x63,0x6d,0x9b,0x99,0x9a,0x56,0x55, 0x55,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,0x1c,0x18,0x1f,0x78,0x67,0x83,0x72,0x5d,0x74,0x6b, 0x5e,0x70,0xba,0xc0,0xd1,0x79,0x7e,0x8d,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, 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,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, 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,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, 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,0x18, 0x12,0x16,0x2e,0x22,0x2a,0x2e,0x21,0x28,0x25,0x1a,0x1f,0x21,0x17,0x1b,0x1d,0x14, 0x18,0x1d,0x13,0x17,0x1c,0x13,0x16,0x1a,0x11,0x14,0x18,0x10,0x12,0x18,0x10,0x12, 0x16,0x0e,0x10,0x32,0x2c,0x2f,0x62,0x63,0x6d,0x76,0x7c,0x94,0x6c,0x77,0x9c,0x54, 0x5f,0x89,0x52,0x4f,0x7a,0x64,0x53,0x75,0x64,0x4c,0x6a,0x64,0x50,0x71,0x60,0x53, 0x77,0x55,0x50,0x79,0x53,0x50,0x79,0x52,0x4f,0x7a,0x52,0x4f,0x7a,0x54,0x5f,0x89, 0x57,0x63,0x8c,0x57,0x63,0x8c,0x56,0x62,0x8b,0x52,0x5d,0x86,0x5b,0x52,0x79,0x84, 0x8a,0x9b,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, 0x16,0x11,0x15,0x1b,0x14,0x18,0x1b,0x14,0x19,0x1e,0x16,0x1b,0x1a,0x13,0x17,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,0x2d,0x29,0x36, 0x77,0x69,0x89,0x7b,0x6c,0x84,0xb5,0xbc,0xcf,0x8d,0x93,0xa5,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,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,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,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,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,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,0x0b,0x09,0x0a,0x2f,0x23,0x2b,0x31, 0x24,0x2c,0x27,0x1c,0x22,0x20,0x16,0x1a,0x1d,0x14,0x17,0x1b,0x13,0x16,0x19,0x11, 0x13,0x17,0x0f,0x11,0x16,0x0e,0x11,0x14,0x0d,0x0f,0x12,0x0b,0x0d,0x11,0x0b,0x0c, 0x26,0x21,0x24,0x4f,0x50,0x5d,0x5b,0x63,0x7c,0x57,0x63,0x8c,0x53,0x4f,0x7a,0x64, 0x4c,0x6a,0x5f,0x47,0x63,0x5f,0x47,0x63,0x64,0x50,0x71,0x60,0x53,0x77,0x5a,0x52, 0x79,0x52,0x5d,0x88,0x56,0x62,0x8b,0x56,0x62,0x8b,0x52,0x5d,0x86,0x64,0x53,0x76, 0x52,0x58,0x84,0x7a,0x7d,0x85,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,0x2c,0x2c,0x3c,0x71,0x6e,0x90,0xaf,0xb7,0xca,0xa1,0xa8,0xbb, 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,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, 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,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, 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,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,0x20,0x19,0x1f,0x32,0x25,0x2e,0x2c,0x20,0x26,0x21, 0x17,0x1b,0x1c,0x13,0x16,0x18,0x10,0x12,0x16,0x0e,0x11,0x15,0x0d,0x0f,0x12,0x0c, 0x0d,0x11,0x0b,0x0c,0x10,0x0a,0x0b,0x0f,0x09,0x0a,0x0e,0x08,0x09,0x1a,0x15,0x18, 0x3b,0x3c,0x49,0x47,0x4f,0x6a,0x50,0x53,0x7d,0x5d,0x52,0x79,0x63,0x4b,0x67,0x5c, 0x44,0x5e,0x5a,0x41,0x5c,0x63,0x53,0x77,0x52,0x50,0x7b,0x52,0x4f,0x7a,0x64,0x53, 0x75,0x62,0x4a,0x66,0x79,0x84,0xa5,0x60,0x61,0x62,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,0x2c,0x2f,0x3e,0xa9,0xb1, 0xc6,0x49,0x4c,0x55,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,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,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,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,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,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, 0x04,0x03,0x04,0x26,0x1d,0x24,0x2e,0x22,0x29,0x23,0x18,0x1d,0x1a,0x12,0x15,0x16, 0x0e,0x11,0x13,0x0c,0x0e,0x11,0x0b,0x0c,0x0f,0x09,0x0a,0x0e,0x08,0x09,0x0e,0x08, 0x09,0x0d,0x08,0x08,0x0d,0x08,0x08,0x0c,0x07,0x08,0x12,0x0e,0x0f,0x2a,0x2a,0x36, 0x42,0x48,0x64,0x4e,0x57,0x7e,0x60,0x53,0x77,0x55,0x50,0x79,0x55,0x50,0x79,0x5f, 0x53,0x77,0x60,0x53,0x77,0x5c,0x67,0x90,0xce,0xd2,0xde,0x1e,0x1e,0x1e,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,0x29,0x2a,0x30,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,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,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,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,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,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,0x0a,0x08,0x09, 0x29,0x1f,0x26,0x2a,0x1e,0x24,0x1e,0x14,0x18,0x16,0x0f,0x11,0x11,0x0b,0x0c,0x0f, 0x09,0x0a,0x0e,0x08,0x09,0x0e,0x08,0x09,0x0d,0x08,0x08,0x0c,0x07,0x08,0x0c,0x07, 0x08,0x0e,0x08,0x09,0x0e,0x08,0x09,0x10,0x0a,0x0c,0x33,0x30,0x3d,0x68,0x67,0x81, 0x70,0x78,0x9a,0x6c,0x77,0x9c,0x74,0x80,0xa1,0xa7,0xaf,0xc4,0xcd,0xcd,0xce,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,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,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,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,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,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,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,0x10,0x0c,0x0f,0x2d,0x23,0x2a, 0x27,0x1b,0x21,0x1c,0x13,0x16,0x14,0x0c,0x0e,0x10,0x0a,0x0b,0x0d,0x08,0x09,0x0d, 0x08,0x08,0x0d,0x08,0x08,0x0d,0x08,0x09,0x0e,0x08,0x09,0x0f,0x09,0x0a,0x24,0x19, 0x1e,0x4c,0x3b,0x49,0x4f,0x3e,0x4c,0x6c,0x5f,0x70,0x93,0x8c,0xa0,0xca,0xcb,0xd2, 0x4b,0x4b,0x4b,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,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,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,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,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,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,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,0x16,0x11,0x15,0x2a,0x1f,0x25,0x28,0x1d,0x23, 0x1d,0x14,0x17,0x15,0x0e,0x10,0x11,0x0b,0x0c,0x0f,0x09,0x0a,0x0f,0x09,0x0a,0x11, 0x0b,0x0c,0x3d,0x2e,0x38,0x68,0x53,0x68,0x75,0x64,0x7d,0x53,0x5b,0x77,0x35,0x39, 0x43,0x06,0x06,0x07,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,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,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,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,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,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,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,0x15,0x10,0x14,0x26,0x1c,0x22,0x2a,0x1f,0x24,0x21,0x17,0x1b, 0x23,0x18,0x1d,0x32,0x25,0x2d,0x49,0x50,0x68,0x21,0x23,0x29,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,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,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,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,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,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,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,0x08,0x06,0x08,0x19,0x14,0x19,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0x54,0x00,0x00}; milkytracker-0.90.85+dfsg/src/tracker/PatternEditorClipBoard.cpp0000644000175000017500000001213011150223367023712 0ustar admin2admin2/* * tracker/PatternEditorClipBoard.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PatternEditorClipBoard.cpp * MilkyTracker * * Created by Peter Barth on Fri Mar 11 2005. * */ #include "PatternEditor.h" #include "XModule.h" PatternEditor::ClipBoard::ClipBoard() : buffer(0) { selectionStart.channel = -1; selectionStart.row = -1; selectionEnd.channel = -1; selectionEnd.row = -1; } PatternEditor::ClipBoard::~ClipBoard() { delete buffer; } void PatternEditor::ClipBoard::makeCopy(TXMPattern& pattern, const PatternEditorTools::Position& ss, const PatternEditorTools::Position& se, bool clear/*= false*/) { if (!PatternEditorTools::hasValidSelection(&pattern, ss, se)) return; if (!PatternEditorTools::normalizeSelection(&pattern, ss, se, selectionStart.channel, selectionStart.row, selectionStart.inner, selectionEnd.channel, selectionEnd.row, selectionEnd.inner)) return; // only entire instrument column is allowed if (selectionStart.inner >= 1 && selectionStart.inner<=2) selectionStart.inner = 1; if (selectionEnd.inner >= 1 && selectionEnd.inner<=2) selectionEnd.inner = 2; // only entire volume column can be selected if (selectionStart.inner >= 3 && selectionStart.inner<=4) selectionStart.inner = 3; if (selectionEnd.inner >= 3 && selectionEnd.inner<=4) selectionEnd.inner = 4; selectionWidth = selectionEnd.channel - selectionStart.channel + 1; selectionHeight = selectionEnd.row - selectionStart.row + 1; mp_sint32 slotSize = pattern.effnum * 2 + 2; ASSERT(slotSize == 6); mp_sint32 rowSizeDst = slotSize*selectionWidth; mp_sint32 rowSizeSrc = slotSize*pattern.channum; mp_sint32 bufferSize = selectionHeight * rowSizeDst; if (buffer) delete[] buffer; buffer = new mp_ubyte[bufferSize]; if (buffer == NULL) return; memset(buffer, 0, bufferSize); for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { mp_ubyte* src = pattern.patternData + (selectionStart.row+i)*rowSizeSrc+(selectionStart.channel+j)*slotSize; mp_ubyte* dst = buffer + i*rowSizeDst+j*slotSize; if (selectionWidth == 1) { PatternEditorTools::slotCopy(dst, src, selectionStart.inner, selectionEnd.inner); if (clear) PatternEditorTools::slotClear(src, selectionStart.inner, selectionEnd.inner); } else if (j == 0) { PatternEditorTools::slotCopy(dst, src, selectionStart.inner, 7); if (clear) PatternEditorTools::slotClear(src, selectionStart.inner, 7); } else if (j+selectionStart.channel == selectionEnd.channel) { PatternEditorTools::slotCopy(dst, src, 0, selectionEnd.inner); if (clear) PatternEditorTools::slotClear(src, 0, selectionEnd.inner); } else { //memcpy(dst, src, slotSize); PatternEditorTools::slotCopy(dst, src, 0, 7); if (clear) PatternEditorTools::slotClear(src, 0, 7); } } } void PatternEditor::ClipBoard::paste(TXMPattern& pattern, pp_int32 sc, pp_int32 sr, bool transparent/* = false*/) { if (pattern.patternData == NULL) return; if (buffer == NULL) return; mp_sint32 slotSize = pattern.effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*selectionWidth; mp_sint32 rowSizeDst = slotSize*pattern.channum; for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { if (i + sr < pattern.rows && i + sr >= 0 && j + sc < pattern.channum && j + sc >= 0) { mp_ubyte* dst = pattern.patternData + (sr+i)*rowSizeDst+(sc+j)*slotSize; mp_ubyte* src = buffer + i*rowSizeSrc+j*slotSize; if (selectionWidth == 1) { if (transparent) PatternEditorTools::slotTransparentCopy(dst, src, selectionStart.inner, selectionEnd.inner); else PatternEditorTools::slotCopy(dst, src, selectionStart.inner, selectionEnd.inner); } else if (j == 0) { if (transparent) PatternEditorTools::slotTransparentCopy(dst, src, selectionStart.inner, 7); else PatternEditorTools::slotCopy(dst, src, selectionStart.inner, 7); } else if (j+selectionStart.channel == selectionEnd.channel) { if (transparent) PatternEditorTools::slotTransparentCopy(dst, src, 0, selectionEnd.inner); else PatternEditorTools::slotCopy(dst, src, 0, selectionEnd.inner); } else { if (transparent) PatternEditorTools::slotTransparentCopy(dst, src, 0, 7); else PatternEditorTools::slotCopy(dst, src, 0, 7); } } } } milkytracker-0.90.85+dfsg/src/tracker/SectionAdvancedEdit.h0000644000175000017500000000320311150223367022654 0ustar admin2admin2/* * tracker/SectionAdvancedEdit.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionAdvancedEdit.h * MilkyTracker * * Created by Peter Barth on 10.05.05. * */ #ifndef SECTIONADVANCEDEDIT__H #define SECTIONADVANCEDEDIT__H #include "BasicTypes.h" #include "Event.h" #include "SectionUpperLeft.h" class PPControl; class Tracker; class PPCheckBox; class SectionAdvancedEdit : public SectionUpperLeft { private: pp_int32 splitTrackNumSubsequentChannels; PPCheckBox* checkBoxSplitTrack; PPCheckBox* checkBoxSplitTrackNoteOff; public: SectionAdvancedEdit(Tracker& tracker); virtual ~SectionAdvancedEdit(); // Derived from SectionAbstract virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init() { SectionUpperLeft::init(); } virtual void init(pp_int32 x, pp_int32 y); virtual void show(bool bShow) { SectionUpperLeft::show(bShow); } virtual void update(bool repaint = true); friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/PlayerController.h0000644000175000017500000001443211150223367022322 0ustar admin2admin2/* * tracker/PlayerController.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PlayerController.h * MilkyTracker * * Created by Peter Barth on Tue Mar 15 2005. * */ #ifndef __PLAYERCONTROLLER_H__ #define __PLAYERCONTROLLER_H__ #include "MilkyPlayCommon.h" #include "TrackerConfig.h" class XModule; struct TXMSample; struct TEnvelope; class PlayerController { public: enum PlayModes { PlayMode_Auto, PlayMode_ProTracker2, PlayMode_ProTracker3, PlayMode_ScreamTracker3, PlayMode_FastTracker2, PlayMode_ImpulseTracker }; enum PlayModeOptions { PlayModeOptionPanning8xx = 1, PlayModeOptionPanningE8x = 2, // Only affects PTK playback mode PlayModeOptionForcePTPitchLimit = 4 }; private: class MasterMixer* mixer; class PlayerSTD* player; class ModuleEditor* moduleEditor; XModule* module; class PlayerCriticalSection* criticalSection; class PlayerStatusTracker* playerStatusTracker; bool patternPlay; bool playRowOnly; mp_sint32 patternIndex; mp_sint32 nextOrderIndexToPlay; mp_sint32 nextPatternIndexToPlay; mp_sint32 lastPosition, lastRow; bool wasPlayingPattern; bool suspended; mp_ubyte panning[TrackerConfig::MAXCHANNELS]; bool muteChannels[TrackerConfig::MAXCHANNELS]; bool recordChannels[TrackerConfig::MAXCHANNELS]; bool firstRecordChannelCall; mp_sint32 currentPlayingChannel; mp_sint32 numPlayerChannels; mp_sint32 numVirtualChannels; mp_sint32 totalPlayerChannels; bool useVirtualChannels; bool multiChannelKeyJazz; bool multiChannelRecord; mp_sint32 mixerDataCacheSize; mp_sint32* mixerDataCache; void assureNotSuspended(); void continuePlaying(bool assureNotSuspended); // no construction outside PlayerController(class MasterMixer* mixer, bool fakeScopes); bool detachDevice(); void reset(); public: ~PlayerController(); void attachModuleEditor(ModuleEditor* moduleEditor); ModuleEditor* getModuleEditor() { return moduleEditor; } PlayerCriticalSection* getCriticalSection() { return criticalSection; } void playSong(mp_sint32 startIndex, mp_sint32 rowPosition, mp_ubyte* muteChannels); void playPattern(mp_sint32 index, mp_sint32 songPosition, mp_sint32 rowPosition, mp_ubyte* muteChannels, bool playRowOnly = false); void setCurrentPatternIndex(mp_sint32 index); void stop(bool bResetMainVolume = true); void continuePlaying(); void restartPlaying(); bool isPlaying() const; bool isPlayingRowOnly() const; bool isActive() const; bool isPlayingPattern() const { return patternPlay; } bool isReallyPlayingPattern() const { return patternPlay && !playRowOnly; } bool isPlayingPattern(mp_sint32 index) const; bool isSuspended() const { return suspended; } void setNextOrderToPlay(mp_sint32 orderIndex); mp_sint32 getNextOrderToPlay() const; void setNextPatternToPlay(mp_sint32 patternIndex); mp_sint32 getNextPatternToPlay() const; void pause(); void unpause(); bool isPaused() const; void getSpeed(mp_sint32& BPM, mp_sint32& speed); void setSpeed(mp_sint32 BPM, mp_sint32 speed, bool adjustModuleHeader = true); void readjustSpeed(bool adjustModuleHeader = true); void playSample(const TXMSample& sample, mp_sint32 currentSamplePlayNote, mp_sint32 rangeStart = -1, mp_sint32 rangeEnd = -1); void stopSample(); void stopInstrument(mp_sint32 insIndex); void playNote(mp_ubyte chn, mp_sint32 note, mp_sint32 i, mp_sint32 vol = -1); void suspendPlayer(bool bResetMainVolume = true, bool stopPlaying = true); void resumePlayer(bool continuePlaying); void muteChannel(mp_sint32 c, bool m); bool isChannelMuted(mp_sint32 c); void recordChannel(mp_sint32 c, bool m); bool isChannelRecording(mp_sint32 c); private: bool reallocChannels(); void reallocateChannels(mp_sint32 moduleChannels = 32, mp_sint32 virtualChannels = 0); void setUseVirtualChannels(bool bUseVirtualChannels); void setMultiChannelKeyJazz(bool b) { multiChannelKeyJazz = b; } void setMultiChannelRecord(bool b) { multiChannelRecord = b; } public: void resetFirstPlayingChannel(); mp_sint32 getNextPlayingChannel(mp_sint32 currentChannel); void initRecording(); mp_sint32 getNextRecordingChannel(mp_sint32 currentChannel); mp_sint32 getSongMainVolume(); void resetMainVolume(); // in seconds void resetPlayTimeCounter(); mp_int64 getPlayTime(); mp_ubyte getPanning(mp_ubyte chn) { return panning[chn]; } void setPanning(mp_ubyte chn, mp_ubyte pan); const pp_uint8* getPanningTable() { return (const pp_uint8*)&panning; } void getPosition(mp_sint32& pos, mp_sint32& row); void getPosition(mp_sint32& order, mp_sint32& row, mp_sint32& ticker); void setPatternPos(mp_sint32 pos, mp_sint32 row); // change playmode void switchPlayMode(PlayModes playMode, bool exactSwitch = true); PlayModes getPlayMode(); void enablePlayModeOption(PlayModeOptions option, bool b); bool isPlayModeOptionEnabled(PlayModeOptions option); // queries on the mixer mp_sint32 getAllNumPlayingChannels(); mp_sint32 getPlayerNumPlayingChannels(); private: mp_sint32 getCurrentSamplePosition(); mp_sint32 getCurrentBeatIndex(); public: bool isSamplePlaying(const TXMSample& smp, mp_sint32 channel, mp_sint32& pos, mp_sint32& vol, mp_sint32& pan); bool isEnvelopePlaying(const TEnvelope& envelope, mp_sint32 envelopeType, mp_sint32 channel, mp_sint32& pos); bool isNotePlaying(mp_sint32 ins, mp_sint32 channel, mp_sint32& note, bool& muted); class SampleDataFetcher { public: virtual void fetchSampleData(mp_sint32 sample) = 0; }; void grabSampleData(mp_uint32 chnIndex, mp_sint32 count, mp_sint32 fMul, SampleDataFetcher& fetcher); bool hasSampleData(mp_uint32 chnIndex); friend class PlayerMaster; friend class PlayerStatusTracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/InputControlListener.cpp0000644000175000017500000003127511150223367023527 0ustar admin2admin2/* * tracker/InputControlListener.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * InputControlListener.cpp * MilkyTracker * * Created by Peter Barth on 22.04.05. * */ #include #include "InputControlListener.h" #include "PPUI.h" #include "Tracker.h" #include "Screen.h" #include "ControlIDs.h" #include "SIPButtons.h" #include "PatternEditorControl.h" #include "RecorderLogic.h" static const pp_uint16 scanCodesLetters[] = {SC_A, SC_B, SC_C, SC_D, SC_E, SC_F, SC_G, SC_H, SC_I, SC_J, SC_K, SC_L, SC_M, SC_N, SC_O, SC_P, SC_Q, SC_R, SC_S, SC_T, SC_U, SC_V, SC_W, SC_X, SC_Z, SC_Y}; static const pp_uint16 scanCodesNumbers[] = {SC_0, SC_1, SC_2, SC_3, SC_4, SC_5, SC_6, SC_7, SC_8, SC_9}; static const pp_uint8 shiftNumbers[] = {')','!','@','#','$','%','^','&','*','('}; void InputControlListener::sendKey(EEventDescriptor event, pp_uint16 vk, pp_uint16 sc, pp_uint16 chr) { PPScreen* screen = tracker.screen; if (event == eKeyDown || eKeyUp) { // Send keydown to simulate note key press pp_uint16 vksc[3] = {vk, sc, chr}; PPEvent keyDown(event, &vksc, sizeof(vksc)); screen->raiseEvent(&keyDown); } else if (event == eKeyChar) { // Send keydown to simulate note key press pp_uint16 vksc[2] = {vk, sc}; PPEvent keyDown(event, &vksc, sizeof(vksc)); screen->raiseEvent(&keyDown); } } void InputControlListener::sendNote(pp_int32 v, pp_int32 volume/* = -1*/) { PPScreen* screen = tracker.screen; pp_int32 note = v & 0xFFFF; pp_int32 octave = (note / 12) + 1; pp_int32 realNote = note % 12; // virtual keys are actually not relevant for note input static const pp_uint16 noteKeys[12] = {0x5a, 0x53, 0x58, 0x44, 0x43, 0x56, 0x47, 0x42, 0x48, 0x4e, 0x4a, 0x4d}; static const pp_uint16 noteKeyScancodes[12] = {SC_Y, SC_S, SC_X, SC_D, SC_C, SC_V, SC_G, SC_B, SC_H, SC_N, SC_J, SC_M}; // ascii keys are actually not relevant for note input static const pp_uint16 noteKeyAscii[12] = {'z', 's', 'x', 'd', 'c', 'v', 'g', 'b', 'h', 'n', 'j', 'm'}; pp_uint16 vk[3]; // Save current octave pp_int32 currentOctave = tracker.getPatternEditor()->getCurrentOctave(); tracker.getPatternEditor()->setCurrentOctave(octave); tracker.recorderLogic->setKeyVolume(volume); vk[0] = noteKeys[realNote]; vk[1] = noteKeyScancodes[realNote]; vk[2] = noteKeyAscii[realNote]; // Send keydown/keyup to simulate note key press PPEvent event((v >> 16) ? eKeyUp : eKeyDown, &vk, sizeof(vk)); screen->raiseEvent(&event); tracker.recorderLogic->setKeyVolume(-1); // restore octave tracker.getPatternEditor()->setCurrentOctave(currentOctave); } pp_int32 InputControlListener::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case INPUT_BUTTON_CAPSLOCK: { capsLockPressed = !capsLockPressed; PPButton* button = reinterpret_cast(sender); button->setPressed(capsLockPressed); refreshSIP(); break; } case INPUT_BUTTON_LSHIFT: { lShiftPressed = !lShiftPressed; PPButton* button = reinterpret_cast(sender); button->setPressed(lShiftPressed); refreshSIP(); break; } case INPUT_BUTTON_RSHIFT: { rShiftPressed = !rShiftPressed; PPButton* button = reinterpret_cast(sender); button->setPressed(rShiftPressed); refreshSIP(); break; } case INPUT_BUTTON_0: case INPUT_BUTTON_1: case INPUT_BUTTON_2: case INPUT_BUTTON_3: case INPUT_BUTTON_4: case INPUT_BUTTON_5: case INPUT_BUTTON_6: case INPUT_BUTTON_7: case INPUT_BUTTON_8: case INPUT_BUTTON_9: { pp_uint16 key[2]; key[0] = (pp_uint16)(reinterpret_cast(sender)->getID() - INPUT_BUTTON_0 + '0'); key[1] = scanCodesNumbers[key[0] - '0']; sendKey(eKeyDown, key[0], key[1], uppercase() ? key[0] : shiftNumbers[key[0]-'0']); sendKey(eKeyChar, uppercase() ? key[0] : shiftNumbers[key[0]-'0'], key[1], 0); sendKey(eKeyUp, key[0], key[1], uppercase() ? key[0] : shiftNumbers[key[0]-'0']); handleModifiers(); break; } case INPUT_BUTTON_A: case INPUT_BUTTON_B: case INPUT_BUTTON_C: case INPUT_BUTTON_D: case INPUT_BUTTON_E: case INPUT_BUTTON_F: case INPUT_BUTTON_G: case INPUT_BUTTON_H: case INPUT_BUTTON_I: case INPUT_BUTTON_J: case INPUT_BUTTON_K: case INPUT_BUTTON_L: case INPUT_BUTTON_M: case INPUT_BUTTON_N: case INPUT_BUTTON_O: case INPUT_BUTTON_P: case INPUT_BUTTON_Q: case INPUT_BUTTON_R: case INPUT_BUTTON_S: case INPUT_BUTTON_T: case INPUT_BUTTON_U: case INPUT_BUTTON_V: case INPUT_BUTTON_W: case INPUT_BUTTON_X: case INPUT_BUTTON_Y: case INPUT_BUTTON_Z: { pp_uint16 key[2]; key[0] = (pp_uint16)(reinterpret_cast(sender)->getID() - INPUT_BUTTON_A + 'A'); key[1] = scanCodesLetters[key[0] - 'A']; sendKey(eKeyDown, key[0], key[1], !uppercase() ? key[0] : tolower(key[0])); sendKey(eKeyChar, !uppercase() ? key[0] : tolower(key[0]), key[1], 0); sendKey(eKeyUp, key[0], key[1], !uppercase() ? key[0] : tolower(key[0])); handleModifiers(); break; } case INPUT_BUTTON_MINUS: { sendKey(eKeyDown, 189, 12, !uppercase() ? '_' : '-'); sendKey(eKeyChar, !uppercase() ? '_' : '-', 12, 0); sendKey(eKeyUp, 189, 12, !uppercase() ? '_' : '-'); handleModifiers(); break; } case INPUT_BUTTON_PLUS: { sendKey(eKeyDown, 187, 13, !uppercase() ? '+' : '='); sendKey(eKeyChar, !uppercase() ? '+' : '=', 13, 0); sendKey(eKeyUp, 187, 13, !uppercase() ? '+' : '='); handleModifiers(); break; } case INPUT_BUTTON_BRACKETOPEN: { sendKey(eKeyDown, 219, 26, !uppercase() ? '{' : '['); sendKey(eKeyChar, !uppercase() ? '{' : '[', 26, 0); sendKey(eKeyUp, 219, 26, !uppercase() ? '{' : '['); handleModifiers(); break; } case INPUT_BUTTON_BRACKETCLOSE: { sendKey(eKeyDown, 221, 27, !uppercase() ? '}' : ']'); sendKey(eKeyChar, !uppercase() ? '}' : ']', 27, 0); sendKey(eKeyUp, 221, 27, !uppercase() ? '}' : ']'); handleModifiers(); break; } case INPUT_BUTTON_SEMICOLON: { sendKey(eKeyDown, 186, 39, !uppercase() ? ':' : ';'); sendKey(eKeyChar, !uppercase() ? ':' : ';', 39, 0); sendKey(eKeyUp, 186, 39, !uppercase() ? ':' : ';'); handleModifiers(); break; } case INPUT_BUTTON_TICK: { sendKey(eKeyDown, 222, 40, !uppercase() ? '\"' : '\''); sendKey(eKeyChar, !uppercase() ? '\"' : '\'', 40, 0); sendKey(eKeyUp, 222, 40, !uppercase() ? '\"' : '\''); handleModifiers(); break; } case INPUT_BUTTON_BACKSLASH: { sendKey(eKeyDown, 220, 43, !uppercase() ? '|' : '\\'); sendKey(eKeyChar, !uppercase() ? '|' : '\\', 43, 0); sendKey(eKeyUp, 220, 43, !uppercase() ? '|' : '\\'); handleModifiers(); break; } case INPUT_BUTTON_TILDE: { sendKey(eKeyDown, 226, 86, !uppercase() ? '|' : '~'); sendKey(eKeyChar, !uppercase() ? '|' : '~', 86, 0); sendKey(eKeyUp, 226, 86, !uppercase() ? '|' : '~'); handleModifiers(); break; } case INPUT_BUTTON_COMMA: { sendKey(eKeyDown, 188, 51, !uppercase() ? '<' : ','); sendKey(eKeyChar, !uppercase() ? '<' : ',', 51, 0); sendKey(eKeyUp, 188, 51, !uppercase() ? '<' : ','); handleModifiers(); break; } case INPUT_BUTTON_PERIOD: { sendKey(eKeyDown, 190, 52, !uppercase() ? '>' : '.'); sendKey(eKeyChar, !uppercase() ? '>' : '.', 52, 0); sendKey(eKeyUp, 190, 52, !uppercase() ? '>' : '.'); handleModifiers(); break; } case INPUT_BUTTON_SLASH: { sendKey(eKeyDown, 191, 53, !uppercase() ? '?' : '/'); sendKey(eKeyChar, !uppercase() ? '?' : '/', 53, 0); sendKey(eKeyUp, 191, 53, !uppercase() ? '?' : '/'); handleModifiers(); break; } case INPUT_BUTTON_INS: sendKey(eKeyDown, VK_INSERT, 0, 0); sendKey(eKeyUp, VK_INSERT, 0, 0); break; case INPUT_BUTTON_DEL: sendKey(eKeyDown, VK_DELETE, 0, 0); sendKey(eKeyUp, VK_DELETE, 0, 0); break; case INPUT_BUTTON_BACK: sendKey(eKeyDown, VK_BACK, 0, 0); sendKey(eKeyUp, VK_BACK, 0, 0); break; case INPUT_BUTTON_INSLINE: sendKey(eKeyDown, VK_SHIFT, 0, 0); ::setForceKeyModifier(KeyModifierSHIFT); sendKey(eKeyDown, VK_INSERT, 0, 0); sendKey(eKeyUp, VK_INSERT, 0, 0); ::clearForceKeyModifier(KeyModifierSHIFT); sendKey(eKeyUp, VK_SHIFT, 0, 0); break; case INPUT_BUTTON_BACKLINE: sendKey(eKeyDown, VK_SHIFT, 0, 0); ::setForceKeyModifier(KeyModifierSHIFT); sendKey(eKeyDown, VK_BACK, 0, 0); sendKey(eKeyUp, VK_BACK, 0, 0); ::clearForceKeyModifier(KeyModifierSHIFT); sendKey(eKeyUp, VK_SHIFT, 0, 0); break; case INPUT_BUTTON_WTF: if (!uppercase()) { ::setForceKeyModifier(KeyModifierSHIFT); sendKey(eKeyDown, VK_SHIFT, 0, 0); } sendKey(eKeyDown, VK_OEM_3, SC_WTF, '\x60'); sendKey(eKeyChar, '\x60', 53, 0); sendKey(eKeyUp, VK_OEM_3, SC_WTF, '\x60'); if (!uppercase()) { ::clearForceKeyModifier(KeyModifierSHIFT); sendKey(eKeyUp, VK_SHIFT, 0, 0); } handleModifiers(); break; case INPUT_BUTTON_KEYOFF: sendKey(eKeyDown, tracker.editMode == EditModeMilkyTracker ? VK_OEM_3 : VK_OEM_102, tracker.editMode == EditModeMilkyTracker ? SC_WTF : SC_SMALLERGREATER, 0); sendKey(eKeyUp, tracker.editMode == EditModeMilkyTracker ? VK_OEM_3 : VK_OEM_102, tracker.editMode == EditModeMilkyTracker ? SC_WTF : SC_SMALLERGREATER, 0); break; case INPUT_BUTTON_SPACE: sendKey(eKeyDown, VK_SPACE, 666, ' '); sendKey(eKeyChar, ' ', 666, 0); sendKey(eKeyUp, VK_SPACE, 666, ' '); handleModifiers(); break; case INPUT_BUTTON_ENTER: sendKey(eKeyDown, VK_RETURN, 777, 0x0A); sendKey(eKeyChar, 0x0A, 777, 0); sendKey(eKeyUp, VK_RETURN, 777, 0x0A); handleModifiers(); break; case INPUT_BUTTON_TAB: sendKey(eKeyDown, VK_TAB, 888, 0x08); sendKey(eKeyChar, 0x08, 888, 0); sendKey(eKeyUp, VK_TAB, 888, 0x08); handleModifiers(); break; case INPUT_BUTTON_SHRINK: { if (event->getID() != eCommand) break; tracker.setInputControl(Tracker::SIPDefault); tracker.screen->paint(); break; } case INPUT_BUTTON_EXPAND: { if (event->getID() != eCommand) break; tracker.setInputControl(Tracker::SIPExtended); tracker.screen->paint(); break; } } } else if (event->getID() == eSelection) { switch (reinterpret_cast(sender)->getID()) { case PIANO_CONTROL: { pp_int32 v = *((pp_int32*)event->getDataPtr()); sendNote(v); break; } } } return 0; } void InputControlListener::handleModifiers() { PPButton* button = static_cast(tracker.inputContainerExtended->getControlByID(INPUT_BUTTON_LSHIFT)); ASSERT(button); if (lShiftPressed && button->isPressed()) { button->setPressed(false); lShiftPressed = false; } refreshSIP(); } void InputControlListener::refreshSIP() { pp_int32 i; PPContainer* container = tracker.inputContainerExtended; for (i = 0; i < (signed)sizeof(keyLine_0_lowerCase); i++) { PPButton* button = static_cast(container->getControlByID(keyLineIDs_0[i])); button->setText(uppercase() ? keyLine_0_lowerCase[i] : keyLine_0_upperCase[i]); } for (i = 0; i < (signed)sizeof(keyLine_1_lowerCase); i++) { PPButton* button = static_cast(container->getControlByID(keyLineIDs_1[i])); button->setText(uppercase() ? keyLine_1_lowerCase[i] : keyLine_1_upperCase[i]); } for (i = 0; i < (signed)sizeof(keyLine_2_lowerCase); i++) { PPButton* button = static_cast(container->getControlByID(keyLineIDs_2[i])); button->setText(uppercase() ? keyLine_2_lowerCase[i] : keyLine_2_upperCase[i]); } for (i = 0; i < (signed)sizeof(keyLine_3_lowerCase); i++) { PPButton* button = static_cast(container->getControlByID(keyLineIDs_3[i])); button->setText(uppercase() ? keyLine_3_lowerCase[i] : keyLine_3_upperCase[i]); } tracker.screen->paintControl(container); } milkytracker-0.90.85+dfsg/src/tracker/RecorderLogic.cpp0000755000175000017500000002237211150223367022105 0ustar admin2admin2/* * tracker/PlayerLogic.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * RecorderLogic.cpp * MilkyTracker * * Created by Peter Barth on 09.04.08. * */ #include "RecorderLogic.h" #include "Tracker.h" #include "TrackerConfig.h" #include "PlayerController.h" #include "PlayerLogic.h" #include "PatternEditorControl.h" #include "RecPosProvider.h" #include "ModuleEditor.h" #include "Screen.h" void RecorderLogic::reset() { memset(keys, 0, sizeof(TKeyInfo) * TrackerConfig::MAXNOTES); for (pp_int32 i = 0; i < TrackerConfig::MAXNOTES; i++) keys[i].channel = -1; } RecorderLogic::RecorderLogic(Tracker& tracker) : tracker(tracker), recordMode(false), recordKeyOff(true), recordNoteDelay(false) { keys = new TKeyInfo[TrackerConfig::MAXNOTES]; reset(); keyVolume = -1; } RecorderLogic::~RecorderLogic() { delete[] keys; } void RecorderLogic::sendNoteDownToPatternEditor(PPEvent* event, pp_int32 note, PatternEditorControl* patternEditorControl) { PlayerController* playerController = tracker.playerController; PatternEditor* patternEditor = patternEditorControl->getPatternEditor(); pp_int32 i; if (note >= 1 && note != PatternTools::getNoteOffNote() /* Key Off */) { // get current channel from pattern editor (= channel to play) pp_int32 chn = patternEditorControl->getCurrentChannel(); // if this is a valid note pp_int32 ins = tracker.getInstrumentToPlay(note, playerController); if (ins < 0) { if (event) event->cancel(); return; } bool record = (tracker.editMode == EditModeMilkyTracker ? tracker.screen->hasFocus(patternEditorControl) : recordMode); bool releasePlay = false; bool isLiveRecording = playerController->isPlaying() && !playerController->isPlayingRowOnly() && record && tracker.shouldFollowSong(); // when we're not live recording, we need to decide if we're editing if (!isLiveRecording) { releasePlay = !record; } // if we're live recording this is a "release" play, it means that the // note will not be repeated on a key being pressed, it will stay on // 'till the key is released, but only when the current selected column // is the note column else { releasePlay = patternEditorControl->getCursorPosInner() == 0; } if (releasePlay) { // Somewhere editing of text in an edit field takes place, // in that case we don't want to be playing anything if (tracker.isActiveEditing()) return; // take a look if this key is already pressed bool isPressed = false; for (i = 0; i < TrackerConfig::MAXNOTES; i++) { if (keys[i].note == note) { isPressed = true; break; } } // this key is already pressed, we won't play that note again if (isPressed) { // If we're live recording, this event should not be routed anywhere else // it terminates HERE! (event shall not be routed to the pattern editor) if (isLiveRecording && event) event->cancel(); return; } // if we're not recording, cycle through the channels // use jam-channels for playing if requested if (!isLiveRecording) { chn = playerController->getNextPlayingChannel(chn); } else { // Get next recording channel: The base for selection of the // next channel is the current channel within the pattern editor chn = playerController->getNextRecordingChannel(chn); } } else { // The cursor in the pattern editor must be located in the note column, // if not abort if (patternEditorControl->getCursorPosInner() != 0) { //event->cancel(); return; } else { pp_int32 newIns = patternEditor->getCurrentActiveInstrument(); if (newIns >= 0) ins = newIns; } } RecPosProvider recPosProvider(*playerController); // key is not pressed, play note and remember key + channel + position within module pp_int32 pos = -1, row = 0, ticker = 0; // if we are recording we are doing a query on the current position if (isLiveRecording) recPosProvider.getPosition(pos, row, ticker); else { pos = row = -1; } if (chn != -1) { for (i = 0; i < TrackerConfig::MAXNOTES; i++) { // key not pressed or note already playing on this channel if (!keys[i].note || (keys[i].channel == chn)) { keys[i].note = note; keys[i].ins = ins; keys[i].channel = chn; keys[i].pos = pos; keys[i].row = row; keys[i].playerController = playerController; break; } // if there is already a note playing on this channel // we "cut" the note //else if (keys[i].channel == chn) //{ // keys[i].note = keys[i].channel = 0; //} } // play it tracker.playerLogic->playNote(*playerController, (mp_ubyte)chn, note, (mp_ubyte)ins, keyVolume); // if we're recording send the note to the pattern editor if (isLiveRecording) { tracker.setChanged(); // update cursor to song position in case we're blocking refresh timer tracker.updateSongPosition(pos, row, true); pp_int32 posInner = patternEditorControl->getCursorPosInner(); patternEditorControl->setChannel(chn, posInner); patternEditorControl->setRow(row); // add delay note if requested if (ticker && recordNoteDelay) patternEditor->writeDirectEffect(1, 0x3D, ticker > 0xf ? 0xf : ticker, chn, row, pos); if (keyVolume != -1 && keyVolume >= 0 && keyVolume <= 255) patternEditor->writeDirectEffect(0, 0xC, (pp_uint8)keyVolume, chn, row, pos); patternEditor->writeDirectNote(note, chn, row, pos); tracker.screen->paintControl(patternEditorControl); // update cursor to song position in case we're blocking refresh timer //updateSongPosition(-1, -1, true); if (event) event->cancel(); } } else if (event) { event->cancel(); } } } void RecorderLogic::sendNoteUpToPatternEditor(PPEvent* event, pp_int32 note, PatternEditorControl* patternEditorControl) { // if this is a valid note look if we're playing something and release note by sending key-off if (note >= 1 && note <= ModuleEditor::MAX_NOTE) { PatternEditor* patternEditor = patternEditorControl->getPatternEditor(); pp_int32 pos = -1, row = 0, ticker = 0; bool record = (tracker.editMode == EditModeMilkyTracker ? tracker.screen->hasFocus(patternEditorControl) : recordMode); for (mp_sint32 i = 0; i < TrackerConfig::MAXNOTES; i++) { // found a playing channel if (keys[i].note == note) { PlayerController* playerController = tracker.playerController; if (keys[i].playerController) playerController = keys[i].playerController; bool isLiveRecording = playerController->isPlaying() && !playerController->isPlayingRowOnly() && record && tracker.shouldFollowSong(); bool recPat = false; RecPosProvider recPosProvider(*playerController); if (isLiveRecording) { recPosProvider.getPosition(pos, row, ticker); if (pos == -1) recPat = true; } else { pos = row = -1; } // send key off tracker.playerLogic->playNote(*playerController, (mp_ubyte)keys[i].channel, PatternTools::getNoteOffNote(), keys[i].ins); if (isLiveRecording && recordKeyOff) { tracker.setChanged(); // update cursor to song position in case we're blocking refresh timer tracker.updateSongPosition(pos, row, true); patternEditorControl->setRow(row); // if we're in the same slot => send key off by inserting key off effect if (keys[i].row == row && keys[i].pos == pos) { //mp_sint32 bpm, speed; //playerController->getSpeed(bpm, speed); patternEditor->writeDirectEffect(1, 0x14, ticker ? ticker : 1, keys[i].channel, row, pos); } // else write key off else { if (ticker && recordNoteDelay) patternEditor->writeDirectEffect(1, 0x14, ticker, keys[i].channel, row, pos); else patternEditor->writeDirectNote(PatternTools::getNoteOffNote(), keys[i].channel, row, pos); } tracker.screen->paintControl(patternEditorControl); // update cursor to song position in case we're blocking refresh timer //updateSongPosition(-1, -1, true); } keys[i].note = 0; keys[i].channel = -1; } } } } void RecorderLogic::init() { if (recordMode) tracker.playerController->initRecording(); } void RecorderLogic::initToggleEdit() { if (recordMode && (tracker.playerController->isPlaying())) tracker.playerController->initRecording(); } milkytracker-0.90.85+dfsg/src/tracker/DialogChannelSelector.h0000755000175000017500000000236311150223367023216 0ustar admin2admin2/* * tracker/DialogChannelSelector.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogChannelSelector.h * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #ifndef __DIALOGCHANNELSELECTOR_H__ #define __DIALOGCHANNELSELECTOR_H__ #include "DialogBase.h" class DialogChannelSelector : public PPDialogBase { private: class PPListBox* listBox; public: DialogChannelSelector(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption); PPListBox* getListBox() { return listBox; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/PlayerLogic.h0000644000175000017500000000406511150223367021235 0ustar admin2admin2/* * tracker/PlayerLogic.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PlayerLogic.h * MilkyTracker * * Created by Peter Barth on 21.12.07. * */ #ifndef __PLAYERLOGIC_H__ #define __PLAYERLOGIC_H__ #include "BasicTypes.h" class PlayerLogic { private: class Tracker& tracker; bool liveSwitch; bool stopBackgroundOnPlay; bool tracePlay; pp_int32 backupRow, backupIndex; bool rowPlay; static void stopPlayer(class PlayerController& playerController); public: PlayerLogic(Tracker& tracker); void setLiveSwitch(bool liveSwitch); bool getLiveSwitch() const { return liveSwitch; } void setStopBackgroundOnPlay(bool stopBackgroundOnPlay) { this->stopBackgroundOnPlay = stopBackgroundOnPlay; } bool getStopBackgroundOnPlay() const { return stopBackgroundOnPlay; } void playSong(pp_int32 row = 0); void playPattern(); void playPosition(bool rowOnly = false); void stopSong(); void stopAll(); void ensureSongStopped(bool bResetMainVolume, bool suspend); void ensureSongPlaying(bool continuePlaying); void continuePlayingPattern(); void continuePlayingSong(); void storePosition(); void restorePosition(); void playTrace(); void playRow(); void finishTraceAndRowPlay(); static void playNote(class PlayerController& playerController, pp_uint8 chn, pp_int32 note, pp_int32 i, pp_int32 vol = -1); friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/SampleEditorResampler.h0000755000175000017500000000236011150223367023265 0ustar admin2admin2/* * tracker/SampleEditorResampler.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SampleEditorResampler.h * MilkyTracker * * Created by Peter Barth on 06.01.08. * */ #ifndef __SAMPLEEDITORRESAMPLER_H__ #define __SAMPLEEDITORRESAMPLER_H__ #include "BasicTypes.h" class SampleEditorResampler { private: class XModule& module; struct TXMSample& sample; pp_uint32 type; public: SampleEditorResampler(XModule& module, TXMSample& sample, pp_uint32 type); virtual ~SampleEditorResampler(); bool resample(float oldRate, float newRate); }; #endif milkytracker-0.90.85+dfsg/src/tracker/TitlePageManager.h0000755000175000017500000000247011150223367022175 0ustar admin2admin2/* * tracker/TitlePageManager.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __TITLEPAGEMANAGER_H__ #define __TITLEPAGEMANAGER_H__ #include "BasicTypes.h" class TitlePageManager { private: class PPScreen& screen; public: TitlePageManager(PPScreen& screen); enum Pages { PageTitle, PageTime, PagePeak }; Pages getCurrentTitlePage(); void showTitlePage(Pages page, bool update = true); void showSongTitleEditField(bool update = true); void showTimeCounter(bool update = true); void showPeakControl(bool update = true); void setPeakControlHeadingColor(const PPColor& color, bool update = true); }; #endif milkytracker-0.90.85+dfsg/src/tracker/TrackerShortCuts.cpp0000644000175000017500000003621611150223367022633 0ustar admin2admin2/* * tracker/TrackerShortCuts.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TrackerShortCuts.cpp * MilkyTracker * * Created by Peter Barth on Thu May 19 2005. * */ #include "Tracker.h" #include "ControlIDs.h" #include "Screen.h" #include "Event.h" #include "PlayerController.h" #include "PlayerLogic.h" #include "RecorderLogic.h" #include "Container.h" #include "ListBox.h" #include "PatternEditorControl.h" #include "ModuleEditor.h" #include "TrackerConfig.h" #include "InputControlListener.h" #include "SectionInstruments.h" #include "SectionTranspose.h" #include "SectionDiskMenu.h" void Tracker::sendNoteDown(mp_sint32 note, pp_int32 volume/* = -1*/) { if (volume != -1 && volume > 255) volume = 255; // Volume here is between 0 to 255, but don't forget to make the volume FT2 compatible (0..64) inputControlListener->sendNote(note | InputControlListener::KEY_PRESS, volume == -1 ? -1 : (signed)PatternTools::normalizeVol(volume)); } void Tracker::sendNoteUp(mp_sint32 note) { // bit 16 indicates key release inputControlListener->sendNote(note | InputControlListener::KEY_RELEASE); } void Tracker::processShortcuts(PPEvent* event) { if (processMessageBoxShortcuts(event)) return; switch (editMode) { case EditModeMilkyTracker: processShortcutsMilkyTracker(event); break; case EditModeFastTracker: processShortcutsFastTracker(event); break; default: ASSERT(false); } } void Tracker::processShortcutsMilkyTracker(PPEvent* event) { if (event->getID() == eKeyDown) { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); pp_uint16 scanCode = *(((pp_uint16*)event->getDataPtr())+1); switch (keyCode) { case VK_F1: case VK_F2: case VK_F3: case VK_F4: case VK_F5: case VK_F6: case VK_F7: case VK_F8: case VK_F9: case VK_F10: case VK_F11: case VK_F12: { if (::getKeyModifier()) goto processBindings; if (static_cast(getPatternEditorControl()) != screen->getFocusedControl()) { getPatternEditorControl()->dispatchEvent(event); } break; } default: { processBindings: pp_int32 keyModifier = ::getKeyModifier(); bool res = executeBinding(eventKeyDownBindings, keyCode); if (res && !isActiveEditing()) event->cancel(); if (res || keyModifier) break; if (editMode == EditModeMilkyTracker) { if (sectionDiskMenu->isFileBrowserVisible() && sectionDiskMenu->fileBrowserHasFocus()) break; } PatternEditorControl* patternEditorControl = getPatternEditorControl(); // translate key to note pp_int32 note = patternEditorControl->ScanCodeToNote(scanCode); recorderLogic->sendNoteDownToPatternEditor(event, note, patternEditorControl); break; } } } else if (event->getID() == eKeyUp) { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); pp_uint16 scanCode = *(((pp_uint16*)event->getDataPtr())+1); switch (keyCode) { case VK_SPACE: { playerLogic->finishTraceAndRowPlay(); break; } default: { PatternEditorControl* patternEditorControl = getPatternEditorControl(); pp_int32 note = patternEditorControl->ScanCodeToNote(scanCode); recorderLogic->sendNoteUpToPatternEditor(event, note, patternEditorControl); } } } } void Tracker::selectNextOrder(bool wrap/* = false*/) { if (wrap && listBoxOrderList->isLastEntry()) { setOrderListIndex(0); return; } pp_uint16 vk[3] = {VK_DOWN, 0, 0}; PPEvent e(eKeyDown, &vk, sizeof(vk)); listBoxOrderList->dispatchEvent(&e); } void Tracker::selectPreviousOrder(bool wrap/* = false*/) { if (wrap && listBoxOrderList->isFirstEntry()) { setOrderListIndex(listBoxOrderList->getNumItems()-1); return; } pp_uint16 vk[3] = {VK_UP, 0, 0}; PPEvent e(eKeyDown, &vk, sizeof(vk)); listBoxOrderList->dispatchEvent(&e); } void Tracker::selectNextInstrument() { pp_uint16 vk[3] = {VK_DOWN, 0, 0}; PPEvent e(eKeyDown, &vk, sizeof(vk)); listBoxInstruments->dispatchEvent(&e); } void Tracker::selectPreviousInstrument() { pp_uint16 vk[3] = {VK_UP, 0, 0}; PPEvent e(eKeyDown, &vk, sizeof(vk)); listBoxInstruments->dispatchEvent(&e); } /////////////////////////////////////////////////////////////////////////////// // The Fasttracker II compatibility mode is really just a big hack, because // MilkyTracker uses focus handling on most editable controls while FT2 doesn't // ---------------------------------------------------------------------------- // 1. a defined set of keys always are always routed to to the pattern editor // 2. If record mode is ON all keyboard events are also routed to pattern editor // (no matter if it can handle them or not) // 3. Keys are not routed into any other control except for editing /////////////////////////////////////////////////////////////////////////////// void Tracker::processShortcutsFastTracker(PPEvent* event) { if (isActiveEditing()) return; /*if (screen->getFocusedControl() != static_cast(getPatternEditorControl())) { screen->setFocus(getPatternEditorControl()); screen->paintControl(getPatternEditorControl()); }*/ if (event->getID() == eKeyDown) { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); pp_uint16 scanCode = *(((pp_uint16*)event->getDataPtr())+1); switch (scanCode) { case SC_WTF: if (!::getKeyModifier() || ::getKeyModifier() == KeyModifierSHIFT) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); keyCode = 0; } break; // Place cursor in channel case SC_Q: case SC_W: case SC_E: case SC_R: case SC_T: case SC_Z: case SC_U: case SC_I: case SC_A: case SC_S: case SC_D: case SC_F: case SC_G: case SC_H: case SC_J: case SC_K: if (screen->getModalControl()) break; if (::getKeyModifier() == KeyModifierALT) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); keyCode = 0; } break; } switch (keyCode) { case VK_SPACE: { if (screen->getModalControl()) break; if (::getKeyModifier()) goto processOthers; if (playerController->isPlaying() || playerController->isPlayingPattern()) { playerLogic->stopSong(); event->cancel(); break; } playerLogic->stopSong(); eventKeyDownBinding_ToggleFT2Edit(); event->cancel(); break; } // Those are the key combinations which are always routed to pattern editor control as long // as we're in Fasttracker editing mode case VK_ALT: case VK_SHIFT: case VK_CONTROL: if (screen->getModalControl()) break; getPatternEditorControl()->dispatchEvent(event); event->cancel(); break; // Transpose (regardless of modifers) case VK_F1: case VK_F2: case VK_F7: case VK_F8: case VK_F9: case VK_F10: case VK_F11: case VK_F12: processShortcutsMilkyTracker(event); break; // Cut copy paste case VK_F3: case VK_F4: case VK_F5: case VK_F6: // Global meaning here if (::getKeyModifier()) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); break; } processShortcutsMilkyTracker(event); break; // Some special keys always going to the pattern editor (like undo, redo, mute etc.) case 'A': case 'C': case 'V': case 'X': case 'Z': case 'Y': if (screen->getModalControl()) { // those seem to be piano keys, they're used in some // modal dialogs for instrument preview playback if (!::getKeyModifier()) goto processOthers; break; } if (::getKeyModifier() == (KeyModifierCTRL|KeyModifierALT)) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); } else goto processOthers; break; case 'I': if (screen->getModalControl()) break; if (::getKeyModifier() == KeyModifierSHIFT) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); } else goto processOthers; break; case 'M': if (screen->getModalControl()) break; if (::getKeyModifier() == KeyModifierSHIFT || ::getKeyModifier() == (KeyModifierSHIFT|KeyModifierCTRL)) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); } else goto processOthers; break; case VK_UP: case VK_DOWN: case VK_LEFT: case VK_RIGHT: case VK_HOME: case VK_END: case VK_PRIOR: case VK_NEXT: if (screen->getModalControl()) break; if (!::getKeyModifier() || ::getKeyModifier() == KeyModifierALT || ::getKeyModifier() == (KeyModifierSHIFT|KeyModifierALT)) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); } else if (::getKeyModifier() == KeyModifierSHIFT) { switch (keyCode) { // Select instrument using Shift+Up/Down case VK_UP: case VK_DOWN: case VK_NEXT: case VK_PRIOR: listBoxInstruments->dispatchEvent(event); event->cancel(); break; // Select new order using Shift+Left/Right case VK_LEFT: { selectPreviousOrder(); event->cancel(); break; } case VK_RIGHT: { selectNextOrder(); event->cancel(); break; } } } else if (::getKeyModifier() == (KeyModifierSHIFT|KeyModifierCTRL)) { switch (keyCode) { // Select sample using Shift+Alt+Up/Down case VK_UP: case VK_DOWN: case VK_NEXT: case VK_PRIOR: listBoxSamples->dispatchEvent(event); event->cancel(); break; } } else if (::getKeyModifier() == KeyModifierCTRL) { switch (keyCode) { // Select pattern using Ctrl+Left/Right case VK_LEFT: eventKeyDownBinding_PreviousPattern(); event->cancel(); break; case VK_RIGHT: eventKeyDownBinding_NextPattern(); event->cancel(); break; } } goto processOthers; break; case VK_TAB: if (screen->getModalControl()) break; getPatternEditorControl()->dispatchEvent(event); event->cancel(); break; default: processOthers: processShortcutsMilkyTracker(event); if (screen->getModalControl()) break; if (recorderLogic->getRecordMode()) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); } // if recordMode is false and focus is on pattern editor // we need to cancel the event in order to prevent it // from going into the pattern editor else if (screen->getFocusedControl() == static_cast(getPatternEditorControl())) { event->cancel(); } } } else if (event->getID() == eKeyUp) { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); //pp_uint16 scanCode = *(((pp_uint16*)event->getDataPtr())+1); switch (keyCode) { // Those are the keykombinations which are always routed to pattern editor control as long // as we're in Fasttracker editing mode case VK_ALT: case VK_SHIFT: case VK_CONTROL: if (screen->getModalControl()) break; getPatternEditorControl()->dispatchEvent(event); event->cancel(); break; default: processShortcutsMilkyTracker(event); if (screen->getModalControl()) /*break;*/return; if (recorderLogic->getRecordMode()) { getPatternEditorControl()->dispatchEvent(event); event->cancel(); } // if recordMode is false and focus is on pattern editor // we need to cancel the event in order to prevent it // from going into the pattern editor else if (screen->getFocusedControl() == static_cast(getPatternEditorControl())) { event->cancel(); } } } } void Tracker::switchEditMode(EditModes mode) { bool b = (mode == EditModeMilkyTracker); PPContainer* container = static_cast(screen->getControlByID(CONTAINER_MENU)); ASSERT(container); // Assign keyboard bindings getPatternEditorControl()->setShowFocus(b); listBoxInstruments->setShowFocus(b); listBoxSamples->setShowFocus(b); listBoxOrderList->setShowFocus(b); sectionDiskMenu->setFileBrowserShowFocus(b); sectionDiskMenu->setCycleFilenames(b); container = static_cast(screen->getControlByID(CONTAINER_ABOUT)); ASSERT(container); static_cast(container->getControlByID(LISTBOX_SONGTITLE))->setShowFocus(b); if (b) { eventKeyDownBindings = eventKeyDownBindingsMilkyTracker; screen->setFocus(listBoxInstruments, false); } else { eventKeyDownBindings = eventKeyDownBindingsFastTracker; recorderLogic->setRecordMode(true); eventKeyDownBinding_ToggleFT2Edit(); } getPatternEditorControl()->switchEditMode(mode); editMode = mode; } // Process messagebox shortcuts (RETURN & ESC) // the modal dialogs only appear to be modal, we're still getting // keyboard events here in case a modal dialog box appears // this is the handler which allows for esc + return handling in case // of a modal dialog static void simulateMouseClickEvent(PPControl* ctrl) { PPPoint p = ctrl->getLocation(); p.x+=ctrl->getSize().width >> 1; p.y+=ctrl->getSize().height >> 1; PPEvent e1(eLMouseDown, &p, sizeof(PPPoint)); PPEvent e2(eLMouseUp, &p, sizeof(PPPoint)); ctrl->dispatchEvent(&e1); ctrl->dispatchEvent(&e2); } bool Tracker::processMessageBoxShortcuts(PPEvent* event) { PPControl* ctrl = screen->getModalControl(); if (ctrl == NULL || !ctrl->isContainer() || event->getID() != eKeyDown) return false; PPSimpleVector& controls = static_cast(ctrl)->getControls(); pp_int32 i; // if dialog contains list (list can also be an edit field btw.) // and something is being edited in that list we don't simulate // yes/no/cancel button presses for (i = 0; i < controls.size(); i++) { PPControl* ctrl = controls.get(i); if (ctrl->isListBox() && static_cast(ctrl)->isEditing()) return true; } // iterate over controls in dialog and see whether we can find // yes/no/cancel buttons // if that's the case we simulate mouse button press pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); for (i = 0; i < controls.size(); i++) { PPControl* ctrl = controls.get(i); switch (ctrl->getID()) { case PP_MESSAGEBOX_BUTTON_YES: if (keyCode == VK_RETURN) { simulateMouseClickEvent(ctrl); return true; } break; case PP_MESSAGEBOX_BUTTON_CANCEL: case PP_MESSAGEBOX_BUTTON_NO: if (keyCode == VK_ESCAPE) { simulateMouseClickEvent(ctrl); return true; } break; } } return false; } milkytracker-0.90.85+dfsg/src/tracker/DialogQuickChooseInstrument.h0000755000175000017500000000367411150223367024461 0ustar admin2admin2/* * tracker/DialogQuickChooseInstrument.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogQuickChooseInstrument.h * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #ifndef __DIALOGQUICKCHOOSEINSTRUMENT_H__ #define __DIALOGQUICKCHOOSEINSTRUMENT_H__ #include "DialogBase.h" class DialogQuickChooseInstrument : public PPDialogBase { private: pp_int32 value; pp_int32 valueRangeStart, valueRangeEnd, valueIncreaseStep; public: DialogQuickChooseInstrument(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption); pp_int32 getValue() { return value; } void setValue(pp_int32 val) { if (val < valueRangeStart) val = valueRangeStart; if (val > valueRangeEnd) val = valueRangeEnd; value = val; updateListBoxes(); } void setValueCaption(const PPString& caption); virtual void show(bool b = true); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); static pp_uint16 numPadKeyToValue(pp_uint16 keyCode); private: void fitListBoxes(); void fitListBox(pp_int32 id, pp_int32 valueRangeStart, pp_int32 valueRangeEnd); void updateListBoxes(); void updateListBox(pp_int32 id, pp_int32 val); void listBoxEnterEditState(pp_int32 id); void commitChanges(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/Undo.h0000644000175000017500000002120711150223367017725 0ustar admin2admin2/* * tracker/Undo.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __UNDO_H__ #define __UNDO_H__ #include "BasicTypes.h" #include "UndoStack.h" #include "XModule.h" #define UNDODEPTH_ENVELOPEEDITOR 32 #define UNDOHISTORYSIZE_ENVELOPEEDITOR 8 #define UNDODEPTH_PATTERNEDITOR 32 #define UNDOHISTORYSIZE_PATTERNEDITOR 8 #define UNDODEPTH_SAMPLEEDITOR 16 #define UNDOHISTORYSIZE_SAMPLEEDITOR 4 //--- This is what we save -------------------------------------------------- class UndoStackEntry { public: class UserData { private: pp_uint8* data; pp_uint32 dataLen; public: UserData() : data(NULL), dataLen(0) { } UserData(const pp_uint8* data, pp_uint32 dataLen) : data(NULL), dataLen(dataLen) { this->data = new pp_uint8[dataLen]; memcpy(this->data, data, dataLen); } UserData(const UserData& src) : data(NULL) { this->data = new pp_uint8[src.dataLen]; memcpy(this->data, src.data, src.dataLen); this->dataLen = src.dataLen; } ~UserData() { delete[] this->data; } UserData& operator=(const UserData& src) { if (this != &src) { delete[] this->data; this->data = new pp_uint8[src.dataLen]; memcpy(this->data, src.data, src.dataLen); this->dataLen = src.dataLen; } return *this; } const pp_uint8* getData() const { return data; } pp_uint32 getDataLen() const { return dataLen; } void clear() { delete[] this->data; this->data = NULL; dataLen = 0; } }; private: UserData userData; protected: UndoStackEntry(const UserData* userData) { if (userData != NULL) this->userData = *userData; } virtual ~UndoStackEntry() { } void copyBasePart(const UndoStackEntry& src) { this->userData = src.userData; } public: const UserData& getUserData() const { return userData; } }; // Undo information from pattern editor class PatternUndoStackEntry : public UndoStackEntry { public: // Construction (new element) PatternUndoStackEntry(const TXMPattern& pattern, const pp_int32 cursorPositionChannel, const pp_int32 cursorPositionRow, const pp_int32 cursorPositionInner, const UserData* userData = NULL); // Copy ctor PatternUndoStackEntry(const PatternUndoStackEntry& source); // dtor virtual ~PatternUndoStackEntry(); // get your pattern const TXMPattern& GetPattern() const { return pattern; } pp_int32 getCursorPositionChannel() const { return cursorPositionChannel; } pp_int32 getCursorPositionRow() const { return cursorPositionRow; } pp_int32 getCursorPositionInner() const { return cursorPositionInner; } // assignment operator PatternUndoStackEntry& operator=(const PatternUndoStackEntry& source); // comparison is necessary too bool operator==(const PatternUndoStackEntry& source); bool operator!=(const PatternUndoStackEntry& source); private: TXMPattern pattern; pp_int32 cursorPositionChannel; pp_int32 cursorPositionRow; pp_int32 cursorPositionInner; }; // Less memory consumption than TEnvelope because XMs can only handle 12 envelope points struct TSmallEnvelope { mp_uword env[12][2]; mp_ubyte num,sustain,loops,loope,type; }; // Undo information from Envelope Editor class EnvelopeUndoStackEntry : public UndoStackEntry { public: EnvelopeUndoStackEntry() : UndoStackEntry(NULL), invalid(false) { } // Construction EnvelopeUndoStackEntry(const TEnvelope& env, const UserData* userData = NULL) : UndoStackEntry(userData), invalid(false) { ASSERT(&env != NULL); ASSERT(env.num <= 12); envelope.num = env.num; envelope.sustain = env.sustain; envelope.loops = env.loops; envelope.loope = env.loope; envelope.type = env.type; for (pp_int32 i = 0; i < 12; i++) { envelope.env[i][0] = env.env[i][0]; envelope.env[i][1] = env.env[i][1]; } } EnvelopeUndoStackEntry(const EnvelopeUndoStackEntry& src) : UndoStackEntry(&src.getUserData()) { envelope = src.envelope; invalid = src.invalid; } // assignment operator EnvelopeUndoStackEntry& operator=(const EnvelopeUndoStackEntry& source); // comparison is necessary too bool operator==(const EnvelopeUndoStackEntry& source); bool operator!=(const EnvelopeUndoStackEntry& source); // get your envelope void GetEnvelope(TEnvelope& env) const; void SetInvalid(bool b) { invalid = b; } private: TSmallEnvelope envelope; bool invalid; }; struct TXMSample; // Undo information from Sample Editor class SampleUndoStackEntry : public UndoStackEntry { public: SampleUndoStackEntry() : UndoStackEntry(NULL) { } SampleUndoStackEntry(const TXMSample& sample, pp_int32 selectionStart, pp_int32 selectionEnd, const UserData* userData = NULL); SampleUndoStackEntry(const SampleUndoStackEntry& src); virtual ~SampleUndoStackEntry(); // assignment operator SampleUndoStackEntry& operator=(const SampleUndoStackEntry& source); // comparison is necessary too bool operator==(const SampleUndoStackEntry& source); bool operator!=(const SampleUndoStackEntry& source); pp_uint32 getSampLen() const { return samplen; } pp_uint32 getLoopStart() const { return loopstart; } pp_uint32 getLoopLen() const { return looplen; } pp_uint32 getFlags() const { return flags; } mp_sbyte getRelNote() const { return relnote; } mp_sbyte getFineTune() const { return finetune; } const pp_uint8* getBuffer() const { return buffer; } pp_int32 getSelectionStart() const { return selectionStart; } pp_int32 getSelectionEnd() const { return selectionEnd; } private: // from sample pp_uint32 samplen, loopstart, looplen; mp_sbyte relnote, finetune; pp_uint8* buffer; pp_uint8 flags; // from sample editor pp_int32 selectionStart; pp_int32 selectionEnd; pp_int32 checkSum; void calcCheckSum(); }; // undo history maintainance template struct HistoryEntry { Key* key; PPUndoStack* undoStack; }; template class UndoHistory { private: // undo/redo information PPUndoStack* currentUndoStack; HistoryEntry* patternHistory; pp_int32 patternHistoryNumEntries; pp_int32 size; public: UndoHistory(pp_int32 defaultSize = 8) : currentUndoStack(NULL), patternHistoryNumEntries(0), size(defaultSize) { patternHistory = new HistoryEntry[size]; for (pp_int32 i = 0; i < size; i++) { patternHistory[i].key = NULL; patternHistory[i].undoStack = NULL; } } ~UndoHistory() { for (pp_int32 i = 0; i < patternHistoryNumEntries; i++) if (patternHistory[i].undoStack && patternHistory[i].undoStack != currentUndoStack) delete patternHistory[i].undoStack; delete[] patternHistory; } PPUndoStack* getUndoStack(Key* newKey, Key* oldKey, PPUndoStack* oldUndoStack) { if (oldUndoStack) { if (patternHistoryNumEntries < size) { ASSERT(patternHistory[patternHistoryNumEntries].key == NULL); ASSERT(patternHistory[patternHistoryNumEntries].undoStack == NULL); patternHistory[patternHistoryNumEntries].key = oldKey; patternHistory[patternHistoryNumEntries].undoStack = oldUndoStack; patternHistoryNumEntries++; } else { ASSERT(patternHistoryNumEntries == size); delete patternHistory[0].undoStack; for (pp_int32 i = 0; i < patternHistoryNumEntries-1; i++) patternHistory[i] = patternHistory[i+1]; patternHistory[patternHistoryNumEntries-1].key = oldKey; patternHistory[patternHistoryNumEntries-1].undoStack = oldUndoStack; } } bool found = false; for (pp_int32 i = 0; i < patternHistoryNumEntries; i++) { if (patternHistory[i].key == newKey) { oldUndoStack = patternHistory[i].undoStack; for (pp_int32 j = i; j < patternHistoryNumEntries-1; j++) patternHistory[j] = patternHistory[j+1]; patternHistory[patternHistoryNumEntries-1].key = NULL; patternHistory[patternHistoryNumEntries-1].undoStack = NULL; patternHistoryNumEntries--; found = true; break; } } if (found) { currentUndoStack = oldUndoStack; return oldUndoStack; } return NULL; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionAbstract.cpp0000644000175000017500000002153311150223367022445 0ustar admin2admin2/* * tracker/SectionAbstract.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionAbstract.cpp * MilkyTracker * * Created by Peter Barth on 06.01.06. * */ #include "SectionAbstract.h" #include "ControlIDs.h" #include "Control.h" #include "Container.h" #include "ListBox.h" #include "Tracker.h" #include "DialogBase.h" #include "SectionSwitcher.h" SectionAbstract::~SectionAbstract() { delete responder; delete dialog; } void SectionAbstract::showMessageBox(pp_uint32 id, const PPString& text, bool yesnocancel/* = false*/) { if (dialog) { delete dialog; dialog = NULL; } dialog = new PPDialogBase(tracker.screen, responder, id, text, yesnocancel ? PPDialogBase::MessageBox_YESNOCANCEL : PPDialogBase::MessageBox_OKCANCEL); dialog->show(); } #ifdef __LOWRES__ void SectionAbstract::replaceAndResizeInstrumentListContainer(pp_int32 listBoxContainerHeight) { PPScreen* screen = tracker.screen; PPContainer* ctrl = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); ctrl->getControlByID(BUTTON_INSTRUMENT)->setLocation(PPPoint(3,1)); ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->setLocation(PPPoint(160+3,3)); ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->setLocation(PPPoint(97,2)); ctrl->getControlByID(BUTTON_INSTRUMENTS_MINUS)->setLocation(PPPoint(97 + ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->getSize().width+1,2)); PPSize size = tracker.listBoxInstruments->getSize(); size.height = listBoxContainerHeight - 15; size.width = screen->getWidth() / 2 - 4; tracker.listBoxInstruments->setSize(size); PPPoint p = tracker.listBoxInstruments->getLocation(); p.x = 2; p.y = 13; tracker.listBoxInstruments->setLocation(p); size = tracker.listBoxSamples->getSize(); size.height = listBoxContainerHeight - 15; size.width = screen->getWidth() / 2 - 4; tracker.listBoxSamples->setSize(size); p = tracker.listBoxSamples->getLocation(); p.x = 2 + (screen->getWidth() / 2); p.y = 13; tracker.listBoxSamples->setLocation(p); // samples listbox always visible tracker.listBoxSamples->hide(false); size = ctrl->getSize(); size.height = listBoxContainerHeight; size.width = screen->getWidth(); ctrl->setSize(size); ctrl->setLocation(PPPoint(0,0)); } void SectionAbstract::replaceInstrumentListBoxes(bool b, pp_int32 listBoxContainerHeight/* = REPLACEDINSTRUMENTLISTBOXESHEIGHT*/) { PPScreen* screen = tracker.screen; if (b) { tracker.showMainMenu(false, true); tracker.sectionSwitcher->showSubMenu(SectionSwitcher::ActiveLowerSectionPageInstruments, false); screen->getControlByID(CONTAINER_LOWRES_TINYMENU)->show(false); PPContainer* ctrl = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); oldInstrumentListContainerSize = ctrl->getSize(); oldInstrumentListContainerLocation = ctrl->getLocation(); oldInstrumentListSize = tracker.listBoxInstruments->getSize(); oldInstrumentListLocation = tracker.listBoxInstruments->getLocation(); oldSampleListSize = tracker.listBoxSamples->getSize(); oldSampleListLocation = tracker.listBoxSamples->getLocation(); oldControlLocations[0] = ctrl->getControlByID(BUTTON_INSTRUMENT)->getLocation(); oldControlLocations[1] = ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->getLocation(); oldControlLocations[2] = ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->getLocation(); oldControlLocations[3] = ctrl->getControlByID(BUTTON_INSTRUMENTS_MINUS)->getLocation(); visibility[0] = ctrl->getControlByID(LISTBOX_INSTRUMENTS)->isHidden(); visibility[1] = ctrl->getControlByID(LISTBOX_SAMPLES)->isHidden(); visibility[2] = ctrl->getControlByID(BUTTON_INSTRUMENT)->isHidden(); visibility[3] = ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->isHidden(); visibility[4] = ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->isHidden(); visibility[5] = ctrl->getControlByID(BUTTON_INSTRUMENTS_MINUS)->isHidden(); visibility[6] = ctrl->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER)->isHidden(); visibility[7] = ctrl->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER2)->isHidden(); visibility[8] = ctrl->getControlByID(BUTTON_JAMMENU_NEXTINSTRUMENT)->isHidden(); visibility[9] = ctrl->getControlByID(BUTTON_JAMMENU_PREVINSTRUMENT)->isHidden(); replaceAndResizeInstrumentListContainer(listBoxContainerHeight); // flip button is always hidden ctrl->getControlByID(BUTTON_INSTRUMENTS_FLIP)->hide(true); // so is alternative header ("Samples / Ins:xx") ctrl->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER)->hide(true); ctrl->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER2)->hide(true); // up/down buttons as well ctrl->getControlByID(BUTTON_JAMMENU_NEXTINSTRUMENT)->hide(true); ctrl->getControlByID(BUTTON_JAMMENU_PREVINSTRUMENT)->hide(true); // instrument button always visible ctrl->getControlByID(BUTTON_INSTRUMENT)->hide(false); ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->hide(false); // instrument "+" visible ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->hide(false); // instrument "-" visible ctrl->getControlByID(BUTTON_INSTRUMENTS_MINUS)->hide(false); // listbox is always visible tracker.listBoxInstruments->hide(false); // add another button if (ctrl->getControlByID(BUTTON_SAMPLES_INVOKEHDRECORDER) == NULL) { PPPoint p = ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->getLocation(); p.y = ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->getLocation().y; pp_int32 width = ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->getSize().width; pp_int32 height = ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->getSize().height; PPButton* button = new PPButton(BUTTON_SAMPLES_INVOKEHDRECORDER, screen, &tracker, PPPoint(p.x + width + 2, p.y), PPSize(7*5, height)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Render"); ctrl->addControl(button); } else { PPPoint p = ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->getLocation(); p.y = ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->getLocation().y; pp_int32 width = ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->getSize().width; pp_int32 height = ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->getSize().height; PPButton* button = static_cast(ctrl->getControlByID(BUTTON_SAMPLES_INVOKEHDRECORDER)); button->setLocation(PPPoint(p.x + width + 2, p.y)); button->setSize(PPSize(7*5, height)); button->hide(false); } } else { tracker.showMainMenu(true, true); tracker.listBoxInstruments->setSize(oldInstrumentListSize); tracker.listBoxInstruments->setLocation(oldInstrumentListLocation); tracker.listBoxSamples->setSize(oldSampleListSize); tracker.listBoxSamples->setLocation(oldSampleListLocation); PPContainer* ctrl = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); ctrl->setSize(oldInstrumentListContainerSize); ctrl->setLocation(oldInstrumentListContainerLocation); ctrl->getControlByID(BUTTON_INSTRUMENT)->setLocation(oldControlLocations[0]); ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->setLocation(oldControlLocations[1]); ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->setLocation(oldControlLocations[2]); ctrl->getControlByID(BUTTON_INSTRUMENTS_MINUS)->setLocation(oldControlLocations[3]); // this is always visible ctrl->getControlByID(BUTTON_INSTRUMENTS_FLIP)->hide(false); // for the rest just restore the old visibility flags ctrl->getControlByID(LISTBOX_INSTRUMENTS)->hide(visibility[0]); ctrl->getControlByID(LISTBOX_SAMPLES)->hide(visibility[1]); ctrl->getControlByID(BUTTON_INSTRUMENT)->hide(visibility[2]); ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->hide(visibility[3]); ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->hide(visibility[4]); ctrl->getControlByID(BUTTON_INSTRUMENTS_MINUS)->hide(visibility[5]); ctrl->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER)->hide(visibility[6]); ctrl->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER2)->hide(visibility[7]); ctrl->getControlByID(BUTTON_JAMMENU_NEXTINSTRUMENT)->hide(visibility[8]); ctrl->getControlByID(BUTTON_JAMMENU_PREVINSTRUMENT)->hide(visibility[9]); PPControl* dummy = ctrl->getControlByID(BUTTON_SAMPLES_INVOKEHDRECORDER); if (dummy) dummy->hide(true); } } #endif milkytracker-0.90.85+dfsg/src/tracker/Piano.cpp0000644000175000017500000137330611150223367020434 0ustar admin2admin2/* * tracker/Piano.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" #include "Piano.h" const pp_uint8 PianoBitmapSmall::PIANO_LUT[] = { 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00 }; const pp_uint8 PianoBitmapSmall::PIANO[] = { 0xcc,0xca,0xca,0xca,0xcb,0x0c,0x21,0x25,0x25,0x19,0x03,0x94,0xcd,0x0c,0x21,0x25,0x24, 0x19,0x03,0x96,0xcf,0xd0,0xd0,0x79,0xd1,0xd0,0xd0,0xd0,0xd1,0x0c,0x21,0x24,0x24, 0x19,0x03,0x9b,0xd2,0x0c,0x21,0x25,0x25,0x19,0x03,0x9d,0xd4,0x0c,0x21,0x25,0x25, 0x19,0x03,0x9e,0xd6,0xd7,0xd7,0x81,0xd9,0xd8,0xd8,0xd8,0xd8,0x0c,0x21,0x24,0x25, 0x19,0x03,0xa4,0xda,0x0c,0x21,0x25,0x25,0x19,0x03,0xa6,0xdc,0xdc,0xdd,0x88,0xde, 0xde,0xde,0xde,0xde,0x0c,0x21,0x25,0x26,0x19,0x03,0xa9,0xe0,0x0c,0x23,0x28,0x28, 0x1a,0x03,0xab,0xe2,0x0c,0x26,0x2b,0x2b,0x1d,0x03,0xad,0xe4,0xe4,0xe5,0x90,0xe6, 0xe6,0xe5,0xe6,0xe5,0x12,0x2c,0x2f,0x30,0x24,0x0d,0xb0,0xe8,0x16,0x2f,0x32,0x33, 0x26,0x11,0xb3,0xe9,0xea,0xea,0x97,0xec,0xea,0xeb,0xeb,0xeb,0x1c,0x35,0x38,0x38, 0x2b,0x18,0xb7,0xeb,0x20,0x37,0x3a,0x3a,0x2f,0x1a,0xb9,0xeb,0x22,0x39,0x3c,0x3e, 0x31,0x1d,0xbb,0xec,0xeb,0xeb,0x9f,0xec,0xeb,0xeb,0xeb,0xeb,0x27,0x3f,0x42,0x42, 0x37,0x24,0xbf,0xeb,0x2b,0x41,0x44,0x45,0x39,0x26,0xc2,0xeb,0xeb,0xec,0xa4,0xed, 0xeb,0xeb,0xec,0xec,0x30,0x45,0x4a,0x4a,0x3d,0x2b,0xc3,0xeb,0x32,0x48,0x4b,0x4c, 0x40,0x2f,0xc3,0xeb,0x34,0x4b,0x4e,0x4e,0x43,0x31,0xc3,0xec,0xeb,0xeb,0xad,0xed, 0xeb,0xeb,0xeb,0xeb,0x37,0x4b,0x4f,0x4f,0x43,0x2f,0xc4,0xeb,0x35,0x4a,0x4c,0x4d, 0x40,0x2e,0xc3,0xec,0xeb,0xeb,0xa8,0xed,0xeb,0xec,0xeb,0xeb,0x30,0x45,0x47,0x48, 0x3b,0x27,0xc2,0xeb,0x2e,0x43,0x46,0x45,0x3a,0x25,0xc0,0xeb,0x2a,0x40,0x43,0x43, 0x36,0x22,0xbe,0xeb,0xeb,0xeb,0x9f,0xec,0xec,0xeb,0xeb,0xeb,0x25,0x3b,0x3e,0x3e, 0x30,0x1c,0xba,0xeb,0x22,0x38,0x3b,0x3b,0x2f,0x19,0xb8,0xec,0xeb,0xeb,0x99,0xed, 0xeb,0xeb,0xeb,0xec,0x1c,0x33,0x35,0x36,0x28,0x14,0xb4,0xe9,0x19,0x31,0x33,0x33, 0x26,0x0f,0xb1,0xe8,0x17,0x2e,0x31,0x31,0x23,0x09,0xb0,0xe6,0xe5,0xe5,0x91,0xe7, 0xe4,0xe4,0xe4,0xe4,0x0f,0x29,0x2d,0x2c,0x1d,0x03,0xac,0xe2,0x0c,0x26,0x29,0x29, 0x1a,0x03,0xaa,0xe0,0xe0,0xe0,0x8b,0xe1,0xdf,0xdf,0xdf,0xde,0x0c,0x21,0x25,0x25, 0x19,0x03,0xa6,0xdc,0x0c,0x21,0x25,0x25,0x19,0x03,0xa4,0xda,0x0c,0x21,0x25,0x25, 0x19,0x03,0xa2,0xd8,0xd9,0xd8,0x82,0xd9,0xd7,0xd7,0xd7,0xd7,0x0c,0x21,0x25,0x25, 0x19,0x03,0x9e,0xd4,0x0c,0x21,0x25,0x25,0x19,0x03,0x9c,0xd3,0xd3,0xd3,0x7c,0xd3, 0xd2,0xd2,0xd1,0xd1,0x0c,0x21,0x24,0x25,0x19,0x03,0x97,0xcf,0x0c,0x21,0x25,0x25, 0x19,0x03,0x96,0xcd,0x0c,0x21,0x25,0x24,0x19,0x03,0x93,0xcb,0xcb,0xcb,0x73,0xd0, 0xca,0xca,0xcb,0xcb,0x12,0x9c,0xb6,0x92,0x67,0x0a,0x90,0xcd,0x12,0x9e,0xb8,0x94, 0x68,0x0a,0x91,0xce,0xcf,0xcf,0x78,0xd6,0xd0,0xd0,0xd1,0xd1,0x12,0xa2,0xbc,0x98, 0x6c,0x09,0x95,0xd2,0x12,0xa5,0xbe,0x9a,0x6e,0x09,0x98,0xd4,0x12,0xa7,0xc0,0x9c, 0x70,0x09,0x99,0xd6,0xd6,0xd7,0x81,0xdd,0xd7,0xd7,0xd8,0xd9,0x12,0xaa,0xc3,0xa0, 0x75,0x0a,0x9d,0xda,0x12,0xad,0xc6,0xa2,0x76,0x09,0xa0,0xdc,0xdc,0xdd,0x88,0xe3, 0xdd,0xde,0xdd,0xdd,0x12,0xb0,0xc9,0xa6,0x7c,0x09,0xa3,0xe0,0x12,0xb3,0xcb,0xa9, 0x7d,0x0a,0xa6,0xe2,0x12,0xb5,0xce,0xaa,0x80,0x0c,0xa8,0xe4,0xe4,0xe4,0x90,0xeb, 0xe5,0xe5,0xe5,0xe6,0x19,0xb9,0xd1,0xae,0x84,0x13,0xac,0xe7,0x1b,0xba,0xd3,0xb0, 0x86,0x16,0xae,0xea,0xea,0xea,0x97,0xef,0xea,0xeb,0xeb,0xeb,0x21,0xbf,0xd7,0xb4, 0x8a,0x1d,0xb2,0xeb,0x25,0xc0,0xd8,0xb6,0x8d,0x20,0xb3,0xeb,0x28,0xc2,0xda,0xb8, 0x8f,0x22,0xb6,0xeb,0xeb,0xeb,0x9e,0xef,0xec,0xeb,0xeb,0xeb,0x2c,0xc7,0xdb,0xbc, 0x93,0x28,0xba,0xeb,0x30,0xc8,0xdb,0xbf,0x95,0x2b,0xbb,0xeb,0xeb,0xeb,0xa5,0xef, 0xeb,0xeb,0xeb,0xeb,0x35,0xc9,0xdb,0xc1,0x99,0x30,0xbf,0xeb,0x37,0xc9,0xdb,0xc1, 0x9b,0x33,0xbf,0xeb,0x3b,0xc9,0xdb,0xc1,0x9d,0x36,0xbf,0xeb,0xeb,0xeb,0xad,0xef, 0xec,0xeb,0xeb,0xeb,0x3c,0xca,0xdb,0xc2,0x9d,0x34,0xbf,0xeb,0x3a,0xc9,0xdb,0xc1, 0x9b,0x32,0xbf,0xeb,0xeb,0xec,0xa7,0xf0,0xeb,0xeb,0xeb,0xec,0x35,0xc9,0xdc,0xc1, 0x96,0x2c,0xbc,0xeb,0x32,0xc9,0xdb,0xbf,0x95,0x29,0xbb,0xeb,0x2f,0xc8,0xdb,0xbd, 0x92,0x28,0xb9,0xeb,0xeb,0xeb,0x9f,0xef,0xeb,0xeb,0xeb,0xeb,0x2a,0xc4,0xdb,0xb9, 0x8e,0x21,0xb4,0xec,0x28,0xc1,0xd9,0xb6,0x8c,0x1f,0xb2,0xeb,0xeb,0xeb,0x9a,0xf0, 0xeb,0xeb,0xeb,0xeb,0x21,0xbe,0xd6,0xb2,0x87,0x19,0xae,0xe9,0x1e,0xbc,0xd4,0xb0, 0x86,0x15,0xad,0xe8,0x1b,0xba,0xd2,0xae,0x84,0x12,0xaa,0xe5,0xe5,0xe5,0x91,0xeb, 0xe5,0xe4,0xe4,0xe5,0x14,0xb7,0xce,0xaa,0x80,0x09,0xa6,0xe2,0x12,0xb4,0xcc,0xa8, 0x7e,0x0a,0xa4,0xe0,0xe1,0xdf,0x8a,0xe5,0xdf,0xdf,0xde,0xdf,0x12,0xb0,0xc9,0xa5, 0x79,0x09,0xa1,0xdc,0x12,0xaf,0xc7,0xa2,0x77,0x09,0x9e,0xda,0x12,0xac,0xc4,0xa0, 0x75,0x09,0x9c,0xd8,0xd9,0xd8,0x82,0xde,0xd7,0xd6,0xd7,0xd6,0x12,0xa8,0xc0,0x9c, 0x6f,0x09,0x98,0xd5,0x12,0xa6,0xbf,0x9a,0x6e,0x09,0x96,0xd3,0xd3,0xd2,0x7c,0xd8, 0xd2,0xd2,0xd1,0xd1,0x12,0xa1,0xbb,0x96,0x6a,0x09,0x92,0xcf,0x12,0xa0,0xb9,0x95, 0x67,0x0a,0x90,0xcd,0x12,0x9e,0xb7,0x92,0x67,0x09,0x8e,0xcb,0xcb,0xcb,0x72,0xda, 0xca,0xca,0xcb,0xcb,0x11,0xb3,0x3e,0x3e,0x2b,0x09,0x88,0xcd,0x10,0xb5,0x3e,0x3e, 0x2b,0x09,0x8a,0xcf,0xcf,0xcf,0x78,0xe0,0xd0,0xd0,0xd0,0xd1,0x10,0xb9,0x3f,0x3e, 0x2b,0x09,0x8e,0xd3,0x11,0xbb,0x3f,0x3f,0x2b,0x09,0x90,0xd4,0x11,0xbd,0x3f,0x3f, 0x2b,0x09,0x92,0xd6,0xd7,0xd7,0x81,0xe7,0xd8,0xd8,0xd8,0xd9,0x11,0xc1,0x40,0x41, 0x2b,0x0a,0x97,0xda,0x10,0xc3,0x43,0x43,0x2b,0x0a,0x99,0xdc,0xdc,0xdd,0x88,0xec, 0xde,0xde,0xde,0xde,0x10,0xc7,0x47,0x48,0x2f,0x09,0x9c,0xe1,0x10,0xc9,0x4a,0x4b, 0x31,0x09,0x9f,0xe2,0x10,0xcb,0x4d,0x4d,0x34,0x0c,0xa1,0xe3,0xe5,0xe5,0x90,0xf4, 0xe5,0xe6,0xe5,0xe6,0x17,0xce,0x51,0x51,0x39,0x14,0xa4,0xe8,0x19,0xd0,0x53,0x55, 0x3c,0x17,0xa7,0xe9,0xe9,0xe9,0x97,0xf6,0xeb,0xeb,0xeb,0xeb,0x1e,0xd5,0x59,0x59, 0x40,0x1d,0xab,0xec,0x22,0xd6,0x5a,0x5b,0x43,0x20,0xac,0xeb,0x25,0xd8,0x5e,0x5e, 0x45,0x22,0xaf,0xeb,0xeb,0xeb,0x9e,0xf7,0xeb,0xeb,0xec,0xeb,0x29,0xd9,0x62,0x62, 0x4b,0x28,0xb2,0xeb,0x2d,0xda,0x64,0x64,0x4d,0x2b,0xb5,0xeb,0xeb,0xeb,0xa4,0xf7, 0xeb,0xeb,0xeb,0xeb,0x32,0xda,0x69,0x69,0x51,0x31,0xb9,0xeb,0x35,0xda,0x6b,0x6a, 0x54,0x33,0xb9,0xeb,0x38,0xda,0x6d,0x6d,0x56,0x35,0xba,0xeb,0xeb,0xeb,0xac,0xf7, 0xeb,0xeb,0xeb,0xec,0x3a,0xda,0x6e,0x6d,0x57,0x35,0xb9,0xeb,0x37,0xd9,0x6c,0x6c, 0x53,0x32,0xb9,0xeb,0xeb,0xeb,0xa7,0xf7,0xeb,0xeb,0xeb,0xeb,0x32,0xd9,0x67,0x66, 0x4f,0x2c,0xb6,0xeb,0x30,0xd9,0x64,0x65,0x4d,0x29,0xb4,0xeb,0x2d,0xd9,0x63,0x63, 0x4a,0x27,0xb1,0xeb,0xeb,0xeb,0xa0,0xf7,0xec,0xeb,0xeb,0xeb,0x27,0xda,0x5e,0x5e, 0x45,0x22,0xae,0xeb,0x25,0xd7,0x5c,0x5c,0x42,0x1e,0xab,0xeb,0xeb,0xeb,0x99,0xf7, 0xeb,0xeb,0xeb,0xeb,0x1e,0xd4,0x56,0x56,0x3e,0x19,0xa7,0xe9,0x1c,0xd2,0x54,0x54, 0x3b,0x15,0xa5,0xe7,0x18,0xcf,0x52,0x52,0x38,0x12,0xa4,0xe6,0xe5,0xe5,0x91,0xf5, 0xe4,0xe4,0xe5,0xe4,0x12,0xcc,0x4e,0x4d,0x33,0x09,0xa0,0xe2,0x11,0xca,0x4b,0x4b, 0x31,0x0a,0x9d,0xe0,0xe0,0xe0,0x8b,0xef,0xdf,0xdf,0xde,0xde,0x11,0xc6,0x46,0x46, 0x2b,0x0a,0x99,0xdc,0x11,0xc4,0x43,0x44,0x2b,0x09,0x97,0xdb,0x11,0xc3,0x41,0x41, 0x2b,0x09,0x94,0xd9,0xd9,0xd8,0x82,0xe7,0xd7,0xd7,0xd7,0xd7,0x10,0xbe,0x3e,0x3e, 0x2b,0x0a,0x91,0xd5,0x11,0xbc,0x3f,0x3f,0x2b,0x0a,0x8f,0xd3,0xd3,0xd3,0x7c,0xe1, 0xd2,0xd2,0xd1,0xd1,0x11,0xb8,0x3f,0x3f,0x2b,0x0a,0x8a,0xd0,0x10,0xb6,0x3f,0x3f, 0x2b,0x09,0x88,0xcd,0x11,0xb4,0x3f,0x3e,0x2b,0x09,0x86,0xcb,0xcb,0xcb,0x72,0xe3, 0xca,0xca,0xcb,0xcb,0x0c,0x8c,0x36,0x36,0x24,0x07,0x80,0xcd,0x0c,0x8f,0x35,0x36, 0x25,0x07,0x82,0xd0,0xcf,0xcf,0x78,0xe9,0xd0,0xd0,0xd0,0xd1,0x0c,0x93,0x36,0x36, 0x25,0x07,0x87,0xd3,0x0c,0x95,0x36,0x35,0x25,0x07,0x89,0xd4,0x0c,0x97,0x36,0x36, 0x24,0x07,0x8b,0xd5,0xd7,0xd7,0x81,0xef,0xd8,0xd8,0xd8,0xd9,0x0c,0x9b,0x36,0x36, 0x25,0x07,0x8f,0xda,0x0c,0x9d,0x37,0x37,0x25,0x06,0x91,0xdc,0xdc,0xdd,0x88,0xf5, 0xdd,0xde,0xde,0xdf,0x0c,0xa2,0x3c,0x3c,0x28,0x07,0x95,0xe1,0x0c,0xa4,0x3e,0x3e, 0x2a,0x07,0x97,0xe2,0x0c,0xa6,0x41,0x40,0x2c,0x07,0x9a,0xe3,0xe4,0xe5,0x90,0xfc, 0xe6,0xe5,0xe5,0xe5,0x14,0xa9,0x46,0x46,0x32,0x10,0x9d,0xe8,0x16,0xab,0x48,0x48, 0x34,0x14,0xa0,0xe9,0xe9,0xea,0x97,0xfe,0xea,0xeb,0xeb,0xeb,0x1c,0xb0,0x4d,0x4d, 0x3a,0x1a,0xa3,0xec,0x1f,0xb2,0x4f,0x4f,0x3c,0x1d,0xa5,0xeb,0x22,0xb4,0x52,0x52, 0x3f,0x20,0xa8,0xea,0xeb,0xec,0x9f,0xfd,0xeb,0xeb,0xeb,0xeb,0x27,0xb8,0x56,0x56, 0x44,0x26,0xab,0xeb,0x2b,0xba,0x58,0x5a,0x46,0x28,0xae,0xeb,0xeb,0xeb,0xa4,0xfe, 0xeb,0xeb,0xeb,0xeb,0x30,0xbd,0x5d,0x5e,0x4b,0x2f,0xb2,0xeb,0x33,0xbd,0x60,0x60, 0x4d,0x31,0xb3,0xec,0x35,0xbe,0x62,0x63,0x50,0x33,0xb4,0xeb,0xeb,0xeb,0xad,0xfd, 0xeb,0xec,0xec,0xeb,0x38,0xbe,0x63,0x62,0x4f,0x33,0xb4,0xeb,0x35,0xbe,0x60,0x60, 0x4d,0x30,0xb2,0xeb,0xeb,0xeb,0xa8,0xfe,0xeb,0xec,0xeb,0xeb,0x30,0xbc,0x5c,0x5b, 0x48,0x29,0xae,0xeb,0x2d,0xba,0x59,0x59,0x47,0x28,0xac,0xeb,0x2a,0xb9,0x57,0x57, 0x43,0x25,0xaa,0xeb,0xec,0xeb,0xa0,0xfe,0xeb,0xeb,0xec,0xeb,0x24,0xb5,0x52,0x52, 0x3f,0x1f,0xa6,0xec,0x22,0xb3,0x50,0x50,0x3c,0x1c,0xa4,0xeb,0xeb,0xeb,0x99,0xfd, 0xeb,0xeb,0xec,0xeb,0x1c,0xaf,0x4b,0x4b,0x36,0x16,0xa0,0xe9,0x19,0xad,0x49,0x48, 0x35,0x12,0x9e,0xe8,0x16,0xab,0x46,0x46,0x31,0x0e,0x9c,0xe5,0xe5,0xe6,0x91,0xfd, 0xe5,0xe5,0xe5,0xe4,0x0f,0xa6,0x42,0x41,0x2c,0x07,0x98,0xe2,0x0c,0xa5,0x3e,0x3e, 0x29,0x07,0x95,0xe0,0xe0,0xdf,0x8b,0xf8,0xdf,0xdf,0xde,0xdf,0x0c,0xa1,0x3b,0x3a, 0x25,0x07,0x92,0xdc,0x0c,0x9f,0x38,0x37,0x25,0x06,0x8f,0xdb,0x0c,0x9d,0x36,0x35, 0x25,0x07,0x8e,0xd8,0xd8,0xd8,0x82,0xf0,0xd7,0xd7,0xd7,0xd7,0x0c,0x98,0x36,0x36, 0x25,0x07,0x8a,0xd4,0x0c,0x96,0x35,0x35,0x25,0x06,0x88,0xd3,0xd3,0xd3,0x7c,0xeb, 0xd2,0xd1,0xd1,0xd1,0x0c,0x92,0x36,0x36,0x25,0x07,0x83,0xcf,0x0c,0x90,0x36,0x35, 0x25,0x07,0x81,0xcd,0x0c,0x8e,0x35,0x35,0x25,0x07,0x7e,0xca,0xcb,0xcb,0x73,0xe4, 0xca,0xca,0xcb,0xcb,0x07,0x67,0x35,0x3a,0x2b,0x0a,0x79,0xcd,0x07,0x67,0x34,0x3a, 0x2b,0x09,0x7b,0xd0,0xcf,0xcf,0x78,0xea,0xd0,0xd0,0xd1,0xd1,0x07,0x6b,0x34,0x3a, 0x2b,0x09,0x7f,0xd3,0x07,0x6d,0x34,0x3a,0x2b,0x09,0x81,0xd5,0x07,0x70,0x35,0x3a, 0x2b,0x09,0x83,0xd6,0xd7,0xd7,0x81,0xf2,0xd8,0xd8,0xd8,0xd8,0x07,0x74,0x34,0x3a, 0x2b,0x09,0x87,0xda,0x07,0x75,0x36,0x3d,0x2b,0x09,0x8a,0xdc,0xdc,0xdd,0x88,0xf7, 0xde,0xde,0xdd,0xde,0x07,0x7a,0x3a,0x42,0x2f,0x0a,0x8d,0xe0,0x07,0x7c,0x3e,0x44, 0x31,0x0a,0x91,0xe2,0x07,0x7f,0x40,0x46,0x33,0x0c,0x92,0xe3,0xe4,0xe4,0x90,0xfe, 0xe6,0xe5,0xe5,0xe6,0x0d,0x83,0x44,0x4b,0x39,0x14,0x96,0xe8,0x12,0x85,0x47,0x4e, 0x3c,0x16,0x99,0xea,0xea,0xea,0x96,0xff,0xea,0xeb,0xeb,0xec,0x18,0x8a,0x4c,0x52, 0x41,0x1d,0x9c,0xeb,0x1c,0x8b,0x4e,0x54,0x44,0x1f,0x9e,0xec,0x1f,0x8d,0x51,0x57, 0x45,0x22,0xa1,0xeb,0xeb,0xeb,0x9f,0xff,0xeb,0xeb,0xec,0xeb,0x24,0x92,0x56,0x5c, 0x4b,0x29,0xa4,0xec,0x28,0x94,0x57,0x5f,0x4d,0x2b,0xa6,0xeb,0xec,0xeb,0xa4,0xff, 0xeb,0xec,0xeb,0xeb,0x2c,0x98,0x5d,0x63,0x51,0x30,0xab,0xec,0x2f,0x9a,0x5f,0x65, 0x54,0x33,0xac,0xeb,0x33,0x9c,0x61,0x67,0x56,0x36,0xae,0xeb,0xeb,0xeb,0xac,0xff, 0xec,0xeb,0xeb,0xeb,0x35,0x9d,0x61,0x68,0x55,0x34,0xad,0xeb,0x31,0x9b,0x5f,0x65, 0x53,0x32,0xac,0xeb,0xeb,0xeb,0xa7,0xff,0xeb,0xeb,0xeb,0xeb,0x2c,0x97,0x5a,0x61, 0x4f,0x2d,0xa7,0xeb,0x2a,0x96,0x58,0x5f,0x4d,0x2a,0xa5,0xeb,0x26,0x93,0x56,0x5c, 0x4a,0x27,0xa3,0xeb,0xeb,0xeb,0xa0,0xff,0xeb,0xec,0xeb,0xeb,0x21,0x8f,0x51,0x58, 0x45,0x22,0x9e,0xec,0x1e,0x8c,0x4f,0x55,0x42,0x1f,0x9d,0xeb,0xeb,0xeb,0x99,0xff, 0xec,0xeb,0xeb,0xeb,0x18,0x88,0x4a,0x50,0x3e,0x19,0x99,0xea,0x15,0x85,0x47,0x4e, 0x3c,0x14,0x96,0xe8,0x11,0x84,0x45,0x4c,0x38,0x12,0x95,0xe5,0xe5,0xe5,0x91,0xff, 0xe5,0xe4,0xe5,0xe4,0x07,0x80,0x41,0x46,0x33,0x09,0x91,0xe2,0x06,0x7e,0x3d,0x44, 0x31,0x0a,0x8e,0xe0,0xe0,0xdf,0x8b,0xf9,0xdf,0xde,0xdf,0xdf,0x07,0x7a,0x39,0x3f, 0x2b,0x0a,0x8a,0xdc,0x07,0x78,0x35,0x3c,0x2b,0x09,0x88,0xdb,0x07,0x75,0x34,0x3a, 0x2b,0x09,0x86,0xd9,0xd8,0xd8,0x82,0xf2,0xd7,0xd7,0xd7,0xd7,0x07,0x71,0x34,0x3b, 0x2b,0x0a,0x82,0xd4,0x07,0x6f,0x34,0x3a,0x2b,0x09,0x7f,0xd2,0xd2,0xd3,0x7b,0xec, 0xd2,0xd2,0xd1,0xd1,0x07,0x69,0x34,0x3b,0x2b,0x09,0x7c,0xd0,0x07,0x67,0x35,0x3a, 0x2b,0x09,0x79,0xcd,0x07,0x67,0x35,0x3a,0x2b,0x0a,0x76,0xcb,0xcb,0xca,0x72,0xe4, 0xca,0xca,0xcb,0xcb,0x0c,0x49,0x3d,0x41,0x31,0x0f,0x70,0xcd,0x0c,0x49,0x3d,0x41, 0x31,0x0f,0x72,0xd0,0xcf,0xcf,0x78,0xeb,0xd0,0xd0,0xd0,0xd1,0x0c,0x49,0x3d,0x41, 0x31,0x0f,0x77,0xd3,0x0c,0x49,0x3e,0x41,0x31,0x0f,0x7a,0xd4,0x0c,0x49,0x3d,0x41, 0x31,0x0f,0x7c,0xd6,0xd7,0xd7,0x81,0xf2,0xd8,0xd8,0xd8,0xd8,0x0c,0x4d,0x3f,0x43, 0x31,0x0f,0x7f,0xda,0x0c,0x50,0x41,0x46,0x31,0x0f,0x82,0xdc,0xdc,0xdc,0x87,0xf7, 0xde,0xdd,0xde,0xde,0x0c,0x55,0x45,0x4b,0x37,0x0f,0x86,0xe1,0x0c,0x56,0x49,0x4d, 0x39,0x0f,0x89,0xe2,0x0c,0x5a,0x4b,0x4f,0x3c,0x10,0x8b,0xe3,0xe4,0xe4,0x90,0xfe, 0xe5,0xe5,0xe6,0xe5,0x13,0x5e,0x4f,0x54,0x41,0x16,0x8f,0xe8,0x16,0x60,0x52,0x56, 0x43,0x1a,0x91,0xe9,0xea,0xea,0x96,0xff,0xeb,0xea,0xeb,0xec,0x1c,0x64,0x56,0x5a, 0x48,0x20,0x95,0xeb,0x1f,0x67,0x59,0x5e,0x4a,0x22,0x96,0xeb,0x22,0x69,0x5b,0x60, 0x4d,0x25,0x9a,0xeb,0xeb,0xeb,0x9f,0xff,0xec,0xec,0xeb,0xeb,0x29,0x6d,0x60,0x64, 0x52,0x2b,0x9d,0xeb,0x2b,0x6f,0x62,0x66,0x55,0x2d,0x9f,0xeb,0xeb,0xeb,0xa4,0xff, 0xec,0xeb,0xeb,0xeb,0x30,0x74,0x67,0x6b,0x59,0x33,0xa4,0xec,0x32,0x77,0x68,0x6d, 0x5b,0x36,0xa5,0xeb,0x35,0x78,0x6b,0x6e,0x5e,0x38,0xa7,0xec,0xeb,0xec,0xad,0xff, 0xeb,0xec,0xeb,0xeb,0x38,0x7a,0x6c,0x70,0x5d,0x37,0xa6,0xeb,0x34,0x78,0x6a,0x6d, 0x5a,0x35,0xa4,0xeb,0xec,0xeb,0xa8,0xff,0xeb,0xeb,0xeb,0xeb,0x30,0x73,0x64,0x69, 0x56,0x2f,0x9f,0xec,0x2d,0x70,0x62,0x66,0x54,0x2c,0x9e,0xeb,0x2a,0x6f,0x60,0x65, 0x51,0x2a,0x9c,0xeb,0xeb,0xeb,0x9f,0xff,0xec,0xeb,0xec,0xeb,0x25,0x6a,0x5b,0x5f, 0x4d,0x24,0x97,0xeb,0x22,0x68,0x5a,0x5e,0x4a,0x21,0x96,0xeb,0xec,0xeb,0x9a,0xff, 0xeb,0xec,0xec,0xeb,0x1c,0x64,0x54,0x59,0x46,0x1c,0x91,0xea,0x19,0x61,0x52,0x56, 0x43,0x18,0x8f,0xe8,0x17,0x5f,0x50,0x54,0x40,0x15,0x8d,0xe6,0xe5,0xe5,0x91,0xff, 0xe4,0xe5,0xe4,0xe5,0x0f,0x5a,0x4c,0x4f,0x3c,0x0f,0x89,0xe2,0x0c,0x59,0x49,0x4d, 0x39,0x0f,0x86,0xe0,0xe0,0xdf,0x8b,0xfa,0xdf,0xde,0xdf,0xde,0x0c,0x53,0x44,0x48, 0x34,0x0f,0x83,0xdc,0x0c,0x52,0x42,0x46,0x31,0x0f,0x80,0xda,0x0c,0x4e,0x3f,0x43, 0x31,0x0f,0x7e,0xd9,0xd8,0xd8,0x82,0xf2,0xd7,0xd6,0xd7,0xd7,0x0c,0x4a,0x3d,0x41, 0x31,0x0f,0x7a,0xd5,0x0c,0x49,0x3d,0x41,0x31,0x0f,0x78,0xd3,0xd3,0xd3,0x7b,0xec, 0xd2,0xd1,0xd1,0xd1,0x0c,0x49,0x3e,0x41,0x31,0x0f,0x73,0xd0,0x0c,0x49,0x3d,0x41, 0x31,0x0f,0x72,0xcc,0x0c,0x49,0x3d,0x41,0x31,0x0f,0x6f,0xcb,0xcb,0xcb,0x73,0xe4, 0xca,0xca,0xcb,0xcb,0x11,0x38,0x46,0x4a,0x37,0x12,0x69,0xcd,0x10,0x38,0x46,0x4a, 0x36,0x12,0x6b,0xcf,0xcf,0xd0,0x78,0xeb,0xd1,0xd0,0xd1,0xd1,0x11,0x38,0x45,0x4a, 0x37,0x12,0x71,0xd2,0x11,0x38,0x45,0x49,0x37,0x12,0x73,0xd5,0x11,0x38,0x46,0x4a, 0x37,0x12,0x75,0xd7,0xd8,0xd8,0x81,0xf1,0xd8,0xd7,0xd8,0xd8,0x10,0x38,0x49,0x50, 0x37,0x12,0x79,0xdb,0x11,0x3a,0x4c,0x51,0x38,0x12,0x7b,0xdc,0xdc,0xdd,0x88,0xf7, 0xdd,0xde,0xdd,0xdd,0x10,0x3f,0x51,0x56,0x3e,0x12,0x80,0xe0,0x10,0x41,0x54,0x59, 0x40,0x12,0x82,0xe3,0x10,0x44,0x55,0x5b,0x43,0x15,0x84,0xe5,0xe5,0xe5,0x90,0xff, 0xe5,0xe6,0xe6,0xe6,0x17,0x49,0x5a,0x5e,0x47,0x1b,0x86,0xe8,0x1a,0x4b,0x5b,0x61, 0x49,0x1d,0x89,0xea,0xea,0xea,0x97,0xff,0xea,0xeb,0xec,0xeb,0x1f,0x50,0x61,0x66, 0x4e,0x23,0x8e,0xeb,0x24,0x52,0x63,0x69,0x51,0x26,0x91,0xec,0x26,0x54,0x65,0x6b, 0x53,0x29,0x93,0xec,0xec,0xec,0x9f,0xff,0xeb,0xeb,0xeb,0xeb,0x2b,0x5a,0x69,0x6f, 0x58,0x2f,0x95,0xeb,0x2f,0x5c,0x6b,0x72,0x5b,0x31,0x98,0xeb,0xeb,0xeb,0xa5,0xff, 0xec,0xeb,0xeb,0xeb,0x33,0x5f,0x70,0x76,0x5f,0x36,0x9d,0xeb,0x36,0x63,0x72,0x78, 0x61,0x39,0x9f,0xec,0x39,0x64,0x75,0x7a,0x64,0x3b,0xa1,0xec,0xec,0xec,0xad,0xff, 0xeb,0xeb,0xeb,0xec,0x3c,0x66,0x76,0x7a,0x62,0x3a,0x9f,0xeb,0x37,0x64,0x74,0x77, 0x61,0x38,0x9c,0xeb,0xeb,0xeb,0xa7,0xff,0xeb,0xeb,0xeb,0xec,0x33,0x5e,0x6e,0x74, 0x5c,0x32,0x99,0xeb,0x31,0x5e,0x6c,0x72,0x5a,0x2f,0x98,0xec,0x2e,0x5b,0x6b,0x6f, 0x57,0x2d,0x95,0xec,0xec,0xec,0x9f,0xff,0xeb,0xec,0xeb,0xeb,0x28,0x56,0x66,0x6b, 0x53,0x27,0x90,0xeb,0x26,0x53,0x64,0x69,0x51,0x25,0x8f,0xec,0xeb,0xeb,0x9a,0xff, 0xeb,0xeb,0xeb,0xec,0x20,0x4f,0x5f,0x64,0x4c,0x20,0x8a,0xea,0x1e,0x4d,0x5d,0x62, 0x4a,0x1c,0x88,0xe9,0x19,0x49,0x5b,0x60,0x46,0x19,0x86,0xe7,0xe6,0xe6,0x91,0xff, 0xe4,0xe5,0xe5,0xe4,0x14,0x45,0x57,0x5b,0x42,0x13,0x81,0xe2,0x10,0x43,0x53,0x59, 0x40,0x12,0x7f,0xe1,0xe0,0xe0,0x8b,0xfa,0xde,0xdf,0xde,0xdf,0x10,0x3e,0x4f,0x53, 0x3a,0x12,0x7c,0xdc,0x11,0x3c,0x4c,0x51,0x38,0x12,0x7a,0xdb,0x10,0x39,0x4a,0x4f, 0x37,0x12,0x78,0xd9,0xd9,0xd9,0x82,0xf2,0xd8,0xd7,0xd7,0xd6,0x10,0x38,0x45,0x4a, 0x37,0x12,0x73,0xd4,0x10,0x38,0x45,0x4a,0x36,0x12,0x70,0xd2,0xd3,0xd3,0x7c,0xec, 0xd2,0xd1,0xd1,0xd1,0x11,0x38,0x45,0x4a,0x37,0x12,0x6c,0xcf,0x10,0x38,0x45,0x4a, 0x37,0x12,0x6b,0xcd,0x11,0x38,0x46,0x4a,0x37,0x12,0x6a,0xcc,0xcc,0xcb,0x73,0xe5, 0xcb,0xcb,0xcc,0xcd,0x13,0x41,0x4c,0x51,0x3d,0x13,0x6b,0xcf,0x13,0x41,0x4b,0x51, 0x3d,0x13,0x6e,0xd1,0xd1,0xd1,0x78,0xeb,0xd2,0xd2,0xd2,0xd3,0x14,0x41,0x4c,0x52, 0x3e,0x13,0x73,0xd5,0x13,0x41,0x4c,0x51,0x3e,0x13,0x76,0xd7,0x13,0x41,0x4d,0x53, 0x3e,0x13,0x78,0xd9,0xd9,0xda,0x81,0xf1,0xd9,0xd9,0xd9,0xda,0x13,0x42,0x52,0x59, 0x3f,0x14,0x7c,0xdc,0x13,0x45,0x54,0x5b,0x41,0x14,0x7d,0xde,0xde,0xdf,0x87,0xf6, 0xdf,0xdf,0xdf,0xe0,0x13,0x4a,0x59,0x5f,0x46,0x13,0x82,0xe2,0x13,0x4c,0x5c,0x61, 0x48,0x14,0x85,0xe5,0x14,0x4f,0x5e,0x64,0x4b,0x16,0x87,0xe7,0xe7,0xe7,0x90,0xfe, 0xe7,0xe6,0xe7,0xe7,0x1a,0x53,0x62,0x68,0x50,0x1c,0x8a,0xea,0x1d,0x56,0x64,0x6b, 0x52,0x1e,0x8c,0xeb,0xec,0xeb,0x96,0xff,0xec,0xed,0xed,0xec,0x23,0x5a,0x69,0x6f, 0x57,0x25,0x91,0xed,0x26,0x5d,0x6b,0x71,0x59,0x27,0x93,0xed,0x28,0x5f,0x6e,0x73, 0x5c,0x29,0x95,0xed,0xed,0xed,0x9e,0xff,0xed,0xec,0xec,0xed,0x2f,0x63,0x71,0x77, 0x61,0x30,0x98,0xed,0x31,0x65,0x74,0x7b,0x62,0x32,0x9b,0xed,0xed,0xed,0xa4,0xff, 0xed,0xed,0xed,0xed,0x35,0x69,0x79,0x7e,0x66,0x38,0xa0,0xed,0x38,0x6d,0x7a,0x80, 0x69,0x3a,0xa1,0xed,0x3b,0x6f,0x7d,0x83,0x6c,0x3c,0xa3,0xed,0xed,0xed,0xad,0xff, 0xed,0xec,0xed,0xed,0x3d,0x70,0x7d,0x83,0x6b,0x3c,0xa1,0xed,0x3a,0x6e,0x7b,0x80, 0x69,0x3a,0x9f,0xed,0xed,0xed,0xa7,0xff,0xec,0xed,0xed,0xed,0x36,0x6a,0x77,0x7d, 0x63,0x33,0x9c,0xed,0x34,0x67,0x74,0x7a,0x63,0x31,0x9a,0xed,0x30,0x65,0x73,0x78, 0x60,0x2e,0x99,0xec,0xed,0xed,0x9f,0xff,0xed,0xec,0xed,0xed,0x2b,0x60,0x6e,0x73, 0x5c,0x28,0x93,0xed,0x29,0x5e,0x6c,0x71,0x59,0x26,0x91,0xed,0xed,0xed,0x99,0xff, 0xed,0xed,0xed,0xed,0x22,0x5a,0x68,0x6d,0x54,0x21,0x8d,0xeb,0x20,0x56,0x64,0x6b, 0x53,0x1d,0x8c,0xea,0x1d,0x54,0x63,0x69,0x4f,0x1b,0x89,0xe8,0xe7,0xe8,0x91,0xff, 0xe6,0xe5,0xe6,0xe5,0x16,0x50,0x5f,0x64,0x4b,0x14,0x85,0xe3,0x14,0x4e,0x5b,0x61, 0x49,0x13,0x82,0xe2,0xe2,0xe1,0x8b,0xf9,0xe0,0xe0,0xe1,0xe1,0x13,0x48,0x57,0x5d, 0x43,0x14,0x7f,0xdd,0x13,0x46,0x55,0x5b,0x41,0x13,0x7c,0xdd,0x13,0x44,0x52,0x59, 0x3f,0x13,0x7a,0xdb,0xdb,0xda,0x82,0xf2,0xd9,0xd8,0xd9,0xd9,0x13,0x40,0x4e,0x53, 0x3e,0x14,0x76,0xd6,0x13,0x41,0x4c,0x51,0x3d,0x14,0x73,0xd5,0xd4,0xd4,0x7b,0xec, 0xd4,0xd3,0xd3,0xd3,0x13,0x41,0x4c,0x52,0x3e,0x14,0x6f,0xd1,0x14,0x41,0x4c,0x51, 0x3e,0x14,0x6e,0xcf,0x13,0x41,0x4c,0x51,0x3d,0x14,0x6b,0xcd,0xcd,0xce,0x73,0xe4, 0xce,0xce,0xce,0xce,0x17,0x4b,0x55,0x59,0x44,0x16,0x75,0xd1,0x18,0x4b,0x56,0x58, 0x44,0x16,0x77,0xd3,0xd3,0xd3,0x79,0xea,0xd3,0xd4,0xd5,0xd5,0x17,0x4b,0x55,0x58, 0x44,0x16,0x7c,0xd6,0x17,0x4a,0x58,0x5a,0x44,0x16,0x7e,0xd9,0x18,0x4c,0x59,0x5c, 0x44,0x16,0x81,0xdb,0xdc,0xdc,0x81,0xf1,0xdc,0xdb,0xda,0xdc,0x18,0x50,0x5e,0x62, 0x48,0x16,0x84,0xde,0x18,0x52,0x61,0x64,0x49,0x17,0x86,0xdf,0xe0,0xe0,0x88,0xf7, 0xe2,0xe2,0xe1,0xe2,0x18,0x57,0x65,0x69,0x4f,0x16,0x8a,0xe5,0x17,0x5a,0x68,0x6b, 0x51,0x17,0x8d,0xe6,0x19,0x5c,0x6a,0x6d,0x53,0x1b,0x8f,0xe7,0xe9,0xe9,0x90,0xff, 0xe9,0xe9,0xe8,0xe8,0x20,0x61,0x6e,0x71,0x58,0x20,0x92,0xeb,0x23,0x62,0x70,0x74, 0x5b,0x22,0x94,0xed,0xec,0xed,0x97,0xff,0xee,0xee,0xee,0xef,0x28,0x67,0x75,0x77, 0x60,0x29,0x9a,0xee,0x2b,0x6a,0x76,0x7b,0x62,0x2b,0x9b,0xef,0x2e,0x6c,0x79,0x7c, 0x64,0x2e,0x9e,0xef,0xee,0xee,0x9f,0xff,0xee,0xee,0xed,0xed,0x33,0x71,0x7d,0x81, 0x68,0x33,0xa0,0xee,0x35,0x73,0x7f,0x83,0x6a,0x36,0xa3,0xed,0xed,0xee,0xa4,0xff, 0xed,0xed,0xee,0xef,0x3a,0x77,0x84,0x87,0x6f,0x3b,0xa7,0xee,0x3d,0x79,0x85,0x88, 0x71,0x3e,0xa9,0xef,0x40,0x7b,0x88,0x8b,0x74,0x40,0xac,0xef,0xee,0xee,0xac,0xff, 0xed,0xed,0xed,0xed,0x42,0x7c,0x89,0x8c,0x72,0x3f,0xaa,0xee,0x3e,0x7a,0x87,0x88, 0x70,0x3c,0xa8,0xed,0xee,0xee,0xa7,0xff,0xed,0xee,0xee,0xef,0x3b,0x75,0x82,0x85, 0x6d,0x37,0xa4,0xee,0x38,0x74,0x81,0x83,0x6b,0x35,0xa2,0xee,0x35,0x72,0x7e,0x80, 0x67,0x32,0xa1,0xee,0xee,0xef,0xa0,0xff,0xed,0xed,0xec,0xed,0x30,0x6d,0x79,0x7c, 0x64,0x2d,0x9b,0xee,0x2e,0x6b,0x78,0x7b,0x61,0x2a,0x99,0xed,0xee,0xee,0x9a,0xff, 0xee,0xee,0xee,0xef,0x27,0x67,0x73,0x75,0x5d,0x25,0x95,0xee,0x25,0x64,0x71,0x73, 0x5a,0x21,0x94,0xec,0x21,0x61,0x6f,0x71,0x58,0x1e,0x92,0xe9,0xe9,0xe9,0x91,0xff, 0xe8,0xe8,0xe7,0xe6,0x1c,0x5e,0x6b,0x6d,0x53,0x1a,0x8c,0xe6,0x19,0x5c,0x67,0x6a, 0x51,0x16,0x8b,0xe4,0xe4,0xe2,0x8a,0xfa,0xe2,0xe2,0xe2,0xe3,0x18,0x56,0x64,0x66, 0x4c,0x17,0x87,0xe1,0x18,0x55,0x61,0x64,0x4a,0x16,0x85,0xde,0x18,0x52,0x5f,0x62, 0x48,0x16,0x83,0xdd,0xdc,0xdc,0x82,0xf2,0xda,0xdb,0xd9,0xd9,0x17,0x4d,0x5b,0x5d, 0x44,0x16,0x7f,0xd7,0x18,0x4b,0x58,0x5a,0x44,0x17,0x7b,0xd6,0xd6,0xd6,0x7c,0xec, 0xd5,0xd5,0xd5,0xd5,0x18,0x4b,0x55,0x59,0x45,0x16,0x79,0xd4,0x18,0x4b,0x55,0x59, 0x44,0x17,0x76,0xd1,0x18,0x4b,0x56,0x58,0x44,0x16,0x73,0xd0,0xd0,0xcf,0x72,0xe5, 0xcf,0xd0,0xcf,0xd0,0x1e,0x6e,0x60,0x65,0x4d,0x1d,0x7d,0xd1,0x1f,0x70,0x60,0x64, 0x4d,0x1d,0x80,0xd4,0xd4,0xd5,0x79,0xea,0xd6,0xd5,0xd7,0xd6,0x1f,0x73,0x63,0x68, 0x4d,0x1d,0x85,0xd9,0x1f,0x77,0x65,0x6b,0x4d,0x1d,0x86,0xdb,0x1e,0x78,0x68,0x6d, 0x4e,0x1d,0x88,0xdd,0xdd,0xdd,0x82,0xf2,0xdc,0xdd,0xdc,0xde,0x1e,0x7c,0x6c,0x71, 0x53,0x1d,0x8c,0xe0,0x1f,0x7f,0x6e,0x73,0x55,0x1d,0x8e,0xe1,0xe1,0xe2,0x88,0xf7, 0xe4,0xe3,0xe3,0xe3,0x1e,0x83,0x72,0x79,0x5b,0x1d,0x94,0xe6,0x20,0x85,0x76,0x7a, 0x5c,0x20,0x96,0xe8,0x22,0x88,0x78,0x7c,0x60,0x23,0x98,0xea,0xea,0xea,0x90,0xff, 0xe9,0xeb,0xea,0xeb,0x29,0x8c,0x7b,0x80,0x63,0x29,0x9a,0xed,0x2b,0x8d,0x7e,0x82, 0x66,0x2b,0x9d,0xee,0xef,0xef,0x96,0xff,0xf0,0xef,0xef,0xef,0x30,0x92,0x82,0x86, 0x6b,0x31,0xa2,0xef,0x34,0x93,0x84,0x89,0x6d,0x34,0xa4,0xf0,0x36,0x96,0x87,0x8c, 0x6e,0x36,0xa6,0xf0,0xef,0xef,0x9f,0xff,0xef,0xf0,0xee,0xf0,0x3b,0x9a,0x8a,0x90, 0x73,0x3c,0xa9,0xf0,0x3d,0x9c,0x8d,0x92,0x75,0x3e,0xab,0xf0,0xf0,0xf0,0xa4,0xff, 0xef,0xf0,0xef,0xef,0x43,0xa0,0x91,0x95,0x79,0x42,0xb0,0xf0,0x45,0xa2,0x93,0x98, 0x7c,0x45,0xb1,0xef,0x48,0xa4,0x94,0x9a,0x7e,0x48,0xb3,0xf0,0xf0,0xf0,0xae,0xff, 0xef,0xef,0xee,0xf0,0x49,0xa5,0x95,0x9a,0x7d,0x46,0xb2,0xf0,0x46,0xa3,0x94,0x98, 0x7b,0x44,0xb0,0xf0,0xef,0xef,0xa6,0xff,0xef,0xef,0xef,0xef,0x42,0x9f,0x8f,0x94, 0x77,0x3f,0xad,0xef,0x40,0x9d,0x8d,0x92,0x75,0x3d,0xaa,0xef,0x3d,0x9b,0x8c,0x90, 0x72,0x3a,0xa8,0xf0,0xf0,0xef,0x9f,0xff,0xee,0xf0,0xee,0xef,0x38,0x98,0x87,0x8b, 0x6f,0x36,0xa4,0xef,0x36,0x94,0x84,0x8a,0x6b,0x32,0xa1,0xef,0xf0,0xf0,0x9a,0xff, 0xef,0xef,0xef,0xef,0x30,0x91,0x80,0x84,0x68,0x2d,0x9e,0xef,0x2d,0x8e,0x7e,0x83, 0x65,0x2a,0x9c,0xed,0x2a,0x8d,0x7c,0x81,0x63,0x27,0x9a,0xec,0xec,0xeb,0x91,0xff, 0xe8,0xea,0xe9,0xe8,0x25,0x89,0x79,0x7c,0x5e,0x22,0x95,0xe7,0x23,0x87,0x76,0x7a, 0x5d,0x1f,0x93,0xe5,0xe6,0xe4,0x8b,0xf9,0xe5,0xe3,0xe5,0xe3,0x1f,0x82,0x72,0x75, 0x57,0x1d,0x90,0xe2,0x1e,0x80,0x6f,0x74,0x56,0x1d,0x8e,0xe0,0x1f,0x7d,0x6d,0x72, 0x53,0x1d,0x8b,0xdf,0xdf,0xde,0x82,0xf2,0xdb,0xdc,0xdb,0xdc,0x1e,0x79,0x69,0x6d, 0x4e,0x1d,0x86,0xda,0x1f,0x77,0x66,0x6b,0x4d,0x1e,0x84,0xd8,0xd8,0xd8,0x7c,0xec, 0xd7,0xd7,0xd7,0xd6,0x1e,0x73,0x62,0x67,0x4d,0x1d,0x81,0xd6,0x1e,0x70,0x61,0x64, 0x4d,0x1d,0x7f,0xd3,0x1e,0x6f,0x61,0x65,0x4d,0x1d,0x7c,0xd2,0xd1,0xd1,0x73,0xe4, 0xd1,0xd1,0xd2,0xd2,0x25,0x97,0x6b,0x6c,0x4f,0x1a,0x86,0xd3,0x25,0x9a,0x6d,0x6f, 0x4f,0x1a,0x88,0xd5,0xd6,0xd6,0x78,0xea,0xd7,0xd7,0xd9,0xd9,0x25,0x9d,0x73,0x74, 0x4f,0x1a,0x8c,0xdb,0x25,0xa0,0x75,0x76,0x50,0x1b,0x8e,0xdc,0x25,0xa2,0x77,0x78, 0x52,0x1a,0x91,0xde,0xdf,0xdf,0x81,0xf2,0xde,0xde,0xde,0xe0,0x25,0xa6,0x7b,0x7d, 0x57,0x1a,0x95,0xe1,0x25,0xa7,0x7e,0x7e,0x58,0x1b,0x97,0xe3,0xe4,0xe4,0x87,0xf6, 0xe5,0xe4,0xe5,0xe7,0x26,0xab,0x81,0x83,0x5d,0x1a,0x9b,0xe7,0x29,0xad,0x84,0x85, 0x5f,0x1d,0x9d,0xea,0x2b,0xb0,0x86,0x87,0x63,0x20,0x9f,0xec,0xed,0xec,0x90,0xff, 0xec,0xec,0xec,0xec,0x31,0xb4,0x89,0x8a,0x67,0x25,0xa2,0xef,0x33,0xb5,0x8c,0x8d, 0x68,0x27,0xa6,0xf0,0xf0,0xf0,0x97,0xff,0xf1,0xf0,0xf1,0xf1,0x39,0xba,0x90,0x91, 0x6e,0x2d,0xa8,0xf1,0x3b,0xbc,0x92,0x94,0x70,0x30,0xab,0xf1,0x3d,0xbd,0x95,0x96, 0x71,0x32,0xad,0xf2,0xf2,0xf1,0x9f,0xff,0xf0,0xf0,0xf0,0xf0,0x43,0xc2,0x98,0x9a, 0x77,0x38,0xb1,0xf1,0x45,0xc3,0x9a,0x9c,0x78,0x3b,0xb3,0xf0,0xf0,0xf0,0xa4,0xff, 0xf0,0xf0,0xf1,0xf1,0x4a,0xc6,0x9f,0xa0,0x7c,0x40,0xb7,0xf1,0x4c,0xc6,0xa0,0xa1, 0x7f,0x42,0xb9,0xf1,0x4f,0xc5,0xa3,0xa4,0x81,0x45,0xb9,0xf1,0xf2,0xf1,0xad,0xff, 0xf0,0xf1,0xf0,0xf1,0x50,0xc5,0xa3,0xa4,0x80,0x44,0xb9,0xf0,0x4e,0xc6,0xa2,0xa2, 0x7f,0x41,0xb7,0xf0,0xf0,0xf0,0xa6,0xff,0xf1,0xf0,0xf1,0xf1,0x4a,0xc6,0x9d,0x9e, 0x7a,0x3c,0xb4,0xf1,0x47,0xc4,0x9b,0x9c,0x78,0x39,0xb2,0xf1,0x45,0xc2,0x99,0x9a, 0x75,0x36,0xb0,0xf2,0xf2,0xf1,0xa0,0xff,0xf0,0xf1,0xf0,0xf0,0x3f,0xbf,0x95,0x96, 0x72,0x31,0xab,0xf0,0x3d,0xbd,0x93,0x94,0x6e,0x2f,0xaa,0xf0,0xf1,0xf0,0x99,0xff, 0xf0,0xf0,0xf1,0xf1,0x38,0xb9,0x8e,0x8f,0x6b,0x28,0xa5,0xf1,0x35,0xb6,0x8d,0x8d, 0x68,0x26,0xa4,0xf0,0x32,0xb5,0x8a,0x8a,0x66,0x23,0xa1,0xee,0xee,0xed,0x91,0xff, 0xeb,0xeb,0xeb,0xea,0x2e,0xb1,0x87,0x87,0x62,0x1e,0x9e,0xe9,0x2b,0xaf,0x84,0x85, 0x5f,0x1b,0x9b,0xe7,0xe7,0xe6,0x8a,0xf9,0xe5,0xe5,0xe6,0xe5,0x25,0xab,0x80,0x80, 0x5b,0x1a,0x98,0xe4,0x25,0xa9,0x7e,0x7f,0x58,0x1a,0x95,0xe2,0x24,0xa6,0x7b,0x7c, 0x57,0x1b,0x93,0xe1,0xe1,0xe0,0x82,0xf2,0xdd,0xde,0xde,0xdd,0x25,0xa2,0x78,0x77, 0x51,0x1a,0x8e,0xdb,0x25,0xa0,0x74,0x75,0x4f,0x1a,0x8d,0xd9,0xda,0xd9,0x7b,0xec, 0xd9,0xd8,0xd8,0xd9,0x25,0x9c,0x70,0x72,0x4f,0x1a,0x89,0xd7,0x25,0x9a,0x6f,0x6f, 0x4f,0x1a,0x87,0xd5,0x25,0x99,0x6d,0x6c,0x4f,0x1b,0x84,0xd3,0xd3,0xd2,0x73,0xe4, 0xd3,0xd3,0xd3,0xd3,0x29,0xbc,0x64,0x62,0x46,0x16,0x8e,0xd5,0x2a,0xbd,0x64,0x62, 0x46,0x16,0x90,0xd8,0xd7,0xd8,0x79,0xeb,0xd9,0xda,0xda,0xdb,0x2a,0xc1,0x69,0x66, 0x46,0x17,0x95,0xdc,0x29,0xc3,0x6a,0x68,0x45,0x17,0x98,0xde,0x29,0xc6,0x6d,0x69, 0x45,0x16,0x99,0xe0,0xe1,0xe1,0x81,0xf1,0xe1,0xe0,0xe0,0xe2,0x2a,0xc9,0x71,0x6f, 0x4a,0x16,0x9d,0xe2,0x2a,0xcb,0x73,0x71,0x4c,0x17,0x9f,0xe4,0xe4,0xe6,0x88,0xf7, 0xe6,0xe7,0xe7,0xe7,0x2c,0xcf,0x77,0x76,0x51,0x16,0xa5,0xea,0x2e,0xd1,0x7a,0x78, 0x53,0x18,0xa6,0xec,0x31,0xd2,0x7c,0x79,0x56,0x1a,0xa8,0xed,0xee,0xee,0x90,0xff, 0xed,0xee,0xed,0xee,0x37,0xd6,0x80,0x7f,0x5b,0x20,0xaa,0xf0,0x39,0xd8,0x82,0x80, 0x5c,0x22,0xad,0xf2,0xf2,0xf2,0x97,0xff,0xf2,0xf2,0xf2,0xf2,0x3e,0xdc,0x87,0x84, 0x62,0x28,0xb2,0xf2,0x40,0xde,0x89,0x87,0x64,0x2b,0xb4,0xf3,0x44,0xdf,0x8c,0x89, 0x66,0x2e,0xb6,0xf3,0xf2,0xf3,0x9e,0xff,0xf2,0xf2,0xf2,0xf2,0x49,0xdf,0x8f,0x8d, 0x6a,0x33,0xb9,0xf2,0x4a,0xdf,0x92,0x8f,0x6d,0x36,0xbb,0xf2,0xf2,0xf1,0xa5,0xff, 0xf2,0xf2,0xf2,0xf2,0x4f,0xe0,0x95,0x93,0x71,0x3b,0xbf,0xf1,0x52,0xe0,0x98,0x95, 0x73,0x3d,0xbf,0xf2,0x55,0xe0,0x99,0x98,0x76,0x40,0xbf,0xf3,0xf2,0xf2,0xae,0xff, 0xf2,0xf2,0xf2,0xf2,0x56,0xe0,0x9a,0x97,0x74,0x3f,0xbe,0xf1,0x53,0xe0,0x99,0x95, 0x72,0x3d,0xbe,0xf1,0xf2,0xf1,0xa7,0xff,0xf2,0xf2,0xf2,0xf2,0x4f,0xe0,0x94,0x91, 0x6e,0x37,0xbd,0xf1,0x4d,0xe0,0x92,0x90,0x6d,0x34,0xbb,0xf2,0x49,0xe0,0x90,0x8d, 0x6a,0x32,0xb9,0xf3,0xf3,0xf3,0x9f,0xff,0xf2,0xf2,0xf2,0xf2,0x46,0xe0,0x8b,0x89, 0x66,0x2c,0xb4,0xf2,0x43,0xdf,0x8a,0x86,0x63,0x2a,0xb1,0xf1,0xf1,0xf2,0x99,0xff, 0xf2,0xf2,0xf2,0xf2,0x3e,0xdc,0x85,0x82,0x5e,0x25,0xae,0xf2,0x3c,0xd9,0x83,0x80, 0x5c,0x21,0xad,0xf1,0x38,0xd7,0x81,0x7e,0x59,0x1e,0xaa,0xf0,0xef,0xf0,0x91,0xff, 0xed,0xed,0xed,0xec,0x33,0xd4,0x7d,0x79,0x55,0x19,0xa5,0xeb,0x31,0xd2,0x7b,0x78, 0x53,0x17,0xa3,0xe9,0xe9,0xe8,0x8a,0xf9,0xe7,0xe8,0xe8,0xe7,0x2b,0xce,0x77,0x72, 0x4e,0x16,0xa1,0xe6,0x29,0xcc,0x74,0x71,0x4b,0x17,0x9e,0xe5,0x2a,0xca,0x71,0x6e, 0x49,0x17,0x9c,0xe3,0xe3,0xe2,0x82,0xf1,0xdf,0xe0,0xe0,0xde,0x2a,0xc6,0x6d,0x6a, 0x45,0x16,0x98,0xdd,0x29,0xc5,0x6b,0x68,0x46,0x16,0x94,0xdb,0xdb,0xdc,0x7b,0xec, 0xda,0xda,0xda,0xda,0x29,0xc0,0x67,0x64,0x45,0x16,0x91,0xd8,0x2a,0xbf,0x64,0x61, 0x46,0x16,0x90,0xd7,0x2a,0xbd,0x65,0x62,0x46,0x16,0x8d,0xd5,0xd5,0xd5,0x73,0xe4, 0xd4,0xd5,0xd6,0xd5,0x3e,0xa5,0x82,0x5d,0x36,0x23,0x96,0xd7,0x3e,0xa7,0x84,0x5d, 0x36,0x24,0x99,0xdb,0xda,0xda,0x78,0xea,0xdc,0xdc,0xdc,0xdc,0x3e,0xab,0x89,0x60, 0x36,0x24,0x9d,0xde,0x3e,0xad,0x8b,0x62,0x37,0x24,0x9f,0xe1,0x3d,0xaf,0x8c,0x64, 0x37,0x24,0xa1,0xe2,0xe3,0xe2,0x81,0xf1,0xe2,0xe2,0xe2,0xe2,0x3d,0xb3,0x91,0x68, 0x37,0x24,0xa5,0xe4,0x40,0xb6,0x93,0x6b,0x3a,0x24,0xa7,0xe7,0xe8,0xe8,0x87,0xf7, 0xe9,0xe9,0xe9,0xe9,0x45,0xb9,0x96,0x70,0x3f,0x24,0xab,0xeb,0x47,0xbb,0x99,0x72, 0x41,0x29,0xad,0xed,0x4a,0xbd,0x9b,0x73,0x43,0x2b,0xaf,0xef,0xf0,0xf0,0x90,0xff, 0xf0,0xef,0xf0,0xef,0x50,0xc1,0x9e,0x77,0x48,0x2f,0xb3,0xf2,0x51,0xc3,0xa1,0x7a, 0x4b,0x32,0xb6,0xf4,0xf3,0xf4,0x96,0xff,0xf4,0xf3,0xf4,0xf3,0x57,0xc6,0xa5,0x7f, 0x50,0x38,0xb9,0xf4,0x59,0xc8,0xa7,0x82,0x52,0x3a,0xbb,0xf5,0x5a,0xcb,0xaa,0x83, 0x54,0x3d,0xbd,0xf4,0xf5,0xf4,0x9e,0xff,0xf2,0xf2,0xf3,0xf2,0x60,0xce,0xad,0x87, 0x5a,0x42,0xc1,0xf2,0x62,0xd0,0xaf,0x8a,0x5c,0x44,0xc3,0xf4,0xf3,0xf4,0xa5,0xff, 0xf4,0xf3,0xf3,0xf4,0x66,0xd0,0xb3,0x8d,0x60,0x49,0xc4,0xf4,0x68,0xd0,0xb6,0x90, 0x62,0x4c,0xc4,0xf5,0x6b,0xcf,0xb6,0x91,0x64,0x4e,0xc4,0xf4,0xf5,0xf4,0xad,0xff, 0xf3,0xf3,0xf3,0xf3,0x6c,0xd0,0xb6,0x92,0x64,0x4d,0xc4,0xf2,0x6a,0xd0,0xb6,0x8f, 0x61,0x4b,0xc4,0xf3,0xf4,0xf4,0xa7,0xff,0xf4,0xf3,0xf4,0xf3,0x66,0xd0,0xb2,0x8b, 0x5d,0x45,0xc3,0xf4,0x64,0xcf,0xb0,0x89,0x5b,0x43,0xc1,0xf4,0x61,0xcf,0xae,0x86, 0x59,0x41,0xc0,0xf4,0xf4,0xf4,0x9f,0xff,0xf3,0xf2,0xf3,0xf2,0x5d,0xcc,0xa9,0x83, 0x54,0x3b,0xbb,0xf3,0x5a,0xca,0xa8,0x81,0x52,0x39,0xb9,0xf3,0xf3,0xf4,0x99,0xff, 0xf3,0xf3,0xf3,0xf3,0x56,0xc6,0xa3,0x7d,0x4d,0x34,0xb5,0xf3,0x53,0xc4,0xa1,0x7a, 0x4a,0x31,0xb3,0xf4,0x50,0xc2,0xa0,0x79,0x48,0x2f,0xb2,0xf1,0xf1,0xf1,0x91,0xff, 0xef,0xef,0xef,0xee,0x4c,0xbf,0x9c,0x73,0x44,0x2a,0xad,0xec,0x4a,0xbd,0x9a,0x72, 0x41,0x26,0xab,0xec,0xeb,0xeb,0x8a,0xfa,0xeb,0xe9,0xe9,0xe9,0x44,0xb8,0x96,0x6c, 0x3c,0x24,0xa7,0xe7,0x42,0xb6,0x93,0x6b,0x39,0x24,0xa5,0xe6,0x3f,0xb4,0x91,0x69, 0x37,0x23,0xa3,0xe5,0xe4,0xe4,0x82,0xf2,0xe2,0xe1,0xe1,0xe0,0x3e,0xb0,0x8e,0x64, 0x36,0x23,0x9f,0xdf,0x3e,0xae,0x8b,0x62,0x37,0x23,0x9d,0xde,0xdd,0xde,0x7b,0xec, 0xdd,0xdd,0xdc,0xdc,0x3e,0xaa,0x87,0x5d,0x36,0x24,0x99,0xda,0x3e,0xa8,0x84,0x5d, 0x36,0x23,0x98,0xd9,0x3e,0xa6,0x82,0x5e,0x36,0x24,0x95,0xd7,0xd7,0xd7,0x73,0xe5, 0xd7,0xd6,0xd7,0xd7,0x58,0x2e,0x2c,0x28,0x1d,0x3a,0x99,0xd9,0x58,0x2d,0x2c,0x28, 0x1d,0x3a,0x9c,0xdc,0xdc,0xdc,0x79,0xea,0xdd,0xdd,0xde,0xdd,0x58,0x2e,0x2d,0x28, 0x1d,0x3a,0xa0,0xe0,0x5b,0x2e,0x2c,0x28,0x1d,0x3a,0xa2,0xe2,0x5d,0x2e,0x2c,0x28, 0x1d,0x3a,0xa4,0xe4,0xe4,0xe5,0x81,0xf1,0xe4,0xe4,0xe3,0xe4,0x62,0x2e,0x2c,0x28, 0x1e,0x3b,0xa8,0xe6,0x64,0x2e,0x2c,0x29,0x1d,0x3e,0xaa,0xe8,0xea,0xea,0x87,0xf7, 0xea,0xea,0xea,0xeb,0x69,0x31,0x2f,0x2b,0x1d,0x43,0xaf,0xed,0x6a,0x33,0x32,0x2e, 0x1f,0x46,0xb1,0xef,0x6d,0x37,0x35,0x30,0x22,0x49,0xb3,0xf1,0xf2,0xf2,0x90,0xfe, 0xf1,0xf1,0xf1,0xf2,0x71,0x3b,0x3a,0x36,0x27,0x4d,0xb5,0xf4,0x74,0x3d,0x3c,0x38, 0x2a,0x50,0xb9,0xf5,0xf4,0xf4,0x97,0xff,0xf4,0xf4,0xf4,0xf5,0x78,0x43,0x41,0x3d, 0x30,0x54,0xbc,0xf5,0x7a,0x46,0x43,0x40,0x32,0x57,0xbe,0xf5,0x7d,0x47,0x46,0x42, 0x35,0x59,0xc1,0xf5,0xf5,0xf6,0x9e,0xff,0xf4,0xf4,0xf5,0xf4,0x81,0x4d,0x4b,0x47, 0x3a,0x5d,0xc4,0xf4,0x83,0x4f,0x4e,0x4a,0x3d,0x60,0xc6,0xf4,0xf5,0xf5,0xa5,0xff, 0xf4,0xf4,0xf5,0xf5,0x87,0x54,0x52,0x4e,0x41,0x65,0xc6,0xf4,0x8a,0x57,0x54,0x51, 0x44,0x67,0xc7,0xf5,0x8b,0x58,0x57,0x53,0x47,0x68,0xc7,0xf5,0xf5,0xf5,0xad,0xff, 0xf4,0xf4,0xf4,0xf4,0x8d,0x5a,0x58,0x53,0x46,0x68,0xc6,0xf4,0x8b,0x58,0x55,0x51, 0x43,0x66,0xc7,0xf4,0xf4,0xf4,0xa7,0xff,0xf4,0xf5,0xf5,0xf4,0x87,0x52,0x50,0x4b, 0x3f,0x60,0xc6,0xf4,0x85,0x50,0x4e,0x4a,0x3c,0x5f,0xc5,0xf5,0x82,0x4e,0x4b,0x47, 0x39,0x5d,0xc3,0xf5,0xf5,0xf5,0x9f,0xff,0xf4,0xf4,0xf4,0xf4,0x7e,0x49,0x47,0x42, 0x34,0x58,0xbe,0xf4,0x7c,0x46,0x44,0x40,0x31,0x55,0xbd,0xf4,0xf5,0xf4,0x99,0xff, 0xf4,0xf4,0xf4,0xf4,0x78,0x42,0x3f,0x3a,0x2c,0x52,0xb9,0xf4,0x76,0x3f,0x3c,0x38, 0x2a,0x4e,0xb7,0xf5,0x73,0x3d,0x3b,0x35,0x26,0x4c,0xb5,0xf3,0xf2,0xf2,0x91,0xff, 0xf0,0xf0,0xf0,0xf0,0x6e,0x38,0x35,0x30,0x21,0x47,0xb0,0xed,0x6d,0x35,0x32,0x2e, 0x1e,0x44,0xaf,0xed,0xed,0xec,0x8b,0xfa,0xeb,0xeb,0xeb,0xeb,0x68,0x2f,0x2d,0x28, 0x1d,0x40,0xac,0xe9,0x66,0x2e,0x2c,0x29,0x1d,0x3e,0xa9,0xe8,0x63,0x2d,0x2c,0x28, 0x1d,0x3a,0xa7,0xe6,0xe5,0xe5,0x82,0xf1,0xe3,0xe2,0xe3,0xe3,0x5e,0x2e,0x2c,0x29, 0x1d,0x3b,0xa2,0xe0,0x5d,0x2e,0x2d,0x28,0x1d,0x3a,0xa1,0xdf,0xe0,0xdf,0x7c,0xec, 0xdf,0xde,0xde,0xde,0x58,0x2e,0x2c,0x29,0x1d,0x3a,0x9d,0xdc,0x58,0x2e,0x2c,0x28, 0x1d,0x3b,0x9c,0xda,0x59,0x2d,0x2c,0x29,0x1d,0x3a,0x98,0xd8,0xd9,0xd8,0x72,0xe5, 0xd8,0xd8,0xd9,0xd8,0x9b,0x4a,0x18,0x15,0x30,0x8a,0xda,0xdb,0x9d,0x4a,0x18,0x15, 0x30,0x8c,0xdd,0xdd,0xde,0xde,0x7a,0xeb,0xdf,0xdf,0xe0,0xe0,0xa0,0x4a,0x17,0x14, 0x2f,0x91,0xe1,0xe2,0xa3,0x49,0x18,0x15,0x30,0x93,0xe4,0xe4,0xa4,0x4a,0x18,0x15, 0x30,0x94,0xe5,0xe5,0xe6,0xe6,0x82,0xf2,0xe6,0xe5,0xe5,0xe7,0xa9,0x4e,0x18,0x14, 0x30,0x99,0xe8,0xe9,0xab,0x51,0x18,0x15,0x30,0x9b,0xea,0xea,0xeb,0xeb,0x88,0xf7, 0xec,0xec,0xec,0xec,0xaf,0x56,0x18,0x15,0x35,0x9f,0xef,0xf0,0xb1,0x57,0x17,0x15, 0x38,0xa1,0xf1,0xf1,0xb2,0x5a,0x1b,0x16,0x3b,0xa3,0xf2,0xf3,0xf3,0xf4,0x90,0xff, 0xf3,0xf3,0xf2,0xf3,0xb7,0x5f,0x1f,0x1c,0x40,0xa7,0xf5,0xf6,0xb8,0x61,0x24,0x1f, 0x42,0xa9,0xf6,0xf6,0xf6,0xf6,0x96,0xff,0xf6,0xf6,0xf6,0xf6,0xbd,0x66,0x29,0x25, 0x48,0xae,0xf5,0xf6,0xbf,0x68,0x2b,0x29,0x4a,0xaf,0xf7,0xf7,0xc0,0x69,0x2e,0x2b, 0x4c,0xb1,0xf7,0xf7,0xf6,0xf6,0x9f,0xff,0xf5,0xf5,0xf5,0xf5,0xc5,0x6f,0x34,0x31, 0x51,0xb5,0xf6,0xf6,0xc6,0x70,0x36,0x33,0x53,0xb7,0xf6,0xf6,0xf6,0xf6,0xa4,0xff, 0xf6,0xf6,0xf6,0xf6,0xc8,0x75,0x3b,0x38,0x58,0xbc,0xf6,0xf7,0xc9,0x77,0x3d,0x3a, 0x5a,0xbc,0xf7,0xf7,0xc9,0x79,0x40,0x3d,0x5c,0xbc,0xf6,0xf7,0xf7,0xf7,0xad,0xff, 0xf6,0xf5,0xf5,0xf5,0xc9,0x7a,0x41,0x3d,0x5c,0xbb,0xf5,0xf6,0xc9,0x78,0x3f,0x3a, 0x59,0xbc,0xf6,0xf6,0xf6,0xf6,0xa7,0xff,0xf6,0xf6,0xf6,0xf6,0xc8,0x73,0x39,0x36, 0x55,0xb8,0xf6,0xf7,0xc7,0x72,0x36,0x34,0x54,0xb6,0xf7,0xf7,0xc5,0x70,0x34,0x30, 0x50,0xb4,0xf7,0xf7,0xf7,0xf7,0x9f,0xff,0xf5,0xf5,0xf5,0xf5,0xc2,0x6b,0x2f,0x2b, 0x4c,0xb0,0xf5,0xf6,0xbf,0x68,0x2d,0x28,0x49,0xae,0xf6,0xf6,0xf6,0xf6,0x99,0xff, 0xf6,0xf6,0xf6,0xf6,0xbc,0x65,0x26,0x22,0x44,0xaa,0xf6,0xf7,0xbb,0x62,0x23,0x20, 0x42,0xa8,0xf6,0xf6,0xb8,0x60,0x21,0x1d,0x3e,0xa6,0xf6,0xf4,0xf4,0xf5,0x91,0xff, 0xf1,0xf2,0xf1,0xf1,0xb5,0x5c,0x1c,0x17,0x3b,0xa3,0xef,0xf0,0xb2,0x58,0x18,0x15, 0x38,0x9f,0xee,0xee,0xef,0xee,0x8b,0xf9,0xec,0xed,0xed,0xed,0xae,0x54,0x18,0x15, 0x32,0x9c,0xeb,0xeb,0xac,0x52,0x18,0x15,0x30,0x99,0xe9,0xea,0xaa,0x4f,0x17,0x14, 0x30,0x97,0xe8,0xe8,0xe7,0xe7,0x82,0xf1,0xe5,0xe4,0xe4,0xe4,0xa6,0x4b,0x18,0x15, 0x30,0x94,0xe2,0xe3,0xa5,0x4a,0x17,0x15,0x30,0x92,0xe1,0xe1,0xe2,0xe1,0x7b,0xec, 0xe0,0xe0,0xdf,0xe0,0xa0,0x49,0x18,0x14,0x2f,0x8d,0xde,0xdf,0x9e,0x4a,0x17,0x15, 0x2f,0x8c,0xdc,0xdc,0x9c,0x49,0x17,0x14,0x2f,0x89,0xda,0xda,0xdb,0xda,0x72,0xe5, 0xd9,0xdb,0xdb,0xdb,0xdb,0xdb,0x74,0xe6,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0x76,0xe8, 0xde,0xdf,0xdf,0xe0,0xe0,0xe0,0x79,0xeb,0xe0,0xe0,0xe1,0xe1,0xe1,0xe2,0x7b,0xec, 0xe2,0xe4,0xe4,0xe4,0xe3,0xe5,0x7d,0xee,0xe4,0xe5,0xe6,0xe5,0xe5,0xe6,0x80,0xef, 0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0x81,0xf2,0xe7,0xe8,0xe7,0xe8,0xe8,0xe8,0x84,0xf4, 0xe9,0xea,0xea,0xea,0xea,0xeb,0x86,0xf6,0xec,0xec,0xec,0xec,0xec,0xed,0x87,0xf8, 0xed,0xee,0xee,0xee,0xee,0xef,0x8a,0xf9,0xef,0xf1,0xf1,0xf1,0xf0,0xf1,0x8c,0xfb, 0xf1,0xf3,0xf3,0xf2,0xf3,0xf3,0x8e,0xfd,0xf4,0xf4,0xf4,0xf4,0xf6,0xf5,0x90,0xff, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x92,0xff,0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0x95,0xff, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x96,0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x98,0xff, 0xf6,0xf8,0xf7,0xf8,0xf7,0xf8,0x9b,0xff,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0x9d,0xff, 0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0x9f,0xff,0xf6,0xf7,0xf7,0xf6,0xf7,0xf7,0xa1,0xff, 0xf7,0xf7,0xf6,0xf7,0xf7,0xf7,0xa3,0xff,0xf6,0xf7,0xf6,0xf7,0xf7,0xf7,0xa4,0xff, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xa7,0xff,0xf7,0xf7,0xf8,0xf8,0xf7,0xf7,0xa9,0xff, 0xf8,0xf8,0xf8,0xf7,0xf8,0xf7,0xaa,0xff,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xae,0xff, 0xf6,0xf7,0xf6,0xf6,0xf7,0xf7,0xac,0xff,0xf6,0xf7,0xf7,0xf7,0xf6,0xf6,0xa9,0xff, 0xf7,0xf6,0xf7,0xf7,0xf7,0xf7,0xa7,0xff,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xa5,0xff, 0xf7,0xf8,0xf7,0xf8,0xf6,0xf8,0xa3,0xff,0xf8,0xf8,0xf8,0xf8,0xf7,0xf8,0xa1,0xff, 0xf8,0xf7,0xf8,0xf7,0xf8,0xf7,0x9f,0xff,0xf7,0xf6,0xf7,0xf7,0xf6,0xf7,0x9d,0xff, 0xf6,0xf7,0xf7,0xf6,0xf7,0xf7,0x9b,0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x99,0xff, 0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x97,0xff,0xf7,0xf8,0xf8,0xf7,0xf7,0xf8,0x95,0xff, 0xf8,0xf7,0xf7,0xf8,0xf7,0xf8,0x93,0xff,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0x91,0xfe, 0xf3,0xf4,0xf3,0xf2,0xf3,0xf3,0x8e,0xfd,0xf3,0xf2,0xf1,0xf1,0xf2,0xf1,0x8c,0xfb, 0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0x8a,0xf9,0xee,0xee,0xef,0xee,0xed,0xee,0x89,0xf7, 0xed,0xed,0xee,0xed,0xec,0xed,0x86,0xf6,0xec,0xec,0xeb,0xeb,0xeb,0xea,0x84,0xf3, 0xeb,0xe9,0xea,0xea,0xe9,0xe9,0x82,0xf1,0xe6,0xe7,0xe6,0xe5,0xe5,0xe5,0x80,0xef, 0xe6,0xe5,0xe4,0xe5,0xe5,0xe4,0x7d,0xed,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x7c,0xec, 0xe2,0xe1,0xe1,0xe1,0xe1,0xe0,0x79,0xea,0xdf,0xe0,0xe0,0xe0,0xde,0xe0,0x78,0xe7, 0xdf,0xdf,0xde,0xdd,0xde,0xdd,0x74,0xe6,0xdd,0xdc,0xdc,0xdc,0xdc,0xdb,0x72,0xe5, 0xdb,0xdc,0xdd,0xdc,0xdd,0xde,0x75,0xe6,0xdf,0xde,0xde,0xdf,0xe0,0xdf,0x77,0xe9, 0xe0,0xe1,0xe0,0xe1,0xe1,0xe1,0x78,0xea,0xe2,0xe2,0xe3,0xe2,0xe3,0xe3,0x7b,0xec, 0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0x7d,0xee,0xe6,0xe7,0xe7,0xe7,0xe8,0xe7,0x7f,0xef, 0xe8,0xe8,0xe9,0xe9,0xea,0xea,0x81,0xf2,0xe8,0xe9,0xea,0xea,0xeb,0xea,0x84,0xf4, 0xeb,0xec,0xec,0xec,0xec,0xed,0x86,0xf5,0xed,0xee,0xee,0xed,0xef,0xef,0x87,0xf6, 0xef,0xef,0xef,0xf0,0xf1,0xf0,0x89,0xf9,0xf2,0xf2,0xf2,0xf3,0xf1,0xf2,0x8d,0xfb, 0xf3,0xf5,0xf4,0xf4,0xf4,0xf5,0x8e,0xfc,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0x90,0xff, 0xf6,0xf6,0xf7,0xf6,0xf8,0xf7,0x91,0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0x95,0xff, 0xf9,0xf8,0xf8,0xf8,0xf9,0xf9,0x97,0xff,0xf9,0xf9,0xf8,0xf9,0xf9,0xf9,0x98,0xff, 0xf9,0xf9,0xf9,0xf9,0xf8,0xf9,0x9a,0xff,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x9c,0xff, 0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x9f,0xff,0xf8,0xf7,0xf9,0xf8,0xf9,0xf9,0xa1,0xff, 0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0xa4,0xff,0xf9,0xf9,0xf8,0xf8,0xf9,0xf9,0xa4,0xff, 0xf9,0xf8,0xf8,0xf8,0xf9,0xf9,0xa7,0xff,0xf9,0xfa,0xf9,0xfa,0xf8,0xf9,0xa9,0xff, 0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xaa,0xff,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0xad,0xff, 0xf7,0xf8,0xf9,0xf7,0xf9,0xf9,0xac,0xff,0xf8,0xf9,0xf9,0xf8,0xf9,0xf9,0xa9,0xff, 0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xa7,0xff,0xf9,0xf8,0xf8,0xf8,0xf9,0xf8,0xa5,0xff, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xa3,0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xa2,0xff, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x9f,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x9d,0xff, 0xf9,0xf8,0xf9,0xf8,0xf8,0xf8,0x9b,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0x99,0xff, 0xf9,0xf9,0xf8,0xf8,0xf9,0xf8,0x96,0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x95,0xff, 0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0x93,0xff,0xf8,0xf9,0xf9,0xf8,0xf8,0xf8,0x91,0xff, 0xf5,0xf5,0xf6,0xf4,0xf5,0xf6,0x8f,0xfd,0xf4,0xf4,0xf3,0xf4,0xf3,0xf2,0x8c,0xfb, 0xf3,0xf2,0xf2,0xf1,0xf1,0xf1,0x8b,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0x89,0xf7, 0xef,0xef,0xef,0xee,0xed,0xef,0x85,0xf5,0xee,0xed,0xed,0xec,0xec,0xec,0x84,0xf3, 0xeb,0xec,0xeb,0xec,0xea,0xea,0x82,0xf2,0xe8,0xe8,0xe8,0xe7,0xe8,0xe8,0x80,0xef, 0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0x7d,0xed,0xe6,0xe5,0xe4,0xe4,0xe5,0xe3,0x7b,0xec, 0xe4,0xe3,0xe3,0xe3,0xe3,0xe2,0x79,0xea,0xe2,0xe2,0xe2,0xe2,0xe0,0xe1,0x78,0xe7, 0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0x75,0xe6,0xdf,0xdf,0xde,0xdd,0xde,0xdd,0x73,0xe5, 0xde,0xde,0xde,0xdf,0xdf,0xdf,0x75,0xe6,0xe1,0xe0,0xe1,0xe0,0xe1,0xe2,0x76,0xe9, 0xe2,0xe2,0xe2,0xe3,0xe3,0xe2,0x79,0xea,0xe3,0xe4,0xe5,0xe5,0xe5,0xe5,0x7c,0xec, 0xe6,0xe7,0xe7,0xe7,0xe7,0xe8,0x7d,0xee,0xe8,0xe9,0xe9,0xe8,0xe9,0xea,0x7f,0xef, 0xeb,0xeb,0xea,0xeb,0xeb,0xeb,0x81,0xf1,0xec,0xeb,0xeb,0xec,0xec,0xec,0x84,0xf3, 0xed,0xed,0xee,0xee,0xee,0xef,0x86,0xf5,0xee,0xef,0xef,0xef,0xf0,0xf0,0x88,0xf7, 0xf1,0xf1,0xf2,0xf3,0xf2,0xf2,0x8a,0xf9,0xf4,0xf3,0xf4,0xf4,0xf4,0xf5,0x8c,0xfb, 0xf5,0xf6,0xf6,0xf6,0xf6,0xf7,0x8e,0xfd,0xf8,0xf8,0xf8,0xf7,0xf9,0xf8,0x90,0xff, 0xf8,0xf9,0xf9,0xf9,0xf9,0xfa,0x92,0xff,0xf9,0xfa,0xf9,0xfa,0xf9,0xf9,0x95,0xff, 0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x97,0xff,0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0x98,0xff, 0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x9a,0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x9d,0xff, 0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x9e,0xff,0xf9,0xf9,0xfa,0xf9,0xf9,0xf9,0xa0,0xff, 0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xa3,0xff,0xfa,0xf9,0xf9,0xf9,0xf9,0xfa,0xa5,0xff, 0xf9,0xf9,0xfa,0xfa,0xf9,0xfa,0xa7,0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xa9,0xff, 0xfa,0xfa,0xfa,0xfb,0xfa,0xfb,0xaa,0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xad,0xff, 0xf9,0xf9,0xf9,0xfa,0xfa,0xf9,0xab,0xff,0xf9,0xfa,0xf9,0xf9,0xf9,0xf9,0xa9,0xff, 0xf9,0xfa,0xfa,0xf9,0xfa,0xf9,0xa7,0xff,0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0xa5,0xff, 0xfa,0xfa,0xfa,0xfa,0xfa,0xfb,0xa3,0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xa2,0xff, 0xfa,0xfa,0xfa,0xfb,0xfa,0xfa,0x9f,0xff,0xf9,0xf9,0xf9,0xf9,0xfa,0xf9,0x9d,0xff, 0xf9,0xf9,0xf9,0xfa,0xf9,0xf9,0x9b,0xff,0xf9,0xf9,0xfa,0xf9,0xfa,0xfa,0x99,0xff, 0xf9,0xfa,0xfa,0xfa,0xf9,0xfa,0x97,0xff,0xfa,0xfb,0xfb,0xfa,0xfb,0xfa,0x95,0xff, 0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x93,0xff,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x91,0xfe, 0xf8,0xf7,0xf8,0xf6,0xf7,0xf7,0x8f,0xfd,0xf6,0xf6,0xf5,0xf5,0xf5,0xf4,0x8d,0xfa, 0xf4,0xf3,0xf4,0xf3,0xf3,0xf3,0x8a,0xfa,0xf2,0xf2,0xf3,0xf2,0xf1,0xf2,0x88,0xf7, 0xf1,0xf1,0xf1,0xf0,0xf1,0xf0,0x86,0xf5,0xef,0xf0,0xef,0xef,0xee,0xee,0x84,0xf3, 0xee,0xed,0xed,0xed,0xec,0xec,0x82,0xf1,0xeb,0xeb,0xeb,0xe9,0xe9,0xea,0x80,0xef, 0xe9,0xe8,0xe8,0xe8,0xe7,0xe8,0x7d,0xed,0xe6,0xe7,0xe6,0xe6,0xe6,0xe6,0x7b,0xec, 0xe6,0xe5,0xe6,0xe5,0xe4,0xe4,0x7a,0xea,0xe4,0xe3,0xe4,0xe4,0xe2,0xe3,0x77,0xe8, 0xe2,0xe2,0xe2,0xe1,0xe1,0xe2,0x75,0xe6,0xe1,0xe0,0xdf,0xdf,0xdf,0xde,0x73,0xe5, 0xdf,0xe0,0xe1,0xe0,0xe0,0xe1,0x74,0xe6,0xe1,0xe2,0xe2,0xe2,0xe2,0xe3,0x77,0xe8, 0xe4,0xe4,0xe4,0xe6,0xe4,0xe4,0x79,0xeb,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0x7b,0xec, 0xe7,0xe8,0xe9,0xe9,0xe9,0xea,0x7d,0xed,0xe9,0xea,0xea,0xea,0xeb,0xeb,0x7f,0xef, 0xec,0xed,0xec,0xed,0xed,0xed,0x81,0xf2,0xed,0xed,0xee,0xee,0xee,0xee,0x84,0xf4, 0xef,0xf0,0xf0,0xef,0xf0,0xf1,0x86,0xf5,0xf1,0xf1,0xf1,0xf2,0xf2,0xf1,0x88,0xf8, 0xf3,0xf3,0xf3,0xf5,0xf4,0xf5,0x8a,0xf9,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0x8c,0xfb, 0xf7,0xf7,0xf8,0xf7,0xf8,0xf9,0x8e,0xfd,0xfa,0xfa,0xf9,0xfa,0xfa,0xfb,0x90,0xff, 0xfa,0xfa,0xfa,0xfa,0xfa,0xfb,0x92,0xff,0xfb,0xfa,0xfb,0xfa,0xfb,0xfb,0x95,0xff, 0xfb,0xfb,0xfb,0xfc,0xfb,0xfb,0x97,0xff,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0x98,0xff, 0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x9a,0xff,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0x9d,0xff, 0xfb,0xfc,0xfc,0xfc,0xfb,0xfc,0x9f,0xff,0xfb,0xfa,0xfb,0xfb,0xfb,0xfb,0xa0,0xff, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xa3,0xff,0xfb,0xfb,0xfb,0xfc,0xfb,0xfb,0xa5,0xff, 0xfc,0xfb,0xfb,0xfc,0xfc,0xfb,0xa7,0xff,0xfc,0xfb,0xfc,0xfc,0xfb,0xfc,0xa8,0xff, 0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xab,0xff,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xad,0xff, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xac,0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xa9,0xff, 0xfb,0xfb,0xfb,0xfc,0xfa,0xfb,0xa7,0xff,0xfb,0xfc,0xfb,0xfc,0xfc,0xfb,0xa5,0xff, 0xfc,0xfb,0xfb,0xfb,0xfc,0xfc,0xa4,0xff,0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,0xa2,0xff, 0xfc,0xfb,0xfb,0xfb,0xfc,0xfc,0x9f,0xff,0xfb,0xfb,0xfb,0xfa,0xfb,0xfb,0x9d,0xff, 0xfb,0xfb,0xfb,0xfb,0xfa,0xfb,0x9b,0xff,0xfb,0xfb,0xfb,0xfc,0xfb,0xfb,0x9a,0xff, 0xfc,0xfc,0xfb,0xfc,0xfb,0xfc,0x97,0xff,0xfc,0xfc,0xfc,0xfb,0xfc,0xfb,0x94,0xff, 0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x92,0xff,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0x91,0xff, 0xf9,0xf9,0xf8,0xf9,0xf8,0xf8,0x8e,0xfc,0xf8,0xf7,0xf7,0xf7,0xf7,0xf5,0x8c,0xfb, 0xf6,0xf5,0xf5,0xf6,0xf5,0xf4,0x8b,0xf9,0xf5,0xf4,0xf3,0xf4,0xf3,0xf4,0x89,0xf7, 0xf3,0xf3,0xf1,0xf2,0xf2,0xf2,0x86,0xf5,0xf1,0xf0,0xf0,0xf0,0xf0,0xef,0x84,0xf4, 0xee,0xf0,0xee,0xef,0xee,0xee,0x82,0xf2,0xec,0xec,0xec,0xeb,0xeb,0xeb,0x80,0xef, 0xea,0xea,0xe9,0xe9,0xe9,0xe9,0x7d,0xee,0xe9,0xe9,0xe8,0xe9,0xe8,0xe7,0x7b,0xec, 0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0x79,0xea,0xe5,0xe6,0xe6,0xe5,0xe5,0xe4,0x78,0xe8, 0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0x75,0xe6,0xe2,0xe3,0xe1,0xe2,0xe2,0xe0,0x72,0xe4, 0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0x74,0xe6,0xe3,0xe3,0xe3,0xe3,0xe5,0xe5,0x77,0xe8, 0xe5,0xe5,0xe5,0xe6,0xe7,0xe7,0x79,0xeb,0xe8,0xe8,0xe9,0xe8,0xe9,0xe9,0x7b,0xec, 0xea,0xea,0xeb,0xea,0xeb,0xeb,0x7d,0xee,0xeb,0xec,0xec,0xec,0xed,0xed,0x7f,0xef, 0xef,0xed,0xee,0xef,0xef,0xef,0x81,0xf2,0xef,0xee,0xef,0xef,0xef,0xef,0x84,0xf3, 0xf0,0xf1,0xf1,0xf1,0xf1,0xf2,0x86,0xf5,0xf2,0xf3,0xf2,0xf3,0xf4,0xf4,0x87,0xf6, 0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0x8b,0xfa,0xf6,0xf7,0xf8,0xf7,0xf7,0xf8,0x8c,0xfb, 0xf8,0xf9,0xf9,0xfa,0xf9,0xfa,0x8e,0xfc,0xfc,0xfb,0xfb,0xfc,0xfd,0xfd,0x90,0xff, 0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x92,0xff,0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0x94,0xff, 0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0x97,0xff,0xfd,0xfc,0xfc,0xfc,0xfc,0xfd,0x98,0xff, 0xfd,0xfd,0xfd,0xfc,0xfd,0xfc,0x9b,0xff,0xfd,0xfc,0xfd,0xfd,0xfc,0xfc,0x9d,0xff, 0xfd,0xfd,0xfe,0xfc,0xfd,0xfd,0x9e,0xff,0xfb,0xfb,0xfc,0xfc,0xfc,0xfb,0xa1,0xff, 0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xa3,0xff,0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xa6,0xff, 0xfd,0xfd,0xfc,0xfc,0xfd,0xfd,0xa7,0xff,0xfd,0xfd,0xfc,0xfd,0xfd,0xfd,0xa9,0xff, 0xfc,0xfd,0xfd,0xfd,0xfc,0xfd,0xaa,0xff,0xfe,0xfc,0xfd,0xfc,0xfd,0xfd,0xad,0xff, 0xfc,0xfc,0xfc,0xfb,0xfc,0xfc,0xab,0xff,0xfc,0xfb,0xfc,0xfc,0xfc,0xfc,0xa9,0xff, 0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,0xa7,0xff,0xfd,0xfc,0xfc,0xfb,0xfc,0xfd,0xa5,0xff, 0xfd,0xfd,0xfc,0xfc,0xfc,0xfc,0xa4,0xff,0xfd,0xfc,0xfd,0xfc,0xfd,0xfc,0xa1,0xff, 0xfd,0xfc,0xfd,0xfc,0xfe,0xfd,0x9f,0xff,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb,0x9d,0xff, 0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0x9b,0xff,0xfb,0xfc,0xfb,0xfc,0xfc,0xfd,0x9a,0xff, 0xfd,0xfc,0xfc,0xfc,0xfc,0xfd,0x97,0xff,0xfc,0xfc,0xfd,0xfd,0xfc,0xfc,0x95,0xff, 0xfc,0xfd,0xfc,0xfd,0xfd,0xfc,0x93,0xff,0xfd,0xfd,0xfe,0xfd,0xfd,0xfd,0x91,0xfe, 0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0x8f,0xfc,0xf9,0xfa,0xf8,0xf9,0xf8,0xf8,0x8c,0xfb, 0xf6,0xf7,0xf7,0xf7,0xf6,0xf6,0x8b,0xfa,0xf6,0xf6,0xf6,0xf4,0xf5,0xf6,0x88,0xf7, 0xf4,0xf4,0xf3,0xf3,0xf4,0xf3,0x86,0xf5,0xf3,0xf3,0xf1,0xf2,0xf2,0xf1,0x84,0xf4, 0xf1,0xf0,0xf1,0xf0,0xf1,0xf0,0x82,0xf1,0xee,0xee,0xee,0xec,0xed,0xed,0x7f,0xf0, 0xec,0xec,0xec,0xeb,0xeb,0xeb,0x7d,0xee,0xeb,0xea,0xea,0xea,0xe9,0xea,0x7b,0xec, 0xea,0xe8,0xe9,0xe8,0xe8,0xe8,0x79,0xea,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0x77,0xe8, 0xe6,0xe5,0xe6,0xe5,0xe4,0xe4,0x74,0xe6,0xe4,0xe4,0xe4,0xe3,0xe4,0xe3,0x72,0xe4, 0xe3,0xe3,0xe4,0xe4,0xe3,0xe5,0x74,0xe6,0xe6,0xe5,0xe5,0xe6,0xe6,0xe7,0x76,0xe9, 0xe7,0xe7,0xe7,0xe8,0xe8,0xe9,0x79,0xeb,0xe9,0xeb,0xea,0xeb,0xea,0xeb,0x7b,0xec, 0xeb,0xec,0xec,0xec,0xec,0xed,0x7d,0xee,0xed,0xed,0xed,0xed,0xee,0xef,0x80,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0x82,0xf2,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0x84,0xf3, 0xf2,0xf3,0xf3,0xf2,0xf3,0xf4,0x86,0xf5,0xf4,0xf4,0xf4,0xf4,0xf6,0xf6,0x88,0xf7, 0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0x8a,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x8d,0xfb, 0xfa,0xfb,0xfa,0xfb,0xfc,0xfc,0x8e,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x90,0xff, 0xfe,0xfd,0xfd,0xfe,0xfd,0xfd,0x92,0xff,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd,0x95,0xff, 0xfd,0xfd,0xfd,0xfe,0xff,0xfe,0x97,0xff,0xfe,0xff,0xfe,0xfe,0xfe,0xfe,0x99,0xff, 0xfe,0xff,0xfe,0xfe,0xff,0xff,0x9a,0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0x9d,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0xff,0xfd,0xfe,0xfd,0xfd,0xfd,0xfd,0xa1,0xff, 0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xa3,0xff,0xfe,0xfe,0xfe,0xfd,0xfe,0xfe,0xa5,0xff, 0xfe,0xff,0xfe,0xfe,0xfe,0xff,0xa7,0xff,0xff,0xfe,0xfe,0xff,0xfe,0xff,0xa9,0xff, 0xff,0xfe,0xfe,0xfe,0xfe,0xff,0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xad,0xff, 0xfd,0xfe,0xfe,0xfd,0xfd,0xfe,0xab,0xff,0xfd,0xfe,0xfd,0xfd,0xfd,0xfe,0xa9,0xff, 0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xa7,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xa6,0xff, 0xfe,0xff,0xfe,0xfe,0xfe,0xff,0xa3,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xa2,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0xff,0xfd,0xfe,0xfd,0xfd,0xfd,0xfe,0x9d,0xff, 0xfe,0xfd,0xfe,0xfe,0xfd,0xfe,0x9b,0xff,0xfd,0xfd,0xfe,0xfd,0xfe,0xff,0x98,0xff, 0xfe,0xfe,0xfe,0xfe,0xff,0xfe,0x97,0xff,0xfe,0xfe,0xfe,0xff,0xfe,0xff,0x94,0xff, 0xfe,0xff,0xfe,0xfe,0xfe,0xff,0x93,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x91,0xff, 0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0x8e,0xfd,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0x8c,0xfb, 0xf9,0xf8,0xf8,0xf8,0xf9,0xf8,0x8b,0xf9,0xf8,0xf8,0xf8,0xf7,0xf6,0xf7,0x88,0xf6, 0xf5,0xf6,0xf6,0xf5,0xf5,0xf5,0x86,0xf5,0xf4,0xf4,0xf3,0xf4,0xf4,0xf3,0x84,0xf4, 0xf2,0xf3,0xf3,0xf3,0xf2,0xf2,0x82,0xf1,0xef,0xf0,0xf0,0xef,0xef,0xef,0x80,0xf0, 0xed,0xed,0xed,0xed,0xed,0xed,0x7d,0xee,0xec,0xec,0xeb,0xeb,0xec,0xec,0x7b,0xec, 0xeb,0xea,0xea,0xea,0xea,0xea,0x79,0xea,0xe9,0xe9,0xe8,0xe9,0xe7,0xe8,0x77,0xe8, 0xe7,0xe7,0xe7,0xe6,0xe6,0xe7,0x75,0xe7,0xe7,0xe6,0xe5,0xe5,0xe6,0xe5,0x72,0xe5, 0xe4,0xe5,0xe5,0xe6,0xe5,0xe7,0x75,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0x76,0xe9, 0xe9,0xe9,0xe9,0xe9,0xea,0xea,0x79,0xea,0xea,0xe9,0xec,0xeb,0xea,0xeb,0x7b,0xec, 0xeb,0xed,0xec,0xec,0xed,0xed,0x7e,0xee,0xee,0xed,0xee,0xed,0xee,0xef,0x7f,0xef, 0xf0,0xf0,0xef,0xf0,0xf0,0xf0,0x81,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0x84,0xf3, 0xf4,0xf4,0xf4,0xf5,0xf4,0xf5,0x86,0xf5,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0x88,0xf6, 0xf7,0xf7,0xf8,0xf9,0xf7,0xf8,0x8a,0xfa,0xf8,0xf9,0xf9,0xf9,0xfa,0xfa,0x8c,0xfb, 0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0x8e,0xfc,0xfd,0xfc,0xfd,0xfd,0xfd,0xfd,0x90,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x92,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x94,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x97,0xff,0xff,0xfe,0xff,0xff,0xfe,0xff,0x98,0xff, 0xfe,0xff,0xfe,0xfe,0xfe,0xfe,0x9a,0xff,0xfe,0xff,0xfe,0xfe,0xfe,0xfe,0x9d,0xff, 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa1,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5,0xff, 0xff,0xfe,0xff,0xff,0xfe,0xff,0xa7,0xff,0xfe,0xff,0xff,0xfe,0xff,0xff,0xa9,0xff, 0xfe,0xfe,0xff,0xfe,0xfe,0xff,0xab,0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xad,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa9,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xa7,0xff,0xff,0xfe,0xff,0xff,0xfe,0xff,0xa5,0xff, 0xff,0xff,0xfe,0xfe,0xfe,0xfe,0xa4,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xa2,0xff, 0xfe,0xfe,0xff,0xfe,0xff,0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9d,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0x9b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98,0xff, 0xff,0xfe,0xff,0xff,0xff,0xfe,0x97,0xff,0xfe,0xff,0xfe,0xfe,0xff,0xff,0x95,0xff, 0xff,0xff,0xff,0xfe,0xff,0xfe,0x93,0xff,0xfe,0xff,0xfe,0xfe,0xfe,0xfe,0x91,0xfe, 0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0x8f,0xfc,0xfd,0xfd,0xfc,0xfc,0xfc,0xfb,0x8d,0xfb, 0xfb,0xfa,0xfb,0xfa,0xf9,0xf9,0x8b,0xf9,0xf8,0xf8,0xf9,0xf8,0xf7,0xf7,0x88,0xf7, 0xf6,0xf7,0xf5,0xf5,0xf5,0xf5,0x85,0xf5,0xf4,0xf4,0xf3,0xf3,0xf4,0xf3,0x83,0xf4, 0xf1,0xf2,0xf2,0xf1,0xf1,0xf1,0x82,0xf1,0xf1,0xf1,0xf0,0xf0,0xf1,0xf0,0x80,0xef, 0xef,0xf0,0xee,0xef,0xef,0xef,0x7d,0xee,0xee,0xee,0xed,0xed,0xed,0xec,0x7b,0xec, 0xec,0xea,0xeb,0xeb,0xe9,0xea,0x79,0xea,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0x78,0xe8, 0xe7,0xe7,0xe6,0xe6,0xe7,0xe6,0x75,0xe6,0xe5,0xe4,0xe4,0xe4,0xe5,0xe4,0x73,0xe4, 0xe2,0xe3,0xe4,0xe3,0xe4,0xe4,0x74,0xe6,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0x77,0xe8, 0xe7,0xe7,0xe7,0xe8,0xe7,0xe8,0x79,0xea,0xe9,0xe8,0xe9,0xe8,0xe9,0xe9,0x7b,0xec, 0xea,0xeb,0xeb,0xea,0xeb,0xeb,0x7d,0xed,0xec,0xec,0xec,0xec,0xed,0xed,0x7f,0xf0, 0xee,0xee,0xee,0xee,0xee,0xed,0x81,0xf1,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0x84,0xf4, 0xf2,0xf3,0xf3,0xf2,0xf3,0xf3,0x86,0xf5,0xf4,0xf4,0xf5,0xf4,0xf4,0xf5,0x88,0xf7, 0xf6,0xf5,0xf6,0xf6,0xf7,0xf6,0x89,0xf9,0xf7,0xf7,0xf8,0xf8,0xf8,0xf9,0x8d,0xfb, 0xf8,0xf9,0xfa,0xfa,0xfa,0xfb,0x8f,0xfc,0xfb,0xfb,0xfb,0xfa,0xfa,0xfb,0x90,0xff, 0xfe,0xfd,0xfd,0xfe,0xfe,0xfd,0x92,0xff,0xfe,0xfd,0xfe,0xfe,0xfd,0xfe,0x94,0xff, 0xfd,0xfe,0xfe,0xfd,0xfc,0xfd,0x97,0xff,0xfd,0xfc,0xfd,0xfc,0xfe,0xfc,0x99,0xff, 0xfd,0xfd,0xfc,0xfc,0xfd,0xfd,0x9a,0xff,0xfc,0xfd,0xfc,0xfd,0xfc,0xfc,0x9d,0xff, 0xfd,0xfc,0xfd,0xfc,0xfc,0xfc,0x9f,0xff,0xfe,0xfd,0xfd,0xfe,0xfe,0xfd,0xa0,0xff, 0xfd,0xfd,0xfd,0xfe,0xfd,0xfd,0xa3,0xff,0xfd,0xfd,0xfe,0xfe,0xfd,0xfe,0xa5,0xff, 0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0xa7,0xff,0xfc,0xfc,0xfc,0xfd,0xfc,0xfc,0xa9,0xff, 0xfd,0xfc,0xfc,0xfd,0xfd,0xfd,0xab,0xff,0xfd,0xfc,0xfd,0xfb,0xfc,0xfc,0xae,0xff, 0xfd,0xfe,0xfd,0xfe,0xfd,0xfd,0xac,0xff,0xfd,0xfe,0xfd,0xfd,0xfd,0xfe,0xa9,0xff, 0xfd,0xfe,0xfe,0xfd,0xfd,0xfd,0xa6,0xff,0xfd,0xfd,0xfe,0xfd,0xfd,0xfc,0xa5,0xff, 0xfd,0xfd,0xfc,0xfd,0xfd,0xfd,0xa4,0xff,0xfd,0xfc,0xfd,0xfd,0xfd,0xfd,0xa2,0xff, 0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0x9e,0xff,0xfd,0xfe,0xfd,0xfe,0xfd,0xfd,0x9d,0xff, 0xfd,0xfe,0xfd,0xfd,0xfd,0xfe,0x9b,0xff,0xfd,0xfd,0xfd,0xfe,0xfd,0xfd,0x98,0xff, 0xfd,0xfd,0xfe,0xfd,0xfe,0xfc,0x97,0xff,0xfc,0xfd,0xfc,0xfc,0xfc,0xfc,0x95,0xff, 0xfd,0xfd,0xfc,0xfc,0xfc,0xfd,0x93,0xff,0xfc,0xfc,0xfd,0xfc,0xfb,0xfc,0x91,0xfe, 0xfd,0xfd,0xfc,0xfc,0xfc,0xfb,0x8f,0xfd,0xfb,0xfa,0xfa,0xfa,0xfa,0xf9,0x8d,0xfb, 0xf9,0xf8,0xf9,0xf8,0xf7,0xf7,0x8b,0xfa,0xf6,0xf6,0xf7,0xf6,0xf6,0xf5,0x89,0xf7, 0xf4,0xf4,0xf4,0xf4,0xf3,0xf4,0x86,0xf5,0xf3,0xf2,0xf2,0xf2,0xf2,0xf1,0x84,0xf3, 0xf0,0xf1,0xf0,0xee,0xef,0xee,0x82,0xf2,0xf0,0xef,0xee,0xee,0xee,0xef,0x7f,0xef, 0xee,0xee,0xed,0xec,0xed,0xed,0x7d,0xee,0xec,0xec,0xeb,0xec,0xea,0xea,0x7b,0xec, 0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0x79,0xea,0xe7,0xe7,0xe7,0xe6,0xe7,0xe6,0x77,0xe8, 0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0x75,0xe7,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0x72,0xe4, 0xe1,0xe3,0xe2,0xe2,0xe3,0xe3,0x75,0xe6,0xe4,0xe3,0xe4,0xe4,0xe5,0xe5,0x76,0xe9, 0xe5,0xe5,0xe5,0xe6,0xe5,0xe6,0x78,0xeb,0xe6,0xe6,0xe7,0xe7,0xe8,0xe8,0x7b,0xec, 0xe7,0xe9,0xe8,0xe9,0xea,0xe9,0x7d,0xee,0xea,0xea,0xea,0xea,0xeb,0xeb,0x7f,0xef, 0xec,0xeb,0xeb,0xec,0xec,0xed,0x81,0xf2,0xef,0xef,0xef,0xef,0xf0,0xef,0x84,0xf4, 0xf0,0xf1,0xf1,0xf1,0xf1,0xf2,0x85,0xf5,0xf3,0xf2,0xf3,0xf3,0xf3,0xf4,0x88,0xf7, 0xf3,0xf3,0xf5,0xf4,0xf5,0xf4,0x8a,0xf9,0xf6,0xf5,0xf6,0xf6,0xf6,0xf6,0x8d,0xfb, 0xf7,0xf8,0xf7,0xf8,0xf8,0xf9,0x8e,0xfc,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0x90,0xff, 0xfb,0xfd,0xfc,0xfc,0xfc,0xfc,0x92,0xff,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0x95,0xff, 0xfc,0xfc,0xfc,0xfb,0xfb,0xfc,0x96,0xff,0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,0x99,0xff, 0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0x9a,0xff,0xfc,0xfb,0xfb,0xfc,0xfc,0xfc,0x9d,0xff, 0xfc,0xfb,0xfb,0xfb,0xfb,0xfc,0x9f,0xff,0xfc,0xfd,0xfc,0xfc,0xfc,0xfc,0xa0,0xff, 0xfc,0xfc,0xfb,0xfb,0xfc,0xfc,0xa3,0xff,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xa5,0xff, 0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xa6,0xff,0xfc,0xfc,0xfb,0xfc,0xfc,0xfc,0xa9,0xff, 0xfc,0xfc,0xfc,0xfc,0xfb,0xfc,0xac,0xff,0xfc,0xfa,0xfb,0xfa,0xfb,0xfc,0xae,0xff, 0xfb,0xfc,0xfc,0xfb,0xfc,0xfb,0xab,0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xa9,0xff, 0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xa7,0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xa5,0xff, 0xfc,0xfb,0xfb,0xfc,0xfc,0xfc,0xa4,0xff,0xfc,0xfb,0xfc,0xfb,0xfc,0xfc,0xa1,0xff, 0xfc,0xfb,0xfa,0xfb,0xfb,0xfb,0x9f,0xff,0xfc,0xfd,0xfc,0xfc,0xfc,0xfc,0x9d,0xff, 0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x9c,0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x99,0xff, 0xfb,0xfb,0xfb,0xfc,0xfc,0xfb,0x97,0xff,0xfc,0xfc,0xfb,0xfb,0xfc,0xfc,0x94,0xff, 0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0x93,0xff,0xfc,0xfb,0xfb,0xfa,0xfa,0xfb,0x91,0xfe, 0xfa,0xfc,0xfa,0xfa,0xfa,0xfa,0x8e,0xfd,0xf9,0xfa,0xf9,0xf9,0xf8,0xf8,0x8c,0xfb, 0xf7,0xf6,0xf7,0xf7,0xf5,0xf6,0x8b,0xf9,0xf4,0xf4,0xf5,0xf3,0xf4,0xf4,0x88,0xf7, 0xf2,0xf3,0xf2,0xf1,0xf2,0xf1,0x86,0xf5,0xf1,0xf0,0xf1,0xf0,0xf0,0xef,0x84,0xf4, 0xee,0xee,0xed,0xed,0xed,0xed,0x82,0xf1,0xee,0xee,0xed,0xed,0xed,0xed,0x80,0xef, 0xec,0xec,0xec,0xec,0xeb,0xeb,0x7d,0xee,0xea,0xea,0xea,0xea,0xe8,0xe9,0x7b,0xec, 0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x79,0xeb,0xe5,0xe5,0xe6,0xe5,0xe4,0xe4,0x78,0xe8, 0xe4,0xe3,0xe4,0xe3,0xe3,0xe3,0x75,0xe6,0xe1,0xe0,0xe0,0xe0,0xe1,0xe1,0x73,0xae, 0xe5,0xe0,0xe0,0xe1,0xe1,0xb0,0x41,0xaf,0xe7,0xe1,0xe2,0xe3,0xe3,0xb2,0x41,0xb2, 0xe8,0xe4,0xe3,0xe4,0xe3,0xb3,0x41,0xb4,0xea,0xe4,0xe5,0xe5,0xe5,0xb6,0x41,0xb6, 0xec,0xe7,0xe7,0xe7,0xe8,0xb8,0x41,0xb7,0xef,0xe8,0xe8,0xe8,0xe9,0xba,0x41,0xba, 0xf0,0xe9,0xea,0xeb,0xea,0xbc,0x41,0xbc,0xf2,0xec,0xed,0xee,0xed,0xbd,0x43,0xbe, 0xf4,0xef,0xf0,0xef,0xf0,0xc0,0x46,0xc0,0xf6,0xf1,0xf0,0xf0,0xf1,0xc1,0x48,0xc2, 0xf8,0xf2,0xf2,0xf3,0xf2,0xc3,0x4a,0xc4,0xf9,0xf4,0xf5,0xf4,0xf4,0xc6,0x4d,0xc6, 0xfb,0xf6,0xf6,0xf5,0xf6,0xc8,0x4f,0xc8,0xfe,0xf6,0xf8,0xf8,0xf8,0xc9,0x51,0xcb, 0xff,0xfb,0xfa,0xfb,0xfa,0xcb,0x53,0xcb,0xff,0xfb,0xfb,0xfb,0xfb,0xcc,0x57,0xcd, 0xff,0xfb,0xfa,0xfa,0xfb,0xcf,0x58,0xcf,0xff,0xfa,0xfa,0xfa,0xfa,0xd1,0x5a,0xd2, 0xff,0xfa,0xfa,0xfb,0xfa,0xd3,0x5c,0xd4,0xff,0xfa,0xfa,0xf9,0xf9,0xd5,0x5f,0xd5, 0xff,0xfa,0xfa,0xfa,0xf9,0xd7,0x61,0xd7,0xff,0xfb,0xfb,0xfb,0xfb,0xd7,0x63,0xd7, 0xff,0xfb,0xfb,0xfb,0xfb,0xd7,0x67,0xd7,0xff,0xfb,0xfa,0xfb,0xfa,0xd7,0x69,0xd7, 0xff,0xfa,0xfa,0xfa,0xfb,0xd7,0x6b,0xd7,0xff,0xfa,0xfb,0xfa,0xfa,0xd7,0x6d,0xd6, 0xff,0xfa,0xfa,0xf9,0xfa,0xd7,0x6f,0xd6,0xff,0xf9,0xfa,0xfa,0xf9,0xd7,0x71,0xd7, 0xff,0xfa,0xfb,0xfb,0xfb,0xd7,0x6f,0xd7,0xff,0xfb,0xfb,0xfb,0xfb,0xd7,0x6d,0xd7, 0xff,0xfb,0xfa,0xfa,0xfa,0xd7,0x6b,0xd7,0xff,0xfa,0xfa,0xfa,0xfa,0xd7,0x69,0xd7, 0xff,0xfa,0xfa,0xfb,0xfa,0xd7,0x67,0xd7,0xff,0xfa,0xf9,0xfa,0xf9,0xd7,0x64,0xd7, 0xff,0xfa,0xfa,0xfa,0xfa,0xd7,0x61,0xd7,0xff,0xfb,0xfb,0xfb,0xfb,0xd5,0x5f,0xd5, 0xff,0xfb,0xfb,0xfb,0xfb,0xd4,0x5e,0xd4,0xff,0xfb,0xfa,0xfa,0xfa,0xd2,0x5b,0xd1, 0xff,0xfa,0xfa,0xfa,0xfa,0xd0,0x58,0xd0,0xff,0xfa,0xfa,0xfa,0xfa,0xcd,0x56,0xcd, 0xff,0xfb,0xf9,0xf9,0xf9,0xcc,0x54,0xcb,0xff,0xf9,0xf9,0xf9,0xf9,0xca,0x52,0xc9, 0xfe,0xf9,0xf9,0xf9,0xf9,0xc9,0x4f,0xc8,0xfc,0xf7,0xf7,0xf7,0xf7,0xc6,0x4c,0xc6, 0xfb,0xf5,0xf4,0xf5,0xf3,0xc4,0x4a,0xc3,0xf8,0xf3,0xf3,0xf2,0xf1,0xc2,0x48,0xc2, 0xf7,0xf1,0xf0,0xf1,0xf0,0xc0,0x46,0xc0,0xf5,0xee,0xed,0xee,0xed,0xbe,0x43,0xbe, 0xf2,0xec,0xed,0xec,0xeb,0xbc,0x41,0xbc,0xf1,0xec,0xec,0xeb,0xeb,0xba,0x41,0xb9, 0xef,0xea,0xea,0xea,0xe9,0xb8,0x41,0xb8,0xee,0xe8,0xe7,0xe7,0xe7,0xb6,0x41,0xb6, 0xeb,0xe5,0xe5,0xe5,0xe5,0xb4,0x41,0xb4,0xe9,0xe4,0xe4,0xe3,0xe3,0xb3,0x41,0xb2, 0xe8,0xe1,0xe1,0xe0,0xe0,0xb0,0x41,0xb0,0xe6,0xdf,0xdf,0xe0,0xdf,0xae,0x41 }; #ifndef __LOWRES__ const pp_uint8 PianoBitmapLarge::PIANO_LUT[] = { 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, 0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xff,0x00,0x00,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, 0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xff,0x00,0x00,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xff,0x00,0x00,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xff,0x00,0x00,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xff,0x00,0x00,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, 0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xff,0x00,0x00,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, 0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xff,0x00,0x00 }; const pp_uint8 PianoBitmapLarge::PIANO[] = { 0xa0,0xc0,0xc0,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0x06,0x0e,0x17,0x19,0x1a,0x1a,0x1a, 0x1a,0x19,0x12,0x0b,0x04,0x99,0x99,0xc3,0xc3,0x07,0x0f,0x18,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x13,0x0b,0x05,0x9b,0x9b,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xc7,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x08,0x11,0x1b,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x15,0x0c,0x06,0xa0,0xa0,0xca,0xca,0x08,0x11,0x1b,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x15,0x0c,0x06,0xa2,0xa2,0xcc,0xcc,0x08,0x11,0x1b,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x15,0x0c,0x05,0xa4,0xa4,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x06,0x0e,0x17,0x19,0x1a,0x1a,0x1a, 0x1a,0x19,0x12,0x0b,0x04,0xa9,0xa9,0xd3,0xd3,0x07,0x0f,0x18,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x13,0x0b,0x05,0xab,0xab,0xd5,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xd6,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0x08,0x11,0x1c,0x20,0x21,0x21,0x22, 0x22,0x21,0x15,0x0c,0x06,0xaf,0xb0,0xda,0xda,0x08,0x11,0x1f,0x23,0x24,0x24,0x24, 0x24,0x24,0x18,0x0c,0x06,0xb2,0xb2,0xdc,0xdc,0x08,0x13,0x21,0x25,0x26,0x26,0x26, 0x26,0x25,0x1a,0x0e,0x05,0xb4,0xb4,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x09,0x14,0x20,0x23,0x24,0x24,0x24, 0x25,0x24,0x1b,0x11,0x08,0xb8,0xb8,0xe3,0xe3,0x0d,0x17,0x24,0x27,0x27,0x28,0x29, 0x29,0x29,0x1e,0x13,0x0b,0xbb,0xbb,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x12,0x1f,0x2c,0x30,0x31,0x31,0x31, 0x31,0x31,0x25,0x1a,0x11,0xbf,0xbf,0xe7,0xe7,0x15,0x21,0x2f,0x33,0x33,0x33,0x33, 0x34,0x34,0x28,0x1c,0x13,0xc1,0xc1,0xe7,0xe7,0x17,0x23,0x30,0x34,0x35,0x36,0x36, 0x36,0x35,0x29,0x1d,0x14,0xc4,0xc4,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x18,0x24,0x30,0x33,0x34,0x34,0x34, 0x34,0x34,0x2b,0x21,0x18,0xc8,0xc8,0xe7,0xe7,0x1d,0x27,0x34,0x37,0x37,0x37,0x39, 0x39,0x39,0x2e,0x23,0x1b,0xc8,0xc8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x55,0xcf, 0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x22,0x2e,0x3b,0x3f,0x41,0x41,0x41, 0x41,0x40,0x34,0x29,0x21,0xc8,0xc8,0xe7,0xe7,0x24,0x30,0x3f,0x43,0x43,0x43,0x43, 0x43,0x43,0x38,0x2c,0x23,0xc8,0xc8,0xe7,0xe7,0x27,0x33,0x40,0x44,0x45,0x45,0x45, 0x46,0x45,0x39,0x2d,0x24,0xc8,0xc8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x26,0x31,0x3c,0x3f,0x40,0x40,0x40, 0x40,0x3f,0x35,0x2b,0x22,0xc8,0xc8,0xe7,0xe7,0x25,0x2f,0x3c,0x3f,0x3f,0x3f,0x40, 0x3f,0x3f,0x34,0x29,0x21,0xc8,0xc8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x22,0x2e,0x3b,0x3e,0x3f,0x3f,0x3f, 0x3f,0x3e,0x32,0x26,0x1d,0xc8,0xc8,0xe7,0xe7,0x20,0x2c,0x3a,0x3d,0x3d,0x3d,0x3d, 0x3d,0x3d,0x31,0x24,0x1b,0xc8,0xc8,0xe7,0xe7,0x1e,0x29,0x36,0x3a,0x3b,0x3b,0x3b, 0x3b,0x39,0x2d,0x21,0x18,0xc7,0xc7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x16,0x21,0x2d,0x30,0x30,0x30,0x30, 0x30,0x2f,0x26,0x1c,0x12,0xc2,0xc2,0xe7,0xe7,0x16,0x20,0x2c,0x2f,0x2f,0x2f,0x30, 0x30,0x30,0x24,0x19,0x11,0xc0,0xc0,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x12,0x1e,0x2b,0x2f,0x30,0x2f,0x2f, 0x2f,0x2e,0x22,0x17,0x0e,0xbc,0xbb,0xe5,0xe5,0x10,0x1c,0x2a,0x2e,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x15,0x0b,0xb9,0xb9,0xe3,0xe3,0x0e,0x1a,0x26,0x2a,0x2b,0x2b,0x2b, 0x2b,0x2a,0x1d,0x11,0x08,0xb7,0xb7,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0x06,0x11,0x1d,0x20,0x21,0x21,0x21, 0x20,0x1f,0x16,0x0c,0x04,0xb3,0xb3,0xdc,0xdc,0x07,0x10,0x1d,0x20,0x20,0x1f,0x20, 0x20,0x20,0x15,0x0b,0x05,0xb0,0xb0,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0x39,0xb9, 0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x08,0x11,0x1b,0x1f,0x20,0x20,0x20, 0x20,0x1e,0x15,0x0c,0x06,0xac,0xac,0xd6,0xd5,0x08,0x11,0x1b,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x15,0x0c,0x06,0xaa,0xa9,0xd3,0xd3,0x08,0x11,0x1b,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x15,0x0c,0x05,0xa7,0xa7,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x06,0x0e,0x17,0x19,0x1a,0x1a,0x1a, 0x1a,0x19,0x12,0x0b,0x04,0xa3,0xa3,0xcd,0xcc,0x07,0x0f,0x18,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x13,0x0b,0x05,0xa1,0xa1,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xc9,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x08,0x11,0x1b,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x15,0x0c,0x06,0x9c,0x9c,0xc6,0xc6,0x08,0x11,0x1b,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x15,0x0c,0x06,0x9a,0x9a,0xc4,0xc4,0x08,0x11,0x1b,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x15,0x0c,0x05,0x98,0x98,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x30,0xa0, 0xc3,0xc0,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0x0a,0x9e,0xa5,0x93,0x81,0x6f,0x5d, 0x4e,0x40,0x30,0x1f,0x07,0x98,0x98,0xc3,0xc3,0x0b,0xa2,0xa7,0x96,0x84,0x72,0x60, 0x4f,0x41,0x30,0x1f,0x08,0x9a,0x9a,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xca,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc7,0xc8,0x0b,0xa6,0xab,0x9b,0x89,0x77,0x65, 0x52,0x41,0x30,0x1f,0x07,0x9f,0x9f,0xca,0xca,0x0a,0xa8,0xae,0x9c,0x8a,0x78,0x66, 0x53,0x41,0x30,0x1f,0x07,0xa1,0xa1,0xcc,0xcc,0x09,0xaa,0xaf,0x9d,0x8c,0x7a,0x68, 0x55,0x44,0x30,0x1f,0x07,0xa3,0xa3,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xd3,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x0a,0xae,0xb4,0xa2,0x91,0x7f,0x6d, 0x5a,0x48,0x33,0x1f,0x07,0xa8,0xa8,0xd3,0xd3,0x0b,0xb1,0xb6,0xa6,0x94,0x82,0x70, 0x5d,0x4b,0x35,0x1f,0x08,0xaa,0xaa,0xd5,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xd9,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd6,0xd8,0x0b,0xb6,0xbb,0xaa,0x98,0x86,0x75, 0x62,0x50,0x3a,0x23,0x07,0xae,0xaf,0xda,0xda,0x0a,0xb7,0xbd,0xab,0x9a,0x88,0x76, 0x63,0x51,0x3c,0x25,0x07,0xb1,0xb1,0xdc,0xdc,0x09,0xb9,0xbf,0xad,0x9c,0x8a,0x78, 0x65,0x53,0x3e,0x28,0x08,0xb3,0xb3,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xe3,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x0f,0xbe,0xc4,0xb2,0xa0,0x8e,0x7c, 0x6a,0x58,0x43,0x2c,0x0c,0xb7,0xb7,0xe3,0xe3,0x12,0xc1,0xc6,0xb5,0xa3,0x92,0x80, 0x6d,0x5b,0x45,0x2e,0x0f,0xba,0xba,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xe9,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe6,0xe7,0x16,0xc6,0xcb,0xba,0xa8,0x96,0x84, 0x71,0x60,0x4a,0x33,0x13,0xbe,0xbe,0xe7,0xe7,0x18,0xc7,0xcd,0xbb,0xa9,0x97,0x86, 0x73,0x61,0x4c,0x35,0x15,0xc0,0xc1,0xe7,0xe7,0x19,0xc9,0xce,0xbc,0xab,0x9a,0x88, 0x75,0x63,0x4d,0x37,0x17,0xc3,0xc3,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xe9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1e,0xcd,0xd1,0xc2,0xb0,0x9e,0x8c, 0x79,0x68,0x53,0x3c,0x1c,0xc7,0xc7,0xe7,0xe7,0x22,0xce,0xd1,0xc5,0xb3,0xa1,0x90, 0x7d,0x6b,0x55,0x3e,0x1f,0xc7,0xc7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x55,0xcf, 0xe9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe7,0x26,0xce,0xd1,0xc5,0xb7,0xa6,0x94, 0x81,0x6f,0x59,0x42,0x23,0xc7,0xc7,0xe7,0xe7,0x27,0xcd,0xd1,0xc4,0xb6,0xa7,0x95, 0x82,0x70,0x5c,0x45,0x25,0xc7,0xc7,0xe7,0xe7,0x29,0xcd,0xd1,0xc3,0xb6,0xa9,0x97, 0x85,0x73,0x5d,0x47,0x27,0xc7,0xc7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xe9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x2c,0xcd,0xd1,0xc4,0xb6,0xa9,0x98, 0x85,0x73,0x5d,0x46,0x26,0xc7,0xc7,0xe7,0xe7,0x2a,0xce,0xd1,0xc5,0xb7,0xa9,0x97, 0x83,0x71,0x5b,0x44,0x25,0xc7,0xc7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xe9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe7,0x26,0xce,0xd1,0xc5,0xb6,0xa4,0x92, 0x7f,0x6d,0x57,0x3f,0x1f,0xc7,0xc7,0xe7,0xe7,0x23,0xcd,0xd1,0xc4,0xb3,0xa1,0x8f, 0x7c,0x6a,0x55,0x3d,0x1d,0xc7,0xc7,0xe7,0xe7,0x20,0xcd,0xd1,0xc2,0xb1,0x9f,0x8d, 0x7a,0x67,0x51,0x3b,0x1b,0xc6,0xc6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xe9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1c,0xcb,0xd1,0xbf,0xac,0x9a,0x88, 0x75,0x63,0x4e,0x37,0x16,0xc1,0xc1,0xe7,0xe7,0x1b,0xca,0xce,0xbd,0xab,0x99,0x87, 0x74,0x62,0x4b,0x34,0x15,0xbf,0xbf,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xe9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe7,0x16,0xc5,0xca,0xb9,0xa7,0x94,0x82, 0x6f,0x5d,0x47,0x30,0x10,0xba,0xba,0xe5,0xe5,0x13,0xc2,0xc8,0xb6,0xa3,0x91,0x7f, 0x6c,0x5a,0x45,0x2e,0x0d,0xb8,0xb8,0xe3,0xe3,0x10,0xc0,0xc4,0xb2,0xa1,0x8f,0x7d, 0x6a,0x58,0x41,0x2b,0x0b,0xb6,0xb6,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xe3,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0x0c,0xbb,0xc1,0xaf,0x9d,0x8b,0x79, 0x65,0x53,0x3e,0x27,0x07,0xb2,0xb2,0xdc,0xdc,0x0b,0xba,0xbf,0xae,0x9c,0x89,0x77, 0x64,0x52,0x3c,0x25,0x08,0xaf,0xaf,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0x39,0xb9, 0xdc,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd7,0xd8,0x0b,0xb5,0xba,0xa9,0x97,0x85,0x73, 0x60,0x4d,0x37,0x20,0x07,0xab,0xab,0xd6,0xd5,0x0a,0xb2,0xb8,0xa6,0x94,0x82,0x6f, 0x5c,0x4a,0x35,0x1f,0x07,0xa9,0xa8,0xd3,0xd3,0x09,0xb0,0xb5,0xa3,0x91,0x7f,0x6d, 0x5a,0x48,0x32,0x1f,0x07,0xa6,0xa6,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xd3,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x0a,0xab,0xb1,0x9f,0x8d,0x7b,0x69, 0x55,0x43,0x30,0x1f,0x07,0xa2,0xa2,0xcc,0xcc,0x0b,0xaa,0xaf,0x9e,0x8c,0x7a,0x67, 0x54,0x42,0x30,0x1f,0x08,0xa0,0xa0,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xcc,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc7,0xc8,0x0b,0xa6,0xab,0x99,0x87,0x75,0x63, 0x50,0x41,0x30,0x1f,0x07,0x9b,0x9b,0xc6,0xc6,0x0a,0xa3,0xa8,0x96,0x84,0x72,0x60, 0x4e,0x40,0x30,0x1f,0x07,0x99,0x99,0xc4,0xc4,0x09,0xa0,0xa5,0x93,0x82,0x70,0x5e, 0x4e,0x40,0x30,0x1f,0x07,0x97,0x97,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x30,0xa0, 0xc9,0xc0,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0x0c,0xa1,0x2f,0x35,0x36,0x36,0x36, 0x36,0x35,0x27,0x18,0x0a,0x95,0x95,0xc3,0xc3,0x0c,0xa4,0x2e,0x34,0x35,0x35,0x35, 0x35,0x34,0x26,0x16,0x09,0x97,0x97,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xd0,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x0c,0xa7,0x2b,0x30,0x30,0x30,0x30, 0x30,0x30,0x24,0x15,0x09,0x9c,0x9c,0xca,0xca,0x0b,0xaa,0x2a,0x2e,0x2f,0x2f,0x2f, 0x2f,0x2f,0x22,0x14,0x08,0x9e,0x9e,0xcc,0xcc,0x0a,0xab,0x28,0x2d,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x13,0x08,0xa0,0xa0,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xd9,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x0c,0xb1,0x30,0x38,0x3a,0x3a,0x3a, 0x3a,0x39,0x27,0x18,0x0a,0xa5,0xa5,0xd3,0xd3,0x0c,0xb3,0x32,0x3a,0x3b,0x3b,0x3b, 0x3b,0x3a,0x27,0x16,0x09,0xa7,0xa7,0xd5,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xdf,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0x0c,0xb7,0x32,0x38,0x39,0x39,0x3a, 0x3a,0x39,0x29,0x15,0x09,0xab,0xac,0xda,0xda,0x0b,0xb9,0x32,0x38,0x3a,0x3a,0x3a, 0x3a,0x3a,0x29,0x16,0x08,0xae,0xae,0xdc,0xdc,0x0a,0xba,0x33,0x39,0x39,0x39,0x39, 0x39,0x39,0x2a,0x18,0x09,0xb0,0xb0,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x12,0xc1,0x40,0x48,0x49,0x49,0x49, 0x4a,0x49,0x37,0x22,0x10,0xb4,0xb4,0xe3,0xe3,0x14,0xc3,0x41,0x49,0x4a,0x4b,0x4b, 0x4b,0x4a,0x37,0x22,0x11,0xb7,0xb7,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xee,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x17,0xc7,0x42,0x48,0x49,0x49,0x49, 0x49,0x49,0x39,0x25,0x15,0xbb,0xbb,0xe7,0xe7,0x19,0xc9,0x42,0x48,0x49,0x49,0x4a, 0x4a,0x4a,0x39,0x26,0x16,0xbd,0xbe,0xe7,0xe7,0x1a,0xca,0x42,0x48,0x49,0x49,0x49, 0x49,0x49,0x39,0x27,0x18,0xc0,0xc0,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xee,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x21,0xcf,0x50,0x58,0x59,0x59,0x59, 0x59,0x59,0x47,0x32,0x20,0xc4,0xc4,0xe7,0xe7,0x24,0xcf,0x51,0x59,0x5a,0x5a,0x5b, 0x5b,0x5a,0x47,0x32,0x21,0xc5,0xc5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x55,0xcf, 0xee,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x27,0xce,0x51,0x57,0x59,0x59,0x59, 0x59,0x58,0x48,0x34,0x25,0xc5,0xc5,0xe7,0xe7,0x28,0xce,0x52,0x58,0x59,0x59,0x59, 0x59,0x59,0x49,0x36,0x26,0xc5,0xc5,0xe7,0xe7,0x2a,0xce,0x52,0x58,0x58,0x58,0x58, 0x59,0x59,0x49,0x37,0x28,0xc5,0xc5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xee,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x2f,0xcf,0x5c,0x64,0x65,0x65,0x65, 0x65,0x64,0x51,0x3c,0x2a,0xc5,0xc5,0xe7,0xe7,0x2c,0xcf,0x59,0x61,0x62,0x62,0x62, 0x61,0x60,0x4d,0x38,0x27,0xc5,0xc5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xee,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x27,0xce,0x51,0x56,0x57,0x57,0x57, 0x57,0x56,0x46,0x31,0x21,0xc5,0xc5,0xe7,0xe7,0x24,0xce,0x4d,0x52,0x53,0x53,0x53, 0x53,0x53,0x42,0x2e,0x1e,0xc5,0xc5,0xe7,0xe7,0x21,0xce,0x48,0x4e,0x4e,0x4e,0x4e, 0x4e,0x4d,0x3d,0x2b,0x1c,0xc3,0xc3,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xee,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1f,0xce,0x4d,0x55,0x55,0x55,0x55, 0x55,0x54,0x42,0x2d,0x1a,0xbe,0xbe,0xe7,0xe7,0x1d,0xcc,0x49,0x51,0x52,0x52,0x52, 0x52,0x51,0x3d,0x28,0x17,0xbc,0xbc,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xee,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x17,0xc6,0x41,0x47,0x48,0x47,0x47, 0x47,0x46,0x36,0x22,0x12,0xb7,0xb7,0xe5,0xe5,0x14,0xc4,0x3d,0x42,0x43,0x43,0x43, 0x43,0x43,0x32,0x1f,0x0e,0xb5,0xb5,0xe3,0xe3,0x11,0xc1,0x38,0x3e,0x3e,0x3e,0x3e, 0x3e,0x3e,0x2d,0x1b,0x0c,0xb3,0xb3,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xe9,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0x0f,0xbe,0x3d,0x45,0x46,0x46,0x46, 0x45,0x44,0x32,0x1d,0x0b,0xaf,0xaf,0xdc,0xdc,0x0d,0xbc,0x3a,0x42,0x43,0x42,0x42, 0x42,0x41,0x2e,0x19,0x09,0xac,0xac,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0x39,0xb9, 0xe2,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x0c,0xb6,0x31,0x37,0x38,0x38,0x38, 0x38,0x36,0x26,0x15,0x09,0xa8,0xa8,0xd6,0xd5,0x0b,0xb4,0x2d,0x33,0x34,0x34,0x33, 0x33,0x33,0x22,0x14,0x08,0xa6,0xa5,0xd3,0xd3,0x0a,0xb1,0x29,0x2f,0x2e,0x2e,0x2e, 0x2e,0x2e,0x21,0x13,0x08,0xa3,0xa3,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xd9,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x0c,0xae,0x2f,0x35,0x36,0x36,0x36, 0x36,0x35,0x27,0x18,0x0a,0x9f,0x9f,0xcc,0xcc,0x0c,0xac,0x2e,0x34,0x35,0x35,0x35, 0x35,0x34,0x26,0x16,0x09,0x9d,0x9d,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xd2,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x0c,0xa7,0x2b,0x30,0x30,0x30,0x30, 0x30,0x30,0x24,0x15,0x09,0x98,0x98,0xc6,0xc6,0x0b,0xa5,0x2a,0x2e,0x2f,0x2f,0x2f, 0x2f,0x2f,0x22,0x14,0x08,0x96,0x96,0xc4,0xc4,0x0a,0xa1,0x28,0x2d,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x13,0x08,0x94,0x94,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x30,0xa0, 0xcd,0xc0,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0x0d,0x8f,0x2f,0x34,0x35,0x35,0x35, 0x35,0x34,0x27,0x17,0x09,0x92,0x92,0xc3,0xc3,0x0c,0x92,0x2d,0x33,0x33,0x33,0x33, 0x33,0x33,0x26,0x16,0x09,0x94,0x94,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xd4,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x0b,0x95,0x2b,0x2f,0x30,0x30,0x30, 0x30,0x2f,0x24,0x15,0x08,0x99,0x99,0xca,0xca,0x0a,0x98,0x2a,0x2e,0x2f,0x2f,0x2e, 0x2e,0x2e,0x22,0x13,0x08,0x9b,0x9b,0xcc,0xcc,0x09,0x99,0x28,0x2d,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x12,0x08,0x9d,0x9d,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xdd,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x0d,0x9f,0x30,0x37,0x39,0x39,0x39, 0x39,0x38,0x27,0x17,0x09,0xa2,0xa2,0xd3,0xd3,0x0c,0xa1,0x31,0x38,0x39,0x39,0x39, 0x39,0x38,0x28,0x16,0x09,0xa4,0xa4,0xd5,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xe3,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0x0b,0xa5,0x32,0x37,0x38,0x38,0x39, 0x39,0x38,0x29,0x15,0x08,0xa8,0xa9,0xda,0xda,0x0a,0xa7,0x32,0x38,0x3a,0x3a,0x39, 0x39,0x39,0x29,0x15,0x08,0xab,0xab,0xdc,0xdc,0x09,0xa8,0x33,0x39,0x39,0x39,0x39, 0x39,0x39,0x2b,0x17,0x09,0xad,0xad,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xed,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x13,0xaf,0x40,0x47,0x48,0x48,0x48, 0x49,0x48,0x36,0x21,0x0f,0xb1,0xb1,0xe3,0xe3,0x14,0xb1,0x40,0x47,0x48,0x49,0x49, 0x49,0x48,0x37,0x22,0x11,0xb4,0xb4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xf1,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x16,0xb5,0x42,0x47,0x48,0x48,0x48, 0x48,0x48,0x39,0x25,0x14,0xb8,0xb8,0xe7,0xe7,0x18,0xb7,0x42,0x48,0x49,0x49,0x49, 0x49,0x49,0x39,0x25,0x16,0xba,0xbb,0xe7,0xe7,0x19,0xb8,0x42,0x48,0x49,0x49,0x49, 0x49,0x49,0x3a,0x26,0x19,0xbd,0xbd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xf1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x22,0xbf,0x50,0x57,0x58,0x58,0x58, 0x58,0x58,0x46,0x31,0x1f,0xc1,0xc1,0xe7,0xe7,0x24,0xc1,0x50,0x57,0x58,0x58,0x59, 0x59,0x58,0x47,0x32,0x21,0xc2,0xc2,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x55,0xcf, 0xf1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x26,0xc1,0x51,0x56,0x58,0x58,0x58, 0x58,0x57,0x48,0x34,0x24,0xc2,0xc2,0xe7,0xe7,0x27,0xc1,0x52,0x58,0x59,0x59,0x58, 0x58,0x58,0x49,0x35,0x26,0xc2,0xc2,0xe7,0xe7,0x29,0xc0,0x52,0x58,0x58,0x58,0x58, 0x59,0x59,0x4a,0x36,0x28,0xc2,0xc2,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xf1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x30,0xc2,0x5c,0x63,0x64,0x64,0x64, 0x64,0x62,0x50,0x3b,0x29,0xc2,0xc2,0xe7,0xe7,0x2c,0xc2,0x58,0x5f,0x60,0x60,0x60, 0x5f,0x5e,0x4d,0x38,0x27,0xc2,0xc2,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xf1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x26,0xc1,0x51,0x55,0x56,0x56,0x56, 0x56,0x55,0x46,0x31,0x20,0xc2,0xc2,0xe7,0xe7,0x23,0xc1,0x4d,0x52,0x53,0x53,0x52, 0x52,0x52,0x42,0x2d,0x1e,0xc2,0xc2,0xe7,0xe7,0x20,0xbe,0x48,0x4e,0x4e,0x4e,0x4e, 0x4e,0x4d,0x3e,0x2a,0x1c,0xc0,0xc0,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xf1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x20,0xbc,0x4d,0x54,0x54,0x54,0x54, 0x54,0x53,0x41,0x2c,0x19,0xbb,0xbb,0xe7,0xe7,0x1d,0xba,0x48,0x4f,0x50,0x50,0x50, 0x50,0x4f,0x3d,0x28,0x17,0xb9,0xb9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xf1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x16,0xb4,0x41,0x46,0x47,0x46,0x46, 0x46,0x45,0x36,0x22,0x11,0xb4,0xb4,0xe5,0xe5,0x13,0xb2,0x3d,0x42,0x43,0x43,0x42, 0x42,0x42,0x32,0x1d,0x0e,0xb2,0xb2,0xe3,0xe3,0x10,0xaf,0x38,0x3e,0x3e,0x3e,0x3e, 0x3e,0x3e,0x2e,0x1a,0x0c,0xb0,0xb0,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xed,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x10,0xac,0x3d,0x44,0x45,0x45,0x45, 0x44,0x43,0x31,0x1c,0x0a,0xac,0xac,0xdc,0xdc,0x0d,0xaa,0x39,0x40,0x41,0x40,0x40, 0x40,0x3f,0x2e,0x19,0x09,0xa9,0xa9,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0x39,0xb9, 0xe6,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x0b,0xa4,0x31,0x36,0x37,0x37,0x37, 0x37,0x35,0x26,0x15,0x08,0xa5,0xa5,0xd6,0xd5,0x0a,0xa2,0x2d,0x33,0x34,0x34,0x32, 0x32,0x32,0x22,0x13,0x08,0xa3,0xa2,0xd3,0xd3,0x09,0x9f,0x29,0x2f,0x2e,0x2e,0x2e, 0x2e,0x2e,0x21,0x12,0x08,0xa0,0xa0,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xdd,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x0d,0x9c,0x2f,0x34,0x35,0x35,0x35, 0x35,0x34,0x27,0x17,0x09,0x9c,0x9c,0xcc,0xcc,0x0c,0x9a,0x2d,0x33,0x33,0x33,0x33, 0x33,0x33,0x26,0x16,0x09,0x9a,0x9a,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xd6,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x0b,0x95,0x2b,0x2f,0x30,0x30,0x30, 0x30,0x2f,0x24,0x15,0x08,0x95,0x95,0xc6,0xc6,0x0a,0x92,0x2a,0x2e,0x2f,0x2f,0x2e, 0x2e,0x2e,0x22,0x13,0x08,0x93,0x93,0xc4,0xc4,0x09,0x8f,0x28,0x2d,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x12,0x08,0x91,0x91,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x30,0xa0, 0xd2,0xc0,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0x0c,0x7c,0x2d,0x32,0x33,0x33,0x33, 0x33,0x31,0x25,0x15,0x08,0x90,0x90,0xc3,0xc3,0x0b,0x7e,0x2b,0x30,0x30,0x30,0x30, 0x30,0x30,0x24,0x15,0x08,0x91,0x92,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xd9,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x0a,0x82,0x28,0x2d,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x13,0x07,0x97,0x97,0xca,0xca,0x09,0x85,0x27,0x2b,0x2b,0x2b,0x2b, 0x2b,0x2a,0x1f,0x12,0x06,0x99,0x99,0xcc,0xcc,0x09,0x86,0x25,0x2a,0x2a,0x29,0x2a, 0x29,0x28,0x1e,0x11,0x06,0x9b,0x9b,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xe2,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x0c,0x8c,0x2d,0x34,0x36,0x36,0x36, 0x36,0x34,0x25,0x15,0x08,0xa0,0xa0,0xd3,0xd3,0x0b,0x8d,0x2e,0x34,0x35,0x35,0x35, 0x35,0x34,0x25,0x15,0x08,0xa1,0xa2,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xe8,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0x0a,0x92,0x2e,0x34,0x35,0x35,0x36, 0x36,0x35,0x26,0x13,0x07,0xa6,0xa7,0xda,0xda,0x09,0x94,0x2e,0x34,0x35,0x35,0x35, 0x35,0x34,0x25,0x13,0x06,0xa9,0xa9,0xdc,0xdc,0x09,0x95,0x2f,0x35,0x36,0x34,0x36, 0x34,0x33,0x26,0x15,0x07,0xab,0xab,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xf2,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x11,0x9c,0x3d,0x44,0x45,0x45,0x45, 0x46,0x44,0x34,0x1f,0x0d,0xaf,0xaf,0xe3,0xe3,0x12,0x9d,0x3d,0x43,0x44,0x45,0x45, 0x45,0x44,0x34,0x20,0x0f,0xb1,0xb2,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xf5,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x15,0xa2,0x3e,0x44,0x45,0x45,0x45, 0x45,0x45,0x36,0x23,0x13,0xb6,0xb6,0xe7,0xe7,0x17,0xa4,0x3e,0x44,0x44,0x44,0x45, 0x45,0x44,0x35,0x23,0x14,0xb8,0xb9,0xe7,0xe7,0x19,0xa5,0x3e,0x44,0x46,0x44,0x46, 0x44,0x43,0x35,0x24,0x17,0xbb,0xbb,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xf5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x20,0xac,0x4d,0x54,0x55,0x55,0x55, 0x55,0x54,0x44,0x2f,0x1d,0xbf,0xbf,0xe7,0xe7,0x22,0xad,0x4d,0x53,0x54,0x54,0x55, 0x55,0x54,0x44,0x30,0x1f,0xc0,0xc1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x55,0xcf, 0xf5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x25,0xb1,0x4d,0x53,0x55,0x55,0x55, 0x55,0x54,0x45,0x32,0x23,0xc1,0xc1,0xe7,0xe7,0x26,0xb2,0x4e,0x54,0x54,0x54,0x54, 0x54,0x53,0x45,0x33,0x24,0xc1,0xc1,0xe7,0xe7,0x29,0xb2,0x4e,0x54,0x55,0x53,0x55, 0x54,0x53,0x45,0x34,0x26,0xc1,0xc1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xf5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x2e,0xb3,0x59,0x60,0x61,0x61,0x61, 0x61,0x5e,0x4e,0x39,0x27,0xc1,0xc1,0xe7,0xe7,0x2a,0xb2,0x55,0x5b,0x5c,0x5c,0x5c, 0x5b,0x5a,0x4a,0x36,0x25,0xc0,0xc1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xf5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x25,0xb1,0x4d,0x52,0x53,0x53,0x53, 0x53,0x52,0x43,0x2f,0x1f,0xc1,0xc1,0xe7,0xe7,0x22,0xaf,0x49,0x4e,0x4e,0x4e,0x4e, 0x4e,0x4d,0x3e,0x2b,0x1c,0xc0,0xc0,0xe7,0xe7,0x20,0xab,0x44,0x4a,0x4b,0x49,0x4b, 0x49,0x47,0x39,0x28,0x1a,0xbe,0xbe,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xf5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1e,0xa9,0x4a,0x51,0x51,0x51,0x51, 0x51,0x4f,0x3f,0x2a,0x17,0xb9,0xb9,0xe7,0xe7,0x1b,0xa6,0x45,0x4b,0x4c,0x4c,0x4c, 0x4c,0x4b,0x3a,0x26,0x15,0xb6,0xb7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xf5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x15,0xa1,0x3d,0x43,0x44,0x43,0x43, 0x43,0x42,0x33,0x20,0x10,0xb2,0xb2,0xe5,0xe5,0x12,0x9f,0x39,0x3e,0x3e,0x3e,0x3e, 0x3e,0x3d,0x2e,0x1b,0x0c,0xb0,0xb0,0xe3,0xe3,0x10,0x9b,0x34,0x3a,0x3b,0x39,0x3b, 0x39,0x38,0x29,0x18,0x0a,0xae,0xae,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xf2,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x0e,0x99,0x3a,0x41,0x42,0x42,0x41, 0x41,0x3f,0x2f,0x1a,0x08,0xaa,0xaa,0xdc,0xdc,0x0b,0x96,0x36,0x3c,0x3d,0x3c,0x3c, 0x3c,0x3b,0x2b,0x17,0x08,0xa6,0xa7,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0x39,0xb9, 0xeb,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x0a,0x91,0x2d,0x33,0x34,0x34,0x34, 0x34,0x32,0x23,0x13,0x07,0xa3,0xa3,0xd6,0xd5,0x09,0x8f,0x29,0x2f,0x2f,0x2f,0x2e, 0x2e,0x2d,0x1f,0x12,0x06,0xa1,0xa0,0xd3,0xd3,0x09,0x8c,0x25,0x2b,0x2b,0x29,0x2b, 0x29,0x28,0x1e,0x11,0x06,0x9e,0x9e,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xe2,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x0c,0x89,0x2d,0x32,0x33,0x33,0x33, 0x33,0x31,0x25,0x15,0x08,0x9a,0x9a,0xcc,0xcc,0x0b,0x86,0x2b,0x30,0x30,0x30,0x30, 0x30,0x30,0x24,0x15,0x08,0x97,0x98,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xdb,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x0a,0x82,0x28,0x2d,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x13,0x07,0x93,0x93,0xc6,0xc6,0x09,0x7f,0x27,0x2b,0x2b,0x2b,0x2b, 0x2b,0x2a,0x1f,0x12,0x06,0x91,0x91,0xc4,0xc4,0x09,0x7c,0x25,0x2a,0x2a,0x29,0x2a, 0x29,0x28,0x1e,0x11,0x06,0x8f,0x8f,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x30,0xa0, 0xd9,0xc0,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0x0b,0x69,0x2a,0x2f,0x2f,0x2f,0x2f, 0x2f,0x2e,0x22,0x13,0x08,0x8d,0x8d,0xc3,0xc3,0x0a,0x6c,0x28,0x2d,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x13,0x07,0x8f,0x8f,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xe0,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x09,0x6f,0x25,0x2a,0x2a,0x2a,0x29, 0x29,0x28,0x1e,0x11,0x06,0x94,0x94,0xca,0xca,0x09,0x71,0x23,0x27,0x27,0x27,0x27, 0x27,0x27,0x1d,0x0f,0x06,0x96,0x96,0xcc,0xcc,0x08,0x73,0x22,0x25,0x27,0x26,0x26, 0x26,0x25,0x1b,0x0f,0x06,0x98,0x98,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xe9,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x0b,0x79,0x2a,0x30,0x31,0x31,0x31, 0x31,0x30,0x22,0x13,0x08,0x9d,0x9d,0xd3,0xd3,0x0a,0x7b,0x2a,0x30,0x31,0x31,0x31, 0x31,0x30,0x22,0x13,0x07,0x9f,0x9f,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xf0,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0x09,0x7f,0x2a,0x30,0x31,0x31,0x30, 0x30,0x2f,0x21,0x11,0x06,0xa3,0xa4,0xda,0xda,0x09,0x80,0x29,0x2e,0x30,0x30,0x30, 0x30,0x2f,0x22,0x10,0x06,0xa6,0xa6,0xdc,0xdc,0x08,0x82,0x2b,0x2f,0x31,0x30,0x30, 0x30,0x2f,0x23,0x12,0x06,0xa8,0xa8,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xf9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x10,0x89,0x39,0x40,0x40,0x40,0x40, 0x41,0x40,0x30,0x1c,0x0d,0xac,0xac,0xe3,0xe3,0x11,0x8b,0x39,0x3f,0x40,0x41,0x41, 0x41,0x40,0x31,0x1e,0x0e,0xaf,0xaf,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xfa,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x14,0x8f,0x3a,0x40,0x41,0x41,0x3f, 0x3f,0x3f,0x31,0x20,0x12,0xb3,0xb3,0xe7,0xe7,0x17,0x90,0x39,0x3e,0x3f,0x3f,0x40, 0x40,0x3f,0x32,0x20,0x14,0xb5,0xb6,0xe7,0xe7,0x17,0x92,0x3a,0x3e,0x41,0x40,0x40, 0x40,0x3f,0x32,0x21,0x16,0xb8,0xb8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xfa,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1f,0x99,0x49,0x50,0x50,0x50,0x50, 0x50,0x50,0x40,0x2c,0x1d,0xbc,0xbc,0xe7,0xe7,0x21,0x9b,0x49,0x4f,0x50,0x50,0x51, 0x51,0x50,0x41,0x2e,0x1e,0xbe,0xbf,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x55,0xcf, 0xfa,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x24,0x9e,0x49,0x4f,0x51,0x51,0x4f, 0x4f,0x4e,0x40,0x2f,0x22,0xbf,0xbf,0xe7,0xe7,0x26,0x9f,0x49,0x4e,0x4f,0x4f,0x4f, 0x4f,0x4e,0x42,0x30,0x24,0xbf,0xbf,0xe7,0xe7,0x27,0xa2,0x4a,0x4e,0x50,0x4f,0x4f, 0x50,0x4f,0x42,0x31,0x25,0xbf,0xbf,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xfa,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x2d,0xa5,0x55,0x5c,0x5c,0x5c,0x5c, 0x5c,0x5a,0x4a,0x36,0x27,0xbf,0xbf,0xe7,0xe7,0x29,0xa3,0x51,0x57,0x58,0x58,0x57, 0x57,0x56,0x47,0x34,0x24,0xbf,0xbf,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xfa,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x24,0x9e,0x49,0x4e,0x4f,0x4f,0x4d, 0x4d,0x4c,0x3e,0x2c,0x1e,0xbf,0xbf,0xe7,0xe7,0x22,0x9b,0x44,0x48,0x49,0x49,0x49, 0x49,0x48,0x3b,0x28,0x1c,0xbd,0xbd,0xe7,0xe7,0x1e,0x98,0x40,0x44,0x46,0x45,0x45, 0x45,0x43,0x36,0x25,0x19,0xbb,0xbb,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xfa,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1d,0x96,0x46,0x4d,0x4c,0x4c,0x4c, 0x4c,0x4b,0x3b,0x27,0x17,0xb6,0xb6,0xe7,0xe7,0x1a,0x94,0x41,0x47,0x48,0x48,0x48, 0x48,0x47,0x37,0x24,0x14,0xb4,0xb4,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xfa,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x14,0x8e,0x39,0x3f,0x40,0x3f,0x3d, 0x3d,0x3c,0x2e,0x1d,0x0f,0xaf,0xaf,0xe5,0xe5,0x12,0x8b,0x34,0x38,0x39,0x39,0x39, 0x39,0x38,0x2b,0x18,0x0c,0xad,0xad,0xe3,0xe3,0x0e,0x88,0x30,0x34,0x36,0x35,0x35, 0x35,0x33,0x26,0x15,0x09,0xab,0xab,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xf9,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x0d,0x86,0x36,0x3d,0x3d,0x3d,0x3c, 0x3c,0x3b,0x2b,0x17,0x08,0xa7,0xa6,0xdc,0xdc,0x0a,0x84,0x32,0x38,0x39,0x38,0x38, 0x38,0x37,0x28,0x15,0x07,0xa4,0xa4,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0x39,0xb9, 0xf2,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x09,0x7e,0x29,0x2f,0x30,0x30,0x2e, 0x2e,0x2c,0x1e,0x11,0x06,0xa0,0xa0,0xd6,0xd5,0x09,0x7b,0x24,0x29,0x2a,0x2a,0x29, 0x29,0x28,0x1d,0x0f,0x06,0x9e,0x9d,0xd3,0xd3,0x08,0x79,0x22,0x25,0x27,0x26,0x26, 0x26,0x25,0x1b,0x0f,0x06,0x9b,0x9b,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xe9,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x0b,0x76,0x2a,0x2f,0x2f,0x2f,0x2f, 0x2f,0x2e,0x22,0x13,0x08,0x97,0x97,0xcc,0xcc,0x0a,0x74,0x28,0x2d,0x2d,0x2d,0x2d, 0x2d,0x2d,0x21,0x13,0x07,0x95,0x95,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xe2,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x09,0x6f,0x25,0x2a,0x2a,0x2a,0x29, 0x29,0x28,0x1e,0x11,0x06,0x90,0x90,0xc6,0xc6,0x09,0x6b,0x23,0x27,0x27,0x27,0x27, 0x27,0x27,0x1d,0x0f,0x06,0x8e,0x8e,0xc4,0xc3,0x08,0x69,0x22,0x25,0x27,0x26,0x26, 0x26,0x25,0x1b,0x0f,0x06,0x8c,0x8c,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x30,0xa0, 0xdd,0xc0,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0x09,0x58,0x27,0x2a,0x2c,0x2b,0x2b, 0x2b,0x2a,0x20,0x13,0x08,0x8b,0x8b,0xc3,0xc3,0x09,0x59,0x25,0x2a,0x2a,0x2a,0x2a, 0x29,0x2a,0x1f,0x13,0x08,0x8d,0x8d,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xe4,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x08,0x5c,0x22,0x25,0x26,0x26,0x26, 0x26,0x27,0x1e,0x12,0x08,0x92,0x92,0xca,0xca,0x08,0x5f,0x1f,0x24,0x24,0x24,0x24, 0x24,0x26,0x1d,0x11,0x06,0x94,0x94,0xcc,0xcc,0x06,0x60,0x1e,0x21,0x22,0x22,0x22, 0x23,0x25,0x1d,0x11,0x06,0x96,0x96,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xed,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x09,0x66,0x27,0x2a,0x2d,0x2c,0x2c, 0x2c,0x2b,0x20,0x13,0x08,0x9b,0x9b,0xd3,0xd3,0x09,0x68,0x26,0x2c,0x2d,0x2d,0x2d, 0x2b,0x2c,0x1f,0x13,0x08,0x9d,0x9d,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xf4,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0xd8,0x08,0x6c,0x26,0x2a,0x2b,0x2b,0x2c, 0x2c,0x2d,0x21,0x12,0x08,0xa1,0xa2,0xda,0xda,0x08,0x6e,0x24,0x2a,0x2c,0x2c,0x2c, 0x2c,0x2e,0x22,0x12,0x06,0xa4,0xa4,0xdc,0xdc,0x06,0x6f,0x25,0x2a,0x2b,0x2b,0x2b, 0x2c,0x2f,0x25,0x15,0x07,0xa6,0xa6,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xfd,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x0e,0x76,0x35,0x3a,0x3c,0x3b,0x3b, 0x3c,0x3b,0x2d,0x1c,0x0d,0xaa,0xaa,0xe3,0xe3,0x10,0x78,0x35,0x3b,0x3c,0x3d,0x3d, 0x3b,0x3c,0x2e,0x1e,0x0f,0xad,0xad,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xfd,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x12,0x7c,0x36,0x3a,0x3b,0x3b,0x3b, 0x3b,0x3d,0x31,0x21,0x14,0xb1,0xb1,0xe7,0xe7,0x15,0x7e,0x34,0x3a,0x3b,0x3b,0x3c, 0x3c,0x3e,0x32,0x22,0x14,0xb3,0xb4,0xe7,0xe7,0x15,0x7f,0x34,0x39,0x3b,0x3b,0x3b, 0x3c,0x3f,0x34,0x24,0x17,0xb6,0xb6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xfd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1e,0x86,0x45,0x4a,0x4c,0x4b,0x4b, 0x4b,0x4b,0x3d,0x2c,0x1d,0xba,0xba,0xe7,0xe7,0x20,0x88,0x45,0x4b,0x4c,0x4c,0x4d, 0x4b,0x4c,0x3e,0x2e,0x1f,0xbc,0xbd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x56,0xcf, 0xfd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x22,0x8b,0x45,0x49,0x4b,0x4b,0x4b, 0x4b,0x4c,0x40,0x30,0x24,0xbd,0xbd,0xe7,0xe7,0x24,0x8d,0x44,0x4a,0x4b,0x4b,0x4b, 0x4b,0x4d,0x42,0x32,0x24,0xbd,0xbd,0xe7,0xe7,0x25,0x8f,0x44,0x49,0x4a,0x4a,0x4a, 0x4c,0x4f,0x44,0x34,0x26,0xbd,0xbd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xfd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x2b,0x92,0x51,0x56,0x58,0x57,0x57, 0x57,0x55,0x47,0x36,0x27,0xbd,0xbd,0xe7,0xe7,0x28,0x90,0x4d,0x53,0x54,0x54,0x53, 0x51,0x52,0x44,0x34,0x25,0xbd,0xbd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xfd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x22,0x8b,0x45,0x48,0x49,0x49,0x49, 0x49,0x4a,0x3e,0x2d,0x20,0xbd,0xbd,0xe7,0xe7,0x20,0x89,0x3e,0x44,0x45,0x45,0x45, 0x45,0x47,0x3b,0x2a,0x1c,0xbb,0xbb,0xe7,0xe7,0x1c,0x85,0x3a,0x3f,0x40,0x40,0x40, 0x41,0x43,0x38,0x28,0x1a,0xb9,0xb9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xfd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1b,0x83,0x42,0x47,0x48,0x47,0x47, 0x47,0x46,0x38,0x27,0x17,0xb4,0xb4,0xe7,0xe7,0x19,0x81,0x3d,0x43,0x44,0x44,0x44, 0x42,0x43,0x34,0x24,0x15,0xb2,0xb2,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xfd,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x12,0x7b,0x35,0x39,0x3a,0x39,0x39, 0x39,0x3a,0x2e,0x1e,0x11,0xad,0xad,0xe5,0xe5,0x10,0x79,0x2f,0x34,0x35,0x35,0x35, 0x35,0x37,0x2b,0x1a,0x0c,0xab,0xab,0xe3,0xe3,0x0c,0x75,0x2a,0x2f,0x30,0x30,0x30, 0x31,0x33,0x28,0x18,0x0a,0xa9,0xa9,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xfd,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x0b,0x73,0x32,0x37,0x39,0x38,0x37, 0x37,0x36,0x28,0x17,0x08,0xa5,0xa4,0xdc,0xdc,0x09,0x71,0x2e,0x34,0x34,0x34,0x34, 0x32,0x33,0x25,0x15,0x08,0xa2,0xa2,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0x39,0xb9, 0xf6,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x08,0x6b,0x25,0x29,0x2a,0x2a,0x2a, 0x2a,0x2a,0x1e,0x12,0x08,0x9e,0x9e,0xd6,0xd5,0x08,0x69,0x1f,0x25,0x26,0x26,0x25, 0x25,0x27,0x1d,0x11,0x06,0x9c,0x9b,0xd3,0xd3,0x06,0x66,0x1e,0x21,0x22,0x22,0x22, 0x23,0x25,0x1d,0x11,0x06,0x99,0x99,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xed,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x09,0x63,0x27,0x2a,0x2c,0x2b,0x2b, 0x2b,0x2a,0x20,0x13,0x08,0x95,0x95,0xcc,0xcc,0x09,0x61,0x25,0x2a,0x2a,0x2a,0x2a, 0x29,0x2a,0x1f,0x13,0x08,0x93,0x93,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xe6,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x08,0x5c,0x22,0x25,0x26,0x26,0x26, 0x26,0x27,0x1e,0x12,0x08,0x8e,0x8e,0xc6,0xc6,0x08,0x59,0x1f,0x24,0x24,0x24,0x24, 0x24,0x26,0x1d,0x11,0x06,0x8c,0x8c,0xc4,0xc3,0x06,0x56,0x1e,0x21,0x22,0x22,0x22, 0x23,0x25,0x1d,0x11,0x06,0x8a,0x8a,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x30,0xa0, 0xdf,0xc0,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0x08,0x4a,0x23,0x27,0x27,0x29,0x2b, 0x2c,0x2e,0x24,0x15,0x09,0x88,0x88,0xc3,0xc3,0x08,0x49,0x22,0x25,0x26,0x27,0x29, 0x2b,0x2d,0x23,0x15,0x09,0x8a,0x8a,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xe6,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x07,0x49,0x1e,0x21,0x23,0x26,0x27, 0x29,0x2a,0x21,0x13,0x08,0x8f,0x8f,0xca,0xca,0x06,0x4c,0x1d,0x21,0x22,0x24,0x27, 0x27,0x28,0x1f,0x13,0x08,0x91,0x91,0xcc,0xcc,0x06,0x4e,0x1b,0x1e,0x21,0x23,0x24, 0x27,0x28,0x1f,0x12,0x08,0x93,0x93,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xef,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x08,0x54,0x23,0x27,0x27,0x29,0x2c, 0x2d,0x30,0x24,0x15,0x09,0x98,0x98,0xd3,0xd3,0x08,0x55,0x22,0x26,0x27,0x29,0x2b, 0x2e,0x30,0x24,0x15,0x09,0x9a,0x9a,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xf6,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0xd8,0x07,0x59,0x20,0x25,0x27,0x2c,0x2d, 0x30,0x32,0x26,0x13,0x08,0x9e,0x9f,0xda,0xda,0x06,0x5b,0x21,0x26,0x29,0x2c,0x2f, 0x30,0x31,0x25,0x15,0x08,0xa1,0xa1,0xdc,0xdc,0x06,0x5d,0x21,0x25,0x2a,0x2c,0x2e, 0x31,0x33,0x28,0x17,0x09,0xa3,0xa3,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xff,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x0c,0x64,0x30,0x35,0x36,0x38,0x3b, 0x3d,0x40,0x32,0x1f,0x0f,0xa7,0xa7,0xe3,0xe3,0x0e,0x65,0x31,0x35,0x36,0x39,0x3b, 0x3e,0x40,0x33,0x20,0x10,0xaa,0xaa,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xff,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x11,0x69,0x30,0x35,0x37,0x3b,0x3c, 0x3f,0x42,0x36,0x23,0x14,0xae,0xae,0xe7,0xe7,0x13,0x6b,0x31,0x36,0x38,0x3b,0x3f, 0x40,0x41,0x35,0x25,0x16,0xb0,0xb1,0xe7,0xe7,0x14,0x6d,0x30,0x34,0x3a,0x3c,0x3e, 0x41,0x43,0x37,0x26,0x19,0xb3,0xb3,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1c,0x74,0x40,0x45,0x46,0x48,0x4b, 0x4d,0x50,0x42,0x2f,0x1f,0xb7,0xb7,0xe7,0xe7,0x1e,0x75,0x41,0x45,0x46,0x48,0x4b, 0x4e,0x50,0x43,0x30,0x20,0xb9,0xba,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x56,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x21,0x78,0x3f,0x44,0x47,0x4b,0x4c, 0x4f,0x51,0x45,0x32,0x24,0xbb,0xbb,0xe7,0xe7,0x22,0x7a,0x41,0x46,0x48,0x4b,0x4e, 0x4f,0x50,0x45,0x35,0x26,0xbb,0xbb,0xe7,0xe7,0x24,0x7d,0x40,0x44,0x49,0x4b,0x4d, 0x51,0x53,0x47,0x36,0x28,0xbb,0xbb,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x29,0x80,0x4c,0x51,0x52,0x54,0x57, 0x58,0x5a,0x4c,0x39,0x29,0xbb,0xbb,0xe7,0xe7,0x26,0x7d,0x49,0x4d,0x4e,0x50,0x51, 0x54,0x56,0x49,0x36,0x26,0xbb,0xbb,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x21,0x78,0x3f,0x43,0x45,0x49,0x4a, 0x4d,0x4f,0x43,0x2f,0x20,0xba,0xba,0xe7,0xe7,0x1e,0x76,0x3b,0x40,0x42,0x45,0x48, 0x49,0x4a,0x3d,0x2d,0x1e,0xb8,0xb8,0xe7,0xe7,0x1b,0x73,0x36,0x3a,0x3f,0x41,0x43, 0x46,0x47,0x3b,0x2a,0x1c,0xb6,0xb6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x19,0x71,0x3d,0x42,0x42,0x44,0x47, 0x48,0x4b,0x3d,0x2a,0x19,0xb1,0xb1,0xe7,0xe7,0x17,0x6e,0x39,0x3d,0x3e,0x40,0x42, 0x45,0x47,0x39,0x26,0x16,0xaf,0xaf,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x11,0x68,0x2f,0x34,0x36,0x39,0x3a, 0x3d,0x3f,0x33,0x20,0x11,0xaa,0xaa,0xe5,0xe5,0x0e,0x66,0x2c,0x30,0x32,0x35,0x38, 0x39,0x3a,0x2e,0x1d,0x0e,0xa8,0xa8,0xe3,0xe3,0x0b,0x63,0x26,0x2a,0x2f,0x31,0x33, 0x36,0x37,0x2b,0x1a,0x0c,0xa6,0xa6,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xff,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x09,0x61,0x2d,0x32,0x33,0x35,0x37, 0x38,0x3b,0x2d,0x1a,0x0a,0xa2,0xa1,0xdc,0xdc,0x08,0x5e,0x2a,0x2e,0x2e,0x30,0x32, 0x35,0x37,0x2a,0x17,0x09,0x9f,0x9f,0xda,0xda,0xda,0xda,0xd9,0xd9,0xd9,0x39,0xb9, 0xf8,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x07,0x58,0x1f,0x24,0x26,0x2a,0x2b, 0x2e,0x2f,0x23,0x13,0x08,0x9b,0x9b,0xd6,0xd5,0x06,0x56,0x1d,0x21,0x23,0x26,0x28, 0x29,0x2a,0x1f,0x13,0x08,0x99,0x98,0xd3,0xd3,0x06,0x54,0x1b,0x1e,0x21,0x23,0x24, 0x27,0x28,0x1f,0x12,0x08,0x96,0x96,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xef,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x08,0x51,0x23,0x27,0x27,0x29,0x2b, 0x2c,0x2e,0x24,0x15,0x09,0x92,0x92,0xcc,0xcc,0x08,0x4e,0x22,0x25,0x26,0x27,0x29, 0x2b,0x2d,0x23,0x15,0x09,0x90,0x90,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xe8,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x07,0x49,0x1e,0x21,0x23,0x26,0x27, 0x29,0x2a,0x21,0x13,0x08,0x8b,0x8b,0xc6,0xc6,0x06,0x49,0x1d,0x21,0x22,0x24,0x27, 0x27,0x28,0x1f,0x13,0x08,0x89,0x89,0xc4,0xc3,0x06,0x49,0x1b,0x1e,0x21,0x23,0x24, 0x27,0x28,0x1f,0x12,0x08,0x87,0x86,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc0,0x30,0xa0, 0xdf,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x08,0x3b,0x22,0x28,0x2a,0x2c,0x2f, 0x30,0x31,0x27,0x17,0x0a,0x86,0x86,0xc3,0xc3,0x07,0x3b,0x21,0x26,0x29,0x2b,0x2c, 0x2f,0x30,0x26,0x16,0x09,0x88,0x88,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xe6,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x06,0x3a,0x1e,0x24,0x27,0x29,0x2a, 0x2c,0x2e,0x23,0x15,0x09,0x8d,0x8d,0xca,0xca,0x06,0x3a,0x1d,0x22,0x26,0x27,0x29, 0x2b,0x2d,0x23,0x14,0x08,0x8f,0x8f,0xcc,0xcc,0x05,0x3b,0x1d,0x21,0x24,0x26,0x27, 0x2a,0x2a,0x21,0x14,0x08,0x91,0x91,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xef,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x08,0x40,0x22,0x28,0x2b,0x2d,0x31, 0x33,0x34,0x27,0x17,0x0a,0x96,0x96,0xd3,0xd3,0x07,0x42,0x21,0x27,0x2b,0x2e,0x2f, 0x33,0x34,0x28,0x16,0x09,0x98,0x98,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xf6,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0xd8,0x06,0x46,0x21,0x28,0x2c,0x30,0x32, 0x34,0x37,0x28,0x16,0x09,0x9d,0x9d,0xda,0xda,0x06,0x48,0x21,0x28,0x2e,0x2f,0x32, 0x35,0x37,0x2a,0x16,0x08,0x9f,0x9f,0xdc,0xdc,0x05,0x4a,0x24,0x2a,0x2e,0x30,0x32, 0x36,0x36,0x2b,0x19,0x09,0xa1,0xa1,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xff,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x0c,0x50,0x2f,0x37,0x3a,0x3c,0x40, 0x43,0x44,0x36,0x21,0x10,0xa5,0xa5,0xe3,0xe3,0x0d,0x52,0x2f,0x36,0x3a,0x3e,0x3f, 0x43,0x44,0x37,0x22,0x11,0xa8,0xa8,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xff,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x0f,0x56,0x31,0x38,0x3c,0x3f,0x41, 0x43,0x47,0x38,0x26,0x16,0xac,0xac,0xe7,0xe7,0x12,0x58,0x31,0x38,0x3d,0x3e,0x42, 0x45,0x47,0x3a,0x26,0x16,0xae,0xaf,0xe7,0xe7,0x13,0x5a,0x33,0x39,0x3e,0x40,0x42, 0x46,0x46,0x3a,0x28,0x19,0xb1,0xb1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1c,0x60,0x3f,0x47,0x4a,0x4c,0x50, 0x53,0x54,0x46,0x31,0x20,0xb5,0xb5,0xe7,0xe7,0x1d,0x62,0x3f,0x46,0x4a,0x4d,0x4f, 0x53,0x54,0x47,0x32,0x21,0xb7,0xb8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x56,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1f,0x65,0x40,0x48,0x4c,0x4f,0x51, 0x53,0x56,0x47,0x35,0x26,0xb9,0xb9,0xe7,0xe7,0x21,0x67,0x41,0x48,0x4d,0x4e,0x51, 0x54,0x56,0x4a,0x36,0x26,0xb9,0xb9,0xe7,0xe7,0x23,0x6a,0x43,0x49,0x4d,0x4f,0x51, 0x56,0x56,0x4a,0x38,0x28,0xb9,0xb9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x29,0x6c,0x4b,0x53,0x56,0x58,0x5c, 0x5e,0x5e,0x50,0x3b,0x2a,0xb9,0xb9,0xe7,0xe7,0x25,0x6a,0x47,0x4e,0x52,0x55,0x55, 0x59,0x5a,0x4d,0x38,0x27,0xb9,0xb9,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1f,0x65,0x3f,0x46,0x4a,0x4d,0x4f, 0x51,0x54,0x45,0x32,0x22,0xb8,0xb8,0xe7,0xe7,0x1d,0x63,0x3b,0x42,0x47,0x48,0x4b, 0x4e,0x50,0x42,0x2e,0x1e,0xb6,0xb6,0xe7,0xe7,0x19,0x60,0x39,0x3f,0x43,0x45,0x47, 0x4a,0x4a,0x3e,0x2c,0x1c,0xb4,0xb4,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x19,0x5d,0x3c,0x44,0x46,0x48,0x4c, 0x4e,0x4f,0x41,0x2c,0x1a,0xaf,0xaf,0xe7,0xe7,0x16,0x5b,0x37,0x3e,0x42,0x45,0x46, 0x4a,0x4b,0x3d,0x28,0x17,0xad,0xad,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x0f,0x55,0x30,0x37,0x3b,0x3d,0x3f, 0x41,0x44,0x35,0x23,0x13,0xa8,0xa8,0xe5,0xe5,0x0d,0x53,0x2c,0x32,0x37,0x38,0x3b, 0x3e,0x40,0x33,0x1e,0x0e,0xa6,0xa6,0xe3,0xe3,0x0a,0x50,0x29,0x2f,0x33,0x35,0x37, 0x3b,0x3a,0x2e,0x1c,0x0c,0xa4,0xa4,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xff,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x09,0x4d,0x2c,0x34,0x37,0x39,0x3c, 0x3e,0x3f,0x31,0x1c,0x0b,0xa0,0x9f,0xdc,0xdc,0x07,0x4b,0x28,0x2f,0x32,0x35,0x36, 0x3a,0x3b,0x2e,0x19,0x09,0x9d,0x9d,0xda,0xda,0xda,0xda,0xd9,0xd9,0xd9,0x39,0xb9, 0xf8,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x06,0x45,0x20,0x27,0x2b,0x2e,0x30, 0x32,0x34,0x25,0x15,0x09,0x99,0x99,0xd6,0xd5,0x06,0x43,0x1d,0x23,0x28,0x29,0x2b, 0x2e,0x30,0x23,0x14,0x08,0x97,0x96,0xd3,0xd3,0x05,0x41,0x1d,0x21,0x24,0x26,0x27, 0x2b,0x2b,0x21,0x14,0x08,0x94,0x94,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xef,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x08,0x3d,0x22,0x28,0x2a,0x2c,0x2f, 0x30,0x31,0x27,0x17,0x0a,0x90,0x90,0xcc,0xcc,0x07,0x3b,0x21,0x26,0x29,0x2b,0x2c, 0x2f,0x30,0x26,0x16,0x09,0x8e,0x8e,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xe8,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x06,0x3a,0x1e,0x24,0x27,0x29,0x2a, 0x2c,0x2e,0x23,0x15,0x09,0x89,0x89,0xc6,0xc6,0x06,0x3a,0x1d,0x22,0x26,0x27,0x29, 0x2b,0x2d,0x23,0x14,0x08,0x87,0x87,0xc4,0xc3,0x05,0x3a,0x1d,0x21,0x24,0x26,0x27, 0x2a,0x2a,0x21,0x14,0x08,0x85,0x84,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc0,0x30,0xa0, 0xdf,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x08,0x2d,0x25,0x2b,0x2f,0x30,0x32, 0x33,0x34,0x29,0x18,0x0b,0x83,0x83,0xc3,0xc3,0x08,0x2d,0x24,0x2a,0x2c,0x2f,0x30, 0x33,0x33,0x27,0x18,0x0b,0x85,0x85,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xe6,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x06,0x2d,0x22,0x28,0x2a,0x2c,0x2f, 0x30,0x31,0x26,0x17,0x0a,0x8a,0x8a,0xca,0xca,0x06,0x2d,0x21,0x26,0x29,0x2b,0x2c, 0x2f,0x30,0x26,0x16,0x09,0x8c,0x8c,0xcc,0xcc,0x06,0x2d,0x1f,0x25,0x27,0x2a,0x2b, 0x2d,0x2f,0x24,0x16,0x09,0x8e,0x8e,0xcd,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xef,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x08,0x2e,0x25,0x2b,0x31,0x32,0x35, 0x36,0x38,0x29,0x18,0x0b,0x93,0x93,0xd3,0xd3,0x08,0x30,0x24,0x2d,0x2f,0x33,0x35, 0x38,0x39,0x2a,0x18,0x0b,0x95,0x95,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xf6,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0xd8,0x06,0x34,0x26,0x2e,0x31,0x34,0x38, 0x3a,0x3b,0x2c,0x18,0x0a,0x9a,0x9a,0xda,0xda,0x06,0x36,0x26,0x2e,0x32,0x35,0x36, 0x3a,0x3b,0x2e,0x1a,0x09,0x9c,0x9c,0xdc,0xdc,0x06,0x38,0x27,0x2f,0x32,0x36,0x37, 0x3a,0x3c,0x2e,0x1c,0x0b,0x9e,0x9e,0xdd,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xff,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x0c,0x3e,0x33,0x3b,0x40,0x41,0x44, 0x46,0x48,0x39,0x23,0x11,0xa2,0xa2,0xe3,0xe3,0x0e,0x40,0x33,0x3c,0x3e,0x43,0x45, 0x48,0x49,0x39,0x25,0x13,0xa5,0xa5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xff,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x10,0x44,0x36,0x3e,0x41,0x43,0x47, 0x49,0x4b,0x3c,0x28,0x17,0xa9,0xa9,0xe7,0xe7,0x13,0x46,0x36,0x3d,0x41,0x44,0x46, 0x4a,0x4b,0x3e,0x29,0x18,0xab,0xac,0xe7,0xe7,0x15,0x48,0x36,0x3e,0x42,0x46,0x47, 0x4a,0x4c,0x3d,0x2b,0x1b,0xae,0xae,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1c,0x4e,0x43,0x4b,0x50,0x51,0x54, 0x56,0x58,0x49,0x33,0x21,0xb2,0xb2,0xe7,0xe7,0x1e,0x50,0x43,0x4c,0x4e,0x53,0x55, 0x58,0x59,0x49,0x35,0x23,0xb5,0xb5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x56,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x20,0x53,0x45,0x4e,0x51,0x53,0x57, 0x59,0x5a,0x4b,0x38,0x27,0xb7,0xb7,0xe7,0xe7,0x22,0x55,0x46,0x4d,0x51,0x54,0x55, 0x59,0x5a,0x4e,0x39,0x28,0xb7,0xb7,0xe7,0xe7,0x25,0x58,0x46,0x4e,0x51,0x55,0x56, 0x5a,0x5c,0x4d,0x3b,0x2a,0xb7,0xb7,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x29,0x5a,0x4f,0x57,0x5c,0x5d,0x60, 0x61,0x62,0x53,0x3d,0x2b,0xb7,0xb7,0xe7,0xe7,0x26,0x58,0x4b,0x54,0x56,0x5a,0x5b, 0x5e,0x5f,0x4f,0x3b,0x29,0xb7,0xb7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x20,0x53,0x44,0x4c,0x4f,0x51,0x55, 0x57,0x58,0x48,0x34,0x23,0xb5,0xb5,0xe7,0xe7,0x1e,0x51,0x40,0x47,0x4b,0x4e,0x4f, 0x53,0x54,0x46,0x31,0x20,0xb3,0xb3,0xe7,0xe7,0x1b,0x4e,0x3c,0x44,0x47,0x4b,0x4c, 0x4e,0x50,0x41,0x2f,0x1e,0xb1,0xb1,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x50,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x19,0x4b,0x40,0x48,0x4c,0x4d,0x50, 0x51,0x53,0x44,0x2e,0x1b,0xac,0xac,0xe7,0xe7,0x17,0x49,0x3b,0x44,0x46,0x4a,0x4c, 0x4f,0x50,0x3f,0x2b,0x19,0xaa,0xaa,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x10,0x43,0x35,0x3d,0x40,0x41,0x45, 0x47,0x48,0x39,0x25,0x14,0xa5,0xa5,0xe5,0xe5,0x0e,0x41,0x31,0x37,0x3b,0x3e,0x3f, 0x43,0x44,0x37,0x21,0x10,0xa3,0xa3,0xe3,0xe3,0x0c,0x3e,0x2c,0x34,0x37,0x3b,0x3c, 0x3f,0x40,0x31,0x1f,0x0e,0xa1,0xa1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xff,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x09,0x3b,0x30,0x38,0x3d,0x3e,0x40, 0x41,0x43,0x34,0x1e,0x0c,0x9d,0x9c,0xdc,0xdc,0x08,0x39,0x2c,0x35,0x36,0x3a,0x3c, 0x3f,0x40,0x30,0x1c,0x0b,0x9a,0x9a,0xda,0xda,0xda,0xda,0xd9,0xd9,0xd9,0x39,0xb9, 0xf8,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x06,0x33,0x25,0x2d,0x30,0x32,0x36, 0x38,0x38,0x29,0x17,0x0a,0x96,0x96,0xd6,0xd5,0x06,0x31,0x21,0x28,0x2c,0x2f,0x2f, 0x33,0x34,0x27,0x16,0x09,0x94,0x93,0xd3,0xd3,0x06,0x2f,0x1f,0x25,0x27,0x2b,0x2c, 0x2f,0x31,0x24,0x16,0x09,0x91,0x91,0xd0,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xef,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x08,0x2d,0x25,0x2b,0x2f,0x30,0x32, 0x33,0x34,0x29,0x18,0x0b,0x8d,0x8d,0xcc,0xcc,0x08,0x2d,0x24,0x2a,0x2c,0x2f,0x30, 0x33,0x33,0x27,0x18,0x0b,0x8b,0x8b,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xe8,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x06,0x2d,0x22,0x28,0x2a,0x2c,0x2f, 0x30,0x31,0x26,0x17,0x0a,0x86,0x86,0xc6,0xc6,0x06,0x2d,0x21,0x26,0x29,0x2b,0x2c, 0x2f,0x30,0x26,0x16,0x09,0x84,0x84,0xc4,0xc3,0x06,0x2d,0x1f,0x25,0x27,0x2a,0x2b, 0x2d,0x2f,0x24,0x16,0x09,0x82,0x81,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0xc0,0x30,0xa0, 0xdf,0xc0,0xc0,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0x09,0x21,0x28,0x2f,0x30,0x33,0x35, 0x37,0x38,0x2c,0x1b,0x0c,0x80,0x81,0xc3,0xc4,0x09,0x21,0x27,0x2e,0x30,0x32,0x33, 0x35,0x36,0x2a,0x1b,0x0b,0x82,0x83,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x30,0xa7, 0xe6,0xc7,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0x08,0x21,0x24,0x2a,0x2d,0x30,0x30, 0x33,0x34,0x29,0x19,0x0b,0x87,0x88,0xca,0xca,0x08,0x20,0x24,0x2a,0x2c,0x2f,0x30, 0x33,0x33,0x28,0x18,0x0b,0x89,0x8a,0xcc,0xcc,0x07,0x20,0x22,0x28,0x2b,0x2d,0x2f, 0x30,0x32,0x27,0x18,0x0a,0x8b,0x8c,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xb0, 0xef,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0x09,0x21,0x28,0x30,0x33,0x36,0x39, 0x3c,0x3d,0x2d,0x1b,0x0c,0x90,0x91,0xd3,0xd3,0x09,0x21,0x29,0x32,0x35,0x37,0x38, 0x3b,0x3d,0x2e,0x1b,0x0b,0x92,0x93,0xd5,0xd5,0xd6,0xd6,0xd6,0xd6,0xd6,0x36,0xb6, 0xf6,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0xd8,0x08,0x24,0x28,0x31,0x35,0x39,0x3a, 0x3d,0x3f,0x30,0x1b,0x0b,0x97,0x98,0xda,0xda,0x08,0x25,0x2a,0x34,0x36,0x3a,0x3c, 0x3f,0x40,0x31,0x1d,0x0b,0x99,0x9a,0xdc,0xdc,0x07,0x28,0x2b,0x33,0x37,0x3a,0x3c, 0x3e,0x40,0x33,0x1f,0x0c,0x9b,0x9c,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x3f,0xbf, 0xff,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0x0e,0x2e,0x37,0x40,0x42,0x45,0x48, 0x4c,0x4d,0x3d,0x26,0x12,0x9f,0xa0,0xe3,0xe3,0x10,0x30,0x38,0x41,0x44,0x47,0x48, 0x4b,0x4d,0x3d,0x28,0x13,0xa2,0xa3,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x46,0xc6, 0xff,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x12,0x34,0x38,0x41,0x45,0x48,0x49, 0x4c,0x4f,0x40,0x2b,0x18,0xa6,0xa7,0xe7,0xe7,0x15,0x35,0x3a,0x43,0x45,0x49,0x4c, 0x4f,0x50,0x41,0x2c,0x1a,0xa8,0xaa,0xe7,0xe7,0x16,0x37,0x3a,0x42,0x47,0x4a,0x4c, 0x4e,0x50,0x42,0x2e,0x1c,0xab,0xac,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1e,0x3e,0x47,0x50,0x52,0x55,0x58, 0x5c,0x5d,0x4d,0x36,0x22,0xaf,0xb0,0xe7,0xe7,0x20,0x40,0x48,0x51,0x54,0x57,0x58, 0x5b,0x5d,0x4d,0x38,0x23,0xb2,0xb3,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x56,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x22,0x43,0x47,0x51,0x55,0x58,0x59, 0x5c,0x5e,0x4f,0x3b,0x28,0xb5,0xb5,0xe7,0xe7,0x24,0x45,0x4a,0x53,0x55,0x59,0x5b, 0x5e,0x60,0x51,0x3c,0x2a,0xb5,0xb5,0xe7,0xe7,0x26,0x47,0x4a,0x52,0x56,0x59,0x5b, 0x5e,0x60,0x52,0x3e,0x2b,0xb5,0xb5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x5f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x2b,0x4a,0x53,0x5c,0x5e,0x61,0x64, 0x67,0x67,0x57,0x40,0x2c,0xb5,0xb5,0xe7,0xe7,0x28,0x48,0x50,0x59,0x5c,0x5e,0x5e, 0x61,0x63,0x53,0x3e,0x29,0xb5,0xb5,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x58,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x22,0x43,0x46,0x4f,0x53,0x56,0x57, 0x5a,0x5c,0x4c,0x37,0x24,0xb2,0xb3,0xe7,0xe7,0x20,0x40,0x44,0x4d,0x4f,0x53,0x55, 0x58,0x59,0x49,0x34,0x22,0xb0,0xb1,0xe7,0xe7,0x1c,0x3d,0x40,0x48,0x4c,0x4f,0x51, 0x52,0x54,0x46,0x32,0x1f,0xae,0xaf,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x4f,0xcf, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x1b,0x3b,0x44,0x4d,0x4e,0x51,0x54, 0x57,0x58,0x48,0x31,0x1c,0xa9,0xaa,0xe7,0xe7,0x19,0x39,0x40,0x49,0x4c,0x4e,0x4f, 0x52,0x54,0x43,0x2e,0x19,0xa7,0xa8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x49,0xc9, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x12,0x33,0x37,0x40,0x44,0x46,0x47, 0x4a,0x4c,0x3d,0x28,0x15,0xa2,0xa3,0xe5,0xe5,0x10,0x30,0x35,0x3d,0x3f,0x43,0x45, 0x48,0x49,0x3a,0x24,0x12,0xa0,0xa1,0xe3,0xe3,0x0d,0x2d,0x30,0x38,0x3c,0x3f,0x41, 0x43,0x44,0x36,0x22,0x0f,0x9e,0x9f,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x40,0xc0, 0xff,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x0b,0x2b,0x34,0x3d,0x3f,0x42,0x44, 0x47,0x48,0x38,0x21,0x0d,0x9a,0x9a,0xdc,0xdc,0x09,0x29,0x31,0x3a,0x3c,0x3e,0x3f, 0x42,0x44,0x34,0x1f,0x0b,0x97,0x98,0xda,0xda,0xda,0xda,0xd9,0xd9,0xd9,0x39,0xb9, 0xf8,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x08,0x23,0x27,0x30,0x34,0x37,0x38, 0x3a,0x3c,0x2d,0x19,0x0b,0x93,0x94,0xd6,0xd5,0x08,0x20,0x25,0x2e,0x30,0x34,0x35, 0x38,0x39,0x2a,0x18,0x0b,0x91,0x91,0xd3,0xd3,0x07,0x20,0x22,0x29,0x2c,0x2f,0x31, 0x33,0x35,0x27,0x18,0x0a,0x8e,0x8f,0xd1,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0x30,0xb0, 0xef,0xd0,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x09,0x21,0x28,0x2f,0x30,0x33,0x35, 0x37,0x38,0x2c,0x1b,0x0c,0x8a,0x8b,0xcc,0xcc,0x09,0x21,0x27,0x2e,0x30,0x32,0x33, 0x35,0x36,0x2a,0x1b,0x0b,0x88,0x89,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0x30,0xa9, 0xe8,0xc9,0xc9,0xc9,0xc9,0xc8,0xc8,0xc8,0xc8,0x08,0x21,0x24,0x2a,0x2d,0x30,0x30, 0x33,0x34,0x29,0x19,0x0b,0x83,0x84,0xc6,0xc6,0x08,0x20,0x24,0x2a,0x2c,0x2f,0x30, 0x33,0x33,0x28,0x18,0x0b,0x81,0x82,0xc4,0xc3,0x07,0x20,0x22,0x28,0x2b,0x2d,0x2f, 0x30,0x32,0x27,0x18,0x0a,0x7f,0x7f,0xc1,0xc1,0xc1,0xc1,0xc1,0xc1,0xc0,0x30,0xa0, 0xdf,0xc1,0xc1,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0x0a,0x19,0x2b,0x32,0x35,0x36,0x39, 0x3a,0x3c,0x2e,0x1c,0x0c,0x7f,0x7f,0xc4,0xc5,0x09,0x19,0x2b,0x31,0x33,0x35,0x37, 0x39,0x39,0x2d,0x1b,0x0c,0x81,0x81,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0x30,0xa7, 0xe6,0xc8,0xc8,0xc8,0xc8,0xc9,0xc9,0xc9,0xc9,0x09,0x18,0x28,0x2f,0x30,0x33,0x35, 0x36,0x38,0x2c,0x1b,0x0c,0x86,0x86,0xcb,0xcb,0x09,0x16,0x27,0x2d,0x30,0x32,0x33, 0x35,0x36,0x2a,0x1a,0x0b,0x88,0x88,0xcd,0xcd,0x08,0x15,0x27,0x2d,0x2f,0x30,0x33, 0x34,0x35,0x29,0x19,0x0b,0x8a,0x8a,0xcf,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0x30,0xb0, 0xef,0xd1,0xd1,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0x0a,0x19,0x2b,0x34,0x39,0x3a,0x3e, 0x40,0x42,0x30,0x1c,0x0c,0x8f,0x8f,0xd4,0xd4,0x09,0x19,0x2e,0x36,0x38,0x3b,0x3e, 0x40,0x41,0x31,0x1b,0x0c,0x91,0x91,0xd6,0xd6,0xd7,0xd7,0xd7,0xd7,0xd7,0x36,0xb6, 0xf6,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd9,0xd9,0x09,0x18,0x2e,0x37,0x39,0x3d,0x40, 0x41,0x44,0x34,0x1d,0x0c,0x96,0x96,0xdb,0xdb,0x09,0x18,0x2f,0x37,0x3b,0x3e,0x3f, 0x42,0x44,0x34,0x1f,0x0b,0x98,0x98,0xdd,0xdd,0x08,0x1a,0x31,0x39,0x3c,0x3e,0x41, 0x43,0x45,0x35,0x20,0x0d,0x9a,0x9a,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0x3f,0xbf, 0xff,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0x0f,0x23,0x3b,0x44,0x48,0x49,0x4e, 0x50,0x52,0x40,0x28,0x13,0x9e,0x9f,0xe4,0xe4,0x10,0x25,0x3d,0x45,0x47,0x4b,0x4e, 0x50,0x51,0x40,0x29,0x15,0xa1,0xa1,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0x46,0xc6, 0xff,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x13,0x28,0x3e,0x47,0x49,0x4c,0x4f, 0x50,0x54,0x44,0x2d,0x19,0xa5,0xa5,0xe8,0xe8,0x16,0x28,0x3f,0x46,0x4a,0x4d,0x4f, 0x52,0x54,0x44,0x2e,0x1a,0xa7,0xa8,0xe8,0xe8,0x17,0x29,0x40,0x48,0x4c,0x4e,0x51, 0x53,0x54,0x44,0x2f,0x1d,0xaa,0xaa,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x4f,0xcf, 0xff,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x1f,0x33,0x4b,0x54,0x58,0x59,0x5d, 0x60,0x62,0x50,0x38,0x23,0xae,0xae,0xe8,0xe8,0x20,0x35,0x4d,0x55,0x57,0x5b,0x5e, 0x60,0x61,0x50,0x39,0x25,0xb1,0xb1,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x56,0xcf, 0xff,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x23,0x37,0x4d,0x57,0x59,0x5c,0x5f, 0x60,0x63,0x53,0x3d,0x29,0xb4,0xb4,0xe8,0xe8,0x25,0x38,0x4f,0x56,0x5a,0x5d,0x5e, 0x61,0x64,0x54,0x3e,0x2a,0xb4,0xb4,0xe8,0xe8,0x27,0x39,0x50,0x58,0x5b,0x5d,0x60, 0x63,0x64,0x54,0x3f,0x2c,0xb4,0xb4,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x5f,0xcf, 0xff,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x2c,0x3f,0x57,0x60,0x64,0x65,0x69, 0x6b,0x6c,0x5a,0x42,0x2d,0xb4,0xb4,0xe8,0xe8,0x28,0x3d,0x55,0x5d,0x5f,0x62,0x64, 0x66,0x67,0x56,0x3f,0x2b,0xb4,0xb4,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x58,0xcf, 0xff,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x23,0x37,0x4c,0x55,0x57,0x5a,0x5d, 0x5e,0x61,0x50,0x39,0x25,0xb1,0xb1,0xe8,0xe8,0x21,0x33,0x49,0x50,0x54,0x57,0x58, 0x5b,0x5d,0x4c,0x36,0x22,0xaf,0xaf,0xe8,0xe8,0x1d,0x2f,0x46,0x4e,0x51,0x53,0x56, 0x57,0x58,0x48,0x33,0x20,0xad,0xad,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x4f,0xcf, 0xff,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x1c,0x30,0x48,0x51,0x54,0x55,0x59, 0x5b,0x5d,0x4b,0x33,0x1d,0xa8,0xa8,0xe8,0xe8,0x19,0x2e,0x45,0x4d,0x4f,0x52,0x55, 0x57,0x58,0x46,0x2f,0x1b,0xa6,0xa6,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x49,0xc9, 0xff,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x13,0x27,0x3d,0x46,0x48,0x4a,0x4d, 0x4e,0x51,0x41,0x2a,0x16,0xa1,0xa1,0xe6,0xe6,0x11,0x23,0x3a,0x40,0x44,0x47,0x48, 0x4b,0x4d,0x3d,0x26,0x12,0x9f,0x9f,0xe4,0xe4,0x0e,0x1f,0x36,0x3e,0x41,0x43,0x46, 0x48,0x48,0x38,0x23,0x10,0x9d,0x9d,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x40,0xc0, 0xff,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0x0c,0x20,0x38,0x41,0x45,0x46,0x49, 0x4b,0x4d,0x3b,0x23,0x0e,0x99,0x98,0xdd,0xdd,0x09,0x1e,0x36,0x3e,0x3f,0x42,0x45, 0x47,0x48,0x37,0x20,0x0c,0x96,0x96,0xdb,0xdb,0xdb,0xdb,0xda,0xda,0xda,0x39,0xb9, 0xf8,0xda,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0x09,0x18,0x2d,0x36,0x38,0x3b,0x3e, 0x3e,0x41,0x31,0x1b,0x0c,0x92,0x92,0xd6,0xd6,0x09,0x16,0x2a,0x31,0x35,0x38,0x38, 0x3b,0x3d,0x2d,0x1a,0x0b,0x90,0x8f,0xd4,0xd4,0x08,0x15,0x27,0x2f,0x31,0x33,0x36, 0x38,0x39,0x29,0x19,0x0b,0x8d,0x8d,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1,0x30,0xb0, 0xef,0xd1,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0x0a,0x19,0x2b,0x32,0x35,0x36,0x3a, 0x3b,0x3d,0x2e,0x1c,0x0c,0x89,0x89,0xcd,0xcd,0x09,0x19,0x2b,0x31,0x33,0x35,0x37, 0x39,0x39,0x2d,0x1b,0x0c,0x87,0x87,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0x30,0xa9, 0xe8,0xca,0xca,0xca,0xca,0xc9,0xc9,0xc9,0xc9,0x09,0x18,0x28,0x2f,0x30,0x33,0x35, 0x36,0x38,0x2c,0x1b,0x0c,0x82,0x82,0xc7,0xc7,0x09,0x16,0x27,0x2d,0x30,0x32,0x33, 0x35,0x36,0x2a,0x1a,0x0b,0x80,0x80,0xc5,0xc4,0x08,0x15,0x27,0x2d,0x2f,0x30,0x33, 0x34,0x35,0x29,0x19,0x0b,0x7e,0x7d,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc1,0x30,0xa0, 0xdf,0xc2,0xc2,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x0b,0x1b,0x2f,0x35,0x39,0x3a,0x3b, 0x3e,0x3f,0x30,0x1e,0x0d,0x7d,0x7d,0xc5,0xc6,0x0b,0x1b,0x2d,0x34,0x37,0x39,0x3a, 0x3c,0x3e,0x30,0x1e,0x0d,0x7f,0x80,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x30,0xa7, 0xe6,0xc9,0xc9,0xc9,0xc9,0xca,0xca,0xca,0xca,0x0a,0x19,0x2b,0x32,0x35,0x36,0x39, 0x3a,0x3c,0x2e,0x1c,0x0c,0x84,0x84,0xcc,0xcc,0x09,0x18,0x2b,0x31,0x33,0x35,0x37, 0x39,0x39,0x2d,0x1c,0x0c,0x86,0x86,0xce,0xce,0x09,0x18,0x29,0x30,0x33,0x34,0x36, 0x39,0x3a,0x2c,0x1b,0x0c,0x88,0x88,0xd0,0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0x30,0xb0, 0xef,0xd2,0xd2,0xd2,0xd2,0xd2,0xd3,0xd3,0xd3,0x0b,0x1b,0x30,0x38,0x3e,0x40,0x41, 0x45,0x46,0x33,0x1e,0x0d,0x8d,0x8d,0xd5,0xd5,0x0b,0x1b,0x30,0x3a,0x3e,0x40,0x42, 0x45,0x47,0x35,0x1e,0x0d,0x8f,0x8f,0xd7,0xd7,0xd8,0xd8,0xd8,0xd8,0xd8,0x36,0xb6, 0xf6,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xda,0xda,0x0a,0x1a,0x32,0x3b,0x3f,0x41,0x45, 0x47,0x49,0x37,0x1f,0x0c,0x94,0x94,0xdc,0xdc,0x09,0x1b,0x34,0x3d,0x3f,0x42,0x45, 0x48,0x48,0x37,0x22,0x0d,0x96,0x96,0xde,0xde,0x09,0x1e,0x34,0x3d,0x41,0x43,0x45, 0x49,0x4a,0x39,0x23,0x0f,0x98,0x98,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x3f,0xbf, 0xff,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0x10,0x26,0x40,0x48,0x4d,0x4f,0x51, 0x55,0x56,0x43,0x2b,0x14,0x9c,0x9d,0xe5,0xe5,0x12,0x27,0x3f,0x49,0x4e,0x50,0x52, 0x55,0x57,0x44,0x2c,0x16,0x9f,0x9f,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0x46,0xc6, 0xff,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x15,0x2a,0x42,0x4b,0x4f,0x50,0x54, 0x56,0x59,0x47,0x2f,0x1a,0xa3,0xa3,0xe9,0xe9,0x17,0x2b,0x44,0x4c,0x4e,0x51,0x55, 0x58,0x58,0x47,0x31,0x1c,0xa5,0xa6,0xe9,0xe9,0x19,0x2d,0x43,0x4c,0x51,0x53,0x55, 0x59,0x59,0x48,0x32,0x1f,0xa8,0xa8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x4f,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x20,0x36,0x50,0x58,0x5d,0x5f,0x60, 0x65,0x66,0x53,0x3b,0x24,0xac,0xac,0xe9,0xe9,0x22,0x37,0x4f,0x59,0x5d,0x60,0x62, 0x65,0x67,0x54,0x3c,0x26,0xaf,0xaf,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x56,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x25,0x39,0x51,0x5b,0x5f,0x60,0x64, 0x66,0x68,0x56,0x3f,0x2a,0xb2,0xb2,0xe9,0xe9,0x26,0x3b,0x54,0x5c,0x5e,0x61,0x64, 0x67,0x68,0x57,0x41,0x2c,0xb2,0xb2,0xe9,0xe9,0x29,0x3d,0x53,0x5c,0x60,0x62,0x65, 0x69,0x69,0x58,0x42,0x2e,0xb2,0xb2,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x5f,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x2d,0x42,0x5c,0x64,0x69,0x6b,0x6c, 0x70,0x70,0x5d,0x45,0x2e,0xb2,0xb2,0xe9,0xe9,0x2a,0x3f,0x57,0x61,0x65,0x67,0x68, 0x6b,0x6d,0x5a,0x42,0x2c,0xb2,0xb2,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x58,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x25,0x39,0x50,0x59,0x5d,0x5e,0x62, 0x64,0x66,0x53,0x3b,0x26,0xaf,0xaf,0xe9,0xe9,0x22,0x36,0x4e,0x56,0x58,0x5b,0x5e, 0x61,0x61,0x4f,0x39,0x24,0xad,0xad,0xe9,0xe9,0x1f,0x33,0x49,0x52,0x56,0x58,0x5a, 0x5d,0x5d,0x4c,0x36,0x22,0xab,0xab,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x4f,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x1d,0x33,0x4d,0x54,0x59,0x5b,0x5c, 0x60,0x61,0x4e,0x36,0x1e,0xa6,0xa6,0xe9,0xe9,0x1b,0x30,0x47,0x51,0x55,0x57,0x59, 0x5c,0x5e,0x4a,0x32,0x1c,0xa4,0xa4,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x49,0xc9, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x15,0x29,0x41,0x4a,0x4e,0x4e,0x52, 0x54,0x56,0x44,0x2c,0x17,0x9f,0x9f,0xe7,0xe7,0x12,0x26,0x3f,0x46,0x48,0x4b,0x4e, 0x51,0x51,0x40,0x29,0x14,0x9d,0x9d,0xe5,0xe5,0x10,0x23,0x39,0x42,0x46,0x48,0x4a, 0x4e,0x4d,0x3c,0x26,0x12,0x9b,0x9b,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0x40,0xc0, 0xff,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0x0d,0x23,0x3d,0x45,0x4a,0x4c,0x4c, 0x50,0x51,0x3e,0x26,0x0f,0x97,0x96,0xde,0xde,0x0b,0x20,0x38,0x42,0x45,0x47,0x49, 0x4c,0x4e,0x3b,0x23,0x0d,0x94,0x94,0xdc,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0x39,0xb9, 0xf8,0xdb,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0x0a,0x19,0x31,0x3a,0x3e,0x3f,0x43, 0x44,0x46,0x34,0x1c,0x0c,0x90,0x90,0xd7,0xd7,0x09,0x18,0x2f,0x37,0x39,0x3b,0x3e, 0x41,0x41,0x30,0x1c,0x0c,0x8e,0x8d,0xd5,0xd5,0x09,0x18,0x2a,0x33,0x36,0x38,0x3a, 0x3e,0x3e,0x2d,0x1b,0x0c,0x8b,0x8b,0xd3,0xd3,0xd3,0xd3,0xd2,0xd2,0xd2,0x30,0xb0, 0xef,0xd2,0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0x0b,0x1b,0x2f,0x35,0x3a,0x3c,0x3d, 0x40,0x41,0x30,0x1e,0x0d,0x87,0x87,0xce,0xce,0x0b,0x1b,0x2d,0x34,0x37,0x39,0x3a, 0x3c,0x3e,0x30,0x1e,0x0d,0x85,0x85,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x30,0xa9, 0xe8,0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xca,0x0a,0x19,0x2b,0x32,0x35,0x36,0x39, 0x3a,0x3c,0x2e,0x1c,0x0c,0x80,0x80,0xc8,0xc8,0x09,0x18,0x2b,0x31,0x33,0x35,0x37, 0x39,0x39,0x2d,0x1c,0x0c,0x7e,0x7e,0xc6,0xc5,0x09,0x18,0x29,0x30,0x33,0x34,0x36, 0x39,0x39,0x2c,0x1b,0x0c,0x7c,0x7b,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc2,0x30,0xa0, 0xdf,0xc3,0xc3,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x0c,0x1e,0x32,0x39,0x3a,0x3c,0x3f, 0x40,0x41,0x33,0x1f,0x0f,0x7b,0x7b,0xc6,0xc7,0x0c,0x1e,0x31,0x38,0x3a,0x3c,0x3e, 0x40,0x40,0x33,0x1f,0x0e,0x7d,0x7e,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xca,0x30,0xa7, 0xe6,0xca,0xca,0xca,0xca,0xcb,0xcb,0xcb,0xcb,0x0b,0x1b,0x2f,0x35,0x39,0x3a,0x3b, 0x3e,0x3e,0x30,0x1e,0x0d,0x82,0x82,0xcd,0xcd,0x0b,0x1b,0x2d,0x34,0x36,0x39,0x3a, 0x3c,0x3d,0x30,0x1d,0x0d,0x84,0x84,0xcf,0xcf,0x0a,0x1b,0x2d,0x33,0x36,0x39,0x3a, 0x3c,0x3e,0x2f,0x1d,0x0c,0x86,0x86,0xd1,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x30,0xb0, 0xef,0xd3,0xd3,0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0x0c,0x1e,0x34,0x3d,0x40,0x43,0x46, 0x48,0x49,0x36,0x1f,0x0f,0x8b,0x8b,0xd6,0xd6,0x0c,0x1e,0x36,0x3f,0x42,0x45,0x47, 0x49,0x49,0x39,0x1f,0x0e,0x8d,0x8d,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9,0xd9,0x36,0xb6, 0xf6,0xda,0xda,0xda,0xda,0xda,0xda,0xdb,0xdb,0x0b,0x1d,0x37,0x3f,0x44,0x47,0x48, 0x4c,0x4c,0x3a,0x21,0x0d,0x92,0x92,0xdd,0xdd,0x0b,0x1e,0x36,0x41,0x43,0x47,0x49, 0x4c,0x4d,0x3b,0x23,0x0e,0x94,0x94,0xdf,0xdf,0x0a,0x21,0x39,0x42,0x45,0x49,0x4a, 0x4c,0x4e,0x3d,0x25,0x0f,0x96,0x96,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0x3f,0xc0, 0xff,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0x12,0x29,0x44,0x4d,0x4f,0x52,0x56, 0x58,0x59,0x46,0x2c,0x16,0x9a,0x9b,0xe6,0xe6,0x13,0x2b,0x45,0x4e,0x52,0x55,0x57, 0x59,0x59,0x48,0x2e,0x18,0x9d,0x9d,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0x46,0xc6, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x16,0x2d,0x47,0x4f,0x54,0x56,0x57, 0x5b,0x5c,0x4a,0x31,0x1b,0xa1,0xa1,0xe9,0xe9,0x19,0x2e,0x46,0x50,0x52,0x56,0x59, 0x5c,0x5d,0x4b,0x32,0x1d,0xa3,0xa4,0xe9,0xe9,0x1a,0x30,0x48,0x51,0x55,0x59,0x5a, 0x5c,0x5d,0x4c,0x34,0x1f,0xa6,0xa6,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x4f,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x22,0x39,0x54,0x5d,0x5f,0x62,0x65, 0x68,0x69,0x56,0x3c,0x26,0xaa,0xaa,0xe9,0xe9,0x23,0x3b,0x55,0x5e,0x61,0x65,0x67, 0x69,0x69,0x58,0x3e,0x27,0xad,0xad,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x56,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x26,0x3c,0x56,0x5f,0x64,0x66,0x67, 0x6b,0x6b,0x59,0x41,0x2b,0xb1,0xb1,0xe9,0xe9,0x28,0x3e,0x56,0x60,0x62,0x66,0x68, 0x6b,0x6d,0x5b,0x42,0x2d,0xb1,0xb1,0xe9,0xe9,0x2a,0x40,0x58,0x61,0x64,0x68,0x6a, 0x6c,0x6d,0x5c,0x44,0x2e,0xb1,0xb1,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x5f,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x2f,0x45,0x60,0x69,0x6b,0x6e,0x71, 0x73,0x73,0x60,0x46,0x30,0xb1,0xb1,0xe9,0xe9,0x2b,0x43,0x5d,0x66,0x69,0x6c,0x6d, 0x6f,0x6f,0x5e,0x44,0x2d,0xb1,0xb1,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x58,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x26,0x3c,0x55,0x5d,0x62,0x64,0x65, 0x69,0x69,0x56,0x3d,0x27,0xad,0xad,0xe9,0xe9,0x24,0x39,0x50,0x5a,0x5c,0x60,0x62, 0x65,0x66,0x53,0x3a,0x25,0xab,0xab,0xe9,0xe9,0x20,0x36,0x4e,0x57,0x5a,0x5e,0x5f, 0x60,0x61,0x50,0x38,0x22,0xa9,0xa9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x4f,0xcf, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x1f,0x36,0x51,0x59,0x5b,0x5e,0x61, 0x63,0x64,0x51,0x36,0x20,0xa4,0xa4,0xe9,0xe9,0x1c,0x34,0x4d,0x56,0x59,0x5c,0x5e, 0x60,0x60,0x4e,0x34,0x1d,0xa2,0xa2,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x49,0xc9, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x16,0x2c,0x46,0x4e,0x53,0x54,0x55, 0x59,0x59,0x47,0x2e,0x18,0x9d,0x9d,0xe8,0xe8,0x14,0x29,0x41,0x4a,0x4c,0x50,0x52, 0x55,0x56,0x44,0x2a,0x15,0x9b,0x9b,0xe6,0xe6,0x11,0x26,0x3e,0x47,0x4a,0x4e,0x4f, 0x51,0x51,0x40,0x28,0x12,0x99,0x99,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x40,0xc0, 0xff,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0x0f,0x26,0x41,0x4a,0x4c,0x4f,0x51, 0x53,0x54,0x41,0x27,0x11,0x95,0x94,0xdf,0xdf,0x0c,0x24,0x3e,0x47,0x49,0x4c,0x4e, 0x50,0x50,0x3f,0x25,0x0e,0x92,0x92,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0x39,0xb9, 0xf8,0xdc,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0x0b,0x1c,0x36,0x3e,0x43,0x45,0x46, 0x49,0x49,0x37,0x1e,0x0d,0x8e,0x8e,0xd8,0xd8,0x0b,0x1b,0x31,0x3b,0x3d,0x40,0x42, 0x45,0x46,0x34,0x1d,0x0d,0x8b,0x8b,0xd6,0xd6,0x0a,0x1b,0x2f,0x38,0x3a,0x3e,0x3f, 0x41,0x42,0x31,0x1d,0x0c,0x89,0x89,0xd4,0xd4,0xd4,0xd4,0xd3,0xd3,0xd3,0x30,0xb0, 0xef,0xd3,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x0c,0x1e,0x32,0x3a,0x3c,0x3f,0x42, 0x43,0x44,0x33,0x1f,0x0f,0x85,0x85,0xcf,0xcf,0x0c,0x1e,0x31,0x38,0x3a,0x3c,0x3e, 0x40,0x40,0x33,0x1f,0x0e,0x83,0x83,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0x30,0xa9, 0xe8,0xcc,0xcc,0xcc,0xcc,0xcb,0xcb,0xcb,0xcb,0x0b,0x1b,0x2f,0x35,0x39,0x3a,0x3b, 0x3e,0x3e,0x30,0x1e,0x0d,0x7e,0x7e,0xc9,0xc9,0x0b,0x1b,0x2d,0x34,0x36,0x39,0x3a, 0x3c,0x3d,0x30,0x1d,0x0d,0x7c,0x7c,0xc7,0xc6,0x0a,0x1b,0x2d,0x33,0x36,0x39,0x39, 0x3b,0x3c,0x2f,0x1d,0x0c,0x7a,0x79,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc3,0x30,0xa0, 0xdf,0xc4,0xc4,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0x0d,0x23,0x33,0x3c,0x3f,0x40,0x42, 0x44,0x45,0x36,0x21,0x10,0x7d,0x7d,0xc7,0xc8,0x0c,0x23,0x33,0x3c,0x3e,0x40,0x42, 0x43,0x43,0x35,0x21,0x10,0x7f,0x80,0xca,0xca,0xca,0xca,0xca,0xca,0xcb,0x30,0xa7, 0xe6,0xcb,0xcb,0xcb,0xcc,0xcc,0xcc,0xcc,0xcc,0x0c,0x23,0x32,0x39,0x3a,0x3e,0x3f, 0x40,0x41,0x33,0x1f,0x0f,0x84,0x84,0xce,0xce,0x0c,0x22,0x30,0x38,0x3a,0x3c,0x3e, 0x40,0x40,0x32,0x1e,0x0e,0x86,0x86,0xd0,0xd0,0x0b,0x22,0x2e,0x36,0x39,0x3b,0x3e, 0x41,0x42,0x31,0x1e,0x0e,0x88,0x88,0xd2,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0x30,0xb0, 0xef,0xd4,0xd4,0xd4,0xd4,0xd4,0xd5,0xd5,0xd5,0x0d,0x23,0x36,0x41,0x46,0x48,0x4a, 0x4d,0x4e,0x3b,0x21,0x10,0x8d,0x8d,0xd7,0xd7,0x0c,0x23,0x39,0x44,0x47,0x49,0x4c, 0x4d,0x4e,0x3c,0x22,0x10,0x8f,0x8f,0xd9,0xd9,0xda,0xda,0xda,0xda,0xda,0x36,0xb6, 0xf6,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0x0c,0x27,0x3b,0x45,0x46,0x4c,0x4d, 0x4f,0x50,0x3d,0x23,0x0f,0x94,0x94,0xde,0xde,0x0c,0x28,0x3a,0x46,0x49,0x4c,0x4e, 0x50,0x50,0x3e,0x25,0x0f,0x96,0x96,0xe0,0xe0,0x0b,0x2b,0x3b,0x46,0x49,0x4b,0x4e, 0x51,0x52,0x40,0x26,0x11,0x98,0x98,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x3f,0xc0, 0xff,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0x13,0x30,0x46,0x51,0x55,0x57,0x5a, 0x5d,0x5e,0x4b,0x2f,0x18,0x9c,0x9d,0xe7,0xe7,0x14,0x32,0x48,0x53,0x57,0x59,0x5c, 0x5d,0x5e,0x4b,0x31,0x1b,0x9f,0x9f,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0x46,0xc6, 0xff,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x18,0x37,0x4b,0x55,0x56,0x5b,0x5c, 0x5e,0x60,0x4d,0x33,0x1d,0xa3,0xa3,0xea,0xea,0x1a,0x38,0x4a,0x55,0x58,0x5b,0x5e, 0x60,0x60,0x4e,0x34,0x1e,0xa5,0xa6,0xea,0xea,0x1b,0x3a,0x4a,0x55,0x59,0x5b,0x5e, 0x61,0x61,0x4f,0x35,0x21,0xa8,0xa8,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x4f,0xcf, 0xff,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x23,0x40,0x56,0x61,0x65,0x67,0x69, 0x6d,0x6e,0x5b,0x3f,0x28,0xac,0xac,0xea,0xea,0x24,0x42,0x58,0x63,0x66,0x69,0x6c, 0x6d,0x6e,0x5b,0x41,0x2a,0xaf,0xaf,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x56,0xcf, 0xff,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x28,0x46,0x5a,0x65,0x66,0x6b,0x6c, 0x6e,0x6f,0x5c,0x43,0x2d,0xb2,0xb2,0xea,0xea,0x29,0x48,0x5a,0x65,0x68,0x6b,0x6d, 0x6f,0x70,0x5e,0x44,0x2e,0xb2,0xb2,0xea,0xea,0x2b,0x4a,0x5a,0x65,0x68,0x6a,0x6e, 0x71,0x71,0x5f,0x45,0x30,0xb2,0xb2,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x5f,0xcf, 0xff,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x30,0x4c,0x62,0x6d,0x71,0x73,0x75, 0x78,0x78,0x65,0x49,0x32,0xb2,0xb2,0xea,0xea,0x2c,0x4a,0x60,0x6b,0x6e,0x70,0x72, 0x73,0x74,0x61,0x47,0x30,0xb2,0xb2,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x58,0xcf, 0xff,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x28,0x46,0x59,0x63,0x64,0x69,0x6a, 0x6c,0x6d,0x59,0x3f,0x29,0xaf,0xaf,0xea,0xea,0x25,0x43,0x54,0x5f,0x62,0x65,0x67, 0x69,0x69,0x56,0x3c,0x26,0xad,0xad,0xea,0xea,0x21,0x40,0x50,0x5b,0x5e,0x60,0x63, 0x65,0x65,0x53,0x39,0x24,0xab,0xab,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x4f,0xcf, 0xff,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x20,0x3d,0x53,0x5d,0x61,0x63,0x65, 0x68,0x69,0x56,0x39,0x22,0xa6,0xa6,0xea,0xea,0x1d,0x3a,0x50,0x5b,0x5e,0x60,0x63, 0x64,0x65,0x51,0x37,0x20,0xa4,0xa4,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x49,0xc9, 0xff,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x18,0x36,0x4a,0x54,0x55,0x59,0x5a, 0x5c,0x5d,0x4a,0x30,0x1a,0x9f,0x9f,0xe9,0xe9,0x15,0x33,0x45,0x4f,0x52,0x55,0x57, 0x59,0x59,0x47,0x2c,0x16,0x9d,0x9d,0xe7,0xe7,0x12,0x30,0x40,0x4b,0x4e,0x50,0x53, 0x56,0x55,0x43,0x29,0x14,0x9b,0x9b,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0x40,0xc0, 0xff,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0x10,0x2d,0x43,0x4e,0x52,0x54,0x55, 0x58,0x59,0x46,0x2a,0x13,0x97,0x96,0xe0,0xe0,0x0d,0x2b,0x41,0x4c,0x4e,0x50,0x53, 0x54,0x55,0x42,0x28,0x10,0x94,0x94,0xde,0xde,0xde,0xde,0xdd,0xdd,0xdd,0x39,0xb9, 0xf8,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0x0c,0x26,0x3a,0x44,0x45,0x4a,0x4b, 0x4c,0x4d,0x3a,0x20,0x0f,0x90,0x90,0xd9,0xd9,0x0c,0x23,0x35,0x40,0x43,0x45,0x47, 0x49,0x49,0x37,0x1e,0x0e,0x8d,0x8d,0xd7,0xd7,0x0b,0x22,0x31,0x3b,0x3e,0x40,0x43, 0x46,0x46,0x34,0x1e,0x0e,0x8b,0x8b,0xd5,0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0x30,0xb0, 0xef,0xd4,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0x0d,0x23,0x33,0x3e,0x42,0x44,0x46, 0x48,0x49,0x36,0x21,0x10,0x87,0x87,0xd0,0xd0,0x0c,0x23,0x33,0x3c,0x3f,0x40,0x43, 0x44,0x45,0x35,0x21,0x10,0x85,0x85,0xce,0xce,0xce,0xce,0xce,0xce,0xce,0x30,0xa9, 0xe8,0xcd,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc,0xcc,0x0c,0x23,0x32,0x39,0x3a,0x3e,0x3f, 0x40,0x41,0x33,0x1f,0x0f,0x80,0x80,0xca,0xca,0x0c,0x22,0x30,0x38,0x3a,0x3c,0x3e, 0x40,0x40,0x32,0x1e,0x0e,0x7e,0x7e,0xc8,0xc7,0x0b,0x22,0x2e,0x36,0x39,0x3a,0x3c, 0x3f,0x3f,0x31,0x1e,0x0e,0x7c,0x7b,0xc5,0xc5,0xc5,0xc5,0xc5,0xc5,0xc4,0x30,0xa0, 0xdf,0xc5,0xc5,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x0e,0x31,0x38,0x3f,0x42,0x44,0x45, 0x48,0x48,0x39,0x23,0x10,0x80,0x80,0xc8,0xc9,0x0e,0x31,0x36,0x3f,0x42,0x42,0x44, 0x46,0x47,0x37,0x22,0x10,0x82,0x83,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcc,0x30,0xa7, 0xe6,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xcd,0xcd,0x0d,0x30,0x33,0x3c,0x3f,0x40,0x42, 0x44,0x45,0x36,0x21,0x10,0x87,0x87,0xcf,0xcf,0x0c,0x30,0x33,0x3a,0x3e,0x3f,0x41, 0x44,0x45,0x35,0x21,0x10,0x89,0x89,0xd1,0xd1,0x0c,0x30,0x32,0x3a,0x3e,0x40,0x42, 0x46,0x48,0x33,0x20,0x0f,0x8b,0x8b,0xd3,0xd4,0xd4,0xd4,0xd4,0xd4,0xd4,0x30,0xb0, 0xef,0xd5,0xd5,0xd5,0xd5,0xd5,0xd6,0xd6,0xd6,0x0e,0x33,0x3c,0x45,0x4a,0x4d,0x4e, 0x52,0x52,0x3e,0x23,0x10,0x90,0x90,0xd8,0xd8,0x0e,0x35,0x3d,0x48,0x4c,0x4c,0x4f, 0x51,0x53,0x3f,0x23,0x10,0x92,0x92,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdb,0x36,0xb6, 0xf6,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0xdd,0x0d,0x39,0x3d,0x48,0x4c,0x4e,0x51, 0x54,0x55,0x41,0x26,0x10,0x97,0x97,0xdf,0xdf,0x0c,0x3b,0x3f,0x49,0x4e,0x4f,0x51, 0x54,0x55,0x42,0x29,0x12,0x99,0x99,0xe1,0xe1,0x0d,0x3e,0x40,0x4a,0x4e,0x50,0x52, 0x55,0x58,0x43,0x29,0x13,0x9b,0x9b,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0x3f,0xc0, 0xff,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0x14,0x43,0x4c,0x55,0x59,0x5c,0x5e, 0x62,0x62,0x4e,0x31,0x18,0x9f,0xa0,0xe8,0xe8,0x16,0x45,0x4c,0x57,0x5c,0x5c,0x5f, 0x61,0x63,0x4e,0x32,0x1b,0xa2,0xa2,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0x46,0xc6, 0xff,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x19,0x49,0x4d,0x58,0x5c,0x5d,0x60, 0x63,0x65,0x51,0x36,0x1f,0xa6,0xa6,0xeb,0xeb,0x1b,0x4b,0x4f,0x58,0x5d,0x5e,0x61, 0x64,0x65,0x52,0x38,0x21,0xa8,0xa9,0xeb,0xeb,0x1d,0x4d,0x4f,0x59,0x5e,0x60,0x62, 0x65,0x67,0x52,0x38,0x23,0xab,0xab,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x4f,0xcf, 0xff,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x24,0x53,0x5c,0x65,0x69,0x6c,0x6d, 0x72,0x72,0x5e,0x41,0x28,0xaf,0xaf,0xeb,0xeb,0x26,0x55,0x5c,0x67,0x6b,0x6c,0x6f, 0x71,0x73,0x5e,0x42,0x2a,0xb2,0xb2,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x56,0xcf, 0xff,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x29,0x58,0x5c,0x68,0x6c,0x6d,0x70, 0x73,0x74,0x60,0x46,0x2f,0xb5,0xb5,0xeb,0xeb,0x2a,0x5b,0x5f,0x68,0x6d,0x6e,0x70, 0x73,0x75,0x62,0x48,0x31,0xb5,0xb5,0xeb,0xeb,0x2d,0x5d,0x5f,0x69,0x6d,0x6f,0x72, 0x75,0x77,0x62,0x48,0x32,0xb5,0xb5,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x5f,0xcf, 0xff,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x31,0x5f,0x68,0x71,0x75,0x78,0x79, 0x7d,0x7c,0x68,0x4b,0x32,0xb5,0xb5,0xeb,0xeb,0x2e,0x5d,0x64,0x6f,0x73,0x73,0x75, 0x77,0x79,0x64,0x48,0x30,0xb5,0xb5,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x58,0xcf, 0xff,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x29,0x58,0x5b,0x66,0x6a,0x6b,0x6e, 0x71,0x72,0x5d,0x42,0x2b,0xb2,0xb2,0xeb,0xeb,0x26,0x56,0x59,0x62,0x67,0x68,0x6a, 0x6d,0x6e,0x5a,0x40,0x29,0xb0,0xb0,0xeb,0xeb,0x23,0x53,0x55,0x5f,0x63,0x65,0x67, 0x69,0x6b,0x56,0x3c,0x26,0xae,0xae,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x4f,0xcf, 0xff,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x21,0x50,0x59,0x61,0x65,0x68,0x69, 0x6d,0x6d,0x59,0x3b,0x22,0xa9,0xa9,0xeb,0xeb,0x1f,0x4d,0x54,0x5f,0x63,0x63,0x66, 0x68,0x69,0x54,0x38,0x20,0xa7,0xa7,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x49,0xc9, 0xff,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x19,0x48,0x4c,0x57,0x5b,0x5b,0x5e, 0x61,0x62,0x4e,0x33,0x1c,0xa2,0xa2,0xea,0xea,0x16,0x46,0x4a,0x52,0x57,0x58,0x5a, 0x5d,0x5e,0x4b,0x30,0x19,0xa0,0xa0,0xe8,0xe8,0x14,0x43,0x45,0x4f,0x53,0x55,0x57, 0x5a,0x5b,0x46,0x2c,0x16,0x9e,0x9e,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0x40,0xc0, 0xff,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0x11,0x40,0x49,0x52,0x56,0x59,0x59, 0x5d,0x5d,0x49,0x2c,0x13,0x9a,0x99,0xe1,0xe1,0x0f,0x3e,0x45,0x50,0x53,0x53,0x56, 0x58,0x5a,0x45,0x29,0x10,0x97,0x97,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0xde,0x39,0xb9, 0xf8,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0x0d,0x38,0x3c,0x47,0x4b,0x4c,0x4f, 0x51,0x52,0x3e,0x23,0x10,0x93,0x93,0xda,0xda,0x0c,0x36,0x3a,0x43,0x48,0x48,0x4a, 0x4d,0x4e,0x3b,0x21,0x10,0x90,0x90,0xd8,0xd8,0x0c,0x34,0x36,0x3f,0x43,0x45,0x47, 0x4a,0x4c,0x37,0x20,0x0f,0x8e,0x8e,0xd6,0xd6,0xd6,0xd5,0xd5,0xd5,0xd5,0x30,0xb0, 0xef,0xd5,0xd4,0xd4,0xd4,0xd4,0xd4,0xd4,0xd4,0x0e,0x31,0x39,0x42,0x46,0x49,0x4a, 0x4d,0x4d,0x39,0x23,0x10,0x8a,0x8a,0xd1,0xd1,0x0e,0x31,0x36,0x40,0x44,0x43,0x46, 0x48,0x4a,0x37,0x22,0x10,0x88,0x88,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x30,0xa9, 0xe8,0xce,0xce,0xce,0xce,0xcd,0xcd,0xcd,0xcd,0x0d,0x30,0x33,0x3c,0x3f,0x40,0x42, 0x44,0x45,0x36,0x21,0x10,0x83,0x83,0xcb,0xcb,0x0c,0x30,0x33,0x3a,0x3e,0x3f,0x40, 0x43,0x43,0x35,0x21,0x10,0x81,0x81,0xc9,0xc8,0x0c,0x30,0x32,0x39,0x3c,0x3e,0x40, 0x42,0x43,0x33,0x20,0x0f,0x7f,0x7e,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc5,0x30,0xa0, 0xdf,0xc6,0xc6,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0x0f,0x40,0x3b,0x43,0x46,0x46,0x48, 0x4a,0x4b,0x3b,0x25,0x12,0x83,0x83,0xc9,0xca,0x0f,0x40,0x39,0x41,0x44,0x46,0x48, 0x49,0x4a,0x3b,0x24,0x12,0x85,0x86,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcd,0x30,0xa7, 0xe6,0xcd,0xcd,0xcd,0xce,0xce,0xce,0xce,0xce,0x0e,0x3f,0x38,0x3f,0x42,0x44,0x46, 0x47,0x49,0x39,0x24,0x10,0x8a,0x8a,0xd0,0xd0,0x0e,0x3f,0x38,0x3f,0x43,0x46,0x48, 0x49,0x4b,0x39,0x24,0x10,0x8c,0x8c,0xd2,0xd2,0x0e,0x41,0x38,0x41,0x45,0x48,0x4a, 0x4c,0x4e,0x3a,0x24,0x10,0x8e,0x8e,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0x30,0xb0, 0xef,0xd6,0xd6,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7,0x0f,0x46,0x40,0x4b,0x4f,0x50,0x52, 0x55,0x56,0x41,0x25,0x12,0x93,0x93,0xd9,0xd9,0x0f,0x48,0x41,0x4b,0x4f,0x51,0x54, 0x55,0x57,0x44,0x26,0x12,0x95,0x95,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0x36,0xb6, 0xf6,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0x0e,0x4c,0x43,0x4c,0x50,0x54,0x56, 0x57,0x59,0x45,0x29,0x10,0x9a,0x9a,0xe0,0xe0,0x0e,0x4e,0x45,0x4f,0x53,0x56,0x58, 0x59,0x5b,0x47,0x2c,0x12,0x9c,0x9c,0xe2,0xe2,0x0f,0x51,0x48,0x51,0x55,0x58,0x5a, 0x5b,0x5e,0x4a,0x2e,0x14,0x9e,0x9e,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0x3f,0xc0, 0xff,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0x16,0x56,0x50,0x5b,0x5e,0x5f,0x62, 0x65,0x66,0x51,0x34,0x1b,0xa2,0xa3,0xe9,0xe9,0x17,0x58,0x50,0x5a,0x5f,0x61,0x64, 0x65,0x67,0x53,0x35,0x1d,0xa5,0xa5,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0x46,0xc6, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x1b,0x5c,0x53,0x5c,0x60,0x63,0x65, 0x66,0x69,0x55,0x39,0x1f,0xa9,0xa9,0xec,0xec,0x1d,0x5e,0x55,0x5e,0x62,0x65,0x68, 0x69,0x6b,0x57,0x3b,0x21,0xab,0xac,0xec,0xec,0x1f,0x60,0x57,0x60,0x65,0x68,0x6a, 0x6b,0x6d,0x59,0x3d,0x24,0xae,0xae,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x4f,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x26,0x66,0x60,0x6b,0x6e,0x6f,0x71, 0x75,0x76,0x61,0x44,0x2b,0xb2,0xb2,0xec,0xec,0x27,0x68,0x60,0x6a,0x6e,0x71,0x74, 0x75,0x77,0x63,0x45,0x2c,0xb5,0xb5,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x56,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x2a,0x6b,0x62,0x6c,0x70,0x73,0x75, 0x76,0x78,0x64,0x49,0x2f,0xb7,0xb7,0xec,0xec,0x2c,0x6e,0x65,0x6e,0x72,0x75,0x77, 0x78,0x7b,0x67,0x4b,0x31,0xb7,0xb7,0xec,0xec,0x2f,0x70,0x67,0x70,0x74,0x77,0x7a, 0x7b,0x7d,0x69,0x4d,0x33,0xb7,0xb7,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x5f,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x33,0x72,0x6c,0x77,0x7a,0x7b,0x7d, 0x80,0x80,0x6b,0x4e,0x35,0xb7,0xb7,0xec,0xec,0x2f,0x70,0x68,0x72,0x76,0x78,0x7a, 0x7b,0x7d,0x69,0x4b,0x32,0xb7,0xb7,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x58,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x2a,0x6b,0x61,0x6a,0x6e,0x71,0x73, 0x74,0x76,0x61,0x45,0x2b,0xb5,0xb5,0xec,0xec,0x28,0x69,0x5f,0x68,0x6c,0x6f,0x71, 0x72,0x74,0x5f,0x43,0x29,0xb3,0xb3,0xec,0xec,0x25,0x66,0x5d,0x66,0x6a,0x6d,0x6f, 0x6f,0x71,0x5d,0x41,0x27,0xb1,0xb1,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x4f,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x23,0x63,0x5d,0x67,0x6a,0x6b,0x6d, 0x70,0x71,0x5c,0x3e,0x25,0xac,0xac,0xec,0xec,0x20,0x60,0x58,0x62,0x66,0x68,0x6b, 0x6c,0x6d,0x59,0x3b,0x22,0xaa,0xaa,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x49,0xc8, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x1a,0x5b,0x52,0x5b,0x5f,0x61,0x63, 0x64,0x66,0x52,0x36,0x1c,0xa5,0xa5,0xeb,0xeb,0x18,0x59,0x50,0x58,0x5c,0x5f,0x61, 0x62,0x64,0x50,0x33,0x19,0xa3,0xa3,0xe9,0xe9,0x16,0x56,0x4d,0x56,0x5a,0x5d,0x5f, 0x60,0x61,0x4d,0x31,0x17,0xa1,0xa1,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x40,0xc0, 0xff,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0x13,0x53,0x4d,0x58,0x5b,0x5c,0x5d, 0x60,0x61,0x4c,0x2f,0x16,0x9d,0x9c,0xe2,0xe2,0x10,0x51,0x49,0x53,0x56,0x58,0x5b, 0x5c,0x5e,0x4a,0x2c,0x12,0x9a,0x9a,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0x39,0xb9, 0xf8,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0x0e,0x4b,0x42,0x4b,0x4f,0x52,0x54, 0x54,0x56,0x42,0x26,0x10,0x96,0x96,0xdb,0xdb,0x0e,0x49,0x40,0x49,0x4d,0x4f,0x51, 0x52,0x54,0x40,0x24,0x10,0x93,0x93,0xd9,0xd9,0x0e,0x47,0x3e,0x46,0x4a,0x4d,0x4f, 0x50,0x52,0x3e,0x24,0x10,0x91,0x91,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd6,0x30,0xb0, 0xef,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0x0f,0x43,0x3d,0x48,0x4b,0x4c,0x4e, 0x50,0x51,0x3c,0x25,0x12,0x8d,0x8d,0xd2,0xd2,0x0f,0x41,0x39,0x43,0x47,0x48,0x4b, 0x4c,0x4e,0x3b,0x24,0x12,0x8b,0x8a,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0x30,0xa9, 0xe8,0xcf,0xcf,0xcf,0xcf,0xce,0xce,0xce,0xce,0x0e,0x3f,0x38,0x3f,0x42,0x44,0x46, 0x46,0x48,0x39,0x24,0x10,0x86,0x86,0xcc,0xcc,0x0e,0x3f,0x38,0x3f,0x42,0x44,0x46, 0x46,0x48,0x39,0x24,0x10,0x84,0x84,0xca,0xc9,0x0e,0x3f,0x38,0x3f,0x42,0x44,0x46, 0x46,0x48,0x39,0x24,0x10,0x82,0x81,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc6,0x30,0xa0, 0xdf,0xc7,0xc7,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x10,0x4e,0x3d,0x46,0x49,0x4a,0x4c, 0x4c,0x4e,0x3d,0x27,0x13,0x87,0x87,0xca,0xcb,0x10,0x4d,0x3c,0x45,0x46,0x49,0x4b, 0x4c,0x4e,0x3c,0x27,0x12,0x89,0x8a,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0xce,0x30,0xa7, 0xe6,0xce,0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xcf,0x10,0x4f,0x3c,0x45,0x47,0x4a,0x4d, 0x4f,0x51,0x3c,0x27,0x12,0x8e,0x8e,0xd1,0xd1,0x10,0x52,0x3c,0x47,0x49,0x4c,0x4f, 0x51,0x53,0x3d,0x27,0x12,0x90,0x90,0xd3,0xd3,0x10,0x54,0x3e,0x49,0x4b,0x4e,0x51, 0x54,0x56,0x3f,0x27,0x12,0x92,0x92,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0x30,0xb0, 0xef,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0xd8,0xd8,0x10,0x59,0x43,0x4e,0x53,0x55,0x57, 0x58,0x5a,0x44,0x27,0x13,0x97,0x97,0xda,0xda,0x10,0x5a,0x45,0x50,0x52,0x55,0x58, 0x5a,0x5c,0x46,0x29,0x12,0x99,0x99,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0x36,0xb6, 0xf6,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0x10,0x5f,0x49,0x54,0x56,0x5a,0x5d, 0x5f,0x61,0x4a,0x2d,0x12,0x9e,0x9e,0xe1,0xe1,0x10,0x61,0x4b,0x57,0x59,0x5c,0x5f, 0x61,0x63,0x4c,0x30,0x15,0xa0,0xa0,0xe3,0xe3,0x12,0x64,0x4e,0x59,0x5b,0x5e,0x61, 0x63,0x66,0x4f,0x32,0x17,0xa2,0xa2,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x3f,0xc0, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0x17,0x69,0x53,0x5e,0x62,0x64,0x67, 0x68,0x6a,0x54,0x36,0x1c,0xa6,0xa7,0xea,0xea,0x19,0x6a,0x54,0x5f,0x62,0x65,0x68, 0x6a,0x6c,0x55,0x38,0x1e,0xa9,0xa9,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x46,0xc6, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x1e,0x6f,0x59,0x64,0x66,0x69,0x6c, 0x6f,0x71,0x5a,0x3d,0x22,0xad,0xad,0xec,0xec,0x20,0x71,0x5b,0x66,0x68,0x6b,0x6f, 0x71,0x73,0x5c,0x3f,0x24,0xaf,0xb0,0xec,0xec,0x22,0x73,0x5d,0x68,0x6b,0x6e,0x71, 0x73,0x75,0x5e,0x41,0x27,0xb2,0xb2,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x4f,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x27,0x79,0x63,0x6e,0x72,0x74,0x76, 0x78,0x7a,0x64,0x46,0x2c,0xb6,0xb6,0xec,0xec,0x29,0x7a,0x64,0x6f,0x71,0x75,0x78, 0x7a,0x7c,0x65,0x48,0x2d,0xb9,0xb9,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x56,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x2d,0x7e,0x68,0x74,0x76,0x79,0x7c, 0x7e,0x80,0x69,0x4d,0x32,0xba,0xba,0xec,0xec,0x2f,0x81,0x6b,0x76,0x78,0x7b,0x7e, 0x80,0x83,0x6c,0x4f,0x34,0xba,0xba,0xec,0xec,0x32,0x83,0x6d,0x78,0x7a,0x7d,0x81, 0x83,0x85,0x6e,0x51,0x36,0xba,0xba,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x5f,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x34,0x85,0x6f,0x7a,0x7e,0x80,0x82, 0x83,0x84,0x6e,0x50,0x36,0xba,0xba,0xec,0xec,0x31,0x82,0x6c,0x77,0x79,0x7c,0x7e, 0x80,0x82,0x6b,0x4e,0x33,0xba,0xba,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x58,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x2d,0x7e,0x67,0x72,0x74,0x77,0x7a, 0x7c,0x7e,0x66,0x49,0x2e,0xb9,0xb9,0xec,0xec,0x2b,0x7c,0x65,0x70,0x72,0x75,0x78, 0x7a,0x7c,0x64,0x47,0x2c,0xb7,0xb7,0xec,0xec,0x28,0x79,0x63,0x6e,0x70,0x73,0x76, 0x77,0x79,0x62,0x45,0x2a,0xb5,0xb5,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x4f,0xcf, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x24,0x76,0x60,0x6a,0x6e,0x70,0x72, 0x73,0x75,0x5f,0x40,0x26,0xb0,0xb0,0xec,0xec,0x22,0x72,0x5c,0x67,0x69,0x6c,0x6f, 0x71,0x72,0x5b,0x3e,0x23,0xae,0xae,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x49,0xc8, 0xff,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x1d,0x6e,0x58,0x63,0x65,0x67,0x6a, 0x6c,0x6e,0x57,0x3a,0x1f,0xa9,0xa9,0xec,0xec,0x1b,0x6c,0x56,0x60,0x62,0x65,0x68, 0x6a,0x6c,0x55,0x37,0x1c,0xa7,0xa7,0xea,0xea,0x19,0x69,0x53,0x5e,0x60,0x63,0x66, 0x68,0x69,0x52,0x35,0x1a,0xa5,0xa5,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x40,0xc0, 0xff,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0x14,0x66,0x50,0x5b,0x5f,0x61,0x62, 0x63,0x65,0x4f,0x31,0x17,0xa1,0xa0,0xe3,0xe3,0x12,0x63,0x4d,0x58,0x59,0x5c,0x5f, 0x61,0x63,0x4c,0x2f,0x13,0x9e,0x9e,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0x39,0xb9, 0xf8,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0x10,0x5e,0x48,0x53,0x55,0x58,0x5b, 0x5c,0x5e,0x47,0x2a,0x12,0x9a,0x9a,0xdc,0xdc,0x10,0x5c,0x46,0x51,0x53,0x55,0x58, 0x5a,0x5c,0x45,0x28,0x12,0x97,0x97,0xda,0xda,0x10,0x5a,0x44,0x4e,0x50,0x53,0x56, 0x58,0x5a,0x43,0x27,0x12,0x95,0x95,0xd8,0xd8,0xd8,0xd7,0xd7,0xd7,0xd7,0x30,0xb0, 0xef,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd5,0x10,0x56,0x40,0x4b,0x4f,0x51,0x53, 0x53,0x55,0x3f,0x27,0x13,0x91,0x91,0xd3,0xd3,0x10,0x53,0x3d,0x48,0x4a,0x4c,0x4f, 0x51,0x53,0x3c,0x27,0x12,0x8f,0x8e,0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0xd0,0x30,0xa9, 0xe8,0xd0,0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0x10,0x4f,0x3c,0x45,0x46,0x49,0x4b, 0x4d,0x4f,0x3c,0x27,0x12,0x8a,0x8a,0xcd,0xcd,0x10,0x4d,0x3c,0x45,0x46,0x49,0x4b, 0x4c,0x4e,0x3c,0x27,0x12,0x88,0x88,0xcb,0xca,0x10,0x4d,0x3c,0x45,0x46,0x49,0x4b, 0x4c,0x4e,0x3c,0x27,0x12,0x86,0x85,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc7,0x30,0xa0, 0xdf,0xc8,0xc8,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0x12,0x5c,0x41,0x4a,0x4c,0x4f,0x50, 0x52,0x52,0x42,0x2a,0x15,0x8a,0x8a,0xcb,0xcc,0x12,0x5e,0x41,0x4a,0x4c,0x4f,0x50, 0x52,0x53,0x42,0x2a,0x15,0x8c,0x8d,0xce,0xce,0xce,0xce,0xce,0xce,0xcf,0x30,0xa7, 0xe6,0xcf,0xcf,0xcf,0xd0,0xd0,0xd0,0xd0,0xd0,0x12,0x62,0x41,0x4c,0x4f,0x52,0x54, 0x56,0x57,0x42,0x2a,0x15,0x91,0x91,0xd2,0xd2,0x12,0x65,0x42,0x4e,0x51,0x54,0x56, 0x58,0x59,0x44,0x2a,0x15,0x93,0x93,0xd4,0xd4,0x12,0x67,0x44,0x50,0x53,0x56,0x58, 0x5b,0x5c,0x46,0x2a,0x15,0x95,0x95,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0x30,0xb0, 0xef,0xd8,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9,0x12,0x6b,0x48,0x54,0x58,0x5b,0x5d, 0x5f,0x60,0x4a,0x2a,0x15,0x9a,0x9a,0xdb,0xdb,0x12,0x6d,0x4b,0x57,0x5a,0x5d,0x5f, 0x61,0x62,0x4d,0x2d,0x15,0x9c,0x9c,0xdd,0xdd,0xde,0xde,0xde,0xde,0xde,0x36,0xb6, 0xf6,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0x12,0x72,0x4f,0x5b,0x5e,0x62,0x64, 0x66,0x67,0x51,0x31,0x16,0xa1,0xa1,0xe2,0xe2,0x13,0x74,0x51,0x5e,0x61,0x64,0x66, 0x68,0x69,0x53,0x34,0x19,0xa3,0xa3,0xe4,0xe4,0x15,0x77,0x54,0x60,0x63,0x66,0x68, 0x6a,0x6c,0x56,0x36,0x1b,0xa5,0xa5,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x3f,0xc0, 0xff,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0x1a,0x7b,0x58,0x64,0x67,0x6a,0x6d, 0x6f,0x70,0x5a,0x3a,0x1f,0xa9,0xaa,0xeb,0xeb,0x1c,0x7d,0x5a,0x66,0x6a,0x6d,0x6f, 0x71,0x72,0x5c,0x3c,0x22,0xac,0xac,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x46,0xc6, 0xff,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x21,0x82,0x5f,0x6b,0x6e,0x71,0x73, 0x76,0x77,0x61,0x41,0x26,0xb0,0xb0,0xed,0xed,0x23,0x84,0x61,0x6d,0x70,0x74,0x76, 0x78,0x79,0x63,0x43,0x28,0xb2,0xb3,0xed,0xed,0x25,0x86,0x63,0x6f,0x73,0x76,0x78, 0x7a,0x7b,0x65,0x45,0x2b,0xb5,0xb5,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x4f,0xcf, 0xff,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x2a,0x8b,0x68,0x74,0x77,0x7a,0x7c, 0x7f,0x80,0x6a,0x4a,0x2f,0xb9,0xb9,0xed,0xed,0x2c,0x8d,0x6a,0x76,0x79,0x7d,0x7f, 0x81,0x82,0x6c,0x4c,0x31,0xbc,0xbc,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x56,0xcf, 0xff,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x30,0x91,0x6e,0x7b,0x7e,0x81,0x83, 0x85,0x86,0x70,0x51,0x36,0xbc,0xbc,0xed,0xed,0x32,0x94,0x71,0x7d,0x80,0x83,0x85, 0x87,0x89,0x73,0x53,0x38,0xbc,0xbc,0xed,0xed,0x35,0x96,0x73,0x7f,0x82,0x85,0x88, 0x8a,0x8b,0x75,0x55,0x3a,0xbc,0xbc,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x5f,0xcf, 0xff,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x37,0x97,0x74,0x80,0x83,0x86,0x88, 0x8a,0x8a,0x74,0x54,0x39,0xbc,0xbc,0xed,0xed,0x34,0x95,0x72,0x7e,0x81,0x84,0x85, 0x87,0x88,0x72,0x52,0x37,0xbc,0xbc,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x58,0xcf, 0xff,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x30,0x91,0x6d,0x79,0x7c,0x7f,0x81, 0x83,0x84,0x6d,0x4d,0x32,0xbc,0xbc,0xed,0xed,0x2e,0x8f,0x6b,0x77,0x7a,0x7d,0x7f, 0x81,0x82,0x6b,0x4b,0x30,0xba,0xba,0xed,0xed,0x2b,0x8c,0x69,0x75,0x78,0x7b,0x7d, 0x7e,0x7f,0x69,0x49,0x2e,0xb8,0xb8,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x4f,0xcf, 0xff,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x27,0x88,0x65,0x70,0x73,0x76,0x78, 0x7a,0x7b,0x65,0x44,0x29,0xb3,0xb3,0xed,0xed,0x25,0x85,0x62,0x6e,0x71,0x74,0x76, 0x78,0x78,0x62,0x42,0x27,0xb1,0xb1,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x49,0xc8, 0xff,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x20,0x81,0x5e,0x6a,0x6c,0x6f,0x71, 0x73,0x74,0x5e,0x3e,0x23,0xac,0xac,0xed,0xed,0x1e,0x7f,0x5c,0x67,0x6a,0x6d,0x6f, 0x71,0x72,0x5c,0x3b,0x20,0xaa,0xaa,0xeb,0xeb,0x1c,0x7c,0x59,0x65,0x68,0x6b,0x6d, 0x6f,0x6f,0x59,0x39,0x1e,0xa8,0xa8,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x40,0xc0, 0xff,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0x17,0x78,0x55,0x61,0x64,0x67,0x68, 0x6a,0x6b,0x55,0x35,0x1a,0xa4,0xa3,0xe4,0xe4,0x15,0x76,0x53,0x5f,0x61,0x64,0x66, 0x68,0x69,0x53,0x33,0x17,0xa1,0xa1,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0x39,0xb9, 0xf8,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x12,0x71,0x4e,0x5a,0x5d,0x60,0x62, 0x63,0x64,0x4e,0x2e,0x15,0x9d,0x9d,0xdd,0xdd,0x12,0x6f,0x4c,0x58,0x5b,0x5d,0x5f, 0x61,0x62,0x4c,0x2c,0x15,0x9a,0x9a,0xdb,0xdb,0x12,0x6d,0x4a,0x55,0x58,0x5b,0x5d, 0x5f,0x60,0x4a,0x2a,0x15,0x98,0x98,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0x30,0xb0, 0xef,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd6,0x12,0x68,0x45,0x51,0x54,0x57,0x58, 0x5a,0x5b,0x45,0x2a,0x15,0x94,0x94,0xd4,0xd4,0x12,0x66,0x43,0x4f,0x52,0x54,0x56, 0x58,0x59,0x43,0x2a,0x15,0x92,0x91,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd1,0x30,0xa9, 0xe8,0xd1,0xd1,0xd1,0xd0,0xd0,0xd0,0xd0,0xd0,0x12,0x62,0x41,0x4a,0x4d,0x50,0x52, 0x54,0x55,0x42,0x2a,0x15,0x8d,0x8d,0xce,0xce,0x12,0x5f,0x41,0x4a,0x4c,0x4f,0x50, 0x52,0x52,0x42,0x2a,0x15,0x8b,0x8b,0xcc,0xcb,0x12,0x5d,0x41,0x4a,0x4c,0x4f,0x50, 0x52,0x52,0x42,0x2a,0x15,0x89,0x88,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc8,0x30,0xa0, 0xdf,0xc9,0xc9,0xca,0xca,0xca,0xca,0xca,0xca,0x15,0x71,0x46,0x4f,0x52,0x53,0x55, 0x57,0x58,0x46,0x2e,0x16,0x8d,0x8d,0xcc,0xcd,0x15,0x73,0x46,0x4f,0x52,0x53,0x56, 0x59,0x5a,0x46,0x2e,0x16,0x8f,0x90,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd0,0x30,0xa7, 0xe6,0xd0,0xd0,0xd0,0xd1,0xd1,0xd1,0xd1,0xd1,0x15,0x77,0x46,0x53,0x56,0x58,0x5a, 0x5d,0x5e,0x47,0x2e,0x16,0x94,0x94,0xd3,0xd3,0x15,0x7a,0x48,0x55,0x58,0x5a,0x5c, 0x5f,0x60,0x49,0x2e,0x16,0x96,0x96,0xd5,0xd5,0x15,0x7c,0x4a,0x57,0x5a,0x5c,0x5e, 0x62,0x63,0x4b,0x2e,0x16,0x98,0x98,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x30,0xb0, 0xef,0xd9,0xd9,0xd9,0xd9,0xda,0xda,0xda,0xda,0x15,0x80,0x4e,0x5c,0x5f,0x61,0x63, 0x66,0x67,0x4f,0x31,0x16,0x9d,0x9d,0xdc,0xdc,0x15,0x82,0x51,0x5e,0x61,0x63,0x65, 0x68,0x69,0x52,0x33,0x16,0x9f,0x9f,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x36,0xb6, 0xf6,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0x15,0x87,0x55,0x62,0x65,0x68,0x6a, 0x6d,0x6e,0x56,0x37,0x17,0xa4,0xa4,0xe3,0xe3,0x16,0x89,0x57,0x65,0x68,0x6a,0x6c, 0x6f,0x70,0x58,0x3a,0x1a,0xa6,0xa6,0xe5,0xe5,0x18,0x8c,0x5a,0x67,0x6a,0x6c,0x6e, 0x71,0x73,0x5b,0x3c,0x1c,0xa8,0xa8,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x3f,0xc0, 0xff,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0x1d,0x90,0x5e,0x6b,0x6e,0x70,0x73, 0x76,0x77,0x5f,0x40,0x20,0xac,0xad,0xec,0xec,0x1f,0x92,0x60,0x6d,0x71,0x73,0x75, 0x78,0x79,0x61,0x42,0x23,0xaf,0xaf,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x46,0xc6, 0xff,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x24,0x97,0x65,0x72,0x75,0x77,0x79, 0x7d,0x7e,0x66,0x47,0x27,0xb3,0xb3,0xee,0xee,0x26,0x99,0x67,0x74,0x77,0x7a,0x7c, 0x7f,0x80,0x68,0x49,0x29,0xb6,0xb6,0xee,0xee,0x28,0x9b,0x69,0x76,0x7a,0x7c,0x7e, 0x81,0x82,0x6a,0x4b,0x2c,0xb8,0xb8,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x4f,0xcf, 0xff,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x2d,0xa0,0x6e,0x7b,0x7e,0x80,0x82, 0x86,0x87,0x6f,0x50,0x30,0xbc,0xbc,0xee,0xee,0x2f,0xa2,0x70,0x7d,0x80,0x83,0x85, 0x88,0x89,0x71,0x52,0x32,0xbf,0xbf,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x56,0xcf, 0xff,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x33,0xa6,0x74,0x82,0x85,0x87,0x89, 0x8c,0x8d,0x75,0x57,0x37,0xbf,0xbf,0xee,0xee,0x35,0xa9,0x77,0x84,0x87,0x89,0x8b, 0x8e,0x90,0x78,0x59,0x39,0xbf,0xbf,0xee,0xee,0x38,0xaa,0x79,0x86,0x89,0x8b,0x8e, 0x91,0x92,0x7a,0x5b,0x3b,0xbf,0xbf,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x5f,0xcf, 0xff,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x3a,0xaa,0x7a,0x87,0x8a,0x8c,0x8e, 0x91,0x91,0x79,0x5a,0x3a,0xbf,0xbf,0xee,0xee,0x37,0xaa,0x78,0x85,0x88,0x8a,0x8b, 0x8e,0x8f,0x77,0x58,0x38,0xbf,0xbf,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x58,0xcf, 0xff,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x33,0xa6,0x73,0x80,0x83,0x85,0x87, 0x8a,0x8b,0x72,0x53,0x33,0xbf,0xbf,0xee,0xee,0x31,0xa4,0x71,0x7e,0x81,0x83,0x85, 0x88,0x89,0x70,0x51,0x31,0xbd,0xbd,0xee,0xee,0x2e,0xa1,0x6f,0x7c,0x7f,0x81,0x83, 0x85,0x86,0x6e,0x4f,0x2f,0xbb,0xbb,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x4f,0xcf, 0xff,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x2a,0x9d,0x6b,0x77,0x7a,0x7c,0x7e, 0x81,0x82,0x6a,0x4a,0x2a,0xb6,0xb6,0xee,0xee,0x28,0x9a,0x68,0x75,0x78,0x7a,0x7c, 0x7f,0x7f,0x67,0x48,0x28,0xb4,0xb4,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x49,0xc8, 0xff,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x23,0x96,0x64,0x71,0x73,0x75,0x77, 0x7a,0x7b,0x63,0x44,0x23,0xaf,0xaf,0xee,0xee,0x21,0x94,0x62,0x6e,0x71,0x73,0x75, 0x78,0x79,0x61,0x41,0x21,0xad,0xad,0xec,0xec,0x1f,0x91,0x5f,0x6c,0x6f,0x71,0x73, 0x76,0x76,0x5e,0x3f,0x1f,0xab,0xab,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x40,0xc0, 0xff,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0x1a,0x8d,0x5b,0x68,0x6b,0x6d,0x6e, 0x71,0x72,0x5a,0x3b,0x1b,0xa7,0xa6,0xe5,0xe5,0x18,0x8b,0x59,0x66,0x68,0x6a,0x6c, 0x6f,0x70,0x58,0x39,0x18,0xa4,0xa4,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0x39,0xb9, 0xf8,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x15,0x86,0x54,0x61,0x64,0x66,0x68, 0x6a,0x6b,0x53,0x34,0x16,0xa0,0xa0,0xde,0xde,0x15,0x84,0x52,0x5f,0x62,0x63,0x65, 0x68,0x69,0x51,0x32,0x16,0x9d,0x9d,0xdc,0xdc,0x15,0x82,0x50,0x5c,0x5f,0x61,0x63, 0x66,0x67,0x4f,0x2f,0x16,0x9b,0x9b,0xda,0xda,0xda,0xd9,0xd9,0xd9,0xd9,0x30,0xb0, 0xef,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd7,0x15,0x7d,0x4b,0x58,0x5b,0x5d,0x5e, 0x61,0x62,0x4a,0x2e,0x16,0x97,0x96,0xd5,0xd5,0x15,0x7b,0x49,0x56,0x59,0x5a,0x5c, 0x5f,0x60,0x48,0x2e,0x16,0x95,0x94,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd2,0x30,0xa9, 0xe8,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1,0xd1,0xd1,0x15,0x77,0x46,0x51,0x54,0x56,0x58, 0x5b,0x5c,0x46,0x2e,0x16,0x90,0x90,0xcf,0xcf,0x15,0x74,0x46,0x4f,0x52,0x54,0x56, 0x59,0x59,0x46,0x2e,0x16,0x8e,0x8e,0xcd,0xcc,0x15,0x72,0x46,0x4f,0x52,0x53,0x55, 0x57,0x58,0x46,0x2e,0x16,0x8c,0x8b,0xca,0xca,0xca,0xca,0xca,0xca,0xc9,0x30,0xa0, 0xdf,0xca,0xca,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0x17,0x84,0x4c,0x54,0x57,0x58,0x5a, 0x5d,0x5b,0x46,0x2a,0x15,0x90,0x90,0xcd,0xce,0x17,0x86,0x4c,0x54,0x58,0x5a,0x5d, 0x60,0x5d,0x46,0x2a,0x15,0x92,0x93,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd1,0x30,0xa7, 0xe6,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2,0xd2,0x17,0x8a,0x4e,0x59,0x5d,0x5f,0x61, 0x64,0x61,0x47,0x2a,0x15,0x97,0x97,0xd4,0xd4,0x17,0x8d,0x50,0x5b,0x5f,0x61,0x63, 0x66,0x63,0x49,0x2a,0x15,0x99,0x99,0xd6,0xd6,0x17,0x8f,0x52,0x5d,0x61,0x63,0x65, 0x69,0x66,0x4b,0x2a,0x15,0x9b,0x9b,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0x30,0xb0, 0xef,0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0x17,0x93,0x56,0x62,0x66,0x68,0x6a, 0x6d,0x6a,0x4f,0x2c,0x15,0xa0,0xa0,0xdd,0xdd,0x17,0x96,0x59,0x64,0x68,0x6a,0x6c, 0x6f,0x6c,0x52,0x2e,0x15,0xa2,0xa2,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0x36,0xb6, 0xf6,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0x17,0x9a,0x5d,0x68,0x6c,0x6f,0x71, 0x74,0x71,0x56,0x32,0x15,0xa7,0xa7,0xe4,0xe4,0x19,0x9c,0x5f,0x6b,0x6f,0x71,0x73, 0x76,0x73,0x58,0x35,0x18,0xa9,0xa9,0xe6,0xe6,0x1b,0x9f,0x62,0x6d,0x71,0x73,0x75, 0x78,0x76,0x5b,0x37,0x1a,0xab,0xab,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x3f,0xc0, 0xff,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0x20,0xa3,0x66,0x71,0x75,0x77,0x7a, 0x7d,0x7a,0x5f,0x3b,0x1e,0xaf,0xb0,0xed,0xed,0x22,0xa5,0x68,0x73,0x78,0x7a,0x7c, 0x7f,0x7c,0x61,0x3d,0x21,0xb2,0xb2,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x46,0xc6, 0xff,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x27,0xaa,0x6d,0x78,0x7c,0x7e,0x80, 0x84,0x81,0x66,0x42,0x25,0xb6,0xb6,0xef,0xef,0x29,0xac,0x6f,0x7a,0x7e,0x81,0x83, 0x86,0x83,0x68,0x44,0x27,0xb9,0xb9,0xef,0xef,0x2b,0xae,0x71,0x7d,0x81,0x83,0x85, 0x88,0x85,0x6a,0x46,0x2a,0xbb,0xbb,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x4f,0xcf, 0xff,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x30,0xb3,0x76,0x81,0x85,0x87,0x89, 0x8d,0x8a,0x6f,0x4b,0x2e,0xbf,0xbf,0xef,0xef,0x32,0xb5,0x78,0x83,0x87,0x8a,0x8c, 0x8f,0x8c,0x71,0x4d,0x30,0xc1,0xc1,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x56,0xcf, 0xff,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x36,0xb8,0x7c,0x88,0x8c,0x8e,0x90, 0x93,0x90,0x75,0x52,0x35,0xc1,0xc1,0xef,0xef,0x38,0xb8,0x7f,0x8a,0x8e,0x90,0x92, 0x95,0x93,0x78,0x54,0x37,0xc1,0xc1,0xef,0xef,0x3b,0xb8,0x81,0x8c,0x90,0x92,0x95, 0x98,0x95,0x7a,0x56,0x39,0xc1,0xc1,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x5f,0xcf, 0xff,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x3c,0xb8,0x82,0x8d,0x91,0x93,0x95, 0x98,0x94,0x79,0x55,0x38,0xc1,0xc1,0xef,0xef,0x3a,0xb8,0x80,0x8b,0x8f,0x91,0x92, 0x95,0x92,0x77,0x53,0x36,0xc1,0xc1,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x58,0xcf, 0xff,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x36,0xb8,0x7b,0x86,0x8a,0x8c,0x8e, 0x91,0x8e,0x72,0x4e,0x31,0xc1,0xc1,0xef,0xef,0x34,0xb7,0x79,0x84,0x88,0x8a,0x8c, 0x8f,0x8c,0x70,0x4c,0x2f,0xc0,0xc0,0xef,0xef,0x31,0xb4,0x77,0x82,0x86,0x88,0x8a, 0x8c,0x89,0x6e,0x4a,0x2d,0xbe,0xbe,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x4f,0xcf, 0xff,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x2d,0xb0,0x73,0x7d,0x81,0x83,0x85, 0x88,0x85,0x6a,0x45,0x28,0xb9,0xb9,0xef,0xef,0x2b,0xad,0x70,0x7b,0x7f,0x81,0x83, 0x86,0x82,0x67,0x43,0x26,0xb7,0xb7,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x49,0xc8, 0xff,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x26,0xa9,0x6c,0x77,0x7a,0x7c,0x7e, 0x81,0x7e,0x63,0x3f,0x21,0xb2,0xb2,0xef,0xef,0x24,0xa7,0x69,0x74,0x78,0x7a,0x7c, 0x7f,0x7c,0x61,0x3c,0x1f,0xb0,0xb0,0xed,0xed,0x22,0xa4,0x67,0x72,0x76,0x78,0x7a, 0x7d,0x79,0x5e,0x3a,0x1d,0xae,0xae,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0x40,0xc0, 0xfe,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0x1d,0xa0,0x63,0x6e,0x72,0x74,0x75, 0x78,0x75,0x5a,0x36,0x19,0xaa,0xa9,0xe6,0xe6,0x1b,0x9e,0x61,0x6c,0x6f,0x71,0x73, 0x76,0x73,0x58,0x34,0x16,0xa7,0xa7,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0x39,0xb9, 0xf8,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0x17,0x99,0x5c,0x67,0x6b,0x6d,0x6f, 0x71,0x6e,0x53,0x2f,0x15,0xa3,0xa3,0xdf,0xdf,0x17,0x97,0x5a,0x65,0x69,0x6a,0x6c, 0x6f,0x6c,0x51,0x2d,0x15,0xa0,0xa0,0xdd,0xdd,0x17,0x95,0x58,0x62,0x66,0x68,0x6a, 0x6d,0x6a,0x4f,0x2a,0x15,0x9e,0x9e,0xdb,0xdb,0xdb,0xda,0xda,0xda,0xda,0x30,0xb0, 0xef,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd8,0x17,0x90,0x53,0x5e,0x62,0x64,0x65, 0x68,0x65,0x4a,0x2a,0x15,0x9a,0x99,0xd6,0xd6,0x17,0x8e,0x51,0x5c,0x5f,0x61,0x63, 0x66,0x63,0x48,0x2a,0x15,0x98,0x97,0xd4,0xd4,0xd4,0xd4,0xd4,0xd4,0xd3,0x30,0xa9, 0xe8,0xd3,0xd3,0xd3,0xd2,0xd2,0xd2,0xd2,0xd2,0x17,0x8a,0x4c,0x57,0x5b,0x5d,0x5f, 0x62,0x5f,0x46,0x2a,0x15,0x93,0x93,0xd0,0xd0,0x17,0x87,0x4c,0x55,0x59,0x5b,0x5d, 0x60,0x5c,0x46,0x2a,0x15,0x91,0x91,0xce,0xcd,0x17,0x85,0x4c,0x54,0x57,0x59,0x5a, 0x5d,0x5a,0x46,0x2a,0x15,0x8f,0x8e,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xca,0x30,0xa0, 0xdf,0xcc,0xcb,0xcc,0xcc,0xcd,0xcc,0xcc,0xcd,0x19,0x98,0x50,0x59,0x5d,0x5b,0x59, 0x58,0x55,0x41,0x27,0x12,0x93,0x93,0xce,0xcf,0x19,0x9a,0x50,0x5b,0x5f,0x5d,0x5c, 0x5a,0x56,0x41,0x27,0x12,0x95,0x96,0xd1,0xd1,0xd1,0xd1,0xd1,0xd2,0xd2,0x30,0xa7, 0xe6,0xd3,0xd2,0xd2,0xd3,0xd3,0xd3,0xd3,0xd3,0x19,0x9e,0x54,0x60,0x64,0x62,0x60, 0x5e,0x5a,0x41,0x27,0x12,0x9a,0x9a,0xd5,0xd5,0x19,0xa1,0x56,0x62,0x66,0x64,0x62, 0x60,0x5c,0x43,0x27,0x12,0x9c,0x9c,0xd7,0xd7,0x19,0xa3,0x58,0x64,0x68,0x66,0x64, 0x63,0x5f,0x45,0x27,0x12,0x9e,0x9e,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0x30,0xb0, 0xef,0xdc,0xdb,0xdb,0xdb,0xdd,0xdc,0xdc,0xdd,0x19,0xa7,0x5c,0x69,0x6d,0x6b,0x69, 0x67,0x63,0x49,0x28,0x12,0xa3,0xa3,0xde,0xde,0x19,0xaa,0x5f,0x6b,0x6f,0x6d,0x6b, 0x69,0x66,0x4c,0x2a,0x12,0xa5,0xa5,0xe0,0xe0,0xe1,0xe1,0xe1,0xe2,0xe1,0x36,0xb6, 0xf6,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0x1a,0xae,0x63,0x6f,0x73,0x72,0x70, 0x6e,0x6a,0x50,0x2e,0x12,0xaa,0xaa,0xe5,0xe5,0x1c,0xb0,0x65,0x72,0x76,0x74,0x72, 0x70,0x6c,0x52,0x31,0x15,0xac,0xac,0xe7,0xe7,0x1e,0xb3,0x68,0x74,0x78,0x76,0x74, 0x72,0x6f,0x55,0x33,0x17,0xae,0xae,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0x3f,0xc0, 0xff,0xec,0xeb,0xeb,0xeb,0xec,0xeb,0xeb,0xed,0x23,0xb7,0x6c,0x78,0x7c,0x7a,0x79, 0x77,0x73,0x59,0x37,0x1b,0xb2,0xb3,0xee,0xee,0x25,0xb9,0x6e,0x7a,0x7f,0x7d,0x7b, 0x79,0x75,0x5b,0x39,0x1e,0xb5,0xb5,0xef,0xef,0xef,0xef,0xef,0xf0,0xef,0x46,0xc6, 0xff,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x2a,0xbe,0x73,0x7f,0x83,0x81,0x7f, 0x7e,0x7a,0x60,0x3e,0x22,0xb9,0xb9,0xef,0xef,0x2c,0xc0,0x75,0x81,0x85,0x84,0x82, 0x80,0x7c,0x62,0x40,0x24,0xbc,0xbc,0xef,0xef,0x2e,0xc2,0x77,0x84,0x88,0x86,0x84, 0x82,0x7e,0x64,0x43,0x27,0xbe,0xbe,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x4f,0xcf, 0xff,0xf0,0xef,0xef,0xef,0xf0,0xef,0xef,0xf0,0x33,0xc7,0x7c,0x88,0x8c,0x8a,0x88, 0x87,0x83,0x69,0x47,0x2b,0xc2,0xc2,0xef,0xef,0x35,0xc8,0x7e,0x8a,0x8e,0x8d,0x8b, 0x89,0x85,0x6b,0x49,0x2d,0xc3,0xc3,0xef,0xef,0xef,0xef,0xef,0xf0,0xef,0x56,0xcf, 0xff,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x39,0xc8,0x82,0x8f,0x93,0x91,0x8f, 0x8d,0x89,0x6f,0x4e,0x32,0xc3,0xc3,0xef,0xef,0x3b,0xc8,0x85,0x91,0x95,0x93,0x91, 0x8f,0x8c,0x72,0x50,0x34,0xc3,0xc3,0xef,0xef,0x3e,0xc8,0x87,0x93,0x97,0x95,0x94, 0x92,0x8e,0x74,0x52,0x36,0xc3,0xc3,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x5f,0xcf, 0xff,0xf0,0xef,0xef,0xef,0xf0,0xef,0xef,0xf0,0x3f,0xc8,0x88,0x94,0x98,0x96,0x94, 0x91,0x8d,0x73,0x51,0x35,0xc3,0xc3,0xef,0xef,0x3d,0xc8,0x86,0x92,0x96,0x94,0x91, 0x8f,0x8b,0x71,0x4f,0x33,0xc3,0xc3,0xef,0xef,0xef,0xef,0xef,0xf0,0xef,0x58,0xcf, 0xff,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x39,0xc8,0x81,0x8d,0x91,0x8f,0x8d, 0x8b,0x87,0x6c,0x4a,0x2e,0xc3,0xc3,0xef,0xef,0x37,0xc8,0x7f,0x8b,0x8f,0x8d,0x8b, 0x89,0x85,0x6a,0x48,0x2c,0xc3,0xc3,0xef,0xef,0x34,0xc8,0x7d,0x89,0x8d,0x8b,0x89, 0x86,0x82,0x68,0x46,0x2a,0xc1,0xc1,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x4f,0xcf, 0xff,0xf0,0xef,0xef,0xef,0xf0,0xef,0xef,0xf0,0x30,0xc4,0x79,0x84,0x88,0x86,0x84, 0x82,0x7e,0x64,0x41,0x25,0xbc,0xbc,0xef,0xef,0x2e,0xc1,0x76,0x82,0x86,0x84,0x82, 0x80,0x7b,0x61,0x3f,0x23,0xba,0xba,0xef,0xef,0xef,0xef,0xef,0xf0,0xef,0x49,0xc8, 0xff,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x29,0xbd,0x72,0x7e,0x81,0x7f,0x7d, 0x7b,0x77,0x5d,0x3b,0x1e,0xb5,0xb5,0xef,0xef,0x27,0xbb,0x6f,0x7b,0x7f,0x7d,0x7b, 0x79,0x75,0x5a,0x38,0x1c,0xb3,0xb3,0xee,0xee,0x25,0xb8,0x6d,0x79,0x7d,0x7b,0x79, 0x77,0x72,0x58,0x36,0x1a,0xb1,0xb1,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x40,0xc0, 0xfe,0xeb,0xea,0xea,0xea,0xeb,0xea,0xe9,0xea,0x20,0xb4,0x69,0x75,0x79,0x77,0x74, 0x72,0x6e,0x54,0x32,0x16,0xad,0xac,0xe7,0xe7,0x1e,0xb2,0x67,0x73,0x76,0x74,0x72, 0x70,0x6c,0x52,0x30,0x13,0xaa,0xaa,0xe5,0xe5,0xe5,0xe5,0xe4,0xe5,0xe4,0x39,0xb9, 0xf8,0xe5,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x19,0xad,0x62,0x6e,0x72,0x70,0x6e, 0x6b,0x67,0x4d,0x2b,0x12,0xa6,0xa6,0xe0,0xe0,0x19,0xab,0x60,0x6c,0x70,0x6d,0x6b, 0x69,0x65,0x4b,0x29,0x12,0xa3,0xa3,0xde,0xde,0x19,0xa9,0x5e,0x69,0x6d,0x6b,0x69, 0x67,0x63,0x49,0x27,0x12,0xa1,0xa1,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0xdb,0x30,0xb0, 0xef,0xdb,0xda,0xda,0xda,0xdb,0xda,0xda,0xda,0x19,0xa4,0x59,0x65,0x69,0x67,0x64, 0x62,0x5e,0x44,0x27,0x12,0x9d,0x9c,0xd7,0xd7,0x19,0xa2,0x57,0x63,0x66,0x64,0x62, 0x60,0x5c,0x42,0x27,0x12,0x9b,0x9a,0xd5,0xd5,0xd5,0xd5,0xd5,0xd6,0xd4,0x30,0xa9, 0xe8,0xd5,0xd4,0xd4,0xd3,0xd3,0xd3,0xd3,0xd3,0x19,0x9e,0x52,0x5e,0x62,0x60,0x5e, 0x5c,0x58,0x41,0x27,0x12,0x96,0x96,0xd1,0xd1,0x19,0x9b,0x50,0x5c,0x60,0x5e,0x5c, 0x5a,0x55,0x41,0x27,0x12,0x94,0x94,0xcf,0xce,0x19,0x99,0x50,0x5a,0x5e,0x5c,0x59, 0x58,0x55,0x41,0x27,0x12,0x92,0x91,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcb,0x30,0xa0, 0xdf,0xcc,0xcc,0xcd,0xce,0xcd,0xcd,0xcd,0xcd,0x1b,0xab,0x52,0x58,0x58,0x55,0x55, 0x52,0x50,0x3c,0x24,0x10,0x97,0x97,0xcf,0xd0,0x1b,0xad,0x52,0x5a,0x59,0x56,0x56, 0x53,0x50,0x3c,0x24,0x10,0x99,0x9a,0xd2,0xd2,0xd2,0xd3,0xd3,0xd2,0xd3,0x30,0xa7, 0xe6,0xd3,0xd3,0xd3,0xd5,0xd4,0xd4,0xd4,0xd5,0x1b,0xb1,0x57,0x5f,0x5e,0x5b,0x5a, 0x57,0x54,0x3c,0x24,0x10,0x9e,0x9e,0xd6,0xd6,0x1b,0xb4,0x59,0x61,0x60,0x5d,0x5c, 0x59,0x56,0x3c,0x24,0x10,0xa0,0xa0,0xd9,0xd9,0x1b,0xb6,0x5b,0x63,0x62,0x5f,0x5e, 0x5c,0x59,0x3e,0x24,0x10,0xa2,0xa2,0xdb,0xdc,0xdb,0xdb,0xdb,0xdb,0xdb,0x30,0xb0, 0xef,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0x1b,0xba,0x5f,0x68,0x67,0x64,0x63, 0x60,0x5d,0x42,0x24,0x10,0xa7,0xa7,0xdf,0xdf,0x1b,0xbd,0x62,0x6a,0x69,0x66,0x65, 0x62,0x60,0x45,0x26,0x10,0xa9,0xa9,0xe1,0xe2,0xe2,0xe3,0xe3,0xe2,0xe2,0x36,0xb6, 0xf6,0xe3,0xe3,0xe3,0xe4,0xe3,0xe3,0xe4,0xe5,0x1d,0xc1,0x66,0x6e,0x6d,0x6b,0x6a, 0x67,0x64,0x49,0x2a,0x10,0xae,0xae,0xe6,0xe6,0x1f,0xc3,0x68,0x71,0x70,0x6d,0x6c, 0x69,0x66,0x4b,0x2d,0x12,0xb0,0xb0,0xe9,0xe9,0x21,0xc6,0x6b,0x73,0x72,0x6f,0x6e, 0x6b,0x69,0x4e,0x2f,0x14,0xb2,0xb2,0xea,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0x3f,0xc0, 0xff,0xec,0xec,0xec,0xed,0xec,0xec,0xec,0xed,0x26,0xca,0x6f,0x77,0x76,0x73,0x73, 0x70,0x6d,0x52,0x33,0x18,0xb6,0xb7,0xef,0xef,0x28,0xcc,0x71,0x79,0x79,0x76,0x75, 0x72,0x6f,0x54,0x35,0x1b,0xb9,0xb9,0xf0,0xf0,0xf0,0xf1,0xf1,0xf0,0xf0,0x46,0xc6, 0xff,0xf0,0xf0,0xf0,0xf1,0xf0,0xf0,0xf0,0xf1,0x2d,0xd1,0x76,0x7e,0x7d,0x7a,0x79, 0x77,0x74,0x59,0x3a,0x1f,0xbd,0xbd,0xf0,0xf0,0x2f,0xd3,0x78,0x80,0x7f,0x7d,0x7c, 0x79,0x76,0x5b,0x3c,0x21,0xc0,0xc0,0xf1,0xf1,0x31,0xd5,0x7a,0x83,0x82,0x7f,0x7e, 0x7b,0x78,0x5d,0x3f,0x24,0xc2,0xc2,0xf0,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0x4f,0xcf, 0xff,0xf0,0xf0,0xf0,0xf1,0xf0,0xf0,0xf0,0xf0,0x36,0xd6,0x7f,0x87,0x86,0x83,0x82, 0x80,0x7d,0x62,0x43,0x28,0xc6,0xc6,0xf0,0xf0,0x38,0xd6,0x81,0x89,0x88,0x86,0x85, 0x82,0x7f,0x64,0x45,0x2a,0xc6,0xc6,0xf0,0xf0,0xf0,0xf1,0xf1,0xf0,0xf0,0x56,0xcf, 0xff,0xf0,0xf0,0xf0,0xf1,0xf0,0xf0,0xf0,0xf1,0x3c,0xd6,0x85,0x8e,0x8d,0x8a,0x89, 0x86,0x83,0x68,0x4a,0x2f,0xc6,0xc6,0xf0,0xf0,0x3e,0xd6,0x88,0x90,0x8f,0x8c,0x8b, 0x88,0x86,0x6b,0x4c,0x31,0xc6,0xc6,0xf1,0xf1,0x41,0xd6,0x8a,0x92,0x91,0x8e,0x8e, 0x8b,0x88,0x6d,0x4e,0x33,0xc6,0xc6,0xf0,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0x5f,0xcf, 0xff,0xf0,0xf0,0xf0,0xf1,0xf0,0xf0,0xf0,0xf0,0x42,0xd6,0x8b,0x93,0x92,0x8f,0x8e, 0x8a,0x87,0x6c,0x4d,0x32,0xc6,0xc6,0xf0,0xf0,0x40,0xd6,0x89,0x91,0x90,0x8d,0x8b, 0x88,0x85,0x6a,0x4b,0x30,0xc6,0xc6,0xf0,0xf0,0xf0,0xf1,0xf1,0xf0,0xf0,0x58,0xcf, 0xff,0xf0,0xf0,0xf0,0xf1,0xf0,0xf0,0xf0,0xf1,0x3c,0xd6,0x84,0x8c,0x8b,0x88,0x87, 0x84,0x81,0x65,0x46,0x2b,0xc6,0xc6,0xf0,0xf0,0x3a,0xd6,0x82,0x8a,0x89,0x86,0x85, 0x82,0x7f,0x63,0x44,0x29,0xc6,0xc6,0xf1,0xf1,0x37,0xd6,0x80,0x88,0x87,0x84,0x83, 0x7f,0x7c,0x61,0x42,0x27,0xc5,0xc5,0xf0,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0x4f,0xcf, 0xff,0xf0,0xf0,0xf0,0xf1,0xf0,0xf0,0xf0,0xf0,0x33,0xd6,0x7c,0x83,0x82,0x7f,0x7e, 0x7b,0x78,0x5d,0x3d,0x22,0xc0,0xc0,0xf0,0xf0,0x31,0xd4,0x79,0x81,0x80,0x7d,0x7c, 0x79,0x75,0x5a,0x3b,0x20,0xbe,0xbe,0xf0,0xf0,0xf0,0xf1,0xf1,0xf0,0xf0,0x49,0xc8, 0xff,0xf0,0xf0,0xf0,0xf1,0xf0,0xf0,0xf0,0xf1,0x2c,0xd0,0x75,0x7d,0x7b,0x78,0x77, 0x74,0x71,0x56,0x37,0x1b,0xb9,0xb9,0xf0,0xf0,0x2a,0xce,0x72,0x7a,0x79,0x76,0x75, 0x72,0x6f,0x53,0x34,0x19,0xb7,0xb7,0xf0,0xf0,0x27,0xcb,0x70,0x78,0x77,0x74,0x73, 0x70,0x6c,0x51,0x32,0x17,0xb5,0xb5,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0x40,0xc0, 0xfe,0xeb,0xeb,0xeb,0xec,0xeb,0xeb,0xea,0xea,0x23,0xc7,0x6c,0x74,0x73,0x6f,0x6e, 0x6b,0x68,0x4d,0x2e,0x13,0xb1,0xb0,0xe8,0xe8,0x21,0xc5,0x6a,0x72,0x70,0x6d,0x6c, 0x69,0x66,0x4b,0x2c,0x10,0xae,0xae,0xe6,0xe6,0xe6,0xe7,0xe6,0xe5,0xe5,0x39,0xb9, 0xf8,0xe5,0xe4,0xe4,0xe5,0xe4,0xe4,0xe4,0xe5,0x1c,0xc0,0x65,0x6d,0x6c,0x69,0x68, 0x64,0x61,0x46,0x27,0x10,0xaa,0xaa,0xe1,0xe1,0x1b,0xbe,0x63,0x6b,0x6a,0x66,0x65, 0x62,0x5f,0x44,0x25,0x10,0xa7,0xa7,0xe0,0xe0,0x1b,0xbc,0x61,0x68,0x67,0x64,0x63, 0x60,0x5d,0x42,0x24,0x10,0xa5,0xa5,0xdd,0xde,0xdd,0xdc,0xdc,0xdc,0xdc,0x30,0xb0, 0xef,0xdb,0xdb,0xdb,0xdc,0xdb,0xdb,0xdb,0xda,0x1b,0xb7,0x5c,0x64,0x63,0x60,0x5e, 0x5b,0x58,0x3d,0x24,0x10,0xa1,0xa0,0xd8,0xd8,0x1b,0xb5,0x5a,0x62,0x60,0x5d,0x5c, 0x59,0x56,0x3c,0x24,0x10,0x9f,0x9e,0xd6,0xd6,0xd6,0xd7,0xd7,0xd6,0xd5,0x30,0xa9, 0xe8,0xd5,0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd5,0x1b,0xb1,0x55,0x5d,0x5c,0x59,0x58, 0x55,0x52,0x3c,0x24,0x10,0x9a,0x9a,0xd2,0xd2,0x1b,0xae,0x53,0x5b,0x5a,0x57,0x56, 0x52,0x50,0x3c,0x24,0x10,0x98,0x98,0xd1,0xd0,0x1b,0xac,0x52,0x59,0x58,0x55,0x55, 0x52,0x50,0x3c,0x24,0x10,0x96,0x95,0xcd,0xce,0xcd,0xcd,0xcd,0xcd,0xcc,0x30,0xa0, 0xdf,0xcd,0xce,0xce,0xce,0xcf,0xce,0xce,0xce,0x1b,0xaa,0x4d,0x54,0x52,0x51,0x4f, 0x4e,0x4b,0x39,0x22,0x0f,0x9a,0x9a,0xd1,0xd2,0x1b,0xac,0x4d,0x54,0x52,0x51,0x4f, 0x4e,0x4b,0x39,0x22,0x0f,0x9c,0x9d,0xd3,0xd3,0xd4,0xd3,0xd3,0xd4,0xd4,0x30,0xa7, 0xe6,0xd4,0xd4,0xd4,0xd5,0xd5,0xd6,0xd5,0xd6,0x1b,0xb0,0x50,0x59,0x57,0x55,0x52, 0x51,0x4d,0x39,0x22,0x0f,0xa1,0xa1,0xd7,0xd7,0x1b,0xb3,0x52,0x5b,0x59,0x57,0x54, 0x53,0x4f,0x39,0x22,0x0f,0xa3,0xa3,0xd9,0xda,0x1b,0xb5,0x54,0x5d,0x5b,0x59,0x56, 0x56,0x52,0x3a,0x22,0x0f,0xa5,0xa5,0xdc,0xdd,0xdc,0xdc,0xdc,0xdd,0xdc,0x30,0xb0, 0xef,0xdd,0xde,0xdd,0xdd,0xdf,0xde,0xde,0xde,0x1b,0xb9,0x58,0x62,0x60,0x5e,0x5b, 0x5a,0x56,0x3e,0x22,0x0f,0xaa,0xaa,0xe1,0xe1,0x1b,0xbc,0x5b,0x64,0x62,0x60,0x5d, 0x5c,0x59,0x41,0x23,0x0f,0xac,0xac,0xe2,0xe3,0xe4,0xe3,0xe3,0xe4,0xe3,0x36,0xb7, 0xf6,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe6,0x1d,0xc0,0x5f,0x68,0x66,0x65,0x62, 0x61,0x5d,0x45,0x27,0x0f,0xb1,0xb1,0xe7,0xe7,0x1f,0xc2,0x61,0x6b,0x69,0x67,0x64, 0x63,0x5f,0x47,0x2a,0x10,0xb3,0xb3,0xe9,0xea,0x21,0xc5,0x64,0x6d,0x6b,0x69,0x66, 0x65,0x62,0x4a,0x2c,0x12,0xb5,0xb5,0xeb,0xed,0xec,0xec,0xec,0xed,0xec,0x3f,0xc0, 0xff,0xed,0xee,0xed,0xed,0xee,0xed,0xed,0xee,0x26,0xc9,0x68,0x71,0x6f,0x6d,0x6b, 0x6a,0x66,0x4e,0x30,0x16,0xb9,0xba,0xf1,0xf1,0x28,0xcb,0x6a,0x73,0x72,0x70,0x6d, 0x6c,0x68,0x50,0x32,0x19,0xbc,0xbc,0xf1,0xf1,0xf2,0xf1,0xf1,0xf2,0xf1,0x46,0xc6, 0xff,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf1,0xf2,0x2d,0xd0,0x6f,0x78,0x76,0x74,0x71, 0x71,0x6d,0x55,0x37,0x1d,0xc0,0xc0,0xf1,0xf1,0x2f,0xd2,0x71,0x7a,0x78,0x77,0x74, 0x73,0x6f,0x57,0x39,0x1f,0xc3,0xc3,0xf1,0xf2,0x31,0xd4,0x73,0x7d,0x7b,0x79,0x76, 0x75,0x71,0x59,0x3c,0x22,0xc5,0xc5,0xf1,0xf2,0xf1,0xf1,0xf1,0xf2,0xf1,0x4f,0xcf, 0xff,0xf1,0xf2,0xf1,0xf1,0xf2,0xf1,0xf1,0xf1,0x36,0xd5,0x78,0x81,0x7f,0x7d,0x7a, 0x7a,0x76,0x5e,0x40,0x26,0xc8,0xc8,0xf2,0xf2,0x38,0xd5,0x7a,0x83,0x81,0x80,0x7d, 0x7c,0x78,0x60,0x42,0x28,0xc8,0xc8,0xf1,0xf1,0xf2,0xf1,0xf1,0xf2,0xf1,0x56,0xcf, 0xff,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf1,0xf2,0x3c,0xd5,0x7e,0x88,0x86,0x84,0x81, 0x80,0x7c,0x64,0x47,0x2d,0xc8,0xc8,0xf1,0xf1,0x3e,0xd5,0x81,0x8a,0x88,0x86,0x83, 0x82,0x7f,0x67,0x49,0x2f,0xc8,0xc8,0xf1,0xf2,0x41,0xd5,0x83,0x8c,0x8a,0x88,0x86, 0x85,0x81,0x69,0x4b,0x31,0xc8,0xc8,0xf1,0xf2,0xf1,0xf1,0xf1,0xf2,0xf1,0x5f,0xcf, 0xff,0xf1,0xf2,0xf1,0xf1,0xf2,0xf1,0xf1,0xf1,0x42,0xd5,0x84,0x8d,0x8b,0x89,0x86, 0x84,0x80,0x68,0x4a,0x30,0xc8,0xc8,0xf2,0xf2,0x40,0xd5,0x82,0x8b,0x89,0x86,0x83, 0x82,0x7e,0x66,0x48,0x2e,0xc8,0xc8,0xf1,0xf1,0xf2,0xf1,0xf1,0xf2,0xf1,0x58,0xcf, 0xff,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf1,0xf2,0x3c,0xd5,0x7d,0x86,0x84,0x82,0x7f, 0x7e,0x7a,0x61,0x43,0x29,0xc8,0xc8,0xf1,0xf1,0x3a,0xd5,0x7b,0x84,0x82,0x80,0x7d, 0x7c,0x78,0x5f,0x41,0x27,0xc8,0xc8,0xf1,0xf2,0x37,0xd5,0x79,0x82,0x80,0x7e,0x7b, 0x79,0x75,0x5d,0x3f,0x25,0xc8,0xc8,0xf1,0xf2,0xf1,0xf1,0xf1,0xf2,0xf1,0x4f,0xcf, 0xff,0xf1,0xf2,0xf1,0xf1,0xf2,0xf1,0xf1,0xf1,0x33,0xd5,0x75,0x7d,0x7b,0x79,0x76, 0x75,0x71,0x59,0x3a,0x20,0xc3,0xc3,0xf2,0xf2,0x31,0xd3,0x72,0x7b,0x79,0x77,0x74, 0x73,0x6e,0x56,0x38,0x1e,0xc1,0xc1,0xf1,0xf1,0xf2,0xf1,0xf1,0xf2,0xf1,0x49,0xc8, 0xff,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf1,0xf2,0x2c,0xcf,0x6e,0x77,0x74,0x72,0x6f, 0x6e,0x6a,0x52,0x34,0x19,0xbc,0xbc,0xf1,0xf1,0x2a,0xcd,0x6b,0x74,0x72,0x70,0x6d, 0x6c,0x68,0x4f,0x31,0x17,0xba,0xba,0xf0,0xf1,0x27,0xca,0x69,0x72,0x70,0x6e,0x6b, 0x69,0x65,0x4d,0x2f,0x15,0xb8,0xb8,0xed,0xee,0xed,0xed,0xed,0xee,0xed,0x40,0xc0, 0xfe,0xec,0xed,0xec,0xec,0xed,0xec,0xeb,0xeb,0x23,0xc6,0x65,0x6e,0x6c,0x69,0x66, 0x65,0x61,0x49,0x2b,0x11,0xb3,0xb3,0xea,0xea,0x21,0xc4,0x63,0x6c,0x69,0x67,0x64, 0x63,0x5f,0x47,0x29,0x0f,0xb1,0xb1,0xe7,0xe7,0xe8,0xe7,0xe6,0xe7,0xe6,0x39,0xb9, 0xf8,0xe6,0xe5,0xe5,0xe5,0xe5,0xe6,0xe5,0xe6,0x1c,0xbf,0x5e,0x67,0x65,0x63,0x60, 0x5e,0x5a,0x42,0x24,0x0f,0xad,0xad,0xe2,0xe2,0x1b,0xbd,0x5c,0x65,0x63,0x60,0x5d, 0x5c,0x58,0x40,0x22,0x0f,0xaa,0xaa,0xe0,0xe1,0x1b,0xbb,0x5a,0x62,0x60,0x5e,0x5b, 0x5a,0x56,0x3e,0x22,0x0f,0xa8,0xa8,0xde,0xdf,0xde,0xdd,0xdd,0xde,0xdd,0x30,0xb0, 0xef,0xdc,0xdd,0xdc,0xdc,0xdd,0xdc,0xdc,0xdb,0x1b,0xb6,0x55,0x5e,0x5c,0x5a,0x56, 0x55,0x51,0x39,0x22,0x0f,0xa4,0xa3,0xda,0xda,0x1b,0xb4,0x53,0x5c,0x59,0x57,0x54, 0x53,0x4f,0x39,0x22,0x0f,0xa2,0xa1,0xd7,0xd7,0xd8,0xd7,0xd7,0xd8,0xd6,0x30,0xa9, 0xe8,0xd6,0xd6,0xd6,0xd5,0xd5,0xd6,0xd5,0xd6,0x1b,0xb0,0x4e,0x57,0x55,0x53,0x50, 0x4f,0x4b,0x39,0x22,0x0f,0x9d,0x9d,0xd3,0xd3,0x1b,0xad,0x4d,0x55,0x53,0x51,0x4f, 0x4e,0x4b,0x39,0x22,0x0f,0x9b,0x9b,0xd0,0xd1,0x1b,0xab,0x4d,0x54,0x52,0x51,0x4f, 0x4e,0x4b,0x39,0x22,0x0f,0x99,0x98,0xce,0xcf,0xce,0xce,0xce,0xcf,0xcd,0x30,0xa0, 0xdf,0xcf,0xce,0xd0,0xcf,0xcf,0xd0,0xcf,0xd0,0x18,0x96,0x49,0x4e,0x4e,0x4c,0x4a, 0x48,0x45,0x33,0x1e,0x0c,0x9e,0x9d,0xd2,0xd3,0x18,0x98,0x49,0x4e,0x4e,0x4c,0x4a, 0x48,0x45,0x33,0x1e,0x0c,0x9f,0xa0,0xd4,0xd5,0xd4,0xd5,0xd5,0xd4,0xd5,0x30,0xa7, 0xe6,0xd6,0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0x18,0x9c,0x4b,0x51,0x51,0x4e,0x4c, 0x49,0x45,0x33,0x1e,0x0c,0xa5,0xa4,0xd8,0xd9,0x18,0x9f,0x4d,0x53,0x53,0x50,0x4e, 0x4b,0x47,0x33,0x1e,0x0c,0xa7,0xa6,0xdb,0xda,0x18,0xa1,0x4f,0x55,0x55,0x52,0x50, 0x4e,0x4a,0x33,0x1e,0x0c,0xa8,0xa8,0xdd,0xdd,0xdd,0xde,0xde,0xdd,0xdd,0x30,0xb0, 0xef,0xdf,0xde,0xdf,0xde,0xdf,0xe0,0xdf,0xe0,0x18,0xa5,0x53,0x5a,0x5a,0x57,0x55, 0x52,0x4e,0x37,0x1e,0x0c,0xae,0xad,0xe2,0xe2,0x18,0xa8,0x56,0x5c,0x5c,0x59,0x57, 0x54,0x51,0x3a,0x1e,0x0c,0xaf,0xaf,0xe3,0xe5,0xe4,0xe5,0xe5,0xe4,0xe4,0x36,0xb7, 0xf6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe6,0xe7,0xe7,0x19,0xac,0x5a,0x60,0x60,0x5e,0x5c, 0x59,0x55,0x3e,0x21,0x0c,0xb5,0xb4,0xe8,0xe9,0x1b,0xae,0x5c,0x63,0x63,0x60,0x5e, 0x5b,0x57,0x40,0x24,0x0d,0xb7,0xb6,0xeb,0xea,0x1d,0xb1,0x5f,0x65,0x65,0x62,0x60, 0x5d,0x5a,0x43,0x26,0x0f,0xb8,0xb8,0xec,0xed,0xed,0xee,0xee,0xed,0xed,0x3f,0xc0, 0xff,0xef,0xee,0xef,0xee,0xee,0xef,0xee,0xf0,0x22,0xb5,0x63,0x69,0x69,0x66,0x65, 0x62,0x5e,0x47,0x2a,0x13,0xbd,0xbd,0xf2,0xf2,0x24,0xb7,0x65,0x6b,0x6c,0x69,0x67, 0x64,0x60,0x49,0x2c,0x16,0xbf,0xbf,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x46,0xc6, 0xff,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x29,0xbc,0x6a,0x70,0x70,0x6d,0x6b, 0x69,0x65,0x4e,0x31,0x1a,0xc4,0xc3,0xf2,0xf2,0x2b,0xbe,0x6c,0x72,0x72,0x70,0x6e, 0x6b,0x67,0x50,0x33,0x1c,0xc7,0xc6,0xf2,0xf2,0x2d,0xc0,0x6e,0x75,0x75,0x72,0x70, 0x6d,0x69,0x52,0x36,0x1f,0xc8,0xc8,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x4f,0xcf, 0xff,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x32,0xc5,0x73,0x79,0x79,0x76,0x74, 0x72,0x6e,0x57,0x3a,0x23,0xcb,0xcb,0xf2,0xf2,0x34,0xc6,0x75,0x7b,0x7b,0x79,0x77, 0x74,0x70,0x59,0x3c,0x25,0xcb,0xcb,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x56,0xcf, 0xff,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x38,0xc6,0x79,0x80,0x80,0x7d,0x7b, 0x78,0x74,0x5d,0x41,0x2a,0xcb,0xcb,0xf2,0xf2,0x3a,0xc6,0x7c,0x82,0x82,0x7f,0x7d, 0x7a,0x77,0x60,0x43,0x2c,0xcb,0xcb,0xf2,0xf2,0x3d,0xc6,0x7e,0x84,0x84,0x81,0x80, 0x7d,0x79,0x62,0x45,0x2e,0xcb,0xcb,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x5f,0xcf, 0xff,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x3e,0xc6,0x7f,0x85,0x85,0x82,0x80, 0x7c,0x78,0x61,0x44,0x2d,0xcb,0xcb,0xf2,0xf2,0x3c,0xc6,0x7d,0x83,0x83,0x7f,0x7d, 0x7a,0x76,0x5f,0x42,0x2b,0xcb,0xcb,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x58,0xcf, 0xff,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x38,0xc6,0x78,0x7e,0x7e,0x7b,0x79, 0x76,0x72,0x5a,0x3d,0x26,0xcb,0xcb,0xf2,0xf2,0x36,0xc6,0x76,0x7c,0x7c,0x79,0x77, 0x74,0x70,0x58,0x3b,0x24,0xcb,0xcb,0xf2,0xf2,0x33,0xc6,0x74,0x7a,0x7a,0x77,0x75, 0x71,0x6d,0x56,0x39,0x22,0xcb,0xcb,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x4f,0xcf, 0xff,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x2f,0xc2,0x70,0x75,0x75,0x72,0x70, 0x6d,0x69,0x52,0x34,0x1d,0xc7,0xc6,0xf2,0xf2,0x2d,0xbf,0x6d,0x73,0x73,0x70,0x6e, 0x6b,0x66,0x4f,0x32,0x1b,0xc4,0xc4,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x49,0xc8, 0xff,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x28,0xbb,0x69,0x6f,0x6e,0x6b,0x69, 0x66,0x62,0x4b,0x2e,0x16,0xc0,0xbf,0xf2,0xf2,0x26,0xb9,0x66,0x6c,0x6c,0x69,0x67, 0x64,0x60,0x48,0x2b,0x14,0xbe,0xbd,0xf2,0xf1,0x23,0xb6,0x64,0x6a,0x6a,0x67,0x65, 0x61,0x5d,0x46,0x29,0x12,0xbb,0xbb,0xee,0xee,0xee,0xef,0xef,0xee,0xee,0x40,0xc0, 0xfe,0xee,0xed,0xee,0xed,0xed,0xee,0xec,0xed,0x1f,0xb2,0x60,0x66,0x66,0x62,0x60, 0x5d,0x59,0x42,0x25,0x0e,0xb7,0xb6,0xeb,0xeb,0x1d,0xb0,0x5e,0x63,0x63,0x60,0x5e, 0x5b,0x57,0x40,0x23,0x0c,0xb4,0xb4,0xe8,0xe9,0xe8,0xe9,0xe8,0xe7,0xe7,0x39,0xb9, 0xf8,0xe8,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0x18,0xab,0x59,0x5f,0x5f,0x5c,0x5a, 0x56,0x52,0x3b,0x1e,0x0c,0xb1,0xb0,0xe3,0xe4,0x18,0xa9,0x57,0x5d,0x5d,0x59,0x57, 0x54,0x50,0x39,0x1e,0x0c,0xae,0xad,0xe2,0xe1,0x18,0xa7,0x55,0x5a,0x5a,0x57,0x55, 0x52,0x4e,0x37,0x1e,0x0c,0xab,0xab,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0x30,0xb0, 0xef,0xde,0xdd,0xde,0xdd,0xdd,0xde,0xdd,0xdd,0x18,0xa2,0x50,0x56,0x56,0x53,0x50, 0x4d,0x49,0x33,0x1e,0x0c,0xa8,0xa6,0xdb,0xdb,0x18,0xa0,0x4e,0x54,0x53,0x50,0x4e, 0x4b,0x47,0x33,0x1e,0x0c,0xa5,0xa4,0xd8,0xd9,0xd8,0xd9,0xd9,0xd8,0xd7,0x30,0xa9, 0xe8,0xd8,0xd7,0xd7,0xd6,0xd6,0xd6,0xd7,0xd7,0x18,0x9c,0x49,0x4f,0x4f,0x4c,0x4a, 0x48,0x45,0x33,0x1e,0x0c,0xa1,0xa0,0xd4,0xd5,0x18,0x99,0x49,0x4e,0x4e,0x4c,0x4a, 0x48,0x45,0x33,0x1e,0x0c,0x9f,0x9e,0xd2,0xd1,0x18,0x97,0x49,0x4e,0x4e,0x4c,0x4a, 0x48,0x45,0x33,0x1e,0x0c,0x9b,0x9b,0xcf,0xcf,0xcf,0xd0,0xd0,0xcf,0xce,0x30,0xa0, 0xdf,0xd0,0xd0,0xd1,0xd1,0xd1,0xd1,0xd1,0xd1,0x16,0x82,0x43,0x49,0x47,0x46,0x44, 0x42,0x3f,0x2f,0x1b,0x0b,0xa1,0xa0,0xd3,0xd3,0x16,0x84,0x43,0x49,0x47,0x46,0x44, 0x42,0x3f,0x2f,0x1b,0x0b,0xa3,0xa3,0xd6,0xd5,0xd6,0xd6,0xd5,0xd6,0xd6,0x30,0xa7, 0xe6,0xd6,0xd6,0xd6,0xd8,0xd7,0xd8,0xd7,0xd8,0x16,0x88,0x43,0x4a,0x48,0x46,0x44, 0x42,0x3f,0x2f,0x1b,0x0b,0xa7,0xa8,0xd9,0xda,0x16,0x8b,0x45,0x4c,0x4a,0x48,0x46, 0x43,0x3f,0x2f,0x1b,0x0b,0xa9,0xa9,0xdc,0xdc,0x16,0x8d,0x47,0x4e,0x4c,0x4a,0x48, 0x46,0x42,0x2f,0x1b,0x0b,0xab,0xac,0xde,0xde,0xdf,0xdf,0xdf,0xde,0xde,0x30,0xb0, 0xef,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0x16,0x91,0x4b,0x53,0x51,0x4f,0x4d, 0x4a,0x46,0x31,0x1b,0x0b,0xb1,0xb0,0xe3,0xe2,0x16,0x94,0x4e,0x55,0x53,0x51,0x4f, 0x4c,0x49,0x34,0x1b,0x0b,0xb3,0xb2,0xe5,0xe5,0xe6,0xe6,0xe5,0xe6,0xe5,0x36,0xb7, 0xf6,0xe6,0xe6,0xe6,0xe7,0xe6,0xe8,0xe7,0xe8,0x16,0x98,0x52,0x59,0x58,0x56,0x54, 0x51,0x4d,0x38,0x1d,0x0b,0xb7,0xb8,0xe9,0xea,0x18,0x9a,0x54,0x5c,0x5a,0x58,0x56, 0x53,0x4f,0x3a,0x20,0x0b,0xb9,0xb9,0xec,0xec,0x1a,0x9d,0x57,0x5e,0x5c,0x5a,0x58, 0x55,0x52,0x3d,0x22,0x0d,0xbb,0xbc,0xed,0xee,0xef,0xef,0xef,0xee,0xee,0x3f,0xc0, 0xff,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0x1f,0xa1,0x5b,0x62,0x60,0x5e,0x5d, 0x5a,0x56,0x41,0x26,0x11,0xc0,0xc0,0xf3,0xf2,0x21,0xa3,0x5d,0x64,0x63,0x61,0x5f, 0x5c,0x58,0x43,0x28,0x14,0xc3,0xc2,0xf3,0xf2,0xf3,0xf3,0xf2,0xf3,0xf2,0x46,0xc6, 0xff,0xf2,0xf2,0xf2,0xf3,0xf2,0xf3,0xf2,0xf3,0x26,0xa8,0x62,0x69,0x67,0x65,0x63, 0x61,0x5d,0x48,0x2d,0x18,0xc6,0xc7,0xf2,0xf3,0x28,0xaa,0x64,0x6b,0x69,0x68,0x66, 0x63,0x5f,0x4a,0x2f,0x1a,0xc9,0xc9,0xf3,0xf3,0x2a,0xac,0x66,0x6e,0x6c,0x6a,0x68, 0x65,0x61,0x4c,0x32,0x1d,0xcb,0xcc,0xf2,0xf2,0xf3,0xf3,0xf3,0xf2,0xf2,0x4f,0xcf, 0xff,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x2f,0xb1,0x6b,0x72,0x70,0x6e,0x6d, 0x6a,0x66,0x51,0x36,0x21,0xce,0xcd,0xf3,0xf2,0x31,0xb3,0x6d,0x74,0x72,0x71,0x6f, 0x6c,0x68,0x53,0x38,0x23,0xce,0xcd,0xf3,0xf2,0xf3,0xf3,0xf2,0xf3,0xf2,0x56,0xcf, 0xff,0xf2,0xf2,0xf2,0xf3,0xf2,0xf3,0xf2,0xf3,0x35,0xb7,0x71,0x79,0x77,0x75,0x73, 0x70,0x6c,0x57,0x3d,0x28,0xcd,0xce,0xf2,0xf3,0x37,0xb7,0x74,0x7b,0x79,0x77,0x75, 0x72,0x6f,0x5a,0x3f,0x2a,0xcd,0xcd,0xf3,0xf3,0x3a,0xb7,0x76,0x7d,0x7b,0x79,0x78, 0x75,0x71,0x5c,0x41,0x2c,0xcd,0xce,0xf2,0xf2,0xf3,0xf3,0xf3,0xf2,0xf2,0x5f,0xcf, 0xff,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x3b,0xb7,0x77,0x7e,0x7c,0x7a,0x78, 0x74,0x70,0x5b,0x40,0x2b,0xce,0xcd,0xf3,0xf2,0x39,0xb7,0x75,0x7c,0x7a,0x77,0x75, 0x72,0x6e,0x59,0x3e,0x29,0xce,0xcd,0xf3,0xf2,0xf3,0xf3,0xf2,0xf3,0xf2,0x58,0xcf, 0xff,0xf2,0xf2,0xf2,0xf3,0xf2,0xf3,0xf2,0xf3,0x35,0xb7,0x70,0x77,0x75,0x73,0x71, 0x6e,0x6a,0x54,0x39,0x24,0xcd,0xce,0xf2,0xf3,0x33,0xb4,0x6e,0x75,0x73,0x71,0x6f, 0x6c,0x67,0x52,0x37,0x22,0xcd,0xcd,0xf3,0xf3,0x30,0xb2,0x6c,0x73,0x71,0x6f,0x6d, 0x69,0x65,0x50,0x35,0x20,0xcd,0xce,0xf2,0xf2,0xf3,0xf3,0xf3,0xf2,0xf2,0x4f,0xcf, 0xff,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x2c,0xae,0x68,0x6e,0x6c,0x6a,0x68, 0x65,0x61,0x4c,0x30,0x1b,0xca,0xc9,0xf3,0xf2,0x2a,0xab,0x65,0x6c,0x6a,0x68,0x66, 0x63,0x5e,0x49,0x2e,0x19,0xc8,0xc7,0xf3,0xf2,0xf3,0xf3,0xf2,0xf3,0xf2,0x49,0xc8, 0xff,0xf2,0xf2,0xf2,0xf3,0xf2,0xf3,0xf2,0xf3,0x25,0xa7,0x61,0x68,0x65,0x63,0x61, 0x5e,0x5a,0x45,0x2a,0x14,0xc2,0xc3,0xf2,0xf3,0x23,0xa5,0x5e,0x65,0x63,0x61,0x5f, 0x5c,0x58,0x42,0x27,0x12,0xc0,0xc0,0xf3,0xf3,0x20,0xa2,0x5c,0x63,0x61,0x5f,0x5d, 0x59,0x55,0x40,0x25,0x10,0xbe,0xbf,0xef,0xef,0xf0,0xf0,0xf0,0xef,0xef,0x40,0xc0, 0xfe,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0x1c,0x9e,0x58,0x5f,0x5d,0x5a,0x58, 0x55,0x51,0x3c,0x21,0x0c,0xba,0xb9,0xec,0xeb,0x1a,0x9c,0x56,0x5c,0x5a,0x58,0x56, 0x53,0x4f,0x3a,0x1e,0x0b,0xb8,0xb7,0xea,0xe9,0xea,0xe9,0xe8,0xe9,0xe8,0x39,0xb9, 0xf8,0xe8,0xe7,0xe7,0xe8,0xe7,0xe8,0xe7,0xe8,0x16,0x97,0x51,0x58,0x56,0x54,0x52, 0x4e,0x4a,0x35,0x1b,0x0b,0xb3,0xb4,0xe4,0xe5,0x16,0x95,0x4f,0x56,0x54,0x51,0x4f, 0x4c,0x48,0x33,0x1b,0x0b,0xb0,0xb0,0xe3,0xe3,0x16,0x93,0x4d,0x53,0x51,0x4f,0x4d, 0x4a,0x46,0x31,0x1b,0x0b,0xae,0xaf,0xe0,0xe0,0xe1,0xe0,0xe0,0xdf,0xdf,0x30,0xb0, 0xef,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x16,0x8e,0x48,0x4f,0x4d,0x4b,0x48, 0x45,0x41,0x2f,0x1b,0x0b,0xab,0xa9,0xdc,0xdb,0x16,0x8c,0x46,0x4d,0x4a,0x48,0x46, 0x43,0x3f,0x2f,0x1b,0x0b,0xa9,0xa7,0xda,0xd9,0xda,0xda,0xd9,0xda,0xd8,0x30,0xa9, 0xe8,0xd8,0xd8,0xd8,0xd8,0xd7,0xd8,0xd7,0xd8,0x16,0x88,0x43,0x49,0x47,0x46,0x44, 0x42,0x3f,0x2f,0x1b,0x0b,0xa3,0xa4,0xd5,0xd6,0x16,0x85,0x43,0x49,0x47,0x46,0x44, 0x42,0x3f,0x2f,0x1b,0x0b,0xa1,0xa1,0xd3,0xd3,0x16,0x83,0x43,0x49,0x47,0x46,0x44, 0x42,0x3f,0x2f,0x1b,0x0b,0x9e,0x9f,0xd0,0xd0,0xd1,0xd1,0xd1,0xcf,0xcf,0x30,0xa0, 0xdf,0xd1,0xd2,0xd2,0xd1,0xd2,0xd2,0xd2,0xd1,0x29,0x6f,0x3a,0x40,0x3e,0x3c,0x3b, 0x3a,0x36,0x27,0x16,0x18,0xa3,0xa4,0xd4,0xd4,0x29,0x71,0x3a,0x40,0x3e,0x3c,0x3b, 0x3a,0x36,0x27,0x16,0x18,0xa6,0xa7,0xd7,0xd6,0xd7,0xd6,0xd6,0xd6,0xd7,0x30,0xa7, 0xe6,0xd8,0xd8,0xd7,0xd9,0xd8,0xd9,0xd9,0xd8,0x29,0x75,0x3a,0x40,0x3e,0x3c,0x3b, 0x3a,0x36,0x27,0x16,0x18,0xab,0xab,0xdb,0xda,0x29,0x78,0x3a,0x40,0x3e,0x3c,0x3b, 0x3a,0x36,0x27,0x16,0x18,0xad,0xac,0xdd,0xdd,0x29,0x7a,0x3b,0x42,0x40,0x3d,0x3c, 0x3c,0x37,0x27,0x16,0x18,0xaf,0xae,0xdf,0xe0,0xdf,0xe0,0xe0,0xdf,0xe0,0x30,0xb0, 0xef,0xe1,0xe1,0xe1,0xe0,0xe2,0xe2,0xe2,0xe1,0x29,0x7e,0x3f,0x47,0x45,0x42,0x41, 0x40,0x3b,0x27,0x16,0x18,0xb3,0xb4,0xe4,0xe3,0x2a,0x81,0x42,0x49,0x47,0x44,0x43, 0x42,0x3e,0x2a,0x16,0x18,0xb6,0xb6,0xe6,0xe6,0xe7,0xe6,0xe6,0xe6,0xe6,0x36,0xb7, 0xf6,0xe8,0xe8,0xe7,0xe8,0xe7,0xe9,0xe9,0xe8,0x2f,0x85,0x46,0x4d,0x4c,0x49,0x48, 0x47,0x42,0x2e,0x17,0x1a,0xbb,0xbb,0xeb,0xea,0x31,0x87,0x49,0x50,0x4e,0x4b,0x4a, 0x49,0x44,0x30,0x1a,0x1c,0xbd,0xbc,0xed,0xed,0x33,0x8a,0x4b,0x52,0x50,0x4d,0x4c, 0x4b,0x47,0x33,0x1c,0x1e,0xbf,0xbe,0xee,0xf0,0xef,0xf0,0xf0,0xef,0xf0,0x3f,0xc0, 0xff,0xf1,0xf1,0xf1,0xf0,0xf1,0xf1,0xf1,0xf1,0x38,0x8e,0x4f,0x56,0x54,0x51,0x51, 0x50,0x4b,0x37,0x20,0x22,0xc2,0xc4,0xf4,0xf3,0x3a,0x90,0x51,0x58,0x57,0x54,0x53, 0x52,0x4d,0x39,0x22,0x25,0xc6,0xc6,0xf4,0xf3,0xf4,0xf3,0xf3,0xf3,0xf3,0x46,0xc6, 0xff,0xf4,0xf4,0xf3,0xf4,0xf3,0xf4,0xf4,0xf3,0x3f,0x95,0x56,0x5d,0x5b,0x58,0x57, 0x57,0x52,0x3e,0x27,0x29,0xca,0xca,0xf4,0xf3,0x41,0x97,0x58,0x5f,0x5d,0x5b,0x5a, 0x59,0x54,0x40,0x29,0x2b,0xcd,0xcc,0xf4,0xf4,0x43,0x99,0x5a,0x62,0x60,0x5d,0x5c, 0x5b,0x56,0x42,0x2c,0x2e,0xcf,0xce,0xf3,0xf4,0xf3,0xf4,0xf4,0xf3,0xf4,0x4f,0xcf, 0xff,0xf4,0xf4,0xf4,0xf3,0xf4,0xf4,0xf4,0xf3,0x48,0x9e,0x5f,0x66,0x64,0x61,0x61, 0x60,0x5b,0x47,0x30,0x32,0xcf,0xd0,0xf4,0xf3,0x4a,0xa0,0x61,0x68,0x67,0x64,0x63, 0x62,0x5d,0x49,0x32,0x34,0xd0,0xd0,0xf4,0xf3,0xf4,0xf3,0xf3,0xf3,0xf3,0x56,0xcf, 0xff,0xf4,0xf4,0xf3,0xf4,0xf3,0xf4,0xf4,0xf3,0x4e,0xa4,0x66,0x6d,0x6b,0x68,0x67, 0x66,0x61,0x4d,0x37,0x39,0xd0,0xd0,0xf4,0xf3,0x50,0xa7,0x68,0x6f,0x6d,0x6a,0x69, 0x68,0x64,0x50,0x39,0x3b,0xd0,0xcf,0xf4,0xf4,0x53,0xa9,0x6a,0x71,0x6f,0x6c,0x6c, 0x6b,0x66,0x52,0x3b,0x3d,0xd0,0xcf,0xf3,0xf4,0xf3,0xf4,0xf4,0xf3,0xf4,0x5f,0xcf, 0xff,0xf4,0xf4,0xf4,0xf3,0xf4,0xf4,0xf4,0xf3,0x54,0xa9,0x6b,0x72,0x70,0x6d,0x6c, 0x6a,0x65,0x51,0x3a,0x3c,0xcf,0xd0,0xf4,0xf3,0x52,0xa8,0x69,0x70,0x6e,0x6a,0x69, 0x68,0x63,0x4f,0x38,0x3a,0xd0,0xd0,0xf4,0xf3,0xf4,0xf3,0xf3,0xf3,0xf3,0x58,0xcf, 0xff,0xf4,0xf4,0xf3,0xf4,0xf3,0xf4,0xf4,0xf3,0x4e,0xa3,0x64,0x6b,0x69,0x66,0x65, 0x64,0x5f,0x4a,0x33,0x35,0xd0,0xd0,0xf4,0xf3,0x4c,0xa1,0x62,0x69,0x67,0x64,0x63, 0x62,0x5c,0x48,0x31,0x33,0xd0,0xcf,0xf4,0xf4,0x49,0x9f,0x60,0x67,0x65,0x62,0x60, 0x5f,0x5a,0x46,0x2f,0x31,0xd0,0xcf,0xf3,0xf4,0xf3,0xf4,0xf4,0xf3,0xf4,0x4f,0xcf, 0xff,0xf4,0xf4,0xf4,0xf3,0xf4,0xf4,0xf4,0xf3,0x45,0x9b,0x5c,0x62,0x60,0x5d,0x5c, 0x5b,0x56,0x42,0x2a,0x2c,0xcc,0xcd,0xf4,0xf3,0x43,0x98,0x59,0x60,0x5e,0x5b,0x5a, 0x59,0x53,0x3f,0x28,0x2a,0xcb,0xcb,0xf4,0xf3,0xf4,0xf3,0xf3,0xf3,0xf3,0x49,0xc8, 0xff,0xf4,0xf4,0xf3,0xf4,0xf3,0xf4,0xf4,0xf3,0x3e,0x94,0x55,0x5c,0x59,0x56,0x55, 0x54,0x4f,0x3b,0x24,0x25,0xc6,0xc6,0xf4,0xf3,0x3c,0x92,0x52,0x59,0x57,0x54,0x53, 0x52,0x4d,0x38,0x21,0x23,0xc4,0xc3,0xf4,0xf4,0x39,0x8f,0x50,0x57,0x55,0x52,0x51, 0x4f,0x4a,0x36,0x1f,0x21,0xc2,0xc1,0xf0,0xf1,0xf0,0xf1,0xf1,0xf0,0xf1,0x40,0xc0, 0xfe,0xf0,0xf0,0xf0,0xef,0xf0,0xf0,0xef,0xee,0x35,0x8b,0x4c,0x53,0x51,0x4d,0x4c, 0x4b,0x46,0x32,0x1b,0x1d,0xbc,0xbd,0xed,0xec,0x33,0x89,0x4a,0x50,0x4e,0x4b,0x4a, 0x49,0x44,0x30,0x18,0x1a,0xbb,0xbb,0xeb,0xea,0xeb,0xe9,0xe9,0xe9,0xe9,0x39,0xb9, 0xf8,0xe9,0xe9,0xe8,0xe9,0xe8,0xe9,0xe9,0xe8,0x2e,0x84,0x45,0x4c,0x4a,0x47,0x46, 0x44,0x3f,0x2b,0x16,0x18,0xb7,0xb7,0xe6,0xe5,0x2c,0x82,0x43,0x4a,0x48,0x44,0x43, 0x42,0x3d,0x29,0x16,0x18,0xb4,0xb3,0xe4,0xe4,0x2a,0x80,0x41,0x47,0x45,0x42,0x41, 0x40,0x3b,0x27,0x16,0x18,0xb2,0xb1,0xe1,0xe2,0xe1,0xe1,0xe1,0xe0,0xe1,0x30,0xb0, 0xef,0xe0,0xe0,0xe0,0xdf,0xe0,0xe0,0xe0,0xde,0x29,0x7b,0x3c,0x43,0x41,0x3e,0x3c, 0x3b,0x36,0x27,0x16,0x18,0xad,0xad,0xdd,0xdc,0x29,0x79,0x3a,0x41,0x3e,0x3c,0x3b, 0x3a,0x36,0x27,0x16,0x18,0xac,0xab,0xdb,0xda,0xdb,0xda,0xda,0xda,0xd9,0x30,0xa9, 0xe8,0xda,0xda,0xd9,0xd9,0xd8,0xd9,0xd9,0xd8,0x29,0x75,0x3a,0x40,0x3e,0x3c,0x3b, 0x3a,0x36,0x27,0x16,0x18,0xa7,0xa7,0xd7,0xd6,0x29,0x72,0x3a,0x40,0x3e,0x3c,0x3b, 0x3a,0x36,0x27,0x16,0x18,0xa5,0xa4,0xd4,0xd4,0x29,0x70,0x3a,0x40,0x3e,0x3c,0x3b, 0x3a,0x36,0x27,0x16,0x18,0xa2,0xa1,0xd1,0xd2,0xd1,0xd2,0xd2,0xd0,0xd1,0x30,0xa0, 0xdf,0xd1,0xd3,0xd3,0xd3,0xd2,0xd3,0xd3,0xd2,0x41,0x59,0x4f,0x43,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xa3,0xd5,0xd4,0xd6,0x41,0x5b,0x4f,0x43,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xa6,0xd7,0xd8,0xd7,0xd8,0xd7,0xd7,0xd7,0xd9,0x30,0xa7, 0xe6,0xd9,0xd8,0xd9,0xda,0xd9,0xd9,0xda,0xda,0x41,0x5f,0x53,0x43,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xaa,0xdc,0xdc,0xdc,0x42,0x62,0x55,0x45,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xad,0xde,0xdd,0xde,0x44,0x64,0x57,0x47,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xaf,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0x30,0xb0, 0xef,0xe1,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe2,0x48,0x68,0x5b,0x4c,0x39,0x2f,0x2d, 0x2a,0x28,0x22,0x2f,0x2e,0xb3,0xe5,0xe4,0xe5,0x4a,0x6b,0x5e,0x4e,0x3b,0x31,0x2f, 0x2c,0x2b,0x23,0x31,0x30,0xb6,0xe6,0xe7,0xe7,0xe8,0xe7,0xe7,0xe7,0xe8,0x36,0xb7, 0xf6,0xe9,0xe8,0xe9,0xe9,0xe8,0xe9,0xea,0xea,0x4f,0x6f,0x62,0x52,0x40,0x36,0x34, 0x31,0x2f,0x27,0x35,0x35,0xba,0xec,0xec,0xec,0x51,0x71,0x65,0x55,0x42,0x38,0x36, 0x33,0x31,0x2a,0x38,0x37,0xbd,0xee,0xed,0xee,0x53,0x74,0x67,0x57,0x44,0x3a,0x38, 0x35,0x34,0x2c,0x3a,0x39,0xbf,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0x3f,0xc0, 0xff,0xf1,0xf2,0xf2,0xf2,0xf1,0xf2,0xf2,0xf2,0x58,0x78,0x6b,0x5b,0x48,0x3e,0x3d, 0x3a,0x38,0x30,0x3e,0x3d,0xc2,0xf5,0xf4,0xf5,0x5a,0x7a,0x6d,0x5d,0x4b,0x41,0x3f, 0x3c,0x3a,0x32,0x40,0x40,0xc6,0xf4,0xf5,0xf4,0xf5,0xf4,0xf4,0xf4,0xf5,0x46,0xc6, 0xff,0xf5,0xf4,0xf5,0xf5,0xf4,0xf4,0xf5,0xf5,0x5f,0x7f,0x72,0x62,0x4f,0x45,0x43, 0x41,0x3f,0x37,0x45,0x44,0xc9,0xf5,0xf5,0xf5,0x61,0x81,0x74,0x64,0x51,0x48,0x46, 0x43,0x41,0x39,0x47,0x46,0xcd,0xf5,0xf4,0xf5,0x63,0x83,0x76,0x67,0x54,0x4a,0x48, 0x45,0x43,0x3b,0x4a,0x49,0xcf,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0x4f,0xcf, 0xff,0xf4,0xf5,0xf5,0xf5,0xf4,0xf5,0xf5,0xf4,0x68,0x88,0x7b,0x6b,0x58,0x4e,0x4d, 0x4a,0x48,0x40,0x4e,0x4d,0xcf,0xf5,0xf4,0xf5,0x6a,0x8a,0x7d,0x6d,0x5b,0x51,0x4f, 0x4c,0x4a,0x42,0x50,0x50,0xd0,0xf4,0xf5,0xf4,0xf5,0xf4,0xf4,0xf4,0xf5,0x56,0xcf, 0xff,0xf5,0xf4,0xf5,0xf5,0xf4,0xf4,0xf5,0xf5,0x6e,0x8e,0x82,0x72,0x5f,0x55,0x53, 0x50,0x4e,0x47,0x55,0x54,0xcf,0xf5,0xf5,0xf5,0x71,0x91,0x84,0x74,0x61,0x57,0x55, 0x52,0x51,0x49,0x57,0x56,0xd0,0xf5,0xf4,0xf5,0x73,0x93,0x86,0x76,0x63,0x59,0x58, 0x55,0x53,0x4b,0x59,0x58,0xd0,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0x5f,0xcf, 0xff,0xf4,0xf5,0xf5,0xf5,0xf4,0xf5,0xf5,0xf4,0x74,0x94,0x87,0x77,0x64,0x5a,0x58, 0x54,0x52,0x4a,0x58,0x57,0xcf,0xf5,0xf4,0xf5,0x72,0x92,0x85,0x75,0x62,0x57,0x55, 0x52,0x50,0x48,0x56,0x55,0xd0,0xf4,0xf5,0xf4,0xf5,0xf4,0xf4,0xf4,0xf5,0x58,0xcf, 0xff,0xf5,0xf4,0xf5,0xf5,0xf4,0xf4,0xf5,0xf5,0x6e,0x8d,0x80,0x70,0x5d,0x53,0x51, 0x4e,0x4b,0x43,0x51,0x50,0xcf,0xf5,0xf5,0xf5,0x6c,0x8b,0x7e,0x6e,0x5b,0x51,0x4f, 0x4c,0x49,0x41,0x4f,0x4e,0xd0,0xf5,0xf4,0xf5,0x69,0x89,0x7c,0x6c,0x59,0x4f,0x4c, 0x49,0x47,0x3f,0x4d,0x4c,0xd0,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0x4f,0xcf, 0xff,0xf4,0xf5,0xf5,0xf5,0xf4,0xf5,0xf5,0xf4,0x65,0x85,0x78,0x67,0x54,0x4a,0x48, 0x45,0x43,0x3b,0x48,0x47,0xcc,0xf5,0xf4,0xf5,0x63,0x82,0x75,0x65,0x52,0x48,0x46, 0x43,0x40,0x38,0x46,0x45,0xcb,0xf4,0xf5,0xf4,0xf5,0xf4,0xf4,0xf4,0xf5,0x49,0xc8, 0xff,0xf5,0xf4,0xf5,0xf5,0xf4,0xf4,0xf5,0xf5,0x5e,0x7e,0x71,0x61,0x4d,0x43,0x41, 0x3e,0x3c,0x34,0x42,0x40,0xc5,0xf5,0xf5,0xf5,0x5c,0x7c,0x6e,0x5e,0x4b,0x41,0x3f, 0x3c,0x3a,0x31,0x3f,0x3e,0xc4,0xf5,0xf4,0xf5,0x59,0x79,0x6c,0x5c,0x49,0x3f,0x3d, 0x39,0x37,0x2f,0x3d,0x3c,0xc2,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0x40,0xc0, 0xfe,0xf0,0xf1,0xf1,0xf1,0xf0,0xf1,0xf0,0xef,0x55,0x75,0x68,0x58,0x45,0x3a,0x38, 0x35,0x33,0x2b,0x39,0x38,0xbc,0xee,0xed,0xee,0x53,0x73,0x66,0x55,0x42,0x38,0x36, 0x33,0x31,0x29,0x36,0x35,0xbb,0xeb,0xec,0xeb,0xec,0xea,0xea,0xea,0xeb,0x39,0xb9, 0xf8,0xea,0xe9,0xea,0xea,0xe9,0xe9,0xea,0xe9,0x4e,0x6e,0x61,0x51,0x3e,0x34,0x32, 0x2e,0x2c,0x24,0x32,0x31,0xb6,0xe8,0xe7,0xe7,0x4c,0x6c,0x5f,0x4f,0x3c,0x31,0x2f, 0x2c,0x2a,0x22,0x30,0x2f,0xb4,0xe5,0xe4,0xe5,0x4a,0x6a,0x5d,0x4c,0x39,0x2f,0x2d, 0x2a,0x28,0x22,0x2d,0x2c,0xb2,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe1,0x30,0xb0, 0xef,0xe0,0xe1,0xe1,0xe1,0xe0,0xe1,0xe1,0xdf,0x45,0x65,0x58,0x48,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xad,0xde,0xdd,0xde,0x43,0x63,0x56,0x46,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xac,0xdb,0xdc,0xdb,0xdc,0xdb,0xdb,0xdb,0xdb,0x30,0xa9, 0xe8,0xdb,0xda,0xdb,0xda,0xd9,0xd9,0xda,0xda,0x41,0x5f,0x51,0x43,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xa6,0xd8,0xd8,0xd8,0x41,0x5c,0x4f,0x43,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xa5,0xd6,0xd4,0xd5,0x41,0x5a,0x4f,0x43,0x35,0x2d,0x2c, 0x2a,0x28,0x22,0x2d,0x2c,0xa2,0xd3,0xd3,0xd3,0xd3,0xd3,0xd3,0xd2,0xd1,0x30,0xa0, 0xdf,0xd3,0xd4,0xd3,0xd3,0xd4,0xd3,0xd4,0xd4,0x76,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x6b,0xd6,0xd6,0xd7,0xd7,0x78,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x6d,0xd8,0xd9,0xd9,0xd9,0xd9,0xd8,0xd9,0xd8,0xda,0x30,0xa7, 0xe6,0xd9,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xda,0x7c,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x72,0xdd,0xdd,0xdd,0xdd,0x7f,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x74,0xdf,0xdf,0xdf,0xdf,0x81,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x76,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe1,0xe2,0xe2,0x30,0xb0, 0xef,0xe3,0xe3,0xe2,0xe2,0xe4,0xe3,0xe4,0xe4,0x85,0x34,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x7b,0xe6,0xe6,0xe6,0xe6,0x87,0x37,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x7d,0xe8,0xe8,0xe8,0xe9,0xe9,0xe8,0xe9,0xe8,0xe9,0x36,0xb7, 0xf6,0xe9,0xea,0xea,0xe9,0xea,0xeb,0xeb,0xea,0x8c,0x3b,0x21,0x21,0x20,0x1e,0x1d, 0x1b,0x1a,0x11,0x22,0x82,0xed,0xed,0xed,0xed,0x8e,0x3d,0x24,0x24,0x22,0x20,0x1f, 0x1d,0x1c,0x13,0x25,0x84,0xef,0xef,0xef,0xef,0x91,0x40,0x26,0x26,0x24,0x22,0x21, 0x1f,0x1f,0x15,0x27,0x86,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf1,0xf2,0xf2,0x3f,0xc0, 0xff,0xf3,0xf3,0xf2,0xf2,0xf3,0xf2,0xf4,0xf4,0x95,0x44,0x2a,0x2a,0x28,0x27,0x26, 0x24,0x23,0x19,0x2b,0x8a,0xf5,0xf5,0xf5,0xf5,0x97,0x46,0x2c,0x2c,0x2b,0x29,0x28, 0x26,0x25,0x1b,0x2d,0x8d,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x46,0xc6, 0xff,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x9c,0x4b,0x31,0x31,0x2f,0x2d,0x2c, 0x2b,0x2a,0x20,0x32,0x91,0xf5,0xf5,0xf5,0xf5,0x9e,0x4d,0x33,0x33,0x31,0x30,0x2f, 0x2d,0x2c,0x22,0x34,0x93,0xf5,0xf5,0xf5,0xf5,0xa0,0x4f,0x35,0x36,0x34,0x32,0x31, 0x2f,0x2e,0x24,0x37,0x96,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x4f,0xcf, 0xff,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xa5,0x54,0x3a,0x3a,0x38,0x36,0x36, 0x34,0x33,0x29,0x3b,0x9a,0xf5,0xf5,0xf5,0xf5,0xa7,0x56,0x3c,0x3c,0x3b,0x39,0x38, 0x36,0x35,0x2b,0x3d,0x9d,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x56,0xcf, 0xff,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xab,0x5a,0x41,0x41,0x3f,0x3d,0x3c, 0x3a,0x39,0x30,0x42,0xa1,0xf5,0xf5,0xf5,0xf5,0xae,0x5d,0x43,0x43,0x41,0x3f,0x3e, 0x3d,0x3c,0x32,0x44,0xa3,0xf5,0xf5,0xf5,0xf5,0xae,0x5f,0x45,0x45,0x43,0x41,0x41, 0x3f,0x3e,0x34,0x46,0xa5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x5f,0xcf, 0xff,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xae,0x60,0x46,0x46,0x44,0x42,0x41, 0x3e,0x3d,0x33,0x45,0xa4,0xf5,0xf5,0xf5,0xf5,0xae,0x5e,0x44,0x44,0x42,0x3f,0x3e, 0x3c,0x3b,0x31,0x43,0xa2,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x58,0xcf, 0xff,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xab,0x59,0x3f,0x3f,0x3d,0x3b,0x3a, 0x38,0x36,0x2c,0x3e,0x9d,0xf5,0xf5,0xf5,0xf5,0xa9,0x57,0x3d,0x3d,0x3b,0x39,0x38, 0x36,0x34,0x2a,0x3c,0x9b,0xf5,0xf5,0xf5,0xf5,0xa6,0x55,0x3b,0x3b,0x39,0x37,0x35, 0x33,0x32,0x28,0x3a,0x99,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x4f,0xcf, 0xff,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xa2,0x51,0x37,0x36,0x34,0x32,0x31, 0x2f,0x2e,0x24,0x35,0x94,0xf5,0xf5,0xf5,0xf5,0xa0,0x4e,0x34,0x34,0x32,0x30,0x2f, 0x2d,0x2b,0x21,0x33,0x92,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x49,0xc8, 0xff,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x9b,0x4a,0x30,0x30,0x2d,0x2b,0x2a, 0x28,0x27,0x1d,0x2f,0x8d,0xf5,0xf5,0xf5,0xf5,0x99,0x48,0x2d,0x2d,0x2b,0x29,0x28, 0x26,0x25,0x1a,0x2c,0x8b,0xf5,0xf5,0xf5,0xf5,0x96,0x45,0x2b,0x2b,0x29,0x27,0x26, 0x23,0x22,0x18,0x2a,0x89,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf2,0xf3,0xf3,0x40,0xc0, 0xfe,0xf2,0xf2,0xf1,0xf1,0xf2,0xf1,0xf1,0xf1,0x92,0x41,0x27,0x27,0x25,0x22,0x21, 0x1f,0x1e,0x14,0x26,0x85,0xef,0xef,0xef,0xef,0x90,0x3f,0x25,0x24,0x22,0x20,0x1f, 0x1d,0x1c,0x12,0x23,0x82,0xed,0xed,0xed,0xed,0xed,0xeb,0xec,0xeb,0xec,0x39,0xb9, 0xf8,0xea,0xeb,0xeb,0xea,0xeb,0xeb,0xeb,0xe9,0x8b,0x3a,0x20,0x20,0x1e,0x1c,0x1b, 0x19,0x18,0x11,0x1f,0x7e,0xe9,0xe9,0xe8,0xe8,0x89,0x38,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x7c,0xe6,0xe6,0xe6,0xe6,0x87,0x36,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x79,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe2,0xe3,0xe3,0x30,0xb0, 0xef,0xe2,0xe2,0xe1,0xe1,0xe2,0xe1,0xe2,0xe1,0x82,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x75,0xe0,0xdf,0xdf,0xdf,0x80,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x73,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdd,0xdc,0xdc,0x30,0xa9, 0xe8,0xdb,0xdc,0xdc,0xda,0xdb,0xdb,0xdb,0xda,0x7c,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x6e,0xd9,0xd9,0xd9,0xd9,0x79,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x6c,0xd7,0xd7,0xd6,0xd6,0x77,0x32,0x1e,0x1e,0x1d,0x1b,0x1b, 0x19,0x18,0x11,0x1e,0x6a,0xd4,0xd4,0xd4,0xd4,0xd4,0xd4,0xd3,0xd3,0xd3,0x30,0xa0, 0xdf,0xd4,0xd4,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xce,0x8c,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x7d,0xca,0xd6,0xd7,0xd8,0xd8,0xd0,0x8e,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x7f,0xcc,0xd9,0xda,0xda,0xda,0xda,0xda,0xda,0xd9,0xdb,0x30,0xa7, 0xe6,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0xd4,0x92,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x84,0xd1,0xdd,0xde,0xdd,0xde,0xd7,0x95,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x86,0xd3,0xe0,0xe0,0xe0,0xe0,0xd9,0x97,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x88,0xd5,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x30,0xb0, 0xef,0xe4,0xe3,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xdd,0x9b,0x35,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x8d,0xda,0xe6,0xe7,0xe7,0xe7,0xdf,0x9e,0x38,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x8f,0xdc,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0xe9,0xea,0x36,0xb7, 0xf6,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xe4,0xa2,0x3c,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x24,0x93,0xe1,0xed,0xee,0xed,0xee,0xe6,0xa4,0x3f,0x13,0x12,0x10,0x10, 0x0d,0x0d,0x27,0x96,0xe3,0xf0,0xf0,0xf0,0xf0,0xe9,0xa7,0x41,0x15,0x14,0x12,0x12, 0x10,0x10,0x29,0x98,0xe5,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x3f,0xc0, 0xff,0xf4,0xf3,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xed,0xab,0x45,0x19,0x18,0x17,0x17, 0x14,0x14,0x2d,0x9c,0xe9,0xf5,0xf6,0xf6,0xf6,0xef,0xad,0x47,0x1b,0x1b,0x19,0x19, 0x16,0x16,0x2f,0x9e,0xec,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf6,0x46,0xc6, 0xff,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf0,0xb2,0x4c,0x20,0x1f,0x1d,0x1d, 0x1b,0x1b,0x34,0xa3,0xec,0xf5,0xf6,0xf5,0xf6,0xf0,0xb4,0x4e,0x22,0x21,0x20,0x20, 0x1d,0x1d,0x36,0xa5,0xec,0xf6,0xf6,0xf6,0xf6,0xf0,0xb6,0x50,0x25,0x24,0x22,0x22, 0x1f,0x1f,0x38,0xa8,0xec,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x4f,0xcf, 0xff,0xf6,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf0,0xbb,0x55,0x29,0x28,0x26,0x27, 0x24,0x24,0x3d,0xac,0xec,0xf5,0xf6,0xf6,0xf6,0xf0,0xbd,0x57,0x2b,0x2b,0x29,0x29, 0x26,0x26,0x3f,0xae,0xec,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf6,0x56,0xcf, 0xff,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf0,0xbf,0x5c,0x30,0x2f,0x2d,0x2d, 0x2a,0x2a,0x44,0xb2,0xec,0xf5,0xf6,0xf5,0xf6,0xf0,0xbf,0x5e,0x32,0x31,0x2f,0x2f, 0x2d,0x2d,0x46,0xb2,0xec,0xf6,0xf6,0xf6,0xf6,0xf0,0xbf,0x60,0x34,0x33,0x31,0x32, 0x2f,0x2f,0x48,0xb2,0xec,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x5f,0xcf, 0xff,0xf6,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf0,0xbf,0x61,0x35,0x34,0x32,0x32, 0x2e,0x2e,0x47,0xb2,0xec,0xf5,0xf6,0xf6,0xf6,0xf0,0xbf,0x5f,0x33,0x32,0x2f,0x2f, 0x2c,0x2c,0x45,0xb2,0xec,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf6,0x58,0xcf, 0xff,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf0,0xbf,0x5a,0x2e,0x2d,0x2b,0x2b, 0x28,0x27,0x40,0xaf,0xec,0xf5,0xf6,0xf5,0xf6,0xf0,0xbe,0x58,0x2c,0x2b,0x29,0x29, 0x26,0x25,0x3e,0xad,0xec,0xf6,0xf6,0xf6,0xf6,0xf0,0xbc,0x56,0x2a,0x29,0x27,0x26, 0x23,0x23,0x3c,0xab,0xec,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x4f,0xcf, 0xff,0xf6,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf0,0xb8,0x52,0x25,0x24,0x22,0x22, 0x1f,0x1f,0x38,0xa6,0xec,0xf5,0xf6,0xf6,0xf6,0xf0,0xb5,0x4f,0x23,0x22,0x20,0x20, 0x1d,0x1c,0x35,0xa4,0xec,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf6,0x49,0xc8, 0xff,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf0,0xb1,0x4b,0x1f,0x1d,0x1b,0x1b, 0x18,0x18,0x31,0xa0,0xec,0xf5,0xf6,0xf5,0xf6,0xf0,0xaf,0x48,0x1c,0x1b,0x19,0x19, 0x16,0x16,0x2e,0x9d,0xea,0xf6,0xf6,0xf6,0xf6,0xee,0xac,0x46,0x1a,0x19,0x17,0x17, 0x13,0x13,0x2c,0x9b,0xe8,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0x40,0xc0, 0xfe,0xf3,0xf2,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xea,0xa8,0x42,0x16,0x15,0x12,0x12, 0x0f,0x0f,0x28,0x97,0xe4,0xef,0xf0,0xf0,0xf0,0xe8,0xa6,0x40,0x13,0x12,0x10,0x10, 0x0d,0x0d,0x26,0x94,0xe1,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xec,0xed,0x39,0xb9, 0xf8,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0xe3,0xa1,0x3b,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x21,0x90,0xdd,0xe9,0xe9,0xe8,0xe9,0xe1,0x9f,0x39,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x8e,0xdb,0xe7,0xe7,0xe7,0xe7,0xdf,0x9d,0x37,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x8b,0xd8,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0x30,0xb0, 0xef,0xe3,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xda,0x98,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x87,0xd4,0xe0,0xe0,0xe0,0xe0,0xd8,0x96,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x85,0xd2,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0x30,0xa9, 0xe8,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xd4,0x92,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x80,0xcd,0xd9,0xda,0xd9,0xda,0xd1,0x8f,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x7e,0xcb,0xd8,0xd8,0xd7,0xd7,0xcf,0x8d,0x33,0x12,0x11,0x0f,0x0f, 0x0d,0x0d,0x20,0x7c,0xc9,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0xd4,0xd4,0x30,0xa0, 0xdf,0xd5,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7,0xd7,0xd7,0x3b,0xa2, 0xe2,0xd7,0xd8,0xd8,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0x3b,0xa5, 0xe4,0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdc,0x30,0xa7, 0xe6,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0xde,0x3b,0xa9, 0xe8,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0x3b,0xab, 0xea,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0x3c,0xad, 0xed,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0x30,0xb0, 0xef,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0x41,0xb2, 0xf1,0xe6,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0x43,0xb4, 0xf3,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x36,0xb7, 0xf6,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0x48,0xb9, 0xf8,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0x4a,0xbb, 0xfa,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0x4c,0xbd, 0xfd,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0x3f,0xc0, 0xff,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x51,0xc2, 0xff,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x53,0xc4, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x46,0xc6, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x57,0xc8, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x5a,0xcb, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x5c,0xcd, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x4f,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x60,0xcf, 0xff,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x63,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x56,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x67,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x69,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x6c,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x5f,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x6c,0xcf, 0xff,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x69,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x58,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x65,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x63,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x61,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x4f,0xcf, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x5c,0xcd, 0xff,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x5a,0xcb, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x49,0xc8, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x55,0xc6, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x53,0xc4, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x51,0xc2, 0xff,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x40,0xc0, 0xfe,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x4c,0xbd, 0xfc,0xf1,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0x4a,0xbb, 0xfa,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0x39,0xb9, 0xf8,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0x46,0xb6, 0xf5,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0x43,0xb4, 0xf3,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0x41,0xb2, 0xf1,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0x30,0xb0, 0xef,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x3d,0xad, 0xec,0xe1,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0x3b,0xab, 0xea,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x30,0xa9, 0xe8,0xde,0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0x3b,0xa7, 0xe6,0xdc,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xda,0xda,0xda,0xda,0xda,0x3b,0xa5, 0xe3,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x3b,0xa2, 0xe1,0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd6,0xd5,0xd5,0x30,0xa0, 0xdf,0xd6,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0xd8,0xd8,0xd8,0xd8,0x36,0xa2, 0xe2,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0x36,0xa5, 0xe4,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0xdd,0x30,0xa7, 0xe6,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0xdf,0x36,0xa9, 0xe8,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0x36,0xab, 0xea,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0x36,0xad, 0xed,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0x30,0xb0, 0xef,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0x3b,0xb2, 0xf1,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0x3d,0xb4, 0xf3,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xec,0x36,0xb7, 0xf6,0xed,0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xef,0x42,0xb9, 0xf8,0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0x44,0xbb, 0xfa,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0x46,0xbd, 0xfd,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x40,0xc0, 0xff,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x4b,0xc2, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4d,0xc4, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x46,0xc6, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x51,0xc8, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x54,0xcb, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x56,0xcd, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5a,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5d,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x56,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x61,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x63,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x66,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x66,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x63,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x58,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5d,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5b,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x56,0xcd, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x54,0xcb, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x49,0xc8, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4f,0xc6, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4d,0xc4, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4b,0xc2, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x40,0xc0, 0xfe,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0x46,0xbd, 0xfc,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xf1,0x44,0xbb, 0xfa,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0x39,0xb9, 0xf8,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0xed,0x40,0xb6, 0xf5,0xec,0xec,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0x3d,0xb4, 0xf3,0xea,0xea,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0x3b,0xb2, 0xf1,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0x30,0xb0, 0xef,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0x37,0xad, 0xec,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0x36,0xab, 0xea,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0x30,0xa9, 0xe8,0xdf,0xdf,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0xdd,0x36,0xa7, 0xe6,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0xdb,0xdb,0x36,0xa5, 0xe3,0xda,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0x36,0xa2, 0xe1,0xd8,0xd8,0xd8,0xd8,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0x30,0xa0, 0xdf,0xd7,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9,0xd9,0x33,0xa2, 0xe2,0xda,0xda,0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0x33,0xa5, 0xe4,0xdc,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0x30,0xa7, 0xe6,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0x33,0xa9, 0xe8,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0x33,0xab, 0xea,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0x33,0xad, 0xed,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x30,0xb0, 0xef,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0x36,0xb2, 0xf1,0xe9,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0x38,0xb4, 0xf3,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0x36,0xb7, 0xf6,0xee,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0x3d,0xb9, 0xf8,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0x3f,0xbb, 0xfa,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0x41,0xbd, 0xfd,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x40,0xc0, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x46,0xc2, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x48,0xc4, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x46,0xc6, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4c,0xc8, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4f,0xcb, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x51,0xcd, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x55,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x58,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x56,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5c,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5e,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x61,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x61,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5e,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x58,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x5a,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x58,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x56,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x51,0xcd, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4f,0xcb, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x49,0xc8, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x4a,0xc6, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x48,0xc4, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x46,0xc2, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x40,0xc0, 0xfe,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x41,0xbd, 0xfc,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0x3f,0xbb, 0xfa,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0x39,0xb9, 0xf8,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0xee,0xee,0x3b,0xb6, 0xf5,0xed,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0x38,0xb4, 0xf3,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0xe9,0x36,0xb2, 0xf1,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0x30,0xb0, 0xef,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0x33,0xad, 0xec,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0x33,0xab, 0xea,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0x30,0xa9, 0xe8,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0xde,0x33,0xa7, 0xe6,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0x33,0xa5, 0xe3,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0x33,0xa2, 0xe1,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd7,0xd7,0x30,0xa0, 0xdf,0xd8,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xda,0xda,0xda,0xda,0xda,0x30,0xa2, 0xe2,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0x30,0xa5, 0xe4,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0x30,0xa7, 0xe6,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0x30,0xa9, 0xe8,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0x30,0xab, 0xea,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0x30,0xae, 0xed,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x30,0xb0, 0xef,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0x32,0xb2, 0xf1,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0x34,0xb4, 0xf3,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0x36,0xb7, 0xf6,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0x39,0xb9, 0xf8,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0x3b,0xbb, 0xfa,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0x3d,0xbd, 0xfd,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x40,0xc0, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x42,0xc2, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x44,0xc4, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x46,0xc6, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x48,0xc8, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4b,0xcb, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4d,0xcd, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4f,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x51,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x54,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x58,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5a,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5d,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5f,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5d,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5a,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x58,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x54,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x52,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4f,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4d,0xcd, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4b,0xcb, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x49,0xc8, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x46,0xc6, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x44,0xc4, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x42,0xc2, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x40,0xc0, 0xfe,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x3d,0xbd, 0xfc,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0x3b,0xbb, 0xfa,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0x39,0xb9, 0xf8,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0x37,0xb6, 0xf5,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0x34,0xb4, 0xf3,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0x32,0xb2, 0xf1,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xb0, 0xef,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x30,0xad, 0xec,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0x30,0xab, 0xea,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0x30,0xa9, 0xe8,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0x30,0xa7, 0xe6,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0x30,0xa5, 0xe3,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0x30,0xa2, 0xe1,0xda,0xda,0xda,0xda,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0x30,0xa0, 0xdf,0xd9,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdb,0x30,0xa2, 0xe2,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0x30,0xa5, 0xe4,0xde,0xde,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0x30,0xa7, 0xe6,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0x30,0xa9, 0xe8,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0x30,0xab, 0xea,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x30,0xae, 0xed,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xb0, 0xef,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0x32,0xb2, 0xf1,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0x34,0xb4, 0xf3,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0x36,0xb7, 0xf6,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0x39,0xb9, 0xf8,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0x3b,0xbb, 0xfa,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0x3d,0xbd, 0xfd,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x40,0xc0, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x42,0xc2, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x44,0xc4, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x46,0xc6, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x48,0xc8, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4b,0xcb, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4d,0xcd, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4f,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x51,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x54,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x56,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x58,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5a,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5d,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5f,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5d,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5a,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x58,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x56,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x54,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x52,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4f,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4d,0xcd, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4b,0xcb, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x48,0xc8, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x46,0xc6, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x44,0xc4, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x42,0xc2, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x40,0xc0, 0xfe,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x3d,0xbd, 0xfc,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0x3b,0xbb, 0xfa,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0x39,0xb9, 0xf8,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x37,0xb6, 0xf5,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xed,0x34,0xb4, 0xf3,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0xeb,0xeb,0x32,0xb2, 0xf1,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0x30,0xb0, 0xee,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x30,0xad, 0xec,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0x30,0xab, 0xea,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0x30,0xa9, 0xe8,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0x30,0xa7, 0xe6,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0xde,0xde,0xde,0x30,0xa5, 0xe3,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0x30,0xa2, 0xe1,0xdb,0xdb,0xdb,0xdb,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0x30,0xa0, 0xdf,0xda,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0x30,0xa2, 0xe2,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0x30,0xa5, 0xe4,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0x30,0xa7, 0xe6,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0x30,0xa9, 0xe8,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0x30,0xab, 0xea,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x30,0xae, 0xed,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0x30,0xb0, 0xef,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0x32,0xb2, 0xf1,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0x34,0xb4, 0xf3,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x36,0xb7, 0xf6,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0x39,0xb9, 0xf8,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0x3b,0xbb, 0xfa,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x3d,0xbd, 0xfd,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x40,0xc0, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x42,0xc2, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x44,0xc4, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x46,0xc6, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x48,0xc9, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4b,0xcb, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4d,0xcd, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x51,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x54,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x56,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x58,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5a,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5d,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5d,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5a,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x58,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x56,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x54,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x52,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4d,0xcd, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4b,0xcb, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x48,0xc8, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x46,0xc6, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x44,0xc4, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x42,0xc2, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x40,0xc0, 0xfe,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x3d,0xbd, 0xfc,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0x3b,0xbb, 0xfa,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0x39,0xb9, 0xf8,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0x37,0xb6, 0xf5,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0x34,0xb4, 0xf3,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0x32,0xb2, 0xf1,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0x30,0xb0, 0xee,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xad, 0xec,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0x30,0xab, 0xea,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0x30,0xa9, 0xe8,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0x30,0xa7, 0xe6,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0x30,0xa5, 0xe3,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0x30,0xa2, 0xe1,0xdc,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xda,0xda,0x30,0xa0, 0xdf,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0x30,0xa2, 0xe2,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0x30,0xa5, 0xe4,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0x30,0xa7, 0xe6,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0x30,0xa9, 0xe8,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x30,0xab, 0xea,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xae, 0xed,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0x30,0xb0, 0xef,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0x32,0xb2, 0xf1,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0x34,0xb4, 0xf3,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0x36,0xb7, 0xf6,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0x39,0xb9, 0xf8,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0x3b,0xbb, 0xfa,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0x3d,0xbd, 0xfd,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x40,0xc0, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x42,0xc2, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x44,0xc4, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x46,0xc6, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x48,0xc9, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4b,0xcb, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4d,0xcd, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x51,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x54,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x56,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x58,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5a,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5d,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5d,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5a,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x58,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x56,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x54,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x52,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4d,0xcd, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4b,0xcb, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x48,0xc8, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x46,0xc6, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x44,0xc4, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x42,0xc2, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x40,0xc0, 0xfe,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x3d,0xbd, 0xfc,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0x3b,0xbb, 0xfa,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0x39,0xb9, 0xf8,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x37,0xb6, 0xf5,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0x34,0xb4, 0xf3,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0x32,0xb2, 0xf1,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0x30,0xb0, 0xee,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x30,0xad, 0xec,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0x30,0xab, 0xea,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0x30,0xa9, 0xe8,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0x30,0xa7, 0xe6,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0x30,0xa5, 0xe3,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0x30,0xa2, 0xe1,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdb,0xdb,0x30,0xa0, 0xdf,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xde,0xde,0x30,0xa2, 0xe2,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x30,0xa5, 0xe4,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0x30,0xa7, 0xe6,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0x30,0xa9, 0xe8,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x30,0xab, 0xea,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x30,0xae, 0xed,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0x30,0xb0, 0xef,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0xee,0xee,0x32,0xb2, 0xf1,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf0,0x34,0xb4, 0xf3,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x36,0xb7, 0xf6,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0x39,0xb9, 0xf8,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0x3b,0xbb, 0xfa,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0x3d,0xbd, 0xfd,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x40,0xc0, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x42,0xc2, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x44,0xc4, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x46,0xc6, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x48,0xc9, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4b,0xcb, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4d,0xcd, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4f,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x51,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x54,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x56,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x58,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5a,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5d,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5f,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5d,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5a,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x58,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x56,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x54,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x52,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4f,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4d,0xcd, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4b,0xcb, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x48,0xc8, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x46,0xc6, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x44,0xc4, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x42,0xc2, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x40,0xc0, 0xfe,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x3d,0xbd, 0xfc,0xf9,0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0x3b,0xbb, 0xfa,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0x39,0xb9, 0xf8,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x37,0xb6, 0xf5,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0x34,0xb4, 0xf3,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0x32,0xb2, 0xf1,0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0x30,0xb0, 0xee,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x30,0xad, 0xec,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0x30,0xab, 0xea,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0x30,0xa9, 0xe8,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0x30,0xa7, 0xe6,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0x30,0xa5, 0xe3,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0x30,0xa2, 0xe1,0xde,0xde,0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0x30,0xa0, 0xdf,0xdd,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x30,0xa2, 0xe2,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x30,0xa5, 0xe4,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0x30,0xa7, 0xe6,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0x30,0xa9, 0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xab, 0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0x30,0xae, 0xed,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xed,0x30,0xb0, 0xef,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0x32,0xb2, 0xf1,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0x34,0xb4, 0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x36,0xb7, 0xf6,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0x39,0xb9, 0xf8,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0x3b,0xbb, 0xfa,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0x3d,0xbd, 0xfd,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x40,0xc0, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x42,0xc2, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x44,0xc4, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x46,0xc6, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x48,0xc9, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4b,0xcb, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4d,0xcd, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4f,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x51,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x54,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x56,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x58,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5a,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5d,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5f,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5d,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5a,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x58,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x56,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x54,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x52,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4f,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4d,0xcd, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4b,0xcb, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x48,0xc8, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x46,0xc6, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x44,0xc4, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x42,0xc2, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x40,0xbf, 0xfe,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x3d,0xbd, 0xfc,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0xf8,0x3b,0xbb, 0xfa,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0x39,0xb9, 0xf8,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0x37,0xb6, 0xf5,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0x34,0xb4, 0xf3,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0x32,0xb2, 0xf1,0xef,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0x30,0xb0, 0xee,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x30,0xad, 0xec,0xea,0xea,0xea,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0x30,0xab, 0xea,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0x30,0xa9, 0xe8,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0x30,0xa7, 0xe6,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0x30,0xa5, 0xe3,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x30,0xa2, 0xe1,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0x30,0xa0, 0xdf,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0x30,0xa2, 0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0x30,0xa5, 0xe4,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0x30,0xa7, 0xe6,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0x30,0xa9, 0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x30,0xab, 0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x30,0xae, 0xed,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0x30,0xb0, 0xef,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0x32,0xb2, 0xf1,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0x34,0xb4, 0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0x36,0xb7, 0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0x39,0xb9, 0xf8,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0x3b,0xbb, 0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0x3d,0xbd, 0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x40,0xc0, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x42,0xc2, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x44,0xc4, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x46,0xc6, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x48,0xc9, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4b,0xcb, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4d,0xcd, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4f,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x51,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x54,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x56,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x58,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5a,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5d,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5f,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5d,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5a,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x58,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x56,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x54,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x52,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4f,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4d,0xcd, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4b,0xcb, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x48,0xc8, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x46,0xc6, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x44,0xc4, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x42,0xc2, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x40,0xbf, 0xfe,0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x3d,0xbd, 0xfc,0xfb,0xfb,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x3b,0xbb, 0xfa,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0x39,0xb9, 0xf8,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x37,0xb6, 0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0x34,0xb4, 0xf3,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0x32,0xb2, 0xf1,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0xee,0x30,0xb0, 0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x30,0xad, 0xec,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0x30,0xab, 0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0x30,0xa9, 0xe8,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0x30,0xa7, 0xe6,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x30,0xa5, 0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x30,0xa2, 0xe1,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0x30,0xa0, 0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0x30,0xa2, 0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x30,0xa5, 0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0x30,0xa7, 0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0x30,0xa9, 0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0x30,0xab, 0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xec,0x30,0xae, 0xed,0xed,0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xef,0x30,0xb0, 0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0x32,0xb2, 0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0x34,0xb4, 0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x36,0xb7, 0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0x39,0xb9, 0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0x3b,0xbb, 0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0x3d,0xbd, 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x40,0xc0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x42,0xc2, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0xc4, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x46,0xc6, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x48,0xc9, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0xcb, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4d,0xcd, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x51,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x54,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x56,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x58,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5a,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5d,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5d,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5a,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x58,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x56,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x54,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x52,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0xcf, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4d,0xcd, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0xcb, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x48,0xc8, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x46,0xc6, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x44,0xc4, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x42,0xc1, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0xbf, 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0x3d,0xbd, 0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,0xfa,0x3b,0xbb, 0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0x39,0xb9, 0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x37,0xb6, 0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0x34,0xb4, 0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0x32,0xb2, 0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,0x30,0xb0, 0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0x30,0xad, 0xec,0xec,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0x30,0xab, 0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0x30,0xa9, 0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0x30,0xa7, 0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0x30,0xa4, 0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0x30,0xa2, 0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0x30,0xa0, 0xdf,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0x30,0xa2, 0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0x30,0xa5, 0xe4,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0x30,0xa7, 0xe6,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0x30,0xa9, 0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x30,0xab, 0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x30,0xae, 0xed,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0x30,0xb0, 0xef,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0x32,0xb2, 0xf1,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0x34,0xb4, 0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0x37,0xb7, 0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0x39,0xb9, 0xf8,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0x3b,0xbb, 0xfa,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0x3d,0xbd, 0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x40,0xc0, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x42,0xc2, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x44,0xc4, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x46,0xc6, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x48,0xc9, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4b,0xcb, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4d,0xcd, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4f,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x51,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x54,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x56,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x58,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5a,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5d,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5f,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5d,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x5a,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x58,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x56,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x54,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x52,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4f,0xcf, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4d,0xcd, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x4b,0xcb, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x48,0xc8, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x46,0xc6, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x44,0xc4, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x42,0xc1, 0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x40,0xbf, 0xfe,0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0x3d,0xbd, 0xfc,0xfb,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0x3b,0xbb, 0xfa,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0x39,0xb9, 0xf8,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x37,0xb6, 0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0x34,0xb4, 0xf3,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0x32,0xb2, 0xf1,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0xee,0x30,0xb0, 0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0x30,0xad, 0xec,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0x30,0xab, 0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0x30,0xa9, 0xe8,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0x30,0xa7, 0xe6,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x30,0xa4, 0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0x30,0xa2, 0xe1,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0x30,0xa0, 0xdf,0xdd,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0x30,0xa2, 0xe2,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x30,0xa5, 0xe4,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0x30,0xa7, 0xe6,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0x30,0xa9, 0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xab, 0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0x30,0xae, 0xed,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xed,0x30,0xb0, 0xef,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0x32,0xb2, 0xf1,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0x34,0xb4, 0xf4,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x37,0xb7, 0xf6,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0x39,0xb9, 0xf8,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0x3b,0xbb, 0xfa,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0x3d,0xbd, 0xfd,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x40,0xc0, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x42,0xc2, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x44,0xc4, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x46,0xc6, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x48,0xc9, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4b,0xcb, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4d,0xcd, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4f,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x51,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x54,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x56,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x58,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5a,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5d,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5f,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5d,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x5a,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x58,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x56,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x54,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x52,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4f,0xcf, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4d,0xcd, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x4b,0xcb, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x48,0xc8, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x46,0xc6, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x44,0xc4, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x42,0xc1, 0xff,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0x40,0xbf, 0xfe,0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,0x3d,0xbd, 0xfc,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0x3b,0xbb, 0xfa,0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0x39,0xb9, 0xf8,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0x37,0xb6, 0xf5,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0x34,0xb4, 0xf3,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0x32,0xb2, 0xf1,0xef,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0x30,0xb0, 0xee,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0x30,0xad, 0xec,0xea,0xea,0xea,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0x30,0xab, 0xea,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0x30,0xa9, 0xe8,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0x30,0xa7, 0xe6,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0x30,0xa4, 0xe3,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0x30,0xa2, 0xe1,0xdf,0xdf,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0x30,0xa0, 0xdf,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xde,0xde,0x30,0xa2, 0xe2,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x30,0xa5, 0xe4,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0x30,0xa7, 0xe6,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0x30,0xa9, 0xe8,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x30,0xab, 0xea,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x30,0xae, 0xed,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0x30,0xb0, 0xef,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0xee,0xee,0x32,0xb2, 0xf1,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0x34,0xb4, 0xf4,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x37,0xb7, 0xf6,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0x39,0xb9, 0xf8,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0x3b,0xbb, 0xfa,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0x3d,0xbd, 0xfd,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x40,0xc0, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x42,0xc2, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x44,0xc4, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x46,0xc6, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x48,0xc9, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4b,0xcb, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4d,0xcd, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4f,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x52,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x54,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x56,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x58,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5a,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5d,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5f,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5d,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x5a,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x58,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x56,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x54,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x52,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4f,0xcf, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4d,0xcd, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x4b,0xcb, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x48,0xc8, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x46,0xc6, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x44,0xc4, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x42,0xc1, 0xff,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0x40,0xbf, 0xfe,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0x3d,0xbd, 0xfc,0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0x3b,0xbb, 0xfa,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0x39,0xb9, 0xf8,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0x37,0xb6, 0xf5,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0x34,0xb4, 0xf3,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0x32,0xb2, 0xf1,0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0x30,0xb0, 0xee,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0x30,0xad, 0xec,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0x30,0xab, 0xea,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0x30,0xa9, 0xe8,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0x30,0xa7, 0xe6,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0x30,0xa4, 0xe3,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0x30,0xa2, 0xe1,0xde,0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0x30,0xa0, 0xdf,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0x30,0xa2, 0xe2,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0x30,0xa5, 0xe4,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0x30,0xa7, 0xe6,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0x30,0xa9, 0xe8,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x30,0xab, 0xea,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xae, 0xed,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0x30,0xb0, 0xef,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0x32,0xb2, 0xf1,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xef,0x34,0xb4, 0xf4,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0x37,0xb7, 0xf6,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0x39,0xb9, 0xf8,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0x3b,0xbb, 0xfa,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0x3d,0xbd, 0xfd,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x40,0xc0, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x42,0xc2, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x44,0xc4, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x46,0xc6, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x48,0xc9, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4b,0xcb, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4d,0xcd, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x52,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x54,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x56,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x58,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5a,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5d,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5d,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5a,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x58,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x56,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x54,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x51,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4d,0xcd, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4b,0xcb, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x48,0xc8, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x46,0xc6, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x44,0xc4, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x42,0xc1, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x40,0xbf, 0xfe,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0x3d,0xbd, 0xfc,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0x3b,0xbb, 0xfa,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0x39,0xb9, 0xf7,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0x37,0xb6, 0xf5,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0x34,0xb4, 0xf3,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0x32,0xb2, 0xf1,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0x30,0xb0, 0xee,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0x30,0xad, 0xec,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0x30,0xab, 0xea,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0x30,0xa9, 0xe8,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0x30,0xa7, 0xe6,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0x30,0xa4, 0xe3,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0x30,0xa2, 0xe1,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0x30,0xa0, 0xdf,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0x30,0xa3, 0xe2,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0x30,0xa5, 0xe4,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0x30,0xa7, 0xe6,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0x30,0xa9, 0xe8,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0x30,0xab, 0xea,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x30,0xae, 0xed,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0x30,0xb0, 0xef,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0x32,0xb2, 0xf1,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0x34,0xb4, 0xf4,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x37,0xb7, 0xf6,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0x39,0xb9, 0xf8,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0x3b,0xbb, 0xfa,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0x3d,0xbd, 0xfd,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x40,0xc0, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x42,0xc2, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x44,0xc4, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x46,0xc6, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x48,0xc9, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4b,0xcb, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4d,0xcd, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x52,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x54,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x56,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x58,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5a,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5d,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5d,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x5a,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x58,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x56,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x54,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x51,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4f,0xcf, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4d,0xcd, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x4b,0xcb, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x48,0xc8, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x46,0xc6, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x44,0xc4, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0x42,0xc1, 0xff,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x40,0xbf, 0xfe,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0x3d,0xbd, 0xfc,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0x3b,0xbb, 0xfa,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0x39,0xb9, 0xf7,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0x37,0xb6, 0xf5,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0x34,0xb4, 0xf3,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0x32,0xb2, 0xf1,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0x30,0xb0, 0xee,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xad, 0xec,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0x30,0xab, 0xea,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0x30,0xa9, 0xe8,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0x30,0xa7, 0xe6,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0x30,0xa4, 0xe3,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdc,0x30,0xa2, 0xe1,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xda,0xda,0xda,0x30,0xa0, 0xdf,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0x30,0xa3, 0xe2,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0x30,0xa5, 0xe4,0xde,0xde,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0x30,0xa7, 0xe6,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0x30,0xa9, 0xe8,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0x30,0xab, 0xea,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x30,0xae, 0xed,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0x30,0xb0, 0xef,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0x32,0xb2, 0xf1,0xeb,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0x34,0xb4, 0xf4,0xee,0xee,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x37,0xb7, 0xf6,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0x39,0xb9, 0xf8,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0x3b,0xbb, 0xfa,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0x3d,0xbd, 0xfd,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x40,0xc0, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x42,0xc2, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x44,0xc4, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x46,0xc6, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x48,0xc9, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4b,0xcb, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4d,0xcd, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4f,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x52,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x54,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x56,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x58,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5a,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5d,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5f,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5d,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x5a,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x58,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x56,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x54,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x51,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4f,0xcf, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4d,0xcd, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x4b,0xcb, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x48,0xc8, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x46,0xc6, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x44,0xc4, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0x42,0xc1, 0xff,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x40,0xbf, 0xfe,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0x3d,0xbd, 0xfc,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0x3b,0xbb, 0xfa,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0x39,0xb9, 0xf7,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x36,0xb6, 0xf5,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xed,0x34,0xb4, 0xf3,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0xeb,0xeb,0x32,0xb2, 0xf1,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0x30,0xb0, 0xee,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0x30,0xad, 0xec,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0x30,0xab, 0xea,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0x30,0xa9, 0xe8,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0x30,0xa7, 0xe6,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0x30,0xa4, 0xe3,0xdd,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdb,0x30,0xa2, 0xe1,0xdb,0xdb,0xdb,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0xd9,0xd9,0xd9,0x30,0xa0, 0xdf,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xda,0xda,0xda,0xda,0xda,0xda,0x30,0xa3, 0xe2,0xdb,0xdb,0xdb,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0x30,0xa5, 0xe4,0xdd,0xdd,0xdd,0xdd,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0x30,0xa7, 0xe6,0xdf,0xdf,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0x30,0xa9, 0xe8,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0x30,0xab, 0xea,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0x30,0xae, 0xed,0xe6,0xe6,0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0x30,0xb0, 0xef,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0x32,0xb2, 0xf1,0xea,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0x34,0xb4, 0xf4,0xed,0xed,0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x37,0xb7, 0xf6,0xef,0xef,0xef,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0x39,0xb9, 0xf8,0xf1,0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0x3b,0xbb, 0xfa,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0x3d,0xbe, 0xfd,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0x40,0xc0, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x42,0xc2, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x44,0xc4, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x46,0xc6, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x48,0xc9, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4b,0xcb, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4d,0xcd, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4f,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x52,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x54,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x58,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5a,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5d,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5f,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5d,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x5a,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x58,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x56,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x54,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x51,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4f,0xcf, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4d,0xcd, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x4b,0xcb, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x48,0xc8, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x46,0xc6, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x44,0xc4, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x42,0xc1, 0xff,0xf9,0xf9,0xf9,0xf9,0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0x40,0xbf, 0xfe,0xf7,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0x3d,0xbd, 0xfc,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0x3b,0xbb, 0xfa,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0x39,0xb9, 0xf7,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0x36,0xb6, 0xf5,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xec,0x34,0xb4, 0xf3,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0x32,0xb2, 0xf1,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0x30,0xb0, 0xee,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0x30,0xad, 0xec,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0x30,0xab, 0xea,0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0x30,0xa9, 0xe8,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0x30,0xa7, 0xe6,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0x30,0xa4, 0xe3,0xdc,0xdc,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xda,0x30,0xa2, 0xe1,0xda,0xda,0xda,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,0x30,0xa0, 0xdf,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9,0xd9,0xa2,0x30,0xa3, 0xe2,0xda,0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xa5,0x30,0xa5, 0xe4,0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xde,0xa7,0x30,0xa7, 0xe6,0xde,0xde,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xe0,0xe0,0xe0,0xa9,0x30,0xa9, 0xe8,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,0xe2,0xe2,0xe2,0xab,0x30,0xab, 0xea,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,0xe4,0xe4,0xe4,0xad,0x30,0xae, 0xed,0xe5,0xe5,0xe5,0xe5,0xe5,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xb0,0x30,0xb0, 0xef,0xe7,0xe7,0xe7,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xb2,0x32,0xb2, 0xf1,0xe9,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,0xeb,0xb4,0x34,0xb4, 0xf4,0xec,0xec,0xec,0xec,0xec,0xec,0xed,0xed,0xed,0xed,0xed,0xed,0xb6,0x37,0xb7, 0xf6,0xee,0xee,0xee,0xee,0xef,0xef,0xef,0xef,0xef,0xef,0xef,0xf0,0xb9,0x39,0xb9, 0xf8,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf2,0xf2,0xf2,0xbb,0x3b,0xbb, 0xfa,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,0xf4,0xf4,0xbd,0x3d,0xbe, 0xfd,0xf5,0xf5,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xbf,0x40,0xc0, 0xff,0xf7,0xf7,0xf7,0xf7,0xf7,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc2,0x42,0xc2, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc4,0x44,0xc4, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc6,0x46,0xc6, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc8,0x48,0xc9, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcb,0x4b,0xcb, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcd,0x4d,0xcd, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x4f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x52,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x54,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x56,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x58,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5a,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5d,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5d,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5a,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x58,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x56,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x54,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x51,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x4f,0xcf, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcd,0x4d,0xcd, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcb,0x4b,0xcb, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc9,0x48,0xc8, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc6,0x46,0xc6, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc4,0x44,0xc4, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc2,0x42,0xc1, 0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xc0,0x40,0xbf, 0xfe,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xbd,0x3d,0xbd, 0xfc,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf2,0xf2,0xbb,0x3b,0xbb, 0xfa,0xf2,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,0xf0,0xb9,0x39,0xb9, 0xf7,0xef,0xef,0xef,0xef,0xef,0xef,0xee,0xee,0xee,0xee,0xee,0xee,0xb7,0x36,0xb6, 0xf5,0xed,0xed,0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xec,0xec,0xeb,0xb4,0x34,0xb4, 0xf3,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xe9,0xe9,0xb2,0x32,0xb2, 0xf1,0xe9,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xb0,0x30,0xb0, 0xee,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xae,0x30,0xad, 0xec,0xe4,0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe2,0xab,0x30,0xab, 0xea,0xe2,0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe0,0xa9,0x30,0xa9, 0xe8,0xe0,0xe0,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xde,0xde,0xde,0xa7,0x30,0xa7, 0xe6,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,0xdc,0xdc,0xdc,0xa5,0x30,0xa4, 0xe3,0xdb,0xdb,0xdb,0xdb,0xdb,0xda,0xda,0xda,0xda,0xda,0xda,0xda,0xa2,0x30,0xa2, 0xe1,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd7,0xd7,0xa0,0x30,0x60, 0xa0,0xe0,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd8,0xd8,0xd8,0xd8,0xa2,0x30,0x00,0x63, 0xa3,0xe2,0xd9,0xd9,0xd9,0xd9,0xda,0xda,0xda,0xda,0xda,0xda,0xa4,0x30,0x00,0x65, 0xa5,0xe4,0xdb,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdd,0xa7,0x30,0x00,0x67, 0xa7,0xe6,0xdd,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdf,0xdf,0xa9,0x30,0x00,0x69, 0xa9,0xe9,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xab,0x30,0x00,0x6b, 0xac,0xeb,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xad,0x30,0x00,0x6e, 0xae,0xed,0xe4,0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe5,0xe5,0xaf,0x30,0x00,0x70, 0xb0,0xef,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe8,0xb2,0x32,0x00,0x72, 0xb2,0xf1,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xea,0xea,0xea,0xb4,0x34,0x00,0x74, 0xb5,0xf4,0xeb,0xeb,0xeb,0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xb6,0x36,0x00,0x77, 0xb7,0xf6,0xed,0xed,0xed,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xb9,0x39,0x00,0x79, 0xb9,0xf8,0xef,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xbb,0x3b,0x00,0x7b, 0xbb,0xfb,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,0xf3,0xf3,0xf3,0xbd,0x3d,0x00,0x7e, 0xbe,0xfd,0xf4,0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xbf,0x40,0x00,0x80, 0xc0,0xff,0xf6,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xc1,0x42,0x02,0x82, 0xc2,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc4,0x44,0x04,0x84, 0xc4,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc6,0x46,0x06,0x86, 0xc6,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc8,0x48,0x08,0x89, 0xc9,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xca,0x4b,0x0b,0x8b, 0xcb,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcd,0x4d,0x0d,0x8d, 0xcd,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x4f,0x0f,0x8f, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x51,0x12,0x92, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x54,0x14,0x94, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x56,0x16,0x96, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x58,0x18,0x98, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5a,0x1a,0x9b, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5d,0x1d,0x9d, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5f,0x1f,0x9f, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5d,0x1d,0x9c, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x5a,0x1a,0x9a, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x58,0x18,0x98, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x56,0x16,0x96, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x54,0x14,0x94, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x52,0x11,0x91, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcf,0x4f,0x0f,0x8f, 0xcf,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcd,0x4d,0x0d,0x8d, 0xcd,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xcb,0x4b,0x0b,0x8b, 0xca,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc9,0x49,0x08,0x88, 0xc8,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc6,0x46,0x06,0x86, 0xc6,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc4,0x44,0x04,0x84, 0xc4,0xff,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xc2,0x42,0x02,0x81, 0xc1,0xff,0xf7,0xf7,0xf7,0xf7,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xc0,0x40,0x00,0x7f, 0xbf,0xfe,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,0xf4,0xf4,0xf4,0xf4,0xbe,0x3d,0x00,0x7d, 0xbd,0xfc,0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf1,0xbb,0x3b,0x00,0x7b, 0xbb,0xfa,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xef,0xef,0xef,0xb9,0x39,0x00,0x79, 0xb8,0xf7,0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xed,0xb7,0x37,0x00,0x76, 0xb6,0xf5,0xec,0xec,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xb4,0x34,0x00,0x74, 0xb4,0xf3,0xea,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xb2,0x32,0x00,0x72, 0xb2,0xf1,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xb0,0x30,0x00,0x70, 0xaf,0xee,0xe5,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4,0xe4,0xae,0x30,0x00,0x6d, 0xad,0xec,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xe2,0xab,0x30,0x00,0x6b, 0xab,0xea,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xe0,0xa9,0x30,0x00,0x69, 0xa9,0xe8,0xdf,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xdd,0xdd,0xa7,0x30,0x00,0x67, 0xa7,0xe5,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdb,0xdb,0xdb,0xdb,0xa5,0x30,0x00,0x64, 0xa4,0xe3,0xda,0xda,0xda,0xda,0xd9,0xd9,0xd9,0xd9,0xd9,0xd9,0xa3,0x30,0x00,0x62, 0xa2,0xe1,0xd8,0xd8,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd7,0xd6,0xa0,0x30,0x00 }; #endif milkytracker-0.90.85+dfsg/src/tracker/ResamplerHelper.h0000755000175000017500000000254511150223367022121 0ustar admin2admin2/* * tracker/ResamplerHelper.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ResamplerHelper.h * milkytracker * * Created by Peter Barth on 15.01.08. * */ #ifndef __RESAMPLERHELPER_H__ #define __RESAMPLERHELPER_H__ #include "BasicTypes.h" #include "ResamplerFactory.h" class ResamplerHelper { private: static const char* resamplerNames[]; static const char* resamplerNamesShort[]; public: pp_uint32 getNumResamplers(); const char* getResamplerName(pp_uint32 index, bool shortName = false); ChannelMixer::ResamplerBase* createResamplerFromIndex(pp_uint32 index); ChannelMixer::ResamplerTypes getResamplerType(pp_uint32 index, bool ramping); }; #endif milkytracker-0.90.85+dfsg/src/tracker/FileIdentificator.h0000644000175000017500000000273611150223367022412 0ustar admin2admin2/* * tracker/FileIdentificator.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * FileIdentificator.h * MilkyTracker * * Created by Peter Barth on 03.05.05. * */ #ifndef __FILEINDENTIFICATOR_H__ #define __FILEINDENTIFICATOR_H__ #include "BasicTypes.h" class XMFile; class FileIdentificator { public: enum FileTypes { FileTypeUnknown, FileTypeModule, FileTypeInstrument, FileTypeSample, FileTypePattern, FileTypeTrack, FileTypeCompressed }; private: PPSystemString fileName; XMFile* f; bool isModule(); bool isInstrument(); bool isSample(); bool isPattern(); bool isTrack(); bool isCompressed(); public: FileIdentificator(const PPSystemString& fileName); ~FileIdentificator(); bool isValid() { return f != NULL; } FileTypes getFileType(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionSettings.h0000644000175000017500000001011511150223367022141 0ustar admin2admin2/* * tracker/SectionSettings.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionSettings.h * MilkyTracker * * Created by Peter Barth on Sun Mar 13 2005. * */ #ifndef SECTIONSETTINGS__H #define SECTIONSETTINGS__H #include "BasicTypes.h" #include "Event.h" #include "SectionAbstract.h" #include "GlobalColorConfig.h" #ifdef __LOWRES__ #define NUMSETTINGSPAGES 4 #else #define NUMSETTINGSPAGES 5 #endif class PPControl; class PPContainer; class PPListBox; struct TColorPalette; struct TMixerSettings; class ColorPaletteContainer; class SectionSettings : public SectionAbstract { private: struct TColorDescriptor { const char* readableDecription; PPColor colorCopy; }; PPContainer* sectionContainer; PPContainer* currentActivePageContainer; PPListBox* listBoxColors; PPListBox* listBoxFontFamilies; PPListBox* listBoxFontEntries; PPColor currentColor, *colorCopy; bool visible; pp_int32 currentActiveTabNum; pp_int32 currentActivePageStart; PPSimpleVector > tabPages; pp_int32 currentActiveSubPageNum[NUMSETTINGSPAGES]; TColorDescriptor colorDescriptors[GlobalColorConfig::ColorLast]; pp_int32 colorMapping[GlobalColorConfig::ColorLast]; // Hold 5 predefined palettes ColorPaletteContainer* predefinedColorPalettes; TColorPalette* palette; bool storePalette; // backup of the current mixer settings, will be restored on cancel TMixerSettings* mixerSettings; PPSystemString lastColorFile; void showPage(pp_int32 page, pp_int32 subPage = 0); void showRestartMessageBox(); void initColorDescriptors(); void updateColors(); pp_int32 getColorIndex(); protected: virtual void showSection(bool bShow); public: SectionSettings(Tracker& tracker); virtual ~SectionSettings(); // PPEvent listener virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init(); virtual void init(pp_int32 x, pp_int32 y); virtual void show(bool bShow); virtual void update(bool repaint = true); void cancelSettings(); bool isVisible() { return visible; } private: // color palette handling pp_int32 getNumPredefinedColorPalettes(); PPString getEncodedPalette(pp_int32 index); void setEncodedPalette(pp_int32 index, const PPString& str); void storeCurrentPaletteToDatabase(); void saveCurrentGlobalPalette(); void restoreCurrentGlobalPalette(); void updateCurrentColors(); void restorePalettes(); // mixer settings handling void saveCurrentMixerSettings(TMixerSettings& settings); void restoreCurrentMixerSettings(); // font face handling void enumerateFontFacesInListBox(pp_uint32 fontID); // Custom resolution void storeCustomResolution(); // Show message box with custom resolutions void showCustomResolutionMessageBox(); // Message box which asks if default palettes should // be restored void showRestorePaletteMessageBox(); // Message box which asks for an audio driver void showSelectDriverMessageBox(); // Message box with list of resampler void showResamplerMessageBox(); void storeAudioDriver(const char* driverName); void storeResampler(pp_uint32 resampler); void importCurrentColorPalette(); void exportCurrentColorPalette(); void retrieveDisplayResolution(); // Responder should be friend friend class DialogResponderSettings; friend class TabPageLayout_2; friend class TabPageLayout_3; friend class TabPageFonts_1; friend class TabPageFonts_2; friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/sdl/0000755000175000017500000000000011317506110017422 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/tracker/sdl/SDL_KeyTranslation.h0000644000175000017500000000222311150223367023250 0ustar admin2admin2/* * tracker/sdl/SDL_KeyTranslation.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * KeyTranslation.h * MilkyTracker * * Created by Peter Barth on 19.11.05. * */ #ifndef KEYTRANSLATION__H #define KEYTRANSLATION__H #include #include "BasicTypes.h" // #define NOT_PC_KB // Set this if you're using non-PC type keyboard pp_uint16 toVK(const SDL_keysym& keysym); pp_uint16 toSC(const SDL_keysym& keysym); extern bool isX11; extern bool stdKb; #endif milkytracker-0.90.85+dfsg/src/tracker/sdl/SDL_KeyTranslation.cpp0000644000175000017500000003140011150223367023602 0ustar admin2admin2/* * tracker/sdl/SDL_KeyTranslation.cpp * * Copyright 2009 Peter Barth, Christopher O'Neill * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * KeyTranslation.cpp * MilkyTracker * * Created by Peter Barth on 19.11.05. * * 14/8/06 - Christopher O'Neill * PC specific code added to toSC - allows none qwerty layouts to work * Small fix in toSC * Various keys added to toVK - rewritten to use array instead of select */ bool isX11 = false; bool stdKb = true; #include "SDL_KeyTranslation.h" static const pp_uint16 sdl_keysym_to_vk[] = { SDLK_CARET, 0xC0, SDLK_WORLD_0, 0xBB, SDLK_WORLD_1, 0xBD, SDLK_PLUS, 0xDD, SDLK_WORLD_2, 0xDB, SDLK_RETURN, VK_RETURN, SDLK_WORLD_3, 0xDE, SDLK_WORLD_4, 0xBA, SDLK_HASH, 0xDC, SDLK_COMMA, 188, SDLK_PERIOD, 0xBF, SDLK_MINUS, 190, SDLK_TAB, VK_TAB, SDLK_SPACE, VK_SPACE, SDLK_LESS, 0xE2, SDLK_BACKSPACE, VK_BACK, SDLK_ESCAPE, VK_ESCAPE, SDLK_F1, VK_F1, SDLK_F2, VK_F2, SDLK_F3, VK_F3, SDLK_F4, VK_F4, SDLK_F5, VK_F5, SDLK_F6, VK_F6, SDLK_F7, VK_F7, SDLK_F8, VK_F8, SDLK_F9, VK_F9, SDLK_F10, VK_F10, SDLK_F11, VK_F11, SDLK_F12, VK_F12, SDLK_INSERT, VK_INSERT, SDLK_HOME, VK_HOME, SDLK_PAGEUP, VK_PRIOR, SDLK_DELETE, VK_DELETE, SDLK_END, VK_END, SDLK_PAGEDOWN, VK_NEXT, SDLK_LEFT, VK_LEFT, SDLK_RIGHT, VK_RIGHT, SDLK_DOWN, VK_DOWN, SDLK_UP, VK_UP, SDLK_LALT, VK_ALT, SDLK_LSHIFT, VK_SHIFT, SDLK_RSHIFT, VK_SHIFT, SDLK_LCTRL, VK_LCONTROL, SDLK_RCTRL, VK_RCONTROL, SDLK_MODE, VK_RMENU, // Numpad SDLK_KP0, VK_NUMPAD0, SDLK_KP1, VK_NUMPAD1, SDLK_KP2, VK_NUMPAD2, SDLK_KP3, VK_NUMPAD3, SDLK_KP4, VK_NUMPAD4, SDLK_KP5, VK_NUMPAD5, SDLK_KP6, VK_NUMPAD6, SDLK_KP7, VK_NUMPAD7, SDLK_KP8, VK_NUMPAD8, SDLK_KP9, VK_NUMPAD9, SDLK_KP_PERIOD, VK_DECIMAL, SDLK_KP_DIVIDE, VK_DIVIDE, SDLK_KP_MULTIPLY, VK_MULTIPLY, SDLK_KP_MINUS, VK_SUBTRACT, SDLK_KP_PLUS, VK_ADD, SDLK_KP_ENTER, VK_SEPARATOR }; pp_uint16 toVK(const SDL_keysym& keysym) { if (keysym.sym >= SDLK_a && keysym.sym <= SDLK_z) return (pp_uint16)keysym.sym-32; // azerty keyboards won't work with this, they get fixed in SDL_Main.cpp if (keysym.sym >= SDLK_0 && keysym.sym <= SDLK_9) return (pp_uint16)keysym.sym; for(int i=0; i < sizeof(sdl_keysym_to_vk)/2; i+=2) if(sdl_keysym_to_vk[i] == keysym.sym) return sdl_keysym_to_vk[i+1]; return 0; } static const pp_uint32 sdl_keycode_to_pc_keycode[] = { 0x00, /* 0 SDLK_UNKNOWN */ 0x00, /* 1 */ 0x00, /* 2 */ 0x00, /* 3 */ 0x00, /* 4 */ 0x00, /* 5 */ 0x00, /* 6 */ 0x00, /* 7 */ 0x0e, /* 8 SDLK_BACKSPACE */ 0x0f, /* 9 SDLK_TAB */ 0x00, /* 10 */ 0x00, /* 11 */ 0x00, /* 12 SDLK_CLEAR */ 0x1c, /* 13 SDLK_RETURN */ 0x00, /* 14 */ 0x00, /* 15 */ 0x00, /* 16 */ 0x00, /* 17 */ 0x00, /* 18 */ 0x451de1, /* 19 SDLK_PAUSE */ 0x00, /* 20 */ 0x00, /* 21 */ 0x00, /* 22 */ 0x00, /* 23 */ 0x00, /* 24 */ 0x00, /* 25 */ 0x00, /* 26 */ 0x01, /* 27 SDLK_ESCAPE */ 0x00, /* 28 */ 0x00, /* 29 */ 0x00, /* 30 */ 0x00, /* 31 */ 0x39, /* 32 SDLK_SPACE */ 0x02, /* 33 SDLK_EXCLAIM */ 0x28, /* 34 SDLK_QUOTEDBL */ 0x04, /* 35 SDLK_HASH */ 0x05, /* 36 SDLK_DOLLAR */ 0x00, /* 37 */ 0x08, /* 38 SDLK_AMPERSAND */ 0x28, /* 39 SDLK_QUOTE */ 0x0a, /* 40 SDLK_LEFTPAREN */ 0x0b, /* 41 SDLK_RIGHTPAREN */ 0x09, /* 42 SDLK_ASTERISK */ 0x0d, /* 43 SDLK_PLUS */ 0x33, /* 44 SDLK_COMMA */ 0x0c, /* 45 SDLK_MINUS */ 0x34, /* 46 SDLK_PERIOD */ 0x35, /* 47 SDLK_SLASH */ 0x0b, /* 48 SDLK_0 */ 0x02, /* 49 SDLK_1 */ 0x03, /* 50 SDLK_2 */ 0x04, /* 51 SDLK_3 */ 0x05, /* 52 SDLK_4 */ 0x06, /* 53 SDLK_5 */ 0x07, /* 54 SDLK_6 */ 0x08, /* 55 SDLK_7 */ 0x09, /* 56 SDLK_8 */ 0x0a, /* 57 SDLK_9 */ 0x27, /* 58 SDLK_COLON */ 0x27, /* 59 SDLK_SEMICOLON */ 0x33, /* 60 SDLK_LESS */ 0x0d, /* 61 SDLK_EQUALS */ 0x34, /* 62 SDLK_GREATER */ 0x35, /* 63 SDLK_QUESTION */ 0x03, /* 64 SDLK_AT */ 0x00, /* 65 */ 0x00, /* 66 */ 0x00, /* 67 */ 0x00, /* 68 */ 0x00, /* 69 */ 0x00, /* 70 */ 0x00, /* 71 */ 0x00, /* 72 */ 0x00, /* 73 */ 0x00, /* 74 */ 0x00, /* 75 */ 0x00, /* 76 */ 0x00, /* 77 */ 0x00, /* 78 */ 0x00, /* 79 */ 0x00, /* 80 */ 0x00, /* 81 */ 0x00, /* 82 */ 0x00, /* 83 */ 0x00, /* 84 */ 0x00, /* 85 */ 0x00, /* 86 */ 0x00, /* 87 */ 0x00, /* 88 */ 0x00, /* 89 */ 0x00, /* 90 */ 0x1a, /* 91 SDLK_LEFTBRACKET */ 0x2b, /* 92 SDLK_BACKSLASH */ 0x1b, /* 93 SDLK_RIGHTBRACKET */ 0x07, /* 94 SDLK_CARET */ 0x0c, /* 95 SDLK_UNDERSCORE */ 0x29, /* 96 SDLK_BACKQUOTE */ 0x1e, /* 97 SDLK_a */ 0x30, /* 98 SDLK_b */ 0x2e, /* 99 SDLK_c */ 0x20, /* 100 SDLK_d */ 0x12, /* 101 SDLK_e */ 0x21, /* 102 SDLK_f */ 0x22, /* 103 SDLK_g */ 0x23, /* 104 SDLK_h */ 0x17, /* 105 SDLK_i */ 0x24, /* 106 SDLK_j */ 0x25, /* 107 SDLK_k */ 0x26, /* 108 SDLK_l */ 0x32, /* 109 SDLK_m */ 0x31, /* 110 SDLK_n */ 0x18, /* 111 SDLK_o */ 0x19, /* 112 SDLK_p */ 0x10, /* 113 SDLK_q */ 0x13, /* 114 SDLK_r */ 0x1f, /* 115 SDLK_s */ 0x14, /* 116 SDLK_t */ 0x16, /* 117 SDLK_u */ 0x2f, /* 118 SDLK_v */ 0x11, /* 119 SDLK_w */ 0x2d, /* 120 SDLK_x */ 0x15, /* 121 SDLK_y */ 0x2c, /* 122 SDLK_z */ 0x00, /* 123 */ 0x00, /* 124 */ 0x00, /* 125 */ 0x00, /* 126 */ 0x00, /* 127 SDLK_DELETE */ 0x00, /* 128 */ 0x00, /* 129 */ 0x00, /* 130 */ 0x00, /* 131 */ 0x00, /* 132 */ 0x00, /* 133 */ 0x00, /* 134 */ 0x00, /* 135 */ 0x00, /* 136 */ 0x00, /* 137 */ 0x00, /* 138 */ 0x00, /* 139 */ 0x00, /* 140 */ 0x00, /* 141 */ 0x00, /* 142 */ 0x00, /* 143 */ 0x00, /* 144 */ 0x00, /* 145 */ 0x00, /* 146 */ 0x00, /* 147 */ 0x00, /* 148 */ 0x00, /* 149 */ 0x00, /* 150 */ 0x00, /* 151 */ 0x00, /* 152 */ 0x00, /* 153 */ 0x00, /* 154 */ 0x00, /* 155 */ 0x00, /* 156 */ 0x00, /* 157 */ 0x00, /* 158 */ 0x00, /* 159 */ 0x00, /* 160 SDLK_WORLD_0 */ 0x00, /* 161 SDLK_WORLD_1 */ 0x00, /* 162 SDLK_WORLD_2 */ 0x00, /* 163 SDLK_WORLD_3 */ 0x00, /* 164 SDLK_WORLD_4 */ 0x00, /* 165 SDLK_WORLD_5 */ 0x00, /* 166 SDLK_WORLD_6 */ 0x00, /* 167 SDLK_WORLD_7 */ 0x00, /* 168 SDLK_WORLD_8 */ 0x00, /* 169 SDLK_WORLD_9 */ 0x00, /* 170 SDLK_WORLD_10 */ 0x00, /* 171 SDLK_WORLD_11 */ 0x00, /* 172 SDLK_WORLD_12 */ 0x00, /* 173 SDLK_WORLD_13 */ 0x00, /* 174 SDLK_WORLD_14 */ 0x00, /* 175 SDLK_WORLD_15 */ 0x00, /* 176 SDLK_WORLD_16 */ 0x00, /* 177 SDLK_WORLD_17 */ 0x00, /* 178 SDLK_WORLD_18 */ 0x00, /* 179 SDLK_WORLD_19 */ 0x00, /* 180 SDLK_WORLD_20 */ 0x00, /* 181 SDLK_WORLD_21 */ 0x00, /* 182 SDLK_WORLD_22 */ 0x00, /* 183 SDLK_WORLD_23 */ 0x00, /* 184 SDLK_WORLD_24 */ 0x00, /* 185 SDLK_WORLD_25 */ 0x00, /* 186 SDLK_WORLD_26 */ 0x00, /* 187 SDLK_WORLD_27 */ 0x00, /* 188 SDLK_WORLD_28 */ 0x00, /* 189 SDLK_WORLD_29 */ 0x00, /* 190 SDLK_WORLD_30 */ 0x00, /* 191 SDLK_WORLD_31 */ 0x00, /* 192 SDLK_WORLD_32 */ 0x00, /* 193 SDLK_WORLD_33 */ 0x00, /* 194 SDLK_WORLD_34 */ 0x00, /* 195 SDLK_WORLD_35 */ 0x00, /* 196 SDLK_WORLD_36 */ 0x00, /* 197 SDLK_WORLD_37 */ 0x00, /* 198 SDLK_WORLD_38 */ 0x00, /* 199 SDLK_WORLD_39 */ 0x00, /* 200 SDLK_WORLD_40 */ 0x00, /* 201 SDLK_WORLD_41 */ 0x00, /* 202 SDLK_WORLD_42 */ 0x00, /* 203 SDLK_WORLD_43 */ 0x00, /* 204 SDLK_WORLD_44 */ 0x00, /* 205 SDLK_WORLD_45 */ 0x00, /* 206 SDLK_WORLD_46 */ 0x00, /* 207 SDLK_WORLD_47 */ 0x00, /* 208 SDLK_WORLD_48 */ 0x00, /* 209 SDLK_WORLD_49 */ 0x00, /* 210 SDLK_WORLD_50 */ 0x00, /* 211 SDLK_WORLD_51 */ 0x00, /* 212 SDLK_WORLD_52 */ 0x00, /* 213 SDLK_WORLD_53 */ 0x00, /* 214 SDLK_WORLD_54 */ 0x00, /* 215 SDLK_WORLD_55 */ 0x00, /* 216 SDLK_WORLD_56 */ 0x00, /* 217 SDLK_WORLD_57 */ 0x00, /* 218 SDLK_WORLD_58 */ 0x00, /* 219 SDLK_WORLD_59 */ 0x00, /* 220 SDLK_WORLD_60 */ 0x00, /* 221 SDLK_WORLD_61 */ 0x00, /* 222 SDLK_WORLD_62 */ 0x00, /* 223 SDLK_WORLD_63 */ 0x00, /* 224 SDLK_WORLD_64 */ 0x00, /* 225 SDLK_WORLD_65 */ 0x00, /* 226 SDLK_WORLD_66 */ 0x00, /* 227 SDLK_WORLD_67 */ 0x00, /* 228 SDLK_WORLD_68 */ 0x00, /* 229 SDLK_WORLD_69 */ 0x00, /* 230 SDLK_WORLD_70 */ 0x00, /* 231 SDLK_WORLD_71 */ 0x00, /* 232 SDLK_WORLD_72 */ 0x00, /* 233 SDLK_WORLD_73 */ 0x00, /* 234 SDLK_WORLD_74 */ 0x00, /* 235 SDLK_WORLD_75 */ 0x00, /* 236 SDLK_WORLD_76 */ 0x00, /* 237 SDLK_WORLD_77 */ 0x00, /* 238 SDLK_WORLD_78 */ 0x00, /* 239 SDLK_WORLD_79 */ 0x00, /* 240 SDLK_WORLD_80 */ 0x00, /* 241 SDLK_WORLD_81 */ 0x00, /* 242 SDLK_WORLD_82 */ 0x00, /* 243 SDLK_WORLD_83 */ 0x00, /* 244 SDLK_WORLD_84 */ 0x00, /* 245 SDLK_WORLD_85 */ 0x00, /* 246 SDLK_WORLD_86 */ 0x00, /* 247 SDLK_WORLD_87 */ 0x00, /* 248 SDLK_WORLD_88 */ 0x00, /* 249 SDLK_WORLD_89 */ 0x00, /* 250 SDLK_WORLD_90 */ 0x00, /* 251 SDLK_WORLD_91 */ 0x00, /* 252 SDLK_WORLD_92 */ 0x00, /* 253 SDLK_WORLD_93 */ 0x00, /* 254 SDLK_WORLD_94 */ 0x00, /* 255 SDLK_WORLD_95 */ 0x52, /* 256 SDLK_KP0 */ 0x4f, /* 257 SDLK_KP1 */ 0x50, /* 258 SDLK_KP2 */ 0x51, /* 259 SDLK_KP3 */ 0x4b, /* 260 SDLK_KP4 */ 0x4c, /* 261 SDLK_KP5 */ 0x4d, /* 262 SDLK_KP6 */ 0x47, /* 263 SDLK_KP7 */ 0x48, /* 264 SDLK_KP8 */ 0x49, /* 265 SDLK_KP9 */ 0x53, /* 266 SDLK_KP_PERIOD */ 0x35e0, /* 267 SDLK_KP_DIVIDE */ 0x37, /* 268 SDLK_KP_MULTIPLY */ 0x4a, /* 269 SDLK_KP_MINUS */ 0x4e, /* 270 SDLK_KP_PLUS */ 0x1ce0, /* 271 SDLK_KP_ENTER */ 0x00, /* 272 SDLK_KP_EQUALS */ 0x48e0, /* 273 SDLK_UP */ 0x50e0, /* 274 SDLK_DOWN */ 0x4de0, /* 275 SDLK_RIGHT */ 0x4be0, /* 276 SDLK_LEFT */ 0x52e0, /* 277 SDLK_INSERT */ 0x47e0, /* 278 SDLK_HOME */ 0x4fe0, /* 279 SDLK_END */ 0x49e0, /* 280 SDLK_PAGEUP */ 0x51e0, /* 281 SDLK_PAGEDOWN */ 0x3b, /* 282 SDLK_F1 */ 0x3c, /* 283 SDLK_F2 */ 0x3d, /* 284 SDLK_F3 */ 0x3e, /* 285 SDLK_F4 */ 0x3f, /* 286 SDLK_F5 */ 0x40, /* 287 SDLK_F6 */ 0x41, /* 288 SDLK_F7 */ 0x42, /* 289 SDLK_F8 */ 0x43, /* 290 SDLK_F9 */ 0x44, /* 291 SDLK_F10 */ 0x57, /* 292 SDLK_F11 */ 0x58, /* 293 SDLK_F12 */ 0x00, /* 294 SDLK_F13 */ 0x00, /* 295 SDLK_F14 */ 0x00, /* 296 SDLK_F15 */ 0x00, /* 297 */ 0x00, /* 298 */ 0x00, /* 299 */ 0x45, /* 300 SDLK_NUMLOCK */ 0x3a, /* 301 SDLK_CAPSLOCK */ 0x46, /* 302 SDLK_SCROLLOCK */ 0x36, /* 303 SDLK_RSHIFT */ 0x2a, /* 304 SDLK_LSHIFT */ 0x1de0, /* 305 SDLK_RCTRL */ 0x1d, /* 306 SDLK_LCTRL */ 0x38e0, /* 307 SDLK_RALT */ 0x38, /* 308 SDLK_LALT */ 0x5be0, /* 309 SDLK_RMETA -- Apple Command keys*/ 0x5ce0, /* 310 SDLK_LMETA */ 0x5be0, /* 311 SDLK_LSUPER -- Windows keys */ 0x5ce0, /* 312 SDLK_RSUPER */ 0x00, /* 313 SDLK_MODE -- Alt Gr */ 0x00, /* 314 SDLK_COMPOSE */ 0x00, /* 315 SDLK_HELP */ 0x00, /* 316 SDLK_PRINT */ 0x00, /* 317 SDLK_SYSREQ */ 0x00, /* 318 SDLK_BREAK */ 0x5de0, /* 319 SDLK_MENU */ 0x00, /* 320 SDLK_POWER */ 0x00, /* 321 SDLK_EURO */ 0x00, /* 322 SDLK_UNDO */ }; pp_uint16 toSC(const SDL_keysym& keysym) { #ifndef NOT_PC_KB // WARNING!!!! // The next line will only work on X11 systems - I've no idea what will happen // with anything else if(isX11 && stdKb) return keysym.scancode - 8; else if(stdKb) return keysym.scancode; #endif int keycode, v; if (keysym.sym > SDLK_LAST) { keycode = 0; } else { keycode = sdl_keycode_to_pc_keycode[keysym.sym]; } return keycode; } milkytracker-0.90.85+dfsg/src/tracker/sdl/SDL_Main.cpp0000644000175000017500000006270011150223367021526 0ustar admin2admin2/* * tracker/sdl/SDL_Main.cpp * * Copyright 2009 Peter Barth, Christopher O'Neill * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SDL_Main.cpp * MilkyTracker SDL front end * * Created by Peter Barth on 19.11.05. * * 15/2/08 - Peter Barth * This code needs major clean up, there are too many workarounds going on * for different platforms/configurations (MIDI, GP2X etc.) * Please do not further pollute this single source code when possible * * 14/8/06 - Christopher O'Neill * Ok, there are so many changes in this file that I've lost track... * Here are some I remember: * - ALSA Midi Support * - GP2X mouse emulator (awaiting a rewrite one day..) * - Various command line options * - Fix for french azerty keyboards (their number keys are shifted) * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #ifndef __QTOPIA__ #ifdef HAVE_X11 #include #endif #endif #include "SDL_KeyTranslation.h" // ---------------------------- Tracker includes ---------------------------- #include "PPUI.h" #include "DisplayDevice_SDL.h" #include "DisplayDeviceFB_SDL.h" #ifdef __OPENGL__ #include "DisplayDeviceOGL_SDL.h" // <-- Experimental, slow #endif #include "Screen.h" #include "Tracker.h" #include "PPMutex.h" #include "PPSystem_POSIX.h" #include "PPPath_POSIX.h" #ifdef HAVE_LIBASOUND #include "../midi/posix/MidiReceiver_pthread.h" #endif // -------------------------------------------------------------------------- // SDL surface screen SDL_Surface* screen = NULL; SDL_TimerID timer; // Tracker globals static PPScreen* myTrackerScreen = NULL; static Tracker* myTracker = NULL; static PPDisplayDevice* myDisplayDevice = NULL; #ifdef HAVE_LIBASOUND static MidiReceiver* myMidiReceiver = NULL; #endif // Okay what else do we need? PPMutex* globalMutex = NULL; static PPMutex* timerMutex = NULL; static bool ticking = false; static pp_uint32 lmyTime; static PPPoint llastClickPosition = PPPoint(0,0); static pp_uint16 lClickCount = 0; static pp_uint32 rmyTime; static PPPoint rlastClickPosition = PPPoint(0,0); static pp_uint16 rClickCount = 0; static bool lMouseDown = false; static pp_uint32 lButtonDownStartTime; static bool rMouseDown = false; static pp_uint32 rButtonDownStartTime; static pp_uint32 timerTicker = 0; static PPPoint p; // This needs to be visible from outside pp_uint32 PPGetTickCount() { return SDL_GetTicks(); } // Same as above void QueryKeyModifiers() { pp_uint32 mod = SDL_GetModState(); if((mod & KMOD_LSHIFT) || (mod & KMOD_RSHIFT)) setKeyModifier(KeyModifierSHIFT); else clearKeyModifier(KeyModifierSHIFT); if((mod & KMOD_LCTRL) || (mod & KMOD_RCTRL)) setKeyModifier(KeyModifierCTRL); else clearKeyModifier(KeyModifierCTRL); if((mod & KMOD_LALT) || (mod & KMOD_RALT)) setKeyModifier(KeyModifierALT); else clearKeyModifier(KeyModifierALT); } static void RaiseEventSerialized(PPEvent* event) { if (myTrackerScreen && myTracker) { globalMutex->lock(); myTrackerScreen->raiseEvent(event); globalMutex->unlock(); } } #ifdef __GP2X__ struct { bool up, down, left, right, upLeft, upRight, downLeft, downRight; pp_int32 x, y; pp_int32 ticks; pp_int32 button; } mouse; void gp2xMouseEvent(const SDL_Event& event) { bool buttonPressed; if(event.type == SDL_JOYBUTTONDOWN) buttonPressed = true; else buttonPressed = false; switch(event.jbutton.button) { case 0: // Up mouse.up = buttonPressed; break; case 4: // Down mouse.down = buttonPressed; break; case 2: // Left mouse.left = buttonPressed; break; case 6: // Right mouse.right = buttonPressed; break; case 1: // upLeft mouse.upLeft = buttonPressed; break; case 7: // upRight mouse.upRight = buttonPressed; break; case 3: // downLeft mouse.downLeft = buttonPressed; break; case 5: // downRight mouse.downRight = buttonPressed; break; case 18: // Click case 12: SDL_Event myEvent; if (buttonPressed) { myEvent.type = SDL_MOUSEBUTTONDOWN; myEvent.button.type = SDL_MOUSEBUTTONDOWN; myEvent.button.state = SDL_PRESSED; mouse.button = 1; } else { myEvent.type = SDL_MOUSEBUTTONUP; myEvent.button.type = SDL_MOUSEBUTTONUP; myEvent.button.state = SDL_RELEASED; mouse.button = 0; } myEvent.button.x = mouse.x; myEvent.button.y = mouse.y; myEvent.button.button = SDL_BUTTON_LEFT; SDL_PushEvent(&myEvent); break; case 8: // Start if (!buttonPressed) { pp_uint16 chr[3] = {VK_RETURN, 0, 0}; PPEvent event(eKeyDown, &chr, sizeof(chr)); } break; } } void gp2xMouseMove() { const int xMax = 320, yMax = 240; static int oldX = 0, oldY = 0; int step; if(mouse.ticks < 25) step = 1; else if(mouse.ticks < 75) step = 2; else if(mouse.ticks < 125) step = 3; if(mouse.up || mouse.upLeft || mouse.upRight) mouse.y -= step; if(mouse.down || mouse.downLeft || mouse.downRight) mouse.y += step; if(mouse.left || mouse.downLeft || mouse.upLeft) mouse.x -= step; if(mouse.right || mouse.downRight || mouse.upRight) mouse.x += step; if(mouse.x == oldX && mouse.y == oldY) { mouse.ticks = 0; return; } oldX = mouse.x; oldY = mouse.y; if(mouse.x > xMax) mouse.x = xMax; if(mouse.x < 0) mouse.x = 0; if(mouse.y > yMax) mouse.y = yMax; if(mouse.y < 0) mouse.y = 0; SDL_WarpMouse(mouse.x, mouse.y); if(mouse.ticks < 125) mouse.ticks++; } #endif enum SDLUserEvents { SDLUserEventTimer, SDLUserEventLMouseRepeat, SDLUserEventRMouseRepeat, SDLUserEventMidiKeyDown, SDLUserEventMidiKeyUp, }; static SDLCALL Uint32 timerCallback(Uint32 interval) { timerMutex->lock(); if (!myTrackerScreen || !myTracker || !ticking) { timerMutex->unlock(); return interval; } SDL_UserEvent ev; ev.type = SDL_USEREVENT; if (!(timerTicker % 1)) { ev.code = SDLUserEventTimer; SDL_PushEvent((SDL_Event*)&ev); //PPEvent myEvent(eTimer); //RaiseEventSerialized(&myEvent); } timerTicker++; #ifdef __GP2X__ gp2xMouseMove(); #endif if (lMouseDown && (timerTicker - lButtonDownStartTime) > 25) { ev.code = SDLUserEventLMouseRepeat; ev.data1 = (void*)p.x; ev.data2 = (void*)p.y; SDL_PushEvent((SDL_Event*)&ev); //PPEvent myEvent(eLMouseRepeat, &p, sizeof(PPPoint)); //RaiseEventSerialized(&myEvent); } if (rMouseDown && (timerTicker - rButtonDownStartTime) > 25) { ev.code = SDLUserEventRMouseRepeat; ev.data1 = (void*)p.x; ev.data2 = (void*)p.y; SDL_PushEvent((SDL_Event*)&ev); //PPEvent myEvent(eRMouseRepeat, &p, sizeof(PPPoint)); //RaiseEventSerialized(&myEvent); } timerMutex->unlock(); return interval; } #ifdef HAVE_LIBASOUND class MidiEventHandler : public MidiReceiver::MidiEventHandler { public: virtual void keyDown(int note, int volume) { SDL_UserEvent ev; ev.type = SDL_USEREVENT; ev.code = SDLUserEventMidiKeyDown; ev.data1 = (void*)note; ev.data2 = (void*)volume; SDL_PushEvent((SDL_Event*)&ev); //globalMutex->lock(); //myTracker->sendNoteDown(note, volume); //globalMutex->unlock(); } virtual void keyUp(int note) { SDL_UserEvent ev; ev.type = SDL_USEREVENT; ev.code = SDLUserEventMidiKeyUp; ev.data1 = (void*)note; SDL_PushEvent((SDL_Event*)&ev); //globalMutex->lock(); //myTracker->sendNoteUp(note); //globalMutex->unlock(); } } midiEventHandler; void StopMidiRecording() { if (myMidiReceiver) { myMidiReceiver->stopRecording(); } } void StartMidiRecording(unsigned int devID) { if (devID == (unsigned)-1) return; StopMidiRecording(); myMidiReceiver = new MidiReceiver(midiEventHandler); if (!myMidiReceiver->startRecording(devID)) { // Deal with error fprintf(stderr, "Failed to initialise ALSA MIDI support.\n"); } } void InitMidi() { StartMidiRecording(0); } #endif void translateMouseDownEvent(pp_int32 mouseButton, pp_int32 localMouseX, pp_int32 localMouseY) { if (mouseButton > 2 || !mouseButton) return; // ----------------------------- myDisplayDevice->transform(localMouseX, localMouseY); p.x = localMouseX; p.y = localMouseY; if (mouseButton == 1) { PPEvent myEvent(eLMouseDown, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); lMouseDown = true; lButtonDownStartTime = timerTicker; if (!lClickCount) { lmyTime = PPGetTickCount(); llastClickPosition.x = localMouseX; llastClickPosition.y = localMouseY; } else if (lClickCount == 2) { pp_uint32 deltat = PPGetTickCount() - lmyTime; if (deltat > 500) { lClickCount = 0; lmyTime = PPGetTickCount(); llastClickPosition.x = localMouseX; llastClickPosition.y = localMouseY; } } lClickCount++; } else if (mouseButton == 2) { PPEvent myEvent(eRMouseDown, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); rMouseDown = true; rButtonDownStartTime = timerTicker; if (!rClickCount) { rmyTime = PPGetTickCount(); rlastClickPosition.x = localMouseX; rlastClickPosition.y = localMouseY; } else if (rClickCount == 2) { pp_uint32 deltat = PPGetTickCount() - rmyTime; if (deltat > 500) { rClickCount = 0; rmyTime = PPGetTickCount(); rlastClickPosition.x = localMouseX; rlastClickPosition.y = localMouseY; } } rClickCount++; } } void translateMouseUpEvent(pp_int32 mouseButton, pp_int32 localMouseX, pp_int32 localMouseY) { myDisplayDevice->transform(localMouseX, localMouseY); if (mouseButton == SDL_BUTTON_WHEELDOWN) { TMouseWheelEventParams mouseWheelParams; mouseWheelParams.pos.x = localMouseX; mouseWheelParams.pos.y = localMouseY; mouseWheelParams.delta = -1; PPEvent myEvent(eMouseWheelMoved, &mouseWheelParams, sizeof(mouseWheelParams)); RaiseEventSerialized(&myEvent); } else if (mouseButton == SDL_BUTTON_WHEELUP) { TMouseWheelEventParams mouseWheelParams; mouseWheelParams.pos.x = localMouseX; mouseWheelParams.pos.y = localMouseY; mouseWheelParams.delta = 1; PPEvent myEvent(eMouseWheelMoved, &mouseWheelParams, sizeof(mouseWheelParams)); RaiseEventSerialized(&myEvent); } else if (mouseButton > 2 || !mouseButton) return; // ----------------------------- if (mouseButton == 1) { lClickCount++; if (lClickCount >= 4) { pp_uint32 deltat = PPGetTickCount() - lmyTime; if (deltat < 500) { p.x = localMouseX; p.y = localMouseY; if (abs(p.x - llastClickPosition.x) < 4 && abs(p.y - llastClickPosition.y) < 4) { PPEvent myEvent(eLMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } } lClickCount = 0; } p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eLMouseUp, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); lMouseDown = false; } else if (mouseButton == 2) { rClickCount++; if (rClickCount >= 4) { pp_uint32 deltat = PPGetTickCount() - rmyTime; if (deltat < 500) { p.x = localMouseX; p.y = localMouseY; if (abs(p.x - rlastClickPosition.x) < 4 && abs(p.y - rlastClickPosition.y) < 4) { PPEvent myEvent(eRMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } } rClickCount = 0; } p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eRMouseUp, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); rMouseDown = false; } } void translateMouseMoveEvent(pp_int32 mouseButton, pp_int32 localMouseX, pp_int32 localMouseY) { myDisplayDevice->transform(localMouseX, localMouseY); if (mouseButton == 0) { p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eMouseMoved, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } else { if (mouseButton > 2 || !mouseButton) return; p.x = localMouseX; p.y = localMouseY; if (mouseButton == 1 && lMouseDown) { PPEvent myEvent(eLMouseDrag, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } else if (rMouseDown) { PPEvent myEvent(eRMouseDrag, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); } } } void preTranslateKey(SDL_keysym& keysym) { // Rotate cursor keys if necessary switch (myDisplayDevice->getOrientation()) { case PPDisplayDevice::ORIENTATION_ROTATE90CW: switch (keysym.sym) { case SDLK_UP: keysym.sym = SDLK_LEFT; break; case SDLK_DOWN: keysym.sym = SDLK_RIGHT; break; case SDLK_LEFT: keysym.sym = SDLK_DOWN; break; case SDLK_RIGHT: keysym.sym = SDLK_UP; break; } break; case PPDisplayDevice::ORIENTATION_ROTATE90CCW: switch (keysym.sym) { case SDLK_DOWN: keysym.sym = SDLK_LEFT; break; case SDLK_UP: keysym.sym = SDLK_RIGHT; break; case SDLK_RIGHT: keysym.sym = SDLK_DOWN; break; case SDLK_LEFT: keysym.sym = SDLK_UP; break; } break; } } void translateKeyDownEvent(const SDL_Event& event) { SDL_keysym keysym = event.key.keysym; // ALT+RETURN = Fullscreen toggle if (keysym.sym == SDLK_RETURN && (keysym.mod & KMOD_LALT)) { PPEvent myEvent(eFullScreen); RaiseEventSerialized(&myEvent); return; } preTranslateKey(keysym); pp_uint16 character = event.key.keysym.unicode; pp_uint16 chr[3] = {toVK(keysym), toSC(keysym), character}; #ifndef NOT_PC_KB // Hack for azerty keyboards (num keys are shifted, so we use the scancodes) if (stdKb) { if (chr[1] >= 2 && chr[1] <= 10) chr[0] = chr[1] + 47; // 1-9 else if (chr[1] == 11) chr[0] = 48; // 0 } #endif PPEvent myEvent(eKeyDown, &chr, sizeof(chr)); RaiseEventSerialized(&myEvent); if(character == 127) character = VK_BACK; if (character >= 32 && character <= 127) { PPEvent myEvent2(eKeyChar, &character, sizeof(character)); RaiseEventSerialized(&myEvent2); } } void translateKeyUpEvent(const SDL_Event& event) { SDL_keysym keysym = event.key.keysym; preTranslateKey(keysym); pp_uint16 character = event.key.keysym.unicode; pp_uint16 chr[3] = {toVK(keysym), toSC(keysym), character}; #ifndef NOT_PC_KB if (stdKb) { if(chr[1] >= 2 && chr[1] <= 10) chr[0] = chr[1] + 47; else if(chr[1] == 11) chr[0] = 48; } #endif PPEvent myEvent(eKeyUp, &chr, sizeof(chr)); RaiseEventSerialized(&myEvent); } void processSDLEvents(const SDL_Event& event) { pp_uint32 mouseButton = 0; switch (event.type) { case SDL_MOUSEBUTTONDOWN: mouseButton = event.button.button; if (mouseButton > 1 && mouseButton <= 3) mouseButton = 2; translateMouseDownEvent(mouseButton, event.button.x, event.button.y); break; case SDL_MOUSEBUTTONUP: mouseButton = event.button.button; if (mouseButton > 1 && mouseButton <= 3) mouseButton = 2; translateMouseUpEvent(mouseButton, event.button.x, event.button.y); break; case SDL_MOUSEMOTION: #ifdef __GP2X__ translateMouseMoveEvent(mouse.button, event.motion.x, event.motion.y); #else translateMouseMoveEvent(event.button.button, event.motion.x, event.motion.y); #endif break; case SDL_KEYDOWN: translateKeyDownEvent(event); break; case SDL_KEYUP: translateKeyUpEvent(event); break; #ifdef __GP2X__ case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: gp2xMouseEvent(event); break; #endif } } void processSDLUserEvents(const SDL_UserEvent& event) { switch (event.code) { case SDLUserEventTimer: { PPEvent myEvent(eTimer); RaiseEventSerialized(&myEvent); break; } case SDLUserEventLMouseRepeat: { PPPoint p; p.x = (pp_int32)event.data1; p.y = (pp_int32)event.data2; PPEvent myEvent(eLMouseRepeat, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); break; } case SDLUserEventRMouseRepeat: { PPPoint p; p.x = (pp_int32)event.data1; p.y = (pp_int32)event.data2; PPEvent myEvent(eRMouseRepeat, &p, sizeof(PPPoint)); RaiseEventSerialized(&myEvent); break; } case SDLUserEventMidiKeyDown: { pp_int32 note = (pp_int32)event.data1; pp_int32 volume = (pp_int32)event.data2; globalMutex->lock(); myTracker->sendNoteDown(note, volume); globalMutex->unlock(); break; } case SDLUserEventMidiKeyUp: { pp_int32 note = (pp_int32)event.data1; globalMutex->lock(); myTracker->sendNoteUp(note); globalMutex->unlock(); break; } } } #ifdef __unix__ void crashHandler(int signum) { // Save backup.xm static char buffer[1024]; // Should be enough :p strncpy(buffer, getenv("HOME"), 1010); strcat(buffer, "/BACKUP00.XM"); struct stat statBuf; int num = 1; while(stat(buffer, &statBuf) == 0 && num <= 100) snprintf(buffer, sizeof(buffer), "%s/BACKUP%02i.XM", getenv("HOME"), num++); if (signum == 15) { fprintf(stderr, "\nTERM signal received.\n"); SDL_Quit(); return; } else { fprintf(stderr, "\nCrashed with signal %i\n" "Please submit a bug report stating exactly what you were doing " "at the time of the crash, as well as the above signal number. " "Also note if it is possible to reproduce this crash.\n", signum); } if (num != 100) { myTracker->saveModule(buffer); fprintf(stderr, "\nA backup has been saved to %s\n\n", buffer); } // Try and quit SDL SDL_Quit(); } #endif void initTracker(pp_uint32 bpp, PPDisplayDevice::Orientations orientation, bool swapRedBlue, bool fullScreen, bool noSplash) { /* Initialize SDL */ if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0 ) { fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); exit(1); } // atexit(SDL_Quit); Not really needed, and needs a wrapper for OS/2 #ifdef __GP2X__ if ( SDL_Init(SDL_INIT_JOYSTICK) < 0 || !SDL_JoystickOpen(0)) { fprintf(stderr, "Couldn't initialize SDL Joystick: %s\n",SDL_GetError()); exit(1); } mouse.x = 0; mouse.y = 0; mouse.ticks = 0; mouse.button = 0; #endif SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); SDL_EnableUNICODE(1); #if (defined(unix) || defined(__unix__) || defined(_AIX) || defined(__OpenBSD__)) && \ (!defined(__CYGWIN32__) && !defined(ENABLE_NANOX) && \ !defined(__QNXNTO__) && !defined(__AROS__)) // Initialise crash handler struct sigaction act; struct sigaction oldAct; memset(&act, 0, sizeof(act)); act.sa_handler = crashHandler; act.sa_flags = SA_RESETHAND; sigaction(SIGTERM | SIGILL | SIGABRT | SIGFPE | SIGSEGV, &act, &oldAct); sigaction(SIGILL, &act, &oldAct); sigaction(SIGABRT, &act, &oldAct); sigaction(SIGFPE, &act, &oldAct); sigaction(SIGSEGV, &act, &oldAct); #endif #if defined(HAVE_X11) && !defined(__QTOPIA__) SDL_SysWMinfo info; SDL_VERSION(&info.version); if ( SDL_GetWMInfo(&info) && info.subsystem == SDL_SYSWM_X11) isX11 = true; // Used in SDL_KeyTranslation.cpp #endif SDL_WM_SetCaption("Loading MilkyTracker...", "MilkyTracker"); // ------------ initialise tracker --------------- myTracker = new Tracker(); PPSize windowSize = myTracker->getWindowSizeFromDatabase(); if (!fullScreen) fullScreen = myTracker->getFullScreenFlagFromDatabase(); pp_int32 scaleFactor = myTracker->getScreenScaleFactorFromDatabase(); #ifdef __LOWRES__ windowSize.width = DISPLAYDEVICE_WIDTH; windowSize.height = DISPLAYDEVICE_HEIGHT; #endif #ifdef __OPENGL__ myDisplayDevice = new PPDisplayDeviceOGL(screen, windowSize.width, windowSize.height, 1, bpp, fullScreen, orientation, swapRedBlue); #else myDisplayDevice = new PPDisplayDeviceFB(screen, windowSize.width, windowSize.height, scaleFactor, bpp, fullScreen, orientation, swapRedBlue); #endif myDisplayDevice->init(); myTrackerScreen = new PPScreen(myDisplayDevice, myTracker); myTracker->setScreen(myTrackerScreen); #ifdef __QTOPIA__ // On Qtopia I have to run a short event loop // until drawing/blitting can be performed // so the splash screen will be visible for (pp_int32 i = 0; i < 500; i++) { SDL_Event event; SDL_PollEvent(&event); } #endif // Startup procedure myTracker->startUp(noSplash); #ifdef HAVE_LIBASOUND InitMidi(); #endif // try to create timer SDL_SetTimer(20, timerCallback); timerMutex->lock(); ticking = true; timerMutex->unlock(); } static bool done; void exitSDLEventLoop(bool serializedEventInvoked/* = true*/) { PPEvent event(eAppQuit); RaiseEventSerialized(&event); // it's necessary to make this mutex lock because the SDL modal event loop // used in the modal dialogs expects modal dialogs to be invoked by // events within these mutex lock calls if (!serializedEventInvoked) globalMutex->lock(); bool res = myTracker->shutDown(); if (!serializedEventInvoked) globalMutex->unlock(); if (res) done = 1; } void SendFile(char *file) { PPSystemString finalFile(file); PPSystemString* strPtr = &finalFile; PPEvent event(eFileDragDropped, &strPtr, sizeof(PPSystemString*)); RaiseEventSerialized(&event); } #if defined(__PSP__) extern "C" int SDL_main(int argc, char *argv[]) #else int main(int argc, char *argv[]) #endif { Uint32 videoflags; SDL_Event event; char *loadFile = 0; pp_int32 defaultBPP = -1; PPDisplayDevice::Orientations orientation = PPDisplayDevice::ORIENTATION_NORMAL; bool swapRedBlue = false, fullScreen = false, noSplash = false; bool recVelocity = false; // Parse command line while ( argc > 1 ) { --argc; if ( strcmp(argv[argc-1], "-bpp") == 0 ) { defaultBPP = atoi(argv[argc]); --argc; } else if ( strcmp(argv[argc], "-nosplash") == 0 ) { noSplash = true; } else if ( strcmp(argv[argc], "-swap") == 0 ) { swapRedBlue = true; } else if ( strcmp(argv[argc], "-fullscreen") == 0) { fullScreen = true; } else if ( strcmp(argv[argc-1], "-orientation") == 0 ) { if (strcmp(argv[argc], "NORMAL") == 0) { orientation = PPDisplayDevice::ORIENTATION_NORMAL; } else if (strcmp(argv[argc], "ROTATE90CCW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CCW; } else if (strcmp(argv[argc], "ROTATE90CW") == 0) { orientation = PPDisplayDevice::ORIENTATION_ROTATE90CW; } else goto unrecognizedCommandLineSwitch; --argc; } else if ( strcmp(argv[argc], "-nonstdkb") == 0) { stdKb = false; } else if ( strcmp(argv[argc], "-recvelocity") == 0) { recVelocity = true; } else { unrecognizedCommandLineSwitch: if (argv[argc][0] == '-') { fprintf(stderr, "Usage: %s [-bpp N] [-swap] [-orientation NORMAL|ROTATE90CCW|ROTATE90CW] [-fullscreen] [-nosplash] [-nonstdkb] [-recvelocity]\n", argv[0]); exit(1); } else { loadFile = argv[argc]; } } } // Workaround for seg-fault in SDL_Init on Eee PC (thanks nostromo) // (see http://forum.eeeuser.com/viewtopic.php?pid=136945) #if HAVE_DECL_SDL_PUTENV SDL_putenv("SDL_VIDEO_X11_WMCLASS=Milkytracker"); #endif timerMutex = new PPMutex(); globalMutex = new PPMutex(); // Store current working path (init routine is likely to change it) PPPath_POSIX path; PPSystemString oldCwd = path.getCurrent(); globalMutex->lock(); initTracker(defaultBPP, orientation, swapRedBlue, fullScreen, noSplash); globalMutex->unlock(); #ifdef HAVE_LIBASOUND if (myMidiReceiver && recVelocity) { myMidiReceiver->setRecordVelocity(true); } #endif if (loadFile) { PPSystemString newCwd = path.getCurrent(); path.change(oldCwd); SendFile(loadFile); path.change(newCwd); pp_uint16 chr[3] = {VK_RETURN, 0, 0}; PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSerialized(&event); } /* Main event loop */ done = 0; while (!done && SDL_WaitEvent(&event)) { switch (event.type) { case SDL_QUIT: exitSDLEventLoop(false); break; case SDL_MOUSEMOTION: { // ignore old mouse motion events in the event queue SDL_Event new_event; if (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)) > 0) { while (SDL_PeepEvents(&new_event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)) > 0); processSDLEvents(new_event); } else { processSDLEvents(event); } break; } case SDL_USEREVENT: processSDLUserEvents((const SDL_UserEvent&)event); break; default: processSDLEvents(event); break; } } #ifdef __GP2X__ SDL_JoystickClose(0); #endif timerMutex->lock(); ticking = false; timerMutex->unlock(); SDL_SetTimer(0, NULL); timerMutex->lock(); globalMutex->lock(); #ifdef HAVE_LIBASOUND delete myMidiReceiver; #endif delete myTracker; myTracker = NULL; delete myTrackerScreen; myTrackerScreen = NULL; delete myDisplayDevice; globalMutex->unlock(); timerMutex->unlock(); SDL_Quit(); delete globalMutex; delete timerMutex; /* Quoting from README.Qtopia (Application Porting Notes): One thing I have noticed is that applications sometimes don't exit correctly. Their icon remains in the taskbar and they tend to relaunch themselves automatically. I believe this problem doesn't occur if you exit your application using the exit() method. However, if you end main() with 'return 0;' or so, this seems to happen. */ #ifdef __QTOPIA__ exit(0); #else return 0; #endif } milkytracker-0.90.85+dfsg/src/tracker/DialogZap.h0000755000175000017500000000206011150223367020671 0ustar admin2admin2/* * tracker/DialogZap.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogZap.h * MilkyTracker * * Created by Peter Barth on 20.2.08. * */ #ifndef __DIALOGZAP_H__ #define __DIALOGZAP_H__ #include "DialogBase.h" class DialogZap : public PPDialogBase { public: DialogZap(PPScreen* screen, DialogResponder* responder, pp_int32 id); }; #endif milkytracker-0.90.85+dfsg/src/tracker/TrackerStartUp.cpp0000644000175000017500000001535511150223367022300 0ustar admin2admin2/* * tracker/TrackerStartUp.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TrackerStartUp.cpp * MilkyTracker * * Created by Peter Barth on Sun Mar 20 2005. * */ #include "Tracker.h" #include "XMFile.h" #include "TrackerSettingsDatabase.h" #include "PPSystem.h" #include "Screen.h" #include "PatternEditorControl.h" #include "PlayerMaster.h" #include "SystemMessage.h" // Logo picture #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__) #include "LogoSmall.h" #else #include "LogoBig.h" #endif PPSize Tracker::getWindowSizeFromDatabase() { PPSize size(PPScreen::getDefaultWidth(), PPScreen::getDefaultHeight()); if (XMFile::exists(System::getConfigFileName())) { TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase); XMFile f(System::getConfigFileName()); settingsDatabaseCopy->serialize(f); size.height = settingsDatabaseCopy->restore("YRESOLUTION")->getIntValue(); size.width = settingsDatabaseCopy->restore("XRESOLUTION")->getIntValue(); delete settingsDatabaseCopy; } return size; } bool Tracker::getFullScreenFlagFromDatabase() { bool fullScreen = false; if (XMFile::exists(System::getConfigFileName())) { TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase); XMFile f(System::getConfigFileName()); settingsDatabaseCopy->serialize(f); fullScreen = settingsDatabaseCopy->restore("FULLSCREEN")->getBoolValue(); delete settingsDatabaseCopy; } return fullScreen; } pp_int32 Tracker::getScreenScaleFactorFromDatabase() { pp_int32 scaleFactor = 1; if (XMFile::exists(System::getConfigFileName())) { TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase); XMFile f(System::getConfigFileName()); settingsDatabaseCopy->serialize(f); scaleFactor = settingsDatabaseCopy->restore("SCREENSCALEFACTOR")->getIntValue(); delete settingsDatabaseCopy; } return scaleFactor; } bool Tracker::getShowSplashFlagFromDatabase() { bool showSplash = true; if (XMFile::exists(System::getConfigFileName())) { TrackerSettingsDatabase* settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase); XMFile f(System::getConfigFileName()); settingsDatabaseCopy->serialize(f); showSplash = settingsDatabaseCopy->restore("SHOWSPLASH")->getBoolValue(); delete settingsDatabaseCopy; } return showSplash; } #define SPLASH_WAIT_TIME 1000 void Tracker::showSplash() { screen->clear(); float shade = 0.0f; pp_int32 deltaT = 100; while (shade <= 256.0f) { pp_int32 startTime = ::PPGetTickCount(); #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__) screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4, (int)shade); #else screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3, (int)shade); #endif shade+=deltaT * (1.0f/6.25f); deltaT = abs(::PPGetTickCount() - startTime); if (!deltaT) deltaT++; } #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__) screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4); #else screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3); #endif screen->enableDisplay(false); } void Tracker::hideSplash() { screen->clear(); #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__) screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4); #else screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3); #endif screen->enableDisplay(true); float shade = 256.0f; pp_int32 deltaT = 100; while (shade >= 0.0f) { pp_int32 startTime = ::PPGetTickCount(); #if defined(__EXCLUDE_BIGLOGO__) || defined(__LOWRES__) screen->paintSplash(LogoSmall::rawData, LogoSmall::width, LogoSmall::height, LogoSmall::width*4, 4, (int)shade); #else screen->paintSplash(LogoBig::rawData, LogoBig::width, LogoBig::height, LogoBig::width*3, 3, (int)shade); #endif shade-=deltaT * (1.0f/6.25f); deltaT = abs(::PPGetTickCount() - startTime); if (!deltaT) deltaT++; } screen->clear(); screen->pauseUpdate(true); screen->paintControl(getPatternEditorControl(), false); screen->paint(); screen->pauseUpdate(false); } void Tracker::startUp(bool forceNoSplash/* = false*/) { bool noSplash = forceNoSplash ? true : !getShowSplashFlagFromDatabase(); // put up splash screen if desired pp_uint32 startTime = PPGetTickCount(); if (!noSplash) showSplash(); else screen->enableDisplay(false); initUI(); pp_int32 dTime; if (!noSplash) { dTime = (signed)(PPGetTickCount() - startTime); if (dTime > SPLASH_WAIT_TIME) dTime = SPLASH_WAIT_TIME; if (dTime < 0) dTime = 0; System::msleep(SPLASH_WAIT_TIME/2 - dTime); startTime = PPGetTickCount(); } if (XMFile::exists(System::getConfigFileName())) { // create as copy from existing database, so all keys are in there settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase); XMFile f(System::getConfigFileName()); // restore keys from disk settingsDatabaseCopy->serialize(f); // everything alright, delete old database and take new one delete settingsDatabase; settingsDatabase = settingsDatabaseCopy; settingsDatabaseCopy = NULL; } // apply ALL settings, not just the different ones applySettings(settingsDatabase, NULL, true, false); // update version information settingsDatabase->store("VERSION", TrackerConfig::version); // Update info panels updateSongInfo(false); updateWindowTitle(); // try to start playback engine bool masterStart = playerMaster->start(); // remove splash screen if (!noSplash) { dTime = (signed)(PPGetTickCount() - startTime); if (dTime > SPLASH_WAIT_TIME/2) dTime = SPLASH_WAIT_TIME/2; if (dTime < 0) dTime = 0; System::msleep(SPLASH_WAIT_TIME/2 - dTime); hideSplash(); } else screen->enableDisplay(true); screen->paint(); if (!masterStart) { SystemMessage systemMessage(*screen, SystemMessage::MessageSoundDriverInitFailed); systemMessage.show(); } } milkytracker-0.90.85+dfsg/src/tracker/EQConstants.cpp0000644000175000017500000000261611232663071021561 0ustar admin2admin2/* * tracker/EQConstants.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * bullshit trial and error values following because nobody knows * how the EQ actually works * */ #include "EQConstants.h" const float EQConstants::EQ3bands[3] = { 80.0f, 2500.0f, 12000.0f }; const float EQConstants::EQ3bandwidths[3] = { 2500.0f*0.25f, 2500.0f*0.5f, 2500.0f }; const float EQConstants::EQ10bands[10] = { 31.25f, 62.5f, 125.0f, 250.0f, 500.0f, 1000.0f, 2000.0f, 4000.0f, 8000.0f, 16000.0f }; const float EQConstants::EQ10bandwidths[10] = { 23.44f*0.25f, 46.87f*0.30f, 93.75f*0.35f, 187.5f*0.40f, 375.0f*0.45f, 750.0f*0.50f, 1500.0f*0.55f, 3000.0f*0.50f, 6000.0f*0.30f, 12000.0f*0.25f }; milkytracker-0.90.85+dfsg/src/tracker/SampleEditorControl.h0000644000175000017500000002154611150223367022757 0ustar admin2admin2/* * tracker/SampleEditorControl.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef SAMPLEEDITORCONTROL__H #define SAMPLEEDITORCONTROL__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" #include "SampleEditor.h" #include "SampleEditorControlLastValues.h" // Forwards class PPGraphicsAbstract; class PPFont; class PPScrollbar; class PPControl; class PPContextMenu; class FilterParameters; class PPDialogBase; class SampleEditorControl : public PPControl, public EventListenerInterface, public EditorBase::EditorNotificationListener { public: enum OffsetFormats { OffsetFormatHex, OffsetFormatDec, OffsetFormatMillis }; private: PPColor backgroundColor; bool border; PPColor ourOwnBorderColor; const PPColor* borderColor; PPScrollbar* hScrollbar; PPControl* caughtControl; bool controlCaughtByLMouseButton, controlCaughtByRMouseButton; PPContextMenu* editMenuControl; PPContextMenu* subMenuAdvanced; PPContextMenu* subMenuGenerators; PPContextMenu* subMenuPT; // extent pp_int32 selectionStartNew, selectionEndNew; pp_int32 selectionDragPivot; pp_int32 selectionStartCopy, selectionEndCopy; pp_int32 currentRepeatStart, currentRepeatLength; struct ShowMark { pp_int32 pos; pp_int32 intensity; pp_int32 panning; } *showMarks; float xScale; float minScale; pp_int32 startPos; pp_int32 visibleWidth; pp_int32 visibleHeight; pp_int32 scrollDist; pp_int32 selecting; pp_int32 resizing; bool drawMode; bool hasDragged; // selection pp_int32 selectionTicker; // necessary for controlling SampleEditor* sampleEditor; pp_int32 relativeNote; OffsetFormats offsetFormat; mp_sint32 getVisibleLength(); float calcScale(mp_sint32 len); float calcScale(); protected: virtual void translateCoordinates(PPPoint& cp) { PPControl::translateCoordinates(cp); cp.x -= 1; cp.y -= 1; } public: SampleEditorControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true); virtual ~SampleEditorControl(); void setBackgroundColor(const PPColor& color) { backgroundColor = color; } void setBorderColor(const PPColor& color) { borderColor = &color; } static void formatMillis(char* buffer, pp_uint32 millis); // from PPControl virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); public: // controlling editor from outside void attachSampleEditor(SampleEditor* sampleEditor); void setDrawMode(bool b) { drawMode = b; } bool getDrawMode() const { return drawMode; } void setOffsetFormat(OffsetFormats offsetFormat) { this->offsetFormat = offsetFormat; } OffsetFormats getOffsetFormat() const { return offsetFormat; } void setRelativeNote(pp_int32 relativeNote) { this->relativeNote = relativeNote; } pp_int32 getRelativeNote() const { return relativeNote; } // manipulating range (selection) void showRange(); void rangeAll(bool updateNotify = false); void rangeClear(bool updateNotify = false); void increaseRangeStart(); void decreaseRangeStart(); void increaseRangeEnd(); void decreaseRangeEnd(); bool canZoomOut(); void zoomOut(float factor = 2.0f, pp_int32 center = -1); void zoomIn(float factor = 0.5f, pp_int32 center = -1); void scrollWheelZoomOut(const PPPoint* p = NULL) { if (p) zoomOut(1.25f, positionToSample(*p)); else zoomOut(1.25f); notifyUpdate(); } void scrollWheelZoomIn(const PPPoint* p = NULL) { if (p) zoomIn(0.75f, positionToSample(*p)); else zoomIn(0.75f); notifyUpdate(); } void showAll(); pp_int32 getCurrentPosition(); pp_int32 getCurrentRangeLength() { return sampleEditor->getSelectionLength(); } pp_int32 getCurrentDisplayRange(); pp_int32 getSelectionStart() const { return sampleEditor->getLogicalSelectionStart(); } pp_int32 getSelectionEnd() const { return sampleEditor->getLogicalSelectionEnd(); } pp_uint32 getRepeatStart() const; pp_uint32 getRepeatLength() const; bool hasValidSelection(); void setShowMark(pp_int32 c, pp_int32 m, pp_int32 i = 256, pp_int32 p = 128) { showMarks[c].pos = m; showMarks[c].intensity = i; showMarks[c].panning = p; } pp_int32 getShowMarkPos(pp_int32 c) { return showMarks[c].pos; } bool showMarksVisible(); void reset(); SampleEditor* getSampleEditor() { return sampleEditor; } private: void validate(bool repositionBars = true, bool rescaleBars = false); pp_int32 getMaxWidth(); void adjustScrollbars(); pp_int32 positionToSample(PPPoint cp); void drawSample(const PPPoint& p); void drawLoopMarker(PPGraphicsAbstract* g, pp_int32 x, pp_int32 y, bool down, const pp_int32 size); bool hitsLoopstart(const PPPoint* p); bool hitsLoopend(const PPPoint* p); void startMarkerDragging(const PPPoint* p); void endMarkerDragging(); void signalWaitState(bool b); void notifyUpdate() { PPEvent e(eUpdated); eventListener->handleEvent(reinterpret_cast(this), &e); } // -- Multilevel UNDO / REDO ---------------------------------- // undo/redo information struct UndoInfo { float xScale; float minScale; pp_int32 startPos; pp_int32 barPos; pp_int32 barScale; UndoInfo() { } UndoInfo(float xScale, float minScale, pp_int32 startPos, pp_int32 barPos = -1, pp_int32 barScale = -1) : xScale(xScale), minScale(minScale), startPos(startPos), barPos(barPos), barScale(barScale) { } } undoInfo; enum MenuCommandIDs { MenuCommandIDCrop = 99, MenuCommandIDMixPaste, MenuCommandIDNormalize, MenuCommandIDVolumeBoost, MenuCommandIDVolumeFade, MenuCommandIDReverse, MenuCommandIDPTBoost, MenuCommandIDXFade, MenuCommandIDChangeSign, MenuCommandIDSwapByteOrder, MenuCommandIDResample, MenuCommandIDDCNormalize, MenuCommandIDDCOffset, MenuCommandIDRectangularSmooth, MenuCommandIDTriangularSmooth, MenuCommandIDEQ3Band, MenuCommandIDEQ10Band, MenuCommandIDGenerateSilence, MenuCommandIDGenerateNoise, MenuCommandIDGenerateSine, MenuCommandIDGenerateSquare, MenuCommandIDGenerateTriangle, MenuCommandIDGenerateSawtooth }; void executeMenuCommand(pp_int32 commandId); virtual void editorNotification(EditorBase* sender, EditorBase::EditorNotifications notification); public: void invokeSetSampleVolume() { executeMenuCommand(MenuCommandIDVolumeBoost); } bool contextMenuVisible(); void invokeContextMenu(const PPPoint& p, bool translatePoint = true); void hideContextMenu(); // --- Sample tool responder private: class ToolHandlerResponder : public DialogResponder { public: enum SampleToolTypes { SampleToolTypeNone, SampleToolTypeNew, SampleToolTypeVolume, SampleToolTypeFade, SampleToolTypeNormalize, SampleToolTypeReverse, SampleToolTypePTBoost, SampleToolTypeXFade, SampleToolTypeChangeSign, SampleToolTypeSwapByteOrder, SampleToolTypeResample, SampleToolTypeDCNormalize, SampleToolTypeDCOffset, SampleToolTypeRectangularSmooth, SampleToolTypeTriangularSmooth, SampleToolTypeEQ3Band, SampleToolTypeEQ10Band, SampleToolTypeGenerateSilence, SampleToolTypeGenerateNoise, SampleToolTypeGenerateSine, SampleToolTypeGenerateSquare, SampleToolTypeGenerateTriangle, SampleToolTypeGenerateSawtooth }; private: SampleEditorControl& sampleEditorControl; SampleToolTypes sampleToolType; public: ToolHandlerResponder(SampleEditorControl& theSampleEditorControl); void setSampleToolType(SampleToolTypes type) { sampleToolType = type; } SampleToolTypes getSampleToolType() { return sampleToolType; } virtual pp_int32 ActionOkay(PPObject* sender); virtual pp_int32 ActionCancel(PPObject* sender); }; friend class ToolHandlerResponder; PPDialogBase* dialog; ToolHandlerResponder* toolHandlerResponder; bool invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypes type); bool invokeTool(ToolHandlerResponder::SampleToolTypes type); SampleEditorControlLastValues lastValues; void resetLastValues() { lastValues.reset(); } public: SampleEditorControlLastValues& getLastValues() { return lastValues; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/SongLengthEstimator.h0000644000175000017500000000250011150223367022753 0ustar admin2admin2/* * tracker/SongLengthEstimator.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SongLengthEstimator.h * MilkyTracker * * Created by Peter Barth on 10.11.05. * */ #ifndef SONGLENGTHESTIMATOR__H #define SONGLENGTHESTIMATOR__H #include "MilkyPlayTypes.h" class PlayerGeneric; class XModule; class SongLengthEstimator { private: PlayerGeneric* player; XModule* module; public: SongLengthEstimator(XModule* theModule); SongLengthEstimator(const SongLengthEstimator& src); ~SongLengthEstimator(); const SongLengthEstimator& operator=(const SongLengthEstimator& src); mp_sint32 estimateSongLengthInSeconds(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/PeakLevelControl.h0000644000175000017500000000371511150223367022235 0ustar admin2admin2/* * tracker/PeakLevelControl.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PeakLevelControl.h * MilkyTracker * * Created by Peter Barth on 28.10.05. * */ #ifndef PEAKLEVELCONTROL__H #define PEAKLEVELCONTROL__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" class PeakLevelControl : public PPControl { private: PPColor color; bool border; PPColor ourOwnBorderColor; const PPColor* borderColor; // extent pp_int32 visibleWidth; pp_int32 visibleHeight; pp_int32 peak[2]; pp_uint8 peakColorLUT[256][3]; public: PeakLevelControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true); ~PeakLevelControl(); void setColor(pp_int32 r,pp_int32 g,pp_int32 b) { color.r = r; color.g = g; color.b = b; } void setColor(PPColor color) { this->color = color; } void setBorderColor(const PPColor& color) { this->borderColor = &color; } void setPeak(pp_int32 whichPeak, pp_int32 p) { if (p>65536) p = 65536; if (p < 0) p = 0; peak[whichPeak] = p; } pp_int32 getPeak(pp_int32 whichPeak) const { return peak[whichPeak]; } // from PPControl virtual void paint(PPGraphicsAbstract* graphics); private: void buildColorLUT(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/RecPosProvider.cpp0000755000175000017500000000426011150223367022264 0ustar admin2admin2/* * tracker/RecPosProvider.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "RecPosProvider.h" #include "PlayerController.h" #include "ModuleEditor.h" void RecPosProvider::getPosition(pp_int32& order, pp_int32& row) { playerController.getPosition((mp_sint32&)order, (mp_sint32&)row); if (playerController.isPlayingPattern()) order = -1; } void RecPosProvider::getPosition(pp_int32& order, pp_int32& row, pp_int32& ticker) { playerController.getPosition((mp_sint32&)order, (mp_sint32&)row, (mp_sint32&)ticker); if (playerController.isPlayingPattern()) order = -1; if (roundToClosestRow) { mp_sint32 speed, bpm; playerController.getSpeed(bpm, speed); // snap position to the closest row if (ticker >= speed / 2) { ticker = 0; ModuleEditor* moduleEditor = playerController.getModuleEditor(); row++; // playing pattern only? if (order != -1) { // get pattern index of current order pp_int32 patIndex = moduleEditor->getOrderPosition(order); // row exceeded if (row >= moduleEditor->getPattern(patIndex)->rows) { // wrap row = 0; // increase order order++; // order exceeded? if (order >= moduleEditor->getNumOrders()) // wrap song order = 0; } } else { pp_int32 patIndex = moduleEditor->getCurrentPatternIndex(); if (row >= moduleEditor->getPattern(patIndex)->rows) // row exceeded if (row >= moduleEditor->getPattern(patIndex)->rows) // wrap row = 0; } } } } milkytracker-0.90.85+dfsg/src/tracker/SectionAbstract.h0000644000175000017500000000535611150223367022117 0ustar admin2admin2/* * tracker/SectionAbstract.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionAbstract.h * MilkyTracker * * Created by Peter Barth on 14.04.05. * */ #ifndef SECTIONABSTRACT__H #define SECTIONABSTRACT__H #include "BasicTypes.h" #include "Event.h" #include "Screen.h" #include "Tracker.h" class PPControl; class SectionAbstract : public EventListenerInterface { private: PPControl* lastFocusedControl; protected: Tracker& tracker; bool initialised; class PPDialogBase* dialog; class DialogResponder* responder; protected: virtual void showSection(bool bShow) = 0; void showMessageBox(pp_uint32 id, const PPString& text, bool yesnocancel = false); public: SectionAbstract(Tracker& theTracker, PPDialogBase* dialog = NULL, DialogResponder* responder = NULL) : lastFocusedControl(NULL), tracker(theTracker), initialised(false), dialog(dialog), responder(responder) { } virtual ~SectionAbstract(); // PPEvent listener virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event) = 0; virtual void init() = 0; virtual void init(pp_int32 x, pp_int32 y) = 0; virtual void show(bool bShow) { #ifdef __LOWRES__ if (bShow) lastFocusedControl = tracker.screen->getFocusedControl(); else tracker.screen->setFocus(lastFocusedControl); #endif } virtual void update(bool repaint = true) = 0; virtual void notifyInstrumentSelect(pp_int32 index) {} virtual void notifySampleSelect(pp_int32 index) {} virtual void notifyTabSwitch() {} friend class Tracker; #ifdef __LOWRES__ private: PPSize oldInstrumentListSize; PPPoint oldInstrumentListLocation; PPSize oldSampleListSize; PPPoint oldSampleListLocation; PPSize oldInstrumentListContainerSize; PPPoint oldInstrumentListContainerLocation; PPPoint oldControlLocations[4]; bool visibility[10]; protected: enum { REPLACEDINSTRUMENTLISTBOXESHEIGHT = 37+15 }; void replaceAndResizeInstrumentListContainer(pp_int32 listBoxContainerHeight); void replaceInstrumentListBoxes(bool b, pp_int32 listBoxContainerHeight = REPLACEDINSTRUMENTLISTBOXESHEIGHT); #endif }; #endif milkytracker-0.90.85+dfsg/src/tracker/ToolInvokeHelper.h0000644000175000017500000000317211150223367022252 0ustar admin2admin2/* * tracker/ToolInvokeHelper.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ToolInvokeHelper.h * MilkyTracker * * Created by Peter Barth on 14.11.05. * */ #ifndef TOOLINVOKEHELPER__H #define TOOLINVOKEHELPER__H #include "DialogBase.h" class Tracker; class ToolInvokeHelper : public DialogResponder { public: enum ToolTypes { ToolTypeNone, ToolTypePatternVolumeScale, ToolTypeTrackVolumeScale, ToolTypeSelectionVolumeScale, ToolTypeQuickChooseInstrument }; private: struct TLastValues { float volumeScaleStart, volumeScaleEnd; }; Tracker& tracker; TLastValues lastValues; ToolTypes lastToolType; PPDialogBase* dialog; public: ToolInvokeHelper(Tracker& theTracker); virtual ~ToolInvokeHelper(); bool invokeTool(ToolTypes toolType, pp_int16 keyDownKeyCode = -1); private: void resetLastValues(); virtual pp_int32 ActionOkay(PPObject* sender); virtual pp_int32 ActionCancel(PPObject* sender); }; #endif milkytracker-0.90.85+dfsg/src/tracker/DialogEQ.cpp0000755000175000017500000001330611150223367021004 0ustar admin2admin2/* * tracker/DialogEQ.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogEQ.cpp * MilkyTracker * * Created by Peter Barth on 03.04.07. * */ #include "DialogEQ.h" #include "Screen.h" #include "StaticText.h" #include "MessageBoxContainer.h" #include "ScrollBar.h" #include "Slider.h" #include "Seperator.h" #include "EQConstants.h" DialogEQ::DialogEQ(PPScreen* screen, DialogResponder* responder, pp_int32 id, EQNumBands numBands) : PPDialogBase(), numBands(numBands) { numSliders = 3; switch (numBands) { case EQ10Bands: numSliders = 10; break; } char dummy[100]; sprintf(dummy, "%i Band Equalizer"PPSTR_PERIODS, numSliders); initDialog(screen, responder, id, dummy, 300, 230, 26, "Ok", "Cancel"); pp_int32 x = getMessageBoxContainer()->getLocation().x; pp_int32 y = getMessageBoxContainer()->getLocation().y; pp_int32 width = getMessageBoxContainer()->getSize().width; pp_int32 height = getMessageBoxContainer()->getSize().height; /*PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_YES)); pp_int32 y2 = button->getLocation().y; pp_int32 x2 = x + width / 2 - 30;*/ pp_uint32 borderSpace = 12; pp_uint32 scalaSpace = 6*5+8; pp_int32 y2 = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y + 26; pp_int32 x2 = x + borderSpace + scalaSpace; pp_int32 size = (y+height) - (y2 + 70); const pp_uint32 tickSize = 4; const float* values = ((numSliders == 3) ? EQConstants::EQ3bands : EQConstants::EQ10bands); for (pp_uint32 i = 0; i < numSliders; i++) { PPFont* font = PPFont::getFont(PPFont::FONT_TINY); char dummy[100]; pp_int32 value = (pp_int32)values[i]; sprintf(dummy, value >= 1000 ? "%ik" : "%i", value >= 1000 ? value / 1000 : value); PPStaticText* staticText = new PPStaticText(0, screen, this, PPPoint(x2 + (SCROLLBUTTONSIZE/2) - font->getStrWidth(dummy) / 2, y2 - 8), dummy, true); staticText->setFont(font); getMessageBoxContainer()->addControl(staticText); PPSlider* slider = new PPSlider(MESSAGEBOX_CONTROL_USER1+i, screen, this, PPPoint(x2, y2), size, false, true); slider->setBarSize(8192); slider->setMinValue(0); slider->setMaxValue(240); slider->setCurrentValue(120); getMessageBoxContainer()->addControl(slider); float y2f = (float)y2; y2f+=SCROLLBUTTONSIZE + 4; for (pp_int32 j = 0; j <= 8; j++) { PPSeperator* seperator = new PPSeperator(0, parentScreen, PPPoint(x2-(tickSize+1), (pp_int32)y2f), tickSize, getMessageBoxContainer()->getColor(), true); getMessageBoxContainer()->addControl(seperator); y2f+=((float)(size-SCROLLBUTTONSIZE*3)/8.0f); } x2+=(width-borderSpace*2-scalaSpace-SCROLLBUTTONSIZE)/(numSliders-1); } x2 = x + borderSpace; float y2f = (float)y2; y2f+=SCROLLBUTTONSIZE + 2; for (pp_int32 j = 0; j <= 8; j++) { PPFont* font = PPFont::getFont(PPFont::FONT_TINY); char dummy[100]; sprintf(dummy, j < 4 ? "+%i dB" : "%i dB", (8-j)*3 - 12); PPStaticText* staticText = new PPStaticText(0, screen, this, PPPoint(x2 + font->getStrWidth("+12 dB") - font->getStrWidth(dummy), (pp_int32)y2f), dummy, true); staticText->setFont(font); getMessageBoxContainer()->addControl(staticText); y2f+=((float)(size-SCROLLBUTTONSIZE*3)/8.0f); } y2 = (pp_int32)y2f + 16; getMessageBoxContainer()->addControl(new PPSeperator(0, screen, PPPoint(x+2, y2), width - 5, getMessageBoxContainer()->getColor(), true)); x2 = x+6; y2+=6; PPButton* button = new PPButton(MESSAGEBOX_LISTBOX_VALUE_ONE, screen, this, PPPoint(x2 + (width-5)/2 - 25, y2), PPSize(50, 14)); button->setText("Reset"); getMessageBoxContainer()->addControl(button); getMessageBoxContainer()->addControl(new PPSeperator(0, screen, PPPoint(x+2, y2+18), width - 5, getMessageBoxContainer()->getColor(), true)); } void DialogEQ::resetSliders() { for (pp_uint32 i = 0; i < numSliders; i++) { PPSlider* slider = static_cast(getMessageBoxContainer()->getControlByID(MESSAGEBOX_CONTROL_USER1+i)); slider->setCurrentValue(120); } } void DialogEQ::update() { parentScreen->paintControl(messageBoxContainerGeneric); } pp_int32 DialogEQ::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eCommand) { switch (reinterpret_cast(sender)->getID()) { // reset sliders case MESSAGEBOX_LISTBOX_VALUE_ONE: { resetSliders(); update(); break; } } } return PPDialogBase::handleEvent(sender, event); } void DialogEQ::setBandParam(pp_uint32 index, float param) { if (index >= numSliders) return; PPSlider* slider = static_cast(getMessageBoxContainer()->getControlByID(MESSAGEBOX_CONTROL_USER1+index)); pp_int32 value = (pp_int32)((1.0f - param) * 240.0f); slider->setCurrentValue(value); } float DialogEQ::getBandParam(pp_uint32 index) const { if (index >= numSliders) return 0.0f; PPSlider* slider = static_cast(getMessageBoxContainer()->getControlByID(MESSAGEBOX_CONTROL_USER1+index)); float v = 1.0f - (slider->getCurrentValue() / 240.0f); return v; } milkytracker-0.90.85+dfsg/src/tracker/ModuleServices.cpp0000644000175000017500000001462511150223367022312 0ustar admin2admin2/* * tracker/ModuleServices.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ModuleServices.cpp * MilkyTracker * * Created by Peter Barth on 08.12.07. * */ #include "ModuleServices.h" #include "SongLengthEstimator.h" #include "PlayerGeneric.h" #include "AudioDriver_NULL.h" #include "XModule.h" void ModuleServices::estimateSongLength() { SongLengthEstimator estimator(&module); estimatedSongLength = estimator.estimateSongLengthInSeconds(); } pp_int32 ModuleServices::estimateMixerVolume(WAVWriterParameters& parameters, pp_int32* numSamplesProgressed/* = NULL*/) { PlayerGeneric* player = new PlayerGeneric(parameters.sampleRate); player->setBufferSize(1024); player->setPlayMode((PlayerGeneric::PlayModes)parameters.playMode); player->setResamplerType((ChannelMixer::ResamplerTypes)parameters.resamplerType); player->setSampleShift(parameters.mixerShift); player->setMasterVolume(256); player->setPeakAutoAdjust(true); AudioDriver_NULL* audioDriver = new AudioDriver_NULL; pp_int32 res = player->exportToWAV(NULL, &module, parameters.fromOrder, parameters.toOrder, parameters.muting, module.header.channum, parameters.panning, audioDriver); if (numSamplesProgressed) *numSamplesProgressed = res; delete audioDriver; pp_int32 mixerVolume = player->getMasterVolume(); delete player; return mixerVolume; } pp_int32 ModuleServices::estimateWaveLengthInSamples(WAVWriterParameters& parameters) { PlayerGeneric* player = new PlayerGeneric(parameters.sampleRate); player->setBufferSize(1024); player->setPlayMode((PlayerGeneric::PlayModes)parameters.playMode); player->setResamplerType((ChannelMixer::ResamplerTypes)parameters.resamplerType); player->setSampleShift(parameters.mixerShift); player->setMasterVolume(256); player->setPeakAutoAdjust(false); AudioDriver_NULL* audioDriver = new AudioDriver_NULL; pp_int32 res = player->exportToWAV(NULL, &module, parameters.fromOrder, parameters.toOrder, parameters.muting, module.header.channum, parameters.panning, audioDriver); delete audioDriver; delete player; return res; } pp_int32 ModuleServices::exportToWAV(const PPSystemString& fileName, WAVWriterParameters& parameters) { PlayerGeneric* player = new PlayerGeneric(parameters.sampleRate); player->setBufferSize(1024); player->setPlayMode((PlayerGeneric::PlayModes)parameters.playMode); player->setResamplerType((ChannelMixer::ResamplerTypes)parameters.resamplerType); player->setSampleShift(parameters.mixerShift); player->setMasterVolume(parameters.mixerVolume); pp_int32 res = 0; if (parameters.multiTrack) { mp_ubyte* muting = new mp_ubyte[module.header.channum]; PPSystemString baseName = fileName.stripExtension(); PPSystemString extension = fileName.getExtension(); for (pp_uint32 i = 0; i < module.header.channum; i++) { PPSystemString fileName = baseName; char infix[80]; sprintf(infix, "_%02d", i+1); fileName.append(infix); fileName.append(extension); if (!parameters.muting[i]) { memset(muting, 1, module.header.channum); muting[i] = 0; res = player->exportToWAV(fileName, &module, parameters.fromOrder, parameters.toOrder, muting, module.header.channum, parameters.panning); } } delete[] muting; } else { res = player->exportToWAV(fileName, &module, parameters.fromOrder, parameters.toOrder, parameters.muting, module.header.channum, parameters.panning); } delete player; return res; } class BufferWriter : public AudioDriver_NULL { private: pp_int16* destBuffer; pp_uint32 destBufferSize; bool mono; pp_uint32 index; public: BufferWriter(pp_int16* buffer, pp_uint32 bufferSize, bool mono) : destBuffer(buffer), destBufferSize(bufferSize), mono(mono) { } virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { mp_sint32 res = AudioDriver_NULL::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; index = 0; return 0; } virtual mp_sint32 start() { index = 0; return 0; } virtual const char* getDriverID() { return "BufferWriter"; } virtual void advance() { AudioDriver_NULL::advance(); if (mono) { for (pp_int32 i = 0; i < bufferSize / MP_NUMCHANNELS; i++) { pp_int32 res = ((pp_int32)compensateBuffer[i*2] + (pp_int32)compensateBuffer[i*2+1]) >> 1; if (res < -32768) res = -32768; if (res > 32767) res = 32767; if (index < destBufferSize) destBuffer[index] = (pp_int16)res; index++; } } else { for (pp_int32 i = 0; i < bufferSize; i++) { if (index < destBufferSize) destBuffer[index] = compensateBuffer[i]; index++; } } //f->writeWords((mp_uword*)compensateBuffer, bufferSize); } }; pp_int32 ModuleServices::exportToBuffer16Bit(WAVWriterParameters& parameters, pp_int16* buffer, pp_uint32 bufferSize, bool mono) { PlayerGeneric* player = new PlayerGeneric(parameters.sampleRate); player->setBufferSize(1024); player->setPlayMode((PlayerGeneric::PlayModes)parameters.playMode); player->setResamplerType((ChannelMixer::ResamplerTypes)parameters.resamplerType); player->setSampleShift(parameters.mixerShift); player->setMasterVolume(parameters.mixerVolume); BufferWriter* audioDriver = new BufferWriter(buffer, bufferSize, mono); pp_int32 res = player->exportToWAV(NULL, &module, parameters.fromOrder, parameters.toOrder, parameters.muting, module.header.channum, parameters.panning, audioDriver); delete player; return res; } milkytracker-0.90.85+dfsg/src/tracker/TabTitleProvider.h0000644000175000017500000000220611150223367022241 0ustar admin2admin2/* * tracker/TabTitleProvider.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TabTitleProvider.h * MilkyTracker * * Created by Peter Barth on 11.12.07. * */ #ifndef __TABTITLEPROVIDER_H__ #define __TABTITLEPROVIDER_H__ #include "BasicTypes.h" class TabTitleProvider { private: class ModuleEditor& moduleEditor; public: TabTitleProvider(ModuleEditor& moduleEditor) : moduleEditor(moduleEditor) { } PPString getTabTitle(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/DialogHandlers.h0000755000175000017500000000455011150223367021705 0ustar admin2admin2/* * tracker/DialogHandlers.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogHandlers.h * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #ifndef __DIALOGHANDLERS_H__ #define __DIALOGHANDLERS_H__ #include "DialogBase.h" class Tracker; class SampleLoadChannelSelectionHandler : public DialogResponder { private: Tracker& tracker; PPSystemString fileName; PPSystemString preferredFileName; public: bool suspendPlayer; SampleLoadChannelSelectionHandler(Tracker& tracker) : tracker(tracker) { suspendPlayer = false; } virtual ~SampleLoadChannelSelectionHandler() { } void setCurrentFileName(const PPSystemString& fileName); void setPreferredFileName(const PPSystemString& fileName); virtual pp_int32 ActionOkay(PPObject* sender); virtual pp_int32 ActionCancel(PPObject* sender); virtual pp_int32 ActionUser1(PPObject* sender); }; class ZapHandler : public DialogResponder { private: class Zapper* zapper; public: ZapHandler(const Zapper& zapper); virtual ~ZapHandler(); virtual pp_int32 ActionUser1(PPObject* sender); virtual pp_int32 ActionUser2(PPObject* sender); virtual pp_int32 ActionUser3(PPObject* sender); virtual pp_int32 ActionUser4(PPObject* sender); }; class ZapInstrumentHandler : public DialogResponder { private: Tracker& tracker; public: ZapInstrumentHandler(Tracker& tracker) : tracker(tracker) { } virtual pp_int32 ActionOkay(PPObject* sender); }; class SaveProceedHandler : public DialogResponder { private: Tracker& tracker; public: SaveProceedHandler(Tracker& tracker) : tracker(tracker) { } virtual pp_int32 ActionOkay(PPObject* sender); virtual pp_int32 ActionCancel(PPObject* sender); }; #endif milkytracker-0.90.85+dfsg/src/tracker/ModuleEditor.h0000644000175000017500000003147211150223367021421 0ustar admin2admin2/* * tracker/ModuleEditor.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef MODULEDITOR__H #define MODULEDITOR__H #include "MilkyPlay.h" #include "BasicTypes.h" #include "PatternEditorTools.h" #include "SongLengthEstimator.h" class XIInstrument; class PatternEditor; class SampleEditor; class EnvelopeEditor; class ModuleServices; class PlayerCriticalSection; class ModuleEditor { public: enum { // FT2 noterange MAX_NOTE = 96, // FT2 maximum of instruments MAX_INSTRUMENTS = 255, // FT2 maximum of patterns MAX_PATTERNS = 256, // FT2 length of module title MAX_TITLETEXT = 20, // FT2 length of instrument text MAX_INSTEXT = 22, // FT2 length of sample text MAX_SMPTEXT = 22, }; // "proxy" instrument type struct TEditorInstrument { TXMInstrument* instrument; // since TXMInstruments holds only references to the *used* samples // we need another list of samples here in case the user wants to // add a new sample that isn't used yet // fasttracker 2 can only handle 16 samples mp_sint32 numUsedSamples; mp_sint32 usedSamples[16]; // FT2 can only handle 96 notes mp_ubyte nbu[MAX_NOTE]; // fasttracker can only handle envelopes per instrument, // no envelopes per sample // store default envelope here mp_sint32 volumeEnvelope; mp_sint32 panningEnvelope; // default volume fadeout mp_uword volfade; // default autovibrato stuff mp_ubyte vibtype, vibsweep, vibdepth, vibrate; }; enum ModSaveTypes { ModSaveTypeDefault = -1, ModSaveTypeXM, ModSaveTypeMOD }; private: XModule* module; PatternEditor* patternEditor; SampleEditor* sampleEditor; EnvelopeEditor* envelopeEditor; class ChangesListener* changesListener; ModuleServices* moduleServices; PlayerCriticalSection* playerCriticalSection; bool changed; PPSystemString moduleFileName; PPSystemString sampleFileName; PPSystemString instrumentFileName; ModSaveTypes eSaveType; void enterCriticalSection(); void leaveCriticalSection(); void adjustExtension(bool hasExtension = true); TEditorInstrument* instruments; // convert MilkyPlay instrument at index i to our more XM-style instrument void convertInstrument(mp_sint32 i); // create a mapping which helps to treat MilkyPlay style instruments like XM ones void buildInstrumentTable(); // make sure everything is fine void validateInstruments(); // insert an XIInstrument at position index bool insertXIInstrument(mp_sint32 index, const XIInstrument* ins); XIInstrument* extractXIInstrument(mp_sint32 index); bool allocatePattern(TXMPattern* pattern); mp_sint32 lastRequestedPatternIndex; mp_sint32 currentOrderIndex; mp_sint32 currentPatternIndex; mp_sint32 currentInstrumentIndex; mp_sint32 currentSampleIndex; PatternEditorTools::Position currentCursorPosition; pp_int32 enumerationIndex; public: ModuleEditor(); ~ModuleEditor(); XModule* getModule() { return module; } PatternEditor* getPatternEditor() { return patternEditor; } SampleEditor* getSampleEditor() { return sampleEditor; } EnvelopeEditor* getEnvelopeEditor() { return envelopeEditor; } ModuleServices* getModuleServices() { return moduleServices; } void attachPlayerCriticalSection(PlayerCriticalSection* playerCriticalSection) { this->playerCriticalSection = playerCriticalSection; } PPSystemString getModuleFileNameFull(ModSaveTypes extension = ModSaveTypeDefault); PPSystemString getModuleFileName(ModSaveTypes extension = ModSaveTypeDefault); ModSaveTypes getSaveType() const { return eSaveType; } void setCurrentOrderIndex(mp_sint32 index) { currentOrderIndex = index; } mp_sint32 getCurrentOrderIndex() const { return currentOrderIndex; } void setCurrentPatternIndex(mp_sint32 index) { currentPatternIndex = index; } mp_sint32 getCurrentPatternIndex() const { return currentPatternIndex; } void setCurrentInstrumentIndex(mp_sint32 index) { currentInstrumentIndex = index; } mp_sint32 getCurrentInstrumentIndex() const { return currentInstrumentIndex; } void setCurrentSampleIndex(mp_sint32 index) { currentSampleIndex = index; } mp_sint32 getCurrentSampleIndex() const { return currentSampleIndex; } void setCurrentCursorPosition(const PatternEditorTools::Position& currentCursorPosition) { this->currentCursorPosition = currentCursorPosition; } const PatternEditorTools::Position& getCurrentCursorPosition() { return currentCursorPosition; } void setChanged() { changed = true; } bool hasChanged() const { return changed; } void reloadCurrentPattern(); void reloadSample(mp_sint32 insIndex, mp_sint32 smpIndex); void reloadEnvelope(mp_sint32 insIndex, mp_sint32 smpIndex, mp_sint32 type); // --------- Access to module information/module data --------------------------- void setNumChannels(mp_uint32 channels); mp_uint32 getNumChannels() const { return module->header.channum; } void setTitle(const char* name, mp_uint32 length); void getTitle(char* name, mp_uint32 length) const; void setNumOrders(mp_sint32 numOrders); mp_sint32 getNumOrders() const { return module->header.ordnum; } mp_sint32 getNumInstruments() const { return module->header.insnum; } mp_sint32 getNumSamples(mp_sint32 insIndex) const { return instruments[insIndex].numUsedSamples; } enum Frequencies { FrequencyAmiga = 0, FrequencyLinear = 1 }; void setFrequency(Frequencies frequency); Frequencies getFrequency() const { return (Frequencies)(module->header.freqtab & 1); } mp_sint32 getSongBPM() const { return module->header.speed; } mp_sint32 getSongTickSpeed() const { return module->header.tempo; } // Check if song is protracker incompatible // 0 = PTK compatible // 1 = Song contains more than 31 instruments // 2 = Song uses linear frequencies // 3 = Song contains incompatible samples // 4 = Song contains FT2-style instruments // 5 = Incompatible pattern data mp_uint32 getPTIncompatibilityCode() const { return module->isPTCompatible(); } private: TXMSample* getSampleInfoInternal(mp_sint32 insIndex, mp_sint32 smpIndex) const { return &module->smp[instruments[insIndex].usedSamples[smpIndex]]; } public: TXMSample* getSampleInfo(mp_sint32 insIndex, mp_sint32 smpIndex) { return &module->smp[instruments[insIndex].usedSamples[smpIndex]]; } void setSampleName(mp_sint32 insIndex, mp_sint32 smpIndex, const char* name, mp_uint32 length); void getSampleName(mp_sint32 insIndex, mp_sint32 smpIndex, char* name, mp_uint32 length) const; void setCurrentSampleName(const char* name, mp_uint32 length); private: TXMSample* getFirstSampleInfo(); TXMSample* getNextSampleInfo(); public: TEditorInstrument* getInstrumentInfo(mp_sint32 insIndex) { return &instruments[insIndex]; } void setInstrumentName(mp_sint32 insIndex, const char* name, mp_uint32 length); void getInstrumentName(mp_sint32 insIndex, char* name, mp_uint32 length) const; TEnvelope* getEnvelope(mp_sint32 insIndex, mp_sint32 smpIndex, mp_sint32 type); bool createNewSong(mp_uword numChannels = 8); void createEmptySong(bool clearPatterns = true, bool clearInstruments = true, mp_sint32 numChannels = 8); bool isEmpty() const; bool openSong(const SYSCHAR* fileName, const SYSCHAR* preferredFileName = NULL); bool saveSong(const SYSCHAR* fileName, ModSaveTypes saveType = ModSaveTypeXM); void saveBackup(const SYSCHAR* fileName); void increaseSongLength(); void decreaseSongLength(); mp_sint32 getRepeatPos() const { return module->header.restart; } void increaseRepeatPos(); void decreaseRepeatPos(); // insert new position into orderlist bool insertNewOrderPosition(mp_sint32 index); // delete position from orderlist void deleteOrderPosition(mp_sint32 index); // duplicate current position and add one bool seqCurrentOrderPosition(mp_sint32 index, bool clone = false); // get pattern index at order position mp_sint32 getOrderPosition(mp_sint32 index) const; // inrease pattern number in the orderlist void increaseOrderPosition(mp_sint32 index); // decrease pattern number in the orderlist void decreaseOrderPosition(mp_sint32 index); bool isEditingOrderPosition(mp_sint32 index) const; // throw away trailing empty patterns // handle with care, they might be currently playing void cleanUnusedPatterns(); // get pattern, if not allocated yet, allocate one TXMPattern* getPattern(mp_sint32 index, bool cleanUnusedPatterns = false); // allocate new sample within given instrument (obsolete) mp_sint32 allocateSample(mp_sint32 index); // free last sample within given instrument (obsolete) void freeSample(mp_sint32 index); // deallocate memory used by sample void clearSample(mp_sint32 smpIndex); void clearSample(mp_sint32 insIndex, mp_sint32 smpIndex); // load sample bool loadSample(const SYSCHAR* fileName, mp_sint32 insIndex, mp_sint32 smpIndex, mp_sint32 channelIndex, const SYSCHAR* preferredFileName = NULL); // retrieve number of channels contained in a sample on disk mp_sint32 getNumSampleChannels(const SYSCHAR* fileName); // get name of channel const char* getNameOfSampleChannel(const SYSCHAR* fileName, mp_sint32 index); // save sample enum SampleFormatTypes { SampleFormatTypeWAV, SampleFormatTypeIFF }; bool saveSample(const SYSCHAR* fileName, mp_sint32 insIndex, mp_sint32 smpIndex, SampleFormatTypes format); // create sample filename from sample name information const PPSystemString& getSampleFileName(mp_sint32 insIndex, mp_sint32 smpIndex); // postprocessing of samples, when changes are made void finishSamples(); // allocate one more instrument mp_sint32 allocateInstrument(); // free last instrument void freeInstrument(); // load instrument bool loadInstrument(const SYSCHAR* fileName, mp_sint32 index); // save instrument bool saveInstrument(const SYSCHAR* fileName, mp_sint32 index); // zap (clear) instrument bool zapInstrument(mp_sint32 index); // create instrument filename from instrument name information const PPSystemString& getInstrumentFileName(mp_sint32 index); bool copyInstrument(ModuleEditor& dstModule, mp_sint32 dstIndex, ModuleEditor& srcModule, mp_sint32 srcIndex); bool swapInstruments(ModuleEditor& dstModule, mp_sint32 dstIndex, ModuleEditor& srcModule, mp_sint32 srcIndex); bool copySample(ModuleEditor& dstModule, mp_sint32 dstInsIndex, mp_sint32 dstIndex, ModuleEditor& srcModule, mp_sint32 srcInsIndex, mp_sint32 srcIndex); bool swapSamples(ModuleEditor& dstModule, mp_sint32 dstInsIndex, mp_sint32 dstIndex, ModuleEditor& srcModule, mp_sint32 srcInsIndex, mp_sint32 srcIndex); // get note->sample LUT const mp_ubyte* getSampleTable(mp_sint32 index); // update note->sample LUT void updateSampleTable(mp_sint32 index, const mp_ubyte* nbu); // update instrument autovibrato / volume fadeout stuff void updateInstrumentData(mp_sint32 index); // remap instruments in entire song pp_int32 insRemapSong(pp_int32 oldIns, pp_int32 newIns); // transpose notes in entire song pp_int32 noteTransposeSong(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate = false); // panning effect conversion enum PanConversionTypes { PanConversionTypeConvert_E8x, PanConversionTypeConvert_80x, PanConversionTypeRemove_E8x, PanConversionTypeRemove_8xx }; pp_int32 panConvertSong(PanConversionTypes type); // Optimizing features operating on the entire song // -------------------------------------------------------- // remove unused patterns, remapping is always done pp_int32 removeUnusedPatterns(bool evaluate); // remove unused instruments, remapping is optional pp_int32 removeUnusedInstruments(bool evaluate, bool remap); // remove unused samples, no remapping is performed pp_int32 removeUnusedSamples(bool evaluate); pp_int32 relocateCommands(const PatternEditorTools::RelocateParameters& relocateParameters, bool evaluate); pp_int32 zeroOperands(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 fillOperands(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate); void optimizeSamples(bool convertTo8Bit, bool minimize, mp_sint32& numConvertedSamples, mp_sint32& numMinimizedSamples, bool evaluate); public: static void insertText(char* dst, const char* src, mp_sint32 max); static PPSystemString getTempFilename(); friend class ChangesListener; }; #endif milkytracker-0.90.85+dfsg/src/tracker/FileIdentificator.cpp0000644000175000017500000000647311150223367022747 0ustar admin2admin2/* * tracker/FileIdentificator.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * FileIdentificator.cpp * MilkyTracker * * Created by Peter Barth on 03.05.05. * */ #include "FileIdentificator.h" #include "XMFile.h" #include "XModule.h" #include "SampleLoaderGeneric.h" #include "Decompressor.h" FileIdentificator::FileIdentificator(const PPSystemString& fileName) : fileName(fileName) { f = new XMFile(fileName); if (!f->isOpen()) { delete f; f = NULL; } } FileIdentificator::~FileIdentificator() { delete f; } FileIdentificator::FileTypes FileIdentificator::getFileType() { if (!isValid()) return FileTypeUnknown; // Check instruments first = sure thing if (isInstrument()) return FileTypeInstrument; // Check patterns and tracks second = sure thing if (isPattern()) return FileTypePattern; if (isTrack()) return FileTypeTrack; // Okay now check module, could go wrong because of several weak file type detections if (isModule()) return FileTypeModule; // check for packed file types last if (isCompressed()) return FileTypeCompressed; // Okay now check samples, if sample type can not be detected it will assume raw-sample and load if (isSample()) return FileTypeSample; return FileTypeUnknown; } bool FileIdentificator::isModule() { mp_ubyte buffer[2048]; f->seek(0); f->read(buffer, 1, 2048); return XModule::identifyModule(buffer) != NULL; } bool FileIdentificator::isInstrument() { char sig[32]; f->seek(0); f->read(sig, 1, 21); if (memcmp(sig,"GF1PATCH",8) == 0) return true; return memcmp(sig,"Extended Instrument: ",21) == 0; } bool FileIdentificator::isSample() { XModule* module = NULL; SampleLoaderGeneric sampleLoader(fileName, *module); return sampleLoader.identifySample(); } bool FileIdentificator::isPattern() { if ((f->size() - 4) % (32*5) != 0) return false; f->seek(0); mp_uword wtf = f->readWord(); if (wtf != 1) return false; mp_uword numRows = f->readWord(); if (numRows > 256) return false; PPSystemString ext = fileName.getExtension(); ext.toUpper(); if (ext.compareTo(".XP") != 0) return false; return true; } bool FileIdentificator::isTrack() { if ((f->size() - 4) % (32*5) != 0) return false; f->seek(0); mp_uword wtf = f->readWord(); if (wtf != 1) return false; mp_uword numRows = f->readWord(); if (numRows > 256) return false; PPSystemString ext = fileName.getExtension(); ext.toUpper(); if (ext.compareTo(".XT") != 0) return false; return true; } bool FileIdentificator::isCompressed() { Decompressor decompressor(fileName); f->seek(0); return decompressor.identify(*f); } milkytracker-0.90.85+dfsg/src/tracker/SectionQuickOptions.h0000644000175000017500000000333211150223367022774 0ustar admin2admin2/* * tracker/SectionQuickOptions.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionQuickOptions.h * MilkyTracker * * Created by Peter Barth on 10.05.05. * */ #ifndef SECTIONQUICKOPTIONS__H #define SECTIONQUICKOPTIONS__H #include "BasicTypes.h" #include "Event.h" #include "SectionUpperLeft.h" class SectionQuickOptions : public SectionUpperLeft { private: class PPCheckBox* checkBoxKeepSettings; class DialogPanning* dialogPanning; pp_uint8* oldPanning; public: SectionQuickOptions(class Tracker& tracker); virtual ~SectionQuickOptions(); // Derived from SectionAbstract virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init() { SectionUpperLeft::init(); } virtual void init(pp_int32 x, pp_int32 y); virtual void show(bool bShow); virtual void update(bool repaint = true); virtual void notifyTabSwitch(); bool setKeepSettings(bool b); bool keepSettings(); private: void updateControlStates(); void saveOldPanning(); void restoreOldPanning(); friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/SampleEditorControl.cpp0000644000175000017500000013333511150223367023312 0ustar admin2admin2/* * tracker/SampleEditorControl.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "SampleEditorControl.h" #include "Screen.h" #include "GraphicsAbstract.h" #include "PPUIConfig.h" #include "ScrollBar.h" #include "ContextMenu.h" #include "Piano.h" #include "Tools.h" #include "TrackerConfig.h" #include "PlayerController.h" #include "DialogBase.h" #include #define SCROLLBARWIDTH SCROLLBUTTONSIZE mp_sint32 SampleEditorControl::getVisibleLength() { return sampleEditor->getSampleLen(); } float SampleEditorControl::calcScale(mp_sint32 len) { return ((float)len / (float)visibleWidth); } float SampleEditorControl::calcScale() { return calcScale(getVisibleLength()); } void SampleEditorControl::signalWaitState(bool b) { parentScreen->signalWaitState(b, *borderColor); //if (!b) // parentScreen->paint(); } SampleEditorControl::SampleEditorControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border/*= true*/) : PPControl(id, parentScreen, eventListener, location, size), border(border), borderColor(&ourOwnBorderColor), caughtControl(NULL), controlCaughtByLMouseButton(false), controlCaughtByRMouseButton(false), sampleEditor(NULL), xScale(1.0f), minScale(1.0f), selectionStartNew(-1), selectionEndNew(-1), selecting(-1), resizing(0), drawMode(false), selectionTicker(-1), relativeNote(0), offsetFormat(OffsetFormatHex) { // default color backgroundColor.set(0, 0, 0); ourOwnBorderColor.set(192, 192, 192); hScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y + size.height - SCROLLBARWIDTH - 1), size.width - 1, true); startPos = 0; visibleWidth = size.width - 4; visibleHeight = size.height - SCROLLBARWIDTH - 4; scrollDist = (3298*visibleWidth) >> 16; adjustScrollbars(); showMarks = new ShowMark[TrackerConfig::maximumPlayerChannels]; for (pp_int32 i = 0; i < TrackerConfig::maximumPlayerChannels; i++) { showMarks[i].pos = -1; showMarks[i].intensity = 0; showMarks[i].panning = 128; } // build submenu static const char* seperatorStringLarge = "\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4"; static const char* seperatorStringMed = "\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4"; subMenuAdvanced = new PPContextMenu(5, parentScreen, this, PPPoint(0,0), TrackerConfig::colorThemeMain); subMenuAdvanced->setSubMenu(true); subMenuAdvanced->addEntry("Volume boost"PPSTR_PERIODS, MenuCommandIDVolumeBoost); subMenuAdvanced->addEntry("Volume fade"PPSTR_PERIODS, MenuCommandIDVolumeFade); subMenuAdvanced->addEntry("Normalize", MenuCommandIDNormalize); subMenuAdvanced->addEntry(seperatorStringLarge, -1); subMenuAdvanced->addEntry("Backwards", MenuCommandIDReverse); subMenuAdvanced->addEntry("Cross-fade", MenuCommandIDXFade); subMenuAdvanced->addEntry(seperatorStringLarge, -1); subMenuAdvanced->addEntry("Change sign", MenuCommandIDChangeSign); subMenuAdvanced->addEntry("Swap byte order", MenuCommandIDSwapByteOrder); subMenuAdvanced->addEntry(seperatorStringLarge, -1); subMenuAdvanced->addEntry("DC normalize", MenuCommandIDDCNormalize); subMenuAdvanced->addEntry("DC offset"PPSTR_PERIODS, MenuCommandIDDCOffset); subMenuAdvanced->addEntry(seperatorStringLarge, -1); subMenuAdvanced->addEntry("Smooth (rect.)", MenuCommandIDRectangularSmooth); subMenuAdvanced->addEntry("Smooth (tri.)", MenuCommandIDTriangularSmooth); subMenuAdvanced->addEntry("3 Band EQ"PPSTR_PERIODS, MenuCommandIDEQ3Band); subMenuAdvanced->addEntry("10 Band EQ"PPSTR_PERIODS, MenuCommandIDEQ10Band); subMenuAdvanced->addEntry(seperatorStringLarge, -1); subMenuAdvanced->addEntry("Resample"PPSTR_PERIODS, MenuCommandIDResample); subMenuPT = new PPContextMenu(6, parentScreen, this, PPPoint(0,0), TrackerConfig::colorThemeMain); subMenuPT->addEntry("Boost", MenuCommandIDPTBoost); subMenuGenerators = new PPContextMenu(7, parentScreen, this, PPPoint(0,0), TrackerConfig::colorThemeMain); subMenuGenerators->addEntry("Noise"PPSTR_PERIODS, MenuCommandIDGenerateNoise); subMenuGenerators->addEntry("Sine"PPSTR_PERIODS, MenuCommandIDGenerateSine); subMenuGenerators->addEntry("Square"PPSTR_PERIODS, MenuCommandIDGenerateSquare); subMenuGenerators->addEntry("Triangle"PPSTR_PERIODS, MenuCommandIDGenerateTriangle); subMenuGenerators->addEntry("Sawtooth"PPSTR_PERIODS, MenuCommandIDGenerateSawtooth); subMenuGenerators->addEntry("Silence"PPSTR_PERIODS, MenuCommandIDGenerateSilence); // build context menu editMenuControl = new PPContextMenu(4, parentScreen, this, PPPoint(0,0), TrackerConfig::colorThemeMain, true); editMenuControl->addEntry("New", MenuCommandIDNew); editMenuControl->addEntry(seperatorStringMed, -1); editMenuControl->addEntry("Undo", MenuCommandIDUndo); editMenuControl->addEntry("Redo", MenuCommandIDRedo); editMenuControl->addEntry(seperatorStringMed, -1); editMenuControl->addEntry("Cut", MenuCommandIDCut); editMenuControl->addEntry("Copy", MenuCommandIDCopy); editMenuControl->addEntry("Paste", MenuCommandIDPaste); editMenuControl->addEntry("Mix-Paste", MenuCommandIDMixPaste); editMenuControl->addEntry("Crop", MenuCommandIDCrop); editMenuControl->addEntry("Range all", MenuCommandIDSelectAll); editMenuControl->addEntry(seperatorStringMed, -1); editMenuControl->addEntry("Advanced \x10", 0xFFFF, subMenuAdvanced); editMenuControl->addEntry("Protracker \x10", 0xFFFF, subMenuPT); editMenuControl->addEntry("Generators \x10", 0xFFFF, subMenuGenerators); // Create tool handler responder toolHandlerResponder = new ToolHandlerResponder(*this); dialog = NULL; resetLastValues(); } SampleEditorControl::~SampleEditorControl() { if (sampleEditor) sampleEditor->removeNotificationListener(this); delete dialog; delete toolHandlerResponder; delete[] showMarks; delete hScrollbar; delete editMenuControl; delete subMenuAdvanced; delete subMenuPT; delete subMenuGenerators; } void SampleEditorControl::drawLoopMarker(PPGraphicsAbstract* g, pp_int32 x, pp_int32 y, bool down, const pp_int32 size) { PPColor bColor = *borderColor, dColor = *borderColor; // adjust dark color dColor.scaleFixed(32768); // adjust bright color bColor.scaleFixed(87163); if (down) { for (mp_sint32 j = 0; j <= size; j++) for (mp_sint32 i = 0; i < (size*2+1)-j*2; i++) { if (i == 0) g->setColor(bColor); else if (i == (size*2+1)-j*2 - 1) g->setColor(dColor); else g->setColor(j == 0 ? bColor : *borderColor); g->setPixel(x+i+j,y+j); } } else { for (mp_sint32 j = size; j >= 0; j--) for (mp_sint32 i = 0; i < (size*2+1)-j*2; i++) { if (i == 0) g->setColor(bColor); else if (i == (size*2+1)-j*2 - 1) g->setColor(dColor); else g->setColor(j == 0 ? dColor : *borderColor); g->setPixel(x+i+j,y+size-j); } } } pp_uint32 SampleEditorControl::getRepeatStart() const { if (selecting > 0) { if (currentRepeatStart < 0) return 0; else if (currentRepeatStart > sampleEditor->getSampleLen()) return sampleEditor->getSampleLen(); return currentRepeatStart; } return sampleEditor->getRepeatStart(); } pp_uint32 SampleEditorControl::getRepeatLength() const { if (selecting > 0) { pp_int32 loopend = currentRepeatStart + currentRepeatLength; if (loopend < 0) return 0; else if (loopend > sampleEditor->getSampleLen()) return sampleEditor->getSampleLen() - currentRepeatStart; return currentRepeatLength; } return sampleEditor->getRepeatLength(); } void SampleEditorControl::formatMillis(char* buffer, pp_uint32 millis) { if (millis >= 1000) { pp_uint32 secs = millis / 1000; millis %= 1000; if (secs >= 60) { pp_uint32 mins = secs / 60; secs %= 60; sprintf(buffer, "%im%i.%is", mins, secs, millis); } else sprintf(buffer, "%i.%is", secs, millis); } else sprintf(buffer, "%ims", millis); } void SampleEditorControl::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; PPColor bColor = *borderColor, dColor = *borderColor; // adjust dark color dColor.scaleFixed(32768); // adjust bright color bColor.scaleFixed(87163); pp_int32 xOffset = 2; pp_int32 yOffset = 2; g->setRect(location.x, location.y, location.x + size.width, location.y + size.height); g->setColor(backgroundColor); g->fill(); pp_int32 sStart = sampleEditor->getLogicalSelectionStart(); pp_int32 sEnd = sampleEditor->getLogicalSelectionEnd(); TXMSample* sample = sampleEditor->getSample(); if (sample && sample->sample) { if (sEnd >= 0) { if (sEnd >= (signed)sample->samplen) sEnd = sample->samplen; if (sStart < (signed)sample->samplen) { pp_int32 x1 = (pp_int32)((sStart)/xScale)-startPos; pp_int32 x2 = (pp_int32)((sEnd)/xScale)+1-startPos; if (x1 < visibleWidth && x2 > 0) { if (x1 < 0) x1 = 0; if (x2 > visibleWidth) x2 = visibleWidth; g->setRect(location.x + xOffset + x1, location.y + yOffset - 1, location.x + xOffset + x2, location.y + yOffset + visibleHeight); PPColor destColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorSelection)); PPColor sourceColor(destColor.r>>1,destColor.g>>1,destColor.b>>1); PPRect rect(location.x + xOffset + x1, location.y + yOffset - 1, location.x + xOffset + x2, location.y + yOffset - 1 + visibleHeight/2); g->fillVerticalShaded(rect, sourceColor, destColor, false); rect.y1+=visibleHeight/2; rect.y2+=visibleHeight/2; g->fillVerticalShaded(rect, sourceColor, destColor, true); } } } } g->setRect(location.x, location.y, location.x + size.width, location.y + size.height); if (border) { drawBorder(g, *borderColor); // Add some more lines to surround scroll bar g->setColor(dColor); g->drawHLine(location.x + 1, location.x + size.width - 1, location.y + size.height - 3 - SCROLLBARWIDTH); g->setColor(bColor); g->drawHLine(location.x, location.x + size.width, location.y + size.height - 2 - SCROLLBARWIDTH); } hScrollbar->paint(g); g->setRect(location.x + 2, location.y + 2, location.x + 2 + visibleWidth, location.y + 2 + visibleHeight); g->setColor(255, 255, 255); g->drawHLine(location.x + xOffset, location.x + xOffset + visibleWidth, location.y + xOffset + (visibleHeight>>1)); if (!sampleEditor->isEditableSample()) return; xOffset+=location.x; yOffset+=location.y + (visibleHeight>>1); bool sel = (sEnd >= 0 || sStart >= 0); float scale = (sample->type & 16) ? 1.0f/(32768.0f / ((visibleHeight-4)/2)) : 1.0f/(128.0f / ((visibleHeight-4)/2)); mp_sint32 lasty = -(pp_int32)(sample->getSampleValue((pp_int32)(startPos*xScale))*scale); g->setColor(*borderColor); g->setPixel(xOffset, yOffset); for (mp_sint32 x = 1; x < visibleWidth; x++) { if ((pp_int32)((startPos+x)*xScale) < getVisibleLength()) { if (sel && x >= (pp_int32)((sStart/xScale)-startPos) && x <= (pp_int32)((sEnd/xScale)-startPos) && (selectionTicker == -1)) { g->setColor(255-dColor.r,255-dColor.g,255-dColor.b); g->setPixel(xOffset + x, yOffset); g->setColor(255, 255, 255); } else { g->setColor(*borderColor); g->setPixel(xOffset + x, yOffset); g->setColor(255, 255, 128); } float findex = ((startPos+x)*xScale); pp_int32 index = (pp_int32)(floor(findex)); pp_int32 index2 = index+1; if (index2 >= (signed)sample->samplen) index2 = sample->samplen-1; float t = findex - index; mp_sint32 y1 = -(mp_sint32)((sample->getSampleValue(index))*scale); mp_sint32 y2 = -(mp_sint32)((sample->getSampleValue(index2))*scale); mp_sint32 y = (mp_sint32)((1.0f-t) * y1 + t * y2); g->drawLine(xOffset + x-1, yOffset + lasty, xOffset + x, yOffset + y); lasty = y; } } for (pp_int32 sm = 0; sm < TrackerConfig::maximumPlayerChannels; sm++) { pp_int32 showMark = showMarks[sm].pos; if (!showMarks[sm].intensity || showMark == -1) continue; pp_int32 shade = 256; pp_int32 panning = showMarks[sm].panning; if (showMark >= 0 && showMark <= (signed)sample->samplen && shade) { pp_int32 x = (pp_int32)((showMark/xScale)-startPos); g->setColor((255*shade)>>8, ((255-panning)*shade)>>8, (panning*shade)>>8); g->drawVLine(yOffset - (visibleHeight>>1), yOffset + (visibleHeight>>1)-2, xOffset+x); } } if (sample->type & 3) { float myxScale = xScale/*(xScale*sample->samplen) / (float)(sample->samplen-1)*/; pp_int32 loopstart = getRepeatStart(); pp_int32 looplen = getRepeatLength(); pp_int32 x = (pp_int32)(loopstart/myxScale)-startPos; pp_int32 x2 = (pp_int32)((loopstart+looplen)/myxScale)-startPos/* - 1*/; g->setColor(255, 128, 64); g->drawVLine(yOffset - (visibleHeight>>1), yOffset + (visibleHeight>>1)-2, xOffset+x); if (x2 < x) x2 = x; // if the loop marker is exactly on the border of this client area // it's better to make it visible if (xOffset+x2 >= location.x + size.width-2 && xOffset+x2 <= location.x + size.width) x2 = visibleWidth-1; g->drawVLine(yOffset - (visibleHeight>>1), yOffset + (visibleHeight>>1)-2, xOffset+x2); drawLoopMarker(g, xOffset+x - 6, yOffset - (visibleHeight>>1), true, 6); drawLoopMarker(g, xOffset+x2 - 6, yOffset + (visibleHeight>>1) - 9, false, 6); } // loop markers beneath range text char buffer[32]; if (offsetFormat == OffsetFormatHex) sprintf(buffer, "%x", (mp_sint32)ceil(startPos*xScale)); else if (offsetFormat == OffsetFormatDec) sprintf(buffer, "%d", (mp_sint32)ceil(startPos*xScale)); else if (offsetFormat == OffsetFormatMillis) { pp_uint32 millis = sampleEditor->convertSmpPosToMillis((mp_sint32)ceil(startPos*xScale), relativeNote); formatMillis(buffer, millis); } PPFont* font = PPFont::getFont(PPFont::FONT_TINY); g->setFont(font); g->setColor(0, 0, 0); g->drawString(buffer, location.x + 3, location.y + visibleHeight - font->getCharHeight() + 1); g->setColor(255, 0, 255); g->drawString(buffer, location.x + 2, location.y + visibleHeight - font->getCharHeight()); mp_sint32 end = (mp_sint32)ceil((startPos+visibleWidth)*xScale); if (end > sampleEditor->getSampleLen()) end = sampleEditor->getSampleLen(); if (offsetFormat == OffsetFormatHex) sprintf(buffer, "%x", end); else if (offsetFormat == OffsetFormatDec) sprintf(buffer, "%d", end); else if (offsetFormat == OffsetFormatMillis) { pp_uint32 millis = sampleEditor->convertSmpPosToMillis(end, relativeNote); formatMillis(buffer, millis); } g->setColor(0, 0, 0); g->drawString(buffer, location.x + 3 + visibleWidth - font->getStrWidth(buffer), location.y + 3); g->setColor(255, 0, 255); g->drawString(buffer, location.x + 2 + visibleWidth - font->getStrWidth(buffer), location.y + 2); } bool SampleEditorControl::hitsLoopstart(const PPPoint* p) { pp_int32 cx = (pp_int32)(location.x + (sampleEditor->getRepeatStart()/xScale)-startPos); pp_int32 cy = (pp_int32)(location.y + 5); return (p->x >= cx - 7 && p->x <= cx + 7 && p->y >= cy - 5 && p->y <= cy + 8 && sampleEditor->getLoopType()); } bool SampleEditorControl::hitsLoopend(const PPPoint* p) { pp_int32 cx2 = (pp_int32)(location.x + (sampleEditor->getRepeatEnd()/xScale)-startPos); pp_int32 cy2 = (pp_int32)(location.y + 2 + visibleHeight - 6); return (p->x >= cx2 - 7 && p->x <= cx2 + 7 && p->y >= cy2 - 5 && p->y <= cy2 + 5 && sampleEditor->getLoopType()); } void SampleEditorControl::startMarkerDragging(const PPPoint* p) { if (hitsLoopstart(p)) { selecting = 1; } else if (hitsLoopend(p)) { selecting = 2; } else { switch (parentScreen->getCurrentActiveMouseCursor()) { case MouseCursorTypeStandard: if (::getKeyModifier() == KeyModifierCTRL) { selecting = -1; resizing = 0; break; } selectionStartNew = selectionEndNew = positionToSample(*p); selecting = 0; resizing = 0; break; case MouseCursorTypeResizeLeft: selectionStartNew = positionToSample(*p); selecting = -1; resizing = 1; break; case MouseCursorTypeResizeRight: selectionEndNew = positionToSample(*p); selecting = -1; resizing = 2; break; case MouseCursorTypeHand: selectionStartNew = sampleEditor->getSelectionStart(); selectionEndNew = sampleEditor->getSelectionEnd(); selectionDragPivot = positionToSample(*p); selecting = -1; resizing = 3; break; } } if (selecting >= 0) { currentRepeatStart = sampleEditor->getRepeatStart(); currentRepeatLength = sampleEditor->getRepeatLength();; } } void SampleEditorControl::endMarkerDragging() { if (resizing) parentScreen->setMouseCursor(MouseCursorTypeStandard); else { if (selectionStartNew != -1) sampleEditor->setSelectionStart(selectionStartNew); if (selectionEndNew != -1) sampleEditor->setSelectionEnd(selectionEndNew); } // see if something has been changed after the loop markers have been dragged around if (selecting >= 0 && (currentRepeatStart != (signed)sampleEditor->getRepeatStart() || currentRepeatLength != (signed)sampleEditor->getRepeatLength())) { sampleEditor->setRepeatStart(currentRepeatStart); sampleEditor->setRepeatLength(currentRepeatLength); notifyChanges(); } selecting = -1; resizing = 0; } pp_int32 SampleEditorControl::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; switch (event->getID()) { case eRMouseDown: { invokeContextMenuLabel: PPPoint* p = (PPPoint*)event->getDataPtr(); if (!hScrollbar->hit(*p)) { endMarkerDragging(); invokeContextMenu(*p); } else { if (controlCaughtByLMouseButton) break; controlCaughtByRMouseButton = true; caughtControl = hScrollbar; caughtControl->dispatchEvent(event); } break; } case eLMouseDown: { hasDragged = false; PPPoint* p = (PPPoint*)event->getDataPtr(); // Clicked on horizontal scrollbar -> route event to scrollbar and catch scrollbar control if (hScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; controlCaughtByLMouseButton = true; caughtControl = hScrollbar; caughtControl->dispatchEvent(event); } // Clicked on sample data -> select sample data else { selectionTicker = 0; if (!sampleEditor->isEditableSample()) { selecting = -1; break; } // start drawing if (drawMode || (::getKeyModifier() == KeyModifierSHIFT)) { PPPoint* p = (PPPoint*)event->getDataPtr(); sampleEditor->startDrawing(); drawSample(*p); notifyUpdate(); break; } startMarkerDragging(p); } break; } case eRMouseUp: { controlCaughtByRMouseButton = false; if (caughtControl && !controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; break; } break; } case eLMouseUp: { selectionTicker = -1; controlCaughtByLMouseButton = false; if (caughtControl && !controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; } else { if (drawMode || sampleEditor->isDrawing()) { sampleEditor->endDrawing(); break; } endMarkerDragging(); validate(false); notifyUpdate(); } selectionStartNew = selectionEndNew = -1; break; } case eLMouseRepeat: { // Clicked on horizontal scrollbar -> route event to scrollbar and catch scrollbar control if (caughtControl && controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } PPPoint* p = (PPPoint*)event->getDataPtr(); // check context menu stuff first // for slowing down mouse pressed events if (selectionTicker >= 0) selectionTicker++; // no selection has been made or mouse hasn't been dragged // mouse hasn't been dragged and selection ticker has reached threshold value if (selecting <= 0 && !hasDragged && selectionTicker > 0 && getKeyModifier() == 0) { selecting = -1; selectionTicker = -1; goto invokeContextMenuLabel; } // now check other stuff pp_int32 ldist = p->x - (location.x+2); pp_int32 rdist = (location.x + size.width) - p->x; if (rdist < scrollDist) { pp_int32 visibleItems = visibleWidth; startPos += (visibleWidth>>6); if (startPos + visibleItems > (signed)getMaxWidth()) startPos = getMaxWidth()-visibleItems; if (startPos < 0) startPos = 0; float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); goto selectingAndResizing; } else if (ldist < scrollDist) { pp_int32 visibleItems = visibleWidth; startPos -= (visibleWidth>>6); if (startPos < 0) startPos = 0; float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); goto selectingAndResizing; } break; } case eLMouseDrag: { if (caughtControl && controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } hasDragged = true; selectionTicker = -1; if (drawMode || (sampleEditor->isDrawing() && (::getKeyModifier() & KeyModifierSHIFT))) { drawSample(*(PPPoint*)event->getDataPtr()); notifyUpdate(); break; } // apply new start / end if (selectionStartNew != -1) { sampleEditor->setSelectionStart(selectionStartNew); selectionStartNew = -1; } if (selectionEndNew != -1) { sampleEditor->setSelectionEnd(selectionEndNew); selectionEndNew = -1; } selectingAndResizing: // Moving selection end if (selecting == 0) { sampleEditor->setSelectionEnd(positionToSample(*(PPPoint*)event->getDataPtr())); } // Moving loop start else if (selecting == 1 && sampleEditor->isEditableSample()) { // Moving both loop points at the same time if (::getKeyModifier() == KeyModifierALT) { parentScreen->setMouseCursor(MouseCursorTypeHand); currentRepeatStart = positionToSample(*(PPPoint*)event->getDataPtr()); } // only move start else if (!::getKeyModifier()) { pp_int32 loopend = currentRepeatStart + currentRepeatLength; pp_int32 loopstart = positionToSample(*(PPPoint*)event->getDataPtr()); if (loopstart < loopend) { currentRepeatLength = loopend - loopstart; currentRepeatStart = loopstart; } } } // Moving loop end else if (selecting == 2 && sampleEditor->isEditableSample()) { // Moving both loop points at the same time if (::getKeyModifier() == KeyModifierALT) { pp_int32 loopend = positionToSample(*(PPPoint*)event->getDataPtr()); currentRepeatStart = loopend - currentRepeatLength; } // only move end else if (!::getKeyModifier()) { pp_int32 loopend = positionToSample(*(PPPoint*)event->getDataPtr()); pp_int32 loopstart = currentRepeatStart; if (loopstart < loopend) { currentRepeatLength = loopend - loopstart; currentRepeatStart = loopstart; } } } else if (resizing) { switch (resizing) { case 1: parentScreen->setMouseCursor(MouseCursorTypeResizeLeft); sampleEditor->setSelectionStart(positionToSample(*(PPPoint*)event->getDataPtr())); break; case 2: parentScreen->setMouseCursor(MouseCursorTypeResizeRight); sampleEditor->setSelectionEnd(positionToSample(*(PPPoint*)event->getDataPtr())); break; case 3: { parentScreen->setMouseCursor(MouseCursorTypeHand); mp_sint32 delta = selectionDragPivot - positionToSample(*(PPPoint*)event->getDataPtr()); sampleEditor->getSelectionEnd() -= delta; sampleEditor->getSelectionStart() -= delta; selectionDragPivot = positionToSample(*(PPPoint*)event->getDataPtr()); break; } } } else { break; } notifyUpdate(); break; } case eRMouseDrag: { if (caughtControl && controlCaughtByRMouseButton) caughtControl->dispatchEvent(event); break; } case eRMouseRepeat: { if (caughtControl && controlCaughtByRMouseButton) caughtControl->dispatchEvent(event); break; } // mouse wheel case eMouseWheelMoved: { TMouseWheelEventParams* params = (TMouseWheelEventParams*)event->getDataPtr(); if (params->delta > 0) { scrollWheelZoomOut(¶ms->pos); } else if (params->delta < 0) { scrollWheelZoomIn(¶ms->pos); } event->cancel(); break; } case eMouseMoved: { PPPoint* p = (PPPoint*)event->getDataPtr(); MouseCursorTypes type = parentScreen->getCurrentActiveMouseCursor(); // check for loop marker distance if (hitsLoopstart(p) && ::getKeyModifier() == KeyModifierALT) { type = MouseCursorTypeHand; } else if (hitsLoopend(p) && ::getKeyModifier() == KeyModifierALT) { type = MouseCursorTypeHand; } else { type = MouseCursorTypeStandard; if (hasValidSelection()) { pp_int32 sStart = sampleEditor->getLogicalSelectionStart(); pp_int32 sEnd = sampleEditor->getLogicalSelectionEnd(); pp_int32 x1 = (pp_int32)((sStart)/xScale)-startPos + location.x + 2; pp_int32 x2 = (pp_int32)((sEnd)/xScale)-startPos + location.x + 2; pp_int32 minDist = (scrollDist>>4); if (minDist < 1) minDist = 1; pp_int32 sDist1 = abs(x1 - p->x); pp_int32 sDist2 = abs(p->x - x2); if (sDist1 >= 0 && sDist1 <= minDist && (::getKeyModifier() == KeyModifierCTRL)) { type = MouseCursorTypeResizeLeft; } else if (sDist2 >= 0 && sDist2 <= minDist && (::getKeyModifier() == KeyModifierCTRL)) { type = MouseCursorTypeResizeRight; } else if ((p->x >= x1) && (p->x <= x2) && (::getKeyModifier() == KeyModifierALT)) { type = MouseCursorTypeHand; } } } if (type != parentScreen->getCurrentActiveMouseCursor()) parentScreen->setMouseCursor(type); break; } case eMouseEntered: parentScreen->setMouseCursor(MouseCursorTypeStandard); break; case eMouseLeft: parentScreen->setMouseCursor(MouseCursorTypeStandard); break; default: if (caughtControl == NULL) break; caughtControl->dispatchEvent(event); break; } return 0; } pp_int32 SampleEditorControl::handleEvent(PPObject* sender, PPEvent* event) { // Horizontal scrollbar, scroll up (=left) if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarScrollUp) { pp_int32 visibleItems = visibleWidth; startPos -= (visibleWidth>>6); if (startPos < 0) startPos = 0; float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, scroll down (=right) else if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarScrollDown) { pp_int32 visibleItems = visibleWidth; startPos += (visibleWidth>>6); if (startPos + visibleItems > (signed)getMaxWidth()) { startPos = getMaxWidth()-visibleItems; if (startPos < 0) startPos = 0; } float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, position changed else if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarPosChanged) { float pos = hScrollbar->getBarPosition()/65536.0f; pp_int32 visibleItems = visibleWidth; float v = (float)(getMaxWidth() - visibleItems); startPos = (pp_uint32)(v*pos); } else if ((sender == reinterpret_cast(editMenuControl) || sender == reinterpret_cast(subMenuAdvanced) || sender == reinterpret_cast(subMenuPT) || sender == reinterpret_cast(subMenuGenerators)) && event->getID() == eCommand) { executeMenuCommand(*((pp_int32*)event->getDataPtr())); return 0; } parentScreen->paintControl(this); return 0; } void SampleEditorControl::setSize(const PPSize& size) { PPControl::setSize(size); hScrollbar->setSize(size.width - 1); } void SampleEditorControl::setLocation(const PPPoint& location) { PPControl::setLocation(location); hScrollbar->setLocation(PPPoint(location.x, location.y + size.height - SCROLLBARWIDTH - 1)); } pp_int32 SampleEditorControl::getMaxWidth() { if (sampleEditor == NULL || sampleEditor->isEmptySample()) return 1; return (pp_int32)(getVisibleLength()/xScale); } void SampleEditorControl::adjustScrollbars() { float s = (float)visibleWidth / (float)getMaxWidth(); float olds = hScrollbar->getBarSize() / 65536.0f; hScrollbar->setBarSize((pp_int32)(s*65536.0f), false); s = hScrollbar->getBarSize() / 65536.0f; float scale = s / olds; float pos = hScrollbar->getBarPosition()/65536.0f; hScrollbar->setBarPosition((pp_int32)(pos*scale*65536.0f)); pos = hScrollbar->getBarPosition()/65536.0f; pp_int32 visibleItems = visibleWidth; float v = (float)(getMaxWidth() - visibleItems); startPos = (pp_uint32)(v*pos); if (startPos < 0) { startPos = 0; } } pp_int32 SampleEditorControl::positionToSample(PPPoint cp) { translateCoordinates(cp); if (cp.y < 0) cp.y = 0; if (cp.y >= visibleHeight) cp.y = visibleHeight - 1; pp_int32 smppos = (pp_int32)((cp.x + startPos)*xScale); if (smppos < 0) smppos = 0; if (smppos > sampleEditor->getSampleLen()) smppos = sampleEditor->getSampleLen(); return smppos; } void SampleEditorControl::drawSample(const PPPoint& p) { if (sampleEditor->isEmptySample() || !sampleEditor->getSampleLen()) return; pp_int32 sampleIndex = positionToSample(p); if (sampleIndex < 0) sampleIndex = 0; if (sampleIndex > sampleEditor->getSampleLen()) sampleIndex = sampleEditor->getSampleLen(); pp_int32 y = p.y - (location.y + 1); if (y < 0) y = 0; if (y >= visibleHeight) y = visibleHeight - 1; float fy = -(((float)y / (float)(visibleHeight - 1)) - 0.5f); sampleEditor->drawSample(sampleIndex, fy); } void SampleEditorControl::validate(bool repositionBars/* = true*/, bool rescaleBars/* = false*/) { if (!sampleEditor->validate()) return; if (repositionBars) { if (rescaleBars) { xScale = calcScale(); minScale = 0.05f; if (xScale < minScale) xScale = minScale; adjustScrollbars(); } float origPos = startPos * xScale; bool recalibBar = false; if (origPos + visibleWidth*xScale >= getVisibleLength()) { origPos -= (origPos + visibleWidth*xScale-getVisibleLength()); if (origPos < 0.0f) origPos = 0.0f; recalibBar = true; } if (origPos == 0.0f && (getVisibleLength()/xScale) < visibleWidth) { xScale = calcScale(); minScale = 0.05f; if (xScale < minScale) xScale = minScale; recalibBar = true; } if (recalibBar) { startPos = (pp_int32)(origPos/xScale); pp_int32 visibleItems = visibleWidth; float s = (float)visibleWidth / (float)getMaxWidth(); hScrollbar->setBarSize((pp_int32)(s*65536.0f), false); float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } } } void SampleEditorControl::attachSampleEditor(SampleEditor* sampleEditor) { if (this->sampleEditor) this->sampleEditor->removeNotificationListener(this); this->sampleEditor = sampleEditor; this->sampleEditor->addNotificationListener(this); if (sampleEditor->isEditableSample()) { xScale = calcScale(); minScale = 0.05f; if (xScale < minScale) xScale = minScale; } else xScale = 1.0f; for (pp_int32 i = 0; i < TrackerConfig::maximumPlayerChannels; i++) { showMarks[i].pos = -1; showMarks[i].intensity = 0; showMarks[i].panning = 128; } adjustScrollbars(); } bool SampleEditorControl::hasValidSelection() { return sampleEditor->hasValidSelection() || resizing; } void SampleEditorControl::showRange() { if (sampleEditor->isEmptySample()) return; pp_int32 sStart = sampleEditor->getLogicalSelectionStart(); pp_int32 sEnd = sampleEditor->getLogicalSelectionEnd(); bool sel = (sEnd >= 0 && sStart >= 0); if (!sel) return; xScale = (float)(sEnd - sStart)/(float)visibleWidth; if (xScale < minScale) xScale = minScale; float origPos = (float)sStart; if ((pp_int32)(origPos + visibleWidth*xScale) >= getVisibleLength()) { origPos -= (origPos + visibleWidth*xScale-getVisibleLength()); if (origPos < 0.0f) origPos = 0.0f; } startPos = (pp_int32)(origPos/xScale); pp_int32 visibleItems = visibleWidth; float s = (float)visibleWidth / (float)getMaxWidth(); hScrollbar->setBarSize((pp_int32)(s*65536.0f), false); float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } void SampleEditorControl::rangeAll(bool updateNotify/* = false*/) { sampleEditor->selectAll(); if (updateNotify) notifyUpdate(); } void SampleEditorControl::rangeClear(bool updateNotify/* = false*/) { sampleEditor->resetSelection(); if (updateNotify) notifyUpdate(); } void SampleEditorControl::increaseRangeStart() { if (sampleEditor->getSelectionStart() == -1 || sampleEditor->getSelectionEnd() == -1) return; sampleEditor->getSelectionStart()++; validate(false); } void SampleEditorControl::decreaseRangeStart() { if (sampleEditor->getSelectionStart() == -1 || sampleEditor->getSelectionEnd() == -1) return; if (sampleEditor->getSelectionStart() > 0) sampleEditor->getSelectionStart()--; validate(false); } void SampleEditorControl::increaseRangeEnd() { if (sampleEditor->getSelectionStart() == -1 || sampleEditor->getSelectionEnd() == -1) return; sampleEditor->getSelectionEnd()++; validate(false); } void SampleEditorControl::decreaseRangeEnd() { if (sampleEditor->getSelectionStart() == -1 || sampleEditor->getSelectionEnd() == -1) return; if (sampleEditor->getSelectionEnd() > 0) sampleEditor->getSelectionEnd()--; validate(false); } bool SampleEditorControl::canZoomOut() { if (sampleEditor->isEmptySample()) return false; float xScale2 = calcScale(); if (xScale2 < minScale) xScale2 = minScale; return xScale < xScale2; } void SampleEditorControl::zoomOut(float factor/* = 2.0f*/, pp_int32 center/* = -1*/) { if (sampleEditor->isEmptySample()) return; float origPos = (center == -1 ? startPos * xScale : center); xScale*=factor; float xScale2 = calcScale(); if (xScale2 < minScale) xScale2 = minScale; if (xScale > xScale2) xScale = xScale2; origPos-=(visibleWidth/2*xScale); if (origPos < 0) origPos = 0.0f; if (origPos + visibleWidth*xScale >= getVisibleLength()) { origPos -= (origPos + visibleWidth*xScale-getVisibleLength()); if (origPos < 0.0f) origPos = 0.0f; } startPos = (pp_int32)(origPos/xScale); pp_int32 visibleItems = visibleWidth; float s = (float)visibleWidth / (float)getMaxWidth(); hScrollbar->setBarSize((pp_int32)(s*65536.0f), false); float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } void SampleEditorControl::zoomIn(float factor/* = 0.5f*/, pp_int32 center/* = -1*/) { if (sampleEditor->isEmptySample()) return; float origPos = (center == -1 ? startPos * xScale : center); xScale*=factor; origPos-=(visibleWidth/2*xScale); if (origPos < 0) origPos = 0.0f; if (xScale < minScale) xScale = minScale; float xScale2 = calcScale(); if (xScale2 < minScale) xScale2 = minScale; if (xScale > xScale2) xScale = xScale2; if (origPos + visibleWidth*xScale >= getVisibleLength()) { origPos -= (origPos + visibleWidth*xScale-getVisibleLength()); if (origPos < 0.0f) origPos = 0.0f; } startPos = (pp_int32)(origPos/xScale); pp_int32 visibleItems = visibleWidth; float s = (float)visibleWidth / (float)getMaxWidth(); hScrollbar->setBarSize((pp_int32)(s*65536.0f), false); float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } void SampleEditorControl::showAll() { if (sampleEditor->isEmptySample()) return; startPos = 0; xScale = calcScale(); if (xScale < minScale) xScale = minScale; adjustScrollbars(); } pp_int32 SampleEditorControl::getCurrentPosition() { if (sampleEditor->isEmptySample()) return 0; return (pp_int32)(startPos*xScale); } pp_int32 SampleEditorControl::getCurrentDisplayRange() { if (sampleEditor->isEmptySample()) return 0; pp_int32 i = (pp_int32)ceil(visibleWidth*xScale); if (i > sampleEditor->getSampleLen()) i = sampleEditor->getSampleLen(); return i; } bool SampleEditorControl::showMarksVisible() { if (sampleEditor->isEmptySample()) return false; for (pp_int32 sm = 0; sm < TrackerConfig::maximumPlayerChannels; sm++) { pp_int32 showMark = showMarks[sm].pos; if (!showMarks[sm].intensity || showMark == -1) continue; if (showMark >= 0 && showMark <= sampleEditor->getSampleLen()) { pp_int32 x = (pp_int32)((showMark/xScale)-startPos); if (x <= visibleWidth) return true; } } return false; } void SampleEditorControl::reset() { sampleEditor->reset(); } bool SampleEditorControl::contextMenuVisible() { return parentScreen->hasContextMenu(editMenuControl); } void SampleEditorControl::invokeContextMenu(const PPPoint& p, bool translatePoint/* = true*/) { PPPoint cp = p; if (translatePoint) { translateCoordinates(cp); if (cp.x > visibleWidth || cp.y > visibleHeight) return; } editMenuControl->setLocation(p); const bool isEmptySample = sampleEditor->isEmptySample(); // update menu states editMenuControl->setState(MenuCommandIDUndo, !sampleEditor->canUndo()); editMenuControl->setState(MenuCommandIDRedo, !sampleEditor->canRedo()); editMenuControl->setState(MenuCommandIDPaste, !sampleEditor->canPaste()); editMenuControl->setState(MenuCommandIDMixPaste, sampleEditor->clipBoardIsEmpty() || isEmptySample); editMenuControl->setState(MenuCommandIDCopy, !hasValidSelection()); editMenuControl->setState(MenuCommandIDCut, !hasValidSelection()); editMenuControl->setState(MenuCommandIDCrop, !hasValidSelection()); editMenuControl->setState(MenuCommandIDSelectAll, isEmptySample); // update submenu states subMenuAdvanced->setState(MenuCommandIDNormalize, isEmptySample); subMenuAdvanced->setState(MenuCommandIDVolumeFade, isEmptySample); subMenuAdvanced->setState(MenuCommandIDVolumeBoost, isEmptySample); subMenuAdvanced->setState(MenuCommandIDReverse, isEmptySample); subMenuAdvanced->setState(MenuCommandIDXFade, !sampleEditor->isValidxFadeSelection() || isEmptySample || !sampleEditor->getLoopType()); subMenuAdvanced->setState(MenuCommandIDChangeSign, isEmptySample); subMenuAdvanced->setState(MenuCommandIDSwapByteOrder, isEmptySample || !sampleEditor->is16Bit()); subMenuAdvanced->setState(MenuCommandIDDCNormalize, isEmptySample); subMenuAdvanced->setState(MenuCommandIDDCOffset, isEmptySample); subMenuAdvanced->setState(MenuCommandIDRectangularSmooth, isEmptySample); subMenuAdvanced->setState(MenuCommandIDTriangularSmooth, isEmptySample); subMenuAdvanced->setState(MenuCommandIDEQ3Band, isEmptySample); subMenuAdvanced->setState(MenuCommandIDEQ10Band, isEmptySample); subMenuAdvanced->setState(MenuCommandIDResample, isEmptySample); subMenuPT->setState(MenuCommandIDPTBoost, isEmptySample); subMenuGenerators->setState(MenuCommandIDGenerateNoise, isEmptySample); subMenuGenerators->setState(MenuCommandIDGenerateSine, isEmptySample); subMenuGenerators->setState(MenuCommandIDGenerateSquare, isEmptySample); subMenuGenerators->setState(MenuCommandIDGenerateTriangle, isEmptySample); subMenuGenerators->setState(MenuCommandIDGenerateSawtooth, isEmptySample); subMenuGenerators->setState(MenuCommandIDGenerateSilence, isEmptySample); parentScreen->setContextMenuControl(editMenuControl); } void SampleEditorControl::hideContextMenu() { parentScreen->removeContextMenuControl(subMenuAdvanced, false); parentScreen->removeContextMenuControl(editMenuControl); } void SampleEditorControl::executeMenuCommand(pp_int32 commandId) { switch (commandId) { // cut case MenuCommandIDCut: sampleEditor->cut(); break; // copy case MenuCommandIDCopy: sampleEditor->copy(); break; // paste case MenuCommandIDPaste: sampleEditor->paste(); break; // mix-paste case MenuCommandIDMixPaste: sampleEditor->mixPasteSample(); break; // crop case MenuCommandIDCrop: sampleEditor->cropSample(); break; // undo case MenuCommandIDUndo: sampleEditor->undo(); break; // redo case MenuCommandIDRedo: sampleEditor->redo(); break; // range (=select) all case MenuCommandIDSelectAll: rangeAll(true); break; // Invoke tools case MenuCommandIDNew: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeNew); break; case MenuCommandIDVolumeBoost: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeVolume); break; case MenuCommandIDVolumeFade: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeFade); break; case MenuCommandIDResample: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeResample); break; case MenuCommandIDDCOffset: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeDCOffset); break; case MenuCommandIDNormalize: sampleEditor->tool_normalizeSample(NULL); break; case MenuCommandIDReverse: sampleEditor->tool_reverseSample(NULL); break; case MenuCommandIDPTBoost: sampleEditor->tool_PTboostSample(NULL); break; case MenuCommandIDXFade: sampleEditor->tool_xFadeSample(NULL); break; case MenuCommandIDChangeSign: sampleEditor->tool_changeSignSample(NULL); break; case MenuCommandIDSwapByteOrder: sampleEditor->tool_swapByteOrderSample(NULL); break; case MenuCommandIDDCNormalize: sampleEditor->tool_DCNormalizeSample(NULL); break; case MenuCommandIDRectangularSmooth: sampleEditor->tool_rectangularSmoothSample(NULL); break; case MenuCommandIDTriangularSmooth: sampleEditor->tool_triangularSmoothSample(NULL); break; case MenuCommandIDEQ3Band: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeEQ3Band); break; case MenuCommandIDEQ10Band: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeEQ10Band); break; case MenuCommandIDGenerateSilence: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeGenerateSilence); break; case MenuCommandIDGenerateNoise: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeGenerateNoise); break; case MenuCommandIDGenerateSine: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeGenerateSine); break; case MenuCommandIDGenerateSquare: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeGenerateSquare); break; case MenuCommandIDGenerateTriangle: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeGenerateTriangle); break; case MenuCommandIDGenerateSawtooth: invokeToolParameterDialog(ToolHandlerResponder::SampleToolTypeGenerateSawtooth); break; } } void SampleEditorControl::editorNotification(EditorBase* sender, EditorBase::EditorNotifications notification) { switch (notification) { case SampleEditor::EditorDestruction: { sampleEditor = NULL; break; } case SampleEditor::NotificationReload: { if (!sampleEditor->isEmptySample()) { xScale = calcScale(); minScale = 0.05f; if (xScale < minScale) xScale = minScale; } else xScale = 1.0f; for (pp_int32 i = 0; i < TrackerConfig::maximumPlayerChannels; i++) { showMarks[i].pos = -1; showMarks[i].intensity = 0; showMarks[i].panning = 128; } adjustScrollbars(); break; } case SampleEditor::NotificationPrepareLengthy: signalWaitState(true); break; case SampleEditor::NotificationUnprepareLengthy: signalWaitState(false); break; case SampleEditor::NotificationChangesValidate: { switch (sampleEditor->getLastOperation()) { case SampleEditor::OperationNew: showAll(); break; case SampleEditor::OperationCut: // adjust everything validate(true, true); break; default: // adjust everything according to whether size has changed validate(sampleEditor->getLastOperationDidChangeSize(), sampleEditor->getLastOperationDidChangeSize()); } break; } case SampleEditor::NotificationChanges: { bool lazyUpdateNotifications = sampleEditor->getLazyUpdateNotifications(); if (lazyUpdateNotifications) { notifyChanges(); break; } notifyChanges(); notifyUpdate(); break; } case SampleEditor::NotificationFeedUndoData: { undoInfo = UndoInfo(xScale, minScale, startPos, hScrollbar->getBarPosition(), hScrollbar->getBarSize()); sampleEditor->setUndoUserData(&undoInfo, sizeof(undoInfo)); break; } case SampleEditor::NotificationFetchUndoData: { undoInfo = UndoInfo(xScale, minScale, startPos, hScrollbar->getBarPosition(), hScrollbar->getBarSize()); if (sizeof(undoInfo) == sampleEditor->getUndoUserDataLen()) { memcpy(&undoInfo, sampleEditor->getUndoUserData(), sizeof(undoInfo)); xScale = undoInfo.xScale; minScale = undoInfo.minScale; startPos = undoInfo.startPos; if (undoInfo.barPos != -1) hScrollbar->setBarPosition(undoInfo.barPos); if (undoInfo.barScale != -1) hScrollbar->setBarPosition(undoInfo.barScale); validate(); //adjustScrollbars(); notifyUpdate(); } break; } case SampleEditor::NotificationUpdateNoChanges: notifyUpdate(); break; } } milkytracker-0.90.85+dfsg/src/tracker/PatternTools.cpp0000644000175000017500000003325211150223367022014 0ustar admin2admin2/* * tracker/PatternTools.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /////////////////////////////////////////////////////////////// // Handle with care /////////////////////////////////////////////////////////////// #include "PatternTools.h" #include "MilkyPlay.h" static const char* noteNames[12] = {"C-","C#","D-","D#","E-","F-","F#","G-","G#","A-","A#","B-"}; static const char hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; /*TXMPattern* PatternTools::pattern = NULL; pp_int32 PatternTools::currentEffectIndex = 0; pp_int32 PatternTools::offset = 0; pp_int32 PatternTools::lockOffset = 0;*/ void PatternTools::setPosition(TXMPattern* pattern, pp_uint32 channel, pp_uint32 row) { if (channel >= pattern->channum || row >= pattern->rows) offset = -1; else { pp_uint32 slotSize = pattern->effnum*2 + 2; offset = (slotSize*pattern->channum)*row + (channel*slotSize); PatternTools::pattern = pattern; } } pp_int32 PatternTools::getNote() { if (offset < 0) return 0; return *(pattern->patternData + offset); } void PatternTools::setNote(pp_uint32 note) { if (offset < 0) return; *(pattern->patternData + offset) = (pp_uint8)note; } pp_int32 PatternTools::getInstrument() { if (offset < 0) return 0; return *(pattern->patternData + offset + 1); } void PatternTools::setInstrument(pp_uint32 instrument) { if (offset < 0) return; *(pattern->patternData + offset + 1) = (pp_uint8)instrument; } void PatternTools::getFirstEffect(pp_int32& effect, pp_int32& operand) { if (offset < 0) { effect = operand = 0; return; } currentEffectIndex = 0; effect = *(pattern->patternData + offset + 2 + currentEffectIndex*2); operand = *(pattern->patternData + offset + 2 + currentEffectIndex*2 + 1); } void PatternTools::getNextEffect(pp_int32& effect, pp_int32& operand) { if (offset < 0) { effect = operand = 0; return; } currentEffectIndex++; effect = *(pattern->patternData + offset + 2 + currentEffectIndex*2); operand = *(pattern->patternData + offset + 2 + currentEffectIndex*2 + 1); } void PatternTools::setFirstEffect(pp_int32 effect, pp_int32 operand) { if (offset < 0) return; currentEffectIndex = 0; *(pattern->patternData + offset + 2 + currentEffectIndex*2) = (pp_uint8)effect; *(pattern->patternData + offset + 2 + currentEffectIndex*2 + 1) = (pp_uint8)operand; } void PatternTools::setNextEffect(pp_int32 effect, pp_int32 operand) { if (offset < 0) return; currentEffectIndex++; *(pattern->patternData + offset + 2 + currentEffectIndex*2) = (pp_uint8)effect; *(pattern->patternData + offset + 2 + currentEffectIndex*2 + 1) = (pp_uint8)operand; } void PatternTools::setEffect(pp_int32 currentEffectIndex, pp_int32 effect, pp_int32 operand) { if (offset < 0) return; *(pattern->patternData + offset + 2 + currentEffectIndex*2) = (pp_uint8)effect; *(pattern->patternData + offset + 2 + currentEffectIndex*2 + 1) = (pp_uint8)operand; } void PatternTools::getEffect(pp_int32 currentEffectIndex, pp_int32& effect, pp_int32& operand) { if (offset < 0) { effect = operand = 0; return; } effect = *(pattern->patternData + offset + 2 + currentEffectIndex*2); operand = *(pattern->patternData + offset + 2 + currentEffectIndex*2 + 1); } void PatternTools::convertEffectsToFT2(pp_int32& eff, pp_int32& op) { if (eff == 0 && op == 0) return; pp_uint32 effIn = eff; pp_uint32 opIn = op; pp_uint32 effOut = 0; pp_uint32 opOut = 0; // Protracker commands if (effIn > 0 && effIn <= 0x11) { effOut = effIn; opOut = opIn; if (effIn == 0x0C || effIn == 0x10) opOut = (mp_ubyte)(((mp_sint32)opOut*64)/255); } // panning slide else if (effIn == 0x14 || effIn == 0x51) { effOut = 0x14; opOut = opIn; } // panning slide else if (effIn == 0x15) { effOut = effIn; opOut = opIn; } // set tempo else if (effIn == 0x16) { if (opIn) { if (opIn < 32) opIn = 32; effOut = 0x0F; opOut = opIn; } } // Panning slide / Multi retrig / tremor else if (effIn == 0x19 || effIn == 0x1B || effIn == 0x1D) { effOut = effIn; opOut = opIn; } // set speed else if (effIn == 0x1C) { if (opIn) { if (opIn > 31) opIn = 31; effOut = 0x0F; opOut = opIn; } } // MDL set sample offset else if (effIn == 0x1F) { effOut = 0x09; opOut = opIn; } // PLM position jump else if (effIn == 0x2B) { effOut = 0x0B; opOut = opIn; } // Protracker subcommands (most likely) else if (effIn >= 0x30 && effIn <= 0x3F) { effOut = 0x0E; opOut = ((effIn-0x30)<<4)+(opIn&0xF); } // arpeggio else if (effIn == 0x20) { if (opIn) { effOut = 0; opOut = opIn; } } // extra fine porta commands else if (effIn == 0x41) { effOut = 0x21; opOut = 0x10 + (opIn&0xF); } else if (effIn == 0x42) { effOut = 0x21; opOut = 0x20 + (opIn&0xF); } // MDL porta up else if (effIn == 0x43) { if (opIn >= 0xE0) { mp_ubyte y = (mp_ubyte)(opIn>>4); mp_ubyte x = (mp_ubyte)(opIn&0xf); switch (y) { case 0xF: effOut = 0xE; opOut = 0x10 + x; break; case 0xE: effOut = 0x21; opOut = 0x10 + (x>>1); break; } } else if (opIn) { effOut = 0x1; opOut = opIn; } } // MDL porta down else if (effIn == 0x44) { if (opIn >= 0xE0) { mp_ubyte y = (mp_ubyte)(opIn >> 4); mp_ubyte x = (mp_ubyte)(opIn & 0xf); switch (y) { case 0xF: effOut = 0xE; opOut = 0x20 + x; break; case 0xE: effOut = 0x21; opOut = 0x20 + (x>>1); break; } } else if (opIn) { effOut = 0x2; opOut = opIn; } } // MDL volslide up else if (effIn == 0x45) { if (opIn >= 0xE0) { mp_ubyte y = (mp_ubyte)(opIn>>4); mp_ubyte x = (mp_ubyte)(opIn&0xf); switch (y) { case 0xF: effOut = 0xE; opOut = 0xA0 + x; break; case 0xE: effOut = 0xE; opOut = 0xA0 + (x>>2); break; } } else if (opIn) { effOut = 0xA; opOut = (opIn>>2)<<4; } } // MDL volslide down else if (effIn == 0x46) { if (opIn >= 0xE0) { mp_ubyte y = (mp_ubyte)(opIn >> 4); mp_ubyte x = (mp_ubyte)(opIn & 0xf); switch (y) { case 0xF: effOut = 0xE; opOut = 0xB0 + x; break; case 0xE: effOut = 0xE; opOut = 0xB0 + (x>>2); break; } } else if (opIn) { effOut = 0xA; opOut = (opIn>>2)&0xF; } } // S3M porta up else if (effIn == 0x47) { if (opIn >= 0xE0) { mp_ubyte y = (mp_ubyte)(opIn >> 4); mp_ubyte x = (mp_ubyte)(opIn & 0xf); switch (y) { case 0xF: effOut = 0xE; opOut = 0x10 + x; break; case 0xE: effOut = 0x21; opOut = 0x10 + x; break; } } else if (opIn) { effOut = 0x1; opOut = opIn; } } // S3M porta down else if (effIn == 0x48) { if (opIn >= 0xE0) { mp_ubyte y = (mp_ubyte)(opIn >> 4); mp_ubyte x = (mp_ubyte)(opIn & 0xf); switch (y) { case 0xF: effOut = 0xE; opOut = 0x20 + x; break; case 0xE: effOut = 0x21; opOut = 0x20 + x; break; } } else if (opIn) { effOut = 0x2; opOut = opIn; } } // S3M volslide else if (effIn == 0x49) { if (opIn) { mp_ubyte y = (mp_ubyte)(opIn>>4); mp_ubyte x = (mp_ubyte)(opIn&0xf); if (!(x == 0xF && y)&&!(y == 0xF && x)) { if (x && y) x = 0; if (y) { effOut = 0xA; opOut = y<<4; } else if (x) { effOut = 0xA; opOut = x; } } else { if (!(x==0x0F && !y) && !(y==0x0F && !x)) { if (x==0x0F) { effOut = 0xE; opOut = 0xA0+y; } else if (y==0x0F) { effOut = 0xE; opOut = 0xB0+x; } } } } } // PSM fine volslide up else if (effIn == 0x4B) { effOut = 0x0E; opOut = opIn>>2; if (opOut>0xF) opOut=0x0F; opOut+=0xA0; } // PSM fine volslide down else if (effIn == 0x4C) { effOut = 0x0E; opOut = opIn>>2; if (opOut>0xF) opOut=0x0F; opOut+=0xB0; } // PSM porta up else if (effIn == 0x4D) { effOut = 0x01; opOut = opIn>>2; } // PSM porta down else if (effIn == 0x4E) { effOut = 0x02; opOut = opIn>>2; } eff = effOut; op = opOut; } void PatternTools::convertEffectsFromFT2(pp_int32& eff, pp_int32& op) { bool f = false; for (pp_uint32 i = 0; i < XModule::numValidXMEffects; i++) if (eff == XModule::validXMEffects[i]) f = true; if (!f) { eff = op = 0; return; } if ((eff==0xC)||(eff==0x10)) { op = XModule::vol64to255(op); } else if ((!eff)&&(op)) eff=0x20; else if (eff==0xE) { eff=(op>>4)+0x30; op=op&0xf; } else if (eff==0x21) { eff=(op>>4)+0x40; op=op&0xf; } } pp_int32 PatternTools::getVolumeFromEffect(pp_int32 eff, pp_int32 op) { mp_ubyte vol = 0; // set volume if (eff == 0x0C) { vol = (mp_ubyte)(0x10 + op); } // volslide else if (eff == 0x0A) { // use last operand? if (!op) { vol = 0x60; } // volslide down else if (op & 0xF) { vol = 0x60 + (mp_ubyte)(op&0xF); } // volslide up else if (op >> 4) { vol = 0x70 + (mp_ubyte)(op>>4); } } // extra fine volslide up else if (eff == 0xE && ((op>>4) == 0xA)) { vol = 0x90 + (mp_ubyte)(op & 0xF); } // extra fine volslide down else if (eff == 0xE && ((op>>4) == 0xB)) { vol = 0x80 + (mp_ubyte)(op & 0xF); } // extra vibrato else if (eff == 0x4) { if ((op>>4) && !(op&0xF)) { vol = 0xA0 + (mp_ubyte)(op>>4); } else if (!(op>>4)/* && (op&0xF)*/) { vol = 0xB0 + (mp_ubyte)op; } } // set panning else if (eff == 0x8) { vol = 0xC0 + (mp_ubyte)(op>>4); } // panning slide else if (eff == 0x19) { // use last operand? if (!op) { vol = 0xD0; } // panning slide left else if (op & 0xF) { vol = 0xD0 + (mp_ubyte)(op&0xF); } // panning slide right else if (op >> 4) { vol = 0xE0 + (mp_ubyte)(op>>4); } } // porta to note else if (eff == 0x03) { vol = 0xF0 + (mp_ubyte)(op>>4); } return vol; } void PatternTools::getNoteName(char* name, pp_uint32 note, bool terminate /* = true*/) { if (note == 0) { strcpy(name, "\xf4\xf4\xf4"); return; } else if ( note >= getNoteOffNote()) { strcpy(name, "\xf1\xf2\xf3"); return; } memcpy(name, noteNames[(note-1)%12], 2); name[2] = '0' + (mp_ubyte)((note-1)/12); if (terminate) name[3] = 0; } void PatternTools::getVolumeName(char* name, pp_uint32 volume) { if (volume<0x10) { name[0] = name[1] = '\xf4'; name[2] = 0; } else if (volume>=0x10 && volume<=0x50) { PatternTools::convertToHex(name, volume-0x10, 2); } else { name[2] = 0; name[1] = hex[volume&0xF]; switch (volume>>4) { case 0x6: name[0] = '-'; break; case 0x7: name[0] = '+'; break; case 0x8: name[0] = (char)253; break; case 0x9: name[0] = (char)254; break; case 0xA: name[0] = 'S'; break; case 0xB: name[0] = 'V'; break; case 0xC: name[0] = 'P'; break; case 0xD: name[0] = '<'; break; case 0xE: name[0] = '>'; break; case 0xF: name[0] = 'M'; break; } } } void PatternTools::getEffectName(char* name, pp_uint32 effect) { name[1] = 0; if (effect > sizeof(hex)) { name[0] = (char)0xfa; return; } name[0] = hex[effect]; } pp_uint32 PatternTools::getHexNumDigits(pp_uint32 value) { if (value == 0) return 1; pp_uint32 i = 0; while (value >> i*4) i++; return i; } void PatternTools::convertToHex(char* name, pp_uint32 value, pp_uint32 numDigits) { pp_uint32 i = 0; for (i = 0; i < numDigits; i++) name[i] = hex[((value>>(numDigits-1-i)*4)&0xF)]; name[i] = 0; } pp_uint32 PatternTools::getDecNumDigits(pp_uint32 value) { if (value == 0) return 1; pp_uint32 i = 0; pp_uint32 dec = 1; while (value / dec) { i++; dec*=10; } return i; } void PatternTools::convertToDec(char* name, pp_uint32 value, pp_uint32 numDigits) { pp_int32 i = 0; pp_int32 dec = 1; for (i = 0; i < (signed)numDigits-1; i++) dec*=10; for (i = 0; i < (signed)numDigits; i++) { name[i] = hex[(value/dec)%10]; dec/=10; } name[i] = 0; } void PatternTools::convertVolumeToEffect(pp_int32 vol, pp_int32& effect, pp_int32& operand) { effect = operand = 0; if (vol>=0x10&&vol<=0x50) { effect = 0x0C; operand = XModule::vol64to255(vol-0x10); return; } if (vol>=0x60) { mp_ubyte eff = (mp_ubyte)(vol>>4); mp_ubyte op = (mp_ubyte)(vol&0xf); switch (eff) { case 0x6 : eff=0x0A; op=op; break; case 0x7 : eff=0x0A; op=op<<4; break; case 0x8 : eff=0x3B; op=op; break; case 0x9 : eff=0x3A; op=op; break; case 0xA : eff=0x4; op=op<<4; break; case 0xB : eff=0x4; op=op; break; case 0xC : eff=0x8; op=op*0x11; break; case 0xD : eff=0x19; op=op; break; case 0xE : eff=0x19; op=op<<4; break; case 0xF : eff=0x3; op=op<<4; break; } effect = eff; operand = op; } } pp_uint8 PatternTools::getNoteOffNote() { return XModule::NOTE_OFF; } pp_uint32 PatternTools::normalizeVol(pp_uint32 volume) { return XModule::vol64to255((volume*64)/255); } milkytracker-0.90.85+dfsg/src/tracker/EditorBase.h0000644000175000017500000000517711150223367021051 0ustar admin2admin2/* * tracker/EditorBase.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * EditorBase.h * MilkyTracker * * Created by Peter Barth on 26.11.07. * */ #ifndef __EDITORBASE_H__ #define __EDITORBASE_H__ #include "BasicTypes.h" class XModule; template class PPSimpleVector; class EditorBase { public: enum EditorNotifications { EditorDestruction, NotificationReload, NotificationChangesValidate, NotificationChanges, NotificationUpdateNoChanges, NotificationFeedUndoData, NotificationFetchUndoData, NotificationUndoRedo, NotificationPrepareLengthy, NotificationUnprepareLengthy, NotificationPrepareCritical, NotificationUnprepareCritical }; class EditorNotificationListener { public: virtual void editorNotification(EditorBase* sender, EditorNotifications notification) = 0; }; private: PPSimpleVector* notificationListeners; bool lazyUpdateNotifications; protected: XModule* module; EditorBase(); void attachModule(XModule* module) { this->module = module; } void notifyListener(EditorNotifications notification); // this must be called when any of the editors changes the module // that will affect pointers and/or sizes in the module structure // when a module is currently playing it will be stopped void enterCriticalSection(); // continue playing module after a critical change/update void leaveCriticalSection(); public: virtual ~EditorBase(); void addNotificationListener(EditorNotificationListener* listener); bool removeNotificationListener(EditorNotificationListener* listener); // the update notification type // I'm using this to provoke update notifications which don't cause screen refreshes void setLazyUpdateNotifications(bool lazyUpdateNotifications) { this->lazyUpdateNotifications = lazyUpdateNotifications; } bool getLazyUpdateNotifications() const { return lazyUpdateNotifications; } XModule* getModule() { return module; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/SampleEditorResampler.cpp0000755000175000017500000001144711150223367023626 0ustar admin2admin2/* * tracker/SampleEditorResampler.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SampleEditorResampler.cpp * MilkyTracker * * Created by Peter Barth on 06.01.08. * */ #include "SampleEditorResampler.h" #include "XModule.h" #include "ChannelMixer.h" #include "ResamplerHelper.h" #include SampleEditorResampler::SampleEditorResampler(XModule& module, TXMSample& sample, pp_uint32 type) : module(module), sample(sample), type(type) { } SampleEditorResampler::~SampleEditorResampler() { } // we're going to abuse the resampler of the ChannelMixer class // Problem here is, we need to build up some temporary channel structure // PLUS the resampler only deals with stereo channels, so basically we're // resampling stereo data (left channel = full, right channel = empty) bool SampleEditorResampler::resample(float oldRate, float newRate) { float factor = oldRate / newRate; mp_ubyte* buffer = TXMSample::allocPaddedMem(sample.samplen * ((sample.type & 16) ? 2 : 1)); if (buffer == NULL) return false; // retrieve original sample without loop modifications if (sample.type & 16) { mp_sword* bu = (mp_sword*)buffer; for (mp_uint32 i = 0; i < sample.samplen; i++) bu[i] = sample.getSampleValue(i); bu[-1]=bu[0]; bu[-2]=bu[0]; bu[-3]=bu[0]; bu[-4]=bu[0]; bu[sample.samplen]=bu[sample.samplen-1]; bu[sample.samplen+1]=bu[sample.samplen-1]; bu[sample.samplen+3]=bu[sample.samplen-1]; bu[sample.samplen+4]=bu[sample.samplen-1]; } else { mp_sbyte* bu = (mp_sbyte*)buffer; for (mp_uint32 i = 0; i < sample.samplen; i++) bu[i] = sample.getSampleValue(i); bu[-1]=bu[0]; bu[-2]=bu[0]; bu[-3]=bu[0]; bu[-4]=bu[0]; bu[sample.samplen]=bu[sample.samplen-1]; bu[sample.samplen+1]=bu[sample.samplen-1]; bu[sample.samplen+3]=bu[sample.samplen-1]; bu[sample.samplen+4]=bu[sample.samplen-1]; } // get space for resampled data*2 as the resampler only processes stereo samples mp_sint32 finalSize = (mp_sint32)ceil(sample.samplen/factor); mp_sint32* dst = new mp_sint32[(finalSize+1)*2]; if (dst == NULL) { TXMSample::freePaddedMem(buffer); return false; } memset(dst, 0, sizeof(mp_sint32)*(finalSize+1)*2); ChannelMixer::TMixerChannel channel; channel.sample = (mp_sbyte*)buffer; channel.smplen = sample.samplen; channel.flags = ChannelMixer::MP_SAMPLE_PLAY | ((sample.type & 16) ? 4 : 0); channel.smppos = 0; channel.smpposfrac = 0; channel.fixedtimefrac = 0; channel.smpadd = (mp_sint32)(factor*65536.0f); channel.loopend = channel.smplen; channel.loopstart = 0; channel.vol = 512; channel.pan = 128; channel.cutoff = ChannelMixer::MP_INVALID_VALUE; channel.resonance = ChannelMixer::MP_INVALID_VALUE; channel.rsmpadd = (mp_sint32)((1.0f / factor) * 65536.0f); // we only need the left channel as no panning is involved channel.finalvoll = (channel.vol*128*256)<<6; channel.finalvolr = 0; channel.rampFromVolStepL = channel.rampFromVolStepR = 0; channel.index = 0; ResamplerHelper resamplerHelper; ChannelMixer::ResamplerBase* resampler = resamplerHelper.createResamplerFromIndex(type); if (resampler == NULL) { TXMSample::freePaddedMem(buffer); delete[] dst; return false; } resampler->setNumChannels(1); resampler->setFrequency((mp_sint32)newRate); // the resampler is used to process small blocks // so we feed in small blocks as well mp_sint32 numBlocks = (finalSize+1) >> 6; mp_sint32 lastBlock = (finalSize+1) & 63; mp_sint32* dsttmp = dst; for (mp_sint32 k = 0; k < numBlocks; k++) { resampler->addChannel(&channel, dsttmp, 64, 1); dsttmp+=64*2; } if (lastBlock) resampler->addChannel(&channel, dsttmp, lastBlock, 1); delete resampler; TXMSample::freePaddedMem(buffer); module.freeSampleMem((mp_ubyte*)sample.sample); sample.sample = (mp_sbyte*)module.allocSampleMem((sample.type & 16) ? finalSize*2 : finalSize); for (mp_sint32 i = 0; i < finalSize; i++) { mp_sint32 s = dst[i*2]; if (s > 32767) s = 32767; if (s < -32768) s = -32768; if (sample.type & 16) sample.setSampleValue(i, s); else sample.setSampleValue(i, s >> 8); } sample.samplen = finalSize; delete[] dst; return true; } milkytracker-0.90.85+dfsg/src/tracker/Undo.cpp0000644000175000017500000002530511150223367020263 0ustar admin2admin2/* * tracker/Undo.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ // Undo.cpp - Undo stack implementation #include "Undo.h" ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // patterns ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : Create new stack entry //--------------------------------------------------------------------------- PatternUndoStackEntry::PatternUndoStackEntry(const TXMPattern& pattern, const pp_int32 cursorPositionChannel, const pp_int32 cursorPositionRow, const pp_int32 cursorPositionInner, const UserData* userData/* = NULL*/) : UndoStackEntry(userData) { this->cursorPositionChannel = cursorPositionChannel; this->cursorPositionRow = cursorPositionRow; this->cursorPositionInner = cursorPositionInner; if (pattern.patternData) { this->pattern.rows = pattern.rows; this->pattern.channum = pattern.channum; this->pattern.effnum = pattern.effnum; this->pattern.len = pattern.compress(NULL); this->pattern.patternData = new mp_ubyte[this->pattern.len]; mp_sint32 len = pattern.compress(this->pattern.patternData); ASSERT(len == (signed)this->pattern.len); } else memset(&this->pattern, 0, sizeof(pattern)); } //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : Copy constructor //--------------------------------------------------------------------------- PatternUndoStackEntry::PatternUndoStackEntry(const PatternUndoStackEntry& source) : UndoStackEntry(&source.getUserData()) { cursorPositionChannel = source.cursorPositionChannel; cursorPositionRow = source.cursorPositionRow; cursorPositionInner = source.cursorPositionInner; pattern.len = source.pattern.len; pattern.rows = source.pattern.rows; pattern.channum = source.pattern.channum; pattern.effnum = source.pattern.effnum; pattern.patternData = new mp_ubyte[pattern.len]; memcpy(pattern.patternData, source.pattern.patternData, pattern.len); } //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : Clean up //--------------------------------------------------------------------------- PatternUndoStackEntry::~PatternUndoStackEntry() { delete[] pattern.patternData; } //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : assignment operator //--------------------------------------------------------------------------- PatternUndoStackEntry& PatternUndoStackEntry::operator=(const PatternUndoStackEntry& source) { // no self-assignment if (this != &source) { copyBasePart(source); cursorPositionChannel = source.cursorPositionChannel; cursorPositionRow = source.cursorPositionRow; cursorPositionInner = source.cursorPositionInner; if (pattern.patternData) delete[] pattern.patternData; pattern.len = source.pattern.len; pattern.rows = source.pattern.rows; pattern.channum = source.pattern.channum; pattern.effnum = source.pattern.effnum; pattern.patternData = new mp_ubyte[pattern.len]; memcpy(pattern.patternData, source.pattern.patternData, pattern.len); } return *this; } //--------------------------------------------------------------------------- // Pre : // Post : // Globals : // I/O : // Task : comparison operators //--------------------------------------------------------------------------- bool PatternUndoStackEntry::operator==(const PatternUndoStackEntry& source) { ASSERT(source.pattern.patternData); ASSERT(pattern.patternData); if (pattern.len == source.pattern.len && pattern.rows == source.pattern.rows && pattern.channum == source.pattern.channum && pattern.effnum == source.pattern.effnum) { if (memcmp(pattern.patternData, source.pattern.patternData, pattern.len) == 0) return true; else return false; } else return false; } bool PatternUndoStackEntry::operator!=(const PatternUndoStackEntry& source) { return !(*this==source); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // envelopes ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Envelope stack entry EnvelopeUndoStackEntry& EnvelopeUndoStackEntry::operator=(const EnvelopeUndoStackEntry& source) { // no self-assignment if (this != &source) { copyBasePart(source); envelope = source.envelope; invalid = source.invalid; } return *this; } // comparison is necessary too bool EnvelopeUndoStackEntry::operator==(const EnvelopeUndoStackEntry& source) { if (source.invalid || invalid) return true; if (source.envelope.num != envelope.num || source.envelope.sustain != envelope.sustain || source.envelope.loops != envelope.loops || source.envelope.loope != envelope.loope || source.envelope.type != envelope.type) return false; for (pp_int32 i = 0; i < envelope.num; i++) { if (source.envelope.env[i][0] != envelope.env[i][0] || source.envelope.env[i][1] != envelope.env[i][1]) return false; } return true; } bool EnvelopeUndoStackEntry::operator!=(const EnvelopeUndoStackEntry& source) { return !(*this==source); } void EnvelopeUndoStackEntry::GetEnvelope(TEnvelope& env) const { env.num = envelope.num; env.sustain = envelope.sustain; env.loops = envelope.loops; env.loope = envelope.loope; env.type = envelope.type; env.speed = 0; for (pp_int32 i = 0; i < 12; i++) { env.env[i][0] = envelope.env[i][0]; env.env[i][1] = envelope.env[i][1]; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // samples ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void SampleUndoStackEntry::calcCheckSum() { checkSum = 0; if (!buffer) return; mp_uint32 size = (flags & 16) ? samplen*2 : samplen; if (size) { mp_ubyte* mem = TXMSample::getPadStartAddr(buffer); mp_uint32 realSize = TXMSample::getPaddedSize(size); for (pp_uint32 i = 0; i < realSize; i++) checkSum+=(pp_uint32)mem[i]; } } SampleUndoStackEntry::SampleUndoStackEntry(const TXMSample& sample, pp_int32 selectionStart, pp_int32 selectionEnd, const UserData* userData/* = NULL*/) : UndoStackEntry(userData) { samplen = sample.samplen; loopstart = sample.loopstart; looplen = sample.looplen; relnote = sample.relnote; finetune = sample.finetune; flags = sample.type; this->selectionStart = selectionStart; this->selectionEnd = selectionEnd; buffer = NULL; checkSum = 0; if (sample.samplen && sample.sample) { // 16 bit sample if (flags & 16) { buffer = TXMSample::allocPaddedMem(samplen*2); if (buffer) TXMSample::copyPaddedMem(buffer, sample.sample, samplen*2); } else { buffer = TXMSample::allocPaddedMem(samplen); if (buffer) TXMSample::copyPaddedMem(buffer, sample.sample, samplen); } calcCheckSum(); } } SampleUndoStackEntry::SampleUndoStackEntry(const SampleUndoStackEntry& src) : UndoStackEntry(&src.getUserData()) { samplen = src.samplen; loopstart = src.loopstart; looplen = src.looplen; relnote = src.relnote; finetune = src.finetune; flags = src.flags; checkSum = src.checkSum; this->selectionStart = src.selectionStart; this->selectionEnd = src.selectionEnd; buffer = NULL; if (src.buffer && samplen) { // 16 bit sample if (flags & 16) { buffer = TXMSample::allocPaddedMem(samplen*2); if (buffer) TXMSample::copyPaddedMem(buffer, src.buffer, samplen*2); } else { buffer = TXMSample::allocPaddedMem(samplen); if (buffer) TXMSample::copyPaddedMem(buffer, src.buffer, samplen); } } } SampleUndoStackEntry::~SampleUndoStackEntry() { TXMSample::freePaddedMem(buffer); } // assignment operator SampleUndoStackEntry& SampleUndoStackEntry::operator=(const SampleUndoStackEntry& src) { if (this != &src) { copyBasePart(src); samplen = src.samplen; loopstart = src.loopstart; looplen = src.looplen; relnote = src.relnote; finetune = src.finetune; flags = src.flags; checkSum = src.checkSum; if (buffer) { TXMSample::freePaddedMem(buffer); buffer = NULL; } if (src.buffer && samplen) { // 16 bit sample if (flags & 16) { buffer = TXMSample::allocPaddedMem(samplen*2); if (buffer) TXMSample::copyPaddedMem(buffer, src.buffer, samplen*2); } else { buffer = TXMSample::allocPaddedMem(samplen); if (buffer) TXMSample::copyPaddedMem(buffer, src.buffer, samplen); } } } return (*this); } // comparison is necessary too bool SampleUndoStackEntry::operator==(const SampleUndoStackEntry& src) { if (samplen != src.samplen) return false; if (checkSum != src.checkSum) return false; if (loopstart != src.loopstart) return false; if (looplen != src.looplen) return false; if (relnote != src.relnote) return false; if (finetune != src.finetune) return false; if (flags != src.flags) return false; if (buffer == NULL && src.buffer != NULL) return false; if (buffer != NULL && src.buffer == NULL) return false; mp_uint32 size = (flags & 16) ? samplen*2 : samplen; if (size) { mp_ubyte* _src = src.buffer; mp_ubyte* _dst = buffer; mp_ubyte* srcmem = TXMSample::getPadStartAddr(_src); mp_ubyte* dstmem = TXMSample::getPadStartAddr(_dst); mp_uint32 realSize = TXMSample::getPaddedSize(size); for (pp_uint32 i = 0; i < realSize; i++) if (srcmem[i] != dstmem[i]) return false; } return true; } bool SampleUndoStackEntry::operator!=(const SampleUndoStackEntry& source) { return !(*this==source); } milkytracker-0.90.85+dfsg/src/tracker/TrackerSettingsDatabase.h0000644000175000017500000000345611150223367023567 0ustar admin2admin2/* * tracker/TrackerSettingsDatabase.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TrackerSettingsDatabase.h * MilkyTracker * * Created by Peter Barth on Tue Mar 15 2005. * */ #ifndef TRACKERSETTINGSDATABASE__H #define TRACKERSETTINGSDATABASE__H #include "BasicTypes.h" #include "Dictionary.h" class PPDictionaryKey; class XMFile; class TrackerSettingsDatabase { private: PPDictionary dictionary; pp_int32 maxKeys; public: TrackerSettingsDatabase(pp_int32 maxKeys = -1) : maxKeys(maxKeys) { } // copy c'tor TrackerSettingsDatabase(const TrackerSettingsDatabase& source); TrackerSettingsDatabase& operator=(const TrackerSettingsDatabase& source); void store(const PPString& key, const PPString& value); void store(const PPString& key, const pp_uint32 value); bool hasKey(const PPString& key); PPDictionaryKey* restore(const PPString& key); bool serialize(XMFile& file); void dump(); PPDictionaryKey* getFirstKey() { return dictionary.getFirstKey(); } PPDictionaryKey* getNextKey() { return dictionary.getNextKey(); } void stopEnumeration() { dictionary.stopEnumeration(); } }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionOptimize.cpp0000644000175000017500000012530511150223367022504 0ustar admin2admin2/* * tracker/SectionOptimize.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionOptimize.cpp * MilkyTracker * * Created by Peter Barth on 17.11.05. * */ #include "SectionOptimize.h" #include "SectionInstruments.h" #include "Tracker.h" #include "SectionSamples.h" #include "TrackerConfig.h" #include "ModuleEditor.h" #include "PatternEditorControl.h" #include "SampleEditorControl.h" #include "StaticText.h" #include "Seperator.h" #include "Container.h" #include "CheckBox.h" #include "Font.h" #include "DialogListBox.h" #include "ListBox.h" #include "ControlIDs.h" enum CheckBoxBitPositions { // Group 2 --------------------------------------- BITPOS_CHECKBOX_REMOVE = 0, BITPOS_CHECKBOX_REMOVE_PATTERNS, BITPOS_CHECKBOX_REMOVE_INSTRUMENTS, BITPOS_CHECKBOX_REMOVE_SAMPLES, BITPOS_CHECKBOX_REARRANGE, BITPOS_CHECKBOX_MINIMIZEALL, BITPOS_CHECKBOX_CONVERTALL, BITPOS_CHECKBOX_CRUNCHHEADER, // ----------------------------------------------- // Group 2 --------------------------------------- BITPOS_CHECKBOX_OPERANDCONTROL_1xx = 0, BITPOS_CHECKBOX_OPERANDCONTROL_2xx, BITPOS_CHECKBOX_OPERANDCONTROL_3xx, BITPOS_CHECKBOX_OPERANDCONTROL_4xx, BITPOS_CHECKBOX_OPERANDCONTROL_A56xx, BITPOS_CHECKBOX_OPERANDCONTROL_Hxx, BITPOS_CHECKBOX_OPERANDCONTROL_7xx, BITPOS_CHECKBOX_OPERANDCONTROL_E1x, BITPOS_CHECKBOX_OPERANDCONTROL_E2x, BITPOS_CHECKBOX_OPERANDCONTROL_EAx, BITPOS_CHECKBOX_OPERANDCONTROL_EBx, BITPOS_CHECKBOX_OPERANDCONTROL_Pxx, BITPOS_CHECKBOX_OPERANDCONTROL_Rxx, BITPOS_CHECKBOX_OPERANDCONTROL_X1x, BITPOS_CHECKBOX_OPERANDCONTROL_X2x, BITPOS_CHECKBOX_EFFECTRELOCATION_3xx, BITPOS_CHECKBOX_EFFECTRELOCATION_4xx, BITPOS_CHECKBOX_EFFECTRELOCATION_8xx, BITPOS_CHECKBOX_EFFECTRELOCATION_Cxx, BITPOS_CHECKBOX_EFFECTRELOCATION_Axx, BITPOS_CHECKBOX_EFFECTRELOCATION_EAx, BITPOS_CHECKBOX_EFFECTRELOCATION_EBx, BITPOS_CHECKBOX_EFFECTRELOCATION_Pxx // ----------------------------------------------- }; enum ControlIDs { CONTAINER_OPTIMIZE = 8000, OPTIMIZE_BUTTON_EXIT, OPTIMIZE_CHECKBOX_REMOVE, OPTIMIZE_CHECKBOX_REMOVE_PATTERNS, OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS, OPTIMIZE_CHECKBOX_REMOVE_SAMPLES, OPTIMIZE_STATICTEXT_REMOVE_PATTERNS, OPTIMIZE_STATICTEXT_REMOVE_INSTRUMENTS, OPTIMIZE_STATICTEXT_REMOVE_SAMPLES, OPTIMIZE_CHECKBOX_REARRANGE, OPTIMIZE_STATICTEXT_REARRANGE, OPTIMIZE_CHECKBOX_MINIMIZEALL, OPTIMIZE_CHECKBOX_CONVERTALL, OPTIMIZE_BUTTON_ANALYZE, OPTIMIZE_BUTTON_OPTIMIZE, OPTIMIZE_CHECKBOX_OPERANDCONTROL_1xx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_2xx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_3xx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_4xx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_A56xx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_Hxx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_7xx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_E1x, OPTIMIZE_CHECKBOX_OPERANDCONTROL_E2x, OPTIMIZE_CHECKBOX_OPERANDCONTROL_EAx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_EBx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_Pxx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_Rxx, OPTIMIZE_CHECKBOX_OPERANDCONTROL_X1x, OPTIMIZE_CHECKBOX_OPERANDCONTROL_X2x, OPTIMIZE_STATICTEXT_OPERANDCONTROL_1xx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_2xx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_3xx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_4xx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_A56xx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_Hxx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_7xx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_E1x, OPTIMIZE_STATICTEXT_OPERANDCONTROL_E2x, OPTIMIZE_STATICTEXT_OPERANDCONTROL_EAx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_EBx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_Pxx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_Rxx, OPTIMIZE_STATICTEXT_OPERANDCONTROL_X1x, OPTIMIZE_STATICTEXT_OPERANDCONTROL_X2x, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_3xx, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_4xx, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_8xx, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Cxx, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Axx, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EAx, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EBx, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Pxx, OPTIMIZE_STATICTEXT_EFFECTRELOCATION_3xx, OPTIMIZE_STATICTEXT_EFFECTRELOCATION_4xx, OPTIMIZE_STATICTEXT_EFFECTRELOCATION_8xx, OPTIMIZE_STATICTEXT_EFFECTRELOCATION_Cxx, OPTIMIZE_STATICTEXT_EFFECTRELOCATION_Axx, OPTIMIZE_STATICTEXT_EFFECTRELOCATION_EAx, OPTIMIZE_STATICTEXT_EFFECTRELOCATION_EBx, OPTIMIZE_STATICTEXT_EFFECTRELOCATION_Pxx, OPTIMIZE_BUTTON_ZERO_OPERANDS_TRACK, OPTIMIZE_BUTTON_ZERO_OPERANDS_PATTERN, OPTIMIZE_BUTTON_ZERO_OPERANDS_SONG, OPTIMIZE_BUTTON_ZERO_OPERANDS_BLOCK, OPTIMIZE_BUTTON_FILL_OPERANDS_TRACK, OPTIMIZE_BUTTON_FILL_OPERANDS_PATTERN, OPTIMIZE_BUTTON_FILL_OPERANDS_SONG, OPTIMIZE_BUTTON_FILL_OPERANDS_BLOCK, OPTIMIZE_BUTTON_RELOCATE_FX_TRACK, OPTIMIZE_BUTTON_RELOCATE_FX_PATTERN, OPTIMIZE_BUTTON_RELOCATE_FX_SONG, OPTIMIZE_BUTTON_RELOCATE_FX_BLOCK, OPTIMIZE_STATICTEXT_CRUNCHHEADER, OPTIMIZE_CHECKBOX_CRUNCHHEADER }; void SectionOptimize::refresh() { tracker.updateOrderlist(false); tracker.updateInstrumentsListBox(false); tracker.updateSamplesListBox(false); // update instrument/sample editor tracker.updateSampleEditorAndInstrumentSection(false); tracker.updateWindowTitle(); tracker.screen->paint(); } void SectionOptimize::optimize(bool evaluate/* = false*/) { if (dialog) { delete dialog; dialog = NULL; } PPContainer* container = static_cast(sectionContainer); dialog = new DialogListBox(tracker.screen, NULL, PP_DEFAULT_ID, "Result Log"); PPListBox* listBox = static_cast(dialog)->getListBox(); listBox->setShowIndex(false); if (!evaluate) tracker.ensureSongStopped(false, true); bool remove = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE))->isChecked(); bool removePatterns = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_PATTERNS))->isChecked() && remove; bool removeInstruments = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS))->isChecked() && remove; bool remapInstruments = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_REARRANGE))->isChecked() && remove; bool removeSamples = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_SAMPLES))->isChecked() && remove; bool convertSamples = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_CONVERTALL))->isChecked(); bool minimizeSamples = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_MINIMIZEALL))->isChecked(); char buffer[1024]; tracker.signalWaitState(true); if (removePatterns) { pp_int32 res = tracker.moduleEditor->removeUnusedPatterns(evaluate); sprintf(buffer, "Unused patterns: %i", res); listBox->addItem(buffer); } if (removeInstruments) { pp_int32 res = tracker.moduleEditor->removeUnusedInstruments(evaluate, remapInstruments); sprintf(buffer, "Unused instruments: %i", res); listBox->addItem(buffer); } if (removeSamples) { pp_int32 res = tracker.moduleEditor->removeUnusedSamples(evaluate); sprintf(buffer, "Unused samples: %i", res); listBox->addItem(buffer); } if (convertSamples || minimizeSamples) { OptimizeSamplesResult result = optimizeSamples(convertSamples, minimizeSamples, evaluate); if (minimizeSamples) { sprintf(buffer, "Minimized samples: %i", result.numMinimizedSamples); listBox->addItem(buffer); } if (convertSamples) { sprintf(buffer, "Converted samples: %i", result.numConvertedSamples); listBox->addItem(buffer); } } // Update all panels like we have loaded a new file if (!evaluate) tracker.updateAfterLoad(true, false, false); tracker.signalWaitState(false); if (listBox->getNumItems()) { dialog->show(); if (!evaluate) refresh(); } else tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Nothing to do.", Tracker::MessageBox_OK); if (!evaluate) tracker.ensureSongPlaying(true); } PatternEditorTools::OperandOptimizeParameters SectionOptimize::getOptimizeParameters() { PPContainer* container = static_cast(sectionContainer); PatternEditorTools::OperandOptimizeParameters optimizeParameters; optimizeParameters.command_1xx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_1xx))->isChecked(); optimizeParameters.command_2xx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_2xx))->isChecked(); optimizeParameters.command_3xx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_3xx))->isChecked(); optimizeParameters.command_4xx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_4xx))->isChecked(); optimizeParameters.command_56Axx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_A56xx))->isChecked(); optimizeParameters.command_7xx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_7xx))->isChecked(); optimizeParameters.command_E1x = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_E1x))->isChecked(); optimizeParameters.command_E2x = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_E2x))->isChecked(); optimizeParameters.command_EAx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_EAx))->isChecked(); optimizeParameters.command_EBx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_EBx))->isChecked(); optimizeParameters.command_Hxx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Hxx))->isChecked(); optimizeParameters.command_Pxx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Pxx))->isChecked(); optimizeParameters.command_Rxx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Rxx))->isChecked(); optimizeParameters.command_X1x = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_X1x))->isChecked(); optimizeParameters.command_X2x = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_OPERANDCONTROL_X2x))->isChecked(); return optimizeParameters; } void SectionOptimize::zeroOperandsTrack() { PatternEditorTools::OperandOptimizeParameters optimizeParameters = getOptimizeParameters(); tracker.getPatternEditor()->zeroOperandsTrack(optimizeParameters, false); refresh(); } void SectionOptimize::zeroOperandsPattern() { PatternEditorTools::OperandOptimizeParameters optimizeParameters = getOptimizeParameters(); tracker.getPatternEditor()->zeroOperandsPattern(optimizeParameters, false); refresh(); } void SectionOptimize::zeroOperandsSong() { PatternEditorTools::OperandOptimizeParameters optimizeParameters = getOptimizeParameters(); tracker.moduleEditor->zeroOperands(optimizeParameters, false); refresh(); } void SectionOptimize::zeroOperandsBlock() { PatternEditorTools::OperandOptimizeParameters optimizeParameters = getOptimizeParameters(); tracker.getPatternEditor()->zeroOperandsSelection(optimizeParameters, false); refresh(); } void SectionOptimize::fillOperandsTrack() { PatternEditorTools::OperandOptimizeParameters optimizeParameters = getOptimizeParameters(); tracker.getPatternEditor()->fillOperandsTrack(optimizeParameters, false); refresh(); } void SectionOptimize::fillOperandsPattern() { PatternEditorTools::OperandOptimizeParameters optimizeParameters = getOptimizeParameters(); tracker.getPatternEditor()->fillOperandsPattern(optimizeParameters, false); refresh(); } void SectionOptimize::fillOperandsSong() { PatternEditorTools::OperandOptimizeParameters optimizeParameters = getOptimizeParameters(); tracker.moduleEditor->fillOperands(optimizeParameters, false); refresh(); } void SectionOptimize::fillOperandsBlock() { PatternEditorTools::OperandOptimizeParameters optimizeParameters = getOptimizeParameters(); tracker.getPatternEditor()->fillOperandsSelection(optimizeParameters, false); refresh(); } PatternEditorTools::RelocateParameters SectionOptimize::getRelocateParameters() { PPContainer* container = static_cast(sectionContainer); PatternEditorTools::RelocateParameters relocateParameters; relocateParameters.command_3xx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_3xx))->isChecked(); relocateParameters.command_4xx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_4xx))->isChecked(); relocateParameters.command_8xx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_8xx))->isChecked(); relocateParameters.command_Axx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Axx))->isChecked(); relocateParameters.command_Cxx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Cxx))->isChecked(); relocateParameters.command_EAx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EAx))->isChecked(); relocateParameters.command_EBx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EBx))->isChecked(); relocateParameters.command_Pxx = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Pxx))->isChecked(); return relocateParameters; } void SectionOptimize::relocateCommandsTrack() { PatternEditorTools::RelocateParameters relocateParameters = getRelocateParameters(); tracker.getPatternEditor()->relocateCommandsTrack(relocateParameters, false); refresh(); } void SectionOptimize::relocateCommandsPattern() { PatternEditorTools::RelocateParameters relocateParameters = getRelocateParameters(); tracker.getPatternEditor()->relocateCommandsPattern(relocateParameters, false); refresh(); } void SectionOptimize::relocateCommandsSong() { PatternEditorTools::RelocateParameters relocateParameters = getRelocateParameters(); tracker.moduleEditor->relocateCommands(relocateParameters, false); refresh(); } void SectionOptimize::relocateCommandsBlock() { PatternEditorTools::RelocateParameters relocateParameters = getRelocateParameters(); tracker.getPatternEditor()->relocateCommandsSelection(relocateParameters, false); refresh(); } SectionOptimize::OptimizeSamplesResult SectionOptimize::optimizeSamples(bool convertTo8Bit, bool minimize, bool evaluate) { OptimizeSamplesResult result; tracker.moduleEditor->optimizeSamples(convertTo8Bit, minimize, result.numConvertedSamples, result.numMinimizedSamples, evaluate); refresh(); return result; } SectionOptimize::SectionOptimize(Tracker& theTracker) : SectionUpperLeft(theTracker) { } SectionOptimize::~SectionOptimize() { } pp_int32 SectionOptimize::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eCommand) { switch (reinterpret_cast(sender)->getID()) { case OPTIMIZE_BUTTON_EXIT: show(false); break; case OPTIMIZE_CHECKBOX_REMOVE: case OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS: case OPTIMIZE_CHECKBOX_REMOVE_SAMPLES: update(); break; case OPTIMIZE_BUTTON_OPTIMIZE: optimize(); break; case OPTIMIZE_BUTTON_ANALYZE: optimize(true); break; case OPTIMIZE_BUTTON_ZERO_OPERANDS_TRACK: zeroOperandsTrack(); break; case OPTIMIZE_BUTTON_ZERO_OPERANDS_PATTERN: zeroOperandsPattern(); break; case OPTIMIZE_BUTTON_ZERO_OPERANDS_SONG: zeroOperandsSong(); break; case OPTIMIZE_BUTTON_ZERO_OPERANDS_BLOCK: zeroOperandsBlock(); break; case OPTIMIZE_BUTTON_FILL_OPERANDS_TRACK: fillOperandsTrack(); break; case OPTIMIZE_BUTTON_FILL_OPERANDS_PATTERN: fillOperandsPattern(); break; case OPTIMIZE_BUTTON_FILL_OPERANDS_SONG: fillOperandsSong(); break; case OPTIMIZE_BUTTON_FILL_OPERANDS_BLOCK: fillOperandsBlock(); break; case OPTIMIZE_BUTTON_RELOCATE_FX_TRACK: relocateCommandsTrack(); break; case OPTIMIZE_BUTTON_RELOCATE_FX_PATTERN: relocateCommandsPattern(); break; case OPTIMIZE_BUTTON_RELOCATE_FX_SONG: relocateCommandsSong(); break; case OPTIMIZE_BUTTON_RELOCATE_FX_BLOCK: relocateCommandsBlock(); break; } } return 0; } void SectionOptimize::init(pp_int32 px, pp_int32 py) { PPScreen* screen = tracker.screen; PPContainer* container = new PPContainer(CONTAINER_OPTIMIZE, tracker.screen, this, PPPoint(px, py), PPSize(320,UPPERLEFTSECTIONHEIGHT), false); container->setColor(TrackerConfig::colorThemeMain); tracker.screen->addControl(container); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(px + 2, py + 2), "Optimize", true, true)); PPSize size = container->getSize(); pp_int32 buttonWidth = 8*4+4; pp_int32 buttonHeight = 11; pp_int32 x = px+container->getSize().width-(buttonWidth+4); pp_int32 y = py+container->getSize().height-(buttonHeight+4); pp_int32 x2, y2; container->addControl(new PPSeperator(0, screen, PPPoint(x - 6, y - 4), 4 + buttonHeight + 3, TrackerConfig::colorThemeMain, false)); container->addControl(new PPSeperator(0, screen, PPPoint(px + 2, y - 4), container->getSize().width - 4, TrackerConfig::colorThemeMain, true)); pp_int32 space; PPButton* button = new PPButton(OPTIMIZE_BUTTON_EXIT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Exit"); container->addControl(button); y+=2; x = px+4; PPStaticText* staticText = new PPStaticText(OPTIMIZE_STATICTEXT_CRUNCHHEADER, NULL, NULL, PPPoint(x, y), "Crunch headers (XM format only)", true); staticText->enable(false); container->addControl(staticText); PPCheckBox* checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_CRUNCHHEADER, screen, this, PPPoint(x + 32*8, y-1)); checkBox->checkIt(false); checkBox->enable(false); container->addControl(checkBox); // ----------------------------- "remove" space = 5*8; x = px+4; y = py+4+11; pp_int32 seperatorWidth = (x + 14*8+2) - (px+4) + 4 + 2; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x, y), "Remove unused", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_REMOVE, screen, this, PPPoint(x + 13*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); y+=12; x = px+4; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_REMOVE_PATTERNS, NULL, NULL, PPPoint(x, y), "Pat", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_REMOVE_PATTERNS, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_REMOVE_INSTRUMENTS, NULL, NULL, PPPoint(x, y), "Ins", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_REMOVE_SAMPLES, NULL, NULL, PPPoint(x, y), "Smp", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_REMOVE_SAMPLES, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); y+=12; x = px+4; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_REARRANGE, NULL, NULL, PPPoint(x, y), "Remap instr.", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_REARRANGE, screen, this, PPPoint(x + 13*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); // ----------------------------- "seperator" y+=12; container->addControl(new PPSeperator(0, screen, PPPoint(px + 2, y), seperatorWidth, TrackerConfig::colorThemeMain, true)); y+=4; // ----------------------------- "minimize all samples" container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x, y), "Min. all smp.", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_MINIMIZEALL, screen, this, PPPoint(x + 13*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); // ----------------------------- "samples to 8 bit" y+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x, y), "Smp. to 8 bit", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_CONVERTALL, screen, this, PPPoint(x + 13*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); y+=12; container->addControl(new PPSeperator(0, screen, PPPoint(x-1, y), seperatorWidth, TrackerConfig::colorThemeMain, true)); y+=4; buttonWidth = 8*7 + 1; buttonHeight = 14; button = new PPButton(OPTIMIZE_BUTTON_ANALYZE, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Analyze"); container->addControl(button); x+=buttonWidth+2; button = new PPButton(OPTIMIZE_BUTTON_OPTIMIZE, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Optimize"); container->addControl(button); // ----------------------------- "operand control" y = py+4+11 - 12; x = x2 = px + 4 + seperatorWidth + 1; space = 5*8-1; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_1xx, NULL, NULL, PPPoint(x, y), "1xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_1xx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_2xx, NULL, NULL, PPPoint(x, y), "2xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_2xx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_3xx, NULL, NULL, PPPoint(x, y), "3xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_3xx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_4xx, NULL, NULL, PPPoint(x, y), "4xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_4xx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_7xx, NULL, NULL, PPPoint(x, y), "7xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_7xx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); y+=12; x = x2; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_A56xx, NULL, NULL, PPPoint(x+4, y), "A/5/6xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_A56xx, screen, this, PPPoint(x + 8*8+1, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space*2; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_Hxx, NULL, NULL, PPPoint(x, y), "Hxx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Hxx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_Pxx, NULL, NULL, PPPoint(x, y), "Pxx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Pxx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_Rxx, NULL, NULL, PPPoint(x, y), "Rxx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Rxx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); y+=12; x = x2; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_E1x, NULL, NULL, PPPoint(x, y), "E1x", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_E1x, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_E2x, NULL, NULL, PPPoint(x, y), "E2x", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_E2x, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_EAx, NULL, NULL, PPPoint(x, y), "EAx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_EAx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_EBx, NULL, NULL, PPPoint(x, y), "EBx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_EBx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_X1x, NULL, NULL, PPPoint(x, y), "X1x", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_X1x, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); y+=12; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_OPERANDCONTROL_X2x, NULL, NULL, PPPoint(x, y), "X2x", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_OPERANDCONTROL_X2x, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); y+=1; x = x2+1; buttonWidth = container->getSize().width/10-5; buttonHeight = 8; staticText = new PPStaticText(0, NULL, NULL, PPPoint(x-1, y+1), "Zero ops", true); staticText->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(staticText); x+=8*5+1; button = new PPButton(OPTIMIZE_BUTTON_ZERO_OPERANDS_TRACK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Track"); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_ZERO_OPERANDS_PATTERN, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Pat."); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_ZERO_OPERANDS_SONG, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Song"); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_ZERO_OPERANDS_BLOCK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Block"); container->addControl(button); y+=buttonHeight+1; x = x2+1; staticText = new PPStaticText(0, NULL, NULL, PPPoint(x-1, y+1), "Fill ops", true); staticText->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(staticText); x+=8*5+1; button = new PPButton(OPTIMIZE_BUTTON_FILL_OPERANDS_TRACK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Track"); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_FILL_OPERANDS_PATTERN, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Pat."); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_FILL_OPERANDS_SONG, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Song"); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_FILL_OPERANDS_BLOCK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Block"); container->addControl(button); y+=buttonHeight+2; x = x2; container->addControl(new PPSeperator(0, screen, PPPoint(x-2, y), container->getSize().width - seperatorWidth - 5, TrackerConfig::colorThemeMain, true)); y+=4; // ----------------------------- "effect relocation" x = x2; space = 5*8-1; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_EFFECTRELOCATION_3xx, NULL, NULL, PPPoint(x, y), "3xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_3xx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_EFFECTRELOCATION_4xx, NULL, NULL, PPPoint(x, y), "4xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_4xx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_EFFECTRELOCATION_8xx, NULL, NULL, PPPoint(x, y), "8xx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_8xx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_EFFECTRELOCATION_Axx, NULL, NULL, PPPoint(x, y), "Axx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Axx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_EFFECTRELOCATION_Cxx, NULL, NULL, PPPoint(x, y), "Cxx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Cxx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x = x2; y+=12; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_EFFECTRELOCATION_EAx, NULL, NULL, PPPoint(x, y), "EAx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EAx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_EFFECTRELOCATION_EBx, NULL, NULL, PPPoint(x, y), "EBx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EBx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); x+=space; container->addControl(new PPStaticText(OPTIMIZE_STATICTEXT_EFFECTRELOCATION_Pxx, NULL, NULL, PPPoint(x, y), "Pxx", true)); checkBox = new PPCheckBox(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Pxx, screen, this, PPPoint(x + 3*8+2, y)); checkBox->checkIt(true); container->addControl(checkBox); y+=12; x = x2; // ----------------------------- buttons for fx relocation y++; x = x2+1; buttonHeight = 9; buttonWidth = container->getSize().width/8-7; staticText = new PPStaticText(0, NULL, NULL, PPPoint(x-1, y+2), "Relocate FX", true); staticText->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(staticText); x+=11*5+1; button = new PPButton(OPTIMIZE_BUTTON_RELOCATE_FX_TRACK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Track"); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_RELOCATE_FX_PATTERN, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Pat."); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_RELOCATE_FX_SONG, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Song"); container->addControl(button); x+=buttonWidth+1; button = new PPButton(OPTIMIZE_BUTTON_RELOCATE_FX_BLOCK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Block"); container->addControl(button); // ----------------------------- vertical seperator x2 = px + 2 + seperatorWidth; y2 = py + 2; container->addControl(new PPSeperator(0, screen, PPPoint(x2, y2 - 2), container->getLocation().y + container->getSize().height - y2 - 17, TrackerConfig::colorThemeMain, false)); sectionContainer = container; initialised = true; showSection(false); } void SectionOptimize::update(bool repaint/* = true*/) { PPScreen* screen = tracker.screen; PPContainer* container = static_cast(sectionContainer); PPCheckBox* checkBox = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE)); if (checkBox->isChecked()) { container->getControlByID(OPTIMIZE_STATICTEXT_REMOVE_PATTERNS)->enable(true); container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_PATTERNS)->enable(true); container->getControlByID(OPTIMIZE_STATICTEXT_REMOVE_INSTRUMENTS)->enable(true); container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS)->enable(true); container->getControlByID(OPTIMIZE_STATICTEXT_REMOVE_SAMPLES)->enable(true); container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_SAMPLES)->enable(true); bool b = static_cast(container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS))->isChecked(); container->getControlByID(OPTIMIZE_STATICTEXT_REARRANGE)->enable(b); container->getControlByID(OPTIMIZE_CHECKBOX_REARRANGE)->enable(b); } else { container->getControlByID(OPTIMIZE_STATICTEXT_REMOVE_PATTERNS)->enable(false); container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_PATTERNS)->enable(false); container->getControlByID(OPTIMIZE_STATICTEXT_REMOVE_INSTRUMENTS)->enable(false); container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS)->enable(false); container->getControlByID(OPTIMIZE_STATICTEXT_REMOVE_SAMPLES)->enable(false); container->getControlByID(OPTIMIZE_CHECKBOX_REMOVE_SAMPLES)->enable(false); container->getControlByID(OPTIMIZE_STATICTEXT_REARRANGE)->enable(false); container->getControlByID(OPTIMIZE_CHECKBOX_REARRANGE)->enable(false); } screen->paintControl(container, repaint); } pp_uint32 SectionOptimize::getNumFlagGroups() { return 2; } pp_uint32 SectionOptimize::getDefaultFlags(pp_uint32 groupIndex) { pp_uint32 value = 0; switch (groupIndex) { case 0: value = (1 << BITPOS_CHECKBOX_REMOVE) | (1 << BITPOS_CHECKBOX_REMOVE_PATTERNS) | (1 << BITPOS_CHECKBOX_REMOVE_INSTRUMENTS) | (1 << BITPOS_CHECKBOX_REMOVE_SAMPLES) | (1 << BITPOS_CHECKBOX_REARRANGE) | (1 << BITPOS_CHECKBOX_MINIMIZEALL) | (1 << BITPOS_CHECKBOX_CONVERTALL) | (1 << BITPOS_CHECKBOX_CRUNCHHEADER); break; case 1: value = (1 << BITPOS_CHECKBOX_OPERANDCONTROL_1xx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_2xx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_3xx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_4xx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_A56xx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_Hxx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_7xx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_E1x) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_E2x) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_EAx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_EBx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_Pxx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_Rxx) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_X1x) | (1 << BITPOS_CHECKBOX_OPERANDCONTROL_X2x) | (1 << BITPOS_CHECKBOX_EFFECTRELOCATION_3xx) | (1 << BITPOS_CHECKBOX_EFFECTRELOCATION_4xx) | (1 << BITPOS_CHECKBOX_EFFECTRELOCATION_8xx) | (1 << BITPOS_CHECKBOX_EFFECTRELOCATION_Cxx) | (1 << BITPOS_CHECKBOX_EFFECTRELOCATION_Axx) | (1 << BITPOS_CHECKBOX_EFFECTRELOCATION_EAx) | (1 << BITPOS_CHECKBOX_EFFECTRELOCATION_EBx) | (1 << BITPOS_CHECKBOX_EFFECTRELOCATION_Pxx); break; } return value; } #define BITFROMCHECKBOX(ID, POS) \ (static_cast(container->getControlByID((ID)))->isChecked() ? 1 : 0) << (POS) pp_uint32 SectionOptimize::getOptimizeCheckBoxFlags(pp_uint32 groupIndex) { pp_uint32 value = 0; PPContainer* container = static_cast(sectionContainer); switch (groupIndex) { case 0: { value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_REMOVE, BITPOS_CHECKBOX_REMOVE); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_REMOVE_PATTERNS, BITPOS_CHECKBOX_REMOVE_PATTERNS); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS, BITPOS_CHECKBOX_REMOVE_INSTRUMENTS); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_REMOVE_SAMPLES, BITPOS_CHECKBOX_REMOVE_SAMPLES); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_REARRANGE, BITPOS_CHECKBOX_REARRANGE); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_MINIMIZEALL, BITPOS_CHECKBOX_MINIMIZEALL); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_CONVERTALL, BITPOS_CHECKBOX_CONVERTALL); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_CRUNCHHEADER, BITPOS_CHECKBOX_CRUNCHHEADER); break; } case 1: { value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_1xx, BITPOS_CHECKBOX_OPERANDCONTROL_1xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_2xx, BITPOS_CHECKBOX_OPERANDCONTROL_2xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_3xx, BITPOS_CHECKBOX_OPERANDCONTROL_3xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_4xx, BITPOS_CHECKBOX_OPERANDCONTROL_4xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_A56xx, BITPOS_CHECKBOX_OPERANDCONTROL_A56xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Hxx, BITPOS_CHECKBOX_OPERANDCONTROL_Hxx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_7xx, BITPOS_CHECKBOX_OPERANDCONTROL_7xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_E1x, BITPOS_CHECKBOX_OPERANDCONTROL_E1x); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_E2x, BITPOS_CHECKBOX_OPERANDCONTROL_E2x); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_EAx, BITPOS_CHECKBOX_OPERANDCONTROL_EAx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_EBx, BITPOS_CHECKBOX_OPERANDCONTROL_EBx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Pxx, BITPOS_CHECKBOX_OPERANDCONTROL_Pxx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_Rxx, BITPOS_CHECKBOX_OPERANDCONTROL_Rxx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_X1x, BITPOS_CHECKBOX_OPERANDCONTROL_X1x); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_OPERANDCONTROL_X2x, BITPOS_CHECKBOX_OPERANDCONTROL_X2x); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_3xx, BITPOS_CHECKBOX_EFFECTRELOCATION_3xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_4xx, BITPOS_CHECKBOX_EFFECTRELOCATION_4xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_8xx, BITPOS_CHECKBOX_EFFECTRELOCATION_8xx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Cxx, BITPOS_CHECKBOX_EFFECTRELOCATION_Cxx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Axx, BITPOS_CHECKBOX_EFFECTRELOCATION_Axx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EAx, BITPOS_CHECKBOX_EFFECTRELOCATION_EAx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EBx, BITPOS_CHECKBOX_EFFECTRELOCATION_EBx); value |= BITFROMCHECKBOX(OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Pxx, BITPOS_CHECKBOX_EFFECTRELOCATION_Pxx); break; } } return value; } #define BITTOCHECKBOX(VAL, ID, POS) \ static_cast(container->getControlByID((ID)))->checkIt((((VAL) >> POS) & 1) != 0) void SectionOptimize::setOptimizeCheckBoxFlags(pp_uint32 groupIndex, pp_uint32 flags) { PPContainer* container = static_cast(sectionContainer); switch (groupIndex) { case 0: { BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_REMOVE, BITPOS_CHECKBOX_REMOVE); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_REMOVE_PATTERNS, BITPOS_CHECKBOX_REMOVE_PATTERNS); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_REMOVE_INSTRUMENTS, BITPOS_CHECKBOX_REMOVE_INSTRUMENTS); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_REMOVE_SAMPLES, BITPOS_CHECKBOX_REMOVE_SAMPLES); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_REARRANGE, BITPOS_CHECKBOX_REARRANGE); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_MINIMIZEALL, BITPOS_CHECKBOX_MINIMIZEALL); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_CONVERTALL, BITPOS_CHECKBOX_CONVERTALL); //BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_CRUNCHHEADER, BITPOS_CHECKBOX_CRUNCHHEADER); break; } case 1: { BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_1xx, BITPOS_CHECKBOX_OPERANDCONTROL_1xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_2xx, BITPOS_CHECKBOX_OPERANDCONTROL_2xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_3xx, BITPOS_CHECKBOX_OPERANDCONTROL_3xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_4xx, BITPOS_CHECKBOX_OPERANDCONTROL_4xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_A56xx, BITPOS_CHECKBOX_OPERANDCONTROL_A56xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_Hxx, BITPOS_CHECKBOX_OPERANDCONTROL_Hxx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_7xx, BITPOS_CHECKBOX_OPERANDCONTROL_7xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_E1x, BITPOS_CHECKBOX_OPERANDCONTROL_E1x); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_E1x, BITPOS_CHECKBOX_OPERANDCONTROL_E1x); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_E1x, BITPOS_CHECKBOX_OPERANDCONTROL_E1x); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_E1x, BITPOS_CHECKBOX_OPERANDCONTROL_E1x); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_E2x, BITPOS_CHECKBOX_OPERANDCONTROL_E2x); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_EAx, BITPOS_CHECKBOX_OPERANDCONTROL_EAx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_EBx, BITPOS_CHECKBOX_OPERANDCONTROL_EBx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_Pxx, BITPOS_CHECKBOX_OPERANDCONTROL_Pxx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_Rxx, BITPOS_CHECKBOX_OPERANDCONTROL_Rxx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_X1x, BITPOS_CHECKBOX_OPERANDCONTROL_X1x); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_OPERANDCONTROL_X2x, BITPOS_CHECKBOX_OPERANDCONTROL_X2x); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_3xx, BITPOS_CHECKBOX_EFFECTRELOCATION_3xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_4xx, BITPOS_CHECKBOX_EFFECTRELOCATION_4xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_8xx, BITPOS_CHECKBOX_EFFECTRELOCATION_8xx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Cxx, BITPOS_CHECKBOX_EFFECTRELOCATION_Cxx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Axx, BITPOS_CHECKBOX_EFFECTRELOCATION_Axx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EAx, BITPOS_CHECKBOX_EFFECTRELOCATION_EAx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_EBx, BITPOS_CHECKBOX_EFFECTRELOCATION_EBx); BITTOCHECKBOX(flags, OPTIMIZE_CHECKBOX_EFFECTRELOCATION_Pxx, BITPOS_CHECKBOX_EFFECTRELOCATION_Pxx); break; } } update(false); } milkytracker-0.90.85+dfsg/src/tracker/SectionTranspose.h0000644000175000017500000000404311150223367022322 0ustar admin2admin2/* * tracker/SectionTranspose.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionTranspose.h * MilkyTracker * * Created by Peter Barth on 10.04.05. * */ #ifndef SECTIONTRANSPOSE__H #define SECTIONTRANSPOSE__H #include "BasicTypes.h" #include "Event.h" #include "SectionUpperLeft.h" #include "PatternEditorTools.h" class PPControl; class Tracker; class SectionTranspose : public SectionUpperLeft { private: pp_int32 currentInstrument; pp_int32 currentInstrumentRangeStart; pp_int32 currentInstrumentRangeEnd; pp_int32 currentNote; pp_int32 currentNoteRangeStart; pp_int32 currentNoteRangeEnd; pp_int32 currentTransposeAmount; PatternEditorTools::TransposeParameters tp; public: SectionTranspose(Tracker& tracker); virtual ~SectionTranspose(); void setCurrentInstrument(pp_int32 instrument, bool redraw = true); const PatternEditorTools::TransposeParameters& getTransposeParameters() { return tp; } // Derived from SectionAbstract virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init() { SectionUpperLeft::init(); } virtual void init(pp_int32 x, pp_int32 y); virtual void show(bool bShow); virtual void update(bool repaint = true); private: void handleTransposeSong(); void transposeSong(); // Responder should be friend friend class DialogResponderTranspose; friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/GlobalColorConfig.cpp0000644000175000017500000001506311150223367022703 0ustar admin2admin2/* * tracker/GlobalColorConfig.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * GlobalColorConfig.cpp * MilkyTracker * * Created by Peter Barth on 21.11.05. * */ #include "GlobalColorConfig.h" #include "TrackerConfig.h" #include "PPUIConfig.h" const PPColor& GlobalColorConfig::getColor(GlobalColors whichColor) const { switch (whichColor) { // Pattern color identfiers case ColorPatternNote: return TrackerConfig::colorPatternEditorNote; case ColorPatternInstrument: return TrackerConfig::colorPatternEditorInstrument; case ColorPatternVolume: return TrackerConfig::colorPatternEditorVolume; case ColorPatternEffect: return TrackerConfig::colorPatternEditorEffect; case ColorPatternOperand: return TrackerConfig::colorPatternEditorOperand; case ColorCursor: return TrackerConfig::colorPatternEditorCursor; // Cursor line case ColorCursorLine: return TrackerConfig::colorPatternEditorCursorLine; // Cursor line in record mode case ColorCursorLineHighlighted: return TrackerConfig::colorPatternEditorCursorLineHighLight; // Theme color (= desktop in FT2) case ColorTheme: return TrackerConfig::colorThemeMain; // Main text (= white?) case ColorForegroundText: return PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText); // PPButton colors case ColorButtons: return PPUIConfig::getInstance()->getColor(PPUIConfig::ColorDefaultButton); // PPButton foreground text case ColorButtonText: return PPUIConfig::getInstance()->getColor(PPUIConfig::ColorDefaultButtonText); // Various case ColorSelection: return PPUIConfig::getInstance()->getColor(PPUIConfig::ColorSelection); case ColorListBoxBackground: return PPUIConfig::getInstance()->getColor(PPUIConfig::ColorListBoxBackground); case ColorPatternSelection: return TrackerConfig::colorPatternEditorSelection; case ColorTextHighlited: return TrackerConfig::colorHighLight_1; case ColorTextHighlitedSecond: return TrackerConfig::colorHighLight_2; case ColorScopes: return TrackerConfig::colorScopes; case ColorRowHighlitedFirst: return TrackerConfig::colorRowHighLight_1; case ColorRowHighlitedSecond: return TrackerConfig::colorRowHighLight_2; default: return dummy; } } const char* GlobalColorConfig::getColorReadableDescription(GlobalColors whichColor) const { switch (whichColor) { // Pattern color identfiers case ColorPatternNote: return "Pattern:Note"; case ColorPatternInstrument: return "Pattern:Instrument"; case ColorPatternVolume: return "Pattern:Volume"; case ColorPatternEffect: return "Pattern:Effect"; case ColorPatternOperand: return "Pattern:Operand"; // Cursor line case ColorCursor: return "Pattern cursor"; // Cursor line case ColorCursorLine: return "Cursor line"; // Cursor line in record mode case ColorCursorLineHighlighted: return "Cursor line (FT2 rec.)"; // Theme color (= desktop in FT2) case ColorTheme: return "Desktop"; // Main text (= white?) case ColorForegroundText: return "Foreground text"; // PPButton colors case ColorButtons: return "Buttons"; // PPButton foreground text case ColorButtonText: return "Button text"; // Various case ColorSelection: return "Selections"; case ColorListBoxBackground: return "Listbox background"; case ColorPatternSelection: return "Pattern block"; case ColorTextHighlited: return "Highlighted text"; case ColorTextHighlitedSecond: return "Pattern:2nd highlight text"; case ColorScopes: return "Scopes"; case ColorRowHighlitedFirst: return "Pattern:1st row bg"; case ColorRowHighlitedSecond: return "Pattern:2nd row bg"; default: return NULL; } } void GlobalColorConfig::setColor(GlobalColors whichColor, const PPColor& color) { switch (whichColor) { // Pattern color identfiers case ColorPatternNote: TrackerConfig::colorPatternEditorNote = color; break; case ColorPatternInstrument: TrackerConfig::colorPatternEditorInstrument = color; break; case ColorPatternVolume: TrackerConfig::colorPatternEditorVolume = color; break; case ColorPatternEffect: TrackerConfig::colorPatternEditorEffect = color; break; case ColorPatternOperand: TrackerConfig::colorPatternEditorOperand = color; break; // Cursor line case ColorCursor: TrackerConfig::colorPatternEditorCursor = color; break; // Cursor line case ColorCursorLine: TrackerConfig::colorPatternEditorCursorLine = color; break; // Cursor line in record mode case ColorCursorLineHighlighted: TrackerConfig::colorPatternEditorCursorLineHighLight = color; break; // Theme color (= desktop in FT2) case ColorTheme: TrackerConfig::colorThemeMain = color; break; // Main text (= white?) case ColorForegroundText: PPUIConfig::getInstance()->setColor(PPUIConfig::ColorStaticText, color); break; // PPButton colors case ColorButtons: PPUIConfig::getInstance()->setColor(PPUIConfig::ColorDefaultButton, color); break; // PPButton foreground text case ColorButtonText: PPUIConfig::getInstance()->setColor(PPUIConfig::ColorDefaultButtonText, color); break; // Various case ColorSelection: PPUIConfig::getInstance()->setColor(PPUIConfig::ColorSelection, color); break; case ColorListBoxBackground: PPUIConfig::getInstance()->setColor(PPUIConfig::ColorListBoxBackground, color); break; case ColorPatternSelection: TrackerConfig::colorPatternEditorSelection = color; break; case ColorTextHighlited: TrackerConfig::colorHighLight_1 = color; break; case ColorTextHighlitedSecond: TrackerConfig::colorHighLight_2 = color; break; case ColorScopes: TrackerConfig::colorScopes = color; break; case ColorRowHighlitedFirst: TrackerConfig::colorRowHighLight_1 = color; break; case ColorRowHighlitedSecond: TrackerConfig::colorRowHighLight_2 = color; break; } } milkytracker-0.90.85+dfsg/src/tracker/PatternEditorControlKeyboard.cpp0000644000175000017500000014213511150223367025165 0ustar admin2admin2/* * tracker/PatternEditorControlKeyboard.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PatternEditorControlKeyboard.cpp * MilkyTracker * * Created by Peter Barth on Fri Mar 11 2005. * */ #include "PatternEditorControl.h" #include "PatternTools.h" #include "KeyBindings.h" void PatternEditorControl::initKeyBindings() { eventKeyDownBindingsMilkyTracker = new PPKeyBindings; // Key-down bindings MilkyTracker eventKeyDownBindingsMilkyTracker->addBinding(VK_LEFT, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_LEFT); eventKeyDownBindingsMilkyTracker->addBinding(VK_RIGHT, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_RIGHT); eventKeyDownBindingsMilkyTracker->addBinding(VK_UP, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_UP); eventKeyDownBindingsMilkyTracker->addBinding(VK_DOWN, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_DOWN); eventKeyDownBindingsMilkyTracker->addBinding(VK_PRIOR, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_PRIOR); eventKeyDownBindingsMilkyTracker->addBinding(VK_NEXT, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_NEXT); eventKeyDownBindingsMilkyTracker->addBinding(VK_HOME, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_HOME); eventKeyDownBindingsMilkyTracker->addBinding(VK_END, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_END); eventKeyDownBindingsMilkyTracker->addBinding(VK_TAB, 0, &PatternEditorControl::eventKeyDownBinding_NextChannel); eventKeyDownBindingsMilkyTracker->addBinding(VK_TAB, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_NextChannel); eventKeyDownBindingsMilkyTracker->addBinding(VK_TAB, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_PreviousChannel); eventKeyDownBindingsMilkyTracker->addBinding(VK_TAB, KeyModifierSHIFT|KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_PreviousChannel); eventKeyDownBindingsMilkyTracker->addBinding(VK_DELETE, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_DeleteNoteVolumeAndEffect); eventKeyDownBindingsMilkyTracker->addBinding(VK_DELETE, KeyModifierCTRL, &PatternEditorControl::eventKeyDownBinding_DeleteVolumeAndEffect); eventKeyDownBindingsMilkyTracker->addBinding(VK_DELETE, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_DeleteEffect); eventKeyDownBindingsMilkyTracker->addBinding(VK_INSERT, 0, &PatternEditorControl::eventKeyDownBinding_InsertNote); eventKeyDownBindingsMilkyTracker->addBinding(VK_INSERT, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_InsertLine); eventKeyDownBindingsMilkyTracker->addBinding(VK_BACK, 0, &PatternEditorControl::eventKeyDownBinding_DeleteNoteSlot); eventKeyDownBindingsMilkyTracker->addBinding(VK_BACK, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_DeleteLine); eventKeyDownBindingsMilkyTracker->addBinding('Z', KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_Undo); eventKeyDownBindingsMilkyTracker->addBinding('Y', KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_Redo); eventKeyDownBindingsMilkyTracker->addBinding('X', KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_Cut); eventKeyDownBindingsMilkyTracker->addBinding('C', KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_Copy); eventKeyDownBindingsMilkyTracker->addBinding('V', KeyModifierSHIFT|KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_TransparentPaste); eventKeyDownBindingsMilkyTracker->addBinding('V', KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_Paste); eventKeyDownBindingsMilkyTracker->addBinding('A', KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_SelectAll); eventKeyDownBindingsMilkyTracker->addBinding('M', KeyModifierSHIFT, &PatternEditorControl::eventKeyCharBinding_MuteChannel); eventKeyDownBindingsMilkyTracker->addBinding('M', KeyModifierSHIFT|KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_InvertMuting); eventKeyDownBindingsMilkyTracker->addBinding('I', KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_Interpolate); // Key-down bindings Fasttracker eventKeyDownBindingsFastTracker = new PPKeyBindings; eventKeyDownBindingsFastTracker->addBinding(VK_LEFT, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_LEFT); eventKeyDownBindingsFastTracker->addBinding(VK_RIGHT, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_RIGHT); eventKeyDownBindingsFastTracker->addBinding(VK_UP, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_UP); eventKeyDownBindingsFastTracker->addBinding(VK_DOWN, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_DOWN); eventKeyDownBindingsFastTracker->addBinding(VK_PRIOR, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_PRIOR); eventKeyDownBindingsFastTracker->addBinding(VK_NEXT, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_NEXT); eventKeyDownBindingsFastTracker->addBinding(VK_HOME, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_HOME); eventKeyDownBindingsFastTracker->addBinding(VK_END, 0xFFFF, &PatternEditorControl::eventKeyDownBinding_END); eventKeyDownBindingsFastTracker->addBinding(VK_TAB, 0, &PatternEditorControl::eventKeyDownBinding_NextChannel); eventKeyDownBindingsFastTracker->addBinding(VK_TAB, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_PreviousChannel); eventKeyDownBindingsFastTracker->addBinding(VK_TAB, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_NextChannel); eventKeyDownBindingsFastTracker->addBinding(VK_TAB, KeyModifierSHIFT|KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_PreviousChannel); eventKeyDownBindingsFastTracker->addBinding(VK_DELETE, 0, &PatternEditorControl::eventKeyDownBinding_DeleteNote); eventKeyDownBindingsFastTracker->addBinding(VK_DELETE, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_DeleteNoteVolumeAndEffect); eventKeyDownBindingsFastTracker->addBinding(VK_DELETE, KeyModifierCTRL, &PatternEditorControl::eventKeyDownBinding_DeleteVolumeAndEffect); eventKeyDownBindingsFastTracker->addBinding(VK_DELETE, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_DeleteEffect); eventKeyDownBindingsFastTracker->addBinding(VK_INSERT, 0, &PatternEditorControl::eventKeyDownBinding_InsertNote); eventKeyDownBindingsFastTracker->addBinding(VK_INSERT, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_InsertLine); eventKeyDownBindingsFastTracker->addBinding(VK_BACK, 0, &PatternEditorControl::eventKeyDownBinding_DeleteNoteSlot); eventKeyDownBindingsFastTracker->addBinding(VK_BACK, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_DeleteLine); eventKeyDownBindingsFastTracker->addBinding(VK_F3, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_CutTrack); eventKeyDownBindingsFastTracker->addBinding(VK_F4, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_CopyTrack); eventKeyDownBindingsFastTracker->addBinding(VK_F5, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_PasteTrack); eventKeyDownBindingsFastTracker->addBinding(VK_F6, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_TransparentPasteTrack); eventKeyDownBindingsFastTracker->addBinding(VK_F3, KeyModifierCTRL, &PatternEditorControl::eventKeyDownBinding_CutPattern); eventKeyDownBindingsFastTracker->addBinding(VK_F4, KeyModifierCTRL, &PatternEditorControl::eventKeyDownBinding_CopyPattern); eventKeyDownBindingsFastTracker->addBinding(VK_F5, KeyModifierCTRL, &PatternEditorControl::eventKeyDownBinding_PastePattern); eventKeyDownBindingsFastTracker->addBinding(VK_F6, KeyModifierCTRL, &PatternEditorControl::eventKeyDownBinding_TransparentPastePattern); eventKeyDownBindingsFastTracker->addBinding(VK_F3, KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_Cut); eventKeyDownBindingsFastTracker->addBinding(VK_F4, KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_Copy); eventKeyDownBindingsFastTracker->addBinding(VK_F5, KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_Paste); eventKeyDownBindingsFastTracker->addBinding(VK_F6, KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_TransparentPaste); // Typical: // Remember to check keyboard shortcuts which are always possible in file TrackerShortCuts.cpp // (= keyboard handler) otherwise they might not be routed here eventKeyDownBindingsFastTracker->addBinding('Z', KeyModifierCTRL|KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_Undo); eventKeyDownBindingsFastTracker->addBinding('Y', KeyModifierCTRL|KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_Redo); eventKeyDownBindingsFastTracker->addBinding('X', KeyModifierCTRL|KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_Cut); eventKeyDownBindingsFastTracker->addBinding('C', KeyModifierCTRL|KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_Copy); eventKeyDownBindingsFastTracker->addBinding('V', KeyModifierCTRL|KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_Paste); eventKeyDownBindingsFastTracker->addBinding('A', KeyModifierCTRL|KeyModifierALT, &PatternEditorControl::eventKeyCharBinding_SelectAll); eventKeyDownBindingsFastTracker->addBinding('M', KeyModifierSHIFT, &PatternEditorControl::eventKeyCharBinding_MuteChannel); eventKeyDownBindingsFastTracker->addBinding('M', KeyModifierSHIFT|KeyModifierCTRL, &PatternEditorControl::eventKeyCharBinding_InvertMuting); eventKeyDownBindingsFastTracker->addBinding('I', KeyModifierSHIFT, &PatternEditorControl::eventKeyCharBinding_Interpolate); scanCodeBindingsFastTracker = new PPKeyBindings; // Scancode bindings scanCodeBindingsFastTracker->addBinding(SC_1, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro1); scanCodeBindingsFastTracker->addBinding(SC_2, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro2); scanCodeBindingsFastTracker->addBinding(SC_3, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro3); scanCodeBindingsFastTracker->addBinding(SC_4, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro4); scanCodeBindingsFastTracker->addBinding(SC_5, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro5); scanCodeBindingsFastTracker->addBinding(SC_6, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro6); scanCodeBindingsFastTracker->addBinding(SC_7, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro7); scanCodeBindingsFastTracker->addBinding(SC_8, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro8); scanCodeBindingsFastTracker->addBinding(SC_9, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro9); scanCodeBindingsFastTracker->addBinding(SC_0, KeyModifierALT|KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_ReadMacro0); scanCodeBindingsFastTracker->addBinding(SC_1, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro1); scanCodeBindingsFastTracker->addBinding(SC_2, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro2); scanCodeBindingsFastTracker->addBinding(SC_3, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro3); scanCodeBindingsFastTracker->addBinding(SC_4, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro4); scanCodeBindingsFastTracker->addBinding(SC_5, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro5); scanCodeBindingsFastTracker->addBinding(SC_6, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro6); scanCodeBindingsFastTracker->addBinding(SC_7, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro7); scanCodeBindingsFastTracker->addBinding(SC_8, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro8); scanCodeBindingsFastTracker->addBinding(SC_9, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro9); scanCodeBindingsFastTracker->addBinding(SC_0, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_WriteMacro0); scanCodeBindingsFastTracker->addBinding(SC_Q, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_Q); scanCodeBindingsFastTracker->addBinding(SC_W, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_W); scanCodeBindingsFastTracker->addBinding(SC_E, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_E); scanCodeBindingsFastTracker->addBinding(SC_R, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_R); scanCodeBindingsFastTracker->addBinding(SC_T, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_T); scanCodeBindingsFastTracker->addBinding(SC_Z, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_Z); scanCodeBindingsFastTracker->addBinding(SC_U, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_U); scanCodeBindingsFastTracker->addBinding(SC_I, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_I); scanCodeBindingsFastTracker->addBinding(SC_A, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_A); scanCodeBindingsFastTracker->addBinding(SC_S, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_S); scanCodeBindingsFastTracker->addBinding(SC_D, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_D); scanCodeBindingsFastTracker->addBinding(SC_F, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_F); scanCodeBindingsFastTracker->addBinding(SC_G, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_G); scanCodeBindingsFastTracker->addBinding(SC_H, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_H); scanCodeBindingsFastTracker->addBinding(SC_J, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_J); scanCodeBindingsFastTracker->addBinding(SC_K, KeyModifierALT, &PatternEditorControl::eventKeyDownBinding_SC_K); scanCodeBindingsFastTracker->addBinding(SC_WTF, 0, &PatternEditorControl::eventKeyDownBinding_SC_IncreaseRowInsertAdd); scanCodeBindingsFastTracker->addBinding(SC_WTF, KeyModifierSHIFT, &PatternEditorControl::eventKeyDownBinding_SC_DecreaseRowInsertAdd); eventKeyDownBindings = eventKeyDownBindingsMilkyTracker; } static pp_int32 virtualKeyToHex(pp_uint16 keyCode) { pp_int32 number = -1; switch (keyCode) { // 0: case 0x30: number = 0; break; // 1: case 0x31: number = 1; break; // 2: case 0x32: number = 2; break; // 3: case 0x33: number = 3; break; // 4: case 0x34: number = 4; break; // 5: case 0x35: number = 5; break; // 6: case 0x36: number = 6; break; // 7: case 0x37: number = 7; break; // 8: case 0x38: number = 8; break; // 9: case 0x39: number = 9; break; // A: case 0x41: number = 0xA; break; // B: case 0x42: number = 0xB; break; // C: case 0x43: number = 0xC; break; // D: case 0x44: number = 0xD; break; // E: case 0x45: number = 0xE; break; // F: case 0x46: number = 0xF; break; } return number; } static pp_int32 asciiToHex(pp_uint16 ascii) { pp_int32 number = -1; switch (ascii) { // 0: case '0': number = 0; break; // 1: case '1': number = 1; break; // 2: case '2': number = 2; break; // 3: case '3': number = 3; break; // 4: case '4': number = 4; break; // 5: case '5': number = 5; break; // 6: case '6': number = 6; break; // 7: case '7': number = 7; break; // 8: case '8': number = 8; break; // 9: case '9': number = 9; break; // A: case 'A': case 'a': number = 0xA; break; // B: case 'B': case 'b': number = 0xB; break; // C: case 'C': case 'c': number = 0xC; break; // D: case 'D': case 'd': number = 0xD; break; // E: case 'E': case 'e': number = 0xE; break; // F: case 'F': case 'f': number = 0xF; break; } return number; } static pp_int32 asciiToHexExtended(pp_uint16 ascii) { pp_int32 number = -1; switch (ascii) { case 'G': case 'g': number = 0x10; break; case 'H': case 'h': number = 0x11; break; case 'I': case 'i': number = 0x12; break; case 'J': case 'j': number = 0x13; break; case 'K': case 'k': number = 0x14; break; case 'L': case 'l': number = 0x15; break; case 'M': case 'm': number = 0x16; break; case 'N': case 'n': number = 0x17; break; case 'O': case 'o': number = 0x18; break; case 'P': case 'p': number = 0x19; break; case 'Q': case 'q': number = 0x1A; break; case 'R': case 'r': number = 0x1B; break; case 'S': case 's': number = 0x1C; break; case 'T': case 't': number = 0x1D; break; case 'U': case 'u': number = 0x1E; break; case 'V': case 'v': number = 0x1F; break; case 'W': case 'w': number = 0x20; break; case 'X': case 'x': number = 0x21; break; case 'Y': case 'y': number = 0x22; break; case 'Z': case 'z': number = 0x23; break; } return number; } pp_int32 PatternEditorControl::ScanCodeToNote(pp_int16 scanCode) { switch (scanCode) { // 2,L: C# case 0x03: case 0x26: return TONOTE(patternEditor->getCurrentOctave(),1); // 3,÷: D# case 0x04: case 0x27: return TONOTE(patternEditor->getCurrentOctave(),3); // 5,': F# case 0x06: case 0x2B: return TONOTE(patternEditor->getCurrentOctave(),6); // 6: G# case 0x07: return TONOTE(patternEditor->getCurrentOctave(),8); // 7: A# case 0x08: return TONOTE(patternEditor->getCurrentOctave(),10); // 9: C# + 1 case 0x0A: return TONOTE(patternEditor->getCurrentOctave() + 1,1); // 0: D# + 1 case 0x0B: return TONOTE(patternEditor->getCurrentOctave() + 1,3); // Â¥: F# + 1 case 0x0D: return TONOTE(patternEditor->getCurrentOctave() + 1,6); // S: C# - 1 case 0x1F: return TONOTE(patternEditor->getCurrentOctave() - 1,1); // D: D# - 1 case 0x20: return TONOTE(patternEditor->getCurrentOctave() - 1,3); // G: F# - 1 case 0x22: return TONOTE(patternEditor->getCurrentOctave() - 1,6); // H: G# - 1 case 0x23: return TONOTE(patternEditor->getCurrentOctave() - 1,8); // J: A# - 1 case 0x24: return TONOTE(patternEditor->getCurrentOctave() - 1,10); // Q: C case 0x10: return TONOTE(patternEditor->getCurrentOctave(),0); // W: D case 0x11: return TONOTE(patternEditor->getCurrentOctave(),2); // E: E case 0x12: return TONOTE(patternEditor->getCurrentOctave(),4); // R: F case 0x13: return TONOTE(patternEditor->getCurrentOctave(),5); // T: G case 0x14: return TONOTE(patternEditor->getCurrentOctave(),7); // Z: A case 0x15: return TONOTE(patternEditor->getCurrentOctave(),9); // U: B case 0x16: return TONOTE(patternEditor->getCurrentOctave(),11); // Y: C - 1 case 0x2C: return TONOTE(patternEditor->getCurrentOctave() - 1,0); // X: D - 1 case 0x2D: return TONOTE(patternEditor->getCurrentOctave() - 1,2); // C: E - 1 case 0x2E: return TONOTE(patternEditor->getCurrentOctave() - 1,4); // R: F - 1 case 0x2F: return TONOTE(patternEditor->getCurrentOctave() - 1,5); // B: G - 1 case 0x30: return TONOTE(patternEditor->getCurrentOctave() - 1,7); // N: A - 1 case 0x31: return TONOTE(patternEditor->getCurrentOctave() - 1,9); // M: B - 1 case 0x32: return TONOTE(patternEditor->getCurrentOctave() - 1,11); // ,: C case 0x33: return TONOTE(patternEditor->getCurrentOctave(),0); // .: D case 0x34: return TONOTE(patternEditor->getCurrentOctave(),2); // -: E case 0x35: return TONOTE(patternEditor->getCurrentOctave(),4); // I case 0x17: return TONOTE(patternEditor->getCurrentOctave()+1,0); // O case 0x18: return TONOTE(patternEditor->getCurrentOctave()+1,2); // P case 0x19: return TONOTE(patternEditor->getCurrentOctave()+1,4); // ‹ case 0x1A: return TONOTE(patternEditor->getCurrentOctave()+1,5); // + case 0x1B: return TONOTE(patternEditor->getCurrentOctave()+1,7); // ^: Key off case SC_WTF: if (editMode != EditModeMilkyTracker) break; return PatternTools::getNoteOffNote(); // CAPS-lock case SC_CAPSLOCK: #ifndef WIN32 case SC_1: #endif return PatternTools::getNoteOffNote(); case SC_SMALLERGREATER: return PatternTools::getNoteOffNote(); default: return -1; } return -1; } void PatternEditorControl::handleDeleteKey(pp_uint16 keyCode, pp_int32& result) { if (result == -1 && ::getKeyModifier() == 0) { switch (keyCode) { // Delete (only works in MilkyTracker edit mode) // in FT2 mode this key combination is bound to a method case VK_DELETE: if (hasValidSelection()) patternEditor->clearSelection(); else { result = 0xFF; } break; } } } // "C-","C#","D-","D#","E-","F-","F#","G-","G#","A-","A#","B-" void PatternEditorControl::handleKeyDown(pp_uint16 keyCode, pp_uint16 scanCode, pp_uint16 character) { PatternEditorTools::Position& cursor = patternEditor->getCursor(); if (::getKeyModifier() == 0) { switch (keyCode) { // F1 case VK_F1: patternEditor->setCurrentOctave(1); assureCursor = false; notifyUpdate(); return; // F2 case VK_F2: patternEditor->setCurrentOctave(2); assureCursor = false; notifyUpdate(); return; // F3 case VK_F3: patternEditor->setCurrentOctave(3); assureCursor = false; notifyUpdate(); return; // F4 case VK_F4: patternEditor->setCurrentOctave(4); assureCursor = false; notifyUpdate(); return; // F5 case VK_F5: patternEditor->setCurrentOctave(5); assureCursor = false; notifyUpdate(); return; // F6 case VK_F6: patternEditor->setCurrentOctave(6); assureCursor = false; notifyUpdate(); return; // F7 case VK_F7: patternEditor->setCurrentOctave(7); assureCursor = false; notifyUpdate(); return; // F8 case VK_F8: patternEditor->setCurrentOctave(8); assureCursor = false; notifyUpdate(); return; // F9 case VK_F9: eventKeyDownBinding_HOME(); return; // F10 case VK_F10: eventKeyDownBinding_FIRSTQUARTER(); return; // F11 case VK_F11: eventKeyDownBinding_SECONDQUARTER(); return; // F12 case VK_F12: eventKeyDownBinding_THIRDQUARTER(); return; } } // prevent unnecessary screen refreshing through listener callback // remember to reset this when leaving this function patternEditor->setLazyUpdateNotifications(true); if (cursor.inner == 0) { pp_int32 note = -1; handleDeleteKey(keyCode, note); if (note == -1 && ::getKeyModifier() == 0) { note = ScanCodeToNote(scanCode); } patternEditor->writeNote(note, true, this); } else if ((cursor.inner == 1 || cursor.inner == 2)) { pp_int32 number = -1; handleDeleteKey(keyCode, number); // still not assigned, try if we map to a hexadecimal digit if (number == -1) { number = asciiToHex(character); } if (number == 0xFF) { patternEditor->writeInstrument(PatternEditor::NibbleTypeBoth, 0, true, this); } else if (number >= 0 && number <= 0xF) { if (cursor.inner == 1) patternEditor->writeInstrument(PatternEditor::NibbleTypeHigh, number, true, this); else if (cursor.inner == 2) patternEditor->writeInstrument(PatternEditor::NibbleTypeLow, number, true, this); } } else if (cursor.inner == 3 || cursor.inner == 4) { pp_int32 number = -1; switch (character) { // -: Volslide down case '-': if (cursor.inner == 3) { number = 5; break; } goto stupid; // +: Volslide up case '+': if (cursor.inner == 3) { number = 6; break; } goto stupid; // D: Fine volslide down case 'd': if (cursor.inner == 3) { number = 7; break; } goto stupid; // U: Fine volslide up case 'u': if (cursor.inner == 3) { number = 8; break; } goto stupid; // S: Vibrato rate case 's': if (cursor.inner == 3) { number = 9; break; } goto stupid; // V: Vibrato depth case 'v': if (cursor.inner == 3) { number = 0xA; break; } goto stupid; // P: Set Panning case 'p': if (cursor.inner == 3) { number = 0xB; break; } goto stupid; // L: Panning slide left case 'l': case '<': if (cursor.inner == 3) { number = 0xC; break; } goto stupid; // R: Panning slide right case 'r': case '>': if (cursor.inner == 3) { number = 0xD; break; } goto stupid; // M: Portamento case 'm': if (cursor.inner == 3) { number = 0xE; break; } goto stupid; } handleDeleteKey(keyCode, number); // still not assigned, try if we map to a hexadecimal digit if (number == -1) { stupid: number = asciiToHex(character); if (cursor.inner == 3 && number > 4) goto cleanUp; } if (number == 0xFF || (number >= 0 && number <= 0xF)) { if (number == 0xFF) { patternEditor->writeFT2Volume(PatternEditor::NibbleTypeBoth, number, true, this); } else { patternEditor->writeFT2Volume(cursor.inner == 3 ? PatternEditor::NibbleTypeHigh : PatternEditor::NibbleTypeLow, number, true, this); } } } else if (cursor.inner == 5) { pp_int32 number = -1; handleDeleteKey(keyCode, number); // still not assigned, try if we map to a hexadecimal digit if (number == -1) { number = asciiToHex(character); if (number == -1) { number = asciiToHexExtended(character); } } if (number == 0xFF || (number >= 0 && number <= 0x23)) { patternEditor->writeEffectNumber(number, true, this); } } else if ((cursor.inner == 6 || cursor.inner == 7)) { pp_int32 number = -1; handleDeleteKey(keyCode, number); // still not assigned, try if we map to a hexadecimal digit if (number == -1) { number = asciiToHex(character); } if (number == 0xFF || (number >= 0 && number <= 0xF)) { if (number == 0xFF) { patternEditor->writeEffectOperand(PatternEditor::NibbleTypeBoth, number, true, this); } else { patternEditor->writeEffectOperand(cursor.inner == 6 ? PatternEditor::NibbleTypeHigh : PatternEditor::NibbleTypeLow, number, true, this); } } } cleanUp: patternEditor->setLazyUpdateNotifications(false); } bool PatternEditorControl::executeBinding(const PPKeyBindings* bindings, pp_uint16 keyCode) { if (bindings == NULL) return false; TPatternEditorKeyBindingHandler handlerFunc; bool res = bindings->getBinding(keyCode, ::getKeyModifier(), handlerFunc); if (res) { (this->*handlerFunc)(); return true; } return false; } ////////////////////////////////////////////////////// // key-down bindings // ////////////////////////////////////////////////////// void PatternEditorControl::eventKeyDownBinding_LEFT() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); cursor.inner--; if (cursor.inner < 0) { if (cursor.channel > 0) { cursor.channel--; cursor.inner = 7; } else { // When selecting don't wrap around (not intuitive) if (::getKeyModifier() & selectionKeyModifier) { cursor.inner = 0; } else { cursor.inner = 7; cursor.channel = patternEditor->getNumChannels()-1; } } } } void PatternEditorControl::eventKeyDownBinding_RIGHT() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); cursor.inner++; if (cursor.inner == 8) { if (cursor.channel < patternEditor->getNumChannels() - 1) { cursor.channel++; cursor.inner = 0; } else { // When selecting don't wrap around (not intuitive) if (::getKeyModifier() & selectionKeyModifier) { cursor.inner = 7; } else { cursor.inner = 0; cursor.channel = 0; } } } } void PatternEditorControl::eventKeyDownBinding_UP() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); pp_int32 res = 0; cursor.row--; // When selecting don't wrap around (not intuitive) if (cursor.row < 0 && ((::getKeyModifier() & selectionKeyModifier) || startSelection)) { cursor.row = 0; return; } else if (cursor.row < 0) { res = notifyUpdate(AdvanceCodeCursorUpWrappedStart); } if (!res && cursor.row < 0) { //cursor.row = wrapAround ? pattern->rows-1 : 0; cursor.row = pattern->rows-1; } if (!res) notifyUpdate(AdvanceCodeSelectNewRow); } void PatternEditorControl::eventKeyDownBinding_DOWN() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); pp_int32 res = 0; cursor.row++; if (cursor.row > pattern->rows-1 && ((::getKeyModifier() & selectionKeyModifier) || startSelection)) { cursor.row = pattern->rows-1; return; } else if (cursor.row > pattern->rows-1) { res = notifyUpdate(AdvanceCodeCursorDownWrappedEnd); } if (!res && cursor.row > pattern->rows-1) { //cursor.row = wrapAround ? 0 : pattern->rows-1; cursor.row = 0; } if (!res) notifyUpdate(AdvanceCodeSelectNewRow); } void PatternEditorControl::eventKeyDownBinding_PRIOR() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); pp_int32 res = 0; cursor.row-=16; // When selecting don't wrap around (not intuitive) if (cursor.row < 0 && ((::getKeyModifier() & selectionKeyModifier) || startSelection)) { cursor.row = 0; return; } else if (cursor.row < 0) { res = notifyUpdate(AdvanceCodeCursorPageUpWrappedStart); } if (!res && cursor.row < 0) { cursor.row = /*wrapAround ? pattern->rows-1 : */0; } if (!res) notifyUpdate(AdvanceCodeSelectNewRow); } void PatternEditorControl::eventKeyDownBinding_NEXT() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); pp_int32 res = 0; cursor.row+=16; if (cursor.row > pattern->rows-1 && ((::getKeyModifier() & selectionKeyModifier) || startSelection)) { cursor.row = pattern->rows-1; return; } else if (cursor.row > pattern->rows-1) { res = notifyUpdate(AdvanceCodeCursorPageDownWrappedEnd); } if (!res && cursor.row > pattern->rows-1) { cursor.row = /*wrapAround ? 0 : */pattern->rows-1; } if (!res) notifyUpdate(AdvanceCodeSelectNewRow); } void PatternEditorControl::eventKeyDownBinding_HOME() { patternEditor->getCursor().row = 0; notifyUpdate(AdvanceCodeSelectNewRow); } void PatternEditorControl::eventKeyDownBinding_END() { patternEditor->getCursor().row = pattern->rows-1; notifyUpdate(AdvanceCodeSelectNewRow); } void PatternEditorControl::eventKeyDownBinding_FIRSTQUARTER() { patternEditor->getCursor().row = (pattern->rows >> 2); notifyUpdate(AdvanceCodeSelectNewRow); } void PatternEditorControl::eventKeyDownBinding_SECONDQUARTER() { patternEditor->getCursor().row = (pattern->rows >> 2)*2; notifyUpdate(AdvanceCodeSelectNewRow); } void PatternEditorControl::eventKeyDownBinding_THIRDQUARTER() { patternEditor->getCursor().row = (pattern->rows >> 2)*3; notifyUpdate(AdvanceCodeSelectNewRow); } //////////////////////////////////////////////////////////////////////////////////////////////////////// // Damn FT2 shortcuts //////////////////////////////////////////////////////////////////////////////////////////////////////// void PatternEditorControl::eventKeyDownBinding_ReadMacro1() { patternEditor->storeMacroFromCursor(1); } void PatternEditorControl::eventKeyDownBinding_ReadMacro2() { patternEditor->storeMacroFromCursor(2); } void PatternEditorControl::eventKeyDownBinding_ReadMacro3() { patternEditor->storeMacroFromCursor(3); } void PatternEditorControl::eventKeyDownBinding_ReadMacro4() { patternEditor->storeMacroFromCursor(4); } void PatternEditorControl::eventKeyDownBinding_ReadMacro5() { patternEditor->storeMacroFromCursor(5); } void PatternEditorControl::eventKeyDownBinding_ReadMacro6() { patternEditor->storeMacroFromCursor(6); } void PatternEditorControl::eventKeyDownBinding_ReadMacro7() { patternEditor->storeMacroFromCursor(7); } void PatternEditorControl::eventKeyDownBinding_ReadMacro8() { patternEditor->storeMacroFromCursor(8); } void PatternEditorControl::eventKeyDownBinding_ReadMacro9() { patternEditor->storeMacroFromCursor(9); } void PatternEditorControl::eventKeyDownBinding_ReadMacro0() { patternEditor->storeMacroFromCursor(0); } void PatternEditorControl::eventKeyDownBinding_WriteMacro1() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(1, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro2() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(2, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro3() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(3, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro4() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(4, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro5() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(5, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro6() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(6, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro7() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(7, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro8() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(8, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro9() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(9, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_WriteMacro0() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->writeMacroToCursor(0, this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_SC_Q() { patternEditor->getCursor().channel = 0 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_W() { patternEditor->getCursor().channel = 1 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_E() { patternEditor->getCursor().channel = 2 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_R() { patternEditor->getCursor().channel = 3 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_T() { patternEditor->getCursor().channel = 4 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_Z() { patternEditor->getCursor().channel = 5 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_U() { patternEditor->getCursor().channel = 6 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_I() { patternEditor->getCursor().channel = 7 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_A() { patternEditor->getCursor().channel = 8 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_S() { patternEditor->getCursor().channel = 9 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_D() { patternEditor->getCursor().channel = 10 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_F() { patternEditor->getCursor().channel = 11 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_G() { patternEditor->getCursor().channel = 12 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_H() { patternEditor->getCursor().channel = 13 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_J() { patternEditor->getCursor().channel = 14 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_K() { patternEditor->getCursor().channel = 15 % patternEditor->getNumChannels(); } void PatternEditorControl::eventKeyDownBinding_SC_IncreaseRowInsertAdd() { increaseRowInsertAdd(); notifyUpdate(); } void PatternEditorControl::eventKeyDownBinding_SC_DecreaseRowInsertAdd() { decreaseRowInsertAdd(); notifyUpdate(); } void PatternEditorControl::eventKeyDownBinding_DeleteNote() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->deleteCursorSlotData(this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_DeleteNoteVolumeAndEffect() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->deleteCursorSlotDataEntire(this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_DeleteVolumeAndEffect() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->deleteCursorSlotDataVolumeAndEffect(this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_DeleteEffect() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->deleteCursorSlotDataEffect(this); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_PreviousChannel() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); // if the track inner position is not the note column, we will first // set the position to the note before decrementing the track result if (properties.tabToNote && cursor.inner > 0) { cursor.inner = 0; return; } if (cursor.channel > 0) { cursor.channel--; if (properties.tabToNote) cursor.inner = 0; } else { // When selecting don't wrap around (not intuitive) if (::getKeyModifier() & selectionKeyModifier) { cursor.channel = 0; cursor.inner = 0; } else { cursor.channel = patternEditor->getNumChannels() - 1; if (properties.tabToNote) cursor.inner = 0; } } } void PatternEditorControl::eventKeyDownBinding_NextChannel() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); if (cursor.channel < patternEditor->getNumChannels() - 1) { cursor.channel++; if (properties.tabToNote) cursor.inner = 0; } else { // When selecting don't wrap around (not intuitive) if (::getKeyModifier() & selectionKeyModifier) { cursor.channel = patternEditor->getNumChannels()-1; cursor.inner = 7; } else { cursor.channel = 0; if (properties.tabToNote) cursor.inner = 0; } } } void PatternEditorControl::eventKeyDownBinding_InsertNote() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->insertNote(patternEditor->getCursor().channel, patternEditor->getCursor().row); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_InsertLine() { // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->insertLine(patternEditor->getCursor().row); patternEditor->setLazyUpdateNotifications(false); } void PatternEditorControl::eventKeyDownBinding_DeleteNoteSlot() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); if (cursor.row) { cursor.row--; // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->deleteNote(cursor.channel, cursor.row); patternEditor->setLazyUpdateNotifications(false); } } void PatternEditorControl::eventKeyDownBinding_DeleteLine() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); if (cursor.row) { cursor.row--; // prevent unnecessary screen refreshing through listener callback patternEditor->setLazyUpdateNotifications(true); patternEditor->deleteLine(cursor.row); patternEditor->setLazyUpdateNotifications(false); } } void PatternEditorControl::eventKeyDownBinding_CutTrack() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); PatternEditorTools::Position ss = patternEditor->getSelection().start, se = patternEditor->getSelection().end, cc = cursor; markChannel(cursor.channel, false); // if invoked by key combination, the view shouldn't be adjusted // to ensure a visible cursor, just stay where you are assureCursor = false; // but an update might be useful assureUpdate = true; // remember cursor position cursorCopy = patternEditor->getCursor(); patternEditor->cut(PatternEditor::ClipBoardTypeTrack); patternEditor->getSelection().start = ss; patternEditor->getSelection().end = se; cursor = cc; } void PatternEditorControl::eventKeyDownBinding_CopyTrack() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); PatternEditorTools::Position ss = patternEditor->getSelection().start, se = patternEditor->getSelection().end, cc = cursor; markChannel(cursor.channel, false); // if invoked by key combination, the view shouldn't be adjusted // to ensure a visible cursor, just stay where you are assureCursor = false; // but an update might be useful assureUpdate = true; // remember cursor position cursorCopy = patternEditor->getCursor(); patternEditor->copy(PatternEditor::ClipBoardTypeTrack); patternEditor->getSelection().start = ss; patternEditor->getSelection().end = se; cursor = cc; } void PatternEditorControl::eventKeyDownBinding_PasteTrack() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); PatternEditorTools::Position ss = patternEditor->getSelection().start, se = patternEditor->getSelection().end, cc = cursor; // Start at row 0 cursor.row = 0; cursor.inner = 0; patternEditor->paste(PatternEditor::ClipBoardTypeTrack, false); patternEditor->getSelection().start = ss; patternEditor->getSelection().end = se; cursor = cc; } void PatternEditorControl::eventKeyDownBinding_TransparentPasteTrack() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); PatternEditorTools::Position ss = patternEditor->getSelection().start, se = patternEditor->getSelection().end, cc = cursor; // Start at row 0 cursor.row = 0; cursor.inner = 0; patternEditor->paste(PatternEditor::ClipBoardTypeTrack, true); patternEditor->getSelection().start = ss; patternEditor->getSelection().end = se; cursor = cc; } void PatternEditorControl::eventKeyDownBinding_CutPattern() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); PatternEditorTools::Position ss = patternEditor->getSelection().start, se = patternEditor->getSelection().end, cc = cursor; selectAll(); // if invoked by key combination, the view shouldn't be adjusted // to ensure a visible cursor, just stay where you are assureCursor = false; // but an update might be useful assureUpdate = true; // remember cursor position cursorCopy = patternEditor->getCursor(); patternEditor->cut(PatternEditor::ClipBoardTypePattern); patternEditor->getSelection().start = ss; patternEditor->getSelection().end = se; cursor = cc; } void PatternEditorControl::eventKeyDownBinding_CopyPattern() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); PatternEditorTools::Position ss = patternEditor->getSelection().start, se = patternEditor->getSelection().end, cc = cursor; selectAll(); // if invoked by key combination, the view shouldn't be adjusted // to ensure a visible cursor, just stay where you are assureCursor = false; // but an update might be useful assureUpdate = true; // remember cursor position cursorCopy = patternEditor->getCursor(); patternEditor->copy(PatternEditor::ClipBoardTypePattern); patternEditor->getSelection().start = ss; patternEditor->getSelection().end = se; cursor = cc; } void PatternEditorControl::eventKeyDownBinding_PastePattern() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); PatternEditorTools::Position ss = patternEditor->getSelection().start, se = patternEditor->getSelection().end, cc = cursor; // start at row 0/channel 0 cursor.row = 0; cursor.channel = 0; cursor.inner = 0; patternEditor->paste(PatternEditor::ClipBoardTypePattern, false); patternEditor->getSelection().start = ss; patternEditor->getSelection().end = se; cursor = cc; } void PatternEditorControl::eventKeyDownBinding_TransparentPastePattern() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); PatternEditorTools::Position ss = patternEditor->getSelection().start, se = patternEditor->getSelection().end, cc = cursor; // start at row 0/channel 0 cursor.row = 0; cursor.channel = 0; cursor.inner = 0; patternEditor->paste(PatternEditor::ClipBoardTypePattern, true); patternEditor->getSelection().start = ss; patternEditor->getSelection().end = se; cursor = cc; } void PatternEditorControl::eventKeyCharBinding_Undo() { patternEditor->undo(); } void PatternEditorControl::eventKeyCharBinding_Redo() { patternEditor->redo(); } void PatternEditorControl::eventKeyCharBinding_Cut() { // if invoked by key combination, the view shouldn't be adjusted // to ensure a visible cursor, just stay where you are assureCursor = false; // but an update might be useful assureUpdate = true; // remember cursor position cursorCopy = patternEditor->getCursor(); patternEditor->cut(PatternEditor::ClipBoardTypeSelection); } void PatternEditorControl::eventKeyCharBinding_Copy() { // if invoked by key combination, the view shouldn't be adjusted // to ensure a visible cursor, just stay where you are assureCursor = false; // but an update might be useful assureUpdate = true; // remember cursor position cursorCopy = patternEditor->getCursor(); patternEditor->copy(PatternEditor::ClipBoardTypeSelection); } void PatternEditorControl::eventKeyCharBinding_Paste() { if (patternEditor->getCursor() == cursorCopy && menuInvokeChannel != -1) patternEditor->paste(PatternEditor::ClipBoardTypeSelection, false, menuInvokeChannel); else patternEditor->paste(PatternEditor::ClipBoardTypeSelection, false); } void PatternEditorControl::eventKeyCharBinding_TransparentPaste() { if (patternEditor->getCursor() == cursorCopy && menuInvokeChannel != -1) patternEditor->paste(PatternEditor::ClipBoardTypeSelection, true, menuInvokeChannel); else patternEditor->paste(PatternEditor::ClipBoardTypeSelection, true); } void PatternEditorControl::eventKeyCharBinding_SelectAll() { PatternEditor::Selection currentSelection = patternEditor->getSelection(); if (currentSelection.start.channel == 0 && currentSelection.start.row == 0 && currentSelection.end.channel == patternEditor->getNumChannels()-1 && currentSelection.end.row == pattern->rows-1) { deselectAll(); } else { selectAll(); } } void PatternEditorControl::eventKeyCharBinding_MuteChannel() { muteChannels[patternEditor->getCursor().channel] = !muteChannels[patternEditor->getCursor().channel]; PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels)); eventListener->handleEvent(reinterpret_cast(this), &e); } void PatternEditorControl::eventKeyCharBinding_InvertMuting() { for (pp_int32 i = 0; i < patternEditor->getNumChannels(); i++) muteChannels[i] = !muteChannels[i]; PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels)); eventListener->handleEvent(reinterpret_cast(this), &e); } void PatternEditorControl::eventKeyCharBinding_Interpolate() { patternEditor->interpolateValuesInSelection(); } milkytracker-0.90.85+dfsg/src/tracker/carbon/0000755000175000017500000000000011317506132020110 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/tracker/carbon/Carbon_Definitions.h0000644000175000017500000000222411150223367024021 0ustar admin2admin2/* * tracker/carbon/Carbon_Definitions.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Carbon_Definitions.h * MilkyTracker * * Created by Peter Barth on 07.04.06. * */ #ifndef __CARBONDEFINITIONS_H__ #define __CARBONDEFINITIONS_H__ #define kFullscreenCommand 'gFul' #define kInvokePreferences 'iPdc' #define kDiscardPreferences 'dPdl' #define kConfirmPreferences 'cPdl' #define kMIDIDeviceBaseCommand 1073741824 #define kAppSignature 'MTTP' #endif milkytracker-0.90.85+dfsg/src/tracker/carbon/InfoPlist.strings0000644000175000017500000000031611317505774023445 0ustar admin2admin2/* Localized versions of Info.plist keys */ CFBundleNAme = "MilkyTracker"; CFBundleShortVersionString = "MilkyTracker version 0.90.85"; CFBundleGetInfoString = "MilkyTracker v0.90.85, Copyright 2004-2010"; milkytracker-0.90.85+dfsg/src/tracker/carbon/PreferencesDialog.cpp0000644000175000017500000004347011150223367024206 0ustar admin2admin2/* * tracker/carbon/PreferencesDialog.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PreferencesDialog.cpp * MilkyTracker * * Created by Peter Barth on 07.04.06. * */ #include "PreferencesDialog.h" #include "Carbon_Definitions.h" #include "TrackerSettingsDatabase.h" #include "RtMidi.h" #include "RtError.h" #define KEY_USEMIDI "USEMIDI" #define KEY_RECORDVELOCITY "RECORDVELOCITY" #define KEY_VELOCITYAMPLIFY "VELOCITYAMPLIFY" #define KEY_SAVEPREFS "SAVEPREFS" #define KEY_MIDIDEVICE "MIDIDEVICE" #define KEY_INSERTEMULATION "insertemulation" #define KEY_SIXTEENBITCOLOR "sixteenbitcolor" static CFStringRef applicationID = CFSTR("com.Titan.MilkyTracker"); pascal OSStatus PreferencesDialog::WindowEventHandler(EventHandlerCallRef myHandler, EventRef event, void* userData) { OSStatus result = eventNotHandledErr; UInt32 eventClass, eventKind; eventClass = GetEventClass(event); eventKind = GetEventKind(event); PreferencesDialog* prefDlg = reinterpret_cast(userData); switch (eventClass) { case kEventClassControl: { ControlRef targetControl = NULL; ControlID targetControlID; GetEventParameter(event, kEventParamDirectObject, typeControlRef, NULL, sizeof(targetControl), NULL, &targetControl); if (targetControl) GetControlID(targetControl, &targetControlID); switch (eventKind) { case kEventControlHit: { switch (targetControlID.id) { // simulate insert key with ctrl+up case 131: prefDlg->setFakeInsertKey(GetControl32BitValue(targetControl)-1); result = noErr; break; // 15 bit color toggle case 132: prefDlg->toggleUse15BitColorDepth(); result = noErr; break; // Enable MIDI device case 129: prefDlg->toggleUseMidiDevice(); result = noErr; break; // Save MIDI preferences case 128: prefDlg->toggleSavePreferences(); result = noErr; break; // Record key velocity case 127: prefDlg->toggleRecordVelocity(); result = noErr; break; // velocity amplify slider case 125: { prefDlg->storeVelocityAmplify(GetControlValue(targetControl)); result = noErr; break; } } break; } } break; } // Handle window close event (= discard) case kEventClassWindow: { switch (eventKind) { case kEventWindowClose: { prefDlg->restoreDataBase(); prefDlg->hide(); result = noErr; break; } } break; } case kEventClassCommand: { switch (eventKind) { case kEventCommandProcess: { HICommand command; GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &command); switch (command.commandID) { case kDiscardPreferences: prefDlg->restoreDataBase(); case kConfirmPreferences: { // These two events are better off when sent to the main window SendEventToWindow(event, prefDlg->mainWindow); break; } default: // Handle MIDI device selection from pop-up menu if (command.commandID >= kMIDIDeviceBaseCommand && command.commandID <= kMIDIDeviceBaseCommand + prefDlg->getNumMidiDevices()) { prefDlg->storeMidiDeviceName(command.commandID - kMIDIDeviceBaseCommand); result = noErr; } } break; } } break; } } return result; } PreferencesDialog::PreferencesDialog(WindowRef windowRef, WindowRef mainWindowRef) : preferencesWindow(windowRef), mainWindow(mainWindowRef), m_dataBase(NULL), m_dataBaseCopy(NULL), midiin(NULL) { EventTypeSpec eventSpec[] = {{kEventClassCommand,kEventCommandProcess}, {kEventClassControl, kEventControlHit}, {kEventClassWindow, kEventWindowClose}}; InstallWindowEventHandler(windowRef, NewEventHandlerUPP(WindowEventHandler), sizeof(eventSpec)/sizeof(EventTypeSpec), (EventTypeSpec*)&eventSpec, (void*)this, NULL); // Create RtMidi instance for querying device information try { midiin = new RtMidiIn(); } catch (RtError &error) { error.printMessage(); midiin = NULL; } initDataBase(); } PreferencesDialog::~PreferencesDialog() { shutdownDataBase(); delete m_dataBase; delete m_dataBaseCopy; delete midiin; } void PreferencesDialog::show() { backupDataBase(); initDialog(); ShowWindow(preferencesWindow); SelectWindow(preferencesWindow); } void PreferencesDialog::hide() { HideWindow(preferencesWindow); } void PreferencesDialog::initDataBase() { m_dataBase = new TrackerSettingsDatabase(); m_dataBase->store(KEY_USEMIDI, 0); m_dataBase->store(KEY_SAVEPREFS, 0); m_dataBase->store(KEY_MIDIDEVICE, ""); m_dataBase->store(KEY_RECORDVELOCITY, 0); m_dataBase->store(KEY_VELOCITYAMPLIFY, 100); m_dataBase->store(KEY_INSERTEMULATION, 0); m_dataBase->store(KEY_SIXTEENBITCOLOR, 0); // try to retrieve the values from the PLIST Boolean success = FALSE; CFStringRef key = CFSTR(KEY_USEMIDI); Boolean b = CFPreferencesGetAppBooleanValue(key, applicationID, &success); if (success) m_dataBase->store(KEY_USEMIDI, b); // Return boolean success = FALSE; key = CFSTR(KEY_SAVEPREFS); b = CFPreferencesGetAppBooleanValue(key, applicationID, &success); if (success) m_dataBase->store(KEY_SAVEPREFS, b); // Return string, little bit more complicated key = CFSTR(KEY_MIDIDEVICE); CFPropertyListRef plistRef = CFPreferencesCopyAppValue(key, applicationID); if (plistRef) { if (CFGetTypeID(plistRef) == CFStringGetTypeID()) { CFStringRef stringRef = static_cast(plistRef); char buffer[512]; CFStringGetCString(stringRef, buffer, 512, kCFStringEncodingASCII); m_dataBase->store(KEY_MIDIDEVICE, buffer); } } // More boolean values following success = FALSE; key = CFSTR(KEY_RECORDVELOCITY); b = CFPreferencesGetAppBooleanValue(key, applicationID, &success); if (success) m_dataBase->store(KEY_RECORDVELOCITY, b); // Integer value success = FALSE; key = CFSTR(KEY_VELOCITYAMPLIFY); int i = CFPreferencesGetAppIntegerValue(key, applicationID, &success); if (success) m_dataBase->store(KEY_VELOCITYAMPLIFY, i); // Integer value success = FALSE; key = CFSTR(KEY_INSERTEMULATION); i = CFPreferencesGetAppIntegerValue(key, applicationID, &success); if (success) m_dataBase->store(KEY_INSERTEMULATION, i); // More boolean values following success = FALSE; key = CFSTR(KEY_SIXTEENBITCOLOR); b = CFPreferencesGetAppBooleanValue(key, applicationID, &success); if (success) m_dataBase->store(KEY_SIXTEENBITCOLOR, b); } void PreferencesDialog::shutdownDataBase() { CFStringRef yes = CFSTR("yes"); CFStringRef no = CFSTR("no"); if (m_dataBase->restore(KEY_SAVEPREFS)->getIntValue()) { CFStringRef key = CFSTR(KEY_USEMIDI); CFPreferencesSetAppValue(key, m_dataBase->restore(KEY_USEMIDI)->getBoolValue() ? yes : no, applicationID); key = CFSTR(KEY_SAVEPREFS); CFPreferencesSetAppValue(key, m_dataBase->restore(KEY_SAVEPREFS)->getBoolValue() ? yes : no, applicationID); key = CFSTR(KEY_MIDIDEVICE); CFStringRef CFStrDevName = CFStringCreateWithCString(NULL, m_dataBase->restore(KEY_MIDIDEVICE)->getStringValue(), kCFStringEncodingASCII); CFPreferencesSetAppValue(key, CFStrDevName, applicationID); CFRelease(CFStrDevName); key = CFSTR(KEY_RECORDVELOCITY); CFPreferencesSetAppValue(key, m_dataBase->restore(KEY_RECORDVELOCITY)->getBoolValue() ? yes : no, applicationID); SInt32 number = m_dataBase->restore(KEY_VELOCITYAMPLIFY)->getIntValue(); CFNumberRef numberRef = CFNumberCreate(NULL, kCFNumberSInt32Type, &number); key = CFSTR(KEY_VELOCITYAMPLIFY); CFPreferencesSetAppValue(key, numberRef, applicationID); CFRelease(numberRef); } else { // remove keys from preferences (or something like that if it's possible) CFStringRef key = CFSTR(KEY_USEMIDI); CFPreferencesSetAppValue(key, NULL, applicationID); key = CFSTR(KEY_SAVEPREFS); CFPreferencesSetAppValue(key, NULL, applicationID); key = CFSTR(KEY_MIDIDEVICE); CFPreferencesSetAppValue(key, NULL, applicationID); key = CFSTR(KEY_RECORDVELOCITY); CFPreferencesSetAppValue(key, NULL, applicationID); key = CFSTR(KEY_VELOCITYAMPLIFY); CFPreferencesSetAppValue(key, NULL, applicationID); } SInt32 number = m_dataBase->restore(KEY_INSERTEMULATION)->getIntValue(); CFNumberRef numberRef = CFNumberCreate(NULL, kCFNumberSInt32Type, &number); CFStringRef key = CFSTR(KEY_INSERTEMULATION); CFPreferencesSetAppValue(key, numberRef, applicationID); CFRelease(numberRef); key = CFSTR(KEY_SIXTEENBITCOLOR); CFPreferencesSetAppValue(key, m_dataBase->restore(KEY_SIXTEENBITCOLOR)->getBoolValue() ? yes : no, applicationID); CFPreferencesAppSynchronize(applicationID); } void PreferencesDialog::backupDataBase() { if (!m_dataBase) return; if (m_dataBaseCopy) delete m_dataBaseCopy; m_dataBaseCopy = new TrackerSettingsDatabase(*m_dataBase); } void PreferencesDialog::restoreDataBase() { if (!m_dataBaseCopy) return; if (m_dataBase) delete m_dataBase; m_dataBase = new TrackerSettingsDatabase(*m_dataBaseCopy); } void PreferencesDialog::updateControls() { if (NULL==m_dataBase) return; ControlHandle checkBoxControl, control; ControlID checkBoxControlID[] = {{kAppSignature, 129}, {kAppSignature, 128}, {kAppSignature, 127}, {kAppSignature, 126}, {kAppSignature, 125}, {kAppSignature, 124}, {kAppSignature, 131}, {kAppSignature, 132}}; GetControlByID(preferencesWindow, &checkBoxControlID[0], &checkBoxControl); bool b = false; if ((midiin && !midiin->getPortCount()) || !midiin) DisableControl(checkBoxControl); else { EnableControl(checkBoxControl); b = m_dataBase->restore(KEY_USEMIDI)->getBoolValue(); SetControl32BitValue(checkBoxControl, b ? TRUE : FALSE); } GetControlByID(preferencesWindow, &checkBoxControlID[1], &checkBoxControl); b = m_dataBase->restore(KEY_SAVEPREFS)->getBoolValue(); SetControl32BitValue(checkBoxControl, b ? TRUE : FALSE); GetControlByID(preferencesWindow, &checkBoxControlID[2], &checkBoxControl); b = false; if ((midiin && !midiin->getPortCount()) || !midiin) { // Disable checkbox DisableControl(checkBoxControl); // disable min. value text for slider GetControlByID(preferencesWindow, &checkBoxControlID[3], &control); DisableControl(control); // disable slider GetControlByID(preferencesWindow, &checkBoxControlID[4], &control); DisableControl(control); // disable max. value text for slider GetControlByID(preferencesWindow, &checkBoxControlID[5], &control); DisableControl(control); } else { EnableControl(checkBoxControl); b = m_dataBase->restore(KEY_RECORDVELOCITY)->getBoolValue(); SetControl32BitValue(checkBoxControl, b ? TRUE : FALSE); // enable min. value text for slider GetControlByID(preferencesWindow, &checkBoxControlID[3], &control); EnableControl(control); // enable slider GetControlByID(preferencesWindow, &checkBoxControlID[4], &control); EnableControl(control); // enable max. value text for slider GetControlByID(preferencesWindow, &checkBoxControlID[5], &control); EnableControl(control); } GetControlByID(preferencesWindow, &checkBoxControlID[6], &checkBoxControl); UInt32 value = m_dataBase->restore(KEY_INSERTEMULATION)->getIntValue(); SetControl32BitValue(checkBoxControl, value+1); GetControlByID(preferencesWindow, &checkBoxControlID[7], &checkBoxControl); b = m_dataBase->restore(KEY_SIXTEENBITCOLOR)->getBoolValue(); SetControl32BitValue(checkBoxControl, b ? TRUE : FALSE); } void PreferencesDialog::initDialog() { ControlHandle popupButtonControl; ControlID popupButtonControlID = {kAppSignature, 130}; MenuRef menu; GetControlByID(preferencesWindow, &popupButtonControlID, &popupButtonControl); GetControlData(popupButtonControl, kControlEntireControl, kControlPopupButtonMenuRefTag, sizeof(menu), &menu, NULL); unsigned int nPorts = midiin ? midiin->getPortCount() : 0; if (nPorts) { UInt32 numItems = CountMenuItems(menu); DeleteMenuItems(menu, 1, numItems); // Check inputs. std::string portName; unsigned int nSelectedDevice = 0; for (unsigned int i = 0; i < nPorts; i++ ) { try { portName = midiin->getPortName(i); } catch (RtError &error) { error.printMessage(); } if (strcmp(portName.c_str(), m_dataBase->restore(KEY_MIDIDEVICE)->getStringValue()) == 0) nSelectedDevice = i; CFStringRef CFStrPortName = CFStringCreateWithCString(NULL, portName.c_str(), kCFStringEncodingASCII); AppendMenuItemTextWithCFString(menu, CFStrPortName, 0, kMIDIDeviceBaseCommand + i, 0); CFRelease(CFStrPortName); } /*AppendMenuItemTextWithCFString(menu, CFSTR("Temp1"), 0, kMIDIDeviceBaseCommand + 1, 0); AppendMenuItemTextWithCFString(menu, CFSTR("Temp2"), 0, kMIDIDeviceBaseCommand + 2, 0); nPorts+=2;*/ SetControlMaximum(popupButtonControl, nPorts); SetControlValue(popupButtonControl, nSelectedDevice + 1); storeMidiDeviceName(nSelectedDevice); EnableControl(popupButtonControl); } else { DisableControl(popupButtonControl); } updateControls(); updateSliderVelocityAmplify(); } UInt32 PreferencesDialog::getComboSelection() { ControlHandle popupButtonControl; ControlID popupButtonControlID = {kAppSignature, 130}; GetControlByID(preferencesWindow, &popupButtonControlID, &popupButtonControl); return (unsigned int)GetControlValue(popupButtonControl) - 1; } void PreferencesDialog::toggleRecordVelocity() { if (m_dataBase) { int i = m_dataBase->restore(KEY_RECORDVELOCITY)->getIntValue(); m_dataBase->restore(KEY_RECORDVELOCITY)->store(!i); updateControls(); } } void PreferencesDialog::toggleUseMidiDevice() { if (m_dataBase) { int i = m_dataBase->restore(KEY_USEMIDI)->getIntValue(); m_dataBase->restore(KEY_USEMIDI)->store(!i); updateControls(); } } void PreferencesDialog::toggleSavePreferences() { if (m_dataBase) { int i = m_dataBase->restore(KEY_SAVEPREFS)->getIntValue(); m_dataBase->restore(KEY_SAVEPREFS)->store(!i); updateControls(); } } void PreferencesDialog::updateSliderVelocityAmplify() { ControlHandle control, controlSlider; ControlID controlID1 = {kAppSignature, 127}; ControlID controlID2 = {kAppSignature, 125}; GetControlByID(preferencesWindow, &controlID1, &control); GetControlByID(preferencesWindow, &controlID2, &controlSlider); char buffer[1024]; sprintf(buffer, "Record velocity (amplify: %i%%)", m_dataBase->restore(KEY_VELOCITYAMPLIFY)->getIntValue()); CFStringRef CFStrVelocityAmplify = CFStringCreateWithCString(NULL, buffer, kCFStringEncodingASCII); SetControlTitleWithCFString(control, CFStrVelocityAmplify); CFRelease(CFStrVelocityAmplify); SetControlValue(controlSlider, m_dataBase->restore(KEY_VELOCITYAMPLIFY)->getIntValue()); } void PreferencesDialog::storeMidiDeviceName(UInt32 deviceID) { if (midiin && m_dataBase && deviceID < getNumMidiDevices()) { try { std::string portName = midiin->getPortName(deviceID); m_dataBase->restore(KEY_MIDIDEVICE)->store(portName.c_str()); } catch (RtError &error) { error.printMessage(); } } } void PreferencesDialog::storeVelocityAmplify(UInt32 amplify) { if (m_dataBase) { m_dataBase->restore(KEY_VELOCITYAMPLIFY)->store(amplify); updateSliderVelocityAmplify(); } } void PreferencesDialog::setFakeInsertKey(UInt32 style) { if (m_dataBase) { m_dataBase->restore(KEY_INSERTEMULATION)->store(style); updateControls(); } } void PreferencesDialog::toggleUse15BitColorDepth() { if (m_dataBase) { int i = m_dataBase->restore(KEY_SIXTEENBITCOLOR)->getIntValue(); m_dataBase->restore(KEY_SIXTEENBITCOLOR)->store(!i); updateControls(); } } UInt32 PreferencesDialog::getMidiDevIDFromString(const char* string) { UInt32 nSelectedDevice = (unsigned)-1; if (!midiin) return nSelectedDevice; std::string portName; for (unsigned int i = 0; i < getNumMidiDevices(); i++ ) { try { portName = midiin->getPortName(i); } catch (RtError &error) { error.printMessage(); } if (strcmp(portName.c_str(), string) == 0) nSelectedDevice = i; } return nSelectedDevice; } UInt32 PreferencesDialog::getNumMidiDevices() { return midiin ? midiin->getPortCount() : 0; } UInt32 PreferencesDialog::getSelectedMidiDeviceID() { if (m_dataBase) { return getMidiDevIDFromString(m_dataBase->restore(KEY_MIDIDEVICE)->getStringValue()); } return (unsigned)-1; } bool PreferencesDialog::getUseMidiDeviceFlag() { if (m_dataBase) { return m_dataBase->restore(KEY_USEMIDI)->getBoolValue(); } return false; } bool PreferencesDialog::getRecordVelocityFlag() { if (m_dataBase) { return m_dataBase->restore(KEY_RECORDVELOCITY)->getBoolValue(); } return false; } UInt32 PreferencesDialog::getVelocityAmplify() { if (m_dataBase) { return m_dataBase->restore(KEY_VELOCITYAMPLIFY)->getIntValue(); } return 100; } UInt32 PreferencesDialog::getFakeInsertKey() { if (m_dataBase) { return m_dataBase->restore(KEY_INSERTEMULATION)->getIntValue(); } return 0; } bool PreferencesDialog::getUse15BitColorDepth() { if (m_dataBase) { return m_dataBase->restore(KEY_SIXTEENBITCOLOR)->getBoolValue(); } return false; } milkytracker-0.90.85+dfsg/src/tracker/carbon/KeyTranslation.cpp0000644000175000017500000001767111252224630023575 0ustar admin2admin2/* * tracker/carbon/KeyTranslation.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * KeyTranslation.cpp * MilkyTracker * * Created by Peter Barth on 25.11.05. * */ #include #include "KeyTranslation.h" #include "iGetKeys.h" #include "Event.h" static Ascii2KeyCodeTable ascKeyCodeTable; static InsertKeyShortcuts insertKeyEmulation = InsertKeyShortcutNone; void InitKeyCodeTranslation() { // keyboard-translator init ------------------------------------ InitAscii2KeyCodeTable(&ascKeyCodeTable); } void QueryKeyModifiers() { if (TestForKeyDown(kVirtualShiftKey)) setKeyModifier(KeyModifierSHIFT); else clearKeyModifier(KeyModifierSHIFT); if (TestForKeyDown(kVirtualOptionKey)) setKeyModifier(KeyModifierALT); else clearKeyModifier(KeyModifierALT); if (TestForKeyDown(kVirtualCommandKey)) setKeyModifier(KeyModifierCTRL); else clearKeyModifier(KeyModifierCTRL); } // filter key codes which have corresponding ASCII values pp_uint16 FilterVK(pp_uint16 keyCode) { if ((keyCode >= 'A' && keyCode <= 'Z') || (keyCode >= '0' && keyCode <= '9')) { return keyCode; } switch (keyCode) { case VK_BACK: case VK_TAB: case VK_CLEAR: case VK_RETURN: case VK_ESCAPE: case VK_SPACE: return keyCode; } return 0; } pp_uint16 KeyCodeToVK(UInt32 keyCode) { switch (keyCode) { // Strange NUM-lock key or whatever this is case 71: return VK_UNDEFINED; // NUMPAD case 81: return VK_DIVIDE; case 75: return VK_MULTIPLY; case 67: return VK_SUBTRACT; case 78: return VK_ADD; case 69: return VK_SEPARATOR; case 76: return VK_DECIMAL; //case 65: // return VK_INSERT; case 82: return VK_NUMPAD0; case 83: return VK_NUMPAD1; case 84: return VK_NUMPAD2; case 85: return VK_NUMPAD3; case 86: return VK_NUMPAD4; case 87: return VK_NUMPAD5; case 88: return VK_NUMPAD6; case 89: return VK_NUMPAD7; case 91: return VK_NUMPAD8; case 92: return VK_NUMPAD9; // WTF case 10: return 0xC0; // key "1" is capslock //case 18: // return VK_CAPITAL; // Tick case 24: return 0xBB; // SS case 27: return 0xBD; // + case 30: return 0xDD; // Ü case 33: return 0xDB; // Return isn't it? case 36: // allow using ctrl+enter as replacement for insert if (insertKeyEmulation == InsertKeyShortcutCtrlEnter && TestForKeyDown(kVirtualControlKey)) return VK_INSERT; return VK_RETURN; // Ä case 39: return 0xDE; // Ö case 41: return 0xBA; // Sharp case 42: return 0xDC; // , case 43: return 188; // . case 44: return 0xBF; // - case 47: return 190; // Tab case 48: return VK_TAB; // Space case 49: return VK_SPACE; // <, > case 50: return 0xE2; case 51: // allow using ctrl+backspace as replacement for insert if (insertKeyEmulation == InsertKeyShortcutCtrlBackspace && TestForKeyDown(kVirtualControlKey)) return VK_INSERT; return VK_BACK; case 53: return VK_ESCAPE; case 96: return VK_F5; case 97: return VK_F6; case 98: return VK_F7; case 99: return VK_F3; case 100: return VK_F8; case 101: return VK_F9; case 109: return VK_F10; case 103: return VK_F11; case 111: return VK_F12; case 114: return VK_INSERT; case 115: return VK_HOME; case 116: return VK_PRIOR; case 117: return VK_DELETE; case 118: return VK_F4; case 119: return VK_END; case 120: return VK_F2; case 121: return VK_NEXT; case 122: return VK_F1; case 123: return VK_LEFT; case 124: return VK_RIGHT; case 125: return VK_DOWN; case 126: // allow using ctrl+up as replacement for insert if (insertKeyEmulation == InsertKeyShortcutCtrlUp && TestForKeyDown(kVirtualControlKey)) return VK_INSERT; return VK_UP; default: if (KeyCodeToAscii(keyCode) >= 'a' && KeyCodeToAscii(keyCode) <= 'z') return FilterVK(KeyCodeToAscii(keyCode)-32); else return FilterVK(KeyCodeToAscii(keyCode)); } return 0; } // the following translation is not complete, only keys which are necessary // are translated pp_uint16 KeyCodeToSC(UInt32 keyCode) { /*printf("%i\n",keyCode); return 0;*/ switch (keyCode) { case 10: return 0x29; // 1 case 18: //return SC_CAPSLOCK; return 0x02; // 2 case 19: return 0x03; // 3 case 20: return 0x04; // 4 case 21: return 0x05; // 5 case 23: return 0x06; // 6 case 22: return 0x07; // 7 case 26: return 0x08; // 8 case 28: return 0x09; // 9 case 25: return 0x0A; // 0 case 29: return 0x0B; // SS case 27: return 0x0c; // Tick case 24: return 0x0d; // Q case 12: return 0x10; case 13: return 0x11; case 14: return 0x12; case 15: return 0x13; case 17: return 0x14; case 16: return 0x15; case 32: return 0x16; case 34: return 0x17; case 31: return 0x18; case 35: return 0x19; case 33: return 0x1a; case 30: return 0x1b; case 0: return 0x1e; case 1: return 0x1f; case 2: return 0x20; case 3: return 0x21; case 5: return 0x22; case 4: return 0x23; case 38: return 0x24; case 40: return 0x25; case 37: return 0x26; case 41: return 0x27; case 39: return 0x28; case 42: return 0x2b; case 50: return 0x56; case 6: return 0x2c; case 7: return 0x2d; case 8: return 0x2e; case 9: return 0x2f; case 11: return 0x30; case 45: return 0x31; case 46: return 0x32; case 43: return 0x33; case 47: return 0x34; case 44: return 0x35; // RETURN case 36: return 0; // BACK case 48: return 0; // SPACE case 49: return 0; // BACKSPACE case 51: return 0; // ESCAPE case 53: return 0; // F5 case 96: return 0; // F6 case 97: return 0; // F7 case 98: return 0; // F3 case 99: return 0; // F9 case 101: return 0; // F10 case 109: return 0; // F11 case 103: return 0; // F8 case 100: return 0; // F12 case 111: return 0; // INSERT case 114: return 0; // HOME case 115: return 0; // PAGE UP case 116: return 0; // DELETE case 117: return 0; // F4 case 118: return 0; // END case 119: return 0; // F2 case 120: return 0; // PAGE DOWN case 121: return 0; // F1 case 122: return 0; // RIGHT case 123: return 0; // LEFT case 124: return 0; // DOWN case 125: return 0; // UP case 126: return 0; // Strange NUM-lock key or whatever this is case 71: return 0; // NUMPAD case 81: return 0; case 75: return 0; case 67: return 0; case 78: return 0; case 76: return 0; case 65: return 0; case 69: return 0; case 82: return 0; case 83: return 0; case 84: return 0; case 85: return 0; case 86: return 0; case 87: return 0; case 88: return 0; case 89: return 0; case 91: return 0; case 92: return 0; default: printf("Pressed unknown key: %u\n",static_cast(keyCode)); return 0; } return 0; } void enableInsertKeyEmulation(InsertKeyShortcuts shortcut) { insertKeyEmulation = shortcut; } milkytracker-0.90.85+dfsg/src/tracker/carbon/iGetKeys.h0000644000175000017500000001367010766710716022030 0ustar admin2admin2/* File: iGetKeys.h Description: Internationally Savy GetKeys test type routines for your entertainment and enjoyment. Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under AppleÍs reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Change History (most recent first): Mon, Jan 15, 2001 -- created */ #ifndef __IGETKEYS__ #define __IGETKEYS__ #ifdef __APPLE_CC__ #include #else #include //#include #endif typedef struct { short kchrID; Str255 KCHRname; short transtable[256]; } Ascii2KeyCodeTable; enum { /* modifier keys */ kVirtualCapsLockKey = 0x039, kVirtualShiftKey = 0x038, kVirtualControlKey = 0x03B, kVirtualOptionKey = 0x03A, kVirtualCommandKey = 0x037, /* editing/utility keys */ kVirtualHelpKey = 0x072, kVirtualDeleteKey = 0x033, kVirtualTabKey = 0x030, kVirtualEnterKey = 0x04C, kVirtualReturnKey = 0x024, kVirtualEscapeKey = 0x035, kVirtualForwardDeleteKey = 0x075, /* navigation keys */ kVirtualHomeKey = 0x073, kVirtualEndKey = 0x002, kVirtualPageUpKey = 0x074, kVirtualPageDownKey = 0x079, kVirtualLeftArrowKey = 0x07B, kVirtualRightArrowKey = 0x07C, kVirtualUpArrowKey = 0x07E, kVirtualDownArrowKey = 0x07D }; enum { kPublicBetaVirtualLeftArrowKey = 0x03B, /* Public Beta Only */ kPublicBetaVirtualRightArrowKey = 0x03C, /* Public Beta Only */ kPublicBetaVirtualUpArrowKey = 0x03E, /* Public Beta Only */ kPublicBetaVirtualDownArrowKey = 0x03D, /* Public Beta Only */ kPublicBetaVirtualCapsLockKey = 0x03D, /* Public Beta Only */ kPublicBetaVirtualHelpKey = 0x03D /* Public Beta Only */ }; /* InitAscii2KeyCodeTable initializes the ascii to key code look up table using the currently active KCHR resource. This routine calls GetResource so it cannot be called at interrupt time.*/ OSStatus InitAscii2KeyCodeTable(Ascii2KeyCodeTable *ttable); /* ValidateAscii2KeyCodeTable verifies that the ascii to key code lookup table is synchronized with the current KCHR resource. If it is not synchronized, then the table is re-built. This routine calls GetResource so it cannot be called at interrupt time.*/ OSStatus ValidateAscii2KeyCodeTable(Ascii2KeyCodeTable *ttable,Boolean *wasChanged); StringPtr GetKchrName(Ascii2KeyCodeTable *ttable); /* AsciiToKeyCode looks up the ascii character in the key code look up table and returns the virtual key code for that letter. If there is no virtual key code for that letter, then the value -1 will be returned. */ short AsciiToKeyCode(Ascii2KeyCodeTable *ttable, short asciiCode); char KeyCodeToAscii(short virtualKeyCode); /* TestForKeyDown returns true if the key with the given virtual key code is currently being held down. */ Boolean TestForKeyDown(short virtualKeyCode); /* TestForMultipleKeysDown returns true if all of the keys listed in its parameters are held down. nkeys is the number of virtual key codes provided in the variable length parameter list that follows. */ Boolean TestForMultipleKeysDown(short nkeys, ...); Boolean TestForArrayOfKeysDown(short nkeys, short *keyvec); /* TestForAsciiKeyDown returns true if the key with the given ascii code is currently being held down. */ Boolean TestForAsciiKeyDown(Ascii2KeyCodeTable *ttable, short asciiCode); /* TestForAsciiKeyDown returns true if all of the keys with the key with the given ascii codes are currently being held down. nkeys is the number of ascii codes provided in the variable length parameter list that follows. */ Boolean TestForMultipleAsciiKeysDown(Ascii2KeyCodeTable *ttable, short nkeys, ...); Boolean TestForArrayOfAsciiKeysDown(Ascii2KeyCodeTable *ttable, short nkeys, unsigned char* asciiVec); #endif milkytracker-0.90.85+dfsg/src/tracker/carbon/PreferencesDialog.h0000644000175000017500000000420711150223367023646 0ustar admin2admin2/* * tracker/carbon/PreferencesDialog.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PreferencesDialog.h * MilkyTracker * * Created by Peter Barth on 07.04.06. * */ #ifndef __PREFERENCESDIALOG_H__ #define __PREFERENCESDIALOG_H__ #include class TrackerSettingsDatabase; class RtMidiIn; class PreferencesDialog { private: WindowRef preferencesWindow, mainWindow; static pascal OSStatus WindowEventHandler(EventHandlerCallRef myHandler, EventRef event, void* userData); TrackerSettingsDatabase* m_dataBase; TrackerSettingsDatabase* m_dataBaseCopy; RtMidiIn* midiin; void initDataBase(); void shutdownDataBase(); void backupDataBase(); void restoreDataBase(); void updateControls(); void initDialog(); UInt32 getComboSelection(); void toggleRecordVelocity(); void toggleUseMidiDevice(); void toggleSavePreferences(); void updateSliderVelocityAmplify(); void storeMidiDeviceName(UInt32 deviceID); void storeVelocityAmplify(UInt32 amplify); UInt32 getMidiDevIDFromString(const char* string); UInt32 getNumMidiDevices(); void setFakeInsertKey(UInt32 style); void toggleUse15BitColorDepth(); public: PreferencesDialog(WindowRef windowRef, WindowRef mainWindowRef); ~PreferencesDialog(); void show(); void hide(); UInt32 getSelectedMidiDeviceID(); bool getUseMidiDeviceFlag(); bool getRecordVelocityFlag(); UInt32 getVelocityAmplify(); UInt32 getFakeInsertKey(); bool getUse15BitColorDepth(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/carbon/iGetKeys.cpp0000644000175000017500000001771711163667445022373 0ustar admin2admin2/* File: iGetKeys.c Description: Internationally Savy GetKeys test type routines for your entertainment and enjoyment. Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under AppleÍs reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Change History (most recent first): Mon, Jan 15, 2001 -- created */ #include "iGetKeys.h" #ifdef __APPLE_CC__ #include #else #include //#include //#include //#include #include #endif enum { kTableCountOffset = 256+2, kFirstTableOffset = 256+4, kTableSize = 128 }; OSStatus InitAscii2KeyCodeTable(Ascii2KeyCodeTable *ttable) { unsigned char *theCurrentKCHR, *ithKeyTable; short count, i, j, resID; Handle theKCHRRsrc; ResType rType; /* set up our table to all minus ones */ for (i=0;i<256; i++) ttable->transtable[i] = -1; /* find the current kchr resource ID */ ttable->kchrID = (short) GetScriptVariable(smCurrentScript, smScriptKeys); /* get the current KCHR resource */ theKCHRRsrc = GetResource('KCHR', ttable->kchrID); if (theKCHRRsrc == NULL) return resNotFound; GetResInfo(theKCHRRsrc,&resID,&rType,ttable->KCHRname); /* dereference the resource */ theCurrentKCHR = (unsigned char *) (*theKCHRRsrc); /* get the count from the resource */ count = * (short *) (theCurrentKCHR + kTableCountOffset); /* build inverse table by merging all key tables */ for (i=0; itranstable[ ithKeyTable[j] ] == -1) ttable->transtable[ ithKeyTable[j] ] = j; } } /* all done */ return noErr; } OSStatus ValidateAscii2KeyCodeTable(Ascii2KeyCodeTable *ttable,Boolean *wasChanged) { short theID; theID = (short) GetScriptVariable(smCurrentScript, smScriptKeys); if (theID != ttable->kchrID) { *wasChanged=true; return InitAscii2KeyCodeTable(ttable); } else { *wasChanged=false; return noErr; } } StringPtr GetKchrName(Ascii2KeyCodeTable *ttable) { return ttable->KCHRname; } short AsciiToKeyCode(Ascii2KeyCodeTable *ttable, short asciiCode) { if (asciiCode >= 0 && asciiCode <= 255) return ttable->transtable[asciiCode]; else return false; } char KeyCodeToAscii(short virtualKeyCode) { static unsigned long state = 0; long keyTrans; char charCode; Ptr kchr; kchr = (Ptr) GetScriptVariable(smCurrentScript, smKCHRCache); keyTrans = KeyTranslate(kchr, virtualKeyCode, &state); charCode = keyTrans; if (!charCode) charCode = (keyTrans>>16); return charCode; } Boolean TestForKeyDown(short virtualKeyCode) { KeyMap theKeys; unsigned char *keybytes; if (virtualKeyCode >= 0 && virtualKeyCode <= 127) { GetKeys(theKeys); keybytes = (unsigned char *) theKeys; return ((keybytes[virtualKeyCode>>3] & (1 << (virtualKeyCode&7))) != 0); } else return false; } Boolean TestForMultipleKeysDown(short nkeys, ...) { KeyMap theKeys; va_list args; long i, virtualKeyCode; Boolean product; unsigned char *keybytes; va_start(args, nkeys); if (nkeys == 0) { product = false; } else { product = true; GetKeys(theKeys); keybytes = (unsigned char *) theKeys; for (i=0; i 127 || (keybytes[virtualKeyCode>>3] & (1 << (virtualKeyCode&7))) == 0) { product = false; break; } } } va_end(args); return product; } Boolean TestForArrayOfKeysDown(short nkeys, short *keyvec) { KeyMap theKeys; long i, virtualKeyCode; Boolean product; unsigned char *keybytes; if (nkeys == 0) { product = false; } else { product = true; GetKeys(theKeys); keybytes = (unsigned char *) theKeys; for (i=0; i 127 || (keybytes[virtualKeyCode>>3] & (1 << (virtualKeyCode&7))) == 0) { product = false; break; } } } return product; } Boolean TestForAsciiKeyDown(Ascii2KeyCodeTable *ttable, short asciiCode) { short virtualKeyCode; if (asciiCode < 0 || asciiCode > 255 || (virtualKeyCode = ttable->transtable[asciiCode]) == -1) return false; else return TestForKeyDown(virtualKeyCode); } Boolean TestForMultipleAsciiKeysDown(Ascii2KeyCodeTable *ttable, short nkeys, ...) { KeyMap theKeys; va_list args; long i, virtualKeyCode, asciiCode; Boolean product; unsigned char *keybytes; va_start(args, nkeys); if (nkeys == 0) { product = false; } else { product = true; GetKeys(theKeys); keybytes = (unsigned char *) theKeys; for (i=0; i 255) { product = false; break; } else { virtualKeyCode = ttable->transtable[asciiCode]; if (virtualKeyCode == -1 || (keybytes[virtualKeyCode>>3] & (1 << (virtualKeyCode&7))) == 0) { product = false; break; } } } } va_end(args); return product; } Boolean TestForArrayOfAsciiKeysDown(Ascii2KeyCodeTable *ttable, short nkeys, unsigned char* asciiVec) { KeyMap theKeys; long i, virtualKeyCode, asciiCode; Boolean product; unsigned char *keybytes; if (nkeys == 0) { product = false; } else { product = true; GetKeys(theKeys); keybytes = (unsigned char *) theKeys; for (i=0; i 255) { product = false; break; } else { virtualKeyCode = ttable->transtable[asciiCode]; if (virtualKeyCode == -1 || (keybytes[virtualKeyCode>>3] & (1 << (virtualKeyCode&7))) == 0) { product = false; break; } } } } return product; } milkytracker-0.90.85+dfsg/src/tracker/carbon/Carbon_main.cpp0000644000175000017500000007343211252224630023033 0ustar admin2admin2/* * tracker/carbon/Carbon_main.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ // ------------------------ carbon ------------------------ #include #include "Carbon_Definitions.h" #include "KeyTranslation.h" #include "PreferencesDialog.h" #include "PPMutex.h" #include "PPMessageBox.h" // ----------------------- POSIX -------------------------- #include #include // ----------------------- tracker ------------------------ #include "PPUI.h" #include "DisplayDevice_CARBON.h" #include "Screen.h" #include "Tracker.h" #include "PPSystem.h" #include "MidiReceiver_pthread.h" // globals ------------------------------------- WindowRef mainWindow, waitWindow, preferencesWindow; MenuRef mainMenu; static PreferencesDialog* preferencesDialog = NULL; static PPMutex* globalMutex = NULL; static int localMouseX,localMouseY; static PPScreen* myTrackerScreen = NULL; static Tracker* myTracker = NULL; static PPDisplayDevice* myDisplayDevice = NULL; static MidiReceiver* myMidiReceiver = NULL; // basic OS event globals ---------------------- static pp_uint32 lmyTime; static PPPoint llastClickPosition = PPPoint(0,0); static pp_uint16 lClickCount = 0; static pp_uint32 rmyTime; static PPPoint rlastClickPosition = PPPoint(0,0); static pp_uint16 rClickCount = 0; static bool lMouseDown = false; static pp_uint32 lButtonDownStartTime; static bool rMouseDown = false; static pp_uint32 rButtonDownStartTime; static pp_uint32 timerTicker = 0; //static pp_int32 keyTimerTicker = 0; static pp_uint32 lastModifierKeyState = 0; static PPPoint p; static bool sixteenBitColorDepth = false; pp_uint32 PPGetTickCount() { UnsignedWide microTickCount; Microseconds (µTickCount); pp_int64 time = (((pp_int64)microTickCount.hi) << 32) + microTickCount.lo; return time/1000; } static void crashHandler(int signum) { // Save backup.xm static char buffer[1024]; // Should be enough :p static char message[1024]; strncpy(buffer, getenv("HOME"), 1010); strcat(buffer, "/BACKUP00.XM"); struct stat statBuf; int num = 1; while (stat(buffer, &statBuf) == 0 && num <= 100) snprintf(buffer, sizeof(buffer), "%s/BACKUP%02i.XM", getenv("HOME"), num++); if(num != 100) { myTracker->saveModule(buffer); fputs("\n", stderr); fprintf(stderr, "\nA backup has been saved to %s\n\n", buffer); } if(signum == 15) { snprintf(message, sizeof(message), "TERM signal received.\n"); fputs(message, stderr); } else { snprintf(message, sizeof(message), "MilkyTracker crashed with signal %i\n" "Please submit a bug report stating exactly what you were doing at " "the time of the crash, as well as the above signal number. " "Also note if it is possible to reproduce this crash.\n", signum); fprintf(stderr, "\n"); fputs(message, stderr); PPMessageBox infoBox(myTrackerScreen, "Error", message); infoBox.runModal(); } exit(0); } static void installCrashHandler() { // Initialise crash handler struct sigaction act; struct sigaction oldAct; memset(&act, 0, sizeof(act)); act.sa_handler = crashHandler; act.sa_flags = SA_RESETHAND; sigaction(SIGTERM | SIGILL | SIGABRT | SIGFPE | SIGSEGV, &act, &oldAct); sigaction(SIGILL, &act, &oldAct); sigaction(SIGABRT, &act, &oldAct); sigaction(SIGFPE, &act, &oldAct); sigaction(SIGSEGV, &act, &oldAct); } // Some forwards pascal OSStatus MainWindowEventHandler(EventHandlerCallRef myHandler,EventRef event,void *userData); void RaiseEventSynchronized(PPEvent* event) { if (globalMutex->tryLock()) { if (myTrackerScreen) myTrackerScreen->raiseEvent(event); globalMutex->unlock(); } } void TimerEventHandler(__EventLoopTimer*, void*) { if (!myTrackerScreen) return; PPEvent myEvent(eTimer); RaiseEventSynchronized(&myEvent); /*if ((keyTimerTicker > 0) && !(keyTimerTicker % 3)) { if (TestForKeyDown(kVirtualCapsLockKey)) { pp_uint16 chr[2]; chr[0] = VK_CAPITAL; chr[1] = SC_CAPSLOCK; PPEvent event(eKeyDown, &chr, sizeof(chr)); myTrackerScreen->raiseEvent(&event); } } keyTimerTicker++;*/ timerTicker++; if (lMouseDown && (timerTicker - lButtonDownStartTime) > 25 && !(timerTicker%3)) { PPEvent myEvent(eLMouseRepeat, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } if (rMouseDown && (timerTicker - rButtonDownStartTime) > 25) { PPEvent myEvent(eRMouseRepeat, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } } void StopMidiRecording() { if (myMidiReceiver) { myMidiReceiver->stopRecording(); } } class MidiEventHandler : public MidiReceiver::MidiEventHandler { public: virtual void keyDown(int note, int volume) { globalMutex->lock(); myTracker->sendNoteDown(note, volume); globalMutex->unlock(); } virtual void keyUp(int note) { globalMutex->lock(); myTracker->sendNoteUp(note); globalMutex->unlock(); } }; MidiEventHandler midiEventHandler; void StartMidiRecording(unsigned int devID, bool recordMidiVelocity, unsigned int velocityAmplify) { if (devID == (unsigned)-1) return; StopMidiRecording(); myMidiReceiver = new MidiReceiver(midiEventHandler); myMidiReceiver->setRecordVelocity(recordMidiVelocity); myMidiReceiver->setVelocityAmplify(velocityAmplify); if (!myMidiReceiver->startRecording(devID)) { // Deal with error PPMessageBox infoBox(myTrackerScreen, "Error","Could not enable MIDI recording."); infoBox.runModal(); } } void InitMidi() { if (!preferencesDialog) return; if (preferencesDialog->getUseMidiDeviceFlag()) StartMidiRecording(preferencesDialog->getSelectedMidiDeviceID(), preferencesDialog->getRecordVelocityFlag(), preferencesDialog->getVelocityAmplify()); else StopMidiRecording(); } void ApplyPreferences() { InitMidi(); enableInsertKeyEmulation((InsertKeyShortcuts)preferencesDialog->getFakeInsertKey()); if (preferencesDialog->getUse15BitColorDepth() != sixteenBitColorDepth) { PPMessageBox infoBox(myTrackerScreen, "Please restart", "MilkyTracker needs to be restarted to apply new color depth"); infoBox.runModal(); } } void initTracker() { myTracker = new Tracker(); PPSize windowSize = myTracker->getWindowSizeFromDatabase(); pp_int32 scaleFactor = myTracker->getScreenScaleFactorFromDatabase(); bool fullScreen = myTracker->getFullScreenFlagFromDatabase(); #ifdef __LOWRES__ windowSize.width = 320; windowSize.height = 240; #endif sixteenBitColorDepth = preferencesDialog->getUse15BitColorDepth(); myDisplayDevice = new PPDisplayDevice(mainWindow, waitWindow, windowSize.width, windowSize.height, scaleFactor, sixteenBitColorDepth ? 16 : 32); myDisplayDevice->init(); if (fullScreen) myDisplayDevice->goFullScreen(fullScreen); myTrackerScreen = new PPScreen(myDisplayDevice, myTracker); myTracker->setScreen(myTrackerScreen); // Startup procedure myTracker->startUp(); ApplyPreferences(); // install crash handler //#ifndef __DEBUG__ // installCrashHandler(); //#endif } static Boolean gApprovedDrag = false; /* set to true if the drag is approved */ static Boolean gInIconBox = false; /* set to true if the drag is approved */ static void dropFileHandler(const FSSpec& spec) { FSRef fileToOpen; FSpMakeFSRef(&spec, &fileToOpen); // gib ihm char buffer[PATH_MAX+1]; FSRefMakePath (&fileToOpen, (UInt8*)buffer, sizeof(buffer)-1); PPSystemString finalFile(buffer); PPSystemString* strPtr = &finalFile; PPEvent event(eFileDragDropped, &strPtr, sizeof(PPSystemString*)); RaiseEventSynchronized(&event); } static pascal OSErr myDragReceiveHandler(WindowPtr theWindow, void *refcon, DragReference theDragRef) { ItemReference theItem; HFSFlavor targetFile; //PromiseHFSFlavor targetPromise; //FSSpec targetSpec; Size theSize; OSErr err = eventNotHandledErr; if (!gApprovedDrag) goto bail; // get the first item reference if ((err = GetDragItemReferenceNumber(theDragRef, 1, &theItem)) != noErr) goto bail; // try to get a HFSFlavor theSize = sizeof(HFSFlavor); err = GetFlavorData(theDragRef, theItem, flavorTypeHFS, &targetFile, &theSize, 0); if (err == noErr) { dropFileHandler(targetFile.fileSpec); return noErr; } else if (err != badDragFlavorErr) goto bail; bail: return err; } static pascal OSErr approveDragReference(DragReference theDragRef, Boolean *approved) { OSErr err; UInt16 itemCount; DragAttributes dragAttrs; FlavorFlags flavorFlags; ItemReference theItem; // we cannot drag to our own window if ((err = GetDragAttributes(theDragRef, &dragAttrs)) != noErr) goto bail; if ((dragAttrs & kDragInsideSenderWindow) != 0) { err = userCanceledErr; goto bail; } // we only accept drags containing one item if ((err = CountDragItems(theDragRef, &itemCount)) != noErr) goto bail; if (itemCount != 1) { err = paramErr; goto bail; } // gather information about the drag & a reference to item one. if ((err = GetDragItemReferenceNumber(theDragRef, 1, &theItem)) != noErr) goto bail; // check for flavorTypeHFS err = GetFlavorFlags(theDragRef, theItem, flavorTypeHFS, &flavorFlags); if (err == noErr) { *approved = true; return noErr; } else if (err != badDragFlavorErr) goto bail; // check for flavorTypePromiseHFS //err = GetFlavorFlags(theDragRef, theItem, flavorTypePromiseHFS, &flavorFlags); //if (err == noErr) { // *approved = true; // return noErr; //} else if (err != badDragFlavorErr) // goto bail; // none of our flavors were found *approved = false; return noErr; bail: // an error occured, clean up. set result to false. *approved = false; return err; } static pascal OSErr myDragTrackingHandler(DragTrackingMessage message, WindowPtr theWindow, void *refCon, DragReference theDragRef) { // we're drawing into the image well if we hilite... switch (message) { case kDragTrackingEnterWindow: { gApprovedDrag = false; if (theWindow == FrontWindow()) { if (approveDragReference(theDragRef, &gApprovedDrag) != noErr) break; if ( ! gApprovedDrag ) break; myTrackerScreen->setShowDragHilite(true); gInIconBox = true; } } break; /*case kDragTrackingInWindow: if (gApprovedDrag) { Point mouse; SetPortWindowPort(mainWindow); GetMouse(&mouse); GlobalToLocal(&mouse); if (PtInRect(mouse, &gIconBox)) { if ( ! gInIconBox) { // if we're entering the box, hilite... SetPortWindowPort(mainWindow); gInIconBox = (ShowDragHiliteBox(theDragRef, &gIconBox) == noErr); } } else if (gInIconBox) { // if we're exiting the box, unhilite... HideDragHilite(theDragRef); gInIconBox = false; } } break;*/ case kDragTrackingLeaveWindow: if (gApprovedDrag && gInIconBox) { //HideDragHilite(theDragRef); myTrackerScreen->setShowDragHilite(false); } gApprovedDrag = gInIconBox = false; break; } return noErr; // there's no point in confusing Drag Manager or its caller } static Boolean gotRequiredParams(const AppleEvent *theEvent) { DescType returnedType; Size actualSize; OSErr err = AEGetAttributePtr( theEvent, keyMissedKeywordAttr, typeWildCard, &returnedType, NULL, 0, &actualSize); return err == errAEDescNotFound; } static OSStatus doOpenAppleEvent(const AppleEvent *theEvent) { OSStatus error; FSSpec myFSS; AEDescList theList; AEKeyword aeKeyword = keyDirectObject; long itemCount, i; DescType actualType; Size actualSize; // get event description error = AEGetParamDesc(theEvent, keyDirectObject, typeAEList, &theList); if( error != noErr ) return error; // make sure event description is correct if (!gotRequiredParams(theEvent)) return error; // count items to open error = AECountItems(&theList, &itemCount); if( error != noErr ) return error; // open all items for (i = 1; i <= itemCount; i++) { error = AEGetNthPtr(&theList, i, typeFSS, &aeKeyword, &actualType, (Ptr) &myFSS, sizeof( FSSpec ), &actualSize); if (error == noErr) dropFileHandler(myFSS); } // event was handled successfully AEDisposeDesc(&theList); return noErr; } static pascal OSErr coreEventHandler(const AppleEvent *theEvent, AppleEvent *reply, long refCon) { DescType actualType; Size actualSize; DescType eventID; OSErr error; error = AEGetAttributePtr( ( AppleEvent* ) theEvent, keyEventIDAttr, typeType, &actualType, (Ptr) &eventID, sizeof( eventID ), &actualSize); if (error) return error; switch( eventID ) { case kAEOpenApplication: if (gotRequiredParams(theEvent)) doOpenAppleEvent(theEvent); break; case kAEOpenDocuments: doOpenAppleEvent(theEvent); break; } return noErr; } static void initAppleEvents() { AEEventHandlerUPP AEHandlerUPP; AEHandlerUPP = NewAEEventHandlerUPP(coreEventHandler); AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, AEHandlerUPP, 0, false); AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, AEHandlerUPP, 0, false); } int main(int argc, char* argv[]) { IBNibRef nibRef; EventLoopRef loopRef; OSStatus err; globalMutex = new PPMutex(); EventTypeSpec mainSpec[] = { {kEventClassCommand,kEventCommandProcess}, {kEventClassKeyboard,kEventRawKeyDown}, {kEventClassKeyboard,kEventRawKeyRepeat}, {kEventClassKeyboard,kEventRawKeyUp}, {kEventClassKeyboard,kEventRawKeyModifiersChanged}, {kEventClassMouse,kEventMouseDown}, {kEventClassMouse,kEventMouseUp}, {kEventClassMouse,kEventMouseMoved}, {kEventClassMouse,kEventMouseExited}, {kEventClassMouse,kEventMouseDragged}, {kEventClassMouse,kEventMouseWheelMoved}, {kEventClassTextInput,kEventUnicodeForKeyEvent}, {kEventClassWindow,kEventWindowDrawContent}, {kEventClassWindow,kEventWindowBoundsChanged}, {kEventClassWindow,kEventWindowClose} }; // Create a Nib reference passing the name of the nib file (without the .nib extension) // CreateNibReference only searches into the application bundle. err = CreateNibReference(CFSTR("main"), &nibRef); require_noerr( err, CantGetNibRef ); // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar // object. This name is set in InterfaceBuilder when the nib is created. err = CreateMenuFromNib (nibRef, CFSTR("MenuBar"), &mainMenu); require_noerr( err, CantSetMenuBar ); err = SetRootMenu (mainMenu); require_noerr( err, CantSetMenuBar ); // Then create a window. "MainWindow" is the name of the window object. This name is set in // InterfaceBuilder when the nib is created. err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &mainWindow); require_noerr( err, CantCreateWindow ); // Create wait progress bar window from nib err = CreateWindowFromNib(nibRef, CFSTR("WaitWindow"), &waitWindow); require_noerr( err, CantCreateWindow ); // Create preferences window from nib err = CreateWindowFromNib(nibRef, CFSTR("PreferencesWindow"), &preferencesWindow); require_noerr( err, CantCreateWindow ); // We don't need the nib reference anymore. DisposeNibReference(nibRef); // Install handler for dropping files on application icon initAppleEvents(); // Install drag receive handler err = InstallReceiveHandler(myDragReceiveHandler, mainWindow, NULL); // Install drag tracking handler err = InstallTrackingHandler(myDragTrackingHandler, mainWindow, NULL); // Install our own handler for main window InstallWindowEventHandler(mainWindow,NewEventHandlerUPP(MainWindowEventHandler), sizeof(mainSpec)/sizeof(EventTypeSpec),(EventTypeSpec*)&mainSpec,(void*)mainWindow,NULL); // Create preferences window preferencesDialog = new PreferencesDialog(preferencesWindow, mainWindow); InitKeyCodeTranslation(); // tracker-init initTracker(); loopRef = GetMainEventLoop(); InstallEventLoopTimer(loopRef, 0.0f, 20.0f/1000.0f, TimerEventHandler, NULL, NULL); // Call the event loop RunApplicationEventLoop(); globalMutex->lock(); delete myMidiReceiver; globalMutex->unlock(); delete myTracker; delete myTrackerScreen; delete myDisplayDevice; delete preferencesDialog; CantCreateWindow: CantSetMenuBar: CantGetNibRef: delete globalMutex; return err; } void ProcessKeyEvent(EventRef event, EEventDescriptor targetEvent) { UInt32 keyCode; GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(keyCode), NULL, &keyCode); UniChar* text = NULL; UInt32 size; /* request the size of the Unicode text */ if (noErr != GetEventParameter(event, kEventParamKeyUnicodes, typeUnicodeText, NULL, 0, &size, NULL)) goto bail; if (size % sizeof(UniChar) != 0) goto bail; text = new UniChar[size]; /* fetch the Unicode chars */ if (noErr != GetEventParameter(event, kEventParamKeyUnicodes, typeUnicodeText, NULL, size, NULL, text)) goto bail; { pp_uint16 chr[3] = {KeyCodeToVK(keyCode), KeyCodeToSC(keyCode), *text}; PPEvent event(targetEvent, &chr, sizeof(chr)); RaiseEventSynchronized(&event); } bail: if (text) delete[] text; } pascal OSStatus MainWindowEventHandler(EventHandlerCallRef myHandler,EventRef event,void *userData) { OSStatus result = eventNotHandledErr; if (!myTrackerScreen) return result; Rect windowRect; UInt32 eventClass, eventKind; eventClass = GetEventClass(event); eventKind = GetEventKind(event); // ----------------------------------------- if (lClickCount > 4) { lClickCount = 0; } switch (eventClass) { case kEventClassCommand: { switch (eventKind) { case kEventCommandProcess: { HICommand command; GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &command); switch (command.commandID) { case 'quit': { // Shouldn't really handle this event, handle AppQuit instead PPEvent event(eAppQuit); RaiseEventSynchronized(&event); bool res = myTracker->shutDown(); // shutdown was aborted if (!res) result = noErr; break; } case kFullscreenCommand: { PPEvent myEvent(eFullScreen); RaiseEventSynchronized(&myEvent); result = noErr; break; } case kInvokePreferences: { if (preferencesDialog) preferencesDialog->show(); result = noErr; break; } case kConfirmPreferences: { if (preferencesDialog) preferencesDialog->hide(); ApplyPreferences(); SelectWindow(mainWindow); result = noErr; break; } case kDiscardPreferences: { if (preferencesDialog) preferencesDialog->hide(); SelectWindow(mainWindow); result = noErr; break; } } break; } } break; } case kEventClassWindow: { switch (eventKind) { case kEventWindowBoundsChanged: case kEventWindowDrawContent: { myTrackerScreen->update(); break; } case kEventWindowClose: { // This is a single window app, so quit when the window is closed. // This could be simplified if we handled AppQuit instead of hooking the // quit command above. PPEvent event(eAppQuit); RaiseEventSynchronized(&event); bool res = myTracker->shutDown(); if (res) { EventRef quitEvent; CreateEvent(NULL, kEventClassApplication, kEventAppQuit, 0, kEventAttributeNone, &quitEvent); PostEventToQueue(GetMainEventQueue(), quitEvent, kEventPriorityStandard); } result = noErr; break; } } break; } case kEventClassTextInput: { switch (eventKind) { case kEventUnicodeForKeyEvent: { UniChar* text = NULL; UInt32 size; /* request the size of the Unicode text */ if (noErr != GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText, NULL, 0, &size, NULL)) goto bail; if (size % sizeof(UniChar) != 0) goto bail; text = new UniChar[size]; /* fetch the Unicode chars */ if (noErr != GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText, NULL, size, NULL, text)) goto bail; { pp_uint16 chr = *text; switch (chr) { // delete case 127: chr = VK_BACK; break; // backspace case 8: chr = VK_BACK; break; // escape (is 27 already?) case 27: chr = VK_ESCAPE; break; // return (is 13 already?) case 13: chr = VK_RETURN; break; } if (chr >= 32) { PPEvent event2(eKeyChar, &chr, sizeof(chr)); RaiseEventSynchronized(&event2); } } bail: if (text) delete[] text; } } break; } case kEventClassMouse: { Point mousePoint; GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(mousePoint), NULL, &mousePoint); SetPortWindowPort(mainWindow); short mouseButton; GetEventParameter(event, kEventParamMouseButton, typeMouseButton, NULL, sizeof(mouseButton), NULL, &mouseButton); UInt32 keyModifiers; GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(keyModifiers), NULL, &keyModifiers); GetPortBounds(GetWindowPort(mainWindow),&windowRect); //double xScale = (double)myDisplayDevice->getSize().width / (windowRect.right - windowRect.left); //double yScale = (double)myDisplayDevice->getSize().height / (windowRect.bottom - windowRect.top); GlobalToLocal(&mousePoint); //localMouseX = (int)(mousePoint.h*xScale); //localMouseY = (int)(mousePoint.v*yScale); localMouseX = mousePoint.h; localMouseY = mousePoint.v; switch (eventKind) { case kEventMouseWheelMoved: { long wheelDelta; GetEventParameter(event, kEventParamMouseWheelDelta, typeLongInteger, NULL, sizeof(wheelDelta), NULL, &wheelDelta); TMouseWheelEventParams mouseWheelParams; mouseWheelParams.pos.x = localMouseX; mouseWheelParams.pos.y = localMouseY; mouseWheelParams.delta = wheelDelta; PPEvent myEvent(eMouseWheelMoved, &mouseWheelParams, sizeof(mouseWheelParams)); RaiseEventSynchronized(&myEvent); break; } case kEventMouseDown: { if (mouseButton > 2 || !mouseButton) break; if (mouseButton == 1 && (keyModifiers & MacKeyModifierCtrl)) mouseButton++; // ----------------------------- p.x = localMouseX; p.y = localMouseY; if (mouseButton == 1) { //if (rMouseDown) // break; PPEvent myEvent(eLMouseDown, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); lMouseDown = true; lButtonDownStartTime = timerTicker; if (!lClickCount) { lmyTime = ::PPGetTickCount(); llastClickPosition.x = localMouseX; llastClickPosition.y = localMouseY; } else if (lClickCount == 2) { pp_uint32 deltat = ::PPGetTickCount() - lmyTime; if (deltat > 500) { lClickCount = 0; lmyTime = ::PPGetTickCount(); llastClickPosition.x = localMouseX; llastClickPosition.y = localMouseY; } } lClickCount++; } else if (mouseButton == 2) { //if (lMouseDown) // break; PPEvent myEvent(eRMouseDown, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); rMouseDown = true; rButtonDownStartTime = timerTicker; if (!rClickCount) { rmyTime = ::PPGetTickCount(); rlastClickPosition.x = localMouseX; rlastClickPosition.y = localMouseY; } else if (rClickCount == 2) { pp_uint32 deltat = ::PPGetTickCount() - rmyTime; if (deltat > 500) { rClickCount = 0; rmyTime = ::PPGetTickCount(); rlastClickPosition.x = localMouseX; rlastClickPosition.y = localMouseY; } } rClickCount++; } break; } case kEventMouseUp: { if (mouseButton > 2 || !mouseButton) break; if (mouseButton == 1 && (keyModifiers & MacKeyModifierCtrl)) mouseButton++; if (!myTrackerScreen) break; // ----------------------------- if (mouseButton == 1) { //if (!lMouseDown) // break; lClickCount++; if (lClickCount == 4) { pp_uint32 deltat = ::PPGetTickCount() - lmyTime; if (deltat < 500) { p.x = localMouseX; p.y = localMouseY; if (abs(p.x - llastClickPosition.x) < 4 && abs(p.y - llastClickPosition.y) < 4) { PPEvent myEvent(eLMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } } lClickCount = 0; } p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eLMouseUp, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); lMouseDown = false; } else if (mouseButton == 2) { //if (!rMouseDown) // break; rClickCount++; if (rClickCount == 4) { pp_uint32 deltat = ::PPGetTickCount() - rmyTime; if (deltat < 500) { p.x = localMouseX; p.y = localMouseY; if (abs(p.x - rlastClickPosition.x) < 4 && abs(p.y - rlastClickPosition.y) < 4) { PPEvent myEvent(eRMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } } rClickCount = 0; } p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eRMouseUp, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); rMouseDown = false; } } case kEventMouseMoved: { p.x = localMouseX; p.y = localMouseY; PPEvent myEvent(eMouseMoved, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); break; } case kEventMouseExited: { p.x = -1; p.y = -1; PPEvent myEvent(eMouseMoved, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); break; }; case kEventMouseDragged: { if (mouseButton > 2 || !mouseButton) break; p.x = localMouseX; p.y = localMouseY; if (mouseButton == 1 && lMouseDown) { PPEvent myEvent(eLMouseDrag, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } else if (rMouseDown) { PPEvent myEvent(eRMouseDrag, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } break; } } break; } case kEventClassKeyboard: { switch (eventKind) { case kEventRawKeyDown: case kEventRawKeyRepeat: { ProcessKeyEvent(event, eKeyDown); break; } case kEventRawKeyUp: { ProcessKeyEvent(event, eKeyUp); break; } case kEventRawKeyModifiersChanged: { UInt32 keyModifiers; pp_uint16 chr[3]; GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(keyModifiers), NULL, &keyModifiers); if ((keyModifiers & MacKeyModifierShift) != (lastModifierKeyState & MacKeyModifierShift)) { chr[0] = VK_SHIFT; chr[1] = 0; chr[2] = 0; if (keyModifiers & MacKeyModifierShift) { ::setKeyModifier(KeyModifierSHIFT); PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSynchronized(&event); } else { PPEvent event(eKeyUp, &chr, sizeof(chr)); RaiseEventSynchronized(&event); ::clearKeyModifier(KeyModifierSHIFT); } } /*if ((keyModifiers & eCapsLockKey) != (lastModifierKeyState & eCapsLockKey)) { chr[0] = VK_CAPITAL; chr[1] = SC_CAPSLOCK; //::setKeyModifier(KeyModifierCTRL); //keyTimerTicker = -15; PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSynchronized(&event); PPEvent event2(eKeyUp, &chr, sizeof(chr)); RaiseEventSynchronized(&event2); }*/ if ((keyModifiers & MacKeyModifierAlt) != (lastModifierKeyState & MacKeyModifierAlt)) { chr[0] = VK_ALT; chr[1] = 0; chr[2] = 0; if (keyModifiers & MacKeyModifierAlt) { ::setKeyModifier(KeyModifierALT); PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSynchronized(&event); } else { PPEvent event(eKeyUp, &chr, sizeof(chr)); RaiseEventSynchronized(&event); ::clearKeyModifier(KeyModifierALT); } } if ((keyModifiers & MacKeyModifierCommand) != (lastModifierKeyState & MacKeyModifierCommand)) { chr[0] = VK_CONTROL; chr[1] = 0; chr[2] = 0; if (keyModifiers & MacKeyModifierCommand) { ::setKeyModifier(KeyModifierCTRL); PPEvent event(eKeyDown, &chr, sizeof(chr)); RaiseEventSynchronized(&event); } else { PPEvent event(eKeyUp, &chr, sizeof(chr)); RaiseEventSynchronized(&event); ::clearKeyModifier(KeyModifierCTRL); } } lastModifierKeyState = keyModifiers; } } break; } } return result; } milkytracker-0.90.85+dfsg/src/tracker/carbon/KeyTranslation.h0000644000175000017500000000312611150223367023233 0ustar admin2admin2/* * tracker/carbon/KeyTranslation.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * KeyTranslation.h * MilkyTracker * * Created by Peter Barth on 25.11.05. * */ #ifndef KEYTRANSLATION__H #define KEYTRANSLATION__H #include "BasicTypes.h" // some constants enum MacKeyModifiers { MacKeyModifierCommand = 256, MacKeyModifierShift = 512, MacKeyModifierCapsLock = 1024, MacKeyModifierAlt = 2048, MacKeyModifierCtrl = 4096 }; // translate mac style key codes to their PC counterparts void InitKeyCodeTranslation(); pp_uint16 KeyCodeToVK(UInt32 keyCode); pp_uint16 KeyCodeToSC(UInt32 keyCode); void QueryKeyModifiers(); // provide means to simulate missing insert key on mac notebook keyboard enum InsertKeyShortcuts { InsertKeyShortcutNone, InsertKeyShortcutCtrlUp, InsertKeyShortcutCtrlEnter, InsertKeyShortcutCtrlBackspace, }; void enableInsertKeyEmulation(InsertKeyShortcuts shortcut); #endif milkytracker-0.90.85+dfsg/src/tracker/Zapper.h0000644000175000017500000000220311150223367020254 0ustar admin2admin2/* * tracker/Zapper.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Zapper.h * MilkyTracker * * Created by Peter Barth on 26.12.07. * */ #ifndef __ZAPPER_H__ #define __ZAPPER_H__ class Zapper { private: class Tracker& tracker; public: Zapper(Tracker& tracker) : tracker(tracker) { } Zapper(const Zapper& src) : tracker(src.tracker) { } void zapAll(); void zapSong(); void zapPattern(); void zapInstruments(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/ScopesControl.cpp0000644000175000017500000004242311316446453022162 0ustar admin2admin2/* * tracker/ScopesControl.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ScopesControl.cpp * MilkyTracker * * Created by Peter Barth on 28.10.05. * */ #include "ScopesControl.h" #include "Screen.h" #include "GraphicsAbstract.h" #include "Font.h" #include "Button.h" #include "PlayerController.h" #include "Tools.h" #include "PPUIConfig.h" #include "TrackerConfig.h" #undef PANNINGINDICATOR pp_int32 ScopesControl::WRAPCHANNELS() { if (parentScreen->getWidth() < 800) { #ifdef __LOWRES__ return 16; #else return 18; #endif } if (parentScreen->getWidth() < 1024) { return 20; } if (parentScreen->getWidth() < 1280) { return 22; } return 32; } ScopesControl::ScopesControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border/*= true*/) : PPControl(id, parentScreen, eventListener, location, size), border(border), borderColor(&ourOwnBorderColor), playerController(NULL), numChannels(0), enabled(true), appearance(AppearanceTypeNormal), currentClickType(ClickTypeMute) { // default color color.set(0, 0, 0); ourOwnBorderColor.set(192, 192, 192); visibleWidth = size.width - 2; visibleHeight = size.height - 4; font = PPFont::getFont(PPFont::FONT_SYSTEM); smallFont = PPFont::getFont(PPFont::FONT_TINY); lastNumChannels = 0; memset(onOffState, 0, sizeof(onOffState)); memset(muteChannels, 0 ,sizeof(muteChannels)); memset(lastMuteChannels, 0 ,sizeof(lastMuteChannels)); memset(recChannels, 0 ,sizeof(recChannels)); memset(lastRecChannels, 0 ,sizeof(lastRecChannels)); lMouseDownInChannel = rMouseDownInChannel = -1; backgroundButton = new PPButton(0, parentScreen, NULL, PPPoint(location.x, location.y), PPSize(size.width, size.height), false, false); backgroundButton->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorListBoxBackground)); backgroundButton->setInvertShading(true); } ScopesControl::~ScopesControl() { delete backgroundButton; } static inline pp_int32 myMod(pp_int32 a, pp_int32 b) { pp_int32 res = a%b; if (res<0) res+=b; return res; } class ScopePainter : public PlayerController::SampleDataFetcher { private: PPGraphicsAbstract* g; const pp_uint32 count; const pp_uint32 channelHeight; const PPColor& scopebColor; const PPColor& scopedColor; pp_int32 locx, locy; const ScopesControl::AppearanceTypes appearance; bool flipped; pp_int32 counter, flipCounter, flipCounterStep; pp_int32 count2; pp_int32 sr, sg, sb; pp_int32 addr, addg, addb; pp_int32 lasty, lastx; public: ScopePainter(PPGraphicsAbstract* g, pp_uint32 count, pp_uint32 channelHeight, const PPColor& scopebColor, const PPColor& scopedColor, pp_int32 locx, pp_int32 locy, ScopesControl::AppearanceTypes appearance) : g(g), count(count), channelHeight(channelHeight), scopebColor(scopebColor), scopedColor(scopedColor), locx(locx), locy(locy), appearance(appearance), flipped(false), counter(0), flipCounter(0), flipCounterStep(1) { count2 = count - 3; if (count2 < 2) count2 = 2; flipCounter = 0; sr = scopedColor.r * 65536; sg = scopedColor.g * 65536; sb = scopedColor.b * 65536; addr = (scopebColor.r - scopedColor.r) * 65536 / (count2/2); addg = (scopebColor.g - scopedColor.g) * 65536 / (count2/2); addb = (scopebColor.b - scopedColor.b) * 65536 / (count2/2); lasty = locy; lastx = -1; } virtual void fetchSampleData(mp_sint32 sample) { const pp_int32 y = (((-sample >> 10)*(signed)channelHeight)>>6) + locy; g->setSafeColor(sr>>16, sg>>16, sb>>16); sr+=addr; sg+=addg; sb+=addb; if (flipCounter >= (count2>>1)-1 && !flipped) { flipped = true; addr=-addr; addg=-addg; addb=-addb; } flipCounter+=flipCounterStep; switch (appearance) { case ScopesControl::AppearanceTypeNormal: g->setPixel(locx, y); g->setColor(0,0,0); g->setPixel(locx, y+1); break; case ScopesControl::AppearanceTypeSolid: if (y < locy) { g->drawVLine(y, locy, locx); g->setColor(0,0,0); g->setPixel(locx, locy); } else if (y > locy) { g->drawVLine(locy, y, locx); g->setColor(0,0,0); g->setPixel(locx, y); } else { g->setPixel(locx, y); g->setColor(0,0,0); g->setPixel(locx, y+1); } break; case ScopesControl::AppearanceTypeLines: if (!(counter & 1) || (counter == (signed)count-1)) { if (lastx == -1) { g->setPixel(locx, y); g->setColor(0,0,0); g->setPixel(locx, y+1); } else { g->drawAntialiasedLine(lastx,lasty,locx,y); } lasty = y; lastx = locx; } counter++; } locx++; } pp_int32 getLocx() const { return locx; } }; void ScopesControl::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; PPColor bColor = *borderColor, dColor = *borderColor; // adjust dark color dColor.scaleFixed(32768); // adjust bright color bColor.scaleFixed(87163); pp_int32 xOffset = 2; pp_int32 yOffset = 2; backgroundButton->paint(g); g->setRect(location.x, location.y, location.x + size.width+1, location.y + size.height+1); if (border) { drawThickBorder(g, *borderColor); } g->setRect(location.x + 2, location.y + 2, location.x + size.width - 2, location.y + size.height - 2); //g->setColor(0,0,0); //g->fill(); if (!playerController || numChannels < 2) return; PPColor foregroundColor = PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText); pp_int32 channelWidth = visibleWidth / numChannels; pp_int32 channelHeight = visibleHeight; if (numChannels > WRAPCHANNELS()) { channelWidth = visibleWidth / (numChannels>>1); channelHeight>>=1; pp_int32 i; pp_int32 r = visibleWidth % (numChannels>>1); for (i = 0; i < numChannels >> 1; i++) channelWidthTable[i] = channelWidth; for (i = 0; i < r; i++) { pp_int32 j = (i*(numChannels>>1))/r; channelWidthTable[j]++; } } else { pp_int32 i; pp_int32 r = visibleWidth % numChannels; for (i = 0; i < numChannels; i++) channelWidthTable[i] = channelWidth; for (i = 0; i < r; i++) { pp_int32 j = (i*numChannels)/r; channelWidthTable[j]++; } } pp_int32 cn = 0; pp_int32 y = 0; pp_int32 x = 0; // calculate shading for scopes PPColor scopebColor = TrackerConfig::colorScopes, scopedColor = TrackerConfig::colorScopes; // adjust dark color scopedColor.scaleFixed(32768); PPColor tempCol = PPUIConfig::getInstance()->getColor(PPUIConfig::ColorListBoxBackground); tempCol.scaleFixed(32768); scopedColor+=tempCol; scopedColor.scaleFixed(49192); for (pp_int32 c = 0; c < numChannels; c++) { char buffer[8]; PPTools::convertToDec(buffer, c + 1, PPTools::getDecNumDigits(c+1)); mp_sint32 locy = location.y + yOffset + y*channelHeight + channelHeight / 2; mp_sint32 locx = location.x + xOffset + x; mp_sint32 cWidth = channelWidthTable[cn]; pp_int32 count = cWidth; // correct last channel cn++; if (numChannels > WRAPCHANNELS() && cn >= (numChannels>>1)) { cn = 0; y++; count = visibleWidth - (xOffset + x); } else if (c == numChannels-1) { count = visibleWidth - (xOffset + x); } g->setColor(TrackerConfig::colorScopes); pp_int32 sx = locx + 3; pp_int32 sy = locy - channelHeight / 2 + 3; pp_int32 sy2 = locy + channelHeight / 2 - smallFont->getCharHeight() - 1; if (!muteChannels[c]) { ScopePainter scopePainter(g, count, channelHeight, scopebColor, scopedColor, locx, locy, appearance); if (enabled) playerController->grabSampleData(c, count, 160, scopePainter); else { for (pp_int32 i = 0; i < count; i++) scopePainter.fetchSampleData(0); } #ifdef PANNINGINDICATOR pp_int32 panx = locx; pp_int32 they = sy; g->drawHLine(panx + 3, panx + count2, they + channelHeight - 8); g->drawHLine(panx + 3, panx + count2, they + channelHeight - 5); g->drawVLine(they + channelHeight - 8, they + channelHeight - 5 + 1, panx + 2); g->drawVLine(they + channelHeight - 8, they + channelHeight - 5 + 1, panx + count2); PPColor col = g->getColor(); g->setColor(TrackerConfig::colorHighLight); pp_int32 thex = panx + 3 + (channel.pan*(count2 - 5)) / 255; g->drawVLine(they + channelHeight - 7, they + channelHeight - 6 + 1, thex); g->drawVLine(they + channelHeight - 7, they + channelHeight - 6 + 1, thex+1); g->setColor(col); #endif locx = scopePainter.getLocx(); } else { PPFont* font = this->font; PPColor col = g->getColor(); const char* muteStr = "MUTE"; if ((signed)font->getStrWidth(muteStr) >= cWidth-2) font = smallFont; if ((signed)font->getStrWidth(muteStr) >= cWidth-2) muteStr = ""; pp_int32 x = locx + (cWidth / 2) - font->getStrWidth(muteStr) / 2; pp_int32 y = locy - font->getCharHeight() / 2; g->setColor(TrackerConfig::colorHighLight_1); g->setFont(font); g->drawString(muteStr, x, y); g->setColor(col); } if (recChannels[c]) { g->setFont(smallFont); g->setColor(0, 0, 0); g->drawString("\xf0", sx, sy2+1); g->setColor(TrackerConfig::colorRecordModeButtonText); g->drawString("\xf0", sx-1, sy2); } g->setFont((channelWidth < 40 || numChannels > WRAPCHANNELS()) ? smallFont : font); g->setColor(0, 0, 0); g->drawString(buffer, sx+1, sy+1); g->setColor(foregroundColor); g->drawString(buffer, sx, sy); if (cn == 0) x = -cWidth; x+=cWidth; } g->setRect(location.x + 1, location.y + 1, location.x + size.width - 1, location.y + size.height - 1); x = location.x + xOffset + channelWidthTable[0]; for (cn = 0; cn < (visibleWidth / channelWidth) - 1; cn++) { g->setColor(bColor); g->drawVLine(location.y + yOffset-1, location.y + yOffset + visibleHeight, x-1); g->setColor(*borderColor); g->drawVLine(location.y + yOffset-1, location.y + yOffset + visibleHeight, x); g->setColor(dColor); g->drawVLine(location.y + yOffset, location.y + yOffset + visibleHeight, x+1); x+=channelWidthTable[cn+1]; } if (numChannels > WRAPCHANNELS()) { x = location.x + xOffset; for (cn = 0; cn < (visibleWidth / channelWidth); cn++) { g->setColor(bColor); g->drawHLine(x+1, x + channelWidthTable[cn]-1, location.y + yOffset + (visibleHeight>>1)-1); g->setColor(*borderColor); g->drawHLine(x, x + channelWidthTable[cn]-1, location.y + yOffset + (visibleHeight>>1)); g->setColor(dColor); g->drawHLine(x+1, x + channelWidthTable[cn]-1, location.y + yOffset + (visibleHeight>>1)+1); x+=channelWidthTable[cn]; } } } void ScopesControl::attachSource(PlayerController* playerController) { this->playerController = playerController; // should force redraw lastNumChannels = 0; } bool ScopesControl::needsUpdate() { if (playerController == NULL || (numChannels == 0 && lastNumChannels == 0)) return false; if (numChannels != lastNumChannels) { lastNumChannels = numChannels; return true; } bool res = false; for (pp_int32 c = 0; c < numChannels; c++) { if (muteChannels[c] != lastMuteChannels[c]) { lastMuteChannels[c] = muteChannels[c]; res = true; } if (recChannels[c] != lastRecChannels[c]) { lastRecChannels[c] = recChannels[c]; res = true; } bool bPlay = enabled ? playerController->hasSampleData(c) : false; if (bPlay != onOffState[c] || bPlay) res = true; onOffState[c] = bPlay; } return res; } void ScopesControl::handleMute(pp_int32 channel) { muteChannels[channel] = !muteChannels[channel]; PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels), ChangeValueMuting); eventListener->handleEvent(reinterpret_cast(this), &e); } void ScopesControl::handleSolo(pp_int32 channel) { // unmute? if (isSoloChannel(channel)) { for (pp_uint32 i = 0; i < sizeof(muteChannels)/sizeof(pp_uint8); i++) muteChannels[i] = false; } else { for (pp_uint32 i = 0; i < sizeof(muteChannels)/sizeof(pp_uint8); i++) muteChannels[i] = true; muteChannels[channel] = false; } PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels), ChangeValueMuting); eventListener->handleEvent(reinterpret_cast(this), &e); } void ScopesControl::handleRec(pp_int32 channel) { recChannels[channel] = !recChannels[channel]; PPEvent e(eValueChanged, &recChannels, sizeof(recChannels), ChangeValueRecording); eventListener->handleEvent(reinterpret_cast(this), &e); } void ScopesControl::handleSingleRec(pp_int32 channel) { // unmute? if (isSingleRecChannel(channel)) { for (pp_uint32 i = 0; i < sizeof(recChannels)/sizeof(pp_uint8); i++) recChannels[i] = true; } else { for (pp_uint32 i = 0; i < sizeof(recChannels)/sizeof(pp_uint8); i++) recChannels[i] = false; recChannels[channel] = true; } PPEvent e(eValueChanged, &recChannels, sizeof(recChannels), ChangeValueRecording); eventListener->handleEvent(reinterpret_cast(this), &e); } void ScopesControl::handleUnmuteAll() { for (pp_uint32 i = 0; i < sizeof(muteChannels)/sizeof(pp_uint8); i++) muteChannels[i] = false; PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels), ChangeValueMuting); eventListener->handleEvent(reinterpret_cast(this), &e); } pp_int32 ScopesControl::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; switch (event->getID()) { case eLMouseDown: didSoloChannel = false; lMouseDownInChannel = pointToChannel(*(PPPoint*)event->getDataPtr()); break; case eRMouseDown: didSoloChannel = false; rMouseDownInChannel = pointToChannel(*(PPPoint*)event->getDataPtr()); break; case eLMouseUp: { pp_int32 channel = pointToChannel(*(PPPoint*)event->getDataPtr()); // left-right combined mouse click if (channel != -1 && lMouseDownInChannel == channel && rMouseDownInChannel == channel) { handleSolo(channel); didSoloChannel = true; } // normal click else if (channel != -1 && lMouseDownInChannel == channel && rMouseDownInChannel == -1) { switch (currentClickType) { case ClickTypeMute: handleMute(channel); break; case ClickTypeSolo: handleSolo(channel); break; case ClickTypeRec: handleRec(channel); break; case ClickTypeSingleRec: handleSingleRec(channel); break; default: ASSERT(false); } } lMouseDownInChannel = -1; break; } case eRMouseUp: { pp_int32 channel = pointToChannel(*(PPPoint*)event->getDataPtr()); if (channel != -1 && channel == rMouseDownInChannel && lMouseDownInChannel == -1 && !didSoloChannel) { if ((::getKeyModifier() & KeyModifierSHIFT)) { handleSingleRec(channel); } else handleRec(channel); } rMouseDownInChannel = -1; break; } } return 0; } bool ScopesControl::isSoloChannel(pp_int32 c) const { pp_int32 i = 0; for (pp_int32 j = 0; j < numChannels; j++) if (muteChannels[j]) i++; if (!muteChannels[c] && i == numChannels-1) return true; return false; } bool ScopesControl::isSingleRecChannel(pp_int32 c) const { pp_int32 i = 0; for (pp_int32 j = 0; j < numChannels; j++) if (!recChannels[j]) i++; if (recChannels[c] && i == numChannels-1) return true; return false; } pp_int32 ScopesControl::pointToChannel(const PPPoint& pt) { if (numChannels < 2) return -1; pp_int32 xOffset = 2; pp_int32 yOffset = 2; pp_int32 channelWidth = visibleWidth / numChannels; pp_int32 channelHeight = visibleHeight; if (numChannels > WRAPCHANNELS()) { channelWidth = visibleWidth / (numChannels>>1); channelHeight>>=1; pp_int32 i; pp_int32 r = visibleWidth % (numChannels>>1); for (i = 0; i < numChannels >> 1; i++) channelWidthTable[i] = channelWidth; for (i = 0; i < r; i++) { pp_int32 j = (i*(numChannels>>1))/r; channelWidthTable[j]++; } } else { pp_int32 i; pp_int32 r = visibleWidth % numChannels; for (i = 0; i < numChannels; i++) channelWidthTable[i] = channelWidth; for (i = 0; i < r; i++) { pp_int32 j = (i*numChannels)/r; channelWidthTable[j]++; } } // detect hit pp_int32 cn = 0; pp_int32 y = 0; pp_int32 x = 0; for (pp_int32 c = 0; c < numChannels; c++) { mp_sint32 locy = location.y + yOffset + y*channelHeight; mp_sint32 locx = location.x + xOffset + x; mp_sint32 cWidth = channelWidthTable[cn]; pp_int32 count = cWidth; // correct last channel cn++; if (numChannels > WRAPCHANNELS() && cn >= (numChannels>>1)) { cn = 0; y++; count+=visibleWidth - (xOffset + x); } else if (c == numChannels-1) { count+=visibleWidth - (xOffset + x); } if (pt.x > locx+1 && pt.y+1 > locy && pt.x < locx + count - 1 && pt.y < locy + channelHeight - 1) return c; if (cn == 0) x = -cWidth; x+=cWidth; } return -1; } milkytracker-0.90.85+dfsg/src/tracker/TabHeaderControl.h0000644000175000017500000000670111150223367022202 0ustar admin2admin2/* * tracker/TabHeaderControl.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TabHeaderControl.h * MilkyTracker * * Created by Peter Barth on 09.12.07. * */ #ifndef __TABHEADERCONTROL_H__ #define __TABHEADERCONTROL_H__ #include "BasicTypes.h" #include "Control.h" #include "Button.h" #include "SimpleVector.h" class TabHeaderControl : public PPControl, public EventListenerInterface { public: struct TabHeader { PPString text; pp_uint32 ID; TabHeader() : text(""), ID(0) { } TabHeader(const PPString& text, pp_uint32 ID) : text(text), ID(ID) { } ~TabHeader() { } }; private: const PPColor* color; PPButton* backgroundButton; PPButton* leftButton; PPButton* rightButton; pp_int32 minSize; pp_int32 maxSize; PPSimpleVector tabButtons; PPSimpleVector tabHeaders; // Control caught by mouse button press (left & right) PPControl* caughtControl; pp_int32 startIndex; pp_int32 hitIndex; pp_int32 oldHitIndex; void paintControls(PPGraphicsAbstract* g) { for (pp_int32 i = 0; i < tabButtons.size(); i++) { PPControl* ctrl = tabButtons.get(i); if (ctrl->isVisible()) ctrl->paint(g); } } void handleTabClick(const PPPoint& p); void setNumTabs(pp_uint32 numTabs); void adjustLabels(); void shiftTabs(pp_int32 offset = 1, bool repaint = true); void assureTabVisible(pp_uint32 index); public: TabHeaderControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size); virtual ~TabHeaderControl(); virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); void setColor(const PPColor& color) { this->color = &color; backgroundButton->setColor(color); } const PPColor& getColor() const { return *color; } virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); virtual bool isVisible() const { return PPControl::isVisible() && getNumTabs() > 1; } // from EventListenerInterface pp_int32 handleEvent(PPObject* sender, PPEvent* event); void setTabMinSize(pp_int32 minSize) { this->minSize = minSize; } pp_int32 getTabMinSize() const { return minSize; } void setTabMaxSize(pp_int32 maxSize) { this->maxSize = maxSize; } pp_int32 getTabMaxSize() const { return maxSize; } void clear() { tabHeaders.clear(); tabButtons.clear(); startIndex = hitIndex = 0; } pp_uint32 getNumTabs() const { return (unsigned)tabHeaders.size(); } void addTab(const TabHeader& tabHeader); const TabHeader* getTab(pp_int32 index) const; bool removeTab(pp_int32 index); void setTabHeaderText(pp_int32 index, const PPString& text); void setSelectedTab(pp_uint32 index); pp_int32 getSelectedTabIndex() const { return hitIndex; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionSamples.cpp0000644000175000017500000013264111212277305022311 0ustar admin2admin2/* * tracker/SectionSamples.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionSamples.cpp * MilkyTracker * * Created by Peter Barth on 15.04.05. * */ #include "SectionSamples.h" #include "PPUI.h" #include "TransparentContainer.h" #include "Tracker.h" #include "TrackerConfig.h" #include "ModuleEditor.h" #include "SamplePlayer.h" #include "PatternEditorControl.h" #include "SampleEditorControl.h" #include "SectionInstruments.h" #include "DialogBase.h" // OS Interface #include "PPOpenPanel.h" #include "PPSavePanel.h" #include "ControlIDs.h" enum ControlIDs { STATICTEXT_DISPLAY = 0xF000, STATICTEXT_LENGTH, STATICTEXT_REPSTART, STATICTEXT_REPLEN, BUTTON_SHOWRANGE, BUTTON_FLIPNUMBERFORMAT, // Only low-res CONTAINER_SHOWCONTEXTMENU, BUTTON_SHOWCONTEXTMENU }; // Class which responds to message box clicks class DialogResponderSamples : public DialogResponder { private: SectionSamples& section; public: DialogResponderSamples(SectionSamples& section) : section(section) { } virtual pp_int32 ActionOkay(PPObject* sender) { switch (reinterpret_cast(sender)->getID()) { case MESSAGEBOX_CLEARSAMPLE: section.getSampleEditorControl()->getSampleEditor()->clearSample(); break; case MESSAGEBOX_CROPSAMPLE: section.getSampleEditorControl()->getSampleEditor()->cropSample(); break; case MESSAGEBOX_MINIMIZESAMPLE: section.getSampleEditorControl()->getSampleEditor()->minimizeSample(); break; case MESSAGEBOX_CONVERTSAMPLE: section.getSampleEditorControl()->getSampleEditor()->convertSampleResolution(true); section.getSampleEditorControl()->showAll(); break; } return 0; } virtual pp_int32 ActionNo(PPObject* sender) { switch (reinterpret_cast(sender)->getID()) { case MESSAGEBOX_CONVERTSAMPLE: section.getSampleEditorControl()->getSampleEditor()->convertSampleResolution(false); section.getSampleEditorControl()->showAll(); break; } return 0; } }; SectionSamples::SectionSamples(Tracker& theTracker) : SectionAbstract(theTracker, NULL, new DialogResponderSamples(*this)), containerEntire(NULL), visible(false), sampleEditorControl(NULL), currentSamplePlayNote(ModuleEditor::MAX_NOTE/2), showRangeOffsets(false), offsetFormat(0) { } SectionSamples::~SectionSamples() { } pp_int32 SectionSamples::handleEvent(PPObject* sender, PPEvent* event) { PPScreen* screen = tracker.screen; ModuleEditor* moduleEditor = tracker.moduleEditor; SampleEditor* sampleEditor = sampleEditorControl->getSampleEditor(); if (event->getID() == eUpdateChanged) { tracker.updateWindowTitle(); } else if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { // sample editor // load sample case BUTTON_SAMPLE_LOAD: { if (event->getID() != eCommand) break; tracker.loadType(FileTypes::FileTypeSongAllSamples); break; } // save sample case BUTTON_SAMPLE_SAVE: { if (event->getID() != eCommand) break; if (isEmptySample()) tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Sample is empty.", Tracker::MessageBox_OK); else tracker.saveType(tracker.getCurrentSelectedSampleSaveType()); break; } case BUTTON_SAMPLE_PLAY_UP: if (currentSamplePlayNote < 95) currentSamplePlayNote++; refresh(); break; case BUTTON_SAMPLE_PLAY_DOWN: if (currentSamplePlayNote > 0) currentSamplePlayNote--; refresh(); break; case BUTTON_SAMPLE_PLAY_WAVE: { SamplePlayer samplePlayer(*moduleEditor, *tracker.playerController); samplePlayer.playCurrentSample(currentSamplePlayNote); break; } case BUTTON_SAMPLE_PLAY_RANGE: { SamplePlayer samplePlayer(*moduleEditor, *tracker.playerController); samplePlayer.playCurrentSampleSelectionRange(currentSamplePlayNote); break; } case BUTTON_SAMPLE_PLAY_DISPLAY: { SamplePlayer samplePlayer(*moduleEditor, *tracker.playerController); samplePlayer.playSample(*sampleEditor->getSample(), currentSamplePlayNote, sampleEditorControl->getCurrentPosition(), sampleEditorControl->getCurrentPosition() + sampleEditorControl->getCurrentDisplayRange()); break; } case BUTTON_SAMPLE_PLAY_STOP: { SamplePlayer samplePlayer(*moduleEditor, *tracker.playerController); samplePlayer.stopSamplePlayback(); break; } case BUTTON_SAMPLE_RANGE_SHOW: if (event->getID() != eCommand) break; sampleEditorControl->showRange(); refresh(); break; case BUTTON_SAMPLE_RANGE_ALL: if (event->getID() != eCommand) break; sampleEditorControl->rangeAll(true); break; case BUTTON_SAMPLE_RANGE_CLEAR: sampleEditorControl->rangeClear(true); break; case BUTTON_SAMPLE_RANGE_ZOOMOUT: if (event->getID() != eCommand) break; sampleEditorControl->zoomOut(); refresh(); break; case BUTTON_SAMPLE_RANGE_SHOWALL: if (event->getID() != eCommand) break; sampleEditorControl->showAll(); refresh(); break; case BUTTON_SAMPLE_APPLY_LASTFILTER: if (event->getID() != eCommand) break; sampleEditor->tool_applyLastFilter(); break; case BUTTON_SAMPLE_UNDO: if (event->getID() != eCommand) break; sampleEditor->undo(); break; case BUTTON_SAMPLE_REDO: if (event->getID() != eCommand) break; sampleEditor->redo(); break; case BUTTON_SAMPLE_EDIT_CUT: if (event->getID() != eCommand) break; sampleEditor->cut(); break; case BUTTON_SAMPLE_EDIT_COPY: if (event->getID() != eCommand) break; sampleEditor->copy(); break; case BUTTON_SAMPLE_EDIT_PASTE: if (event->getID() != eCommand) break; sampleEditor->paste(); break; case BUTTON_SAMPLE_EDIT_REPSTARTPLUS: if (showRangeOffsets) { sampleEditorControl->increaseRangeStart(); refresh(); } else sampleEditor->increaseRepeatStart(); break; case BUTTON_SAMPLE_EDIT_REPSTARTMINUS: if (showRangeOffsets) { sampleEditorControl->decreaseRangeStart(); refresh(); } else sampleEditor->decreaseRepeatStart(); break; case BUTTON_SAMPLE_EDIT_REPLENPLUS: if (showRangeOffsets) { sampleEditorControl->increaseRangeEnd(); refresh(); } else sampleEditor->increaseRepeatLength(); break; case BUTTON_SAMPLE_EDIT_REPLENMINUS: if (showRangeOffsets) { sampleEditorControl->decreaseRangeEnd(); refresh(); } else sampleEditor->decreaseRepeatLength(); break; case BUTTON_SAMPLE_EDIT_CLEAR: { if (event->getID() != eCommand) break; handleClearSample(); break; } case BUTTON_SAMPLE_EDIT_MINIMIZE: { if (event->getID() != eCommand) break; handleMinimizeSample(); break; } case BUTTON_SAMPLE_EDIT_CROP: { if (event->getID() != eCommand) break; handleCropSample(); break; } case BUTTON_SAMPLE_EDIT_VOL: { if (event->getID() != eCommand) break; getSampleEditorControl()->invokeSetSampleVolume(); break; } case BUTTON_SAMPLE_EDIT_DRAW: { if (event->getID() != eCommand) break; getSampleEditorControl()->setDrawMode(!getSampleEditorControl()->getDrawMode()); PPButton* button = reinterpret_cast(sender); button->setPressed(getSampleEditorControl()->getDrawMode()); screen->paintControl(button); break; } case BUTTON_SAMPLE_ZOOM_PLUS: getSampleEditorControl()->scrollWheelZoomIn(); break; case BUTTON_SAMPLE_ZOOM_MINUS: getSampleEditorControl()->scrollWheelZoomOut(); break; case STATICTEXT_REPSTART: case STATICTEXT_REPLEN: case STATICTEXT_SAMPLE_REPSTART: case STATICTEXT_SAMPLE_REPLENGTH: case BUTTON_SHOWRANGE: if (event->getID() != eCommand) break; showRangeOffsets = !showRangeOffsets; refresh(); break; case BUTTON_FLIPNUMBERFORMAT: if (event->getID() != eCommand) break; toggleOffsetFormat(); refresh(); break; case BUTTON_SHOWCONTEXTMENU: if (event->getID() != eCommand) break; getSampleEditorControl()->invokeContextMenu(reinterpret_cast(sender)->getLocation(), false); break; } } else if (event->getID() == eSelection) { switch (reinterpret_cast(sender)->getID()) { case RADIOGROUP_SAMPLE_RESTYPE: { handleConvertSampleResolution(); break; } case RADIOGROUP_SAMPLE_LOOPTYPE: { sampleEditor->setLoopType((mp_ubyte)((reinterpret_cast(sender)->getChoice())&3)); refresh(); break; } } } else if (event->getID() == eUpdated) { switch (reinterpret_cast(sender)->getID()) { case SAMPLE_EDITOR: { // redraw sample editor realUpdate(true, true, false); break; } } } return 0; } void SectionSamples::init() { init(0, tracker.MAXEDITORHEIGHT()-tracker.SAMPLESECTIONDEFAULTHEIGHT()); } void SectionSamples::init(pp_int32 x, pp_int32 y) { PPScreen* screen = tracker.screen; containerEntire = new PPTransparentContainer(CONTAINER_ENTIRESMPSECTION, screen, this, PPPoint(0, 0), PPSize(screen->getWidth(), screen->getHeight())); #ifndef __LOWRES__ pp_int32 conSize1 = (pp_int32)(screen->getWidth()*0.1359375f); pp_int32 conSize2 = (pp_int32)(screen->getWidth()*0.215625f); pp_int32 conSize3 = (pp_int32)(screen->getWidth()*0.0734375f); pp_int32 conSize4 = (pp_int32)(screen->getWidth()*0.075f); pp_int32 conSize5 = (pp_int32)(screen->getWidth()*0.128125f); pp_int32 conSize6 = (pp_int32)(screen->getWidth()*0.103125f); pp_int32 conSize7 = (pp_int32)(screen->getWidth()*0.2525f); pp_int32 dHeight = 12*4+8; pp_int32 bHeight = (dHeight-4)/3; pp_int32 bHeightm = bHeight-1; pp_int32 cHeight = tracker.SAMPLESECTIONDEFAULTHEIGHT() - dHeight - 1; // sample editor PPContainer* sampleEditorContainer = new PPContainer(CONTAINER_SAMPLEEDITOR, screen, this, PPPoint(x, y), PPSize(screen->getWidth(), cHeight), false); sampleEditorContainer->setColor(TrackerConfig::colorThemeMain); sampleEditorControl = new SampleEditorControl(SAMPLE_EDITOR, screen, this, PPPoint(x+2, y+2), PPSize(sampleEditorContainer->getSize().width-4, sampleEditorContainer->getSize().height-4)); sampleEditorControl->attachSampleEditor(tracker.moduleEditor->getSampleEditor()); sampleEditorControl->setBorderColor(TrackerConfig::colorThemeMain); sampleEditorContainer->addControl(sampleEditorControl); containerEntire->addControl(sampleEditorContainer); pp_int32 x2 = x; pp_int32 y2 = sampleEditorContainer->getSize().height + y; PPContainer* container = new PPContainer(CONTAINER_SAMPLE_PLAY, screen, this, PPPoint(x2, y2), PPSize(conSize1,dHeight), false); container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 4, y2 + 2), "Play:", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_PLAYNOTE, screen, this, PPPoint(x2 + 8, y2 + 2 + bHeight+2), "C-5", false)); pp_int32 size = (pp_int32)(conSize1*0.2183908045977f); pp_int32 size2 = (pp_int32)(conSize1*0.4367816091954f); pp_int32 size3 = (pp_int32)(conSize1/*0.2988505747126f*/*0.3218390804598f); PPButton* button = new PPButton(BUTTON_SAMPLE_PLAY_UP, screen, this, PPPoint(x2+size2, y2+2+bHeight), PPSize(size, bHeightm)); button->setText("Up"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_DOWN, screen, this, PPPoint(x2+size2, y2+2+bHeight*2), PPSize(size, bHeightm+1)); button->setText("Dn"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_STOP, screen, this, PPPoint(x2+2, y2+2+bHeight*2), PPSize(size2-3, bHeightm+1)); button->setText("Stop"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_WAVE, screen, this, PPPoint(x2+2 + size+size2-1, y2+2), PPSize(size3, bHeightm)); button->setText("Wav"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_RANGE, screen, this, PPPoint(x2+2 + size+size2-1, y2+2+bHeight), PPSize(size3, bHeightm)); button->setText("Rng"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_DISPLAY, screen, this, PPPoint(x2+2 + size+size2-1, y2+2+bHeight*2), PPSize(size3, bHeightm+1)); button->setText("Dsp"); container->addControl(button); containerEntire->addControl(container); size = (conSize2-4)/2-1; x2+=container->getSize().width; container = new PPContainer(CONTAINER_SAMPLE_RANGE, screen, this, PPPoint(x2, y2), PPSize(conSize2,dHeight), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SAMPLE_RANGE_SHOW, screen, this, PPPoint(x2+2, y2+2), PPSize(size, bHeightm)); button->setText("Show rng"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RANGE_ALL, screen, this, PPPoint(x2+2, y2+2+bHeight), PPSize(size, bHeightm)); button->setText("Rng all"); container->addControl(button); pp_int32 h = button->getSize().width; button = new PPButton(BUTTON_SAMPLE_UNDO, screen, this, PPPoint(x2+2, y2+2+bHeight*2), PPSize((size>>1), bHeightm+1)); button->setText("Undo"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_REDO, screen, this, PPPoint(x2+2 + (size>>1)+1, y2+2+bHeight*2), PPSize(h-(size>>1)-1, bHeightm+1)); button->setText("Redo"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RANGE_ZOOMOUT, screen, this, PPPoint(x2+2 + size+1, y2+2), PPSize(size, bHeightm)); button->setText("Zoom out"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RANGE_SHOWALL, screen, this, PPPoint(x2+2 + size+1, y2+2+bHeight), PPSize(size, bHeightm)); button->setText("Show all"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_APPLY_LASTFILTER, screen, this, PPPoint(x2+2 + size+1, y2+2+bHeight*2), PPSize(size, bHeightm+1)); button->setText("Redo filter"); container->addControl(button); containerEntire->addControl(container); x2 += container->getSize().width; size = (conSize3-5); container = new PPContainer(CONTAINER_SAMPLE_EDIT1, screen, this, PPPoint(x2, y2), PPSize(conSize3,dHeight), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SAMPLE_EDIT_CUT, screen, this, PPPoint(x2+2, y2+2), PPSize(size, bHeightm)); button->setText("Cut"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_COPY, screen, this, PPPoint(x2+2, y2+2+bHeight), PPSize(size, bHeightm)); button->setText("Copy"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_PASTE, screen, this, PPPoint(x2+2, y2+2+bHeight*2), PPSize(size, bHeightm+1)); button->setText("Paste"); container->addControl(button); containerEntire->addControl(container); x2 += container->getSize().width; size = (conSize4-5); container = new PPContainer(CONTAINER_SAMPLE_EDIT2, screen, this, PPPoint(x2, y2), PPSize(conSize4,dHeight), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SAMPLE_EDIT_CROP, screen, this, PPPoint(x2+2, y2+2), PPSize(size, bHeightm)); button->setText("Crop"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_VOL, screen, this, PPPoint(x2+2, y2+2+bHeight), PPSize(size, bHeightm)); button->setText("Vol"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_DRAW, screen, this, PPPoint(x2+2, y2+2+bHeight*2), PPSize(size, bHeightm+1), true, true, false); button->setText("Draw"); container->addControl(button); containerEntire->addControl(container); x2+=container->getSize().width; //y2+=container->getSize().height; container = new PPContainer(CONTAINER_SAMPLE_EDIT3, screen, this, PPPoint(x2, y2), PPSize(conSize5, 56), false); container->setColor(TrackerConfig::colorThemeMain); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SAMPLE_LOOPTYPE, screen, this, PPPoint(x2+1, y2-2), PPSize(conSize5-1, 4*14)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("No loop"); radioGroup->addItem("Forward"); if (screen->getWidth() < 800) radioGroup->addItem("Bi-dir"); else radioGroup->addItem("Ping-pong"); radioGroup->addItem("One shot"); container->addControl(radioGroup); containerEntire->addControl(container); // load container pp_int32 ty = y2; x2+=container->getSize().width; container = new PPContainer(CONTAINER_SAMPLE_EDIT4, screen, this, PPPoint(x2, ty), PPSize(conSize6,27), false); container->setColor(TrackerConfig::colorThemeMain); radioGroup = new PPRadioGroup(RADIOGROUP_SAMPLE_RESTYPE, screen, this, PPPoint(x2+1, ty-2), PPSize(conSize6-1, 28)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("8-bit"); radioGroup->addItem("16-bit"); container->addControl(radioGroup); containerEntire->addControl(container); ty+=container->getSize().height; // ----------- load/save size = (conSize6-4)/2-1; container = new PPContainer(CONTAINER_SAMPLE_LOADSAVE, screen, this, PPPoint(x2, ty), PPSize(conSize6,29), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SAMPLE_LOAD, screen, this, PPPoint(x2+2, ty+2), PPSize(size, 12)); button->setText("Load"); container->addControl(button); size2 = (container->getLocation().x + container->getSize().width) - (x2+2+size+1) - 3; button = new PPButton(BUTTON_SAMPLE_SAVE, screen, this, PPPoint(x2+2+size+1, ty+2), PPSize(size2, 12)); button->setText("Save"); container->addControl(button); // ----------- exit pp_int32 y3 = ty + 13; button = new PPButton(BUTTON_SAMPLEEDITOR_EXIT, screen, &tracker, PPPoint(x2+2, y3+2), PPSize(conSize6-5, 12)); button->setText("Exit"); container->addControl(button); containerEntire->addControl(container); x2+=container->getSize().width; conSize7 = screen->getWidth()-x2; container = new PPContainer(CONTAINER_SAMPLE_EDIT5, screen, this, PPPoint(x2, y2), PPSize(conSize7,56), false); container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(STATICTEXT_DISPLAY, NULL, NULL, PPPoint(x2 + 2 + 2, y2 + 4), screen->getWidth() < 800 ? "Displ." : "Display", true)); container->addControl(new PPStaticText(STATICTEXT_LENGTH, NULL, NULL, PPPoint(x2 + 2 + 2, y2 + 4+13), "Length", true)); container->addControl(new PPStaticText(STATICTEXT_REPSTART, screen, this, PPPoint(x2 + 2 + 2, y2 + 4+13*2), "Repeat", true)); container->addControl(new PPStaticText(STATICTEXT_REPLEN, screen, this, PPPoint(x2 + 2 + 2, y2 + 4+13*3), "Replen.", true)); x2 = screen->getWidth()-43-3 - 4 - 8*8; container->addControl(new PPStaticText(STATICTEXT_SAMPLE_DISPLAY, screen, this, PPPoint(x2, y2 + 4), "12345678", false)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_LENGTH, screen, this, PPPoint(x2, y2 + 4+13), "12345678", false)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_REPSTART, screen, this, PPPoint(x2, y2 + 4+13*2), "12345678", false)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_REPLENGTH, screen, this, PPPoint(x2, y2 + 4+13*3), "12345678", false)); x2 = screen->getWidth()-43-3; button = new PPButton(BUTTON_SAMPLE_EDIT_CLEAR, screen, this, PPPoint(x2, y2+2), PPSize(43, 12)); button->setText("Clear"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_MINIMIZE, screen, this, PPPoint(x2, y2+2+13), PPSize(29, 12)); button->setText("Min"); container->addControl(button); button = new PPButton(BUTTON_FLIPNUMBERFORMAT, screen, this, PPPoint(x2+30, y2+2+13), PPSize(13, 12)); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("H"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_REPSTARTPLUS, screen, this, PPPoint(x2, y2+2+13*2), PPSize(14, 12)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_REPSTARTMINUS, screen, this, PPPoint(x2+15, y2+2+13*2), PPSize(14, 12)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_REPLENPLUS, screen, this, PPPoint(x2, y2+2+13*3), PPSize(14, 12)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_REPLENMINUS, screen, this, PPPoint(x2+15, y2+2+13*3), PPSize(14, 12)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); button = new PPButton(BUTTON_SHOWRANGE, screen, this, PPPoint(x2+15+15, y2+2+13*2), PPSize(13, 12*2+1)); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Rng"); button->setVerticalText(true); container->addControl(button); containerEntire->addControl(container); #else // sample editor PPContainer* sampleEditorContainer = new PPContainer(CONTAINER_SAMPLEEDITOR, screen, this, PPPoint(x, y), PPSize(320, 92), false); sampleEditorContainer->setColor(TrackerConfig::colorThemeMain); sampleEditorControl = new SampleEditorControl(SAMPLE_EDITOR, screen, this, PPPoint(x+2, y+2), PPSize(316, 92-4)); sampleEditorControl->attachSampleEditor(tracker.moduleEditor->getSampleEditor()); sampleEditorControl->setBorderColor(TrackerConfig::colorThemeMain); sampleEditorContainer->addControl(sampleEditorControl); containerEntire->addControl(sampleEditorContainer); pp_int32 x2 = x; pp_int32 y2 = sampleEditorContainer->getSize().height + y; PPContainer* container = new PPContainer(CONTAINER_SAMPLE_PLAY, screen, this, PPPoint(x2, y2), PPSize(87,12*3+4), false); container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 4, y2 + 2), "Play:", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_PLAYNOTE, screen, this, PPPoint(x2 + 8, y2 + 2 + 14), "C-5", false)); PPButton* button = new PPButton(BUTTON_SAMPLE_PLAY_UP, screen, this, PPPoint(x2+38, y2+2+12), PPSize(18, 11)); button->setText("Up"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_DOWN, screen, this, PPPoint(x2+38, y2+2+24), PPSize(18, 11)); button->setText("Dn"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_STOP, screen, this, PPPoint(x2+2, y2+2+24), PPSize(34, 11)); button->setText("Stop"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_WAVE, screen, this, PPPoint(x2+2 + 56, y2+2), PPSize(26, 11)); button->setText("Wav"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_RANGE, screen, this, PPPoint(x2+2 + 56, y2+2+12), PPSize(26, 11)); button->setText("Rng"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_DISPLAY, screen, this, PPPoint(x2+2 + 56, y2+2+12*2), PPSize(26, 11)); button->setText("Dsp"); container->addControl(button); containerEntire->addControl(container); x2+=container->getSize().width; container = new PPContainer(CONTAINER_SAMPLE_RANGE, screen, this, PPPoint(x2, y2), PPSize(66*2+6,12*3+4), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SAMPLE_RANGE_SHOW, screen, this, PPPoint(x2+2, y2+2), PPSize(66, 11)); button->setText("Show rng"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RANGE_ALL, screen, this, PPPoint(x2+2, y2+2+12), PPSize(66, 11)); button->setText("Rng all"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_UNDO, screen, this, PPPoint(x2+2, y2+2+12*2), PPSize(32, 11)); button->setText("Undo"); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_REDO, screen, this, PPPoint(x2 + 2 + 33, y2+2+12*2), PPSize(33, 11)); button->setText("Redo"); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RANGE_ZOOMOUT, screen, this, PPPoint(x2+2 + 67, y2+2), PPSize(66, 11)); button->setText("Zoom out"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RANGE_SHOWALL, screen, this, PPPoint(x2+2 + 67, y2+2+12), PPSize(66, 11)); button->setText("Show all"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_APPLY_LASTFILTER, screen, this, PPPoint(x2+2 + 67, y2+2+12*2), PPSize(66, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Redo filter"); container->addControl(button); containerEntire->addControl(container); x2 += container->getSize().width; container = new PPContainer(CONTAINER_SAMPLE_EDIT1, screen, this, PPPoint(x2, y2), PPSize(47,12*3+4), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SAMPLE_EDIT_CUT, screen, this, PPPoint(x2+2, y2+2), PPSize(42, 11)); button->setText("Cut"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_COPY, screen, this, PPPoint(x2+2, y2+2+12), PPSize(42, 11)); button->setText("Copy"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_PASTE, screen, this, PPPoint(x2+2, y2+2+12*2), PPSize(42, 11)); button->setText("Paste"); container->addControl(button); containerEntire->addControl(container); x2 += container->getSize().width; container = new PPContainer(CONTAINER_SAMPLE_EDIT2, screen, this, PPPoint(x2, y2), PPSize(48,12*3+4), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SAMPLE_EDIT_CROP, screen, this, PPPoint(x2+2, y2+2), PPSize(43, 11)); button->setText("Crop"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_VOL, screen, this, PPPoint(x2+2, y2+2+12), PPSize(43, 11)); button->setText("Vol"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_DRAW, screen, this, PPPoint(x2+2, y2+2+12*2), PPSize(43, 11), true, true, false); button->setText("Draw"); container->addControl(button); containerEntire->addControl(container); x2 = x; y2+=container->getSize().height; container = new PPContainer(CONTAINER_SHOWCONTEXTMENU, screen, this, PPPoint(x2, y2), PPSize(17,52), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SHOWCONTEXTMENU, screen, this, PPPoint(x2+2, y2+2), PPSize(12, container->getSize().height - 5)); button->setVerticalText(true); button->setText("Menu"); container->addControl(button); containerEntire->addControl(container); x2+=container->getSize().width; container = new PPContainer(CONTAINER_SAMPLE_EDIT3, screen, this, PPPoint(x2, y2), PPSize(65,52), false); container->setColor(TrackerConfig::colorThemeMain); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SAMPLE_LOOPTYPE, screen, this, PPPoint(x2+3, y2+1), PPSize(65, 50)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setFont(PPFont::getFont(PPFont::FONT_TINY)); radioGroup->addItem("No loop"); radioGroup->addItem("Forward"); radioGroup->addItem("Ping-pong"); radioGroup->addItem("One shot"); container->addControl(radioGroup); containerEntire->addControl(container); x2+=container->getSize().width; container = new PPContainer(CONTAINER_SAMPLE_EDIT4, screen, this, PPPoint(x2, y2), PPSize(66-16,25), false); container->setColor(TrackerConfig::colorThemeMain); radioGroup = new PPRadioGroup(RADIOGROUP_SAMPLE_RESTYPE, screen, this, PPPoint(x2+1, y2-1), PPSize(65-16, 25)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setFont(PPFont::getFont(PPFont::FONT_TINY)); radioGroup->addItem("8-bit"); radioGroup->addItem("16-bit"); container->addControl(radioGroup); containerEntire->addControl(container); // Zoom container container = new PPContainer(CONTAINER_SAMPLE_ZOOMIN, screen, this, PPPoint(x2 + container->getSize().width, y2), PPSize(16,25), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_SAMPLE_ZOOM_PLUS, screen, this, PPPoint(container->getLocation().x+2, y2+2), PPSize(11, 10)); button->setText("+"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_ZOOM_MINUS, screen, this, PPPoint(button->getLocation().x, y2+2+button->getSize().height+1), PPSize(11, 9)); button->setText("-"); container->addControl(button); containerEntire->addControl(container); pp_int32 y3 = y2 + container->getSize().height; container = new PPContainer(CONTAINER_SAMPLE_LOADSAVE, screen, this, PPPoint(x2, y3), PPSize(66,27), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(MAINMENU_INSEDIT, screen, &tracker, PPPoint(x2+2, y3+2+12), PPSize(34, 10)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Ins.Ed."); container->addControl(button); button = new PPButton(BUTTON_SAMPLEEDITOR_EXIT, screen, &tracker, PPPoint(x2+2+35, y3+2+12), PPSize(26, 10)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Exit"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_LOAD, screen, this, PPPoint(x2+2, y3+2), PPSize(30, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Load"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_SAVE, screen, this, PPPoint(x2+2+31, y3+2), PPSize(30, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Save"); container->addControl(button); containerEntire->addControl(container); x2+=container->getSize().width; container = new PPContainer(CONTAINER_SAMPLE_EDIT5, screen, this, PPPoint(x2, y2), PPSize(172,52), false); container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(STATICTEXT_DISPLAY, NULL, NULL, PPPoint(x2 + 2, y2 + 4), "Display", true)); container->addControl(new PPStaticText(STATICTEXT_LENGTH, NULL, NULL, PPPoint(x2 + 2, y2 + 4+12), "Length", true)); container->addControl(new PPStaticText(STATICTEXT_REPSTART, screen, this, PPPoint(x2 + 2, y2 + 4+12*2), "Repeat", true)); container->addControl(new PPStaticText(STATICTEXT_REPLEN, screen, this, PPPoint(x2 + 2, y2 + 4+12*3), "Replen.", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_DISPLAY, screen, this, PPPoint(x2 + 2 + 58, y2 + 4), "12345678", false)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_LENGTH, screen, this, PPPoint(x2 + 2 + 58, y2 + 4+12), "12345678", false)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_REPSTART, screen, this, PPPoint(x2 + 2 + 58, y2 + 4+12*2), "12345678", false)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_REPLENGTH, screen, this, PPPoint(x2 + 2 + 58, y2 + 4+12*3), "12345678", false)); button = new PPButton(BUTTON_SAMPLE_EDIT_CLEAR, screen, this, PPPoint(x2+126, y2+2), PPSize(43, 11)); button->setText("Clear"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_MINIMIZE, screen, this, PPPoint(x2+126, y2+2+12), PPSize(27, 11)); button->setText("Min"); container->addControl(button); button = new PPButton(BUTTON_FLIPNUMBERFORMAT, screen, this, PPPoint(x2+126+28, y2+2+12), PPSize(15, 11)); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("H"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_REPSTARTPLUS, screen, this, PPPoint(x2+126, y2+2+12*2), PPSize(13, 11)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_REPSTARTMINUS, screen, this, PPPoint(x2+126+14, y2+2+12*2), PPSize(13, 11)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_REPLENPLUS, screen, this, PPPoint(x2+126, y2+2+12*3), PPSize(13, 11)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_EDIT_REPLENMINUS, screen, this, PPPoint(x2+126+14, y2+2+12*3), PPSize(13, 11)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); button = new PPButton(BUTTON_SHOWRANGE, screen, this, PPPoint(x2+126+14*2, y2+2+12*2), PPSize(15, 11*2+1)); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Rng"); button->setVerticalText(true); container->addControl(button); containerEntire->addControl(container); #endif containerEntire->adjustContainerSize(); screen->addControl(containerEntire); initialised = true; showSection(false); } void SectionSamples::showSection(bool bShow) { containerEntire->show(bShow); } void SectionSamples::realign() { pp_uint32 maxShould = tracker.MAXEDITORHEIGHT(); pp_uint32 maxIs = containerEntire->getLocation().y + containerEntire->getSize().height; if (maxIs != maxShould) { pp_int32 offset = maxShould - maxIs; containerEntire->move(PPPoint(0, offset)); } PatternEditorControl* control = tracker.getPatternEditorControl(); PPScreen* screen = tracker.screen; if (visible) { control->setSize(PPSize(screen->getWidth(), tracker.MAXEDITORHEIGHT()-tracker.SAMPLESECTIONDEFAULTHEIGHT()-tracker.UPPERSECTIONDEFAULTHEIGHT()+1)); } else { control->setSize(PPSize(screen->getWidth(),tracker.MAXEDITORHEIGHT()-tracker.UPPERSECTIONDEFAULTHEIGHT())); } } void SectionSamples::show(bool bShow) { #ifdef __LOWRES__ PPScreen* screen = tracker.screen; screen->pauseUpdate(true); #endif SectionAbstract::show(bShow); visible = bShow; if (!initialised) { init(); } if (initialised) { PatternEditorControl* control = tracker.getPatternEditorControl(); #ifndef __LOWRES__ realign(); #endif if (bShow) { if (control) { #ifdef __LOWRES__ control->show(false); replaceInstrumentListBoxes(true, 56); #endif } tracker.hideInputControl(); } else if (control) { #ifdef __LOWRES__ control->show(true); replaceInstrumentListBoxes(false); #endif } update(); showSection(bShow); } #ifdef __LOWRES__ // If instrument section is shown (bShow = true) // set focus to the Instrumentlist container (instrument listbox) // but before disable screen updates to prevent flickering if (bShow) { screen->setFocus(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); } screen->pauseUpdate(false); if (!bShow) { screen->update(); } #endif } void SectionSamples::update(bool repaint/* = true*/) { realUpdate(repaint, false, true); } void SectionSamples::notifyTabSwitch() { if (isVisible()) realign(); } // No need to reattach sample again, because reattaching also clears out selection void SectionSamples::refresh(bool repaint/* = true*/) { realUpdate(repaint, false, false); } void SectionSamples::realUpdate(bool repaint, bool force, bool reAttach) { if (!initialised) return; PPScreen* screen = tracker.screen; SampleEditor* sampleEditor = sampleEditorControl->getSampleEditor(); if (!force && screen->getModalControl() && screen->getModalControl() == tracker.messageBoxContainerGeneric) return; if (reAttach) tracker.moduleEditor->reloadSample(tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex()); if (!visible) return; PPContainer* container = static_cast(screen->getControlByID(CONTAINER_SAMPLE_EDIT3)); sampleEditorControl->setRelativeNote(currentSamplePlayNote - ModuleEditor::MAX_NOTE/2); static_cast(container->getControlByID(RADIOGROUP_SAMPLE_LOOPTYPE))->setChoice(sampleEditor->getLoopType() & 3); PPContainer* container2 = static_cast(screen->getControlByID(CONTAINER_SAMPLE_EDIT4)); static_cast(container2->getControlByID(RADIOGROUP_SAMPLE_RESTYPE))->setChoice(sampleEditor->is16Bit() ? 1 : 0); PPContainer* container3 = static_cast(screen->getControlByID(CONTAINER_SAMPLE_EDIT5)); setOffsetText(STATICTEXT_SAMPLE_LENGTH, sampleEditor->getSampleLen()); setOffsetText(STATICTEXT_SAMPLE_DISPLAY, sampleEditorControl->getCurrentDisplayRange()); static const char offsetTypes[3] = {'H', 'D', 'T'}; static_cast(container3->getControlByID(BUTTON_FLIPNUMBERFORMAT))->setText(offsetTypes[offsetFormat]); if (showRangeOffsets) { static_cast(container3->getControlByID(BUTTON_SHOWRANGE))->setText("Rng"); static_cast(container3->getControlByID(STATICTEXT_REPSTART))->setText("RStart"); static_cast(container3->getControlByID(STATICTEXT_REPLEN))->setText("REnd"); pp_int32 sStart = sampleEditorControl->getSelectionStart(); pp_int32 sEnd = sampleEditorControl->getSelectionEnd(); if (sStart >= 0 && sEnd >= 0) { setOffsetText(STATICTEXT_SAMPLE_REPSTART, sStart); setOffsetText(STATICTEXT_SAMPLE_REPLENGTH, sEnd); } else { static_cast(container3->getControlByID(STATICTEXT_SAMPLE_REPSTART))->setText("--------"); static_cast(container3->getControlByID(STATICTEXT_SAMPLE_REPLENGTH))->setText("--------"); } } else { static_cast(container3->getControlByID(BUTTON_SHOWRANGE))->setText("Rep"); static_cast(container3->getControlByID(STATICTEXT_REPSTART))->setText("Repeat"); static_cast(container3->getControlByID(STATICTEXT_REPLEN))->setText("Replen."); setOffsetText(STATICTEXT_SAMPLE_REPSTART, sampleEditorControl->getRepeatStart()); setOffsetText(STATICTEXT_SAMPLE_REPLENGTH, sampleEditorControl->getRepeatLength()); } PPContainer* container4 = static_cast(screen->getControlByID(CONTAINER_SAMPLE_PLAY)); char noteName[4]; PatternTools::getNoteName(noteName, currentSamplePlayNote+1); static_cast(container4->getControlByID(STATICTEXT_SAMPLE_PLAYNOTE))->setText(noteName); PPContainer* container5 = static_cast(screen->getControlByID(CONTAINER_SAMPLE_RANGE)); static_cast(container5->getControlByID(BUTTON_SAMPLE_RANGE_ALL))->setClickable(!sampleEditor->isEmptySample()); static_cast(container5->getControlByID(BUTTON_SAMPLE_RANGE_SHOWALL))->setClickable(!sampleEditor->isEmptySample()); static_cast(container5->getControlByID(BUTTON_SAMPLE_RANGE_ZOOMOUT))->setClickable(sampleEditorControl->canZoomOut()); static_cast(container5->getControlByID(BUTTON_SAMPLE_RANGE_SHOW))->setClickable(sampleEditorControl->hasValidSelection()); static_cast(container5->getControlByID(BUTTON_SAMPLE_APPLY_LASTFILTER))->setClickable(sampleEditor->tool_canApplyLastFilter()); static_cast(container5->getControlByID(BUTTON_SAMPLE_UNDO))->setClickable(sampleEditor->canUndo()); static_cast(container5->getControlByID(BUTTON_SAMPLE_REDO))->setClickable(sampleEditor->canRedo()); PPContainer* container6 = static_cast(screen->getControlByID(CONTAINER_SAMPLE_EDIT2)); static_cast(container6->getControlByID(BUTTON_SAMPLE_EDIT_CROP))->setClickable(sampleEditorControl->hasValidSelection()); static_cast(container6->getControlByID(BUTTON_SAMPLE_EDIT_VOL))->setClickable(!sampleEditor->isEmptySample()); static_cast(container6->getControlByID(BUTTON_SAMPLE_EDIT_DRAW))->setClickable(!sampleEditor->isEmptySample()); PPContainer* container7 = static_cast(screen->getControlByID(CONTAINER_SAMPLE_PLAY)); static_cast(container7->getControlByID(BUTTON_SAMPLE_PLAY_RANGE))->setClickable(sampleEditorControl->hasValidSelection()); static_cast(container7->getControlByID(BUTTON_SAMPLE_PLAY_WAVE))->setClickable(!sampleEditor->isEmptySample()); static_cast(container7->getControlByID(BUTTON_SAMPLE_PLAY_DISPLAY))->setClickable(!sampleEditor->isEmptySample()); PPContainer* container9 = static_cast(screen->getControlByID(CONTAINER_SAMPLE_EDIT1)); bool b = (sampleEditorControl->getCurrentRangeLength()) > 0 && sampleEditorControl->hasValidSelection(); static_cast(container9->getControlByID(BUTTON_SAMPLE_EDIT_CUT))->setClickable(b); static_cast(container9->getControlByID(BUTTON_SAMPLE_EDIT_COPY))->setClickable(b); static_cast(container9->getControlByID(BUTTON_SAMPLE_EDIT_PASTE))->setClickable(sampleEditor->canPaste()); PPContainer* container10 = static_cast(screen->getControlByID(CONTAINER_SAMPLE_LOADSAVE)); static_cast(container10->getControlByID(BUTTON_SAMPLE_SAVE))->setClickable(!sampleEditor->isEmptySample()); screen->paintControl(container10, false); screen->paintControl(container9, false); screen->paintControl(container6, false); screen->paintControl(container5, false); screen->paintControl(container4, false); screen->paintControl(container, false); screen->paintControl(container2, false); screen->paintControl(container3, false); screen->paintControl(sampleEditorControl, false); if (repaint) screen->update(); } void SectionSamples::updateSampleWindow(bool repaint/* = true*/) { PPScreen* screen = tracker.screen; screen->paintControl(sampleEditorControl, false); if (repaint) screen->update(); } void SectionSamples::updateAfterLoad() { tracker.updateInstrumentsListBox(false); tracker.updateSamplesListBox(false); tracker.sectionInstruments->update(false); update(false); } SampleEditorControl* SectionSamples::getSampleEditorControl(bool forceAttach/* = true*/) { if (forceAttach && sampleEditorControl && sampleEditorControl->getSampleEditor()->getSample() == NULL) { tracker.moduleEditor->reloadSample(tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex()); } return sampleEditorControl; } void SectionSamples::resetSampleEditor() { if (sampleEditorControl) sampleEditorControl->reset(); } bool SectionSamples::isEmptySample() { return !tracker.getSampleEditor()->isEditableSample(); } void SectionSamples::setOffsetFormat(pp_uint32 offsetFormat) { this->offsetFormat = offsetFormat; sampleEditorControl->setOffsetFormat((SampleEditorControl::OffsetFormats)offsetFormat); } void SectionSamples::toggleOffsetFormat() { offsetFormat = (offsetFormat + 1) % (SampleEditorControl::OffsetFormatMillis+1); sampleEditorControl->setOffsetFormat((SampleEditorControl::OffsetFormats)offsetFormat); } void SectionSamples::setOffsetText(pp_uint32 ID, pp_uint32 offset) { switch (offsetFormat) { case SampleEditorControl::OffsetFormatDec: static_cast(containerEntire->getControlByID(ID))->setValue(offset, false, 8); break; case SampleEditorControl::OffsetFormatHex: static_cast(containerEntire->getControlByID(ID))->setValue(offset, true, 8); break; case SampleEditorControl::OffsetFormatMillis: { pp_uint32 millis = sampleEditorControl->getSampleEditor()->convertSmpPosToMillis(offset, currentSamplePlayNote - ModuleEditor::MAX_NOTE/2); char buffer[32], buffer2[32]; memset(buffer2, 32, sizeof(buffer2)); // we only have 7 digits, one period character is contained too SampleEditorControl::formatMillis(buffer, millis % 10000000); // string too large if (strlen(buffer) > 8) { // try to cut off msecs (from period) char* ptr = buffer+strlen(buffer); while (*ptr != '.' && ptr > buffer) ptr--; if (*ptr == '.') { *ptr++ = 's'; *ptr = '\0'; } // string still too large? if (strlen(buffer) > 8) { // cut off minutes part (from m) char* ptr = buffer+strlen(buffer); while (*ptr != 'm' && ptr > buffer) ptr--; if (*ptr == 'm') *(++ptr) = '\0'; } if (strlen(buffer) > 8) strcpy(buffer, "toolarge"); } strcpy(buffer2 + (8-strlen(buffer)), buffer); static_cast(containerEntire->getControlByID(ID))->setText(buffer2); break; } } } void SectionSamples::handleClearSample() { SampleEditor* sampleEditor = sampleEditorControl->getSampleEditor(); if (sampleEditor->isEditableSample()) { if (sampleEditor->isUndoStackEnabled()) { sampleEditor->clearSample(); } else { showMessageBox(MESSAGEBOX_CLEARSAMPLE, "Clear sample?"); } } else { update(); } } void SectionSamples::handleCropSample() { SampleEditor* sampleEditor = sampleEditorControl->getSampleEditor(); if (sampleEditor->isEditableSample() && sampleEditorControl->hasValidSelection()) { if (sampleEditor->isUndoStackEnabled()) { sampleEditor->cropSample(); } else { showMessageBox(MESSAGEBOX_CROPSAMPLE, "Crop sample?"); } } else { update(); } } void SectionSamples::handleMinimizeSample() { SampleEditor* sampleEditor = sampleEditorControl->getSampleEditor(); if (sampleEditor->canMinimize()) { if (sampleEditor->isUndoStackEnabled()) { sampleEditor->minimizeSample(); } else { showMessageBox(MESSAGEBOX_MINIMIZESAMPLE, "Minimize sample?"); } } else { update(); } } void SectionSamples::handleConvertSampleResolution() { SampleEditor* sampleEditor = sampleEditorControl->getSampleEditor(); if (sampleEditor->isEditableSample()) { showMessageBox(MESSAGEBOX_CONVERTSAMPLE, "Convert sample data?", true); } else { sampleEditor->convertSampleResolution(false); update(); } } milkytracker-0.90.85+dfsg/src/tracker/SectionUpperLeft.h0000644000175000017500000000324111150223367022251 0ustar admin2admin2/* * tracker/SectionUpperLeft.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionUpperLeft.h * MilkyTracker * * Created by Peter Barth on 10.04.05. * */ #ifndef SECTIONUPPERLEFT__H #define SECTIONUPPERLEFT__H #include "BasicTypes.h" #include "Event.h" #include "SectionAbstract.h" class PPControl; class Tracker; class SectionUpperLeft : public SectionAbstract { protected: enum Constants { UPPERLEFTSECTIONHEIGHT = 118 }; PPControl* sectionContainer; virtual void showSection(bool bShow); public: SectionUpperLeft(Tracker& tracker, PPDialogBase* dialog = NULL, DialogResponder* responder = NULL); virtual ~SectionUpperLeft(); // Derived from SectionAbstract virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event) = 0; virtual void init(); virtual void init(pp_int32 x, pp_int32 y) = 0; virtual void show(bool bShow); virtual void update(bool repaint = true) = 0; PPControl* getSectionContainer() { return sectionContainer; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/EnvelopeEditor.h0000644000175000017500000001010311150223367021735 0ustar admin2admin2/* * tracker/EnvelopeEditor.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * EnvelopeEditor.h * MilkyTracker * * Created by Peter Barth on 25.11.07. * */ #ifndef __ENVELOPEEDITOR_H__ #define __ENVELOPEEDITOR_H__ #include "EditorBase.h" #include "Undo.h" #include "Singleton.h" struct TEnvelope; class FilterParameters; class EnvelopeEditor : public EditorBase { public: enum EnvelopeTypes { EnvelopeTypeVolume = 0, EnvelopeTypePanning = 1 }; private: class ClipBoard : public PPSingleton { private: TEnvelope* envelopeCopy; ClipBoard(); public: ~ClipBoard(); void makeCopy(TEnvelope& envelope); void paste(TEnvelope& envelope); bool isEmpty() const { return envelopeCopy == NULL; } friend class PPSingleton; }; TEnvelope* envelope; EnvelopeTypes envelopeType; // selection bool startSelection; pp_int32 selectionIndex; // undo/redo information EnvelopeUndoStackEntry* before; PPUndoStack* undoStack; UndoHistory* undoHistory; void prepareUndo(); bool finishUndo(); // revoke changes void revoke(const EnvelopeUndoStackEntry* stackEntry); public: EnvelopeEditor(); virtual ~EnvelopeEditor(); void attachEnvelope(TEnvelope* envelope, XModule* module); const TEnvelope* getEnvelope() const { return envelope; } bool isValidEnvelope() const { return envelope != NULL; } bool isEmptyEnvelope() const; void setEnvelopeType(EnvelopeTypes envelopeType) { this->envelopeType = envelopeType; } EnvelopeTypes getEnvelopeType() const { return envelopeType; } void reset(); void setSelectionIndex(pp_int32 selectionIndex) { this->selectionIndex = selectionIndex; } pp_int32& getSelectionIndex() { return selectionIndex; } void resetSelection() { selectionIndex = -1; } // --- kinda clip board -------------------------------------------------- void makeCopy(); void pasteCopy(); void pasteOther(const TEnvelope& env); bool canCopy() const; bool canPaste() const { return !ClipBoard::getInstance()->isEmpty(); } // --- Multilevel UNDO / REDO -------------------------------------------- // undo last changes void undo(); // redo last changes void redo(); bool canUndo() const { if (envelope && undoStack) return !undoStack->IsEmpty(); else return false; } bool canRedo() const { if (envelope && undoStack) return !undoStack->IsTop(); else return false; } void startSelectionDragging(pp_int32 index); bool isSelectionDragging() const { return startSelection; } void endSelectionDragging(); pp_int32 getHorizontalExtent() const; // --- manipulate envelope ----------------------------------------------- void setEnvelopePoint(pp_int32 index, pp_int32 x, pp_int32 y); void enableEnvelope(bool b); bool isEnvelopeEnabled() const; void enableSustain(bool b); bool isSustainEnabled() const; pp_int32 getSustainPtIndex() const; void enableLoop(bool b); bool isLoopEnabled() const; pp_int32 getLoopStartPtIndex() const; pp_int32 getLoopEndPtIndex() const; void selectNextSustainPoint(); void selectPreviousSustainPoint(); void selectNextLoopStartPoint(); void selectPreviousLoopStartPoint(); void selectNextLoopEndPoint(); void selectPreviousLoopEndPoint(); void deletePoint(); void addPoint(); // filters (need the same signature) void tool_xScaleEnvelope(const FilterParameters* par); void tool_yScaleEnvelope(const FilterParameters* par); }; #endif milkytracker-0.90.85+dfsg/src/tracker/EnvelopeContainer.cpp0000644000175000017500000000666011150223367023001 0ustar admin2admin2/* * tracker/EnvelopeContainer.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * EnvelopeContainer.cpp * MilkyTracker * * Created by Peter Barth on 20.06.05. * */ #include "EnvelopeContainer.h" #include "XModule.h" #include "PatternTools.h" EnvelopeContainer::EnvelopeContainer(pp_int32 num) : envelopes(NULL) { envelopes = new TEnvelope[num]; memset(envelopes, 0, num*sizeof(TEnvelope)); numEnvelopes = num; } EnvelopeContainer::~EnvelopeContainer() { delete[] envelopes; } void EnvelopeContainer::store(pp_int32 index, const TEnvelope& env) { if (index < 0 || index > numEnvelopes - 1) return; envelopes[index] = env; } const TEnvelope* EnvelopeContainer::restore(pp_int32 index) { if (index < 0 || index > numEnvelopes - 1) return NULL; return envelopes + index; } PPString EnvelopeContainer::encodeEnvelope(const TEnvelope& env) { char buffer[10]; // Convert number of points PatternTools::convertToHex(buffer, env.num, 2); PPString str = buffer; // Sustain point PatternTools::convertToHex(buffer, env.sustain, 2); str.append(buffer); // Loop start PatternTools::convertToHex(buffer, env.loops, 2); str.append(buffer); // Loop end PatternTools::convertToHex(buffer, env.loope, 2); str.append(buffer); // Loop type PatternTools::convertToHex(buffer, env.type, 2); str.append(buffer); // Loop speed PatternTools::convertToHex(buffer, env.speed, 2); str.append(buffer); for (pp_int32 i = 0; i < env.num; i++) { // X-coordinate PatternTools::convertToHex(buffer, (env.env[i][0]>>8)&0xFF, 2); str.append(buffer); PatternTools::convertToHex(buffer, env.env[i][0]&0xFF, 2); str.append(buffer); // Y-coordinate PatternTools::convertToHex(buffer, (env.env[i][1]>>8)&0xFF, 2); str.append(buffer); PatternTools::convertToHex(buffer, env.env[i][1]&0xFF, 2); str.append(buffer); } return str; } static pp_uint8 getNibble(const char* str) { if (*str >= '0' && *str <= '9') return (*str - '0'); if (*str >= 'A' && *str <= 'F') return (*str - 'A' + 10); if (*str >= 'a' && *str <= 'f') return (*str - 'a' + 10); return 0; } static pp_uint8 getByte(const char* str) { return (getNibble(str)<<4) + getNibble(str+1); } TEnvelope EnvelopeContainer::decodeEnvelope(const PPString& str) { TEnvelope env; const char* ptr = str; env.num = getByte(ptr); ptr+=2; env.sustain = getByte(ptr); ptr+=2; env.loops = getByte(ptr); ptr+=2; env.loope = getByte(ptr); ptr+=2; env.type = getByte(ptr); ptr+=2; env.speed = getByte(ptr); ptr+=2; for (pp_int32 i = 0; i < env.num; i++) { pp_uint16 b1 = getByte(ptr); pp_uint16 b2 = getByte(ptr+2); env.env[i][0] = (b1 << 8) + b2; b1 = getByte(ptr+4); b2 = getByte(ptr+6); env.env[i][1] = (b1 << 8) + b2; ptr+=8; } return env; } milkytracker-0.90.85+dfsg/src/tracker/TitlePageManager.cpp0000755000175000017500000001445311150223367022534 0ustar admin2admin2/* * tracker/TitlePageManager.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "TitlePageManager.h" #include "Screen.h" #include "Container.h" #include "StaticText.h" #include "ListBox.h" #include "PeakLevelControl.h" #include "PPUIConfig.h" #include "ControlIDs.h" TitlePageManager::TitlePageManager(PPScreen& screen) : screen(screen) { } TitlePageManager::Pages TitlePageManager::getCurrentTitlePage() { PPContainer* container = static_cast(screen.getControlByID(CONTAINER_ABOUT)); PPButton* buttonShowPeak = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWPEAK)); PPButton* buttonShowTime = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWTIME)); //PPButton* buttonShowTitle = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWTITLE)); if (buttonShowPeak->isPressed()) return PagePeak; else if (buttonShowTime->isPressed()) return PageTime; return PageTitle; } void TitlePageManager::showTitlePage(Pages page, bool update/* = true*/) { switch (page) { case PageTitle: showSongTitleEditField(update); break; case PageTime: showTimeCounter(update); break; case PagePeak: showPeakControl(update); break; } } void TitlePageManager::showSongTitleEditField(bool update/* = true*/) { PPContainer* container = static_cast(screen.getControlByID(CONTAINER_ABOUT)); PeakLevelControl* peakLevelControl = static_cast(screen.getControlByID(PEAKLEVEL_CONTROL)); PPButton* buttonShowPeak = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWPEAK)); PPButton* buttonShowTime = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWTIME)); PPButton* buttonShowTitle = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWTITLE)); PPButton* buttonTimeEstimate = static_cast(container->getControlByID(BUTTON_ABOUT_ESTIMATESONGLENGTH)); PPStaticText* text = static_cast(container->getControlByID(STATICTEXT_ABOUT_HEADING)); PPStaticText* text2 = static_cast(container->getControlByID(STATICTEXT_ABOUT_TIME)); static_cast(container->getControlByID(LISTBOX_SONGTITLE))->hide(false); peakLevelControl->hide(true); text2->hide(true); buttonTimeEstimate->hide(true); buttonShowPeak->setPressed(false); buttonShowTime->setPressed(false); buttonShowTitle->setPressed(true); #ifdef __LOWRES__ text->setText("Title:"); #else text->setText("Song Title:"); #endif text->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); if (update) screen.paintControl(container); } void TitlePageManager::showTimeCounter(bool update/* = true*/) { PPContainer* container = static_cast(screen.getControlByID(CONTAINER_ABOUT)); PeakLevelControl* peakLevelControl = static_cast(screen.getControlByID(PEAKLEVEL_CONTROL)); PPButton* buttonShowPeak = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWPEAK)); PPButton* buttonShowTime = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWTIME)); PPButton* buttonShowTitle = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWTITLE)); PPButton* buttonTimeEstimate = static_cast(container->getControlByID(BUTTON_ABOUT_ESTIMATESONGLENGTH)); PPStaticText* text = static_cast(container->getControlByID(STATICTEXT_ABOUT_HEADING)); PPStaticText* text2 = static_cast(container->getControlByID(STATICTEXT_ABOUT_TIME)); static_cast(container->getControlByID(LISTBOX_SONGTITLE))->hide(true); peakLevelControl->hide(true); text2->hide(false); buttonTimeEstimate->hide(false); buttonShowPeak->setPressed(false); buttonShowTime->setPressed(true); buttonShowTitle->setPressed(false); text->setText("Time:"); text->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); if (update) screen.paintControl(container); } void TitlePageManager::showPeakControl(bool update/* = true*/) { PPContainer* container = static_cast(screen.getControlByID(CONTAINER_ABOUT)); PeakLevelControl* peakLevelControl = static_cast(screen.getControlByID(PEAKLEVEL_CONTROL)); PPButton* buttonShowPeak = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWPEAK)); PPButton* buttonShowTime = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWTIME)); PPButton* buttonShowTitle = static_cast(container->getControlByID(BUTTON_ABOUT_SHOWTITLE)); PPButton* buttonTimeEstimate = static_cast(container->getControlByID(BUTTON_ABOUT_ESTIMATESONGLENGTH)); PPStaticText* text = static_cast(container->getControlByID(STATICTEXT_ABOUT_HEADING)); PPStaticText* text2 = static_cast(container->getControlByID(STATICTEXT_ABOUT_TIME)); static_cast(container->getControlByID(LISTBOX_SONGTITLE))->hide(true); peakLevelControl->hide(false); text2->hide(true); buttonTimeEstimate->hide(true); buttonShowPeak->setPressed(true); buttonShowTime->setPressed(false); buttonShowTitle->setPressed(false); #ifdef __LOWRES__ text->setText("Peak:"); #else text->setText("Peak level:"); #endif text->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); if (update) screen.paintControl(container); } void TitlePageManager::setPeakControlHeadingColor(const PPColor& color, bool update/* = true*/) { PPContainer* container = static_cast(screen.getControlByID(CONTAINER_ABOUT)); PPStaticText* text = static_cast(container->getControlByID(STATICTEXT_ABOUT_HEADING)); text->setColor(color); if (update) screen.paintControl(container); } milkytracker-0.90.85+dfsg/src/tracker/PatternEditor.h0000644000175000017500000003344411150223367021612 0ustar admin2admin2/* * tracker/PatternEditor.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PatternEditor.h * MilkyTracker * * Created by Peter Barth on 16.11.07. * */ #ifndef __PATTERNEDITOR_H__ #define __PATTERNEDITOR_H__ #include "EditorBase.h" #include "PatternEditorTools.h" #include "Undo.h" struct TXMPattern; class XModule; class PatternEditor : public EditorBase { public: // These are the clipboards, FT2 uses different clipboard buffers for // copy/cut/paste block/track/pattern operations, so we imitate these too enum ClipBoardTypes { ClipBoardTypeSelection, ClipBoardTypeTrack, ClipBoardTypePattern, // do not use ClipBoardTypeLAST }; class PatternAdvanceInterface { public: virtual void advance() = 0; }; class Selection { private: bool copyValid; public: PatternEditorTools::Position start, end, startCopy, endCopy; Selection() { reset(); startCopy = start; endCopy = end; copyValid = false; } void reset() { start.channel = -1; start.row = -1; start.inner = 0; end.channel = -1; end.row = -1; end.inner = 7; } bool isValid() { return (start.channel >= 0 && start.row >= 0 && end.channel >= 0 && end.row >= 0); } bool isCopyValid() { return (startCopy.channel >= 0 && startCopy.row >= 0 && endCopy.channel >= 0 && endCopy.row >= 0) && copyValid; } void backup(); void restore(); }; struct TCommand { pp_uint8 effect; pp_uint8 operand; }; private: class ClipBoard { private: mp_ubyte* buffer; PatternEditorTools::Position selectionStart, selectionEnd; pp_int32 selectionWidth; pp_int32 selectionHeight; // FT2 uses different clipboards for track/pattern/block operations // so a regular singleton design won't cut it static ClipBoard* instances[ClipBoardTypeLAST]; ClipBoard(); public: ~ClipBoard(); static ClipBoard* getInstance(ClipBoardTypes type); void makeCopy(TXMPattern& pattern, const PatternEditorTools::Position& ss, const PatternEditorTools::Position& se, bool clear = false); void paste(TXMPattern& pattern, pp_int32 sc, pp_int32 sr, bool transparent = false); bool isEmpty() const { return buffer == NULL; } pp_int32 getNumRows() { return selectionHeight; } pp_int32 getNumChannels() { return selectionWidth; } }; // operations enum LastChanges { LastChangeNone, LastChangeSlotChange, LastChangeInsertNote, LastChangeInsertLine, LastChangeDeleteNote, LastChangeDeleteLine, LastChangeDeleteNoteVolumeAndEffect, LastChangeDeleteVolumeAndEffect, LastChangeDeleteEffect, LastChangeWriteMacro, LastChangeCut, LastChangePaste, LastChangeDeleteSelection, LastChangeExpandPattern, LastChangeShrinkPattern, LastChangeResizePattern, LastChangeLoadXPattern, LastChangeLoadXTrack, LastChangeInsRemapTrack, LastChangeInsRemapPattern, LastChangeInsRemapSelection, LastChangeNoteTransposeTrack, LastChangeNoteTransposePattern, LastChangeNoteTransposeSelection, LastChangeNoteInterpolate, LastChangeSplitTrack, LastChangeSwapChannels, LastChangeScaleVolume, LastChangeZeroOperandsTrack, LastChangeZeroOperandsPattern, LastChangeZeroOperandsSelection, LastChangeFillOperandsTrack, LastChangeFillOperandsPattern, LastChangeFillOperandsSelection, LastChangeRelocateCommandsTrack, LastChangeRelocateCommandsPattern, LastChangeRelocateCommandsSelection }; private: TXMPattern* pattern; // Current cursor position PatternEditorTools::Position cursor; // Current selection Selection selection; pp_int32 numVisibleChannels; bool autoResize; pp_int32 currentInstrument; bool instrumentEnabled; bool instrumentBackTrace; pp_int32 currentOctave; // undo/redo information UndoStackEntry::UserData undoUserData; PatternUndoStackEntry* before; PPUndoStack* undoStack; UndoHistory* undoHistory; LastChanges lastChange; bool lastOperationDidChangeRows; bool lastOperationDidChangeCursor; TCommand effectMacros[20]; void prepareUndo(); bool finishUndo(LastChanges lastChange, bool nonRepeat = false); bool revoke(const PatternUndoStackEntry* stackEntry); void cut(ClipBoard& clipBoard); void copy(ClipBoard& clipBoard); void paste(ClipBoard& clipBoard, bool transparent = false, pp_int32 fromChannel = -1); void clearRange(const PatternEditorTools::Position& rangeStart, const PatternEditorTools::Position& rangeEnd); public: PatternEditor(); virtual ~PatternEditor(); // query status bool getLastOperationDidChangeRows() const { return lastOperationDidChangeRows; } bool getLastOperationDidChangeCursor() const { return lastOperationDidChangeCursor; } void attachPattern(TXMPattern* pattern, XModule* module); TXMPattern* getPattern() { return pattern; } void reset(); pp_int32 getNumChannels() const; pp_int32 getNumRows() const; void setNumVisibleChannels(pp_int32 numVisibleChannels) { this->numVisibleChannels = numVisibleChannels; } void setAutoResize(bool autoResize) { this->autoResize = autoResize; } bool getAutoResize() const { return autoResize; } // dealing with current cursor void setCursor(const PatternEditorTools::Position& cursor) { this->cursor = cursor; } PatternEditorTools::Position& getCursor() { return cursor; } void resetCursor() { cursor.row = cursor.channel = cursor.inner = 0; } // dealing with the selection void setSelection(const Selection& selection) { this->selection = selection; } Selection& getSelection() { return selection; } void setSelectionStart(const PatternEditorTools::Position& pos) { selection.start = pos; } void setSelectionEnd(const PatternEditorTools::Position& pos) { selection.end = pos; } void resetSelection() { selection.reset(); } bool hasValidSelection(); void selectChannel(pp_int32 channel); void selectAll(); // dealing with instrument void setCurrentInstrument(pp_int32 ins) { currentInstrument = ins; } pp_int32 getCurrentActiveInstrument(); void enableInstrument(bool instrumentEnabled) { this->instrumentEnabled = instrumentEnabled; } bool isInstrumentEnabled() { return instrumentEnabled; } // Intelligent instrument backtrace? void setInstrumentBackTrace(bool instrumentBackTrace) { this->instrumentBackTrace = instrumentBackTrace; } void setCurrentOctave(pp_int32 octave) { currentOctave = octave; } pp_int32 getCurrentOctave() const { return currentOctave; } void increaseCurrentOctave() { if (currentOctave < 8) currentOctave++; } void decreaseCurrentOctave() { if (currentOctave > 1) currentOctave--; } // --- Multilevel UNDO / REDO -------------------------------------------- bool canUndo() const { if (undoStack) return !undoStack->IsEmpty(); else return false; } bool canRedo() const { if (undoStack) return !undoStack->IsTop(); else return false; } // undo last changes bool undo(); // redo last changes bool redo(); void setUndoUserData(const void* data, pp_uint32 dataLen) { this->undoUserData = UndoStackEntry::UserData((pp_uint8*)data, dataLen); } pp_uint32 getUndoUserDataLen() const { return undoUserData.getDataLen(); } const void* getUndoUserData() const { return (void*)undoUserData.getData(); } // --- dealing with the pattern data ------------------------------------- void clearSelection(); void clearPattern(); bool clipBoardSelectionIsEmpty() const { return ClipBoard::getInstance(ClipBoardTypeSelection)->isEmpty(); } void cut(ClipBoardTypes clipBoardType); void copy(ClipBoardTypes clipBoardType); void paste(ClipBoardTypes clipBoardType, bool transparent = false, pp_int32 fromChannel = -1); // resize pattern to a new number of rows bool resizePattern(pp_int32 newRowNum, bool withUndo = true); // insert a blank line after each pattern line bool expandPattern(); // delete every odd pattern line bool shrinkPattern(); // Load extended pattern from file (.XP) bool loadExtendedPattern(const PPSystemString& fileName); bool saveExtendedPattern(const PPSystemString& fileName); // Load extended track from file (.XT) bool loadExtendedTrack(const PPSystemString& fileName); bool saveExtendedTrack(const PPSystemString& fileName); // --- remap instruments ------------------------------------------------- pp_int32 insRemapTrack(pp_int32 oldIns, pp_int32 newIns); pp_int32 insRemapPattern(pp_int32 oldIns, pp_int32 newIns); pp_int32 insRemapSelection(pp_int32 oldIns, pp_int32 newIns); // --- transpose notes --------------------------------------------------- pp_int32 noteTransposeTrackCore(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate); pp_int32 noteTransposePatternCore(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate); pp_int32 noteTransposeSelectionCore(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate); // --- interpolate values in current selection --------------------------- pp_int32 interpolateValuesInSelection(); // --- split track ------------------------------------------------------- pp_int32 splitTrack(pp_int32 useChannels, bool selectionOnly, bool insertNoteOff); // --- swap channels ----------------------------------------------------- pp_int32 swapChannels(pp_int32 dstChannel, pp_int32 srcChannel); // --- FT2 compatible scale volume function ------------------------------ pp_int32 scaleVolume(const PatternEditorTools::Position& startSelection, const PatternEditorTools::Position& endSelection, float startScale, float endScale); pp_int32 scaleVolumeTrack(float startScale, float endScale); pp_int32 scaleVolumePattern(float startScale, float endScale); pp_int32 scaleVolumeSelection(float startScale, float endScale); // --- Zero out unecessary operands -------------------------------------- pp_int32 zeroOperandsTrack(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 zeroOperandsPattern(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 zeroOperandsSelection(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate); // --- Fill in zero operands --------------------------------------------- pp_int32 fillOperandsTrack(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 fillOperandsPattern(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 fillOperandsSelection(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate); // --- Relocate FX into volume column if possible ------------------------ pp_int32 relocateCommandsTrack(const PatternEditorTools::RelocateParameters& relocateParameters, bool evaluate); pp_int32 relocateCommandsPattern(const PatternEditorTools::RelocateParameters& relocateParameters, bool evaluate); pp_int32 relocateCommandsSelection(const PatternEditorTools::RelocateParameters& relocateParameters, bool evaluate); // --- write slot data --------------------------------------------------- bool writeNote(pp_int32 note, bool withUndo = false, PatternAdvanceInterface* advanceImpl = NULL); // --- write through, without undo etc. ---------------------------------- void writeDirectNote(pp_int32 note, pp_int32 track = -1, pp_int32 row = -1, pp_int32 order = -1); enum NibbleTypes { NibbleTypeLow, NibbleTypeHigh, NibbleTypeBoth }; bool writeInstrument(NibbleTypes nibleType, pp_uint8 value, bool withUndo = false, PatternAdvanceInterface* advanceImpl = NULL); bool writeFT2Volume(NibbleTypes nibleType, pp_uint8 value, bool withUndo = false, PatternAdvanceInterface* advanceImpl = NULL); bool writeEffectNumber(pp_uint8 value, bool withUndo = false, PatternAdvanceInterface* advanceImpl = NULL); bool writeEffectOperand(NibbleTypes nibleType, pp_uint8 value, bool withUndo = false, PatternAdvanceInterface* advanceImpl = NULL); bool writeEffect(pp_int32 effNum, pp_uint8 eff, pp_uint8 op, bool withUndo = false, PatternAdvanceInterface* advanceImpl = NULL); // --- write through, without undo etc. ---------------------------------- void writeDirectEffect(pp_int32 effNum, pp_uint8 eff, pp_uint8 op, pp_int32 track = -1, pp_int32 row = -1, pp_int32 order = -1); // --- dealing with FT2 style effect macros ------------------------------ void storeMacroFromCursor(pp_int32 slot); void writeMacroToCursor(pp_int32 slot, PatternAdvanceInterface* advanceImpl = NULL); void getMacroOperands(pp_int32 slot, pp_uint8& eff, pp_uint8& op); void setMacroOperands(pp_int32 slot, pp_uint8 eff, pp_uint8 op); // --- deleting slot data ------------------------------------------------ void deleteCursorSlotData(PatternAdvanceInterface* advanceImpl = NULL); void deleteCursorSlotDataEntire(PatternAdvanceInterface* advanceImpl = NULL); void deleteCursorSlotDataVolumeAndEffect(PatternAdvanceInterface* advanceImpl = NULL); void deleteCursorSlotDataEffect(PatternAdvanceInterface* advanceImpl = NULL); // --- inserting/deleting entire rows ------------------------------------ void insertNote(pp_int32 channel, pp_int32 row); void insertLine(pp_int32 row); void deleteNote(pp_int32 channel, pp_int32 row); void deleteLine(pp_int32 row); }; #endif milkytracker-0.90.85+dfsg/src/tracker/SystemMessage.h0000644000175000017500000000233311150223367021610 0ustar admin2admin2/* * tracker/SystemMessage.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SystemMessage.h * MilkyTracker * * Created by Peter Barth on 27.12.07. * */ #ifndef __SYSTEMMESSAGE_H__ #define __SYSTEMMESSAGE_H__ #include "BasicTypes.h" class SystemMessage { private: class PPScreen& screen; pp_uint32 message; public: enum Messages { MessageSoundDriverInitFailed, MessageFullScreenFailed, MessageResChangeRestart, MessageLimitedInput }; SystemMessage(PPScreen& screen, Messages message); void show(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/InputControlListener.h0000644000175000017500000000327611150223367023174 0ustar admin2admin2/* * tracker/InputControlListener.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * InputControlListener.h * MilkyTracker * * Created by Peter Barth on 22.04.05. * */ #ifndef INPUTCONTROLLISTENER__H #define INPUTCONTROLLISTENER__H #include "BasicTypes.h" #include "Event.h" class Tracker; class InputControlListener : public EventListenerInterface { private: Tracker& tracker; bool capsLockPressed; bool lShiftPressed; bool rShiftPressed; bool uppercase() { return !(capsLockPressed | lShiftPressed | rShiftPressed); } void refreshSIP(); public: enum { KEY_PRESS = 0, KEY_RELEASE = 0x10000 }; InputControlListener(Tracker& theTracker) : tracker(theTracker), capsLockPressed(false), lShiftPressed(false), rShiftPressed(false) { } void sendKey(EEventDescriptor event, pp_uint16 vk, pp_uint16 sc, pp_uint16 chr); void sendNote(pp_int32 note, pp_int32 volume = -1); // PPEvent listener pp_int32 handleEvent(PPObject* sender, PPEvent* event); void handleModifiers(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionSamples.h0000644000175000017500000000530111150223367021746 0ustar admin2admin2/* * tracker/SectionSamples.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionSamples.h * MilkyTracker * * Created by Peter Barth on 15.04.05. * */ #ifndef SECTIONSAMPLES__H #define SECTIONSAMPLES__H #include "BasicTypes.h" #include "Event.h" #include "SectionAbstract.h" class PPControl; class SampleEditorControl; class SectionSamples : public SectionAbstract { private: PPContainer* containerEntire; bool visible; SampleEditorControl* sampleEditorControl; pp_int32 currentSamplePlayNote; PPSize oldInstrumentListSize; PPPoint oldInstrumentListLocation; PPSize oldSampleListSize; PPPoint oldSampleListLocation; PPSize oldInstrumentListContainerSize; PPPoint oldInstrumentListContainerLocation; PPPoint p[4]; bool showRangeOffsets; pp_uint32 offsetFormat; protected: virtual void showSection(bool bShow); public: SectionSamples(Tracker& tracker); virtual ~SectionSamples(); // PPEvent listener virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init(); virtual void init(pp_int32 x, pp_int32 y); void realign(); virtual void show(bool bShow); virtual void update(bool repaint = true); virtual void notifyTabSwitch(); void refresh(bool repaint = true); void realUpdate(bool repaint, bool force, bool reAttach); void updateSampleWindow(bool repaint = true); void updateAfterLoad(); SampleEditorControl* getSampleEditorControl(bool forceAttach = true); void resetSampleEditor(); bool isEmptySample(); void setOffsetFormat(pp_uint32 offsetFormat); pp_uint32 getOffsetFormat() const { return offsetFormat; } void toggleOffsetFormat(); pp_int32 getCurrentSamplePlayNote() const { return currentSamplePlayNote; } bool isVisible() const { return visible; } void setOffsetText(pp_uint32 ID, pp_uint32 offset); private: void handleClearSample(); void handleCropSample(); void handleMinimizeSample(); void handleConvertSampleResolution(); // Responder should be friend friend class DialogResponderSamples; friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/DialogPanning.cpp0000755000175000017500000001604111150223367022070 0ustar admin2admin2/* * tracker/DialogPanning.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogPanning.cpp * MilkyTracker * * Created by Peter Barth on 03.03.06. * */ #include "DialogPanning.h" #include "Tracker.h" #include "TrackerConfig.h" #include "Screen.h" #include "ControlIDs.h" #include "MessageBoxContainer.h" #include "Button.h" #include "Slider.h" #include "StaticText.h" #include "Seperator.h" enum { BUTTON_PANNING_AMIGA = 1000, BUTTON_PANNING_MILKY, BUTTON_PANNING_MONO, SLIDER_PANNING_BASE }; DialogPanning::DialogPanning(PPScreen* theScreen, EventListenerInterface* theEventListener, pp_uint32 channels) : PPDialogBase(), eventListener(theEventListener), panning(NULL), numChannels(channels) { parentScreen = theScreen; init(); } DialogPanning::~DialogPanning() { delete[] panning; } // PPEvent listener pp_int32 DialogPanning::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eCommand) { switch (reinterpret_cast(sender)->getID()) { case PP_MESSAGEBOX_BUTTON_YES: { PPEvent e(eConfirmed); eventListener->handleEvent(reinterpret_cast(this), &e); show(false); break; } case PP_MESSAGEBOX_BUTTON_NO: { PPEvent e(eCanceled); eventListener->handleEvent(reinterpret_cast(this), &e); show(false); break; } case BUTTON_PANNING_AMIGA: applyPanningAmiga(); break; case BUTTON_PANNING_MILKY: applyPanningMilky(); break; case BUTTON_PANNING_MONO: applyPanningMono(); break; } } else if (event->getID() == eValueChanged) { pp_uint32 id = reinterpret_cast(sender)->getID(); if (id >= SLIDER_PANNING_BASE && id < (SLIDER_PANNING_BASE + numChannels)) { pp_int32 i = id - SLIDER_PANNING_BASE; panning[i] = (pp_uint8)reinterpret_cast(sender)->getCurrentValue(); PPEvent e(eValueChanged, &i, sizeof(i)); eventListener->handleEvent(reinterpret_cast(this), &e); } } return 0; } void DialogPanning::init() { const pp_int32 maxChannels = numChannels; pp_int32 width = 290; pp_int32 height = 234; pp_int32 x = parentScreen->getWidth() / 2 - width/2; pp_int32 y = parentScreen->getHeight() / 2 - height/2; messageBoxContainerGeneric = new PPMessageBoxContainer(MESSAGEBOX_PANNINGSELECT, parentScreen, this, PPPoint(x, y), PPSize(width,height), "Global Panning"); pp_int32 y2 = y + 18; char buffer[80]; pp_int32 i; for (i = 0; i < maxChannels/2; i++) { PPSlider* slider = new PPSlider(SLIDER_PANNING_BASE+i, parentScreen, this, PPPoint(x + 4+6*8+4+4+1, y2), (width>>1)-(6*8+8+4+4+1+10), true); slider->setMaxValue(255); slider->setBarSize(16384); messageBoxContainerGeneric->addControl(slider); sprintf(buffer, "Ch:%02d L R", i+1); messageBoxContainerGeneric->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), buffer, true)); y2+=12; } y2 = y + 18; pp_int32 x2 = x+(width>>1); for (i = 0; i < maxChannels/2; i++) { PPSlider* slider = new PPSlider(SLIDER_PANNING_BASE+i+(maxChannels/2), parentScreen, this, PPPoint(x2 + 4+6*8+4+4+1, y2), (width>>1)-(6*8+8+4+4+1+10), true); slider->setMaxValue(255); slider->setBarSize(16384); messageBoxContainerGeneric->addControl(slider); sprintf(buffer, "Ch:%02d L R", i+1+(maxChannels/2)); messageBoxContainerGeneric->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 4, y2), buffer, true)); y2+=12; } y2 = y + height - 17; PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_YES, parentScreen, this, PPPoint(x+width - 60 - 57, y2), PPSize(54, 11)); button->setText("Okay"); messageBoxContainerGeneric->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_NO, parentScreen, this, PPPoint(x+width - 60, y2), PPSize(54, 11)); button->setText("Cancel"); messageBoxContainerGeneric->addControl(button); messageBoxContainerGeneric->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 7, y2+2), "Predef", true)); button = new PPButton(BUTTON_PANNING_AMIGA, parentScreen, this, PPPoint(x+7+6*8+2, y2), PPSize(32, 11)); button->setText("Amiga"); messageBoxContainerGeneric->addControl(button); button = new PPButton(BUTTON_PANNING_MILKY, parentScreen, this, PPPoint(x+7+6*8+2+33, y2), PPSize(32, 11)); button->setText("Milky"); messageBoxContainerGeneric->addControl(button); button = new PPButton(BUTTON_PANNING_MONO, parentScreen, this, PPPoint(x+7+6*8+2+33*2, y2), PPSize(32, 11)); button->setText("Mono"); messageBoxContainerGeneric->addControl(button); messageBoxContainerGeneric->addControl(new PPSeperator(0, parentScreen, PPPoint(x+5+6*8+2+33*3 + 8, y2 - 5), 18, messageBoxContainerGeneric->getColor(), false)); messageBoxContainerGeneric->addControl(new PPSeperator(0, parentScreen, PPPoint(x+2, y2 - 6), messageBoxContainerGeneric->getSize().width - 5, messageBoxContainerGeneric->getColor(), true)); panning = new pp_uint8[maxChannels]; } void DialogPanning::setPanning(pp_uint32 chn, pp_uint8 pan, bool repaint/* = true*/) { if (panning == NULL) return; if (chn >= numChannels) return; panning[chn] = pan; PPSlider* slider = static_cast(messageBoxContainerGeneric->getControlByID(SLIDER_PANNING_BASE+chn)); if (slider == NULL) return; slider->setCurrentValue(pan); if (repaint && slider->isVisible()) parentScreen->paintControl(slider); } void DialogPanning::applyPanningAmiga() { for (pp_uint32 i = 0; i < numChannels; i++) { pp_uint8 pan = 0; switch (i & 3) { case 0: pan = 0; break; case 1: pan = 255; break; case 2: pan = 255; break; case 3: pan = 0; break; } setPanning(i, pan, false); PPEvent e(eValueChanged, &i, sizeof(i)); eventListener->handleEvent(reinterpret_cast(this), &e); } parentScreen->paintControl(messageBoxContainerGeneric); } void DialogPanning::applyPanningMilky() { for (pp_uint32 i = 0; i < numChannels; i++) { setPanning(i, i & 1 ? 192 : 64, false); PPEvent e(eValueChanged, &i, sizeof(i)); eventListener->handleEvent(reinterpret_cast(this), &e); } parentScreen->paintControl(messageBoxContainerGeneric); } void DialogPanning::applyPanningMono() { for (pp_uint32 i = 0; i < numChannels; i++) { setPanning(i, 128, false); PPEvent e(eValueChanged, &i, sizeof(i)); eventListener->handleEvent(reinterpret_cast(this), &e); } parentScreen->paintControl(messageBoxContainerGeneric); } milkytracker-0.90.85+dfsg/src/tracker/SectionQuickOptions.cpp0000644000175000017500000003431011150223367023327 0ustar admin2admin2/* * tracker/SectionQuickOptions.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionQuickOptions.cpp * MilkyTracker * * Created by Peter Barth on 10.05.05. * */ #include "SectionQuickOptions.h" #include "Tracker.h" #include "TrackerConfig.h" #include "PlayerController.h" #include "PlayerMaster.h" #include "PlayerSTD.h" #include "CheckBox.h" #include "RadioGroup.h" #include "StaticText.h" #include "Seperator.h" #include "Container.h" #include "DialogPanning.h" #include "ControlIDs.h" enum ControlIDs { CONTAINER_QUICKOPTIONS = 7000, QUICKOPTIONS_BUTTON_EXIT, QUICKOPTIONS_RADIOGROUP_PLAYBACKMODE, QUICKOPTIONS_STATICTEXT_ALLOW8XX, QUICKOPTIONS_CHECKBOX_ALLOW8XX, QUICKOPTIONS_STATICTEXT_ALLOWE8X, QUICKOPTIONS_CHECKBOX_ALLOWE8X, QUICKOPTIONS_STATICTEXT_PTPERIODRANGE, QUICKOPTIONS_CHECKBOX_PTPERIODRANGE, QUICKOPTIONS_STATICTEXT_SETDEFAULTPANNING, QUICKOPTIONS_BUTTON_SETDEFAULTPANNING, QUICKOPTIONS_STATICTEXT_KEEPOPTIONS, QUICKOPTIONS_CHECKBOX_KEEPOPTIONS, QUICKOPTIONS_CHECKBOX_FOLLOWSONG }; SectionQuickOptions::SectionQuickOptions(Tracker& theTracker) : SectionUpperLeft(theTracker), checkBoxKeepSettings(NULL), dialogPanning(NULL), oldPanning(NULL) { } SectionQuickOptions::~SectionQuickOptions() { delete[] oldPanning; delete dialogPanning; } pp_int32 SectionQuickOptions::handleEvent(PPObject* sender, PPEvent* event) { bool b; if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case QUICKOPTIONS_BUTTON_EXIT: if (event->getID() != eCommand) break; show(false); break; case QUICKOPTIONS_CHECKBOX_ALLOW8XX: if (event->getID() != eCommand) break; b = tracker.playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionPanning8xx); tracker.playerController->enablePlayModeOption(PlayerController::PlayModeOptionPanning8xx, !b); break; case QUICKOPTIONS_CHECKBOX_ALLOWE8X: if (event->getID() != eCommand) break; b = tracker.playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionPanningE8x); tracker.playerController->enablePlayModeOption(PlayerController::PlayModeOptionPanningE8x, !b); break; case QUICKOPTIONS_CHECKBOX_PTPERIODRANGE: if (event->getID() != eCommand) break; b = tracker.playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionForcePTPitchLimit); tracker.playerController->enablePlayModeOption(PlayerController::PlayModeOptionForcePTPitchLimit, !b); break; case QUICKOPTIONS_BUTTON_SETDEFAULTPANNING: { if (event->getID() != eCommand) break; saveOldPanning(); for (pp_int32 i = 0; i < TrackerConfig::numPlayerChannels; i++) dialogPanning->setPanning((pp_uint8)i, tracker.playerController->getPanning((pp_uint8)i), false); dialogPanning->show(true); break; } case QUICKOPTIONS_CHECKBOX_KEEPOPTIONS: if (event->getID() != eCommand) break; if (checkBoxKeepSettings->isChecked()) tracker.showMessageBoxSized(MESSAGEBOX_UNIVERSAL, "Play mode auto-switching is now OFF\nRemember, these settings will now\napply to all loaded modules.", Tracker::MessageBox_OK); break; } } else if (event->getID() == eSelection) { switch (reinterpret_cast(sender)->getID()) { case QUICKOPTIONS_RADIOGROUP_PLAYBACKMODE: switch (reinterpret_cast(sender)->getChoice()) { case 0: tracker.playerController->switchPlayMode(PlayerController::PlayMode_FastTracker2, !keepSettings()); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_CHECKBOX_PTPERIODRANGE)->enable(false); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_PTPERIODRANGE)->enable(false); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_SETDEFAULTPANNING)->enable(false); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_BUTTON_SETDEFAULTPANNING)->enable(false); break; case 1: tracker.playerController->switchPlayMode(PlayerController::PlayMode_ProTracker2, !keepSettings()); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_CHECKBOX_PTPERIODRANGE)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_PTPERIODRANGE)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_SETDEFAULTPANNING)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_BUTTON_SETDEFAULTPANNING)->enable(true); break; case 2: tracker.playerController->switchPlayMode(PlayerController::PlayMode_ProTracker3, !keepSettings()); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_CHECKBOX_PTPERIODRANGE)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_PTPERIODRANGE)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_SETDEFAULTPANNING)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_BUTTON_SETDEFAULTPANNING)->enable(true); break; default: ASSERT(false); } update(); break; } } else if (event->getID() == eValueChanged && reinterpret_cast(sender) == dialogPanning) { pp_uint32 i = *(reinterpret_cast(event->getDataPtr())); tracker.playerController->setPanning((pp_uint8)i, dialogPanning->getPanning(i)); } else if (event->getID() == eCanceled) { if (reinterpret_cast(sender) == dialogPanning) { restoreOldPanning(); } } return 0; } void SectionQuickOptions::init(pp_int32 px, pp_int32 py) { PPCheckBox* checkBox; PPScreen* screen = tracker.screen; if (dialogPanning == NULL) dialogPanning = new DialogPanning(screen, this, TrackerConfig::numPlayerChannels); PPContainer* container = new PPContainer(CONTAINER_QUICKOPTIONS, tracker.screen, this, PPPoint(px, py), PPSize(320,UPPERLEFTSECTIONHEIGHT), false); container->setColor(TrackerConfig::colorThemeMain); tracker.screen->addControl(container); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(px + 2, py + 2), "Quick Options (experts only)", true, true)); PPSize size = container->getSize(); pp_int32 buttonWidth = 8*4+4; pp_int32 buttonHeight = 11; pp_int32 x = px+container->getSize().width-(buttonWidth+4); pp_int32 y = py+container->getSize().height-(buttonHeight+4); container->addControl(new PPSeperator(0, screen, PPPoint(x - 6, y - 4), 4 + buttonHeight + 3, TrackerConfig::colorThemeMain, false)); container->addControl(new PPSeperator(0, screen, PPPoint(px + 2, y - 4), container->getSize().width - 4, TrackerConfig::colorThemeMain, true)); PPButton* button = new PPButton(QUICKOPTIONS_BUTTON_EXIT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Exit"); container->addControl(button); pp_int32 x2 = px+4; pp_int32 y2 = py+4+12; y+=2; container->addControl(new PPStaticText(QUICKOPTIONS_STATICTEXT_KEEPOPTIONS, NULL, NULL, PPPoint(x2 + 2, y), "Keep settings (auto-adjust OFF)", true)); checkBoxKeepSettings = new PPCheckBox(QUICKOPTIONS_CHECKBOX_KEEPOPTIONS, screen, this, PPPoint(x2 + 2 + 31*8 + 4, y-1)); checkBoxKeepSettings->checkIt(false); container->addControl(checkBoxKeepSettings); // add playback modes container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "Playback mode:", true)); y2+=10; PPRadioGroup* radioGroup = new PPRadioGroup(QUICKOPTIONS_RADIOGROUP_PLAYBACKMODE, screen, this, PPPoint(x2+2, y2), PPSize(17*8, 3*14)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("Fasttracker 2.x"); radioGroup->addItem("Protracker 2.x"); radioGroup->addItem("Protracker 3.x"); container->addControl(radioGroup); y2+=radioGroup->getSize().height; x2 += radioGroup->getSize().width+6; y2 = py + 16; container->addControl(new PPSeperator(0, screen, PPPoint(x2 - 4, y2 - 2), container->getLocation().y + container->getSize().height - y2 - 17, TrackerConfig::colorThemeMain, false)); y2 = py+4+12; x2+=2; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "Advanced:", true)); y2+=15; container->addControl(new PPStaticText(QUICKOPTIONS_STATICTEXT_ALLOW8XX, NULL, NULL, PPPoint(x2, y2), "Allow 8xx panning", true)); checkBox = new PPCheckBox(QUICKOPTIONS_CHECKBOX_ALLOW8XX, screen, this, PPPoint(x2 + 19*8 + 4, y2-1)); container->addControl(checkBox); y2+=13; container->addControl(new PPStaticText(QUICKOPTIONS_STATICTEXT_ALLOWE8X, NULL, NULL, PPPoint(x2, y2), "Allow E8x panning", true)); checkBox = new PPCheckBox(QUICKOPTIONS_CHECKBOX_ALLOWE8X, screen, this, PPPoint(x2 + 19*8 + 4, y2-1)); container->addControl(checkBox); y2+=13; container->addControl(new PPStaticText(QUICKOPTIONS_STATICTEXT_PTPERIODRANGE, NULL, NULL, PPPoint(x2, y2), "PT 3 octaves limit", true)); checkBox = new PPCheckBox(QUICKOPTIONS_CHECKBOX_PTPERIODRANGE, screen, this, PPPoint(x2 + 19*8 + 4, y2-1)); container->addControl(checkBox); y2+=13; container->addControl(new PPStaticText(QUICKOPTIONS_STATICTEXT_SETDEFAULTPANNING, NULL, NULL, PPPoint(x2, y2), "Default panning", true)); button = new PPButton(QUICKOPTIONS_BUTTON_SETDEFAULTPANNING, screen, this, PPPoint(x2 + 19*8 - 18, y2-1), PPSize(4*8,buttonHeight)); button->setText("Set"); container->addControl(button); sectionContainer = container; initialised = true; showSection(false); } void SectionQuickOptions::updateControlStates() { switch (tracker.playerController->getPlayMode()) { case PlayerBase::PlayMode_ProTracker2: static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_PTPERIODRANGE)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_CHECKBOX_PTPERIODRANGE)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_SETDEFAULTPANNING)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_BUTTON_SETDEFAULTPANNING)->enable(true); break; case PlayerBase::PlayMode_ProTracker3: static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_PTPERIODRANGE)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_CHECKBOX_PTPERIODRANGE)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_SETDEFAULTPANNING)->enable(true); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_BUTTON_SETDEFAULTPANNING)->enable(true); break; case PlayerBase::PlayMode_FastTracker2: static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_PTPERIODRANGE)->enable(false); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_CHECKBOX_PTPERIODRANGE)->enable(false); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_STATICTEXT_SETDEFAULTPANNING)->enable(false); static_cast(sectionContainer)->getControlByID(QUICKOPTIONS_BUTTON_SETDEFAULTPANNING)->enable(false); break; default: ASSERT(false); } } void SectionQuickOptions::show(bool bShow) { if (bShow) { updateControlStates(); } SectionUpperLeft::show(bShow); } void SectionQuickOptions::update(bool repaint/* = true*/) { PPContainer* container = static_cast(sectionContainer); PPRadioGroup* radioGroup = static_cast(container->getControlByID(QUICKOPTIONS_RADIOGROUP_PLAYBACKMODE)); ASSERT(radioGroup); switch (tracker.playerController->getPlayMode()) { case PlayerBase::PlayMode_ProTracker2: radioGroup->setChoice(1); break; case PlayerBase::PlayMode_ProTracker3: radioGroup->setChoice(2); break; case PlayerBase::PlayMode_FastTracker2: radioGroup->setChoice(0); break; default: ASSERT(false); } PPCheckBox* checkBox = static_cast(container->getControlByID(QUICKOPTIONS_CHECKBOX_ALLOW8XX)); checkBox->checkIt(tracker.playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionPanning8xx)); checkBox = static_cast(container->getControlByID(QUICKOPTIONS_CHECKBOX_ALLOWE8X)); checkBox->checkIt(tracker.playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionPanningE8x)); checkBox = static_cast(container->getControlByID(QUICKOPTIONS_CHECKBOX_PTPERIODRANGE)); checkBox->checkIt(tracker.playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionForcePTPitchLimit)); if (repaint) tracker.screen->paintControl(container); } void SectionQuickOptions::notifyTabSwitch() { if (sectionContainer->isVisible()) { updateControlStates(); update(false); } } bool SectionQuickOptions::setKeepSettings(bool b) { if (checkBoxKeepSettings) { checkBoxKeepSettings->checkIt(b); return true; } return false; } bool SectionQuickOptions::keepSettings() { if (checkBoxKeepSettings) { return checkBoxKeepSettings->isChecked(); } return false; } void SectionQuickOptions::saveOldPanning() { if (oldPanning == NULL) oldPanning = new pp_uint8[TrackerConfig::numPlayerChannels]; for (pp_int32 i = 0; i < TrackerConfig::numPlayerChannels; i++) oldPanning[i] = tracker.playerController->getPanning((pp_uint8)i); } void SectionQuickOptions::restoreOldPanning() { if (oldPanning == NULL) return; for (pp_int32 i = 0; i < TrackerConfig::numPlayerChannels; i++) tracker.playerController->setPanning((pp_uint8)i, oldPanning[i]); } milkytracker-0.90.85+dfsg/src/tracker/ColorPaletteContainer.h0000644000175000017500000000276211150223367023265 0ustar admin2admin2/* * tracker/ColorPaletteContainer.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ColorPaletteContainer.h * MilkyTracker * * Created by Peter Barth on 21.11.05. * */ #ifndef COLORPALETTECONTAINER__H #define COLORPALETTECONTAINER__H #include "BasicTypes.h" // Verx simple color palette, limited colors struct TColorPalette { // Should be more than enough pp_uint8 numColors; PPColor colors[256]; }; class ColorPaletteContainer { private: TColorPalette* palettes; pp_int32 numPalettes; public: ColorPaletteContainer(pp_int32 num); ~ColorPaletteContainer(); void store(pp_int32 index, const TColorPalette& palette); const TColorPalette* restore(pp_int32 index); static PPString encodePalette(const TColorPalette& palette); static TColorPalette decodePalette(const PPString& str); }; #endif milkytracker-0.90.85+dfsg/src/tracker/DialogQuickChooseInstrument.cpp0000755000175000017500000002412311150223367025004 0ustar admin2admin2/* * tracker/DialogQuickChooseInstrument.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogWithValues.cpp * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #include "DialogQuickChooseInstrument.h" #include "Screen.h" #include "StaticText.h" #include "MessageBoxContainer.h" #include "Font.h" #include "ListBox.h" #include "Seperator.h" DialogQuickChooseInstrument::DialogQuickChooseInstrument(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption) : PPDialogBase() { value = 0; valueRangeStart = 0; valueRangeEnd = 0xFF; valueIncreaseStep = 1; #ifdef __LOWRES__ initDialog(screen, responder, id, caption, 290, 110+15, 26+15, "Ok", "Cancel"); #else initDialog(screen, responder, id, caption, 290, 110, 26, "Ok", "Cancel"); #endif pp_int32 x = getMessageBoxContainer()->getLocation().x; pp_int32 width = getMessageBoxContainer()->getSize().width; pp_int32 x2 = x; pp_int32 y2 = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y; PPButton* button; //setValueOneCaption("Enter new volume in percent"); y2 +=20+12; // enter edit field 1 x2 = x + width / 2 - (100+35)/2; PPListBox* listBox = new PPListBox(MESSAGEBOX_LISTBOX_VALUE_ONE, screen, this, PPPoint(x2, y2), PPSize(100,12), true, true, false); listBox->showSelection(false); listBox->setBorderColor(messageBoxContainerGeneric->getColor()); listBox->setMaxEditSize(8); messageBoxContainerGeneric->addControl(listBox); button = new PPButton(MESSAGEBOX_BUTTON_INCREASE_VALUEONE, screen, this, PPPoint(x2 + listBox->getSize().width + 2, y2), PPSize(16, 11)); button->setText("+"); messageBoxContainerGeneric->addControl(button); button = new PPButton(MESSAGEBOX_BUTTON_DECREASE_VALUEONE, screen, this, PPPoint(x2 + listBox->getSize().width + 2 + button->getSize().width + 1, y2), PPSize(16, 11)); button->setText("-"); messageBoxContainerGeneric->addControl(button); #ifdef __LOWRES__ pp_int32 height = getMessageBoxContainer()->getSize().height; pp_int32 y = getMessageBoxContainer()->getLocation().y; const char buttonTexts[] = {'1','2','3','4','5','6','7','8','9','0','+','-','.','<','>'}; pp_int32 bWidth = (width - 22*2 - 2*3) / sizeof(buttonTexts); pp_int32 x2_2 = x+4; pp_int32 y2_2 = y+height - 4 - 13; messageBoxContainerGeneric->addControl(new PPSeperator(0, screen, PPPoint(x2_2-1, y2_2-3), width-2*3, messageBoxContainerGeneric->getColor(), true)); pp_uint32 i = 0; for (i = 0; i < sizeof(buttonTexts); i++) { button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1, 13)); button->setText(buttonTexts[i]); messageBoxContainerGeneric->addControl(button); x2_2+=bWidth; } bWidth = 22; button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1-3, 13)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Del"); messageBoxContainerGeneric->addControl(button); x2_2+=bWidth-3; i++; button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1, 13)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Back"); messageBoxContainerGeneric->addControl(button); #endif fitListBoxes(); updateListBoxes(); } void DialogQuickChooseInstrument::setValueCaption(const PPString& caption) { PPControl* ctrl = messageBoxContainerGeneric->getControlByID(MESSAGEBOX_STATICTEXT_VALUE_ONE_CAPTION); if (ctrl) messageBoxContainerGeneric->removeControl(ctrl); pp_int32 width = messageBoxContainerGeneric->getSize().width; pp_int32 x = messageBoxContainerGeneric->getLocation().x; pp_int32 y = messageBoxContainerGeneric->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y; y+=20; x += width / 2 - (PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(caption) / 2); messageBoxContainerGeneric->addControl(new PPStaticText(MESSAGEBOX_STATICTEXT_VALUE_ONE_CAPTION, parentScreen, this, PPPoint(x, y), caption, true)); } void DialogQuickChooseInstrument::show(bool b/* = true*/) { if (b) listBoxEnterEditState(MESSAGEBOX_LISTBOX_VALUE_ONE); PPDialogBase::show(b); } pp_uint16 DialogQuickChooseInstrument::numPadKeyToValue(pp_uint16 keyCode) { switch (keyCode) { case VK_NUMPAD0: return 0; case VK_NUMPAD1: return 1; case VK_NUMPAD2: return 2; case VK_NUMPAD3: return 3; case VK_NUMPAD4: return 4; case VK_NUMPAD5: return 5; case VK_NUMPAD6: return 6; case VK_NUMPAD7: return 7; case VK_NUMPAD8: return 8; case VK_NUMPAD9: return 9; case VK_DIVIDE: return 0x0A; case VK_MULTIPLY: return 0x0B; case VK_SUBTRACT: return 0x0C; case VK_ADD: return 0x0D; case VK_SEPARATOR: return 0x0E; case VK_DECIMAL: return 0x0F; default: return 0xFFFF; } } static pp_uint8 getNibble(const char* str) { if (*str >= '0' && *str <= '9') return (*str - '0'); if (*str >= 'A' && *str <= 'F') return (*str - 'A' + 10); if (*str >= 'a' && *str <= 'f') return (*str - 'a' + 10); return 0; } static pp_uint8 getByte(const char* str) { return (getNibble(str)<<4) + getNibble(str+1); } pp_int32 DialogQuickChooseInstrument::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eKeyChar) { event->cancel(); } else if (event->getID() == eKeyDown) { PPDialogBase::handleEvent(sender, event); if (event->getID() == eInvalid) return 0; pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); pp_uint16 chr = numPadKeyToValue(keyCode); if (chr <= 0xF) { PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); const char* transTab = "0123456789abcdef"; chr = transTab[chr]; listBox->dispatchEvent(event); PPEvent event2(eKeyChar, &chr, sizeof(chr)); listBox->dispatchEvent(&event2); if (listBox->getItem(0).length() == 2) { commitChanges(); PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_YES)); if (button) { PPEvent event(eCommand); PPDialogBase::handleEvent(reinterpret_cast(button), &event); } } return 0; } } else if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case PP_MESSAGEBOX_BUTTON_YES: { commitChanges(); break; } case MESSAGEBOX_BUTTON_INCREASE_VALUEONE: { setValue(value+valueIncreaseStep); parentScreen->paintControl(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); break; } case MESSAGEBOX_BUTTON_DECREASE_VALUEONE: { setValue(value-valueIncreaseStep); parentScreen->paintControl(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); break; } } } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { // song title case MESSAGEBOX_LISTBOX_VALUE_ONE: { const PPString* str = *(reinterpret_cast(event->getDataPtr())); setValue(getByte(*str)); break; } } } return PPDialogBase::handleEvent(sender, event); } void DialogQuickChooseInstrument::fitListBoxes() { fitListBox(MESSAGEBOX_LISTBOX_VALUE_ONE, valueRangeStart, valueRangeEnd); } void DialogQuickChooseInstrument::fitListBox(pp_int32 id, pp_int32 valueOneRangeStart, pp_int32 valueOneRangeEnd) { pp_int32 width = messageBoxContainerGeneric->getSize().width; pp_int32 x = messageBoxContainerGeneric->getLocation().x; char buffer1[100]; char buffer2[100]; sprintf(buffer1, "%%x"); PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(id)); if (listBox) { sprintf(buffer2, buffer1, valueRangeStart); pp_int32 len = (pp_int32)strlen(buffer2)+1; sprintf(buffer2, buffer1, valueRangeEnd); if ((pp_int32)strlen(buffer2)+1 > len) len = (pp_int32)strlen(buffer2)+1; pp_int32 y2 = listBox->getLocation().y; pp_int32 x2 = x + width / 2 - ((len*8)+10+35)/2; listBox->setLocation(PPPoint(x2, y2)); listBox->setSize(PPSize(len*8+10, listBox->getSize().height)); x2+=listBox->getSize().width + 2; PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(id+1)); y2 = button->getLocation().y; button->setLocation(PPPoint(x2, y2)); x2+=button->getSize().width+1; button = static_cast(messageBoxContainerGeneric->getControlByID(id+2)); y2 = button->getLocation().y; button->setLocation(PPPoint(x2, y2)); } } void DialogQuickChooseInstrument::updateListBoxes() { updateListBox(MESSAGEBOX_LISTBOX_VALUE_ONE, value); } void DialogQuickChooseInstrument::updateListBox(pp_int32 id, pp_int32 val) { char buffer1[100]; char buffer2[100]; sprintf(buffer1, "%%x"); PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(id)); if (listBox) { sprintf(buffer2, buffer1, val); listBox->clear(); listBox->addItem(buffer2); } } void DialogQuickChooseInstrument::commitChanges() { PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); if (listBox) listBox->commitChanges(); } void DialogQuickChooseInstrument::listBoxEnterEditState(pp_int32 id) { PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(id)); if (listBox) listBox->placeCursorAtEnd(); } milkytracker-0.90.85+dfsg/src/tracker/DialogGroupSelection.cpp0000755000175000017500000000523511150223367023443 0ustar admin2admin2/* * tracker/DialogGroupSelection.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogGroupSelection.cpp * MilkyTracker * * Created by Peter Barth on 23.06.06. * */ #include "DialogGroupSelection.h" #include "SimpleVector.h" #include "Font.h" #include "MessageBoxContainer.h" #include "ListBox.h" #include "RadioGroup.h" DialogGroupSelection::DialogGroupSelection(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, const PPSimpleVector& choices) : PPDialogBase() { PPFont* font = PPFont::getFont(PPFont::FONT_SYSTEM); initDialog(screen, responder, id, caption, 290, 74 + choices.size()*(font->getCharHeight() + PPRadioGroup::DefaultSpacerHeight + 1), 26, "Ok", "Cancel"); pp_int32 i, j = 0; j = 0; for (i = 0; i < choices.size(); i++) { pp_int32 size = choices.get(i)->length()*font->getCharWidth() + PPRadioGroup::DefaultRadioWidth; if (size > j) j = size; } pp_int32 x = getMessageBoxContainer()->getLocation().x; pp_int32 width = getMessageBoxContainer()->getSize().width; pp_int32 x2 = x + (width / 2) - (j / 2); pp_int32 y2 = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y; y2+=12; PPRadioGroup* radioGroup = new PPRadioGroup(MESSAGEBOX_CONTROL_USER1, screen, this, PPPoint(x2, y2), PPSize(0,0)); radioGroup->setFont(font); for (i = 0; i < choices.size(); i++) radioGroup->addItem(*choices.get(i)); radioGroup->fitSize(); radioGroup->setColor(getMessageBoxContainer()->getColor()); getMessageBoxContainer()->addControl(radioGroup); selection = 0; } pp_int32 DialogGroupSelection::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eSelection) { switch (reinterpret_cast(sender)->getID()) { case MESSAGEBOX_CONTROL_USER1: this->selection = reinterpret_cast(sender)->getChoice(); break; } } return PPDialogBase::handleEvent(sender, event); } milkytracker-0.90.85+dfsg/src/tracker/ColorPaletteContainer.cpp0000644000175000017500000000541611150223367023617 0ustar admin2admin2/* * tracker/ColorPaletteContainer.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ColorPaletteContainer.cpp * MilkyTracker * * Created by Peter Barth on 21.11.05. * */ #include "ColorPaletteContainer.h" #include "PatternTools.h" ColorPaletteContainer::ColorPaletteContainer(pp_int32 num) : palettes(NULL) { palettes = new TColorPalette[num]; memset(palettes, 0, num*sizeof(TColorPalette)); numPalettes = num; } ColorPaletteContainer::~ColorPaletteContainer() { delete[] palettes; } void ColorPaletteContainer::store(pp_int32 index, const TColorPalette& palette) { if (index < 0 || index > numPalettes - 1) return; palettes[index] = palette; } const TColorPalette* ColorPaletteContainer::restore(pp_int32 index) { if (index < 0 || index > numPalettes - 1) return NULL; return palettes + index; } PPString ColorPaletteContainer::encodePalette(const TColorPalette& palette) { char buffer[10]; // Convert number of colors PatternTools::convertToHex(buffer, palette.numColors, 2); PPString str = buffer; for (pp_int32 i = 0; i < palette.numColors; i++) { // R PatternTools::convertToHex(buffer, palette.colors[i].r, 2); str.append(buffer); // G PatternTools::convertToHex(buffer, palette.colors[i].g, 2); str.append(buffer); // B PatternTools::convertToHex(buffer, palette.colors[i].b, 2); str.append(buffer); } return str; } static pp_uint8 getNibble(const char* str) { if (*str >= '0' && *str <= '9') return (*str - '0'); if (*str >= 'A' && *str <= 'F') return (*str - 'A' + 10); if (*str >= 'a' && *str <= 'f') return (*str - 'a' + 10); return 0; } static pp_uint8 getByte(const char* str) { return (getNibble(str)<<4) + getNibble(str+1); } TColorPalette ColorPaletteContainer::decodePalette(const PPString& str) { TColorPalette palette; const char* ptr = str; palette.numColors = getByte(ptr); ptr+=2; for (pp_int32 i = 0; i < palette.numColors; i++) { palette.colors[i].r = getByte(ptr); ptr+=2; palette.colors[i].g = getByte(ptr); ptr+=2; palette.colors[i].b = getByte(ptr); ptr+=2; } return palette; } milkytracker-0.90.85+dfsg/src/tracker/SectionSwitcher.cpp0000755000175000017500000001316511150223367022477 0ustar admin2admin2/* * tracker/SectionSwitcher.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionSwitcher.cpp * MilkyTracker * * Created by Peter Barth on 09.04.08. * */ #include "SectionSwitcher.h" #include "Tracker.h" #include "Screen.h" #include "Container.h" #include "SectionInstruments.h" #include "SectionSamples.h" #include "ScopesControl.h" #include "PatternEditorControl.h" #include "ControlIDs.h" SectionSwitcher::SectionSwitcher(Tracker& tracker) : tracker(tracker), bottomSection(ActiveBottomSectionNone), #ifdef __LOWRES__ lowerSectionPage(ActiveLowerSectionPageMain), #endif currentUpperSection(NULL) { } // General bottom sections show/hide void SectionSwitcher::showBottomSection(ActiveBottomSections section, bool paint/* = true*/) { switch (bottomSection) { case ActiveBottomSectionInstrumentEditor: tracker.sectionInstruments->show(false); break; case ActiveBottomSectionSampleEditor: tracker.sectionSamples->show(false); break; } if (bottomSection != section) bottomSection = section; else bottomSection = ActiveBottomSectionNone; switch (bottomSection) { case ActiveBottomSectionInstrumentEditor: tracker.sectionInstruments->show(true); break; case ActiveBottomSectionSampleEditor: tracker.sectionSamples->show(true); break; case ActiveBottomSectionNone: tracker.rearrangePatternEditorControl(); break; } if (paint) tracker.screen->paint(); } void SectionSwitcher::showUpperSection(SectionAbstract* section, bool hideSIP/* = true*/) { tracker.screen->pauseUpdate(true); if (currentUpperSection) { currentUpperSection->show(false); } if (section) { if (hideSIP) tracker.hideInputControl(); section->show(true); } tracker.screen->pauseUpdate(false); tracker.screen->update(); currentUpperSection = section; } #ifdef __LOWRES__ void SectionSwitcher::showSubMenu(ActiveLowerSectionPages section, bool repaint/* = true*/) { // Hide everything first tracker.showSongSettings(false); tracker.showMainOptions(false); tracker.screen->getControlByID(CONTAINER_INSTRUMENTLIST)->show(false); tracker.screen->getControlByID(CONTAINER_LOWRES_TINYMENU)->show(false); tracker.screen->getControlByID(CONTAINER_LOWRES_JAMMENU)->show(false); tracker.scopesControl->show(false); tracker.screen->getControlByID(CONTAINER_SCOPECONTROL)->show(false); // Last active page was the "Jam"-section so the pattern editor has probably been resized // Check if it was resized and if so, restore original size if (lastLowerSectionPage == ActiveLowerSectionPageJam && section != ActiveLowerSectionPageJam && patternEditorSize != tracker.getPatternEditorControl()->getSize()) { tracker.getPatternEditorControl()->setSize(patternEditorSize); } switch (section) { case ActiveLowerSectionPageMain: tracker.showMainOptions(true); tracker.hideInputControl(false); break; case ActiveLowerSectionPageSong: tracker.showSongSettings(true); tracker.hideInputControl(false); break; case ActiveLowerSectionPageInstruments: tracker.screen->getControlByID(CONTAINER_INSTRUMENTLIST)->show(true); tracker.screen->getControlByID(CONTAINER_LOWRES_TINYMENU)->show(true); tracker.hideInputControl(false); break; case ActiveLowerSectionPageScopes: tracker.scopesControl->show(true); tracker.screen->getControlByID(CONTAINER_SCOPECONTROL)->show(true); tracker.updateScopesControlButtons(); tracker.hideInputControl(false); break; case ActiveLowerSectionPageJam: { PPControl* control = tracker.screen->getControlByID(CONTAINER_LOWRES_JAMMENU); ASSERT(control); patternEditorSize = tracker.getPatternEditorControl()->getSize(); PPSize size(tracker.screen->getWidth(), control->getLocation().y); if (tracker.getPatternEditorControl()->getSize() != size) tracker.getPatternEditorControl()->setSize(size); tracker.hideInputControl(); tracker.screen->getControlByID(CONTAINER_LOWRES_JAMMENU)->show(true); break; } } if (repaint) tracker.screen->paint(); } void SectionSwitcher::switchToSubMenu(ActiveLowerSectionPages lsPageNew) { // same page, nothing to do if (lsPageNew == lowerSectionPage) return; // remember what was currently active lastLowerSectionPage = lowerSectionPage; // apply new page lowerSectionPage = lsPageNew; updateSubMenusButtons(false); // make it visible showSubMenu(lowerSectionPage); } void SectionSwitcher::hideBottomSection() { if (bottomSection != ActiveBottomSectionNone) showBottomSection(ActiveBottomSectionNone, false); } void SectionSwitcher::updateSubMenusButtons(bool repaint/* = true*/) { PPContainer* container = static_cast(tracker.screen->getControlByID(CONTAINER_LOWRES_MENUSWITCH)); for (pp_int32 i = 0; i < tracker.NUMSUBMENUS(); i++) static_cast(container->getControlByID(BUTTON_0+i))->setPressed(false); static_cast(container->getControlByID(BUTTON_0+lowerSectionPage))->setPressed(true); if (repaint) tracker.screen->paintControl(container); } #endif milkytracker-0.90.85+dfsg/src/tracker/DialogPanning.h0000755000175000017500000000302411150223367021532 0ustar admin2admin2/* * tracker/DialogPanning.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogPanning.h * MilkyTracker * * Created by Peter Barth on 03.03.06. * */ #ifndef __DIALOGPANNING_H__ #define __DIALOGPANNING_H__ #include "DialogBase.h" class DialogPanning : public PPDialogBase { private: EventListenerInterface* eventListener; pp_uint8* panning; pp_uint32 numChannels; public: DialogPanning(PPScreen* theScreen, EventListenerInterface* theEventListener, pp_uint32 channels); virtual ~DialogPanning(); // PPEvent listener virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); void setPanning(pp_uint32 chn, pp_uint8 pan, bool repaint = true); pp_uint8 getPanning(pp_uint32 chn) { return panning[chn]; } private: void init(); void applyPanningAmiga(); void applyPanningMilky(); void applyPanningMono(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/TabManager.cpp0000644000175000017500000002261011150223367021353 0ustar admin2admin2/* * tracker/TabManager.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TabManager.cpp * MilkyTracker * * Created by Peter Barth on 20.12.07. * */ #include "TabManager.h" #include "Tracker.h" #include "SimpleVector.h" #include "PlayerMaster.h" #include "PlayerController.h" #include "PlayerLogic.h" #include "ModuleEditor.h" #include "PatternEditor.h" #include "TabHeaderControl.h" #include "TabTitleProvider.h" #include "ControlIDs.h" #include "Screen.h" #include "Container.h" #include "TrackerSettingsDatabase.h" #include "Tools.h" #include "Zapper.h" TabManager::Document::Document(ModuleEditor* moduleEditor, PlayerController* playerController) : moduleEditor(moduleEditor), playerController(playerController) { } TabManager::Document::~Document() { // player controller is deleted from the PlayerMaster delete moduleEditor; } TabManager::TabManager(Tracker& tracker) : tracker(tracker), currentDocument(NULL), stopOnTabSwitch(false), resumeOnTabSwitch(false) { documents = new PPSimpleVector(); } TabManager::~TabManager() { delete documents; } TabHeaderControl* TabManager::getTabHeaderControl() { return static_cast(tracker.screen->getControlByID(TABHEADER_CONTROL)); } ModuleEditor* TabManager::createModuleEditor() { ModuleEditor* moduleEditor = new ModuleEditor(); moduleEditor->createNewSong(tracker.playerController->getPlayMode() == PlayerController::PlayMode_FastTracker2 ? 8 : 4); moduleEditor->setCurrentPatternIndex(moduleEditor->getOrderPosition(0)); return moduleEditor; } PlayerController* TabManager::createPlayerController() { // use "fake" scopes on the PDA // fake scopes are always showing linear interpolated output #ifdef __LOWRES__ PlayerController* playerController = tracker.playerMaster->createPlayerController(true); #else PlayerController* playerController = tracker.playerMaster->createPlayerController(false); #endif if (playerController == NULL) return NULL; applyPlayerDefaults(playerController); return playerController; } void TabManager::applyPlayerDefaults(PlayerController* playerController) { PPString value = tracker.settingsDatabase->restore("PLAYMODE")->getStringValue(); if (value.compareTo("PROTRACKER2") == 0) { playerController->switchPlayMode(PlayerController::PlayMode_ProTracker2, false); } else if (value.compareTo("PROTRACKER3") == 0) { playerController->switchPlayMode(PlayerController::PlayMode_ProTracker3, false); } else { playerController->switchPlayMode(PlayerController::PlayMode_FastTracker2, false); } bool v = tracker.settingsDatabase->restore("PLAYMODE_ADVANCED_ALLOW8xx")->getBoolValue(); playerController->enablePlayModeOption(PlayerController::PlayModeOptionPanning8xx, v); v = tracker.settingsDatabase->restore("PLAYMODE_ADVANCED_ALLOWE8x")->getBoolValue(); playerController->enablePlayModeOption(PlayerController::PlayModeOptionPanningE8x, v); v = tracker.settingsDatabase->restore("PLAYMODE_ADVANCED_PTPITCHLIMIT")->getBoolValue(); playerController->enablePlayModeOption(PlayerController::PlayModeOptionForcePTPitchLimit, v); value = tracker.settingsDatabase->restore("PLAYMODE_ADVANCED_PTPANNING")->getStringValue(); { pp_uint8* panning = new pp_uint8[TrackerConfig::numPlayerChannels]; if (PPTools::decodeByteArray(panning, TrackerConfig::numPlayerChannels, value)) { pp_int32 i; for (i = 0; i < TrackerConfig::numPlayerChannels; i++) playerController->setPanning((pp_uint8)i, panning[i]); } delete[] panning; } } void TabManager::openNewTab(PlayerController* playerController/* = NULL*/, ModuleEditor* moduleEditor/* = NULL*/) { #ifndef __LOWRES__ TabHeaderControl* tabHeader = getTabHeaderControl(); if (playerController == NULL) { playerController = createPlayerController(); if (playerController == NULL) { tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Too many open modules.", Tracker::MessageBox_OK); return; } } if (moduleEditor == NULL) { moduleEditor = createModuleEditor(); } playerController->attachModuleEditor(moduleEditor); moduleEditor->attachPlayerCriticalSection(playerController->getCriticalSection()); playerController->setSpeed(moduleEditor->getSongBPM(), moduleEditor->getSongTickSpeed()); Document* doc = new Document(moduleEditor, playerController); documents->add(doc); TabTitleProvider tabTitleProvider(*moduleEditor); PPString tabTitle = tabTitleProvider.getTabTitle(); tabHeader->addTab(TabHeaderControl::TabHeader(tabTitle, documents->size()-1)); selectModuleEditor(doc); #else if (moduleEditor == NULL || playerController == NULL) return; playerController->attachModuleEditor(moduleEditor); moduleEditor->attachPlayerCriticalSection(playerController->getCriticalSection()); playerController->setSpeed(moduleEditor->getSongBPM(), moduleEditor->getSongTickSpeed()); documents->add(new Document(moduleEditor, playerController)); #endif } void TabManager::switchToTab(pp_uint32 index) { #ifndef __LOWRES__ TabHeaderControl* tabHeader = getTabHeaderControl(); ASSERT(tabHeader); index = tabHeader->getTab(index)->ID; selectModuleEditor(documents->get(index)); #endif } void TabManager::closeTab(pp_int32 index/* = -1*/) { #ifndef __LOWRES__ TabHeaderControl* tabHeader = getTabHeaderControl(); // when there is only a single tab open // we zap the module if it has changed or is not empty if (tabHeader->getNumTabs() <= 1) { if (tracker.moduleEditor->hasChanged() || !tracker.moduleEditor->isEmpty()) { Zapper zapper(tracker); zapper.zapAll(); tracker.updateSongInfo(false); tracker.screen->paint(); } return; } if (index == -1) index = tabHeader->getSelectedTabIndex(); pp_int32 moduleIndex = tabHeader->getTab(index)->ID; bool res = tracker.checkForChanges(documents->get(moduleIndex)->moduleEditor); if (!res) return; TabHeaderControl::TabHeader* tabs = new TabHeaderControl::TabHeader[tabHeader->getNumTabs()]; pp_int32 j = 0; pp_int32 i; for (i = 0; i < (signed)tabHeader->getNumTabs(); i++) { if (i != index) { tabs[j] = *tabHeader->getTab(i); j++; } } tabHeader->clear(); for (i = 0; i < j; i++) { if ((signed)tabs[i].ID > moduleIndex) tabs[i].ID--; } Document* doc = documents->removeNoDestroy(moduleIndex); if (index >= documents->size()) index = documents->size()-1; for (i = 0; i < j; i++) { tabHeader->addTab(tabs[i]); } delete[] tabs; tabHeader->setSelectedTab(index); switchToTab(tabHeader->getTab(index)->ID); if (doc->moduleEditor != tracker.moduleEditor) { tracker.playerMaster->destroyPlayerController(doc->playerController); delete doc; } #endif } void TabManager::selectModuleEditor(Document* document) { #ifndef __LOWRES__ PPContainer* container = static_cast(tracker.screen->getControlByID(CONTAINER_OPENREMOVETABS)); ASSERT(container); TabHeaderControl* tabHeader = getTabHeaderControl(); ASSERT(tabHeader); container->show(tabHeader->getNumTabs() > 1); if (tracker.moduleEditor != document->moduleEditor) { // store current position tracker.moduleEditor->setCurrentCursorPosition(tracker.getPatternEditor()->getCursor()); // switch tracker.moduleEditor = document->moduleEditor; tracker.playerController = document->playerController; if (stopOnTabSwitch) tracker.playerLogic->stopAll(); if (tracker.playerController->isPaused()) { if (!resumeOnTabSwitch) tracker.playerLogic->stopSong(); tracker.playerController->unpause(); } // update tracker.updateAfterTabSwitch(); } currentDocument = document; #endif } ModuleEditor* TabManager::getModuleEditorFromTabIndex(pp_int32 index) { #ifndef __LOWRES__ TabHeaderControl* tabHeader = getTabHeaderControl(); return documents->get(tabHeader->getTab(index)->ID)->moduleEditor; #else return tracker.moduleEditor; #endif } PlayerController* TabManager::getPlayerControllerFromTabIndex(pp_int32 index) { #ifndef __LOWRES__ TabHeaderControl* tabHeader = getTabHeaderControl(); return documents->get(tabHeader->getTab(index)->ID)->playerController; #else return tracker.playerController; #endif } pp_uint32 TabManager::getSelectedTabIndex() { #ifndef __LOWRES__ TabHeaderControl* tabHeader = getTabHeaderControl(); return tabHeader->getSelectedTabIndex(); #else return 0; #endif } void TabManager::cycleTab(pp_int32 offset) { #ifndef __LOWRES__ TabHeaderControl* tabHeader = getTabHeaderControl(); ASSERT(tabHeader); pp_int32 index = tabHeader->getSelectedTabIndex(); index+=offset; if (index >= (signed)tabHeader->getNumTabs()) index = tabHeader->getNumTabs()-1; if (index < 0) index = 0; if (index != tabHeader->getSelectedTabIndex()) { tabHeader->setSelectedTab(index); tracker.screen->paintControl(tabHeader); switchToTab(index); } #endif } pp_int32 TabManager::getNumTabs() const { return documents->size(); } milkytracker-0.90.85+dfsg/src/tracker/TabHeaderControl.cpp0000644000175000017500000002061611150223367022536 0ustar admin2admin2/* * tracker/TabHeaderControl.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TabHeaderControl.cpp * MilkyTracker * * Created by Peter Barth on 09.12.07. * */ #include "TabHeaderControl.h" #include "Event.h" #include "Screen.h" #include "Button.h" #include "Font.h" #include "PPUIConfig.h" #include "GlobalColorConfig.h" void TabHeaderControl::handleTabClick(const PPPoint& p) { pp_int32 hitIndex = -1; for (pp_int32 i = 0; i < tabButtons.size(); i++) { if (tabButtons.get(i)->hit(p)) { hitIndex = i; } } if (hitIndex != -1) { for (pp_int32 i = 0; i < tabButtons.size(); i++) { PPButton* button = tabButtons.get(i); button->setPressed(i == hitIndex); } parentScreen->paintControl(this); this->hitIndex = hitIndex + startIndex; } } TabHeaderControl::TabHeaderControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size) : PPControl(id, parentScreen, eventListener, location, size), color(&PPUIConfig::getInstance()->getColor(PPUIConfig::ColorContainer)), leftButton(NULL), rightButton(NULL), minSize(60), maxSize(200), caughtControl(NULL), startIndex(0) { backgroundButton = new PPButton(0, parentScreen, NULL, location, size, false, false); backgroundButton->setColor(*color); } TabHeaderControl::~TabHeaderControl() { delete backgroundButton; delete leftButton; delete rightButton; } void TabHeaderControl::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; backgroundButton->paint(g); if (leftButton != NULL) { leftButton->enable(startIndex > 0); leftButton->paint(g); } if (rightButton != NULL) { rightButton->enable(startIndex + tabButtons.size() < tabHeaders.size()); rightButton->paint(g); } paintControls(g); } pp_int32 TabHeaderControl::dispatchEvent(PPEvent* event) { switch (event->getID()) { case eLMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (leftButton && leftButton->isEnabled() && leftButton->isVisible() && leftButton->hit(*p)) { caughtControl = leftButton; caughtControl->dispatchEvent(event); } else if (rightButton && rightButton->isEnabled() && rightButton->isVisible() && rightButton->hit(*p)) { caughtControl = rightButton; caughtControl->dispatchEvent(event); } else { oldHitIndex = hitIndex; handleTabClick(*p); } break; } case eLMouseUp: if (caughtControl == NULL) { if (hitIndex != oldHitIndex) { PPEvent e(eSelection, &hitIndex, sizeof(hitIndex)); eventListener->handleEvent(reinterpret_cast(this), &e); } break; } caughtControl->dispatchEvent(event); caughtControl = NULL; break; default: if (caughtControl != NULL) caughtControl->dispatchEvent(event); } return 0; } pp_int32 TabHeaderControl::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case 0: { shiftTabs(-1); break; } case 1: { shiftTabs(); break; } } } return 0; } void TabHeaderControl::setSize(const PPSize& size) { this->size = size; backgroundButton->setSize(size); } void TabHeaderControl::setLocation(const PPPoint& location) { this->location = location; backgroundButton->setLocation(location); } void TabHeaderControl::addTab(const TabHeader& tabHeader) { tabHeaders.add(new TabHeader(tabHeader)); setNumTabs(tabHeaders.size()); setSelectedTab(tabHeaders.size()-1); adjustLabels(); } const TabHeaderControl::TabHeader* TabHeaderControl::getTab(pp_int32 index) const { return (index >= 0 && index < tabHeaders.size()) ? tabHeaders.get(index) : NULL; } bool TabHeaderControl::removeTab(pp_int32 index) { if (index < 0 || index >= tabHeaders.size()) return false; return tabHeaders.remove(index); } void TabHeaderControl::setNumTabs(pp_uint32 numTabs) { pp_int32 width = (size.width - 4) / numTabs; pp_int32 height = size.height - 4; if (minSize && width < minSize) width = minSize; if (maxSize && width > maxSize) width = maxSize; tabButtons.clear(); if ((signed)numTabs*width > size.width - 4) { numTabs = (size.width - (4+12+12)) / minSize; width = (size.width - (4+12+12)) / numTabs; delete leftButton; leftButton = new PPButton(0, parentScreen, this, PPPoint(location.x + size.width - (4+12+12) + 2, location.y + 2), PPSize(12, height), false); leftButton->setText("<"); delete rightButton; rightButton = new PPButton(1, parentScreen, this, PPPoint(location.x + size.width - (4+13) + 3, location.y + 2), PPSize(12, height), false); rightButton->setText(">"); } else { delete rightButton; rightButton = NULL; delete leftButton; leftButton = NULL; } PPPoint location = this->location; location.x += 2; location. y+= 2; for (pp_int32 i = 0; i < (signed)numTabs; i++) { PPButton* button = new PPButton(i+0x1000, parentScreen, this, location, PPSize(width, height), false, true, false); button->setText("Blabla"); button->setColor(*color); button->setAutoSizeFont(false); tabButtons.add(button); location.x+=width; } } void TabHeaderControl::adjustLabels() { for (pp_int32 i = 0; i < tabButtons.size(); i++) { PPButton* button = tabButtons.get(i); PPFont* font = button->getFont(); pp_int32 shrinkWidth = button->getSize().width - 4; if (shrinkWidth < 1) shrinkWidth = 1; PPString text = tabHeaders.get(i + startIndex)->text; if (text.charAt(text.length()-1) == '*') { text = font->shrinkString(text, shrinkWidth - font->getCharWidth(), PPFont::ShrinkTypeEnd); if (text.charAt(text.length()-1) != '*') text.append("*"); } else text = font->shrinkString(text, shrinkWidth, PPFont::ShrinkTypeEnd); button->setText(text); if ((i + startIndex) & 1) button->setTextColor(GlobalColorConfig::getInstance()->getColor(GlobalColorConfig::ColorTextHighlited)); else button->setTextColor(GlobalColorConfig::getInstance()->getColor(GlobalColorConfig::ColorForegroundText)); } } void TabHeaderControl::shiftTabs(pp_int32 offset/* = 1*/, bool repaint/* = true*/) { pp_int32 startIndex = this->startIndex + offset; if (startIndex + tabButtons.size() > tabHeaders.size()) startIndex-= (startIndex + tabButtons.size()) - tabHeaders.size(); if (startIndex < 0) startIndex = 0; if (startIndex != this->startIndex) { for (pp_int32 i = 0; i < tabButtons.size(); i++) tabButtons.get(i)->setPressed(false); pp_int32 newIndex = (signed)hitIndex - startIndex; if (newIndex >= 0 && newIndex < tabButtons.size()) { tabButtons.get(newIndex)->setPressed(true); } this->startIndex = startIndex; adjustLabels(); if (repaint) parentScreen->paintControl(this); } } void TabHeaderControl::assureTabVisible(pp_uint32 index) { pp_int32 newIndex = (signed)index - startIndex; if (newIndex >= 0 && newIndex < tabButtons.size()) return; if (newIndex < 0) { while (newIndex < 0) { startIndex--; newIndex = (signed)index - startIndex; } return; } if (newIndex >= tabButtons.size()) { while (newIndex >= tabButtons.size()) { startIndex++; newIndex = (signed)index - startIndex; } return; } } void TabHeaderControl::setSelectedTab(pp_uint32 index) { hitIndex = index; assureTabVisible(index); for (pp_int32 i = 0; i < tabButtons.size(); i++) tabButtons.get(i)->setPressed(false); pp_int32 newIndex = (signed)index - startIndex; if (newIndex >= 0 && newIndex < tabButtons.size()) { tabButtons.get(newIndex)->setPressed(true); } } void TabHeaderControl::setTabHeaderText(pp_int32 index, const PPString& text) { if (index < 0 || index >= tabHeaders.size()) return; tabHeaders.get(index)->text = text; adjustLabels(); } milkytracker-0.90.85+dfsg/src/tracker/DialogResample.h0000755000175000017500000000462211150223367021715 0ustar admin2admin2/* * tracker/DialogResample.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogResample.h * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #ifndef __DIALOGRESAMPLE_H__ #define __DIALOGRESAMPLE_H__ #include "DialogBase.h" class DialogResample : public PPDialogBase { private: class PPListBox* listBoxes[3]; class PPCheckBox* checkBox; pp_int32 currentSelectedListBox; pp_int32 relnote, finetune; pp_uint32 size, finalSize; pp_uint32 count; float c4spd; float originalc4spd; class ResamplerHelper* resamplerHelper; pp_int32 interpolationType; bool adjustFtAndRelnote; public: DialogResample(PPScreen* screen, DialogResponder* responder, pp_int32 id); virtual ~DialogResample(); virtual void show(bool b = true); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); void setRelNote(pp_int32 note); void setFineTune(pp_int32 ft); void setC4Speed(float c4spd); void setSize(pp_uint32 size); float getC4Speed() const { return c4spd; } pp_int32 getRelNote() const { return relnote; } pp_int32 getFineTune() const { return finetune; } void setInterpolationType(pp_int32 interpolationType) { this->interpolationType = interpolationType; } pp_int32 getInterpolationType() const { return interpolationType; } void setAdjustFtAndRelnote(bool adjustFtAndRelnote) { this->adjustFtAndRelnote = adjustFtAndRelnote; } bool getAdjustFtAndRelnote() const { return adjustFtAndRelnote; } private: void listBoxEnterEditState(pp_int32 id); void updateListBoxes(); void updateListBox(pp_int32 id, float val, pp_int32 numDecimals); void commitChanges(); void switchListBox(); void toC4Speed(); void fromC4Speed(); void calcSize(); void validate(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/FileExtProvider.h0000755000175000017500000000742411150223367022103 0ustar admin2admin2/* * tracker/FileExtProvider.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * FileExtProvider.h * milkytracker_universal * * Created by Peter Barth on 12.07.08. * */ #ifndef __FILEEXTPROVIDER_H__ #define __FILEEXTPROVIDER_H__ #include "BasicTypes.h" #include "SimpleVector.h" class FileExtProvider { private: enum ExtensionTypes { ExtensionTypeAll, ExtensionTypeModules, ExtensionTypeInstruments, ExtensionTypeSamples, ExtensionTypePatterns, ExtensionTypeTracks }; static const char* moduleExtensions[]; static const char* instrumentExtensions[]; static const char* sampleExtensions[]; static const char* patternExtensions[]; static const char* trackExtensions[]; static const char* colorExtensions[]; char** tempList; PPSimpleVector tempExtensions; const char* const* fillList(const char* const* baseList, ExtensionTypes type); public: FileExtProvider() : tempList(NULL) { } ~FileExtProvider() { delete[] tempList; } enum ModuleExtensions { ModuleExtension669, ModuleExtensionAMF, ModuleExtensionAMS, ModuleExtensionCBA, ModuleExtensionDBM, ModuleExtensionDIGI, ModuleExtensionDSM, ModuleExtensionDTM, ModuleExtensionFAR, ModuleExtensionGDM, ModuleExtensionGMC, ModuleExtensionIMF, ModuleExtensionIT, ModuleExtensionMDL, ModuleExtensionMOD, ModuleExtensionMTM, ModuleExtensionMXM, ModuleExtensionOKT, ModuleExtensionPLM, ModuleExtensionPSM, ModuleExtensionPTM, ModuleExtensionS3M, ModuleExtensionSTM, ModuleExtensionULT, ModuleExtensionUNI, ModuleExtensionXM, ModuleExtensionLAST, }; const char* const* getModuleExtensions(); const char* getModuleExtension(ModuleExtensions extension); const char* getModuleDescription(ModuleExtensions extension); enum InstrumentExtensions { InstrumentExtensionXI, InstrumentExtensionPAT, InstrumentExtensionLAST, }; const char* const* getInstrumentExtensions(); const char* getInstrumentExtension(InstrumentExtensions extension); const char* getInstrumentDescription(InstrumentExtensions extension); enum SampleExtensions { SampleExtensionWAV, SampleExtensionIFF, SampleExtension8SVX, SampleExtensionAIF, SampleExtensionAIFF, SampleExtensionLAST }; const char* const* getSampleExtensions(); const char* getSampleExtension(SampleExtensions extension); const char* getSampleDescription(SampleExtensions extension); enum PatternExtensions { PatternExtensionXP, PatternExtensionLAST }; const char* const* getPatternExtensions(); const char* getPatternExtension(PatternExtensions extension); const char* getPatternDescription(PatternExtensions extension); enum TrackExtensions { TrackExtensionXT, TrackExtensionLAST }; const char* const* getTrackExtensions(); const char* getTrackExtension(TrackExtensions extension); const char* getTrackDescription(TrackExtensions extension); enum ColorExtensions { ColorExtensionMCT, ColorExtensionLAST }; const char* const* getColorExtensions(); const char* getColorExtension(ColorExtensions extension); const char* getColorDescription(ColorExtensions extension); }; #endif milkytracker-0.90.85+dfsg/src/tracker/PatternTools.h0000644000175000017500000000530711150223367021461 0ustar admin2admin2/* * tracker/PatternTools.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PATTERNTOOLS__H #define PATTERNTOOLS__H #include "BasicTypes.h" #define TONOTE(octave, note) \ ((((pp_uint8)(octave)*12 + (pp_uint8)(note)) + 1) < 97 ? (((pp_uint8)(octave)*12 + (pp_uint8)(note)) + 1) : -1) class PatternTools { private: pp_int32 offset; pp_int32 currentEffectIndex; struct TXMPattern* pattern; pp_int32 lockOffset; public: PatternTools() : offset(0), currentEffectIndex(0), pattern(NULL) { } PatternTools(const PatternTools& src) { offset = src.offset; currentEffectIndex = src.currentEffectIndex; pattern = src.pattern; } void setPosition(TXMPattern* pattern, pp_uint32 channel, pp_uint32 row); pp_int32 getNote(); void setNote(pp_uint32); pp_int32 getInstrument(); void setInstrument(pp_uint32); void getFirstEffect(pp_int32& effect, pp_int32& operand); void getNextEffect(pp_int32& effect, pp_int32& operand); void setFirstEffect(pp_int32 effect, pp_int32 operand); void setNextEffect(pp_int32 effect, pp_int32 operand); void getEffect(pp_int32 currentEffectIndex, pp_int32& effect, pp_int32& operand); void setEffect(pp_int32 currentEffectIndex, pp_int32 effect, pp_int32 operand); static void convertEffectsToFT2(pp_int32& eff, pp_int32& op); static void convertEffectsFromFT2(pp_int32& eff, pp_int32& op); static pp_int32 getVolumeFromEffect(pp_int32 effect, pp_int32 operand); static void convertVolumeToEffect(pp_int32 vol, pp_int32& eff, pp_int32& op); static void getNoteName(char* name, pp_uint32 note, bool terminate = true); static void getVolumeName(char* name, pp_uint32 volume); static void getEffectName(char* name, pp_uint32 effect); static pp_uint32 getHexNumDigits(pp_uint32 value); static void convertToHex(char* name, pp_uint32 value, pp_uint32 numDigits); static pp_uint32 getDecNumDigits(pp_uint32 value); static void convertToDec(char* name, pp_uint32 value, pp_uint32 numDigits); static pp_uint8 getNoteOffNote(); static pp_uint32 normalizeVol(pp_uint32 volume); }; #endif milkytracker-0.90.85+dfsg/src/tracker/ColorExportImport.h0000755000175000017500000000237411150223367022502 0ustar admin2admin2/* * tracker/ColorExportImport.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ColorExportImport.h * MilkyTracker * * Created by Peter Barth on Sun Mar 13 2005. * */ #ifndef __COLOREXPORTIMPORT_H__ #define __COLOREXPORTIMPORT_H__ #include "BasicTypes.h" #include "ColorPaletteContainer.h" class ColorExportImport { private: PPSystemString fileName; public: ColorExportImport(const PPSystemString& fileName) : fileName(fileName) { } bool importColorPalette(TColorPalette& palette); bool exportColorPalette(const TColorPalette& palette); }; #endif milkytracker-0.90.85+dfsg/src/tracker/TrackerInit.cpp0000644000175000017500000023572011252224630021576 0ustar admin2admin2/* * tracker/TrackerInit.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Tracker.h" #include "TrackerConfig.h" #include "TabManager.h" #include "PlayerController.h" #include "ModuleEditor.h" #include "PatternTools.h" #include "Tools.h" #include "PPUIConfig.h" #include "ListBox.h" #include "StaticText.h" #include "Seperator.h" #include "MessageBoxContainer.h" #include "PatternEditorControl.h" #include "TransparentContainer.h" #include "PianoControl.h" #include "PeakLevelControl.h" #include "ScopesControl.h" #include "TabHeaderControl.h" #include "TitlePageManager.h" // Sections #include "SectionSwitcher.h" #include "SectionTranspose.h" #include "SectionAdvancedEdit.h" #include "SectionDiskMenu.h" #include "SectionHDRecorder.h" #include "SectionSettings.h" #include "SectionInstruments.h" #include "SectionSamples.h" #include "SectionQuickOptions.h" #include "SectionOptimize.h" #include "SectionAbout.h" #include "InputControlListener.h" #include "ControlIDs.h" #include "SIPButtons.h" void Tracker::initUI() { pp_int32 c; PPButton* button = NULL; // ---------- initialise sections -------- for (pp_int32 i = 0; i < sections->size(); i++) sections->get(i)->init(); #ifdef __LOWRES__ pp_int32 height2 = screen->getHeight()-UPPERSECTIONDEFAULTHEIGHT(); PPContainer* containerAbout = new PPContainer(CONTAINER_ABOUT, screen, this, PPPoint(116-2, height2), PPSize((306-116+2)+14,24), false); containerAbout->setColor(TrackerConfig::colorThemeMain); // Song title edit field PPListBox* listBox = new PPListBox(LISTBOX_SONGTITLE, screen, this, PPPoint(116-2+2, height2+2+8), PPSize(200+2,12), true, true, false); listBox->showSelection(false); listBox->setSingleButtonClickEdit(true); listBox->setBorderColor(TrackerConfig::colorThemeMain); char str[MP_MAXTEXT+1]; moduleEditor->getTitle(str, ModuleEditor::MAX_TITLETEXT); listBox->addItem(str); listBox->setMaxEditSize(ModuleEditor::MAX_TITLETEXT); containerAbout->addControl(listBox); PPStaticText* staticText = playTimeText = new PPStaticText(STATICTEXT_ABOUT_TIME, screen, this, PPPoint(116+2, height2+2+8+3), "", false); containerAbout->addControl(staticText); button = new PPButton(BUTTON_ABOUT_ESTIMATESONGLENGTH, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - 6*8-4, height2+2+8+2), PPSize(6*8, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Estimate"); containerAbout->addControl(button); peakLevelControl = new PeakLevelControl(PEAKLEVEL_CONTROL, screen, this, PPPoint(116-2+2, height2+10), PPSize(200+2,12)); peakLevelControl->setBorderColor(TrackerConfig::colorThemeMain); peakLevelControl->hide(true); containerAbout->addControl(peakLevelControl); // switch to Peak level pp_int32 aboutButtonOffset = -33 - 30 - 30 - 23*3 - 14; button = new PPButton(BUTTON_ABOUT_SHOWTITLE, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width + aboutButtonOffset, height2+1), PPSize(29, 9), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Title"); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); containerAbout->addControl(button); button = new PPButton(BUTTON_ABOUT_SHOWTIME, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width + aboutButtonOffset + 29, height2+1), PPSize(24, 9), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Time"); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); containerAbout->addControl(button); button = new PPButton(BUTTON_ABOUT_SHOWPEAK, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width + aboutButtonOffset + 29+24, height2+1), PPSize(24, 9), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Peak"); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); containerAbout->addControl(button); button = new PPButton(MAINMENU_PLAY_SONG, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width + aboutButtonOffset + (29+24+24) + 2, height2+1), PPSize(23, 9), false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Play"); containerAbout->addControl(button); button = new PPButton(MAINMENU_PLAY_PATTERN, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width + aboutButtonOffset + (29+24+24) + 2 + 23, height2+1), PPSize(23, 9), false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Pat"); containerAbout->addControl(button); button = new PPButton(MAINMENU_STOP, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width + aboutButtonOffset + (29+24+24) + 2 + 23*2, height2+1), PPSize(23, 9), false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Stop"); containerAbout->addControl(button); button = new PPButton(BUTTON_ABOUT_FOLLOWSONG, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width + aboutButtonOffset + (29+24+24) + 2 + 23*3, height2+1), PPSize(12, 9), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("F"); containerAbout->addControl(button); button = new PPButton(BUTTON_ABOUT_LIVESWITCH, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width + aboutButtonOffset + (29+24+24) + 2 + 23*3 + 12, height2+1), PPSize(12, 9), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("L"); containerAbout->addControl(button); staticText = new PPStaticText(STATICTEXT_ABOUT_HEADING, screen, this, PPPoint(116, height2+3), "Title:", true); staticText->setFont(PPFont::getFont(PPFont::FONT_TINY)); containerAbout->addControl(staticText); screen->addControl(containerAbout); // small sections initSectionOrderlist(0,0+height2); initSectionSpeed(116-2,24+height2); initSectionPattern(116-4+99,24+height2); // Main options initSectionMainOptions(0, 0+height2); initListboxesSection(0, 0+height2); // add scopes (hidden by default) scopesControl = new ScopesControl(SCOPES_CONTROL, screen, this, PPPoint(0, 0 + height2), PPSize(SCOPESWIDTH(), SCOPESHEIGHT())); scopesControl->setBorderColor(TrackerConfig::colorThemeMain); scopesControl->show(false); screen->addControl(scopesControl); // add sub menu selection buttons (pages) { PPButton* button; PPContainer* container = new PPContainer(CONTAINER_SCOPECONTROL, screen, this, PPPoint(scopesControl->getSize().width, 0 + height2), PPSize(screen->getWidth()-scopesControl->getSize().width,SCOPESHEIGHT()), false); container->setColor(TrackerConfig::colorThemeMain); pp_int32 dy = (container->getSize().height-2) / 5; button = new PPButton(BUTTON_SCOPECONTROL_MUTE, screen, this, PPPoint(container->getLocation().x + 1, container->getLocation().y + 2), PPSize(container->getSize().width-3, dy), false, true, false); button->setText("Mute"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); button = new PPButton(BUTTON_SCOPECONTROL_SOLO, screen, this, PPPoint(container->getLocation().x + 1, container->getLocation().y + 2 + dy), PPSize(container->getSize().width-3, dy), false, true, false); button->setText("Solo"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); button = new PPButton(BUTTON_SCOPECONTROL_REC, screen, this, PPPoint(container->getLocation().x + 1, container->getLocation().y + 2 + dy*2), PPSize(container->getSize().width-3, dy), false, true, false); button->setText("Rec."); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); button = new PPButton(MAINMENU_PLAY_SONG, screen, this, PPPoint(container->getLocation().x + 1, container->getLocation().y + 2 + dy*3), PPSize(container->getSize().width-3, dy), false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Play"); container->addControl(button); button = new PPButton(MAINMENU_STOP, screen, this, PPPoint(container->getLocation().x + 1, container->getLocation().y + 2 + dy*4), PPSize(container->getSize().width-3, dy), false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Stop"); container->addControl(button); container->show(false); screen->addControl(container); pp_int32 y = height2 + 64; container = new PPContainer(CONTAINER_LOWRES_MENUSWITCH, screen, this, PPPoint(0, y), PPSize(screen->getWidth(),16), false); container->setColor(TrackerConfig::colorThemeMain); const pp_int32 numSubMenus = NUMSUBMENUS(); const char* subMenuTexts[] = {"Main","Song","Ins.","Scopes","Jam"}; const pp_int32 subMenuIDs[] = {BUTTON_0, BUTTON_0+1, BUTTON_0+2, BUTTON_0+3, BUTTON_0+4}; pp_int32 dx = (screen->getWidth() - (4+38))/numSubMenus; for (pp_int32 i = 0; i < numSubMenus; i++) { button = new PPButton(subMenuIDs[i], screen, this, PPPoint(0 + 2+i*dx, y+1), PPSize(dx, 13), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText(subMenuTexts[i]); container->addControl(button); } button = new PPButton(BUTTON_APP_EXIT, screen, this, PPPoint(0 + 6+numSubMenus*dx, y+2), PPSize(35,11)); button->setText("Exit"); container->addControl(button); screen->addControl(container); } sectionSwitcher->updateSubMenusButtons(false); sectionSwitcher->showCurrentSubMenu(false); pp_int32 peCtrlHeight = screen->getHeight()-UPPERSECTIONDEFAULTHEIGHT()-INPUTCONTAINERHEIGHT_DEFAULT; patternEditorControl = new PatternEditorControl(PATTERN_EDITOR, screen, this, PPPoint(0,0), PPSize(screen->getWidth(),peCtrlHeight)); initInputContainerDefault(0, screen->getHeight()-UPPERSECTIONDEFAULTHEIGHT()-INPUTCONTAINERHEIGHT_DEFAULT); initInputContainerExtended(0, screen->getHeight()-UPPERSECTIONDEFAULTHEIGHT()-INPUTCONTAINERHEIGHT_EXTENDED); #else PPContainer* containerAbout = new PPContainer(CONTAINER_ABOUT, screen, this, PPPoint(116-2, 0), PPSize((306-116+2)+14,24), false); containerAbout->setColor(TrackerConfig::colorThemeMain); // Song title edit field PPListBox* listBox = new PPListBox(LISTBOX_SONGTITLE, screen, this, PPPoint(116-2+2, 2+8), PPSize(200+2,12), true, true, false); listBox->showSelection(false); listBox->setSingleButtonClickEdit(true); listBox->setBorderColor(TrackerConfig::colorThemeMain); char str[MP_MAXTEXT+1]; moduleEditor->getTitle(str, ModuleEditor::MAX_TITLETEXT); listBox->addItem(str); listBox->setMaxEditSize(ModuleEditor::MAX_TITLETEXT); containerAbout->addControl(listBox); PPStaticText* staticText = playTimeText = new PPStaticText(STATICTEXT_ABOUT_TIME, screen, this, PPPoint(116+2, 2+8+3), "", false); containerAbout->addControl(staticText); button = new PPButton(BUTTON_ABOUT_ESTIMATESONGLENGTH, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - 6*8-4, 2+8+2), PPSize(6*8, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("estimate"); containerAbout->addControl(button); peakLevelControl = new PeakLevelControl(PEAKLEVEL_CONTROL, screen, this, PPPoint(116-2+2, 2+8), PPSize(200+2,12)); peakLevelControl->setBorderColor(TrackerConfig::colorThemeMain); containerAbout->addControl(peakLevelControl); staticText = new PPStaticText(STATICTEXT_ABOUT_HEADING, screen, this, PPPoint(116, 3), "Song title:", true); staticText->setFont(PPFont::getFont(PPFont::FONT_TINY)); containerAbout->addControl(staticText); // switch to Peak level pp_int32 aboutButtonOffset = 51; button = new PPButton(BUTTON_ABOUT_FOLLOWSONG, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - aboutButtonOffset, 1), PPSize(12, 9), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("F"); containerAbout->addControl(button); button = new PPButton(BUTTON_ABOUT_PROSPECTIVE, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - aboutButtonOffset + 12, 1), PPSize(12, 9), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("P"); button->setPressed(true); containerAbout->addControl(button); button = new PPButton(BUTTON_ABOUT_WRAPCURSOR, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - aboutButtonOffset + 12*2, 1), PPSize(12, 9), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("W"); containerAbout->addControl(button); button = new PPButton(BUTTON_ABOUT_LIVESWITCH, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - aboutButtonOffset + 12*3, 1), PPSize(12, 9), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("L"); containerAbout->addControl(button); aboutButtonOffset+=34; button = new PPButton(BUTTON_ABOUT_SHOWPEAK, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - aboutButtonOffset, 1), PPSize(30, 9), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Peak"); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); containerAbout->addControl(button); aboutButtonOffset+=30; button = new PPButton(BUTTON_ABOUT_SHOWTIME, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - aboutButtonOffset, 1), PPSize(30, 9), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Time"); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); containerAbout->addControl(button); aboutButtonOffset+=30; button = new PPButton(BUTTON_ABOUT_SHOWTITLE, screen, this, PPPoint(containerAbout->getLocation().x + containerAbout->getSize().width - aboutButtonOffset, 1), PPSize(30, 9), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Title"); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); containerAbout->addControl(button); screen->addControl(containerAbout); // small sections initSectionOrderlist(0,0); initSectionSpeed(116-2,24); initSectionPattern(116-4+99,24); // Main options initSectionMainOptions(0, 64); // ---------- Instrument & Sample listboxes ---------- initListboxesSection(320, 0); #ifndef __LOWRES__ scopesControl = new ScopesControl(SCOPES_CONTROL, screen, this, PPPoint(0, UPPERSECTIONDEFAULTHEIGHTWOINS()), PPSize(screen->getWidth(), SCOPESHEIGHT())); scopesControl->setBorderColor(TrackerConfig::colorThemeMain); for (c = 0; c < TrackerConfig::MAXCHANNELS; c++) scopesControl->recordChannel(c, playerController->isChannelRecording(c)); screen->addControl(scopesControl); screen->paintControl(scopesControl, false); PPContainer* containerOpenRemoveTabs = new PPContainer(CONTAINER_OPENREMOVETABS, screen, this, PPPoint(0, screen->getHeight()-TABHEADERHEIGHT()), PPSize(TABHEADERHEIGHT()*2, TABHEADERHEIGHT()), false); containerOpenRemoveTabs->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_TAB_OPEN, screen, this, PPPoint(1, screen->getHeight()-TABHEADERHEIGHT()+1), PPSize(TABHEADERHEIGHT()-2, TABHEADERHEIGHT()-2), false); button->setText("+"); containerOpenRemoveTabs->addControl(button); button = new PPButton(BUTTON_TAB_CLOSE, screen, this, PPPoint(TABHEADERHEIGHT(), screen->getHeight()-TABHEADERHEIGHT()+1), PPSize(TABHEADERHEIGHT()-2, TABHEADERHEIGHT()-2), false); button->setText("-"); containerOpenRemoveTabs->addControl(button); screen->addControl(containerOpenRemoveTabs); TabHeaderControl* tabHeader = new TabHeaderControl(TABHEADER_CONTROL, screen, this, PPPoint(TABHEADERHEIGHT()*2, screen->getHeight() - TABHEADERHEIGHT()), PPSize(screen->getWidth()-TABHEADERHEIGHT()*2, TABHEADERHEIGHT())); tabHeader->setColor(TrackerConfig::colorThemeMain); screen->addControl(tabHeader); #endif patternEditorControl = new PatternEditorControl(PATTERN_EDITOR, screen, this, PPPoint(0,UPPERSECTIONDEFAULTHEIGHT()), PPSize(screen->getWidth(),MAXEDITORHEIGHT()-UPPERSECTIONDEFAULTHEIGHT())); #endif // first thing to do is, attach pattern editor patternEditorControl->attachPatternEditor(moduleEditor->getPatternEditor()); patternEditorControl->setColor(TrackerConfig::colorPatternEditorBackground); patternEditorControl->setOrderlistIndex(getOrderListBoxIndex()); screen->addControl(patternEditorControl); // ---------- update fields -------------- updateSamplesListBox(false); updateSongLength(false); updateSongRepeat(false); //updateBPM(false); updateSpeed(false); updatePatternAddAndOctave(false); updatePatternIndex(false); updatePatternLength(false); updatePatternEditorControl(false); #ifdef __LOWRES__ switchEditMode(EditModeMilkyTracker); #else switchEditMode(EditModeFastTracker); #endif screen->setFocus(patternEditorControl); #ifdef __LOWRES__ setInputControl(SIPDefault); updateJamMenuOrder(false); #endif TitlePageManager titlePageManager(*screen); titlePageManager.showSongTitleEditField(false); setFollowSong(true, false); setProspectiveMode(false, false); setCursorWrapAround(true, false); for (c = 0; c < TrackerConfig::MAXCHANNELS; c++) { scopesControl->recordChannel(c, playerController->isChannelRecording(c)); getPatternEditorControl()->recordChannel(c, playerController->isChannelRecording(c)); } patternEditorControl->setScrollMode(ScrollModeStayInCenter); scopesControl->attachSource(this->playerController); tabManager->openNewTab(this->playerController, this->moduleEditor); } //////////////////////////////////////////////////////////////////// // Build orderlist section //////////////////////////////////////////////////////////////////// void Tracker::initSectionOrderlist(pp_int32 x, pp_int32 y) { // setup controls PPContainer* containerOrderlist = new PPContainer(CONTAINER_ORDERLIST, screen, this, PPPoint(x, y), PPSize(116-2,64), false); containerOrderlist->setColor(TrackerConfig::colorThemeMain); PPButton* button = new PPButton(BUTTON_ORDERLIST_EXTENT, screen, this, PPPoint(x + 2 + 78 - 2 - 22, y + 2), PPSize(19, 10), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText(TrackerConfig::stringButtonCollapsed); containerOrderlist->addControl(button); // DUP button = new PPButton(BUTTON_ORDERLIST_SEQENTRY, screen, this, PPPoint(x + 2 + 78 - 2 - 22, y+2+12), PPSize(18, 11)); //button->setVerticalText(true); button->setXOffset(-1); button->setText("Seq"); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_CLNENTRY, screen, this, PPPoint(x + 2 + 78 - 2 - 22, y+2+12+12), PPSize(18, 11)); //button->setVerticalText(true); button->setXOffset(-1); button->setText("Cln"); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_INSERT, screen, this, PPPoint(x+2 + 78-2, y+2), PPSize(33, 11)); button->setText("Ins."); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_NEXT, screen, this, PPPoint(x+2 + 78-2, y+2+12), PPSize(16, 11)); button->setText(TrackerConfig::stringButtonPlus); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_PREVIOUS, screen, this, PPPoint(x+2 + 78-2 + 17, y+2+12), PPSize(16, 11)); button->setText(TrackerConfig::stringButtonMinus); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_DELETE, screen, this, PPPoint(x+2 + 78-2, y+2+12+12), PPSize(33, 11)); button->setText("Del"); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_SONGLENGTH_PLUS, screen, this, PPPoint(x+2 + 78-2, y+2+12+12+12), PPSize(16, 11)); button->setText(TrackerConfig::stringButtonPlus); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_SONGLENGTH_MINUS, screen, this, PPPoint(x+2 + 78-2 + 17, y+2+12+12+12), PPSize(16, 11)); button->setText(TrackerConfig::stringButtonMinus); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_REPEAT_PLUS, screen, this, PPPoint(x+2 + 78-2, y+2+12+12+12+12), PPSize(16, 11)); button->setText(TrackerConfig::stringButtonPlus); containerOrderlist->addControl(button); button = new PPButton(BUTTON_ORDERLIST_REPEAT_MINUS, screen, this, PPPoint(x+2 + 78-2 + 17, y+2+12+12+12+12), PPSize(16, 11)); button->setText(TrackerConfig::stringButtonMinus); containerOrderlist->addControl(button); PPStaticText* staticText = new PPStaticText(0, NULL, NULL, PPPoint(x+2, y+2+12+12+12+2), "Length", true); containerOrderlist->addControl(staticText); staticText = new PPStaticText(1, NULL, NULL, PPPoint(x+2 + 54, y+2+12+12+12+12+2), "Len.", true); containerOrderlist->addControl(staticText); // actual Song Length field staticText = new PPStaticText(STATICTEXT_ORDERLIST_SONGLENGTH, screen, NULL, PPPoint(x+2 + 8*7, y+2+12+12+12+2), "", false); containerOrderlist->addControl(staticText); staticText = new PPStaticText(2, NULL, NULL, PPPoint(x+2, y+2+12+12+12+12+2), "Repeat", true); containerOrderlist->addControl(staticText); // actual Song repeat field staticText = new PPStaticText(STATICTEXT_ORDERLIST_REPEAT, screen, NULL, PPPoint(x+2 + 8*7, y+2+12+12+12+12+2), "", false); containerOrderlist->addControl(staticText); listBoxOrderList = new PPListBox(LISTBOX_ORDERLIST, screen, this, PPPoint(x+2, y+2), PPSize(51,36), true, false, true, true); listBoxOrderList->setAutoHideVScroll(false); listBoxOrderList->setBorderColor(TrackerConfig::colorThemeMain); listBoxOrderList->setCenterSelection(true); listBoxOrderList->setSelectOnScroll(true); containerOrderlist->addControl(listBoxOrderList); screen->addControl(containerOrderlist); expandOrderlist(false); } //////////////////////////////////////////////////////////////////// // Build speed section //////////////////////////////////////////////////////////////////// void Tracker::initSectionSpeed(pp_int32 x, pp_int32 y) { PPContainer* containerSpeed = new PPContainer(CONTAINER_SPEED, screen, this, PPPoint(x, y), PPSize(99-2,40), false); containerSpeed->setColor(TrackerConfig::colorThemeMain); PPStaticText* staticText = new PPStaticText(STATICTEXT_SPEED_BPM_DESC, NULL, NULL, PPPoint(x+2, y+2+2), "BPM", true); containerSpeed->addControl(staticText); // actual BPM field staticText = new PPStaticText(STATICTEXT_SPEED_BPM, screen, NULL, PPPoint(x+2 + 4*8 - 5, y+2+2), "", false); containerSpeed->addControl(staticText); // Octave text field goes at the same place but hidden by default staticText = new PPStaticText(STATICTEXT_SPEED_OCTAVE_DESC, NULL, NULL, PPPoint(x+2, y+2+2), "Oct", true); staticText->hide(true); containerSpeed->addControl(staticText); // actual octave field, hidden by default staticText = new PPStaticText(STATICTEXT_SPEED_OCTAVE, screen, NULL, PPPoint(x+2 + 5*8 - 5, y+2+2), "", false); staticText->hide(true); containerSpeed->addControl(staticText); staticText = new PPStaticText(STATICTEXT_SPEED_SPEED_DESC, NULL, NULL, PPPoint(x+2, y+2 + 2 + 12), "Spd", true); containerSpeed->addControl(staticText); // actual speed field staticText = new PPStaticText(STATICTEXT_SPEED_SPEED, screen, NULL, PPPoint(x+2 + 5*8 - 5, y+2 + 2 + 12), "", false); containerSpeed->addControl(staticText); staticText = new PPStaticText(STATICTEXT_SPEED_PATTERNADD_DESC, NULL, NULL, PPPoint(x+2, y+2 + 2 + 12 + 12), "Add", true); containerSpeed->addControl(staticText); // actual speed field staticText = new PPStaticText(STATICTEXT_SPEED_PATTERNADD, screen, NULL, PPPoint(x+2 + 5*8 - 5, y+2 + 2 + 12 + 12), "", false); containerSpeed->addControl(staticText); staticText = new PPStaticText(STATICTEXT_SPEED_MAINVOL_DESC, NULL, NULL, PPPoint(x+2, y+2 + 2 + 12 + 12), "Mainvol", true); staticText->hide(true); containerSpeed->addControl(staticText); // actual speed field staticText = new PPStaticText(STATICTEXT_SPEED_MAINVOL, screen, NULL, PPPoint(x+2 + 8*8 - 3, y+2 + 2 + 12 + 12), "xx", false); staticText->hide(true); containerSpeed->addControl(staticText); const pp_int32 bSize = 14; PPButton* button = new PPButton(BUTTON_BPM_PLUS, screen, this, PPPoint(x + 2 + 54, y+2), PPSize(bSize, 11)); button->setText(TrackerConfig::stringButtonPlus); containerSpeed->addControl(button); // octave plus button, hidden by default button = new PPButton(BUTTON_OCTAVE_PLUS, screen, this, PPPoint(x + 2 + 54, y+2), PPSize(bSize, 11)); button->setText(TrackerConfig::stringButtonPlus); button->hide(true); containerSpeed->addControl(button); button = new PPButton(BUTTON_BPM_MINUS, screen, this, PPPoint(x + 2 + 54 + bSize+1, y+2), PPSize(bSize-1, 11)); button->setText(TrackerConfig::stringButtonMinus); containerSpeed->addControl(button); // octave minus button, hidden by default button = new PPButton(BUTTON_OCTAVE_MINUS, screen, this, PPPoint(x + 2 + 54 + bSize+1, y+2), PPSize(bSize-1, 11)); button->setText(TrackerConfig::stringButtonMinus); button->hide(true); containerSpeed->addControl(button); button = new PPButton(BUTTON_SPEED_PLUS, screen, this, PPPoint(x + 2 + 54, y+2 + 12), PPSize(bSize, 11)); button->setText(TrackerConfig::stringButtonPlus); containerSpeed->addControl(button); button = new PPButton(BUTTON_SPEED_MINUS, screen, this, PPPoint(x + 2 + 54 + bSize+1, y+2 + 12), PPSize(bSize-1, 11)); button->setText(TrackerConfig::stringButtonMinus); containerSpeed->addControl(button); button = new PPButton(BUTTON_ADD_PLUS, screen, this, PPPoint(x + 2 + 54, y+2 + 12 + 12), PPSize(bSize, 11)); button->setText(TrackerConfig::stringButtonPlus); containerSpeed->addControl(button); button = new PPButton(BUTTON_ADD_MINUS, screen, this, PPPoint(x + 2 + 54 + bSize+1, y+2 + 12 + 12), PPSize(bSize-1, 11)); button->setText(TrackerConfig::stringButtonMinus); containerSpeed->addControl(button); button = new PPButton(BUTTON_SPEEDCONTAINERFLIP, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y+1), PPSize(10, 37), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Flip"); button->setVerticalText(true); containerSpeed->addControl(button); screen->addControl(containerSpeed); } //////////////////////////////////////////////////////////////////// // Build pattern section //////////////////////////////////////////////////////////////////// void Tracker::initSectionPattern(pp_int32 x, pp_int32 y) { PPContainer* containerPattern = new PPContainer(CONTAINER_PATTERN, screen, this, PPPoint(x, y), PPSize(91+14+4,40), false); containerPattern->setColor(TrackerConfig::colorThemeMain); PPStaticText* staticText = new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y+2 + 2), "Patn.", true); containerPattern->addControl(staticText); // actual pattern index field staticText = new PPStaticText(STATICTEXT_PATTERN_INDEX, screen, NULL, PPPoint(x + 2 + 4 * 8 + 18, y+2 + 2), "", false); containerPattern->addControl(staticText); staticText = new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y+2 + 2 + 12), "Len.", true); containerPattern->addControl(staticText); // actual pattern length field staticText = new PPStaticText(STATICTEXT_PATTERN_LENGTH, screen, NULL, PPPoint(x + 2 + 3 * 8 + 18, y+2 + 2 + 12), "", false); containerPattern->addControl(staticText); PPButton* button = new PPButton(BUTTON_PATTERN_PLUS, screen, this, PPPoint(x + 2 + 52+18, y+2), PPSize(16, 11)); button->setText(TrackerConfig::stringButtonPlus); containerPattern->addControl(button); button = new PPButton(BUTTON_PATTERN_MINUS, screen, this, PPPoint(x + 2 + 52 + 17+18, y+2), PPSize(17, 11)); button->setText(TrackerConfig::stringButtonMinus); containerPattern->addControl(button); button = new PPButton(BUTTON_PATTERN_SIZE_PLUS, screen, this, PPPoint(x + 2 + 52+18, y+2 + 12), PPSize(16, 11)); button->setText(TrackerConfig::stringButtonPlus); containerPattern->addControl(button); button = new PPButton(BUTTON_PATTERN_SIZE_MINUS, screen, this, PPPoint(x + 2 + 52 + 17+18, y+2 + 12), PPSize(17, 11)); button->setText(TrackerConfig::stringButtonMinus); containerPattern->addControl(button); button = new PPButton(BUTTON_PATTERN_EXPAND, screen, this, PPPoint(x + 3, y+2 + 12 + 12), PPSize(51, 11)); button->setText("Expand"); containerPattern->addControl(button); button = new PPButton(BUTTON_PATTERN_SHRINK, screen, this, PPPoint(x + 3 + 52, y+2 + 12 +12), PPSize(51, 11)); button->setText("Shrink"); containerPattern->addControl(button); screen->addControl(containerPattern); } ///////////////////////////////////////////////////////////// // Build main options section ///////////////////////////////////////////////////////////// void Tracker::initSectionMainOptions(pp_int32 x, pp_int32 y) { pp_int32 i,j; #ifndef __LOWRES__ pp_int32 bHeight = 12; PPSize size(320, 54); #else pp_int32 bHeight = 14; PPSize size(320, 64); #endif PPContainer* container = new PPContainer(CONTAINER_MENU, screen, this, PPPoint(x, y), size, false); container->setColor(TrackerConfig::colorThemeMain); #ifdef __LOWRES__ y+=2; #endif PPButton* button; for (j = 0; j < 4; j++) { for (i = 0; i < 4; i++) { if (j * 4 + i < 15) { button = new PPButton(BUTTON_MENU_ITEM_0 + j*4+i, screen, this, PPPoint(x+4 + i*78, y + 3 + j*bHeight), PPSize(77, bHeight-1)); button->setText("Unused"); container->addControl(button); } } } static_cast(container->getControlByID(MAINMENU_PLAY_SONG))->setText("Play Sng"); static_cast(container->getControlByID(MAINMENU_PLAY_PATTERN))->setText("Play Pat"); //static_cast(container->getControlByID(MAINMENU_STOP))->setText("Stop"); // Setup "Stop" PPButton button = static_cast(container->getControlByID(MAINMENU_STOP)); button->setText("Stop"); button->setSize(PPSize(77>>1, bHeight-1)); // Add "Edit" button button = new PPButton(MAINMENU_EDIT, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, button->getLocation().y), PPSize(77>>1, bHeight-1), true, true, false); button->setText("Rec"); container->addControl(button); static_cast(container->getControlByID(MAINMENU_ZAP))->setText("Zap"); static_cast(container->getControlByID(MAINMENU_LOAD))->setText("Load"); // Setup "Save" button button = static_cast(container->getControlByID(MAINMENU_SAVE)); button->setText("Save"); button->setSize(PPSize(77>>1, bHeight-1)); // Add "Save As" button button = new PPButton(MAINMENU_SAVEAS, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, button->getLocation().y), PPSize(77>>1, bHeight-1)); button->setText("As"PPSTR_PERIODS); container->addControl(button); //static_cast(container->getControlByID(MAINMENU_SAVE)); static_cast(container->getControlByID(MAINMENU_DISKMENU))->setText("Disk Op."); static_cast(container->getControlByID(MAINMENU_INSEDIT))->setText("Ins. Ed."); static_cast(container->getControlByID(MAINMENU_SMPEDIT))->setText("Smp. Ed."); static_cast(container->getControlByID(MAINMENU_ADVEDIT))->setText("Adv. Edit"); static_cast(container->getControlByID(MAINMENU_TRANSPOSE))->setText("Transpose"); static_cast(container->getControlByID(MAINMENU_CONFIG))->setText("Config"); static_cast(container->getControlByID(MAINMENU_QUICKOPTIONS))->setText("Options"); static_cast(container->getControlByID(MAINMENU_OPTIMIZE))->setText("Optimize"); static_cast(container->getControlByID(MAINMENU_ABOUT))->setText("About"); // add/subtract channels button = new PPButton(BUTTON_MENU_ITEM_ADDCHANNELS, screen, this, PPPoint(x+4 + 3*78, y + 3 + 3*bHeight), PPSize((77>>1) - 1, bHeight-1)); button->setText("Add"); container->addControl(button); button = new PPButton(BUTTON_MENU_ITEM_SUBCHANNELS, screen, this, PPPoint(x+4 + 3*78 + (77>>1), y + 3 + 3*bHeight), PPSize((77>>1)+1, bHeight-1)); button->setText("Sub"); container->addControl(button); button = static_cast(container->getControlByID(MAINMENU_PLAY_PATTERN)); button->setText("Pat"); button->setSize(PPSize((77>>1)-1, bHeight-1)); PPPoint p = button->getLocation(); p.x+=button->getSize().width+1; button = new PPButton(MAINMENU_PLAY_POSITION, screen, this, p, PPSize((77>>1)+1, bHeight-1)); button->setText("Pos"); container->addControl(button); screen->addControl(container); } void Tracker::initListboxesSection(pp_int32 x, pp_int32 y) { pp_int32 i,j; pp_int32 size = (screen->getWidth()-x) / 2 - 4; if (size > 236) size = 236; #ifndef __LOWRES__ const pp_int32 tinyButtonHeight = 10; const pp_int32 tinyButtonOffset = -1; pp_int32 height = 118; pp_int32 dy = 4; #else const pp_int32 tinyButtonHeight = 9; const pp_int32 tinyButtonOffset = -1; pp_int32 height = 64; pp_int32 dy = 3; #endif PPButton* button; // Crippled main menu & jam menu #ifdef __LOWRES__ pp_int32 myDx = 55; { pp_int32 bHeight = 14; pp_int32 x2 = x+4; pp_int32 y2 = y+2+3; PPContainer* container = new PPContainer(CONTAINER_LOWRES_TINYMENU, screen, this, PPPoint(x, y), PPSize((size-myDx)+7,height), false); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(MAINMENU_PLAY_SONG, screen, this, PPPoint(x2, y2), PPSize(73, bHeight-1)); button->setText("Play Sng"); container->addControl(button); button = new PPButton(MAINMENU_PLAY_PATTERN, screen, this, PPPoint(x2, y2 + 1*bHeight), PPSize(73, bHeight-1)); button->setText("Play Pat"); container->addControl(button); /*button = new PPButton(MAINMENU_STOP, screen, this, PPPoint(x2, y2 + 2*bHeight), PPSize(73, bHeight-1)); button->setText("Stop"); container->addControl(button);*/ button = new PPButton(MAINMENU_STOP, screen, this, PPPoint(x2, y2 + 2*bHeight), PPSize((73>>1) - 1, bHeight-1)); button->setText("Stop"); container->addControl(button); button = new PPButton(MAINMENU_EDIT, screen, this, PPPoint(x2 + (73>>1), y2 + 2*bHeight), PPSize((73>>1)+1, bHeight-1), true, true, false); button->setText("Rec"); container->addControl(button); button = new PPButton(BUTTON_MENU_ITEM_ADDCHANNELS, screen, this, PPPoint(x2, y2 + 3*bHeight), PPSize((73>>1) - 1, bHeight-1)); button->setText("Add"); container->addControl(button); button = new PPButton(BUTTON_MENU_ITEM_SUBCHANNELS, screen, this, PPPoint(x2 + (73>>1), y2 + 3*bHeight), PPSize((73>>1)+1, bHeight-1)); button->setText("Sub"); container->addControl(button); x2+=74; button = new PPButton(MAINMENU_INSEDIT, screen, this, PPPoint(x2, y2), PPSize(26, bHeight-1)); button->setText("Ins"); container->addControl(button); button = new PPButton(MAINMENU_SMPEDIT, screen, this, PPPoint(x2, y2 + 1*bHeight), PPSize(26, bHeight-1)); button->setText("Smp"); container->addControl(button); button = new PPButton(MAINMENU_ADVEDIT, screen, this, PPPoint(x2, y2 + 2*bHeight), PPSize(26, bHeight-1)); button->setText("Adv"); container->addControl(button); button = new PPButton(MAINMENU_TRANSPOSE, screen, this, PPPoint(x2, y2 + 3*bHeight), PPSize(26, bHeight-1)); button->setText("Trn"); container->addControl(button); // play pattern/position button = static_cast(container->getControlByID(MAINMENU_PLAY_PATTERN)); button->setText("Pat"); button->setSize(PPSize((73>>1)-1, bHeight-1)); PPPoint p = button->getLocation(); p.x+=button->getSize().width+1; button = new PPButton(MAINMENU_PLAY_POSITION, screen, this, p, PPSize((73>>1)+1, bHeight-1)); button->setText("Pos"); container->addControl(button); screen->addControl(container); x+=(size-myDx)+7; } size-=4; { pp_int32 height2 = height + 39 + 14; pp_int32 y3 = y - 39 - 14; pp_int32 x2 = 0+4; PPContainer* container = new PPContainer(CONTAINER_LOWRES_JAMMENU, screen, this, PPPoint(0, y3), PPSize(screen->getWidth(),height2), false); container->setColor(TrackerConfig::colorThemeMain); pp_int32 bHeight = 12; pp_int32 y2 = y3 + 1; PianoControl* pianoControl = new PianoControl(PIANO_CONTROL, screen, inputControlListener, PPPoint(container->getLocation().x+2, y2), PPSize(screen->getWidth() - 4, 25*3+12), ModuleEditor::MAX_NOTE); // show C-3 pianoControl->setBorderColor(TrackerConfig::colorThemeMain); pianoControl->setMode(PianoControl::ModePlay); pianoControl->setxScale(6); pianoControl->setyScale(3); pianoControl->assureNoteVisible(12*4); container->addControl(pianoControl); x2 = 0+4; y2+=pianoControl->getSize().height+1; PPStaticText* staticText = new PPStaticText(0, NULL, NULL, PPPoint(x2, y2+2), "Pos", true); container->addControl(staticText); staticText = new PPStaticText(STATICTEXT_JAMMENU_CURORDER, NULL, NULL, PPPoint(x2 + 3*8+4, y2+2), "FF"); container->addControl(staticText); button = new PPButton(BUTTON_JAMMENU_NEXTORDERLIST, screen, this, PPPoint(x2 + 5*8+4 + 1, y2), PPSize(12, 11)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_JAMMENU_PREVORDERLIST, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y2), PPSize(12, 11)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); pp_int32 x3 = button->getLocation().x + button->getSize().width+3; staticText = new PPStaticText(0, NULL, NULL, PPPoint(x3, y2+2), "Pat", true); container->addControl(staticText); staticText = new PPStaticText(STATICTEXT_JAMMENU_CURPATTERN, NULL, NULL, PPPoint(x3 + 3*8+4, y2+2), "FF"); container->addControl(staticText); button = new PPButton(BUTTON_PATTERN_PLUS, screen, this, PPPoint(x3 + 5*8+4 + 1, y2), PPSize(12, 11)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_PATTERN_MINUS, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y2), PPSize(12, 11)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); x3 = button->getLocation().x + button->getSize().width+3; staticText = new PPStaticText(0, NULL, NULL, PPPoint(x3, y2+2), "Ins", true); container->addControl(staticText); staticText = new PPStaticText(STATICTEXT_JAMMENU_CURINSTRUMENT, NULL, NULL, PPPoint(x3 + 3*8+4, y2+2), "FF"); container->addControl(staticText); button = new PPButton(BUTTON_JAMMENU_NEXTINSTRUMENT, screen, this, PPPoint(x3 + 5*8+4 + 1, y2), PPSize(12, 11)); button->setText(TrackerConfig::stringButtonUp); container->addControl(button); button = new PPButton(BUTTON_JAMMENU_PREVINSTRUMENT, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y2), PPSize(12, 11)); button->setText(TrackerConfig::stringButtonDown); container->addControl(button); button = new PPButton(INPUT_BUTTON_INS, screen, inputControlListener, PPPoint(button->getLocation().x + button->getSize().width+1 + 2, y2), PPSize(17, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Ins"); container->addControl(button); button = new PPButton(INPUT_BUTTON_DEL, screen, inputControlListener, PPPoint(button->getLocation().x + button->getSize().width+1, y2), PPSize(17, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Del"); container->addControl(button); button = new PPButton(INPUT_BUTTON_BACK, screen, inputControlListener, PPPoint(button->getLocation().x + button->getSize().width+1, y2), PPSize(22, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Back"); container->addControl(button); button = new PPButton(INPUT_BUTTON_KEYOFF, screen, inputControlListener, PPPoint(button->getLocation().x + button->getSize().width+1, y2), PPSize(17, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Off"); container->addControl(button); button = new PPButton(BUTTON_JAMMENU_TOGGLEPIANOSIZE, screen, this, PPPoint(button->getLocation().x + button->getSize().width+3, y2+1), PPSize(12, 11), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText(TrackerConfig::stringButtonCollapsed); container->addControl(button); x2 = 0+4; y2+=14; button = new PPButton(MAINMENU_PLAY_SONG, screen, this, PPPoint(x2, y2), PPSize(77, bHeight-1)); button->setText("Play Sng"); container->addControl(button); x2+=button->getSize().width+1; button = new PPButton(MAINMENU_PLAY_PATTERN, screen, this, PPPoint(x2, y2), PPSize((77>>1)-1, bHeight-1)); button->setText("Pat"); container->addControl(button); x2+=button->getSize().width+1; button = new PPButton(MAINMENU_PLAY_POSITION, screen, this, PPPoint(x2, y2), PPSize((77>>1)+1, bHeight-1)); button->setText("Pos"); container->addControl(button); x2+=button->getSize().width+1; button = new PPButton(MAINMENU_STOP, screen, this, PPPoint(x2, y2), PPSize((77>>1), bHeight-1)); button->setText("Stop"); container->addControl(button); // Add "Edit" button x2+=button->getSize().width+1; button = new PPButton(MAINMENU_EDIT, screen, this, PPPoint(x2, y2), PPSize((77>>1), bHeight-1), true, true, false); button->setText("Rec"); container->addControl(button); x2+=button->getSize().width+1; button = new PPButton(BUTTON_MENU_ITEM_ADDCHANNELS, screen, this, PPPoint(x2, y2), PPSize((77>>1) - 1, bHeight-1)); button->setText("Add"); container->addControl(button); x2+=button->getSize().width+1; button = new PPButton(BUTTON_MENU_ITEM_SUBCHANNELS, screen, this, PPPoint(x2, y2), PPSize((77>>1)+1, bHeight-1)); button->setText("Sub"); container->addControl(button); screen->addControl(container); } #else pp_int32 myDx = 0; #endif PPContainer* container = new PPContainer(CONTAINER_INSTRUMENTLIST, screen, this, PPPoint(x, y), PPSize(screen->getWidth()-x,height), false); container->setColor(TrackerConfig::colorThemeMain); // Instruments #ifndef __LOWRES__ button = new PPButton(BUTTON_INSTRUMENT, screen, this, PPPoint(x+2, y+dy-2), PPSize(screen->getWidth() < 800 ? 3*8+4 : 11*8+4, 12), false, true, false); button->setText(screen->getWidth() < 800 ? "Ins" : "Instruments"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setPressed(true); //PPStaticText* staticText = new PPStaticText(0, NULL, NULL, PPPoint(x+3, y+dy), screen->getWidth() < 800 ? "Ins" : "Instruments", true); #else button = new PPButton(BUTTON_INSTRUMENT, screen, this, PPPoint(x+2, y+dy-2), PPSize(11*8+4, 11), false, true, false); button->setText("Instruments"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setPressed(true); { PPStaticText* staticText = new PPStaticText(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER, screen, this, PPPoint(x+3, y+dy), "Samples / Ins:", true); staticText->hide(true); container->addControl(staticText); staticText = new PPStaticText(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER2, screen, this, PPPoint(x+3 + 14*8, y+dy), "xx", false); staticText->hide(true); container->addControl(staticText); } #endif container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTS_PLUS, screen, this, PPPoint(x+button->getSize().width+4, y+dy+tinyButtonOffset), PPSize(15, tinyButtonHeight)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTS_MINUS, screen, this, PPPoint(button->getLocation().x + 16, y+dy+tinyButtonOffset), PPSize(15, tinyButtonHeight)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); #ifndef __LOWRES__ button = new PPButton(BUTTON_INSTRUMENTEDITOR_CLEAR, screen, sectionInstruments, PPPoint(x+2 + size - 2 - 92, y+dy+tinyButtonOffset), PPSize(30, tinyButtonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Zap"); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTEDITOR_LOAD, screen, sectionInstruments, PPPoint(x+2 + size - 2 - 61, y+dy+tinyButtonOffset), PPSize(30, tinyButtonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Load"); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTEDITOR_SAVE, screen, sectionInstruments, PPPoint(x+2 + size - 2 - 30, y+dy+tinyButtonOffset), PPSize(30, tinyButtonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Save"); container->addControl(button); #else button = new PPButton(BUTTON_INSTRUMENTS_FLIP, screen, this, PPPoint(container->getLocation().x + container->getSize().width - 27, y+dy+tinyButtonOffset - 1), PPSize(24, 11), false); button->setText("Flip"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); button = new PPButton(BUTTON_JAMMENU_PREVINSTRUMENT, screen, this, PPPoint(button->getLocation().x - 16, y+dy+tinyButtonOffset), PPSize(15, tinyButtonHeight)); button->setText(TrackerConfig::stringButtonUp); container->addControl(button); button = new PPButton(BUTTON_JAMMENU_NEXTINSTRUMENT, screen, this, PPPoint(button->getLocation().x - 16, y+dy+tinyButtonOffset), PPSize(15, tinyButtonHeight)); button->setText(TrackerConfig::stringButtonDown); container->addControl(button); #endif listBoxInstruments = new PPListBox(LISTBOX_INSTRUMENTS, screen, this, PPPoint(x+2, y + 7 + dy + dy), PPSize(size+myDx,height-(10+2*dy)), true, true, true, true); listBoxInstruments->setBorderColor(TrackerConfig::colorThemeMain); listBoxInstruments->setShowIndex(true); listBoxInstruments->setMaxEditSize(ModuleEditor::MAX_INSTEXT); //listBoxInstruments->setSelectOnScroll(true); fillInstrumentListBox(listBoxInstruments); container->addControl(listBoxInstruments); // Samples #ifndef __LOWRES__ button = new PPButton(BUTTON_SAMPLE_EDIT_CLEAR, screen, sectionSamples, PPPoint(x+2 + size*2 + 4 - 2 - 92, y+dy+tinyButtonOffset), PPSize(30, tinyButtonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Clear"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_LOAD, screen, sectionSamples, PPPoint(x+2 + size*2 + 4 - 2 - 61, y+dy+tinyButtonOffset), PPSize(30, tinyButtonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Load"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_SAVE, screen, sectionSamples, PPPoint(x+2 + size*2 + 4 - 2 - 30, y+dy+tinyButtonOffset), PPSize(30, tinyButtonHeight)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Save"); container->addControl(button); #endif PPStaticText* staticText = new PPStaticText(STATICTEXT_SAMPLEHEADER, NULL, NULL, PPPoint(x+size+myDx+4+3, y+dy), "Samples", true); container->addControl(staticText); listBoxSamples = new PPListBox(LISTBOX_SAMPLES, screen, this, PPPoint(x+2 + size+4, y + 7 + dy + dy), PPSize(size,height-(10+2*dy)), true, true, true, true); listBoxSamples->setBorderColor(TrackerConfig::colorThemeMain); listBoxSamples->setShowIndex(true); listBoxSamples->setMaxEditSize(ModuleEditor::MAX_SMPTEXT); listBoxSamples->setIndexBaseCount(0); container->addControl(listBoxSamples); #ifdef __LOWRES__ listBoxSamples->hide(true); #endif screen->addControl(container); } void Tracker::showMessageBox(pp_int32 id, const PPString& caption, MessageBoxTypes type, bool update/* = true*/) { showMessageBoxSized(id, caption, type, 290, 74, update); } void Tracker::showMessageBoxSized(pp_int32 id, const PPString& caption, MessageBoxTypes type, pp_int32 width/* = -1*/, pp_int32 height/* = -1*/, bool update/* = true*/) { if (messageBoxContainerGeneric) { delete messageBoxContainerGeneric; messageBoxContainerGeneric = NULL; } PPSimpleVector* stringList = PPTools::extractStringList(caption); if (height == -1) height = 62 + stringList->size()*12; if (width == -1) width = 290; pp_int32 x = screen->getWidth() / 2 - width/2; pp_int32 y = screen->getHeight() / 2 - height/2; PPMessageBoxContainer* container = new PPMessageBoxContainer(id, screen, this, PPPoint(x, y), PPSize(width,height), "System request"); pp_int32 x2; pp_int32 y2; y2 = y + 28; for (pp_int32 i = 0; i < stringList->size(); i++) { PPString* str = stringList->get(i); x2 = x + width / 2 - (PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(*str) / 2); container->addControl(new PPStaticText(1 + i, screen, this, PPPoint(x2, y2), *str, true)); y2+=12; } delete stringList; y2 = y + height - 46; if (type == MessageBox_OK) { PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_YES, screen, this, PPPoint(x+width/2-30, y2 + 20), PPSize(60, 11)); button->setText("Okay"); container->addControl(button); } else if (type == MessageBox_YESNO) { PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_YES, screen, this, PPPoint(x+width/2-65, y2 + 20), PPSize(60, 11)); button->setText("Yes"); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_NO, screen, this, PPPoint(x+width/2+5, y2 + 20), PPSize(60, 11)); button->setText("No"); container->addControl(button); } else if (type == MessageBox_YESNOCANCEL) { PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_YES, screen, this, PPPoint(x+width/2-100, y2 + 20), PPSize(60, 11)); button->setText("Yes"); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_NO, screen, this, PPPoint(x+width/2-30, y2 + 20), PPSize(60, 11)); button->setText("No"); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_CANCEL, screen, this, PPPoint(x+width/2+40, y2 + 20), PPSize(60, 11)); button->setText("Cancel"); container->addControl(button); } messageBoxContainerGeneric = container; screen->setModalControl(messageBoxContainerGeneric, update); } void Tracker::showQuitMessageBox(const char* caption, const char* captionOk, const char* captionCancel) { showMessageBoxSized(MESSAGEBOX_REALLYQUIT, caption, MessageBox_YESNO, -1, -1, false); if (captionOk) { PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_YES)); button->setText(captionOk); } if (captionCancel) { PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_NO)); button->setText(captionCancel); } screen->paint(); } void Tracker::initInstrumentChooser(pp_int32 id, const PPString& buttonText1, const PPString& buttonText2, const PPString& caption, const PPString& userString1, const PPString& userString2, pp_int32 srcSelection/* = -1*/, pp_int32 srcSelection2/* = -1*/, pp_int32 srcSelection3/* = -1*/) { pp_int32 i,j; if (instrumentChooser) { delete instrumentChooser; instrumentChooser = NULL; } const pp_uint32 spacer = 10; PPString buttonText1_2 = buttonText1; buttonText1_2.append("++"); PPString buttonText2_2 = buttonText2; buttonText2_2.append("++"); const pp_int32 height = (screen->getHeight() >= 480) ? 380 : screen->getHeight(); const pp_int32 width = (screen->getWidth()-10) > 480 ? 480 : screen->getWidth(); pp_int32 x = screen->getWidth() / 2 - width/2; pp_int32 y = screen->getHeight() / 2 - height/2; PPMessageBoxContainer* container = new PPMessageBoxContainer(id, screen, this, PPPoint(x, y), PPSize(width,height), caption); // ------------- source listboxes --------------------------------- pp_int32 x2 = x + 5; pp_int32 y2 = y + 18; pp_int32 lBoxHeight = ((height-100)/2) & ~1; PPString str; PPListBox* listBoxInstrumentsSrc = NULL; PPListBox* listBoxSamplesSrc = NULL; PPListBox* listBoxModulesSrc = NULL; PPListBox* listBoxInstrumentsDst = NULL; PPListBox* listBoxSamplesDst = NULL; PPListBox* listBoxModulesDst = NULL; if (tabManager->getNumTabs() > 1) { listBoxModulesSrc = new PPListBox(INSTRUMENT_CHOOSER_LIST_SRC3, screen, this, PPPoint(x2-2, y2 + 10), PPSize((width-10)/2,lBoxHeight), true, false, true, true); listBoxModulesSrc->setShowIndex(true); fillModuleListBox(listBoxModulesSrc); if (srcSelection3 >= 0) listBoxModulesSrc->setSelectedIndex(srcSelection3, false); container->addControl(listBoxModulesSrc); str = "From Module:"; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_USER5, screen, this, PPPoint(x2 - 2 + (width-10) / 2 - 50 - 1, y2-1), PPSize(50, 10)); button->setText("From<->To"); container->addControl(button); x2+=3+(width-10)/2+2; pp_int32 temp = lBoxHeight; lBoxHeight = lBoxHeight / 2 - 6; str = "From Ins:"; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER10, screen, this, PPPoint(x2 + 9*8+4, y2-1), PPSize(14, 10)); button->setText("+"); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER11, screen, this, PPPoint(x2 + 9*8+4 + 14 + 1, y2-1), PPSize(14, 10)); button->setText("-"); container->addControl(button); listBoxInstrumentsSrc = new PPListBox(INSTRUMENT_CHOOSER_LIST_SRC, screen, this, PPPoint(x2-2, y2 + 10), PPSize((width-10)/2-1,lBoxHeight), true, false, true, true); listBoxInstrumentsSrc->setShowIndex(true); fillInstrumentListBox(listBoxInstrumentsSrc, tabManager->getModuleEditorFromTabIndex(listBoxModulesSrc->getSelectedIndex())); if (srcSelection >= 0) listBoxInstrumentsSrc->setSelectedIndex(srcSelection, false); container->addControl(listBoxInstrumentsSrc); y2+=listBoxInstrumentsSrc->getSize().height+12; str = "From Smp:"; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER6, screen, this, PPPoint(x2 + 9*8+4, y2-1), PPSize(24, 10)); button->setText("Play"); container->addControl(button); listBoxSamplesSrc = new PPListBox(INSTRUMENT_CHOOSER_LIST_SRC2, screen, this, PPPoint(x2-2, y2 + 10), PPSize((width-10)/2-1,lBoxHeight), true, false, true, true); listBoxSamplesSrc->setShowIndex(true); listBoxSamplesSrc->setIndexBaseCount(0); fillSampleListBox(listBoxSamplesSrc, listBoxInstrumentsSrc->getSelectedIndex(), tabManager->getModuleEditorFromTabIndex(listBoxModulesSrc->getSelectedIndex())); if (srcSelection2 >= 0) listBoxSamplesSrc->setSelectedIndex(srcSelection2, false); container->addControl(listBoxSamplesSrc); lBoxHeight = temp; } else { str = "From Ins:"; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_USER10, screen, this, PPPoint(x2 + 9*8+4, y2-1), PPSize(14, 10)); button->setText("+"); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER11, screen, this, PPPoint(x2 + 9*8+4 + 14 + 1, y2-1), PPSize(14, 10)); button->setText("-"); container->addControl(button); listBoxInstrumentsSrc = new PPListBox(INSTRUMENT_CHOOSER_LIST_SRC, screen, this, PPPoint(x+3, y2 + 10), PPSize((width-10)/2,lBoxHeight), true, false, true, true); listBoxInstrumentsSrc->setShowIndex(true); fillInstrumentListBox(listBoxInstrumentsSrc); if (srcSelection >= 0) listBoxInstrumentsSrc->setSelectedIndex(srcSelection, false); container->addControl(listBoxInstrumentsSrc); y2 = y+18; lBoxHeight = ((height-100)/2) & ~1; str = "From Smp:"; x2+=3+(width-10)/2+2; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER6, screen, this, PPPoint(x2 + 9*8+4, y2-1), PPSize(24, 10)); button->setText("Play"); container->addControl(button); listBoxSamplesSrc = new PPListBox(INSTRUMENT_CHOOSER_LIST_SRC2, screen, this, PPPoint(x+3+(width-10)/2+4, y2 + 10), PPSize((width-10)/2-1,lBoxHeight), true, false, true, true); listBoxSamplesSrc->setShowIndex(true); listBoxSamplesSrc->setIndexBaseCount(0); fillSampleListBox(listBoxSamplesSrc, listBoxInstrumentsSrc->getSelectedIndex()); if (srcSelection2 >= 0) listBoxSamplesSrc->setSelectedIndex(srcSelection2, false); container->addControl(listBoxSamplesSrc); } y2+=listBoxSamplesSrc->getSize().height+12 + 3; pp_int32 temp = PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(userString1) + 10 + PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(buttonText1) + 4 + spacer + PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(buttonText1_2) + 4 + spacer; x2 = x + width / 2 - (temp / 2); pp_int32 y3 = y2; PPStaticText* text = new PPStaticText(INSTRUMENT_CHOOSER_USERSTR1, screen, this, PPPoint(x2, y2), userString1, true); container->addControl(text); PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_USER1, screen, this, PPPoint(text->getLocation().x + text->getSize().width+spacer+10, y2-2), PPSize(PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(buttonText1) + 4, 11)); button->setText(buttonText1); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER3, screen, this, PPPoint(button->getLocation().x + button->getSize().width+spacer, y2-2), PPSize(PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(buttonText1_2) + 4, 11)); button->setText(buttonText1_2); container->addControl(button); // ------------- destination listboxes --------------------------------- y2+=12; container->addControl(new PPSeperator(0, screen, PPPoint(x+4, y2), width-8, container->getColor(), true)); y2+=4; temp = y2; pp_int32 temp2 = lBoxHeight; x2 = x + 5; if (tabManager->getNumTabs() > 1) { listBoxModulesDst = new PPListBox(INSTRUMENT_CHOOSER_LIST_DST3, screen, this, PPPoint(x2-2, y2 + 10), PPSize((width-10)/2,lBoxHeight), true, false, true, true); listBoxModulesDst->setShowIndex(true); fillModuleListBox(listBoxModulesDst); container->addControl(listBoxModulesDst); str = "To Module:"; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_USER5, screen, this, PPPoint(x2 - 2 + (width-10) / 2 - 50 - 1, y2-1), PPSize(50, 10)); button->setText("To<->From"); container->addControl(button); x2+=3+(width-10)/2+2; lBoxHeight = lBoxHeight / 2 - 6; str = "To Ins:"; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER12, screen, this, PPPoint(x2 + 7*8+4, y2-1), PPSize(14, 10)); button->setText("+"); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER13, screen, this, PPPoint(x2 + 7*8+4 + 14 + 1, y2-1), PPSize(14, 10)); button->setText("-"); container->addControl(button); listBoxInstrumentsDst = new PPListBox(INSTRUMENT_CHOOSER_LIST_DST, screen, this, PPPoint(x2-2, y2 + 10), PPSize((width-10)/2-1,lBoxHeight), true, false, true, true); listBoxInstrumentsDst->setShowIndex(true); fillInstrumentListBox(listBoxInstrumentsDst, tabManager->getModuleEditorFromTabIndex(listBoxModulesDst->getSelectedIndex())); container->addControl(listBoxInstrumentsDst); y2+=listBoxInstrumentsDst->getSize().height+12; str = "To Smp:"; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER7, screen, this, PPPoint(x2 + 7*8+4, y2-1), PPSize(24, 10)); button->setText("Play"); container->addControl(button); listBoxSamplesDst = new PPListBox(INSTRUMENT_CHOOSER_LIST_DST2, screen, this, PPPoint(x2-2, y2 + 10), PPSize((width-10)/2-1,lBoxHeight), true, false, true, true); listBoxSamplesDst->setShowIndex(true); listBoxSamplesDst->setIndexBaseCount(0); fillSampleListBox(listBoxSamplesDst, listBoxInstrumentsDst->getSelectedIndex(), tabManager->getModuleEditorFromTabIndex(listBoxModulesDst->getSelectedIndex())); container->addControl(listBoxSamplesDst); } else { str = "To Ins:"; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_USER12, screen, this, PPPoint(x2 + 7*8+4, y2-1), PPSize(14, 10)); button->setText("+"); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER13, screen, this, PPPoint(x2 + 7*8+4 + 14 + 1, y2-1), PPSize(14, 10)); button->setText("-"); container->addControl(button); // put in here listBoxInstrumentsDst = new PPListBox(INSTRUMENT_CHOOSER_LIST_DST, screen, this, PPPoint(x+3, y2 + 10), PPSize((width-10)/2,lBoxHeight), true, false, true, true); listBoxInstrumentsDst->setShowIndex(true); fillInstrumentListBox(listBoxInstrumentsDst); container->addControl(listBoxInstrumentsDst); y2 = temp; lBoxHeight = temp2; str = "To Smp:"; //x2 = x + width / 2 - (PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(str2) / 2); //y2+=listBoxInstruments->getSize().height+16; x2+=3+(width-10)/2+2; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER7, screen, this, PPPoint(x2 + 7*8+4, y2-1), PPSize(24, 10)); button->setText("Play"); container->addControl(button); listBoxSamplesDst = new PPListBox(INSTRUMENT_CHOOSER_LIST_DST2, screen, this, PPPoint(x+3+(width-10)/2+4, y2 + 10), PPSize((width-10)/2-1,lBoxHeight), true, false, true, true); listBoxSamplesDst->setShowIndex(true); listBoxSamplesDst->setIndexBaseCount(0); fillSampleListBox(listBoxSamplesDst, listBoxInstrumentsDst->getSelectedIndex()); container->addControl(listBoxSamplesDst); } y2+=listBoxSamplesDst->getSize().height+12 + 3; temp = PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(userString2) + 10 + PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(buttonText2) + 4 + spacer + PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(buttonText2_2) + 4 + spacer; x2 = x + width / 2 - (temp / 2); y3 = y2; text = new PPStaticText(INSTRUMENT_CHOOSER_USERSTR2, screen, this, PPPoint(x2, y2), userString2, true); container->addControl(text); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER2, screen, this, PPPoint(text->getLocation().x + text->getSize().width+spacer+10, y2-2), PPSize(PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(buttonText2) + 4, 11)); button->setText(buttonText2); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER4, screen, this, PPPoint(button->getLocation().x + button->getSize().width+spacer, y2-2), PPSize(PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(buttonText2_2) + 4, 11)); button->setText(buttonText2_2); container->addControl(button); // Buttons y2+=12; container->addControl(new PPSeperator(0, screen, PPPoint(x+4, y2), width-8, container->getColor(), true)); y2+=7; //PPButton* button = new PPButton(MESSAGEBOX_BUTTON_USER1, screen, this, PPPoint(x+width/2-75-35, y2), PPSize(70, 11)); //button->setText(buttonText1); //container->addControl(button); //button = new PPButton(MESSAGEBOX_BUTTON_USER2, screen, this, PPPoint(x+width/2-35, y2), PPSize(70, 11)); //button->setText(buttonText2); //container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_CANCEL, screen, this, PPPoint(x+width/2-35, y2), PPSize(70, 11)); button->setText("Cancel"); container->addControl(button); instrumentChooser = container; } void Tracker::initAdvEdit() { const pp_int32 buttonIDs[4] = {PP_MESSAGEBOX_BUTTON_USER1, PP_MESSAGEBOX_BUTTON_USER2, PP_MESSAGEBOX_BUTTON_USER3, PP_MESSAGEBOX_BUTTON_USER4}; const char* buttonTexts[4] = {"Track", "Pattern", "Song", "Block"}; char buffer[100]; sprintf(buffer, "Remap ins. %x to %x", listBoxInstruments->getSelectedIndex()+1, 1); //initInstrumentChooser(MESSAGEBOX_INSREMAP, "", "Instrument remapping", "",buffer, "",listBoxInstruments->getSelectedIndex()); // old instrument chooser / just inserted ;) { PPString userString = buffer; pp_int32 srcSelection = listBoxInstruments->getSelectedIndex(); pp_int32 j; if (instrumentChooser) { delete instrumentChooser; instrumentChooser = NULL; } const pp_int32 height = 222; const pp_int32 width = (screen->getWidth()-10) > 480 ? 480 : (screen->getWidth()-10); pp_int32 x = screen->getWidth() / 2 - width/2; pp_int32 y = screen->getHeight() / 2 - height/2; PPMessageBoxContainer* container = new PPMessageBoxContainer(MESSAGEBOX_INSREMAP, screen, this, PPPoint(x, y), PPSize(width,height), "Instrument remapping"); const PPString str = "From:"; pp_int32 x2 = x + 5; pp_int32 y2 = y + 20; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str, true)); const pp_int32 lBoxHeight = height-90; PPListBox* listBoxInstruments = new PPListBox(INSTRUMENT_CHOOSER_LIST_SRC, screen, this, PPPoint(x+3, y2 + 12), PPSize((width-10)/2,lBoxHeight), true, false, true, true); listBoxInstruments->setShowIndex(true); fillInstrumentListBox(listBoxInstruments); if (srcSelection >= 0) listBoxInstruments->setSelectedIndex(srcSelection, false); container->addControl(listBoxInstruments); PPString str2 = "To:"; x2+=3+(width-10)/2+2; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), str2, true)); listBoxInstruments = new PPListBox(INSTRUMENT_CHOOSER_LIST_DST, screen, this, PPPoint(x+3+(width-10)/2+4, y2 + 12), PPSize((width-10)/2,lBoxHeight), true, false, true, true); listBoxInstruments->setShowIndex(true); fillInstrumentListBox(listBoxInstruments); container->addControl(listBoxInstruments); y2+=listBoxInstruments->getSize().height+12 + 6 + 30; PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_USER1, screen, this, PPPoint(x+width/2-65, y2), PPSize(60, 11)); button->setText(""); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_CANCEL, screen, this, PPPoint(x+width/2+5, y2), PPSize(60, 11)); button->setText("Cancel"); container->addControl(button); x2 = x + width / 2 - (PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(userString) / 2); container->addControl(new PPStaticText(INSTRUMENT_CHOOSER_USERSTR1, screen, this, PPPoint(x2, y2 - 21), userString, true)); instrumentChooser = container; } // modify current instrument chooser dialog if (instrumentChooser) { const pp_int32 spacer = 10; PPControl* ctrl = instrumentChooser->getControlByID(PP_MESSAGEBOX_BUTTON_USER1); pp_int32 y2 = ctrl->getLocation().y - 16; pp_int32 buttonWidth = ctrl->getSize().width; pp_int32 buttonHeight = ctrl->getSize().height; pp_int32 cx = ((buttonWidth) * 4 + spacer*3)/2; bool b = instrumentChooser->removeControl(ctrl); ASSERT(b); b = instrumentChooser->removeControl(instrumentChooser->getControlByID(PP_MESSAGEBOX_BUTTON_CANCEL)); ASSERT(b); pp_int32 width = instrumentChooser->getSize().width; pp_int32 x = instrumentChooser->getLocation().x + width/2 - cx; for (pp_int32 i = 0; i < 4; i++) { PPButton* button = new PPButton(buttonIDs[i], screen, this, PPPoint(x, y2), PPSize(buttonWidth, buttonHeight)); button->setText(buttonTexts[i]); instrumentChooser->addControl(button); x+= buttonWidth + spacer; } x-=buttonWidth + spacer; y2+=6 + buttonHeight; PPButton* button = new PPButton(PP_MESSAGEBOX_BUTTON_CANCEL, screen, this, PPPoint(x, y2), PPSize(buttonWidth, buttonHeight)); button->setText("Cancel"); instrumentChooser->addControl(button); ctrl = instrumentChooser->getControlByID(INSTRUMENT_CHOOSER_USERSTR1); y2 = ctrl->getLocation().y - 11; x = ctrl->getLocation().x; ctrl->setLocation(PPPoint(x, y2)); } screen->setModalControl(instrumentChooser); } void Tracker::initInputContainerDefault(pp_int32 x, pp_int32 y) { PPContainer* container = new PPContainer(CONTAINER_INPUTDEFAULT, screen, this, PPPoint(0, y), PPSize(screen->getWidth(),INPUTCONTAINERHEIGHT_DEFAULT), false); container->setColor(TrackerConfig::colorThemeMain); PPButton* button; pp_int32 bWidth = 11; pp_int32 bHeight = 12; pp_int32 j,i; for (j = 0; j < 2; j++) for (i = 0; i < 8; i++) { char buffer[4]; PPTools::convertToHex(buffer, j*8+i, 1); button = new PPButton(INPUT_BUTTON_0 + j*8+i, screen, inputControlListener, PPPoint(x+2 + i*(bWidth), y + 2 + j*(bHeight)), PPSize(bWidth, bHeight), false, true, true); button->setText(buffer); container->addControl(button); } pp_int32 y2 = y + /*2*(bHeight+1)+*/2; pp_int32 x2 = x + 3 + 8*(bWidth); bWidth = 22; pp_int32 x3 = x2-1; button = new PPButton(INPUT_BUTTON_DEL, screen, inputControlListener, PPPoint(x3, y2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Del"); container->addControl(button); y2+=button->getSize().height; button = new PPButton(INPUT_BUTTON_INS, screen, inputControlListener, PPPoint(x3, y2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Ins"); container->addControl(button); y2+=button->getSize().height; button = new PPButton(INPUT_BUTTON_BACK, screen, inputControlListener, PPPoint(x3, y2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Back"); container->addControl(button); x2+=button->getSize().width; x3+=button->getSize().width; x3 = x+2; bWidth = 44; button = new PPButton(INPUT_BUTTON_INSLINE, screen, inputControlListener, PPPoint(x3, y2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Insline"); container->addControl(button); x3+=button->getSize().width; button = new PPButton(INPUT_BUTTON_BACKLINE, screen, inputControlListener, PPPoint(x3, y2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Backline"); container->addControl(button); // piano test PianoControl* pianoControl = new PianoControl(PIANO_CONTROL, screen, inputControlListener, PPPoint(x2, y+1), PPSize(screen->getWidth() - 2 - x2 - (21+2), 25+12), ModuleEditor::MAX_NOTE); // show C-3 pianoControl->assureNoteVisible(12*4); pianoControl->setBorderColor(TrackerConfig::colorThemeMain); pianoControl->setMode(PianoControl::ModePlay); container->addControl(pianoControl); x2+=1+pianoControl->getSize().width; button = new PPButton(INPUT_BUTTON_KEYOFF, screen, inputControlListener, PPPoint(x2, y+2), PPSize(22, 18), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Off"); container->addControl(button); button = new PPButton(INPUT_BUTTON_EXPAND, screen, inputControlListener, PPPoint(x2, y+2+18), PPSize(22, 17), false, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Exp."); container->addControl(button); inputContainerDefault = inputContainerCurrent = container; screen->addControl(container); } void Tracker::initInputContainerExtended(pp_int32 x, pp_int32 y) { PPContainer* container = new PPContainer(CONTAINER_INPUTEXTENDED, screen, this, PPPoint(0, y), PPSize(screen->getWidth(),INPUTCONTAINERHEIGHT_EXTENDED), false); container->setColor(TrackerConfig::colorThemeMain); // First line of keys PPButton* button; pp_int32 bWidth = 11; pp_int32 bHeight = 12; pp_int32 j,i, offset = 0; for (i = 0; i < (signed)sizeof(keyLine_0_lowerCase); i++) { button = new PPButton(keyLineIDs_0[i], screen, inputControlListener, PPPoint(x+2 + i*(bWidth)+offset, y + 2), PPSize(bWidth, bHeight), false, true, true); button->setText(keyLine_0_lowerCase[i]); container->addControl(button); } offset = bWidth+(bWidth>>1)-1; pp_int32 y2 = y+bHeight; j = x + 2 + offset; for (i = 0; i < (signed)sizeof(keyLine_1_lowerCase); i++) { button = new PPButton(keyLineIDs_1[i], screen, inputControlListener, PPPoint(j, y2 + 2), PPSize(keyLineSizes_1[i], bHeight), false, true, true); button->setText(keyLine_1_lowerCase[i]); container->addControl(button); j+=keyLineSizes_1[i]; } y2+=bHeight; bHeight++; offset = (bWidth*2)-4; for (i = 0; i < (signed)sizeof(keyLine_2_lowerCase); i++) { button = new PPButton(keyLineIDs_2[i], screen, inputControlListener, PPPoint(x+2 + i*(bWidth)+offset, y2 + 2), PPSize(bWidth, bHeight), false, true, true); button->setText(keyLine_2_lowerCase[i]); container->addControl(button); } y2+=bHeight; bHeight--; offset = (bWidth+2)+1; for (i = 0; i < (signed)sizeof(keyLine_3_lowerCase); i++) { button = new PPButton(keyLineIDs_3[i], screen, inputControlListener, PPPoint(x+2 + i*(bWidth)+offset, y2 + 2), PPSize(bWidth, bHeight), false, true, true); button->setText(keyLine_3_lowerCase[i]); container->addControl(button); } y2 = y + bHeight; bWidth = 15; offset = 0; button = new PPButton(INPUT_BUTTON_TAB, screen, inputControlListener, PPPoint(x+2 + offset, y2 + 2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("->"); container->addControl(button); y2 += bHeight; bHeight++; bWidth = 18; offset = 0; button = new PPButton(INPUT_BUTTON_CAPSLOCK, screen, inputControlListener, PPPoint(x+2 + offset, y2 + 2), PPSize(bWidth, bHeight), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Cap"); container->addControl(button); y2 += bHeight; bHeight--; bWidth = 14; offset = 0; button = new PPButton(INPUT_BUTTON_LSHIFT, screen, inputControlListener, PPPoint(x+2 + offset, y2 + 2), PPSize(bWidth, bHeight), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Sh"); container->addControl(button); bWidth = 23; pp_int32 x3 = x + 145; y2 = y; button = new PPButton(INPUT_BUTTON_BACK, screen, inputControlListener, PPPoint(x3, y2+2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Back"); container->addControl(button); y2+=bHeight; x3+=7; bWidth = 16; bHeight*=2; bHeight+=1; button = new PPButton(INPUT_BUTTON_ENTER, screen, inputControlListener, PPPoint(x3, y2+2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Ret"); container->addControl(button); y2+=bHeight; bHeight = 12; bWidth = 31; x3 = x + 135; button = new PPButton(INPUT_BUTTON_SPACE, screen, inputControlListener, PPPoint(x3+2 + offset, y2 + 2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Space"); container->addControl(button); x3 += bWidth+2; PianoControl* pianoControl = new PianoControl(PIANO_CONTROL, screen, inputControlListener, PPPoint(x3+2, y+1), PPSize(screen->getWidth() - 3 - x3, 25+12), ModuleEditor::MAX_NOTE); // show C-3 pianoControl->assureNoteVisible(12*4); pianoControl->setBorderColor(TrackerConfig::colorThemeMain); pianoControl->setMode(PianoControl::ModePlay); container->addControl(pianoControl); // more stuff bWidth = 18; button = new PPButton(INPUT_BUTTON_DEL, screen, inputControlListener, PPPoint(x3+2, y2+2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Del"); container->addControl(button); x3+=button->getSize().width; button = new PPButton(INPUT_BUTTON_INS, screen, inputControlListener, PPPoint(x3+2, y2+2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Ins"); container->addControl(button); x3+=button->getSize().width; bWidth = 37; button = new PPButton(INPUT_BUTTON_INSLINE, screen, inputControlListener, PPPoint(x3+2, y2+2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Insline"); container->addControl(button); bWidth = 41; x3+=button->getSize().width; button = new PPButton(INPUT_BUTTON_BACKLINE, screen, inputControlListener, PPPoint(x3+2, y2+2), PPSize(bWidth, bHeight), false, true, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Backline"); container->addControl(button); x3+=button->getSize().width+1; bWidth = 33; button = new PPButton(INPUT_BUTTON_SHRINK, screen, inputControlListener, PPPoint(x3+2, y2+2), PPSize(bWidth, bHeight), false, true); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Shrink"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); container->hide(true); inputContainerExtended = container; screen->addControl(container); } void Tracker::moveInputControls(pp_uint32 deltay) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_INPUTDEFAULT)); ASSERT(container); PPPoint p(0, deltay); container->move(p); container = static_cast(screen->getControlByID(CONTAINER_INPUTEXTENDED)); ASSERT(container); container->move(p); rearrangePatternEditorControlOrInstrumentContainer(); } void Tracker::hideInputControl(bool bHide/* = true*/) { if (inputContainerCurrent && bHide) { inputContainerCurrent->show(false); } else if (inputContainerCurrent) { inputContainerCurrent->show(true); } } milkytracker-0.90.85+dfsg/src/tracker/EnvelopeEditor.cpp0000644000175000017500000002616011150223367022302 0ustar admin2admin2/* * tracker/EnvelopeEditor.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * EnvelopeEditor.cpp * MilkyTracker * * Created by Peter Barth on 25.11.07. * */ #include "EnvelopeEditor.h" #include "SimpleVector.h" #include "FilterParameters.h" EnvelopeEditor::ClipBoard::ClipBoard() : envelopeCopy(NULL) { } EnvelopeEditor::ClipBoard::~ClipBoard() { delete envelopeCopy; } void EnvelopeEditor::ClipBoard::makeCopy(TEnvelope& envelope) { if (envelopeCopy == NULL) envelopeCopy = new TEnvelope; *envelopeCopy = envelope; } void EnvelopeEditor::ClipBoard::paste(TEnvelope& envelope) { if (envelopeCopy) envelope = *envelopeCopy; } void EnvelopeEditor::prepareUndo() { if (envelope == NULL) return; delete before; before = new EnvelopeUndoStackEntry(*envelope); } bool EnvelopeEditor::finishUndo() { EnvelopeUndoStackEntry after(*envelope); if (*before != after) { if (undoStack) { undoStack->Push(*before); undoStack->Push(after); undoStack->Pop(); } notifyListener(NotificationChanges); } return true; } void EnvelopeEditor::revoke(const EnvelopeUndoStackEntry* stackEntry) { stackEntry->GetEnvelope(*envelope); notifyListener(NotificationUndoRedo); notifyListener(NotificationChanges); } EnvelopeEditor::EnvelopeEditor() : EditorBase(), envelope(NULL), envelopeType(EnvelopeTypeVolume), startSelection(false), selectionIndex(-1), before(NULL), undoStack(NULL) { // Undo history undoHistory = new UndoHistory(UNDOHISTORYSIZE_ENVELOPEEDITOR); } EnvelopeEditor::~EnvelopeEditor() { delete undoHistory; delete undoStack; delete before; } void EnvelopeEditor::attachEnvelope(TEnvelope* envelope, XModule* module) { if (envelope != this->envelope) resetSelection(); if (envelope) { // --------- update undo history information -------------------- if (undoStack) { // if the undo stack is empty, we don't need to save current undo stack if (!undoStack->IsEmpty() || !undoStack->IsTop()) { undoStack = undoHistory->getUndoStack(envelope, this->envelope, undoStack); } // delete it if it's empty else { delete undoStack; undoStack = NULL; undoStack = undoHistory->getUndoStack(envelope, NULL, NULL); } } // couldn't get any from history, create new one if (!undoStack) { undoStack = new PPUndoStack(UNDODEPTH_ENVELOPEEDITOR); } } attachModule(module); this->envelope = envelope; notifyListener(NotificationReload); } bool EnvelopeEditor::isEmptyEnvelope() const { return (envelope == NULL || envelope->num == 0); } void EnvelopeEditor::reset() { if (undoHistory) delete undoHistory; if (undoStack) { delete undoStack; undoStack = NULL; undoStack = new PPUndoStack(UNDODEPTH_ENVELOPEEDITOR); } undoHistory = new UndoHistory(UNDOHISTORYSIZE_ENVELOPEEDITOR); } void EnvelopeEditor::makeCopy() { if (!canCopy()) return; ClipBoard::getInstance()->makeCopy(*envelope); } void EnvelopeEditor::pasteCopy() { prepareUndo(); ClipBoard::getInstance()->paste(*envelope); finishUndo(); } void EnvelopeEditor::pasteOther(const TEnvelope& env) { prepareUndo(); *envelope = env; finishUndo(); } bool EnvelopeEditor::canCopy() const { return (envelope && envelope->num >= 2); } void EnvelopeEditor::undo() { if (undoStack->IsEmpty()) return; if (undoStack) { revoke(undoStack->Pop()); } } void EnvelopeEditor::redo() { if (undoStack->IsTop()) return; if (undoStack) { revoke(undoStack->Advance()); } } void EnvelopeEditor::startSelectionDragging(pp_int32 index) { if (index != -1) { prepareUndo(); selectionIndex = index; startSelection = true; } } void EnvelopeEditor::endSelectionDragging() { if (startSelection) { startSelection = false; finishUndo(); } } pp_int32 EnvelopeEditor::getHorizontalExtent() const { if (envelope == NULL) return -1; if (envelope->num == 0) return -1; pp_int32 max = envelope->env[0][0]; for (pp_int32 i = 1; i < envelope->num; i++) if (envelope->env[i][0] > max) max = envelope->env[i][0]; return max; } void EnvelopeEditor::setEnvelopePoint(pp_int32 index, pp_int32 x, pp_int32 y) { if (envelope == NULL) return; if (envelope->num == 0) return; if (index == -1) return; if (index == 0) { if (x > 0) x = 0; } if (index > 0) { if (x < envelope->env[index - 1][0] + 1) x = envelope->env[index - 1][0] + 1; if (index < envelope->num - 1) { if (x > envelope->env[index + 1][0] - 1) x = envelope->env[index + 1][0] - 1; } } if (x < 0) x = 0; if (y < 0) y = 0; if (y > 256) y = 256; envelope->env[index][0] = (pp_uint16)x; envelope->env[index][1] = (pp_uint16)y; } void EnvelopeEditor::enableEnvelope(bool b) { prepareUndo(); if (envelope) { // clear old flag envelope->type &= ~1; // set new flag if (b) envelope->type |= 1; } finishUndo(); } bool EnvelopeEditor::isEnvelopeEnabled() const { if (envelope == NULL) return false; return (envelope->type & 1) != 0; } void EnvelopeEditor::enableSustain(bool b) { prepareUndo(); if (envelope) { // clear old flag envelope->type &= ~2; // set new flag if (b) envelope->type |= 2; } finishUndo(); } bool EnvelopeEditor::isSustainEnabled() const { if (envelope == NULL) return false; return (envelope->type & 2) != 0; } pp_int32 EnvelopeEditor::getSustainPtIndex() const { if (envelope == NULL) return 0; return envelope->sustain; } void EnvelopeEditor::enableLoop(bool b) { prepareUndo(); if (envelope) { // clear old flag envelope->type &= ~4; // set new flag if (b) envelope->type |= 4; } finishUndo(); } bool EnvelopeEditor::isLoopEnabled() const { if (envelope == NULL) return false; return (envelope->type & 4) != 0; } pp_int32 EnvelopeEditor::getLoopStartPtIndex() const { if (envelope == NULL) return 0; return envelope->loops; } pp_int32 EnvelopeEditor::getLoopEndPtIndex() const { if (envelope == NULL) return 0; return envelope->loope; } void EnvelopeEditor::selectNextSustainPoint() { prepareUndo(); if (envelope && envelope->sustain < envelope->num - 1) envelope->sustain++; finishUndo(); } void EnvelopeEditor::selectPreviousSustainPoint() { prepareUndo(); if (envelope && envelope->sustain > 0) envelope->sustain--; finishUndo(); } void EnvelopeEditor::selectNextLoopStartPoint() { prepareUndo(); if (envelope && envelope->loops < envelope->num - 1) envelope->loops++; if (envelope->loops>envelope->loope) envelope->loops = envelope->loope; finishUndo(); } void EnvelopeEditor::selectPreviousLoopStartPoint() { prepareUndo(); if (envelope && envelope->loops > 0) envelope->loops--; if (envelope->loops>envelope->loope) envelope->loops = envelope->loope; finishUndo(); } void EnvelopeEditor::selectNextLoopEndPoint() { prepareUndo(); if (envelope && envelope->loope < envelope->num - 1) envelope->loope++; if (envelope->loopeloops) envelope->loope = envelope->loops; finishUndo(); } void EnvelopeEditor::selectPreviousLoopEndPoint() { prepareUndo(); if (envelope && envelope->loope > 0) envelope->loope--; if (envelope->loopeloops) envelope->loope = envelope->loops; finishUndo(); } void EnvelopeEditor::deletePoint() { if (envelope == NULL) return; if (envelope->num <= 2) return; if (selectionIndex == -1) return; prepareUndo(); for (pp_int32 i = selectionIndex; i < envelope->num - 1; i++) { envelope->env[i][0] = envelope->env[i+1][0]; envelope->env[i][1] = envelope->env[i+1][1]; } envelope->num--; if (envelope->loops > selectionIndex) envelope->loops--; if (envelope->loops >= envelope->num) envelope->loops = envelope->num-1; if (envelope->loope > selectionIndex) envelope->loope--; if (envelope->loope >= envelope->num) envelope->loope = envelope->num-1; if (envelope->sustain > selectionIndex) envelope->sustain--; if (envelope->sustain >= envelope->num) envelope->sustain = envelope->num-1; if (selectionIndex >= envelope->num) selectionIndex = envelope->num-1; finishUndo(); } void EnvelopeEditor::addPoint() { if (envelope == NULL) return; if (envelope->num >= 12) return; prepareUndo(); pp_int16 points[12][2]; if (selectionIndex >= 0 && selectionIndex < envelope->num - 1) { pp_int32 i = 0; for (i = 0; i <= selectionIndex; i++) { points[i][0] = envelope->env[i][0]; points[i][1] = envelope->env[i][1]; } if (envelope->loops > selectionIndex) envelope->loops++; if (envelope->loope > selectionIndex) envelope->loope++; if (envelope->sustain > selectionIndex) envelope->sustain++; for (i = selectionIndex + 2; i <= envelope->num; i++) { points[i][0] = envelope->env[i-1][0]; points[i][1] = envelope->env[i-1][1]; } selectionIndex++; envelope->num++; points[selectionIndex][0] = (envelope->env[selectionIndex-1][0] + envelope->env[selectionIndex][0]) / 2; points[selectionIndex][1] = (envelope->env[selectionIndex-1][1] + envelope->env[selectionIndex][1]) / 2; for (i = 0; i < envelope->num; i++) { envelope->env[i][0] = points[i][0]; envelope->env[i][1] = points[i][1]; } } else { if (envelope->num) { envelope->env[envelope->num][0] = envelope->env[envelope->num-1][0] + 10; envelope->env[envelope->num][1] = envelope->env[envelope->num-1][1]; } else { envelope->env[0][0] = 0; envelope->env[0][1] = 128; envelope->env[1][0] = 10; envelope->env[1][1] = 128; envelope->num++; } envelope->num++; } finishUndo(); } void EnvelopeEditor::tool_xScaleEnvelope(const FilterParameters* par) { prepareUndo(); float scale = par->getParameter(0).floatPart; for (pp_int32 i = 0; i < envelope->num; i++) { envelope->env[i][0] = (pp_int16)(envelope->env[i][0]*scale); } finishUndo(); } void EnvelopeEditor::tool_yScaleEnvelope(const FilterParameters* par) { prepareUndo(); float scale = par->getParameter(0).floatPart; pp_int32 i; switch (getEnvelopeType()) { case EnvelopeEditor::EnvelopeTypeVolume: for (i = 0; i < envelope->num; i++) { pp_int16 fy = (pp_int16)(envelope->env[i][1]*scale); if (fy < 0) fy = 0; if (fy > 256) fy = 256; envelope->env[i][1] = fy; } break; case EnvelopeEditor::EnvelopeTypePanning: for (i = 0; i < envelope->num; i++) { pp_int16 fy = (pp_int16)((envelope->env[i][1]-128)*scale) + 128; if (fy < 0) fy = 0; if (fy > 256) fy = 256; envelope->env[i][1] = fy; } break; } finishUndo(); } milkytracker-0.90.85+dfsg/src/tracker/SectionTranspose.cpp0000644000175000017500000005551211252224630022661 0ustar admin2admin2/* * tracker/SectionTranspose.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionTranspose.cpp * MilkyTracker * * Created by Peter Barth on 10.04.05. * */ #include "SectionTranspose.h" #include "Tracker.h" #include "TrackerConfig.h" #include "ModuleEditor.h" #include "RadioGroup.h" #include "Seperator.h" #include "StaticText.h" #include "Container.h" #include "PatternEditorControl.h" #include "DialogBase.h" #include "PatternTools.h" #include "Tools.h" #include "ControlIDs.h" enum ControlIDs { TRANSPOSE_BUTTON_INS_PLUS = 31100, TRANSPOSE_BUTTON_INS_MINUS, TRANSPOSE_BUTTON_INS_RANGESTART_PLUS, TRANSPOSE_BUTTON_INS_RANGESTART_MINUS, TRANSPOSE_BUTTON_INS_RANGEEND_PLUS, TRANSPOSE_BUTTON_INS_RANGEEND_MINUS, TRANSPOSE_BUTTON_NOTE_PLUS, TRANSPOSE_BUTTON_NOTE_MINUS, TRANSPOSE_BUTTON_NOTE_RANGESTART_PLUS, TRANSPOSE_BUTTON_NOTE_RANGESTART_MINUS, TRANSPOSE_BUTTON_NOTE_RANGEEND_PLUS, TRANSPOSE_BUTTON_NOTE_RANGEEND_MINUS, TRANSPOSE_BUTTON_AMOUNT_PLUS, TRANSPOSE_BUTTON_AMOUNT_MINUS, TRANSPOSE_BUTTON_AMOUNT_NOTEUP, TRANSPOSE_BUTTON_AMOUNT_NOTEDOWN, TRANSPOSE_BUTTON_AMOUNT_OCTAVEUP, TRANSPOSE_BUTTON_AMOUNT_OCTAVEDOWN, TRANSPOSE_BUTTON_USER1, TRANSPOSE_BUTTON_USER2, TRANSPOSE_BUTTON_USER3, TRANSPOSE_BUTTON_USER4, TRANSPOSE_BUTTON_EXIT, TRANSPOSE_TEXT_INS, TRANSPOSE_TEXT_INS_RANGESTART, TRANSPOSE_TEXT_INS_RANGEEND, TRANSPOSE_TEXT_NOTE, TRANSPOSE_TEXT_NOTE_RANGESTART, TRANSPOSE_TEXT_NOTE_RANGEEND, TRANSPOSE_TEXT_AMOUNT, TRANSPOSE_TEXT_AMOUNT2 }; // Class which responds to message box clicks class DialogResponderTranspose : public DialogResponder { private: SectionTranspose& section; public: DialogResponderTranspose(SectionTranspose& section) : section(section) { } virtual pp_int32 ActionOkay(PPObject* sender) { switch (reinterpret_cast(sender)->getID()) { case MESSAGEBOX_TRANSPOSEPROCEED: section.transposeSong(); break; } return 0; } }; SectionTranspose::SectionTranspose(Tracker& theTracker) : SectionUpperLeft(theTracker, NULL, new DialogResponderTranspose(*this)) { currentInstrumentRangeStart = 0; currentInstrumentRangeEnd = 0; currentTransposeAmount = 1; currentNote = currentNoteRangeStart = currentNoteRangeEnd = 48; } SectionTranspose::~SectionTranspose() { } void SectionTranspose::setCurrentInstrument(pp_int32 instrument, bool redraw/* = true*/) { instrument--; currentInstrument = currentInstrumentRangeStart = currentInstrumentRangeEnd = instrument; if (sectionContainer->isVisible()) { update(redraw); } } pp_int32 SectionTranspose::handleEvent(PPObject* sender, PPEvent* event) { PPRadioGroup* radioGroup; if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case TRANSPOSE_BUTTON_INS_PLUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(2)); radioGroup->setChoice(0); if (currentInstrument < 254) currentInstrument++; update(); break; } case TRANSPOSE_BUTTON_INS_MINUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(2)); radioGroup->setChoice(0); if (currentInstrument > 0) currentInstrument--; update(); break; } case TRANSPOSE_BUTTON_INS_RANGESTART_PLUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(2)); radioGroup->setChoice(2); if (currentInstrumentRangeStart < 254) currentInstrumentRangeStart++; if (currentInstrumentRangeEnd < currentInstrumentRangeStart) currentInstrumentRangeStart = currentInstrumentRangeEnd; update(); break; } case TRANSPOSE_BUTTON_INS_RANGESTART_MINUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(2)); radioGroup->setChoice(2); if (currentInstrumentRangeStart > 0) currentInstrumentRangeStart--; if (currentInstrumentRangeStart > currentInstrumentRangeEnd) currentInstrumentRangeStart = currentInstrumentRangeEnd; update(); break; } case TRANSPOSE_BUTTON_INS_RANGEEND_PLUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(2)); radioGroup->setChoice(2); if (currentInstrumentRangeEnd < 254) currentInstrumentRangeEnd++; if (currentInstrumentRangeStart > currentInstrumentRangeEnd) currentInstrumentRangeStart = currentInstrumentRangeEnd; update(); break; } case TRANSPOSE_BUTTON_INS_RANGEEND_MINUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(2)); radioGroup->setChoice(2); if (currentInstrumentRangeEnd > 0) currentInstrumentRangeEnd--; if (currentInstrumentRangeEnd < currentInstrumentRangeStart) currentInstrumentRangeEnd = currentInstrumentRangeStart; update(); break; } // note range case TRANSPOSE_BUTTON_NOTE_PLUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(3)); radioGroup->setChoice(0); if (currentNote < 119) currentNote++; update(); break; } case TRANSPOSE_BUTTON_NOTE_MINUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(3)); radioGroup->setChoice(0); if (currentNote > 0) currentNote--; update(); break; } case TRANSPOSE_BUTTON_NOTE_RANGESTART_PLUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(3)); radioGroup->setChoice(2); if (currentNoteRangeStart < 119) currentNoteRangeStart++; if (currentNoteRangeEnd < currentNoteRangeStart) currentNoteRangeStart = currentNoteRangeEnd; update(); break; } case TRANSPOSE_BUTTON_NOTE_RANGESTART_MINUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(3)); radioGroup->setChoice(2); if (currentNoteRangeStart > 0) currentNoteRangeStart--; if (currentNoteRangeStart > currentNoteRangeEnd) currentNoteRangeStart = currentNoteRangeEnd; update(); break; } case TRANSPOSE_BUTTON_NOTE_RANGEEND_PLUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(3)); radioGroup->setChoice(2); if (currentNoteRangeEnd < 119) currentNoteRangeEnd++; if (currentNoteRangeStart > currentNoteRangeEnd) currentNoteRangeStart = currentNoteRangeEnd; update(); break; } case TRANSPOSE_BUTTON_NOTE_RANGEEND_MINUS: { radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(3)); radioGroup->setChoice(2); if (currentNoteRangeEnd > 0) currentNoteRangeEnd--; if (currentNoteRangeEnd < currentNoteRangeStart) currentNoteRangeEnd = currentNoteRangeStart; update(); break; } case TRANSPOSE_BUTTON_AMOUNT_PLUS: { if (currentTransposeAmount < 48) currentTransposeAmount ++; if (currentTransposeAmount == 0) currentTransposeAmount = 1; update(); break; } case TRANSPOSE_BUTTON_AMOUNT_MINUS: { if (currentTransposeAmount > -48) currentTransposeAmount --; if (currentTransposeAmount == 0) currentTransposeAmount = -1; update(); break; } case TRANSPOSE_BUTTON_AMOUNT_NOTEUP: currentTransposeAmount = 1; update(); break; case TRANSPOSE_BUTTON_AMOUNT_NOTEDOWN: currentTransposeAmount = -1; update(); break; case TRANSPOSE_BUTTON_AMOUNT_OCTAVEUP: currentTransposeAmount = 12; update(); break; case TRANSPOSE_BUTTON_AMOUNT_OCTAVEDOWN: currentTransposeAmount = -12; update(); break; case TRANSPOSE_BUTTON_EXIT: if (event->getID() != eCommand) break; show(false); break; case TRANSPOSE_BUTTON_USER1: case TRANSPOSE_BUTTON_USER2: case TRANSPOSE_BUTTON_USER3: case TRANSPOSE_BUTTON_USER4: { //tracker.ensureSongStopped(); PPContainer* container = static_cast(sectionContainer); pp_int32 res; PPRadioGroup* radioGroupIns = static_cast(container->getControlByID(2)); PPRadioGroup* radioGroupNote = static_cast(container->getControlByID(3)); switch (radioGroupIns->getChoice()) { case 0: tp.insRangeStart = currentInstrument + 1; tp.insRangeEnd = currentInstrument + 1; break; case 1: tp.insRangeStart = 0; tp.insRangeEnd = 255; break; case 2: tp.insRangeStart = currentInstrumentRangeStart + 1; tp.insRangeEnd = currentInstrumentRangeEnd + 1; break; } switch (radioGroupNote->getChoice()) { case 0: tp.noteRangeStart = currentNote + 1; tp.noteRangeEnd = currentNote + 1; break; case 1: tp.noteRangeStart = 1; tp.noteRangeEnd = 96; break; case 2: tp.noteRangeStart = currentNoteRangeStart + 1; tp.noteRangeEnd = currentNoteRangeEnd + 1; break; } tp.amount = currentTransposeAmount; switch (reinterpret_cast(sender)->getID()) { case TRANSPOSE_BUTTON_USER1: res = tracker.getPatternEditorControl()->noteTransposeTrack(tp); break; case TRANSPOSE_BUTTON_USER2: res = tracker.getPatternEditorControl()->noteTransposePattern(tp); break; case TRANSPOSE_BUTTON_USER3: { handleTransposeSong(); break; } case TRANSPOSE_BUTTON_USER4: res = tracker.getPatternEditorControl()->noteTransposeSelection(tp); break; } //char buffer[100]; //sprintf(buffer, "%i Notes have been transposed", res); //tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, buffer, Tracker::MessageBox_OK); tracker.screen->paint(); //tracker.ensureSongPlaying(); return false; } } } return 0; } void SectionTranspose::init(pp_int32 px, pp_int32 py) { pp_int32 i; PPScreen* screen = tracker.screen; // test PPContainer* container = new PPContainer(CONTAINER_TRANSPOSE, tracker.screen, this, PPPoint(px, py), PPSize(320,UPPERLEFTSECTIONHEIGHT), false); container->setColor(TrackerConfig::colorThemeMain); tracker.screen->addControl(container); const pp_int32 buttonIDs[4] = {TRANSPOSE_BUTTON_AMOUNT_NOTEUP, TRANSPOSE_BUTTON_AMOUNT_NOTEDOWN, TRANSPOSE_BUTTON_AMOUNT_OCTAVEUP, TRANSPOSE_BUTTON_AMOUNT_OCTAVEDOWN}; const char* buttonTexts[4] = {"Note Up", "Note Dn", "Octave Up", "Octave Dn"}; const pp_int32 buttonIDs2[4] = {TRANSPOSE_BUTTON_USER1, TRANSPOSE_BUTTON_USER2, TRANSPOSE_BUTTON_USER3, TRANSPOSE_BUTTON_USER4}; const char* buttonTexts2[4] = {"Track", "Pattern", "Song", "Block"}; PPSize size = container->getSize(); /*tracker.showMessageBox(MESSAGEBOX_TRANSPOSE, "Filter options", Tracker::MessageBox_OK, false); PPMessageBoxContainer* container = static_cast(screen->getModalControl()); container->setCaption("Transpose"); container->removeControl(container->getControlByID(MESSAGEBOX_BUTTON_YES)); PPSize size = container->getSize(); size.height = 216; PPPoint location = container->getLocation(); location.y = screen->getHeight() / 2 - size.height / 2; container->setLocation(location); container->setSize(size); PPStaticText* text = static_cast(container->getControlByID(1)); ASSERT(text); text->setUnderlined(true); PPPoint location2 = text->getLocation(); location2.y = location.y + 20; location2.x = location.x + 6; text->setLocation(location2); location2 = location;*/ PPStaticText* text; PPPoint location(px,py); PPPoint location2 = location; PPRadioGroup* radioGroup; PPButton* button; // ----------------------- Instrument ---------------------- location2.x += 2; location2.y += 2; text = new PPStaticText(0, NULL, NULL, location2, "Instrument:", true); container->addControl(text); location2.y += 10; PPPoint temp = location2; radioGroup = new PPRadioGroup(2, screen, this, PPPoint(location2.x, location2.y-2), PPSize(8*9, 42)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("Single:"); radioGroup->addItem("All"); radioGroup->addItem("Range:"); radioGroup->setChoice(1); container->addControl(radioGroup); // plus minus pp_int32 h = location2.x + 8*9; pp_int32 hy = location2.y + 3; container->addControl(new PPStaticText(TRANSPOSE_TEXT_INS, NULL, NULL, PPPoint(h,hy), "xx", false)); h+=8*2+4; button = new PPButton(TRANSPOSE_BUTTON_INS_PLUS, screen, this, PPPoint(h, hy), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); h+=button->getSize().width; button = new PPButton(TRANSPOSE_BUTTON_INS_MINUS, screen, this, PPPoint(h, hy), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); location2.y += radioGroup->getSize().height; //location2.x +=6*8 + 10; location2.x+=8*2-2; h = location2.x; text = new PPStaticText(TRANSPOSE_TEXT_INS_RANGESTART, NULL, NULL, location2, "From:xx", false); container->addControl(text); location2.x += 8*8-4; button = new PPButton(TRANSPOSE_BUTTON_INS_RANGESTART_PLUS, screen, this, location2, PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); location2.x+=button->getSize().width; button = new PPButton(TRANSPOSE_BUTTON_INS_RANGESTART_MINUS, screen, this, location2, PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); //location2.x+=button->getSize().width + 2; location2.x = h; location2.y+=11; text = new PPStaticText(TRANSPOSE_TEXT_INS_RANGEEND, NULL, NULL, location2, "To: xx", false); container->addControl(text); location2.x+=8*8-4; button = new PPButton(TRANSPOSE_BUTTON_INS_RANGEEND_PLUS, screen, this, location2, PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); location2.x+=button->getSize().width; button = new PPButton(TRANSPOSE_BUTTON_INS_RANGEEND_MINUS, screen, this, location2, PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); // ---------------- notes --------------------- location2.x += button->getSize().width + 26; location2.y = location.y + 2; container->addControl(new PPSeperator(0, screen, PPPoint(location2.x-6, location.y+2), (size.height)-42, container->getColor(), false)); text = new PPStaticText(0, NULL, NULL, location2, "Note:", true); container->addControl(text); location2.y += 10; temp = location2; radioGroup = new PPRadioGroup(3, screen, this, PPPoint(location2.x, location2.y-2), PPSize(8*9, 42)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("Single:"); radioGroup->addItem("All"); radioGroup->addItem("Range:"); radioGroup->setChoice(1); container->addControl(radioGroup); // plus minus h = location2.x + 8*9; hy = location2.y + 3; container->addControl(new PPStaticText(TRANSPOSE_TEXT_NOTE, NULL, NULL, PPPoint(h,hy), "xxx", false)); h+=8*3+4; button = new PPButton(TRANSPOSE_BUTTON_NOTE_PLUS, screen, this, PPPoint(h, hy), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); h+=button->getSize().width; button = new PPButton(TRANSPOSE_BUTTON_NOTE_MINUS, screen, this, PPPoint(h, hy), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); location2.y += radioGroup->getSize().height; //location2.x +=6*8 + 10; location2.x+=8*2-2; h = location2.x; text = new PPStaticText(TRANSPOSE_TEXT_NOTE_RANGESTART, NULL, NULL, location2, "From:xxx", false); container->addControl(text); location2.x += 8*9-4; button = new PPButton(TRANSPOSE_BUTTON_NOTE_RANGESTART_PLUS, screen, this, location2, PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); location2.x+=button->getSize().width; button = new PPButton(TRANSPOSE_BUTTON_NOTE_RANGESTART_MINUS, screen, this, location2, PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); //location2.x+=button->getSize().width + 2; location2.x = h; location2.y+=11; text = new PPStaticText(TRANSPOSE_TEXT_NOTE_RANGEEND, NULL, NULL, location2, "To: xxx", false); container->addControl(text); location2.x+=8*9-4; button = new PPButton(TRANSPOSE_BUTTON_NOTE_RANGEEND_PLUS, screen, this, location2, PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); location2.x+=button->getSize().width; button = new PPButton(TRANSPOSE_BUTTON_NOTE_RANGEEND_MINUS, screen, this, location2, PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); // horizontal ruler location2.y += button->getSize().height+5; container->addControl(new PPSeperator(0, screen, PPPoint(location.x+2, location2.y), size.width-5, container->getColor(), true)); location2.x += button->getSize().width + 26; location2.y = location.y + 4; container->addControl(new PPSeperator(0, screen, PPPoint(location2.x-6, location.y+2), (size.height)-42, container->getColor(), false)); const PPString str = "Amount:"; location2.y-=2; text = new PPStaticText(6, NULL, NULL, location2, str, true); container->addControl(text); const PPString str2 = "-xx"; location2.y+=13; location2.x+=8; text = new PPStaticText(TRANSPOSE_TEXT_AMOUNT, NULL, NULL, location2, str2, false); container->addControl(text); h = location2.x+3*8+4; hy = location2.y; button = new PPButton(TRANSPOSE_BUTTON_AMOUNT_PLUS, screen, this, PPPoint(h, hy), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); h+=button->getSize().width; button = new PPButton(TRANSPOSE_BUTTON_AMOUNT_MINUS, screen, this, PPPoint(h, hy), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); hy+=11; h-=5*8; text = new PPStaticText(TRANSPOSE_TEXT_AMOUNT2, NULL, NULL, PPPoint(h+1, hy), "note(s)", true); container->addControl(text); // preset buttons pp_int32 buttonWidth = 7*8+4; pp_int32 buttonHeight = 9; pp_int32 spacer = 10; pp_int32 y2 = hy+11; pp_int32 x = h-3; for (i = 0; i < 4; i++) { PPButton* button = new PPButton(buttonIDs[i], screen, this, PPPoint(x, y2), PPSize(buttonWidth, buttonHeight)); button->setText(buttonTexts[i]); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(button); y2+= buttonHeight+1; } y2+=10; //container->addControl(new PPSeperator(0, screen, PPPoint(location.x+2, y2), size.width-5, container->getColor(), true)); const PPString str3 = "Apply:"; location2.x = location.x+6; location2.y = y2; text = new PPStaticText(6, NULL, NULL, location2, str3, true); container->addControl(text); buttonWidth = 60; //y2+=14; spacer = 4; buttonHeight = 14; pp_int32 cx = ((buttonWidth) * 4 + (spacer*3))/2; x = location.x + (size.width-6*8)/2 - cx + 6*8 + 2; y2-=3; for (i = 0; i < 4; i++) { PPButton* button = new PPButton(buttonIDs2[i], screen, this, PPPoint(x, y2), PPSize(buttonWidth, buttonHeight)); button->setText(buttonTexts2[i]); container->addControl(button); x+= buttonWidth + spacer; } y2 += buttonHeight+2; container->addControl(new PPSeperator(0, screen, PPPoint(location.x+2, y2), size.width-5, container->getColor(), true)); y2+=4; buttonWidth = 8*4+4; buttonHeight = 11; button = new PPButton(TRANSPOSE_BUTTON_EXIT, screen, this, PPPoint(x-buttonWidth-spacer, y2), PPSize(buttonWidth,buttonHeight)); button->setText("Exit"); container->addControl(button); sectionContainer = container; initialised = true; showSection(false); } void SectionTranspose::show(bool bShow) { if (!initialised) currentNote = currentNoteRangeStart = currentNoteRangeEnd = 48; SectionUpperLeft::show(bShow); } void SectionTranspose::update(bool repaint/* = true*/) { char buffer[80]; PPContainer* container = static_cast(sectionContainer); ASSERT(sectionContainer); PPStaticText* text = static_cast(container->getControlByID(TRANSPOSE_TEXT_INS)); text->setHexValue(currentInstrument+1,2); text = static_cast(container->getControlByID(TRANSPOSE_TEXT_INS_RANGESTART)); strcpy(buffer, "From:"); PPTools::convertToHex(buffer+5, currentInstrumentRangeStart+1, 2); text->setText(buffer); text = static_cast(container->getControlByID(TRANSPOSE_TEXT_INS_RANGEEND)); strcpy(buffer, "To: "); PPTools::convertToHex(buffer+5, currentInstrumentRangeEnd+1, 2); text->setText(buffer); text = static_cast(container->getControlByID(TRANSPOSE_TEXT_NOTE)); PatternTools::getNoteName(buffer, currentNote+1); text->setText(buffer); text = static_cast(container->getControlByID(TRANSPOSE_TEXT_NOTE_RANGESTART)); strcpy(buffer, "From:"); PatternTools::getNoteName(buffer+5, currentNoteRangeStart+1); text->setText(buffer); text = static_cast(container->getControlByID(TRANSPOSE_TEXT_NOTE_RANGEEND)); strcpy(buffer, "To :"); PatternTools::getNoteName(buffer+5, currentNoteRangeEnd+1); text->setText(buffer); text = static_cast(container->getControlByID(TRANSPOSE_TEXT_AMOUNT)); sprintf(buffer, "%i", currentTransposeAmount); text->setText(buffer); text = static_cast(container->getControlByID(TRANSPOSE_TEXT_AMOUNT2)); text->setText(currentTransposeAmount < 0 ? "note(s)" : "note(s)"); tracker.screen->paintControl(container); } void SectionTranspose::handleTransposeSong() { pp_int32 fuckups = tracker.moduleEditor->noteTransposeSong(tp, true); if (!fuckups) tracker.moduleEditor->noteTransposeSong(tp); else { char buffer[100]; sprintf(buffer, "%i notes will be erased, continue?", fuckups); showMessageBox(MESSAGEBOX_TRANSPOSEPROCEED, buffer); } } void SectionTranspose::transposeSong() { tracker.moduleEditor->noteTransposeSong(getTransposeParameters()); tracker.screen->paint(); } milkytracker-0.90.85+dfsg/src/tracker/SystemMessage.cpp0000644000175000017500000000356011150223367022146 0ustar admin2admin2/* * tracker/SystemMessage.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SystemErrorMessage.cpp * MilkyTracker * * Created by Peter Barth on 27.12.07. * */ #include "SystemMessage.h" #include "Screen.h" #include "PPMessageBox.h" SystemMessage::SystemMessage(PPScreen& screen, Messages message) : screen(screen), message(message) { } void SystemMessage::show() { const char* header = NULL; const char* message = NULL; switch (this->message) { case MessageSoundDriverInitFailed: header = "Error"; message = "Sound driver initialization failed. Try different settings or driver."; break; case MessageFullScreenFailed: header = "Error"; message = "The video mode you've selected isn't available on your gfx card/monitor."; break; case MessageResChangeRestart: header = "Please restart"; message = "MilkyTracker needs to be restarted to apply new video mode."; break; case MessageLimitedInput: header = "Note"; message = "Due to limited input this edit mode might not be fully usable on a low-res device."; break; } if (header && message) { PPMessageBox messageBox(&screen, header, message); messageBox.runModal(); } } milkytracker-0.90.85+dfsg/src/tracker/DialogListBox.cpp0000755000175000017500000000366211150223367022067 0ustar admin2admin2/* * tracker/DialogListBox.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogListBox.cpp * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #include "DialogListBox.h" #include "MessageBoxContainer.h" #include "ListBox.h" DialogListBox::DialogListBox(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, bool okCancel/* = false*/) : PPDialogBase() { if (okCancel) initDialog(screen, responder, id, caption, 290, 142, 26, "Ok", "Cancel"); else initDialog(screen, responder, id, caption, 290, 142, 26, "Okay"); pp_int32 x = getMessageBoxContainer()->getLocation().x; pp_int32 width = getMessageBoxContainer()->getSize().width; PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_YES)); pp_int32 y2 = button->getLocation().y; pp_int32 x2 = x + width / 2 - 30; y2 = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y + 18; x2 = x + width / 2 - 120; listBox = new PPListBox(MESSAGEBOX_LISTBOX_USER1, screen, this, PPPoint(x2, y2), PPSize(240,4 + 7*8), true, false, true, true); listBox->setShowIndex(true); messageBoxContainerGeneric->addControl(listBox); } milkytracker-0.90.85+dfsg/src/tracker/PlayerLogic.cpp0000644000175000017500000001560411150223367021571 0ustar admin2admin2/* * tracker/PlayerLogic.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PlayerLogic.cpp * MilkyTracker * * Created by Peter Barth on 21.12.07. * */ #include "PlayerLogic.h" #include "Tracker.h" #include "PlayerMaster.h" #include "PlayerController.h" #include "ModuleEditor.h" #include "RecorderLogic.h" #include "ListBox.h" #include "Screen.h" #include "PatternEditorControl.h" PlayerLogic::PlayerLogic(Tracker& tracker) : tracker(tracker), liveSwitch(false), stopBackgroundOnPlay(false), tracePlay(false), rowPlay(false) { } void PlayerLogic::setLiveSwitch(bool liveSwitch) { this->liveSwitch = liveSwitch; if (!liveSwitch) tracker.playerMaster->resetQueuedPositions(); } void PlayerLogic::playSong(pp_int32 row/* = 0*/) { tracker.initPlayback(); if (stopBackgroundOnPlay) stopAll(); pp_int32 index = tracker.moduleEditor->getCurrentOrderIndex(); tracker.playerController->playSong(index, row, tracker.muteChannels); } void PlayerLogic::playPattern() { tracker.initPlayback(); if (stopBackgroundOnPlay) stopAll(); tracker.playerController->playPattern(tracker.moduleEditor->getCurrentPatternIndex(), tracker.moduleEditor->getCurrentOrderIndex(), 0, tracker.muteChannels); } void PlayerLogic::playPosition(bool rowOnly/* = false*/) { if (!rowOnly) tracker.initPlayback(); // when the replay engine is already in row playing mode, // we don't need to restart the song, just update the current position to the cursor if (rowOnly && tracker.playerController->isPlaying() && tracker.playerController->isPlayingRowOnly()) { tracker.playerController->setCurrentPatternIndex(tracker.moduleEditor->getCurrentPatternIndex()); tracker.updateSongRow(false); tracker.playerController->readjustSpeed(false); return; } if (stopBackgroundOnPlay) stopAll(); tracker.playerController->playPattern(tracker.moduleEditor->getCurrentPatternIndex(), tracker.moduleEditor->getCurrentOrderIndex(), tracker.getPatternEditorControl()->getCurrentRow(), tracker.muteChannels, rowOnly); } void PlayerLogic::stopPlayer(PlayerController& playerController) { playerController.stop(); playerController.resetPlayTimeCounter(); } void PlayerLogic::stopSong() { tracker.recorderLogic->reset(); stopPlayer(*tracker.playerController); tracker.moduleEditor->cleanUnusedPatterns(); tracker.getPatternEditorControl()->setSongPosition(-1, -1); tracker.screen->paintControl(tracker.getPatternEditorControl()); tracker.updateSpeed(); } void PlayerLogic::stopAll() { for (pp_int32 i = 0; i < tracker.playerMaster->getNumPlayerControllers(); i++) { if (tracker.playerController != tracker.playerMaster->getPlayerController(i)) tracker.playerMaster->getPlayerController(i)->pause(); } //stopPlayer(*tracker.playerMaster->getPlayerController(i)); } void PlayerLogic::storePosition() { // does the current pattern match the selected order list index? backupIndex = tracker.isEditingCurrentOrderlistPattern() ? tracker.getOrderListBoxIndex() : tracker.moduleEditor->getCurrentPatternIndex(); // indicate if we were editing a pattern different from the one in the orderlist backupIndex |= (tracker.isEditingCurrentOrderlistPattern() ? 0x10000 : 0); backupRow = tracker.getPatternEditorControl()->getCurrentRow(); } void PlayerLogic::restorePosition() { pp_int32 index = backupIndex & 0xFFFF; tracker.screen->pauseUpdate(true); if (backupIndex & 0x10000) { tracker.setOrderListIndex(index); } else { tracker.moduleEditor->setCurrentPatternIndex(index); tracker.updatePattern(); } tracker.screen->pauseUpdate(false); tracker.getPatternEditorControl()->setRow(backupRow); tracker.screen->paint(); } void PlayerLogic::playTrace() { if (!tracePlay) { storePosition(); tracePlay = true; if (tracker.isEditingCurrentOrderlistPattern()) playSong(tracker.getPatternEditorControl()->getCurrentRow()); else playPosition(); } } void PlayerLogic::playRow() { rowPlay = true; playPosition(true); tracker.getPatternEditorControl()->advanceRow(true); } void PlayerLogic::ensureSongStopped(bool bResetMainVolume, bool suspend) { if (suspend) { tracker.playerController->suspendPlayer(bResetMainVolume); } else { tracker.playerController->stopSample(); // make sure song is stopped, but don't reset the main volume tracker.playerController->stop(bResetMainVolume); } } void PlayerLogic::ensureSongPlaying(bool continuePlaying) { if (tracker.playerController->isSuspended()) tracker.playerController->resumePlayer(continuePlaying); else tracker.playerController->continuePlaying(); } #define CONTINUEPATTERN \ if (tracker.playerController->isPlayingPattern() && \ !tracker.playerController->isPlayingRowOnly()) \ tracker.playerController->playPattern(tracker.moduleEditor->getCurrentPatternIndex(), \ tracker.moduleEditor->getCurrentOrderIndex(), \ 0, \ tracker.muteChannels); #define CONTINUE \ CONTINUEPATTERN \ else if (tracker.playerController->isPlaying() && \ !tracker.playerController->isPlayingRowOnly() && \ tracker.shouldFollowSong()) \ tracker.playerController->playSong(tracker.moduleEditor->getCurrentOrderIndex(), \ 0, \ tracker.muteChannels); void PlayerLogic::continuePlayingPattern() { if (liveSwitch) { tracker.playerController->setNextPatternToPlay(tracker.moduleEditor->getCurrentPatternIndex()); return; } if (tracker.playerController->isPlayingPattern() && !tracker.playerController->isPlayingRowOnly()) tracker.playerController->playPattern(tracker.moduleEditor->getCurrentPatternIndex(), tracker.moduleEditor->getCurrentOrderIndex(), -1, tracker.muteChannels); } void PlayerLogic::continuePlayingSong() { if (liveSwitch) { tracker.playerController->setNextOrderToPlay(tracker.moduleEditor->getCurrentOrderIndex()); return; } CONTINUE } void PlayerLogic::finishTraceAndRowPlay() { if (tracePlay) { stopSong(); tracePlay = false; restorePosition(); } else if (rowPlay) { rowPlay = false; } } void PlayerLogic::playNote(class PlayerController& playerController, pp_uint8 chn, pp_int32 note, pp_int32 i, pp_int32 vol/* = -1*/) { playerController.playNote(chn, note, i, vol); } milkytracker-0.90.85+dfsg/src/tracker/SectionDiskMenu.cpp0000644000175000017500000015226211150223367022425 0ustar admin2admin2/* * tracker/SectionDiskMenu.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionDiskMenu.cpp * MilkyTracker * * Created by Peter Barth on 08.07.05. * */ #include "SectionDiskMenu.h" #include "Tracker.h" #include "TrackerConfig.h" #include "TrackerSettingsDatabase.h" #include "ModuleEditor.h" #include "GlobalColorConfig.h" #include "Container.h" #include "MessageBoxContainer.h" #include "RadioGroup.h" #include "Seperator.h" #include "Slider.h" #include "StaticText.h" #include "ListBox.h" #include "ListBoxFileBrowser.h" #include "CheckBox.h" #include "PPUIConfig.h" #include "PatternEditorControl.h" #include "SectionSwitcher.h" #include "SectionHDRecorder.h" #include "DialogBase.h" #include "PatternTools.h" #include "Tools.h" #include "PPPath.h" #include "XMFile.h" #include "PPSavePanel.h" #include "FileExtProvider.h" #include "ControlIDs.h" enum ControlIDs { DISKMENU_BUTTON_FLIP = 7000, DISKMENU_BUTTON_EXIT, DISKMENU_NORMAL_STATICTEXT_HEADING, DISKMENU_NORMAL_BUTTON_LOAD_SONG, DISKMENU_NORMAL_BUTTON_SAVE_SONG, DISKMENU_NORMAL_BUTTON_LOAD_PATTERN, DISKMENU_NORMAL_BUTTON_SAVE_PATTERN, DISKMENU_NORMAL_BUTTON_LOAD_TRACK, DISKMENU_NORMAL_BUTTON_SAVE_TRACK, DISKMENU_NORMAL_BUTTON_LOAD_INSTRUMENT, DISKMENU_NORMAL_BUTTON_SAVE_INSTRUMENT, DISKMENU_NORMAL_BUTTON_LOAD_SAMPLE, DISKMENU_NORMAL_BUTTON_SAVE_SAMPLE, DISKMENU_NORMAL_RADIOGROUP_SONGTYPE, DISKMENU_NORMAL_RADIOGROUP_PATTERNTYPE, DISKMENU_NORMAL_RADIOGROUP_TRACKTYPE, DISKMENU_NORMAL_RADIOGROUP_INSTRUMENTTYPE, DISKMENU_NORMAL_RADIOGROUP_SAMPLETYPE, DISKMENU_CLASSIC_STATICTEXT_HEADING, DISKMENU_CLASSIC_BUTTON_TYPE_TYPE, DISKMENU_CLASSIC_BUTTON_TYPE_MODULE, DISKMENU_CLASSIC_BUTTON_TYPE_INSTRUMENT, DISKMENU_CLASSIC_BUTTON_TYPE_SAMPLE, DISKMENU_CLASSIC_BUTTON_TYPE_PATTERN, DISKMENU_CLASSIC_BUTTON_TYPE_TRACK, DISKMENU_CLASSIC_BUTTON_SAVE, DISKMENU_CLASSIC_LISTBOX_NAME, DISKMENU_CLASSIC_LISTBOX_BROWSER, DISKMENU_CLASSIC_BUTTON_PREV, DISKMENU_CLASSIC_BUTTON_NEXT, DISKMENU_CLASSIC_BUTTON_PARENT, DISKMENU_CLASSIC_BUTTON_ROOT, DISKMENU_CLASSIC_BUTTON_HOME, DISKMENU_CLASSIC_BUTTON_REFRESH, DISKMENU_CLASSIC_BUTTON_LOAD, DISKMENU_CLASSIC_BUTTON_DELETE, DISKMENU_CLASSIC_BUTTON_MAKEDIR, DISKMENU_CLASSIC_STATICTEXT_FILTEREXTENSIONS, DISKMENU_CLASSIC_CHECKBOX_FILTEREXTENSIONS, DISKMENU_CLASSIC_STATICTEXT_SORTBY, DISKMENU_CLASSIC_BUTTON_SORTBY, DISKMENU_CLASSIC_BUTTON_SORTORDER, DISKMENU_CLASSIC_BUTTON_VEXTEND, DISKMENU_CLASSIC_BUTTON_HEXTEND, DISKMENU_CLASSIC_BUTTON_DIR0, DISKMENU_CLASSIC_BUTTON_DIR1, DISKMENU_CLASSIC_BUTTON_DIR2, DISKMENU_CLASSIC_BUTTON_DIR3, DISKMENU_CLASSIC_BUTTON_DIR4, DISKMENU_CLASSIC_BUTTON_STOREDIR, // this needs to be DISKMENU_CLASSIC_BUTTON_DIR5+1 DISKMENU_CLASSIC_BUTTON_TYPE, RESPONDMESSAGEBOX_OVERWRITE, RESPONDMESSAGEBOX_DELETE }; #define RADIOGROUPTOINDEX(ID) ((ID) - DISKMENU_NORMAL_RADIOGROUP_SONGTYPE) #define INDEXTORADIOGROUP(INDEX) ((INDEX) + DISKMENU_NORMAL_RADIOGROUP_SONGTYPE) // Class which responds to the above message box clicks class DialogResponderDisk : public DialogResponder { private: SectionDiskMenu& section; public: DialogResponderDisk(SectionDiskMenu& section) : section(section) { } virtual pp_int32 ActionOkay(PPObject* sender) { if (reinterpret_cast(sender)->getID() == RESPONDMESSAGEBOX_OVERWRITE) { section.saveCurrent(); return 1; } else if (reinterpret_cast(sender)->getID() == RESPONDMESSAGEBOX_DELETE) { section.deleteCurrent(); } return 0; } virtual pp_int32 ActionCancel(PPObject* sender) { return 0; } }; class PPDummySavePanel : public PPSavePanel { public: PPDummySavePanel(const PPSystemString& defaultFileName) : PPSavePanel(NULL, "", defaultFileName) { this->defaultFileName = defaultFileName; } virtual ReturnCodes runModal() { return ReturnCodeOK; } virtual const PPSystemString& getFileName() { return defaultFileName; } }; class ColorQueryListener : public PPListBox::ColorQueryListener { private: SectionDiskMenu& sectionDiskMenu; public: ColorQueryListener(SectionDiskMenu& theSectionDiskMenu) : sectionDiskMenu(theSectionDiskMenu) { } virtual PPColor getColor(pp_uint32 index, PPListBox& sender) { PPListBoxFileBrowser& listBoxFiles = static_cast(sender); const PPColor& fileColor = GlobalColorConfig::getInstance()->getColor(GlobalColorConfig::ColorTextHighlited); const PPColor& dirColor = GlobalColorConfig::getInstance()->getColor(GlobalColorConfig::ColorForegroundText); return listBoxFiles.getPathEntry(index)->isFile() ? fileColor : dirColor; } }; SectionDiskMenu::SectionDiskMenu(Tracker& theTracker) : SectionUpperLeft(theTracker, NULL, new DialogResponderDisk(*this)), diskMenuVisible(false), classicViewState(BrowseModules), forceClassicBrowser(false), moduleTypeAdjust(true), sortAscending(true), storePath(false), listBoxFiles(NULL), editFieldCurrentFile(NULL), currentActiveRadioGroup(NULL) { normalViewControls = new PPSimpleVector(0, false); classicViewControls = new PPSimpleVector(0, false); fileFullPath = new PPSystemString(); file = new PPSystemString(); lastFocusedControl = NULL; #ifdef __LOWRES__ lastSIPOffsetMove = 0; #endif colorQueryListener = new ColorQueryListener(*this); } SectionDiskMenu::~SectionDiskMenu() { delete colorQueryListener; delete fileFullPath; delete file; delete normalViewControls; delete classicViewControls; } pp_int32 SectionDiskMenu::getCurrentSelectedSampleSaveType() { if (sectionContainer == NULL) return -1; switch (static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SAMPLETYPE))->getChoice()) { case 0: return FileTypes::FileTypeSampleWAV; case 1: return FileTypes::FileTypeSampleIFF; } return -1; } pp_int32 SectionDiskMenu::handleEvent(PPObject* sender, PPEvent* event) { PPScreen* screen = tracker.screen; if (event->getID() == eCommand) { switch (reinterpret_cast(sender)->getID()) { case DISKMENU_NORMAL_BUTTON_LOAD_SONG: { if (screen->getModalControl()) break; tracker.loadTypeWithDialog(FileTypes::FileTypeSongAllModules); break; } case DISKMENU_NORMAL_BUTTON_SAVE_SONG: { switch (static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SONGTYPE))->getChoice()) { case 0: tracker.saveTypeWithDialog(FileTypes::FileTypeSongXM); break; case 1: tracker.saveTypeWithDialog(FileTypes::FileTypeSongMOD); break; case 2: tracker.sectionSwitcher->showUpperSection(tracker.sectionHDRecorder); break; } break; } case DISKMENU_NORMAL_BUTTON_LOAD_PATTERN: { tracker.loadTypeWithDialog(FileTypes::FileTypePatternXP); break; } case DISKMENU_NORMAL_BUTTON_SAVE_PATTERN: { tracker.saveTypeWithDialog(FileTypes::FileTypePatternXP); break; } case DISKMENU_NORMAL_BUTTON_LOAD_TRACK: { tracker.loadTypeWithDialog(FileTypes::FileTypeTrackXT); break; } case DISKMENU_NORMAL_BUTTON_SAVE_TRACK: { tracker.saveTypeWithDialog(FileTypes::FileTypeTrackXT); break; } case DISKMENU_NORMAL_BUTTON_LOAD_INSTRUMENT: { tracker.loadTypeWithDialog(FileTypes::FileTypeSongAllInstruments); break; } case DISKMENU_NORMAL_BUTTON_SAVE_INSTRUMENT: { tracker.saveTypeWithDialog(FileTypes::FileTypeInstrumentXI); break; } case DISKMENU_NORMAL_BUTTON_LOAD_SAMPLE: { tracker.loadTypeWithDialog(FileTypes::FileTypeSongAllSamples); break; } case DISKMENU_NORMAL_BUTTON_SAVE_SAMPLE: { tracker.saveTypeWithDialog(getCurrentSelectedSampleSaveType()); break; } case DISKMENU_BUTTON_FLIP: { flip(); break; } case DISKMENU_CLASSIC_BUTTON_TYPE_TYPE: { switchState(BrowseAll); break; } case DISKMENU_CLASSIC_BUTTON_TYPE_MODULE: { switchState(BrowseModules); break; } case DISKMENU_CLASSIC_BUTTON_TYPE_INSTRUMENT: { switchState(BrowseInstruments); break; } case DISKMENU_CLASSIC_BUTTON_TYPE_SAMPLE: { switchState(BrowseSamples); break; } case DISKMENU_CLASSIC_BUTTON_TYPE_PATTERN: { switchState(BrowsePatterns); break; } case DISKMENU_CLASSIC_BUTTON_TYPE_TRACK: { switchState(BrowseTracks); break; } case DISKMENU_CLASSIC_BUTTON_SAVE: { prepareSave(); break; } case DISKMENU_CLASSIC_BUTTON_PREV: prev(); break; case DISKMENU_CLASSIC_BUTTON_NEXT: next(); break; case DISKMENU_CLASSIC_BUTTON_PARENT: parent(); break; case DISKMENU_CLASSIC_BUTTON_ROOT: root(); break; case DISKMENU_CLASSIC_BUTTON_HOME: home(); break; case DISKMENU_CLASSIC_BUTTON_REFRESH: reload(); break; case DISKMENU_CLASSIC_BUTTON_DELETE: showDeleteMessageBox(); break; case DISKMENU_CLASSIC_BUTTON_LOAD: handleLoadOrStep(); break; case DISKMENU_CLASSIC_BUTTON_SORTBY: listBoxFiles->cycleSorting(); reload(); updateButtonStates(); break; case DISKMENU_CLASSIC_BUTTON_SORTORDER: sortAscending = !sortAscending; listBoxFiles->setSortAscending(sortAscending); reload(); updateButtonStates(); break; case DISKMENU_CLASSIC_CHECKBOX_FILTEREXTENSIONS: updateFilter(); break; case DISKMENU_CLASSIC_BUTTON_VEXTEND: resizeBrowserVertically(); break; case DISKMENU_CLASSIC_BUTTON_HEXTEND: resizeBrowserHorizontally(); break; case DISKMENU_CLASSIC_BUTTON_STOREDIR: { storePath = !storePath; PPButton* button = reinterpret_cast(sender); button->setPressed(storePath); screen->paintControl(button); break; } case DISKMENU_CLASSIC_BUTTON_DIR0: case DISKMENU_CLASSIC_BUTTON_DIR1: case DISKMENU_CLASSIC_BUTTON_DIR2: case DISKMENU_CLASSIC_BUTTON_DIR3: case DISKMENU_CLASSIC_BUTTON_DIR4: { PPButton* button = reinterpret_cast(sender); PPString strKey = getKeyFromPredefPathButton(button); if (storePath) { PPString path = listBoxFiles->getCurrentPathAsASCIIString(); tracker.settingsDatabase->store(strKey, path); storePath = !storePath; PPButton* button = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_STOREDIR)); button->setPressed(storePath); screen->paintControl(button); } else { PPDictionaryKey* key = tracker.settingsDatabase->restore(strKey); if (key) { PPSystemString str(key->getStringValue()); bool res = listBoxFiles->gotoPath(str); if (!res) tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Couldn't change directory.", Tracker::MessageBox_OK); screen->paintControl(listBoxFiles); } else tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "No directory defined.", Tracker::MessageBox_OK); } break; } case DISKMENU_BUTTON_EXIT: show(false); break; } } else if (reinterpret_cast(sender) == listBoxFiles && event->getID() == eConfirmed) { handleLoadOrStep(); } else if (event->getID() == eSelection) { switch (reinterpret_cast(sender)->getID()) { case DISKMENU_CLASSIC_LISTBOX_BROWSER: { updateFilenameEditFieldFromBrowser(); break; } case DISKMENU_NORMAL_RADIOGROUP_SONGTYPE: case DISKMENU_NORMAL_RADIOGROUP_PATTERNTYPE: case DISKMENU_NORMAL_RADIOGROUP_TRACKTYPE: case DISKMENU_NORMAL_RADIOGROUP_INSTRUMENTTYPE: case DISKMENU_NORMAL_RADIOGROUP_SAMPLETYPE: currentActiveRadioGroup = reinterpret_cast(sender); updateFilenameEditFieldExtension(classicViewState); break; } } else if (event->getID() == eFileSystemChanged) { reload(); } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { case DISKMENU_CLASSIC_LISTBOX_NAME: { const PPString* str = *(reinterpret_cast(event->getDataPtr())); *fileFullPath = listBoxFiles->getCurrentPathAsString(); PPSystemString temp(*str); *file = temp; fileFullPath->append(*file); assureExtension(); break; } } } return 0; } void SectionDiskMenu::init(pp_int32 px, pp_int32 py) { pp_int32 i; PPScreen* screen = tracker.screen; PPContainer* container = new PPContainer(CONTAINER_ADVEDIT, tracker.screen, this, PPPoint(px, py), PPSize(320,UPPERLEFTSECTIONHEIGHT), false); container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(DISKMENU_NORMAL_STATICTEXT_HEADING, NULL, NULL, PPPoint(px + 2, py + 2), "Disk operations", true, true)); pp_int32 buttonWidth = 8*4+4; pp_int32 buttonHeight = 11; pp_int32 x = px+container->getSize().width-(buttonWidth+4); pp_int32 y = py+container->getSize().height-(buttonHeight+4); container->addControl(new PPSeperator(0, screen, PPPoint(px + 2, y - 4), container->getSize().width - 4, TrackerConfig::colorThemeMain, true)); PPButton* button = new PPButton(DISKMENU_BUTTON_EXIT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight+1)); button->setText("Exit"); container->addControl(button); pp_int32 dx = 6; pp_int32 dy = 16; // ---- Song ---------- x = px + 2; y = py + dy; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x,y), "Song:", true)); y+=12; buttonWidth = 8*7+2; button = new PPButton(DISKMENU_NORMAL_BUTTON_LOAD_SONG, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Load"); container->addControl(button); y+=buttonHeight+1; button = new PPButton(DISKMENU_NORMAL_BUTTON_SAVE_SONG, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Save As"); container->addControl(button); y+=buttonHeight; PPRadioGroup* radioGroup = new PPRadioGroup(DISKMENU_NORMAL_RADIOGROUP_SONGTYPE, screen, this, PPPoint(x, y), PPSize(buttonWidth, 3*14)); radioGroupLocations[RADIOGROUPTOINDEX(DISKMENU_NORMAL_RADIOGROUP_SONGTYPE)] = radioGroup->getLocation(); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem(".xm"); radioGroup->addItem(".mod"); radioGroup->addItem(".wav"); container->addControl(radioGroup); // ---- Pattern ---------- x += buttonWidth+dx; y = py + dy; container->addControl(new PPSeperator(0, screen, PPPoint(x - 4, y - 2), container->getLocation().y + container->getSize().height - y - 17, TrackerConfig::colorThemeMain, false)); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x,y), "Patt:", true)); y+=12; button = new PPButton(DISKMENU_NORMAL_BUTTON_LOAD_PATTERN, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Load"); container->addControl(button); y+=buttonHeight+1; button = new PPButton(DISKMENU_NORMAL_BUTTON_SAVE_PATTERN, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Save As"); container->addControl(button); y+=buttonHeight; radioGroup = new PPRadioGroup(DISKMENU_NORMAL_RADIOGROUP_PATTERNTYPE, screen, this, PPPoint(x, y), PPSize(buttonWidth, 30)); radioGroupLocations[RADIOGROUPTOINDEX(DISKMENU_NORMAL_RADIOGROUP_PATTERNTYPE)] = radioGroup->getLocation(); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem(".xp"); container->addControl(radioGroup); // ---- Track ---------- x += buttonWidth+dx; y = py + dy; container->addControl(new PPSeperator(0, screen, PPPoint(x - 4, y - 2), container->getLocation().y + container->getSize().height - y - 17, TrackerConfig::colorThemeMain, false)); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x,y), "Track:", true)); y+=12; button = new PPButton(DISKMENU_NORMAL_BUTTON_LOAD_TRACK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Load"); container->addControl(button); y+=buttonHeight+1; button = new PPButton(DISKMENU_NORMAL_BUTTON_SAVE_TRACK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Save As"); container->addControl(button); y+=buttonHeight; radioGroup = new PPRadioGroup(DISKMENU_NORMAL_RADIOGROUP_TRACKTYPE, screen, this, PPPoint(x, y), PPSize(buttonWidth, 30)); radioGroupLocations[RADIOGROUPTOINDEX(DISKMENU_NORMAL_RADIOGROUP_TRACKTYPE)] = radioGroup->getLocation(); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem(".xt"); container->addControl(radioGroup); // ---- Instrument ---------- x += buttonWidth+dx; y = py + dy; container->addControl(new PPSeperator(0, screen, PPPoint(x - 4, y - 2), container->getLocation().y + container->getSize().height - y - 17, TrackerConfig::colorThemeMain, false)); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x,y), "Instr:", true)); y+=12; button = new PPButton(DISKMENU_NORMAL_BUTTON_LOAD_INSTRUMENT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Load"); container->addControl(button); y+=buttonHeight+1; button = new PPButton(DISKMENU_NORMAL_BUTTON_SAVE_INSTRUMENT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Save As"); container->addControl(button); y+=buttonHeight; radioGroup = new PPRadioGroup(DISKMENU_NORMAL_RADIOGROUP_INSTRUMENTTYPE, screen, this, PPPoint(x, y), PPSize(buttonWidth, 30)); radioGroupLocations[RADIOGROUPTOINDEX(DISKMENU_NORMAL_RADIOGROUP_INSTRUMENTTYPE)] = radioGroup->getLocation(); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem(".xi"); container->addControl(radioGroup); // ---- Sample ---------- x += buttonWidth+dx; y = py + dy; container->addControl(new PPSeperator(0, screen, PPPoint(x - 4, y - 2), container->getLocation().y + container->getSize().height - y - 17, TrackerConfig::colorThemeMain, false)); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x,y), "Sample:", true)); y+=12; button = new PPButton(DISKMENU_NORMAL_BUTTON_LOAD_SAMPLE, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Load"); container->addControl(button); y+=buttonHeight+1; button = new PPButton(DISKMENU_NORMAL_BUTTON_SAVE_SAMPLE, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Save As"); container->addControl(button); y+=buttonHeight; radioGroup = new PPRadioGroup(DISKMENU_NORMAL_RADIOGROUP_SAMPLETYPE, screen, this, PPPoint(x, y), PPSize(buttonWidth, 2*14)); radioGroupLocations[RADIOGROUPTOINDEX(DISKMENU_NORMAL_RADIOGROUP_SAMPLETYPE)] = radioGroup->getLocation(); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem(".wav"); radioGroup->addItem(".iff"); container->addControl(radioGroup); // Now get all controls built for the "normal" view (not the FT2 retro view) and save them, // so we can hide them later easily, without referring to the IDs or whatever // (except for the section heading and the exit button) PPSimpleVector& controls = container->getControls(); for (i = 0; i < controls.size(); i++) { if (controls.get(i)->getID() != DISKMENU_BUTTON_EXIT) { normalViewControls->add(controls.get(i)); } } // remember that, this is where we start gathering the controls for the "classic" view pp_int32 firstClassicControlIndex = i + 1; // go on with some more stuff x = container->getLocation().x + container->getSize().width - 28; pp_int32 x4 = x; y = py + 2; button = new PPButton(DISKMENU_BUTTON_FLIP, screen, this, PPPoint(x, y), PPSize(24, 11), false); button->setText("Flip"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); x = px + 2; y = py + 2; container->addControl(new PPStaticText(DISKMENU_CLASSIC_STATICTEXT_HEADING, NULL, NULL, PPPoint(x, y), "Disk op", true, true)); y+=13; // add type buttons static const char* buttonTexts[6] = {"Type", "Module", "Instr.", "Sample", "Patt.", "Track"}; pp_int32 numButtons = (DISKMENU_CLASSIC_BUTTON_TYPE_TRACK-DISKMENU_CLASSIC_BUTTON_TYPE_TYPE+1); ASSERT((sizeof(buttonTexts)/sizeof(const char*)) == numButtons); pp_int32 bWidth = 7*8; pp_int32 bHeight = 14; y--; pp_int32 y3 = y; for (i = 0; i < numButtons; i++) { /*if (i == 0) button = new PPButton(i + DISKMENU_CLASSIC_BUTTON_TYPE_TYPE, screen, this, PPPoint(x, y), PPSize(bWidth, bHeight), false, true, false); else*/ button = new PPButton(i + DISKMENU_CLASSIC_BUTTON_TYPE_TYPE, screen, this, PPPoint(x, y), PPSize(bWidth, bHeight), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText(buttonTexts[i]); container->addControl(button); y+=bHeight; } pp_int32 x3 = x + bWidth + 3; y+=5; // add save button button = new PPButton(DISKMENU_CLASSIC_BUTTON_SAVE, screen, this, PPPoint(x, y), PPSize(bWidth, buttonHeight+1)); button->setText("Save"); container->addControl(button); // file browser pp_int32 lbWidth = (px + container->getSize().width) - x3 - 4; pp_int32 lbHeight = (py+container->getSize().height-(buttonHeight+4)) - y3 - 5; listBoxFiles = new PPListBoxFileBrowser(DISKMENU_CLASSIC_LISTBOX_BROWSER, screen, this, PPPoint(x3, y3), PPSize(lbWidth, lbHeight)); listBoxFiles->setBorderColor(TrackerConfig::colorThemeMain); listBoxFiles->setFilePrefix(""); listBoxFiles->setDirectoryPrefix(""); listBoxFiles->setDirectorySuffixPathSeperator(); listBoxFiles->setSortAscending(sortAscending); listBoxFiles->setColorQueryListener(colorQueryListener); container->addControl(listBoxFiles); fileBrowserExtent = listBoxFiles->getSize(); y3+=2; x3+=2; PPControl* ctrl; ctrl = new PPStaticText(DISKMENU_CLASSIC_STATICTEXT_SORTBY, NULL, NULL, PPPoint(x3, y3), "Sort by:", true); container->addControl(ctrl); x3+=8*8; button = new PPButton(DISKMENU_CLASSIC_BUTTON_SORTBY, screen, this, PPPoint(x3, y3-1), PPSize(51, 11), false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Extension"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); button = new PPButton(DISKMENU_CLASSIC_BUTTON_SORTORDER, screen, this, PPPoint(x3+button->getSize().width, y3-1), PPSize(13, 11), false); button->setText(sortAscending ? "\xfd" : "\xfe"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); x3+=80; ctrl = new PPStaticText(DISKMENU_CLASSIC_STATICTEXT_FILTEREXTENSIONS, NULL, NULL, PPPoint(x3, y3), "Type filter:", true); container->addControl(ctrl); ctrl = new PPCheckBox(DISKMENU_CLASSIC_CHECKBOX_FILTEREXTENSIONS, screen, this, PPPoint(x3 + 12*8+2, y3-1)); container->addControl(ctrl); buttonWidth = 27; pp_int32 y5 = y3 + 12; pp_int32 x5 = container->getLocation().x + container->getSize().width - buttonWidth - 5; numButtons = 5; for (i = 0; i < numButtons; i++) { pp_int32 buttonHeight = 11; char temp[80]; sprintf(temp, "DIR%d", i+1); PPFont* font = PPFont::getFont(PPFont::FONT_TINY); button = new PPButton(DISKMENU_CLASSIC_BUTTON_DIR0+i, screen, this, PPPoint(x5, y5), PPSize(buttonWidth, buttonHeight)); button->setFont(font); button->setText(temp); container->addControl(button); y5+=buttonHeight+1; } button = new PPButton(DISKMENU_CLASSIC_BUTTON_STOREDIR, screen, this, PPPoint(x5, y5), PPSize(buttonWidth, 9), true, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Store"); container->addControl(button); // save edit list box buttonWidth = container->getControlByID(DISKMENU_BUTTON_EXIT)->getLocation().x - (x + bWidth + 4) - 4; editFieldCurrentFile = new PPListBox(DISKMENU_CLASSIC_LISTBOX_NAME, screen, this, PPPoint(x + bWidth + 4, y), PPSize(buttonWidth, buttonHeight+1), true, true, false); editFieldCurrentFile->showSelection(false); editFieldCurrentFile->setSingleButtonClickEdit(true); editFieldCurrentFile->setBorderColor(TrackerConfig::colorThemeMain); char str[MP_MAXTEXT+1]; memset(str, 0, sizeof(str)); editFieldCurrentFile->addItem(str); editFieldCurrentFile->setMaxEditSize(255); container->addControl(editFieldCurrentFile); y = py + 2; x = px + 2 + 8*7 + 5; static const char* buttonTexts2[] = {"<-", "->", "Up", "Root", "Home", "Reload", "Load", "Del", "MkDir"}; static const pp_int32 buttonSpacing[] = {0,0,0,0,0,3,0,0,0}; numButtons = sizeof(buttonTexts2)/sizeof(const char*); bHeight = 10; for (i = 0; i < numButtons; i++) { PPFont* font = PPFont::getFont(PPFont::FONT_TINY); bWidth = font->getStrWidth(buttonTexts2[i]) + 3; button = new PPButton(DISKMENU_CLASSIC_BUTTON_PREV+i, screen, this, PPPoint(x, y), PPSize(bWidth, bHeight)); button->setFont(font); button->setText(buttonTexts2[i]); container->addControl(button); x+=bWidth+1+buttonSpacing[i]; } x=x4-13*2; button = new PPButton(DISKMENU_CLASSIC_BUTTON_VEXTEND, screen, this, PPPoint(x, y), PPSize(13, bHeight+1), false); button->setText(TrackerConfig::stringButtonCollapsed); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); x+=13; button = new PPButton(DISKMENU_CLASSIC_BUTTON_HEXTEND, screen, this, PPPoint(x, y), PPSize(13, bHeight+1), false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText(">"); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); container->addControl(button); y = py+container->getSize().height-(buttonHeight+4); container->addControl(new PPSeperator(0, screen, PPPoint(px + 2, y - 4), container->getSize().width - 4, TrackerConfig::colorThemeMain, true)); // gather controls for the classic view, we simply start counting from the last control we found // the last time for (i = firstClassicControlIndex; i < controls.size(); i++) { classicViewControls->add(controls.get(i)); controls.get(i)->hide(true); } tracker.screen->addControl(container); sectionContainer = container; // fit dir buttons to browser listbox size fitDirButtons(); initialised = true; showSection(false); } void SectionDiskMenu::show(bool bShow) { // sanity check if (bShow == diskMenuVisible) return; #ifdef __LOWRES__ tracker.screen->pauseUpdate(true); #endif PPRadioGroup* radioGroup = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SONGTYPE)); if (bShow) { if (moduleTypeAdjust) { switch (tracker.moduleEditor->getSaveType()) { case ModuleEditor::ModSaveTypeXM: radioGroup->setChoice(0); break; case ModuleEditor::ModSaveTypeMOD: radioGroup->setChoice(1); break; default: ASSERT(false); } } // restore CWD in case it has been changed // through the native file requester (e.g. on Windows) if (currentPath.length() != 0) { setCurrentPath(currentPath, false); } } else { // store CWD currentPath = getCurrentPath(); } diskMenuVisible = bShow; SectionUpperLeft::show(bShow); if (bShow) { #ifdef __LOWRES__ pp_int32 y = tracker.screen->getControlByID(CONTAINER_INPUTDEFAULT)->getLocation().y; replaceInstrumentListBoxes(true, y); tracker.getPatternEditorControl()->show(false); #endif prepareSection(); lastFocusedControl = tracker.screen->getFocusedControl(); tracker.screen->setFocus(listBoxFiles); if (forceClassicBrowser) { showNormalView(false); showClassicView(true); updateClassicView(); updateFilenameEditField(classicViewState); forceClassicBrowser = false; } } else { #ifdef __LOWRES__ replaceInstrumentListBoxes(false); tracker.getPatternEditorControl()->show(true); #endif tracker.screen->setFocus(lastFocusedControl); } #ifdef __LOWRES__ pp_int32 deltay = sectionContainer->getSize().height - tracker.UPPERSECTIONDEFAULTHEIGHT(); pp_int32 newSIPOffsetMove = bShow ? -deltay : deltay; // Only move SIP panel up/down on show/hide when it's exactly the complementary // to the previous move, otherwise we'll be moving it out of range if ((lastSIPOffsetMove != 0 && lastSIPOffsetMove == -newSIPOffsetMove) || lastSIPOffsetMove == 0) { tracker.moveInputControls(newSIPOffsetMove); lastSIPOffsetMove = newSIPOffsetMove; } tracker.screen->paint(); tracker.screen->pauseUpdate(false); if (!bShow) { tracker.screen->update(); } #endif } void SectionDiskMenu::update(bool repaint/* = true*/) { } bool SectionDiskMenu::isActiveEditing() { PPListBox* listBox = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_LISTBOX_NAME)); ASSERT(listBox); if (tracker.screen->hasFocus(sectionContainer) && listBox->isEditing()) return true; return false; } bool SectionDiskMenu::isFileBrowserVisible() { return listBoxFiles->isVisible(); } bool SectionDiskMenu::fileBrowserHasFocus() { return tracker.screen->hasFocus(sectionContainer) && listBoxFiles->gotFocus(); } void SectionDiskMenu::setFileBrowserShowFocus(bool showFocus) { listBoxFiles->setShowFocus(showFocus); } void SectionDiskMenu::selectSaveType(pp_uint32 type) { switch (type) { case FileTypes::FileTypeSongMOD: static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SONGTYPE))->setChoice(1); classicViewState = BrowseModules; break; case FileTypes::FileTypeSongAllModules: case FileTypes::FileTypeSongXM: static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SONGTYPE))->setChoice(0); classicViewState = BrowseModules; break; case FileTypes::FileTypeSongWAV: static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SONGTYPE))->setChoice(2); classicViewState = BrowseModules; break; case FileTypes::FileTypePatternXP: static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_PATTERNTYPE))->setChoice(0); classicViewState = BrowsePatterns; break; case FileTypes::FileTypeTrackXT: static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_TRACKTYPE))->setChoice(0); classicViewState = BrowseTracks; break; case FileTypes::FileTypeInstrumentXI: case FileTypes::FileTypeSongAllInstruments: static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_INSTRUMENTTYPE))->setChoice(0); classicViewState = BrowseInstruments; break; case FileTypes::FileTypeSampleWAV: case FileTypes::FileTypeSongAllSamples: static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SAMPLETYPE))->setChoice(0); classicViewState = BrowseSamples; break; case FileTypes::FileTypeSampleIFF: static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SAMPLETYPE))->setChoice(1); classicViewState = BrowseSamples; break; default: ASSERT(false); } forceClassicBrowser = true; } pp_uint32 SectionDiskMenu::getDefaultConfigUInt32() { // default is: // classic view is NOT visible = 0 // list box is v-extended = 2 // list box is h-extended = 4 // sort order is ascending = 8 // filtering by file extension is ON = 16 return 0 + 2 + 4 + 8 + 16; } pp_uint32 SectionDiskMenu::getConfigUInt32() { pp_uint32 result = 0; // Classic view visible result |= classicViewVisible ? 1 : 0; // Extended list box = Bit 1 result |= (listBoxFiles->getSize().height == fileBrowserExtent.height) ? 2 : 0; // Extended list box = Bit 2 result |= (listBoxFiles->getSize().width == fileBrowserExtent.width) ? 4 : 0; // Sort order = Bit 3 result |= sortAscending ? 8 : 0; // filter types = Bit 4 result |= static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_CHECKBOX_FILTEREXTENSIONS))->isChecked() ? 16 : 0; // filter types = Bit 24 and above result |= (pp_uint32)listBoxFiles->getSortType() << 24; return result; } void SectionDiskMenu::setConfigUInt32(pp_uint32 config) { if (config & 1) { showNormalView(false); showClassicView(true); } else if (!(config & 1)) { showNormalView(true); showClassicView(false); } if ((config & 2) && listBoxFiles->getSize().height != fileBrowserExtent.height) { resizeBrowserVertically(); } else if (!(config & 2) && listBoxFiles->getSize().height == fileBrowserExtent.height) { resizeBrowserVertically(); } if ((config & 4) && listBoxFiles->getSize().width != fileBrowserExtent.width) { resizeBrowserHorizontally(); } else if (!(config & 4) && listBoxFiles->getSize().width == fileBrowserExtent.width) { resizeBrowserHorizontally(); } sortAscending = (config & 8) != 0; listBoxFiles->setSortAscending(sortAscending); PPCheckBox* checkBox = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_CHECKBOX_FILTEREXTENSIONS)); ASSERT(checkBox); checkBox->checkIt((config & 16) != 0); listBoxFiles->setSortType((PPListBoxFileBrowser::SortTypes)(config >> 24)); updateButtonStates(false); } PPSystemString SectionDiskMenu::getCurrentPath() { return listBoxFiles->getCurrentPathAsString(); } void SectionDiskMenu::setCurrentPath(const PPSystemString& path, bool reload/* = true*/) { listBoxFiles->gotoPath(path, reload); } PPString SectionDiskMenu::getCurrentPathASCII() { char* nameASCIIZ = listBoxFiles->getCurrentPathAsString().toASCIIZ(); PPString result(nameASCIIZ); delete[] nameASCIIZ; return result; } void SectionDiskMenu::resizeInstrumentContainer() { #ifdef __LOWRES__ PPControl* ctrl1 = tracker.screen->getControlByID(CONTAINER_INPUTDEFAULT); PPControl* ctrl2 = tracker.screen->getControlByID(CONTAINER_INPUTEXTENDED); pp_int32 y = ctrl1->isVisible() ? ctrl1->getLocation().y : ctrl2->getLocation().y; replaceAndResizeInstrumentListContainer(y); tracker.screen->paint(false); #endif } void SectionDiskMenu::setCycleFilenames(bool cycleFilenames) { listBoxFiles->setCycleFilenames(cycleFilenames); } void SectionDiskMenu::prepareSection() { updateFilter(); updateFilenameEditField(classicViewState); } void SectionDiskMenu::showNormalView(bool bShow) { pp_uint32 i; for (i = 0; i < (unsigned)normalViewControls->size(); i++) normalViewControls->get(i)->hide(!bShow); for (i = 0; i < sizeof(radioGroupLocations) / sizeof(PPPoint); i++) static_cast(sectionContainer)->getControlByID(INDEXTORADIOGROUP(i))->setLocation(radioGroupLocations[i]); if (bShow && isActiveEditing()) tracker.screen->setFocus(lastFocusedControl); } void SectionDiskMenu::updateClassicView(bool repaint/* = true*/) { pp_uint32 i; if (!classicViewVisible) return; updateButtonStates(false); bool cond = classicViewState != BrowseAll; static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_TYPE_TYPE))->setClickable(cond); static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_SAVE))->setClickable(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_TYPE_MODULE)->hide(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_TYPE_INSTRUMENT)->hide(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_TYPE_SAMPLE)->hide(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_TYPE_PATTERN)->hide(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_TYPE_TRACK)->hide(cond); if (classicViewState == BrowseAll) { currentActiveRadioGroup = NULL; } PPPoint pos = static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_TYPE_MODULE)->getLocation(); for (i = 0; i < sizeof(radioGroupLocations) / sizeof(PPPoint); i++) { static_cast(sectionContainer)->getControlByID(INDEXTORADIOGROUP(i))->setLocation(pos); static_cast(sectionContainer)->getControlByID(INDEXTORADIOGROUP(i))->hide(true); } switch (classicViewState) { case BrowseModules: currentActiveRadioGroup = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SONGTYPE)); break; case BrowseInstruments: currentActiveRadioGroup = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_INSTRUMENTTYPE)); break; case BrowseSamples: currentActiveRadioGroup = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_SAMPLETYPE)); break; case BrowsePatterns: currentActiveRadioGroup = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_PATTERNTYPE)); break; case BrowseTracks: currentActiveRadioGroup = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_NORMAL_RADIOGROUP_TRACKTYPE)); break; } cond = listBoxFiles->getSize().height == fileBrowserExtent.height; static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_STATICTEXT_FILTEREXTENSIONS)->hide(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_CHECKBOX_FILTEREXTENSIONS)->hide(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_STATICTEXT_SORTBY)->hide(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_SORTBY)->hide(cond); static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_SORTORDER)->hide(cond); for (i = DISKMENU_CLASSIC_BUTTON_DIR0; i <= DISKMENU_CLASSIC_BUTTON_STOREDIR; i++) static_cast(sectionContainer)->getControlByID(i)->hide(listBoxFiles->getSize().width == fileBrowserExtent.width); if (currentActiveRadioGroup) currentActiveRadioGroup->hide(false); if (repaint) tracker.screen->paintControl(sectionContainer); } void SectionDiskMenu::showClassicView(bool bShow) { for (pp_int32 i = 0; i < classicViewControls->size(); i++) classicViewControls->get(i)->hide(!bShow); classicViewVisible = bShow; if (bShow) { updateClassicView(); } } bool SectionDiskMenu::isNormalViewVisible() { bool res = true; for (pp_int32 i = 0; i < normalViewControls->size(); i++) if (!normalViewControls->get(i)->isVisible()) res = false; return res; } bool SectionDiskMenu::isClassicViewVisible() { bool res = true; for (pp_int32 i = 0; i < classicViewControls->size(); i++) if (!classicViewControls->get(i)->isVisible()) res = false; return res; } void SectionDiskMenu::flip() { if (isNormalViewVisible()) { showNormalView(false); showClassicView(true); updateFilenameEditField(classicViewState); } else { showNormalView(true); showClassicView(false); } PPScreen* screen = tracker.screen; screen->paintControl(sectionContainer); } void SectionDiskMenu::updateFilenameEditFieldExtension(ClassicViewStates viewState) { if (currentActiveRadioGroup) { PPSystemString file = this->file->stripExtension(); if (file.length()) { PPSystemString ext(currentActiveRadioGroup->getItem(currentActiveRadioGroup->getChoice())); file.append(ext); updateFilenameEditField(file); } } } void SectionDiskMenu::updateFilenameEditField(ClassicViewStates viewState) { PPSystemString ext; if (currentActiveRadioGroup) ext = PPSystemString(currentActiveRadioGroup->getItem(currentActiveRadioGroup->getChoice())); switch (viewState) { case BrowseAll: *file = tracker.moduleEditor->getModuleFileName(); break; case BrowseModules: if (moduleTypeAdjust) *file = tracker.moduleEditor->getModuleFileName(); else { *file = tracker.moduleEditor->getModuleFileName().stripExtension(); file->append(ext); } break; case BrowseInstruments: { *file = tracker.moduleEditor->getInstrumentFileName(tracker.listBoxInstruments->getSelectedIndex()); file->append(ext); break; } case BrowseSamples: { *file = tracker.moduleEditor->getSampleFileName(tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex()); file->append(ext); break; } case BrowsePatterns: { *file = tracker.moduleEditor->getModuleFileName().stripExtension(); file->append(ext); break; } case BrowseTracks: { *file = tracker.moduleEditor->getModuleFileName().stripExtension(); file->append(ext); break; } } updateFilenameEditField(*file); } void SectionDiskMenu::updateFilenameEditField(const PPSystemString& fileName) { editFieldCurrentFile->clear(); char* nameASCIIZ = fileName.toASCIIZ(); PPString str(nameASCIIZ); editFieldCurrentFile->addItem(str); delete[] nameASCIIZ; *file = fileName; tracker.screen->paintControl(editFieldCurrentFile); } void SectionDiskMenu::updateFilenameEditFieldFromBrowser() { updateButtonStates(); if (listBoxFiles->currentSelectionIsFile()) { updateFilenameEditField(listBoxFiles->getCurrentSelectedPathEntry()->getName()); } } void SectionDiskMenu::handleLoadOrStep() { if (listBoxFiles->stepIntoCurrentSelection()) { listBoxFiles->refreshFiles(); updateButtonStates(); tracker.screen->paintControl(listBoxFiles); } else { loadCurrentSelectedFile(); } } void SectionDiskMenu::loadCurrentSelectedFile() { PPSystemString fileFullPath = listBoxFiles->getCurrentPathAsString(); fileFullPath.append(listBoxFiles->getCurrentSelectedPathEntry()->getName()); switch (classicViewState) { case BrowseAll: tracker.loadGenericFileType(fileFullPath); break; case BrowseModules: tracker.loadTypeFromFile(FileTypes::FileTypeSongAllModules, fileFullPath); break; case BrowseInstruments: tracker.loadTypeFromFile(FileTypes::FileTypeSongAllInstruments, fileFullPath); break; case BrowseSamples: tracker.loadTypeFromFile(FileTypes::FileTypeSongAllSamples, fileFullPath); break; case BrowsePatterns: tracker.loadTypeFromFile(FileTypes::FileTypePatternXP, fileFullPath); break; case BrowseTracks: tracker.loadTypeFromFile(FileTypes::FileTypeTrackXT, fileFullPath); break; } updateFilenameEditFieldExtension(classicViewState); } void SectionDiskMenu::showOverwriteMessageBox() { if (dialog) { delete dialog; dialog = NULL; } dialog = new PPDialogBase(tracker.screen, responder, RESPONDMESSAGEBOX_OVERWRITE, "Overwrite existing file?"); dialog->show(); } void SectionDiskMenu::prepareSave() { if (editFieldCurrentFile->isEditing()) editFieldCurrentFile->commitChanges(); assureExtension(); PPSystemString fileFullPath = listBoxFiles->getCurrentPathAsString(); PPSystemString file = this->file->stripExtension(); if (file.length()) { fileFullPath.append(*this->file); if (XMFile::exists(fileFullPath)) { showOverwriteMessageBox(); } else { saveCurrent(); } } } void SectionDiskMenu::saveCurrent() { PPSystemString fileFullPath = listBoxFiles->getCurrentPathAsString(); fileFullPath.append(*this->file); bool res = true; FileTypes saveType; switch (classicViewState) { case BrowseAll: ASSERT(false); break; case BrowseModules: { switch (currentActiveRadioGroup->getChoice()) { case 0: saveType = FileTypes::FileTypeSongXM; break; case 1: saveType = FileTypes::FileTypeSongMOD; break; case 2: { tracker.sectionHDRecorder->setCurrentFileName(fileFullPath); tracker.sectionSwitcher->showUpperSection(tracker.sectionHDRecorder); if (dialog && tracker.screen->getModalControl() == dialog->getMessageBoxContainer()) { tracker.screen->setModalControl(NULL); } return; } } break; } case BrowseInstruments: saveType = FileTypes::FileTypeInstrumentXI; break; case BrowseSamples: { switch (currentActiveRadioGroup->getChoice()) { case 0: saveType = FileTypes::FileTypeSampleWAV; break; case 1: saveType = FileTypes::FileTypeSampleIFF; break; } break; } case BrowsePatterns: saveType = FileTypes::FileTypePatternXP; break; case BrowseTracks: saveType = FileTypes::FileTypeTrackXT; break; } res = tracker.prepareSavingWithDialog(saveType); if (tracker.savePanel) { delete tracker.savePanel; tracker.savePanel = new PPDummySavePanel(fileFullPath); } if (res) { tracker.saveTypeWithDialog(saveType, this); } else { tracker.fileSystemChangedListener = this; } if (dialog && tracker.screen->getModalControl() == dialog->getMessageBoxContainer()) { tracker.screen->setModalControl(NULL); } } void SectionDiskMenu::showDeleteMessageBox() { if (!listBoxFiles->currentSelectionIsFile()) return; showMessageBox(RESPONDMESSAGEBOX_DELETE, "Delete selected file?"); } void SectionDiskMenu::deleteCurrent() { PPSystemString fileFullPath = listBoxFiles->getCurrentPathAsString(); fileFullPath.append(listBoxFiles->getCurrentSelectedPathEntry()->getName()); XMFile::remove(fileFullPath); reload(); } void SectionDiskMenu::updateButtonStates(bool repaint/* = true*/) { static const pp_uint32 IDs[] = { DISKMENU_CLASSIC_BUTTON_PREV, DISKMENU_CLASSIC_BUTTON_NEXT, DISKMENU_CLASSIC_BUTTON_PARENT, DISKMENU_CLASSIC_BUTTON_ROOT, DISKMENU_CLASSIC_BUTTON_HOME, DISKMENU_CLASSIC_BUTTON_LOAD, DISKMENU_CLASSIC_BUTTON_DELETE, DISKMENU_CLASSIC_BUTTON_MAKEDIR }; const bool states[] = { listBoxFiles->canPrev(), listBoxFiles->canNext(), listBoxFiles->canGotoParent(), listBoxFiles->canGotoRoot(), listBoxFiles->canGotoHome(), true, listBoxFiles->currentSelectionIsFile(), false }; ASSERT(sizeof(states)/sizeof(bool) == sizeof(IDs)/sizeof(pp_uint32)); pp_uint32 i; for (i = 0; i < sizeof(IDs)/sizeof(pp_uint32); i++) { bool b = states[i]; PPButton* button = static_cast(static_cast(sectionContainer)->getControlByID(IDs[i])); if (button->isClickable() != b) { button->setClickable(b); if (repaint) tracker.screen->paintControl(button); } } const char* stateText = listBoxFiles->currentSelectionIsFile() ? "Load" : "Step"; PPButton* button = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_LOAD)); if (button->getText().compareTo(stateText) != 0) { button->setText(stateText); if (repaint) tracker.screen->paintControl(button); } stateText = sortAscending ? "\xfd" : "\xfe"; button = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_SORTORDER)); if (button->getText().compareTo(stateText) != 0) { button->setText(stateText); if (repaint) tracker.screen->paintControl(button); } static const char* sortTypes[PPListBoxFileBrowser::NumSortRules] = {"Name", "Size", "Extension"}; stateText = sortTypes[listBoxFiles->getSortType()]; button = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_SORTBY)); if (button->getText().compareTo(stateText) != 0) { button->setText(stateText); if (repaint) tracker.screen->paintControl(button); } PPString stateText2 = (listBoxFiles->getSize().height == fileBrowserExtent.height) ? TrackerConfig::stringButtonExtended : TrackerConfig::stringButtonCollapsed; button = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_VEXTEND)); if (button->getText().compareTo(stateText2) != 0) { button->setText(stateText2); if (repaint) tracker.screen->paintControl(button); } stateText2 = (listBoxFiles->getSize().width == fileBrowserExtent.width) ? ">" : "<"; button = static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_BUTTON_HEXTEND)); if (button->getText().compareTo(stateText2) != 0) { button->setText(stateText2); if (repaint) tracker.screen->paintControl(button); } // update directory buttons #if 0 for (i = DISKMENU_CLASSIC_BUTTON_DIR0; i <= DISKMENU_CLASSIC_BUTTON_DIR4; i++) { PPButton* button = static_cast(static_cast(sectionContainer)->getControlByID(i)); PPString strKey = getKeyFromPredefPathButton(button); PPDictionaryKey* key = tracker.settingsDatabase->restore(strKey); button->enable(key != NULL); } #endif } void SectionDiskMenu::next(bool repaint/* = true*/) { listBoxFiles->next(); tracker.screen->paintControl(listBoxFiles); updateButtonStates(); } void SectionDiskMenu::prev(bool repaint/* = true*/) { listBoxFiles->prev(); tracker.screen->paintControl(listBoxFiles); updateButtonStates(); } void SectionDiskMenu::parent(bool repaint/* = true*/) { listBoxFiles->gotoParent(); tracker.screen->paintControl(listBoxFiles); updateButtonStates(); } void SectionDiskMenu::root(bool repaint/* = true*/) { listBoxFiles->gotoRoot(); tracker.screen->paintControl(listBoxFiles); updateButtonStates(); } void SectionDiskMenu::home(bool repaint/* = true*/) { listBoxFiles->gotoHome(); tracker.screen->paintControl(listBoxFiles); updateButtonStates(); } void SectionDiskMenu::reload(bool repaint/* = true*/) { PPPathEntry* pathEntry = NULL; const PPPathEntry* src = listBoxFiles->getCurrentSelectedPathEntry(); if (src) pathEntry = src->clone(); listBoxFiles->saveState(); listBoxFiles->refreshFiles(); listBoxFiles->restoreState(false); if (pathEntry) { for (pp_int32 i = 0; i < listBoxFiles->getNumItems(); i++) { if (pathEntry->compareTo(*listBoxFiles->getPathEntry(i))) { listBoxFiles->setSelectedIndex(i, false); break; } } delete pathEntry; } if (repaint) tracker.screen->paintControl(listBoxFiles); } void SectionDiskMenu::updateFilter(bool repaint/* = true*/) { FileExtProvider fileExtProvider; listBoxFiles->clearExtensions(); const char* const* extensions = NULL; if (static_cast(static_cast(sectionContainer)->getControlByID(DISKMENU_CLASSIC_CHECKBOX_FILTEREXTENSIONS))->isChecked()) { switch (classicViewState) { case BrowseModules: extensions = fileExtProvider.getModuleExtensions(); break; case BrowseInstruments: extensions = fileExtProvider.getInstrumentExtensions(); break; case BrowseSamples: extensions = fileExtProvider.getSampleExtensions(); break; case BrowsePatterns: extensions = fileExtProvider.getPatternExtensions(); break; case BrowseTracks: extensions = fileExtProvider.getTrackExtensions(); break; } } if (extensions) listBoxFiles->addExtensions(extensions); reload(repaint); } void SectionDiskMenu::switchState(ClassicViewStates viewState) { classicViewState = viewState; updateFilter(false); updateClassicView(); updateFilenameEditField(classicViewState); } void SectionDiskMenu::resizeBrowserVertically() { PPSize size = listBoxFiles->getSize(); PPPoint location = listBoxFiles->getLocation(); if (size.height == fileBrowserExtent.height) { size.height-=13; listBoxFiles->setSize(size); location.y+=13; listBoxFiles->setLocation(location); } else { size.height+=13; listBoxFiles->setSize(size); location.y-=13; listBoxFiles->setLocation(location); } fitDirButtons(); updateClassicView(); } void SectionDiskMenu::resizeBrowserHorizontally() { PPSize size = listBoxFiles->getSize(); if (size.width == fileBrowserExtent.width) { size.width-=32; listBoxFiles->setSize(size); } else { size.width+=32; listBoxFiles->setSize(size); } updateClassicView(); } void SectionDiskMenu::fitDirButtons() { pp_int32 height = (listBoxFiles->getSize().height-2) / 6; pp_int32 cy = ((listBoxFiles->getSize().height-2) - (height * 6)); pp_int32 y = listBoxFiles->getLocation().y + cy; for (pp_int32 i = DISKMENU_CLASSIC_BUTTON_DIR0; i <= DISKMENU_CLASSIC_BUTTON_STOREDIR; i++) { PPControl* ctrl = static_cast(sectionContainer)->getControlByID(i); PPPoint p = ctrl->getLocation(); p.y = y; ctrl->setLocation(p); PPSize s = ctrl->getSize(); s.height = height-1; ctrl->setSize(s); y+=height; } } PPString SectionDiskMenu::getKeyFromPredefPathButton(PPControl* button) { pp_int32 id = button->getID(); id -= DISKMENU_CLASSIC_BUTTON_DIR0; if (id >= 0 && id < 5) { static const char* keys[BrowseLAST] = { "PREDEF_PATH_ALL", "PREDEF_PATH_MODULES", "PREDEF_PATH_INSTRUMENTS", "PREDEF_PATH_SAMPLES", "PREDEF_PATH_PATTERNS", "PREDEF_PATH_TRACKS", }; char result[1024]; sprintf(result, "%s_%d", keys[classicViewState], id); return result; } else return ""; } void SectionDiskMenu::assureExtension() { updateFilenameEditFieldExtension(classicViewState); } milkytracker-0.90.85+dfsg/src/tracker/PatternEditorControlTransposeHandler.cpp0000644000175000017500000000701311150223367026674 0ustar admin2admin2/* * tracker/PatternEditorControlTransposeHandler.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PatternEditorControlTransposeHandler.cpp * MilkyTracker * * Created by Peter Barth on 06.10.05. * */ #include "PatternEditorControl.h" #include "DialogBase.h" void PatternEditorControl::showNoteTransposeWarningMessageBox(pp_int32 fuckups) { if (dialog) { delete dialog; dialog = NULL; } char buffer[100]; sprintf(buffer, "%i notes will be erased, continue?", fuckups); dialog = new PPDialogBase(parentScreen, transposeHandlerResponder, PP_DEFAULT_ID, buffer); dialog->show(); } pp_int32 PatternEditorControl::noteTransposeTrack(const PatternEditorTools::TransposeParameters& transposeParameters) { pp_int32 fuckups = patternEditor->noteTransposeTrackCore(transposeParameters, true); if (!fuckups) return patternEditor->noteTransposeTrackCore(transposeParameters, false); if (transposeHandlerResponder == NULL) return -1; transposeHandlerResponder->setTransposeParameters(transposeParameters); transposeHandlerResponder->setTransposeFunc(&PatternEditor::noteTransposeTrackCore); showNoteTransposeWarningMessageBox(fuckups); return 0; } pp_int32 PatternEditorControl::noteTransposePattern(const PatternEditorTools::TransposeParameters& transposeParameters) { pp_int32 fuckups = patternEditor->noteTransposePatternCore(transposeParameters, true); if (!fuckups) return patternEditor->noteTransposePatternCore(transposeParameters, false); if (transposeHandlerResponder == NULL) return -1; transposeHandlerResponder->setTransposeParameters(transposeParameters); transposeHandlerResponder->setTransposeFunc(&PatternEditor::noteTransposePatternCore); showNoteTransposeWarningMessageBox(fuckups); return 0; } pp_int32 PatternEditorControl::noteTransposeSelection(const PatternEditorTools::TransposeParameters& transposeParameters) { pp_int32 fuckups = patternEditor->noteTransposeSelectionCore(transposeParameters, true); if (!fuckups) return patternEditor->noteTransposeSelectionCore(transposeParameters, false); if (transposeHandlerResponder == NULL) return -1; transposeHandlerResponder->setTransposeParameters(transposeParameters); transposeHandlerResponder->setTransposeFunc(&PatternEditor::noteTransposeSelectionCore); showNoteTransposeWarningMessageBox(fuckups); return 0; } PatternEditorControl::TransposeHandlerResponder::TransposeHandlerResponder(PatternEditorControl& thePatternEditorControl) : patternEditorControl(thePatternEditorControl), transposeFunc(NULL) { } pp_int32 PatternEditorControl::TransposeHandlerResponder::ActionOkay(PPObject* sender) { if (transposeFunc == NULL) return -1; (patternEditorControl.patternEditor->*transposeFunc)(transposeParameters, false); return 0; } pp_int32 PatternEditorControl::TransposeHandlerResponder::ActionCancel(PPObject* sender) { return 0; } milkytracker-0.90.85+dfsg/src/tracker/PatternEditorControl.cpp0000644000175000017500000012204411316451770023506 0ustar admin2admin2/* * tracker/PatternEditorControl.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "PatternEditorControl.h" #include "GraphicsAbstract.h" #include "Screen.h" #include "Control.h" #include "Font.h" #include "XModule.h" #include "Menu.h" #include "Undo.h" #include "ContextMenu.h" #include "KeyBindings.h" #include "DialogBase.h" #include "PPUIConfig.h" #include "TrackerConfig.h" #define SCROLLBARWIDTH SCROLLBUTTONSIZE PatternEditorControl::PatternEditorControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border/*= true*/) : PPControl(id, parentScreen, eventListener, location, size), borderColor(&TrackerConfig::colorThemeMain), cursorColor(&TrackerConfig::colorPatternEditorCursorLine), selectionColor(&TrackerConfig::colorPatternEditorSelection), menuPosX(0), menuPosY(0), menuInvokeChannel(-1), lastMenuInvokeChannel(-1), eventKeyDownBindings(NULL), scanCodeBindings(NULL), eventKeyDownBindingsMilkyTracker(NULL), scanCodeBindingsMilkyTracker(NULL), eventKeyDownBindingsFastTracker(NULL), scanCodeBindingsFastTracker(NULL), patternEditor(NULL), module(NULL), pattern(NULL), ppreCursor(NULL), lastAction(RMouseDownActionInvalid), RMouseDownInChannelHeading(-1) { // default color bgColor.r = 0; bgColor.g = 0; bgColor.b = 0; vLeftScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y), size.height, false); vRightScrollbar = new PPScrollbar(1, parentScreen, this, PPPoint(location.x + size.width - SCROLLBARWIDTH, location.y), size.height, false); hTopScrollbar = new PPScrollbar(2, parentScreen, this, PPPoint(location.x + SCROLLBARWIDTH, location.y), size.width - SCROLLBARWIDTH*2, true); hBottomScrollbar = new PPScrollbar(3, parentScreen, this, PPPoint(location.x + SCROLLBARWIDTH, location.y + size.height - SCROLLBARWIDTH), size.width - SCROLLBARWIDTH*2, true); caughtControl = NULL; controlCaughtByLMouseButton = controlCaughtByRMouseButton = false; pattern = NULL; startIndex = 0; startPos = 0; songPos.orderListIndex = songPos.row = -1; startSelection = false; // assuming false is zero :) memset(muteChannels, 0, sizeof(muteChannels)); memset(recChannels, 0 ,sizeof(recChannels)); // context menu editMenuControl = new PPContextMenu(4, parentScreen, this, PPPoint(0,0), TrackerConfig::colorThemeMain, false, PPFont::getFont(PPFont::FONT_SYSTEM)); editMenuControl->addEntry("Mute channel", MenuCommandIDMuteChannel); editMenuControl->addEntry("Solo channel", MenuCommandIDSoloChannel); editMenuControl->addEntry("Unmute all", MenuCommandIDUnmuteAll); editMenuControl->addEntry("\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4", -1); editMenuControl->addEntry("Mark channel", MenuCommandIDSelectChannel); editMenuControl->addEntry("Mark all", MenuCommandIDSelectAll); editMenuControl->addEntry("\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4", -1); editMenuControl->addEntry("Undo", MenuCommandIDUndo); editMenuControl->addEntry("Redo", MenuCommandIDRedo); editMenuControl->addEntry("\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4", -1); editMenuControl->addEntry("Cut", MenuCommandIDCut); editMenuControl->addEntry("Copy", MenuCommandIDCopy); editMenuControl->addEntry("Paste", MenuCommandIDPaste); editMenuControl->addEntry("Porous Paste", MenuCommandIDPorousPaste); editMenuControl->addEntry("\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4", -1); editMenuControl->addEntry("Swap channels", MenuCommandIDSwapChannels); editMenuControl->setNotifyParentOnHide(true); initKeyBindings(); #ifdef __LOWRES__ setFont(PPFont::getFont(PPFont::FONT_TINY)); switchEditMode(EditModeMilkyTracker); #else setFont(PPFont::getFont(PPFont::FONT_SYSTEM)); switchEditMode(EditModeFastTracker); #endif setRecordMode(false); transposeHandlerResponder = new TransposeHandlerResponder(*this); dialog = NULL; } PatternEditorControl::~PatternEditorControl() { if (patternEditor) patternEditor->removeNotificationListener(this); delete vLeftScrollbar; delete vRightScrollbar; delete hTopScrollbar; delete hBottomScrollbar; delete editMenuControl; delete eventKeyDownBindingsMilkyTracker; delete scanCodeBindingsMilkyTracker; delete eventKeyDownBindingsFastTracker; delete scanCodeBindingsFastTracker; delete transposeHandlerResponder; delete dialog; } void PatternEditorControl::setFont(PPFont* font) { this->font = font; adjustExtents(); if (editMenuControl->getSize().width < slotSize) editMenuControl->setFont(font); else editMenuControl->setFont(PPFont::getFont(PPFont::FONT_SYSTEM)); assureCursorVisible(); } void PatternEditorControl::setSize(const PPSize& size) { PPControl::setSize(size); visibleWidth = size.width - (getRowCountWidth() + 4) - SCROLLBARWIDTH*2; visibleHeight = size.height - (font->getCharHeight() + 4) - SCROLLBARWIDTH*2; delete vLeftScrollbar; delete vRightScrollbar; delete hTopScrollbar; delete hBottomScrollbar; vLeftScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y), size.height, false); vRightScrollbar = new PPScrollbar(1, parentScreen, this, PPPoint(location.x + size.width - SCROLLBARWIDTH, location.y), size.height, false); hTopScrollbar = new PPScrollbar(2, parentScreen, this, PPPoint(location.x + SCROLLBARWIDTH, location.y), size.width - SCROLLBARWIDTH*2, true); hBottomScrollbar = new PPScrollbar(3, parentScreen, this, PPPoint(location.x + SCROLLBARWIDTH, location.y + size.height - SCROLLBARWIDTH), size.width - SCROLLBARWIDTH*2, true); adjustScrollBarSizes(); assureCursorVisible(); } void PatternEditorControl::setLocation(const PPPoint& location) { PPControl::setLocation(location); visibleWidth = size.width - (getRowCountWidth() + 4) - SCROLLBARWIDTH*2; visibleHeight = size.height - (font->getCharHeight() + 4) - SCROLLBARWIDTH*2; delete vLeftScrollbar; delete vRightScrollbar; delete hTopScrollbar; delete hBottomScrollbar; vLeftScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y), size.height, false); vRightScrollbar = new PPScrollbar(1, parentScreen, this, PPPoint(location.x + size.width - SCROLLBARWIDTH, location.y), size.height, false); hTopScrollbar = new PPScrollbar(2, parentScreen, this, PPPoint(location.x + SCROLLBARWIDTH, location.y), size.width - SCROLLBARWIDTH*2, true); hBottomScrollbar = new PPScrollbar(3, parentScreen, this, PPPoint(location.x + SCROLLBARWIDTH, location.y + size.height - SCROLLBARWIDTH), size.width - SCROLLBARWIDTH*2, true); adjustScrollBarSizes(); assureCursorVisible(); } static inline pp_int32 myMod(pp_int32 a, pp_int32 b) { pp_int32 r = a % b; return r < 0 ? b + r : r; } void PatternEditorControl::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; // ;----------------- everything all right? validate(); // ;----------------- colors PPColor lineColor; if (hasFocus || !properties.showFocus) lineColor = *cursorColor; else lineColor.r = lineColor.g = lineColor.b = 64; PPColor bColor = *borderColor, dColor = *borderColor, bCursor = lineColor, dCursor = lineColor; // adjust dark color dColor.scaleFixed(32768); // adjust bright color bColor.scaleFixed(87163); // adjust dark color dCursor.scaleFixed(32768); // adjust bright color bCursor.scaleFixed(87163); g->setRect(location.x+SCROLLBARWIDTH, location.y+SCROLLBARWIDTH, location.x + size.width - SCROLLBARWIDTH, location.y + size.height - SCROLLBARWIDTH); g->setColor(bgColor); g->fill(); g->setFont(font); // ;----------------- not going any further with invalid pattern if (pattern == NULL) return; // ;----------------- make layout extents adjustExtents(); char name[32]; mp_sint32 i,j; // ;----------------- selection layout PatternEditorTools::Position selectionStart, selectionEnd; selectionStart = patternEditor->getSelection().start; selectionEnd = patternEditor->getSelection().end; PatternEditorTools::flattenSelection(selectionStart, selectionEnd); // only entire instrument column is allowed if (selectionStart.inner >= 1 && selectionStart.inner<=2) selectionStart.inner = 1; if (selectionEnd.inner >= 1 && selectionEnd.inner<=2) selectionEnd.inner = 2; // only entire volume column is allowed if (selectionStart.inner >= 3 && selectionStart.inner<=4) selectionStart.inner = 3; if (selectionEnd.inner >= 3 && selectionEnd.inner<=4) selectionEnd.inner = 4; PatternEditorTools::Position& cursor = patternEditor->getCursor(); if (cursor.inner < 0 || cursor.inner >= 8) cursor.inner = 0; // ;----------------- some constants const pp_uint32 fontCharWidth3x = font->getCharWidth()*3 + 1; const pp_uint32 fontCharWidth2x = font->getCharWidth()*2 + 1; const pp_uint32 fontCharWidth1x = font->getCharWidth()*1 + 1; PatternTools* patternTools = &this->patternTools; // ;----------------- Little adjustment for scrolling in center if (properties.scrollMode == ScrollModeToCenter) { if ((size.height - (SCROLLBARWIDTH + ((signed)font->getCharHeight()+4)))/(signed)font->getCharHeight() > (pattern->rows - startIndex + 1) && startIndex > 0) startIndex--; } // ;----------------- start painting rows pp_int32 startx = location.x + SCROLLBARWIDTH + getRowCountWidth() + 4; pp_int32 previousPatternIndex = currentOrderlistIndex; pp_int32 previousRowIndex = 0; pp_int32 nextPatternIndex = currentOrderlistIndex; pp_int32 nextRowIndex = this->pattern->rows-1; pp_int32 songPosOrderListIndex = currentOrderlistIndex; TXMPattern* pattern = this->pattern; // ----------------- colors ----------------- PPColor noteColor = TrackerConfig::colorPatternEditorNote; PPColor insColor = TrackerConfig::colorPatternEditorInstrument; PPColor volColor = TrackerConfig::colorPatternEditorVolume; PPColor effColor = TrackerConfig::colorPatternEditorEffect; PPColor opColor = TrackerConfig::colorPatternEditorOperand; PPColor hiLightPrimary = TrackerConfig::colorHighLight_1; PPColor hiLightSecondary = TrackerConfig::colorHighLight_2; PPColor hiLightPrimaryRow = TrackerConfig::colorRowHighLight_1; PPColor hiLightSecondaryRow = TrackerConfig::colorRowHighLight_2; PPColor textColor = PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText); pp_int32 numVisibleChannels = patternEditor->getNumChannels(); for (pp_int32 i2 = startIndex;; i2++) { i = i2 < 0 ? startIndex - i2 - 1: i2; pp_int32 px = location.x + SCROLLBARWIDTH; pp_int32 py = location.y + (i-startIndex) * font->getCharHeight() + SCROLLBARWIDTH + (font->getCharHeight() + 4); // rows are already in invisible area => abort if (py >= location.y + size.height) break; pp_int32 row = i; if (properties.prospective && properties.scrollMode == ScrollModeStayInCenter && currentOrderlistIndex != -1) { if (i < 0) { previousRowIndex--; if (previousRowIndex < 0) { previousPatternIndex--; if (previousPatternIndex >= 0) { pattern = &module->phead[module->header.ord[previousPatternIndex]]; previousRowIndex = pattern->rows-1; noteColor.set(TrackerConfig::colorThemeMain.r, TrackerConfig::colorThemeMain.g, TrackerConfig::colorThemeMain.b); insColor = volColor = effColor = opColor = noteColor; } else { continue; } } songPosOrderListIndex = previousPatternIndex; row = previousRowIndex; } else if (i >= this->pattern->rows) { nextRowIndex++; if (nextRowIndex == pattern->rows && nextPatternIndex < module->header.ordnum) { nextPatternIndex++; if (nextPatternIndex < module->header.ordnum) { pattern = &module->phead[module->header.ord[nextPatternIndex]]; nextRowIndex = 0; // Outside current range display colors of main theme noteColor.set(TrackerConfig::colorThemeMain.r, TrackerConfig::colorThemeMain.g, TrackerConfig::colorThemeMain.b); insColor = volColor = effColor = opColor = noteColor; } else { continue; } } else if (nextPatternIndex >= module->header.ordnum) { continue; } songPosOrderListIndex = nextPatternIndex; row = nextRowIndex; } else { songPosOrderListIndex = currentOrderlistIndex; pattern = this->pattern; // inside current range display colors as usual noteColor = TrackerConfig::colorPatternEditorNote; insColor = TrackerConfig::colorPatternEditorInstrument; volColor = TrackerConfig::colorPatternEditorVolume; effColor = TrackerConfig::colorPatternEditorEffect; opColor = TrackerConfig::colorPatternEditorOperand; } } else { if (i2 < 0 || i2 >= pattern->rows) continue; row = i; } // draw rows if (!(i % properties.highlightSpacingPrimary) && properties.highLightRowPrimary) { g->setColor(hiLightPrimaryRow); for (pp_int32 k = 0; k < (pp_int32)font->getCharHeight(); k++) g->drawHLine(startx - (getRowCountWidth() + 4), startx+visibleWidth, py + k); } else if (!(i % properties.highlightSpacingSecondary) && properties.highLightRowSecondary) { g->setColor(hiLightSecondaryRow); for (pp_int32 k = 0; k < (pp_int32)font->getCharHeight(); k++) g->drawHLine(startx - (getRowCountWidth() + 4), startx+visibleWidth, py + k); } // draw position line if ((row == songPos.row && songPosOrderListIndex == songPos.orderListIndex) || (i >= 0 && i <= pattern->rows - 1 && i == songPos.row && songPos.orderListIndex == -1)) { PPColor lineColor(TrackerConfig::colorThemeMain.r>>1, TrackerConfig::colorThemeMain.g>>1, TrackerConfig::colorThemeMain.b>>1); g->setColor(lineColor); for (pp_int32 k = 0; k < (pp_int32)font->getCharHeight(); k++) g->drawHLine(startx - (getRowCountWidth() + 4), startx+visibleWidth, py + k); } // draw cursor line if (i == cursor.row) { g->setColor(bCursor); g->drawHLine(startx - (getRowCountWidth() + 4), startx+visibleWidth, py - 1); g->setColor(dCursor); g->drawHLine(startx - (getRowCountWidth() + 4), startx+visibleWidth, py + (pp_int32)font->getCharHeight()); g->setColor(lineColor); for (pp_int32 k = 0; k < (pp_int32)font->getCharHeight(); k++) g->drawHLine(startx - (getRowCountWidth() + 4), startx+visibleWidth, py + k); } // draw rows if (!(i % properties.highlightSpacingPrimary)) g->setColor(hiLightPrimary); else if (!(i % properties.highlightSpacingSecondary)) g->setColor(hiLightSecondary); else g->setColor(textColor); if (properties.hexCount) PatternTools::convertToHex(name, myMod(row, pattern->rows), properties.prospective ? 2 : PatternTools::getHexNumDigits(pattern->rows-1)); else PatternTools::convertToDec(name, myMod(row, pattern->rows), properties.prospective ? 3 : PatternTools::getDecNumDigits(pattern->rows-1)); g->drawString(name, px, py); // draw channels for (j = startPos; j < numVisibleChannels; j++) { pp_int32 px = (location.x + (j-startPos) * slotSize + SCROLLBARWIDTH) + (getRowCountWidth() + 4); // columns are already in invisible area => abort if (px >= location.x + size.width) break; pp_int32 py = location.y + SCROLLBARWIDTH; if (menuInvokeChannel == j) g->setColor(255-dColor.r, 255-dColor.g, 255-dColor.b); else g->setColor(dColor); { PPColor nsdColor = g->getColor(), nsbColor = g->getColor(); if (menuInvokeChannel != j) { // adjust not so dark color nsdColor.scaleFixed(50000); // adjust bright color nsbColor.scaleFixed(80000); } else { // adjust not so dark color nsdColor.scaleFixed(30000); // adjust bright color nsbColor.scaleFixed(60000); } PPRect rect(px, py, px+slotSize, py + font->getCharHeight()+1); g->fillVerticalShaded(rect, nsbColor, nsdColor, false); } if (muteChannels[j]) { g->setColor(128, 128, 128); } else { if (!(j&1)) g->setColor(hiLightPrimary); else g->setColor(textColor); if (j == menuInvokeChannel) { PPColor col = g->getColor(); col.r = textColor.r - col.r; col.g = textColor.g - col.g; col.b = textColor.b - col.b; col.clamp(); g->setColor(col); } } sprintf(name, "%i", j+1); if (muteChannels[j]) strcat(name, " "); g->drawString(name, px + (slotSize>>1)-(((pp_int32)strlen(name)*font->getCharWidth())>>1), py+1); } for (j = startPos; j < numVisibleChannels; j++) { pp_int32 px = (j-startPos) * slotSize + startx; // columns are already in invisible area => abort if (px >= location.x + size.width) break; if (j >= selectionStart.channel && i >= selectionStart.row && j <= selectionEnd.channel && i <= selectionEnd.row && i < this->pattern->rows) { g->setColor(*selectionColor); if ((row == songPos.row && songPosOrderListIndex == songPos.orderListIndex) || (i >= 0 && i <= pattern->rows - 1 && i == songPos.row && songPos.orderListIndex == -1)) { PPColor c = g->getColor(); c.r = (TrackerConfig::colorThemeMain.r + c.r)>>1; c.g = (TrackerConfig::colorThemeMain.g + c.g)>>1; c.b = (TrackerConfig::colorThemeMain.b + c.b)>>1; c.clamp(); g->setColor(c); } if (i == cursor.row) { PPColor c = g->getColor(); c.r+=lineColor.r; c.g+=lineColor.g; c.b+=lineColor.b; c.clamp(); g->setColor(c); } if (selectionStart.channel == selectionEnd.channel && j == selectionStart.channel) { pp_int32 startx = cursorPositions[selectionStart.inner]; pp_int32 endx = cursorPositions[selectionEnd.inner] + cursorSizes[selectionEnd.inner]; g->fill(PPRect(px + startx, py - (i == cursor.row ? 1 : 0), px + endx, py + font->getCharHeight() + (i == cursor.row ? 1 : 0))); } else if (j == selectionStart.channel) { pp_int32 offset = cursorPositions[selectionStart.inner]; g->fill(PPRect(px + offset, py - (i == cursor.row ? 1 : 0), px + slotSize, py + font->getCharHeight() + (i == cursor.row ? 1 : 0))); } else if (j == selectionEnd.channel) { pp_int32 offset = cursorPositions[selectionEnd.inner] + cursorSizes[selectionEnd.inner]; g->fill(PPRect(px, py - (i == cursor.row ? 1 : 0), px + offset, py + font->getCharHeight() + (i == cursor.row ? 1 : 0))); } else { g->fill(PPRect(px, py - (i == cursor.row ? 1 : 0), px + slotSize, py + font->getCharHeight() + (i == cursor.row ? 1 : 0))); } } // --------------------- draw cursor --------------------- if (j == cursor.channel && i == cursor.row) { if (hasFocus || !properties.showFocus) g->setColor(TrackerConfig::colorPatternEditorCursor); else g->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorGrayedOutSelection)); for (pp_int32 k = cursorPositions[cursor.inner]; k < cursorPositions[cursor.inner]+cursorSizes[cursor.inner]; k++) g->drawVLine(py, py + font->getCharHeight(), px + k); PPColor c = g->getColor(); PPColor c2 = c; c.scaleFixed(32768); c2.scaleFixed(87163); g->setColor(c2); g->drawHLine(px + cursorPositions[cursor.inner], px + cursorPositions[cursor.inner]+cursorSizes[cursor.inner], py - 1); g->setColor(c); g->drawHLine(px + cursorPositions[cursor.inner], px + cursorPositions[cursor.inner]+cursorSizes[cursor.inner], py + font->getCharHeight()); } if (muteChannels[j]) { PPColor noteCol = noteColor; noteCol.scaleFixed(properties.muteFade); g->setColor(noteCol); } else g->setColor(noteColor); patternTools->setPosition(pattern, j, row); patternTools->getNoteName(name, patternTools->getNote()); g->drawString(name,px, py); px += fontCharWidth3x + properties.spacing; if (muteChannels[j]) { PPColor insCol = insColor; insCol.scaleFixed(properties.muteFade); g->setColor(insCol); } else g->setColor(insColor); pp_uint32 i = patternTools->getInstrument(); if (i) patternTools->convertToHex(name, i, 2); else { name[0] = name[1] = '\xf4'; name[2] = 0; } if (name[0] == '0') name[0] = '\xf4'; g->drawString(name,px, py); px += fontCharWidth2x + properties.spacing; if (muteChannels[j]) { PPColor volCol = volColor; volCol.scaleFixed(properties.muteFade); g->setColor(volCol); } else g->setColor(volColor); pp_int32 eff, op; name[0] = name[1] = '\xf4'; name[2] = 0; if (pattern->effnum >= 2) { patternTools->getFirstEffect(eff, op); patternTools->convertEffectsToFT2(eff, op); pp_int32 volume = patternTools->getVolumeFromEffect(eff, op); patternTools->getVolumeName(name, volume); } g->drawString(name,px, py); px += fontCharWidth2x + properties.spacing; if (muteChannels[j]) { PPColor effCol = effColor; effCol.scaleFixed(properties.muteFade); g->setColor(effCol); } else g->setColor(effColor); if (pattern->effnum == 1) { patternTools->getFirstEffect(eff, op); patternTools->convertEffectsToFT2(eff, op); } else { patternTools->getNextEffect(eff, op); patternTools->convertEffectsToFT2(eff, op); } if (eff == 0 && op == 0) { name[0] = properties.zeroEffectCharacter; name[1] = 0; } else { patternTools->getEffectName(name, eff); } g->drawString(name,px, py); px += fontCharWidth1x; if (muteChannels[j]) { PPColor opCol = opColor; opCol.scaleFixed(properties.muteFade); g->setColor(opCol); } else g->setColor(opColor); if (eff == 0 && op == 0) { name[0] = name[1] = properties.zeroEffectCharacter; name[2] = 0; } else { patternTools->convertToHex(name, op, 2); } g->drawString(name,px, py); } } for (j = startPos; j < numVisibleChannels; j++) { pp_int32 px = (location.x + (j-startPos) * slotSize + SCROLLBARWIDTH) + (getRowCountWidth() + 4); // columns are already in invisible area => abort if (px >= location.x + size.width) break; px += fontCharWidth3x + properties.spacing; px += fontCharWidth2x*3-1 + properties.spacing*2; px += fontCharWidth1x; g->setColor(*borderColor); g->drawVLine(location.y, location.y + size.height, px+1); g->setColor(bColor); g->drawVLine(location.y, location.y + size.height, px); g->setColor(dColor); g->drawVLine(location.y, location.y + size.height, px+2); } // ;----------------- Margin lines // draw margin vertical line g->setColor(*borderColor); pp_int32 px = location.x + SCROLLBARWIDTH; px+=getRowCountWidth() + 1; g->drawVLine(location.y, location.y + size.height, px+1); g->setColor(bColor); g->drawVLine(location.y, location.y + size.height, px); g->setColor(dColor); g->drawVLine(location.y, location.y + size.height, px+2); // draw margin horizontal lines for (j = 0; j < visibleWidth / slotSize + 1; j++) { pp_int32 px = (location.x + j * slotSize + SCROLLBARWIDTH) + (getRowCountWidth() + 4) - 1; // columns are already in invisible area => abort if (px >= location.x + size.width) break; pp_int32 py = location.y + SCROLLBARWIDTH; py+=font->getCharHeight() + 1; // Did we reach the maximum number of channels already? // no: just draw seperate horizontal line segments between the vertical margin lines if (startPos + j < numVisibleChannels) { g->setColor(*borderColor); g->drawHLine(px, px + slotSize - 1, py+1); g->setColor(bColor); g->drawHLine(px + 1, px + slotSize - 2, py); g->setColor(dColor); g->drawHLine(px + 1, px + slotSize - 2, py+2); } // yes: draw the horizontal margin line completely to the right and abort loop else { g->setColor(*borderColor); g->drawHLine(px, location.x + size.width, py+1); g->setColor(bColor); g->drawHLine(px + 1, location.x + size.width, py); g->setColor(dColor); g->drawHLine(px + 1, location.x + size.width, py+2); break; } } // draw scrollbars hTopScrollbar->paint(g); hBottomScrollbar->paint(g); vLeftScrollbar->paint(g); vRightScrollbar->paint(g); } void PatternEditorControl::attachPatternEditor(PatternEditor* patternEditor) { if (this->patternEditor) this->patternEditor->removeNotificationListener(this); this->patternEditor = patternEditor; patternEditor->addNotificationListener(this); this->module = patternEditor->getModule(); this->pattern = patternEditor->getPattern(); adjustScrollBarPositionsAndSizes(); } void PatternEditorControl::reset() { patternEditor->reset(); menuInvokeChannel = -1; menuPosX = menuPosY = 0; // clear selection startSelection = false; } void PatternEditorControl::setNumVisibleChannels(pp_int32 channels) { patternEditor->setNumVisibleChannels(channels); adjustScrollBarPositionsAndSizes(); validate(); } pp_int32 PatternEditorControl::getRowCountWidth() { if (pattern == NULL) return 0; if (!properties.prospective) { if (properties.hexCount) return font->getCharWidth()*PatternTools::getHexNumDigits(pattern->rows-1); else return font->getCharWidth()*PatternTools::getDecNumDigits(pattern->rows-1); } else { if (properties.hexCount) return font->getCharWidth()*2; else return font->getCharWidth()*3; } } void PatternEditorControl::adjustExtents() { visibleWidth = size.width - (getRowCountWidth() + 4) - SCROLLBARWIDTH*2; visibleHeight = size.height - (font->getCharHeight() + 4) - SCROLLBARWIDTH*2; slotSize = 10*font->getCharWidth() + 3*1 + 4 + 3*properties.spacing; cursorPositions[0] = 0; cursorPositions[1] = 3 * font->getCharWidth() + 1 + properties.spacing; cursorPositions[2] = cursorPositions[1] + font->getCharWidth(); cursorPositions[3] = cursorPositions[2] + font->getCharWidth() + 1 + properties.spacing; cursorPositions[4] = cursorPositions[3] + font->getCharWidth(); cursorPositions[5] = cursorPositions[4] + font->getCharWidth() + 1 + properties.spacing; cursorPositions[6] = cursorPositions[5] + font->getCharWidth() + 1; cursorPositions[7] = cursorPositions[6] + font->getCharWidth(); cursorPositions[8] = /*cursorPositions[7] + font->getCharWidth() + 1*/slotSize; cursorSizes[0] = 3 * font->getCharWidth(); // note cursorSizes[1] = font->getCharWidth(); // instrument digit 1 cursorSizes[2] = font->getCharWidth(); // instrument digit 2 cursorSizes[3] = font->getCharWidth(); // volume digit 1 cursorSizes[4] = font->getCharWidth(); // volume digit 2 cursorSizes[5] = font->getCharWidth(); // effect "digit" cursorSizes[6] = font->getCharWidth(); // operand digit 1 cursorSizes[7] = font->getCharWidth(); // operand digit 2 } void PatternEditorControl::adjustVerticalScrollBarPositions(mp_sint32 startIndex) { // adjust scrollbar positions if (properties.scrollMode != ScrollModeStayInCenter) { pp_int32 visibleItems = (visibleHeight) / font->getCharHeight(); float v = (float)(pattern->rows - visibleItems); vLeftScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); vRightScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); } else { float v = (float)patternEditor->getCursor().row / (float)(pattern->rows-1); vLeftScrollbar->setBarPosition((pp_int32)(65536.0f*v)); vRightScrollbar->setBarPosition((pp_int32)(65536.0f*v)); } } void PatternEditorControl::adjustHorizontalScrollBarPositions(mp_sint32 startPos) { pp_int32 visibleItems = (visibleWidth) / slotSize; float v = (float)(patternEditor->getNumChannels() - visibleItems); hTopScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); hBottomScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } void PatternEditorControl::adjustScrollBarSizes() { float s; if (properties.scrollMode != ScrollModeStayInCenter) { s = (float)(visibleHeight) / (float)(pattern->rows*(font->getCharHeight())); } else { //s = (float)(visibleHeight>>1) / (float)((pattern->rows-1)*(font->getCharHeight())); s = 1.0f / (float)pattern->rows; if (s > 1.0f) s = 1.0f; } vLeftScrollbar->setBarSize((pp_int32)(s*65536.0f), false); vRightScrollbar->setBarSize((pp_int32)(s*65536.0f), false); s = (float)(visibleWidth) / (float)(patternEditor->getNumChannels()*slotSize); hTopScrollbar->setBarSize((pp_int32)(s*65536.0f), false); hBottomScrollbar->setBarSize((pp_int32)(s*65536.0f), false); } void PatternEditorControl::adjustScrollBarPositionsAndSizes() { if (pattern == NULL) return; adjustScrollBarSizes(); adjustVerticalScrollBarPositions(startIndex); adjustHorizontalScrollBarPositions(startPos); } void PatternEditorControl::setScrollbarPositions(mp_sint32 startIndex, mp_sint32 startPos) { adjustHorizontalScrollBarPositions(startPos); adjustVerticalScrollBarPositions(startIndex); } void PatternEditorControl::scrollCursorUp() { if (pattern == NULL) return; /*cursor.row--; if (cursor.row < 0) cursor.row = 0;*/ eventKeyDownBinding_UP(); } void PatternEditorControl::scrollCursorDown() { if (pattern == NULL) return; /*cursor.row++; if (cursor.row > pattern->rows - 1) cursor.row = pattern->rows - 1;*/ eventKeyDownBinding_DOWN(); } void PatternEditorControl::assureCursorVisible(bool row/* = true*/, bool channel/* = true*/) { if (pattern == NULL) return; PatternEditorTools::Position& cursor = patternEditor->getCursor(); if (row) { if (cursor.row >= 0) { switch (properties.scrollMode) { case ScrollModeToEnd: { pp_int32 visibleItems = (visibleHeight - font->getCharHeight()) / font->getCharHeight(); if ((startIndex <= cursor.row) && ((cursor.row - startIndex) * font->getCharHeight()) <= (visibleHeight - font->getCharHeight())) { } else if (cursor.row > startIndex && cursor.row + visibleItems < pattern->rows) { //startIndex = cursorPositionRow; startIndex+=(cursor.row-(startIndex+visibleItems)); } else if (cursor.row < startIndex && cursor.row + visibleItems < pattern->rows) { //startIndex = cursorPositionRow; startIndex+=(cursor.row-startIndex); } else { startIndex = cursor.row - visibleItems; if (startIndex < 0) startIndex = 0; } break; } case ScrollModeToCenter: { pp_int32 mid = (visibleHeight/2) / font->getCharHeight(); startIndex = cursor.row - mid; if (startIndex < 0) startIndex = 0; break; } case ScrollModeStayInCenter: { pp_int32 mid = (visibleHeight/2) / font->getCharHeight(); startIndex = cursor.row - mid; break; } } } adjustVerticalScrollBarPositions(startIndex); } if (channel) { if (cursor.channel >= 0) { pp_int32 visibleChannels = ((visibleWidth) / slotSize) - 1; pp_int32 cursorPos = (cursor.channel-startPos) * slotSize + cursorPositions[cursor.inner]; pp_int32 cursorWidth = cursorPositions[cursor.inner+1] - cursorPositions[cursor.inner]; if ((startPos <= cursor.channel) && cursorPos <= visibleWidth - cursorWidth) { } else if (cursor.channel > startPos && cursorPos < visibleWidth - cursorWidth) { startPos+=(cursor.channel-(startPos+visibleChannels)); } else if (cursor.channel < startPos && cursor.channel + visibleChannels < (signed)patternEditor->getNumChannels()) { startPos+=(cursor.channel-startPos); } else { startPos = cursor.channel - visibleChannels; if (startPos < 0) startPos = 0; } } adjustHorizontalScrollBarPositions(startPos); } } mp_sint32 PatternEditorControl::getNextRecordingChannel(mp_sint32 currentChannel) { if (currentChannel < 0 || currentChannel >= TrackerConfig::MAXCHANNELS) return -1; for (pp_int32 i = currentChannel+1; i < currentChannel + 1 + module->header.channum; i++) { pp_int32 c = i % module->header.channum; if (recChannels[c]) return c; } return currentChannel; } void PatternEditorControl::advanceRow(bool assureCursor/* = true*/, bool repaint/* = true*/) { if (!properties.rowAdvance) return; /*if (cursor.row + rowInsertAdd < pattern->rows - 1) { cursor.row+=rowInsertAdd; } else cursor.row = pattern->rows - 1;*/ PatternEditorTools::Position& cursor = patternEditor->getCursor(); cursor.row = (cursor.row + properties.rowInsertAdd)/* % pattern->rows*/; pp_int32 res = 0; if (cursor.row > pattern->rows-1) { res = notifyUpdate(PatternEditorControl::AdvanceCodeWrappedEnd); } if (!res && cursor.row > pattern->rows-1) { cursor.row %= pattern->rows; } if (assureCursor) assureCursorVisible(); if (repaint) parentScreen->paintControl(this); } void PatternEditorControl::advance() { PatternEditorTools::Position& cursor = patternEditor->getCursor(); // Multichannel editing means: // If we're in the note column and a note has been entered // locate cursor to next recording channel if (properties.multiChannelEdit && cursor.inner == 0) cursor.channel = getNextRecordingChannel(cursor.channel); advanceRow(false, false); assureCursorVisible(); } void PatternEditorControl::setRow(pp_int32 row, bool bAssureCursorVisible/* = true*/) { if (pattern == NULL) return; PatternEditorTools::Position& cursor = patternEditor->getCursor(); if (row >= 0 && row < pattern->rows) cursor.row = row; if (bAssureCursorVisible) assureCursorVisible(true, false); } void PatternEditorControl::setChannel(pp_int32 chn, pp_int32 posInner) { if (pattern == NULL) return; PatternEditorTools::Position& cursor = patternEditor->getCursor(); if (chn >= 0 && chn < pattern->channum) cursor.channel = chn; cursor.inner = posInner; assureCursorVisible(false, true); } void PatternEditorControl::validate() { if (pattern == NULL) return; // validate scrollbar sizes adjustScrollBarSizes(); /*float s = (float)(visibleHeight) / (float)(pattern->rows*(font->getCharHeight())); vLeftScrollbar->setBarSize((pp_int32)(s*65536.0f), false); vRightScrollbar->setBarSize((pp_int32)(s*65536.0f), false); s = (float)(visibleWidth) / (float)(numVisibleChannels*slotSize); hTopScrollbar->setBarSize((pp_int32)(s*65536.0f), false); hBottomScrollbar->setBarSize((pp_int32)(s*65536.0f), false);*/ PatternEditorTools::Position& cursor = patternEditor->getCursor(); // validate cursor position if (cursor.channel >= patternEditor->getNumChannels()) { cursor.channel = patternEditor->getNumChannels()-1; assureCursorVisible(false, true); } if (cursor.row >= pattern->rows) { cursor.row = pattern->rows-1; assureCursorVisible(true, false); } pp_int32 visibleItems = (visibleHeight - font->getCharHeight()) / font->getCharHeight(); if (properties.scrollMode != ScrollModeStayInCenter) { if (startIndex + visibleItems > pattern->rows) { startIndex-=(startIndex + visibleItems)-pattern->rows; } if (startIndex < 0) startIndex = 0; } pp_int32 visibleChannels = (visibleWidth) / slotSize; if (startPos + visibleChannels > patternEditor->getNumChannels()) { startPos-=(startPos + visibleChannels)-patternEditor->getNumChannels(); } if (startPos < 0) startPos = 0; // validate selection /*flattenSelection(); if ((selectionStart.channel >= 0 && selectionStart.channel > numVisibleChannels-1) || (selectionStart.row >= 0 && selectionStart.row > pattern->rows-1)) { resetSelection(); return; } if (selectionEnd.channel >= 0 && selectionEnd.channel > numVisibleChannels-1) selectionEnd.channel = numVisibleChannels-1; if (selectionEnd.row >= 0 && selectionEnd.row > pattern->rows-1) selectionEnd.row = pattern->rows-1;*/ } bool PatternEditorControl::hasValidSelection() const { return patternEditor->hasValidSelection(); } void PatternEditorControl::markChannel(pp_int32 channel, bool invert/* = true*/) { PatternEditor::Selection currentSelection = patternEditor->getSelection(); if (currentSelection.start.channel == channel && currentSelection.start.row == 0 && currentSelection.end.channel == channel && currentSelection.end.row == pattern->rows - 1 && invert) { patternEditor->resetSelection(); } else { patternEditor->selectChannel(channel); } } void PatternEditorControl::selectAll() { patternEditor->selectAll(); } void PatternEditorControl::deselectAll() { patternEditor->resetSelection(); } void PatternEditorControl::executeMenuCommand(pp_int32 commandId) { switch (commandId) { case MenuCommandIDMuteChannel: { muteChannels[menuInvokeChannel] = !muteChannels[menuInvokeChannel]; PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels)); eventListener->handleEvent(reinterpret_cast(this), &e); break; } case MenuCommandIDSoloChannel: { for (pp_uint32 i = 0; i < sizeof(muteChannels)/sizeof(pp_uint8); i++) muteChannels[i] = true; muteChannels[menuInvokeChannel] = false; PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels)); eventListener->handleEvent(reinterpret_cast(this), &e); break; } case MenuCommandIDUnmuteAll: { for (pp_uint32 i = 0; i < sizeof(muteChannels)/sizeof(pp_uint8); i++) muteChannels[i] = false; PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels)); eventListener->handleEvent(reinterpret_cast(this), &e); break; } // cut case MenuCommandIDCut: eventKeyCharBinding_Cut(); break; // copy case MenuCommandIDCopy: eventKeyCharBinding_Copy(); break; // paste case MenuCommandIDPaste: eventKeyCharBinding_Paste(); break; // transparent paste case MenuCommandIDPorousPaste: eventKeyCharBinding_TransparentPaste(); break; // mark all case MenuCommandIDSelectAll: eventKeyCharBinding_SelectAll(); break; // mark channel case MenuCommandIDSelectChannel: markChannel(menuInvokeChannel); break; case MenuCommandIDUndo: patternEditor->undo(); break; case MenuCommandIDRedo: patternEditor->redo(); break; case MenuCommandIDSwapChannels: patternEditor->swapChannels(patternEditor->getCursor().channel, menuInvokeChannel); break; } // Hack: if (parentScreen->getContextMenuControl() == editMenuControl) { menuInvokeChannel = -1; lastMenuInvokeChannel = -1; } } void PatternEditorControl::switchEditMode(EditModes mode) { switch (mode) { case EditModeMilkyTracker: { // Assign keyboard bindings eventKeyDownBindings = eventKeyDownBindingsMilkyTracker; scanCodeBindings = scanCodeBindingsMilkyTracker; selectionKeyModifier = KeyModifierSHIFT; break; } case EditModeFastTracker: { // Assign keyboard bindings eventKeyDownBindings = eventKeyDownBindingsFastTracker; scanCodeBindings = scanCodeBindingsFastTracker; selectionKeyModifier = KeyModifierALT; break; } } editMode = mode; } void PatternEditorControl::unmuteAll() { memset(muteChannels, 0, sizeof(muteChannels)); PPEvent e(eValueChanged, &muteChannels, sizeof(muteChannels)); eventListener->handleEvent(reinterpret_cast(this), &e); } void PatternEditorControl::setRecordMode(bool b) { cursorColor = b ? &TrackerConfig::colorPatternEditorCursorLineHighLight : &TrackerConfig::colorPatternEditorCursorLine; } void PatternEditorControl::editorNotification(EditorBase* sender, EditorBase::EditorNotifications notification) { switch (notification) { case PatternEditor::EditorDestruction: { patternEditor = NULL; break; } case PatternEditor::NotificationReload: { pattern = patternEditor->getPattern(); module = patternEditor->getModule(); adjustScrollBarPositionsAndSizes(); validate(); break; } case PatternEditor::NotificationChanges: { bool lazyUpdateNotifications = patternEditor->getLazyUpdateNotifications(); bool numRowsChanged = patternEditor->getLastOperationDidChangeRows(); bool cursorChanged = patternEditor->getLastOperationDidChangeCursor(); // if this is a lazy notification it means we're only // notifying that something has changed, instead of refreshing the screen // which means that the screen is probably refreshed somewhere else // and the notification itself comes actually from this control if (lazyUpdateNotifications) { notifyChanges(); return; } notifyChanges(); if (numRowsChanged) adjustScrollBarPositionsAndSizes(); if (cursorChanged) assureCursorVisible(); validate(); parentScreen->paintControl(this, false); break; } case PatternEditor::NotificationFeedUndoData: { undoInfo = UndoInfo(startIndex, startPos); patternEditor->setUndoUserData(&undoInfo, sizeof(undoInfo)); break; } case PatternEditor::NotificationFetchUndoData: { if (sizeof(undoInfo) == patternEditor->getUndoUserDataLen()) { memcpy(&undoInfo, patternEditor->getUndoUserData(), sizeof(undoInfo)); assureCursorVisible(); setScrollbarPositions(undoInfo.startIndex, undoInfo.startPos); validate(); parentScreen->paintControl(this, false); notifyUpdate(); } break; } } } milkytracker-0.90.85+dfsg/src/tracker/PlayerCriticalSection.h0000644000175000017500000000274211150223367023257 0ustar admin2admin2/* * tracker/PlayerCriticalSection.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PlayerCriticalSection.h * MilkyTracker * * Created by Peter Barth on 12.12.07. * */ #ifndef __PLAYERCRITICALSECTION_H__ #define __PLAYERCRITICALSECTION_H__ #include "PlayerController.h" class PlayerCriticalSection { private: PlayerController& playerController; bool enabled; public: PlayerCriticalSection(PlayerController& playerController) : playerController(playerController), enabled(false) { } void enter(bool stopPlaying = true) { if (enabled) return; playerController.suspendPlayer(false, stopPlaying); enabled = true; } void leave(bool continuePlaying = true) { if (!enabled) return; playerController.resumePlayer(continuePlaying); enabled = false; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/TrackerShutDown.cpp0000644000175000017500000002052211150223367022441 0ustar admin2admin2/* * tracker/TrackerShutDown.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TrackerShutdown.cpp * MilkyTracker * * Created by Peter Barth on Sun Mar 20 2005. * */ #include "Tracker.h" #include "TabManager.h" #include "MilkyPlay.h" #include "PlayerController.h" #include "PlayerMaster.h" #include "PlayerLogic.h" #include "TrackerSettingsDatabase.h" #include "TrackerConfig.h" #include "PPSystem.h" #include "PPSavePanel.h" #include "PPQuitSaveAlert.h" #include "ModuleEditor.h" #include "SectionInstruments.h" #include "PatternEditorControl.h" #include "EnvelopeEditorControl.h" #include "SampleEditorControl.h" #include "SectionDiskMenu.h" #include "SectionHDRecorder.h" #include "SectionOptimize.h" #include "ScopesControl.h" #include "GlobalColorConfig.h" #include "ColorPaletteContainer.h" #include "SectionSettings.h" #include "SectionSamples.h" #include "SectionQuickOptions.h" #include "Tools.h" #include "TitlePageManager.h" bool Tracker::checkForChanges(ModuleEditor* moduleEditor/* = NULL*/) { if (moduleEditor == NULL) moduleEditor = this->moduleEditor; // save current file? if (moduleEditor->hasChanged()) { PPQuitSaveAlert quitSaveAlertDialog(screen); PPQuitSaveAlert::ReturnCodes err = quitSaveAlertDialog.runModal(); if (err == PPQuitSaveAlert::ReturnCodeOK) { PPSavePanel savePanel(screen, "Save Extended Module", moduleEditor->getModuleFileName()); savePanel.addExtension("xm","Fasttracker 2 Module"); err = savePanel.runModal(); if (err == PPSavePanel::ReturnCodeOK) { const SYSCHAR* file = savePanel.getFileName(); if (file) { moduleEditor->saveSong(file); } } } else if (err == PPSavePanel::ReturnCodeCANCEL) { return false; } } return true; } bool Tracker::checkForChangesOpenModule() { bool openTab = (settingsDatabase->restore("TABS_LOADMODULEINNEWTAB")->getBoolValue() && (moduleEditor->hasChanged() || !moduleEditor->isEmpty())); if (openTab) return true; return checkForChanges(); } bool Tracker::shutDown() { pp_int32 i; ModuleEditor* currentEditor = moduleEditor; for (i = 0; i < tabManager->getNumTabs(); i++) { moduleEditor = tabManager->getModuleEditorFromTabIndex(i); bool res = checkForChanges(); if (!res) return false; } moduleEditor = currentEditor; playerMaster->stop(true); XMFile f(System::getConfigFileName(), true); // ----------- Save last settings ----------- // store version string to database settingsDatabase->store("VERSION", TrackerConfig::version); char buffer[100]; // playmode settings const char* playModeStrings[5] = {"AUTO", "PROTRACKER2", "PROTRACKER3", "SCREAMTRACKER3", "FASTTRACKER2"}; pp_int32 playMode = playerController->getPlayMode(); ASSERT(playMode >= 0 && playMode < 5); settingsDatabase->store("PLAYMODEKEEPSETTINGS", sectionQuickOptions->keepSettings()); settingsDatabase->store("PLAYMODE", sectionQuickOptions->keepSettings() ? playModeStrings[playMode] : playModeStrings[4]); settingsDatabase->store("PLAYMODE_ADVANCED_ALLOW8xx", playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionPanning8xx)); settingsDatabase->store("PLAYMODE_ADVANCED_ALLOWE8x", playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionPanningE8x)); // Only affects protracker playmodes settingsDatabase->store("PLAYMODE_ADVANCED_PTPITCHLIMIT", playerController->isPlayModeOptionEnabled(PlayerController::PlayModeOptionForcePTPitchLimit)); // save default panning for protracker playmodes pp_uint8* panning = new pp_uint8[TrackerConfig::numPlayerChannels]; for (i = 0; i < TrackerConfig::numPlayerChannels; i++) panning[i] = playerController->getPanning((pp_uint8)i); settingsDatabase->store("PLAYMODE_ADVANCED_PTPANNING", PPTools::encodeByteArray(panning, TrackerConfig::numPlayerChannels)); delete[] panning; // quick options settingsDatabase->store("PROSPECTIVE", getProspectiveMode() ? 1 : 0); settingsDatabase->store("WRAPAROUND", getCursorWrapAround() ? 1 : 0); settingsDatabase->store("FOLLOWSONG", getFollowSong() ? 1 : 0); settingsDatabase->store("LIVESWITCH", playerLogic->getLiveSwitch() ? 1 : 0); // Disk Operations settingsDatabase->store("INTERNALDISKBROWSERSETTINGS", sectionDiskMenu->getConfigUInt32()); settingsDatabase->store("INTERNALDISKBROWSERLASTPATH", sectionDiskMenu->getCurrentPathASCII()); // HD recorder settingsDatabase->store("HDRECORDER_MIXFREQ", sectionHDRecorder->getSettingsFrequency()); settingsDatabase->store("HDRECORDER_MIXERVOLUME", sectionHDRecorder->getSettingsMixerVolume()); settingsDatabase->store("HDRECORDER_MIXERSHIFT", sectionHDRecorder->getSettingsMixerShift()); settingsDatabase->store("HDRECORDER_RAMPING", sectionHDRecorder->getSettingsRamping() ? 1 : 0); settingsDatabase->store("HDRECORDER_INTERPOLATION", sectionHDRecorder->getSettingsResampler()); settingsDatabase->store("HDRECORDER_ALLOWMUTING", sectionHDRecorder->getSettingsAllowMuting() ? 1 : 0); // sample editor settingsDatabase->store("SAMPLEEDITORDECIMALOFFSETS", sectionSamples->getOffsetFormat()); // Sample editor contol will store last used values here PPDictionary dictonary = sectionSamples->getSampleEditorControl()->getLastValues().convertToDictionary(); PPString lastValues = dictonary.serializeToString(); settingsDatabase->store("SAMPLEEDITORLASTVALUES", lastValues); // Optimizer for (i = 0; i < (signed)SectionOptimize::getNumFlagGroups(); i++) { sprintf(buffer, "OPTIMIZER_%i",i); settingsDatabase->store(buffer, sectionOptimize->getOptimizeCheckBoxFlags(i)); } // Scale of envelope editor settingsDatabase->store("ENVELOPEEDITORSCALE", sectionInstruments->getEnvelopeEditorControl()->getScale()); // Orderlist was expanded? settingsDatabase->store("EXTENDEDORDERLIST", extendedOrderlist ? 1 : 0); // Current row insert add value settingsDatabase->store("ROWINSERTADD", getPatternEditorControl()->getRowInsertAdd()); // Current visible title page TitlePageManager titlePageManager(*screen); settingsDatabase->store("TITLEPAGE", titlePageManager.getCurrentTitlePage()); // Save colors TColorPalette palette; palette.numColors = GlobalColorConfig::ColorLast; for (i = 0; i < palette.numColors; i++) palette.colors[i] = GlobalColorConfig::getInstance()->getColor((GlobalColorConfig::GlobalColors)i); settingsDatabase->store("ACTIVECOLORS", ColorPaletteContainer::encodePalette(palette)); // store predefined envelopes for (i = 0; i < sectionInstruments->getNumPredefinedEnvelopes(); i++) { sprintf(buffer, "PREDEFENVELOPEVOLUME_%i",i); settingsDatabase->store(buffer, sectionInstruments->getEncodedEnvelope(SectionInstruments::EnvelopeTypeVolume, i)); } for (i = 0; i < sectionInstruments->getNumPredefinedEnvelopes(); i++) { sprintf(buffer, "PREDEFENVELOPEPANNING_%i",i); settingsDatabase->store(buffer, sectionInstruments->getEncodedEnvelope(SectionInstruments::EnvelopeTypePanning, i)); } // store effect macros from pattern editor control for (i = 0; i < NUMEFFECTMACROS; i++) { sprintf(buffer, "EFFECTMACRO_%i",i); pp_uint8 eff, op; getPatternEditor()->getMacroOperands(i, eff, op); pp_int32 val = (((pp_int32)eff) << 8) + (pp_int32)op; settingsDatabase->store(buffer, val); } for (i = 0; i < sectionSettings->getNumPredefinedColorPalettes(); i++) { sprintf(buffer, "PREDEFCOLORPALETTE_%i",i); settingsDatabase->store(buffer, sectionSettings->getEncodedPalette(i)); } settingsDatabase->serialize(f); return true; } // this is used when the tracker crashes // The os dependent layer can call this and it will save a backup of the current // module // TO-DO: Doesn't handle tabs properly yet, will only save the current tab void Tracker::saveModule(const PPSystemString& fileName) { moduleEditor->saveBackup(fileName); } milkytracker-0.90.85+dfsg/src/tracker/LogoSmall.cpp0000644000175000017500000266464511150223367021271 0ustar admin2admin2/* * tracker/LogoSmall.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "LogoSmall.h" const pp_uint32 LogoSmall::width = 318; const pp_uint32 LogoSmall::height = 116; const pp_uint8 LogoSmall::rawData[] = {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,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,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,0x01,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,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,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,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,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,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,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,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,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,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,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,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,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,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,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,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,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x48,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,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,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,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x6d,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x5e,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x5e,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x82,0x00, 0x00,0x00,0x7f,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,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,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,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x6b,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x74,0x00, 0x00,0x00,0x7f,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0x8a,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x93,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x8a,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x8e,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0xa6,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0xab,0x00, 0x00,0x00,0x9c,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,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,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,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,0x03,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0xad,0x00, 0x00,0x00,0xb5,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xb9,0x00, 0x00,0x00,0xb4,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x56,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0xba,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xba,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0xb2,0x00, 0x00,0x00,0xb6,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0xbf,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xcc,0x00, 0x00,0x00,0xce,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xc3,0x00, 0x00,0x00,0xbf,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xbc,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xc4,0x00, 0x00,0x00,0xca,0x01,0x00,0x00,0xd1,0x0f,0x0b,0x0b,0xd6,0x14,0x0f,0x0e,0xda,0x14, 0x0f,0x0e,0xdc,0x14,0x0f,0x0e,0xdd,0x14,0x0f,0x0e,0xdd,0x14,0x0f,0x0e,0xdd,0x14, 0x0f,0x0e,0xdd,0x14,0x0f,0x0e,0xdd,0x14,0x0f,0x0e,0xdd,0x14,0x0f,0x0e,0xdd,0x14, 0x0f,0x0e,0xdd,0x14,0x0f,0x0e,0xdd,0x15,0x10,0x0e,0xdd,0x16,0x11,0x10,0xdd,0x11, 0x10,0x12,0xdd,0x13,0x0f,0x0d,0xdd,0x14,0x0f,0x0e,0xdd,0x14,0x0f,0x0e,0xdc,0x14, 0x0f,0x0e,0xd9,0x12,0x0e,0x0d,0xd2,0x06,0x04,0x04,0xc3,0x00,0x00,0x00,0xa9,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0xc2,0x14,0x13,0x12,0xd2,0x62,0x53,0x4e,0xda,0x8f,0x71,0x69,0xde,0x7f, 0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x80,0x62,0x59,0xe0,0x7f,0x61,0x59,0xe0,0x7e, 0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x7e,0x60,0x57,0xe0,0x7e,0x60,0x57,0xe0,0x7e, 0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x7f,0x61,0x59,0xe0,0x7f, 0x61,0x59,0xe0,0x7e,0x60,0x58,0xe0,0x86,0x65,0x5c,0xe0,0x4f,0x45,0x41,0xe0,0x55, 0x48,0x45,0xe0,0x8d,0x6a,0x60,0xde,0x5a,0x44,0x3e,0xd9,0x11,0x0d,0x0c,0xce,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x87,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xbb,0x1f,0x1f,0x1e,0xcc,0x3a, 0x38,0x37,0xd7,0x7e,0x6b,0x64,0xdd,0x8d,0x72,0x69,0xdf,0x83,0x66,0x5e,0xe0,0x82, 0x64,0x5c,0xe0,0x81,0x64,0x5b,0xe0,0x81,0x64,0x5b,0xe0,0x81,0x63,0x5b,0xe0,0x81, 0x63,0x5b,0xe0,0x82,0x64,0x5c,0xe0,0x82,0x63,0x5a,0xe0,0x80,0x63,0x5a,0xe0,0x72, 0x55,0x5b,0xe0,0x7d,0x5f,0x5b,0xe0,0x81,0x63,0x5a,0xde,0x87,0x67,0x5e,0xde,0x4d, 0x3a,0x3d,0xda,0x09,0x07,0x08,0xd7,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xd4,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0xd8,0x77,0x60,0x59,0xdc,0x85,0x67,0x5e,0xde,0x7e, 0x60,0x58,0xe0,0x7f,0x61,0x59,0xe0,0x7e,0x60,0x58,0xe0,0x7f,0x61,0x59,0xe0,0x7e, 0x60,0x58,0xe0,0x7f,0x61,0x59,0xe0,0x7e,0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x7f, 0x61,0x59,0xe0,0x7e,0x60,0x58,0xe1,0x7e,0x60,0x58,0xe2,0x82,0x63,0x5b,0xe4,0x4e, 0x43,0x3c,0xe6,0x67,0x53,0x4a,0xe8,0x87,0x6c,0x64,0xea,0x80,0x62,0x59,0xe8,0x7f, 0x61,0x59,0xe6,0x7e,0x60,0x58,0xe4,0x7e,0x60,0x58,0xe2,0x7f,0x61,0x59,0xe1,0x7e, 0x60,0x58,0xe0,0x7f,0x61,0x59,0xe0,0x7e,0x60,0x58,0xe0,0x7e,0x60,0x57,0xe0,0x7f, 0x61,0x59,0xe0,0x7e,0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x7e, 0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x7e,0x60,0x58,0xe0,0x7b,0x5e,0x56,0xe1,0x06, 0x05,0x04,0xe2,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xe7,0x05,0x04,0x03,0xeb,0x69, 0x50,0x49,0xee,0x8c,0x6d,0x63,0xf0,0x86,0x67,0x5e,0xf1,0x85,0x66,0x5d,0xf2,0x86, 0x66,0x5d,0xf2,0x85,0x66,0x5d,0xf2,0x85,0x66,0x5d,0xf2,0x86,0x67,0x5e,0xf2,0x85, 0x66,0x5d,0xf2,0x85,0x66,0x5d,0xf2,0x85,0x66,0x5d,0xf2,0x86,0x66,0x5d,0xf2,0x79, 0x5f,0x56,0xf2,0x22,0x2a,0x24,0xf2,0x50,0x48,0x4c,0xf2,0x92,0x73,0x68,0xf2,0x84, 0x64,0x5b,0xf2,0x85,0x66,0x5d,0xf1,0x86,0x67,0x5d,0xef,0x80,0x61,0x59,0xe9,0x47, 0x37,0x32,0xdb,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x03,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,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,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,0x02,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x9a,0x00,0x00,0x00,0xc0,0x36,0x31,0x2e,0xda,0x9c,0x88,0x80,0xe9,0xb0, 0x8e,0x83,0xf0,0xa5,0x7e,0x73,0xf2,0x9f,0x79,0x6f,0xf3,0xa0,0x7b,0x70,0xf3,0xa0, 0x7a,0x6f,0xf3,0xa0,0x7a,0x6f,0xf3,0x9f,0x7b,0x70,0xf3,0x9f,0x7a,0x6f,0xf3,0xa0, 0x79,0x70,0xf3,0x9f,0x7a,0x6f,0xf3,0xa0,0x7b,0x70,0xf3,0x9f,0x7a,0x6f,0xf3,0x9f, 0x7a,0x6f,0xf3,0xa0,0x7b,0x70,0xf3,0xa0,0x7b,0x70,0xf3,0xa1,0x7c,0x70,0xf3,0xa5, 0x7a,0x75,0xf3,0x50,0x47,0x43,0xf3,0x6a,0x61,0x57,0xf3,0xb7,0x8f,0x7f,0xf1,0x93, 0x71,0x75,0xec,0x3a,0x32,0x3a,0xe2,0x00,0x02,0x00,0xcc,0x00,0x00,0x00,0xab,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xc8,0x3c, 0x3a,0x39,0xda,0x9c,0x89,0x82,0xe6,0xa3,0x86,0x7c,0xed,0xa1,0x7f,0x74,0xf1,0xa3, 0x7d,0x73,0xf3,0xa1,0x7b,0x71,0xf3,0xa1,0x7b,0x71,0xf3,0xa0,0x7a,0x70,0xf3,0xa1, 0x7b,0x71,0xf3,0xa1,0x7b,0x70,0xf3,0xa1,0x7b,0x6f,0xf3,0x9b,0x78,0x6e,0xf3,0xa1, 0x7b,0x71,0xf3,0x71,0x5f,0x64,0xf3,0x91,0x70,0x6d,0xf3,0xa1,0x7a,0x71,0xf3,0xa0, 0x7b,0x70,0xf2,0xa7,0x7f,0x71,0xf1,0x7e,0x63,0x6f,0xf0,0x13,0x0f,0x13,0xee,0x00, 0x00,0x00,0xed,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0xee,0x42,0x3a,0x37,0xf0,0x9d, 0x7c,0x71,0xf1,0xa4,0x7e,0x72,0xf2,0xa0,0x7a,0x70,0xf3,0xa0,0x7a,0x6f,0xf3,0x9f, 0x7a,0x6f,0xf3,0xa0,0x7b,0x70,0xf3,0xa0,0x7a,0x70,0xf3,0xa0,0x7b,0x70,0xf3,0xa0, 0x7a,0x70,0xf3,0xa0,0x7a,0x70,0xf3,0xa0,0x7b,0x70,0xf3,0xa0,0x7b,0x70,0xf3,0xa0, 0x7b,0x70,0xf4,0x9c,0x79,0x6e,0xf5,0x57,0x4d,0x43,0xf6,0xb3,0x99,0x8e,0xf7,0xb3, 0x91,0x86,0xf7,0xa6,0x80,0x75,0xf7,0xa0,0x7a,0x70,0xf6,0xa0,0x7b,0x70,0xf5,0xa0, 0x7b,0x70,0xf4,0xa0,0x7b,0x70,0xf3,0xa0,0x7a,0x6f,0xf3,0xa0,0x7b,0x70,0xf3,0xa1, 0x7b,0x70,0xf3,0xa0,0x7a,0x70,0xf3,0xa1,0x7b,0x70,0xf3,0xa0,0x7a,0x70,0xf3,0xa0, 0x7a,0x70,0xf3,0xa0,0x7a,0x6f,0xf3,0x9f,0x7a,0x6f,0xf3,0xa0,0x7b,0x70,0xf3,0xa0, 0x7b,0x70,0xf3,0x9d,0x78,0x6d,0xf3,0x1e,0x17,0x16,0xf4,0x00,0x00,0x00,0xf5,0x00, 0x00,0x00,0xf6,0x06,0x04,0x04,0xf8,0x7d,0x5d,0x5e,0xf9,0xb1,0x8e,0x82,0xfa,0xa7, 0x80,0x75,0xfb,0xa5,0x80,0x75,0xfb,0xa5,0x7f,0x75,0xfb,0xa1,0x7c,0x70,0xfb,0x9e, 0x78,0x6e,0xfb,0x9e,0x79,0x6e,0xfb,0x9f,0x79,0x6f,0xfb,0x9e,0x79,0x6e,0xfb,0x9f, 0x79,0x6f,0xfb,0x94,0x72,0x69,0xfb,0x34,0x39,0x33,0xfb,0x36,0x3b,0x33,0xfb,0xb0, 0x91,0x88,0xfb,0xba,0x9e,0x94,0xfb,0x9c,0x76,0x6b,0xfb,0x9f,0x7a,0x6f,0xfb,0x9e, 0x79,0x6e,0xf9,0xa0,0x79,0x6f,0xf5,0x80,0x62,0x59,0xea,0x01,0x00,0x00,0xd5,0x00, 0x00,0x00,0xb5,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,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,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,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0xa9,0x1c,0x1a,0x19,0xcf,0x7d, 0x6f,0x6a,0xe7,0xa5,0x8a,0x80,0xf4,0x8f,0x70,0x68,0xf9,0x90,0x6f,0x68,0xfc,0x9a, 0x76,0x6b,0xfc,0x9a,0x76,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x9a,0x76,0x6b,0xfc,0x9a, 0x76,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x98,0x74,0x6a,0xfc,0x98,0x74,0x6a,0xfc,0x99, 0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99, 0x75,0x6b,0xfc,0x9e,0x78,0x6b,0xfc,0x89,0x6b,0x71,0xfc,0x34,0x37,0x3c,0xfc,0x62, 0x58,0x4b,0xfc,0xb1,0x86,0x7d,0xfa,0x70,0x5d,0x5c,0xf7,0x2f,0x33,0x32,0xee,0x0c, 0x0e,0x0c,0xdb,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x62,0x00, 0x00,0x00,0x3a,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x4d,0x00, 0x00,0x00,0x68,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xbd,0x04, 0x03,0x04,0xd2,0x07,0x07,0x09,0xe2,0x7f,0x69,0x64,0xed,0xaa,0x86,0x7b,0xf5,0x9c, 0x77,0x6d,0xf9,0x99,0x74,0x6a,0xfb,0x98,0x74,0x69,0xfc,0x99,0x75,0x6b,0xfc,0x9a, 0x76,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x9a,0x76,0x6b,0xfc,0x98,0x74,0x6b,0xfc,0x9a, 0x74,0x6b,0xfc,0x6c,0x59,0x5d,0xfc,0x70,0x5c,0x6c,0xfc,0x8f,0x6f,0x6c,0xfc,0x9a, 0x76,0x6b,0xfc,0x99,0x75,0x6a,0xfc,0x97,0x74,0x6a,0xfc,0xa6,0x7d,0x70,0xfb,0x55, 0x4a,0x4c,0xfb,0x09,0x09,0x0b,0xfa,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xf9,0x13, 0x11,0x11,0xfa,0x94,0x79,0x70,0xfb,0xa0,0x7c,0x71,0xfb,0x9a,0x76,0x6b,0xfc,0x99, 0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99, 0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x9a, 0x76,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x9d,0x78,0x6d,0xfc,0x64,0x54,0x4e,0xfc,0x4a, 0x45,0x3d,0xfc,0x9b,0x86,0x7e,0xfc,0x9e,0x86,0x7f,0xfd,0xa0,0x85,0x80,0xfc,0x9c, 0x7a,0x70,0xfc,0x99,0x75,0x6b,0xfc,0x9a,0x76,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x9a, 0x76,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x9a,0x76,0x6b,0xfc,0x99, 0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x99,0x75,0x6b,0xfc,0x9a,0x76,0x6b,0xfc,0x99, 0x75,0x6b,0xfc,0x9a,0x76,0x6b,0xfc,0x9a,0x76,0x6b,0xfc,0x97,0x74,0x69,0xfc,0x26, 0x1c,0x1a,0xfc,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xfc,0x04,0x03,0x04,0xfd,0x5e, 0x48,0x51,0xfd,0x90,0x74,0x69,0xfe,0x8b,0x6e,0x64,0xfe,0x8a,0x6c,0x63,0xfe,0x82, 0x67,0x5f,0xfe,0x9c,0x79,0x71,0xfe,0x9a,0x76,0x6b,0xfe,0x98,0x74,0x6a,0xfe,0x99, 0x75,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x99,0x74,0x6a,0xfe,0x90,0x6f,0x66,0xfe,0x49, 0x45,0x49,0xfe,0x72,0x60,0x6b,0xfe,0xbe,0xa2,0x97,0xfe,0xad,0x8f,0x86,0xfe,0x98, 0x73,0x68,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfd,0x9a,0x75,0x6b,0xfa,0x90, 0x6f,0x65,0xf2,0x3e,0x30,0x2b,0xe1,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,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,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x8c,0x00, 0x00,0x00,0xb7,0x12,0x11,0x12,0xd8,0x3e,0x3b,0x3d,0xed,0x45,0x43,0x47,0xf8,0x51, 0x4a,0x53,0xfc,0x7e,0x65,0x64,0xfe,0x9e,0x78,0x6c,0xfe,0x9a,0x76,0x6b,0xfe,0x9a, 0x76,0x6b,0xfe,0x9a,0x76,0x6c,0xfe,0x99,0x75,0x6c,0xfe,0x99,0x75,0x6b,0xfe,0x9a, 0x76,0x6c,0xfe,0x99,0x75,0x6b,0xfe,0x99,0x75,0x6a,0xfe,0x9a,0x76,0x6c,0xfe,0x99, 0x75,0x6c,0xfe,0x99,0x75,0x6c,0xfe,0x9c,0x77,0x6b,0xfe,0x99,0x76,0x6d,0xfe,0x7b, 0x62,0x6f,0xfe,0x48,0x44,0x52,0xfe,0x78,0x63,0x5a,0xfe,0x99,0x75,0x77,0xfe,0x4e, 0x48,0x4e,0xfb,0x2f,0x37,0x30,0xf4,0x15,0x17,0x15,0xe4,0x00,0x00,0x00,0xc7,0x00, 0x00,0x00,0x9f,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xae,0x00, 0x00,0x00,0xc7,0x20,0x1d,0x19,0xdb,0x4f,0x41,0x49,0xe9,0x6e,0x53,0x66,0xf3,0xa7, 0x8a,0x8a,0xf8,0xa5,0x82,0x76,0xfb,0x99,0x74,0x69,0xfe,0x9a,0x76,0x6b,0xfe,0x99, 0x75,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9c, 0x78,0x6a,0xfe,0x8a,0x69,0x71,0xfe,0x87,0x65,0x6c,0xfe,0x91,0x6c,0x69,0xfe,0x99, 0x74,0x6b,0xfe,0x9b,0x77,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9c, 0x78,0x6b,0xfe,0x97,0x74,0x6d,0xfe,0x49,0x42,0x43,0xfe,0x07,0x08,0x09,0xfe,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x81,0x6f,0x69,0xfe,0xa2,0x80,0x76,0xfe,0x9a, 0x76,0x6c,0xfe,0x99,0x75,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x99, 0x75,0x6a,0xfe,0x98,0x74,0x6a,0xfe,0x9a,0x76,0x6c,0xfe,0x99,0x75,0x6b,0xfe,0x9a, 0x76,0x6c,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0xa4, 0x7c,0x6f,0xfe,0x4e,0x47,0x4a,0xfe,0x3b,0x3f,0x3c,0xfe,0x2b,0x2c,0x2c,0xfe,0x2a, 0x2a,0x2b,0xff,0x50,0x45,0x52,0xfe,0xa4,0x85,0x7b,0xfe,0x9a,0x76,0x6c,0xfe,0x9a, 0x76,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a, 0x76,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a, 0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a, 0x76,0x6b,0xfe,0x96,0x73,0x69,0xfe,0x2c,0x21,0x1e,0xfe,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0xfe,0x01,0x02,0x01,0xff,0x1f,0x21,0x20,0xff,0x29,0x2d,0x29,0xff,0x23, 0x28,0x23,0xff,0x23,0x27,0x25,0xff,0x28,0x29,0x29,0xff,0x80,0x61,0x6c,0xff,0xa2, 0x7e,0x73,0xff,0x9a,0x75,0x6a,0xff,0x98,0x74,0x6a,0xff,0x98,0x74,0x6a,0xff,0x99, 0x75,0x6b,0xff,0x99,0x75,0x6b,0xff,0x97,0x72,0x6a,0xff,0x8c,0x6c,0x77,0xff,0xb9, 0x9d,0x90,0xff,0x9a,0x76,0x6c,0xff,0x99,0x74,0x6b,0xff,0x98,0x74,0x6a,0xff,0x99, 0x75,0x6b,0xfe,0x99,0x75,0x6b,0xfc,0x9a,0x76,0x6c,0xf6,0x75,0x59,0x52,0xe9,0x00, 0x00,0x00,0xd3,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x75,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0xc6,0x11,0x12,0x13,0xe2,0x41, 0x3e,0x46,0xf3,0x61,0x54,0x60,0xfb,0x8b,0x6e,0x6e,0xfd,0xa1,0x7b,0x6f,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x99, 0x74,0x6c,0xff,0x88,0x68,0x6d,0xff,0x80,0x69,0x75,0xff,0x5e,0x55,0x5d,0xff,0x75, 0x61,0x62,0xff,0x7a,0x64,0x6b,0xff,0x3f,0x3f,0x44,0xfd,0x33,0x3a,0x34,0xf7,0x20, 0x24,0x20,0xeb,0x04,0x05,0x04,0xd3,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x5c,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x9f,0x00, 0x00,0x00,0xb9,0x07,0x07,0x07,0xcf,0x42,0x3b,0x38,0xe1,0x9b,0x82,0x76,0xed,0x95, 0x77,0x81,0xf5,0x82,0x61,0x72,0xfa,0xa0,0x80,0x7c,0xfc,0xa0,0x7d,0x72,0xfe,0x99, 0x75,0x6a,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6c,0xff,0x9e,0x79,0x6a,0xff,0x84,0x67,0x75,0xff,0x99, 0x79,0x76,0xff,0x9d,0x79,0x6e,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0xa0,0x77,0x70,0xff,0x61,0x53,0x5a,0xff,0x3e, 0x3b,0x40,0xff,0x09,0x09,0x09,0xff,0x00,0x00,0x00,0xff,0x53,0x45,0x40,0xff,0xad, 0x8c,0x82,0xff,0xae,0x89,0x7d,0xff,0xa8,0x83,0x78,0xff,0xa8,0x84,0x79,0xff,0xa8, 0x83,0x78,0xff,0xa8,0x84,0x79,0xff,0xa9,0x84,0x79,0xff,0xa9,0x84,0x79,0xff,0xaa, 0x85,0x7a,0xff,0xaa,0x85,0x79,0xff,0xaa,0x85,0x7a,0xff,0xaa,0x85,0x7a,0xff,0xa6, 0x81,0x76,0xff,0xa6,0x7f,0x73,0xff,0x93,0x73,0x70,0xff,0x35,0x39,0x33,0xff,0x31, 0x37,0x33,0xff,0x30,0x34,0x30,0xff,0x27,0x2e,0x28,0xff,0x54,0x44,0x51,0xff,0xa3, 0x84,0x7b,0xff,0x9b,0x77,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x98,0x74,0x6a,0xff,0x34, 0x28,0x25,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x01,0x02,0x02,0xff,0x21, 0x24,0x22,0xff,0x34,0x39,0x34,0xff,0x30,0x36,0x30,0xff,0x32,0x38,0x32,0xff,0x30, 0x31,0x30,0xff,0x66,0x53,0x62,0xff,0x9b,0x7c,0x70,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x99, 0x75,0x6b,0xff,0x8f,0x6c,0x6f,0xff,0xa0,0x81,0x7d,0xff,0xa0,0x7e,0x72,0xff,0x99, 0x75,0x6a,0xff,0x99,0x75,0x6b,0xff,0x99,0x75,0x6b,0xff,0x99,0x75,0x6b,0xfe,0x9c, 0x78,0x6d,0xfa,0x8d,0x6b,0x62,0xf0,0x2b,0x21,0x1e,0xde,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x98,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0xd6,0x17,0x13,0x12,0xea,0x68,0x55,0x59,0xf7,0x9c,0x7a,0x7b,0xfc,0xa0, 0x7a,0x6d,0xfe,0x99,0x76,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x76,0x6d,0xff,0x9a, 0x77,0x6c,0xff,0x9a,0x77,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x77,0x6d,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9b, 0x77,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x91,0x6d,0x6a,0xff,0x93,0x6e,0x69,0xff,0xad, 0x87,0x77,0xff,0x7e,0x6a,0x68,0xff,0x44,0x42,0x4c,0xff,0x78,0x63,0x6d,0xff,0x61, 0x54,0x55,0xfd,0x2c,0x35,0x2e,0xfa,0x2d,0x33,0x2e,0xf0,0x0e,0x10,0x0e,0xdd,0x00, 0x00,0x00,0xc0,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x8f,0x00, 0x00,0x00,0xac,0x00,0x00,0x00,0xc6,0x17,0x16,0x15,0xd9,0x69,0x5b,0x56,0xe8,0xa9, 0x8b,0x81,0xf1,0xa1,0x7c,0x6f,0xf8,0x87,0x66,0x6f,0xfc,0x8a,0x67,0x6b,0xfe,0x96, 0x71,0x67,0xfe,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x77,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x99,0x76,0x6b,0xff,0xa0,0x7a,0x6e,0xff,0x95, 0x70,0x6c,0xff,0x8e,0x6b,0x6e,0xff,0xa4,0x85,0x7e,0xff,0x9e,0x7b,0x71,0xff,0x99, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x77,0x6d,0xff,0x9e,0x7a,0x6d,0xff,0x85, 0x66,0x71,0xff,0x51,0x49,0x4f,0xff,0x3d,0x3b,0x3d,0xff,0x09,0x08,0x09,0xff,0x00, 0x02,0x02,0xff,0x6c,0x5b,0x56,0xff,0x79,0x65,0x60,0xff,0x78,0x64,0x5f,0xff,0x78, 0x64,0x5f,0xff,0x79,0x65,0x60,0xff,0x78,0x64,0x5f,0xff,0x77,0x64,0x5f,0xff,0x78, 0x64,0x5f,0xff,0x77,0x63,0x5e,0xff,0x76,0x62,0x5d,0xff,0x76,0x64,0x5e,0xff,0x75, 0x62,0x5d,0xff,0x74,0x61,0x5c,0xff,0x7d,0x68,0x63,0xff,0x7f,0x69,0x63,0xff,0x4e, 0x48,0x4f,0xff,0x2d,0x35,0x2e,0xff,0x33,0x39,0x34,0xff,0x32,0x38,0x33,0xff,0x2b, 0x34,0x2c,0xff,0x68,0x4d,0x53,0xff,0xa0,0x7f,0x77,0xff,0x9b,0x77,0x6d,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6c,0xff,0x99,0x75,0x6b,0xff,0x39,0x2c,0x28,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x25,0x27,0x26,0xff,0x34,0x3a,0x34,0xff,0x30, 0x36,0x30,0xff,0x33,0x38,0x33,0xff,0x36,0x37,0x37,0xff,0x53,0x4b,0x51,0xff,0x8c, 0x74,0x6b,0xff,0x9c,0x77,0x6d,0xff,0x9a,0x76,0x6b,0xff,0x9b,0x77,0x6d,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x99,0x75,0x6b,0xff,0x8f, 0x6d,0x71,0xff,0xa9,0x8a,0x7e,0xff,0x99,0x74,0x69,0xff,0x9a,0x76,0x6b,0xff,0x99, 0x75,0x6b,0xff,0x99,0x75,0x6b,0xfe,0x99,0x75,0x6b,0xfb,0x98,0x75,0x6a,0xf5,0x6c, 0x53,0x4c,0xe8,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x7f,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0x7b,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0xaa,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x8d,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x01,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,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,0x03,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x91,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0xcf,0x15,0x15,0x14,0xe5,0x68,0x57,0x51,0xf3,0x9e, 0x7a,0x6e,0xfa,0x9f,0x7b,0x6f,0xfd,0x99,0x76,0x6c,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9a,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9a, 0x76,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x99,0x74,0x6c,0xff,0x95,0x71,0x6a,0xff,0x9a, 0x76,0x6d,0xff,0x9e,0x7a,0x6f,0xff,0x9d,0x78,0x6b,0xff,0x97,0x73,0x7d,0xff,0x43, 0x40,0x49,0xff,0x69,0x5a,0x4a,0xff,0x70,0x5e,0x55,0xfe,0x2a,0x33,0x2f,0xfc,0x35, 0x3c,0x37,0xf5,0x16,0x1a,0x17,0xe7,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xb2,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0xce,0x2e,0x29,0x27,0xe0,0x8b, 0x77,0x70,0xed,0xad,0x8c,0x82,0xf5,0xa0,0x7c,0x72,0xfb,0x96,0x72,0x69,0xfd,0x8d, 0x68,0x68,0xfe,0x94,0x70,0x6b,0xff,0x9a,0x76,0x6c,0xff,0x9b,0x78,0x6e,0xff,0x9a, 0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9a,0x77,0x6c,0xff,0x9e, 0x7a,0x6e,0xff,0x81,0x69,0x69,0xff,0x89,0x6a,0x6b,0xff,0x92,0x6f,0x6f,0xff,0x9a, 0x77,0x6f,0xff,0x9c,0x78,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x76,0x6c,0xff,0x9b, 0x78,0x6e,0xff,0xa2,0x7b,0x6f,0xff,0x5a,0x50,0x56,0xff,0x41,0x41,0x47,0xff,0x35, 0x36,0x39,0xff,0x07,0x07,0x08,0xff,0x02,0x03,0x05,0xff,0x23,0x26,0x29,0xff,0x2b, 0x2e,0x33,0xff,0x2d,0x30,0x35,0xff,0x2d,0x30,0x35,0xff,0x2d,0x30,0x35,0xff,0x2d, 0x30,0x35,0xff,0x2c,0x2f,0x34,0xff,0x2b,0x2e,0x33,0xff,0x2a,0x2d,0x32,0xff,0x29, 0x2c,0x31,0xff,0x29,0x2c,0x31,0xff,0x28,0x2c,0x30,0xff,0x27,0x2b,0x2f,0xff,0x35, 0x38,0x3d,0xff,0x38,0x3b,0x41,0xff,0x36,0x39,0x37,0xff,0x2b,0x34,0x2c,0xff,0x34, 0x39,0x34,0xff,0x31,0x37,0x31,0xff,0x34,0x39,0x36,0xff,0x77,0x59,0x56,0xff,0x9a, 0x77,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9a,0x76,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b, 0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b, 0x77,0x6d,0xff,0x9b,0x76,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x99,0x75,0x6c,0xff,0x40, 0x31,0x2d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x25, 0x27,0x26,0xff,0x34,0x3a,0x35,0xff,0x30,0x36,0x31,0xff,0x34,0x39,0x35,0xff,0x3c, 0x3d,0x3c,0xff,0x3c,0x3a,0x3a,0xff,0xa7,0x8a,0x80,0xff,0x9d,0x79,0x6f,0xff,0x9a, 0x76,0x6b,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9b, 0x76,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x9c,0x77,0x6c,0xff,0x9c,0x7a,0x72,0xff,0x9e, 0x78,0x6a,0xff,0x99,0x76,0x6b,0xff,0x98,0x74,0x6a,0xff,0x99,0x75,0x6b,0xff,0x98, 0x74,0x6a,0xfd,0x9c,0x77,0x6c,0xf9,0x8c,0x6b,0x62,0xef,0x17,0x12,0x10,0xdc,0x00, 0x00,0x00,0xbd,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x6b,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xa2,0x00, 0x00,0x00,0xa9,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0x8c,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x90,0x02,0x01,0x00,0xb0,0x05,0x03,0x03,0xc4,0x05,0x04,0x04,0xcf,0x04, 0x03,0x03,0xd3,0x04,0x03,0x03,0xd5,0x04,0x03,0x03,0xd5,0x04,0x03,0x03,0xd3,0x04, 0x03,0x03,0xd0,0x01,0x01,0x01,0xc7,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x9f,0x00, 0x00,0x00,0x7f,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,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,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,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xcf,0x28,0x25,0x24,0xe3,0x8b, 0x79,0x72,0xf1,0xad,0x8d,0x82,0xf9,0x9f,0x7c,0x72,0xfd,0x9a,0x77,0x6d,0xff,0x9b, 0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9c,0x78,0x6e,0xff,0x9c,0x78,0x6e,0xff,0x98, 0x73,0x6b,0xff,0x99,0x74,0x6c,0xff,0x9d,0x7a,0x6f,0xff,0x9b,0x78,0x6e,0xff,0xa0, 0x7b,0x6e,0xff,0x8e,0x70,0x77,0xff,0x34,0x37,0x3b,0xff,0x59,0x4a,0x3e,0xff,0x85, 0x66,0x6d,0xff,0x40,0x40,0x44,0xfd,0x31,0x39,0x31,0xf9,0x21,0x24,0x20,0xf0,0x05, 0x05,0x05,0xdf,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xc2,0x06,0x06,0x05,0xd5,0x4e, 0x43,0x3f,0xe5,0xa3,0x89,0x81,0xf1,0xae,0x8b,0x81,0xf8,0x9d,0x7a,0x70,0xfb,0x9b, 0x78,0x6e,0xfd,0x9a,0x76,0x6b,0xff,0x93,0x6c,0x67,0xff,0x99,0x75,0x6e,0xff,0x9d, 0x7a,0x6f,0xff,0x9b,0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9b,0x78,0x6e,0xff,0x9c, 0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0xa0,0x7c,0x70,0xff,0x7a,0x5f,0x67,0xff,0x94, 0x73,0x6a,0xff,0x8d,0x69,0x6e,0xff,0x94,0x70,0x6c,0xff,0x9c,0x78,0x6d,0xff,0x9c, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x77,0x6d,0xff,0x9d,0x77,0x6d,0xff,0x7d, 0x65,0x5f,0xff,0x79,0x64,0x5f,0xff,0x75,0x5f,0x5a,0xff,0x5f,0x4a,0x44,0xff,0x60, 0x4c,0x45,0xff,0x78,0x62,0x5d,0xff,0x7b,0x65,0x61,0xff,0x7a,0x64,0x5f,0xff,0x7a, 0x64,0x5f,0xff,0x7a,0x64,0x5f,0xff,0x7a,0x64,0x5f,0xff,0x7a,0x64,0x60,0xff,0x7a, 0x64,0x60,0xff,0x7a,0x65,0x60,0xff,0x7b,0x65,0x60,0xff,0x7b,0x65,0x60,0xff,0x7b, 0x65,0x60,0xff,0x7b,0x65,0x60,0xff,0x78,0x62,0x5d,0xff,0x7b,0x64,0x5e,0xff,0x40, 0x40,0x3d,0xff,0x29,0x32,0x2a,0xff,0x34,0x38,0x34,0xff,0x2e,0x35,0x2e,0xff,0x38, 0x3b,0x3a,0xff,0x8d,0x6f,0x65,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x77,0x6d,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x77,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x77,0x6d,0xff,0x99,0x76,0x6c,0xff,0x48,0x38,0x33,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x25,0x26,0x25,0xff,0x34,0x39,0x35,0xff,0x32, 0x38,0x33,0xff,0x37,0x3b,0x38,0xff,0x3f,0x3f,0x3f,0xff,0x38,0x34,0x36,0xff,0xab, 0x86,0x7b,0xff,0x9c,0x7a,0x6f,0xff,0x9b,0x77,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9b, 0x77,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9b,0x78,0x6e,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6c,0xff,0x92,0x6f,0x69,0xff,0x80,0x66,0x6c,0xff,0x9c,0x77,0x6a,0xff,0x99, 0x75,0x6a,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xfe,0x9b,0x77,0x6d,0xfb,0x98, 0x74,0x6b,0xf5,0x5b,0x46,0x40,0xe5,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0xa6,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xc1,0x17,0x13,0x12,0xcd,0x51,0x41,0x3c,0xd4,0x5f,0x4a,0x43,0xd7,0x59, 0x43,0x41,0xd7,0x57,0x3f,0x43,0xd8,0x69,0x54,0x4d,0xd8,0x6a,0x5b,0x55,0xd8,0x55, 0x3f,0x38,0xd8,0x5b,0x46,0x40,0xd8,0x5a,0x45,0x3f,0xd8,0x5b,0x46,0x3f,0xd8,0x5a, 0x45,0x3f,0xd8,0x5a,0x45,0x3f,0xd8,0x5a,0x45,0x3f,0xd8,0x5a,0x44,0x3f,0xd8,0x5b, 0x45,0x3e,0xd8,0x5f,0x48,0x3f,0xd8,0x60,0x47,0x48,0xd8,0x3e,0x32,0x3b,0xd8,0x32, 0x2b,0x2c,0xd8,0x59,0x40,0x40,0xd8,0x5b,0x45,0x3f,0xd8,0x5a,0x44,0x3f,0xd8,0x5a, 0x44,0x3f,0xd8,0x5a,0x44,0x3e,0xd8,0x5a,0x44,0x3e,0xd8,0x5a,0x45,0x3f,0xd8,0x5a, 0x45,0x3f,0xd8,0x5a,0x44,0x3f,0xd8,0x5c,0x46,0x3f,0xd7,0x53,0x3f,0x3a,0xd5,0x2c, 0x22,0x1e,0xd1,0x06,0x05,0x04,0xc9,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xa6,0x00, 0x00,0x00,0x8f,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0xa9,0x03,0x04,0x06,0xca,0x4b, 0x3a,0x35,0xde,0x71,0x56,0x4e,0xe8,0x69,0x50,0x49,0xec,0x69,0x4f,0x48,0xee,0x69, 0x50,0x49,0xee,0x69,0x4f,0x48,0xed,0x6c,0x52,0x4a,0xea,0x62,0x4a,0x44,0xe3,0x19, 0x13,0x11,0xd7,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x7d,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,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,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x85,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xbd,0x06,0x07,0x07,0xd4,0x49, 0x43,0x41,0xe6,0xa3,0x8b,0x84,0xf1,0xaf,0x8d,0x82,0xf9,0x9c,0x79,0x6e,0xfd,0x9b, 0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9c, 0x79,0x6f,0xff,0x9b,0x77,0x6d,0xff,0x9a,0x77,0x6c,0xff,0x9b,0x78,0x6d,0xff,0x9c, 0x78,0x6e,0xff,0x9d,0x7a,0x70,0xff,0xa0,0x78,0x70,0xff,0x6b,0x57,0x57,0xff,0x25, 0x30,0x2b,0xff,0x4d,0x46,0x47,0xff,0x8d,0x6a,0x7f,0xff,0x56,0x4d,0x52,0xfe,0x2c, 0x35,0x2d,0xfb,0x2b,0x30,0x2b,0xf7,0x0d,0x0e,0x0d,0xed,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0xd4,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0xd4,0x1d, 0x18,0x17,0xdf,0x76,0x65,0x5f,0xea,0xaf,0x92,0x87,0xf3,0xa9,0x86,0x7b,0xfa,0x9c, 0x78,0x6e,0xfc,0x9c,0x78,0x6e,0xfe,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x95, 0x70,0x69,0xff,0x98,0x74,0x6c,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c, 0x7a,0x70,0xff,0x9b,0x74,0x69,0xff,0x92,0x6e,0x73,0xff,0x7c,0x60,0x72,0xff,0x93, 0x72,0x6f,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9b,0x78,0x6e,0xff,0x9c, 0x78,0x6e,0xff,0x9a,0x77,0x6d,0xff,0xa2,0x7d,0x72,0xff,0xa3,0x7e,0x72,0xff,0xa4, 0x7e,0x73,0xff,0xa8,0x82,0x78,0xff,0xa9,0x83,0x78,0xff,0xa4,0x7e,0x73,0xff,0xa3, 0x7d,0x72,0xff,0xa4,0x7e,0x73,0xff,0xa3,0x7d,0x72,0xff,0xa3,0x7d,0x72,0xff,0xa3, 0x7d,0x72,0xff,0xa3,0x7d,0x72,0xff,0xa3,0x7d,0x72,0xff,0xa3,0x7d,0x72,0xff,0xa3, 0x7d,0x72,0xff,0xa2,0x7c,0x71,0xff,0xa3,0x7d,0x72,0xff,0xa3,0x7d,0x72,0xff,0xa4, 0x7e,0x72,0xff,0x9c,0x73,0x73,0xff,0x45,0x43,0x43,0xff,0x28,0x31,0x29,0xff,0x34, 0x39,0x34,0xff,0x2a,0x32,0x2a,0xff,0x42,0x40,0x46,0xff,0x9e,0x7f,0x76,0xff,0x9d, 0x79,0x6f,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x77,0x6d,0xff,0x9b, 0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6e,0xff,0x9a,0x78,0x6d,0xff,0x50, 0x3e,0x38,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x26, 0x29,0x27,0xff,0x35,0x3a,0x36,0xff,0x33,0x38,0x33,0xff,0x39,0x3c,0x39,0xff,0x3d, 0x3e,0x3e,0xff,0x3b,0x36,0x38,0xff,0x96,0x6f,0x6d,0xff,0xa2,0x81,0x75,0xff,0x9b, 0x78,0x6e,0xff,0x9c,0x79,0x6e,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b, 0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x78,0x6d,0xff,0x93,0x71,0x6a,0xff,0x78, 0x5f,0x75,0xff,0x90,0x6b,0x6a,0xff,0x9c,0x78,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9b, 0x77,0x6c,0xff,0x9b,0x77,0x6d,0xfd,0x9e,0x79,0x6f,0xf9,0x84,0x66,0x5e,0xed,0x0d, 0x0b,0x0a,0xd9,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x5c,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xab,0x00, 0x00,0x00,0xc2,0x0a,0x09,0x09,0xd4,0x4c,0x42,0x3f,0xe1,0x8e,0x72,0x6a,0xe9,0xa1, 0x7d,0x73,0xed,0xac,0x84,0x78,0xf0,0x93,0x74,0x6e,0xf0,0x50,0x49,0x4d,0xf0,0x7a, 0x69,0x5d,0xf0,0xcf,0xac,0xa1,0xf0,0xbd,0x9d,0x93,0xf0,0xa3,0x7b,0x6e,0xf0,0xa7, 0x80,0x74,0xf0,0xa7,0x80,0x74,0xf0,0xa7,0x80,0x74,0xf0,0xa7,0x80,0x75,0xf0,0xa7, 0x80,0x74,0xf0,0xa9,0x81,0x74,0xf0,0xa3,0x7d,0x7b,0xf0,0x80,0x68,0x6f,0xf0,0x5b, 0x53,0x52,0xf0,0x5c,0x52,0x5f,0xf0,0x85,0x69,0x71,0xf0,0xa8,0x7e,0x73,0xf0,0xa6, 0x7f,0x74,0xf0,0xa5,0x7e,0x73,0xf0,0xa5,0x7e,0x73,0xf0,0xa6,0x7f,0x74,0xf0,0xa5, 0x7e,0x73,0xf0,0xa5,0x7e,0x73,0xf0,0xa6,0x7f,0x74,0xf0,0xa5,0x7e,0x73,0xf0,0xa7, 0x80,0x75,0xf0,0xa2,0x7c,0x71,0xee,0x90,0x6e,0x65,0xec,0x64,0x4d,0x46,0xe6,0x1c, 0x15,0x14,0xdc,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0x88,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x96,0x00, 0x00,0x00,0xbd,0x14,0x14,0x16,0xdb,0x5d,0x4f,0x56,0xec,0x9e,0x7d,0x77,0xf5,0xa7, 0x80,0x73,0xf9,0xa1,0x7b,0x71,0xfa,0xa3,0x7c,0x71,0xfa,0xa3,0x7c,0x72,0xfa,0xa4, 0x7d,0x72,0xf8,0xa7,0x7f,0x74,0xf4,0x6c,0x53,0x4b,0xeb,0x13,0x0f,0x0d,0xda,0x00, 0x00,0x00,0xc0,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xc7,0x13, 0x13,0x12,0xda,0x69,0x5e,0x59,0xe9,0xab,0x8d,0x84,0xf3,0xab,0x87,0x7c,0xf9,0x9c, 0x78,0x6e,0xfd,0x9c,0x7a,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9d, 0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d, 0x7a,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x71,0xff,0x9b,0x78,0x6d,0xff,0x9a, 0x76,0x6c,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0xa1,0x7d,0x70,0xff,0x8e, 0x6f,0x73,0xff,0x4e,0x46,0x4d,0xff,0x2f,0x37,0x31,0xff,0x1c,0x28,0x23,0xff,0x5e, 0x4b,0x50,0xff,0x61,0x52,0x53,0xff,0x24,0x2c,0x26,0xfd,0x26,0x2a,0x25,0xfa,0x0f, 0x12,0x10,0xf6,0x00,0x00,0x00,0xef,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xe6,0x00, 0x00,0x00,0xe5,0x3a,0x32,0x2f,0xea,0x92,0x7b,0x73,0xf1,0xb1,0x90,0x86,0xf7,0xa5, 0x82,0x76,0xfb,0x9c,0x78,0x6e,0xfd,0x9d,0x7a,0x6f,0xff,0x9d,0x7b,0x70,0xff,0x9b, 0x77,0x6d,0xff,0x9d,0x79,0x6f,0xff,0x98,0x74,0x6a,0xff,0x99,0x74,0x6a,0xff,0x9e, 0x7c,0x71,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9f,0x7a,0x6d,0xff,0x88,0x6b,0x71,0xff,0x5d, 0x50,0x5d,0xff,0x72,0x5b,0x6e,0xff,0x98,0x76,0x73,0xff,0x9d,0x7a,0x6f,0xff,0x9d, 0x7a,0x70,0xff,0x9c,0x78,0x6e,0xff,0xa8,0x87,0x7d,0xff,0xb0,0x93,0x89,0xff,0xab, 0x8b,0x81,0xff,0xa4,0x83,0x78,0xff,0x9e,0x7b,0x71,0xff,0x9c,0x79,0x6f,0xff,0x9d, 0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9e,0x7b,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9d, 0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0xa0,0x7c,0x70,0xff,0x7f,0x64,0x75,0xff,0x42, 0x41,0x43,0xff,0x29,0x31,0x29,0xff,0x34,0x38,0x34,0xff,0x26,0x30,0x26,0xff,0x5a, 0x4c,0x5c,0xff,0xa4,0x84,0x7b,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9b, 0x78,0x6e,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x78,0x6e,0xff,0x9d,0x7a,0x6f,0xff,0x9e,0x7a,0x70,0xff,0x9e, 0x7a,0x70,0xff,0x8c,0x68,0x68,0xff,0x34,0x32,0x30,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x28,0x2a,0x28,0xff,0x35,0x3a,0x36,0xff,0x33, 0x38,0x33,0xff,0x39,0x3b,0x39,0xff,0x3e,0x3f,0x3f,0xff,0x44,0x40,0x44,0xff,0x73, 0x5a,0x69,0xff,0xa9,0x88,0x7b,0xff,0x9b,0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x77,0x6c,0xff,0x97, 0x72,0x6b,0xff,0x8b,0x69,0x71,0xff,0x98,0x75,0x70,0xff,0x96,0x74,0x6d,0xff,0x99, 0x74,0x69,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xfe,0x9c, 0x79,0x6f,0xfb,0x96,0x74,0x6a,0xf4,0x4e,0x3a,0x38,0xe4,0x00,0x00,0x00,0xcb,0x00, 0x00,0x00,0xa8,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0xa2,0x00, 0x00,0x00,0xba,0x00,0x00,0x00,0xce,0x22,0x1f,0x1c,0xdf,0x7e,0x6c,0x64,0xeb,0xa1, 0x81,0x77,0xf3,0xa6,0x81,0x76,0xf7,0x9b,0x76,0x6c,0xf9,0x9b,0x76,0x6b,0xfb,0x96, 0x74,0x69,0xfb,0x75,0x60,0x61,0xfa,0x4d,0x46,0x52,0xfa,0x75,0x69,0x63,0xfa,0xc4, 0xa8,0x9e,0xfa,0xa7,0x86,0x7c,0xfa,0xa0,0x7c,0x71,0xfa,0xa1,0x7e,0x73,0xfa,0xa0, 0x7d,0x72,0xfa,0x9f,0x7c,0x71,0xfa,0xa1,0x7d,0x70,0xfa,0x8a,0x6e,0x69,0xfa,0x63, 0x55,0x66,0xfa,0x72,0x5d,0x68,0xfa,0x82,0x68,0x5d,0xfa,0x8a,0x6e,0x67,0xfa,0x9a, 0x76,0x70,0xfa,0x9a,0x76,0x6a,0xfa,0x9a,0x76,0x6b,0xfa,0x99,0x75,0x6b,0xfa,0x99, 0x75,0x6b,0xfa,0x98,0x74,0x6a,0xfa,0x98,0x74,0x6a,0xfa,0x99,0x75,0x6b,0xfa,0x98, 0x74,0x6a,0xfa,0x99,0x75,0x6b,0xfa,0x99,0x75,0x6b,0xfa,0x9a,0x76,0x6c,0xfa,0xa0, 0x7a,0x6f,0xf8,0x9f,0x79,0x6f,0xf5,0x87,0x67,0x5f,0xf0,0x45,0x35,0x30,0xe7,0x09, 0x07,0x06,0xda,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x9a,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x71,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xcd,0x2a,0x27,0x29,0xe5,0x4e, 0x4a,0x53,0xf4,0x73,0x5e,0x6d,0xfb,0x9b,0x79,0x76,0xfe,0x9c,0x79,0x6d,0xfe,0x99, 0x75,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x98,0x74,0x6a,0xfd,0x9a,0x75,0x6b,0xfb,0xa1, 0x7b,0x70,0xf5,0x5e,0x48,0x41,0xea,0x0e,0x0a,0x09,0xd8,0x00,0x00,0x00,0xbc,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,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,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,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0xcf,0x2b,0x28,0x27,0xe2,0x8d,0x7c,0x76,0xed,0xab,0x8a,0x80,0xf5,0xa4, 0x80,0x75,0xfb,0x9c,0x79,0x6e,0xfd,0x9e,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x6f,0xff,0x9c, 0x79,0x6f,0xff,0x9e,0x7a,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9d, 0x79,0x6f,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9c,0x79,0x6f,0xff,0x9e, 0x7b,0x71,0xff,0xa4,0x7d,0x72,0xff,0x69,0x58,0x56,0xff,0x33,0x38,0x39,0xff,0x37, 0x3b,0x38,0xff,0x1e,0x2a,0x20,0xff,0x2b,0x32,0x29,0xff,0x35,0x36,0x32,0xff,0x21, 0x25,0x20,0xff,0x21,0x25,0x21,0xfd,0x16,0x1a,0x17,0xfb,0x04,0x05,0x05,0xf8,0x00, 0x00,0x00,0xf6,0x06,0x05,0x04,0xf5,0x5b,0x4e,0x49,0xf5,0xa7,0x8c,0x83,0xf8,0xac, 0x8b,0x80,0xfa,0x9f,0x7c,0x71,0xfc,0x9c,0x79,0x6f,0xfe,0xa1,0x7c,0x71,0xff,0x91, 0x71,0x66,0xff,0x86,0x68,0x6f,0xff,0x8d,0x69,0x6d,0xff,0x9b,0x76,0x6d,0xff,0x9e, 0x7b,0x71,0xff,0x9c,0x79,0x6f,0xff,0x98,0x74,0x6a,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x7f,0x74,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0xa2,0x7e,0x70,0xff,0x88, 0x6b,0x74,0xff,0x4e,0x49,0x51,0xff,0x61,0x54,0x62,0xff,0x7d,0x61,0x75,0xff,0xa2, 0x82,0x7e,0xff,0xa1,0x7e,0x72,0xff,0xa2,0x7d,0x6f,0xff,0x82,0x67,0x71,0xff,0x5f, 0x54,0x5a,0xff,0x5b,0x54,0x57,0xff,0x53,0x4e,0x51,0xff,0x80,0x62,0x67,0xff,0xa0, 0x7e,0x76,0xff,0x9f,0x7d,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9d, 0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0xa2, 0x7e,0x72,0xff,0x63,0x55,0x5f,0xff,0x3e,0x3f,0x3e,0xff,0x2a,0x33,0x2a,0xff,0x30, 0x36,0x2f,0xff,0x24,0x2f,0x25,0xff,0x7a,0x5e,0x6e,0xff,0xa3,0x84,0x7a,0xff,0x9d, 0x7b,0x71,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x6f,0xff,0x9b, 0x79,0x71,0xff,0x94,0x74,0x6b,0xff,0x61,0x53,0x5b,0xff,0x23,0x25,0x1e,0xff,0x3b, 0x37,0x3d,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x28, 0x2a,0x28,0xff,0x35,0x3a,0x36,0xff,0x33,0x38,0x33,0xff,0x39,0x3c,0x39,0xff,0x41, 0x41,0x41,0xff,0x47,0x44,0x49,0xff,0x49,0x3f,0x48,0xff,0xa9,0x88,0x81,0xff,0x80, 0x64,0x75,0xff,0x8c,0x69,0x71,0xff,0x8c,0x68,0x68,0xff,0x8d,0x69,0x6a,0xff,0x9c, 0x79,0x6f,0xff,0x97,0x72,0x68,0xff,0x98,0x73,0x6a,0xff,0x99,0x77,0x70,0xff,0x9d, 0x7a,0x6e,0xff,0x9c,0x79,0x6e,0xff,0x98,0x75,0x6f,0xff,0x8c,0x6a,0x71,0xff,0x9d, 0x79,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x78,0x6f,0xfc,0x9a,0x75,0x6d,0xf8,0x71, 0x54,0x54,0xed,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x88,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x9a,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0xc8,0x0c,0x0c,0x0b,0xd9,0x54,0x4a,0x46,0xe7,0xa1, 0x86,0x7e,0xf1,0xa8,0x86,0x7c,0xf7,0x9f,0x7b,0x71,0xfb,0x99,0x75,0x6b,0xfc,0x9c, 0x77,0x6d,0xfd,0x9d,0x79,0x6e,0xfe,0x9a,0x75,0x70,0xfe,0x79,0x5f,0x68,0xfe,0x2b, 0x30,0x32,0xfe,0x0a,0x18,0x0f,0xfe,0x64,0x5b,0x4f,0xfe,0x94,0x77,0x70,0xfe,0x4b, 0x47,0x49,0xfe,0x54,0x4d,0x4e,0xfe,0x53,0x4c,0x4d,0xfe,0x53,0x4d,0x4e,0xfe,0x56, 0x4f,0x51,0xfe,0x33,0x35,0x33,0xfe,0x39,0x35,0x3c,0xfe,0x74,0x5f,0x6c,0xfe,0x60, 0x52,0x58,0xfe,0x91,0x71,0x77,0xfe,0xa3,0x7f,0x70,0xfe,0x9c,0x78,0x6d,0xfe,0x9a, 0x75,0x6b,0xfe,0x9a,0x75,0x6b,0xfe,0x99,0x76,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x9a, 0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x99,0x75,0x6b,0xfe,0x9a, 0x76,0x6b,0xfe,0x9a,0x76,0x6b,0xfe,0x99,0x75,0x6b,0xfd,0x9a,0x76,0x6c,0xfc,0x9f, 0x7a,0x6f,0xfa,0x9a,0x76,0x6c,0xf5,0x76,0x59,0x52,0xee,0x2b,0x21,0x1e,0xe3,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xc2,0x03, 0x03,0x03,0xdb,0x3b,0x35,0x3b,0xee,0x57,0x4f,0x57,0xf8,0x51,0x49,0x57,0xfd,0x80, 0x65,0x65,0xff,0xa0,0x7b,0x6f,0xff,0x9b,0x78,0x6d,0xff,0x98,0x74,0x6a,0xff,0x98, 0x74,0x6a,0xfe,0x98,0x74,0x6a,0xfe,0x9c,0x77,0x6c,0xfb,0xa1,0x7b,0x6f,0xf4,0x51, 0x3d,0x37,0xe9,0x08,0x06,0x05,0xd5,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x96,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,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,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0xbe,0x04,0x04,0x04,0xd5,0x47,0x42,0x3f,0xe6,0xa5,0x8e,0x87,0xf2,0xaa, 0x88,0x7d,0xf8,0xa1,0x7e,0x73,0xfb,0x9d,0x7b,0x70,0xfe,0x9e,0x7c,0x71,0xfe,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9d,0x7a,0x71,0xff,0x9b,0x77,0x6e,0xff,0x9c, 0x79,0x6e,0xff,0x9f,0x7c,0x71,0xff,0xa3,0x80,0x71,0xff,0x8f,0x70,0x73,0xff,0x4f, 0x48,0x50,0xff,0x33,0x38,0x34,0xff,0x38,0x3b,0x38,0xff,0x2f,0x36,0x2f,0xff,0x23, 0x2b,0x24,0xff,0x1f,0x24,0x20,0xff,0x20,0x24,0x20,0xff,0x21,0x25,0x21,0xff,0x1b, 0x20,0x1d,0xfd,0x05,0x08,0x07,0xfc,0x20,0x1a,0x18,0xfc,0x7e,0x6a,0x63,0xfb,0xaf, 0x90,0x86,0xfb,0xa8,0x86,0x7b,0xfd,0x9f,0x7d,0x71,0xfe,0x9d,0x7b,0x70,0xfe,0xa4, 0x81,0x75,0xff,0x92,0x72,0x67,0xff,0x55,0x46,0x4b,0xff,0x6a,0x55,0x68,0xff,0x9b, 0x79,0x78,0xff,0xa0,0x7e,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9f,0x7c,0x71,0xff,0x9b, 0x76,0x6b,0xff,0x91,0x6b,0x67,0xff,0xa1,0x7f,0x79,0xff,0xa1,0x7e,0x73,0xff,0xa1, 0x7d,0x71,0xff,0xa9,0x82,0x73,0xff,0x67,0x59,0x5f,0xff,0x67,0x57,0x6a,0xff,0x8d, 0x6a,0x6c,0xff,0x8c,0x66,0x69,0xff,0x8f,0x6a,0x6b,0xff,0xa1,0x80,0x76,0xff,0xa8, 0x81,0x79,0xff,0x4a,0x46,0x42,0xff,0x3c,0x3d,0x3f,0xff,0x43,0x41,0x46,0xff,0x3c, 0x37,0x42,0xff,0x92,0x76,0x70,0xff,0xa6,0x85,0x7a,0xff,0x9f,0x7c,0x71,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0xa3,0x7d,0x72,0xff,0x44,0x42,0x40,0xff,0x3c, 0x3e,0x3e,0xff,0x2a,0x33,0x2a,0xff,0x2f,0x36,0x2f,0xff,0x26,0x30,0x28,0xff,0x84, 0x62,0x64,0xff,0xa6,0x86,0x7c,0xff,0x9e,0x7b,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7b,0x70,0xff,0x99,0x77,0x71,0xff,0x85,0x68,0x77,0xff,0x2d,0x32,0x26,0xff,0x26, 0x2c,0x28,0xff,0x7c,0x63,0x5a,0xff,0x63,0x4e,0x49,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x28,0x2a,0x28,0xff,0x35,0x3a,0x36,0xff,0x33, 0x38,0x33,0xff,0x39,0x3c,0x39,0xff,0x44,0x43,0x45,0xff,0x48,0x44,0x49,0xff,0x3a, 0x34,0x39,0xff,0x8f,0x6f,0x7c,0xff,0x77,0x61,0x6f,0xff,0x9d,0x79,0x6f,0xff,0x99, 0x75,0x6d,0xff,0x8b,0x66,0x6a,0xff,0x8d,0x6b,0x72,0xff,0x9d,0x7a,0x6f,0xff,0x9c, 0x79,0x6f,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9c, 0x79,0x6f,0xff,0x99,0x76,0x6e,0xff,0x96,0x72,0x6a,0xff,0x9b,0x78,0x70,0xff,0x7c, 0x5f,0x62,0xfe,0x53,0x4d,0x54,0xfa,0x4e,0x41,0x4d,0xf4,0x00,0x00,0x00,0xe7,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0xc1,0x02,0x02,0x02,0xd3,0x2e,0x28,0x25,0xe2,0x87, 0x74,0x6d,0xed,0xae,0x8f,0x84,0xf5,0xa4,0x81,0x76,0xf9,0x9c,0x78,0x6f,0xfc,0x9a, 0x78,0x6d,0xfd,0x9d,0x79,0x6e,0xfe,0xa0,0x7a,0x6f,0xff,0x8d,0x6e,0x6f,0xff,0x58, 0x4d,0x58,0xff,0x2d,0x34,0x2d,0xff,0x30,0x36,0x31,0xff,0x17,0x24,0x1b,0xff,0x50, 0x4a,0x3f,0xff,0x94,0x77,0x6f,0xff,0x39,0x3b,0x40,0xff,0x43,0x41,0x45,0xff,0x43, 0x42,0x45,0xff,0x45,0x42,0x46,0xff,0x3f,0x3f,0x42,0xff,0x47,0x43,0x49,0xff,0x7f, 0x66,0x6a,0xff,0x78,0x63,0x5f,0xff,0x3b,0x3d,0x42,0xff,0x55,0x4c,0x57,0xff,0x83, 0x6a,0x6f,0xff,0xa2,0x7f,0x73,0xff,0xa1,0x7d,0x71,0xff,0x9c,0x7a,0x6f,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x99,0x75,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6b,0xff,0x99,0x75,0x6b,0xff,0x99,0x75,0x6b,0xfd,0x9c,0x77,0x6d,0xfb,0x9e, 0x79,0x6e,0xf8,0x96,0x73,0x68,0xf3,0x5c,0x46,0x3f,0xeb,0x16,0x11,0x0f,0xdf,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0xc7,0x00,0x00,0x00,0xd7,0x16,0x14,0x16,0xe7,0x46,0x3f,0x46,0xf4,0x56, 0x4d,0x57,0xfb,0x53,0x4b,0x54,0xfd,0x5a,0x4f,0x5c,0xff,0x8f,0x73,0x75,0xff,0xa6, 0x82,0x77,0xff,0x9e,0x79,0x6e,0xff,0x9d,0x77,0x6c,0xff,0x9d,0x77,0x6c,0xff,0x9c, 0x76,0x6d,0xfd,0x9b,0x77,0x70,0xfa,0x97,0x75,0x6d,0xf4,0x3c,0x30,0x2b,0xe8,0x01, 0x01,0x01,0xd4,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0xa8,0x00,0x00,0x00,0xc3,0x12,0x12,0x12,0xd9,0x66,0x5b,0x57,0xe8,0xb2, 0x96,0x8c,0xf3,0xa6,0x83,0x78,0xf9,0x9f,0x7d,0x72,0xfc,0x9f,0x7d,0x72,0xfe,0x9e, 0x7c,0x71,0xfe,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9d,0x7b,0x70,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9f, 0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa2,0x80,0x72,0xff,0x8f, 0x70,0x73,0xff,0x8a,0x6a,0x6e,0xff,0xa0,0x7c,0x6f,0xff,0xa1,0x7f,0x73,0xff,0xa4, 0x7e,0x77,0xff,0x6c,0x5b,0x5a,0xff,0x34,0x39,0x39,0xff,0x37,0x3b,0x38,0xff,0x36, 0x3b,0x37,0xff,0x30,0x34,0x31,0xff,0x1a,0x20,0x1b,0xff,0x19,0x1e,0x19,0xff,0x22, 0x25,0x22,0xff,0x1c,0x21,0x1e,0xff,0x20,0x24,0x20,0xfe,0x4c,0x42,0x3d,0xfe,0x97, 0x7c,0x74,0xfe,0xaf,0x8f,0x84,0xfe,0xa4,0x82,0x77,0xfe,0x9f,0x7c,0x71,0xfe,0xa0, 0x7f,0x73,0xff,0xa6,0x81,0x76,0xff,0xa0,0x7c,0x72,0xff,0x4c,0x41,0x40,0xff,0x36, 0x34,0x39,0xff,0x8a,0x72,0x6d,0xff,0xa7,0x84,0x79,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0x97,0x72,0x6b,0xff,0x8d, 0x67,0x68,0xff,0x89,0x65,0x6a,0xff,0x8e,0x6f,0x6c,0xff,0x92,0x71,0x69,0xff,0x7a, 0x62,0x6d,0xff,0x84,0x63,0x6b,0xff,0x93,0x6c,0x67,0xff,0x9d,0x76,0x6a,0xff,0x67, 0x53,0x5e,0xff,0xba,0xa7,0xa2,0xff,0x8e,0x77,0x84,0xff,0x37,0x39,0x37,0xff,0x3b, 0x3f,0x3b,0xff,0x2b,0x2c,0x2e,0xff,0x75,0x59,0x62,0xff,0xa7,0x86,0x7e,0xff,0xa1, 0x7f,0x74,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7c,0x70,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9f, 0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9f,0x7d,0x71,0xff,0x95, 0x6e,0x70,0xff,0x3e,0x3e,0x3c,0xff,0x41,0x41,0x42,0xff,0x2b,0x33,0x2b,0xff,0x2c, 0x34,0x2d,0xff,0x28,0x32,0x2a,0xff,0x93,0x73,0x69,0xff,0xa5,0x85,0x7b,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9d,0x7b,0x70,0xff,0x8e,0x6c,0x75,0xff,0x9c, 0x79,0x70,0xff,0x98,0x79,0x6e,0xff,0x81,0x67,0x73,0xff,0x4b,0x47,0x41,0xff,0x6f, 0x57,0x4f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x2c, 0x2d,0x2c,0xff,0x36,0x3b,0x37,0xff,0x34,0x38,0x34,0xff,0x3c,0x3e,0x3c,0xff,0x44, 0x43,0x45,0xff,0x49,0x45,0x4a,0xff,0x46,0x40,0x43,0xff,0xa4,0x83,0x78,0xff,0xa0, 0x7e,0x74,0xff,0x9e,0x7c,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7a,0x70,0xff,0x8c,0x6d,0x66,0xff,0x3d,0x3e,0x43,0xfe,0x3c,0x3e,0x3f,0xfc,0x55, 0x43,0x51,0xf8,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xd8,0x00, 0x00,0x00,0xcf,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xd3,0x15,0x13,0x11,0xde,0x5c, 0x4e,0x48,0xe9,0xa3,0x87,0x7d,0xf2,0xa4,0x82,0x76,0xf8,0x9f,0x7c,0x71,0xfc,0x9a, 0x77,0x6d,0xfd,0x9b,0x78,0x6e,0xfe,0x9e,0x7a,0x6f,0xff,0x9e,0x79,0x6f,0xff,0x7a, 0x63,0x5f,0xff,0x3c,0x3d,0x41,0xff,0x22,0x2e,0x23,0xff,0x2c,0x34,0x2d,0xff,0x3f, 0x3f,0x3f,0xff,0x2e,0x32,0x31,0xff,0x3f,0x3b,0x33,0xff,0x88,0x6f,0x6b,0xff,0x40, 0x3f,0x43,0xff,0x48,0x45,0x48,0xff,0x44,0x43,0x45,0xff,0x4b,0x46,0x4a,0xff,0x2e, 0x34,0x32,0xff,0x54,0x4b,0x3e,0xff,0x8e,0x71,0x6d,0xff,0x40,0x40,0x45,0xff,0x47, 0x44,0x47,0xff,0x4a,0x46,0x4c,0xff,0x4f,0x49,0x54,0xff,0x6d,0x5a,0x5d,0xff,0x9e, 0x7b,0x72,0xff,0xa9,0x87,0x7d,0xff,0x9f,0x7c,0x70,0xff,0x99,0x75,0x6b,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6b,0xff,0x9a, 0x76,0x6b,0xff,0x9a,0x76,0x6b,0xfd,0x9a,0x76,0x6b,0xfd,0x9c,0x77,0x6d,0xfb,0xa0, 0x7a,0x6f,0xf7,0x87,0x67,0x5e,0xf1,0x3e,0x2f,0x2b,0xe9,0x07,0x05,0x04,0xe1,0x00, 0x00,0x00,0xdb,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0xe9,0x1c, 0x19,0x1c,0xf2,0x36,0x32,0x36,0xf8,0x39,0x34,0x3a,0xfc,0x50,0x46,0x4f,0xfe,0x51, 0x4a,0x54,0xff,0x5c,0x4f,0x5d,0xff,0x88,0x70,0x71,0xff,0x8e,0x72,0x69,0xff,0x83, 0x67,0x5f,0xff,0x83,0x66,0x5e,0xff,0x7c,0x5e,0x63,0xff,0x65,0x52,0x61,0xfd,0x4d, 0x47,0x4f,0xfa,0x47,0x45,0x4a,0xf3,0x28,0x23,0x24,0xe5,0x06,0x04,0x03,0xcf,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x01,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,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x97,0x00,0x00,0x00,0xb3,0x02,0x02,0x03,0xca,0x2c,0x2a,0x29,0xdd,0x85, 0x75,0x6f,0xec,0xb2,0x93,0x88,0xf4,0xa2,0x7f,0x74,0xfa,0xa1,0x7f,0x74,0xfd,0xa1, 0x7f,0x74,0xfe,0xa0,0x7e,0x73,0xfe,0xa1,0x7f,0x73,0xff,0x9f,0x7c,0x71,0xff,0x9a, 0x76,0x6e,0xff,0x9e,0x7a,0x70,0xff,0xa1,0x7f,0x74,0xff,0xa0,0x7e,0x73,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa0,0x7e,0x73,0xff,0x9f, 0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9f,0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa0, 0x7e,0x73,0xff,0xa8,0x84,0x76,0xff,0x7a,0x65,0x67,0xff,0x74,0x61,0x64,0xff,0xa6, 0x81,0x74,0xff,0xa3,0x7f,0x71,0xff,0x8d,0x6f,0x74,0xff,0x51,0x4a,0x54,0xff,0x36, 0x3b,0x36,0xff,0x39,0x3d,0x3a,0xff,0x2f,0x33,0x31,0xff,0x22,0x25,0x22,0xff,0x1c, 0x21,0x1d,0xff,0x1d,0x22,0x1d,0xff,0x1e,0x22,0x21,0xff,0x2e,0x2e,0x2d,0xff,0x6b, 0x56,0x4f,0xff,0xa6,0x85,0x7a,0xff,0xaa,0x8a,0x7f,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7e,0x73,0xff,0xa1,0x80,0x73,0xff,0xa7,0x80,0x77,0xff,0x95,0x73,0x6b,0xff,0x47, 0x42,0x3d,0xff,0x1f,0x23,0x24,0xff,0x7c,0x65,0x5d,0xff,0xaa,0x86,0x79,0xff,0x9f, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0x9c, 0x78,0x6e,0xff,0x97,0x73,0x68,0xff,0x93,0x6c,0x67,0xff,0x85,0x66,0x72,0xff,0x6d, 0x59,0x64,0xff,0x69,0x57,0x64,0xff,0x85,0x65,0x68,0xff,0x8e,0x68,0x67,0xff,0x93, 0x6e,0x66,0xff,0xaa,0x83,0x77,0xff,0x3d,0x3d,0x38,0xff,0xab,0x96,0x8d,0xff,0x59, 0x55,0x50,0xff,0x29,0x31,0x2b,0xff,0x31,0x36,0x32,0xff,0x2f,0x2d,0x36,0xff,0x95, 0x78,0x72,0xff,0xa7,0x85,0x7a,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9f, 0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9e, 0x7c,0x71,0xff,0xa2,0x80,0x72,0xff,0x89,0x6a,0x7c,0xff,0x3f,0x3f,0x3e,0xff,0x41, 0x41,0x42,0xff,0x2b,0x33,0x2b,0xff,0x2d,0x34,0x2d,0xff,0x2c,0x34,0x2e,0xff,0xa0, 0x82,0x79,0xff,0xa3,0x82,0x77,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9f, 0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7d,0x72,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0x94, 0x6f,0x68,0xff,0x97,0x77,0x74,0xff,0x9d,0x7b,0x6f,0xff,0x9f,0x7d,0x72,0xff,0xa0, 0x7e,0x72,0xff,0x9e,0x7c,0x71,0xff,0x72,0x5a,0x52,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x2e,0x2f,0x2e,0xff,0x38,0x3c,0x38,0xff,0x36, 0x3a,0x37,0xff,0x3c,0x3e,0x3c,0xff,0x44,0x43,0x45,0xff,0x4c,0x47,0x4d,0xff,0x4c, 0x45,0x4b,0xff,0x82,0x62,0x5c,0xff,0xa9,0x88,0x7d,0xff,0x9d,0x7b,0x70,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x78,0x70,0xff,0x81,0x62,0x5f,0xff,0x38, 0x3c,0x3c,0xff,0x6e,0x58,0x60,0xfe,0x7d,0x5a,0x60,0xfc,0x2e,0x22,0x27,0xf8,0x00, 0x00,0x00,0xf2,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xe7,0x05,0x04,0x04,0xe6,0x35, 0x2d,0x29,0xea,0x83,0x6f,0x6a,0xf0,0xa4,0x88,0x85,0xf5,0x9c,0x77,0x6f,0xf9,0x9d, 0x7a,0x70,0xfd,0x9d,0x7a,0x70,0xfd,0x9e,0x7a,0x70,0xfe,0xa1,0x7b,0x71,0xff,0x98, 0x72,0x6f,0xff,0x62,0x52,0x4e,0xff,0x27,0x31,0x2d,0xff,0x23,0x2e,0x24,0xff,0x29, 0x31,0x29,0xff,0x30,0x36,0x31,0xff,0x41,0x41,0x41,0xff,0x49,0x46,0x4a,0xff,0x4d, 0x48,0x4f,0xff,0x4e,0x48,0x50,0xff,0x43,0x42,0x44,0xff,0x55,0x4b,0x52,0xff,0x56, 0x4c,0x51,0xff,0x39,0x3c,0x3a,0xff,0x28,0x32,0x2a,0xff,0x57,0x4d,0x47,0xff,0x73, 0x5c,0x5b,0xff,0x40,0x40,0x44,0xff,0x49,0x45,0x49,0xff,0x4f,0x48,0x4f,0xff,0x4f, 0x49,0x50,0xff,0x4b,0x47,0x4e,0xff,0x5f,0x4f,0x55,0xff,0x8f,0x6e,0x71,0xff,0xa6, 0x84,0x7e,0xff,0xa0,0x7c,0x70,0xff,0x9b,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6b,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x76,0x6c,0xff,0x9a,0x76,0x6c,0xfe,0x9a,0x76,0x6c,0xfc,0x9d,0x79,0x6d,0xfa,0x9d, 0x79,0x6e,0xf6,0x6b,0x52,0x4b,0xf2,0x25,0x1c,0x1a,0xef,0x03,0x03,0x03,0xee,0x00, 0x00,0x00,0xf0,0x0c,0x09,0x0b,0xf4,0x2d,0x27,0x2c,0xf9,0x2c,0x2c,0x2c,0xfb,0x2d, 0x2b,0x2d,0xfd,0x44,0x3b,0x44,0xff,0x3d,0x3d,0x3e,0xff,0x39,0x3c,0x38,0xff,0x53, 0x49,0x4d,0xff,0x60,0x54,0x54,0xff,0x59,0x50,0x4e,0xff,0x55,0x4c,0x4c,0xff,0x5b, 0x53,0x52,0xff,0x5e,0x58,0x57,0xfe,0x5a,0x57,0x54,0xfd,0x79,0x66,0x72,0xf9,0x9a, 0x7c,0x7a,0xf1,0x32,0x27,0x23,0xe2,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0xab,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,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,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x63,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0xbc,0x08,0x08,0x08,0xd3,0x4b, 0x46,0x44,0xe4,0xa0,0x8c,0x84,0xef,0xb3,0x92,0x87,0xf7,0x9f,0x7d,0x72,0xfc,0xa1, 0x7f,0x74,0xfe,0xa1,0x7f,0x74,0xfe,0xa2,0x80,0x75,0xff,0xa5,0x82,0x75,0xff,0xa0, 0x7e,0x75,0xff,0x93,0x70,0x6f,0xff,0x97,0x72,0x6b,0xff,0xa3,0x82,0x76,0xff,0xa2, 0x80,0x75,0xff,0xa0,0x7f,0x74,0xff,0xa0,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7f,0x74,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa2,0x81,0x75,0xff,0xa6,0x81,0x76,0xff,0x6b, 0x5a,0x58,0xff,0x71,0x61,0x5e,0xff,0xb9,0x93,0x86,0xff,0xb3,0x8d,0x82,0xff,0x6c, 0x5d,0x58,0xff,0x31,0x37,0x37,0xff,0x3d,0x3e,0x3c,0xff,0x34,0x37,0x34,0xff,0x27, 0x2a,0x27,0xff,0x18,0x1e,0x19,0xff,0x11,0x1a,0x13,0xff,0x1f,0x22,0x24,0xff,0x48, 0x40,0x45,0xff,0x8a,0x70,0x6b,0xff,0xab,0x89,0x7d,0xff,0xa5,0x84,0x79,0xff,0xa1, 0x7f,0x74,0xff,0xa0,0x7e,0x73,0xff,0xa4,0x82,0x74,0xff,0xa9,0x84,0x7e,0xff,0x86, 0x67,0x68,0xff,0x3c,0x3b,0x37,0xff,0x0a,0x18,0x13,0xff,0x69,0x55,0x5b,0xff,0xad, 0x8a,0x86,0xff,0xa6,0x84,0x78,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa3, 0x81,0x74,0xff,0xa6,0x83,0x75,0xff,0xa1,0x7c,0x6d,0xff,0x92,0x6b,0x68,0xff,0x8f, 0x6a,0x68,0xff,0x90,0x6a,0x67,0xff,0x93,0x6c,0x68,0xff,0x8f,0x67,0x69,0xff,0x8d, 0x67,0x67,0xff,0x95,0x70,0x68,0xff,0x9b,0x77,0x6d,0xff,0xa8,0x84,0x78,0xff,0x5f, 0x52,0x4e,0xff,0x79,0x61,0x5c,0xff,0x4b,0x47,0x45,0xff,0x31,0x38,0x33,0xff,0x1a, 0x21,0x1b,0xff,0x5a,0x47,0x4f,0xff,0xa6,0x88,0x82,0xff,0xa5,0x85,0x79,0xff,0xa0, 0x7d,0x72,0xff,0xa1,0x7f,0x74,0xff,0xa0,0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa0,0x7d,0x72,0xff,0xa2,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa3, 0x82,0x75,0xff,0xa3,0x82,0x76,0xff,0xa1,0x7f,0x74,0xff,0xa0,0x7e,0x73,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa0,0x7f,0x74,0xff,0xa4,0x82,0x75,0xff,0x6c, 0x5b,0x69,0xff,0x3b,0x3d,0x3c,0xff,0x40,0x40,0x40,0xff,0x2f,0x36,0x2f,0xff,0x2c, 0x34,0x2d,0xff,0x44,0x41,0x47,0xff,0xa8,0x8c,0x85,0xff,0xa2,0x81,0x76,0xff,0xa0, 0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x93,0x6e,0x6a,0xff,0x5c,0x50,0x5e,0xff,0xa4, 0x83,0x79,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9e,0x7c,0x71,0xff,0x7a, 0x5f,0x57,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x2d, 0x2f,0x2e,0xff,0x38,0x3c,0x38,0xff,0x36,0x3a,0x37,0xff,0x3c,0x3e,0x3c,0xff,0x45, 0x43,0x46,0xff,0x4e,0x49,0x4f,0xff,0x51,0x49,0x50,0xff,0x61,0x4a,0x50,0xff,0xb5, 0x95,0x8a,0xff,0x9f,0x7b,0x70,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9e, 0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9d, 0x78,0x6f,0xff,0x85,0x63,0x65,0xff,0x63,0x54,0x5e,0xff,0x92,0x68,0x6a,0xff,0x8a, 0x65,0x6c,0xfe,0x68,0x4d,0x56,0xfd,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xf6,0x17, 0x12,0x10,0xf6,0x5c,0x4b,0x46,0xf5,0xab,0x8d,0x82,0xf6,0x9f,0x80,0x7c,0xf9,0x72, 0x57,0x66,0xfc,0x97,0x70,0x6b,0xfd,0x9e,0x7c,0x71,0xfe,0x9f,0x7b,0x70,0xfe,0xa3, 0x7e,0x75,0xff,0x8d,0x6e,0x72,0xff,0x4f,0x44,0x45,0xff,0x1c,0x29,0x21,0xff,0x24, 0x2e,0x25,0xff,0x29,0x32,0x2a,0xff,0x2c,0x33,0x2c,0xff,0x32,0x37,0x32,0xff,0x41, 0x41,0x42,0xff,0x4b,0x46,0x4c,0xff,0x49,0x45,0x4a,0xff,0x48,0x45,0x49,0xff,0x40, 0x41,0x43,0xff,0x56,0x4d,0x50,0xff,0x63,0x52,0x56,0xff,0x2d,0x34,0x2f,0xff,0x42, 0x41,0x42,0xff,0x47,0x45,0x48,0xff,0x44,0x42,0x45,0xff,0x47,0x44,0x46,0xff,0x4b, 0x46,0x4b,0xff,0x51,0x4a,0x52,0xff,0x50,0x49,0x50,0xff,0x51,0x49,0x50,0xff,0x4e, 0x49,0x50,0xff,0x59,0x4e,0x5c,0xff,0x80,0x68,0x75,0xff,0xa1,0x80,0x78,0xff,0xa2, 0x7c,0x70,0xff,0x9a,0x76,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x9b, 0x77,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9a, 0x77,0x6d,0xff,0x9a,0x77,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xfe,0x9a, 0x76,0x6c,0xfe,0x9a,0x76,0x6c,0xfe,0x9b,0x76,0x6c,0xfc,0xa3,0x7d,0x72,0xfa,0x90, 0x6f,0x65,0xf9,0x51,0x3e,0x39,0xf8,0x0c,0x09,0x07,0xfa,0x22,0x1b,0x20,0xfa,0x41, 0x36,0x3f,0xfc,0x33,0x30,0x34,0xfe,0x39,0x33,0x39,0xff,0x3e,0x35,0x3e,0xff,0x41, 0x3c,0x42,0xff,0x6c,0x5a,0x68,0xff,0x7e,0x60,0x6c,0xff,0x8d,0x6d,0x70,0xff,0xa2, 0x7f,0x76,0xff,0xa0,0x7a,0x6e,0xff,0xa9,0x85,0x7b,0xff,0xb0,0x90,0x85,0xfe,0xb2, 0x92,0x88,0xfd,0xad,0x8c,0x81,0xfc,0xa8,0x83,0x78,0xf8,0x80,0x62,0x59,0xef,0x1e, 0x17,0x15,0xdf,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x82,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0xc7,0x12, 0x11,0x10,0xdb,0x6f,0x66,0x61,0xea,0xb6,0x9b,0x92,0xf3,0xac,0x88,0x7d,0xf9,0xa0, 0x7e,0x73,0xfc,0xa2,0x81,0x76,0xfe,0xa1,0x80,0x75,0xff,0xa3,0x82,0x77,0xff,0x9d, 0x7c,0x70,0xff,0x8e,0x70,0x69,0xff,0x88,0x69,0x74,0xff,0x8a,0x68,0x70,0xff,0xa3, 0x81,0x73,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa5, 0x84,0x78,0xff,0xa5,0x7c,0x79,0xff,0x50,0x43,0x43,0xff,0x38,0x3d,0x36,0xff,0x78, 0x6b,0x66,0xff,0x9c,0x80,0x76,0xff,0x8c,0x6e,0x6b,0xff,0x48,0x44,0x46,0xff,0x34, 0x38,0x35,0xff,0x27,0x2a,0x28,0xff,0x23,0x25,0x23,0xff,0x16,0x1f,0x1b,0xff,0x2c, 0x2a,0x2a,0xff,0x6b,0x57,0x5e,0xff,0xa3,0x85,0x80,0xff,0xaf,0x8d,0x80,0xff,0xa3, 0x82,0x77,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0xa8,0x85,0x77,0xff,0xa4, 0x81,0x7e,0xff,0x75,0x5f,0x69,0xff,0x32,0x37,0x34,0xff,0x0d,0x1d,0x13,0xff,0x42, 0x3b,0x3a,0xff,0x99,0x7d,0x75,0xff,0xa3,0x81,0x78,0xff,0x9a,0x77,0x6f,0xff,0x9f, 0x7c,0x71,0xff,0xa5,0x83,0x77,0xff,0x98,0x79,0x77,0xff,0x8b,0x70,0x74,0xff,0x82, 0x68,0x6d,0xff,0x89,0x66,0x68,0xff,0x94,0x6e,0x68,0xff,0x94,0x6f,0x68,0xff,0x91, 0x6b,0x68,0xff,0x90,0x6a,0x67,0xff,0x9a,0x75,0x6c,0xff,0x9e,0x7a,0x70,0xff,0xa1, 0x80,0x75,0xff,0xa3,0x83,0x76,0xff,0xa3,0x76,0x79,0xff,0x41,0x3f,0x3f,0xff,0x6a, 0x57,0x63,0xff,0x43,0x40,0x40,0xff,0x12,0x1c,0x19,0xff,0x8a,0x72,0x69,0xff,0xab, 0x8a,0x80,0xff,0xa2,0x80,0x75,0xff,0xa2,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa2, 0x81,0x76,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa2,0x81,0x76,0xff,0x9f, 0x7d,0x71,0xff,0xa0,0x7d,0x71,0xff,0x94,0x72,0x6f,0xff,0x97,0x73,0x6e,0xff,0xa0, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x80,0x75,0xff,0xa8,0x85,0x78,0xff,0x4c,0x48,0x48,0xff,0x36,0x3a,0x37,0xff,0x3f, 0x40,0x40,0xff,0x33,0x38,0x34,0xff,0x26,0x30,0x27,0xff,0x6c,0x59,0x6b,0xff,0xab, 0x8d,0x86,0xff,0xa3,0x82,0x77,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa0, 0x7e,0x73,0xff,0x33,0x39,0x37,0xff,0xb6,0x9c,0x93,0xff,0xa0,0x7d,0x72,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7f,0x74,0xff,0x83,0x68,0x5e,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x2b,0x2f,0x2c,0xff,0x39,0x3c,0x39,0xff,0x36, 0x3a,0x37,0xff,0x3c,0x3e,0x3c,0xff,0x46,0x44,0x47,0xff,0x4f,0x49,0x50,0xff,0x51, 0x49,0x52,0xff,0x4b,0x41,0x4a,0xff,0xbf,0xa3,0x98,0xff,0xa0,0x7d,0x72,0xff,0x9f, 0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0xa0, 0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9d,0x7a,0x70,0xff,0x8c,0x68,0x6b,0xff,0x84, 0x66,0x7b,0xff,0x8b,0x65,0x66,0xff,0x89,0x65,0x6b,0xfe,0x7c,0x5b,0x62,0xff,0x47, 0x35,0x31,0xfe,0x49,0x3a,0x34,0xfd,0x82,0x67,0x5e,0xfc,0xb0,0x8c,0x81,0xfc,0xa1, 0x7e,0x71,0xfd,0x9a,0x77,0x6d,0xfd,0x9a,0x75,0x6c,0xfe,0xa0,0x7e,0x71,0xff,0x9f, 0x7c,0x70,0xff,0x99,0x77,0x6d,0xff,0x70,0x5d,0x61,0xff,0x3a,0x3b,0x3f,0xff,0x18, 0x28,0x1b,0xff,0x23,0x2e,0x24,0xff,0x26,0x31,0x26,0xff,0x2b,0x33,0x2b,0xff,0x2f, 0x35,0x2f,0xff,0x33,0x38,0x34,0xff,0x42,0x41,0x43,0xff,0x4c,0x47,0x4d,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x47,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x36, 0x3a,0x38,0xff,0x40,0x40,0x40,0xff,0x61,0x54,0x61,0xff,0x44,0x43,0x46,0xff,0x47, 0x44,0x48,0xff,0x47,0x44,0x48,0xff,0x4c,0x47,0x4d,0xff,0x52,0x4b,0x52,0xff,0x51, 0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x52,0x4b,0x52,0xff,0x51,0x4a,0x51,0xff,0x51, 0x49,0x55,0xff,0x6b,0x5a,0x64,0xff,0x93,0x73,0x6d,0xff,0xa2,0x7d,0x70,0xff,0x9c, 0x79,0x6e,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b, 0x78,0x6e,0xff,0x9a,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9a,0x77,0x6d,0xff,0x9b, 0x76,0x6c,0xff,0x9b,0x76,0x6c,0xff,0x9a,0x76,0x6c,0xff,0x9b,0x77,0x6d,0xff,0x9b, 0x77,0x6d,0xfe,0x9a,0x76,0x6c,0xfe,0x9e,0x79,0x6e,0xfd,0xa5,0x7e,0x74,0xfd,0x7c, 0x5f,0x55,0xfd,0x55,0x43,0x46,0xfd,0x3a,0x32,0x3d,0xff,0x33,0x2f,0x37,0xff,0x42, 0x38,0x41,0xff,0x45,0x39,0x45,0xff,0x40,0x36,0x40,0xff,0x4c,0x44,0x4e,0xff,0x56, 0x4e,0x5a,0xff,0x59,0x4f,0x61,0xff,0x87,0x6a,0x70,0xff,0xa1,0x7d,0x74,0xff,0x9a, 0x77,0x6c,0xff,0x98,0x74,0x6a,0xff,0x98,0x73,0x69,0xff,0x99,0x74,0x6a,0xff,0x99, 0x75,0x6b,0xfc,0xa6,0x7e,0x74,0xf8,0x78,0x5c,0x54,0xee,0x16,0x12,0x10,0xde,0x00, 0x00,0x00,0xc7,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x03,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,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,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0xcd,0x2b,0x2a,0x29,0xe0,0x94,0x87,0x82,0xed,0xbd,0x9f,0x96,0xf6,0xa6, 0x84,0x78,0xfb,0xa1,0x80,0x75,0xfd,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3, 0x82,0x77,0xff,0xa5,0x83,0x77,0xff,0x83,0x68,0x61,0xff,0x53,0x45,0x53,0xff,0x78, 0x60,0x71,0xff,0xa3,0x81,0x78,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa3, 0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa3,0x82,0x77,0xff,0xa3, 0x82,0x77,0xff,0xa4,0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa2,0x81,0x76,0xff,0xa1, 0x80,0x76,0xff,0xa6,0x85,0x78,0xff,0xa8,0x83,0x76,0xff,0x7d,0x61,0x62,0xff,0x58, 0x4d,0x4c,0xff,0x66,0x58,0x4d,0xff,0x4a,0x45,0x46,0xff,0x43,0x41,0x3c,0xff,0x7c, 0x62,0x67,0xff,0x60,0x50,0x5b,0xff,0x24,0x28,0x26,0xff,0x23,0x25,0x23,0xff,0x1a, 0x1f,0x1f,0xff,0x3b,0x35,0x33,0xff,0x8b,0x6d,0x6a,0xff,0xb3,0x8f,0x87,0xff,0xab, 0x8a,0x7e,0xff,0xa2,0x81,0x76,0xff,0xa3,0x82,0x76,0xff,0xa4,0x83,0x78,0xff,0xac, 0x88,0x7a,0xff,0x99,0x7a,0x76,0xff,0x5e,0x52,0x5a,0xff,0x29,0x32,0x2e,0xff,0x19, 0x27,0x1b,0xff,0x26,0x23,0x21,0xff,0x8e,0x74,0x6e,0xff,0xac,0x88,0x7d,0xff,0x91, 0x6c,0x66,0xff,0x92,0x6c,0x65,0xff,0x98,0x74,0x69,0xff,0x9f,0x7b,0x6c,0xff,0x83, 0x67,0x76,0xff,0x72,0x59,0x6f,0xff,0x7a,0x60,0x6a,0xff,0x8f,0x6c,0x68,0xff,0x93, 0x6c,0x66,0xff,0x92,0x6c,0x67,0xff,0x92,0x6c,0x67,0xff,0x9c,0x79,0x6f,0xff,0xa3, 0x82,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xab,0x89,0x7b,0xff,0x84, 0x69,0x6f,0xff,0x2c,0x33,0x2c,0xff,0x6b,0x58,0x60,0xff,0x37,0x36,0x35,0xff,0x33, 0x2a,0x2d,0xff,0xa4,0x8e,0x87,0xff,0xb2,0x90,0x84,0xff,0xac,0x86,0x7b,0xff,0xab, 0x87,0x7b,0xff,0xa8,0x85,0x78,0xff,0xa6,0x84,0x77,0xff,0xa4,0x83,0x76,0xff,0xa4, 0x83,0x76,0xff,0xa7,0x84,0x76,0xff,0x8f,0x6a,0x68,0xff,0x9d,0x7b,0x71,0xff,0x98, 0x74,0x71,0xff,0x7e,0x60,0x6e,0xff,0x9d,0x7c,0x75,0xff,0xa3,0x81,0x76,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa3,0x82,0x77,0xff,0x9b,0x73,0x6e,0xff,0x40, 0x3f,0x3c,0xff,0x37,0x3b,0x38,0xff,0x3e,0x3f,0x3f,0xff,0x32,0x38,0x33,0xff,0x1d, 0x29,0x1f,0xff,0x7f,0x60,0x6a,0xff,0xa9,0x89,0x80,0xff,0xa1,0x81,0x76,0xff,0xa2, 0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x80,0x75,0xff,0xa2,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa2, 0x80,0x75,0xff,0xa0,0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0x64,0x51,0x54,0xff,0xb8, 0x9e,0x94,0xff,0xa2,0x80,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0x8a, 0x6d,0x63,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x2e, 0x30,0x30,0xff,0x37,0x3a,0x37,0xff,0x36,0x3a,0x37,0xff,0x3d,0x3f,0x3e,0xff,0x47, 0x45,0x48,0xff,0x50,0x4a,0x51,0xff,0x52,0x4a,0x52,0xff,0x4a,0x43,0x48,0xff,0xab, 0x91,0x86,0xff,0xa4,0x83,0x78,0xff,0xa1,0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa0, 0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa0,0x7e,0x73,0xff,0xa1,0x80,0x74,0xff,0x9f, 0x7b,0x72,0xff,0x87,0x64,0x68,0xff,0x73,0x5c,0x6f,0xff,0x8d,0x66,0x67,0xff,0x88, 0x64,0x69,0xff,0x8c,0x67,0x69,0xff,0x9b,0x77,0x6b,0xff,0xa6,0x83,0x78,0xff,0xa7, 0x83,0x77,0xfe,0x99,0x75,0x6b,0xfe,0x92,0x6d,0x68,0xff,0x99,0x77,0x70,0xff,0x88, 0x6c,0x74,0xff,0x96,0x72,0x6e,0xff,0x9c,0x7a,0x72,0xff,0x7b,0x62,0x70,0xff,0x47, 0x43,0x52,0xff,0x2a,0x30,0x2e,0xff,0x24,0x2c,0x29,0xff,0x2c,0x31,0x30,0xff,0x32, 0x37,0x37,0xff,0x2d,0x34,0x30,0xff,0x27,0x30,0x2a,0xff,0x2c,0x33,0x31,0xff,0x3d, 0x3e,0x41,0xff,0x4b,0x47,0x4c,0xff,0x4b,0x47,0x4c,0xff,0x4b,0x47,0x4c,0xff,0x4a, 0x46,0x4b,0xff,0x4b,0x47,0x4c,0xff,0x40,0x40,0x40,0xff,0x47,0x44,0x47,0xff,0x62, 0x54,0x62,0xff,0x45,0x43,0x46,0xff,0x48,0x45,0x49,0xff,0x49,0x46,0x4a,0xff,0x4e, 0x48,0x4e,0xff,0x52,0x4a,0x52,0xff,0x51,0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x52, 0x4a,0x52,0xff,0x53,0x4b,0x53,0xff,0x52,0x4b,0x52,0xff,0x4d,0x48,0x52,0xff,0x5c, 0x50,0x58,0xff,0x85,0x66,0x66,0xff,0xa2,0x7c,0x75,0xff,0xa3,0x81,0x74,0xff,0x9b, 0x78,0x6f,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9a,0x77,0x6d,0xff,0x9a,0x78,0x6e,0xff,0x9b, 0x77,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9a,0x77,0x6d,0xff,0x9a,0x76,0x6c,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x77,0x6d,0xff,0xa3,0x7e,0x72,0xff,0x9f,0x79,0x74,0xff,0x7e, 0x61,0x5f,0xff,0x53,0x44,0x4d,0xff,0x34,0x30,0x3a,0xff,0x33,0x2f,0x35,0xff,0x39, 0x32,0x3a,0xff,0x3e,0x36,0x3e,0xff,0x55,0x4b,0x56,0xff,0x5a,0x51,0x5c,0xff,0x60, 0x50,0x5f,0xff,0x93,0x72,0x6e,0xff,0xa1,0x7c,0x70,0xff,0x9a,0x76,0x6c,0xff,0x9b, 0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x76,0x6c,0xfe,0x9b,0x76,0x6c,0xfc,0xa7, 0x81,0x76,0xf7,0x6d,0x54,0x4c,0xed,0x12,0x0e,0x0d,0xdc,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0xa0,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,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,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,0x01,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xa6,0x00, 0x00,0x00,0xc0,0x08,0x08,0x08,0xd5,0x4d,0x49,0x47,0xe5,0xab,0x99,0x93,0xf1,0xc0, 0xa2,0x98,0xf8,0xa6,0x83,0x79,0xfc,0xa2,0x80,0x75,0xfd,0xa3,0x82,0x77,0xfe,0xa4, 0x83,0x77,0xff,0xa4,0x83,0x78,0xff,0xaa,0x86,0x7a,0xff,0x8b,0x6d,0x65,0xff,0x3d, 0x37,0x3d,0xff,0x53,0x4b,0x52,0xff,0xa7,0x89,0x84,0xff,0xad,0x8e,0x81,0xff,0xa3, 0x82,0x77,0xff,0xa4,0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa4, 0x83,0x79,0xff,0xa4,0x83,0x78,0xff,0xa5,0x84,0x79,0xff,0xa5,0x84,0x79,0xff,0xa4, 0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xaa,0x87,0x7b,0xff,0x99,0x7b,0x78,0xff,0x7c, 0x62,0x70,0xff,0x74,0x5d,0x62,0xff,0x93,0x74,0x69,0xff,0xbf,0x93,0x83,0xff,0x86, 0x6f,0x6c,0xff,0x19,0x23,0x23,0xff,0x33,0x31,0x37,0xff,0x4d,0x42,0x4c,0xff,0x1e, 0x22,0x1e,0xff,0x23,0x24,0x27,0xff,0x48,0x3f,0x40,0xff,0x93,0x76,0x6d,0xff,0xb3, 0x91,0x85,0xff,0xa8,0x88,0x7d,0xff,0xa4,0x82,0x78,0xff,0xa4,0x83,0x78,0xff,0xa5, 0x85,0x7b,0xff,0xad,0x87,0x7c,0xff,0x85,0x6c,0x65,0xff,0x46,0x43,0x44,0xff,0x24, 0x2e,0x27,0xff,0x1d,0x28,0x1d,0xff,0x11,0x19,0x17,0xff,0x71,0x5f,0x5f,0xff,0xb3, 0x94,0x8c,0xff,0xa7,0x86,0x7c,0xff,0xa0,0x7d,0x73,0xff,0xa0,0x7d,0x73,0xff,0x9f, 0x7c,0x72,0xff,0x9f,0x7c,0x71,0xff,0x99,0x79,0x77,0xff,0x99,0x78,0x75,0xff,0xa3, 0x7f,0x74,0xff,0xa1,0x7e,0x72,0xff,0x9f,0x7c,0x73,0xff,0x95,0x70,0x6a,0xff,0x9a, 0x77,0x6d,0xff,0xa3,0x82,0x76,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa5, 0x84,0x79,0xff,0xa7,0x7e,0x77,0xff,0x52,0x4a,0x49,0xff,0x28,0x30,0x29,0xff,0x2c, 0x34,0x2e,0xff,0x15,0x1d,0x19,0xff,0x71,0x5d,0x59,0xff,0xb2,0x8f,0x83,0xff,0x75, 0x64,0x62,0xff,0x4f,0x4b,0x43,0xff,0x5b,0x52,0x4f,0xff,0x74,0x60,0x66,0xff,0x84, 0x6a,0x76,0xff,0x8e,0x6e,0x73,0xff,0x91,0x6f,0x76,0xff,0x7d,0x65,0x6d,0xff,0x8c, 0x6a,0x68,0xff,0x9f,0x7d,0x73,0xff,0xa8,0x87,0x77,0xff,0x7f,0x63,0x73,0xff,0x9c, 0x7b,0x73,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa4,0x83,0x78,0xff,0xa7, 0x85,0x78,0xff,0x89,0x68,0x77,0xff,0x3f,0x3f,0x3f,0xff,0x38,0x3b,0x38,0xff,0x3c, 0x3e,0x3d,0xff,0x37,0x3a,0x38,0xff,0x17,0x24,0x1a,0xff,0x8c,0x6b,0x63,0xff,0xa8, 0x87,0x7d,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa2, 0x81,0x76,0xff,0xa1,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa3, 0x82,0x77,0xff,0xa1,0x81,0x75,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2, 0x81,0x76,0xff,0x9a,0x72,0x6e,0xff,0xb3,0x98,0x8e,0xff,0xa9,0x88,0x7e,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0x91,0x73,0x69,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x33,0x33,0x33,0xff,0x37,0x3a,0x37,0xff,0x37, 0x3b,0x37,0xff,0x41,0x41,0x41,0xff,0x48,0x45,0x48,0xff,0x52,0x4b,0x53,0xff,0x53, 0x4c,0x54,0xff,0x53,0x4a,0x50,0xff,0x86,0x6c,0x61,0xff,0xad,0x8d,0x83,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa0,0x7d,0x72,0xff,0x8f,0x6e,0x6b,0xff,0x70, 0x5b,0x6e,0xff,0x91,0x6a,0x67,0xff,0x8f,0x6a,0x66,0xff,0x9a,0x76,0x6e,0xff,0xb4, 0x98,0x8d,0xff,0xa3,0x7f,0x71,0xff,0xa0,0x7d,0x74,0xff,0x8b,0x67,0x6e,0xff,0x8c, 0x67,0x69,0xff,0x9e,0x7d,0x74,0xff,0x8d,0x70,0x74,0xff,0x98,0x75,0x70,0xff,0x9d, 0x7b,0x73,0xff,0x8d,0x6f,0x74,0xff,0x8a,0x6e,0x6e,0xff,0x83,0x69,0x67,0xff,0x78, 0x62,0x5c,0xff,0x7b,0x65,0x61,0xff,0x7b,0x65,0x60,0xff,0x70,0x5e,0x57,0xff,0x6c, 0x5c,0x53,0xff,0x6d,0x59,0x54,0xff,0x5b,0x4c,0x51,0xff,0x41,0x3f,0x46,0xff,0x40, 0x3e,0x40,0xff,0x47,0x44,0x48,0xff,0x4b,0x46,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x47, 0x44,0x48,0xff,0x49,0x45,0x4a,0xff,0x58,0x4e,0x58,0xff,0x50,0x4a,0x51,0xff,0x47, 0x44,0x48,0xff,0x4a,0x47,0x4b,0xff,0x4f,0x49,0x4f,0xff,0x52,0x4b,0x52,0xff,0x51, 0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x4f,0x49,0x53,0xff,0x57,0x4b,0x56,0xff,0x7b, 0x62,0x6d,0xff,0x9f,0x7f,0x7d,0xff,0xa5,0x82,0x74,0xff,0x9d,0x7a,0x70,0xff,0x9c, 0x79,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9c, 0x78,0x6e,0xff,0x9c,0x77,0x6d,0xff,0x9b,0x77,0x6d,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x77,0x6d,0xff,0x9c,0x79,0x6e,0xff,0xa4,0x7e,0x71,0xff,0x94,0x73,0x6d,0xff,0x72, 0x57,0x5e,0xff,0x48,0x3b,0x46,0xff,0x35,0x31,0x39,0xff,0x37,0x31,0x38,0xff,0x42, 0x39,0x43,0xff,0x57,0x4d,0x58,0xff,0x57,0x4e,0x5b,0xff,0x6a,0x57,0x61,0xff,0x9e, 0x7e,0x78,0xff,0xa3,0x80,0x75,0xff,0x9b,0x77,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9b,0x78,0x6e,0xfe,0x9c,0x79,0x6f,0xfc,0xa5,0x80,0x75,0xf6,0x5e, 0x49,0x43,0xec,0x0c,0x09,0x08,0xd8,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x9a,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x93,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0xca,0x12,0x11,0x11,0xdd,0x73,0x69,0x65,0xeb,0xb5, 0x9d,0x93,0xf4,0xb8,0x98,0x8e,0xfa,0xa3,0x81,0x77,0xfd,0xa4,0x83,0x79,0xff,0xa5, 0x84,0x79,0xff,0xa4,0x83,0x79,0xff,0xa6,0x86,0x7b,0xff,0xa8,0x84,0x79,0xff,0x89, 0x6b,0x63,0xff,0x38,0x3a,0x39,0xff,0x3e,0x3a,0x36,0xff,0x9f,0x80,0x77,0xff,0xb9, 0x9b,0x8f,0xff,0xa5,0x84,0x7a,0xff,0xa5,0x84,0x79,0xff,0xa6,0x85,0x7a,0xff,0xa6, 0x85,0x7a,0xff,0xa5,0x85,0x7a,0xff,0xa6,0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa6, 0x85,0x7a,0xff,0xa6,0x85,0x7a,0xff,0xa5,0x84,0x79,0xff,0xac,0x89,0x7c,0xff,0x89, 0x71,0x6b,0xff,0x5e,0x52,0x60,0xff,0x7a,0x5f,0x70,0xff,0x7b,0x60,0x63,0xff,0x59, 0x50,0x4f,0xff,0x6a,0x5b,0x5e,0xff,0x67,0x5a,0x61,0xff,0x1e,0x24,0x21,0xff,0x06, 0x0d,0x0a,0xff,0x1d,0x20,0x1f,0xff,0x2e,0x2b,0x31,0xff,0x5c,0x4c,0x51,0xff,0x9a, 0x7e,0x76,0xff,0xaf,0x8e,0x83,0xff,0xa7,0x86,0x7b,0xff,0xa5,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa8,0x87,0x7d,0xff,0xaa,0x82,0x7a,0xff,0x74,0x5e,0x57,0xff,0x30, 0x36,0x30,0xff,0x20,0x2c,0x23,0xff,0x20,0x2a,0x20,0xff,0x0e,0x19,0x13,0xff,0x57, 0x4c,0x49,0xff,0xb0,0x94,0x8b,0xff,0xaf,0x90,0x84,0xff,0xa6,0x84,0x7a,0xff,0xa6, 0x85,0x7b,0xff,0xa7,0x86,0x7c,0xff,0xa6,0x86,0x7b,0xff,0xa7,0x86,0x7c,0xff,0xa8, 0x87,0x7a,0xff,0xa8,0x87,0x7b,0xff,0xa7,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa7, 0x87,0x7c,0xff,0xa3,0x81,0x77,0xff,0xa5,0x83,0x7a,0xff,0xa5,0x84,0x7a,0xff,0xa5, 0x84,0x7a,0xff,0xa4,0x83,0x78,0xff,0xac,0x8a,0x7d,0xff,0x80,0x66,0x6d,0xff,0x3c, 0x3c,0x3b,0xff,0x22,0x2e,0x23,0xff,0x04,0x13,0x06,0xff,0x2e,0x2b,0x31,0xff,0x73, 0x61,0x6c,0xff,0x6d,0x5d,0x64,0xff,0x7a,0x63,0x60,0xff,0x7a,0x67,0x5e,0xff,0x80, 0x6b,0x65,0xff,0x8c,0x72,0x71,0xff,0x94,0x77,0x78,0xff,0x9a,0x7a,0x77,0xff,0xa0, 0x7e,0x7b,0xff,0x63,0x55,0x66,0xff,0x92,0x72,0x6a,0xff,0xb5,0x99,0x8f,0xff,0xa7, 0x87,0x7c,0xff,0xa0,0x7e,0x78,0xff,0x8d,0x6b,0x6d,0xff,0xa1,0x80,0x76,0xff,0xa4, 0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa9,0x86,0x79,0xff,0x6f,0x5e,0x6d,0xff,0x3e, 0x3e,0x3f,0xff,0x39,0x3c,0x39,0xff,0x3b,0x3d,0x3b,0xff,0x3b,0x3e,0x3c,0xff,0x10, 0x1e,0x15,0xff,0x99,0x7b,0x70,0xff,0xac,0x8d,0x83,0xff,0xa4,0x84,0x7a,0xff,0xa3, 0x82,0x77,0xff,0xa4,0x82,0x77,0xff,0xa4,0x83,0x78,0xff,0xa4,0x83,0x77,0xff,0xa3, 0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa4,0x83,0x79,0xff,0xa2, 0x81,0x76,0xff,0xa3,0x82,0x77,0xff,0xa4,0x83,0x78,0xff,0xa1,0x7f,0x73,0xff,0xbc, 0xa4,0x9c,0xff,0xaf,0x92,0x88,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0x9b, 0x7b,0x71,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x33, 0x34,0x33,0xff,0x3a,0x3d,0x3a,0xff,0x39,0x3c,0x3a,0xff,0x40,0x40,0x40,0xff,0x48, 0x45,0x49,0xff,0x55,0x4d,0x56,0xff,0x56,0x4d,0x57,0xff,0x57,0x4c,0x56,0xff,0x6f, 0x53,0x4f,0xff,0xb5,0x97,0x8d,0xff,0xa2,0x80,0x75,0xff,0xa2,0x80,0x75,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa2, 0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa2,0x80,0x74,0xff,0xa1, 0x7e,0x73,0xff,0x8f,0x6a,0x6a,0xff,0x84,0x62,0x6c,0xff,0x8d,0x66,0x67,0xff,0x96, 0x70,0x6c,0xff,0xb3,0x97,0x8b,0xff,0xb8,0x9f,0x9b,0xff,0x83,0x64,0x6f,0xff,0x66, 0x57,0x5f,0xff,0x6b,0x57,0x61,0xff,0x9c,0x75,0x6c,0xff,0xa2,0x80,0x74,0xff,0xa4, 0x81,0x73,0xff,0xa1,0x80,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa4,0x81,0x73,0xff,0xa5, 0x81,0x74,0xff,0xa7,0x83,0x76,0xff,0xa9,0x84,0x78,0xff,0xa8,0x83,0x77,0xff,0xa4, 0x80,0x74,0xff,0xa2,0x7f,0x73,0xff,0xa5,0x81,0x75,0xff,0xa5,0x7f,0x75,0xff,0x93, 0x71,0x6a,0xff,0x65,0x51,0x51,0xff,0x39,0x35,0x3e,0xff,0x38,0x36,0x3a,0xff,0x4c, 0x47,0x4b,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4d,0xff,0x46,0x44,0x46,0xff,0x43, 0x42,0x44,0xff,0x51,0x4a,0x52,0xff,0x48,0x45,0x49,0xff,0x4c,0x48,0x4d,0xff,0x52, 0x4b,0x52,0xff,0x53,0x4b,0x53,0xff,0x52,0x4b,0x52,0xff,0x52,0x4a,0x52,0xff,0x53, 0x4b,0x53,0xff,0x55,0x4c,0x55,0xff,0x55,0x4c,0x55,0xff,0x54,0x4c,0x54,0xff,0x56, 0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x55,0x4c,0x5a,0xff,0x6a,0x59,0x68,0xff,0x92, 0x74,0x72,0xff,0xa5,0x82,0x74,0xff,0xa0,0x7d,0x73,0xff,0x9c,0x79,0x6f,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9c, 0x79,0x6f,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b, 0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9c,0x78,0x6e,0xff,0x9c,0x78,0x6e,0xff,0x9c, 0x79,0x70,0xff,0xa0,0x7c,0x70,0xff,0xa0,0x7a,0x72,0xff,0x90,0x6d,0x68,0xff,0x69, 0x54,0x5d,0xff,0x3f,0x37,0x42,0xff,0x34,0x2e,0x35,0xff,0x3d,0x36,0x3e,0xff,0x54, 0x4a,0x54,0xff,0x55,0x4c,0x5a,0xff,0x7b,0x64,0x73,0xff,0xa4,0x83,0x80,0xff,0xa1, 0x7f,0x73,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xff,0x9b,0x78,0x6e,0xfe,0x9b, 0x78,0x6e,0xfe,0x9d,0x7a,0x70,0xfb,0xa2,0x7d,0x73,0xf6,0x4d,0x3c,0x37,0xe9,0x08, 0x06,0x05,0xd5,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,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,0x01,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x2a,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xd1,0x26,0x23,0x22,0xe2,0x96, 0x88,0x83,0xef,0xb6,0x9a,0x90,0xf7,0xae,0x8d,0x82,0xfb,0xa4,0x83,0x79,0xfe,0xa5, 0x84,0x7a,0xfe,0xa6,0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa8,0x88,0x7d,0xff,0xa4, 0x7f,0x7a,0xff,0x79,0x5d,0x5e,0xff,0x2e,0x32,0x2d,0xff,0x31,0x2f,0x36,0xff,0x94, 0x79,0x80,0xff,0xbd,0x9e,0x90,0xff,0xa8,0x8a,0x7f,0xff,0xa5,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa8,0x88,0x7d,0xff,0xa1,0x7f,0x76,0xff,0x91,0x6c,0x6b,0xff,0x93, 0x6f,0x6d,0xff,0x97,0x74,0x6f,0xff,0x89,0x6a,0x76,0xff,0x89,0x6b,0x77,0xff,0x90, 0x6e,0x7a,0xff,0x74,0x60,0x66,0xff,0x4a,0x46,0x4c,0xff,0x6f,0x5a,0x60,0xff,0xa9, 0x86,0x7d,0xff,0xa4,0x88,0x80,0xff,0x88,0x6b,0x66,0xff,0x6a,0x56,0x5d,0xff,0x4b, 0x47,0x51,0xff,0x28,0x2d,0x28,0xff,0x0e,0x18,0x10,0xff,0x30,0x29,0x29,0xff,0x70, 0x5a,0x5b,0xff,0xa0,0x84,0x7c,0xff,0xad,0x8c,0x81,0xff,0xa7,0x86,0x7c,0xff,0xa6, 0x85,0x7b,0xff,0xa7,0x87,0x7d,0xff,0xab,0x8b,0x80,0xff,0xa2,0x7c,0x79,0xff,0x61, 0x50,0x4d,0xff,0x27,0x30,0x28,0xff,0x21,0x2d,0x23,0xff,0x23,0x2d,0x24,0xff,0x16, 0x21,0x1a,0xff,0x39,0x2f,0x2d,0xff,0x9d,0x81,0x7b,0xff,0xb5,0x96,0x8b,0xff,0xa5, 0x84,0x7a,0xff,0xa5,0x84,0x7a,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa7,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x85,0x7b,0xff,0xa7,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa7,0x86,0x7c,0xff,0xa6, 0x86,0x7c,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x85,0x7c,0xff,0xa7,0x87,0x7c,0xff,0xaa, 0x82,0x77,0xff,0x51,0x4a,0x48,0xff,0x31,0x38,0x35,0xff,0x19,0x24,0x1b,0xff,0x00, 0x0b,0x04,0xff,0x70,0x5d,0x57,0xff,0x64,0x56,0x5f,0xff,0x6a,0x55,0x67,0xff,0xa1, 0x7f,0x79,0xff,0xaf,0x8b,0x80,0xff,0xad,0x89,0x7f,0xff,0xaa,0x88,0x7c,0xff,0xa9, 0x87,0x7b,0xff,0xa8,0x87,0x7b,0xff,0xa9,0x89,0x7c,0xff,0x9e,0x81,0x78,0xff,0x7d, 0x64,0x71,0xff,0xb1,0x99,0x95,0xff,0xb0,0x93,0x89,0xff,0xa9,0x89,0x7d,0xff,0x95, 0x71,0x6c,0xff,0xa3,0x82,0x78,0xff,0xa6,0x85,0x7a,0xff,0xa6,0x85,0x7a,0xff,0xad, 0x8a,0x7e,0xff,0x4d,0x49,0x49,0xff,0x3a,0x3c,0x3a,0xff,0x3b,0x3d,0x3b,0xff,0x3b, 0x3d,0x3b,0xff,0x3d,0x3e,0x3d,0xff,0x16,0x24,0x1a,0xff,0xa3,0x88,0x7e,0xff,0xaa, 0x89,0x7f,0xff,0xa5,0x84,0x7a,0xff,0xa4,0x83,0x78,0xff,0xa5,0x84,0x7a,0xff,0xa5, 0x84,0x7a,0xff,0xa5,0x84,0x7a,0xff,0xa4,0x83,0x78,0xff,0xa5,0x84,0x7a,0xff,0xa5, 0x84,0x79,0xff,0xa6,0x85,0x7b,0xff,0xa4,0x83,0x78,0xff,0xa5,0x84,0x79,0xff,0xa5, 0x84,0x7a,0xff,0x9b,0x78,0x6d,0xff,0xc0,0xa9,0xa1,0xff,0xa5,0x85,0x7a,0xff,0xa4, 0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa1,0x81,0x77,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x02,0x02,0x02,0xff,0x34,0x35,0x34,0xff,0x3a,0x3c,0x3a,0xff,0x39, 0x3c,0x3a,0xff,0x3f,0x40,0x40,0xff,0x49,0x46,0x4a,0xff,0x55,0x4c,0x56,0xff,0x56, 0x4d,0x57,0xff,0x57,0x4c,0x57,0xff,0x5b,0x47,0x50,0xff,0xb8,0x9b,0x90,0xff,0xa4, 0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa3, 0x82,0x76,0xff,0x9d,0x7d,0x76,0xff,0x74,0x5f,0x6f,0xff,0x70,0x59,0x65,0xff,0x8d, 0x65,0x68,0xff,0x8a,0x64,0x67,0xff,0x92,0x6d,0x6c,0xff,0xad,0x8e,0x81,0xff,0x9a, 0x7d,0x78,0xff,0x52,0x49,0x58,0xff,0x55,0x4a,0x55,0xff,0x88,0x68,0x6d,0xff,0xa3, 0x80,0x73,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0xa2,0x7f,0x74,0xff,0xa1, 0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa2,0x80,0x73,0xff,0x9d,0x7a,0x6f,0xff,0x80, 0x65,0x68,0xff,0x4d,0x41,0x4e,0xff,0x38,0x36,0x39,0xff,0x47,0x44,0x48,0xff,0x4e, 0x48,0x4e,0xff,0x45,0x43,0x45,0xff,0x4d,0x48,0x4d,0xff,0x5e,0x52,0x5e,0xff,0x49, 0x45,0x49,0xff,0x4f,0x49,0x4f,0xff,0x54,0x4b,0x54,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53,0x4c,0x54,0xff,0x54,0x4c,0x55,0xff,0x56, 0x4d,0x57,0xff,0x55,0x4d,0x56,0xff,0x55,0x4c,0x56,0xff,0x57,0x4e,0x58,0xff,0x57, 0x4d,0x57,0xff,0x55,0x4b,0x58,0xff,0x5d,0x51,0x5e,0xff,0x82,0x67,0x66,0xff,0xa2, 0x7d,0x71,0xff,0xa1,0x7f,0x74,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9d, 0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9b,0x78,0x6e,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xff,0x9d, 0x7a,0x6f,0xff,0xa2,0x7d,0x71,0xff,0x9f,0x7b,0x73,0xff,0x7f,0x60,0x63,0xff,0x49, 0x3b,0x43,0xff,0x33,0x2e,0x35,0xff,0x3a,0x33,0x3b,0xff,0x4f,0x47,0x51,0xff,0x56, 0x4d,0x5c,0xff,0x82,0x65,0x68,0xff,0xa0,0x7c,0x72,0xff,0x9e,0x7b,0x70,0xff,0x9c, 0x79,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9b,0x78,0x6e,0xfe,0x9b,0x78,0x6e,0xfe,0xa1, 0x7d,0x73,0xfa,0x9f,0x7c,0x71,0xf3,0x3e,0x31,0x2c,0xe7,0x03,0x03,0x02,0xd3,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x02,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,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xbc,0x04,0x04,0x04,0xd4,0x43, 0x3e,0x3d,0xe5,0xae,0x99,0x92,0xf1,0xb7,0x99,0x8f,0xf8,0xaa,0x89,0x7f,0xfc,0xa6, 0x85,0x7b,0xfd,0xa7,0x86,0x7c,0xfe,0xa7,0x86,0x7c,0xff,0xa7,0x86,0x7b,0xff,0xab, 0x89,0x7e,0xff,0x9f,0x7f,0x7f,0xff,0x69,0x58,0x62,0xff,0x29,0x2f,0x29,0xff,0x1e, 0x23,0x22,0xff,0x6c,0x5f,0x60,0xff,0xc6,0xa7,0xa1,0xff,0xac,0x8c,0x82,0xff,0xa5, 0x85,0x7b,0xff,0xa7,0x86,0x7b,0xff,0xa9,0x89,0x7e,0xff,0x9b,0x7a,0x74,0xff,0x83, 0x60,0x6a,0xff,0x92,0x71,0x76,0xff,0xa5,0x84,0x7a,0xff,0xa3,0x83,0x7a,0xff,0xa0, 0x81,0x7b,0xff,0xa2,0x82,0x7d,0xff,0xa6,0x84,0x7d,0xff,0x85,0x6b,0x6f,0xff,0x5f, 0x50,0x64,0xff,0x90,0x7a,0x7d,0xff,0xb8,0x99,0x8c,0xff,0xaf,0x8f,0x84,0xff,0xab, 0x84,0x79,0xff,0x70,0x5b,0x59,0xff,0x35,0x38,0x3b,0xff,0x30,0x30,0x33,0xff,0x62, 0x50,0x4d,0xff,0xa0,0x7f,0x75,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8a,0x7f,0xff,0xa9, 0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa9,0x88,0x7e,0xff,0xad,0x8c,0x7f,0xff,0x97, 0x78,0x80,0xff,0x4f,0x47,0x4c,0xff,0x20,0x2b,0x21,0xff,0x21,0x2d,0x24,0xff,0x28, 0x31,0x28,0xff,0x18,0x22,0x18,0xff,0x23,0x24,0x27,0xff,0x8c,0x77,0x77,0xff,0xb9, 0x9a,0x91,0xff,0xa9,0x8a,0x7f,0xff,0xa8,0x87,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xa8, 0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7c,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7c,0xff,0xad,0x8c,0x7e,0xff,0x83,0x6a,0x72,0xff,0x3c,0x3d,0x3d,0xff,0x30, 0x37,0x31,0xff,0x22,0x2b,0x23,0xff,0x21,0x24,0x23,0xff,0x9f,0x8d,0x86,0xff,0x4c, 0x4e,0x49,0xff,0x73,0x56,0x59,0xff,0xaf,0x90,0x89,0xff,0xa9,0x8a,0x80,0xff,0xa7, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x86,0x7c,0xff,0xaa,0x89,0x7d,0xff,0xa2,0x83,0x7b,0xff,0x89,0x6f,0x7b,0xff,0x8b, 0x6e,0x7b,0xff,0x91,0x6c,0x6b,0xff,0x8a,0x68,0x72,0xff,0x9f,0x7d,0x75,0xff,0xa5, 0x85,0x7a,0xff,0xa7,0x87,0x7d,0xff,0xa2,0x7b,0x71,0xff,0x41,0x40,0x3c,0xff,0x38, 0x3b,0x39,0xff,0x39,0x3c,0x3a,0xff,0x39,0x3c,0x3a,0xff,0x3d,0x3e,0x3d,0xff,0x26, 0x2f,0x29,0xff,0xac,0x95,0x8d,0xff,0xa8,0x88,0x7e,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa4,0x83,0x79,0xff,0xa6, 0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0x9a,0x77,0x6e,0xff,0x97,0x73,0x69,0xff,0xbe, 0xa6,0x9e,0xff,0xa3,0x82,0x78,0xff,0xa6,0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa1, 0x81,0x77,0xff,0x06,0x05,0x04,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x36, 0x37,0x36,0xff,0x39,0x3c,0x3a,0xff,0x39,0x3c,0x3a,0xff,0x3f,0x40,0x40,0xff,0x4b, 0x47,0x4c,0xff,0x55,0x4d,0x56,0xff,0x59,0x4f,0x5a,0xff,0x56,0x4c,0x56,0xff,0x51, 0x47,0x50,0xff,0xb1,0x98,0x8d,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x84,0x78,0xff,0xa7, 0x85,0x7a,0xff,0xa7,0x85,0x7a,0xff,0xa6,0x84,0x79,0xff,0xa8,0x85,0x7a,0xff,0xa7, 0x85,0x7a,0xff,0xa6,0x84,0x79,0xff,0x9d,0x7d,0x78,0xff,0x60,0x52,0x5e,0xff,0x31, 0x36,0x34,0xff,0x84,0x66,0x79,0xff,0x8a,0x64,0x67,0xff,0x89,0x64,0x68,0xff,0x90, 0x6b,0x68,0xff,0x96,0x71,0x6a,0xff,0x82,0x63,0x6d,0xff,0x6b,0x59,0x69,0xff,0x8b, 0x6b,0x6f,0xff,0xa5,0x83,0x78,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1, 0x80,0x75,0xff,0xa3,0x82,0x77,0xff,0xa1,0x80,0x75,0xff,0xa2,0x81,0x76,0xff,0xa1, 0x80,0x75,0xff,0xa2,0x81,0x76,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa0, 0x7e,0x73,0xff,0xa3,0x80,0x74,0xff,0xa4,0x81,0x75,0xff,0x94,0x74,0x74,0xff,0x62, 0x4f,0x5a,0xff,0x3a,0x37,0x3b,0xff,0x3a,0x3a,0x3b,0xff,0x47,0x45,0x48,0xff,0x63, 0x55,0x63,0xff,0x4d,0x47,0x4d,0xff,0x4b,0x47,0x4c,0xff,0x50,0x4a,0x51,0xff,0x55, 0x4d,0x56,0xff,0x54,0x4c,0x54,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x54,0xff,0x54,0x4c,0x55,0xff,0x55,0x4c,0x56,0xff,0x56,0x4d,0x57,0xff,0x56, 0x4d,0x57,0xff,0x57,0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x57,0xff,0x55, 0x4c,0x58,0xff,0x57,0x4e,0x59,0xff,0x74,0x5b,0x62,0xff,0x9a,0x76,0x73,0xff,0xa5, 0x83,0x77,0xff,0xa0,0x7e,0x72,0xff,0x9d,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9d, 0x7a,0x6f,0xff,0x9c,0x79,0x6f,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9f, 0x7c,0x71,0xff,0x9f,0x7b,0x72,0xff,0x99,0x75,0x6b,0xff,0x68,0x53,0x57,0xff,0x39, 0x31,0x3a,0xff,0x36,0x31,0x37,0xff,0x4a,0x44,0x4c,0xff,0x57,0x4c,0x59,0xff,0x8b, 0x6e,0x6c,0xff,0xa4,0x81,0x75,0xff,0x9e,0x7c,0x71,0xff,0x9c,0x79,0x6f,0xff,0x9d, 0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9c,0x79,0x6f,0xfd,0xa2,0x7d,0x73,0xfa,0x9a, 0x76,0x6c,0xf3,0x30,0x26,0x23,0xe5,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0xb3,0x00, 0x00,0x00,0x8d,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xc4,0x14, 0x15,0x14,0xd9,0x6c,0x63,0x5f,0xe9,0xba,0xa1,0x98,0xf3,0xb0,0x91,0x86,0xfa,0xa8, 0x87,0x7c,0xfc,0xa8,0x87,0x7d,0xfd,0xa8,0x88,0x7e,0xfe,0xa7,0x87,0x7d,0xff,0xaa, 0x89,0x7e,0xff,0xaa,0x88,0x7d,0xff,0x8d,0x73,0x74,0xff,0x52,0x4a,0x55,0xff,0x2f, 0x36,0x31,0xff,0x24,0x2b,0x28,0xff,0x4f,0x45,0x43,0xff,0xb5,0x94,0x8c,0xff,0x9a, 0x7f,0x78,0xff,0x79,0x5c,0x65,0xff,0x7f,0x64,0x71,0xff,0x96,0x71,0x68,0xff,0x99, 0x74,0x6c,0xff,0x80,0x67,0x67,0xff,0x78,0x64,0x68,0xff,0xac,0x8a,0x7e,0xff,0xaa, 0x8c,0x80,0xff,0xa9,0x8b,0x80,0xff,0xaa,0x8b,0x7f,0xff,0xab,0x8c,0x7f,0xff,0xa2, 0x80,0x73,0xff,0x98,0x74,0x6a,0xff,0xa8,0x8a,0x82,0xff,0xaf,0x92,0x89,0xff,0xa8, 0x88,0x7e,0xff,0xad,0x8b,0x7f,0xff,0x8e,0x73,0x75,0xff,0x52,0x49,0x55,0xff,0x52, 0x4a,0x54,0xff,0x88,0x70,0x72,0xff,0xb0,0x8f,0x83,0xff,0xb1,0x92,0x87,0xff,0xab, 0x8a,0x80,0xff,0xa8,0x87,0x7d,0xff,0xa9,0x8a,0x7f,0xff,0xad,0x8d,0x82,0xff,0xab, 0x89,0x7f,0xff,0x7e,0x68,0x6d,0xff,0x3d,0x3e,0x40,0xff,0x23,0x2e,0x24,0xff,0x26, 0x30,0x27,0xff,0x2a,0x33,0x2a,0xff,0x1f,0x28,0x20,0xff,0x0f,0x15,0x11,0xff,0x75, 0x63,0x5d,0xff,0xbb,0x9b,0x91,0xff,0xad,0x8e,0x83,0xff,0xa9,0x8a,0x80,0xff,0xa9, 0x8a,0x80,0xff,0xa9,0x8a,0x7f,0xff,0xa9,0x8a,0x7f,0xff,0xa8,0x89,0x7e,0xff,0xa9, 0x89,0x7f,0xff,0xa8,0x89,0x7e,0xff,0xa9,0x89,0x7f,0xff,0xa9,0x8a,0x7f,0xff,0xa8, 0x89,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa8, 0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xaa,0x8b,0x80,0xff,0xac,0x87,0x7f,0xff,0x4f, 0x4a,0x46,0xff,0x2d,0x35,0x30,0xff,0x32,0x38,0x33,0xff,0x22,0x2b,0x25,0xff,0x5b, 0x47,0x45,0xff,0x54,0x4e,0x4a,0xff,0x6c,0x5c,0x69,0xff,0x9e,0x7f,0x7c,0xff,0xab, 0x8c,0x80,0xff,0xa8,0x89,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xa8, 0x88,0x7d,0xff,0xa4,0x84,0x7c,0xff,0xa4,0x84,0x7d,0xff,0x9f,0x7d,0x72,0xff,0xa6, 0x86,0x7d,0xff,0x9d,0x7b,0x71,0xff,0xaa,0x8b,0x82,0xff,0xaa,0x8a,0x7f,0xff,0x90, 0x6c,0x76,0xff,0x40,0x3f,0x3e,0xff,0x37,0x3a,0x37,0xff,0x3a,0x3c,0x3b,0xff,0x3a, 0x3d,0x3b,0xff,0x39,0x3c,0x3a,0xff,0x4f,0x46,0x52,0xff,0xad,0x92,0x8b,0xff,0xa8, 0x88,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa7, 0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x86,0x7c,0xff,0x8a, 0x67,0x6c,0xff,0xa1,0x80,0x76,0xff,0xbd,0xa5,0x9d,0xff,0xa4,0x83,0x79,0xff,0xa6, 0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa1,0x81,0x77,0xff,0x0e,0x0b,0x0a,0xff,0x00, 0x00,0x00,0xfe,0x03,0x03,0x03,0xfe,0x37,0x38,0x38,0xfe,0x39,0x3c,0x3a,0xfe,0x39, 0x3c,0x3a,0xfe,0x44,0x43,0x45,0xfe,0x4b,0x47,0x4c,0xff,0x57,0x4e,0x58,0xff,0x59, 0x4f,0x5a,0xff,0x58,0x4e,0x59,0xff,0x56,0x4a,0x53,0xff,0x95,0x7c,0x72,0xff,0xad, 0x8e,0x82,0xff,0xa1,0x81,0x7c,0xff,0x98,0x7b,0x72,0xff,0x91,0x75,0x6a,0xff,0x91, 0x75,0x69,0xff,0x95,0x79,0x6f,0xff,0x98,0x7a,0x70,0xff,0x91,0x76,0x70,0xff,0x5d, 0x50,0x5c,0xff,0x19,0x24,0x1d,0xff,0x6f,0x5a,0x65,0xff,0x8e,0x67,0x6a,0xff,0x8a, 0x65,0x68,0xff,0x89,0x64,0x68,0xff,0x8f,0x69,0x68,0xff,0x92,0x6d,0x67,0xff,0x89, 0x63,0x68,0xff,0x98,0x74,0x6d,0xff,0xa6,0x84,0x79,0xff,0xa3,0x82,0x76,0xff,0xa1, 0x7f,0x74,0xff,0xa5,0x84,0x77,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa2, 0x81,0x76,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1, 0x80,0x75,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa2, 0x80,0x74,0xff,0xa4,0x82,0x76,0xff,0x9f,0x7a,0x72,0xff,0x73,0x58,0x58,0xff,0x36, 0x33,0x37,0xff,0x3c,0x3a,0x3e,0xff,0x50,0x4a,0x50,0xff,0x4c,0x48,0x4c,0xff,0x4e, 0x48,0x4e,0xff,0x51,0x4a,0x51,0xff,0x54,0x4c,0x54,0xff,0x54,0x4c,0x54,0xff,0x54, 0x4b,0x54,0xff,0x55,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54, 0x4c,0x55,0xff,0x56,0x4d,0x56,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x58, 0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x59,0x4e,0x58,0xff,0x58,0x4e,0x5a,0xff,0x58, 0x4f,0x5a,0xff,0x6a,0x57,0x69,0xff,0x8f,0x72,0x79,0xff,0xa6,0x85,0x79,0xff,0xa3, 0x81,0x74,0xff,0x9d,0x7b,0x70,0xff,0x9d,0x7a,0x6f,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0xa1, 0x7d,0x71,0xff,0xa1,0x7e,0x71,0xff,0x8a,0x69,0x68,0xff,0x51,0x40,0x45,0xff,0x45, 0x3d,0x46,0xff,0x4a,0x45,0x4e,0xff,0x5d,0x51,0x60,0xff,0x93,0x75,0x76,0xff,0xa3, 0x7f,0x74,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d,0x7a,0x70,0xff,0x9d, 0x7a,0x70,0xff,0x9c,0x7a,0x6f,0xfd,0xa1,0x7b,0x72,0xf9,0x76,0x5f,0x66,0xf2,0x20, 0x1b,0x1d,0xe4,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0xb6,0x02, 0x02,0x02,0xcd,0x29,0x26,0x26,0xdf,0x8c,0x7e,0x79,0xed,0xbf,0xa3,0x98,0xf6,0xac, 0x8d,0x82,0xfa,0xa7,0x87,0x7d,0xfd,0xa8,0x88,0x7e,0xfe,0xa8,0x89,0x7f,0xff,0xa9, 0x8a,0x80,0xff,0xad,0x8c,0x82,0xff,0xa7,0x85,0x7b,0xff,0x7d,0x67,0x64,0xff,0x41, 0x40,0x46,0xff,0x2f,0x35,0x30,0xff,0x23,0x29,0x24,0xff,0x28,0x28,0x29,0xff,0x57, 0x45,0x50,0xff,0x69,0x54,0x5e,0xff,0x54,0x4c,0x55,0xff,0x5e,0x53,0x55,0xff,0x73, 0x60,0x6b,0xff,0x8a,0x6c,0x79,0xff,0x8e,0x6b,0x70,0xff,0x9a,0x78,0x76,0xff,0xad, 0x8d,0x82,0xff,0xa9,0x89,0x7f,0xff,0xa9,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xaa, 0x8b,0x81,0xff,0xa0,0x7f,0x78,0xff,0x95,0x71,0x6b,0xff,0xb1,0x94,0x8a,0xff,0xbb, 0xa1,0x98,0xff,0xa8,0x88,0x7d,0xff,0xab,0x8c,0x80,0xff,0xa5,0x83,0x7c,0xff,0x6f, 0x5a,0x5b,0xff,0x65,0x55,0x60,0xff,0xa2,0x85,0x88,0xff,0xb3,0x96,0x8a,0xff,0xad, 0x8e,0x84,0xff,0xaa,0x8b,0x81,0xff,0xa8,0x89,0x7f,0xff,0xaa,0x8b,0x80,0xff,0xb2, 0x90,0x86,0xff,0xa6,0x85,0x7b,0xff,0x6a,0x5b,0x5a,0xff,0x30,0x36,0x33,0xff,0x25, 0x2f,0x26,0xff,0x28,0x31,0x28,0xff,0x29,0x32,0x29,0xff,0x28,0x31,0x28,0xff,0x15, 0x1f,0x1a,0xff,0x53,0x43,0x43,0xff,0xae,0x91,0x8b,0xff,0xb6,0x9b,0x8f,0xff,0xab, 0x8c,0x81,0xff,0xaa,0x8a,0x80,0xff,0xaa,0x8b,0x80,0xff,0xaa,0x8b,0x81,0xff,0xaa, 0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x80,0xff,0xaa,0x8a,0x80,0xff,0xab, 0x8c,0x82,0xff,0xaa,0x8b,0x80,0xff,0xa9,0x8a,0x80,0xff,0xab,0x8c,0x82,0xff,0xa9, 0x8a,0x7f,0xff,0xad,0x8f,0x85,0xff,0xab,0x8c,0x81,0xff,0xa9,0x8a,0x80,0xff,0xb1, 0x90,0x81,0xff,0x83,0x6a,0x74,0xff,0x3d,0x3d,0x3f,0xff,0x2e,0x35,0x30,0xff,0x30, 0x37,0x31,0xff,0x1f,0x24,0x26,0xff,0x86,0x74,0x6d,0xff,0xb0,0x94,0x8a,0xff,0xac, 0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xa9,0x8a,0x80,0xff,0xa9,0x8a,0x7f,0xff,0xaa, 0x8b,0x81,0xff,0xaa,0x8b,0x80,0xff,0xa9,0x8a,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa8, 0x89,0x7f,0xff,0xa9,0x8a,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa9,0x89,0x7e,0xff,0xaa, 0x8b,0x7f,0xff,0xaa,0x8b,0x80,0xff,0xac,0x8e,0x81,0xff,0x90,0x6a,0x65,0xff,0xc4, 0xae,0xa7,0xff,0xb1,0x92,0x86,0xff,0x78,0x62,0x71,0xff,0x3e,0x3f,0x3f,0xff,0x39, 0x3b,0x3a,0xff,0x3e,0x3f,0x3f,0xff,0x3b,0x3d,0x3b,0xff,0x25,0x2a,0x27,0xff,0x67, 0x4e,0x5a,0xff,0xae,0x91,0x89,0xff,0xa9,0x89,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa8, 0x89,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x88,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xa7, 0x87,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa7, 0x88,0x7d,0xff,0xa7,0x87,0x7d,0xff,0x96,0x71,0x68,0xff,0xb3,0x97,0x8d,0xff,0xb2, 0x96,0x8c,0xff,0xa7,0x87,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xa3, 0x83,0x79,0xfe,0x14,0x11,0x0f,0xfe,0x00,0x00,0x00,0xfd,0x03,0x03,0x03,0xfb,0x40, 0x3e,0x41,0xfb,0x40,0x42,0x40,0xfb,0x40,0x42,0x40,0xfb,0x49,0x47,0x4a,0xfd,0x4d, 0x49,0x4e,0xfe,0x59,0x4e,0x59,0xfe,0x5b,0x50,0x5c,0xff,0x5b,0x50,0x5c,0xff,0x5d, 0x4f,0x5a,0xff,0x7b,0x60,0x58,0xff,0xa6,0x89,0x88,0xff,0x53,0x49,0x55,0xff,0x31, 0x38,0x35,0xff,0x40,0x40,0x42,0xff,0x34,0x39,0x36,0xff,0x2f,0x36,0x30,0xff,0x40, 0x40,0x41,0xff,0x46,0x42,0x48,0xff,0x36,0x36,0x31,0xff,0x45,0x40,0x3c,0xff,0x92, 0x69,0x6e,0xff,0x8a,0x65,0x68,0xff,0x89,0x64,0x68,0xff,0x8c,0x66,0x68,0xff,0x90, 0x6b,0x66,0xff,0x92,0x6d,0x69,0xff,0x8f,0x6a,0x68,0xff,0x9f,0x7d,0x70,0xff,0xa6, 0x85,0x78,0xff,0x9b,0x7a,0x74,0xff,0x88,0x66,0x6e,0xff,0xa5,0x83,0x7c,0xff,0xa7, 0x85,0x78,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3, 0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa2,0x81,0x76,0xff,0xa2, 0x81,0x76,0xff,0xa3,0x80,0x75,0xff,0x88,0x6b,0x67,0xff,0x50,0x44,0x4e,0xff,0x3c, 0x38,0x3f,0xff,0x44,0x41,0x45,0xff,0x4e,0x48,0x4e,0xff,0x54,0x4c,0x54,0xff,0x55, 0x4d,0x56,0xff,0x56,0x4d,0x57,0xff,0x57,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x55, 0x4c,0x56,0xff,0x56,0x4d,0x56,0xff,0x57,0x4e,0x58,0xff,0x57,0x4e,0x58,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x59,0xff,0x58,0x4e,0x57,0xff,0x5a, 0x4f,0x5a,0xff,0x5b,0x50,0x5c,0xff,0x5a,0x4f,0x5b,0xff,0x5b,0x50,0x5b,0xff,0x61, 0x52,0x63,0xff,0x83,0x6b,0x71,0xff,0xa6,0x86,0x7a,0xff,0xa8,0x87,0x7b,0xff,0xa0, 0x7e,0x73,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7c,0x6e,0xff,0x7a,0x5f,0x63,0xff,0x45,0x3a,0x42,0xff,0x3e, 0x3b,0x43,0xff,0x68,0x55,0x60,0xff,0x9a,0x78,0x72,0xff,0xa1,0x7f,0x73,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0xa3,0x7e,0x70,0xfe,0x7a, 0x62,0x70,0xfc,0x99,0x7a,0x78,0xf8,0x88,0x6b,0x60,0xf0,0x1f,0x19,0x16,0xe1,0x00, 0x00,0x00,0xc7,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xa2,0x00, 0x00,0x00,0xbf,0x07,0x07,0x07,0xd4,0x49,0x44,0x42,0xe5,0xa8,0x95,0x8f,0xf0,0xba, 0x9d,0x92,0xf7,0xab,0x8b,0x81,0xfb,0xaa,0x8b,0x81,0xfe,0xaa,0x8b,0x81,0xfe,0xab, 0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xaf,0x8e,0x83,0xff,0xa3,0x80,0x77,0xff,0x6b, 0x5a,0x56,0xff,0x34,0x39,0x3b,0xff,0x30,0x36,0x31,0xff,0x25,0x2a,0x27,0xff,0x16, 0x1c,0x19,0xff,0x1b,0x20,0x1c,0xff,0x23,0x26,0x24,0xff,0x4d,0x44,0x45,0xff,0x98, 0x79,0x7e,0xff,0xad,0x8c,0x7e,0xff,0xad,0x8d,0x83,0xff,0xab,0x8c,0x80,0xff,0xad, 0x8e,0x83,0xff,0xad,0x8e,0x84,0xff,0xac,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xab, 0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xb2,0x92,0x85,0xff,0x91,0x77,0x7c,0xff,0x84, 0x6c,0x76,0xff,0xb1,0x91,0x84,0xff,0xab,0x8c,0x82,0xff,0xac,0x8d,0x82,0xff,0xae, 0x8f,0x82,0xff,0x95,0x78,0x7a,0xff,0x88,0x67,0x70,0xff,0xa9,0x87,0x7e,0xff,0xb2, 0x95,0x89,0xff,0xac,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xab,0x8d,0x83,0xff,0xad, 0x90,0x83,0xff,0xb1,0x8f,0x85,0xff,0x9b,0x7a,0x72,0xff,0x55,0x4c,0x48,0xff,0x27, 0x31,0x2b,0xff,0x27,0x31,0x27,0xff,0x29,0x32,0x29,0xff,0x29,0x32,0x29,0xff,0x28, 0x31,0x28,0xff,0x1a,0x25,0x1d,0xff,0x37,0x33,0x36,0xff,0xa4,0x8f,0x8d,0xff,0xc0, 0xa5,0x9b,0xff,0xab,0x8d,0x82,0xff,0xab,0x8d,0x82,0xff,0xab,0x8c,0x83,0xff,0xab, 0x8c,0x82,0xff,0xac,0x8d,0x83,0xff,0xab,0x8d,0x82,0xff,0xac,0x8d,0x83,0xff,0xac, 0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xab, 0x8c,0x82,0xff,0xac,0x8c,0x82,0xff,0xac,0x8d,0x83,0xff,0xb4,0x98,0x8f,0xff,0xaf, 0x91,0x87,0xff,0xad,0x8f,0x83,0xff,0xaf,0x8a,0x85,0xff,0x53,0x4b,0x49,0xff,0x2e, 0x35,0x30,0xff,0x33,0x39,0x34,0xff,0x21,0x2a,0x23,0xff,0x54,0x45,0x4b,0xff,0xae, 0x95,0x92,0xff,0xb3,0x97,0x8c,0xff,0xac,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xab, 0x8b,0x82,0xff,0xaa,0x8b,0x81,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xab, 0x8c,0x82,0xff,0xaa,0x8b,0x80,0xff,0xaa,0x8b,0x81,0xff,0xab,0x8c,0x82,0xff,0xab, 0x8b,0x82,0xff,0xaa,0x8b,0x80,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xab, 0x8c,0x81,0xff,0x97,0x72,0x68,0xff,0xb8,0x9d,0x94,0xff,0xb2,0x92,0x86,0xff,0x55, 0x4e,0x50,0xff,0x3c,0x3d,0x3c,0xff,0x3c,0x3e,0x3d,0xff,0x3d,0x3f,0x3e,0xff,0x30, 0x32,0x31,0xff,0x1e,0x24,0x21,0xff,0x77,0x5a,0x53,0xff,0xb1,0x96,0x8e,0xff,0xaa, 0x8c,0x81,0xff,0xa8,0x89,0x7f,0xff,0xa9,0x89,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa9, 0x89,0x7e,0xff,0xa9,0x89,0x7f,0xff,0xa8,0x89,0x7e,0xff,0xa9,0x89,0x7f,0xff,0xa7, 0x88,0x7d,0xff,0xa8,0x89,0x7e,0xff,0xa9,0x8a,0x7f,0xff,0x9d,0x7a,0x70,0xff,0x9f, 0x7c,0x71,0xff,0xa8,0x87,0x7d,0xff,0xa8,0x89,0x7e,0xff,0xa7,0x88,0x7d,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa5,0x86,0x7c,0xfe,0x1c,0x17,0x15,0xfb,0x00, 0x00,0x00,0xf9,0x02,0x02,0x02,0xf5,0x2c,0x2b,0x2c,0xf3,0x2f,0x2f,0x2f,0xf3,0x2f, 0x2f,0x2f,0xf5,0x34,0x32,0x34,0xf9,0x48,0x42,0x48,0xfc,0x5a,0x50,0x5b,0xfe,0x5d, 0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x5e,0x50,0x5c,0xff,0x62,0x4b,0x52,0xff,0x5f, 0x52,0x60,0xff,0x2a,0x31,0x2d,0xff,0x46,0x42,0x3e,0xff,0x73,0x5d,0x69,0xff,0x67, 0x56,0x61,0xff,0x4e,0x49,0x51,0xff,0x55,0x4d,0x55,0xff,0x8f,0x74,0x7e,0xff,0x99, 0x75,0x76,0xff,0x8a,0x64,0x6a,0xff,0x89,0x64,0x68,0xff,0x89,0x64,0x68,0xff,0x8b, 0x66,0x67,0xff,0x95,0x70,0x69,0xff,0xa4,0x85,0x79,0xff,0x9f,0x7d,0x72,0xff,0x9e, 0x7b,0x71,0xff,0xa2,0x80,0x76,0xff,0xa5,0x84,0x78,0xff,0x9f,0x7e,0x79,0xff,0x7b, 0x61,0x70,0xff,0x76,0x61,0x6d,0xff,0xa9,0x87,0x82,0xff,0xaa,0x89,0x7b,0xff,0xa2, 0x81,0x77,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x78,0xff,0xa3,0x82,0x77,0xff,0xa3, 0x82,0x77,0xff,0xa4,0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa4, 0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa2, 0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa4, 0x82,0x75,0xff,0x9d,0x7c,0x7a,0xff,0x6c,0x57,0x64,0xff,0x3a,0x33,0x38,0xff,0x41, 0x3f,0x45,0xff,0x53,0x4b,0x54,0xff,0x58,0x4e,0x59,0xff,0x56,0x4d,0x57,0xff,0x56, 0x4d,0x57,0xff,0x57,0x4e,0x58,0xff,0x57,0x4e,0x58,0xff,0x57,0x4d,0x57,0xff,0x58, 0x4e,0x58,0xff,0x58,0x4e,0x59,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x5b,0x50,0x5c,0xff,0x5e, 0x52,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x51,0x5e,0xff,0x59,0x4f,0x5e,0xff,0x77, 0x62,0x67,0xff,0xa2,0x80,0x77,0xff,0xac,0x8a,0x7e,0xff,0xa3,0x82,0x76,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7b,0x70,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e, 0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9e,0x7c,0x71,0xff,0x9f,0x7d,0x72,0xff,0xa5, 0x82,0x74,0xff,0x82,0x63,0x60,0xff,0x56,0x45,0x48,0xff,0x49,0x43,0x4f,0xff,0x73, 0x5e,0x60,0xff,0x9d,0x7c,0x70,0xff,0xa1,0x7e,0x72,0xff,0x9e,0x7b,0x70,0xff,0x9e, 0x7b,0x70,0xff,0xa8,0x81,0x75,0xfe,0x50,0x48,0x48,0xfd,0x95,0x81,0x7c,0xfc,0xb1, 0x8c,0x81,0xf8,0x76,0x5a,0x52,0xee,0x13,0x0f,0x0e,0xdd,0x00,0x00,0x00,0xc4,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0xa8,0x00,0x00,0x00,0xc5,0x13,0x13,0x12,0xdb,0x72,0x65,0x5e,0xe9,0xce, 0xb5,0xae,0xf4,0xbb,0x99,0x8e,0xfa,0xa8,0x89,0x7f,0xfd,0xab,0x8c,0x82,0xfe,0xab, 0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xad,0x8f,0x83,0xff,0xaf,0x8e,0x84,0xff,0x97, 0x75,0x73,0xff,0x56,0x49,0x47,0xff,0x2c,0x35,0x32,0xff,0x35,0x3a,0x36,0xff,0x28, 0x2e,0x2b,0xff,0x28,0x27,0x23,0xff,0x4b,0x3e,0x3f,0xff,0x3d,0x37,0x3d,0xff,0x63, 0x52,0x49,0xff,0xab,0x8b,0x82,0xff,0xb1,0x92,0x86,0xff,0xac,0x8d,0x83,0xff,0xac, 0x8e,0x83,0xff,0xac,0x8e,0x84,0xff,0xac,0x8d,0x83,0xff,0xac,0x8e,0x83,0xff,0xac, 0x8d,0x83,0xff,0xac,0x8e,0x83,0xff,0xac,0x8e,0x83,0xff,0xad,0x90,0x84,0xff,0xaf, 0x8d,0x82,0xff,0x76,0x61,0x62,0xff,0x6e,0x60,0x61,0xff,0xb6,0x95,0x89,0xff,0xad, 0x8e,0x85,0xff,0xad,0x8f,0x85,0xff,0xac,0x8e,0x84,0xff,0xa6,0x85,0x7a,0xff,0xaa, 0x8a,0x7e,0xff,0xb0,0x93,0x88,0xff,0xac,0x8d,0x83,0xff,0xad,0x8e,0x84,0xff,0xae, 0x90,0x86,0xff,0xb2,0x94,0x87,0xff,0xb3,0x91,0x8c,0xff,0x88,0x6a,0x6d,0xff,0x3d, 0x3a,0x37,0xff,0x21,0x2e,0x26,0xff,0x29,0x32,0x29,0xff,0x29,0x32,0x29,0xff,0x28, 0x31,0x28,0xff,0x2a,0x32,0x2a,0xff,0x1c,0x26,0x1d,0xff,0x21,0x21,0x1a,0xff,0x91, 0x7d,0x75,0xff,0xc3,0xa8,0x9f,0xff,0xb1,0x95,0x8b,0xff,0xae,0x90,0x85,0xff,0xaf, 0x91,0x86,0xff,0xaf,0x91,0x86,0xff,0xad,0x8e,0x84,0xff,0xae,0x8f,0x85,0xff,0xae, 0x90,0x85,0xff,0xae,0x90,0x86,0xff,0xad,0x8e,0x85,0xff,0xae,0x8f,0x84,0xff,0xae, 0x8f,0x85,0xff,0xb1,0x95,0x8b,0xff,0xb3,0x97,0x8e,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x92,0x88,0xff,0xb0,0x91,0x85,0xff,0xb0,0x93,0x87,0xff,0xbb,0x9a,0x8b,0xff,0x81, 0x69,0x71,0xff,0x3e,0x3e,0x40,0xff,0x32,0x38,0x32,0xff,0x36,0x3b,0x36,0xff,0x16, 0x1e,0x1e,0xff,0x95,0x7f,0x76,0xff,0xb7,0x99,0x8f,0xff,0xae,0x8f,0x85,0xff,0xac, 0x8e,0x83,0xff,0xac,0x8e,0x83,0xff,0xab,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xad, 0x8f,0x84,0xff,0xab,0x8d,0x82,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xab, 0x8c,0x82,0xff,0xac,0x8d,0x83,0xff,0xac,0x8e,0x83,0xff,0xac,0x8d,0x83,0xff,0xac, 0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xac,0x8e,0x84,0xff,0xa1,0x7f,0x71,0xff,0x9b, 0x77,0x6c,0xff,0xa4,0x7d,0x72,0xff,0x42,0x42,0x3e,0xff,0x3a,0x3c,0x3a,0xff,0x3b, 0x3d,0x3b,0xff,0x3c,0x3e,0x3c,0xff,0x2b,0x2c,0x2b,0xff,0x15,0x1e,0x17,0xff,0x9b, 0x7e,0x74,0xff,0xb3,0x98,0x8f,0xff,0xab,0x8c,0x81,0xff,0xaa,0x8b,0x81,0xff,0xa9, 0x89,0x7f,0xff,0xaa,0x8b,0x80,0xff,0xa9,0x89,0x7f,0xff,0xaa,0x8b,0x81,0xff,0xa9, 0x8a,0x80,0xff,0xab,0x8c,0x82,0xff,0xa9,0x8a,0x80,0xff,0xa9,0x8a,0x80,0xff,0xac, 0x8e,0x82,0xff,0x9a,0x77,0x6c,0xff,0xac,0x8e,0x83,0xff,0xa9,0x89,0x7f,0xff,0xa9, 0x8a,0x80,0xff,0xaa,0x8b,0x80,0xff,0xa8,0x88,0x7e,0xff,0xa9,0x89,0x7f,0xfe,0xa6, 0x89,0x7e,0xfc,0x25,0x1f,0x1b,0xf8,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xe8,0x00, 0x00,0x00,0xe4,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xea,0x03,0x03,0x03,0xf2,0x2f, 0x2b,0x30,0xf8,0x5e,0x52,0x5e,0xfb,0x5d,0x51,0x5d,0xfe,0x5e,0x52,0x5e,0xff,0x5b, 0x4f,0x5b,0xff,0x37,0x35,0x3a,0xff,0x47,0x44,0x46,0xff,0x83,0x65,0x77,0xff,0x92, 0x6a,0x6e,0xff,0x8f,0x69,0x67,0xff,0x8e,0x68,0x6b,0xff,0x77,0x5e,0x6f,0xff,0x4c, 0x48,0x48,0xff,0xb5,0x90,0x80,0xff,0xa9,0x8b,0x83,0xff,0x86,0x61,0x65,0xff,0x89, 0x64,0x68,0xff,0x89,0x64,0x68,0xff,0x8d,0x68,0x68,0xff,0xa2,0x81,0x78,0xff,0xba, 0xa0,0x97,0xff,0xa5,0x84,0x7a,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x85,0x7b,0xff,0xa5, 0x84,0x7a,0xff,0xa7,0x86,0x7a,0xff,0x88,0x6d,0x64,0xff,0x3c,0x3b,0x45,0xff,0x78, 0x62,0x70,0xff,0xaa,0x88,0x86,0xff,0xac,0x8b,0x7d,0xff,0xa4,0x83,0x7a,0xff,0xa5, 0x85,0x7b,0xff,0xa4,0x83,0x79,0xff,0xa5,0x84,0x79,0xff,0xa5,0x84,0x79,0xff,0xa5, 0x84,0x79,0xff,0xa4,0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa4, 0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa3, 0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa4,0x83,0x76,0xff,0xa4, 0x7f,0x77,0xff,0x84,0x65,0x66,0xff,0x50,0x44,0x49,0xff,0x44,0x3e,0x4a,0xff,0x56, 0x4d,0x56,0xff,0x58,0x4f,0x59,0xff,0x56,0x4d,0x57,0xff,0x57,0x4e,0x58,0xff,0x58, 0x4e,0x59,0xff,0x5a,0x4f,0x5b,0xff,0x59,0x4e,0x5a,0xff,0x58,0x4e,0x59,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x5c, 0x51,0x5d,0xff,0x5d,0x51,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5f, 0x52,0x60,0xff,0x5f,0x52,0x5f,0xff,0x58,0x4e,0x5d,0xff,0x69,0x54,0x5d,0xff,0x93, 0x73,0x76,0xff,0xac,0x8c,0x85,0xff,0xa8,0x87,0x79,0xff,0xa0,0x7d,0x73,0xff,0x9e, 0x7b,0x70,0xff,0x9e,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0xa0,0x7e,0x73,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9f, 0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0x9e,0x7c,0x71,0xff,0xa5,0x82,0x76,0xff,0x94, 0x72,0x66,0xff,0x84,0x68,0x69,0xff,0x6a,0x56,0x65,0xff,0x83,0x69,0x71,0xff,0x9e, 0x7e,0x75,0xff,0x9f,0x7e,0x71,0xff,0x9e,0x7b,0x70,0xff,0xaa,0x82,0x76,0xff,0x40, 0x3e,0x3c,0xfe,0x8e,0x7d,0x77,0xfe,0xab,0x88,0x7e,0xfb,0xaa,0x84,0x79,0xf7,0x6a, 0x53,0x4b,0xed,0x0f,0x0c,0x0b,0xdc,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0xa2,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x95,0x00,0x00,0x00,0xb1,0x03,0x03,0x04,0xc9,0x28,0x25,0x24,0xdf,0x73, 0x5c,0x5a,0xed,0x91,0x7a,0x80,0xf5,0x6b,0x63,0x5b,0xfa,0x8a,0x74,0x6e,0xfd,0xb7, 0x95,0x89,0xfe,0xac,0x8e,0x83,0xff,0xac,0x8e,0x83,0xff,0xaf,0x90,0x85,0xff,0xaf, 0x8f,0x88,0xff,0x89,0x6e,0x76,0xff,0x49,0x41,0x43,0xff,0x29,0x33,0x2d,0xff,0x34, 0x39,0x34,0xff,0x31,0x36,0x32,0xff,0x23,0x26,0x27,0xff,0x62,0x55,0x56,0xff,0xb7, 0x97,0x93,0xff,0x9b,0x7e,0x81,0xff,0xb2,0x8d,0x80,0xff,0xb1,0x92,0x88,0xff,0xae, 0x90,0x86,0xff,0xad,0x8e,0x84,0xff,0xae,0x90,0x86,0xff,0xae,0x90,0x86,0xff,0xae, 0x8f,0x85,0xff,0xad,0x90,0x85,0xff,0xae,0x90,0x86,0xff,0xad,0x90,0x85,0xff,0xae, 0x91,0x86,0xff,0xb2,0x94,0x87,0xff,0x9c,0x7d,0x7d,0xff,0x66,0x50,0x61,0xff,0x7e, 0x6b,0x6d,0xff,0xb7,0x97,0x8a,0xff,0xaf,0x91,0x87,0xff,0xaf,0x90,0x87,0xff,0xae, 0x90,0x87,0xff,0xae,0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xae,0x90,0x86,0xff,0xaf, 0x91,0x87,0xff,0xae,0x91,0x87,0xff,0xb5,0x96,0x89,0xff,0xae,0x8e,0x8a,0xff,0x7a, 0x62,0x6c,0xff,0x38,0x38,0x38,0xff,0x23,0x2f,0x26,0xff,0x2b,0x33,0x2b,0xff,0x2a, 0x32,0x2a,0xff,0x29,0x32,0x2a,0xff,0x2a,0x33,0x2a,0xff,0x23,0x2c,0x23,0xff,0x19, 0x1e,0x1f,0xff,0x73,0x61,0x60,0xff,0xc1,0xa6,0x9d,0xff,0xb7,0x9c,0x93,0xff,0xb1, 0x93,0x89,0xff,0xb2,0x95,0x8a,0xff,0xb3,0x95,0x89,0xff,0xb1,0x94,0x88,0xff,0xb0, 0x94,0x8a,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xad,0x8f,0x85,0xff,0xa9, 0x89,0x7e,0xff,0xad,0x8e,0x84,0xff,0xb1,0x95,0x8b,0xff,0xb5,0x99,0x8f,0xff,0xb6, 0x9b,0x93,0xff,0xb4,0x98,0x8e,0xff,0xb4,0x96,0x89,0xff,0xa1,0x84,0x83,0xff,0x9a, 0x78,0x77,0xff,0x9e,0x7e,0x81,0xff,0x4b,0x48,0x47,0xff,0x30,0x36,0x32,0xff,0x35, 0x3a,0x35,0xff,0x2a,0x30,0x2d,0xff,0x3e,0x31,0x31,0xff,0xac,0x96,0x90,0xff,0xb6, 0x99,0x90,0xff,0xae,0x90,0x86,0xff,0xae,0x90,0x85,0xff,0xad,0x8f,0x85,0xff,0xae, 0x91,0x86,0xff,0xad,0x8f,0x85,0xff,0xad,0x8f,0x85,0xff,0xad,0x8f,0x85,0xff,0xad, 0x8e,0x84,0xff,0xad,0x8e,0x84,0xff,0xad,0x8f,0x85,0xff,0xad,0x8e,0x84,0xff,0xae, 0x90,0x85,0xff,0xac,0x8e,0x83,0xff,0xae,0x90,0x85,0xff,0xac,0x8d,0x83,0xff,0xaf, 0x91,0x85,0xff,0x98,0x77,0x79,0xff,0xa3,0x82,0x78,0xff,0x93,0x6f,0x75,0xff,0x42, 0x40,0x3f,0xff,0x3b,0x3d,0x3b,0xff,0x3b,0x3d,0x3b,0xff,0x39,0x3a,0x39,0xff,0x29, 0x2a,0x29,0xff,0x13,0x1b,0x15,0xff,0xaa,0x92,0x89,0xff,0xb2,0x95,0x8b,0xff,0xab, 0x8c,0x82,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xac, 0x8e,0x83,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xab,0x8c,0x82,0xff,0xaa, 0x8b,0x81,0xff,0xaa,0x8b,0x82,0xff,0x98,0x76,0x74,0xff,0xa6,0x86,0x7c,0xff,0xad, 0x8f,0x85,0xff,0xab,0x8c,0x82,0xff,0xaa,0x8b,0x80,0xff,0xaa,0x8b,0x80,0xff,0xaa, 0x8b,0x81,0xff,0xab,0x8c,0x82,0xfd,0xa7,0x89,0x7f,0xfa,0x2b,0x23,0x21,0xf3,0x00, 0x00,0x00,0xe6,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0xd0,0x00, 0x00,0x00,0xda,0x02,0x02,0x02,0xe8,0x27,0x24,0x27,0xf3,0x61,0x54,0x61,0xfa,0x5d, 0x51,0x5e,0xfd,0x61,0x53,0x61,0xff,0x5b,0x4f,0x5b,0xff,0x2b,0x2f,0x2a,0xff,0x56, 0x4d,0x54,0xff,0x91,0x68,0x6d,0xff,0x8d,0x68,0x68,0xff,0x8b,0x66,0x68,0xff,0x8c, 0x66,0x68,0xff,0x82,0x61,0x64,0xff,0x58,0x4d,0x53,0xff,0x8f,0x6c,0x70,0xff,0x99, 0x75,0x6a,0xff,0x88,0x63,0x68,0xff,0x8a,0x65,0x68,0xff,0x8a,0x64,0x67,0xff,0x90, 0x6b,0x6e,0xff,0xb6,0x9b,0x90,0xff,0xac,0x8e,0x84,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa7,0x86,0x7c,0xff,0xa8,0x88,0x7d,0xff,0x9a, 0x7b,0x77,0xff,0x53,0x44,0x4e,0xff,0x38,0x39,0x3b,0xff,0x6e,0x5c,0x69,0xff,0xa6, 0x85,0x86,0xff,0xad,0x8c,0x7e,0xff,0xa5,0x84,0x7b,0xff,0xa5,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa4,0x83,0x79,0xff,0xa5, 0x84,0x79,0xff,0xa4,0x83,0x79,0xff,0xa5,0x84,0x79,0xff,0xa5,0x84,0x79,0xff,0xa4, 0x83,0x79,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa4,0x83,0x78,0xff,0xa4, 0x83,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x83,0x77,0xff,0xa6,0x83,0x75,0xff,0x95, 0x73,0x6b,0xff,0x5c,0x4c,0x53,0xff,0x3f,0x39,0x44,0xff,0x50,0x49,0x51,0xff,0x5b, 0x50,0x5a,0xff,0x58,0x4e,0x59,0xff,0x59,0x4f,0x5a,0xff,0x5b,0x50,0x5d,0xff,0x5b, 0x50,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x5a,0x50,0x5b,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x5a,0x50,0x5b,0xff,0x5d,0x51,0x5e,0xff,0x5d,0x51,0x5e,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5f,0x53,0x60,0xff,0x60,0x53,0x60,0xff,0x60, 0x53,0x60,0xff,0x5d,0x51,0x5f,0xff,0x63,0x53,0x65,0xff,0x82,0x69,0x77,0xff,0xa5, 0x87,0x80,0xff,0xac,0x8b,0x7e,0xff,0xa1,0x81,0x76,0xff,0x9f,0x7d,0x72,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa4,0x81,0x76,0xff,0xa6,0x83,0x75,0xff,0x9b, 0x77,0x71,0xff,0x8a,0x6a,0x72,0xff,0x97,0x75,0x71,0xff,0xa0,0x7d,0x72,0xff,0x9e, 0x7c,0x71,0xff,0xa2,0x7f,0x73,0xff,0x7e,0x68,0x65,0xff,0x92,0x74,0x6c,0xff,0xb1, 0x94,0x88,0xfe,0xa5,0x85,0x7a,0xfb,0xa8,0x84,0x79,0xf6,0x66,0x4f,0x48,0xec,0x0e, 0x0a,0x0a,0xda,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x02,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,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xbd,0x08,0x09,0x08,0xd1,0x53, 0x50,0x4f,0xe2,0xae,0x9c,0x95,0xef,0xad,0x8a,0x83,0xf7,0x87,0x70,0x75,0xfb,0x52, 0x4f,0x48,0xfe,0x2d,0x33,0x33,0xfe,0x92,0x7a,0x79,0xff,0xb4,0x96,0x8b,0xff,0xb2, 0x93,0x87,0xff,0xab,0x8b,0x84,0xff,0x77,0x63,0x6d,0xff,0x3f,0x3d,0x45,0xff,0x2c, 0x35,0x2e,0xff,0x34,0x39,0x33,0xff,0x34,0x38,0x35,0xff,0x26,0x2c,0x29,0xff,0x44, 0x40,0x41,0xff,0xaf,0x96,0x95,0xff,0xc3,0xa9,0x9e,0xff,0xb3,0x95,0x89,0xff,0xaf, 0x91,0x88,0xff,0xae,0x90,0x86,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x91,0x87,0xff,0xaf,0x90,0x86,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x91,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf,0x93,0x89,0xff,0xb4,0x96,0x8b,0xff,0x9d, 0x7e,0x80,0xff,0x61,0x4e,0x5f,0xff,0x7a,0x6a,0x6a,0xff,0xb9,0x9a,0x8f,0xff,0xaf, 0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xae,0x91,0x87,0xff,0xae,0x91,0x87,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf,0x92,0x88,0xff,0xb6,0x95,0x8a,0xff,0xa1, 0x83,0x7f,0xff,0x65,0x57,0x60,0xff,0x30,0x35,0x34,0xff,0x29,0x31,0x29,0xff,0x2e, 0x35,0x2e,0xff,0x2c,0x34,0x2c,0xff,0x2a,0x33,0x2b,0xff,0x2a,0x34,0x2b,0xff,0x2a, 0x32,0x2a,0xff,0x14,0x1e,0x18,0xff,0x49,0x42,0x44,0xff,0xb9,0xa5,0xa1,0xff,0xca, 0xb2,0xa6,0xff,0xad,0x8d,0x7f,0xff,0x9e,0x7b,0x75,0xff,0x9c,0x78,0x74,0xff,0x93, 0x74,0x7a,0xff,0x9b,0x7d,0x7b,0xff,0xa8,0x88,0x7d,0xff,0xaf,0x91,0x88,0xff,0xb3, 0x98,0x8f,0xff,0xb4,0x98,0x8f,0xff,0xb3,0x98,0x8e,0xff,0xa6,0x87,0x7c,0xff,0x9f, 0x7c,0x71,0xff,0xa5,0x83,0x79,0xff,0xa6,0x86,0x7b,0xff,0xa2,0x81,0x76,0xff,0x9e, 0x7a,0x73,0xff,0x76,0x5c,0x6f,0xff,0x96,0x76,0x7b,0xff,0x72,0x5e,0x68,0xff,0x39, 0x3b,0x3c,0xff,0x32,0x38,0x33,0xff,0x37,0x3c,0x37,0xff,0x12,0x1a,0x16,0xff,0x8b, 0x78,0x71,0xff,0xbc,0xa0,0x97,0xff,0xb0,0x94,0x89,0xff,0xae,0x91,0x87,0xff,0xaf, 0x92,0x88,0xff,0xae,0x91,0x87,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xae,0x90,0x85,0xff,0xaf, 0x91,0x87,0xff,0xad,0x8f,0x85,0xff,0xb1,0x93,0x86,0xff,0x7d,0x60,0x6d,0xff,0xac, 0x8f,0x85,0xff,0x80,0x67,0x7a,0xff,0x41,0x40,0x41,0xff,0x3a,0x3d,0x3a,0xff,0x3b, 0x3d,0x3b,0xff,0x34,0x35,0x34,0xff,0x22,0x24,0x22,0xff,0x2e,0x2e,0x30,0xff,0xb3, 0x9d,0x95,0xff,0xb1,0x93,0x89,0xff,0xad,0x8e,0x84,0xff,0xad,0x8f,0x84,0xff,0xad, 0x8e,0x83,0xff,0xad,0x8f,0x85,0xff,0xae,0x90,0x85,0xff,0xac,0x8e,0x83,0xff,0xac, 0x8e,0x83,0xff,0xad,0x8e,0x84,0xff,0xad,0x8e,0x84,0xff,0xae,0x90,0x85,0xff,0x95, 0x71,0x6e,0xff,0xad,0x8f,0x85,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xa9, 0x8a,0x80,0xff,0xa9,0x8a,0x80,0xff,0xab,0x8c,0x82,0xfe,0xaa,0x8b,0x81,0xfd,0xa7, 0x89,0x7f,0xf7,0x35,0x2b,0x28,0xed,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0xc9,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xc8,0x01,0x01,0x01,0xdc,0x1d, 0x1b,0x1d,0xed,0x62,0x56,0x62,0xf7,0x5f,0x52,0x5f,0xfc,0x62,0x54,0x62,0xfe,0x5d, 0x50,0x5c,0xff,0x12,0x20,0x14,0xff,0x58,0x4c,0x55,0xff,0x90,0x68,0x69,0xff,0x8d, 0x68,0x68,0xff,0x8b,0x65,0x68,0xff,0x8a,0x65,0x68,0xff,0x8c,0x66,0x6a,0xff,0x8a, 0x68,0x75,0xff,0x6f,0x5d,0x6d,0xff,0xa3,0x7f,0x73,0xff,0x89,0x64,0x67,0xff,0x8a, 0x65,0x68,0xff,0x88,0x62,0x66,0xff,0x98,0x76,0x70,0xff,0xb6,0x9b,0x8f,0xff,0xaa, 0x8a,0x7e,0xff,0xa7,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa8,0x87,0x7e,0xff,0xa7, 0x87,0x7d,0xff,0xa8,0x88,0x7d,0xff,0xa7,0x85,0x7c,0xff,0x7e,0x62,0x61,0xff,0x2c, 0x2d,0x30,0xff,0x44,0x43,0x47,0xff,0x66,0x57,0x65,0xff,0xa0,0x83,0x85,0xff,0xb3, 0x94,0x87,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa5, 0x84,0x78,0xff,0xa4,0x84,0x79,0xff,0xa5,0x84,0x79,0xff,0xa4,0x83,0x78,0xff,0xa4, 0x84,0x79,0xff,0xa5,0x85,0x7a,0xff,0xaa,0x87,0x7b,0xff,0x9c,0x7b,0x71,0xff,0x6c, 0x55,0x59,0xff,0x4c,0x41,0x4c,0xff,0x50,0x48,0x52,0xff,0x5b,0x51,0x5c,0xff,0x5a, 0x50,0x5b,0xff,0x5e,0x52,0x5e,0xff,0x57,0x4e,0x57,0xff,0x4a,0x46,0x4b,0xff,0x52, 0x4a,0x53,0xff,0x5c,0x50,0x5d,0xff,0x5a,0x4f,0x5b,0xff,0x5c,0x51,0x5d,0xff,0x5f, 0x53,0x60,0xff,0x5f,0x53,0x5f,0xff,0x5f,0x52,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5f, 0x53,0x60,0xff,0x60,0x53,0x60,0xff,0x60,0x53,0x60,0xff,0x61,0x54,0x61,0xff,0x61, 0x53,0x61,0xff,0x5f,0x51,0x64,0xff,0x74,0x60,0x6e,0xff,0x9c,0x7d,0x76,0xff,0xae, 0x8d,0x7f,0xff,0xa6,0x86,0x7c,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0xa0,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0x9f,0x7d,0x72,0xff,0x9f,0x7d,0x72,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa2,0x80,0x74,0xff,0xa1,0x7d,0x70,0xff,0x9e, 0x7b,0x6f,0xff,0x9e,0x7c,0x71,0xff,0xa0,0x7e,0x73,0xff,0x9e,0x7d,0x72,0xff,0xa6, 0x82,0x76,0xff,0xa0,0x7c,0x70,0xff,0x9b,0x7a,0x77,0xff,0xa4,0x84,0x7b,0xfe,0xac, 0x83,0x78,0xfb,0x6a,0x5b,0x51,0xf5,0x3c,0x32,0x2d,0xea,0x0a,0x08,0x07,0xd7,0x00, 0x00,0x00,0xba,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xc7,0x11, 0x10,0x10,0xdb,0x7c,0x74,0x71,0xe9,0xc1,0xad,0xa6,0xf2,0xc2,0xa7,0x9d,0xf9,0xb0, 0x93,0x89,0xfc,0xb8,0x97,0x8b,0xff,0xae,0x90,0x86,0xff,0x70,0x60,0x5e,0xff,0x73, 0x5f,0x6d,0xff,0xb7,0x94,0x85,0xff,0x9d,0x81,0x79,0xff,0x5f,0x54,0x5a,0xff,0x37, 0x38,0x3c,0xff,0x31,0x37,0x32,0xff,0x35,0x3a,0x36,0xff,0x35,0x3b,0x36,0xff,0x2e, 0x34,0x31,0xff,0x35,0x32,0x2d,0xff,0x9d,0x80,0x77,0xff,0xc9,0xaf,0xa5,0xff,0xae, 0x92,0x87,0xff,0xaf,0x93,0x88,0xff,0xaf,0x91,0x88,0xff,0xaf,0x92,0x88,0xff,0xb0, 0x93,0x89,0xff,0xb0,0x93,0x89,0xff,0xb0,0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x93,0x89,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x93,0x89,0xff,0xb0,0x93,0x89,0xff,0xb0, 0x93,0x89,0xff,0xb2,0x96,0x8c,0xff,0xab,0x88,0x7f,0xff,0x60,0x4e,0x4b,0xff,0x63, 0x5b,0x55,0xff,0xbd,0x9b,0x8f,0xff,0xaf,0x93,0x89,0xff,0xb0,0x94,0x8a,0xff,0xb0, 0x93,0x89,0xff,0xb1,0x94,0x8a,0xff,0xb0,0x95,0x8b,0xff,0xb2,0x96,0x8c,0xff,0xb5, 0x94,0x89,0xff,0x8d,0x73,0x6e,0xff,0x4a,0x46,0x49,0xff,0x2c,0x32,0x2f,0xff,0x2c, 0x33,0x2b,0xff,0x30,0x35,0x30,0xff,0x2d,0x34,0x2d,0xff,0x2c,0x34,0x2c,0xff,0x2d, 0x34,0x2e,0xff,0x2a,0x32,0x2b,0xff,0x1b,0x26,0x1f,0xff,0x37,0x30,0x29,0xff,0xa6, 0x90,0x85,0xff,0xaf,0x99,0x9b,0xff,0x85,0x6e,0x7c,0xff,0x88,0x69,0x75,0xff,0x91, 0x6c,0x6c,0xff,0x96,0x71,0x69,0xff,0x9b,0x7d,0x7d,0xff,0xa6,0x88,0x83,0xff,0xab, 0x8c,0x81,0xff,0xaf,0x92,0x89,0xff,0xb2,0x97,0x8d,0xff,0xb4,0x99,0x90,0xff,0xb7, 0x9d,0x94,0xff,0xad,0x8f,0x85,0xff,0xa6,0x86,0x7c,0xff,0xab,0x8d,0x83,0xff,0xab, 0x8e,0x83,0xff,0xa7,0x88,0x7e,0xff,0x9f,0x7d,0x76,0xff,0x9a,0x7f,0x7f,0xff,0xaa, 0x86,0x81,0xff,0x58,0x4f,0x4b,0xff,0x31,0x37,0x33,0xff,0x34,0x39,0x35,0xff,0x30, 0x36,0x31,0xff,0x30,0x27,0x2e,0xff,0xb2,0xa2,0xa0,0xff,0xbe,0xa5,0x9c,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xb0,0x93,0x89,0xff,0xb0,0x94,0x8a,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xb0,0x94,0x8a,0xff,0xb0, 0x93,0x89,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x92,0x88,0xff,0xb1,0x94,0x8a,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xb3, 0x96,0x8b,0xff,0x7d,0x61,0x69,0xff,0xb2,0x91,0x88,0xff,0x57,0x50,0x55,0xff,0x3e, 0x3e,0x3f,0xff,0x3a,0x3c,0x3a,0xff,0x3a,0x3d,0x3b,0xff,0x32,0x34,0x33,0xff,0x1c, 0x1f,0x1d,0xff,0x5c,0x4b,0x5e,0xff,0xb5,0x9d,0x96,0xff,0xb0,0x94,0x8a,0xff,0xaf, 0x91,0x87,0xff,0xae,0x90,0x85,0xff,0xae,0x90,0x85,0xff,0xae,0x90,0x86,0xff,0xaf, 0x91,0x87,0xff,0xaf,0x91,0x86,0xff,0xaf,0x91,0x86,0xff,0xae,0x90,0x85,0xff,0xae, 0x90,0x86,0xff,0x9e,0x7b,0x71,0xff,0xa9,0x89,0x7e,0xff,0xae,0x90,0x85,0xff,0xac, 0x8d,0x83,0xff,0xad,0x8e,0x84,0xff,0xab,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xac, 0x8d,0x83,0xfe,0xac,0x8e,0x83,0xfb,0xa9,0x8c,0x81,0xf5,0x3c,0x31,0x2d,0xe8,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0xd0,0x12,0x10,0x12,0xe6,0x63,0x56,0x64,0xf3,0x63, 0x54,0x62,0xfb,0x66,0x56,0x65,0xfd,0x5c,0x50,0x5d,0xff,0x2b,0x31,0x2c,0xff,0x60, 0x4d,0x5c,0xff,0x94,0x6d,0x68,0xff,0x8e,0x68,0x67,0xff,0x8b,0x66,0x68,0xff,0x8b, 0x66,0x68,0xff,0x8b,0x65,0x68,0xff,0x84,0x62,0x66,0xff,0x6a,0x59,0x6a,0xff,0x93, 0x6d,0x6c,0xff,0x8b,0x66,0x68,0xff,0x97,0x73,0x6b,0xff,0x9a,0x78,0x71,0xff,0x9b, 0x77,0x6c,0xff,0x94,0x70,0x6d,0xff,0x97,0x75,0x72,0xff,0xab,0x8c,0x80,0xff,0xa8, 0x89,0x7e,0xff,0xa9,0x89,0x7f,0xff,0xa8,0x89,0x7e,0xff,0xa9,0x8a,0x7f,0xff,0xac, 0x8c,0x80,0xff,0x95,0x79,0x73,0xff,0x47,0x3e,0x4c,0xff,0x47,0x43,0x48,0xff,0x58, 0x4e,0x5a,0xff,0x6f,0x5c,0x6f,0xff,0x9b,0x81,0x86,0xff,0xb6,0x98,0x8a,0xff,0xa6, 0x86,0x7b,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa7,0x86,0x7c,0xff,0xa4,0x82,0x77,0xff,0x9d, 0x7a,0x70,0xff,0x9b,0x78,0x6d,0xff,0x9a,0x75,0x6c,0xff,0x9a,0x75,0x6e,0xff,0x9d, 0x79,0x6e,0xff,0x98,0x77,0x75,0xff,0x83,0x68,0x7a,0xff,0x6e,0x55,0x63,0xff,0x56, 0x44,0x49,0xff,0x4d,0x46,0x52,0xff,0x5b,0x51,0x5c,0xff,0x43,0x42,0x43,0xff,0x40, 0x40,0x40,0xff,0x54,0x4c,0x55,0xff,0x52,0x4a,0x52,0xff,0x57,0x4e,0x58,0xff,0x5f, 0x53,0x60,0xff,0x5e,0x52,0x5f,0xff,0x5f,0x53,0x60,0xff,0x60,0x53,0x60,0xff,0x5f, 0x53,0x60,0xff,0x60,0x53,0x61,0xff,0x61,0x54,0x61,0xff,0x60,0x54,0x60,0xff,0x60, 0x53,0x60,0xff,0x62,0x54,0x62,0xff,0x63,0x55,0x63,0xff,0x62,0x55,0x63,0xff,0x60, 0x52,0x64,0xff,0x6d,0x59,0x68,0xff,0x8d,0x6d,0x6c,0xff,0xad,0x8c,0x82,0xff,0xac, 0x8d,0x83,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa0,0x7e,0x73,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa0, 0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa0,0x7e,0x73,0xff,0xa1,0x80,0x74,0xff,0x99, 0x76,0x6d,0xff,0x98,0x74,0x78,0xfe,0x63,0x54,0x53,0xfe,0x55,0x4b,0x57,0xfb,0x92, 0x75,0x70,0xf4,0x43,0x35,0x2f,0xe8,0x05,0x04,0x03,0xd3,0x00,0x00,0x00,0xb6,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x5c,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0xce,0x28,0x27,0x26,0xe1,0x9d,0x91,0x8d,0xee,0xc0,0xa7,0x9f,0xf6,0xb7, 0x99,0x8f,0xfa,0xac,0x8f,0x85,0xfe,0xae,0x90,0x86,0xfe,0xaf,0x92,0x88,0xff,0xb3, 0x94,0x89,0xff,0xa9,0x8a,0x87,0xff,0x69,0x56,0x6c,0xff,0x7c,0x65,0x67,0xff,0x80, 0x63,0x5f,0xff,0x2b,0x33,0x33,0xff,0x33,0x38,0x33,0xff,0x37,0x3a,0x37,0xff,0x35, 0x3a,0x36,0xff,0x32,0x37,0x33,0xff,0x33,0x32,0x35,0xff,0x80,0x6d,0x76,0xff,0xd1, 0xb6,0xab,0xff,0xb5,0x9a,0x91,0xff,0xaf,0x93,0x89,0xff,0xb1,0x95,0x8b,0xff,0xb0, 0x94,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb0, 0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x95,0x8b,0xff,0xb2,0x96,0x8c,0xff,0xb2,0x96,0x8c,0xff,0xb2,0x96,0x8d,0xff,0xb1, 0x91,0x85,0xff,0x89,0x6e,0x6f,0xff,0x58,0x4d,0x5b,0xff,0x85,0x72,0x6f,0xff,0xb9, 0x9c,0x91,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8c,0xff,0xb2,0x96,0x8b,0xff,0xb5, 0x99,0x8f,0xff,0xb3,0x90,0x86,0xff,0x7d,0x65,0x5e,0xff,0x3c,0x3c,0x3b,0xff,0x2b, 0x33,0x2e,0xff,0x2e,0x35,0x2d,0xff,0x30,0x36,0x30,0xff,0x30,0x35,0x30,0xff,0x2e, 0x35,0x2e,0xff,0x2e,0x34,0x2e,0xff,0x2d,0x35,0x2e,0xff,0x1f,0x29,0x20,0xff,0x35, 0x33,0x39,0xff,0x87,0x75,0x76,0xff,0x9f,0x88,0x8e,0xff,0x91,0x75,0x7d,0xff,0x9c, 0x81,0x80,0xff,0xa7,0x8e,0x8e,0xff,0xa2,0x82,0x7a,0xff,0xa8,0x88,0x7d,0xff,0xb5, 0x99,0x8e,0xff,0xb6,0x9b,0x90,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x98,0x8d,0xff,0xb2, 0x96,0x8d,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x94,0x8b,0xff,0xb3,0x98,0x8f,0xff,0xb4, 0x99,0x90,0xff,0xb4,0x98,0x8f,0xff,0xb3,0x97,0x8e,0xff,0xb4,0x98,0x8f,0xff,0xb4, 0x97,0x8d,0xff,0xc0,0xa2,0x94,0xff,0x82,0x6a,0x6e,0xff,0x3e,0x3d,0x3d,0xff,0x34, 0x39,0x35,0xff,0x36,0x3b,0x36,0xff,0x18,0x20,0x1d,0xff,0x7f,0x6a,0x67,0xff,0xbe, 0xa5,0x9d,0xff,0xb6,0x9b,0x92,0xff,0xb1,0x95,0x8b,0xff,0xb2,0x96,0x8d,0xff,0xb1, 0x95,0x8c,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb1, 0x95,0x8c,0xff,0xb1,0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb1, 0x95,0x8b,0xff,0xb1,0x94,0x8a,0xff,0xb0,0x94,0x89,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb6,0x99,0x8f,0xff,0x78,0x67,0x60,0xff,0x81, 0x6a,0x74,0xff,0x43,0x42,0x43,0xff,0x3b,0x3d,0x3b,0xff,0x3d,0x3f,0x3e,0xff,0x3b, 0x3e,0x3c,0xff,0x30,0x31,0x31,0xff,0x12,0x19,0x15,0xff,0x79,0x59,0x5d,0xff,0xb4, 0x99,0x91,0xff,0xb0,0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xae,0x90,0x86,0xff,0xaf, 0x91,0x87,0xff,0xb0,0x93,0x89,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x91,0x87,0xff,0xaf,0x92,0x88,0xff,0xae,0x90,0x86,0xff,0xa4,0x83,0x79,0xff,0xae, 0x90,0x86,0xff,0xad,0x8f,0x84,0xff,0xae,0x90,0x86,0xff,0xaf,0x91,0x86,0xff,0xae, 0x90,0x86,0xff,0xad,0x8f,0x84,0xff,0xae,0x8f,0x85,0xfe,0xae,0x90,0x86,0xfb,0xac, 0x8e,0x84,0xf4,0x42,0x37,0x33,0xe5,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xb0,0x00, 0x00,0x00,0x9c,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xc5,0x08, 0x07,0x08,0xdf,0x65,0x57,0x65,0xf1,0x67,0x56,0x66,0xf9,0x60,0x53,0x60,0xfd,0x2d, 0x34,0x2e,0xff,0x5e,0x52,0x5e,0xff,0x5f,0x4f,0x59,0xff,0xa7,0x87,0x7c,0xff,0x9b, 0x78,0x6f,0xff,0x99,0x75,0x6e,0xff,0x9a,0x76,0x6e,0xff,0x99,0x75,0x6e,0xff,0x96, 0x74,0x6d,0xff,0x92,0x72,0x6f,0xff,0x95,0x70,0x6b,0xff,0x94,0x6f,0x68,0xff,0x9b, 0x77,0x6c,0xff,0x9e,0x7c,0x71,0xff,0x95,0x70,0x68,0xff,0x92,0x6c,0x68,0xff,0x8d, 0x68,0x6b,0xff,0xaf,0x90,0x85,0xff,0xab,0x8c,0x82,0xff,0xaa,0x8b,0x81,0xff,0xa9, 0x8a,0x7f,0xff,0xa9,0x8a,0x7f,0xff,0xaa,0x8b,0x80,0xff,0xa2,0x82,0x7b,0xff,0x69, 0x4f,0x56,0xff,0x39,0x35,0x3d,0xff,0x6d,0x5b,0x6d,0xff,0x61,0x52,0x63,0xff,0x67, 0x57,0x68,0xff,0x98,0x7d,0x83,0xff,0xb5,0x97,0x8a,0xff,0xa8,0x89,0x7e,0xff,0xa8, 0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa7, 0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa8,0x88,0x7e,0xff,0xa5,0x84,0x78,0xff,0x95, 0x70,0x6a,0xff,0x95,0x71,0x70,0xff,0xa5,0x83,0x78,0xff,0xa5,0x82,0x77,0xff,0x9a, 0x76,0x70,0xff,0x8e,0x68,0x66,0xff,0x98,0x74,0x68,0xff,0x92,0x6f,0x69,0xff,0x90, 0x6f,0x6f,0xff,0x8e,0x6c,0x70,0xff,0x89,0x67,0x6a,0xff,0x6b,0x54,0x56,0xff,0x49, 0x40,0x4e,0xff,0x4f,0x4a,0x50,0xff,0x51,0x4b,0x52,0xff,0x5f,0x52,0x60,0xff,0x5c, 0x51,0x5d,0xff,0x4c,0x47,0x4d,0xff,0x4e,0x48,0x4f,0xff,0x60,0x53,0x60,0xff,0x60, 0x53,0x60,0xff,0x61,0x53,0x61,0xff,0x60,0x53,0x60,0xff,0x61,0x54,0x61,0xff,0x62, 0x54,0x62,0xff,0x62,0x55,0x62,0xff,0x61,0x54,0x61,0xff,0x61,0x54,0x61,0xff,0x63, 0x55,0x63,0xff,0x63,0x55,0x63,0xff,0x64,0x56,0x64,0xff,0x65,0x55,0x68,0xff,0x69, 0x54,0x66,0xff,0x83,0x66,0x70,0xff,0xa7,0x87,0x83,0xff,0xad,0x8d,0x81,0xff,0xa4, 0x83,0x78,0xff,0xa1,0x80,0x75,0xff,0xa2,0x82,0x76,0xff,0xa3,0x82,0x77,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa2, 0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa2,0x80,0x75,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1,0x7f,0x74,0xff,0xa1, 0x7f,0x74,0xff,0xa0,0x7e,0x73,0xff,0xa5,0x83,0x74,0xff,0x8d,0x6a,0x72,0xff,0x7e, 0x66,0x63,0xfe,0x97,0x77,0x74,0xfe,0xa7,0x82,0x7a,0xfa,0x9b,0x7b,0x6f,0xf2,0x32, 0x27,0x24,0xe6,0x01,0x01,0x01,0xd0,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x6b,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0xbd,0x06,0x06,0x06,0xd4,0x4e,0x4b,0x49,0xe5,0xbb,0xac,0xa6,0xf1,0xc0, 0xa5,0x9c,0xf8,0xb1,0x91,0x87,0xfc,0xae,0x8f,0x85,0xfd,0xaf,0x93,0x89,0xfe,0xb0, 0x93,0x89,0xff,0xb0,0x93,0x89,0xff,0xb3,0x97,0x8d,0xff,0xab,0x8b,0x85,0xff,0x67, 0x51,0x52,0xff,0x3c,0x3b,0x37,0xff,0x86,0x64,0x66,0xff,0x39,0x3c,0x3e,0xff,0x35, 0x39,0x36,0xff,0x35,0x3a,0x36,0xff,0x34,0x39,0x35,0xff,0x29,0x2e,0x2b,0xff,0x54, 0x4e,0x4e,0xff,0xd0,0xb8,0xb4,0xff,0xbd,0xa6,0x9d,0xff,0xae,0x91,0x87,0xff,0xb0, 0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb2, 0x96,0x8c,0xff,0xb1,0x95,0x8c,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb3, 0x97,0x8e,0xff,0xb2,0x96,0x8d,0xff,0xb3,0x97,0x8e,0xff,0xb4,0x99,0x8f,0xff,0xb3, 0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x97,0x8d,0xff,0xb7,0x99,0x91,0xff,0x74, 0x65,0x67,0xff,0x69,0x5f,0x5e,0xff,0xbf,0xa1,0x96,0xff,0xb3,0x98,0x8e,0xff,0xb4, 0x99,0x8e,0xff,0xb8,0x9c,0x92,0xff,0xaa,0x88,0x85,0xff,0x6a,0x55,0x55,0xff,0x33, 0x38,0x34,0xff,0x2e,0x35,0x30,0xff,0x32,0x37,0x32,0xff,0x31,0x37,0x32,0xff,0x30, 0x36,0x30,0xff,0x2f,0x35,0x2f,0xff,0x2f,0x35,0x2f,0xff,0x2f,0x36,0x30,0xff,0x25, 0x2c,0x26,0xff,0x1d,0x23,0x1f,0xff,0x61,0x56,0x55,0xff,0xb6,0xa0,0x9b,0xff,0x9b, 0x7c,0x7e,0xff,0x9c,0x7c,0x79,0xff,0xbb,0xa1,0x95,0xff,0xae,0x92,0x84,0xff,0x95, 0x71,0x6b,0xff,0xa6,0x87,0x80,0xff,0xb7,0x9c,0x92,0xff,0xb4,0x99,0x8f,0xff,0xb4, 0x99,0x8f,0xff,0xb5,0x9a,0x90,0xff,0xb4,0x99,0x90,0xff,0xb4,0x99,0x90,0xff,0xb4, 0x99,0x8f,0xff,0xb4,0x99,0x8f,0xff,0xb4,0x99,0x8f,0xff,0xb3,0x97,0x8e,0xff,0xb5, 0x98,0x90,0xff,0xb4,0x98,0x8f,0xff,0xb6,0x9b,0x92,0xff,0xb0,0x8b,0x81,0xff,0x55, 0x4e,0x4b,0xff,0x30,0x37,0x34,0xff,0x35,0x3a,0x36,0xff,0x35,0x3b,0x36,0xff,0x25, 0x23,0x28,0xff,0xad,0x9c,0x99,0xff,0xc5,0xac,0xa3,0xff,0xb2,0x96,0x8d,0xff,0xb3, 0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb2, 0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb3,0x97,0x8e,0xff,0xb2,0x96,0x8d,0xff,0xb1, 0x95,0x8b,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb1,0x95,0x8b,0xff,0xb2, 0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb1,0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb2, 0x96,0x8c,0xff,0xae,0x94,0x87,0xff,0x5d,0x51,0x57,0xff,0x3b,0x3c,0x3d,0xff,0x3b, 0x3d,0x3b,0xff,0x3c,0x3e,0x3e,0xff,0x3c,0x3f,0x3d,0xff,0x2b,0x2c,0x2c,0xff,0x0d, 0x16,0x10,0xff,0x81,0x65,0x5d,0xff,0xb0,0x94,0x8c,0xff,0xb0,0x94,0x8b,0xff,0xb0, 0x94,0x8a,0xff,0xb0,0x93,0x89,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xb1,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xae, 0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf,0x93,0x89,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xae,0x90,0x86,0xff,0xae,0x90,0x86,0xff,0xae, 0x90,0x86,0xfe,0xae,0x90,0x86,0xfb,0xac,0x8e,0x84,0xf4,0x4d,0x40,0x3c,0xe4,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x8c,0x00, 0x00,0x00,0x9c,0x00,0x00,0x00,0xbb,0x06,0x06,0x06,0xd8,0x5b,0x4e,0x5b,0xec,0x66, 0x56,0x65,0xf7,0x40,0x40,0x40,0xfc,0x14,0x20,0x16,0xfe,0x76,0x5f,0x75,0xff,0x71, 0x5e,0x6c,0xff,0xb5,0x9d,0x93,0xff,0xaf,0x92,0x87,0xff,0xaa,0x8b,0x7f,0xff,0xac, 0x8d,0x81,0xff,0xab,0x8b,0x80,0xff,0xaa,0x8b,0x80,0xff,0xad,0x8c,0x80,0xff,0xa9, 0x88,0x7d,0xff,0x9a,0x76,0x6c,0xff,0x93,0x6e,0x68,0xff,0x8e,0x69,0x68,0xff,0x90, 0x6a,0x68,0xff,0x9d,0x7a,0x6e,0xff,0x97,0x71,0x69,0xff,0xa3,0x82,0x77,0xff,0xac, 0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xaa,0x8b,0x81,0xff,0xab,0x8c,0x81,0xff,0xaa, 0x8c,0x82,0xff,0xad,0x8e,0x82,0xff,0x88,0x6d,0x67,0xff,0x32,0x2e,0x37,0xff,0x67, 0x56,0x66,0xff,0x6a,0x58,0x6a,0xff,0x5e,0x50,0x5f,0xff,0x59,0x4e,0x5a,0xff,0x93, 0x7a,0x82,0xff,0xb7,0x9a,0x8e,0xff,0xab,0x8b,0x80,0xff,0xa8,0x88,0x7d,0xff,0xa9, 0x89,0x7e,0xff,0xa9,0x89,0x7f,0xff,0xa9,0x89,0x7f,0xff,0xaa,0x89,0x7e,0xff,0x9d, 0x7e,0x7b,0xff,0x85,0x65,0x72,0xff,0x8f,0x6c,0x6d,0xff,0x9f,0x7d,0x73,0xff,0x9c, 0x78,0x70,0xff,0x8a,0x6a,0x6e,0xff,0x71,0x5d,0x70,0xff,0x7d,0x62,0x67,0xff,0xa2, 0x7e,0x71,0xff,0xa5,0x84,0x79,0xff,0xa6,0x84,0x77,0xff,0xa4,0x82,0x79,0xff,0xa6, 0x83,0x7b,0xff,0xa3,0x80,0x75,0xff,0x7d,0x64,0x67,0xff,0x53,0x48,0x56,0xff,0x4f, 0x47,0x51,0xff,0x5d,0x51,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x52,0x4b,0x53,0xff,0x4e, 0x49,0x4f,0xff,0x4c,0x47,0x4c,0xff,0x4f,0x49,0x4f,0xff,0x62,0x55,0x62,0xff,0x63, 0x54,0x63,0xff,0x63,0x54,0x63,0xff,0x62,0x54,0x62,0xff,0x62,0x54,0x62,0xff,0x63, 0x54,0x63,0xff,0x65,0x56,0x65,0xff,0x64,0x56,0x64,0xff,0x63,0x55,0x63,0xff,0x65, 0x56,0x65,0xff,0x68,0x56,0x67,0xff,0x66,0x55,0x67,0xff,0x65,0x53,0x66,0xff,0x74, 0x5e,0x71,0xff,0x9a,0x7d,0x7d,0xff,0xab,0x8b,0x7f,0xff,0xa1,0x7f,0x74,0xff,0x91, 0x6e,0x6f,0xff,0x8c,0x69,0x70,0xff,0x8d,0x6a,0x70,0xff,0x8b,0x67,0x6c,0xff,0x9c, 0x79,0x72,0xff,0xa4,0x83,0x77,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2, 0x81,0x76,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa4, 0x82,0x75,0xff,0x8c,0x68,0x6a,0xff,0x9f,0x7b,0x73,0xff,0xa3,0x81,0x73,0xfe,0xa0, 0x7e,0x73,0xfd,0xa9,0x85,0x79,0xfa,0x93,0x74,0x6a,0xf2,0x22,0x1b,0x18,0xe3,0x00, 0x00,0x00,0xce,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x92,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xc8,0x12,0x13,0x13,0xdb,0x74,0x6f,0x6d,0xe9,0xd1, 0xc0,0xba,0xf3,0xc0,0xa5,0x9c,0xf9,0xae,0x90,0x85,0xfd,0xb0,0x93,0x89,0xfd,0xb1, 0x94,0x8a,0xfe,0xb0,0x94,0x8a,0xff,0xb2,0x96,0x8b,0xff,0xb4,0x98,0x8d,0xff,0xa6, 0x89,0x88,0xff,0x73,0x5c,0x67,0xff,0x31,0x36,0x30,0xff,0x3a,0x3a,0x32,0xff,0x8c, 0x68,0x70,0xff,0x60,0x53,0x63,0xff,0x36,0x3a,0x38,0xff,0x37,0x3c,0x38,0xff,0x28, 0x2e,0x2c,0xff,0x42,0x3b,0x37,0xff,0xb8,0x9b,0x90,0xff,0xca,0xb4,0xab,0xff,0xb2, 0x95,0x8c,0xff,0xb2,0x95,0x8c,0xff,0xb2,0x96,0x8d,0xff,0xb3,0x97,0x8e,0xff,0xb3, 0x97,0x8e,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb2, 0x96,0x8d,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x98,0x8e,0xff,0xb5, 0x9a,0x90,0xff,0xb4,0x99,0x90,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb4, 0x98,0x8f,0xff,0xbd,0xa1,0x94,0xff,0x91,0x7b,0x7e,0xff,0x7a,0x64,0x6b,0xff,0xb3, 0x94,0x88,0xff,0xb8,0x9e,0x94,0xff,0xb9,0x9d,0x92,0xff,0x9c,0x81,0x86,0xff,0x59, 0x4e,0x57,0xff,0x30,0x35,0x31,0xff,0x30,0x37,0x33,0xff,0x33,0x39,0x34,0xff,0x33, 0x38,0x33,0xff,0x33,0x38,0x33,0xff,0x33,0x38,0x33,0xff,0x33,0x38,0x33,0xff,0x33, 0x39,0x34,0xff,0x2b,0x32,0x2c,0xff,0x1a,0x23,0x1f,0xff,0x50,0x41,0x3e,0xff,0xa7, 0x8c,0x83,0xff,0xc9,0xb3,0xaa,0xff,0xac,0x8e,0x85,0xff,0x9e,0x78,0x6c,0xff,0x91, 0x74,0x7c,0xff,0x8e,0x6d,0x6f,0xff,0xa7,0x87,0x7d,0xff,0xb6,0x9c,0x93,0xff,0xb8, 0x9f,0x95,0xff,0xb6,0x9b,0x92,0xff,0xb5,0x9a,0x91,0xff,0xb6,0x9b,0x92,0xff,0xb7, 0x9c,0x93,0xff,0xb6,0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb5,0x9a,0x91,0xff,0xb5, 0x9a,0x91,0xff,0xb4,0x99,0x8f,0xff,0xb5,0x9a,0x91,0xff,0xb6,0x9b,0x92,0xff,0xbd, 0x9f,0x93,0xff,0x84,0x6c,0x73,0xff,0x3f,0x3e,0x40,0xff,0x33,0x38,0x34,0xff,0x36, 0x3a,0x37,0xff,0x25,0x2d,0x2b,0xff,0x68,0x56,0x50,0xff,0xc2,0xad,0xa6,0xff,0xc1, 0xa9,0xa1,0xff,0xb5,0x9a,0x91,0xff,0xb3,0x98,0x8e,0xff,0xb4,0x99,0x8e,0xff,0xb5, 0x9a,0x91,0xff,0xb4,0x99,0x8f,0xff,0xb5,0x9a,0x91,0xff,0xb5,0x9a,0x91,0xff,0xb2, 0x96,0x8e,0xff,0xb4,0x98,0x8e,0xff,0xb4,0x99,0x8f,0xff,0xb4,0x99,0x8f,0xff,0xb4, 0x99,0x8f,0xff,0xb2,0x96,0x8d,0xff,0xb4,0x99,0x8f,0xff,0xb3,0x97,0x8e,0xff,0xb2, 0x96,0x8d,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xc0,0xa2,0x98,0xff,0x4d, 0x4a,0x47,0xff,0x13,0x1e,0x15,0xff,0x26,0x30,0x26,0xff,0x3a,0x3d,0x3b,0xff,0x42, 0x42,0x42,0xff,0x28,0x27,0x28,0xff,0x12,0x1a,0x14,0xff,0x8d,0x78,0x70,0xff,0xb2, 0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8c,0xff,0xb0,0x94,0x8a,0xff,0xaf, 0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xb1,0x95,0x8b,0xff,0xb2,0x96,0x8c,0xff,0xb2, 0x96,0x8c,0xff,0xae,0x92,0x88,0xff,0x9e,0x7c,0x72,0xff,0xb3,0x96,0x8c,0xff,0xaf, 0x92,0x88,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xaf,0x92,0x88,0xff,0xb0, 0x93,0x89,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xfe,0xaf,0x91,0x87,0xfb,0xad, 0x90,0x86,0xf2,0x55,0x46,0x41,0xe3,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0x8a,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xb2,0x05, 0x05,0x05,0xd2,0x4f,0x43,0x4f,0xe9,0x65,0x56,0x66,0xf6,0x30,0x36,0x31,0xfd,0x57, 0x4c,0x58,0xfe,0x72,0x5d,0x70,0xff,0x66,0x58,0x64,0xff,0xb1,0x9b,0x92,0xff,0xb9, 0x9f,0x96,0xff,0xad,0x8f,0x84,0xff,0xae,0x90,0x85,0xff,0xad,0x8e,0x84,0xff,0xae, 0x90,0x85,0xff,0xaf,0x91,0x87,0xff,0xad,0x8f,0x84,0xff,0xab,0x8b,0x81,0xff,0xa7, 0x87,0x7d,0xff,0x96,0x72,0x69,0xff,0x99,0x74,0x6c,0xff,0xa0,0x7d,0x71,0xff,0x9f, 0x7d,0x72,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xaa,0x8a,0x80,0xff,0xac, 0x8e,0x84,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xae,0x8f,0x84,0xff,0x9a, 0x7e,0x79,0xff,0x49,0x3b,0x48,0xff,0x46,0x3f,0x48,0xff,0x69,0x59,0x68,0xff,0x63, 0x54,0x62,0xff,0x50,0x49,0x51,0xff,0x5a,0x4e,0x5b,0xff,0x8b,0x74,0x7d,0xff,0xb6, 0x98,0x8d,0xff,0xad,0x8d,0x82,0xff,0xa5,0x86,0x7d,0xff,0xa0,0x83,0x78,0xff,0x97, 0x77,0x6b,0xff,0x86,0x68,0x68,0xff,0x69,0x58,0x6b,0xff,0x6d,0x57,0x61,0xff,0x99, 0x71,0x6c,0xff,0x90,0x71,0x71,0xff,0x79,0x5f,0x73,0xff,0x77,0x5e,0x71,0xff,0x7c, 0x62,0x6f,0xff,0x98,0x75,0x6f,0xff,0xa9,0x89,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x86,0x7c,0xff,0xa6,0x87,0x7c,0xff,0xa9,0x87,0x7c,0xff,0xaa, 0x88,0x7c,0xff,0x88,0x6d,0x70,0xff,0x5a,0x4b,0x5a,0xff,0x56,0x4b,0x56,0xff,0x5c, 0x51,0x5e,0xff,0x64,0x55,0x64,0xff,0x6b,0x59,0x6a,0xff,0x5a,0x4f,0x5a,0xff,0x36, 0x3a,0x37,0xff,0x40,0x3f,0x41,0xff,0x5d,0x51,0x5e,0xff,0x5e,0x52,0x5e,0xff,0x61, 0x53,0x61,0xff,0x63,0x55,0x63,0xff,0x64,0x55,0x64,0xff,0x65,0x56,0x65,0xff,0x65, 0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x67,0x57,0x66,0xff,0x68, 0x57,0x66,0xff,0x66,0x56,0x67,0xff,0x6b,0x58,0x6c,0xff,0x62,0x54,0x60,0xff,0x73, 0x5e,0x6c,0xff,0x83,0x66,0x78,0xff,0x93,0x72,0x73,0xff,0xa0,0x7f,0x75,0xff,0xa0, 0x7e,0x77,0xff,0x9e,0x7d,0x75,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2, 0x81,0x76,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3, 0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xff,0xa1,0x80,0x75,0xff,0xa1, 0x80,0x75,0xff,0xa1,0x81,0x76,0xff,0xa1,0x7f,0x72,0xff,0x8d,0x68,0x68,0xff,0x9b, 0x78,0x71,0xff,0xa2,0x80,0x74,0xff,0xa1,0x7f,0x74,0xfe,0xa1,0x7f,0x74,0xfd,0xa9, 0x86,0x79,0xf9,0x87,0x6a,0x60,0xf1,0x1b,0x15,0x13,0xe2,0x00,0x00,0x00,0xca,0x00, 0x00,0x00,0xa9,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x79,0x00, 0x00,0x00,0x9a,0x00,0x00,0x00,0xb9,0x01,0x01,0x01,0xd0,0x2d,0x2b,0x2b,0xe2,0xa6, 0x9d,0x9b,0xee,0xd1,0xbc,0xb4,0xf6,0xb6,0x9a,0x91,0xfb,0xb0,0x94,0x8a,0xfd,0xb0, 0x94,0x8a,0xfe,0xb1,0x94,0x8a,0xff,0xaf,0x92,0x88,0xff,0xb3,0x96,0x8c,0xff,0xb5, 0x97,0x8c,0xff,0x99,0x7f,0x80,0xff,0x5c,0x50,0x5e,0xff,0x36,0x3a,0x38,0xff,0x38, 0x3c,0x39,0xff,0x38,0x3c,0x39,0xff,0x40,0x3f,0x3f,0xff,0x64,0x55,0x63,0xff,0x49, 0x45,0x49,0xff,0x2d,0x32,0x2f,0xff,0x32,0x2f,0x34,0xff,0x8c,0x78,0x81,0xff,0xc8, 0xb4,0xae,0xff,0xb6,0x9a,0x90,0xff,0xb2,0x96,0x8d,0xff,0xb3,0x98,0x8e,0xff,0xb4, 0x99,0x8f,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb4, 0x99,0x90,0xff,0xb6,0x9b,0x91,0xff,0xb4,0x99,0x8f,0xff,0xb5,0x9a,0x91,0xff,0xb4, 0x99,0x90,0xff,0xb3,0x97,0x8e,0xff,0xb5,0x9a,0x91,0xff,0xb5,0x9a,0x91,0xff,0xb4, 0x99,0x8f,0xff,0xb4,0x99,0x90,0xff,0xb5,0x9a,0x92,0xff,0xbd,0xa1,0x96,0xff,0x8c, 0x79,0x7d,0xff,0x75,0x61,0x69,0xff,0xb9,0x98,0x8b,0xff,0xb6,0x9a,0x90,0xff,0x89, 0x72,0x76,0xff,0x4a,0x44,0x4d,0xff,0x31,0x37,0x34,0xff,0x34,0x39,0x35,0xff,0x34, 0x39,0x35,0xff,0x34,0x39,0x35,0xff,0x34,0x39,0x35,0xff,0x34,0x39,0x34,0xff,0x33, 0x38,0x33,0xff,0x34,0x39,0x34,0xff,0x31,0x37,0x31,0xff,0x1c,0x24,0x1f,0xff,0x4e, 0x47,0x4c,0xff,0x79,0x61,0x76,0xff,0x7e,0x62,0x65,0xff,0xb1,0x97,0x8f,0xff,0xac, 0x8d,0x86,0xff,0xa7,0x89,0x7f,0xff,0xb7,0x9d,0x95,0xff,0xb6,0x9b,0x93,0xff,0xb8, 0x9d,0x94,0xff,0xb8,0x9e,0x95,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb8, 0x9e,0x95,0xff,0xb7,0x9d,0x94,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb8, 0x9e,0x95,0xff,0xb5,0x9b,0x92,0xff,0xb6,0x9c,0x93,0xff,0xb7,0x9d,0x94,0xff,0xb6, 0x9c,0x93,0xff,0xb8,0x9e,0x94,0xff,0xb3,0x8f,0x89,0xff,0x57,0x4f,0x4d,0xff,0x32, 0x37,0x36,0xff,0x36,0x3a,0x37,0xff,0x35,0x3a,0x37,0xff,0x23,0x22,0x23,0xff,0xab, 0x9b,0x97,0xff,0xce,0xb8,0xb1,0xff,0xb9,0xa0,0x98,0xff,0xb6,0x9b,0x92,0xff,0xb6, 0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb5, 0x9a,0x91,0xff,0xb6,0x9b,0x92,0xff,0xb5,0x9a,0x91,0xff,0xb6,0x9b,0x92,0xff,0xb6, 0x9b,0x92,0xff,0xb4,0x9a,0x90,0xff,0xb5,0x9a,0x91,0xff,0xb5,0x9a,0x91,0xff,0xb5, 0x9a,0x91,0xff,0xb4,0x99,0x8f,0xff,0xb3,0x97,0x8e,0xff,0xb4,0x99,0x8f,0xff,0xb5, 0x9a,0x91,0xff,0xbe,0xa1,0x96,0xff,0x4c,0x4a,0x48,0xff,0x1e,0x28,0x1e,0xff,0x16, 0x23,0x17,0xff,0x3a,0x3c,0x3b,0xff,0x42,0x43,0x43,0xff,0x26,0x26,0x26,0xff,0x1b, 0x21,0x1d,0xff,0x9f,0x8b,0x84,0xff,0xb4,0x99,0x8f,0xff,0xb4,0x99,0x8f,0xff,0xae, 0x91,0x87,0xff,0xb0,0x93,0x89,0xff,0xab,0x8d,0x83,0xff,0xaf,0x92,0x88,0xff,0xb0, 0x93,0x8a,0xff,0xad,0x90,0x86,0xff,0xac,0x8f,0x84,0xff,0xa0,0x7e,0x74,0xff,0xaf, 0x94,0x8a,0xff,0xbf,0xa7,0x9f,0xff,0xb1,0x95,0x8c,0xff,0xb0,0x94,0x8a,0xff,0xb1, 0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb0, 0x94,0x8a,0xfe,0xaf,0x92,0x88,0xfb,0xad,0x90,0x87,0xf2,0x5a,0x4b,0x46,0xe2,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x7d,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0xac,0x04,0x04,0x04,0xce,0x44,0x39,0x43,0xe8,0x65, 0x56,0x65,0xf5,0x25,0x2f,0x26,0xfc,0x6f,0x5c,0x6e,0xfe,0x64,0x55,0x64,0xff,0x63, 0x56,0x61,0xff,0xa5,0x8d,0x85,0xff,0xc0,0xa7,0x9f,0xff,0xae,0x8f,0x85,0xff,0xae, 0x90,0x86,0xff,0xae,0x90,0x86,0xff,0xad,0x8f,0x85,0xff,0xae,0x90,0x86,0xff,0xae, 0x90,0x86,0xff,0xad,0x90,0x85,0xff,0xae,0x90,0x85,0xff,0xae,0x8f,0x85,0xff,0xae, 0x8f,0x85,0xff,0xad,0x8f,0x84,0xff,0xad,0x8e,0x83,0xff,0xad,0x8f,0x84,0xff,0xaa, 0x8c,0x81,0xff,0xa5,0x84,0x7b,0xff,0xac,0x8e,0x83,0xff,0xad,0x8f,0x84,0xff,0xac, 0x8d,0x83,0xff,0xad,0x8f,0x84,0xff,0xab,0x8b,0x7f,0xff,0x7d,0x61,0x5c,0xff,0x30, 0x2e,0x38,0xff,0x59,0x50,0x5a,0xff,0x5c,0x51,0x5c,0xff,0x5f,0x53,0x5f,0xff,0x54, 0x4c,0x55,0xff,0x55,0x4b,0x56,0xff,0x86,0x70,0x7a,0xff,0xac,0x8f,0x8f,0xff,0x6b, 0x55,0x61,0xff,0x34,0x39,0x34,0xff,0x3b,0x3d,0x39,0xff,0x54,0x4b,0x52,0xff,0x75, 0x5e,0x70,0xff,0x88,0x67,0x75,0xff,0x88,0x66,0x73,0xff,0x88,0x66,0x70,0xff,0x91, 0x6e,0x6b,0xff,0xa1,0x80,0x76,0xff,0xa7,0x87,0x7e,0xff,0xa8,0x87,0x7d,0xff,0xa9, 0x89,0x7f,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa7,0x86,0x7c,0xff,0xa9,0x88,0x7f,0xff,0x9e, 0x7d,0x73,0xff,0x6f,0x57,0x56,0xff,0x4f,0x46,0x52,0xff,0x5e,0x51,0x60,0xff,0x62, 0x55,0x62,0xff,0x6b,0x59,0x6a,0xff,0x6b,0x59,0x69,0xff,0x50,0x49,0x50,0xff,0x3e, 0x3f,0x3e,0xff,0x4b,0x46,0x4b,0xff,0x5e,0x52,0x5e,0xff,0x5e,0x53,0x60,0xff,0x61, 0x54,0x62,0xff,0x67,0x57,0x67,0xff,0x67,0x57,0x67,0xff,0x66,0x56,0x66,0xff,0x67, 0x56,0x67,0xff,0x66,0x56,0x66,0xff,0x67,0x56,0x67,0xff,0x6d,0x59,0x6c,0xff,0x64, 0x54,0x64,0xff,0x42,0x41,0x47,0xff,0x5a,0x51,0x5a,0xff,0x80,0x62,0x6a,0xff,0x9f, 0x7d,0x7a,0xff,0xb0,0x92,0x86,0xff,0xaa,0x8a,0x7e,0xff,0xa4,0x83,0x78,0xff,0xa6, 0x85,0x7b,0xff,0xa0,0x7e,0x74,0xff,0x9d,0x7b,0x72,0xff,0xa0,0x7f,0x75,0xff,0xa5, 0x84,0x78,0xff,0xa5,0x84,0x79,0xff,0xa4,0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa5, 0x84,0x7a,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3, 0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa3,0x83,0x77,0xff,0xa0, 0x7e,0x73,0xff,0x8d,0x6a,0x6c,0xff,0x9d,0x7b,0x74,0xff,0xa2,0x81,0x76,0xff,0xa1, 0x7f,0x74,0xff,0xa1,0x7f,0x74,0xfe,0xa2,0x80,0x75,0xfc,0xa9,0x85,0x7a,0xf8,0x79, 0x5f,0x57,0xef,0x14,0x11,0x0e,0xde,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x62,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0xbd,0x06,0x06,0x06,0xd5,0x4d, 0x4a,0x48,0xe6,0xbb,0xad,0xa8,0xf1,0xc9,0xb2,0xa9,0xf8,0xb2,0x96,0x8c,0xfc,0xaf, 0x92,0x88,0xfd,0xb0,0x94,0x8a,0xfe,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8b,0xff,0xb4, 0x98,0x8e,0xff,0xb3,0x94,0x89,0xff,0x8a,0x74,0x72,0xff,0x4c,0x45,0x4f,0xff,0x39, 0x3b,0x3a,0xff,0x39,0x3d,0x3b,0xff,0x38,0x3b,0x38,0xff,0x3a,0x3c,0x3c,0xff,0x33, 0x38,0x34,0xff,0x24,0x2f,0x24,0xff,0x28,0x30,0x28,0xff,0x31,0x31,0x2f,0xff,0x74, 0x65,0x60,0xff,0xb6,0x9e,0x9c,0xff,0x81,0x6a,0x72,0xff,0xba,0x9e,0x93,0xff,0xb3, 0x97,0x8e,0xff,0xb5,0x9a,0x8f,0xff,0xb4,0x99,0x90,0xff,0xb3,0x98,0x8f,0xff,0xb4, 0x99,0x90,0xff,0xb5,0x9a,0x91,0xff,0xb5,0x9a,0x91,0xff,0xb5,0x9a,0x91,0xff,0xb6, 0x9b,0x91,0xff,0xb5,0x9a,0x90,0xff,0xb4,0x99,0x90,0xff,0xb5,0x9a,0x90,0xff,0xb6, 0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb8, 0x9e,0x95,0xff,0xbe,0xa0,0x95,0xff,0x92,0x77,0x77,0xff,0x89,0x72,0x75,0xff,0xb1, 0x95,0x89,0xff,0x74,0x63,0x65,0xff,0x40,0x3f,0x44,0xff,0x36,0x3a,0x37,0xff,0x39, 0x3c,0x3a,0xff,0x37,0x3b,0x38,0xff,0x34,0x39,0x35,0xff,0x34,0x39,0x35,0xff,0x34, 0x39,0x35,0xff,0x34,0x39,0x35,0xff,0x34,0x39,0x34,0xff,0x33,0x38,0x33,0xff,0x21, 0x28,0x23,0xff,0x26,0x26,0x22,0xff,0x94,0x84,0x7d,0xff,0xb9,0x9b,0x9d,0xff,0x65, 0x55,0x62,0xff,0x68,0x4e,0x57,0xff,0xaa,0x89,0x85,0xff,0xbe,0xa5,0x9b,0xff,0xb9, 0x9f,0x96,0xff,0xba,0xa1,0x98,0xff,0xb9,0x9f,0x96,0xff,0xb8,0x9e,0x95,0xff,0xb9, 0x9e,0x95,0xff,0xb9,0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xb8, 0x9f,0x96,0xff,0xb9,0x9e,0x95,0xff,0xb9,0xa0,0x97,0xff,0xb8,0x9f,0x96,0xff,0xb8, 0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xc2,0xa7,0x99,0xff,0x85, 0x6f,0x78,0xff,0x41,0x3f,0x42,0xff,0x35,0x3a,0x36,0xff,0x39,0x3d,0x3a,0xff,0x24, 0x2d,0x28,0xff,0x5f,0x49,0x49,0xff,0xc2,0xad,0xa8,0xff,0xc5,0xb0,0xa8,0xff,0xb7, 0x9e,0x95,0xff,0xb7,0x9e,0x94,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb7, 0x9d,0x94,0xff,0xb6,0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb7,0x9d,0x94,0xff,0xb6, 0x9b,0x92,0xff,0xb6,0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb7,0x9d,0x94,0xff,0xb6, 0x9b,0x92,0xff,0xb6,0x9c,0x93,0xff,0xb6,0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb5, 0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb6,0x9c,0x93,0xff,0xb4,0x91,0x85,0xff,0x4d, 0x49,0x48,0xff,0x35,0x39,0x36,0xff,0x21,0x2a,0x22,0xff,0x3b,0x3d,0x3c,0xff,0x3e, 0x3f,0x3f,0xff,0x23,0x23,0x23,0xff,0x34,0x34,0x37,0xff,0xb2,0x9d,0x96,0xff,0xb7, 0x9b,0x92,0xff,0xad,0x8f,0x86,0xff,0xa3,0x82,0x78,0xff,0xb2,0x96,0x8d,0xff,0xb3, 0x97,0x8e,0xff,0xb2,0x97,0x8d,0xff,0xab,0x8c,0x82,0xff,0x9a,0x77,0x6d,0xff,0xa7, 0x88,0x7d,0xff,0xb2,0x96,0x8c,0xff,0xb8,0x9f,0x96,0xff,0xb2,0x96,0x8d,0xff,0xb1, 0x95,0x8b,0xff,0xb2,0x96,0x8d,0xff,0xb0,0x94,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8b,0xfe,0xb0,0x93,0x89,0xfb,0xaf, 0x94,0x8a,0xf2,0x64,0x54,0x4e,0xe2,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0xa1,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xa7,0x03, 0x03,0x03,0xcb,0x35,0x2c,0x35,0xe6,0x5e,0x52,0x5f,0xf5,0x16,0x22,0x18,0xfc,0x63, 0x54,0x63,0xfe,0x5d,0x51,0x5d,0xff,0x61,0x53,0x5d,0xff,0x8e,0x73,0x69,0xff,0xc4, 0xad,0xa5,0xff,0xad,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x92,0x88,0xff,0xae,0x90,0x86,0xff,0xae,0x90,0x86,0xff,0xae,0x90,0x86,0xff,0xae, 0x90,0x86,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xae,0x91,0x87,0xff,0xae, 0x90,0x85,0xff,0xae,0x90,0x86,0xff,0xad,0x8e,0x84,0xff,0xa7,0x87,0x7d,0xff,0xac, 0x8e,0x84,0xff,0xaf,0x91,0x87,0xff,0xad,0x8f,0x84,0xff,0xad,0x8f,0x84,0xff,0xb0, 0x92,0x86,0xff,0x92,0x77,0x72,0xff,0x3b,0x30,0x3c,0xff,0x4c,0x44,0x4d,0xff,0x63, 0x55,0x63,0xff,0x67,0x57,0x66,0xff,0x61,0x54,0x62,0xff,0x53,0x4b,0x53,0xff,0x57, 0x4e,0x57,0xff,0x64,0x55,0x65,0xff,0x46,0x43,0x47,0xff,0x3c,0x3c,0x3c,0xff,0x6f, 0x5a,0x68,0xff,0x8a,0x68,0x79,0xff,0x86,0x66,0x76,0xff,0x86,0x65,0x75,0xff,0x8d, 0x6b,0x6e,0xff,0xa1,0x7d,0x70,0xff,0xa9,0x89,0x7f,0xff,0xa9,0x89,0x7e,0xff,0xa9, 0x8a,0x7f,0xff,0xaa,0x8c,0x81,0xff,0xaa,0x8a,0x80,0xff,0xa8,0x89,0x7f,0xff,0xa8, 0x89,0x7f,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa9,0x89,0x7e,0xff,0x9d,0x7d,0x72,0xff,0x77, 0x5e,0x5d,0xff,0x5a,0x4b,0x58,0xff,0x5c,0x50,0x5e,0xff,0x63,0x55,0x63,0xff,0x62, 0x54,0x62,0xff,0x66,0x55,0x62,0xff,0x6a,0x58,0x68,0xff,0x73,0x5d,0x72,0xff,0x6c, 0x59,0x6a,0xff,0x58,0x4e,0x58,0xff,0x60,0x52,0x5e,0xff,0x5f,0x52,0x5f,0xff,0x57, 0x4e,0x57,0xff,0x5e,0x51,0x5e,0xff,0x67,0x56,0x67,0xff,0x65,0x56,0x66,0xff,0x5c, 0x51,0x5f,0xff,0x58,0x4e,0x5b,0xff,0x3b,0x3b,0x3d,0xff,0x51,0x4a,0x4c,0xff,0x90, 0x73,0x70,0xff,0x7d,0x66,0x6d,0xff,0x70,0x59,0x6c,0xff,0x98,0x7b,0x80,0xff,0xaf, 0x91,0x86,0xff,0xab,0x8b,0x80,0xff,0xa6,0x86,0x7c,0xff,0xa8,0x87,0x7c,0xff,0x96, 0x72,0x71,0xff,0x96,0x71,0x6b,0xff,0x9c,0x7a,0x72,0xff,0xa1,0x80,0x77,0xff,0xa4, 0x83,0x78,0xff,0xa5,0x84,0x79,0xff,0xa5,0x84,0x7a,0xff,0xa5,0x84,0x7a,0xff,0xa4, 0x83,0x79,0xff,0xa3,0x82,0x78,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa8, 0x86,0x79,0xff,0xa0,0x7d,0x75,0xff,0x92,0x6d,0x6b,0xff,0x9d,0x7b,0x73,0xff,0xa3, 0x82,0x76,0xff,0xa2,0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x7f,0x74,0xfe,0xa1, 0x80,0x75,0xfd,0xa2,0x7f,0x74,0xfc,0xab,0x86,0x7b,0xf7,0x6a,0x54,0x4c,0xeb,0x0e, 0x0b,0x0a,0xd9,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x02,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xc2,0x12, 0x12,0x12,0xd8,0x70,0x6a,0x67,0xe8,0xcd,0xbb,0xb4,0xf3,0xbb,0xa0,0x98,0xf9,0xb1, 0x95,0x8a,0xfd,0xb0,0x93,0x89,0xfd,0xb1,0x95,0x8b,0xfe,0xb0,0x94,0x8a,0xff,0xb2, 0x96,0x8d,0xff,0xb5,0x99,0x8e,0xff,0xad,0x8d,0x81,0xff,0x77,0x65,0x63,0xff,0x3e, 0x3d,0x43,0xff,0x3a,0x3d,0x3b,0xff,0x3b,0x3e,0x3b,0xff,0x39,0x3c,0x39,0xff,0x3a, 0x3c,0x3a,0xff,0x3a,0x3d,0x3b,0xff,0x3a,0x3c,0x3b,0xff,0x31,0x37,0x32,0xff,0x08, 0x17,0x0d,0xff,0x3f,0x3f,0x38,0xff,0xd4,0xb5,0xad,0xff,0xbf,0xa7,0x9e,0xff,0xaf, 0x90,0x86,0xff,0xb6,0x9b,0x92,0xff,0xb5,0x9a,0x91,0xff,0xb5,0x99,0x90,0xff,0xb5, 0x9a,0x90,0xff,0xb5,0x9a,0x91,0xff,0xb5,0x9a,0x91,0xff,0xb5,0x9a,0x91,0xff,0xb6, 0x9b,0x92,0xff,0xb6,0x9b,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb5,0x9a,0x90,0xff,0xb7, 0x9c,0x93,0xff,0xb7,0x9c,0x93,0xff,0xb7,0x9c,0x93,0xff,0xb7,0x9d,0x94,0xff,0xb8, 0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9c,0x93,0xff,0x98,0x7b,0x73,0xff,0x82, 0x64,0x5f,0xff,0xa0,0x79,0x71,0xff,0x83,0x6a,0x6b,0xff,0x45,0x43,0x4c,0xff,0x36, 0x3b,0x38,0xff,0x38,0x3b,0x39,0xff,0x38,0x3b,0x38,0xff,0x37,0x3a,0x37,0xff,0x34, 0x39,0x35,0xff,0x35,0x39,0x36,0xff,0x35,0x39,0x36,0xff,0x34,0x39,0x35,0xff,0x36, 0x3b,0x36,0xff,0x29,0x2f,0x28,0xff,0x1c,0x1f,0x21,0xff,0x77,0x64,0x62,0xff,0xca, 0xaf,0xa5,0xff,0xc9,0xb4,0xaa,0xff,0xa2,0x86,0x88,0xff,0x7d,0x5d,0x6c,0xff,0x9d, 0x82,0x83,0xff,0xbb,0xa3,0x9a,0xff,0xbb,0xa2,0x99,0xff,0xbb,0xa3,0x9a,0xff,0xba, 0xa1,0x99,0xff,0xba,0xa2,0x99,0xff,0xbb,0xa3,0x9a,0xff,0xbb,0xa2,0x99,0xff,0xba, 0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xbd,0xa4,0x9b,0xff,0xbb, 0xa2,0x99,0xff,0xbb,0xa2,0x99,0xff,0xba,0xa1,0x99,0xff,0xba,0xa0,0x98,0xff,0xbd, 0xa5,0x9b,0xff,0xb7,0x94,0x92,0xff,0x55,0x4e,0x4b,0xff,0x30,0x36,0x33,0xff,0x36, 0x3a,0x37,0xff,0x38,0x3c,0x39,0xff,0x21,0x24,0x27,0xff,0x9c,0x8e,0x8a,0xff,0xce, 0xb8,0xb1,0xff,0xbe,0xa6,0x9c,0xff,0xb7,0x9e,0x94,0xff,0xb9,0xa1,0x98,0xff,0xb8, 0x9f,0x96,0xff,0xb9,0xa0,0x97,0xff,0xb8,0x9f,0x96,0xff,0xb8,0x9f,0x96,0xff,0xb9, 0x9f,0x96,0xff,0xb6,0x9b,0x92,0xff,0xb8,0x9d,0x94,0xff,0xb8,0x9e,0x95,0xff,0xb7, 0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb8, 0x9e,0x95,0xff,0xb7,0x9c,0x93,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9c,0x93,0xff,0xb9, 0xa0,0x96,0xff,0xa2,0x7b,0x76,0xff,0x4a,0x45,0x44,0xff,0x3f,0x3f,0x41,0xff,0x32, 0x37,0x32,0xff,0x3e,0x3f,0x3e,0xff,0x33,0x34,0x34,0xff,0x1b,0x1e,0x1b,0xff,0x55, 0x47,0x56,0xff,0xb8,0xa1,0x9a,0xff,0xaf,0x92,0x87,0xff,0x9f,0x7d,0x72,0xff,0xb2, 0x97,0x8e,0xff,0xb4,0x98,0x8f,0xff,0xb4,0x99,0x90,0xff,0xb4,0x99,0x90,0xff,0xb5, 0x9a,0x91,0xff,0x9b,0x78,0x6e,0xff,0xc5,0xaf,0xa7,0xff,0xb6,0x9d,0x93,0xff,0xb3, 0x98,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb3, 0x97,0x8e,0xff,0xb3,0x97,0x8e,0xff,0xb2,0x96,0x8c,0xff,0xb2,0x96,0x8d,0xff,0xb2, 0x96,0x8d,0xfe,0xb2,0x96,0x8e,0xfb,0xb0,0x95,0x8c,0xf2,0x6c,0x5b,0x55,0xe2,0x00, 0x00,0x00,0xc4,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0xa4,0x02,0x02,0x02,0xc8,0x26,0x20,0x26,0xe5,0x4e, 0x49,0x50,0xf4,0x11,0x1d,0x14,0xfc,0x5f,0x53,0x5e,0xfe,0x5d,0x51,0x5e,0xff,0x5f, 0x51,0x5c,0xff,0x76,0x59,0x53,0xff,0xc4,0xad,0xa5,0xff,0xaf,0x93,0x8a,0xff,0xaf, 0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x91,0x87,0xff,0xaf,0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xae, 0x8f,0x85,0xff,0xa9,0x8a,0x7f,0xff,0xa6,0x86,0x7c,0xff,0xb0,0x93,0x89,0xff,0xae, 0x90,0x85,0xff,0xae,0x90,0x85,0xff,0xaf,0x92,0x87,0xff,0xa6,0x87,0x7e,0xff,0x6a, 0x51,0x54,0xff,0x3a,0x34,0x3f,0xff,0x63,0x55,0x63,0xff,0x63,0x55,0x63,0xff,0x63, 0x55,0x63,0xff,0x60,0x53,0x61,0xff,0x59,0x4f,0x59,0xff,0x45,0x43,0x45,0xff,0x3d, 0x3e,0x3f,0xff,0x6f,0x5a,0x69,0xff,0x8e,0x6a,0x79,0xff,0x87,0x66,0x72,0xff,0x87, 0x66,0x74,0xff,0x84,0x63,0x71,0xff,0x90,0x6d,0x6f,0xff,0xaa,0x8a,0x7d,0xff,0xaa, 0x8b,0x82,0xff,0xa9,0x8a,0x80,0xff,0xaa,0x8b,0x80,0xff,0xaa,0x8b,0x80,0xff,0xaa, 0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xa9,0x8a,0x80,0xff,0xa8,0x89,0x7e,0xff,0xa8, 0x89,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xa7, 0x87,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xab,0x8a,0x7f,0xff,0x8d,0x70,0x6e,0xff,0x5f, 0x4c,0x57,0xff,0x5e,0x4e,0x5f,0xff,0x4c,0x48,0x4e,0xff,0x1f,0x2c,0x21,0xff,0x50, 0x4b,0x46,0xff,0x75,0x61,0x6b,0xff,0x65,0x55,0x66,0xff,0x78,0x60,0x73,0xff,0x72, 0x5d,0x6e,0xff,0x51,0x4a,0x52,0xff,0x45,0x43,0x46,0xff,0x55,0x4d,0x55,0xff,0x5c, 0x51,0x5d,0xff,0x69,0x56,0x62,0xff,0x62,0x52,0x57,0xff,0x47,0x44,0x39,0xff,0x74, 0x5d,0x5c,0xff,0x9d,0x79,0x79,0xff,0x79,0x63,0x6c,0xff,0x67,0x56,0x69,0xff,0x69, 0x58,0x68,0xff,0x6b,0x58,0x6e,0xff,0x8a,0x70,0x79,0xff,0xaa,0x89,0x7f,0xff,0xae, 0x8e,0x82,0xff,0xa8,0x87,0x7d,0xff,0xa6,0x86,0x7b,0xff,0xa7,0x87,0x7a,0xff,0x94, 0x71,0x6f,0xff,0x9b,0x78,0x71,0xff,0xa5,0x84,0x79,0xff,0xa5,0x84,0x79,0xff,0xa7, 0x86,0x7b,0xff,0xa6,0x85,0x7c,0xff,0xa5,0x84,0x7a,0xff,0xa6,0x85,0x7c,0xff,0xaa, 0x88,0x7c,0xff,0xa7,0x82,0x75,0xff,0x8a,0x70,0x6a,0xff,0x89,0x69,0x69,0xff,0x9f, 0x7d,0x75,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa2, 0x81,0x76,0xff,0xa2,0x81,0x76,0xff,0xa1,0x80,0x75,0xfe,0xa1,0x7f,0x74,0xfd,0xa2, 0x80,0x75,0xfb,0xab,0x88,0x7b,0xf5,0x59,0x47,0x40,0xe9,0x0a,0x08,0x07,0xd7,0x00, 0x00,0x00,0xb9,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x5c,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0xb5,0x03, 0x03,0x03,0xcb,0x2f,0x2e,0x2e,0xdf,0x98,0x8e,0x8b,0xec,0xd5,0xbe,0xb7,0xf5,0xb3, 0x97,0x8d,0xfb,0xb1,0x94,0x8a,0xfd,0xb1,0x95,0x8b,0xfe,0xb0,0x94,0x8a,0xfe,0xb2, 0x96,0x8d,0xff,0xb1,0x95,0x8b,0xff,0xb7,0x99,0x8d,0xff,0xa4,0x82,0x7a,0xff,0x67, 0x58,0x54,0xff,0x36,0x3a,0x3d,0xff,0x3c,0x3d,0x3c,0xff,0x3e,0x3f,0x3f,0xff,0x3b, 0x3d,0x3c,0xff,0x38,0x3b,0x38,0xff,0x38,0x3b,0x39,0xff,0x38,0x3b,0x39,0xff,0x3a, 0x3d,0x3b,0xff,0x24,0x2b,0x28,0xff,0x11,0x17,0x0f,0xff,0x8d,0x7e,0x75,0xff,0xe0, 0xcf,0xc9,0xff,0xb5,0x9a,0x92,0xff,0xb3,0x98,0x8f,0xff,0xb1,0x95,0x8b,0xff,0xb8, 0x9d,0x94,0xff,0xb7,0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb5, 0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0xb6,0x9a,0x91,0xff,0xb7,0x9c,0x93,0xff,0xb7, 0x9e,0x95,0xff,0xb7,0x9e,0x95,0xff,0xb7,0x9c,0x93,0xff,0xb8,0x9e,0x95,0xff,0xb8, 0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xbf,0xa5,0x9b,0xff,0xa7, 0x89,0x88,0xff,0x44,0x3a,0x3c,0xff,0x3e,0x39,0x3c,0xff,0x9e,0x77,0x79,0xff,0x97, 0x76,0x7b,0xff,0x5c,0x50,0x5f,0xff,0x35,0x3a,0x36,0xff,0x3a,0x3d,0x3a,0xff,0x39, 0x3c,0x38,0xff,0x37,0x3b,0x38,0xff,0x35,0x39,0x36,0xff,0x34,0x3a,0x35,0xff,0x35, 0x3a,0x36,0xff,0x35,0x3a,0x36,0xff,0x32,0x37,0x32,0xff,0x18,0x20,0x1c,0xff,0x56, 0x4b,0x52,0xff,0xc3,0xad,0xaf,0xff,0xcc,0xb8,0xaf,0xff,0xbb,0xa2,0x9b,0xff,0xbb, 0xa0,0x93,0xff,0x93,0x74,0x77,0xff,0x9b,0x81,0x86,0xff,0xc0,0xa9,0xa2,0xff,0xc0, 0xa8,0xa0,0xff,0xbc,0xa4,0x9b,0xff,0xbc,0xa3,0x9b,0xff,0xbc,0xa3,0x9c,0xff,0xbd, 0xa5,0x9c,0xff,0xbd,0xa5,0x9b,0xff,0xbb,0xa3,0x9a,0xff,0xbc,0xa4,0x9b,0xff,0xbc, 0xa4,0x9b,0xff,0xbd,0xa5,0x9c,0xff,0xbc,0xa4,0x9b,0xff,0xbb,0xa3,0x9a,0xff,0xbc, 0xa4,0x9c,0xff,0xba,0xa2,0x9a,0xff,0xc5,0xaa,0x9f,0xff,0x83,0x6d,0x76,0xff,0x44, 0x40,0x45,0xff,0x39,0x3b,0x38,0xff,0x3a,0x3d,0x3b,0xff,0x2d,0x32,0x30,0xff,0x4b, 0x3c,0x40,0xff,0xc1,0xb1,0xaf,0xff,0xcc,0xb7,0xaf,0xff,0xbb,0xa2,0x99,0xff,0xba, 0xa1,0x98,0xff,0xbb,0xa1,0x99,0xff,0xb9,0xa0,0x97,0xff,0xba,0xa1,0x98,0xff,0xb9, 0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xba,0xa1,0x98,0xff,0xb8,0x9f,0x96,0xff,0xb9, 0x9f,0x96,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9f,0x96,0xff,0xb8,0x9e,0x95,0xff,0xb8, 0x9f,0x96,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9f,0x96,0xff,0xb8,0x9e,0x95,0xff,0xb9, 0x9f,0x96,0xff,0xb7,0x9c,0x93,0xff,0xbd,0xa3,0x98,0xff,0x8a,0x6c,0x7c,0xff,0x47, 0x44,0x46,0xff,0x3f,0x3f,0x40,0xff,0x31,0x36,0x31,0xff,0x3b,0x3d,0x3c,0xff,0x2a, 0x2a,0x2a,0xff,0x17,0x1a,0x18,0xff,0x50,0x3c,0x43,0xff,0xa8,0x8b,0x82,0xff,0xa7, 0x88,0x7e,0xff,0xb4,0x99,0x8e,0xff,0xb6,0x9b,0x92,0xff,0xb5,0x9a,0x91,0xff,0xb5, 0x9a,0x91,0xff,0xb6,0x9b,0x93,0xff,0xb6,0x9b,0x93,0xff,0x9b,0x77,0x6c,0xff,0xc4, 0xae,0xa6,0xff,0xb8,0xa0,0x97,0xff,0xb3,0x97,0x8e,0xff,0xb4,0x98,0x8e,0xff,0xb4, 0x99,0x8f,0xff,0xb4,0x98,0x8f,0xff,0xb4,0x99,0x8f,0xff,0xb3,0x98,0x8e,0xff,0xb4, 0x98,0x8f,0xff,0xb3,0x97,0x8e,0xff,0xb2,0x96,0x8d,0xfe,0xb3,0x97,0x8e,0xfb,0xb2, 0x96,0x8d,0xf2,0x75,0x61,0x5c,0xe2,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x9f,0x00, 0x00,0x00,0x7f,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0xa0,0x01, 0x01,0x01,0xc5,0x18,0x15,0x17,0xe2,0x41,0x41,0x41,0xf2,0x17,0x22,0x19,0xfb,0x5b, 0x51,0x5b,0xfe,0x5e,0x52,0x5e,0xff,0x5f,0x51,0x5e,0xff,0x65,0x4f,0x56,0xff,0xcd, 0xb7,0xae,0xff,0xb1,0x94,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x93,0x89,0xff,0xaf, 0x93,0x89,0xff,0xaf,0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x93,0x89,0xff,0xaf,0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xb0,0x92,0x88,0xff,0xad,0x8f,0x85,0xff,0xa1, 0x7f,0x74,0xff,0xb0,0x92,0x88,0xff,0xb0,0x92,0x89,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x91,0x87,0xff,0xb2,0x93,0x87,0xff,0x8f,0x75,0x6f,0xff,0x37,0x30,0x3e,0xff,0x52, 0x47,0x51,0xff,0x66,0x58,0x66,0xff,0x64,0x55,0x64,0xff,0x68,0x57,0x67,0xff,0x63, 0x54,0x62,0xff,0x46,0x44,0x47,0xff,0x3c,0x3f,0x3e,0xff,0x6d,0x5a,0x69,0xff,0x88, 0x67,0x73,0xff,0x8a,0x66,0x6b,0xff,0x86,0x64,0x6e,0xff,0x8a,0x68,0x6f,0xff,0x9b, 0x79,0x72,0xff,0xa9,0x89,0x7e,0xff,0xaa,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xac, 0x8d,0x82,0xff,0xa9,0x8a,0x80,0xff,0xa9,0x8a,0x80,0xff,0xa9,0x8a,0x80,0xff,0xaa, 0x8b,0x81,0xff,0xa9,0x8a,0x7f,0xff,0xa9,0x8a,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa9, 0x89,0x7f,0xff,0xaa,0x8b,0x80,0xff,0xa8,0x89,0x7f,0xff,0xa9,0x89,0x7e,0xff,0xa8, 0x88,0x7e,0xff,0xaf,0x8e,0x82,0xff,0x95,0x76,0x6e,0xff,0x68,0x50,0x52,0xff,0x50, 0x47,0x4c,0xff,0x42,0x42,0x48,0xff,0x74,0x62,0x63,0xff,0x7f,0x68,0x6d,0xff,0x61, 0x53,0x64,0xff,0x64,0x55,0x64,0xff,0x64,0x55,0x64,0xff,0x67,0x57,0x67,0xff,0x6f, 0x5b,0x6f,0xff,0x6d,0x5a,0x6d,0xff,0x5d,0x52,0x5f,0xff,0x6f,0x59,0x63,0xff,0x81, 0x61,0x6d,0xff,0x8a,0x6a,0x6f,0xff,0x8e,0x6e,0x6b,0xff,0x70,0x5b,0x65,0xff,0x65, 0x55,0x68,0xff,0x6b,0x59,0x6a,0xff,0x6b,0x59,0x6a,0xff,0x69,0x57,0x68,0xff,0x66, 0x55,0x6a,0xff,0x7b,0x63,0x6c,0xff,0x9c,0x7a,0x74,0xff,0xad,0x8d,0x81,0xff,0xaa, 0x8b,0x80,0xff,0xa6,0x86,0x7c,0xff,0xa8,0x87,0x7c,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7c,0xff,0xa7,0x86,0x7c,0xff,0xa1,0x7f,0x75,0xff,0xa3,0x82,0x77,0xff,0xa6, 0x86,0x7b,0xff,0xa0,0x7b,0x74,0xff,0x89,0x6f,0x6f,0xff,0x8d,0x6b,0x6c,0xff,0x6f, 0x5c,0x5f,0xff,0x96,0x7a,0x72,0xff,0xa7,0x85,0x7a,0xff,0xa4,0x83,0x78,0xff,0xa4, 0x83,0x78,0xff,0xa2,0x81,0x76,0xff,0xa3,0x82,0x77,0xff,0xa2,0x81,0x76,0xff,0xa3, 0x82,0x77,0xff,0xa1,0x80,0x75,0xfe,0xa2,0x81,0x76,0xfe,0xa2,0x80,0x75,0xfb,0xa9, 0x87,0x7b,0xf4,0x50,0x3f,0x3b,0xe8,0x07,0x05,0x05,0xd2,0x00,0x00,0x00,0xb4,0x00, 0x00,0x00,0x8f,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0xbf,0x07,0x06,0x06,0xd5,0x4f,0x49,0x47,0xe5,0xaf,0xa0,0x9a,0xf0,0xd0, 0xb7,0xae,0xf7,0xb0,0x93,0x89,0xfc,0xb0,0x93,0x89,0xfe,0xb1,0x95,0x8b,0xff,0xb2, 0x96,0x8c,0xff,0xb1,0x95,0x8b,0xff,0xb4,0x98,0x8e,0xff,0xb6,0x99,0x8f,0xff,0x95, 0x76,0x7b,0xff,0x59,0x4c,0x49,0xff,0x36,0x3a,0x3c,0xff,0x40,0x40,0x3f,0xff,0x3d, 0x3f,0x3e,0xff,0x3c,0x3e,0x3d,0xff,0x37,0x3b,0x38,0xff,0x38,0x3b,0x38,0xff,0x38, 0x3b,0x38,0xff,0x38,0x3b,0x38,0xff,0x33,0x37,0x34,0xff,0x33,0x34,0x2e,0xff,0x73, 0x5d,0x59,0xff,0x98,0x75,0x7b,0xff,0xad,0x90,0x89,0xff,0xb7,0x9d,0x93,0xff,0xb4, 0x98,0x8f,0xff,0xb1,0x95,0x8c,0xff,0xb8,0x9d,0x94,0xff,0xb7,0x9b,0x92,0xff,0xb7, 0x9c,0x93,0xff,0xb8,0x9e,0x95,0xff,0xb7,0x9c,0x93,0xff,0xb7,0x9c,0x93,0xff,0xb7, 0x9c,0x93,0xff,0xb9,0x9f,0x96,0xff,0xb9,0xa0,0x97,0xff,0xb9,0x9f,0x96,0xff,0xb8, 0x9e,0x95,0xff,0xb8,0x9f,0x96,0xff,0xb8,0x9f,0x96,0xff,0xba,0xa1,0x98,0xff,0xbb, 0xa3,0x9a,0xff,0xc3,0xa9,0x9d,0xff,0xa5,0x8a,0x8f,0xff,0x39,0x37,0x42,0xff,0x3d, 0x38,0x32,0xff,0xa6,0x7c,0x78,0xff,0x86,0x6e,0x6d,0xff,0x46,0x43,0x4b,0xff,0x39, 0x3c,0x3a,0xff,0x3b,0x3e,0x3c,0xff,0x3a,0x3d,0x3a,0xff,0x38,0x3b,0x38,0xff,0x35, 0x3a,0x36,0xff,0x34,0x3a,0x35,0xff,0x34,0x39,0x35,0xff,0x35,0x3a,0x36,0xff,0x1e, 0x26,0x21,0xff,0x38,0x31,0x2d,0xff,0xa9,0x93,0x8c,0xff,0xd3,0xbd,0xb4,0xff,0xbd, 0xa5,0x9e,0xff,0xbc,0xa4,0x9c,0xff,0xc3,0xad,0xa5,0xff,0xa3,0x81,0x79,0xff,0xaa, 0x8a,0x83,0xff,0xc7,0xb2,0xaa,0xff,0xc0,0xa9,0xa1,0xff,0xbc,0xa4,0x9c,0xff,0xbd, 0xa5,0x9d,0xff,0xbd,0xa5,0x9d,0xff,0xbe,0xa6,0x9e,0xff,0xbe,0xa6,0x9e,0xff,0xbd, 0xa5,0x9d,0xff,0xbc,0xa4,0x9c,0xff,0xbc,0xa4,0x9c,0xff,0xbb,0xa2,0x9a,0xff,0xbd, 0xa5,0x9d,0xff,0xbd,0xa5,0x9d,0xff,0xbe,0xa6,0x9e,0xff,0xc0,0xa9,0xa0,0xff,0xb7, 0x93,0x90,0xff,0x56,0x4e,0x4d,0xff,0x34,0x38,0x36,0xff,0x3a,0x3d,0x3b,0xff,0x3b, 0x3e,0x3b,0xff,0x15,0x1b,0x1b,0xff,0x90,0x82,0x7b,0xff,0xcc,0xb6,0xaf,0xff,0xbf, 0xa6,0x9e,0xff,0xbb,0xa3,0x9a,0xff,0xbc,0xa3,0x9b,0xff,0xbb,0xa2,0x99,0xff,0xba, 0xa2,0x99,0xff,0xba,0xa1,0x99,0xff,0xbb,0xa3,0x99,0xff,0xbb,0xa2,0x99,0xff,0xba, 0xa1,0x99,0xff,0xba,0xa1,0x99,0xff,0xba,0xa1,0x98,0xff,0xb9,0x9f,0x96,0xff,0xb9, 0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xba,0xa1,0x98,0xff,0xba, 0xa1,0x98,0xff,0xb9,0xa0,0x97,0xff,0xb9,0x9f,0x96,0xff,0xb9,0x9f,0x96,0xff,0xc1, 0xa7,0x9c,0xff,0x67,0x5a,0x64,0xff,0x41,0x40,0x42,0xff,0x3e,0x3f,0x3f,0xff,0x42, 0x42,0x43,0xff,0x39,0x38,0x39,0xff,0x27,0x26,0x27,0xff,0x11,0x16,0x13,0xff,0x66, 0x4f,0x47,0xff,0xa2,0x83,0x78,0xff,0xb7,0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb6, 0x9b,0x92,0xff,0xb7,0x9c,0x93,0xff,0xb5,0x9a,0x91,0xff,0xb7,0x9c,0x93,0xff,0xb6, 0x9c,0x93,0xff,0x96,0x72,0x68,0xff,0xb7,0x9d,0x93,0xff,0xb7,0x9d,0x94,0xff,0xb4, 0x98,0x8f,0xff,0xb4,0x98,0x8f,0xff,0xb5,0x9a,0x90,0xff,0xb3,0x98,0x8e,0xff,0xb4, 0x99,0x8f,0xff,0xb4,0x99,0x8f,0xff,0xb3,0x96,0x8e,0xff,0xb4,0x98,0x8f,0xff,0xb4, 0x99,0x90,0xfe,0xb3,0x98,0x8e,0xfb,0xb3,0x97,0x8e,0xf2,0x7d,0x69,0x64,0xe2,0x00, 0x00,0x00,0xc3,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xbd,0x08,0x08,0x08,0xdc,0x30, 0x37,0x31,0xf0,0x21,0x2a,0x22,0xf9,0x60,0x53,0x61,0xfe,0x5f,0x53,0x5f,0xff,0x66, 0x55,0x65,0xff,0x6b,0x57,0x66,0xff,0xce,0xb9,0xaf,0xff,0xb3,0x98,0x8e,0xff,0xb0, 0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb0, 0x93,0x89,0xff,0xaf,0x93,0x89,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xaf, 0x92,0x88,0xff,0xb0,0x93,0x89,0xff,0xb0,0x93,0x89,0xff,0xb0,0x93,0x89,0xff,0xaf, 0x92,0x88,0xff,0xae,0x91,0x87,0xff,0xa7,0x88,0x7e,0xff,0xa7,0x86,0x7c,0xff,0xaf, 0x92,0x86,0xff,0xb4,0x97,0x8b,0xff,0xb1,0x94,0x89,0xff,0xb2,0x94,0x89,0xff,0x9e, 0x82,0x7d,0xff,0x51,0x3d,0x47,0xff,0x3e,0x38,0x40,0xff,0x5e,0x50,0x5e,0xff,0x63, 0x55,0x63,0xff,0x67,0x57,0x67,0xff,0x61,0x53,0x61,0xff,0x33,0x38,0x35,0xff,0x28, 0x2f,0x28,0xff,0x5d,0x52,0x5f,0xff,0x70,0x5b,0x6b,0xff,0x8d,0x69,0x6f,0xff,0x8c, 0x64,0x64,0xff,0x91,0x6d,0x6d,0xff,0xac,0x8d,0x80,0xff,0xa7,0x88,0x7e,0xff,0xab, 0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xab,0x8c,0x83,0xff,0xaa,0x8b,0x81,0xff,0xaa, 0x8b,0x81,0xff,0xab,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xaa,0x8b,0x81,0xff,0xaa, 0x8b,0x80,0xff,0xaa,0x8b,0x80,0xff,0xa9,0x8a,0x7f,0xff,0xaa,0x8a,0x80,0xff,0xa9, 0x8a,0x7f,0xff,0xaa,0x8a,0x80,0xff,0xa9,0x89,0x7f,0xff,0xa7,0x87,0x7e,0xff,0xae, 0x8d,0x82,0xff,0xa2,0x82,0x76,0xff,0x75,0x5c,0x5a,0xff,0x63,0x50,0x60,0xff,0x62, 0x53,0x67,0xff,0x61,0x54,0x64,0xff,0x66,0x56,0x65,0xff,0x67,0x56,0x66,0xff,0x66, 0x56,0x65,0xff,0x67,0x57,0x66,0xff,0x68,0x57,0x67,0xff,0x67,0x57,0x68,0xff,0x69, 0x57,0x68,0xff,0x68,0x57,0x69,0xff,0x67,0x57,0x69,0xff,0x64,0x55,0x67,0xff,0x64, 0x55,0x69,0xff,0x6a,0x58,0x6b,0xff,0x6b,0x59,0x6a,0xff,0x6b,0x58,0x69,0xff,0x69, 0x58,0x69,0xff,0x68,0x57,0x68,0xff,0x6a,0x58,0x69,0xff,0x65,0x55,0x69,0xff,0x6f, 0x57,0x64,0xff,0x90,0x71,0x75,0xff,0xab,0x8a,0x82,0xff,0xaa,0x8a,0x7f,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa7,0x86,0x7c,0xff,0xa1, 0x7f,0x75,0xff,0xa3,0x82,0x78,0xff,0xa8,0x88,0x7d,0xff,0x9f,0x7b,0x74,0xff,0x84, 0x6a,0x6d,0xff,0x8b,0x6e,0x73,0xff,0xa8,0x85,0x7d,0xff,0xa8,0x86,0x7a,0xff,0xa6, 0x85,0x7a,0xff,0xa5,0x84,0x7a,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa4, 0x83,0x78,0xff,0xa3,0x82,0x77,0xff,0xa4,0x83,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3, 0x82,0x77,0xfe,0xa1,0x81,0x76,0xfd,0xa4,0x83,0x78,0xfa,0xa4,0x82,0x77,0xf2,0x3d, 0x2f,0x2c,0xe4,0x04,0x03,0x03,0xce,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0xaa,0x00,0x00,0x00,0xc6,0x0b,0x0b,0x0a,0xdb,0x72,0x68,0x64,0xeb,0xbc, 0xa7,0x9f,0xf4,0xc3,0xa6,0x9d,0xf9,0xaf,0x92,0x88,0xfc,0xb0,0x94,0x8a,0xfd,0xb1, 0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb2,0x96,0x8c,0xff,0xb3,0x97,0x8d,0xff,0xb1, 0x94,0x8c,0xff,0x82,0x6b,0x76,0xff,0x4f,0x45,0x4e,0xff,0x37,0x3b,0x3b,0xff,0x40, 0x40,0x40,0xff,0x3d,0x3f,0x3e,0xff,0x3c,0x3e,0x3d,0xff,0x3b,0x3d,0x3c,0xff,0x39, 0x3d,0x3a,0xff,0x38,0x3b,0x38,0xff,0x3a,0x3d,0x3a,0xff,0x35,0x38,0x35,0xff,0x2d, 0x2c,0x2d,0xff,0x70,0x5e,0x64,0xff,0xd3,0xbb,0xb4,0xff,0x99,0x7f,0x85,0xff,0xa7, 0x87,0x80,0xff,0xba,0xa1,0x98,0xff,0xb7,0x9e,0x95,0xff,0xb8,0x9f,0x96,0xff,0xb7, 0x9d,0x94,0xff,0xb6,0x9c,0x93,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb7, 0x9d,0x94,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb9, 0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xba,0xa1,0x98,0xff,0xba, 0xa1,0x98,0xff,0xbc,0xa4,0x9b,0xff,0xc1,0xa7,0x9c,0xff,0xa5,0x8b,0x86,0xff,0x6f, 0x5f,0x69,0xff,0x3c,0x3d,0x40,0xff,0x51,0x46,0x42,0xff,0xa3,0x76,0x72,0xff,0x71, 0x5e,0x57,0xff,0x34,0x39,0x3a,0xff,0x3d,0x3f,0x3e,0xff,0x3b,0x3d,0x3c,0xff,0x39, 0x3c,0x3a,0xff,0x38,0x3b,0x39,0xff,0x36,0x3a,0x37,0xff,0x35,0x39,0x36,0xff,0x36, 0x3b,0x37,0xff,0x2c,0x32,0x2d,0xff,0x2a,0x25,0x2c,0xff,0x93,0x7d,0x80,0xff,0xd6, 0xbe,0xb5,0xff,0xc0,0xa9,0xa2,0xff,0xbd,0xa5,0x9d,0xff,0xbe,0xa6,0x9f,0xff,0xc2, 0xac,0xa3,0xff,0xa1,0x80,0x78,0xff,0xac,0x8e,0x87,0xff,0xc8,0xb3,0xac,0xff,0xc0, 0xa9,0xa2,0xff,0xbe,0xa7,0x9f,0xff,0xbe,0xa5,0x9d,0xff,0xbf,0xa7,0x9f,0xff,0xbe, 0xa6,0x9e,0xff,0xbe,0xa7,0x9f,0xff,0xbf,0xa7,0x9f,0xff,0xbd,0xa5,0x9e,0xff,0xbe, 0xa6,0xa0,0xff,0xbe,0xa6,0x9e,0xff,0xbe,0xa6,0x9e,0xff,0xbd,0xa6,0x9e,0xff,0xbf, 0xa6,0x9f,0xff,0xc8,0xaf,0xa5,0xff,0x82,0x6c,0x6f,0xff,0x3f,0x3d,0x3f,0xff,0x36, 0x3a,0x37,0xff,0x3a,0x3e,0x3b,0xff,0x29,0x2e,0x2b,0xff,0x37,0x26,0x28,0xff,0xc9, 0xb8,0xb6,0xff,0xcf,0xb9,0xb0,0xff,0xba,0xa2,0x99,0xff,0xbc,0xa4,0x9b,0xff,0xbd, 0xa5,0x9c,0xff,0xbc,0xa4,0x9b,0xff,0xbd,0xa5,0x9c,0xff,0xbc,0xa3,0x9b,0xff,0xbd, 0xa5,0x9c,0xff,0xbb,0xa3,0x9a,0xff,0xbc,0xa3,0x9b,0xff,0xbc,0xa3,0x9b,0xff,0xbb, 0xa2,0x99,0xff,0xbb,0xa3,0x9a,0xff,0xbc,0xa4,0x9b,0xff,0xba,0xa1,0x98,0xff,0xbb, 0xa2,0x99,0xff,0xbb,0xa3,0x9a,0xff,0xbb,0xa2,0x99,0xff,0xba,0xa1,0x98,0xff,0xb8, 0x9f,0x96,0xff,0xba,0xa1,0x98,0xff,0xba,0x9b,0x8f,0xff,0x4e,0x4a,0x49,0xff,0x3d, 0x3f,0x3f,0xff,0x3e,0x3f,0x3f,0xff,0x3b,0x3e,0x3c,0xff,0x32,0x32,0x32,0xff,0x24, 0x24,0x24,0xff,0x0f,0x15,0x12,0xff,0x90,0x7b,0x74,0xff,0xb5,0x9b,0x92,0xff,0xb8, 0x9e,0x95,0xff,0xb7,0x9d,0x94,0xff,0xb6,0x9c,0x93,0xff,0xb6,0x9c,0x93,0xff,0xb7, 0x9c,0x93,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xac,0x8f,0x85,0xff,0xb1, 0x94,0x8a,0xff,0xa8,0x86,0x7a,0xff,0xc0,0xa7,0x9e,0xff,0xb5,0x9a,0x90,0xff,0xb5, 0x9a,0x91,0xff,0xb5,0x9a,0x91,0xff,0xb4,0x99,0x90,0xff,0xb5,0x9a,0x91,0xff,0xb5, 0x9a,0x91,0xff,0xb4,0x99,0x8f,0xff,0xb4,0x9a,0x90,0xfe,0xb5,0x9a,0x90,0xfb,0xb3, 0x98,0x8e,0xf2,0x85,0x70,0x6a,0xe2,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0xb4,0x02,0x03,0x02,0xd6,0x1d,0x28,0x1e,0xeb,0x2c,0x34,0x2c,0xf7,0x5b, 0x50,0x5c,0xfd,0x5f,0x52,0x60,0xfe,0x6e,0x5a,0x6d,0xff,0x71,0x5d,0x6c,0xff,0xbb, 0xa2,0x98,0xff,0xb9,0xa0,0x97,0xff,0xb0,0x94,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb1, 0x95,0x8b,0xff,0xb1,0x95,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x95,0x8c,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x93,0x89,0xff,0xb0,0x94,0x8a,0xff,0xb0, 0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x93,0x89,0xff,0xb0,0x95,0x8b,0xff,0xb0, 0x93,0x89,0xff,0xa6,0x86,0x7b,0xff,0x9c,0x7a,0x74,0xff,0x96,0x75,0x79,0xff,0xa3, 0x81,0x78,0xff,0xb6,0x99,0x8d,0xff,0xaf,0x91,0x88,0xff,0x7e,0x64,0x60,0xff,0x34, 0x31,0x3a,0xff,0x4e,0x43,0x4f,0xff,0x65,0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x5e, 0x52,0x5d,0xff,0x2f,0x35,0x30,0xff,0x2c,0x30,0x2d,0xff,0x69,0x58,0x69,0xff,0x5e, 0x52,0x60,0xff,0x69,0x57,0x66,0xff,0x8f,0x72,0x75,0xff,0xbc,0x9e,0x95,0xff,0xb3, 0x97,0x8d,0xff,0xaa,0x8b,0x81,0xff,0xab,0x8c,0x82,0xff,0xac,0x8d,0x83,0xff,0xac, 0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xad,0x8e,0x84,0xff,0xac,0x8d,0x83,0xff,0xac, 0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xab,0x8d,0x82,0xff,0xaa,0x8b,0x81,0xff,0xab, 0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xaa,0x8b,0x81,0xff,0xa9,0x8a,0x7f,0xff,0xa9, 0x8a,0x7f,0xff,0xa9,0x8a,0x7f,0xff,0xa8,0x89,0x7e,0xff,0xae,0x8e,0x83,0xff,0x9c, 0x7e,0x72,0xff,0x83,0x6a,0x64,0xff,0x73,0x5b,0x66,0xff,0x63,0x51,0x63,0xff,0x65, 0x56,0x66,0xff,0x67,0x56,0x66,0xff,0x67,0x57,0x67,0xff,0x67,0x56,0x67,0xff,0x68, 0x56,0x68,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x6a,0x58,0x69,0xff,0x6a, 0x58,0x69,0xff,0x69,0x58,0x69,0xff,0x5d,0x51,0x5d,0xff,0x62,0x54,0x62,0xff,0x6b, 0x59,0x6b,0xff,0x6a,0x58,0x69,0xff,0x6b,0x59,0x6a,0xff,0x69,0x58,0x69,0xff,0x69, 0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x68,0x58,0x6a,0xff,0x6d,0x57,0x6b,0xff,0x83, 0x69,0x77,0xff,0xa4,0x83,0x7d,0xff,0xac,0x8b,0x80,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7c,0xff,0xa7,0x87,0x7d,0xff,0xa8,0x89,0x7f,0xff,0xa6,0x85,0x79,0xff,0xa7, 0x86,0x7c,0xff,0xa8,0x8a,0x7f,0xff,0xac,0x8b,0x7e,0xff,0xab,0x8a,0x7d,0xff,0xa7, 0x86,0x7c,0xff,0xa5,0x84,0x7a,0xff,0xa6,0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa5, 0x84,0x7a,0xff,0xa5,0x84,0x7a,0xff,0xa5,0x84,0x79,0xff,0xa5,0x84,0x7a,0xff,0xa4, 0x83,0x79,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xff,0xa3,0x82,0x77,0xfe,0xa2, 0x81,0x76,0xfd,0xa7,0x85,0x79,0xf9,0x9b,0x7b,0x70,0xf0,0x2e,0x24,0x21,0xe2,0x02, 0x01,0x01,0xcb,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x63,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x2a,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0xb2,0x01,0x01,0x01,0xcc,0x23,0x21,0x20,0xe0,0x95, 0x85,0x7f,0xed,0xc3,0xaa,0xa1,0xf6,0xb7,0x9b,0x91,0xfb,0xaf,0x93,0x89,0xfd,0xb1, 0x95,0x8a,0xfe,0xb1,0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb3, 0x96,0x8c,0xff,0xa9,0x8b,0x83,0xff,0x68,0x5a,0x62,0xff,0x42,0x3f,0x46,0xff,0x3b, 0x3e,0x3d,0xff,0x3f,0x3f,0x3f,0xff,0x3e,0x3f,0x3f,0xff,0x3c,0x3e,0x3d,0xff,0x3c, 0x3e,0x3d,0xff,0x3b,0x3d,0x3b,0xff,0x3a,0x3c,0x3a,0xff,0x39,0x3b,0x39,0xff,0x39, 0x3c,0x39,0xff,0x2b,0x2e,0x2d,0xff,0x53,0x4b,0x50,0xff,0xcd,0xb7,0xb6,0xff,0xce, 0xb9,0xb1,0xff,0xbd,0xa3,0x98,0xff,0xb6,0x9b,0x92,0xff,0xb0,0x94,0x8a,0xff,0xb8, 0x9f,0x96,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb8,0x9e,0x95,0xff,0xb7, 0x9d,0x94,0xff,0xb8,0x9f,0x96,0xff,0xb7,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xba, 0xa1,0x98,0xff,0xb9,0x9f,0x96,0xff,0xb9,0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xb9, 0xa0,0x97,0xff,0xba,0xa1,0x99,0xff,0xbc,0xa4,0x9c,0xff,0xbc,0x9f,0x94,0xff,0x97, 0x7c,0x77,0xff,0x56,0x4d,0x55,0xff,0x40,0x3e,0x44,0xff,0x36,0x3b,0x38,0xff,0x55, 0x4b,0x51,0xff,0x95,0x6d,0x78,0xff,0x68,0x54,0x52,0xff,0x35,0x3a,0x39,0xff,0x3d, 0x3e,0x3e,0xff,0x3b,0x3d,0x3c,0xff,0x39,0x3c,0x3a,0xff,0x36,0x3a,0x37,0xff,0x35, 0x39,0x36,0xff,0x37,0x3b,0x38,0xff,0x32,0x36,0x33,0xff,0x1e,0x22,0x21,0xff,0x75, 0x68,0x6c,0xff,0xd5,0xc0,0xbe,0xff,0xc9,0xb6,0xad,0xff,0xbd,0xa5,0x9d,0xff,0xbe, 0xa8,0xa0,0xff,0xc3,0xad,0xa4,0xff,0xa9,0x8c,0x88,0xff,0x86,0x5f,0x62,0xff,0xb0, 0x96,0x93,0xff,0xd0,0xbf,0xb7,0xff,0xc2,0xac,0xa4,0xff,0xbf,0xa8,0xa0,0xff,0xbf, 0xa8,0xa0,0xff,0xbf,0xa8,0xa0,0xff,0xc1,0xaa,0xa2,0xff,0xc1,0xaa,0xa2,0xff,0xbe, 0xa7,0x9f,0xff,0xbf,0xa7,0x9f,0xff,0xc1,0xa9,0xa1,0xff,0xc0,0xa8,0xa0,0xff,0xc0, 0xaa,0xa2,0xff,0xc1,0xa9,0xa1,0xff,0xc3,0xad,0xa5,0xff,0xb4,0x90,0x8a,0xff,0x57, 0x4d,0x4c,0xff,0x35,0x3a,0x38,0xff,0x39,0x3c,0x39,0xff,0x38,0x3b,0x38,0xff,0x17, 0x1d,0x1a,0xff,0x9b,0x86,0x82,0xff,0x74,0x6c,0x6a,0xff,0xb5,0xa8,0xa3,0xff,0xcb, 0xb5,0xac,0xff,0xbc,0xa4,0x9c,0xff,0xbd,0xa5,0x9d,0xff,0xbc,0xa4,0x9c,0xff,0xbe, 0xa5,0x9e,0xff,0xbd,0xa6,0x9d,0xff,0xbd,0xa5,0x9d,0xff,0xbc,0xa3,0x9b,0xff,0xbd, 0xa5,0x9c,0xff,0xbc,0xa4,0x9b,0xff,0xbb,0xa2,0x9a,0xff,0xbc,0xa4,0x9b,0xff,0xbc, 0xa3,0x9b,0xff,0xbc,0xa4,0x9c,0xff,0xbc,0xa4,0x9b,0xff,0xbb,0xa3,0x9a,0xff,0xba, 0xa1,0x99,0xff,0xb9,0xa0,0x97,0xff,0xba,0xa1,0x98,0xff,0xbe,0xa7,0x9e,0xff,0xa1, 0x7b,0x75,0xff,0x4a,0x45,0x44,0xff,0x3e,0x3e,0x3e,0xff,0x3f,0x40,0x40,0xff,0x2e, 0x36,0x2e,0xff,0x2d,0x2d,0x2d,0xff,0x23,0x23,0x23,0xff,0x16,0x1b,0x18,0xff,0xa7, 0x95,0x8f,0xff,0xba,0xa2,0x99,0xff,0xb8,0x9f,0x96,0xff,0xb7,0x9d,0x94,0xff,0xb8, 0x9f,0x96,0xff,0xb7,0x9d,0x94,0xff,0xb9,0x9f,0x96,0xff,0xb7,0x9c,0x93,0xff,0xb6, 0x9c,0x93,0xff,0xbb,0xa3,0x9a,0xff,0xb9,0x9f,0x96,0xff,0x7d,0x61,0x6d,0xff,0xc0, 0xaa,0xa3,0xff,0xbf,0xa7,0x9f,0xff,0xb6,0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb6, 0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb5,0x9a,0x90,0xff,0xb5,0x9a,0x91,0xff,0xb5, 0x9a,0x91,0xfe,0xb6,0x9b,0x92,0xfb,0xb4,0x99,0x90,0xf2,0x8d,0x77,0x70,0xe2,0x00, 0x00,0x00,0xc3,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0xa8,0x01,0x02,0x01,0xcc,0x16, 0x22,0x17,0xe7,0x2e,0x35,0x2e,0xf5,0x5b,0x4f,0x5b,0xfc,0x61,0x53,0x60,0xfe,0x74, 0x5e,0x72,0xff,0x79,0x61,0x72,0xff,0x9a,0x7e,0x73,0xff,0xc0,0xa9,0xa1,0xff,0xb0, 0x93,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb2,0x96,0x8c,0xff,0xb1, 0x95,0x8c,0xff,0xb2,0x96,0x8d,0xff,0xb1,0x95,0x8c,0xff,0xb1,0x95,0x8b,0xff,0xb0, 0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb0, 0x94,0x8a,0xff,0xb0,0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xaf,0x93,0x89,0xff,0xa3, 0x84,0x7b,0xff,0x8b,0x67,0x6a,0xff,0x83,0x63,0x73,0xff,0x91,0x74,0x7b,0xff,0xa4, 0x80,0x74,0xff,0x94,0x77,0x71,0xff,0x48,0x3b,0x49,0xff,0x4d,0x43,0x4e,0xff,0x59, 0x4c,0x59,0xff,0x66,0x58,0x66,0xff,0x63,0x55,0x63,0xff,0x4f,0x49,0x4f,0xff,0x40, 0x40,0x41,0xff,0x71,0x5c,0x70,0xff,0x65,0x56,0x65,0xff,0x5b,0x4f,0x5d,0xff,0x68, 0x5a,0x69,0xff,0xa1,0x8e,0x8f,0xff,0xcb,0xb3,0xa8,0xff,0xb4,0x99,0x8f,0xff,0xae, 0x90,0x85,0xff,0xb2,0x92,0x86,0xff,0xb2,0x91,0x87,0xff,0xb2,0x93,0x87,0xff,0xb2, 0x93,0x88,0xff,0xb3,0x93,0x88,0xff,0xb1,0x91,0x87,0xff,0xad,0x8f,0x84,0xff,0xac, 0x8f,0x84,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xaa, 0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x80,0xff,0xab,0x8c,0x81,0xff,0xab, 0x8c,0x81,0xff,0xa9,0x8a,0x7f,0xff,0xad,0x8d,0x83,0xff,0xad,0x8e,0x81,0xff,0xa0, 0x82,0x79,0xff,0x7f,0x63,0x63,0xff,0x66,0x51,0x5d,0xff,0x66,0x56,0x69,0xff,0x68, 0x57,0x67,0xff,0x68,0x57,0x68,0xff,0x67,0x56,0x67,0xff,0x69,0x57,0x68,0xff,0x6a, 0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x6a,0x58,0x6a,0xff,0x5e, 0x51,0x5e,0xff,0x61,0x54,0x62,0xff,0x6b,0x59,0x6a,0xff,0x6a,0x58,0x69,0xff,0x6c, 0x59,0x6a,0xff,0x6a,0x59,0x6a,0xff,0x69,0x58,0x69,0xff,0x6b,0x59,0x6a,0xff,0x6e, 0x5b,0x6d,0xff,0x6c,0x5a,0x6c,0xff,0x6a,0x58,0x6d,0xff,0x79,0x62,0x73,0xff,0x9a, 0x7a,0x75,0xff,0xac,0x8b,0x7f,0xff,0xaa,0x8a,0x80,0xff,0xa7,0x87,0x7d,0xff,0xaa, 0x8a,0x7f,0xff,0x93,0x71,0x71,0xff,0x9f,0x7e,0x79,0xff,0xa9,0x89,0x7f,0xff,0xa8, 0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa4,0x83,0x78,0xff,0xa4, 0x83,0x78,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xfe,0xa2,0x82,0x77,0xfd,0xab, 0x88,0x7c,0xf9,0x93,0x75,0x6b,0xf0,0x22,0x1b,0x19,0xe1,0x00,0x00,0x00,0xca,0x00, 0x00,0x00,0xaa,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xba,0x04,0x04,0x04,0xd1,0x44, 0x3f,0x3d,0xe3,0xb0,0x9d,0x96,0xef,0xc2,0xa6,0x9c,0xf7,0xb2,0x95,0x8b,0xfc,0xb0, 0x94,0x8a,0xfd,0xb0,0x94,0x8a,0xfe,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb2, 0x97,0x8c,0xff,0xb3,0x96,0x8c,0xff,0x9f,0x80,0x79,0xff,0x5a,0x50,0x56,0xff,0x3d, 0x3d,0x41,0xff,0x3e,0x3f,0x3f,0xff,0x41,0x41,0x42,0xff,0x3e,0x3f,0x3f,0xff,0x3f, 0x40,0x40,0xff,0x3b,0x3e,0x3c,0xff,0x3b,0x3d,0x3b,0xff,0x3b,0x3d,0x3b,0xff,0x38, 0x3b,0x38,0xff,0x39,0x3c,0x39,0xff,0x31,0x34,0x32,0xff,0x3e,0x3a,0x37,0xff,0xb1, 0x9a,0x94,0xff,0xd7,0xc3,0xbb,0xff,0xb8,0x9e,0x96,0xff,0xb7,0x9e,0x95,0xff,0xb0, 0x94,0x8a,0xff,0xa8,0x88,0x7d,0xff,0xbb,0xa1,0x99,0xff,0xb9,0x9f,0x96,0xff,0xb8, 0x9f,0x96,0xff,0xb9,0xa0,0x97,0xff,0xb8,0x9f,0x96,0xff,0xb9,0xa1,0x98,0xff,0xb9, 0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xba,0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xba, 0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xbe,0xa5,0x9c,0xff,0xb7, 0x99,0x8f,0xff,0x88,0x6c,0x66,0xff,0x4e,0x47,0x4d,0xff,0x3f,0x3f,0x43,0xff,0x44, 0x43,0x45,0xff,0x36,0x3a,0x38,0xff,0x53,0x4c,0x52,0xff,0x93,0x6c,0x7c,0xff,0x67, 0x52,0x53,0xff,0x37,0x3b,0x3a,0xff,0x3b,0x3d,0x3c,0xff,0x3c,0x3d,0x3d,0xff,0x3c, 0x3d,0x3c,0xff,0x38,0x3b,0x38,0xff,0x37,0x3a,0x37,0xff,0x36,0x3a,0x37,0xff,0x21, 0x27,0x25,0xff,0x4d,0x41,0x3d,0xff,0xbb,0xa2,0x9a,0xff,0xd1,0xbc,0xb3,0xff,0xc1, 0xa9,0xa1,0xff,0xc1,0xa9,0xa1,0xff,0xc0,0xa8,0xa0,0xff,0xc6,0xb0,0xa6,0xff,0x9c, 0x7d,0x81,0xff,0x84,0x5d,0x5f,0xff,0xba,0xa1,0x99,0xff,0xcd,0xbb,0xb4,0xff,0xc2, 0xab,0xa3,0xff,0xc3,0xab,0xa3,0xff,0xc2,0xab,0xa3,0xff,0xc2,0xab,0xa3,0xff,0xc2, 0xab,0xa3,0xff,0xc2,0xab,0xa3,0xff,0xc1,0xa9,0xa1,0xff,0xc1,0xaa,0xa2,0xff,0xc0, 0xa9,0xa1,0xff,0xc0,0xa9,0xa1,0xff,0xc0,0xa9,0xa1,0xff,0xc1,0xa9,0xa1,0xff,0xca, 0xb1,0xa7,0xff,0x82,0x6e,0x70,0xff,0x3f,0x3d,0x3f,0xff,0x38,0x3b,0x39,0xff,0x3a, 0x3d,0x3a,0xff,0x2b,0x2f,0x2b,0xff,0x3a,0x32,0x3b,0xff,0xc4,0xb7,0xb8,0xff,0xb5, 0xa6,0x9d,0xff,0x81,0x6e,0x7a,0xff,0xbf,0xae,0xad,0xff,0xd7,0xc7,0xc0,0xff,0xc4, 0xaf,0xa7,0xff,0xc0,0xa8,0x9f,0xff,0xbe,0xa6,0x9e,0xff,0xbe,0xa6,0x9e,0xff,0xbf, 0xa7,0x9f,0xff,0xbe,0xa6,0x9d,0xff,0xc0,0xa8,0x9f,0xff,0xbf,0xa7,0x9f,0xff,0xbd, 0xa5,0x9e,0xff,0xbc,0xa4,0x9b,0xff,0xbc,0xa4,0x9c,0xff,0xbd,0xa5,0x9d,0xff,0xbd, 0xa5,0x9d,0xff,0xbc,0xa3,0x9b,0xff,0xbb,0xa3,0x9a,0xff,0xbc,0xa4,0x9c,0xff,0xbc, 0xa3,0x9a,0xff,0xc1,0xa9,0x9e,0xff,0x8b,0x6e,0x7c,0xff,0x48,0x44,0x48,0xff,0x3e, 0x40,0x40,0xff,0x40,0x40,0x41,0xff,0x2b,0x34,0x2b,0xff,0x29,0x2a,0x29,0xff,0x21, 0x21,0x21,0xff,0x20,0x22,0x23,0xff,0xbb,0xa8,0xa1,0xff,0xbd,0xa4,0x9c,0xff,0xb9, 0xa0,0x97,0xff,0xb8,0x9e,0x95,0xff,0xb9,0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xb8, 0x9f,0x96,0xff,0xb8,0x9f,0x96,0xff,0xb7,0x9c,0x93,0xff,0xb8,0x9f,0x96,0xff,0xb8, 0x9e,0x95,0xff,0xa8,0x8f,0x8f,0xff,0xb8,0x9f,0x96,0xff,0xc5,0xaf,0xa7,0xff,0xb7, 0x9d,0x94,0xff,0xb8,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb8,0x9d,0x94,0xff,0xb4, 0x99,0x8f,0xff,0xb6,0x9b,0x92,0xff,0xb5,0x9a,0x91,0xfe,0xb5,0x9a,0x91,0xfb,0xb6, 0x9b,0x92,0xf3,0x98,0x80,0x79,0xe3,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x9d,0x00, 0x00,0x00,0x76,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x9d,0x03,0x03,0x03,0xc4,0x26,0x27,0x26,0xe1,0x32,0x37,0x32,0xf3,0x60, 0x52,0x60,0xfa,0x62,0x54,0x62,0xfd,0x75,0x5f,0x73,0xff,0x78,0x5f,0x71,0xff,0x81, 0x64,0x5a,0xff,0xc6,0xaf,0xa6,0xff,0xb1,0x94,0x8a,0xff,0xb3,0x97,0x8e,0xff,0xb2, 0x96,0x8d,0xff,0xb3,0x97,0x8e,0xff,0xb2,0x96,0x8d,0xff,0xb0,0x94,0x8b,0xff,0xb2, 0x96,0x8c,0xff,0xb2,0x96,0x8d,0xff,0xb1,0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xb2,0x96,0x8c,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x95,0x8b,0xff,0xb1,0x95,0x8c,0xff,0xb0,0x95,0x8a,0xff,0xac,0x8f,0x85,0xff,0x9e, 0x81,0x80,0xff,0x81,0x5e,0x69,0xff,0x86,0x66,0x72,0xff,0x8b,0x68,0x64,0xff,0x66, 0x4e,0x51,0xff,0x48,0x3f,0x4b,0xff,0x51,0x46,0x51,0xff,0x66,0x56,0x66,0xff,0x6a, 0x59,0x6a,0xff,0x60,0x53,0x60,0xff,0x54,0x4b,0x53,0xff,0x6e,0x5a,0x6d,0xff,0x68, 0x57,0x68,0xff,0x66,0x56,0x65,0xff,0x5e,0x51,0x5f,0xff,0x61,0x52,0x61,0xff,0x9d, 0x8a,0x8d,0xff,0xbf,0xa2,0x9a,0xff,0x82,0x64,0x66,0xff,0x59,0x52,0x53,0xff,0x4b, 0x49,0x43,0xff,0x4f,0x4b,0x48,0xff,0x4c,0x4a,0x44,0xff,0x43,0x45,0x3d,0xff,0x5f, 0x51,0x4d,0xff,0xa4,0x7e,0x7b,0xff,0xb0,0x91,0x86,0xff,0xac,0x8d,0x83,0xff,0xac, 0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xab, 0x8c,0x82,0xff,0xac,0x8d,0x83,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xac, 0x8d,0x83,0xff,0xad,0x8d,0x83,0xff,0xae,0x8e,0x82,0xff,0xa9,0x89,0x7d,0xff,0x8b, 0x6e,0x66,0xff,0x70,0x59,0x63,0xff,0x69,0x57,0x6c,0xff,0x67,0x56,0x68,0xff,0x68, 0x57,0x67,0xff,0x6a,0x58,0x69,0xff,0x6b,0x59,0x6a,0xff,0x6a,0x58,0x69,0xff,0x6a, 0x59,0x69,0xff,0x6c,0x59,0x6b,0xff,0x6c,0x59,0x6b,0xff,0x6b,0x59,0x6a,0xff,0x6b, 0x59,0x6a,0xff,0x6b,0x59,0x6a,0xff,0x6d,0x5a,0x6c,0xff,0x6b,0x59,0x6a,0xff,0x6b, 0x59,0x6a,0xff,0x6d,0x5a,0x6c,0xff,0x6e,0x5b,0x6d,0xff,0x6f,0x5b,0x6e,0xff,0x6e, 0x5a,0x6c,0xff,0x6c,0x59,0x6e,0xff,0x73,0x5e,0x6f,0xff,0x90,0x70,0x6c,0xff,0xab, 0x8a,0x7e,0xff,0xac,0x8d,0x82,0xff,0xac,0x8d,0x80,0xff,0x8c,0x69,0x6c,0xff,0x9c, 0x7b,0x76,0xff,0xab,0x8c,0x80,0xff,0xa8,0x89,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa8, 0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x85,0x7a,0xff,0xa5,0x84,0x7a,0xff,0xa5,0x84,0x7a,0xff,0xa3, 0x82,0x78,0xff,0xa3,0x82,0x77,0xfe,0xa2,0x82,0x77,0xfd,0xad,0x89,0x7e,0xf8,0x88, 0x6c,0x64,0xee,0x19,0x13,0x12,0xde,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0x7e,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xc5,0x0c, 0x0b,0x0b,0xd8,0x6d,0x63,0x5e,0xe7,0xb6,0x9f,0x96,0xf2,0xbd,0xa0,0x97,0xf9,0xb0, 0x94,0x8a,0xfd,0xb0,0x93,0x89,0xfe,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb1, 0x95,0x8b,0xff,0xb3,0x96,0x8c,0xff,0xb0,0x92,0x88,0xff,0x91,0x74,0x6c,0xff,0x4f, 0x49,0x4f,0xff,0x40,0x3f,0x44,0xff,0x3f,0x40,0x40,0xff,0x41,0x41,0x42,0xff,0x40, 0x40,0x40,0xff,0x3e,0x3f,0x3f,0xff,0x3d,0x3e,0x3e,0xff,0x3c,0x3e,0x3c,0xff,0x3b, 0x3d,0x3b,0xff,0x3b,0x3d,0x3b,0xff,0x39,0x3c,0x3a,0xff,0x34,0x38,0x35,0xff,0x37, 0x32,0x33,0xff,0x88,0x71,0x71,0xff,0xe2,0xd2,0xca,0xff,0xbb,0xa2,0x9a,0xff,0xb5, 0x9a,0x91,0xff,0xb8,0x9f,0x96,0xff,0xae,0x91,0x88,0xff,0xa2,0x81,0x77,0xff,0xbb, 0xa2,0x99,0xff,0xb8,0xa0,0x97,0xff,0xb8,0x9f,0x96,0xff,0xb8,0x9f,0x96,0xff,0xba, 0xa2,0x98,0xff,0xba,0xa1,0x98,0xff,0xba,0xa0,0x97,0xff,0xbb,0xa2,0x99,0xff,0xbd, 0xa4,0x9b,0xff,0xba,0xa2,0x98,0xff,0xb9,0xa0,0x97,0xff,0xbb,0xa3,0x9a,0xff,0xbf, 0xa6,0x9d,0xff,0xac,0x8e,0x8c,0xff,0x75,0x5b,0x61,0xff,0x49,0x44,0x48,0xff,0x42, 0x41,0x46,0xff,0x45,0x43,0x45,0xff,0x46,0x44,0x47,0xff,0x33,0x38,0x35,0xff,0x53, 0x49,0x4b,0xff,0x93,0x6e,0x81,0xff,0x63,0x54,0x5d,0xff,0x37,0x3b,0x38,0xff,0x3c, 0x3d,0x3c,0xff,0x3d,0x3e,0x3e,0xff,0x3b,0x3c,0x3b,0xff,0x39,0x3c,0x3a,0xff,0x39, 0x3c,0x3a,0xff,0x29,0x2f,0x2b,0xff,0x38,0x31,0x37,0xff,0x9a,0x83,0x85,0xff,0xd0, 0xb9,0xae,0xff,0xc2,0xaa,0xa2,0xff,0xc2,0xab,0xa3,0xff,0xc2,0xaa,0xa2,0xff,0xc3, 0xab,0xa3,0xff,0xc8,0xb2,0xa9,0xff,0xa7,0x87,0x7f,0xff,0xa5,0x85,0x7c,0xff,0xc8, 0xb3,0xac,0xff,0xc8,0xb2,0xab,0xff,0xc1,0xaa,0xa2,0xff,0xc3,0xac,0xa4,0xff,0xc2, 0xab,0xa3,0xff,0xc3,0xac,0xa4,0xff,0xc3,0xac,0xa4,0xff,0xc3,0xac,0xa4,0xff,0xc3, 0xac,0xa4,0xff,0xc3,0xac,0xa4,0xff,0xc2,0xaa,0xa2,0xff,0xc2,0xab,0xa3,0xff,0xc2, 0xac,0xa4,0xff,0xc6,0xaf,0xa7,0xff,0xb4,0x92,0x89,0xff,0x5c,0x51,0x50,0xff,0x35, 0x39,0x39,0xff,0x39,0x3c,0x3a,0xff,0x39,0x3c,0x39,0xff,0x1e,0x25,0x23,0xff,0x7d, 0x68,0x63,0xff,0xd0,0xbc,0xb7,0xff,0xd4,0xbe,0xb5,0xff,0xb6,0xa0,0x9c,0xff,0xaf, 0x93,0x8a,0xff,0xc7,0xb3,0xab,0xff,0xd0,0xc0,0xba,0xff,0xd2,0xc1,0xbb,0xff,0xc8, 0xb3,0xaa,0xff,0xbf,0xa7,0x9f,0xff,0xbf,0xa7,0x9f,0xff,0xbf,0xa8,0xa0,0xff,0xc0, 0xa8,0xa0,0xff,0xbf,0xa8,0xa0,0xff,0xbe,0xa6,0x9e,0xff,0xbd,0xa5,0x9d,0xff,0xbe, 0xa6,0x9e,0xff,0xbe,0xa6,0x9e,0xff,0xbd,0xa5,0x9d,0xff,0xbe,0xa6,0x9e,0xff,0xbd, 0xa5,0x9d,0xff,0xbc,0xa4,0x9c,0xff,0xbd,0xa5,0x9d,0xff,0xc5,0xac,0xa2,0xff,0x6b, 0x5e,0x6a,0xff,0x42,0x41,0x43,0xff,0x40,0x40,0x40,0xff,0x3f,0x40,0x40,0xff,0x37, 0x39,0x38,0xff,0x27,0x27,0x27,0xff,0x1d,0x1f,0x1d,0xff,0x44,0x38,0x45,0xff,0xbf, 0xab,0xa5,0xff,0xbd,0xa4,0x9c,0xff,0xba,0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xb8, 0x9e,0x95,0xff,0xba,0xa1,0x98,0xff,0xb7,0x9d,0x94,0xff,0xb9,0xa0,0x97,0xff,0xba, 0xa1,0x99,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xbe,0xa3,0x98,0xff,0xbc, 0xa4,0x9b,0xff,0xba,0xa0,0x98,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb7, 0x9d,0x94,0xff,0xb8,0x9e,0x95,0xff,0xb7,0x9c,0x93,0xff,0xb8,0x9e,0x95,0xff,0xb5, 0x9a,0x91,0xfe,0xb7,0x9d,0x94,0xfc,0xb6,0x9b,0x92,0xf5,0x9f,0x87,0x80,0xe5,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x92,0x01,0x00,0x01,0xba,0x0a, 0x08,0x09,0xda,0x1f,0x1c,0x1f,0xee,0x63,0x56,0x64,0xf9,0x62,0x54,0x62,0xfe,0x77, 0x5f,0x74,0xff,0x77,0x5f,0x72,0xff,0x6c,0x52,0x52,0xff,0xcc,0xb6,0xae,0xff,0xb3, 0x97,0x8d,0xff,0xb1,0x95,0x8c,0xff,0xb1,0x95,0x8c,0xff,0xb2,0x96,0x8d,0xff,0xb2, 0x97,0x8e,0xff,0xb2,0x96,0x8d,0xff,0xb3,0x97,0x8e,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x95,0x8b,0xff,0xb2,0x96,0x8d,0xff,0xb3,0x97,0x8d,0xff,0xb1,0x95,0x8b,0xff,0xb2, 0x96,0x8d,0xff,0xb1,0x95,0x8b,0xff,0xb2,0x96,0x8d,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x95,0x8b,0xff,0xb3,0x97,0x8c,0xff,0xb2,0x97,0x8b,0xff,0xa9,0x8b,0x83,0xff,0x9e, 0x7f,0x79,0xff,0x9f,0x7b,0x72,0xff,0x8c,0x70,0x6d,0xff,0x42,0x37,0x46,0xff,0x44, 0x3a,0x44,0xff,0x5d,0x4c,0x5c,0xff,0x6b,0x59,0x69,0xff,0x5b,0x50,0x5c,0xff,0x5c, 0x50,0x5c,0xff,0x6c,0x59,0x6b,0xff,0x69,0x58,0x69,0xff,0x69,0x58,0x69,0xff,0x69, 0x59,0x69,0xff,0x62,0x53,0x63,0xff,0x6a,0x5a,0x6a,0xff,0x61,0x56,0x5b,0xff,0x24, 0x2b,0x22,0xff,0x14,0x21,0x19,0xff,0x18,0x25,0x1b,0xff,0x3f,0x3d,0x41,0xff,0x80, 0x6a,0x72,0xff,0x9c,0x84,0x76,0xff,0x7b,0x69,0x69,0xff,0x79,0x62,0x67,0xff,0xaf, 0x8f,0x82,0xff,0xad,0x8f,0x85,0xff,0xad,0x8f,0x85,0xff,0xad,0x8f,0x85,0xff,0xad, 0x8e,0x83,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xac, 0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xaa,0x8b,0x81,0xff,0xaa, 0x8b,0x81,0xff,0xad,0x8e,0x85,0xff,0xad,0x8e,0x82,0xff,0x93,0x77,0x6c,0xff,0x74, 0x5d,0x64,0xff,0x68,0x55,0x68,0xff,0x67,0x56,0x68,0xff,0x6a,0x58,0x6a,0xff,0x6b, 0x59,0x6a,0xff,0x6b,0x59,0x6a,0xff,0x69,0x57,0x68,0xff,0x6b,0x59,0x6a,0xff,0x70, 0x5b,0x6f,0xff,0x60,0x52,0x60,0xff,0x63,0x54,0x62,0xff,0x6c,0x5a,0x6b,0xff,0x6b, 0x59,0x6a,0xff,0x6d,0x5a,0x6c,0xff,0x6d,0x5a,0x6c,0xff,0x6d,0x5a,0x6c,0xff,0x70, 0x5c,0x6f,0xff,0x6e,0x5b,0x6d,0xff,0x6f,0x5b,0x6e,0xff,0x71,0x5c,0x6f,0xff,0x70, 0x5b,0x70,0xff,0x72,0x5c,0x6f,0xff,0x83,0x63,0x6a,0xff,0xa6,0x87,0x80,0xff,0xb1, 0x92,0x88,0xff,0xa7,0x87,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa8,0x89,0x7e,0xff,0xa9, 0x8a,0x7f,0xff,0xa9,0x8a,0x7f,0xff,0xa8,0x89,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xa7, 0x87,0x7d,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa4,0x83,0x78,0xff,0xa5,0x84,0x7a,0xff,0xa3, 0x82,0x78,0xfe,0xa3,0x82,0x77,0xfc,0xaa,0x88,0x7c,0xf7,0x7b,0x62,0x59,0xed,0x11, 0x0e,0x0c,0xdc,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x5a,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xb4,0x01, 0x01,0x01,0xcd,0x25,0x20,0x1f,0xe0,0x91,0x7f,0x78,0xed,0xb8,0x9d,0x93,0xf5,0xb6, 0x98,0x8e,0xfa,0xb0,0x93,0x89,0xfc,0xb0,0x94,0x89,0xfe,0xb0,0x94,0x8a,0xff,0xb0, 0x94,0x8a,0xff,0xb1,0x95,0x8a,0xff,0xb4,0x98,0x8c,0xff,0xaa,0x8b,0x84,0xff,0x80, 0x62,0x60,0xff,0x48,0x45,0x4a,0xff,0x46,0x43,0x48,0xff,0x42,0x41,0x43,0xff,0x40, 0x40,0x40,0xff,0x40,0x40,0x40,0xff,0x3e,0x3f,0x3f,0xff,0x3e,0x3f,0x3f,0xff,0x3e, 0x3f,0x3f,0xff,0x3c,0x3e,0x3c,0xff,0x3a,0x3c,0x3a,0xff,0x37,0x3b,0x37,0xff,0x35, 0x39,0x35,0xff,0x31,0x33,0x33,0xff,0x64,0x5a,0x5d,0xff,0xd8,0xc2,0xbb,0xff,0xc2, 0xab,0xa3,0xff,0xb6,0x9b,0x92,0xff,0xb8,0x9d,0x94,0xff,0xb9,0x9f,0x96,0xff,0xad, 0x8f,0x85,0xff,0x8d,0x68,0x65,0xff,0x96,0x78,0x7e,0xff,0xc2,0xaa,0x9d,0xff,0xbd, 0xa4,0x99,0xff,0xbd,0xa3,0x99,0xff,0xba,0xa1,0x98,0xff,0xb1,0x94,0x8c,0xff,0xb0, 0x91,0x86,0xff,0xb5,0x9d,0x95,0xff,0xb0,0x98,0x94,0xff,0xba,0xa0,0x98,0xff,0xc1, 0xa7,0x9e,0xff,0xbe,0xa4,0x9b,0xff,0x9c,0x83,0x88,0xff,0x62,0x53,0x62,0xff,0x47, 0x43,0x48,0xff,0x49,0x45,0x4b,0xff,0x48,0x45,0x49,0xff,0x45,0x43,0x46,0xff,0x46, 0x43,0x47,0xff,0x34,0x3a,0x38,0xff,0x5a,0x4d,0x47,0xff,0x90,0x6c,0x76,0xff,0x57, 0x4e,0x5b,0xff,0x38,0x3c,0x3a,0xff,0x3d,0x3e,0x3d,0xff,0x3b,0x3c,0x3b,0xff,0x39, 0x3c,0x3a,0xff,0x3a,0x3d,0x3b,0xff,0x31,0x35,0x31,0xff,0x2a,0x2d,0x2e,0xff,0x6b, 0x58,0x5a,0xff,0xa6,0x84,0x7f,0xff,0xb4,0x99,0x92,0xff,0xc4,0xae,0xa5,0xff,0xc5, 0xae,0xa6,0xff,0xc4,0xae,0xa6,0xff,0xc7,0xaf,0xa6,0xff,0xb3,0x98,0x91,0xff,0x9b, 0x7a,0x70,0xff,0xb6,0x9b,0x91,0xff,0xc9,0xb3,0xac,0xff,0xc4,0xad,0xa5,0xff,0xc3, 0xad,0xa5,0xff,0xc4,0xad,0xa5,0xff,0xc4,0xae,0xa6,0xff,0xc3,0xad,0xa5,0xff,0xc4, 0xad,0xa5,0xff,0xc3,0xad,0xa5,0xff,0xc2,0xac,0xa4,0xff,0xc4,0xad,0xa5,0xff,0xc4, 0xad,0xa5,0xff,0xc4,0xae,0xa6,0xff,0xc3,0xad,0xa5,0xff,0xcd,0xb4,0xa8,0xff,0x83, 0x70,0x75,0xff,0x41,0x3f,0x43,0xff,0x38,0x3b,0x39,0xff,0x3a,0x3e,0x3c,0xff,0x2d, 0x31,0x2d,0xff,0x28,0x26,0x27,0xff,0xb6,0xad,0xa9,0xff,0xda,0xc9,0xc3,0xff,0xc5, 0xaf,0xa7,0xff,0xbe,0xa4,0x9a,0xff,0x98,0x76,0x6f,0xff,0x9b,0x79,0x6f,0xff,0x95, 0x71,0x6d,0xff,0xab,0x8e,0x87,0xff,0xc6,0xb1,0xac,0xff,0xc5,0xb0,0xa8,0xff,0xc5, 0xaf,0xa7,0xff,0xc0,0xa9,0xa1,0xff,0xc0,0xa8,0xa0,0xff,0xbf,0xa8,0xa0,0xff,0xbf, 0xa8,0xa0,0xff,0xbf,0xa8,0xa0,0xff,0xbf,0xa8,0xa0,0xff,0xbc,0xa5,0x9c,0xff,0xbe, 0xa6,0x9e,0xff,0xbd,0xa5,0x9d,0xff,0xbd,0xa5,0x9d,0xff,0xbe,0xa6,0x9e,0xff,0xbe, 0xa6,0x9f,0xff,0xbd,0x9e,0x93,0xff,0x52,0x4d,0x4e,0xff,0x3f,0x3f,0x40,0xff,0x40, 0x40,0x41,0xff,0x2d,0x34,0x2e,0xff,0x41,0x3a,0x40,0xff,0x27,0x26,0x27,0xff,0x1a, 0x1e,0x1b,0xff,0x4e,0x39,0x3c,0xff,0xbf,0xa8,0xa2,0xff,0xbb,0xa2,0x99,0xff,0xba, 0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xb8,0x9e,0x95,0xff,0xb9,0xa0,0x97,0xff,0xb9, 0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xb9, 0xa0,0x97,0xff,0xae,0x96,0x90,0xff,0xba,0xa1,0x98,0xff,0xb8,0x9d,0x94,0xff,0xb8, 0x9e,0x95,0xff,0xb7,0x9d,0x94,0xff,0xb9,0xa0,0x97,0xff,0xb7,0x9d,0x94,0xff,0xb7, 0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xfe,0xb7,0x9d,0x94,0xfc,0xb7, 0x9d,0x94,0xf6,0xa8,0x8e,0x85,0xe8,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x88,0x00,0x00,0x00,0xb1,0x02,0x02,0x02,0xd4,0x24,0x21,0x25,0xeb,0x63, 0x55,0x63,0xf8,0x6a,0x58,0x69,0xfd,0x7a,0x62,0x77,0xfe,0x7a,0x60,0x75,0xff,0x6c, 0x57,0x63,0xff,0xcc,0xb6,0xad,0xff,0xb1,0x94,0x8b,0xff,0x9e,0x7c,0x71,0xff,0xa8, 0x88,0x7d,0xff,0xad,0x8f,0x84,0xff,0xab,0x8d,0x83,0xff,0xb0,0x94,0x8a,0xff,0xb3, 0x97,0x8e,0xff,0xb2,0x96,0x8d,0xff,0xb4,0x98,0x8f,0xff,0xb2,0x95,0x8c,0xff,0xb3, 0x97,0x8e,0xff,0xb4,0x98,0x8f,0xff,0xb2,0x97,0x8d,0xff,0xb2,0x96,0x8c,0xff,0xb2, 0x96,0x8d,0xff,0xb2,0x96,0x8d,0xff,0xb3,0x97,0x8d,0xff,0xb1,0x95,0x8b,0xff,0xb1, 0x96,0x8c,0xff,0xb3,0x97,0x8c,0xff,0xb2,0x94,0x8a,0xff,0xb4,0x97,0x8d,0xff,0xa2, 0x85,0x7f,0xff,0x57,0x41,0x48,0xff,0x34,0x2d,0x36,0xff,0x4f,0x42,0x4f,0xff,0x5e, 0x52,0x5e,0xff,0x50,0x4a,0x51,0xff,0x6b,0x59,0x6b,0xff,0x6a,0x58,0x69,0xff,0x6a, 0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x6b,0x59,0x6a,0xff,0x6a,0x58,0x69,0xff,0x6a, 0x57,0x69,0xff,0x48,0x44,0x4a,0xff,0x06,0x17,0x0a,0xff,0x1a,0x21,0x1c,0xff,0x77, 0x69,0x66,0xff,0xb3,0x95,0x8b,0xff,0xb0,0x91,0x89,0xff,0xb5,0x95,0x8b,0xff,0xb0, 0x93,0x89,0xff,0x9e,0x7e,0x79,0xff,0x94,0x6f,0x6a,0xff,0xa3,0x82,0x77,0xff,0xab, 0x8d,0x82,0xff,0xae,0x90,0x83,0xff,0xb1,0x91,0x86,0xff,0xae,0x8f,0x84,0xff,0xad, 0x8f,0x84,0xff,0xad,0x8f,0x84,0xff,0xad,0x8e,0x84,0xff,0xab,0x8c,0x82,0xff,0xac, 0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xab,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xae, 0x8e,0x84,0xff,0xad,0x8d,0x82,0xff,0xa4,0x86,0x7c,0xff,0x84,0x68,0x69,0xff,0x6b, 0x54,0x60,0xff,0x69,0x57,0x69,0xff,0x69,0x58,0x6a,0xff,0x69,0x58,0x69,0xff,0x6b, 0x59,0x6a,0xff,0x6b,0x59,0x6a,0xff,0x6d,0x5a,0x6c,0xff,0x6b,0x59,0x6a,0xff,0x69, 0x58,0x68,0xff,0x6c,0x5a,0x6b,0xff,0x6d,0x5a,0x6c,0xff,0x6e,0x5b,0x6d,0xff,0x6e, 0x5a,0x6d,0xff,0x6d,0x5b,0x6c,0xff,0x6f,0x5b,0x6e,0xff,0x6f,0x5b,0x6e,0xff,0x70, 0x5b,0x6e,0xff,0x73,0x5d,0x71,0xff,0x74,0x5e,0x72,0xff,0x73,0x5d,0x72,0xff,0x71, 0x5b,0x6f,0xff,0x7c,0x61,0x74,0xff,0x93,0x76,0x75,0xff,0xac,0x8e,0x82,0xff,0xaf, 0x90,0x85,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xa9, 0x89,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6, 0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa3,0x82,0x77,0xfe,0xa3,0x82,0x77,0xfd,0xa4, 0x83,0x78,0xfb,0xaa,0x88,0x7c,0xf5,0x6c,0x56,0x4f,0xeb,0x0b,0x08,0x08,0xd7,0x00, 0x00,0x00,0xbc,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x9f,0x00, 0x00,0x00,0xbb,0x03,0x03,0x04,0xd3,0x3c,0x36,0x33,0xe4,0xad,0x95,0x8d,0xf1,0xb7, 0x9b,0x91,0xf7,0xb0,0x92,0x88,0xfc,0xaf,0x92,0x88,0xfd,0xb0,0x94,0x8a,0xfe,0xaf, 0x92,0x88,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8a,0xff,0xb4,0x97,0x8c,0xff,0xa5, 0x88,0x86,0xff,0x70,0x58,0x63,0xff,0x45,0x42,0x47,0xff,0x48,0x44,0x49,0xff,0x46, 0x44,0x46,0xff,0x42,0x42,0x43,0xff,0x40,0x41,0x41,0xff,0x3e,0x3f,0x3f,0xff,0x3e, 0x3f,0x3f,0xff,0x3e,0x3f,0x3f,0xff,0x3c,0x3e,0x3d,0xff,0x3c,0x3e,0x3c,0xff,0x3a, 0x3c,0x3a,0xff,0x34,0x39,0x35,0xff,0x24,0x2c,0x24,0xff,0x44,0x3b,0x39,0xff,0xa0, 0x89,0x81,0xff,0xc4,0xaa,0xa1,0xff,0xb5,0x99,0x90,0xff,0xb6,0x9c,0x93,0xff,0xb7, 0x9d,0x94,0xff,0xba,0xa0,0x96,0xff,0xb2,0x95,0x8c,0xff,0x85,0x67,0x6c,0xff,0x80, 0x68,0x79,0xff,0xae,0x96,0x91,0xff,0xa6,0x8f,0x8c,0xff,0xab,0x93,0x90,0xff,0x99, 0x7e,0x82,0xff,0x83,0x63,0x6d,0xff,0xa4,0x84,0x7b,0xff,0x90,0x74,0x70,0xff,0x70, 0x56,0x64,0xff,0x97,0x77,0x7a,0xff,0xab,0x95,0x8b,0xff,0x8a,0x75,0x74,0xff,0x58, 0x4c,0x5a,0xff,0x47,0x44,0x49,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x48, 0x45,0x48,0xff,0x45,0x43,0x46,0xff,0x47,0x44,0x48,0xff,0x2d,0x34,0x31,0xff,0x58, 0x4b,0x42,0xff,0x87,0x68,0x6c,0xff,0x43,0x43,0x49,0xff,0x3b,0x3d,0x3c,0xff,0x3b, 0x3e,0x3c,0xff,0x3b,0x3c,0x3c,0xff,0x3a,0x3c,0x3b,0xff,0x38,0x3d,0x39,0xff,0x28, 0x2b,0x29,0xff,0x5d,0x4e,0x57,0xff,0x8f,0x74,0x82,0xff,0x81,0x69,0x7a,0xff,0x92, 0x71,0x72,0xff,0xb0,0x91,0x84,0xff,0xc4,0xac,0xa2,0xff,0xc9,0xb2,0xa7,0xff,0x9b, 0x82,0x75,0xff,0x63,0x4c,0x53,0xff,0x95,0x7c,0x80,0xff,0xc4,0xad,0xa1,0xff,0xc4, 0xae,0xa5,0xff,0xc4,0xae,0xa7,0xff,0xc5,0xaf,0xa7,0xff,0xc4,0xae,0xa6,0xff,0xc5, 0xaf,0xa8,0xff,0xc4,0xad,0xa6,0xff,0xc3,0xad,0xa5,0xff,0xc5,0xae,0xa6,0xff,0xc5, 0xae,0xa6,0xff,0xc3,0xad,0xa5,0xff,0xc3,0xac,0xa4,0xff,0xc3,0xad,0xa4,0xff,0xca, 0xb5,0xad,0xff,0xb5,0x95,0x8f,0xff,0x5a,0x50,0x50,0xff,0x36,0x3a,0x39,0xff,0x3a, 0x3c,0x3a,0xff,0x3b,0x3e,0x3c,0xff,0x1d,0x24,0x21,0xff,0x6c,0x52,0x51,0xff,0xd0, 0xbd,0xb9,0xff,0xd2,0xc0,0xba,0xff,0xb6,0x9a,0x90,0xff,0xb2,0x93,0x86,0xff,0x89, 0x71,0x7c,0xff,0xa4,0x89,0x87,0xff,0xac,0x8d,0x82,0xff,0xa3,0x81,0x76,0xff,0x91, 0x6d,0x6d,0xff,0xa8,0x89,0x82,0xff,0xc8,0xb5,0xad,0xff,0xc7,0xb2,0xab,0xff,0xc0, 0xa9,0xa1,0xff,0xc1,0xa9,0xa1,0xff,0xbf,0xa8,0xa0,0xff,0xbf,0xa8,0xa0,0xff,0xbf, 0xa8,0xa0,0xff,0xbf,0xa8,0xa0,0xff,0xbe,0xa6,0x9e,0xff,0xbe,0xa6,0x9e,0xff,0xbf, 0xa8,0xa0,0xff,0xbd,0xa6,0x9e,0xff,0xc0,0xa9,0xa1,0xff,0xa8,0x83,0x79,0xff,0x4d, 0x48,0x47,0xff,0x3f,0x3f,0x40,0xff,0x43,0x42,0x43,0xff,0x1f,0x27,0x1f,0xff,0x45, 0x3a,0x44,0xff,0x26,0x25,0x26,0xff,0x18,0x1c,0x1a,0xff,0x58,0x46,0x3f,0xff,0xbb, 0xa3,0x9b,0xff,0xbc,0xa3,0x9b,0xff,0xbb,0xa2,0x9a,0xff,0xba,0xa1,0x98,0xff,0xba, 0xa1,0x98,0xff,0xba,0xa1,0x98,0xff,0xb9,0xa0,0x97,0xff,0xba,0xa1,0x98,0xff,0xb9, 0xa0,0x97,0xff,0xb9,0xa0,0x97,0xff,0xc0,0xa6,0x9b,0xff,0x72,0x5b,0x6b,0xff,0xbe, 0xa7,0x9f,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb8, 0x9f,0x96,0xff,0xb7,0x9e,0x95,0xff,0xb8,0x9e,0x95,0xff,0xb7,0x9d,0x94,0xff,0xb7, 0x9d,0x94,0xff,0xb6,0x9b,0x92,0xfd,0xb6,0x9b,0x92,0xf8,0xb0,0x95,0x8c,0xeb,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xa8,0x04, 0x04,0x04,0xce,0x3f,0x39,0x3f,0xe9,0x6a,0x59,0x6a,0xf7,0x77,0x60,0x74,0xfd,0x78, 0x61,0x75,0xfe,0x7b,0x61,0x76,0xff,0x71,0x5d,0x6b,0xff,0xba,0x9f,0x93,0xff,0xa5, 0x85,0x7a,0xff,0xb1,0x94,0x8a,0xff,0xb2,0x96,0x8c,0xff,0xa3,0x82,0x77,0xff,0x9d, 0x7a,0x70,0xff,0xa7,0x88,0x7d,0xff,0xb4,0x99,0x90,0xff,0xb4,0x99,0x90,0xff,0xb5, 0x98,0x8d,0xff,0xac,0x87,0x7d,0xff,0xb1,0x90,0x85,0xff,0xb1,0x93,0x88,0xff,0xaf, 0x91,0x88,0xff,0xb0,0x94,0x8a,0xff,0xb2,0x96,0x8d,0xff,0xb2,0x96,0x8c,0xff,0xb1, 0x95,0x8b,0xff,0xb3,0x97,0x8d,0xff,0xb1,0x95,0x8c,0xff,0xb3,0x97,0x8d,0xff,0xb1, 0x95,0x8c,0xff,0xb4,0x98,0x8f,0xff,0xb0,0x92,0x87,0xff,0x82,0x68,0x63,0xff,0x33, 0x2b,0x39,0xff,0x42,0x37,0x42,0xff,0x4e,0x45,0x4e,0xff,0x4e,0x49,0x4f,0xff,0x6c, 0x5a,0x6c,0xff,0x6a,0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x6b,0x58,0x6a,0xff,0x6d, 0x59,0x6c,0xff,0x6d,0x5a,0x6c,0xff,0x6f,0x5b,0x6e,0xff,0x4d,0x46,0x4d,0xff,0x01, 0x13,0x06,0xff,0x38,0x35,0x2e,0xff,0xbb,0x9a,0x93,0xff,0xc3,0xa8,0x9e,0xff,0xb2, 0x96,0x8c,0xff,0xae,0x90,0x86,0xff,0xb0,0x91,0x87,0xff,0xb0,0x91,0x88,0xff,0xa8, 0x88,0x7e,0xff,0x9d,0x7a,0x6f,0xff,0x99,0x74,0x6a,0xff,0x9a,0x78,0x70,0xff,0x9d, 0x82,0x7e,0xff,0xa9,0x8c,0x84,0xff,0xb0,0x92,0x86,0xff,0xac,0x8e,0x83,0xff,0xad, 0x8e,0x84,0xff,0xad,0x8f,0x84,0xff,0xac,0x8d,0x82,0xff,0xac,0x8c,0x82,0xff,0xac, 0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x82,0xff,0xad, 0x8e,0x83,0xff,0xab,0x8c,0x82,0xff,0x91,0x72,0x67,0xff,0x76,0x5c,0x60,0xff,0x69, 0x58,0x6b,0xff,0x67,0x57,0x69,0xff,0x6a,0x59,0x69,0xff,0x6c,0x5a,0x6b,0xff,0x6d, 0x5a,0x6c,0xff,0x6c,0x5a,0x6b,0xff,0x69,0x57,0x68,0xff,0x6b,0x58,0x6a,0xff,0x6d, 0x5a,0x6c,0xff,0x6d,0x5a,0x6c,0xff,0x6d,0x5a,0x6c,0xff,0x6e,0x5b,0x6c,0xff,0x71, 0x5c,0x6e,0xff,0x70,0x5b,0x6e,0xff,0x71,0x5c,0x6f,0xff,0x73,0x5e,0x71,0xff,0x73, 0x5e,0x71,0xff,0x73,0x5e,0x71,0xff,0x78,0x60,0x74,0xff,0x71,0x5c,0x6e,0xff,0x48, 0x43,0x4b,0xff,0x82,0x6c,0x69,0xff,0xae,0x8f,0x84,0xff,0xb0,0x92,0x85,0xff,0xab, 0x8c,0x82,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xa9,0x8a,0x80,0xff,0xa9, 0x89,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa8, 0x88,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa5, 0x84,0x7a,0xff,0xa4,0x83,0x78,0xfe,0xa4,0x83,0x78,0xfe,0xa4,0x83,0x78,0xfa,0xad, 0x89,0x7e,0xf4,0x56,0x45,0x3e,0xe8,0x07,0x06,0x05,0xd5,0x00,0x00,0x00,0xba,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,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,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0xa6,0x00,0x00,0x00,0xc1,0x11,0x0f,0x0f,0xd8,0x60,0x54,0x4f,0xe8,0xb9, 0x9d,0x95,0xf2,0xb3,0x95,0x8c,0xf9,0xaf,0x91,0x86,0xfc,0xae,0x90,0x86,0xfd,0xaf, 0x92,0x87,0xfe,0xaf,0x91,0x87,0xff,0xaf,0x92,0x88,0xff,0xb2,0x96,0x8b,0xff,0xb3, 0x96,0x8a,0xff,0x99,0x7f,0x80,0xff,0x62,0x52,0x64,0xff,0x43,0x42,0x45,0xff,0x47, 0x45,0x49,0xff,0x47,0x44,0x48,0xff,0x43,0x42,0x44,0xff,0x41,0x41,0x40,0xff,0x40, 0x40,0x40,0xff,0x3f,0x3f,0x3f,0xff,0x3e,0x3f,0x3f,0xff,0x3e,0x3f,0x3e,0xff,0x3b, 0x3d,0x3b,0xff,0x3a,0x3c,0x3a,0xff,0x38,0x3c,0x38,0xff,0x2d,0x33,0x30,0xff,0x37, 0x32,0x34,0xff,0x81,0x67,0x64,0xff,0xc5,0xac,0xa2,0xff,0xb5,0x9a,0x91,0xff,0xb5, 0x9b,0x92,0xff,0xb6,0x9c,0x93,0xff,0xb6,0x9b,0x92,0xff,0xb6,0x9b,0x92,0xff,0x9b, 0x80,0x84,0xff,0x7d,0x5e,0x71,0xff,0x90,0x74,0x80,0xff,0x80,0x6a,0x78,0xff,0x7b, 0x68,0x73,0xff,0x80,0x6a,0x77,0xff,0x83,0x6c,0x79,0xff,0x7b,0x65,0x73,0xff,0x84, 0x66,0x6c,0xff,0xa3,0x80,0x75,0xff,0xa4,0x7e,0x77,0xff,0x75,0x5b,0x5d,0xff,0x36, 0x3b,0x3d,0xff,0x3b,0x3c,0x3c,0xff,0x4b,0x47,0x4c,0xff,0x4d,0x48,0x4e,0xff,0x49, 0x45,0x4a,0xff,0x46,0x44,0x47,0xff,0x45,0x44,0x46,0xff,0x46,0x43,0x47,0xff,0x45, 0x43,0x46,0xff,0x21,0x2b,0x23,0xff,0x3b,0x38,0x35,0xff,0x68,0x56,0x5d,0xff,0x39, 0x3c,0x3b,0xff,0x3e,0x3f,0x3f,0xff,0x3c,0x3e,0x3d,0xff,0x3a,0x3d,0x3c,0xff,0x3c, 0x3f,0x3d,0xff,0x2a,0x30,0x2d,0xff,0x41,0x38,0x3e,0xff,0xa5,0x8e,0x90,0xff,0xc9, 0xb1,0xa7,0xff,0xc0,0xa8,0x9f,0xff,0xb4,0x98,0x8e,0xff,0x90,0x6f,0x68,0xff,0x96, 0x7a,0x77,0xff,0xa4,0x83,0x81,0xff,0x5b,0x4f,0x47,0xff,0x65,0x57,0x57,0xff,0xc5, 0xad,0xae,0xff,0xd1,0xbe,0xb6,0xff,0xc3,0xac,0xa4,0xff,0xc5,0xae,0xa6,0xff,0xc5, 0xaf,0xa7,0xff,0xc3,0xad,0xa5,0xff,0xc3,0xad,0xa5,0xff,0xc5,0xaf,0xa8,0xff,0xc5, 0xaf,0xa8,0xff,0xc6,0xb0,0xa8,0xff,0xc5,0xb0,0xa7,0xff,0xc5,0xaf,0xa7,0xff,0xc5, 0xaf,0xa7,0xff,0xc5,0xaf,0xa8,0xff,0xcf,0xb7,0xab,0xff,0x87,0x73,0x7b,0xff,0x44, 0x40,0x47,0xff,0x3a,0x3c,0x3a,0xff,0x3c,0x3e,0x3c,0xff,0x31,0x33,0x31,0xff,0x21, 0x21,0x25,0xff,0xa8,0x9d,0x9a,0xff,0xda,0xc9,0xc2,0xff,0xc8,0xb3,0xac,0xff,0xab, 0x8c,0x84,0xff,0xbb,0xa1,0x99,0xff,0xc5,0xaf,0xa6,0xff,0xc3,0xad,0xa4,0xff,0xc3, 0xac,0xa4,0xff,0xc4,0xad,0xa5,0xff,0xb9,0x9f,0x97,0xff,0xad,0x8f,0x85,0xff,0xac, 0x8c,0x82,0xff,0xc0,0xa8,0xa1,0xff,0xc8,0xb2,0xa9,0xff,0xc2,0xac,0xa3,0xff,0xbf, 0xa8,0xa0,0xff,0xbf,0xa8,0xa0,0xff,0xc0,0xa8,0xa0,0xff,0xc0,0xa8,0xa0,0xff,0xbe, 0xa7,0x9f,0xff,0xbe,0xa6,0x9e,0xff,0xc0,0xa8,0xa0,0xff,0xbe,0xa6,0x9e,0xff,0xc2, 0xaa,0xa1,0xff,0x92,0x6f,0x78,0xff,0x4a,0x45,0x48,0xff,0x40,0x41,0x42,0xff,0x42, 0x42,0x43,0xff,0x25,0x2b,0x25,0xff,0x42,0x38,0x42,0xff,0x23,0x23,0x23,0xff,0x14, 0x1b,0x16,0xff,0x73,0x63,0x5c,0xff,0xba,0xa2,0x9b,0xff,0xbc,0xa3,0x9b,0xff,0xbb, 0xa2,0x9a,0xff,0xbb,0xa1,0x99,0xff,0xba,0xa1,0x98,0xff,0xba,0xa0,0x98,0xff,0xba, 0xa1,0x98,0xff,0xb9,0xa0,0x97,0xff,0xb9,0xa0,0x98,0xff,0xb9,0xa0,0x96,0xff,0xa5, 0x8e,0x8e,0xff,0x8e,0x69,0x69,0xff,0xb4,0x99,0x90,0xff,0xb8,0x9e,0x95,0xff,0xb7, 0x9d,0x94,0xff,0xb8,0x9d,0x94,0xff,0xb9,0x9f,0x96,0xff,0xb9,0x9f,0x96,0xff,0xb8, 0x9e,0x95,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xff,0xb7,0x9d,0x94,0xfd,0xb6, 0x9b,0x92,0xf9,0xb2,0x98,0x90,0xef,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xb8,0x00, 0x00,0x00,0x8f,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0xa3,0x04,0x04,0x04,0xcb,0x34,0x2c,0x34,0xe7,0x79, 0x63,0x77,0xf6,0x77,0x60,0x74,0xfc,0x79,0x60,0x75,0xfe,0x7d,0x63,0x78,0xff,0x80, 0x65,0x74,0xff,0xa0,0x83,0x78,0xff,0xc0,0xa8,0x9f,0xff,0xb4,0x99,0x8f,0xff,0xb3, 0x97,0x8d,0xff,0xb3,0x97,0x8e,0xff,0xb3,0x98,0x8f,0xff,0xb3,0x97,0x8e,0xff,0xb6, 0x99,0x90,0xff,0xb7,0x98,0x8e,0xff,0xa6,0x8a,0x88,0xff,0x7d,0x62,0x59,0xff,0x84, 0x66,0x60,0xff,0x97,0x74,0x71,0xff,0xa6,0x84,0x77,0xff,0xaf,0x92,0x88,0xff,0xb2, 0x96,0x8c,0xff,0xb3,0x97,0x8e,0xff,0xb2,0x96,0x8c,0xff,0xb1,0x95,0x8c,0xff,0xb3, 0x96,0x8e,0xff,0xb1,0x95,0x8b,0xff,0xb2,0x96,0x8d,0xff,0xb1,0x95,0x8c,0xff,0xb5, 0x99,0x8e,0xff,0xa0,0x85,0x82,0xff,0x55,0x41,0x52,0xff,0x32,0x2b,0x32,0xff,0x40, 0x39,0x41,0xff,0x6a,0x5a,0x69,0xff,0x69,0x57,0x68,0xff,0x6a,0x58,0x69,0xff,0x6a, 0x58,0x69,0xff,0x6e,0x5a,0x6d,0xff,0x6f,0x5c,0x6e,0xff,0x6d,0x5a,0x6c,0xff,0x72, 0x5d,0x71,0xff,0x54,0x4b,0x54,0xff,0x13,0x23,0x14,0xff,0x30,0x33,0x34,0xff,0x80, 0x68,0x76,0xff,0xb0,0x95,0x8c,0xff,0xc2,0xa9,0x9e,0xff,0xb3,0x97,0x8e,0xff,0xad, 0x8d,0x84,0xff,0xad,0x8f,0x85,0xff,0xad,0x8f,0x85,0xff,0xb4,0x96,0x8a,0xff,0xa1, 0x81,0x7a,0xff,0x62,0x4e,0x57,0xff,0x5c,0x4e,0x5e,0xff,0x93,0x74,0x79,0xff,0xaf, 0x90,0x87,0xff,0xb1,0x94,0x89,0xff,0xab,0x8d,0x82,0xff,0xaa,0x8c,0x81,0xff,0xab, 0x8b,0x81,0xff,0xab,0x8b,0x81,0xff,0xab,0x8c,0x82,0xff,0xab,0x8c,0x82,0xff,0xaa, 0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xab,0x8c,0x81,0xff,0xac,0x8d,0x82,0xff,0xa6, 0x87,0x7e,0xff,0x94,0x76,0x6a,0xff,0x84,0x6a,0x6a,0xff,0x71,0x5c,0x6e,0xff,0x65, 0x54,0x67,0xff,0x68,0x57,0x68,0xff,0x6a,0x59,0x6a,0xff,0x6a,0x58,0x69,0xff,0x6a, 0x58,0x69,0xff,0x6d,0x59,0x6c,0xff,0x6b,0x59,0x6a,0xff,0x6a,0x58,0x69,0xff,0x6c, 0x5a,0x6b,0xff,0x6f,0x5c,0x6e,0xff,0x71,0x5d,0x70,0xff,0x71,0x5c,0x6f,0xff,0x72, 0x5c,0x70,0xff,0x74,0x5e,0x72,0xff,0x77,0x60,0x74,0xff,0x75,0x5f,0x73,0xff,0x7e, 0x64,0x76,0xff,0x7b,0x62,0x75,0xff,0x76,0x5e,0x73,0xff,0x70,0x5b,0x72,0xff,0x83, 0x65,0x69,0xff,0xa2,0x82,0x7c,0xff,0xb0,0x91,0x86,0xff,0xad,0x8f,0x84,0xff,0xa9, 0x8a,0x81,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xa9,0x89,0x7e,0xff,0xa8, 0x88,0x7d,0xff,0xa8,0x88,0x7d,0xff,0xa9,0x89,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x85,0x7b,0xff,0xa5,0x85,0x7b,0xff,0xa5, 0x84,0x7a,0xfe,0xa4,0x83,0x79,0xfe,0xa4,0x83,0x79,0xfa,0xa9,0x88,0x7b,0xf3,0x48, 0x39,0x34,0xe7,0x05,0x04,0x04,0xd2,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x92,0x00, 0x00,0x00,0x6a,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x9f,0x03,0x02,0x02,0xc3,0x32,0x28,0x25,0xdb,0x89, 0x76,0x6e,0xeb,0xc7,0xa9,0x9d,0xf4,0xb7,0x98,0x8c,0xfb,0xb7,0x98,0x8c,0xfd,0xb7, 0x98,0x8c,0xfe,0xb9,0x9a,0x8e,0xfe,0xb8,0x9a,0x8f,0xff,0xb9,0x9b,0x8f,0xff,0xb8, 0x9a,0x8e,0xff,0xaf,0x91,0x86,0xff,0x8a,0x72,0x74,0xff,0x55,0x4a,0x59,0xff,0x45, 0x43,0x47,0xff,0x48,0x45,0x49,0xff,0x47,0x44,0x48,0xff,0x47,0x44,0x48,0xff,0x41, 0x40,0x42,0xff,0x40,0x40,0x40,0xff,0x40,0x40,0x40,0xff,0x40,0x40,0x40,0xff,0x3e, 0x3f,0x3f,0xff,0x3d,0x3e,0x3d,0xff,0x3a,0x3c,0x3a,0xff,0x39,0x3c,0x39,0xff,0x31, 0x36,0x31,0xff,0x27,0x2b,0x24,0xff,0x75,0x64,0x68,0xff,0xbe,0xab,0xa1,0xff,0xcd, 0xb4,0xaa,0xff,0xc9,0xb1,0xa7,0xff,0xca,0xb2,0xa8,0xff,0xcc,0xb4,0xaa,0xff,0xcf, 0xb8,0xad,0xff,0xb4,0x9c,0x9c,0xff,0x7e,0x60,0x72,0xff,0xb7,0x97,0x90,0xff,0xd7, 0xc1,0xb6,0xff,0xd3,0xbd,0xb2,0xff,0xd4,0xbf,0xb5,0xff,0xd3,0xbd,0xb3,0xff,0xd5, 0xc0,0xb6,0xff,0xcd,0xb5,0xaa,0xff,0xb4,0x95,0x8c,0xff,0xb6,0x97,0x91,0xff,0xac, 0x8e,0x84,0xff,0x68,0x56,0x55,0xff,0x3c,0x3e,0x40,0xff,0x40,0x40,0x41,0xff,0x49, 0x46,0x4a,0xff,0x4c,0x47,0x4d,0xff,0x46,0x44,0x47,0xff,0x45,0x43,0x46,0xff,0x44, 0x43,0x45,0xff,0x46,0x44,0x47,0xff,0x37,0x3a,0x37,0xff,0x36,0x39,0x35,0xff,0x59, 0x4f,0x58,0xff,0x50,0x4a,0x50,0xff,0x3c,0x3e,0x3d,0xff,0x3e,0x3f,0x3f,0xff,0x3d, 0x3e,0x3e,0xff,0x3a,0x3c,0x3a,0xff,0x36,0x3b,0x37,0xff,0x39,0x36,0x35,0xff,0x89, 0x7a,0x77,0xff,0xd6,0xc4,0xbb,0xff,0xd7,0xc2,0xb8,0xff,0xd9,0xc6,0xbd,0xff,0xcc, 0xb1,0xa5,0xff,0x8f,0x74,0x7a,0xff,0x6c,0x58,0x72,0xff,0x7a,0x5e,0x70,0xff,0xb1, 0x94,0x94,0xff,0xe4,0xd8,0xd1,0xff,0xeb,0xe1,0xdc,0xff,0xe1,0xd0,0xc9,0xff,0xdb, 0xca,0xc2,0xff,0xdd,0xcc,0xc4,0xff,0xdc,0xcb,0xc4,0xff,0xda,0xc9,0xc1,0xff,0xd9, 0xc6,0xbe,0xff,0xd7,0xc3,0xba,0xff,0xd7,0xc3,0xba,0xff,0xd6,0xc3,0xbb,0xff,0xd6, 0xc3,0xb9,0xff,0xd5,0xc2,0xb9,0xff,0xd6,0xc2,0xb9,0xff,0xdc,0xcb,0xc0,0xff,0xc0, 0xa1,0x9e,0xff,0x5c,0x52,0x52,0xff,0x38,0x3b,0x3a,0xff,0x3c,0x3e,0x3d,0xff,0x39, 0x3b,0x3a,0xff,0x1d,0x21,0x1f,0xff,0x59,0x48,0x4f,0xff,0xd5,0xc6,0xc5,0xff,0xe8, 0xda,0xd3,0xff,0xc6,0xae,0xa3,0xff,0xb1,0x91,0x89,0xff,0xcc,0xb7,0xae,0xff,0xda, 0xc7,0xbf,0xff,0xda,0xc7,0xbf,0xff,0xd7,0xc4,0xbc,0xff,0xd4,0xc0,0xb6,0xff,0xd3, 0xbd,0xb4,0xff,0xd4,0xbf,0xb6,0xff,0xd5,0xc1,0xb7,0xff,0xce,0xb7,0xac,0xff,0xb9, 0x9b,0x9b,0xff,0xcb,0xb4,0xae,0xff,0xd4,0xc0,0xb7,0xff,0xd3,0xbf,0xb6,0xff,0xd2, 0xbd,0xb4,0xff,0xd0,0xbb,0xb1,0xff,0xd1,0xbc,0xb3,0xff,0xd1,0xbc,0xb3,0xff,0xd4, 0xc1,0xb7,0xff,0xd2,0xbd,0xb4,0xff,0xdc,0xc6,0xbb,0xff,0x75,0x64,0x71,0xff,0x43, 0x41,0x44,0xff,0x3f,0x3f,0x3f,0xff,0x41,0x41,0x42,0xff,0x1c,0x24,0x1d,0xff,0x39, 0x31,0x39,0xff,0x24,0x24,0x25,0xff,0x10,0x16,0x12,0xff,0xac,0x9a,0x93,0xff,0xd0, 0xb9,0xb0,0xff,0xcd,0xb6,0xad,0xff,0xce,0xb8,0xaf,0xff,0xcd,0xb6,0xad,0xff,0xcc, 0xb5,0xab,0xff,0xcb,0xb4,0xab,0xff,0xcb,0xb4,0xab,0xff,0xc8,0xb0,0xa7,0xff,0xc9, 0xb1,0xa8,0xff,0xc9,0xb1,0xa5,0xff,0x86,0x6a,0x74,0xff,0xbc,0xa0,0x94,0xff,0xc8, 0xaf,0xa4,0xff,0xc3,0xa9,0x9f,0xff,0xc2,0xa8,0x9d,0xff,0xc1,0xa6,0x9b,0xff,0xc2, 0xa7,0x9d,0xff,0xc1,0xa6,0x9b,0xff,0xc1,0xa6,0x9b,0xff,0xc1,0xa6,0x9b,0xff,0xc1, 0xa5,0x9a,0xff,0xc0,0xa4,0x99,0xfe,0xbf,0xa3,0x98,0xfa,0xbc,0xa0,0x96,0xf0,0x07, 0x06,0x06,0xde,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x56,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0xa2,0x01, 0x01,0x01,0xca,0x22,0x1b,0x21,0xe6,0x7d,0x64,0x7a,0xf5,0x79,0x61,0x75,0xfc,0x7d, 0x63,0x78,0xfe,0x81,0x65,0x78,0xff,0x84,0x67,0x76,0xff,0xa1,0x84,0x76,0xff,0xde, 0xcc,0xc4,0xff,0xc9,0xb2,0xa7,0xff,0xc5,0xad,0xa2,0xff,0xc4,0xab,0xa0,0xff,0xc4, 0xac,0xa1,0xff,0xc2,0xa7,0x9c,0xff,0xaa,0x8a,0x7f,0xff,0x7f,0x69,0x68,0xff,0x4a, 0x41,0x4c,0xff,0x1b,0x29,0x1f,0xff,0x2f,0x36,0x33,0xff,0x62,0x54,0x5c,0xff,0xac, 0x8a,0x84,0xff,0xbc,0xa4,0x9b,0xff,0xb4,0x99,0x8e,0xff,0xbd,0xa1,0x96,0xff,0xbd, 0x9f,0x95,0xff,0xbc,0x9f,0x94,0xff,0xbd,0x9f,0x95,0xff,0xbc,0x9e,0x94,0xff,0xbc, 0x9e,0x93,0xff,0xbc,0x9f,0x93,0xff,0xbd,0x9f,0x92,0xff,0xb2,0x91,0x88,0xff,0x6f, 0x52,0x54,0xff,0x24,0x23,0x29,0xff,0x36,0x31,0x36,0xff,0x67,0x56,0x67,0xff,0x6e, 0x5b,0x6d,0xff,0x68,0x57,0x68,0xff,0x66,0x57,0x66,0xff,0x60,0x53,0x60,0xff,0x67, 0x56,0x66,0xff,0x73,0x5d,0x72,0xff,0x70,0x5d,0x70,0xff,0x47,0x44,0x47,0xff,0x2c, 0x35,0x2d,0xff,0x5b,0x50,0x5b,0xff,0x65,0x54,0x67,0xff,0x6d,0x5b,0x64,0xff,0xa6, 0x8a,0x81,0xff,0xc8,0xae,0xa2,0xff,0xc6,0xac,0xa2,0xff,0xc1,0xa6,0x9b,0xff,0xc6, 0xab,0xa0,0xff,0xba,0x9f,0x98,0xff,0x85,0x6d,0x77,0xff,0x73,0x64,0x74,0xff,0xaf, 0x9a,0x97,0xff,0xaf,0x8b,0x83,0xff,0x98,0x71,0x71,0xff,0xb9,0x9e,0x98,0xff,0xc7, 0xb1,0xa8,0xff,0xc9,0xb0,0xa7,0xff,0xcb,0xb4,0xaa,0xff,0xcb,0xb3,0xa9,0xff,0xca, 0xb1,0xa7,0xff,0xca,0xb1,0xa8,0xff,0xc9,0xaf,0xa5,0xff,0xc8,0xae,0xa4,0xff,0xc8, 0xae,0xa4,0xff,0xc5,0xaa,0xa0,0xff,0xc4,0xa8,0x9e,0xff,0xbb,0x9f,0x96,0xff,0xbc, 0x9e,0x91,0xff,0xb1,0x91,0x92,0xff,0x87,0x6b,0x77,0xff,0x69,0x56,0x64,0xff,0x66, 0x56,0x67,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x67,0xff,0x69,0x57,0x68,0xff,0x68, 0x57,0x67,0xff,0x68,0x57,0x67,0xff,0x6a,0x58,0x69,0xff,0x6d,0x5b,0x6c,0xff,0x6e, 0x5a,0x6d,0xff,0x70,0x5c,0x6f,0xff,0x73,0x5e,0x71,0xff,0x75,0x5f,0x73,0xff,0x76, 0x5f,0x74,0xff,0x76,0x5f,0x73,0xff,0x77,0x60,0x75,0xff,0x76,0x5f,0x74,0xff,0x76, 0x5f,0x73,0xff,0x74,0x5f,0x72,0xff,0x6e,0x5b,0x70,0xff,0x75,0x5a,0x6a,0xff,0x96, 0x78,0x7b,0xff,0xb2,0x92,0x88,0xff,0xb9,0x99,0x8d,0xff,0xb8,0x98,0x8e,0xff,0xb8, 0x98,0x8e,0xff,0xb6,0x97,0x8b,0xff,0xb7,0x96,0x8c,0xff,0xb6,0x96,0x8c,0xff,0xb5, 0x95,0x89,0xff,0xb5,0x93,0x88,0xff,0xb4,0x92,0x87,0xff,0xb3,0x91,0x86,0xff,0xaa, 0x8b,0x7f,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa5,0x84,0x7a,0xff,0xa5,0x84,0x7a,0xfe,0xa4, 0x83,0x79,0xfd,0xa5,0x84,0x79,0xfa,0xa4,0x83,0x77,0xf2,0x3a,0x2f,0x2a,0xe5,0x04, 0x03,0x03,0xcf,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0xaf,0x11, 0x10,0x10,0xd2,0x74,0x64,0x62,0xe7,0x90,0x7e,0x7a,0xf4,0x81,0x6f,0x6b,0xfb,0x82, 0x70,0x6c,0xfd,0x84,0x71,0x6f,0xff,0x87,0x73,0x71,0xff,0x8a,0x77,0x76,0xff,0x8b, 0x77,0x76,0xff,0x8d,0x79,0x79,0xff,0x8e,0x79,0x78,0xff,0x7d,0x66,0x68,0xff,0x4b, 0x45,0x51,0xff,0x46,0x44,0x46,0xff,0x4a,0x46,0x4b,0xff,0x48,0x45,0x49,0xff,0x49, 0x45,0x49,0xff,0x45,0x43,0x46,0xff,0x40,0x40,0x41,0xff,0x3e,0x3f,0x3f,0xff,0x3f, 0x40,0x40,0xff,0x3d,0x3e,0x3e,0xff,0x3d,0x3f,0x3e,0xff,0x3b,0x3d,0x3c,0xff,0x3a, 0x3d,0x3a,0xff,0x38,0x3b,0x37,0xff,0x2a,0x31,0x2b,0xff,0x24,0x28,0x21,0xff,0x73, 0x65,0x62,0xff,0xa6,0x95,0x97,0xff,0x98,0x8b,0x8c,0xff,0x9a,0x8c,0x8e,0xff,0x9b, 0x8d,0x8e,0xff,0x9c,0x8f,0x90,0xff,0xa1,0x93,0x94,0xff,0x88,0x7b,0x7f,0xff,0x60, 0x56,0x5d,0xff,0x9c,0x8d,0x89,0xff,0xa0,0x92,0x94,0xff,0xa1,0x92,0x95,0xff,0xa2, 0x94,0x97,0xff,0xa4,0x96,0x99,0xff,0xa4,0x97,0x99,0xff,0xa5,0x98,0x9b,0xff,0xaa, 0x9f,0xa2,0xff,0x98,0x86,0x86,0xff,0x63,0x50,0x53,0xff,0x4c,0x47,0x53,0xff,0x4b, 0x47,0x4a,0xff,0x37,0x3a,0x37,0xff,0x3e,0x3e,0x3e,0xff,0x4a,0x46,0x4a,0xff,0x46, 0x43,0x46,0xff,0x44,0x43,0x46,0xff,0x44,0x43,0x45,0xff,0x45,0x43,0x46,0xff,0x2d, 0x34,0x2f,0xff,0x51,0x48,0x48,0xff,0x8d,0x6b,0x80,0xff,0x56,0x4d,0x56,0xff,0x3b, 0x3d,0x3b,0xff,0x3e,0x3f,0x3f,0xff,0x3c,0x3e,0x3d,0xff,0x39,0x3b,0x39,0xff,0x32, 0x37,0x34,0xff,0x41,0x3c,0x38,0xff,0x86,0x78,0x77,0xff,0xa9,0x9c,0x9e,0xff,0x9b, 0x8e,0x8f,0xff,0x9f,0x94,0x96,0xff,0x8c,0x79,0x78,0xff,0x69,0x56,0x5b,0xff,0x51, 0x48,0x56,0xff,0x7e,0x66,0x62,0xff,0xd5,0xc0,0xb8,0xff,0xdd,0xce,0xc7,0xff,0xb0, 0xa1,0x9d,0xff,0xa0,0x97,0x99,0xff,0xa4,0x9a,0x9b,0xff,0xa3,0x99,0x9b,0xff,0xa3, 0x9a,0x9b,0xff,0xa5,0x9b,0x9e,0xff,0xa3,0x97,0x98,0xff,0x9f,0x92,0x93,0xff,0xa0, 0x91,0x93,0xff,0x9e,0x8f,0x91,0xff,0xa1,0x92,0x94,0xff,0xa1,0x91,0x94,0xff,0xa2, 0x92,0x95,0xff,0xab,0x9a,0x9c,0xff,0x7d,0x6a,0x76,0xff,0x49,0x43,0x49,0xff,0x3e, 0x3f,0x3f,0xff,0x40,0x42,0x40,0xff,0x2e,0x30,0x2e,0xff,0x1b,0x1f,0x1f,0xff,0x51, 0x47,0x42,0xff,0x97,0x8a,0x8a,0xff,0xa5,0x9b,0x9d,0xff,0x8e,0x78,0x78,0xff,0x9c, 0x8e,0x90,0xff,0xb0,0xa0,0xa7,0xff,0xa8,0x9b,0x9e,0xff,0xa3,0x98,0x9a,0xff,0xa2, 0x95,0x98,0xff,0x9f,0x91,0x92,0xff,0x9d,0x8f,0x90,0xff,0x9e,0x8f,0x91,0xff,0x9e, 0x90,0x92,0xff,0xa8,0x9a,0x9b,0xff,0x5a,0x4d,0x50,0xff,0x91,0x82,0x85,0xff,0xa4, 0x96,0x99,0xff,0xa3,0x94,0x98,0xff,0xa5,0x95,0x99,0xff,0xa4,0x93,0x97,0xff,0xa5, 0x94,0x98,0xff,0xa6,0x97,0x9b,0xff,0xa5,0x97,0x9a,0xff,0xa3,0x93,0x96,0xff,0xa3, 0x96,0x96,0xff,0x4e,0x4c,0x4e,0xff,0x3e,0x3e,0x3f,0xff,0x3b,0x3e,0x3c,0xff,0x41, 0x42,0x42,0xff,0x14,0x1c,0x14,0xff,0x29,0x26,0x29,0xff,0x27,0x25,0x26,0xff,0x19, 0x1d,0x19,0xff,0x90,0x86,0x85,0xff,0xa1,0x92,0x94,0xff,0x9e,0x90,0x91,0xff,0x9f, 0x90,0x92,0xff,0x9c,0x8d,0x90,0xff,0x9e,0x8e,0x90,0xff,0x9e,0x8d,0x90,0xff,0x9d, 0x8c,0x8e,0xff,0x9c,0x8a,0x8d,0xff,0x99,0x87,0x89,0xff,0x98,0x87,0x89,0xff,0x7f, 0x69,0x63,0xff,0xa1,0x8f,0x92,0xff,0x99,0x8a,0x8a,0xff,0x91,0x7f,0x80,0xff,0x90, 0x7e,0x7e,0xff,0x8e,0x7c,0x7b,0xff,0x8f,0x7d,0x7d,0xff,0x8d,0x7b,0x7b,0xff,0x8d, 0x7b,0x7b,0xff,0x8f,0x7d,0x7d,0xff,0x8e,0x7b,0x7b,0xff,0x8f,0x7c,0x7c,0xfe,0x90, 0x7c,0x7d,0xfb,0x8d,0x79,0x79,0xf2,0x09,0x09,0x08,0xe0,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0xa0,0x03,0x03,0x03,0xc9,0x3b,0x2f,0x3a,0xe5,0x7b, 0x63,0x78,0xf5,0x78,0x60,0x75,0xfc,0x7d,0x63,0x78,0xfe,0x83,0x66,0x78,0xff,0x82, 0x66,0x77,0xff,0x99,0x79,0x78,0xff,0xaf,0xa4,0xaa,0xff,0xa3,0x91,0x94,0xff,0xa1, 0x8f,0x93,0xff,0xa0,0x8c,0x8e,0xff,0x9d,0x89,0x8d,0xff,0x98,0x84,0x86,0xff,0x73, 0x5b,0x5d,0xff,0x34,0x38,0x3a,0xff,0x0d,0x1e,0x0f,0xff,0x18,0x24,0x1a,0xff,0x25, 0x2f,0x26,0xff,0x54,0x4b,0x54,0xff,0x8c,0x6e,0x7c,0xff,0xb8,0x9c,0x8f,0xff,0xaf, 0x97,0x90,0xff,0x8b,0x78,0x79,0xff,0x85,0x75,0x71,0xff,0x84,0x74,0x6f,0xff,0x85, 0x75,0x71,0xff,0x86,0x75,0x71,0xff,0x87,0x76,0x72,0xff,0x87,0x76,0x73,0xff,0x89, 0x76,0x75,0xff,0x7f,0x6e,0x6b,0xff,0x50,0x44,0x43,0xff,0x2a,0x26,0x2c,0xff,0x25, 0x23,0x25,0xff,0x37,0x33,0x37,0xff,0x64,0x54,0x63,0xff,0x6b,0x58,0x6b,0xff,0x62, 0x54,0x62,0xff,0x5b,0x51,0x5c,0xff,0x5e,0x52,0x60,0xff,0x61,0x53,0x60,0xff,0x4e, 0x47,0x4d,0xff,0x43,0x42,0x44,0xff,0x57,0x4e,0x57,0xff,0x76,0x60,0x74,0xff,0x6c, 0x59,0x6a,0xff,0x61,0x52,0x64,0xff,0x70,0x5c,0x68,0xff,0x9b,0x84,0x83,0xff,0x98, 0x8d,0x8c,0xff,0x92,0x83,0x82,0xff,0x9b,0x8d,0x8b,0xff,0x7f,0x72,0x78,0xff,0x51, 0x44,0x51,0xff,0x7b,0x6d,0x70,0xff,0xab,0x9f,0x9e,0xff,0x8d,0x7d,0x7a,0xff,0x58, 0x46,0x43,0xff,0x89,0x73,0x70,0xff,0xb6,0xa3,0x9e,0xff,0x93,0x8d,0x8d,0xff,0x9c, 0x93,0x93,0xff,0x9a,0x92,0x90,0xff,0x97,0x8f,0x8c,0xff,0x95,0x8d,0x8a,0xff,0x95, 0x8d,0x8a,0xff,0x96,0x8d,0x8a,0xff,0x95,0x8c,0x89,0xff,0x92,0x88,0x85,0xff,0x8f, 0x85,0x82,0xff,0x8f,0x83,0x80,0xff,0x8c,0x80,0x7c,0xff,0x8c,0x80,0x7a,0xff,0x7f, 0x69,0x68,0xff,0x68,0x54,0x5f,0xff,0x63,0x54,0x64,0xff,0x67,0x56,0x65,0xff,0x61, 0x53,0x61,0xff,0x63,0x54,0x63,0xff,0x68,0x56,0x67,0xff,0x66,0x56,0x65,0xff,0x68, 0x57,0x67,0xff,0x6b,0x59,0x6a,0xff,0x6c,0x59,0x6b,0xff,0x71,0x5d,0x6f,0xff,0x76, 0x5f,0x73,0xff,0x74,0x5e,0x72,0xff,0x7b,0x61,0x73,0xff,0x7b,0x62,0x75,0xff,0x73, 0x5e,0x71,0xff,0x75,0x5f,0x73,0xff,0x76,0x5f,0x73,0xff,0x74,0x5e,0x71,0xff,0x71, 0x5d,0x70,0xff,0x6b,0x59,0x6c,0xff,0x76,0x5e,0x75,0xff,0x7c,0x67,0x69,0xff,0x82, 0x73,0x6d,0xff,0x84,0x76,0x71,0xff,0x82,0x74,0x6f,0xff,0x81,0x71,0x6c,0xff,0x83, 0x74,0x6f,0xff,0x80,0x72,0x6d,0xff,0x7e,0x6f,0x69,0xff,0x7d,0x6e,0x67,0xff,0x7c, 0x6c,0x65,0xff,0x74,0x67,0x60,0xff,0xa3,0x86,0x79,0xff,0xaa,0x8a,0x7f,0xff,0xa8, 0x88,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x86,0x7c,0xff,0xa5,0x85,0x7b,0xff,0xa5,0x84,0x7a,0xfd,0xa5,0x84,0x7a,0xfc,0xa7, 0x84,0x7a,0xf9,0x9c,0x7d,0x72,0xf2,0x2e,0x25,0x22,0xe2,0x02,0x02,0x02,0xcb,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0xb0,0x0e,0x0d,0x0e,0xd4,0x49,0x45,0x4d,0xea,0x45, 0x41,0x49,0xf6,0x46,0x42,0x4b,0xfc,0x49,0x43,0x4c,0xfe,0x4b,0x45,0x50,0xff,0x4e, 0x46,0x51,0xff,0x51,0x48,0x55,0xff,0x52,0x49,0x55,0xff,0x53,0x49,0x57,0xff,0x56, 0x4c,0x5a,0xff,0x57,0x4d,0x5a,0xff,0x4c,0x47,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x49, 0x45,0x4a,0xff,0x47,0x44,0x48,0xff,0x47,0x45,0x48,0xff,0x42,0x41,0x43,0xff,0x3e, 0x3f,0x3e,0xff,0x3b,0x3e,0x3d,0xff,0x3d,0x3e,0x3e,0xff,0x3c,0x3e,0x3d,0xff,0x3b, 0x3d,0x3c,0xff,0x3a,0x3d,0x3b,0xff,0x38,0x3b,0x39,0xff,0x35,0x3a,0x35,0xff,0x21, 0x2c,0x22,0xff,0x0e,0x17,0x0f,0xff,0x25,0x24,0x27,0xff,0x4b,0x43,0x4e,0xff,0x4e, 0x44,0x51,0xff,0x4c,0x43,0x4f,0xff,0x4c,0x43,0x4f,0xff,0x4b,0x43,0x4f,0xff,0x50, 0x46,0x53,0xff,0x49,0x43,0x4b,0xff,0x45,0x42,0x45,0xff,0x5d,0x4d,0x5f,0xff,0x5f, 0x4f,0x60,0xff,0x54,0x48,0x58,0xff,0x56,0x49,0x59,0xff,0x58,0x4b,0x5a,0xff,0x55, 0x49,0x57,0xff,0x57,0x4a,0x59,0xff,0x58,0x4a,0x5a,0xff,0x52,0x48,0x56,0xff,0x52, 0x4b,0x56,0xff,0x56,0x4d,0x57,0xff,0x4c,0x48,0x4d,0xff,0x3f,0x40,0x40,0xff,0x39, 0x3c,0x3a,0xff,0x42,0x41,0x42,0xff,0x48,0x45,0x48,0xff,0x44,0x42,0x45,0xff,0x43, 0x42,0x44,0xff,0x44,0x43,0x45,0xff,0x31,0x37,0x33,0xff,0x57,0x4c,0x51,0xff,0x78, 0x5f,0x70,0xff,0x3f,0x3f,0x41,0xff,0x3c,0x3e,0x3d,0xff,0x3d,0x3f,0x3e,0xff,0x3c, 0x3e,0x3d,0xff,0x3b,0x3e,0x3b,0xff,0x34,0x36,0x34,0xff,0x1b,0x20,0x1d,0xff,0x2c, 0x2a,0x2f,0xff,0x4c,0x43,0x4f,0xff,0x4a,0x43,0x4e,0xff,0x49,0x41,0x4b,0xff,0x4f, 0x47,0x53,0xff,0x44,0x43,0x47,0xff,0x24,0x2d,0x28,0xff,0x78,0x6d,0x64,0xff,0xe1, 0xcd,0xc5,0xff,0xb1,0x97,0x98,0xff,0x5b,0x46,0x50,0xff,0x46,0x3e,0x4b,0xff,0x4d, 0x43,0x50,0xff,0x4f,0x44,0x51,0xff,0x50,0x45,0x52,0xff,0x52,0x46,0x54,0xff,0x55, 0x48,0x56,0xff,0x56,0x49,0x59,0xff,0x58,0x4a,0x5b,0xff,0x5a,0x4b,0x5c,0xff,0x5b, 0x4c,0x5d,0xff,0x5b,0x4c,0x5d,0xff,0x5d,0x4d,0x5e,0xff,0x60,0x4e,0x61,0xff,0x4b, 0x45,0x4d,0xff,0x41,0x41,0x41,0xff,0x40,0x41,0x41,0xff,0x38,0x3a,0x39,0xff,0x27, 0x29,0x27,0xff,0x23,0x24,0x22,0xff,0x1f,0x24,0x22,0xff,0x42,0x3b,0x45,0xff,0x58, 0x4a,0x5a,0xff,0x3c,0x3b,0x3f,0xff,0x3b,0x39,0x42,0xff,0x72,0x58,0x6c,0xff,0x5b, 0x4b,0x5a,0xff,0x49,0x41,0x4d,0xff,0x4c,0x42,0x4e,0xff,0x4f,0x45,0x51,0xff,0x4f, 0x45,0x52,0xff,0x50,0x47,0x54,0xff,0x52,0x47,0x55,0xff,0x58,0x49,0x5a,0xff,0x3b, 0x3c,0x3d,0xff,0x49,0x43,0x4b,0xff,0x59,0x4b,0x5b,0xff,0x5f,0x4d,0x60,0xff,0x5e, 0x4d,0x60,0xff,0x5f,0x4e,0x61,0xff,0x5e,0x4d,0x60,0xff,0x5c,0x4b,0x5e,0xff,0x5a, 0x4a,0x5b,0xff,0x5b,0x4c,0x5d,0xff,0x4f,0x44,0x52,0xff,0x43,0x42,0x45,0xff,0x3f, 0x40,0x40,0xff,0x3e,0x3f,0x3f,0xff,0x42,0x42,0x43,0xff,0x23,0x28,0x23,0xff,0x15, 0x1b,0x15,0xff,0x26,0x26,0x26,0xff,0x2b,0x2b,0x2b,0xff,0x43,0x3d,0x46,0xff,0x55, 0x48,0x58,0xff,0x57,0x4a,0x5a,0xff,0x5b,0x4b,0x5c,0xff,0x59,0x4b,0x5c,0xff,0x5b, 0x4c,0x5d,0xff,0x59,0x4c,0x5c,0xff,0x58,0x4b,0x5b,0xff,0x5a,0x4c,0x5c,0xff,0x57, 0x4b,0x5a,0xff,0x57,0x4a,0x59,0xff,0x32,0x36,0x36,0xff,0x58,0x4b,0x5c,0xff,0x51, 0x46,0x54,0xff,0x50,0x47,0x55,0xff,0x50,0x47,0x54,0xff,0x4f,0x47,0x54,0xff,0x4e, 0x46,0x52,0xff,0x4e,0x46,0x52,0xff,0x4e,0x46,0x52,0xff,0x51,0x48,0x55,0xff,0x51, 0x48,0x55,0xff,0x52,0x49,0x57,0xfe,0x55,0x4a,0x58,0xfb,0x53,0x48,0x56,0xf2,0x05, 0x05,0x05,0xe0,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x71,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xa0,0x05, 0x04,0x04,0xc9,0x48,0x3b,0x47,0xe5,0x7c,0x64,0x79,0xf5,0x7a,0x62,0x77,0xfc,0x7e, 0x63,0x77,0xfe,0x84,0x66,0x78,0xff,0x85,0x66,0x75,0xff,0x81,0x60,0x6a,0xff,0x5b, 0x4b,0x5e,0xff,0x63,0x50,0x64,0xff,0x62,0x50,0x64,0xff,0x64,0x52,0x66,0xff,0x63, 0x51,0x65,0xff,0x63,0x51,0x65,0xff,0x60,0x53,0x63,0xff,0x54,0x4d,0x55,0xff,0x3c, 0x3e,0x3d,0xff,0x2e,0x34,0x2e,0xff,0x5d,0x51,0x5c,0xff,0x83,0x65,0x7b,0xff,0x88, 0x6a,0x74,0xff,0xb2,0x91,0x83,0xff,0x9e,0x84,0x7d,0xff,0x46,0x40,0x4e,0xff,0x42, 0x3f,0x46,0xff,0x3e,0x3d,0x41,0xff,0x3e,0x3d,0x44,0xff,0x42,0x40,0x47,0xff,0x45, 0x41,0x4a,0xff,0x46,0x42,0x4a,0xff,0x45,0x42,0x4a,0xff,0x3f,0x3a,0x42,0xff,0x31, 0x2c,0x33,0xff,0x38,0x30,0x38,0xff,0x32,0x2b,0x33,0xff,0x2a,0x27,0x2a,0xff,0x44, 0x3c,0x44,0xff,0x5e,0x53,0x5f,0xff,0x69,0x5a,0x69,0xff,0x7a,0x60,0x73,0xff,0x84, 0x66,0x77,0xff,0x5a,0x4f,0x58,0xff,0x3a,0x3c,0x3b,0xff,0x6f,0x5d,0x6f,0xff,0x73, 0x5e,0x72,0xff,0x6e,0x5b,0x6d,0xff,0x6e,0x5b,0x6d,0xff,0x6f,0x5b,0x6e,0xff,0x73, 0x5d,0x72,0xff,0x63,0x52,0x65,0xff,0x45,0x40,0x48,0xff,0x47,0x41,0x4a,0xff,0x4d, 0x43,0x4f,0xff,0x41,0x3e,0x43,0xff,0x33,0x39,0x34,0xff,0x43,0x40,0x45,0xff,0x4c, 0x43,0x4f,0xff,0x49,0x43,0x4d,0xff,0x3a,0x3d,0x41,0xff,0x50,0x47,0x45,0xff,0x70, 0x55,0x59,0xff,0x4e,0x42,0x49,0xff,0x3a,0x39,0x3e,0xff,0x3c,0x39,0x3e,0xff,0x38, 0x37,0x3b,0xff,0x37,0x37,0x3a,0xff,0x38,0x37,0x3a,0xff,0x38,0x37,0x3a,0xff,0x38, 0x38,0x3b,0xff,0x38,0x38,0x3b,0xff,0x39,0x38,0x3c,0xff,0x39,0x39,0x3c,0xff,0x39, 0x39,0x3d,0xff,0x35,0x37,0x39,0xff,0x4b,0x45,0x4e,0xff,0x65,0x56,0x66,0xff,0x67, 0x57,0x66,0xff,0x67,0x57,0x67,0xff,0x64,0x55,0x64,0xff,0x64,0x55,0x65,0xff,0x69, 0x57,0x68,0xff,0x6a,0x57,0x68,0xff,0x6a,0x57,0x69,0xff,0x6a,0x58,0x69,0xff,0x6d, 0x5a,0x6c,0xff,0x6e,0x5a,0x6d,0xff,0x6a,0x59,0x6a,0xff,0x7a,0x60,0x70,0xff,0x81, 0x64,0x75,0xff,0x7b,0x62,0x76,0xff,0x72,0x5e,0x70,0xff,0x76,0x60,0x73,0xff,0x78, 0x60,0x75,0xff,0x75,0x5f,0x72,0xff,0x70,0x5c,0x6f,0xff,0x71,0x5c,0x6f,0xff,0x76, 0x5f,0x74,0xff,0x4b,0x45,0x4d,0xff,0x37,0x3a,0x3c,0xff,0x37,0x39,0x3b,0xff,0x36, 0x39,0x3b,0xff,0x36,0x38,0x3a,0xff,0x35,0x38,0x39,0xff,0x35,0x38,0x39,0xff,0x35, 0x38,0x3a,0xff,0x34,0x38,0x39,0xff,0x32,0x36,0x36,0xff,0x2e,0x33,0x34,0xff,0x76, 0x61,0x68,0xff,0xaa,0x8b,0x83,0xff,0xaa,0x89,0x7f,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa6, 0x85,0x7b,0xff,0xa5,0x84,0x7a,0xfe,0xa3,0x82,0x77,0xfd,0xa9,0x87,0x7b,0xf8,0x92, 0x74,0x6a,0xf0,0x20,0x1a,0x18,0xe0,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xa9,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,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,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x2a,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xa5,0x03, 0x03,0x03,0xcb,0x2f,0x2a,0x2f,0xe5,0x5b,0x51,0x5b,0xf4,0x5a,0x4f,0x5b,0xfb,0x5c, 0x50,0x5c,0xfd,0x5d,0x51,0x5e,0xff,0x5c,0x51,0x5e,0xff,0x5f,0x52,0x5f,0xff,0x60, 0x53,0x60,0xff,0x61,0x53,0x61,0xff,0x61,0x53,0x61,0xff,0x61,0x53,0x62,0xff,0x52, 0x4b,0x53,0xff,0x49,0x45,0x4a,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x48,0xff,0x44, 0x43,0x45,0xff,0x41,0x40,0x42,0xff,0x3e,0x3f,0x3e,0xff,0x3d,0x3f,0x3f,0xff,0x3b, 0x3d,0x3c,0xff,0x3c,0x3e,0x3d,0xff,0x3a,0x3c,0x3a,0xff,0x39,0x3c,0x3a,0xff,0x39, 0x3c,0x39,0xff,0x35,0x39,0x35,0xff,0x21,0x27,0x22,0xff,0x17,0x1c,0x18,0xff,0x1b, 0x1e,0x1a,0xff,0x3c,0x38,0x3d,0xff,0x5e,0x53,0x5f,0xff,0x58,0x4e,0x58,0xff,0x59, 0x4f,0x59,0xff,0x58,0x4e,0x59,0xff,0x5b,0x50,0x5c,0xff,0x55,0x4c,0x56,0xff,0x49, 0x46,0x49,0xff,0x63,0x54,0x62,0xff,0x74,0x5e,0x72,0xff,0x62,0x54,0x62,0xff,0x64, 0x55,0x64,0xff,0x65,0x56,0x65,0xff,0x66,0x56,0x65,0xff,0x65,0x55,0x65,0xff,0x65, 0x56,0x65,0xff,0x61,0x53,0x61,0xff,0x57,0x4e,0x57,0xff,0x51,0x4a,0x51,0xff,0x4f, 0x49,0x4f,0xff,0x50,0x4a,0x51,0xff,0x42,0x41,0x42,0xff,0x32,0x38,0x32,0xff,0x43, 0x42,0x43,0xff,0x45,0x43,0x47,0xff,0x43,0x42,0x44,0xff,0x43,0x42,0x43,0xff,0x38, 0x3b,0x38,0xff,0x39,0x3b,0x3a,0xff,0x47,0x44,0x48,0xff,0x3e,0x3f,0x3f,0xff,0x3b, 0x3d,0x3c,0xff,0x3a,0x3d,0x3b,0xff,0x3b,0x3e,0x3c,0xff,0x35,0x38,0x36,0xff,0x29, 0x2b,0x2a,0xff,0x1f,0x21,0x20,0xff,0x2a,0x28,0x2a,0xff,0x4e,0x44,0x4f,0xff,0x5d, 0x52,0x5e,0xff,0x59,0x4f,0x5a,0xff,0x5b,0x50,0x5b,0xff,0x55,0x4d,0x56,0xff,0x40, 0x40,0x43,0xff,0x71,0x5d,0x5d,0xff,0xcd,0xb1,0xaa,0xff,0x9e,0x8c,0x96,0xff,0x5a, 0x4b,0x5e,0xff,0x5a,0x4f,0x5a,0xff,0x5d,0x51,0x5d,0xff,0x5f,0x52,0x5f,0xff,0x61, 0x54,0x61,0xff,0x62,0x54,0x62,0xff,0x63,0x54,0x63,0xff,0x66,0x56,0x65,0xff,0x68, 0x56,0x66,0xff,0x69,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68, 0x57,0x68,0xff,0x69,0x58,0x69,0xff,0x5a,0x50,0x5b,0xff,0x46,0x44,0x47,0xff,0x41, 0x42,0x42,0xff,0x2e,0x30,0x2e,0xff,0x22,0x24,0x22,0xff,0x22,0x25,0x23,0xff,0x1e, 0x22,0x1f,0xff,0x4f,0x47,0x50,0xff,0x39,0x3a,0x3b,0xff,0x2d,0x33,0x32,0xff,0x77, 0x64,0x5d,0xff,0x78,0x61,0x6a,0xff,0x5d,0x51,0x5d,0xff,0x58,0x4e,0x59,0xff,0x5a, 0x50,0x5b,0xff,0x5b,0x50,0x5c,0xff,0x5c,0x51,0x5d,0xff,0x5f,0x53,0x60,0xff,0x5f, 0x53,0x60,0xff,0x60,0x54,0x60,0xff,0x64,0x56,0x64,0xff,0x5b,0x51,0x5c,0xff,0x66, 0x55,0x66,0xff,0x6a,0x58,0x69,0xff,0x69,0x58,0x69,0xff,0x6c,0x5a,0x6b,0xff,0x6b, 0x59,0x6a,0xff,0x6a,0x58,0x69,0xff,0x68,0x56,0x67,0xff,0x66,0x56,0x66,0xff,0x5f, 0x53,0x60,0xff,0x47,0x45,0x48,0xff,0x43,0x42,0x44,0xff,0x40,0x40,0x41,0xff,0x42, 0x41,0x41,0xff,0x29,0x2b,0x28,0xff,0x0f,0x15,0x0f,0xff,0x25,0x27,0x26,0xff,0x26, 0x27,0x26,0xff,0x51,0x4a,0x52,0xff,0x63,0x55,0x63,0xff,0x67,0x56,0x66,0xff,0x68, 0x57,0x68,0xff,0x6a,0x58,0x6a,0xff,0x68,0x57,0x68,0xff,0x69,0x57,0x68,0xff,0x67, 0x57,0x67,0xff,0x69,0x58,0x68,0xff,0x67,0x57,0x66,0xff,0x66,0x57,0x66,0xff,0x28, 0x31,0x28,0xff,0x5d,0x51,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x51,0x5e,0xff,0x5c, 0x51,0x5d,0xff,0x5d,0x51,0x5d,0xff,0x5c,0x51,0x5c,0xff,0x5c,0x50,0x5c,0xff,0x5c, 0x50,0x5c,0xff,0x5d,0x51,0x5d,0xff,0x5c,0x51,0x5d,0xff,0x5b,0x50,0x5c,0xfe,0x5d, 0x51,0x5d,0xfb,0x5b,0x4f,0x5b,0xf2,0x07,0x07,0x07,0xe0,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0x97,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x77,0x00,0x00,0x00,0x9f,0x04,0x04,0x04,0xc8,0x46,0x39,0x46,0xe5,0x7b, 0x64,0x78,0xf5,0x7c,0x64,0x79,0xfc,0x84,0x66,0x7b,0xfe,0x84,0x66,0x78,0xff,0x87, 0x66,0x74,0xff,0x85,0x62,0x69,0xff,0x6b,0x59,0x6c,0xff,0x6f,0x5b,0x6e,0xff,0x71, 0x5d,0x6f,0xff,0x72,0x5d,0x70,0xff,0x73,0x5d,0x71,0xff,0x71,0x5d,0x6f,0xff,0x6e, 0x5b,0x6d,0xff,0x6d,0x5a,0x6d,0xff,0x61,0x53,0x62,0xff,0x44,0x42,0x44,0xff,0x7d, 0x63,0x79,0xff,0x8c,0x68,0x74,0xff,0x95,0x70,0x6c,0xff,0xac,0x8e,0x86,0xff,0x80, 0x68,0x73,0xff,0x4f,0x49,0x53,0xff,0x52,0x4b,0x53,0xff,0x50,0x49,0x50,0xff,0x4d, 0x48,0x4e,0xff,0x51,0x49,0x51,0xff,0x53,0x4a,0x53,0xff,0x53,0x4b,0x53,0xff,0x4f, 0x49,0x50,0xff,0x44,0x3d,0x44,0xff,0x35,0x2e,0x35,0xff,0x34,0x2c,0x34,0xff,0x37, 0x2e,0x37,0xff,0x3a,0x2f,0x3a,0xff,0x3d,0x35,0x3e,0xff,0x39,0x36,0x3a,0xff,0x34, 0x34,0x37,0xff,0x6a,0x59,0x66,0xff,0x62,0x52,0x58,0xff,0x4b,0x46,0x49,0xff,0x40, 0x40,0x41,0xff,0x6f,0x5c,0x6f,0xff,0x6f,0x5b,0x6e,0xff,0x6f,0x5b,0x6e,0xff,0x6e, 0x5b,0x6e,0xff,0x73,0x5d,0x71,0xff,0x78,0x60,0x75,0xff,0x68,0x57,0x68,0xff,0x58, 0x4e,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5d,0x51,0x5e,0xff,0x4e,0x48,0x4f,0xff,0x46, 0x43,0x47,0xff,0x5c,0x51,0x5d,0xff,0x59,0x4f,0x5b,0xff,0x58,0x4e,0x58,0xff,0x5c, 0x50,0x5b,0xff,0x44,0x43,0x48,0xff,0x61,0x51,0x5c,0xff,0x74,0x5d,0x6b,0xff,0x48, 0x45,0x4a,0xff,0x4d,0x48,0x4e,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x45,0x4a,0xff,0x4a, 0x46,0x49,0xff,0x48,0x45,0x49,0xff,0x49,0x45,0x49,0xff,0x48,0x45,0x48,0xff,0x48, 0x45,0x48,0xff,0x48,0x45,0x48,0xff,0x48,0x45,0x48,0xff,0x47,0x44,0x47,0xff,0x5e, 0x52,0x5e,0xff,0x6c,0x5a,0x6c,0xff,0x69,0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x69, 0x57,0x68,0xff,0x6a,0x58,0x69,0xff,0x69,0x58,0x69,0xff,0x65,0x56,0x65,0xff,0x6d, 0x5a,0x6c,0xff,0x70,0x5c,0x6f,0xff,0x73,0x5e,0x72,0xff,0x58,0x4e,0x59,0xff,0x5c, 0x51,0x5e,0xff,0x7c,0x62,0x73,0xff,0x79,0x60,0x74,0xff,0x75,0x5f,0x73,0xff,0x79, 0x62,0x76,0xff,0x70,0x5c,0x6e,0xff,0x66,0x56,0x66,0xff,0x6f,0x5b,0x6d,0xff,0x6f, 0x5b,0x6d,0xff,0x79,0x61,0x76,0xff,0x62,0x54,0x61,0xff,0x4a,0x46,0x4a,0xff,0x44, 0x43,0x45,0xff,0x44,0x43,0x45,0xff,0x43,0x42,0x44,0xff,0x42,0x42,0x43,0xff,0x42, 0x42,0x43,0xff,0x43,0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x40, 0x41,0x41,0xff,0x4a,0x45,0x4a,0xff,0x4d,0x46,0x54,0xff,0x8c,0x6b,0x6d,0xff,0xac, 0x8b,0x82,0xff,0xaa,0x8b,0x81,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa6,0x85,0x7b,0xff,0xa6,0x85,0x7b,0xff,0xa5, 0x84,0x79,0xfe,0xa4,0x83,0x79,0xfc,0xae,0x8a,0x7f,0xf7,0x84,0x69,0x61,0xef,0x13, 0x0f,0x0d,0xde,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x5a,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x02,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,0x01,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xbb,0x08,0x07,0x08,0xda,0x4f, 0x45,0x4f,0xee,0x5e,0x52,0x5e,0xf8,0x5e,0x52,0x5f,0xfc,0x60,0x53,0x60,0xfe,0x61, 0x54,0x62,0xff,0x62,0x55,0x62,0xff,0x63,0x55,0x63,0xff,0x63,0x55,0x63,0xff,0x63, 0x55,0x63,0xff,0x62,0x54,0x62,0xff,0x5c,0x50,0x5c,0xff,0x49,0x45,0x49,0xff,0x49, 0x46,0x4a,0xff,0x47,0x45,0x48,0xff,0x45,0x43,0x46,0xff,0x42,0x41,0x43,0xff,0x3b, 0x3e,0x3c,0xff,0x3c,0x3e,0x3c,0xff,0x3b,0x3d,0x3b,0xff,0x3a,0x3d,0x3b,0xff,0x3a, 0x3d,0x3b,0xff,0x3b,0x3d,0x3b,0xff,0x36,0x39,0x36,0xff,0x26,0x28,0x26,0xff,0x23, 0x26,0x24,0xff,0x21,0x25,0x22,0xff,0x0d,0x15,0x0e,0xff,0x20,0x22,0x21,0xff,0x5a, 0x50,0x5b,0xff,0x59,0x4f,0x59,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5a, 0x50,0x5b,0xff,0x59,0x4e,0x5a,0xff,0x43,0x42,0x44,0xff,0x45,0x43,0x45,0xff,0x70, 0x5c,0x6e,0xff,0x62,0x54,0x62,0xff,0x64,0x55,0x64,0xff,0x65,0x56,0x65,0xff,0x66, 0x56,0x65,0xff,0x66,0x56,0x66,0xff,0x64,0x56,0x64,0xff,0x63,0x55,0x63,0xff,0x5b, 0x50,0x5b,0xff,0x50,0x49,0x51,0xff,0x4e,0x49,0x4f,0xff,0x45,0x43,0x45,0xff,0x31, 0x37,0x31,0xff,0x2e,0x34,0x2e,0xff,0x3c,0x3e,0x3e,0xff,0x3d,0x3e,0x3e,0xff,0x43, 0x42,0x44,0xff,0x3c,0x3e,0x3d,0xff,0x3f,0x40,0x40,0xff,0x2c,0x33,0x2c,0xff,0x24, 0x2f,0x25,0xff,0x3b,0x3d,0x3c,0xff,0x3c,0x3e,0x3c,0xff,0x3c,0x3e,0x3c,0xff,0x35, 0x38,0x36,0xff,0x27,0x2a,0x29,0xff,0x24,0x26,0x25,0xff,0x24,0x26,0x25,0xff,0x24, 0x25,0x25,0xff,0x3f,0x39,0x40,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5a, 0x50,0x5b,0xff,0x5c,0x50,0x5d,0xff,0x57,0x4e,0x59,0xff,0x4f,0x45,0x4e,0xff,0x85, 0x69,0x67,0xff,0x85,0x6b,0x72,0xff,0x58,0x4e,0x5e,0xff,0x59,0x4e,0x5b,0xff,0x5c, 0x51,0x5c,0xff,0x5d,0x52,0x5e,0xff,0x60,0x53,0x60,0xff,0x62,0x54,0x62,0xff,0x62, 0x55,0x62,0xff,0x65,0x56,0x64,0xff,0x67,0x57,0x66,0xff,0x68,0x57,0x68,0xff,0x68, 0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x67,0x56,0x67,0xff,0x68,0x57,0x66,0xff,0x60, 0x53,0x60,0xff,0x48,0x45,0x49,0xff,0x3e,0x40,0x3f,0xff,0x2e,0x2f,0x2e,0xff,0x24, 0x25,0x24,0xff,0x23,0x26,0x24,0xff,0x1e,0x23,0x20,0xff,0x4a,0x43,0x4a,0xff,0x33, 0x36,0x33,0xff,0x5c,0x4f,0x5c,0xff,0x88,0x6b,0x78,0xff,0x62,0x54,0x5e,0xff,0x58, 0x4e,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x5a,0x4f,0x5b,0xff,0x5b,0x50,0x5c,0xff,0x5c, 0x51,0x5d,0xff,0x5d,0x52,0x5e,0xff,0x5f,0x53,0x60,0xff,0x5f,0x53,0x60,0xff,0x62, 0x55,0x62,0xff,0x64,0x55,0x64,0xff,0x66,0x56,0x66,0xff,0x69,0x57,0x68,0xff,0x69, 0x57,0x68,0xff,0x6a,0x58,0x69,0xff,0x69,0x58,0x69,0xff,0x69,0x58,0x69,0xff,0x68, 0x56,0x67,0xff,0x66,0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x49,0x45,0x4a,0xff,0x41, 0x41,0x41,0xff,0x41,0x41,0x41,0xff,0x3b,0x3b,0x3b,0xff,0x29,0x2a,0x2a,0xff,0x17, 0x1c,0x17,0xff,0x24,0x25,0x25,0xff,0x1c,0x1d,0x1c,0xff,0x52,0x47,0x52,0xff,0x64, 0x56,0x64,0xff,0x66,0x56,0x65,0xff,0x67,0x56,0x67,0xff,0x69,0x57,0x68,0xff,0x68, 0x57,0x68,0xff,0x69,0x57,0x69,0xff,0x6b,0x58,0x6a,0xff,0x68,0x57,0x67,0xff,0x68, 0x57,0x68,0xff,0x6a,0x58,0x69,0xff,0x1a,0x26,0x1b,0xff,0x6d,0x5b,0x6b,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x51,0x5d,0xff,0x5a, 0x50,0x5b,0xff,0x5d,0x51,0x5d,0xff,0x5d,0x51,0x5d,0xff,0x5c,0x50,0x5c,0xff,0x5d, 0x51,0x5d,0xff,0x5b,0x50,0x5c,0xfe,0x5c,0x50,0x5c,0xfb,0x5a,0x4e,0x5a,0xf2,0x07, 0x07,0x07,0xe0,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x71,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x9e,0x03, 0x02,0x03,0xc7,0x35,0x2c,0x34,0xe4,0x7e,0x65,0x7b,0xf4,0x6f,0x5b,0x6e,0xfc,0x60, 0x52,0x5c,0xfe,0x88,0x68,0x79,0xff,0x87,0x66,0x74,0xff,0x84,0x65,0x72,0xff,0x6c, 0x5a,0x6d,0xff,0x71,0x5c,0x6f,0xff,0x74,0x5e,0x71,0xff,0x76,0x60,0x73,0xff,0x76, 0x5f,0x73,0xff,0x73,0x5e,0x71,0xff,0x73,0x5e,0x71,0xff,0x71,0x5c,0x6f,0xff,0x68, 0x57,0x67,0xff,0x4d,0x47,0x4d,0xff,0x58,0x4e,0x57,0xff,0x76,0x5d,0x6a,0xff,0x97, 0x6e,0x6c,0xff,0x96,0x79,0x72,0xff,0x56,0x4c,0x5d,0xff,0x56,0x4d,0x57,0xff,0x55, 0x4d,0x56,0xff,0x54,0x4c,0x55,0xff,0x53,0x4c,0x54,0xff,0x54,0x4c,0x54,0xff,0x55, 0x4c,0x56,0xff,0x57,0x4e,0x58,0xff,0x51,0x48,0x51,0xff,0x3d,0x36,0x3d,0xff,0x38, 0x2f,0x38,0xff,0x37,0x2e,0x37,0xff,0x38,0x2f,0x38,0xff,0x38,0x30,0x38,0xff,0x3d, 0x32,0x3c,0xff,0x2f,0x2c,0x2f,0xff,0x14,0x20,0x16,0xff,0x3b,0x3e,0x3d,0xff,0x3e, 0x40,0x40,0xff,0x36,0x3b,0x38,0xff,0x3e,0x3f,0x3f,0xff,0x5a,0x4f,0x5b,0xff,0x72, 0x5d,0x71,0xff,0x6f,0x5b,0x6e,0xff,0x6e,0x5a,0x6d,0xff,0x76,0x5f,0x73,0xff,0x78, 0x60,0x74,0xff,0x61,0x52,0x61,0xff,0x58,0x4f,0x5a,0xff,0x5a,0x50,0x5b,0xff,0x5c, 0x50,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x4f,0x49,0x4f,0xff,0x50,0x49,0x51,0xff,0x5e, 0x51,0x5f,0xff,0x59,0x4f,0x59,0xff,0x5b,0x51,0x5c,0xff,0x42,0x41,0x43,0xff,0x45, 0x42,0x46,0xff,0x5c,0x51,0x5d,0xff,0x4c,0x48,0x4d,0xff,0x4d,0x48,0x4e,0xff,0x4b, 0x46,0x4c,0xff,0x4a,0x47,0x4b,0xff,0x4b,0x47,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x49, 0x45,0x4a,0xff,0x50,0x49,0x51,0xff,0x65,0x55,0x65,0xff,0x6f,0x5b,0x6d,0xff,0x6e, 0x5b,0x6d,0xff,0x6e,0x5b,0x6d,0xff,0x6f,0x5b,0x6e,0xff,0x71,0x5d,0x70,0xff,0x3c, 0x3b,0x3d,0xff,0x3a,0x3b,0x3b,0xff,0x57,0x4e,0x57,0xff,0x61,0x53,0x61,0xff,0x5d, 0x51,0x5f,0xff,0x6c,0x57,0x60,0xff,0x78,0x5f,0x6f,0xff,0x76,0x60,0x76,0xff,0x77, 0x60,0x74,0xff,0x77,0x60,0x74,0xff,0x78,0x60,0x75,0xff,0x74,0x5e,0x71,0xff,0x6d, 0x5b,0x6c,0xff,0x6e,0x5b,0x6d,0xff,0x6d,0x5a,0x6d,0xff,0x7a,0x62,0x78,0xff,0x56, 0x4d,0x56,0xff,0x45,0x43,0x45,0xff,0x46,0x43,0x46,0xff,0x45,0x43,0x46,0xff,0x44, 0x42,0x45,0xff,0x43,0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x43, 0x42,0x44,0xff,0x41,0x41,0x42,0xff,0x47,0x44,0x47,0xff,0x52,0x4b,0x53,0xff,0x4e, 0x48,0x4f,0xff,0x52,0x46,0x4f,0xff,0x98,0x79,0x71,0xff,0xab,0x8b,0x80,0xff,0xa8, 0x8a,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xaa,0x8a,0x7f,0xff,0x9b,0x77,0x6f,0xff,0xa6, 0x85,0x7a,0xff,0xa7,0x87,0x7d,0xff,0xa5,0x84,0x7a,0xff,0xa5,0x84,0x7a,0xfe,0xa4, 0x83,0x79,0xfc,0xae,0x8b,0x7f,0xf8,0x78,0x60,0x58,0xed,0x0d,0x0b,0x0a,0xdc,0x00, 0x00,0x00,0xc2,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x7b,0x00, 0x00,0x00,0xa7,0x01,0x01,0x02,0xcb,0x1f,0x1b,0x20,0xe5,0x60,0x54,0x60,0xf4,0x5e, 0x52,0x5f,0xfb,0x61,0x53,0x61,0xfd,0x64,0x55,0x64,0xff,0x64,0x56,0x64,0xff,0x64, 0x55,0x64,0xff,0x65,0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x63,0x55,0x63,0xff,0x5f, 0x52,0x5f,0xff,0x54,0x4c,0x54,0xff,0x49,0x45,0x4a,0xff,0x47,0x45,0x47,0xff,0x45, 0x43,0x46,0xff,0x42,0x41,0x43,0xff,0x3b,0x3e,0x3c,0xff,0x3c,0x3e,0x3d,0xff,0x3a, 0x3c,0x3a,0xff,0x38,0x3b,0x38,0xff,0x3b,0x3d,0x3b,0xff,0x37,0x39,0x37,0xff,0x25, 0x29,0x26,0xff,0x20,0x23,0x20,0xff,0x1e,0x22,0x1e,0xff,0x10,0x17,0x11,0xff,0x22, 0x23,0x21,0xff,0x3a,0x30,0x39,0xff,0x39,0x34,0x39,0xff,0x5d,0x52,0x5d,0xff,0x58, 0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x5d,0x51,0x5d,0xff,0x50, 0x49,0x50,0xff,0x42,0x41,0x43,0xff,0x63,0x55,0x64,0xff,0x62,0x54,0x63,0xff,0x64, 0x55,0x64,0xff,0x66,0x56,0x66,0xff,0x67,0x56,0x66,0xff,0x66,0x56,0x66,0xff,0x65, 0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x5e,0x52,0x5e,0xff,0x52,0x4a,0x52,0xff,0x50, 0x49,0x50,0xff,0x49,0x46,0x4a,0xff,0x35,0x39,0x35,0xff,0x29,0x31,0x28,0xff,0x38, 0x3b,0x38,0xff,0x35,0x39,0x36,0xff,0x24,0x2b,0x25,0xff,0x16,0x1d,0x16,0xff,0x23, 0x27,0x23,0xff,0x2d,0x33,0x2e,0xff,0x1c,0x28,0x1d,0xff,0x23,0x2d,0x23,0xff,0x36, 0x3b,0x35,0xff,0x36,0x38,0x37,0xff,0x27,0x2a,0x28,0xff,0x24,0x26,0x25,0xff,0x25, 0x27,0x26,0xff,0x25,0x27,0x26,0xff,0x20,0x23,0x21,0xff,0x3a,0x36,0x3a,0xff,0x5a, 0x4f,0x5b,0xff,0x59,0x4f,0x59,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4e,0x59,0xff,0x59, 0x4f,0x59,0xff,0x54,0x4d,0x57,0xff,0x4f,0x47,0x4f,0xff,0x75,0x5b,0x5b,0xff,0xa4, 0x85,0x7d,0xff,0x7a,0x6a,0x6e,0xff,0x57,0x4c,0x5a,0xff,0x5c,0x50,0x5d,0xff,0x5e, 0x52,0x5f,0xff,0x61,0x54,0x61,0xff,0x63,0x55,0x63,0xff,0x64,0x56,0x64,0xff,0x67, 0x57,0x67,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68, 0x57,0x68,0xff,0x68,0x57,0x67,0xff,0x66,0x56,0x66,0xff,0x49,0x45,0x4a,0xff,0x3d, 0x40,0x3f,0xff,0x31,0x33,0x31,0xff,0x26,0x28,0x26,0xff,0x24,0x26,0x24,0xff,0x1f, 0x24,0x1f,0xff,0x37,0x38,0x38,0xff,0x66,0x57,0x65,0xff,0x69,0x58,0x68,0xff,0x5c, 0x50,0x5f,0xff,0x59,0x4f,0x5b,0xff,0x5a,0x4f,0x5b,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x5b,0x50,0x5c,0xff,0x5b,0x50,0x5c,0xff,0x5c,0x51,0x5d,0xff,0x5e, 0x52,0x5e,0xff,0x5f,0x53,0x60,0xff,0x61,0x54,0x61,0xff,0x65,0x56,0x64,0xff,0x67, 0x56,0x66,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x69,0x58,0x69,0xff,0x68, 0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68,0x56,0x67,0xff,0x64,0x55,0x63,0xff,0x66, 0x56,0x66,0xff,0x48,0x45,0x49,0xff,0x3e,0x3f,0x3f,0xff,0x3f,0x40,0x40,0xff,0x32, 0x33,0x33,0xff,0x26,0x27,0x28,0xff,0x1c,0x21,0x1c,0xff,0x1a,0x1f,0x1b,0xff,0x16, 0x17,0x16,0xff,0x4b,0x41,0x4b,0xff,0x63,0x54,0x63,0xff,0x64,0x56,0x65,0xff,0x68, 0x56,0x67,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68, 0x57,0x68,0xff,0x67,0x56,0x66,0xff,0x67,0x56,0x66,0xff,0x68,0x58,0x67,0xff,0x1c, 0x25,0x1d,0xff,0x6f,0x5b,0x6e,0xff,0x5e,0x51,0x5e,0xff,0x5d,0x51,0x5d,0xff,0x5c, 0x50,0x5d,0xff,0x5a,0x4f,0x5b,0xff,0x59,0x4f,0x5a,0xff,0x5b,0x50,0x5c,0xff,0x5b, 0x50,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x59,0x4f,0x5a,0xfe,0x5b, 0x50,0x5c,0xfb,0x57,0x4d,0x58,0xf2,0x04,0x05,0x04,0xe0,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0x97,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x9c,0x02,0x02,0x02,0xc5,0x22,0x1d,0x22,0xe2,0x4c, 0x49,0x4d,0xf3,0x41,0x41,0x42,0xfb,0x56,0x4d,0x54,0xfe,0x8a,0x68,0x78,0xff,0x87, 0x66,0x73,0xff,0x81,0x64,0x77,0xff,0x6d,0x5a,0x6d,0xff,0x73,0x5e,0x71,0xff,0x73, 0x5e,0x71,0xff,0x76,0x5f,0x73,0xff,0x75,0x5e,0x72,0xff,0x75,0x5e,0x72,0xff,0x71, 0x5d,0x70,0xff,0x70,0x5b,0x6e,0xff,0x69,0x57,0x68,0xff,0x55,0x4c,0x56,0xff,0x4e, 0x48,0x4f,0xff,0x4a,0x46,0x4a,0xff,0x58,0x4d,0x51,0xff,0x67,0x58,0x61,0xff,0x56, 0x4d,0x59,0xff,0x57,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x55,0x4d,0x56,0xff,0x52, 0x4b,0x52,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x56,0x4d,0x57,0xff,0x4f, 0x47,0x50,0xff,0x37,0x31,0x38,0xff,0x35,0x2d,0x35,0xff,0x39,0x30,0x38,0xff,0x3a, 0x30,0x3a,0xff,0x38,0x2f,0x37,0xff,0x38,0x2e,0x38,0xff,0x39,0x2f,0x38,0xff,0x2a, 0x2d,0x2b,0xff,0x1f,0x2b,0x20,0xff,0x27,0x30,0x27,0xff,0x38,0x3b,0x39,0xff,0x52, 0x4a,0x52,0xff,0x4e,0x48,0x4e,0xff,0x62,0x54,0x62,0xff,0x6e,0x5a,0x6c,0xff,0x6c, 0x5a,0x6c,0xff,0x77,0x60,0x73,0xff,0x77,0x60,0x72,0xff,0x5c,0x51,0x5d,0xff,0x58, 0x4e,0x59,0xff,0x5a,0x4f,0x5b,0xff,0x5b,0x50,0x5c,0xff,0x5f,0x52,0x5f,0xff,0x53, 0x4c,0x54,0xff,0x3c,0x3e,0x3d,0xff,0x3d,0x3f,0x3e,0xff,0x43,0x42,0x44,0xff,0x41, 0x41,0x43,0xff,0x3a,0x3c,0x3c,0xff,0x5a,0x4f,0x58,0xff,0x69,0x58,0x66,0xff,0x4a, 0x46,0x4b,0xff,0x4c,0x47,0x4c,0xff,0x4b,0x47,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x47,0x44,0x48,0xff,0x5a,0x4f,0x5b,0xff,0x6c, 0x5a,0x6c,0xff,0x6f,0x5b,0x6e,0xff,0x61,0x53,0x60,0xff,0x58,0x4e,0x59,0xff,0x57, 0x4e,0x57,0xff,0x37,0x38,0x38,0xff,0x1c,0x28,0x1d,0xff,0x36,0x39,0x36,0xff,0x4a, 0x46,0x4b,0xff,0x54,0x4c,0x55,0xff,0x63,0x55,0x63,0xff,0x77,0x5f,0x71,0xff,0x7b, 0x61,0x75,0xff,0x76,0x5f,0x73,0xff,0x76,0x5f,0x73,0xff,0x77,0x60,0x74,0xff,0x77, 0x60,0x74,0xff,0x77,0x60,0x74,0xff,0x75,0x5f,0x72,0xff,0x70,0x5c,0x6f,0xff,0x75, 0x5f,0x74,0xff,0x6b,0x59,0x6b,0xff,0x4e,0x48,0x4e,0xff,0x46,0x43,0x46,0xff,0x46, 0x43,0x46,0xff,0x45,0x43,0x46,0xff,0x44,0x42,0x45,0xff,0x43,0x42,0x44,0xff,0x43, 0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x41,0x41,0x42,0xff,0x3f,0x40,0x40,0xff,0x4f, 0x49,0x50,0xff,0x54,0x4c,0x56,0xff,0x54,0x4c,0x54,0xff,0x4b,0x47,0x4e,0xff,0x5e, 0x51,0x5a,0xff,0xa2,0x86,0x80,0xff,0xb4,0x97,0x8c,0xff,0xae,0x8f,0x83,0xff,0x89, 0x6e,0x7a,0xff,0x6c,0x58,0x63,0xff,0x7a,0x62,0x73,0xff,0xa1,0x82,0x7c,0xff,0xa8, 0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa5,0x84,0x7a,0xfd,0xa4,0x83,0x78,0xfc,0xab, 0x89,0x7d,0xf6,0x6a,0x55,0x4d,0xec,0x09,0x07,0x06,0xd9,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0x9a,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xb9,0x04, 0x04,0x04,0xd9,0x3f,0x37,0x40,0xed,0x60,0x54,0x60,0xf7,0x58,0x4e,0x59,0xfd,0x5e, 0x52,0x5e,0xfe,0x5a,0x50,0x5b,0xff,0x40,0x40,0x41,0xff,0x64,0x56,0x64,0xff,0x63, 0x55,0x63,0xff,0x62,0x54,0x62,0xff,0x60,0x53,0x60,0xff,0x5d,0x51,0x5d,0xff,0x48, 0x45,0x49,0xff,0x42,0x41,0x43,0xff,0x41,0x40,0x42,0xff,0x3a,0x3d,0x3b,0xff,0x3a, 0x3d,0x3b,0xff,0x38,0x3c,0x39,0xff,0x3a,0x3c,0x3a,0xff,0x38,0x3b,0x39,0xff,0x37, 0x3a,0x38,0xff,0x2a,0x2e,0x2b,0xff,0x21,0x24,0x21,0xff,0x1e,0x22,0x1e,0xff,0x18, 0x1e,0x19,0xff,0x22,0x23,0x24,0xff,0x4d,0x3d,0x49,0xff,0x4b,0x3c,0x45,0xff,0x27, 0x29,0x28,0xff,0x5d,0x53,0x5e,0xff,0x58,0x4e,0x59,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x5d,0x51,0x5e,0xff,0x57,0x4d,0x57,0xff,0x47,0x45,0x48,0xff,0x58, 0x4f,0x58,0xff,0x65,0x56,0x65,0xff,0x64,0x55,0x64,0xff,0x66,0x56,0x66,0xff,0x67, 0x56,0x66,0xff,0x67,0x56,0x66,0xff,0x66,0x56,0x66,0xff,0x65,0x56,0x65,0xff,0x62, 0x54,0x62,0xff,0x57,0x4e,0x58,0xff,0x50,0x4a,0x50,0xff,0x4d,0x48,0x4e,0xff,0x42, 0x41,0x43,0xff,0x2e,0x35,0x2e,0xff,0x27,0x30,0x27,0xff,0x1e,0x27,0x1f,0xff,0x15, 0x1c,0x15,0xff,0x15,0x1d,0x16,0xff,0x09,0x0d,0x09,0xff,0x15,0x18,0x17,0xff,0x6a, 0x5a,0x54,0xff,0x69,0x59,0x4f,0xff,0x1a,0x26,0x1e,0xff,0x20,0x23,0x20,0xff,0x26, 0x27,0x26,0xff,0x26,0x27,0x26,0xff,0x26,0x27,0x26,0xff,0x26,0x27,0x26,0xff,0x1f, 0x21,0x1f,0xff,0x3b,0x36,0x3b,0xff,0x5c,0x51,0x5c,0xff,0x58,0x4e,0x58,0xff,0x58, 0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x59,0x4e,0x59,0xff,0x56, 0x4d,0x58,0xff,0x4b,0x46,0x4c,0xff,0x88,0x72,0x6a,0xff,0x9e,0x7a,0x7a,0xff,0x6b, 0x56,0x63,0xff,0x5a,0x50,0x5d,0xff,0x5e,0x52,0x5f,0xff,0x5f,0x52,0x5f,0xff,0x61, 0x54,0x61,0xff,0x62,0x54,0x62,0xff,0x66,0x56,0x66,0xff,0x68,0x56,0x67,0xff,0x68, 0x57,0x67,0xff,0x67,0x56,0x67,0xff,0x68,0x57,0x67,0xff,0x68,0x57,0x67,0xff,0x67, 0x57,0x67,0xff,0x4d,0x48,0x4d,0xff,0x3f,0x40,0x40,0xff,0x38,0x3a,0x38,0xff,0x29, 0x2b,0x29,0xff,0x20,0x23,0x20,0xff,0x1e,0x22,0x1e,0xff,0x25,0x27,0x26,0xff,0x53, 0x49,0x54,0xff,0x5c,0x51,0x5d,0xff,0x57,0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5b,0x50,0x5c,0xff,0x5b, 0x50,0x5c,0xff,0x5c,0x51,0x5d,0xff,0x5e,0x52,0x5e,0xff,0x5f,0x53,0x60,0xff,0x61, 0x54,0x61,0xff,0x65,0x56,0x64,0xff,0x67,0x56,0x66,0xff,0x68,0x57,0x68,0xff,0x6a, 0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x68,0x57,0x68,0xff,0x67, 0x56,0x66,0xff,0x66,0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x49,0x45,0x4a,0xff,0x41, 0x41,0x42,0xff,0x33,0x34,0x34,0xff,0x28,0x29,0x29,0xff,0x23,0x24,0x24,0xff,0x24, 0x24,0x24,0xff,0x1b,0x21,0x1b,0xff,0x11,0x12,0x11,0xff,0x43,0x3a,0x44,0xff,0x4d, 0x47,0x4d,0xff,0x5a,0x4f,0x5a,0xff,0x63,0x54,0x62,0xff,0x66,0x56,0x66,0xff,0x69, 0x58,0x69,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x68, 0x58,0x68,0xff,0x4d,0x48,0x4e,0xff,0x24,0x2b,0x25,0xff,0x63,0x55,0x63,0xff,0x5d, 0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x5b,0x50,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xfe,0x59,0x4f,0x5a,0xfb,0x57,0x4d,0x58,0xf2,0x01, 0x02,0x01,0xe0,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x6f,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x95,0x01, 0x01,0x01,0xbf,0x10,0x0e,0x10,0xde,0x31,0x39,0x32,0xf1,0x46,0x44,0x47,0xfa,0x5c, 0x50,0x5c,0xfd,0x89,0x68,0x77,0xff,0x87,0x65,0x72,0xff,0x7f,0x65,0x77,0xff,0x6d, 0x5a,0x6c,0xff,0x72,0x5d,0x70,0xff,0x73,0x5e,0x71,0xff,0x73,0x5e,0x71,0xff,0x75, 0x5e,0x72,0xff,0x73,0x5e,0x71,0xff,0x72,0x5d,0x70,0xff,0x70,0x5c,0x6f,0xff,0x6b, 0x59,0x6b,0xff,0x5c,0x51,0x5d,0xff,0x49,0x45,0x4a,0xff,0x51,0x4a,0x53,0xff,0x49, 0x46,0x4c,0xff,0x5a,0x4f,0x5d,0xff,0x58,0x4f,0x59,0xff,0x56,0x4d,0x57,0xff,0x58, 0x4e,0x58,0xff,0x54,0x4c,0x55,0xff,0x53,0x4b,0x53,0xff,0x54,0x4c,0x55,0xff,0x55, 0x4c,0x56,0xff,0x57,0x4e,0x58,0xff,0x4e,0x47,0x4f,0xff,0x38,0x32,0x39,0xff,0x35, 0x2d,0x35,0xff,0x36,0x2d,0x35,0xff,0x37,0x2e,0x37,0xff,0x39,0x2e,0x37,0xff,0x37, 0x2d,0x36,0xff,0x2a,0x27,0x2b,0xff,0x1a,0x1f,0x1b,0xff,0x11,0x1b,0x12,0xff,0x24, 0x2c,0x26,0xff,0x51,0x4b,0x51,0xff,0x55,0x4d,0x55,0xff,0x51,0x4b,0x52,0xff,0x5b, 0x50,0x5a,0xff,0x6f,0x5b,0x6e,0xff,0x6e,0x5b,0x6e,0xff,0x78,0x60,0x74,0xff,0x76, 0x5f,0x70,0xff,0x5a,0x4f,0x5b,0xff,0x59,0x4f,0x5a,0xff,0x5b,0x50,0x5c,0xff,0x5c, 0x50,0x5c,0xff,0x5e,0x51,0x5d,0xff,0x5f,0x53,0x60,0xff,0x40,0x3f,0x40,0xff,0x38, 0x3a,0x39,0xff,0x3e,0x3f,0x40,0xff,0x3a,0x3c,0x3a,0xff,0x60,0x52,0x5d,0xff,0x65, 0x55,0x63,0xff,0x5c,0x51,0x5c,0xff,0x4a,0x46,0x4b,0xff,0x4c,0x47,0x4c,0xff,0x4b, 0x47,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x47, 0x45,0x49,0xff,0x60,0x53,0x60,0xff,0x57,0x4d,0x57,0xff,0x47,0x44,0x48,0xff,0x57, 0x4d,0x58,0xff,0x6b,0x59,0x6b,0xff,0x45,0x42,0x45,0xff,0x2e,0x35,0x2e,0xff,0x3f, 0x3f,0x40,0xff,0x45,0x43,0x45,0xff,0x48,0x43,0x4c,0xff,0x82,0x6b,0x68,0xff,0x9e, 0x7a,0x6f,0xff,0x6b,0x59,0x5e,0xff,0x61,0x53,0x63,0xff,0x74,0x5e,0x71,0xff,0x77, 0x60,0x74,0xff,0x77,0x60,0x74,0xff,0x77,0x60,0x74,0xff,0x76,0x5f,0x73,0xff,0x72, 0x5d,0x70,0xff,0x6d,0x5b,0x6c,0xff,0x7c,0x62,0x79,0xff,0x58,0x4e,0x59,0xff,0x45, 0x43,0x46,0xff,0x47,0x44,0x47,0xff,0x46,0x43,0x46,0xff,0x43,0x42,0x44,0xff,0x43, 0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x41,0x41,0x42,0xff,0x41,0x41,0x42,0xff,0x41, 0x41,0x42,0xff,0x42,0x42,0x43,0xff,0x51,0x4a,0x52,0xff,0x56,0x4d,0x57,0xff,0x56, 0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x4b,0x47,0x4f,0xff,0x73,0x5d,0x6c,0xff,0xba, 0xa2,0x9f,0xff,0x99,0x76,0x75,0xff,0x84,0x64,0x73,0xff,0x91,0x73,0x70,0xff,0x90, 0x6b,0x6a,0xff,0x72,0x5d,0x6c,0xff,0x9a,0x7d,0x79,0xff,0xb0,0x93,0x8a,0xff,0xb2, 0x95,0x8b,0xfe,0xa8,0x89,0x7f,0xfd,0xa6,0x85,0x7a,0xfb,0xa9,0x87,0x7b,0xf5,0x57, 0x45,0x40,0xe9,0x07,0x05,0x05,0xd4,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xc7,0x11,0x0e,0x11,0xe2,0x56, 0x4c,0x56,0xf2,0x1f,0x28,0x21,0xfa,0x38,0x3b,0x38,0xfd,0x3f,0x40,0x40,0xff,0x71, 0x5c,0x6e,0xff,0x49,0x45,0x4a,0xff,0x62,0x54,0x63,0xff,0x63,0x55,0x63,0xff,0x62, 0x53,0x62,0xff,0x5d,0x51,0x5d,0xff,0x2c,0x32,0x2e,0xff,0x10,0x1c,0x16,0xff,0x44, 0x44,0x46,0xff,0x3f,0x3f,0x3f,0xff,0x38,0x3c,0x39,0xff,0x2c,0x34,0x2d,0xff,0x38, 0x3b,0x39,0xff,0x37,0x3b,0x38,0xff,0x36,0x38,0x37,0xff,0x21,0x25,0x21,0xff,0x20, 0x23,0x1f,0xff,0x17,0x1e,0x17,0xff,0x22,0x22,0x21,0xff,0x42,0x36,0x3e,0xff,0x22, 0x26,0x23,0xff,0x22,0x25,0x23,0xff,0x21,0x24,0x22,0xff,0x43,0x3f,0x44,0xff,0x5c, 0x51,0x5d,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x5c,0x50,0x5d,0xff,0x59, 0x4f,0x5a,0xff,0x4b,0x46,0x4b,0xff,0x50,0x49,0x50,0xff,0x72,0x5e,0x70,0xff,0x62, 0x54,0x63,0xff,0x66,0x56,0x66,0xff,0x66,0x57,0x66,0xff,0x67,0x56,0x66,0xff,0x68, 0x57,0x67,0xff,0x67,0x56,0x66,0xff,0x66,0x56,0x65,0xff,0x5d,0x51,0x5d,0xff,0x4f, 0x48,0x4f,0xff,0x4c,0x47,0x4d,0xff,0x42,0x41,0x42,0xff,0x34,0x39,0x34,0xff,0x29, 0x31,0x29,0xff,0x1a,0x22,0x1b,0xff,0x17,0x1d,0x18,0xff,0x1a,0x1f,0x1a,0xff,0x06, 0x10,0x0a,0xff,0x3a,0x34,0x2b,0xff,0x8e,0x70,0x74,0xff,0x5b,0x50,0x5a,0xff,0x2c, 0x30,0x2d,0xff,0x22,0x25,0x22,0xff,0x1e,0x23,0x1f,0xff,0x22,0x25,0x24,0xff,0x26, 0x27,0x26,0xff,0x27,0x28,0x27,0xff,0x21,0x23,0x21,0xff,0x33,0x32,0x34,0xff,0x53, 0x4b,0x53,0xff,0x5a,0x4f,0x5a,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x58, 0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x56,0x4d,0x57,0xff,0x51, 0x4a,0x52,0xff,0x64,0x55,0x60,0xff,0x6d,0x5a,0x6a,0xff,0x62,0x54,0x62,0xff,0x5e, 0x52,0x5f,0xff,0x5f,0x52,0x5f,0xff,0x61,0x53,0x61,0xff,0x64,0x55,0x64,0xff,0x65, 0x56,0x65,0xff,0x66,0x56,0x65,0xff,0x68,0x57,0x68,0xff,0x67,0x56,0x67,0xff,0x67, 0x56,0x66,0xff,0x66,0x56,0x66,0xff,0x66,0x56,0x66,0xff,0x52,0x4a,0x53,0xff,0x40, 0x40,0x42,0xff,0x3e,0x40,0x3e,0xff,0x2e,0x30,0x2e,0xff,0x1d,0x22,0x1d,0xff,0x1f, 0x23,0x1f,0xff,0x1e,0x20,0x1e,0xff,0x48,0x42,0x49,0xff,0x5a,0x50,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x58,0x4e,0x59,0xff,0x58,0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x58, 0x4e,0x58,0xff,0x58,0x4e,0x59,0xff,0x58,0x4f,0x59,0xff,0x5b,0x50,0x5c,0xff,0x62, 0x54,0x62,0xff,0x62,0x54,0x62,0xff,0x64,0x56,0x64,0xff,0x65,0x56,0x65,0xff,0x67, 0x56,0x66,0xff,0x68,0x57,0x68,0xff,0x6a,0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x6a, 0x58,0x69,0xff,0x68,0x57,0x68,0xff,0x67,0x56,0x66,0xff,0x65,0x56,0x65,0xff,0x65, 0x56,0x65,0xff,0x4d,0x48,0x4d,0xff,0x3f,0x40,0x40,0xff,0x2d,0x30,0x2f,0xff,0x28, 0x29,0x28,0xff,0x23,0x24,0x24,0xff,0x26,0x27,0x27,0xff,0x23,0x26,0x24,0xff,0x08, 0x09,0x08,0xff,0x3e,0x35,0x3e,0xff,0x25,0x2c,0x26,0xff,0x25,0x2e,0x26,0xff,0x3d, 0x3e,0x3e,0xff,0x49,0x46,0x4a,0xff,0x5c,0x51,0x5c,0xff,0x6a,0x58,0x6a,0xff,0x68, 0x57,0x68,0xff,0x68,0x57,0x68,0xff,0x65,0x56,0x64,0xff,0x1b,0x26,0x1b,0xff,0x62, 0x52,0x61,0xff,0x62,0x54,0x62,0xff,0x5d,0x51,0x5d,0xff,0x5d,0x51,0x5d,0xff,0x5b, 0x50,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xfe,0x59, 0x4f,0x5a,0xfb,0x57,0x4d,0x58,0xf2,0x01,0x02,0x01,0xe0,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x4d,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0xb7,0x09,0x07,0x09,0xd9,0x70, 0x5d,0x6f,0xef,0x7a,0x62,0x76,0xf9,0x7b,0x61,0x75,0xfe,0x73,0x5d,0x6e,0xff,0x88, 0x66,0x73,0xff,0x7a,0x62,0x77,0xff,0x6d,0x5a,0x6c,0xff,0x71,0x5c,0x6f,0xff,0x74, 0x5e,0x71,0xff,0x76,0x5f,0x73,0xff,0x75,0x5e,0x72,0xff,0x75,0x5e,0x72,0xff,0x72, 0x5e,0x70,0xff,0x6e,0x5b,0x6d,0xff,0x6d,0x5a,0x6c,0xff,0x61,0x53,0x61,0xff,0x49, 0x45,0x49,0xff,0x57,0x4d,0x58,0xff,0x56,0x4d,0x56,0xff,0x75,0x5f,0x72,0xff,0x54, 0x4c,0x55,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x54, 0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x55,0x4d,0x56,0xff,0x4e, 0x46,0x4f,0xff,0x38,0x31,0x38,0xff,0x36,0x2e,0x36,0xff,0x37,0x2e,0x36,0xff,0x36, 0x2d,0x36,0xff,0x39,0x2f,0x38,0xff,0x34,0x2c,0x33,0xff,0x1e,0x20,0x1e,0xff,0x10, 0x16,0x10,0xff,0x19,0x1e,0x19,0xff,0x3e,0x3c,0x3f,0xff,0x53,0x4d,0x53,0xff,0x53, 0x4b,0x53,0xff,0x54,0x4c,0x56,0xff,0x5c,0x50,0x5c,0xff,0x6f,0x5b,0x6e,0xff,0x70, 0x5b,0x6e,0xff,0x76,0x5f,0x73,0xff,0x6d,0x5b,0x6b,0xff,0x58,0x4f,0x58,0xff,0x59, 0x4f,0x5b,0xff,0x5b,0x50,0x5c,0xff,0x5c,0x50,0x5c,0xff,0x5d,0x51,0x5d,0xff,0x5e, 0x52,0x5f,0xff,0x4c,0x47,0x4d,0xff,0x3a,0x3c,0x3a,0xff,0x25,0x2d,0x2b,0xff,0x59, 0x4e,0x44,0xff,0x9f,0x77,0x74,0xff,0x66,0x53,0x5b,0xff,0x47,0x45,0x4b,0xff,0x4c, 0x47,0x4c,0xff,0x4b,0x47,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x49, 0x45,0x4a,0xff,0x47,0x45,0x48,0xff,0x4e,0x47,0x4f,0xff,0x3a,0x34,0x3a,0xff,0x4a, 0x40,0x4a,0xff,0x69,0x57,0x67,0xff,0x6d,0x5a,0x6c,0xff,0x74,0x5e,0x72,0xff,0x55, 0x4c,0x55,0xff,0x38,0x3c,0x39,0xff,0x41,0x41,0x42,0xff,0x42,0x42,0x46,0xff,0x73, 0x5b,0x5e,0xff,0xa0,0x77,0x72,0xff,0x6c,0x5a,0x59,0xff,0x4a,0x46,0x4c,0xff,0x62, 0x54,0x63,0xff,0x76,0x60,0x74,0xff,0x79,0x62,0x76,0xff,0x77,0x60,0x74,0xff,0x76, 0x5f,0x73,0xff,0x76,0x5e,0x73,0xff,0x72,0x5d,0x70,0xff,0x6f,0x5b,0x6e,0xff,0x74, 0x5e,0x72,0xff,0x53,0x4c,0x53,0xff,0x45,0x43,0x45,0xff,0x46,0x43,0x46,0xff,0x45, 0x43,0x46,0xff,0x44,0x42,0x45,0xff,0x43,0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x44, 0x43,0x45,0xff,0x44,0x42,0x45,0xff,0x40,0x40,0x41,0xff,0x4a,0x46,0x4b,0xff,0x55, 0x4c,0x56,0xff,0x56,0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x56,0x4d,0x58,0xff,0x57, 0x4d,0x58,0xff,0x4d,0x47,0x4f,0xff,0x6c,0x5a,0x6d,0xff,0xa3,0x84,0x7e,0xff,0xb8, 0x9e,0x95,0xff,0xad,0x8e,0x83,0xff,0xac,0x8a,0x7c,0xff,0x82,0x69,0x78,0xff,0x7e, 0x65,0x78,0xff,0x97,0x74,0x6d,0xff,0xa7,0x8a,0x84,0xff,0xb2,0x98,0x90,0xfe,0xae, 0x90,0x84,0xfd,0xa7,0x85,0x7a,0xfa,0xa8,0x85,0x7b,0xf4,0x47,0x38,0x34,0xe7,0x05, 0x04,0x04,0xd2,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x02,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,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0xb4,0x03,0x02,0x03,0xd4,0x2c,0x27,0x2c,0xe9,0x61,0x55,0x61,0xf6,0x5f, 0x52,0x5f,0xfc,0x63,0x55,0x63,0xfe,0x6e,0x5a,0x6c,0xff,0x5e,0x52,0x5e,0xff,0x6b, 0x59,0x68,0xff,0x5e,0x52,0x5f,0xff,0x57,0x4e,0x5a,0xff,0x3c,0x3c,0x40,0xff,0x13, 0x1d,0x18,0xff,0x4a,0x45,0x47,0xff,0x4f,0x48,0x4b,0xff,0x3f,0x40,0x40,0xff,0x39, 0x3c,0x3a,0xff,0x37,0x3a,0x36,0xff,0x31,0x36,0x31,0xff,0x37,0x3b,0x38,0xff,0x33, 0x37,0x34,0xff,0x1f,0x25,0x20,0xff,0x1c,0x20,0x1c,0xff,0x1c,0x21,0x1d,0xff,0x25, 0x24,0x21,0xff,0x55,0x40,0x43,0xff,0x1c,0x23,0x1e,0xff,0x20,0x25,0x21,0xff,0x1e, 0x21,0x1d,0xff,0x2c,0x2b,0x2c,0xff,0x59,0x50,0x5a,0xff,0x56,0x4d,0x57,0xff,0x57, 0x4e,0x58,0xff,0x58,0x4f,0x59,0xff,0x59,0x4f,0x59,0xff,0x54,0x4c,0x55,0xff,0x52, 0x4a,0x53,0xff,0x68,0x56,0x67,0xff,0x5f,0x52,0x5f,0xff,0x5d,0x52,0x5d,0xff,0x5f, 0x53,0x5f,0xff,0x62,0x54,0x62,0xff,0x61,0x53,0x61,0xff,0x62,0x54,0x62,0xff,0x67, 0x57,0x66,0xff,0x5f,0x52,0x5f,0xff,0x50,0x4a,0x51,0xff,0x47,0x44,0x48,0xff,0x38, 0x3b,0x38,0xff,0x2d,0x35,0x2d,0xff,0x25,0x2c,0x25,0xff,0x17,0x1d,0x17,0xff,0x15, 0x1a,0x16,0xff,0x16,0x1d,0x17,0xff,0x16,0x1c,0x17,0xff,0x3c,0x37,0x3b,0xff,0x52, 0x4c,0x52,0xff,0x35,0x3a,0x37,0xff,0x39,0x3c,0x3a,0xff,0x2f,0x31,0x2f,0xff,0x1e, 0x23,0x1f,0xff,0x18,0x1f,0x19,0xff,0x1e,0x22,0x1e,0xff,0x25,0x26,0x25,0xff,0x26, 0x27,0x26,0xff,0x24,0x26,0x25,0xff,0x43,0x3d,0x43,0xff,0x5d,0x52,0x5d,0xff,0x58, 0x4e,0x58,0xff,0x57,0x4d,0x57,0xff,0x57,0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x58, 0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x5a,0x50,0x5c,0xff,0x45,0x43,0x46,0xff,0x44, 0x43,0x45,0xff,0x55,0x4d,0x56,0xff,0x5c,0x51,0x5d,0xff,0x5c,0x51,0x5d,0xff,0x60, 0x53,0x60,0xff,0x62,0x55,0x62,0xff,0x65,0x55,0x64,0xff,0x67,0x56,0x66,0xff,0x67, 0x56,0x66,0xff,0x67,0x56,0x66,0xff,0x67,0x56,0x66,0xff,0x66,0x56,0x66,0xff,0x65, 0x56,0x65,0xff,0x59,0x4e,0x59,0xff,0x44,0x42,0x44,0xff,0x3f,0x41,0x3f,0xff,0x2e, 0x32,0x2e,0xff,0x20,0x24,0x20,0xff,0x23,0x26,0x23,0xff,0x17,0x1c,0x17,0xff,0x45, 0x40,0x45,0xff,0x5b,0x50,0x5b,0xff,0x58,0x4e,0x58,0xff,0x58,0x4f,0x59,0xff,0x59, 0x4e,0x59,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x60,0x53,0x60,0xff,0x61,0x54,0x62,0xff,0x62, 0x54,0x63,0xff,0x5d,0x51,0x5d,0xff,0x63,0x55,0x63,0xff,0x66,0x56,0x65,0xff,0x67, 0x56,0x66,0xff,0x68,0x57,0x68,0xff,0x6a,0x58,0x69,0xff,0x68,0x56,0x67,0xff,0x65, 0x56,0x65,0xff,0x63,0x55,0x63,0xff,0x64,0x55,0x64,0xff,0x50,0x49,0x50,0xff,0x3f, 0x40,0x40,0xff,0x2d,0x30,0x2e,0xff,0x26,0x28,0x26,0xff,0x26,0x27,0x26,0xff,0x27, 0x28,0x27,0xff,0x28,0x2a,0x29,0xff,0x01,0x01,0x01,0xff,0x31,0x2a,0x31,0xff,0x5b, 0x50,0x5c,0xff,0x65,0x55,0x65,0xff,0x57,0x4e,0x58,0xff,0x58,0x4f,0x59,0xff,0x40, 0x40,0x40,0xff,0x65,0x55,0x64,0xff,0x6b,0x59,0x6b,0xff,0x6d,0x5c,0x6d,0xff,0x2e, 0x34,0x2e,0xff,0x1a,0x21,0x1f,0xff,0x82,0x65,0x76,0xff,0x60,0x53,0x60,0xff,0x5d, 0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x5b,0x50,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xfe,0x59,0x4f,0x5a,0xfb,0x57,0x4d,0x58,0xf2,0x01, 0x02,0x01,0xe0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0xae,0x08,0x06,0x08,0xd3,0x71,0x5a,0x6d,0xec,0x7f,0x65,0x7b,0xf8,0x80, 0x65,0x78,0xfd,0x70,0x5c,0x6e,0xfe,0x87,0x65,0x70,0xff,0x76,0x60,0x75,0xff,0x6d, 0x5a,0x6c,0xff,0x72,0x5c,0x6f,0xff,0x74,0x5e,0x71,0xff,0x76,0x5f,0x73,0xff,0x76, 0x5f,0x73,0xff,0x75,0x5f,0x73,0xff,0x71,0x5c,0x6f,0xff,0x6e,0x5b,0x6d,0xff,0x6e, 0x5b,0x6d,0xff,0x61,0x53,0x62,0xff,0x49,0x45,0x4a,0xff,0x58,0x4e,0x59,0xff,0x65, 0x56,0x65,0xff,0x6e,0x5b,0x6c,0xff,0x55,0x4c,0x55,0xff,0x55,0x4d,0x56,0xff,0x54, 0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54, 0x4c,0x55,0xff,0x55,0x4d,0x56,0xff,0x4d,0x46,0x4e,0xff,0x34,0x2e,0x34,0xff,0x34, 0x2c,0x34,0xff,0x36,0x2d,0x37,0xff,0x38,0x2f,0x37,0xff,0x38,0x2f,0x38,0xff,0x2e, 0x29,0x2e,0xff,0x15,0x1b,0x15,0xff,0x14,0x19,0x15,0xff,0x23,0x22,0x23,0xff,0x30, 0x2e,0x31,0xff,0x4b,0x46,0x4c,0xff,0x50,0x4a,0x51,0xff,0x4f,0x49,0x50,0xff,0x5f, 0x52,0x5f,0xff,0x6f,0x5b,0x6e,0xff,0x71,0x5c,0x6f,0xff,0x73,0x5d,0x70,0xff,0x66, 0x56,0x65,0xff,0x56,0x4d,0x56,0xff,0x5a,0x50,0x5a,0xff,0x5b,0x50,0x5c,0xff,0x5c, 0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x5a,0x50,0x5b,0xff,0x54,0x4c,0x55,0xff,0x36, 0x3a,0x38,0xff,0x50,0x48,0x4c,0xff,0x9e,0x7a,0x7f,0xff,0x7e,0x68,0x66,0xff,0x46, 0x43,0x4b,0xff,0x4c,0x47,0x4d,0xff,0x4c,0x47,0x4c,0xff,0x4b,0x47,0x4c,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x49, 0x45,0x4a,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x49,0x47,0x4b,0xff,0x40, 0x39,0x40,0xff,0x36,0x2c,0x36,0xff,0x36,0x2d,0x35,0xff,0x43,0x38,0x43,0xff,0x5e, 0x4d,0x5d,0xff,0x73,0x5e,0x72,0xff,0x59,0x4f,0x59,0xff,0x42,0x41,0x44,0xff,0x43, 0x42,0x44,0xff,0x49,0x44,0x4d,0xff,0x8b,0x71,0x70,0xff,0x88,0x6d,0x77,0xff,0x70, 0x5b,0x71,0xff,0x70,0x5c,0x6f,0xff,0x75,0x5f,0x73,0xff,0x71,0x5d,0x6f,0xff,0x72, 0x5d,0x6f,0xff,0x77,0x60,0x73,0xff,0x76,0x5f,0x73,0xff,0x73,0x5d,0x71,0xff,0x6f, 0x5b,0x6e,0xff,0x78,0x60,0x74,0xff,0x62,0x54,0x62,0xff,0x4b,0x47,0x4c,0xff,0x47, 0x44,0x47,0xff,0x46,0x43,0x46,0xff,0x44,0x43,0x45,0xff,0x43,0x42,0x44,0xff,0x43, 0x42,0x44,0xff,0x44,0x42,0x45,0xff,0x40,0x40,0x41,0xff,0x3c,0x3e,0x3d,0xff,0x3f, 0x40,0x40,0xff,0x50,0x4a,0x51,0xff,0x56,0x4d,0x57,0xff,0x5a,0x4f,0x5a,0xff,0x5e, 0x51,0x5f,0xff,0x56,0x4d,0x57,0xff,0x4b,0x47,0x4d,0xff,0x49,0x46,0x4b,0xff,0x54, 0x4a,0x59,0xff,0x98,0x7e,0x7d,0xff,0xb9,0x9f,0x94,0xff,0xac,0x8e,0x83,0xff,0xa8, 0x89,0x7e,0xff,0xa8,0x89,0x7e,0xff,0xa6,0x86,0x7d,0xff,0xa8,0x87,0x7b,0xff,0x8e, 0x6f,0x7a,0xff,0x95,0x71,0x6a,0xff,0x9f,0x80,0x7e,0xfe,0xa6,0x86,0x7b,0xfc,0xa7, 0x86,0x7b,0xfa,0xa3,0x82,0x78,0xf3,0x39,0x2d,0x2a,0xe5,0x03,0x02,0x02,0xcf,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x4b,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0xc1,0x06, 0x06,0x06,0xdd,0x50,0x46,0x50,0xee,0x60,0x53,0x60,0xf8,0x61,0x53,0x61,0xfd,0x60, 0x53,0x60,0xfe,0x66,0x57,0x65,0xff,0x7b,0x62,0x73,0xff,0x6a,0x58,0x68,0xff,0x61, 0x51,0x53,0xff,0x47,0x43,0x38,0xff,0x6f,0x5e,0x5e,0xff,0x96,0x6f,0x71,0xff,0x87, 0x64,0x65,0xff,0x4b,0x48,0x50,0xff,0x38,0x3c,0x39,0xff,0x38,0x3b,0x39,0xff,0x38, 0x3b,0x38,0xff,0x36,0x3a,0x36,0xff,0x2d,0x34,0x2d,0xff,0x27,0x2e,0x28,0xff,0x1e, 0x22,0x1e,0xff,0x1f,0x24,0x20,0xff,0x30,0x2d,0x2b,0xff,0x55,0x3e,0x3f,0xff,0x1a, 0x21,0x1d,0xff,0x1f,0x23,0x1f,0xff,0x1c,0x21,0x1c,0xff,0x22,0x24,0x22,0xff,0x48, 0x42,0x48,0xff,0x57,0x4e,0x58,0xff,0x55,0x4d,0x56,0xff,0x57,0x4d,0x57,0xff,0x58, 0x4e,0x59,0xff,0x59,0x4f,0x5a,0xff,0x5c,0x50,0x5c,0xff,0x59,0x4f,0x5b,0xff,0x54, 0x4c,0x55,0xff,0x51,0x4a,0x50,0xff,0x4a,0x45,0x4a,0xff,0x5f,0x52,0x5f,0xff,0x57, 0x4e,0x57,0xff,0x5d,0x51,0x5d,0xff,0x61,0x54,0x62,0xff,0x56,0x4d,0x56,0xff,0x49, 0x46,0x4a,0xff,0x3b,0x3d,0x3b,0xff,0x1b,0x27,0x1c,0xff,0x1d,0x26,0x1e,0xff,0x18, 0x1f,0x19,0xff,0x17,0x1d,0x18,0xff,0x16,0x1c,0x17,0xff,0x0e,0x17,0x0e,0xff,0x3d, 0x38,0x3d,0xff,0x8a,0x6b,0x83,0xff,0x66,0x55,0x5e,0xff,0x30,0x36,0x31,0xff,0x3a, 0x3d,0x3a,0xff,0x2b,0x30,0x2b,0xff,0x1f,0x22,0x1f,0xff,0x22,0x25,0x22,0xff,0x16, 0x1c,0x16,0xff,0x1a,0x1f,0x1a,0xff,0x26,0x28,0x26,0xff,0x20,0x22,0x20,0xff,0x3a, 0x37,0x3b,0xff,0x5a,0x50,0x5a,0xff,0x56,0x4d,0x57,0xff,0x55,0x4d,0x57,0xff,0x55, 0x4d,0x56,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x56,0xff,0x56,0x4d,0x56,0xff,0x56, 0x4d,0x57,0xff,0x58,0x4e,0x59,0xff,0x58,0x4f,0x59,0xff,0x5a,0x50,0x5b,0xff,0x5b, 0x50,0x5c,0xff,0x57,0x4e,0x57,0xff,0x56,0x4d,0x57,0xff,0x63,0x55,0x63,0xff,0x66, 0x56,0x67,0xff,0x64,0x55,0x64,0xff,0x66,0x56,0x65,0xff,0x67,0x57,0x67,0xff,0x68, 0x57,0x67,0xff,0x64,0x55,0x63,0xff,0x67,0x58,0x67,0xff,0x65,0x56,0x65,0xff,0x49, 0x47,0x48,0xff,0x2e,0x34,0x2f,0xff,0x27,0x2d,0x28,0xff,0x3d,0x36,0x3d,0xff,0x30, 0x2e,0x30,0xff,0x0e,0x15,0x0e,0xff,0x3c,0x3a,0x3d,0xff,0x59,0x4f,0x59,0xff,0x57, 0x4e,0x58,0xff,0x5a,0x4f,0x5b,0xff,0x56,0x4d,0x57,0xff,0x54,0x4c,0x55,0xff,0x57, 0x4d,0x58,0xff,0x57,0x4e,0x58,0xff,0x57,0x4e,0x58,0xff,0x5a,0x50,0x5b,0xff,0x5c, 0x50,0x5c,0xff,0x5b,0x50,0x5c,0xff,0x60,0x54,0x62,0xff,0x4b,0x47,0x4b,0xff,0x5d, 0x52,0x5d,0xff,0x64,0x55,0x64,0xff,0x66,0x56,0x66,0xff,0x67,0x56,0x66,0xff,0x68, 0x57,0x68,0xff,0x67,0x56,0x67,0xff,0x64,0x56,0x64,0xff,0x63,0x55,0x63,0xff,0x62, 0x54,0x62,0xff,0x51,0x49,0x51,0xff,0x3f,0x40,0x40,0xff,0x2e,0x31,0x2f,0xff,0x27, 0x28,0x27,0xff,0x25,0x27,0x26,0xff,0x27,0x28,0x27,0xff,0x24,0x25,0x24,0xff,0x00, 0x00,0x00,0xff,0x27,0x22,0x27,0xff,0x5e,0x51,0x5e,0xff,0x64,0x55,0x64,0xff,0x6a, 0x59,0x6a,0xff,0x64,0x56,0x65,0xff,0x57,0x4e,0x58,0xff,0x3c,0x3d,0x3d,0xff,0x5a, 0x4e,0x59,0xff,0x55,0x4b,0x54,0xff,0x09,0x12,0x0a,0xff,0x7b,0x63,0x6e,0xff,0x82, 0x64,0x70,0xff,0x5c,0x50,0x5c,0xff,0x5d,0x51,0x5d,0xff,0x5a,0x4f,0x5b,0xff,0x5b, 0x50,0x5c,0xff,0x57,0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x57,0x4e,0x58,0xff,0x58, 0x4e,0x59,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xfe,0x57, 0x4e,0x58,0xfb,0x56,0x4c,0x57,0xf1,0x01,0x02,0x01,0xde,0x00,0x00,0x00,0xbe,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0xa6,0x06,0x05,0x06,0xcd,0x5d, 0x4b,0x5a,0xea,0x7d,0x64,0x7a,0xf7,0x7f,0x64,0x78,0xfd,0x7f,0x63,0x76,0xfe,0x88, 0x65,0x6f,0xff,0x70,0x5c,0x71,0xff,0x6e,0x5b,0x6d,0xff,0x71,0x5c,0x70,0xff,0x74, 0x5e,0x72,0xff,0x75,0x5f,0x73,0xff,0x76,0x5f,0x73,0xff,0x75,0x5e,0x72,0xff,0x71, 0x5d,0x6f,0xff,0x6d,0x5b,0x6c,0xff,0x6c,0x59,0x6b,0xff,0x66,0x56,0x66,0xff,0x54, 0x4d,0x55,0xff,0x4f,0x4a,0x50,0xff,0x5b,0x4f,0x5c,0xff,0x57,0x4e,0x58,0xff,0x57, 0x4d,0x57,0xff,0x55,0x4d,0x56,0xff,0x54,0x4c,0x54,0xff,0x54,0x4c,0x54,0xff,0x54, 0x4c,0x54,0xff,0x54,0x4c,0x54,0xff,0x53,0x4c,0x53,0xff,0x53,0x4c,0x53,0xff,0x4c, 0x44,0x4c,0xff,0x32,0x2b,0x32,0xff,0x33,0x2c,0x33,0xff,0x35,0x2c,0x34,0xff,0x35, 0x2d,0x35,0xff,0x36,0x2d,0x36,0xff,0x29,0x26,0x29,0xff,0x0f,0x17,0x0f,0xff,0x1c, 0x20,0x1c,0xff,0x2f,0x2b,0x2f,0xff,0x25,0x23,0x25,0xff,0x30,0x2e,0x30,0xff,0x4c, 0x47,0x4c,0xff,0x5a,0x50,0x5a,0xff,0x68,0x57,0x67,0xff,0x70,0x5c,0x6f,0xff,0x72, 0x5d,0x70,0xff,0x72,0x5c,0x70,0xff,0x5e,0x52,0x5f,0xff,0x56,0x4d,0x56,0xff,0x59, 0x4e,0x59,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x50,0x5b,0xff,0x5a,0x50,0x5b,0xff,0x5a, 0x50,0x5b,0xff,0x55,0x4d,0x56,0xff,0x39,0x3c,0x3c,0xff,0x64,0x55,0x50,0xff,0x92, 0x6f,0x75,0xff,0x5c,0x50,0x5c,0xff,0x4a,0x46,0x4b,0xff,0x4c,0x48,0x4d,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x49,0x46,0x4a,0xff,0x48,0x45,0x49,0xff,0x49, 0x46,0x4a,0xff,0x49,0x46,0x4a,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x46,0x3d,0x47,0xff,0x3f,0x33,0x3f,0xff,0x39, 0x2f,0x39,0xff,0x37,0x2e,0x36,0xff,0x36,0x2f,0x36,0xff,0x50,0x43,0x50,0xff,0x53, 0x4b,0x53,0xff,0x4a,0x46,0x4b,0xff,0x4c,0x47,0x4d,0xff,0x5d,0x50,0x5c,0xff,0x68, 0x57,0x68,0xff,0x71,0x5d,0x70,0xff,0x75,0x5f,0x73,0xff,0x71,0x5c,0x6f,0xff,0x77, 0x60,0x74,0xff,0x69,0x58,0x68,0xff,0x62,0x54,0x62,0xff,0x72,0x5d,0x70,0xff,0x77, 0x5f,0x74,0xff,0x73,0x5d,0x70,0xff,0x6e,0x5b,0x6d,0xff,0x7a,0x61,0x77,0xff,0x59, 0x4f,0x59,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x45,0x43,0x46,0xff,0x44, 0x42,0x45,0xff,0x43,0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x45,0x43,0x46,0xff,0x2c, 0x34,0x2c,0xff,0x2d,0x34,0x2d,0xff,0x45,0x43,0x46,0xff,0x54,0x4b,0x55,0xff,0x57, 0x4e,0x58,0xff,0x4d,0x47,0x4d,0xff,0x44,0x42,0x45,0xff,0x58,0x4f,0x5a,0xff,0x4d, 0x44,0x41,0xff,0x5a,0x4f,0x55,0xff,0x70,0x5d,0x6e,0xff,0x5f,0x50,0x63,0xff,0xa3, 0x86,0x83,0xff,0xb4,0x98,0x8e,0xff,0xab,0x8c,0x81,0xff,0xa9,0x8a,0x7f,0xff,0xa9, 0x89,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa8,0x89,0x7e,0xff,0xa5,0x83,0x76,0xff,0x8a, 0x6d,0x78,0xff,0x97,0x76,0x78,0xfe,0xaa,0x89,0x7e,0xfc,0xa8,0x87,0x7d,0xf9,0x9b, 0x7c,0x72,0xf1,0x27,0x20,0x1d,0xe3,0x02,0x01,0x01,0xcb,0x00,0x00,0x00,0xab,0x00, 0x00,0x00,0x87,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0xa9,0x01,0x01,0x01,0xcb,0x1c,0x19,0x1c,0xe4,0x5e, 0x53,0x5f,0xf3,0x5d,0x51,0x5e,0xfa,0x5f,0x53,0x60,0xfd,0x61,0x54,0x61,0xff,0x62, 0x54,0x62,0xff,0x77,0x5f,0x70,0xff,0x81,0x63,0x65,0xff,0x89,0x6a,0x69,0xff,0x92, 0x73,0x71,0xff,0x99,0x73,0x71,0xff,0x89,0x67,0x6d,0xff,0x49,0x46,0x4d,0xff,0x37, 0x3b,0x37,0xff,0x39,0x3c,0x39,0xff,0x37,0x3b,0x38,0xff,0x38,0x3b,0x38,0xff,0x32, 0x37,0x33,0xff,0x24,0x2c,0x25,0xff,0x1e,0x22,0x1e,0xff,0x1f,0x23,0x20,0xff,0x31, 0x2e,0x2d,0xff,0x55,0x41,0x47,0xff,0x18,0x1f,0x1a,0xff,0x1e,0x22,0x1e,0xff,0x1e, 0x22,0x1e,0xff,0x1c,0x20,0x1c,0xff,0x32,0x31,0x32,0xff,0x5c,0x52,0x5d,0xff,0x54, 0x4c,0x55,0xff,0x55,0x4d,0x56,0xff,0x57,0x4e,0x57,0xff,0x58,0x4f,0x59,0xff,0x50, 0x4a,0x51,0xff,0x48,0x45,0x49,0xff,0x5f,0x51,0x5d,0xff,0x6e,0x5a,0x6c,0xff,0x50, 0x4a,0x51,0xff,0x64,0x56,0x64,0xff,0x62,0x54,0x62,0xff,0x64,0x56,0x64,0xff,0x5e, 0x52,0x5e,0xff,0x57,0x4d,0x57,0xff,0x46,0x44,0x46,0xff,0x2a,0x33,0x2b,0xff,0x1b, 0x26,0x1c,0xff,0x1a,0x22,0x1b,0xff,0x17,0x1e,0x18,0xff,0x17,0x1e,0x18,0xff,0x18, 0x1e,0x18,0xff,0x0b,0x16,0x0c,0xff,0x40,0x3a,0x3d,0xff,0x92,0x6f,0x88,0xff,0x62, 0x53,0x5c,0xff,0x2d,0x35,0x2e,0xff,0x36,0x3a,0x36,0xff,0x2f,0x32,0x2f,0xff,0x20, 0x23,0x20,0xff,0x1f,0x23,0x1f,0xff,0x22,0x25,0x23,0xff,0x23,0x26,0x24,0xff,0x24, 0x26,0x25,0xff,0x21,0x23,0x21,0xff,0x2e,0x2d,0x2e,0xff,0x4c,0x44,0x4b,0xff,0x56, 0x4e,0x57,0xff,0x55,0x4d,0x56,0xff,0x55,0x4d,0x56,0xff,0x54,0x4c,0x55,0xff,0x54, 0x4c,0x55,0xff,0x56,0x4d,0x56,0xff,0x56,0x4d,0x56,0xff,0x55,0x4d,0x56,0xff,0x56, 0x4d,0x57,0xff,0x58,0x4e,0x59,0xff,0x59,0x4f,0x5a,0xff,0x5d,0x52,0x5e,0xff,0x56, 0x4d,0x57,0xff,0x57,0x4d,0x58,0xff,0x6e,0x5b,0x69,0xff,0x6c,0x5a,0x69,0xff,0x63, 0x55,0x64,0xff,0x66,0x57,0x66,0xff,0x66,0x56,0x66,0xff,0x67,0x58,0x67,0xff,0x52, 0x4a,0x52,0xff,0x40,0x3d,0x42,0xff,0x27,0x2e,0x2a,0xff,0x10,0x1f,0x13,0xff,0x47, 0x40,0x48,0xff,0x48,0x3d,0x47,0xff,0x27,0x27,0x27,0xff,0x17,0x1c,0x17,0xff,0x2d, 0x2e,0x2e,0xff,0x4f,0x48,0x50,0xff,0x5a,0x4f,0x5b,0xff,0x46,0x43,0x46,0xff,0x47, 0x45,0x48,0xff,0x58,0x4f,0x5a,0xff,0x56,0x4d,0x56,0xff,0x55,0x4c,0x56,0xff,0x5a, 0x4f,0x5a,0xff,0x5a,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x50,0x5b,0xff,0x61, 0x54,0x61,0xff,0x3e,0x40,0x40,0xff,0x59,0x4f,0x5a,0xff,0x65,0x56,0x65,0xff,0x65, 0x56,0x65,0xff,0x66,0x56,0x66,0xff,0x66,0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x63, 0x55,0x64,0xff,0x61,0x54,0x61,0xff,0x61,0x54,0x61,0xff,0x54,0x4b,0x54,0xff,0x3f, 0x3f,0x40,0xff,0x31,0x33,0x31,0xff,0x26,0x28,0x27,0xff,0x25,0x27,0x25,0xff,0x28, 0x29,0x28,0xff,0x1f,0x1f,0x1f,0xff,0x00,0x00,0x00,0xff,0x1f,0x1b,0x1f,0xff,0x5a, 0x4e,0x5b,0xff,0x61,0x54,0x61,0xff,0x4e,0x47,0x4e,0xff,0x4c,0x46,0x4b,0xff,0x50, 0x49,0x50,0xff,0x29,0x32,0x2a,0xff,0x24,0x2f,0x25,0xff,0x0f,0x19,0x10,0xff,0x0c, 0x19,0x10,0xff,0x9c,0x77,0x67,0xff,0x66,0x56,0x65,0xff,0x5b,0x50,0x5c,0xff,0x5a, 0x4f,0x5b,0xff,0x58,0x4e,0x58,0xff,0x58,0x4f,0x59,0xff,0x56,0x4d,0x57,0xff,0x57, 0x4e,0x57,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x57,0x4e,0x57,0xff,0x57, 0x4e,0x57,0xff,0x57,0x4e,0x57,0xfe,0x56,0x4d,0x57,0xfa,0x54,0x4b,0x55,0xef,0x01, 0x02,0x01,0xdb,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x63,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x74,0x00, 0x00,0x00,0xa1,0x05,0x04,0x05,0xca,0x4b,0x3e,0x4a,0xe7,0x7e,0x64,0x7a,0xf6,0x80, 0x64,0x78,0xfc,0x86,0x66,0x77,0xfe,0x7f,0x63,0x74,0xff,0x6d,0x5a,0x6d,0xff,0x6c, 0x5a,0x6b,0xff,0x71,0x5b,0x6f,0xff,0x74,0x5d,0x71,0xff,0x72,0x5d,0x70,0xff,0x75, 0x5f,0x73,0xff,0x72,0x5e,0x71,0xff,0x74,0x5f,0x73,0xff,0x6e,0x5b,0x6e,0xff,0x62, 0x54,0x62,0xff,0x51,0x4a,0x52,0xff,0x50,0x49,0x50,0xff,0x58,0x4e,0x58,0xff,0x5a, 0x50,0x5c,0xff,0x57,0x4d,0x58,0xff,0x53,0x4c,0x54,0xff,0x53,0x4c,0x54,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xff,0x51,0x4b,0x51,0xff,0x46,0x40,0x46,0xff,0x2f,0x27,0x2f,0xff,0x33, 0x2a,0x32,0xff,0x34,0x2d,0x33,0xff,0x35,0x2d,0x35,0xff,0x36,0x2c,0x35,0xff,0x24, 0x22,0x24,0xff,0x0e,0x16,0x0f,0xff,0x21,0x23,0x21,0xff,0x30,0x2b,0x30,0xff,0x29, 0x25,0x29,0xff,0x29,0x27,0x29,0xff,0x44,0x3a,0x44,0xff,0x6c,0x58,0x6c,0xff,0x71, 0x5d,0x70,0xff,0x6e,0x5b,0x6d,0xff,0x73,0x5e,0x71,0xff,0x70,0x5c,0x6e,0xff,0x5b, 0x50,0x5c,0xff,0x57,0x4d,0x57,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5b, 0x50,0x5c,0xff,0x5a,0x50,0x5b,0xff,0x59,0x4f,0x59,0xff,0x5c,0x51,0x5c,0xff,0x41, 0x40,0x41,0xff,0x45,0x42,0x45,0xff,0x6c,0x59,0x69,0xff,0x56,0x4d,0x55,0xff,0x4b, 0x47,0x4c,0xff,0x4b,0x46,0x4b,0xff,0x49,0x46,0x4a,0xff,0x49,0x46,0x4a,0xff,0x49, 0x46,0x4a,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x49,0x46,0x4a,0xff,0x44,0x40,0x46,0xff,0x44, 0x3a,0x43,0xff,0x44,0x38,0x43,0xff,0x41,0x37,0x41,0xff,0x3d,0x33,0x3d,0xff,0x32, 0x2c,0x32,0xff,0x2c,0x27,0x2c,0xff,0x45,0x3b,0x45,0xff,0x63,0x54,0x63,0xff,0x6d, 0x5a,0x6c,0xff,0x6c,0x59,0x6a,0xff,0x64,0x55,0x65,0xff,0x5f,0x53,0x5f,0xff,0x6f, 0x5b,0x6d,0xff,0x7a,0x61,0x77,0xff,0x7b,0x61,0x76,0xff,0x79,0x61,0x75,0xff,0x71, 0x5c,0x6f,0xff,0x74,0x5e,0x72,0xff,0x77,0x5f,0x73,0xff,0x71,0x5c,0x70,0xff,0x73, 0x5d,0x71,0xff,0x6c,0x59,0x6b,0xff,0x50,0x49,0x51,0xff,0x46,0x44,0x46,0xff,0x46, 0x43,0x46,0xff,0x45,0x43,0x46,0xff,0x44,0x43,0x45,0xff,0x43,0x42,0x44,0xff,0x47, 0x44,0x48,0xff,0x32,0x37,0x33,0xff,0x30,0x36,0x31,0xff,0x3e,0x3f,0x3f,0xff,0x4e, 0x48,0x4f,0xff,0x56,0x4d,0x57,0xff,0x58,0x4f,0x59,0xff,0x41,0x40,0x41,0xff,0x2e, 0x34,0x2f,0xff,0x5d,0x51,0x5f,0xff,0x7e,0x61,0x68,0xff,0x78,0x60,0x70,0xff,0x57, 0x4e,0x58,0xff,0x4b,0x47,0x4e,0xff,0x63,0x4e,0x53,0xff,0xb3,0x96,0x8e,0xff,0xb3, 0x96,0x8b,0xff,0xa9,0x8b,0x80,0xff,0xa9,0x89,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xab,0x89,0x7b,0xff,0x92,0x72,0x77,0xff,0x93, 0x75,0x79,0xfd,0xab,0x8e,0x85,0xfc,0xaa,0x89,0x7f,0xf8,0x92,0x74,0x6b,0xf0,0x1d, 0x18,0x15,0xe0,0x01,0x01,0x01,0xc8,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0x5c,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0xb5,0x05,0x05,0x05,0xd6,0x3d,0x36,0x3d,0xea,0x63,0x55,0x63,0xf7,0x5e, 0x52,0x5f,0xfc,0x60,0x53,0x60,0xfe,0x60,0x53,0x60,0xff,0x5d,0x52,0x5e,0xff,0x5a, 0x50,0x5f,0xff,0x58,0x4e,0x5c,0xff,0x60,0x52,0x62,0xff,0x72,0x5b,0x69,0xff,0x64, 0x54,0x5f,0xff,0x34,0x39,0x36,0xff,0x39,0x3c,0x39,0xff,0x37,0x3a,0x37,0xff,0x36, 0x3a,0x37,0xff,0x36,0x3a,0x36,0xff,0x34,0x3a,0x34,0xff,0x30,0x35,0x30,0xff,0x1c, 0x21,0x1d,0xff,0x1d,0x22,0x1e,0xff,0x24,0x25,0x24,0xff,0x2e,0x2b,0x2e,0xff,0x1c, 0x21,0x1c,0xff,0x1f,0x23,0x1f,0xff,0x1d,0x22,0x1e,0xff,0x1b,0x1f,0x1b,0xff,0x25, 0x26,0x25,0xff,0x4f,0x4a,0x50,0xff,0x55,0x4d,0x56,0xff,0x54,0x4c,0x54,0xff,0x55, 0x4c,0x56,0xff,0x53,0x4c,0x54,0xff,0x3b,0x3d,0x3b,0xff,0x46,0x43,0x46,0xff,0x78, 0x60,0x77,0xff,0x69,0x58,0x68,0xff,0x60,0x53,0x60,0xff,0x5f,0x52,0x5f,0xff,0x62, 0x55,0x62,0xff,0x64,0x55,0x64,0xff,0x65,0x56,0x64,0xff,0x62,0x54,0x61,0xff,0x43, 0x42,0x43,0xff,0x1e,0x29,0x1f,0xff,0x1c,0x25,0x1d,0xff,0x25,0x2e,0x26,0xff,0x1f, 0x26,0x1f,0xff,0x18,0x1f,0x18,0xff,0x16,0x1d,0x16,0xff,0x1a,0x22,0x1b,0xff,0x55, 0x49,0x50,0xff,0x8c,0x6c,0x84,0xff,0x58,0x4e,0x58,0xff,0x2a,0x32,0x2a,0xff,0x33, 0x38,0x33,0xff,0x2c,0x30,0x2c,0xff,0x20,0x23,0x20,0xff,0x15,0x1d,0x16,0xff,0x2d, 0x2b,0x2d,0xff,0x3a,0x33,0x39,0xff,0x21,0x25,0x22,0xff,0x24,0x26,0x25,0xff,0x25, 0x25,0x25,0xff,0x41,0x3c,0x42,0xff,0x58,0x50,0x59,0xff,0x54,0x4c,0x54,0xff,0x54, 0x4c,0x55,0xff,0x54,0x4c,0x54,0xff,0x54,0x4c,0x54,0xff,0x54,0x4c,0x55,0xff,0x54, 0x4c,0x55,0xff,0x54,0x4d,0x55,0xff,0x55,0x4d,0x56,0xff,0x58,0x4e,0x58,0xff,0x59, 0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x5f,0x52,0x60,0xff,0x53,0x4b,0x55,0xff,0x6a, 0x57,0x64,0xff,0x6d,0x5a,0x69,0xff,0x63,0x56,0x64,0xff,0x68,0x58,0x68,0xff,0x68, 0x59,0x68,0xff,0x69,0x59,0x69,0xff,0x33,0x38,0x33,0xff,0x00,0x0e,0x00,0xff,0x13, 0x1b,0x18,0xff,0x3f,0x3f,0x41,0xff,0x52,0x4a,0x51,0xff,0x30,0x2f,0x31,0xff,0x20, 0x23,0x21,0xff,0x20,0x24,0x20,0xff,0x1e,0x21,0x1f,0xff,0x47,0x42,0x48,0xff,0x58, 0x4e,0x59,0xff,0x40,0x40,0x41,0xff,0x60,0x53,0x5f,0xff,0x65,0x56,0x66,0xff,0x55, 0x4d,0x55,0xff,0x55,0x4d,0x56,0xff,0x49,0x45,0x49,0xff,0x50,0x4a,0x50,0xff,0x58, 0x4e,0x58,0xff,0x5a,0x50,0x5b,0xff,0x60,0x52,0x60,0xff,0x38,0x3a,0x39,0xff,0x5d, 0x51,0x5d,0xff,0x65,0x56,0x65,0xff,0x65,0x56,0x65,0xff,0x64,0x56,0x64,0xff,0x66, 0x56,0x66,0xff,0x65,0x56,0x65,0xff,0x64,0x55,0x64,0xff,0x60,0x53,0x60,0xff,0x61, 0x54,0x61,0xff,0x56,0x4d,0x56,0xff,0x3d,0x3f,0x3e,0xff,0x33,0x35,0x34,0xff,0x27, 0x29,0x27,0xff,0x23,0x26,0x24,0xff,0x26,0x27,0x26,0xff,0x18,0x18,0x18,0xff,0x00, 0x00,0x00,0xff,0x18,0x15,0x18,0xff,0x59,0x4e,0x5a,0xff,0x64,0x55,0x64,0xff,0x45, 0x42,0x45,0xff,0x44,0x42,0x44,0xff,0x26,0x30,0x26,0xff,0x48,0x45,0x48,0xff,0x36, 0x39,0x36,0xff,0x0b,0x19,0x0d,0xff,0x37,0x3b,0x39,0xff,0x7c,0x63,0x63,0xff,0x5e, 0x52,0x5e,0xff,0x5b,0x50,0x5c,0xff,0x5a,0x4f,0x5b,0xff,0x58,0x4e,0x58,0xff,0x58, 0x4e,0x58,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x56, 0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xfd,0x56, 0x4d,0x57,0xf9,0x54,0x4b,0x55,0xed,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0xb3,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x9e,0x03,0x03,0x03,0xc8,0x3e, 0x32,0x3d,0xe6,0x80,0x66,0x7c,0xf5,0x81,0x65,0x78,0xfc,0x83,0x66,0x78,0xfe,0x7d, 0x63,0x76,0xff,0x69,0x58,0x6a,0xff,0x6c,0x59,0x6b,0xff,0x71,0x5c,0x6f,0xff,0x71, 0x5c,0x6f,0xff,0x72,0x5d,0x70,0xff,0x72,0x5d,0x70,0xff,0x6f,0x5c,0x6e,0xff,0x5c, 0x51,0x5c,0xff,0x54,0x4c,0x54,0xff,0x5e,0x52,0x5e,0xff,0x4b,0x47,0x4b,0xff,0x4f, 0x49,0x4f,0xff,0x5e,0x51,0x5f,0xff,0x57,0x4d,0x58,0xff,0x55,0x4c,0x56,0xff,0x54, 0x4c,0x54,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x52,0x4b,0x52,0xff,0x4d,0x46,0x4d,0xff,0x3a, 0x34,0x3a,0xff,0x31,0x29,0x31,0xff,0x32,0x2a,0x32,0xff,0x32,0x2c,0x33,0xff,0x30, 0x2b,0x31,0xff,0x29,0x26,0x29,0xff,0x1d,0x20,0x1f,0xff,0x16,0x1b,0x17,0xff,0x24, 0x24,0x25,0xff,0x2c,0x28,0x2d,0xff,0x32,0x2c,0x32,0xff,0x37,0x2e,0x36,0xff,0x3c, 0x31,0x3c,0xff,0x57,0x48,0x57,0xff,0x72,0x5e,0x71,0xff,0x6e,0x5a,0x6c,0xff,0x74, 0x5d,0x72,0xff,0x6d,0x5a,0x6b,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5b,0x50,0x5c,0xff,0x5a,0x50,0x5b,0xff,0x59, 0x4f,0x59,0xff,0x5b,0x50,0x5c,0xff,0x3a,0x3c,0x3b,0xff,0x34,0x38,0x36,0xff,0x7e, 0x63,0x74,0xff,0x71,0x5b,0x67,0xff,0x44,0x43,0x47,0xff,0x4a,0x47,0x4b,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x49, 0x47,0x4a,0xff,0x41,0x3b,0x42,0xff,0x33,0x2e,0x33,0xff,0x3e,0x35,0x3e,0xff,0x4a, 0x3c,0x49,0xff,0x48,0x3b,0x46,0xff,0x45,0x38,0x43,0xff,0x41,0x34,0x3f,0xff,0x38, 0x2e,0x37,0xff,0x4c,0x3f,0x4b,0xff,0x6c,0x58,0x6b,0xff,0x74,0x5f,0x72,0xff,0x77, 0x60,0x75,0xff,0x65,0x56,0x64,0xff,0x63,0x55,0x62,0xff,0x6c,0x59,0x6a,0xff,0x64, 0x56,0x63,0xff,0x6d,0x5b,0x6b,0xff,0x77,0x60,0x74,0xff,0x77,0x5f,0x74,0xff,0x77, 0x5f,0x73,0xff,0x71,0x5c,0x6f,0xff,0x78,0x60,0x75,0xff,0x5b,0x50,0x5b,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x48,0xff,0x48,0x45,0x49,0xff,0x48,0x44,0x49,0xff,0x44, 0x42,0x45,0xff,0x46,0x44,0x47,0xff,0x37,0x3b,0x39,0xff,0x47,0x44,0x48,0xff,0x46, 0x43,0x46,0xff,0x43,0x42,0x44,0xff,0x52,0x4b,0x53,0xff,0x56,0x4d,0x57,0xff,0x57, 0x4e,0x57,0xff,0x59,0x50,0x5a,0xff,0x5d,0x51,0x5c,0xff,0x58,0x4e,0x58,0xff,0x54, 0x4c,0x58,0xff,0x55,0x4c,0x55,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x45, 0x43,0x4b,0xff,0x78,0x64,0x67,0xff,0xb9,0xa0,0x96,0xff,0xb0,0x93,0x88,0xff,0xa8, 0x88,0x7e,0xff,0xa8,0x89,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x85,0x7b,0xff,0xad,0x8b,0x7d,0xff,0x6a,0x58,0x6d,0xff,0xa7,0x89,0x80,0xfe,0xa8, 0x89,0x7f,0xfd,0xab,0x88,0x7c,0xf7,0x82,0x69,0x60,0xee,0x17,0x12,0x0e,0xdd,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0xc2,0x0f, 0x0e,0x0f,0xdf,0x58,0x4d,0x59,0xef,0x5f,0x53,0x60,0xf9,0x60,0x53,0x60,0xfe,0x60, 0x53,0x60,0xff,0x60,0x53,0x60,0xff,0x5f,0x52,0x5f,0xff,0x5e,0x52,0x5e,0xff,0x5b, 0x50,0x5c,0xff,0x55,0x4c,0x58,0xff,0x4d,0x48,0x4e,0xff,0x3a,0x3d,0x3b,0xff,0x37, 0x3a,0x37,0xff,0x36,0x3a,0x37,0xff,0x33,0x39,0x34,0xff,0x32,0x38,0x32,0xff,0x33, 0x38,0x33,0xff,0x30,0x36,0x31,0xff,0x28,0x2d,0x28,0xff,0x1b,0x20,0x1c,0xff,0x25, 0x26,0x24,0xff,0x31,0x2e,0x31,0xff,0x1d,0x22,0x1d,0xff,0x1e,0x22,0x1e,0xff,0x1e, 0x22,0x1e,0xff,0x1e,0x21,0x1e,0xff,0x1e,0x21,0x1e,0xff,0x34,0x35,0x35,0xff,0x4f, 0x49,0x4f,0xff,0x4b,0x46,0x4b,0xff,0x4c,0x47,0x4d,0xff,0x45,0x43,0x46,0xff,0x46, 0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x63,0x55,0x62,0xff,0x5d,0x51,0x5e,0xff,0x5e, 0x52,0x5f,0xff,0x5f,0x53,0x60,0xff,0x61,0x54,0x61,0xff,0x61,0x53,0x61,0xff,0x61, 0x53,0x61,0xff,0x54,0x4d,0x55,0xff,0x3a,0x3d,0x3b,0xff,0x25,0x2e,0x26,0xff,0x1e, 0x27,0x20,0xff,0x21,0x29,0x22,0xff,0x1c,0x23,0x1c,0xff,0x16,0x1c,0x16,0xff,0x15, 0x1f,0x15,0xff,0x31,0x37,0x32,0xff,0x6c,0x5b,0x6a,0xff,0x8b,0x6a,0x7e,0xff,0x5c, 0x4e,0x53,0xff,0x28,0x32,0x2a,0xff,0x37,0x3c,0x37,0xff,0x2d,0x31,0x2d,0xff,0x23, 0x26,0x23,0xff,0x17,0x1e,0x18,0xff,0x2a,0x29,0x2a,0xff,0x39,0x33,0x38,0xff,0x22, 0x25,0x23,0xff,0x26,0x27,0x26,0xff,0x22,0x23,0x22,0xff,0x3a,0x37,0x3b,0xff,0x55, 0x4c,0x55,0xff,0x54,0x4c,0x54,0xff,0x54,0x4c,0x54,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x55, 0x4c,0x56,0xff,0x57,0x4e,0x58,0xff,0x57,0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x5c, 0x50,0x5d,0xff,0x64,0x55,0x65,0xff,0x4a,0x46,0x4c,0xff,0x32,0x37,0x33,0xff,0x36, 0x3a,0x36,0xff,0x41,0x41,0x42,0xff,0x45,0x43,0x46,0xff,0x3a,0x3b,0x3a,0xff,0x20, 0x2d,0x24,0xff,0x37,0x32,0x30,0xff,0x7e,0x66,0x65,0xff,0x83,0x6b,0x7a,0xff,0x48, 0x44,0x4a,0xff,0x26,0x2a,0x26,0xff,0x22,0x24,0x22,0xff,0x20,0x24,0x20,0xff,0x1d, 0x21,0x1d,0xff,0x49,0x42,0x49,0xff,0x46,0x44,0x47,0xff,0x66,0x56,0x65,0xff,0x6d, 0x5a,0x6b,0xff,0x59,0x4f,0x5a,0xff,0x53,0x4c,0x55,0xff,0x56,0x4d,0x57,0xff,0x47, 0x44,0x48,0xff,0x4f,0x49,0x50,0xff,0x57,0x4d,0x57,0xff,0x59,0x4f,0x59,0xff,0x5c, 0x51,0x5d,0xff,0x53,0x4b,0x53,0xff,0x3f,0x3f,0x3f,0xff,0x53,0x4b,0x53,0xff,0x61, 0x53,0x61,0xff,0x63,0x55,0x63,0xff,0x65,0x55,0x64,0xff,0x64,0x55,0x64,0xff,0x62, 0x54,0x63,0xff,0x60,0x53,0x60,0xff,0x60,0x53,0x60,0xff,0x5c,0x51,0x5d,0xff,0x3e, 0x3f,0x3f,0xff,0x37,0x39,0x38,0xff,0x26,0x28,0x26,0xff,0x23,0x26,0x24,0xff,0x25, 0x28,0x26,0xff,0x12,0x12,0x12,0xff,0x00,0x00,0x00,0xff,0x0f,0x0e,0x0f,0xff,0x59, 0x4d,0x5a,0xff,0x61,0x54,0x61,0xff,0x67,0x58,0x67,0xff,0x6c,0x5a,0x6c,0xff,0x52, 0x4a,0x52,0xff,0x4e,0x48,0x4e,0xff,0x64,0x55,0x63,0xff,0x41,0x3f,0x41,0xff,0x3c, 0x3d,0x3b,0xff,0x58,0x4f,0x5d,0xff,0x61,0x54,0x62,0xff,0x5a,0x50,0x5b,0xff,0x5a, 0x50,0x5b,0xff,0x59,0x4f,0x59,0xff,0x57,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x56, 0x4d,0x57,0xff,0x55,0x4d,0x56,0xff,0x56,0x4d,0x57,0xff,0x55,0x4d,0x56,0xff,0x56, 0x4d,0x57,0xfe,0x56,0x4d,0x57,0xfc,0x55,0x4c,0x56,0xf7,0x53,0x4b,0x54,0xe9,0x00, 0x00,0x00,0xcf,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x9a,0x02,0x02,0x02,0xc4,0x2e,0x25,0x2e,0xe4,0x7f,0x66,0x7b,0xf4,0x81, 0x65,0x78,0xfc,0x84,0x66,0x77,0xfe,0x85,0x64,0x70,0xff,0x67,0x56,0x68,0xff,0x6c, 0x59,0x6a,0xff,0x6f,0x5b,0x6d,0xff,0x72,0x5c,0x6f,0xff,0x73,0x5e,0x71,0xff,0x72, 0x5d,0x70,0xff,0x6b,0x59,0x6a,0xff,0x4e,0x49,0x4f,0xff,0x59,0x4f,0x59,0xff,0x67, 0x56,0x67,0xff,0x65,0x57,0x65,0xff,0x5f,0x52,0x60,0xff,0x5a,0x4f,0x5b,0xff,0x57, 0x4d,0x57,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x52,0x4a,0x52,0xff,0x52,0x4a,0x52,0xff,0x52, 0x4b,0x52,0xff,0x4a,0x43,0x4a,0xff,0x32,0x2c,0x32,0xff,0x34,0x2d,0x34,0xff,0x34, 0x2c,0x33,0xff,0x2a,0x26,0x2a,0xff,0x21,0x21,0x22,0xff,0x2d,0x28,0x2b,0xff,0x33, 0x2a,0x2c,0xff,0x1b,0x1f,0x1e,0xff,0x21,0x22,0x22,0xff,0x37,0x2f,0x38,0xff,0x35, 0x2d,0x35,0xff,0x36,0x2c,0x35,0xff,0x39,0x2f,0x38,0xff,0x52,0x44,0x51,0xff,0x6e, 0x5b,0x6d,0xff,0x70,0x5b,0x6e,0xff,0x76,0x5e,0x73,0xff,0x68,0x57,0x67,0xff,0x53, 0x4c,0x54,0xff,0x59,0x4f,0x59,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5a, 0x50,0x5b,0xff,0x5a,0x50,0x5b,0xff,0x58,0x4f,0x59,0xff,0x58,0x4f,0x5a,0xff,0x45, 0x43,0x46,0xff,0x3c,0x3d,0x3c,0xff,0x6e,0x5b,0x69,0xff,0x77,0x5f,0x71,0xff,0x50, 0x49,0x51,0xff,0x47,0x45,0x48,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x47, 0x44,0x48,0xff,0x47,0x44,0x48,0xff,0x46,0x44,0x47,0xff,0x43,0x3d,0x43,0xff,0x37, 0x31,0x37,0xff,0x3e,0x35,0x3d,0xff,0x48,0x3b,0x48,0xff,0x45,0x39,0x45,0xff,0x47, 0x3a,0x46,0xff,0x47,0x3b,0x46,0xff,0x41,0x36,0x3f,0xff,0x38,0x2e,0x37,0xff,0x47, 0x3b,0x47,0xff,0x68,0x55,0x67,0xff,0x76,0x60,0x74,0xff,0x77,0x61,0x75,0xff,0x71, 0x5d,0x6f,0xff,0x59,0x4f,0x59,0xff,0x5a,0x4f,0x5a,0xff,0x71,0x5c,0x6e,0xff,0x77, 0x60,0x74,0xff,0x74,0x5e,0x72,0xff,0x73,0x5d,0x71,0xff,0x72,0x5d,0x70,0xff,0x6d, 0x5b,0x6d,0xff,0x54,0x4c,0x55,0xff,0x4a,0x46,0x4b,0xff,0x46,0x44,0x46,0xff,0x35, 0x39,0x36,0xff,0x38,0x3b,0x39,0xff,0x45,0x43,0x46,0xff,0x39,0x3c,0x3a,0xff,0x2c, 0x34,0x2d,0xff,0x54,0x4b,0x54,0xff,0x47,0x44,0x48,0xff,0x4b,0x46,0x4b,0xff,0x55, 0x4c,0x56,0xff,0x58,0x4e,0x59,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x59, 0x4f,0x59,0xff,0x58,0x4e,0x59,0xff,0x59,0x4f,0x59,0xff,0x58,0x4e,0x58,0xff,0x57, 0x4e,0x58,0xff,0x56,0x4c,0x56,0xff,0x53,0x4b,0x52,0xff,0x4a,0x44,0x4e,0xff,0x91, 0x78,0x83,0xff,0xba,0xa2,0x9b,0xff,0xad,0x8f,0x85,0xff,0xa9,0x8a,0x7f,0xff,0xa8, 0x88,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa9,0x88,0x7d,0xff,0x7a, 0x5e,0x65,0xff,0x8a,0x6c,0x75,0xff,0xaa,0x88,0x7d,0xfe,0xa7,0x86,0x78,0xfc,0xb0, 0x87,0x7a,0xf7,0x62,0x4f,0x57,0xed,0x06,0x06,0x06,0xdc,0x00,0x00,0x00,0xc3,0x00, 0x00,0x00,0xa0,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x35,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,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,0x01,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0xac,0x03,0x02,0x03,0xcf,0x28,0x23,0x28,0xe6,0x61, 0x55,0x62,0xf5,0x5e,0x52,0x5e,0xfc,0x5e,0x52,0x5e,0xfd,0x60,0x53,0x60,0xff,0x5f, 0x53,0x60,0xff,0x5e,0x51,0x5e,0xff,0x5d,0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x56, 0x4d,0x57,0xff,0x43,0x42,0x44,0xff,0x36,0x3a,0x36,0xff,0x35,0x3a,0x36,0xff,0x33, 0x38,0x34,0xff,0x34,0x39,0x34,0xff,0x32,0x37,0x33,0xff,0x30,0x36,0x31,0xff,0x2e, 0x34,0x2e,0xff,0x1e,0x23,0x1f,0xff,0x21,0x25,0x22,0xff,0x30,0x2d,0x30,0xff,0x1b, 0x21,0x1b,0xff,0x1f,0x23,0x1f,0xff,0x1e,0x22,0x1e,0xff,0x1f,0x23,0x1f,0xff,0x1c, 0x1f,0x1c,0xff,0x28,0x2a,0x28,0xff,0x4a,0x48,0x4b,0xff,0x4e,0x49,0x4f,0xff,0x4f, 0x48,0x4f,0xff,0x4c,0x47,0x4c,0xff,0x56,0x4d,0x57,0xff,0x51,0x4a,0x52,0xff,0x58, 0x4e,0x58,0xff,0x5d,0x51,0x5d,0xff,0x5d,0x51,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5f, 0x52,0x60,0xff,0x61,0x54,0x61,0xff,0x63,0x55,0x63,0xff,0x54,0x4c,0x54,0xff,0x35, 0x39,0x36,0xff,0x29,0x31,0x29,0xff,0x23,0x2d,0x24,0xff,0x1c,0x25,0x1c,0xff,0x17, 0x1f,0x16,0xff,0x28,0x2e,0x28,0xff,0x45,0x40,0x45,0xff,0x5b,0x50,0x5c,0xff,0x6d, 0x5b,0x6e,0xff,0x8a,0x68,0x78,0xff,0x6c,0x55,0x57,0xff,0x31,0x38,0x36,0xff,0x36, 0x3b,0x38,0xff,0x2f,0x33,0x30,0xff,0x21,0x25,0x21,0xff,0x20,0x24,0x21,0xff,0x37, 0x31,0x37,0xff,0x36,0x31,0x35,0xff,0x21,0x24,0x22,0xff,0x25,0x27,0x26,0xff,0x23, 0x25,0x24,0xff,0x30,0x2f,0x31,0xff,0x4c,0x45,0x4c,0xff,0x54,0x4c,0x54,0xff,0x52, 0x4a,0x51,0xff,0x53,0x4b,0x52,0xff,0x52,0x4a,0x52,0xff,0x52,0x4a,0x53,0xff,0x53, 0x4b,0x54,0xff,0x54,0x4b,0x54,0xff,0x54,0x4c,0x54,0xff,0x54,0x4c,0x54,0xff,0x54, 0x4c,0x54,0xff,0x57,0x4e,0x58,0xff,0x54,0x4c,0x55,0xff,0x3f,0x3f,0x41,0xff,0x2e, 0x35,0x2f,0xff,0x42,0x41,0x42,0xff,0x4b,0x46,0x4b,0xff,0x59,0x4e,0x58,0xff,0x5c, 0x51,0x5d,0xff,0x28,0x31,0x2e,0xff,0x44,0x3b,0x36,0xff,0xa2,0x83,0x83,0xff,0xc5, 0x9f,0x93,0xff,0x6f,0x5f,0x5e,0xff,0x3a,0x3d,0x3c,0xff,0x28,0x2c,0x29,0xff,0x21, 0x24,0x21,0xff,0x21,0x24,0x20,0xff,0x18,0x1d,0x18,0xff,0x40,0x3d,0x41,0xff,0x4d, 0x48,0x4d,0xff,0x5a,0x4f,0x5a,0xff,0x54,0x4c,0x54,0xff,0x52,0x4b,0x53,0xff,0x54, 0x4c,0x55,0xff,0x53,0x4b,0x54,0xff,0x55,0x4d,0x56,0xff,0x55,0x4d,0x56,0xff,0x56, 0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x59,0x4e,0x5a,0xff,0x61,0x54,0x61,0xff,0x4b, 0x46,0x4c,0xff,0x6e,0x5b,0x68,0xff,0x64,0x56,0x63,0xff,0x62,0x55,0x62,0xff,0x61, 0x54,0x62,0xff,0x63,0x55,0x63,0xff,0x62,0x54,0x62,0xff,0x60,0x52,0x60,0xff,0x5d, 0x51,0x5e,0xff,0x61,0x54,0x61,0xff,0x41,0x41,0x41,0xff,0x3b,0x3d,0x3b,0xff,0x26, 0x29,0x27,0xff,0x24,0x26,0x24,0xff,0x25,0x28,0x26,0xff,0x0a,0x0b,0x0b,0xff,0x00, 0x00,0x00,0xff,0x08,0x07,0x08,0xff,0x56,0x4c,0x57,0xff,0x5e,0x52,0x5f,0xff,0x61, 0x53,0x61,0xff,0x62,0x54,0x62,0xff,0x68,0x58,0x68,0xff,0x4b,0x47,0x4b,0xff,0x50, 0x4a,0x51,0xff,0x4c,0x48,0x4d,0xff,0x4a,0x46,0x4b,0xff,0x3b,0x3c,0x3b,0xff,0x45, 0x44,0x46,0xff,0x5a,0x4f,0x5a,0xff,0x5a,0x4f,0x5a,0xff,0x59,0x4e,0x5a,0xff,0x56, 0x4d,0x57,0xff,0x54,0x4c,0x54,0xff,0x54,0x4c,0x54,0xff,0x53,0x4b,0x53,0xff,0x54, 0x4c,0x54,0xff,0x53,0x4b,0x53,0xff,0x55,0x4c,0x56,0xfe,0x54,0x4c,0x54,0xfc,0x54, 0x4c,0x55,0xf5,0x51,0x49,0x51,0xe6,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x94,0x01,0x01,0x01,0xc0,0x1e, 0x18,0x1d,0xe0,0x80,0x67,0x7c,0xf2,0x7f,0x64,0x78,0xfa,0x84,0x66,0x78,0xfd,0x81, 0x64,0x72,0xff,0x5c,0x51,0x5f,0xff,0x6d,0x5a,0x6b,0xff,0x70,0x5b,0x6e,0xff,0x71, 0x5c,0x6f,0xff,0x73,0x5e,0x71,0xff,0x72,0x5d,0x70,0xff,0x6c,0x59,0x6a,0xff,0x57, 0x4d,0x58,0xff,0x72,0x5d,0x71,0xff,0x65,0x56,0x65,0xff,0x60,0x53,0x60,0xff,0x5d, 0x51,0x5d,0xff,0x5a,0x4f,0x5b,0xff,0x56,0x4d,0x56,0xff,0x54,0x4c,0x55,0xff,0x54, 0x4c,0x54,0xff,0x52,0x4a,0x52,0xff,0x52,0x4b,0x53,0xff,0x50,0x4a,0x51,0xff,0x52, 0x4b,0x52,0xff,0x51,0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x46,0x40,0x46,0xff,0x32, 0x2d,0x32,0xff,0x31,0x2b,0x31,0xff,0x2d,0x2a,0x2e,0xff,0x2a,0x26,0x2a,0xff,0x2c, 0x28,0x2d,0xff,0x3c,0x30,0x35,0xff,0x51,0x3b,0x38,0xff,0x36,0x2f,0x2c,0xff,0x22, 0x22,0x24,0xff,0x3b,0x30,0x3b,0xff,0x36,0x2d,0x35,0xff,0x36,0x2d,0x35,0xff,0x35, 0x2c,0x34,0xff,0x46,0x3a,0x45,0xff,0x66,0x55,0x66,0xff,0x74,0x5e,0x72,0xff,0x74, 0x5e,0x71,0xff,0x5f,0x52,0x5f,0xff,0x53,0x4b,0x54,0xff,0x58,0x4d,0x58,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x58,0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x56, 0x4d,0x57,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x54,0xff,0x39,0x3b,0x39,0xff,0x40, 0x3f,0x40,0xff,0x6a,0x59,0x6a,0xff,0x57,0x4e,0x58,0xff,0x45,0x43,0x46,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x47, 0x44,0x48,0xff,0x47,0x44,0x48,0xff,0x47,0x44,0x47,0xff,0x48,0x45,0x48,0xff,0x41, 0x3e,0x41,0xff,0x42,0x38,0x41,0xff,0x45,0x3a,0x45,0xff,0x45,0x3a,0x45,0xff,0x45, 0x39,0x44,0xff,0x45,0x39,0x44,0xff,0x47,0x3a,0x45,0xff,0x48,0x3b,0x48,0xff,0x48, 0x3c,0x47,0xff,0x41,0x35,0x40,0xff,0x38,0x2e,0x38,0xff,0x44,0x37,0x43,0xff,0x5b, 0x4a,0x5a,0xff,0x71,0x5c,0x6f,0xff,0x7a,0x62,0x77,0xff,0x70,0x5c,0x6e,0xff,0x5e, 0x51,0x5e,0xff,0x6d,0x5a,0x6b,0xff,0x78,0x61,0x75,0xff,0x76,0x60,0x73,0xff,0x70, 0x5c,0x6e,0xff,0x7a,0x61,0x77,0xff,0x61,0x54,0x61,0xff,0x39,0x3c,0x3b,0xff,0x36, 0x3a,0x37,0xff,0x32,0x38,0x32,0xff,0x1d,0x2a,0x1e,0xff,0x18,0x25,0x19,0xff,0x2a, 0x31,0x2b,0xff,0x2c,0x34,0x2c,0xff,0x3c,0x3e,0x3d,0xff,0x3e,0x40,0x3f,0xff,0x40, 0x40,0x41,0xff,0x50,0x4a,0x51,0xff,0x56,0x4d,0x57,0xff,0x59,0x4f,0x59,0xff,0x57, 0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x58, 0x4e,0x59,0xff,0x58,0x4e,0x58,0xff,0x58,0x4d,0x57,0xff,0x54,0x4b,0x54,0xff,0x54, 0x4c,0x55,0xff,0x50,0x49,0x50,0xff,0x4f,0x46,0x53,0xff,0xa0,0x81,0x79,0xff,0xb2, 0x94,0x8b,0xff,0xab,0x8d,0x83,0xff,0xa9,0x89,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa7, 0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa3,0x80,0x76,0xff,0x7f,0x63,0x78,0xff,0x7a, 0x63,0x6e,0xff,0x90,0x71,0x7e,0xfe,0x57,0x4d,0x47,0xfc,0x72,0x5d,0x74,0xf6,0x63, 0x52,0x4c,0xec,0x07,0x06,0x05,0xda,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0x75,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0xbd,0x06,0x06,0x07,0xdb,0x48,0x40,0x49,0xef,0x5e,0x53,0x5f,0xf8,0x5b, 0x50,0x5c,0xfd,0x5e,0x52,0x5e,0xfe,0x5e,0x52,0x5e,0xff,0x5b,0x50,0x5c,0xff,0x5a, 0x4f,0x5b,0xff,0x59,0x4e,0x59,0xff,0x56,0x4e,0x58,0xff,0x4e,0x48,0x4f,0xff,0x38, 0x3b,0x38,0xff,0x35,0x3a,0x36,0xff,0x34,0x39,0x35,0xff,0x33,0x38,0x34,0xff,0x33, 0x38,0x33,0xff,0x31,0x37,0x31,0xff,0x2f,0x34,0x2f,0xff,0x25,0x2a,0x25,0xff,0x19, 0x1f,0x1a,0xff,0x1b,0x20,0x1c,0xff,0x2c,0x2a,0x2c,0xff,0x1c,0x21,0x1c,0xff,0x1e, 0x22,0x1e,0xff,0x1e,0x22,0x1e,0xff,0x1d,0x21,0x1d,0xff,0x20,0x23,0x20,0xff,0x3c, 0x3c,0x3e,0xff,0x54,0x4c,0x55,0xff,0x51,0x4b,0x52,0xff,0x55,0x4c,0x55,0xff,0x54, 0x4c,0x55,0xff,0x58,0x4e,0x59,0xff,0x5f,0x53,0x5f,0xff,0x60,0x53,0x60,0xff,0x5d, 0x51,0x5d,0xff,0x5c,0x50,0x5c,0xff,0x5d,0x51,0x5d,0xff,0x55,0x4d,0x56,0xff,0x3f, 0x40,0x3f,0xff,0x3c,0x3e,0x3d,0xff,0x33,0x39,0x35,0xff,0x30,0x35,0x2f,0xff,0x1e, 0x29,0x1e,0xff,0x30,0x33,0x31,0xff,0x55,0x4b,0x55,0xff,0x5d,0x52,0x5e,0xff,0x6e, 0x5b,0x6e,0xff,0x5f,0x52,0x5f,0xff,0x38,0x3b,0x39,0xff,0x58,0x4d,0x54,0xff,0x80, 0x64,0x78,0xff,0x56,0x4d,0x55,0xff,0x31,0x38,0x33,0xff,0x32,0x36,0x33,0xff,0x21, 0x26,0x22,0xff,0x2b,0x2a,0x2b,0xff,0x46,0x3a,0x46,0xff,0x33,0x2f,0x33,0xff,0x20, 0x24,0x21,0xff,0x24,0x26,0x25,0xff,0x26,0x27,0x26,0xff,0x29,0x28,0x29,0xff,0x44, 0x3e,0x43,0xff,0x54,0x4c,0x54,0xff,0x51,0x4a,0x51,0xff,0x52,0x4a,0x52,0xff,0x52, 0x4a,0x52,0xff,0x51,0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x50,0x49,0x51,0xff,0x50, 0x49,0x51,0xff,0x54,0x4b,0x54,0xff,0x4c,0x47,0x4c,0xff,0x39,0x3c,0x39,0xff,0x50, 0x4a,0x53,0xff,0x6f,0x59,0x61,0xff,0x64,0x53,0x5b,0xff,0x48,0x44,0x49,0xff,0x57, 0x4d,0x57,0xff,0x68,0x58,0x6a,0xff,0x7d,0x5f,0x6d,0xff,0x86,0x69,0x65,0xff,0xab, 0x8e,0x87,0xff,0xbe,0x9c,0x92,0xff,0x88,0x72,0x73,0xff,0x42,0x41,0x41,0xff,0x33, 0x39,0x34,0xff,0x27,0x2b,0x29,0xff,0x20,0x23,0x20,0xff,0x21,0x25,0x21,0xff,0x1a, 0x1d,0x19,0xff,0x33,0x33,0x34,0xff,0x51,0x4a,0x51,0xff,0x52,0x4b,0x52,0xff,0x52, 0x4b,0x53,0xff,0x53,0x4b,0x54,0xff,0x53,0x4b,0x54,0xff,0x53,0x4b,0x53,0xff,0x54, 0x4c,0x54,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x57,0x4e,0x57,0xff,0x58, 0x4e,0x58,0xff,0x5b,0x4f,0x5b,0xff,0x60,0x53,0x60,0xff,0x69,0x59,0x68,0xff,0x63, 0x55,0x63,0xff,0x66,0x55,0x67,0xff,0x7f,0x61,0x6a,0xff,0x65,0x54,0x61,0xff,0x60, 0x53,0x62,0xff,0x5f,0x53,0x61,0xff,0x5e,0x51,0x5d,0xff,0x5f,0x51,0x5f,0xff,0x43, 0x43,0x43,0xff,0x3a,0x3d,0x3b,0xff,0x27,0x2a,0x28,0xff,0x23,0x25,0x22,0xff,0x23, 0x27,0x24,0xff,0x04,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x00,0x01,0x00,0xff,0x54, 0x4a,0x55,0xff,0x5e,0x52,0x5f,0xff,0x60,0x53,0x60,0xff,0x61,0x54,0x61,0xff,0x62, 0x54,0x62,0xff,0x5e,0x51,0x5e,0xff,0x4f,0x49,0x50,0xff,0x56,0x4e,0x56,0xff,0x5d, 0x52,0x5e,0xff,0x3c,0x3e,0x3c,0xff,0x49,0x45,0x4a,0xff,0x42,0x41,0x43,0xff,0x3c, 0x3e,0x3c,0xff,0x4b,0x43,0x4c,0xff,0x55,0x4c,0x56,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xfe,0x53,0x4b,0x53,0xfb,0x53,0x4b,0x54,0xf4,0x51,0x49,0x51,0xe4,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x44,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x5e,0x00, 0x00,0x00,0x8c,0x00,0x00,0x00,0xb8,0x0f,0x0d,0x0f,0xdb,0x7f,0x66,0x7c,0xf0,0x7e, 0x64,0x78,0xf9,0x84,0x66,0x78,0xfe,0x7a,0x61,0x75,0xff,0x54,0x4d,0x56,0xff,0x6d, 0x5a,0x6c,0xff,0x70,0x5b,0x6e,0xff,0x71,0x5c,0x6f,0xff,0x70,0x5c,0x6f,0xff,0x71, 0x5b,0x6f,0xff,0x69,0x58,0x69,0xff,0x51,0x4a,0x52,0xff,0x6b,0x59,0x6b,0xff,0x62, 0x54,0x62,0xff,0x5f,0x52,0x5f,0xff,0x5a,0x50,0x5b,0xff,0x58,0x4f,0x58,0xff,0x55, 0x4d,0x57,0xff,0x53,0x4c,0x54,0xff,0x4f,0x4a,0x50,0xff,0x4f,0x49,0x50,0xff,0x50, 0x49,0x51,0xff,0x4f,0x49,0x50,0xff,0x50,0x4a,0x51,0xff,0x50,0x49,0x50,0xff,0x51, 0x4a,0x51,0xff,0x4a,0x43,0x4a,0xff,0x33,0x2f,0x34,0xff,0x26,0x26,0x28,0xff,0x26, 0x25,0x26,0xff,0x35,0x2d,0x35,0xff,0x34,0x2d,0x35,0xff,0x3a,0x2f,0x34,0xff,0x51, 0x3b,0x37,0xff,0x4a,0x3a,0x38,0xff,0x33,0x2b,0x36,0xff,0x36,0x2d,0x36,0xff,0x35, 0x2c,0x35,0xff,0x33,0x2b,0x34,0xff,0x37,0x2e,0x37,0xff,0x50,0x42,0x4f,0xff,0x6c, 0x5a,0x6c,0xff,0x73,0x5e,0x71,0xff,0x71,0x5d,0x6f,0xff,0x58,0x4f,0x5a,0xff,0x55, 0x4d,0x56,0xff,0x58,0x4e,0x58,0xff,0x59,0x4e,0x59,0xff,0x59,0x4f,0x59,0xff,0x58, 0x4e,0x58,0xff,0x57,0x4e,0x58,0xff,0x55,0x4d,0x56,0xff,0x54,0x4c,0x54,0xff,0x53, 0x4b,0x53,0xff,0x4b,0x47,0x4c,0xff,0x3d,0x3f,0x3e,0xff,0x4a,0x46,0x4a,0xff,0x63, 0x55,0x63,0xff,0x57,0x4d,0x57,0xff,0x46,0x44,0x47,0xff,0x48,0x45,0x48,0xff,0x47, 0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47, 0x44,0x47,0xff,0x48,0x45,0x48,0xff,0x41,0x3c,0x42,0xff,0x41,0x38,0x42,0xff,0x47, 0x3b,0x47,0xff,0x45,0x3a,0x46,0xff,0x45,0x39,0x44,0xff,0x46,0x3a,0x45,0xff,0x45, 0x39,0x44,0xff,0x46,0x39,0x45,0xff,0x47,0x3b,0x47,0xff,0x47,0x3b,0x46,0xff,0x46, 0x39,0x45,0xff,0x3e,0x32,0x3e,0xff,0x3d,0x32,0x3c,0xff,0x4e,0x40,0x4c,0xff,0x6d, 0x58,0x6a,0xff,0x80,0x66,0x7d,0xff,0x57,0x4e,0x57,0xff,0x65,0x55,0x64,0xff,0x7a, 0x61,0x76,0xff,0x74,0x5f,0x72,0xff,0x77,0x60,0x75,0xff,0x61,0x54,0x61,0xff,0x49, 0x45,0x49,0xff,0x30,0x36,0x30,0xff,0x2f,0x36,0x2f,0xff,0x2e,0x35,0x2f,0xff,0x58, 0x4e,0x57,0xff,0x5d,0x4f,0x5c,0xff,0x3f,0x3f,0x3f,0xff,0x3a,0x3d,0x3c,0xff,0x40, 0x41,0x41,0xff,0x3f,0x40,0x41,0xff,0x47,0x45,0x49,0xff,0x53,0x4c,0x55,0xff,0x55, 0x4d,0x57,0xff,0x57,0x4e,0x58,0xff,0x57,0x4d,0x58,0xff,0x58,0x4e,0x59,0xff,0x58, 0x4e,0x58,0xff,0x5a,0x4f,0x5b,0xff,0x58,0x4e,0x59,0xff,0x58,0x4f,0x59,0xff,0x58, 0x4d,0x58,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x51,0x4b,0x52,0xff,0x47, 0x45,0x4a,0xff,0x54,0x49,0x4d,0xff,0xa3,0x87,0x7e,0xff,0xae,0x8e,0x84,0xff,0xaa, 0x8b,0x81,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa9, 0x8a,0x7e,0xff,0xa2,0x82,0x7d,0xff,0x70,0x5c,0x6f,0xff,0x39,0x3a,0x3c,0xff,0x5f, 0x51,0x61,0xfd,0x93,0x76,0x74,0xfc,0xa8,0x85,0x7b,0xf5,0x59,0x48,0x41,0xea,0x04, 0x03,0x03,0xd5,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0xa8,0x01,0x01,0x01,0xcb,0x18, 0x15,0x18,0xe5,0x5e,0x52,0x5f,0xf3,0x5c,0x50,0x5c,0xfb,0x5d,0x51,0x5d,0xfe,0x5d, 0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x59,0xff,0x58, 0x4e,0x58,0xff,0x52,0x4b,0x53,0xff,0x40,0x41,0x41,0xff,0x33,0x38,0x34,0xff,0x36, 0x3a,0x37,0xff,0x34,0x39,0x35,0xff,0x32,0x37,0x32,0xff,0x2e,0x35,0x2e,0xff,0x2e, 0x34,0x2e,0xff,0x2a,0x30,0x2b,0xff,0x1c,0x20,0x1c,0xff,0x20,0x23,0x21,0xff,0x2a, 0x2a,0x2b,0xff,0x1b,0x21,0x1b,0xff,0x1d,0x22,0x1d,0xff,0x1f,0x23,0x1f,0xff,0x1d, 0x21,0x1d,0xff,0x1b,0x1f,0x1b,0xff,0x2c,0x2e,0x2c,0xff,0x4f,0x4a,0x50,0xff,0x50, 0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x51,0x4a,0x52,0xff,0x57,0x4e,0x57,0xff,0x64, 0x56,0x64,0xff,0x62,0x54,0x62,0xff,0x59,0x4f,0x59,0xff,0x46,0x44,0x46,0xff,0x3a, 0x3c,0x3b,0xff,0x45,0x43,0x46,0xff,0x48,0x45,0x48,0xff,0x41,0x40,0x40,0xff,0x3e, 0x3f,0x3e,0xff,0x3f,0x3f,0x40,0xff,0x3c,0x3d,0x3d,0xff,0x65,0x55,0x64,0xff,0x70, 0x5c,0x6f,0xff,0x6d,0x5a,0x6c,0xff,0x56,0x4c,0x56,0xff,0x3a,0x3c,0x3a,0xff,0x31, 0x37,0x32,0xff,0x2e,0x36,0x32,0xff,0x67,0x54,0x5a,0xff,0x6f,0x57,0x5c,0xff,0x2d, 0x35,0x31,0xff,0x36,0x3a,0x37,0xff,0x26,0x2c,0x27,0xff,0x34,0x2f,0x34,0xff,0x47, 0x3b,0x47,0xff,0x2a,0x2a,0x2a,0xff,0x23,0x26,0x23,0xff,0x25,0x27,0x26,0xff,0x25, 0x27,0x26,0xff,0x2a,0x2b,0x2b,0xff,0x44,0x40,0x44,0xff,0x54,0x4c,0x54,0xff,0x50, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x50,0x4a,0x51,0xff,0x50, 0x4a,0x51,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x55,0x4d,0x56,0xff,0x37, 0x39,0x37,0xff,0x3a,0x3c,0x3f,0xff,0x80,0x66,0x68,0xff,0xa0,0x75,0x74,0xff,0x66, 0x53,0x57,0xff,0x35,0x3a,0x38,0xff,0x4f,0x49,0x4f,0xff,0x60,0x53,0x60,0xff,0x65, 0x55,0x60,0xff,0x60,0x54,0x59,0xff,0x87,0x6e,0x73,0xff,0x7a,0x64,0x6b,0xff,0x5d, 0x51,0x5e,0xff,0x43,0x42,0x44,0xff,0x38,0x3c,0x38,0xff,0x28,0x2c,0x29,0xff,0x20, 0x24,0x21,0xff,0x21,0x24,0x21,0xff,0x1c,0x20,0x1c,0xff,0x27,0x28,0x27,0xff,0x4b, 0x45,0x4b,0xff,0x52,0x4b,0x53,0xff,0x51,0x4a,0x51,0xff,0x50,0x49,0x50,0xff,0x50, 0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x52,0x4a,0x51,0xff,0x54,0x4c,0x54,0xff,0x54, 0x4c,0x55,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x58,0x4e,0x59,0xff,0x5d, 0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x5e,0x51,0x5f,0xff,0x63,0x54,0x63,0xff,0x68, 0x57,0x63,0xff,0x7c,0x5f,0x6b,0xff,0x84,0x65,0x75,0xff,0x5c,0x50,0x59,0xff,0x58, 0x4e,0x59,0xff,0x5b,0x50,0x5c,0xff,0x43,0x41,0x43,0xff,0x3a,0x3d,0x3a,0xff,0x28, 0x2a,0x28,0xff,0x24,0x26,0x25,0xff,0x1f,0x22,0x20,0xff,0x03,0x03,0x03,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x52,0x48,0x53,0xff,0x5d,0x51,0x5d,0xff,0x60, 0x53,0x60,0xff,0x62,0x54,0x62,0xff,0x62,0x54,0x62,0xff,0x62,0x54,0x62,0xff,0x61, 0x54,0x61,0xff,0x62,0x54,0x62,0xff,0x5e,0x52,0x5f,0xff,0x47,0x44,0x48,0xff,0x30, 0x36,0x30,0xff,0x52,0x4c,0x53,0xff,0x4f,0x48,0x50,0xff,0x38,0x39,0x38,0xff,0x50, 0x49,0x51,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xfe,0x53,0x4b,0x53,0xfc,0x53, 0x4b,0x53,0xf3,0x51,0x49,0x51,0xe4,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0x6d,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0xaf,0x0b, 0x09,0x0b,0xd5,0x74,0x5e,0x70,0xec,0x7f,0x64,0x79,0xf8,0x81,0x65,0x78,0xfd,0x78, 0x60,0x74,0xfe,0x5a,0x50,0x5a,0xff,0x57,0x4d,0x56,0xff,0x6e,0x5a,0x6d,0xff,0x70, 0x5c,0x6f,0xff,0x70,0x5c,0x6f,0xff,0x70,0x5b,0x6f,0xff,0x69,0x58,0x68,0xff,0x55, 0x4d,0x55,0xff,0x72,0x5d,0x70,0xff,0x61,0x54,0x61,0xff,0x5f,0x52,0x5f,0xff,0x5a, 0x4f,0x5b,0xff,0x55,0x4d,0x56,0xff,0x53,0x4c,0x54,0xff,0x51,0x4a,0x51,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4f,0x4a,0x50,0xff,0x45,0x41,0x46,0xff,0x2b, 0x28,0x2c,0xff,0x2b,0x2d,0x2c,0xff,0x23,0x24,0x23,0xff,0x36,0x2e,0x37,0xff,0x33, 0x2d,0x34,0xff,0x3a,0x30,0x37,0xff,0x4b,0x37,0x3a,0xff,0x46,0x35,0x38,0xff,0x36, 0x2d,0x37,0xff,0x34,0x2c,0x34,0xff,0x35,0x2c,0x35,0xff,0x33,0x2a,0x33,0xff,0x42, 0x37,0x42,0xff,0x67,0x55,0x66,0xff,0x70,0x5c,0x6f,0xff,0x74,0x5e,0x72,0xff,0x6e, 0x5b,0x6c,0xff,0x54,0x4b,0x55,0xff,0x56,0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x58, 0x4e,0x59,0xff,0x59,0x4f,0x59,0xff,0x58,0x4e,0x58,0xff,0x57,0x4e,0x58,0xff,0x55, 0x4d,0x56,0xff,0x52,0x4b,0x53,0xff,0x4e,0x48,0x4e,0xff,0x4f,0x49,0x50,0xff,0x4b, 0x46,0x4b,0xff,0x38,0x3b,0x38,0xff,0x52,0x4b,0x52,0xff,0x61,0x53,0x60,0xff,0x43, 0x42,0x44,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47, 0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x49,0x46,0x49,0xff,0x3e, 0x38,0x3e,0xff,0x33,0x2a,0x33,0xff,0x41,0x36,0x40,0xff,0x48,0x3b,0x47,0xff,0x45, 0x39,0x44,0xff,0x45,0x3a,0x45,0xff,0x45,0x39,0x44,0xff,0x46,0x39,0x45,0xff,0x47, 0x3b,0x47,0xff,0x47,0x3b,0x47,0xff,0x49,0x3c,0x48,0xff,0x4a,0x3c,0x49,0xff,0x42, 0x37,0x41,0xff,0x3b,0x30,0x39,0xff,0x4a,0x3b,0x48,0xff,0x70,0x59,0x6d,0xff,0x60, 0x53,0x60,0xff,0x67,0x57,0x66,0xff,0x76,0x60,0x74,0xff,0x76,0x60,0x74,0xff,0x5e, 0x51,0x5d,0xff,0x50,0x49,0x50,0xff,0x4a,0x45,0x4b,0xff,0x45,0x43,0x45,0xff,0x45, 0x43,0x45,0xff,0x43,0x42,0x43,0xff,0x50,0x4a,0x50,0xff,0x51,0x4b,0x52,0xff,0x47, 0x45,0x48,0xff,0x43,0x41,0x42,0xff,0x41,0x40,0x41,0xff,0x41,0x40,0x41,0xff,0x50, 0x49,0x50,0xff,0x56,0x4d,0x57,0xff,0x58,0x4d,0x57,0xff,0x59,0x4f,0x59,0xff,0x58, 0x4e,0x58,0xff,0x5a,0x50,0x5a,0xff,0x5b,0x4f,0x5b,0xff,0x5b,0x50,0x5c,0xff,0x5a, 0x4f,0x5b,0xff,0x57,0x4d,0x58,0xff,0x57,0x4d,0x57,0xff,0x55,0x4c,0x56,0xff,0x53, 0x4b,0x54,0xff,0x51,0x49,0x51,0xff,0x4e,0x49,0x4f,0xff,0x3f,0x3f,0x45,0xff,0x83, 0x63,0x64,0xff,0xad,0x90,0x87,0xff,0xad,0x8f,0x85,0xff,0xa9,0x8a,0x80,0xff,0xa8, 0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xab,0x8a,0x7d,0xff,0x87, 0x69,0x78,0xff,0x7c,0x61,0x57,0xff,0xaf,0x93,0x90,0xfe,0xa8,0x88,0x7b,0xfd,0xa6, 0x84,0x79,0xfb,0xa4,0x83,0x78,0xf3,0x43,0x36,0x30,0xe6,0x03,0x02,0x02,0xd0,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x67,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0xb9,0x04,0x04,0x05,0xd7,0x37,0x31,0x38,0xeb,0x5f, 0x54,0x60,0xf7,0x59,0x4f,0x5a,0xfc,0x5d,0x51,0x5d,0xfe,0x5b,0x50,0x5c,0xff,0x5b, 0x50,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x58,0x4e,0x58,0xff,0x56,0x4d,0x57,0xff,0x4f, 0x48,0x50,0xff,0x36,0x3a,0x36,0xff,0x33,0x38,0x33,0xff,0x33,0x38,0x34,0xff,0x2f, 0x34,0x2f,0xff,0x2d,0x34,0x2e,0xff,0x2e,0x35,0x2e,0xff,0x2d,0x33,0x2d,0xff,0x22, 0x27,0x22,0xff,0x1d,0x22,0x1d,0xff,0x1c,0x22,0x1c,0xff,0x1a,0x1f,0x1a,0xff,0x1a, 0x21,0x1a,0xff,0x1d,0x22,0x1d,0xff,0x1d,0x21,0x1e,0xff,0x1b,0x1f,0x1a,0xff,0x23, 0x27,0x23,0xff,0x44,0x43,0x44,0xff,0x50,0x4a,0x52,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x4f,0xff,0x59,0x4e,0x58,0xff,0x6d,0x5a,0x6d,0xff,0x67,0x56,0x66,0xff,0x56, 0x4d,0x57,0xff,0x44,0x43,0x45,0xff,0x4b,0x46,0x4c,0xff,0x73,0x5d,0x6e,0xff,0x7c, 0x63,0x74,0xff,0x7b,0x5f,0x6e,0xff,0x7c,0x60,0x6b,0xff,0x68,0x59,0x6a,0xff,0x53, 0x4b,0x53,0xff,0x52,0x4b,0x52,0xff,0x48,0x45,0x49,0xff,0x40,0x40,0x40,0xff,0x3b, 0x3d,0x3c,0xff,0x37,0x3b,0x37,0xff,0x38,0x3b,0x38,0xff,0x2e,0x36,0x30,0xff,0x53, 0x4a,0x4f,0xff,0x61,0x52,0x5c,0xff,0x32,0x38,0x34,0xff,0x3a,0x3d,0x3b,0xff,0x28, 0x2e,0x28,0xff,0x36,0x30,0x35,0xff,0x3f,0x35,0x3e,0xff,0x21,0x24,0x21,0xff,0x24, 0x26,0x25,0xff,0x26,0x28,0x27,0xff,0x26,0x28,0x27,0xff,0x19,0x1a,0x19,0xff,0x35, 0x32,0x35,0xff,0x54,0x4d,0x55,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x52,0x4b,0x53,0xff,0x3b,0x3d,0x3c,0xff,0x49,0x46,0x4c,0xff,0x7f, 0x63,0x6e,0xff,0x68,0x56,0x5a,0xff,0x3c,0x3e,0x3d,0xff,0x4c,0x47,0x4e,0xff,0x5d, 0x51,0x5d,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x60,0xff,0x56,0x4d,0x59,0xff,0x5b, 0x4f,0x5b,0xff,0x5c,0x50,0x5d,0xff,0x5d,0x51,0x5e,0xff,0x49,0x45,0x4a,0xff,0x3b, 0x3e,0x3b,0xff,0x2b,0x2e,0x2b,0xff,0x21,0x24,0x21,0xff,0x20,0x24,0x20,0xff,0x1f, 0x23,0x1f,0xff,0x1e,0x21,0x1e,0xff,0x45,0x40,0x45,0xff,0x51,0x4a,0x52,0xff,0x4f, 0x49,0x50,0xff,0x50,0x4a,0x51,0xff,0x4f,0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x4f, 0x49,0x50,0xff,0x50,0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x53,0x4b,0x54,0xff,0x55, 0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x59,0x4f,0x59,0xff,0x5a,0x50,0x5c,0xff,0x5d, 0x51,0x5d,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x52,0x60,0xff,0x61,0x54,0x60,0xff,0x71, 0x5d,0x70,0xff,0x86,0x64,0x6c,0xff,0x33,0x37,0x2f,0xff,0x54,0x4c,0x55,0xff,0x48, 0x45,0x49,0xff,0x39,0x3c,0x3a,0xff,0x27,0x2b,0x28,0xff,0x21,0x25,0x21,0xff,0x19, 0x1b,0x19,0xff,0x02,0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x4b, 0x42,0x4c,0xff,0x59,0x4f,0x5a,0xff,0x5c,0x50,0x5c,0xff,0x5e,0x51,0x5e,0xff,0x62, 0x54,0x62,0xff,0x5e,0x52,0x5f,0xff,0x62,0x54,0x62,0xff,0x5e,0x52,0x5f,0xff,0x5c, 0x50,0x5d,0xff,0x5c,0x50,0x5c,0xff,0x22,0x2d,0x23,0xff,0x54,0x4c,0x55,0xff,0x59, 0x4f,0x5a,0xff,0x4d,0x47,0x4e,0xff,0x41,0x3d,0x41,0xff,0x54,0x4c,0x54,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x51,0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x51, 0x4a,0x51,0xfe,0x51,0x4a,0x51,0xfc,0x4f,0x49,0x50,0xf5,0x51,0x49,0x51,0xe6,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0xa8,0x09,0x07,0x09,0xd0,0x63,0x50,0x61,0xea,0x7e, 0x64,0x79,0xf7,0x7f,0x65,0x78,0xfd,0x74,0x5d,0x71,0xfe,0x61,0x54,0x61,0xff,0x4d, 0x47,0x4e,0xff,0x4f,0x49,0x4f,0xff,0x69,0x57,0x68,0xff,0x6b,0x59,0x6a,0xff,0x66, 0x56,0x65,0xff,0x44,0x43,0x46,0xff,0x62,0x54,0x5b,0xff,0x91,0x6e,0x6a,0xff,0x5e, 0x52,0x62,0xff,0x5d,0x51,0x5e,0xff,0x59,0x4f,0x5a,0xff,0x53,0x4b,0x54,0xff,0x51, 0x4a,0x52,0xff,0x51,0x4a,0x51,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4f, 0x4a,0x50,0xff,0x41,0x3d,0x42,0xff,0x18,0x16,0x18,0xff,0x1c,0x1b,0x1c,0xff,0x2a, 0x2a,0x2a,0xff,0x34,0x2d,0x35,0xff,0x35,0x2e,0x35,0xff,0x36,0x2e,0x35,0xff,0x3e, 0x31,0x3a,0xff,0x3e,0x32,0x3a,0xff,0x2f,0x29,0x2f,0xff,0x35,0x2c,0x35,0xff,0x34, 0x2c,0x34,0xff,0x32,0x2a,0x32,0xff,0x4b,0x3e,0x4a,0xff,0x73,0x5f,0x72,0xff,0x6f, 0x5c,0x6e,0xff,0x74,0x5e,0x72,0xff,0x67,0x57,0x66,0xff,0x51,0x4a,0x53,0xff,0x57, 0x4d,0x57,0xff,0x59,0x4f,0x59,0xff,0x59,0x4f,0x59,0xff,0x58,0x4e,0x58,0xff,0x57, 0x4e,0x58,0xff,0x56,0x4d,0x57,0xff,0x54,0x4b,0x55,0xff,0x4e,0x48,0x4f,0xff,0x4d, 0x48,0x4e,0xff,0x4c,0x47,0x4d,0xff,0x4a,0x46,0x4b,0xff,0x45,0x43,0x46,0xff,0x49, 0x45,0x4a,0xff,0x4e,0x48,0x4e,0xff,0x46,0x43,0x46,0xff,0x47,0x44,0x47,0xff,0x47, 0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x46, 0x44,0x46,0xff,0x4f,0x4b,0x50,0xfe,0x39,0x33,0x3a,0xfe,0x0b,0x08,0x0a,0xfd,0x1d, 0x18,0x1d,0xfd,0x43,0x38,0x43,0xfd,0x46,0x3a,0x46,0xfe,0x44,0x38,0x43,0xfe,0x45, 0x3a,0x45,0xfe,0x46,0x3a,0x46,0xff,0x47,0x3b,0x47,0xff,0x48,0x3b,0x47,0xff,0x4a, 0x3c,0x48,0xff,0x4a,0x3c,0x48,0xff,0x4a,0x3d,0x49,0xff,0x40,0x33,0x3f,0xff,0x3d, 0x31,0x3b,0xff,0x50,0x3f,0x4d,0xff,0x53,0x48,0x52,0xff,0x5a,0x50,0x5a,0xff,0x69, 0x58,0x69,0xff,0x5c,0x50,0x5b,0xff,0x63,0x54,0x62,0xff,0x56,0x4d,0x56,0xff,0x49, 0x46,0x4b,0xff,0x48,0x45,0x49,0xff,0x48,0x44,0x48,0xff,0x47,0x43,0x48,0xff,0x43, 0x42,0x44,0xff,0x3a,0x3d,0x3e,0xff,0x6d,0x56,0x5d,0xff,0x96,0x78,0x72,0xff,0x8f, 0x6f,0x6a,0xff,0x88,0x67,0x65,0xff,0x8d,0x6a,0x68,0xff,0x8e,0x6b,0x68,0xff,0x8f, 0x6d,0x69,0xff,0x91,0x70,0x69,0xff,0x91,0x70,0x69,0xff,0x90,0x6e,0x69,0xff,0x90, 0x6e,0x69,0xff,0x90,0x6e,0x69,0xff,0x8e,0x6c,0x69,0xff,0x8e,0x6b,0x68,0xff,0x8e, 0x6b,0x68,0xff,0x8c,0x69,0x68,0xff,0x89,0x67,0x67,0xff,0x88,0x66,0x67,0xff,0x87, 0x65,0x67,0xff,0x8c,0x6b,0x64,0xff,0xa2,0x81,0x78,0xff,0xac,0x8d,0x83,0xff,0xac, 0x8d,0x83,0xff,0xa9,0x8a,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa7, 0x87,0x7d,0xff,0xa6,0x86,0x7c,0xff,0xa5,0x84,0x7d,0xff,0x9c,0x77,0x6f,0xff,0xc2, 0xa9,0xa0,0xff,0xa8,0x87,0x7d,0xfe,0xa4,0x83,0x78,0xfd,0xa6,0x84,0x79,0xfa,0x9e, 0x7e,0x73,0xf1,0x31,0x27,0x23,0xe3,0x02,0x01,0x01,0xcc,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xa1,0x00, 0x00,0x00,0xc5,0x0c,0x0b,0x0c,0xe0,0x54,0x4a,0x54,0xf1,0x5b,0x51,0x5c,0xf9,0x5b, 0x50,0x5c,0xfe,0x59,0x4f,0x5a,0xfe,0x5b,0x50,0x5c,0xff,0x58,0x4f,0x59,0xff,0x56, 0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x52,0x4a,0x52,0xff,0x41,0x41,0x42,0xff,0x2f, 0x36,0x30,0xff,0x30,0x36,0x30,0xff,0x2f,0x36,0x30,0xff,0x2d,0x34,0x2e,0xff,0x2d, 0x34,0x2e,0xff,0x2e,0x35,0x2f,0xff,0x2b,0x31,0x2b,0xff,0x1c,0x21,0x1c,0xff,0x20, 0x24,0x21,0xff,0x2b,0x29,0x2a,0xff,0x22,0x25,0x23,0xff,0x1c,0x21,0x1d,0xff,0x1d, 0x22,0x1e,0xff,0x1c,0x21,0x1d,0xff,0x20,0x25,0x20,0xff,0x37,0x3a,0x37,0xff,0x50, 0x4b,0x51,0xff,0x4f,0x49,0x4f,0xff,0x51,0x4a,0x52,0xff,0x5f,0x53,0x5f,0xff,0x68, 0x58,0x68,0xff,0x56,0x4d,0x56,0xff,0x42,0x41,0x42,0xff,0x57,0x4d,0x54,0xff,0x72, 0x5d,0x71,0xff,0x59,0x4f,0x5a,0xff,0x5e,0x51,0x5f,0xff,0x60,0x52,0x5f,0xff,0x5f, 0x52,0x5f,0xff,0x5d,0x51,0x5e,0xff,0x5c,0x50,0x5d,0xff,0x50,0x49,0x51,0xff,0x3f, 0x3f,0x40,0xff,0x3c,0x3d,0x3d,0xff,0x3b,0x3d,0x3c,0xff,0x39,0x3c,0x3a,0xff,0x36, 0x3a,0x37,0xff,0x35,0x39,0x35,0xff,0x34,0x39,0x35,0xff,0x34,0x38,0x34,0xff,0x4a, 0x46,0x4a,0xff,0x54,0x4d,0x55,0xff,0x2e,0x32,0x2e,0xff,0x31,0x2f,0x31,0xff,0x46, 0x3b,0x46,0xff,0x2e,0x2c,0x2e,0xff,0x23,0x26,0x24,0xfe,0x26,0x28,0x27,0xfe,0x14, 0x15,0x14,0xfe,0x00,0x00,0x00,0xfe,0x25,0x23,0x25,0xff,0x4f,0x49,0x50,0xff,0x50, 0x4a,0x51,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x51,0x4a,0x52,0xff,0x47,0x45,0x48,0xff,0x2f, 0x36,0x30,0xff,0x2e,0x35,0x2f,0xff,0x34,0x39,0x35,0xff,0x34,0x39,0x35,0xff,0x3e, 0x3f,0x3f,0xff,0x54,0x4b,0x55,0xff,0x5c,0x51,0x5e,0xff,0x5d,0x51,0x5d,0xff,0x5e, 0x52,0x5e,0xff,0x5f,0x53,0x60,0xff,0x5a,0x4f,0x5c,0xff,0x5a,0x4f,0x5a,0xff,0x5d, 0x51,0x5e,0xff,0x4f,0x49,0x50,0xff,0x3c,0x3e,0x3d,0xff,0x2e,0x33,0x2f,0xff,0x24, 0x27,0x24,0xff,0x21,0x24,0x21,0xff,0x20,0x23,0x20,0xff,0x19,0x1d,0x19,0xff,0x43, 0x3f,0x44,0xff,0x51,0x4b,0x52,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x51, 0x4a,0x51,0xff,0x52,0x4b,0x52,0xff,0x53,0x4c,0x54,0xff,0x57,0x4e,0x57,0xff,0x59, 0x4f,0x59,0xff,0x5a,0x50,0x5c,0xff,0x5d,0x51,0x5d,0xff,0x5d,0x51,0x5d,0xff,0x5e, 0x52,0x5f,0xff,0x5d,0x51,0x5f,0xff,0x5d,0x51,0x5d,0xff,0x60,0x52,0x5e,0xff,0x58, 0x4e,0x59,0xff,0x52,0x4a,0x52,0xff,0x44,0x42,0x45,0xff,0x25,0x2e,0x26,0xff,0x0e, 0x19,0x11,0xff,0x11,0x19,0x13,0xff,0x12,0x14,0x12,0xff,0x02,0x02,0x02,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x42,0x3a,0x42,0xff,0x59,0x4f,0x5a,0xff,0x5b, 0x50,0x5c,0xff,0x5d,0x51,0x5d,0xff,0x5f,0x53,0x60,0xff,0x5b,0x50,0x5c,0xff,0x5d, 0x51,0x5d,0xff,0x5d,0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x5b,0x50,0x5c,0xff,0x48, 0x45,0x49,0xff,0x1f,0x2a,0x20,0xff,0x42,0x40,0x42,0xff,0x55,0x4c,0x56,0xff,0x33, 0x33,0x33,0xff,0x4f,0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xfe,0x51,0x4a,0x51,0xfc,0x4f, 0x49,0x50,0xf7,0x4a,0x44,0x4a,0xea,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xb0,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0xa3,0x07, 0x06,0x07,0xcd,0x52,0x42,0x51,0xe8,0x7f,0x65,0x7b,0xf6,0x7e,0x64,0x77,0xfc,0x70, 0x5d,0x6f,0xfe,0x65,0x56,0x65,0xff,0x64,0x54,0x64,0xff,0x44,0x42,0x44,0xff,0x31, 0x36,0x32,0xff,0x43,0x42,0x44,0xff,0x42,0x41,0x43,0xff,0x25,0x2f,0x26,0xff,0x68, 0x56,0x62,0xff,0x88,0x65,0x6a,0xff,0x5e,0x52,0x61,0xff,0x5d,0x51,0x5d,0xff,0x57, 0x4d,0x57,0xff,0x53,0x4c,0x54,0xff,0x53,0x4b,0x52,0xff,0x50,0x4a,0x51,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x4f,0xff,0x4f, 0x49,0x4f,0xff,0x4c,0x48,0x4d,0xff,0x4f,0x4a,0x4f,0xff,0x3f,0x3a,0x3f,0xff,0x06, 0x04,0x05,0xfe,0x05,0x06,0x05,0xfe,0x29,0x29,0x29,0xfe,0x36,0x2f,0x36,0xfe,0x35, 0x2d,0x35,0xfe,0x31,0x2b,0x31,0xff,0x26,0x25,0x27,0xff,0x20,0x20,0x20,0xff,0x27, 0x25,0x27,0xff,0x36,0x2d,0x36,0xff,0x34,0x2b,0x33,0xff,0x32,0x29,0x31,0xff,0x4b, 0x3e,0x4a,0xff,0x71,0x5e,0x70,0xff,0x6e,0x5b,0x6d,0xff,0x6e,0x5a,0x6d,0xff,0x60, 0x53,0x60,0xff,0x52,0x4b,0x53,0xff,0x56,0x4d,0x56,0xff,0x58,0x4e,0x58,0xff,0x56, 0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x54,0x4c,0x55,0xff,0x52,0x4b,0x52,0xff,0x50, 0x4a,0x51,0xff,0x4e,0x49,0x4f,0xff,0x4d,0x48,0x4d,0xff,0x4b,0x47,0x4c,0xff,0x4b, 0x47,0x4c,0xff,0x3b,0x3d,0x3c,0xff,0x38,0x3b,0x39,0xff,0x4d,0x47,0x4d,0xff,0x49, 0x45,0x49,0xff,0x46,0x43,0x46,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47, 0x44,0x47,0xff,0x47,0x44,0x47,0xfe,0x46,0x43,0x45,0xfe,0x57,0x4f,0x58,0xfe,0x2c, 0x25,0x2c,0xfc,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xf9,0x1d,0x17,0x1d,0xf9,0x36, 0x30,0x36,0xf9,0x42,0x39,0x42,0xfb,0x4b,0x3e,0x4b,0xfd,0x49,0x3c,0x48,0xfd,0x48, 0x3a,0x47,0xfe,0x48,0x3b,0x47,0xfe,0x46,0x3a,0x45,0xff,0x41,0x35,0x40,0xff,0x3f, 0x34,0x3e,0xff,0x40,0x33,0x3f,0xff,0x49,0x3a,0x46,0xff,0x49,0x3b,0x47,0xff,0x3c, 0x35,0x3b,0xff,0x3d,0x3c,0x3e,0xff,0x3e,0x3e,0x39,0xff,0x5a,0x4e,0x57,0xff,0x65, 0x56,0x65,0xff,0x51,0x4a,0x51,0xff,0x48,0x45,0x49,0xff,0x47,0x44,0x47,0xff,0x47, 0x44,0x47,0xff,0x46,0x44,0x47,0xff,0x42,0x42,0x43,0xff,0x3d,0x3e,0x3e,0xff,0x59, 0x4a,0x5b,0xff,0xb9,0xa3,0xa4,0xff,0xd1,0xbb,0xb3,0xff,0xb9,0x9d,0x95,0xff,0xb1, 0x93,0x89,0xff,0xb1,0x94,0x89,0xff,0xb1,0x94,0x89,0xff,0xb1,0x94,0x89,0xff,0xb1, 0x94,0x89,0xff,0xb0,0x92,0x88,0xff,0xb0,0x92,0x88,0xff,0xb0,0x92,0x87,0xff,0xb0, 0x92,0x87,0xff,0xb0,0x91,0x87,0xff,0xb0,0x91,0x86,0xff,0xaf,0x90,0x86,0xff,0xae, 0x8f,0x84,0xff,0xae,0x8f,0x84,0xff,0xae,0x8f,0x84,0xff,0xad,0x8d,0x83,0xff,0xad, 0x8e,0x84,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xa9,0x8a,0x80,0xff,0xa9, 0x8a,0x7f,0xff,0xa8,0x88,0x7e,0xff,0xa8,0x88,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xaa, 0x8a,0x7e,0xff,0x89,0x68,0x6e,0xff,0xbe,0xa7,0xa0,0xff,0xa8,0x87,0x7d,0xff,0xa4, 0x83,0x78,0xfe,0xa3,0x82,0x77,0xfc,0xa5,0x84,0x79,0xf9,0x96,0x78,0x6e,0xef,0x17, 0x12,0x11,0xdd,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x02,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,0x02,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0xae,0x02,0x02,0x02,0xcf,0x26, 0x22,0x27,0xe7,0x5e,0x53,0x5f,0xf4,0x5a,0x4f,0x5b,0xfb,0x5b,0x50,0x5c,0xfe,0x59, 0x4f,0x59,0xff,0x59,0x4f,0x5a,0xff,0x58,0x4e,0x58,0xff,0x56,0x4d,0x56,0xff,0x54, 0x4c,0x54,0xff,0x4d,0x47,0x4d,0xff,0x30,0x37,0x32,0xff,0x30,0x36,0x31,0xff,0x2e, 0x35,0x2f,0xff,0x2d,0x34,0x2e,0xff,0x2d,0x34,0x2e,0xff,0x2d,0x34,0x2e,0xff,0x2c, 0x33,0x2d,0xff,0x24,0x2a,0x24,0xff,0x1a,0x20,0x1b,0xff,0x26,0x27,0x25,0xff,0x3c, 0x34,0x3a,0xff,0x19,0x20,0x1a,0xff,0x1d,0x22,0x1e,0xff,0x1d,0x22,0x1e,0xff,0x1e, 0x23,0x1f,0xff,0x2d,0x30,0x2d,0xff,0x44,0x43,0x44,0xff,0x4e,0x48,0x4f,0xff,0x51, 0x4a,0x52,0xff,0x54,0x4c,0x54,0xff,0x41,0x40,0x42,0xff,0x39,0x3c,0x3b,0xff,0x57, 0x4d,0x53,0xff,0x87,0x68,0x7d,0xff,0x65,0x55,0x65,0xff,0x56,0x4d,0x56,0xff,0x59, 0x4f,0x5a,0xff,0x58,0x4f,0x5a,0xff,0x58,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5a, 0x50,0x5b,0xff,0x55,0x4d,0x55,0xff,0x45,0x43,0x45,0xff,0x3b,0x3d,0x3c,0xff,0x3a, 0x3d,0x3b,0xff,0x36,0x3a,0x37,0xff,0x33,0x38,0x34,0xff,0x32,0x38,0x33,0xff,0x30, 0x36,0x31,0xff,0x31,0x37,0x32,0xff,0x37,0x3b,0x38,0xff,0x56,0x4e,0x56,0xff,0x42, 0x3f,0x42,0xff,0x2e,0x2d,0x2e,0xff,0x53,0x40,0x51,0xff,0x38,0x32,0x38,0xfe,0x23, 0x26,0x24,0xfc,0x14,0x15,0x15,0xfc,0x01,0x01,0x01,0xfc,0x00,0x00,0x00,0xfc,0x19, 0x19,0x1a,0xfe,0x47,0x43,0x48,0xfe,0x50,0x4a,0x51,0xff,0x4d,0x48,0x4e,0xff,0x4d, 0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4f, 0x4a,0x50,0xff,0x49,0x46,0x4b,0xff,0x26,0x30,0x27,0xff,0x39,0x3b,0x39,0xff,0x54, 0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x57,0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x58, 0x4f,0x59,0xff,0x5a,0x50,0x5b,0xff,0x5c,0x51,0x5d,0xff,0x5f,0x52,0x60,0xff,0x57, 0x4e,0x58,0xff,0x54,0x4b,0x53,0xff,0x59,0x4f,0x5a,0xff,0x54,0x4d,0x55,0xff,0x3f, 0x40,0x3f,0xff,0x35,0x3a,0x35,0xff,0x26,0x29,0x26,0xff,0x1f,0x23,0x1f,0xff,0x21, 0x25,0x21,0xff,0x19,0x1d,0x19,0xff,0x3a,0x36,0x3b,0xff,0x4e,0x48,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4e,0x49,0x4f,0xff,0x4e,0x49,0x4f,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x52,0x4b,0x52,0xff,0x54, 0x4c,0x54,0xff,0x55,0x4d,0x56,0xff,0x58,0x4f,0x59,0xff,0x5b,0x50,0x5c,0xff,0x5b, 0x50,0x5c,0xff,0x5d,0x51,0x5d,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5d, 0x51,0x5d,0xff,0x5d,0x51,0x5d,0xff,0x60,0x54,0x61,0xff,0x21,0x2a,0x22,0xff,0x30, 0x36,0x30,0xff,0x17,0x23,0x1a,0xff,0x0d,0x18,0x11,0xff,0x19,0x22,0x1a,0xff,0x0f, 0x11,0x0f,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x39, 0x33,0x3a,0xff,0x53,0x4c,0x54,0xff,0x5a,0x50,0x5b,0xff,0x5f,0x52,0x5f,0xff,0x5a, 0x4f,0x5b,0xff,0x55,0x4d,0x56,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x51,0x5d,0xff,0x5c, 0x50,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x68,0x57,0x67,0xff,0x25,0x2b,0x27,0xff,0x27, 0x30,0x27,0xff,0x4c,0x47,0x4c,0xff,0x25,0x2a,0x25,0xff,0x50,0x4a,0x51,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4e,0x49,0x50,0xfd,0x4f,0x49,0x50,0xf9,0x48,0x43,0x49,0xf0,0x00, 0x00,0x00,0xde,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0xa0,0x05,0x04,0x05,0xca,0x43,0x36,0x41,0xe6,0x7e, 0x65,0x7b,0xf5,0x7d,0x63,0x77,0xfc,0x6c,0x5a,0x6b,0xfe,0x61,0x54,0x61,0xff,0x66, 0x56,0x66,0xff,0x6b,0x58,0x69,0xff,0x6a,0x58,0x69,0xff,0x61,0x55,0x62,0xff,0x45, 0x42,0x46,0xff,0x1d,0x28,0x1e,0xff,0x41,0x41,0x41,0xff,0x75,0x5f,0x74,0xff,0x5c, 0x51,0x5d,0xff,0x5a,0x4f,0x5b,0xff,0x55,0x4c,0x56,0xff,0x52,0x4b,0x52,0xff,0x50, 0x4a,0x51,0xff,0x4e,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4d, 0x48,0x4e,0xff,0x4d,0x47,0x4d,0xff,0x4c,0x47,0x4c,0xff,0x4d,0x48,0x4e,0xff,0x4f, 0x4a,0x4f,0xff,0x3a,0x36,0x3a,0xfe,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0xfc,0x09, 0x08,0x09,0xfc,0x2d,0x27,0x2d,0xfc,0x38,0x31,0x38,0xfd,0x31,0x2b,0x31,0xfe,0x1f, 0x21,0x20,0xfe,0x14,0x19,0x15,0xff,0x29,0x26,0x2a,0xff,0x34,0x2b,0x33,0xff,0x34, 0x2b,0x33,0xff,0x34,0x2b,0x33,0xff,0x4e,0x41,0x4d,0xff,0x70,0x5d,0x6f,0xff,0x6f, 0x5b,0x6e,0xff,0x6a,0x58,0x69,0xff,0x57,0x4d,0x57,0xff,0x53,0x4b,0x54,0xff,0x55, 0x4c,0x56,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x54, 0x4c,0x55,0xff,0x52,0x4b,0x52,0xff,0x4e,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4d, 0x48,0x4d,0xff,0x4b,0x47,0x4c,0xff,0x4b,0x47,0x4c,0xff,0x3b,0x3e,0x3c,0xff,0x36, 0x3a,0x36,0xff,0x49,0x45,0x4a,0xff,0x4d,0x48,0x4e,0xff,0x4a,0x46,0x49,0xff,0x47, 0x44,0x47,0xff,0x46,0x43,0x46,0xff,0x46,0x43,0x46,0xff,0x47,0x44,0x47,0xff,0x48, 0x46,0x48,0xfd,0x49,0x41,0x48,0xfa,0x1d,0x17,0x1c,0xf6,0x00,0x00,0x00,0xf2,0x00, 0x00,0x00,0xef,0x00,0x00,0x00,0xee,0x18,0x15,0x18,0xef,0x35,0x2c,0x35,0xf2,0x3a, 0x30,0x39,0xf6,0x46,0x3a,0x45,0xf8,0x4a,0x3d,0x49,0xfb,0x40,0x35,0x40,0xfd,0x3d, 0x32,0x3c,0xfe,0x3f,0x32,0x3e,0xff,0x3d,0x31,0x3c,0xff,0x3b,0x31,0x3a,0xff,0x39, 0x34,0x3a,0xff,0x2f,0x2e,0x30,0xff,0x2a,0x29,0x2a,0xff,0x4a,0x42,0x4d,0xff,0x76, 0x5a,0x61,0xff,0x81,0x63,0x74,0xff,0x5c,0x51,0x5d,0xff,0x49,0x45,0x4a,0xff,0x48, 0x45,0x4a,0xff,0x47,0x44,0x48,0xff,0x47,0x44,0x46,0xff,0x44,0x43,0x45,0xff,0x40, 0x41,0x41,0xff,0x46,0x44,0x47,0xff,0x55,0x4e,0x59,0xff,0x70,0x54,0x5c,0xff,0xc1, 0xaa,0xa4,0xff,0xc6,0xaf,0xa5,0xff,0xb2,0x96,0x8d,0xff,0xb0,0x93,0x8a,0xff,0xb1, 0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb1,0x96,0x8c,0xff,0xb0, 0x95,0x8b,0xff,0xaf,0x92,0x88,0xff,0xaf,0x93,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x92,0x87,0xff,0xae,0x90,0x86,0xff,0xad,0x8f,0x84,0xff,0xad, 0x90,0x84,0xff,0xad,0x8e,0x84,0xff,0xac,0x8d,0x83,0xff,0xac,0x8d,0x83,0xff,0xaa, 0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xa9,0x8a,0x7f,0xff,0xa8, 0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x88,0x7d,0xff,0x97,0x72,0x68,0xff,0xb1, 0x93,0x8a,0xff,0xa6,0x86,0x7c,0xff,0xa4,0x83,0x78,0xff,0xa3,0x82,0x77,0xfe,0xa2, 0x81,0x76,0xfc,0xa6,0x84,0x79,0xf6,0x71,0x5a,0x52,0xea,0x05,0x04,0x04,0xd3,0x00, 0x00,0x00,0xb0,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x6b,0x00, 0x00,0x00,0x95,0x00,0x00,0x00,0xbb,0x08,0x07,0x08,0xd9,0x46,0x3e,0x46,0xec,0x5e, 0x53,0x60,0xf8,0x5b,0x50,0x5c,0xfd,0x59,0x4e,0x59,0xfe,0x58,0x4e,0x58,0xff,0x56, 0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x53,0x4b,0x54,0xff,0x50,0x49,0x50,0xff,0x3c, 0x3d,0x3b,0xff,0x31,0x37,0x30,0xff,0x2e,0x35,0x2e,0xff,0x2d,0x34,0x2d,0xff,0x2d, 0x34,0x2d,0xff,0x2d,0x34,0x2d,0xff,0x2e,0x35,0x2f,0xff,0x2b,0x31,0x2b,0xff,0x1b, 0x21,0x1b,0xff,0x1b,0x22,0x1b,0xff,0x1b,0x21,0x1b,0xff,0x1d,0x22,0x1e,0xff,0x1d, 0x22,0x1e,0xff,0x1e,0x23,0x1f,0xff,0x1a,0x1e,0x1b,0xff,0x15,0x18,0x16,0xff,0x34, 0x37,0x35,0xff,0x4f,0x4a,0x50,0xff,0x4a,0x46,0x4a,0xff,0x41,0x40,0x41,0xff,0x4c, 0x46,0x4b,0xff,0x5b,0x4f,0x5a,0xff,0x60,0x53,0x60,0xff,0x66,0x57,0x66,0xff,0x52, 0x4b,0x53,0xff,0x58,0x4f,0x59,0xff,0x59,0x4f,0x59,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x59,0xff,0x59,0x4e,0x58,0xff,0x4b, 0x46,0x4b,0xff,0x39,0x3c,0x39,0xff,0x39,0x3b,0x39,0xff,0x35,0x39,0x36,0xff,0x34, 0x39,0x35,0xff,0x33,0x39,0x34,0xff,0x32,0x38,0x33,0xff,0x33,0x38,0x33,0xff,0x35, 0x39,0x35,0xff,0x36,0x3a,0x36,0xff,0x23,0x2d,0x23,0xff,0x30,0x2f,0x30,0xfe,0x50, 0x3f,0x50,0xfc,0x35,0x31,0x35,0xfa,0x13,0x16,0x13,0xf7,0x03,0x03,0x03,0xf5,0x00, 0x00,0x00,0xf5,0x00,0x00,0x00,0xf6,0x0d,0x0d,0x0d,0xf9,0x3b,0x38,0x3c,0xfc,0x50, 0x4b,0x51,0xfe,0x4c,0x47,0x4c,0xff,0x4d,0x48,0x4d,0xff,0x4d,0x48,0x4d,0xff,0x4c, 0x47,0x4c,0xff,0x4d,0x48,0x4d,0xff,0x4c,0x47,0x4c,0xff,0x51,0x4a,0x52,0xff,0x2b, 0x33,0x2c,0xff,0x4c,0x45,0x4c,0xff,0x5f,0x52,0x5f,0xff,0x4e,0x49,0x4f,0xff,0x53, 0x4b,0x52,0xff,0x56,0x4d,0x56,0xff,0x57,0x4d,0x57,0xff,0x59,0x4f,0x5b,0xff,0x5a, 0x50,0x5b,0xff,0x61,0x53,0x62,0xff,0x3c,0x3e,0x3c,0xff,0x4b,0x47,0x4c,0xff,0x5d, 0x51,0x5d,0xff,0x59,0x4f,0x59,0xff,0x41,0x41,0x41,0xff,0x36,0x3b,0x37,0xff,0x27, 0x2b,0x28,0xff,0x20,0x23,0x20,0xff,0x20,0x24,0x20,0xff,0x1d,0x21,0x1d,0xff,0x27, 0x28,0x27,0xff,0x46,0x42,0x46,0xff,0x4e,0x49,0x4e,0xff,0x4e,0x48,0x4f,0xff,0x4c, 0x47,0x4d,0xff,0x4d,0x48,0x4c,0xff,0x4e,0x48,0x4e,0xff,0x50,0x49,0x50,0xff,0x4e, 0x49,0x4f,0xff,0x51,0x4a,0x51,0xff,0x53,0x4b,0x53,0xff,0x54,0x4c,0x55,0xff,0x57, 0x4e,0x57,0xff,0x5a,0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x5b,0x50,0x5c,0xff,0x5e, 0x52,0x5e,0xff,0x5d,0x51,0x5e,0xff,0x5d,0x51,0x5d,0xff,0x5d,0x51,0x5d,0xff,0x62, 0x55,0x62,0xff,0x12,0x1d,0x15,0xff,0x3f,0x3e,0x45,0xff,0x55,0x4b,0x4e,0xff,0x3a, 0x3c,0x39,0xff,0x39,0x3d,0x39,0xff,0x0c,0x0d,0x0c,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x33,0x2e,0x33,0xff,0x3f,0x3f,0x40,0xff,0x58, 0x4f,0x5a,0xff,0x55,0x4d,0x55,0xff,0x4e,0x48,0x4e,0xff,0x51,0x4b,0x51,0xff,0x5d, 0x52,0x5e,0xff,0x5d,0x51,0x5d,0xff,0x5c,0x50,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x57, 0x4d,0x57,0xff,0x5d,0x51,0x5e,0xff,0x40,0x40,0x40,0xff,0x4f,0x4a,0x50,0xff,0x18, 0x20,0x19,0xff,0x4b,0x45,0x4c,0xff,0x4e,0x49,0x4f,0xff,0x4e,0x49,0x50,0xff,0x4e, 0x49,0x4f,0xff,0x4e,0x49,0x4f,0xff,0x4e,0x49,0x4f,0xff,0x50,0x4a,0x51,0xfe,0x4d, 0x48,0x4f,0xfc,0x46,0x41,0x47,0xf6,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xd5,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x9e,0x03, 0x03,0x03,0xc7,0x32,0x28,0x31,0xe5,0x7e,0x66,0x7b,0xf4,0x79,0x61,0x76,0xfc,0x66, 0x56,0x65,0xfe,0x60,0x53,0x60,0xff,0x66,0x56,0x66,0xff,0x68,0x57,0x67,0xff,0x6a, 0x58,0x69,0xff,0x6c,0x58,0x6b,0xff,0x66,0x56,0x65,0xff,0x40,0x41,0x40,0xff,0x34, 0x39,0x34,0xff,0x65,0x56,0x68,0xff,0x5c,0x50,0x5c,0xff,0x58,0x4e,0x58,0xff,0x55, 0x4c,0x56,0xff,0x52,0x4a,0x52,0xff,0x4e,0x49,0x4f,0xff,0x4e,0x48,0x4f,0xff,0x4d, 0x48,0x4d,0xff,0x4b,0x46,0x4b,0xff,0x49,0x45,0x4a,0xff,0x4b,0x47,0x4b,0xff,0x4f, 0x49,0x4f,0xff,0x4f,0x49,0x4f,0xff,0x4e,0x48,0x4e,0xfd,0x33,0x30,0x33,0xfb,0x00, 0x00,0x00,0xf9,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xf5,0x0d,0x0c,0x0d,0xf5,0x33, 0x2c,0x33,0xf8,0x30,0x2c,0x30,0xfb,0x14,0x1a,0x14,0xfd,0x18,0x1b,0x18,0xff,0x28, 0x24,0x28,0xff,0x30,0x28,0x30,0xff,0x32,0x2a,0x32,0xff,0x3a,0x31,0x3a,0xff,0x5a, 0x4a,0x59,0xff,0x70,0x5d,0x6f,0xff,0x70,0x5c,0x6f,0xff,0x66,0x56,0x65,0xff,0x53, 0x4b,0x54,0xff,0x54,0x4c,0x56,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x56, 0x4d,0x57,0xff,0x54,0x4c,0x55,0xff,0x53,0x4b,0x52,0xff,0x51,0x4a,0x51,0xff,0x4e, 0x48,0x4f,0xff,0x4d,0x48,0x4d,0xff,0x4b,0x46,0x4b,0xff,0x49,0x46,0x4b,0xff,0x48, 0x46,0x4a,0xff,0x4a,0x46,0x4a,0xff,0x3c,0x3d,0x3c,0xff,0x31,0x36,0x30,0xff,0x54, 0x4b,0x53,0xff,0x59,0x4f,0x59,0xff,0x43,0x42,0x44,0xff,0x45,0x43,0x46,0xff,0x46, 0x44,0x47,0xff,0x45,0x43,0x46,0xfd,0x4f,0x4b,0x50,0xfa,0x32,0x2d,0x33,0xf4,0x05, 0x04,0x05,0xea,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xd7,0x00, 0x00,0x00,0xda,0x00,0x00,0x00,0xdf,0x03,0x03,0x03,0xe6,0x20,0x1a,0x20,0xed,0x3a, 0x30,0x3a,0xf3,0x3e,0x33,0x3d,0xf8,0x3e,0x34,0x3e,0xfa,0x46,0x3c,0x46,0xfd,0x41, 0x3b,0x41,0xff,0x2f,0x2f,0x30,0xff,0x32,0x2f,0x31,0xff,0x49,0x3c,0x47,0xff,0x51, 0x40,0x4e,0xff,0x52,0x42,0x4f,0xff,0x4d,0x3f,0x4c,0xff,0x64,0x52,0x63,0xff,0x57, 0x4e,0x56,0xff,0x48,0x45,0x4a,0xff,0x48,0x45,0x49,0xff,0x47,0x44,0x47,0xff,0x44, 0x42,0x45,0xff,0x41,0x41,0x42,0xff,0x3e,0x40,0x40,0xff,0x51,0x49,0x51,0xff,0x5d, 0x51,0x5c,0xff,0x56,0x4c,0x5b,0xff,0x7f,0x68,0x69,0xff,0xbd,0xa5,0x9b,0xff,0xb9, 0x9f,0x95,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb1, 0x95,0x8b,0xff,0xb1,0x95,0x8b,0xff,0xaf,0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf,0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xae, 0x90,0x86,0xff,0xae,0x90,0x85,0xff,0xad,0x8f,0x84,0xff,0xad,0x8f,0x84,0xff,0xac, 0x8e,0x83,0xff,0xac,0x8e,0x83,0xff,0xab,0x8c,0x82,0xff,0xaa,0x8b,0x81,0xff,0xaa, 0x8b,0x81,0xff,0xaa,0x8b,0x81,0xff,0xa8,0x89,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xaa, 0x8b,0x80,0xff,0x90,0x69,0x67,0xff,0xa9,0x88,0x7f,0xff,0xa9,0x88,0x7e,0xff,0xa5, 0x84,0x7a,0xff,0xa5,0x84,0x7a,0xfe,0xa2,0x81,0x76,0xfd,0xa2,0x81,0x76,0xfa,0xa7, 0x84,0x7a,0xef,0x23,0x1b,0x1a,0xdc,0x01,0x01,0x01,0xbb,0x00,0x00,0x00,0x8e,0x00, 0x00,0x00,0x60,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xa2,0x01, 0x00,0x01,0xc7,0x16,0x13,0x16,0xe2,0x58,0x4f,0x59,0xf2,0x5a,0x4f,0x5a,0xfa,0x58, 0x4e,0x59,0xfe,0x58,0x4e,0x58,0xff,0x56,0x4d,0x57,0xff,0x57,0x4e,0x58,0xff,0x53, 0x4c,0x53,0xff,0x51,0x4a,0x51,0xff,0x4b,0x46,0x4a,0xff,0x30,0x37,0x32,0xff,0x2e, 0x34,0x2f,0xff,0x2c,0x34,0x2d,0xff,0x2c,0x34,0x2c,0xff,0x2c,0x34,0x2c,0xff,0x2d, 0x34,0x2d,0xff,0x2a,0x33,0x2c,0xff,0x21,0x29,0x22,0xff,0x1b,0x21,0x1b,0xff,0x1c, 0x21,0x1d,0xff,0x1e,0x23,0x1e,0xfe,0x1e,0x23,0x1f,0xfe,0x1d,0x21,0x1e,0xfd,0x09, 0x0b,0x0a,0xfc,0x00,0x00,0x00,0xfc,0x1f,0x21,0x1f,0xfd,0x4a,0x49,0x4a,0xfe,0x47, 0x44,0x47,0xff,0x46,0x43,0x46,0xff,0x6d,0x5a,0x6c,0xff,0x64,0x55,0x63,0xff,0x4d, 0x48,0x4e,0xff,0x51,0x4a,0x52,0xff,0x56,0x4d,0x57,0xff,0x57,0x4d,0x59,0xff,0x58, 0x4e,0x5a,0xff,0x58,0x4f,0x5a,0xff,0x59,0x4f,0x59,0xff,0x5a,0x4f,0x5a,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x59,0xff,0x50,0x4a,0x51,0xff,0x3d,0x3f,0x3f,0xff,0x38, 0x3b,0x39,0xff,0x36,0x39,0x36,0xff,0x35,0x39,0x36,0xff,0x36,0x3a,0x37,0xff,0x35, 0x39,0x35,0xff,0x33,0x38,0x33,0xff,0x34,0x39,0x35,0xff,0x37,0x3c,0x38,0xff,0x1f, 0x28,0x20,0xfd,0x1c,0x23,0x1e,0xfb,0x3d,0x38,0x3f,0xf9,0x23,0x1f,0x24,0xf3,0x01, 0x03,0x01,0xec,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0xf1,0x2f,0x2c,0x2f,0xf7,0x52,0x4c,0x52,0xfc,0x4c,0x47,0x4c,0xfe,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c, 0x47,0x4c,0xff,0x4f,0x49,0x4f,0xff,0x33,0x38,0x33,0xff,0x52,0x4a,0x52,0xff,0x5d, 0x51,0x5e,0xff,0x4e,0x48,0x4f,0xff,0x52,0x4b,0x52,0xff,0x54,0x4c,0x54,0xff,0x55, 0x4c,0x56,0xff,0x57,0x4e,0x58,0xff,0x5a,0x50,0x5b,0xff,0x56,0x4d,0x57,0xff,0x43, 0x42,0x45,0xff,0x50,0x4a,0x52,0xff,0x5a,0x4f,0x5b,0xff,0x5a,0x50,0x5b,0xff,0x46, 0x44,0x46,0xff,0x36,0x3b,0x36,0xff,0x27,0x2a,0x27,0xff,0x1f,0x23,0x1f,0xff,0x20, 0x24,0x20,0xff,0x1f,0x23,0x1f,0xff,0x20,0x22,0x20,0xff,0x42,0x3f,0x42,0xff,0x4d, 0x48,0x4d,0xff,0x4e,0x48,0x4f,0xff,0x4d,0x47,0x4d,0xff,0x4c,0x47,0x4c,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4d,0xff,0x4d,0x48,0x4e,0xff,0x4e,0x49,0x4f,0xff,0x50, 0x4a,0x51,0xff,0x52,0x4b,0x52,0xff,0x55,0x4d,0x55,0xff,0x56,0x4d,0x57,0xff,0x58, 0x4e,0x58,0xff,0x59,0x4f,0x59,0xff,0x5d,0x51,0x5d,0xff,0x59,0x4f,0x5a,0xff,0x5a, 0x50,0x5b,0xff,0x5b,0x51,0x5c,0xff,0x55,0x4d,0x55,0xff,0x00,0x09,0x03,0xff,0x68, 0x58,0x59,0xff,0x88,0x68,0x78,0xff,0x3f,0x3f,0x3d,0xff,0x33,0x38,0x33,0xff,0x05, 0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x2c, 0x26,0x2c,0xff,0x46,0x43,0x46,0xff,0x52,0x4b,0x53,0xff,0x4b,0x47,0x4d,0xff,0x57, 0x4d,0x58,0xff,0x5c,0x51,0x5d,0xff,0x5b,0x50,0x5c,0xff,0x5b,0x50,0x5c,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x55,0x4d,0x56,0xff,0x55,0x4c,0x56,0xff,0x57, 0x4e,0x58,0xff,0x58,0x4e,0x58,0xff,0x26,0x27,0x26,0xff,0x42,0x3d,0x43,0xff,0x4d, 0x48,0x4e,0xff,0x4c,0x48,0x4d,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4d, 0x48,0x4e,0xff,0x5d,0x54,0x5a,0xfe,0x51,0x4b,0x51,0xfd,0x53,0x4c,0x52,0xfa,0x14, 0x11,0x11,0xf3,0x13,0x10,0x10,0xe5,0x04,0x03,0x03,0xcf,0x00,0x00,0x00,0xb0,0x00, 0x00,0x00,0x8c,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x76,0x00,0x00,0x00,0x9c,0x01,0x01,0x01,0xc5,0x22,0x1c,0x21,0xe2,0x80, 0x67,0x7c,0xf3,0x79,0x61,0x76,0xfb,0x5e,0x52,0x5e,0xfe,0x61,0x53,0x61,0xff,0x64, 0x56,0x64,0xff,0x65,0x56,0x65,0xff,0x69,0x57,0x67,0xff,0x6a,0x58,0x69,0xff,0x65, 0x55,0x65,0xff,0x4c,0x47,0x4c,0xff,0x45,0x43,0x45,0xff,0x6f,0x5a,0x66,0xff,0x58, 0x4f,0x5a,0xff,0x56,0x4d,0x57,0xff,0x54,0x4c,0x55,0xff,0x51,0x4a,0x51,0xff,0x4c, 0x47,0x4d,0xff,0x48,0x45,0x4a,0xff,0x44,0x43,0x44,0xff,0x4b,0x46,0x4c,0xff,0x44, 0x42,0x45,0xff,0x37,0x3b,0x39,0xff,0x37,0x3a,0x37,0xff,0x43,0x42,0x43,0xfe,0x4d, 0x47,0x4d,0xfb,0x2a,0x26,0x2a,0xf7,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0xe7,0x00,0x00,0x00,0xe9,0x14,0x11,0x14,0xee,0x30,0x2c,0x30,0xf4,0x18, 0x21,0x19,0xf9,0x1e,0x22,0x1f,0xfc,0x2c,0x28,0x2c,0xff,0x29,0x26,0x2a,0xff,0x2c, 0x26,0x2d,0xff,0x45,0x39,0x45,0xff,0x6d,0x5a,0x6c,0xff,0x6e,0x5b,0x6d,0xff,0x6f, 0x5b,0x6e,0xff,0x62,0x54,0x63,0xff,0x51,0x4b,0x52,0xff,0x55,0x4c,0x56,0xff,0x56, 0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x54,0x4d,0x55,0xff,0x55,0x4d,0x56,0xff,0x54, 0x4c,0x54,0xff,0x4f,0x49,0x4f,0xff,0x4e,0x49,0x4e,0xff,0x4c,0x48,0x4c,0xff,0x4b, 0x47,0x4c,0xff,0x48,0x45,0x4a,0xff,0x47,0x45,0x48,0xff,0x48,0x45,0x48,0xff,0x41, 0x41,0x42,0xff,0x2c,0x34,0x2d,0xff,0x41,0x40,0x42,0xff,0x54,0x4c,0x55,0xff,0x43, 0x42,0x44,0xff,0x45,0x43,0x46,0xff,0x45,0x43,0x46,0xfe,0x45,0x43,0x46,0xfc,0x50, 0x49,0x50,0xf5,0x23,0x1f,0x23,0xea,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0xc6,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xbc,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0xd5,0x10,0x0c,0x10,0xe2,0x1e,0x17,0x1d,0xed,0x1d, 0x18,0x1c,0xf4,0x27,0x24,0x27,0xfa,0x3e,0x3e,0x3e,0xfd,0x49,0x41,0x49,0xff,0x54, 0x41,0x4e,0xff,0x53,0x42,0x4e,0xff,0x4d,0x3e,0x4b,0xff,0x49,0x3c,0x48,0xff,0x4d, 0x3e,0x4b,0xff,0x53,0x48,0x53,0xff,0x4d,0x48,0x4e,0xff,0x48,0x45,0x49,0xff,0x46, 0x44,0x47,0xff,0x44,0x43,0x44,0xff,0x43,0x42,0x44,0xff,0x41,0x41,0x42,0xff,0x45, 0x43,0x46,0xff,0x59,0x4f,0x5a,0xff,0x5e,0x52,0x5e,0xff,0x5d,0x51,0x5e,0xff,0x55, 0x4a,0x5a,0xff,0x8d,0x78,0x80,0xff,0xbe,0xa6,0xa1,0xff,0xb6,0x9a,0x91,0xff,0xb0, 0x93,0x89,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xaf, 0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xb0,0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xae,0x90,0x86,0xff,0xad, 0x8f,0x85,0xff,0xae,0x90,0x85,0xff,0xad,0x8e,0x84,0xff,0xb1,0x92,0x85,0xff,0xb0, 0x91,0x85,0xff,0xaf,0x90,0x85,0xff,0xab,0x8d,0x83,0xff,0xad,0x8e,0x83,0xff,0xaf, 0x8f,0x81,0xff,0xae,0x8d,0x80,0xff,0xa5,0x83,0x77,0xff,0x83,0x61,0x6e,0xff,0xa4, 0x84,0x7b,0xff,0xaa,0x8b,0x81,0xff,0xa5,0x85,0x7b,0xff,0xa5,0x84,0x7a,0xff,0xa3, 0x82,0x77,0xfe,0xa2,0x81,0x76,0xfb,0xa6,0x85,0x79,0xf2,0x59,0x48,0x41,0xe0,0x04, 0x03,0x03,0xc1,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xb3,0x04,0x04,0x04,0xd4,0x31, 0x2c,0x31,0xea,0x5d,0x52,0x5e,0xf6,0x56,0x4d,0x57,0xfc,0x57,0x4e,0x58,0xfe,0x56, 0x4d,0x57,0xff,0x56,0x4d,0x55,0xff,0x52,0x4b,0x52,0xff,0x51,0x4a,0x51,0xff,0x4d, 0x48,0x4e,0xff,0x3b,0x3d,0x3c,0xff,0x2d,0x34,0x2e,0xff,0x2d,0x34,0x2e,0xff,0x2d, 0x34,0x2d,0xff,0x2c,0x34,0x2c,0xff,0x2c,0x34,0x2c,0xff,0x2d,0x34,0x2d,0xff,0x27, 0x2f,0x28,0xff,0x1b,0x20,0x1b,0xff,0x17,0x1e,0x18,0xfd,0x18,0x1f,0x18,0xfb,0x1d, 0x22,0x1d,0xf9,0x0e,0x10,0x0e,0xf8,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0xf8,0x0c, 0x0d,0x0c,0xf9,0x38,0x3a,0x38,0xfb,0x49,0x46,0x49,0xfe,0x45,0x43,0x45,0xfe,0x4a, 0x46,0x4b,0xff,0x4b,0x46,0x4b,0xff,0x50,0x4a,0x50,0xff,0x50,0x4a,0x51,0xff,0x51, 0x4a,0x52,0xff,0x52,0x4a,0x53,0xff,0x50,0x49,0x52,0xff,0x55,0x4d,0x56,0xff,0x55, 0x4c,0x55,0xff,0x51,0x48,0x52,0xff,0x55,0x4c,0x56,0xff,0x55,0x4d,0x56,0xff,0x53, 0x4b,0x54,0xff,0x45,0x43,0x46,0xff,0x37,0x3b,0x37,0xff,0x38,0x3c,0x39,0xff,0x36, 0x3a,0x37,0xff,0x37,0x3b,0x38,0xff,0x35,0x3a,0x36,0xff,0x33,0x38,0x33,0xff,0x34, 0x39,0x35,0xff,0x36,0x3a,0x37,0xfe,0x29,0x31,0x2a,0xfb,0x20,0x2b,0x22,0xf8,0x29, 0x29,0x27,0xf0,0x11,0x0c,0x0f,0xe4,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0xd0,0x00, 0x00,0x00,0xd0,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0xe4,0x20,0x1f,0x20,0xf0,0x4b, 0x47,0x4b,0xf8,0x4d,0x48,0x4d,0xfd,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4b, 0x47,0x4c,0xff,0x4b,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4f,0x49,0x4f,0xff,0x37, 0x3b,0x37,0xff,0x4a,0x46,0x4a,0xff,0x55,0x4d,0x55,0xff,0x4c,0x48,0x4e,0xff,0x51, 0x4a,0x51,0xff,0x53,0x4c,0x54,0xff,0x54,0x4d,0x56,0xff,0x57,0x4d,0x57,0xff,0x5e, 0x52,0x5f,0xff,0x3f,0x40,0x40,0xff,0x56,0x4d,0x56,0xff,0x60,0x53,0x61,0xff,0x58, 0x4f,0x5a,0xff,0x5b,0x50,0x5b,0xff,0x4b,0x46,0x4b,0xff,0x38,0x3c,0x38,0xff,0x27, 0x2c,0x27,0xff,0x20,0x24,0x20,0xff,0x20,0x24,0x20,0xff,0x1b,0x20,0x1b,0xff,0x20, 0x23,0x20,0xff,0x43,0x40,0x43,0xff,0x4e,0x48,0x4e,0xff,0x4c,0x47,0x4c,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4d, 0x48,0x4d,0xff,0x4d,0x49,0x4f,0xff,0x50,0x4a,0x51,0xff,0x52,0x4b,0x52,0xff,0x53, 0x4c,0x54,0xff,0x55,0x4d,0x57,0xff,0x58,0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x5b, 0x50,0x5c,0xff,0x5a,0x50,0x5b,0xff,0x59,0x4f,0x5a,0xff,0x5f,0x53,0x61,0xff,0x27, 0x31,0x2a,0xff,0x45,0x40,0x36,0xff,0xa2,0x79,0x6c,0xff,0x55,0x4d,0x51,0xff,0x34, 0x3a,0x37,0xff,0x2b,0x2f,0x2b,0xff,0x04,0x04,0x04,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x21,0x1f,0x21,0xff,0x53,0x4a,0x54,0xff,0x4f, 0x49,0x4f,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x59, 0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x58,0x4e,0x59,0xff,0x59,0x4f,0x59,0xff,0x54, 0x4c,0x55,0xff,0x54,0x4c,0x54,0xff,0x4e,0x48,0x4f,0xff,0x54,0x4c,0x54,0xff,0x1e, 0x24,0x1e,0xff,0x4b,0x45,0x4c,0xff,0x4d,0x48,0x4d,0xff,0x4c,0x47,0x4c,0xff,0x4d, 0x48,0x4d,0xff,0x4d,0x48,0x4d,0xff,0x4d,0x48,0x4e,0xff,0x5d,0x54,0x59,0xff,0x64, 0x59,0x5e,0xff,0x67,0x5a,0x5f,0xfd,0x51,0x43,0x44,0xf8,0x42,0x37,0x38,0xf0,0x1a, 0x15,0x16,0xe0,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x82,0x00, 0x00,0x00,0x6a,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0xc3,0x12,0x0f,0x12,0xe0,0x80,0x67,0x7d,0xf1,0x78,0x60,0x74,0xfa,0x58, 0x4e,0x58,0xfd,0x60,0x52,0x60,0xff,0x63,0x54,0x63,0xff,0x65,0x56,0x65,0xff,0x64, 0x55,0x64,0xff,0x65,0x55,0x65,0xff,0x60,0x53,0x60,0xff,0x4c,0x47,0x4d,0xff,0x71, 0x5c,0x6b,0xff,0x88,0x63,0x68,0xff,0x53,0x4c,0x57,0xff,0x54,0x4c,0x55,0xff,0x51, 0x4a,0x51,0xff,0x50,0x4a,0x51,0xff,0x49,0x46,0x4a,0xff,0x39,0x3c,0x3a,0xff,0x51, 0x4a,0x52,0xff,0x54,0x4c,0x54,0xff,0x4a,0x46,0x4a,0xff,0x3d,0x3e,0x3e,0xff,0x31, 0x37,0x32,0xff,0x26,0x2f,0x27,0xfd,0x26,0x2c,0x28,0xf8,0x1a,0x1b,0x1a,0xf1,0x00, 0x00,0x00,0xe6,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xd5,0x02, 0x02,0x02,0xdd,0x18,0x19,0x18,0xe9,0x26,0x2c,0x26,0xf2,0x19,0x1c,0x19,0xf9,0x2f, 0x2b,0x30,0xfd,0x2c,0x28,0x2e,0xff,0x2e,0x28,0x2d,0xff,0x4d,0x40,0x4b,0xff,0x6f, 0x5c,0x6e,0xff,0x6c,0x59,0x6a,0xff,0x6c,0x59,0x6b,0xff,0x5f,0x52,0x5f,0xff,0x52, 0x4b,0x52,0xff,0x54,0x4c,0x56,0xff,0x55,0x4d,0x56,0xff,0x53,0x4b,0x55,0xff,0x54, 0x4c,0x55,0xff,0x4b,0x46,0x4b,0xff,0x46,0x44,0x47,0xff,0x51,0x4b,0x52,0xff,0x4d, 0x48,0x4e,0xff,0x4a,0x46,0x4b,0xff,0x49,0x45,0x4a,0xff,0x48,0x45,0x49,0xff,0x46, 0x43,0x46,0xff,0x45,0x43,0x46,0xff,0x48,0x45,0x49,0xff,0x3c,0x3d,0x3d,0xff,0x3e, 0x3f,0x3f,0xff,0x4a,0x46,0x4b,0xff,0x44,0x43,0x45,0xff,0x45,0x43,0x46,0xff,0x45, 0x43,0x46,0xfd,0x49,0x47,0x49,0xf8,0x3d,0x38,0x3d,0xef,0x12,0x0f,0x12,0xdc,0x00, 0x00,0x00,0xc2,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x84,0x00, 0x00,0x00,0x85,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0xb4,0x00, 0x00,0x00,0xc9,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xf5,0x1a, 0x20,0x1b,0xfc,0x46,0x3e,0x44,0xfe,0x4e,0x3e,0x4d,0xff,0x4c,0x3e,0x4a,0xff,0x4b, 0x3d,0x49,0xff,0x48,0x3a,0x46,0xff,0x57,0x48,0x56,0xff,0x51,0x49,0x50,0xff,0x49, 0x45,0x49,0xff,0x48,0x44,0x48,0xff,0x46,0x43,0x46,0xff,0x43,0x42,0x45,0xff,0x43, 0x42,0x44,0xff,0x40,0x40,0x41,0xff,0x52,0x4b,0x52,0xff,0x5d,0x51,0x5d,0xff,0x5e, 0x52,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x52,0x5e,0xff,0x5b,0x4c,0x60,0xff,0xa0, 0x82,0x7f,0xff,0xbd,0xa1,0x98,0xff,0xb4,0x98,0x8f,0xff,0xb0,0x94,0x8a,0xff,0xb1, 0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xaf,0x93,0x89,0xff,0xaf, 0x93,0x89,0xff,0xaf,0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xaf, 0x91,0x87,0xff,0xad,0x8f,0x83,0xff,0xae,0x90,0x86,0xff,0xae,0x90,0x85,0xff,0xb2, 0x94,0x87,0xff,0x9a,0x7b,0x7d,0xff,0x94,0x74,0x77,0xff,0x9a,0x77,0x73,0xff,0xa2, 0x80,0x76,0xff,0x9a,0x76,0x6f,0xff,0x89,0x6f,0x74,0xff,0x86,0x6f,0x76,0xff,0x8b, 0x66,0x64,0xff,0x93,0x74,0x79,0xff,0xa1,0x7f,0x75,0xff,0xa5,0x85,0x7a,0xff,0xa6, 0x86,0x7c,0xff,0xa5,0x84,0x7a,0xff,0xa3,0x82,0x77,0xfe,0xa3,0x82,0x77,0xfb,0xa5, 0x84,0x79,0xf1,0x71,0x58,0x50,0xe0,0x05,0x04,0x04,0xc0,0x00,0x00,0x00,0x93,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x71,0x00, 0x00,0x00,0x9d,0x00,0x00,0x00,0xc3,0x0b,0x0a,0x0b,0xdf,0x4f,0x46,0x4f,0xf1,0x57, 0x4e,0x58,0xf9,0x56,0x4d,0x57,0xfd,0x56,0x4d,0x57,0xfe,0x55,0x4c,0x56,0xff,0x54, 0x4c,0x54,0xff,0x52,0x4b,0x52,0xff,0x50,0x49,0x50,0xff,0x46,0x44,0x46,0xff,0x2d, 0x34,0x2e,0xff,0x2d,0x34,0x2e,0xff,0x2d,0x34,0x2e,0xff,0x2c,0x34,0x2c,0xff,0x2c, 0x34,0x2c,0xff,0x2b,0x33,0x2c,0xff,0x29,0x32,0x2a,0xfe,0x21,0x29,0x22,0xfd,0x14, 0x1b,0x15,0xfa,0x0e,0x15,0x0f,0xf5,0x0e,0x11,0x0e,0xef,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0xea,0x00,0x00,0x00,0xeb,0x02,0x03,0x02,0xf1,0x20,0x22,0x20,0xf7,0x40, 0x43,0x41,0xfb,0x3a,0x3d,0x3b,0xfe,0x4d,0x47,0x4d,0xfe,0x4b,0x46,0x4b,0xff,0x4c, 0x47,0x4c,0xff,0x48,0x44,0x4a,0xff,0x48,0x42,0x49,0xff,0x4b,0x45,0x4b,0xff,0x43, 0x3e,0x43,0xff,0x4d,0x45,0x4d,0xff,0x52,0x4a,0x53,0xff,0x47,0x41,0x48,0xff,0x4c, 0x45,0x4d,0xff,0x55,0x4d,0x56,0xff,0x54,0x4c,0x54,0xff,0x4b,0x47,0x4c,0xff,0x39, 0x3c,0x3a,0xff,0x37,0x3b,0x37,0xff,0x37,0x3a,0x37,0xff,0x37,0x3a,0x38,0xff,0x37, 0x3a,0x37,0xff,0x35,0x39,0x35,0xff,0x35,0x3a,0x36,0xfe,0x34,0x39,0x35,0xfc,0x36, 0x3c,0x37,0xf6,0x25,0x29,0x26,0xee,0x0a,0x0a,0x09,0xe1,0x02,0x00,0x00,0xcd,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0xd2,0x11,0x12,0x11,0xe6,0x3d,0x3b,0x3d,0xf3,0x4e,0x49,0x4e,0xfa,0x4a, 0x46,0x4b,0xfd,0x4b,0x46,0x4b,0xff,0x4a,0x45,0x4b,0xff,0x4b,0x46,0x4b,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4d,0xff,0x42,0x42,0x43,0xff,0x34,0x39,0x34,0xff,0x4f, 0x49,0x4f,0xff,0x52,0x4c,0x54,0xff,0x4b,0x47,0x4c,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x54,0xff,0x58,0x4e,0x59,0xff,0x4e,0x49,0x4f,0xff,0x53,0x4b,0x53,0xff,0x61, 0x53,0x60,0xff,0x5c,0x51,0x5c,0xff,0x59,0x4f,0x5a,0xff,0x5a,0x4f,0x5b,0xff,0x4e, 0x49,0x4f,0xff,0x38,0x3c,0x39,0xff,0x29,0x2f,0x2a,0xff,0x20,0x25,0x21,0xff,0x20, 0x24,0x20,0xff,0x13,0x16,0x13,0xff,0x1b,0x20,0x1b,0xff,0x44,0x41,0x44,0xff,0x4d, 0x48,0x4e,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4b,0x46,0x4b,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4f, 0x49,0x50,0xff,0x51,0x4a,0x50,0xff,0x53,0x4c,0x54,0xff,0x55,0x4d,0x57,0xff,0x58, 0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x58,0x4e,0x59,0xff,0x59,0x50,0x5a,0xff,0x5d, 0x52,0x5e,0xff,0x4f,0x49,0x4f,0xff,0x48,0x44,0x4b,0xff,0x9b,0x75,0x77,0xff,0x7a, 0x61,0x64,0xff,0x39,0x3c,0x38,0xff,0x33,0x38,0x33,0xff,0x22,0x26,0x22,0xfe,0x03, 0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x1b, 0x18,0x1a,0xfe,0x51,0x49,0x52,0xff,0x4b,0x47,0x4c,0xff,0x56,0x4c,0x56,0xff,0x59, 0x4f,0x5a,0xff,0x5c,0x51,0x5d,0xff,0x59,0x4f,0x5a,0xff,0x59,0x4f,0x5a,0xff,0x59, 0x4f,0x59,0xff,0x59,0x4e,0x59,0xff,0x52,0x4b,0x53,0xff,0x51,0x4a,0x51,0xff,0x4d, 0x48,0x4e,0xff,0x4b,0x47,0x4b,0xff,0x13,0x1c,0x14,0xff,0x47,0x45,0x48,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c, 0x47,0x4c,0xff,0x57,0x4e,0x54,0xff,0x63,0x58,0x5d,0xff,0x50,0x48,0x4d,0xfe,0x28, 0x21,0x22,0xfc,0x50,0x43,0x44,0xf6,0x31,0x28,0x29,0xec,0x04,0x03,0x03,0xd8,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xc1,0x0b,0x09,0x0b,0xde,0x76, 0x5f,0x73,0xf0,0x75,0x60,0x73,0xf9,0x56,0x4d,0x56,0xfe,0x5d,0x50,0x5d,0xff,0x5f, 0x52,0x5f,0xff,0x62,0x54,0x62,0xff,0x62,0x54,0x62,0xff,0x62,0x54,0x62,0xff,0x59, 0x4f,0x59,0xff,0x42,0x41,0x42,0xff,0x8e,0x6b,0x7d,0xff,0x87,0x65,0x62,0xff,0x4f, 0x49,0x54,0xff,0x52,0x4b,0x53,0xff,0x50,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x44, 0x42,0x45,0xff,0x4c,0x47,0x4d,0xff,0x71,0x5d,0x70,0xff,0x4b,0x47,0x4c,0xff,0x4a, 0x46,0x4a,0xff,0x4d,0x48,0x4d,0xff,0x4a,0x47,0x4b,0xfe,0x3a,0x3d,0x3c,0xfc,0x27, 0x2d,0x29,0xf6,0x0f,0x11,0x0e,0xec,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xcb,0x00, 0x00,0x00,0xbf,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xca,0x06,0x06,0x06,0xdb,0x0f, 0x0f,0x0f,0xea,0x05,0x06,0x05,0xf5,0x12,0x13,0x13,0xfb,0x27,0x25,0x29,0xfd,0x3c, 0x33,0x3b,0xff,0x4f,0x42,0x4f,0xff,0x6e,0x5b,0x6d,0xff,0x6d,0x5a,0x6c,0xff,0x6a, 0x59,0x6a,0xff,0x57,0x4e,0x58,0xff,0x52,0x4a,0x52,0xff,0x53,0x4b,0x54,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x54,0xff,0x56,0x4d,0x56,0xff,0x4b,0x47,0x4a,0xff,0x3c, 0x3e,0x3c,0xff,0x43,0x42,0x44,0xff,0x45,0x44,0x46,0xff,0x4b,0x46,0x4c,0xff,0x4a, 0x46,0x4b,0xff,0x49,0x46,0x4a,0xff,0x48,0x44,0x48,0xff,0x46,0x44,0x47,0xff,0x49, 0x45,0x4a,0xff,0x3a,0x3c,0x3b,0xff,0x3d,0x3e,0x3e,0xff,0x4b,0x47,0x4c,0xff,0x44, 0x43,0x45,0xff,0x45,0x43,0x46,0xfe,0x45,0x43,0x46,0xfb,0x4e,0x4a,0x4f,0xf5,0x29, 0x25,0x28,0xe7,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xca,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0xf0,0x00,0x08,0x00,0xf9,0x38,0x32,0x38,0xfd,0x54, 0x43,0x51,0xfe,0x4b,0x3e,0x4a,0xff,0x4a,0x3c,0x48,0xff,0x4a,0x3b,0x47,0xff,0x55, 0x49,0x54,0xff,0x50,0x4a,0x51,0xff,0x49,0x46,0x4a,0xff,0x47,0x44,0x47,0xff,0x45, 0x43,0x46,0xff,0x44,0x42,0x45,0xff,0x42,0x42,0x43,0xff,0x46,0x44,0x47,0xff,0x59, 0x4e,0x59,0xff,0x5f,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e, 0x52,0x5f,0xff,0x5a,0x50,0x5e,0xff,0x64,0x50,0x57,0xff,0xa8,0x8c,0x83,0xff,0xb8, 0x9d,0x93,0xff,0xb1,0x95,0x8c,0xff,0xb0,0x94,0x8a,0xff,0xb0,0x94,0x8a,0xff,0xb0, 0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x93,0x89,0xff,0xb0,0x93,0x89,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x91,0x87,0xff,0xaf,0x91,0x87,0xff,0xae,0x90,0x86,0xff,0xae, 0x90,0x86,0xff,0xb1,0x93,0x86,0xff,0x97,0x75,0x74,0xff,0x97,0x78,0x7a,0xff,0x9e, 0x81,0x82,0xff,0x9c,0x7b,0x76,0xff,0xa8,0x88,0x7f,0xff,0xae,0x90,0x8a,0xff,0x8f, 0x76,0x7a,0xff,0x8c,0x73,0x78,0xff,0x98,0x77,0x75,0xff,0xa9,0x89,0x7d,0xff,0xa8, 0x88,0x7e,0xff,0xa6,0x86,0x7c,0xff,0xa6,0x86,0x7c,0xff,0xa5,0x84,0x7a,0xfe,0xa4, 0x83,0x79,0xfc,0xa4,0x83,0x78,0xf9,0xac,0x89,0x7d,0xee,0x53,0x3d,0x3b,0xdb,0x03, 0x03,0x02,0xba,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x3a,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xb2,0x02, 0x01,0x02,0xd2,0x1e,0x1b,0x1f,0xe9,0x5c,0x52,0x5d,0xf5,0x56,0x4d,0x57,0xfc,0x56, 0x4d,0x57,0xfe,0x56,0x4d,0x57,0xff,0x54,0x4c,0x55,0xff,0x53,0x4b,0x53,0xff,0x51, 0x4a,0x51,0xff,0x4c,0x47,0x4d,0xff,0x3a,0x3d,0x3b,0xff,0x2b,0x33,0x2c,0xff,0x2c, 0x34,0x2d,0xff,0x2c,0x34,0x2c,0xff,0x2b,0x33,0x2b,0xff,0x2b,0x34,0x2b,0xfe,0x29, 0x32,0x2a,0xfc,0x28,0x31,0x29,0xf9,0x1d,0x24,0x1e,0xf1,0x07,0x0a,0x07,0xe8,0x00, 0x00,0x00,0xdc,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xd5,0x00, 0x00,0x00,0xe0,0x0d,0x0e,0x0d,0xec,0x33,0x38,0x34,0xf5,0x3d,0x3f,0x3e,0xfb,0x4c, 0x47,0x4d,0xfe,0x4a,0x46,0x4b,0xfe,0x4b,0x46,0x4b,0xff,0x46,0x41,0x46,0xff,0x41, 0x3c,0x43,0xff,0x4c,0x45,0x4c,0xff,0x42,0x3d,0x42,0xff,0x41,0x3c,0x41,0xff,0x53, 0x4c,0x55,0xff,0x49,0x43,0x4a,0xff,0x43,0x3d,0x43,0xff,0x52,0x49,0x52,0xff,0x53, 0x4c,0x53,0xff,0x4f,0x49,0x4f,0xff,0x40,0x40,0x41,0xff,0x35,0x39,0x34,0xff,0x37, 0x3a,0x37,0xff,0x36,0x3a,0x37,0xff,0x37,0x3a,0x37,0xff,0x36,0x3a,0x37,0xfe,0x35, 0x39,0x36,0xfc,0x35,0x3a,0x35,0xf6,0x25,0x28,0x25,0xed,0x07,0x08,0x07,0xdd,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x8c,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xbe,0x05,0x05,0x05,0xda,0x31, 0x2f,0x31,0xed,0x4d,0x49,0x4e,0xf8,0x48,0x45,0x49,0xfd,0x48,0x45,0x4a,0xff,0x48, 0x45,0x49,0xff,0x49,0x46,0x49,0xff,0x48,0x45,0x4a,0xff,0x4a,0x46,0x4b,0xff,0x4a, 0x46,0x4b,0xff,0x34,0x38,0x34,0xff,0x30,0x35,0x30,0xff,0x5e,0x52,0x5d,0xff,0x5c, 0x51,0x5d,0xff,0x4d,0x48,0x4e,0xff,0x53,0x4b,0x53,0xff,0x4d,0x47,0x4d,0xff,0x4d, 0x48,0x4e,0xff,0x5f,0x53,0x60,0xff,0x5c,0x50,0x5c,0xff,0x57,0x4d,0x58,0xff,0x56, 0x4d,0x57,0xff,0x57,0x4d,0x57,0xff,0x53,0x4b,0x54,0xff,0x3a,0x3d,0x3b,0xff,0x31, 0x37,0x31,0xff,0x25,0x29,0x25,0xff,0x21,0x26,0x21,0xff,0x0a,0x0b,0x0a,0xff,0x10, 0x14,0x10,0xff,0x3c,0x3b,0x3d,0xff,0x49,0x46,0x4a,0xff,0x4a,0x46,0x4b,0xff,0x4b, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x49,0x46,0x4a,0xff,0x4a,0x46,0x4b,0xff,0x4c, 0x47,0x4d,0xff,0x4b,0x47,0x4c,0xff,0x4e,0x49,0x4f,0xff,0x50,0x49,0x50,0xff,0x51, 0x4b,0x51,0xff,0x54,0x4c,0x55,0xff,0x57,0x4d,0x57,0xff,0x58,0x4e,0x59,0xff,0x58, 0x4e,0x58,0xff,0x5c,0x51,0x5c,0xff,0x3d,0x3e,0x3e,0xff,0x4b,0x46,0x4b,0xff,0x61, 0x54,0x62,0xff,0x63,0x52,0x5d,0xff,0x52,0x4a,0x55,0xff,0x3c,0x3e,0x3e,0xfe,0x36, 0x3b,0x36,0xfe,0x1a,0x1d,0x1a,0xfd,0x02,0x02,0x02,0xfc,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0xfc,0x00,0x00,0x00,0xfc,0x14,0x12,0x14,0xfd,0x4f,0x47,0x4f,0xfe,0x50, 0x4a,0x51,0xfe,0x54,0x4c,0x55,0xff,0x57,0x4e,0x58,0xff,0x55,0x4c,0x56,0xff,0x59, 0x4f,0x59,0xff,0x5a,0x50,0x5b,0xff,0x59,0x4f,0x5a,0xff,0x47,0x45,0x49,0xff,0x38, 0x3a,0x38,0xff,0x36,0x39,0x36,0xff,0x32,0x38,0x33,0xff,0x36,0x3a,0x36,0xff,0x0b, 0x16,0x0d,0xff,0x48,0x45,0x49,0xff,0x4c,0x47,0x4c,0xff,0x4b,0x46,0x4b,0xff,0x4b, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x51,0x4a,0x4f,0xff,0x60,0x56,0x5b,0xff,0x50, 0x4a,0x4f,0xff,0x3e,0x3b,0x3f,0xff,0x01,0x00,0x00,0xfe,0x44,0x38,0x39,0xfb,0x44, 0x38,0x39,0xf3,0x2e,0x26,0x27,0xe5,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0x9f,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0xc7,0x09,0x08,0x09,0xe0,0x66,0x53,0x63,0xf1,0x75,0x5f,0x72,0xf9,0x55, 0x4c,0x55,0xfd,0x59,0x4f,0x5b,0xfe,0x5c,0x50,0x5c,0xff,0x5f,0x52,0x60,0xff,0x61, 0x53,0x61,0xff,0x60,0x53,0x60,0xff,0x4b,0x47,0x4c,0xff,0x30,0x36,0x30,0xff,0x76, 0x5e,0x6d,0xff,0x86,0x67,0x6f,0xff,0x4f,0x49,0x52,0xff,0x52,0x4b,0x52,0xff,0x4d, 0x48,0x4d,0xff,0x3e,0x3f,0x3e,0xff,0x4d,0x48,0x4f,0xff,0x72,0x5d,0x71,0xff,0x52, 0x4a,0x52,0xff,0x46,0x44,0x47,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48, 0x45,0x49,0xfe,0x4d,0x49,0x4e,0xfc,0x40,0x3c,0x40,0xf6,0x0b,0x0a,0x0a,0xe9,0x00, 0x00,0x00,0xd6,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0xb0,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0xf1,0x00, 0x00,0x00,0xf9,0x09,0x08,0x09,0xfd,0x2b,0x24,0x2b,0xff,0x57,0x49,0x56,0xff,0x6f, 0x5c,0x6e,0xff,0x6f,0x5b,0x6d,0xff,0x67,0x57,0x67,0xff,0x51,0x4a,0x52,0xff,0x53, 0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x54,0x4c,0x54,0xff,0x58,0x4f,0x58,0xff,0x44, 0x41,0x45,0xff,0x12,0x1d,0x15,0xff,0x2c,0x2f,0x30,0xff,0x4e,0x4a,0x4f,0xff,0x39, 0x3b,0x39,0xff,0x37,0x3b,0x38,0xff,0x31,0x37,0x32,0xff,0x36,0x39,0x35,0xff,0x38, 0x3b,0x39,0xff,0x32,0x38,0x34,0xff,0x2f,0x36,0x30,0xff,0x2a,0x32,0x29,0xff,0x36, 0x3a,0x37,0xff,0x4c,0x48,0x4e,0xff,0x48,0x45,0x49,0xff,0x44,0x42,0x45,0xfe,0x45, 0x44,0x46,0xfa,0x47,0x41,0x47,0xf0,0x1c,0x18,0x1c,0xdd,0x00,0x00,0x00,0xbe,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x90,0x01,0x01,0x01,0xb5,0x00,0x01,0x00,0xd4,0x00,0x00,0x00,0xe9,0x21, 0x1f,0x22,0xf5,0x4f,0x43,0x4e,0xfb,0x52,0x42,0x50,0xfd,0x4a,0x3d,0x49,0xff,0x49, 0x3c,0x48,0xff,0x4d,0x3f,0x4d,0xff,0x4d,0x45,0x4d,0xff,0x4b,0x47,0x4b,0xff,0x49, 0x45,0x49,0xff,0x46,0x44,0x46,0xff,0x45,0x43,0x46,0xff,0x44,0x42,0x45,0xff,0x3f, 0x40,0x40,0xff,0x52,0x4b,0x52,0xff,0x5e,0x52,0x5e,0xff,0x5d,0x51,0x5e,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x60,0x53,0x60,0xff,0x5f,0x53,0x5f,0xff,0x56, 0x4d,0x5b,0xff,0x6d,0x59,0x65,0xff,0xb2,0x99,0x93,0xff,0xb7,0x9c,0x91,0xff,0xb1, 0x95,0x8b,0xff,0xb0,0x94,0x8a,0xff,0xb1,0x95,0x8b,0xff,0xb0,0x93,0x8a,0xff,0xb0, 0x93,0x89,0xff,0xaf,0x92,0x89,0xff,0xaf,0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xaf, 0x92,0x88,0xff,0xaf,0x92,0x88,0xff,0xb1,0x93,0x87,0xff,0x92,0x74,0x7d,0xff,0x9b, 0x7b,0x79,0xff,0xae,0x90,0x84,0xff,0xba,0xa0,0x95,0xff,0xb1,0x92,0x88,0xff,0xae, 0x91,0x87,0xff,0xb5,0x9a,0x90,0xff,0xb1,0x91,0x85,0xff,0xaf,0x8f,0x83,0xff,0xac, 0x8c,0x80,0xff,0xa8,0x88,0x7e,0xff,0xa7,0x87,0x7d,0xff,0xa7,0x87,0x7d,0xff,0xa6, 0x86,0x7c,0xff,0xa6,0x85,0x7b,0xfd,0xa7,0x86,0x7b,0xfb,0xaa,0x88,0x7b,0xf5,0x80, 0x62,0x5e,0xe8,0x10,0x0b,0x0b,0xd0,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xc7,0x07,0x06,0x07,0xe2,0x3e, 0x38,0x3f,0xf2,0x58,0x4f,0x59,0xfa,0x54,0x4b,0x54,0xfe,0x54,0x4c,0x55,0xfe,0x54, 0x4c,0x55,0xff,0x53,0x4c,0x54,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x46, 0x44,0x46,0xff,0x2d,0x35,0x2e,0xff,0x2b,0x33,0x2b,0xff,0x2a,0x33,0x2b,0xff,0x2b, 0x34,0x2c,0xfe,0x2b,0x33,0x2b,0xfd,0x2a,0x34,0x2b,0xfa,0x28,0x32,0x29,0xf1,0x16, 0x1b,0x16,0xe4,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xb1,0x00, 0x00,0x00,0xad,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xc9,0x03,0x04,0x04,0xdd,0x1f, 0x22,0x20,0xee,0x43,0x43,0x43,0xf8,0x4b,0x46,0x4c,0xfc,0x4a,0x46,0x4b,0xff,0x4b, 0x47,0x4c,0xff,0x45,0x41,0x46,0xff,0x3c,0x39,0x3d,0xff,0x4b,0x45,0x4c,0xff,0x48, 0x43,0x49,0xff,0x3e,0x38,0x3d,0xff,0x4e,0x47,0x4e,0xff,0x4f,0x47,0x4f,0xff,0x41, 0x3c,0x41,0xff,0x48,0x41,0x48,0xff,0x53,0x4c,0x53,0xff,0x52,0x4b,0x52,0xff,0x46, 0x44,0x47,0xff,0x35,0x3a,0x36,0xff,0x36,0x3a,0x37,0xff,0x36,0x3a,0x37,0xff,0x36, 0x3a,0x37,0xfd,0x36,0x3a,0x37,0xfb,0x38,0x3d,0x38,0xf6,0x27,0x2b,0x27,0xec,0x08, 0x09,0x08,0xdd,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0xac,0x00,0x00,0x00,0xcd,0x26,0x25,0x27,0xe6,0x4c,0x4a,0x4d,0xf5,0x48, 0x45,0x49,0xfb,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x33,0x39,0x34,0xff,0x30, 0x36,0x30,0xff,0x4a,0x45,0x49,0xff,0x53,0x4a,0x53,0xff,0x46,0x44,0x47,0xff,0x43, 0x42,0x44,0xff,0x54,0x4c,0x55,0xff,0x5a,0x4f,0x5a,0xff,0x54,0x4b,0x54,0xff,0x55, 0x4c,0x56,0xff,0x56,0x4d,0x57,0xff,0x55,0x4c,0x56,0xff,0x54,0x4c,0x55,0xff,0x57, 0x4d,0x57,0xff,0x3d,0x3e,0x3d,0xff,0x33,0x39,0x33,0xff,0x31,0x37,0x32,0xff,0x25, 0x2a,0x25,0xff,0x06,0x06,0x06,0xff,0x09,0x0b,0x09,0xff,0x2d,0x2f,0x2e,0xff,0x46, 0x44,0x47,0xff,0x49,0x46,0x4a,0xff,0x48,0x45,0x49,0xff,0x4a,0x46,0x4b,0xff,0x49, 0x46,0x4b,0xff,0x48,0x45,0x49,0xff,0x4b,0x47,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x4c, 0x47,0x4d,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x53, 0x4c,0x54,0xff,0x56,0x4d,0x57,0xff,0x59,0x4f,0x59,0xff,0x4d,0x48,0x4e,0xff,0x4b, 0x46,0x4b,0xff,0x5c,0x51,0x5d,0xff,0x55,0x4c,0x56,0xff,0x50,0x4a,0x53,0xff,0x55, 0x4c,0x55,0xff,0x3f,0x40,0x40,0xfe,0x35,0x3b,0x36,0xfc,0x12,0x14,0x12,0xfb,0x01, 0x01,0x01,0xf8,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xf7,0x0c, 0x0b,0x0c,0xfa,0x4f,0x47,0x50,0xfc,0x55,0x4d,0x56,0xfe,0x56,0x4d,0x57,0xfe,0x57, 0x4d,0x57,0xff,0x29,0x30,0x2a,0xff,0x4d,0x48,0x4d,0xff,0x4a,0x46,0x4b,0xff,0x2e, 0x35,0x2f,0xff,0x2a,0x32,0x2a,0xff,0x27,0x30,0x27,0xff,0x28,0x32,0x29,0xff,0x26, 0x30,0x26,0xff,0x37,0x3b,0x37,0xff,0x0a,0x16,0x0c,0xff,0x5b,0x50,0x5c,0xff,0x4a, 0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x49,0x46,0x4b,0xff,0x53,0x4c,0x50,0xff,0x60, 0x56,0x5a,0xff,0x54,0x4d,0x52,0xff,0x4a,0x46,0x4b,0xff,0x3f,0x3c,0x40,0xff,0x00, 0x00,0x00,0xfe,0x17,0x12,0x12,0xfd,0x55,0x46,0x47,0xf7,0x4a,0x3e,0x3f,0xf0,0x00, 0x00,0x00,0xe2,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xb2,0x00, 0x00,0x00,0xb3,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xd3,0x07,0x06,0x07,0xe7,0x53, 0x45,0x52,0xf3,0x6f,0x5c,0x6e,0xfb,0x54,0x4c,0x55,0xfd,0x59,0x4e,0x59,0xff,0x5c, 0x50,0x5c,0xff,0x5d,0x51,0x5d,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x50,0x5d,0xff,0x45, 0x42,0x45,0xff,0x19,0x26,0x1a,0xff,0x3e,0x40,0x41,0xff,0x5f,0x51,0x5e,0xff,0x50, 0x49,0x50,0xff,0x40,0x41,0x41,0xff,0x32,0x37,0x33,0xff,0x3f,0x3f,0x3c,0xff,0x7e, 0x62,0x71,0xff,0x5b,0x50,0x5d,0xff,0x43,0x42,0x45,0xff,0x49,0x45,0x4a,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xfe,0x4b,0x48,0x4c,0xfc,0x39, 0x36,0x39,0xf7,0x02,0x01,0x01,0xeb,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xc6,0x00, 0x00,0x00,0xb5,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xcd,0x00, 0x00,0x00,0xe0,0x02,0x02,0x02,0xf0,0x04,0x03,0x04,0xf9,0x00,0x00,0x00,0xfc,0x09, 0x08,0x09,0xff,0x40,0x36,0x40,0xff,0x73,0x60,0x73,0xff,0x6f,0x5b,0x6d,0xfe,0x61, 0x53,0x60,0xfe,0x50,0x4a,0x50,0xfe,0x53,0x4b,0x53,0xff,0x53,0x4b,0x53,0xff,0x57, 0x4e,0x57,0xff,0x43,0x40,0x43,0xff,0x13,0x21,0x16,0xff,0x32,0x31,0x2c,0xff,0x60, 0x4f,0x56,0xff,0x3b,0x3e,0x3e,0xff,0x37,0x3b,0x37,0xff,0x39,0x3c,0x39,0xff,0x3b, 0x3d,0x3b,0xff,0x41,0x40,0x41,0xff,0x40,0x41,0x41,0xff,0x3e,0x3f,0x3e,0xff,0x3d, 0x3e,0x3d,0xff,0x3c,0x3d,0x3d,0xff,0x3b,0x3d,0x3c,0xff,0x45,0x44,0x46,0xff,0x48, 0x45,0x49,0xfe,0x42,0x41,0x43,0xfc,0x48,0x46,0x49,0xf7,0x33,0x2f,0x33,0xeb,0x0a, 0x08,0x0a,0xd2,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0xa2,0x04, 0x03,0x04,0xc6,0x04,0x03,0x04,0xe0,0x10,0x0e,0x10,0xef,0x41,0x35,0x40,0xf9,0x51, 0x41,0x4f,0xfd,0x4a,0x3c,0x48,0xfe,0x4a,0x3b,0x48,0xff,0x52,0x45,0x53,0xff,0x50, 0x49,0x50,0xff,0x49,0x46,0x4a,0xff,0x47,0x44,0x48,0xff,0x46,0x43,0x46,0xff,0x43, 0x42,0x45,0xff,0x42,0x41,0x43,0xff,0x48,0x45,0x48,0xff,0x5a,0x4f,0x5b,0xff,0x5f, 0x53,0x60,0xff,0x5e,0x52,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5f, 0x52,0x5f,0xff,0x5d,0x51,0x5d,0xff,0x5e,0x52,0x5e,0xff,0x59,0x4e,0x5d,0xff,0x81, 0x67,0x76,0xff,0xb6,0x9c,0x99,0xff,0xb4,0x98,0x8e,0xff,0xb0,0x92,0x87,0xff,0xb1, 0x93,0x89,0xff,0xb1,0x92,0x88,0xff,0xb0,0x92,0x88,0xff,0xb0,0x92,0x88,0xff,0xb0, 0x92,0x88,0xff,0xb0,0x92,0x88,0xff,0xaf,0x90,0x86,0xff,0xad,0x8e,0x84,0xff,0xa6, 0x84,0x77,0xff,0x83,0x64,0x75,0xff,0xa6,0x87,0x7f,0xff,0xac,0x8c,0x81,0xff,0xab, 0x8b,0x81,0xff,0xa9,0x89,0x7f,0xff,0xa9,0x88,0x7e,0xff,0xa7,0x87,0x7c,0xff,0xa9, 0x89,0x7f,0xff,0xa9,0x89,0x7f,0xff,0xa9,0x88,0x7e,0xff,0xa9,0x88,0x7e,0xff,0xaa, 0x89,0x7f,0xff,0xa9,0x88,0x7e,0xff,0xa8,0x89,0x7f,0xfe,0xa3,0x81,0x75,0xfc,0x93, 0x6e,0x6e,0xf8,0x64,0x54,0x58,0xed,0x15,0x10,0x11,0xdb,0x01,0x00,0x00,0xbe,0x00, 0x00,0x00,0x98,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x9e,0x00, 0x00,0x00,0xc0,0x00,0x00,0x00,0xdc,0x11,0x10,0x12,0xee,0x55,0x4d,0x56,0xf8,0x55, 0x4d,0x56,0xfd,0x54,0x4c,0x55,0xfe,0x53,0x4b,0x53,0xff,0x51,0x4a,0x52,0xff,0x4e, 0x49,0x4f,0xff,0x4d,0x48,0x4e,0xff,0x4a,0x46,0x4b,0xff,0x38,0x3b,0x39,0xff,0x2a, 0x33,0x2a,0xff,0x2c,0x34,0x2c,0xff,0x2c,0x34,0x2c,0xfd,0x2c,0x34,0x2c,0xfa,0x29, 0x32,0x29,0xf4,0x1b,0x20,0x1b,0xe7,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xb8,0x00, 0x00,0x00,0x9e,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x94,0x00, 0x00,0x00,0xaf,0x00,0x00,0x00,0xcc,0x0e,0x10,0x0f,0xe4,0x3b,0x3d,0x3c,0xf3,0x49, 0x45,0x4a,0xfb,0x47,0x44,0x48,0xfe,0x49,0x46,0x4a,0xfe,0x43,0x41,0x44,0xff,0x3d, 0x3a,0x3d,0xff,0x4a,0x46,0x4b,0xff,0x4b,0x46,0x4c,0xff,0x42,0x3d,0x42,0xff,0x46, 0x40,0x46,0xff,0x52,0x4b,0x52,0xff,0x49,0x43,0x49,0xff,0x3f,0x3c,0x40,0xff,0x48, 0x43,0x49,0xff,0x4f,0x49,0x50,0xff,0x49,0x45,0x4a,0xff,0x39,0x3c,0x3a,0xff,0x33, 0x38,0x34,0xff,0x35,0x39,0x36,0xfe,0x36,0x3b,0x37,0xfc,0x38,0x3d,0x39,0xf8,0x28, 0x2c,0x28,0xee,0x09,0x0a,0x09,0xdf,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0xc4,0x18, 0x18,0x18,0xe1,0x42,0x40,0x43,0xf2,0x4a,0x47,0x4b,0xfa,0x48,0x45,0x49,0xfe,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x49, 0x46,0x4a,0xff,0x30,0x36,0x30,0xff,0x3b,0x3d,0x3c,0xff,0x48,0x45,0x49,0xff,0x36, 0x39,0x36,0xff,0x42,0x40,0x42,0xff,0x59,0x4f,0x5a,0xff,0x74,0x5f,0x72,0xff,0x61, 0x53,0x5f,0xff,0x51,0x4a,0x52,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54, 0x4c,0x55,0xff,0x53,0x4b,0x54,0xff,0x56,0x4d,0x56,0xff,0x42,0x41,0x42,0xff,0x34, 0x38,0x34,0xff,0x36,0x3c,0x37,0xff,0x1c,0x1e,0x1c,0xff,0x02,0x02,0x02,0xff,0x01, 0x01,0x01,0xff,0x2b,0x2d,0x2c,0xff,0x47,0x45,0x49,0xff,0x41,0x41,0x41,0xff,0x36, 0x3a,0x37,0xff,0x42,0x42,0x43,0xff,0x48,0x45,0x49,0xff,0x49,0x46,0x4a,0xff,0x4a, 0x46,0x4b,0xff,0x49,0x45,0x4a,0xff,0x4a,0x46,0x4a,0xff,0x4c,0x47,0x4d,0xff,0x50, 0x4a,0x50,0xff,0x51,0x4a,0x51,0xff,0x53,0x4b,0x52,0xff,0x54,0x4c,0x55,0xff,0x56, 0x4d,0x57,0xff,0x51,0x4a,0x52,0xff,0x54,0x4c,0x55,0xff,0x77,0x60,0x73,0xff,0x5b, 0x50,0x5c,0xff,0x53,0x4b,0x53,0xff,0x55,0x4c,0x55,0xfe,0x40,0x40,0x41,0xfd,0x36, 0x3c,0x37,0xfa,0x0a,0x0b,0x0a,0xf6,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0xeb,0x00,0x00,0x00,0xed,0x05,0x04,0x05,0xf3,0x51,0x49,0x52,0xf8,0x54, 0x4c,0x54,0xfc,0x57,0x4d,0x57,0xfe,0x51,0x4a,0x52,0xff,0x3d,0x3e,0x3e,0xff,0x35, 0x39,0x36,0xff,0x29,0x32,0x2a,0xff,0x1f,0x2b,0x1f,0xff,0x2b,0x33,0x2b,0xff,0x2b, 0x33,0x2b,0xff,0x29,0x32,0x29,0xff,0x29,0x32,0x2a,0xff,0x27,0x30,0x28,0xff,0x3e, 0x38,0x3e,0xff,0x61,0x52,0x61,0xff,0x4a,0x46,0x4b,0xff,0x4a,0x46,0x4b,0xff,0x56, 0x4e,0x53,0xff,0x5d,0x54,0x59,0xff,0x52,0x4d,0x51,0xff,0x4a,0x46,0x4b,0xff,0x4a, 0x46,0x4b,0xff,0x3f,0x3c,0x40,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xfe,0x46, 0x3a,0x3b,0xfc,0x3f,0x33,0x34,0xf7,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0xe4,0x00, 0x00,0x00,0xd9,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xd7,0x00, 0x00,0x00,0xe3,0x06,0x04,0x05,0xee,0x44,0x37,0x42,0xf7,0x6a,0x5a,0x6a,0xfc,0x53, 0x4b,0x54,0xfe,0x58,0x4e,0x58,0xff,0x59,0x4f,0x5a,0xff,0x5b,0x50,0x5c,0xff,0x59, 0x4f,0x5a,0xff,0x5e,0x52,0x5e,0xff,0x4e,0x48,0x4f,0xff,0x20,0x2a,0x21,0xff,0x5b, 0x51,0x5c,0xff,0x4e,0x49,0x4f,0xff,0x50,0x49,0x50,0xff,0x49,0x46,0x4a,0xff,0x49, 0x45,0x49,0xff,0x53,0x4b,0x53,0xff,0x6f,0x5b,0x6b,0xff,0x45,0x43,0x46,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x48, 0x45,0x49,0xff,0x49,0x46,0x4a,0xfc,0x33,0x31,0x34,0xf9,0x00,0x00,0x00,0xf1,0x00, 0x00,0x00,0xe2,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0xc6,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xf2,0x02, 0x02,0x02,0xfa,0x03,0x02,0x03,0xfd,0x00,0x00,0x00,0xfe,0x10,0x0d,0x10,0xfe,0x4e, 0x41,0x4d,0xfe,0x6d,0x5b,0x6c,0xfe,0x59,0x4e,0x59,0xfe,0x51,0x4a,0x51,0xfe,0x54, 0x4c,0x54,0xfe,0x4e,0x48,0x4f,0xfe,0x33,0x35,0x35,0xff,0x11,0x1b,0x14,0xff,0x2b, 0x2a,0x26,0xff,0x6c,0x52,0x5f,0xff,0x55,0x4a,0x52,0xff,0x25,0x30,0x25,0xff,0x2d, 0x35,0x2e,0xff,0x33,0x38,0x35,0xff,0x42,0x41,0x43,0xff,0x47,0x44,0x48,0xff,0x45, 0x43,0x46,0xff,0x46,0x43,0x47,0xff,0x47,0x44,0x48,0xff,0x47,0x44,0x48,0xff,0x43, 0x42,0x44,0xff,0x42,0x41,0x43,0xff,0x44,0x42,0x45,0xfe,0x43,0x42,0x44,0xfb,0x49, 0x47,0x4a,0xf4,0x20,0x1e,0x21,0xe4,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x8b,0x01,0x01,0x01,0xb1,0x02,0x01,0x02,0xcf,0x00, 0x00,0x00,0xe4,0x23,0x1b,0x22,0xf2,0x4a,0x3c,0x49,0xf9,0x4b,0x3e,0x4b,0xfc,0x4a, 0x3c,0x49,0xfe,0x4e,0x45,0x4d,0xff,0x4b,0x47,0x4b,0xff,0x47,0x44,0x47,0xff,0x47, 0x44,0x47,0xff,0x46,0x43,0x47,0xff,0x44,0x42,0x45,0xff,0x3f,0x40,0x40,0xff,0x53, 0x4b,0x53,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x51,0x5d,0xff,0x5d,0x52,0x5e,0xff,0x60, 0x53,0x60,0xff,0x5e,0x52,0x5e,0xff,0x5d,0x4f,0x61,0xff,0x89,0x69,0x6b,0xff,0xa9, 0x8a,0x81,0xff,0xad,0x90,0x87,0xff,0xac,0x8f,0x86,0xff,0xac,0x8f,0x86,0xff,0xac, 0x8f,0x86,0xff,0xac,0x8f,0x86,0xff,0xac,0x8f,0x86,0xff,0xab,0x8e,0x84,0xff,0xa9, 0x8b,0x81,0xff,0xa7,0x89,0x7f,0xff,0x97,0x76,0x69,0xff,0x82,0x63,0x71,0xff,0x9e, 0x7e,0x78,0xff,0xa2,0x82,0x78,0xff,0xa2,0x82,0x78,0xff,0xa2,0x82,0x78,0xff,0xa2, 0x83,0x79,0xff,0xa2,0x82,0x78,0xff,0xa2,0x82,0x78,0xff,0xa2,0x82,0x78,0xff,0xa2, 0x83,0x78,0xff,0xa2,0x83,0x79,0xff,0xa0,0x81,0x77,0xff,0x9e,0x7d,0x70,0xff,0x82, 0x69,0x77,0xfd,0x4c,0x47,0x45,0xfa,0x4f,0x48,0x4c,0xf3,0x16,0x14,0x19,0xe4,0x01, 0x01,0x01,0xcb,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x8d,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xdc,0x03, 0x03,0x03,0xed,0x2c,0x28,0x2c,0xf8,0x59,0x51,0x5a,0xfc,0x51,0x4a,0x51,0xfe,0x51, 0x4a,0x51,0xff,0x50,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d,0x48,0x4d,0xff,0x4c, 0x47,0x4c,0xff,0x44,0x42,0x45,0xfe,0x2a,0x32,0x2a,0xfe,0x29,0x33,0x2a,0xfd,0x2a, 0x33,0x2a,0xfa,0x2c,0x34,0x2c,0xf4,0x1b,0x22,0x1b,0xe8,0x01,0x01,0x01,0xd6,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x63,0x00, 0x00,0x00,0x61,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0xb9,0x04, 0x04,0x04,0xd8,0x23,0x25,0x23,0xee,0x48,0x47,0x49,0xf8,0x48,0x45,0x49,0xfd,0x46, 0x43,0x48,0xff,0x3f,0x3c,0x40,0xff,0x3f,0x3c,0x40,0xff,0x4a,0x46,0x4b,0xff,0x4c, 0x47,0x4c,0xff,0x45,0x41,0x45,0xff,0x44,0x40,0x45,0xff,0x4e,0x49,0x4e,0xff,0x4e, 0x48,0x4e,0xff,0x47,0x42,0x48,0xff,0x3f,0x3b,0x40,0xff,0x45,0x40,0x45,0xff,0x4e, 0x49,0x4e,0xff,0x40,0x40,0x41,0xff,0x32,0x38,0x33,0xff,0x33,0x38,0x34,0xfd,0x36, 0x3b,0x36,0xfb,0x2a,0x2e,0x2b,0xf3,0x0a,0x0b,0x0b,0xe5,0x00,0x00,0x00,0xcf,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x72,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0xbf,0x0b,0x0b,0x0b,0xde,0x36,0x34,0x37,0xf0,0x4b, 0x48,0x4c,0xfa,0x48,0x45,0x48,0xfe,0x48,0x45,0x48,0xff,0x47,0x44,0x47,0xff,0x47, 0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x49,0x46,0x4a,0xff,0x2d,0x34,0x2d,0xff,0x2c, 0x34,0x2d,0xff,0x2d,0x34,0x2d,0xff,0x4c,0x46,0x4d,0xff,0x77,0x60,0x71,0xff,0x77, 0x60,0x72,0xff,0x5d,0x51,0x5d,0xff,0x50,0x4a,0x50,0xff,0x50,0x4a,0x50,0xff,0x53, 0x4b,0x54,0xff,0x54,0x4c,0x54,0xff,0x52,0x4a,0x52,0xff,0x51,0x4a,0x51,0xff,0x53, 0x4b,0x53,0xff,0x46,0x44,0x46,0xff,0x37,0x3b,0x37,0xff,0x32,0x38,0x33,0xff,0x0d, 0x0f,0x0e,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x25,0x28,0x25,0xff,0x45, 0x44,0x46,0xff,0x48,0x45,0x48,0xff,0x46,0x44,0x47,0xff,0x49,0x45,0x49,0xff,0x40, 0x41,0x41,0xff,0x3d,0x3d,0x3e,0xff,0x47,0x44,0x48,0xff,0x50,0x4a,0x51,0xff,0x55, 0x4c,0x54,0xff,0x51,0x4b,0x52,0xff,0x4d,0x48,0x4e,0xff,0x50,0x49,0x50,0xff,0x53, 0x4b,0x52,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x54,0x4c,0x55,0xff,0x37, 0x3b,0x39,0xff,0x71,0x5d,0x6a,0xff,0x5c,0x51,0x5c,0xff,0x53,0x4b,0x53,0xff,0x53, 0x4b,0x52,0xfe,0x45,0x43,0x46,0xfc,0x34,0x39,0x34,0xf7,0x05,0x05,0x05,0xef,0x00, 0x00,0x00,0xe5,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0xdf,0x00, 0x00,0x00,0xea,0x3d,0x38,0x3e,0xf3,0x54,0x4b,0x55,0xf9,0x45,0x44,0x45,0xfd,0x3c, 0x3f,0x3d,0xfe,0x4d,0x48,0x4e,0xff,0x2a,0x33,0x2a,0xff,0x26,0x2f,0x26,0xff,0x23, 0x2d,0x24,0xff,0x30,0x36,0x31,0xff,0x2b,0x34,0x2b,0xff,0x2a,0x33,0x2a,0xff,0x31, 0x37,0x30,0xff,0x14,0x21,0x17,0xff,0x7f,0x64,0x6f,0xff,0x81,0x6c,0x7e,0xff,0x77, 0x71,0x75,0xff,0x51,0x4c,0x50,0xff,0x67,0x5c,0x60,0xff,0x57,0x50,0x54,0xff,0x48, 0x45,0x49,0xff,0x48,0x45,0x49,0xff,0x4a,0x46,0x4b,0xff,0x3e,0x3b,0x3e,0xff,0x00, 0x00,0x00,0xff,0x03,0x02,0x02,0xff,0x35,0x2c,0x2d,0xfe,0x2f,0x27,0x28,0xfb,0x06, 0x05,0x06,0xf8,0x0d,0x0b,0x0b,0xf2,0x17,0x12,0x13,0xed,0x17,0x13,0x14,0xea,0x00, 0x00,0x00,0xe8,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xf0,0x04,0x03,0x04,0xf6,0x33, 0x2a,0x32,0xfb,0x66,0x58,0x67,0xfd,0x52,0x4b,0x53,0xfe,0x55,0x4d,0x56,0xff,0x55, 0x4c,0x56,0xff,0x59,0x4f,0x5a,0xff,0x56,0x4d,0x57,0xff,0x56,0x4d,0x57,0xff,0x57, 0x4d,0x57,0xff,0x72,0x5c,0x6f,0xff,0x75,0x5e,0x6f,0xff,0x4e,0x49,0x4f,0xff,0x4e, 0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4d,0xff,0x4a,0x47,0x4c,0xff,0x48, 0x45,0x4a,0xff,0x47,0x44,0x48,0xff,0x48,0x45,0x49,0xff,0x47,0x44,0x47,0xff,0x47, 0x44,0x47,0xff,0x48,0x45,0x49,0xff,0x49,0x46,0x49,0xff,0x4c,0x49,0x4b,0xfe,0x31, 0x2e,0x31,0xfb,0x00,0x00,0x00,0xf6,0x07,0x06,0x06,0xee,0x03,0x02,0x03,0xe4,0x01, 0x01,0x01,0xdb,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xe2,0x03, 0x02,0x03,0xed,0x04,0x03,0x04,0xf6,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x06,0x05,0x06,0xfd,0x15,0x11,0x15,0xfc,0x1e, 0x19,0x1d,0xfc,0x2b,0x24,0x2b,0xfc,0x46,0x3f,0x45,0xfd,0x4d,0x45,0x4c,0xfe,0x36, 0x31,0x36,0xfe,0x40,0x36,0x38,0xff,0x6e,0x52,0x5f,0xff,0x66,0x55,0x5e,0xff,0x21, 0x2d,0x22,0xff,0x27,0x31,0x27,0xff,0x28,0x31,0x28,0xff,0x2a,0x32,0x2a,0xff,0x38, 0x3a,0x38,0xff,0x44,0x43,0x46,0xff,0x42,0x42,0x43,0xff,0x43,0x41,0x44,0xff,0x45, 0x43,0x46,0xff,0x44,0x43,0x45,0xff,0x43,0x42,0x44,0xff,0x43,0x42,0x44,0xff,0x43, 0x42,0x44,0xfd,0x46,0x45,0x47,0xfa,0x3d,0x39,0x3d,0xf1,0x13,0x10,0x13,0xde,0x00, 0x00,0x00,0xbf,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0xd2,0x1d,0x17,0x1c,0xe5,0x4a, 0x3c,0x49,0xf2,0x4f,0x40,0x4d,0xf9,0x49,0x3b,0x48,0xfd,0x4a,0x43,0x4b,0xfe,0x49, 0x46,0x4a,0xff,0x47,0x44,0x48,0xff,0x46,0x43,0x46,0xff,0x44,0x42,0x45,0xff,0x42, 0x41,0x43,0xff,0x4a,0x46,0x4b,0xff,0x5a,0x50,0x5b,0xff,0x5f,0x52,0x60,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5d, 0x51,0x5d,0xff,0x5d,0x52,0x5e,0xff,0x60,0x53,0x60,0xff,0x5d,0x52,0x5e,0xff,0x6b, 0x59,0x6b,0xff,0x5a,0x4e,0x58,0xff,0x51,0x4a,0x4e,0xff,0x53,0x4c,0x50,0xff,0x51, 0x4b,0x4f,0xff,0x51,0x4b,0x4f,0xff,0x4f,0x4a,0x4d,0xff,0x4f,0x4a,0x4d,0xff,0x4e, 0x49,0x4c,0xff,0x4c,0x48,0x4a,0xff,0x4a,0x47,0x49,0xff,0x4e,0x4a,0x4c,0xff,0x24, 0x2c,0x22,0xff,0x44,0x43,0x45,0xff,0x49,0x46,0x47,0xff,0x49,0x46,0x47,0xff,0x47, 0x45,0x44,0xff,0x48,0x46,0x46,0xff,0x49,0x46,0x47,0xff,0x46,0x44,0x44,0xff,0x43, 0x42,0x40,0xff,0x3c,0x3e,0x3b,0xff,0x38,0x3b,0x35,0xff,0x38,0x3b,0x35,0xff,0x36, 0x3a,0x33,0xff,0x37,0x3a,0x33,0xfe,0x39,0x3c,0x3b,0xfc,0x44,0x43,0x47,0xf6,0x30, 0x2d,0x32,0xea,0x02,0x02,0x02,0xd5,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x8e,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x90,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xbc,0x00, 0x00,0x00,0xcf,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xee,0x0a,0x09,0x0a,0xf8,0x48, 0x42,0x48,0xfd,0x55,0x4d,0x55,0xfe,0x51,0x4a,0x51,0xff,0x52,0x4b,0x52,0xff,0x50, 0x4a,0x50,0xff,0x4c,0x48,0x4d,0xfe,0x4c,0x47,0x4c,0xfe,0x47,0x44,0x48,0xfd,0x36, 0x3a,0x37,0xfb,0x29,0x32,0x29,0xf8,0x2b,0x34,0x2b,0xf2,0x1d,0x23,0x1e,0xe9,0x02, 0x02,0x02,0xd7,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x7e,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xcd,0x0e,0x10,0x0e,0xe7,0x3f, 0x40,0x3f,0xf6,0x4a,0x46,0x4a,0xfc,0x43,0x41,0x44,0xff,0x42,0x40,0x44,0xff,0x46, 0x43,0x47,0xff,0x49,0x46,0x4a,0xff,0x4a,0x46,0x4b,0xff,0x47,0x43,0x48,0xff,0x47, 0x43,0x47,0xff,0x4c,0x48,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x47, 0x44,0x49,0xff,0x49,0x45,0x4a,0xff,0x4b,0x47,0x4c,0xff,0x44,0x42,0x44,0xff,0x37, 0x3b,0x38,0xff,0x34,0x3a,0x35,0xfd,0x2a,0x2e,0x2a,0xf9,0x0e,0x0f,0x0e,0xef,0x00, 0x00,0x00,0xdc,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x64,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0xdd,0x2b,0x29,0x2b,0xf0,0x4c,0x49,0x4c,0xf9,0x47,0x44,0x47,0xfd,0x47, 0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x48, 0x45,0x48,0xff,0x36,0x3a,0x36,0xff,0x2e,0x35,0x2e,0xff,0x56,0x4d,0x56,0xff,0x6d, 0x5a,0x6c,0xff,0x55,0x4c,0x56,0xff,0x4b,0x47,0x4b,0xff,0x4c,0x47,0x4d,0xff,0x4e, 0x48,0x4f,0xff,0x4f,0x49,0x50,0xff,0x50,0x4a,0x51,0xff,0x51,0x4a,0x51,0xff,0x51, 0x4a,0x51,0xff,0x50,0x49,0x50,0xff,0x4f,0x4a,0x51,0xff,0x4a,0x46,0x4b,0xff,0x39, 0x3d,0x3a,0xff,0x21,0x26,0x23,0xff,0x06,0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x18,0x1b,0x18,0xff,0x41,0x40,0x41,0xff,0x49,0x45,0x49,0xff,0x47, 0x44,0x47,0xff,0x47,0x44,0x47,0xff,0x4c,0x48,0x4c,0xff,0x1d,0x26,0x1f,0xff,0x33, 0x36,0x34,0xff,0x5f,0x51,0x5d,0xff,0x6a,0x58,0x68,0xff,0x62,0x54,0x62,0xff,0x5f, 0x51,0x5c,0xff,0x52,0x4a,0x52,0xff,0x4e,0x49,0x4f,0xff,0x52,0x4b,0x52,0xff,0x56, 0x4d,0x57,0xff,0x40,0x41,0x41,0xff,0x21,0x2d,0x26,0xff,0x89,0x68,0x60,0xff,0x5e, 0x51,0x57,0xff,0x50,0x4a,0x51,0xff,0x50,0x4a,0x51,0xfe,0x48,0x46,0x49,0xfb,0x2d, 0x32,0x2e,0xf5,0x04,0x04,0x04,0xe8,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xcf,0x00, 0x00,0x00,0xcc,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xe0,0x02,0x02,0x02,0xed,0x25, 0x21,0x26,0xf7,0x3f,0x3d,0x40,0xfc,0x3e,0x3f,0x3e,0xfe,0x41,0x41,0x42,0xff,0x38, 0x3c,0x38,0xff,0x2c,0x34,0x2c,0xff,0x25,0x30,0x26,0xff,0x30,0x37,0x31,0xff,0x2d, 0x33,0x2d,0xff,0x39,0x3c,0x38,0xff,0x44,0x44,0x3d,0xff,0x67,0x68,0x64,0xff,0xba, 0xa3,0xa5,0xff,0xaa,0xa0,0xa5,0xff,0x91,0x89,0x8b,0xff,0x59,0x51,0x55,0xff,0x5e, 0x55,0x58,0xff,0x58,0x52,0x55,0xff,0x47,0x45,0x48,0xff,0x47,0x44,0x47,0xff,0x48, 0x45,0x48,0xff,0x3e,0x3b,0x3e,0xff,0x00,0x00,0x00,0xff,0x02,0x01,0x01,0xff,0x26, 0x20,0x20,0xfe,0x2f,0x28,0x29,0xfe,0x2b,0x24,0x24,0xfc,0x20,0x1b,0x1c,0xfb,0x23, 0x1d,0x1e,0xf8,0x23,0x1d,0x1e,0xf6,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0xf6,0x00, 0x00,0x00,0xf9,0x02,0x02,0x02,0xfb,0x23,0x1d,0x23,0xfd,0x60,0x54,0x60,0xfe,0x4e, 0x49,0x4f,0xff,0x52,0x4a,0x52,0xff,0x55,0x4c,0x56,0xff,0x59,0x4e,0x59,0xff,0x59, 0x4f,0x5a,0xff,0x4d,0x47,0x4e,0xff,0x3c,0x3d,0x3c,0xff,0x6f,0x5b,0x6d,0xff,0x51, 0x4a,0x51,0xff,0x4e,0x49,0x4f,0xff,0x4d,0x48,0x4e,0xff,0x4c,0x47,0x4d,0xff,0x4a, 0x46,0x4b,0xff,0x49,0x46,0x4a,0xff,0x46,0x44,0x47,0xff,0x47,0x44,0x48,0xff,0x47, 0x44,0x47,0xff,0x47,0x45,0x48,0xff,0x48,0x45,0x49,0xff,0x47,0x44,0x48,0xff,0x4d, 0x49,0x4c,0xff,0x63,0x5a,0x5c,0xff,0x43,0x3b,0x3d,0xfd,0x0f,0x0d,0x0d,0xfa,0x2d, 0x26,0x27,0xf7,0x26,0x21,0x22,0xf1,0x15,0x12,0x13,0xed,0x00,0x00,0x00,0xea,0x00, 0x00,0x00,0xec,0x00,0x00,0x00,0xf0,0x10,0x0f,0x0f,0xf6,0x26,0x21,0x22,0xfa,0x09, 0x08,0x08,0xfd,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0xfa,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xfa,0x2e, 0x27,0x24,0xfc,0x86,0x6c,0x6d,0xfe,0x94,0x73,0x77,0xff,0x9d,0x7d,0x6f,0xff,0x8e, 0x70,0x75,0xff,0x53,0x4a,0x55,0xff,0x1f,0x2c,0x20,0xff,0x27,0x30,0x27,0xff,0x27, 0x30,0x27,0xff,0x2a,0x33,0x2a,0xff,0x3b,0x3d,0x3b,0xff,0x46,0x44,0x48,0xff,0x42, 0x40,0x43,0xff,0x41,0x3f,0x42,0xff,0x43,0x41,0x44,0xff,0x45,0x43,0x46,0xff,0x45, 0x43,0x46,0xff,0x44,0x43,0x45,0xff,0x43,0x42,0x44,0xfd,0x49,0x48,0x4a,0xf9,0x2c, 0x29,0x2d,0xef,0x03,0x01,0x03,0xda,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0x93,0x00, 0x00,0x00,0x6a,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0xb7,0x03,0x02,0x02,0xd3,0x33,0x29,0x32,0xe6,0x4f,0x40,0x4f,0xf2,0x4d, 0x43,0x4d,0xf9,0x4b,0x46,0x4b,0xfc,0x49,0x46,0x4a,0xfe,0x47,0x44,0x48,0xff,0x46, 0x43,0x46,0xff,0x43,0x42,0x44,0xff,0x41,0x40,0x42,0xff,0x55,0x4c,0x56,0xff,0x5f, 0x52,0x60,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x60, 0x53,0x60,0xff,0x5f,0x52,0x60,0xff,0x5d,0x51,0x5d,0xff,0x60,0x53,0x5f,0xff,0x5d, 0x51,0x5d,0xff,0x62,0x54,0x62,0xff,0x6a,0x58,0x69,0xff,0x50,0x4a,0x51,0xff,0x49, 0x45,0x4a,0xff,0x4b,0x46,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x4b,0x46,0x4d,0xff,0x4a, 0x45,0x4b,0xff,0x4a,0x45,0x4b,0xff,0x49,0x45,0x4a,0xff,0x46,0x43,0x48,0xff,0x45, 0x43,0x47,0xff,0x4a,0x46,0x4b,0xff,0x06,0x15,0x0c,0xff,0x6c,0x58,0x67,0xff,0x4d, 0x47,0x4d,0xff,0x42,0x42,0x44,0xff,0x43,0x42,0x45,0xff,0x45,0x42,0x46,0xff,0x40, 0x40,0x42,0xff,0x3e,0x3f,0x40,0xff,0x3a,0x3d,0x3b,0xff,0x35,0x39,0x37,0xff,0x31, 0x36,0x32,0xff,0x31,0x37,0x33,0xff,0x2f,0x36,0x31,0xfe,0x35,0x39,0x37,0xfd,0x45, 0x43,0x46,0xf9,0x4c,0x44,0x4d,0xef,0x08,0x07,0x08,0xde,0x00,0x00,0x00,0xc3,0x00, 0x00,0x00,0x9e,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x1d,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x73,0x00, 0x00,0x00,0x92,0x01,0x01,0x01,0xaa,0x05,0x05,0x05,0xba,0x04,0x04,0x04,0xc3,0x00, 0x00,0x00,0xcc,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0xea,0x00, 0x00,0x00,0xf4,0x01,0x01,0x01,0xfa,0x1c,0x1a,0x1c,0xfd,0x55,0x4d,0x55,0xfe,0x57, 0x50,0x57,0xff,0x55,0x4f,0x56,0xff,0x55,0x4e,0x56,0xfe,0x53,0x4e,0x53,0xfc,0x51, 0x4d,0x51,0xf9,0x4f,0x4b,0x50,0xf7,0x49,0x48,0x4a,0xf3,0x2e,0x37,0x2e,0xee,0x20, 0x26,0x21,0xe4,0x04,0x05,0x05,0xd5,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xa1,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0xc4,0x04,0x05,0x04,0xe1,0x28,0x29,0x28,0xf3,0x4c,0x49,0x4c,0xfb,0x4b, 0x48,0x4c,0xfe,0x4c,0x49,0x4d,0xff,0x4e,0x4a,0x4e,0xff,0x4e,0x4a,0x4e,0xff,0x4e, 0x4b,0x4f,0xff,0x4e,0x4a,0x4f,0xff,0x4f,0x4b,0x50,0xff,0x4e,0x4a,0x4f,0xff,0x4f, 0x4b,0x50,0xff,0x4e,0x4a,0x4f,0xff,0x4e,0x4b,0x4f,0xff,0x4f,0x4b,0x50,0xff,0x4f, 0x4b,0x4f,0xff,0x4d,0x4a,0x4d,0xff,0x42,0x45,0x43,0xfe,0x2c,0x32,0x2d,0xfc,0x0f, 0x11,0x0f,0xf7,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0xa7,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x78,0x00, 0x00,0x00,0x76,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x99,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xe2,0x1f,0x1e,0x1f,0xf1,0x4b, 0x48,0x4b,0xf9,0x4e,0x4a,0x4e,0xfd,0x4c,0x49,0x4c,0xff,0x4c,0x49,0x4c,0xff,0x4d, 0x49,0x4d,0xff,0x4e,0x4a,0x4e,0xff,0x44,0x44,0x44,0xff,0x3e,0x42,0x3f,0xff,0x5e, 0x54,0x5e,0xff,0x72,0x5f,0x71,0xff,0x58,0x51,0x58,0xff,0x4c,0x49,0x4d,0xff,0x50, 0x4c,0x51,0xff,0x52,0x4d,0x52,0xff,0x52,0x4d,0x52,0xff,0x54,0x4e,0x55,0xff,0x55, 0x4e,0x56,0xff,0x55,0x4e,0x56,0xff,0x55,0x4f,0x56,0xff,0x55,0x4f,0x56,0xff,0x52, 0x4d,0x54,0xff,0x55,0x4e,0x56,0xff,0x41,0x43,0x3f,0xff,0x10,0x13,0x11,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x0c,0x0f,0x0c,0xff,0x3b, 0x3b,0x3b,0xff,0x4d,0x4a,0x4d,0xff,0x4d,0x49,0x4d,0xff,0x4d,0x49,0x4d,0xff,0x4e, 0x4a,0x4e,0xff,0x46,0x46,0x47,0xff,0x38,0x3d,0x38,0xff,0x36,0x3c,0x36,0xff,0x28, 0x32,0x29,0xff,0x35,0x3a,0x38,0xff,0x71,0x5d,0x67,0xff,0x5c,0x53,0x5b,0xff,0x5d, 0x54,0x5e,0xff,0x5b,0x52,0x5b,0xff,0x5a,0x51,0x5a,0xff,0x5f,0x55,0x60,0xff,0x2a, 0x34,0x2d,0xff,0x7c,0x60,0x67,0xff,0x62,0x55,0x5e,0xff,0x58,0x51,0x59,0xfe,0x5a, 0x51,0x5a,0xfd,0x56,0x50,0x57,0xfa,0x27,0x29,0x28,0xf3,0x03,0x03,0x03,0xe6,0x00, 0x00,0x00,0xd6,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xcd,0x00, 0x00,0x00,0xdc,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xf5,0x1b,0x18,0x1c,0xfb,0x2b, 0x26,0x2c,0xfe,0x30,0x2c,0x30,0xff,0x35,0x30,0x36,0xff,0x20,0x26,0x20,0xff,0x18, 0x21,0x18,0xff,0x10,0x17,0x11,0xff,0x16,0x18,0x16,0xff,0x3a,0x33,0x33,0xff,0x4f, 0x49,0x49,0xff,0x7f,0x7a,0x7b,0xff,0x9c,0x80,0x87,0xff,0x53,0x4f,0x54,0xff,0x50, 0x4b,0x51,0xff,0x4e,0x4a,0x4e,0xff,0x4d,0x49,0x4d,0xff,0x4e,0x4a,0x4e,0xff,0x4e, 0x4a,0x4e,0xff,0x4e,0x4a,0x4e,0xff,0x4e,0x4a,0x4e,0xff,0x41,0x3d,0x41,0xff,0x00, 0x00,0x00,0xff,0x01,0x01,0x01,0xff,0x12,0x0f,0x0f,0xff,0x16,0x13,0x13,0xff,0x0b, 0x09,0x09,0xfe,0x00,0x00,0x00,0xfe,0x0f,0x0e,0x0e,0xfd,0x1c,0x17,0x17,0xfc,0x01, 0x02,0x01,0xfc,0x02,0x02,0x01,0xfc,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0xfd,0x15, 0x12,0x14,0xfe,0x69,0x5c,0x69,0xff,0x59,0x51,0x5a,0xff,0x5c,0x53,0x5e,0xff,0x5f, 0x54,0x60,0xff,0x62,0x57,0x63,0xff,0x60,0x55,0x61,0xff,0x47,0x46,0x48,0xff,0x50, 0x4b,0x50,0xff,0x5d,0x53,0x5e,0xff,0x5a,0x51,0x5a,0xff,0x59,0x51,0x5a,0xff,0x55, 0x4e,0x57,0xff,0x55,0x4e,0x56,0xff,0x54,0x4e,0x53,0xff,0x51,0x4c,0x52,0xff,0x50, 0x4b,0x51,0xff,0x4f,0x4b,0x50,0xff,0x4f,0x4a,0x50,0xff,0x4d,0x49,0x4e,0xff,0x50, 0x4b,0x51,0xff,0x4e,0x4a,0x4f,0xff,0x52,0x4d,0x52,0xff,0x49,0x44,0x48,0xff,0x1b, 0x19,0x1c,0xfe,0x00,0x00,0x00,0xfd,0x0c,0x0a,0x0b,0xfc,0x26,0x21,0x22,0xf9,0x26, 0x20,0x21,0xf7,0x1b,0x17,0x17,0xf7,0x18,0x14,0x15,0xf7,0x10,0x0d,0x0d,0xf9,0x0a, 0x08,0x09,0xfb,0x1e,0x19,0x1a,0xfd,0x29,0x23,0x23,0xfd,0x1a,0x17,0x17,0xfe,0x13, 0x10,0x10,0xfd,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xf7,0x00, 0x00,0x00,0xf7,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xfb,0x36,0x2b,0x26,0xfd,0x8f, 0x6e,0x64,0xfe,0xa2,0x7c,0x70,0xfe,0x97,0x72,0x73,0xff,0x5b,0x4c,0x52,0xff,0x1e, 0x2c,0x20,0xff,0x28,0x31,0x28,0xff,0x28,0x30,0x28,0xff,0x2c,0x33,0x2c,0xff,0x3d, 0x3e,0x3d,0xff,0x49,0x46,0x4a,0xff,0x47,0x45,0x48,0xff,0x46,0x44,0x47,0xff,0x47, 0x44,0x48,0xff,0x48,0x46,0x49,0xff,0x4a,0x48,0x4b,0xff,0x4b,0x49,0x4c,0xff,0x4e, 0x4b,0x4f,0xfd,0x4a,0x46,0x4a,0xf9,0x1c,0x1a,0x1c,0xef,0x00,0x00,0x00,0xdb,0x00, 0x00,0x00,0xbe,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x5f,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xb8,0x03, 0x02,0x03,0xd1,0x2a,0x22,0x29,0xe3,0x44,0x3e,0x44,0xee,0x4c,0x48,0x4d,0xf6,0x4e, 0x4a,0x4e,0xfb,0x4b,0x48,0x4c,0xfe,0x4b,0x48,0x4d,0xfe,0x44,0x44,0x45,0xff,0x4a, 0x47,0x4b,0xff,0x5b,0x50,0x5c,0xff,0x5f,0x52,0x60,0xff,0x5e,0x52,0x5f,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x60,0x53,0x60,0xff,0x5f,0x52,0x5f,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5c,0x51,0x5e,0xff,0x6d,0x5b,0x6d,0xff,0x59, 0x4e,0x58,0xff,0x4c,0x47,0x4c,0xff,0x4d,0x48,0x4d,0xff,0x4d,0x48,0x4f,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4d,0xff,0x4d, 0x48,0x4e,0xff,0x4c,0x46,0x4c,0xff,0x48,0x45,0x49,0xff,0x50,0x4a,0x51,0xff,0x0d, 0x1c,0x11,0xff,0x83,0x61,0x6a,0xff,0x56,0x4d,0x53,0xff,0x47,0x45,0x49,0xff,0x49, 0x45,0x4a,0xff,0x48,0x44,0x48,0xff,0x45,0x42,0x46,0xff,0x3f,0x3f,0x40,0xff,0x3b, 0x3d,0x3b,0xff,0x37,0x3a,0x37,0xff,0x34,0x39,0x35,0xff,0x34,0x39,0x34,0xff,0x39, 0x3c,0x3a,0xfd,0x42,0x41,0x43,0xfb,0x53,0x4c,0x54,0xf3,0x1e,0x1a,0x1e,0xe6,0x01, 0x01,0x01,0xcd,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xb7,0x07,0x07,0x07,0xcd,0x37, 0x37,0x37,0xdb,0x0c,0x0c,0x0c,0xe1,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xe9,0x00, 0x00,0x00,0xee,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xfd,0x05, 0x05,0x05,0xfd,0x27,0x24,0x27,0xfe,0x36,0x33,0x37,0xff,0x35,0x31,0x36,0xfe,0x34, 0x31,0x35,0xfb,0x34,0x31,0x35,0xf8,0x33,0x30,0x32,0xf3,0x31,0x2f,0x31,0xec,0x2f, 0x2e,0x2f,0xe5,0x1e,0x21,0x1e,0xdb,0x08,0x09,0x08,0xcf,0x00,0x00,0x00,0xbc,0x00, 0x00,0x00,0xa2,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xdd,0x0c, 0x0d,0x0c,0xf1,0x26,0x27,0x26,0xfa,0x31,0x2e,0x31,0xfe,0x2f,0x2d,0x2f,0xff,0x30, 0x2e,0x30,0xff,0x30,0x2e,0x30,0xff,0x30,0x2e,0x30,0xff,0x30,0x2e,0x30,0xff,0x30, 0x2e,0x30,0xff,0x31,0x2f,0x31,0xff,0x31,0x2f,0x31,0xff,0x32,0x2f,0x32,0xff,0x31, 0x2f,0x32,0xff,0x30,0x2e,0x30,0xff,0x31,0x2f,0x31,0xff,0x30,0x2e,0x31,0xff,0x27, 0x29,0x29,0xfe,0x0f,0x12,0x0f,0xfc,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xef,0x00, 0x00,0x00,0xdf,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xa9,0x00, 0x00,0x00,0xa1,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0xb0,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xdb,0x00, 0x00,0x00,0xea,0x0c,0x0d,0x0c,0xf4,0x29,0x28,0x28,0xfa,0x32,0x30,0x32,0xfd,0x2f, 0x2d,0x2f,0xff,0x2f,0x2d,0x2f,0xff,0x30,0x2e,0x30,0xff,0x31,0x2f,0x31,0xff,0x2a, 0x2a,0x2a,0xff,0x2e,0x2c,0x2e,0xff,0x32,0x2f,0x33,0xff,0x2e,0x2d,0x2f,0xff,0x2f, 0x2d,0x2f,0xff,0x31,0x2f,0x31,0xff,0x32,0x2f,0x32,0xff,0x33,0x30,0x33,0xff,0x33, 0x30,0x33,0xff,0x34,0x31,0x34,0xff,0x33,0x30,0x35,0xff,0x32,0x2f,0x33,0xff,0x32, 0x2f,0x33,0xff,0x32,0x2e,0x32,0xff,0x3c,0x37,0x3b,0xff,0x4d,0x44,0x48,0xff,0x3e, 0x3a,0x38,0xff,0x10,0x0f,0x0f,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x03,0x04,0x03,0xff,0x1c,0x1b,0x1c,0xff,0x2e,0x2c,0x2e,0xff,0x31, 0x2e,0x31,0xff,0x30,0x2e,0x30,0xff,0x30,0x2e,0x30,0xff,0x31,0x2f,0x31,0xff,0x32, 0x2f,0x32,0xff,0x33,0x30,0x34,0xff,0x1e,0x22,0x20,0xff,0x29,0x2d,0x27,0xff,0x2e, 0x30,0x2b,0xff,0x31,0x30,0x32,0xff,0x49,0x3d,0x49,0xff,0x3c,0x35,0x3c,0xff,0x38, 0x33,0x37,0xff,0x3a,0x34,0x3b,0xff,0x28,0x29,0x29,0xff,0x40,0x37,0x41,0xff,0x3b, 0x34,0x3c,0xff,0x3a,0x34,0x3b,0xff,0x3b,0x34,0x3c,0xfe,0x38,0x34,0x39,0xfb,0x13, 0x14,0x14,0xf5,0x01,0x01,0x01,0xe9,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xd1,0x00, 0x00,0x00,0xce,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xdf,0x01,0x01,0x01,0xed,0x01, 0x01,0x01,0xf6,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x21,0x1b,0x1b,0xff,0x3c,0x39,0x3a,0xff,0x38,0x36,0x36,0xff,0x40, 0x34,0x40,0xff,0x34,0x30,0x34,0xff,0x33,0x30,0x33,0xff,0x34,0x30,0x34,0xff,0x32, 0x2f,0x33,0xff,0x34,0x30,0x34,0xff,0x34,0x30,0x34,0xff,0x34,0x30,0x34,0xff,0x34, 0x30,0x34,0xff,0x2a,0x26,0x2a,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x07,0x06,0x07,0xff,0x1e, 0x19,0x1a,0xfe,0x19,0x15,0x15,0xfe,0x1c,0x17,0x17,0xfe,0x1a,0x16,0x16,0xfe,0x08, 0x07,0x07,0xfe,0x00,0x00,0x00,0xfe,0x06,0x06,0x06,0xff,0x42,0x3a,0x42,0xff,0x3c, 0x35,0x3c,0xff,0x3d,0x36,0x3d,0xff,0x3e,0x36,0x3f,0xff,0x3f,0x37,0x3f,0xff,0x3e, 0x37,0x3e,0xff,0x3b,0x36,0x3b,0xff,0x49,0x40,0x49,0xff,0x46,0x3d,0x46,0xff,0x44, 0x3c,0x45,0xff,0x43,0x3c,0x43,0xff,0x41,0x3a,0x41,0xff,0x40,0x39,0x40,0xff,0x3f, 0x39,0x3f,0xff,0x3d,0x38,0x3d,0xff,0x3d,0x38,0x3d,0xff,0x3b,0x36,0x3b,0xff,0x3c, 0x38,0x3c,0xff,0x3a,0x36,0x3a,0xff,0x3b,0x37,0x3c,0xff,0x3b,0x37,0x3c,0xff,0x3c, 0x38,0x3d,0xff,0x34,0x30,0x34,0xff,0x10,0x0e,0x10,0xff,0x00,0x00,0x00,0xfe,0x01, 0x01,0x01,0xfe,0x09,0x07,0x07,0xfd,0x15,0x13,0x13,0xfd,0x1a,0x16,0x17,0xfc,0x21, 0x1c,0x1d,0xfc,0x1f,0x1b,0x1b,0xfd,0x07,0x07,0x07,0xfd,0x02,0x02,0x02,0xfe,0x19, 0x15,0x15,0xfe,0x2c,0x26,0x26,0xfe,0x29,0x23,0x23,0xfd,0x10,0x0e,0x0e,0xfb,0x00, 0x00,0x00,0xf8,0x01,0x01,0x01,0xf6,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0xfa,0x00,0x00,0x00,0xfd,0x30,0x24,0x21,0xfe,0x8b,0x6b,0x60,0xfe,0x9b, 0x73,0x6d,0xff,0x62,0x4f,0x4b,0xff,0x1f,0x2d,0x23,0xff,0x27,0x30,0x27,0xff,0x28, 0x31,0x28,0xff,0x27,0x30,0x27,0xff,0x27,0x2a,0x27,0xff,0x2c,0x2b,0x2c,0xff,0x35, 0x33,0x35,0xff,0x38,0x36,0x38,0xff,0x34,0x32,0x34,0xff,0x32,0x31,0x34,0xff,0x35, 0x32,0x35,0xff,0x33,0x31,0x34,0xff,0x36,0x33,0x36,0xfd,0x2a,0x26,0x2a,0xf9,0x0a, 0x08,0x0a,0xf1,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xb2,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x4f,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xb4,0x02,0x02,0x02,0xcb,0x12, 0x11,0x13,0xdc,0x2b,0x29,0x2b,0xea,0x32,0x30,0x32,0xf4,0x2f,0x2d,0x2f,0xfa,0x2c, 0x2a,0x2c,0xfc,0x36,0x36,0x37,0xfe,0x55,0x4c,0x56,0xff,0x5f,0x53,0x60,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5f,0x52,0x5f,0xff,0x5e, 0x52,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5f,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x62, 0x54,0x62,0xff,0x67,0x57,0x67,0xff,0x52,0x4a,0x52,0xff,0x4b,0x46,0x4c,0xff,0x4d, 0x48,0x4e,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d, 0x48,0x4e,0xff,0x4c,0x47,0x4d,0xff,0x4c,0x47,0x4d,0xff,0x4b,0x47,0x4c,0xff,0x4b, 0x46,0x4c,0xff,0x4c,0x46,0x4d,0xff,0x30,0x37,0x31,0xff,0x62,0x50,0x52,0xff,0x63, 0x54,0x61,0xff,0x4c,0x47,0x4d,0xff,0x49,0x46,0x4a,0xff,0x48,0x45,0x48,0xff,0x42, 0x42,0x43,0xff,0x3c,0x3e,0x3d,0xff,0x39,0x3b,0x39,0xff,0x34,0x39,0x35,0xff,0x34, 0x39,0x35,0xff,0x37,0x3b,0x37,0xfe,0x3d,0x3e,0x3d,0xfc,0x50,0x4b,0x51,0xf7,0x39, 0x31,0x39,0xeb,0x04,0x03,0x04,0xd6,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x91,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0xb8,0x06, 0x06,0x06,0xd3,0x45,0x45,0x45,0xe5,0x59,0x59,0x59,0xee,0x00,0x00,0x00,0xf4,0x00, 0x00,0x00,0xf5,0x0a,0x0a,0x0a,0xf6,0x1f,0x1f,0x1f,0xf7,0x2d,0x2d,0x2d,0xfa,0x26, 0x26,0x26,0xfc,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xf2,0x00, 0x00,0x00,0xe7,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0xbe,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0xfa,0x00, 0x00,0x00,0xfd,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x07,0x05,0x05,0xff,0x17,0x13,0x14,0xff,0x16,0x12,0x13,0xfd,0x0b, 0x09,0x09,0xfa,0x04,0x03,0x03,0xf4,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xde,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0xcb,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xcb,0x02, 0x02,0x02,0xce,0x02,0x02,0x02,0xd2,0x02,0x02,0x02,0xd6,0x01,0x01,0x01,0xdb,0x00, 0x00,0x00,0xe2,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0xfd,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x06,0x04,0x04,0xff,0x11,0x0e,0x0d,0xff,0x1a, 0x15,0x15,0xff,0x13,0x10,0x0f,0xff,0x13,0x0e,0x0f,0xff,0x24,0x1e,0x1f,0xff,0x0b, 0x09,0x0a,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x11, 0x0e,0x0e,0xff,0x3e,0x34,0x35,0xff,0x20,0x1a,0x1a,0xff,0x03,0x02,0x02,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf1,0x00, 0x00,0x00,0xe7,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0xe1,0x00, 0x00,0x00,0xe9,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x06,0x06,0x06,0xff,0x29, 0x28,0x29,0xff,0x1c,0x1b,0x1c,0xff,0x2f,0x2f,0x2e,0xff,0x60,0x58,0x58,0xff,0x02, 0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x01, 0x01,0x01,0xff,0x16,0x11,0x13,0xff,0x44,0x39,0x3a,0xff,0x14,0x0f,0x10,0xff,0x13, 0x0f,0x10,0xff,0x1b,0x16,0x17,0xff,0x21,0x1c,0x1c,0xff,0x10,0x0c,0x0e,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x01,0x01,0x01,0xff,0x04, 0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x04,0x03,0x04,0xff,0x04,0x03,0x04,0xff,0x04, 0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x04,0x03,0x04,0xff,0x04,0x03,0x04,0xff,0x04, 0x03,0x04,0xff,0x04,0x03,0x04,0xff,0x03,0x03,0x03,0xff,0x03,0x03,0x03,0xff,0x03, 0x03,0x03,0xff,0x03,0x03,0x03,0xff,0x03,0x03,0x03,0xff,0x02,0x02,0x02,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x03,0x02,0x02,0xff,0x09,0x07,0x07,0xff,0x16,0x13,0x13,0xfe,0x3d, 0x34,0x35,0xfd,0x31,0x2a,0x2b,0xfb,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0xf8,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xfd,0x03, 0x02,0x02,0xfe,0x37,0x2a,0x27,0xfe,0x85,0x64,0x5a,0xff,0x6c,0x57,0x50,0xff,0x28, 0x31,0x2c,0xff,0x28,0x31,0x28,0xff,0x2a,0x33,0x2a,0xff,0x1d,0x24,0x1e,0xff,0x05, 0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x04,0x04,0x04,0xff,0x0a,0x0a,0x0a,0xff,0x07, 0x07,0x07,0xff,0x02,0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xfd,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0xdd,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xb1,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0xd6,0x00, 0x00,0x00,0xe8,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0xfa,0x2f,0x2b,0x2f,0xfe,0x5c, 0x51,0x5c,0xff,0x5f,0x53,0x60,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5f, 0x52,0x5f,0xff,0x5f,0x53,0x60,0xff,0x5d,0x51,0x5e,0xff,0x5e,0x52,0x5e,0xff,0x5f, 0x53,0x60,0xff,0x5c,0x51,0x5d,0xff,0x6c,0x5a,0x6c,0xff,0x57,0x4d,0x57,0xff,0x4c, 0x47,0x4c,0xff,0x4d,0x48,0x4d,0xff,0x4d,0x48,0x4e,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4e,0x49,0x4f,0xff,0x4c,0x47,0x4d,0xff,0x4d,0x48,0x4d,0xff,0x4b, 0x46,0x4b,0xff,0x4b,0x46,0x4b,0xff,0x4f,0x49,0x4f,0xff,0x3e,0x3f,0x3e,0xff,0x4c, 0x47,0x4c,0xff,0x29,0x32,0x2c,0xff,0x68,0x57,0x67,0xff,0x4f,0x4a,0x50,0xff,0x46, 0x43,0x46,0xff,0x47,0x43,0x47,0xff,0x3e,0x3f,0x3f,0xff,0x3a,0x3c,0x3b,0xff,0x36, 0x3a,0x37,0xff,0x34,0x39,0x35,0xff,0x33,0x39,0x34,0xff,0x3a,0x3c,0x3b,0xfc,0x45, 0x44,0x46,0xf9,0x4a,0x42,0x4b,0xf0,0x09,0x08,0x08,0xdf,0x00,0x00,0x00,0xc3,0x00, 0x00,0x00,0x9c,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,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,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0xaf,0x01,0x01,0x01,0xd1,0x1f,0x1f,0x1f,0xe6,0x74,0x74,0x74,0xf3,0x1e, 0x1e,0x1e,0xf9,0x04,0x04,0x04,0xfa,0x23,0x23,0x23,0xfc,0x2f,0x2f,0x2f,0xfc,0x2f, 0x2f,0x2f,0xfd,0x2a,0x2a,0x2a,0xfd,0x28,0x28,0x28,0xfe,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfb,0x00, 0x00,0x00,0xf6,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0xce,0x00, 0x00,0x00,0xbc,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x90,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x4d,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xe3,0x05, 0x05,0x05,0xf3,0x23,0x1e,0x1e,0xfb,0x37,0x2e,0x2f,0xfe,0x27,0x21,0x21,0xff,0x0e, 0x0c,0x0c,0xff,0x01,0x01,0x01,0xff,0x06,0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x06, 0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x05,0x04,0x05,0xff,0x05, 0x04,0x05,0xff,0x04,0x03,0x04,0xff,0x06,0x05,0x05,0xff,0x2a,0x24,0x25,0xff,0x4b, 0x40,0x42,0xff,0x34,0x2c,0x2d,0xff,0x26,0x20,0x21,0xfd,0x28,0x23,0x22,0xf9,0x19, 0x15,0x15,0xf4,0x06,0x05,0x05,0xee,0x02,0x02,0x02,0xe9,0x04,0x04,0x04,0xe5,0x00, 0x00,0x00,0xe6,0x09,0x07,0x08,0xe8,0x2c,0x25,0x26,0xea,0x45,0x3a,0x3b,0xec,0x47, 0x3d,0x3e,0xee,0x21,0x1d,0x1e,0xef,0x0a,0x09,0x09,0xf1,0x13,0x10,0x10,0xf5,0x06, 0x05,0x05,0xf9,0x01,0x01,0x01,0xfc,0x06,0x05,0x04,0xfe,0x04,0x03,0x03,0xff,0x04, 0x03,0x04,0xff,0x06,0x04,0x05,0xff,0x01,0x00,0x01,0xff,0x02,0x01,0x01,0xff,0x21, 0x1c,0x1d,0xff,0x4f,0x43,0x44,0xff,0x3a,0x31,0x32,0xff,0x19,0x15,0x15,0xff,0x17, 0x13,0x13,0xff,0x19,0x15,0x15,0xff,0x1a,0x15,0x15,0xff,0x1a,0x16,0x16,0xff,0x1c, 0x18,0x18,0xff,0x1f,0x1a,0x1a,0xff,0x22,0x1c,0x1c,0xff,0x22,0x1d,0x1d,0xff,0x21, 0x1c,0x1c,0xff,0x1d,0x18,0x18,0xff,0x10,0x0e,0x0e,0xff,0x02,0x02,0x02,0xff,0x00, 0x00,0x00,0xff,0x25,0x1f,0x1f,0xff,0x18,0x13,0x14,0xff,0x03,0x03,0x03,0xff,0x03, 0x03,0x03,0xff,0x04,0x04,0x04,0xff,0x06,0x04,0x05,0xff,0x05,0x04,0x05,0xff,0x06, 0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x05, 0x03,0x04,0xff,0x08,0x06,0x07,0xff,0x27,0x22,0x22,0xff,0x30,0x28,0x29,0xff,0x40, 0x36,0x37,0xff,0x30,0x29,0x2a,0xff,0x20,0x1b,0x1c,0xff,0x0d,0x0c,0x0c,0xff,0x02, 0x01,0x01,0xff,0x08,0x06,0x06,0xff,0x05,0x04,0x04,0xff,0x08,0x06,0x07,0xff,0x0e, 0x0b,0x0b,0xff,0x12,0x10,0x0f,0xff,0x14,0x10,0x11,0xff,0x15,0x12,0x12,0xfd,0x0c, 0x0a,0x0b,0xfc,0x03,0x02,0x02,0xf8,0x02,0x02,0x02,0xf3,0x03,0x03,0x03,0xee,0x04, 0x03,0x03,0xed,0x04,0x04,0x04,0xef,0x06,0x04,0x05,0xf3,0x05,0x04,0x05,0xf7,0x06, 0x04,0x05,0xfc,0x06,0x04,0x05,0xfe,0x06,0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x04, 0x02,0x03,0xff,0x0a,0x09,0x09,0xff,0x50,0x4d,0x4e,0xff,0x5a,0x57,0x57,0xff,0x5a, 0x56,0x57,0xff,0x6e,0x64,0x65,0xff,0x07,0x05,0x06,0xff,0x05,0x04,0x04,0xff,0x06, 0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x05,0x04,0x04,0xff,0x05,0x04,0x04,0xff,0x03, 0x03,0x03,0xff,0x02,0x02,0x02,0xff,0x02,0x01,0x01,0xff,0x01,0x01,0x01,0xff,0x01, 0x01,0x01,0xff,0x01,0x01,0x01,0xff,0x01,0x01,0x01,0xff,0x02,0x02,0x02,0xff,0x02, 0x02,0x02,0xff,0x02,0x02,0x02,0xff,0x04,0x04,0x04,0xff,0x3a,0x31,0x32,0xff,0x6b, 0x5b,0x5d,0xff,0x35,0x2c,0x2d,0xff,0x00,0x01,0x01,0xff,0x01,0x01,0x01,0xff,0x0f, 0x0d,0x0d,0xff,0x20,0x1a,0x1b,0xff,0x1d,0x17,0x18,0xff,0x06,0x05,0x06,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02, 0x02,0x02,0xff,0x03,0x03,0x02,0xff,0x04,0x03,0x03,0xff,0x04,0x03,0x03,0xff,0x04, 0x03,0x03,0xff,0x04,0x03,0x03,0xff,0x05,0x04,0x04,0xff,0x06,0x04,0x05,0xff,0x06, 0x04,0x05,0xff,0x03,0x02,0x03,0xff,0x00,0x00,0x00,0xff,0x01,0x00,0x01,0xff,0x05, 0x04,0x04,0xff,0x12,0x0f,0x0f,0xff,0x20,0x1c,0x1c,0xff,0x24,0x1f,0x20,0xff,0x21, 0x1c,0x1c,0xff,0x38,0x30,0x30,0xff,0x59,0x4d,0x4e,0xfe,0x30,0x2a,0x2a,0xfd,0x02, 0x02,0x02,0xfb,0x02,0x02,0x02,0xfb,0x02,0x02,0x02,0xfb,0x02,0x01,0x01,0xfb,0x01, 0x01,0x01,0xfd,0x02,0x02,0x02,0xfe,0x00,0x00,0x00,0xfe,0x08,0x07,0x06,0xff,0x28, 0x1f,0x1c,0xff,0x2e,0x25,0x23,0xff,0x19,0x1b,0x1a,0xff,0x1b,0x20,0x1a,0xff,0x22, 0x28,0x22,0xff,0x15,0x17,0x14,0xff,0x04,0x01,0x03,0xff,0x06,0x04,0x05,0xff,0x04, 0x03,0x03,0xff,0x03,0x02,0x03,0xff,0x03,0x02,0x03,0xff,0x04,0x03,0x03,0xff,0x04, 0x03,0x04,0xff,0x06,0x04,0x05,0xff,0x06,0x04,0x05,0xff,0x06,0x04,0x05,0xfd,0x06, 0x04,0x05,0xfa,0x05,0x04,0x04,0xf5,0x05,0x04,0x04,0xed,0x05,0x03,0x03,0xe6,0x03, 0x03,0x03,0xde,0x02,0x03,0x03,0xd7,0x02,0x01,0x01,0xcc,0x01,0x00,0x00,0xbd,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x82,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xed,0x03, 0x04,0x03,0xf8,0x4a,0x40,0x4a,0xfc,0x64,0x56,0x65,0xff,0x5e,0x52,0x5f,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x60,0x53,0x60,0xff,0x5e,0x51,0x5f,0xff,0x5e, 0x52,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x52,0x5e,0xff,0x62,0x54,0x63,0xff,0x67, 0x57,0x67,0xff,0x50,0x49,0x50,0xff,0x4a,0x46,0x4a,0xff,0x4e,0x49,0x4e,0xff,0x4e, 0x49,0x4f,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4d, 0x48,0x4d,0xff,0x4d,0x48,0x4d,0xff,0x4b,0x46,0x4b,0xff,0x4d,0x48,0x4d,0xff,0x3e, 0x3e,0x3f,0xff,0x40,0x40,0x41,0xff,0x49,0x45,0x4a,0xff,0x41,0x41,0x42,0xff,0x54, 0x4b,0x54,0xff,0x48,0x45,0x48,0xff,0x45,0x43,0x46,0xff,0x40,0x41,0x41,0xff,0x3c, 0x3d,0x3c,0xff,0x39,0x3b,0x39,0xff,0x34,0x39,0x35,0xff,0x34,0x39,0x35,0xff,0x37, 0x3a,0x37,0xfd,0x3e,0x3f,0x3f,0xfb,0x53,0x4c,0x53,0xf3,0x18,0x15,0x19,0xe6,0x01, 0x01,0x01,0xce,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x59,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xc8,0x09,0x09,0x09,0xe1,0x4f, 0x4f,0x4f,0xf0,0x43,0x43,0x43,0xf9,0x16,0x16,0x16,0xfc,0x2f,0x2f,0x2f,0xfe,0x2c, 0x2c,0x2c,0xff,0x16,0x16,0x16,0xff,0x04,0x04,0x04,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0xfd,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0xea,0x00, 0x00,0x00,0xdc,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0x9f,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x7e,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0xb9,0x00, 0x00,0x00,0xd6,0x04,0x03,0x03,0xeb,0x27,0x22,0x22,0xf7,0x59,0x4b,0x4c,0xfc,0x57, 0x4a,0x4b,0xff,0x3c,0x32,0x33,0xff,0x3f,0x35,0x36,0xff,0x1f,0x1b,0x1b,0xff,0x18, 0x14,0x14,0xff,0x1b,0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b,0x17,0x17,0xff,0x1b, 0x16,0x17,0xff,0x1b,0x16,0x17,0xff,0x1b,0x16,0x17,0xff,0x1a,0x15,0x16,0xff,0x2a, 0x24,0x24,0xff,0x40,0x38,0x38,0xff,0x31,0x29,0x29,0xff,0x23,0x1d,0x1d,0xff,0x25, 0x1f,0x20,0xfe,0x2f,0x28,0x29,0xfc,0x3e,0x36,0x36,0xfa,0x3c,0x33,0x33,0xf8,0x21, 0x1c,0x1c,0xf6,0x11,0x0e,0x0e,0xf5,0x1b,0x17,0x18,0xf5,0x30,0x29,0x29,0xf7,0x3d, 0x34,0x35,0xf8,0x5f,0x51,0x52,0xf9,0x7a,0x69,0x6a,0xfa,0x6b,0x5c,0x5d,0xfa,0x59, 0x4d,0x4e,0xfa,0x40,0x37,0x38,0xfb,0x3a,0x32,0x32,0xfd,0x2e,0x26,0x28,0xfe,0x2c, 0x25,0x26,0xff,0x31,0x2a,0x2a,0xff,0x1d,0x17,0x19,0xff,0x15,0x11,0x12,0xff,0x2d, 0x26,0x27,0xff,0x5e,0x51,0x52,0xff,0x8c,0x79,0x7a,0xff,0x96,0x81,0x82,0xff,0x60, 0x52,0x53,0xff,0x36,0x2d,0x2e,0xff,0x32,0x2a,0x2b,0xff,0x33,0x2b,0x2c,0xff,0x33, 0x2b,0x2c,0xff,0x33,0x2b,0x2c,0xff,0x32,0x2b,0x2b,0xff,0x32,0x2a,0x2b,0xff,0x2f, 0x28,0x28,0xff,0x27,0x21,0x21,0xff,0x1b,0x17,0x17,0xff,0x0e,0x0c,0x0c,0xff,0x07, 0x07,0x07,0xff,0x06,0x05,0x05,0xff,0x03,0x03,0x02,0xff,0x19,0x14,0x16,0xff,0x28, 0x22,0x23,0xff,0x17,0x14,0x13,0xff,0x13,0x10,0x10,0xff,0x18,0x14,0x14,0xff,0x1a, 0x16,0x17,0xff,0x1b,0x16,0x17,0xff,0x1b,0x16,0x17,0xff,0x1b,0x17,0x17,0xff,0x1b, 0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b,0x17,0x17,0xff,0x1c, 0x18,0x17,0xff,0x1d,0x19,0x18,0xff,0x3c,0x34,0x34,0xff,0x3d,0x35,0x35,0xff,0x3a, 0x32,0x32,0xff,0x3e,0x35,0x37,0xff,0x3a,0x30,0x32,0xff,0x35,0x2d,0x2d,0xff,0x39, 0x30,0x32,0xff,0x35,0x2e,0x2e,0xff,0x30,0x29,0x29,0xff,0x2a,0x24,0x24,0xff,0x24, 0x1e,0x1e,0xff,0x27,0x21,0x22,0xfe,0x25,0x1f,0x20,0xfd,0x0a,0x08,0x08,0xfc,0x0a, 0x09,0x09,0xfa,0x10,0x0d,0x0d,0xf8,0x15,0x11,0x11,0xf7,0x19,0x15,0x15,0xf9,0x1a, 0x16,0x17,0xfa,0x1b,0x16,0x17,0xfc,0x1b,0x16,0x17,0xfe,0x1b,0x17,0x17,0xff,0x1b, 0x16,0x16,0xff,0x1a,0x15,0x15,0xff,0x27,0x22,0x22,0xff,0x5a,0x54,0x54,0xff,0x71, 0x68,0x69,0xff,0x43,0x3d,0x3d,0xff,0x28,0x23,0x23,0xff,0x26,0x1e,0x1f,0xff,0x1b, 0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1a,0x15,0x16,0xff,0x19, 0x15,0x15,0xff,0x16,0x13,0x13,0xff,0x12,0x0f,0x0f,0xff,0x0d,0x0a,0x0b,0xff,0x08, 0x07,0x07,0xff,0x05,0x04,0x04,0xff,0x04,0x04,0x04,0xff,0x06,0x05,0x05,0xff,0x08, 0x07,0x07,0xff,0x0c,0x0a,0x0b,0xff,0x0e,0x0c,0x0c,0xff,0x0d,0x0b,0x0b,0xff,0x0f, 0x0c,0x0d,0xff,0x67,0x5b,0x5c,0xff,0x98,0x86,0x88,0xff,0x6e,0x62,0x63,0xff,0x34, 0x34,0x34,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x07,0x06,0x06,0xff,0x19, 0x15,0x15,0xff,0x23,0x1c,0x1d,0xff,0x0e,0x0d,0x0c,0xff,0x0b,0x09,0x09,0xff,0x25, 0x1f,0x1f,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x08,0x07,0x07,0xff,0x0d, 0x0b,0x0b,0xff,0x0e,0x0b,0x0b,0xff,0x0e,0x0b,0x0c,0xff,0x0b,0x0a,0x09,0xff,0x08, 0x07,0x06,0xff,0x06,0x05,0x05,0xff,0x06,0x05,0x05,0xff,0x07,0x05,0x05,0xff,0x0b, 0x09,0x09,0xff,0x0f,0x0d,0x0d,0xff,0x14,0x11,0x11,0xff,0x18,0x14,0x14,0xff,0x19, 0x15,0x17,0xff,0x1a,0x16,0x17,0xff,0x1b,0x16,0x18,0xff,0x1b,0x17,0x17,0xff,0x1b, 0x16,0x16,0xff,0x19,0x14,0x15,0xff,0x16,0x10,0x11,0xff,0x27,0x20,0x21,0xff,0x43, 0x3b,0x3c,0xff,0x37,0x2d,0x2f,0xff,0x32,0x2b,0x2b,0xff,0x37,0x2e,0x2f,0xff,0x33, 0x2a,0x2c,0xff,0x29,0x22,0x22,0xff,0x20,0x1a,0x1a,0xff,0x3c,0x33,0x33,0xff,0x67, 0x59,0x5a,0xff,0x45,0x3b,0x3c,0xfe,0x19,0x16,0x16,0xfe,0x0b,0x0a,0x09,0xfd,0x09, 0x08,0x08,0xfe,0x06,0x05,0x05,0xfd,0x05,0x04,0x04,0xfe,0x06,0x05,0x05,0xfe,0x0b, 0x09,0x0a,0xff,0x0d,0x0b,0x0b,0xff,0x0c,0x0b,0x0b,0xff,0x10,0x0d,0x0e,0xff,0x17, 0x12,0x12,0xff,0x1b,0x16,0x16,0xff,0x1d,0x1b,0x19,0xff,0x1c,0x19,0x18,0xff,0x1a, 0x15,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b, 0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b,0x16,0x16,0xff,0x1b, 0x17,0x17,0xff,0x1b,0x17,0x17,0xff,0x1b,0x16,0x17,0xfd,0x1b,0x16,0x17,0xfa,0x19, 0x15,0x16,0xf8,0x17,0x13,0x14,0xf5,0x13,0x10,0x10,0xf2,0x0e,0x0c,0x0c,0xee,0x09, 0x08,0x08,0xe7,0x05,0x04,0x04,0xdb,0x01,0x01,0x01,0xc6,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xd0,0x00,0x00,0x00,0xe8,0x02,0x03,0x02,0xf5,0x35,0x34,0x35,0xfc,0x5b, 0x51,0x5c,0xfe,0x61,0x54,0x62,0xff,0x5f,0x53,0x60,0xff,0x5f,0x53,0x60,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5b, 0x51,0x5d,0xff,0x6d,0x5b,0x6d,0xff,0x57,0x4e,0x57,0xff,0x4b,0x47,0x4c,0xff,0x4c, 0x48,0x4c,0xff,0x4f,0x49,0x4f,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4e, 0x48,0x4f,0xff,0x4e,0x49,0x4f,0xff,0x4c,0x47,0x4d,0xff,0x4d,0x48,0x4d,0xff,0x4b, 0x47,0x4c,0xff,0x4f,0x49,0x4f,0xff,0x2e,0x34,0x2e,0xff,0x47,0x44,0x48,0xff,0x4d, 0x48,0x4e,0xff,0x4a,0x46,0x4a,0xff,0x56,0x4c,0x56,0xff,0x53,0x4b,0x54,0xff,0x44, 0x42,0x45,0xff,0x3c,0x3e,0x3c,0xff,0x39,0x3b,0x39,0xff,0x34,0x39,0x35,0xff,0x34, 0x39,0x35,0xff,0x34,0x39,0x35,0xfd,0x38,0x3c,0x38,0xfc,0x4a,0x48,0x4b,0xf6,0x32, 0x2b,0x32,0xea,0x03,0x03,0x03,0xd6,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x92,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x48,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xc5,0x02, 0x02,0x02,0xdd,0x26,0x26,0x26,0xee,0x71,0x71,0x71,0xf7,0x37,0x37,0x37,0xfd,0x29, 0x29,0x29,0xfe,0x14,0x14,0x14,0xff,0x03,0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x01, 0x01,0x01,0xfe,0x0b,0x0b,0x0b,0xfd,0x13,0x13,0x13,0xfc,0x12,0x12,0x12,0xf8,0x0f, 0x0f,0x0f,0xf3,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xd1,0x00, 0x00,0x00,0xc4,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xaf,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0x9e,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0xbd,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xe5,0x1d,0x18,0x18,0xf2,0x4e, 0x42,0x43,0xfa,0x3e,0x35,0x36,0xfe,0x1c,0x17,0x17,0xfe,0x2a,0x23,0x23,0xff,0x51, 0x44,0x45,0xff,0x49,0x3d,0x3e,0xff,0x33,0x2b,0x2c,0xff,0x31,0x29,0x29,0xff,0x32, 0x2a,0x2a,0xff,0x33,0x2b,0x2b,0xff,0x35,0x2d,0x2c,0xff,0x37,0x2d,0x2f,0xff,0x38, 0x2e,0x2f,0xff,0x40,0x36,0x36,0xff,0x57,0x4a,0x4b,0xff,0x4f,0x43,0x44,0xff,0x33, 0x29,0x2a,0xff,0x33,0x2a,0x2b,0xff,0x31,0x29,0x2a,0xff,0x30,0x28,0x29,0xff,0x37, 0x2e,0x2f,0xfe,0x47,0x3c,0x3d,0xfe,0x58,0x4c,0x4c,0xfc,0x51,0x46,0x46,0xfc,0x41, 0x37,0x38,0xfc,0x32,0x2a,0x2a,0xfc,0x17,0x14,0x14,0xfe,0x16,0x13,0x14,0xfe,0x28, 0x22,0x23,0xfe,0x63,0x55,0x55,0xfe,0x84,0x71,0x72,0xfe,0x44,0x3a,0x3b,0xfe,0x2d, 0x25,0x26,0xff,0x38,0x2e,0x30,0xff,0x48,0x3d,0x3f,0xff,0x5d,0x50,0x51,0xff,0x63, 0x55,0x57,0xff,0x74,0x65,0x66,0xff,0x8c,0x7a,0x7c,0xff,0x98,0x85,0x86,0xff,0x71, 0x60,0x63,0xff,0x4a,0x3e,0x40,0xff,0x3b,0x32,0x33,0xff,0x34,0x2c,0x2d,0xff,0x34, 0x2c,0x2d,0xff,0x34,0x2b,0x2c,0xff,0x34,0x2b,0x2c,0xff,0x34,0x2b,0x2c,0xff,0x33, 0x2b,0x2b,0xff,0x33,0x2b,0x2c,0xff,0x32,0x29,0x2b,0xff,0x2f,0x28,0x28,0xff,0x2b, 0x24,0x25,0xff,0x24,0x1e,0x1f,0xff,0x19,0x15,0x16,0xff,0x11,0x0e,0x0e,0xff,0x0d, 0x0a,0x0b,0xff,0x1b,0x16,0x17,0xff,0x38,0x30,0x31,0xff,0x2d,0x25,0x26,0xff,0x2b, 0x24,0x25,0xff,0x33,0x2a,0x2b,0xff,0x36,0x2d,0x2e,0xff,0x36,0x2d,0x2e,0xff,0x35, 0x2c,0x2c,0xff,0x32,0x2a,0x2b,0xff,0x32,0x2a,0x2a,0xff,0x32,0x2a,0x2a,0xff,0x32, 0x2a,0x2a,0xff,0x32,0x2a,0x2a,0xff,0x31,0x29,0x29,0xff,0x30,0x28,0x29,0xff,0x30, 0x28,0x29,0xff,0x2f,0x27,0x28,0xff,0x34,0x2b,0x2c,0xff,0x5b,0x4d,0x4e,0xff,0x55, 0x47,0x49,0xff,0x42,0x38,0x38,0xff,0x43,0x38,0x39,0xff,0x3e,0x34,0x35,0xff,0x33, 0x2b,0x2c,0xff,0x26,0x21,0x21,0xff,0x1a,0x16,0x17,0xff,0x1a,0x16,0x16,0xff,0x31, 0x29,0x29,0xff,0x16,0x11,0x12,0xfe,0x1a,0x15,0x15,0xfe,0x24,0x1f,0x20,0xfd,0x2f, 0x27,0x27,0xfc,0x35,0x2b,0x2c,0xfd,0x36,0x2d,0x2e,0xfd,0x36,0x2d,0x2e,0xfe,0x34, 0x2c,0x2b,0xff,0x32,0x2a,0x2b,0xff,0x32,0x2a,0x2a,0xff,0x31,0x28,0x29,0xff,0x3f, 0x37,0x37,0xff,0x78,0x6c,0x6d,0xff,0x70,0x62,0x63,0xff,0x37,0x2d,0x2e,0xff,0x2e, 0x26,0x27,0xff,0x2e,0x26,0x27,0xff,0x32,0x2a,0x2a,0xff,0x32,0x2a,0x2a,0xff,0x32, 0x2a,0x2a,0xff,0x31,0x29,0x2a,0xff,0x2e,0x26,0x27,0xff,0x28,0x22,0x22,0xff,0x21, 0x1b,0x1c,0xff,0x18,0x14,0x15,0xff,0x10,0x0d,0x0e,0xff,0x0a,0x09,0x09,0xff,0x0a, 0x09,0x09,0xff,0x0f,0x0c,0x0d,0xff,0x16,0x13,0x13,0xff,0x1e,0x18,0x19,0xff,0x21, 0x1b,0x1b,0xff,0x1e,0x19,0x1a,0xff,0x1a,0x17,0x17,0xff,0x5c,0x4f,0x51,0xff,0xa2, 0x90,0x92,0xff,0x86,0x7a,0x7b,0xff,0x5c,0x56,0x57,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02,0x01,0x02,0xff,0x15,0x11,0x12,0xff,0x27, 0x21,0x21,0xff,0x41,0x37,0x38,0xff,0x4f,0x41,0x43,0xff,0x32,0x2b,0x2c,0xff,0x33, 0x2b,0x2c,0xff,0x30,0x2a,0x2a,0xff,0x25,0x1f,0x20,0xff,0x28,0x21,0x22,0xff,0x25, 0x1e,0x1f,0xff,0x1c,0x18,0x18,0xff,0x14,0x12,0x11,0xff,0x0e,0x0c,0x0c,0xff,0x0d, 0x0b,0x0b,0xff,0x10,0x0d,0x0e,0xff,0x19,0x14,0x15,0xff,0x24,0x1e,0x1e,0xff,0x2d, 0x26,0x26,0xff,0x33,0x2a,0x2b,0xff,0x36,0x2c,0x2c,0xff,0x36,0x2d,0x2d,0xff,0x33, 0x2b,0x2c,0xff,0x31,0x29,0x2a,0xff,0x2f,0x26,0x27,0xff,0x40,0x37,0x37,0xff,0x75, 0x6b,0x6b,0xff,0x9d,0x93,0x94,0xff,0x99,0x89,0x8a,0xff,0x5e,0x4e,0x4f,0xff,0x3d, 0x33,0x34,0xff,0x38,0x2f,0x30,0xff,0x31,0x29,0x2a,0xff,0x2f,0x27,0x28,0xff,0x2e, 0x26,0x27,0xff,0x42,0x37,0x38,0xff,0x6c,0x5c,0x5d,0xff,0x55,0x4a,0x4b,0xff,0x21, 0x1c,0x1d,0xff,0x18,0x13,0x14,0xfe,0x11,0x0e,0x0e,0xfe,0x0b,0x09,0x09,0xfe,0x0a, 0x08,0x08,0xff,0x0d,0x0b,0x0b,0xff,0x14,0x11,0x11,0xff,0x1d,0x19,0x18,0xff,0x25, 0x20,0x20,0xff,0x2c,0x24,0x25,0xff,0x30,0x28,0x28,0xff,0x31,0x29,0x29,0xff,0x31, 0x28,0x29,0xff,0x31,0x29,0x29,0xff,0x32,0x2a,0x2a,0xff,0x32,0x2a,0x2a,0xff,0x32, 0x2a,0x2a,0xff,0x32,0x2a,0x2a,0xff,0x32,0x2a,0x2a,0xff,0x32,0x2a,0x2a,0xff,0x32, 0x2a,0x2a,0xff,0x32,0x2a,0x2a,0xff,0x32,0x2a,0x2b,0xff,0x33,0x2b,0x2b,0xff,0x35, 0x2d,0x2d,0xff,0x36,0x2d,0x2f,0xfe,0x35,0x2c,0x2d,0xfe,0x31,0x28,0x29,0xfc,0x2a, 0x23,0x23,0xfb,0x20,0x1a,0x1a,0xf9,0x13,0x11,0x11,0xf5,0x0b,0x09,0x09,0xec,0x05, 0x04,0x04,0xdb,0x01,0x00,0x00,0xbe,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x7e,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xe7,0x00, 0x04,0x01,0xf5,0x07,0x12,0x0b,0xfc,0x23,0x2b,0x25,0xff,0x35,0x39,0x35,0xff,0x56, 0x4d,0x57,0xff,0x62,0x54,0x62,0xff,0x5e,0x52,0x5e,0xff,0x5e,0x52,0x5f,0xff,0x5d, 0x51,0x5e,0xff,0x5d,0x51,0x5e,0xff,0x63,0x54,0x63,0xff,0x65,0x55,0x64,0xff,0x4f, 0x49,0x4f,0xff,0x4c,0x47,0x4b,0xff,0x4d,0x48,0x4e,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4f,0x49,0x50,0xff,0x4e, 0x48,0x4e,0xff,0x4a,0x46,0x4b,0xff,0x4c,0x47,0x4c,0xff,0x4d,0x47,0x4d,0xff,0x45, 0x43,0x45,0xff,0x44,0x42,0x45,0xff,0x4a,0x46,0x4b,0xff,0x4b,0x47,0x4c,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x48,0x4d,0xff,0x42,0x42,0x43,0xff,0x3a,0x3d,0x3b,0xff,0x37, 0x3b,0x38,0xff,0x35,0x3a,0x36,0xff,0x35,0x3a,0x36,0xfe,0x36,0x3a,0x37,0xfd,0x47, 0x45,0x47,0xf8,0x45,0x3e,0x45,0xee,0x07,0x06,0x07,0xdd,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0x9e,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0xc6,0x01,0x01,0x01,0xdd,0x1a,0x1a,0x1a,0xed,0x72,0x72,0x72,0xf6,0x5a, 0x5a,0x5a,0xfc,0x0d,0x0d,0x0d,0xfe,0x05,0x05,0x05,0xff,0x00,0x00,0x00,0xff,0x01, 0x01,0x01,0xff,0x0d,0x0d,0x0d,0xff,0x19,0x19,0x19,0xff,0x25,0x25,0x25,0xff,0x2e, 0x2e,0x2e,0xff,0x36,0x36,0x36,0xfe,0x38,0x38,0x38,0xfd,0x33,0x33,0x33,0xfb,0x2f, 0x2f,0x2f,0xf8,0x30,0x30,0x30,0xf3,0x27,0x27,0x27,0xee,0x00,0x00,0x00,0xe8,0x00, 0x00,0x00,0xe1,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0xd2,0x00, 0x00,0x00,0xcf,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0xd1,0x01,0x01,0x01,0xd2,0x04, 0x03,0x03,0xd1,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xc7,0x00, 0x00,0x00,0xc9,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xe6,0x08, 0x07,0x07,0xf1,0x35,0x2d,0x2d,0xf8,0x43,0x39,0x3a,0xfc,0x14,0x11,0x10,0xff,0x18, 0x15,0x15,0xff,0x30,0x28,0x29,0xff,0x51,0x45,0x46,0xff,0x68,0x5a,0x5b,0xff,0x58, 0x4b,0x4c,0xff,0x49,0x3d,0x3e,0xff,0x4c,0x40,0x41,0xff,0x4e,0x42,0x43,0xff,0x53, 0x46,0x47,0xff,0x58,0x4a,0x4b,0xff,0x5b,0x4c,0x4e,0xff,0x6d,0x5d,0x5f,0xff,0x7e, 0x6d,0x6e,0xff,0x68,0x58,0x59,0xff,0x58,0x4a,0x4b,0xff,0x56,0x48,0x49,0xff,0x51, 0x44,0x45,0xff,0x4c,0x41,0x42,0xff,0x49,0x3e,0x3f,0xff,0x4a,0x3e,0x3f,0xff,0x53, 0x47,0x47,0xfe,0x55,0x48,0x49,0xfe,0x41,0x36,0x38,0xff,0x25,0x20,0x20,0xff,0x13, 0x10,0x10,0xff,0x07,0x06,0x06,0xff,0x05,0x03,0x03,0xff,0x2a,0x23,0x23,0xff,0x3e, 0x35,0x35,0xff,0x2e,0x26,0x27,0xff,0x30,0x28,0x28,0xff,0x40,0x35,0x36,0xff,0x53, 0x47,0x48,0xff,0x6c,0x5d,0x5f,0xff,0x83,0x72,0x74,0xff,0x87,0x76,0x77,0xff,0x7a, 0x6a,0x6a,0xff,0x63,0x54,0x55,0xff,0x4b,0x3f,0x40,0xff,0x44,0x3a,0x3b,0xff,0x48, 0x3e,0x3f,0xff,0x4b,0x40,0x41,0xff,0x4b,0x40,0x41,0xff,0x4b,0x40,0x41,0xff,0x4b, 0x40,0x41,0xff,0x4c,0x41,0x42,0xff,0x50,0x44,0x45,0xff,0x55,0x47,0x48,0xff,0x57, 0x49,0x4a,0xff,0x55,0x48,0x49,0xff,0x4e,0x42,0x43,0xff,0x40,0x36,0x37,0xff,0x2c, 0x25,0x26,0xff,0x1f,0x1a,0x1a,0xff,0x19,0x15,0x16,0xff,0x1f,0x1b,0x1a,0xff,0x31, 0x29,0x29,0xff,0x40,0x35,0x36,0xff,0x4e,0x42,0x42,0xff,0x56,0x48,0x48,0xff,0x57, 0x49,0x4a,0xff,0x56,0x49,0x4a,0xff,0x52,0x45,0x46,0xff,0x4e,0x41,0x42,0xff,0x4c, 0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c, 0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4b,0x40,0x41,0xff,0x4a,0x3f,0x40,0xff,0x53, 0x47,0x48,0xff,0x67,0x58,0x59,0xff,0x58,0x4a,0x4b,0xff,0x54,0x46,0x48,0xff,0x53, 0x46,0x47,0xff,0x52,0x45,0x46,0xff,0x4a,0x3e,0x3f,0xff,0x3b,0x32,0x33,0xff,0x28, 0x21,0x22,0xff,0x1e,0x18,0x18,0xff,0x3b,0x32,0x32,0xff,0x27,0x21,0x22,0xff,0x2f, 0x26,0x27,0xff,0x43,0x39,0x3a,0xff,0x51,0x44,0x45,0xfe,0x57,0x49,0x4a,0xff,0x58, 0x4a,0x4b,0xff,0x56,0x48,0x49,0xff,0x52,0x45,0x46,0xff,0x4d,0x40,0x41,0xff,0x4b, 0x3f,0x40,0xff,0x56,0x49,0x4a,0xff,0x5a,0x4c,0x4e,0xff,0x53,0x46,0x48,0xff,0x4e, 0x42,0x43,0xff,0x4c,0x41,0x42,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c, 0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4b,0x3f,0x40,0xff,0x46, 0x3b,0x3c,0xff,0x3e,0x34,0x35,0xff,0x34,0x2b,0x2c,0xff,0x25,0x1f,0x1f,0xff,0x17, 0x13,0x13,0xff,0x10,0x0e,0x0e,0xff,0x10,0x0e,0x0e,0xff,0x1a,0x16,0x16,0xff,0x28, 0x21,0x22,0xff,0x36,0x2c,0x2d,0xff,0x49,0x3f,0x3f,0xff,0x44,0x3b,0x3c,0xff,0x2c, 0x25,0x25,0xff,0x42,0x37,0x39,0xff,0x67,0x5a,0x5b,0xff,0x72,0x66,0x67,0xff,0x4f, 0x43,0x44,0xff,0x12,0x10,0x10,0xff,0x08,0x07,0x07,0xff,0x0b,0x09,0x09,0xff,0x1c, 0x18,0x18,0xff,0x26,0x1f,0x21,0xff,0x21,0x1c,0x1c,0xff,0x40,0x35,0x37,0xff,0x4a, 0x3e,0x40,0xff,0x4b,0x3f,0x3f,0xff,0x49,0x3d,0x3d,0xff,0x4d,0x40,0x42,0xff,0x45, 0x39,0x3a,0xff,0x45,0x39,0x3a,0xff,0x3e,0x33,0x34,0xff,0x31,0x28,0x29,0xff,0x21, 0x1b,0x1c,0xff,0x16,0x12,0x13,0xff,0x16,0x12,0x12,0xff,0x1d,0x18,0x19,0xff,0x2c, 0x25,0x26,0xff,0x40,0x35,0x36,0xff,0x4f,0x42,0x43,0xff,0x56,0x49,0x4a,0xff,0x5a, 0x4c,0x4d,0xff,0x5b,0x4d,0x4e,0xff,0x5a,0x4d,0x4e,0xff,0x6d,0x61,0x62,0xff,0x9a, 0x90,0x91,0xff,0xba,0xb1,0xb2,0xff,0xcc,0xc3,0xc3,0xff,0xba,0xac,0xad,0xff,0x84, 0x73,0x75,0xff,0x55,0x48,0x49,0xff,0x48,0x3e,0x3f,0xff,0x4a,0x3f,0x40,0xff,0x4b, 0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4b,0x40,0x41,0xff,0x4c,0x41,0x41,0xff,0x57, 0x4b,0x4b,0xff,0x5d,0x50,0x51,0xff,0x46,0x3b,0x3c,0xff,0x2e,0x28,0x27,0xff,0x1e, 0x19,0x19,0xff,0x10,0x0d,0x0d,0xff,0x0e,0x0b,0x0c,0xff,0x12,0x0f,0x10,0xff,0x1d, 0x19,0x1a,0xff,0x2d,0x27,0x26,0xff,0x3a,0x31,0x31,0xff,0x43,0x38,0x39,0xff,0x49, 0x3d,0x3e,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c, 0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c, 0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c,0x40,0x41,0xff,0x4c, 0x40,0x41,0xff,0x4f,0x42,0x43,0xff,0x54,0x46,0x47,0xff,0x58,0x4a,0x4b,0xff,0x58, 0x4a,0x4b,0xfe,0x54,0x46,0x47,0xfe,0x4b,0x3e,0x3e,0xfe,0x38,0x30,0x2f,0xfd,0x24, 0x1e,0x1e,0xfb,0x14,0x11,0x11,0xf4,0x08,0x08,0x08,0xe5,0x01,0x02,0x02,0xcb,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1b,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0xe9,0x1c,0x21,0x1e,0xf6,0x29,0x30,0x2a,0xfc,0x15, 0x22,0x17,0xff,0x23,0x2d,0x23,0xff,0x2f,0x35,0x30,0xff,0x53,0x4b,0x54,0xff,0x60, 0x53,0x61,0xff,0x5f,0x52,0x60,0xff,0x5d,0x51,0x5e,0xff,0x5c,0x51,0x5d,0xff,0x6d, 0x5a,0x6c,0xff,0x55,0x4c,0x56,0xff,0x4b,0x46,0x4b,0xff,0x4d,0x48,0x4e,0xff,0x4d, 0x48,0x4e,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4f, 0x49,0x50,0xff,0x4e,0x48,0x4f,0xff,0x4c,0x47,0x4d,0xff,0x4b,0x47,0x4c,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4f,0x49,0x4f,0xff,0x3e,0x3f,0x3e,0xff,0x48, 0x45,0x48,0xff,0x4b,0x46,0x4b,0xff,0x30,0x36,0x31,0xff,0x3e,0x3f,0x3f,0xff,0x40, 0x40,0x41,0xff,0x3a,0x3d,0x3b,0xff,0x36,0x3a,0x37,0xff,0x34,0x39,0x35,0xfe,0x37, 0x3a,0x37,0xfd,0x3e,0x3f,0x3f,0xfa,0x56,0x4c,0x56,0xf2,0x16,0x12,0x16,0xe3,0x01, 0x01,0x01,0xcb,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x36,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x02,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,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x98,0x00, 0x00,0x00,0xb4,0x00,0x00,0x00,0xcd,0x0b,0x0b,0x0b,0xe0,0x28,0x28,0x28,0xec,0x3f, 0x3f,0x3f,0xf6,0x6d,0x6d,0x6d,0xfc,0x13,0x13,0x13,0xfd,0x0e,0x0e,0x0e,0xfe,0x20, 0x20,0x20,0xff,0x2e,0x2e,0x2e,0xff,0x37,0x37,0x37,0xff,0x31,0x31,0x31,0xff,0x2a, 0x2a,0x2a,0xff,0x22,0x22,0x22,0xff,0x1a,0x1a,0x1a,0xff,0x12,0x12,0x12,0xfd,0x0e, 0x0e,0x0e,0xfa,0x09,0x09,0x09,0xf6,0x08,0x08,0x08,0xef,0x08,0x08,0x08,0xe6,0x07, 0x07,0x07,0xe0,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xe1,0x02, 0x02,0x02,0xe4,0x08,0x07,0x07,0xe5,0x01,0x01,0x01,0xe6,0x00,0x00,0x00,0xe7,0x01, 0x01,0x01,0xea,0x29,0x23,0x24,0xeb,0x69,0x59,0x5a,0xea,0x31,0x29,0x2a,0xe8,0x1b, 0x17,0x18,0xe5,0x17,0x12,0x13,0xe5,0x12,0x0f,0x0f,0xe4,0x10,0x0d,0x0d,0xe7,0x10, 0x0d,0x0d,0xed,0x0e,0x0c,0x0c,0xf3,0x22,0x1c,0x1d,0xf8,0x43,0x38,0x39,0xfc,0x1f, 0x1a,0x1b,0xfd,0x0c,0x08,0x08,0xfe,0x42,0x3c,0x3d,0xff,0xb9,0xb7,0xb7,0xff,0xf3, 0xf1,0xf1,0xff,0xee,0xec,0xec,0xff,0xeb,0xe9,0xea,0xff,0xe9,0xe7,0xe8,0xff,0xea, 0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xeb,0xe9,0xe9,0xff,0xeb,0xe9,0xe9,0xff,0xec, 0xea,0xea,0xff,0xef,0xec,0xed,0xff,0xf1,0xee,0xef,0xff,0xed,0xeb,0xeb,0xff,0xed, 0xe9,0xe9,0xff,0xec,0xe9,0xe9,0xff,0xea,0xe9,0xe9,0xff,0xea,0xe8,0xe8,0xff,0xea, 0xe8,0xe8,0xff,0xe9,0xe7,0xe8,0xff,0xe7,0xe5,0xe6,0xff,0xe8,0xe7,0xe7,0xff,0xf0, 0xef,0xef,0xff,0x7e,0x7a,0x7a,0xff,0x0e,0x08,0x08,0xff,0x12,0x0f,0x0f,0xff,0x0d, 0x0c,0x0c,0xff,0x12,0x0f,0x0f,0xff,0x14,0x0e,0x0f,0xff,0x93,0x8f,0x90,0xff,0xf6, 0xf5,0xf5,0xff,0xe8,0xe6,0xe7,0xff,0xe9,0xe7,0xe8,0xff,0xec,0xea,0xeb,0xff,0xef, 0xed,0xed,0xff,0xed,0xeb,0xeb,0xff,0xe9,0xe7,0xe7,0xff,0xe6,0xe4,0xe5,0xff,0xe8, 0xe6,0xe6,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9, 0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xeb, 0xe9,0xe9,0xff,0xeb,0xe9,0xe9,0xff,0xeb,0xe9,0xe9,0xff,0xeb,0xe9,0xe9,0xff,0xf3, 0xf3,0xf3,0xff,0xbe,0xb9,0xba,0xff,0x58,0x4e,0x4f,0xff,0x2c,0x24,0x25,0xff,0x29, 0x22,0x22,0xff,0x2d,0x25,0x25,0xff,0x39,0x2e,0x2f,0xff,0xbf,0xbb,0xbb,0xff,0xf2, 0xf0,0xf0,0xff,0xeb,0xe9,0xe9,0xff,0xec,0xe9,0xe9,0xff,0xeb,0xe9,0xe9,0xff,0xeb, 0xe8,0xe9,0xff,0xea,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea, 0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea, 0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xec,0xea,0xea,0xff,0xec,0xea,0xeb,0xff,0xea, 0xe8,0xe8,0xff,0xeb,0xe9,0xe9,0xff,0xeb,0xe9,0xea,0xff,0xeb,0xe9,0xe9,0xff,0xf1, 0xf0,0xf0,0xff,0xad,0xa6,0xa6,0xff,0x49,0x3f,0x40,0xff,0x2b,0x24,0x25,0xff,0x3c, 0x33,0x33,0xff,0x4d,0x40,0x42,0xff,0x53,0x46,0x47,0xff,0xdb,0xd8,0xd8,0xff,0xed, 0xeb,0xeb,0xff,0xec,0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xeb,0xe9,0xe9,0xff,0xeb, 0xe9,0xe9,0xff,0xea,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xec,0xea,0xea,0xff,0xec, 0xea,0xea,0xff,0xe8,0xe6,0xe6,0xff,0xe7,0xe6,0xe6,0xff,0xea,0xe8,0xe8,0xff,0xea, 0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea, 0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xe9,0xe7,0xe7,0xff,0xe8,0xe6,0xe6,0xff,0xe6, 0xe5,0xe5,0xff,0x7e,0x79,0x7a,0xff,0x1d,0x18,0x18,0xff,0x16,0x12,0x13,0xff,0x18, 0x14,0x15,0xff,0x28,0x21,0x22,0xff,0x42,0x38,0x39,0xff,0xa9,0xa2,0xa3,0xff,0xee, 0xed,0xee,0xff,0xe4,0xe1,0xe1,0xff,0x52,0x45,0x46,0xff,0x4f,0x42,0x43,0xff,0x4a, 0x3f,0x40,0xff,0x44,0x3a,0x3a,0xff,0x41,0x36,0x37,0xff,0x47,0x3c,0x3d,0xff,0x38, 0x2f,0x31,0xff,0x3c,0x32,0x33,0xff,0x47,0x3b,0x3d,0xff,0x3d,0x34,0x34,0xff,0x36, 0x2c,0x2d,0xff,0x42,0x36,0x37,0xff,0x54,0x46,0x47,0xff,0x5f,0x51,0x52,0xff,0x62, 0x54,0x55,0xff,0x72,0x62,0x64,0xff,0x96,0x8b,0x8c,0xff,0xb0,0xa8,0xa9,0xff,0xd7, 0xd3,0xd4,0xff,0xb5,0xb0,0xb1,0xff,0x22,0x1a,0x1a,0xff,0x20,0x1b,0x1b,0xff,0x21, 0x1c,0x1c,0xff,0x2c,0x24,0x24,0xff,0x52,0x47,0x48,0xff,0xbd,0xb6,0xb7,0xff,0xf3, 0xf1,0xf1,0xff,0xec,0xe9,0xea,0xff,0xec,0xea,0xea,0xff,0xed,0xeb,0xeb,0xff,0xee, 0xec,0xec,0xff,0xf4,0xf2,0xf2,0xff,0xfd,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xfe, 0xfd,0xfd,0xff,0xf6,0xf4,0xf4,0xff,0xed,0xeb,0xec,0xff,0xe9,0xe8,0xe8,0xff,0xe9, 0xe7,0xe7,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xea, 0xe8,0xe8,0xff,0xe9,0xe7,0xe7,0xff,0xe7,0xe6,0xe6,0xff,0xeb,0xe9,0xe9,0xff,0xf0, 0xee,0xef,0xff,0xa4,0x9d,0x9e,0xff,0x2b,0x20,0x22,0xff,0x26,0x20,0x21,0xff,0x16, 0x12,0x13,0xff,0x11,0x0c,0x0d,0xff,0x47,0x42,0x42,0xff,0xbf,0xbc,0xbc,0xff,0xf0, 0xef,0xef,0xff,0xe9,0xe6,0xe6,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9, 0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9, 0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xe9, 0xe8,0xe8,0xff,0xe9,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xea,0xe8,0xe8,0xff,0xeb, 0xe9,0xe9,0xff,0xeb,0xe9,0xe9,0xff,0xec,0xe9,0xe9,0xff,0xed,0xea,0xeb,0xff,0xf5, 0xf3,0xf4,0xff,0x90,0x88,0x88,0xff,0x2d,0x23,0x24,0xfc,0x20,0x1b,0x1b,0xf7,0x0d, 0x0b,0x0b,0xea,0x02,0x01,0x01,0xd1,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x7a,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x66,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0xbb,0x0c,0x0c,0x0d,0xdb,0x29,0x2c,0x2d,0xee,0x6a, 0x55,0x58,0xf9,0x8e,0x6d,0x68,0xfd,0x8d,0x6e,0x62,0xff,0x83,0x67,0x72,0xff,0x4a, 0x46,0x49,0xff,0x41,0x41,0x43,0xff,0x59,0x4e,0x5a,0xff,0x5e,0x52,0x5f,0xff,0x5e, 0x52,0x5f,0xff,0x66,0x56,0x65,0xff,0x64,0x55,0x64,0xff,0x4e,0x49,0x4f,0xff,0x4b, 0x47,0x4c,0xff,0x4d,0x48,0x4e,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d, 0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c, 0x47,0x4c,0xff,0x49,0x45,0x49,0xff,0x4d,0x48,0x4d,0xff,0x38,0x3b,0x38,0xff,0x43, 0x42,0x44,0xff,0x41,0x41,0x41,0xff,0x3c,0x3e,0x3c,0xff,0x36,0x3a,0x37,0xff,0x38, 0x3b,0x38,0xff,0x37,0x3b,0x37,0xfd,0x3c,0x3e,0x3c,0xfb,0x54,0x4e,0x55,0xf5,0x32, 0x2b,0x32,0xe9,0x03,0x03,0x03,0xd3,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0xbe,0x04,0x04,0x04,0xd4,0x19,0x19,0x19,0xe5,0x2f, 0x2f,0x2f,0xf0,0x2c,0x2c,0x2c,0xf8,0x4e,0x4e,0x4e,0xfb,0x5d,0x5d,0x5d,0xfd,0x2a, 0x2a,0x2a,0xfe,0x2c,0x2c,0x2c,0xff,0x20,0x20,0x20,0xff,0x12,0x12,0x12,0xff,0x07, 0x07,0x07,0xff,0x03,0x03,0x03,0xff,0x03,0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xfe,0x09,0x09,0x09,0xfb,0x2e,0x2e,0x2e,0xf6,0x00,0x00,0x00,0xec,0x00, 0x00,0x00,0xde,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xc9,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0xe8,0x01,0x01,0x01,0xf0,0x00, 0x00,0x00,0xf4,0x00,0x00,0x00,0xf6,0x1a,0x16,0x16,0xf7,0x79,0x66,0x67,0xf7,0x75, 0x63,0x65,0xf5,0x38,0x2f,0x30,0xf3,0x2d,0x25,0x26,0xf1,0x30,0x28,0x29,0xef,0x29, 0x22,0x23,0xef,0x1b,0x16,0x17,0xf1,0x17,0x13,0x14,0xf3,0x23,0x1d,0x1e,0xf6,0x3f, 0x34,0x35,0xfa,0x28,0x21,0x22,0xfd,0x08,0x07,0x07,0xfd,0x11,0x0e,0x0e,0xfe,0x38, 0x33,0x33,0xff,0x89,0x85,0x84,0xff,0xae,0xa9,0xa9,0xff,0xb6,0xae,0xb0,0xff,0xb2, 0xab,0xac,0xff,0xb2,0xaa,0xab,0xff,0xb5,0xad,0xae,0xff,0xb4,0xad,0xae,0xff,0xba, 0xb1,0xb2,0xff,0xc2,0xb7,0xb8,0xff,0xd5,0xcb,0xcc,0xff,0xf5,0xf2,0xf1,0xff,0xff, 0xff,0xff,0xff,0xe9,0xe3,0xe3,0xff,0xc4,0xb8,0xb9,0xff,0xbf,0xb6,0xb6,0xff,0xb6, 0xaf,0xaf,0xff,0xb1,0xaa,0xaa,0xff,0xb0,0xa9,0xa9,0xff,0xaf,0xa9,0xa9,0xff,0xac, 0xa6,0xa7,0xff,0xa9,0xa3,0xa5,0xff,0xa5,0xa0,0xa2,0xff,0x5a,0x55,0x55,0xff,0x12, 0x0e,0x0e,0xff,0x11,0x0d,0x0e,0xff,0x0e,0x0b,0x0b,0xff,0x11,0x0e,0x0e,0xff,0x13, 0x0e,0x0e,0xff,0x67,0x62,0x63,0xff,0xad,0xa8,0xa8,0xff,0xa9,0xa3,0xa4,0xff,0xad, 0xa7,0xa8,0xff,0xaf,0xa8,0xa8,0xff,0xaf,0xa8,0xa8,0xff,0xb0,0xa9,0xa9,0xff,0xb0, 0xa9,0xa9,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1, 0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1, 0xaa,0xaa,0xff,0xb2,0xab,0xab,0xff,0xb8,0xb0,0xb0,0xff,0xc0,0xb6,0xb6,0xff,0xc2, 0xb6,0xb7,0xff,0xed,0xe8,0xe8,0xff,0xff,0xff,0xff,0xff,0xd8,0xd2,0xd3,0xff,0x6c, 0x60,0x61,0xff,0x3c,0x31,0x31,0xff,0x36,0x2d,0x2e,0xff,0x3b,0x31,0x32,0xff,0x4e, 0x3f,0x40,0xff,0xd5,0xd1,0xd1,0xff,0xff,0xff,0xff,0xff,0xe8,0xe2,0xe3,0xff,0xca, 0xbf,0xc1,0xff,0xc0,0xb6,0xb6,0xff,0xb8,0xb0,0xb0,0xff,0xb2,0xab,0xab,0xff,0xaf, 0xa8,0xa8,0xff,0xaf,0xa8,0xa8,0xff,0xaf,0xa8,0xa8,0xff,0xaf,0xa8,0xa8,0xff,0xaf, 0xa8,0xa8,0xff,0xaf,0xa8,0xa8,0xff,0xaf,0xa8,0xa8,0xff,0xae,0xa7,0xa7,0xff,0xb6, 0xaf,0xb0,0xff,0xb8,0xb0,0xb1,0xff,0xb8,0xb0,0xb0,0xff,0xbf,0xb5,0xb6,0xff,0xc2, 0xb6,0xb7,0xff,0xf5,0xf2,0xf2,0xff,0xff,0xff,0xff,0xff,0xc7,0xbe,0xbf,0xff,0x5b, 0x4e,0x4f,0xff,0x3b,0x32,0x32,0xff,0x36,0x2d,0x2e,0xff,0x4c,0x3f,0x41,0xff,0x68, 0x57,0x58,0xff,0xf1,0xef,0xef,0xff,0xff,0xff,0xff,0xff,0xea,0xe5,0xe5,0xff,0xca, 0xbf,0xc1,0xff,0xc1,0xb8,0xb9,0xff,0xb8,0xb0,0xb1,0xff,0xb2,0xaa,0xab,0xff,0xb0, 0xa9,0xa9,0xff,0xb0,0xa9,0xa9,0xff,0xb1,0xa9,0xaa,0xff,0xbb,0xb3,0xb3,0xff,0xb7, 0xaf,0xb0,0xff,0xaf,0xa8,0xa8,0xff,0xb0,0xa9,0xa9,0xff,0xb0,0xa9,0xa9,0xff,0xb0, 0xa9,0xa9,0xff,0xb0,0xa9,0xa9,0xff,0xb0,0xa9,0xa9,0xff,0xaf,0xa8,0xa8,0xff,0xad, 0xa6,0xa7,0xff,0xa8,0xa2,0xa2,0xff,0xa2,0x9d,0x9e,0xff,0x54,0x4e,0x4e,0xff,0x1b, 0x17,0x17,0xff,0x15,0x11,0x12,0xff,0x1d,0x19,0x19,0xff,0x34,0x2b,0x2c,0xff,0x53, 0x48,0x49,0xff,0xc5,0xbd,0xbe,0xff,0xff,0xff,0xff,0xff,0xf8,0xf7,0xf7,0xff,0x6c, 0x5c,0x5d,0xff,0x64,0x56,0x57,0xff,0x48,0x3d,0x3e,0xff,0x33,0x2b,0x2b,0xff,0x48, 0x3e,0x3f,0xff,0x54,0x47,0x48,0xff,0x53,0x46,0x48,0xff,0x46,0x39,0x3a,0xff,0x4f, 0x40,0x42,0xff,0x59,0x4b,0x4c,0xff,0x64,0x55,0x56,0xff,0x78,0x68,0x6a,0xff,0x96, 0x89,0x8a,0xff,0xbc,0xb3,0xb4,0xff,0xdd,0xd8,0xd8,0xff,0xf3,0xf2,0xf2,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd8,0xd6,0xd6,0xff,0x2d, 0x24,0x24,0xff,0x23,0x1d,0x1d,0xff,0x28,0x22,0x22,0xff,0x39,0x2f,0x30,0xff,0x65, 0x59,0x5a,0xff,0xd8,0xd1,0xd2,0xff,0xff,0xff,0xff,0xff,0xf3,0xef,0xef,0xff,0xcc, 0xc1,0xc2,0xff,0xd4,0xcb,0xcd,0xff,0xcf,0xc8,0xc8,0xff,0xd0,0xc9,0xca,0xff,0xcb, 0xc6,0xc6,0xff,0xc5,0xbf,0xc0,0xff,0xc3,0xbd,0xbe,0xff,0xc1,0xbb,0xbc,0xff,0xc0, 0xbb,0xbb,0xff,0xbd,0xb7,0xb7,0xff,0xaf,0xa8,0xa8,0xff,0xb1,0xaa,0xaa,0xff,0xb1, 0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xad, 0xa7,0xa7,0xff,0xa9,0xa3,0xa4,0xff,0xa5,0xa0,0xa0,0xff,0x6a,0x64,0x65,0xff,0x1e, 0x17,0x18,0xff,0x2e,0x27,0x28,0xff,0x2d,0x26,0x28,0xff,0x1f,0x19,0x1a,0xff,0x3d, 0x38,0x38,0xff,0x8b,0x87,0x87,0xff,0xaa,0xa5,0xa5,0xff,0xaa,0xa5,0xa5,0xff,0xae, 0xa8,0xa8,0xff,0xb0,0xa8,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1, 0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1, 0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb1,0xaa,0xaa,0xff,0xb2, 0xaa,0xab,0xff,0xb4,0xac,0xae,0xff,0xbb,0xb2,0xb3,0xff,0xc2,0xb7,0xb7,0xff,0xd5, 0xcd,0xcd,0xff,0xf6,0xf3,0xf3,0xff,0xff,0xff,0xff,0xff,0xa8,0x9f,0xa0,0xff,0x3d, 0x30,0x32,0xfd,0x2a,0x23,0x23,0xf8,0x11,0x0e,0x0e,0xec,0x02,0x02,0x02,0xd3,0x00, 0x00,0x00,0xad,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xcc,0x38, 0x32,0x39,0xe5,0x66,0x57,0x66,0xf4,0x6f,0x5b,0x6d,0xfb,0x80,0x63,0x71,0xfe,0x87, 0x67,0x74,0xff,0x83,0x66,0x77,0xff,0x89,0x68,0x7b,0xff,0x5c,0x4f,0x53,0xff,0x59, 0x4f,0x5a,0xff,0x41,0x41,0x43,0xff,0x3e,0x3e,0x3f,0xff,0x69,0x58,0x68,0xff,0x59, 0x4f,0x5a,0xff,0x4c,0x47,0x4c,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4e, 0x48,0x4f,0xff,0x4d,0x48,0x4e,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c, 0x47,0x4c,0xff,0x4d,0x48,0x4e,0xff,0x4c,0x47,0x4c,0xff,0x4a,0x46,0x4b,0xff,0x4b, 0x46,0x4a,0xff,0x2e,0x34,0x2e,0xff,0x3f,0x3f,0x3f,0xff,0x3f,0x40,0x40,0xff,0x3a, 0x3c,0x3b,0xff,0x38,0x3b,0x38,0xff,0x38,0x3b,0x38,0xfe,0x39,0x3c,0x3a,0xfd,0x4c, 0x48,0x4d,0xf8,0x4c,0x41,0x4c,0xee,0x07,0x06,0x07,0xda,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0xaf,0x01,0x01,0x01,0xc8,0x0e,0x0e,0x0e,0xdc,0x27, 0x27,0x27,0xeb,0x47,0x47,0x47,0xf3,0x25,0x25,0x25,0xf9,0x31,0x31,0x31,0xfc,0x7f, 0x7f,0x7f,0xfd,0x38,0x38,0x38,0xfe,0x0d,0x0d,0x0d,0xff,0x08,0x08,0x08,0xff,0x11, 0x11,0x11,0xff,0x0e,0x0e,0x0e,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02, 0x02,0x02,0xff,0x0f,0x0f,0x0f,0xfe,0x03,0x03,0x03,0xfb,0x26,0x26,0x26,0xf6,0x2c, 0x2c,0x2c,0xec,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xb9,0x00, 0x00,0x00,0xb0,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xd6,0x00, 0x00,0x00,0xe8,0x01,0x01,0x01,0xf3,0x04,0x03,0x03,0xfa,0x0b,0x0a,0x0a,0xfb,0x3c, 0x32,0x33,0xfb,0x80,0x6c,0x6e,0xfa,0x39,0x30,0x31,0xf7,0x00,0x00,0x00,0xf3,0x03, 0x03,0x03,0xef,0x0f,0x0c,0x0d,0xec,0x10,0x0e,0x0e,0xec,0x01,0x01,0x01,0xed,0x00, 0x00,0x00,0xf0,0x09,0x07,0x07,0xf3,0x1a,0x16,0x16,0xf8,0x07,0x06,0x06,0xfc,0x06, 0x05,0x05,0xfd,0x11,0x0e,0x0e,0xfe,0x1b,0x16,0x17,0xff,0x26,0x1f,0x20,0xff,0x34, 0x2b,0x2c,0xff,0x4b,0x3f,0x40,0xff,0x59,0x4b,0x4c,0xff,0x5b,0x4c,0x4d,0xff,0x61, 0x51,0x53,0xff,0x58,0x4a,0x4b,0xff,0x5e,0x4e,0x50,0xff,0x75,0x5f,0x61,0xff,0xa4, 0x90,0x92,0xff,0xec,0xe6,0xe7,0xff,0xff,0xff,0xff,0xff,0xcc,0xbf,0xc0,0xff,0x79, 0x60,0x62,0xff,0x69,0x57,0x5a,0xff,0x54,0x46,0x48,0xff,0x47,0x3b,0x3c,0xff,0x42, 0x37,0x37,0xff,0x42,0x37,0x37,0xff,0x3d,0x34,0x34,0xfe,0x37,0x2e,0x2f,0xfe,0x2d, 0x25,0x26,0xfe,0x20,0x1b,0x1b,0xff,0x14,0x11,0x11,0xff,0x0c,0x0b,0x0b,0xff,0x0b, 0x0a,0x09,0xff,0x10,0x0d,0x0e,0xff,0x1c,0x17,0x17,0xff,0x2b,0x23,0x24,0xff,0x39, 0x2f,0x30,0xff,0x45,0x39,0x3a,0xff,0x4d,0x40,0x41,0xff,0x53,0x45,0x46,0xff,0x54, 0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x54, 0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x55,0x46,0x47,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x54,0x46,0x47,0xff,0x58,0x49,0x4b,0xff,0x66, 0x54,0x56,0xff,0x79,0x65,0x67,0xff,0x82,0x69,0x6b,0xff,0xd7,0xce,0xcf,0xff,0xff, 0xff,0xff,0xff,0xdb,0xd4,0xd5,0xff,0x75,0x67,0x68,0xff,0x44,0x39,0x39,0xff,0x3e, 0x34,0x35,0xff,0x45,0x39,0x3a,0xff,0x5a,0x48,0x4a,0xff,0xd8,0xd3,0xd4,0xff,0xff, 0xff,0xff,0xff,0xcf,0xc4,0xc4,0xff,0x8c,0x78,0x79,0xff,0x6f,0x5d,0x5e,0xff,0x5a, 0x4b,0x4c,0xff,0x4a,0x3d,0x3e,0xff,0x44,0x38,0x39,0xff,0x44,0x38,0x39,0xff,0x44, 0x38,0x39,0xff,0x44,0x38,0x39,0xff,0x43,0x38,0x39,0xff,0x42,0x37,0x38,0xff,0x43, 0x38,0x39,0xff,0x42,0x36,0x37,0xff,0x5b,0x4d,0x4f,0xff,0x5c,0x4d,0x4e,0xff,0x5d, 0x4e,0x4f,0xff,0x71,0x5e,0x5f,0xff,0x7b,0x63,0x64,0xff,0xe5,0xe0,0xe1,0xff,0xff, 0xff,0xff,0xff,0xca,0xc0,0xc1,0xff,0x65,0x56,0x58,0xff,0x45,0x3a,0x3a,0xff,0x3f, 0x34,0x35,0xff,0x4a,0x3e,0x3f,0xff,0x68,0x56,0x58,0xff,0xf1,0xef,0xef,0xff,0xff, 0xff,0xff,0xff,0xd3,0xc7,0xc8,0xff,0x89,0x74,0x75,0xff,0x70,0x5d,0x5f,0xff,0x58, 0x4a,0x4b,0xff,0x49,0x3d,0x3e,0xff,0x43,0x38,0x38,0xff,0x43,0x38,0x38,0xff,0x43, 0x38,0x38,0xff,0x4d,0x41,0x41,0xff,0x61,0x53,0x54,0xff,0x48,0x3b,0x3c,0xff,0x43, 0x37,0x38,0xff,0x43,0x38,0x38,0xff,0x43,0x38,0x38,0xff,0x43,0x38,0x38,0xff,0x43, 0x38,0x38,0xff,0x41,0x36,0x37,0xff,0x3d,0x33,0x34,0xff,0x36,0x2d,0x2e,0xff,0x2c, 0x25,0x25,0xff,0x20,0x1b,0x1b,0xff,0x15,0x11,0x12,0xff,0x12,0x0f,0x0f,0xff,0x20, 0x1b,0x1b,0xff,0x3b,0x32,0x33,0xff,0x61,0x52,0x53,0xff,0xca,0xc1,0xc2,0xff,0xff, 0xff,0xff,0xff,0xf9,0xf8,0xf9,0xff,0x89,0x74,0x76,0xff,0x7b,0x67,0x69,0xff,0x64, 0x54,0x56,0xff,0x46,0x38,0x3a,0xff,0x4b,0x3c,0x3c,0xff,0x55,0x45,0x46,0xff,0x71, 0x60,0x62,0xff,0x76,0x67,0x68,0xff,0x87,0x77,0x79,0xff,0xb2,0xa7,0xa8,0xff,0xce, 0xc6,0xc7,0xff,0xf5,0xf3,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, 0xfe,0xfe,0xff,0xf6,0xf4,0xf4,0xff,0xe7,0xe3,0xe3,0xff,0xc2,0xbb,0xbc,0xff,0x90, 0x86,0x87,0xff,0x62,0x58,0x59,0xff,0x27,0x1f,0x20,0xff,0x21,0x1c,0x1c,0xff,0x2b, 0x24,0x24,0xff,0x42,0x37,0x38,0xff,0x70,0x62,0x63,0xff,0xda,0xd3,0xd3,0xff,0xff, 0xff,0xff,0xff,0xe6,0xde,0xdf,0xff,0x95,0x7c,0x7e,0xff,0x82,0x6d,0x6f,0xff,0x67, 0x55,0x57,0xff,0x59,0x4a,0x4c,0xff,0x54,0x46,0x47,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x53,0x45,0x46,0xff,0x4e,0x41,0x42,0xff,0x46,0x39,0x3b,0xff,0x39, 0x2f,0x2f,0xff,0x2a,0x23,0x23,0xff,0x1b,0x16,0x17,0xff,0x13,0x10,0x11,0xff,0x22, 0x1d,0x1e,0xff,0x38,0x2f,0x30,0xff,0x3a,0x30,0x31,0xff,0x37,0x2e,0x2f,0xff,0x3d, 0x32,0x33,0xff,0x48,0x3b,0x3c,0xff,0x4f,0x41,0x42,0xff,0x53,0x45,0x46,0xff,0x54, 0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x54, 0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x55,0x46,0x47,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x48,0x48,0xff,0x5d,0x4e,0x4f,0xff,0x6f, 0x5d,0x5e,0xff,0x7f,0x69,0x6a,0xff,0xa9,0x96,0x97,0xff,0xec,0xe7,0xe7,0xff,0xff, 0xff,0xff,0xff,0xac,0xa2,0xa3,0xff,0x4a,0x3b,0x3c,0xfd,0x31,0x29,0x29,0xf8,0x15, 0x11,0x11,0xec,0x03,0x03,0x03,0xd5,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x93,0x00, 0x00,0x00,0xbb,0x15,0x15,0x15,0xda,0x4f,0x47,0x50,0xed,0x62,0x55,0x63,0xf8,0x5e, 0x52,0x5f,0xfc,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5a,0x4f,0x5b,0xff,0x70, 0x5c,0x6e,0xff,0x8e,0x6a,0x6f,0xff,0x8e,0x6b,0x78,0xff,0x4a,0x44,0x45,0xff,0x27, 0x2e,0x27,0xff,0x4e,0x47,0x4f,0xff,0x4c,0x48,0x4c,0xff,0x48,0x45,0x49,0xff,0x4d, 0x48,0x4d,0xff,0x4e,0x49,0x4f,0xff,0x4f,0x49,0x50,0xff,0x4e,0x49,0x4f,0xff,0x4f, 0x49,0x50,0xff,0x4e,0x49,0x4f,0xff,0x4e,0x49,0x4f,0xff,0x4c,0x47,0x4d,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4c,0x47,0x4c,0xff,0x4d, 0x48,0x4e,0xff,0x49,0x46,0x4a,0xff,0x4d,0x49,0x4d,0xff,0x15,0x20,0x18,0xff,0x3b, 0x3d,0x3d,0xff,0x3f,0x40,0x40,0xff,0x3b,0x3d,0x3b,0xff,0x3a,0x3d,0x3b,0xff,0x39, 0x3b,0x39,0xfd,0x46,0x44,0x46,0xfa,0x59,0x4f,0x5a,0xf2,0x17,0x13,0x17,0xe3,0x01, 0x00,0x01,0xc9,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x02,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x40,0x00, 0x00,0x00,0x65,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0xb2,0x02,0x02,0x02,0xcd,0x1f, 0x1f,0x1f,0xe0,0x3d,0x3d,0x3d,0xed,0x3f,0x3f,0x3f,0xf6,0x2d,0x2d,0x2d,0xfa,0x36, 0x36,0x36,0xfd,0x5f,0x5f,0x5f,0xfe,0x5d,0x5d,0x5d,0xfe,0x00,0x00,0x00,0xff,0x0b, 0x0b,0x0b,0xff,0x3a,0x3a,0x3a,0xff,0x45,0x45,0x45,0xff,0x3f,0x3f,0x3f,0xff,0x15, 0x15,0x15,0xff,0x00,0x00,0x00,0xfe,0x0f,0x0f,0x0f,0xfe,0x4d,0x4d,0x4d,0xfb,0x0d, 0x0d,0x0d,0xf7,0x40,0x40,0x40,0xee,0x07,0x07,0x07,0xdf,0x00,0x00,0x00,0xca,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0xba,0x00,0x00,0x00,0xd3,0x01,0x01,0x01,0xe8,0x0e,0x0c,0x0d,0xf4,0x1d, 0x18,0x19,0xfb,0x2a,0x24,0x24,0xfc,0x67,0x58,0x59,0xfc,0x5b,0x4d,0x4f,0xf9,0x00, 0x00,0x00,0xf2,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xe0,0x00, 0x00,0x00,0xdf,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xec,0x00, 0x00,0x00,0xf3,0x01,0x01,0x01,0xf9,0x05,0x04,0x04,0xfc,0x0a,0x09,0x09,0xfd,0x11, 0x0f,0x0f,0xfe,0x19,0x15,0x16,0xff,0x21,0x1c,0x1c,0xfe,0x27,0x21,0x21,0xfe,0x33, 0x2c,0x2c,0xfe,0x46,0x3c,0x3c,0xff,0x4e,0x43,0x44,0xff,0x51,0x45,0x46,0xff,0x62, 0x53,0x55,0xff,0x76,0x62,0x64,0xff,0xa7,0x95,0x96,0xff,0xee,0xe8,0xe8,0xff,0xff, 0xff,0xff,0xff,0xcd,0xc1,0xc2,0xff,0x7b,0x63,0x64,0xff,0x67,0x57,0x58,0xff,0x48, 0x3c,0x3d,0xff,0x30,0x27,0x28,0xff,0x2b,0x24,0x24,0xfe,0x2b,0x25,0x25,0xfd,0x29, 0x23,0x23,0xfc,0x25,0x1e,0x1f,0xfd,0x1d,0x18,0x19,0xfd,0x15,0x11,0x12,0xfe,0x0d, 0x0b,0x0b,0xfe,0x09,0x08,0x08,0xff,0x0a,0x09,0x09,0xff,0x12,0x0f,0x0f,0xff,0x1f, 0x1a,0x1a,0xff,0x2f,0x28,0x29,0xff,0x41,0x36,0x37,0xff,0x4e,0x41,0x42,0xff,0x56, 0x49,0x4a,0xff,0x5b,0x4d,0x4e,0xff,0x5b,0x4c,0x4d,0xff,0x59,0x4a,0x4b,0xff,0x57, 0x49,0x4a,0xff,0x56,0x48,0x49,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x54,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x54, 0x46,0x47,0xff,0x58,0x49,0x4b,0xff,0x68,0x56,0x58,0xff,0x7e,0x69,0x6b,0xff,0x88, 0x6d,0x6f,0xff,0xd9,0xcf,0xd0,0xff,0xff,0xff,0xff,0xff,0xde,0xd6,0xd7,0xff,0x7b, 0x6c,0x6d,0xff,0x4a,0x3d,0x3e,0xff,0x42,0x38,0x39,0xff,0x4b,0x3e,0x3f,0xff,0x62, 0x50,0x52,0xff,0xda,0xd5,0xd6,0xff,0xff,0xff,0xff,0xff,0xd3,0xc7,0xc7,0xff,0x91, 0x7b,0x7d,0xff,0x71,0x5e,0x5f,0xff,0x58,0x49,0x4b,0xff,0x45,0x39,0x3b,0xff,0x3f, 0x34,0x35,0xff,0x3f,0x34,0x35,0xff,0x3f,0x34,0x35,0xff,0x3d,0x33,0x34,0xff,0x3f, 0x35,0x36,0xff,0x46,0x3b,0x3c,0xff,0x4b,0x3f,0x40,0xff,0x4f,0x43,0x44,0xff,0x6a, 0x5a,0x5c,0xff,0x60,0x52,0x53,0xff,0x6e,0x5e,0x5f,0xff,0x82,0x6e,0x70,0xff,0x8c, 0x73,0x74,0xff,0xe9,0xe3,0xe3,0xff,0xff,0xff,0xff,0xff,0xce,0xc4,0xc5,0xff,0x6c, 0x5c,0x5e,0xff,0x4c,0x3f,0x40,0xff,0x44,0x39,0x3a,0xff,0x50,0x42,0x43,0xff,0x6f, 0x5d,0x5f,0xff,0xf2,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff,0xd3,0xc7,0xc8,0xff,0x83, 0x6f,0x70,0xff,0x63,0x53,0x54,0xff,0x46,0x3b,0x3c,0xff,0x33,0x2b,0x2b,0xff,0x2c, 0x25,0x25,0xff,0x2c,0x25,0x25,0xff,0x2c,0x25,0x25,0xff,0x2b,0x23,0x23,0xff,0x3f, 0x34,0x36,0xff,0x49,0x3e,0x3f,0xff,0x2b,0x25,0x25,0xff,0x2a,0x23,0x23,0xff,0x2c, 0x25,0x25,0xff,0x2c,0x25,0x25,0xff,0x2c,0x25,0x25,0xff,0x2b,0x24,0x25,0xff,0x28, 0x21,0x23,0xff,0x23,0x1d,0x1e,0xff,0x1e,0x19,0x19,0xff,0x15,0x12,0x12,0xff,0x0e, 0x0c,0x0c,0xff,0x0e,0x0c,0x0c,0xff,0x20,0x1b,0x1b,0xff,0x41,0x35,0x36,0xff,0x6a, 0x59,0x5b,0xff,0xd1,0xc7,0xc8,0xff,0xff,0xff,0xff,0xff,0xfb,0xf9,0xf9,0xff,0xa1, 0x85,0x88,0xff,0x93,0x78,0x7b,0xff,0x8e,0x79,0x7a,0xff,0x7f,0x6d,0x6f,0xff,0x8c, 0x7e,0x7e,0xff,0xa9,0x9e,0x9e,0xff,0xcd,0xc4,0xc5,0xff,0xec,0xe8,0xe8,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xf3,0xf1,0xf1,0xff,0xe6, 0xe1,0xe1,0xff,0xc8,0xc0,0xc1,0xff,0xb0,0xa6,0xa7,0xff,0x8f,0x80,0x81,0xff,0x67, 0x57,0x58,0xff,0x4d,0x3e,0x3f,0xff,0x3d,0x32,0x33,0xff,0x2c,0x25,0x26,0xff,0x1e, 0x1a,0x1a,0xff,0x1b,0x17,0x18,0xff,0x2b,0x23,0x24,0xff,0x47,0x3a,0x3b,0xff,0x78, 0x68,0x69,0xff,0xdd,0xd6,0xd6,0xff,0xff,0xff,0xff,0xff,0xe9,0xe2,0xe2,0xff,0x9d, 0x81,0x84,0xff,0x80,0x6a,0x6c,0xff,0x6a,0x58,0x5a,0xff,0x59,0x4a,0x4b,0xff,0x54, 0x46,0x47,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x53,0x45,0x46,0xff,0x4e, 0x41,0x42,0xff,0x46,0x3a,0x3b,0xff,0x3a,0x30,0x31,0xff,0x2a,0x23,0x24,0xff,0x1c, 0x16,0x18,0xff,0x13,0x0f,0x10,0xff,0x10,0x0d,0x0e,0xff,0x1c,0x18,0x18,0xff,0x41, 0x37,0x38,0xff,0x58,0x4a,0x4b,0xff,0x50,0x43,0x44,0xff,0x52,0x44,0x45,0xff,0x57, 0x48,0x49,0xff,0x5b,0x4d,0x4e,0xff,0x5b,0x4c,0x4d,0xff,0x59,0x4b,0x4c,0xff,0x57, 0x49,0x4a,0xff,0x56,0x47,0x49,0xff,0x56,0x47,0x49,0xff,0x55,0x47,0x48,0xff,0x54, 0x46,0x47,0xff,0x54,0x46,0x47,0xff,0x55,0x47,0x48,0xff,0x55,0x47,0x48,0xff,0x55, 0x47,0x48,0xff,0x5e,0x4e,0x4f,0xff,0x72,0x60,0x61,0xff,0x85,0x6d,0x6f,0xff,0xae, 0x9a,0x9c,0xff,0xee,0xe8,0xe9,0xff,0xff,0xff,0xff,0xff,0xb0,0xa5,0xa5,0xff,0x4f, 0x3f,0x40,0xfd,0x33,0x2b,0x2c,0xf8,0x15,0x12,0x12,0xee,0x03,0x03,0x03,0xd9,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x37,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x62,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0xce,0x37,0x32,0x37,0xe6,0x5e, 0x53,0x5f,0xf4,0x5e,0x52,0x5f,0xfb,0x5e,0x52,0x5f,0xfe,0x5e,0x52,0x5f,0xff,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5e,0xff,0x59,0x50,0x5b,0xff,0x6f,0x5b,0x6b,0xff,0x8d, 0x69,0x6d,0xff,0x96,0x6c,0x6f,0xff,0x7c,0x62,0x74,0xff,0x34,0x39,0x36,0xff,0x16, 0x23,0x17,0xff,0x2c,0x33,0x2c,0xff,0x46,0x44,0x46,0xff,0x4d,0x48,0x4e,0xff,0x4f, 0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4f,0x49,0x50,0xff,0x4d,0x47,0x4e,0xff,0x4c, 0x47,0x4c,0xff,0x4c,0x47,0x4d,0xff,0x4d,0x48,0x4d,0xff,0x4d,0x48,0x4d,0xff,0x4d, 0x48,0x4e,0xff,0x4e,0x49,0x4f,0xff,0x4f,0x49,0x50,0xff,0x4b,0x47,0x4c,0xff,0x3c, 0x3f,0x3e,0xff,0x0b,0x1a,0x0f,0xff,0x27,0x30,0x28,0xff,0x2a,0x33,0x2c,0xff,0x29, 0x31,0x2a,0xff,0x34,0x39,0x35,0xfe,0x3f,0x3f,0x3f,0xfc,0x5a,0x51,0x5a,0xf6,0x33, 0x2a,0x32,0xea,0x04,0x03,0x04,0xd4,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x78,0x01,0x01,0x01,0xa4,0x0f, 0x0f,0x0f,0xc7,0x35,0x35,0x35,0xde,0x45,0x45,0x45,0xed,0x32,0x32,0x32,0xf6,0x33, 0x33,0x33,0xfb,0x1a,0x1a,0x1a,0xfd,0x15,0x15,0x15,0xfe,0x63,0x63,0x63,0xff,0x20, 0x20,0x20,0xff,0x01,0x01,0x01,0xff,0x2d,0x2d,0x2d,0xff,0x45,0x45,0x45,0xff,0x10, 0x10,0x10,0xfe,0x25,0x25,0x25,0xfd,0x30,0x30,0x30,0xfc,0x00,0x00,0x00,0xfb,0x1b, 0x1b,0x1b,0xf9,0x43,0x43,0x43,0xf5,0x32,0x32,0x32,0xee,0x17,0x17,0x17,0xdf,0x00, 0x00,0x00,0xcb,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xd6,0x0d, 0x0b,0x0b,0xea,0x25,0x1e,0x1f,0xf7,0x0e,0x0c,0x0d,0xfb,0x13,0x10,0x10,0xfd,0x49, 0x3d,0x3e,0xfb,0x2d,0x25,0x26,0xf5,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xe3,0x00, 0x00,0x00,0xda,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xd7,0x00, 0x00,0x00,0xdd,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xef,0x01,0x00,0x00,0xf6,0x02, 0x02,0x02,0xfc,0x04,0x04,0x04,0xfe,0x08,0x06,0x06,0xfe,0x0c,0x0a,0x0a,0xfe,0x0f, 0x0d,0x0d,0xfd,0x11,0x0e,0x0e,0xfe,0x11,0x0e,0x0e,0xfd,0x0f,0x0e,0x0e,0xfe,0x14, 0x11,0x11,0xfe,0x34,0x2b,0x2c,0xff,0x5a,0x4c,0x4e,0xff,0x69,0x58,0x59,0xff,0x9a, 0x8a,0x8b,0xff,0xec,0xe6,0xe6,0xff,0xff,0xff,0xff,0xff,0xca,0xbf,0xc0,0xff,0x75, 0x5f,0x61,0xff,0x63,0x55,0x56,0xff,0x38,0x2f,0x30,0xfe,0x16,0x11,0x12,0xfc,0x12, 0x0f,0x0f,0xfb,0x13,0x10,0x10,0xf9,0x12,0x0f,0x0f,0xf7,0x10,0x0d,0x0e,0xf7,0x0d, 0x0b,0x0b,0xf7,0x0a,0x07,0x07,0xf9,0x05,0x05,0x05,0xfc,0x04,0x04,0x04,0xfe,0x0a, 0x09,0x08,0xff,0x16,0x12,0x13,0xff,0x28,0x21,0x22,0xff,0x36,0x2b,0x2c,0xff,0x47, 0x38,0x39,0xff,0x5b,0x48,0x4a,0xff,0x67,0x52,0x54,0xff,0x6d,0x58,0x5a,0xff,0x6d, 0x57,0x59,0xff,0x69,0x53,0x55,0xff,0x63,0x4f,0x51,0xff,0x5e,0x4b,0x4c,0xff,0x59, 0x47,0x48,0xff,0x55,0x43,0x44,0xff,0x51,0x40,0x41,0xff,0x4d,0x3d,0x3e,0xff,0x4b, 0x3b,0x3c,0xff,0x49,0x39,0x3a,0xff,0x47,0x38,0x39,0xff,0x4a,0x3a,0x3c,0xff,0x59, 0x47,0x48,0xff,0x6e,0x58,0x59,0xff,0x75,0x5a,0x5c,0xff,0xd3,0xc9,0xca,0xff,0xff, 0xff,0xff,0xff,0xdb,0xd4,0xd5,0xff,0x76,0x68,0x69,0xff,0x47,0x3a,0x3b,0xff,0x42, 0x38,0x38,0xff,0x4c,0x40,0x41,0xff,0x64,0x52,0x53,0xff,0xdb,0xd6,0xd6,0xff,0xff, 0xff,0xff,0xff,0xd4,0xc8,0xc9,0xff,0x93,0x7e,0x80,0xff,0x73,0x60,0x62,0xff,0x59, 0x4a,0x4b,0xff,0x45,0x39,0x3a,0xff,0x3f,0x34,0x35,0xff,0x3f,0x34,0x35,0xff,0x3e, 0x33,0x34,0xff,0x43,0x39,0x3a,0xff,0x52,0x46,0x46,0xff,0x56,0x49,0x49,0xff,0x51, 0x45,0x46,0xff,0x55,0x48,0x49,0xff,0x59,0x4b,0x4c,0xff,0x53,0x45,0x46,0xff,0x70, 0x5f,0x60,0xff,0x85,0x72,0x73,0xff,0x91,0x78,0x7a,0xff,0xeb,0xe5,0xe5,0xff,0xff, 0xff,0xff,0xff,0xd2,0xc7,0xc8,0xff,0x6d,0x5e,0x5f,0xff,0x4d,0x40,0x41,0xff,0x46, 0x3a,0x3b,0xff,0x52,0x44,0x45,0xff,0x70,0x5e,0x5f,0xff,0xf2,0xf0,0xf0,0xff,0xff, 0xff,0xff,0xff,0xcf,0xc4,0xc5,0xff,0x76,0x64,0x65,0xff,0x51,0x44,0x44,0xff,0x30, 0x28,0x29,0xff,0x1b,0x15,0x17,0xff,0x12,0x0f,0x0e,0xff,0x10,0x0e,0x0e,0xff,0x10, 0x0d,0x0d,0xff,0x17,0x13,0x13,0xff,0x13,0x10,0x11,0xff,0x3c,0x32,0x33,0xff,0x2f, 0x28,0x28,0xff,0x22,0x1d,0x1d,0xff,0x13,0x10,0x10,0xff,0x13,0x10,0x10,0xff,0x13, 0x10,0x10,0xff,0x13,0x11,0x11,0xff,0x11,0x0e,0x0f,0xff,0x10,0x0d,0x0d,0xff,0x0d, 0x0b,0x0b,0xff,0x0a,0x08,0x08,0xff,0x06,0x06,0x06,0xff,0x0c,0x09,0x09,0xff,0x1f, 0x1a,0x1b,0xff,0x42,0x36,0x37,0xff,0x71,0x5f,0x61,0xff,0xd6,0xcb,0xcb,0xff,0xff, 0xff,0xff,0xff,0xfc,0xfb,0xfb,0xff,0xc2,0xab,0xae,0xff,0xcb,0xb7,0xba,0xff,0xdb, 0xcf,0xd0,0xff,0xe7,0xe0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf9,0xf8,0xf8,0xff,0xe7,0xe3,0xe3,0xff,0xd2,0xca,0xcb,0xff,0xb1, 0xa7,0xa8,0xff,0x8d,0x7f,0x80,0xff,0x72,0x63,0x64,0xff,0x52,0x40,0x42,0xff,0x4d, 0x3f,0x40,0xff,0x46,0x39,0x3a,0xff,0x3d,0x32,0x33,0xff,0x32,0x2a,0x2a,0xff,0x2a, 0x23,0x23,0xff,0x19,0x15,0x15,0xff,0x0f,0x0c,0x0d,0xff,0x12,0x0e,0x10,0xff,0x27, 0x22,0x21,0xff,0x47,0x3a,0x3c,0xff,0x7a,0x69,0x6b,0xff,0xdf,0xd7,0xd7,0xff,0xff, 0xff,0xff,0xff,0xe5,0xdc,0xdd,0xff,0x8b,0x6c,0x6e,0xff,0x78,0x60,0x62,0xff,0x5f, 0x4b,0x4c,0xff,0x4b,0x3b,0x3c,0xff,0x45,0x36,0x37,0xff,0x46,0x37,0x38,0xff,0x46, 0x37,0x38,0xff,0x46,0x37,0x38,0xff,0x46,0x37,0x38,0xff,0x46,0x37,0x38,0xff,0x46, 0x37,0x38,0xff,0x46,0x37,0x38,0xff,0x46,0x37,0x38,0xff,0x46,0x37,0x38,0xff,0x46, 0x37,0x38,0xff,0x44,0x35,0x36,0xff,0x3f,0x31,0x32,0xff,0x35,0x29,0x2a,0xff,0x28, 0x1d,0x1d,0xff,0x20,0x18,0x18,0xff,0x1d,0x18,0x19,0xff,0x14,0x10,0x11,0xff,0x15, 0x11,0x11,0xff,0x1c,0x18,0x18,0xff,0x30,0x28,0x28,0xff,0x4e,0x40,0x40,0xff,0x64, 0x52,0x53,0xff,0x6f,0x5a,0x5c,0xff,0x71,0x5c,0x5d,0xff,0x6f,0x59,0x5a,0xff,0x6b, 0x55,0x57,0xff,0x67,0x51,0x53,0xff,0x61,0x4d,0x4e,0xff,0x5c,0x49,0x4b,0xff,0x58, 0x45,0x47,0xff,0x53,0x41,0x42,0xff,0x4f,0x3e,0x3f,0xff,0x4c,0x3c,0x3d,0xff,0x4b, 0x3b,0x3c,0xff,0x49,0x39,0x3a,0xff,0x48,0x38,0x39,0xff,0x50,0x3f,0x40,0xff,0x63, 0x4f,0x51,0xff,0x74,0x5b,0x5d,0xff,0xa1,0x8b,0x8d,0xff,0xea,0xe4,0xe5,0xff,0xff, 0xff,0xff,0xff,0xad,0xa1,0xa2,0xff,0x4a,0x3a,0x3c,0xfd,0x30,0x28,0x2a,0xfa,0x15, 0x11,0x11,0xf2,0x03,0x03,0x03,0xe0,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0x82,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5f,0x00, 0x00,0x00,0x6d,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xc5,0x14, 0x15,0x15,0xde,0x50,0x47,0x51,0xf0,0x61,0x55,0x62,0xf9,0x5e,0x52,0x5f,0xfd,0x5e, 0x52,0x5f,0xfe,0x5e,0x52,0x5f,0xff,0x5f,0x52,0x5f,0xff,0x5f,0x52,0x5f,0xff,0x5f, 0x52,0x5f,0xff,0x59,0x50,0x5d,0xff,0x6e,0x59,0x66,0xff,0x7c,0x5f,0x64,0xff,0x76, 0x5d,0x69,0xff,0x5d,0x51,0x58,0xff,0x28,0x2b,0x29,0xff,0x21,0x2b,0x22,0xff,0x35, 0x39,0x34,0xff,0x4f,0x48,0x4f,0xff,0x52,0x4a,0x52,0xff,0x50,0x4a,0x51,0xff,0x4f, 0x49,0x51,0xff,0x4d,0x48,0x4d,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4c, 0x47,0x4d,0xff,0x4c,0x47,0x4c,0xff,0x51,0x4a,0x53,0xff,0x43,0x43,0x44,0xff,0x32, 0x38,0x33,0xff,0x37,0x3a,0x38,0xff,0x44,0x42,0x46,0xff,0x4a,0x44,0x44,0xff,0x42, 0x40,0x40,0xff,0x41,0x3e,0x40,0xff,0x40,0x3e,0x40,0xfe,0x49,0x45,0x4a,0xfc,0x54, 0x4e,0x55,0xf7,0x4a,0x3f,0x4a,0xed,0x07,0x06,0x07,0xdc,0x00,0x00,0x00,0xc0,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x54,0x00, 0x00,0x00,0x7e,0x03,0x03,0x03,0xa9,0x38,0x38,0x38,0xc9,0x42,0x42,0x42,0xdf,0x21, 0x21,0x21,0xed,0x13,0x13,0x13,0xf5,0x00,0x00,0x00,0xfa,0x01,0x01,0x01,0xfc,0x13, 0x13,0x13,0xfe,0x49,0x49,0x49,0xfd,0x00,0x00,0x00,0xfe,0x05,0x05,0x05,0xfd,0x37, 0x37,0x37,0xfd,0x1c,0x1c,0x1c,0xfb,0x06,0x06,0x06,0xfa,0x30,0x30,0x30,0xf7,0x1a, 0x1a,0x1a,0xf4,0x00,0x00,0x00,0xf1,0x24,0x24,0x24,0xed,0x43,0x43,0x43,0xe8,0x25, 0x25,0x25,0xdc,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x94,0x00, 0x00,0x00,0x7e,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x9f,0x00, 0x00,0x00,0xc1,0x08,0x07,0x07,0xdd,0x24,0x1e,0x1f,0xee,0x1b,0x16,0x18,0xf8,0x00, 0x00,0x00,0xfc,0x02,0x01,0x01,0xfd,0x08,0x07,0x07,0xfa,0x05,0x04,0x05,0xf5,0x00, 0x00,0x00,0xeb,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xd7,0x00,0x00,0x00,0xd3,0x00, 0x00,0x00,0xd2,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0xe5,0x00, 0x00,0x00,0xee,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xfd,0x01, 0x01,0x01,0xfd,0x01,0x01,0x01,0xfc,0x01,0x02,0x02,0xfb,0x02,0x01,0x01,0xfb,0x01, 0x01,0x01,0xfb,0x02,0x02,0x02,0xfd,0x03,0x02,0x02,0xfe,0x10,0x0d,0x0d,0xfe,0x2e, 0x27,0x27,0xff,0x4a,0x3c,0x3e,0xff,0x88,0x79,0x7b,0xff,0xe7,0xe2,0xe2,0xff,0xff, 0xff,0xff,0xff,0xbe,0xb5,0xb5,0xff,0x53,0x42,0x44,0xff,0x3e,0x34,0x35,0xff,0x1d, 0x19,0x19,0xfd,0x06,0x06,0x06,0xf9,0x01,0x01,0x01,0xf5,0x01,0x02,0x02,0xf0,0x01, 0x01,0x01,0xec,0x02,0x02,0x02,0xeb,0x01,0x02,0x02,0xee,0x01,0x00,0x00,0xf2,0x00, 0x00,0x00,0xf7,0x03,0x03,0x03,0xfb,0x0e,0x0c,0x0c,0xfd,0x1f,0x1a,0x1a,0xfe,0x35, 0x2b,0x2c,0xff,0x7e,0x75,0x75,0xff,0xb6,0xad,0xae,0xff,0xb9,0xae,0xaf,0xff,0xbf, 0xb4,0xb5,0xff,0xc3,0xb7,0xb8,0xff,0xc3,0xb6,0xb7,0xff,0xc2,0xb7,0xb8,0xff,0xc1, 0xb7,0xb8,0xff,0xbd,0xb4,0xb4,0xff,0xba,0xb1,0xb2,0xff,0xb7,0xaf,0xaf,0xff,0xb4, 0xac,0xad,0xff,0xb2,0xaa,0xab,0xff,0xb0,0xa8,0xa9,0xff,0xae,0xa6,0xa7,0xff,0xac, 0xa5,0xa6,0xff,0xad,0xa6,0xa6,0xff,0xb3,0xab,0xac,0xff,0xbb,0xb2,0xb3,0xff,0xbe, 0xb2,0xb3,0xff,0xed,0xe9,0xe9,0xff,0xff,0xff,0xff,0xff,0xd9,0xd2,0xd3,0xff,0x6b, 0x5f,0x60,0xff,0x3c,0x32,0x33,0xff,0x3d,0x33,0x34,0xff,0x4b,0x3e,0x3f,0xff,0x65, 0x52,0x53,0xff,0xdb,0xd6,0xd6,0xff,0xff,0xff,0xff,0xff,0xd2,0xc5,0xc5,0xff,0x8f, 0x76,0x78,0xff,0x6d,0x56,0x59,0xff,0x52,0x41,0x42,0xff,0x3c,0x2f,0x30,0xff,0x36, 0x29,0x2a,0xff,0x36,0x29,0x2a,0xff,0x33,0x27,0x27,0xff,0x4c,0x3c,0x3e,0xff,0x4a, 0x3c,0x3d,0xff,0x3b,0x2e,0x2f,0xff,0x34,0x28,0x29,0xff,0x33,0x26,0x27,0xff,0x31, 0x25,0x26,0xff,0x3b,0x2d,0x2e,0xff,0x4f,0x3f,0x40,0xff,0x6a,0x55,0x58,0xff,0x7d, 0x60,0x63,0xff,0xe6,0xe1,0xe1,0xff,0xff,0xff,0xff,0xff,0xd7,0xcd,0xce,0xff,0x73, 0x64,0x65,0xff,0x4d,0x40,0x41,0xff,0x46,0x3a,0x3b,0xff,0x52,0x44,0x45,0xff,0x70, 0x5e,0x5e,0xff,0xf2,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff,0xcc,0xc1,0xc2,0xff,0x69, 0x59,0x5b,0xff,0x40,0x35,0x35,0xff,0x1f,0x1a,0x1a,0xff,0x0f,0x0c,0x0d,0xff,0x0d, 0x0b,0x0b,0xff,0x12,0x10,0x10,0xff,0x16,0x12,0x13,0xff,0x34,0x2b,0x2c,0xff,0x1d, 0x18,0x19,0xff,0x2b,0x24,0x24,0xff,0x36,0x2c,0x2d,0xff,0x15,0x12,0x13,0xff,0x02, 0x02,0x02,0xff,0x02,0x02,0x02,0xff,0x02,0x02,0x02,0xff,0x02,0x02,0x02,0xff,0x02, 0x01,0x01,0xff,0x02,0x01,0x01,0xff,0x01,0x01,0x01,0xff,0x01,0x01,0x01,0xff,0x00, 0x01,0x01,0xff,0x09,0x08,0x08,0xff,0x1d,0x19,0x19,0xff,0x42,0x36,0x37,0xff,0x71, 0x61,0x61,0xff,0xd9,0xcd,0xce,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xf5, 0xf1,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfe,0xff,0xee, 0xe8,0xe9,0xff,0xe3,0xd9,0xda,0xff,0xc7,0xb9,0xba,0xff,0xb2,0xa0,0xa1,0xff,0x92, 0x7f,0x80,0xff,0x71,0x5d,0x5f,0xff,0x5a,0x49,0x4a,0xff,0x50,0x42,0x42,0xff,0x46, 0x3a,0x3b,0xff,0x3d,0x32,0x33,0xff,0x32,0x2a,0x2a,0xff,0x28,0x21,0x22,0xff,0x1f, 0x1a,0x1a,0xff,0x1e,0x18,0x19,0xff,0x2d,0x26,0x27,0xff,0x1c,0x19,0x18,0xff,0x14, 0x11,0x11,0xff,0x17,0x13,0x14,0xff,0x27,0x20,0x21,0xff,0x49,0x3c,0x3d,0xff,0x83, 0x72,0x74,0xff,0xe3,0xda,0xdc,0xff,0xff,0xff,0xff,0xff,0xf3,0xef,0xef,0xff,0xc8, 0xbc,0xbd,0xff,0xc3,0xb8,0xb9,0xff,0xb8,0xae,0xaf,0xff,0xaf,0xa7,0xa7,0xff,0xab, 0xa6,0xa6,0xff,0xac,0xa6,0xa6,0xff,0xac,0xa6,0xa6,0xff,0xac,0xa6,0xa6,0xff,0xac, 0xa6,0xa6,0xff,0xac,0xa6,0xa6,0xff,0xac,0xa6,0xa6,0xff,0xac,0xa6,0xa6,0xff,0xac, 0xa6,0xa6,0xff,0xac,0xa6,0xa6,0xff,0xac,0xa6,0xa6,0xff,0xac,0xa5,0xa6,0xff,0xa9, 0xa3,0xa3,0xff,0xa6,0xa0,0xa0,0xff,0xa4,0x9f,0xa0,0xff,0x6c,0x67,0x67,0xff,0x14, 0x0e,0x0e,0xff,0x17,0x13,0x13,0xff,0x1b,0x17,0x17,0xff,0x27,0x20,0x21,0xff,0x50, 0x47,0x47,0xff,0x95,0x8c,0x8d,0xff,0xbb,0xb2,0xb3,0xff,0xc8,0xbd,0xbe,0xff,0xcb, 0xbf,0xc0,0xff,0xc4,0xb8,0xb9,0xff,0xc2,0xb6,0xb7,0xff,0xc1,0xb7,0xb8,0xff,0xbf, 0xb6,0xb6,0xff,0xbd,0xb3,0xb4,0xff,0xb9,0xb1,0xb0,0xff,0xb6,0xad,0xae,0xff,0xb4, 0xab,0xac,0xff,0xb1,0xaa,0xaa,0xff,0xaf,0xa8,0xa9,0xff,0xad,0xa6,0xa7,0xff,0xad, 0xa6,0xa6,0xff,0xb0,0xa8,0xa9,0xff,0xb7,0xae,0xaf,0xff,0xbe,0xb2,0xb4,0xff,0xd4, 0xcb,0xcc,0xff,0xf6,0xf4,0xf4,0xff,0xff,0xff,0xff,0xff,0xa8,0x9f,0xa0,0xff,0x3c, 0x2f,0x30,0xfe,0x2a,0x22,0x24,0xfc,0x11,0x0f,0x0f,0xf5,0x03,0x03,0x02,0xe9,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x94,0x00, 0x00,0x00,0x8d,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0xdb,0x37,0x32,0x37,0xec,0x5f,0x54,0x60,0xf7,0x5f, 0x52,0x60,0xfc,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5f, 0x53,0x60,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5e,0xff,0x5d, 0x51,0x5f,0xff,0x58,0x4f,0x5d,0xff,0x69,0x56,0x60,0xff,0x73,0x5d,0x6a,0xff,0x5f, 0x53,0x5e,0xff,0x44,0x42,0x45,0xff,0x42,0x41,0x42,0xff,0x35,0x39,0x36,0xff,0x4d, 0x47,0x4d,0xff,0x4c,0x47,0x4d,0xff,0x4c,0x47,0x4d,0xff,0x4d,0x48,0x4e,0xff,0x4e, 0x49,0x4f,0xff,0x4d,0x48,0x4e,0xff,0x4e,0x49,0x50,0xff,0x50,0x4a,0x51,0xff,0x36, 0x3b,0x37,0xff,0x41,0x41,0x43,0xff,0x4d,0x46,0x4a,0xff,0x55,0x4c,0x53,0xff,0x87, 0x67,0x7a,0xff,0x98,0x72,0x87,0xff,0x62,0x54,0x60,0xff,0x5f,0x52,0x5e,0xff,0x62, 0x54,0x61,0xfd,0x59,0x50,0x5a,0xfa,0x46,0x44,0x47,0xf1,0x12,0x10,0x12,0xe2,0x01, 0x01,0x01,0xc9,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x74,0x01,0x01,0x01,0x9b,0x19, 0x19,0x19,0xb9,0x0a,0x0a,0x0a,0xcf,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xea,0x00, 0x00,0x00,0xf3,0x02,0x02,0x02,0xf7,0x1e,0x1e,0x1e,0xf9,0x2e,0x2e,0x2e,0xfa,0x00, 0x00,0x00,0xfa,0x05,0x05,0x05,0xf8,0x30,0x30,0x30,0xf7,0x2f,0x2f,0x2f,0xf3,0x34, 0x34,0x34,0xef,0x20,0x20,0x20,0xea,0x01,0x01,0x01,0xe3,0x01,0x01,0x01,0xdc,0x0f, 0x0f,0x0f,0xd5,0x19,0x19,0x19,0xcc,0x04,0x04,0x04,0xbf,0x00,0x00,0x00,0xa9,0x00, 0x00,0x00,0x8f,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0xa1,0x03,0x02,0x02,0xc6,0x15,0x11,0x11,0xe3,0x1c, 0x18,0x18,0xf3,0x04,0x03,0x03,0xfb,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0xfa,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0xe4,0x00, 0x00,0x00,0xdd,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0xdc,0x00, 0x00,0x00,0xe2,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0xf7,0x00, 0x00,0x00,0xfb,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xf9,0x00, 0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf9,0x00,0x00,0x00,0xfb,0x01, 0x01,0x01,0xfd,0x0c,0x0a,0x0a,0xfe,0x26,0x20,0x20,0xfe,0x50,0x41,0x42,0xff,0x98, 0x88,0x89,0xff,0xe9,0xe4,0xe4,0xff,0xff,0xff,0xff,0xff,0xbe,0xb4,0xb5,0xff,0x51, 0x3f,0x41,0xff,0x39,0x30,0x31,0xfd,0x18,0x14,0x14,0xfa,0x04,0x03,0x03,0xf4,0x00, 0x00,0x00,0xec,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xda,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xf1,0x04,0x03,0x03,0xf7,0x13, 0x10,0x10,0xfc,0x2a,0x23,0x24,0xfe,0x48,0x39,0x3b,0xff,0xbe,0xb6,0xb7,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf7,0xf4,0xf4,0xff,0xf1,0xea,0xeb,0xff,0xf5,0xef,0xef,0xff,0xf7, 0xf2,0xf2,0xff,0xf8,0xf3,0xf3,0xff,0xfa,0xf5,0xf6,0xff,0xfa,0xf5,0xf5,0xff,0xf8, 0xf5,0xf4,0xff,0xf8,0xf3,0xf3,0xff,0xf6,0xf2,0xf2,0xff,0xf4,0xf1,0xf1,0xff,0xf3, 0xf0,0xf0,0xff,0xf3,0xf0,0xef,0xff,0xf2,0xef,0xf0,0xff,0xe9,0xe4,0xe6,0xff,0xea, 0xe7,0xe7,0xff,0xb3,0xab,0xac,0xff,0x55,0x4a,0x4c,0xff,0x31,0x28,0x2a,0xff,0x36, 0x2d,0x2e,0xff,0x48,0x3b,0x3c,0xff,0x66,0x53,0x54,0xff,0xdc,0xd7,0xd7,0xff,0xff, 0xff,0xff,0xff,0xf0,0xeb,0xea,0xff,0xd7,0xce,0xcf,0xff,0xcc,0xc4,0xc5,0xff,0xc3, 0xbb,0xbd,0xff,0xbb,0xb6,0xb6,0xff,0xb8,0xb3,0xb4,0xff,0xb8,0xb3,0xb4,0xff,0xb7, 0xb2,0xb3,0xff,0xc3,0xbc,0xbd,0xff,0xb9,0xb3,0xb5,0xff,0xb6,0xb2,0xb2,0xff,0xb8, 0xb3,0xb4,0xff,0xb8,0xb3,0xb4,0xff,0xb8,0xb3,0xb4,0xff,0xbb,0xb6,0xb6,0xff,0xc3, 0xbc,0xbc,0xff,0xcc,0xc3,0xc4,0xff,0xd2,0xc7,0xc8,0xff,0xf7,0xf5,0xf5,0xff,0xff, 0xff,0xff,0xff,0xd4,0xc9,0xca,0xff,0x89,0x77,0x78,0xff,0x55,0x47,0x48,0xff,0x46, 0x3a,0x3b,0xff,0x52,0x44,0x45,0xff,0x6d,0x5b,0x5c,0xff,0xf1,0xf0,0xf0,0xff,0xff, 0xff,0xff,0xff,0xc8,0xc0,0xbf,0xff,0x6e,0x5f,0x61,0xff,0x52,0x44,0x45,0xff,0x37, 0x2e,0x2e,0xff,0x24,0x1d,0x1e,0xff,0x1b,0x17,0x17,0xff,0x1a,0x15,0x15,0xff,0x14, 0x12,0x12,0xff,0x40,0x36,0x36,0xff,0x1f,0x19,0x1a,0xff,0x0c,0x0a,0x0a,0xff,0x0a, 0x08,0x08,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x08,0x07,0x07,0xff,0x1d, 0x19,0x19,0xff,0x42,0x36,0x37,0xff,0x73,0x62,0x63,0xff,0xda,0xce,0xcf,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff,0xf4,0xf0,0xf1,0xff,0xe0, 0xd5,0xd6,0xff,0xc3,0xad,0xaf,0xff,0xb4,0x99,0x9b,0xff,0xac,0x8f,0x92,0xff,0x92, 0x75,0x77,0xff,0x87,0x6e,0x70,0xff,0x7a,0x64,0x66,0xff,0x6d,0x5a,0x5c,0xff,0x5e, 0x4e,0x50,0xff,0x4e,0x41,0x42,0xff,0x3f,0x35,0x37,0xff,0x30,0x29,0x2a,0xff,0x26, 0x1f,0x1f,0xff,0x1b,0x16,0x16,0xff,0x16,0x13,0x12,0xff,0x27,0x21,0x21,0xff,0x2c, 0x26,0x26,0xff,0x31,0x29,0x2a,0xff,0x22,0x1d,0x1e,0xff,0x36,0x2e,0x2f,0xff,0x40, 0x36,0x38,0xff,0x5a,0x4d,0x4d,0xff,0x8b,0x7a,0x7a,0xff,0xe1,0xd9,0xda,0xff,0xff, 0xff,0xff,0xff,0xfb,0xf9,0xfa,0xff,0xf4,0xef,0xf0,0xff,0xf2,0xee,0xee,0xff,0xee, 0xec,0xed,0xff,0xed,0xeb,0xeb,0xff,0xec,0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xec, 0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xec, 0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xec, 0xea,0xea,0xff,0xec,0xea,0xea,0xff,0xeb,0xea,0xea,0xff,0xea,0xea,0xea,0xff,0xef, 0xed,0xed,0xff,0x96,0x92,0x93,0xff,0x0d,0x09,0x08,0xff,0x1a,0x16,0x16,0xff,0x24, 0x1e,0x1e,0xff,0x34,0x29,0x2a,0xff,0x7b,0x6f,0x71,0xff,0xea,0xe5,0xe6,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, 0xfe,0xfe,0xff,0xf8,0xf3,0xf4,0xff,0xf2,0xec,0xec,0xff,0xf5,0xf0,0xf1,0xff,0xf7, 0xf1,0xf2,0xff,0xf8,0xf4,0xf4,0xff,0xfa,0xf5,0xf6,0xff,0xf9,0xf4,0xf4,0xff,0xf8, 0xf4,0xf4,0xff,0xf7,0xf3,0xf3,0xff,0xf6,0xf2,0xf1,0xff,0xf4,0xf1,0xf1,0xff,0xf3, 0xf0,0xf1,0xff,0xf2,0xef,0xf0,0xff,0xed,0xea,0xeb,0xff,0xe7,0xe3,0xe3,0xff,0xe7, 0xe3,0xe3,0xff,0x8a,0x81,0x81,0xff,0x30,0x26,0x27,0xfe,0x20,0x1b,0x1c,0xfc,0x0d, 0x0b,0x0b,0xf9,0x02,0x01,0x01,0xf2,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xd8,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xe0,0x17,0x17,0x16,0xed,0x50, 0x47,0x50,0xf6,0x61,0x54,0x62,0xfb,0x5e,0x52,0x5f,0xfd,0x5e,0x52,0x5f,0xff,0x5e, 0x52,0x5f,0xff,0x5f,0x53,0x60,0xff,0x5e,0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5d, 0x51,0x5f,0xff,0x5b,0x50,0x5c,0xff,0x63,0x56,0x63,0xff,0x5a,0x50,0x5b,0xff,0x48, 0x46,0x4b,0xff,0x45,0x43,0x46,0xff,0x50,0x49,0x51,0xff,0x52,0x4b,0x53,0xff,0x52, 0x4b,0x53,0xff,0x4b,0x46,0x4c,0xff,0x3d,0x3e,0x3e,0xff,0x42,0x41,0x43,0xff,0x48, 0x45,0x49,0xff,0x47,0x45,0x48,0xff,0x50,0x49,0x51,0xff,0x4f,0x49,0x50,0xff,0x43, 0x42,0x43,0xff,0x3b,0x3e,0x40,0xff,0x48,0x45,0x49,0xff,0x7a,0x60,0x6f,0xff,0x79, 0x60,0x75,0xff,0x65,0x56,0x65,0xff,0x5f,0x51,0x55,0xff,0x5e,0x51,0x58,0xff,0x3a, 0x3c,0x39,0xff,0x36,0x3a,0x37,0xfe,0x3a,0x3c,0x3b,0xfb,0x57,0x4f,0x57,0xf5,0x18, 0x1a,0x19,0xe7,0x01,0x01,0x01,0xd2,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x02,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,0x02,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x5a,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0xad,0x00, 0x00,0x00,0xc2,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xe3,0x06,0x06,0x06,0xeb,0x44, 0x44,0x44,0xef,0x0d,0x0d,0x0d,0xef,0x00,0x00,0x00,0xed,0x01,0x01,0x01,0xea,0x10, 0x10,0x10,0xe6,0x26,0x26,0x26,0xe1,0x15,0x15,0x15,0xd9,0x01,0x01,0x01,0xce,0x00, 0x00,0x00,0xc1,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xa1,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0xa4,0x07, 0x06,0x06,0xca,0x2a,0x22,0x23,0xe5,0x1f,0x1a,0x1a,0xf4,0x00,0x00,0x00,0xfc,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0xf3,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0xe5,0x01, 0x01,0x01,0xe4,0x05,0x04,0x04,0xe7,0x09,0x07,0x08,0xe9,0x0e,0x0b,0x0c,0xee,0x13, 0x0f,0x0f,0xf3,0x16,0x12,0x12,0xf8,0x1b,0x18,0x18,0xfb,0x16,0x12,0x12,0xfc,0x01, 0x01,0x01,0xfa,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xf6,0x00, 0x00,0x00,0xf8,0x00,0x00,0x00,0xfa,0x01,0x01,0x01,0xfd,0x0c,0x0b,0x0b,0xfe,0x2b, 0x25,0x25,0xfe,0x5e,0x4f,0x50,0xff,0xa4,0x94,0x95,0xff,0xeb,0xe7,0xe8,0xff,0xff, 0xff,0xff,0xff,0xbe,0xb4,0xb5,0xff,0x51,0x40,0x42,0xfe,0x3b,0x31,0x32,0xfc,0x1c, 0x17,0x17,0xf8,0x05,0x04,0x04,0xf0,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xd6,0x00, 0x00,0x00,0xce,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0xe2,0x00, 0x00,0x00,0xed,0x05,0x04,0x05,0xf6,0x18,0x14,0x14,0xfc,0x34,0x2b,0x2c,0xfe,0x58, 0x47,0x48,0xff,0xc6,0xbd,0xbe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf6,0xf2,0xf3,0xff,0xf1, 0xec,0xed,0xff,0xe2,0xd8,0xd9,0xff,0xd5,0xc6,0xc7,0xff,0xcf,0xbe,0xbf,0xff,0xbb, 0xa2,0xa5,0xff,0xb0,0x95,0x97,0xff,0xac,0x94,0x95,0xff,0xa6,0x8f,0x91,0xff,0xa1, 0x8c,0x8e,0xff,0x9e,0x89,0x8b,0xff,0x9c,0x87,0x89,0xff,0x99,0x86,0x88,0xff,0x95, 0x82,0x83,0xff,0x8d,0x7b,0x7c,0xff,0x81,0x72,0x73,0xff,0x61,0x54,0x55,0xff,0x3a, 0x32,0x32,0xff,0x2a,0x23,0x24,0xff,0x31,0x29,0x29,0xff,0x47,0x3b,0x3b,0xff,0x67, 0x53,0x55,0xff,0xdc,0xd7,0xd7,0xff,0xff,0xff,0xff,0xff,0xf8,0xf5,0xf4,0xff,0xef, 0xea,0xe9,0xff,0xea,0xe6,0xe6,0xff,0xe6,0xe1,0xe2,0xff,0xe3,0xde,0xdf,0xff,0xe1, 0xde,0xde,0xff,0xe1,0xde,0xdd,0xff,0xe1,0xde,0xde,0xff,0xdf,0xdc,0xdc,0xff,0xe1, 0xde,0xde,0xff,0xe1,0xde,0xde,0xff,0xe1,0xde,0xde,0xff,0xe1,0xde,0xde,0xff,0xe1, 0xde,0xde,0xff,0xe3,0xdf,0xdf,0xff,0xe6,0xe1,0xe2,0xff,0xea,0xe5,0xe6,0xff,0xed, 0xe7,0xe7,0xff,0xfa,0xf8,0xf8,0xff,0xff,0xff,0xff,0xff,0xcf,0xc5,0xc6,0xff,0x7f, 0x6e,0x70,0xff,0x64,0x54,0x56,0xff,0x4a,0x3e,0x3f,0xff,0x50,0x43,0x45,0xff,0x7d, 0x69,0x6c,0xff,0xf3,0xf1,0xf2,0xff,0xff,0xff,0xff,0xff,0xd4,0xca,0xcb,0xff,0x81, 0x6f,0x71,0xff,0x58,0x4b,0x4c,0xff,0x35,0x2d,0x2d,0xff,0x1d,0x19,0x19,0xff,0x11, 0x0e,0x0f,0xff,0x0c,0x09,0x0a,0xff,0x06,0x05,0x05,0xff,0x19,0x15,0x16,0xff,0x26, 0x20,0x21,0xff,0x1a,0x16,0x16,0xff,0x0f,0x0d,0x0d,0xff,0x0f,0x0c,0x0c,0xff,0x11, 0x0e,0x0f,0xff,0x1a,0x16,0x16,0xff,0x14,0x11,0x12,0xff,0x08,0x06,0x07,0xff,0x08, 0x07,0x07,0xff,0x07,0x06,0x06,0xff,0x05,0x05,0x05,0xff,0x03,0x03,0x03,0xff,0x02, 0x02,0x02,0xff,0x09,0x08,0x08,0xff,0x1e,0x1a,0x1a,0xff,0x42,0x36,0x37,0xff,0x73, 0x62,0x63,0xff,0xda,0xce,0xce,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf8,0xf5,0xf6,0xff,0xec,0xe5,0xe6,0xff,0xdf,0xd5,0xd6,0xff,0xd5, 0xc5,0xc7,0xff,0xca,0xb7,0xb8,0xff,0xb7,0xa4,0xa6,0xff,0x97,0x80,0x81,0xff,0x78, 0x63,0x64,0xff,0x6b,0x58,0x5a,0xff,0x5f,0x4e,0x50,0xff,0x55,0x45,0x47,0xff,0x4a, 0x3e,0x3e,0xff,0x42,0x38,0x39,0xff,0x40,0x36,0x37,0xff,0x3a,0x31,0x32,0xff,0x3b, 0x33,0x33,0xff,0x3e,0x34,0x35,0xff,0x1e,0x19,0x1a,0xff,0x1d,0x18,0x18,0xff,0x16, 0x14,0x14,0xff,0x2f,0x27,0x28,0xff,0x3e,0x35,0x35,0xff,0x52,0x44,0x46,0xff,0x7e, 0x6e,0x6f,0xff,0xde,0xd7,0xd7,0xff,0xff,0xff,0xff,0xff,0xe9,0xe1,0xe1,0xff,0xa2, 0x89,0x8b,0xff,0x96,0x82,0x84,0xff,0x80,0x71,0x72,0xff,0x71,0x64,0x65,0xff,0x6c, 0x60,0x61,0xff,0x6d,0x61,0x62,0xff,0x6d,0x61,0x62,0xff,0x6d,0x61,0x62,0xff,0x6d, 0x61,0x62,0xff,0x6d,0x61,0x62,0xff,0x6d,0x61,0x62,0xff,0x6d,0x61,0x62,0xff,0x6d, 0x61,0x62,0xff,0x6d,0x61,0x62,0xff,0x6d,0x61,0x62,0xff,0x6c,0x60,0x60,0xff,0x67, 0x5c,0x5d,0xff,0x60,0x56,0x57,0xff,0x56,0x4d,0x4d,0xff,0x39,0x33,0x33,0xff,0x19, 0x15,0x15,0xff,0x1a,0x16,0x17,0xff,0x29,0x23,0x23,0xff,0x40,0x34,0x35,0xff,0x85, 0x76,0x77,0xff,0xe9,0xe3,0xe4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfb,0xfa,0xff,0xf3,0xef,0xf0,0xff,0xec, 0xe4,0xe5,0xff,0xdb,0xcf,0xd0,0xff,0xd5,0xc7,0xc8,0xff,0xc5,0xb1,0xb2,0xff,0xaf, 0x94,0x96,0xff,0xaf,0x95,0x98,0xff,0xa9,0x91,0x94,0xff,0xa5,0x8e,0x90,0xff,0xa1, 0x8c,0x8d,0xff,0x9f,0x8a,0x8c,0xff,0x9c,0x87,0x89,0xff,0x98,0x85,0x87,0xff,0x93, 0x80,0x81,0xff,0x89,0x78,0x79,0xff,0x79,0x6a,0x6c,0xff,0x52,0x46,0x47,0xff,0x2c, 0x25,0x25,0xff,0x19,0x14,0x16,0xff,0x0a,0x08,0x09,0xfd,0x01,0x01,0x01,0xf9,0x00, 0x00,0x00,0xf3,0x00,0x00,0x00,0xed,0x00,0x00,0x00,0xe6,0x13,0x10,0x10,0xe1,0x2f, 0x29,0x29,0xdf,0x1b,0x17,0x18,0xe1,0x02,0x01,0x02,0xe5,0x00,0x00,0x00,0xeb,0x00, 0x00,0x00,0xf2,0x3a,0x34,0x3a,0xf7,0x61,0x55,0x61,0xfb,0x5e,0x52,0x5f,0xfd,0x5e, 0x52,0x5f,0xff,0x5e,0x52,0x5f,0xff,0x5c,0x50,0x5d,0xff,0x5d,0x50,0x5d,0xff,0x5d, 0x51,0x5d,0xff,0x5e,0x52,0x5f,0xff,0x5d,0x51,0x5d,0xff,0x5f,0x52,0x5f,0xff,0x65, 0x56,0x65,0xff,0x50,0x4a,0x51,0xff,0x4a,0x46,0x4b,0xff,0x4d,0x48,0x4d,0xff,0x4d, 0x48,0x4e,0xff,0x4e,0x49,0x50,0xff,0x4d,0x48,0x4f,0xff,0x5c,0x50,0x5c,0xff,0x5a, 0x4f,0x5a,0xff,0x4e,0x49,0x4f,0xff,0x3b,0x3d,0x3b,0xff,0x33,0x38,0x33,0xff,0x30, 0x36,0x30,0xff,0x3f,0x40,0x41,0xff,0x5b,0x50,0x5e,0xff,0x79,0x63,0x5b,0xff,0x8d, 0x6c,0x7e,0xff,0x66,0x55,0x5f,0xff,0x4e,0x48,0x4e,0xff,0x40,0x40,0x41,0xff,0x36, 0x3b,0x39,0xff,0x34,0x39,0x36,0xff,0x39,0x3b,0x39,0xfd,0x3d,0x3f,0x3d,0xfc,0x4d, 0x4a,0x4d,0xf7,0x45,0x3a,0x44,0xeb,0x08,0x05,0x08,0xd7,0x00,0x00,0x00,0xba,0x00, 0x00,0x00,0x95,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x6c,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0xb2,0x01, 0x01,0x01,0xc7,0x18,0x18,0x18,0xd4,0x3a,0x3a,0x3a,0xd9,0x00,0x00,0x00,0xd8,0x00, 0x00,0x00,0xd4,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xc8,0x01,0x01,0x01,0xbe,0x00, 0x00,0x00,0xb3,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0xa8,0x05,0x04,0x04,0xcd,0x22,0x1d,0x1e,0xe7,0x2e, 0x27,0x28,0xf5,0x18,0x14,0x15,0xfb,0x0e,0x0c,0x0b,0xfe,0x02,0x01,0x01,0xfe,0x00, 0x00,0x00,0xfc,0x03,0x02,0x02,0xf9,0x12,0x10,0x10,0xf6,0x1d,0x18,0x18,0xf0,0x22, 0x1b,0x1d,0xec,0x26,0x1f,0x20,0xe8,0x25,0x20,0x20,0xe5,0x22,0x1d,0x1d,0xe5,0x20, 0x1b,0x1c,0xe5,0x1e,0x18,0x1a,0xe8,0x1b,0x17,0x17,0xed,0x18,0x14,0x14,0xf2,0x1d, 0x18,0x18,0xf8,0x23,0x1d,0x1e,0xfa,0x0b,0x09,0x0a,0xfa,0x00,0x00,0x00,0xf7,0x00, 0x00,0x00,0xf7,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xfb,0x01, 0x00,0x00,0xfd,0x0b,0x09,0x09,0xfe,0x38,0x2f,0x31,0xfe,0x6c,0x5b,0x5c,0xff,0x9a, 0x8a,0x8b,0xff,0xe7,0xe2,0xe3,0xff,0xff,0xff,0xff,0xff,0xbc,0xb3,0xb4,0xff,0x4e, 0x3d,0x3f,0xfe,0x3f,0x36,0x36,0xfc,0x34,0x2c,0x2d,0xf7,0x17,0x13,0x14,0xee,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xca,0x00, 0x00,0x00,0xd3,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xed,0x05,0x04,0x04,0xf6,0x19, 0x15,0x16,0xfc,0x38,0x2f,0x30,0xfe,0x5e,0x4c,0x4d,0xff,0xc8,0xbf,0xc0,0xff,0xff, 0xff,0xff,0xff,0xea,0xe3,0xe4,0xff,0xdc,0xcf,0xd1,0xff,0xe3,0xd9,0xd9,0xff,0xf0, 0xeb,0xeb,0xff,0xff,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xfc,0xfb,0xfb,0xff,0xf9, 0xf6,0xf6,0xff,0xf5,0xf1,0xf2,0xff,0xee,0xe7,0xe8,0xff,0xe5,0xdc,0xdd,0xff,0xcf, 0xc0,0xc2,0xff,0xc7,0xb5,0xb7,0xff,0xaa,0x93,0x94,0xff,0x91,0x76,0x78,0xff,0x8c, 0x72,0x74,0xff,0x87,0x6e,0x70,0xff,0x7c,0x66,0x67,0xff,0x6f,0x5b,0x5c,0xff,0x5c, 0x4b,0x4c,0xff,0x46,0x39,0x3a,0xff,0x31,0x28,0x29,0xff,0x25,0x1f,0x20,0xff,0x2d, 0x26,0x27,0xff,0x43,0x38,0x39,0xff,0x62,0x50,0x51,0xff,0xdb,0xd6,0xd6,0xff,0xff, 0xff,0xff,0xff,0xd8,0xcd,0xce,0xff,0xa2,0x8d,0x8e,0xff,0x88,0x74,0x76,0xff,0x71, 0x63,0x64,0xff,0x62,0x55,0x56,0xff,0x5c,0x50,0x51,0xff,0x61,0x55,0x56,0xff,0x5e, 0x52,0x53,0xff,0x5c,0x50,0x51,0xff,0x5c,0x50,0x51,0xff,0x5c,0x50,0x51,0xff,0x5c, 0x50,0x51,0xff,0x5c,0x50,0x51,0xff,0x5b,0x4f,0x50,0xff,0x62,0x56,0x57,0xff,0x72, 0x63,0x65,0xff,0x87,0x74,0x76,0xff,0x94,0x7c,0x7f,0xff,0xea,0xe5,0xe5,0xff,0xff, 0xff,0xff,0xff,0xce,0xc5,0xc5,0xff,0x6b,0x5c,0x5e,0xff,0x5e,0x4f,0x51,0xff,0x5f, 0x50,0x50,0xff,0x65,0x56,0x56,0xff,0x82,0x6e,0x71,0xff,0xf4,0xf2,0xf2,0xff,0xff, 0xff,0xff,0xff,0xd4,0xc9,0xca,0xff,0x80,0x6d,0x6e,0xff,0x58,0x4a,0x4b,0xff,0x36, 0x2e,0x2e,0xff,0x23,0x1d,0x1e,0xff,0x1c,0x17,0x17,0xff,0x1d,0x18,0x18,0xff,0x1e, 0x18,0x19,0xff,0x1d,0x18,0x18,0xff,0x29,0x22,0x23,0xff,0x33,0x2b,0x2b,0xff,0x39, 0x31,0x31,0xff,0x39,0x30,0x30,0xff,0x38,0x30,0x30,0xff,0x3f,0x36,0x37,0xff,0x38, 0x2f,0x30,0xff,0x1e,0x18,0x19,0xff,0x1c,0x17,0x17,0xff,0x18,0x15,0x15,0xff,0x15, 0x11,0x11,0xff,0x0e,0x0c,0x0d,0xff,0x09,0x08,0x08,0xff,0x0d,0x0a,0x0b,0xff,0x20, 0x1b,0x1b,0xff,0x42,0x36,0x37,0xff,0x71,0x5f,0x61,0xff,0xd8,0xcc,0xcd,0xff,0xff, 0xff,0xff,0xff,0xfe,0xfd,0xfd,0xff,0xe3,0xda,0xdb,0xff,0xf8,0xf5,0xf5,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfb,0xfb,0xff,0xf7, 0xf4,0xf4,0xff,0xeb,0xe6,0xe6,0xff,0xd9,0xd3,0xd3,0xff,0xc7,0xbe,0xbf,0xff,0xa7, 0x9b,0x9c,0xff,0x8a,0x7d,0x7d,0xff,0x6e,0x5f,0x60,0xff,0x61,0x50,0x52,0xff,0x6b, 0x59,0x5a,0xff,0x62,0x54,0x55,0xff,0x58,0x49,0x4a,0xff,0x45,0x3a,0x3b,0xff,0x2d, 0x25,0x26,0xff,0x20,0x1b,0x1b,0xff,0x17,0x14,0x14,0xff,0x19,0x15,0x15,0xff,0x2a, 0x23,0x25,0xff,0x46,0x39,0x3a,0xff,0x78,0x68,0x6a,0xff,0xde,0xd7,0xd7,0xff,0xff, 0xff,0xff,0xff,0xe4,0xdc,0xdd,0xff,0x8b,0x6f,0x71,0xff,0x7e,0x67,0x69,0xff,0x65, 0x52,0x54,0xff,0x53,0x43,0x44,0xff,0x4e,0x3f,0x40,0xff,0x4f,0x40,0x41,0xff,0x4f, 0x40,0x41,0xff,0x4f,0x40,0x41,0xff,0x4f,0x40,0x41,0xff,0x4f,0x40,0x41,0xff,0x4f, 0x40,0x41,0xff,0x4f,0x40,0x41,0xff,0x4f,0x40,0x41,0xff,0x4f,0x40,0x41,0xff,0x4f, 0x40,0x41,0xff,0x4d,0x3e,0x3f,0xff,0x47,0x3a,0x3b,0xff,0x3f,0x33,0x34,0xff,0x32, 0x28,0x28,0xff,0x26,0x1f,0x1f,0xff,0x1d,0x18,0x19,0xff,0x1b,0x17,0x17,0xff,0x2c, 0x24,0x26,0xff,0x46,0x39,0x3a,0xff,0x89,0x7b,0x7c,0xff,0xea,0xe5,0xe6,0xff,0xff, 0xff,0xff,0xff,0xe8,0xe0,0xe1,0xff,0xdf,0xd4,0xd4,0xff,0xe9,0xe1,0xe2,0xff,0xf5, 0xf2,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfa,0xfa,0xff,0xf9, 0xf6,0xf6,0xff,0xf2,0xec,0xec,0xff,0xea,0xe2,0xe3,0xff,0xdf,0xd4,0xd5,0xff,0xc9, 0xb9,0xba,0xff,0xc0,0xad,0xaf,0xff,0xa5,0x8e,0x90,0xff,0x8e,0x75,0x77,0xff,0x8c, 0x72,0x75,0xff,0x85,0x6c,0x6e,0xff,0x78,0x62,0x63,0xff,0x67,0x55,0x56,0xff,0x52, 0x43,0x44,0xff,0x3c,0x32,0x32,0xff,0x26,0x20,0x20,0xff,0x14,0x10,0x10,0xfe,0x08, 0x06,0x06,0xfe,0x01,0x01,0x01,0xfd,0x00,0x00,0x00,0xfa,0x04,0x04,0x04,0xf8,0x2f, 0x29,0x29,0xf5,0x4a,0x3f,0x3f,0xf3,0x45,0x3b,0x3b,0xf3,0x60,0x52,0x53,0xf3,0x37, 0x2f,0x30,0xf5,0x00,0x00,0x00,0xf7,0x1a,0x19,0x1a,0xfa,0x52,0x48,0x53,0xfc,0x61, 0x54,0x63,0xfe,0x5d,0x51,0x5e,0xff,0x5d,0x51,0x5e,0xff,0x59,0x4d,0x5a,0xff,0x7c, 0x73,0x7d,0xff,0x75,0x6b,0x76,0xff,0x61,0x55,0x62,0xff,0x5d,0x51,0x5e,0xff,0x5d, 0x51,0x5d,0xff,0x66,0x56,0x66,0xff,0x5b,0x50,0x5b,0xff,0x4c,0x48,0x4d,0xff,0x4b, 0x47,0x4b,0xff,0x4d,0x48,0x4d,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x51, 0x4a,0x51,0xff,0x4e,0x48,0x4e,0xff,0x56,0x4d,0x56,0xff,0x56,0x4e,0x57,0xff,0x4a, 0x46,0x4a,0xff,0x45,0x43,0x45,0xff,0x3c,0x3e,0x3e,0xff,0x6a,0x57,0x64,0xff,0x88, 0x68,0x78,0xff,0x7f,0x65,0x6e,0xff,0x5e,0x51,0x5a,0xff,0x43,0x42,0x45,0xff,0x41, 0x41,0x42,0xff,0x40,0x40,0x41,0xff,0x3c,0x3d,0x3c,0xff,0x39,0x3c,0x3a,0xfe,0x3c, 0x3e,0x3d,0xfd,0x46,0x44,0x46,0xf9,0x56,0x4b,0x55,0xf0,0x13,0x0f,0x12,0xdf,0x00, 0x00,0x00,0xc3,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x6f,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0xa2,0x05,0x05,0x05,0xb0,0x07, 0x07,0x07,0xb5,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0x9a,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x73,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x46,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xd0,0x03,0x03,0x03,0xe9,0x0a,0x09,0x09,0xf6,0x14,0x11,0x12,0xfb,0x1d, 0x19,0x19,0xfd,0x18,0x14,0x15,0xfd,0x02,0x01,0x01,0xfa,0x07,0x06,0x06,0xf7,0x23, 0x1d,0x1d,0xf0,0x15,0x12,0x12,0xea,0x10,0x0d,0x0e,0xe2,0x0c,0x0b,0x0b,0xdc,0x0a, 0x08,0x08,0xd5,0x09,0x08,0x07,0xd1,0x07,0x06,0x06,0xd1,0x05,0x05,0x05,0xd3,0x04, 0x04,0x04,0xdb,0x02,0x02,0x02,0xe4,0x06,0x04,0x05,0xed,0x19,0x15,0x16,0xf4,0x17, 0x14,0x14,0xf8,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x09, 0x08,0x08,0xfa,0x14,0x11,0x11,0xfc,0x13,0x11,0x11,0xfe,0x27,0x20,0x21,0xfe,0x41, 0x36,0x38,0xff,0x59,0x4a,0x4b,0xff,0x86,0x77,0x78,0xff,0xeb,0xe6,0xe6,0xff,0xff, 0xff,0xff,0xff,0xb7,0xaf,0xb0,0xff,0x46,0x36,0x38,0xfe,0x34,0x2c,0x2c,0xfc,0x24, 0x1f,0x1f,0xf8,0x11,0x0f,0x0f,0xf0,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xd8,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0xe7,0x00, 0x00,0x00,0xf0,0x08,0x06,0x06,0xf8,0x23,0x1d,0x1e,0xfc,0x44,0x39,0x3a,0xfe,0x64, 0x52,0x53,0xff,0xc9,0xc1,0xc2,0xff,0xff,0xff,0xff,0xff,0xe3,0xd9,0xda,0xff,0xb2, 0x99,0x9b,0xff,0xa3,0x89,0x8b,0xff,0x9e,0x88,0x8a,0xff,0x97,0x84,0x85,0xff,0xb1, 0xa1,0xa2,0xff,0xd7,0xcd,0xcf,0xff,0xdc,0xd4,0xd4,0xff,0xf1,0xef,0xef,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xff,0xff,0xfe,0xfe,0xff,0xf8, 0xf5,0xf6,0xff,0xf4,0xf0,0xf1,0xff,0xe5,0xde,0xde,0xff,0xcc,0xc1,0xc2,0xff,0xbf, 0xb3,0xb3,0xff,0x89,0x78,0x79,0xff,0x62,0x53,0x54,0xff,0x4a,0x3e,0x3f,0xff,0x2f, 0x27,0x28,0xff,0x22,0x1c,0x1c,0xff,0x29,0x23,0x23,0xff,0x3e,0x34,0x34,0xff,0x57, 0x46,0x48,0xff,0xd7,0xd3,0xd3,0xff,0xff,0xff,0xff,0xff,0xca,0xbf,0xc0,0xff,0x7f, 0x6b,0x6d,0xff,0x5f,0x4d,0x4f,0xff,0x47,0x3a,0x3b,0xff,0x35,0x2a,0x2b,0xff,0x2c, 0x23,0x23,0xff,0x48,0x3c,0x3d,0xff,0x3e,0x32,0x33,0xff,0x2f,0x26,0x26,0xff,0x2e, 0x25,0x25,0xff,0x2f,0x26,0x26,0xff,0x2f,0x26,0x26,0xff,0x2f,0x26,0x26,0xff,0x2e, 0x25,0x25,0xff,0x35,0x2a,0x2b,0xff,0x48,0x3a,0x3b,0xff,0x5f,0x4e,0x50,0xff,0x6d, 0x55,0x58,0xff,0xe4,0xde,0xde,0xff,0xff,0xff,0xff,0xff,0xc8,0xc0,0xc0,0xff,0x64, 0x55,0x56,0xff,0x47,0x3b,0x3b,0xff,0x4c,0x40,0x40,0xff,0x5b,0x4d,0x4f,0xff,0x6f, 0x5d,0x5e,0xff,0xf1,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff,0xcf,0xc4,0xc5,0xff,0x81, 0x6d,0x6e,0xff,0x65,0x53,0x54,0xff,0x4a,0x3d,0x3e,0xff,0x38,0x2e,0x2f,0xff,0x32, 0x29,0x2a,0xff,0x32,0x29,0x2a,0xff,0x32,0x29,0x2a,0xff,0x32,0x29,0x2a,0xff,0x31, 0x28,0x29,0xff,0x34,0x2b,0x2c,0xff,0x38,0x2e,0x2f,0xff,0x38,0x2f,0x2f,0xff,0x38, 0x2e,0x2f,0xff,0x4a,0x3f,0x3f,0xff,0x43,0x37,0x39,0xff,0x31,0x28,0x29,0xff,0x2e, 0x25,0x26,0xff,0x27,0x20,0x21,0xff,0x1f,0x19,0x1a,0xff,0x18,0x14,0x14,0xff,0x10, 0x0d,0x0e,0xff,0x10,0x0e,0x0e,0xff,0x20,0x1b,0x1b,0xff,0x3e,0x34,0x35,0xff,0x68, 0x59,0x5a,0xff,0xd0,0xc7,0xc8,0xff,0xff,0xff,0xff,0xff,0xfb,0xfa,0xfa,0xff,0xb4, 0x9a,0x9c,0xff,0xb0,0x98,0x9a,0xff,0xa5,0x92,0x93,0xff,0xb7,0xaa,0xac,0xff,0xc9, 0xc1,0xc1,0xff,0xd9,0xd3,0xd3,0xff,0xef,0xee,0xee,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xfb,0xfb,0xff,0xf5,0xf4,0xf4,0xff,0xec, 0xea,0xea,0xff,0xd8,0xd1,0xd2,0xff,0xc3,0xba,0xba,0xff,0xa8,0x9d,0x9e,0xff,0x8d, 0x80,0x81,0xff,0x60,0x52,0x53,0xff,0x4a,0x3e,0x3f,0xff,0x36,0x2e,0x2f,0xff,0x22, 0x1d,0x1d,0xff,0x1c,0x17,0x17,0xff,0x2a,0x23,0x23,0xff,0x44,0x38,0x39,0xff,0x75, 0x65,0x66,0xff,0xdc,0xd4,0xd5,0xff,0xff,0xff,0xff,0xff,0xe2,0xdb,0xdb,0xff,0x87, 0x6c,0x6f,0xff,0x7d,0x68,0x6a,0xff,0x67,0x55,0x57,0xff,0x56,0x47,0x48,0xff,0x51, 0x43,0x44,0xff,0x52,0x44,0x45,0xff,0x52,0x44,0x45,0xff,0x52,0x44,0x45,0xff,0x52, 0x44,0x45,0xff,0x52,0x44,0x45,0xff,0x52,0x44,0x45,0xff,0x52,0x44,0x45,0xff,0x52, 0x44,0x45,0xff,0x52,0x44,0x45,0xff,0x52,0x44,0x45,0xff,0x50,0x42,0x43,0xff,0x4b, 0x3e,0x3f,0xff,0x43,0x37,0x38,0xff,0x37,0x2c,0x2d,0xff,0x28,0x21,0x22,0xff,0x1c, 0x17,0x18,0xff,0x1b,0x17,0x17,0xff,0x2c,0x24,0x25,0xff,0x43,0x37,0x38,0xff,0x85, 0x77,0x78,0xff,0xe9,0xe4,0xe5,0xff,0xff,0xff,0xff,0xff,0xd3,0xc5,0xc6,0xff,0xa9, 0x8f,0x91,0xff,0xa6,0x8e,0x90,0xff,0x9a,0x85,0x87,0xff,0x96,0x84,0x85,0xff,0xb3, 0xa5,0xa6,0xff,0xd8,0xd0,0xd1,0xff,0xe1,0xda,0xdb,0xff,0xf9,0xf7,0xf8,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff,0xfe,0xfc,0xfc,0xff,0xf7, 0xf5,0xf5,0xff,0xf2,0xee,0xef,0xff,0xe6,0xe0,0xe1,0xff,0xd4,0xcb,0xcb,0xff,0xab, 0x9d,0x9e,0xff,0x77,0x65,0x66,0xff,0x54,0x45,0x47,0xff,0x58,0x4a,0x4b,0xff,0x63, 0x56,0x56,0xff,0x55,0x49,0x49,0xff,0x32,0x2a,0x2b,0xff,0x20,0x1b,0x1b,0xff,0x1f, 0x1a,0x1b,0xfd,0x41,0x38,0x38,0xfd,0x4f,0x43,0x44,0xfc,0x20,0x1a,0x1c,0xfc,0x02, 0x02,0x02,0xfc,0x2c,0x26,0x26,0xfc,0x62,0x54,0x56,0xfc,0x5a,0x4d,0x4e,0xfd,0x68, 0x5b,0x5f,0xfe,0x76,0x66,0x6e,0xfe,0x63,0x55,0x61,0xff,0x5b,0x4f,0x5d,0xff,0x62, 0x55,0x62,0xff,0x70,0x65,0x70,0xff,0xb5,0xaf,0xb4,0xff,0xb5,0xad,0xb3,0xff,0x76, 0x6b,0x76,0xff,0x5d,0x51,0x5d,0xff,0x5e,0x52,0x5e,0xff,0x64,0x55,0x64,0xff,0x50, 0x49,0x51,0xff,0x49,0x45,0x49,0xff,0x4c,0x47,0x4d,0xff,0x4f,0x49,0x50,0xff,0x4f, 0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x50,0x49,0x50,0xff,0x4d, 0x48,0x4e,0xff,0x4e,0x49,0x4f,0xff,0x51,0x4a,0x52,0xff,0x4f,0x49,0x50,0xff,0x4e, 0x48,0x4f,0xff,0x58,0x4e,0x57,0xff,0x5a,0x4e,0x56,0xff,0x4c,0x47,0x4d,0xff,0x43, 0x41,0x45,0xff,0x43,0x42,0x44,0xff,0x3f,0x40,0x40,0xff,0x3b,0x3d,0x3c,0xff,0x3b, 0x3d,0x3b,0xff,0x3a,0x3e,0x3b,0xfe,0x3f,0x40,0x41,0xfb,0x59,0x51,0x5a,0xf4,0x27, 0x22,0x28,0xe6,0x03,0x03,0x03,0xcf,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x5c,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x5f,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x81,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0xa2,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xec,0x00, 0x00,0x00,0xf7,0x00,0x00,0x00,0xfc,0x0b,0x0a,0x0a,0xfd,0x20,0x1b,0x1b,0xfb,0x09, 0x07,0x07,0xf6,0x00,0x00,0x00,0xed,0x05,0x04,0x04,0xe2,0x00,0x00,0x00,0xd5,0x00, 0x00,0x00,0xc8,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0xaa,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xca,0x00, 0x00,0x00,0xdb,0x10,0x0e,0x0e,0xe9,0x1f,0x1a,0x1b,0xf1,0x0c,0x0a,0x0a,0xf6,0x18, 0x14,0x14,0xf8,0x11,0x0e,0x0e,0xfa,0x2f,0x28,0x29,0xfb,0x3e,0x35,0x35,0xfd,0x18, 0x13,0x13,0xfe,0x17,0x12,0x12,0xfe,0x23,0x1d,0x1d,0xff,0x35,0x2b,0x2c,0xff,0x7b, 0x6f,0x70,0xff,0xec,0xe7,0xe8,0xff,0xff,0xff,0xff,0xff,0xb5,0xae,0xaf,0xff,0x38, 0x2a,0x2b,0xff,0x2b,0x23,0x24,0xfd,0x13,0x0f,0x0f,0xfa,0x04,0x03,0x03,0xf4,0x00, 0x00,0x00,0xec,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xe1,0x0d, 0x0b,0x0b,0xe9,0x20,0x1c,0x1b,0xf1,0x24,0x1f,0x1f,0xf7,0x2e,0x28,0x29,0xfb,0x3b, 0x33,0x34,0xfd,0x56,0x49,0x4a,0xff,0x6c,0x5a,0x5d,0xff,0xc7,0xc0,0xc1,0xff,0xff, 0xff,0xff,0xff,0xdb,0xd3,0xd4,0xff,0x8e,0x79,0x7b,0xff,0x6d,0x58,0x5a,0xff,0x5f, 0x4d,0x4f,0xff,0x4e,0x3f,0x3f,0xff,0x71,0x5f,0x60,0xff,0x9b,0x87,0x88,0xff,0x83, 0x71,0x72,0xff,0x74,0x65,0x66,0xff,0x77,0x66,0x68,0xff,0xa2,0x95,0x96,0xff,0xc3, 0xba,0xba,0xff,0xd1,0xcb,0xcb,0xff,0xf1,0xf0,0xf0,0xff,0xfe,0xfe,0xfe,0xff,0xff, 0xff,0xff,0xff,0xfe,0xfd,0xfd,0xff,0xff,0xff,0xff,0xff,0xfa,0xf9,0xf9,0xff,0xff, 0xff,0xff,0xff,0xaf,0xa9,0xaa,0xff,0x40,0x38,0x39,0xff,0x1f,0x19,0x1a,0xff,0x26, 0x20,0x20,0xff,0x36,0x2c,0x2d,0xff,0x47,0x39,0x3a,0xff,0xd3,0xcf,0xcf,0xff,0xff, 0xff,0xff,0xff,0xc0,0xb8,0xb9,0xff,0x69,0x5a,0x5b,0xff,0x47,0x3b,0x3b,0xff,0x33, 0x2a,0x2b,0xff,0x23,0x1d,0x1d,0xff,0x1b,0x17,0x17,0xff,0x29,0x22,0x22,0xff,0x3b, 0x32,0x33,0xff,0x26,0x20,0x20,0xff,0x1d,0x19,0x19,0xff,0x1c,0x18,0x18,0xff,0x1c, 0x18,0x18,0xff,0x1c,0x18,0x18,0xff,0x1b,0x17,0x17,0xff,0x22,0x1c,0x1d,0xff,0x32, 0x2a,0x2b,0xff,0x48,0x3d,0x3e,0xff,0x52,0x40,0x42,0xff,0xe4,0xe0,0xe1,0xff,0xff, 0xff,0xff,0xff,0xc3,0xbc,0xbd,0xff,0x57,0x4b,0x4c,0xff,0x3c,0x32,0x32,0xff,0x37, 0x2e,0x2f,0xff,0x45,0x39,0x3a,0xff,0x60,0x50,0x51,0xff,0xf0,0xef,0xef,0xff,0xff, 0xff,0xff,0xff,0xd5,0xcd,0xcc,0xff,0x93,0x80,0x82,0xff,0x7f,0x6e,0x70,0xff,0x6c, 0x5e,0x60,0xff,0x5f,0x53,0x54,0xff,0x5f,0x53,0x54,0xff,0x5c,0x50,0x51,0xff,0x5a, 0x4f,0x50,0xff,0x5a,0x4f,0x50,0xff,0x5a,0x4f,0x50,0xff,0x59,0x4f,0x50,0xff,0x59, 0x4e,0x4f,0xff,0x59,0x4e,0x4f,0xff,0x59,0x4e,0x4f,0xff,0x67,0x5a,0x5c,0xff,0x61, 0x54,0x56,0xff,0x59,0x4e,0x4f,0xff,0x55,0x4a,0x4b,0xff,0x4e,0x44,0x45,0xff,0x44, 0x3c,0x3d,0xff,0x2d,0x28,0x28,0xff,0x17,0x13,0x13,0xff,0x14,0x11,0x11,0xff,0x1e, 0x19,0x1a,0xff,0x37,0x2e,0x2f,0xff,0x5c,0x4e,0x4f,0xff,0xca,0xc1,0xc2,0xff,0xff, 0xff,0xff,0xff,0xfa,0xf9,0xf9,0xff,0x8c,0x76,0x78,0xff,0x78,0x62,0x63,0xff,0x65, 0x53,0x55,0xff,0x5d,0x4f,0x50,0xff,0x5f,0x51,0x52,0xff,0x67,0x58,0x5a,0xff,0x72, 0x63,0x64,0xff,0x87,0x79,0x79,0xff,0xab,0xa0,0xa2,0xff,0xc0,0xb6,0xb7,0xff,0xe0, 0xdb,0xdc,0xff,0xf0,0xed,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe, 0xfe,0xfe,0xff,0xfd,0xfd,0xfd,0xff,0xfb,0xfa,0xfa,0xff,0xf0,0xef,0xef,0xff,0xd1, 0xce,0xce,0xff,0x9d,0x97,0x97,0xff,0x27,0x1e,0x20,0xff,0x22,0x1d,0x1d,0xff,0x2a, 0x24,0x24,0xff,0x3d,0x33,0x34,0xff,0x6b,0x5e,0x5e,0xff,0xd9,0xd2,0xd2,0xff,0xff, 0xff,0xff,0xff,0xe5,0xdf,0xdf,0xff,0x8b,0x73,0x75,0xff,0x85,0x73,0x74,0xff,0x72, 0x64,0x65,0xff,0x67,0x59,0x5a,0xff,0x62,0x56,0x57,0xff,0x63,0x57,0x58,0xff,0x63, 0x57,0x57,0xff,0x63,0x56,0x57,0xff,0x63,0x56,0x57,0xff,0x64,0x57,0x58,0xff,0x64, 0x57,0x58,0xff,0x64,0x57,0x58,0xff,0x64,0x57,0x58,0xff,0x64,0x57,0x58,0xff,0x64, 0x57,0x58,0xff,0x62,0x55,0x56,0xff,0x5d,0x52,0x53,0xff,0x56,0x4b,0x4c,0xff,0x4c, 0x43,0x43,0xff,0x35,0x2f,0x2f,0xff,0x1a,0x15,0x16,0xff,0x1a,0x16,0x17,0xff,0x28, 0x21,0x22,0xff,0x3c,0x30,0x31,0xff,0x80,0x74,0x74,0xff,0xea,0xe6,0xe5,0xff,0xff, 0xff,0xff,0xff,0xc1,0xb6,0xb6,0xff,0x7c,0x65,0x67,0xff,0x71,0x5e,0x60,0xff,0x56, 0x46,0x47,0xff,0x51,0x41,0x42,0xff,0x59,0x49,0x4a,0xff,0x66,0x57,0x58,0xff,0x6d, 0x5d,0x5e,0xff,0x76,0x66,0x67,0xff,0x82,0x72,0x73,0xff,0xa8,0x9d,0x9e,0xff,0xcf, 0xc9,0xc9,0xff,0xea,0xe7,0xe7,0xff,0xfd,0xfd,0xfd,0xff,0xfe,0xfe,0xfe,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfc,0xfc,0xff,0xf8,0xf6,0xf6,0xff,0xf5, 0xf3,0xf3,0xff,0xb5,0xaf,0xaf,0xff,0x5c,0x54,0x55,0xff,0x36,0x31,0x31,0xff,0x28, 0x24,0x24,0xff,0x2c,0x27,0x27,0xff,0x37,0x2f,0x30,0xff,0x36,0x2d,0x2e,0xfe,0x10, 0x0e,0x0e,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x0a, 0x09,0x09,0xfe,0x37,0x30,0x31,0xff,0x77,0x67,0x6b,0xff,0x85,0x75,0x7d,0xff,0x72, 0x66,0x71,0xff,0x93,0x89,0x92,0xff,0xab,0xa2,0xaa,0xff,0xa0,0x98,0x9f,0xff,0xb9, 0xb3,0xb8,0xff,0xcd,0xc8,0xcc,0xff,0x80,0x76,0x80,0xff,0x58,0x4c,0x58,0xff,0x65, 0x55,0x64,0xff,0x58,0x4e,0x59,0xff,0x4d,0x49,0x4e,0xff,0x4e,0x49,0x4e,0xff,0x4e, 0x49,0x4f,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x4f, 0x49,0x50,0xff,0x51,0x4a,0x51,0xff,0x50,0x49,0x50,0xff,0x4d,0x48,0x4e,0xff,0x4d, 0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4c,0x47,0x4e,0xff,0x4b, 0x46,0x4d,0xff,0x46,0x44,0x47,0xff,0x45,0x43,0x46,0xff,0x42,0x42,0x43,0xff,0x3f, 0x40,0x40,0xff,0x3a,0x3c,0x3b,0xff,0x3a,0x3c,0x3a,0xfe,0x40,0x40,0x41,0xfc,0x52, 0x4c,0x52,0xf7,0x42,0x3a,0x42,0xec,0x07,0x06,0x07,0xd9,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x23,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x84,0x00, 0x00,0x00,0x98,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xd2,0x00, 0x00,0x00,0xe4,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xfc,0x0b, 0x09,0x09,0xfb,0x28,0x21,0x22,0xf8,0x01,0x01,0x01,0xef,0x00,0x00,0x00,0xdf,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x8f,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x8e,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0xbd,0x06,0x05,0x05,0xd3,0x1c, 0x18,0x18,0xe2,0x26,0x20,0x20,0xed,0x19,0x15,0x16,0xf3,0x06,0x05,0x05,0xf8,0x1f, 0x1a,0x1b,0xfb,0x2a,0x25,0x24,0xfd,0x03,0x03,0x03,0xfe,0x06,0x05,0x05,0xfe,0x17, 0x13,0x14,0xff,0x26,0x1f,0x1f,0xff,0x5d,0x55,0x55,0xff,0xc5,0xc0,0xc0,0xff,0xf3, 0xf2,0xf2,0xff,0x98,0x91,0x92,0xff,0x28,0x1e,0x1f,0xff,0x22,0x1c,0x1d,0xfe,0x0e, 0x0c,0x0c,0xfc,0x02,0x02,0x02,0xf9,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0xf1,0x00, 0x00,0x00,0xef,0x00,0x01,0x01,0xf0,0x1d,0x1a,0x1a,0xf4,0x38,0x30,0x30,0xf8,0x2b, 0x24,0x25,0xfb,0x15,0x12,0x12,0xfd,0x13,0x10,0x10,0xff,0x29,0x22,0x22,0xff,0x39, 0x2d,0x2f,0xff,0xb1,0xab,0xac,0xff,0xff,0xff,0xff,0xff,0xc8,0xc2,0xc2,0xff,0x66, 0x58,0x59,0xff,0x42,0x36,0x37,0xff,0x37,0x2e,0x2e,0xff,0x28,0x21,0x21,0xff,0x49, 0x3e,0x3f,0xff,0x75,0x64,0x65,0xff,0x67,0x57,0x58,0xff,0x46,0x3a,0x3a,0xff,0x40, 0x35,0x35,0xff,0x4b,0x3e,0x3f,0xff,0x54,0x46,0x47,0xff,0x5b,0x4c,0x4d,0xff,0x63, 0x53,0x55,0xff,0x6a,0x5a,0x5b,0xff,0x9d,0x92,0x93,0xff,0xb2,0xa8,0xa9,0xff,0xd2, 0xcd,0xce,0xff,0xeb,0xe9,0xe9,0xff,0xf5,0xf4,0xf4,0xff,0xb5,0xb0,0xb1,0xff,0x43, 0x3d,0x3d,0xff,0x1b,0x16,0x16,0xff,0x1f,0x1a,0x1a,0xff,0x29,0x22,0x23,0xff,0x34, 0x28,0x2a,0xff,0xb8,0xb4,0xb4,0xff,0xf5,0xf5,0xf5,0xff,0x9f,0x98,0x99,0xff,0x48, 0x3e,0x3e,0xff,0x29,0x23,0x22,0xff,0x18,0x14,0x14,0xff,0x0b,0x09,0x09,0xff,0x06, 0x05,0x05,0xff,0x02,0x02,0x02,0xff,0x1a,0x15,0x16,0xff,0x2a,0x23,0x23,0xff,0x2a, 0x24,0x25,0xff,0x0c,0x0a,0x0a,0xff,0x05,0x04,0x04,0xff,0x06,0x05,0x05,0xff,0x05, 0x04,0x04,0xff,0x0b,0x09,0x09,0xff,0x18,0x15,0x15,0xff,0x2b,0x23,0x24,0xff,0x30, 0x26,0x27,0xff,0xc0,0xbc,0xbc,0xff,0xec,0xea,0xea,0xff,0xa3,0x9e,0x9e,0xff,0x48, 0x3e,0x3f,0xff,0x4b,0x40,0x40,0xff,0x42,0x39,0x39,0xff,0x35,0x2c,0x2d,0xff,0x4e, 0x40,0x41,0xff,0xeb,0xe9,0xe9,0xff,0xfe,0xfd,0xfd,0xff,0xfa,0xf9,0xf9,0xff,0xf6, 0xf5,0xf5,0xff,0xf7,0xf5,0xf5,0xff,0xf6,0xf5,0xf5,0xff,0xf6,0xf5,0xf5,0xff,0xf7, 0xf6,0xf6,0xff,0xf6,0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5, 0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5, 0xf4,0xf4,0xff,0xf6,0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5, 0xf4,0xf4,0xff,0xf4,0xf3,0xf3,0xff,0xf3,0xf2,0xf2,0xff,0x84,0x7e,0x7f,0xff,0x1c, 0x18,0x17,0xff,0x17,0x13,0x13,0xff,0x1b,0x17,0x17,0xff,0x2d,0x26,0x27,0xff,0x49, 0x3e,0x3f,0xff,0xba,0xb4,0xb4,0xff,0xfd,0xfd,0xfe,0xff,0xf3,0xf2,0xf2,0xff,0x64, 0x54,0x55,0xff,0x4f,0x43,0x44,0xff,0x40,0x36,0x36,0xff,0x35,0x2c,0x2c,0xff,0x33, 0x2a,0x2b,0xff,0x3b,0x30,0x31,0xff,0x40,0x35,0x36,0xff,0x47,0x3b,0x3c,0xff,0x51, 0x43,0x44,0xff,0x58,0x4a,0x4b,0xff,0x61,0x52,0x53,0xff,0x75,0x64,0x65,0xff,0x8d, 0x7e,0x7f,0xff,0xaf,0xa4,0xa6,0xff,0xc6,0xba,0xbc,0xff,0xe4,0xdd,0xdf,0xff,0xf0, 0xed,0xed,0xff,0xfc,0xfb,0xfb,0xff,0xff,0xff,0xff,0xff,0xe0,0xdf,0xdf,0xff,0x3c, 0x30,0x32,0xff,0x30,0x29,0x28,0xff,0x32,0x2b,0x2b,0xff,0x41,0x36,0x37,0xff,0x65, 0x59,0x5a,0xff,0xce,0xc7,0xc8,0xff,0xff,0xff,0xff,0xff,0xfa,0xfa,0xf9,0xff,0xf7, 0xf5,0xf6,0xff,0xf7,0xf6,0xf6,0xff,0xf8,0xf6,0xf7,0xff,0xf8,0xf6,0xf6,0xff,0xf7, 0xf6,0xf6,0xff,0xf7,0xf6,0xf6,0xff,0xf8,0xf7,0xf7,0xff,0xf7,0xf6,0xf6,0xff,0xf6, 0xf4,0xf5,0xff,0xf4,0xf2,0xf3,0xff,0xf3,0xf2,0xf2,0xff,0xf5,0xf4,0xf4,0xff,0xf5, 0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5,0xf4,0xf4,0xff,0xf5, 0xf4,0xf4,0xff,0xf4,0xf3,0xf4,0xff,0xfa,0xf9,0xfa,0xff,0x9f,0x9c,0x9c,0xff,0x0d, 0x08,0x08,0xff,0x1b,0x17,0x17,0xff,0x23,0x1d,0x1e,0xff,0x3f,0x34,0x35,0xff,0x84, 0x78,0x79,0xff,0xe2,0xdd,0xde,0xff,0xff,0xff,0xff,0xff,0xb7,0xae,0xaf,0xff,0x5d, 0x4c,0x4d,0xff,0x49,0x3d,0x3e,0xff,0x33,0x2b,0x2b,0xff,0x29,0x23,0x23,0xff,0x2e, 0x26,0x26,0xff,0x34,0x2a,0x2b,0xff,0x3a,0x2f,0x30,0xff,0x3f,0x34,0x35,0xff,0x46, 0x39,0x3a,0xff,0x50,0x42,0x43,0xff,0x59,0x4b,0x4c,0xff,0x61,0x52,0x53,0xff,0x65, 0x55,0x56,0xff,0x8e,0x81,0x83,0xff,0xcb,0xc4,0xc4,0xff,0xe5,0xe0,0xe0,0xff,0xef, 0xed,0xed,0xff,0xf5,0xf4,0xf4,0xff,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xf6, 0xf3,0xf4,0xff,0xe7,0xe3,0xe3,0xff,0xde,0xd9,0xd8,0xfe,0xb3,0xad,0xae,0xfe,0x66, 0x61,0x62,0xfe,0x2c,0x2a,0x2a,0xfe,0x15,0x15,0x15,0xfe,0x08,0x07,0x07,0xff,0x09, 0x08,0x08,0xff,0x0b,0x0b,0x0b,0xff,0x03,0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x4e, 0x49,0x4d,0xff,0xbd,0xb5,0xb8,0xff,0xdf,0xd8,0xda,0xff,0xe9,0xe4,0xe6,0xff,0xbf, 0xb8,0xbd,0xff,0x83,0x78,0x82,0xff,0x92,0x88,0x90,0xff,0xc7,0xc0,0xc5,0xff,0xa3, 0x9a,0xa2,0xff,0x74,0x69,0x74,0xff,0x7a,0x6d,0x79,0xff,0x76,0x70,0x76,0xff,0x89, 0x86,0x89,0xff,0x95,0x8f,0x92,0xff,0x63,0x5e,0x63,0xff,0x4e,0x48,0x4f,0xff,0x50, 0x49,0x51,0xff,0x51,0x4a,0x51,0xff,0x4f,0x49,0x50,0xff,0x4f,0x49,0x50,0xff,0x4d, 0x48,0x4e,0xff,0x4d,0x48,0x4e,0xff,0x4e,0x49,0x4f,0xff,0x4f,0x49,0x50,0xff,0x4d, 0x48,0x4f,0xff,0x4d,0x48,0x4e,0xff,0x4b,0x47,0x4c,0xff,0x47,0x44,0x48,0xff,0x44, 0x42,0x45,0xff,0x40,0x40,0x40,0xff,0x3c,0x3d,0x3c,0xff,0x39,0x3c,0x3a,0xfe,0x3d, 0x3e,0x3d,0xfe,0x49,0x46,0x49,0xf9,0x55,0x4a,0x56,0xf1,0x0f,0x0d,0x10,0xe1,0x00, 0x00,0x00,0xc7,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x74,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0xac,0x02,0x02,0x02,0xbf,0x07,0x06,0x06,0xcd,0x05, 0x04,0x04,0xd9,0x09,0x07,0x07,0xe4,0x0a,0x08,0x08,0xed,0x0a,0x08,0x08,0xf4,0x09, 0x07,0x08,0xf8,0x06,0x05,0x05,0xf9,0x15,0x11,0x12,0xf6,0x38,0x2e,0x2f,0xf0,0x06, 0x04,0x04,0xe2,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x91,0x00, 0x00,0x00,0x75,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x7a,0x00, 0x00,0x00,0x98,0x00,0x00,0x00,0xb3,0x02,0x01,0x01,0xc9,0x03,0x02,0x02,0xda,0x00, 0x00,0x00,0xe5,0x00,0x00,0x00,0xef,0x0d,0x0b,0x0b,0xf5,0x25,0x1f,0x1f,0xfa,0x11, 0x0e,0x0e,0xfd,0x02,0x01,0x01,0xff,0x10,0x0d,0x0d,0xff,0x1d,0x18,0x18,0xff,0x2a, 0x22,0x23,0xff,0x34,0x2a,0x2b,0xff,0x36,0x2c,0x2d,0xff,0x2e,0x26,0x27,0xff,0x22, 0x1c,0x1d,0xff,0x15,0x11,0x12,0xff,0x09,0x08,0x08,0xfe,0x02,0x02,0x02,0xfd,0x00, 0x00,0x00,0xfb,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x00, 0x00,0x00,0xfa,0x20,0x1b,0x1c,0xfc,0x3b,0x33,0x33,0xfd,0x19,0x16,0x16,0xfe,0x08, 0x06,0x06,0xfe,0x1d,0x17,0x17,0xff,0x24,0x1d,0x1d,0xff,0x65,0x5e,0x5e,0xff,0x9f, 0x98,0x98,0xff,0x71,0x6a,0x6a,0xff,0x38,0x31,0x31,0xff,0x24,0x1e,0x1e,0xff,0x19, 0x15,0x15,0xfe,0x0d,0x0b,0x0b,0xfe,0x23,0x1d,0x1e,0xfe,0x52,0x45,0x47,0xfe,0x57, 0x4b,0x4c,0xfe,0x30,0x29,0x2a,0xfe,0x25,0x1f,0x1f,0xff,0x30,0x28,0x28,0xff,0x35, 0x2c,0x2d,0xff,0x3b,0x31,0x32,0xff,0x40,0x35,0x36,0xff,0x43,0x38,0x39,0xff,0x49, 0x3d,0x3e,0xff,0x4f,0x41,0x42,0xff,0x51,0x43,0x44,0xff,0x4c,0x3e,0x40,0xff,0x42, 0x37,0x38,0xff,0x35,0x2c,0x2d,0xff,0x24,0x1e,0x1f,0xff,0x18,0x14,0x14,0xff,0x15, 0x12,0x12,0xff,0x1c,0x16,0x17,0xff,0x25,0x1f,0x20,0xff,0x30,0x27,0x28,0xff,0x35, 0x2b,0x2c,0xff,0x2f,0x28,0x29,0xff,0x24,0x1e,0x1f,0xff,0x19,0x14,0x15,0xff,0x0c, 0x0a,0x0a,0xff,0x02,0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x09, 0x07,0x07,0xff,0x1f,0x1a,0x1a,0xff,0x28,0x22,0x22,0xff,0x07,0x06,0x06,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x03,0x03,0x03,0xff,0x0b, 0x0a,0x0a,0xff,0x17,0x14,0x14,0xff,0x23,0x1e,0x1f,0xff,0x2f,0x28,0x29,0xff,0x34, 0x2b,0x2b,0xff,0x2d,0x25,0x25,0xff,0x3c,0x34,0x35,0xff,0x4b,0x40,0x41,0xff,0x59, 0x4e,0x4e,0xff,0x3f,0x35,0x35,0xff,0x38,0x2d,0x2e,0xff,0x8d,0x85,0x86,0xff,0x9f, 0x97,0x97,0xff,0xa8,0x9e,0x9f,0xff,0xad,0xa3,0xa3,0xff,0xa6,0x9d,0x9d,0xff,0xa0, 0x98,0x98,0xff,0xa4,0x9c,0x9c,0xff,0xb2,0xa8,0xa9,0xff,0x9d,0x95,0x96,0xff,0x9d, 0x95,0x95,0xff,0x9d,0x95,0x95,0xff,0x9e,0x96,0x96,0xff,0x9e,0x96,0x96,0xff,0x9f, 0x96,0x97,0xff,0x9f,0x96,0x97,0xff,0x9f,0x96,0x97,0xff,0x9e,0x96,0x96,0xff,0x9e, 0x96,0x96,0xff,0x9d,0x95,0x96,0xff,0x9b,0x93,0x94,0xff,0x95,0x8f,0x8f,0xff,0x8e, 0x88,0x89,0xff,0x4a,0x44,0x44,0xff,0x1a,0x16,0x16,0xff,0x13,0x10,0x10,0xff,0x15, 0x11,0x12,0xff,0x22,0x1c,0x1c,0xff,0x34,0x2d,0x2d,0xff,0x75,0x6d,0x6d,0xff,0x95, 0x8e,0x8f,0xff,0x8e,0x87,0x88,0xff,0x38,0x2f,0x2f,0xff,0x2c,0x25,0x26,0xff,0x1f, 0x1a,0x1b,0xfe,0x16,0x13,0x13,0xfe,0x15,0x11,0x11,0xfe,0x1a,0x15,0x15,0xfe,0x1f, 0x1a,0x1a,0xfe,0x29,0x22,0x23,0xfe,0x2d,0x25,0x26,0xfe,0x34,0x2b,0x2b,0xfe,0x46, 0x39,0x3a,0xfe,0x67,0x57,0x59,0xfe,0x62,0x53,0x54,0xfe,0x65,0x55,0x57,0xfe,0x6f, 0x5e,0x60,0xfe,0x75,0x63,0x65,0xff,0x79,0x69,0x6a,0xff,0x90,0x83,0x84,0xff,0x9a, 0x91,0x92,0xff,0x8a,0x83,0x83,0xff,0x39,0x2e,0x2f,0xff,0x36,0x2e,0x2f,0xff,0x36, 0x2d,0x2e,0xff,0x3a,0x31,0x31,0xff,0x4c,0x41,0x43,0xff,0x85,0x7c,0x7d,0xff,0xa4, 0x9b,0x9c,0xff,0xa5,0x9c,0x9c,0xff,0xa7,0x9d,0x9e,0xff,0xa7,0x9d,0x9e,0xff,0xaa, 0xa0,0xa1,0xff,0xa7,0x9e,0x9f,0xff,0xa6,0x9d,0x9e,0xff,0xa7,0x9e,0x9f,0xff,0xac, 0xa3,0xa3,0xff,0xb2,0xa8,0xa9,0xff,0xb3,0xa9,0xaa,0xff,0xac,0xa2,0xa3,0xff,0xa5, 0x9b,0x9c,0xff,0x9e,0x96,0x96,0xff,0x9e,0x96,0x96,0xff,0x9e,0x96,0x96,0xff,0x9e, 0x96,0x96,0xff,0x9e,0x96,0x96,0xff,0x9b,0x94,0x94,0xff,0x97,0x90,0x91,0xff,0x91, 0x8b,0x8c,0xff,0x5c,0x57,0x58,0xff,0x14,0x10,0x10,0xff,0x14,0x11,0x12,0xff,0x22, 0x1d,0x1d,0xff,0x3c,0x32,0x33,0xff,0x52,0x48,0x49,0xff,0x84,0x7d,0x7e,0xff,0xa2, 0x9b,0x9b,0xff,0x85,0x7a,0x7b,0xff,0x52,0x44,0x45,0xff,0x4b,0x40,0x41,0xff,0x2e, 0x28,0x29,0xff,0x07,0x06,0x06,0xff,0x0f,0x0d,0x0d,0xff,0x16,0x12,0x12,0xff,0x1c, 0x17,0x17,0xff,0x21,0x1c,0x1c,0xff,0x27,0x21,0x22,0xff,0x2d,0x26,0x27,0xff,0x33, 0x2a,0x2b,0xff,0x38,0x2e,0x2f,0xff,0x43,0x38,0x39,0xfe,0x54,0x47,0x48,0xfe,0x64, 0x55,0x56,0xfe,0x68,0x58,0x59,0xfe,0x70,0x61,0x61,0xfe,0x73,0x68,0x68,0xfe,0x8d, 0x87,0x87,0xfe,0xb8,0xb5,0xb5,0xfe,0xce,0xce,0xce,0xfd,0xdf,0xde,0xde,0xfd,0xf1, 0xef,0xef,0xfd,0xfe,0xfc,0xfc,0xfb,0xff,0xff,0xff,0xfc,0xef,0xea,0xeb,0xfb,0xcd, 0xc9,0xc9,0xfb,0x90,0x8d,0x8d,0xfd,0x86,0x82,0x82,0xfd,0x7f,0x7a,0x7a,0xfe,0x44, 0x41,0x41,0xfe,0x34,0x32,0x32,0xfe,0x91,0x8e,0x8f,0xfe,0xe9,0xe6,0xe6,0xff,0xe5, 0xe0,0xe2,0xff,0xbc,0xb3,0xb9,0xff,0x7d,0x71,0x7b,0xff,0x58,0x4b,0x58,0xff,0x70, 0x65,0x6f,0xff,0xad,0xa6,0xad,0xff,0xc4,0xbf,0xc2,0xff,0xb9,0xb0,0xb6,0xff,0xab, 0xa4,0xa9,0xff,0x9e,0x9b,0x9d,0xff,0x9a,0x97,0x9a,0xff,0xb9,0xb5,0xb7,0xff,0x6b, 0x65,0x6b,0xff,0x47,0x41,0x48,0xff,0x4b,0x44,0x4b,0xff,0x4a,0x44,0x4b,0xff,0x4a, 0x43,0x4a,0xff,0x4e,0x48,0x4f,0xff,0x4e,0x48,0x4f,0xff,0x4e,0x48,0x4f,0xff,0x4e, 0x48,0x4f,0xff,0x4d,0x48,0x4e,0xff,0x4e,0x49,0x4f,0xff,0x4b,0x47,0x4c,0xff,0x47, 0x44,0x47,0xff,0x46,0x43,0x46,0xff,0x40,0x41,0x41,0xff,0x3f,0x3f,0x40,0xff,0x3a, 0x3c,0x3b,0xff,0x39,0x3c,0x3a,0xfe,0x45,0x43,0x45,0xfb,0x5e,0x54,0x5f,0xf4,0x25, 0x1f,0x24,0xe7,0x02,0x02,0x02,0xd0,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0xb2,0x02,0x02,0x02,0xcb,0x16, 0x12,0x12,0xdb,0x2b,0x24,0x24,0xe4,0x1c,0x18,0x18,0xe8,0x1e,0x18,0x19,0xec,0x1e, 0x19,0x1a,0xee,0x1e,0x19,0x1a,0xef,0x1e,0x19,0x1a,0xf0,0x1d,0x18,0x18,0xee,0x21, 0x1b,0x1b,0xeb,0x25,0x1f,0x1f,0xe3,0x08,0x07,0x07,0xd2,0x00,0x00,0x00,0xb7,0x00, 0x00,0x00,0x94,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x3a,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x3b,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xdc,0x03, 0x03,0x03,0xe9,0x1d,0x19,0x19,0xf3,0x21,0x1c,0x1d,0xf9,0x00,0x00,0x00,0xfc,0x07, 0x06,0x06,0xff,0x0f,0x0d,0x0d,0xff,0x17,0x13,0x13,0xff,0x1c,0x18,0x18,0xff,0x1d, 0x18,0x19,0xff,0x19,0x15,0x16,0xff,0x12,0x0f,0x10,0xff,0x0c,0x0a,0x0a,0xff,0x05, 0x04,0x04,0xfe,0x01,0x00,0x00,0xfe,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xfb,0x00, 0x00,0x00,0xfb,0x05,0x04,0x04,0xfa,0x09,0x08,0x07,0xfa,0x0e,0x0d,0x0c,0xfa,0x25, 0x20,0x20,0xfa,0x19,0x15,0x15,0xfb,0x04,0x03,0x03,0xfb,0x12,0x0f,0x0f,0xfb,0x1b, 0x17,0x17,0xfd,0x21,0x1c,0x1c,0xfe,0x24,0x1e,0x1e,0xfe,0x23,0x1d,0x1d,0xfe,0x1d, 0x18,0x18,0xfe,0x13,0x11,0x11,0xfc,0x0a,0x09,0x09,0xfb,0x01,0x01,0x01,0xfb,0x0a, 0x09,0x09,0xfa,0x43,0x38,0x3a,0xfa,0x63,0x52,0x54,0xfb,0x3e,0x34,0x35,0xfb,0x2a, 0x24,0x24,0xfb,0x2e,0x27,0x27,0xfd,0x31,0x29,0x29,0xfe,0x35,0x2c,0x2d,0xfe,0x3a, 0x31,0x32,0xfe,0x3b,0x32,0x33,0xfe,0x30,0x29,0x29,0xfe,0x2c,0x25,0x25,0xfe,0x2d, 0x26,0x26,0xff,0x2c,0x25,0x25,0xff,0x28,0x22,0x23,0xff,0x22,0x1c,0x1c,0xff,0x18, 0x14,0x14,0xff,0x10,0x0d,0x0d,0xff,0x0e,0x0c,0x0c,0xff,0x10,0x0d,0x0d,0xff,0x12, 0x0f,0x10,0xff,0x1a,0x14,0x15,0xff,0x1e,0x18,0x18,0xff,0x1a,0x16,0x16,0xff,0x14, 0x10,0x11,0xff,0x0e,0x0b,0x0c,0xff,0x06,0x05,0x06,0xff,0x01,0x01,0x01,0xff,0x02, 0x01,0x01,0xff,0x10,0x0e,0x0e,0xff,0x2e,0x27,0x27,0xff,0x1a,0x16,0x16,0xff,0x02, 0x02,0x02,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x05,0x04,0x04,0xff,0x0d,0x0b,0x0b,0xff,0x14, 0x11,0x12,0xff,0x1b,0x16,0x17,0xff,0x1d,0x18,0x19,0xff,0x17,0x13,0x13,0xff,0x27, 0x21,0x21,0xff,0x47,0x3c,0x3d,0xfe,0x50,0x45,0x46,0xfe,0x54,0x48,0x49,0xfe,0x42, 0x38,0x39,0xfe,0x3b,0x31,0x32,0xfe,0x49,0x3d,0x3f,0xfe,0x58,0x4a,0x4b,0xfe,0x69, 0x59,0x5b,0xfe,0x5c,0x4d,0x4e,0xfe,0x46,0x3a,0x3b,0xfe,0x3e,0x33,0x34,0xfe,0x60, 0x52,0x53,0xfe,0x45,0x39,0x3a,0xfe,0x45,0x39,0x3a,0xfe,0x41,0x35,0x36,0xfe,0x3c, 0x30,0x31,0xfe,0x3b,0x30,0x30,0xff,0x3d,0x32,0x33,0xff,0x3d,0x32,0x33,0xff,0x3d, 0x32,0x33,0xff,0x3d,0x32,0x33,0xff,0x3d,0x32,0x33,0xff,0x3b,0x31,0x32,0xff,0x37, 0x2d,0x2e,0xff,0x31,0x28,0x28,0xff,0x27,0x20,0x20,0xff,0x1e,0x19,0x18,0xff,0x14, 0x11,0x11,0xff,0x0e,0x0b,0x0b,0xff,0x0d,0x0a,0x0a,0xff,0x1f,0x1a,0x1b,0xff,0x38, 0x30,0x30,0xff,0x47,0x3c,0x3d,0xfe,0x3a,0x30,0x31,0xfe,0x28,0x21,0x22,0xfd,0x1f, 0x1a,0x1a,0xfd,0x13,0x10,0x10,0xfc,0x09,0x08,0x08,0xfb,0x04,0x03,0x03,0xfb,0x03, 0x03,0x03,0xfa,0x0c,0x0a,0x0a,0xfa,0x18,0x14,0x15,0xfa,0x22,0x1d,0x1d,0xfa,0x1f, 0x1a,0x1b,0xfa,0x20,0x1a,0x1d,0xfa,0x3b,0x32,0x33,0xfa,0x30,0x28,0x29,0xfa,0x26, 0x1f,0x20,0xfa,0x2d,0x26,0x26,0xfb,0x34,0x2b,0x2c,0xfb,0x3a,0x30,0x31,0xfc,0x3c, 0x32,0x33,0xfd,0x39,0x2f,0x30,0xfe,0x31,0x28,0x29,0xfe,0x27,0x1f,0x1f,0xfe,0x1c, 0x17,0x17,0xfe,0x12,0x10,0x10,0xfe,0x11,0x0e,0x0e,0xfe,0x17,0x13,0x13,0xfe,0x21, 0x1c,0x1c,0xfe,0x2f,0x27,0x28,0xfe,0x3a,0x2f,0x30,0xfe,0x42,0x35,0x36,0xfe,0x44, 0x37,0x39,0xfe,0x44,0x37,0x38,0xfe,0x40,0x34,0x35,0xfe,0x3d,0x33,0x33,0xfe,0x3d, 0x32,0x32,0xfe,0x3d,0x32,0x32,0xfe,0x41,0x35,0x36,0xfe,0x4f,0x41,0x42,0xfe,0x5e, 0x50,0x50,0xfe,0x67,0x57,0x59,0xfe,0x5a,0x4c,0x4e,0xfe,0x3f,0x33,0x33,0xff,0x3b, 0x31,0x31,0xff,0x3d,0x32,0x33,0xff,0x3d,0x32,0x33,0xff,0x3c,0x31,0x32,0xff,0x39, 0x2e,0x2f,0xff,0x32,0x29,0x2a,0xff,0x28,0x20,0x21,0xff,0x1e,0x18,0x19,0xff,0x15, 0x12,0x12,0xff,0x0d,0x0b,0x0b,0xff,0x20,0x1b,0x1b,0xff,0x33,0x2b,0x2b,0xff,0x1e, 0x18,0x19,0xfe,0x22,0x1c,0x1c,0xfe,0x26,0x20,0x20,0xfe,0x38,0x2e,0x30,0xfd,0x48, 0x3c,0x3e,0xfd,0x41,0x37,0x38,0xfc,0x2a,0x24,0x25,0xfc,0x12,0x0f,0x0f,0xfe,0x0c, 0x0a,0x0a,0xfe,0x04,0x04,0x04,0xfe,0x02,0x02,0x02,0xfe,0x07,0x06,0x06,0xff,0x0c, 0x0a,0x0a,0xff,0x0d,0x0b,0x0b,0xfe,0x16,0x12,0x13,0xfc,0x2a,0x23,0x24,0xfc,0x3c, 0x33,0x34,0xfc,0x44,0x39,0x3a,0xfa,0x3d,0x33,0x34,0xfa,0x36,0x2d,0x2e,0xfa,0x3d, 0x33,0x33,0xfa,0x34,0x2b,0x2b,0xfa,0x21,0x1b,0x1b,0xfa,0x14,0x0f,0x0f,0xfa,0x1f, 0x1c,0x1d,0xf9,0x41,0x40,0x40,0xf7,0x6c,0x6b,0x6b,0xf5,0x93,0x93,0x93,0xf3,0xad, 0xad,0xad,0xf3,0xc0,0xc1,0xc1,0xf3,0xda,0xda,0xda,0xf3,0xf7,0xf4,0xf5,0xf5,0xfd, 0xf9,0xfa,0xf7,0xde,0xd8,0xda,0xf9,0xb9,0xb4,0xb4,0xfa,0xe3,0xdd,0xde,0xfb,0xf5, 0xf1,0xf1,0xfb,0xad,0xa9,0xa9,0xfb,0x7c,0x72,0x7b,0xfd,0x64,0x57,0x65,0xfe,0x5b, 0x4f,0x5b,0xff,0x5d,0x51,0x5d,0xff,0x58,0x4b,0x58,0xff,0x76,0x6b,0x76,0xff,0xa3, 0x9a,0xa0,0xff,0x9e,0x95,0x9c,0xff,0x84,0x7f,0x84,0xff,0x6c,0x68,0x6c,0xff,0x57, 0x53,0x58,0xff,0xa6,0xa2,0xa5,0xff,0x92,0x8e,0x92,0xff,0x6d,0x67,0x6c,0xff,0x6d, 0x66,0x6c,0xff,0x69,0x62,0x68,0xff,0x69,0x63,0x69,0xff,0x54,0x4e,0x54,0xff,0x4d, 0x48,0x4e,0xff,0x4e,0x49,0x4f,0xff,0x4e,0x49,0x4f,0xff,0x4f,0x49,0x50,0xff,0x4d, 0x48,0x4d,0xff,0x49,0x46,0x49,0xff,0x43,0x43,0x44,0xff,0x40,0x40,0x41,0xff,0x3f, 0x3f,0x40,0xff,0x3b,0x3c,0x3b,0xff,0x38,0x3c,0x39,0xfe,0x3d,0x3e,0x3d,0xfc,0x58, 0x51,0x59,0xf8,0x40,0x37,0x40,0xec,0x07,0x06,0x07,0xd8,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xa2,0x06, 0x05,0x05,0xc2,0x1e,0x19,0x19,0xd8,0x2f,0x28,0x29,0xe4,0x32,0x2a,0x2b,0xe9,0x0d, 0x0b,0x0b,0xe8,0x06,0x05,0x05,0xe5,0x02,0x01,0x03,0xe0,0x03,0x03,0x03,0xdd,0x06, 0x05,0x05,0xd9,0x08,0x06,0x07,0xd7,0x08,0x07,0x07,0xd3,0x06,0x05,0x05,0xca,0x02, 0x01,0x01,0xb8,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x45,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x8d,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xd2,0x0e,0x0c,0x0c,0xe4,0x29, 0x23,0x23,0xf0,0x13,0x11,0x11,0xf8,0x00,0x00,0x00,0xfc,0x06,0x05,0x05,0xfe,0x09, 0x08,0x08,0xff,0x09,0x08,0x08,0xff,0x08,0x07,0x07,0xff,0x08,0x07,0x07,0xff,0x04, 0x04,0x04,0xfe,0x00,0x01,0x01,0xfd,0x00,0x01,0x01,0xfc,0x06,0x05,0x06,0xfb,0x0e, 0x0c,0x0d,0xfa,0x14,0x11,0x11,0xf8,0x24,0x1e,0x1f,0xf5,0x3a,0x31,0x32,0xf3,0x3c, 0x33,0x34,0xf2,0x2f,0x28,0x28,0xf0,0x22,0x1d,0x1d,0xf0,0x0e,0x0d,0x0d,0xf0,0x01, 0x01,0x01,0xf2,0x08,0x06,0x07,0xf4,0x0d,0x0b,0x0b,0xf6,0x12,0x0f,0x10,0xf7,0x14, 0x11,0x11,0xf8,0x12,0x0f,0x0f,0xf8,0x0d,0x0b,0x0b,0xf7,0x09,0x07,0x07,0xf5,0x05, 0x04,0x04,0xf4,0x00,0x00,0x00,0xf2,0x09,0x08,0x08,0xf0,0x41,0x36,0x37,0xf0,0x70, 0x5d,0x5f,0xf0,0x56,0x47,0x49,0xf2,0x3c,0x33,0x34,0xf4,0x3b,0x32,0x33,0xf6,0x39, 0x30,0x30,0xf7,0x37,0x2e,0x2e,0xf9,0x39,0x30,0x31,0xf9,0x44,0x3a,0x3a,0xf9,0x43, 0x38,0x39,0xfa,0x37,0x2e,0x30,0xfb,0x2e,0x27,0x27,0xfc,0x24,0x1e,0x1e,0xfd,0x14, 0x10,0x11,0xfe,0x0b,0x0a,0x0a,0xff,0x08,0x06,0x06,0xff,0x07,0x05,0x05,0xff,0x09, 0x08,0x08,0xff,0x06,0x05,0x05,0xff,0x0d,0x0b,0x0b,0xff,0x0b,0x09,0x0a,0xff,0x07, 0x06,0x06,0xff,0x09,0x08,0x08,0xff,0x09,0x07,0x07,0xff,0x05,0x04,0x04,0xff,0x03, 0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x19,0x16,0x16,0xff,0x35, 0x2c,0x2d,0xff,0x22,0x1c,0x1d,0xff,0x08,0x06,0x06,0xff,0x00,0x00,0x00,0xff,0x01, 0x00,0x00,0xff,0x14,0x11,0x11,0xff,0x2f,0x28,0x29,0xff,0x23,0x1e,0x1f,0xff,0x04, 0x04,0x04,0xff,0x00,0x00,0x00,0xff,0x02,0x02,0x01,0xff,0x07,0x06,0x06,0xfe,0x0a, 0x08,0x08,0xfd,0x09,0x09,0x08,0xfc,0x32,0x2c,0x2c,0xfc,0x1d,0x18,0x19,0xfb,0x06, 0x05,0x05,0xfa,0x17,0x13,0x13,0xf9,0x31,0x29,0x2a,0xf9,0x3b,0x32,0x33,0xf9,0x41, 0x38,0x38,0xf9,0x3c,0x33,0x34,0xf9,0x42,0x38,0x39,0xf9,0x4d,0x42,0x44,0xf9,0x49, 0x3f,0x40,0xf9,0x42,0x38,0x3a,0xf9,0x62,0x55,0x56,0xf9,0x56,0x4a,0x4a,0xf9,0x48, 0x3e,0x3f,0xfa,0x47,0x3c,0x3c,0xfb,0x45,0x3a,0x3a,0xfc,0x3a,0x32,0x32,0xfc,0x25, 0x1f,0x1f,0xfd,0x28,0x22,0x22,0xff,0x29,0x23,0x23,0xff,0x29,0x23,0x23,0xff,0x29, 0x23,0x23,0xff,0x28,0x22,0x22,0xff,0x25,0x1f,0x20,0xff,0x21,0x1b,0x1c,0xff,0x1c, 0x17,0x18,0xff,0x14,0x10,0x11,0xff,0x0d,0x0b,0x0b,0xff,0x08,0x06,0x06,0xff,0x09, 0x08,0x08,0xfd,0x2d,0x25,0x27,0xfd,0x3e,0x35,0x35,0xfc,0x40,0x37,0x37,0xfb,0x36, 0x2e,0x2e,0xf9,0x2b,0x25,0x26,0xf8,0x24,0x1f,0x1f,0xf6,0x1e,0x1a,0x1a,0xf5,0x19, 0x15,0x16,0xf3,0x17,0x13,0x13,0xf1,0x17,0x13,0x14,0xf0,0x1c,0x18,0x17,0xef,0x1e, 0x19,0x19,0xee,0x19,0x14,0x15,0xee,0x2c,0x24,0x26,0xee,0x24,0x1e,0x1f,0xee,0x18, 0x14,0x13,0xee,0x05,0x04,0x04,0xef,0x0c,0x0a,0x0a,0xf0,0x11,0x0e,0x0e,0xf1,0x15, 0x12,0x12,0xf3,0x1a,0x16,0x16,0xf5,0x1e,0x18,0x19,0xf6,0x1e,0x19,0x1a,0xf8,0x1b, 0x18,0x17,0xf9,0x18,0x14,0x14,0xf9,0x0f,0x0d,0x0d,0xf9,0x0a,0x09,0x09,0xf9,0x0a, 0x08,0x08,0xf9,0x0c,0x0a,0x0a,0xf9,0x11,0x0f,0x0f,0xf9,0x1a,0x16,0x16,0xf9,0x21, 0x1c,0x1c,0xf9,0x26,0x20,0x20,0xf9,0x29,0x23,0x22,0xf9,0x2a,0x23,0x24,0xf9,0x2a, 0x23,0x23,0xf9,0x29,0x23,0x23,0xf9,0x29,0x23,0x23,0xf9,0x29,0x23,0x23,0xf9,0x29, 0x23,0x23,0xf9,0x28,0x22,0x22,0xf9,0x2f,0x28,0x28,0xf9,0x3e,0x35,0x35,0xfa,0x44, 0x39,0x3a,0xfb,0x3e,0x35,0x35,0xfc,0x2c,0x25,0x25,0xfd,0x27,0x21,0x20,0xfe,0x29, 0x23,0x22,0xff,0x27,0x21,0x21,0xff,0x24,0x1f,0x1e,0xff,0x20,0x1a,0x1b,0xfe,0x18, 0x15,0x16,0xfe,0x11,0x0e,0x0f,0xfd,0x08,0x07,0x07,0xfd,0x0a,0x09,0x09,0xfd,0x23, 0x1d,0x1d,0xfc,0x23,0x1d,0x1e,0xfc,0x0b,0x09,0x09,0xfb,0x14,0x10,0x10,0xfa,0x14, 0x11,0x11,0xf9,0x10,0x0d,0x0e,0xf8,0x0f,0x0d,0x0d,0xf7,0x15,0x11,0x11,0xf5,0x1a, 0x15,0x16,0xf5,0x20,0x1b,0x1b,0xf7,0x21,0x1c,0x1c,0xf8,0x1d,0x19,0x19,0xfa,0x13, 0x10,0x10,0xfc,0x05,0x04,0x04,0xfc,0x01,0x01,0x01,0xfc,0x0f,0x0c,0x0d,0xfa,0x1f, 0x1a,0x1b,0xf6,0x28,0x23,0x22,0xf5,0x1f,0x1a,0x1a,0xf3,0x0e,0x0c,0x0c,0xf0,0x0d, 0x0c,0x0c,0xf0,0x13,0x11,0x11,0xee,0x14,0x11,0x11,0xee,0x13,0x11,0x11,0xee,0x12, 0x0f,0x0f,0xee,0x0d,0x0b,0x0b,0xed,0x05,0x04,0x04,0xeb,0x00,0x00,0x00,0xe7,0x00, 0x00,0x00,0xe3,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xdd,0x08,0x08,0x08,0xde,0x31, 0x31,0x31,0xe0,0x62,0x61,0x61,0xe3,0x81,0x80,0x80,0xe7,0x9a,0x98,0x98,0xeb,0xb6, 0xb2,0xb2,0xee,0xac,0xa9,0xa9,0xf0,0x83,0x81,0x81,0xf3,0x2c,0x2c,0x2b,0xf6,0x2a, 0x25,0x2b,0xf9,0x58,0x4c,0x59,0xfb,0x5f,0x53,0x5f,0xfd,0x5e,0x52,0x5e,0xff,0x5f, 0x53,0x5f,0xff,0x5b,0x4e,0x5a,0xff,0x5b,0x4c,0x5c,0xff,0x4b,0x43,0x4d,0xff,0x44, 0x40,0x45,0xff,0x48,0x43,0x48,0xff,0x45,0x40,0x46,0xff,0x66,0x61,0x67,0xff,0xa4, 0x9f,0xa2,0xff,0xa1,0x9b,0x9e,0xff,0x86,0x7f,0x83,0xff,0x85,0x7c,0x82,0xff,0xa4, 0x9f,0xa3,0xff,0x65,0x60,0x67,0xff,0x4a,0x46,0x4d,0xff,0x4d,0x48,0x4f,0xff,0x4e, 0x48,0x4f,0xff,0x4e,0x48,0x4e,0xff,0x4d,0x47,0x4d,0xff,0x49,0x45,0x48,0xff,0x42, 0x42,0x43,0xff,0x3f,0x40,0x40,0xff,0x3e,0x3f,0x3f,0xff,0x3a,0x3d,0x3b,0xff,0x3b, 0x3e,0x3c,0xfd,0x4f,0x4a,0x50,0xfa,0x57,0x4b,0x57,0xf1,0x0d,0x0c,0x0d,0xe1,0x00, 0x00,0x00,0xc7,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x02,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x4f,0x00, 0x00,0x00,0x76,0x00,0x00,0x00,0x9f,0x07,0x06,0x06,0xbd,0x21,0x1c,0x1c,0xd1,0x22, 0x1d,0x1d,0xdb,0x1d,0x17,0x17,0xdb,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xcb,0x00, 0x00,0x00,0xc0,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xa9,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x4a,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0xb2,0x01,0x01,0x01,0xcc,0x18,0x15,0x15,0xe0,0x2c,0x26,0x26,0xee,0x11, 0x0e,0x0e,0xf6,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xfc,0x08,0x08,0x07,0xfc,0x11, 0x0f,0x0e,0xfc,0x0c,0x09,0x0a,0xfb,0x14,0x11,0x11,0xf9,0x1e,0x1a,0x1a,0xf7,0x24, 0x1f,0x20,0xf5,0x25,0x1f,0x20,0xf2,0x24,0x1f,0x20,0xef,0x21,0x1c,0x1d,0xeb,0x24, 0x1f,0x1f,0xe6,0x28,0x22,0x22,0xe1,0x22,0x1d,0x1e,0xdd,0x16,0x14,0x13,0xda,0x07, 0x06,0x06,0xd9,0x00,0x00,0x00,0xda,0x01,0x01,0x01,0xdd,0x03,0x03,0x02,0xe1,0x04, 0x04,0x03,0xe5,0x06,0x05,0x05,0xe9,0x07,0x05,0x05,0xea,0x06,0x05,0x05,0xea,0x04, 0x03,0x03,0xe9,0x02,0x02,0x02,0xe5,0x01,0x01,0x01,0xe1,0x00,0x00,0x00,0xdd,0x01, 0x02,0x02,0xda,0x11,0x0f,0x0f,0xd9,0x26,0x20,0x20,0xda,0x1e,0x1a,0x1a,0xdd,0x18, 0x15,0x15,0xe1,0x1f,0x1b,0x1a,0xe5,0x22,0x1d,0x1d,0xe9,0x25,0x1f,0x20,0xeb,0x26, 0x20,0x21,0xeb,0x30,0x28,0x29,0xed,0x45,0x39,0x3a,0xef,0x48,0x3d,0x3e,0xf1,0x4c, 0x3f,0x40,0xf4,0x44,0x39,0x3a,0xf7,0x2b,0x24,0x24,0xf9,0x16,0x13,0x13,0xfc,0x0e, 0x0c,0x0b,0xfd,0x04,0x03,0x03,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x33, 0x2b,0x2b,0xfe,0x36,0x2e,0x2e,0xfe,0x1d,0x17,0x19,0xfe,0x05,0x04,0x04,0xff,0x00, 0x00,0x00,0xff,0x01,0x01,0x01,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x05,0x04,0x04,0xff,0x08,0x07,0x07,0xff,0x15,0x12,0x12,0xff,0x24, 0x1f,0x1f,0xff,0x05,0x04,0x04,0xff,0x17,0x13,0x13,0xff,0x1e,0x19,0x19,0xff,0x69, 0x58,0x5a,0xfe,0x83,0x70,0x71,0xfd,0x5c,0x4f,0x50,0xfd,0x42,0x38,0x39,0xfc,0x22, 0x1d,0x1d,0xfb,0x15,0x12,0x12,0xfa,0x09,0x08,0x08,0xf8,0x21,0x1e,0x1e,0xf6,0x28, 0x21,0x21,0xf4,0x05,0x04,0x04,0xf2,0x01,0x01,0x01,0xef,0x01,0x01,0x01,0xee,0x07, 0x06,0x07,0xed,0x12,0x0e,0x10,0xec,0x0f,0x0d,0x0d,0xed,0x0b,0x09,0x0a,0xed,0x0b, 0x09,0x09,0xed,0x14,0x11,0x12,0xed,0x22,0x1d,0x1e,0xed,0x2e,0x27,0x28,0xec,0x41, 0x38,0x38,0xed,0x40,0x36,0x37,0xee,0x1d,0x19,0x1a,0xef,0x2b,0x25,0x25,0xf1,0x45, 0x3b,0x3b,0xf4,0x43,0x39,0x3a,0xf8,0x2b,0x25,0x25,0xfb,0x17,0x15,0x15,0xfd,0x10, 0x0e,0x0e,0xfe,0x10,0x0e,0x0e,0xff,0x10,0x0e,0x0e,0xff,0x0f,0x0d,0x0d,0xff,0x0e, 0x0c,0x0c,0xff,0x0e,0x0b,0x0b,0xff,0x0b,0x09,0x09,0xff,0x08,0x06,0x07,0xff,0x03, 0x03,0x03,0xfe,0x02,0x02,0x02,0xfd,0x1d,0x18,0x19,0xfb,0x37,0x2e,0x2f,0xf8,0x1b, 0x16,0x16,0xf5,0x01,0x01,0x01,0xf2,0x0e,0x0b,0x0b,0xee,0x17,0x13,0x14,0xec,0x19, 0x15,0x16,0xe8,0x19,0x16,0x16,0xe2,0x19,0x15,0x16,0xde,0x17,0x14,0x14,0xdb,0x14, 0x11,0x12,0xd8,0x0e,0x0c,0x0c,0xd7,0x03,0x03,0x03,0xd5,0x01,0x01,0x01,0xd5,0x10, 0x0d,0x0e,0xd5,0x0e,0x0c,0x0c,0xd5,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0xd7,0x01, 0x00,0x00,0xd8,0x01,0x01,0x01,0xdc,0x03,0x02,0x02,0xe0,0x04,0x04,0x04,0xe4,0x07, 0x05,0x05,0xe8,0x08,0x06,0x06,0xeb,0x08,0x07,0x07,0xec,0x08,0x06,0x06,0xed,0x05, 0x04,0x04,0xed,0x04,0x04,0x04,0xed,0x03,0x03,0x03,0xed,0x03,0x03,0x03,0xed,0x06, 0x05,0x05,0xed,0x09,0x08,0x08,0xed,0x0c,0x0b,0x0b,0xed,0x0d,0x0b,0x0b,0xed,0x0f, 0x0d,0x0d,0xed,0x10,0x0e,0x0e,0xed,0x10,0x0e,0x0e,0xed,0x10,0x0e,0x0e,0xed,0x10, 0x0e,0x0e,0xed,0x10,0x0e,0x0e,0xed,0x10,0x0e,0x0e,0xec,0x10,0x0e,0x0e,0xed,0x0f, 0x0c,0x0c,0xee,0x0e,0x0c,0x0b,0xf0,0x18,0x15,0x15,0xf3,0x2d,0x26,0x26,0xf5,0x2f, 0x28,0x28,0xf8,0x15,0x12,0x11,0xfa,0x10,0x0e,0x0e,0xfb,0x18,0x15,0x15,0xfb,0x1d, 0x18,0x18,0xfb,0x20,0x1a,0x1b,0xfa,0x20,0x1a,0x1b,0xfa,0x1e,0x19,0x19,0xf9,0x1b, 0x16,0x16,0xf8,0x1f,0x19,0x19,0xf6,0x21,0x1b,0x1b,0xf5,0x0b,0x0a,0x0a,0xf3,0x03, 0x03,0x03,0xf0,0x07,0x06,0x06,0xee,0x07,0x06,0x06,0xec,0x06,0x05,0x05,0xea,0x02, 0x03,0x03,0xe8,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xe6,0x00,0x01,0x01,0xe8,0x0a, 0x09,0x09,0xec,0x1e,0x19,0x19,0xf1,0x2e,0x26,0x26,0xf4,0x23,0x1d,0x1e,0xf4,0x18, 0x15,0x14,0xf2,0x1f,0x1b,0x1b,0xef,0x19,0x15,0x15,0xe9,0x07,0x06,0x06,0xe3,0x00, 0x00,0x00,0xdd,0x00,0x01,0x01,0xd9,0x02,0x01,0x01,0xd7,0x03,0x02,0x02,0xd5,0x03, 0x02,0x02,0xd5,0x03,0x03,0x03,0xd5,0x02,0x03,0x03,0xd4,0x02,0x02,0x02,0xd2,0x02, 0x02,0x02,0xcf,0x01,0x00,0x00,0xc9,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xbc,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xc3,0x00, 0x00,0x00,0xca,0x01,0x00,0x00,0xd0,0x11,0x10,0x10,0xd5,0x09,0x08,0x08,0xda,0x00, 0x00,0x00,0xe0,0x01,0x02,0x01,0xe7,0x04,0x04,0x04,0xef,0x40,0x38,0x41,0xf6,0x60, 0x54,0x60,0xfb,0x5f,0x53,0x5f,0xfd,0x5c,0x50,0x5c,0xff,0x61,0x53,0x61,0xff,0x5f, 0x52,0x5e,0xff,0x4d,0x48,0x4e,0xff,0x4a,0x46,0x4a,0xff,0x4d,0x48,0x4d,0xff,0x4e, 0x49,0x4f,0xff,0x48,0x43,0x4a,0xff,0x55,0x4f,0x57,0xff,0x60,0x59,0x60,0xff,0x70, 0x69,0x70,0xff,0x59,0x53,0x5a,0xff,0x84,0x7f,0x84,0xff,0x65,0x61,0x66,0xff,0x4f, 0x49,0x50,0xff,0x4e,0x49,0x4f,0xff,0x4e,0x49,0x4f,0xff,0x4c,0x47,0x4d,0xff,0x4c, 0x47,0x4d,0xff,0x47,0x44,0x48,0xff,0x42,0x42,0x43,0xff,0x3e,0x3f,0x3f,0xff,0x3b, 0x3e,0x3d,0xff,0x3c,0x3d,0x3c,0xfe,0x44,0x43,0x45,0xfb,0x63,0x56,0x63,0xf5,0x26, 0x1e,0x25,0xe8,0x02,0x01,0x02,0xd1,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0xb6,0x01,0x01,0x01,0xbd,0x03,0x03,0x03,0xbb,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x6f,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x24,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0xab,0x02, 0x02,0x02,0xc7,0x16,0x13,0x13,0xdc,0x29,0x23,0x24,0xea,0x20,0x1b,0x1c,0xf1,0x0a, 0x08,0x08,0xf4,0x18,0x15,0x15,0xf5,0x3a,0x32,0x33,0xf3,0x2c,0x25,0x26,0xf1,0x24, 0x1e,0x20,0xed,0x20,0x1b,0x1c,0xe9,0x1b,0x17,0x17,0xe5,0x12,0x10,0x10,0xde,0x0a, 0x08,0x08,0xd7,0x02,0x02,0x02,0xd0,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xbf,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0xb1,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xcc,0x00, 0x00,0x00,0xce,0x01,0x00,0x00,0xce,0x01,0x01,0x01,0xcb,0x00,0x01,0x01,0xc6,0x00, 0x00,0x00,0xbd,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xc6,0x00, 0x00,0x00,0xcc,0x03,0x02,0x02,0xd0,0x08,0x07,0x07,0xd2,0x0a,0x09,0x09,0xd4,0x0d, 0x0b,0x0b,0xd7,0x0e,0x0c,0x0c,0xdb,0x17,0x14,0x14,0xe1,0x25,0x1f,0x1e,0xe8,0x2f, 0x27,0x28,0xf0,0x31,0x29,0x2a,0xf5,0x29,0x23,0x23,0xf8,0x34,0x2c,0x2d,0xfb,0x2e, 0x25,0x26,0xfb,0x2c,0x24,0x25,0xfb,0x45,0x3a,0x3b,0xfb,0x5d,0x4d,0x4e,0xfb,0x60, 0x50,0x51,0xfb,0x33,0x2a,0x2c,0xfc,0x07,0x05,0x06,0xfd,0x00,0x00,0x00,0xfe,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00, 0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x20,0x1b,0x1b,0xff,0x21,0x1c,0x1c,0xff,0x26, 0x20,0x20,0xfe,0x01,0x01,0x01,0xfd,0x29,0x24,0x24,0xfc,0x5d,0x4f,0x50,0xf9,0x79, 0x66,0x67,0xf7,0x8f,0x7a,0x7c,0xf6,0x62,0x53,0x54,0xf3,0x3e,0x36,0x36,0xf0,0x2a, 0x24,0x25,0xec,0x31,0x29,0x2a,0xe8,0x09,0x07,0x07,0xe2,0x00,0x00,0x00,0xdd,0x00, 0x00,0x00,0xd9,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xd2,0x00, 0x00,0x00,0xd1,0x01,0x01,0x00,0xd2,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd2,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0xd2,0x07,0x07,0x07,0xd3,0x0b,0x09,0x0a,0xd4,0x00, 0x00,0x00,0xd8,0x03,0x03,0x03,0xdd,0x0f,0x0d,0x0d,0xe5,0x14,0x10,0x10,0xed,0x25, 0x20,0x20,0xf6,0x0f,0x0d,0x0d,0xfa,0x01,0x01,0x01,0xfe,0x01,0x01,0x01,0xfe,0x03, 0x03,0x03,0xff,0x03,0x03,0x03,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x01, 0x01,0x01,0xff,0x00,0x00,0x00,0xfe,0x0a,0x09,0x09,0xfc,0x1c,0x17,0x17,0xf9,0x22, 0x1d,0x1d,0xf4,0x1d,0x18,0x19,0xed,0x02,0x02,0x02,0xe4,0x00,0x00,0x00,0xdd,0x00, 0x00,0x00,0xd6,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0xb9,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0xbb,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xce,0x00, 0x00,0x00,0xd1,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd2,0x00, 0x00,0x00,0xd2,0x00,0x01,0x01,0xd2,0x01,0x00,0x00,0xd2,0x01,0x00,0x00,0xd2,0x01, 0x01,0x01,0xd2,0x01,0x01,0x01,0xd2,0x01,0x00,0x00,0xd2,0x01,0x01,0x01,0xd2,0x01, 0x01,0x01,0xd2,0x01,0x01,0x01,0xd2,0x01,0x01,0x01,0xd2,0x01,0x01,0x01,0xd1,0x01, 0x01,0x01,0xd2,0x01,0x01,0x01,0xd3,0x01,0x01,0x01,0xd6,0x01,0x01,0x01,0xd9,0x00, 0x00,0x00,0xdf,0x06,0x05,0x05,0xe5,0x1d,0x18,0x18,0xeb,0x28,0x21,0x23,0xf1,0x24, 0x1e,0x1f,0xf3,0x1f,0x1a,0x1b,0xf3,0x1c,0x17,0x18,0xf1,0x1b,0x16,0x15,0xef,0x19, 0x14,0x14,0xed,0x16,0x13,0x13,0xeb,0x17,0x14,0x14,0xe9,0x19,0x15,0x15,0xe7,0x0d, 0x0b,0x0b,0xe4,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xd5,0x01, 0x01,0x01,0xd1,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xc6,0x00, 0x00,0x00,0xc7,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xdd,0x10, 0x0d,0x0d,0xe2,0x1b,0x17,0x17,0xe3,0x13,0x10,0x10,0xdf,0x07,0x06,0x06,0xd7,0x00, 0x00,0x00,0xcd,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xb1,0x00, 0x00,0x00,0xae,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0xa9,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x9b,0x00, 0x00,0x00,0x93,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x8c,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0xac,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0xcc,0x00, 0x00,0x00,0xdb,0x1a,0x17,0x1a,0xea,0x53,0x49,0x54,0xf4,0x5f,0x54,0x60,0xfa,0x5c, 0x50,0x5c,0xfc,0x62,0x55,0x63,0xfe,0x52,0x4b,0x54,0xff,0x4a,0x46,0x4b,0xff,0x4c, 0x47,0x4c,0xff,0x4d,0x48,0x4d,0xff,0x4e,0x49,0x50,0xff,0x4f,0x48,0x50,0xff,0x50, 0x49,0x50,0xff,0x6c,0x66,0x6c,0xff,0x9e,0x99,0x9e,0xff,0x5c,0x56,0x5d,0xff,0x7c, 0x78,0x7d,0xff,0x60,0x5b,0x61,0xff,0x4f,0x49,0x50,0xff,0x4f,0x48,0x50,0xff,0x4c, 0x47,0x4d,0xff,0x4b,0x46,0x4c,0xff,0x49,0x46,0x4a,0xff,0x42,0x42,0x44,0xff,0x3f, 0x40,0x41,0xff,0x3d,0x3e,0x3e,0xff,0x3d,0x3e,0x3d,0xfe,0x45,0x43,0x45,0xfc,0x5b, 0x52,0x5c,0xf7,0x4d,0x40,0x4c,0xed,0x0a,0x08,0x0a,0xd9,0x00,0x00,0x00,0xbc,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x46,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x8e,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x60,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xbf,0x0c, 0x0b,0x0b,0xd2,0x1d,0x19,0x1b,0xde,0x28,0x22,0x23,0xe3,0x24,0x1e,0x1f,0xe3,0x13, 0x11,0x11,0xe0,0x10,0x0d,0x0e,0xda,0x07,0x05,0x07,0xd3,0x01,0x00,0x01,0xcb,0x00, 0x00,0x00,0xc2,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0x98,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x7d,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x95,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0x9c,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x84,0x00, 0x00,0x00,0x8c,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0xa1,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0xbf,0x00,0x00,0x00,0xcd,0x05,0x04,0x04,0xda,0x13,0x11,0x10,0xe5,0x27, 0x21,0x21,0xec,0x47,0x3a,0x3c,0xf1,0x46,0x3b,0x3c,0xf3,0x33,0x2b,0x2c,0xf2,0x15, 0x11,0x12,0xf1,0x14,0x12,0x12,0xf1,0x3b,0x31,0x31,0xf2,0x4b,0x3f,0x40,0xf4,0x2e, 0x27,0x28,0xf7,0x22,0x1d,0x1e,0xf9,0x11,0x0e,0x0e,0xfb,0x01,0x01,0x01,0xfd,0x00, 0x00,0x00,0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0x02, 0x02,0x02,0xfe,0x1d,0x19,0x19,0xfd,0x15,0x12,0x12,0xfc,0x28,0x22,0x23,0xf8,0x2a, 0x23,0x24,0xf4,0x16,0x12,0x12,0xef,0x13,0x0f,0x10,0xea,0x26,0x20,0x20,0xe4,0x1e, 0x1a,0x1a,0xdf,0x14,0x11,0x11,0xd8,0x11,0x0f,0x0f,0xd1,0x0b,0x08,0x08,0xc8,0x01, 0x01,0x01,0xc0,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0xa6,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa5,0x00, 0x00,0x00,0xa7,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xbe,0x00, 0x00,0x00,0xce,0x00,0x00,0x00,0xde,0x03,0x03,0x03,0xec,0x02,0x02,0x02,0xf7,0x00, 0x00,0x00,0xfc,0x00,0x00,0x00,0xfe,0x09,0x07,0x07,0xff,0x28,0x21,0x22,0xff,0x27, 0x20,0x21,0xfe,0x06,0x05,0x05,0xfe,0x00,0x00,0x00,0xfd,0x0c,0x0b,0x0b,0xfb,0x2e, 0x25,0x26,0xf6,0x25,0x1f,0x1f,0xef,0x06,0x05,0x05,0xe2,0x02,0x02,0x02,0xd4,0x00, 0x00,0x00,0xc5,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0x99,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x7f,0x00, 0x00,0x00,0x78,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x7a,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x92,0x00, 0x00,0x00,0x9b,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00, 0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0xab,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xc7,0x02, 0x02,0x02,0xd2,0x12,0x0f,0x10,0xda,0x18,0x14,0x14,0xde,0x0b,0x09,0x09,0xde,0x05, 0x04,0x05,0xda,0x02,0x02,0x02,0xd5,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xce,0x00, 0x00,0x00,0xcb,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0xb9,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x9f,0x00, 0x00,0x00,0x9a,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xa0,0x00, 0x00,0x00,0xac,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc1,0x00, 0x00,0x00,0xbc,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x93,0x00, 0x00,0x00,0x86,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x76,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x71,0x00, 0x00,0x00,0x6c,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x55,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x81,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xd6,0x33, 0x2d,0x33,0xe7,0x5c,0x51,0x5d,0xf2,0x60,0x53,0x61,0xf9,0x5a,0x4f,0x5b,0xfc,0x4c, 0x48,0x4d,0xfc,0x4a,0x46,0x4b,0xfc,0x4d,0x48,0x4d,0xfc,0x4e,0x49,0x4e,0xfc,0x4f, 0x49,0x50,0xfc,0x48,0x41,0x48,0xfc,0x8a,0x85,0x8a,0xfc,0xba,0xb8,0xbb,0xfc,0x88, 0x83,0x88,0xfc,0x5d,0x56,0x5e,0xfd,0x8e,0x8a,0x8f,0xfd,0x5f,0x5a,0x60,0xfe,0x4a, 0x45,0x4b,0xfe,0x4f,0x49,0x50,0xff,0x4b,0x47,0x4c,0xfe,0x49,0x45,0x4a,0xfe,0x46, 0x44,0x47,0xfe,0x42,0x41,0x43,0xff,0x3f,0x40,0x40,0xfe,0x3e,0x3f,0x3f,0xfd,0x41, 0x41,0x41,0xfc,0x59,0x50,0x5a,0xf7,0x61,0x51,0x60,0xee,0x16,0x12,0x16,0xdf,0x00, 0x00,0x00,0xc6,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x51,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0xaf,0x02,0x02,0x01,0xbc,0x0a, 0x09,0x09,0xc2,0x09,0x07,0x08,0xc2,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xb4,0x00, 0x00,0x00,0xaa,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x88,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x5a,0x00, 0x00,0x00,0x52,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x51,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x68,0x00, 0x00,0x00,0x6b,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x62,0x00, 0x00,0x00,0x69,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x74,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0xa5,0x00, 0x00,0x00,0xb7,0x00,0x00,0x00,0xc9,0x08,0x06,0x06,0xd6,0x19,0x15,0x15,0xdd,0x15, 0x13,0x13,0xdf,0x06,0x05,0x05,0xde,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0xdc,0x02, 0x02,0x02,0xdf,0x12,0x0f,0x10,0xe3,0x25,0x20,0x21,0xe8,0x3d,0x33,0x34,0xee,0x49, 0x3d,0x3e,0xf3,0x30,0x28,0x29,0xf7,0x14,0x12,0x12,0xf9,0x05,0x04,0x04,0xfb,0x00, 0x00,0x00,0xfb,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xfa,0x0a,0x08,0x08,0xf9,0x21, 0x1c,0x1d,0xf4,0x30,0x29,0x29,0xed,0x16,0x12,0x13,0xe5,0x02,0x01,0x01,0xda,0x00, 0x00,0x00,0xd0,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xb2,0x00, 0x00,0x00,0xa6,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x7d,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x7c,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0xcf,0x00, 0x00,0x00,0xe4,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xfd,0x0a, 0x08,0x08,0xfe,0x56,0x48,0x49,0xfe,0x53,0x45,0x47,0xfd,0x28,0x22,0x22,0xfb,0x2b, 0x24,0x25,0xf8,0x41,0x36,0x37,0xf3,0x22,0x1d,0x1d,0xea,0x05,0x04,0x04,0xdc,0x00, 0x00,0x00,0xca,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x8a,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x43,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x6c,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x8d,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0xb5,0x00, 0x00,0x00,0xba,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0xae,0x00, 0x00,0x00,0xa7,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x98,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x77,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x66,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x81,0x00, 0x00,0x00,0x71,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x4b,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x2c,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x7e,0x00, 0x00,0x00,0x9c,0x00,0x00,0x00,0xbc,0x08,0x06,0x08,0xd5,0x45,0x3d,0x47,0xe6,0x67, 0x58,0x68,0xef,0x54,0x4d,0x55,0xf3,0x4c,0x47,0x4c,0xf5,0x4d,0x48,0x4d,0xf5,0x4d, 0x48,0x4e,0xf5,0x51,0x4a,0x51,0xf5,0x52,0x4b,0x52,0xf5,0x4e,0x46,0x4e,0xf5,0x78, 0x72,0x79,0xf5,0x9b,0x96,0x9c,0xf5,0x8c,0x86,0x8c,0xf6,0x8b,0x85,0x8b,0xf7,0x91, 0x8b,0x91,0xf8,0x5f,0x59,0x60,0xf9,0x51,0x4a,0x52,0xfa,0x50,0x4a,0x52,0xfb,0x52, 0x4b,0x53,0xfc,0x4b,0x47,0x4b,0xfc,0x49,0x46,0x4b,0xfc,0x44,0x42,0x45,0xfb,0x46, 0x44,0x48,0xfa,0x46,0x44,0x47,0xf9,0x58,0x4f,0x59,0xf5,0x61,0x51,0x60,0xee,0x21, 0x1b,0x21,0xe1,0x02,0x01,0x02,0xcb,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x85,0x00, 0x00,0x00,0x5d,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x02,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x22,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x81,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x92,0x00, 0x00,0x00,0x8c,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x6d,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x2f,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x25,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x3d,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x53,0x00, 0x00,0x00,0x63,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0xa1,0x00, 0x00,0x00,0xb1,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbb,0x00, 0x00,0x00,0xb8,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xc3,0x03, 0x02,0x02,0xcd,0x08,0x07,0x06,0xd8,0x13,0x10,0x11,0xe1,0x2a,0x23,0x24,0xe8,0x37, 0x2e,0x2f,0xee,0x38,0x2e,0x2f,0xf1,0x2b,0x24,0x25,0xf3,0x1b,0x18,0x18,0xf2,0x19, 0x15,0x15,0xf2,0x26,0x20,0x20,0xed,0x1a,0x16,0x16,0xe5,0x06,0x06,0x06,0xd9,0x00, 0x00,0x00,0xc9,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x9a,0x00, 0x00,0x00,0x8d,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x69,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x45,0x00, 0x00,0x00,0x41,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x48,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x83,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0xdf,0x02,0x02,0x02,0xef,0x02, 0x02,0x02,0xf8,0x00,0x00,0x00,0xfb,0x2f,0x27,0x28,0xfb,0x5f,0x4f,0x50,0xfa,0x47, 0x3c,0x3d,0xf7,0x1a,0x16,0x16,0xf3,0x0c,0x0a,0x0a,0xed,0x22,0x1c,0x1c,0xe3,0x03, 0x03,0x03,0xd5,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x8c,0x00, 0x00,0x00,0x70,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x25,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1f,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x33,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x3e,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x79,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x6e,0x00, 0x00,0x00,0x6a,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x3c,0x00, 0x00,0x00,0x39,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x41,0x00, 0x00,0x00,0x4c,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x60,0x00, 0x00,0x00,0x59,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x2d,0x00, 0x00,0x00,0x3d,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0xb9,0x24,0x1e,0x23,0xcf,0x51,0x47,0x51,0xdb,0x4e,0x48,0x4e,0xe1,0x4a, 0x46,0x4b,0xe3,0x4d,0x47,0x4e,0xe4,0x4f,0x47,0x4f,0xe4,0x52,0x49,0x52,0xe4,0x56, 0x4c,0x57,0xe4,0x59,0x4f,0x59,0xe4,0x5b,0x4f,0x5b,0xe4,0x61,0x54,0x60,0xe5,0x67, 0x5a,0x68,0xe6,0x74,0x6a,0x75,0xe7,0x78,0x6d,0x77,0xea,0x61,0x55,0x61,0xed,0x5c, 0x50,0x5c,0xf0,0x59,0x4f,0x5a,0xf2,0x59,0x4e,0x5a,0xf3,0x54,0x4c,0x55,0xf4,0x51, 0x49,0x51,0xf3,0x50,0x49,0x51,0xf2,0x50,0x4a,0x51,0xf1,0x59,0x4d,0x59,0xee,0x45, 0x38,0x43,0xe6,0x17,0x12,0x16,0xdb,0x01,0x01,0x01,0xca,0x00,0x00,0x00,0xaf,0x00, 0x00,0x00,0x8d,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x20,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x5b,0x00, 0x00,0x00,0x5f,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x19,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x23,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xb1,0x00, 0x00,0x00,0xc0,0x02,0x01,0x01,0xcc,0x07,0x05,0x05,0xd7,0x15,0x11,0x11,0xdd,0x1e, 0x19,0x19,0xe0,0x16,0x13,0x13,0xe0,0x12,0x0f,0x10,0xdd,0x0d,0x0b,0x0b,0xd6,0x03, 0x02,0x02,0xc9,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x8b,0x00, 0x00,0x00,0x77,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x4e,0x00, 0x00,0x00,0x44,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0xc2,0x00, 0x00,0x00,0xdd,0x2d,0x25,0x26,0xed,0x26,0x1f,0x1f,0xf3,0x18,0x14,0x15,0xf4,0x46, 0x3b,0x3c,0xf2,0x40,0x35,0x36,0xef,0x0b,0x0a,0x0a,0xe9,0x03,0x03,0x03,0xe1,0x00, 0x00,0x00,0xd5,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x9c,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x34,0x00, 0x00,0x00,0x26,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x57,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x49,0x00, 0x00,0x00,0x42,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x39,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x93,0x01,0x01,0x01,0xa9,0x04, 0x04,0x04,0xb7,0x05,0x05,0x05,0xbe,0x05,0x05,0x05,0xc1,0x05,0x05,0x05,0xc2,0x06, 0x05,0x06,0xc2,0x06,0x05,0x06,0xc2,0x06,0x05,0x06,0xc2,0x07,0x06,0x07,0xc2,0x06, 0x05,0x06,0xc3,0x05,0x03,0x05,0xc4,0x05,0x04,0x05,0xc5,0x06,0x05,0x06,0xc9,0x07, 0x06,0x07,0xcd,0x05,0x04,0x05,0xd3,0x15,0x12,0x15,0xd9,0x1a,0x15,0x1a,0xde,0x18, 0x14,0x18,0xe1,0x18,0x14,0x18,0xe1,0x17,0x13,0x17,0xe1,0x18,0x14,0x18,0xdf,0x14, 0x11,0x14,0xdb,0x09,0x07,0x09,0xd5,0x03,0x02,0x03,0xc9,0x00,0x00,0x00,0xba,0x00, 0x00,0x00,0xa5,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x02,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x21,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x2e,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x17,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x1b,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x50,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x56,0x00, 0x00,0x00,0x53,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x64,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0xa3,0x00, 0x00,0x00,0xaf,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbd,0x00, 0x00,0x00,0xb9,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x8c,0x00, 0x00,0x00,0x74,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x3b,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x75,0x00, 0x00,0x00,0x9e,0x01,0x01,0x01,0xc1,0x17,0x13,0x13,0xd7,0x22,0x1c,0x1c,0xe4,0x0f, 0x0d,0x0d,0xe7,0x1c,0x17,0x17,0xe4,0x35,0x2c,0x2c,0xe0,0x0c,0x09,0x0a,0xd8,0x00, 0x00,0x00,0xce,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x9e,0x00, 0x00,0x00,0x89,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3f,0x00, 0x00,0x00,0x28,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x24,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1c,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x16,0x00, 0x00,0x00,0x15,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x50,0x00, 0x00,0x00,0x67,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x8e,0x00, 0x00,0x00,0x91,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x92,0x00, 0x00,0x00,0x92,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x93,0x00, 0x00,0x00,0x96,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xaa,0x00, 0x00,0x00,0xb2,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbe,0x00, 0x00,0x00,0xbe,0x00,0x00,0x00,0xbb,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0xac,0x00, 0x00,0x00,0xa0,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x61,0x00, 0x00,0x00,0x47,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x15,0x00, 0x00,0x00,0x16,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x1a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x2c,0x00, 0x00,0x00,0x2d,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2b,0x00, 0x00,0x00,0x2f,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x52,0x00, 0x00,0x00,0x62,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x86,0x00, 0x00,0x00,0x8a,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x72,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x36,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x49,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x94,0x02,0x02,0x02,0xb4,0x1f, 0x1a,0x1a,0xc6,0x09,0x07,0x07,0xce,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xc6,0x00, 0x00,0x00,0xbe,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x95,0x00, 0x00,0x00,0x83,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x35,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x13,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x4c,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5d,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x5e,0x00, 0x00,0x00,0x5e,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x67,0x00, 0x00,0x00,0x6e,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x87,0x00, 0x00,0x00,0x8b,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x89,0x00, 0x00,0x00,0x84,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x5f,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x19,0x00, 0x00,0x00,0x0d,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x13,0x00, 0x00,0x00,0x12,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x1a,0x00, 0x00,0x00,0x22,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x4d,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x57,0x00, 0x00,0x00,0x54,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x29,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x03,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x5c,0x00, 0x00,0x00,0x7c,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa7,0x00, 0x00,0x00,0xa3,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x81,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x42,0x00, 0x00,0x00,0x33,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x1f,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x2e,0x00, 0x00,0x00,0x30,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x31,0x00, 0x00,0x00,0x31,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x32,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x47,0x00, 0x00,0x00,0x4e,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x58,0x00, 0x00,0x00,0x58,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x4a,0x00, 0x00,0x00,0x3f,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x1d,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x12,0x00, 0x00,0x00,0x18,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x21,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x2a,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x6a,0x00, 0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x65,0x00, 0x00,0x00,0x5a,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x37,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0f,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x14,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x29,0x00, 0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2a,0x00, 0x00,0x00,0x27,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x17,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x02,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0a,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x26,0x00, 0x00,0x00,0x34,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x43,0x00, 0x00,0x00,0x3e,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x27,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x0d,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x11,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x0e,0x00, 0x00,0x00,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,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,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,0x01,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1e,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x18,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x09,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,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,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,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,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,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,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00, 0x00,0x00,0x0b,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x05,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,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,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,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,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,0x01,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,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,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,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,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,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,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00, 0x00,0x00,0x01,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,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,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}; milkytracker-0.90.85+dfsg/src/tracker/win32/0000755000175000017500000000000011317506106017607 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/tracker/win32/ThreadTimer.cpp0000644000175000017500000000274010766710716022541 0ustar admin2admin2#include "ThreadTimer.h" CThreadTimer::CThreadTimer():object(0),idEvent(0),elapse(0), isActive(FALSE) { InitializeCriticalSection(&lock); } CThreadTimer::~CThreadTimer() { DeleteCriticalSection(&lock); } UINT CThreadTimer::SetTimer (void* obj, UINT nIDEvent, UINT uElapse, ThreadTimerProc lpTimerProc) { object = obj; idEvent = nIDEvent; elapse = uElapse; proc = lpTimerProc; EnterCriticalSection(&lock); // is it already active? if (isActive) { LeaveCriticalSection(&lock); return 0; } // Start the thread DWORD threadId; HANDLE threadHandle = CreateThread (NULL, 0, CThreadTimer::ThreadFunction, this, 0, &threadId); //SetThreadPriority(threadHandle,THREAD_PRIORITY_TIME_CRITICAL); // this is optional isActive = TRUE; LeaveCriticalSection(&lock); return nIDEvent; } BOOL CThreadTimer::KillTimer() { EnterCriticalSection(&lock); isActive = FALSE; LeaveCriticalSection(&lock); return TRUE; } DWORD WINAPI CThreadTimer::ThreadFunction (LPVOID pParam) { // Here is the heart of our little timer CThreadTimer* obj = (CThreadTimer*) pParam; BOOLEAN isActive = TRUE; do { Sleep(obj->elapse); obj->proc (obj->object, obj->idEvent); EnterCriticalSection(&obj->lock); isActive = obj->isActive; LeaveCriticalSection(&obj->lock); } while (isActive); return 0; } milkytracker-0.90.85+dfsg/src/tracker/win32/Win32_resource.h0000644000175000017500000000313311150223367022571 0ustar admin2admin2/* * tracker/win32/Win32_resource.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by Win32_resources.rc // #define IDD_PROPERTIES 102 #define IDI_APPLICATIONICON 110 #define IDC_COMBO_MIDIDEVICES 1000 #define IDC_CHECK_SAVESETTINGS 1001 #define IDC_CHECK_ENABLE_MIDI 1002 #define IDC_BUTTON_OK 1003 #define IDC_CHECK_RECORD_VELOCITY 1004 #define IDC_BUTTON_CANCEL 1005 #define IDC_SLIDER_MIDITHREADPRIORITY 1006 #define IDC_SLIDER_AMPLIFYVELOCITY 1007 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 105 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1005 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif milkytracker-0.90.85+dfsg/src/tracker/win32/PreferencesDialog.cpp0000644000175000017500000002511411150223367023677 0ustar admin2admin2/* * tracker/win32/PreferencesDialog.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "PreferencesDialog.h" #include #include #include "Win32_resource.h" // MIDI headers #include "MIDIInDevice.h" // Other utility classes #include "TrackerSettingsDatabase.h" #include "XMFile.h" #include "PPSystem.h" #define PREFSFILENAME _T("prefs.cfg") // MIDI Namespaces using midi::CMIDIInDevice; using midi::CMIDIReceiver; CPreferencesDialog* CPreferencesDialog::s_prefDlg = NULL; BOOL CALLBACK CPreferencesDialog::DialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { s_prefDlg->m_hWndDlg = hWndDlg; switch (uMsg) { case WM_INITDIALOG: { ::SetWindowText(hWndDlg, _T("Preferences")); HWND hWnd = s_prefDlg->m_hWndMain; // Center dialog within main window RECT parentRc, thisRc; ::GetWindowRect(hWnd, &parentRc); ::GetWindowRect(hWndDlg, &thisRc); int width = thisRc.right - thisRc.left; int height = thisRc.bottom - thisRc.top; int midx = (parentRc.left + parentRc.right) / 2; int midy = (parentRc.top + parentRc.bottom) / 2; ::SetWindowPos(hWndDlg, hWnd, midx - width/2, midy - height/2, width, height, SWP_NOZORDER); s_prefDlg->initDialog(); return TRUE; } case WM_NOTIFY: { const NMHDR* nHdr = (NMHDR*)lParam; switch (wParam) { case IDC_SLIDER_MIDITHREADPRIORITY: { if ((signed)nHdr->code != NM_RELEASEDCAPTURE) break; int i = SendMessage(nHdr->hwndFrom, TBM_GETPOS, 0, 0); s_prefDlg->storeMidiRecordPriority(i); break; } case IDC_SLIDER_AMPLIFYVELOCITY: { if ((signed)nHdr->code != NM_RELEASEDCAPTURE) break; int i = SendMessage(nHdr->hwndFrom, TBM_GETPOS, 0, 0); s_prefDlg->storeVelocityAmplify(i); break; } } break; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_COMBO_MIDIDEVICES: { switch (HIWORD(wParam)) { case CBN_SELCHANGE: s_prefDlg->storeMidiDeviceName(s_prefDlg->getComboSelection()); break; } break; } case IDC_CHECK_ENABLE_MIDI: s_prefDlg->toggleUseMidiDevice(); break; case IDC_CHECK_SAVESETTINGS: s_prefDlg->toggleSavePreferences(); break; case IDC_CHECK_RECORD_VELOCITY: s_prefDlg->toggleRecordVelocity(); break; case IDOK: ::EndDialog(hWndDlg, wParam); break; case IDCANCEL: s_prefDlg->restoreDataBase(); ::EndDialog(hWndDlg, wParam); return TRUE; } } } return FALSE; } CPreferencesDialog::CPreferencesDialog(HWND hWnd, HINSTANCE hInst) : m_hWndMain(hWnd), m_hInstance(hInst), m_dataBase(NULL), m_dataBaseCopy(NULL) { initDataBase(); } CPreferencesDialog::~CPreferencesDialog() { shutdownDataBase(); delete m_dataBase; delete m_dataBaseCopy; } UINT CPreferencesDialog::runModal() { CPreferencesDialog::s_prefDlg = this; backupDataBase(); return ::DialogBox(m_hInstance, (LPCTSTR)IDD_PROPERTIES, m_hWndMain, (DLGPROC)DialogProc); } void CPreferencesDialog::initDataBase() { m_dataBase = new TrackerSettingsDatabase(); m_dataBase->store("USEMIDI", 0); m_dataBase->store("SAVEPREFS", 0); m_dataBase->store("RECORDINGTHREADPRIORITY", CMIDIInDevice::MIDI_THREAD_PRIORITY_NORMAL); m_dataBase->store("MIDIDEVICE", ""); m_dataBase->store("RECORDVELOCITY", 0); m_dataBase->store("VELOCITYAMPLIFY", 100); if (XMFile::exists(System::getConfigFileName(PREFSFILENAME))) { XMFile f(System::getConfigFileName(PREFSFILENAME)); m_dataBase->serialize(f); } } void CPreferencesDialog::shutdownDataBase() { if (m_dataBase->restore("SAVEPREFS")->getIntValue()) { XMFile f(System::getConfigFileName(PREFSFILENAME), true); m_dataBase->serialize(f); } else if (XMFile::exists(System::getConfigFileName(PREFSFILENAME))) { XMFile::remove(System::getConfigFileName(PREFSFILENAME)); } } void CPreferencesDialog::backupDataBase() { if (!m_dataBase) return; if (m_dataBaseCopy) delete m_dataBaseCopy; m_dataBaseCopy = new TrackerSettingsDatabase(*m_dataBase); } void CPreferencesDialog::restoreDataBase() { if (!m_dataBaseCopy) return; if (m_dataBase) delete m_dataBase; m_dataBase = new TrackerSettingsDatabase(*m_dataBaseCopy); } void CPreferencesDialog::updateToggles() { bool b = false; if (m_dataBase) b = m_dataBase->restore("SAVEPREFS")->getIntValue() != 0; ::CheckDlgButton( m_hWndDlg, IDC_CHECK_SAVESETTINGS, b ? BST_CHECKED : BST_UNCHECKED); b = false; if (m_dataBase) b = m_dataBase->restore("USEMIDI")->getIntValue() != 0; ::CheckDlgButton( m_hWndDlg, IDC_CHECK_ENABLE_MIDI, b ? BST_CHECKED : BST_UNCHECKED); b = false; if (m_dataBase) b = m_dataBase->restore("RECORDVELOCITY")->getIntValue() != 0; ::CheckDlgButton( m_hWndDlg, IDC_CHECK_RECORD_VELOCITY, b ? BST_CHECKED : BST_UNCHECKED); } void CPreferencesDialog::updateSliderMidiRecordPriority() { HWND hWndTrackbar = ::GetDlgItem(m_hWndDlg, IDC_SLIDER_MIDITHREADPRIORITY); if (m_dataBase) ::SendMessage(hWndTrackbar, TBM_SETPOS, TRUE, m_dataBase->restore("RECORDINGTHREADPRIORITY")->getIntValue()); } void CPreferencesDialog::updateSliderVelocityAmplify() { HWND hWndTrackbar = ::GetDlgItem(m_hWndDlg, IDC_SLIDER_AMPLIFYVELOCITY); if (m_dataBase) ::SendMessage(hWndTrackbar, TBM_SETPOS, TRUE, m_dataBase->restore("VELOCITYAMPLIFY")->getIntValue()); HWND hWndToggle = ::GetDlgItem(m_hWndDlg, IDC_CHECK_RECORD_VELOCITY); TCHAR buffer[1024]; #ifdef _UNICODE wsprintf(buffer, _T("Record velocity (amplify: %i%%)"), m_dataBase->restore("VELOCITYAMPLIFY")->getIntValue()); #else sprintf(buffer, _T("Record velocity (amplify: %i%%)"), m_dataBase->restore("VELOCITYAMPLIFY")->getIntValue()); #endif SetWindowText(hWndToggle, buffer); } void CPreferencesDialog::initDialog() { UINT i; // Configure slider for thread priority HWND hWndTrackbar = ::GetDlgItem(m_hWndDlg, IDC_SLIDER_MIDITHREADPRIORITY); ::SendMessage(hWndTrackbar, TBM_SETRANGE, 0, (LPARAM)MAKELONG(0, 4)); for (i = 0; i < 5; i++) ::SendMessage(hWndTrackbar, TBM_SETTIC, 0, i); // Configure slider for velocity amplification hWndTrackbar = ::GetDlgItem(m_hWndDlg, IDC_SLIDER_AMPLIFYVELOCITY); ::SendMessage(hWndTrackbar, TBM_SETRANGE, 0, (LPARAM)MAKELONG(0, 200)); HWND hWndCombo = ::GetDlgItem(m_hWndDlg, IDC_COMBO_MIDIDEVICES); int nSelectedDevice = 0; for (i = 0; i < CMIDIInDevice::GetNumDevs(); i++) { MIDIINCAPS Caps; CMIDIInDevice::GetDevCaps(i, Caps); ::SendMessage(hWndCombo, CB_ADDSTRING, 0, reinterpret_cast(&Caps.szPname)); char* pszDeviceName = NULL; #ifdef UNICODE char szDeviceName[1024]; midi::UnicodeToAnsi(Caps.szPname, szDeviceName); pszDeviceName = szDeviceName; #else pszDeviceName = Caps.szPname; #endif if (m_dataBase && m_dataBase->restore("MIDIDEVICE")->getStringValue().compareTo(pszDeviceName) == 0) { nSelectedDevice = i; } } ::SendMessage(hWndCombo, CB_SETCURSEL, nSelectedDevice, 0); storeMidiDeviceName(nSelectedDevice); updateToggles(); updateSliderMidiRecordPriority(); updateSliderVelocityAmplify(); } UINT CPreferencesDialog::getComboSelection() { HWND hWndCombo = ::GetDlgItem(m_hWndDlg, IDC_COMBO_MIDIDEVICES); return ::SendMessage(hWndCombo, CB_GETCURSEL, 0, 0); } void CPreferencesDialog::toggleUseMidiDevice() { if (m_dataBase) { int i = m_dataBase->restore("USEMIDI")->getIntValue(); m_dataBase->restore("USEMIDI")->store(!i); updateToggles(); } } void CPreferencesDialog::toggleSavePreferences() { if (m_dataBase) { int i = m_dataBase->restore("SAVEPREFS")->getIntValue(); m_dataBase->restore("SAVEPREFS")->store(!i); updateToggles(); } } void CPreferencesDialog::toggleRecordVelocity() { if (m_dataBase) { int i = m_dataBase->restore("RECORDVELOCITY")->getIntValue(); m_dataBase->restore("RECORDVELOCITY")->store(!i); updateToggles(); } } void CPreferencesDialog::storeMidiDeviceName(UINT deviceID) { if (m_dataBase && deviceID < CMIDIInDevice::GetNumDevs()) { MIDIINCAPS Caps; CMIDIInDevice::GetDevCaps(deviceID, Caps); char* pszDeviceName = NULL; #ifdef UNICODE char szDeviceName[1024]; midi::UnicodeToAnsi(Caps.szPname, szDeviceName); pszDeviceName = szDeviceName; #else pszDeviceName = Caps.szPname; #endif m_dataBase->restore("MIDIDEVICE")->store(pszDeviceName); } } void CPreferencesDialog::storeMidiRecordPriority(UINT priority) { if (m_dataBase) { m_dataBase->restore("RECORDINGTHREADPRIORITY")->store(priority); updateSliderMidiRecordPriority(); } } void CPreferencesDialog::storeVelocityAmplify(UINT amplify) { if (m_dataBase) { m_dataBase->restore("VELOCITYAMPLIFY")->store(amplify); updateSliderVelocityAmplify(); } } UINT CPreferencesDialog::getMidiDevIDFromString(const char* string) { UINT nSelectedDevice = (unsigned)-1; for (UINT i = 0; i < CMIDIInDevice::GetNumDevs(); i++) { MIDIINCAPS Caps; CMIDIInDevice::GetDevCaps(i, Caps); char* pszDeviceName = NULL; #ifdef UNICODE char szDeviceName[1024]; midi::UnicodeToAnsi(Caps.szPname, szDeviceName); pszDeviceName = szDeviceName; #else pszDeviceName = Caps.szPname; #endif if (strcmp(string, pszDeviceName) == 0) { nSelectedDevice = i; break; } } return nSelectedDevice; } UINT CPreferencesDialog::getSelectedMidiDeviceID() { if (m_dataBase) { return getMidiDevIDFromString(m_dataBase->restore("MIDIDEVICE")->getStringValue()); } return (unsigned)-1; } bool CPreferencesDialog::getUseMidiDeviceFlag() { if (m_dataBase) { return m_dataBase->restore("USEMIDI")->getIntValue() != 0; } return false; } UINT CPreferencesDialog::getMidiRecordThreadPriority() { if (m_dataBase) { return m_dataBase->restore("RECORDINGTHREADPRIORITY")->getIntValue(); } return CMIDIInDevice::MIDI_THREAD_PRIORITY_NORMAL; } bool CPreferencesDialog::getRecordVelocityFlag() { if (m_dataBase) { return m_dataBase->restore("RECORDVELOCITY")->getIntValue() != 0; } return false; } UINT CPreferencesDialog::getVelocityAmplify() { if (m_dataBase) { return m_dataBase->restore("VELOCITYAMPLIFY")->getIntValue(); } return 100; } milkytracker-0.90.85+dfsg/src/tracker/win32/PreferencesDialog.h0000644000175000017500000000400511150223367023340 0ustar admin2admin2/* * tracker/win32/PreferencesDialog.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __PREFERENCESDIALOG_H__ #define __PREFERENCESDIALOG_H__ #include class TrackerSettingsDatabase; class CPreferencesDialog { private: HWND m_hWndDlg; HWND m_hWndMain; HINSTANCE m_hInstance; TrackerSettingsDatabase* m_dataBase; TrackerSettingsDatabase* m_dataBaseCopy; static CPreferencesDialog* s_prefDlg; static BOOL CALLBACK DialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static int s_threadPriorities[5]; void initDataBase(); void shutdownDataBase(); void backupDataBase(); void restoreDataBase(); void updateToggles(); void updateSliderMidiRecordPriority(); void updateSliderVelocityAmplify(); void initDialog(); UINT getComboSelection(); void toggleUseMidiDevice(); void toggleSavePreferences(); void toggleRecordVelocity(); void storeMidiDeviceName(UINT deviceID); void storeMidiRecordPriority(UINT priority); void storeVelocityAmplify(UINT amplify); UINT getMidiDevIDFromString(const char* string); public: CPreferencesDialog(HWND hWnd, HINSTANCE hInst); ~CPreferencesDialog(); UINT runModal(); UINT getSelectedMidiDeviceID(); bool getUseMidiDeviceFlag(); UINT getMidiRecordThreadPriority(); bool getRecordVelocityFlag(); UINT getVelocityAmplify(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/win32/Win32_resources.rc0000644000175000017500000000707210737746457023163 0ustar admin2admin2//Microsoft Developer Studio generated resource script. // #include "Win32_resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Deutsch (Deutschland) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 LANGUAGE LANG_GERMAN, SUBLANG_GERMAN #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE MOVEABLE PURE BEGIN "Win32_resource.h\0" END 2 TEXTINCLUDE MOVEABLE PURE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE MOVEABLE PURE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_APPLICATIONICON ICON DISCARDABLE "..\\..\\..\\resources\\pictures\\carton.ico" ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_PROPERTIES DIALOG DISCARDABLE 0, 0, 173, 149 STYLE DS_SYSMODAL | DS_SETFOREGROUND | WS_VISIBLE | WS_CAPTION CAPTION "Preferences" FONT 8, "MS Sans Serif" BEGIN LTEXT "MIDI input device",IDC_STATIC,6,4,57,8 COMBOBOX IDC_COMBO_MIDIDEVICES,5,15,160,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Save MIDI settings",IDC_CHECK_SAVESETTINGS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,91,106,76,10 CONTROL "Enable MIDI device",IDC_CHECK_ENABLE_MIDI,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,5,106,79,10 PUSHBUTTON "Ok",IDOK,59,124,50,15 PUSHBUTTON "Cancel",IDCANCEL,115,124,50,15 CONTROL "",IDC_SLIDER_MIDITHREADPRIORITY,"msctls_trackbar32", TBS_BOTH | WS_TABSTOP,32,44,113,19 LTEXT "MIDI recording thread priority",IDC_STATIC,5,33,92,8 LTEXT "Lowest",IDC_STATIC,6,51,24,8 LTEXT "Highest",IDC_STATIC,145,52,25,8 CONTROL "Record velocity",IDC_CHECK_RECORD_VELOCITY,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,5,68,161,10 CONTROL "",IDC_SLIDER_AMPLIFYVELOCITY,"msctls_trackbar32", TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,43,80,102,19 LTEXT "Amplify 0%",IDC_STATIC,6,83,36,8 LTEXT "200%",IDC_STATIC,148,83,18,8 END ///////////////////////////////////////////////////////////////////////////// // // Dialog Info // IDD_PROPERTIES DLGINIT BEGIN IDC_COMBO_MIDIDEVICES, 0x403, 1, 0 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO MOVEABLE PURE BEGIN IDD_PROPERTIES, DIALOG BEGIN BOTTOMMARGIN, 138 END END #endif // APSTUDIO_INVOKED #endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED milkytracker-0.90.85+dfsg/src/tracker/win32/ThreadTimer.h0000644000175000017500000000136210766710716022205 0ustar admin2admin2#ifndef THREADTIMER__H #define THREADTIMER__H #include typedef void (*ThreadTimerProc)(void* obj, UINT idEvent); class CThreadTimer { void* object; // pointer to the "parent" object (like CTimersDlg) UINT idEvent; // timer ID UINT elapse; // "Sleep time" in milliseconds ThreadTimerProc proc; // Callback function, supplied by the user BOOL isActive; // Set to FALSE after the call to KillTimer CRITICAL_SECTION lock; // thread synchronization static DWORD WINAPI ThreadFunction (LPVOID pParam); // thread entry point public: CThreadTimer(); virtual ~CThreadTimer(); UINT SetTimer (void* obj, UINT nIDEvent, UINT uElapse, ThreadTimerProc lpTimerProc); BOOL KillTimer(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/win32/Win32_main.cpp0000644000175000017500000007140411315725503022231 0ustar admin2admin2/* * tracker/win32/Win32_main.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include #include #include #include #include #include #include #include #include "Win32_resource.h" #include "ThreadTimer.h" #include "PreferencesDialog.h" //------------------------------------------------------------------------------ #include "PPUI.h" #include "Screen.h" #include "Tracker.h" #include "DisplayDevice_WIN32.h" #include "PPSystem.h" #include "PPMutex.h" #include "XMFile.h" #include "MIDIInDevice.h" #include "MidiReceiver_win32.h" using midi::CMIDIInDevice; using midi::CMIDIReceiver; #undef FULLSCREEN #define IDC_HAND MAKEINTRESOURCE(32649) #define IDM_FULLSCREEN 0x10 #define IDM_PREFERENCES 0x11 #define WINDOWTITLE _T("Loading MilkyTracker...") #define FS_FREQUENCY 0x3C #define FS_BPS 0x20 #ifdef DEBUG #define SPLASH_WAIT_TIME 2000 #else #define SPLASH_WAIT_TIME 0 #endif #define WM_MYTIMER WM_USER+10 #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A #endif /**************************************************************************** * * Global variables * ****************************************************************************/ TCHAR c_szClassName[] = _T("MILKYTRACKERMAINCLASS"); HINSTANCE g_hinst = NULL; /* My instance handle */ BOOL g_fPaused = TRUE; /* Should I be paused? */ HWND hWnd = NULL; PPMutex* g_globalMutex = NULL; HCURSOR g_cursorStandard = NULL; HCURSOR g_cursorResizeWE = NULL; HCURSOR g_cursorHand = NULL; static PPScreen* myTrackerScreen = NULL; static Tracker* myTracker = NULL; static PPDisplayDevice* myDisplayDevice = NULL; static CThreadTimer myThreadTimer; static CPreferencesDialog* myPreferenceDialog = NULL; static CMIDIInDevice* myMidiInDevice = NULL; static MidiReceiver* myMidiReceiver = NULL; #ifdef MOUSETRACKING #if(WIN32_WINNT < 0x0400) #define WM_MOUSELEAVE WM_USER+2 #define TME_LEAVE 1 typedef struct tagTRACKMOUSEEVENT { DWORD cbSize; DWORD dwFlags; HWND hwndTrack; } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT; VOID CALLBACK TrackMouseTimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime) { RECT rect; POINT pt; GetClientRect(hWnd,&rect); MapWindowPoints(hWnd,NULL,(LPPOINT)&rect,2); GetCursorPos(&pt); if (!PtInRect(&rect,pt) || (WindowFromPoint(pt) != hWnd)) { if (!KillTimer(hWnd,idEvent)) { // Error killing the timer! } PostMessage(hWnd,WM_MOUSELEAVE,0,0); } } BOOL TrackMouseEvent(LPTRACKMOUSEEVENT ptme) { OutputDebugString(_T("TrackMouseEvent\n")); if (!ptme || ptme->cbSize < sizeof(TRACKMOUSEEVENT)) { OutputDebugString(_T("TrackMouseEvent: invalid TRACKMOUSEEVENT structure\n")); return FALSE; } if (!IsWindow(ptme->hwndTrack)) { OutputDebugString( _T("TrackMouseEvent: invalid hwndTrack\n")); return FALSE; } if (!(ptme->dwFlags & TME_LEAVE)) { OutputDebugString(_T("TrackMouseEvent: invalid dwFlags\n")); return FALSE; } return SetTimer(ptme->hwndTrack, ptme->dwFlags, 100,(TIMERPROC)TrackMouseTimerProc); } #endif // WIN32_WINNT #endif // MOUSETRACKING static void MyThreadTimerProc(void* obj, UINT idEvent) { SendMessage(hWnd, WM_MYTIMER, 0, 0); } pp_uint32 PPGetTickCount() { return ::GetTickCount(); } void QueryKeyModifiers() { if (::GetAsyncKeyState(VK_SHIFT)>>15) setKeyModifier(KeyModifierSHIFT); else clearKeyModifier(KeyModifierSHIFT); if (::GetAsyncKeyState(VK_MENU)>>15) setKeyModifier(KeyModifierALT); else clearKeyModifier(KeyModifierALT); if (::GetAsyncKeyState(VK_CONTROL)>>15) setKeyModifier(KeyModifierCTRL); else clearKeyModifier(KeyModifierCTRL); } static void EnableNumPad(pp_uint16* chr, LPARAM lParam) { // Always enable NUMPAD VKs (check scancode) switch (chr[1]) { // VK_DIVIDE case 0x35: if (lParam & (1 << 24)) chr[0] = VK_DIVIDE; break; // VK_MULTIPLY case 0x37: if (lParam & (1 << 24)) chr[0] = VK_MULTIPLY; break; // VK_MULTIPLY case 0x4A: if (lParam & (1 << 24)) chr[0] = VK_SUBTRACT; break; // VK_MULTIPLY case 0x4E: if (lParam & (1 << 24)) chr[0] = VK_ADD; break; // VK_MULTIPLY case 0x1C: // Check for extended key enter if (lParam & (1 << 24)) chr[0] = VK_SEPARATOR; break; // VK_DECIMAL case 0x53: if (!(lParam & (1 << 24))) chr[0] = VK_DECIMAL; break; // VK_NUMPAD0 case 0x52: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD0; break; // VK_NUMPAD1 case 0x4F: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD1; break; // VK_NUMPAD2 case 0x50: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD2; break; // VK_NUMPAD3 case 0x51: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD3; break; // VK_NUMPAD4 case 0x4B: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD4; break; // VK_NUMPAD5 case 0x4C: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD5; break; // VK_NUMPAD6 case 0x4D: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD6; break; // VK_NUMPAD7 case 0x47: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD7; break; // VK_NUMPAD8 case 0x48: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD8; break; // VK_NUMPAD9 case 0x49: if (!(lParam & (1 << 24))) chr[0] = VK_NUMPAD9; break; } } static void SendFile(LPCTSTR file) { PPSystemString finalFile(file); PPSystemString* strPtr = &finalFile; PPEvent event(eFileDragDropped, &strPtr, sizeof(PPSystemString*)); myTrackerScreen->raiseEvent(&event); } static void OnDropFiles(HDROP hDropInfo) { TCHAR buffer[MAX_PATH+1]; unsigned int count = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, 0, 0); if (count) { ::DragQueryFile(hDropInfo, 0, buffer, MAX_PATH); ::SendFile(buffer); } } static void StopMidiRecording() { // clean up midi device & listener if (myMidiInDevice) { delete myMidiInDevice; myMidiInDevice = NULL; } if (myMidiReceiver) { delete myMidiReceiver; myMidiReceiver = NULL; } } static void StartMidiRecording(UINT devID, bool recordVelocity, UINT velocityAmplify, UINT threadPriority = CMIDIInDevice::MIDI_THREAD_PRIORITY_NORMAL) { if (!CMIDIInDevice::GetNumDevs() || devID == (unsigned)-1) return; StopMidiRecording(); myMidiReceiver = new MidiReceiver(*myTracker, *g_globalMutex); myMidiReceiver->setRecordVelocity(recordVelocity); myMidiReceiver->setVelocityAmplify(velocityAmplify); myMidiInDevice = new CMIDIInDevice(*myMidiReceiver); // ---------------- Initialize MIDI ------------------- // We'll use the first device - we're not picky here try { myMidiInDevice->Open(devID); // Start recording myMidiInDevice->StartRecording((CMIDIInDevice::ThreadPriority)threadPriority); } catch (midi::CMIDIInException e) { StopMidiRecording(); PPSystemString str("Error while trying to setup the MIDI device. The error message is:\r\n"); str.append(e.what()); str.append("\r\nMIDI will be disabled."); ::MessageBox(hWnd, str, NULL, MB_OK | MB_ICONERROR); } } static void HandleMidiRecording() { if (!myPreferenceDialog) return; if (myPreferenceDialog->getUseMidiDeviceFlag()) StartMidiRecording(myPreferenceDialog->getSelectedMidiDeviceID(), myPreferenceDialog->getRecordVelocityFlag(), myPreferenceDialog->getVelocityAmplify(), myPreferenceDialog->getMidiRecordThreadPriority()); else StopMidiRecording(); } static void HandlePreferencesDialog() { if (myPreferenceDialog) { if (myPreferenceDialog->runModal() == IDOK) { HandleMidiRecording(); } } } static void RaiseEventSynchronized(PPEvent* event) { //if (globalMutex->tryLock()) //{ g_globalMutex->lock(); if (myTrackerScreen) myTrackerScreen->raiseEvent(event); g_globalMutex->unlock(); //} } static LONG WINAPI CrashHandler(EXCEPTION_POINTERS*) { // get path of our executable static TCHAR szPath[MAX_PATH+1]; static TCHAR buffer[MAX_PATH+1]; static TCHAR fileName[MAX_PATH+1]; DWORD dwLen; LPTSTR p; ::GetModuleFileName(NULL, szPath, MAX_PATH); // cut off executable dwLen = (DWORD)_tcslen(szPath); if (dwLen) { p = szPath + dwLen; while (p != szPath) { if (TEXT('\\') == *--p) { *(++p) = 0; break; } } } _tcscpy(buffer, szPath); _tcscat(buffer, _T("BACKUP00.XM")); int num = 1; while(XMFile::exists(buffer) && num <= 100) { _tcscpy(buffer, szPath); #ifdef _UNICODE wsprintf(fileName, L"BACKUP%02i.XM", num); #else sprintf(fileName, "BACKUP%02i.XM", num); #endif _tcscat(buffer, fileName); num++; } if (num != 100) myTracker->saveModule(buffer); MessageBox(NULL, _T("MilkyTracker has crashed, sorry for the inconvenience.\n\n")\ _T("An attempt was made to save the current module in the application folder.\n")\ _T("Please report this error back to the MilkyTracker development team.\n"), NULL, MB_OK); return EXCEPTION_CONTINUE_SEARCH; } /**************************************************************************** * * Ex_WndProc * * Window procedure for simple sample. * ****************************************************************************/ LRESULT CALLBACK Ex_WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { static BOOL lMouseDown = FALSE; static DWORD ltime; static PPPoint llastClickPosition = PPPoint(0,0); static WORD lClickCount = 0; static DWORD lButtonDownStartTime; static BOOL rMouseDown = FALSE; static DWORD rtime; static PPPoint rlastClickPosition = PPPoint(0,0); static WORD rClickCount = 0; static DWORD rButtonDownStartTime; static DWORD timerTicker = 0; static PPPoint p; static bool wasFullScreen = false; // ------------------------------------------ stupid fucking shit -------- #ifdef MOUSETRACKING TRACKMOUSEEVENT tme; #endif static BOOL fInWindow; static BOOL fInMenu; // ----------------------------------------------------------------------- if (lClickCount > 4) { lClickCount = 0; } if (rClickCount > 4) { rClickCount = 0; } switch (msg) { case WM_CREATE: myThreadTimer.SetTimer (NULL, 1, 20, MyThreadTimerProc); #ifndef _DEBUG SetUnhandledExceptionFilter(CrashHandler); #endif fInWindow = FALSE; fInMenu = FALSE; break; case WM_PAINT: if (!myTrackerScreen) break; myTrackerScreen->paint(); break; case WM_MOUSEWHEEL: { RECT rc; GetWindowRect(hwnd, &rc); TMouseWheelEventParams mouseWheelParams; // Absolute screen coordinates into client coordinates? //mouseWheelParams.pos.x = LOWORD(lParam)-(rc.left+GetSystemMetrics(SM_CXEDGE)+1); //mouseWheelParams.pos.y = HIWORD(lParam)-(rc.top+(GetSystemMetrics(SM_CXEDGE)+GetSystemMetrics(SM_CYCAPTION)+1)); if (myDisplayDevice->isFullScreen()) { mouseWheelParams.pos.x = LOWORD(lParam)-(rc.left); mouseWheelParams.pos.y = HIWORD(lParam)-(rc.top); mouseWheelParams.delta = ((signed short)HIWORD(wParam))/60; } else { mouseWheelParams.pos.x = LOWORD(lParam)-(rc.left+GetSystemMetrics(SM_CXEDGE)+1); mouseWheelParams.pos.y = HIWORD(lParam)-(rc.top+(GetSystemMetrics(SM_CXEDGE)+GetSystemMetrics(SM_CYCAPTION)+1)); mouseWheelParams.delta = ((signed short)HIWORD(wParam))/60; } PPEvent myEvent(eMouseWheelMoved, &mouseWheelParams, sizeof(mouseWheelParams)); RaiseEventSynchronized(&myEvent); break; } // ----- left mousebutton ------------------------------- case WM_LBUTTONDOWN: { if (!myTrackerScreen) break; if (lMouseDown) { p.x = -1; p.y = -1; PPEvent myEvent(eLMouseUp, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); lMouseDown = false; } p.x = LOWORD(lParam); p.y = HIWORD(lParam); PPEvent myEvent(eLMouseDown, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); lMouseDown = TRUE; //lButtonDownStartTime = timerTicker; lButtonDownStartTime = GetTickCount(); if (!lClickCount) { ltime = GetTickCount(); llastClickPosition.x = LOWORD(lParam); llastClickPosition.y = HIWORD(lParam); } else if (lClickCount == 2) { DWORD deltat = GetTickCount() - ltime; if (deltat > 500) { lClickCount = 0; ltime = GetTickCount(); llastClickPosition.x = LOWORD(lParam); llastClickPosition.y = HIWORD(lParam); } } lClickCount++; break; } // ----- right mousebutton ------------------------------- case WM_RBUTTONDOWN: { if (!myTrackerScreen) break; if (rMouseDown) { p.x = -1; p.y = -1; PPEvent myEvent(eRMouseUp, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); rMouseDown = false; } p.x = LOWORD(lParam); p.y = HIWORD(lParam); PPEvent myEvent(eRMouseDown, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); rMouseDown = TRUE; //rButtonDownStartTime = timerTicker; rButtonDownStartTime = GetTickCount(); if (!rClickCount) { rtime = GetTickCount(); rlastClickPosition.x = LOWORD(lParam); rlastClickPosition.y = HIWORD(lParam); } else if (rClickCount == 2) { DWORD deltat = GetTickCount() - rtime; if (deltat > 500) { rClickCount = 0; rtime = GetTickCount(); rlastClickPosition.x = LOWORD(lParam); rlastClickPosition.y = HIWORD(lParam); } } rClickCount++; break; } // ----- left mousebutton ------------------------------- case WM_LBUTTONUP: { if (!myTrackerScreen || !lMouseDown) break; lClickCount++; if (lClickCount == 4) { DWORD deltat = GetTickCount() - ltime; if (deltat < 500) { p.x = LOWORD(lParam); p.y = HIWORD(lParam); if (abs(p.x - llastClickPosition.x) < 4 && abs(p.y - llastClickPosition.y) < 4) { PPEvent myEvent(eLMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } } lClickCount = 0; } p.x = LOWORD(lParam); p.y = HIWORD(lParam); PPEvent myEvent(eLMouseUp, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); lMouseDown = FALSE; break; } // ----- right mousebutton ------------------------------- case WM_RBUTTONUP: { if (!myTrackerScreen || !rMouseDown) break; rClickCount++; if (rClickCount == 4) { DWORD deltat = GetTickCount() - rtime; if (deltat < 500) { p.x = LOWORD(lParam); p.y = HIWORD(lParam); if (abs(p.x - rlastClickPosition.x) < 4 && abs(p.y - rlastClickPosition.y) < 4) { PPEvent myEvent(eRMouseDoubleClick, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } } rClickCount = 0; } p.x = LOWORD(lParam); p.y = HIWORD(lParam); PPEvent myEvent(eRMouseUp, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); rMouseDown = FALSE; break; } #ifdef MOUSETRACKING case WM_MOUSELEAVE: fInWindow = FALSE; if (!fInMenu) { PPPoint p(-1000, -1000); if (lMouseDown) { PPEvent myEvent(eLMouseUp, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); lMouseDown = TRUE; } if (rMouseDown) { PPEvent myEvent(eRMouseDown, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); rMouseDown = TRUE; } } break; case WM_ENTERMENULOOP: fInMenu = TRUE; break; case WM_EXITMENULOOP: fInMenu = FALSE; break; #endif case WM_MOUSEMOVE: { #ifdef MOUSETRACKING if (!fInWindow) { fInWindow = TRUE; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_LEAVE; tme.hwndTrack = hwnd; if (!TrackMouseEvent(&tme)) { MessageBox(hwnd, TEXT("TrackMouseEvent Failed"), TEXT("Mouse Leave"),MB_OK); } } #endif if (!myTrackerScreen) break; if ((wParam&MK_LBUTTON) && lMouseDown) { p.x = LOWORD(lParam); p.y = HIWORD(lParam); PPEvent myEvent(eLMouseDrag, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } else if ((wParam&MK_RBUTTON) && rMouseDown) { p.x = LOWORD(lParam); p.y = HIWORD(lParam); PPEvent myEvent(eRMouseDrag, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } else { p.x = LOWORD(lParam); p.y = HIWORD(lParam); PPEvent myEvent(eMouseMoved, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } break; } case WM_CHAR: { WORD chr = (WORD)wParam; if (chr < 32 || chr > 127) break; PPEvent myEvent(eKeyChar, &chr, sizeof(chr)); RaiseEventSynchronized(&myEvent); break; } case WM_KEYDOWN: case WM_SYSKEYDOWN: { if (msg == WM_SYSKEYDOWN && wParam == VK_RETURN && myTrackerScreen) { PPEvent e(eFullScreen); RaiseEventSynchronized(&e); break; } BYTE keyState[256]; WORD keyBuf[2] = {0,0}; GetKeyboardState((PBYTE)&keyState); if (ToAscii(wParam, (lParam>>16)&255, (PBYTE)&keyState, keyBuf, 0) != 1) keyBuf[0] = keyBuf[1] = 0; QueryKeyModifiers(); // Check for right ALT key if (GetAsyncKeyState(VK_RMENU)>>15) wParam = VK_RMENU; // Check for right CTRL key else if (GetAsyncKeyState(VK_RCONTROL)>>15) wParam = VK_RCONTROL; // Menu key == VK_ALT if (wParam == VK_MENU) wParam = VK_ALT; WORD chr[3] = {(WORD)wParam, (WORD)(lParam>>16)&255, keyBuf[0]}; EnableNumPad(chr, lParam); if (wParam == VK_CAPITAL) { chr[1] = 0x100; // Toggle caps lock BYTE byKeybState[256]; GetKeyboardState(byKeybState); byKeybState[wParam] = !(BOOL)GetKeyState(VK_CAPITAL); SetKeyboardState(byKeybState); } PPEvent myEvent(eKeyDown, &chr, sizeof(chr)); RaiseEventSynchronized(&myEvent); if (wParam == VK_SPACE && (GetAsyncKeyState(VK_MENU)>>15)) return 0; break; } case WM_KEYUP: case WM_SYSKEYUP: { if (wParam == VK_MENU) wParam = VK_ALT; BYTE keyState[256]; WORD keyBuf[2] = {0,0}; GetKeyboardState((PBYTE)&keyState); if (ToAscii(wParam, (lParam>>16)&255, (PBYTE)&keyState, keyBuf, 0) != 1) keyBuf[0] = keyBuf[1] = 0; WORD chr[3] = {(WORD)wParam, (WORD)(lParam>>16)&255, keyBuf[0]}; EnableNumPad(chr, lParam); PPEvent myEvent(eKeyUp, &chr, sizeof(chr)); RaiseEventSynchronized(&myEvent); // Disable F10 system menu pop-up // -------------------------------------------------------- // From MSDN: // If the F10 key is pressed, the DefWindowProc function // sets an internal flag. When DefWindowProc receives the // WM_KEYUP message, the function checks whether the // internal flag is set and, if so, sends a WM_SYSCOMMAND // message to the top-level window. The wParam parameter of // the message is set to SC_KEYMENU. // -------------------------------------------------------- // Solution is to skip DefWindowProc when F10 is pressed if (wParam == VK_F10) return 0; break; } case WM_MYTIMER: { if (!myTrackerScreen) break; PPEvent myEvent(eTimer); RaiseEventSynchronized(&myEvent); timerTicker++; DWORD currentTime = GetTickCount(); if (lMouseDown && (currentTime - lButtonDownStartTime) > 500 && !(timerTicker%3)) { PPEvent myEvent(eLMouseRepeat, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } else if (rMouseDown && (currentTime - rButtonDownStartTime) > 500) { PPEvent myEvent(eRMouseRepeat, &p, sizeof(PPPoint)); RaiseEventSynchronized(&myEvent); } break; } case WM_SYSCOMMAND: { if (wParam == IDM_FULLSCREEN && myTrackerScreen) { PPEvent e(eFullScreen); RaiseEventSynchronized(&e); } else if (wParam == IDM_PREFERENCES) { HandlePreferencesDialog(); } else if (wParam == SC_MINIMIZE) { // activating the preferences dialog in minimized mode // seems to freeze, so better disable it EnableMenuItem(GetSystemMenu(hWnd, FALSE), IDM_PREFERENCES, (MF_GRAYED | MF_DISABLED)); } else if (wParam == SC_RESTORE) { // enable preference item in the system menu EnableMenuItem(GetSystemMenu(hWnd, FALSE), IDM_PREFERENCES, MF_ENABLED); } else if (wParam == SC_KEYMENU && lParam == 0x20) { // disable ALT+SPACE system menu popup) return 0; } break; } case WM_DROPFILES: OnDropFiles((HDROP)wParam); break; case WM_ACTIVATE: g_fPaused = (wParam == WA_INACTIVE); break; case WM_CLOSE: { if (GetAsyncKeyState(VK_F4) && GetAsyncKeyState(VK_MENU)) { return 0; } bool res = myTracker->shutDown(); if (res) { myThreadTimer.KillTimer(); PPEvent e(eAppQuit); RaiseEventSynchronized(&e); DestroyWindow(hwnd); } return 0; } case WM_SIZE: if (myDisplayDevice) myDisplayDevice->adjustWindowSize(); break; case WM_DESTROY: PostQuitMessage(0); break; /* case WM_KILLFOCUS: if (myTrackerScreen && myTrackerScreen->isFullScreen()) { wasFullScreen = true; PPEvent e(eFullScreen); RaiseEventSynchronized(&e); } else wasFullScreen = false; break; case WM_SETFOCUS: if (myTrackerScreen && wasFullScreen) { PPEvent e(eFullScreen); RaiseEventSynchronized(&e); wasFullScreen = false; } else wasFullScreen = false; break;*/ } return DefWindowProc(hwnd, msg, wParam, lParam); } static void InitTracker() { myPreferenceDialog = new CPreferencesDialog(hWnd, g_hinst); myTracker = new Tracker(); PPSize windowSize = myTracker->getWindowSizeFromDatabase(); pp_int32 scaleFactor = myTracker->getScreenScaleFactorFromDatabase(); bool fullScreen = myTracker->getFullScreenFlagFromDatabase(); #ifdef __LOWRES__ windowSize.width = 320; windowSize.height = 240; #endif myDisplayDevice = new PPDisplayDevice(hWnd, windowSize.width, windowSize.height, scaleFactor); // Change preferred window size myDisplayDevice->setSize(windowSize); if (fullScreen) myDisplayDevice->goFullScreen(fullScreen); myTrackerScreen = new PPScreen(myDisplayDevice, myTracker); myTracker->setScreen(myTrackerScreen); // Startup procedure myTracker->startUp(); HandleMidiRecording(); } /**************************************************************************** * * AppInit * * Set up everything the application needs to get started. * ****************************************************************************/ static BOOL AppInit(HINSTANCE hinst,int nCmdShow) { /* * Save instance handle for future reference. */ g_hinst = hinst; g_globalMutex = new PPMutex(); g_cursorStandard = LoadCursor(NULL, IDC_ARROW); g_cursorResizeWE = LoadCursor(NULL, IDC_SIZEWE); g_cursorHand = LoadCursor(NULL, IDC_HAND); /* * Set up the window class. */ WNDCLASS wc; wc.hCursor = g_cursorStandard; wc.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_APPLICATIONICON)); wc.lpszMenuName = NULL; wc.lpszClassName = c_szClassName; wc.hbrBackground = 0; wc.hInstance = hinst; wc.style = 0; wc.lpfnWndProc = Ex_WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; if (!RegisterClass(&wc)) return FALSE; #ifdef FULLSCREEN hWnd = CreateWindow(c_szClassName, WINDOWTITLE, WS_POPUP/*|WS_SYSMENU/*|WS_MAXIMIZEBOX|WS_MINIMIZEBOX*/,CW_USEDEFAULT,CW_USEDEFAULT, DISPLAYDEVICE_WIDTH + ::GetSystemMetrics(SM_CXEDGE)*2, DISPLAYDEVICE_HEIGHT + ::GetSystemMetrics(SM_CYCAPTION)+::GetSystemMetrics(SM_CYEDGE)*2, NULL, NULL, g_hinst, 0); #else hWnd = CreateWindow(c_szClassName, WINDOWTITLE, WS_SYSMENU/*|WS_MAXIMIZEBOX*/|WS_MINIMIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT, DISPLAYDEVICE_WIDTH + ::GetSystemMetrics(SM_CXEDGE)*2+2, DISPLAYDEVICE_HEIGHT + ::GetSystemMetrics(SM_CYCAPTION)+2+::GetSystemMetrics(SM_CYEDGE)*2, NULL, NULL, g_hinst, 0); #endif DragAcceptFiles(hWnd, TRUE); HMENU hMenu = GetSystemMenu(hWnd, FALSE); AppendMenu(hMenu, MF_SEPARATOR, 0xFFFFFFFF, NULL); AppendMenu(hMenu, MF_STRING, IDM_FULLSCREEN, _T("Fullscreen ALT+RETURN")); AppendMenu(hMenu, MF_SEPARATOR, 0xFFFFFFFF, NULL); AppendMenu(hMenu, MF_STRING, IDM_PREFERENCES, _T("Preferences...")); DWORD style = GetWindowLong(hWnd, GWL_EXSTYLE); ShowWindow(hWnd, nCmdShow); InitTracker(); return TRUE; } /* * This code is almost from: * http://www.codeguru.com/cpp/w-p/win32/article.php/c1427/ * * The original writer of the code did derive this class from public std::vector * which is pretty bad ;) */ class CmdLineArgs { public: CmdLineArgs() { TCHAR* cmdline = GetCommandLine(); // Save local copy of the command line string, because // ParseCmdLine() modifies this string while parsing it. m_cmdline = new TCHAR[_tcslen (cmdline) + 1]; if (m_cmdline) { _tcscpy(m_cmdline, cmdline); ParseCmdLine(); } } ~CmdLineArgs() { delete[] m_cmdline; } const TCHAR* operator[](size_t index) const { return m_args[index]; } size_t size() const { return m_args.size(); } private: TCHAR* m_cmdline; // the command line string std::vector m_args; //////////////////////////////////////////////////////////////////////////////// // Parse m_cmdline into individual tokens, which are delimited by spaces. If a // token begins with a quote, then that token is terminated by the next quote // followed immediately by a space or terminator. This allows tokens to contain // spaces. // This input string: This "is" a ""test"" "of the parsing" alg"o"rithm. // Produces these tokens: This, is, a, "test", of the parsing, alg"o"rithm //////////////////////////////////////////////////////////////////////////////// void ParseCmdLine () { enum { TERM = '\0', QUOTE = '\"' }; bool bInQuotes = false; TCHAR* pargs = m_cmdline; while (*pargs) { while (isspace (*pargs)) // skip leading whitespace pargs++; bInQuotes = (*pargs == QUOTE); // see if this token is quoted if (bInQuotes) // skip leading quote pargs++; m_args.push_back (pargs); // store position of current token // Find next token. // NOTE: Args are normally terminated by whitespace, unless the // arg is quoted. That's why we handle the two cases separately, // even though they are very similar. if (bInQuotes) { // find next quote followed by a space or terminator while (*pargs && !(*pargs == QUOTE && (isspace (pargs[1]) || pargs[1] == TERM))) pargs++; if (*pargs) { *pargs = TERM; // terminate token if (pargs[1]) // if quoted token not followed by a terminator pargs += 2; // advance to next token } } else { // skip to next non-whitespace character while (*pargs && !isspace (*pargs)) pargs++; if (*pargs && isspace (*pargs)) // end of token { *pargs = TERM; // terminate token pargs++; // advance to next token or terminator } } } // while (*pargs) } // ParseCmdLine() }; // class CmdLineArgs /**************************************************************************** * * Main * ****************************************************************************/ int PASCAL WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR szCmdLine, int nCmdShow) { MSG msg; msg.wParam = 0; /* In case something goes horribly wrong */ if (!AppInit(hinst, nCmdShow)) return -1; // Convert command line parameters CmdLineArgs args; if (args.size() >= 2) { // Retrieve second parameter (= input file) PPSystemString fileInput = args[1]; // When there is something specified, check if it's an existing file if (fileInput.length() && XMFile::exists(fileInput)) { SendFile(fileInput); } } if (hWnd) { MSG Msg; while (GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } } delete myMidiInDevice; delete myMidiReceiver; delete myTracker; delete myTrackerScreen; delete myPreferenceDialog; delete g_globalMutex; if (myDisplayDevice->isFullScreen()) myDisplayDevice->goFullScreen(false); delete myDisplayDevice; return (int)msg.wParam; } milkytracker-0.90.85+dfsg/src/tracker/GlobalColorConfig.h0000644000175000017500000000445011150223367022346 0ustar admin2admin2/* * tracker/GlobalColorConfig.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * GlobalColorConfig.h * MilkyTracker * * Created by Peter Barth on 21.11.05. * */ #ifndef GLOBALCOLORCONFIG__H #define GLOBALCOLORCONFIG__H #include "BasicTypes.h" #include "Singleton.h" class GlobalColorConfig : public PPSingleton { private: PPColor dummy; public: enum GlobalColors { // Pattern color identfiers ColorPatternNote = 0, ColorPatternInstrument, ColorPatternVolume, ColorPatternEffect, ColorPatternOperand, // Pattern cursor ColorCursor, // Cursor line ColorCursorLine, // Cursor line in record mode ColorCursorLineHighlighted, // Theme color (= desktop in FT2) ColorTheme, // Main text (= white?) ColorForegroundText, // PPButton colors ColorButtons, // PPButton foreground text ColorButtonText, // Various ColorSelection, ColorListBoxBackground, ColorPatternSelection, ColorTextHighlited, // usually yellow ColorScopes, // usually white ColorTextHighlitedSecond, // usually darker yellow ColorRowHighlitedFirst, // First color to highlight the row background ColorRowHighlitedSecond, // Second color to highlight the row background // Unused, endmarker ColorLast = ColorScopes + 24 // remember to subtract one from the last value every time you add another color to the list }; public: const PPColor& getColor(GlobalColors whichColor) const; const char* getColorReadableDescription(GlobalColors whichColor) const; void setColor(GlobalColors whichColor, const PPColor& color); friend class PPSingleton; }; #endif milkytracker-0.90.85+dfsg/src/tracker/Makefile.am0000644000175000017500000001332211254507623020707 0ustar admin2admin2bin_PROGRAMS = milkytracker milkytracker_SOURCES = AnimatedFXControl.cpp ColorExportImport.cpp \ ColorPaletteContainer.cpp DialogChannelSelector.cpp DialogEQ.cpp \ DialogGroupSelection.cpp DialogHandlers.cpp DialogListBox.cpp \ DialogPanning.cpp DialogQuickChooseInstrument.cpp DialogResample.cpp \ DialogWithValues.cpp DialogZap.cpp EQConstants.cpp EditorBase.cpp \ EnvelopeContainer.cpp EnvelopeEditor.cpp EnvelopeEditorControl.cpp \ Equalizer.cpp FileExtProvider.cpp FileIdentificator.cpp GlobalColorConfig.cpp \ InputControlListener.cpp LogoBig.cpp LogoSmall.cpp ModuleEditor.cpp \ ModuleServices.cpp PatternEditor.cpp PatternEditorClipBoard.cpp \ PatternEditorControl.cpp PatternEditorControlEventListener.cpp \ PatternEditorControlKeyboard.cpp PatternEditorControlTransposeHandler.cpp \ PatternEditorTools.cpp PatternTools.cpp PeakLevelControl.cpp Piano.cpp \ PianoControl.cpp PlayerController.cpp PlayerLogic.cpp PlayerMaster.cpp \ RecPosProvider.cpp RecorderLogic.cpp ResamplerHelper.cpp SampleEditor.cpp \ SampleEditorControl.cpp SampleEditorControlToolHandler.cpp \ SampleEditorResampler.cpp SamplePlayer.cpp ScopesControl.cpp SectionAbout.cpp \ SectionAbstract.cpp SectionAdvancedEdit.cpp SectionDiskMenu.cpp \ SectionHDRecorder.cpp SectionInstruments.cpp SectionOptimize.cpp \ SectionQuickOptions.cpp SectionSamples.cpp SectionSettings.cpp \ SectionSwitcher.cpp SectionTranspose.cpp SectionUpperLeft.cpp \ SongLengthEstimator.cpp SystemMessage.cpp TabHeaderControl.cpp TabManager.cpp \ TabTitleProvider.cpp TitlePageManager.cpp ToolInvokeHelper.cpp Tracker.cpp \ TrackerConfig.cpp TrackerInit.cpp TrackerKeyboard.cpp TrackerSettings.cpp \ TrackerSettingsDatabase.cpp TrackerShortCuts.cpp TrackerShutDown.cpp \ TrackerStartUp.cpp TrackerUpdate.cpp Undo.cpp VRand.cpp Zapper.cpp \ sdl/SDL_KeyTranslation.cpp sdl/SDL_Main.cpp noinst_HEADERS = AnimatedFXControl.h ColorExportImport.h \ ColorPaletteContainer.h ControlIDs.h DialogChannelSelector.h DialogEQ.h \ DialogGroupSelection.h DialogHandlers.h DialogListBox.h DialogPanning.h \ DialogQuickChooseInstrument.h DialogResample.h DialogWithValues.h DialogZap.h \ EQConstants.h EditModes.h EditorBase.h EnvelopeContainer.h EnvelopeEditor.h \ EnvelopeEditorControl.h Equalizer.h FileExtProvider.h FileIdentificator.h \ FileTypes.h FilterParameters.h GlobalColorConfig.h InputControlListener.h \ LogoBig.h LogoSmall.h ModuleEditor.h ModuleServices.h PatternEditor.h \ PatternEditorControl.h PatternEditorTools.h PatternTools.h PeakLevelControl.h \ Piano.h PianoControl.h PlayerController.h PlayerCriticalSection.h \ PlayerLogic.h PlayerMaster.h RecPosProvider.h RecorderLogic.h \ ResamplerHelper.h SIPButtons.h SampleEditor.h SampleEditorControl.h \ SampleEditorControlLastValues.h SampleEditorResampler.h SamplePlayer.h \ ScopesControl.h SectionAbout.h SectionAbstract.h SectionAdvancedEdit.h \ SectionDiskMenu.h SectionHDRecorder.h SectionInstruments.h SectionOptimize.h \ SectionQuickOptions.h SectionSamples.h SectionSettings.h SectionSwitcher.h \ SectionTranspose.h SectionUpperLeft.h SongLengthEstimator.h SystemMessage.h \ TabHeaderControl.h TabManager.h TabTitleProvider.h TitlePageManager.h \ TitlePageManager.h ToolInvokeHelper.h Tracker.h TrackerConfig.h \ TrackerSettingsDatabase.h Undo.h VRand.h Zapper.h sdl/SDL_KeyTranslation.h AM_CPPFLAGS = -DMILKYTRACKER -D__THREADTIMER__ -D__LINUX__ ${SDL_CFLAGS} INCLUDES = -I$(top_srcdir)/src/${RTMIDI_DIR} -I$(top_srcdir)/src/compression \ -I$(top_srcdir)/src/fx -I$(top_srcdir)/src/milkyplay -I$(top_srcdir)/src/ppui \ -I$(top_srcdir)/src/tracker -I$(top_srcdir)/src/midi/posix -I../midi/rtmidi \ -I$(top_srcdir)/src/ppui/osinterface -I$(top_srcdir)/src/ppui/osinterface/sdl \ -I$(top_srcdir)/src/ppui/osinterface/posix -I$(top_srcdir)/src/ppui/sdl -Isdl # The following cannot be linked as a static library, the linker will regard # the DecompressorXXX files as unused and therefore won't pull them in: compressionLib = $(top_builddir)/src/compression/Decompressor.o \ $(top_builddir)/src/compression/DecompressorGZIP.o \ $(top_builddir)/src/compression/DecompressorLHA.o \ $(top_builddir)/src/compression/DecompressorPP20.o \ $(top_builddir)/src/compression/DecompressorUMX.o \ $(top_builddir)/src/compression/DecompressorZIP.o \ $(top_builddir)/src/compression/MyIO.o $(top_builddir)/src/compression/PP20.o \ $(top_builddir)/src/compression/ZipExtractor.o \ $(top_builddir)/src/compression/unlha.o # add -lGL for experimental OpenGL support (and see ../ppui/Makefile.am) milkytracker_LDADD = $(top_builddir)/src/milkyplay/libmilkyplay.a \ $(top_builddir)/src/ppui/osinterface/libosinterface.a \ $(top_builddir)/src/ppui/libppui.a \ $(top_builddir)/src/ppui/osinterface/libosinterface.a \ $(top_builddir)/src/fx/libfx.a $(compressionLib) $(RTMIDI) $(SDL_LIBS) \ $(top_builddir)/src/compression/zziplib/generic/libzzip.a \ $(Z_LIBS) #$(ZZIP_LIBS) read below # NOTE: The MilkyTracker source contains a MODIFIED version of the zzip # library, which is statically linked to the executable. Simply changing the # build scripts to link against the system libzzip will result in non-working # zip support! EXTRA_DIST = carbon/Carbon_Definitions.h carbon/Carbon_main.cpp \ carbon/InfoPlist.strings carbon/KeyTranslation.cpp carbon/KeyTranslation.h \ carbon/PreferencesDialog.cpp carbon/PreferencesDialog.h carbon/iGetKeys.cpp \ carbon/iGetKeys.h win32/PreferencesDialog.cpp win32/PreferencesDialog.h \ win32/ThreadTimer.cpp win32/ThreadTimer.h win32/Win32_main.cpp \ win32/Win32_resource.h win32/Win32_resources.rc wince/ButtonMapper.cpp \ wince/ButtonMapper.h wince/VirtualKeyToScanCodeTable.cpp \ wince/VirtualKeyToScanCodeTable.h wince/WaitStateThread.cpp \ wince/WaitStateThread.h wince/WinCE_NEWRES.H wince/WinCE_ThreadTimer.cpp \ wince/WinCE_ThreadTimer.h wince/WinCE_main.cpp wince/WinCE_main.h \ wince/WinCE_resource.h milkytracker-0.90.85+dfsg/src/tracker/SampleEditorControlLastValues.h0000755000175000017500000001060111150223367024754 0ustar admin2admin2/* * tracker/SampleEditorControlLastValues.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __SAMPLEEDITORCONTROLASTVALUES_H__ #define __SAMPLEEDITORCONTROLASTVALUES_H__ #include "BasicTypes.h" #include "Dictionary.h" // Last values struct SampleEditorControlLastValues { pp_int32 newSampleSize; float boostSampleVolume; float fadeSampleVolumeStart; float fadeSampleVolumeEnd; float DCOffset; pp_int32 silenceSize; float waveFormVolume; float waveFormNumPeriods; bool hasEQ3BandValues; float EQ3BandValues[3]; bool hasEQ10BandValues; float EQ10BandValues[10]; pp_int32 resampleInterpolationType; bool adjustFtAndRelnote; static float invalidFloatValue() { return -12345678.0f; } static int invalidIntValue() { return -12345678; } void reset() { newSampleSize = invalidIntValue(); boostSampleVolume = invalidFloatValue(); fadeSampleVolumeStart = invalidFloatValue(); fadeSampleVolumeEnd = invalidFloatValue(); DCOffset = invalidFloatValue(); silenceSize = invalidIntValue(); waveFormVolume = invalidFloatValue(); waveFormNumPeriods = invalidFloatValue(); hasEQ3BandValues = hasEQ10BandValues = false; resampleInterpolationType = invalidIntValue(); adjustFtAndRelnote = true; } PPDictionary convertToDictionary() { PPDictionary result; result.store("newSampleSize", newSampleSize); result.store("boostSampleVolume", PPDictionary::convertFloatToIntNonLossy(boostSampleVolume)); result.store("fadeSampleVolumeStart", PPDictionary::convertFloatToIntNonLossy(fadeSampleVolumeStart)); result.store("fadeSampleVolumeEnd", PPDictionary::convertFloatToIntNonLossy(fadeSampleVolumeEnd)); result.store("DCOffset", PPDictionary::convertFloatToIntNonLossy(DCOffset)); result.store("silenceSize", silenceSize); result.store("waveFormVolume", PPDictionary::convertFloatToIntNonLossy(waveFormVolume)); result.store("waveFormNumPeriods", PPDictionary::convertFloatToIntNonLossy(waveFormNumPeriods)); result.store("resampleInterpolationType", resampleInterpolationType); result.store("adjustFtAndRelnote", adjustFtAndRelnote); return result; } void restoreFromDictionary(PPDictionary& dictionary) { PPDictionaryKey* key = dictionary.getFirstKey(); while (key) { if (key->getKey().compareToNoCase("newSampleSize") == 0) { newSampleSize = key->getIntValue(); } else if (key->getKey().compareToNoCase("boostSampleVolume") == 0) { boostSampleVolume = PPDictionary::convertIntToFloatNonLossy(key->getIntValue()); } else if (key->getKey().compareToNoCase("fadeSampleVolumeStart") == 0) { fadeSampleVolumeStart = PPDictionary::convertIntToFloatNonLossy(key->getIntValue()); } else if (key->getKey().compareToNoCase("fadeSampleVolumeEnd") == 0) { fadeSampleVolumeEnd = PPDictionary::convertIntToFloatNonLossy(key->getIntValue()); } else if (key->getKey().compareToNoCase("DCOffset") == 0) { DCOffset = PPDictionary::convertIntToFloatNonLossy(key->getIntValue()); } else if (key->getKey().compareToNoCase("silenceSize") == 0) { silenceSize = key->getIntValue(); } else if (key->getKey().compareToNoCase("waveFormVolume") == 0) { waveFormVolume = PPDictionary::convertIntToFloatNonLossy(key->getIntValue()); } else if (key->getKey().compareToNoCase("waveFormNumPeriods") == 0) { waveFormNumPeriods = PPDictionary::convertIntToFloatNonLossy(key->getIntValue()); } else if (key->getKey().compareToNoCase("resampleInterpolationType") == 0) { resampleInterpolationType = key->getIntValue(); } else if (key->getKey().compareToNoCase("adjustFtAndRelnote") == 0) { adjustFtAndRelnote = key->getBoolValue(); } key = dictionary.getNextKey(); } } }; #endif milkytracker-0.90.85+dfsg/src/tracker/PatternEditorControlEventListener.cpp0000644000175000017500000006470711150223367026224 0ustar admin2admin2/* * tracker/PatternEditorControlEventListener.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PatternEditorControlEventListener.cpp * MilkyTracker * * Created by Peter Barth on Fri Mar 11 2005. * */ #include "PatternEditorControl.h" #include "Event.h" #include "Screen.h" #include "Font.h" #include "ScrollBar.h" #include "Menu.h" #include "XModule.h" #include "ContextMenu.h" #include "Undo.h" #define SCROLLBARWIDTH SCROLLBUTTONSIZE pp_int32 PatternEditorControl::dispatchEvent(PPEvent* event) { if (pattern == NULL) return -1; if (eventListener == NULL) return -1; switch (event->getID()) { case eFocusGained: case eFocusGainedNoRepaint: { hasFocus = true; if (menuInvokeChannel != -1) { lastMenuInvokeChannel = menuInvokeChannel; menuInvokeChannel = -1; //parentScreen->paintControl(this); } if (event->getID() == eFocusGained) parentScreen->paintControl(this); //resetKeyModifier(); goto leave; } case eFocusLost: { hasFocus = false; parentScreen->paintControl(this); //resetKeyModifier(); goto leave; } case eFocusLostNoRepaint: { hasFocus = false; //resetKeyModifier(); goto leave; } case eMouseWheelMoved: { TMouseWheelEventParams* params = (TMouseWheelEventParams*)event->getDataPtr(); if (params->delta > 0) { PPEvent e(eBarScrollUp); handleEvent(reinterpret_cast(vLeftScrollbar), &e); } else if (params->delta < 0) { PPEvent e(eBarScrollDown); handleEvent(reinterpret_cast(vLeftScrollbar), &e); } event->cancel(); break; } case eRMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (hTopScrollbar->hit(*p)) { if (controlCaughtByLMouseButton) break; controlCaughtByRMouseButton = true; caughtControl = hTopScrollbar; caughtControl->dispatchEvent(event); } else if (hBottomScrollbar->hit(*p)) { if (controlCaughtByLMouseButton) break; controlCaughtByRMouseButton = true; caughtControl = hBottomScrollbar; caughtControl->dispatchEvent(event); } // Clicked on vertical scrollbar -> route event to scrollbar and catch scrollbar control else if (vLeftScrollbar->hit(*p)) { if (controlCaughtByLMouseButton) break; controlCaughtByRMouseButton = true; caughtControl = vLeftScrollbar; caughtControl->dispatchEvent(event); } else if (vRightScrollbar->hit(*p)) { if (controlCaughtByLMouseButton) break; controlCaughtByRMouseButton = true; caughtControl = vRightScrollbar; caughtControl->dispatchEvent(event); } else { RMouseDownInChannelHeading = -1; lastAction = RMouseDownActionFirstRClick; PPPoint cp = *p; cp.x-=location.x + SCROLLBARWIDTH + getRowCountWidth() + 4; cp.y-=location.y + SCROLLBARWIDTH + font->getCharHeight() + 4; if (cp.x < 0) break; // right click on channel number if ((RMouseDownInChannelHeading = pointInChannelHeading(cp)) != -1) { goto leave; } else if (cp.y < 0) break; pp_int32 i = (cp.x / slotSize) + startPos; if (i < 0 || i > patternEditor->getNumChannels()-1) break; invokeMenu(i, *p); } goto leave; } case eRMouseUp: { controlCaughtByRMouseButton = false; if (caughtControl && !controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; break; } PPPoint cp = *((PPPoint*)event->getDataPtr()); cp.x-=location.x + SCROLLBARWIDTH + getRowCountWidth() + 4; cp.y-=location.y + SCROLLBARWIDTH + font->getCharHeight() + 4; if (cp.x < 0 || RMouseDownInChannelHeading == -1) break; // right click on channel number if ((menuInvokeChannel = pointInChannelHeading(cp)) != -1 && menuInvokeChannel == RMouseDownInChannelHeading && lastAction == RMouseDownActionFirstRClick) { RMouseDownInChannelHeading = -1; parentScreen->paintControl(this); executeMenuCommand(MenuCommandIDMuteChannel); menuInvokeChannel = lastMenuInvokeChannel = -1; parentScreen->paintControl(this); goto leave; } RMouseDownInChannelHeading = -1; menuInvokeChannel = -1; parentScreen->paintControl(this); break; } case eLMouseDown: { hasDragged = false; PPPoint* p = (PPPoint*)event->getDataPtr(); // Clicked on horizontal scrollbar -> route event to scrollbar and catch scrollbar control if (hTopScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; controlCaughtByLMouseButton = true; caughtControl = hTopScrollbar; caughtControl->dispatchEvent(event); } else if (hBottomScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; controlCaughtByLMouseButton = true; caughtControl = hBottomScrollbar; caughtControl->dispatchEvent(event); } // Clicked on vertical scrollbar -> route event to scrollbar and catch scrollbar control else if (vLeftScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; controlCaughtByLMouseButton = true; caughtControl = vLeftScrollbar; caughtControl->dispatchEvent(event); } else if (vRightScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; controlCaughtByLMouseButton = true; caughtControl = vRightScrollbar; caughtControl->dispatchEvent(event); } // Clicked in client area else { PPPoint cp = *p; cp.x-=location.x + SCROLLBARWIDTH + getRowCountWidth() + 4; cp.y-=location.y + SCROLLBARWIDTH + font->getCharHeight() + 4; if (cp.y < -((pp_int32)font->getCharHeight() + 6)) break; if (cp.x < -(getRowCountWidth() + 4)) break; // select new row by clicking on row number if (cp.x < -3) { pp_int32 newStartIndex = cp.y / font->getCharHeight(); pp_int32 newStartPos = cp.x / slotSize; pp_int32 visibleRows = (visibleHeight) / font->getCharHeight(); pp_int32 visibleChannels = (visibleWidth) / slotSize; // copy of current selection patternEditor->getSelection().backup(); preCursor = patternEditor->getCursor(); if (newStartIndex < visibleRows && newStartIndex >= 0) { if (newStartIndex + startIndex < 0) break; preCursor.row = newStartIndex + startIndex; } ppreCursor = &preCursor; break; } else if (cp.x < 0) { break; } pp_int32 i; if ((i = pointInChannelHeading(cp)) != -1) { // Special commands // Right button is pressed and left button is pressed if (::getKeyModifier() & KeyModifierALT) { RMouseDownInChannelHeading = i; lastAction = RMouseDownActionSecondLClick; } if (RMouseDownInChannelHeading == i) { if (lastAction == RMouseDownActionFirstRClick || lastAction == RMouseDownActionSecondLClick) { if (isSoloChannel(i)) goto unmuteAll; menuInvokeChannel = i; executeMenuCommand(MenuCommandIDSoloChannel); parentScreen->paintControl(this); lastAction = RMouseDownActionFirstLClick; hasDragged = true; goto leave; } else if (lastAction == RMouseDownActionFirstLClick) { unmuteAll: menuInvokeChannel = i; executeMenuCommand(MenuCommandIDUnmuteAll); parentScreen->paintControl(this); lastAction = RMouseDownActionSecondLClick; hasDragged = true; goto leave; } } if (i == lastMenuInvokeChannel) { lastMenuInvokeChannel = -1; goto leave; } // show menu pp_int32 menuPosY = location.y + SCROLLBARWIDTH + 1 + font->getCharHeight(); pp_int32 menuPosX = location.x + SCROLLBARWIDTH + getRowCountWidth() + 4 + slotSize * (i - startPos); PPPoint p2(menuPosX, menuPosY); invokeMenu(i, p2); goto leave; } else if (cp.y < 0) break; pp_int32 newStartIndex = cp.y / font->getCharHeight(); pp_int32 newStartPos = cp.x / slotSize; pp_int32 visibleRows = (visibleHeight) / font->getCharHeight(); pp_int32 visibleChannels = (visibleWidth) / slotSize; // copy of current selection patternEditor->getSelection().backup(); // If we're pressing the shift key start selection // at current cursor position if (::getKeyModifier() & selectionKeyModifier) { if (patternEditor->getSelection().start.isValid()) patternEditor->getSelection().end = patternEditor->getCursor(); else patternEditor->getSelection().start = patternEditor->getCursor(); } preCursor = patternEditor->getCursor(); if (newStartIndex < visibleRows && newStartIndex >= 0) { if (newStartIndex + startIndex < 0) break; preCursor.row = newStartIndex + startIndex; } if (newStartPos < visibleHeight && newStartPos >= 0) { selectionTicker = 0; startSelection = true; if (newStartPos + startPos < 0) break; preCursor.channel = newStartPos + startPos; if (preCursor.channel >= patternEditor->getNumChannels()) break; // start selecting row if (!(::getKeyModifier() & selectionKeyModifier)) { patternEditor->getSelection().start.channel = patternEditor->getSelection().end.channel = preCursor.channel; patternEditor->getSelection().start.row = patternEditor->getSelection().end.row = preCursor.row; } else { patternEditor->getSelection().end.channel = preCursor.channel; patternEditor->getSelection().end.row = preCursor.row; } pp_int32 innerPos = cp.x % slotSize; preCursor.inner = 0; if (!(::getKeyModifier() & selectionKeyModifier)) patternEditor->getSelection().start.inner = 0; patternEditor->getSelection().end.inner = 0; for (pp_uint32 i = 0; i < sizeof(cursorPositions) - 1; i++) { if (innerPos >= cursorPositions[i] && innerPos < cursorPositions[i+1]) { preCursor.inner = i; if (!(::getKeyModifier() & selectionKeyModifier)) patternEditor->getSelection().start.inner = i; patternEditor->getSelection().end.inner = i; break; } } } ppreCursor = &preCursor; //parentScreen->paintControl(this); } break; } case eLMouseUp: controlCaughtByLMouseButton = false; if (caughtControl && !controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; break; } menuInvokeChannel = -1; if (!hasDragged && !(::getKeyModifier() & selectionKeyModifier) && ppreCursor) { if (properties.clickToCursor) { patternEditor->setCursor(*ppreCursor); notifyUpdate(AdvanceCodeSelectNewRow); switch (properties.scrollMode) { case ScrollModeToCenter: case ScrollModeStayInCenter: assureCursorVisible(); break; } } patternEditor->resetSelection(); } parentScreen->paintControl(this); startSelection = false; ppreCursor = NULL; break; case eLMouseDrag: { if (caughtControl && controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } if (!startSelection) break; hasDragged = true; goto markSelection; //break; } case eRMouseDrag: { if (caughtControl && controlCaughtByRMouseButton) caughtControl->dispatchEvent(event); break; } case eRMouseRepeat: { if (caughtControl && controlCaughtByRMouseButton) caughtControl->dispatchEvent(event); break; } case eLMouseRepeat: { if (caughtControl && controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } // for slowing down mouse pressed events selectionTicker++; if (selectionTicker&1) break; // no selection has been made or mouse hasn't been dragged if (!startSelection || !hasDragged) { // mouse hasn't been dragged and selection ticker has reached threshold value if (!hasDragged && selectionTicker > 0) { // get point PPPoint* p = (PPPoint*)event->getDataPtr(); // make sure scrollbars weren't pressed if (!hTopScrollbar->hit(*p) && !hBottomScrollbar->hit(*p) && !vLeftScrollbar->hit(*p) && !vRightScrollbar->hit(*p)) { // translate into local coordinate system PPPoint cp = *p; cp.x-=location.x + SCROLLBARWIDTH + getRowCountWidth() + 4; cp.y-=location.y + SCROLLBARWIDTH + font->getCharHeight() + 4; // not in our local CS if (cp.x < 0 || cp.y < 0) break; // valid channel? pp_int32 i = (cp.x / slotSize) + startPos; if (i < 0 || i > patternEditor->getNumChannels()-1) break; // restore last selection // will be made when mouse left mouse button is pressed if (patternEditor->getSelection().isCopyValid()) { patternEditor->getSelection().restore(); } // No more cursor positioning ppreCursor = NULL; invokeMenu(i, *p); // we're finished with event handling here goto leave; } } break; } markSelection: PPPoint cp = *((PPPoint*)event->getDataPtr()); PPPoint cp2 = cp; cp.x-=location.x + SCROLLBARWIDTH + getRowCountWidth() + 4; cp.y-=location.y + SCROLLBARWIDTH + font->getCharHeight() + 4; cp2.x-=location.x; cp2.y-=location.y; if (cp2.x > size.width - SCROLLBARWIDTH /*- (slotSize>>1)*/) { if (startPos + (visibleWidth / slotSize) < patternEditor->getNumChannels()) startPos++; } else if (cp2.x < SCROLLBARWIDTH + (signed)getRowCountWidth() + 4) { if (startPos > 0) startPos--; } if (cp2.y > size.height - SCROLLBARWIDTH /*- ((signed)font->getCharHeight()*3)*/) { if (properties.scrollMode != ScrollModeStayInCenter) { if (startIndex + (visibleHeight / font->getCharHeight()) < pattern->rows) startIndex++; } else { scrollCursorDown(); assureCursorVisible(true, false); } } else if (cp2.y < SCROLLBARWIDTH + ((signed)font->getCharHeight()*4 /*+ 4*/)) { if (properties.scrollMode != ScrollModeStayInCenter) { if (startIndex > 0) startIndex--; } else { scrollCursorUp(); assureCursorVisible(true, false); } } if (cp.x < 0) { cp.x = 0; //goto leave; } if (cp.y < 0) { cp.y = 0; //goto leave; } pp_int32 newStartIndex = cp.y / font->getCharHeight(); pp_int32 newStartPos = cp.x / slotSize; pp_int32 visibleRows = (visibleHeight) / font->getCharHeight(); pp_int32 visibleChannels = (visibleWidth) / slotSize; //if (newStartIndex < visibleRows && // newStartPos < visibleChannels) //{ mp_sint32 cursorPositionRow = newStartIndex + startIndex; mp_sint32 cursorPositionChannel = newStartPos + startPos; if (cursorPositionRow < 0) cursorPositionRow = 0; if (cursorPositionChannel < 0) cursorPositionChannel = 0; //if (cursorPositionRow < 0 || cursorPositionChannel < 0) // break; if (cursorPositionChannel >= patternEditor->getNumChannels()) { patternEditor->getSelection().end.channel = patternEditor->getNumChannels()-1; patternEditor->getSelection().end.inner = 7; } else { // start selecting row patternEditor->getSelection().end.channel = cursorPositionChannel; patternEditor->getSelection().end.row = cursorPositionRow; pp_int32 innerPos = cp.x % slotSize; //selectionEnd.inner = 7; for (pp_uint32 i = 0; i < sizeof(cursorPositions) - 1; i++) { if (innerPos >= cursorPositions[i] && innerPos < cursorPositions[i+1]) { patternEditor->getSelection().end.inner = i; break; } } } setScrollbarPositions(startIndex, startPos); //} parentScreen->paintControl(this); break; } case eKeyDown: { //assureCursorVisible(); pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); pp_uint16 scanCode = *(((pp_uint16*)event->getDataPtr())+1); pp_uint16 character = *(((pp_uint16*)event->getDataPtr())+2); assureCursor = true; assureUpdate = false; bool keyboadStartSelectionFlipped = false; // start selection if (keyCode == VK_LEFT || keyCode == VK_RIGHT || keyCode == VK_UP || keyCode == VK_DOWN || keyCode == VK_PRIOR || keyCode == VK_NEXT || keyCode == VK_HOME || keyCode == VK_END || keyCode == VK_TAB) { if ((::getKeyModifier() == (unsigned)selectionKeyModifier) && keyboardStartSelection) { patternEditor->getSelection().start = patternEditor->getSelection().end = patternEditor->getCursor(); keyboardStartSelection = false; if (keyCode == VK_LEFT || keyCode == VK_RIGHT || keyCode == VK_UP || keyCode == VK_DOWN) { keyboadStartSelectionFlipped = true; } } } switch (keyCode) { // store key modifiers case VK_ALT: assureCursor = false; if (selectionKeyModifier & KeyModifierALT) keyboardStartSelection = true; break; case VK_SHIFT: assureCursor = false; if (selectionKeyModifier & KeyModifierSHIFT) keyboardStartSelection = true; break; case VK_CONTROL: assureCursor = false; if (selectionKeyModifier & KeyModifierCTRL) keyboardStartSelection = true; break; default: { bool res = executeBinding(scanCodeBindings, scanCode); if (!res) res = executeBinding(eventKeyDownBindings, keyCode); if (!res) handleKeyDown(keyCode, scanCode, character); break; } } // normal selection if (keyCode == VK_LEFT || keyCode == VK_RIGHT || keyCode == VK_UP || keyCode == VK_DOWN || keyCode == VK_PRIOR || keyCode == VK_NEXT || keyCode == VK_HOME || keyCode == VK_END || keyCode == VK_TAB) { if ((::getKeyModifier() == (unsigned)selectionKeyModifier) && !keyboardStartSelection && !keyboadStartSelectionFlipped) { patternEditor->getSelection().end = patternEditor->getCursor(); } else if (::getKeyModifier() == (KeyModifierALT|KeyModifierSHIFT) && patternEditor->getSelection().start.isValid()) { patternEditor->getSelection().end = patternEditor->getCursor(); } } if (assureCursor) { assureCursorVisible(); parentScreen->paintControl(this); } else if (assureUpdate) { parentScreen->paintControl(this); } break; } case eKeyUp: { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); switch (keyCode) { case VK_SHIFT: if (selectionKeyModifier & KeyModifierSHIFT) keyboardStartSelection = false; break; case VK_ALT: if (selectionKeyModifier & KeyModifierALT) keyboardStartSelection = false; break; case VK_CONTROL: if (selectionKeyModifier & KeyModifierCTRL) keyboardStartSelection = false; break; } break; } default: if (caughtControl == NULL) break; caughtControl->dispatchEvent(event); goto leave; } leave: return 0; } pp_int32 PatternEditorControl::handleEvent(PPObject* sender, PPEvent* event) { // Vertical scrollbar, scroll down if ((sender == reinterpret_cast(vLeftScrollbar) || sender == reinterpret_cast(vRightScrollbar)) && event->getID() == eBarScrollDown) { if (properties.scrollMode != ScrollModeStayInCenter) { pp_int32 visibleItems = (visibleHeight) / font->getCharHeight(); if (startIndex + visibleItems < pattern->rows) startIndex++; float v = (float)(pattern->rows - visibleItems); vLeftScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); vRightScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); } else { scrollCursorDown(); assureCursorVisible(true, false); } } // Vertical scrollbar, scroll up else if ((sender == reinterpret_cast(vLeftScrollbar) || sender == reinterpret_cast(vRightScrollbar)) && event->getID() == eBarScrollUp) { if (properties.scrollMode != ScrollModeStayInCenter) { if (startIndex) startIndex--; pp_int32 visibleItems = (visibleHeight) / font->getCharHeight(); float v = (float)(pattern->rows - visibleItems); vLeftScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); vRightScrollbar->setBarPosition((pp_int32)(startIndex*(65536.0f/v))); } else { scrollCursorUp(); assureCursorVisible(true, false); } } // Vertical scrollbar, position changed else if ((sender == reinterpret_cast(vLeftScrollbar) || sender == reinterpret_cast(vRightScrollbar)) && event->getID() == eBarPosChanged) { float pos = reinterpret_cast(sender)->getBarPosition()/65536.0f; switch (properties.scrollMode) { case ScrollModeToEnd: case ScrollModeToCenter: { pp_int32 visibleItems = (visibleHeight) / font->getCharHeight(); float v = (float)(pattern->rows - visibleItems); startIndex = (pp_uint32)(v*pos); vLeftScrollbar->setBarPosition((pp_int32)(pos*65536.0f)); vRightScrollbar->setBarPosition((pp_int32)(pos*65536.0f)); break; } case ScrollModeStayInCenter: patternEditor->getCursor().row = (pp_int32)(pos*(pattern->rows-1)); assureCursorVisible(true, false); break; } } // Horizontal scrollbar, scroll up (=left) else if ((sender == reinterpret_cast(hBottomScrollbar) || sender == reinterpret_cast(hTopScrollbar)) && event->getID() == eBarScrollUp) { if (startPos) startPos--; pp_int32 visibleItems = (visibleWidth) / slotSize; float v = (float)(patternEditor->getNumChannels() - visibleItems); hTopScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); hBottomScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, scroll down (=right) else if ((sender == reinterpret_cast(hBottomScrollbar) || sender == reinterpret_cast(hTopScrollbar)) && event->getID() == eBarScrollDown) { pp_int32 visibleItems = (visibleWidth) / slotSize; if (startPos + visibleItems < (signed)patternEditor->getNumChannels()) startPos++; float v = (float)(patternEditor->getNumChannels() - visibleItems); if (v < 0.0f) v = 0.0f; hTopScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); hBottomScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, position changed else if ((sender == reinterpret_cast(hBottomScrollbar) || sender == reinterpret_cast(hTopScrollbar)) && event->getID() == eBarPosChanged) { float pos = reinterpret_cast(sender)->getBarPosition()/65536.0f; pp_int32 visibleItems = (visibleWidth) / slotSize; float v = (float)(patternEditor->getNumChannels() - visibleItems); if (v < 0.0f) v = 0.0f; startPos = (pp_uint32)(v*pos); hTopScrollbar->setBarPosition((pp_int32)(pos*65536.0f)); hBottomScrollbar->setBarPosition((pp_int32)(pos*65536.0f)); } else if (sender == reinterpret_cast(editMenuControl)) { switch (event->getID()) { case eCommand: executeMenuCommand(*((pp_int32*)event->getDataPtr())); break; case eRemovedContextMenu: { struct MetaData { pp_int32 id; PPPoint p; } *metaData; metaData = (MetaData*)event->getDataPtr(); PPPoint cp(metaData->p); cp.x-=location.x + SCROLLBARWIDTH + getRowCountWidth() + 4; cp.y-=location.y + SCROLLBARWIDTH + font->getCharHeight() + 4; pp_int32 menuInvokeChannel = pointInChannelHeading(cp); if (menuInvokeChannel != -1 && menuInvokeChannel != this->menuInvokeChannel) { PPEvent e((EEventDescriptor)metaData->id, &metaData->p, sizeof(PPPoint)); dispatchEvent(&e); } // clicked somewhere else in the control, no more channel header // highlight and repaint without updating else { this->menuInvokeChannel = -1; parentScreen->paintControl(this, false); } break; } } return 0; } else { return 0; } // Little happy workaround for scroll to center scrollmode if (properties.scrollMode == ScrollModeToCenter) { pp_int32 visibleItems = (visibleHeight) / font->getCharHeight(); if ((vLeftScrollbar->getBarPosition() == 65536 || vRightScrollbar->getBarPosition() == 65536) && startIndex + visibleItems <= pattern->rows) { startIndex++; } } parentScreen->paintControl(this); return 0; } pp_int32 PatternEditorControl::pointInChannelHeading(PPPoint& cp) { if (cp.x < 0) return -1; // right click on channel numbber if (cp.y < 0 && cp.y < -2 && cp.y > -4-(pp_int32)font->getCharHeight()) { pp_int32 i = (cp.x / slotSize) + startPos; if (i < 0 || i > 31) return -1; return i; } return -1; } void PatternEditorControl::invokeMenu(pp_int32 channel, const PPPoint& p) { menuInvokeChannel = channel; editMenuControl->setLocation(p); editMenuControl->setState(MenuCommandIDCut, !hasValidSelection()); editMenuControl->setState(MenuCommandIDCopy, !hasValidSelection()); editMenuControl->setState(MenuCommandIDPaste, patternEditor->clipBoardSelectionIsEmpty()); editMenuControl->setState(MenuCommandIDPorousPaste, patternEditor->clipBoardSelectionIsEmpty()); editMenuControl->setState(MenuCommandIDUndo, !patternEditor->canUndo()); editMenuControl->setState(MenuCommandIDRedo, !patternEditor->canRedo()); editMenuControl->setState(MenuCommandIDSwapChannels, menuInvokeChannel == patternEditor->getCursor().channel); parentScreen->setContextMenuControl(editMenuControl); } bool PatternEditorControl::isSoloChannel(pp_int32 c) { pp_int32 i = 0; for (pp_int32 j = 0; j < patternEditor->getNumChannels(); j++) if (muteChannels[j]) i++; if (!muteChannels[c] && i == patternEditor->getNumChannels()-1) return true; return false; } milkytracker-0.90.85+dfsg/src/tracker/EnvelopeContainer.h0000644000175000017500000000247611150223367022447 0ustar admin2admin2/* * tracker/EnvelopeContainer.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * EnvelopeContainer.h * MilkyTracker * * Created by Peter Barth on 20.06.05. * */ #ifndef ENVELOPECONTAINER__H #define ENVELOPECONTAINER__H #include "BasicTypes.h" struct TEnvelope; class EnvelopeContainer { private: TEnvelope* envelopes; pp_int32 numEnvelopes; public: EnvelopeContainer(pp_int32 num); ~EnvelopeContainer(); void store(pp_int32 index, const TEnvelope& env); const TEnvelope* restore(pp_int32 index); static PPString encodeEnvelope(const TEnvelope& env); static TEnvelope decodeEnvelope(const PPString& str); }; #endif milkytracker-0.90.85+dfsg/src/tracker/DialogHandlers.cpp0000755000175000017500000001041111150223367022231 0ustar admin2admin2/* * tracker/DialogHandlers.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogHandlers.cpp * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #include "DialogHandlers.h" #include "Tracker.h" #include "Zapper.h" #include "DialogChannelSelector.h" #include "DialogZap.h" #include "ListBox.h" #include "ModuleEditor.h" #include "PlayerController.h" #include "SectionSamples.h" #include "SectionInstruments.h" #include "ControlIDs.h" #include "ScopesControl.h" // Load either left or right sample from a list of choices pp_int32 SampleLoadChannelSelectionHandler::ActionOkay(PPObject* sender) { PPListBox* listBox = static_cast(tracker.dialog)->getListBox(); tracker.signalWaitState(true); if (preferredFileName.length()) tracker.loadingParameters.res = tracker.moduleEditor->loadSample(fileName, tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex(), listBox->getSelectedIndex(), preferredFileName); else tracker.loadingParameters.res = tracker.moduleEditor->loadSample(fileName, tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex(), listBox->getSelectedIndex()); tracker.sectionSamples->updateAfterLoad(); return !tracker.finishLoading(); } // Mixdown all channels into one pp_int32 SampleLoadChannelSelectionHandler::ActionUser1(PPObject* sender) { tracker.signalWaitState(true); // mixdown samples if (preferredFileName.length()) tracker.loadingParameters.res = tracker.moduleEditor->loadSample(fileName, tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex(), -1, preferredFileName); else tracker.loadingParameters.res = tracker.moduleEditor->loadSample(fileName, tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex(), -1); tracker.sectionSamples->updateAfterLoad(); return !tracker.finishLoading(); } pp_int32 SampleLoadChannelSelectionHandler::ActionCancel(PPObject* sender) { tracker.loadingParameters.abortLoading = true; tracker.finishLoading(); return 0; } void SampleLoadChannelSelectionHandler::setCurrentFileName(const PPSystemString& fileName) { this->fileName = fileName; } void SampleLoadChannelSelectionHandler::setPreferredFileName(const PPSystemString& fileName) { this->preferredFileName = fileName; } ZapHandler::ZapHandler(const Zapper& zapper) : zapper(new Zapper(zapper)) { } ZapHandler::~ZapHandler() { delete zapper; } pp_int32 ZapHandler::ActionUser1(PPObject* sender) { zapper->zapAll(); return 0; } pp_int32 ZapHandler::ActionUser2(PPObject* sender) { zapper->zapSong(); return 0; } pp_int32 ZapHandler::ActionUser3(PPObject* sender) { zapper->zapPattern(); return 0; } pp_int32 ZapHandler::ActionUser4(PPObject* sender) { zapper->zapInstruments(); return 0; } pp_int32 ZapInstrumentHandler::ActionOkay(PPObject* sender) { tracker.moduleEditor->zapInstrument(tracker.listBoxInstruments->getSelectedIndex()); tracker.sectionInstruments->resetEnvelopeEditor(); tracker.sectionSamples->resetSampleEditor(); tracker.sectionInstruments->updateAfterLoad(); return 0; } pp_int32 SaveProceedHandler::ActionOkay(PPObject* sender) { tracker.handleSaveProceed(); return 0; } pp_int32 SaveProceedHandler::ActionCancel(PPObject* sender) { tracker.handleSaveCancel(); return 0; } milkytracker-0.90.85+dfsg/src/tracker/EditorBase.cpp0000644000175000017500000000421311150223367021372 0ustar admin2admin2/* * tracker/EditorBase.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * EditorBase.cpp * MilkyTracker * * Created by Peter Barth on 26.11.07. * */ #include "EditorBase.h" #include "SimpleVector.h" void EditorBase::notifyListener(EditorNotifications notification) { for (pp_int32 i = 0; i < notificationListeners->size(); i++) notificationListeners->get(i)->editorNotification(this, notification); } EditorBase::EditorBase() : lazyUpdateNotifications(false), module(NULL) { notificationListeners = new PPSimpleVector(16, false); } EditorBase::~EditorBase() { notifyListener(EditorDestruction); delete notificationListeners; } void EditorBase::addNotificationListener(EditorNotificationListener* listener) { // remove it first, no duplicate event listener entries allowed removeNotificationListener(listener); notificationListeners->add(listener); } bool EditorBase::removeNotificationListener(EditorNotificationListener* listener) { for (pp_int32 i = 0; i < notificationListeners->size(); i++) { // found? listeners can not be contained in the list multiple times // see addEditorNotificationListener() if (notificationListeners->get(i) == listener) { notificationListeners->remove(i); return true; } } return false; } void EditorBase::enterCriticalSection() { notifyListener(NotificationPrepareCritical); } void EditorBase::leaveCriticalSection() { notifyListener(NotificationUnprepareCritical); } milkytracker-0.90.85+dfsg/src/tracker/Equalizer.cpp0000644000175000017500000000334311150223367021315 0ustar admin2admin2/* * tracker/Equalizer.cpp * * Copyright 2009 David Ross (david_ross@hotmail.co.uk) * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Equalizer.h" Equalizer::Equalizer(void) : xL1(0), xL2(0), xR1(0), xR2(0), yL1(0), yL2(0), yR1(0), yR2(0), b0(0), b1(0), b2(0), a0(0), a1(0), a2(0) { } Equalizer::~Equalizer(void) { } void Equalizer::CalcCoeffs(float centre, float width, float rate, float gain) { const double twopi = 6.283185307179586476925286766559; double w0 = twopi * centre / rate; double dw = twopi * width / rate; double m1 = tan(dw/2) / 1 + tan(dw/2); double m2 = (1 - pow(tan(w0/2), 2)) / (1 + pow(tan(w0/2), 2)); b0 = 1 + (gain - 1) * m1; b1 = 2 * m2 * (m1 - 1); b2 = 1 - m1 * (1 + gain); a0 = 1; a1 = b1; a2 = 1 - 2 * m1; } void Equalizer::Filter(double xL, double xR, double &yL, double &yR) { const double denorm = 1e-24f; yL = denorm + (b0*xL + b1*xL1 + b2*xL2 - a1*yL1 - a2*yL2); yR = denorm + (b0*xR + b1*xR1 + b2*xR2 - a1*yR1 - a2*yR2); xL2 = xL1; xL1 = xL; xR2 = xR1; xR1 = xR; yL2 = yL1; yL1 = yL; yR2 = yR1; yR1 = yR; } milkytracker-0.90.85+dfsg/src/tracker/SampleEditor.h0000644000175000017500000002371711150223367021420 0ustar admin2admin2/* * tracker/SampleEditor.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SampleEditor.h * MilkyTracker * * Created by Peter Barth on 22.11.07. * */ #ifndef __SAMPLEEDITOR_H__ #define __SAMPLEEDITOR_H__ #include "EditorBase.h" #include "Undo.h" #include "Singleton.h" struct TXMSample; class FilterParameters; class SampleEditor : public EditorBase { public: // clipboard class ClipBoard : public PPSingleton { private: mp_ubyte numBits; mp_sbyte* buffer; pp_int32 selectionStart; pp_int32 selectionEnd; pp_int32 selectionWidth; ClipBoard(); public: ~ClipBoard(); void makeCopy(TXMSample& sample, XModule& module, pp_int32 selectionStart, pp_int32 selectionEnd, bool cut = false); void paste(TXMSample& sample, XModule& module, pp_int32 pos); bool isEmpty() const { return buffer == NULL; } pp_int32 getWidth() const { return selectionWidth; } mp_sbyte getSampleByte(pp_int32 i) const { if (buffer == NULL || i > selectionWidth) return 0; if (numBits == 16) return *((mp_sword*)buffer + i) >> 8; else if (numBits == 8) return *(buffer + i); else ASSERT(false); return 0; } mp_sword getSampleWord(pp_int32 i) const { if (buffer == NULL || i > selectionWidth) return 0; if (numBits == 16) return *((mp_sword*)buffer + i); else if (numBits == 8) return *(buffer + i) << 8; else ASSERT(false); return 0; } friend class PPSingleton; }; // operations enum Operations { OperationRegular, OperationNew, OperationCut }; private: TXMSample* sample; TXMSample lastSample; // Current selection pp_int32 selectionStart, selectionEnd; // undo/redo information bool undoStackEnabled; bool undoStackActivated; UndoStackEntry::UserData undoUserData; SampleUndoStackEntry* before; PPUndoStack* undoStack; UndoHistory* undoHistory; bool lastOperationDidChangeSize; Operations lastOperation; bool drawing; pp_int32 lastSamplePos; void prepareUndo(); void finishUndo(); bool revoke(const SampleUndoStackEntry* stackEntry); void notifyChanges(bool condition, bool lazy = true); public: SampleEditor(); virtual ~SampleEditor(); // query status bool getLastOperationDidChangeSize() const { return lastOperationDidChangeSize; } Operations getLastOperation() const { return lastOperation; } void attachSample(TXMSample* sample, XModule* module); void reset(); TXMSample* getSample() { return sample; } pp_int32 getSampleLen() const { return sample ? sample->samplen : 0; } bool isValidSample() const { return sample != NULL; } bool isEmptySample() const; bool canMinimize() const; bool isEditableSample() const; void setSelectionStart(pp_int32 selectionStart) { this->selectionStart = selectionStart; } pp_int32& getSelectionStart() { return selectionStart; } void setSelectionEnd(pp_int32 selectionEnd) { this->selectionEnd = selectionEnd; } pp_int32& getSelectionEnd() { return selectionEnd; } pp_int32 getLogicalSelectionStart() const { if (selectionStart < 0 && selectionEnd < 0) return -1; pp_int32 selStart = selectionStart < selectionEnd ? selectionStart : selectionEnd; if (selStart < 0) selStart = 0; if (selStart > getSampleLen()) selStart = getSampleLen(); return selStart; } pp_int32 getLogicalSelectionEnd() const { if (selectionStart < 0 && selectionEnd < 0) return -1; pp_int32 selEnd = selectionEnd < selectionStart ? selectionStart : selectionEnd; if (selEnd < 0) selEnd = 0; if (selEnd > getSampleLen()) selEnd = getSampleLen(); return selEnd; } void resetSelection() { selectionStart = selectionEnd = -1; } pp_int32 getSelectionLength() const { return abs(selectionEnd - selectionStart); } bool hasValidSelection() const { return ((selectionStart >= 0 && selectionEnd >= 0) && (selectionStart != selectionEnd)); } void selectAll(); bool validate(); // --- Multilevel UNDO / REDO -------------------------------------------- void enableUndoStack(bool enable); bool isUndoStackEnabled() const { return undoStackEnabled; } void activateUndoStack(bool activate) { undoStackActivated = activate; } bool isUndoStackActivated() const { return undoStackActivated; } bool canUndo() const { if (undoStack && undoStackEnabled) return !undoStack->IsEmpty(); else return false; } bool canRedo() const { if (undoStack && undoStackEnabled) return !undoStack->IsTop(); else return false; } // undo last changes bool undo(); // redo last changes bool redo(); void setUndoUserData(const void* data, pp_uint32 dataLen) { this->undoUserData = UndoStackEntry::UserData((pp_uint8*)data, dataLen); } pp_uint32 getUndoUserDataLen() const { return undoUserData.getDataLen(); } const void* getUndoUserData() const { return (void*)undoUserData.getData(); } // --- clipboard operations ---------------------------------------------- bool canPaste() const; bool clipBoardIsEmpty() const { return ClipBoard::getInstance()->isEmpty(); } // work on sample attributes (not on the waveform, only on looping and flags) pp_uint32 getRepeatStart() const; pp_uint32 getRepeatEnd() const; pp_uint32 getRepeatLength() const; void setRepeatStart(pp_uint32 start); void setRepeatEnd(pp_uint32 end); void setRepeatLength(pp_uint32 length); bool increaseRepeatStart(); bool decreaseRepeatStart(); bool increaseRepeatLength(); bool decreaseRepeatLength(); bool setLoopType(pp_uint8 type); pp_uint8 getLoopType() const; bool is16Bit() const; pp_int32 getRelNoteNum() const; void increaseRelNoteNum(pp_int32 offset); pp_int32 getFinetune() const; void setFinetune(pp_int32 finetune); void setFT2Volume(pp_int32 vol); pp_int32 getFT2Volume() const; void setPanning(pp_int32 pan); pp_int32 getPanning() const; bool isEmpty() const { if (sample && !sample->sample) return true; else return false; } void startDrawing(); bool isDrawing() const { return drawing; } void drawSample(pp_int32 sampleIndex, float s); void endDrawing(); // --- operations -------------------------------------------------------- // this is just for convenience, it delegates to the appropriate tool code void minimizeSample(); void cropSample(); void clearSample(); void mixPasteSample(); void convertSampleResolution(bool convert); // remember to stop playing before using this void cut(); void copy(); void paste(); class WorkSample { private: XModule& module; pp_uint32 size; pp_uint32 numBits; pp_uint32 sampleRate; mp_ubyte* buffer; WorkSample(XModule& module, pp_uint32 size, pp_uint8 numBits, pp_uint32 sampleRate) : module(module), size(size), numBits(numBits), sampleRate(sampleRate) { pp_uint32 dataSize = (size * (pp_uint32)numBits) / 8; buffer = module.allocSampleMem(dataSize); } public: ~WorkSample() { if (buffer) module.freeSampleMem(buffer); } void* getBuffer() { return buffer; } pp_uint32 getSize() const { return size; } pp_uint8 getNumBits() const { return numBits; } pp_uint32 getSampleRate() const { return sampleRate; } friend class SampleEditor; }; WorkSample* createWorkSample(pp_uint32 size, pp_uint8 numBits, pp_uint32 sampleRate); void pasteOther(WorkSample& src); private: // -- sample tool stuff bool cutSampleInternal(); float getFloatSampleFromWaveform(pp_int32 index, void* source = NULL, pp_int32 size = 0); void setFloatSampleInWaveform(pp_int32 index, float singleSample, void* source = NULL); typedef void (SampleEditor::*TFilterFunc)(const FilterParameters* par); FilterParameters* lastParameters; TFilterFunc lastFilterFunc; void preFilter(TFilterFunc filterFuncPtr, const FilterParameters* par); void postFilter(); public: void tool_newSample(const FilterParameters* par); void tool_minimizeSample(const FilterParameters* par); void tool_cropSample(const FilterParameters* par); void tool_clearSample(const FilterParameters* par); void tool_mixPasteSample(const FilterParameters* par); // convert sample resolution void tool_convertSampleResolution(const FilterParameters* par); // filters void tool_scaleSample(const FilterParameters* par); void tool_normalizeSample(const FilterParameters* par); void tool_reverseSample(const FilterParameters* par); void tool_PTboostSample(const FilterParameters* par); bool isValidxFadeSelection(); void tool_xFadeSample(const FilterParameters* par); void tool_changeSignSample(const FilterParameters* par); void tool_swapByteOrderSample(const FilterParameters* par); void tool_resampleSample(const FilterParameters* par); void tool_DCNormalizeSample(const FilterParameters* par); void tool_DCOffsetSample(const FilterParameters* par); void tool_rectangularSmoothSample(const FilterParameters* par); void tool_triangularSmoothSample(const FilterParameters* par); void tool_eqSample(const FilterParameters* par); // generators void tool_generateSilence(const FilterParameters* par); void tool_generateNoise(const FilterParameters* par); void tool_generateSine(const FilterParameters* par); void tool_generateSquare(const FilterParameters* par); void tool_generateTriangle(const FilterParameters* par); void tool_generateSawtooth(const FilterParameters* par); void tool_applyLastFilter(); bool tool_canApplyLastFilter() const; pp_uint32 convertSmpPosToMillis(pp_uint32 pos, pp_int32 relativeNote = 0); }; #endif milkytracker-0.90.85+dfsg/src/tracker/DialogListBox.h0000755000175000017500000000233311150223367021526 0ustar admin2admin2/* * tracker/DialogListBox.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogListBox.h * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #ifndef __DIALOGLISTBOX_H__ #define __DIALOGLISTBOX_H__ #include "DialogBase.h" class DialogListBox : public PPDialogBase { private: class PPListBox* listBox; public: DialogListBox(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, bool okCancel = false); PPListBox* getListBox() { return listBox; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/ScopesControl.h0000644000175000017500000000741611150223367021623 0ustar admin2admin2/* * tracker/ScopesControl.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ScopesControl.h * MilkyTracker * * Created by Peter Barth on 28.10.05. * */ #ifndef SCOPESCONTROL__H #define SCOPESCONTROL__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" #include "TrackerConfig.h" // Forwards class PPButton; class PPGraphicsAbstract; class PPFont; class PPControl; class PlayerController; class ScopesControl : public PPControl { public: enum ClickTypes { ClickTypeMute, ClickTypeSolo, ClickTypeRec, ClickTypeSingleRec }; enum AppearanceTypes { AppearanceTypeNormal, AppearanceTypeSolid, AppearanceTypeLines }; private: PPColor color; bool border; PPColor ourOwnBorderColor; const PPColor* borderColor; PPButton* backgroundButton; // extent pp_int32 visibleWidth; pp_int32 visibleHeight; PlayerController* playerController; pp_int32 numChannels; pp_int32 channelWidthTable[TrackerConfig::MAXCHANNELS]; bool onOffState[TrackerConfig::MAXCHANNELS]; bool zeroVolumeState[TrackerConfig::MAXCHANNELS]; pp_uint8 muteChannels[TrackerConfig::MAXCHANNELS]; pp_uint8 lastMuteChannels[TrackerConfig::MAXCHANNELS]; pp_uint8 recChannels[TrackerConfig::MAXCHANNELS]; pp_uint8 lastRecChannels[TrackerConfig::MAXCHANNELS]; pp_int32 lastNumChannels; PPFont* font; PPFont* smallFont; pp_int32 lMouseDownInChannel, rMouseDownInChannel; bool didSoloChannel; bool enabled; AppearanceTypes appearance; ClickTypes currentClickType; public: enum ChangeValueTypes { ChangeValueMuting, ChangeValueRecording }; ScopesControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true); virtual ~ScopesControl(); void setColor(pp_int32 r,pp_int32 g,pp_int32 b) { color.r = r; color.g = g; color.b = b; } void setColor(PPColor color) { this->color = color; } void setBorderColor(const PPColor& color) { this->borderColor = &color; } // from PPControl virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); void attachSource(PlayerController* playerController); void setNumChannels(pp_int32 numChannels) { this->numChannels = numChannels; } bool needsUpdate(); void enable(bool b) { enabled = b; } void muteChannel(pp_int32 index, bool b) { muteChannels[index] = (b ? 1 : 0); } void recordChannel(pp_int32 index, bool b) { recChannels[index] = (b ? 1 : 0); } bool isSoloChannel(pp_int32 c) const; bool isSingleRecChannel(pp_int32 c) const; void handleMute(pp_int32 channel); void handleSolo(pp_int32 channel); void handleRec(pp_int32 channel); void handleSingleRec(pp_int32 channel); void handleUnmuteAll(); void setCurrentClickType(ClickTypes type) { currentClickType = type; } ClickTypes getCurrentClickType() const { return currentClickType; } void setAppearance(AppearanceTypes appearance) { this->appearance = appearance; } AppearanceTypes getAppearance() const { return appearance; } private: pp_int32 pointToChannel(const PPPoint& pt); pp_int32 WRAPCHANNELS(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/EnvelopeEditorControl.cpp0000644000175000017500000006425111150223367023646 0ustar admin2admin2/* * tracker/EnvelopeEditorControl.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "EnvelopeEditorControl.h" #include "EnvelopeEditor.h" #include "Screen.h" #include "GraphicsAbstract.h" #include "Font.h" #include "ScrollBar.h" #include "ContextMenu.h" #include "XModule.h" #include "TrackerConfig.h" #include "DialogWithValues.h" #include "Tools.h" #include "FilterParameters.h" #define SCROLLBARWIDTH SCROLLBUTTONSIZE #define YMAX 256 #define XMAX 96 #ifdef __LOWRES__ #define POINTCATCHBOUNDS 7 #else #define POINTCATCHBOUNDS 5 #endif EnvelopeEditorControl::EnvelopeEditorControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border/*= true*/) : PPControl(id, parentScreen, eventListener, location, size), borderColor(&ourOwnBorderColor), envelopeEditor(NULL), envelope(NULL), showMarks(NULL) { this->border = border; ourOwnBorderColor.set(192, 192, 192); // default color backgroundColor.set(0, 0, 0); hScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y + size.height - SCROLLBARWIDTH - 1), size.width - 1, true); xMax = XMAX; yMax = YMAX; currentPosition.x = currentPosition.y = -1; xScale = 256; showVCenter = false; startPos = 0; visibleWidth = size.width - 5; visibleHeight = size.height - SCROLLBARWIDTH - 5; adjustScrollbars(); caughtControl = NULL; controlCaughtByLMouseButton = controlCaughtByRMouseButton = false; showMarks = new ShowMark[TrackerConfig::maximumPlayerChannels]; clearShowMarks(); // build submenu subMenuAdvanced = new PPContextMenu(5, parentScreen, this, PPPoint(0,0), TrackerConfig::colorThemeMain); subMenuAdvanced->setSubMenu(true); subMenuAdvanced->addEntry("Scale X", MenuCommandIDXScale); subMenuAdvanced->addEntry("Scale Y", MenuCommandIDYScale); // Context PPMenu editMenuControl = new PPContextMenu(4, parentScreen, this, PPPoint(0,0), TrackerConfig::colorThemeMain, true); editMenuControl->addEntry("Undo", MenuCommandIDUndo); editMenuControl->addEntry("Redo", MenuCommandIDRedo); editMenuControl->addEntry("\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4", -1); editMenuControl->addEntry("Copy", MenuCommandIDCopy); editMenuControl->addEntry("Paste", MenuCommandIDPaste); editMenuControl->addEntry("\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4", -1); editMenuControl->addEntry("Advanced \x10", 0xFFFF, subMenuAdvanced); // Create tool handler responder toolHandlerResponder = new ToolHandlerResponder(*this); dialog = NULL; resetLastValues(); } EnvelopeEditorControl::~EnvelopeEditorControl() { if (envelopeEditor) envelopeEditor->removeNotificationListener(this); delete toolHandlerResponder; delete dialog; delete hScrollbar; delete editMenuControl; delete subMenuAdvanced; delete[] showMarks; } float EnvelopeEditorControl::calcXScale() { return 1.0f / ((float)(xMax*xScale/256) / (float)visibleWidth); } float EnvelopeEditorControl::calcYScale() { return 1.0f / ((float)yMax / (float)visibleHeight); } void EnvelopeEditorControl::updateCurrentPosition(const PPPoint& cp) { currentPosition.x = (pp_int32)((cp.x + startPos)*(1.0f / calcXScale())); currentPosition.y = (((pp_int32)((visibleHeight-cp.y)*(1.0f / calcYScale()))) * /*16645*/65536) >> 16; if (currentPosition.x < 0) currentPosition.x = 0; if (currentPosition.x > 65535) currentPosition.x = 65535; if (currentPosition.y < 0) currentPosition.y = 0; if (currentPosition.y > 256) currentPosition.y = 256; } void EnvelopeEditorControl::setScale(pp_int32 scale) { if (scale < 16 || scale > 1024) return; xScale = scale; adjustScrollbars(); } void EnvelopeEditorControl::paintGrid(PPGraphicsAbstract* g, pp_int32 xOffset, pp_int32 yOffset) { pp_int32 i; PPColor lineColor = TrackerConfig::colorThemeMain; lineColor.r>>=1; lineColor.g>>=1; lineColor.b>>=1; // Draw grid lines first float scaley = calcYScale(); float scalex = calcXScale(); // horizontal g->setColor(lineColor); /*for (i = 0; i <= yMax; i++) { if (!(i & 15)) { pp_int32 y1 = (pp_int32)(i*scaley); y1 = location.y + yOffset + visibleHeight - y1; if (!(i&31)) { g->setColor(lineColor); g->drawHLine(location.x + xOffset+1, location.x + xOffset + visibleWidth,y1); } } }*/ float sy = 0; while (sy < visibleHeight+(pp_int32)(31.0f*scaley)) { pp_int32 y1 = (pp_int32)sy; pp_int32 y = location.y + yOffset + visibleHeight - y1; g->drawHLine(location.x + xOffset+1, location.x + xOffset + visibleWidth,y); sy+=32.0f*scaley; } // vertical float sx = -(float)startPos; if (sx < 0) { pp_int32 ink = (pp_int32)((-sx)/(16.0f*scalex)) - 1; sx += ink*(16.0f*scalex); } while (sx < visibleWidth) { pp_int32 x1 = (pp_int32)sx; pp_int32 x = x1 + location.x + xOffset; g->drawVLine(location.y+3, location.y + yOffset + visibleHeight,x); sx+=16.0f*scalex; } g->setColor(255, 255, 255); sx = -(float)startPos; if (sx < 0) { pp_int32 ink = (pp_int32)((-sx)/(16.0f*scalex)) - 1; sx += ink*(16.0f*scalex); } i = 0; while (sx < visibleWidth) { pp_int32 x1 = (pp_int32)sx; pp_int32 x = x1 + location.x + xOffset; g->setPixel(x, location.y + yOffset + visibleHeight); if (!(i&1)) g->setPixel(x, location.y + yOffset + visibleHeight+1); sx+=2.0f*scalex; i++; } } void EnvelopeEditorControl::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; pp_int32 xOffset = 2; pp_int32 yOffset = 2; g->setRect(location.x, location.y, location.x + size.width, location.y + size.height); g->setColor(backgroundColor); g->fill(); if (border) { drawBorder(g, *borderColor); } g->setRect(location.x+1, location.y+1, location.x+1 + size.width-2, location.y+1 + size.height-2); g->setColor(255, 255, 255); if (envelope == NULL) { PPFont* font = PPFont::getFont(PPFont::FONT_SYSTEM); g->setFont(font); PPString s("None selected"); g->drawString(s, location.x + size.width / 2 - font->getStrWidth(s) / 2, location.y + size.height / 2 - font->getCharHeight() / 2); return; } float scaley = calcYScale(); float scalex = calcXScale(); pp_int32 i; paintGrid(g, xOffset, yOffset); g->setColor(255, 255, 255); // vertical for (i = 0; i <= yMax; i++) { if (!(i & 15)) { pp_int32 y1 = (pp_int32)(i*scaley); y1 = location.y + yOffset + visibleHeight - y1; g->setPixel(location.x + xOffset, y1); if (!(i&31)) { g->setPixel(location.x + xOffset-1, y1); } } } /*// horizontal for (i = 0; i <= visibleWidth; i++) { pp_int32 i2 = i + startPos; pp_int32 x1 = i; pp_int32 x = x1 + location.x + xOffset; pp_int32 y1 = location.y + yOffset + visibleHeight - (pp_int32)(128*scaley); if (!(i2 & 3)) { g->setPixel(x, location.y + yOffset + visibleHeight); if (!(i2&31)) { g->setPixel(x, location.y + yOffset + visibleHeight + 1); } } }*/ // centered line for (i = 0; i <= visibleWidth; i++) { pp_int32 x1 = i; pp_int32 x = x1 + location.x + xOffset; pp_int32 y1 = location.y + yOffset + visibleHeight - (pp_int32)(128*scaley); if (showVCenter) { if (!(i&7)) g->setColor(128, 128, 128); else g->setColor(64, 64, 64); g->setPixel(x, y1); } } g->setColor(255, 255, 128); if (!envelope->num) { PPFont* font = PPFont::getFont(PPFont::FONT_SYSTEM); g->setFont(font); PPString s("No envelope"); g->drawString(s, location.x + size.width / 2 - font->getStrWidth(s) / 2, location.y + size.height / 2 - font->getCharHeight()); } for (i = 0; i < envelope->num - 1; i++) { pp_int32 x1 = (pp_int32)(envelope->env[i][0]*scalex); pp_int32 y1 = (pp_int32)(envelope->env[i][1]*scaley); pp_int32 x2 = (pp_int32)(envelope->env[i+1][0]*scalex); pp_int32 y2 = (pp_int32)(envelope->env[i+1][1]*scaley); x1+=location.x + xOffset - startPos; x2+=location.x + xOffset - startPos; y1 = location.y + yOffset + visibleHeight - y1; y2 = location.y + yOffset + visibleHeight - y2; g->drawAntialiasedLine(x1,y1,x2,y2); //g->drawLine(x1,y1,x2,y2); //g->setPixel(location.x + xOffset + x, location.y + yOffset + size.height - 4 - y); } // Showmarks g->setColor(255, 0, 255); for (pp_int32 sm = 0; sm < TrackerConfig::maximumPlayerChannels; sm++) { pp_int32 showMark = showMarks[sm].pos; if (!showMarks[sm].intensity || showMark == -1) continue; pp_int32 x = (pp_int32)(showMark*scalex) - startPos; g->drawVLine(location.y + yOffset, location.y + yOffset + visibleHeight + 2, location.x + xOffset + x); } for (i = 0; i < envelope->num; i++) { pp_int32 x1 = (pp_int32)(envelope->env[i][0]*scalex); pp_int32 y1 = (pp_int32)(envelope->env[i][1]*scaley); x1+=location.x + xOffset - startPos; y1 = location.y + yOffset + visibleHeight - y1; if ((envelope->type & 4) && (i == envelope->loops || i == envelope->loope)) { g->setColor(TrackerConfig::colorHighLight_1); for (pp_int32 j = 0; j < visibleHeight; j+=2) g->setPixel(x1, j + location.y + yOffset); if (i == envelope->loops) { g->setPixel(x1, location.y + yOffset); g->setPixel(x1, location.y + yOffset + 1); g->setPixel(x1+1, location.y + yOffset + 1); g->setPixel(x1-1, location.y + yOffset + 1); g->setPixel(x1, location.y + yOffset + 2); g->setPixel(x1+1, location.y + yOffset + 2); g->setPixel(x1-1, location.y + yOffset + 2); g->setPixel(x1+2, location.y + yOffset + 2); g->setPixel(x1-2, location.y + yOffset + 2); } if (i == envelope->loope) { g->setPixel(x1, location.y + visibleHeight + yOffset); g->setPixel(x1, location.y + visibleHeight + yOffset - 1); g->setPixel(x1+1, location.y + visibleHeight + yOffset - 1); g->setPixel(x1-1, location.y + visibleHeight + yOffset - 1); g->setPixel(x1, location.y + visibleHeight + yOffset - 2); g->setPixel(x1+1, location.y + visibleHeight + yOffset - 2); g->setPixel(x1-1, location.y + visibleHeight + yOffset - 2); g->setPixel(x1+2, location.y + visibleHeight + yOffset - 2); g->setPixel(x1-2, location.y + visibleHeight + yOffset - 2); } } if ((envelope->type & 2) && (i == envelope->sustain)) { g->setColor(255, 255, 255); for (pp_int32 j = 0; j < visibleHeight; j+=2) g->setPixel(x1, j + location.y + yOffset + 1); } /*pp_int32 extent = 1; if (i == selectionIndex) { g->setColor(255, 0, 0); extent = 2; } else*/ if (i != envelopeEditor->getSelectionIndex()) { const pp_int32 extent = 1; g->setColor(255, 255, 255); for (pp_int32 y = -extent; y <= extent; y++) for (pp_int32 x = -extent; x <= extent; x++) g->setPixel(x1+x, y1+y); } } // draw selected point always above the other points if (envelopeEditor->getSelectionIndex() != -1) { i = envelopeEditor->getSelectionIndex(); pp_int32 x1 = (pp_int32)(envelope->env[i][0]*scalex); pp_int32 y1 = (pp_int32)(envelope->env[i][1]*scaley); x1+=location.x + xOffset - startPos; y1 = location.y + yOffset + visibleHeight - y1; const pp_int32 extent = 2; g->setColor(255, 0, 0); for (pp_int32 y = -extent; y <= extent; y++) for (pp_int32 x = -extent; x <= extent; x++) g->setPixel(x1+x, y1+y); } if (currentPosition.x >= 0 && currentPosition.y >= 0) { PPFont* font = PPFont::getFont(PPFont::FONT_TINY); g->setFont(font); // loop markers above range text char buffer[32]; PPTools::convertToHex(buffer, (unsigned)currentPosition.x, 4); g->setColor(0, 0, 0); g->drawString(buffer, location.x + 3 + visibleWidth - font->getStrWidth(buffer), location.y + 4); g->setColor(255, 0, 255); g->drawString(buffer, location.x + 2 + visibleWidth - font->getStrWidth(buffer), location.y + 3); PPTools::convertToHex(buffer, (unsigned)currentPosition.y, 2); g->setColor(0, 0, 0); g->drawString(buffer, location.x + 3 + visibleWidth - font->getStrWidth(buffer), location.y + 4 + font->getCharHeight()+2); g->setColor(0, 255, 0); g->drawString(buffer, location.x + 2 + visibleWidth - font->getStrWidth(buffer), location.y + 3 + font->getCharHeight()+2); } hScrollbar->paint(g); } pp_int32 EnvelopeEditorControl::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; switch (event->getID()) { case eRMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (!hScrollbar->hit(*p)) invokeContextMenu(*p); else { if (controlCaughtByLMouseButton) break; controlCaughtByRMouseButton = true; caughtControl = hScrollbar; caughtControl->dispatchEvent(event); } break; } case eLMouseDown: { hasDragged = false; selectionTicker = 0; PPPoint* p = (PPPoint*)event->getDataPtr(); // Clicked on horizontal scrollbar -> route event to scrollbar and catch scrollbar control if (hScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; controlCaughtByLMouseButton = true; caughtControl = hScrollbar; caughtControl->dispatchEvent(event); } // Clicked in client area else { PPPoint cp = *p; translateCoordinates(cp); if (cp.x > visibleWidth) break; if (cp.y > visibleHeight) break; pp_int32 rx = (pp_int32)(cp.x + startPos); pp_int32 ry = (pp_int32)((visibleHeight - cp.y)); pp_int32 i = selectEnvelopePoint(rx, ry); if (i != -1) { envelopeEditor->startSelectionDragging(i); } else { updateCurrentPosition(cp); } parentScreen->paintControl(this); } break; } case eMouseLeft: { currentPosition.x = currentPosition.y = -1; parentScreen->paintControl(this); break; } case eMouseMoved: { PPPoint* p = (PPPoint*)event->getDataPtr(); PPPoint cp = *p; translateCoordinates(cp); if (cp.y < 0 || cp.x > visibleWidth || cp.y < 0 || cp.y > visibleHeight) break; updateCurrentPosition(cp); parentScreen->paintControl(this); break; } case eRMouseUp: { controlCaughtByRMouseButton = false; if (caughtControl && !controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; break; } break; } case eLMouseUp: if (envelopeEditor->isSelectionDragging()) envelopeEditor->endSelectionDragging(); controlCaughtByLMouseButton = false; if (caughtControl == NULL) break; if (!controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; } break; case eLMouseDrag: { if (caughtControl && controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } hasDragged = true; if (!envelopeEditor->isSelectionDragging()) break; PPPoint* p = (PPPoint*)event->getDataPtr(); PPPoint cp = *p; translateCoordinates(cp); setEnvelopePoint(envelopeEditor->getSelectionIndex(), cp.x + startPos, visibleHeight - cp.y); updateCurrentPosition(cp); adjustScrollbars(); parentScreen->paintControl(this); break; } case eLMouseRepeat: { if (caughtControl && controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } // for slowing down mouse pressed events selectionTicker++; // no selection has been made or mouse hasn't been dragged if (!envelopeEditor->isSelectionDragging() || !hasDragged) { // mouse hasn't been dragged and selection ticker has reached threshold value if (!hasDragged && selectionTicker > 0) { PPPoint* p = (PPPoint*)event->getDataPtr(); if (!hScrollbar->hit(*p)) invokeContextMenu(*p); } } break; } case eRMouseDrag: { if (caughtControl && controlCaughtByRMouseButton) caughtControl->dispatchEvent(event); break; } case eRMouseRepeat: { if (caughtControl && controlCaughtByRMouseButton) caughtControl->dispatchEvent(event); break; } // mouse wheel case eMouseWheelMoved: { TMouseWheelEventParams* params = (TMouseWheelEventParams*)event->getDataPtr(); if (params->delta > 0) { setScale(xScale << 1); parentScreen->paintControl(this); } else if (params->delta < 0) { setScale(xScale >> 1); parentScreen->paintControl(this); } event->cancel(); break; } default: if (caughtControl == NULL) break; caughtControl->dispatchEvent(event); break; } return 0; } pp_int32 EnvelopeEditorControl::handleEvent(PPObject* sender, PPEvent* event) { // Horizontal scrollbar, scroll up (=left) if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarScrollUp) { if (startPos) startPos--; pp_int32 visibleItems = visibleWidth; float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, scroll down (=right) else if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarScrollDown) { pp_int32 visibleItems = visibleWidth; if (startPos + visibleItems < (signed)getMaxWidth()) startPos++; float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, position changed else if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarPosChanged) { float pos = hScrollbar->getBarPosition()/65536.0f; pp_int32 visibleItems = visibleWidth; float v = (float)(getMaxWidth() - visibleItems); if (v < 0.0f) v = 0.0f; startPos = (pp_uint32)(v*pos); } else if ((sender == reinterpret_cast(editMenuControl) || sender == reinterpret_cast(subMenuAdvanced)) && event->getID() == eCommand) { executeMenuCommand(*((pp_int32*)event->getDataPtr())); return 0; } parentScreen->paintControl(this); return 0; } void EnvelopeEditorControl::setSize(const PPSize& size) { PPControl::setSize(size); hScrollbar->setSize(size.width - 1); } void EnvelopeEditorControl::setLocation(const PPPoint& location) { PPControl::setLocation(location); hScrollbar->setLocation(PPPoint(location.x, location.y + size.height - SCROLLBARWIDTH - 1)); } void EnvelopeEditorControl::attachEnvelopeEditor(EnvelopeEditor* envelopeEditor) { if (this->envelopeEditor) this->envelopeEditor->removeNotificationListener(this); this->envelopeEditor = envelopeEditor; envelopeEditor->addNotificationListener(this); adjustScrollbars(); } pp_int32 EnvelopeEditorControl::getMaxWidth() { if (envelopeEditor == NULL) return visibleWidth; pp_int32 max = envelopeEditor->getHorizontalExtent(); if (max < 0) return visibleWidth; float scalex = calcXScale(); return (pp_int32)(scalex * max); } void EnvelopeEditorControl::adjustScrollbars() { float s = (float)visibleWidth / (float)getMaxWidth(); float olds = hScrollbar->getBarSize() / 65536.0f; hScrollbar->setBarSize((pp_int32)(s*65536.0f), false); s = hScrollbar->getBarSize() / 65536.0f; float scale = s / olds; float pos = hScrollbar->getBarPosition()/65536.0f; hScrollbar->setBarPosition((pp_int32)(pos*scale*65536.0f)); pos = hScrollbar->getBarPosition()/65536.0f; pp_int32 visibleItems = visibleWidth; float v = (float)(getMaxWidth() - visibleItems); startPos = (pp_uint32)(v*pos); if (startPos < 0) startPos = 0; } pp_int32 EnvelopeEditorControl::selectEnvelopePoint(pp_int32 x, pp_int32 y) { if (envelopeEditor == NULL || envelope == NULL) return -1; if (envelope->num == 0) return -1; float scaley = calcYScale(); float scalex = calcXScale(); if (envelopeEditor->getSelectionIndex() >= 0 && envelopeEditor->getSelectionIndex() < envelope->num) { pp_int32 i = envelopeEditor->getSelectionIndex(); pp_int32 ex = (pp_int32)(envelope->env[i][0]*scalex); pp_int32 ey = (pp_int32)(envelope->env[i][1]*scaley); if ((x - POINTCATCHBOUNDS <= ex) && (x + POINTCATCHBOUNDS >= ex) && (y - POINTCATCHBOUNDS <= ey) && (y + POINTCATCHBOUNDS >= ey)) { return i; } } for (pp_int32 i = 0; i < envelope->num; i++) { pp_int32 ex = (pp_int32)(envelope->env[i][0]*scalex); pp_int32 ey = (pp_int32)(envelope->env[i][1]*scaley); if ((x - POINTCATCHBOUNDS <= ex) && (x + POINTCATCHBOUNDS >= ex) && (y - POINTCATCHBOUNDS <= ey) && (y + POINTCATCHBOUNDS >= ey)) { return i; } } return -1; } void EnvelopeEditorControl::setEnvelopePoint(pp_int32 index, pp_int32 x, pp_int32 y) { // inverse transformation float scaley = 1.0f / calcYScale(); float scalex = 1.0f / calcXScale(); pp_int32 ex = (pp_int32)(x*scalex); pp_int32 ey = (pp_int32)(y*scaley); envelopeEditor->setEnvelopePoint(index, ex, ey); } void EnvelopeEditorControl::reset() { envelopeEditor->reset(); clearShowMarks(); } void EnvelopeEditorControl::validate() { if (envelope) { if (envelopeEditor->getSelectionIndex() >= envelope->num) envelopeEditor->setSelectionIndex(envelope->num-1); } } void EnvelopeEditorControl::clearShowMarks() { for (pp_int32 i = 0; i < TrackerConfig::maximumPlayerChannels; i++) { showMarks[i].pos = -1; showMarks[i].intensity = 0; showMarks[i].panning = 128; } } bool EnvelopeEditorControl::hasShowMarks() { for (pp_int32 i = 0; i < TrackerConfig::maximumPlayerChannels; i++) { if (showMarks[i].pos != -1) return true; } return false; } void EnvelopeEditorControl::invokeContextMenu(PPPoint p) { PPPoint cp = p; translateCoordinates(cp); if (cp.x > visibleWidth || cp.y > visibleHeight) return; editMenuControl->setLocation(p); editMenuControl->setState(MenuCommandIDUndo, !envelopeEditor->canUndo()); editMenuControl->setState(MenuCommandIDRedo, !envelopeEditor->canRedo()); editMenuControl->setState(MenuCommandIDPaste, !envelopeEditor->canPaste()); editMenuControl->setState(MenuCommandIDCopy, !envelopeEditor->canCopy()); subMenuAdvanced->setState(MenuCommandIDXScale, envelopeEditor->isEmptyEnvelope()); subMenuAdvanced->setState(MenuCommandIDYScale, envelopeEditor->isEmptyEnvelope()); parentScreen->setContextMenuControl(editMenuControl); } void EnvelopeEditorControl::executeMenuCommand(pp_int32 commandId) { switch (commandId) { // copy case MenuCommandIDCopy: { envelopeEditor->makeCopy(); notifyUpdate(); break; } // paste case MenuCommandIDPaste: envelopeEditor->pasteCopy(); break; case MenuCommandIDUndo: envelopeEditor->undo(); break; case MenuCommandIDRedo: envelopeEditor->redo(); break; case MenuCommandIDXScale: invokeToolParameterDialog(EnvelopeToolTypeScaleX); break; case MenuCommandIDYScale: invokeToolParameterDialog(EnvelopeToolTypeScaleY); break; } } // ----- some tools for modifying envelopes ---------------------------------- bool EnvelopeEditorControl::invokeToolParameterDialog(EnvelopeEditorControl::EnvelopeToolTypes type) { if (dialog) { delete dialog; dialog = NULL; } toolHandlerResponder->setEnvelopeToolType(type); switch (type) { case EnvelopeToolTypeScaleX: dialog = new DialogWithValues(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "Scale envelope along x-axis", DialogWithValues::ValueStyleEnterOneValue); static_cast(dialog)->setValueOneCaption("Enter scale in percent:"); static_cast(dialog)->setValueOneRange(0, 10000.0f, 2); static_cast(dialog)->setValueOne(lastValues.scaleEnvelope != -1.0f ? lastValues.scaleEnvelope : 100.0f); break; case EnvelopeToolTypeScaleY: dialog = new DialogWithValues(parentScreen, toolHandlerResponder, PP_DEFAULT_ID, "Scale envelope along y-axis", DialogWithValues::ValueStyleEnterOneValue); static_cast(dialog)->setValueOneCaption("Enter scale in percent:"); static_cast(dialog)->setValueOneRange(0, 10000.0f, 2); static_cast(dialog)->setValueOne(lastValues.scaleEnvelope != -1.0f ? lastValues.scaleEnvelope : 100.0f); break; } dialog->show(); return true; } bool EnvelopeEditorControl::invokeTool(EnvelopeToolTypes type) { if (envelope == NULL) return false; bool res = false; switch (type) { case EnvelopeToolTypeScaleX: { lastValues.scaleEnvelope = static_cast(dialog)->getValueOne(); FilterParameters par(1); par.setParameter(0, FilterParameters::Parameter(lastValues.scaleEnvelope / 100.0f)); envelopeEditor->tool_xScaleEnvelope(&par); break; } case EnvelopeToolTypeScaleY: { lastValues.scaleEnvelope = static_cast(dialog)->getValueOne(); FilterParameters par(1); par.setParameter(0, FilterParameters::Parameter(lastValues.scaleEnvelope / 100.0f)); envelopeEditor->tool_yScaleEnvelope(&par); break; } } return res; } void EnvelopeEditorControl::editorNotification(EditorBase* sender, EditorBase::EditorNotifications notification) { switch (notification) { case EnvelopeEditor::EditorDestruction: { envelopeEditor = NULL; break; } case EnvelopeEditor::NotificationReload: { startPos = 0; clearShowMarks(); this->envelope = envelopeEditor->getEnvelope(); adjustScrollbars(); break; } case EnvelopeEditor::NotificationChanges: { notifyUpdate(); notifyChanges(); break; } case EnvelopeEditor::NotificationUndoRedo: { adjustScrollbars(); validate(); notifyUpdate(); notifyChanges(); break; } } } EnvelopeEditorControl::ToolHandlerResponder::ToolHandlerResponder(EnvelopeEditorControl& theEnvelopeEditorControl) : envelopeEditorControl(theEnvelopeEditorControl), envelopeToolType(EnvelopeToolTypeNone) { } pp_int32 EnvelopeEditorControl::ToolHandlerResponder::ActionOkay(PPObject* sender) { envelopeEditorControl.invokeTool(envelopeToolType); return 0; } pp_int32 EnvelopeEditorControl::ToolHandlerResponder::ActionCancel(PPObject* sender) { return 0; } milkytracker-0.90.85+dfsg/src/tracker/PlayerMaster.cpp0000644000175000017500000002612211150223367021764 0ustar admin2admin2/* * tracker/PlayerMaster.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PlayerMaster.cpp * MilkyTracker * * Created by Peter Barth on 18.12.07. * */ #include "PlayerMaster.h" #include "MasterMixer.h" #include "SimpleVector.h" #include "PlayerController.h" #include "PlayerCriticalSection.h" #include "AudioDriverManager.h" #include "PlayerSTD.h" #include "ResamplerHelper.h" class MasterMixerNotificationListener : public MasterMixer::MasterMixerNotificationListener { private: class PlayerMaster& playerMaster; public: MasterMixerNotificationListener(PlayerMaster& playerMaster) : playerMaster(playerMaster) { } virtual void masterMixerNotification(MasterMixer::MasterMixerNotifications notification) { playerMaster.adjustSettings(); } }; void PlayerMaster::adjustSettings() { pp_int32 bufferSize = mixer->getBufferSize(); pp_int32 sampleRate = mixer->getSampleRate(); for (pp_int32 i = 0; i < playerControllers->size(); i++) { PlayerSTD* player = playerControllers->get(i)->player; player->setBufferSize(bufferSize); player->adjustFrequency(sampleRate); if (!player->isPlaying()) player->resumePlaying(false); } } void PlayerMaster::applySettingsToPlayerController(PlayerController& playerController, const TMixerSettings& settings) { bool wasPlaying = playerController.player->isPlaying(); PlayerSTD* player = playerController.player; if (settings.mixerVolume >= 0) { player->setMasterVolume(settings.mixerVolume); } mp_sint32 resamplerType = player->getResamplerType(); mp_sint32 oldResamplerType = resamplerType; if (settings.ramping >= 0) { // ramping flag is stored in the LSB of the resampler type if (settings.ramping != 0) resamplerType |= 1; else resamplerType &= ~1; } // remember if ramping needs to be set bool ramping = (resamplerType & 1) != 0; // now check if the resampler has changed at all if (settings.resampler >= 0) { // we have a class that translates the resampler index (which maps to a // human readable name of the resampler) back to an enum that can be // set on the ChannelMixer class ResamplerHelper resamplerHelper; resamplerType = resamplerHelper.getResamplerType(settings.resampler, ramping); } // now let's see if something has changed at all if (resamplerType != oldResamplerType) { playerController.getCriticalSection()->enter(); player->setResamplerType((ChannelMixer::ResamplerTypes)resamplerType); playerController.getCriticalSection()->leave(); } if (!player->isPlaying() && wasPlaying) player->resumePlaying(false); } const char* PlayerMaster::getPreferredAudioDriverID() { AudioDriverManager audioDriverManager; return audioDriverManager.getPreferredAudioDriver()->getDriverID(); } pp_uint32 PlayerMaster::getPreferredSampleRate() { AudioDriverManager audioDriverManager; return audioDriverManager.getPreferredAudioDriverSampleRate(); } pp_uint32 PlayerMaster::getPreferredBufferSize() { AudioDriverManager audioDriverManager; return audioDriverManager.getPreferredAudioDriverBufferSize(); } pp_int32 PlayerMaster::roundToNearestPowerOfTwo(pp_int32 v) { for (mp_uint32 i = 0; i < 32; i++) { if ((unsigned)(1 << i) >= (unsigned)v) return (1 << i); } return v; } float PlayerMaster::convertBufferSizeToMillis(pp_uint32 sampleRate, pp_uint32 bufferSize) { return ((float)(bufferSize) / (float)sampleRate) * 1000.0f; //return (1.0f / (44100.0f / (MP_BEATLENGTH*bufferSize)))*1000.0f; } PlayerMaster::PlayerMaster(pp_uint32 numDevices/* = DefaultMaxDevices*/) : listener(NULL), oldBufferSize(getPreferredBufferSize()), forcePowerOfTwoBufferSize(false), multiChannelKeyJazz(true), multiChannelRecord(true) { listener = new MasterMixerNotificationListener(*this); mixer = new MasterMixer(44100, getPreferredBufferSize(), numDevices); mixer->setMasterMixerNotificationListener(listener); mixer->setSampleShift(1); playerControllers = new PPSimpleVector(); for (pp_uint32 i = 0; i < sizeof(panning) / sizeof(pp_uint8); i++) { switch (i & 3) { case 0: panning[i] = 0; break; case 1: panning[i] = 255; break; case 2: panning[i] = 255; break; case 3: panning[i] = 0; break; } } } PlayerMaster::~PlayerMaster() { delete playerControllers; delete mixer; delete listener; } PlayerController* PlayerMaster::createPlayerController(bool fakeScopes) { if (playerControllers->size() >= DefaultMaxDevices) return NULL; PlayerController* playerController = new PlayerController(mixer, fakeScopes); applySettingsToPlayerController(*playerController, currentSettings); playerController->setMultiChannelKeyJazz(this->multiChannelKeyJazz); playerController->setMultiChannelRecord(this->multiChannelRecord); if (currentSettings.numVirtualChannels >= 0) { if (currentSettings.numVirtualChannels) { playerController->setUseVirtualChannels(true); playerController->reallocateChannels(32, currentSettings.numVirtualChannels); } else { playerController->setUseVirtualChannels(false); playerController->reallocateChannels(32, 0); } } playerControllers->add(playerController); return playerController; } bool PlayerMaster::destroyPlayerController(PlayerController* playerController) { for (pp_int32 i = 0; i < playerControllers->size(); i++) { if (playerControllers->get(i) == playerController) { playerControllers->remove(i); return true; } } return false; } pp_int32 PlayerMaster::getNumPlayerControllers() const { return playerControllers->size(); } PlayerController* PlayerMaster::getPlayerController(pp_int32 index) { if (index >= 0 && index < playerControllers->size()) return playerControllers->get(index); return NULL; } bool PlayerMaster::applyNewMixerSettings(const TMixerSettings& settings, bool allowMixerRestart) { bool res = true; bool restart = false; if (settings.audioDriverName) { if (getCurrentDriverName() == NULL || strcmp(getCurrentDriverName(), settings.audioDriverName) != 0) { currentSettings.setAudioDriverName(settings.audioDriverName); mixer->setCurrentAudioDriverByName(settings.audioDriverName); restart = true; } } if (settings.mixerShift >= 0) { currentSettings.mixerShift = settings.mixerShift; mixer->setSampleShift(settings.mixerShift); } if (settings.powerOfTwoCompensation >= 0) { currentSettings.powerOfTwoCompensation = settings.powerOfTwoCompensation; forcePowerOfTwoBufferSize = settings.powerOfTwoCompensation != 0; if (oldBufferSize) { mixer->setBufferSize(forcePowerOfTwoBufferSize ? roundToNearestPowerOfTwo(oldBufferSize) : oldBufferSize); restart = true; } } if (settings.mixFreq >= 0) { currentSettings.mixFreq = settings.mixFreq; mixer->setSampleRate(settings.mixFreq); restart = true; } // this has to take place AFTER setting the frequency if (settings.bufferSize >= 0) { currentSettings.bufferSize = settings.bufferSize; oldBufferSize = settings.bufferSize; mixer->setBufferSize(forcePowerOfTwoBufferSize ? roundToNearestPowerOfTwo(oldBufferSize) : oldBufferSize); restart = true; } if (settings.mixerVolume >= 0) currentSettings.mixerVolume = settings.mixerVolume; if (settings.ramping >= 0) currentSettings.ramping = settings.ramping; if (settings.resampler >= 0) currentSettings.resampler = settings.resampler; // take over settings like sample rate and buffer size // those are retrieved from the master mixer and set for all players // accordingly adjustSettings(); // adjust settings which are not dependent by the master mixer for (pp_int32 i = 0; i < playerControllers->size(); i++) applySettingsToPlayerController(*playerControllers->get(i), currentSettings); if (settings.numVirtualChannels >= 0) { currentSettings.numVirtualChannels = settings.numVirtualChannels; if (res) { if (settings.numVirtualChannels) { setUseVirtualChannels(true); reallocateChannels(32, settings.numVirtualChannels); } else { setUseVirtualChannels(false); reallocateChannels(32, 0); } } } if (allowMixerRestart && restart && !mixer->isPlaying()) { if (mixer->start() < 0) res = false; } return res; } const char* PlayerMaster::getFirstDriverName() const { return mixer->getAudioDriverManager()->getFirstDriverName(); } const char* PlayerMaster::getNextDriverName() const { return mixer->getAudioDriverManager()->getNextDriverName(); } const char* PlayerMaster::getCurrentDriverName() const { return mixer->getCurrentAudioDriverName(); } void PlayerMaster::reallocateChannels(mp_sint32 moduleChannels/* = 32*/, mp_sint32 virtualChannels/* = 0*/) { TrackerConfig::numPlayerChannels = moduleChannels; TrackerConfig::numVirtualChannels = virtualChannels; TrackerConfig::totalPlayerChannels = TrackerConfig::numPlayerChannels + TrackerConfig::numVirtualChannels + 2; for (pp_int32 i = 0; i < playerControllers->size(); i++) { playerControllers->get(i)->reallocateChannels(moduleChannels, virtualChannels); } } void PlayerMaster::setUseVirtualChannels(bool useVirtualChannels) { TrackerConfig::useVirtualChannels = useVirtualChannels; for (pp_int32 i = 0; i < playerControllers->size(); i++) { playerControllers->get(i)->setUseVirtualChannels(useVirtualChannels); } } void PlayerMaster::setMultiChannelKeyJazz(bool b) { multiChannelKeyJazz = b; for (pp_int32 i = 0; i < playerControllers->size(); i++) { playerControllers->get(i)->setMultiChannelKeyJazz(b); } } void PlayerMaster::setMultiChannelRecord(bool b) { multiChannelRecord = b; for (pp_int32 i = 0; i < playerControllers->size(); i++) { playerControllers->get(i)->setMultiChannelRecord(b); } } bool PlayerMaster::start() { return mixer->start() == 0; } bool PlayerMaster::stop(bool detachPlayers) { // removes playing devices from master mixer before stopping // the master mixer audio device if (detachPlayers) { for (pp_int32 i = 0; i < playerControllers->size(); i++) playerControllers->get(i)->detachDevice(); } return mixer->stop() == 0; } void PlayerMaster::getCurrentSamplePeak(pp_int32& left, pp_int32& right) { if (!mixer->isActive()) { left = right = 0; return; } mp_sint32 pos = mixer->getAudioDriver()->getBufferPos(); left = mixer->getCurrentSamplePeak(pos, 0); right = mixer->getCurrentSamplePeak(pos, 1); } void PlayerMaster::resetQueuedPositions() { for (pp_int32 i = 0; i < playerControllers->size(); i++) { playerControllers->get(i)->setNextOrderToPlay(-1); playerControllers->get(i)->setNextPatternToPlay(-1); } } milkytracker-0.90.85+dfsg/src/tracker/SamplePlayer.h0000644000175000017500000000310311150223367021411 0ustar admin2admin2/* * tracker/SamplePlayer.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SamplePlayer.h * MilkyTracker * * Created by Peter Barth on 13.12.07. * */ #ifndef __SAMPLEPLAYER_H__ #define __SAMPLEPLAYER_H__ #include "BasicTypes.h" struct TXMSample; class SamplePlayer { private: class ModuleEditor& moduleEditor; class PlayerController& playerController; public: SamplePlayer(ModuleEditor& moduleEditor, PlayerController& playerController) : moduleEditor(moduleEditor), playerController(playerController) { } void playSample(const TXMSample& smp, pp_uint32 note, pp_int32 rangeStart = -1, pp_int32 rangeEnd = -1); void playSample(pp_int32 insIndex, pp_int32 smpIndex, pp_uint32 note); void playSample(pp_int32 insIndex, pp_uint32 note); void playCurrentSample(pp_uint32 note); void playCurrentSampleSelectionRange(pp_uint32 note); void stopSamplePlayback(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/SongLengthEstimator.cpp0000644000175000017500000000364111150223367023315 0ustar admin2admin2/* * tracker/SongLengthEstimator.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SongLengthEstimator.cpp * MilkyTracker * * Created by Peter Barth on 10.11.05. * */ #include "SongLengthEstimator.h" #include "MilkyPlay.h" #include "AudioDriver_NULL.h" SongLengthEstimator::SongLengthEstimator(XModule* theModule) : player(NULL), module(theModule) { } SongLengthEstimator::SongLengthEstimator(const SongLengthEstimator& src) : player(NULL), module(src.module) { } SongLengthEstimator::~SongLengthEstimator() { delete player; } const SongLengthEstimator& SongLengthEstimator::operator=(const SongLengthEstimator& src) { if (&src != this) { module = src.module; } return *this; } mp_sint32 SongLengthEstimator::estimateSongLengthInSeconds() { if (!player) { player = new PlayerGeneric(44100); if (!player) return -1; player->setBufferSize(1024); player->setResamplerType((ChannelMixer::ResamplerTypes)0); player->setMasterVolume(256); player->setDisableMixing(true); } AudioDriver_NULL* audioDriver = new AudioDriver_NULL; mp_sint32 res = player->exportToWAV(NULL, module, 0, -1, NULL, module->header.channum, NULL, audioDriver) / player->getMixFrequency(); delete audioDriver; return res; } milkytracker-0.90.85+dfsg/src/tracker/SectionSettings.cpp0000644000175000017500000030437511150223367022512 0ustar admin2admin2/* * tracker/SectionSettings.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionSettings.cpp * MilkyTracker * * Created by Peter Barth on Sun Mar 13 2005. * */ #include "SectionSettings.h" #include "Tracker.h" #include "TrackerConfig.h" #include "ModuleEditor.h" #include "PlayerMaster.h" #include "ResamplerHelper.h" #include "PlayerController.h" #include "SystemMessage.h" #include "PPUIConfig.h" #include "CheckBox.h" #include "ListBox.h" #include "RadioGroup.h" #include "Seperator.h" #include "Slider.h" #include "StaticText.h" #include "TransparentContainer.h" #include "PatternEditorControl.h" #include "DialogWithValues.h" #include "DialogListBox.h" #include "Graphics.h" #include "PatternTools.h" #include "TrackerSettingsDatabase.h" #include "SectionSamples.h" #include "ColorPaletteContainer.h" #include "ColorExportImport.h" // OS Interface #include "PPOpenPanel.h" #include "PPSavePanel.h" #include "FileExtProvider.h" #include "ControlIDs.h" #ifdef __LOWRES__ #define SECTIONHEIGHT 148 #else #define SECTIONHEIGHT 118 #endif #define UPPERFRAMEHEIGHT 118 // small custom button class which will be used to show a color preview class PPColPrevButton : public PPButton { public: PPColPrevButton(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, PPPoint location, PPSize size) : PPButton(id, parentScreen, eventListener, location, size, false, false, false) { } virtual void paint(PPGraphicsAbstract* g) { PPButton::paint(g); PPFont* font = PPFont::getFont(PPFont::FONT_TINY); g->setFont(font); PPPoint p = this->getLocation(); p.x+=1; p.y+=2; g->setColor(255^getColor()->r, 255^getColor()->g, 255^getColor()->b); char buffer[100]; sprintf(buffer, "R:%02X", getColor()->r); g->drawString(buffer, p.x, p.y, false); p.y+=font->getCharHeight(); sprintf(buffer, "G:%02X", getColor()->g); g->drawString(buffer, p.x, p.y, false); p.y+=font->getCharHeight(); sprintf(buffer, "B:%02X", getColor()->b); g->drawString(buffer, p.x, p.y, false); } }; // settings enum ControlIDs { PAGE_BUTTON_0 = 50, PAGE_BUTTON_1, PAGE_BUTTON_2, PAGE_BUTTON_3, PAGE_BUTTON_4, PAGE_BUTTON_5, PAGE_BUTTON_6, PAGE_BUTTON_7, SUBPAGE_BUTTON_LEFT_0, SUBPAGE_BUTTON_LEFT_1, SUBPAGE_BUTTON_LEFT_2, SUBPAGE_BUTTON_LEFT_3, SUBPAGE_BUTTON_LEFT_4, SUBPAGE_BUTTON_LEFT_5, SUBPAGE_BUTTON_LEFT_6, SUBPAGE_BUTTON_LEFT_7, SUBPAGE_BUTTON_RIGHT_0, SUBPAGE_BUTTON_RIGHT_1, SUBPAGE_BUTTON_RIGHT_2, SUBPAGE_BUTTON_RIGHT_3, SUBPAGE_BUTTON_RIGHT_4, SUBPAGE_BUTTON_RIGHT_5, SUBPAGE_BUTTON_RIGHT_6, SUBPAGE_BUTTON_RIGHT_7, RADIOGROUP_SETTINGS_PAGE, BUTTON_SETTINGS_OK, BUTTON_SETTINGS_APPLY, BUTTON_SETTINGS_CANCEL, // Page I RADIOGROUP_SETTINGS_FREQTAB, STATICTEXT_SETTINGS_BUFFERSIZE, STATICTEXT_SETTINGS_MIXERVOL, SLIDER_SETTINGS_BUFFERSIZE, SLIDER_SETTINGS_MIXERVOL, STATICTEXT_SETTINGS_FORCEPOWER2BUFF, CHECKBOX_SETTINGS_FORCEPOWER2BUFF, RADIOGROUP_SETTINGS_AMPLIFY, BUTTON_SETTINGS_RESAMPLING, CHECKBOX_SETTINGS_RAMPING, RADIOGROUP_SETTINGS_MIXFREQ, BUTTON_SETTINGS_CHOOSEDRIVER, // PAGE I (2) CHECKBOX_SETTINGS_VIRTUALCHANNELS, BUTTON_SETTINGS_VIRTUALCHANNELS_PLUS, BUTTON_SETTINGS_VIRTUALCHANNELS_MINUS, STATICTEXT_SETTINGS_VIRTUALCHANNELS, CHECKBOX_SETTINGS_MULTICHN_RECORD, CHECKBOX_SETTINGS_MULTICHN_KEYJAZZ, CHECKBOX_SETTINGS_MULTICHN_EDIT, CHECKBOX_SETTINGS_MULTICHN_RECORDKEYOFF, CHECKBOX_SETTINGS_MULTICHN_RECORDNOTEDELAY, // Page II CHECKBOX_SETTINGS_HEXCOUNT, CHECKBOX_SETTINGS_SHOWZEROEFFECT, CHECKBOX_SETTINGS_FULLSCREEN, LISTBOX_SETTINGS_RESOLUTIONS, BUTTON_RESOLUTIONS_CUSTOM, BUTTON_RESOLUTIONS_FULL, STATICTEXT_SETTINGS_MAGNIFY, RADIOGROUP_SETTINGS_MAGNIFY, LISTBOX_COLORS, SLIDER_COLOR_RED, SLIDER_COLOR_GREEN, SLIDER_COLOR_BLUE, BUTTON_COLOR, BUTTON_COLOR_PREDEF_STORE, BUTTON_COLOR_EXPORT, BUTTON_COLOR_IMPORT, BUTTON_COLOR_PREVIEW, BUTTON_COLOR_COPY, BUTTON_COLOR_PASTE, BUTTON_COLOR_DARKER, BUTTON_COLOR_BRIGHTER, BUTTON_COLOR_PREDEF_0, BUTTON_COLOR_PREDEF_1, BUTTON_COLOR_PREDEF_2, BUTTON_COLOR_PREDEF_3, BUTTON_COLOR_PREDEF_4, BUTTON_COLOR_PREDEF_5, BUTTON_COLOR_RESTORE, STATICTEXT_SPACING, SLIDER_SPACING, STATICTEXT_MUTEFADE, SLIDER_MUTEFADE, STATICTEXT_HIGHLIGHTMODULO1, BUTTON_HIGHLIGHTMODULO1_PLUS, BUTTON_HIGHLIGHTMODULO1_MINUS, CHECKBOX_HIGHLIGHTMODULO1_FULLROW, STATICTEXT_HIGHLIGHTMODULO2, BUTTON_HIGHLIGHTMODULO2_PLUS, BUTTON_HIGHLIGHTMODULO2_MINUS, CHECKBOX_HIGHLIGHTMODULO2_FULLROW, // Page III RADIOGROUP_SETTINGS_PATTERNFONT, LISTBOX_SETTINGS_FONTFAMILIES, LISTBOX_SETTINGS_FONTENTRIES, // PAGE VI CHECKBOX_SETTINGS_INSTRUMENTBACKTRACE, CHECKBOX_SETTINGS_WRAPCURSOR, CHECKBOX_SETTINGS_PROSPECTIVE, //CHECKBOX_SETTINGS_FOLLOWSONG, CHECKBOX_SETTINGS_TABTONOTE, CHECKBOX_SETTINGS_AUTORESIZE, CHECKBOX_SETTINGS_CLICKTOCURSOR, RADIOGROUP_SETTINGS_EDITMODE, RADIOGROUP_SETTINGS_SCROLLMODE, CHECKBOX_SETTINGS_SAMPLEEDITORUNDO, CHECKBOX_SETTINGS_AUTOMIXDOWNSAMPLES, CHECKBOX_SETTINGS_INTERNALDISKBROWSER, CHECKBOX_SETTINGS_AUTOESTPLAYTIME, CHECKBOX_SETTINGS_SHOWSPLASH, CHECKBOX_SETTINGS_SCOPES, STATICTEXT_SETTINGS_SCOPESAPPEARANCE, RADIOGROUP_SETTINGS_SCOPESAPPEARANCE, // Page V (only on desktop version) RADIOGROUP_SETTINGS_STOPBACKGROUNDBEHAVIOUR, CHECKBOX_SETTINGS_TABSWITCHRESUMEPLAY, STATICTEXT_SETTINGS_TABSWITCHRESUMEPLAY, CHECKBOX_SETTINGS_LOADMODULEINNEWTAB, PAGE_IO_1, PAGE_IO_2, PAGE_IO_3, PAGE_LAYOUT_1, PAGE_LAYOUT_2, PAGE_LAYOUT_3, PAGE_LAYOUT_4, PAGE_FONTS_1, PAGE_FONTS_2, PAGE_FONTS_3, PAGE_MISC_1, PAGE_MISC_2, PAGE_MISC_3, PAGE_TABS_1, PAGE_TABS_2, PAGE_TABS_3, RESPONDMESSAGEBOX_CUSTOMRESOLUTION, RESPONDMESSAGEBOX_RESTOREPALETTES, RESPONDMESSAGEBOX_SELECTAUDIODRV, RESPONDMESSAGEBOX_SELECTRESAMPLER }; struct TScreenRes { pp_int32 width, height; const char* name; }; #define NUMRESOLUTIONS 13 #define MINWIDTH 640 #define MINHEIGHT 480 static TScreenRes resolutions[NUMRESOLUTIONS] = { {640, 480, "640x480"}, {720, 480, "720x480"}, {800, 480, "800x480"}, {800, 500, "800x500"}, {800, 600, "800x600"}, {1024, 768, "1024x768"}, {1152, 864, "1152x864"}, {1280, 768, "1280x768"}, {1280, 800, "1280x800"}, {1280, 854, "1280x854"}, {1280, 1024, "1280x1024"}, {1680, 1050, "1680x1050"}, {-1, -1, ""} }; // Class which responds to message box clicks class DialogResponderSettings : public DialogResponder { private: SectionSettings& section; public: DialogResponderSettings(SectionSettings& section) : section(section) { } virtual pp_int32 ActionOkay(PPObject* sender) { switch (reinterpret_cast(sender)->getID()) { case RESPONDMESSAGEBOX_CUSTOMRESOLUTION: { section.storeCustomResolution(); break; } case RESPONDMESSAGEBOX_RESTOREPALETTES: section.restorePalettes(); break; case RESPONDMESSAGEBOX_SELECTAUDIODRV: { PPListBox* listBox = reinterpret_cast(sender)->getListBox(); section.storeAudioDriver(listBox->getItem(listBox->getSelectedIndex())); break; } case RESPONDMESSAGEBOX_SELECTRESAMPLER: { PPListBox* listBox = reinterpret_cast(sender)->getListBox(); section.storeResampler(listBox->getSelectedIndex()); break; } } return 0; } }; class TabPage : public EventListenerInterface { protected: pp_uint32 id; SectionSettings& sectionSettings; PPTransparentContainer* container; bool visible; enum { PageWidth = 160, PageHeight = UPPERFRAMEHEIGHT }; public: TabPage(pp_uint32 id, SectionSettings& sectionSettings) : id(id), sectionSettings(sectionSettings), container(NULL), visible(false) { } PPTransparentContainer* getContainer() const { return container; } static pp_int32 getWidth() { return PageWidth; } static pp_int32 getHeight() { return PageHeight; } void setVisible(bool visible) { this->visible = visible; } bool isVisible() const { return visible; } virtual void init(PPScreen* screen) = 0; virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) = 0; virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event) { return sectionSettings.handleEvent(sender, event); } PPPoint getLocation() { return container->getLocation(); } void setLocation(const PPPoint& p) { if (container->getLocation().x != p.x || container->getLocation().y != p.y) { pp_int32 dx = p.x - container->getLocation().x; pp_int32 dy = p.y - container->getLocation().y; container->move(PPPoint(dx, dy)); } } }; class TabPageIO_1 : public TabPage { public: TabPageIO_1(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2 + 4), "Driver:", true)); PPButton* button = new PPButton(BUTTON_SETTINGS_CHOOSEDRIVER, screen, this, PPPoint(x + 4 + 7*8 + 4, y2 + 3), PPSize(90, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Select Driver"PPSTR_PERIODS); container->addControl(button); y2+=4; PPStaticText* text = new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2 + 2 + 11), "Buffer:", true); //text->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(text); container->addControl(new PPStaticText(STATICTEXT_SETTINGS_BUFFERSIZE, NULL, NULL, PPPoint(x + 4 + 7*8, y2 + 2 + 11), "000ms(xx)", false)); PPSlider* slider = new PPSlider(SLIDER_SETTINGS_BUFFERSIZE, screen, this, PPPoint(x + 4, y2 + 2 + 11*2-1), 151, true); slider->setMaxValue(511); slider->setBarSize(8192); container->addControl(slider); y2++; container->addControl(new PPStaticText(STATICTEXT_SETTINGS_FORCEPOWER2BUFF, NULL, NULL, PPPoint(x + 4, y2 + 2 + 11*3), "Force 2^n sizes:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_FORCEPOWER2BUFF, screen, this, PPPoint(x + 4 + 17*8 + 4, y2 + 2 + 11*3-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2 + 2 + 11*3), "Mixervol:", true)); container->addControl(new PPStaticText(STATICTEXT_SETTINGS_MIXERVOL, NULL, NULL, PPPoint(x + 4 + 8*9, y2 + 2 + 11*3), "100%", false)); slider = new PPSlider(SLIDER_SETTINGS_MIXERVOL, screen, this, PPPoint(x + 4, y2 + 2 + 11*4-1), 151, true); slider->setMaxValue(256); slider->setBarSize(8192); container->addControl(slider); y2-=1; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2 + 2 + 11*5 + 4), "Amp:", true)); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_AMPLIFY, screen, this, PPPoint(x + 2 + 5*8, y2 + 2 + 11*5 + 1), PPSize(120, 16)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setFont(PPFont::getFont(PPFont::FONT_TINY)); radioGroup->setHorizontal(true); radioGroup->addItem("25%"); radioGroup->addItem("50%"); radioGroup->addItem("100%"); container->addControl(radioGroup); y2 += 2 + 11*7 - 4; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Resampling:", true)); button = new PPButton(BUTTON_SETTINGS_RESAMPLING, screen, this, PPPoint(x + 4 + 11*8 + 4, y2-2), PPSize(6*9 + 4, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Select"PPSTR_PERIODS); container->addControl(button); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Volume ramping:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_RAMPING, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); //container->addControl(new PPSeperator(0, screen, PPPoint(x + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { PPStaticText* text = static_cast(container->getControlByID(STATICTEXT_SETTINGS_BUFFERSIZE)); PPSlider* slider = static_cast(container->getControlByID(SLIDER_SETTINGS_BUFFERSIZE)); char buffer[100]; char buffer2[100]; // buffersize bool forcePowerOfTwo = settingsDatabase->restore("FORCEPOWEROFTWOBUFFERSIZE")->getBoolValue(); pp_int32 v = settingsDatabase->restore("BUFFERSIZE")->getIntValue(); pp_int32 v2 = v; if (forcePowerOfTwo) v = PlayerMaster::roundToNearestPowerOfTwo(v); float fv = PlayerMaster::convertBufferSizeToMillis(settingsDatabase->restore("MIXERFREQ")->getIntValue(), v); pp_int32 fixed = (pp_int32)fv; pp_int32 decimal = (pp_int32)(fv*10.0f) % 10; if (v >= 1000) { if (fixed >= 100) { if (fixed >= 1000) sprintf(buffer, "%i.%is(%i.%ik)", fixed / 1000, (fixed / 100) % 10, v / 1000, (v / 100) % 10); else sprintf(buffer, "%ims(%i.%ik)", fixed, v / 1000, (v / 100) % 10); } else sprintf(buffer, "%i.%ims(%i.%ik)", fixed, decimal, v / 1000, (v / 100) % 10); } else { if (fixed >= 1000) sprintf(buffer, "%i.%is(%i)", fixed / 1000, (fixed / 100) % 10, v); else sprintf(buffer, "%i.%ims(%i)", fixed, decimal, v); } if (strlen(buffer) < 9) { memset(buffer2, 32, sizeof(buffer2)); strcpy(buffer2 + 9-strlen(buffer), buffer); strcpy(buffer, buffer2); } text->setText(buffer); slider->setCurrentValue((v2 >> 5) - 1); // force 2^n buffer size static_cast(container->getControlByID(CHECKBOX_SETTINGS_FORCEPOWER2BUFF))->checkIt(forcePowerOfTwo); // mixervolume text = static_cast(container->getControlByID(STATICTEXT_SETTINGS_MIXERVOL)); slider = static_cast(container->getControlByID(SLIDER_SETTINGS_MIXERVOL)); v = settingsDatabase->restore("MIXERVOLUME")->getIntValue(); sprintf(buffer, "%i%%", (v*100)/256); if (strlen(buffer) < 4) { memset(buffer2, 32, sizeof(buffer2)); strcpy(buffer2 + 4-strlen(buffer), buffer); strcpy(buffer, buffer2); } text->setText(buffer); slider->setCurrentValue(v); // amplify v = settingsDatabase->restore("MIXERSHIFT")->getIntValue(); static_cast(container->getControlByID(RADIOGROUP_SETTINGS_AMPLIFY))->setChoice(v); // checkboxes v = settingsDatabase->restore("RAMPING")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_RAMPING))->checkIt(v!=0); } }; class TabPageIO_2 : public TabPage { public: TabPageIO_2(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); // frequency table pp_int32 x2 = x; pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Mixer Resolution", true, true)); pp_int32 j; PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_MIXFREQ, screen, this, PPPoint(x2, y2+2+11), PPSize(160, TrackerConfig::numMixFrequencies*14)); radioGroup->setColor(TrackerConfig::colorThemeMain); for (j = 0; j < TrackerConfig::numMixFrequencies; j++) { char buffer[32]; sprintf(buffer, "%i Hz", TrackerConfig::mixFrequencies[j]); radioGroup->addItem(buffer); } container->addControl(radioGroup); y2+=j*14+14; container->addControl(new PPSeperator(0, screen, PPPoint(x2, y2), 158, TrackerConfig::colorThemeMain, true)); y2+=4; // module frequencies container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Frequency Table", true, true)); radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_FREQTAB, screen, this, PPPoint(x2, y2+2+11), PPSize(160, 30)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("Amiga frequencies"); radioGroup->addItem("Linear frequencies"); container->addControl(radioGroup); //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { // mixer resolution pp_int32 v = settingsDatabase->restore("MIXERFREQ")->getIntValue(); pp_int32 i; for (i = 0; i < TrackerConfig::numMixFrequencies; i++) if (v == TrackerConfig::mixFrequencies[i]) { static_cast(container->getControlByID(RADIOGROUP_SETTINGS_MIXFREQ))->setChoice(i); break; } // frequency table v = moduleEditor.getFrequency(); static_cast(container->getControlByID(RADIOGROUP_SETTINGS_FREQTAB))->setChoice(v); } }; class TabPageIO_3 : public TabPage { public: TabPageIO_3(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y2 + 2), "Instrument Playback", true, true)); y2+=15; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Jam channels:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_VIRTUALCHANNELS, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(STATICTEXT_SETTINGS_VIRTUALCHANNELS, NULL, NULL, PPPoint(x + 4, y2), "Use xx channels", false)); PPButton* button = new PPButton(BUTTON_SETTINGS_VIRTUALCHANNELS_PLUS, screen, this, PPPoint(x + 4 + 15*8 + 4, y2), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_SETTINGS_VIRTUALCHANNELS_MINUS, screen, this, PPPoint(x + 4 + 15*8 + 4 + 13, y2), PPSize(13, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); y2+=14; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y2 + 2), "Multichannel", true, true)); y2+=15; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Recording:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_MULTICHN_RECORD, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), """Keyjazzing"":", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_MULTICHN_KEYJAZZ, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Editing:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_MULTICHN_EDIT, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Record key off:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_MULTICHN_RECORDKEYOFF, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Rec. note delays:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_MULTICHN_RECORDNOTEDELAY, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); //container->addControl(new PPSeperator(0, screen, PPPoint(x + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { PPStaticText* text = static_cast(container->getControlByID(STATICTEXT_SETTINGS_VIRTUALCHANNELS)); char buffer[100]; // buffersize pp_int32 v = settingsDatabase->restore("VIRTUALCHANNELS")->getIntValue(); sprintf(buffer, "Use %02i", v); text->setText(buffer); static_cast(container->getControlByID(CHECKBOX_SETTINGS_VIRTUALCHANNELS))->checkIt(v>0); v = settingsDatabase->restore("MULTICHN_RECORD")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_MULTICHN_RECORD))->checkIt(v!=0); v = settingsDatabase->restore("MULTICHN_KEYJAZZ")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_MULTICHN_KEYJAZZ))->checkIt(v!=0); v = settingsDatabase->restore("MULTICHN_EDIT")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_MULTICHN_EDIT))->checkIt(v!=0); v = settingsDatabase->restore("MULTICHN_RECORDKEYOFF")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_MULTICHN_RECORDKEYOFF))->checkIt(v!=0); v = settingsDatabase->restore("MULTICHN_RECORDNOTEDELAY")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_MULTICHN_RECORDNOTEDELAY))->checkIt(v!=0); } }; class TabPageLayout_1 : public TabPage { public: TabPageLayout_1(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 x2 = x; pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y2 + 2), "Pattern Editor", true, true)); y2+=14; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Spacing:", true)); container->addControl(new PPStaticText(STATICTEXT_SPACING, screen, this, PPPoint(x2 + 9*8, y2), "0px")); PPSlider* slider = new PPSlider(SLIDER_SPACING, screen, this, PPPoint(x2 + 13*8 + 2, y2-1), 49, true); slider->setMaxValue(31); slider->setBarSize(16384); container->addControl(slider); y2+=11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Hex count:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_HEXCOUNT, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2), "Show zero effect:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_SHOWZEROEFFECT, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Prospective:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_PROSPECTIVE, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Muting opacity:", true)); y2+=11; container->addControl(new PPStaticText(STATICTEXT_MUTEFADE, screen, this, PPPoint(x2 + 4, y2), "100%")); slider = new PPSlider(SLIDER_MUTEFADE, screen, this, PPPoint(x2 + 4 + 8*4 + 4, y2-1), 113, true); slider->setMaxValue(100); slider->setBarSize(8192); container->addControl(slider); y2+=12; PPStaticText* staticText = new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Row hilight spacing:", true); staticText->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(staticText); y2+=11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "1st:", true)); container->addControl(new PPStaticText(STATICTEXT_HIGHLIGHTMODULO1, NULL, NULL, PPPoint(x2 + 2 + 4*8 + 2, y2), "xx")); PPButton* button = new PPButton(BUTTON_HIGHLIGHTMODULO1_PLUS, screen, this, PPPoint(x + 2 + 7*8, y2-1), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_HIGHLIGHTMODULO1_MINUS, screen, this, PPPoint(x + 2 + 7*8 + 13, y2-1), PPSize(13, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2 + 7*8 + 13 + 20, y2), "Full:", true)); container->addControl(new PPCheckBox(CHECKBOX_HIGHLIGHTMODULO1_FULLROW, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); y2+=11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "2nd:", true)); container->addControl(new PPStaticText(STATICTEXT_HIGHLIGHTMODULO2, NULL, NULL, PPPoint(x2 + 2 + 4*8 + 2, y2), "xx")); button = new PPButton(BUTTON_HIGHLIGHTMODULO2_PLUS, screen, this, PPPoint(x + 2 + 7*8, y2-1), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(BUTTON_HIGHLIGHTMODULO2_MINUS, screen, this, PPPoint(x + 2 + 7*8 + 13, y2-1), PPSize(13, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2 + 7*8 + 13 + 20, y2), "Full:", true)); container->addControl(new PPCheckBox(CHECKBOX_HIGHLIGHTMODULO2_FULLROW, screen, this, PPPoint(x + 4 + 17*8 + 4, y2-1))); // vertical separator //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { // spacing slider PPStaticText* text = static_cast(container->getControlByID(STATICTEXT_SPACING)); PPSlider* slider = static_cast(container->getControlByID(SLIDER_SPACING)); pp_int32 v = settingsDatabase->restore("SPACING")->getIntValue(); char buffer[100], buffer2[100]; sprintf(buffer,"%ipx", v); text->setText(buffer); slider->setCurrentValue(v); // mute fade strength slider text = static_cast(container->getControlByID(STATICTEXT_MUTEFADE)); slider = static_cast(container->getControlByID(SLIDER_MUTEFADE)); v = settingsDatabase->restore("MUTEFADE")->getIntValue(); sprintf(buffer, "%i%%", v); // right align if (strlen(buffer) < 4) { memset(buffer2, 32, sizeof(buffer2)); strcpy(buffer2 + 4-strlen(buffer), buffer); strcpy(buffer, buffer2); } text->setText(buffer); slider->setCurrentValue(v); // update primary pattern row highlight text = static_cast(container->getControlByID(STATICTEXT_HIGHLIGHTMODULO1)); v = settingsDatabase->restore("HIGHLIGHTMODULO1")->getIntValue(); sprintf(buffer, "%02i ", v); text->setText(buffer); // update secondary pattern row highlight text = static_cast(container->getControlByID(STATICTEXT_HIGHLIGHTMODULO2)); v = settingsDatabase->restore("HIGHLIGHTMODULO2")->getIntValue(); sprintf(buffer, "%02i ", v); text->setText(buffer); v = settingsDatabase->restore("HIGHLIGHTROW1")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_HIGHLIGHTMODULO1_FULLROW))->checkIt(v!=0); v = settingsDatabase->restore("HIGHLIGHTROW2")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_HIGHLIGHTMODULO2_FULLROW))->checkIt(v!=0); v = settingsDatabase->restore("HEXCOUNT")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_HEXCOUNT))->checkIt(v!=0); v = settingsDatabase->restore("SHOWZEROEFFECT")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_SHOWZEROEFFECT))->checkIt(v!=0); v = settingsDatabase->restore("PROSPECTIVE")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_PROSPECTIVE))->checkIt(v!=0); } }; class TabPageLayout_2 : public TabPage { public: TabPageLayout_2(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 i = 0; pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 x2 = x; // Colors pp_int32 y2 = y; pp_int32 lbheight = container->getSize().height - (y2 - y) - 66; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Colors", true, true)); PPButton* button = new PPButton(BUTTON_COLOR_IMPORT, screen, this, PPPoint(x2 + 54, y2 + 2), PPSize(9, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("I"); container->addControl(button); button = new PPButton(BUTTON_COLOR_EXPORT, screen, this, PPPoint(x2 + 54 + 10, y2 + 2), PPSize(9, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("E"); container->addControl(button); button = new PPButton(BUTTON_COLOR_PREVIEW, screen, this, PPPoint(x2 + 115, y2 + 2), PPSize(39, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Preview"); container->addControl(button); button = new PPButton(BUTTON_COLOR_RESTORE, screen, this, PPPoint(x2 + 115 - 40, y2 + 2), PPSize(39, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Restore"); container->addControl(button); y2+=1+11; sectionSettings.listBoxColors = new PPListBox(LISTBOX_COLORS, screen, this, PPPoint(x2+2, y2+2), PPSize(153,lbheight), true, false, true, true); sectionSettings.listBoxColors->setBorderColor(TrackerConfig::colorThemeMain); sectionSettings.listBoxColors->setKeepsFocus(false); sectionSettings.listBoxColors->setShowFocus(false); for (i = 0; i < GlobalColorConfig::ColorLast; i++) { pp_int32 j = sectionSettings.colorMapping[i]; if (sectionSettings.colorDescriptors[j].readableDecription == NULL) break; sectionSettings.listBoxColors->addItem(sectionSettings.colorDescriptors[j].readableDecription); } #ifdef __LOWRES__ y2+=sectionSettings.listBoxColors->getSize().height + 2; #else y2+=sectionSettings.listBoxColors->getSize().height + 4; #endif container->addControl(sectionSettings.listBoxColors); button = new PPColPrevButton(BUTTON_COLOR, screen, this, PPPoint(x2 + 88, y2 + 1), PPSize(31, 34)); button->setFlat(true); button->setColor(sectionSettings.currentColor); container->addControl(button); button = new PPButton(BUTTON_COLOR_COPY, screen, this, PPPoint(x2 + 88 + 32 + 2, y2 + 2), PPSize(5*6+2, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Copy"); container->addControl(button); button = new PPButton(BUTTON_COLOR_PASTE, screen, this, PPPoint(x2 + 88 + 32 + 2, y2 + 2+10), PPSize(5*6+2, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Paste"); container->addControl(button); button = new PPButton(BUTTON_COLOR_DARKER, screen, this, PPPoint(x2 + 88 + 32 + 2, y2 + 2+23), PPSize(16, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("<<"); container->addControl(button); button = new PPButton(BUTTON_COLOR_BRIGHTER, screen, this, PPPoint(x2 + 88 + 32 + 2 + 17, y2 + 2+23), PPSize(15, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText(">>"); container->addControl(button); // Red slider container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "R", true)); PPSlider* slider = new PPSlider(SLIDER_COLOR_RED, screen, this, PPPoint(x2 + 2 + 1*8 + 2, y2 + 1), 74, true); slider->setMaxValue(255); slider->setBarSize(16384); container->addControl(slider); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "G", true)); slider = new PPSlider(SLIDER_COLOR_GREEN, screen, this, PPPoint(x2 + 2 + 1*8 + 2, y2 + 1), 74, true); slider->setMaxValue(255); slider->setBarSize(16384); container->addControl(slider); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "B", true)); slider = new PPSlider(SLIDER_COLOR_BLUE, screen, this, PPPoint(x2 + 2 + 1*8 + 2, y2 + 1), 74, true); slider->setMaxValue(255); slider->setBarSize(16384); container->addControl(slider); y2+=12; // predefs pp_int32 px = x2 + 2; PPStaticText* staticText = new PPStaticText(0, NULL, NULL, PPPoint(px, y2 + 3), "Predef:", true); container->addControl(staticText); px+=7*8+2; // pre-defined envelopes for (i = 0; i < TrackerConfig::numPredefinedColorPalettes; i++) { button = new PPButton(BUTTON_COLOR_PREDEF_0+i, screen, this, PPPoint(px, y2 + 2), PPSize(9, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText((char)('A'+i)); container->addControl(button); px+=button->getSize().width+1; } px+=2; button = new PPButton(BUTTON_COLOR_PREDEF_STORE, screen, this, PPPoint(px, y2 + 2), PPSize(5*6+2, 9), true, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Store"); container->addControl(button); //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { // Update color from sliders PPSlider* slider = static_cast(container->getControlByID(SLIDER_COLOR_RED)); slider->setCurrentValue(sectionSettings.currentColor.r); slider = static_cast(container->getControlByID(SLIDER_COLOR_GREEN)); slider->setCurrentValue(sectionSettings.currentColor.g); slider = static_cast(container->getControlByID(SLIDER_COLOR_BLUE)); slider->setCurrentValue(sectionSettings.currentColor.b); static_cast(container->getControlByID(BUTTON_COLOR_PASTE))->setClickable(sectionSettings.colorCopy != NULL); } }; class TabPageLayout_3 : public TabPage { public: TabPageLayout_3(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 i; pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 x2 = x; pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Resolutions", true, true)); PPButton* button = new PPButton(BUTTON_RESOLUTIONS_CUSTOM, screen, this, PPPoint(x2 + 92, y2 + 2), PPSize(37, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Custom"); container->addControl(button); button = new PPButton(BUTTON_RESOLUTIONS_FULL, screen, this, PPPoint(x2 + 92 + 37 + 2, y2 + 2), PPSize(23, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Full"); container->addControl(button); y2+=12; pp_int32 lbheight = container->getSize().height - (y2 - y) - (18); PPListBox* listBox; listBox = new PPListBox(LISTBOX_SETTINGS_RESOLUTIONS, screen, this, PPPoint(x2+2, y2+2), PPSize(153,lbheight), true, false, true, true); listBox->setBorderColor(TrackerConfig::colorThemeMain); listBox->setKeepsFocus(false); listBox->setShowFocus(false); for (i = 0; i < NUMRESOLUTIONS; i++) listBox->addItem(resolutions[i].name); container->addControl(listBox); y2+=lbheight + 6; container->addControl(new PPStaticText(STATICTEXT_SETTINGS_MAGNIFY, NULL, NULL, PPPoint(x2 + 2, y2), "Scale:", true)); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_MAGNIFY, screen, this, PPPoint(x2 + 2 + 7*8, y2 - 4), PPSize(120, 16)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setFont(PPFont::getFont(PPFont::FONT_TINY)); radioGroup->setHorizontal(true); radioGroup->addItem("x1"); radioGroup->addItem("x2"); radioGroup->addItem("x4"); radioGroup->addItem("x8"); container->addControl(radioGroup); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { pp_int32 width = settingsDatabase->restore("XRESOLUTION")->getIntValue(); pp_int32 height = settingsDatabase->restore("YRESOLUTION")->getIntValue(); bool found = false; for (pp_int32 i = 0; i < NUMRESOLUTIONS; i++) { if (resolutions[i].width == width && resolutions[i].height == height) { static_cast(container->getControlByID(LISTBOX_SETTINGS_RESOLUTIONS))->setSelectedIndex(i, false, false); found = true; break; } } if (!found) static_cast(container->getControlByID(LISTBOX_SETTINGS_RESOLUTIONS))->setSelectedIndex(NUMRESOLUTIONS-1, false, false); static_cast(container->getControlByID(STATICTEXT_SETTINGS_MAGNIFY))->enable(screen->supportsScaling()); static_cast(container->getControlByID(RADIOGROUP_SETTINGS_MAGNIFY))->enable(screen->supportsScaling()); pp_int32 screenScaleFactor = settingsDatabase->restore("SCREENSCALEFACTOR")->getIntValue(); pp_int32 index = 0; switch (screenScaleFactor) { case 2: index = 1; break; case 4: index = 2; break; case 8: index = 3; break; } static_cast(container->getControlByID(RADIOGROUP_SETTINGS_MAGNIFY))->setChoice(index); } }; class TabPageLayout_4 : public TabPage { public: TabPageLayout_4(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 i; pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 x2 = x; pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Global", true, true)); y2+=4+11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 4, y2), "Fullscreen:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_FULLSCREEN, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { pp_int32 v = settingsDatabase->restore("FULLSCREEN")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_FULLSCREEN))->checkIt(v!=0); } }; class TabPageFonts_1 : public TabPage { public: TabPageFonts_1(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 i; const char* name = NULL; pp_int32 x2 = x; pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y2 + 2), "Pattern Editor", true, true)); y2+=11; PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_PATTERNFONT, screen, this, PPPoint(x2, y2), PPSize(159, 0)); radioGroup->setColor(TrackerConfig::colorThemeMain); name = PPFont::getFirstFontFamilyName(); i = 0; while (name) { radioGroup->addItem(name); name = PPFont::getNextFontFamilyName(); i++; } radioGroup->setSize(PPSize(radioGroup->getSize().width, 14*i)); container->addControl(radioGroup); y2+=radioGroup->getSize().height; container->addControl(new PPSeperator(0, screen, PPPoint(x2, y2), 158, TrackerConfig::colorThemeMain, true)); y2+=5; //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { pp_int32 v = settingsDatabase->restore("PATTERNFONT")->getIntValue(); static_cast(container->getControlByID(RADIOGROUP_SETTINGS_PATTERNFONT))->setChoice(v); } }; class TabPageFonts_2 : public TabPage { public: TabPageFonts_2(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 x2 = x; pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Font face config", true, true)); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Available sizes:", true)); y2+=8; pp_int32 lbheight = (container->getSize().height - (y2-y+11*2+2)) / 2; sectionSettings.listBoxFontFamilies = new PPListBox(LISTBOX_SETTINGS_FONTFAMILIES, screen, this, PPPoint(x2+2, y2+2), PPSize(153,lbheight), true, false, true, true); sectionSettings.listBoxFontFamilies->setBorderColor(TrackerConfig::colorThemeMain); sectionSettings.listBoxFontFamilies->setKeepsFocus(false); sectionSettings.listBoxFontFamilies->setShowFocus(false); const char* name = PPFont::getFirstFontFamilyName(); while (name) { sectionSettings.listBoxFontFamilies->addItem(name); name = PPFont::getNextFontFamilyName(); } container->addControl(sectionSettings.listBoxFontFamilies); y2+=sectionSettings.listBoxFontFamilies->getSize().height+2; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Available faces:", true)); y2+=8; lbheight+=7; sectionSettings.listBoxFontEntries = new PPListBox(LISTBOX_SETTINGS_FONTENTRIES, screen, this, PPPoint(x2+2, y2+2), PPSize(153,lbheight), true, false, true, true); sectionSettings.listBoxFontEntries->setBorderColor(TrackerConfig::colorThemeMain); sectionSettings.listBoxFontEntries->setKeepsFocus(false); sectionSettings.listBoxFontEntries->setShowFocus(false); sectionSettings.enumerateFontFacesInListBox(sectionSettings.listBoxFontFamilies->getSelectedIndex()); container->addControl(sectionSettings.listBoxFontEntries); //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { PPString str = settingsDatabase->restore(PPFont::getFamilyInternalName((PPFont::FontID)sectionSettings.listBoxFontFamilies->getSelectedIndex()))->getStringValue(); sectionSettings.listBoxFontEntries->setSelectedIndexByItem(str, false); } }; class TabPageMisc_1 : public TabPage { public: TabPageMisc_1(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 x2 = x; pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Edit mode", true, true)); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_EDITMODE, screen, this, PPPoint(x2, y2+2+11), PPSize(160, 42)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("MilkyTracker"); radioGroup->addItem("Fasttracker II"); container->addControl(radioGroup); y2+=3*12+8; container->addControl(new PPSeperator(0, screen, PPPoint(x2, y2), 156, TrackerConfig::colorThemeMain, true)); y2+=6; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Scrolling Style", true, true)); radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_SCROLLMODE, screen, this, PPPoint(x2, y2+2+11), PPSize(160, 42)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("Scroll to end"); radioGroup->addItem("Scroll to center"); radioGroup->addItem("Always centered"); container->addControl(radioGroup); //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { pp_int32 v = settingsDatabase->restore("EDITMODE")->getIntValue(); static_cast(container->getControlByID(RADIOGROUP_SETTINGS_EDITMODE))->setChoice(v); v = settingsDatabase->restore("SCROLLMODE")->getIntValue(); static_cast(container->getControlByID(RADIOGROUP_SETTINGS_SCROLLMODE))->setChoice(v); } }; class TabPageMisc_2 : public TabPage { public: TabPageMisc_2(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 y2 = y; pp_int32 x2 = x; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Pattern Editor", true, true)); y2+=4+11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Paste autoresize:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_AUTORESIZE, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Instr. backtrace:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_INSTRUMENTBACKTRACE, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "TAB to note:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_TABTONOTE, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Click to cursor:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_CLICKTOCURSOR, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Wrap cursor:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_WRAPCURSOR, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=11; //container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Follow song:", true)); //container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_FOLLOWSONG, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); // ------------------ sample editor ------------------- container->addControl(new PPSeperator(0, screen, PPPoint(x2, y2), 158, TrackerConfig::colorThemeMain, true)); y2+=3; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Sample Editor", true, true)); y2+=4+11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Enable undo buff:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_SAMPLEEDITORUNDO, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=14; PPStaticText* statict = new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Auto-mixdown stereo samples:", true); statict->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(statict); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_AUTOMIXDOWNSAMPLES, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-3))); y2+=10; /*// ------------------ other ------------------- container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Other", true, true)); y2+=4+11; PPStaticText* statict = new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Estimate playtime after load", true); statict->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(statict); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_AUTOESTPLAYTIME, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-3)));*/ //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { pp_int32 v = settingsDatabase->restore("PATTERNAUTORESIZE")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_AUTORESIZE))->checkIt(v!=0); v = settingsDatabase->restore("INSTRUMENTBACKTRACE")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_INSTRUMENTBACKTRACE))->checkIt(v!=0); v = settingsDatabase->restore("TABTONOTE")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_TABTONOTE))->checkIt(v!=0); v = settingsDatabase->restore("CLICKTOCURSOR")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_CLICKTOCURSOR))->checkIt(v!=0); //v = settingsDatabase->restore("WRAPAROUND")->getIntValue(); //static_cast(container->getControlByID(CHECKBOX_SETTINGS_WRAPCURSOR))->checkIt(v!=0); //v = settingsDatabase->restore("FOLLOWSONG")->getIntValue(); //static_cast(container->getControlByID(CHECKBOX_SETTINGS_FOLLOWSONG))->checkIt(v!=0); /*v = settingsDatabase->restore("AUTOESTPLAYTIME")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_AUTOESTPLAYTIME))->checkIt(v!=0);*/ v = settingsDatabase->restore("SAMPLEEDITORUNDOBUFFER")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_SAMPLEEDITORUNDO))->checkIt(v!=0); v = settingsDatabase->restore("AUTOMIXDOWNSAMPLES")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_AUTOMIXDOWNSAMPLES))->checkIt(v!=0); } }; class TabPageMisc_3 : public TabPage { public: TabPageMisc_3(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 x2 = x; pp_int32 y2 = y; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Other", true, true)); y2+=4+11; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Internal browser:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_INTERNALDISKBROWSER, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Splash screen:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_SHOWSPLASH, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=14; PPStaticText* statict = new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Estimate playtime after load", true); statict->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(statict); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_AUTOESTPLAYTIME, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-3))); y2+=10; #ifndef __LOWRES__ container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2), "Show scopes:", true)); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_SCOPES, screen, this, PPPoint(x2 + 4 + 17*8 + 4, y2-1))); y2+=12; #endif container->addControl(new PPStaticText(STATICTEXT_SETTINGS_SCOPESAPPEARANCE, NULL, NULL, PPPoint(x2 + 2, y2), "Scope Style:", true)); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_SCOPESAPPEARANCE, screen, this, PPPoint(x2, y2+10), PPSize(160, 42)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setFont(PPFont::getFont(PPFont::FONT_TINY)); radioGroup->addItem("Dots"); radioGroup->addItem("Solid"); radioGroup->addItem("Smooth Lines"); container->addControl(radioGroup); //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { pp_int32 v = settingsDatabase->restore("AUTOESTPLAYTIME")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_AUTOESTPLAYTIME))->checkIt(v!=0); v = settingsDatabase->restore("INTERNALDISKBROWSER")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_INTERNALDISKBROWSER))->checkIt(v!=0); v = settingsDatabase->restore("SHOWSPLASH")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_SHOWSPLASH))->checkIt(v!=0); v = settingsDatabase->restore("SCOPES")->getIntValue(); #ifndef __LOWRES__ static_cast(container->getControlByID(CHECKBOX_SETTINGS_SCOPES))->checkIt(v & 1); static_cast(container->getControlByID(RADIOGROUP_SETTINGS_SCOPESAPPEARANCE))->enable((v & 1) != 0); static_cast(container->getControlByID(STATICTEXT_SETTINGS_SCOPESAPPEARANCE))->enable((v & 1) != 0); #endif static_cast(container->getControlByID(RADIOGROUP_SETTINGS_SCOPESAPPEARANCE))->setChoice(v >> 1); } }; class TabPageTabs_1 : public TabPage { public: TabPageTabs_1(pp_uint32 id, SectionSettings& sectionSettings) : TabPage(id, sectionSettings) { } virtual void init(PPScreen* screen) { pp_int32 x = 0; pp_int32 y = 0; container = new PPTransparentContainer(id, screen, this, PPPoint(x, y), PPSize(PageWidth,PageHeight)); pp_int32 x2 = x; pp_int32 y2 = y; PPStaticText* text; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Load module"PPSTR_PERIODS, true, true)); y2+=12; text = new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y2 + 2), PPSTR_PERIODS"in new Tab", true); //text->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(text); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_LOADMODULEINNEWTAB, screen, this, PPPoint(x + 4 + 17*8 + 4, y2 + 2 - 1))); y2+=12+3; container->addControl(new PPSeperator(0, screen, PPPoint(x2, y2), 158, TrackerConfig::colorThemeMain, true)); y2+=3; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 2, y2 + 2), "Stop background", true, true)); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SETTINGS_STOPBACKGROUNDBEHAVIOUR, screen, this, PPPoint(x2, y2+2+11), PPSize(160, 42)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->addItem("Never"); radioGroup->addItem("On Tab switch"); radioGroup->addItem("On Playback"); container->addControl(radioGroup); y2+=3*14 + 14; text = new PPStaticText(STATICTEXT_SETTINGS_TABSWITCHRESUMEPLAY, NULL, NULL, PPPoint(x + 4, y2 + 2), "Tab-switch resume", true); container->addControl(text); container->addControl(new PPCheckBox(CHECKBOX_SETTINGS_TABSWITCHRESUMEPLAY, screen, this, PPPoint(x + 4 + 17*8 + 4, y2 + 2 - 1))); //container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); } virtual void update(PPScreen* screen, TrackerSettingsDatabase* settingsDatabase, ModuleEditor& moduleEditor) { pp_int32 v = settingsDatabase->restore("TABS_STOPBACKGROUNDBEHAVIOUR")->getIntValue(); static_cast(container->getControlByID(RADIOGROUP_SETTINGS_STOPBACKGROUNDBEHAVIOUR))->setChoice(v); static_cast(container->getControlByID(STATICTEXT_SETTINGS_TABSWITCHRESUMEPLAY))->enable(v != 0); static_cast(container->getControlByID(CHECKBOX_SETTINGS_TABSWITCHRESUMEPLAY))->enable(v != 0); v = settingsDatabase->restore("TABS_TABSWITCHRESUMEPLAY")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_TABSWITCHRESUMEPLAY))->checkIt(v != 0); v = settingsDatabase->restore("TABS_LOADMODULEINNEWTAB")->getIntValue(); static_cast(container->getControlByID(CHECKBOX_SETTINGS_LOADMODULEINNEWTAB))->checkIt(v != 0); } }; SectionSettings::SectionSettings(Tracker& theTracker) : SectionAbstract(theTracker, NULL, new DialogResponderSettings(*this)), sectionContainer(NULL), currentActivePageContainer(NULL), listBoxColors(NULL), listBoxFontFamilies(NULL), listBoxFontEntries(NULL), currentActiveTabNum(0), currentActivePageStart(0), visible(false), palette(NULL), storePalette(false), colorCopy(NULL), lastColorFile(TrackerConfig::untitledSong) { pp_int32 i; for (i = 0; i < NUMSETTINGSPAGES; i++) { tabPages.add(new PPSimpleVector()); currentActiveSubPageNum[i] = 0; } initColorDescriptors(); currentColor.set(128, 128, 128); palette = new TColorPalette(); mixerSettings = new TMixerSettings(); // predefined color palettes predefinedColorPalettes = new ColorPaletteContainer(TrackerConfig::numPredefinedColorPalettes); for (i = 0; i < getNumPredefinedColorPalettes(); i++) { /*TColorPalette pal; pal.numColors = GlobalColorConfig::ColorLast; for (j = 0; j < pal.numColors; j++) { pal.colors[j].set(rand()&255, rand()&255, rand()&255); }*/ predefinedColorPalettes->store(i, ColorPaletteContainer::decodePalette(TrackerConfig::predefinedColorPalettes[i])); } for (i = 0; i < GlobalColorConfig::ColorLast; i++) colorMapping[i] = GlobalColorConfig::ColorLast-1; colorMapping[0] = GlobalColorConfig::ColorTheme; colorMapping[1] = GlobalColorConfig::ColorForegroundText; colorMapping[2] = GlobalColorConfig::ColorTextHighlited; colorMapping[3] = GlobalColorConfig::ColorRowHighlitedFirst; colorMapping[4] = GlobalColorConfig::ColorTextHighlitedSecond; colorMapping[5] = GlobalColorConfig::ColorRowHighlitedSecond; colorMapping[6] = GlobalColorConfig::ColorPatternNote; colorMapping[7] = GlobalColorConfig::ColorPatternInstrument; colorMapping[8] = GlobalColorConfig::ColorPatternVolume; colorMapping[9] = GlobalColorConfig::ColorPatternEffect; colorMapping[10] = GlobalColorConfig::ColorPatternOperand; colorMapping[11] = GlobalColorConfig::ColorCursor; colorMapping[12] = GlobalColorConfig::ColorCursorLine; colorMapping[13] = GlobalColorConfig::ColorCursorLineHighlighted; colorMapping[14] = GlobalColorConfig::ColorPatternSelection; colorMapping[15] = GlobalColorConfig::ColorButtons; colorMapping[16] = GlobalColorConfig::ColorButtonText; colorMapping[17] = GlobalColorConfig::ColorSelection; colorMapping[18] = GlobalColorConfig::ColorListBoxBackground; colorMapping[19] = GlobalColorConfig::ColorScopes; } SectionSettings::~SectionSettings() { delete predefinedColorPalettes; delete palette; delete mixerSettings; delete colorCopy; } pp_int32 SectionSettings::getColorIndex() { return listBoxColors ? colorMapping[listBoxColors->getSelectedIndex()] : colorMapping[0]; } void SectionSettings::showRestartMessageBox() { if (tracker.settingsDatabase->restore("XRESOLUTION")->getIntValue() != tracker.settingsDatabaseCopy->restore("XRESOLUTION")->getIntValue() || tracker.settingsDatabase->restore("YRESOLUTION")->getIntValue() != tracker.settingsDatabaseCopy->restore("YRESOLUTION")->getIntValue() || tracker.settingsDatabase->restore("SCREENSCALEFACTOR")->getIntValue() != tracker.settingsDatabaseCopy->restore("SCREENSCALEFACTOR")->getIntValue()) { SystemMessage message(*tracker.screen, SystemMessage::MessageResChangeRestart); message.show(); } } pp_int32 SectionSettings::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case PAGE_BUTTON_0: case PAGE_BUTTON_1: case PAGE_BUTTON_2: case PAGE_BUTTON_3: case PAGE_BUTTON_4: { pp_int32 i = reinterpret_cast(sender)->getID()-PAGE_BUTTON_0; showPage(i, currentActiveSubPageNum[i]); update(); break; } case SUBPAGE_BUTTON_LEFT_0: case SUBPAGE_BUTTON_LEFT_1: case SUBPAGE_BUTTON_LEFT_2: case SUBPAGE_BUTTON_LEFT_3: case SUBPAGE_BUTTON_LEFT_4: { pp_int32 i = currentActiveSubPageNum[currentActiveTabNum] - 1; if (i>=0) { showPage(currentActiveTabNum, i); update(); } break; } case SUBPAGE_BUTTON_RIGHT_0: case SUBPAGE_BUTTON_RIGHT_1: case SUBPAGE_BUTTON_RIGHT_2: case SUBPAGE_BUTTON_RIGHT_3: case SUBPAGE_BUTTON_RIGHT_4: { pp_int32 i = currentActiveSubPageNum[currentActiveTabNum] + 1; if (isize()) { showPage(currentActiveTabNum, i); update(); } break; } case BUTTON_SETTINGS_OK: { if (event->getID() != eCommand) break; showRestartMessageBox(); // Store new palette settings saveCurrentGlobalPalette(); storeCurrentPaletteToDatabase(); tracker.applySettings(tracker.settingsDatabase, tracker.settingsDatabaseCopy); // Store new mixer settings saveCurrentMixerSettings(*mixerSettings); show(false); tracker.sectionSamples->update(false); tracker.screen->paint(); break; } case BUTTON_SETTINGS_APPLY: { if (event->getID() != eCommand) break; showRestartMessageBox(); // Store new palette settings saveCurrentGlobalPalette(); storeCurrentPaletteToDatabase(); tracker.applySettings(tracker.settingsDatabase, tracker.settingsDatabaseCopy); // Store new mixer settings saveCurrentMixerSettings(*mixerSettings); update(false); tracker.sectionSamples->update(false); tracker.screen->paint(); delete tracker.settingsDatabaseCopy; tracker.settingsDatabaseCopy = new TrackerSettingsDatabase(*tracker.settingsDatabase); break; } case BUTTON_SETTINGS_CANCEL: { if (event->getID() != eCommand) break; cancelSettings(); break; } case BUTTON_SETTINGS_CHOOSEDRIVER: { if (event->getID() != eCommand) break; showSelectDriverMessageBox(); break; } case CHECKBOX_SETTINGS_RAMPING: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("RAMPING", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case BUTTON_SETTINGS_RESAMPLING: { if (event->getID() != eCommand) break; showResamplerMessageBox(); break; } case CHECKBOX_SETTINGS_FORCEPOWER2BUFF: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("FORCEPOWEROFTWOBUFFERSIZE", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_VIRTUALCHANNELS: { if (reinterpret_cast(sender)->isChecked()) tracker.settingsDatabase->store("VIRTUALCHANNELS", 32); else tracker.settingsDatabase->store("VIRTUALCHANNELS", 0); update(); break; } case BUTTON_SETTINGS_VIRTUALCHANNELS_PLUS: { pp_int32 v = tracker.settingsDatabase->restore("VIRTUALCHANNELS")->getIntValue() + 1; if (v > 99) v = 99; tracker.settingsDatabase->store("VIRTUALCHANNELS", v); update(); break; } case BUTTON_SETTINGS_VIRTUALCHANNELS_MINUS: { pp_int32 v = tracker.settingsDatabase->restore("VIRTUALCHANNELS")->getIntValue() - 1; if (v < 0) v = 0; tracker.settingsDatabase->store("VIRTUALCHANNELS", v); update(); break; } case CHECKBOX_SETTINGS_MULTICHN_RECORD: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("MULTICHN_RECORD", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_MULTICHN_KEYJAZZ: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("MULTICHN_KEYJAZZ", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_MULTICHN_EDIT: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("MULTICHN_EDIT", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_MULTICHN_RECORDKEYOFF: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("MULTICHN_RECORDKEYOFF", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_MULTICHN_RECORDNOTEDELAY: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("MULTICHN_RECORDNOTEDELAY", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_HEXCOUNT: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("HEXCOUNT", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_SHOWZEROEFFECT: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("SHOWZEROEFFECT", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_FULLSCREEN: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("FULLSCREEN", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_INSTRUMENTBACKTRACE: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("INSTRUMENTBACKTRACE", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_AUTORESIZE: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("PATTERNAUTORESIZE", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_TABTONOTE: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("TABTONOTE", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_CLICKTOCURSOR: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("CLICKTOCURSOR", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_WRAPCURSOR: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("WRAPAROUND", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_PROSPECTIVE: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("PROSPECTIVE", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case BUTTON_HIGHLIGHTMODULO1_PLUS: { pp_int32 v = tracker.settingsDatabase->restore("HIGHLIGHTMODULO1")->getIntValue() + 1; if (v > 99) v = 99; tracker.settingsDatabase->store("HIGHLIGHTMODULO1", v); update(); break; } case BUTTON_HIGHLIGHTMODULO1_MINUS: { pp_int32 v = tracker.settingsDatabase->restore("HIGHLIGHTMODULO1")->getIntValue() - 1; if (v < 1) v = 1; tracker.settingsDatabase->store("HIGHLIGHTMODULO1", v); update(); break; } case BUTTON_HIGHLIGHTMODULO2_PLUS: { pp_int32 v = tracker.settingsDatabase->restore("HIGHLIGHTMODULO2")->getIntValue() + 1; if (v > 99) v = 99; tracker.settingsDatabase->store("HIGHLIGHTMODULO2", v); update(); break; } case CHECKBOX_HIGHLIGHTMODULO1_FULLROW: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("HIGHLIGHTROW1", (pp_int32)reinterpret_cast(sender)->isChecked()); break; } case BUTTON_HIGHLIGHTMODULO2_MINUS: { pp_int32 v = tracker.settingsDatabase->restore("HIGHLIGHTMODULO2")->getIntValue() - 1; if (v < 1) v = 1; tracker.settingsDatabase->store("HIGHLIGHTMODULO2", v); update(); break; } case CHECKBOX_HIGHLIGHTMODULO2_FULLROW: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("HIGHLIGHTROW2", (pp_int32)reinterpret_cast(sender)->isChecked()); break; } case CHECKBOX_SETTINGS_SCOPES: { if (event->getID() != eCommand) break; mp_sint32 type = static_cast(sectionContainer->getControlByID(RADIOGROUP_SETTINGS_SCOPESAPPEARANCE))->getChoice(); mp_sint32 value = (reinterpret_cast(sender)->isChecked() ? 1 : 0) | (type << 1); tracker.settingsDatabase->store("SCOPES", value); update(); break; } //case CHECKBOX_SETTINGS_FOLLOWSONG: //{ // if (event->getID() != eCommand) // break; // tracker.settingsDatabase->store("FOLLOWSONG", (pp_int32)reinterpret_cast(sender)->isChecked()); // update(); // break; //} case CHECKBOX_SETTINGS_SAMPLEEDITORUNDO: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("SAMPLEEDITORUNDOBUFFER", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_AUTOMIXDOWNSAMPLES: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("AUTOMIXDOWNSAMPLES", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_AUTOESTPLAYTIME: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("AUTOESTPLAYTIME", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_SHOWSPLASH: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("SHOWSPLASH", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_INTERNALDISKBROWSER: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("INTERNALDISKBROWSER", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_TABSWITCHRESUMEPLAY: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("TABS_TABSWITCHRESUMEPLAY", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case CHECKBOX_SETTINGS_LOADMODULEINNEWTAB: { if (event->getID() != eCommand) break; tracker.settingsDatabase->store("TABS_LOADMODULEINNEWTAB", (pp_int32)reinterpret_cast(sender)->isChecked()); update(); break; } case BUTTON_COLOR_EXPORT: { if (event->getID() != eCommand) break; exportCurrentColorPalette(); break; } case BUTTON_COLOR_IMPORT: { if (event->getID() != eCommand) break; importCurrentColorPalette(); break; } case BUTTON_COLOR_PREVIEW: { if (event->getID() != eCommand) break; updateCurrentColors(); break; } case BUTTON_COLOR_RESTORE: { if (event->getID() != eCommand) break; showRestorePaletteMessageBox(); break; } // predefined color handling case BUTTON_COLOR_PREDEF_0: case BUTTON_COLOR_PREDEF_1: case BUTTON_COLOR_PREDEF_2: case BUTTON_COLOR_PREDEF_3: case BUTTON_COLOR_PREDEF_4: case BUTTON_COLOR_PREDEF_5: { if (event->getID() != eCommand) break; pp_int32 i = reinterpret_cast(sender)->getID() - BUTTON_COLOR_PREDEF_0; if (storePalette) { TColorPalette pal; colorDescriptors[getColorIndex()].colorCopy = currentColor; pal.numColors = GlobalColorConfig::ColorLast; for (pp_int32 j = 0; j < pal.numColors; j++) pal.colors[j] = colorDescriptors[j].colorCopy; predefinedColorPalettes->store(i, pal); storePalette = !storePalette; PPButton* button = static_cast(currentActivePageContainer->getControlByID(BUTTON_COLOR_PREDEF_STORE)); if (!button) break; button->setPressed(storePalette); } else { const TColorPalette* pal = predefinedColorPalettes->restore(i); for (i = 0; i < pal->numColors; i++) { if (i < GlobalColorConfig::ColorLast) { colorDescriptors[i].colorCopy = pal->colors[i]; } } currentColor = colorDescriptors[getColorIndex()].colorCopy; } update(); break; } case BUTTON_COLOR_PREDEF_STORE: { if (event->getID() != eCommand) break; storePalette = !storePalette; PPButton* button = reinterpret_cast(sender); button->setPressed(storePalette); tracker.screen->paintControl(button); break; } case BUTTON_COLOR_COPY: { if (event->getID() != eCommand) break; if (colorCopy == NULL) colorCopy = new PPColor(); *colorCopy = currentColor; update(); break; } case BUTTON_COLOR_PASTE: { if (event->getID() != eCommand || colorCopy == NULL) break; currentColor = *colorCopy; colorDescriptors[getColorIndex()].colorCopy = currentColor; update(); break; } case BUTTON_COLOR_DARKER: { currentColor.scale(0.5f); colorDescriptors[getColorIndex()].colorCopy = currentColor; update(); break; } case BUTTON_COLOR_BRIGHTER: { currentColor.scale(2.0f); colorDescriptors[getColorIndex()].colorCopy = currentColor; update(); break; } case BUTTON_RESOLUTIONS_CUSTOM: { if (event->getID() != eCommand) break; showCustomResolutionMessageBox(); break; } case BUTTON_RESOLUTIONS_FULL: { if (event->getID() != eCommand) break; retrieveDisplayResolution(); break; } } } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { case SLIDER_SETTINGS_BUFFERSIZE: { pp_uint32 v = (reinterpret_cast(sender)->getCurrentValue()+1) << 5; tracker.settingsDatabase->store("BUFFERSIZE", v); update(); break; } case SLIDER_SETTINGS_MIXERVOL: { pp_uint32 v = reinterpret_cast(sender)->getCurrentValue(); tracker.settingsDatabase->store("MIXERVOLUME", v); update(); break; } case SLIDER_SPACING: { pp_uint32 v = reinterpret_cast(sender)->getCurrentValue(); tracker.settingsDatabase->store("SPACING", v); update(); break; } case SLIDER_MUTEFADE: { pp_uint32 v = reinterpret_cast(sender)->getCurrentValue(); tracker.settingsDatabase->store("MUTEFADE", v); update(); break; } // Color manipulation case SLIDER_COLOR_RED: currentColor.r = reinterpret_cast(sender)->getCurrentValue(); colorDescriptors[getColorIndex()].colorCopy = currentColor; update(); break; case SLIDER_COLOR_GREEN: currentColor.g = reinterpret_cast(sender)->getCurrentValue(); colorDescriptors[getColorIndex()].colorCopy = currentColor; update(); break; case SLIDER_COLOR_BLUE: currentColor.b = reinterpret_cast(sender)->getCurrentValue(); colorDescriptors[getColorIndex()].colorCopy = currentColor; update(); break; } } else if (event->getID() == eSelection) { switch (reinterpret_cast(sender)->getID()) { /*case RADIOGROUP_SETTINGS_PAGE: { showPage(reinterpret_cast(sender)->getChoice()); update(); break; }*/ case RADIOGROUP_SETTINGS_AMPLIFY: { pp_int32 v = reinterpret_cast(sender)->getChoice(); tracker.settingsDatabase->store("MIXERSHIFT", v); update(); break; } case RADIOGROUP_SETTINGS_MIXFREQ: { pp_int32 v = reinterpret_cast(sender)->getChoice(); ASSERT(v >= 0 && v < TrackerConfig::numMixFrequencies); tracker.settingsDatabase->store("MIXERFREQ", TrackerConfig::mixFrequencies[v]); update(); break; } case RADIOGROUP_SETTINGS_FREQTAB: { // stop song without resetting main volume tracker.ensureSongStopped(false, false); pp_uint32 v = reinterpret_cast(sender)->getChoice(); tracker.moduleEditor->setFrequency((ModuleEditor::Frequencies)v); update(); tracker.ensureSongPlaying(true); break; } case RADIOGROUP_SETTINGS_PATTERNFONT: { pp_int32 v = reinterpret_cast(sender)->getChoice(); tracker.settingsDatabase->store("PATTERNFONT", v); update(); break; } case RADIOGROUP_SETTINGS_EDITMODE: { pp_int32 v = reinterpret_cast(sender)->getChoice(); #ifdef __LOWRES__ if (v != 0) { SystemMessage message(*tracker.screen, SystemMessage::MessageLimitedInput); message.show(); } #endif tracker.settingsDatabase->store("EDITMODE", v); update(); break; } case RADIOGROUP_SETTINGS_SCROLLMODE: { pp_int32 v = reinterpret_cast(sender)->getChoice(); tracker.settingsDatabase->store("SCROLLMODE", v); update(); break; } case RADIOGROUP_SETTINGS_SCOPESAPPEARANCE: { pp_int32 v = reinterpret_cast(sender)->getChoice(); pp_int32 res = (tracker.settingsDatabase->restore("SCOPES")->getIntValue() & 1) | (v << 1); tracker.settingsDatabase->store("SCOPES", res); update(); break; } case RADIOGROUP_SETTINGS_MAGNIFY: { pp_int32 v = reinterpret_cast(sender)->getChoice(); tracker.settingsDatabase->store("SCREENSCALEFACTOR", 1 << v); update(); break; } case LISTBOX_SETTINGS_RESOLUTIONS: { pp_int32 v = *((pp_int32*)event->getDataPtr()); if (v < NUMRESOLUTIONS-1) { tracker.settingsDatabase->store("XRESOLUTION", resolutions[v].width); tracker.settingsDatabase->store("YRESOLUTION", resolutions[v].height); } update(); } case LISTBOX_COLORS: { currentColor = colorDescriptors[getColorIndex()].colorCopy; update(); break; } case LISTBOX_SETTINGS_FONTFAMILIES: { enumerateFontFacesInListBox(*((pp_int32*)event->getDataPtr())); update(); break; } case LISTBOX_SETTINGS_FONTENTRIES: { pp_int32 index = *((pp_int32*)event->getDataPtr()); //PPFont::selectFontFace((PPFont::FontID)listBoxFontFamilies->getSelectedIndex(), listBoxFontEntries->getItem(index)); tracker.settingsDatabase->store(PPFont::getFamilyInternalName((PPFont::FontID)listBoxFontFamilies->getSelectedIndex()), listBoxFontEntries->getItem(index)); update(); break; } case RADIOGROUP_SETTINGS_STOPBACKGROUNDBEHAVIOUR: { pp_int32 v = reinterpret_cast(sender)->getChoice(); tracker.settingsDatabase->store("TABS_STOPBACKGROUNDBEHAVIOUR", v); update(); break; } } } return 0; } void SectionSettings::showSection(bool bShow) { sectionContainer->show(bShow); } void SectionSettings::show(bool bShow) { SectionAbstract::show(bShow); PPScreen* screen = tracker.screen; visible = bShow; if (!initialised) { init(); } if (initialised) { PatternEditorControl* control = tracker.getPatternEditorControl(); if (bShow) { tracker.showMainMenu(false, true); update(false); if (control) { /*#ifndef control->setLocation(PPPoint(0, SECTIONHEIGHT)); control->setSize(PPSize(screen->getWidth(),screen->getHeight()-SECTIONHEIGHT));*/ #ifdef __LOWRES__ control->setLocation(PPPoint(0, 0)); control->setSize(PPSize(screen->getWidth(),tracker.MAXEDITORHEIGHT()-SECTIONHEIGHT)); #endif } tracker.hideInputControl(); // backup current palette saveCurrentGlobalPalette(); updateColors(); // backup current color currentColor = colorDescriptors[getColorIndex()].colorCopy; // backup current mixer settings saveCurrentMixerSettings(*mixerSettings); } else { tracker.showMainMenu(true, true); tracker.rearrangePatternEditorControl(); } showSection(bShow); // why should we do that? just show the last active tab //showPage(0); screen->paint(); } } void SectionSettings::cancelSettings() { restoreCurrentGlobalPalette(); restoreCurrentMixerSettings(); if (tracker.settingsDatabaseCopy) { tracker.applySettings(tracker.settingsDatabaseCopy, tracker.settingsDatabase, false); delete tracker.settingsDatabase; tracker.settingsDatabase = tracker.settingsDatabaseCopy; tracker.settingsDatabaseCopy = NULL; } show(false); } void SectionSettings::init() { #ifndef __LOWRES__ init(0,0); #else init(0,tracker.screen->getHeight()-SECTIONHEIGHT); #endif } void SectionSettings::init(pp_int32 x, pp_int32 y) { pp_int32 i; PPScreen* screen = tracker.screen; pp_int32 y2 = y; sectionContainer = new PPContainer(CONTAINER_SETTINGS, screen, this, PPPoint(x, y2), PPSize(screen->getWidth(),SECTIONHEIGHT), false); static_cast(sectionContainer)->setColor(TrackerConfig::colorThemeMain); #ifdef __LOWRES__ pp_int32 x2 = 0; #else pp_int32 x2 = 160; #endif while (x2 < screen->getWidth()) { sectionContainer->addControl(new PPSeperator(0, screen, PPPoint(x2 + 158, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); x2+=TabPage::getWidth(); } tabPages.get(0)->add(new TabPageIO_1(PAGE_IO_1, *this)); tabPages.get(0)->add(new TabPageIO_2(PAGE_IO_2, *this)); tabPages.get(0)->add(new TabPageIO_3(PAGE_IO_3, *this)); tabPages.get(1)->add(new TabPageLayout_1(PAGE_LAYOUT_1, *this)); tabPages.get(1)->add(new TabPageLayout_2(PAGE_LAYOUT_2, *this)); #ifndef __LOWRES__ tabPages.get(1)->add(new TabPageLayout_3(PAGE_LAYOUT_3, *this)); tabPages.get(1)->add(new TabPageLayout_4(PAGE_LAYOUT_4, *this)); #endif tabPages.get(2)->add(new TabPageFonts_1(PAGE_FONTS_1, *this)); tabPages.get(2)->add(new TabPageFonts_2(PAGE_FONTS_2, *this)); tabPages.get(3)->add(new TabPageMisc_1(PAGE_MISC_1, *this)); tabPages.get(3)->add(new TabPageMisc_2(PAGE_MISC_2, *this)); tabPages.get(3)->add(new TabPageMisc_3(PAGE_MISC_3, *this)); #ifndef __LOWRES__ tabPages.get(4)->add(new TabPageTabs_1(PAGE_TABS_1, *this)); #endif for (i = 0; i < tabPages.size(); i++) for (pp_int32 j = 0; j < tabPages.get(i)->size(); j++) { tabPages.get(i)->get(j)->init(screen); sectionContainer->addControl(tabPages.get(i)->get(j)->getContainer()); } PPButton* button; const pp_int32 numSettingsPages = NUMSETTINGSPAGES; #ifndef __LOWRES__ const char* subSettingsTexts[] = {"I/O","Layout","Fonts","Misc.","Tabs"}; x2 = x; static_cast(sectionContainer)->addControl(new PPSeperator(0, screen, PPPoint(x2 + 156, y+4), SECTIONHEIGHT-8, TrackerConfig::colorThemeMain, false)); static_cast(sectionContainer)->addControl(new PPSeperator(0, screen, PPPoint(x2 - 2, y+SECTIONHEIGHT-2-12-6), 157, TrackerConfig::colorThemeMain, true)); pp_int32 bWidth = 140 - 14*2; pp_int32 bHeight = ((SECTIONHEIGHT - 2-12-6) - 8) / numSettingsPages; pp_int32 sx = x2 + 10; pp_int32 sy = y2 + 4; for (i = 0; i < numSettingsPages; i++) { button = new PPButton(PAGE_BUTTON_0+i, screen, this, PPPoint(sx, sy), PPSize(bWidth, bHeight), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText(subSettingsTexts[i]); static_cast(sectionContainer)->addControl(button); button = new PPButton(SUBPAGE_BUTTON_LEFT_0+i, screen, this, PPPoint(sx+140-14*2+1, sy), PPSize(14, bHeight), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("<"); static_cast(sectionContainer)->addControl(button); button = new PPButton(SUBPAGE_BUTTON_RIGHT_0+i, screen, this, PPPoint(sx+140-14+1, sy), PPSize(14, bHeight), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText(">"); static_cast(sectionContainer)->addControl(button); sy+=bHeight; } x2++; #else const char* subSettingsTexts[] = {"I/O","Layout","Fonts","Misc."}; x2 = screen->getWidth()-160 + 4; //static_cast(sectionContainer)->addControl(new PPSeperator(0, screen, PPPoint(x2 - 4, y+4), UPPERFRAMEHEIGHT-8, TrackerConfig::colorThemeMain, false)); static_cast(sectionContainer)->addControl(new PPSeperator(0, screen, PPPoint(x + 2, y+UPPERFRAMEHEIGHT-4), screen->getWidth()-4, TrackerConfig::colorThemeMain, true)); pp_int32 bWidth = (screen->getWidth()-8-26) / numSettingsPages; pp_int32 bHeight = 13; pp_int32 sx = x + 4; pp_int32 sy = y + UPPERFRAMEHEIGHT; for (i = 0; i < numSettingsPages; i++) { button = new PPButton(PAGE_BUTTON_0+i, screen, this, PPPoint(sx, sy), PPSize(bWidth, bHeight), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText(subSettingsTexts[i]); static_cast(sectionContainer)->addControl(button); sx+=bWidth; } sx+=1; button = new PPButton(SUBPAGE_BUTTON_LEFT_0, screen, this, PPPoint(sx, sy), PPSize(13, bHeight), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("<"); static_cast(sectionContainer)->addControl(button); button = new PPButton(SUBPAGE_BUTTON_RIGHT_0, screen, this, PPPoint(sx+13, sy), PPSize(13, bHeight), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText(">"); static_cast(sectionContainer)->addControl(button); //static_cast(sectionContainer)->addControl(new PPSeperator(0, screen, PPPoint(x + 2, sy + bHeight + 1), screen->getWidth()-4, TrackerConfig::colorThemeMain, true)); #endif button = new PPButton(BUTTON_SETTINGS_OK, screen, this, PPPoint(x2+3, y+SECTIONHEIGHT-2-12), PPSize(46, 11)); button->setText("Ok"); static_cast(sectionContainer)->addControl(button); button = new PPButton(BUTTON_SETTINGS_APPLY, screen, this, PPPoint(x2+3+48, y+SECTIONHEIGHT-2-12), PPSize(48, 11)); button->setText("Apply"); static_cast(sectionContainer)->addControl(button); button = new PPButton(BUTTON_SETTINGS_CANCEL, screen, this, PPPoint(x2+3+48+50, y+SECTIONHEIGHT-2-12), PPSize(50, 11)); button->setText("Cancel"); static_cast(sectionContainer)->addControl(button); screen->addControl(sectionContainer); initialised = true; showPage(0, 0); showSection(false); } void SectionSettings::update(bool repaint/* = true*/) { if (!initialised || !visible) return; pp_int32 i, j; #ifdef __LOWRES__ pp_int32 x = 0; #else pp_int32 x = 160; #endif pp_int32 y = sectionContainer->getLocation().y; #ifdef __LOWRES__ static_cast(sectionContainer->getControlByID(SUBPAGE_BUTTON_LEFT_0))->enable(false); static_cast(sectionContainer->getControlByID(SUBPAGE_BUTTON_RIGHT_0))->enable(false); #endif // hide all tab pages first for (i = 0; i < tabPages.size(); i++) { for (j = 0; j < tabPages.get(i)->size(); j++) { tabPages.get(i)->get(j)->getContainer()->show(false); tabPages.get(i)->get(j)->setVisible(false); } #ifndef __LOWRES__ static_cast(sectionContainer->getControlByID(SUBPAGE_BUTTON_LEFT_0+i))->enable(false); static_cast(sectionContainer->getControlByID(SUBPAGE_BUTTON_RIGHT_0+i))->enable(false); #endif } PPPoint location(x, y); pp_int32 lastVisiblePage = 0; for (j = 0; j < tabPages.get(currentActiveTabNum)->size(); j++) { if (j + currentActivePageStart < tabPages.get(currentActiveTabNum)->size()) { TabPage* page = tabPages.get(currentActiveTabNum)->get(j + currentActivePageStart); page->setLocation(location); location.x+=TabPage::getWidth(); if (location.x <= tracker.screen->getWidth()) { page->getContainer()->show(true); page->setVisible(true); lastVisiblePage = j + currentActivePageStart; } } else { location.x+=TabPage::getWidth(); } } i = currentActiveTabNum; #ifdef __LOWRES__ i = 0; #endif PPButton* button = static_cast(sectionContainer->getControlByID(SUBPAGE_BUTTON_RIGHT_0+i)); button->enable(lastVisiblePage < tabPages.get(currentActiveTabNum)->size() - 1); button = static_cast(sectionContainer->getControlByID(SUBPAGE_BUTTON_LEFT_0+i)); button->enable(currentActivePageStart > 0); // update all visible pages for (i = 0; i < tabPages.size(); i++) { for (j = 0; j < tabPages.get(i)->size(); j++) if (tabPages.get(i)->get(j)-isVisible()) { tabPages.get(i)->get(j)->update(tracker.screen, tracker.settingsDatabase, *tracker.moduleEditor); } } tracker.screen->paintControl(sectionContainer, false); if (repaint) tracker.screen->update(); } void SectionSettings::showPage(pp_int32 page, pp_int32 subPage/* = 0*/) { currentActiveTabNum = page; currentActivePageStart = subPage; currentActiveSubPageNum[currentActiveTabNum] = subPage; for (pp_int32 i = 0; i < NUMSETTINGSPAGES; i++) static_cast(static_cast(sectionContainer)->getControlByID(PAGE_BUTTON_0+i))->setPressed(false); static_cast(static_cast(sectionContainer)->getControlByID(PAGE_BUTTON_0+page))->setPressed(true); currentActiveSubPageNum[currentActiveTabNum] = subPage; } void SectionSettings::initColorDescriptors() { for (pp_int32 i = 0; i < GlobalColorConfig::ColorLast; i++) colorDescriptors[i].readableDecription = GlobalColorConfig::getInstance()->getColorReadableDescription((GlobalColorConfig::GlobalColors)i); } void SectionSettings::updateColors() { for (pp_int32 i = 0; i < GlobalColorConfig::ColorLast; i++) colorDescriptors[i].colorCopy = GlobalColorConfig::getInstance()->getColor((GlobalColorConfig::GlobalColors)i); } pp_int32 SectionSettings::getNumPredefinedColorPalettes() { return TrackerConfig::numPredefinedColorPalettes; } PPString SectionSettings::getEncodedPalette(pp_int32 index) { return ColorPaletteContainer::encodePalette(*predefinedColorPalettes->restore(index)); } void SectionSettings::setEncodedPalette(pp_int32 index, const PPString& str) { TColorPalette p = ColorPaletteContainer::decodePalette(str); predefinedColorPalettes->store(index, p); } void SectionSettings::storeCurrentPaletteToDatabase() { TColorPalette pal; pal.numColors = GlobalColorConfig::ColorLast; for (pp_int32 j = 0; j < pal.numColors; j++) pal.colors[j] = colorDescriptors[j].colorCopy; tracker.settingsDatabase->store("ACTIVECOLORS", ColorPaletteContainer::encodePalette(pal)); } void SectionSettings::saveCurrentGlobalPalette() { palette->numColors = GlobalColorConfig::ColorLast; for (pp_int32 i = 0; i < GlobalColorConfig::ColorLast; i++) { if (i < palette->numColors) palette->colors[i] = GlobalColorConfig::getInstance()->getColor((GlobalColorConfig::GlobalColors)i); } } void SectionSettings::restoreCurrentGlobalPalette() { for (pp_int32 i = 0; i < palette->numColors; i++) { if (i < GlobalColorConfig::ColorLast) GlobalColorConfig::getInstance()->setColor((GlobalColorConfig::GlobalColors)i, palette->colors[i]); } } void SectionSettings::updateCurrentColors() { for (pp_int32 i = 0; i < GlobalColorConfig::ColorLast; i++) GlobalColorConfig::getInstance()->setColor((GlobalColorConfig::GlobalColors)i, colorDescriptors[i].colorCopy); tracker.screen->paint(); } void SectionSettings::restorePalettes() { pp_int32 i; for (i = 0; i < getNumPredefinedColorPalettes(); i++) { predefinedColorPalettes->store(i, ColorPaletteContainer::decodePalette(TrackerConfig::predefinedColorPalettes[i])); } *palette = ColorPaletteContainer::decodePalette(TrackerConfig::predefinedColorPalettes[0]); restoreCurrentGlobalPalette(); for (i = 0; i < palette->numColors; i++) if (i < GlobalColorConfig::ColorLast) colorDescriptors[i].colorCopy = palette->colors[i]; currentColor = colorDescriptors[getColorIndex()].colorCopy; tracker.screen->paint(); } void SectionSettings::saveCurrentMixerSettings(TMixerSettings& settings) { tracker.getMixerSettingsFromDatabase(settings, *tracker.settingsDatabase); } void SectionSettings::restoreCurrentMixerSettings() { TMixerSettings newMixerSettings; tracker.getMixerSettingsFromDatabase(newMixerSettings, *tracker.settingsDatabase); if (*mixerSettings != newMixerSettings) { bool res = tracker.playerMaster->applyNewMixerSettings(*mixerSettings, true); if (!res) { SystemMessage message(*tracker.screen, SystemMessage::MessageSoundDriverInitFailed); message.show(); } } } void SectionSettings::showCustomResolutionMessageBox() { if (dialog) { delete dialog; dialog = NULL; } dialog = new DialogWithValues(tracker.screen, responder, RESPONDMESSAGEBOX_CUSTOMRESOLUTION, "Enter custom resolution"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues); static_cast(dialog)->setValueOneCaption("Width in pixels:"); static_cast(dialog)->setValueTwoCaption("Height in pixels:"); static_cast(dialog)->setValueOneRange(MINWIDTH, 10000.0f, 0); static_cast(dialog)->setValueTwoRange(MINHEIGHT, 10000.0f, 0); static_cast(dialog)->setValueOneIncreaseStep(1.0f); static_cast(dialog)->setValueTwoIncreaseStep(1.0f); pp_int32 width = tracker.settingsDatabase->restore("XRESOLUTION")->getIntValue(); pp_int32 height = tracker.settingsDatabase->restore("YRESOLUTION")->getIntValue(); static_cast(dialog)->setValueOne((float)width); static_cast(dialog)->setValueTwo((float)height); dialog->show(); } void SectionSettings::showRestorePaletteMessageBox() { if (dialog) { delete dialog; dialog = NULL; } dialog = new PPDialogBase(tracker.screen, responder, RESPONDMESSAGEBOX_RESTOREPALETTES, "Restore all default palettes?"); dialog->show(); } void SectionSettings::showSelectDriverMessageBox() { if (dialog) { delete dialog; dialog = NULL; } dialog = new DialogListBox(tracker.screen, responder, RESPONDMESSAGEBOX_SELECTAUDIODRV, "Select audio driver", true); PPListBox* listBox = static_cast(dialog)->getListBox(); mp_sint32 i = 0; mp_sint32 selectedIndex = -1; const char* name = tracker.playerMaster->getFirstDriverName(); //const char* curDrvName = tracker.playerController->getCurrentDriverName(); const char* curDrvName = tracker.settingsDatabase->restore("AUDIODRIVER")->getStringValue(); while (name) { if (strcmp(name, curDrvName) == 0) selectedIndex = i; listBox->addItem(name); name = tracker.playerMaster->getNextDriverName(); i++; } if (selectedIndex != -1) listBox->setSelectedIndex(selectedIndex, false); dialog->show(); } void SectionSettings::showResamplerMessageBox() { if (dialog) { delete dialog; dialog = NULL; } dialog = new DialogListBox(tracker.screen, responder, RESPONDMESSAGEBOX_SELECTRESAMPLER, "Select Resampler", true); PPListBox* listBox = static_cast(dialog)->getListBox(); ResamplerHelper resamplerHelper; for (pp_uint32 i = 0; i < resamplerHelper.getNumResamplers(); i++) listBox->addItem(resamplerHelper.getResamplerName(i)); listBox->setSelectedIndex(tracker.settingsDatabase->restore("INTERPOLATION")->getIntValue(), false); dialog->show(); } void SectionSettings::storeAudioDriver(const char* driverName) { const char* curDrvName = tracker.playerMaster->getCurrentDriverName(); if (strcmp(curDrvName, driverName) != 0) { tracker.settingsDatabase->store("AUDIODRIVER", driverName); TMixerSettings newMixerSettings; saveCurrentMixerSettings(newMixerSettings); bool res = tracker.playerMaster->applyNewMixerSettings(newMixerSettings, true); if (!res) { SystemMessage message(*tracker.screen, SystemMessage::MessageSoundDriverInitFailed); message.show(); } } update(); } void SectionSettings::storeResampler(pp_uint32 resampler) { tracker.settingsDatabase->store("INTERPOLATION", resampler); TMixerSettings newMixerSettings; newMixerSettings.resampler = resampler; bool res = tracker.playerMaster->applyNewMixerSettings(newMixerSettings, true); if (!res) { SystemMessage message(*tracker.screen, SystemMessage::MessageSoundDriverInitFailed); message.show(); } } void SectionSettings::enumerateFontFacesInListBox(pp_uint32 fontID) { listBoxFontEntries->clear(); const char* name = PPFont::getFirstFontEntryName((PPFont::FontID)fontID); while (name) { listBoxFontEntries->addItem(name); name = PPFont::getNextFontEntryName((PPFont::FontID)fontID); } } void SectionSettings::storeCustomResolution() { pp_int32 width = (pp_int32)static_cast(dialog)->getValueOne(); pp_int32 height = (pp_int32)static_cast(dialog)->getValueTwo(); if (width < MINWIDTH) width = MINWIDTH; if (height < MINHEIGHT) height = MINHEIGHT; tracker.settingsDatabase->store("XRESOLUTION", width); tracker.settingsDatabase->store("YRESOLUTION", height); update(); } void SectionSettings::importCurrentColorPalette() { FileExtProvider fileExtProvider; PPOpenPanel panel(tracker.screen, "Open colors"); panel.addExtensions(fileExtProvider.getColorExtensions()); if (panel.runModal() == PPModalDialog::ReturnCodeOK) { TColorPalette pal; ColorExportImport exportImport(panel.getFileName()); if (exportImport.importColorPalette(pal)) { for (pp_int32 j = 0; j < pal.numColors; j++) colorDescriptors[j].colorCopy = pal.colors[j]; currentColor = colorDescriptors[getColorIndex()].colorCopy; update(); lastColorFile = panel.getFileName(); } else { tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Unrecognized type/corrupt file", Tracker::MessageBox_OK); } } } void SectionSettings::exportCurrentColorPalette() { FileExtProvider fileExtProvider; PPSystemString fileName = lastColorFile.stripPath().stripExtension(); fileName.append("."); fileName.append(fileExtProvider.getColorExtension(FileExtProvider::ColorExtensionMCT)); PPSavePanel panel(tracker.screen, "Save colors", fileName); panel.addExtensions(fileExtProvider.getColorExtensions()); if (panel.runModal() == PPModalDialog::ReturnCodeOK) { TColorPalette pal; pal.numColors = GlobalColorConfig::ColorLast; for (pp_int32 j = 0; j < pal.numColors; j++) pal.colors[j] = colorDescriptors[j].colorCopy; ColorExportImport exportImport(panel.getFileName()); if (!exportImport.exportColorPalette(pal)) { tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Could not create file", Tracker::MessageBox_OK); } } } void SectionSettings::retrieveDisplayResolution() { PPSize size = tracker.screen->getDisplayResolution(); if (size.width > 0 && size.height > 0) { if (size.width < MINWIDTH) size.width = MINWIDTH; if (size.height < MINHEIGHT) size.height = MINHEIGHT; tracker.settingsDatabase->store("XRESOLUTION", size.width); tracker.settingsDatabase->store("YRESOLUTION", size.height); update(); } else { tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Could not retrieve display resolution", Tracker::MessageBox_OK); } } milkytracker-0.90.85+dfsg/src/tracker/SectionAdvancedEdit.cpp0000644000175000017500000002755011150223367023222 0ustar admin2admin2/* * tracker/SectionAdvancedEdit.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionAdvancedEdit.cpp * MilkyTracker * * Created by Peter Barth on 10.05.05. * */ #include "SectionAdvancedEdit.h" #include "Tracker.h" #include "ToolInvokeHelper.h" #include "TrackerConfig.h" #include "ModuleEditor.h" #include "CheckBox.h" #include "Container.h" #include "RadioGroup.h" #include "Seperator.h" #include "StaticText.h" #include "PatternEditorControl.h" #include "PatternTools.h" #include "Tools.h" #include "ControlIDs.h" enum ControlIDs { ADVEDIT_BUTTON_EXIT = 32000, ADVEDIT_BUTTON_INSREMAP, ADVEDIT_BUTTON_INTERPOLATE, ADVEDIT_BUTTON_VOLSCALETRACK, ADVEDIT_BUTTON_VOLSCALEPATTERN, ADVEDIT_BUTTON_VOLSCALEBLOCK, ADVEDIT_BUTTON_SPLITBLOCK, ADVEDIT_BUTTON_SPLITTRACK, ADVEDIT_BUTTON_SPLITTRACKPLUS, ADVEDIT_BUTTON_SPLITTRACKMINUS, ADVEDIT_CHECKBOX_SPLITTRACK, ADVEDIT_CHECKBOX_SPLITTRACKNOTEOFF, ADVEDIT_TEXT_SPLITTRACK, ADVEDIT_RADIO_CONVERT, ADVEDIT_BUTTON_CONVERT, ADVEDIT_RADIO_REMOVE, ADVEDIT_BUTTON_REMOVE }; SectionAdvancedEdit::SectionAdvancedEdit(Tracker& theTracker) : SectionUpperLeft(theTracker), splitTrackNumSubsequentChannels(1), checkBoxSplitTrack(NULL), checkBoxSplitTrackNoteOff(NULL) { } SectionAdvancedEdit::~SectionAdvancedEdit() { } pp_int32 SectionAdvancedEdit::handleEvent(PPObject* sender, PPEvent* event) { PPScreen* screen = tracker.screen; char buffer[100]; if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case ADVEDIT_BUTTON_INSREMAP: if (event->getID() != eCommand) break; tracker.initAdvEdit(); break; case ADVEDIT_BUTTON_INTERPOLATE: { if (event->getID() != eCommand) break; pp_int32 res = tracker.getPatternEditor()->interpolateValuesInSelection(); if (res) screen->paint(); else tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Please select at least 2 values.", Tracker::MessageBox_OK); break; } case ADVEDIT_BUTTON_VOLSCALETRACK: { if (event->getID() != eCommand) break; tracker.toolInvokeHelper->invokeTool(ToolInvokeHelper::ToolTypeTrackVolumeScale); break; } case ADVEDIT_BUTTON_VOLSCALEPATTERN: { if (event->getID() != eCommand) break; tracker.toolInvokeHelper->invokeTool(ToolInvokeHelper::ToolTypePatternVolumeScale); break; } case ADVEDIT_BUTTON_VOLSCALEBLOCK: { if (event->getID() != eCommand) break; tracker.toolInvokeHelper->invokeTool(ToolInvokeHelper::ToolTypeSelectionVolumeScale); break; } case ADVEDIT_BUTTON_SPLITTRACKPLUS: { splitTrackNumSubsequentChannels++; if (splitTrackNumSubsequentChannels >= (signed)tracker.moduleEditor->getNumChannels()) splitTrackNumSubsequentChannels = (signed)tracker.moduleEditor->getNumChannels()-1; if (splitTrackNumSubsequentChannels < 1) splitTrackNumSubsequentChannels = 1; update(); break; } case ADVEDIT_BUTTON_SPLITTRACKMINUS: { splitTrackNumSubsequentChannels--; if (splitTrackNumSubsequentChannels < 1) splitTrackNumSubsequentChannels = 1; update(); break; } case ADVEDIT_BUTTON_SPLITTRACK: { if (event->getID() != eCommand) break; pp_int32 res = tracker.getPatternEditor()->splitTrack(splitTrackNumSubsequentChannels, checkBoxSplitTrack->isChecked(), checkBoxSplitTrackNoteOff->isChecked()); if (res>=0) screen->paint(); else tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Please select only within one track.", Tracker::MessageBox_OK); break; } case ADVEDIT_BUTTON_CONVERT: { if (event->getID() != eCommand) break; pp_int32 res = 0; switch (static_cast(static_cast(sectionContainer)->getControlByID(ADVEDIT_RADIO_CONVERT))->getChoice()) { case 0: res = tracker.moduleEditor->panConvertSong(ModuleEditor::PanConversionTypeConvert_E8x); break; case 1: res = tracker.moduleEditor->panConvertSong(ModuleEditor::PanConversionTypeConvert_80x); break; } if (res) sprintf(buffer, "%i commands have been converted", res); else sprintf(buffer, "Nothing to do", res); tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, buffer, Tracker::MessageBox_OK); break; } case ADVEDIT_BUTTON_REMOVE: { pp_int32 res = 0; switch (static_cast(static_cast(sectionContainer)->getControlByID(ADVEDIT_RADIO_REMOVE))->getChoice()) { case 0: res = tracker.moduleEditor->panConvertSong(ModuleEditor::PanConversionTypeRemove_E8x); break; case 1: res = tracker.moduleEditor->panConvertSong(ModuleEditor::PanConversionTypeRemove_8xx); break; } if (res) sprintf(buffer, "%i commands have been erased", res); else sprintf(buffer, "Nothing to do", res); tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, buffer, Tracker::MessageBox_OK); break; } case ADVEDIT_BUTTON_EXIT: if (event->getID() != eCommand) break; show(false); break; } } return 0; } void SectionAdvancedEdit::init(pp_int32 px, pp_int32 py) { PPScreen* screen = tracker.screen; PPContainer* container = new PPContainer(CONTAINER_ADVEDIT, tracker.screen, this, PPPoint(px, py), PPSize(320,UPPERLEFTSECTIONHEIGHT), false); container->setColor(TrackerConfig::colorThemeMain); tracker.screen->addControl(container); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(px + 2, py + 2), "Advanced editing", true, true)); PPSize size = container->getSize(); pp_int32 buttonWidth = 8*4+4; pp_int32 buttonHeight = 11; pp_int32 x = px+container->getSize().width-(buttonWidth+4); pp_int32 y = py+container->getSize().height-(buttonHeight+4); container->addControl(new PPSeperator(0, screen, PPPoint(x - 6, y - 5), 5 + buttonHeight + 3, TrackerConfig::colorThemeMain, false)); container->addControl(new PPSeperator(0, screen, PPPoint(px+2, y - 5), container->getSize().width-5, container->getColor(), true)); PPButton* button = new PPButton(ADVEDIT_BUTTON_EXIT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Exit"); container->addControl(button); x = px+4; y = py+4+12; buttonWidth = 76; button = new PPButton(ADVEDIT_BUTTON_INSREMAP, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Remap Ins"); container->addControl(button); x+=button->getSize().width+1; buttonWidth = 68; button = new PPButton(ADVEDIT_BUTTON_INTERPOLATE, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Interpol"); container->addControl(button); x+=button->getSize().width+2; container->addControl(new PPSeperator(0, screen, PPPoint(x, py), 30, container->getColor(), false)); x+=4; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x, py + 2), "Volume scale", true, true)); x+=1; buttonWidth = (container->getSize().width - 5 - (x-px)) / 3; button = new PPButton(ADVEDIT_BUTTON_VOLSCALETRACK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Track"); container->addControl(button); x+=button->getSize().width+1; button = new PPButton(ADVEDIT_BUTTON_VOLSCALEPATTERN, screen, this, PPPoint(x, y), PPSize(buttonWidth-1,buttonHeight)); button->setText("Patt"); container->addControl(button); x+=button->getSize().width+1; button = new PPButton(ADVEDIT_BUTTON_VOLSCALEBLOCK, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Block"); container->addControl(button); y+=button->getSize().height+3; x = px; container->addControl(new PPSeperator(0, screen, PPPoint(x+2, y), size.width-5, container->getColor(), true)); pp_int32 y3 = y+1; y+=3; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y + 2), "Split track options:", true)); y+=12; container->addControl(new PPStaticText(ADVEDIT_TEXT_SPLITTRACK, NULL, NULL, PPPoint(x + 2, y + 2), "Use subsequent 00 channels", true)); button = new PPButton(ADVEDIT_BUTTON_SPLITTRACKPLUS, screen, this, PPPoint(x+214, y), PPSize(11, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(ADVEDIT_BUTTON_SPLITTRACKMINUS, screen, this, PPPoint(x+214+12, y), PPSize(11, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); y+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y + 2), "Block only", true)); checkBoxSplitTrack = new PPCheckBox(ADVEDIT_CHECKBOX_SPLITTRACK, screen, this, PPPoint(x + 11*8, y)); checkBoxSplitTrack->checkIt(false); container->addControl(checkBoxSplitTrack); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2 + 12*8 + 4, y + 2), "Insert note off", true)); checkBoxSplitTrackNoteOff = new PPCheckBox(ADVEDIT_CHECKBOX_SPLITTRACKNOTEOFF, screen, this, PPPoint(x + 28*8 + 3, y)); checkBoxSplitTrackNoteOff->checkIt(false); container->addControl(checkBoxSplitTrackNoteOff); y+=12; container->addControl(new PPSeperator(0, screen, PPPoint(x+2, y), size.width-5, container->getColor(), true)); container->addControl(new PPSeperator(0, screen, PPPoint(x + 240, y3), y-y3, TrackerConfig::colorThemeMain, false)); button = new PPButton(ADVEDIT_BUTTON_SPLITTRACK, screen, this, PPPoint(x + 253, y3 + 10), PPSize(54,20)); button->setText("Split"); container->addControl(button); y+=3; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 2, y + 2), "Panning conversion (entire song only)", true)); y+=13; PPRadioGroup* radioGroup = new PPRadioGroup(ADVEDIT_RADIO_CONVERT, screen, this, PPPoint(x, y-3), PPSize(80, 14)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setHorizontal(true); radioGroup->addItem("E8x"); radioGroup->addItem("80x"); container->addControl(radioGroup); x+=radioGroup->getSize().width+1+3; buttonWidth = 8*8+4; button = new PPButton(ADVEDIT_BUTTON_CONVERT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Convert"); container->addControl(button); x+=button->getSize().width; x+=12; radioGroup = new PPRadioGroup(ADVEDIT_RADIO_REMOVE, screen, this, PPPoint(x, y-3), PPSize(80, 14)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setHorizontal(true); radioGroup->addItem("E8x"); radioGroup->addItem("8xx"); container->addControl(radioGroup); x+=radioGroup->getSize().width+1+3; buttonWidth = 8*8+4; button = new PPButton(ADVEDIT_BUTTON_REMOVE, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Remove"); container->addControl(button); x+=button->getSize().width+1; sectionContainer = container; initialised = true; showSection(false); } void SectionAdvancedEdit::update(bool repaint/* = true*/) { char buffer[80]; PPContainer* container = static_cast(sectionContainer); ASSERT(sectionContainer); PPStaticText* text = static_cast(container->getControlByID(ADVEDIT_TEXT_SPLITTRACK)); sprintf(buffer, "Use subsequent %02i channels", splitTrackNumSubsequentChannels); text->setText(buffer); if (repaint) tracker.screen->paintControl(container); } milkytracker-0.90.85+dfsg/src/tracker/SectionInstruments.h0000644000175000017500000000625411150223367022705 0ustar admin2admin2/* * tracker/SectionInstruments.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionInstruments.h * MilkyTracker * * Created by Peter Barth on 15.04.05. * */ #ifndef SECTIONINSTRUMENTS__H #define SECTIONINSTRUMENTS__H #include "BasicTypes.h" #include "Event.h" #include "SectionAbstract.h" class PPControl; class EnvelopeEditorControl; class EnvelopeEditor; class PianoControl; class PPContainer; class EnvelopeContainer; class SectionInstruments : public SectionAbstract { private: PPContainer* containerEntire; PPContainer* containerEnvelopes; PPContainer* containerSampleSlider; PPContainer* containerInstrumentSlider; EnvelopeEditorControl* envelopeEditorControl; PianoControl* pianoControl; pp_int32 currentEnvelopeType; // 0 = Editing volume envelope, 1 = editing panning envelope bool visible; EnvelopeContainer* predefinedVolumeEnvelopes; EnvelopeContainer* predefinedPanningEnvelopes; bool storeEnvelope; EnvelopeEditor* getEnvelopeEditor(); protected: virtual void showSection(bool bShow); public: SectionInstruments(Tracker& tracker); virtual ~SectionInstruments(); // PPEvent listener virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init(); virtual void init(pp_int32 x, pp_int32 y); void realign(); virtual void show(bool bShow); void updateSampleSliders(bool repaint = true); void updateInstrumentSliders(bool repaint = true); virtual void update(bool repaint = true); virtual void notifyTabSwitch(); virtual void notifySampleSelect(pp_int32 index); void updateAfterLoad(); void updateEnvelopeWindow(bool repaint = true); void updateEnvelopeEditor(bool repaint = true, bool reAttach = false); void resetEnvelopeEditor(); void resetPianoAssignment(); PianoControl* getPianoControl() { return pianoControl; } pp_int32 getVisibleEnvelopeType() { return currentEnvelopeType; } bool isEnvelopeVisible(); EnvelopeEditorControl* getEnvelopeEditorControl() { return envelopeEditorControl; } bool isVisible() const { return visible; } // Get predefined envelopes for storage purpose pp_int32 getNumPredefinedEnvelopes(); enum EnvelopeTypes { EnvelopeTypeVolume, EnvelopeTypePanning }; PPString getEncodedEnvelope(EnvelopeTypes type, pp_int32 index); void setEncodedEnvelope(EnvelopeTypes type, pp_int32 index, const PPString& str); private: void handleZapInstrument(); void zapInstrument(); // Responder should be friend friend class DialogResponderInstruments; friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/PlayerMaster.h0000644000175000017500000001132111150223367021424 0ustar admin2admin2/* * tracker/PlayerMaster.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PlayerMaster.h * MilkyTracker * * Created by Peter Barth on 18.12.07. * */ #ifndef __PLAYERMASTER_H__ #define __PLAYERMASTER_H__ #include "BasicTypes.h" #include "TrackerConfig.h" struct TMixerSettings { // Negative values means ignore pp_int32 mixFreq; // Negative values means ignore pp_int32 bufferSize; // Negative values means ignore pp_int32 mixerVolume; // Negative values means ignore pp_int32 mixerShift; // 0 = false, 1 = true, negative values means ignore pp_int32 powerOfTwoCompensation; // 0 = none, 1 = linear, 2 = lagrange, negative values means ignore pp_int32 resampler; // 0 = false, 1 = true, negative values means ignore pp_int32 ramping; // NULL means ignore char* audioDriverName; // 0 means disable virtual channels, negative value means ignore pp_int32 numVirtualChannels; TMixerSettings() : mixFreq(-1), bufferSize(-1), mixerVolume(-1), mixerShift(-1), powerOfTwoCompensation(-1), resampler(-1), ramping(-1), audioDriverName(NULL), numVirtualChannels(-1) { } ~TMixerSettings() { delete[] audioDriverName; } void setAudioDriverName(const char* name) { delete[] audioDriverName; if (name) { audioDriverName = new char[strlen(name)+1]; strcpy(audioDriverName, name); } else audioDriverName = NULL; } bool operator==(const TMixerSettings& source) { if (mixFreq != source.mixFreq) return false; if (bufferSize != source.bufferSize) return false; if (mixerVolume != source.mixerVolume) return false; if (mixerShift != source.mixerShift) return false; if (powerOfTwoCompensation != source.powerOfTwoCompensation) return false; if (resampler != source.resampler) return false; if (ramping != source.ramping) return false; if (numVirtualChannels != source.numVirtualChannels) return false; return strcmp(audioDriverName, source.audioDriverName) == 0; } bool operator!=(const TMixerSettings& source) { return !(*this == source); } }; template class PPSimpleVector; class PlayerController; class PlayerMaster { private: enum { DefaultMaxDevices = 32, }; class MasterMixer* mixer; class MasterMixerNotificationListener* listener; PPSimpleVector* playerControllers; TMixerSettings currentSettings; pp_uint32 oldBufferSize; bool forcePowerOfTwoBufferSize; pp_uint8 panning[TrackerConfig::MAXCHANNELS]; bool multiChannelKeyJazz; bool multiChannelRecord; void adjustSettings(); void applySettingsToPlayerController(PlayerController& playerController, const TMixerSettings& settings); public: PlayerMaster(pp_uint32 numDevices = DefaultMaxDevices); ~PlayerMaster(); static const char* getPreferredAudioDriverID(); static pp_uint32 getPreferredSampleRate(); static pp_uint32 getPreferredBufferSize(); static pp_int32 roundToNearestPowerOfTwo(pp_int32 v); static float convertBufferSizeToMillis(pp_uint32 sampleRate, pp_uint32 bufferSize); PlayerController* createPlayerController(bool fakeScopes); bool destroyPlayerController(PlayerController* playerController); pp_int32 getNumPlayerControllers() const; PlayerController* getPlayerController(pp_int32 index); // Delegating some player functionality bool applyNewMixerSettings(const TMixerSettings& settings, bool allowMixerRestart); // Delegating some audio driver enumeration code const char* getFirstDriverName() const; const char* getNextDriverName() const; const char* getCurrentDriverName() const; bool setCurrentDriverByName(const char* name); // this will be delegated to all playercontrollers void reallocateChannels(pp_int32 moduleChannels = 32, pp_int32 virtualChannels = 0); void setUseVirtualChannels(bool useVirtualChannels); // see above void setMultiChannelKeyJazz(bool b); void setMultiChannelRecord(bool b); bool start(); bool stop(bool detachPlayers); void getCurrentSamplePeak(pp_int32& left, pp_int32& right); void resetQueuedPositions(); friend class MasterMixerNotificationListener; }; #endif milkytracker-0.90.85+dfsg/src/tracker/ToolInvokeHelper.cpp0000644000175000017500000001202511150223367022602 0ustar admin2admin2/* * tracker/ToolInvokeHelper.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ToolInvokeHelper.cpp * MilkyTracker * * Created by Peter Barth on 14.11.05. * */ #include "ToolInvokeHelper.h" #include "Tracker.h" #include "ListBox.h" #include "PatternEditorControl.h" #include "DialogWithValues.h" #include "DialogQuickChooseInstrument.h" #include "Screen.h" ToolInvokeHelper::ToolInvokeHelper(Tracker& theTracker) : tracker(theTracker), dialog(NULL) { resetLastValues(); } ToolInvokeHelper::~ToolInvokeHelper() { delete dialog; } void ToolInvokeHelper::resetLastValues() { lastValues.volumeScaleStart = lastValues.volumeScaleEnd = -1.0f; } bool ToolInvokeHelper::invokeTool(ToolTypes toolType, pp_int16 keyDownKeyCode/* = -1*/) { if (tracker.screen->getModalControl()) return false; lastToolType = toolType; if (dialog) { delete dialog; dialog = NULL; } switch (toolType) { case ToolTypePatternVolumeScale: dialog = new DialogWithValues(tracker.screen, this, PP_DEFAULT_ID, "Volume scale pattern"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues); break; case ToolTypeTrackVolumeScale: dialog = new DialogWithValues(tracker.screen, this, PP_DEFAULT_ID, "Volume scale track"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues); break; case ToolTypeSelectionVolumeScale: dialog = new DialogWithValues(tracker.screen, this, PP_DEFAULT_ID, "Volume scale block"PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues); break; case ToolTypeQuickChooseInstrument: { dialog = new DialogQuickChooseInstrument(tracker.screen, this, PP_DEFAULT_ID, "Choose instrument"PPSTR_PERIODS); static_cast(dialog)->setValueCaption("Enter hex value:"); pp_uint16 value = static_cast(dialog)->numPadKeyToValue(keyDownKeyCode); static_cast(dialog)->setValue(value); dialog->setKeyDownInvokeKeyCode(keyDownKeyCode); dialog->show(); return true; break; } default: return false; } static_cast(dialog)->setValueOneCaption("Enter start scale:"); static_cast(dialog)->setValueTwoCaption("Enter end scale:"); static_cast(dialog)->setValueOneRange(0, 100.0f, 2); static_cast(dialog)->setValueTwoRange(0, 100.0f, 2); static_cast(dialog)->setValueOneIncreaseStep(0.01f); static_cast(dialog)->setValueTwoIncreaseStep(0.01f); static_cast(dialog)->setValueOne(lastValues.volumeScaleStart != -1.0f ? lastValues.volumeScaleStart : 1.0f); static_cast(dialog)->setValueTwo(lastValues.volumeScaleEnd != -1.0f ? lastValues.volumeScaleEnd : 1.0f); dialog->setKeyDownInvokeKeyCode(keyDownKeyCode); dialog->show(); return true; } pp_int32 ToolInvokeHelper::ActionOkay(PPObject* sender) { switch (lastToolType) { case ToolTypePatternVolumeScale: lastValues.volumeScaleStart = static_cast(dialog)->getValueOne(); lastValues.volumeScaleEnd = static_cast(dialog)->getValueTwo(); tracker.getPatternEditor()->scaleVolumePattern(lastValues.volumeScaleStart, lastValues.volumeScaleEnd); break; case ToolTypeTrackVolumeScale: lastValues.volumeScaleStart = static_cast(dialog)->getValueOne(); lastValues.volumeScaleEnd = static_cast(dialog)->getValueTwo(); tracker.getPatternEditor()->scaleVolumeTrack(lastValues.volumeScaleStart, lastValues.volumeScaleEnd); break; case ToolTypeSelectionVolumeScale: lastValues.volumeScaleStart = static_cast(dialog)->getValueOne(); lastValues.volumeScaleEnd = static_cast(dialog)->getValueTwo(); tracker.getPatternEditor()->scaleVolumeSelection(lastValues.volumeScaleStart, lastValues.volumeScaleEnd); break; case ToolTypeQuickChooseInstrument: { pp_int32 value = static_cast(dialog)->getValue(); if (value == 0) tracker.enableInstrument(false); else { tracker.enableInstrument(true); // set listbox index before calling Tracker::selectInstrument() tracker.listBoxInstruments->setSelectedIndex(value-1, false); tracker.selectInstrument(value); } } } return 0; } pp_int32 ToolInvokeHelper::ActionCancel(PPObject* sender) { return 0; } milkytracker-0.90.85+dfsg/src/tracker/PeakLevelControl.cpp0000644000175000017500000000757211150223367022575 0ustar admin2admin2/* * tracker/PeakLevelControl.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PeakLevelControl.cpp * MilkyTracker * * Created by Peter Barth on 28.10.05. * */ #include "PeakLevelControl.h" #include "Screen.h" #include "GraphicsAbstract.h" #include "TrackerConfig.h" PeakLevelControl::PeakLevelControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border/*= true*/) : PPControl(id, parentScreen, eventListener, location, size), borderColor(&ourOwnBorderColor) { this->border = border; // default color color.set(0, 0, 0); ourOwnBorderColor.set(192, 192, 192); visibleWidth = size.width - 2; visibleHeight = size.height - 2; peak[0] = peak[1] = 0; buildColorLUT(); } PeakLevelControl::~PeakLevelControl() { } void PeakLevelControl::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; pp_int32 xOffset = 2; pp_int32 yOffset = 2; g->setRect(location.x, location.y, location.x + size.width, location.y + size.height); g->setColor(color); g->fill(); if (border) { drawBorder(g, *borderColor); } g->setRect(location.x + 1, location.y + 1, location.x + size.width - 2, location.y + size.height - 2); pp_int32 centerx = location.x + xOffset + (visibleWidth >> 1)-1; pp_int32 i; pp_int32 pixelPeak = ((visibleWidth >> 1)*peak[0]) >> 16; pp_int32 maxPeak = (visibleWidth >> 1); for (i = 0; i < pixelPeak; i+=2) { pp_int32 c = i*256/maxPeak; g->setColor(peakColorLUT[c][0], peakColorLUT[c][1], peakColorLUT[c][2]); g->drawVLine(location.y + yOffset, location.y + yOffset + visibleHeight, centerx - i); } pixelPeak = ((visibleWidth >> 1)*peak[1]) >> 16; for (i = 0; i < pixelPeak; i+=2) { pp_int32 c = i*256/maxPeak; g->setColor(peakColorLUT[c][0], peakColorLUT[c][1], peakColorLUT[c][2]); g->drawVLine(location.y + yOffset, location.y + yOffset + visibleHeight, centerx + i); } } void PeakLevelControl::buildColorLUT() { struct TColorKey { PPColor color; pp_uint32 t; }; TColorKey colorKeys[3]; colorKeys[2].color.r = 255; colorKeys[2].color.g = 0; colorKeys[2].color.b = 0; colorKeys[2].t = 224; colorKeys[1].color.r = 255; colorKeys[1].color.g = 255; colorKeys[1].color.b = 0; colorKeys[1].t = 192; colorKeys[0].color.r = 0; colorKeys[0].color.g = 255; colorKeys[0].color.b = 0; colorKeys[0].t = 0; for (pp_int32 i = 0; i < 2; i++) { for (pp_uint32 j = colorKeys[i].t; j < colorKeys[i+1].t; j++) { float t = (float)(j - colorKeys[i].t) / (float)(colorKeys[i+1].t - colorKeys[i].t); pp_int32 r = (pp_int32)((1.0f - t) * colorKeys[i].color.r + t * colorKeys[i+1].color.r); pp_int32 g = (pp_int32)((1.0f - t) * colorKeys[i].color.g + t * colorKeys[i+1].color.g); pp_int32 b = (pp_int32)((1.0f - t) * colorKeys[i].color.b + t * colorKeys[i+1].color.b); peakColorLUT[j][0] = (pp_uint8)r; peakColorLUT[j][1] = (pp_uint8)g; peakColorLUT[j][2] = (pp_uint8)b; } } for (pp_int32 j = colorKeys[2].t; j < 256; j++) { peakColorLUT[j][0] = (pp_uint8)colorKeys[2].color.r; peakColorLUT[j][1] = (pp_uint8)colorKeys[2].color.g; peakColorLUT[j][2] = (pp_uint8)colorKeys[2].color.b; } } milkytracker-0.90.85+dfsg/src/tracker/RecPosProvider.h0000755000175000017500000000222011150223367021723 0ustar admin2admin2/* * tracker/RecPosProvider.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "BasicTypes.h" class RecPosProvider { private: class PlayerController& playerController; bool roundToClosestRow; public: RecPosProvider(PlayerController& playerController) : playerController(playerController), roundToClosestRow(false) { } void getPosition(pp_int32& order, pp_int32& row); void getPosition(pp_int32& order, pp_int32& row, pp_int32& ticker); }; milkytracker-0.90.85+dfsg/src/tracker/DialogResample.cpp0000755000175000017500000003662111150223367022254 0ustar admin2admin2/* * tracker/DialogResample.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogResample.cpp * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #include "DialogResample.h" #include "Screen.h" #include "StaticText.h" #include "CheckBox.h" #include "PPUIConfig.h" #include "MessageBoxContainer.h" #include "Font.h" #include "ListBox.h" #include "Seperator.h" #include "XModule.h" #include "ResamplerHelper.h" float getc4spd(mp_sint32 relnote,mp_sint32 finetune) { static const mp_sint32 table[] = {65536,69432,73561,77935,82570,87480,92681,98193,104031,110217,116771,123715, 65536,65565,65595,65624,65654,65684,65713,65743,65773,65802,65832,65862,65891, 65921,65951,65981,66010,66040,66070,66100,66130,66160,66189,66219,66249,66279, 66309,66339,66369,66399,66429,66459,66489,66519,66549,66579,66609,66639,66669, 66699,66729,66759,66789,66820,66850,66880,66910,66940,66971,67001,67031,67061, 67092,67122,67152,67182,67213,67243,67273,67304,67334,67365,67395,67425,67456, 67486,67517,67547,67578,67608,67639,67669,67700,67730,67761,67792,67822,67853, 67883,67914,67945,67975,68006,68037,68067,68098,68129,68160,68190,68221,68252, 68283,68314,68344,68375,68406,68437,68468,68499,68530,68561,68592,68623,68654, 68685,68716,68747,68778,68809,68840,68871,68902,68933,68964,68995,69026,69057, 69089,69120,69151,69182,69213,69245,69276,69307,69339,69370,69401}; mp_sint32 c4spd = 8363; mp_sbyte xmfine = finetune; mp_sbyte octave = (relnote+96)/12; mp_sbyte note = (relnote+96)%12; mp_sbyte o2 = octave-8; if (xmfine<0) { xmfine+=(mp_sbyte)128; note--; if (note<0) { note+=12; o2--; } } if (o2>=0) { c4spd<<=o2; } else { c4spd>>=-o2; } float f = table[(mp_ubyte)note]*(1.0f/65536.0f) * c4spd; return f * (table[(mp_ubyte)xmfine+12]*(1.0f/65536.0f)); } DialogResample::DialogResample(PPScreen* screen, DialogResponder* responder, pp_int32 id) : PPDialogBase(), count(0), resamplerHelper(new ResamplerHelper()), interpolationType(1), adjustFtAndRelnote(true) { #ifdef __LOWRES__ initDialog(screen, responder, id, "Resample"PPSTR_PERIODS, 290, 142+15+20+16, 26+15, "Ok", "Cancel"); #else initDialog(screen, responder, id, "Resample"PPSTR_PERIODS, 290, 142+20+16, 26, "Ok", "Cancel"); #endif pp_int32 x = getMessageBoxContainer()->getLocation().x; pp_int32 width = getMessageBoxContainer()->getSize().width; pp_int32 x2 = x; pp_int32 y2 = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y; PPButton* button; y2 +=16; // enter edit field 1 x2 = x + width / 2 - (10*8+35 + 14*8)/2; messageBoxContainerGeneric->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2+2), "Relative note", true)); x2+=17*8; PPListBox* listBox = new PPListBox(MESSAGEBOX_LISTBOX_VALUE_ONE, screen, this, PPPoint(x2, y2), PPSize(7*8,12), true, true, false); listBox->showSelection(false); listBox->setBorderColor(messageBoxContainerGeneric->getColor()); listBox->setMaxEditSize(8); listBoxes[0] = listBox; messageBoxContainerGeneric->addControl(listBox); button = new PPButton(MESSAGEBOX_BUTTON_INCREASE_VALUEONE, screen, this, PPPoint(x2 + listBox->getSize().width + 2, y2), PPSize(16, 11)); button->setText("+"); messageBoxContainerGeneric->addControl(button); button = new PPButton(MESSAGEBOX_BUTTON_DECREASE_VALUEONE, screen, this, PPPoint(x2 + listBox->getSize().width + 2 + button->getSize().width + 1, y2), PPSize(16, 11)); button->setText("-"); messageBoxContainerGeneric->addControl(button); y2+=16; x2 = x + width / 2 - (10*8+35 + 14*8)/2; messageBoxContainerGeneric->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2+2), "Fine tune", true)); x2+=17*8; listBox = new PPListBox(MESSAGEBOX_LISTBOX_VALUE_TWO, screen, this, PPPoint(x2, y2), PPSize(7*8,12), true, true, false); listBox->showSelection(false); listBox->setBorderColor(messageBoxContainerGeneric->getColor()); listBox->setMaxEditSize(8); listBoxes[1] = listBox; messageBoxContainerGeneric->addControl(listBox); button = new PPButton(MESSAGEBOX_BUTTON_INCREASE_VALUETWO, screen, this, PPPoint(x2 + listBox->getSize().width + 2, y2), PPSize(16, 11)); button->setText("+"); messageBoxContainerGeneric->addControl(button); button = new PPButton(MESSAGEBOX_BUTTON_DECREASE_VALUETWO, screen, this, PPPoint(x2 + listBox->getSize().width + 2 + button->getSize().width + 1, y2), PPSize(16, 11)); button->setText("-"); messageBoxContainerGeneric->addControl(button); y2+=16; x2 = x + width / 2 - (10*8+35 + 14*8)/2; messageBoxContainerGeneric->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2+2), "C4 speed (Hz)", true)); x2+=14*8; listBox = new PPListBox(MESSAGEBOX_LISTBOX_VALUE_THREE, screen, this, PPPoint(x2, y2), PPSize(10*8,12), true, true, false); listBox->showSelection(false); listBox->setBorderColor(messageBoxContainerGeneric->getColor()); listBox->setMaxEditSize(8); listBoxes[2] = listBox; messageBoxContainerGeneric->addControl(listBox); button = new PPButton(MESSAGEBOX_BUTTON_INCREASE_VALUETHREE, screen, this, PPPoint(x2 + listBox->getSize().width + 2, y2), PPSize(16, 11)); button->setText("+"); messageBoxContainerGeneric->addControl(button); button = new PPButton(MESSAGEBOX_BUTTON_DECREASE_VALUETHREE, screen, this, PPPoint(x2 + listBox->getSize().width + 2 + button->getSize().width + 1, y2), PPSize(16, 11)); button->setText("-"); messageBoxContainerGeneric->addControl(button); y2+=16; x2 = x + width / 2 - (10*8+35 + 14*8)/2; messageBoxContainerGeneric->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2+2), "New size:", true)); x2+=18*8; messageBoxContainerGeneric->addControl(new PPStaticText(MESSAGEBOX_STATICTEXT_USER1, screen, this, PPPoint(x2, y2+2), "XXXXXXXX")); y2+=16; x2 = x + width / 2 - (10*8+35 + 14*8)/2; messageBoxContainerGeneric->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2+2), "Interpolation:", true)); x2+=15*8; button = new PPButton(MESSAGEBOX_CONTROL_USER1, screen, this, PPPoint(x2, y2), PPSize(button->getLocation().x + button->getSize().width - x2, 11), false); button->setText(resamplerHelper->getResamplerName(interpolationType, true)); button->setColor(messageBoxContainerGeneric->getColor()); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); messageBoxContainerGeneric->addControl(button); y2+=16; x2 = x + width / 2 - (10*8+35 + 14*8)/2; messageBoxContainerGeneric->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2+2), "Adjust Ft/Rel.Note:", true)); x2+= 21*8; checkBox = new PPCheckBox(MESSAGEBOX_CONTROL_USER2, screen, this, PPPoint(x2, y2+1)); checkBox->checkIt(adjustFtAndRelnote); messageBoxContainerGeneric->addControl(checkBox); y2+=16; #ifdef __LOWRES__ pp_int32 height = getMessageBoxContainer()->getSize().height; pp_int32 y = getMessageBoxContainer()->getLocation().y; const char buttonTexts[] = {'1','2','3','4','5','6','7','8','9','0','+','-','.','<','>'}; pp_int32 bWidth = (width - 22*2 - 2*3) / sizeof(buttonTexts); pp_int32 x2_2 = x+4; pp_int32 y2_2 = y+height - 4 - 13; messageBoxContainerGeneric->addControl(new PPSeperator(0, screen, PPPoint(x2_2-1, y2_2-3), width-2*3, messageBoxContainerGeneric->getColor(), true)); pp_uint32 i = 0; for (i = 0; i < sizeof(buttonTexts); i++) { button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1, 13)); button->setText(buttonTexts[i]); messageBoxContainerGeneric->addControl(button); x2_2+=bWidth; } bWidth = 22; button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1-3, 13)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Del"); messageBoxContainerGeneric->addControl(button); x2_2+=bWidth-3; i++; button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1, 13)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Back"); messageBoxContainerGeneric->addControl(button); #endif currentSelectedListBox = 0; relnote = finetune = 0; c4spd = 0.0f; } DialogResample::~DialogResample() { delete resamplerHelper; } void DialogResample::show(bool b/* = true*/) { if (b) { currentSelectedListBox = 0; updateListBoxes(); listBoxEnterEditState(MESSAGEBOX_LISTBOX_VALUE_ONE); PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_CONTROL_USER1)); button->setText(resamplerHelper->getResamplerName(interpolationType, true)); } PPDialogBase::show(b); } pp_int32 DialogResample::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eKeyDown) { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); if (keyCode == VK_TAB) { switchListBox(); event->cancel(); } } else if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case PP_MESSAGEBOX_BUTTON_YES: { commitChanges(); break; } case MESSAGEBOX_BUTTON_INCREASE_VALUEONE: { relnote++; toC4Speed(); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_BUTTON_DECREASE_VALUEONE: { relnote--; toC4Speed(); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_BUTTON_INCREASE_VALUETWO: { finetune++; toC4Speed(); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_BUTTON_DECREASE_VALUETWO: { finetune--; toC4Speed(); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_BUTTON_INCREASE_VALUETHREE: { c4spd++; fromC4Speed(); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_BUTTON_DECREASE_VALUETHREE: { c4spd--; fromC4Speed(); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_CONTROL_USER1: { if (event->getID() != eCommand) break; interpolationType = (interpolationType + 1) % resamplerHelper->getNumResamplers(); PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_CONTROL_USER1)); button->setText(resamplerHelper->getResamplerName(interpolationType, true)); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_CONTROL_USER2: { if (event->getID() != eCommand) break; this->adjustFtAndRelnote = reinterpret_cast(sender)->isChecked(); break; } } } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { case MESSAGEBOX_LISTBOX_VALUE_ONE: { const PPString* str = *(reinterpret_cast(event->getDataPtr())); setRelNote((pp_int32)atoi(*str)); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_LISTBOX_VALUE_TWO: { const PPString* str = *(reinterpret_cast(event->getDataPtr())); setFineTune((pp_int32)atoi(*str)); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } case MESSAGEBOX_LISTBOX_VALUE_THREE: { const PPString* str = *(reinterpret_cast(event->getDataPtr())); setC4Speed((float)atof(*str)); calcSize(); updateListBoxes(); parentScreen->paintControl(messageBoxContainerGeneric); break; } } } return PPDialogBase::handleEvent(sender, event); } void DialogResample::updateListBoxes() { updateListBox(MESSAGEBOX_LISTBOX_VALUE_ONE, (float)relnote, 0); updateListBox(MESSAGEBOX_LISTBOX_VALUE_TWO, (float)finetune, 0); updateListBox(MESSAGEBOX_LISTBOX_VALUE_THREE, (float)c4spd, 2); PPStaticText* staticText = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_STATICTEXT_USER1)); staticText->setHexValue(finalSize, 8); checkBox->checkIt(adjustFtAndRelnote); } void DialogResample::updateListBox(pp_int32 id, float val, pp_int32 numDecimals) { char buffer1[100]; char buffer2[100]; sprintf(buffer1, "%%.%if", numDecimals); PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(id)); if (listBox) { sprintf(buffer2, buffer1, val); listBox->clear(); listBox->addItem(buffer2); } } void DialogResample::commitChanges() { PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); if (listBox) listBox->commitChanges(); listBox = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_TWO)); if (listBox) listBox->commitChanges(); } void DialogResample::listBoxEnterEditState(pp_int32 id) { PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(id)); if (listBox) listBox->placeCursorAtEnd(); } void DialogResample::switchListBox() { if (listBoxes[currentSelectedListBox]->isEditing()) listBoxes[currentSelectedListBox]->commitChanges(); currentSelectedListBox = (currentSelectedListBox+1) % 3; listBoxEnterEditState(listBoxes[currentSelectedListBox]->getID()); messageBoxContainerGeneric->setFocus(listBoxes[currentSelectedListBox]); parentScreen->paintControl(messageBoxContainerGeneric); } void DialogResample::setRelNote(pp_int32 note) { relnote = note; toC4Speed(); if (count < 2) { count++; if (count == 2) originalc4spd = c4spd; } } void DialogResample::setFineTune(pp_int32 ft) { finetune = ft; toC4Speed(); if (count < 2) { count++; if (count == 2) originalc4spd = c4spd; } } void DialogResample::setC4Speed(float c4spd) { this->c4spd = c4spd; fromC4Speed(); } void DialogResample::setSize(pp_uint32 size) { this->size = size; calcSize(); } void DialogResample::toC4Speed() { validate(); c4spd = getc4spd(relnote, finetune); validate(); } void DialogResample::fromC4Speed() { validate(); mp_sbyte rn, ft; XModule::convertc4spd((mp_uint32)c4spd, &ft, &rn); relnote = rn; finetune = ft; validate(); } void DialogResample::calcSize() { float c4spd = getc4spd(relnote, finetune); float step = originalc4spd / c4spd; finalSize = (mp_uint32)(size / step); } void DialogResample::validate() { if (relnote > 48) relnote = 48; if (relnote < -48) relnote = -48; if (finetune > 127) finetune = 127; if (finetune < -128) finetune = -128; if (c4spd < 0) c4spd = 0; if (c4spd > 65535*4) c4spd = 65535*4; } milkytracker-0.90.85+dfsg/src/tracker/EnvelopeEditorControl.h0000644000175000017500000001233611150223367023310 0ustar admin2admin2/* * tracker/EnvelopeEditorControl.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef ENVELOPEEDITORCONTROL__H #define ENVELOPEEDITORCONTROL__H #include "BasicTypes.h" #include "EditorBase.h" #include "Control.h" #include "Event.h" class EnvelopeEditorControl : public PPControl, public EventListenerInterface, public EditorBase::EditorNotificationListener { private: PPColor ourOwnBorderColor; PPColor backgroundColor; bool border; const PPColor* borderColor; class PPScrollbar* hScrollbar; class PPControl* caughtControl; bool controlCaughtByLMouseButton, controlCaughtByRMouseButton; class PPContextMenu* editMenuControl; class PPContextMenu* subMenuAdvanced; class EnvelopeEditor* envelopeEditor; const struct TEnvelope* envelope; // extent pp_int32 xMax; pp_int32 yMax; PPPoint currentPosition; pp_int32 xScale; // panning envelopes show the zero axis bool showVCenter; pp_int32 startPos; pp_int32 visibleWidth; pp_int32 visibleHeight; bool hasDragged; // selection pp_int32 selectionTicker; // Envelope counters struct ShowMark { pp_int32 pos; pp_int32 intensity; pp_int32 panning; } *showMarks; enum MenuCommandIDs { MenuCommandIDXScale = 99, MenuCommandIDYScale }; public: EnvelopeEditorControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true); ~EnvelopeEditorControl(); void setColor(const PPColor& color) { backgroundColor = color; } void setBorderColor(const PPColor& color) { borderColor = &color; } void setxMax(pp_int32 xMax) { this->xMax = xMax; adjustScrollbars(); } pp_int32 getxMax() { return xMax; } void setyMax(pp_int32 yMax) { this->yMax = yMax; adjustScrollbars(); } pp_int32 getyMax() { return yMax; } void attachEnvelopeEditor(EnvelopeEditor* envelopeEditor); const TEnvelope* getEnvelope() { return envelope; } EnvelopeEditor* getEnvelopeEditor() { return envelopeEditor; } void setShowVCenter(bool b) { showVCenter = b; } void paintGrid(PPGraphicsAbstract* graphics, pp_int32 xOffset, pp_int32 yOffset); // from PPControl virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); protected: virtual void translateCoordinates(PPPoint& cp) { PPControl::translateCoordinates(cp); cp.x -= 2; cp.y -= 2; } public: void reset(); // Showmarks void setShowMark(pp_int32 c, pp_int32 m, pp_int32 i = 256, pp_int32 p = 128) { showMarks[c].pos = m; showMarks[c].intensity = i; showMarks[c].panning = p; } pp_int32 getShowMarkPos(pp_int32 c) { return showMarks[c].pos; } void clearShowMarks(); bool hasShowMarks(); // set scale from 16 to 1024 void setScale(pp_int32 scale); pp_int32 getScale() { return xScale; } private: pp_int32 getMaxWidth(); void adjustScrollbars(); pp_int32 selectEnvelopePoint(pp_int32 x, pp_int32 y); void setEnvelopePoint(pp_int32 index, pp_int32 x, pp_int32 y); float calcXScale(); float calcYScale(); void updateCurrentPosition(const PPPoint& cp); void validate(); void invokeContextMenu(PPPoint p); void executeMenuCommand(pp_int32 commandId); public: enum EnvelopeToolTypes { EnvelopeToolTypeNone, EnvelopeToolTypeScaleX, EnvelopeToolTypeScaleY }; bool invokeToolParameterDialog(EnvelopeToolTypes type); private: // --- envelope tool responder class ToolHandlerResponder : public DialogResponder { private: EnvelopeEditorControl& envelopeEditorControl; EnvelopeToolTypes envelopeToolType; public: ToolHandlerResponder(EnvelopeEditorControl& theEnvelopeEditorControl); void setEnvelopeToolType(EnvelopeToolTypes type) { envelopeToolType = type; } EnvelopeToolTypes getEnvelopeToolType() { return envelopeToolType; } virtual pp_int32 ActionOkay(PPObject* sender); virtual pp_int32 ActionCancel(PPObject* sender); }; friend class ToolHandlerResponder; class PPDialogBase* dialog; ToolHandlerResponder* toolHandlerResponder; bool invokeTool(EnvelopeToolTypes type); // Last values struct TLastValues { float scaleEnvelope; }; TLastValues lastValues; void resetLastValues() { lastValues.scaleEnvelope = -1.0f; } void notifyUpdate() { PPEvent e(eUpdated); eventListener->handleEvent(reinterpret_cast(this), &e); } virtual void editorNotification(EditorBase* sender, EditorBase::EditorNotifications notification); }; #endif milkytracker-0.90.85+dfsg/src/tracker/PianoControl.h0000644000175000017500000000614711150223367021435 0ustar admin2admin2/* * tracker/PianoControl.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PIANOCONTROL__H #define PIANOCONTROL__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" class PianoControl : public PPControl, public EventListenerInterface { public: enum Modes { ModeEdit = 0, ModePlay = 1 }; private: pp_int32 XMAX(); pp_int32 YMAX(); pp_int32 KEYWIDTH(); const pp_uint8 NUMNOTES; bool border; PPColor ourOwnBorderColor; const PPColor* borderColor; class PPScrollbar* hScrollbar; PPControl* caughtControl; bool controlCaughtByLMouseButton, controlCaughtByRMouseButton; // extent pp_int32 xscale; pp_int32 yscale; pp_int32 xMax; pp_int32 yMax; pp_int32 startPos; pp_int32 visibleWidth; pp_int32 visibleHeight; pp_int32 sampleIndex; pp_uint8* nbu; struct KeyState { bool pressed; bool muted; KeyState() : pressed(false), muted(false) { } }; KeyState* keyState; Modes mode; pp_int32 currentSelectedNote; class PianoBitmapBase* pianoBitmap; public: PianoControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, pp_uint8 numNotes, bool border = true); ~PianoControl(); void setMode(Modes mode) { this->mode = mode; } Modes getMode() const { return mode; } void setBorderColor(const PPColor& color) { this->borderColor = &color; } void setxMax(pp_int32 xMax) { this->xMax = xMax; adjustScrollbars(); } pp_int32 getxMax() const { return xMax; } void setyMax(pp_int32 yMax) { this->yMax = yMax; adjustScrollbars(); } pp_int32 getyMax() const { return yMax; } void setxScale(pp_int32 scale); void setyScale(pp_int32 scale); pp_int32 getxScale() const { return xscale; } pp_int32 getyScale() const { return yscale; } void setSampleTable(const pp_uint8* nbu); void setSampleIndex(pp_int32 index) { sampleIndex = index; } void pressNote(pp_int32 note, bool pressed, bool muted = false); bool getNoteState(pp_int32 note) const; void assureNoteVisible(pp_int32 note); // from PPControl virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void setLocation(const PPPoint& location); virtual void setSize(const PPSize& size); private: pp_int32 getMaxWidth(); void adjustScrollbars(); pp_int32 positionToNote(PPPoint cp); }; #endif milkytracker-0.90.85+dfsg/src/tracker/DialogEQ.h0000755000175000017500000000275111150223367020453 0ustar admin2admin2/* * tracker/DialogEQ.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogEQ.h * MilkyTracker * * Created by Peter Barth on 03.04.07. * */ #ifndef __DIALOGEQ_H__ #define __DIALOGEQ_H__ #include "DialogBase.h" class DialogEQ : public PPDialogBase { public: enum EQNumBands { EQ3Bands, EQ10Bands }; private: EQNumBands numBands; pp_uint32 numSliders; virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); void resetSliders(); void update(); public: DialogEQ(PPScreen* screen, DialogResponder* responder, pp_int32 id, EQNumBands numBands); void setBandParam(pp_uint32 index, float param); float getBandParam(pp_uint32 index) const; EQNumBands getNumBands() const { return numBands; } pp_uint32 getNumBandsAsInt() const { return numSliders; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/ResamplerHelper.cpp0000755000175000017500000000371011150223367022447 0ustar admin2admin2/* * tracker/ResamplerHelper.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ResamplerHelper.cpp * milkytracker * * Created by Peter Barth on 15.01.08. * */ #include "ResamplerHelper.h" const char* ResamplerHelper::resamplerNames[] = { "No interpolation", "Linear interpolation", "Cubic Lagrange", "Cubic Spline", "Fast Sinc", "Precise Sinc", "Amiga 500", "Amiga 500 LED", "Amiga 1200", "Amiga 1200 LED" }; const char* ResamplerHelper::resamplerNamesShort[] = { "None", "Linear", "Lagrange", "Spline", "Fast Sinc", "Precise Sinc", "A500", "A500LED", "A1200", "A1200LED" }; pp_uint32 ResamplerHelper::getNumResamplers() { return sizeof(resamplerNames) / sizeof(const char*); } const char* ResamplerHelper::getResamplerName(pp_uint32 index, bool shortName/* = false*/) { if (index >= getNumResamplers()) return NULL; return shortName ? resamplerNamesShort[index] : resamplerNames[index]; } ChannelMixer::ResamplerBase* ResamplerHelper::createResamplerFromIndex(pp_uint32 index) { return ResamplerFactory::createResampler((MixerSettings::ResamplerTypes)(index << 1)); } ChannelMixer::ResamplerTypes ResamplerHelper::getResamplerType(pp_uint32 index, bool ramping) { return (ChannelMixer::ResamplerTypes)((index << 1) | (ramping ? 1 : 0)); } milkytracker-0.90.85+dfsg/src/tracker/PatternEditor.cpp0000644000175000017500000011433511150223367022144 0ustar admin2admin2/* * tracker/PatternEditor.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PatternEditor.cpp * MilkyTracker * * Created by Peter Barth on 16.11.07. * */ #include "PatternEditor.h" #include "XModule.h" #include "PatternTools.h" #include "SimpleVector.h" void PatternEditor::Selection::backup() { startCopy = start; endCopy = end; copyValid = true; } void PatternEditor::Selection::restore() { start = startCopy; end = endCopy; copyValid = false; } PatternEditor::ClipBoard* PatternEditor::ClipBoard::instances[PatternEditor::ClipBoardTypeLAST] = {NULL, NULL, NULL}; PatternEditor::ClipBoard* PatternEditor::ClipBoard::getInstance(ClipBoardTypes type) { if (instances[type] == NULL) instances[type] = new ClipBoard(); return instances[type]; } void PatternEditor::prepareUndo() { PatternEditorTools patternEditorTools(pattern); patternEditorTools.normalize(); undoUserData.clear(); notifyListener(NotificationFeedUndoData); delete before; before = new PatternUndoStackEntry(*pattern, cursor.channel, cursor.row, cursor.inner, &undoUserData); } bool PatternEditor::finishUndo(LastChanges lastChange, bool nonRepeat/* = false*/) { bool result = false; PatternEditorTools patternEditorTools(pattern); patternEditorTools.normalize(); undoUserData.clear(); notifyListener(NotificationFeedUndoData); PatternUndoStackEntry after(*pattern, cursor.channel, cursor.row, cursor.inner, &undoUserData); if (*before != after) { PatternEditorTools::Position afterPos; afterPos.channel = after.getCursorPositionChannel(); afterPos.row = after.getCursorPositionRow(); afterPos.inner = after.getCursorPositionInner(); PatternEditorTools::Position beforePos; beforePos.channel = before->getCursorPositionChannel(); beforePos.row = before->getCursorPositionRow(); beforePos.inner = before->getCursorPositionInner(); result = true; lastOperationDidChangeRows = after.GetPattern().rows != before->GetPattern().rows; lastOperationDidChangeCursor = beforePos != afterPos; notifyListener(NotificationChanges); if (undoStack) { if (nonRepeat && this->lastChange != lastChange) undoStack->Push(*before); else if (!nonRepeat) undoStack->Push(*before); undoStack->Push(after); undoStack->Pop(); } } this->lastChange = lastChange; return result; } PatternEditor::PatternEditor() : EditorBase(), pattern(NULL), numVisibleChannels(-1), autoResize(false), currentInstrument(1), instrumentEnabled(true), instrumentBackTrace(false), currentOctave(5), before(NULL), undoStack(NULL), lastChange(LastChangeNone) { // Undo history undoHistory = new UndoHistory(UNDOHISTORYSIZE_PATTERNEDITOR); resetCursor(); resetSelection(); memset(effectMacros, 0, sizeof(effectMacros)); } PatternEditor::~PatternEditor() { delete undoHistory; delete undoStack; delete before; } void PatternEditor::attachPattern(TXMPattern* pattern, XModule* module) { if (this->pattern == pattern && this->module == module) return; // --------- update undo history information -------------------- if (undoStack) { // if the undo stack is empty, we don't need to save current undo stack if (!undoStack->IsEmpty() || !undoStack->IsTop()) { undoStack = undoHistory->getUndoStack(pattern, this->pattern, undoStack); } // delete it if it's empty else { delete undoStack; undoStack = NULL; undoStack = undoHistory->getUndoStack(pattern, NULL, NULL); } } attachModule(module); this->pattern = pattern; // couldn't get any from history, create new one if (!undoStack) { undoStack = new PPUndoStack(UNDODEPTH_PATTERNEDITOR); } notifyListener(NotificationReload); } void PatternEditor::reset() { resetSelection(); delete undoHistory; undoHistory = new UndoHistory(UNDOHISTORYSIZE_PATTERNEDITOR); delete undoStack; undoStack = new PPUndoStack(UNDODEPTH_PATTERNEDITOR); } pp_int32 PatternEditor::getNumChannels() const { if (numVisibleChannels >= 0) return numVisibleChannels; if (pattern == NULL) return 0; return pattern->channum; } pp_int32 PatternEditor::getNumRows() const { if (pattern == NULL) return 0; return pattern->rows; } bool PatternEditor::hasValidSelection() { return PatternEditorTools::hasValidSelection(pattern, selection.start, selection.end, getNumChannels()); } void PatternEditor::selectChannel(pp_int32 channel) { if (pattern == NULL) return; selection.start.channel = channel; selection.start.row = 0; selection.start.inner = 0; selection.end.channel = channel; selection.end.row = pattern->rows-1; selection.end.inner = 7; } void PatternEditor::selectAll() { if (pattern == NULL) return; selection.start.channel = 0; selection.start.row = 0; selection.start.inner = 0; selection.end.channel = getNumChannels()-1; selection.end.row = pattern->rows-1; selection.end.inner = 7; } pp_int32 PatternEditor::getCurrentActiveInstrument() { PatternTools patternTools; if (pattern == NULL) return -1; if (pattern->patternData == NULL) return -1; if (!instrumentEnabled) return 0; if (instrumentBackTrace) { for (pp_int32 i = cursor.row; i >= 0; i--) { patternTools.setPosition(pattern, cursor.channel, i); pp_int32 ins = patternTools.getInstrument(); if (ins != 0) { return ins; } } //return -1; } return currentInstrument; } bool PatternEditor::undo() { if (undoStack->IsEmpty()) return false; if (undoStack) return revoke(undoStack->Pop()); return false; } bool PatternEditor::redo() { if (undoStack->IsTop()) return false; if (undoStack) return revoke(undoStack->Advance()); return false; } bool PatternEditor::revoke(const PatternUndoStackEntry* stackEntry) { const TXMPattern& stackPattern = stackEntry->GetPattern(); enterCriticalSection(); bool res = false; if (stackPattern.rows != pattern->rows || stackPattern.channum != pattern->channum || stackPattern.effnum != pattern->effnum) { pattern->rows = stackPattern.rows; pattern->channum = stackPattern.channum; pattern->effnum = stackPattern.effnum; mp_sint32 patternSize = pattern->rows*pattern->channum*(2+pattern->effnum*2); if (pattern->patternData) { delete[] pattern->patternData; pattern->patternData = new mp_ubyte[patternSize]; memset(pattern->patternData, 0, patternSize); } } if (stackPattern.rows == pattern->rows && stackPattern.channum == pattern->channum && stackPattern.effnum == pattern->effnum) { cursor.channel = stackEntry->getCursorPositionChannel(); cursor.row = stackEntry->getCursorPositionRow(); cursor.inner = stackEntry->getCursorPositionInner(); pattern->decompress(stackPattern.patternData, stackPattern.len); // keep over userdata undoUserData = stackEntry->getUserData(); notifyListener(NotificationFetchUndoData); notifyListener(NotificationChanges); res = true; } leaveCriticalSection(); return res; } void PatternEditor::clearRange(const PatternEditorTools::Position& rangeStart, const PatternEditorTools::Position& rangeEnd) { PatternEditorTools patternEditorTools(pattern); patternEditorTools.clearSelection(rangeStart, rangeEnd); } void PatternEditor::clearSelection() { if (pattern == NULL) return; if (pattern->patternData == NULL) return; prepareUndo(); clearRange(selection.start, selection.end); finishUndo(LastChangeDeleteSelection); } void PatternEditor::clearPattern() { if (pattern == NULL) return; if (pattern->patternData == NULL) return; pp_int32 patSize = pattern->channum * (pattern->effnum*2+2) * pattern->rows; memset(pattern->patternData, 0, patSize); } void PatternEditor::cut(ClipBoard& clipBoard) { if (pattern == NULL) return; if (pattern->patternData == NULL) return; prepareUndo(); clipBoard.makeCopy(*pattern, getSelection().start, getSelection().end, true); finishUndo(LastChangeCut); } void PatternEditor::copy(ClipBoard& clipBoard) { clipBoard.makeCopy(*pattern, getSelection().start, getSelection().end); } void PatternEditor::paste(ClipBoard& clipBoard, bool transparent/* = false*/, pp_int32 fromChannel/* = -1*/) { if (pattern == NULL) return; if (pattern->patternData == NULL) return; prepareUndo(); if (autoResize && cursor.row + clipBoard.getNumRows() > pattern->rows) { pp_int32 newLen = cursor.row + clipBoard.getNumRows(); if (newLen > 256) newLen = 256; resizePattern(newLen, false); } if (fromChannel == -1) clipBoard.paste(*pattern, cursor.channel, cursor.row, transparent); else clipBoard.paste(*pattern, fromChannel, cursor.row, transparent); finishUndo(LastChangePaste); } void PatternEditor::cut(ClipBoardTypes clipBoardType) { cut(*ClipBoard::getInstance(clipBoardType)); } void PatternEditor::copy(ClipBoardTypes clipBoardType) { copy(*ClipBoard::getInstance(clipBoardType)); } void PatternEditor::paste(ClipBoardTypes clipBoardType, bool transparent/* = false*/, pp_int32 fromChannel/* = -1*/) { paste(*ClipBoard::getInstance(clipBoardType), transparent, fromChannel); } bool PatternEditor::resizePattern(pp_int32 newRowNum, bool withUndo /*= true*/) { if (newRowNum < 1 || newRowNum > 256) return false; if (pattern == NULL) return false; if (pattern->patternData == NULL) return false; if (newRowNum == pattern->rows) return true; enterCriticalSection(); mp_sint32 slotSize = pattern->effnum * 2 + 2; // allocate half of the space of the current pattern mp_sint32 patternSize = slotSize * pattern->channum * newRowNum; mp_ubyte* newPatternData = new mp_ubyte[patternSize]; memset(newPatternData, 0, patternSize); mp_sint32 numRows = newRowNum < pattern->rows ? newRowNum : pattern->rows; for (mp_sint32 i = 0; i < numRows; i++) { mp_sint32 srcOffset = i * slotSize * pattern->channum; mp_sint32 dstOffset = i * slotSize * pattern->channum; for (mp_sint32 j = 0; j < slotSize * pattern->channum; j++) newPatternData[dstOffset++] = pattern->patternData[srcOffset++]; } if (withUndo) { prepareUndo(); delete[] pattern->patternData; pattern->patternData = newPatternData; pattern->rows = newRowNum; // see if something has changed, if this is the case // save original & changes // Special treatment for pattern resizing: // If user resizes pattern and the last stack entry has already been // a resize modification we don't store the current changes finishUndo(LastChangeResizePattern, true); } else { delete[] pattern->patternData; pattern->patternData = newPatternData; pattern->rows = newRowNum; lastOperationDidChangeRows = true; lastOperationDidChangeCursor = false; notifyListener(NotificationChanges); } leaveCriticalSection(); return true; } bool PatternEditor::expandPattern() { if (pattern == NULL) return false; if (pattern->patternData == NULL) return false; enterCriticalSection(); prepareUndo(); PatternEditorTools patternEditorTools(pattern); bool res = patternEditorTools.expandPattern(); // see if something has changed, if this is the case // save original & changes finishUndo(LastChangeExpandPattern); leaveCriticalSection(); return res; } bool PatternEditor::shrinkPattern() { if (pattern == NULL) return false; if (pattern->patternData == NULL) return false; enterCriticalSection(); prepareUndo(); PatternEditorTools patternEditorTools(pattern); bool res = patternEditorTools.shrinkPattern(); // see if something has changed, if this is the case // save original & changes finishUndo(LastChangeShrinkPattern); leaveCriticalSection(); return res; } bool PatternEditor::loadExtendedPattern(const PPSystemString& fileName) { if (pattern == NULL) return false; if (pattern->patternData == NULL) return false; enterCriticalSection(); prepareUndo(); bool res = pattern->loadExtendedPattern(fileName); // see if something has changed, if this is the case // save original & changes finishUndo(LastChangeLoadXPattern); leaveCriticalSection(); return res; } bool PatternEditor::saveExtendedPattern(const PPSystemString& fileName) { if (pattern == NULL) return false; if (pattern->patternData == NULL) return false; return pattern->saveExtendedPattern(fileName); } bool PatternEditor::loadExtendedTrack(const PPSystemString& fileName) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; enterCriticalSection(); prepareUndo(); bool res = pattern->loadExtendedTrack(fileName, cursor.channel); // see if something has changed, if this is the case // save original & changes finishUndo(LastChangeLoadXTrack); leaveCriticalSection(); return res; } bool PatternEditor::saveExtendedTrack(const PPSystemString& fileName) { if (pattern == NULL) return false; if (pattern->patternData == NULL) return false; return pattern->saveExtendedTrack(fileName, cursor.channel); } pp_int32 PatternEditor::insRemapTrack(pp_int32 oldIns, pp_int32 newIns) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); PatternEditorTools patternEditorTools(pattern); pp_int32 resCnt = patternEditorTools.insRemapTrack(cursor.channel, oldIns, newIns); finishUndo(LastChangeInsRemapTrack); return resCnt; } pp_int32 PatternEditor::insRemapPattern(pp_int32 oldIns, pp_int32 newIns) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); PatternEditorTools patternEditorTools(pattern); pp_int32 resCnt = patternEditorTools.insRemap(oldIns, newIns); finishUndo(LastChangeInsRemapPattern); return resCnt; } pp_int32 PatternEditor::insRemapSelection(pp_int32 oldIns, pp_int32 newIns) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); PatternEditorTools patternEditorTools(pattern); pp_int32 resCnt = patternEditorTools.insRemapSelection(getSelection().start, getSelection().end, oldIns, newIns); finishUndo(LastChangeInsRemapSelection); return resCnt; } pp_int32 PatternEditor::noteTransposeTrackCore(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; pp_int32 fuckupCnt = 0; PatternEditorTools patternEditorTools(pattern); if (!evaluate) resCnt = patternEditorTools.noteTransposeTrack(cursor.channel, transposeParameters, evaluate); else fuckupCnt = patternEditorTools.noteTransposeTrack(cursor.channel, transposeParameters, evaluate); finishUndo(LastChangeNoteTransposeTrack); if (!evaluate) return resCnt; else return fuckupCnt; } pp_int32 PatternEditor::noteTransposePatternCore(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); PatternEditorTools patternEditorTools(pattern); pp_int32 resCnt = 0; pp_int32 fuckupCnt = 0; if (!evaluate) resCnt = patternEditorTools.noteTranspose(transposeParameters, evaluate); else fuckupCnt = patternEditorTools.noteTranspose(transposeParameters, evaluate); finishUndo(LastChangeNoteTransposePattern); if (!evaluate) return resCnt; else return fuckupCnt; } pp_int32 PatternEditor::noteTransposeSelectionCore(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; pp_int32 resCnt = 0; pp_int32 fuckupCnt = 0; prepareUndo(); PatternEditorTools patternEditorTools(pattern); if (!evaluate) resCnt = patternEditorTools.noteTransposeSelection(getSelection().start, getSelection().end, transposeParameters, evaluate); else fuckupCnt = patternEditorTools.noteTransposeSelection(getSelection().start, getSelection().end, transposeParameters, evaluate); finishUndo(LastChangeNoteTransposeSelection); if (!evaluate) return resCnt; else return fuckupCnt; } pp_int32 PatternEditor::interpolateValuesInSelection() { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; pp_int32 stats = 0; prepareUndo(); PatternEditorTools patternEditorTools(pattern); stats = patternEditorTools.interpolateValuesInSelection(getSelection().start, getSelection().end); finishUndo(LastChangeNoteInterpolate); return stats; } pp_int32 PatternEditor::splitTrack(pp_int32 useChannels, bool selectionOnly, bool insertNoteOff) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; pp_int32 stats = 0; pp_int32 chn = cursor.channel; pp_int32 fromRow = 0; pp_int32 toRow = pattern->rows; if (selectionOnly && hasValidSelection()) { if (getSelection().start.channel != getSelection().end.channel) return -1; chn = getSelection().start.channel; fromRow = getSelection().start.row; toRow = getSelection().end.row+1; } else if (selectionOnly && !hasValidSelection()) return 0; prepareUndo(); PatternEditorTools patternEditorTools(pattern); stats = patternEditorTools.splitTrack(useChannels, insertNoteOff, chn, fromRow, toRow, getNumChannels()); finishUndo(LastChangeSplitTrack); return stats; } pp_int32 PatternEditor::swapChannels(pp_int32 dstChannel, pp_int32 srcChannel) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; if (dstChannel == srcChannel) return 0; prepareUndo(); PatternEditorTools patternEditorTools(pattern); pp_int32 stats = patternEditorTools.swapChannels(dstChannel, srcChannel); finishUndo(LastChangeSwapChannels); return stats; } pp_int32 PatternEditor::scaleVolume(const PatternEditorTools::Position& startSelection, const PatternEditorTools::Position& endSelection, float startScale, float endScale) { prepareUndo(); PatternEditorTools patternEditorTools(pattern); pp_int32 stats = patternEditorTools.scaleVolume(startSelection, endSelection, startScale, endScale, getNumChannels(), module); finishUndo(LastChangeScaleVolume); return stats; } pp_int32 PatternEditor::scaleVolumeTrack(float startScale, float endScale) { if (pattern == NULL) return 0; PatternEditorTools::Position startSel, endSel; startSel.row = startSel.inner = 0; startSel.channel = cursor.channel; endSel = startSel; endSel.row = pattern->rows-1; return scaleVolume(startSel, endSel, startScale, endScale); } pp_int32 PatternEditor::scaleVolumePattern(float startScale, float endScale) { if (pattern == NULL) return 0; PatternEditorTools::Position startSel, endSel; startSel.channel = startSel.row = startSel.inner = 0; endSel.channel = pattern->channum-1; endSel.row = pattern->rows-1; endSel.inner = 7; return scaleVolume(startSel, endSel, startScale, endScale); } pp_int32 PatternEditor::scaleVolumeSelection(float startScale, float endScale) { if (pattern == NULL || !hasValidSelection()) return 0; return scaleVolume(getSelection().start, getSelection().end, startScale, endScale); } pp_int32 PatternEditor::zeroOperandsTrack(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.zeroOperandsTrack(cursor.channel, optimizeParameters, evaluate); finishUndo(LastChangeZeroOperandsTrack); return resCnt; } pp_int32 PatternEditor::zeroOperandsPattern(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.zeroOperands(optimizeParameters, evaluate); finishUndo(LastChangeZeroOperandsPattern); return resCnt; } pp_int32 PatternEditor::zeroOperandsSelection(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.zeroOperandsSelection(getSelection().start, getSelection().end, optimizeParameters, evaluate); finishUndo(LastChangeZeroOperandsSelection); return resCnt; } pp_int32 PatternEditor::fillOperandsTrack(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.fillOperandsTrack(cursor.channel, optimizeParameters, evaluate); finishUndo(LastChangeFillOperandsTrack); return resCnt; } pp_int32 PatternEditor::fillOperandsPattern(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.fillOperands(optimizeParameters, evaluate); finishUndo(LastChangeFillOperandsPattern); return resCnt; } pp_int32 PatternEditor::fillOperandsSelection(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.fillOperandsSelection(getSelection().start, getSelection().end, optimizeParameters, evaluate); finishUndo(LastChangeFillOperandsSelection); return resCnt; } pp_int32 PatternEditor::relocateCommandsTrack(const PatternEditorTools::RelocateParameters& relocateParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.relocateCommandsTrack(cursor.channel, relocateParameters, evaluate); finishUndo(LastChangeRelocateCommandsTrack); return resCnt; } pp_int32 PatternEditor::relocateCommandsPattern(const PatternEditorTools::RelocateParameters& relocateParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.relocateCommands(relocateParameters, evaluate); finishUndo(LastChangeRelocateCommandsPattern); return resCnt; } pp_int32 PatternEditor::relocateCommandsSelection(const PatternEditorTools::RelocateParameters& relocateParameters, bool evaluate) { if (pattern == NULL) return 0; if (pattern->patternData == NULL) return 0; prepareUndo(); pp_int32 resCnt = 0; PatternEditorTools patternEditorTools(pattern); resCnt = patternEditorTools.relocateCommandsSelection(getSelection().start, getSelection().end, relocateParameters, evaluate); finishUndo(LastChangeRelocateCommandsSelection); return resCnt; } bool PatternEditor::writeNote(pp_int32 note, bool withUndo/* = false*/, PatternAdvanceInterface* advanceImpl/* = NULL*/) { if (withUndo) prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); // means to delete note if (note == 0xFF) { patternTools.setNote(0); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } if (note >= 1 && note <= PatternTools::getNoteOffNote()) { pp_int32 currentInstrument = getCurrentActiveInstrument(); patternTools.setNote(note); if (currentInstrument && note != PatternTools::getNoteOffNote()) patternTools.setInstrument(currentInstrument); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } return false; } void PatternEditor::writeDirectNote(pp_int32 note, pp_int32 track/* = -1*/, pp_int32 row/* = -1*/, pp_int32 order/* = -1*/) { TXMPattern* pattern = this->pattern; if (order != -1) pattern = &module->phead[module->header.ord[order]]; if (track == -1) track = cursor.channel; if (row == -1) row = cursor.row; PatternTools patternTools; patternTools.setPosition(pattern, track, row); // means to delete note if (note == 0xFF) { patternTools.setNote(0); } if (note >= 1 && note <= PatternTools::getNoteOffNote()) { pp_int32 currentInstrument = getCurrentActiveInstrument(); patternTools.setNote(note); if (currentInstrument && note != PatternTools::getNoteOffNote()) patternTools.setInstrument(currentInstrument); } } bool PatternEditor::writeEffect(pp_int32 effNum, pp_uint8 eff, pp_uint8 op, bool withUndo/* = false*/, PatternAdvanceInterface* advanceImpl/* = NULL*/) { if (withUndo) prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); // only write effect, when valid effect // (0 is not a valid effect in my internal format, arpeggio is mapped to 0x30) if (eff) patternTools.setEffect(effNum, eff, op); else return false; if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } void PatternEditor::writeDirectEffect(pp_int32 effNum, pp_uint8 eff, pp_uint8 op, pp_int32 track/* = -1*/, pp_int32 row/* = -1*/, pp_int32 order/* = -1*/) { TXMPattern* pattern = this->pattern; if (order != -1) pattern = &module->phead[module->header.ord[order]]; if (track == -1) track = cursor.channel; if (row == -1) row = cursor.row; PatternTools patternTools; patternTools.setPosition(pattern, track, row); // only write effect, when valid effect // (0 is not a valid effect in my internal format, arpeggio is mapped to 0x30) if (eff) patternTools.setEffect(effNum, eff, op); } bool PatternEditor::writeInstrument(NibbleTypes nibleType, pp_uint8 value, bool withUndo/* = false*/, PatternAdvanceInterface* advanceImpl/* = NULL*/) { if (withUndo) prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); if (nibleType == NibbleTypeBoth) { patternTools.setInstrument(value); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } pp_uint32 i = patternTools.getInstrument(); if (nibleType == NibbleTypeHigh) { i &= 0x0F; i |= (pp_uint32)value << 4; patternTools.setInstrument(i); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } else if (nibleType == NibbleTypeLow) { i &= 0xF0; i |= (pp_uint32)value; patternTools.setInstrument(i); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } return false; } bool PatternEditor::writeFT2Volume(NibbleTypes nibleType, pp_uint8 value, bool withUndo/* = false*/, PatternAdvanceInterface* advanceImpl/* = NULL*/) { if (withUndo) prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); if (value == 0xFF) { patternTools.setFirstEffect(0, 0); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } pp_int32 eff,op; patternTools.getFirstEffect(eff, op); patternTools.convertEffectsToFT2(eff, op); pp_int32 volume = patternTools.getVolumeFromEffect(eff, op) - 0x10; if (volume < 0) volume = 0; if (volume >= 0xF0) return false; if (volume >= 0) { if (nibleType == NibbleTypeHigh) { volume &= 0x0F; volume |= (pp_int32)value << 4; if (volume>=0xF0) return false; else if ((volume > 0x40 && volume < 0x50)) volume = 0x40; if (volume >= 0x50 && ((volume & 0xF) == 0)) { switch ((volume+0x10) >> 4) { // For the following effects we don't allow zero operand case 0x6: // Volslide down case 0x7: // Volslide up case 0x8: // Fine volslide down case 0x9: // Fine volslide up case 0xa: // Set vibrato speed case 0xd: // Panslide left case 0xe: // Panslide right volume |= 1; break; } } } else if (nibleType == NibbleTypeLow) { volume &= 0xF0; volume |= (pp_int32)value; if (volume>=0xF0) return false; else if ((volume > 0x40 && volume < 0x50)) volume = 0x40; if (volume >= 0x50 && ((volume & 0xF) == 0)) { switch ((volume+0x10) >> 4) { // For the following effects we don't allow zero operand case 0x6: // Volslide down case 0x7: // Volslide up case 0x8: // Fine volslide down case 0x9: // Fine volslide up case 0xa: // Set vibrato speed case 0xd: // Panslide left case 0xe: // Panslide right volume |= 1; break; } } } patternTools.convertVolumeToEffect(volume + 0x10, eff, op); patternTools.setFirstEffect(eff, op); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } return false; } bool PatternEditor::writeEffectNumber(pp_uint8 value, bool withUndo/* = false*/, PatternAdvanceInterface* advanceImpl/* = NULL*/) { if (withUndo) prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); // clear out entire effect + operand if (value == 0xFF) { patternTools.setEffect(1, 0, 0); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } pp_int32 eff,op; // skip first effect (= volume command) patternTools.getFirstEffect(eff, op); patternTools.getNextEffect(eff, op); patternTools.convertEffectsToFT2(eff, op); pp_int32 newEff = value; patternTools.convertEffectsFromFT2(newEff, op); if (newEff == 0x40) { newEff = 0x41; op &= 0x0F; } else if (newEff >= 0x43) { newEff = 0x42; op &= 0x0F; } patternTools.setEffect(1, newEff, op); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } bool PatternEditor::writeEffectOperand(NibbleTypes nibleType, pp_uint8 value, bool withUndo/* = false*/, PatternAdvanceInterface* advanceImpl/* = NULL*/) { if (withUndo) prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); // clear out entire effect + operand if (value == 0xFF) { patternTools.setEffect(1, 0, 0); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } pp_int32 eff,op; patternTools.getFirstEffect(eff, op); patternTools.getNextEffect(eff, op); patternTools.convertEffectsToFT2(eff, op); if (nibleType == NibbleTypeHigh) { op &= 0x0F; op |= (pp_int32)value << 4; } else if (nibleType == NibbleTypeLow) { op &= 0xF0; op |= (pp_int32)value; } patternTools.convertEffectsFromFT2(eff, op); if (eff == 0x40) eff = 0x41; if (eff >= 0x43) eff = 0x42; patternTools.setEffect(1, eff, op); if (advanceImpl) advanceImpl->advance(); if (withUndo) finishUndo(LastChangeSlotChange); return true; } void PatternEditor::storeMacroFromCursor(pp_int32 slot) { if (pattern == NULL) return; if (slot > 10 || slot < 0) return; PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); pp_int32 eff, op; if (cursor.inner >= 3 && cursor.inner <= 4) { patternTools.getEffect(0, eff, op); // feature shall also work with empty effects //if (!eff && !op) // return; effectMacros[slot].effect = (pp_uint8)eff; effectMacros[slot].operand = (pp_uint8)op; } else if (cursor.inner > 4) { patternTools.getEffect(1, eff, op); // feature shall also work with empty effects //if (!eff && !op) // return; effectMacros[slot+10].effect = (pp_uint8)eff; effectMacros[slot+10].operand = (pp_uint8)op; } } void PatternEditor::writeMacroToCursor(pp_int32 slot, PatternAdvanceInterface* advanceImpl/* = NULL*/) { if (pattern == NULL) return; if (slot > 10 || slot < 0) return; prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); if (cursor.inner >= 3 && cursor.inner <= 4) { // feature shall also work with empty effects //if (!effectMacros[slot].effect && !effectMacros[slot].operand) // goto writeNothing; patternTools.setEffect(0, effectMacros[slot].effect, effectMacros[slot].operand); } else if (cursor.inner > 4) { // feature shall also work with empty effects //if (!effectMacros[slot+10].effect && !effectMacros[slot+10].operand) // goto writeNothing; patternTools.setEffect(1, effectMacros[slot+10].effect, effectMacros[slot+10].operand); } if (advanceImpl) advanceImpl->advance(); //writeNothing: finishUndo(LastChangeWriteMacro); } void PatternEditor::getMacroOperands(pp_int32 slot, pp_uint8& eff, pp_uint8& op) { if (slot < 0 || slot >= 20) return; eff = effectMacros[slot].effect; op = effectMacros[slot].operand; } void PatternEditor::setMacroOperands(pp_int32 slot, pp_uint8 eff, pp_uint8 op) { if (slot < 0 || slot >= 20) return; effectMacros[slot].effect = eff; effectMacros[slot].operand = op; } void PatternEditor::deleteCursorSlotData(PatternAdvanceInterface* advanceImpl/* = NULL*/) { prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); if (cursor.inner == 3 || cursor.inner == 4) { patternTools.setFirstEffect(0,0); } else if (cursor.inner == 5 || cursor.inner == 6 || cursor.inner == 7) { // What have I been thinking? //pp_int32 eff, op; //patternTools.getEffect(1, eff, op); // actually I think delete should really delete patternTools.setEffect(1, 0, 0); } else { patternTools.setNote(0); patternTools.setInstrument(0); } if (advanceImpl) advanceImpl->advance(); finishUndo(LastChangeDeleteNote); } void PatternEditor::deleteCursorSlotDataEntire(PatternAdvanceInterface* advanceImpl/* = NULL*/) { prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); patternTools.setNote(0); patternTools.setInstrument(0); patternTools.setFirstEffect(0,0); patternTools.setNextEffect(0,0); if (advanceImpl) advanceImpl->advance(); finishUndo(LastChangeDeleteNoteVolumeAndEffect); } void PatternEditor::deleteCursorSlotDataVolumeAndEffect(PatternAdvanceInterface* advanceImpl/* = NULL*/) { prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); patternTools.setFirstEffect(0,0); patternTools.setNextEffect(0,0); if (advanceImpl) advanceImpl->advance(); finishUndo(LastChangeDeleteVolumeAndEffect); } void PatternEditor::deleteCursorSlotDataEffect(PatternAdvanceInterface* advanceImpl/* = NULL*/) { prepareUndo(); PatternTools patternTools; patternTools.setPosition(pattern, cursor.channel, cursor.row); pp_int32 eff, op; patternTools.getFirstEffect(eff, op); patternTools.setFirstEffect(eff,op); patternTools.setNextEffect(0,0); if (advanceImpl) advanceImpl->advance(); finishUndo(LastChangeDeleteEffect); } void PatternEditor::insertNote(pp_int32 channel, pp_int32 row) { if (pattern == NULL || pattern->patternData == NULL) return; if (channel < 0 || channel >= pattern->channum) return; prepareUndo(); mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSize = slotSize*pattern->channum; for (mp_sint32 i = pattern->rows - 1; i > row; i--) { mp_ubyte* src = (i-1)*rowSize + channel*slotSize + pattern->patternData; mp_ubyte* dst = i*rowSize + channel*slotSize + pattern->patternData; memcpy(dst, src, slotSize); } memset(row*rowSize + channel*slotSize + pattern->patternData, 0, slotSize); finishUndo(LastChangeInsertNote); } void PatternEditor::insertLine(pp_int32 row) { if (pattern == NULL || pattern->patternData == NULL) return; if (row < 0 || row >= pattern->rows) return; prepareUndo(); mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSize = slotSize*pattern->channum; for (mp_sint32 i = pattern->rows - 1; i > row; i--) { mp_ubyte* src = (i-1)*rowSize + pattern->patternData; mp_ubyte* dst = i*rowSize + pattern->patternData; memcpy(dst, src, rowSize); } memset(row*rowSize + pattern->patternData, 0, rowSize); finishUndo(LastChangeInsertLine); } void PatternEditor::deleteNote(pp_int32 channel, pp_int32 row) { if (pattern == NULL || pattern->patternData == NULL) return; if (row < 0 || row >= pattern->rows) return; if (channel < 0 || channel >= pattern->channum) return; prepareUndo(); mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSize = slotSize*pattern->channum; for (mp_sint32 i = row; i < pattern->rows-1; i++) { mp_ubyte* src = (i+1)*rowSize + channel*slotSize + pattern->patternData; mp_ubyte* dst = i*rowSize + channel*slotSize + pattern->patternData; memcpy(dst, src, slotSize); } memset((pattern->rows-1)*rowSize + channel*slotSize + pattern->patternData, 0, slotSize); finishUndo(LastChangeDeleteNote); } void PatternEditor::deleteLine(pp_int32 row) { if (pattern == NULL || pattern->patternData == NULL) return; if (row < 0 || row >= pattern->rows) return; prepareUndo(); mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSize = slotSize*pattern->channum; for (mp_sint32 i = row; i < pattern->rows-1; i++) { mp_ubyte* src = (i+1)*rowSize + pattern->patternData; mp_ubyte* dst = i*rowSize + pattern->patternData; memcpy(dst, src, rowSize); } memset((pattern->rows-1)*rowSize + pattern->patternData, 0, rowSize); finishUndo(LastChangeDeleteLine); } milkytracker-0.90.85+dfsg/src/tracker/FileExtProvider.cpp0000755000175000017500000001257411150223367022440 0ustar admin2admin2/* * tracker/FileExtProvider.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * FileExtProvider.cpp * milkytracker_universal * * Created by Peter Barth on 12.07.08. * */ #include "FileExtProvider.h" #include "Decompressor.h" const char* FileExtProvider::moduleExtensions[] = { "669","Composer669", "amf","Asylum Music Format", "ams","Velvet Studio/Extreme Tracker", "cba","Chuck Biscuits & Black Artist", "dbm","Digibooster Pro", "digi","Digibooster", "dsm","Digisound Interface Kit/Dynamic Studio", "dtm","Digital Tracker/Digitrekker", "far","Farandole Composer", "gdm","General Digimusic", "gmc","Game Music Creator", "imf","Imago Orpheus", "it","Impulse Tracker", "mdl","Digitrakker", "mod","Protracker", "mtm","Multitracker", "mxm","Cubic Tiny XM", "okt","Oktalyzer", "plm","DisorderTracker", "psm","Epic Megagames MASI", "ptm","Polytracker", "s3m","Screamtracker 3", "stm","Screamtracker 2", "ult","Ultratracker", "uni","MikMod", "xm","Fasttracker 2", NULL, NULL }; const char* FileExtProvider::instrumentExtensions[] = { "xi","FT2 Instruments", "pat","GUS Patches", NULL, NULL }; const char* FileExtProvider::sampleExtensions[] = { "wav","WAV uncompressed", "iff","IFF (un)compressed", "8svx","IFF (un)compressed", "aif","Apple AIFF uncompressed", "aiff","Apple AIFF uncompressed", NULL, NULL }; const char* FileExtProvider::patternExtensions[] = { "xp","FT2 Pattern", NULL, NULL }; const char* FileExtProvider::trackExtensions[] = { "xt","FT2 Track", NULL, NULL }; const char* FileExtProvider::colorExtensions[] = { "mct","MilkyTracker colors", NULL, NULL }; const char* const* FileExtProvider::fillList(const char* const* baseList, ExtensionTypes type) { tempExtensions.clear(); pp_int32 i = 0; while (true) { if (baseList[i] == NULL) break; tempExtensions.add(new PPString(baseList[i])); i++; } // misuse a decompressor to retrieve the file types it can decompress // they're not ordered though Decompressor decompressor(""); if (decompressor.doesServeHint((DecompressorBase::Hints)type)) { const PPSimpleVector& src = decompressor.getDescriptors((DecompressorBase::Hints)type); for (pp_int32 j = 0; j < src.size(); j++) { tempExtensions.add(new PPString(src.get(j)->extension)); tempExtensions.add(new PPString(src.get(j)->description)); i+=2; } } delete[] tempList; tempList = new char*[i+2]; pp_int32 j = 0; for (j = 0; j < i; j++) { tempList[j] = (char*)((const char*)(*tempExtensions.get(j))); } tempList[j++] = NULL; tempList[j++] = NULL; return (const char**)tempList; } const char* const* FileExtProvider::getModuleExtensions() { return fillList(moduleExtensions, ExtensionTypeModules); } const char* FileExtProvider::getModuleExtension(ModuleExtensions extension) { return moduleExtensions[extension*2]; } const char* FileExtProvider::getModuleDescription(ModuleExtensions extension) { return moduleExtensions[extension*2+1]; } const char* const* FileExtProvider::getInstrumentExtensions() { return fillList(instrumentExtensions, ExtensionTypeInstruments); } const char* FileExtProvider::getInstrumentExtension(InstrumentExtensions extension) { return instrumentExtensions[extension*2]; } const char* FileExtProvider::getInstrumentDescription(InstrumentExtensions extension) { return instrumentExtensions[extension*2+1]; } const char* const* FileExtProvider::getSampleExtensions() { return fillList(sampleExtensions, ExtensionTypeSamples); } const char* FileExtProvider::getSampleExtension(SampleExtensions extension) { return sampleExtensions[extension*2]; } const char* FileExtProvider::getSampleDescription(SampleExtensions extension) { return sampleExtensions[extension*2+1]; } const char* const* FileExtProvider::getPatternExtensions() { return fillList(patternExtensions, ExtensionTypePatterns); } const char* FileExtProvider::getPatternExtension(PatternExtensions extension) { return patternExtensions[extension*2]; } const char* FileExtProvider::getPatternDescription(PatternExtensions extension) { return patternExtensions[extension*2+1]; } const char* const* FileExtProvider::getTrackExtensions() { return fillList(trackExtensions, ExtensionTypeTracks); } const char* FileExtProvider::getTrackExtension(TrackExtensions extension) { return trackExtensions[extension*2]; } const char* FileExtProvider::getTrackDescription(TrackExtensions extension) { return trackExtensions[extension*2+1]; } const char* const* FileExtProvider::getColorExtensions() { return colorExtensions; } const char* FileExtProvider::getColorExtension(ColorExtensions extension) { return colorExtensions[extension*2]; } const char* FileExtProvider::getColorDescription(ColorExtensions extension) { return colorExtensions[extension*2+1]; } milkytracker-0.90.85+dfsg/src/tracker/Equalizer.h0000644000175000017500000000327311150223367020764 0ustar admin2admin2/* * tracker/Equalizer.h * * Copyright 2009 David Ross (david_ross@hotmail.co.uk) * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __EQUALIZER_H__ #define __EQUALIZER_H__ #include "math.h" class Equalizer { public: Equalizer(void); ~Equalizer(void); void CalcCoeffs(float centre, float width, float rate, float gain); void Filter(double xL, double xR, double &yL, double &yR); // Calculate frequency from 20Hz to 20,000 Hz, a value of 0 to 1 should be passed (as is normally used in linear controls) static float CalcFreq(float f) { return (float)(pow(1000.0f,f)*20); } // Calculate Gain value, which is passed when you CalcCoeffs(), a value from 0 to 1 should be passed, this will result in a -12 to 12 dB cut \ boost. i.e. 0 = -12dB, 0.5 = 0dB, 1 = 12dB static float CalcGain(float val) { float dB = 12.0f * ((2.0f * val) - 1.0f); float gain = (float)pow(10.0f, (dB / 20.0f)); return (gain); } private: double b0, b1, b2; double a0, a1, a2; double xL1, xL2; double xR1, xR2; double yL1, yL2; double yR1, yR2; }; #endif milkytracker-0.90.85+dfsg/src/tracker/Tracker.h0000644000175000017500000004455611150223367020427 0ustar admin2admin2/* * tracker/Tracker.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef TRACKER__H #define TRACKER__H #include "BasicTypes.h" #include "Event.h" #include "EditModes.h" #include "FileTypes.h" #define INPUTCONTAINERHEIGHT_DEFAULT (25+SCROLLBUTTONSIZE+4) #define INPUTCONTAINERHEIGHT_EXTENDED (25+SCROLLBUTTONSIZE+4+13) template class PPSimpleVector; class PPScreen; class ModuleEditor; class PatternEditor; class SampleEditor; class EnvelopeEditor; class PlayerController; class PlayerMaster; class TabManager; class PatternEditorControl; class PPListBox; class PPStaticText; class EnvelopeEditorControl; class PianoControl; class PeakLevelControl; class ScopesControl; class SampleEditorControl; class PPContainer; class PPMessageBoxContainer; class TrackerSettingsDatabase; class PPDictionaryKey; class PPFont; // OS Interfaces class PPSavePanel; class PPOpenPanel; // Section forwards class SectionAbstract; class SectionTranspose; class SectionAdvancedEdit; class SectionDiskMenu; class SectionHDRecorder; class SectionSettings; class SectionInstruments; class SectionSamples; class SectionQuickOptions; class SectionOptimize; class SectionAbout; class PatternEditorControl; class InputControlListener; class PPDialogBase; class DialogResponder; class ToolInvokeHelper; struct TMixerSettings; // Key binding forwards class Tracker; typedef void (Tracker::*TTrackerKeyBindingHandler)(); template class PPKeyBindings; class Tracker : public EventListenerInterface { private: // I've replaced some constants #ifndef __LOWRES__ pp_int32 SCOPESHEIGHT(); pp_int32 CURRENTSCOPESHEIGHT(); pp_int32 UPPERSECTIONDEFAULTHEIGHTWOINS() { return 54+64; } pp_int32 UPPERSECTIONDEFAULTHEIGHT() { return ((UPPERSECTIONDEFAULTHEIGHTWOINS())+(CURRENTSCOPESHEIGHT())); } pp_int32 INSTRUMENTSECTIONDEFAULTHEIGHT() { return 206; } pp_int32 SAMPLESECTIONDEFAULTHEIGHT(); pp_int32 TABHEADERHEIGHT() { return 16; } pp_int32 MAXEDITORHEIGHT(); #else pp_int32 SCOPESHEIGHT() { return 64; } pp_int32 SCOPESWIDTH() { return 320-26; } pp_int32 UPPERSECTIONDEFAULTHEIGHT() { return (64+16); } pp_int32 INSTRUMENTSECTIONDEFAULTHEIGHT() { return 188; } pp_int32 SAMPLESECTIONDEFAULTHEIGHT() { return 184; } pp_int32 NUMSUBMENUS() { return 5; } pp_int32 MAXEDITORHEIGHT(); #endif pp_uint8* muteChannels; TabManager* tabManager; PlayerController* playerController; PlayerMaster* playerMaster; ModuleEditor* moduleEditor; class PlayerLogic* playerLogic; class RecorderLogic* recorderLogic; PatternEditorControl* patternEditorControl; PeakLevelControl* peakLevelControl; ScopesControl* scopesControl; PPStaticText* playTimeText; // - Sections -------------------------------------------------------------- class SectionSwitcher* sectionSwitcher; PPSimpleVector* sections; SectionTranspose* sectionTranspose; SectionAdvancedEdit* sectionAdvancedEdit; SectionDiskMenu* sectionDiskMenu; SectionHDRecorder* sectionHDRecorder; SectionSettings* sectionSettings; SectionInstruments* sectionInstruments; SectionSamples* sectionSamples; SectionQuickOptions* sectionQuickOptions; SectionOptimize* sectionOptimize; SectionAbout* sectionAbout; InputControlListener* inputControlListener; DialogResponder* responder; PPDialogBase* dialog; ToolInvokeHelper* toolInvokeHelper; PPScreen* screen; TrackerSettingsDatabase* settingsDatabase; TrackerSettingsDatabase* settingsDatabaseCopy; PPSystemString currentFileName; bool lastState; // - Tracker mode ---------------------------------------------------------- EditModes editMode; // - Misc. settings -------------------------------------------------------- bool extendedOrderlist; bool followSong; bool caughtMouseInUpperLeftCorner; bool useClassicBrowser; // - Keyboard bindings ----------------------------------------------------- PPKeyBindings* eventKeyDownBindings; PPKeyBindings* eventKeyDownBindingsMilkyTracker; PPKeyBindings* eventKeyDownBindingsFastTracker; // - settings -------------------------------------------------------------- void buildDefaultSettings(); void applySettingByKey(PPDictionaryKey* theKey, TMixerSettings& settings, pp_uint32 version); static void getMixerSettingsFromDatabase(TMixerSettings& mixerSettings, TrackerSettingsDatabase& currentSettings); void applySettings(TrackerSettingsDatabase* newSettings, TrackerSettingsDatabase* currentSettings = NULL, bool applyMixerSettings = true, bool allowMixerRestart = true); // - global controls ------------------------------------------------------- PPListBox* listBoxOrderList; PPListBox* listBoxInstruments; PPListBox* listBoxSamples; // - build UI parts -------------------------------------------------------- void initSectionOrderlist(pp_int32 x, pp_int32 y); void initSectionSpeed(pp_int32 x, pp_int32 y); void initSectionPattern(pp_int32 x, pp_int32 y); void initSectionMainOptions(pp_int32 x, pp_int32 y); void initListboxesSection(pp_int32 x, pp_int32 y); // - instrument selector dialog -------------------------------------------- void initAdvEdit(); void initInstrumentChooser(pp_int32 id, const PPString& buttonText, const PPString& buttonText2, const PPString& caption, const PPString& userString1, const PPString& userString2, pp_int32 srcSelection = -1, pp_int32 srcSelection2 = -1, pp_int32 srcSelection3 = -1); void updateInstrumentChooser(bool repaint = true); PPMessageBoxContainer* instrumentChooser; // - message boxes --------------------------------------------------------- PPMessageBoxContainer* messageBoxContainerGeneric; enum MessageBoxTypes { MessageBox_OK, MessageBox_YESNO, MessageBox_YESNOCANCEL }; void showMessageBox(pp_int32 id, const PPString& caption, MessageBoxTypes type, bool update = true); void showMessageBoxSized(pp_int32 id, const PPString& caption, MessageBoxTypes type, pp_int32 width = -1, pp_int32 height = -1, bool update = true); void showQuitMessageBox(const char* caption, const char* cpationOk, const char* captionCancel); // - software input panel -------------------------------------------------- PPContainer* inputContainerCurrent; PPContainer* inputContainerDefault; PPContainer* inputContainerExtended; void initInputContainerDefault(pp_int32 x, pp_int32 y); void initInputContainerExtended(pp_int32 x, pp_int32 y); enum SIPs { SIPDefault, SIPExtended }; void setInputControl(SIPs sip); void moveInputControls(pp_uint32 deltay); void hideInputControl(bool bHide = true); // - GUI refreshing -------------------------------------------------------- void updateAboutToggleButton(pp_int32 id, bool b, bool repaint = true); void updateSongTitle(bool repaint = true); #ifdef __LOWRES__ void updateJamMenuOrder(bool repaint = true); #endif void updateOrderlist(bool repaint = true); void updateSongLength(bool repaint = true); void updateSongRepeat(bool repaint = true); void updateBPM(bool repaint = true); bool updateSpeed(bool repaint = true); void updatePatternAddAndOctave(bool repaint = true); void updatePatternIndex(bool repaint = true); void updatePatternLength(bool repaint = true); void updatePattern(bool repaint = true); void updateSamplesListBox(bool repaint = true); void updateInstrumentsListBox(bool repaint = true); void updateSongInfo(bool repaint = true); void updateTabTitle(); void updateWindowTitle(); void updateWindowTitle(const PPSystemString& fileName); bool updatePianoControl(PianoControl* pianoControl); bool updatePeakLevelControl(); bool updatePlayTime(); void updateSampleEditor(bool repaint = true, bool force = false); void updateSampleEditorAndInstrumentSection(bool repaint = true); void updateAfterLoad(bool loadResult, bool wasPlaying, bool wasPlayingPattern); void updateAfterTabSwitch(); // - show hide GUI sections ------------------------------------------------ // Show/hide main section (song settings + main menu) void showSongSettings(bool show); void showMainOptions(bool show); #ifdef __LOWRES__ void selectScopesControl(pp_int32 ctrlType); void updateScopesControlButtons(); void toggleJamMenuPianoSize(); void flipInstrumentListBoxes(); #endif void showMainMenu(bool show, bool showInstrumentSelector); void showScopes(bool visible, pp_uint32 style); // - misc. ----------------------------------------------------------------- pp_int32 lastPos, lastRow; pp_int32 lastSpeed, lastBPM, lastMainVol; void resetStateMemories() { lastPos = lastRow = -1; lastSpeed = lastBPM = lastMainVol = -1; } bool updateSongPosition(pp_int32 pos = -1, pp_int32 row = -1, bool fast = false); // this always repaints, so no bool return value void updateRecordButton(PPContainer* container, const PPColor& pColor); void doFollowSong(); PatternEditorControl* getPatternEditorControl() { return patternEditorControl; } void updatePatternEditorControl(bool repaint = true, bool fast = false); PatternEditor* getPatternEditor(); SampleEditor* getSampleEditor(); EnvelopeEditor* getEnvelopeEditor(); pp_int32 getOrderListBoxIndex(); void setOrderListIndex(pp_int32 index); bool isEditingCurrentOrderlistPattern(); pp_int32 getInstrumentToPlay(pp_int32 note, PlayerController*& playerController); void setNumChannels(pp_int32 numChannels, bool repaint = true); bool isActiveEditing(); void ensureSongStopped(bool bResetMainVolume, bool suspend); void ensureSongPlaying(bool continuePlaying); void initPlayback(); bool shouldFollowSong(); bool getFollowSong(); void setFollowSong(bool b, bool repaint = true); bool getProspectiveMode(); void setProspectiveMode(bool b, bool repaint = true); bool getCursorWrapAround(); void setCursorWrapAround(bool b, bool repaint = true); void setLiveSwitch(bool b, bool repaint = true); void updateSongRow(bool checkFollowSong = true); void selectInstrument(pp_int32 instrument); void fillInstrumentListBox(PPListBox* listBox, ModuleEditor* moduleEditor = NULL); void fillSampleListBox(PPListBox* listBox, pp_int32 insIndex, ModuleEditor* moduleEditor = NULL); void fillModuleListBox(PPListBox* listBox); void setChanged(); bool checkForChanges(ModuleEditor* module = NULL); bool checkForChangesOpenModule(); bool swapAndCopyHandler(pp_int32 messageBoxID, pp_int32 messageBoxButtonID); void handleQuit(); bool messageBoxEventListener(pp_int32 messageBoxID, pp_int32 messageBoxButtonID); void rearrangePatternEditorControl(); void rearrangePatternEditorControlOrInstrumentContainer(); void expandOrderlist(bool b); void flipSpeedSection(); void enableInstrument(bool b); void commitListBoxChanges(); // Signal waitstate void signalWaitState(bool b); // - Load/Save ------------------------------------------------------------- FileTypes currentSaveFileType; PPSavePanel* savePanel; EventListenerInterface* fileSystemChangedListener; FileTypes getCurrentSelectedSampleSaveType(); struct TPrepareLoadingParameters { FileTypes eType; PPSystemString filename; PPSystemString preferredFilename; bool suspendPlayer; bool repaint; bool res; PPString lastError; bool wasPlaying; bool wasPlayingPattern; bool abortLoading; bool deleteFile; bool didOpenTab; TPrepareLoadingParameters() : abortLoading(false), deleteFile(false), didOpenTab(false) { } } loadingParameters; static pp_uint32 fileTypeToHint(FileTypes type); void prepareLoadSaveUI(); void finishLoadSaveUI(); bool loadGenericFileType(const PPSystemString& fileName); bool prepareLoading(FileTypes eType, const PPSystemString& fileName, bool suspendPlayer, bool repaint, bool saveCheck); bool finishLoading(); bool loadTypeFromFile(FileTypes eType, const PPSystemString& fileName, bool suspendPlayer = true, bool repaint = true, bool saveCheck = true); bool loadTypeWithDialog(FileTypes eType, bool suspendPlayer = true, bool repaint = true); void loadType(FileTypes eType); bool prepareSavingWithDialog(FileTypes eType); bool saveTypeWithDialog(FileTypes eType, EventListenerInterface* fileSystemChangedListener = NULL); bool saveCurrentModuleAsSelectedType(); void saveType(FileTypes eType); void save(); void saveAs(); void handleSaveProceed(); void handleSaveCancel(); void buildMODSaveErrorWarning(pp_int32 error); void estimateSongLength(bool signalWait = false); public: Tracker(); virtual ~Tracker(); void setScreen(PPScreen* screen) { this->screen = screen; } void initUI(); void setModuleNumChannels(pp_uint32 numChannels); // PPEvent listener pp_int32 handleEvent(PPObject* sender, PPEvent* event); PPSize getWindowSizeFromDatabase(); bool getFullScreenFlagFromDatabase(); pp_int32 getScreenScaleFactorFromDatabase(); bool getShowSplashFlagFromDatabase(); void showSplash(); void hideSplash(); // Tracker startup void startUp(bool forceNoSplash = false); // Tracker shutdown bool shutDown(); void saveModule(const PPSystemString& fileName); void sendNoteDown(pp_int32 note, pp_int32 volume = -1); void sendNoteUp(pp_int32 note); private: void switchEditMode(EditModes mode); // Process keyboard events according to current edit mode void processShortcuts(PPEvent* event); // Process messagebox shortcuts (RETURN & ESC) bool processMessageBoxShortcuts(PPEvent* event); void processShortcutsMilkyTracker(PPEvent* event); void selectNextOrder(bool wrap = false); void selectPreviousOrder(bool wrap = false); void selectNextInstrument(); void selectPreviousInstrument(); void processShortcutsFastTracker(PPEvent* event); // - Keyboard bindings ----------------------------------------------------- pp_int16 currentKeyCode; bool executeBinding(const PPKeyBindings* bindings, pp_uint16 keyCode); void initKeyBindings(); void eventKeyDownBinding_OpenTab(); void eventKeyDownBinding_CloseTab(); void eventKeyDownBinding_SwitchToNextTab(); void eventKeyDownBinding_SwitchToPreviousTab(); void setOctave(pp_uint32 octave); void eventKeyDownBinding_SelectOctave1(); void eventKeyDownBinding_SelectOctave2(); void eventKeyDownBinding_SelectOctave3(); void eventKeyDownBinding_SelectOctave4(); void eventKeyDownBinding_SelectOctave5(); void eventKeyDownBinding_SelectOctave6(); void eventKeyDownBinding_SelectOctave7(); void eventKeyDownBinding_SelectOctave8(); void eventKeyDownBinding_PlaySong(); void eventKeyDownBinding_PlayPattern(); void eventKeyDownBinding_PlayPosition(); void eventKeyDownBinding_PlayPatternFromFIRSTQUARTER(); void eventKeyDownBinding_PlayPatternFromSECONDQUARTER(); void eventKeyDownBinding_PlayPatternFromTHIRDQUARTER(); void eventKeyDownBinding_PlayRow(); void eventKeyDownBinding_PlayTrace(); void eventKeyDownBinding_Stop(); void eventKeyDownBinding_Edit(); void eventKeyDownBinding_UnmuteAll(); void eventKeyDownBinding_Open(); void eventKeyDownBinding_Save(); void eventKeyDownBinding_SaveAs(); void eventKeyDownBinding_NextPattern(); void eventKeyDownBinding_PreviousPattern(); // - Invoke sections void eventKeyDownBinding_InvokeMainScreen(); void eventKeyDownBinding_InvokeSectionInstruments(); void eventKeyDownBinding_InvokeSectionSamples(); void eventKeyDownBinding_InvokeSectionSettings(); void eventKeyDownBinding_InvokeSectionTranspose(); void eventKeyDownBinding_InvokeSectionAdvancedEdit(); void eventKeyDownBinding_InvokeSectionDiskMenu(); void eventKeyDownBinding_InvokeSectionHDRecorder(); void eventKeyDownBinding_InvokeSectionQuickOptions(); void eventKeyDownBinding_InvokeSectionOptimize(); void eventKeyDownBinding_InvokeSectionAbout(); // Some handy shortcuts void eventKeyDownBinding_ToggleFT2Edit(); void eventKeyDownBinding_ToggleFollowSong(); void eventKeyDownBinding_ToggleProspectiveMode(); void eventKeyDownBinding_ToggleCursorWrapAround(); void eventKeyDownBinding_ToggleLiveSwitch(); void eventKeyDownBinding_ToggleRecordKeyOff(); void eventKeyDownBinding_ToggleScopes(); void eventKeyDownBinding_InvokePatternToolVolumeScalePattern(); void eventKeyDownBinding_InvokePatternToolVolumeScaleTrack(); void eventKeyDownBinding_InvokePatternToolVolumeScaleSelection(); void eventKeyDownBinding_InvokeQuickChooseInstrument(); // - Some FT2 standard bindings void eventKeyDownBinding_TransposeCurInsTrackDown(); void eventKeyDownBinding_TransposeCurInsTrackUp(); void eventKeyDownBinding_TransposeCurInsPatternDown(); void eventKeyDownBinding_TransposeCurInsPatternUp(); void eventKeyDownBinding_TransposeCurInsBlockDown(); void eventKeyDownBinding_TransposeCurInsBlockUp(); void eventKeyDownBinding_TransposeAllInsTrackDown(); void eventKeyDownBinding_TransposeAllInsTrackUp(); void eventKeyDownBinding_TransposeAllInsPatternDown(); void eventKeyDownBinding_TransposeAllInsPatternUp(); void eventKeyDownBinding_TransposeAllInsBlockDown(); void eventKeyDownBinding_TransposeAllInsBlockUp(); void eventKeyDownBinding_ExitApplication(); private: // - friend classes -------------------------------------------------------- friend class SectionAbstract; friend class SectionUpperLeft; friend class SectionSettings; friend class SectionTranspose; friend class SectionAdvancedEdit; friend class SectionDiskMenu; friend class SectionReplacedInstrumentListBoxes; friend class SectionInstruments; friend class SectionSamples; friend class SectionHDRecorder; friend class SectionQuickOptions; friend class SectionOptimize; friend class SectionAbout; friend class InputControlListener; friend class SampleLoadChannelSelectionHandler; friend class ZapInstrumentHandler; friend class ToolInvokeHelper; friend class SaveProceedHandler; friend class PanningSettingsContainer; friend class TabManager; friend class PlayerLogic; friend class RecorderLogic; friend class Zapper; friend class SectionSwitcher; }; #endif milkytracker-0.90.85+dfsg/src/tracker/AnimatedFXControl.cpp0000644000175000017500000001640611317477251022711 0ustar admin2admin2/* * tracker/AnimatedFXControl.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PeakLevelControl.cpp * MilkyTracker * * Created by Peter Barth on 28.10.05. * */ #include "AnimatedFXControl.h" #include "Screen.h" #include "GraphicsAbstract.h" #include "Font.h" #include "ScrollBar.h" #include "TrackerConfig.h" #include "LogoSmall.h" #include "TrackerConfig.h" #include "Tools.h" #undef FXTOGGLE #ifdef __LOWRES__ #define __SIMPLEFX__ #endif #ifdef __SIMPLEFX__ #include "Starfield.h" #undef FXTOGGLE #else #include "TwisterFX.h" #include "Fire.h" #endif static const char* text = "Another year, another release! " "Actually, almost 20 months have passed since the previous release - but better late than never ;) In this " "time we have fixed many bugs and made some small improvements (see the ChangeLog.html for full details). We " "have also modified the library of MilkyPlay (MilkyTracker's player routines) from GPL to BSD, which means " "that you can now use MilkyTracker's playback code in your own applications/games/demos without having to " "open-source them. " "Now heads up for some credits! " "MilkyTracker contains code from the following people: " "Antti S. Lankila (Amiga filter algorithm/coefficients), " "Andrew Simper (noise code), " "David Ross (EQ code), " "Heikki Orsila/Claudio Matsuoka (powerpacker decrunching) " "MilkyTracker also makes use of some common 3rd party libraries: " "RtMidi/RtAudio, " "zlib & zziplib (ZIP extraction) " "A special thanks goes out to everyone who has donated money to support MilkyTracker " "or contributed to MilkyTracker by dropping emails, writing bug reports or drawing fonts. " "Now enjoy your stay, happy tracking! " "----- wrapping ---- wrapping ---- wrapping ---- ..... "; pp_int32 AnimatedFXControl::counter = 0; void AnimatedFXControl::createFX() { if (fx) { delete fx; fx = NULL; } if (!vscreen) vscreen = new pp_uint8[visibleWidth*visibleHeight*3]; #ifdef __SIMPLEFX__ fx = new Starfield(visibleWidth, visibleHeight); #else #ifdef FXTOGGLE if (++counter & 1) fx = new Fire(visibleWidth, visibleHeight); else fx = new TwisterFX(visibleWidth, visibleHeight); #else fx = new TwisterFX(visibleWidth, visibleHeight); #endif #endif } AnimatedFXControl::AnimatedFXControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border/*= true*/) : PPControl(id, parentScreen, eventListener, location, size), borderColor(&ourOwnBorderColor), fx(NULL), vscreen(NULL) { this->border = border; // default color color.set(0, 0, 0); ourOwnBorderColor.set(192, 192, 192); visibleWidth = size.width - 2; visibleHeight = size.height - 2; #ifndef __SIMPLEFX__ createFX(); #endif xPos = visibleWidth << 8; font = PPFont::getFont(PPFont::FONT_SYSTEM); textBufferMaxChars = visibleWidth*2 / font->getCharWidth(); textBuffer = new char[textBufferMaxChars + 1]; currentCharIndex = 0; pp_int32 j = currentCharIndex % strlen(text); for (pp_int32 i = 0; i < (signed)textBufferMaxChars; i++) { if (j >= (signed)strlen(text)) j = 0; textBuffer[i] = text[j]; j++; } lastTime = 0; milkyVersionString[0] = 'v'; PPTools::convertToHex(milkyVersionString+1, (TrackerConfig::version>>16)&0xF, 1); milkyVersionString[2] = '.'; PPTools::convertToHex(milkyVersionString+3, (TrackerConfig::version>>8)&0xFF, 2); milkyVersionString[5] = '.'; PPTools::convertToHex(milkyVersionString+6, TrackerConfig::version&0xFF, 2); milkyVersionString[8] = '\0'; } AnimatedFXControl::~AnimatedFXControl() { delete[] textBuffer; delete fx; delete[] vscreen; } void AnimatedFXControl::paint(PPGraphicsAbstract* g) { if (!isVisible() || !vscreen) return; g->setFont(font); pp_int32 xOffset = 2; pp_int32 yOffset = 2; g->setRect(location.x, location.y, location.x + size.width+1, location.y + size.height+1); if (border) { drawThickBorder(g, *borderColor); } g->setRect(location.x + 1, location.y + 1, location.x + size.width - 2, location.y + size.height - 2); fx->render(vscreen); pp_uint8* vptr = vscreen; const pp_uint8* iptr = LogoSmall::rawData; PPPoint p = location; p.x+=xOffset; p.y+=yOffset; PPSize s; s.width = visibleWidth-2; s.height = visibleHeight-2; for (pp_int32 i = 0; i < visibleHeight-2; i++) for (pp_int32 j = 0; j < visibleWidth-2; j++) { pp_int32 a = *(iptr+3); if (a == 255) { *vptr = *(iptr+2); *(vptr+1) = *(iptr+1); *(vptr+2) = *iptr; } else if (a) { *vptr = (a*(*(iptr+2))+(255-a)*(*vptr))>>8; *(vptr+1) = (a*(*(iptr+1))+(255-a)*(*(vptr+1)))>>8; *(vptr+2) = (a*(*iptr)+(255-a)*(*(vptr+2)))>>8; } vptr+=3; iptr+=4; } g->blit(vscreen, p, s, visibleWidth*3, 3); g->setRect(location.x+2, location.y+2, location.x + size.width-2, location.y + size.height-2); // Printf version string g->setColor(0, 0, 0); g->drawString(milkyVersionString, location.x + 4 + 1, location.y + 4 + 1); g->setColor(255, 255, 255); g->drawString(milkyVersionString, location.x + 4, location.y + 4); g->setColor(0, 0, 0); g->drawString(textBuffer, location.x + (xPos>>8) + 1, location.y + visibleHeight - 10 + 1); g->setColor(255, 255, 255); g->drawString(textBuffer, location.x + (xPos>>8), location.y + visibleHeight - 10); pp_uint32 currentTime = ::PPGetTickCount(); pp_uint32 dTime; if (lastTime) dTime = currentTime - lastTime; else dTime = 40; xPos-=dTime*8; if (xPos < -(signed)(font->getCharWidth()<<8)) { while (xPos < -(signed)(font->getCharWidth()<<8)) { xPos+=font->getCharWidth()<<8; currentCharIndex++; } pp_int32 j = currentCharIndex % strlen(text); for (pp_int32 i = 0; i < (signed)textBufferMaxChars; i++) { if (j >= (signed)strlen(text)) j = 0; textBuffer[i] = text[j]; j++; } } fx->update(dTime<<11); lastTime = currentTime; } pp_int32 AnimatedFXControl::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; //if (!visible) // return 0; switch (event->getID()) { case eTimer: if (!(fxTicker & 1)) parentScreen->paintControl(this); fxTicker++; break; case eLMouseUp: case eRMouseUp: { PPEvent e(eCommand); eventListener->handleEvent(reinterpret_cast(this), &e); break; } } return 0; } void AnimatedFXControl::show(bool bShow) { PPControl::show(bShow); if (!bShow) { #if defined(FXTOGGLE) || defined(__LOWRES__) delete fx; fx = NULL; delete[] vscreen; vscreen = NULL; #endif lastTime = 0; } else { #if defined(FXTOGGLE) || defined(__LOWRES__) createFX(); #endif } } milkytracker-0.90.85+dfsg/src/tracker/SectionAbout.cpp0000644000175000017500000000367711150223367021765 0ustar admin2admin2/* * tracker/SectionAbout.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionAbout.cpp * MilkyTracker * * Created by Peter Barth on 17.11.05. * */ #include "SectionAbout.h" #include "Tracker.h" #include "TrackerConfig.h" #include "PlayerController.h" #include "PlayerGeneric.h" #include "AnimatedFXControl.h" #include "ControlIDs.h" enum ControlIDs { FXCONTROL = 9000 }; SectionAbout::SectionAbout(Tracker& theTracker) : SectionUpperLeft(theTracker) { } SectionAbout::~SectionAbout() { } pp_int32 SectionAbout::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case FXCONTROL: if (event->getID() != eCommand) break; show(false); break; } } return 0; } void SectionAbout::init(pp_int32 px, pp_int32 py) { PPScreen* screen = tracker.screen; AnimatedFXControl* ctrl = new AnimatedFXControl(FXCONTROL, tracker.screen, this, PPPoint(px, py), PPSize(320, UPPERLEFTSECTIONHEIGHT)); ctrl->setBorderColor(TrackerConfig::colorThemeMain); screen->addControl(ctrl); sectionContainer = ctrl; initialised = true; showSection(false); } void SectionAbout::update(bool repaint/* = true*/) { } milkytracker-0.90.85+dfsg/src/tracker/FileTypes.h0000755000175000017500000000271011150223367020725 0ustar admin2admin2/* * tracker/FileTypes.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * FileTypes.h * milkytracker_universal * * Created by Peter Barth on 12.07.08. * */ #ifndef __FILETYPES_H__ #define __FILETYPES_H__ #include "BasicTypes.h" struct FileTypes { enum Types { FileTypeAllFiles, FileTypeSongAllModules, FileTypeSongMOD, FileTypeSongXM, FileTypeSongWAV, FileTypePatternXP, FileTypeTrackXT, FileTypeSongAllInstruments, FileTypeInstrumentXI, FileTypeSongAllSamples, FileTypeSampleWAV, FileTypeSampleIFF }; Types type; FileTypes() : type(FileTypeAllFiles) { } FileTypes(Types type) : type(type) { } FileTypes(pp_int32 type) : type((Types)type) { } operator pp_int32() const { return (pp_int32)type; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/DialogWithValues.h0000755000175000017500000000527611150223367022246 0ustar admin2admin2/* * tracker/DialogWithValues.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogWithValues.h * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #ifndef __DIALOGWITHVALUES_H__ #define __DIALOGWITHVALUES_H__ #include "DialogBase.h" class DialogWithValues : public PPDialogBase { public: enum ValueStyles { ValueStyleEnterOneValue, ValueStyleEnterTwoValues }; private: float valueOne, valueTwo; float valueOneRangeStart, valueOneRangeEnd, valueOneIncreaseStep; float valueTwoRangeStart, valueTwoRangeEnd, valueTwoIncreaseStep; pp_int32 numValueOneDecimals, numValueTwoDecimals; public: DialogWithValues(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, ValueStyles style); float getValueOne() { return valueOne; } float getValueTwo() { return valueTwo; } void setValueOne(float val) { if (val < valueOneRangeStart) val = valueOneRangeStart; if (val > valueOneRangeEnd) val = valueOneRangeEnd; valueOne = val; updateListBoxes(); } void setValueTwo(float val) { if (val < valueTwoRangeStart) val = valueTwoRangeStart; if (val > valueTwoRangeEnd) val = valueTwoRangeEnd; valueTwo = val; updateListBoxes(); } void setValueOneRange(float start, float end, pp_int32 numDecimals); void setValueOneIncreaseStep(float step) { valueOneIncreaseStep = step; } void setValueTwoRange(float start, float end, pp_int32 numDecimals); void setValueTwoIncreaseStep(float step) { valueTwoIncreaseStep = step; } void setValueOneCaption(const PPString& caption); void setValueTwoCaption(const PPString& caption); virtual void show(bool b = true); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); private: void fitListBoxes(); void fitListBox(pp_int32 id, float valueOneRangeStart, float valueOneRangeEnd, pp_int32 numDecimals); void updateListBoxes(); void updateListBox(pp_int32 id, float val, pp_int32 numDecimals); void listBoxEnterEditState(pp_int32 id); void commitChanges(); void switchListBox(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/TrackerConfig.h0000644000175000017500000000532711150223367021546 0ustar admin2admin2/* * tracker/TrackerConfig.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef TRACKERCONFIG__H #define TRACKERCONFIG__H #include "BasicTypes.h" #define NUMEFFECTMACROS 20 class TrackerConfig { public: static const PPString stringButtonPlus; static const PPString stringButtonMinus; static const PPString stringButtonUp; static const PPString stringButtonDown; static const PPString stringButtonExtended; static const PPString stringButtonCollapsed; enum { MAXCHANNELS = 256, MAXNOTES = 120, // 10 octaves, even though FT2 only uses 8 }; static const PPPoint trackerExitBounds; static PPColor colorThemeMain; static PPColor colorRecordModeButtonText; // Pattern colors static PPColor colorPatternEditorBackground; static PPColor colorPatternEditorCursor; static PPColor colorPatternEditorCursorLine; static PPColor colorPatternEditorCursorLineHighLight; static PPColor colorPatternEditorSelection; static PPColor colorPatternEditorNote; static PPColor colorPatternEditorInstrument; static PPColor colorPatternEditorVolume; static PPColor colorPatternEditorEffect; static PPColor colorPatternEditorOperand; static PPColor colorHighLight_1; static PPColor colorHighLight_2; static PPColor colorScopes; static PPColor colorRowHighLight_1; static PPColor colorRowHighLight_2; static pp_int32 numTabs; static pp_int32 numPlayerChannels; static pp_int32 numVirtualChannels; static pp_int32 totalPlayerChannels; static const pp_int32 maximumPlayerChannels; static bool useVirtualChannels; static const pp_int32 numPredefinedEnvelopes; static const pp_int32 numPredefinedColorPalettes; static const PPString defaultPredefinedVolumeEnvelope; static const PPString defaultPredefinedPanningEnvelope; static const PPString defaultProTrackerPanning; static const PPString defaultColorPalette; static const char* predefinedColorPalettes[]; static const PPSystemString untitledSong; static const pp_int32 numMixFrequencies; static const pp_int32 mixFrequencies[]; static const pp_uint32 version; }; #endif milkytracker-0.90.85+dfsg/src/tracker/FilterParameters.h0000644000175000017500000000416111150223367022271 0ustar admin2admin2/* * tracker/FilterParameters.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * FilterParameters.h * MilkyTracker * * Created by Peter Barth on 25.11.07. * */ #ifndef __FILTERPARAMETERS_H__ #define __FILTERPARAMETERS_H__ class FilterParameters { public: union Parameter { float floatPart; pp_int32 intPart; Parameter() { memset(this, 0, sizeof(Parameter)); } Parameter(const Parameter& src) { memcpy(this, &src, sizeof(Parameter)); } explicit Parameter(float value) : floatPart(value) { } explicit Parameter(pp_int32 value) : intPart(value) { } }; private: Parameter* parameters; pp_int32 numParameters; public: FilterParameters(pp_int32 numParameters) : numParameters(numParameters), parameters(new Parameter[numParameters]) { } // Construction FilterParameters(const FilterParameters& par) { numParameters = par.numParameters; parameters = new Parameter[numParameters]; for (pp_int32 i = 0; i < numParameters; i++) parameters[i] = par.parameters[i]; } ~FilterParameters() { delete[] parameters; } void setParameter(pp_int32 index, const Parameter& par) { if (index >= 0 && index < numParameters) parameters[index] = par; } Parameter getParameter(pp_int32 index) const { if (index >= 0 && index < numParameters) return parameters[index]; return Parameter(); } pp_int32 getNumParameters() const { return numParameters; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/ColorExportImport.cpp0000755000175000017500000000336611150223367023037 0ustar admin2admin2/* * tracker/ColorExportImport.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ColorExportImport.cpp * MilkyTracker * * Created by Peter Barth on Sun Mar 13 2005. * */ #include "ColorExportImport.h" #include "TrackerSettingsDatabase.h" #include "XMFile.h" bool ColorExportImport::importColorPalette(TColorPalette& palette) { TrackerSettingsDatabase colorDataBase(1); XMFile f(fileName); if (!f.isOpen()) { // deal with error return false; } if (!colorDataBase.serialize(f)) return false; PPDictionaryKey* key = colorDataBase.restore("ACTIVECOLORS"); if (key) { palette = ColorPaletteContainer::decodePalette(key->getStringValue()); } return key != NULL; } bool ColorExportImport::exportColorPalette(const TColorPalette& palette) { TrackerSettingsDatabase colorDataBase(1); colorDataBase.store("ACTIVECOLORS", ColorPaletteContainer::encodePalette(palette)); XMFile f(fileName, true); if (!f.isOpenForWriting()) { // deal with error return false; } if (!colorDataBase.serialize(f)) return false; return true; } milkytracker-0.90.85+dfsg/src/tracker/VRand.h0000644000175000017500000001034511150223367020033 0ustar admin2admin2/* * tracker/VRand.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ // Author: Andrew Simper of Vellocet // andy@vellocet.com // // Purpose: c++ class to generate white, pink and brown noise // // Sources: // This is a c++ implementation of put together from the // code provided by the following people mainly from // the music-dsp mailing list: Allan Herriman, James McCartney, // Phil Burk and Paul Kellet and the web page by Robin Whittle: // http://www.firstpr.com.au/dsp/pink-noise/ // // 13/8/06 - Fixed white() function to work correctly with gcc (Christopher // O'Neill) #ifndef __VRAND_H_ #define __VRAND_H_ #ifndef _WIN32_WCE #include #else #include #endif // Usage: // ------ // VRande rand; // rand.seed(); // float w = rand.white(); // returns white noise +- 0.5 // float p = rand.pink(); // returns pink noise +- 0.5 // float b = rand.brown(); // returns brown noise +- 0.5 class VRand { public: enum { NumPinkBins = 16, NumPinkBins1 = NumPinkBins-1 }; VRand() { m_white = 0; m_count = 1; m_brown = 0.0f; m_pink = 0; for (int i=0; i> 9; m_white |= 0x40000000; return (m_fwhite-3.0f)*scale; }; int inline CTZ(int num) { int i=0; while (((num>>i)&1)==0 && i<(signed)sizeof(int)) i++; return i; } // returns pink noise random number in the range -0.5 to 0.5 // inline float pink(void) { float prevr; float r; unsigned long k; k = CTZ(m_count); k = k & NumPinkBins1; // get previous value of this octave prevr = m_pinkStore[k]; while (true) { r = white(); // store new value m_pinkStore[k] = r; r -= prevr; // update total m_pink += r; if (m_pink <-4.0f || m_pink > 4.0f) m_pink -= r; else break; } // update counter m_count++; return (white() + m_pink)*0.125f; } // returns brown noise random number in the range -0.5 to 0.5 // inline float brown(void) { while (true) { float r = white(); m_brown += r; if (m_brown<-8.0f || m_brown>8.0f) m_brown -= r; else break; } return m_brown*0.0625f; } private: unsigned long m_seed; unsigned long m_count; union { unsigned long m_white; float m_fwhite; }; float m_pink; float m_brown; float m_pinkStore[NumPinkBins]; }; // This is a little helper section for fast table // lookup pink noise to use in denormalising // and filter excitation // // use: // long i=0; // float noise = pinkNoise(i); // // this leaves a pink noise sample in "noise" // and increments i so the next call gives a // new pink noise sample #define PinkNoiseBins (32768) #define PinkNoiseWrap (32767) extern float VPinkNoise[PinkNoiseBins]; #define pinkNoise(c) VPinkNoise[c&PinkNoiseWrap]; c++; class VPinkNoiseGlobal { public: VPinkNoiseGlobal(void) { VRand rand; rand.seed(); double inaudible = 0.000000059604644775390625; //pow(2.0, -24.0); for (int i=0; i. * */ /* * DialogWithValues.cpp * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #include "DialogWithValues.h" #include "Screen.h" #include "StaticText.h" #include "MessageBoxContainer.h" #include "Font.h" #include "ListBox.h" #include "Seperator.h" DialogWithValues::DialogWithValues(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, ValueStyles style) : PPDialogBase() { valueOne = 0; valueTwo = 0; valueOneRangeStart = (float)-0x7FFFFFFF; valueOneRangeEnd = (float)0x7FFFFFFE; valueTwoRangeStart = (float)-0x7FFFFFFF; valueTwoRangeEnd = (float)0x7FFFFFFE; valueOneIncreaseStep = 1.0f; valueTwoIncreaseStep = 1.0f; numValueOneDecimals = 0; numValueTwoDecimals = 0; switch (style) { case ValueStyleEnterOneValue: #ifdef __LOWRES__ initDialog(screen, responder, id, caption, 290, 110+15, 26+15, "Ok", "Cancel"); #else initDialog(screen, responder, id, caption, 290, 110, 26, "Ok", "Cancel"); #endif break; case ValueStyleEnterTwoValues: #ifdef __LOWRES__ initDialog(screen, responder, id, caption, 290, 142+15, 26+15, "Ok", "Cancel"); #else initDialog(screen, responder, id, caption, 290, 142, 26, "Ok", "Cancel"); #endif break; } pp_int32 x = getMessageBoxContainer()->getLocation().x; pp_int32 width = getMessageBoxContainer()->getSize().width; pp_int32 x2 = x; pp_int32 y2 = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y; PPButton* button; if (style == ValueStyleEnterOneValue || style == ValueStyleEnterTwoValues) { //setValueOneCaption("Enter new volume in percent"); y2 +=20+12; // enter edit field 1 x2 = x + width / 2 - (100+35)/2; PPListBox* listBox = new PPListBox(MESSAGEBOX_LISTBOX_VALUE_ONE, screen, this, PPPoint(x2, y2), PPSize(100,12), true, true, false); listBox->showSelection(false); listBox->setBorderColor(messageBoxContainerGeneric->getColor()); listBox->setMaxEditSize(8); messageBoxContainerGeneric->addControl(listBox); button = new PPButton(MESSAGEBOX_BUTTON_INCREASE_VALUEONE, screen, this, PPPoint(x2 + listBox->getSize().width + 2, y2), PPSize(16, 11)); button->setText("+"); messageBoxContainerGeneric->addControl(button); button = new PPButton(MESSAGEBOX_BUTTON_DECREASE_VALUEONE, screen, this, PPPoint(x2 + listBox->getSize().width + 2 + button->getSize().width + 1, y2), PPSize(16, 11)); button->setText("-"); messageBoxContainerGeneric->addControl(button); #ifdef __LOWRES__ pp_int32 height = getMessageBoxContainer()->getSize().height; pp_int32 y = getMessageBoxContainer()->getLocation().y; const char buttonTexts[] = {'1','2','3','4','5','6','7','8','9','0','+','-','.','<','>'}; pp_int32 bWidth = (width - 22*2 - 2*3) / sizeof(buttonTexts); pp_int32 x2_2 = x+4; pp_int32 y2_2 = y+height - 4 - 13; messageBoxContainerGeneric->addControl(new PPSeperator(0, screen, PPPoint(x2_2-1, y2_2-3), width-2*3, messageBoxContainerGeneric->getColor(), true)); pp_uint32 i = 0; for (i = 0; i < sizeof(buttonTexts); i++) { button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1, 13)); button->setText(buttonTexts[i]); messageBoxContainerGeneric->addControl(button); x2_2+=bWidth; } bWidth = 22; button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1-3, 13)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Del"); messageBoxContainerGeneric->addControl(button); x2_2+=bWidth-3; i++; button = new PPButton(MESSAGEBOX_BUTTON_KEYS_BASE+i, screen, this, PPPoint(x2_2, y2_2), PPSize(bWidth+1, 13)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Back"); messageBoxContainerGeneric->addControl(button); #endif } if (style == ValueStyleEnterTwoValues) { //setValueTwoCaption("Enter new volume in percent"); y2 += 32; // enter edit field 2 x2 = x + width / 2 - (100+35)/2; PPListBox* listBox = new PPListBox(MESSAGEBOX_LISTBOX_VALUE_TWO, screen, this, PPPoint(x2, y2), PPSize(100,12), true, true, false); listBox->showSelection(false); listBox->setBorderColor(messageBoxContainerGeneric->getColor()); listBox->setMaxEditSize(8); messageBoxContainerGeneric->addControl(listBox); button = new PPButton(MESSAGEBOX_BUTTON_INCREASE_VALUETWO, screen, this, PPPoint(x2 + listBox->getSize().width + 2, y2), PPSize(16, 11)); button->setText("+"); messageBoxContainerGeneric->addControl(button); button = new PPButton(MESSAGEBOX_BUTTON_DECREASE_VALUETWO, screen, this, PPPoint(x2 + listBox->getSize().width + 2 + button->getSize().width + 1, y2), PPSize(16, 11)); button->setText("-"); messageBoxContainerGeneric->addControl(button); } fitListBoxes(); updateListBoxes(); } void DialogWithValues::setValueOneCaption(const PPString& caption) { PPControl* ctrl = messageBoxContainerGeneric->getControlByID(MESSAGEBOX_STATICTEXT_VALUE_ONE_CAPTION); if (ctrl) messageBoxContainerGeneric->removeControl(ctrl); pp_int32 width = messageBoxContainerGeneric->getSize().width; pp_int32 x = messageBoxContainerGeneric->getLocation().x; pp_int32 y = messageBoxContainerGeneric->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y; y+=20; x += width / 2 - (PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(caption) / 2); messageBoxContainerGeneric->addControl(new PPStaticText(MESSAGEBOX_STATICTEXT_VALUE_ONE_CAPTION, parentScreen, this, PPPoint(x, y), caption, true)); } void DialogWithValues::setValueTwoCaption(const PPString& caption) { PPControl* ctrl = messageBoxContainerGeneric->getControlByID(MESSAGEBOX_STATICTEXT_VALUE_TWO_CAPTION); if (ctrl) messageBoxContainerGeneric->removeControl(ctrl); pp_int32 width = messageBoxContainerGeneric->getSize().width; pp_int32 x = messageBoxContainerGeneric->getLocation().x; pp_int32 y = messageBoxContainerGeneric->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y; y+=20+32; x += width / 2 - (PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth(caption) / 2); messageBoxContainerGeneric->addControl(new PPStaticText(MESSAGEBOX_STATICTEXT_VALUE_TWO_CAPTION, parentScreen, this, PPPoint(x, y), caption, true)); } void DialogWithValues::show(bool b/* = true*/) { if (b) listBoxEnterEditState(MESSAGEBOX_LISTBOX_VALUE_ONE); PPDialogBase::show(b); } pp_int32 DialogWithValues::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eKeyDown) { pp_uint16 keyCode = *((pp_uint16*)event->getDataPtr()); if (keyCode == VK_TAB) { switchListBox(); event->cancel(); } } else if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case PP_MESSAGEBOX_BUTTON_YES: { commitChanges(); break; } case MESSAGEBOX_BUTTON_INCREASE_VALUEONE: { setValueOne(valueOne+valueOneIncreaseStep); parentScreen->paintControl(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); break; } case MESSAGEBOX_BUTTON_DECREASE_VALUEONE: { setValueOne(valueOne-valueOneIncreaseStep); parentScreen->paintControl(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); break; } case MESSAGEBOX_BUTTON_INCREASE_VALUETWO: { setValueTwo(valueTwo+valueOneIncreaseStep); parentScreen->paintControl(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_TWO)); break; } case MESSAGEBOX_BUTTON_DECREASE_VALUETWO: { setValueTwo(valueTwo-valueOneIncreaseStep); parentScreen->paintControl(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_TWO)); break; } } } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { // song title case MESSAGEBOX_LISTBOX_VALUE_ONE: { const PPString* str = *(reinterpret_cast(event->getDataPtr())); setValueOne((float)atof(*str)); break; } case MESSAGEBOX_LISTBOX_VALUE_TWO: { const PPString* str = *(reinterpret_cast(event->getDataPtr())); setValueTwo((float)atof(*str)); break; } } } return PPDialogBase::handleEvent(sender, event); } void DialogWithValues::setValueOneRange(float start, float end, pp_int32 numDecimals) { valueOneRangeStart = start; valueOneRangeEnd = end; numValueOneDecimals = numDecimals; fitListBoxes(); setValueOne(valueOne); } void DialogWithValues::setValueTwoRange(float start, float end, pp_int32 numDecimals) { valueTwoRangeStart = start; valueTwoRangeEnd = end; numValueTwoDecimals = numDecimals; fitListBoxes(); setValueTwo(valueTwo); } void DialogWithValues::fitListBoxes() { fitListBox(MESSAGEBOX_LISTBOX_VALUE_ONE, valueOneRangeStart, valueOneRangeEnd, numValueOneDecimals); fitListBox(MESSAGEBOX_LISTBOX_VALUE_TWO, valueTwoRangeStart, valueTwoRangeEnd, numValueTwoDecimals); } void DialogWithValues::fitListBox(pp_int32 id, float valueOneRangeStart, float valueOneRangeEnd, pp_int32 numDecimals) { pp_int32 width = messageBoxContainerGeneric->getSize().width; pp_int32 x = messageBoxContainerGeneric->getLocation().x; char buffer1[100]; char buffer2[100]; sprintf(buffer1, "%%.%if", numDecimals); PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(id)); if (listBox) { sprintf(buffer2, buffer1, valueOneRangeStart); pp_int32 len = (pp_int32)strlen(buffer2); sprintf(buffer2, buffer1, valueOneRangeEnd); if ((pp_int32)strlen(buffer2) > len) len = (pp_int32)strlen(buffer2); pp_int32 y2 = listBox->getLocation().y; pp_int32 x2 = x + width / 2 - ((len*8)+10+35)/2; listBox->setLocation(PPPoint(x2, y2)); listBox->setSize(PPSize(len*8+10, listBox->getSize().height)); x2+=listBox->getSize().width + 2; PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(id+1)); y2 = button->getLocation().y; button->setLocation(PPPoint(x2, y2)); x2+=button->getSize().width+1; button = static_cast(messageBoxContainerGeneric->getControlByID(id+2)); y2 = button->getLocation().y; button->setLocation(PPPoint(x2, y2)); } } void DialogWithValues::updateListBoxes() { updateListBox(MESSAGEBOX_LISTBOX_VALUE_ONE, valueOne, numValueOneDecimals); updateListBox(MESSAGEBOX_LISTBOX_VALUE_TWO, valueTwo, numValueTwoDecimals); } void DialogWithValues::updateListBox(pp_int32 id, float val, pp_int32 numDecimals) { char buffer1[100]; char buffer2[100]; sprintf(buffer1, "%%.%if", numDecimals); PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(id)); if (listBox) { sprintf(buffer2, buffer1, val); listBox->clear(); listBox->addItem(buffer2); } } void DialogWithValues::commitChanges() { PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); if (listBox) listBox->commitChanges(); listBox = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_TWO)); if (listBox) listBox->commitChanges(); } void DialogWithValues::listBoxEnterEditState(pp_int32 id) { PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(id)); if (listBox) listBox->placeCursorAtEnd(); } void DialogWithValues::switchListBox() { if (messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_TWO) == NULL) return; PPListBox* listBox = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); if (listBox->isEditing()) { listBox->commitChanges(); listBoxEnterEditState(MESSAGEBOX_LISTBOX_VALUE_TWO); messageBoxContainerGeneric->setFocus(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_TWO)); parentScreen->paintControl(messageBoxContainerGeneric); return; } listBox = static_cast(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_TWO)); if (listBox->isEditing()) { listBox->commitChanges(); listBoxEnterEditState(MESSAGEBOX_LISTBOX_VALUE_ONE); messageBoxContainerGeneric->setFocus(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); parentScreen->paintControl(messageBoxContainerGeneric); return; } listBoxEnterEditState(MESSAGEBOX_LISTBOX_VALUE_ONE); messageBoxContainerGeneric->setFocus(messageBoxContainerGeneric->getControlByID(MESSAGEBOX_LISTBOX_VALUE_ONE)); parentScreen->paintControl(messageBoxContainerGeneric); } milkytracker-0.90.85+dfsg/src/tracker/DialogGroupSelection.h0000755000175000017500000000262611150223367023111 0ustar admin2admin2/* * tracker/DialogGroupSelection.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogGroupSelection.h * MilkyTracker * * Created by Peter Barth on 23.06.06. * */ #ifndef __DIALOGGROUPSELECTION_H__ #define __DIALOGGROUPSELECTION_H__ #include "DialogBase.h" class PPString; template class PPSimpleVector; class DialogGroupSelection : public PPDialogBase { private: pp_uint32 selection; public: DialogGroupSelection(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption, const PPSimpleVector& choices); virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); pp_uint32 getSelection() { return selection; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/TabTitleProvider.cpp0000644000175000017500000000260611150223367022600 0ustar admin2admin2/* * tracker/TabTitleProvider.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TabTitleProvider.cpp * MilkyTracker * * Created by Peter Barth on 11.12.07. * */ #include "TabTitleProvider.h" #include "ModuleEditor.h" PPString TabTitleProvider::getTabTitle() { char temp[ModuleEditor::MAX_TITLETEXT+1]; memset(temp, 0, sizeof(temp)); moduleEditor.getTitle(temp, ModuleEditor::MAX_TITLETEXT); PPString tabTitle = temp; if (tabTitle.length() != 0) return tabTitle; PPSystemString fileName = moduleEditor.getModuleFileName(); fileName = fileName.stripPath(); char* nameASCIIZ = moduleEditor.getModuleFileName().toASCIIZ(); tabTitle = nameASCIIZ; delete[] nameASCIIZ; return tabTitle; } milkytracker-0.90.85+dfsg/src/tracker/DialogChannelSelector.cpp0000755000175000017500000000437211150223367023553 0ustar admin2admin2/* * tracker/DialogChannelSelector.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogChannelSelector.cpp * MilkyTracker * * Created by Peter Barth on 25.10.05. * */ #include "DialogChannelSelector.h" #include "MessageBoxContainer.h" #include "ListBox.h" DialogChannelSelector::DialogChannelSelector(PPScreen* screen, DialogResponder* responder, pp_int32 id, const PPString& caption) : PPDialogBase() { initDialog(screen, responder, id, caption, 290, 142, 26, "Ok", "Cancel"); pp_int32 x = getMessageBoxContainer()->getLocation().x; pp_int32 width = getMessageBoxContainer()->getSize().width; PPButton* button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_YES)); pp_int32 y2 = button->getLocation().y; pp_int32 x2 = x + width / 2 - 30; button->setLocation(PPPoint(x2+5,y2)); button = static_cast(messageBoxContainerGeneric->getControlByID(PP_MESSAGEBOX_BUTTON_CANCEL)); x2 = x + width / 2 + 40; button->setLocation(PPPoint(x2+5,y2)); button = new PPButton(PP_MESSAGEBOX_BUTTON_USER1, screen, this, PPPoint(x+width/2-100-10, y2), PPSize(60, 11)); button->setText("Mix"); messageBoxContainerGeneric->addControl(button); y2 = getMessageBoxContainer()->getControlByID(MESSAGEBOX_STATICTEXT_MAIN_CAPTION)->getLocation().y + 18; x2 = x + width / 2 - 50; listBox = new PPListBox(MESSAGEBOX_LISTBOX_USER1, screen, this, PPPoint(x2, y2), PPSize(100,4 + 7*8), true, false, true, true); listBox->setShowIndex(true); messageBoxContainerGeneric->addControl(listBox); } milkytracker-0.90.85+dfsg/src/tracker/SectionUpperLeft.cpp0000644000175000017500000000436111150223367022610 0ustar admin2admin2/* * tracker/SectionUpperLeft.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionUpperLeft.cpp * MilkyTracker * * Created by Peter Barth on Wed May 04 2005. * */ #include "SectionUpperLeft.h" #include "Tracker.h" #include "PatternEditorControl.h" #include "Container.h" SectionUpperLeft::SectionUpperLeft(Tracker& theTracker, PPDialogBase* dialog/* = NULL*/, DialogResponder* responder/* = NULL*/) : SectionAbstract(theTracker, dialog, responder), sectionContainer(NULL) { } SectionUpperLeft::~SectionUpperLeft() { } void SectionUpperLeft::showSection(bool bShow) { sectionContainer->show(bShow); } void SectionUpperLeft::init() { #ifndef __LOWRES__ init(0,0); #else init(0,tracker.screen->getHeight()-UPPERLEFTSECTIONHEIGHT); #endif } void SectionUpperLeft::show(bool bShow) { SectionAbstract::show(bShow); PPScreen* screen = tracker.screen; if (!initialised) { init(); } if (initialised) { if (bShow) { tracker.showMainMenu(false, false); update(false); #ifdef __LOWRES__ // resize pattern editor control PatternEditorControl* control = tracker.getPatternEditorControl(); if (control) { control->setLocation(PPPoint(0, 0)); pp_int32 offsety = tracker.inputContainerCurrent->isVisible() ? tracker.inputContainerCurrent->getSize().height : 0; control->setSize(PPSize(screen->getWidth(),screen->getHeight()-(UPPERLEFTSECTIONHEIGHT+offsety))); } #endif } else { tracker.showMainMenu(true, false); tracker.rearrangePatternEditorControl(); } showSection(bShow); screen->paint(); } } milkytracker-0.90.85+dfsg/src/tracker/SectionHDRecorder.h0000644000175000017500000000600111150223367022321 0ustar admin2admin2/* * tracker/SectionHDRecorder.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionHDRecorder.h * MilkyTracker * * Created by Peter Barth on 26.10.05. * */ #ifndef SECTIONHDRECORDER__H #define SECTIONHDRECORDER__H #include "BasicTypes.h" #include "Event.h" #include "SectionUpperLeft.h" class PPControl; class Tracker; class PPCheckBox; class SectionHDRecorder : public SectionUpperLeft { private: enum RecorderModes { RecorderModeToFile, RecorderModeToSample }; RecorderModes recorderMode; pp_int32 fromOrder; pp_int32 toOrder; pp_int32 mixerVolume; pp_uint32 resampler; pp_int32 insIndex; pp_int32 smpIndex; PPSystemString currentFileName; bool getSettingsRamping(); void setSettingsRamping(bool b); pp_uint32 getSettingsResampler(); void setSettingsResampler(pp_uint32 resampler); bool getSettingsAllowMuting(); void setSettingsAllowMuting(bool b); pp_int32 getSettingsFrequency(); void setSettingsFrequency(pp_int32 freq); pp_int32 getSettingsMixerVolume() { return mixerVolume; } void setSettingsMixerVolume(pp_int32 vol) { mixerVolume = vol; } pp_int32 getSettingsMixerShift(); void setSettingsMixerShift(pp_int32 shift); void validate(); public: SectionHDRecorder(Tracker& tracker); virtual ~SectionHDRecorder(); // Derived from SectionAbstract virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init() { SectionUpperLeft::init(); } virtual void init(pp_int32 x, pp_int32 y); virtual void show(bool bShow); virtual void update(bool repaint = true); virtual void notifyInstrumentSelect(pp_int32 index); virtual void notifySampleSelect(pp_int32 index); void exportWAVAs(const PPSystemString& fileName); void exportWAVWithPanel(const PPSystemString& defaultFileName); void exportWAVAsFileName(const PPSystemString& fileName); void exportWAVAsSample(); void getPeakLevel(); void resetCurrentFileName(); void setCurrentFileName(const PPSystemString& fileName); void adjustOrders(); void selectFileOutput() { recorderMode = RecorderModeToFile; } void selectSampleOutput() { recorderMode = RecorderModeToSample; } private: // Message box with list of resampler void showResamplerMessageBox(); void storeResampler(pp_uint32 resampler); // Responder should be friend friend class DialogResponderHDRec; friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/ModuleServices.h0000644000175000017500000000432311150223367021751 0ustar admin2admin2/* * tracker/ModuleServices.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * ModuleServices.h * MilkyTracker * * Created by Peter Barth on 08.12.07. * */ #ifndef __MODULESERVICES_H__ #define __MODULESERVICES_H__ #include "BasicTypes.h" #include "MilkyPlayCommon.h" class ModuleServices { private: class XModule& module; pp_int32 estimatedSongLength; public: ModuleServices(XModule& module) : module(module), estimatedSongLength(-1) { } void estimateSongLength(); pp_int32 getEstimatedSongLength() const { return estimatedSongLength; } void resetEstimatedSongLength() { estimatedSongLength = -1; } struct WAVWriterParameters { pp_uint32 sampleRate; pp_uint32 resamplerType; pp_uint32 playMode; pp_uint32 mixerShift; pp_uint32 mixerVolume; pp_uint32 fromOrder; pp_uint32 toOrder; const pp_uint8* muting; const pp_uint8* panning; bool multiTrack; WAVWriterParameters() : sampleRate(0), resamplerType(0), playMode(0), mixerShift(0), mixerVolume(0), fromOrder(0), toOrder(0), muting(NULL), panning(NULL), multiTrack(false) { } }; pp_int32 estimateMixerVolume(WAVWriterParameters& parameters, pp_int32* numSamplesProgressed = NULL); pp_int32 estimateWaveLengthInSamples(WAVWriterParameters& parameters); pp_int32 exportToWAV(const PPSystemString& fileName, WAVWriterParameters& parameters); pp_int32 exportToBuffer16Bit(WAVWriterParameters& parameters, pp_int16* buffer, pp_uint32 bufferSize, bool mono = true); }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionOptimize.h0000644000175000017500000000506611150223367022152 0ustar admin2admin2/* * tracker/SectionOptimize.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionOptimize.h * MilkyTracker * * Created by Peter Barth on 17.11.05. * */ #ifndef SECTIONOPTIMIZE__H #define SECTIONOPTIMIZE__H #include "BasicTypes.h" #include "Event.h" #include "SectionUpperLeft.h" #include "PatternEditorTools.h" class PPControl; class Tracker; class DialogListBox; class SectionOptimize : public SectionUpperLeft { private: void refresh(); void optimize(bool evaluate = false); PatternEditorTools::OperandOptimizeParameters getOptimizeParameters(); void zeroOperandsTrack(); void zeroOperandsPattern(); void zeroOperandsSong(); void zeroOperandsBlock(); void fillOperandsTrack(); void fillOperandsPattern(); void fillOperandsSong(); void fillOperandsBlock(); PatternEditorTools::RelocateParameters getRelocateParameters(); void relocateCommandsTrack(); void relocateCommandsPattern(); void relocateCommandsSong(); void relocateCommandsBlock(); struct OptimizeSamplesResult { pp_int32 numConvertedSamples; pp_int32 numMinimizedSamples; OptimizeSamplesResult() : numConvertedSamples(0), numMinimizedSamples(0) { } }; OptimizeSamplesResult optimizeSamples(bool convertTo8Bit, bool minimize, bool evaluate); public: SectionOptimize(Tracker& tracker); virtual ~SectionOptimize(); // Derived from SectionAbstract virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init() { SectionUpperLeft::init(); } virtual void init(pp_int32 x, pp_int32 y); virtual void show(bool bShow) { SectionUpperLeft::show(bShow); } virtual void update(bool repaint = true); static pp_uint32 getNumFlagGroups(); static pp_uint32 getDefaultFlags(pp_uint32 groupIndex); pp_uint32 getOptimizeCheckBoxFlags(pp_uint32 groupIndex); void setOptimizeCheckBoxFlags(pp_uint32 groupIndex, pp_uint32 flags); friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/Zapper.cpp0000644000175000017500000000524211150223367020615 0ustar admin2admin2/* * tracker/Zapper.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * Zapper.cpp * MilkyTracker * * Created by Peter Barth on 26.12.07. * */ #include "Zapper.h" #include "Tracker.h" #include "PlayerController.h" #include "ModuleEditor.h" #include "ModuleServices.h" #include "PatternEditor.h" #include "SectionHDRecorder.h" void Zapper::zapAll() { if (!tracker.checkForChanges()) return; tracker.signalWaitState(true); tracker.playerController->resetPlayTimeCounter(); tracker.moduleEditor->createEmptySong(true, true, tracker.playerController->getPlayMode() == PlayerController::PlayMode_FastTracker2 ? 8 : 4); tracker.moduleEditor->getModuleServices()->resetEstimatedSongLength(); tracker.moduleEditor->reloadCurrentPattern(); tracker.sectionHDRecorder->adjustOrders(); // stop song with resetting main volume tracker.ensureSongStopped(true, false); tracker.updateSongInfo(false); tracker.signalWaitState(false); } void Zapper::zapSong() { tracker.signalWaitState(true); tracker.playerController->resetPlayTimeCounter(); tracker.moduleEditor->createEmptySong(true, false, tracker.playerController->getPlayMode() == PlayerController::PlayMode_FastTracker2 ? 8 : 4); tracker.moduleEditor->getModuleServices()->resetEstimatedSongLength(); tracker.moduleEditor->reloadCurrentPattern(); tracker.sectionHDRecorder->adjustOrders(); // stop song with resetting main volume tracker.ensureSongStopped(true, false); tracker.updateSongInfo(false); tracker.signalWaitState(false); } void Zapper::zapPattern() { tracker.signalWaitState(true); tracker.playerController->resetPlayTimeCounter(); tracker.getPatternEditor()->clearPattern(); tracker.updateSongInfo(false); tracker.signalWaitState(false); } void Zapper::zapInstruments() { tracker.signalWaitState(true); tracker.playerController->resetPlayTimeCounter(); tracker.moduleEditor->createEmptySong(false, true); tracker.updateSongInfo(false); tracker.signalWaitState(false); } milkytracker-0.90.85+dfsg/src/tracker/PatternEditorTools.h0000644000175000017500000001613311150223367022627 0ustar admin2admin2/* * tracker/PatternEditorTools.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PatternEditorTools.h * MilkyTracker * * Created by Peter Barth on 16.11.07. * */ #ifndef __PATTERNEDITORTOOLS_H__ #define __PATTERNEDITORTOOLS_H__ #include "BasicTypes.h" #include "MilkyPlayTypes.h" struct TXMPattern; class XModule; class PatternEditorTools { public: struct Position { pp_int32 channel, row, inner; bool isValid() const { return (channel >= 0 && row >= 0 && inner >= 0); } bool operator==(const Position& other) { return (channel == other.channel && row == other.row && inner == other.inner); } bool operator!=(const Position& other) { return (channel != other.channel || row != other.row || inner != other.inner); } }; struct OperandOptimizeParameters { bool command_1xx; bool command_2xx; bool command_3xx; bool command_4xx; bool command_56Axx; bool command_7xx; bool command_E1x; bool command_E2x; bool command_EAx; bool command_EBx; bool command_Hxx; bool command_Pxx; bool command_Rxx; bool command_X1x; bool command_X2x; OperandOptimizeParameters() : command_1xx(false), command_2xx(false), command_3xx(false), command_4xx(false), command_56Axx(false), command_7xx(false), command_E1x(false), command_E2x(false), command_EAx(false), command_EBx(false), command_Hxx(false), command_Pxx(false), command_Rxx(false), command_X1x(false), command_X2x(false) { } }; struct RelocateParameters { bool command_3xx; bool command_4xx; bool command_8xx; bool command_Cxx; bool command_Axx; bool command_EAx; bool command_EBx; bool command_Pxx; RelocateParameters() : command_3xx(false), command_4xx(false), command_8xx(false), command_Cxx(false), command_Axx(false), command_EAx(false), command_EBx(false), command_Pxx(false) { } }; struct TransposeParameters { enum { DefaultNoteRange = 96 }; pp_int32 maxNoteRange; pp_int32 insRangeStart; pp_int32 insRangeEnd; pp_int32 noteRangeStart; pp_int32 noteRangeEnd; pp_int32 amount; TransposeParameters() : maxNoteRange(DefaultNoteRange) { } }; private: TXMPattern* pattern; Position getMarkStart(); Position getMarkEnd(); public: PatternEditorTools(TXMPattern* pattern = NULL); void attachPattern(TXMPattern* pattern) { this->pattern = pattern; } void clearSelection(const Position& ss, const Position& se); bool expandPattern(); bool shrinkPattern(); pp_int32 insRemapSelection(const Position& ss, const Position& se, pp_int32 oldIns, pp_int32 newIns); pp_int32 insRemap(pp_int32 oldIns, pp_int32 newIns); pp_int32 insRemapTrack(pp_int32 track, pp_int32 oldIns, pp_int32 newIns); pp_int32 noteTransposeSelection(const Position& ss, const Position& se, const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate); pp_int32 noteTranspose(const TransposeParameters& transposeParameters, bool evaluate = false); pp_int32 noteTransposeTrack(pp_int32 track, const TransposeParameters& transposeParameters, bool evaluate = false); pp_int32 interpolateValuesInSelection(const PatternEditorTools::Position& ss, const PatternEditorTools::Position& se); pp_int32 zeroOperandsSelection(const Position& ss, const Position& se, const OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 zeroOperands(const OperandOptimizeParameters& optimizeParameters, bool evaluate = false); pp_int32 zeroOperandsTrack(pp_int32 track, const OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 fillOperandsSelection(const Position& ss, const Position& se, const OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 fillOperands(const OperandOptimizeParameters& optimizeParameters, bool evaluate = false); pp_int32 fillOperandsTrack(pp_int32 track, const OperandOptimizeParameters& optimizeParameters, bool evaluate); pp_int32 relocateCommandsSelection(const Position& ss, const Position& se, const RelocateParameters& relocateParameters, bool evaluate); pp_int32 relocateCommands(const RelocateParameters& relocateParameters, bool evaluate = false); pp_int32 relocateCommandsTrack(pp_int32 track, const RelocateParameters& relocateParameters, bool evaluate); pp_int32 scaleVolume(const Position& startSelection, const Position& endSelection, float startScale, float endScale, pp_uint32 numVisibleChannels, XModule* module); pp_int32 splitTrack(pp_int32 useChannels, bool insertNoteOff, pp_int32 chn, pp_int32 fromRow, pp_int32 toRow, pp_uint32 numVisibleChannels); pp_int32 swapChannels(pp_int32 dstChannel, pp_int32 srcChannel); void normalize(); static void slotCopy(mp_ubyte* dst, mp_ubyte* src, pp_int32 from, pp_int32 to); static void slotTransparentCopy(mp_ubyte* dst, mp_ubyte* src, pp_int32 from, pp_int32 to); static void slotClear(mp_ubyte* dst, pp_int32 from, pp_int32 to); static bool hasValidSelection(const TXMPattern* pattern, const Position& ss, const Position& se, pp_int32 numVisibleChannels = -1); static bool normalizeSelection(const TXMPattern* pattern, const PatternEditorTools::Position& ss, const PatternEditorTools::Position& se, pp_int32& selectionStartChannel, pp_int32& selectionStartRow, pp_int32& selectionStartInner, pp_int32& selectionEndChannel, pp_int32& selectionEndRow, pp_int32& selectionEndInner); static void flattenSelection(Position& selectionStart, Position& selectionEnd) { Position selStart = selectionStart, selEnd = selectionEnd; if (selectionStart.channel > selectionEnd.channel) { selStart.channel = selectionEnd.channel; selEnd.channel = selectionStart.channel; selStart.inner = selectionEnd.inner; selEnd.inner = selectionStart.inner; } else { selStart.channel = selectionStart.channel; selEnd.channel = selectionEnd.channel; selStart.inner= selectionStart.inner; selEnd.inner= selectionEnd.inner; } if (selStart.channel == selEnd.channel && selEnd.inner < selStart.inner) { mp_sint32 h = selEnd.inner; selEnd.inner = selStart.inner; selStart.inner = h; } if (selectionStart.row > selectionEnd.row) { selStart.row = selectionEnd.row; selEnd.row = selectionStart.row; } else { selStart.row = selectionStart.row; selEnd.row = selectionEnd.row; } selectionStart = selStart; selectionEnd = selEnd; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/Makefile.in0000644000175000017500000010103511317506534020717 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : bin_PROGRAMS = milkytracker$(EXEEXT) subdir = src/tracker DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_milkytracker_OBJECTS = AnimatedFXControl.$(OBJEXT) \ ColorExportImport.$(OBJEXT) ColorPaletteContainer.$(OBJEXT) \ DialogChannelSelector.$(OBJEXT) DialogEQ.$(OBJEXT) \ DialogGroupSelection.$(OBJEXT) DialogHandlers.$(OBJEXT) \ DialogListBox.$(OBJEXT) DialogPanning.$(OBJEXT) \ DialogQuickChooseInstrument.$(OBJEXT) DialogResample.$(OBJEXT) \ DialogWithValues.$(OBJEXT) DialogZap.$(OBJEXT) \ EQConstants.$(OBJEXT) EditorBase.$(OBJEXT) \ EnvelopeContainer.$(OBJEXT) EnvelopeEditor.$(OBJEXT) \ EnvelopeEditorControl.$(OBJEXT) Equalizer.$(OBJEXT) \ FileExtProvider.$(OBJEXT) FileIdentificator.$(OBJEXT) \ GlobalColorConfig.$(OBJEXT) InputControlListener.$(OBJEXT) \ LogoBig.$(OBJEXT) LogoSmall.$(OBJEXT) ModuleEditor.$(OBJEXT) \ ModuleServices.$(OBJEXT) PatternEditor.$(OBJEXT) \ PatternEditorClipBoard.$(OBJEXT) \ PatternEditorControl.$(OBJEXT) \ PatternEditorControlEventListener.$(OBJEXT) \ PatternEditorControlKeyboard.$(OBJEXT) \ PatternEditorControlTransposeHandler.$(OBJEXT) \ PatternEditorTools.$(OBJEXT) PatternTools.$(OBJEXT) \ PeakLevelControl.$(OBJEXT) Piano.$(OBJEXT) \ PianoControl.$(OBJEXT) PlayerController.$(OBJEXT) \ PlayerLogic.$(OBJEXT) PlayerMaster.$(OBJEXT) \ RecPosProvider.$(OBJEXT) RecorderLogic.$(OBJEXT) \ ResamplerHelper.$(OBJEXT) SampleEditor.$(OBJEXT) \ SampleEditorControl.$(OBJEXT) \ SampleEditorControlToolHandler.$(OBJEXT) \ SampleEditorResampler.$(OBJEXT) SamplePlayer.$(OBJEXT) \ ScopesControl.$(OBJEXT) SectionAbout.$(OBJEXT) \ SectionAbstract.$(OBJEXT) SectionAdvancedEdit.$(OBJEXT) \ SectionDiskMenu.$(OBJEXT) SectionHDRecorder.$(OBJEXT) \ SectionInstruments.$(OBJEXT) SectionOptimize.$(OBJEXT) \ SectionQuickOptions.$(OBJEXT) SectionSamples.$(OBJEXT) \ SectionSettings.$(OBJEXT) SectionSwitcher.$(OBJEXT) \ SectionTranspose.$(OBJEXT) SectionUpperLeft.$(OBJEXT) \ SongLengthEstimator.$(OBJEXT) SystemMessage.$(OBJEXT) \ TabHeaderControl.$(OBJEXT) TabManager.$(OBJEXT) \ TabTitleProvider.$(OBJEXT) TitlePageManager.$(OBJEXT) \ ToolInvokeHelper.$(OBJEXT) Tracker.$(OBJEXT) \ TrackerConfig.$(OBJEXT) TrackerInit.$(OBJEXT) \ TrackerKeyboard.$(OBJEXT) TrackerSettings.$(OBJEXT) \ TrackerSettingsDatabase.$(OBJEXT) TrackerShortCuts.$(OBJEXT) \ TrackerShutDown.$(OBJEXT) TrackerStartUp.$(OBJEXT) \ TrackerUpdate.$(OBJEXT) Undo.$(OBJEXT) VRand.$(OBJEXT) \ Zapper.$(OBJEXT) SDL_KeyTranslation.$(OBJEXT) \ SDL_Main.$(OBJEXT) milkytracker_OBJECTS = $(am_milkytracker_OBJECTS) am__DEPENDENCIES_1 = milkytracker_DEPENDENCIES = \ $(top_builddir)/src/milkyplay/libmilkyplay.a \ $(top_builddir)/src/ppui/osinterface/libosinterface.a \ $(top_builddir)/src/ppui/libppui.a \ $(top_builddir)/src/ppui/osinterface/libosinterface.a \ $(top_builddir)/src/fx/libfx.a $(compressionLib) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/src/compression/zziplib/generic/libzzip.a DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(milkytracker_SOURCES) DIST_SOURCES = $(milkytracker_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ milkytracker_SOURCES = AnimatedFXControl.cpp ColorExportImport.cpp \ ColorPaletteContainer.cpp DialogChannelSelector.cpp DialogEQ.cpp \ DialogGroupSelection.cpp DialogHandlers.cpp DialogListBox.cpp \ DialogPanning.cpp DialogQuickChooseInstrument.cpp DialogResample.cpp \ DialogWithValues.cpp DialogZap.cpp EQConstants.cpp EditorBase.cpp \ EnvelopeContainer.cpp EnvelopeEditor.cpp EnvelopeEditorControl.cpp \ Equalizer.cpp FileExtProvider.cpp FileIdentificator.cpp GlobalColorConfig.cpp \ InputControlListener.cpp LogoBig.cpp LogoSmall.cpp ModuleEditor.cpp \ ModuleServices.cpp PatternEditor.cpp PatternEditorClipBoard.cpp \ PatternEditorControl.cpp PatternEditorControlEventListener.cpp \ PatternEditorControlKeyboard.cpp PatternEditorControlTransposeHandler.cpp \ PatternEditorTools.cpp PatternTools.cpp PeakLevelControl.cpp Piano.cpp \ PianoControl.cpp PlayerController.cpp PlayerLogic.cpp PlayerMaster.cpp \ RecPosProvider.cpp RecorderLogic.cpp ResamplerHelper.cpp SampleEditor.cpp \ SampleEditorControl.cpp SampleEditorControlToolHandler.cpp \ SampleEditorResampler.cpp SamplePlayer.cpp ScopesControl.cpp SectionAbout.cpp \ SectionAbstract.cpp SectionAdvancedEdit.cpp SectionDiskMenu.cpp \ SectionHDRecorder.cpp SectionInstruments.cpp SectionOptimize.cpp \ SectionQuickOptions.cpp SectionSamples.cpp SectionSettings.cpp \ SectionSwitcher.cpp SectionTranspose.cpp SectionUpperLeft.cpp \ SongLengthEstimator.cpp SystemMessage.cpp TabHeaderControl.cpp TabManager.cpp \ TabTitleProvider.cpp TitlePageManager.cpp ToolInvokeHelper.cpp Tracker.cpp \ TrackerConfig.cpp TrackerInit.cpp TrackerKeyboard.cpp TrackerSettings.cpp \ TrackerSettingsDatabase.cpp TrackerShortCuts.cpp TrackerShutDown.cpp \ TrackerStartUp.cpp TrackerUpdate.cpp Undo.cpp VRand.cpp Zapper.cpp \ sdl/SDL_KeyTranslation.cpp sdl/SDL_Main.cpp noinst_HEADERS = AnimatedFXControl.h ColorExportImport.h \ ColorPaletteContainer.h ControlIDs.h DialogChannelSelector.h DialogEQ.h \ DialogGroupSelection.h DialogHandlers.h DialogListBox.h DialogPanning.h \ DialogQuickChooseInstrument.h DialogResample.h DialogWithValues.h DialogZap.h \ EQConstants.h EditModes.h EditorBase.h EnvelopeContainer.h EnvelopeEditor.h \ EnvelopeEditorControl.h Equalizer.h FileExtProvider.h FileIdentificator.h \ FileTypes.h FilterParameters.h GlobalColorConfig.h InputControlListener.h \ LogoBig.h LogoSmall.h ModuleEditor.h ModuleServices.h PatternEditor.h \ PatternEditorControl.h PatternEditorTools.h PatternTools.h PeakLevelControl.h \ Piano.h PianoControl.h PlayerController.h PlayerCriticalSection.h \ PlayerLogic.h PlayerMaster.h RecPosProvider.h RecorderLogic.h \ ResamplerHelper.h SIPButtons.h SampleEditor.h SampleEditorControl.h \ SampleEditorControlLastValues.h SampleEditorResampler.h SamplePlayer.h \ ScopesControl.h SectionAbout.h SectionAbstract.h SectionAdvancedEdit.h \ SectionDiskMenu.h SectionHDRecorder.h SectionInstruments.h SectionOptimize.h \ SectionQuickOptions.h SectionSamples.h SectionSettings.h SectionSwitcher.h \ SectionTranspose.h SectionUpperLeft.h SongLengthEstimator.h SystemMessage.h \ TabHeaderControl.h TabManager.h TabTitleProvider.h TitlePageManager.h \ TitlePageManager.h ToolInvokeHelper.h Tracker.h TrackerConfig.h \ TrackerSettingsDatabase.h Undo.h VRand.h Zapper.h sdl/SDL_KeyTranslation.h AM_CPPFLAGS = -DMILKYTRACKER -D__THREADTIMER__ -D__LINUX__ ${SDL_CFLAGS} INCLUDES = -I$(top_srcdir)/src/${RTMIDI_DIR} -I$(top_srcdir)/src/compression \ -I$(top_srcdir)/src/fx -I$(top_srcdir)/src/milkyplay -I$(top_srcdir)/src/ppui \ -I$(top_srcdir)/src/tracker -I$(top_srcdir)/src/midi/posix -I../midi/rtmidi \ -I$(top_srcdir)/src/ppui/osinterface -I$(top_srcdir)/src/ppui/osinterface/sdl \ -I$(top_srcdir)/src/ppui/osinterface/posix -I$(top_srcdir)/src/ppui/sdl -Isdl # The following cannot be linked as a static library, the linker will regard # the DecompressorXXX files as unused and therefore won't pull them in: compressionLib = $(top_builddir)/src/compression/Decompressor.o \ $(top_builddir)/src/compression/DecompressorGZIP.o \ $(top_builddir)/src/compression/DecompressorLHA.o \ $(top_builddir)/src/compression/DecompressorPP20.o \ $(top_builddir)/src/compression/DecompressorUMX.o \ $(top_builddir)/src/compression/DecompressorZIP.o \ $(top_builddir)/src/compression/MyIO.o $(top_builddir)/src/compression/PP20.o \ $(top_builddir)/src/compression/ZipExtractor.o \ $(top_builddir)/src/compression/unlha.o # add -lGL for experimental OpenGL support (and see ../ppui/Makefile.am) milkytracker_LDADD = $(top_builddir)/src/milkyplay/libmilkyplay.a \ $(top_builddir)/src/ppui/osinterface/libosinterface.a \ $(top_builddir)/src/ppui/libppui.a \ $(top_builddir)/src/ppui/osinterface/libosinterface.a \ $(top_builddir)/src/fx/libfx.a $(compressionLib) $(RTMIDI) $(SDL_LIBS) \ $(top_builddir)/src/compression/zziplib/generic/libzzip.a \ $(Z_LIBS) #$(ZZIP_LIBS) read below # NOTE: The MilkyTracker source contains a MODIFIED version of the zzip # library, which is statically linked to the executable. Simply changing the # build scripts to link against the system libzzip will result in non-working # zip support! EXTRA_DIST = carbon/Carbon_Definitions.h carbon/Carbon_main.cpp \ carbon/InfoPlist.strings carbon/KeyTranslation.cpp carbon/KeyTranslation.h \ carbon/PreferencesDialog.cpp carbon/PreferencesDialog.h carbon/iGetKeys.cpp \ carbon/iGetKeys.h win32/PreferencesDialog.cpp win32/PreferencesDialog.h \ win32/ThreadTimer.cpp win32/ThreadTimer.h win32/Win32_main.cpp \ win32/Win32_resource.h win32/Win32_resources.rc wince/ButtonMapper.cpp \ wince/ButtonMapper.h wince/VirtualKeyToScanCodeTable.cpp \ wince/VirtualKeyToScanCodeTable.h wince/WaitStateThread.cpp \ wince/WaitStateThread.h wince/WinCE_NEWRES.H wince/WinCE_ThreadTimer.cpp \ wince/WinCE_ThreadTimer.h wince/WinCE_main.cpp wince/WinCE_main.h \ wince/WinCE_resource.h all: all-am .SUFFIXES: .SUFFIXES: .cpp .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) --gnu src/tracker/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/tracker/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): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) milkytracker$(EXEEXT): $(milkytracker_OBJECTS) $(milkytracker_DEPENDENCIES) @rm -f milkytracker$(EXEEXT) $(CXXLINK) $(milkytracker_OBJECTS) $(milkytracker_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnimatedFXControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColorExportImport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColorPaletteContainer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogChannelSelector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogEQ.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogGroupSelection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogHandlers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogListBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogPanning.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogQuickChooseInstrument.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogResample.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogWithValues.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogZap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EQConstants.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EditorBase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EnvelopeContainer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EnvelopeEditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EnvelopeEditorControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Equalizer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileExtProvider.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileIdentificator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GlobalColorConfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InputControlListener.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LogoBig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LogoSmall.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ModuleEditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ModuleServices.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PatternEditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PatternEditorClipBoard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PatternEditorControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PatternEditorControlEventListener.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PatternEditorControlKeyboard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PatternEditorControlTransposeHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PatternEditorTools.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PatternTools.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeakLevelControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Piano.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PianoControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PlayerController.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PlayerLogic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PlayerMaster.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RecPosProvider.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RecorderLogic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ResamplerHelper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SDL_KeyTranslation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SDL_Main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleEditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleEditorControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleEditorControlToolHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleEditorResampler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SamplePlayer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ScopesControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionAbout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionAbstract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionAdvancedEdit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionDiskMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionHDRecorder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionInstruments.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionOptimize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionQuickOptions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionSamples.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionSettings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionSwitcher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionTranspose.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SectionUpperLeft.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SongLengthEstimator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SystemMessage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TabHeaderControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TabManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TabTitleProvider.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TitlePageManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ToolInvokeHelper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Tracker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerConfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerInit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerKeyboard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerSettings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerSettingsDatabase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerShortCuts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerShutDown.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerStartUp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerUpdate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Undo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VRand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Zapper.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` SDL_KeyTranslation.o: sdl/SDL_KeyTranslation.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SDL_KeyTranslation.o -MD -MP -MF $(DEPDIR)/SDL_KeyTranslation.Tpo -c -o SDL_KeyTranslation.o `test -f 'sdl/SDL_KeyTranslation.cpp' || echo '$(srcdir)/'`sdl/SDL_KeyTranslation.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SDL_KeyTranslation.Tpo $(DEPDIR)/SDL_KeyTranslation.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/SDL_KeyTranslation.cpp' object='SDL_KeyTranslation.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SDL_KeyTranslation.o `test -f 'sdl/SDL_KeyTranslation.cpp' || echo '$(srcdir)/'`sdl/SDL_KeyTranslation.cpp SDL_KeyTranslation.obj: sdl/SDL_KeyTranslation.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SDL_KeyTranslation.obj -MD -MP -MF $(DEPDIR)/SDL_KeyTranslation.Tpo -c -o SDL_KeyTranslation.obj `if test -f 'sdl/SDL_KeyTranslation.cpp'; then $(CYGPATH_W) 'sdl/SDL_KeyTranslation.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/SDL_KeyTranslation.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SDL_KeyTranslation.Tpo $(DEPDIR)/SDL_KeyTranslation.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/SDL_KeyTranslation.cpp' object='SDL_KeyTranslation.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SDL_KeyTranslation.obj `if test -f 'sdl/SDL_KeyTranslation.cpp'; then $(CYGPATH_W) 'sdl/SDL_KeyTranslation.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/SDL_KeyTranslation.cpp'; fi` SDL_Main.o: sdl/SDL_Main.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SDL_Main.o -MD -MP -MF $(DEPDIR)/SDL_Main.Tpo -c -o SDL_Main.o `test -f 'sdl/SDL_Main.cpp' || echo '$(srcdir)/'`sdl/SDL_Main.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SDL_Main.Tpo $(DEPDIR)/SDL_Main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/SDL_Main.cpp' object='SDL_Main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SDL_Main.o `test -f 'sdl/SDL_Main.cpp' || echo '$(srcdir)/'`sdl/SDL_Main.cpp SDL_Main.obj: sdl/SDL_Main.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SDL_Main.obj -MD -MP -MF $(DEPDIR)/SDL_Main.Tpo -c -o SDL_Main.obj `if test -f 'sdl/SDL_Main.cpp'; then $(CYGPATH_W) 'sdl/SDL_Main.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/SDL_Main.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SDL_Main.Tpo $(DEPDIR)/SDL_Main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sdl/SDL_Main.cpp' object='SDL_Main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SDL_Main.obj `if test -f 'sdl/SDL_Main.cpp'; then $(CYGPATH_W) 'sdl/SDL_Main.cpp'; else $(CYGPATH_W) '$(srcdir)/sdl/SDL_Main.cpp'; fi` 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) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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-binPROGRAMS clean-generic 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-binPROGRAMS 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 pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ 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 pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS # 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: milkytracker-0.90.85+dfsg/src/tracker/LogoSmall.h0000644000175000017500000000171511150223367020713 0ustar admin2admin2/* * tracker/LogoSmall.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef LOGOSMALL__H #define LOGOSMALL__H #include "BasicTypes.h" class LogoSmall { public: static const pp_uint32 width; static const pp_uint32 height; static const pp_uint8 rawData[]; }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionHDRecorder.cpp0000644000175000017500000006757011150223367022676 0ustar admin2admin2/* * tracker/SectionHDRecorder.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionHDRecorder.cpp * MilkyTracker * * Created by Peter Barth on 26.10.05. * */ #include "SectionHDRecorder.h" #include "Container.h" #include "Tracker.h" #include "TrackerConfig.h" #include "ModuleEditor.h" #include "ModuleServices.h" #include "PlayerController.h" #include "PlayerMaster.h" #include "ResamplerHelper.h" #include "PPUIConfig.h" #include "CheckBox.h" #include "RadioGroup.h" #include "Seperator.h" #include "Slider.h" #include "StaticText.h" #include "ListBox.h" #include "PatternEditorControl.h" #include "DialogListBox.h" #include "SampleEditor.h" #include "PPSavePanel.h" #include "ControlIDs.h" enum ControlIDs { HDRECORD_BUTTON_EXIT = 33000, HDRECORD_RADIOGROUP_FREQUENCIES, HDRECORD_BUTTON_RESAMPLING, HDRECORD_CHECKBOX_RAMPING, HDRECORD_CHECKBOX_ALLOWMUTING, HDRECORD_STATICTEXT_START, HDRECORD_BUTTON_START_PLUS, HDRECORD_BUTTON_START_MINUS, HDRECORD_STATICTEXT_END, HDRECORD_BUTTON_END_PLUS, HDRECORD_BUTTON_END_MINUS, HDRECORD_BUTTON_RECORD, HDRECORD_BUTTON_RECORD_AS, HDRECORD_RADIOGROUP_AMPLIFY, HDRECORD_SLIDER_MIXERVOLUME, HDRECORD_STATICTEXT_MIXERVOLUME, HDRECORD_BUTTON_RECORDINGMODE, HDRECORD_STATICTEXT_SAVETOFILENAME, HDRECORD_STATICTEXT_INS, HDRECORD_STATICTEXT_SMP, HDRECORD_BUTTON_INS_PLUS, HDRECORD_BUTTON_INS_MINUS, HDRECORD_BUTTON_SMP_PLUS, HDRECORD_BUTTON_SMP_MINUS, HDRECORD_BUTTON_MIXER_AUTO, RESPONDMESSAGEBOX_SELECTRESAMPLER }; // Class which responds to the message box clicks class DialogResponderHDRec : public DialogResponder { private: SectionHDRecorder& section; public: DialogResponderHDRec(SectionHDRecorder& section) : section(section) { } virtual pp_int32 ActionOkay(PPObject* sender) { switch (reinterpret_cast(sender)->getID()) { case RESPONDMESSAGEBOX_SELECTRESAMPLER: { PPListBox* listBox = reinterpret_cast(sender)->getListBox(); section.storeResampler(listBox->getSelectedIndex()); break; } } return 0; } virtual pp_int32 ActionCancel(PPObject* sender) { return 0; } }; void SectionHDRecorder::validate() { if (insIndex < 0) insIndex = 0; if (insIndex > tracker.moduleEditor->getNumInstruments() - 1) insIndex = tracker.moduleEditor->getNumInstruments() - 1; if (smpIndex < 0) smpIndex = 0; if (smpIndex > tracker.moduleEditor->getNumSamples(insIndex) - 1) smpIndex = tracker.moduleEditor->getNumSamples(insIndex) - 1; } SectionHDRecorder::SectionHDRecorder(Tracker& tracker) : SectionUpperLeft(tracker, NULL, new DialogResponderHDRec(*this)), recorderMode(RecorderModeToFile), fromOrder(0), toOrder(0), mixerVolume(256), resampler(1), insIndex(0), smpIndex(0), currentFileName(TrackerConfig::untitledSong) { } SectionHDRecorder::~SectionHDRecorder() { } bool SectionHDRecorder::getSettingsRamping() { PPContainer* container = static_cast(sectionContainer); PPCheckBox* checkBox = static_cast(container->getControlByID(HDRECORD_CHECKBOX_RAMPING)); ASSERT(checkBox); return checkBox->isChecked(); } void SectionHDRecorder::setSettingsRamping(bool b) { PPContainer* container = static_cast(sectionContainer); PPCheckBox* checkBox = static_cast(container->getControlByID(HDRECORD_CHECKBOX_RAMPING)); ASSERT(checkBox); checkBox->checkIt(b); } pp_uint32 SectionHDRecorder::getSettingsResampler() { return resampler; } void SectionHDRecorder::setSettingsResampler(pp_uint32 resampler) { this->resampler = resampler; } bool SectionHDRecorder::getSettingsAllowMuting() { PPContainer* container = static_cast(sectionContainer); PPCheckBox* checkBox = static_cast(container->getControlByID(HDRECORD_CHECKBOX_ALLOWMUTING)); ASSERT(checkBox); return checkBox->isChecked(); } void SectionHDRecorder::setSettingsAllowMuting(bool b) { PPContainer* container = static_cast(sectionContainer); PPCheckBox* checkBox = static_cast(container->getControlByID(HDRECORD_CHECKBOX_ALLOWMUTING)); ASSERT(checkBox); checkBox->checkIt(b); } pp_int32 SectionHDRecorder::getSettingsFrequency() { PPContainer* container = static_cast(sectionContainer); PPRadioGroup* radioGroup = static_cast(container->getControlByID(HDRECORD_RADIOGROUP_FREQUENCIES)); ASSERT(radioGroup); ASSERT(radioGroup->getChoice() < (unsigned)TrackerConfig::numMixFrequencies); return TrackerConfig::mixFrequencies[radioGroup->getChoice()]; } void SectionHDRecorder::setSettingsFrequency(pp_int32 freq) { PPContainer* container = static_cast(sectionContainer); PPRadioGroup* radioGroup = static_cast(container->getControlByID(HDRECORD_RADIOGROUP_FREQUENCIES)); ASSERT(radioGroup); for (pp_int32 j = 0; j < TrackerConfig::numMixFrequencies; j++) { if (freq == TrackerConfig::mixFrequencies[j]) { radioGroup->setChoice(j); break; } } } pp_int32 SectionHDRecorder::getSettingsMixerShift() { PPContainer* container = static_cast(sectionContainer); PPRadioGroup* radioGroup = static_cast(container->getControlByID(HDRECORD_RADIOGROUP_AMPLIFY)); ASSERT(radioGroup); ASSERT(radioGroup->getChoice() < 3); return 2-radioGroup->getChoice(); } void SectionHDRecorder::setSettingsMixerShift(pp_int32 shift) { PPContainer* container = static_cast(sectionContainer); PPRadioGroup* radioGroup = static_cast(container->getControlByID(HDRECORD_RADIOGROUP_AMPLIFY)); ASSERT(radioGroup); ASSERT(shift >= 0 && shift < 3); radioGroup->setChoice(2-shift); } pp_int32 SectionHDRecorder::handleEvent(PPObject* sender, PPEvent* event) { if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case HDRECORD_BUTTON_START_PLUS: if (fromOrder < toOrder) fromOrder++; update(); break; case HDRECORD_BUTTON_START_MINUS: if (fromOrder > 0) fromOrder--; update(); break; case HDRECORD_BUTTON_END_PLUS: if (toOrder < tracker.moduleEditor->getNumOrders()-1) toOrder++; update(); break; case HDRECORD_BUTTON_END_MINUS: if (toOrder > fromOrder) toOrder--; update(); break; case HDRECORD_BUTTON_EXIT: if (event->getID() != eCommand) break; show(false); break; case HDRECORD_BUTTON_RECORD: if (event->getID() != eCommand) break; if (recorderMode == RecorderModeToFile) { if (TrackerConfig::untitledSong.compareTo(currentFileName.stripExtension()) == 0) { exportWAVAs(tracker.moduleEditor->getModuleFileNameFull()); } else { exportWAVAsFileName(currentFileName); } } else { exportWAVAsSample(); } update(); break; case HDRECORD_BUTTON_RECORD_AS: { if (event->getID() != eCommand) break; ASSERT(recorderMode == RecorderModeToFile); exportWAVAs(currentFileName); update(); break; } case HDRECORD_BUTTON_RECORDINGMODE: if (recorderMode == RecorderModeToFile) recorderMode = RecorderModeToSample; else recorderMode = RecorderModeToFile; update(); break; case HDRECORD_BUTTON_MIXER_AUTO: if (event->getID() != eCommand) break; getPeakLevel(); update(); break; case HDRECORD_BUTTON_INS_PLUS: // update will validate the values insIndex++; update(); break; case HDRECORD_BUTTON_INS_MINUS: // see above insIndex--; update(); break; case HDRECORD_BUTTON_SMP_PLUS: // see above smpIndex++; update(); break; case HDRECORD_BUTTON_SMP_MINUS: // see above smpIndex--; update(); break; case HDRECORD_BUTTON_RESAMPLING: showResamplerMessageBox(); break; } } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { case HDRECORD_SLIDER_MIXERVOLUME: { mixerVolume = reinterpret_cast(sender)->getCurrentValue(); update(); break; } } } return 0; } void SectionHDRecorder::init(pp_int32 px, pp_int32 py) { PPScreen* screen = tracker.screen; PPContainer* container = new PPContainer(CONTAINER_HDRECORDER, tracker.screen, this, PPPoint(px, py), PPSize(320,UPPERLEFTSECTIONHEIGHT), false); container->setColor(TrackerConfig::colorThemeMain); tracker.screen->addControl(container); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(px + 2, py + 2), "HD Recorder", true, true)); PPSize size = container->getSize(); pp_int32 buttonWidth = 8*4+4; pp_int32 buttonHeight = 22; pp_int32 x = px+container->getSize().width-(buttonWidth+4); pp_int32 y = py+container->getSize().height-(buttonHeight+4); pp_int32 dy = 11+20; // Horizontal seperator above exit container->addControl(new PPSeperator(0, screen, PPPoint(px+2, py + size.height - dy), size.width-5, container->getColor(), true)); #ifdef __LOWRES__ y-=2; buttonHeight+=4; PPButton* button = new PPButton(MAINMENU_SMPEDIT, screen, &tracker, PPPoint(x, y), PPSize(buttonWidth, buttonHeight/3)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Smp.Ed."); container->addControl(button); y+=button->getSize().height+1; button = new PPButton(MAINMENU_INSEDIT, screen, &tracker, PPPoint(x, y), PPSize(buttonWidth, buttonHeight/3)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Ins.Ed."); container->addControl(button); y+=button->getSize().height+1; button = new PPButton(HDRECORD_BUTTON_EXIT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight/3)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Exit"); container->addControl(button); #else PPButton* button = new PPButton(HDRECORD_BUTTON_EXIT, screen, this, PPPoint(x, y), PPSize(buttonWidth,buttonHeight)); button->setText("Exit"); container->addControl(button); #endif // add frequencies pp_int32 x2 = px; pp_int32 y2 = py + 11 + 3 + 4; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 4, y2), "Output:", true)); PPRadioGroup* radioGroup = new PPRadioGroup(HDRECORD_RADIOGROUP_FREQUENCIES, screen, this, PPPoint(x2+2, y2+10), PPSize(88, TrackerConfig::numMixFrequencies*14)); radioGroup->setColor(TrackerConfig::colorThemeMain); for (pp_int32 j = 0; j < TrackerConfig::numMixFrequencies; j++) { char buffer[32]; sprintf(buffer, "%i Hz", TrackerConfig::mixFrequencies[j]); radioGroup->addItem(buffer); } radioGroup->setChoice(2); container->addControl(radioGroup); y2+=radioGroup->getSize().height + 17; // --------- amplify container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 4, y2), "Amplify:", true)); y2+=9; radioGroup = new PPRadioGroup(HDRECORD_RADIOGROUP_AMPLIFY, screen, this, PPPoint(x2 + 2, y2), PPSize(180, 20)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setHorizontal(true); radioGroup->addItem("25%"); radioGroup->addItem("50%"); radioGroup->addItem("100%"); radioGroup->setChoice(1); container->addControl(radioGroup); y2-=9; // --------- mixvol. slider container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 146 - 4, y2-3), 28, TrackerConfig::colorThemeMain, false)); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2 + 146, y2), "Mixer Volume:", true)); container->addControl(new PPStaticText(HDRECORD_STATICTEXT_MIXERVOLUME, NULL, NULL, PPPoint(x2 + 146, y2 + 14), "100%", false)); PPSlider* slider = new PPSlider(HDRECORD_SLIDER_MIXERVOLUME, screen, this, PPPoint(x2 + 146 + 4*8+4, y2 + 14-1), 91, true); slider->setMaxValue(256); slider->setBarSize(16384); container->addControl(slider); button = new PPButton(HDRECORD_BUTTON_MIXER_AUTO, screen, this, PPPoint(x2 + 154 + 12*8+1, y2), PPSize(21, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Auto"); container->addControl(button); container->addControl(new PPSeperator(0, screen, PPPoint(x2 + 154 + 4*8 + 4 + 80 + 5, y2-3), 28, TrackerConfig::colorThemeMain, false)); // -------------- quality -------------- y2 = py + 11 + 3 + 4; x2 += /*radioGroup->getSize().width*/88; pp_int32 x3 = x2 - 6; container->addControl(new PPSeperator(0, screen, PPPoint(x2 - 6, py+16 - 2), container->getSize().height - (dy+14), TrackerConfig::colorThemeMain, false)); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "Quality:", true)); y2+=13; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "Resampler:", true)); button = new PPButton(HDRECORD_BUTTON_RESAMPLING, screen, this, PPPoint(x2 + 8*10 + 4, y2-2), PPSize(6*7 + 4, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Select"PPSTR_PERIODS); container->addControl(button); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2 + 12), "Volume ramping:", true)); container->addControl(new PPCheckBox(HDRECORD_CHECKBOX_RAMPING, screen, this, PPPoint(x2 + 15*8, y2-1+12))); y2+=24; // Horizontal seperator above exit container->addControl(new PPSeperator(0, screen, PPPoint(x3+1, y2), size.width-5 - (x3-px), container->getColor(), true)); y2+=5; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "Allow muting:", true)); container->addControl(new PPCheckBox(HDRECORD_CHECKBOX_ALLOWMUTING, screen, this, PPPoint(x2 + 15*8, y2-1), false)); x2 += 18*8-4; container->addControl(new PPSeperator(0, screen, PPPoint(x2 - 6, py+16 - 2), container->getSize().height - (dy+28), TrackerConfig::colorThemeMain, false)); y2 = py + 11 + 3 + 4; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "Range:", true)); y2+=13; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "From", true)); container->addControl(new PPStaticText(HDRECORD_STATICTEXT_START, screen, this, PPPoint(x2+5*8, y2), "xx")); button = new PPButton(HDRECORD_BUTTON_START_PLUS, screen, this, PPPoint(x2+7*8+3, y2-1), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(HDRECORD_BUTTON_START_MINUS, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y2-1), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); y2+=12; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "To", true)); container->addControl(new PPStaticText(HDRECORD_STATICTEXT_END, screen, this, PPPoint(x2+5*8, y2), "xx")); button = new PPButton(HDRECORD_BUTTON_END_PLUS, screen, this, PPPoint(x2+7*8+3, y2-1), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(HDRECORD_BUTTON_END_MINUS, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y2-1), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); y2+=15; buttonWidth = 6*8 + 4; buttonHeight = 12; button = new PPButton(HDRECORD_BUTTON_RECORD, screen, this, PPPoint(x2, y2), PPSize(buttonWidth,buttonHeight)); button->setText("Record"); container->addControl(button); button = new PPButton(HDRECORD_BUTTON_RECORD_AS, screen, this, PPPoint(x2+buttonWidth+1, y2), PPSize(34,buttonHeight)); button->setText("As"PPSTR_PERIODS); container->addControl(button); y2+=buttonHeight+2; container->addControl(new PPSeperator(0, screen, PPPoint(x3+1, y2), size.width-5 - (x3-px), container->getColor(), true)); y2+=5; x2 = x3+6; button = new PPButton(HDRECORD_BUTTON_RECORDINGMODE, screen, this, PPPoint(x2-3, y2-2), PPSize(5*8+2,buttonHeight-1), false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("File:"); container->addControl(button); //container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x2, y2), "File:", true)); x2+=5*8+4; PPStaticText* text = new PPStaticText(HDRECORD_STATICTEXT_SAVETOFILENAME, NULL, NULL, PPPoint(x2, y2), "123456789012345678901234", false, false, true); text->setExtent(PPSize(23*8, 8)); container->addControl(text); x2+=2; text = new PPStaticText(HDRECORD_STATICTEXT_INS, NULL, NULL, PPPoint(x2, y2), "Ins:xx", false); container->addControl(text); x2+=text->getSize().width + 1 + 8; button = new PPButton(HDRECORD_BUTTON_INS_PLUS, screen, this, PPPoint(x2, y2-1), PPSize(13, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(HDRECORD_BUTTON_INS_MINUS, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y2-1), PPSize(13, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); x2 = button->getLocation().x + button->getSize().width + 10; text = new PPStaticText(HDRECORD_STATICTEXT_SMP, NULL, NULL, PPPoint(x2, y2), "Smp:xx", false); container->addControl(text); x2+=text->getSize().width + 1 + 8; button = new PPButton(HDRECORD_BUTTON_SMP_PLUS, screen, this, PPPoint(x2, y2-1), PPSize(13, 9)); button->setText(TrackerConfig::stringButtonPlus); container->addControl(button); button = new PPButton(HDRECORD_BUTTON_SMP_MINUS, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y2-1), PPSize(13, 9)); button->setText(TrackerConfig::stringButtonMinus); container->addControl(button); sectionContainer = container; initialised = true; showSection(false); } void SectionHDRecorder::update(bool repaint/* = true*/) { PPContainer* container = static_cast(tracker.screen->getControlByID(CONTAINER_HDRECORDER)); ASSERT(container); if (fromOrder < 0) fromOrder = 0; if (toOrder < fromOrder) toOrder = fromOrder; if (toOrder >= tracker.moduleEditor->getNumOrders()) toOrder = tracker.moduleEditor->getNumOrders()-1; PPStaticText* staticText = static_cast(container->getControlByID(HDRECORD_STATICTEXT_START)); ASSERT(staticText); staticText->setHexValue(fromOrder, 2); staticText = static_cast(container->getControlByID(HDRECORD_STATICTEXT_END)); ASSERT(staticText); staticText->setHexValue(toOrder, 2); // mixer volume char buffer[80], buffer2[80]; PPStaticText* text = static_cast(container->getControlByID(HDRECORD_STATICTEXT_MIXERVOLUME)); ASSERT(text); PPSlider* slider = static_cast(container->getControlByID(HDRECORD_SLIDER_MIXERVOLUME)); ASSERT(slider); sprintf(buffer, "%i%%", (mixerVolume*100)/256); if (strlen(buffer) < 4) { memset(buffer2, 32, sizeof(buffer2)); strcpy(buffer2 + 4-strlen(buffer), buffer); strcpy(buffer, buffer2); } text->setText(buffer); slider->setCurrentValue(mixerVolume); if (recorderMode == RecorderModeToFile) { PPButton* button = static_cast(container->getControlByID(HDRECORD_BUTTON_RECORDINGMODE)); button->setText("File:"); button = static_cast(container->getControlByID(HDRECORD_BUTTON_RECORD_AS)); button->enable(true); staticText = static_cast(container->getControlByID(HDRECORD_STATICTEXT_SAVETOFILENAME)); staticText->show(true); if (TrackerConfig::untitledSong.compareTo(currentFileName.stripExtension()) == 0) { staticText->setText(""); } else { PPSystemString temp = currentFileName.stripPath(); char* nameASCIIZ = temp.toASCIIZ(); staticText->setText(nameASCIIZ); delete[] nameASCIIZ; } container->getControlByID(HDRECORD_STATICTEXT_INS)->show(false); container->getControlByID(HDRECORD_BUTTON_INS_PLUS)->show(false); container->getControlByID(HDRECORD_BUTTON_INS_MINUS)->show(false); container->getControlByID(HDRECORD_STATICTEXT_SMP)->show(false); container->getControlByID(HDRECORD_BUTTON_SMP_PLUS)->show(false); container->getControlByID(HDRECORD_BUTTON_SMP_MINUS)->show(false); } else { validate(); PPButton* button = static_cast(container->getControlByID(HDRECORD_BUTTON_RECORDINGMODE)); button->setText("Samp:"); button = static_cast(container->getControlByID(HDRECORD_BUTTON_RECORD_AS)); button->enable(false); staticText = static_cast(container->getControlByID(HDRECORD_STATICTEXT_SAVETOFILENAME)); staticText->show(false); sprintf(buffer, "Ins:%x", insIndex+1); staticText = static_cast(container->getControlByID(HDRECORD_STATICTEXT_INS)); staticText->setText(buffer); sprintf(buffer, "Smp:%x", smpIndex); staticText = static_cast(container->getControlByID(HDRECORD_STATICTEXT_SMP)); staticText->setText(buffer); container->getControlByID(HDRECORD_STATICTEXT_INS)->show(true); container->getControlByID(HDRECORD_BUTTON_INS_PLUS)->show(true); container->getControlByID(HDRECORD_BUTTON_INS_MINUS)->show(true); container->getControlByID(HDRECORD_STATICTEXT_SMP)->show(true); container->getControlByID(HDRECORD_BUTTON_SMP_PLUS)->show(true); container->getControlByID(HDRECORD_BUTTON_SMP_MINUS)->show(true); } if (repaint) tracker.screen->paintControl(container); } void SectionHDRecorder::notifyInstrumentSelect(pp_int32 index) { insIndex = index-1; if (!sectionContainer->isVisible()) return; update(); } void SectionHDRecorder::notifySampleSelect(pp_int32 index) { smpIndex = index-1; if (!sectionContainer->isVisible()) return; update(); } void SectionHDRecorder::show(bool bShow) { SectionUpperLeft::show(bShow); } void SectionHDRecorder::exportWAVWithPanel(const PPSystemString& defaultFileName) { PPSavePanel savePanel(tracker.screen, "Export Song to WAV", defaultFileName); savePanel.addExtension("wav","Uncompressed WAV"); if (savePanel.runModal() == PPModalDialog::ReturnCodeOK) { const SYSCHAR* finalFileName = savePanel.getFileName(); if (finalFileName) { currentFileName = finalFileName; exportWAVAsFileName(finalFileName); } } } void SectionHDRecorder::exportWAVAsFileName(const PPSystemString& fileName) { ModuleEditor* moduleEditor = tracker.moduleEditor; ModuleServices::WAVWriterParameters parameters; parameters.sampleRate = getSettingsFrequency(); parameters.resamplerType = (getSettingsRamping() ? 1 : 0) | (getSettingsResampler() << 1); parameters.playMode = tracker.playerController->getPlayMode(); parameters.mixerShift = getSettingsMixerShift(); parameters.mixerVolume = mixerVolume; mp_ubyte* muting = new mp_ubyte[moduleEditor->getNumChannels()]; memset(muting, 0, moduleEditor->getNumChannels()); if (getSettingsAllowMuting()) { for (pp_int32 i = 0; i < (signed)moduleEditor->getNumChannels(); i++) muting[i] = (mp_ubyte)tracker.muteChannels[i]; } parameters.muting = muting; parameters.panning = tracker.playerController->getPanningTable(); parameters.fromOrder = fromOrder; parameters.toOrder = toOrder; tracker.signalWaitState(true); pp_int32 res = moduleEditor->getModuleServices()->exportToWAV(fileName, parameters);; tracker.signalWaitState(false); delete[] muting; if (res > 0) { pp_int32 seconds = (pp_int32)((float)res / (float)getSettingsFrequency()); char buffer[200]; sprintf(buffer, "%i:%02i successfully recorded", seconds/60, seconds%60); tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, buffer, Tracker::MessageBox_OK); } else { tracker.showMessageBox(MESSAGEBOX_UNIVERSAL, "Recording failed.", Tracker::MessageBox_OK); } } void SectionHDRecorder::getPeakLevel() { ModuleEditor* moduleEditor = tracker.moduleEditor; ModuleServices::WAVWriterParameters parameters; parameters.sampleRate = getSettingsFrequency(); parameters.resamplerType = (getSettingsRamping() ? 1 : 0) | (getSettingsResampler() << 1); parameters.playMode = tracker.playerController->getPlayMode(); parameters.mixerShift = getSettingsMixerShift(); parameters.mixerVolume = 256; mp_ubyte* muting = new mp_ubyte[moduleEditor->getNumChannels()]; memset(muting, 0, moduleEditor->getNumChannels()); if (getSettingsAllowMuting()) { for (pp_int32 i = 0; i < (signed)moduleEditor->getNumChannels(); i++) muting[i] = (mp_ubyte)tracker.muteChannels[i]; } parameters.muting = muting; parameters.panning = tracker.playerController->getPanningTable(); parameters.fromOrder = fromOrder; parameters.toOrder = toOrder; tracker.signalWaitState(true); mixerVolume = moduleEditor->getModuleServices()->estimateMixerVolume(parameters); tracker.signalWaitState(false); delete[] muting; tracker.screen->update(); } void SectionHDRecorder::resetCurrentFileName() { currentFileName = TrackerConfig::untitledSong; update(false); } void SectionHDRecorder::setCurrentFileName(const PPSystemString& fileName) { currentFileName = fileName; update(false); } void SectionHDRecorder::exportWAVAs(const PPSystemString& fileName) { if (tracker.useClassicBrowser) { tracker.saveType(FileTypes::FileTypeSongWAV); } else { PPSystemString temp = fileName.stripExtension(); temp.append(".wav"); exportWAVWithPanel(temp.stripPath()); } } void SectionHDRecorder::exportWAVAsSample() { ModuleEditor* moduleEditor = tracker.moduleEditor; ModuleServices::WAVWriterParameters parameters; parameters.sampleRate = getSettingsFrequency(); parameters.resamplerType = (getSettingsRamping() ? 1 : 0) | (getSettingsResampler() << 1); parameters.playMode = tracker.playerController->getPlayMode(); parameters.mixerShift = getSettingsMixerShift(); parameters.mixerVolume = mixerVolume; mp_ubyte* muting = new mp_ubyte[moduleEditor->getNumChannels()]; memset(muting, 0, moduleEditor->getNumChannels()); if (getSettingsAllowMuting()) { for (pp_int32 i = 0; i < (signed)moduleEditor->getNumChannels(); i++) muting[i] = (mp_ubyte)tracker.muteChannels[i]; } parameters.muting = muting; parameters.panning = tracker.playerController->getPanningTable(); parameters.fromOrder = fromOrder; parameters.toOrder = toOrder; tracker.signalWaitState(true); mp_sint32 numSamples = moduleEditor->getModuleServices()->estimateWaveLengthInSamples(parameters); validate(); pp_int32 curIns = moduleEditor->getCurrentInstrumentIndex(); pp_int32 curSmp = moduleEditor->getCurrentSampleIndex(); // surpress screen updates from here on... tracker.screen->pauseUpdate(true); moduleEditor->reloadSample(insIndex, smpIndex); SampleEditor::WorkSample* workSample = moduleEditor->getSampleEditor()->createWorkSample(numSamples, 16, parameters.sampleRate); if (workSample) { pp_int16* buffer = (pp_int16*)workSample->getBuffer(); moduleEditor->getModuleServices()->exportToBuffer16Bit(parameters, buffer, numSamples, true); moduleEditor->getSampleEditor()->pasteOther(*workSample); delete workSample; } moduleEditor->reloadSample(curIns, curSmp); // ...until here tracker.screen->pauseUpdate(false); tracker.screen->paint(); tracker.signalWaitState(false); } void SectionHDRecorder::adjustOrders() { fromOrder = 0; toOrder = tracker.moduleEditor->getNumOrders()-1; } void SectionHDRecorder::showResamplerMessageBox() { if (dialog) { delete dialog; dialog = NULL; } dialog = new DialogListBox(tracker.screen, responder, RESPONDMESSAGEBOX_SELECTRESAMPLER, "Select Resampler", true); PPListBox* listBox = static_cast(dialog)->getListBox(); ResamplerHelper resamplerHelper; for (pp_uint32 i = 0; i < resamplerHelper.getNumResamplers(); i++) listBox->addItem(resamplerHelper.getResamplerName(i)); listBox->setSelectedIndex(resampler, false); dialog->show(); } void SectionHDRecorder::storeResampler(pp_uint32 resampler) { this->resampler = resampler; } milkytracker-0.90.85+dfsg/src/tracker/TrackerKeyboard.cpp0000644000175000017500000010475211150223367022436 0ustar admin2admin2/* * tracker/TrackerKeyboard.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TrackerKeyboard.cpp * MilkyTracker * * Created by Peter Barth on Tue May 03 2005. * */ #include "Tracker.h" #include "TabManager.h" #include "KeyBindings.h" #include "PlayerController.h" #include "PlayerLogic.h" #include "RecorderLogic.h" #include "ModuleEditor.h" #include "PPUIConfig.h" #include "Container.h" #include "ListBox.h" #include "ListBoxFileBrowser.h" #include "PatternEditorControl.h" #include "ControlIDs.h" #include "TrackerConfig.h" #include "TrackerSettingsDatabase.h" #include "ScopesControl.h" #include "TabHeaderControl.h" #include "SectionSwitcher.h" #include "SectionSettings.h" #include "SectionTranspose.h" #include "SectionAdvancedEdit.h" #include "SectionDiskMenu.h" #include "SectionHDRecorder.h" #include "SectionQuickOptions.h" #include "SectionOptimize.h" #include "SectionAbout.h" #include "ToolInvokeHelper.h" // OS Interface #include "PPOpenPanel.h" #include "PPSavePanel.h" #include "PPMessageBox.h" bool Tracker::executeBinding(const PPKeyBindings* bindings, pp_uint16 keyCode) { currentKeyCode = keyCode; TTrackerKeyBindingHandler handlerFunc; bool res = bindings->getBinding(keyCode, ::getKeyModifier(), handlerFunc); if (res) { (this->*handlerFunc)(); return true; } return false; } void Tracker::initKeyBindings() { eventKeyDownBindingsMilkyTracker = new PPKeyBindings; eventKeyDownBindingsFastTracker = new PPKeyBindings; // Key-down bindings for MilkyTracker // tabbing stuff eventKeyDownBindingsMilkyTracker->addBinding('T', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_OpenTab); eventKeyDownBindingsMilkyTracker->addBinding('W', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_CloseTab); eventKeyDownBindingsMilkyTracker->addBinding(VK_LEFT, KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SwitchToPreviousTab); eventKeyDownBindingsMilkyTracker->addBinding(VK_RIGHT, KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SwitchToNextTab); eventKeyDownBindingsMilkyTracker->addBinding('1', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SelectOctave1); eventKeyDownBindingsMilkyTracker->addBinding('2', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SelectOctave2); eventKeyDownBindingsMilkyTracker->addBinding('3', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SelectOctave3); eventKeyDownBindingsMilkyTracker->addBinding('4', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SelectOctave4); eventKeyDownBindingsMilkyTracker->addBinding('5', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SelectOctave5); eventKeyDownBindingsMilkyTracker->addBinding('6', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SelectOctave6); eventKeyDownBindingsMilkyTracker->addBinding('7', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SelectOctave7); eventKeyDownBindingsMilkyTracker->addBinding('8', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SelectOctave8); eventKeyDownBindingsMilkyTracker->addBinding(VK_RETURN, 0, &Tracker::eventKeyDownBinding_PlaySong); eventKeyDownBindingsMilkyTracker->addBinding(VK_RETURN, KeyModifierCTRL, &Tracker::eventKeyDownBinding_PlayPattern); eventKeyDownBindingsMilkyTracker->addBinding(VK_RETURN, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPosition); eventKeyDownBindingsMilkyTracker->addBinding(VK_F9, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPattern); eventKeyDownBindingsMilkyTracker->addBinding(VK_F10, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPatternFromFIRSTQUARTER); eventKeyDownBindingsMilkyTracker->addBinding(VK_F11, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPatternFromSECONDQUARTER); eventKeyDownBindingsMilkyTracker->addBinding(VK_F12, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPatternFromTHIRDQUARTER); eventKeyDownBindingsMilkyTracker->addBinding(VK_SPACE, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayRow); // !! trace uses a hardcoded key-up event processing, check if you ever decide to change this shortcut eventKeyDownBindingsMilkyTracker->addBinding(VK_SPACE, KeyModifierALT, &Tracker::eventKeyDownBinding_PlayTrace); eventKeyDownBindingsMilkyTracker->addBinding(VK_ESCAPE, 0, &Tracker::eventKeyDownBinding_Stop); eventKeyDownBindingsMilkyTracker->addBinding(VK_SPACE, 0, &Tracker::eventKeyDownBinding_Edit); eventKeyDownBindingsMilkyTracker->addBinding('U', KeyModifierSHIFT, &Tracker::eventKeyDownBinding_UnmuteAll); eventKeyDownBindingsMilkyTracker->addBinding(VK_F4, KeyModifierALT, &Tracker::eventKeyDownBinding_ExitApplication); eventKeyDownBindingsMilkyTracker->addBinding('Q', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ExitApplication); eventKeyDownBindingsMilkyTracker->addBinding('O', KeyModifierCTRL, &Tracker::eventKeyDownBinding_Open); eventKeyDownBindingsMilkyTracker->addBinding('S', KeyModifierCTRL, &Tracker::eventKeyDownBinding_Save); eventKeyDownBindingsMilkyTracker->addBinding('S', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SaveAs); // Sections always with CTRL+ALT eventKeyDownBindingsMilkyTracker->addBinding('X', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeMainScreen); eventKeyDownBindingsMilkyTracker->addBinding('I', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeSectionInstruments); eventKeyDownBindingsMilkyTracker->addBinding('S', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeSectionSamples); eventKeyDownBindingsMilkyTracker->addBinding('C', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeSectionSettings); eventKeyDownBindingsMilkyTracker->addBinding('A', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeSectionAdvancedEdit); eventKeyDownBindingsMilkyTracker->addBinding('D', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeSectionDiskMenu); eventKeyDownBindingsMilkyTracker->addBinding('T', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeSectionTranspose); eventKeyDownBindingsMilkyTracker->addBinding('R', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeSectionHDRecorder); eventKeyDownBindingsMilkyTracker->addBinding('O', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_InvokeSectionQuickOptions); eventKeyDownBindingsMilkyTracker->addBinding('Z', KeyModifierCTRL|KeyModifierALT, &Tracker::eventKeyDownBinding_ToggleScopes); // handy toggle shortcuts eventKeyDownBindingsMilkyTracker->addBinding('F', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleFollowSong); eventKeyDownBindingsMilkyTracker->addBinding('P', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleProspectiveMode); eventKeyDownBindingsMilkyTracker->addBinding('W', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleCursorWrapAround); eventKeyDownBindingsMilkyTracker->addBinding('L', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleLiveSwitch); // Transpose stuff like FT2 eventKeyDownBindingsMilkyTracker->addBinding(VK_F1, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_TransposeAllInsTrackDown); eventKeyDownBindingsMilkyTracker->addBinding(VK_F2, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_TransposeAllInsTrackUp); eventKeyDownBindingsMilkyTracker->addBinding(VK_F1, KeyModifierCTRL, &Tracker::eventKeyDownBinding_TransposeAllInsPatternDown); eventKeyDownBindingsMilkyTracker->addBinding(VK_F2, KeyModifierCTRL, &Tracker::eventKeyDownBinding_TransposeAllInsPatternUp); eventKeyDownBindingsMilkyTracker->addBinding(VK_F1, KeyModifierALT, &Tracker::eventKeyDownBinding_TransposeAllInsBlockDown); eventKeyDownBindingsMilkyTracker->addBinding(VK_F2, KeyModifierALT, &Tracker::eventKeyDownBinding_TransposeAllInsBlockUp); eventKeyDownBindingsMilkyTracker->addBinding(VK_F7, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_TransposeCurInsTrackDown); eventKeyDownBindingsMilkyTracker->addBinding(VK_F8, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_TransposeCurInsTrackUp); eventKeyDownBindingsMilkyTracker->addBinding(VK_F7, KeyModifierCTRL, &Tracker::eventKeyDownBinding_TransposeCurInsPatternDown); eventKeyDownBindingsMilkyTracker->addBinding(VK_F8, KeyModifierCTRL, &Tracker::eventKeyDownBinding_TransposeCurInsPatternUp); eventKeyDownBindingsMilkyTracker->addBinding(VK_F7, KeyModifierALT, &Tracker::eventKeyDownBinding_TransposeCurInsBlockDown); eventKeyDownBindingsMilkyTracker->addBinding(VK_F8, KeyModifierALT, &Tracker::eventKeyDownBinding_TransposeCurInsBlockUp); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD0, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD1, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD2, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD3, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD4, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD5, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD6, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD7, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD8, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_NUMPAD9, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_MULTIPLY, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_ADD, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_SEPARATOR, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_SUBTRACT, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_DECIMAL, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsMilkyTracker->addBinding(VK_DIVIDE, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); // Key-down bindings for Fasttracker // tab stuff eventKeyDownBindingsFastTracker->addBinding('T', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_OpenTab); eventKeyDownBindingsFastTracker->addBinding('W', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_CloseTab); // some more milkytracker specific short cuts in FT2 mode eventKeyDownBindingsFastTracker->addBinding('L', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_Open); eventKeyDownBindingsFastTracker->addBinding('S', KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_Save); eventKeyDownBindingsFastTracker->addBinding(VK_LEFT, KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SwitchToPreviousTab); eventKeyDownBindingsFastTracker->addBinding(VK_RIGHT, KeyModifierCTRL|KeyModifierSHIFT, &Tracker::eventKeyDownBinding_SwitchToNextTab); eventKeyDownBindingsFastTracker->addBinding(VK_RETURN, 0, &Tracker::eventKeyDownBinding_PlaySong); eventKeyDownBindingsFastTracker->addBinding(VK_RETURN, KeyModifierCTRL, &Tracker::eventKeyDownBinding_PlayPattern); eventKeyDownBindingsFastTracker->addBinding(VK_RETURN, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPosition); eventKeyDownBindingsFastTracker->addBinding(VK_ESCAPE, 0, &Tracker::eventKeyDownBinding_ExitApplication); eventKeyDownBindingsFastTracker->addBinding(VK_F9, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPattern); eventKeyDownBindingsFastTracker->addBinding(VK_F10, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPatternFromFIRSTQUARTER); eventKeyDownBindingsFastTracker->addBinding(VK_F11, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPatternFromSECONDQUARTER); eventKeyDownBindingsFastTracker->addBinding(VK_F12, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayPatternFromTHIRDQUARTER); eventKeyDownBindingsFastTracker->addBinding(VK_SPACE, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_PlayRow); // !! trace uses a hardcoded key-up event processing, check if you ever decide to change this shortcut eventKeyDownBindingsFastTracker->addBinding(VK_SPACE, KeyModifierALT, &Tracker::eventKeyDownBinding_PlayTrace); // for the die-hard FT2 users eventKeyDownBindingsFastTracker->addBinding(VK_RCONTROL, 0xFFFF, &Tracker::eventKeyDownBinding_PlaySong); eventKeyDownBindingsFastTracker->addBinding(VK_RMENU, 0xFFFF, &Tracker::eventKeyDownBinding_PlayPattern); eventKeyDownBindingsFastTracker->addBinding('U', KeyModifierSHIFT, &Tracker::eventKeyDownBinding_UnmuteAll); // Transpose all instruments eventKeyDownBindingsFastTracker->addBinding(VK_F1, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_TransposeAllInsTrackDown); eventKeyDownBindingsFastTracker->addBinding(VK_F2, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_TransposeAllInsTrackUp); eventKeyDownBindingsFastTracker->addBinding(VK_F1, KeyModifierCTRL, &Tracker::eventKeyDownBinding_TransposeAllInsPatternDown); eventKeyDownBindingsFastTracker->addBinding(VK_F2, KeyModifierCTRL, &Tracker::eventKeyDownBinding_TransposeAllInsPatternUp); eventKeyDownBindingsFastTracker->addBinding(VK_F1, KeyModifierALT, &Tracker::eventKeyDownBinding_TransposeAllInsBlockDown); eventKeyDownBindingsFastTracker->addBinding(VK_F2, KeyModifierALT, &Tracker::eventKeyDownBinding_TransposeAllInsBlockUp); eventKeyDownBindingsFastTracker->addBinding(VK_F7, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_TransposeCurInsTrackDown); eventKeyDownBindingsFastTracker->addBinding(VK_F8, KeyModifierSHIFT, &Tracker::eventKeyDownBinding_TransposeCurInsTrackUp); eventKeyDownBindingsFastTracker->addBinding(VK_F7, KeyModifierCTRL, &Tracker::eventKeyDownBinding_TransposeCurInsPatternDown); eventKeyDownBindingsFastTracker->addBinding(VK_F8, KeyModifierCTRL, &Tracker::eventKeyDownBinding_TransposeCurInsPatternUp); eventKeyDownBindingsFastTracker->addBinding(VK_F7, KeyModifierALT, &Tracker::eventKeyDownBinding_TransposeCurInsBlockDown); eventKeyDownBindingsFastTracker->addBinding(VK_F8, KeyModifierALT, &Tracker::eventKeyDownBinding_TransposeCurInsBlockUp); // Section bindings eventKeyDownBindingsFastTracker->addBinding('X', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeMainScreen); eventKeyDownBindingsFastTracker->addBinding('I', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionInstruments); eventKeyDownBindingsFastTracker->addBinding('S', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionSamples); eventKeyDownBindingsFastTracker->addBinding('C', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionSettings); eventKeyDownBindingsFastTracker->addBinding('A', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionAdvancedEdit); eventKeyDownBindingsFastTracker->addBinding('D', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionDiskMenu); eventKeyDownBindingsFastTracker->addBinding('T', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionTranspose); eventKeyDownBindingsFastTracker->addBinding('R', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionHDRecorder); eventKeyDownBindingsFastTracker->addBinding('O', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionQuickOptions); //eventKeyDownBindingsFastTracker->addBinding('Z', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokeSectionOptimize); eventKeyDownBindingsFastTracker->addBinding('Z', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleScopes); // Handy toggle functions eventKeyDownBindingsFastTracker->addBinding('F', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleFollowSong); eventKeyDownBindingsFastTracker->addBinding('P', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleProspectiveMode); eventKeyDownBindingsFastTracker->addBinding('W', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleCursorWrapAround); eventKeyDownBindingsFastTracker->addBinding('L', KeyModifierCTRL, &Tracker::eventKeyDownBinding_ToggleLiveSwitch); eventKeyDownBindingsFastTracker->addBinding('V', KeyModifierCTRL, &Tracker::eventKeyDownBinding_InvokePatternToolVolumeScalePattern); eventKeyDownBindingsFastTracker->addBinding('V', KeyModifierSHIFT, &Tracker::eventKeyDownBinding_InvokePatternToolVolumeScaleTrack); eventKeyDownBindingsFastTracker->addBinding('V', KeyModifierALT, &Tracker::eventKeyDownBinding_InvokePatternToolVolumeScaleSelection); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD0, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD1, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD2, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD3, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD4, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD5, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD6, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD7, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD8, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_NUMPAD9, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_MULTIPLY, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_ADD, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_SEPARATOR, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_SUBTRACT, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_DECIMAL, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindingsFastTracker->addBinding(VK_DIVIDE, 0, &Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument); eventKeyDownBindings = eventKeyDownBindingsMilkyTracker; } void Tracker::eventKeyDownBinding_OpenTab() { if (screen->getModalControl()) return; tabManager->openNewTab(); } void Tracker::eventKeyDownBinding_CloseTab() { if (screen->getModalControl()) return; tabManager->closeTab(); } void Tracker::eventKeyDownBinding_SwitchToNextTab() { if (screen->getModalControl()) return; tabManager->cycleTab(1); } void Tracker::eventKeyDownBinding_SwitchToPreviousTab() { if (screen->getModalControl()) return; tabManager->cycleTab(-1); } void Tracker::setOctave(pp_uint32 octave) { getPatternEditor()->setCurrentOctave(octave); updatePatternAddAndOctave(); } // Change octave on keyboards which have no function keys void Tracker::eventKeyDownBinding_SelectOctave1() { setOctave(1); } void Tracker::eventKeyDownBinding_SelectOctave2() { setOctave(2); } void Tracker::eventKeyDownBinding_SelectOctave3() { setOctave(3); } void Tracker::eventKeyDownBinding_SelectOctave4() { setOctave(4); } void Tracker::eventKeyDownBinding_SelectOctave5() { setOctave(5); } void Tracker::eventKeyDownBinding_SelectOctave6() { setOctave(6); } void Tracker::eventKeyDownBinding_SelectOctave7() { setOctave(7); } void Tracker::eventKeyDownBinding_SelectOctave8() { setOctave(8); } // Play entire song void Tracker::eventKeyDownBinding_PlaySong() { if (isActiveEditing()) return; playerLogic->playSong(); } void Tracker::eventKeyDownBinding_PlayPattern() { if (isActiveEditing()) return; playerLogic->playPattern(); } void Tracker::eventKeyDownBinding_PlayPosition() { if (isActiveEditing()) return; playerLogic->playPosition(); } void Tracker::eventKeyDownBinding_PlayPatternFromFIRSTQUARTER() { if (isActiveEditing()) return; playerController->resetPlayTimeCounter(); pp_int32 row = getPatternEditor()->getNumRows() >> 2; playerController->playPattern(moduleEditor->getCurrentPatternIndex(), listBoxOrderList->getSelectedIndex(), row, muteChannels); recorderLogic->init(); } void Tracker::eventKeyDownBinding_PlayPatternFromSECONDQUARTER() { if (isActiveEditing()) return; playerController->resetPlayTimeCounter(); pp_int32 row = (getPatternEditor()->getNumRows() >> 2)*2; playerController->playPattern(moduleEditor->getCurrentPatternIndex(), listBoxOrderList->getSelectedIndex(), row, muteChannels); recorderLogic->init(); } void Tracker::eventKeyDownBinding_PlayPatternFromTHIRDQUARTER() { if (isActiveEditing()) return; playerController->resetPlayTimeCounter(); pp_int32 row = (getPatternEditor()->getNumRows() >> 2)*3; playerController->playPattern(moduleEditor->getCurrentPatternIndex(), listBoxOrderList->getSelectedIndex(), row, muteChannels); recorderLogic->init(); } void Tracker::eventKeyDownBinding_PlayRow() { if (isActiveEditing()) return; playerLogic->playRow(); } void Tracker::eventKeyDownBinding_PlayTrace() { if (isActiveEditing()) return; playerLogic->playTrace(); } void Tracker::eventKeyDownBinding_Stop() { if (isActiveEditing()) return; // is already playing? stop playerController->resetPlayTimeCounter(); // stop song and reset main volume ensureSongStopped(true, false); } void Tracker::eventKeyDownBinding_Edit() { if (isActiveEditing()) return; if (screen->getModalControl()) return; PatternEditorControl* patternEditor = getPatternEditorControl(); if (!screen->hasFocus(patternEditor) && patternEditor->isVisible()) { screen->setFocus(patternEditor); //screen->paintControl(patternEditor); } else { PPControl* ctrl = sectionDiskMenu->isFileBrowserVisible() ? static_cast(sectionDiskMenu->getListBoxFiles()) : static_cast(listBoxInstruments); if (ctrl/* && ctrl->isVisible()*/) { screen->setFocus(ctrl); //screen->paintControl(ctrl); } else { screen->setFocus(NULL); //screen->paint(); } } } void Tracker::eventKeyDownBinding_UnmuteAll() { if (isActiveEditing()) return; scopesControl->handleUnmuteAll(); } void Tracker::eventKeyDownBinding_Open() { if (screen->getModalControl()) return; loadType(FileTypes::FileTypeSongAllModules); } void Tracker::eventKeyDownBinding_Save() { if (screen->getModalControl()) return; save(); } void Tracker::eventKeyDownBinding_SaveAs() { if (screen->getModalControl()) return; saveAs(); } void Tracker::eventKeyDownBinding_NextPattern() { if (screen->getModalControl()) return; if (moduleEditor->getCurrentPatternIndex() < 255) { moduleEditor->setCurrentPatternIndex(moduleEditor->getCurrentPatternIndex()+1); updatePattern(); playerLogic->continuePlayingPattern(); } } void Tracker::eventKeyDownBinding_PreviousPattern() { if (screen->getModalControl()) return; if (moduleEditor->getCurrentPatternIndex() > 0) { moduleEditor->setCurrentPatternIndex(moduleEditor->getCurrentPatternIndex()-1); updatePattern(); playerLogic->continuePlayingPattern(); } } // - Invoke sections void Tracker::eventKeyDownBinding_InvokeMainScreen() { if (screen->getModalControl()) return; sectionSwitcher->showBottomSection(SectionSwitcher::ActiveBottomSectionNone); sectionSwitcher->showUpperSection(NULL); } void Tracker::eventKeyDownBinding_InvokeSectionInstruments() { if (screen->getModalControl()) return; sectionSwitcher->showBottomSection(SectionSwitcher::ActiveBottomSectionInstrumentEditor); screen->paint(true, true); } void Tracker::eventKeyDownBinding_InvokeSectionSamples() { if (screen->getModalControl()) return; sectionSwitcher->showBottomSection(SectionSwitcher::ActiveBottomSectionSampleEditor); screen->paint(true, true); } void Tracker::eventKeyDownBinding_InvokeSectionTranspose() { if (screen->getModalControl()) return; sectionSwitcher->showUpperSection(sectionTranspose); } void Tracker::eventKeyDownBinding_InvokeSectionAdvancedEdit() { if (screen->getModalControl()) return; sectionSwitcher->showUpperSection(sectionAdvancedEdit); } void Tracker::eventKeyDownBinding_InvokeSectionDiskMenu() { if (screen->getModalControl()) return; sectionSwitcher->showUpperSection(sectionDiskMenu, false); } void Tracker::eventKeyDownBinding_InvokeSectionHDRecorder() { if (screen->getModalControl()) return; sectionSwitcher->showUpperSection(sectionHDRecorder); } void Tracker::eventKeyDownBinding_InvokeSectionSettings() { if (screen->getModalControl()) return; settingsDatabase->store("FREQTAB", moduleEditor->getFrequency()); settingsDatabase->store("PROSPECTIVE", getProspectiveMode() ? 1 : 0); settingsDatabase->store("WRAPAROUND", getCursorWrapAround() ? 1 : 0); settingsDatabase->store("FOLLOWSONG", getFollowSong() ? 1 : 0); if (settingsDatabaseCopy) delete settingsDatabaseCopy; settingsDatabaseCopy = new TrackerSettingsDatabase(*settingsDatabase); sectionSwitcher->showUpperSection(sectionSettings); screen->paint(true, true); } void Tracker::eventKeyDownBinding_InvokeSectionQuickOptions() { if (screen->getModalControl()) return; sectionSwitcher->showUpperSection(sectionQuickOptions); } void Tracker::eventKeyDownBinding_InvokeSectionOptimize() { if (screen->getModalControl()) return; sectionSwitcher->showUpperSection(sectionOptimize); } void Tracker::eventKeyDownBinding_InvokeSectionAbout() { if (screen->getModalControl()) return; sectionSwitcher->showUpperSection(sectionAbout); } void Tracker::eventKeyDownBinding_ToggleFT2Edit() { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_MENU)); ASSERT(container); PPButton* button = static_cast(container->getControlByID(MAINMENU_EDIT)); ASSERT(container); button->setTextColor(recorderLogic->getRecordMode() ? PPUIConfig::getInstance()->getColor(PPUIConfig::ColorDefaultButtonText) : TrackerConfig::colorRecordModeButtonText); #ifdef __LOWRES__ container = static_cast(screen->getControlByID(CONTAINER_LOWRES_TINYMENU)); ASSERT(container); button = static_cast(container->getControlByID(MAINMENU_EDIT)); ASSERT(button); button->setTextColor(recorderLogic->getRecordMode() ? PPUIConfig::getInstance()->getColor(PPUIConfig::ColorDefaultButtonText) : TrackerConfig::colorRecordModeButtonText); container = static_cast(screen->getControlByID(CONTAINER_LOWRES_JAMMENU)); ASSERT(container); button = static_cast(container->getControlByID(MAINMENU_EDIT)); ASSERT(button); button->setTextColor(recorderLogic->getRecordMode() ? PPUIConfig::getInstance()->getColor(PPUIConfig::ColorDefaultButtonText) : TrackerConfig::colorRecordModeButtonText); #endif getPatternEditorControl()->setRecordMode(!recorderLogic->getRecordMode()); //button->setColor(recordMode ? PPColor(191, 191, 191) : PPColor(192, 32, 32)); //screen->paintControl(button); screen->paint(); recorderLogic->setRecordMode(!recorderLogic->getRecordMode()); recorderLogic->initToggleEdit(); } void Tracker::eventKeyDownBinding_ToggleFollowSong() { setFollowSong(!getFollowSong()); } void Tracker::eventKeyDownBinding_ToggleProspectiveMode() { setProspectiveMode(!getProspectiveMode()); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_ToggleCursorWrapAround() { setCursorWrapAround(!getCursorWrapAround()); } void Tracker::eventKeyDownBinding_ToggleLiveSwitch() { setLiveSwitch(!playerLogic->getLiveSwitch()); } void Tracker::eventKeyDownBinding_ToggleRecordKeyOff() { recorderLogic->setRecordKeyOff(!recorderLogic->getRecordKeyOff()); } void Tracker::eventKeyDownBinding_ToggleScopes() { #ifndef __LOWRES__ showScopes(scopesControl->isHidden(), settingsDatabase->restore("SCOPES")->getIntValue() >> 1); #endif } void Tracker::eventKeyDownBinding_InvokePatternToolVolumeScalePattern() { toolInvokeHelper->invokeTool(ToolInvokeHelper::ToolTypePatternVolumeScale, currentKeyCode); } void Tracker::eventKeyDownBinding_InvokePatternToolVolumeScaleTrack() { toolInvokeHelper->invokeTool(ToolInvokeHelper::ToolTypeTrackVolumeScale, currentKeyCode); } void Tracker::eventKeyDownBinding_InvokePatternToolVolumeScaleSelection() { toolInvokeHelper->invokeTool(ToolInvokeHelper::ToolTypeSelectionVolumeScale, currentKeyCode); } // Quick choose instrument void Tracker::eventKeyDownBinding_InvokeQuickChooseInstrument() { toolInvokeHelper->invokeTool(ToolInvokeHelper::ToolTypeQuickChooseInstrument, currentKeyCode); } void Tracker::eventKeyDownBinding_TransposeCurInsTrackDown() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = tp.insRangeEnd = listBoxInstruments->getSelectedIndex() + 1; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = -1; getPatternEditorControl()->noteTransposeTrack(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeCurInsTrackUp() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = tp.insRangeEnd = listBoxInstruments->getSelectedIndex() + 1; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = 1; getPatternEditorControl()->noteTransposeTrack(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeCurInsPatternDown() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = tp.insRangeEnd = listBoxInstruments->getSelectedIndex() + 1; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = -1; getPatternEditorControl()->noteTransposePattern(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeCurInsPatternUp() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = tp.insRangeEnd = listBoxInstruments->getSelectedIndex() + 1; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = 1; getPatternEditorControl()->noteTransposePattern(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeCurInsBlockDown() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = tp.insRangeEnd = listBoxInstruments->getSelectedIndex() + 1; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = -1; getPatternEditorControl()->noteTransposeSelection(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeCurInsBlockUp() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = tp.insRangeEnd = listBoxInstruments->getSelectedIndex() + 1; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = 1; getPatternEditorControl()->noteTransposeSelection(tp); screen->paintControl(getPatternEditorControl()); } // All instruments transpose void Tracker::eventKeyDownBinding_TransposeAllInsTrackDown() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = 0; tp.insRangeEnd = 255; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = -1; getPatternEditorControl()->noteTransposeTrack(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeAllInsTrackUp() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = 0; tp.insRangeEnd = 255; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = 1; getPatternEditorControl()->noteTransposeTrack(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeAllInsPatternDown() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = 0; tp.insRangeEnd = 255; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = -1; getPatternEditorControl()->noteTransposePattern(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeAllInsPatternUp() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = 0; tp.insRangeEnd = 255; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = 1; getPatternEditorControl()->noteTransposePattern(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeAllInsBlockDown() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = 0; tp.insRangeEnd = 255; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = -1; getPatternEditorControl()->noteTransposeSelection(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_TransposeAllInsBlockUp() { if (screen->getModalControl()) return; PatternEditorTools::TransposeParameters tp; tp.insRangeStart = 0; tp.insRangeEnd = 255; tp.noteRangeStart = 1; tp.noteRangeEnd = ModuleEditor::MAX_NOTE; tp.amount = 1; getPatternEditorControl()->noteTransposeSelection(tp); screen->paintControl(getPatternEditorControl()); } void Tracker::eventKeyDownBinding_ExitApplication() { if (!screen->getModalControl()) showQuitMessageBox("Quit MilkyTracker?", NULL, NULL); } milkytracker-0.90.85+dfsg/src/tracker/PianoControl.cpp0000644000175000017500000004201211150223367021757 0ustar admin2admin2/* * tracker/PianoControl.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "PianoControl.h" #include "Screen.h" #include "GraphicsAbstract.h" #include "Font.h" #include "ScrollBar.h" #include "Piano.h" #include "Tools.h" #include "PatternTools.h" #include "TrackerConfig.h" #define SCROLLBARWIDTH SCROLLBUTTONSIZE static const bool blackKeys[] = { false, true, false, true, false, false, true, false, true, false, true, false }; static const PPPoint positions[] = { PPPoint(1,17), PPPoint(5,6), PPPoint(9,17), PPPoint(13,6), PPPoint(17, 17), PPPoint(25, 17), PPPoint(29,6), PPPoint(33, 17), PPPoint(37,6), PPPoint(41, 17), PPPoint(45,6), PPPoint(49, 17) }; static const PPColor colors[] = { PPColor(0,0,0), PPColor(255,255,255), PPColor(0,0,0), PPColor(255,255,255), PPColor(0,0,0), PPColor(0,0,0), PPColor(255,255,255), PPColor(0,0,0), PPColor(255,255,255), PPColor(0,0,0), PPColor(255,255,255), PPColor(0,0,0) }; pp_int32 PianoControl::XMAX() { return pianoBitmap->getBitmapWidth(); } pp_int32 PianoControl::YMAX() { return pianoBitmap->getBitmapHeight(); } pp_int32 PianoControl::KEYWIDTH() { return XMAX()/pianoBitmap->getBitmapLUTWidth(); } PianoControl::PianoControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, pp_uint8 numNotes, bool border/*= true*/) : PPControl(id, parentScreen, eventListener, location, size), border(border), NUMNOTES(numNotes), borderColor(&ourOwnBorderColor), mode(ModeEdit) { // default color ourOwnBorderColor.set(192, 192, 192); hScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y + size.height - SCROLLBARWIDTH - 1), size.width - 1, true); #ifndef __LOWRES__ xscale = 1; yscale = 1; pianoBitmap = PianoBitmapLarge::getInstance(); #else xscale = 2; yscale = 1; pianoBitmap = PianoBitmapSmall::getInstance(); #endif xMax = XMAX()*xscale; yMax = YMAX()*yscale; visibleWidth = size.width - 2; visibleHeight = size.height - SCROLLBARWIDTH - 2; adjustScrollbars(); startPos = 0; caughtControl = NULL; controlCaughtByLMouseButton = controlCaughtByRMouseButton = false; nbu = new pp_uint8[NUMNOTES]; memset(nbu, 0, NUMNOTES); keyState = new KeyState[NUMNOTES]; sampleIndex = 0; } PianoControl::~PianoControl() { delete hScrollbar; delete[] nbu; delete[] keyState; } void PianoControl::paint(PPGraphicsAbstract* g) { if (!isVisible()) return; pp_int32 xOffset = 2; pp_int32 yOffset = 2; g->setRect(location.x, location.y, location.x + size.width, location.y + size.height); if (border) { drawBorder(g, *borderColor); } g->setRect(location.x + 1, location.y + 1, location.x + size.width - 2, location.y + size.height - 2); pp_int32 width = visibleWidth; pp_int32 adder = 65536/xscale; pp_int32 oy = location.y + 1; // for black piano keys PPColor colCorrect(TrackerConfig::colorThemeMain); colCorrect.r<<=1; colCorrect.g<<=1; colCorrect.b<<=1; // for white piano keys PPColor colCorrect2(TrackerConfig::colorThemeMain); colCorrect2.scale(1.5f, 1.5f, 1.6f); pp_int32 avg = (colCorrect2.b+colCorrect2.g+colCorrect2.r) / 3; PPColor colCorrect4(avg, avg, avg); pp_int32 PIANO_LUT_WIDTH = pianoBitmap->getBitmapLUTWidth(); const pp_uint8* PIANO_LUT = pianoBitmap->getBitmapLUT(); const pp_uint8* PIANO = pianoBitmap->getBitmap(); const pp_int32* DIVLUT = pianoBitmap->getDIVLUT(); const pp_int32* MODLUT = pianoBitmap->getMODLUT(); const pp_int32 XMAX = this->XMAX(); for (pp_int32 y = 0; y < visibleHeight; y++) { pp_int32 ry = y/yscale; pp_int32 offset = (ry*XMAX+(startPos/xscale)); pp_int32 ofs = 0; const pp_uint8* src = PIANO_LUT + (ry*PIANO_LUT_WIDTH*3); const pp_int32* divLutPtr = DIVLUT-ry*XMAX; const pp_int32* modLutPtr = MODLUT-ry*XMAX; pp_int32 ox = location.x + 1; for (pp_int32 x = 0; x < width; x++) { pp_int32 sx = offset+(ofs>>16); pp_int32 px = modLutPtr[sx]; pp_int32 c = src[px]; pp_int32 gr = src[px+1]; pp_int32 b = src[px+2]; if (c == 255 && gr == 0 && b == 0) { g->setColor(PIANO[sx], PIANO[sx], PIANO[sx]); } else { // color values equal/above 240 if (c >= 240) c-=240; pp_int32 note = divLutPtr[sx] + c; if (keyState[note].pressed) { if (keyState[note].muted) { if (colors[c].r) g->setSafeColor((PIANO[sx]+(colCorrect4.r>>2)), (PIANO[sx]+(colCorrect4.g>>2)), (PIANO[sx]+(colCorrect4.b>>2))); else g->setSafeColor((PIANO[sx]*colCorrect4.r)>>8, (PIANO[sx]*colCorrect4.g)>>8, (PIANO[sx]*colCorrect4.b)>>8); } else { if (colors[c].r) g->setSafeColor((PIANO[sx]+(colCorrect.r>>1)), (PIANO[sx]+(colCorrect.g>>1)), (PIANO[sx]+(colCorrect.b>>1))); else g->setSafeColor((PIANO[sx]*colCorrect2.r)>>8, (PIANO[sx]*colCorrect2.g)>>8, (PIANO[sx]*colCorrect2.b)>>8); } } else g->setColor(PIANO[sx], PIANO[sx], PIANO[sx]); } g->setPixel(ox, oy); ofs+=adder; ox++; } oy++; } float newXScale = pianoBitmap->getBitmapWidth() / PianoBitmapSmall::getInstance()->getBitmapWidth(); float newYScale = pianoBitmap->getBitmapHeight() / PianoBitmapSmall::getInstance()->getBitmapHeight(); if (mode == ModeEdit) { PPFont* font; font = (xscale == 1 && pianoBitmap == PianoBitmapSmall::getInstance()) ? PPFont::getFont(PPFont::FONT_TINY) : PPFont::getFont(PPFont::FONT_SYSTEM); g->setFont(font); xOffset = 0; yOffset = -1; if (xscale > 1) { xOffset = 2; } else if (pianoBitmap == PianoBitmapLarge::getInstance()) { xOffset = 1; } if (yscale > 1) { yOffset = -2; } else if (pianoBitmap == PianoBitmapLarge::getInstance()) { yOffset = 0; } for (pp_int32 i = 0; i < NUMNOTES; i++) { pp_int32 posx = location.x + 1 + (i/12)*(PIANO_LUT_WIDTH*xscale) - startPos; //if (blackKeys[i%12] && pianoBitmap == PianoBitmapLarge::getInstance()) // posx; g->setColor(colors[i%12]); char str[3] = "-"; if (nbu[i] != 255) PPTools::convertToHex(str, nbu[i], 1); g->drawChar(str[0], (pp_int32)(posx + (positions[i%12].x*xscale + xOffset)*newXScale), (pp_int32)(location.y + 1 + (positions[i%12].y*yscale + yOffset)*newYScale)); } } else if (mode == ModePlay && (xscale >= 2 || pianoBitmap == PianoBitmapLarge::getInstance())) { PPFont* font = PPFont::getFont(PPFont::FONT_TINY); g->setFont(font); if (pianoBitmap == PianoBitmapLarge::getInstance()) { xOffset = 1; yOffset = 0; } else { xOffset = 1; yOffset = -1; } for (pp_int32 i = 0; i < NUMNOTES; i++) { pp_int32 posx = location.x + 1 + (i/12)*(PIANO_LUT_WIDTH*xscale) - startPos; if (blackKeys[i%12] && pianoBitmap == PianoBitmapLarge::getInstance()) posx--; g->setColor(colors[i%12]); char str[4]/* = "C#"*/; PatternTools::getNoteName(str, i+1); if (str[1] == '-') { str[1] = str[2]; str[2] = '\0'; xOffset = 0; } else { str[2] = '\0'; xOffset = 1; } pp_int32 correctx = (KEYWIDTH()*xscale) / 2 - font->getStrWidth(str) / 2 - 3; if (correctx < 0) correctx = 0; xOffset += correctx; g->drawString(str, (pp_int32)(posx + (positions[i%12].x*xscale + xOffset)*newXScale), (pp_int32)(location.y + 1 + (positions[i%12].y*yscale + yOffset)*newYScale)); } } hScrollbar->paint(g); } pp_int32 PianoControl::dispatchEvent(PPEvent* event) { if (eventListener == NULL) return -1; //if (!visible) // return 0; switch (event->getID()) { case eRMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); if (hScrollbar->hit(*p)) { if (controlCaughtByLMouseButton) break; controlCaughtByRMouseButton = true; caughtControl = hScrollbar; caughtControl->dispatchEvent(event); } break; } case eLMouseDown: { PPPoint* p = (PPPoint*)event->getDataPtr(); // Clicked on horizontal scrollbar -> route event to scrollbar and catch scrollbar control if (hScrollbar->hit(*p)) { if (controlCaughtByRMouseButton) break; controlCaughtByLMouseButton = true; caughtControl = hScrollbar; caughtControl->dispatchEvent(event); } // Clicked in client area else { pp_int32 note = positionToNote(*p); if (note != -1) { switch (mode) { case ModeEdit: { nbu[note] = (pp_uint8)sampleIndex & 0xf; PPEvent e(eValueChanged, &nbu, sizeof(pp_uint8*)); eventListener->handleEvent(reinterpret_cast(this), &e); break; } case ModePlay: { currentSelectedNote = note; PPEvent e(eSelection, ¬e, sizeof(note)); eventListener->handleEvent(reinterpret_cast(this), &e); break; } } parentScreen->paintControl(this); } } break; } case eRMouseUp: { controlCaughtByRMouseButton = false; if (caughtControl && !controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; break; } break; } case eLMouseUp: if (caughtControl == NULL) { pp_int32 note = currentSelectedNote; if (note != -1) { switch (mode) { case ModePlay: { pp_int32 v = (1 << 16) + currentSelectedNote; PPEvent e(eSelection, &v, sizeof(v)); eventListener->handleEvent(reinterpret_cast(this), &e); break; } } parentScreen->paintControl(this); } break; } controlCaughtByLMouseButton = false; if (!controlCaughtByLMouseButton && !controlCaughtByRMouseButton) { caughtControl->dispatchEvent(event); caughtControl = NULL; } break; case eLMouseDrag: { if (caughtControl && controlCaughtByLMouseButton) { caughtControl->dispatchEvent(event); break; } //positionToNote(*(PPPoint*)event->getDataPtr()); //parentScreen->paintControl(this); pp_int32 note = positionToNote(*(PPPoint*)event->getDataPtr()); if (note != -1) { switch (mode) { case ModeEdit: { nbu[note] = (pp_uint8)sampleIndex & 0xf; PPEvent e(eValueChanged, &nbu, sizeof(pp_uint8*)); eventListener->handleEvent(reinterpret_cast(this), &e); break; } case ModePlay: { if (note == currentSelectedNote) break; pp_int32 v = (1 << 16) + currentSelectedNote; PPEvent e(eSelection, &v, sizeof(v)); eventListener->handleEvent(reinterpret_cast(this), &e); currentSelectedNote = note; PPEvent e2(eSelection, ¬e, sizeof(note)); eventListener->handleEvent(reinterpret_cast(this), &e2); break; } } parentScreen->paintControl(this); } break; } case eRMouseDrag: { if (caughtControl && controlCaughtByRMouseButton) caughtControl->dispatchEvent(event); break; } case eRMouseRepeat: { if (caughtControl && controlCaughtByRMouseButton) caughtControl->dispatchEvent(event); break; } case eMouseWheelMoved: { TMouseWheelEventParams* params = (TMouseWheelEventParams*)event->getDataPtr(); if (params->delta > 0 && hScrollbar) { PPEvent e(eBarScrollUp); handleEvent(reinterpret_cast(hScrollbar), &e); } else if (params->delta < 0 && hScrollbar) { PPEvent e(eBarScrollDown); handleEvent(reinterpret_cast(hScrollbar), &e); } event->cancel(); break; } default: if (caughtControl == NULL) break; caughtControl->dispatchEvent(event); break; } return 0; } pp_int32 PianoControl::handleEvent(PPObject* sender, PPEvent* event) { // Horizontal scrollbar, scroll up (=left) if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarScrollUp) { startPos-=KEYWIDTH()*xscale; if (startPos < 0) startPos = 0; pp_int32 visibleItems = visibleWidth; float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, scroll down (=right) else if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarScrollDown) { pp_int32 visibleItems = visibleWidth; startPos+=KEYWIDTH()*xscale; if (startPos + visibleItems >= (signed)getMaxWidth()) startPos = getMaxWidth() - visibleItems; float v = (float)(getMaxWidth() - visibleItems); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); } // Horizontal scrollbar, position changed else if (sender == reinterpret_cast(hScrollbar) && event->getID() == eBarPosChanged) { float pos = hScrollbar->getBarPosition()/65536.0f; pp_int32 visibleItems = visibleWidth; float v = (float)(getMaxWidth() - visibleItems); startPos = (pp_uint32)(v*pos); } parentScreen->paintControl(this); return 0; } pp_int32 PianoControl::getMaxWidth() { return XMAX()*xscale; } void PianoControl::adjustScrollbars() { float s = (float)visibleWidth / (float)getMaxWidth(); float olds = hScrollbar->getBarSize() / 65536.0f; hScrollbar->setBarSize((pp_int32)(s*65536.0f), false); s = hScrollbar->getBarSize() / 65536.0f; float scale = s / olds; float pos = hScrollbar->getBarPosition()/65536.0f; hScrollbar->setBarPosition((pp_int32)(pos*scale*65536.0f)); pos = hScrollbar->getBarPosition()/65536.0f; pp_int32 visibleItems = visibleWidth; float v = (float)(getMaxWidth() - visibleItems); startPos = (pp_uint32)(v*pos); if (startPos < 0) { startPos = 0; } //pp_int32 entireSize = (horizontal?this->size.width:this->size.height) - SCROLLBUTTONSIZE*2; } void PianoControl::setxScale(pp_int32 scale) { xscale = scale; adjustScrollbars(); assureNoteVisible(4*12); } void PianoControl::setyScale(pp_int32 scale) { yscale = scale; } void PianoControl::setLocation(const PPPoint& location) { PPControl::setLocation(location); pp_int32 p = hScrollbar->getBarPosition(); pp_int32 s = hScrollbar->getBarSize(); delete hScrollbar; hScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y + size.height - SCROLLBARWIDTH - 1), size.width - 1, true); hScrollbar->setBarSize(s); hScrollbar->setBarPosition(p); } void PianoControl::setSize(const PPSize& size) { PPControl::setSize(size); delete hScrollbar; hScrollbar = new PPScrollbar(0, parentScreen, this, PPPoint(location.x, location.y + size.height - SCROLLBARWIDTH - 1), size.width - 1, true); visibleWidth = size.width - 2; visibleHeight = size.height - SCROLLBARWIDTH - 2; adjustScrollbars(); assureNoteVisible(4*12); } void PianoControl::setSampleTable(const pp_uint8* nbu) { if (nbu == NULL) { memset(this->nbu, 0, NUMNOTES); return; } memcpy(this->nbu, nbu, NUMNOTES); } void PianoControl::pressNote(pp_int32 note, bool pressed, bool muted/* = false*/) { if (note >= 0 && note < NUMNOTES) { keyState[note].pressed = pressed; keyState[note].muted = muted; } } bool PianoControl::getNoteState(pp_int32 note) const { if (note >= 0 && note < NUMNOTES) return keyState[note].pressed; return false; } void PianoControl::assureNoteVisible(pp_int32 note) { pp_int32 PIANO_LUT_WIDTH = pianoBitmap->getBitmapLUTWidth(); pp_int32 startPos = (PIANO_LUT_WIDTH*(note/12)+positions[note%12].x)*xscale; float v = (float)(getMaxWidth() - visibleWidth); hScrollbar->setBarPosition((pp_int32)(startPos*(65536.0f/v))); float pos = hScrollbar->getBarPosition()/65536.0f; startPos = (pp_uint32)(v*pos); this->startPos = startPos; } pp_int32 PianoControl::positionToNote(PPPoint cp) { if (sampleIndex < 0) return -1; cp.x -= location.x + 1; cp.y -= location.y + 1; if (cp.x < 0 || cp.x >= visibleWidth || cp.y < 0 || cp.y >= visibleHeight) return -1; pp_int32 PIANO_LUT_WIDTH = pianoBitmap->getBitmapLUTWidth(); const pp_uint8* PIANO_LUT = pianoBitmap->getBitmapLUT(); cp.x/=xscale; cp.y/=yscale; cp.x+=startPos/xscale; pp_int32 octave = cp.x / PIANO_LUT_WIDTH; pp_int32 ox = cp.x % PIANO_LUT_WIDTH; pp_int32 c = PIANO_LUT[(cp.y * PIANO_LUT_WIDTH + ox)*3]; pp_int32 g = PIANO_LUT[(cp.y * PIANO_LUT_WIDTH + ox)*3+1]; pp_int32 b = PIANO_LUT[(cp.y * PIANO_LUT_WIDTH + ox)*3+2]; if (c == 255 && g == 0 && b == 0) return -1; // color values equal/above 240 if (c >= 240) c-=240; pp_int32 note = octave*12 + c; if (note < 0 || note >= NUMNOTES) return -1; return note; } milkytracker-0.90.85+dfsg/src/tracker/Piano.h0000644000175000017500000000723511150223367020073 0ustar admin2admin2/* * tracker/Piano.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef PIANO__H #define PIANO__H #include "Singleton.h" class PianoBitmapBase { protected: PianoBitmapBase() { } public: virtual const pp_uint8* getBitmap() = 0; virtual const pp_uint8* getBitmapLUT() = 0; virtual pp_int32 getBitmapWidth() = 0; virtual pp_int32 getBitmapHeight() = 0; virtual pp_int32 getBitmapLUTWidth() = 0; virtual const pp_int32* getDIVLUT() = 0; virtual const pp_int32* getMODLUT() = 0; }; class PianoBitmapSmall : public PianoBitmapBase, public PPSingleton { private: enum { width = 448, height = 25, octaveWidth = 56 }; PianoBitmapSmall() { const pp_int32 lutWidth = getBitmapLUTWidth(); const pp_int32 width = getBitmapWidth(); for (pp_int32 i = 0; i < width; i++) { DIVLUT[i] = (i/lutWidth)*12; MODLUT[i] = (i%lutWidth)*3; } } static const pp_uint8 PIANO_LUT[]; static const pp_uint8 PIANO[]; pp_int32 DIVLUT[width]; pp_int32 MODLUT[width]; public: virtual const pp_uint8* getBitmap() { return PIANO; } virtual const pp_uint8* getBitmapLUT() { return PIANO_LUT; } virtual pp_int32 getBitmapWidth() { return width; } virtual pp_int32 getBitmapHeight() { return height; } virtual pp_int32 getBitmapLUTWidth() { return octaveWidth; } virtual const pp_int32* getDIVLUT() { return DIVLUT; } virtual const pp_int32* getMODLUT() { return MODLUT; } friend class PPSingleton; }; #ifndef __LOWRES__ class PianoBitmapLarge : public PianoBitmapBase, public PPSingleton { private: enum { width = 448*2, height = 25*2, octaveWidth = 56*2 }; PianoBitmapLarge() { const pp_int32 lutWidth = getBitmapLUTWidth(); const pp_int32 width = getBitmapWidth(); for (pp_int32 i = 0; i < width; i++) { DIVLUT[i] = (i/lutWidth)*12; MODLUT[i] = (i%lutWidth)*3; } } static const pp_uint8 PIANO_LUT[]; static const pp_uint8 PIANO[]; pp_int32 DIVLUT[width]; pp_int32 MODLUT[width]; public: virtual const pp_uint8* getBitmap() { return PIANO; } virtual const pp_uint8* getBitmapLUT() { return PIANO_LUT; } virtual pp_int32 getBitmapWidth() { return width; } virtual pp_int32 getBitmapHeight() { return height; } virtual pp_int32 getBitmapLUTWidth() { return octaveWidth; } virtual const pp_int32* getDIVLUT() { return DIVLUT; } virtual const pp_int32* getMODLUT() { return MODLUT; } friend class PPSingleton; }; #else class PianoBitmapLarge : public PianoBitmapBase, public PPSingleton { private: PianoBitmapLarge() { } public: virtual const pp_uint8* getBitmap() { return NULL; } virtual const pp_uint8* getBitmapLUT() { return NULL; } virtual pp_int32 getBitmapWidth() { return 0; } virtual pp_int32 getBitmapHeight() { return 0; } virtual pp_int32 getBitmapLUTWidth() { return 0; } virtual const pp_int32* getDIVLUT() { return NULL; } virtual const pp_int32* getMODLUT() { return NULL; } friend class PPSingleton; }; #endif #endif milkytracker-0.90.85+dfsg/src/tracker/PlayerController.cpp0000644000175000017500000007572411150223367022670 0ustar admin2admin2/* * tracker/PlayerController.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PlayerController.cpp * MilkyTracker * * Created by Peter Barth on Tue Mar 15 2005. * */ #include "PlayerController.h" #include "PlayerMaster.h" #include "MilkyPlay.h" #include "ResamplerMacros.h" #include "PPSystem.h" #include "PlayerCriticalSection.h" #include "ModuleEditor.h" class PlayerStatusTracker : public PlayerSTD::StatusEventListener { public: PlayerStatusTracker(PlayerController& playerController) : playerController(playerController) { clearUpdateCommandBuff(); } // this is being called from the player callback in a serialized fashion virtual void playerTickStarted(PlayerSTD& player, XModule& module) { while (rbReadIndex < rbWriteIndex) { mp_sint32 idx = rbReadIndex & (UPDATEBUFFSIZE-1); // handle notes that are played from external source // i.e. keyboard playback switch (updateCommandBuff[idx].code) { case UpdateCommandCodeNote: { UpdateCommandNote* command = reinterpret_cast(&updateCommandBuff[idx]); mp_sint32 note = command->note; if (note) { player.playNote(command->channel, note, command->ins, command->volume); command->note = 0; } break; } case UpdateCommandCodeSample: { UpdateCommandSample* command = reinterpret_cast(&updateCommandBuff[idx]); const TXMSample* smp = command->smp; if (smp) { playSampleInternal(player, command->channel, smp, command->currentSamplePlayNote, command->rangeStart, command->rangeEnd); command->smp = NULL; } break; } } rbReadIndex++; } } virtual void patternEndReached(PlayerSTD& player, XModule& module, mp_sint32& newOrderIndex) { handleQueuedPositions(player, newOrderIndex); } void playNote(mp_ubyte chn, mp_sint32 note, mp_sint32 ins, mp_sint32 vol/* = -1*/) { // fill ring buffer with note entries // the callback will query these notes and play them mp_sint32 idx = rbWriteIndex & (UPDATEBUFFSIZE-1); UpdateCommandNote* command = reinterpret_cast(&updateCommandBuff[idx]); command->channel = chn; command->ins = ins; command->volume = vol; command->note = note; // code needs to be filled in last command->code = UpdateCommandCodeNote; rbWriteIndex++; } void playSample(mp_ubyte chn, const TXMSample& smp, mp_sint32 currentSamplePlayNote, mp_sint32 rangeStart, mp_sint32 rangeEnd) { // fill ring buffer with sample playback entries mp_sint32 idx = rbWriteIndex & (UPDATEBUFFSIZE-1); UpdateCommandSample* command = reinterpret_cast(&updateCommandBuff[idx]); command->channel = chn; command->currentSamplePlayNote = currentSamplePlayNote; command->rangeStart = rangeStart; command->rangeEnd = rangeEnd; command->smp = &smp; command->code = UpdateCommandCodeSample; rbWriteIndex++; } private: PlayerController& playerController; void handleQueuedPositions(PlayerSTD& player, mp_sint32& poscnt) { // there is a queued position if (playerController.nextOrderIndexToPlay != -1) { // the new order the queued one poscnt = playerController.nextOrderIndexToPlay; // the queued one becomes invalid playerController.nextOrderIndexToPlay = -1; // we're no longer in pattern play mode... playerController.patternPlay = false; // ... that's why we're going to set the pattern index to -1 playerController.patternIndex = -1; player.setPatternToPlay(-1); } // there is a queued pattern else if (playerController.nextPatternIndexToPlay != -1) { // the new pattern index player.setPatternToPlay(playerController.nextPatternIndexToPlay); // we're no in pattern play mode playerController.patternPlay = true; // that's our new pattern playerController.patternIndex = playerController.nextPatternIndexToPlay; // the queued one becomes invalid playerController.nextPatternIndexToPlay = -1; } } void playSampleInternal(PlayerSTD& player, mp_ubyte chn, const TXMSample* smp, mp_sint32 currentSamplePlayNote, mp_sint32 rangeStart, mp_sint32 rangeEnd) { pp_int32 period = player.getlogperiod(currentSamplePlayNote+1, smp->relnote, smp->finetune) << 8; pp_int32 freq = player.getlogfreq(period); player.setFreq(chn,freq); player.setVol(chn, (smp->vol*512)/255); player.setPan(chn, 128); player.chninfo[chn].flags |= 0x100; // CHANNEL_FLAGS_UPDATE_IGNORE pp_int32 flags = (smp->type >> 2) & 4; if (rangeStart == -1 && rangeEnd == -1) { flags |= smp->type & 3; if (flags & 3) player.playSample(chn, smp->sample, smp->samplen, 0, 0, false, smp->loopstart, smp->loopstart+smp->looplen, flags); else player.playSample(chn, smp->sample, smp->samplen, 0, 0, false, 0, smp->samplen, flags); } else { if (rangeStart == -1 || rangeEnd == -1) return; if (rangeEnd > (signed)smp->samplen) rangeEnd = smp->samplen; player.playSample(chn, smp->sample, smp->samplen, rangeStart, 0, false, 0, rangeEnd, flags); } } void clearUpdateCommandBuff() { memset(updateCommandBuff, 0, sizeof(updateCommandBuff)); rbReadIndex = rbWriteIndex = 0; } enum { // must be 2^n UPDATEBUFFSIZE = 128 }; enum UpdateCommandCodes { UpdateCommandCodeInvalid = 0, UpdateCommandCodeNote, UpdateCommandCodeSample, }; struct UpdateCommand { mp_ubyte code; mp_uint32 data[8]; void* pdata[8]; }; struct UpdateCommandNote { mp_ubyte code; mp_sint32 note; mp_sint32 channel; mp_sint32 ins; mp_sint32 volume; mp_uint32 data[4]; void* pdata[8]; }; struct UpdateCommandSample { mp_ubyte code; mp_uint32 currentSamplePlayNote; mp_uint32 rangeStart; mp_uint32 rangeEnd; mp_sint32 channel; mp_uint32 data[4]; const TXMSample* smp; void* pdata[7]; }; UpdateCommand updateCommandBuff[UPDATEBUFFSIZE]; mp_sint32 rbReadIndex; mp_sint32 rbWriteIndex; }; void PlayerController::assureNotSuspended() { if (mixer->isDevicePaused(player)) { mixer->resumeDevice(player); if (suspended) suspended = false; } } void PlayerController::reset() { if (!player) return; // reset internal player variables (effect memory) and looping information player->BPMCounter = 0; player->reset(); // reset mixer channels (stop playing channels) player->resetChannelsFull(); } bool PlayerController::detachDevice() { if (!mixer->isDeviceRemoved(player)) { return mixer->removeDevice(player); } return false; } PlayerController::PlayerController(MasterMixer* mixer, bool fakeScopes) : mixer(mixer), player(NULL), module(NULL), criticalSection(NULL), playerStatusTracker(new PlayerStatusTracker(*this)), patternPlay(false), playRowOnly(false), patternIndex(-1), nextOrderIndexToPlay(-1), nextPatternIndexToPlay(-1), lastPosition(-1), lastRow(-1), suspended(false), firstRecordChannelCall(true), numPlayerChannels(TrackerConfig::numPlayerChannels), numVirtualChannels(TrackerConfig::numVirtualChannels), totalPlayerChannels(numPlayerChannels + numVirtualChannels + 2), useVirtualChannels(TrackerConfig::useVirtualChannels), multiChannelKeyJazz(true), multiChannelRecord(true), mixerDataCacheSize(fakeScopes ? 0 : 512*2), mixerDataCache(fakeScopes ? NULL : new mp_sint32[mixerDataCacheSize]) { criticalSection = new PlayerCriticalSection(*this); player = new PlayerSTD(mixer->getSampleRate(), playerStatusTracker); player->setPlayMode(PlayerBase::PlayMode_FastTracker2); player->resetMainVolumeOnStartPlay(false); player->setBufferSize(mixer->getBufferSize()); currentPlayingChannel = useVirtualChannels ? numPlayerChannels : 0; pp_uint32 i; for (i = 0; i < sizeof(muteChannels) / sizeof(bool); i++) muteChannels[i] = false; for (i = 0; i < sizeof(recordChannels) / sizeof(bool); i++) recordChannels[i] = false; for (i = 0; i < sizeof(panning) / sizeof(mp_ubyte); i++) { switch (i & 3) { case 0: panning[i] = 0; break; case 1: panning[i] = 255; break; case 2: panning[i] = 255; break; case 3: panning[i] = 0; break; } } } PlayerController::~PlayerController() { delete[] mixerDataCache; if (player) { detachDevice(); delete player; } delete playerStatusTracker; delete criticalSection; } void PlayerController::attachModuleEditor(ModuleEditor* moduleEditor) { this->moduleEditor = moduleEditor; this->module = moduleEditor->getModule(); if (!player) return; if (!mixer->isDeviceRemoved(player)) mixer->removeDevice(player); ASSERT(sizeof(muteChannels)/sizeof(bool) >= (unsigned)totalPlayerChannels); player->startPlaying(module, true, 0, 0, totalPlayerChannels, panning, true); // restore muting for (mp_sint32 i = 0; i < numPlayerChannels; i++) player->muteChannel(i, muteChannels[i]); mixer->addDevice(player); } void PlayerController::playSong(mp_sint32 startIndex, mp_sint32 rowPosition, mp_ubyte* muteChannels) { if (!player) return; if (!module) return; if (!module->isModuleLoaded()) return; assureNotSuspended(); if (!suspended) criticalSection->enter(false); readjustSpeed(); reset(); player->setPatternToPlay(-1); setNextOrderToPlay(-1); setNextPatternToPlay(-1); // muting has been reset, restore it for (mp_sint32 i = 0; i < numPlayerChannels; i++) { player->muteChannel(i, muteChannels[i]); this->muteChannels[i] = muteChannels[i]; } player->restart(startIndex, rowPosition, false, panning); player->setIdle(false); //resetPlayTimeCounter(); patternPlay = false; playRowOnly = false; patternIndex = 0; criticalSection->leave(false); } void PlayerController::playPattern(mp_sint32 index, mp_sint32 songPosition, mp_sint32 rowPosition, mp_ubyte* muteChannels, bool playRowOnly/* = false*/) { if (!player) return; if (!module) return; if (!module->isModuleLoaded()) return; assureNotSuspended(); if (!suspended) criticalSection->enter(false); readjustSpeed(); reset(); setCurrentPatternIndex(index); setNextOrderToPlay(-1); setNextPatternToPlay(-1); // muting has been reset, restore it for (mp_sint32 i = 0; i < numPlayerChannels; i++) { player->muteChannel(i, muteChannels[i]); this->muteChannels[i] = muteChannels[i]; } if (rowPosition == -1) { rowPosition = player->getRow(); if (rowPosition >= module->phead[index].rows) rowPosition = 0; } player->restart(songPosition, rowPosition, false, panning, playRowOnly); player->setIdle(false); //resetPlayTimeCounter(); patternPlay = true; this->playRowOnly = playRowOnly; patternIndex = index; criticalSection->leave(false); } void PlayerController::setCurrentPatternIndex(mp_sint32 index) { if (player) player->setPatternToPlay(index); } void PlayerController::stop(bool bResetMainVolume/* = true*/) { if (!player) return; if (!module) return; if (!suspended) criticalSection->enter(false); if (isPlaying() && !playRowOnly) { lastPosition = player->getOrder(); lastRow = player->getRow(); wasPlayingPattern = isPlayingPattern(); } else { lastPosition = -1; lastRow = -1; wasPlayingPattern = false; } patternPlay = false; playRowOnly = false; readjustSpeed(); player->setIdle(true); reset(); player->restart(0, 0, true, panning); // muting has been reset, restore it for (mp_sint32 i = 0; i < numPlayerChannels; i++) { player->muteChannel(i, muteChannels[i]); this->muteChannels[i] = muteChannels[i]; } // reset internal variables if (bResetMainVolume) resetMainVolume(); setNextOrderToPlay(-1); setNextPatternToPlay(-1); criticalSection->leave(false); } void PlayerController::continuePlaying() { continuePlaying(true); } void PlayerController::continuePlaying(bool assureNotSuspended) { if (lastPosition == -1 || lastRow == -1) return; if (!player) return; if (!module) return; if (!module->isModuleLoaded()) return; if (assureNotSuspended) this->assureNotSuspended(); if (!suspended) criticalSection->enter(false); readjustSpeed(); if (wasPlayingPattern) player->setPatternToPlay(patternIndex); else player->setPatternToPlay(-1); for (mp_sint32 i = 0; i < numPlayerChannels; i++) player->muteChannel(i, muteChannels[i]); player->restart(lastPosition, lastRow, false, panning); player->setIdle(false); patternPlay = wasPlayingPattern; playRowOnly = false; criticalSection->leave(false); } void PlayerController::restartPlaying() { if (!player) return; if (!module) return; if (!module->isModuleLoaded()) return; lastPosition = lastRow = 0; } bool PlayerController::isPlaying() const { if (!player) return false; if (!module) return false; return player->isPlaying() && (!player->isIdle()) && !player->hasSongHalted(); } bool PlayerController::isPlayingRowOnly() const { if (!player) return false; if (!module) return false; return playRowOnly; } bool PlayerController::isActive() const { if (!player) return false; if (!module) return false; return player->isPlaying() && (!player->isIdle()); } bool PlayerController::isPlayingPattern(mp_sint32 index) const { if (!player) return false; if (index < 0) return false; if (player->getPatternToPlay() < 0) return false; return isPlayingPattern() && (player->getPatternToPlay() == index); } void PlayerController::setNextOrderToPlay(mp_sint32 orderIndex) { nextOrderIndexToPlay = orderIndex; if (orderIndex != -1) nextPatternIndexToPlay = -1; } mp_sint32 PlayerController::getNextOrderToPlay() const { return nextOrderIndexToPlay; } void PlayerController::setNextPatternToPlay(mp_sint32 patternIndex) { nextPatternIndexToPlay = patternIndex; if (patternIndex != -1) nextOrderIndexToPlay = -1; } mp_sint32 PlayerController::getNextPatternToPlay() const { return nextPatternIndexToPlay; } void PlayerController::pause() { if (player) player->pausePlaying(); } void PlayerController::unpause() { if (player) player->resumePlaying(); } bool PlayerController::isPaused() const { if (player) return player->isPaused(); return false; } void PlayerController::getSpeed(mp_sint32& BPM, mp_sint32& speed) { if (player && player->isPlaying()) { BPM = player->getTempo(); speed = player->getSpeed(); } else if (module) { BPM = module->header.speed; speed = module->header.tempo; } else { BPM = 125; speed = 6; } } void PlayerController::setSpeed(mp_sint32 BPM, mp_sint32 speed, bool adjustModuleHeader/* = true*/) { if (!player) return; if (BPM < 32) BPM = 32; if (BPM > 255) BPM = 255; if (speed < 1) speed = 1; if (speed > 31) speed = 31; if (player->isPlaying()) { player->setTempo(BPM); player->setSpeed(speed); // this is a MUST!!! pp_uint32 bpmRate = player->getbpmrate(BPM); player->adder = bpmRate; } if (module && adjustModuleHeader) { module->header.speed = BPM; module->header.tempo = speed; } } void PlayerController::readjustSpeed(bool adjustModuleHeader/* = true*/) { mp_sint32 speed, bpm; getSpeed(bpm, speed); setSpeed(bpm, speed, adjustModuleHeader); } void PlayerController::playSample(const TXMSample& smp, mp_sint32 currentSamplePlayNote, mp_sint32 rangeStart/* = -1*/, mp_sint32 rangeEnd/* = -1*/) { if (!player) return; assureNotSuspended(); if (player->isPlaying()) { pp_int32 i = numPlayerChannels + numVirtualChannels + 1; playerStatusTracker->playSample(i, smp, currentSamplePlayNote, rangeStart, rangeEnd); } } void PlayerController::stopSample() { if (!player) return; if (player->isPlaying()) { // doesn't seem to be a critical race condition pp_int32 i = numPlayerChannels + numVirtualChannels + 1; player->stopSample(i); player->chninfo[i].flags &= ~0x100; // CHANNEL_FLAGS_UPDATE_IGNORE } } void PlayerController::stopInstrument(mp_sint32 insIndex) { if (!player) return; if (player->isPlaying()) { // doesn't seem to be a critical race condition for (pp_int32 i = 0; i < numPlayerChannels + numVirtualChannels; i++) { if (player->chninfo[i].ins == insIndex) { player->stopSample(i); player->chninfo[i].flags &= ~0x100; // CHANNEL_FLAGS_UPDATE_IGNORE } } } } void PlayerController::playNote(mp_ubyte chn, mp_sint32 note, mp_sint32 i, mp_sint32 vol/* = -1*/) { if (!player) return; assureNotSuspended(); // note playing goes synchronized in the playback callback playerStatusTracker->playNote(chn, note, i, vol); } void PlayerController::suspendPlayer(bool bResetMainVolume/* = true*/, bool stopPlaying/* = true*/) { if (!player || suspended || mixer->isDeviceRemoved(player)) return; mixer->pauseDevice(player); suspended = true; if (stopPlaying) { stopSample(); stop(bResetMainVolume); } } void PlayerController::resumePlayer(bool continuePlaying) { if (!player) return; if (continuePlaying) this->continuePlaying(!suspended); if (suspended) { mixer->resumeDevice(player); suspended = false; } } void PlayerController::muteChannel(mp_sint32 c, bool m) { muteChannels[c] = m; if (player) player->muteChannel(c, m); } bool PlayerController::isChannelMuted(mp_sint32 c) { return muteChannels[c]; // do not poll the state from the player it will be resetted when the // player stops playing of a song /*if (player) { if (!player->getPlayerInstance()) return false; return static_cast(player->getPlayerInstance())->isChannelMuted(c); } return false;*/ } void PlayerController::recordChannel(mp_sint32 c, bool m) { recordChannels[c] = m; } bool PlayerController::isChannelRecording(mp_sint32 c) { return recordChannels[c]; } bool PlayerController::reallocChannels() { if (!player) return false; if (module) { bool paused = player->isPaused(); stop(false); // reattaching will cause the desired channels to be allocated attachModuleEditor(moduleEditor); if (paused) player->pausePlaying(); continuePlaying(); } return true; } void PlayerController::reallocateChannels(mp_sint32 moduleChannels/* = 32*/, mp_sint32 virtualChannels/* = 0*/) { numPlayerChannels = moduleChannels; numVirtualChannels = virtualChannels; totalPlayerChannels = numPlayerChannels + numVirtualChannels + 2; reallocChannels(); } void PlayerController::setUseVirtualChannels(bool bUseVirtualChannels) { useVirtualChannels = bUseVirtualChannels; currentPlayingChannel = useVirtualChannels ? numPlayerChannels : 0; } void PlayerController::resetFirstPlayingChannel() { for (pp_int32 i = 0; i < module->header.channum; i++) { if (recordChannels[i]) { currentPlayingChannel = i; break; } } } mp_sint32 PlayerController::getNextPlayingChannel(mp_sint32 currentChannel) { // if we're using virtual channels for instrument playback // the virtual channels are located in the range // [numPlayerChannels .. numPlayerChannels + numVirtualChannels] if (useVirtualChannels) { if (currentPlayingChannel < numPlayerChannels) currentPlayingChannel = numPlayerChannels-1; mp_sint32 res = currentPlayingChannel++; if (currentPlayingChannel >= numPlayerChannels + numVirtualChannels) currentPlayingChannel = numPlayerChannels; return res; } // if we're not using virtual channels for instrument playback // just use the module channels and cut notes which are playing else if (multiChannelKeyJazz) { mp_sint32 res = currentPlayingChannel/*++*/; //if (currentPlayingChannel >= module->header.channum) // currentPlayingChannel = 0; bool found = false; for (pp_int32 i = currentPlayingChannel+1; i < currentPlayingChannel + 1 + module->header.channum; i++) { pp_int32 c = i % module->header.channum; if (recordChannels[c]) { currentPlayingChannel = c; found = true; break; } } return found ? res : currentChannel; } return currentChannel; } void PlayerController::initRecording() { firstRecordChannelCall = true; } mp_sint32 PlayerController::getNextRecordingChannel(mp_sint32 currentChannel) { if (currentChannel < 0 || currentChannel >= TrackerConfig::MAXCHANNELS) return -1; if (firstRecordChannelCall && recordChannels[currentChannel]) { firstRecordChannelCall = false; return currentChannel; } else { for (pp_int32 i = currentChannel+1; i < currentChannel + 1 + module->header.channum; i++) { pp_int32 c = i % module->header.channum; if (recordChannels[c]) return c; } //return (currentChannel+1)%module->header.channum; } return currentChannel; } mp_sint32 PlayerController::getSongMainVolume() { if (!player || !module) return 255; return player->getSongMainVolume(); } void PlayerController::resetMainVolume() { if (!player || !module) return; player->setSongMainVolume((mp_ubyte)module->header.mainvol); } mp_int64 PlayerController::getPlayTime() { if (!player) return 0; float freq = (float)player->getMixFrequency(); return (mp_int64)(player->getSampleCounter()/freq); } void PlayerController::resetPlayTimeCounter() { if (!player) return; player->resetSampleCounter(); } void PlayerController::setPanning(mp_ubyte chn, mp_ubyte pan) { if (!player) return; panning[chn] = pan; if (player && player->isPlaying()) { for (mp_sint32 i = 0; i < numPlayerChannels; i++) player->setPanning((mp_ubyte)i, panning[i]); } } void PlayerController::getPosition(mp_sint32& pos, mp_sint32& row) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); player->getPosition(pos, row, index); } void PlayerController::getPosition(mp_sint32& order, mp_sint32& row, mp_sint32& ticker) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); player->getPosition(order, row, ticker, index); } void PlayerController::setPatternPos(mp_sint32 pos, mp_sint32 row) { player->setPatternPos(pos, row, false, false); } void PlayerController::switchPlayMode(PlayModes playMode, bool exactSwitch/* = true*/) { if (!player) return; switch (playMode) { case PlayMode_ProTracker2: if (exactSwitch) { player->enable(PlayerSTD::PlayModeOptionPanningE8x, false); player->enable(PlayerSTD::PlayModeOptionPanning8xx, false); player->enable(PlayerSTD::PlayModeOptionForcePTPitchLimit, true); } player->setPlayMode(PlayerBase::PlayMode_ProTracker2); break; case PlayMode_ProTracker3: if (exactSwitch) { player->enable(PlayerSTD::PlayModeOptionPanningE8x, false); player->enable(PlayerSTD::PlayModeOptionPanning8xx, false); player->enable(PlayerSTD::PlayModeOptionForcePTPitchLimit, true); } player->setPlayMode(PlayerBase::PlayMode_ProTracker3); break; case PlayMode_FastTracker2: if (exactSwitch) { player->enable(PlayerSTD::PlayModeOptionPanningE8x, false); player->enable(PlayerSTD::PlayModeOptionPanning8xx, true); player->enable(PlayerSTD::PlayModeOptionForcePTPitchLimit, false); } player->setPlayMode(PlayerBase::PlayMode_FastTracker2); break; default: ASSERT(false); } //stop(); //continuePlaying(); } PlayerController::PlayModes PlayerController::getPlayMode() { if (!player) return PlayMode_Auto; switch (player->getPlayMode()) { case PlayerBase::PlayMode_ProTracker2: return PlayMode_ProTracker2; case PlayerBase::PlayMode_ProTracker3: return PlayMode_ProTracker3; case PlayerBase::PlayMode_FastTracker2: return PlayMode_FastTracker2; default: ASSERT(false); } return PlayMode_Auto; } void PlayerController::enablePlayModeOption(PlayModeOptions option, bool b) { switch (option) { case PlayModeOptionPanning8xx: player->enable(PlayerSTD::PlayModeOptionPanning8xx, b); break; case PlayModeOptionPanningE8x: player->enable(PlayerSTD::PlayModeOptionPanningE8x, b); break; case PlayModeOptionForcePTPitchLimit: player->enable(PlayerSTD::PlayModeOptionForcePTPitchLimit, b); break; default: ASSERT(false); } } bool PlayerController::isPlayModeOptionEnabled(PlayModeOptions option) { if (!player) return false; switch (option) { case PlayModeOptionPanning8xx: return player->isEnabled(PlayerSTD::PlayModeOptionPanning8xx); case PlayModeOptionPanningE8x: return player->isEnabled(PlayerSTD::PlayModeOptionPanningE8x); case PlayModeOptionForcePTPitchLimit: return player->isEnabled(PlayerSTD::PlayModeOptionForcePTPitchLimit); default: ASSERT(false); return false; } } mp_sint32 PlayerController::getAllNumPlayingChannels() { if (!player) return 0; return player->mixerNumAllocatedChannels; } mp_sint32 PlayerController::getPlayerNumPlayingChannels() { if (!player) return 0; return player->initialNumChannels; } mp_sint32 PlayerController::getCurrentSamplePosition() { if (mixer && mixer->getAudioDriver()) return mixer->getAudioDriver()->getBufferPos(); return 0; } mp_sint32 PlayerController::getCurrentBeatIndex() { if (player) return player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); return 0; } bool PlayerController::isSamplePlaying(const TXMSample& smp, mp_sint32 channel, mp_sint32& pos, mp_sint32& vol, mp_sint32& pan) { if (!player) return false; ChannelMixer* mixer = player; // this rather critical // maybe someday this entire decision should go into the // player or mixer class itself, so I don't need to access it here pp_int32 j = getCurrentBeatIndex(); pos = mixer->channel[channel].timeRecord[j].smppos; // compare sample from sample editor against sample from current mixer channel if (pos >= 0 && (void*)mixer->channel[channel].timeRecord[j].sample == (void*)smp.sample) { vol = (mixer->channel[channel].timeRecord[j].volPan & 0xFFFF) >> 1; pan = (mixer->channel[channel].timeRecord[j].volPan) >> 16; return true; } return false; } bool PlayerController::isEnvelopePlaying(const TEnvelope& envelope, mp_sint32 envelopeType, mp_sint32 channel, mp_sint32& pos) { if (!player) return false; ChannelMixer* mixer = player; const PlayerSTD::TPrEnv* env = NULL; switch (envelopeType) { case 0: env = &player->chninfo[channel].venv; break; case 1: env = &player->chninfo[channel].penv; break; } pp_int32 j = getCurrentBeatIndex(); pos = env->timeRecord[j].pos; if (env && env->timeRecord[j].envstruc && env->timeRecord[j].envstruc == &envelope) { if ((env->timeRecord[j].envstruc->num && !(env->timeRecord[j].envstruc->type & 4) && pos >= env->timeRecord[j].envstruc->env[env->timeRecord[j].envstruc->num-1][0]) || !(mixer->channel[channel].timeRecord[j].volPan & 0xFFFF)) { pos = -1; } return true; } return false; } bool PlayerController::isNotePlaying(mp_sint32 ins, mp_sint32 channel, mp_sint32& note, bool& muted) { if (!player) return false; const PlayerSTD::TModuleChannel* chnInf = &player->chninfo[channel]; if (player->channel[channel].flags&ChannelMixer::MP_SAMPLE_PLAY) { if (chnInf->ins == ins && chnInf->keyon && chnInf->note) { muted = (player->channel[channel].flags & ChannelMixer::MP_SAMPLE_MUTE) != 0; note = chnInf->note; return true; } } return false; } #define FULLMIXER_8BIT_NORMAL_TEMP \ if (sample) { \ sd1 = ((mp_sbyte)sample[smppos])<<8; \ sd2 = ((mp_sbyte)sample[smppos+1])<<8; \ sd1 =((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; \ y = (sd1*vol)>>9; \ } \ else { \ y = 0; \ } \ fetcher.fetchSampleData(y); #define FULLMIXER_16BIT_NORMAL_TEMP \ if (sample) { \ sd1 = ((mp_sword*)(sample))[smppos]; \ sd2 = ((mp_sword*)(sample))[smppos+1]; \ sd1 =((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; \ y = (sd1*vol)>>9; \ } \ else { \ y = 0; \ } \ fetcher.fetchSampleData(y); void PlayerController::grabSampleData(mp_uint32 chnIndex, mp_sint32 count, mp_sint32 fMul, SampleDataFetcher& fetcher) { if (!player) return; if (mixerDataCache && (count * 2 > mixerDataCacheSize)) { delete[] mixerDataCache; mixerDataCacheSize = count * 2 * 2; mixerDataCache = new mp_sint32[mixerDataCacheSize]; } ChannelMixer* mixer = player; ChannelMixer::TMixerChannel* chn = &mixer->channel[chnIndex]; pp_int32 j = getCurrentBeatIndex(); if (chn->flags & ChannelMixer::MP_SAMPLE_PLAY) { // this is critical // it might be that the audio thread modifies the data as we are // accessing it... So in the worst case we're getting a sample // but the channel state data does belong to another sample already // in that case we're displaying garbage... // BUT it's important that we only access sample data // within the range of the current sample we have ChannelMixer::TMixerChannel channel; channel.sample = chn->timeRecord[j].sample; if (channel.sample == NULL) goto resort; channel.smplen = TXMSample::getSampleSizeInSamples((mp_ubyte*)channel.sample); channel.flags = chn->timeRecord[j].flags; channel.smppos = chn->timeRecord[j].smppos % channel.smplen; channel.smpposfrac = chn->timeRecord[j].smpposfrac; channel.smpadd = chn->timeRecord[j].smpadd; channel.loopend = channel.loopendcopy = chn->timeRecord[j].loopend % (channel.smplen+1); channel.loopstart = chn->timeRecord[j].loopstart % (channel.smplen+1); if (channel.loopstart >= channel.loopend) channel.flags &= ~3; channel.vol = chn->timeRecord[j].volPan & 0xFFFF; channel.pan = chn->timeRecord[j].volPan >> 16; channel.fixedtimefrac = chn->timeRecord[j].fixedtimefrac; channel.cutoff = ChannelMixer::MP_INVALID_VALUE; channel.resonance = ChannelMixer::MP_INVALID_VALUE; // channel.index = chnIndex; Uncomment this if you like crackly audio // The scopes (which I assume is what this function is for) are currently // using channel 33, to avoid interfering with playback channel.smpadd = (channel.smpadd*fMul) / (!count ? 1 : count); chn = &channel; if (mixerDataCache && channel.smpadd <= 65536) { memset(mixerDataCache, 0, count*2*sizeof(mp_sint32)); channel.rsmpadd = (mp_sint32)((1.0 / channel.smpadd) * 65536.0); // we only need the left channel as no panning is involved channel.finalvoll = (channel.vol*128*256)<<6; channel.finalvolr = 0; channel.rampFromVolStepL = channel.rampFromVolStepR = 0; player->getCurrentResampler()->addChannel(chn, mixerDataCache, count, count); for (mp_sint32 i = 0; i < count; i++) fetcher.fetchSampleData(mixerDataCache[i*2]); } else { pp_int32 vol = chn->vol; mp_sint32 y; FULLMIXER_TEMPLATE(FULLMIXER_8BIT_NORMAL_TEMP, FULLMIXER_16BIT_NORMAL_TEMP, 16, 0); } } else { resort: for (mp_sint32 i = 0; i < count; i++) fetcher.fetchSampleData(0); } } bool PlayerController::hasSampleData(mp_uint32 chnIndex) { if (!player) return false; ChannelMixer* mixer = player; ChannelMixer::TMixerChannel* chn = &mixer->channel[chnIndex]; pp_int32 j = getCurrentBeatIndex(); return ((chn->timeRecord[j].flags & ChannelMixer::MP_SAMPLE_PLAY) && (chn->timeRecord[j].volPan & 0xFFFF)); } milkytracker-0.90.85+dfsg/src/tracker/TrackerUpdate.cpp0000644000175000017500000010047111150223367022112 0ustar admin2admin2/* * tracker/TrackerUpdate.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Tracker.h" #include "TabManager.h" #include "TrackerConfig.h" #include "PlayerController.h" #include "PlayerMaster.h" #include "ModuleEditor.h" #include "ModuleServices.h" #include "TabTitleProvider.h" #include "EnvelopeEditor.h" #include "PatternTools.h" #include "PPUIConfig.h" #include "Container.h" #include "ListBox.h" #include "StaticText.h" #include "PatternEditorControl.h" #include "EnvelopeEditorControl.h" #include "PianoControl.h" #include "PeakLevelControl.h" #include "ScopesControl.h" #include "SampleEditorControl.h" #include "TrackerSettingsDatabase.h" #include "SectionInstruments.h" #include "SectionSamples.h" #include "SectionHDRecorder.h" #include "SectionQuickOptions.h" #include "TabHeaderControl.h" #include "PPOpenPanel.h" #include "TitlePageManager.h" #include "ControlIDs.h" void Tracker::updateAboutToggleButton(pp_int32 id, bool b, bool repaint/* = true*/) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_ABOUT)); ASSERT(container); PPButton* button = static_cast(container->getControlByID(id)); if (button == NULL) return; button->setPressed(b); if (repaint) screen->paintControl(button); } bool Tracker::updatePianoControl(PianoControl* pianoControl) { if (!pianoControl) return false; if (!pianoControl->isVisible()) return false; pp_int32 ins = listBoxInstruments->getSelectedIndex() + 1; pp_int32 i; bool tab[ModuleEditor::MAX_NOTE]; for (i = 0; i < ModuleEditor::MAX_NOTE; i++) { tab[i] = pianoControl->getNoteState(i); pianoControl->pressNote(i, false); } for (i = 0; i < playerController->getPlayerNumPlayingChannels(); i++) { pp_int32 note; bool muted = false; if (playerController->isNotePlaying(ins, i, note, muted)) pianoControl->pressNote(note - 1, true, muted); } bool update = false; for (i = 0; i < ModuleEditor::MAX_NOTE; i++) { if (pianoControl->getNoteState(i) != tab[i]) { update = true; break; } } if (update) screen->paintControl(pianoControl, false); return update; } bool Tracker::updatePeakLevelControl() { const pp_int32 maxPeakThreshold = 32700*2; if (!peakLevelControl) return false; if (!peakLevelControl->isVisible()) return false; bool bUpdateL = false; bool bUpdateR = false; bool bUpdateEntire = false; pp_int32 left, right; playerMaster->getCurrentSamplePeak(left, right); // Left channel pp_int32 oldPeak = peakLevelControl->getPeak(0); pp_int32 newPeak = left << 1; if (newPeak >= maxPeakThreshold) { TitlePageManager titlePageManager(*screen); titlePageManager.setPeakControlHeadingColor(TrackerConfig::colorRecordModeButtonText, false); bUpdateEntire = true; } if (newPeak < oldPeak) { newPeak = oldPeak; newPeak -= 2048; if (newPeak < 0) newPeak = 0; } if (oldPeak != newPeak) { peakLevelControl->setPeak(0, newPeak); bUpdateL = true; } // Right channel oldPeak = peakLevelControl->getPeak(1); newPeak = right << 1; if (newPeak >= maxPeakThreshold) { TitlePageManager titlePageManager(*screen); titlePageManager.setPeakControlHeadingColor(TrackerConfig::colorRecordModeButtonText, false); bUpdateEntire = true; } if (newPeak < oldPeak) { newPeak = oldPeak; newPeak -= 2048; if (newPeak < 0) newPeak = 0; } if (oldPeak != newPeak) { peakLevelControl->setPeak(1, newPeak); bUpdateR = true; } if (bUpdateEntire) { screen->paintControl(screen->getControlByID(CONTAINER_ABOUT), false); return true; } else if (bUpdateL || bUpdateR) { screen->paintControl(peakLevelControl, false); return true; } return false; } bool Tracker::updatePlayTime() { if (!playTimeText) return false; if (!playTimeText->isVisible()) return false; PPContainer* container = static_cast(screen->getControlByID(CONTAINER_ABOUT)); char buffer[100], buffer2[100]; pp_int32 playtime = (pp_int32)playerController->getPlayTime(); if (!playerController->isPlaying()) playtime = 0; pp_int32 seconds = playtime % 60; pp_int32 minutes = (playtime / 60) % 60; pp_int32 hours = (playtime / 3600) % 100; sprintf(buffer,"%02i:%02i:%02i", hours, minutes, seconds); playtime = moduleEditor->getModuleServices()->getEstimatedSongLength(); if (playtime == -1) { // strcpy(buffer2,"(--:--:--)"); // believe it or not, the VC 6.0 compiler // fucks up the above strcpy, now providing some awesome workaround ;) buffer2[0] = '('; buffer2[1] = '-'; buffer2[2] = '-'; buffer2[3] = ':'; buffer2[4] = '-'; buffer2[5] = '-'; buffer2[6] = ':'; buffer2[7] = '-'; buffer2[8] = '-'; buffer2[9] = ')'; buffer2[10] = 0; } else { pp_int32 seconds = playtime % 60; pp_int32 minutes = (playtime / 60) % 60; pp_int32 hours = (playtime / 3600) % 100; sprintf(buffer2,"(%02i:%02i:%02i)", hours, minutes, seconds); } strcat(buffer, buffer2); if (strcmp(playTimeText->getText(), buffer) != 0) { playTimeText->setText(buffer); screen->paintControl(container, false); return true; } return false; } /////////////////////////////////////////// // update song title /////////////////////////////////////////// void Tracker::updateSongTitle(bool repaint) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_ABOUT)); PPListBox* listBox = static_cast(container->getControlByID(LISTBOX_SONGTITLE)); listBox->clear(); char str[MP_MAXTEXT+1]; moduleEditor->getTitle(str, ModuleEditor::MAX_TITLETEXT); listBox->addItem(str); listBox->setMaxEditSize(ModuleEditor::MAX_TITLETEXT); screen->paintControl(container, repaint); } #ifdef __LOWRES__ void Tracker::updateJamMenuOrder(bool repaint/* = true*/) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_LOWRES_JAMMENU)); PPStaticText* staticText = static_cast(container->getControlByID(STATICTEXT_JAMMENU_CURORDER)); staticText->setHexValue(getOrderListBoxIndex(), 2); if (container->isVisible()) screen->paintControl(container, repaint); } #endif void Tracker::updateOrderlist(bool repaint/* = true*/) { // First of all: update orderlist (something might have been removed/added) updateSongLength(false); // Now update patterns moduleEditor->setCurrentPatternIndex(moduleEditor->getOrderPosition(getOrderListBoxIndex())); moduleEditor->setCurrentOrderIndex(getOrderListBoxIndex()); updatePattern(false); if (repaint) screen->update(); } /////////////////////////////////////////// // update song length field + orderlist /////////////////////////////////////////// void Tracker::updateSongLength(bool repaint) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_ORDERLIST)); static_cast(container->getControlByID(STATICTEXT_ORDERLIST_SONGLENGTH))->setHexValue(moduleEditor->getNumOrders(), 2); listBoxOrderList->setShowIndex(true); listBoxOrderList->setIndexBaseCount(0); listBoxOrderList->saveState(); bool update = true; if (listBoxOrderList->getNumItems() != moduleEditor->getNumOrders()) { listBoxOrderList->clear(); update = false; } for (pp_int32 i = 0; i < moduleEditor->getNumOrders(); i++) { char orderlistEntry[4]; PatternTools::convertToHex(orderlistEntry, moduleEditor->getOrderPosition(i), 2); if (update) listBoxOrderList->updateItem(i, orderlistEntry); else listBoxOrderList->addItem(orderlistEntry); } if (!update) { listBoxOrderList->restoreState(); listBoxOrderList->setSelectedIndex(moduleEditor->getCurrentOrderIndex()); } screen->paintControl(container, repaint); } /////////////////////////////////////////// // update song restart position field /////////////////////////////////////////// void Tracker::updateSongRepeat(bool repaint) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_ORDERLIST)); static_cast(container->getControlByID(STATICTEXT_ORDERLIST_REPEAT))->setHexValue(moduleEditor->getRepeatPos(), 2); screen->paintControl(container, repaint); } /////////////////////////////////////////// // update speed field /////////////////////////////////////////// bool Tracker::updateSpeed(bool repaint) { mp_sint32 speed, bpm, mainvol; playerController->getSpeed(bpm, speed); mainvol = playerController->getSongMainVolume(); if (bpm != lastBPM || lastSpeed != speed || lastMainVol != mainvol) { lastBPM = bpm; lastSpeed = speed; lastMainVol = mainvol; PPContainer* container = static_cast(screen->getControlByID(CONTAINER_SPEED)); static_cast(container->getControlByID(STATICTEXT_SPEED_SPEED))->setIntValue(speed, 2); static_cast(container->getControlByID(STATICTEXT_SPEED_BPM))->setIntValue(bpm, 3); static_cast(container->getControlByID(STATICTEXT_SPEED_MAINVOL))->setHexValue((mainvol*64)/255, 2); screen->paintControl(container, repaint); return true; } return false; } /////////////////////////////////////////// // update pattern add field /////////////////////////////////////////// void Tracker::updatePatternAddAndOctave(bool repaint) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_SPEED)); pp_int32 currentPatternAdd = getPatternEditorControl()->getRowInsertAdd(); static_cast(container->getControlByID(STATICTEXT_SPEED_PATTERNADD))->setIntValue(currentPatternAdd, 2); pp_int32 currentOctave = getPatternEditor()->getCurrentOctave(); static_cast(container->getControlByID(STATICTEXT_SPEED_OCTAVE))->setIntValue(currentOctave-1, 2); screen->paintControl(container, repaint); } /////////////////////////////////////////// // update current pattern index /////////////////////////////////////////// void Tracker::updatePatternIndex(bool repaint) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_PATTERN)); static_cast(container->getControlByID(STATICTEXT_PATTERN_INDEX))->setHexValue(moduleEditor->getCurrentPatternIndex(), 2); #ifdef __LOWRES__ { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_LOWRES_JAMMENU)); PPStaticText* staticText = static_cast(container->getControlByID(STATICTEXT_JAMMENU_CURPATTERN)); staticText->setHexValue(moduleEditor->getCurrentPatternIndex(), 2); if (container->isVisible()) screen->paintControl(container, repaint); } #endif screen->paintControl(container, repaint); } /////////////////////////////////////////// // update current pattern's length /////////////////////////////////////////// void Tracker::updatePatternLength(bool repaint) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_PATTERN)); static_cast(container->getControlByID(STATICTEXT_PATTERN_LENGTH))->setHexValue(getPatternEditor()->getNumRows(),3); screen->paintControl(container, repaint); } /////////////////////////////////////////// // update pattern and it's length and index /////////////////////////////////////////// void Tracker::updatePattern(bool repaint) { updatePatternEditorControl(false); updatePatternIndex(false); updatePatternLength(false); if (repaint) screen->update(); } /////////////////////////////////////////// // update samples listbox /////////////////////////////////////////// void Tracker::updateSamplesListBox(bool repaint) { listBoxSamples->saveState(); listBoxSamples->clear(); fillSampleListBox(listBoxSamples, listBoxInstruments->getSelectedIndex()); listBoxSamples->restoreState(); // check for visibility of parent container before updating if (static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST))->isVisible()) screen->paintControl(listBoxSamples, repaint); #ifdef __LOWRES__ { pp_int32 i = listBoxInstruments->getSelectedIndex(); PPContainer* container = static_cast(screen->getControlByID(CONTAINER_LOWRES_JAMMENU)); PPStaticText* staticText = static_cast(container->getControlByID(STATICTEXT_JAMMENU_CURINSTRUMENT)); staticText->setHexValue(i+1, 2); if (container->isVisible()) screen->paintControl(container, repaint); container = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); staticText = static_cast(container->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER2)); staticText->setHexValue(i+1, 2); if (container->isVisible()) screen->paintControl(container, repaint); } #endif } /////////////////////////////////////////// // update instruments listbox /////////////////////////////////////////// void Tracker::updateInstrumentsListBox(bool repaint) { listBoxInstruments->saveState(); listBoxInstruments->clear(); fillInstrumentListBox(listBoxInstruments); listBoxInstruments->restoreState(); // check for visibility of parent container before updating if (!static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST))->isVisible()) return; screen->paintControl(listBoxInstruments, repaint); } /////////////////////////////////////////// // update pattern editor /////////////////////////////////////////// void Tracker::updatePatternEditorControl(/*TXMPattern* pattern, */bool repaint/* = true*/, bool fast/* = false*/) { PatternEditorControl* patternEditorCtrl = getPatternEditorControl(); moduleEditor->reloadCurrentPattern(); TXMPattern* pattern = getPatternEditor()->getPattern(); if (pattern) { if (isEditingCurrentOrderlistPattern()) patternEditorCtrl->setOrderlistIndex(getOrderListBoxIndex()); else patternEditorCtrl->setOrderlistIndex(-1); //patternEditorCtrl->attachPattern(pattern, moduleEditor->getModule()); } if (!fast) screen->paintControl(patternEditorCtrl, repaint); } /////////////////////////////////////////// // update instrument editor /////////////////////////////////////////// void Tracker::updateSampleEditor(bool repaint, bool force) { sectionSamples->realUpdate(repaint, force, true); } void Tracker::updateSampleEditorAndInstrumentSection(bool repaint/* = true*/) { // update instrument/sample editor // important: sample editor first => will reload sample into sample editor updateSampleEditor(repaint); sectionInstruments->update(repaint); } void Tracker::updateSongInfo(bool repaint/* = true*/) { updateSongTitle(repaint); updateSongLength(repaint); updateSongRepeat(repaint); //updateBPM(repaint); updateSpeed(repaint); updatePatternAddAndOctave(repaint); updatePatternIndex(repaint); updatePatternLength(repaint); updateInstrumentsListBox(repaint); updateSamplesListBox(repaint); getPatternEditorControl()->reset(); getPatternEditorControl()->unmuteAll(); sectionInstruments->resetEnvelopeEditor(); sectionInstruments->updateEnvelopeEditor(false, true); sectionInstruments->resetPianoAssignment(); sectionSamples->resetSampleEditor(); setNumChannels(moduleEditor->getNumChannels(), false); updatePatternEditorControl(repaint); updateSampleEditorAndInstrumentSection(repaint); updateWindowTitle(moduleEditor->getModuleFileName()); if (repaint) screen->update(); } void Tracker::updateInstrumentChooser(bool repaint/* = true*/) { pp_int32 j; PPContainer* container = static_cast(screen->getModalControl()); PPListBox* listBoxSrc = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC)); PPListBox* listBoxSrcModule = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC3)); PPListBox* listBoxDst = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST)); PPListBox* listBoxDstModule = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST3)); ModuleEditor* src = listBoxSrcModule ? tabManager->getModuleEditorFromTabIndex(listBoxSrcModule->getSelectedIndex()) : this->moduleEditor; ModuleEditor* dst = listBoxDstModule ? tabManager->getModuleEditorFromTabIndex(listBoxDstModule->getSelectedIndex()) : this->moduleEditor; listBoxSrc->saveState(); listBoxSrc->clear(); fillInstrumentListBox(listBoxSrc, src); listBoxSrc->restoreState(); listBoxDst->saveState(); listBoxDst->clear(); fillInstrumentListBox(listBoxDst, dst); listBoxDst->restoreState(); mp_sint32 srcInsIndex = listBoxSrc->getSelectedIndex(); mp_sint32 dstInsIndex = listBoxDst->getSelectedIndex(); listBoxSrc = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC2)); listBoxDst = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST2)); listBoxSrc->saveState(); listBoxSrc->clear(); fillSampleListBox(listBoxSrc, srcInsIndex, src); listBoxSrc->restoreState(); listBoxDst->saveState(); listBoxDst->clear(); fillSampleListBox(listBoxDst, dstInsIndex, dst); listBoxDst->restoreState(); if (repaint) screen->update(); } void Tracker::updateTabTitle() { TabHeaderControl* tabHeader = static_cast(screen->getControlByID(TABHEADER_CONTROL)); if (tabHeader != NULL) { TabTitleProvider tabTitleProvider(*moduleEditor); PPString tabTitle = tabTitleProvider.getTabTitle(); if (moduleEditor->hasChanged()) tabTitle.append("*"); bool refresh = false; for (pp_int32 i = 0; i < (signed)tabHeader->getNumTabs(); i++) { if (tabManager->getModuleEditorFromTabIndex(i) == this->moduleEditor) { if (tabHeader->getTab(i)->text.compareTo(tabTitle) != 0) { tabHeader->setTabHeaderText(i, tabTitle); refresh = true; } } } if (refresh) screen->paintControl(tabHeader); } } void Tracker::updateWindowTitle() { if (moduleEditor->hasChanged() != lastState) { PPSystemString title = "MilkyTracker - "; title.append(currentFileName); if (moduleEditor->hasChanged()) title.append(" (modified)"); screen->setTitle(title); updateTabTitle(); lastState = moduleEditor->hasChanged(); } } void Tracker::updateWindowTitle(const PPSystemString& fileName) { lastState = !moduleEditor->hasChanged(); currentFileName = fileName.stripPath(); updateWindowTitle(); } bool Tracker::updateSongPosition(pp_int32 pos/* = -1*/, pp_int32 row/* = -1*/, bool fast/* = false*/) { mp_sint32 thePos, theRow; playerController->getPosition(thePos, theRow); #if 0 static int counter = 0; if (thePos == 0 && theRow == 63 && (theRow != lastRow || thePos != lastPos)) counter++; if (counter == 2) { int i = 0; i++; i--; } #endif if (pos == -1) pos = thePos; if (row == -1) row = theRow; bool redraw = false; // I'm now trying to understand what happens here ------> // When the current row is different from the last row // or the current order position is different from the last one // we're doing some screen refreshing if (row != lastRow || pos != lastPos) { // if we're not playing a single pattern, we're most likely playing the entire song // and in that case if we're instructed to follow the song while playing we're doing some // order list position updates and stuff ------> if (!playerController->isPlayingPattern() && shouldFollowSong()) { // if the current order list index is different from the current // order list position from the player UPDATE ------> if (getOrderListBoxIndex() != pos) { listBoxOrderList->setSelectedIndex(pos, false); moduleEditor->setCurrentOrderIndex(pos); // in low res mode we also need to update // the order position in the "Jam"-section #ifdef __LOWRES__ if (!fast) updateJamMenuOrder(false); #endif // now tell the module editor that we're editing another pattern moduleEditor->setCurrentPatternIndex(moduleEditor->getOrderPosition(pos)); // update pattern editor with current order list pattern // but don't redraw/update, just get it from the module editor and attach it to the pattern editor updatePatternEditorControl(false, true); } if (!fast) { // update pattern property fields updateSongLength(false); updatePatternIndex(false); updatePatternLength(false); } // only follow song if the pattern index matches the one from the // order list, otherwise the user has probably selected a different // pattern while playing takes place if (moduleEditor->getCurrentPatternIndex() == moduleEditor->getOrderPosition(pos)) { // song positon is only used in non-follow mode getPatternEditorControl()->setSongPosition(-1, -1); // but we should probably update the current row in the pattern editor as well // as long as the user is not currently dragging the scroll bars in the sample editor getPatternEditorControl()->setRow(row, fast ? false : !getPatternEditorControl()->isDraggingVertical()); } } else if (playerController->isPlayingPattern() && !shouldFollowSong()) { // we're playing the current pattern and don't follow the song // just update the current playing row in the pattern editor if (playerController->isPlayingPattern(moduleEditor->getCurrentPatternIndex())) getPatternEditorControl()->setSongPosition(-1, row); // we're playing a pattern different from the one in the editor // don't show any positions else getPatternEditorControl()->setSongPosition(-1, -1); } else if (playerController->isPlayingPattern() && shouldFollowSong()) { getPatternEditorControl()->setSongPosition(-1, -1); getPatternEditorControl()->setRow(row, fast ? false : !getPatternEditorControl()->isDraggingVertical()); } else { getPatternEditorControl()->setSongPosition(pos, row); } updatePatternEditorControl(false, fast); redraw = true; lastRow = row; lastPos = pos; } if (!fast) return updateSpeed(false) || redraw; else return redraw; } void Tracker::updateRecordButton(PPContainer* container, const PPColor& pColor) { ASSERT(container); // now if the parent container is visible, // we're going to update the record button if (container->isVisible()) { // get button from container PPButton* button = static_cast(container->getControlByID(MAINMENU_EDIT)); ASSERT(button); // if it's visible and the color is not what we're going to set // set new text color and repaint if (button->isVisible() && (&pColor) != button->getTextColor()) { button->setTextColor(pColor); screen->paintControl(button); } } } void Tracker::doFollowSong() { // check if we need to update the record button // this is done periodically and only in MilkyTracker mode if (editMode == EditModeMilkyTracker) { // If the pattern editor has got the focus // we're in record mode, so get the record button text color const PPColor& pColor = getPatternEditorControl()->gotFocus() ? TrackerConfig::colorRecordModeButtonText : PPUIConfig::getInstance()->getColor(PPUIConfig::ColorDefaultButtonText); // we're going to update the record button updateRecordButton(static_cast(screen->getControlByID(CONTAINER_MENU)), pColor); #ifdef __LOWRES__ // in low-res mode, the record buttons appears // also in some other containers (e.g. TINYMENU) ... updateRecordButton(static_cast(screen->getControlByID(CONTAINER_LOWRES_TINYMENU)), pColor); // ... also the JAMMENU updateRecordButton(static_cast(screen->getControlByID(CONTAINER_LOWRES_JAMMENU)), pColor); #endif } // check if the piano has been updated bool updatePiano = updatePianoControl(sectionInstruments->getPianoControl()); // check if the play time has been updated bool updatePlayTime = this->updatePlayTime(); #ifdef __LOWRES__ // in low-res mode a piano might be embedded into other containers as well // => check for updates if (inputContainerCurrent->isVisible()) { PianoControl* pianoControl = static_cast(inputContainerCurrent->getControlByID(PIANO_CONTROL)); updatePiano |= updatePianoControl(pianoControl); } else if (screen->getControlByID(CONTAINER_LOWRES_JAMMENU)->isVisible()) { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_LOWRES_JAMMENU)); PianoControl* pianoControl = static_cast(container->getControlByID(PIANO_CONTROL)); updatePiano |= updatePianoControl(pianoControl); } #endif bool importantRefresh = false; // now for updating the sample editor control SampleEditorControl* sampleEditorControl = sectionSamples->getSampleEditorControl(false); if (sampleEditorControl) { bool showMarksVisibleOld = sampleEditorControl->isVisible() ? sampleEditorControl->showMarksVisible() : false; bool updateSample = false; TXMSample* smp = getSampleEditor()->getSample(); for (pp_int32 i = 0; i < playerController->getAllNumPlayingChannels(); i++) { pp_int32 pos, vol, pan; if (playerController->isSamplePlaying(*smp, i, pos, vol, pan)) { // it is there // => set the position mark sampleEditorControl->setShowMark(i, pos, vol, pan); updateSample = true; } else { // it is not there // => clear the position mark if (sampleEditorControl->getShowMarkPos(i) != -1) { sampleEditorControl->setShowMark(i, -1, 0); updateSample = true; } } } if (updateSample && sampleEditorControl->isVisible()) { bool showMarksVisible = sampleEditorControl->showMarksVisible(); // if either show marks HAVE BEEN visible and they're no longer visble OR // no show marks have been visible and now they're some visible // => redraw if (showMarksVisible || showMarksVisibleOld) { sectionSamples->updateSampleWindow(false); importantRefresh = true; } } } if (sectionInstruments->isEnvelopeVisible()) { EnvelopeEditorControl* eeCtrl = sectionInstruments->getEnvelopeEditorControl(); bool redrawEnvelopeEditor = false; if (eeCtrl->hasShowMarks()) { eeCtrl->clearShowMarks(); redrawEnvelopeEditor = true; } EnvelopeEditor* ee = getEnvelopeEditor(); for (pp_int32 i = 0; i < playerController->getPlayerNumPlayingChannels(); i++) { pp_int32 pos; if (playerController->isEnvelopePlaying(*ee->getEnvelope(), sectionInstruments->getVisibleEnvelopeType(), i, pos)) { eeCtrl->setShowMark(i, pos); if (pos != -1) redrawEnvelopeEditor = true; } } if (redrawEnvelopeEditor) { sectionInstruments->updateEnvelopeWindow(false); importantRefresh = true; } } if (playerController->isPlaying() && !playerController->isPlayingRowOnly()/* && getFollowSong()*/) { importantRefresh |= updateSongPosition(); } bool updatePeak = updatePeakLevelControl(); bool updateScopes = false; if (scopesControl && scopesControl->isVisible()) { updateScopes = scopesControl->needsUpdate(); if (updateScopes && !updatePiano && !importantRefresh && !updatePlayTime && !updatePeak) { screen->paintControl(scopesControl); return; } else if (updateScopes) screen->paintControl(scopesControl, false); } importantRefresh |= updatePiano; if (!importantRefresh) { if (updatePeak || updatePlayTime) { screen->updateControl(screen->getControlByID(CONTAINER_ABOUT)); } if (updateScopes) { screen->updateControl(scopesControl); } } else { screen->update(); } } void Tracker::updateAfterLoad(bool loadResult, bool wasPlaying, bool wasPlayingPattern) { ASSERT(settingsDatabase->restore("AUTOESTPLAYTIME")); if (loadResult && settingsDatabase->restore("AUTOESTPLAYTIME")->getIntValue()) estimateSongLength(); else moduleEditor->getModuleServices()->resetEstimatedSongLength(); // special updates listBoxOrderList->setSelectedIndex(0); moduleEditor->setCurrentOrderIndex(0); moduleEditor->setCurrentPatternIndex(moduleEditor->getOrderPosition(0)); listBoxInstruments->setSelectedIndex(0); moduleEditor->setCurrentInstrumentIndex(0); listBoxSamples->setSelectedIndex(0); moduleEditor->setCurrentSampleIndex(0); updateSongInfo(false); playerController->resetMainVolume(); getPatternEditorControl()->setChannel(0,0); getPatternEditorControl()->setCurrentInstrument(1); if (wasPlaying) { if (!wasPlayingPattern && shouldFollowSong()) { getPatternEditorControl()->setSongPosition(-1, -1); getPatternEditorControl()->setRow(0); } else if (wasPlayingPattern && !shouldFollowSong()) { getPatternEditorControl()->setSongPosition(-1, 0); } else if (wasPlayingPattern && shouldFollowSong()) { getPatternEditorControl()->setSongPosition(-1, -1); getPatternEditorControl()->setRow(0); } } else { getPatternEditorControl()->setSongPosition(-1, -1); getPatternEditorControl()->setRow(0); } if (loadResult) { playerController->resetPlayTimeCounter(); sectionHDRecorder->resetCurrentFileName(); sectionHDRecorder->adjustOrders(); updateWindowTitle(moduleEditor->getModuleFileName()); // !!! Remember this !!! // It's important to apply new speed settings before the playmode is switched playerController->setSpeed(moduleEditor->getSongBPM(), moduleEditor->getSongTickSpeed()); if (!sectionQuickOptions->keepSettings()) { switch (moduleEditor->getSaveType()) { case ModuleEditor::ModSaveTypeMOD: if (moduleEditor->getNumChannels() == 4) playerController->switchPlayMode(PlayerController::PlayMode_ProTracker2); else playerController->switchPlayMode(PlayerController::PlayMode_ProTracker3); break; case ModuleEditor::ModSaveTypeXM: playerController->switchPlayMode(PlayerController::PlayMode_FastTracker2); break; default: ASSERT(false); } } if (wasPlaying && !wasPlayingPattern) { playerController->restartPlaying(); } else if (wasPlaying && wasPlayingPattern) { eventKeyDownBinding_Stop(); eventKeyDownBinding_PlayPattern(); } } updateSongInfo(false); } void Tracker::updateAfterTabSwitch() { pp_int32 i; getPatternEditorControl()->attachPatternEditor(moduleEditor->getPatternEditor()); sectionSamples->getSampleEditorControl(false)->attachSampleEditor(moduleEditor->getSampleEditor()); sectionInstruments->getEnvelopeEditorControl()->attachEnvelopeEditor(moduleEditor->getEnvelopeEditor()); // ----------------------------------------------------------------------- sectionHDRecorder->resetCurrentFileName(); sectionHDRecorder->adjustOrders(); updateSongTitle(false); updateSongLength(false); updateSongRepeat(false); updateSpeed(false); updatePatternAddAndOctave(false); updatePatternIndex(false); updatePatternLength(false); updateInstrumentsListBox(false); updateSamplesListBox(false); // ----------------------------------------------------------------------- // restore old positions listBoxInstruments->setSelectedIndex(moduleEditor->getCurrentInstrumentIndex(), false); listBoxSamples->setSelectedIndex(moduleEditor->getCurrentSampleIndex(), false); if (!playerController->isPlaying()) { listBoxOrderList->setSelectedIndex(moduleEditor->getCurrentOrderIndex()); updatePatternEditorControl(false, true); getPatternEditor()->setCursor(moduleEditor->getCurrentCursorPosition()); } getPatternEditorControl()->setSize(PPSize(screen->getWidth(),MAXEDITORHEIGHT()-UPPERSECTIONDEFAULTHEIGHT())); // let tabs handle their own update for (i = 0; i < sections->size(); i++) sections->get(i)->notifyTabSwitch(); setNumChannels(moduleEditor->getNumChannels(), false); scopesControl->attachSource(playerController); updateSampleEditorAndInstrumentSection(false); updateWindowTitle(moduleEditor->getModuleFileName()); // apply muting from playercontroller const pp_int32 numChannels = TrackerConfig::numPlayerChannels; for (i = 0; i < numChannels; i++) { bool b = playerController->isChannelMuted(i); muteChannels[i] = b ? 1 : 0; getPatternEditorControl()->muteChannel(i, b); scopesControl->muteChannel(i, b); b = playerController->isChannelRecording(i); scopesControl->recordChannel(i, b); } if (playerController->isPlaying()) { screen->pauseUpdate(true); doFollowSong(); screen->pauseUpdate(false); } screen->paint(true); } milkytracker-0.90.85+dfsg/src/tracker/PatternEditorControl.h0000644000175000017500000004006711150223367023152 0ustar admin2admin2/* * tracker/PatternEditorControl.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ ///////////////////////////////////////////////////////////////// // // PatternEditorTools control class // ///////////////////////////////////////////////////////////////// #ifndef PATTERNEDITORCONTROL__H #define PATTERNEDITORCONTROL__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" #include "PatternEditor.h" #include "ScrollBar.h" #include "PatternTools.h" #include "EditModes.h" #include "TrackerConfig.h" // Forwards ------------------------------------------------------ class PPScrollbar; class PPFont; class PPContextMenu; class PPDialogBase; class PatternEditorControl; typedef void (PatternEditorControl::*TPatternEditorKeyBindingHandler)(); typedef pp_int32 (PatternEditor::*TTransposeFunc)(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate); template class PPKeyBindings; class PatternEditorControl : public PPControl, public EventListenerInterface, public EditorBase::EditorNotificationListener, public PatternEditor::PatternAdvanceInterface { private: struct SongPos { pp_int32 orderListIndex, row; }; struct UndoInfo { pp_int32 startIndex; pp_int32 startPos; UndoInfo() { } UndoInfo(pp_int32 startIndex, pp_int32 startPos) : startIndex(startIndex), startPos(startPos) { } } undoInfo; PPColor bgColor; const PPColor* borderColor; const PPColor* cursorColor; const PPColor* selectionColor; bool border; struct Properties { bool showFocus; bool rowAdvance; pp_int32 rowInsertAdd; pp_uint32 spacing, highlightSpacingPrimary, highlightSpacingSecondary; bool highLightRowPrimary, highLightRowSecondary; bool hexCount; bool wrapAround; bool prospective; bool tabToNote; bool clickToCursor; bool multiChannelEdit; ScrollModes scrollMode; pp_uint32 muteFade; char zeroEffectCharacter; Properties() : showFocus(true), rowAdvance(true), rowInsertAdd(1), spacing(0), highlightSpacingPrimary(4), highlightSpacingSecondary(8), highLightRowPrimary(false), highLightRowSecondary(false), hexCount(true), wrapAround(true), prospective(false), tabToNote(true), clickToCursor(true), multiChannelEdit(false), scrollMode(ScrollModeToEnd), muteFade(32768), zeroEffectCharacter('\xf4') { } } properties; PPFont* font; PPScrollbar* hTopScrollbar; PPScrollbar* hBottomScrollbar; PPScrollbar* vLeftScrollbar; PPScrollbar* vRightScrollbar; PPControl* caughtControl; bool controlCaughtByLMouseButton, controlCaughtByRMouseButton; PatternEditor* patternEditor; XModule* module; TXMPattern* pattern; pp_int32 currentOrderlistIndex; SongPos songPos; PatternTools patternTools; pp_int32 startIndex; pp_int32 startPos; pp_int32 visibleWidth; pp_int32 visibleHeight; pp_int32 slotSize; pp_uint8 muteChannels[TrackerConfig::MAXCHANNELS]; pp_uint8 recChannels[TrackerConfig::MAXCHANNELS]; // Cursor position within editor pp_int32 cursorPositions[9]; pp_int32 cursorSizes[8]; PatternEditorTools::Position cursorCopy, preCursor, *ppreCursor; bool startSelection; bool keyboardStartSelection; bool assureUpdate, assureCursor; pp_int32 selectionTicker; bool hasDragged; // edit menu pp_int32 menuPosX; pp_int32 menuPosXOffset; pp_int32 menuPosY; pp_int32 menuInvokeChannel; pp_int32 lastMenuInvokeChannel; PPContextMenu* editMenuControl; // Keyboard shortcuts PPKeyBindings* eventKeyDownBindings; PPKeyBindings* scanCodeBindings; PPKeyBindings* eventKeyDownBindingsMilkyTracker; PPKeyBindings* scanCodeBindingsMilkyTracker; PPKeyBindings* eventKeyDownBindingsFastTracker; PPKeyBindings* scanCodeBindingsFastTracker; // Edit mode EditModes editMode; pp_int32 selectionKeyModifier; public: PatternEditorControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true); virtual ~PatternEditorControl(); void setColor(PPColor color) { bgColor = color; } void setFont(PPFont* font); void setShowFocus(bool showFocus) { properties.showFocus = showFocus; } void setScrollMode(ScrollModes mode) { properties.scrollMode = mode; adjustScrollBarPositionsAndSizes(); assureCursorVisible(); } // from PPControl virtual void setSize(const PPSize& size); virtual void setLocation(const PPPoint& location); virtual void paint(PPGraphicsAbstract* graphics); virtual bool gainsFocus() const { return true; } virtual bool gainedFocusByMouse() const { return caughtControl == NULL; } virtual pp_int32 dispatchEvent(PPEvent* event); // from EventListenerInterface pp_int32 handleEvent(PPObject* sender, PPEvent* event); void attachPatternEditor(PatternEditor* patternEditor); void reset(); bool isDraggingVertical() const { return (caughtControl == vLeftScrollbar) || (caughtControl == vRightScrollbar); } // set number of visible channels, if this is -1 it will dynamically adjust it void setNumVisibleChannels(pp_int32 numChannels); pp_int32 getRowInsertAdd() { return properties.rowInsertAdd; } void setRowInsertAdd(pp_int32 rowInsertAdd) { properties.rowInsertAdd = rowInsertAdd; } void increaseRowInsertAdd() { properties.rowInsertAdd = (properties.rowInsertAdd+1) % 17; } void decreaseRowInsertAdd() { properties.rowInsertAdd--; if (properties.rowInsertAdd == -1) properties.rowInsertAdd = 16; } void setOrderlistIndex(pp_int32 currentOrderlistIndex) { this->currentOrderlistIndex = currentOrderlistIndex; } void setRow(pp_int32 row, bool bAssureCursorVisible = true); pp_int32 getRow() { return patternEditor->getCursor().row; } void setSongPosition(pp_int32 currentOrderlistIndex, pp_int32 row) { songPos.row = row; songPos.orderListIndex = currentOrderlistIndex; } void getSongPosition(pp_int32& currentOrderlistIndex, pp_int32& row) { row = songPos.row; currentOrderlistIndex = songPos.orderListIndex; } void setChannel(pp_int32 chn, pp_int32 posInner); pp_int32 getCurrentChannel() const { return patternEditor->getCursor().channel; } pp_int32 getCurrentRow() const { return patternEditor->getCursor().row; } pp_int32 getCursorPosInner() const { return patternEditor->getCursor().inner; } pp_int32 ScanCodeToNote(pp_int16 keyCode); void setCurrentInstrument(pp_int32 ins) { patternEditor->setCurrentInstrument(ins); } void enableInstrument(bool b) { patternEditor->enableInstrument(b); } bool isInstrumentEnabled() const { return patternEditor->isInstrumentEnabled(); } void setInstrumentBackTrace(bool b) { patternEditor->setInstrumentBackTrace(b); } bool hasValidSelection() const; ////////////////////////////////////////////////////////////////////////// // --- more flags coming ////////////////////////////////////////////////////////////////////////// void setSpacing(pp_uint32 spacing) { properties.spacing = spacing; } void setHighlightSpacingPrimary(pp_uint32 spacing) { properties.highlightSpacingPrimary = spacing; } void setHighLightRowPrimary(bool b) { properties.highLightRowPrimary = b; } void setHighlightSpacingSecondary(pp_uint32 spacing) { properties.highlightSpacingSecondary = spacing; } void setHighLightRowSecondary(bool b) { properties.highLightRowSecondary = b; } // use zero effect zeros void showZeroEffect(bool b) { properties.zeroEffectCharacter = (b ? '0' : '\xf4'); } // hex count void setHexCount(bool b) { properties.hexCount = b; } // set prospective mode void setProspective(bool b) { properties.prospective = b; } bool getProspective() const { return properties.prospective; } // set wraparound mode void setWrapAround(bool b) { properties.wrapAround = b; } bool getWrapAround() const { return properties.wrapAround; } // set tab to note void setTabToNote(bool b) { properties.tabToNote = b; } bool getTabToNote() const { return properties.tabToNote; } // mouse click allows cursor-repositioning void setClickToCursor(bool b) { properties.clickToCursor = b; } bool getClickToCursor() const { return properties.clickToCursor; } // autoresize void setAutoResize(bool b) { patternEditor->setAutoResize(b); } bool getAutoResize() { return patternEditor->getAutoResize(); } // multichannel edit void setMultiChannelEdit(bool b) { properties.multiChannelEdit = b; } void setRowAdvance(bool b) { properties.rowAdvance = b; } void switchEditMode(EditModes mode); void setMuteFade(pp_int32 fade) { if (fade > 65536) fade = 65536; if (fade < 0) fade = 0; properties.muteFade = fade; } void muteChannel(pp_int32 index, bool b) { muteChannels[index] = (b ? 1 : 0); } void recordChannel(pp_int32 index, bool b) { recChannels[index] = (b ? 1 : 0); } void unmuteAll(); void setRecordMode(bool b); void advanceRow(bool assureCursor = true, bool repaint = true); PatternEditor* getPatternEditor() const { return patternEditor; } // --- these are defined in PatternEditorControlTransposeHandler.cpp ----- void showNoteTransposeWarningMessageBox(pp_int32 fuckups); pp_int32 noteTransposeTrack(const PatternEditorTools::TransposeParameters& transposeParameters); pp_int32 noteTransposePattern(const PatternEditorTools::TransposeParameters& transposeParameters); pp_int32 noteTransposeSelection(const PatternEditorTools::TransposeParameters& transposeParameters); private: // --- Transpose handler class TransposeHandlerResponder : public DialogResponder { private: PatternEditorControl& patternEditorControl; PatternEditorTools::TransposeParameters transposeParameters; TTransposeFunc transposeFunc; public: TransposeHandlerResponder(PatternEditorControl& thePatternEditorControl); void setTransposeParameters(const PatternEditorTools::TransposeParameters& transposeParameters) { this->transposeParameters = transposeParameters; } void setTransposeFunc(TTransposeFunc transposeFunc) { this->transposeFunc = transposeFunc; } virtual pp_int32 ActionOkay(PPObject* sender); virtual pp_int32 ActionCancel(PPObject* sender); }; friend class TransposeHandlerResponder; PPDialogBase* dialog; TransposeHandlerResponder* transposeHandlerResponder; private: pp_int32 getRowCountWidth(); void adjustExtents(); void adjustVerticalScrollBarPositions(mp_sint32 startIndex); void adjustHorizontalScrollBarPositions(mp_sint32 startPos); void adjustScrollBarPositionsAndSizes(); void adjustScrollBarSizes(); void setScrollbarPositions(mp_sint32 startIndex, mp_sint32 startPos); void scrollCursorDown(); void scrollCursorUp(); void assureCursorVisible(bool row = true, bool channel = true); mp_sint32 getNextRecordingChannel(mp_sint32 currentChannel); virtual void advance(); void validate(); // ------- menu stuff ------------------------------------------ enum MenuCommandIDs { MenuCommandIDMuteChannel = 100, MenuCommandIDSoloChannel, MenuCommandIDUnmuteAll, MenuCommandIDSelectChannel, MenuCommandIDPorousPaste, MenuCommandIDSwapChannels, }; void invokeMenu(pp_int32 channel, const PPPoint& p); void executeMenuCommand(pp_int32 commandId); void handleDeleteKey(pp_uint16 keyCode, pp_int32& result); void handleKeyDown(pp_uint16 keyCode, pp_uint16 scanCode, pp_uint16 character); // mark channel void markChannel(pp_int32 channel, bool invert = true); // select ALL void selectAll(); // deselect ALL void deselectAll(); enum RMouseDownActions { RMouseDownActionInvalid, RMouseDownActionFirstRClick, RMouseDownActionFirstLClick, RMouseDownActionSecondLClick }; RMouseDownActions lastAction; pp_int32 RMouseDownInChannelHeading; pp_int32 pointInChannelHeading(PPPoint& cp); bool isSoloChannel(pp_int32 c); private: bool executeBinding(const PPKeyBindings* bindings, pp_uint16 keyCode); void initKeyBindings(); // Original FT2 bindings void eventKeyDownBinding_LEFT(); void eventKeyDownBinding_RIGHT(); void eventKeyDownBinding_UP(); void eventKeyDownBinding_DOWN(); void eventKeyDownBinding_PRIOR(); void eventKeyDownBinding_NEXT(); void eventKeyDownBinding_HOME(); void eventKeyDownBinding_END(); void eventKeyDownBinding_FIRSTQUARTER(); void eventKeyDownBinding_SECONDQUARTER(); void eventKeyDownBinding_THIRDQUARTER(); void eventKeyDownBinding_ReadMacro1(); void eventKeyDownBinding_ReadMacro2(); void eventKeyDownBinding_ReadMacro3(); void eventKeyDownBinding_ReadMacro4(); void eventKeyDownBinding_ReadMacro5(); void eventKeyDownBinding_ReadMacro6(); void eventKeyDownBinding_ReadMacro7(); void eventKeyDownBinding_ReadMacro8(); void eventKeyDownBinding_ReadMacro9(); void eventKeyDownBinding_ReadMacro0(); void eventKeyDownBinding_WriteMacro1(); void eventKeyDownBinding_WriteMacro2(); void eventKeyDownBinding_WriteMacro3(); void eventKeyDownBinding_WriteMacro4(); void eventKeyDownBinding_WriteMacro5(); void eventKeyDownBinding_WriteMacro6(); void eventKeyDownBinding_WriteMacro7(); void eventKeyDownBinding_WriteMacro8(); void eventKeyDownBinding_WriteMacro9(); void eventKeyDownBinding_WriteMacro0(); void eventKeyDownBinding_SC_Q(); void eventKeyDownBinding_SC_W(); void eventKeyDownBinding_SC_E(); void eventKeyDownBinding_SC_R(); void eventKeyDownBinding_SC_T(); void eventKeyDownBinding_SC_Z(); void eventKeyDownBinding_SC_U(); void eventKeyDownBinding_SC_I(); void eventKeyDownBinding_SC_A(); void eventKeyDownBinding_SC_S(); void eventKeyDownBinding_SC_D(); void eventKeyDownBinding_SC_F(); void eventKeyDownBinding_SC_G(); void eventKeyDownBinding_SC_H(); void eventKeyDownBinding_SC_J(); void eventKeyDownBinding_SC_K(); void eventKeyDownBinding_SC_IncreaseRowInsertAdd(); void eventKeyDownBinding_SC_DecreaseRowInsertAdd(); void eventKeyDownBinding_PreviousChannel(); void eventKeyDownBinding_NextChannel(); void eventKeyDownBinding_DeleteNote(); void eventKeyDownBinding_DeleteNoteVolumeAndEffect(); void eventKeyDownBinding_DeleteVolumeAndEffect(); void eventKeyDownBinding_DeleteEffect(); void eventKeyDownBinding_InsertNote(); void eventKeyDownBinding_InsertLine(); void eventKeyDownBinding_DeleteNoteSlot(); void eventKeyDownBinding_DeleteLine(); void eventKeyDownBinding_CutTrack(); void eventKeyDownBinding_CopyTrack(); void eventKeyDownBinding_PasteTrack(); void eventKeyDownBinding_TransparentPasteTrack(); void eventKeyDownBinding_CutPattern(); void eventKeyDownBinding_CopyPattern(); void eventKeyDownBinding_PastePattern(); void eventKeyDownBinding_TransparentPastePattern(); void eventKeyCharBinding_Undo(); void eventKeyCharBinding_Redo(); void eventKeyCharBinding_Cut(); // Operates on block void eventKeyCharBinding_Copy(); // Operates on block void eventKeyCharBinding_Paste(); // Operates on block void eventKeyCharBinding_TransparentPaste(); void eventKeyCharBinding_SelectAll(); void eventKeyCharBinding_MuteChannel(); void eventKeyCharBinding_InvertMuting(); void eventKeyCharBinding_Interpolate(); public: enum AdvanceCodes { AdvanceCodeJustUpdate, AdvanceCodeCursorUpWrappedStart, AdvanceCodeCursorDownWrappedEnd, AdvanceCodeCursorPageUpWrappedStart, AdvanceCodeCursorPageDownWrappedEnd, AdvanceCodeWrappedEnd, AdvanceCodeSelectNewRow }; private: virtual void editorNotification(EditorBase* sender, EditorBase::EditorNotifications notification); pp_int32 notifyUpdate(pp_int32 code = AdvanceCodeJustUpdate) { PPEvent e(eUpdated, &code, sizeof(code)); return eventListener->handleEvent(reinterpret_cast(this), &e); } }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionDiskMenu.h0000644000175000017500000001061011150223367022060 0ustar admin2admin2/* * tracker/SectionDiskMenu.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionDiskMenu.h * MilkyTracker * * Created by Peter Barth on 08.07.05. * */ #ifndef SECTIONDISKMENU__H #define SECTIONDISKMENU__H #include "BasicTypes.h" #include "SimpleVector.h" #include "Event.h" #include "SectionUpperLeft.h" class PPControl; class Tracker; class PPListBoxFileBrowser; class SectionDiskMenu : public SectionUpperLeft { private: enum ClassicViewStates { BrowseAll, BrowseModules, BrowseInstruments, BrowseSamples, BrowsePatterns, BrowseTracks, BrowseLAST // needs to be last }; bool diskMenuVisible; PPSimpleVector* normalViewControls; PPSimpleVector* classicViewControls; ClassicViewStates classicViewState; bool classicViewVisible; bool forceClassicBrowser; bool moduleTypeAdjust; bool sortAscending; bool storePath; PPControl* lastFocusedControl; PPListBoxFileBrowser* listBoxFiles; class PPListBox* editFieldCurrentFile; class PPRadioGroup* currentActiveRadioGroup; PPPoint radioGroupLocations[5]; PPSystemString* file; PPSystemString* fileFullPath; PPSystemString currentPath; #ifdef __LOWRES__ pp_int32 lastSIPOffsetMove; PPPoint lastPatternEditorControlLocation; PPSize lastPatternEditorControlSize; #endif PPSize fileBrowserExtent; class ColorQueryListener* colorQueryListener; public: SectionDiskMenu(Tracker& tracker); virtual ~SectionDiskMenu(); // Derived from SectionAbstract virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init() { SectionUpperLeft::init(); } virtual void init(pp_int32 x, pp_int32 y); virtual void show(bool bShow); virtual void update(bool repaint = true); pp_int32 getCurrentSelectedSampleSaveType(); bool isActiveEditing(); bool isFileBrowserVisible(); bool fileBrowserHasFocus(); void setFileBrowserShowFocus(bool showFocus); void selectSaveType(pp_uint32 type); static pp_uint32 getDefaultConfigUInt32(); pp_uint32 getConfigUInt32(); void setConfigUInt32(pp_uint32 config); PPSystemString getCurrentPath(); void setCurrentPath(const PPSystemString& path, bool reload = true); PPString getCurrentPathASCII(); void setModuleTypeAdjust(bool moduleTypeAdjust) { this->moduleTypeAdjust = moduleTypeAdjust; } bool isDiskMenuVisible() { return diskMenuVisible; } void resizeInstrumentContainer(); void setCycleFilenames(bool cycleFilenames); PPListBoxFileBrowser* getListBoxFiles() { return listBoxFiles; } private: void prepareSection(); void showNormalView(bool bShow); void updateClassicView(bool repaint = true); void showClassicView(bool bShow); bool isNormalViewVisible(); bool isClassicViewVisible(); void flip(); void updateFilenameEditFieldExtension(ClassicViewStates viewState); void updateFilenameEditField(ClassicViewStates viewState); void updateFilenameEditField(const PPSystemString& fileName); void updateFilenameEditFieldFromBrowser(); void handleLoadOrStep(); void loadCurrentSelectedFile(); void showOverwriteMessageBox(); void prepareSave(); void saveCurrent(); void showDeleteMessageBox(); void deleteCurrent(); void updateButtonStates(bool repaint = true); void next(bool repaint = true); void prev(bool repaint = true); void parent(bool repaint = true); void root(bool repaint = true); void home(bool repaint = true); void reload(bool repaint = true); void updateFilter(bool repaint = true); void switchState(ClassicViewStates viewState); void resizeBrowserVertically(); void resizeBrowserHorizontally(); void fitDirButtons(); PPString getKeyFromPredefPathButton(PPControl* button); void assureExtension(); // Responder should be friend friend class DialogResponderDisk; friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/TrackerConfig.cpp0000644000175000017500000001624111150223367022076 0ustar admin2admin2/* * tracker/TrackerConfig.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "TrackerConfig.h" #define MILKYTRACKER_HIVER ((0 << 8) + (0)) #define MILKYTRACKER_LOVER ((0x90 << 8) + (0x85)) const PPString TrackerConfig::stringButtonPlus("+"); const PPString TrackerConfig::stringButtonMinus("-"); const PPString TrackerConfig::stringButtonUp("\xfe"); const PPString TrackerConfig::stringButtonDown("\xfd"); const PPString TrackerConfig::stringButtonExtended("\xf0"); const PPString TrackerConfig::stringButtonCollapsed("="); const PPPoint TrackerConfig::trackerExitBounds(4,4); PPColor TrackerConfig::colorThemeMain(64, 96, 128); PPColor TrackerConfig::colorRecordModeButtonText(255, 0, 0); PPColor TrackerConfig::colorPatternEditorBackground(0,0,0); PPColor TrackerConfig::colorPatternEditorCursor(64*2, 64*2, 128*2-1); PPColor TrackerConfig::colorPatternEditorCursorLine(96, 32, 64); PPColor TrackerConfig::colorPatternEditorCursorLineHighLight(128+32, 24, 48); PPColor TrackerConfig::colorPatternEditorSelection(16,48,96); PPColor TrackerConfig::colorPatternEditorNote(255, 255, 255); PPColor TrackerConfig::colorPatternEditorInstrument(128, 224, 255); PPColor TrackerConfig::colorPatternEditorVolume(128, 255, 128); PPColor TrackerConfig::colorPatternEditorEffect(255, 128, 224); PPColor TrackerConfig::colorPatternEditorOperand(255, 224, 128); PPColor TrackerConfig::colorHighLight_1(255, 255, 0); PPColor TrackerConfig::colorHighLight_2(255, 255, 128); PPColor TrackerConfig::colorScopes(255, 255, 255); PPColor TrackerConfig::colorRowHighLight_1(32, 32, 32); PPColor TrackerConfig::colorRowHighLight_2(16, 16, 16); // how many open tabs are allowed #ifndef __LOWRES__ pp_int32 TrackerConfig::numTabs = 32; #else pp_int32 TrackerConfig::numTabs = 1; #endif // How many channels possible in XM module? We take the standard here => 32 channels pp_int32 TrackerConfig::numPlayerChannels = 32; // How many channels allocated for instrument playback only? Doesn't cut notes pp_int32 TrackerConfig::numVirtualChannels = 32; // The final amount of channels to be mixed, add two for playing samples on seperate channels without having to cut notes pp_int32 TrackerConfig::totalPlayerChannels = TrackerConfig::numPlayerChannels + TrackerConfig::numVirtualChannels + 2; // This can't be changed later, it's the maximum of channels possible const pp_int32 TrackerConfig::maximumPlayerChannels = 32+99+2; bool TrackerConfig::useVirtualChannels = false; const pp_int32 TrackerConfig::numPredefinedEnvelopes = 10; const pp_int32 TrackerConfig::numPredefinedColorPalettes = 6; const PPString TrackerConfig::defaultPredefinedVolumeEnvelope("060203050700000000C000040100000800B0000E00200018005800200020"); const PPString TrackerConfig::defaultPredefinedPanningEnvelope("06020305000000000080000A00A0001E006000320080003C008000460080"); const PPString TrackerConfig::defaultProTrackerPanning("0000002000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00"); const PPString TrackerConfig::defaultColorPalette("2B" // Numkeys "FFFFFF" // ColorPatternNote "80E0FF" // ColorPatternInstrument "80FF80" // ColorPatternVolume "FF80E0" // ColorPatternEffect "FFE080" // ColorPatternOperand "8080FF" // ColorCursor "602040" // ColorCursorLine "A01830" // ColorCursorLineHighlighted "406080" // ColorTheme "FFFFFF" // ColorForegroundText "C0C0C0" // ColorButtons "000000" // ColorButtonText "8080FF" // ColorSelection "282849" // ColorListBoxBackground "103060" // ColorPatternSelection "FFFF00" // Hilighted text "FFFFFF" // Scopes "FFFF80" // Hilighted rows (secondary) "202020" // Row highlight background (primary) "101010" // Row highlight background (secondary) "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0" "DB00A0"); const char* TrackerConfig::predefinedColorPalettes[TrackerConfig::numPredefinedColorPalettes] = // Current last color start in the line of this comment marker { // default "2BFFFFFF80E0FF80FF80FF80E0FFE0808080FF602040A01830406080FFFFFFC0C0C00000008080FF202030103060FFFF00FFFFFFFFFF802020201010103B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B0040", // bluish "2BFFFFFF7FB5FFA7DDFF00B5FF7FFFFF0000593F5A7F8618C9405DA7FFFFFFC0C0C000000080B5FF18183A103060FFFF00FFFFFFFFFF802020201010105B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B00205B0020", // nice one "2BFFFFFFFFD6D6FFFFFFFFD6D6FFFFFF21140D6B5F57C2355D937F8CFFFFFFA6A6A6000000D6C2C92C242C605060FFFF00FFFFFFFFFF802020201010103B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B00403B0040", // rusty "2BFFFFFFDDD0DDFFD0DDC9B5D0C2A7C22114217F647F785743403549FFFFFF7F737F000000937F8C202030403040FFFF00FFFFFFFFFF802020201010109B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E0", // greeny "2B28D0E480E0FF80FF80FFB50078E080005D35506B2EA01830407843FFFFFFC0C0C000000035B56414281A106030FFFF00FFFFFFFFFF802020201010101B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B00601B0060", // red one "2BFFFFFFFF9393E45000FFA786FF5780350000602114A01830570028FFFFFFC0C0C00000007D0000200000500010FFFF00FFFFFFFFFF802020201010109B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E09B00E0" }; const PPSystemString TrackerConfig::untitledSong("Untitled"); const pp_int32 TrackerConfig::numMixFrequencies = 4; const pp_int32 TrackerConfig::mixFrequencies[] = {11025, 22050, 44100, 48000}; const pp_uint32 TrackerConfig::version = (MILKYTRACKER_HIVER << 16) + (MILKYTRACKER_LOVER); milkytracker-0.90.85+dfsg/src/tracker/EditModes.h0000644000175000017500000000205711150223367020677 0ustar admin2admin2/* * tracker/EditModes.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * EditModes.h * MilkyTracker * * Created by Peter Barth on Thu May 19 2005. * */ #ifndef __EDITMODES_H__ #define __EDITMODES_H__ enum EditModes { EditModeMilkyTracker, EditModeFastTracker }; enum ScrollModes { ScrollModeToEnd, ScrollModeToCenter, ScrollModeStayInCenter }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionAbout.h0000644000175000017500000000270311150223367021417 0ustar admin2admin2/* * tracker/SectionAbout.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionAbout.h * MilkyTracker * * Created by Peter Barth on 17.11.05. * */ #ifndef SECTIONABOUT__H #define SECTIONABOUT__H #include "BasicTypes.h" #include "Event.h" #include "SectionUpperLeft.h" class PPControl; class Tracker; class SectionAbout : public SectionUpperLeft { public: SectionAbout(Tracker& tracker); virtual ~SectionAbout(); // Derived from SectionAbstract virtual pp_int32 handleEvent(PPObject* sender, PPEvent* event); virtual void init() { SectionUpperLeft::init(); } virtual void init(pp_int32 x, pp_int32 y); virtual void show(bool bShow) { SectionUpperLeft::show(bShow); } virtual void update(bool repaint = true); friend class Tracker; }; #endif milkytracker-0.90.85+dfsg/src/tracker/PatternEditorTools.cpp0000644000175000017500000011721411150223367023164 0ustar admin2admin2/* * tracker/PatternEditorTools.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * PatternEditorTools.cpp * MilkyTracker * * Created by Peter Barth on 16.11.07. * */ #include "PatternEditorTools.h" #include "XModule.h" #include "PatternTools.h" PatternEditorTools::PatternEditorTools(TXMPattern* pattern) : pattern(pattern) { } PatternEditorTools::Position PatternEditorTools::getMarkStart() { Position pos; pos.channel = pos.row = pos.inner = 0; return pos; } PatternEditorTools::Position PatternEditorTools::getMarkEnd() { Position pos; pos.channel = pos.row = pos.inner = 0; if (pattern->patternData != NULL) { pos.channel = pattern->channum - 1; pos.inner = 7; pos.row = pattern->rows - 1; } return pos; } bool PatternEditorTools::normalizeSelection(const TXMPattern* pattern, const PatternEditorTools::Position& ss, const PatternEditorTools::Position& se, pp_int32& selectionStartChannel, pp_int32& selectionStartRow, pp_int32& selectionStartInner, pp_int32& selectionEndChannel, pp_int32& selectionEndRow, pp_int32& selectionEndInner) { pp_int32 ssc = ss.channel, ssr = ss.row, ssi = ss.inner; pp_int32 sec = se.channel, ser = se.row, sei = se.inner; if (ssc < 0 && ssr < 0 && sec < 0 && ser < 0) return false; // sanity checks if (ssc < 0) ssc = 0; if (ssc >= pattern->channum) ssc = pattern->channum-1; if (sec < 0) sec = 0; if (sec >= pattern->channum) sec = pattern->channum-1; if (ssr < 0) ssr = 0; if (ssr >= pattern->rows) ssr = pattern->rows-1; if (ser < 0) ser = 0; if (ser >= pattern->rows) ser = pattern->rows-1; if (ssi < 0) ssi = 0; if (ssi > 7) ssi = 7; if (sei < 0) sei = 0; if (sei > 7) sei = 7; // correct orientation selectionStartChannel = 0; selectionStartRow = 0; selectionStartInner = 0; selectionEndChannel = 0; selectionEndRow = 0; selectionEndInner = 0; if (ssc > sec) { selectionStartChannel = sec; selectionEndChannel = ssc; selectionStartInner = sei; selectionEndInner = ssi; } else { selectionStartChannel = ssc; selectionEndChannel = sec; selectionStartInner = ssi; selectionEndInner = sei; } if (ssr > ser) { selectionStartRow = ser; selectionEndRow = ssr; } else { selectionStartRow = ssr; selectionEndRow = ser; } if (selectionStartChannel == selectionEndChannel && selectionEndInner < selectionStartInner) { mp_sint32 h = selectionEndInner; selectionEndInner = selectionStartInner; selectionStartInner = h; } return true; } void PatternEditorTools::clearSelection(const PatternEditorTools::Position& ss, const PatternEditorTools::Position& se) { if (!PatternEditorTools::hasValidSelection(pattern, ss, se)) return; pp_int32 selectionStartChannel; pp_int32 selectionStartRow; pp_int32 selectionStartInner; pp_int32 selectionEndChannel; pp_int32 selectionEndRow; pp_int32 selectionEndInner; if (!normalizeSelection(pattern, ss, se, selectionStartChannel, selectionStartRow, selectionStartInner, selectionEndChannel, selectionEndRow,selectionEndInner)) return; // only entire instrument column is allowed if (selectionStartInner >= 1 && selectionStartInner<=2) selectionStartInner = 1; if (selectionEndInner >= 1 && selectionEndInner<=2) selectionEndInner = 2; // only entire volume column can be selected if (selectionStartInner >= 3 && selectionStartInner<=4) selectionStartInner = 3; if (selectionEndInner >= 3 && selectionEndInner<=4) selectionEndInner = 4; pp_int32 selectionWidth = selectionEndChannel - selectionStartChannel + 1; pp_int32 selectionHeight = selectionEndRow - selectionStartRow + 1; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { mp_ubyte* src = pattern->patternData + (selectionStartRow+i)*rowSizeSrc+(selectionStartChannel+j)*slotSize; //memset(src, 0, slotSize); if (selectionWidth == 1) { slotClear(src, selectionStartInner, selectionEndInner); } else if (j == selectionStartChannel) { slotClear(src, selectionStartInner, 7); } else if (j == selectionEndChannel) { slotClear(src, 0, selectionEndInner); } else { //memcpy(dst, src, slotSize); slotClear(src, 0, 7); } } } bool PatternEditorTools::expandPattern() { if (pattern == NULL) return false; if (pattern->patternData == NULL) return false; if (pattern->rows * 2 > 256) return false; mp_sint32 slotSize = pattern->effnum * 2 + 2; // allocate twice the space of the current pattern mp_sint32 patternSize = slotSize * pattern->channum * pattern->rows * 2; mp_ubyte* newPatternData = new mp_ubyte[patternSize]; memset(newPatternData, 0, patternSize); for (mp_sint32 i = 0; i < pattern->rows; i++) { mp_sint32 srcOffset = i * slotSize * pattern->channum; mp_sint32 dstOffset = i * 2 * slotSize * pattern->channum; for (mp_sint32 j = 0; j < slotSize * pattern->channum; j++) newPatternData[dstOffset++] = pattern->patternData[srcOffset++]; } delete[] pattern->patternData; pattern->patternData = newPatternData; pattern->rows <<= 1; return true; } bool PatternEditorTools::shrinkPattern() { if (pattern == NULL) return false; if (pattern->patternData == NULL) return false; if (pattern->rows < 2) return false; mp_sint32 slotSize = pattern->effnum * 2 + 2; // allocate half of the space of the current pattern mp_sint32 patternSize = slotSize * pattern->channum * (pattern->rows >> 1); mp_ubyte* newPatternData = new mp_ubyte[patternSize]; memset(newPatternData, 0, patternSize); for (mp_sint32 i = 0; i < pattern->rows >> 1; i++) { mp_sint32 srcOffset = i * 2 * slotSize * pattern->channum; mp_sint32 dstOffset = i * slotSize * pattern->channum; for (mp_sint32 j = 0; j < slotSize * pattern->channum; j++) newPatternData[dstOffset++] = pattern->patternData[srcOffset++]; } delete[] pattern->patternData; pattern->patternData = newPatternData; pattern->rows >>= 1; return true; } pp_int32 PatternEditorTools::insRemapSelection(const Position& ss, const Position& se, pp_int32 oldIns, pp_int32 newIns) { if (!PatternEditorTools::hasValidSelection(pattern, ss, se)) return 0; pp_int32 selectionStartChannel; pp_int32 selectionStartRow; pp_int32 selectionStartInner; pp_int32 selectionEndChannel; pp_int32 selectionEndRow; pp_int32 selectionEndInner; if (!normalizeSelection(pattern, ss, se, selectionStartChannel, selectionStartRow, selectionStartInner, selectionEndChannel, selectionEndRow,selectionEndInner)) return 0; // only entire instrument column is allowed if (selectionStartInner >= 1 && selectionStartInner<=2) selectionStartInner = 1; if (selectionEndInner >= 1 && selectionEndInner<=2) selectionEndInner = 2; // only entire volume column can be selected if (selectionStartInner >= 3 && selectionStartInner<=4) selectionStartInner = 3; if (selectionEndInner >= 3 && selectionEndInner<=4) selectionEndInner = 4; pp_int32 selectionWidth = selectionEndChannel - selectionStartChannel + 1; pp_int32 selectionHeight = selectionEndRow - selectionStartRow + 1; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; pp_int32 resCnt = 0; for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { mp_ubyte* src = pattern->patternData + (selectionStartRow+i)*rowSizeSrc+(selectionStartChannel+j)*slotSize; //memset(src, 0, slotSize); if (selectionWidth == 1) { if (selectionStartInner <= 1 && selectionEndInner >= 2) if (src[1] == oldIns) { src[1] = (mp_ubyte)newIns; resCnt++; } } else if (j == selectionStartChannel) { if (selectionStartInner <= 1) if (src[1] == oldIns) { src[1] = (mp_ubyte)newIns; resCnt++; } } else if (j == selectionEndChannel) { if (selectionEndInner >= 2) if (src[1] == oldIns) { src[1] = (mp_ubyte)newIns; resCnt++; } } else { if (src[1] == oldIns) { src[1] = (mp_ubyte)newIns; resCnt++; } } } return resCnt; } pp_int32 PatternEditorTools::insRemap(pp_int32 oldIns, pp_int32 newIns) { Position ss = getMarkStart(); Position se = getMarkEnd(); return insRemapSelection(ss, se, oldIns, newIns); } pp_int32 PatternEditorTools::insRemapTrack(pp_int32 track, pp_int32 oldIns, pp_int32 newIns) { Position ss, se = getMarkEnd(); ss.channel = track; ss.inner = 0; ss.row = 0; se.channel = track; se.inner = 7; return insRemapSelection(ss, se, oldIns, newIns); } pp_int32 PatternEditorTools::noteTransposeSelection(const Position& ss, const Position& se, const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate) { if (!PatternEditorTools::hasValidSelection(pattern, ss, se)) return 0; pp_int32 selectionStartChannel; pp_int32 selectionStartRow; pp_int32 selectionStartInner; pp_int32 selectionEndChannel; pp_int32 selectionEndRow; pp_int32 selectionEndInner; if (!normalizeSelection(pattern, ss, se, selectionStartChannel, selectionStartRow, selectionStartInner, selectionEndChannel, selectionEndRow,selectionEndInner)) return 0; // only entire instrument column is allowed if (selectionStartInner >= 1 && selectionStartInner<=2) selectionStartInner = 1; if (selectionEndInner >= 1 && selectionEndInner<=2) selectionEndInner = 2; // only entire volume column can be selected if (selectionStartInner >= 3 && selectionStartInner<=4) selectionStartInner = 3; if (selectionEndInner >= 3 && selectionEndInner<=4) selectionEndInner = 4; pp_int32 selectionWidth = selectionEndChannel - selectionStartChannel + 1; pp_int32 selectionHeight = selectionEndRow - selectionStartRow + 1; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; pp_int32 resCnt = 0; pp_int32 fuckupCnt = 0; for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { mp_ubyte* src = pattern->patternData + (selectionStartRow+i)*rowSizeSrc+(selectionStartChannel+j)*slotSize; bool transpose = false; //memset(src, 0, slotSize); if (selectionWidth == 1) { if (selectionStartInner == 0 && selectionEndInner >= 0) transpose = true; } else if (j == selectionStartChannel) { if (selectionStartInner >= 0) transpose = true; } else if (j == selectionEndChannel) { if (selectionEndInner >= 0) transpose = true; } else transpose = true; if (transpose) { bool withinInsRange = false; bool withinNoteRange = false; if (src[0] && src[0] < 97) { if (src[1] >= transposeParameters.insRangeStart && src[1] <= transposeParameters.insRangeEnd) withinInsRange = true; if (src[0] >= transposeParameters.noteRangeStart && src[0] <= transposeParameters.noteRangeEnd) withinNoteRange = true; } if (withinNoteRange && withinInsRange) { pp_int32 note = src[0]; note += transposeParameters.amount; if (!evaluate && note >= 1 && note <= transposeParameters.maxNoteRange) { src[0] = (mp_ubyte)note; resCnt++; } else if (evaluate && (note > transposeParameters.maxNoteRange || note < 1)) fuckupCnt++; else if (!evaluate && (note > transposeParameters.maxNoteRange || note < 1)) { src[0] = 0; fuckupCnt++; } } } } if (!evaluate) return resCnt; else return fuckupCnt; } pp_int32 PatternEditorTools::noteTranspose(const TransposeParameters& transposeParameters, bool evaluate/* = false*/) { Position ss = getMarkStart(); Position se = getMarkEnd(); return noteTransposeSelection(ss, se, transposeParameters, evaluate); } pp_int32 PatternEditorTools::noteTransposeTrack(pp_int32 track, const TransposeParameters& transposeParameters, bool evaluate/* = false*/) { Position ss, se = getMarkEnd(); ss.channel = track; ss.inner = 0; ss.row = 0; se.channel = track; se.inner = 7; return noteTransposeSelection(ss, se, transposeParameters, evaluate); } pp_int32 PatternEditorTools::interpolateValuesInSelection(const PatternEditorTools::Position& ss, const PatternEditorTools::Position& se) { if (!PatternEditorTools::hasValidSelection(pattern, ss, se)) return 0; pp_int32 selectionStartChannel; pp_int32 selectionStartRow; pp_int32 selectionStartInner; pp_int32 selectionEndChannel; pp_int32 selectionEndRow; pp_int32 selectionEndInner; if (!normalizeSelection(pattern, ss, se, selectionStartChannel, selectionStartRow, selectionStartInner, selectionEndChannel, selectionEndRow,selectionEndInner)) return 0; // only entire instrument column is allowed if (selectionStartInner >= 1 && selectionStartInner<=2) selectionStartInner = 1; if (selectionEndInner >= 1 && selectionEndInner<=2) selectionEndInner = 2; // only entire volume column can be selected if (selectionStartInner >= 3 && selectionStartInner<=4) selectionStartInner = 3; if (selectionEndInner >= 3 && selectionEndInner<=4) selectionEndInner = 4; // only entire effect operand column if (selectionStartInner >= 6 && selectionStartInner<=7) selectionStartInner = 6; if (selectionEndInner >= 7 && selectionEndInner<=7) selectionEndInner = 7; pp_int32 selectionWidth = selectionEndChannel - selectionStartChannel + 1; pp_int32 selectionHeight = selectionEndRow - selectionStartRow + 1; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; pp_int32 numValues; pp_int32 vTab[256]; pp_int32 vPosTab[256]; ASSERT(pattern->rows <= 256); pp_int32 stats = 0; for (pp_int32 j = 0; j < selectionWidth; j++) for (pp_int32 k = 0; k < 8; k++) { if (selectionWidth == 1) { if (selectionStartInner > k || selectionEndInner < k) continue; } if (j == selectionStartChannel) { if (selectionStartInner > k) continue; } if (j == selectionEndChannel) { if (selectionEndInner < k) continue; } if (k == 2 || k == 4 || k == 6) continue; numValues = 0; for (pp_int32 i = 0; i < selectionHeight; i++) { mp_ubyte* src = pattern->patternData + (selectionStartRow+i)*rowSizeSrc+(selectionStartChannel+j)*slotSize; switch (k) { case 0: if (*src && *src < 97) { vTab[numValues] = *src; vPosTab[numValues] = i; numValues++; } break; case 1: if (*(src+1)) { vTab[numValues] = *(src+1); vPosTab[numValues] = i; numValues++; } break; case 3: { pp_int32 eff, op; eff = *(src + 2); op = *(src + 3); PatternTools::convertEffectsToFT2(eff, op); pp_int32 vol = PatternTools::getVolumeFromEffect(eff, op); if (vol) { vTab[numValues] = vol; vPosTab[numValues] = i; numValues++; } break; } case 7: { pp_int32 eff, op = 0xF; eff = *(src + 4); PatternTools::convertEffectsToFT2(eff, op); if (op) { vTab[numValues] = eff; vPosTab[numValues] = i; numValues++; } break; } // Entire effect case 5: { pp_int32 eff, op; eff = *(src + 4); // Make sure it's a valid effect if (!eff) op = 0; op = *(src + 5); if (eff || op) { vTab[numValues] = op; vPosTab[numValues] = i; numValues++; } } } } // we'll need at least 2 values to interpolate in between if (numValues >= 2) { for (pp_int32 n = 0; n < numValues-1; n++) { pp_int32 startv = vTab[n] << 16; pp_int32 adder = ((vTab[n+1] - vTab[n]) << 16) / (vPosTab[n+1] - vPosTab[n]); for (pp_int32 i = vPosTab[n]; i < vPosTab[n+1]; i++) { mp_ubyte* src = pattern->patternData + (selectionStartRow+i)*rowSizeSrc+(selectionStartChannel+j)*slotSize; pp_int32 v = startv>>16; switch (k) { case 0: if (!*src) *src = (mp_ubyte)v; break; case 1: if (!*(src+1)) *(src+1) = (mp_ubyte)v; break; case 3: { pp_int32 eff, op; PatternTools::convertVolumeToEffect(v, eff, op); if (eff) { *(src + 2) = (mp_ubyte)eff; *(src + 3) = (mp_ubyte)op; } break; } case 7: { pp_int32 eff = v, op = 0xF; PatternTools::convertEffectsFromFT2(eff, op); if (op) { *(src + 4) = (mp_ubyte)eff; } break; } case 5: { *(src + 5) = (mp_ubyte)v; break; } } startv+=adder; stats++; } } } } return stats; } #define ZERO_EFFECT(EFFECT) \ { \ if (optimizeParameters.EFFECT && \ lastOperands[j].EFFECT == op && \ lastOperands[j].EFFECT) \ { \ src[5] = 0; resCnt++; \ } \ else if (optimizeParameters.EFFECT && \ lastOperands[j].EFFECT != op && \ op) \ lastOperands[j].EFFECT = op; \ } struct LastOperands { mp_ubyte command_1xx; mp_ubyte command_2xx; mp_ubyte command_3xx; mp_ubyte command_4xx; mp_ubyte command_56Axx; mp_ubyte command_7xx; mp_ubyte command_E1x; mp_ubyte command_E2x; mp_ubyte command_EAx; mp_ubyte command_EBx; mp_ubyte command_Hxx; mp_ubyte command_Pxx; mp_ubyte command_Rxx; mp_ubyte command_X1x; mp_ubyte command_X2x; }; pp_int32 PatternEditorTools::zeroOperandsSelection(const Position& ss, const Position& se, const OperandOptimizeParameters& optimizeParameters, bool evaluate) { if (!PatternEditorTools::hasValidSelection(pattern, ss, se)) return 0; pp_int32 selectionStartChannel; pp_int32 selectionStartRow; pp_int32 selectionStartInner; pp_int32 selectionEndChannel; pp_int32 selectionEndRow; pp_int32 selectionEndInner; if (!normalizeSelection(pattern, ss, se, selectionStartChannel, selectionStartRow, selectionStartInner, selectionEndChannel, selectionEndRow,selectionEndInner)) return 0; // only entire operand column + effect is allowed if (selectionStartInner >= 5 && selectionStartInner<=7) selectionStartInner = 5; if (selectionEndInner >= 5 && selectionEndInner<=7) selectionEndInner = 7; pp_int32 selectionWidth = selectionEndChannel - selectionStartChannel + 1; pp_int32 selectionHeight = selectionEndRow - selectionStartRow + 1; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; pp_int32 resCnt = 0; LastOperands* lastOperands = new LastOperands[selectionWidth]; memset(lastOperands, 0, sizeof(LastOperands) * selectionWidth); for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { mp_ubyte* src = pattern->patternData + (selectionStartRow+i)*rowSizeSrc+(selectionStartChannel+j)*slotSize; const mp_ubyte eff = src[4]; const mp_ubyte op = src[5]; bool doit = false; if (selectionWidth == 1) { if (selectionStartInner <= 5 && selectionEndInner >= 7) { doit = true; } } else if (j == selectionStartChannel) { if (selectionStartInner <= 5) { doit = true; } } else if (j == selectionEndChannel) { if (selectionEndInner >= 7) { doit = true; } } else { doit = true; } if (doit) { switch (eff) { // portamento up case 0x01: ZERO_EFFECT(command_1xx); break; // portamento down case 0x02: ZERO_EFFECT(command_2xx); break; // portamento to note case 0x03: ZERO_EFFECT(command_3xx); break; // vibrato case 0x04: ZERO_EFFECT(command_4xx); break; // portamento+volslide case 0x05: // vibrato+volslide case 0x06: // volslide case 0x0A: ZERO_EFFECT(command_56Axx); break; // tremolo case 0x07: ZERO_EFFECT(command_7xx); break; // fine porta up case 0x31: ZERO_EFFECT(command_E1x); break; // fine porta down case 0x32: ZERO_EFFECT(command_E2x); break; // fine volslide up case 0x3A: ZERO_EFFECT(command_EAx); break; // fine volslide down case 0x3B: ZERO_EFFECT(command_EBx); break; // global volume slide (Hxx) case 0x11: ZERO_EFFECT(command_Hxx); break; // panning slide (Pxx) case 0x19: ZERO_EFFECT(command_Pxx); break; // retrig (Rxx) case 0x1B: ZERO_EFFECT(command_Rxx); break; // x-fine porta up case 0x41: ZERO_EFFECT(command_X1x); break; // x-fine porta down case 0x42: ZERO_EFFECT(command_X2x); break; } } } delete[] lastOperands; return resCnt; } pp_int32 PatternEditorTools::zeroOperands(const OperandOptimizeParameters& optimizeParameters, bool evaluate/* = false*/) { Position ss = getMarkStart(); Position se = getMarkEnd(); return zeroOperandsSelection(ss, se, optimizeParameters, evaluate); } pp_int32 PatternEditorTools::zeroOperandsTrack(pp_int32 track, const OperandOptimizeParameters& optimizeParameters, bool evaluate) { Position ss, se = getMarkEnd(); ss.channel = track; ss.inner = 0; ss.row = 0; se.channel = track; se.inner = 7; return zeroOperandsSelection(ss, se, optimizeParameters, evaluate); } #define FILL_EFFECT(EFFECT) \ { \ if (optimizeParameters.EFFECT && \ !op && \ lastOperands[j].EFFECT) \ { \ src[5] = lastOperands[j].EFFECT; resCnt++; \ } \ else if (optimizeParameters.EFFECT && op) \ lastOperands[j].EFFECT = op; \ } pp_int32 PatternEditorTools::fillOperandsSelection(const Position& ss, const Position& se, const OperandOptimizeParameters& optimizeParameters, bool evaluate) { if (!PatternEditorTools::hasValidSelection(pattern, ss, se)) return 0; pp_int32 selectionStartChannel; pp_int32 selectionStartRow; pp_int32 selectionStartInner; pp_int32 selectionEndChannel; pp_int32 selectionEndRow; pp_int32 selectionEndInner; if (!normalizeSelection(pattern, ss, se, selectionStartChannel, selectionStartRow, selectionStartInner, selectionEndChannel, selectionEndRow,selectionEndInner)) return 0; // only entire operand column + effect is allowed if (selectionStartInner >= 5 && selectionStartInner<=7) selectionStartInner = 5; if (selectionEndInner >= 5 && selectionEndInner<=7) selectionEndInner = 7; pp_int32 selectionWidth = selectionEndChannel - selectionStartChannel + 1; pp_int32 selectionHeight = selectionEndRow - selectionStartRow + 1; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; pp_int32 resCnt = 0; LastOperands* lastOperands = new LastOperands[selectionWidth]; memset(lastOperands, 0, sizeof(LastOperands) * selectionWidth); for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { mp_ubyte* src = pattern->patternData + (selectionStartRow+i)*rowSizeSrc+(selectionStartChannel+j)*slotSize; const mp_ubyte eff = src[4]; const mp_ubyte op = src[5]; bool doit = false; if (selectionWidth == 1) { if (selectionStartInner <= 5 && selectionEndInner >= 7) { doit = true; } } else if (j == selectionStartChannel) { if (selectionStartInner <= 5) { doit = true; } } else if (j == selectionEndChannel) { if (selectionEndInner >= 7) { doit = true; } } else { doit = true; } if (doit) { switch (eff) { // portamento up case 0x01: FILL_EFFECT(command_1xx); break; // portamento down case 0x02: FILL_EFFECT(command_2xx); break; // portamento to note case 0x03: FILL_EFFECT(command_3xx); break; // vibrato case 0x04: FILL_EFFECT(command_4xx); break; // portamento+volslide case 0x05: // vibrato+volslide case 0x06: // volslide case 0x0A: FILL_EFFECT(command_56Axx); break; // tremolo case 0x07: FILL_EFFECT(command_7xx); break; // fine porta up case 0x31: FILL_EFFECT(command_E1x); break; // fine porta down case 0x32: FILL_EFFECT(command_E2x); break; // fine volslide up case 0x3A: FILL_EFFECT(command_EAx); break; // fine volslide down case 0x3B: FILL_EFFECT(command_EBx); break; // global volume slide (Hxx) case 0x11: FILL_EFFECT(command_Hxx); break; // panning slide (Pxx) case 0x19: FILL_EFFECT(command_Pxx); break; // retrig (Rxx) case 0x1B: FILL_EFFECT(command_Rxx); break; // x-fine porta up case 0x41: FILL_EFFECT(command_X1x); break; // x-fine porta down case 0x42: FILL_EFFECT(command_X2x); break; } } } delete[] lastOperands; return resCnt; } pp_int32 PatternEditorTools::fillOperands(const OperandOptimizeParameters& optimizeParameters, bool evaluate/* = false*/) { Position ss = getMarkStart(); Position se = getMarkEnd(); return fillOperandsSelection(ss, se, optimizeParameters, evaluate); } pp_int32 PatternEditorTools::fillOperandsTrack(pp_int32 track, const OperandOptimizeParameters& optimizeParameters, bool evaluate) { Position ss, se = getMarkEnd(); ss.channel = track; ss.inner = 0; ss.row = 0; se.channel = track; se.inner = 7; return fillOperandsSelection(ss, se, optimizeParameters, evaluate); } pp_int32 PatternEditorTools::relocateCommandsSelection(const Position& ss, const Position& se, const RelocateParameters& relocateParameters, bool evaluate) { if (!PatternEditorTools::hasValidSelection(pattern, ss, se)) return 0; pp_int32 selectionStartChannel; pp_int32 selectionStartRow; pp_int32 selectionStartInner; pp_int32 selectionEndChannel; pp_int32 selectionEndRow; pp_int32 selectionEndInner; if (!normalizeSelection(pattern, ss, se, selectionStartChannel, selectionStartRow, selectionStartInner, selectionEndChannel, selectionEndRow,selectionEndInner)) return 0; // only entire operand column + effect is allowed if (selectionStartInner >= 5 && selectionStartInner<=7) selectionStartInner = 5; if (selectionEndInner >= 5 && selectionEndInner<=7) selectionEndInner = 7; pp_int32 selectionWidth = selectionEndChannel - selectionStartChannel + 1; pp_int32 selectionHeight = selectionEndRow - selectionStartRow + 1; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; pp_int32 result = 0; for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { mp_ubyte* src = pattern->patternData + (selectionStartRow+i)*rowSizeSrc+(selectionStartChannel+j)*slotSize; mp_ubyte* eff = src+2; bool doit = false; if (selectionWidth == 1) { if (selectionStartInner <= 5 && selectionEndInner >= 7) { doit = true; } } else if (j == selectionStartChannel) { if (selectionStartInner <= 5) { doit = true; } } else if (j == selectionEndChannel) { if (selectionEndInner >= 7) { doit = true; } } else { doit = true; } if (doit) { if (!eff[0]) { // check for effects which can be converted into volume column switch (eff[2]) { // convert portamento to note case 0x03: if (!relocateParameters.command_3xx) break; // if the lower nibble is used, this can't be // properly converted if (eff[3] & 0x0F) break; if (!evaluate) { eff[0] = eff[2]; eff[1] = eff[3]; eff[2] = eff[3] = 0; } result++; break; // convert vibrato case 0x04: if (!relocateParameters.command_4xx) break; // both nibbles are used, this can't be // properly converted if ((eff[3] & 0x0F) && (eff[3] & 0xF0)) break; if (!evaluate) { eff[0] = eff[2]; eff[1] = eff[3]; eff[2] = eff[3] = 0; } result++; break; // convert set panning case 0x08: if (!relocateParameters.command_8xx) break; // if the lower nibble is used, this can't be // properly converted if ((eff[3] & 0x0F) && eff[3] != 0xFF) break; if (!evaluate) { eff[0] = eff[2]; eff[1] = eff[3]; eff[2] = eff[3] = 0; } result++; break; // convert set volume case 0x0C: if (!relocateParameters.command_Cxx) break; if (!evaluate) { eff[0] = eff[2]; eff[1] = eff[3]; eff[2] = eff[3] = 0; } result++; break; // convert volume slide case 0x0A: if (!relocateParameters.command_Axx) break; // both nibbles are used or operand is zero, // this can't be properly converted if (((eff[3] & 0x0F) && (eff[3] & 0xF0)) || !eff[3]) break; if (!evaluate) { eff[0] = eff[2]; eff[1] = eff[3]; eff[2] = eff[3] = 0; } result++; break; // convert panning slide case 0x19: if (!relocateParameters.command_Pxx) break; // both nibbles are used or operand is zero, // this can't be properly converted if (((eff[3] & 0x0F) && (eff[3] & 0xF0)) || !eff[3]) break; if (!evaluate) { eff[0] = eff[2]; eff[1] = eff[3]; eff[2] = eff[3] = 0; } result++; break; // convert fine volslide case 0x3A: if (!relocateParameters.command_EAx) break; // both nibbles are used or operand is zero, // this can't be properly converted if (!eff[3]) break; if (!evaluate) { eff[0] = eff[2]; eff[1] = eff[3]; eff[2] = eff[3] = 0; } result++; break; // convert fine volslide case 0x3B: if (!relocateParameters.command_EBx) break; // both nibbles are used or operand is zero, // this can't be properly converted if (!eff[3]) break; if (!evaluate) { eff[0] = eff[2]; eff[1] = eff[3]; eff[2] = eff[3] = 0; } result++; break; } } } } return result; } pp_int32 PatternEditorTools::relocateCommands(const RelocateParameters& relocateParameters, bool evaluate/* = false*/) { Position ss = getMarkStart(); Position se = getMarkEnd(); return relocateCommandsSelection(ss, se, relocateParameters, evaluate); } pp_int32 PatternEditorTools::relocateCommandsTrack(pp_int32 track, const RelocateParameters& relocateParameters, bool evaluate) { Position ss, se = getMarkEnd(); ss.channel = track; ss.inner = 0; ss.row = 0; se.channel = track; se.inner = 7; return relocateCommandsSelection(ss, se, relocateParameters, evaluate); } static inline pp_uint8 scaleByte(pp_uint8 val, float scale) { //pp_int32 v = (pp_int32)((float)val*scale); pp_int32 v = XModule::vol64to255((mp_sint32)((float)(((mp_sint32)val*64)/255)*scale)); return (pp_uint8)(v > 255 ? 255 : v); } pp_int32 PatternEditorTools::scaleVolume(const Position& startSelection, const Position& endSelection, float startScale, float endScale, pp_uint32 numVisibleChannels, XModule* module) { if (!hasValidSelection(pattern, startSelection, endSelection, numVisibleChannels)) return 0; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; pp_int32 stats = 0; pp_int32 startSelRow = startSelection.row, endSelRow = endSelection.row; pp_int32 startSelChn = startSelection.channel, endSelChn = endSelection.channel; pp_int32 h; if (startSelRow > endSelRow) { h = startSelRow; startSelRow = endSelRow; endSelRow = h; } if (startSelChn > endSelChn) { h = startSelChn; startSelChn = endSelChn; endSelChn = h; } if (endSelChn > (signed)numVisibleChannels - 1) endSelChn = (signed)numVisibleChannels - 1; if (endSelRow > pattern->rows - 1) endSelRow = pattern->rows - 1; float step = (endScale - startScale) / ((endSelRow - startSelRow) != 0.0f ? (float)(endSelRow - startSelRow) : 1.0f); for (pp_int32 r = startSelRow; r <= endSelRow; r++) { for (pp_int32 c = startSelChn; c <= endSelChn; c++) { mp_ubyte* src = pattern->patternData + r*rowSizeSrc+c*slotSize; mp_sint32 note = src[0]; mp_sint32 ins = src[1]; bool hasVolumeEff1 = (src[2] == 0xC); bool hasVolumeEff2 = (src[4] == 0xC); if (!hasVolumeEff1 && !hasVolumeEff2) { if (ins) { mp_sint32 s = 0; if (note) s = module->instr[ins-1].snum[note-1]; else s = module->instr[ins-1].snum[0]; if ((!src[2] && src[4]) || (!src[2] && !src[4])) { src[2] = 0x0C; src[3] = scaleByte(module->smp[s].sample ? module->smp[s].vol : 255, startScale); stats++; } else if (src[2] && !src[4]) { src[4] = 0x0C; src[5] = scaleByte(module->smp[s].sample ? module->smp[s].vol : 255, startScale); stats++; } } } if (hasVolumeEff1) { src[3] = scaleByte(src[3], startScale); stats++; } if (hasVolumeEff2) { src[5] = scaleByte(src[5], startScale); stats++; } } startScale+=step; } return stats; } pp_int32 PatternEditorTools::splitTrack(pp_int32 useChannels, bool insertNoteOff, pp_int32 chn, pp_int32 fromRow, pp_int32 toRow, pp_uint32 numVisibleChannels) { if (pattern == NULL || pattern->patternData == NULL) return 0; pp_int32 stats = 0; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; pp_int32 dstChn = chn; pp_int32 lastChn = chn; pp_int32 lastNoteChannel = -1; for (pp_int32 r = fromRow; r < toRow; r++) { pp_int32 i; pp_int32 finalDstCh = dstChn % numVisibleChannels; mp_ubyte* src = pattern->patternData + r*rowSizeSrc+chn*slotSize; mp_ubyte* dst = pattern->patternData + r*rowSizeSrc+finalDstCh*slotSize; bool b = false; for (i = 1; i < slotSize; i++) { if (src[i]) { b = true; break; } } bool notePorta = false; for (i = 2; i < slotSize; i+=2) { if (src[i] == 0x3 || src[i] == 0x5) notePorta = true; } if (src[0] && src[0] <= XModule::NOTE_LAST && !notePorta) lastNoteChannel = dstChn; else if ((lastNoteChannel != -1) && ((src[0] > XModule::NOTE_LAST) || b || notePorta)) { dstChn = lastNoteChannel; finalDstCh = dstChn % numVisibleChannels; dst = pattern->patternData + r*rowSizeSrc+finalDstCh*slotSize; } b = false; for (i = 0; i < slotSize; i++) { if (src[i]) { b = true; break; } } if (b && chn != finalDstCh) { memcpy(dst, src, slotSize); memset(src, 0, slotSize); if (insertNoteOff) *(pattern->patternData + r*rowSizeSrc+lastChn*slotSize) = XModule::NOTE_OFF; lastChn = finalDstCh; dstChn++; stats++; } else if (b && chn == finalDstCh) { if (insertNoteOff && finalDstCh != lastChn) *(pattern->patternData + r*rowSizeSrc+lastChn*slotSize) = XModule::NOTE_OFF; lastChn = dstChn; dstChn++; } if (dstChn > (chn+useChannels)) dstChn = chn; } return stats; } pp_int32 PatternEditorTools::swapChannels(pp_int32 dstChannel, pp_int32 srcChannel) { if (pattern == NULL || pattern->patternData == NULL) return 0; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; char* buffer = new char[slotSize]; pp_int32 stats = 0; for (pp_int32 r = 0; r < pattern->rows; r++) { mp_ubyte* src = pattern->patternData + r*rowSizeSrc+srcChannel*slotSize; mp_ubyte* dst = pattern->patternData + r*rowSizeSrc+dstChannel*slotSize; memcpy(buffer, src, slotSize); memcpy(src, dst, slotSize); memcpy(dst, buffer, slotSize); stats++; } delete[] buffer; return stats; } void PatternEditorTools::normalize() { if (pattern == NULL || pattern->patternData == NULL) return; pp_int32 selectionWidth = pattern->channum; pp_int32 selectionHeight = pattern->rows; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_ubyte* src = pattern->patternData; for (pp_int32 i = 0; i < selectionHeight; i++) for (pp_int32 j = 0; j < selectionWidth; j++) { mp_ubyte* eff = src+2; for (pp_int32 k = 0; k < pattern->effnum; k++) { // check for empty arpeggio if (eff[k*2] == 0x20 && eff[k*2+1] == 0) eff[k*2] = 0; } src+=slotSize; } } bool PatternEditorTools::hasValidSelection(const TXMPattern* pattern, const Position& ss, const Position& se, pp_int32 numVisibleChannels/* = -1*/) { if (pattern == NULL || pattern->patternData == NULL) return false; if (numVisibleChannels == -1 || numVisibleChannels > pattern->channum) numVisibleChannels = pattern->channum; Position selectionStart = ss, selectionEnd = se; flattenSelection(selectionStart, selectionEnd); return !(selectionStart.channel > numVisibleChannels-1 || selectionStart.row > pattern->rows-1 || selectionEnd.channel < 0 || selectionEnd.row < 0); } void PatternEditorTools::slotCopy(mp_ubyte* dst, mp_ubyte* src, pp_int32 from, pp_int32 to) { pp_int32 i = 0; if (i >= from && i <= to) { *dst = *src; } i++; if (i >= from && i <= to) { *(dst+1) &= 0x0F; *(dst+1) |= *(src+1)&0xF0; } i++; if (i >= from && i <= to) { *(dst+1) &= 0xF0; *(dst+1) |= *(src+1)&0xF; } i++; if (i >= from && i <= to) { *(dst+2) = *(src+2); *(dst+3) = *(src+3); } i+=2; if (i >= from && i <= to) { *(dst+4) = *(src+4); } i++; if (i >= from && i <= to) { *(dst+5) &= 0x0F; *(dst+5) |= *(src+5)&0xF0; } i++; if (i >= from && i <= to) { *(dst+5) &= 0xF0; *(dst+5) |= *(src+5)&0xF; } i++; } void PatternEditorTools::slotTransparentCopy(mp_ubyte* dst, mp_ubyte* src, pp_int32 from, pp_int32 to) { pp_int32 i = 0; if (i >= from && i <= to && *src) { *dst = *src; } i++; if (i >= from && i <= to && (*(src+1)&0xF0)) { *(dst+1) &= 0x0F; *(dst+1) |= *(src+1)&0xF0; } i++; if (i >= from && i <= to && (*(src+1)&0xF)) { *(dst+1) &= 0xF0; *(dst+1) |= *(src+1)&0xF; } i++; if (i >= from && i <= to && (*(src+2) || *(src+3))) { *(dst+2) = *(src+2); *(dst+3) = *(src+3); } i+=2; if (i >= from && i <= to && (*(src+4))) { *(dst+4) = *(src+4); } i++; if (i >= from && i <= to && (*(src+5)&0xF0)) { *(dst+5) &= 0x0F; *(dst+5) |= *(src+5)&0xF0; } i++; if (i >= from && i <= to && (*(src+5)&0xF)) { *(dst+5) &= 0xF0; *(dst+5) |= *(src+5)&0xF; } i++; } void PatternEditorTools::slotClear(mp_ubyte* dst, pp_int32 from, pp_int32 to) { pp_int32 i = 0; if (i >= from && i <= to) { *dst = 0; } i++; if (i >= from && i <= to) { *(dst+1) &= 0x0F; } i++; if (i >= from && i <= to) { *(dst+1) &= 0xF0; } i++; if (i >= from && i <= to) { *(dst+2) = 0; *(dst+3) = 0; } i+=2; if (i >= from && i <= to) { *(dst+4) = 0; } i++; if (i >= from && i <= to) { *(dst+5) &= 0x0F; } i++; if (i >= from && i <= to) { *(dst+5) &= 0xF0; } i++; } milkytracker-0.90.85+dfsg/src/tracker/ControlIDs.h0000644000175000017500000003106011150223367021036 0ustar admin2admin2/* * tracker/ControlIDs.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef CONTROLLIDS__H #define CONTROLLIDS__H enum { BUTTON_0 = 100, BUTTON_1 = 101, BUTTON_2 = 102, BUTTON_3 = 103, BUTTON_4 = 104, BUTTON_5 = 105, BUTTON_6 = 106, BUTTON_APP_EXIT = 110, CONTAINER_SCOPECONTROL = 65536, BUTTON_SCOPECONTROL_MUTE = (65536+1), BUTTON_SCOPECONTROL_SOLO = (65536+2), BUTTON_SCOPECONTROL_REC = (65536+3), // orderlist control BUTTON_ORDERLIST_INSERT = 180, BUTTON_ORDERLIST_NEXT = 181, BUTTON_ORDERLIST_PREVIOUS = 182, BUTTON_ORDERLIST_DELETE = 184, BUTTON_ORDERLIST_SONGLENGTH_PLUS = 185, BUTTON_ORDERLIST_SONGLENGTH_MINUS = 186, BUTTON_ORDERLIST_REPEAT_PLUS = 187, BUTTON_ORDERLIST_REPEAT_MINUS = 188, BUTTON_ORDERLIST_EXTENT = 189, BUTTON_ORDERLIST_SEQENTRY = 190, BUTTON_ORDERLIST_CLNENTRY = 191, BUTTON_JAMMENU_NEXTORDERLIST = 200, BUTTON_JAMMENU_PREVORDERLIST = 201, STATICTEXT_JAMMENU_CURORDER = 202, STATICTEXT_JAMMENU_CURPATTERN = 203, BUTTON_JAMMENU_NEXTINSTRUMENT = 204, BUTTON_JAMMENU_PREVINSTRUMENT = 205, STATICTEXT_JAMMENU_CURINSTRUMENT = 206, BUTTON_JAMMENU_TOGGLEPIANOSIZE = 207, STATICTEXT_ORDERLIST_SONGLENGTH = 10200, STATICTEXT_ORDERLIST_REPEAT = 10201, // speed control BUTTON_BPM_PLUS = 210, BUTTON_BPM_MINUS = 211, BUTTON_SPEED_PLUS = 212, BUTTON_SPEED_MINUS = 213, BUTTON_ADD_PLUS = 214, BUTTON_ADD_MINUS = 215, BUTTON_OCTAVE_PLUS = 216, BUTTON_OCTAVE_MINUS = 217, BUTTON_SPEEDCONTAINERFLIP = 218, STATICTEXT_SPEED_BPM_DESC = 10300, STATICTEXT_SPEED_SPEED_DESC = 10301, STATICTEXT_SPEED_PATTERNADD_DESC = 10302, STATICTEXT_SPEED_OCTAVE_DESC = 10303, STATICTEXT_SPEED_MAINVOL_DESC = 10304, STATICTEXT_SPEED_BPM = 10305, STATICTEXT_SPEED_SPEED = 10306, STATICTEXT_SPEED_PATTERNADD = 10307, STATICTEXT_SPEED_OCTAVE = 10308, STATICTEXT_SPEED_MAINVOL = 10309, // pattern control BUTTON_PATTERN_PLUS = 220, BUTTON_PATTERN_MINUS = 221, BUTTON_PATTERN_SIZE_PLUS = 222, BUTTON_PATTERN_SIZE_MINUS = 223, BUTTON_PATTERN_EXPAND = 224, BUTTON_PATTERN_SHRINK = 225, STATICTEXT_PATTERN_INDEX = 10400, STATICTEXT_PATTERN_LENGTH = 10401, // instrument/samples listboxes STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER = 226, STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER2 = 227, BUTTON_INSTRUMENTS_FLIP = 228, BUTTON_INSTRUMENT = 229, BUTTON_INSTRUMENTS_PLUS = 230, BUTTON_INSTRUMENTS_MINUS = 231, BUTTON_SAMPLES_PLUS = 232, BUTTON_SAMPLES_MINUS = 233, BUTTON_PIANO_EDIT = 234, BUTTON_PIANO_PLAY = 235, STATICTEXT_SAMPLEHEADER = 492, BUTTON_SAMPLES_INVOKEHDRECORDER = 493, // envelope/instrument editor BUTTON_ENVELOPE_UNDO = 236, BUTTON_ENVELOPE_REDO = 237, BUTTON_ENVELOPE_COPY = 238, BUTTON_ENVELOPE_PASTE = 239, BUTTON_ENVELOPE_ADD = 240, BUTTON_ENVELOPE_DELETE = 241, BUTTON_ENVELOPE_SUSTAIN_PLUS = 242, BUTTON_ENVELOPE_SUSTAIN_MINUS = 243, BUTTON_ENVELOPE_LOOPSTART_PLUS = 244, BUTTON_ENVELOPE_LOOPSTART_MINUS = 245, BUTTON_ENVELOPE_LOOPEND_PLUS = 246, BUTTON_ENVELOPE_LOOPEND_MINUS = 247, BUTTON_ENVELOPE_VOLUME = 248, BUTTON_ENVELOPE_PANNING = 249, BUTTON_ENVELOPE_PREDEF_STORE = 699, BUTTON_ENVELOPE_PREDEF_0 = 700, BUTTON_ENVELOPE_PREDEF_1 = 701, BUTTON_ENVELOPE_PREDEF_2 = 702, BUTTON_ENVELOPE_PREDEF_3 = 703, BUTTON_ENVELOPE_PREDEF_4 = 704, BUTTON_ENVELOPE_PREDEF_5 = 705, BUTTON_ENVELOPE_PREDEF_6 = 706, BUTTON_ENVELOPE_PREDEF_7 = 707, BUTTON_ENVELOPE_PREDEF_8 = 708, BUTTON_ENVELOPE_PREDEF_9 = 709, BUTTON_ENVELOPE_SCALEX = 750, BUTTON_ENVELOPE_SCALEY = 751, BUTTON_ENVELOPE_ZOOMIN = 760, BUTTON_ENVELOPE_ZOOMOUT = 761, BUTTON_ENVELOPE_ZOOMDEFAULT = 762, CHECKBOX_ENVELOPE_ON = 250, CHECKBOX_ENVELOPE_SUSTAIN = 251, CHECKBOX_ENVELOPE_LOOP = 252, SLIDER_SAMPLE_VOLUME = 253, SLIDER_SAMPLE_PANNING = 254, SLIDER_SAMPLE_FINETUNE = 255, BUTTON_SAMPLE_RELNOTENUM_OCTUP = 256, BUTTON_SAMPLE_RELNOTENUM_OCTDN = 257, BUTTON_SAMPLE_RELNOTENUM_NOTEUP = 258, BUTTON_SAMPLE_RELNOTENUM_NOTEDN = 259, SLIDER_SAMPLE_VOLFADE = 260, SLIDER_SAMPLE_VIBSPEED = 261, SLIDER_SAMPLE_VIBDEPTH = 262, SLIDER_SAMPLE_VIBSWEEP = 263, RADIOGROUP_SAMPLE_VIBTYPE = 264, BUTTON_INSTRUMENTEDITOR_EXIT = 265, BUTTON_INSTRUMENTEDITOR_LOAD = 266, BUTTON_INSTRUMENTEDITOR_SAVE = 267, BUTTON_INSTRUMENTEDITOR_COPY = 268, BUTTON_INSTRUMENTEDITOR_SWAP = 269, BUTTON_INSTRUMENTEDITOR_CLEAR = 270, // sample editor BUTTON_SAMPLE_PLAY_STOP = 280, BUTTON_SAMPLE_PLAY_UP = 281, BUTTON_SAMPLE_PLAY_DOWN = 282, BUTTON_SAMPLE_PLAY_WAVE = 283, BUTTON_SAMPLE_PLAY_RANGE = 284, BUTTON_SAMPLE_PLAY_DISPLAY = 285, BUTTON_SAMPLE_RANGE_SHOW = 286, BUTTON_SAMPLE_RANGE_ALL = 287, BUTTON_SAMPLE_RANGE_CLEAR = 288, BUTTON_SAMPLE_RANGE_ZOOMOUT = 289, BUTTON_SAMPLE_RANGE_SHOWALL = 290, BUTTON_SAMPLE_APPLY_LASTFILTER = 291, BUTTON_SAMPLE_EDIT_CUT = 292, BUTTON_SAMPLE_EDIT_COPY = 293, BUTTON_SAMPLE_EDIT_PASTE = 294, BUTTON_SAMPLE_EDIT_CROP = 295, BUTTON_SAMPLE_EDIT_VOL = 296, BUTTON_SAMPLE_EDIT_DRAW = 297, RADIOGROUP_SAMPLE_LOOPTYPE = 298, RADIOGROUP_SAMPLE_RESTYPE = 299, BUTTON_SAMPLEEDITOR_EXIT = 300, BUTTON_SAMPLE_LOAD = 301, BUTTON_SAMPLE_SAVE = 302, BUTTON_SAMPLE_EDIT_CLEAR = 303, BUTTON_SAMPLE_EDIT_MINIMIZE = 304, BUTTON_SAMPLE_EDIT_REPSTARTPLUS = 305, BUTTON_SAMPLE_EDIT_REPSTARTMINUS = 306, BUTTON_SAMPLE_EDIT_REPLENPLUS = 307, BUTTON_SAMPLE_EDIT_REPLENMINUS = 308, BUTTON_SAMPLE_UNDO = 310, BUTTON_SAMPLE_REDO = 311, BUTTON_SAMPLE_ZOOM_PLUS = 312, BUTTON_SAMPLE_ZOOM_MINUS = 313, CHECKBOX_SAMPLE_ONESHOT = 314, // INPUT CONTROL INPUT_BUTTON_0 = 400, INPUT_BUTTON_1 = 401, INPUT_BUTTON_2 = 402, INPUT_BUTTON_3 = 403, INPUT_BUTTON_4 = 404, INPUT_BUTTON_5 = 405, INPUT_BUTTON_6 = 406, INPUT_BUTTON_7 = 407, INPUT_BUTTON_8 = 408, INPUT_BUTTON_9 = 409, INPUT_BUTTON_A = 410, INPUT_BUTTON_B = 411, INPUT_BUTTON_C = 412, INPUT_BUTTON_D = 413, INPUT_BUTTON_E = 414, INPUT_BUTTON_F = 415, INPUT_BUTTON_G = 416, INPUT_BUTTON_H = 417, INPUT_BUTTON_I = 418, INPUT_BUTTON_J = 419, INPUT_BUTTON_K = 420, INPUT_BUTTON_L = 421, INPUT_BUTTON_M = 422, INPUT_BUTTON_N = 423, INPUT_BUTTON_O = 424, INPUT_BUTTON_P = 425, INPUT_BUTTON_Q = 426, INPUT_BUTTON_R = 427, INPUT_BUTTON_S = 428, INPUT_BUTTON_T = 429, INPUT_BUTTON_U = 430, INPUT_BUTTON_V = 431, INPUT_BUTTON_W = 432, INPUT_BUTTON_X = 433, INPUT_BUTTON_Y = 434, INPUT_BUTTON_Z = 435, INPUT_BUTTON_DEL = 450, INPUT_BUTTON_INS = 451, INPUT_BUTTON_BACK = 452, INPUT_BUTTON_BACKLINE = 453, INPUT_BUTTON_INSLINE = 454, INPUT_BUTTON_KEYOFF = 455, INPUT_BUTTON_MINUS = 457, INPUT_BUTTON_PLUS = 458, INPUT_BUTTON_BRACKETOPEN = 460, INPUT_BUTTON_BRACKETCLOSE = 461, INPUT_BUTTON_SEMICOLON = 462, INPUT_BUTTON_TICK = 463, INPUT_BUTTON_BACKSLASH = 464, INPUT_BUTTON_TILDE = 465, INPUT_BUTTON_COMMA = 466, INPUT_BUTTON_PERIOD = 467, INPUT_BUTTON_SLASH = 468, INPUT_BUTTON_TAB = 470, INPUT_BUTTON_CAPSLOCK = 471, INPUT_BUTTON_LSHIFT = 472, INPUT_BUTTON_RSHIFT = 473, INPUT_BUTTON_ENTER = 474, INPUT_BUTTON_SPACE = 475, INPUT_BUTTON_SHRINK = 480, INPUT_BUTTON_EXPAND = 481, INPUT_BUTTON_EDIT = 490, INPUT_BUTTON_WTF = 491, STATICTEXT_ENVELOPE_SUSTAINPT = 10500, STATICTEXT_ENVELOPE_LOOPSTARTPT = 10501, STATICTEXT_ENVELOPE_LOOPENDPT = 10502, STATICTEXT_SAMPLE_VOLUME = 10503, STATICTEXT_SAMPLE_PANNING = 10504, STATICTEXT_SAMPLE_FINETUNE = 10505, STATICTEXT_SAMPLE_RELNOTE = 10506, STATICTEXT_SAMPLE_VOLFADE = 10507, STATICTEXT_SAMPLE_VIBSPEED = 10508, STATICTEXT_SAMPLE_VIBDEPTH = 10509, STATICTEXT_SAMPLE_VIBSWEEP = 10510, STATICTEXT_SAMPLE_LENGTH = 10511, STATICTEXT_SAMPLE_DISPLAY = 10512, STATICTEXT_SAMPLE_REPSTART = 10513, STATICTEXT_SAMPLE_REPLENGTH = 10514, STATICTEXT_SAMPLE_PLAYNOTE = 10515, BUTTON_MENU_ITEM_0 = 530, MAINMENU_PLAY_SONG = (BUTTON_MENU_ITEM_0+12), MAINMENU_PLAY_PATTERN = (BUTTON_MENU_ITEM_0+13), MAINMENU_STOP = (BUTTON_MENU_ITEM_0+14), MAINMENU_ZAP = (BUTTON_MENU_ITEM_0+0), MAINMENU_LOAD = (BUTTON_MENU_ITEM_0+1), MAINMENU_SAVE = (BUTTON_MENU_ITEM_0+2), MAINMENU_DISKMENU = (BUTTON_MENU_ITEM_0+3), MAINMENU_INSEDIT = (BUTTON_MENU_ITEM_0+5), MAINMENU_SMPEDIT = (BUTTON_MENU_ITEM_0+4), MAINMENU_ADVEDIT = (BUTTON_MENU_ITEM_0+6), MAINMENU_TRANSPOSE = (BUTTON_MENU_ITEM_0+7), MAINMENU_ABOUT = (BUTTON_MENU_ITEM_0+8), MAINMENU_OPTIMIZE = (BUTTON_MENU_ITEM_0+9), MAINMENU_QUICKOPTIONS = (BUTTON_MENU_ITEM_0+10), MAINMENU_CONFIG = (BUTTON_MENU_ITEM_0+11), MAINMENU_PLAY_POSITION = (BUTTON_MENU_ITEM_0+20), MAINMENU_SAVEAS = (BUTTON_MENU_ITEM_0+21), MAINMENU_EDIT = (BUTTON_MENU_ITEM_0+22), BUTTON_MENU_ITEM_ADDCHANNELS = 560, BUTTON_MENU_ITEM_SUBCHANNELS = 561, BUTTON_ABOUT_SHOWTITLE = 600, BUTTON_ABOUT_SHOWPEAK = 601, BUTTON_ABOUT_SHOWTIME = 602, BUTTON_ABOUT_FOLLOWSONG = 603, BUTTON_ABOUT_PROSPECTIVE = 604, BUTTON_ABOUT_WRAPCURSOR = 605, BUTTON_ABOUT_LIVESWITCH = 606, STATICTEXT_ABOUT_HEADING = 610, STATICTEXT_ABOUT_TIME = 611, BUTTON_ABOUT_ESTIMATESONGLENGTH = 612, BUTTON_TAB_CLOSE = 613, BUTTON_TAB_OPEN = 614, SCROLLBAR_0 = 1000, LISTBOX_SONGTITLE = 2000, LISTBOX_ORDERLIST = 2001, LISTBOX_INSTRUMENTS = 2002, LISTBOX_SAMPLES = 2003, CHECKBOX_0 = 2100, CONTAINER_0 = 3000, CONTAINER_ORDERLIST = 3001, CONTAINER_SPEED = 3002, CONTAINER_PATTERN = 3003, CONTAINER_MENU = 3004, CONTAINER_ABOUT = 3005, CONTAINER_ENVELOPES = 3006, CONTAINER_INSTRUMENTLIST = 3007, // sample info CONTAINER_INSTRUMENTS_INFO1 = 3008, // vibrato info CONTAINER_INSTRUMENTS_INFO2 = 3009, // relative note number CONTAINER_INSTRUMENTS_INFO3 = 3010, CONTAINER_INSTRUMENTS_INFO4 = 3011, CONTAINER_INSTRUMENTS_INFO5 = 3012, CONTAINER_INSTRUMENTS_INFO6 = 3013, CONTAINER_PIANO = 3014, CONTAINER_SAMPLEEDITOR = 3015, CONTAINER_SAMPLE_PLAY = 3016, CONTAINER_SAMPLE_RANGE = 3017, CONTAINER_SAMPLE_EDIT1 = 3018, CONTAINER_SAMPLE_EDIT2 = 3019, CONTAINER_SAMPLE_EDIT3 = 3020, CONTAINER_SAMPLE_EDIT4 = 3021, CONTAINER_SAMPLE_EDIT5 = 3022, CONTAINER_SAMPLE_LOADSAVE = 3024, CONTAINER_SETTINGS = 3025, CONTAINER_TRANSPOSE = 3040, CONTAINER_ADVEDIT = 3041, CONTAINER_LOWRES_MENUSWITCH = 3042, CONTAINER_LOWRES_TINYMENU = 3043, // sample info CONTAINER_LOWRES_JAMMENU = 3044, CONTAINER_INPUTDEFAULT = 3045, CONTAINER_INPUTEXTENDED = 3046, CONTAINER_SAMPLE_ZOOMIN = 3047, CONTAINER_HDRECORDER = 3048, CONTAINER_OPENREMOVETABS = 3049, CONTAINER_ENTIREINSSECTION = 3050, CONTAINER_ENTIRESMPSECTION = 3051, PATTERN_EDITOR = 10000, PIANO_CONTROL = 10001, SAMPLE_EDITOR = 10002, PEAKLEVEL_CONTROL = 10003, SCOPES_CONTROL = 10004, TABHEADER_CONTROL = 10005, MESSAGEBOXZAP_CONTAINER = 20000, INSTRUMENT_CHOOSER_COPY = 21000, INSTRUMENT_CHOOSER_SWAP = 21001, INSTRUMENT_CHOOSER_LIST_SRC = 21101, INSTRUMENT_CHOOSER_LIST_DST = 21102, INSTRUMENT_CHOOSER_LIST_SRC2 = 21103, INSTRUMENT_CHOOSER_LIST_DST2 = 21104, INSTRUMENT_CHOOSER_LIST_SRC3 = 21105, INSTRUMENT_CHOOSER_LIST_DST3 = 21106, INSTRUMENT_CHOOSER_USERSTR1 = 21107, INSTRUMENT_CHOOSER_USERSTR2 = 21108, MESSAGEBOX_UNIVERSAL = 29999, MESSAGEBOX_CONVERTSAMPLE = 30000, MESSAGEBOX_CLEARSAMPLE = 30001, MESSAGEBOX_MINIMIZESAMPLE = 30002, MESSAGEBOX_CROPSAMPLE = 30003, MESSAGEBOX_INSREMAP = 30004, MESSAGEBOX_ZAPINSTRUMENT = 30005, MESSAGEBOX_REALLYQUIT = 30006, MESSAGEBOX_TRANSPOSEPROCEED = 30007, MESSAGEBOX_SAVEPROCEED = 30008, MESSAGEBOX_PANNINGSELECT = 30009 }; #endif milkytracker-0.90.85+dfsg/src/tracker/TrackerSettingsDatabase.cpp0000644000175000017500000000572211150223367024120 0ustar admin2admin2/* * tracker/TrackerSettingsDatabase.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TrackerSettingsDatabase.cpp * MilkyTracker * * Created by Peter Barth on Tue Mar 15 2005. * */ #include "BasicTypes.h" #include "TrackerSettingsDatabase.h" #include "XMFile.h" TrackerSettingsDatabase::TrackerSettingsDatabase(const TrackerSettingsDatabase& source) : dictionary(source.dictionary), maxKeys(source.maxKeys) { } TrackerSettingsDatabase& TrackerSettingsDatabase::operator=(const TrackerSettingsDatabase& source) { if (this != &source) { dictionary = source.dictionary; maxKeys = source.maxKeys; } return *this; } void TrackerSettingsDatabase::store(const PPString& key, const PPString& value) { dictionary.store(key, value); } void TrackerSettingsDatabase::store(const PPString& key, const pp_uint32 value) { dictionary.store(key, value); } bool TrackerSettingsDatabase::hasKey(const PPString& key) { return dictionary.restore(key) != NULL; } PPDictionaryKey* TrackerSettingsDatabase::restore(const PPString& key) { return dictionary.restore(key); } bool TrackerSettingsDatabase::serialize(XMFile& f) { if (f.isOpenForWriting()) { if (maxKeys >= 0 && dictionary.size() > maxKeys) return false; f.writeDword(dictionary.size()); const PPDictionaryKey* theKey = dictionary.getFirstKey(); while (theKey) { f.writeDword(theKey->getKey().length()); f.write(theKey->getKey(), 1, theKey->getKey().length()); f.writeDword(theKey->getStringValue().length()); f.write(theKey->getStringValue(), 1, theKey->getStringValue().length()); theKey = dictionary.getNextKey(); } } else { pp_int32 size = f.readDword(); if (maxKeys >= 0 && size > maxKeys) return false; for (pp_int32 i = 0; i < size; i++) { pp_int32 len = f.readDword(); char* keyBuffer = new char[len+1]; memset(keyBuffer, 0, len+1); f.read(keyBuffer, 1, len); len = f.readDword(); char* valueBuffer = new char[len+1]; memset(valueBuffer, 0, len+1); f.read(valueBuffer, 1, len); store(keyBuffer, valueBuffer); delete[] valueBuffer; delete[] keyBuffer; } } return true; } void TrackerSettingsDatabase::dump() { const PPDictionaryKey* theKey = dictionary.getFirstKey(); while (theKey) { theKey = dictionary.getNextKey(); } } milkytracker-0.90.85+dfsg/src/tracker/EQConstants.h0000644000175000017500000000176211150223367021226 0ustar admin2admin2/* * tracker/EQConstants.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __EQCONSTANTS_H__ #define __EQCONSTANTS_H__ class EQConstants { public: static const float EQ3bands[3]; static const float EQ3bandwidths[3]; static const float EQ10bands[10]; static const float EQ10bandwidths[10]; }; #endif milkytracker-0.90.85+dfsg/src/tracker/SectionSwitcher.h0000755000175000017500000000420311150223367022135 0ustar admin2admin2/* * tracker/SectionSwitcher.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionSwitcher.h * MilkyTracker * * Created by Peter Barth on 09.04.08. * */ #ifndef __SECTIONSWITCHER_H__ #define __SECTIONSWITCHER_H__ #include "BasicTypes.h" class SectionSwitcher { public: enum ActiveBottomSections { ActiveBottomSectionNone = 0, ActiveBottomSectionInstrumentEditor, ActiveBottomSectionSampleEditor }; #ifdef __LOWRES__ enum ActiveLowerSectionPages { ActiveLowerSectionPageMain = 0, ActiveLowerSectionPageSong, ActiveLowerSectionPageInstruments, ActiveLowerSectionPageScopes, ActiveLowerSectionPageJam }; #endif private: class Tracker& tracker; ActiveBottomSections bottomSection; #ifdef __LOWRES__ ActiveLowerSectionPages lowerSectionPage; ActiveLowerSectionPages lastLowerSectionPage; PPSize patternEditorSize; #endif class SectionAbstract* currentUpperSection; public: SectionSwitcher(Tracker& tracker); // General bottom sections show/hide void showBottomSection(ActiveBottomSections section, bool paint = true); void showUpperSection(SectionAbstract* section, bool hideSIP = true); #ifdef __LOWRES__ void showSubMenu(ActiveLowerSectionPages section, bool repaint = true); void showCurrentSubMenu(bool repaint = true) { showSubMenu(lowerSectionPage, repaint); } void switchToSubMenu(ActiveLowerSectionPages lsPageNew); void hideBottomSection(); void updateSubMenusButtons(bool repaint = true); #endif }; #endif milkytracker-0.90.85+dfsg/src/tracker/LogoBig.h0000644000175000017500000000170511150223367020343 0ustar admin2admin2/* * tracker/LogoBig.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef LOGOBIG__H #define LOGOBIG__H #include "BasicTypes.h" class LogoBig { public: static const pp_uint32 width; static const pp_uint32 height; static const pp_uint8 rawData[]; }; #endif milkytracker-0.90.85+dfsg/src/tracker/VRand.cpp0000644000175000017500000000163011150223367020363 0ustar admin2admin2/* * tracker/VRand.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ // Author: Andrew Simper (andy@vellocet.com) // #include "VRand.h" float VPinkNoise[PinkNoiseBins]; VPinkNoiseGlobal dummy_to_init_pink_noise; milkytracker-0.90.85+dfsg/src/tracker/AnimatedFXControl.h0000644000175000017500000000421411150223367022340 0ustar admin2admin2/* * tracker/AnimatedFXControl.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * AnimatedFXControl.h * MilkyTracker * * Created by Peter Barth on 28.10.05. * */ #ifndef ANIMATEDFXCONTROL__H #define ANIMATEDFXCONTROL__H #include "BasicTypes.h" #include "Control.h" #include "Event.h" class AnimatedFXControl : public PPControl { private: static pp_int32 counter; PPColor color; bool border; PPColor ourOwnBorderColor; const PPColor* borderColor; // extent pp_int32 visibleWidth; pp_int32 visibleHeight; class FXAbstract* fx; pp_uint8* vscreen; pp_int32 fxTicker; class PPFont* font; pp_int32 xPos, currentSpeed; pp_int32 currentCharIndex; pp_uint32 textBufferMaxChars; pp_uint32 lastTime; char* textBuffer; char milkyVersionString[100]; void createFX(); public: AnimatedFXControl(pp_int32 id, PPScreen* parentScreen, EventListenerInterface* eventListener, const PPPoint& location, const PPSize& size, bool border = true); virtual ~AnimatedFXControl(); void setColor(pp_int32 r,pp_int32 g,pp_int32 b) { color.r = r; color.g = g; color.b = b; } void setColor(PPColor color) { this->color = color; } void setBorderColor(const PPColor& color) { this->borderColor = &color; } // from PPControl virtual void paint(PPGraphicsAbstract* graphics); virtual pp_int32 dispatchEvent(PPEvent* event); virtual bool receiveTimerEvent() const { return true; } virtual void show(bool bShow); }; #endif milkytracker-0.90.85+dfsg/src/tracker/SIPButtons.h0000644000175000017500000000607611150223367021041 0ustar admin2admin2/* * tracker/SIPButtons.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __SIPBUTTONS_H__ #define __SIPBUTTONS_H__ // ---------------------------- First row of buttons ---------------------------- static const char keyLine_0_lowerCase[] = {'\x60','1','2','3','4','5','6','7','8','9','0','-','='}; static const char keyLine_0_upperCase[] = {'\x60','!','@','#','$','%','^','&','*','(',')','_','+'}; static const pp_int32 keyLineIDs_0[sizeof(keyLine_0_lowerCase)] = {INPUT_BUTTON_WTF, INPUT_BUTTON_1, INPUT_BUTTON_2, INPUT_BUTTON_3, INPUT_BUTTON_4, INPUT_BUTTON_5, INPUT_BUTTON_6, INPUT_BUTTON_7, INPUT_BUTTON_8, INPUT_BUTTON_9, INPUT_BUTTON_0, INPUT_BUTTON_MINUS, INPUT_BUTTON_PLUS}; // ---------------------------- Second row of buttons ---------------------------- static const char keyLine_1_lowerCase[] = {'q','w','e','r','t','y','u','i','o','p','[',']'}; static const char keyLine_1_upperCase[] = {'Q','W','E','R','T','Y','U','I','O','P','{','}'}; static const pp_int32 keyLineIDs_1[sizeof(keyLine_1_lowerCase)] = {INPUT_BUTTON_Q, INPUT_BUTTON_W, INPUT_BUTTON_E, INPUT_BUTTON_R, INPUT_BUTTON_T, INPUT_BUTTON_Y, INPUT_BUTTON_U, INPUT_BUTTON_I, INPUT_BUTTON_O, INPUT_BUTTON_P, INPUT_BUTTON_BRACKETOPEN, INPUT_BUTTON_BRACKETCLOSE}; static const pp_int32 keyLineSizes_1[sizeof(keyLine_1_lowerCase)] = {11,11,11,11,11,11,12,11,11,11,12,12}; // ---------------------------- Third row of buttons ---------------------------- static const char keyLine_2_lowerCase[] = {'a','s','d','f','g','h','j','k','l',';','\'','\\'}; static const char keyLine_2_upperCase[] = {'A','S','D','F','G','H','J','K','L',':','\"','|'}; static const pp_int32 keyLineIDs_2[sizeof(keyLine_2_lowerCase)] = {INPUT_BUTTON_A, INPUT_BUTTON_S, INPUT_BUTTON_D, INPUT_BUTTON_F, INPUT_BUTTON_G, INPUT_BUTTON_H, INPUT_BUTTON_J, INPUT_BUTTON_K, INPUT_BUTTON_L, INPUT_BUTTON_SEMICOLON, INPUT_BUTTON_TICK, INPUT_BUTTON_BACKSLASH}; // ---------------------------- Fourth row of buttons ---------------------------- static const char keyLine_3_lowerCase[] = {'~','z','x','c','v','b','n','m',',','.','/'}; static const char keyLine_3_upperCase[] = {'|','Z','X','C','V','B','N','M','<','>','?'}; static const pp_int32 keyLineIDs_3[sizeof(keyLine_3_lowerCase)] = {INPUT_BUTTON_TILDE, INPUT_BUTTON_Z, INPUT_BUTTON_X, INPUT_BUTTON_C, INPUT_BUTTON_V, INPUT_BUTTON_B, INPUT_BUTTON_N, INPUT_BUTTON_M, INPUT_BUTTON_COMMA, INPUT_BUTTON_PERIOD, INPUT_BUTTON_SLASH}; #endif milkytracker-0.90.85+dfsg/src/tracker/ModuleEditor.cpp0000644000175000017500000015052711150223367021757 0ustar admin2admin2/* * tracker/ModuleEditor.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "ModuleEditor.h" #include "PatternEditor.h" #include "SampleEditor.h" #include "EnvelopeEditor.h" #include "ModuleServices.h" #include "PlayerCriticalSection.h" #include "TrackerConfig.h" #include "PPSystem.h" static const char validCharacters[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_!."; #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif // convert string static mp_sint32 convertStr(SYSCHAR* buffer, char* src) { mp_sint32 j = 0; for (mp_sint32 i = 0; i < MP_MAXTEXT; i++) { if (src[i] == '\0') break; bool found = false; for (mp_sint32 k = 0; k < (signed)(sizeof(validCharacters)/sizeof(char))-1; k++) if (src[i] == validCharacters[k]) { found = true; break; } if (found) buffer[j++] = src[i]; } buffer[j] = '\0'; return j; } class ChangesListener : public EditorBase::EditorNotificationListener { private: virtual void editorNotification(EditorBase* sender, EditorBase::EditorNotifications notification) { switch (notification) { case EditorBase::NotificationChanges: { if (sender == moduleEditor.sampleEditor) moduleEditor.finishSamples(); moduleEditor.setChanged(); break; } case EditorBase::NotificationPrepareCritical: moduleEditor.enterCriticalSection(); break; case EditorBase::NotificationUnprepareCritical: moduleEditor.leaveCriticalSection(); break; } } ModuleEditor& moduleEditor; public: ChangesListener(ModuleEditor& moduleEditor) : moduleEditor(moduleEditor) { } }; ModuleEditor::ModuleEditor() : module(NULL), patternEditor(NULL), sampleEditor(NULL), envelopeEditor(NULL), playerCriticalSection(NULL), changed(false), eSaveType(ModSaveTypeXM), lastRequestedPatternIndex(0), currentOrderIndex(0), currentPatternIndex(0), currentInstrumentIndex(0), currentSampleIndex(0), enumerationIndex(-1) { instruments = new TEditorInstrument[MAX_INSTRUMENTS]; moduleFileName = TrackerConfig::untitledSong; // no extension here adjustExtension(false); module = new XModule(); createNewSong(); changesListener = new ChangesListener(*this); // create pattern editor patternEditor = new PatternEditor(); patternEditor->addNotificationListener(changesListener); reloadCurrentPattern(); // create sample editor sampleEditor = new SampleEditor(); sampleEditor->addNotificationListener(changesListener); reloadSample(0, 0); // create envelope editor envelopeEditor = new EnvelopeEditor(); envelopeEditor->addNotificationListener(changesListener); envelopeEditor->attachEnvelope(NULL, module); moduleServices = new ModuleServices(*module); currentCursorPosition.row = currentCursorPosition.channel = currentCursorPosition.inner = 0; } ModuleEditor::~ModuleEditor() { delete moduleServices; delete sampleEditor; delete patternEditor; delete envelopeEditor; // must be deleted AFTER the editors delete changesListener; delete module; delete[] instruments; } PPSystemString ModuleEditor::getModuleFileNameFull(ModSaveTypes extension/* = ModSaveTypeDefault*/) { PPSystemString s = moduleFileName; PPSystemString s2; if (extension != ModSaveTypeDefault) { ModSaveTypes eOldType = eSaveType; eSaveType = extension; adjustExtension(); eSaveType = eOldType; } s2 = moduleFileName; moduleFileName = s; return s2; } PPSystemString ModuleEditor::getModuleFileName(ModSaveTypes extension/* = ModSaveTypeDefault*/) { PPSystemString s = getModuleFileNameFull(extension); return s.stripPath(); } void ModuleEditor::reloadCurrentPattern() { TXMPattern* pattern = patternEditor->getPattern(); if (pattern && pattern->patternData && pattern->channum == TrackerConfig::numPlayerChannels && module && pattern == &module->phead[getCurrentPatternIndex()]) return; patternEditor->attachPattern(getPattern(getCurrentPatternIndex()), module); } void ModuleEditor::reloadSample(mp_sint32 insIndex, mp_sint32 smpIndex) { sampleEditor->attachSample(getSampleInfo(insIndex, smpIndex), module); } void ModuleEditor::reloadEnvelope(mp_sint32 insIndex, mp_sint32 smpIndex, mp_sint32 type) { envelopeEditor->attachEnvelope(getEnvelope(insIndex, smpIndex, type), module); } void ModuleEditor::enterCriticalSection() { if (playerCriticalSection) playerCriticalSection->enter(); } void ModuleEditor::leaveCriticalSection() { if (playerCriticalSection) playerCriticalSection->leave(); } void ModuleEditor::adjustExtension(bool hasExtension/* = true*/) { if (hasExtension) moduleFileName = moduleFileName.stripExtension(); switch (eSaveType) { case ModSaveTypeXM: moduleFileName.append(".xm"); break; case ModSaveTypeMOD: moduleFileName.append(".mod"); break; default: ASSERT(false); } } void ModuleEditor::convertInstrument(mp_sint32 i) { mp_sint32 j,k; TXMInstrument* ins = &module->instr[i]; instruments[i].instrument = ins; instruments[i].numUsedSamples = 16; for (j = 0; j < 16; j++) instruments[i].usedSamples[j] = i*16+j; // build FT2 compatible note->sample LUT for (j = 0; j < MAX_NOTE; j++) { mp_sword s = ins->snum[j]; // empty entry if (s == -1) { instruments[i].nbu[j] = /*255*/0; ins->snum[j] = i*16; continue; } bool found = false; for (k = 0; k < 16; k++) if (i*16+k == s) { instruments[i].nbu[j] = k; found = true; break; } if (!found) { instruments[i].nbu[j] = /*255*/0; ins->snum[j] = i*16; //exit(1); } } if (ins->samp) { // take default envelope from first sample in instrument mp_sint32 venvIndex = module->smp[i*16].venvnum - 1; if (venvIndex == -1) { for (mp_sint32 e = 0; e < module->header.volenvnum; e++) { bool used = false; for (mp_sint32 s = 0; s < module->header.smpnum; s++) { if (module->smp[s].venvnum - 1 == e) { used = true; break; } } if (!used) { venvIndex = e; break; } } } if (venvIndex == -1) { TEnvelope venv; memset(&venv, 0, sizeof(venv)); venv.type = 0; venv.num = 2; venv.loops = 0; venv.loope = 1; venv.sustain = 0; venv.env[0][0] = 0; venv.env[0][1] = 256; venv.env[1][0] = 32; venv.env[1][1] = 256; module->addVolumeEnvelope(venv); venvIndex = module->numVEnvs - 1; module->header.volenvnum = module->numVEnvs; } instruments[i].volumeEnvelope = venvIndex; // same for panning envelope index mp_sint32 penvIndex = module->smp[i*16].penvnum - 1; if (penvIndex == -1) { for (mp_sint32 e = 0; e < module->header.panenvnum; e++) { bool used = false; for (mp_sint32 s = 0; s < module->header.smpnum; s++) { if (module->smp[s].penvnum - 1 == e) { used = true; break; } } if (!used) { penvIndex = e; break; } } } if (penvIndex == -1) { TEnvelope penv; memset(&penv, 0, sizeof(penv)); penv.type=0; penv.num=2; penv.loops=0; penv.loope=1; penv.sustain = 0; penv.env[0][0]=0; penv.env[0][1]=128; penv.env[1][0]=32; penv.env[1][1]=128; module->addPanningEnvelope(penv); penvIndex = module->numPEnvs - 1; module->header.panenvnum = module->numPEnvs; } instruments[i].panningEnvelope = penvIndex; mp_sint32 s = instruments[i].usedSamples[0]; // take all fadeout/autovibrato settings from first sample in instrument instruments[i].volfade = module->smp[s].volfade >> 1; instruments[i].vibtype = module->smp[s].vibtype; instruments[i].vibrate = module->smp[s].vibrate; instruments[i].vibdepth = module->smp[s].vibdepth >> 1; instruments[i].vibsweep = module->smp[s].vibsweep; } else { for (j = 0; j < MAX_NOTE; j++) ins->snum[j] = i*16; mp_sint32 e; mp_sint32 venvIndex = - 1; for (e = 0; e < module->header.volenvnum; e++) { bool used = false; for (mp_sint32 s = 0; s < module->header.smpnum; s++) { if (module->smp[s].venvnum - 1 == e) { used = true; break; } } if (!used) { venvIndex = e; break; } } if (venvIndex == -1) { TEnvelope venv; memset(&venv, 0, sizeof(venv)); venv.type=0; venv.num=2; venv.loops=0; venv.loope=1; venv.sustain = 0; venv.env[0][0]=0; venv.env[0][1]=256; venv.env[1][0]=32; venv.env[1][1]=256; module->addVolumeEnvelope(venv); venvIndex = module->numVEnvs - 1; module->header.volenvnum = module->numVEnvs; } instruments[i].volumeEnvelope = venvIndex; mp_sint32 penvIndex = - 1; for (e = 0; e < module->header.panenvnum; e++) { bool used = false; for (mp_sint32 s = 0; s < module->header.smpnum; s++) { if (module->smp[s].penvnum - 1 == e) { used = true; break; } } if (!used) { penvIndex = e; break; } } if (penvIndex == -1) { TEnvelope penv; memset(&penv, 0, sizeof(penv)); penv.type=0; penv.num=2; penv.loops=0; penv.loope=1; penv.sustain = 0; penv.env[0][0]=0; penv.env[0][1]=128; penv.env[1][0]=32; penv.env[1][1]=128; module->addPanningEnvelope(penv); penvIndex = module->numPEnvs - 1; module->header.panenvnum = module->numPEnvs; } instruments[i].panningEnvelope = penvIndex; //----------------------------------------------------------- // this will only work if there are 16 sample per instrument //----------------------------------------------------------- for (j = 0; j < 16; j++) { module->smp[i*16+j].venvnum = venvIndex + 1; module->smp[i*16+j].penvnum = penvIndex + 1; // default fade out to cut module->smp[i*16+j].volfade = 0xFFFF; } instruments[i].volfade = 0xFFFF >> 1; instruments[i].vibtype = 0; instruments[i].vibrate = 0; instruments[i].vibdepth = 0; instruments[i].vibsweep = 0; } for (j = 0; j < 16; j++) { if (!module->smp[i*16+j].sample) { module->smp[i*16+j].vol = 0xFF; module->smp[i*16+j].pan = 0x80; } } } void ModuleEditor::buildInstrumentTable() { mp_sint32 i,j; for (i = 0; i < MAX_INSTRUMENTS; i++) { instruments[i].instrument = NULL; instruments[i].numUsedSamples = 0; for (j = 0; j < 16; j++) instruments[i].usedSamples[j] = -1; instruments[i].volumeEnvelope = instruments[i].panningEnvelope = -1; memset(instruments[i].nbu, 0, MAX_NOTE); } for (i = 0; i < module->header.insnum; i++) { convertInstrument(i); } validateInstruments(); } void ModuleEditor::validateInstruments() { for (mp_sint32 i = 0; i < module->header.insnum; i++) { mp_sint32 lastUsedInstrument = -1; for (mp_sint32 j = 15; j >= 0; j--) { mp_sint32 s = instruments[i].usedSamples[j]; if (module->smp[s].sample) { lastUsedInstrument = j; } module->smp[s].flags = 3; } instruments[i].instrument->samp = 16; } } bool ModuleEditor::allocatePattern(TXMPattern* pattern) { // create empty pattern pattern->channum = (mp_ubyte)/*numChannels*/TrackerConfig::numPlayerChannels; pattern->rows = 64; // create XM style pattern, two effects pattern->effnum = 2; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 patternSize = slotSize * pattern->channum * pattern->rows; pattern->patternData = new mp_ubyte[patternSize]; if (pattern->patternData == NULL) return false; memset(pattern->patternData, 0, patternSize); return true; } void ModuleEditor::createEmptySong(bool clearPatterns/* = true*/, bool clearInstruments/* = true*/, mp_sint32 numChannels/* = 8*/) { if (module) { enterCriticalSection(); setCurrentOrderIndex(0); setCurrentPatternIndex(0); module->createEmptySong(clearPatterns, clearInstruments, numChannels); if (clearPatterns && clearInstruments) { changed = false; eSaveType = ModSaveTypeXM; moduleFileName = TrackerConfig::untitledSong; // no extension adjustExtension(false); } else { changed = true; } buildInstrumentTable(); lastRequestedPatternIndex = 0; leaveCriticalSection(); } } bool ModuleEditor::createNewSong(mp_uword numChannels/*= 8*/) { module->createEmptySong(true, true, numChannels); changed = false; eSaveType = ModSaveTypeXM; moduleFileName = TrackerConfig::untitledSong; // no extension adjustExtension(false); buildInstrumentTable(); lastRequestedPatternIndex = 0; return true; } bool ModuleEditor::isEmpty() const { mp_sint32 patNum = module->header.patnum; if (patNum != 1) return false; TXMPattern* pattern = &module->phead[0]; if (pattern->patternData != NULL) { mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 patternSize = slotSize * pattern->channum * pattern->rows; bool empty = true; for (mp_sint32 j = 0; j < patternSize; j++) if (pattern->patternData[j]) { empty = false; break; } if (!empty) return false; } // step two, find last used instrument mp_sint32 insNum = module->getNumUsedInstruments(); if (insNum) return false; char temp[MAX_TITLETEXT+1]; memset(temp, 0, sizeof(temp)); getTitle(temp, MAX_TITLETEXT); if (strlen(temp)) return true; return true; } bool ModuleEditor::openSong(const SYSCHAR* fileName, const SYSCHAR* preferredFileName/* = NULL*/) { if (!XMFile::exists(fileName)) return false; mp_sint32 nRes = module->loadModule(fileName); // unknown format if (nRes == -9) { return false; } bool res = (nRes == 0); XModule::ModuleTypes type = XModule::ModuleType_NONE; if (module->getType() != XModule::ModuleType_XM) { type = module->getType(); mp_ubyte oneShotFlags[MAX_INSTRUMENTS]; // save flags for one shot PT style looping, it will be stripped out // when exporting to XM if (type == XModule::ModuleType_MOD) { memset(oneShotFlags, 0, sizeof(oneShotFlags)); for (mp_sint32 i = 0; i < module->header.insnum; i++) { mp_sint32 snum = module->instr[i].snum[0]; if (snum >= 0) { oneShotFlags[i] = module->smp[snum].type & 32; } } } PPSystemString tempFile(getTempFilename()); res = module->saveExtendedModule(tempFile) == 0; if (!res) return res; res = module->loadModule(tempFile) == 0; // restore one shot looping flag if (type == XModule::ModuleType_MOD) { for (mp_sint32 i = 0; i < module->header.insnum; i++) { mp_sint32 snum = module->instr[i].snum[0]; if (snum >= 0) { if (oneShotFlags[i]) module->smp[snum].type |= 32; } } } XMFile::remove(tempFile); } if (module->header.channum > TrackerConfig::numPlayerChannels) res = false; lastRequestedPatternIndex = 0; if (res) { changed = false; buildInstrumentTable(); // expand patterns to 32 channels width for (mp_sint32 i = 0; i < module->header.patnum; i++) getPattern(i); PPSystemString strFileName = preferredFileName ? preferredFileName : fileName; moduleFileName = strFileName.stripExtension(); if (type == XModule::ModuleType_MOD) eSaveType = ModSaveTypeMOD; else eSaveType = ModSaveTypeXM; // no extension adjustExtension(false); } else { createNewSong(); } cleanUnusedPatterns(); return res; } bool ModuleEditor::saveSong(const SYSCHAR* fileName, ModSaveTypes saveType/* = eXM*/) { // too risky //cleanUnusedPatterns(); bool res = false; switch (saveType) { case ModSaveTypeXM: res = module->saveExtendedModule(fileName) == 0; break; case ModSaveTypeMOD: res = module->saveProtrackerModule(fileName) == 0; break; } eSaveType = saveType; moduleFileName = fileName; // has extension adjustExtension(); changed = false; return res; } void ModuleEditor::saveBackup(const SYSCHAR* fileName) { module->saveExtendedModule(fileName); } void ModuleEditor::increaseSongLength() { if (module->header.ordnum < 255) { module->header.ordnum++; changed = true; } } void ModuleEditor::decreaseSongLength() { if (module->header.ordnum > 1) { module->header.ordnum--; changed = true; } } void ModuleEditor::increaseRepeatPos() { mp_uword old = module->header.restart; if (module->header.restart < 255) module->header.restart++; if (module->header.restart >= module->header.ordnum) module->header.restart = module->header.ordnum - 1; if (old != module->header.restart) changed = true; } void ModuleEditor::decreaseRepeatPos() { if (module->header.restart > 0) { module->header.restart--; changed = true; } } bool ModuleEditor::insertNewOrderPosition(mp_sint32 index) { if (module->header.ordnum >= 255) return false; mp_ubyte temp[256]; mp_sint32 i; for (i = 0; i <= index; i++) temp[i] = module->header.ord[i]; temp[index+1] = module->header.ord[index]; for (i = index+2; i <= module->header.ordnum; i++) temp[i] = module->header.ord[i-1]; module->header.ordnum++; memcpy(module->header.ord, temp, module->header.ordnum); changed = true; return true; } void ModuleEditor::deleteOrderPosition(mp_sint32 index) { if (index < module->header.ordnum && module->header.ordnum > 1) { for (mp_sint32 i = index; i < module->header.ordnum - 1; i++) module->header.ord[i] = module->header.ord[i+1]; module->header.ordnum--; changed = true; } } bool ModuleEditor::seqCurrentOrderPosition(mp_sint32 index, bool clone/* = false*/) { mp_sint32 i; if (module->header.ordnum >= 255) return false; pp_int32 srcPatternIndex = module->header.ord[index]; mp_sint32 highestPattern = module->header.ord[0]; for (i = 1; i < module->header.ordnum; i++) if (module->header.ord[i] > highestPattern) highestPattern = module->header.ord[i]; mp_ubyte temp[256]; for (i = 0; i <= index; i++) temp[i] = module->header.ord[i]; temp[index+1] = /*module->header.ord[index] + 1*/highestPattern+1; pp_int32 dstPatternIndex = highestPattern+1; for (i = index+2; i <= module->header.ordnum; i++) temp[i] = module->header.ord[i-1]; module->header.ordnum++; memcpy(module->header.ord, temp, module->header.ordnum); if (clone) { // now clone pattern module->phead[dstPatternIndex] = module->phead[srcPatternIndex]; } changed = true; return true; } mp_sint32 ModuleEditor::getOrderPosition(mp_sint32 index) const { return module->header.ord[index]; } void ModuleEditor::increaseOrderPosition(mp_sint32 index) { if (module->header.ord[index] < 255) { module->header.ord[index]++; changed = true; } } void ModuleEditor::decreaseOrderPosition(mp_sint32 index) { if (module->header.ord[index] > 0) { module->header.ord[index]--; changed = true; } } bool ModuleEditor::isEditingOrderPosition(mp_sint32 index) const { if (index < 0 || index >= module->header.ordnum) return false; return patternEditor->getPattern() == &module->phead[module->header.ord[index]]; } void ModuleEditor::cleanUnusedPatterns() { if (!module) return; for (mp_sint32 i = module->header.patnum - 1; i > lastRequestedPatternIndex; i--) { TXMPattern* pattern = &module->phead[i]; if (pattern->patternData == NULL) continue; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 patternSize = slotSize * pattern->channum * pattern->rows; bool empty = true; for (mp_sint32 j = 0; j < patternSize; j++) if (pattern->patternData[j]) { empty = false; break; } if (empty) { bool found = false; for (mp_sint32 j = 0; j < module->header.ordnum; j++) if (module->header.ord[j] == i) { found = true; break; } if (found) break; delete[] pattern->patternData; memset(pattern, 0, sizeof(TXMPattern)); module->header.patnum = i; } else { break; } } } /////////////////////////////////////////////////////////////////////////// // Whenever a pattern is requested we will return a pattern that is // 32 channels wide, this makes adding/subtracting channels easier // without losing data in that channel // When another pattern pattern is selected we will discard unused channels /////////////////////////////////////////////////////////////////////////// TXMPattern* ModuleEditor::getPattern(mp_sint32 index, bool cleanUnusedPatterns/* = true*/) { lastRequestedPatternIndex = index; // handle with care, this might throw away patterns while the player // is using them if (cleanUnusedPatterns) this->cleanUnusedPatterns(); // get requested pattern, allocate one if it's empty TXMPattern* pattern = &module->phead[index]; if (pattern->patternData == NULL) { bool res = allocatePattern(pattern); if (!res) return NULL; } // if the number of channels in this pattern is // smaller then 32 we resize to 32 channels if (pattern->channum < TrackerConfig::numPlayerChannels) { mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 patternSize = slotSize * TrackerConfig::numPlayerChannels * pattern->rows; mp_ubyte* newPatternData = new mp_ubyte[patternSize]; memset(newPatternData, 0, patternSize); for (mp_sint32 i = 0; i < pattern->rows; i++) { mp_sint32 srcOffset = i * slotSize * pattern->channum; mp_sint32 dstOffset = i * slotSize * TrackerConfig::numPlayerChannels; for (mp_sint32 j = 0; j < slotSize * pattern->channum; j++) newPatternData[dstOffset++] = pattern->patternData[srcOffset++]; } delete[] pattern->patternData; pattern->patternData = newPatternData; pattern->channum = (mp_ubyte)TrackerConfig::numPlayerChannels; } // update number of patterns in module header if necessary if (module->header.patnum < index + 1) module->header.patnum = index + 1; return pattern; } mp_sint32 ModuleEditor::allocateSample(mp_sint32 index) { return 0; if (index < 0) return -1; if (index >= module->header.insnum) return -1; // sorry, XM can only handle 16 samples per instrument if (instruments[index].numUsedSamples >= 16) return -1; // look if we can find an unused sample mp_sint32 s = -1; for (mp_sint32 i = 0; i < module->header.smpnum; i++) { bool used = false; //if (module->smp[i].sample == NULL && module->smp[i].samplen == 0) //{ for (mp_sint32 j = 0; j < module->header.insnum; j++) { for (mp_sint32 k = 0; k < instruments[j].numUsedSamples; k++) { if (instruments[j].usedSamples[k] == i) { used = true; break; } } if (used) break; } //} //else // used = true; if (!used) { s = i; break; } } if (s == -1) { if (module->header.smpnum >= 254) return -2; s = module->header.smpnum++; } if (module->smp[s].sample) { module->freeSampleMem((mp_ubyte*)module->smp[s].sample); module->smp[s].sample = NULL; } if (!instruments[index].numUsedSamples) { for (mp_sint32 i = 0; i < MAX_NOTE; i++) { module->instr[index].snum[i] = s; instruments[index].nbu[i] = 0; } } strcpy((char*)module->smp[s].name,""); module->smp[s].venvnum = instruments[index].volumeEnvelope + 1; module->smp[s].penvnum = instruments[index].panningEnvelope + 1; instruments[index].usedSamples[instruments[index].numUsedSamples++] = s; return 0; } void ModuleEditor::finishSamples() { module->postProcessSamples(); } mp_sint32 ModuleEditor::allocateInstrument() { if (module->header.insnum >= 255) return -1; enterCriticalSection(); mp_sint32 i = module->header.insnum++; module->header.smpnum+=16; convertInstrument(i); validateInstruments(); leaveCriticalSection(); changed = true; return 0; } // free sample void ModuleEditor::freeSample(mp_sint32 index) { return; if (index < 0) return; if (index >= module->header.insnum) return; if (instruments[index].numUsedSamples) { instruments[index].usedSamples[--instruments[index].numUsedSamples] = -1; mp_sint32 i; mp_ubyte* nbu = instruments[index].nbu; for (i = 0; i < MAX_NOTE; i++) if (nbu[i] == instruments[index].numUsedSamples) nbu[i] = 255; for (i = 0; i < MAX_NOTE; i++) { if (nbu[i] != 255) module->instr[index].snum[i] = instruments[index].usedSamples[nbu[i]]; else module->instr[index].snum[i] = 255; } } } void ModuleEditor::clearSample(mp_sint32 smpIndex) { if (smpIndex >= 0 && smpIndex < MP_MAXSAMPLES) { TXMSample* dst = &module->smp[smpIndex]; module->freeSampleMem((mp_ubyte*)dst->sample); dst->sample = NULL; dst->samplen = 0; dst->loopstart = 0; dst->looplen = 0; changed = true; } } void ModuleEditor::clearSample(mp_sint32 insIndex, mp_sint32 smpIndex) { if (insIndex < module->header.insnum && smpIndex < 16) { mp_sint32 s = instruments[insIndex].usedSamples[smpIndex]; clearSample(s); } } bool ModuleEditor::loadSample(const SYSCHAR* fileName, mp_sint32 insIndex, mp_sint32 smpIndex, mp_sint32 channelIndex, const SYSCHAR* preferredFileName/* = NULL*/) { PPSystemString sysPreferredName(preferredFileName ? preferredFileName : fileName); sysPreferredName = sysPreferredName.stripPath(); char* preferredNameASCIIZ = sysPreferredName.toASCIIZ(); PPString preferredName(preferredNameASCIIZ); delete[] preferredNameASCIIZ; SampleLoaderGeneric sampleLoader(fileName, *module); sampleLoader.setPreferredDefaultName(preferredName); if (insIndex < module->header.insnum && smpIndex < 16) { enterCriticalSection(); bool res = sampleLoader.loadSample(instruments[insIndex].usedSamples[smpIndex], channelIndex) == 0; if (res) { TXMSample* dst = &module->smp[instruments[insIndex].usedSamples[smpIndex]]; ASSERT(dst); // default values first dst->flags = 3; dst->venvnum = instruments[insIndex].volumeEnvelope+1; dst->penvnum = instruments[insIndex].panningEnvelope+1; dst->fenvnum = dst->vibenvnum = 0; dst->vibtype = instruments[insIndex].vibtype; dst->vibsweep = instruments[insIndex].vibsweep; dst->vibdepth = instruments[insIndex].vibdepth << 1; dst->vibrate = instruments[insIndex].vibrate; dst->volfade = instruments[insIndex].volfade << 1; finishSamples(); validateInstruments(); changed = true; } leaveCriticalSection(); return res; } return false; } mp_sint32 ModuleEditor::getNumSampleChannels(const SYSCHAR* fileName) { SampleLoaderGeneric sampleLoader(fileName, *module); return sampleLoader.getNumChannels(); } // get name of channel in sample as returned by sample loader const char* ModuleEditor::getNameOfSampleChannel(const SYSCHAR* fileName, mp_sint32 index) { SampleLoaderGeneric sampleLoader(fileName, *module); return sampleLoader.getChannelName(index); } bool ModuleEditor::saveSample(const SYSCHAR* fileName, mp_sint32 insIndex, mp_sint32 smpIndex, SampleFormatTypes format) { SampleLoaderGeneric sampleLoader(fileName, *module); if (insIndex < module->header.insnum && smpIndex < 16) { bool res = false; switch (format) { case SampleFormatTypeWAV: res = sampleLoader.saveSample(fileName, instruments[insIndex].usedSamples[smpIndex], SampleLoaderGeneric::OutputFiletypeWAV) == 0; break; case SampleFormatTypeIFF: res = sampleLoader.saveSample(fileName, instruments[insIndex].usedSamples[smpIndex], SampleLoaderGeneric::OutputFiletypeIFF) == 0; break; } return res; } return false; } const PPSystemString& ModuleEditor::getSampleFileName(mp_sint32 insIndex, mp_sint32 smpIndex) { SYSCHAR buffer[MP_MAXTEXT+1]; memset(buffer, 0, sizeof(buffer)); TXMSample* smp = getSampleInfo(insIndex,smpIndex); mp_sint32 len = convertStr(buffer, smp->name); if (!len) sampleFileName = getInstrumentFileName(insIndex); else { sampleFileName = buffer; sampleFileName = sampleFileName.stripExtension(); } return sampleFileName; } // free last instrument void ModuleEditor::freeInstrument() { if (module->header.insnum <= 1) return; enterCriticalSection(); for (mp_sint32 j = 0; j < 16; j++) instruments[module->header.insnum].usedSamples[j] = -1; instruments[module->header.insnum].volumeEnvelope = -1; instruments[module->header.insnum].panningEnvelope = -1; memset(instruments[module->header.insnum].nbu, 0, MAX_NOTE); module->header.insnum--; module->header.smpnum-=16; leaveCriticalSection(); changed = true; } bool ModuleEditor::insertXIInstrument(mp_sint32 index, const XIInstrument* ins) { ASSERT(index < module->header.insnum); mp_sint32 j; ASSERT(instruments[index].numUsedSamples == 16); memcpy(instruments[index].nbu, ins->nbu, MAX_NOTE); for (j = 0; j < MAX_NOTE; j++) instruments[index].instrument->snum[j] = index*16 + ins->nbu[j]; memcpy(instruments[index].instrument->name, ins->name, MAX_INSTEXT); instruments[index].instrument->samp = ins->numsamples; memcpy(&module->venvs[instruments[index].volumeEnvelope], &ins->venv, sizeof(ins->venv)); memcpy(&module->penvs[instruments[index].panningEnvelope], &ins->penv, sizeof(ins->penv)); instruments[index].volfade = ins->volfade>>1; instruments[index].vibtype = ins->vibtype; instruments[index].vibrate = ins->vibrate; instruments[index].vibdepth = ins->vibdepth>>1; instruments[index].vibsweep = ins->vibsweep; // Wipe samples first for (j = 0; j < 16; j++) { mp_sint32 s = instruments[index].usedSamples[j]; TXMSample* smp = &module->smp[s]; if (smp->sample) { module->freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->vol = 255; smp->pan = 0x80; smp->finetune = 0; smp->relnote = 0; smp->looplen = smp->loopstart = smp->samplen = 0; smp->flags = smp->type = 0; memset(smp->name, 0, sizeof(smp->name)); } for (j = 0; j < ins->numsamples; j++) { mp_sint32 s = instruments[index].usedSamples[j]; // 16 bit samples if (ins->samples[j].samplen && ins->samples[j].sample) { if (ins->samples[j].type & 16) { module->smp[s].sample = (mp_sbyte*)module->allocSampleMem(ins->samples[j].samplen*2); if (module->smp[s].sample == NULL) return false; TXMSample::copyPaddedMem(module->smp[s].sample, ins->samples[j].sample, ins->samples[j].samplen*2); } else { module->smp[s].sample = (mp_sbyte*)module->allocSampleMem(ins->samples[j].samplen); if (module->smp[s].sample == NULL) return false; TXMSample::copyPaddedMem(module->smp[s].sample, ins->samples[j].sample, ins->samples[j].samplen); } } const TXMSample* src = &ins->samples[j]; TXMSample* dst = &module->smp[s]; // default values first dst->flags = 3; dst->venvnum = instruments[index].volumeEnvelope+1; dst->penvnum = instruments[index].panningEnvelope+1; dst->fenvnum = dst->vibenvnum = 0; // copy from original instrument dst->samplen = src->samplen; dst->loopstart = src->loopstart; dst->looplen = src->looplen; dst->vol = src->vol; dst->finetune = src->finetune; dst->type = src->type; dst->pan = src->pan; dst->relnote = src->relnote; dst->vibtype = src->vibtype; dst->vibsweep = src->vibsweep; dst->vibdepth = src->vibdepth; dst->vibrate = src->vibrate; dst->volfade = src->volfade; memcpy(dst->name, src->name, sizeof(dst->name)); } changed = true; return true; } XIInstrument* ModuleEditor::extractXIInstrument(mp_sint32 index) { ASSERT(index < module->header.insnum); XIInstrument* ins = new XIInstrument(); if (ins == NULL) return NULL; mp_sint32 j; ASSERT(instruments[index].numUsedSamples == 16); memcpy(ins->nbu, instruments[index].nbu, MAX_NOTE); memcpy(ins->name, instruments[index].instrument->name, MAX_INSTEXT); ins->numsamples = 16; memcpy(&ins->venv, &module->venvs[instruments[index].volumeEnvelope], sizeof(ins->venv)); memcpy(&ins->penv, &module->penvs[instruments[index].panningEnvelope], sizeof(ins->penv)); ins->volfade = instruments[index].volfade<<1; ins->vibtype = instruments[index].vibtype; ins->vibrate = instruments[index].vibrate; ins->vibdepth = instruments[index].vibdepth<<1; ins->vibsweep = instruments[index].vibsweep; for (j = 0; j < ins->numsamples; j++) { mp_sint32 s = instruments[index].usedSamples[j]; TXMSample* dst = &ins->samples[j]; TXMSample* src = &module->smp[s]; // default values first dst->flags = 3; dst->venvnum = instruments[index].volumeEnvelope+1; dst->penvnum = instruments[index].panningEnvelope+1; dst->fenvnum = dst->vibenvnum = 0; // copy from original instrument dst->samplen = src->samplen; dst->loopstart = src->loopstart; dst->looplen = src->looplen; dst->vol = src->vol; dst->finetune = src->finetune; dst->type = src->type; dst->pan = src->pan; dst->relnote = src->relnote; dst->sample = src->sample; dst->vibtype = src->vibtype; dst->vibsweep = src->vibsweep; dst->vibdepth = src->vibdepth; dst->vibrate = src->vibrate; dst->volfade = src->volfade; memcpy(dst->name, src->name, sizeof(dst->name)); } return ins; } bool ModuleEditor::loadInstrument(const SYSCHAR* fileName, mp_sint32 index) { ASSERT(index < module->header.insnum); XIInstrument* ins = new XIInstrument(); bool res = ins->load(fileName) == 0; if (res) { res = insertXIInstrument(index, ins); finishSamples(); validateInstruments(); } delete ins; return res; } bool ModuleEditor::saveInstrument(const SYSCHAR* fileName, mp_sint32 index) { ASSERT(index < module->header.insnum); XIInstrument* ins = extractXIInstrument(index); bool res = true; if (ins) { ins->save(fileName); } return res; } bool ModuleEditor::zapInstrument(mp_sint32 index) { ASSERT(index < module->header.insnum); enterCriticalSection(); XIInstrument ins; bool res = insertXIInstrument(index, &ins); finishSamples(); validateInstruments(); leaveCriticalSection(); changed = true; return res; } const PPSystemString& ModuleEditor::getInstrumentFileName(mp_sint32 index) { SYSCHAR buffer[MP_MAXTEXT+1]; memset(buffer, 0, sizeof(buffer)); TEditorInstrument* ins = getInstrumentInfo(index); mp_sint32 len = convertStr(buffer, ins->instrument->name); if (!len) instrumentFileName = "Untitled"; else { instrumentFileName = buffer; instrumentFileName = instrumentFileName.stripExtension(); } return instrumentFileName; } bool ModuleEditor::copyInstrument(ModuleEditor& dstModule, mp_sint32 dstIndex, ModuleEditor& srcModule, mp_sint32 srcIndex) { ASSERT(srcIndex < srcModule.module->header.insnum); ASSERT(dstIndex < dstModule.module->header.insnum); XIInstrument* srcIns = srcModule.extractXIInstrument(srcIndex); if (!srcIns) return false; XIInstrument* dstIns = new XIInstrument(*srcIns); if (!dstIns) { delete srcIns; return false; } dstModule.enterCriticalSection(); bool res = dstModule.insertXIInstrument(dstIndex, dstIns); if (res) { dstModule.finishSamples(); dstModule.validateInstruments(); } delete dstIns; delete srcIns; dstModule.leaveCriticalSection(); return res; } bool ModuleEditor::swapInstruments(ModuleEditor& dstModule, mp_sint32 dstIndex, ModuleEditor& srcModule, mp_sint32 srcIndex) { ASSERT(srcIndex < srcModule.module->header.insnum); ASSERT(dstIndex < dstModule.module->header.insnum); XIInstrument* srcIns = srcModule.extractXIInstrument(srcIndex); if (!srcIns) return false; XIInstrument* dstIns = dstModule.extractXIInstrument(dstIndex); if (!dstIns) { delete srcIns; return false; } XIInstrument* swapSrc = new XIInstrument(*srcIns); if (!swapSrc) { delete dstIns; delete srcIns; return false; } XIInstrument* swapDst = new XIInstrument(*dstIns); if (!swapDst) { delete swapSrc; delete dstIns; delete srcIns; return false; } delete dstIns; delete srcIns; if (&dstModule == &srcModule) { dstModule.enterCriticalSection(); } else { srcModule.enterCriticalSection(); dstModule.enterCriticalSection(); } bool res = dstModule.insertXIInstrument(dstIndex, swapSrc); res = srcModule.insertXIInstrument(srcIndex, swapDst) && res; if (res) { srcModule.finishSamples(); srcModule.validateInstruments(); dstModule.finishSamples(); dstModule.validateInstruments(); } delete swapDst; delete swapSrc; if (&dstModule == &srcModule) { dstModule.leaveCriticalSection(); } else { dstModule.leaveCriticalSection(); srcModule.leaveCriticalSection(); } return res; } bool ModuleEditor::copySample(ModuleEditor& dstModule, mp_sint32 dstInsIndex, mp_sint32 dstIndex, ModuleEditor& srcModule, mp_sint32 srcInsIndex, mp_sint32 srcIndex) { ASSERT(srcInsIndex < srcModule.module->header.insnum); ASSERT(dstInsIndex < dstModule.module->header.insnum); ASSERT(srcIndex < 16); ASSERT(dstIndex < 16); bool res = true; TXMSample* dstSmp = dstModule.getSampleInfo(dstInsIndex, dstIndex); TXMSample* srcSmp = srcModule.getSampleInfo(srcInsIndex, srcIndex); dstModule.enterCriticalSection(); if (dstSmp->sample && dstSmp->samplen) dstModule.module->freeSampleMem((mp_ubyte*)dstSmp->sample); // assign attributes *dstSmp = *srcSmp; mp_sint32 sampleSize = (srcSmp->samplen * ((srcSmp->type & 16) ? 16:8)) >> 3; if (sampleSize && srcSmp->sample) { dstSmp->sample = (mp_sbyte*)dstModule.module->allocSampleMem(sampleSize); if (dstSmp->sample) { TXMSample::copyPaddedMem(dstSmp->sample, srcSmp->sample, sampleSize); dstModule.finishSamples(); dstModule.validateInstruments(); } else res = false; } dstModule.leaveCriticalSection(); return res; } bool ModuleEditor::swapSamples(ModuleEditor& dstModule, mp_sint32 dstInsIndex, mp_sint32 dstIndex, ModuleEditor& srcModule, mp_sint32 srcInsIndex, mp_sint32 srcIndex) { ASSERT(srcInsIndex < srcModule.module->header.insnum); ASSERT(dstInsIndex < dstModule.module->header.insnum); ASSERT(srcIndex < 16); ASSERT(dstIndex < 16); bool res = true; if (&dstModule == &srcModule) { dstModule.enterCriticalSection(); } else { srcModule.enterCriticalSection(); dstModule.enterCriticalSection(); } TXMSample* dstSmp = dstModule.getSampleInfo(dstInsIndex, dstIndex); TXMSample* srcSmp = srcModule.getSampleInfo(srcInsIndex, srcIndex); TXMSample tmpSmp; srcModule.module->removeSamplePtr((mp_ubyte*)srcSmp->sample); dstModule.module->removeSamplePtr((mp_ubyte*)dstSmp->sample); tmpSmp = *dstSmp; *dstSmp = *srcSmp; *srcSmp = tmpSmp; srcModule.module->insertSamplePtr((mp_ubyte*)srcSmp->sample); dstModule.module->insertSamplePtr((mp_ubyte*)dstSmp->sample); if (&dstModule == &srcModule) { dstModule.leaveCriticalSection(); } else { dstModule.leaveCriticalSection(); srcModule.leaveCriticalSection(); } return res; } void ModuleEditor::setNumChannels(mp_uint32 channels) { if (module->header.channum != channels) changed = true; module->header.channum = channels; } void ModuleEditor::setTitle(const char* name, mp_uint32 length) { insertText(module->header.name, name, length); changed = true; } void ModuleEditor::getTitle(char* name, mp_uint32 length) const { if (length > MAX_TITLETEXT) length = MAX_TITLETEXT; XModule::convertStr(name, (char*)module->header.name, length, false); } void ModuleEditor::setNumOrders(mp_sint32 numOrders) { if (numOrders > 255) numOrders = 255; if (numOrders < 1) numOrders = 1; if (module->header.ordnum != numOrders) changed = true; module->header.ordnum = numOrders; } void ModuleEditor::setFrequency(Frequencies frequency) { // changes are made using the settings panel // do not flag changes here //mp_sint32 old = module->header.freqtab; module->header.freqtab &= ~1; module->header.freqtab |= frequency; //if (old != module->header.freqtab) // changed = true; } void ModuleEditor::setSampleName(mp_sint32 insIndex, mp_sint32 smpIndex, const char* name, mp_uint32 length) { insertText((char*)getSampleInfo(insIndex, smpIndex)->name, name, length); changed = true; } void ModuleEditor::getSampleName(mp_sint32 insIndex, mp_sint32 smpIndex, char* name, mp_uint32 length) const { if (length > MAX_SMPTEXT) length = MAX_SMPTEXT; XModule::convertStr(name, (char*)getSampleInfoInternal(insIndex, smpIndex)->name, length, false); } void ModuleEditor::setCurrentSampleName(const char* name, mp_uint32 length) { if (sampleEditor->getSample() == NULL) return; insertText((char*)sampleEditor->getSample()->name, name, length); changed = true; } TXMSample* ModuleEditor::getFirstSampleInfo() { enumerationIndex = 0; if (enumerationIndex < module->header.smpnum) return &module->smp[enumerationIndex]; else return NULL; } TXMSample* ModuleEditor::getNextSampleInfo() { enumerationIndex++; if (enumerationIndex >= module->header.smpnum) { enumerationIndex = -1; return NULL; } return &module->smp[enumerationIndex]; } void ModuleEditor::setInstrumentName(mp_sint32 insIndex, const char* name, mp_uint32 length) { insertText(module->instr[insIndex].name, name, length); changed = true; } void ModuleEditor::getInstrumentName(mp_sint32 insIndex, char* name, mp_uint32 length) const { if (length > MAX_INSTEXT) length = MAX_INSTEXT; XModule::convertStr(name, module->instr[insIndex].name, length, false); } TEnvelope* ModuleEditor::getEnvelope(mp_sint32 insIndex, mp_sint32 smpIndex, mp_sint32 type) { if (insIndex < 0 || insIndex >= module->header.insnum) return NULL; if (smpIndex < 0 || smpIndex >= instruments[insIndex].numUsedSamples) return NULL; TXMSample* smp = getSampleInfo(insIndex,smpIndex); // no envelopes available, assign some if (smp->venvnum == 0) smp->venvnum = instruments[insIndex].volumeEnvelope+1; // no envelope available, assign one if (smp->penvnum == 0) smp->penvnum = instruments[insIndex].panningEnvelope+1; if (type == 0 && smp->venvnum) { return &module->venvs[smp->venvnum-1]; } else if (type == 1 && smp->penvnum) { return &module->penvs[smp->penvnum-1]; } return NULL; } const mp_ubyte* ModuleEditor::getSampleTable(mp_sint32 insIndex) { if (insIndex < 0 || insIndex >= module->header.insnum) return NULL; return instruments[insIndex].nbu; } void ModuleEditor::updateSampleTable(mp_sint32 index, const mp_ubyte* nbu) { if (nbu == NULL) return; if (index < 0 || index >= module->header.insnum) return; // cope with FT2 noterange (= 96) memcpy(instruments[index].nbu, nbu, MAX_NOTE); // update module data for (mp_sint32 i = 0; i < MAX_NOTE; i++) { if (nbu[i] != 255) module->instr[index].snum[i] = instruments[index].usedSamples[nbu[i]]; else module->instr[index].snum[i] = 255; } changed = true; } void ModuleEditor::updateInstrumentData(mp_sint32 index) { if (index < 0) return; if (index >= module->header.insnum) return; for (mp_sint32 i = 0; i < instruments[index].numUsedSamples; i++) { mp_sint32 s = instruments[index].usedSamples[i]; TXMSample* smp = &module->smp[s]; smp->volfade = instruments[index].volfade << 1; if (smp->volfade == 65534) smp->volfade++; smp->vibtype = instruments[index].vibtype; smp->vibrate = instruments[index].vibrate; smp->vibdepth = instruments[index].vibdepth << 1; smp->vibsweep = instruments[index].vibsweep; } changed = true; } pp_int32 ModuleEditor::insRemapSong(pp_int32 oldIns, pp_int32 newIns) { mp_sint32 resCnt = 0; PatternEditorTools patternEditorTools; for (mp_sint32 k = 0; k < module->header.patnum; k++) { patternEditorTools.attachPattern(&module->phead[k]); resCnt+=patternEditorTools.insRemap(oldIns, newIns); } if (resCnt) changed = true; return resCnt; } pp_int32 ModuleEditor::noteTransposeSong(const PatternEditorTools::TransposeParameters& transposeParameters, bool evaluate/* = false*/) { mp_sint32 resCnt = 0; pp_int32 fuckupCnt = 0; PatternEditorTools patternEditorTools; for (mp_sint32 k = 0; k < module->header.patnum; k++) { patternEditorTools.attachPattern(&module->phead[k]); if (evaluate) fuckupCnt+=patternEditorTools.noteTranspose(transposeParameters, evaluate); else resCnt+=patternEditorTools.noteTranspose(transposeParameters, evaluate); } if (!evaluate) { if (resCnt) changed = true; return resCnt; } else return fuckupCnt; } pp_int32 ModuleEditor::panConvertSong(PanConversionTypes type) { mp_sint32 resCnt = 0; for (mp_sint32 k = 0; k < module->header.patnum; k++) { TXMPattern* pattern = &module->phead[k]; if (pattern->patternData == NULL) continue; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; for (pp_int32 i = 0; i < pattern->rows; i++) for (pp_int32 j = 0; j < pattern->channum; j++) { mp_ubyte* src = pattern->patternData + i*rowSizeSrc+j*slotSize; switch (type) { case PanConversionTypeConvert_E8x: if (src[4] == 0x38) { src[4] = 0x08; src[5] = (mp_ubyte)XModule::pan15to255(src[5]); resCnt++; } break; case PanConversionTypeConvert_80x: if (src[4] == 0x08) { src[5] = (mp_ubyte)XModule::pan15to255(src[5]); resCnt++; } break; case PanConversionTypeRemove_E8x: if (src[4] == 0x38) { src[4] = src[5] = 0x0; resCnt++; } break; case PanConversionTypeRemove_8xx: if (src[4] == 0x08) { src[4] = src[5] = 0x0; resCnt++; } break; } } } if (resCnt) changed = true; return resCnt; } pp_int32 ModuleEditor::removeUnusedPatterns(bool evaluate) { mp_sint32 result = module->removeUnusedPatterns(evaluate); if (!evaluate && result) { changed = true; if (currentPatternIndex > module->header.patnum - 1) currentPatternIndex = module->header.patnum - 1; } return result; } pp_int32 ModuleEditor::removeUnusedInstruments(bool evaluate, bool remap) { mp_sint32 i,j,k; mp_ubyte* bitMap = new mp_ubyte[MAX_INSTRUMENTS]; memset(bitMap, 0, sizeof(mp_ubyte)*MAX_INSTRUMENTS); for (k = 0; k < module->header.patnum; k++) { TXMPattern* pattern = &module->phead[k]; if (pattern->patternData == NULL) continue; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; for (i = 0; i < pattern->rows; i++) for (j = 0; j < pattern->channum; j++) { mp_ubyte* src = pattern->patternData + i*rowSizeSrc+j*slotSize; if (src[1]) { bitMap[src[1]-1] = TRUE; } } } mp_sint32 result = 0; for (i = 0; i < module->header.insnum; i++) { if (!bitMap[i]) { result++; if (!evaluate) zapInstrument(i); } } if (!evaluate) { mp_sint32* insRelocTable = new mp_sint32[MAX_INSTRUMENTS]; for (i = 0, j = 0; i < module->header.insnum; i++) { if (bitMap[i]) { insRelocTable[i] = j++; } } for (i = 0, k = 0; i < module->header.insnum; i++) { if (bitMap[i]) { j = insRelocTable[i]; if (j < i) { XIInstrument* ins = extractXIInstrument(i); insertXIInstrument(j, ins); delete ins; insRemapSong(i+1, j+1); zapInstrument(i); } k++; } } delete[] insRelocTable; // zero number of instruments is not allowed if (k == 0) { result--; k++; } module->header.insnum = k; module->header.smpnum = k*16; } else { if (module->header.insnum - result <= 0) result--; } if (!evaluate && result) changed = true; delete[] bitMap; return result; } pp_int32 ModuleEditor::removeUnusedSamples(bool evaluate) { mp_sint32 i,j,k; mp_ubyte* bitMap = new mp_ubyte[MP_MAXSAMPLES]; memset(bitMap, 0, sizeof(mp_ubyte)*MP_MAXSAMPLES); mp_ubyte* lastIns = new mp_ubyte[module->header.channum]; memset(lastIns, 0, module->header.channum); for (mp_sint32 l = 0; l < module->header.ordnum; l++) { k = module->header.ord[l]; TXMPattern* pattern = &module->phead[k]; if (pattern->patternData == NULL) continue; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*pattern->channum; for (i = 0; i < pattern->rows; i++) for (j = 0; j < pattern->channum; j++) { mp_ubyte* src = pattern->patternData + i*rowSizeSrc+j*slotSize; if (src[1]) { lastIns[j] = src[1]; #if 0 // just assume, that if an instrument is used // in the pattern, that the first sample of this instrument // is kept even if there isn't any note played with that instrument mp_sint32 insIndex = lastIns[j] - 1; mp_sint32 smpIndex = module->instr[insIndex].snum[0]; if (smpIndex >= 0 && smpIndex < MP_MAXSAMPLES) bitMap[smpIndex] = TRUE; #endif } if (src[0] && src[0] < 120) { if (lastIns[j]) { mp_sint32 insIndex = lastIns[j] - 1; mp_sint32 smpIndex = module->instr[insIndex].snum[src[0]-1]; if (smpIndex >= 0 && smpIndex < MP_MAXSAMPLES) bitMap[smpIndex] = TRUE; } } } } delete[] lastIns; mp_sint32 result = 0; for (i = 0; i < module->header.smpnum; i++) { if (!bitMap[i] && module->smp[i].sample) { result++; if (!evaluate) { clearSample(i); // wipe out sample slot memset(module->smp + i, 0, sizeof(TXMSample)); } } } // relocate samples if (!evaluate) { for (i = 0; i < module->header.insnum; i++) { mp_sint32 smpRelocTable[16]; for (j = 0; j < 16; j++) smpRelocTable[j] = -1; mp_sint32 s = 0; TXMSample* src = module->smp + 16*i; TXMSample* dst = src; for (j = 0; j < 16; j++, src++) { k = i*16+j; if (bitMap[k]) { if (src != dst) { *dst = *src; // wipe out source sample memset(src, 0, sizeof(TXMSample)); } smpRelocTable[j] = s++; dst++; } } // adjust the FT2 style sample->note mapping table TEditorInstrument* ins = instruments + i; for (j = 0; j < MAX_NOTE; j++) if (ins->nbu[j] < 16 && smpRelocTable[ins->nbu[j]] != -1) ins->nbu[j] = smpRelocTable[ins->nbu[j]]; else ins->nbu[j] = 0; // convert back to milkytracker module style mapping for (j = 0; j < MAX_NOTE; j++) module->instr[i].snum[j] = i * 16 + ins->nbu[j]; } } if (!evaluate && result) changed = true; delete[] bitMap; return result; } pp_int32 ModuleEditor::relocateCommands(const PatternEditorTools::RelocateParameters& relocateParameters, bool evaluate) { mp_sint32 result = 0; PatternEditorTools patternEditorTools; for (mp_sint32 k = 0; k < module->header.patnum; k++) { patternEditorTools.attachPattern(&module->phead[k]); result+=patternEditorTools.relocateCommands(relocateParameters, evaluate); } if (!evaluate && result) changed = true; return result; } pp_int32 ModuleEditor::zeroOperands(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate) { mp_sint32 result = 0; PatternEditorTools patternEditorTools; for (mp_sint32 k = 0; k < module->header.patnum; k++) { patternEditorTools.attachPattern(&module->phead[k]); result+=patternEditorTools.zeroOperands(optimizeParameters, evaluate); } if (!evaluate && result) changed = true; return result; } pp_int32 ModuleEditor::fillOperands(const PatternEditorTools::OperandOptimizeParameters& optimizeParameters, bool evaluate) { mp_sint32 result = 0; PatternEditorTools patternEditorTools; for (mp_sint32 k = 0; k < module->header.patnum; k++) { patternEditorTools.attachPattern(&module->phead[k]); result+=patternEditorTools.fillOperands(optimizeParameters, evaluate); } if (!evaluate && result) changed = true; return result; } void ModuleEditor::optimizeSamples(bool convertTo8Bit, bool minimize, mp_sint32& numConvertedSamples, mp_sint32& numMinimizedSamples, bool evaluate) { TXMSample* oldSmp = sampleEditor->getSample(); TXMSample* smp = getFirstSampleInfo(); sampleEditor->activateUndoStack(false); numConvertedSamples = numMinimizedSamples = 0; while (smp) { sampleEditor->attachSample(smp, module); // check for 16 bit sample if ((smp->type & 16) && smp->sample && smp->samplen && convertTo8Bit) { if (!evaluate) sampleEditor->convertSampleResolution(true); numConvertedSamples++; } if (smp->sample && smp->samplen && smp->isMinimizable() && minimize) { if (!evaluate) sampleEditor->minimizeSample(); numMinimizedSamples++; } smp = getNextSampleInfo(); } sampleEditor->activateUndoStack(true); sampleEditor->attachSample(oldSmp, module); if (!evaluate && (numMinimizedSamples || numConvertedSamples)) changed = true; } void ModuleEditor::insertText(char* dst, const char* src, mp_sint32 max) { char name[MP_MAXTEXT+1]; ASSERT((signed)sizeof(name) >= max && strlen(src) <= sizeof(name)); memset(name, 0, sizeof(name)); memcpy(name, src, (signed)strlen(src) <= max ? strlen(src) : max); memcpy(dst, name, max); } PPSystemString ModuleEditor::getTempFilename() { return PPSystemString(System::getTempFileName()); } milkytracker-0.90.85+dfsg/src/tracker/SampleEditor.cpp0000644000175000017500000014472711150223367021760 0ustar admin2admin2/* * tracker/SampleEditor.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SampleEditor.cpp * MilkyTracker * * Created by Peter Barth on 22.11.07. * */ #include "SampleEditor.h" #include "SimpleVector.h" #include "XModule.h" #include "VRand.h" #include "Equalizer.h" #include "EQConstants.h" #include "FilterParameters.h" #include "SampleEditorResampler.h" SampleEditor::ClipBoard::ClipBoard() : buffer(NULL) { } SampleEditor::ClipBoard::~ClipBoard() { delete[] buffer; } void SampleEditor::ClipBoard::makeCopy(TXMSample& sample, XModule& module, pp_int32 selectionStart, pp_int32 selectionEnd, bool cut/* = false*/) { if (selectionEnd < 0) return; if (selectionStart < 0) selectionStart = 0; if (selectionEnd > (signed)sample.samplen) selectionEnd = sample.samplen; if (selectionEnd < selectionStart) { pp_int32 s = selectionEnd; selectionEnd = selectionStart; selectionStart = s; } this->selectionStart = selectionStart; this->selectionEnd = selectionEnd; this->selectionWidth = abs(selectionEnd - selectionStart); if (selectionWidth == 0) return; if (buffer) delete[] buffer; numBits = (sample.type & 16) ? 16 : 8; // 16 bit sample if (numBits == 16) { buffer = (mp_sbyte*)(new mp_sword[selectionWidth+1]); mp_sword* dstptr = (mp_sword*)buffer; for (pp_int32 i = selectionStart; i <= selectionEnd; i++) *dstptr++ = sample.getSampleValue(i); } // 8 bit sample else if (numBits == 8) { buffer = new mp_sbyte[selectionWidth+1]; mp_sbyte* dstptr = (mp_sbyte*)buffer; for (pp_int32 i = selectionStart; i <= selectionEnd; i++) *dstptr++ = sample.getSampleValue(i); } else ASSERT(false); } void SampleEditor::ClipBoard::paste(TXMSample& sample, XModule& module, pp_int32 pos) { if (pos < 0) pos = 0; if (sample.sample == NULL) { sample.samplen = 0; pos = 0; } pp_int32 newSampleSize = sample.samplen + selectionWidth; pp_int32 i; // 16 bit sample if (sample.type & 16) { mp_sword* newBuffer = (mp_sword*)module.allocSampleMem(newSampleSize*2); // copy stuff before insert start point for (i = 0; i < pos; i++) sample.setSampleValue((mp_ubyte*)newBuffer, i, sample.getSampleValue(i)); // copy selection to start point for (i = 0; i < selectionWidth; i++) sample.setSampleValue((mp_ubyte*)newBuffer, i+pos, getSampleWord(i)); // copy stuff after insert start point for (i = 0; i < ((signed)sample.samplen - pos); i++) sample.setSampleValue((mp_ubyte*)newBuffer, i+pos+selectionWidth, sample.getSampleValue(i+pos)); if (sample.sample) module.freeSampleMem((mp_ubyte*)sample.sample); sample.sample = (mp_sbyte*)newBuffer; } else { mp_sbyte* newBuffer = (mp_sbyte*)module.allocSampleMem(newSampleSize); // copy stuff before insert start point for (i = 0; i < pos; i++) sample.setSampleValue((mp_ubyte*)newBuffer, i, sample.getSampleValue(i)); // copy selection to start point for (i = 0; i < selectionWidth; i++) sample.setSampleValue((mp_ubyte*)newBuffer, i+pos, getSampleByte(i)); // copy stuff after insert start point for (i = 0; i < ((signed)sample.samplen - pos); i++) sample.setSampleValue((mp_ubyte*)newBuffer, i+pos+selectionWidth, sample.getSampleValue(i+pos)); if (sample.sample) module.freeSampleMem((mp_ubyte*)sample.sample); sample.sample = newBuffer; } pp_int32 loopend = sample.loopstart + sample.looplen; if ((signed)sample.loopstart < pos && loopend > pos) loopend+=selectionWidth; else if ((signed)sample.loopstart > pos && loopend > pos) { sample.loopstart+=selectionWidth; loopend+=selectionWidth; } sample.samplen = newSampleSize; sample.looplen = loopend - sample.loopstart; } void SampleEditor::prepareUndo() { delete before; before = NULL; if (undoStackEnabled && undoStackActivated && undoStack) { undoUserData.clear(); notifyListener(NotificationFeedUndoData); before = new SampleUndoStackEntry(*sample, getSelectionStart(), getSelectionEnd(), &undoUserData); } } void SampleEditor::finishUndo() { if (undoStackEnabled && undoStackActivated && undoStack) { // first of all the listener should get the chance to adjust // user data according to our new changes BEFORE we actually save // the new state in the undo stack for redo lastOperationDidChangeSize = (sample->samplen != before->getSampLen()); notifyListener(NotificationChangesValidate); undoUserData.clear(); // we want some user data now notifyListener(NotificationFeedUndoData); SampleUndoStackEntry after(SampleUndoStackEntry(*sample, getSelectionStart(), getSelectionEnd(), &undoUserData)); if (*before != after) { if (undoStack) { undoStack->Push(*before); undoStack->Push(after); undoStack->Pop(); } } } // we're done, client might want to refresh the screen or whatever notifyListener(NotificationChanges); } bool SampleEditor::revoke(const SampleUndoStackEntry* stackEntry) { if (sample == NULL) return false; if (undoStack == NULL || !undoStackEnabled) return false; sample->samplen = stackEntry->getSampLen(); sample->loopstart = stackEntry->getLoopStart(); sample->looplen = stackEntry->getLoopLen(); sample->relnote = stackEntry->getRelNote(); sample->finetune = stackEntry->getFineTune(); sample->type = (mp_ubyte)stackEntry->getFlags(); setSelectionStart(stackEntry->getSelectionStart()); setSelectionEnd(stackEntry->getSelectionEnd()); enterCriticalSection(); // free old sample memory if (sample->sample) { module->freeSampleMem((mp_ubyte*)sample->sample); sample->sample = NULL; } if (stackEntry->getBuffer()) { if (sample->type & 16) { sample->sample = (mp_sbyte*)module->allocSampleMem(sample->samplen*2); TXMSample::copyPaddedMem(sample->sample, stackEntry->getBuffer(), sample->samplen*2); } else { sample->sample = (mp_sbyte*)module->allocSampleMem(sample->samplen); TXMSample::copyPaddedMem(sample->sample, stackEntry->getBuffer(), sample->samplen); } } leaveCriticalSection(); undoUserData = stackEntry->getUserData(); notifyListener(NotificationFetchUndoData); notifyListener(NotificationChanges); return true; } void SampleEditor::notifyChanges(bool condition, bool lazy/* = true*/) { lastOperation = OperationRegular; lastOperationDidChangeSize = false; if (!lazy) { setLazyUpdateNotifications(false); notifyListener(NotificationChangesValidate); notifyListener(NotificationChanges); } else { setLazyUpdateNotifications(true); notifyListener(NotificationChanges); setLazyUpdateNotifications(false); } } SampleEditor::SampleEditor() : EditorBase(), sample(NULL), undoStackEnabled(true), undoStackActivated(true), before(NULL), undoStack(NULL), lastOperationDidChangeSize(false), lastOperation(OperationRegular), drawing(false), lastSamplePos(-1), lastParameters(NULL), lastFilterFunc(NULL) { // Undo history undoHistory = new UndoHistory(UNDOHISTORYSIZE_SAMPLEEDITOR); resetSelection(); memset(&lastSample, 0, sizeof(lastSample)); } SampleEditor::~SampleEditor() { delete lastParameters; delete undoHistory; delete undoStack; delete before; } void SampleEditor::attachSample(TXMSample* sample, XModule* module) { // only return if the sample data really equals what we already have if (sample->equals(lastSample) && sample == this->sample) return; lastSample = *sample; // --------- update undo history information -------------------- if (undoStackEnabled && undoStackActivated) { if (undoStack) { // if the undo stack is empty, we don't need to save current undo stack if (!undoStack->IsEmpty() || !undoStack->IsTop()) { undoStack = undoHistory->getUndoStack(sample, this->sample, undoStack); } // delete it if it's empty else { delete undoStack; undoStack = NULL; undoStack = undoHistory->getUndoStack(sample, NULL, NULL); } } // couldn't get any from history, create new one if (!undoStack) { undoStack = new PPUndoStack(UNDODEPTH_SAMPLEEDITOR); } } this->sample = sample; attachModule(module); resetSelection(); notifyListener(NotificationReload); } void SampleEditor::reset() { if (undoStackEnabled) { if (undoHistory) delete undoHistory; if (undoStack) { delete undoStack; undoStack = NULL; undoStack = new PPUndoStack(UNDODEPTH_SAMPLEEDITOR); } undoHistory = new UndoHistory(UNDOHISTORYSIZE_SAMPLEEDITOR); } else { if (undoHistory) { delete undoHistory; undoHistory = NULL; } if (undoStack) { delete undoStack; undoStack = NULL; } } } bool SampleEditor::isEmptySample() const { if (!isValidSample()) return true; return (sample->sample == NULL); } bool SampleEditor::canMinimize() const { if (!isValidSample()) return false; return sample->samplen && sample->sample && (sample->type & 3); } bool SampleEditor::isEditableSample() const { if (!isValidSample()) return false; return (sample->sample != NULL) && (sample->samplen != 0); } void SampleEditor::enableUndoStack(bool enable) { undoStackEnabled = enable; reset(); } bool SampleEditor::undo() { if (!undoStackEnabled || undoStack == NULL) return false; if (undoStack->IsEmpty()) return false; return revoke(undoStack->Pop()); } bool SampleEditor::redo() { if (!undoStackEnabled || undoStack == NULL) return false; if (undoStack->IsTop()) return false; return revoke(undoStack->Advance()); } void SampleEditor::selectAll() { if (isEmptySample()) return; selectionStart = 0; selectionEnd = sample->samplen; } bool SampleEditor::validate() { if (isEmptySample()) { resetSelection(); return false; } pp_int32 sStart = getSelectionStart(); pp_int32 sEnd = getSelectionEnd(); if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } setSelectionStart(sStart); setSelectionEnd(sEnd); if (getSelectionEnd() != -1 && getSelectionStart () != -1 && getSelectionEnd() < 0) { resetSelection(); } if (getSelectionEnd() > 0 && getSelectionStart() < 0) setSelectionStart(0); if (getSelectionStart() > (signed)sample->samplen) { resetSelection(); } if (getSelectionEnd() > (signed)sample->samplen) { setSelectionEnd(sample->samplen); } if (sample->loopstart > sample->samplen) sample->loopstart = 0; if (sample->loopstart + sample->looplen > sample->samplen) sample->looplen -= (sample->loopstart + sample->looplen) - sample->samplen; // one shot sample only allows loopstart == 0 if ((sample->type & 32) && sample->loopstart) { sample->type &= ~32; } return true; } bool SampleEditor::canPaste() const { if (selectionEnd == selectionStart && selectionStart == -1 && sample->sample != NULL) return false; return !ClipBoard::getInstance()->isEmpty(); } pp_uint32 SampleEditor::getRepeatStart() const { return sample == NULL ? 0 : sample->loopstart; } pp_uint32 SampleEditor::getRepeatEnd() const { return sample == NULL ? 0 : sample->loopstart + sample->looplen; } pp_uint32 SampleEditor::getRepeatLength() const { return sample == NULL ? 0 : sample->looplen; } void SampleEditor::setRepeatStart(pp_uint32 start) { if (sample == NULL) return; mp_uint32 before = sample->loopstart; sample->loopstart = start; validate(); notifyChanges(before != sample->loopstart, false); } void SampleEditor::setRepeatEnd(pp_uint32 end) { if (sample == NULL) return; mp_uint32 before = sample->looplen; sample->looplen = (end - sample->loopstart); validate(); notifyChanges(before != sample->looplen, false); } void SampleEditor::setRepeatLength(pp_uint32 length) { if (sample == NULL) return; mp_uint32 before = sample->looplen; sample->looplen = length; validate(); notifyChanges(before != sample->looplen, false); } bool SampleEditor::increaseRepeatStart() { if (isEmptySample()) return false; mp_uint32 before = sample->loopstart; pp_int32 loopend = sample->loopstart+sample->looplen; pp_int32 loopstart = sample->loopstart+1; if (loopstart >= 0 && loopstart < loopend && loopend >= 0 && loopend <= (signed)sample->samplen) { sample->looplen = loopend - loopstart; sample->loopstart = loopstart; } validate(); notifyChanges(before != sample->loopstart, false); return true; } bool SampleEditor::decreaseRepeatStart() { if (isEmptySample()) return false; mp_uint32 before = sample->loopstart; pp_int32 loopend = sample->loopstart+sample->looplen; pp_int32 loopstart = sample->loopstart-1; if (loopstart >= 0 && loopstart < loopend && loopend >= 0 && loopend <= (signed)sample->samplen) { sample->looplen = loopend - loopstart; sample->loopstart = loopstart; } validate(); notifyChanges(before != sample->loopstart, false); return true; } bool SampleEditor::increaseRepeatLength() { if (isEmptySample()) return false; mp_uint32 before = sample->looplen; pp_int32 loopend = sample->loopstart+sample->looplen+1; pp_int32 loopstart = sample->loopstart; if (loopstart >= 0 && loopstart < loopend && loopend >= 0 && loopend <= (signed)sample->samplen) { sample->looplen = loopend - loopstart; sample->loopstart = loopstart; } validate(); notifyChanges(before != sample->looplen, false); return true; } bool SampleEditor::decreaseRepeatLength() { if (isEmptySample()) return false; mp_uint32 before = sample->looplen; pp_int32 loopend = sample->loopstart+sample->looplen-1; pp_int32 loopstart = sample->loopstart; if (loopstart >= 0 && loopstart < loopend && loopend >= 0 && loopend <= (signed)sample->samplen) { sample->looplen = loopend - loopstart; sample->loopstart = loopstart; } validate(); notifyChanges(before != sample->looplen, false); return true; } bool SampleEditor::setLoopType(pp_uint8 type) { if (sample == NULL) return false; mp_ubyte before = sample->type; if (type <= 2) { sample->type &= ~(3+32); sample->type |= type; if (type && sample->loopstart == 0 && sample->looplen == 0) { sample->loopstart = 0; sample->looplen = sample->samplen; } } else if (type == 3) { sample->type &= ~(3+32); sample->type |= (1+32); mp_sint32 loopend = sample->loopstart + sample->looplen; sample->loopstart = 0; sample->looplen = loopend; } else ASSERT(false); notifyChanges(before != sample->type); return true; } pp_uint8 SampleEditor::getLoopType() const { if (sample) { if ((sample->type & 3) == 1 && (sample->type & 32)) return 3; else return sample->type & 3; } else return 0; } bool SampleEditor::is16Bit() const { if (sample) return (sample->type & 16) == 16; else return false; } pp_int32 SampleEditor::getRelNoteNum() const { return sample ? sample->relnote : 0; } void SampleEditor::increaseRelNoteNum(pp_int32 offset) { if (sample == NULL) return; mp_sbyte before = sample->relnote; pp_int32 relnote = sample->relnote; relnote+=offset; if (relnote > 71) relnote = 71; if (relnote < -48) relnote = -48; sample->relnote = (mp_sbyte)relnote; notifyChanges(sample->relnote != before); } pp_int32 SampleEditor::getFinetune() const { return sample ? sample->finetune : 0; } void SampleEditor::setFinetune(pp_int32 finetune) { if (sample == NULL) return; mp_sbyte before = sample->finetune; if (finetune < -128) finetune = -128; if (finetune > 127) finetune = 127; sample->finetune = (mp_sbyte)finetune; notifyChanges(sample->finetune != before); } void SampleEditor::setFT2Volume(pp_int32 vol) { if (sample == NULL) return; mp_ubyte before = sample->vol; sample->vol = XModule::vol64to255(vol); notifyChanges(sample->vol != before); } pp_int32 SampleEditor::getFT2Volume() const { return sample ? XModule::vol255to64(sample->vol) : 0; } void SampleEditor::setPanning(pp_int32 pan) { if (sample == NULL) return; mp_sbyte before = sample->pan; if (pan < 0) pan = 0; if (pan > 255) pan = 255; sample->pan = (mp_sbyte)pan; notifyChanges(sample->pan != before); } pp_int32 SampleEditor::getPanning() const { return sample ? sample->pan : 0; } void SampleEditor::startDrawing() { if (sample) sample->restoreOriginalState(); drawing = true; lastSamplePos = -1; prepareUndo(); } void SampleEditor::drawSample(pp_int32 sampleIndex, float s) { s*=2.0f; pp_int32 from = lastSamplePos; pp_int32 to = sampleIndex; if (from == -1) from = sampleIndex; float froms = 0.0f; froms = getFloatSampleFromWaveform(from); if (from > to) { pp_int32 h = from; from = to; to = h; float fh = froms; froms = s; s = fh; } float step = 0; if (to-from) step = (s-froms)/(to-from); else froms = s; lastSamplePos = sampleIndex; for (pp_int32 si = from; si <= to; si++) { setFloatSampleInWaveform(si, froms); froms+=step; } } void SampleEditor::endDrawing() { drawing = false; lastSamplePos = -1; if (!sample || !sample->sample || !sample->samplen) return; lastOperation = OperationRegular; finishUndo(); } void SampleEditor::minimizeSample() { FilterParameters par(0); tool_minimizeSample(&par); } void SampleEditor::cropSample() { FilterParameters par(0); tool_cropSample(&par); } void SampleEditor::clearSample() { FilterParameters par(0); tool_clearSample(&par); } void SampleEditor::mixPasteSample() { FilterParameters par(0); tool_mixPasteSample(&par); } void SampleEditor::convertSampleResolution(bool convert) { FilterParameters par(1); par.setParameter(0, FilterParameters::Parameter(convert ? 1 : 0)); tool_convertSampleResolution(&par); } bool SampleEditor::cutSampleInternal() { if (sample == NULL) return false; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } else return false; selectionStart = sStart; selectionEnd = sEnd; if (sStart == sEnd) return false; // reset loop area double buffer to original sample state // (switch buffering off) sample->restoreOriginalState(); for (pp_uint32 i = selectionEnd; i <= sample->samplen; i++) sample->setSampleValue((i-selectionEnd)+selectionStart, sample->getSampleValue(i)); mp_sint32 sLoopStart = sample->loopstart; if (sEnd < (signed)sample->loopstart + (signed)sample->looplen) sLoopStart-=(sEnd - sStart); if (sLoopStart < 0) sLoopStart = 0; sample->loopstart = sLoopStart; sample->samplen -= abs(selectionEnd - selectionStart); return true; } void SampleEditor::cut() { if (sample == NULL) return; if (!hasValidSelection()) return; // we're going to change the sample buffers, better stop enterCriticalSection(); // undo stuff going on prepareUndo(); // store selection into clipboard ClipBoard::getInstance()->makeCopy(*sample, *module, getSelectionStart(), getSelectionEnd()); // just make clear what kind of an operation this is if (cutSampleInternal()) lastOperation = OperationCut; // selection no longer intact resetSelection(); // validate our internal state validate(); // redo stuff and client notifications finishUndo(); // keep on playing if you did leaveCriticalSection(); } void SampleEditor::copy() { if (sample == NULL) return; if (!hasValidSelection()) return; ClipBoard::getInstance()->makeCopy(*sample, *module, getSelectionStart(), getSelectionEnd()); notifyListener(NotificationUpdateNoChanges); } void SampleEditor::paste() { if (sample == NULL) return; enterCriticalSection(); prepareUndo(); if (hasValidSelection()) { mp_uint32 loopstart = sample->loopstart; mp_uint32 looplen = sample->looplen; if (cutSampleInternal()) lastOperation = OperationCut; sample->loopstart = loopstart; sample->looplen = looplen; } ClipBoard::getInstance()->paste(*sample, *module, getSelectionStart()); setSelectionEnd(getSelectionStart() + ClipBoard::getInstance()->getWidth()); validate(); finishUndo(); leaveCriticalSection(); } SampleEditor::WorkSample* SampleEditor::createWorkSample(pp_uint32 size, pp_uint8 numBits, pp_uint32 sampleRate) { WorkSample* workSample = new WorkSample(*module, size, numBits, sampleRate); if (workSample->buffer == NULL) { delete workSample; return NULL; } return workSample; } void SampleEditor::pasteOther(WorkSample& src) { enterCriticalSection(); prepareUndo(); if (sample->sample) { module->freeSampleMem((mp_ubyte*)sample->sample); sample->sample = NULL; sample->samplen = 0; } sample->loopstart = 0; sample->looplen = 0; sample->type = (src.numBits == 16) ? 16 : 0; sample->samplen = src.size; mp_sbyte rn, ft; XModule::convertc4spd((mp_uint32)src.sampleRate, &ft, &rn); sample->relnote = rn; sample->finetune = ft; sample->sample = (mp_sbyte*)src.buffer; src.buffer = NULL; finishUndo(); leaveCriticalSection(); } static float ppfabs(float f) { return f < 0 ? -f : f; } float SampleEditor::getFloatSampleFromWaveform(pp_int32 index, void* src/* = NULL*/, pp_int32 size/* = 0*/) { if (isEmptySample()) return 0.0f; if (!src) { if (index > (signed)sample->samplen) index = sample->samplen; if (index < 0) index = 0; } else if (size != 0) { if (index >= size) index = size-1; if (index < 0) index = 0; } if (sample->type & 16) { mp_sword s = src ? *(((mp_sword*)src)+index) : sample->getSampleValue(index); return s > 0 ? (float)s*(1.0f/32767.0f) : (float)s*(1.0f/32768.0f); } else { mp_sbyte s = src ? *(((mp_sbyte*)src)+index) : sample->getSampleValue(index); return s > 0 ? (float)s*(1.0f/127.0f) : (float)s*(1.0f/128.0f); } } void SampleEditor::setFloatSampleInWaveform(pp_int32 index, float singleSample, void* src/* = NULL*/) { if (isEmptySample() || index > (signed)sample->samplen) return; if (index < 0) index = 0; if (singleSample > 1.0f) singleSample = 1.0f; if (singleSample < -1.0f) singleSample = -1.0f; if (sample->type & 16) { mp_sword s = singleSample > 0 ? (mp_sword)(singleSample*32767.0f+0.5f) : (mp_sword)(singleSample*32768.0f-0.5f); if (src) *(((mp_sword*)src)+index) = s; else sample->setSampleValue(index, s); } else { mp_sbyte s = singleSample > 0 ? (mp_sbyte)(singleSample*127.0f+0.5f) : (mp_sbyte)(singleSample*128.0f-0.5f); if (src) *(((mp_sbyte*)src)+index) = s; else sample->setSampleValue(index, s); } } void SampleEditor::preFilter(TFilterFunc filterFuncPtr, const FilterParameters* par) { if (filterFuncPtr) { if (par != NULL) { FilterParameters newPar(*par); if (lastParameters) { delete lastParameters; lastParameters = NULL; } lastParameters = new FilterParameters(newPar); } else { if (lastParameters) { delete lastParameters; lastParameters = NULL; } } lastFilterFunc = filterFuncPtr; } enterCriticalSection(); lastOperation = OperationRegular; notifyListener(NotificationPrepareLengthy); } void SampleEditor::postFilter() { notifyListener(NotificationUnprepareLengthy); leaveCriticalSection(); } void SampleEditor::tool_newSample(const FilterParameters* par) { if (!isValidSample()) return; preFilter(NULL, NULL); prepareUndo(); pp_int32 numSamples = par->getParameter(0).intPart, numBits = par->getParameter(1).intPart; if (sample->sample) { module->freeSampleMem((mp_ubyte*)sample->sample); sample->sample = NULL; } sample->samplen = numSamples; sample->loopstart = 0; sample->looplen = sample->samplen; switch (numBits) { case 8: sample->sample = (mp_sbyte*)module->allocSampleMem(sample->samplen); memset(sample->sample, 0, sample->samplen); break; case 16: sample->type |= 16; sample->sample = (mp_sbyte*)module->allocSampleMem(sample->samplen*2); memset(sample->sample, 0, sample->samplen*2); break; default: ASSERT(false); } finishUndo(); lastOperation = OperationNew; postFilter(); } void SampleEditor::tool_minimizeSample(const FilterParameters* par) { if (isEmptySample()) return; if (!(sample->type & 3)) return; preFilter(NULL, NULL); prepareUndo(); pp_int32 loopend = sample->loopstart+sample->looplen; if (loopend > (signed)sample->samplen) loopend = sample->samplen; sample->samplen = loopend; finishUndo(); postFilter(); } void SampleEditor::tool_cropSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } else return; selectionStart = sStart; selectionEnd = sEnd; if (sStart == sEnd) return; preFilter(NULL, NULL); prepareUndo(); if (sample->type & 16) { mp_sword* buff = (mp_sword*)sample->sample; for (pp_int32 i = selectionStart; i < selectionEnd; i++) buff[i-selectionStart] = buff[i]; } else { mp_sbyte* buff = (mp_sbyte*)sample->sample; for (pp_int32 i = selectionStart; i < selectionEnd; i++) buff[i-selectionStart] = buff[i]; } sample->samplen = abs(selectionEnd - selectionStart); if (sample->loopstart > sample->samplen) sample->loopstart = 0; pp_int32 loopend = sample->loopstart + sample->looplen; if (loopend > (signed)sample->samplen) loopend = sample->samplen; sample->looplen = loopend - sample->loopstart; selectionStart = 0; selectionEnd = sample->samplen; finishUndo(); postFilter(); } void SampleEditor::tool_clearSample(const FilterParameters* par) { preFilter(NULL, NULL); prepareUndo(); module->freeSampleMem((mp_ubyte*)sample->sample); sample->sample = NULL; sample->samplen = 0; sample->loopstart = 0; sample->looplen = 0; finishUndo(); postFilter(); } void SampleEditor::tool_convertSampleResolution(const FilterParameters* par) { preFilter(NULL, NULL); prepareUndo(); bool convert = (par->getParameter(0).intPart != 0); if (sample->type & 16) { if (!convert) { sample->type &= ~16; sample->samplen<<=1; sample->looplen<<=1; sample->loopstart<<=1; } else { mp_sbyte* buffer = new mp_sbyte[sample->samplen]; for (mp_sint32 i = 0; i < (signed)sample->samplen; i++) buffer[i] = (mp_sbyte)(sample->getSampleValue(i)>>8); module->freeSampleMem((mp_ubyte*)sample->sample); sample->type &= ~16; sample->sample = (mp_sbyte*)module->allocSampleMem(sample->samplen); memcpy(sample->sample, buffer, sample->samplen); delete[] buffer; } } else { if (!convert) { sample->type |= 16; sample->samplen>>=1; sample->looplen>>=1; sample->loopstart>>=1; } else { mp_sword* buff16 = new mp_sword[sample->samplen]; for (mp_sint32 i = 0; i < (signed)sample->samplen; i++) buff16[i] = (mp_sword)(sample->getSampleValue(i)<<8); module->freeSampleMem((mp_ubyte*)sample->sample); sample->type |= 16; sample->sample = (mp_sbyte*)module->allocSampleMem(sample->samplen*2); memcpy(sample->sample, buff16, sample->samplen*2); delete[] buff16; } } finishUndo(); postFilter(); } void SampleEditor::tool_mixPasteSample(const FilterParameters* par) { if (isEmptySample()) return; if (ClipBoard::getInstance()->isEmpty()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(NULL, NULL); prepareUndo(); ClipBoard* clipBoard = ClipBoard::getInstance(); float step = (float)clipBoard->getWidth() / (float)(sEnd-sStart); float j = 0.0f; for (pp_int32 i = sStart; i < sEnd; i++) { float frac = j - (float)floor(j); pp_int16 s = clipBoard->getSampleWord((pp_int32)j); float f1 = s < 0 ? (s/32768.0f) : (s/32767.0f); s = clipBoard->getSampleWord((pp_int32)j+1); float f2 = s < 0 ? (s/32768.0f) : (s/32767.0f); float f = (1.0f-frac)*f1 + frac*f2; setFloatSampleInWaveform(i, f + getFloatSampleFromWaveform(i)); j+=step; } finishUndo(); postFilter(); } void SampleEditor::tool_scaleSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_scaleSample, par); prepareUndo(); float startScale = par->getParameter(0).floatPart; float endScale = par->getParameter(1).floatPart; float step = (endScale - startScale) / (float)(sEnd - sStart); for (pp_int32 i = sStart; i < sEnd; i++) { float f = getFloatSampleFromWaveform(i); setFloatSampleInWaveform(i, f*startScale); startScale+=step; } finishUndo(); postFilter(); } void SampleEditor::tool_normalizeSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_normalizeSample, par); prepareUndo(); float maxLevel = ((par == NULL)? 1.0f : par->getParameter(0).floatPart); float peak = 0.0f; pp_int32 i; // find peak value for (i = sStart; i < sEnd; i++) { float f = getFloatSampleFromWaveform(i); if (ppfabs(f) > peak) peak = ppfabs(f); } float scale = maxLevel / peak; for (i = sStart; i < sEnd; i++) { float f = getFloatSampleFromWaveform(i); setFloatSampleInWaveform(i, f*scale); } finishUndo(); postFilter(); } void SampleEditor::tool_reverseSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_reverseSample, par); prepareUndo(); pp_int32 i; for (i = 0; i < (sEnd-sStart)>>1; i++) { float f1 = getFloatSampleFromWaveform(sStart + i); float f2 = getFloatSampleFromWaveform(sEnd - 1 - i); float h = f2; f2 = f1; f1 = h; setFloatSampleInWaveform(sStart + i, f1); setFloatSampleInWaveform(sEnd - i, f2); } finishUndo(); postFilter(); } void SampleEditor::tool_PTboostSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_PTboostSample, par); prepareUndo(); pp_int32 i; float d0 = 0.0f, d1, d2; for (i = sStart; i < sEnd; i++) { d1 = d2 = getFloatSampleFromWaveform(i); d1 -= d0; d0 = d2; if (d1 < 0.0f) { d1 = -d1; d1*= 0.25f; d2 -= d1; } else { d1*= 0.25f; d2 += d1; } if (d2 > 1.0f) d2 = 1.0f; if (d2 < -1.0f) d2 = -1.0f; setFloatSampleInWaveform(i, d2); } finishUndo(); postFilter(); } bool SampleEditor::isValidxFadeSelection() { if (isEmptySample() || !hasValidSelection() || !(sample->type & 3)) return false; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } pp_uint32 loopend = sample->loopstart + sample->looplen; if (((unsigned)sStart <= sample->loopstart && (unsigned)sEnd >= loopend) || ((unsigned)sStart > sample->loopstart && (unsigned)sEnd < loopend) || ((unsigned)sStart < sample->loopstart && (unsigned)sEnd < sample->loopstart) || ((unsigned)sStart > loopend && (unsigned)sEnd > loopend)) return false; return true; } void SampleEditor::tool_xFadeSample(const FilterParameters* par) { if (!isValidxFadeSelection()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } if (!(sample->type & 3) || sEnd < (signed)sample->loopstart || sStart > (signed)(sample->loopstart + sample->looplen)) return; pp_int32 loopend = sample->loopstart + sample->looplen; preFilter(&SampleEditor::tool_xFadeSample, par); if (sStart <= (signed)sample->loopstart && sEnd >= loopend) return; if (sStart >= (signed)sample->loopstart && sEnd >= loopend) { sStart-=loopend; sStart+=sample->loopstart; sEnd-=loopend; sEnd+=sample->loopstart; } mp_ubyte* buffer = new mp_ubyte[(sample->type & 16) ? sample->samplen*2 : sample->samplen]; if (!buffer) return; memcpy(buffer, sample->sample, (sample->type & 16) ? sample->samplen*2 : sample->samplen); prepareUndo(); pp_int32 i = 0; // loop start if ((sample->type & 3) == 1) { for (i = sStart; i < (signed)sample->loopstart; i++) { float t = (((float)i - sStart) / (float)(sample->loopstart - sStart))*0.5f; float f1 = getFloatSampleFromWaveform(i, buffer, sample->samplen); float f2 = getFloatSampleFromWaveform(loopend - (sample->loopstart - sStart) + (i - sStart), buffer, sample->samplen); float f = f1*(1.0f-t) + f2*t; setFloatSampleInWaveform(i, f); } for (i = sample->loopstart; i < sEnd; i++) { float t = 0.5f - ((((float)i - sample->loopstart) / (float)(sEnd-sample->loopstart))*0.5f); float f1 = getFloatSampleFromWaveform(i, buffer, sample->samplen); float f2 = getFloatSampleFromWaveform(loopend + (i - sample->loopstart), buffer, sample->samplen); float f = f1*(1.0f-t) + f2*t; setFloatSampleInWaveform(i, f); } // loop end sStart-=sample->loopstart; sStart+=loopend; sEnd-=sample->loopstart; sEnd+=loopend; for (i = sStart; i < loopend; i++) { float t = (((float)i - sStart) / (float)(loopend - sStart))*0.5f; float f1 = getFloatSampleFromWaveform(i, buffer, sample->samplen); float f2 = getFloatSampleFromWaveform(sample->loopstart - (loopend - sStart) + (i - sStart), buffer, sample->samplen); float f = f1*(1.0f-t) + f2*t; setFloatSampleInWaveform(i, f); } for (i = loopend; i < sEnd; i++) { float t = 0.5f - ((((float)i - loopend) / (float)(sEnd-loopend))*0.5f); float f1 = getFloatSampleFromWaveform(i, buffer, sample->samplen); float f2 = getFloatSampleFromWaveform(sample->loopstart + (i - loopend), buffer, sample->samplen); float f = f1*(1.0f-t) + f2*t; setFloatSampleInWaveform(i, f); } } else if ((sample->type & 3) == 2) { for (i = sStart; i < (signed)sample->loopstart; i++) { float t = (((float)i - sStart) / (float)(sample->loopstart - sStart))*0.5f; float f1 = getFloatSampleFromWaveform(i, buffer, sample->samplen); float f2 = getFloatSampleFromWaveform(sample->loopstart + (i - sStart), buffer, sample->samplen); float f = f1*(1.0f-t) + f2*t; setFloatSampleInWaveform(i, f); } for (i = sample->loopstart; i < sEnd; i++) { float t = 0.5f - ((((float)i - sample->loopstart) / (float)(sEnd-sample->loopstart))*0.5f); float f1 = getFloatSampleFromWaveform(i, buffer, sample->samplen); float f2 = getFloatSampleFromWaveform(sample->loopstart - (i - sample->loopstart), buffer, sample->samplen); float f = f1*(1.0f-t) + f2*t; setFloatSampleInWaveform(i, f); } } delete[] buffer; finishUndo(); postFilter(); } void SampleEditor::tool_changeSignSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_changeSignSample, par); prepareUndo(); pp_int32 i; // lazyness follows for (i = sStart; i < sEnd; i++) { if (sample->type & 16) { mp_uword* smp = (mp_uword*)sample->sample; smp[i]^=0x7fff; } else { mp_ubyte* smp = (mp_ubyte*)sample->sample; smp[i]^=0x7f; } } finishUndo(); postFilter(); } void SampleEditor::tool_swapByteOrderSample(const FilterParameters* par) { if (isEmptySample()) return; if (!(sample->type & 16)) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_swapByteOrderSample, par); prepareUndo(); pp_int32 i; mp_uword* smp = (mp_uword*)sample->sample; for (i = sStart; i < sEnd; i++) { mp_uword s = (smp[i] >> 8) | ((smp[i] & 0xFF) << 8); smp[i] = s; } finishUndo(); postFilter(); } float getc4spd(mp_sint32 relnote,mp_sint32 finetune); void SampleEditor::tool_resampleSample(const FilterParameters* par) { if (isEmptySample()) return; preFilter(&SampleEditor::tool_resampleSample, par); prepareUndo(); float c4spd = getc4spd(sample->relnote, sample->finetune); pp_uint32 resamplerType = par->getParameter(1).intPart; SampleEditorResampler resampler(*module, *sample, resamplerType); bool res = resampler.resample(c4spd, par->getParameter(0).floatPart); float step = c4spd / par->getParameter(0).floatPart; if (res) { sample->loopstart = (mp_sint32)(sample->loopstart/step); sample->looplen = (mp_sint32)(sample->looplen/step); if (par->getParameter(2).intPart) { pp_uint32 c4spdi = (mp_uint32)par->getParameter(0).floatPart; mp_sbyte rn, ft; XModule::convertc4spd((mp_uint32)c4spdi, &ft, &rn); sample->relnote = rn; sample->finetune = ft; } } lastOperation = OperationCut; finishUndo(); postFilter(); } void SampleEditor::tool_DCNormalizeSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_DCNormalizeSample, par); prepareUndo(); pp_int32 i; float DC = 0.0f; for (i = sStart; i < sEnd; i++) { DC += getFloatSampleFromWaveform(i); } DC = DC / (float)(sEnd-sStart); for (i = sStart; i < sEnd; i++) { setFloatSampleInWaveform(i, getFloatSampleFromWaveform(i) - DC); } finishUndo(); postFilter(); } void SampleEditor::tool_DCOffsetSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_DCOffsetSample, par); prepareUndo(); pp_int32 i; float DC = par->getParameter(0).floatPart; for (i = sStart; i < sEnd; i++) { setFloatSampleInWaveform(i, getFloatSampleFromWaveform(i) + DC); } finishUndo(); postFilter(); } void SampleEditor::tool_rectangularSmoothSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_rectangularSmoothSample, par); mp_sint32 sLen = sEnd - sStart; mp_ubyte* buffer = new mp_ubyte[(sample->type & 16) ? sLen*2 : sLen]; if (!buffer) return; memcpy(buffer, sample->sample + sStart, (sample->type & 16) ? sLen*2 : sLen); prepareUndo(); pp_int32 i; for (i = sStart; i < sEnd; i++) { float f = (getFloatSampleFromWaveform(i - sStart - 1, buffer, sLen) + getFloatSampleFromWaveform(i - sStart, buffer, sLen) + getFloatSampleFromWaveform(i - sStart + 1, buffer, sLen)) * (1.0f/3.0f); setFloatSampleInWaveform(i, f); } delete[] buffer; finishUndo(); postFilter(); } void SampleEditor::tool_triangularSmoothSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_triangularSmoothSample, par); mp_sint32 sLen = sEnd - sStart; mp_ubyte* buffer = new mp_ubyte[(sample->type & 16) ? sLen*2 : sLen]; if (!buffer) return; memcpy(buffer, sample->sample + sStart, (sample->type & 16) ? sLen*2 : sLen); prepareUndo(); pp_int32 i; for (i = sStart; i < sEnd; i++) { float f = (getFloatSampleFromWaveform(i - sStart - 2, buffer, sLen) + getFloatSampleFromWaveform(i - sStart - 1, buffer, sLen)*2.0f + getFloatSampleFromWaveform(i - sStart, buffer, sLen)*3.0f + getFloatSampleFromWaveform(i - sStart + 1, buffer, sLen)*2.0f + getFloatSampleFromWaveform(i - sStart + 2, buffer, sLen)) * (1.0f/9.0f); setFloatSampleInWaveform(i, f); } delete[] buffer; finishUndo(); postFilter(); } void SampleEditor::tool_eqSample(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_eqSample, par); prepareUndo(); float c4spd = getc4spd(sample->relnote, sample->finetune); float scale = c4spd / 44100.0f; Equalizer** eqs = new Equalizer*[par->getNumParameters()]; // three band EQ if (par->getNumParameters() == 3) { for (pp_int32 i = 0; i < par->getNumParameters(); i++) { eqs[i] = new Equalizer(); eqs[i]->CalcCoeffs(EQConstants::EQ3bands[i]*scale, EQConstants::EQ3bandwidths[i]*scale, c4spd, Equalizer::CalcGain(par->getParameter(i).floatPart)); } } // ten band EQ else if (par->getNumParameters() == 10) { for (pp_int32 i = 0; i < par->getNumParameters(); i++) { eqs[i] = new Equalizer(); eqs[i]->CalcCoeffs(EQConstants::EQ10bands[i]*scale, EQConstants::EQ10bandwidths[i]*scale, c4spd, Equalizer::CalcGain(par->getParameter(i).floatPart)); } } else { delete[] eqs; finishUndo(); return; } // apply EQ here pp_int32 i; for (i = sStart; i < sEnd; i++) { // Fetch a stereo signal double xL = getFloatSampleFromWaveform(i); double xR = xL; for (pp_int32 j = 0; j < par->getNumParameters(); j++) { double yL, yR; // Pass the stereo input eqs[j]->Filter(xL, xR, yL, yR); xL = yL; xR = yR; } setFloatSampleInWaveform(i, (float)xL); } for (i = 0; i < par->getNumParameters(); i++) delete eqs[i]; delete[] eqs; finishUndo(); postFilter(); } void SampleEditor::tool_generateSilence(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if ((sStart == sEnd) || hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = 0; } preFilter(&SampleEditor::tool_generateSilence, par); mp_sint32 sLen = sEnd - sStart; prepareUndo(); pp_int32 i, j; pp_int32 size = par->getParameter(0).intPart; pp_int32 newSampleSize = (sample->samplen - sLen) + size; if (sample->type & 16) { mp_sword* dst = new mp_sword[newSampleSize]; j = 0; for (i = 0; i < sStart; i++, j++) dst[j] = sample->getSampleValue(i); for (i = 0; i < size; i++, j++) dst[j] = 0; for (i = sEnd; i < (signed)sample->samplen; i++, j++) dst[j] = sample->getSampleValue(i); module->freeSampleMem((mp_ubyte*)sample->sample); sample->sample = (mp_sbyte*)module->allocSampleMem(newSampleSize*2); memcpy(sample->sample, dst, newSampleSize*2); sample->samplen = newSampleSize; delete[] dst; } else { mp_sbyte* dst = new mp_sbyte[newSampleSize]; j = 0; for (i = 0; i < sStart; i++, j++) dst[j] = sample->getSampleValue(i); for (i = 0; i < size; i++, j++) dst[j] = 0; for (i = sEnd; i < (signed)sample->samplen; i++, j++) dst[j] = sample->getSampleValue(i); module->freeSampleMem((mp_ubyte*)sample->sample); sample->sample = (mp_sbyte*)module->allocSampleMem(newSampleSize); memcpy(sample->sample, dst, newSampleSize); sample->samplen = newSampleSize; delete[] dst; } // show everything lastOperation = OperationCut; finishUndo(); postFilter(); } void SampleEditor::tool_generateNoise(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_generateNoise, par); prepareUndo(); pp_int32 i; pp_int32 type = par->getParameter(0).intPart; VRand rand; rand.seed(); switch (type) { case 0: for (i = sStart; i < sEnd; i++) setFloatSampleInWaveform(i, rand.white()*2.0f); break; case 1: for (i = sStart; i < sEnd; i++) setFloatSampleInWaveform(i, rand.pink()*2.0f); break; case 2: for (i = sStart; i < sEnd; i++) setFloatSampleInWaveform(i, rand.brown()*2.0f); break; } finishUndo(); postFilter(); } void SampleEditor::tool_generateSine(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_generateSine, par); mp_sint32 sLen = sEnd - sStart; prepareUndo(); pp_int32 i; const float numPeriods = (float)(6.283185307179586476925286766559 * par->getParameter(1).floatPart); const float amplify = par->getParameter(0).floatPart; // generate sine wave here for (i = sStart; i < sEnd; i++) { float per = (i-sStart)/(float)sLen * numPeriods; setFloatSampleInWaveform(i, (float)sin(per)*amplify); } finishUndo(); postFilter(); } void SampleEditor::tool_generateSquare(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_generateSquare, par); mp_sint32 sLen = sEnd - sStart; prepareUndo(); pp_int32 i; const float numPeriods = par->getParameter(1).floatPart; const float amplify = par->getParameter(0).floatPart; // generate square wave here for (i = sStart; i < sEnd; i++) { float per = (i-sStart)/(float)sLen * numPeriods; float frac = per-(float)floor(per); setFloatSampleInWaveform(i, frac < 0.5f ? amplify : -amplify); } finishUndo(); postFilter(); } void SampleEditor::tool_generateTriangle(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_generateTriangle, par); mp_sint32 sLen = sEnd - sStart; prepareUndo(); pp_int32 i; const float numPeriods = par->getParameter(1).floatPart; const float amplify = par->getParameter(0).floatPart; // generate triangle wave here for (i = sStart; i < sEnd; i++) { float per = (i-sStart)/(float)sLen * numPeriods; float frac = per-(float)floor(per); if (frac < 0.25f) setFloatSampleInWaveform(i, (frac*4.0f)*amplify); else if (frac < 0.75f) setFloatSampleInWaveform(i, (1.0f-(frac-0.25f)*4.0f)*amplify); else setFloatSampleInWaveform(i, (-1.0f+(frac-0.75f)*4.0f)*amplify); } finishUndo(); postFilter(); } void SampleEditor::tool_generateSawtooth(const FilterParameters* par) { if (isEmptySample()) return; pp_int32 sStart = selectionStart; pp_int32 sEnd = selectionEnd; if (hasValidSelection()) { if (sStart >= 0 && sEnd >= 0) { if (sEnd < sStart) { pp_int32 s = sEnd; sEnd = sStart; sStart = s; } } } else { sStart = 0; sEnd = sample->samplen; } preFilter(&SampleEditor::tool_generateSawtooth, par); mp_sint32 sLen = sEnd - sStart; prepareUndo(); pp_int32 i; const float numPeriods = par->getParameter(1).floatPart; const float amplify = par->getParameter(0).floatPart; // generate saw-tooth wave here for (i = sStart; i < sEnd; i++) { float per = (i-sStart)/(float)sLen * numPeriods; float frac = per-(float)floor(per); setFloatSampleInWaveform(i, frac < 0.5f ? (frac*2.0f)*amplify : (-1.0f+((frac-0.5f)*2.0f))*amplify); } finishUndo(); postFilter(); } bool SampleEditor::tool_canApplyLastFilter() const { return lastFilterFunc != NULL && isValidSample(); } void SampleEditor::tool_applyLastFilter() { if (lastFilterFunc) { if (lastParameters) { FilterParameters newPar(*lastParameters); (this->*lastFilterFunc)(&newPar); } else { (this->*lastFilterFunc)(NULL); } } } pp_uint32 SampleEditor::convertSmpPosToMillis(pp_uint32 pos, pp_int32 relativeNote/* = 0*/) { if (!isValidSample()) return 0; relativeNote+=sample->relnote; double c4spd = XModule::getc4spd(relativeNote, sample->finetune); return (pp_uint32)(((double)pos / c4spd) * 1000.0); } milkytracker-0.90.85+dfsg/src/tracker/wince/0000755000175000017500000000000011317506125017753 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/tracker/wince/WaitStateThread.cpp0000644000175000017500000001346011150223367023517 0ustar admin2admin2/* * tracker/wince/WaitStateThread.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "WaitStateThread.h" #include "PPMutex.h" extern unsigned short* vScreen; extern PPMutex* globalMutex; void UpdateScreen(unsigned short* vScreen); void drawString(const char* textBuffer,unsigned short* drawBuffer,unsigned int pitch, unsigned int posx,unsigned int posy, unsigned short col); WaitStateThread* WaitStateThread::instance = NULL; WaitStateThread::WaitStateThread() { bActivated = FALSE; nSleepTime = 250; hThread = NULL; threadID = 0; saveBuffer = NULL; xres = 320; yres = 240; pitch = 320; UpperLeftX = 160-70; UpperLeftY = 120-30; LowerRightX = 160+70; LowerRightY = 120+30; Width = (LowerRightX - UpperLeftX); Height = (LowerRightY - UpperLeftY); hThread = CreateThread(NULL, 0, &MyThreadProc, (LPVOID)this, 0, &threadID); bActivated = FALSE; nSleepTime = 250; } void WaitStateThread::setDisplayResolution(int width, int height) { xres = pitch = width; yres = height; UpperLeftX = (width>>1)-70; UpperLeftY = (height>>1)-30; LowerRightX = (width>>1)+70; LowerRightY = (height>>1)+30; Width = (LowerRightX - UpperLeftX); Height = (LowerRightY - UpperLeftY); } static void SaveArea(unsigned short* saveBuffer, unsigned short* src, unsigned int pitch, const int fromX, const int fromY, const int toX, const int toY) { const int Width = (toX - fromX); const int Height = (toY - fromY); for (int y = fromY; y < toY; y++) { for (int x = fromX; x < toX; x++) { unsigned short* vPtr = src + y*pitch+x; unsigned short* dst = saveBuffer + (y-fromY) * Width + (x-fromX); *dst = *vPtr; } } } static void RestoreArea(unsigned short* src, unsigned short* saveBuffer, unsigned int pitch, const int fromX, const int fromY, const int toX, const int toY) { const int Width = (toX - fromX); const int Height = (toY - fromY); for (int y = fromY; y < toY; y++) { for (int x = fromX; x < toX; x++) { unsigned short* vPtr = src + y*pitch+x; unsigned short* dst = saveBuffer + (y-fromY) * Width + (x-fromX); *vPtr = *dst; } } } static void Darken(unsigned short* buffer, unsigned short pitch, const int fromX, const int fromY, const int toX, const int toY, const int scale) { int x,y; for (y = fromY; y < toY; y++) { buffer[y*pitch+fromX] = 0xFFFF; buffer[y*pitch+toX-1] = 0xFFFF; } for (x = fromX; x < toX; x++) { buffer[fromY*pitch+x] = 0xFFFF; buffer[(toY-1)*pitch+x] = 0xFFFF; } for (y = fromY+1; y < toY-1; y++) { for (x = fromX+1; x < toX-1; x++) { unsigned short* vPtr = buffer + y*pitch+x; int r = ((*vPtr >> 11)*scale)>>8; int g = (((*vPtr >> 5)&0x3F)*scale)>>8; int b = ((*vPtr & 0x1F)*scale)>>8; *vPtr = (r << 11) + (g << 5) + b; } } } static void DrawWaitBar(unsigned short* buffer, const unsigned int width, const unsigned int height) { const unsigned int barWidth = 80; const unsigned int BAR_BRIGHT_COLOR = 0xffffff; const unsigned int BAR_DARK_COLOR = 0x103f67; static int offset = 0; int hBarPos = (width >> 1) - (barWidth>>1); int vBarPos = (height >> 1) + 2; //int vBarPos = LowerRightY - 20 - 8; unsigned short* vPtr = buffer + (vBarPos*width) + hBarPos; for (int y = 0; y < 8; y++) { for (int x = 0; x < barWidth; x++) { // rand für arme/faule if ((y == 0) || (y == 7) || (x == 0) || (x == barWidth-1)) { *vPtr = 0xFFFF; } else { int c = (x+y+(offset)) & 0xf; int shade = 0; if (c <= 7) shade = c; else shade = 7 - (c - 8); shade = 255-(shade*32); DWORD red = ((BAR_BRIGHT_COLOR >> 16) * shade + (BAR_DARK_COLOR >> 16) * (255-shade)) >> 8; DWORD green = (((BAR_BRIGHT_COLOR >> 8) & 0xff) * shade + ((BAR_DARK_COLOR >> 8) & 0xff) * (255-shade)) >> 8; DWORD blue = ((BAR_BRIGHT_COLOR & 0xff) * shade + (BAR_DARK_COLOR & 0xff) * (255-shade)) >> 8; *vPtr = (WORD)((blue>>3) + ((green>>2)<<5)+ ((red>>3)<<11)); } vPtr++; } vPtr+=width-barWidth; } offset+=4; } DWORD WINAPI WaitStateThread::MyThreadProc(LPVOID lpParameter) { WaitStateThread* thisPtr = (WaitStateThread*)lpParameter; while (true) { if (thisPtr->bActivated) { DrawWaitBar(vScreen, thisPtr->xres, thisPtr->yres); UpdateScreen(vScreen); } Sleep(thisPtr->nSleepTime); } ExitThread(0); return 0; } void WaitStateThread::activate(BOOL bActivate,BOOL bDarken/* = TRUE*/, BOOL bPutText/* = TRUE*/) { if (bActivate) { globalMutex->lock(); if (!saveBuffer) { saveBuffer = new WORD[Width*Height]; if (saveBuffer) SaveArea(saveBuffer, vScreen, xres, UpperLeftX, UpperLeftY, LowerRightX, LowerRightY); } Darken(vScreen, xres, UpperLeftX, UpperLeftY, LowerRightX, LowerRightY, bDarken ? 128 : 256); if (bPutText) drawString("please wait", vScreen, xres, (xres>>1)-11*4, (yres>>1)-12, 0xFFFF); bActivated = TRUE; nSleepTime = 100; globalMutex->unlock(); } else { globalMutex->lock(); bActivated = FALSE; nSleepTime = 250; if (saveBuffer) { RestoreArea(vScreen, saveBuffer, xres, UpperLeftX, UpperLeftY, LowerRightX, LowerRightY); delete saveBuffer; saveBuffer = NULL; } globalMutex->unlock(); } } milkytracker-0.90.85+dfsg/src/tracker/wince/WinCE_main.h0000644000175000017500000000214311150223367022074 0ustar admin2admin2/* * tracker/wince/WinCE_main.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #if !defined(AFX_FIRSTGX_H__239AB522_02E1_4FB5_AA73_76CA32550764__INCLUDED_) #define AFX_FIRSTGX_H__239AB522_02E1_4FB5_AA73_76CA32550764__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "WinCE_resource.h" #define MENU_HEIGHT 26 #endif // !defined(AFX_FIRSTGX_H__239AB522_02E1_4FB5_AA73_76CA32550764__INCLUDED_) milkytracker-0.90.85+dfsg/src/tracker/wince/VirtualKeyToScanCodeTable.cpp0000644000175000017500000000361511150223367025435 0ustar admin2admin2/* * tracker/wince/VirtualKeyToScanCodeTable.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "VirtualKeyToScanCodeTable.h" const pp_int16 vkeyToScancode[256] = { -1, -1, -1, -1, -1, -1, -1, -1, 14, 15, -1, -1, -1, 28, -1, -1, 54, 29, -1, -1, 58, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 57, 73, 81, 79, 71, 75, 72, 77, 80, -1, -1, -1, -1, 82, 83, -1, 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 87, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, 13, 51, 12, 52, 53, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 43, 27, 40, -1, -1, -1, 86, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56 }; milkytracker-0.90.85+dfsg/src/tracker/wince/Simple.h0000644000175000017500000002105011116745157021362 0ustar admin2admin2// Simple vector container and string wrapper classes #ifndef __SIMPLE_H__ #define __SIMPLE_H__ #include #include #include ///////////////////////////////////////////////////////////////////////////////////////////// // very simple vector class ///////////////////////////////////////////////////////////////////////////////////////////// template class SimpleVector { private: Type** values; int numValuesAllocated; int numValues; bool destroy; // don't assign this class please SimpleVector& operator=(const SimpleVector& src) { return *this; } public: SimpleVector(int initialSize = 0, bool destroy = true) { this->destroy = destroy; if (initialSize == 0) initialSize = 16; numValuesAllocated = initialSize; if (initialSize) values = new Type*[initialSize]; else values = 0; numValues = 0; } ~SimpleVector() { if (values) { if (destroy) for (int i = 0; i < numValues; i++) delete values[i]; delete[] values; } } SimpleVector* const clone() { SimpleVector* clonedVector = new SimpleVector(numValuesAllocated, true); for (int i = 0; i < numValues; i++) { clonedVector->values[i] = new Type(*values[i]); } clonedVector->numValues = numValues; return clonedVector; } void clear() { if (values) { if (destroy) for (int i = 0; i < numValues; i++) delete values[i]; numValues = 0; } } bool remove(int index) { if (!numValues) return false; if (index < 0 || index >= numValues) return false; if (destroy) delete values[index]; for (int i = index; i < numValues-1; i++) values[i] = values[i+1]; numValues--; return true; } void add(Type* value) { if (numValues >= numValuesAllocated) { numValuesAllocated += 16; Type** values = new Type*[numValuesAllocated]; for (int i = 0; i < numValues; i++) { values[i] = this->values[i]; } delete[] this->values; this->values = values; } values[numValues++] = value; } Type* get(int index) const { if (index < numValues) { return values[index]; } else return 0; } int size() const { return numValues; } bool isEmpty() const { return numValues == 0; } }; ///////////////////////////////////////////////////////////////////////////////////////////// // quick and dirty string wrapper class // lacks serious overflow checks, so use with care only ///////////////////////////////////////////////////////////////////////////////////////////// class SimpleString { private: TCHAR* strBuffer; unsigned int allocatedSize; HRESULT __fastcall AnsiToUnicode(LPCSTR pszA, LPWSTR* ppszW) { ULONG cCharacters; DWORD dwError; // If input is null then just return the same. if (NULL == pszA) { *ppszW = NULL; return NOERROR; } // Determine number of wide characters to be allocated for the // Unicode string. cCharacters = (ULONG)strlen(pszA)+1; // Use of the OLE allocator is required if the resultant Unicode // string will be passed to another COM component and if that // component will free it. Otherwise you can use your own allocator. *ppszW = (LPWSTR) malloc(cCharacters*2); if (NULL == *ppszW) return E_OUTOFMEMORY; // Covert to Unicode. if (0 == MultiByteToWideChar(CP_ACP, 0, pszA, cCharacters, *ppszW, cCharacters)) { dwError = GetLastError(); free(*ppszW); *ppszW = NULL; return HRESULT_FROM_WIN32(dwError); } return NOERROR; } void reAlloc(unsigned int newSize) { if (newSize <= allocatedSize) return; TCHAR* newStrBuffer = new TCHAR[newSize]; memcpy(newStrBuffer, strBuffer, sizeof(TCHAR)*allocatedSize); delete[] strBuffer; strBuffer = newStrBuffer; allocatedSize = newSize; } public: // Empty string SimpleString() { strBuffer = new TCHAR[1]; *strBuffer = 0; allocatedSize = 1; } // String from single character SimpleString(TCHAR c) { strBuffer = new TCHAR[2]; *strBuffer = c; *(strBuffer+1) = 0; allocatedSize = 2; } SimpleString(const TCHAR* str) { strBuffer = new TCHAR[_tcslen(str) + 1]; _tcscpy(strBuffer, str); allocatedSize = (unsigned int)_tcslen(str) + 1; } SimpleString(const char* str) { LPWSTR tempStr = NULL; if (AnsiToUnicode(str, &tempStr) == NOERROR) { strBuffer = new TCHAR[_tcslen(tempStr) + 1]; allocatedSize = (unsigned int)_tcslen(tempStr) + 1; _tcscpy(strBuffer, tempStr); free(tempStr); } else { strBuffer = new TCHAR[1]; *strBuffer = 0; allocatedSize = 1; } } SimpleString(const TCHAR* str, unsigned int length) { strBuffer = new TCHAR[length + 1]; memcpy(strBuffer, str, length*sizeof(TCHAR)); strBuffer[length] = 0; allocatedSize = length + 1; } // copy c'tor SimpleString(const SimpleString& str) { strBuffer = new TCHAR[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize*sizeof(TCHAR)); allocatedSize = str.allocatedSize; } operator const TCHAR*() const { return strBuffer; } TCHAR& operator[] (unsigned int i) { if (i >= length()) return strBuffer[length()]; return strBuffer[i]; } const TCHAR* getStrBuffer() const { return strBuffer; } // assignment operator SimpleString& operator=(const SimpleString& str) { if (this != &str) { delete[] strBuffer; strBuffer = new TCHAR[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize*sizeof(TCHAR)); allocatedSize = str.allocatedSize; } return *this; } SimpleString& operator=(const char* str) { delete[] strBuffer; allocatedSize = (unsigned int)strlen(str)+1; strBuffer = new TCHAR[allocatedSize]; for (unsigned int i = 0; i < allocatedSize; i++) strBuffer[i] = str[i]; return *this; } // comparison is necessary too bool operator==(const SimpleString& str) const { return _tcscmp(strBuffer, str.strBuffer) == 0; } bool operator!=(const SimpleString& str) const { return _tcscmp(strBuffer, str.strBuffer) != 0; } int compareTo(const SimpleString& str) const { return _tcscmp(strBuffer, str.strBuffer); } void toUpper() { for (unsigned int i = 0; i < length(); i++) if (strBuffer[i] >= 'a' && strBuffer[i] <= 'z') strBuffer[i] -= 'a'-'A'; } ~SimpleString() { delete[] strBuffer; } unsigned int length() const { return (unsigned int)_tcslen(strBuffer); } void insertAt(unsigned int i, const SimpleString& s) { // doesn't work if (i > length()) return; allocatedSize = length() + s.length() + 1; TCHAR* newStr = new TCHAR[allocatedSize]; memcpy(newStr, strBuffer, i*sizeof(TCHAR)); memcpy(newStr + i, s.strBuffer, s.length()*sizeof(TCHAR)); memcpy(newStr + i + s.length(), strBuffer + i, (length() - i)*sizeof(TCHAR)); newStr[length() + s.length()] = 0; delete[] strBuffer; strBuffer = newStr; } void append(const SimpleString& s) { insertAt(length(), s); } void deleteAt(unsigned int i, unsigned int numChars) { // not possible if (i > length()) return; // nothing to delete if ((signed)length() - (signed)numChars < 0) return; // nothing to delete if (strBuffer[i] == 0) return; TCHAR* newStr = new TCHAR[length() - numChars + 1]; allocatedSize = length() - numChars + 1; memcpy(newStr, strBuffer, i*sizeof(TCHAR)); memcpy(newStr + i, strBuffer + i + numChars, (length() - i - numChars)*sizeof(TCHAR)); newStr[length() - numChars] = 0; delete[] strBuffer; strBuffer = newStr; } void replace(const SimpleString& str) { delete[] strBuffer; strBuffer = new TCHAR[str.allocatedSize]; memcpy(strBuffer, str.strBuffer, str.allocatedSize*sizeof(TCHAR)); allocatedSize = str.allocatedSize; } SimpleString stripPath() const { TCHAR* ptr = strBuffer+_tcslen(strBuffer); while (ptr > strBuffer && *ptr != '\\') ptr--; if (ptr != strBuffer) ptr++; SimpleString str = ptr; return str; } SimpleString stripExtension() const { TCHAR* ptr = strBuffer+_tcslen(strBuffer); while (ptr > strBuffer && *ptr != '.' && *ptr != '\\') ptr--; if (*ptr == '\\') return strBuffer; if (ptr != strBuffer) { SimpleString str; delete[] str.strBuffer; str.allocatedSize = (unsigned int)((ptr-strBuffer)+1); str.strBuffer = new TCHAR[str.allocatedSize]; memcpy(str.strBuffer, strBuffer, (ptr-strBuffer)*sizeof(TCHAR)); str.strBuffer[(ptr-strBuffer)] = '\0'; return str; } else { return ptr; } } SimpleString getExtension() const { TCHAR* ptr = strBuffer+_tcslen(strBuffer); while (ptr > strBuffer && *ptr != '.' && *ptr != '/') ptr--; if (*ptr != '.') return _T(""); return ptr; } }; #endif milkytracker-0.90.85+dfsg/src/tracker/wince/ButtonMapper.h0000644000175000017500000000230611150223367022544 0ustar admin2admin2/* * tracker/wince/ButtonMapper.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef BUTTONMAPPER__H #define BUTTONMAPPER__H struct TButtonMapping { WORD keyModifiers; WORD virtualKeyCode; }; enum EOrientation { eOrientation90CW, eOrientation90CCW, eOrientationNormal }; extern TButtonMapping mappings[]; extern EOrientation orientation; extern pp_int32 allowVirtualKeys; extern pp_int32 hideTaskBar; extern pp_int32 doublePixels; extern pp_int32 dontTurnOffDevice; void InitButtonRemapper(); #endif milkytracker-0.90.85+dfsg/src/tracker/wince/VirtualKeyToScanCodeTable.h0000644000175000017500000000166511150223367025105 0ustar admin2admin2/* * tracker/wince/VirtualKeyToScanCodeTable.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef __VIRTUALKEYTOSCANCODETABLE_H__ #define __VIRTUALKEYTOSCANCODETABLE_H__ #include "BasicTypes.h" extern const pp_int16 vkeyToScancode[256]; #endif milkytracker-0.90.85+dfsg/src/tracker/wince/Logger.cpp0000644000175000017500000000366411116745157021716 0ustar admin2admin2#include "Logger.h" #include "Simple.h" // construct logger CLogger::CLogger() : fileName(NULL) { m_log = new SimpleVector(); } CLogger::CLogger(LPCTSTR fileName) : fileName(fileName) { m_log = new SimpleVector(); } // destroy logger CLogger::~CLogger() { if (fileName) Export(fileName); delete m_log; } // clear logger void CLogger::Clear() { m_log->clear(); } // log string void CLogger::Log(const SimpleString& logData) { m_log->add(new SimpleString(logData)); } // how many strings does the logger contain? unsigned int CLogger::GetSize() const { return m_log->size(); } // get single entry from logger const SimpleString& CLogger::GetEntry(unsigned int i) const { return *m_log->get(i); } // export this log to a text file bool CLogger::Export(LPCTSTR fileName) const { // create file HANDLE handle = ::CreateFile(fileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // file couldn't be created if (INVALID_HANDLE_VALUE == handle) return false; // write out all strings in ANSI format for (int i = 0; i < m_log->size(); i++) { const SimpleString& strData = *m_log->get(i); // How many memory do we need for the ANSI string? int len = strData.length()*2 + 4; // allocate memory char* szOut = new char[len]; // convert Unicode string to ANSI using default encoding int res = ::WideCharToMultiByte(CP_ACP, 0, strData, strData.length(), szOut, len, NULL, NULL); // if successfully converted append NEWLINE & CR if (res) { szOut[res] = '\r'; szOut[res+1] = '\n'; // terminate string szOut[res+2] = '\0'; // write out string unsigned long NumberOfBytesWritten; BOOL bResult = ::WriteFile(handle, szOut, res+2, &NumberOfBytesWritten, NULL); // flush buffers just in case ::FlushFileBuffers(handle); } // ANSI string no longer needed delete[] szOut; } // close file ::CloseHandle(handle); return true; } milkytracker-0.90.85+dfsg/src/tracker/wince/WaitStateThread.h0000644000175000017500000000303711150223367023163 0ustar admin2admin2/* * tracker/wince/WaitStateThread.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef WAITSTATETHREAD__H #define WAITSTATETHREAD__H #include class WaitStateThread { private: static WaitStateThread* instance; BOOL bActivated; DWORD nSleepTime; DWORD threadID; HANDLE hThread; WORD* saveBuffer; // display width, height, pitch in 16 bit words int xres, yres, pitch; int UpperLeftX, UpperLeftY; int LowerRightX, LowerRightY; // area width, height int Width, Height; static DWORD WINAPI MyThreadProc(LPVOID lpParameter); WaitStateThread(); public: static WaitStateThread* getInstance() { if (instance == NULL) instance = new WaitStateThread(); return instance; } void setDisplayResolution(int width, int height); void activate(BOOL bActivate, BOOL bDarken = TRUE, BOOL bPutText = TRUE); }; #endif milkytracker-0.90.85+dfsg/src/tracker/wince/WinCE_ThreadTimer.h0000644000175000017500000000300211150223367023353 0ustar admin2admin2/* * tracker/wince/WinCE_ThreadTimer.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #ifndef THREADTIMER__H #define THREADTIMER__H #include typedef void (*ThreadTimerProc)(void* obj, UINT idEvent); class CThreadTimer { void* object; // pointer to the "parent" object (like CTimersDlg) UINT idEvent; // timer ID UINT elapse; // "Sleep time" in milliseconds ThreadTimerProc proc; // Callback function, supplied by the user BOOL isActive; // Set to FALSE after the call to KillTimer CRITICAL_SECTION lock; // thread synchronization static DWORD WINAPI ThreadFunction (LPVOID pParam); // thread entry point public: CThreadTimer(); virtual ~CThreadTimer(); UINT SetTimer (void* obj, UINT nIDEvent, UINT uElapse, ThreadTimerProc lpTimerProc); BOOL KillTimer(); }; #endif milkytracker-0.90.85+dfsg/src/tracker/wince/WinCE_resource.h0000644000175000017500000000317011150223367023000 0ustar admin2admin2/* * tracker/wince/WinCE_resource.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ //{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by main.rc // #define IDS_APP_TITLE 1 #define IDS_HELLO 2 #define IDC_FIRSTGX 3 #define IDI_FIRSTGX 101 #define IDM_MENU 102 #define IDD_ABOUTBOX 103 #define IDS_HELP 104 #define IDI_ICON1 106 #define IDS_COMMAND1 301 #define IDM_MAIN_COMMAND1 40001 #define IDM_HELP_ABOUT 40003 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 108 #define _APS_NEXT_COMMAND_VALUE 40004 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif milkytracker-0.90.85+dfsg/src/tracker/wince/WinCE_NEWRES.H0000644000175000017500000000156310737746457022144 0ustar admin2admin2#ifndef __NEWRES_H__ #define __NEWRES_H__ #if !defined(UNDER_CE) #define UNDER_CE _WIN32_WCE #endif #if defined(_WIN32_WCE) #if !defined(WCEOLE_ENABLE_DIALOGEX) #define DIALOGEX DIALOG DISCARDABLE #endif #include #define SHMENUBAR RCDATA #if defined(WIN32_PLATFORM_PSPC) && (_WIN32_WCE >= 300) #include #define AFXCE_IDR_SCRATCH_SHMENU 28700 #else #define I_IMAGENONE (-2) #define NOMENU 0xFFFF #define IDS_SHNEW 1 #define IDM_SHAREDNEW 10 #define IDM_SHAREDNEWDEFAULT 11 #endif // _WIN32_WCE_PSPC #define AFXCE_IDD_SAVEMODIFIEDDLG 28701 #endif // _WIN32_WCE #ifdef RC_INVOKED #ifndef _INC_WINDOWS #define _INC_WINDOWS #include "winuser.h" // extract from windows header #include "winver.h" #endif #endif #ifdef IDC_STATIC #undef IDC_STATIC #endif #define IDC_STATIC (-1) #endif //__NEWRES_H__ milkytracker-0.90.85+dfsg/src/tracker/wince/Logger.h0000644000175000017500000000211411116745157021350 0ustar admin2admin2// About this class // ---------------------------------------------------------------------- // This class is a very simple logger class. It simply logs strings // in a vector, provides access to the log entries and optionally // exports the log into a text file. #ifndef __LOGGER_H__ #define __LOGGER_H__ #include class SimpleString; template class SimpleVector; class CLogger { private: // the vector which contains the log data SimpleVector* m_log; LPCTSTR fileName; public: // construct logger instance CLogger(); // construct logger instance which writes out to filename on destruction CLogger(LPCTSTR fileName); // destruct logger instance ~CLogger(); // clear log void Clear(); // log a string void Log(const SimpleString& logData); // return size of log unsigned int GetSize() const; // get log entry const SimpleString& GetEntry(unsigned int i) const; // is this log empty? bool IsEmpty() const { return m_log ? GetSize() == 0 : true; } // export log file into a text file bool Export(LPCTSTR fileName) const; }; #endif milkytracker-0.90.85+dfsg/src/tracker/wince/WinCE_ThreadTimer.cpp0000644000175000017500000000451211150223367023715 0ustar admin2admin2/* * tracker/wince/WinCE_ThreadTimer.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "WinCE_ThreadTimer.h" CThreadTimer::CThreadTimer():object(0),idEvent(0),elapse(0), isActive(FALSE) { InitializeCriticalSection(&lock); } CThreadTimer::~CThreadTimer() { DeleteCriticalSection(&lock); } UINT CThreadTimer::SetTimer (void* obj, UINT nIDEvent, UINT uElapse, ThreadTimerProc lpTimerProc) { object = obj; idEvent = nIDEvent; elapse = uElapse; proc = lpTimerProc; EnterCriticalSection(&lock); // is it already active? if (isActive) { LeaveCriticalSection(&lock); return 0; } // Start the thread DWORD threadId; HANDLE threadHandle = CreateThread (NULL, 0, CThreadTimer::ThreadFunction, this, 0, &threadId); //SetThreadPriority(threadHandle,THREAD_PRIORITY_HIGHEST); // this is optional SetThreadPriority(threadHandle,THREAD_PRIORITY_ABOVE_NORMAL); // this is optional isActive = TRUE; LeaveCriticalSection(&lock); return nIDEvent; } BOOL CThreadTimer::KillTimer() { EnterCriticalSection(&lock); isActive = FALSE; LeaveCriticalSection(&lock); return TRUE; } DWORD WINAPI CThreadTimer::ThreadFunction (LPVOID pParam) { // Here is the heart of our little timer CThreadTimer* obj = (CThreadTimer*) pParam; BOOLEAN isActive = TRUE; do { Sleep(obj->elapse); obj->proc (obj->object, obj->idEvent); EnterCriticalSection(&obj->lock); isActive = obj->isActive; LeaveCriticalSection(&obj->lock); } while (isActive); return 0; } milkytracker-0.90.85+dfsg/src/tracker/wince/ButtonMapper.cpp0000644000175000017500000000501211150223367023074 0ustar admin2admin2/* * tracker/wince/ButtonMapper.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "TrackerSettingsDatabase.h" #include "XMFile.h" #include "PPSystem_WIN32.h" #include "..\PPUI\Event.h" #include "ButtonMapper.h" static TrackerSettingsDatabase* keyDatabase = NULL; TButtonMapping mappings[256]; void InitButtonRemapper() { memset(mappings, 0xFF, sizeof(mappings)); if (XMFile::exists(System::getConfigFileName(_T("keys.cfg")))) { // load mappings keyDatabase = new TrackerSettingsDatabase(); XMFile f(System::getConfigFileName(_T("keys.cfg"))); keyDatabase->serialize(f); const PPDictionaryKey* theKey = keyDatabase->getFirstKey(); while (theKey) { PPString str = theKey->getKey(); if (memcmp(str, "KEY:", 4) == 0) { unsigned int v = theKey->getIntValue(); DWORD buttonCode = (WORD)(v & 0xFFFF); if (buttonCode < 256) { mappings[buttonCode].keyModifiers = (BYTE)(v >> 16); mappings[buttonCode].virtualKeyCode = (BYTE)(v >> 24); } } theKey = keyDatabase->getNextKey(); } theKey = keyDatabase->restore("ORIENTATION"); if (theKey) { switch (theKey->getIntValue()) { case 0: orientation = eOrientation90CW; break; case 1: orientation = eOrientation90CCW; break; case 2: orientation = eOrientationNormal; break; } } theKey = keyDatabase->restore("ALLOWVIRTUALKEYS"); if (theKey) { allowVirtualKeys = theKey->getIntValue(); } theKey = keyDatabase->restore("HIDETASKBAR"); if (theKey) { hideTaskBar = theKey->getIntValue(); } theKey = keyDatabase->restore("DOUBLEPIXELS"); if (theKey) { doublePixels = theKey->getIntValue(); } theKey = keyDatabase->restore("DONTTURNOFFDEVICE"); if (theKey) { dontTurnOffDevice = theKey->getIntValue(); } delete keyDatabase; } } milkytracker-0.90.85+dfsg/src/tracker/wince/WinCE_main.cpp0000644000175000017500000011544111150223367022435 0ustar admin2admin2/* * tracker/wince/WinCE_main.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ // ------------------ WinCE ------------------------------- #include #include #include #include "WinCE_main.h" #include "VirtualKeyToScanCodeTable.h" // ------------------ tracker ----------------------------- #include "PPUI.h" #include "PPMutex.h" #include "Screen.h" #include "Tracker.h" #include "DisplayDevice_GAPI.h" #include "ButtonMapper.h" #include "WaitStateThread.h" #include "LogoSmall.h" #include "XMFile.h" #include "GlobalColorConfig.h" #define WINDOWS_DEFAULT_TIMER #undef RESOLUTION_CHECK #define MAX_LOADSTRING 100 #define DBLCLKTIME 1000 #define DRAGSENSITIVITY 2 HINSTANCE hInst; // The current instance WNDCLASS wc; HWND hwndCB; // The command bar handle HWND hWnd; BOOL gxInit = FALSE; BOOL taskBar = TRUE; BOOL gxActive = FALSE; PPMutex* globalMutex = NULL; unsigned short* vScreen = NULL; PPSize windowSize(DISPLAYDEVICE_WIDTH,DISPLAYDEVICE_HEIGHT); // Global GAPI variables: GXDisplayProperties gx_displayprop; #ifndef WINDOWS_DEFAULT_TIMER #include "WinCE_ThreadTimer.h" #define WM_MYTIMER (WM_USER + 10) static CThreadTimer myThreadTimer; void MyThreadTimerProc(void* obj, UINT idEvent) { SendMessage(hWnd, WM_MYTIMER, 0, 0); } #endif // ------------------ Tracker -------------------------------------------------------------------------- EOrientation orientation = eOrientation90CW; pp_int32 doublePixels = FALSE; pp_int32 allowVirtualKeys = FALSE; pp_int32 hideTaskBar = TRUE; pp_int32 dontTurnOffDevice = FALSE; static PPScreen* myTrackerScreen = NULL; static Tracker* myTracker = NULL; static PPDisplayDevice* myDisplayDevice = NULL; // ------------------- Logger ----------------------------- #ifdef DEBUG #include "Logger.h" #include "Simple.h" #include "PPSystem.h" static CLogger* logger = NULL; #endif void TrackerCreate(); void TrackerStartUp(bool showSplash); void TrackerInitGUI(bool showSplash); // ------------------ Forward declarations of functions included in this code module: ------------------ void TaskBar(bool show); ATOM MyRegisterClass(HINSTANCE, LPTSTR); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // ------------------ debugging forwards --------------------------------------------------------------- void drawString(const char*, unsigned short*, unsigned int, unsigned int, unsigned int, unsigned short); // ------------------- update screen ------------------------------------------------------------------- void UpdateScreen(unsigned short*); void UpdateScreen(); void DrawBackground(bool shade = true); bool NeedsDrawBackground(); ////////////////////////////////////////////////////////////////////////// // Exported functions: // PPGetTickCount() is used for milisecond timing // QueryKeyModifiers is used for detecting the state of the modifier keys // SuspendFullScreen() is used to disable full screen mode // ResumeFullScreen() is used to disable full screen mode ////////////////////////////////////////////////////////////////////////// pp_uint32 PPGetTickCount() { return ::GetTickCount(); } void QueryKeyModifiers() { if (::GetAsyncKeyState(VK_SHIFT)>>15) setKeyModifier(KeyModifierSHIFT); else clearKeyModifier(KeyModifierSHIFT); if (::GetAsyncKeyState(VK_MENU)>>15) setKeyModifier(KeyModifierALT); else clearKeyModifier(KeyModifierALT); if (::GetAsyncKeyState(VK_CONTROL)>>15) setKeyModifier(KeyModifierCTRL); else clearKeyModifier(KeyModifierCTRL); } void SuspendFullScreen() { GXCloseInput(); GXCloseDisplay(); TaskBar(true); gxActive = FALSE; ShowWindow(hWnd, SW_SHOW); } void ResumeFullScreen() { ShowWindow(hWnd, SW_SHOW); TaskBar(false); SHSipPreference(hWnd, SIP_FORCEDOWN); GXOpenDisplay(hWnd, GX_FULLSCREEN); GXOpenInput(); gxActive = TRUE; // clear screen with shade if necessary if (NeedsDrawBackground()) DrawBackground(); UpdateScreen(); } ////////////////////////////////////////////////////////////////////////// // Taskbar handling ////////////////////////////////////////////////////////////////////////// void TaskBar(bool show) { if (!hideTaskBar) return; RECT rc; GetWindowRect( hWnd, &rc ); HWND hWndTB = FindWindow(TEXT("HHTaskbar"),NULL); if (show && hWndTB) { if (taskBar) return; SHFullScreen( hWnd, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON + SHFS_SHOWSTARTICON ); ShowWindow( hWndTB, SW_SHOW ); MoveWindow( hWnd, rc.left, rc.top + 26, rc.right, rc.bottom - 26, TRUE ); taskBar = TRUE; } else if (hWndTB) { if (!taskBar) return; SHFullScreen( hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON + SHFS_HIDESTARTICON ); ShowWindow( hWndTB, SW_HIDE ); MoveWindow( hWnd, rc.left, rc.top - 26, rc.right, rc.bottom + 26, TRUE ); taskBar = FALSE; } } ////////////////////////////////////////////////////////////////////////// // Init GAPI // To-do: Should go into DisplayDevice someday ////////////////////////////////////////////////////////////////////////// BOOL InitGAPI(HWND hWnd) { TaskBar(false); // Attempt to take over the screen if (GXOpenDisplay( hWnd, GX_FULLSCREEN) == 0) return FALSE; gxActive = TRUE; // Get display properties gx_displayprop = GXGetDisplayProperties(); #ifdef RESOLUTION_CHECK if ((gx_displayprop.cyHeight!=320)||(gx_displayprop.cxWidth!=240)) { // Only dealing with 240x320 resolution in this code GXCloseDisplay(); MessageBox(hWnd,L"Sorry, only supporting 240x320 display devices",L"Sorry!", MB_OK); return FALSE; } #endif // Check for 16 bit color display if (gx_displayprop.cBPP != 16) { // Only dealing with 16 bit color in this code GXCloseDisplay(); MessageBox(hWnd,L"Sorry, only supporting 16bit color",L"Sorry!", MB_OK); return FALSE; } // Take over button handling GXOpenInput(); globalMutex = new PPMutex(); return TRUE; } ////////////////////////////////////////////////////////////////////////// // Dispose GAPI ////////////////////////////////////////////////////////////////////////// void ExitGAPI() { if (gxActive) { // Clean up GXSuspend(); GXCloseInput(); GXCloseDisplay(); TaskBar(true); gxActive = false; } } void HandleCommandLine(LPCTSTR lpCmdLine) { // Retrieve input file PPSystemString fileInput(lpCmdLine); // When there is something specified, check if it's an existing file if (fileInput.length() && XMFile::exists(fileInput)) { PPSystemString* strPtr = &fileInput; PPEvent event(eFileDragDropped, &strPtr, sizeof(PPSystemString*)); myTrackerScreen->raiseEvent(&event); } } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { #ifdef DEBUG SimpleString path(System::getConfigFileName(_T("milky.log"))); CLogger _logger(path); logger = &_logger; #endif MSG msg; HACCEL hAccelTable; // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { TaskBar(true); return FALSE; } HandleCommandLine(lpCmdLine); #ifndef WINDOWS_DEFAULT_TIMER HANDLE hThread = GetCurrentThread(); SetThreadPriority(hThread, THREAD_PRIORITY_BELOW_NORMAL); #endif hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_FIRSTGX); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } delete myTracker; delete myTrackerScreen; ExitGAPI(); delete globalMutex; return msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; //wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GAPI1)); wc.hCursor = 0; wc.hbrBackground = (HBRUSH) GetStockObject(HOLLOW_BRUSH); wc.lpszMenuName = 0; wc.lpszClassName = szWindowClass; return RegisterClass(&wc); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // The window class name hInst = hInstance; // Store instance handle in our global variable // Initialize global strings LoadString(hInstance, IDC_FIRSTGX, szWindowClass, MAX_LOADSTRING); LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); //If it is already running, then focus on the window hWnd = FindWindow(szWindowClass, szTitle); if (hWnd) { SetForegroundWindow ((HWND) (((DWORD)hWnd) | 0x01)); return 0; } MyRegisterClass(hInstance, szWindowClass); RECT rect; GetClientRect(hWnd, &rect); hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } // This will also load local WinCE config InitButtonRemapper(); if (!InitGAPI(hWnd)) return FALSE; TrackerCreate(); bool showSplash = myTracker->getShowSplashFlagFromDatabase(); TrackerInitGUI(showSplash); TrackerStartUp(showSplash); UpdateScreen(); // Create timers #ifdef WINDOWS_DEFAULT_TIMER SetTimer(hWnd, 10, 20, NULL); #else myThreadTimer.SetTimer (NULL, 1, 20, MyThreadTimerProc); #endif return TRUE; } ////////////////////////////////////////////////////////////////////////// // Convert final coordinates from current orientation ////////////////////////////////////////////////////////////////////////// void POINTFROMPARAM(PPPoint& point, int param) { const unsigned int screenWidth = ::windowSize.width; const unsigned int screenHeight = ::windowSize.height; switch (orientation) { case eOrientation90CW: { int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenHeight<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenWidth<> 1); if (vCenter < 0) vCenter = 0; point.y = LOWORD(param) - hCenter; point.x = (gx_displayprop.cyHeight - 1 - (HIWORD(param) + vCenter)); break; } case eOrientation90CCW: { int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenHeight<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenWidth<> 1); if (vCenter < 0) vCenter = 0; point.y = gx_displayprop.cxWidth - 1 - (LOWORD(param) + hCenter); point.x = HIWORD(param) - vCenter; break; } case eOrientationNormal: int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenWidth<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenHeight<> 1); if (vCenter < 0) vCenter = 0; point.x = LOWORD(param) - hCenter; point.y = HIWORD(param) - vCenter; break; } point.x >>= doublePixels; point.y >>= doublePixels; } void UpdateScreen(unsigned short* vScreen) { if (!gxActive) return; globalMutex->lock(); // Get the start of the screen memory from the GX function. unsigned short * buffer = (unsigned short *) GXBeginDraw(); unsigned short * line_buffer = buffer; if (buffer == NULL) { globalMutex->unlock(); return; } const unsigned int screenWidth = ::windowSize.width; const unsigned int screenHeight = ::windowSize.height; const unsigned int hcbxpitch = gx_displayprop.cbxPitch >> 1; const unsigned int hcbypitch = gx_displayprop.cbyPitch >> 1; const unsigned int hRes = gx_displayprop.cxWidth >> doublePixels; const unsigned int vRes = gx_displayprop.cyHeight >> doublePixels; unsigned short* vscr = vScreen; if (gx_displayprop.ffFormat & kfDirect565) { switch (orientation) { case eOrientation90CW: { // PocketPC: gx_displayprop.cxWidth = 240, gx_displayprop.cyHeight = 320 const unsigned int width = hRes > screenHeight ? screenHeight : hRes; const unsigned int height = vRes > screenWidth ? screenWidth : vRes; int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenHeight<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenWidth<> 1); if (vCenter < 0) vCenter = 0; if (!doublePixels) { for (unsigned int x=0; x screenHeight ? screenHeight : hRes; const unsigned int height = vRes > screenWidth ? screenWidth : vRes; int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenHeight<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenWidth<> 1); if (vCenter < 0) vCenter = 0; if (!doublePixels) { for (unsigned int x=0; x screenWidth ? screenWidth : hRes; const unsigned int height = vRes > screenHeight ? screenHeight : vRes; int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenWidth<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenHeight<> 1); if (vCenter < 0) vCenter = 0; if (!doublePixels) { for (unsigned int y=0; yunlock(); } void UpdateScreenRegion(unsigned short* vScreen, const PPRect& rect) { if (!gxActive) return; globalMutex->lock(); // Get the start of the screen memory from the GX function. unsigned short * buffer = (unsigned short *) GXBeginDraw(); unsigned short * line_buffer = buffer; if (buffer == NULL) { globalMutex->unlock(); return; } const unsigned int screenWidth = ::windowSize.width; const unsigned int screenHeight = ::windowSize.height; const unsigned int hcbxpitch = gx_displayprop.cbxPitch >> 1; const unsigned int hcbypitch = gx_displayprop.cbyPitch >> 1; const unsigned int hRes = gx_displayprop.cxWidth >> doublePixels; const unsigned int vRes = gx_displayprop.cyHeight >> doublePixels; unsigned short* vscr = vScreen + rect.y1 * screenWidth + rect.x1; if (gx_displayprop.ffFormat & kfDirect565) { switch (orientation) { case eOrientation90CW: { // PocketPC: gx_displayprop.cxWidth = 240, gx_displayprop.cyHeight = 320 const unsigned int width = hRes > screenHeight ? screenHeight : hRes; const unsigned int height = vRes > screenWidth ? screenWidth : vRes; if (rect.x1 >= (signed)height || rect.y1 >= (signed)width) break; int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenHeight<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenWidth<> 1); if (vCenter < 0) vCenter = 0; int rx2 = rect.x2; int ry2 = rect.y2; if (rx2 > (signed)height) rx2 = height; if (ry2 > (signed)width) ry2 = width; if (!doublePixels) { for (int x=rect.y1; x screenHeight ? screenHeight : hRes; const unsigned int height = vRes > screenWidth ? screenWidth : vRes; if (rect.x1 >= (signed)height || rect.y1 >= (signed)width) break; int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenHeight<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenWidth<> 1); if (vCenter < 0) vCenter = 0; int rx2 = rect.x2; int ry2 = rect.y2; if (rx2 > (signed)height) rx2 = height; if (ry2 > (signed)width) ry2 = width; if (!doublePixels) { for (int x=rect.y1; x screenWidth ? screenWidth : hRes; int height = vRes > screenHeight ? screenHeight : vRes; if (rect.x1 >= width || rect.y1 >= height) break; int hCenter = (gx_displayprop.cxWidth >> 1) - ((screenWidth<> 1); if (hCenter < 0) hCenter = 0; int vCenter = (gx_displayprop.cyHeight >> 1) - ((screenHeight<> 1); if (vCenter < 0) vCenter = 0; int rx2 = rect.x2; int ry2 = rect.y2; if (rx2 > width) rx2 = width; if (ry2 > height) ry2 = height; if (!doublePixels) { for (int y=rect.y1; yunlock(); } void UpdateScreen() { if (myTrackerScreen) { myTrackerScreen->paint(); } UpdateScreen(vScreen); } void DrawBackground(bool shade) { if (!gxActive) return; globalMutex->lock(); // Get the start of the screen memory from the GX function. unsigned short * buffer = (unsigned short *) GXBeginDraw(); if (buffer == NULL) { globalMutex->unlock(); return; } const unsigned int screenWidth = gx_displayprop.cxWidth; const unsigned int screenHeight = gx_displayprop.cyHeight; const unsigned int hcbxpitch = gx_displayprop.cbxPitch >> 1; const unsigned int hcbypitch = gx_displayprop.cbyPitch >> 1; if (shade) { PPColor col = GlobalColorConfig::getInstance()->getColor(GlobalColorConfig::ColorTheme); PPColor srcCol = col, dstCol = col; srcCol.scaleFixed(32768); for (unsigned int y = 0; y < screenHeight; y++) for (unsigned int x = 0; x < screenWidth; x++) { unsigned short* pixel = buffer+x*hcbxpitch+y*hcbypitch; int r,g,b; switch (orientation) { case eOrientation90CW: { int s = (x*65536) / screenWidth; r = ((srcCol.r) * s + dstCol.r * (65535-s)) >> (16 + 3); g = ((srcCol.g) * s + dstCol.g * (65535-s)) >> (16 + 2); b = ((srcCol.b) * s + dstCol.b * (65535-s)) >> (16 + 3); break; } case eOrientation90CCW: { int s = (x*65536) / screenWidth; r = ((srcCol.r) * (65535-s) + dstCol.r * s) >> (16 + 3); g = ((srcCol.g) * (65535-s) + dstCol.g * s) >> (16 + 2); b = ((srcCol.b) * (65535-s) + dstCol.b * s) >> (16 + 3); break; } case eOrientationNormal: { int s = (y*65536) / screenHeight; r = ((srcCol.r) * s + dstCol.r * (65535-s)) >> (16 + 3); g = ((srcCol.g) * s + dstCol.g * (65535-s)) >> (16 + 2); b = ((srcCol.b) * s + dstCol.b * (65535-s)) >> (16 + 3); break; } } *pixel = (r << 11) + (g << 5) + b; } } else { for (unsigned int y = 0; y < screenHeight; y++) for (unsigned int x = 0; x < screenWidth; x++) { unsigned short* pixel = buffer+x*hcbxpitch+y*hcbypitch; *pixel = 0; } } // End the drawing code GXEndDraw(); globalMutex->unlock(); } bool NeedsDrawBackground() { switch (orientation) { case eOrientation90CCW: case eOrientation90CW: { return (gx_displayprop.cxWidth != (unsigned)windowSize.height) || (gx_displayprop.cyHeight != (unsigned)windowSize.width); } case eOrientationNormal: { return (gx_displayprop.cxWidth != (unsigned)windowSize.width) || (gx_displayprop.cyHeight != (unsigned)windowSize.height); } } return false; } void TrackerCreate() { myTracker = new Tracker(); windowSize = myTracker->getWindowSizeFromDatabase(); #ifdef __LOWRES__ windowSize.width = DISPLAYDEVICE_WIDTH; windowSize.height = DISPLAYDEVICE_HEIGHT; #endif // Allocate virtual screen vScreen = new unsigned short[windowSize.width*windowSize.height]; // Clear virtual screen memset(vScreen, 0, windowSize.width*windowSize.height*sizeof(unsigned short)); myDisplayDevice = new PPDisplayDevice(hWnd, windowSize.width, windowSize.height); myDisplayDevice->setSize(windowSize); myTrackerScreen = new PPScreen(myDisplayDevice, myTracker); myTracker->setScreen(myTrackerScreen); } void TrackerStartUp(bool showSplash) { // Startup procedure myTracker->startUp(true); WaitStateThread::getInstance()->activate(FALSE); myTrackerScreen->enableDisplay(true); if (showSplash) myTracker->hideSplash(); // clear screen with shade if necessary if (NeedsDrawBackground()) DrawBackground(); myTrackerScreen->paint(false); } void TrackerInitGUI(bool showSplash) { // clear screen with black if necessary if (NeedsDrawBackground()) DrawBackground(false); if (showSplash) myTracker->showSplash(); myTrackerScreen->enableDisplay(false); // Put init message on screen drawString("initializing", vScreen, windowSize.width, (windowSize.width>>1)-12*4, (windowSize.height>>1)-12, 0xFFFF); WaitStateThread::getInstance()->setDisplayResolution(windowSize.width, windowSize.height); WaitStateThread::getInstance()->activate(TRUE, TRUE, FALSE); } #ifdef DEBUG void LogWinMsg(CLogger& logger, LPCTSTR msg, LPARAM lParam) { TCHAR dummy[1024]; wsprintf(dummy, _T("%x"), lParam); SimpleString logstr(msg); logstr.append(_T(": ")); logstr.append(dummy); logger.Log(logstr); } void LogMouseDown(CLogger& logger, LPARAM lParam, const PPPoint& point) { TCHAR dummy[1024]; wsprintf(dummy, _T("Before: %i, %i"), LOWORD(lParam), HIWORD(lParam)); SimpleString logstr(dummy); logstr.append(_T(" ")); wsprintf(dummy, _T("After: %i, %i"), point.x, point.y); logstr.append(dummy); logger.Log(logstr); } #endif LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static bool LMouseDrag = false; static PPPoint LMouseDragStartPoint; static bool RMouseDrag = false; static PPPoint RMouseDragStartPoint; static DWORD ltime; static PPPoint llastClickPosition = PPPoint(0,0); static WORD lClickCount = 0; static BOOL lMouseDown = FALSE; static DWORD lButtonDownStartTime; static BOOL rMouseDown = FALSE; static DWORD rtime; static PPPoint rlastClickPosition = PPPoint(0,0); static WORD rClickCount = 0; static DWORD rButtonDownStartTime; static DWORD timerTicker = 0; static DWORD idleResetCounter = 1; static PPPoint p; if (lClickCount > 4) { lClickCount = 0; } if (rClickCount > 4) { rClickCount = 0; } switch (msg) { #ifdef WINDOWS_DEFAULT_TIMER case WM_PAINT: DefWindowProc(hWnd, msg, wParam, lParam); return 0; #else case WM_PAINT: return 0; #endif case WM_SIZE: { #ifdef DEBUG LogWinMsg(*logger, _T("WM_SIZE"), lParam); #endif break; } // ----- left mousebutton ------------------------------- case WM_LBUTTONDOWN: { if (!myTrackerScreen || rMouseDown) break; POINTFROMPARAM(p, lParam); #ifdef DEBUG LogWinMsg(*logger, _T("WM_LBUTTONDOWN"), lParam); LogMouseDown(*logger, lParam, p); #endif PPEvent myEvent(eLMouseDown, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); lMouseDown = TRUE; //lButtonDownStartTime = timerTicker; lButtonDownStartTime = GetTickCount(); if (!lClickCount) { ltime = GetTickCount(); POINTFROMPARAM(llastClickPosition, lParam); } else if (lClickCount == 2) { DWORD deltat = GetTickCount() - ltime; if (deltat > DBLCLKTIME) { lClickCount = 0; ltime = GetTickCount(); POINTFROMPARAM(llastClickPosition, lParam); } } lClickCount++; break; } // ----- right mousebutton ------------------------------- case WM_RBUTTONDOWN: { if (!myTrackerScreen || lMouseDown) break; POINTFROMPARAM(p, lParam); PPEvent myEvent(eRMouseDown, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); rMouseDown = TRUE; //rButtonDownStartTime = timerTicker; rButtonDownStartTime = GetTickCount(); if (!rClickCount) { rtime = GetTickCount(); POINTFROMPARAM(rlastClickPosition, lParam); } else if (rClickCount == 2) { DWORD deltat = GetTickCount() - rtime; if (deltat > DBLCLKTIME) { rClickCount = 0; rtime = GetTickCount(); POINTFROMPARAM(rlastClickPosition, lParam); } } rClickCount++; break; } // ----- left mousebutton ------------------------------- case WM_LBUTTONUP: { LMouseDrag = false; if (!myTrackerScreen || !lMouseDown) break; lClickCount++; if (lClickCount == 4) { DWORD deltat = GetTickCount() - ltime; if (deltat < DBLCLKTIME) { POINTFROMPARAM(p, lParam); if (abs(p.x - llastClickPosition.x) < 4 && abs(p.y - llastClickPosition.y) < 4) { PPEvent myEvent(eLMouseDoubleClick, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); } } lClickCount = 0; } POINTFROMPARAM(p, lParam); PPEvent myEvent(eLMouseUp, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); lMouseDown = FALSE; break; } // ----- right mousebutton ------------------------------- case WM_RBUTTONUP: { RMouseDrag = false; if (!myTrackerScreen || !rMouseDown) break; rClickCount++; if (rClickCount == 4) { DWORD deltat = GetTickCount() - rtime; if (deltat < DBLCLKTIME) { POINTFROMPARAM(p, lParam); if (abs(p.x - rlastClickPosition.x) < 4 && abs(p.y - rlastClickPosition.y) < 4) { PPEvent myEvent(eRMouseDoubleClick, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); } } rClickCount = 0; } POINTFROMPARAM(p, lParam); PPEvent myEvent(eRMouseUp, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); rMouseDown = FALSE; break; } case WM_MOUSEMOVE: { if (!myTrackerScreen) break; if ((wParam&MK_LBUTTON) && lMouseDown) { POINTFROMPARAM(p, lParam); if (!LMouseDrag) { LMouseDragStartPoint = p; LMouseDrag = true; } if (LMouseDrag && (abs(LMouseDragStartPoint.x - p.x) >= DRAGSENSITIVITY || abs(LMouseDragStartPoint.y - p.y) >= DRAGSENSITIVITY)) { PPEvent myEvent(eLMouseDrag, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); } } else if ((wParam&MK_RBUTTON) && rMouseDown) { POINTFROMPARAM(p, lParam); if (!RMouseDrag) { RMouseDragStartPoint = p; RMouseDrag = true; } if (RMouseDrag && (abs(RMouseDragStartPoint.x - p.x) >= DRAGSENSITIVITY || abs(RMouseDragStartPoint.y - p.y) >= DRAGSENSITIVITY)) { PPEvent myEvent(eRMouseDrag, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); } } else { POINTFROMPARAM(p, lParam); PPEvent myEvent(eMouseMoved, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); } break; } #ifdef WINDOWS_DEFAULT_TIMER case WM_TIMER: #else case WM_MYTIMER: #endif { if (!myTrackerScreen) break; if (!(timerTicker % 1)) { PPEvent myEvent(eTimer); myTrackerScreen->raiseEvent(&myEvent); } // reset idle timer, so the device will not turn off // automatically // handle with care and use only when forced to do so if (!(idleResetCounter & 1023) && dontTurnOffDevice) { SystemIdleTimerReset(); } idleResetCounter++; timerTicker++; DWORD currentTime = GetTickCount(); if (lMouseDown && (currentTime - lButtonDownStartTime) > 500) { PPEvent myEvent(eLMouseRepeat, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); } else if (rMouseDown && (currentTime - rButtonDownStartTime) > 500) { PPEvent myEvent(eRMouseRepeat, &p, sizeof(PPPoint)); myTrackerScreen->raiseEvent(&myEvent); } break; } case WM_CLOSE: { if (myTrackerScreen && myTracker) { PPEvent e(eAppQuit); myTrackerScreen->raiseEvent(&e); bool res = myTracker->shutDown(); if (res) DestroyWindow(hWnd); } else { DestroyWindow(hWnd); } break; } case WM_SETTINGCHANGE: TaskBar(false); break; case WM_KEYDOWN: case WM_SYSKEYDOWN: #ifdef DEBUG ::PostMessage(hWnd, WM_CLOSE, 0, 0); #endif if (wParam < 256) { if (mappings[wParam].keyModifiers != 0xFFFF && mappings[wParam].virtualKeyCode != 0xFFFF) { pp_int32 i; WORD vkModifiers[3] = {VK_ALT, VK_SHIFT, VK_CONTROL}; for (i = 0; i < 3; i++) if (mappings[wParam].keyModifiers & (1 << i)) { // modifier key: // scan code and character code remains zero pp_uint16 vk[3] = {vkModifiers[i], 0, 0}; PPEvent eventKeyDown(eKeyDown, &vk, sizeof(vk)); myTrackerScreen->raiseEvent(&eventKeyDown); } setForceKeyModifier((KeyModifiers)mappings[wParam].keyModifiers); // functionality key: // scan code and character code remains zero pp_uint16 vk[3] = {mappings[wParam].virtualKeyCode, 0, 0}; PPEvent eventKeyDown(eKeyDown, &vk, sizeof(vk)); myTrackerScreen->raiseEvent(&eventKeyDown); } else if (allowVirtualKeys) { QueryKeyModifiers(); WORD character = MapVirtualKey(wParam & 0xFFFF, 2); // Check for right ALT key if (::GetAsyncKeyState(VK_RMENU)>>15) wParam = VK_RMENU; // Check for right CTRL key else if (::GetAsyncKeyState(VK_RCONTROL)>>15) wParam = VK_RCONTROL; if (wParam == VK_MENU) wParam = VK_ALT; // Since scancodes probably differ from desktop keyboards // we do some virtual key => scancode transformation here WORD chr[3] = {wParam, vkeyToScancode[wParam&255], character}; PPEvent myEvent(eKeyDown, &chr, sizeof(chr)); myTrackerScreen->raiseEvent(&myEvent); } } break; case WM_KEYUP: case WM_SYSKEYUP: if (wParam < 256) { if (mappings[wParam].keyModifiers != 0xFFFF && mappings[wParam].virtualKeyCode != 0xFFFF) { pp_int32 i; WORD vkModifiers[3] = {VK_ALT, VK_SHIFT, VK_CONTROL}; // functionality key: // scan code and character code remains zero pp_uint16 vk[3] = {mappings[wParam].virtualKeyCode, 0, 0}; PPEvent eventKeyUp(eKeyUp, &vk, sizeof(vk)); myTrackerScreen->raiseEvent(&eventKeyUp); for (i = 0; i < 3; i++) if (mappings[wParam].keyModifiers & (1 << (2-i))) { // modifier key: // scan code and character code remains zero pp_uint16 vk[3] = {vkModifiers[i], 0, 0}; PPEvent eventKeyUp(eKeyUp, &vk, sizeof(vk)); myTrackerScreen->raiseEvent(&eventKeyUp); } clearForceKeyModifier((KeyModifiers)mappings[wParam].keyModifiers); } else if (allowVirtualKeys) { WORD character = MapVirtualKey(wParam & 0xFFFF, 2); if (wParam == VK_MENU) wParam = VK_ALT; // Since scancodes probably differ from desktop keyboards // we do some virtual key => scancode transformation here WORD chr[3] = {wParam, vkeyToScancode[wParam&255], character}; PPEvent myEvent(eKeyUp, &chr, sizeof(chr)); myTrackerScreen->raiseEvent(&myEvent); } } break; case WM_CHAR: { WORD chr = wParam; if (chr < 32 || chr > 127) break; PPEvent myEvent(eKeyChar, &chr, sizeof(chr)); myTrackerScreen->raiseEvent(&myEvent); break; } case WM_DESTROY: PostQuitMessage(0); break; case WM_KILLFOCUS: GXSuspend(); break; case WM_SETFOCUS: GXResume(); break; /*case WM_SETTINGCHANGE: SHHandleWMSettingChange(hWnd, wParam,lParam,&s_sai); break;*/ } return DefWindowProc(hWnd, msg, wParam, lParam); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // -------------------------- debugging --------------------------------------------------------------------- // //////////////////////////////////////////////////////////////////////////////////////////////////////////////// void drawChar(unsigned short* buffer, unsigned int pitch, unsigned int chr,unsigned int tx,unsigned int ty,unsigned short col) { PPFont* font = PPFont::getFont(PPFont::FONT_SYSTEM); unsigned int x,y; for (y=0;y<8;y++) for (x=0;x<8;x++) if (font->getPixelBit(chr, x, y)) buffer[((ty+y)*pitch+(tx+x))]=col; } void drawString(const char* textBuffer,unsigned short* drawBuffer, unsigned int pitch, unsigned int posx,unsigned int posy, unsigned short col) { unsigned int x = posx; while (*textBuffer) { drawChar(drawBuffer, pitch, *textBuffer,x,posy,col); textBuffer++; x+=8; } } milkytracker-0.90.85+dfsg/src/tracker/SectionInstruments.cpp0000644000175000017500000017301711150223367023242 0ustar admin2admin2/* * tracker/SectionInstruments.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * SectionInstruments.cpp * MilkyTracker * * Created by Peter Barth on 15.04.05. * */ #include "SectionInstruments.h" #include "Tracker.h" #include "TrackerConfig.h" #include "TabManager.h" #include "ModuleEditor.h" #include "EnvelopeEditor.h" #include "SampleEditor.h" #include "PianoControl.h" #include "PatternTools.h" #include "SectionSamples.h" #include "Screen.h" #include "PPUIConfig.h" #include "Button.h" #include "CheckBox.h" #include "MessageBoxContainer.h" #include "TransparentContainer.h" #include "ListBox.h" #include "RadioGroup.h" #include "Seperator.h" #include "Slider.h" #include "StaticText.h" #include "EnvelopeEditorControl.h" #include "PatternEditorControl.h" #include "DialogBase.h" #include "PlayerController.h" #include "InputControlListener.h" #include "EnvelopeContainer.h" // OS Interface #include "PPOpenPanel.h" #include "PPSavePanel.h" #include "ControlIDs.h" // Class which responds to message box clicks class DialogResponderInstruments : public DialogResponder { private: SectionInstruments& section; public: DialogResponderInstruments(SectionInstruments& section) : section(section) { } virtual pp_int32 ActionOkay(PPObject* sender) { switch (reinterpret_cast(sender)->getID()) { case MESSAGEBOX_ZAPINSTRUMENT: { section.zapInstrument(); break; } } return 0; } }; EnvelopeEditor* SectionInstruments::getEnvelopeEditor() { return tracker.getEnvelopeEditor(); } void SectionInstruments::showSection(bool bShow) { containerEntire->show(bShow); } SectionInstruments::SectionInstruments(Tracker& theTracker) : SectionAbstract(theTracker, NULL, new DialogResponderInstruments(*this)), containerEntire(NULL), containerEnvelopes(NULL), containerSampleSlider(NULL), containerInstrumentSlider(NULL), envelopeEditorControl(NULL), pianoControl(NULL), currentEnvelopeType(EnvelopeEditor::EnvelopeTypeVolume), visible(false), storeEnvelope(false) { predefinedVolumeEnvelopes = new EnvelopeContainer(TrackerConfig::numPredefinedEnvelopes); predefinedPanningEnvelopes = new EnvelopeContainer(TrackerConfig::numPredefinedEnvelopes); // Store default predefined envelopes for (pp_int32 i = 0; i < TrackerConfig::numPredefinedEnvelopes; i++) { TEnvelope e = EnvelopeContainer::decodeEnvelope(TrackerConfig::defaultPredefinedVolumeEnvelope); predefinedVolumeEnvelopes->store(i, e); e = EnvelopeContainer::decodeEnvelope(TrackerConfig::defaultPredefinedPanningEnvelope); predefinedPanningEnvelopes->store(i, e); } } SectionInstruments::~SectionInstruments() { delete predefinedVolumeEnvelopes; delete predefinedPanningEnvelopes; } pp_int32 SectionInstruments::handleEvent(PPObject* sender, PPEvent* event) { char buffer[100]; char buffer2[100]; ModuleEditor::TEditorInstrument* ins; PPScreen* screen = tracker.screen; ModuleEditor* moduleEditor = tracker.moduleEditor; if (event->getID() == eUpdateChanged) { tracker.updateWindowTitle(); } else if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { case BUTTON_ENVELOPE_PREDEF_0: case BUTTON_ENVELOPE_PREDEF_1: case BUTTON_ENVELOPE_PREDEF_2: case BUTTON_ENVELOPE_PREDEF_3: case BUTTON_ENVELOPE_PREDEF_4: case BUTTON_ENVELOPE_PREDEF_5: case BUTTON_ENVELOPE_PREDEF_6: case BUTTON_ENVELOPE_PREDEF_7: case BUTTON_ENVELOPE_PREDEF_8: case BUTTON_ENVELOPE_PREDEF_9: { if (event->getID() != eCommand) break; pp_int32 i = reinterpret_cast(sender)->getID() - BUTTON_ENVELOPE_PREDEF_0; EnvelopeContainer* predefinedEnvelopes = NULL; switch (currentEnvelopeType) { case EnvelopeEditor::EnvelopeTypeVolume: predefinedEnvelopes = predefinedVolumeEnvelopes; break; case EnvelopeEditor::EnvelopeTypePanning: predefinedEnvelopes = predefinedPanningEnvelopes; break; default: ASSERT(false); } if (storeEnvelope) { const TEnvelope* env = envelopeEditorControl->getEnvelope(); predefinedEnvelopes->store(i, *env); storeEnvelope = !storeEnvelope; PPButton* button = static_cast(containerEnvelopes->getControlByID(BUTTON_ENVELOPE_PREDEF_STORE)); button->setPressed(storeEnvelope); } else { const TEnvelope* env = predefinedEnvelopes->restore(i); getEnvelopeEditor()->pasteOther(*env); } update(); break; } case BUTTON_ENVELOPE_PREDEF_STORE: { if (event->getID() != eCommand) break; storeEnvelope = !storeEnvelope; PPButton* button = reinterpret_cast(sender); button->setPressed(storeEnvelope); screen->paintControl(button); break; } case BUTTON_ENVELOPE_VOLUME: if (event->getID() != eCommand) break; currentEnvelopeType = EnvelopeEditor::EnvelopeTypeVolume; getEnvelopeEditor()->setEnvelopeType(EnvelopeEditor::EnvelopeTypeVolume); update(); break; case BUTTON_ENVELOPE_PANNING: if (event->getID() != eCommand) break; currentEnvelopeType = EnvelopeEditor::EnvelopeTypePanning; getEnvelopeEditor()->setEnvelopeType(EnvelopeEditor::EnvelopeTypePanning); update(); break; case CHECKBOX_ENVELOPE_ON: if (event->getID() != eCommand) break; getEnvelopeEditor()->enableEnvelope(reinterpret_cast(sender)->isChecked()); update(); break; case CHECKBOX_ENVELOPE_SUSTAIN: if (event->getID() != eCommand) break; getEnvelopeEditor()->enableSustain(reinterpret_cast(sender)->isChecked()); update(); break; case CHECKBOX_ENVELOPE_LOOP: if (event->getID() != eCommand) break; getEnvelopeEditor()->enableLoop(reinterpret_cast(sender)->isChecked()); update(); break; case BUTTON_ENVELOPE_UNDO: getEnvelopeEditor()->undo(); break; case BUTTON_ENVELOPE_REDO: getEnvelopeEditor()->redo(); break; case BUTTON_ENVELOPE_COPY: getEnvelopeEditor()->makeCopy(); update(); break; case BUTTON_ENVELOPE_PASTE: getEnvelopeEditor()->pasteCopy(); update(); break; case BUTTON_ENVELOPE_ADD: getEnvelopeEditor()->addPoint(); update(); break; case BUTTON_ENVELOPE_DELETE: getEnvelopeEditor()->deletePoint(); update(); break; case BUTTON_ENVELOPE_SUSTAIN_PLUS: getEnvelopeEditor()->selectNextSustainPoint(); update(); break; case BUTTON_ENVELOPE_SUSTAIN_MINUS: getEnvelopeEditor()->selectPreviousSustainPoint(); update(); break; case BUTTON_ENVELOPE_LOOPSTART_PLUS: getEnvelopeEditor()->selectNextLoopStartPoint(); update(); break; case BUTTON_ENVELOPE_LOOPSTART_MINUS: getEnvelopeEditor()->selectPreviousLoopStartPoint(); update(); break; case BUTTON_ENVELOPE_LOOPEND_PLUS: getEnvelopeEditor()->selectNextLoopEndPoint(); update(); break; case BUTTON_ENVELOPE_LOOPEND_MINUS: getEnvelopeEditor()->selectPreviousLoopEndPoint(); update(); break; case BUTTON_ENVELOPE_ZOOMIN: envelopeEditorControl->setScale(envelopeEditorControl->getScale() >> 1); update(); break; case BUTTON_ENVELOPE_ZOOMOUT: envelopeEditorControl->setScale(envelopeEditorControl->getScale() << 1); update(); break; case BUTTON_ENVELOPE_SCALEX: if (event->getID() != eCommand) break; envelopeEditorControl->invokeToolParameterDialog(EnvelopeEditorControl::EnvelopeToolTypeScaleX); break; case BUTTON_ENVELOPE_SCALEY: if (event->getID() != eCommand) break; envelopeEditorControl->invokeToolParameterDialog(EnvelopeEditorControl::EnvelopeToolTypeScaleY); break; case BUTTON_SAMPLE_RELNOTENUM_OCTUP: { tracker.getSampleEditor()->increaseRelNoteNum(12); update(); break; } case BUTTON_SAMPLE_RELNOTENUM_OCTDN: { tracker.getSampleEditor()->increaseRelNoteNum(-12); update(); break; } case BUTTON_SAMPLE_RELNOTENUM_NOTEUP: { tracker.getSampleEditor()->increaseRelNoteNum(1); update(); break; } case BUTTON_SAMPLE_RELNOTENUM_NOTEDN: { tracker.getSampleEditor()->increaseRelNoteNum(-1); update(); break; } case BUTTON_PIANO_EDIT: if (event->getID() != eCommand) break; getPianoControl()->setMode(PianoControl::ModeEdit); update(); break; case BUTTON_PIANO_PLAY: if (event->getID() != eCommand) break; getPianoControl()->setMode(PianoControl::ModePlay); update(); break; case BUTTON_SAMPLE_PLAY_STOP: tracker.playerController->stopInstrument(tracker.listBoxInstruments->getSelectedIndex()+1); //tracker.stopSong(); break; case BUTTON_INSTRUMENTEDITOR_CLEAR: if (event->getID() != eCommand) break; handleZapInstrument(); break; // load instrument case BUTTON_INSTRUMENTEDITOR_LOAD: { if (event->getID() != eCommand) break; tracker.loadType(FileTypes::FileTypeSongAllInstruments); break; } // save instrument case BUTTON_INSTRUMENTEDITOR_SAVE: { if (event->getID() != eCommand) break; tracker.saveType(FileTypes::FileTypeInstrumentXI); break; } // test instrument chooser case BUTTON_INSTRUMENTEDITOR_COPY: { if (event->getID() != eCommand) break; sprintf(buffer, "Copy ins. %x to %x", tracker.listBoxInstruments->getSelectedIndex()+1, 1); sprintf(buffer2, "Copy smp. %x to %x", tracker.listBoxSamples->getSelectedIndex(), 0); tracker.initInstrumentChooser(INSTRUMENT_CHOOSER_COPY, "Copy ins", "Copy smp", "Copy instrument/sample"PPSTR_PERIODS, buffer, buffer2, tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex(), tracker.tabManager->getSelectedTabIndex()); screen->setModalControl(tracker.instrumentChooser); break; } // test instrument chooser case BUTTON_INSTRUMENTEDITOR_SWAP: { if (event->getID() != eCommand) break; sprintf(buffer, "Swap ins. %x with %x", tracker.listBoxInstruments->getSelectedIndex()+1, 1); sprintf(buffer2, "Swap smp. %x with %x", tracker.listBoxSamples->getSelectedIndex(), 0); tracker.initInstrumentChooser(INSTRUMENT_CHOOSER_SWAP, "Swap ins", "Swap smp", "Swap instrument/sample"PPSTR_PERIODS, buffer, buffer2, tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex(), tracker.tabManager->getSelectedTabIndex()); screen->setModalControl(tracker.instrumentChooser); break; } } } else if (event->getID() == eSelection) { switch (reinterpret_cast(sender)->getID()) { case RADIOGROUP_SAMPLE_VIBTYPE: { tracker.setChanged(); ins = moduleEditor->getInstrumentInfo(tracker.listBoxInstruments->getSelectedIndex()); ins->vibtype = (pp_uint8)(reinterpret_cast(sender)->getChoice()); moduleEditor->updateInstrumentData(tracker.listBoxInstruments->getSelectedIndex()); updateInstrumentSliders(true); break; } case PIANO_CONTROL: { pp_int32 v = *((pp_int32*)event->getDataPtr()); tracker.inputControlListener->sendNote(v); break; } } } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { case SLIDER_SAMPLE_VOLUME: { tracker.getSampleEditor()->setFT2Volume(reinterpret_cast(sender)->getCurrentValue()); updateSampleSliders(); break; } case SLIDER_SAMPLE_PANNING: { tracker.getSampleEditor()->setPanning(reinterpret_cast(sender)->getCurrentValue()); updateSampleSliders(); break; } case SLIDER_SAMPLE_FINETUNE: { tracker.getSampleEditor()->setFinetune(reinterpret_cast(sender)->getCurrentValue()-128); updateSampleSliders(); break; } case SLIDER_SAMPLE_VOLFADE: { tracker.setChanged(); ins = moduleEditor->getInstrumentInfo(tracker.listBoxInstruments->getSelectedIndex()); ins->volfade = (pp_uint16)(reinterpret_cast(sender)->getCurrentValue()); if (ins->volfade == 0x1000) ins->volfade = 32767; moduleEditor->updateInstrumentData(tracker.listBoxInstruments->getSelectedIndex()); updateInstrumentSliders(); break; } case SLIDER_SAMPLE_VIBSPEED: { tracker.setChanged(); ins = moduleEditor->getInstrumentInfo(tracker.listBoxInstruments->getSelectedIndex()); ins->vibrate = (pp_uint8)(reinterpret_cast(sender)->getCurrentValue()); moduleEditor->updateInstrumentData(tracker.listBoxInstruments->getSelectedIndex()); updateInstrumentSliders(); break; } case SLIDER_SAMPLE_VIBDEPTH: { tracker.setChanged(); ins = moduleEditor->getInstrumentInfo(tracker.listBoxInstruments->getSelectedIndex()); ins->vibdepth = (pp_uint8)(reinterpret_cast(sender)->getCurrentValue()); moduleEditor->updateInstrumentData(tracker.listBoxInstruments->getSelectedIndex()); updateInstrumentSliders(); break; } case SLIDER_SAMPLE_VIBSWEEP: { tracker.setChanged(); ins = moduleEditor->getInstrumentInfo(tracker.listBoxInstruments->getSelectedIndex()); ins->vibsweep = (pp_uint8)(reinterpret_cast(sender)->getCurrentValue()); moduleEditor->updateInstrumentData(tracker.listBoxInstruments->getSelectedIndex()); updateInstrumentSliders(); break; } // sample table has been updated case PIANO_CONTROL: { tracker.setChanged(); pp_int32 i = tracker.listBoxInstruments->getSelectedIndex(); moduleEditor->updateSampleTable(i, *(reinterpret_cast(event->getDataPtr()))); break; } } } else if (event->getID() == eUpdated) { switch (reinterpret_cast(sender)->getID()) { case CONTAINER_ENVELOPES: { updateEnvelopeEditor(true, false); break; } } } return 0; } void SectionInstruments::init() { init(0, tracker.MAXEDITORHEIGHT()-tracker.INSTRUMENTSECTIONDEFAULTHEIGHT()); } void SectionInstruments::init(pp_int32 x, pp_int32 y) { PPScreen* screen = tracker.screen; containerEntire = new PPTransparentContainer(CONTAINER_ENTIREINSSECTION, screen, this, PPPoint(0, 0), PPSize(screen->getWidth(), screen->getHeight())); #ifndef __LOWRES__ // envelope stuff pp_int32 w4 = 165; pp_int32 w3 = 39; pp_int32 w2 = w4+w3; pp_int32 w = screen->getWidth() - w2; containerEnvelopes = new PPContainer(CONTAINER_ENVELOPES, screen, this, PPPoint(x, y), PPSize(w,135+4+3), false); containerEntire->addControl(containerEnvelopes); containerEnvelopes->setColor(TrackerConfig::colorThemeMain); envelopeEditorControl = new EnvelopeEditorControl(CONTAINER_ENVELOPES, screen, this, PPPoint(x + 2, y + 2 + 10), PPSize(containerEnvelopes->getSize().width-96,containerEnvelopes->getSize().height-17)); envelopeEditorControl->attachEnvelopeEditor(tracker.getEnvelopeEditor()); envelopeEditorControl->setBorderColor(TrackerConfig::colorThemeMain); pp_int32 scale = 256*screen->getWidth() / 800; envelopeEditorControl->setxMax(scale); //envelopeEditor->attachEnvelope(moduleEditor->getVolumeEnvelope(0,0)); containerEnvelopes->addControl(envelopeEditorControl); PPButton* button = new PPButton(BUTTON_ENVELOPE_VOLUME, screen, this, PPPoint(x + 2, y + 1), PPSize(64, 11), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Volume"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_PANNING, screen, this, PPPoint(x + 2 + 64, y + 1), PPSize(64, 11), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Panning"); containerEnvelopes->addControl(button); pp_int32 px = button->getLocation().x + button->getSize().width + (screen->getWidth() < 800 ? 6 : 32); PPStaticText* staticText = new PPStaticText(0, NULL, NULL, PPPoint(px, y + 3), "Predef.", true); containerEnvelopes->addControl(staticText); px+=button->getSize().width; // pre-defined envelopes for (pp_int32 i = 0; i < TrackerConfig::numPredefinedEnvelopes; i++) { button = new PPButton(BUTTON_ENVELOPE_PREDEF_0+i, screen, this, PPPoint(px, y + 2), PPSize(9, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText((char)('0'+i)); containerEnvelopes->addControl(button); px+=button->getSize().width+1; } px+=2; button = new PPButton(BUTTON_ENVELOPE_PREDEF_STORE, screen, this, PPPoint(px, y + 2), PPSize(5*6, 9), true, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Store"); containerEnvelopes->addControl(button); if (screen->getWidth() >= 800) { button = new PPButton(BUTTON_ENVELOPE_UNDO, screen, this, PPPoint(x + envelopeEditorControl->getSize().width-115, y + 2), PPSize(26, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Undo"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_REDO, screen, this, PPPoint(x + envelopeEditorControl->getSize().width-88, y + 2), PPSize(26, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Redo"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_COPY, screen, this, PPPoint(x + envelopeEditorControl->getSize().width-59, y + 2), PPSize(26, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Copy"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_PASTE, screen, this, PPPoint(x + envelopeEditorControl->getSize().width-32, y + 2), PPSize(26, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Paste"); containerEnvelopes->addControl(button); } pp_int32 y4 = y+2; button = new PPButton(BUTTON_ENVELOPE_ADD, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 8, y4 + 2), PPSize(40, 11)); button->setText("Add"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_DELETE, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 8 + 41, y4 + 2), PPSize(40, 11)); button->setText("Del"); containerEnvelopes->addControl(button); y4+=18; containerEnvelopes->addControl(new PPCheckBox(CHECKBOX_ENVELOPE_ON, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4, y4 + 2))); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 13, y4 + 3), "On", true)); // sustain containerEnvelopes->addControl(new PPCheckBox(CHECKBOX_ENVELOPE_SUSTAIN, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4, y4 + 2 + 18))); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 13, y4 + 2 + 18+1), "Sustain:", true)); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + envelopeEditorControl->getSize().width + 4, y4 + 2 + 18+1 + 12), "Point", true)); // sustain point field containerEnvelopes->addControl(new PPStaticText(STATICTEXT_ENVELOPE_SUSTAINPT, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 6*8, y4 + 2 + 18+1 + 12), "00", false)); button = new PPButton(BUTTON_ENVELOPE_SUSTAIN_PLUS, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 28 + 40, y4 + 2 + 18+1 + 11), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_SUSTAIN_MINUS, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 28 + 40 + 11, y4 + 2 + 18+1 + 11), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); containerEnvelopes->addControl(button); // loop containerEnvelopes->addControl(new PPCheckBox(CHECKBOX_ENVELOPE_LOOP, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4, y4 + 2 + 18*2 + 9))); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 13, y4 + 2 + 18*2 + 10), "Loop:", true)); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + envelopeEditorControl->getSize().width + 4, y4 + 2 + 18*2 + 10 + 12), "Start", true)); // loop start point field containerEnvelopes->addControl(new PPStaticText(STATICTEXT_ENVELOPE_LOOPSTARTPT, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 6*8, y4 + 2 + 18*2 + 10 + 12), "00", false)); button = new PPButton(BUTTON_ENVELOPE_LOOPSTART_PLUS, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 28 + 40, y4 + 2 + 18*2 + 10 + 11), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_LOOPSTART_MINUS, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 28 + 40 + 11, y4 + 2 + 18*2 + 10 + 11), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); containerEnvelopes->addControl(button); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + envelopeEditorControl->getSize().width + 4, y4 + 2 + 18*2 + 10 + 12 + 10), "End", true)); // loop end point field containerEnvelopes->addControl(new PPStaticText(STATICTEXT_ENVELOPE_LOOPENDPT, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 6*8, y4 + 2 + 18*2 + 10 + 12 + 10), "00", false)); button = new PPButton(BUTTON_ENVELOPE_LOOPEND_PLUS, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 28 + 40, y4 + 2 + 18*2 + 10 + 12 + 9), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_LOOPEND_MINUS, screen, this, PPPoint(x + envelopeEditorControl->getSize().width + 4 + 28 + 40 + 11, y4 + 2 + 18*2 + 10 + 12 + 9), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); containerEnvelopes->addControl(button); pp_int32 ty = button->getLocation().y + button->getSize().height + 5; pp_int32 tx = x + envelopeEditorControl->getSize().width + 4; containerEnvelopes->addControl(new PPSeperator(0, screen, PPPoint(tx-2, ty), 8*5*2+8+4, containerEnvelopes->getColor(), true)); ty+=4; button = new PPButton(BUTTON_ENVELOPE_SCALEX, screen, this, PPPoint(tx+3, ty), PPSize(8*5+1, 13)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Scale X"); containerEnvelopes->addControl(button); tx+=button->getSize().width+1; button = new PPButton(BUTTON_ENVELOPE_SCALEY, screen, this, PPPoint(tx+3, ty), PPSize(8*5+2, 13)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Scale Y"); containerEnvelopes->addControl(button); ty+=button->getSize().height+2; tx = x + envelopeEditorControl->getSize().width + 4; containerEnvelopes->addControl(new PPSeperator(0, screen, PPPoint(tx-2, ty), 8*5*2+8+4, containerEnvelopes->getColor(), true)); ty+=5; button = new PPButton(BUTTON_ENVELOPE_ZOOMIN, screen, this, PPPoint(tx+3, ty), PPSize(8*5+1, 10)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Zoom in"); containerEnvelopes->addControl(button); tx+=button->getSize().width+1; button = new PPButton(BUTTON_ENVELOPE_ZOOMOUT, screen, this, PPPoint(tx+3, ty), PPSize(8*5+2, 10)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Zoom out"); containerEnvelopes->addControl(button); // ----------------- instrument info ----------------- //y+=containerEnvelopes->getSize().height; x+=containerEnvelopes->getSize().width; PPContainer* container = new PPContainer(CONTAINER_INSTRUMENTS_INFO1, screen, this, PPPoint(x, y), PPSize(w4,34+4), false); containerEntire->addControl(container); containerSampleSlider = container; container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4), "Volume", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VOLUME, screen, this, PPPoint(x + 4 + 8*9, y + 4), "FF", false)); //PPSlider* slider = new PPSlider(SLIDER_SAMPLE_VOLUME, screen, this, PPPoint(x + 4 + 8*7+2, y + 2), 51, true); PPSlider* slider = new PPSlider(SLIDER_SAMPLE_VOLUME, screen, this, PPPoint(x + 4 + 8*11+2, y + 2), 68, true); slider->setMaxValue(64); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 12), "Panning", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_PANNING, screen, this, PPPoint(x + 4 + 8*9, y + 4 + 12), "FF", false)); slider = new PPSlider(SLIDER_SAMPLE_PANNING, screen, this, PPPoint(x + 4 + 8*11+2, y + 2 + 12), 68, true); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 24), "F.tune", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_FINETUNE, screen, this, PPPoint(x + 4 + 8*7, y + 4 + 24), "-128", false)); slider = new PPSlider(SLIDER_SAMPLE_FINETUNE, screen, this, PPPoint(x + 4 + 8*11+2, y + 2 + 24), 68, true); slider->setBarSize(16384); container->addControl(slider); pp_int32 height = container->getSize().height; // exit 'n stuff y4=y; pp_int32 nx = x + container->getSize().width; container = new PPContainer(CONTAINER_INSTRUMENTS_INFO4, screen, this, PPPoint(nx, y), PPSize(w3,38), false); containerEntire->addControl(container); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_INSTRUMENTEDITOR_EXIT, screen, &tracker, PPPoint(nx + 2, y + 2), PPSize(34, 34)); button->setText("Exit"); container->addControl(button); // load & save y+=container->getSize().height; container = new PPContainer(CONTAINER_INSTRUMENTS_INFO5, screen, this, PPPoint(nx, y), PPSize(w3,39), false); containerEntire->addControl(container); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_INSTRUMENTEDITOR_CLEAR, screen, this, PPPoint(nx + 2, y + 2), PPSize(34, 11)); button->setText("Zap"); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTEDITOR_LOAD, screen, this, PPPoint(nx + 2, y + 2+12), PPSize(34, 11)); button->setText("Load"); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTEDITOR_SAVE, screen, this, PPPoint(nx + 2, y + 2+12*2), PPSize(34, 11)); button->setText("Save"); container->addControl(button); // copy & paste y+=container->getSize().height; container = new PPContainer(CONTAINER_INSTRUMENTS_INFO6, screen, this, PPPoint(nx, y), PPSize(w3,27), false); containerEntire->addControl(container); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_INSTRUMENTEDITOR_COPY, screen, this, PPPoint(nx + 2, y + 2), PPSize(34, 11)); //button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Copy"); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTEDITOR_SWAP, screen, this, PPPoint(nx + 2, y + 2+12), PPSize(34, 11)); //button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Swap"); container->addControl(button); y+=container->getSize().height; y = y4; // autovibrato etc. y+=height; container = new PPContainer(CONTAINER_INSTRUMENTS_INFO3, screen, this, PPPoint(x, y), PPSize(w4,66), false); containerEntire->addControl(container); containerInstrumentSlider = container; container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4), "Fadeout", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VOLFADE, screen, this, PPPoint(x + 4 + 8*8, y + 4), "FFF", false)); slider = new PPSlider(SLIDER_SAMPLE_VOLFADE, screen, this, PPPoint(x + 4 + 8*11+2, y + 2), 68, true); slider->setMaxValue(0x1000); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 12), "Vibspeed", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VIBSPEED, screen, this, PPPoint(x + 4 + 8*9, y + 4 + 12), "FF", false)); slider = new PPSlider(SLIDER_SAMPLE_VIBSPEED, screen, this, PPPoint(x + 4 + 8*11+2, y + 2 + 12), 68, true); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 12*2), "Vibdepth", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VIBDEPTH, screen, this, PPPoint(x + 4 + 8*10, y + 4 + 12*2), "F", false)); slider = new PPSlider(SLIDER_SAMPLE_VIBDEPTH, screen, this, PPPoint(x + 4 + 8*11+2, y + 2 + 12*2), 68, true); slider->setMaxValue(0xf); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 12*3), "Vibsweep", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VIBSWEEP, screen, this, PPPoint(x + 4 + 8*9, y + 4 + 12*3), "FF", false)); slider = new PPSlider(SLIDER_SAMPLE_VIBSWEEP, screen, this, PPPoint(x + 4 + 8*11+2, y + 2 + 12*3), 68, true); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 12*4), "Type:", true)); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SAMPLE_VIBTYPE, screen, this, PPPoint(x + 2 + 5*8, y + 4 + 12*3 + 8), PPSize(w4, 20)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setHorizontal(true); radioGroup->addItem("\xfc\xfb"); radioGroup->addItem("\xfa\xf9"); radioGroup->addItem("\xf8\xf7"); radioGroup->addItem("\xf6\xf5"); container->addControl(radioGroup); height = container->getSize().height; // relative note container = new PPContainer(CONTAINER_INSTRUMENTS_INFO2, screen, this, PPPoint(x, y+height), PPSize(w4+39,36+2), false); containerEntire->addControl(container); container->setColor(TrackerConfig::colorThemeMain); y+=height; container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 2), "Relative note:", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_RELNOTE, screen, this, PPPoint(x + 4 + 15*8 - 4, y + 2), "C-4", false)); button = new PPButton(BUTTON_SAMPLE_RELNOTENUM_OCTUP, screen, this, PPPoint(x + 4, y + 1 + 12), PPSize(78+19, 11)); button->setText("Octave up"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RELNOTENUM_NOTEUP, screen, this, PPPoint(x + 4 + 79+19, y + 1 + 12), PPSize(78+19, 11)); button->setText("Note up"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RELNOTENUM_OCTDN, screen, this, PPPoint(x + 4, y + 1 + 12 + 12), PPSize(78+19, 11)); button->setText("Octave dn"); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RELNOTENUM_NOTEDN, screen, this, PPPoint(x + 4 + 79+19, y + 1 + 24), PPSize(78+19, 11)); button->setText("Note dn"); container->addControl(button); // piano y+=container->getSize().height; PPContainer* pianoContainer = new PPContainer(CONTAINER_PIANO, screen, this, PPPoint(0, y), PPSize(screen->getWidth(),25*2+SCROLLBUTTONSIZE+4), false); containerEntire->addControl(pianoContainer); pianoContainer->setColor(TrackerConfig::colorThemeMain); // piano test pp_int32 pianoWidth = screen->getWidth()-2-40; if (pianoWidth > 898) pianoWidth = 898; pp_int32 dx = 0; pianoControl = new PianoControl(PIANO_CONTROL, screen, this, PPPoint(1+40+dx, y+1), PPSize(pianoWidth, 25*2+12), ModuleEditor::MAX_NOTE); // show C-2 pianoControl->assureNoteVisible(12*2); pianoControl->setBorderColor(TrackerConfig::colorThemeMain); pianoContainer->addControl(pianoControl); button = new PPButton(BUTTON_PIANO_PLAY, screen, this, PPPoint(1, y+1), PPSize(38+dx, 20), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Play"); pianoContainer->addControl(button); button = new PPButton(BUTTON_PIANO_EDIT, screen, this, PPPoint(1, y+1+20), PPSize(38+dx, 20), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Edit"); pianoContainer->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_STOP, screen, this, PPPoint(2, y+1+2*20), PPSize(36+dx, 20)); button->setText("Stop"); pianoContainer->addControl(button); #else // envelope stuff containerEnvelopes = new PPContainer(CONTAINER_ENVELOPES, screen, this, PPPoint(x, y), PPSize(320,69+4), false); containerEntire->addControl(containerEnvelopes); containerEnvelopes->setColor(TrackerConfig::colorThemeMain); envelopeEditorControl = new EnvelopeEditorControl(CONTAINER_ENVELOPES, screen, this, PPPoint(x + 2, y + 2 + 10), PPSize(224,59)); envelopeEditorControl->attachEnvelopeEditor(tracker.getEnvelopeEditor()); envelopeEditorControl->setBorderColor(TrackerConfig::colorThemeMain); containerEnvelopes->addControl(envelopeEditorControl); PPButton* button = new PPButton(BUTTON_ENVELOPE_VOLUME, screen, this, PPPoint(x + 2, y + 1), PPSize(32, 11), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Vol"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_PANNING, screen, this, PPPoint(x + 2 + 32, y + 1), PPSize(32, 11), false, true, false); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Pan"); containerEnvelopes->addControl(button); containerEnvelopes->addControl(new PPCheckBox(CHECKBOX_ENVELOPE_ON, screen, this, PPPoint(x + 224 + 4, y + 2))); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 224 + 4 + 13, y + 3), "On", true)); button = new PPButton(BUTTON_ENVELOPE_UNDO, screen, this, PPPoint(button->getLocation().x + button->getSize().width+4, y + 2), PPSize(22, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Undo"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_REDO, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y + 2), PPSize(22, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Redo"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_COPY, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y + 2), PPSize(22, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Copy"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_PASTE, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y + 2), PPSize(27, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Paste"); containerEnvelopes->addControl(button); PPStaticText* statict = new PPStaticText(0, NULL, NULL, PPPoint(button->getLocation().x + button->getSize().width+3, y + 4), "Zoom", true); statict->setFont(PPFont::getFont(PPFont::FONT_TINY)); statict->setColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); containerEnvelopes->addControl(statict); button = new PPButton(BUTTON_ENVELOPE_ZOOMIN, screen, this, PPPoint(statict->getLocation().x + 5*5, y + 2), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonPlus); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_ZOOMOUT, screen, this, PPPoint(button->getLocation().x + button->getSize().width+1, y + 2), PPSize(12, 9)); button->setText(TrackerConfig::stringButtonMinus); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_ADD, screen, this, PPPoint(x + 224 + 36, y + 2), PPSize(28, 11)); button->setText("Add"); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_DELETE, screen, this, PPPoint(x + 224 + 4 + 61, y + 2), PPSize(28, 11)); button->setText("Del"); containerEnvelopes->addControl(button); // sustain containerEnvelopes->addControl(new PPCheckBox(CHECKBOX_ENVELOPE_SUSTAIN, screen, this, PPPoint(x + 224 + 4, y + 2 + 14))); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 224 + 4 + 13, y + 2 + 15), "Sustain:", true)); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 224 + 4, y + 2 + 15 + 12), "Point", true)); // sustain point field containerEnvelopes->addControl(new PPStaticText(STATICTEXT_ENVELOPE_SUSTAINPT, screen, this, PPPoint(x + 224 + 4 + 6*8, y + 2 + 15 + 12), "00", false)); button = new PPButton(BUTTON_ENVELOPE_SUSTAIN_PLUS, screen, this, PPPoint(x + 224 + 4 + 28 + 40, y + 2 + 15 + 11), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_SUSTAIN_MINUS, screen, this, PPPoint(x + 224 + 4 + 28 + 40 + 11, y + 2 + 15 + 11), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); containerEnvelopes->addControl(button); // loop containerEnvelopes->addControl(new PPCheckBox(CHECKBOX_ENVELOPE_LOOP, screen, this, PPPoint(x + 224 + 4, y + 2 + 14*2 + 9))); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 224 + 4 + 13, y + 2 + 14*2 + 10), "Loop:", true)); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 224 + 4, y + 2 + 14*2 + 10 + 12), "Start", true)); // loop start point field containerEnvelopes->addControl(new PPStaticText(STATICTEXT_ENVELOPE_LOOPSTARTPT, screen, this, PPPoint(x + 224 + 4 + 6*8, y + 2 + 14*2 + 10 + 12), "00", false)); button = new PPButton(BUTTON_ENVELOPE_LOOPSTART_PLUS, screen, this, PPPoint(x + 224 + 4 + 28 + 40, y + 2 + 14*2 + 10 + 11), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_LOOPSTART_MINUS, screen, this, PPPoint(x + 224 + 4 + 28 + 40 + 11, y + 2 + 14*2 + 10 + 11), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); containerEnvelopes->addControl(button); containerEnvelopes->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 224 + 4, y + 2 + 14*2 + 10 + 12 + 10), "End", true)); // loop end point field containerEnvelopes->addControl(new PPStaticText(STATICTEXT_ENVELOPE_LOOPENDPT, screen, this, PPPoint(x + 224 + 4 + 6*8, y + 2 + 14*2 + 10 + 12 + 10), "00", false)); button = new PPButton(BUTTON_ENVELOPE_LOOPEND_PLUS, screen, this, PPPoint(x + 224 + 4 + 28 + 40, y + 2 + 14*2 + 10 + 12 + 9), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonPlus); containerEnvelopes->addControl(button); button = new PPButton(BUTTON_ENVELOPE_LOOPEND_MINUS, screen, this, PPPoint(x + 224 + 4 + 28 + 40 + 11, y + 2 + 14*2 + 10 + 12 + 9), PPSize(10, 9)); button->setText(TrackerConfig::stringButtonMinus); containerEnvelopes->addControl(button); // --------------- instrument info --------------- y+=containerEnvelopes->getSize().height; PPContainer* container = new PPContainer(CONTAINER_INSTRUMENTS_INFO1, screen, this, PPPoint(x, y), PPSize(116,34+4), false); containerEntire->addControl(container); containerSampleSlider = container; container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4), "Vol.", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VOLUME, screen, this, PPPoint(x + 4 + 8*5, y + 4), "FF", false)); PPSlider* slider = new PPSlider(SLIDER_SAMPLE_VOLUME, screen, this, PPPoint(x + 4 + 8*7+2, y + 2), 51, true); slider->setMaxValue(64); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 12), "Pan.", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_PANNING, screen, this, PPPoint(x + 4 + 8*5, y + 4 + 12), "FF", false)); slider = new PPSlider(SLIDER_SAMPLE_PANNING, screen, this, PPPoint(x + 4 + 8*7+2, y + 2 + 12), 51, true); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 24), "Ft.", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_FINETUNE, screen, this, PPPoint(x + 4 + 8*3, y + 4 + 12*2), "-128", false)); slider = new PPSlider(SLIDER_SAMPLE_FINETUNE, screen, this, PPPoint(x + 4 + 8*7+2, y + 2 + 24), 51, true); slider->setBarSize(16384); container->addControl(slider); pp_int32 width = container->getSize().width; pp_int32 height = container->getSize().height; // relative note container = new PPContainer(CONTAINER_INSTRUMENTS_INFO2, screen, this, PPPoint(0, y + height), PPSize(116,34+4), false); containerEntire->addControl(container); container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + 37), "Rel.note:", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_RELNOTE, screen, this, PPPoint(x + 4 + 16*5 - 4, y + 4 + 37), "C-4", false)); button = new PPButton(BUTTON_SAMPLE_RELNOTENUM_OCTUP, screen, this, PPPoint(x + 4, y + 3 + 36 + 12), PPSize(56, 10)); button->setText("Octave up"); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RELNOTENUM_NOTEUP, screen, this, PPPoint(x + 4 + 55, y + 3 + 36 + 12), PPSize(54, 10)); button->setText("Note up"); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RELNOTENUM_OCTDN, screen, this, PPPoint(x + 4, y + 3 + 36 + 12 + 11), PPSize(56, 10)); button->setText("Octave dn"); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(button); button = new PPButton(BUTTON_SAMPLE_RELNOTENUM_NOTEDN, screen, this, PPPoint(x + 4 + 55, y + 3 + 36 + 23), PPSize(54, 10)); button->setText("Note dn"); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); container->addControl(button); // autovibrato etc. x+=width; const pp_int32 dy = 15; container = new PPContainer(CONTAINER_INSTRUMENTS_INFO3, screen, this, PPPoint(x, y), PPSize(165,76), false); containerEntire->addControl(container); containerInstrumentSlider = container; container->setColor(TrackerConfig::colorThemeMain); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4), "Fadeout", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VOLFADE, screen, this, PPPoint(x + 4 + 8*8, y + 4), "FFF", false)); slider = new PPSlider(SLIDER_SAMPLE_VOLFADE, screen, this, PPPoint(x + 4 + 8*11+2, y + 2), 68, true); slider->setMaxValue(0x1000); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + dy), "Vibspeed", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VIBSPEED, screen, this, PPPoint(x + 4 + 8*9, y + 4 + dy), "FF", false)); slider = new PPSlider(SLIDER_SAMPLE_VIBSPEED, screen, this, PPPoint(x + 4 + 8*11+2, y + 2 + dy), 68, true); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + dy*2), "Vibdepth", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VIBDEPTH, screen, this, PPPoint(x + 4 + 8*10, y + 4 + dy*2), "F", false)); slider = new PPSlider(SLIDER_SAMPLE_VIBDEPTH, screen, this, PPPoint(x + 4 + 8*11+2, y + 2 + dy*2), 68, true); slider->setMaxValue(0xf); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + dy*3), "Vibsweep", true)); container->addControl(new PPStaticText(STATICTEXT_SAMPLE_VIBSWEEP, screen, this, PPPoint(x + 4 + 8*9, y + 4 + dy*3), "FF", false)); slider = new PPSlider(SLIDER_SAMPLE_VIBSWEEP, screen, this, PPPoint(x + 4 + 8*11+2, y + 2 + dy*3), 68, true); slider->setBarSize(16384); container->addControl(slider); container->addControl(new PPStaticText(0, NULL, NULL, PPPoint(x + 4, y + 4 + dy*4), "Type:", true)); PPRadioGroup* radioGroup = new PPRadioGroup(RADIOGROUP_SAMPLE_VIBTYPE, screen, this, PPPoint(x + 2 + 5*8, y + 4 + dy*4 - 4), PPSize(204, 20)); radioGroup->setColor(TrackerConfig::colorThemeMain); radioGroup->setHorizontal(true); radioGroup->addItem("\xfc\xfb"); radioGroup->addItem("\xfa\xf9"); radioGroup->addItem("\xf8\xf7"); radioGroup->addItem("\xf6\xf5"); container->addControl(radioGroup); // sucks pp_int32 nx = x + container->getSize().width; // load & save container = new PPContainer(CONTAINER_INSTRUMENTS_INFO5, screen, this, PPPoint(nx, y), PPSize(39,23), false); containerEntire->addControl(container); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_INSTRUMENTEDITOR_LOAD, screen, this, PPPoint(nx + 2, y + 2), PPSize(34, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Load"); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTEDITOR_SAVE, screen, this, PPPoint(nx + 2, y + 2+10), PPSize(34, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Save"); container->addControl(button); // copy & paste y+=container->getSize().height; container = new PPContainer(CONTAINER_INSTRUMENTS_INFO6, screen, this, PPPoint(nx, y), PPSize(39,23), false); containerEntire->addControl(container); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(BUTTON_INSTRUMENTEDITOR_COPY, screen, this, PPPoint(nx + 2, y + 2), PPSize(34, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Copy"); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTEDITOR_SWAP, screen, this, PPPoint(nx + 2, y + 2+10), PPSize(34, 9)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Swap"); container->addControl(button); y+=container->getSize().height; // buoah container = new PPContainer(CONTAINER_INSTRUMENTS_INFO4, screen, this, PPPoint(nx, y), PPSize(39,30), false); containerEntire->addControl(container); container->setColor(TrackerConfig::colorThemeMain); button = new PPButton(MAINMENU_SMPEDIT, screen, &tracker, PPPoint(nx + 2, y + 2), PPSize(34, 12)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Smp.Ed."); container->addControl(button); button = new PPButton(BUTTON_INSTRUMENTEDITOR_EXIT, screen, &tracker, PPPoint(nx + 2, y + 2+13), PPSize(34, 12)); button->setText("Exit"); container->addControl(button); // piano y+=container->getSize().height; PPContainer* pianoContainer = new PPContainer(CONTAINER_PIANO, screen, this, PPPoint(0, y), PPSize(screen->getWidth(),25+SCROLLBUTTONSIZE+4), false); containerEntire->addControl(pianoContainer); pianoContainer->setColor(TrackerConfig::colorThemeMain); // piano test pianoControl = new PianoControl(PIANO_CONTROL, screen, this, PPPoint(1+32, y+1), PPSize(screen->getWidth()-2-32, 25+12), ModuleEditor::MAX_NOTE); // show C-3 pianoControl->assureNoteVisible(12*4); pianoControl->setBorderColor(TrackerConfig::colorThemeMain); pianoControl->setMode(PianoControl::ModePlay); pianoContainer->addControl(pianoControl); button = new PPButton(BUTTON_PIANO_PLAY, screen, this, PPPoint(1, y+1), PPSize(30, 12), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Play"); pianoContainer->addControl(button); button = new PPButton(BUTTON_PIANO_EDIT, screen, this, PPPoint(1, y+1+12), PPSize(30, 12), false, true, false); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setColor(TrackerConfig::colorThemeMain); button->setTextColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); button->setText("Edit"); pianoContainer->addControl(button); button = new PPButton(BUTTON_SAMPLE_PLAY_STOP, screen, this, PPPoint(2, y+1+2*12), PPSize(28, 11)); button->setFont(PPFont::getFont(PPFont::FONT_TINY)); button->setText("Stop"); pianoContainer->addControl(button); #endif containerEntire->adjustContainerSize(); screen->addControl(containerEntire); initialised = true; showSection(false); } void SectionInstruments::realign() { pp_uint32 maxShould = tracker.MAXEDITORHEIGHT(); pp_uint32 maxIs = containerEntire->getLocation().y + containerEntire->getSize().height; if (maxIs != maxShould) { pp_int32 offset = maxShould - maxIs; containerEntire->move(PPPoint(0, offset)); } PatternEditorControl* control = tracker.getPatternEditorControl(); PPScreen* screen = tracker.screen; if (visible) { control->setSize(PPSize(screen->getWidth(), tracker.MAXEDITORHEIGHT()-tracker.INSTRUMENTSECTIONDEFAULTHEIGHT()-tracker.UPPERSECTIONDEFAULTHEIGHT())); } else { control->setSize(PPSize(screen->getWidth(),tracker.MAXEDITORHEIGHT()-tracker.UPPERSECTIONDEFAULTHEIGHT())); } } void SectionInstruments::show(bool bShow) { #ifdef __LOWRES__ PPScreen* screen = tracker.screen; screen->pauseUpdate(true); #endif SectionAbstract::show(bShow); visible = bShow; containerEntire->show(bShow); if (!initialised) { init(); } if (initialised) { PatternEditorControl* control = tracker.getPatternEditorControl(); #ifndef __LOWRES__ realign(); #endif if (bShow) { if (control) { #ifdef __LOWRES__ control->show(false); replaceInstrumentListBoxes(true); #endif tracker.hideInputControl(); } update(false); } else if (control) { #ifdef __LOWRES__ control->show(true); replaceInstrumentListBoxes(false); #endif } showSection(bShow); } #ifdef __LOWRES__ // If instrument section is shown (bShow = true) // set focus to the Instrumentlist container (instrument listbox) // but before disable screen updates to prevent flickering if (bShow) { screen->setFocus(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); } screen->pauseUpdate(false); if (!bShow) { screen->update(); } #endif } void SectionInstruments::updateSampleSliders(bool repaint/* = true*/) { if (!initialised || !visible) return; PPScreen* screen = tracker.screen; PPContainer* container2 = containerSampleSlider; SampleEditor* sampleEditor = tracker.getSampleEditor(); static_cast(container2->getControlByID(SLIDER_SAMPLE_VOLUME))->setCurrentValue(sampleEditor->getFT2Volume()); static_cast(container2->getControlByID(STATICTEXT_SAMPLE_VOLUME))->setHexValue(sampleEditor->getFT2Volume(), 2); static_cast(container2->getControlByID(SLIDER_SAMPLE_PANNING))->setCurrentValue(sampleEditor->getPanning()); static_cast(container2->getControlByID(STATICTEXT_SAMPLE_PANNING))->setHexValue(sampleEditor->getPanning(), 2); mp_sint32 ft = sampleEditor->getFinetune(); static_cast(container2->getControlByID(SLIDER_SAMPLE_FINETUNE))->setCurrentValue((mp_uint32)(ft+128)); static_cast(container2->getControlByID(STATICTEXT_SAMPLE_FINETUNE))->setIntValue(ft, 4, true); screen->paintControl(container2, repaint); } void SectionInstruments::updateInstrumentSliders(bool repaint/* = true*/) { if (!initialised || !visible) return; PPScreen* screen = tracker.screen; ModuleEditor* moduleEditor = tracker.moduleEditor; PPContainer* container4 = containerInstrumentSlider; ModuleEditor::TEditorInstrument* ins = moduleEditor->getInstrumentInfo(tracker.listBoxInstruments->getSelectedIndex()); if (ins->volfade <= 0xFFF) { static_cast(container4->getControlByID(SLIDER_SAMPLE_VOLFADE))->setCurrentValue(ins->volfade); static_cast(container4->getControlByID(STATICTEXT_SAMPLE_VOLFADE))->setHexValue(ins->volfade, 3); } else { static_cast(container4->getControlByID(SLIDER_SAMPLE_VOLFADE))->setCurrentValue(0x1000); static_cast(container4->getControlByID(STATICTEXT_SAMPLE_VOLFADE))->setText("cut"); } static_cast(container4->getControlByID(SLIDER_SAMPLE_VIBSPEED))->setCurrentValue(ins->vibrate); static_cast(container4->getControlByID(STATICTEXT_SAMPLE_VIBSPEED))->setHexValue(ins->vibrate, 2); static_cast(container4->getControlByID(SLIDER_SAMPLE_VIBDEPTH))->setCurrentValue(ins->vibdepth); static_cast(container4->getControlByID(STATICTEXT_SAMPLE_VIBDEPTH))->setHexValue(ins->vibdepth, 1); static_cast(container4->getControlByID(SLIDER_SAMPLE_VIBSWEEP))->setCurrentValue(ins->vibsweep); static_cast(container4->getControlByID(STATICTEXT_SAMPLE_VIBSWEEP))->setHexValue(ins->vibsweep, 2); static_cast(container4->getControlByID(RADIOGROUP_SAMPLE_VIBTYPE))->setChoice(ins->vibtype); screen->paintControl(container4, repaint); } void SectionInstruments::notifyTabSwitch() { if (isVisible()) realign(); updateEnvelopeEditor(false, true); resetPianoAssignment(); } void SectionInstruments::notifySampleSelect(pp_int32 index) { PianoControl* pianoControl = getPianoControl(); if (pianoControl) pianoControl->setSampleIndex(index); } void SectionInstruments::update(bool repaint) { if (!initialised || !visible) return; PPScreen* screen = tracker.screen; ModuleEditor* moduleEditor = tracker.moduleEditor; updateEnvelopeEditor(false, true); // volume/panning etc. updateSampleSliders(false); // relative note number PPContainer* container3 = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTS_INFO2)); char noteName[40]; SampleEditor* sampleEditor = tracker.getSampleEditor(); #ifndef __LOWRES__ if (sampleEditor->getRelNoteNum() > 0) sprintf(noteName," (+%i)",(pp_int32)sampleEditor->getRelNoteNum()); else sprintf(noteName," (%i)",(pp_int32)sampleEditor->getRelNoteNum()); PatternTools::getNoteName(noteName, sampleEditor->getRelNoteNum() + 4*12 + 1, false); #else PatternTools::getNoteName(noteName, sampleEditor->getRelNoteNum() + 4*12 + 1); #endif static_cast(container3->getControlByID(STATICTEXT_SAMPLE_RELNOTE))->setText(noteName); pianoControl->setSampleTable(moduleEditor->getSampleTable(tracker.listBoxInstruments->getSelectedIndex())); // volfade/autovobrato updateInstrumentSliders(false); //#ifdef __LOWRES__ PPContainer* container5 = static_cast(screen->getControlByID(CONTAINER_PIANO)); { PPButton* editButton = static_cast(container5->getControlByID(BUTTON_PIANO_EDIT)); PPButton* playButton = static_cast(container5->getControlByID(BUTTON_PIANO_PLAY)); editButton->setPressed(false); playButton->setPressed(false); switch (getPianoControl()->getMode()) { case PianoControl::ModeEdit: editButton->setPressed(true); break; case PianoControl::ModePlay: playButton->setPressed(true); break; } } screen->paintControl(container5, false); //#endif screen->paintControl(container3, false); screen->paintControl(pianoControl, false); if (repaint) screen->update(); } void SectionInstruments::updateAfterLoad() { tracker.updateInstrumentsListBox(false); tracker.updateSamplesListBox(false); tracker.updateSampleEditorAndInstrumentSection(false); } void SectionInstruments::updateEnvelopeWindow(bool repaint/* = true*/) { tracker.screen->paintControl(envelopeEditorControl, repaint); } void SectionInstruments::updateEnvelopeEditor(bool repaint/* = true*/, bool reAttach/* = false*/) { EnvelopeEditor* envelopeEditor = getEnvelopeEditor(); if (!initialised || !visible) { // clear out envelope from editor if nothing is visible at all envelopeEditor->attachEnvelope(NULL, NULL); return; } PPScreen* screen = tracker.screen; PPContainer* container = containerEnvelopes; pp_int32 envIndex = -1; if (currentEnvelopeType == EnvelopeEditor::EnvelopeTypeVolume) { static_cast(container->getControlByID(BUTTON_ENVELOPE_VOLUME))->setPressed(true); static_cast(container->getControlByID(BUTTON_ENVELOPE_PANNING))->setPressed(false); envIndex = 0; envelopeEditorControl->setShowVCenter(false); } else if (currentEnvelopeType == EnvelopeEditor::EnvelopeTypePanning) { static_cast(container->getControlByID(BUTTON_ENVELOPE_VOLUME))->setPressed(false); static_cast(container->getControlByID(BUTTON_ENVELOPE_PANNING))->setPressed(true); envIndex = 1; envelopeEditorControl->setShowVCenter(true); } if (reAttach && envIndex != -1) tracker.moduleEditor->reloadEnvelope(tracker.listBoxInstruments->getSelectedIndex(), tracker.listBoxSamples->getSelectedIndex(), envIndex); #ifdef __LOWRES__ // these buttons are always there static_cast(container->getControlByID(BUTTON_ENVELOPE_UNDO))->setClickable(envelopeEditor->canUndo()); static_cast(container->getControlByID(BUTTON_ENVELOPE_REDO))->setClickable(envelopeEditor->canRedo()); static_cast(container->getControlByID(BUTTON_ENVELOPE_COPY))->setClickable(envelopeEditor->canCopy()); static_cast(container->getControlByID(BUTTON_ENVELOPE_PASTE))->setClickable(envelopeEditor->canPaste()); #else // these buttons only exist with screen width >= 800 if (screen->getWidth() >= 800) { static_cast(container->getControlByID(BUTTON_ENVELOPE_UNDO))->setClickable(envelopeEditor->canUndo()); static_cast(container->getControlByID(BUTTON_ENVELOPE_REDO))->setClickable(envelopeEditor->canRedo()); static_cast(container->getControlByID(BUTTON_ENVELOPE_COPY))->setClickable(envelopeEditor->canCopy()); static_cast(container->getControlByID(BUTTON_ENVELOPE_PASTE))->setClickable(envelopeEditor->canPaste()); } #endif static_cast(container->getControlByID(CHECKBOX_ENVELOPE_ON))->enable(envelopeEditor->isValidEnvelope()); static_cast(container->getControlByID(CHECKBOX_ENVELOPE_SUSTAIN))->enable(envelopeEditor->isValidEnvelope()); static_cast(container->getControlByID(CHECKBOX_ENVELOPE_LOOP))->enable(envelopeEditor->isValidEnvelope()); if (envelopeEditor->isValidEnvelope()) { static_cast(container->getControlByID(CHECKBOX_ENVELOPE_ON))->checkIt(envelopeEditor->isEnvelopeEnabled()); static_cast(container->getControlByID(CHECKBOX_ENVELOPE_SUSTAIN))->checkIt(envelopeEditor->isSustainEnabled()); static_cast(container->getControlByID(CHECKBOX_ENVELOPE_LOOP))->checkIt(envelopeEditor->isLoopEnabled()); static_cast(container->getControlByID(STATICTEXT_ENVELOPE_SUSTAINPT))->setIntValue(envelopeEditor->getSustainPtIndex(), 2); static_cast(container->getControlByID(STATICTEXT_ENVELOPE_LOOPSTARTPT))->setIntValue(envelopeEditor->getLoopStartPtIndex(), 2); static_cast(container->getControlByID(STATICTEXT_ENVELOPE_LOOPENDPT))->setIntValue(envelopeEditor->getLoopEndPtIndex(), 2); } else { static_cast(container->getControlByID(CHECKBOX_ENVELOPE_ON))->checkIt(false); static_cast(container->getControlByID(CHECKBOX_ENVELOPE_SUSTAIN))->checkIt(false); static_cast(container->getControlByID(CHECKBOX_ENVELOPE_LOOP))->checkIt(false); static_cast(container->getControlByID(STATICTEXT_ENVELOPE_SUSTAINPT))->setIntValue(0, 2); static_cast(container->getControlByID(STATICTEXT_ENVELOPE_LOOPSTARTPT))->setIntValue(0, 2); static_cast(container->getControlByID(STATICTEXT_ENVELOPE_LOOPENDPT))->setIntValue(0, 2); } PPButton* button = static_cast(container->getControlByID(BUTTON_ENVELOPE_SCALEX)); // button is only present in the hires version, NULL will be returned otherwise if (button) button->setClickable(!envelopeEditor->isEmptyEnvelope()); button = static_cast(container->getControlByID(BUTTON_ENVELOPE_SCALEY)); // see above if (button) button->setClickable(!envelopeEditor->isEmptyEnvelope()); screen->paintControl(container, repaint); } void SectionInstruments::resetEnvelopeEditor() { if (envelopeEditorControl) envelopeEditorControl->reset(); } void SectionInstruments::resetPianoAssignment() { pianoControl->setSampleIndex(0); } bool SectionInstruments::isEnvelopeVisible() { if (containerEnvelopes) return containerEnvelopes->isVisible(); return false; } pp_int32 SectionInstruments::getNumPredefinedEnvelopes() { return TrackerConfig::numPredefinedEnvelopes; } PPString SectionInstruments::getEncodedEnvelope(EnvelopeTypes type, pp_int32 index) { switch (type) { case EnvelopeTypeVolume: return EnvelopeContainer::encodeEnvelope(*predefinedVolumeEnvelopes->restore(index)); case EnvelopeTypePanning: return EnvelopeContainer::encodeEnvelope(*predefinedPanningEnvelopes->restore(index)); } ASSERT(false); return ""; } void SectionInstruments::setEncodedEnvelope(EnvelopeTypes type, pp_int32 index, const PPString& str) { TEnvelope e = EnvelopeContainer::decodeEnvelope(str); switch (type) { case EnvelopeTypeVolume: predefinedVolumeEnvelopes->store(index, e); break; case EnvelopeTypePanning: predefinedPanningEnvelopes->store(index, e); break; default: ASSERT(false); } } void SectionInstruments::handleZapInstrument() { showMessageBox(MESSAGEBOX_ZAPINSTRUMENT, "Zap instrument?"); } void SectionInstruments::zapInstrument() { tracker.moduleEditor->zapInstrument(tracker.listBoxInstruments->getSelectedIndex()); resetEnvelopeEditor(); tracker.sectionSamples->resetSampleEditor(); updateAfterLoad(); } milkytracker-0.90.85+dfsg/src/tracker/TrackerSettings.cpp0000644000175000017500000005533511316445145022504 0ustar admin2admin2/* * tracker/TrackerSettings.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TrackerSettings.cpp * MilkyTracker * * Created by Peter Barth on Sat Mar 19 2005. * */ #include "Tracker.h" #include "ModuleEditor.h" #include "TrackerSettingsDatabase.h" #include "PlayerMaster.h" #include "PlayerController.h" #include "PlayerLogic.h" #include "RecorderLogic.h" #include "TabManager.h" #include "Dictionary.h" #include "PatternEditorControl.h" #include "SampleEditorControl.h" #include "EnvelopeEditorControl.h" #include "SectionSamples.h" #include "SystemMessage.h" #include "SectionInstruments.h" #include "SectionSettings.h" #include "SectionSamples.h" #include "SectionDiskMenu.h" #include "SectionHDRecorder.h" #include "SectionQuickOptions.h" #include "SectionOptimize.h" #include "TrackerConfig.h" #include "ColorPaletteContainer.h" #include "Tools.h" #include "TitlePageManager.h" void Tracker::buildDefaultSettings() { if (settingsDatabase == NULL) return; pp_int32 i; char buffer[100]; // store version string to database settingsDatabase->store("VERSION", TrackerConfig::version); // ---------- Mixer ---------- #ifdef __DEFAULTBUFFERSIZE__ settingsDatabase->store("BUFFERSIZE", __DEFAULTBUFFERSIZE__); #else settingsDatabase->store("BUFFERSIZE", PlayerMaster::getPreferredBufferSize()); #endif settingsDatabase->store("MIXERVOLUME", 256); settingsDatabase->store("MIXERSHIFT", 1); settingsDatabase->store("RAMPING", 1); settingsDatabase->store("INTERPOLATION", 1); settingsDatabase->store("MIXERFREQ", PlayerMaster::getPreferredSampleRate()); #ifdef __FORCEPOWEROFTWOBUFFERSIZE__ settingsDatabase->store("FORCEPOWEROFTWOBUFFERSIZE", 1); #else settingsDatabase->store("FORCEPOWEROFTWOBUFFERSIZE", 0); #endif // Store audio driver settingsDatabase->store("AUDIODRIVER", PlayerMaster::getPreferredAudioDriverID()); // the first key HAS TO BE PLAYMODEKEEPSETTINGS settingsDatabase->store("PLAYMODEKEEPSETTINGS", 0); settingsDatabase->store("PLAYMODE","FASTTRACKER2"); settingsDatabase->store("PLAYMODE_ADVANCED_ALLOW8xx",1); settingsDatabase->store("PLAYMODE_ADVANCED_ALLOWE8x",0); // Only affects protracker playmodes settingsDatabase->store("PLAYMODE_ADVANCED_PTPITCHLIMIT",1); settingsDatabase->store("PLAYMODE_ADVANCED_PTPANNING", TrackerConfig::defaultProTrackerPanning); // ---------- Optimize -------- for (i = 0; i < (signed)SectionOptimize::getNumFlagGroups(); i++) { sprintf(buffer, "OPTIMIZER_%i",i); settingsDatabase->store(buffer, SectionOptimize::getDefaultFlags(i)); } // ---------- Layout ---------- settingsDatabase->store("FULLSCREEN", 0); settingsDatabase->store("XRESOLUTION", PPScreen::getDefaultWidth()); settingsDatabase->store("YRESOLUTION", PPScreen::getDefaultHeight()); settingsDatabase->store("SCREENSCALEFACTOR", 1); settingsDatabase->store("ENVELOPEEDITORSCALE", 256); for (i = 0; i < PPFont::FONT_LAST; i++) { const char* keyName = PPFont::getFamilyInternalName((PPFont::FontID)i); const char* valueName = PPFont::getCurrentFontFace((PPFont::FontID)i); settingsDatabase->store(keyName, valueName); } #ifdef __LOWRES__ settingsDatabase->store("PATTERNFONT", PPFont::FONT_TINY); #else settingsDatabase->store("PATTERNFONT", PPFont::FONT_SYSTEM); #endif // Scopes? settingsDatabase->store("SCOPES", 1); // Pattern spacing settingsDatabase->store("SPACING", 0); // Trace instruments setting settingsDatabase->store("INSTRUMENTBACKTRACE", 0); // TAB to note? settingsDatabase->store("TABTONOTE", 1); // mouseclick to cursor? settingsDatabase->store("CLICKTOCURSOR", 1); // autoresize pattern on paste? settingsDatabase->store("PATTERNAUTORESIZE", 0); // Show hex row numbers settingsDatabase->store("HEXCOUNT", 1); // Show zeroes instead of dots for unused effects settingsDatabase->store("SHOWZEROEFFECT", 0); // Wrap around cursor settingsDatabase->store("WRAPAROUND", 1); // Beeing prospective settingsDatabase->store("PROSPECTIVE", 0); // follow song when playing settingsDatabase->store("FOLLOWSONG", 1); // Live switch settingsDatabase->store("LIVESWITCH", 0); // Our default edit mode #ifdef __LOWRES__ settingsDatabase->store("EDITMODE", EditModeMilkyTracker); #else settingsDatabase->store("EDITMODE", EditModeFastTracker); #endif // Our default scrolling mode settingsDatabase->store("SCROLLMODE", ScrollModeStayInCenter); // Mute fading value (from 0 to 100 percent) settingsDatabase->store("MUTEFADE", 50); // Modulo for the first pattern highlight settingsDatabase->store("HIGHLIGHTMODULO1", 4); // Modulo for the first pattern highlight settingsDatabase->store("HIGHLIGHTROW1", 0); // Modulo for the second pattern highlight settingsDatabase->store("HIGHLIGHTMODULO2", 8); // Modulo for the second pattern highlight settingsDatabase->store("HIGHLIGHTROW2", 0); // Enable sample undobuffer by default settingsDatabase->store("SAMPLEEDITORUNDOBUFFER", 1); // Auto-mixdown to mono when loading samples settingsDatabase->store("AUTOMIXDOWNSAMPLES", 0); // Hexadecimal offsets in the sample editor by default settingsDatabase->store("SAMPLEEDITORDECIMALOFFSETS", 0); // use internal disk browser? settingsDatabase->store("INTERNALDISKBROWSER", 0); // disk browser settings settingsDatabase->store("INTERNALDISKBROWSERSETTINGS", SectionDiskMenu::getDefaultConfigUInt32()); settingsDatabase->store("INTERNALDISKBROWSERLASTPATH", ""); // Estimate playtime after a song has been loaded? #ifdef __LOWRES__ settingsDatabase->store("AUTOESTPLAYTIME", 0); #else settingsDatabase->store("AUTOESTPLAYTIME", 1); #endif // show splash screen? settingsDatabase->store("SHOWSPLASH", 1); // orderlist is extended settingsDatabase->store("EXTENDEDORDERLIST", 0); // current row add settingsDatabase->store("ROWINSERTADD", 1); // show title field settingsDatabase->store("TITLEPAGE", TitlePageManager::PageTitle); // sample editor last settings settingsDatabase->store("SAMPLEEDITORLASTVALUES", ""); // no virtual channels for instrument playback settingsDatabase->store("VIRTUALCHANNELS", 0); // enable multichn recording by default settingsDatabase->store("MULTICHN_RECORD", 1); // enable multichn keyjazzing by default settingsDatabase->store("MULTICHN_KEYJAZZ", 1); // disable multichn edit by default settingsDatabase->store("MULTICHN_EDIT", 0); // enable key off recording by default settingsDatabase->store("MULTICHN_RECORDKEYOFF", 1); // disable note delay recording settingsDatabase->store("MULTICHN_RECORDNOTEDELAY", 0); // ---------- Tabs ---------- // Control playing of background tabs settingsDatabase->store("TABS_STOPBACKGROUNDBEHAVIOUR", TabManager::StopTabsBehaviourNone); settingsDatabase->store("TABS_TABSWITCHRESUMEPLAY", 0); settingsDatabase->store("TABS_LOADMODULEINNEWTAB", 0); settingsDatabase->store("ACTIVECOLORS", TrackerConfig::defaultColorPalette); // Store volume envelopes for (i = 0; i < TrackerConfig::numPredefinedEnvelopes; i++) { sprintf(buffer, "PREDEFENVELOPEVOLUME_%i",i); settingsDatabase->store(buffer, TrackerConfig::defaultPredefinedVolumeEnvelope); } // Store panning envelopes for (i = 0; i < TrackerConfig::numPredefinedEnvelopes; i++) { sprintf(buffer, "PREDEFENVELOPEPANNING_%i",i); settingsDatabase->store(buffer, TrackerConfig::defaultPredefinedPanningEnvelope); } // ---------- HD recorder last settings ---------- settingsDatabase->store("HDRECORDER_MIXFREQ", 44100); settingsDatabase->store("HDRECORDER_MIXERVOLUME", 256); settingsDatabase->store("HDRECORDER_MIXERSHIFT", 1); settingsDatabase->store("HDRECORDER_RAMPING", 1); settingsDatabase->store("HDRECORDER_INTERPOLATION", 1); settingsDatabase->store("HDRECORDER_ALLOWMUTING", 0); for (i = 0; i < NUMEFFECTMACROS; i++) { sprintf(buffer, "EFFECTMACRO_%i",i); settingsDatabase->store(buffer, 0); } // store predefined colorsets for (i = 0; i < TrackerConfig::numPredefinedColorPalettes; i++) { sprintf(buffer, "PREDEFCOLORPALETTE_%i",i); settingsDatabase->store(buffer, TrackerConfig::predefinedColorPalettes[i]); } //settingsDatabase->dump(); } void Tracker::applySettingByKey(PPDictionaryKey* theKey, TMixerSettings& settings, pp_uint32 version) { PatternEditorControl* patternEditorCtrl = getPatternEditorControl(); PatternEditor* patternEditor = moduleEditor->getPatternEditor(); SampleEditor* sampleEditor = moduleEditor->getSampleEditor(); SampleEditorControl* sampleEditorControl = sectionSamples->getSampleEditorControl(); pp_int32 v2 = theKey->getIntValue(); if (theKey->getKey().compareTo("BUFFERSIZE") == 0) { // check for backward compatibility // 0x9071 was the version which allowed for buffer size in samples // instead of 250hz "packets" if (version > 0x9070) settings.bufferSize = v2; else theKey->store(PlayerMaster::getPreferredBufferSize()); } else if (theKey->getKey().compareTo("MIXERFREQ") == 0) { settings.mixFreq = v2; } else if (theKey->getKey().compareTo("MIXERVOLUME") == 0) { settings.mixerVolume = v2; } else if (theKey->getKey().compareTo("MIXERSHIFT") == 0) { settings.mixerShift = 2-v2; } else if (theKey->getKey().compareTo("RAMPING") == 0) { settings.ramping = v2; } else if (theKey->getKey().compareTo("INTERPOLATION") == 0) { settings.resampler = v2; } else if (theKey->getKey().compareTo("FORCEPOWEROFTWOBUFFERSIZE") == 0) { settings.powerOfTwoCompensation = v2; } else if (theKey->getKey().compareTo("AUDIODRIVER") == 0) { settings.setAudioDriverName(theKey->getStringValue()); } else if (theKey->getKey().compareTo("PLAYMODEKEEPSETTINGS") == 0) { sectionQuickOptions->setKeepSettings(v2 != 0); } else if (theKey->getKey().compareTo("PLAYMODE") == 0) { PPString str = theKey->getStringValue(); if (str.compareTo("PROTRACKER2") == 0) { playerController->switchPlayMode(PlayerController::PlayMode_ProTracker2, false); // we set default to 4 channels so people will immediately be able to see // which playmode is the active one setModuleNumChannels(4); } else if (str.compareTo("PROTRACKER3") == 0) { playerController->switchPlayMode(PlayerController::PlayMode_ProTracker3, false); // see above comment setModuleNumChannels(4); } else playerController->switchPlayMode(PlayerController::PlayMode_FastTracker2, false); } else if (theKey->getKey().compareTo("PLAYMODE_ADVANCED_ALLOW8xx") == 0) { playerController->enablePlayModeOption(PlayerController::PlayModeOptionPanning8xx, v2 != 0); } else if (theKey->getKey().compareTo("PLAYMODE_ADVANCED_ALLOWE8x") == 0) { playerController->enablePlayModeOption(PlayerController::PlayModeOptionPanningE8x, v2 != 0); } else if (theKey->getKey().compareTo("PLAYMODE_ADVANCED_PTPITCHLIMIT") == 0) { playerController->enablePlayModeOption(PlayerController::PlayModeOptionForcePTPitchLimit, v2 != 0); } else if (theKey->getKey().compareTo("PLAYMODE_ADVANCED_PTPANNING") == 0) { pp_uint8* panning = new pp_uint8[TrackerConfig::numPlayerChannels]; if (PPTools::decodeByteArray(panning, TrackerConfig::numPlayerChannels, theKey->getStringValue())) { pp_int32 i; for (i = 0; i < TrackerConfig::numPlayerChannels; i++) playerController->setPanning((pp_uint8)i, panning[i]); } delete[] panning; } // ---------------- Virtal channels ------------------- else if (theKey->getKey().compareTo("VIRTUALCHANNELS") == 0) { settings.numVirtualChannels = v2; } else if (theKey->getKey().compareTo("FULLSCREEN") == 0) { bool fullScreen = (v2 != 0); if (fullScreen != screen->isFullScreen()) { bool res = screen->goFullScreen(fullScreen); theKey->store(screen->isFullScreen()); if (!res) { SystemMessage message(*screen, SystemMessage::MessageFullScreenFailed); message.show(); } } } else if (theKey->getKey().compareTo("ENVELOPEEDITORSCALE") == 0) { if (sectionInstruments && sectionInstruments->getEnvelopeEditor()) sectionInstruments->getEnvelopeEditorControl()->setScale(v2); } else if (theKey->getKey().compareTo("PATTERNFONT") == 0) { if (patternEditorCtrl) patternEditorCtrl->setFont(PPFont::getFont(v2)); } else if (theKey->getKey().compareTo("SCOPES") == 0) { showScopes(v2 & 1, v2>>1); } else if (theKey->getKey().compareTo("SPACING") == 0) { if (patternEditorCtrl) patternEditorCtrl->setSpacing(v2); } else if (theKey->getKey().compareTo("HIGHLIGHTMODULO1") == 0) { if (patternEditorCtrl) patternEditorCtrl->setHighlightSpacingPrimary(v2); } else if (theKey->getKey().compareTo("HIGHLIGHTROW1") == 0) { if (patternEditorCtrl) patternEditorCtrl->setHighLightRowPrimary(v2 != 0); } else if (theKey->getKey().compareTo("HIGHLIGHTMODULO2") == 0) { if (patternEditorCtrl) patternEditorCtrl->setHighlightSpacingSecondary(v2); } else if (theKey->getKey().compareTo("HIGHLIGHTROW2") == 0) { if (patternEditorCtrl) patternEditorCtrl->setHighLightRowSecondary(v2 != 0); } else if (theKey->getKey().compareTo("INSTRUMENTBACKTRACE") == 0) { if (patternEditorCtrl) patternEditorCtrl->setInstrumentBackTrace(v2 != 0); } else if (theKey->getKey().compareTo("TABTONOTE") == 0) { if (patternEditorCtrl) patternEditorCtrl->setTabToNote(v2 != 0); } else if (theKey->getKey().compareTo("CLICKTOCURSOR") == 0) { if (patternEditorCtrl) patternEditorCtrl->setClickToCursor(v2 != 0); } else if (theKey->getKey().compareTo("PATTERNAUTORESIZE") == 0) { if (patternEditorCtrl) patternEditorCtrl->setAutoResize(v2 != 0); } else if (theKey->getKey().compareTo("HEXCOUNT") == 0) { if (patternEditorCtrl) patternEditorCtrl->setHexCount(v2 != 0); } else if (theKey->getKey().compareTo("SHOWZEROEFFECT") == 0) { if (patternEditorCtrl) patternEditorCtrl->showZeroEffect(v2 != 0); } else if (theKey->getKey().compareTo("WRAPAROUND") == 0) { setCursorWrapAround(v2 != 0, false); } else if (theKey->getKey().compareTo("PROSPECTIVE") == 0) { setProspectiveMode(v2 != 0, false); } else if (theKey->getKey().compareTo("FOLLOWSONG") == 0) { setFollowSong(v2 != 0, false); } else if (theKey->getKey().compareTo("LIVESWITCH") == 0) { setLiveSwitch(v2 != 0, false); } else if (theKey->getKey().compareTo("EDITMODE") == 0) { switchEditMode((EditModes)v2); } else if (theKey->getKey().compareTo("SCROLLMODE") == 0) { if (patternEditorCtrl) patternEditorCtrl->setScrollMode((ScrollModes)v2); } else if (theKey->getKey().compareTo("MUTEFADE") == 0) { if (patternEditorCtrl) patternEditorCtrl->setMuteFade((v2*65536)/100); } else if (theKey->getKey().compareTo("SAMPLEEDITORUNDOBUFFER") == 0) { if (sampleEditor) sampleEditor->enableUndoStack(v2 != 0); } else if (theKey->getKey().compareTo("SAMPLEEDITORDECIMALOFFSETS") == 0) { if (sectionSamples) sectionSamples->setOffsetFormat(v2); } else if (theKey->getKey().compareTo("SAMPLEEDITORLASTVALUES") == 0) { if (sampleEditorControl) { PPDictionary* dict = PPDictionary::createFromString(theKey->getStringValue()); if (dict) sampleEditorControl->getLastValues().restoreFromDictionary(*dict); delete dict; } } else if (theKey->getKey().compareTo("INTERNALDISKBROWSER") == 0) { useClassicBrowser = (v2 != 0); } else if (theKey->getKey().compareTo("INTERNALDISKBROWSERSETTINGS") == 0) { if (sectionDiskMenu) sectionDiskMenu->setConfigUInt32(v2); } else if (theKey->getKey().compareTo("INTERNALDISKBROWSERLASTPATH") == 0) { if (sectionDiskMenu) { PPSystemString path(theKey->getStringValue()); sectionDiskMenu->setCurrentPath(path, false); } } else if (theKey->getKey().compareTo("AUTOESTPLAYTIME") == 0) { if (v2) estimateSongLength(); } else if (theKey->getKey().compareTo("EXTENDEDORDERLIST") == 0) { expandOrderlist(v2 != 0); } else if (theKey->getKey().compareTo("ROWINSERTADD") == 0) { getPatternEditorControl()->setRowInsertAdd(v2); } else if (theKey->getKey().compareTo("TITLEPAGE") == 0) { TitlePageManager titlePageManager(*screen); titlePageManager.showTitlePage((TitlePageManager::Pages)v2, false); } // ---------------- HD Recorder settings ------------------- else if (theKey->getKey().compareTo("HDRECORDER_MIXFREQ") == 0) { sectionHDRecorder->setSettingsFrequency(v2); } else if (theKey->getKey().compareTo("HDRECORDER_MIXERVOLUME") == 0) { sectionHDRecorder->setSettingsMixerVolume(v2); } else if (theKey->getKey().compareTo("HDRECORDER_MIXERSHIFT") == 0) { sectionHDRecorder->setSettingsMixerShift(v2); } else if (theKey->getKey().compareTo("HDRECORDER_RAMPING") == 0) { sectionHDRecorder->setSettingsRamping(v2 != 0); } else if (theKey->getKey().compareTo("HDRECORDER_INTERPOLATION") == 0) { sectionHDRecorder->setSettingsResampler(v2); } else if (theKey->getKey().compareTo("HDRECORDER_ALLOWMUTING") == 0) { sectionHDRecorder->setSettingsAllowMuting(v2 != 0); } // ---------------- Recording & stuff ------------------ else if (theKey->getKey().compareTo("MULTICHN_RECORD") == 0) { playerMaster->setMultiChannelRecord(v2 != 0); } else if (theKey->getKey().compareTo("MULTICHN_KEYJAZZ") == 0) { playerMaster->setMultiChannelKeyJazz(v2 != 0); } else if (theKey->getKey().compareTo("MULTICHN_EDIT") == 0) { patternEditorCtrl->setMultiChannelEdit(v2 != 0); } else if (theKey->getKey().compareTo("MULTICHN_RECORDKEYOFF") == 0) { recorderLogic->setRecordKeyOff(v2 != 0); } else if (theKey->getKey().compareTo("MULTICHN_RECORDNOTEDELAY") == 0) { recorderLogic->setRecordNoteDelay(v2 != 0); } // ----------------------- Tabs ------------------------- else if (theKey->getKey().compareTo("TABS_STOPBACKGROUNDBEHAVIOUR") == 0) { switch (v2) { case TabManager::StopTabsBehaviourNone: tabManager->setStopOnTabSwitch(false); playerLogic->setStopBackgroundOnPlay(false); break; case TabManager::StopTabsBehaviourOnTabSwitch: tabManager->setStopOnTabSwitch(true); playerLogic->setStopBackgroundOnPlay(false); break; case TabManager::StopTabsBehaviourOnPlayback: tabManager->setStopOnTabSwitch(false); playerLogic->setStopBackgroundOnPlay(true); break; } } else if (theKey->getKey().compareTo("TABS_TABSWITCHRESUMEPLAY") == 0) { tabManager->setResumeOnTabSwitch(v2 != 0); } // ------------------ color palette -------------------- else if (theKey->getKey().compareTo("ACTIVECOLORS") == 0) { TColorPalette pal; PPString str = theKey->getStringValue(); pal = ColorPaletteContainer::decodePalette(str); for (pp_int32 i = 0; i < pal.numColors; i++) { if (i < GlobalColorConfig::ColorLast) GlobalColorConfig::getInstance()->setColor((GlobalColorConfig::GlobalColors)i, pal.colors[i]); } } else if (theKey->getKey().startsWith("PREDEFCOLORPALETTE_")) { if (sectionSettings) { PPString str = (const char*)theKey->getKey()+19; pp_int32 i = str.getIntValue(); str = theKey->getStringValue(); sectionSettings->setEncodedPalette(i, str); } } // ------------------ envelopes -------------------- else if (theKey->getKey().startsWith("PREDEFENVELOPEVOLUME_")) { if (sectionInstruments) { PPString str = (const char*)theKey->getKey()+21; pp_int32 i = str.getIntValue(); str = theKey->getStringValue(); sectionInstruments->setEncodedEnvelope(SectionInstruments::EnvelopeTypeVolume, i, str); } } else if (theKey->getKey().startsWith("PREDEFENVELOPEPANNING_")) { if (sectionInstruments) { PPString str = (const char*)theKey->getKey()+22; pp_int32 i = str.getIntValue(); str = theKey->getStringValue(); sectionInstruments->setEncodedEnvelope(SectionInstruments::EnvelopeTypePanning, i, str); } } // ------------------ effect macros -------------------- else if (theKey->getKey().startsWith("EFFECTMACRO_")) { if (patternEditor) { PPString str = (const char*)theKey->getKey()+12; pp_int32 i = str.getIntValue(); patternEditor->setMacroOperands(i, (pp_uint8)(v2 >> 8), (pp_uint8)(v2 & 0xff)); } } else if (theKey->getKey().startsWith("OPTIMIZER_")) { if (sectionOptimize) { PPString str = (const char*)theKey->getKey()+10; pp_int32 i = str.getIntValue(); sectionOptimize->setOptimizeCheckBoxFlags(i, v2); } } else { for (pp_uint32 i = 0; i < PPFont::FONT_LAST; i++) { const char* keyName = PPFont::getFamilyInternalName((PPFont::FontID)i); if (theKey->getKey().compareTo(keyName) == 0) { PPFont::selectFontFace((PPFont::FontID)i, theKey->getStringValue()); } } } } void Tracker::getMixerSettingsFromDatabase(TMixerSettings& mixerSettings, TrackerSettingsDatabase& currentSettings) { mixerSettings.mixFreq = currentSettings.restore("MIXERFREQ")->getIntValue(); mixerSettings.bufferSize = currentSettings.restore("BUFFERSIZE")->getIntValue(); mixerSettings.mixerVolume = currentSettings.restore("MIXERVOLUME")->getIntValue(); mixerSettings.mixerShift = 2 - currentSettings.restore("MIXERSHIFT")->getIntValue(); mixerSettings.powerOfTwoCompensation = currentSettings.restore("FORCEPOWEROFTWOBUFFERSIZE")->getIntValue(); mixerSettings.resampler = currentSettings.restore("INTERPOLATION")->getIntValue(); mixerSettings.ramping = currentSettings.restore("RAMPING")->getIntValue(); mixerSettings.setAudioDriverName(currentSettings.restore("AUDIODRIVER")->getStringValue()); mixerSettings.numVirtualChannels = currentSettings.restore("VIRTUALCHANNELS")->getIntValue(); } void Tracker::applySettings(TrackerSettingsDatabase* newSettings, TrackerSettingsDatabase* currentSettings/* = NULL*/, bool applyMixerSettings/* = true*/, bool allowMixerRestart/* = true*/) { pp_uint32 version = TrackerConfig::version; PPDictionaryKey* versionKey = newSettings->restore("VERSION"); if (versionKey != NULL) version = versionKey->getIntValue(); PPDictionaryKey* theKey = newSettings->getFirstKey(); TMixerSettings newMixerSettings; while (theKey) { if (currentSettings != NULL) { PPDictionaryKey* dKey = currentSettings->restore(theKey->getKey()); if (dKey) { if (theKey->getStringValue().compareTo(dKey->getStringValue()) != 0) { applySettingByKey(theKey, newMixerSettings, version); } } } else { applySettingByKey(theKey, newMixerSettings, version); } theKey = newSettings->getNextKey(); } if (applyMixerSettings) { bool res = playerMaster->applyNewMixerSettings(newMixerSettings, allowMixerRestart); if (!res) { SystemMessage message(*screen, SystemMessage::MessageSoundDriverInitFailed); message.show(); } } } milkytracker-0.90.85+dfsg/src/tracker/Tracker.cpp0000644000175000017500000027023011150223367020750 0ustar admin2admin2/* * tracker/Tracker.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ #include "Tracker.h" #include "TrackerConfig.h" #include "TabManager.h" #include "PlayerController.h" #include "PlayerMaster.h" #include "PlayerLogic.h" #include "RecorderLogic.h" #include "SamplePlayer.h" #include "SimpleVector.h" #include "ModuleEditor.h" #include "TabTitleProvider.h" #include "PPUI.h" #include "PatternTools.h" #include "PatternEditorControl.h" #include "EnvelopeEditorControl.h" #include "PianoControl.h" #include "PeakLevelControl.h" #include "ScopesControl.h" #include "TabHeaderControl.h" #include "SampleEditorControl.h" #include "TrackerSettingsDatabase.h" #include "KeyBindings.h" #include "ModuleServices.h" #include "FileIdentificator.h" #include "FileExtProvider.h" #include "Decompressor.h" #include "Zapper.h" #include "TitlePageManager.h" // Sections #include "SectionSwitcher.h" #include "SectionTranspose.h" #include "SectionAdvancedEdit.h" #include "SectionDiskMenu.h" #include "SectionHDRecorder.h" #include "SectionSettings.h" #include "SectionInstruments.h" #include "SectionSamples.h" #include "SectionQuickOptions.h" #include "SectionOptimize.h" #include "SectionAbout.h" #include "InputControlListener.h" // Some helper messageboxes & button handlers #include "DialogHandlers.h" #include "DialogChannelSelector.h" #include "DialogZap.h" // Helper class to invoke tools which need parameters #include "ToolInvokeHelper.h" #include "ControlIDs.h" // OS Interface #include "PPOpenPanel.h" #include "PPSavePanel.h" static inline pp_int32 myMod(pp_int32 a, pp_int32 b) { pp_int32 res = a%b; if (res<0) res+=b; return res; } #ifndef __LOWRES__ pp_int32 Tracker::SCOPESHEIGHT() { return (48*screen->getHeight()) / 480; } pp_int32 Tracker::CURRENTSCOPESHEIGHT() { if (!scopesControl) return 0; if (scopesControl->isVisible()) return SCOPESHEIGHT(); return 0; } pp_int32 Tracker::SAMPLESECTIONDEFAULTHEIGHT() { return screen->getHeight() < 480 ? 180 : 240; } #endif pp_int32 Tracker::MAXEDITORHEIGHT() { #ifndef __LOWRES__ TabHeaderControl* tabControl = static_cast(screen->getControlByID(TABHEADER_CONTROL)); if (tabControl != NULL) { return tabControl->getNumTabs() > 1 ? screen->getHeight() - TABHEADERHEIGHT() : screen->getHeight(); } #endif return screen->getHeight(); } Tracker::Tracker() : screen(NULL), peakLevelControl(NULL), scopesControl(NULL), messageBoxContainerGeneric(NULL), dialog(NULL), responder(NULL), playTimeText(NULL), instrumentChooser(NULL), inputContainerCurrent(NULL), inputContainerDefault(NULL), inputContainerExtended(NULL), settingsDatabaseCopy(NULL), eventKeyDownBindings(NULL), eventKeyDownBindingsMilkyTracker(NULL), eventKeyDownBindingsFastTracker(NULL), currentFileName(TrackerConfig::untitledSong), lastState(false), editMode(EditModeFastTracker), extendedOrderlist(false), followSong(true), caughtMouseInUpperLeftCorner(false), useClassicBrowser(false), savePanel(NULL), fileSystemChangedListener(NULL) { resetStateMemories(); settingsDatabase = new TrackerSettingsDatabase(); buildDefaultSettings(); tabManager = new TabManager(*this); playerMaster = new PlayerMaster(TrackerConfig::numTabs); playerController = tabManager->createPlayerController(); moduleEditor = tabManager->createModuleEditor(); playerLogic = new PlayerLogic(*this); recorderLogic = new RecorderLogic(*this); // Sections sectionSwitcher = new SectionSwitcher(*this); sections = new PPSimpleVector(); sectionTranspose = new SectionTranspose(*this); sections->add(sectionTranspose); sectionAdvancedEdit = new SectionAdvancedEdit(*this); sections->add(sectionAdvancedEdit); sectionDiskMenu = new SectionDiskMenu(*this); sections->add(sectionDiskMenu); sectionHDRecorder = new SectionHDRecorder(*this); sections->add(sectionHDRecorder); sectionSettings = new SectionSettings(*this); sections->add(sectionSettings); sectionInstruments = new SectionInstruments(*this); sections->add(sectionInstruments); sectionSamples = new SectionSamples(*this); sections->add(sectionSamples); sectionQuickOptions = new SectionQuickOptions(*this); sections->add(sectionQuickOptions); sectionOptimize = new SectionOptimize(*this); sections->add(sectionOptimize); sectionAbout = new SectionAbout(*this); sections->add(sectionAbout); inputControlListener = new InputControlListener(*this); toolInvokeHelper = new ToolInvokeHelper(*this); pp_int32 i; muteChannels = new pp_uint8[TrackerConfig::numPlayerChannels]; for (i = 0; i < TrackerConfig::numPlayerChannels; i++) muteChannels[i] = false; initKeyBindings(); } Tracker::~Tracker() { delete eventKeyDownBindingsMilkyTracker; delete eventKeyDownBindingsFastTracker; delete toolInvokeHelper; delete responder; delete dialog; delete inputControlListener; delete sections; delete sectionSwitcher; delete recorderLogic; delete playerLogic; delete playerMaster; delete messageBoxContainerGeneric; delete[] muteChannels; delete instrumentChooser; delete settingsDatabaseCopy; delete settingsDatabase; } PatternEditor* Tracker::getPatternEditor() { return moduleEditor->getPatternEditor(); } SampleEditor* Tracker::getSampleEditor() { return moduleEditor->getSampleEditor(); } EnvelopeEditor* Tracker::getEnvelopeEditor() { return moduleEditor->getEnvelopeEditor(); } pp_int32 Tracker::getOrderListBoxIndex() { return listBoxOrderList->getSelectedIndex(); } void Tracker::setOrderListIndex(pp_int32 index) { // do not accept values which exceed the current number of orders if (index >= moduleEditor->getNumOrders()) index = moduleEditor->getNumOrders()-1; listBoxOrderList->setSelectedIndex(index); updateOrderlist(); // fake selection from orderlist, so everything will be updated correctly PPEvent e(eSelection, &index, sizeof(index)); handleEvent(reinterpret_cast(listBoxOrderList), &e); } bool Tracker::isEditingCurrentOrderlistPattern() { return moduleEditor->isEditingOrderPosition(getOrderListBoxIndex()); } pp_int32 Tracker::getInstrumentToPlay(pp_int32 note, PlayerController*& playerController) { if (PPControl* ctrl = screen->getModalControl()) { note--; PPContainer* container = static_cast(ctrl); PPListBox* listBoxSrc = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC)); PPListBox* listBoxSrcSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC2)); PPListBox* listBoxSrcModule = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC3)); PPListBox* listBoxDst = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST)); PPListBox* listBoxDstSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST2)); PPListBox* listBoxDstModule = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST3)); if (!listBoxSrc || !listBoxDst) return -1; PPListBox* focusedListBox = static_cast(container->getFocusedControl()); if (focusedListBox == NULL) return getPatternEditorControl()->isInstrumentEnabled() ? listBoxInstruments->getSelectedIndex() + 1 : 0; // not having any module selection boxes if (listBoxSrc && listBoxDst && !listBoxSrcModule && !listBoxDstModule) { // return the selected index from the focused list box if (focusedListBox == listBoxSrc || focusedListBox == listBoxDst) return focusedListBox->getSelectedIndex() + 1; } // focus is on instruments if (focusedListBox == listBoxSrc || focusedListBox == listBoxSrcModule) { playerController = tabManager->getPlayerControllerFromTabIndex(listBoxSrcModule->getSelectedIndex()); // return the selected index from the focused list box return listBoxSrc->getSelectedIndex() + 1; } else if (focusedListBox == listBoxDst || focusedListBox == listBoxDstModule) { playerController = tabManager->getPlayerControllerFromTabIndex(listBoxDstModule->getSelectedIndex()); // return the selected index from the focused list box return listBoxDst->getSelectedIndex() + 1; } // if focus is on one of the samples list boxes set up some sample playing // on the sample playing channels of the current player ModuleEditor* src = listBoxSrcModule ? tabManager->getModuleEditorFromTabIndex(listBoxSrcModule->getSelectedIndex()) : this->moduleEditor; ModuleEditor* dst = listBoxDstModule ? tabManager->getModuleEditorFromTabIndex(listBoxDstModule->getSelectedIndex()) : this->moduleEditor; if (focusedListBox == listBoxSrcSmp) { SamplePlayer samplePlayer(*src, *playerController); if (focusedListBox == listBoxSrcSmp) samplePlayer.playSample(listBoxSrc->getSelectedIndex(), listBoxSrcSmp->getSelectedIndex(), note); else samplePlayer.playSample(listBoxSrc->getSelectedIndex(), note); return -1; } if (focusedListBox == listBoxDstSmp) { SamplePlayer samplePlayer(*dst, *playerController); if (focusedListBox == listBoxDstSmp) samplePlayer.playSample(listBoxDst->getSelectedIndex(), listBoxDstSmp->getSelectedIndex(), note); else samplePlayer.playSample(listBoxDst->getSelectedIndex(), note); return -1; } return focusedListBox->getSelectedIndex() + 1; } else { return getPatternEditorControl()->isInstrumentEnabled() ? listBoxInstruments->getSelectedIndex() + 1 : 0; } } void Tracker::setNumChannels(pp_int32 numChannels, bool repaint/* = true*/) { getPatternEditorControl()->setNumVisibleChannels(numChannels); scopesControl->setNumChannels(numChannels); updatePatternEditorControl(repaint, false); } void Tracker::showSongSettings(bool show) { screen->getControlByID(CONTAINER_ABOUT)->show(show); screen->getControlByID(CONTAINER_ORDERLIST)->show(show); screen->getControlByID(CONTAINER_SPEED)->show(show); screen->getControlByID(CONTAINER_PATTERN)->show(show); } void Tracker::showMainOptions(bool show) { screen->getControlByID(CONTAINER_MENU)->show(show); } void Tracker::showMainMenu(bool show, bool showInstrumentSelector) { #ifndef __LOWRES__ showSongSettings(show); showMainOptions(show); if (showInstrumentSelector) screen->getControlByID(CONTAINER_INSTRUMENTLIST)->show(show); #else if (!show) { showSongSettings(false); showMainOptions(false); screen->getControlByID(CONTAINER_LOWRES_MENUSWITCH)->show(false); screen->getControlByID(CONTAINER_INSTRUMENTLIST)->show(false); screen->getControlByID(CONTAINER_LOWRES_TINYMENU)->show(false); } else { sectionSwitcher->showCurrentSubMenu(false); screen->getControlByID(CONTAINER_LOWRES_MENUSWITCH)->show(true); } #endif } #ifdef __LOWRES__ void Tracker::selectScopesControl(pp_int32 ctrlType) { scopesControl->setCurrentClickType((ScopesControl::ClickTypes)ctrlType); updateScopesControlButtons(); screen->paintControl(screen->getControlByID(CONTAINER_SCOPECONTROL)); } void Tracker::updateScopesControlButtons() { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_SCOPECONTROL)); ASSERT(container); if (!container->isVisible()) return; if (!scopesControl) return; static_cast(container->getControlByID(BUTTON_SCOPECONTROL_MUTE))->setPressed(false); static_cast(container->getControlByID(BUTTON_SCOPECONTROL_SOLO))->setPressed(false); static_cast(container->getControlByID(BUTTON_SCOPECONTROL_REC))->setPressed(false); switch (scopesControl->getCurrentClickType()) { case ScopesControl::ClickTypeMute: static_cast(container->getControlByID(BUTTON_SCOPECONTROL_MUTE))->setPressed(true); break; case ScopesControl::ClickTypeSolo: static_cast(container->getControlByID(BUTTON_SCOPECONTROL_SOLO))->setPressed(true); break; case ScopesControl::ClickTypeRec: static_cast(container->getControlByID(BUTTON_SCOPECONTROL_REC))->setPressed(true); break; } } void Tracker::toggleJamMenuPianoSize() { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_LOWRES_JAMMENU)); ASSERT(container); PianoControl* pCtrl = static_cast(container->getControlByID(PIANO_CONTROL)); ASSERT(pCtrl); bool largePiano = (pCtrl->getxScale() == 6 && pCtrl->getyScale() == 3); PPButton* button = static_cast(container->getControlByID(BUTTON_JAMMENU_TOGGLEPIANOSIZE)); ASSERT(button); button->setText(largePiano ? TrackerConfig::stringButtonCollapsed : TrackerConfig::stringButtonExtended); if (largePiano) { container->setSize(PPSize(container->getSize().width, container->getSize().height - 25*2)); container->setLocation(PPPoint(container->getLocation().x, container->getLocation().y + 25*2)); pCtrl->setLocation(PPPoint(pCtrl->getLocation().x, pCtrl->getLocation().y + 25*2)); pCtrl->setxScale(3); pCtrl->setyScale(1); pCtrl->setSize(PPSize(screen->getWidth() - 4, 25*1+12)); getPatternEditorControl()->setSize(PPSize(getPatternEditorControl()->getSize().width, getPatternEditorControl()->getSize().height + 25*2)); } else { container->setSize(PPSize(container->getSize().width, container->getSize().height + 25*2)); container->setLocation(PPPoint(container->getLocation().x, container->getLocation().y - 25*2)); pCtrl->setLocation(PPPoint(pCtrl->getLocation().x, pCtrl->getLocation().y - 25*2)); pCtrl->setxScale(6); pCtrl->setyScale(3); pCtrl->setSize(PPSize(screen->getWidth() - 4, 25*3+12)); getPatternEditorControl()->setSize(PPSize(getPatternEditorControl()->getSize().width, getPatternEditorControl()->getSize().height - 25*2)); } screen->paint(); } void Tracker::flipInstrumentListBoxes() { PPContainer* ctrl = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); PPListBox* listBoxIns = static_cast(ctrl->getControlByID(LISTBOX_INSTRUMENTS)); PPListBox* listBoxSmp = static_cast(ctrl->getControlByID(LISTBOX_SAMPLES)); bool b = listBoxIns->isHidden(); PPPoint insPos = listBoxIns->getLocation(); PPSize insSize = listBoxIns->getSize(); PPPoint smpPos = listBoxSmp->getLocation(); PPSize smpSize = listBoxSmp->getSize(); listBoxSmp->setLocation(insPos); listBoxSmp->setSize(insSize); listBoxIns->setLocation(smpPos); listBoxIns->setSize(smpSize); listBoxSmp->hide(b); listBoxIns->hide(!b); ctrl->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER)->hide(b); ctrl->getControlByID(STATICTEXT_INSTRUMENTS_ALTERNATIVEHEADER2)->hide(b); ctrl->getControlByID(BUTTON_INSTRUMENT)->hide(!b); ctrl->getControlByID(STATICTEXT_SAMPLEHEADER)->hide(!b); ctrl->getControlByID(BUTTON_INSTRUMENTS_PLUS)->hide(!b); ctrl->getControlByID(BUTTON_INSTRUMENTS_MINUS)->hide(!b); screen->paintControl(ctrl); } #endif void Tracker::setModuleNumChannels(pp_uint32 numChannels) { moduleEditor->setNumChannels(numChannels); setNumChannels(numChannels); } pp_int32 Tracker::handleEvent(PPObject* sender, PPEvent* event) { char buffer[100]; if (event->getID() == eFileDragDropped) { if (screen->getModalControl()) return 0; const PPSystemString* str = *(reinterpret_cast(event->getDataPtr())); loadGenericFileType(*str); event->cancel(); } else if (event->getID() == eUpdateChanged) { updateWindowTitle(); } else if (event->getID() == eKeyDown || event->getID() == eKeyUp) { processShortcuts(event); } else if (event->getID() == eTimer) { doFollowSong(); } #ifndef __LOWRES__ else if (event->getID() == eLMouseDown) { PPPoint* p = (PPPoint*)event->getDataPtr(); caughtMouseInUpperLeftCorner = (p->x <= TrackerConfig::trackerExitBounds.x && p->y <= TrackerConfig::trackerExitBounds.y) ? true : false; if (caughtMouseInUpperLeftCorner) event->cancel(); } else if (event->getID() == eLMouseUp) { PPPoint* p = (PPPoint*)event->getDataPtr(); if ((p->x <= TrackerConfig::trackerExitBounds.x && p->y <= TrackerConfig::trackerExitBounds.y) && caughtMouseInUpperLeftCorner) { event->cancel(); eventKeyDownBinding_ExitApplication(); } else caughtMouseInUpperLeftCorner = false; } #endif else if (event->getID() == eCommand || event->getID() == eCommandRepeat) { switch (reinterpret_cast(sender)->getID()) { // test /*case BUTTON_MENU_ITEM_0+8: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionHDRecorder(); break; }*/ case BUTTON_INSTRUMENT: { if (event->getID() != eCommand) break; enableInstrument(!getPatternEditorControl()->isInstrumentEnabled()); break; } case STATICTEXT_ABOUT_HEADING: { if (event->getID() != eCommand) break; TitlePageManager titlePageManager(*screen); titlePageManager.setPeakControlHeadingColor(PPUIConfig::getInstance()->getColor(PPUIConfig::ColorStaticText)); break; } case BUTTON_ABOUT_SHOWTITLE: { if (event->getID() != eCommand) break; TitlePageManager titlePageManager(*screen); titlePageManager.showTitlePage(TitlePageManager::PageTitle); break; } case BUTTON_ABOUT_SHOWTIME: { if (event->getID() != eCommand) break; TitlePageManager titlePageManager(*screen); titlePageManager.showTitlePage(TitlePageManager::PageTime); break; } case BUTTON_ABOUT_ESTIMATESONGLENGTH: { if (event->getID() != eCommand) break; estimateSongLength(true); break; } case BUTTON_ABOUT_SHOWPEAK: { if (event->getID() != eCommand) break; TitlePageManager titlePageManager(*screen); titlePageManager.showTitlePage(TitlePageManager::PagePeak); break; } case BUTTON_ABOUT_FOLLOWSONG: { if (event->getID() != eCommand) break; eventKeyDownBinding_ToggleFollowSong(); break; } case BUTTON_ABOUT_PROSPECTIVE: { if (event->getID() != eCommand) break; eventKeyDownBinding_ToggleProspectiveMode(); break; } case BUTTON_ABOUT_WRAPCURSOR: { if (event->getID() != eCommand) break; eventKeyDownBinding_ToggleCursorWrapAround(); break; } case BUTTON_ABOUT_LIVESWITCH: { if (event->getID() != eCommand) break; eventKeyDownBinding_ToggleLiveSwitch(); break; } case BUTTON_ORDERLIST_EXTENT: { if (event->getID() != eCommand) break; expandOrderlist(!extendedOrderlist); screen->paintControl(screen->getControlByID(CONTAINER_ORDERLIST)); break; } case BUTTON_SPEEDCONTAINERFLIP: { if (event->getID() != eCommand) break; flipSpeedSection(); screen->paintControl(screen->getControlByID(CONTAINER_SPEED)); break; } #ifdef __LOWRES__ // -------- submenus ------------------------------ case BUTTON_APP_EXIT: if (event->getID() != eCommand) break; eventKeyDownBinding_ExitApplication(); break; case BUTTON_0: case BUTTON_1: case BUTTON_2: case BUTTON_3: case BUTTON_4: { if (event->getID() != eCommand) break; PPButton* button = reinterpret_cast(sender); sectionSwitcher->switchToSubMenu((SectionSwitcher::ActiveLowerSectionPages)(button->getID() - BUTTON_0)); break; } #endif // -------- generic message box ------------------- case PP_MESSAGEBOX_BUTTON_YES: case PP_MESSAGEBOX_BUTTON_NO: case PP_MESSAGEBOX_BUTTON_CANCEL: case PP_MESSAGEBOX_BUTTON_USER1: case PP_MESSAGEBOX_BUTTON_USER2: case PP_MESSAGEBOX_BUTTON_USER3: case PP_MESSAGEBOX_BUTTON_USER4: case PP_MESSAGEBOX_BUTTON_USER5: case PP_MESSAGEBOX_BUTTON_USER6: case PP_MESSAGEBOX_BUTTON_USER7: case PP_MESSAGEBOX_BUTTON_USER8: case PP_MESSAGEBOX_BUTTON_USER9: // little hack, user buttons below PP_MESSAGEBOX_BUTTON_USER10 // are not allowed to send repeatable pressed down events if (event->getID() != eCommand) break; case PP_MESSAGEBOX_BUTTON_USER10: case PP_MESSAGEBOX_BUTTON_USER11: case PP_MESSAGEBOX_BUTTON_USER12: case PP_MESSAGEBOX_BUTTON_USER13: case PP_MESSAGEBOX_BUTTON_USER14: case PP_MESSAGEBOX_BUTTON_USER15: { bool res = messageBoxEventListener(screen->getModalControl()->getID(), reinterpret_cast(sender)->getID()); if (res) screen->setModalControl(NULL); // repaints break; } case MAINMENU_PLAY_SONG: playerLogic->playSong(); break; case MAINMENU_PLAY_PATTERN: playerLogic->playPattern(); break; case MAINMENU_PLAY_POSITION: playerLogic->playPosition(); break; case MAINMENU_STOP: playerLogic->stopSong(); break; // -------- ZAP message box --------------------- case MAINMENU_ZAP: if (event->getID() != eCommand) break; if (dialog) delete dialog; if (responder) delete responder; responder = new ZapHandler(Zapper(*this)); dialog = new DialogZap(screen, responder, PP_DEFAULT_ID); dialog->show(); break; // open song case MAINMENU_LOAD: { if (event->getID() != eCommand) break; eventKeyDownBinding_Open(); break; } case MAINMENU_SAVE: { if (event->getID() != eCommand) break; eventKeyDownBinding_Save(); break; } case MAINMENU_SAVEAS: { if (event->getID() != eCommand) break; eventKeyDownBinding_SaveAs(); break; } // disk op case MAINMENU_DISKMENU: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionDiskMenu(); break; } // Only Fasttracker II editing mode: // Edit button case MAINMENU_EDIT: { if (event->getID() != eCommand) break; switch (editMode) { case EditModeFastTracker: eventKeyDownBinding_ToggleFT2Edit(); break; case EditModeMilkyTracker: eventKeyDownBinding_Edit(); break; } break; } // instrument editor case MAINMENU_INSEDIT: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionInstruments(); break; } case BUTTON_INSTRUMENTEDITOR_EXIT: case BUTTON_SAMPLEEDITOR_EXIT: { if (event->getID() != eCommand) break; sectionSwitcher->showBottomSection(SectionSwitcher::ActiveBottomSectionNone); screen->paint(true, true); break; } // sample editor case MAINMENU_SMPEDIT: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionSamples(); break; } // settings case MAINMENU_ADVEDIT: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionAdvancedEdit(); break; } // transpose case MAINMENU_TRANSPOSE: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionTranspose(); break; } // settings case MAINMENU_CONFIG: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionSettings(); break; } // quick options case MAINMENU_QUICKOPTIONS: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionQuickOptions(); break; } // optimize case MAINMENU_OPTIMIZE: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionOptimize(); break; } case MAINMENU_ABOUT: { if (event->getID() != eCommand) break; eventKeyDownBinding_InvokeSectionAbout(); break; } #ifdef __LOWRES__ case BUTTON_SAMPLES_INVOKEHDRECORDER: { if (event->getID() != eCommand) break; // The bottom section fills up the entire screen // so we first need to hide the entire section before we can show // the HD recorder section screen->pauseUpdate(true); sectionSwitcher->hideBottomSection(); sectionHDRecorder->selectSampleOutput(); eventKeyDownBinding_InvokeSectionHDRecorder(); screen->pauseUpdate(false); screen->paint(); break; } #endif case BUTTON_ORDERLIST_SONGLENGTH_PLUS: moduleEditor->increaseSongLength(); updateSongLength(); sectionHDRecorder->adjustOrders(); break; case BUTTON_ORDERLIST_SONGLENGTH_MINUS: moduleEditor->decreaseSongLength(); updateSongLength(); sectionHDRecorder->adjustOrders(); break; case BUTTON_ORDERLIST_REPEAT_PLUS: moduleEditor->increaseRepeatPos(); updateSongRepeat(); break; case BUTTON_ORDERLIST_REPEAT_MINUS: moduleEditor->decreaseRepeatPos(); updateSongRepeat(); break; // insert position into orderlist case BUTTON_ORDERLIST_INSERT: moduleEditor->insertNewOrderPosition(getOrderListBoxIndex()); updateOrderlist(); sectionHDRecorder->adjustOrders(); playerLogic->continuePlayingSong(); break; // delete current orderlist position case BUTTON_ORDERLIST_DELETE: moduleEditor->deleteOrderPosition(getOrderListBoxIndex()); updateOrderlist(); sectionHDRecorder->adjustOrders(); playerLogic->continuePlayingSong(); break; // insert position into orderlist case BUTTON_ORDERLIST_SEQENTRY: { moduleEditor->seqCurrentOrderPosition(getOrderListBoxIndex()); updateSongLength(false); pp_int32 index = getOrderListBoxIndex()+1; setOrderListIndex(index); sectionHDRecorder->adjustOrders(); playerLogic->continuePlayingSong(); break; } // insert position into orderlist and clone the current selected pattern case BUTTON_ORDERLIST_CLNENTRY: { moduleEditor->seqCurrentOrderPosition(getOrderListBoxIndex(), true); updateSongLength(false); pp_int32 index = getOrderListBoxIndex()+1; setOrderListIndex(index); sectionHDRecorder->adjustOrders(); playerLogic->continuePlayingSong(); break; } // select next pattern in current orderlist position case BUTTON_ORDERLIST_NEXT: moduleEditor->increaseOrderPosition(getOrderListBoxIndex()); updateOrderlist(); playerLogic->continuePlayingSong(); break; // select previous pattern in current orderlist position case BUTTON_ORDERLIST_PREVIOUS: moduleEditor->decreaseOrderPosition(getOrderListBoxIndex()); updateOrderlist(); playerLogic->continuePlayingSong(); break; case BUTTON_OCTAVE_MINUS: getPatternEditor()->decreaseCurrentOctave(); updatePatternAddAndOctave(); break; case BUTTON_OCTAVE_PLUS: getPatternEditor()->increaseCurrentOctave(); updatePatternAddAndOctave(); break; case BUTTON_ADD_PLUS: getPatternEditorControl()->increaseRowInsertAdd(); updatePatternAddAndOctave(); break; case BUTTON_ADD_MINUS: getPatternEditorControl()->decreaseRowInsertAdd(); updatePatternAddAndOctave(); break; case BUTTON_BPM_PLUS: { setChanged(); mp_sint32 bpm,speed; playerController->getSpeed(bpm, speed); playerController->setSpeed(bpm+1, speed); updateSpeed(); break; } case BUTTON_BPM_MINUS: { setChanged(); mp_sint32 bpm,speed; playerController->getSpeed(bpm, speed); playerController->setSpeed(bpm-1, speed); updateSpeed(); break; } case BUTTON_SPEED_PLUS: { setChanged(); mp_sint32 bpm,speed; playerController->getSpeed(bpm, speed); playerController->setSpeed(bpm, speed+1); updateSpeed(); break; } case BUTTON_SPEED_MINUS: { setChanged(); mp_sint32 bpm,speed; playerController->getSpeed(bpm, speed); playerController->setSpeed(bpm, speed-1); updateSpeed(); break; } // go to next pattern case BUTTON_PATTERN_PLUS: eventKeyDownBinding_NextPattern(); break; // go to previous pattern case BUTTON_PATTERN_MINUS: eventKeyDownBinding_PreviousPattern(); break; // expand current pattern case BUTTON_PATTERN_EXPAND: getPatternEditor()->expandPattern(); updatePatternLength(false); screen->update(); break; // shrink current pattern case BUTTON_PATTERN_SHRINK: getPatternEditor()->shrinkPattern(); updatePatternLength(false); screen->update(); break; // grow length case BUTTON_PATTERN_SIZE_PLUS: getPatternEditor()->resizePattern(moduleEditor->getPattern(moduleEditor->getCurrentPatternIndex())->rows + 1); updatePatternLength(false); screen->update(); break; // decrease length case BUTTON_PATTERN_SIZE_MINUS: getPatternEditor()->resizePattern(moduleEditor->getPattern(moduleEditor->getCurrentPatternIndex())->rows - 1); updatePatternLength(false); screen->update(); break; #ifdef __LOWRES__ // go to next order case BUTTON_JAMMENU_NEXTORDERLIST: selectNextOrder(); break; // go to previous order case BUTTON_JAMMENU_PREVORDERLIST: selectPreviousOrder(); break; case BUTTON_JAMMENU_NEXTINSTRUMENT: selectNextInstrument(); break; case BUTTON_JAMMENU_PREVINSTRUMENT: selectPreviousInstrument(); break; case BUTTON_JAMMENU_TOGGLEPIANOSIZE: if (event->getID() != eCommand) break; toggleJamMenuPianoSize(); break; case BUTTON_INSTRUMENTS_FLIP: if (event->getID() != eCommand) break; flipInstrumentListBoxes(); break; #endif // add channels to song (affects pattern editor) case BUTTON_MENU_ITEM_ADDCHANNELS: case BUTTON_MENU_ITEM_SUBCHANNELS: { mp_sint32 numChannels = moduleEditor->getNumChannels() + (reinterpret_cast(sender)->getID() == BUTTON_MENU_ITEM_ADDCHANNELS ? 2 : -2); if (numChannels > TrackerConfig::numPlayerChannels) numChannels = TrackerConfig::numPlayerChannels; if (numChannels < 2) numChannels = 2; setModuleNumChannels(numChannels); break; } case BUTTON_INSTRUMENTS_PLUS: moduleEditor->allocateInstrument(); updateInstrumentsListBox(false); sectionInstruments->update(false); screen->update(); break; case BUTTON_INSTRUMENTS_MINUS: { pp_uint32 i = listBoxInstruments->getSelectedIndex(); moduleEditor->freeInstrument(); updateInstrumentsListBox(false); if (listBoxInstruments->getSelectedIndex() != i) { getPatternEditorControl()->setCurrentInstrument(listBoxInstruments->getSelectedIndex() + 1); updateSampleEditorAndInstrumentSection(false); } screen->update(); break; } case BUTTON_TAB_OPEN: { eventKeyDownBinding_OpenTab(); break; } case BUTTON_TAB_CLOSE: { eventKeyDownBinding_CloseTab(); break; } #ifdef __LOWRES__ case BUTTON_SCOPECONTROL_MUTE: if (event->getID() != eCommand) break; selectScopesControl(ScopesControl::ClickTypeMute); break; case BUTTON_SCOPECONTROL_SOLO: if (event->getID() != eCommand) break; selectScopesControl(ScopesControl::ClickTypeSolo); break; case BUTTON_SCOPECONTROL_REC: if (event->getID() != eCommand) break; selectScopesControl(ScopesControl::ClickTypeRec); break; #endif } // Check if something has changed updateWindowTitle(); } else if (event->getID() == ePreSelection) { switch (reinterpret_cast(sender)->getID()) { // new instrument has been selected, we need to assure // that the sample changes are committed before we wipe out // the current sample listbox data case LISTBOX_INSTRUMENTS: if (listBoxSamples->isEditing()) listBoxSamples->commitChanges(); break; } } else if (event->getID() == eSelection) { switch (reinterpret_cast(sender)->getID()) { case TABHEADER_CONTROL: { pp_int32 index = *((pp_int32*)event->getDataPtr()); tabManager->switchToTab(index); break; } // new pattern has been selected in the orderlist case LISTBOX_ORDERLIST: { pp_int32 orderIndex = *((pp_int32*)event->getDataPtr()); moduleEditor->setCurrentOrderIndex(orderIndex); moduleEditor->setCurrentPatternIndex(moduleEditor->getOrderPosition(orderIndex)); updatePatternEditorControl(false); updatePatternIndex(false); updatePatternLength(false); #ifdef __LOWRES__ updateJamMenuOrder(false); #endif screen->update(); playerLogic->continuePlayingSong(); break; } // new instrument has been selected case LISTBOX_INSTRUMENTS: { pp_int32 index = *((pp_int32*)event->getDataPtr()) + 1; selectInstrument(index); screen->update(); break; } case LISTBOX_SAMPLES: { pp_int32 index = *((pp_int32*)event->getDataPtr()); moduleEditor->setCurrentSampleIndex(index); updateSampleEditorAndInstrumentSection(false); for (pp_int32 i = 0; i < sections->size(); i++) sections->get(i)->notifySampleSelect(index); screen->update(); break; } // Instrument chooser case INSTRUMENT_CHOOSER_LIST_SRC3: case INSTRUMENT_CHOOSER_LIST_DST3: { PPContainer* container = static_cast(screen->getModalControl()); PPStaticText* staticText = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_USERSTR1)); PPListBox* listBoxChangeIns = NULL; PPListBox* listBoxChangeSmp = NULL; PPListBox* listBoxSrcIns = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC)); PPListBox* listBoxSrcSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC2)); PPListBox* listBoxDstIns = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST));; PPListBox* listBoxDstSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST2)); if (reinterpret_cast(sender)->getID() == INSTRUMENT_CHOOSER_LIST_SRC3) { listBoxChangeIns = listBoxSrcIns; listBoxChangeSmp = listBoxSrcSmp; } else if (reinterpret_cast(sender)->getID() == INSTRUMENT_CHOOSER_LIST_DST3) { listBoxChangeIns = listBoxDstIns; listBoxChangeSmp = listBoxDstSmp; } if (listBoxChangeIns && listBoxChangeSmp) { listBoxChangeIns->clear(); listBoxChangeSmp->clear(); fillInstrumentListBox(listBoxChangeIns, tabManager->getModuleEditorFromTabIndex((reinterpret_cast(sender))->getSelectedIndex())); fillSampleListBox(listBoxChangeSmp, listBoxChangeIns->getSelectedIndex(), tabManager->getModuleEditorFromTabIndex((reinterpret_cast(sender))->getSelectedIndex())); } // update text depending on the type of the instrument chooser dialog switch (container->getID()) { case INSTRUMENT_CHOOSER_COPY: sprintf(buffer, "Copy ins. %x to %x", listBoxSrcIns->getSelectedIndex()+1, listBoxDstIns->getSelectedIndex()+1); break; case INSTRUMENT_CHOOSER_SWAP: sprintf(buffer, "Swap ins. %x with %x", listBoxSrcSmp->getSelectedIndex()+1, listBoxDstSmp->getSelectedIndex()+1); break; } staticText->setText(buffer); screen->paintControl(screen->getModalControl()); break; } // Instrument chooser case INSTRUMENT_CHOOSER_LIST_SRC: case INSTRUMENT_CHOOSER_LIST_DST: { PPContainer* container = static_cast(screen->getModalControl()); PPStaticText* staticText = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_USERSTR1)); PPListBox* listBoxSrc = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC)); PPListBox* listBoxDst = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST)); PPListBox* listBoxSrcModule = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC3)); PPListBox* listBoxDstModule = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST3)); ModuleEditor* src = listBoxSrcModule ? tabManager->getModuleEditorFromTabIndex(listBoxSrcModule->getSelectedIndex()) : this->moduleEditor; ModuleEditor* dst = listBoxDstModule ? tabManager->getModuleEditorFromTabIndex(listBoxDstModule->getSelectedIndex()) : this->moduleEditor; PPListBox* listBoxChange = NULL; ModuleEditor* moduleEditor = this->moduleEditor; // A new instrument has been selected in either of the two instrument list boxes // now it's up to update the samples belonging to the instrument in the sample listboxes if (reinterpret_cast(sender)->getID() == INSTRUMENT_CHOOSER_LIST_SRC) { listBoxChange = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC2)); moduleEditor = src; } else if (reinterpret_cast(sender)->getID() == INSTRUMENT_CHOOSER_LIST_DST) { listBoxChange = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST2)); moduleEditor = dst; } if (listBoxChange) { listBoxChange->clear(); fillSampleListBox(listBoxChange, reinterpret_cast(sender)->getSelectedIndex(), moduleEditor); } // update text depending on the type of the instrument chooser dialog switch (container->getID()) { case INSTRUMENT_CHOOSER_COPY: sprintf(buffer, "Copy ins. %x to %x", listBoxSrc->getSelectedIndex()+1, listBoxDst->getSelectedIndex()+1); break; case INSTRUMENT_CHOOSER_SWAP: sprintf(buffer, "Swap ins. %x with %x", listBoxSrc->getSelectedIndex()+1, listBoxDst->getSelectedIndex()+1); break; case MESSAGEBOX_INSREMAP: sprintf(buffer, "Remap ins. %x to %x", listBoxSrc->getSelectedIndex()+1, listBoxDst->getSelectedIndex()+1); break; } staticText->setText(buffer); screen->paintControl(screen->getModalControl()); break; } case INSTRUMENT_CHOOSER_LIST_SRC2: case INSTRUMENT_CHOOSER_LIST_DST2: { PPContainer* container = static_cast(screen->getModalControl()); PPStaticText* staticText = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_USERSTR2)); PPListBox* listBoxSrc = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC2)); PPListBox* listBoxDst = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST2)); switch (container->getID()) { case INSTRUMENT_CHOOSER_COPY: sprintf(buffer, "Copy smp. %x to %x", listBoxSrc->getSelectedIndex(), listBoxDst->getSelectedIndex()); break; case INSTRUMENT_CHOOSER_SWAP: sprintf(buffer, "Swap smp. %x with %x", listBoxSrc->getSelectedIndex(), listBoxDst->getSelectedIndex()); break; } staticText->setText(buffer); screen->paintControl(screen->getModalControl()); break; } } } else if (event->getID() == eValueChanged) { switch (reinterpret_cast(sender)->getID()) { case LISTBOX_SONGTITLE: { moduleEditor->setTitle(**(reinterpret_cast(event->getDataPtr())), ModuleEditor::MAX_TITLETEXT); break; } case LISTBOX_INSTRUMENTS: { moduleEditor->setInstrumentName(listBoxInstruments->getSelectedIndex(), **(reinterpret_cast(event->getDataPtr())), ModuleEditor::MAX_INSTEXT); break; } case LISTBOX_SAMPLES: { moduleEditor->setCurrentSampleName(**(reinterpret_cast(event->getDataPtr())), ModuleEditor::MAX_SMPTEXT); break; } // channels have been muted/unmuted in pattern editor case PATTERN_EDITOR: { const pp_uint8* muteChannelsPtr = reinterpret_cast(event->getDataPtr()); for (pp_int32 i = 0; i < TrackerConfig::numPlayerChannels; i++) { muteChannels[i] = muteChannelsPtr[i]; bool b = (muteChannels[i] != 0); playerController->muteChannel(i, b); scopesControl->muteChannel(i, b); } if (scopesControl->needsUpdate()) screen->paintControl(scopesControl); break; } // channels have been muted/unmuted in scopes case SCOPES_CONTROL: { switch (event->getMetaData()) { case ScopesControl::ChangeValueMuting: { const pp_uint8* muteChannelsPtr = reinterpret_cast(event->getDataPtr()); for (pp_int32 i = 0; i < TrackerConfig::numPlayerChannels; i++) { muteChannels[i] = muteChannelsPtr[i]; bool b = (muteChannels[i] != 0); playerController->muteChannel(i, b); getPatternEditorControl()->muteChannel(i, b); } if (scopesControl->needsUpdate()) screen->paintControl(scopesControl, false); screen->paintControl(getPatternEditorControl(), false); screen->update(); break; } case ScopesControl::ChangeValueRecording: { const pp_uint8* recordChannelsPtr = reinterpret_cast(event->getDataPtr()); for (pp_int32 i = 0; i < TrackerConfig::numPlayerChannels; i++) { bool b = (recordChannelsPtr[i] != 0); playerController->recordChannel(i, b); getPatternEditorControl()->recordChannel(i, b); } playerController->resetFirstPlayingChannel(); if (scopesControl->needsUpdate()) screen->paintControl(scopesControl, false); screen->update(); break; } } break; } } // Check if something has changed updateWindowTitle(); } else if (event->getID() == eUpdated) { PatternEditorControl* patternEditorControl = reinterpret_cast(sender); PatternEditor* patternEditor = patternEditorControl->getPatternEditor(); pp_int32 numRows = patternEditor->getNumRows(); pp_int32 row = patternEditorControl->getCurrentRow(); bool isPlaying = playerController->isPlaying() && !playerController->isPlayingRowOnly(); switch (reinterpret_cast(sender)->getID()) { // The pattern editor sends PPEvent::eUpated when the cursor has been moved // It can either be moved out of the current pattern or within the pattern // Depending on what the user data says case PATTERN_EDITOR: { switch (*(pp_int32*)event->getDataPtr()) { case PatternEditorControl::AdvanceCodeJustUpdate: updatePatternLength(); updatePatternAddAndOctave(); break; // End of pattern has been wrapped with cursor down case PatternEditorControl::AdvanceCodeCursorDownWrappedEnd: { bool b = isEditingCurrentOrderlistPattern() && listBoxOrderList->isLastEntry(); // When we're playing and we're not playing a pattern // OR when we're not playing and NOT wrapping cursor around // => select next order from orderlist if ((isPlaying && !playerController->isReallyPlayingPattern()) || (playerController->isPlaying() && playerController->isPlayingPattern() && playerLogic->rowPlay) || (!isPlaying && !patternEditorControl->getWrapAround())) { // we're editing the pattern from the current selected order and this is not the last order list entry // advance to the next order in the list if (!b) { screen->pauseUpdate(true); selectNextOrder(); screen->pauseUpdate(false); } } // Calculate new position within pattern and update player position ASSERT(row > 0); // when we're in wraparound mode and we're not in the last // pattern & row of the last order, wrap around cursor in current pattern if (!b || patternEditorControl->getWrapAround()) patternEditorControl->setRow(myMod(row - numRows, patternEditor->getNumRows()), false); else patternEditorControl->setRow(numRows-1, false); updateSongLength(true); updatePatternIndex(true); updatePatternLength(true); updateSongRow(); return 1; } // Start of pattern has been wrapped with cursor up case PatternEditorControl::AdvanceCodeCursorUpWrappedStart: { bool b = isEditingCurrentOrderlistPattern() && listBoxOrderList->isFirstEntry(); // When we're playing and we're not playing a pattern // OR when we're not playing and NOT wrapping cursor around // => select previous order from orderlist if ((isPlaying && !playerController->isReallyPlayingPattern()) || (playerController->isPlaying() && playerController->isPlayingPattern() && playerLogic->rowPlay) || (!isPlaying && !patternEditorControl->getWrapAround())) { // we're editing the pattern from the current selected order and this is not the last order list entry // advance to the previous order in the list if (!b) { screen->pauseUpdate(true); selectPreviousOrder(); screen->pauseUpdate(false); } } // Calculate new position within pattern and update player position ASSERT(row < 0); // when we're in wraparound mode and we're not in the last // pattern & row of the last order, wrap around cursor in current pattern if (!b || patternEditorControl->getWrapAround()) patternEditorControl->setRow(myMod(patternEditor->getNumRows() + row, patternEditor->getNumRows()), false); else patternEditorControl->setRow(0, false); updateSongLength(true); updatePatternIndex(true); updatePatternLength(true); updateSongRow(); return 1; } // End of pattern has been wrapped with page down key case PatternEditorControl::AdvanceCodeCursorPageDownWrappedEnd: // Not playing? Do nothing at all if (!playerController->isPlaying()/* && !patternEditor->getWrapAround()*/) return 0; // Last entry in orderlist? Do nothing at all //if (listBoxOrderList->isLastEntry()) // return 0; // Not playing pattern? Select new order if (!playerController->isReallyPlayingPattern()) { screen->pauseUpdate(true); selectNextOrder(true); screen->pauseUpdate(false); } // Calculate new position within pattern and update player position ASSERT(row > 0); patternEditorControl->setRow(myMod(row - numRows, patternEditor->getNumRows()), false); updateSongLength(true); updatePatternIndex(true); updatePatternLength(true); updateSongRow(); return 1; // Start of pattern has been wrapped with page up key case PatternEditorControl::AdvanceCodeCursorPageUpWrappedStart: // Not playing? Do nothing at all if (!playerController->isPlaying()/* && !patternEditor->getWrapAround()*/) return 0; // Last entry in orderlist? Do nothing at all //if (listBoxOrderList->isFirstEntry()) // return 0; // Not playing pattern? Select previous order if (!playerController->isReallyPlayingPattern()) { screen->pauseUpdate(true); selectPreviousOrder(true); screen->pauseUpdate(false); } // Calculate new position within pattern and update player position ASSERT(row < 0); patternEditorControl->setRow(myMod(patternEditor->getNumRows() + row, patternEditor->getNumRows()), false); updateSongLength(true); updatePatternIndex(true); updatePatternLength(true); updateSongRow(); return 1; // End of pattern has been wrapped with page down key case PatternEditorControl::AdvanceCodeWrappedEnd: if (!patternEditorControl->getWrapAround() && !listBoxOrderList->isLastEntry()) { screen->pauseUpdate(true); selectNextOrder(true); screen->pauseUpdate(false); patternEditorControl->setRow(myMod(row - numRows, patternEditor->getNumRows()), false); } // if we are in the last order of the order list and in the last row of this order don't advance to the next pattern else if (!patternEditorControl->getWrapAround() && listBoxOrderList->isLastEntry()) { patternEditorControl->setRow(numRows - 1, false); } else { // Calculate new position within pattern and update player position ASSERT(row > 0); patternEditorControl->setRow(myMod(row - numRows, patternEditor->getNumRows()), false); } updateSongLength(true); updatePatternIndex(true); updatePatternLength(true); updateSongRow(); return 1; // Not wrapped at all... Just calculate new position within pattern and update player position case PatternEditorControl::AdvanceCodeSelectNewRow: if (shouldFollowSong() && isEditingCurrentOrderlistPattern()) updateSongRow(); break; } break; } } } // frontend layer sends PPEvent::eFullScreen when the APP is going fullscreen else if (event->getID() == eFullScreen) { TrackerSettingsDatabase* settingsDatabaseCopySecond = new TrackerSettingsDatabase(*settingsDatabase); if (settingsDatabaseCopy) settingsDatabaseCopy->store("FULLSCREEN", !screen->isFullScreen()); settingsDatabaseCopySecond->store("FULLSCREEN", !screen->isFullScreen()); applySettings(settingsDatabaseCopySecond, settingsDatabase); delete settingsDatabase; settingsDatabase = settingsDatabaseCopySecond; sectionSettings->update(); } return 0; } /////////////////////////////////////////////////////////////////////////////// // remember: // user buttons below ID PP_MESSAGEBOX_BUTTON_USER10 // are not allowed to send repeatable pressed down events /////////////////////////////////////////////////////////////////////////////// bool Tracker::swapAndCopyHandler(pp_int32 messageBoxID, pp_int32 messageBoxButtonID) { PPContainer* container = static_cast(screen->getModalControl()); PPListBox* listBoxSrc = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC)); PPListBox* listBoxSrcModule = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC3)); PPListBox* listBoxDst = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST)); PPListBox* listBoxDstModule = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST3)); ModuleEditor* src = listBoxSrcModule ? tabManager->getModuleEditorFromTabIndex(listBoxSrcModule->getSelectedIndex()) : this->moduleEditor; ModuleEditor* dst = listBoxDstModule ? tabManager->getModuleEditorFromTabIndex(listBoxDstModule->getSelectedIndex()) : this->moduleEditor; switch (messageBoxButtonID) { case PP_MESSAGEBOX_BUTTON_USER1: case PP_MESSAGEBOX_BUTTON_USER3: { switch (messageBoxID) { case INSTRUMENT_CHOOSER_COPY: this->moduleEditor->copyInstrument(*dst, listBoxDst->getSelectedIndex(), *src, listBoxSrc->getSelectedIndex()); break; case INSTRUMENT_CHOOSER_SWAP: this->moduleEditor->swapInstruments(*dst, listBoxDst->getSelectedIndex(), *src, listBoxSrc->getSelectedIndex()); break; default: ASSERT(false); } if (messageBoxButtonID == PP_MESSAGEBOX_BUTTON_USER3) { pp_int32 index = listBoxDst->getSelectedIndex()+1; listBoxDst->setSelectedIndex(index, false, true); index = listBoxSrc->getSelectedIndex()+1; listBoxSrc->setSelectedIndex(index, false, true); } break; } case PP_MESSAGEBOX_BUTTON_USER2: case PP_MESSAGEBOX_BUTTON_USER4: { PPListBox* listBoxSrcSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC2)); PPListBox* listBoxDstSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST2)); switch (messageBoxID) { case INSTRUMENT_CHOOSER_COPY: this->moduleEditor->copySample(*dst, listBoxDst->getSelectedIndex(), listBoxDstSmp->getSelectedIndex(), *src, listBoxSrc->getSelectedIndex(), listBoxSrcSmp->getSelectedIndex()); break; case INSTRUMENT_CHOOSER_SWAP: this->moduleEditor->swapSamples(*dst, listBoxDst->getSelectedIndex(), listBoxDstSmp->getSelectedIndex(), *src, listBoxSrc->getSelectedIndex(), listBoxSrcSmp->getSelectedIndex()); break; default: ASSERT(false); } if (messageBoxButtonID == PP_MESSAGEBOX_BUTTON_USER4) { pp_int32 index = listBoxDstSmp->getSelectedIndex()+1; listBoxDstSmp->setSelectedIndex(index, false, true); index = listBoxSrcSmp->getSelectedIndex()+1; listBoxSrcSmp->setSelectedIndex(index, false, true); } break; } // swap source/destination list boxes case PP_MESSAGEBOX_BUTTON_USER5: { if (listBoxSrcModule == NULL || listBoxDstModule == NULL) return true; PPListBox* listBoxSrcSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC2)); PPListBox* listBoxDstSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST2)); pp_int32 srcModIndex = listBoxSrcModule->getSelectedIndex(); pp_int32 dstModIndex = listBoxDstModule->getSelectedIndex(); pp_int32 srcInsIndex = listBoxSrc->getSelectedIndex(); pp_int32 dstInsIndex = listBoxDst->getSelectedIndex(); pp_int32 srcSmpIndex = listBoxSrcSmp->getSelectedIndex(); pp_int32 dstSmpIndex = listBoxDstSmp->getSelectedIndex(); listBoxSrcModule->setSelectedIndex(dstModIndex, false); listBoxDstModule->setSelectedIndex(srcModIndex, false); updateInstrumentChooser(false); listBoxSrc->setSelectedIndex(dstInsIndex, false); listBoxDst->setSelectedIndex(srcInsIndex, false); listBoxSrcSmp->setSelectedIndex(dstSmpIndex, false); listBoxDstSmp->setSelectedIndex(srcSmpIndex, false); updateInstrumentChooser(true); screen->paint(); return true; } // one more instrument in the source module case PP_MESSAGEBOX_BUTTON_USER10: { src->allocateInstrument(); break; } // delete one instrument in the source module case PP_MESSAGEBOX_BUTTON_USER11: { src->freeInstrument(); break; } // one more instrument in the destination module case PP_MESSAGEBOX_BUTTON_USER12: { dst->allocateInstrument(); break; } // delete one instrument in the destination module case PP_MESSAGEBOX_BUTTON_USER13: { dst->freeInstrument(); break; } case PP_MESSAGEBOX_BUTTON_USER6: { // play source SamplePlayer samplePlayer(*src, *playerController); PPListBox* listBoxSrcSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC2)); samplePlayer.playSample(listBoxSrc->getSelectedIndex(), listBoxSrcSmp->getSelectedIndex(), sectionSamples->getCurrentSamplePlayNote()); return true; } case PP_MESSAGEBOX_BUTTON_USER7: { // play dest SamplePlayer samplePlayer(*dst, *playerController); PPListBox* listBoxDstSmp = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST2)); samplePlayer.playSample(listBoxDst->getSelectedIndex(), listBoxDstSmp->getSelectedIndex(), sectionSamples->getCurrentSamplePlayNote()); return true; } default: return false; } updateInstrumentChooser(false); if (listBoxInstruments->getSelectedIndex() == listBoxDst->getSelectedIndex() && dst == this->moduleEditor) { updateInstrumentsListBox(false); sectionInstruments->resetEnvelopeEditor(); sectionSamples->resetSampleEditor(); } PPButton* button = static_cast(container->getControlByID(PP_MESSAGEBOX_BUTTON_CANCEL)); button->setText("Done"); sectionSamples->updateAfterLoad(); screen->paint(); return true; } void Tracker::handleQuit() { if (sectionSettings->isVisible()) sectionSettings->cancelSettings(); screen->shutDown(); } bool Tracker::messageBoxEventListener(pp_int32 messageBoxID, pp_int32 messageBoxButtonID) { switch (messageBoxID) { case MESSAGEBOX_REALLYQUIT: { if (messageBoxButtonID == PP_MESSAGEBOX_BUTTON_YES) { handleQuit(); } break; } case INSTRUMENT_CHOOSER_COPY: case INSTRUMENT_CHOOSER_SWAP: { if (swapAndCopyHandler(messageBoxID, messageBoxButtonID)) return false; break; } case MESSAGEBOX_INSREMAP: { switch (messageBoxButtonID) { case PP_MESSAGEBOX_BUTTON_USER1: case PP_MESSAGEBOX_BUTTON_USER2: case PP_MESSAGEBOX_BUTTON_USER3: case PP_MESSAGEBOX_BUTTON_USER4: { PPContainer* container = static_cast(screen->getModalControl()); PPListBox* listBoxSrc = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_SRC)); PPListBox* listBoxDst = static_cast(container->getControlByID(INSTRUMENT_CHOOSER_LIST_DST)); pp_int32 newIns = listBoxDst->getSelectedIndex()+1; pp_int32 oldIns = listBoxSrc->getSelectedIndex()+1; pp_int32 res = 0; switch (messageBoxButtonID) { case PP_MESSAGEBOX_BUTTON_USER1: res = getPatternEditor()->insRemapTrack(oldIns, newIns); break; case PP_MESSAGEBOX_BUTTON_USER2: res = getPatternEditor()->insRemapPattern(oldIns, newIns); break; case PP_MESSAGEBOX_BUTTON_USER3: res = moduleEditor->insRemapSong(oldIns, newIns); break; case PP_MESSAGEBOX_BUTTON_USER4: res = getPatternEditor()->insRemapSelection(oldIns, newIns); break; } char buffer[100]; sprintf(buffer, "%i Instruments have been remapped", res); showMessageBox(MESSAGEBOX_UNIVERSAL, buffer, MessageBox_OK); screen->paint(); return false; } } break; } } return true; } /////////////////////////////////////////////////////////// // check if editing of any textfield is currently // performed, if so we are not allowed to play instruments /////////////////////////////////////////////////////////// bool Tracker::isActiveEditing() { // check for focus of song title edit field PPContainer* container = static_cast(screen->getControlByID(CONTAINER_ABOUT)); PPListBox* listBox = static_cast(container->getControlByID(LISTBOX_SONGTITLE)); if (screen->hasFocus(container) && listBox->isEditing()) return true; container = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); listBox = listBoxInstruments; if (screen->hasFocus(container) && listBox->isEditing()) return true; container = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); listBox = listBoxSamples; if (screen->hasFocus(container) && listBox->isEditing()) return true; if (sectionDiskMenu->isActiveEditing()) return true; return false; } void Tracker::ensureSongStopped(bool bResetMainVolume, bool suspend) { updatePianoControl(sectionInstruments->getPianoControl()); #ifdef __LOWRES__ { PianoControl* pianoControl = static_cast(inputContainerCurrent->getControlByID(PIANO_CONTROL)); updatePianoControl(pianoControl); } #endif playerLogic->ensureSongStopped(bResetMainVolume, suspend); } void Tracker::ensureSongPlaying(bool continuePlaying) { playerLogic->ensureSongPlaying(continuePlaying); } void Tracker::initPlayback() { resetStateMemories(); playerController->resetPlayTimeCounter(); recorderLogic->init(); } void Tracker::setChanged() { moduleEditor->setChanged(); updateWindowTitle(); } bool Tracker::shouldFollowSong() { if (playerController->getNextOrderToPlay() != -1 || playerController->getNextPatternToPlay() != -1) return false; return getFollowSong(); } bool Tracker::getFollowSong() { return followSong; } void Tracker::setFollowSong(bool b, bool repaint/* = true*/) { followSong = b; updateAboutToggleButton(BUTTON_ABOUT_FOLLOWSONG, b, repaint); } bool Tracker::getProspectiveMode() { return getPatternEditorControl()->getProspective(); } void Tracker::setProspectiveMode(bool b, bool repaint/* = true*/) { getPatternEditorControl()->setProspective(b); updateAboutToggleButton(BUTTON_ABOUT_PROSPECTIVE, b, repaint); } bool Tracker::getCursorWrapAround() { return getPatternEditorControl()->getWrapAround(); } void Tracker::setCursorWrapAround(bool b, bool repaint/* = true*/) { getPatternEditorControl()->setWrapAround(b); updateAboutToggleButton(BUTTON_ABOUT_WRAPCURSOR, b, repaint); } void Tracker::setLiveSwitch(bool b, bool repaint/* = true*/) { playerLogic->setLiveSwitch(b); updateAboutToggleButton(BUTTON_ABOUT_LIVESWITCH, b, repaint); } void Tracker::updateSongRow(bool checkFollowSong/* = true*/) { if (checkFollowSong && !shouldFollowSong()) return; mp_sint32 row = getPatternEditorControl()->getCurrentRow(); mp_sint32 pos = listBoxOrderList->getSelectedIndex(); playerController->setPatternPos(pos, row); } void Tracker::selectInstrument(pp_int32 instrument) { // instrument index starts at 0 in the module editor // but from 1 everywhere else moduleEditor->setCurrentInstrumentIndex(instrument-1); getPatternEditorControl()->setCurrentInstrument(instrument); sectionTranspose->setCurrentInstrument(instrument, false); updateSamplesListBox(false); // update instrument/sample editor // important: sample editor first => will reload sample into sample editor updateSampleEditor(false); // update instrument/sample editor sectionInstruments->update(false); for (pp_int32 i = 0; i < sections->size(); i++) sections->get(i)->notifyInstrumentSelect(instrument); } void Tracker::fillInstrumentListBox(PPListBox* listBox, ModuleEditor* moduleEditor/* = NULL*/) { if (moduleEditor == NULL) moduleEditor = this->moduleEditor; char name[MP_MAXTEXT]; for (pp_int32 j = 0; j < moduleEditor->getNumInstruments(); j++) { memset(name, 0, sizeof(name)); moduleEditor->getInstrumentName(j, name, ModuleEditor::MAX_INSTEXT); listBox->addItem(name); } } void Tracker::fillSampleListBox(PPListBox* listBox, pp_int32 insIndex, ModuleEditor* moduleEditor/* = NULL*/) { if (moduleEditor == NULL) moduleEditor = this->moduleEditor; for (pp_int32 j = 0; j < moduleEditor->getNumSamples(insIndex); j++) { char name[MP_MAXTEXT]; moduleEditor->getSampleName(insIndex, j, name, ModuleEditor::MAX_SMPTEXT); listBox->addItem(name); } } void Tracker::fillModuleListBox(PPListBox* listBox) { #ifndef __LOWRES__ TabHeaderControl* tabHeader = static_cast(screen->getControlByID(TABHEADER_CONTROL)); for (pp_int32 i = 0; i < (signed)tabHeader->getNumTabs(); i++) { TabTitleProvider tabTitleProvider(*tabManager->getModuleEditorFromTabIndex(i)); listBox->addItem(tabTitleProvider.getTabTitle()); } #endif } void Tracker::rearrangePatternEditorControl() { #ifdef __LOWRES__ PatternEditorControl* control = getPatternEditorControl(); if (control) { PPPoint location = control->getLocation(); pp_int32 height = inputContainerCurrent->getLocation().y; control->setSize(PPSize(screen->getWidth(), height - location.y)); if (inputContainerCurrent) inputContainerCurrent->show(true); } #endif } void Tracker::rearrangePatternEditorControlOrInstrumentContainer() { if (sectionDiskMenu->isDiskMenuVisible()) sectionDiskMenu->resizeInstrumentContainer(); else rearrangePatternEditorControl(); } void Tracker::showScopes(bool visible, pp_uint32 style) { if (!scopesControl) return; scopesControl->setAppearance((ScopesControl::AppearanceTypes)style); #ifndef __LOWRES__ if (visible && scopesControl->isVisible()) return; if (!visible && !scopesControl->isVisible()) return; PPSize size = getPatternEditorControl()->getSize(); PPPoint location = getPatternEditorControl()->getLocation(); if (visible) { scopesControl->hide(false); size.height -= scopesControl->getSize().height; location.y += scopesControl->getSize().height; getPatternEditorControl()->setSize(size); getPatternEditorControl()->setLocation(location); } else { scopesControl->hide(true); size.height += scopesControl->getSize().height; location.y -= scopesControl->getSize().height; getPatternEditorControl()->setSize(size); getPatternEditorControl()->setLocation(location); } // store settings settingsDatabase->store("SCOPES", (visible ? 1 : 0) | (style << 1)); // if config menu is visible, update the toggles if (sectionSettings->isVisible()) sectionSettings->update(false); #endif screen->paint(); } void Tracker::setInputControl(SIPs sip) { switch (sip) { case SIPDefault: { inputContainerCurrent = inputContainerDefault; inputContainerExtended->hide(true); inputContainerCurrent->hide(false); break; } case SIPExtended: { inputContainerCurrent = inputContainerExtended; inputContainerDefault->hide(true); inputContainerCurrent->hide(false); break; } } rearrangePatternEditorControlOrInstrumentContainer(); screen->update(); } void Tracker::expandOrderlist(bool b) { extendedOrderlist = b; PPContainer* container = static_cast(screen->getControlByID(CONTAINER_ORDERLIST)); PPPoint p = container->getLocation(); pp_int32 x = p.x; pp_int32 y = p.y; ASSERT(container); if (b) { container->getControlByID(BUTTON_ORDERLIST_SONGLENGTH_PLUS)->setLocation(PPPoint(x+2 + 78-2, y+2+12+12+12)); container->getControlByID(BUTTON_ORDERLIST_SONGLENGTH_MINUS)->setLocation(PPPoint(x+2 + 78-2 + 17, y+2+12+12+12)); container->getControlByID(BUTTON_ORDERLIST_REPEAT_PLUS)->hide(true); container->getControlByID(BUTTON_ORDERLIST_REPEAT_MINUS)->hide(true); container->getControlByID(STATICTEXT_ORDERLIST_SONGLENGTH)->setLocation(PPPoint(x+ 8*12, y+2+12+12+12+2+12)); container->getControlByID(STATICTEXT_ORDERLIST_REPEAT)->hide(true); container->getControlByID(0)->hide(true); container->getControlByID(1)->hide(false); container->getControlByID(2)->hide(true); static_cast(container->getControlByID(BUTTON_ORDERLIST_EXTENT))->setText(TrackerConfig::stringButtonExtended); PPSize size = container->getControlByID(LISTBOX_ORDERLIST)->getSize(); size.height = 60; container->getControlByID(LISTBOX_ORDERLIST)->setSize(size); } else { container->getControlByID(BUTTON_ORDERLIST_SONGLENGTH_PLUS)->setLocation(PPPoint(x+2 + 78-2, y+2+12+12+12)); container->getControlByID(BUTTON_ORDERLIST_SONGLENGTH_MINUS)->setLocation(PPPoint(x+2 + 78-2 + 17, y+2+12+12+12)); container->getControlByID(BUTTON_ORDERLIST_REPEAT_PLUS)->hide(false); container->getControlByID(BUTTON_ORDERLIST_REPEAT_MINUS)->hide(false); container->getControlByID(STATICTEXT_ORDERLIST_SONGLENGTH)->setLocation(PPPoint(x+2 + 8*7, y+2+12+12+12+2)); container->getControlByID(STATICTEXT_ORDERLIST_REPEAT)->hide(false); container->getControlByID(0)->hide(false); container->getControlByID(1)->hide(true); container->getControlByID(2)->hide(false); static_cast(container->getControlByID(BUTTON_ORDERLIST_EXTENT))->setText(TrackerConfig::stringButtonCollapsed); PPSize size = container->getControlByID(LISTBOX_ORDERLIST)->getSize(); size.height = 36; container->getControlByID(LISTBOX_ORDERLIST)->setSize(size); } } void Tracker::flipSpeedSection() { PPContainer* container = static_cast(screen->getControlByID(CONTAINER_SPEED)); ASSERT(container); PPControl* control = container->getControlByID(STATICTEXT_SPEED_OCTAVE); ASSERT(control); pp_int32 dy = container->getControlByID(STATICTEXT_SPEED_SPEED)->getLocation().y - container->getControlByID(STATICTEXT_SPEED_BPM)->getLocation().y; if (control->isHidden()) { // Show octave integer field control->hide(false); // Show octave description text ("Oct") control = container->getControlByID(STATICTEXT_SPEED_OCTAVE_DESC); control->hide(false); // Show octave minus button control = container->getControlByID(BUTTON_OCTAVE_MINUS); control->hide(false); // Show octave plus button control = container->getControlByID(BUTTON_OCTAVE_PLUS); control->hide(false); // show mainvol text control = container->getControlByID(STATICTEXT_SPEED_MAINVOL); control->hide(false); // show mainvol description text ("Mainvol") control = container->getControlByID(STATICTEXT_SPEED_MAINVOL_DESC); control->hide(false); // hide BPM text fields + buttons control = container->getControlByID(STATICTEXT_SPEED_BPM); control->hide(true); control = container->getControlByID(STATICTEXT_SPEED_BPM_DESC); control->hide(true); control = container->getControlByID(BUTTON_BPM_MINUS); control->hide(true); control = container->getControlByID(BUTTON_BPM_PLUS); control->hide(true); // hide tick speed text fields + buttons control = container->getControlByID(BUTTON_SPEED_MINUS); control->hide(true); control = container->getControlByID(BUTTON_SPEED_PLUS); control->hide(true); control = container->getControlByID(STATICTEXT_SPEED_SPEED); control->hide(true); control = container->getControlByID(STATICTEXT_SPEED_SPEED_DESC); control->hide(true); // Move pattern add text fields + buttons one row upwards control = container->getControlByID(STATICTEXT_SPEED_PATTERNADD); PPPoint p = control->getLocation(); p.y-=dy; control->setLocation(p); control = container->getControlByID(STATICTEXT_SPEED_PATTERNADD_DESC); p = control->getLocation(); p.y-=dy; control->setLocation(p); control = container->getControlByID(BUTTON_ADD_PLUS); p = control->getLocation(); p.y-=dy; control->setLocation(p); control = container->getControlByID(BUTTON_ADD_MINUS); p = control->getLocation(); p.y-=dy; control->setLocation(p); } else { // The hide octave texts + buttons control->hide(true); control = container->getControlByID(STATICTEXT_SPEED_OCTAVE_DESC); control->hide(true); control = container->getControlByID(BUTTON_OCTAVE_MINUS); control->hide(true); control = container->getControlByID(BUTTON_OCTAVE_PLUS); control->hide(true); // hide mainvol text control = container->getControlByID(STATICTEXT_SPEED_MAINVOL); control->hide(true); control = container->getControlByID(STATICTEXT_SPEED_MAINVOL_DESC); control->hide(true); // show bpm text + buttons control = container->getControlByID(STATICTEXT_SPEED_BPM); control->hide(false); control = container->getControlByID(STATICTEXT_SPEED_BPM_DESC); control->hide(false); control = container->getControlByID(BUTTON_BPM_MINUS); control->hide(false); control = container->getControlByID(BUTTON_BPM_PLUS); control->hide(false); // show tick speed text + buttons control = container->getControlByID(BUTTON_SPEED_MINUS); control->hide(false); control = container->getControlByID(BUTTON_SPEED_PLUS); control->hide(false); control = container->getControlByID(STATICTEXT_SPEED_SPEED); control->hide(false); control = container->getControlByID(STATICTEXT_SPEED_SPEED_DESC); control->hide(false); // move pattern add text one row downwards control = container->getControlByID(STATICTEXT_SPEED_PATTERNADD); PPPoint p = control->getLocation(); p.y+=dy; control->setLocation(p); control = container->getControlByID(STATICTEXT_SPEED_PATTERNADD_DESC); p = control->getLocation(); p.y+=dy; control->setLocation(p); control = container->getControlByID(BUTTON_ADD_PLUS); p = control->getLocation(); p.y+=dy; control->setLocation(p); control = container->getControlByID(BUTTON_ADD_MINUS); p = control->getLocation(); p.y+=dy; control->setLocation(p); } } void Tracker::enableInstrument(bool b) { getPatternEditorControl()->enableInstrument(b); PPContainer* container = static_cast(screen->getControlByID(CONTAINER_INSTRUMENTLIST)); ASSERT(container); PPButton* button = static_cast(container->getControlByID(BUTTON_INSTRUMENT)); ASSERT(button); button->setPressed(b); listBoxInstruments->setOnlyShowIndexSelection(!b); screen->paintControl(listBoxInstruments); screen->paintControl(button); } void Tracker::commitListBoxChanges() { if (listBoxInstruments->isEditing()) listBoxInstruments->commitChanges(); if (listBoxSamples->isEditing()) listBoxSamples->commitChanges(); } FileTypes Tracker::getCurrentSelectedSampleSaveType() { return (FileTypes)sectionDiskMenu->getCurrentSelectedSampleSaveType(); } pp_uint32 Tracker::fileTypeToHint(FileTypes type) { switch (type) { case FileTypes::FileTypeSongAllModules: case FileTypes::FileTypeSongMOD: case FileTypes::FileTypeSongXM: return DecompressorBase::HintModules; case FileTypes::FileTypePatternXP: return DecompressorBase::HintPatterns; case FileTypes::FileTypeTrackXT: return DecompressorBase::HintTracks; case FileTypes::FileTypeSongAllInstruments: case FileTypes::FileTypeInstrumentXI: return DecompressorBase::HintInstruments; case FileTypes::FileTypeSongAllSamples: case FileTypes::FileTypeSampleWAV: case FileTypes::FileTypeSampleIFF: return DecompressorBase::HintSamples; default: return DecompressorBase::HintAll; } } void Tracker::prepareLoadSaveUI() { #ifdef __LOWRES__ // The bottom section fills up the entire screen // so we first need to hide the entire section before we can show the disk menu screen->pauseUpdate(true); sectionSwitcher->hideBottomSection(); #endif } void Tracker::finishLoadSaveUI() { #ifdef __LOWRES__ screen->pauseUpdate(false); screen->paint(); #endif } bool Tracker::loadGenericFileType(const PPSystemString& fileName) { // we need to find out what file type this is // so we can do appropriate loading FileIdentificator* fileIdentificator = new FileIdentificator(fileName); FileIdentificator::FileTypes type = fileIdentificator->getFileType(); delete fileIdentificator; // check for compression if (type == FileIdentificator::FileTypeCompressed) { // if this is compressed, we try to uncompress it // and choose that file type PPSystemString tempFile(ModuleEditor::getTempFilename()); Decompressor decompressor(fileName); if (decompressor.decompress(tempFile, (DecompressorBase::Hints)fileTypeToHint(FileTypes::FileTypeAllFiles))) { fileIdentificator = new FileIdentificator(tempFile); type = fileIdentificator->getFileType(); delete fileIdentificator; Decompressor::removeFile(tempFile); } else { showMessageBox(MESSAGEBOX_UNIVERSAL, "Unrecognized type/corrupt file", MessageBox_OK); return false; } } switch (type) { case FileIdentificator::FileTypeModule: return loadTypeFromFile(FileTypes::FileTypeSongAllModules, fileName); case FileIdentificator::FileTypeInstrument: return loadTypeFromFile(FileTypes::FileTypeSongAllInstruments, fileName); case FileIdentificator::FileTypeSample: return loadTypeFromFile(FileTypes::FileTypeSongAllSamples, fileName); case FileIdentificator::FileTypePattern: return loadTypeFromFile(FileTypes::FileTypePatternXP, fileName); case FileIdentificator::FileTypeTrack: return loadTypeFromFile(FileTypes::FileTypeTrackXT, fileName); } return false; } bool Tracker::prepareLoading(FileTypes eType, const PPSystemString& fileName, bool suspendPlayer, bool repaint, bool saveCheck) { loadingParameters.deleteFile = false; loadingParameters.didOpenTab = false; loadingParameters.eType = eType; loadingParameters.filename = fileName; loadingParameters.preferredFilename = fileName; loadingParameters.suspendPlayer = suspendPlayer; loadingParameters.repaint = repaint; loadingParameters.res = true; if (saveCheck && eType == FileTypes::FileTypeSongAllModules && !checkForChangesOpenModule()) return false; loadingParameters.lastError = "Error while loading/unknown format"; signalWaitState(true); if (eType == FileTypes::FileTypeSongAllModules && settingsDatabase->restore("TABS_LOADMODULEINNEWTAB")->getBoolValue() && (moduleEditor->hasChanged() || !moduleEditor->isEmpty())) { loadingParameters.didOpenTab = true; tabManager->openNewTab(); } bool rowPlay = playerController->isPlayingRowOnly(); loadingParameters.wasPlaying = rowPlay ? false : (playerController->isPlaying() || playerController->isPlayingPattern()); loadingParameters.wasPlayingPattern = rowPlay ? false : playerController->isPlayingPattern(); if (loadingParameters.suspendPlayer) { #ifndef __LOWRES__ scopesControl->enable(false); #endif playerController->suspendPlayer(); } // check for compressed file type FileIdentificator* fileIdentificator = new FileIdentificator(fileName); FileIdentificator::FileTypes type = fileIdentificator->getFileType(); delete fileIdentificator; if (type == FileIdentificator::FileTypeCompressed) { // if this is compressed, try to decompress PPSystemString tempFile(ModuleEditor::getTempFilename()); Decompressor decompressor(fileName); if (decompressor.decompress(tempFile, (DecompressorBase::Hints)fileTypeToHint(eType))) { // we compressed to a temporary file // load that instead, but keep the original file name as preferred // base name for the module we're going to edit loadingParameters.preferredFilename = loadingParameters.filename; loadingParameters.filename = tempFile; // delete file after loading, it's temporary loadingParameters.deleteFile = true; } else { loadingParameters.lastError = "Unrecognized type/corrupt file"; loadingParameters.res = false; finishLoading(); return false; } } return true; } bool Tracker::finishLoading() { signalWaitState(false); if (loadingParameters.repaint) { screen->paint(); updateWindowTitle(moduleEditor->getModuleFileName()); } if (!loadingParameters.res && !loadingParameters.abortLoading) showMessageBox(MESSAGEBOX_UNIVERSAL, loadingParameters.lastError, MessageBox_OK); if (loadingParameters.suspendPlayer) { playerController->resumePlayer(true); scopesControl->enable(true); } if (loadingParameters.deleteFile) Decompressor::removeFile(loadingParameters.filename); if (!loadingParameters.res && loadingParameters.didOpenTab) tabManager->closeTab(); return loadingParameters.abortLoading ? true : loadingParameters.res; } bool Tracker::loadTypeFromFile(FileTypes eType, const PPSystemString& fileName, bool suspendPlayer/* = true*/, bool repaint/* = true*/, bool saveCheck/* = true*/) { bool res = prepareLoading(eType, fileName, suspendPlayer, repaint, saveCheck); if (!res) return false; switch (eType) { case FileTypes::FileTypeSongAllModules: { if (loadingParameters.preferredFilename.length()) loadingParameters.res = moduleEditor->openSong(loadingParameters.filename, loadingParameters.preferredFilename); else loadingParameters.res = moduleEditor->openSong(loadingParameters.filename, NULL); updateAfterLoad(loadingParameters.res, loadingParameters.wasPlaying, loadingParameters.wasPlayingPattern); break; } case FileTypes::FileTypePatternXP: { loadingParameters.res = getPatternEditor()->loadExtendedPattern(loadingParameters.filename); updateSongInfo(); break; } case FileTypes::FileTypeTrackXT: { loadingParameters.res = getPatternEditor()->loadExtendedTrack(loadingParameters.filename); updateSongInfo(); break; } case FileTypes::FileTypeSongAllInstruments: { loadingParameters.res = moduleEditor->loadInstrument(loadingParameters.filename, listBoxInstruments->getSelectedIndex()); sectionInstruments->updateAfterLoad(); break; } case FileTypes::FileTypeSongAllSamples: { pp_int32 numSampleChannels = moduleEditor->getNumSampleChannels(loadingParameters.filename); pp_int32 chnIndex = 0; if (numSampleChannels <= 0) { loadingParameters.res = false; break; } else if (numSampleChannels > 1 && !settingsDatabase->restore("AUTOMIXDOWNSAMPLES")->getIntValue()) { if (dialog) delete dialog; if (responder) delete responder; responder = new SampleLoadChannelSelectionHandler(*this); dialog = new DialogChannelSelector(screen, responder, PP_DEFAULT_ID, "Choose channel to load"PPSTR_PERIODS); // Add names of sample channels to instrument box for (pp_int32 i = 0; i < numSampleChannels; i++) static_cast(dialog)->getListBox()->addItem(moduleEditor->getNameOfSampleChannel(loadingParameters.filename, i)); static_cast(responder)->setCurrentFileName(loadingParameters.filename); static_cast(responder)->setPreferredFileName(loadingParameters.preferredFilename); static_cast(responder)->suspendPlayer = suspendPlayer; signalWaitState(false); dialog->show(); return true; } else if (numSampleChannels > 1 && settingsDatabase->restore("AUTOMIXDOWNSAMPLES")->getIntValue()) { chnIndex = -1; } if (loadingParameters.preferredFilename.length()) loadingParameters.res = moduleEditor->loadSample(loadingParameters.filename, listBoxInstruments->getSelectedIndex(), listBoxSamples->getSelectedIndex(), chnIndex, loadingParameters.preferredFilename); else loadingParameters.res = moduleEditor->loadSample(loadingParameters.filename, listBoxInstruments->getSelectedIndex(), listBoxSamples->getSelectedIndex(), chnIndex); sectionSamples->updateAfterLoad(); break; } } return finishLoading(); } // load different things bool Tracker::loadTypeWithDialog(FileTypes eLoadType, bool suspendPlayer/* = true*/, bool repaint/* = true*/) { FileExtProvider fileExtProvider; PPOpenPanel* openPanel = NULL; switch (eLoadType) { case FileTypes::FileTypeSongAllModules: { if (!checkForChangesOpenModule()) return false; openPanel = new PPOpenPanel(screen, "Open module"); openPanel->addExtensions(fileExtProvider.getModuleExtensions()); break; } case FileTypes::FileTypePatternXP: { openPanel = new PPOpenPanel(screen, "Open Extended Pattern"); openPanel->addExtensions(fileExtProvider.getPatternExtensions()); break; } case FileTypes::FileTypeTrackXT: { openPanel = new PPOpenPanel(screen, "Open Extended Track"); openPanel->addExtensions(fileExtProvider.getTrackExtensions()); break; } case FileTypes::FileTypeSongAllInstruments: { openPanel = new PPOpenPanel(screen, "Open Instrument"); openPanel->addExtensions(fileExtProvider.getInstrumentExtensions()); break; } case FileTypes::FileTypeSongAllSamples: { openPanel = new PPOpenPanel(screen, "Open Sample"); openPanel->addExtensions(fileExtProvider.getSampleExtensions()); break; } } if (!openPanel) return false; bool res = true; if (openPanel->runModal() == PPModalDialog::ReturnCodeOK) { PPSystemString file = openPanel->getFileName(); if (file.length()) { PPSystemString fileName = file; res = loadTypeFromFile(eLoadType, fileName, suspendPlayer, repaint, false); } delete openPanel; } return res; } void Tracker::loadType(FileTypes eType) { if (useClassicBrowser) { prepareLoadSaveUI(); sectionDiskMenu->selectSaveType(eType); eventKeyDownBinding_InvokeSectionDiskMenu(); finishLoadSaveUI(); } else { loadTypeWithDialog(eType); } } bool Tracker::prepareSavingWithDialog(FileTypes eSaveType) { FileExtProvider fileExtProvider; currentSaveFileType = eSaveType; switch (eSaveType) { case FileTypes::FileTypeSongMOD: { savePanel = new PPSavePanel(screen, "Save Protracker Module", moduleEditor->getModuleFileName(ModuleEditor::ModSaveTypeMOD)); savePanel->addExtension(fileExtProvider.getModuleExtension(FileExtProvider::ModuleExtensionMOD), fileExtProvider.getModuleDescription(FileExtProvider::ModuleExtensionMOD)); pp_uint32 err = moduleEditor->getPTIncompatibilityCode(); if (err) { buildMODSaveErrorWarning(err); return false; } break; } case FileTypes::FileTypeSongXM: savePanel = new PPSavePanel(screen, "Save Extended Module", moduleEditor->getModuleFileName(ModuleEditor::ModSaveTypeXM)); savePanel->addExtension(fileExtProvider.getModuleExtension(FileExtProvider::ModuleExtensionXM), fileExtProvider.getModuleDescription(FileExtProvider::ModuleExtensionXM)); break; case FileTypes::FileTypePatternXP: { PPSystemString fileName = moduleEditor->getModuleFileName().stripExtension(); fileName.append(".xp"); savePanel = new PPSavePanel(screen, "Save Extended Pattern", fileName); savePanel->addExtension(fileExtProvider.getPatternExtension(FileExtProvider::PatternExtensionXP), fileExtProvider.getPatternDescription(FileExtProvider::PatternExtensionXP)); break; } case FileTypes::FileTypeTrackXT: { PPSystemString fileName = moduleEditor->getModuleFileName().stripExtension(); fileName.append(".xt"); savePanel = new PPSavePanel(screen, "Save Extended Track", fileName); savePanel->addExtension(fileExtProvider.getTrackExtension(FileExtProvider::TrackExtensionXT), fileExtProvider.getTrackDescription(FileExtProvider::TrackExtensionXT)); break; } case FileTypes::FileTypeInstrumentXI: { PPSystemString sampleFileName = moduleEditor->getInstrumentFileName(listBoxInstruments->getSelectedIndex()); sampleFileName.append(".xi"); savePanel = new PPSavePanel(screen, "Save Instrument", sampleFileName); savePanel->addExtension(fileExtProvider.getInstrumentExtension(FileExtProvider::InstrumentExtensionXI), fileExtProvider.getInstrumentDescription(FileExtProvider::InstrumentExtensionXI)); break; } case FileTypes::FileTypeSampleWAV: { PPSystemString sampleFileName = moduleEditor->getSampleFileName(listBoxInstruments->getSelectedIndex(), listBoxSamples->getSelectedIndex()); sampleFileName.append(".wav"); savePanel = new PPSavePanel(screen, "Save uncompressed WAV",sampleFileName); savePanel->addExtension(fileExtProvider.getSampleExtension(FileExtProvider::SampleExtensionWAV), fileExtProvider.getSampleDescription(FileExtProvider::SampleExtensionWAV)); break; } case FileTypes::FileTypeSampleIFF: { PPSystemString sampleFileName = moduleEditor->getSampleFileName(listBoxInstruments->getSelectedIndex(), listBoxSamples->getSelectedIndex()); sampleFileName.append(".iff"); savePanel = new PPSavePanel(screen, "Save uncompressed IFF",sampleFileName); savePanel->addExtension(fileExtProvider.getSampleExtension(FileExtProvider::SampleExtensionIFF), fileExtProvider.getSampleDescription(FileExtProvider::SampleExtensionIFF)); break; } } return true; } // Save different things bool Tracker::saveTypeWithDialog(FileTypes eSaveType, EventListenerInterface* fileSystemChangedListener/* = NULL*/) { if (savePanel == NULL) { if (!prepareSavingWithDialog(eSaveType)) { this->fileSystemChangedListener = fileSystemChangedListener; return true; } if (!savePanel) return true; } bool res = true; if (savePanel->runModal() == PPModalDialog::ReturnCodeOK) { PPSystemString file = savePanel->getFileName(); if (file.length()) { loadingParameters.lastError = "Error while saving"; signalWaitState(true); switch (eSaveType) { case FileTypes::FileTypeSongMOD: commitListBoxChanges(); res = moduleEditor->saveSong(file, ModuleEditor::ModSaveTypeMOD); break; case FileTypes::FileTypeSongXM: commitListBoxChanges(); res = moduleEditor->saveSong(file, ModuleEditor::ModSaveTypeXM); break; case FileTypes::FileTypeTrackXT: { res = getPatternEditor()->saveExtendedTrack(file); break; } case FileTypes::FileTypePatternXP: { res = getPatternEditor()->saveExtendedPattern(file); break; } case FileTypes::FileTypeInstrumentXI: commitListBoxChanges(); res = moduleEditor->saveInstrument(file, listBoxInstruments->getSelectedIndex()); break; case FileTypes::FileTypeSampleWAV: commitListBoxChanges(); res = moduleEditor->saveSample(file, listBoxInstruments->getSelectedIndex(), listBoxSamples->getSelectedIndex(), ModuleEditor::SampleFormatTypeWAV); break; case FileTypes::FileTypeSampleIFF: commitListBoxChanges(); res = moduleEditor->saveSample(file, listBoxInstruments->getSelectedIndex(), listBoxSamples->getSelectedIndex(), ModuleEditor::SampleFormatTypeIFF); break; } if (res && fileSystemChangedListener) { PPEvent event(eFileSystemChanged); fileSystemChangedListener->handleEvent(reinterpret_cast(this), &event); } signalWaitState(false); screen->paint(); updateWindowTitle(moduleEditor->getModuleFileName()); } } if (!res) showMessageBox(MESSAGEBOX_UNIVERSAL, loadingParameters.lastError, MessageBox_OK); delete savePanel; savePanel = NULL; fileSystemChangedListener = NULL; return res; } bool Tracker::saveCurrentModuleAsSelectedType() { signalWaitState(true); loadingParameters.lastError = "Error while saving.\nFile might be write protected."; pp_int32 res = moduleEditor->saveSong(moduleEditor->getModuleFileNameFull(), moduleEditor->getSaveType()); signalWaitState(false); if (!res) showMessageBoxSized(MESSAGEBOX_UNIVERSAL, loadingParameters.lastError, MessageBox_OK, -1, -1); screen->paint(); if (res) updateWindowTitle(); return res == 0; } void Tracker::saveType(FileTypes eType) { if (useClassicBrowser) { prepareLoadSaveUI(); sectionDiskMenu->selectSaveType(eType); if (eType == FileTypes::FileTypeSongWAV) sectionDiskMenu->setModuleTypeAdjust(false); eventKeyDownBinding_InvokeSectionDiskMenu(); if (eType == FileTypes::FileTypeSongWAV) sectionDiskMenu->setModuleTypeAdjust(true); finishLoadSaveUI(); } else { saveTypeWithDialog(eType); } } void Tracker::save() { if (TrackerConfig::untitledSong.compareTo(moduleEditor->getModuleFileNameFull().stripExtension()) == 0) { saveAs(); } else { if (moduleEditor->getSaveType() == ModuleEditor::ModSaveTypeMOD) { pp_uint32 err = moduleEditor->getPTIncompatibilityCode(); if (err) { // remove save panel // => the handler for the upcoming modal dialog // will note from the absent save panel that saving will be // done to the current document if (savePanel) { delete savePanel; savePanel = NULL; } buildMODSaveErrorWarning((pp_int32)err); return; } } saveCurrentModuleAsSelectedType(); } } void Tracker::saveAs() { switch (moduleEditor->getSaveType()) { case ModuleEditor::ModSaveTypeMOD: saveType(FileTypes::FileTypeSongMOD); break; case ModuleEditor::ModSaveTypeXM: saveType(FileTypes::FileTypeSongXM); break; default: ASSERT(false); } } void Tracker::handleSaveProceed() { // if there is a save panel present we save with file name // selection, otherwise we simply save the current document // in the current format if (savePanel != NULL) saveTypeWithDialog(currentSaveFileType, fileSystemChangedListener); else saveCurrentModuleAsSelectedType(); } void Tracker::handleSaveCancel() { delete savePanel; savePanel = NULL; } void Tracker::buildMODSaveErrorWarning(pp_int32 error) { static const char* warnings[] = {"Song contains more than 31 instruments\nSave anyway?", "Song uses linear frequencies\nSave anyway?", "Song contains incompatible samples \n\n"\ "Check for the following conditions:\n"\ "* No 16 bit samples \n"\ "* All samples are below 128kb \n"\ "* No ping-pong looping \n"\ "* Panning is set to 0x80 (middle) \n"\ "* Relative note is C-4 (number 0) \n\nSave anyway?", "Song contains FT2-style instruments\n\n"\ "Check for the following conditions:\n"\ "* No envelopes \n"\ "* No autovibrato \n"\ "* Only one sample per instrument \n\nSave anyway?", "Incompatible pattern data \n\n"\ "Check for the following conditions:\n"\ "* Pattern length is exactly 64 rows\n"\ "* Only notes between C-3 and B-5 \n"\ "* Volume column is not used \n"\ "* Only effects between 0 and F \n\nSave anyway?"}; if (dialog) delete dialog; if (responder) delete responder; responder = new SaveProceedHandler(*this); dialog = new PPDialogBase(screen, responder, MESSAGEBOX_SAVEPROCEED, ""); showMessageBoxSized(MESSAGEBOX_SAVEPROCEED, warnings[error-1], MessageBox_YESNO, 318, -1, false); // Transfer ownership of modal overlayed container to dialog // => also set new event listener dialog->setMessageBoxContainer(messageBoxContainerGeneric); messageBoxContainerGeneric->setEventListener(dialog); PPSimpleVector& controls = messageBoxContainerGeneric->getControls(); for (pp_int32 i = 0; i < controls.size(); i++) controls.get(i)->setEventListener(dialog); messageBoxContainerGeneric = NULL; dialog->show(); } void Tracker::estimateSongLength(bool signalWait/* = false*/) { if (signalWait) signalWaitState(true); moduleEditor->getModuleServices()->estimateSongLength(); if (signalWait) { signalWaitState(false); screen->update(); } } void Tracker::signalWaitState(bool b) { screen->signalWaitState(b, TrackerConfig::colorThemeMain); } milkytracker-0.90.85+dfsg/src/tracker/DialogZap.cpp0000755000175000017500000000540511150223367021232 0ustar admin2admin2/* * tracker/DialogZap.cpp * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * DialogZap.cpp * MilkyTracker * * Created by Peter Barth on 20.2.08. * */ #include "DialogZap.h" #include "Screen.h" #include "StaticText.h" #include "MessageBoxContainer.h" #include "Font.h" enum ControlIDs { MESSAGEBOXZAP_BUTTON_ALL = PP_MESSAGEBOX_BUTTON_USER1, MESSAGEBOXZAP_BUTTON_SONG, MESSAGEBOXZAP_BUTTON_PATT, MESSAGEBOXZAP_BUTTON_INS }; DialogZap::DialogZap(PPScreen* screen, DialogResponder* responder, pp_int32 id) : PPDialogBase() { parentScreen = screen; setResponder(responder); const pp_int32 height = 74; const pp_int32 width = 290; pp_int32 x = screen->getWidth() / 2 - width/2; pp_int32 y = screen->getHeight() / 2 - height/2; PPMessageBoxContainer* container = new PPMessageBoxContainer(id, screen, this, PPPoint(x, y), PPSize(width,height), "System request"); pp_int32 x2 = x + width / 2 - (PPFont::getFont(PPFont::FONT_SYSTEM)->getStrWidth("Total devastation of the"PPSTR_PERIODS) / 2); pp_int32 y2 = y + 20; container->addControl(new PPStaticText(0, screen, this, PPPoint(x2, y2), "Total devastation of the"PPSTR_PERIODS, true)); PPButton* button = new PPButton(MESSAGEBOXZAP_BUTTON_ALL, screen, this, PPPoint(x+10, y2 + 15), PPSize(60, 11)); button->setText("All"); container->addControl(button); button = new PPButton(MESSAGEBOXZAP_BUTTON_SONG, screen, this, PPPoint(x + 10 + 60 + 10, y2 + 15), PPSize(60, 11)); button->setText("Song"); container->addControl(button); button = new PPButton(MESSAGEBOXZAP_BUTTON_PATT, screen, this, PPPoint(x + 10 + 60*2 + 10*2, y2 + 15), PPSize(60, 11)); button->setText("Pattern"); container->addControl(button); button = new PPButton(MESSAGEBOXZAP_BUTTON_INS, screen, this, PPPoint(x + 10 + 60*3 + 10*3, y2 + 15), PPSize(60, 11)); button->setText("Instr."); container->addControl(button); button = new PPButton(PP_MESSAGEBOX_BUTTON_CANCEL, screen, this, PPPoint(x + 10 + 60*3 + 10*3, y2 + 15*2+4), PPSize(60, 11)); button->setText("Cancel"); container->addControl(button); messageBoxContainerGeneric = container; } milkytracker-0.90.85+dfsg/src/tracker/TabManager.h0000644000175000017500000000475411150223367021031 0ustar admin2admin2/* * tracker/TabManager.h * * Copyright 2009 Peter Barth * * This file is part of Milkytracker. * * Milkytracker 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 3 of the License, or * (at your option) any later version. * * Milkytracker 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 Milkytracker. If not, see . * */ /* * TabManager.h * MilkyTracker * * Created by Peter Barth on 20.12.07. * */ #ifndef __TABMANAGER_H__ #define __TABMANAGER_H__ #include "BasicTypes.h" template class PPSimpleVector; class ModuleEditor; class PlayerController; class TabManager { public: enum StopTabsBehaviours { StopTabsBehaviourNone, StopTabsBehaviourOnTabSwitch, StopTabsBehaviourOnPlayback }; private: class Tracker& tracker; struct Document { ModuleEditor* moduleEditor; PlayerController* playerController; Document(ModuleEditor* moduleEditor, PlayerController* playerController); ~Document(); }; PPSimpleVector* documents; Document* currentDocument; bool stopOnTabSwitch; bool resumeOnTabSwitch; class TabHeaderControl* getTabHeaderControl(); void applyPlayerDefaults(PlayerController* playerController); void selectModuleEditor(Document* document); public: TabManager(Tracker& tracker); ~TabManager(); ModuleEditor* createModuleEditor(); PlayerController* createPlayerController(); void setStopOnTabSwitch(bool stopOnTabSwitch) { this->stopOnTabSwitch = stopOnTabSwitch; } bool getStopOnTabSwitch() const { return stopOnTabSwitch; } void setResumeOnTabSwitch(bool resumeOnTabSwitch) { this->resumeOnTabSwitch = resumeOnTabSwitch; } bool getResumeOnTabSwitch() const { return resumeOnTabSwitch; } void openNewTab(PlayerController* playerController = NULL, ModuleEditor* moduleEditor = NULL); void switchToTab(pp_uint32 index); void closeTab(pp_int32 index = -1); ModuleEditor* getModuleEditorFromTabIndex(pp_int32 index); PlayerController* getPlayerControllerFromTabIndex(pp_int32 index); pp_uint32 getSelectedTabIndex(); void cycleTab(pp_int32 offset); pp_int32 getNumTabs() const; }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/0000755000175000017500000000000011317506534017232 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriver_NULL.cpp0000644000175000017500000000515711163403715023011 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_NULL.cpp * MilkyPlay * * Created by Peter Barth on 29.07.05. * */ #include "AudioDriver_NULL.h" #include "MasterMixer.h" AudioDriver_NULL::AudioDriver_NULL() : numSamplesWritten(0), compensateBuffer(0) { } AudioDriver_NULL::~AudioDriver_NULL() { delete[] compensateBuffer; } mp_sint32 AudioDriver_NULL::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; numSamplesWritten = 0; delete[] compensateBuffer; compensateBuffer = new mp_sword[bufferSizeInWords]; return 0; } mp_sint32 AudioDriver_NULL::stop() { return 0; } mp_sint32 AudioDriver_NULL::closeDevice() { return 0; } mp_sint32 AudioDriver_NULL::start() { return 0; } mp_sint32 AudioDriver_NULL::pause() { return 0; } mp_sint32 AudioDriver_NULL::resume() { return 0; } void AudioDriver_NULL::advance() { numSamplesWritten+=bufferSize / MP_NUMCHANNELS; if (mixer->isPlaying()) mixer->mixerHandler(compensateBuffer); } milkytracker-0.90.85+dfsg/src/milkyplay/ChannelMixer.cpp0000644000175000017500000011376511163403715022324 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ChannelMixer.cpp * MilkyPlay mixer class * * * "- Be prepared! Are you sure you want to know? :-)" * * This class is pretty much emulating a Gravis Ultrasound with a timer set to 250Hz * I.e. the mixer() routine will call a user specified handler 250 times per second * while mixing the audio stream in between. */ #include "ChannelMixer.h" #include "ResamplerFactory.h" #include "ResamplerMacros.h" #include "AudioDriverManager.h" #include // Ramp out will last (THEBEATLENGTH*RAMPDOWNFRACTION)>>8 samples #define RAMPDOWNFRACTION 256 static inline mp_sint32 myMod(mp_sint32 a, mp_sint32 b) { mp_sint32 r = a % b; return r < 0 ? b + r : r; } void ChannelMixer::ResamplerBase::addChannelsNormal(ChannelMixer* mixer, mp_uint32 numChannels, mp_sint32* buffer32,mp_sint32 beatNum, mp_sint32 beatlength) { ChannelMixer::TMixerChannel* channel = mixer->channel; ChannelMixer::TMixerChannel* newChannel = mixer->newChannel; const mp_sint32 panningSeparation = mixer->panningSeparation; const mp_sint32 masterVolume = mixer->masterVolume; for (mp_uint32 c=0;cindex = c; // For Amiga resampler if (!(chn->flags & MP_SAMPLE_PLAY)) continue; switch (chn->flags&(MP_SAMPLE_FADEOUT|MP_SAMPLE_FADEIN|MP_SAMPLE_FADEOFF)) { case MP_SAMPLE_FADEOFF: { chn->flags&=~(MP_SAMPLE_PLAY | MP_SAMPLE_FADEOFF); continue; } case MP_SAMPLE_FADEOUT: { chn->sample = newChannel[c].sample; chn->smplen = newChannel[c].smplen; chn->loopstart = newChannel[c].loopstart; chn->loopend = newChannel[c].loopend; chn->smppos = newChannel[c].smppos; chn->smpposfrac = newChannel[c].smpposfrac; chn->flags = newChannel[c].flags; chn->loopendcopy = newChannel[c].loopendcopy; chn->fixedtime = newChannel[c].fixedtimefrac; chn->fixedtimefrac = newChannel[c].fixedtimefrac; // break is missing here intentionally!!! } default: { if (chn->flags&MP_SAMPLE_MUTE) { chn->finalvoll = 0; chn->finalvolr = 0; } else { mp_sint32 pan = (((chn->pan - 128)*panningSeparation) >> 8) + 128; if (pan < 0) pan = 0; if (pan > 255) pan = 255; mp_sint32 left = 255-pan; if (left>128) left=128; mp_sint32 right = pan; if (right>128) right=128; chn->finalvoll = (chn->vol*left*masterVolume)<<6; chn->finalvolr = (chn->vol*right*masterVolume)<<6; } break; } } // mix here addChannel(chn, buffer32, beatlength, beatlength); } } void ChannelMixer::ResamplerBase::addChannelsRamping(ChannelMixer* mixer, mp_uint32 numChannels, mp_sint32* buffer32,mp_sint32 beatNum, mp_sint32 beatlength) { ChannelMixer::TMixerChannel* channel = mixer->channel; ChannelMixer::TMixerChannel* newChannel = mixer->newChannel; const mp_sint32 panningSeparation = mixer->panningSeparation; const mp_sint32 masterVolume = mixer->masterVolume; for (mp_uint32 c=0;cindex = c; // For Amiga resampler if (!(chn->flags & MP_SAMPLE_PLAY)) continue; switch (chn->flags&(MP_SAMPLE_FADEOUT|MP_SAMPLE_FADEIN|MP_SAMPLE_FADEOFF)) { case MP_SAMPLE_FADEOFF: { mp_sint32 maxramp = (beatlength*RAMPDOWNFRACTION)>>8; mp_sint32 beatl = (!(chn->flags & 3)) ? (ChannelMixer::fixedmul(chn->loopend,chn->rsmpadd) >> 1) : maxramp; if (beatl > maxramp || beatl <= 0) beatl = maxramp; chn->rampFromVolStepL = (-chn->finalvoll)/beatl; chn->rampFromVolStepR = (-chn->finalvolr)/beatl; if (beatl) addChannel(chn, buffer32, beatl, beatlength); chn->flags&=~(MP_SAMPLE_PLAY | MP_SAMPLE_FADEOFF); continue; } case MP_SAMPLE_FADEIN: { chn->flags = (chn->flags&~(MP_SAMPLE_FADEOUT|MP_SAMPLE_FADEIN))/*|MP_SAMPLE_FADEIN*/; //mp_sint32 beatl = (beatlength*RAMPDOWNFRACTION)>>8; mp_sint32 maxramp = (beatlength*RAMPDOWNFRACTION)>>8; mp_sint32 beatl = (!(chn->flags & 3)) ? (ChannelMixer::fixedmul(chn->loopend,chn->rsmpadd) >> 1) : maxramp; if (beatl > maxramp || beatl <= 0) beatl = maxramp; mp_sint32 pan = (((chn->pan - 128)*panningSeparation) >> 8) + 128; if (pan < 0) pan = 0; if (pan > 255) pan = 255; mp_sint32 left = 255-pan; if (left>128) left=128; mp_sint32 right = pan; if (right>128) right=128; mp_sint32 volL = (chn->vol*left*masterVolume)<<6; mp_sint32 volR = (chn->vol*right*masterVolume)<<6; if (chn->flags&MP_SAMPLE_MUTE) volL = volR = 0; chn->rampFromVolStepL = (volL-chn->finalvoll)/beatl; chn->rampFromVolStepR = (volR-chn->finalvolr)/beatl; // mix here if (beatl) addChannel(chn, buffer32, beatl, beatlength); //chn->finalvoll = volL; //chn->finalvolr = volR; chn->rampFromVolStepL = 0; chn->rampFromVolStepR = 0; mp_sint32 offset = beatl; beatl = beatlength - beatl; if (beatl) addChannel(chn, buffer32+offset*MP_NUMCHANNELS, beatl, beatlength); break; } case MP_SAMPLE_FADEOUT: { mp_sint32 maxramp = (beatlength*RAMPDOWNFRACTION)>>8; mp_sint32 beatl = (!(chn->flags & 3)) ? (ChannelMixer::fixedmul(chn->loopend,chn->rsmpadd) >> 1) : maxramp; if (beatl > maxramp || beatl <= 0) beatl = maxramp; chn->rampFromVolStepL = (0-chn->finalvoll)/beatl; chn->rampFromVolStepR = (0-chn->finalvolr)/beatl; chn->flags = (chn->flags&~(MP_SAMPLE_FADEOUT|MP_SAMPLE_FADEIN))/*|MP_SAMPLE_FADEIN*/; // for the last active sample we need to retrieve the last active sample rate // which is temporarly stored in newChannel[c] // get it, fill it in and restore the original value later mp_sint32 tmpsmpadd = chn->smpadd; mp_sint32 tmprsmpadd = chn->rsmpadd; mp_sint32 tmpcurrsample = chn->currsample; mp_sint32 tmpprevsample = chn->prevsample; mp_sint32 tmpa = chn->a; mp_sint32 tmpb = chn->b; mp_sint32 tmpc = chn->c; chn->smpadd = newChannel[c].smpadd; chn->rsmpadd = newChannel[c].rsmpadd; chn->currsample = newChannel[c].currsample; chn->prevsample = newChannel[c].prevsample; chn->a = newChannel[c].a; chn->b = newChannel[c].b; chn->c = newChannel[c].c; if (beatl) addChannel(chn, buffer32, beatl, beatlength); chn->smpadd = tmpsmpadd; chn->rsmpadd = tmprsmpadd; chn->currsample = tmpcurrsample; chn->prevsample = tmpprevsample; chn->a = tmpa; chn->b = tmpb; chn->c = tmpc; // fade in new sample chn->sample = newChannel[c].sample; chn->smplen = newChannel[c].smplen; chn->loopstart = newChannel[c].loopstart; chn->loopend = newChannel[c].loopend; chn->smppos = newChannel[c].smppos; chn->smpposfrac = newChannel[c].smpposfrac; chn->flags = newChannel[c].flags; chn->loopendcopy = newChannel[c].loopendcopy; chn->fixedtime = newChannel[c].fixedtimefrac; chn->fixedtimefrac = newChannel[c].fixedtimefrac; beatl = (!(chn->flags & 3)) ? (ChannelMixer::fixedmul(chn->loopend,chn->rsmpadd) >> 1) : maxramp; if (beatl > maxramp || beatl <= 0) beatl = maxramp; mp_sint32 pan = (((chn->pan - 128)*panningSeparation) >> 8) + 128; if (pan < 0) pan = 0; if (pan > 255) pan = 255; mp_sint32 left = 255-pan; if (left>128) left=128; mp_sint32 right = pan; if (right>128) right=128; mp_sint32 volL = (chn->vol*left*masterVolume)<<6; mp_sint32 volR = (chn->vol*right*masterVolume)<<6; if (chn->flags&MP_SAMPLE_MUTE) volL = volR = 0; chn->rampFromVolStepL = volL/beatl; chn->rampFromVolStepR = volR/beatl; chn->finalvoll = chn->finalvolr = 0; if (beatl) addChannel(chn, buffer32, beatl, beatlength); chn->rampFromVolStepL = 0; chn->rampFromVolStepR = 0; mp_sint32 offset = beatl; beatl = beatlength - beatl; if (beatl) addChannel(chn, buffer32+offset*MP_NUMCHANNELS, beatl, beatlength); continue; } default: { mp_sint32 pan = (((chn->pan - 128)*panningSeparation) >> 8) + 128; if (pan < 0) pan = 0; if (pan > 255) pan = 255; mp_sint32 left = 255-pan; if (left>128) left=128; mp_sint32 right = pan; if (right>128) right=128; mp_sint32 volL = (chn->vol*left*masterVolume)<<6; mp_sint32 volR = (chn->vol*right*masterVolume)<<6; if (chn->flags&MP_SAMPLE_MUTE) volL = volR = 0; chn->rampFromVolStepL = (volL-chn->finalvoll)/beatlength; chn->rampFromVolStepR = (volR-chn->finalvolr)/beatlength; // mix here addChannel(chn, buffer32, beatlength, beatlength); //chn->finalvoll = volL; //chn->finalvolr = volR; break; } } } } void ChannelMixer::ResamplerBase::addChannels(ChannelMixer* mixer, mp_uint32 numChannels, mp_sint32* buffer32,mp_sint32 beatNum, mp_sint32 beatlength) { if (beatNum >= (signed)mixer->getNumBeatPackets()) beatNum = mixer->getNumBeatPackets(); if (isRamping()) addChannelsRamping(mixer, numChannels, buffer32, beatNum, beatlength); else addChannelsNormal(mixer, numChannels, buffer32, beatNum, beatlength); } void ChannelMixer::ResamplerBase::addChannel(TMixerChannel* chn, mp_sint32* buffer32, const mp_sint32 beatlength, const mp_sint32 beatSize) { if ((chn->flags&MP_SAMPLE_PLAY)) { /* check for computational work */ mp_sint32 d = ChannelMixer::fixedmul((chn->loopend - chn->loopstart)<<4,chn->rsmpadd); /* just a threshold value: */ /* if distance between loopend and loopstart is very small and sample */ /* step is "big" we need to many divisions to compute remaining sample */ /* packets so add a full checked channel */ if ((d<128 && supportsFullChecking()) || (supportsFullChecking() && !supportsNoChecking())) { addBlockFull((buffer32), chn, (beatlength)); } else { mp_sint32* tempBuffer32 = (buffer32); mp_sint32 todo = (beatlength); bool limit = false; while (todo>0) { if (chn->flags&MP_SAMPLE_BACKWARD) { mp_sint32 pos = ((todo*-chn->smpadd - chn->smpposfrac)>>16)+chn->smppos; if (pos>chn->loopstart) { addBlockNoCheck(tempBuffer32,chn,todo); break; } else { mp_sint32 length = MP_FP_CEIL(ChannelMixer::fixedmul((((chn->smppos-chn->loopstart)<<16)+chn->smpposfrac),chn->rsmpadd)); if (!length) length++; if (length>todo) { // Final mixing length is limited by the remaining buffer size length = todo; // Mark that we're limited limit = true; } /* sample is going to stop => fade out because of ending clicks*/ else if ((chn->flags & 3) == 0) { mp_sint32 maxramp = (beatSize*RAMPDOWNFRACTION)>>8; mp_sint32 rampl = ChannelMixer::fixedmul(chn->loopend,chn->rsmpadd) >> 1; if (rampl > maxramp || rampl <= 0) rampl = maxramp; if (rampl < length) { length = length-rampl; addBlockNoCheck(tempBuffer32,chn,length); tempBuffer32+=length*MP_NUMCHANNELS; length = rampl; } chn->rampFromVolStepL = (-chn->finalvoll)/length; chn->rampFromVolStepR = (-chn->finalvolr)/length; } addBlockNoCheck(tempBuffer32, chn, length); // Only stop when we're not limited, otherwise the sample will continue playing if ((chn->flags & 3) == 0 && !limit) { if (chn->flags & MP_SAMPLE_ONESHOT) { chn->flags &= ~MP_SAMPLE_ONESHOT; chn->flags |= 1; chn->loopstart = chn->loopendcopy; chn->smppos = chn->loopend - myMod(chn->loopend - chn->smppos, chn->loopend-chn->loopstart); } else chn->flags&=~MP_SAMPLE_PLAY; break; } else if ((chn->flags & 3) == 1) { // Is this correct looping?? chn->smppos = chn->loopend - myMod(chn->loopend - chn->smppos, chn->loopend-chn->loopstart); } // Check if we went out of ping-pong loop bounds else if (chn->smppos < chn->loopstart) { // Invert chn->flags&=~MP_SAMPLE_BACKWARD; BIDIR_REPOSITION(16, chn->smppos, chn->smpposfrac, chn->loopstart, chn->loopend); } tempBuffer32+=length*MP_NUMCHANNELS; todo-=length; } } else { mp_sint32 pos = ((todo*chn->smpadd + chn->smpposfrac)>>16)+chn->smppos; if (posloopend) { addBlockNoCheck(tempBuffer32,chn,todo); break; } else { mp_sint32 length = MP_FP_CEIL(ChannelMixer::fixedmul((((chn->loopend-chn->smppos)<<16)-chn->smpposfrac),chn->rsmpadd)); if (!length) length++; if (length>todo) { length = todo; limit = true; } /* sample is going to stop => fade out because of ending clicks */ else if ((chn->flags & 3) == 0) { mp_sint32 maxramp = (beatSize*RAMPDOWNFRACTION)>>8; mp_sint32 rampl = ChannelMixer::fixedmul(chn->loopend,chn->rsmpadd) >> 1; if (rampl > maxramp || rampl <= 0) rampl = maxramp; if (rampl < length) { length = length-rampl; addBlockNoCheck(tempBuffer32,chn,length); tempBuffer32+=length*MP_NUMCHANNELS; length = rampl; } chn->rampFromVolStepL = (-chn->finalvoll)/length; chn->rampFromVolStepR = (-chn->finalvolr)/length; } addBlockNoCheck(tempBuffer32,chn,length); if ((chn->flags & 3) == 0 && !limit) { if (chn->flags & MP_SAMPLE_ONESHOT) { chn->flags &= ~MP_SAMPLE_ONESHOT; chn->flags |= 1; chn->loopend = chn->loopendcopy; /*ASSERT(chn->loopend-chn->loopstart > 0);*/ chn->smppos = ((chn->smppos - chn->loopstart)%(chn->loopend-chn->loopstart))+chn->loopstart; } else chn->flags&=~MP_SAMPLE_PLAY; break; } else if ((chn->flags & 3) == 1) { /*ASSERT(chn->loopend-chn->loopstart > 0);*/ chn->smppos = ((chn->smppos - chn->loopstart)%(chn->loopend-chn->loopstart))+chn->loopstart; /* correct if pre-calculation was a little bit incorrect*/ if (chn->smppos < 0) chn->smppos = 0; } else if (chn->smppos >= chn->loopend) { // Invert chn->flags|=MP_SAMPLE_BACKWARD; BIDIR_REPOSITION(16, chn->smppos, chn->smpposfrac, chn->loopstart, chn->loopend); } tempBuffer32+=length*MP_NUMCHANNELS; todo-=length; } } } } } } void ChannelMixer::muteChannel(mp_sint32 c, bool m) { channel[c].flags&=~MP_SAMPLE_MUTE; if (m) channel[c].flags|=MP_SAMPLE_MUTE; } bool ChannelMixer::isChannelMuted(mp_sint32 c) { return (channel[c].flags&MP_SAMPLE_MUTE) == MP_SAMPLE_MUTE; } void ChannelMixer::setFrequency(mp_sint32 frequency) { if (frequency == (signed)mixFrequency) return; mixFrequency = frequency; rMixFrequency = 0x7FFFFFFF / frequency; beatPacketSize = (MP_BEATLENGTH*frequency)/MP_BASEFREQ; if (mixbuffBeatPacket) { delete[] mixbuffBeatPacket; mixbuffBeatPacket = NULL; } mixbuffBeatPacket = new mp_sint32[beatPacketSize*MP_NUMCHANNELS]; // channels contain information based on beatPacketSize so this might // have been changed reallocChannels(); if (resamplerType != MIXER_INVALID && resamplerTable[resamplerType]) resamplerTable[resamplerType]->setFrequency(frequency); } void ChannelMixer::reallocChannels() { // optimization in case we already have the allocated number of channels if (mixerNumAllocatedChannels != mixerLastNumAllocatedChannels) { delete[] channel; channel = new TMixerChannel[mixerNumAllocatedChannels]; delete[] newChannel; newChannel = new TMixerChannel[mixerNumAllocatedChannels]; clearChannels(); } #if defined(MILKYTRACKER) || defined (__MPTIMETRACKING__) for (mp_uint32 i = 0; i < mixerNumAllocatedChannels; i++) channel[i].reallocTimeRecord(getNumBeatPackets()+1); #endif mixerLastNumAllocatedChannels = mixerNumAllocatedChannels; if (resamplerType != MIXER_INVALID && resamplerTable[resamplerType]) resamplerTable[resamplerType]->setNumChannels(mixerNumAllocatedChannels); } void ChannelMixer::clearChannels() { for (mp_uint32 i = 0; i < mixerNumAllocatedChannels; i++) { channel[i].clear(); newChannel[i].clear(); } } ChannelMixer::ChannelMixer(mp_uint32 numChannels, mp_uint32 frequency) : mixerNumAllocatedChannels(numChannels), mixerNumActiveChannels(numChannels), mixerLastNumAllocatedChannels(0), mixFrequency(0), mixbuffBeatPacket(NULL), mixBufferSize(0), channel(NULL), newChannel(NULL), resamplerType(MIXER_INVALID), paused(false), disableMixing(false), allowFilters(false), initialized(false), sampleCounter(0) { memset(resamplerTable, 0, sizeof(resamplerTable)); setFrequency(frequency); // full volume masterVolume = 256; panningSeparation = 256; for (mp_sint32 i = 0; i < NUMRESAMPLERTYPES; i++) { setFreqFuncTable[i] = &ChannelMixer::setChannelFrequency; resamplerTable[i] = NULL; } setResamplerType(MIXER_NORMAL); setBufferSize(BUFFERSIZE_DEFAULT); } ChannelMixer::~ChannelMixer() { if (initialized) { closeDevice(); } if (mixbuffBeatPacket) delete[] mixbuffBeatPacket; if (channel) delete[] channel; if (newChannel) delete[] newChannel; for (mp_uint32 i = 0; i < sizeof(resamplerTable) / sizeof(ResamplerBase*); i++) delete resamplerTable[i]; } void ChannelMixer::resetChannelsWithoutMuting() { mp_ubyte* isMuted = new mp_ubyte[mixerNumAllocatedChannels]; // save muting mp_uint32 i; for (i = 0; i < mixerNumAllocatedChannels; i++) isMuted[i] = (mp_ubyte)isChannelMuted(i); clearChannels(); for (i = 0; i < mixerNumAllocatedChannels; i++) muteChannel(i, isMuted[i] == 1); delete[] isMuted; lastBeatRemainder = 0; } void ChannelMixer::resetChannelsFull() { clearChannels(); lastBeatRemainder = 0; } void ChannelMixer::setResamplerType(ResamplerTypes type) { if (resamplerTable[type] == NULL) resamplerTable[type] = ResamplerFactory::createResampler(type); resamplerType = type; if (resamplerType != MIXER_INVALID && resamplerTable[resamplerType]) { resamplerTable[resamplerType]->setFrequency(mixFrequency); resamplerTable[resamplerType]->setNumChannels(mixerNumAllocatedChannels); } } void ChannelMixer::setNumChannels(mp_uint32 num) { if (num > mixerNumAllocatedChannels) { mixerNumAllocatedChannels = num; reallocChannels(); resetChannelsFull(); } else { mixerNumAllocatedChannels = num; resetChannelsWithoutMuting(); } } void ChannelMixer::setActiveChannels(mp_uint32 num) { if (num > mixerNumAllocatedChannels) { mixerNumAllocatedChannels = num; reallocChannels(); resetChannelsFull(); } mixerNumActiveChannels = num; } // Default lo precision calculations void ChannelMixer::setChannelFrequency(mp_sint32 c, mp_sint32 f) { channel[c].smpadd = ((mp_sint32)(((mp_int64)((mp_int64)f*(mp_int64)rMixFrequency))>>15))<<0; if (channel[c].smpadd) channel[c].rsmpadd = 0xFFFFFFFF/channel[c].smpadd; else channel[c].rsmpadd = 0; } void ChannelMixer::setFilterAttributes(mp_sint32 chn, mp_sint32 cutoff, mp_sint32 resonance) { if (!allowFilters || (channel[chn].cutoff == cutoff && channel[chn].resonance == resonance)) return; channel[chn].cutoff = cutoff; channel[chn].resonance = resonance; if (cutoff == MP_INVALID_VALUE || resonance == MP_INVALID_VALUE) return; // Thanks to DUMB for the filter coefficient computations const float LOG10 = 2.30258509299f; const mp_sint32 IT_ENVELOPE_SHIFT = 8; float a, b, c; { float sampfreq = this->mixFrequency; float inv_angle = (float)(sampfreq * pow(0.5, 0.25 + cutoff*(1.0/(24< 2.0f) d = 2.0f; d = (loss - d) * inv_angle; e = inv_angle * inv_angle; a = 1.0f / (1.0f + d + e); c = -e * a; b = 1.0f - a - c; #else a = 1.0f / (inv_angle*inv_angle + inv_angle*loss + loss); c = -(inv_angle*inv_angle) * a; b = 1.0f - a - c; #endif } channel[chn].a = (mp_sint32)(a * (1 << (MP_FILTERPRECISION+16))); channel[chn].b = (mp_sint32)(b * (1 << (MP_FILTERPRECISION+16))); channel[chn].c = (mp_sint32)(c * (1 << (MP_FILTERPRECISION+16))); } void ChannelMixer::playSample(mp_sint32 c, // channel mp_sbyte* smp, // sample buffer mp_sint32 smplen, // sample size mp_sint32 smpoffs, // sample offset mp_sint32 smpoffsfrac, bool smpOffsetWrap, mp_sint32 lstart, // loop start mp_sint32 len, // loop end mp_sint32 flags, bool ramp/* = true*/) { // doesn't play if (smp == NULL) return; // disable looping when loopstart = loopend if (lstart == len) { flags &= ~(3+32); lstart = 0; len = smplen; } // this is not allowed, assume bidir loop when both forward and biloop settings are made if ((flags & 3) == 3) flags &= ~1; // stupid check if artists are to stupid to use a valid sampleoffset // seems to be correct // treat bidir looped samples as normal samples if (((flags & 3) == 2) || !(flags&3)) { if (smpoffs >= len) { if (smpOffsetWrap) return; else { stopSample(c); return; } } } // below offset correction code only works for forward played samples // to-do: add offset correction code for bi-dir loops else if ((flags & 3) == 1) { if (smpOffsetWrap) { if (smpoffs > len) { smpoffs = ((smpoffs - lstart)%(len-lstart))+lstart; } else if (smpoffs == len && smpoffsfrac) { smpoffs = lstart; } } else { if (smpoffs >= len) { stopSample(c); return; } } } // play sample but don't ramp volume if (!ramp) { channel[c].sample=(mp_sbyte*)smp; channel[c].smplen = smplen; channel[c].loopstart=lstart; channel[c].loopend=len; if (flags & MP_SAMPLE_BACKWARD) channel[c].smppos = smplen - smpoffs; else channel[c].smppos = smpoffs; channel[c].smpposfrac = smpoffsfrac; channel[c].flags&=~MP_SAMPLE_FADEOFF; channel[c].flags=flags|MP_SAMPLE_PLAY|(channel[c].flags&MP_SAMPLE_MUTE); channel[c].currsample = channel[c].prevsample = 0; channel[c].fixedtime = 0; channel[c].fixedtimefrac = smpoffsfrac; } // currently no sample playing on that channel else if (!(channel[c].flags&MP_SAMPLE_PLAY)) { channel[c].sample=(mp_sbyte*)smp; channel[c].smplen = smplen; channel[c].loopstart=lstart; channel[c].loopend=len; if (flags & MP_SAMPLE_BACKWARD) channel[c].smppos = smplen - smpoffs; else channel[c].smppos = smpoffs; channel[c].smpposfrac = smpoffsfrac; channel[c].flags&=~MP_SAMPLE_FADEOFF; channel[c].flags=flags|MP_SAMPLE_PLAY|(channel[c].flags&MP_SAMPLE_MUTE)|MP_SAMPLE_FADEIN; // if a new sample is played, its volume is ramped from zero to current volume channel[c].finalvoll = 0; channel[c].finalvolr = 0; // one shot looping sample? if (flags & 32) { // Not looping yet channel[c].flags &= ~(3+32); channel[c].flags |= MP_SAMPLE_ONESHOT; if (flags & MP_SAMPLE_BACKWARD) { channel[c].loopendcopy = channel[c].loopstart; channel[c].loopstart = 0; } else { channel[c].loopendcopy = channel[c].loopend; channel[c].loopend = channel[c].smplen; } } channel[c].currsample = channel[c].prevsample = 0; channel[c].fixedtime = 0; channel[c].fixedtimefrac = smpoffsfrac; } // there is a sample playing on that channel, ramp volume of current sample down // then play new sample and ramp volume up else { newChannel[c].sample=(mp_sbyte*)smp; newChannel[c].smplen = smplen; newChannel[c].loopstart = lstart; newChannel[c].loopend = len; if (flags & MP_SAMPLE_BACKWARD) newChannel[c].smppos = smplen - smpoffs; else newChannel[c].smppos = smpoffs; newChannel[c].smpposfrac = smpoffsfrac; newChannel[c].flags=flags|MP_SAMPLE_PLAY|(channel[c].flags&MP_SAMPLE_MUTE); // if a new sample is played, its volume is ramped from zero to current volume newChannel[c].finalvoll = newChannel[c].finalvolr = 0; newChannel[c].currsample = newChannel[c].prevsample = 0; newChannel[c].fixedtime = 0; newChannel[c].fixedtimefrac = smpoffsfrac; // "fade off" current sample channel[c].flags = (channel[c].flags&~(MP_SAMPLE_FADEOUT|MP_SAMPLE_FADEIN|MP_SAMPLE_FADEOFF))|MP_SAMPLE_FADEOUT; // one shot looping sample? if (flags & 32) { // Not looping yet newChannel[c].flags &= ~(3+32); newChannel[c].flags |= MP_SAMPLE_ONESHOT; if (flags & MP_SAMPLE_BACKWARD) { newChannel[c].loopendcopy = newChannel[c].loopstart; newChannel[c].loopstart = 0; } else { newChannel[c].loopendcopy = newChannel[c].loopend; newChannel[c].loopend = newChannel[c].smplen; } } } } static inline void storeTimeRecordData(mp_sint32 nb, ChannelMixer::TMixerChannel* chn) { if (!(chn->flags & ChannelMixer::MP_SAMPLE_PLAY)) { if (chn->timeRecord) { chn->timeRecord[nb].flags = chn->flags; chn->timeRecord[nb].sample = NULL; chn->timeRecord[nb].volPan = 128 << 16; chn->timeRecord[nb].smppos = -1; } } else { if (chn->timeRecord) { chn->timeRecord[nb].flags = chn->flags; chn->timeRecord[nb].sample = chn->sample; chn->timeRecord[nb].smppos = chn->smppos; chn->timeRecord[nb].volPan = chn->vol + (chn->pan << 16); chn->timeRecord[nb].smpposfrac = chn->smpposfrac; chn->timeRecord[nb].smpadd = chn->smpadd; chn->timeRecord[nb].smplen = chn->smplen; if (chn->flags & ChannelMixer::MP_SAMPLE_ONESHOT) chn->timeRecord[nb].loopend = chn->loopendcopy; else chn->timeRecord[nb].loopend = chn->loopend; chn->timeRecord[nb].loopstart = chn->loopstart; chn->timeRecord[nb].fixedtime = chn->fixedtime; chn->timeRecord[nb].fixedtimefrac = chn->fixedtimefrac; } } } void ChannelMixer::mix(mp_sint32* mixbuff32, mp_uint32 bufferSize) { updateSampleCounter(bufferSize); if (!isPlaying()) return; if (!paused) { mp_sint32* buffer = mixbuff32; mp_sint32 beatLength = beatPacketSize; mp_sint32 mixSize = mixBufferSize; mp_sint32 done = 0; if (lastBeatRemainder) { mp_sint32 todo = lastBeatRemainder; if (lastBeatRemainder > mixBufferSize) { todo = mixBufferSize; mp_uint32 pos = beatLength - lastBeatRemainder; //memcpy(buffer, mixbuffBeatPacket + pos*MP_NUMCHANNELS, todo*MP_NUMCHANNELS*sizeof(mp_sint32)); const mp_sint32* src = mixbuffBeatPacket + pos*MP_NUMCHANNELS; mp_sint32* dst = buffer; for (mp_sint32 i = 0; i < todo*MP_NUMCHANNELS; i++, src++, dst++) *dst += *src; done = mixBufferSize; lastBeatRemainder-=done; } else { mp_uint32 pos = beatLength - lastBeatRemainder; //memcpy(buffer, mixbuffBeatPacket + pos*MP_NUMCHANNELS, todo*MP_NUMCHANNELS*sizeof(mp_sint32)); const mp_sint32* src = mixbuffBeatPacket + pos*MP_NUMCHANNELS; mp_sint32* dst = buffer; for (mp_sint32 i = 0; i < todo*MP_NUMCHANNELS; i++, src++, dst++) *dst += *src; buffer+=lastBeatRemainder*MP_NUMCHANNELS; mixSize-=lastBeatRemainder; done = lastBeatRemainder; lastBeatRemainder = 0; } } if (done < (mp_sint32)mixBufferSize) { const mp_sint32 numbeats = /*numBeatPackets*/mixSize / beatLength; done+=numbeats*beatLength; mp_sint32 nb; const bool isRamping = this->isRamping(); for (nb=0;nbmixerNumActiveChannels; if (allowFilters) { // this is crucial for volume ramping, store current // active sample rate (stored in the step values for each channel) // and also filter coefficients and last samples for (mp_uint32 c = 0; c < mixerNumActiveChannels; c++, src++, dst++) { dst->smpadd = src->smpadd; dst->rsmpadd = src->rsmpadd; dst->a = src->a; dst->b = src->b; dst->c = src->c; dst->currsample = src->currsample; dst->prevsample = src->prevsample; } } else { // this is crucial for volume ramping, store current // active sample rate (stored in the step values for each channel) // and also filter coefficients and last samples for (mp_uint32 c = 0; c < mixerNumActiveChannels; c++, src++, dst++) { dst->smpadd = src->smpadd; dst->rsmpadd = src->rsmpadd; } } } timer(nb); if (!disableMixing) { // do some in between state recording // to be able to show smooth updates even if the buffer is large for (mp_uint32 c=0;cmixerNumActiveChannels; if (allowFilters) { // this is crucial for volume ramping, store current // active sample rate (stored in the step values for each channel) // and also filter coefficients and last samples for (mp_uint32 c = 0; c < mixerNumActiveChannels; c++, src++, dst++) { dst->smpadd = src->smpadd; dst->rsmpadd = src->rsmpadd; dst->a = src->a; dst->b = src->b; dst->c = src->c; dst->currsample = src->currsample; dst->prevsample = src->prevsample; } } else { // this is crucial for volume ramping, store current // active sample rate (stored in the step values for each channel) // and also filter coefficients and last samples for (mp_uint32 c = 0; c < mixerNumActiveChannels; c++, src++, dst++) { dst->smpadd = src->smpadd; dst->rsmpadd = src->rsmpadd; } } } timer(numbeats); if (!disableMixing) { // do some in between state recording // to be able to show smooth updates even if the buffer is large for (mp_uint32 c=0;cmixBufferSize == bufferSize) return 0; if (initialized) { mp_sint32 err = closeDevice(); if (err != 0) return err; } this->mixBufferSize = bufferSize; // channels contain information depending up the buffer size // update those too reallocChannels(); return 0; } mp_sint32 ChannelMixer::getNumActiveChannels() { mp_sint32 i = 0; for (mp_uint32 j = 0; j < mixerNumActiveChannels; j++) if (channel[j].flags & 256) i++; return i; } mp_sint32 ChannelMixer::getBeatIndexFromSamplePos(mp_uint32 smpPos) const { mp_sint32 maxLen = (mixBufferSize/beatPacketSize)-1; if (maxLen < 0) maxLen = 0; mp_sint32 maxSize = maxLen*(mp_sint32)beatPacketSize - 1; if (maxSize < 0) maxSize = 0; if ((signed)smpPos < 0) smpPos = 0; if (smpPos > (unsigned)maxSize) smpPos = maxSize; return smpPos / getBeatPacketSize(); } /*mp_sint32 ChannelMixer::getCurrentSample(mp_sint32 position,mp_sint32 channel) { if (position < 0) { position = abs(position); } if (position > (mp_sint32)mixBufferSize-1) { position %= mixBufferSize*2; position -= mixBufferSize; position = mixBufferSize-1-position; } mp_sint32 val = (mp_sword)mixbuff32[position*MP_NUMCHANNELS+channel]; if (val < -32768) val = -32768; if (val > 32767) val = 32767; return val; } mp_sint32 ChannelMixer::getCurrentSamplePeak(mp_sint32 position,mp_sint32 channel) { if (audioDriver->supportsTimeQuery()) { mp_sword peak = 0; for (mp_sint32 p = position-mixBufferSize; p <= position; p++) { mp_sword s = getCurrentSample(p, channel); if (s > peak) peak = s; if (-s > peak) peak = -s; } return peak; } else { mp_sword peak = 0; for (mp_uint32 pos = 0; pos < mixBufferSize; pos++) { mp_sint32 s = mixbuff32[pos*MP_NUMCHANNELS+channel]; if (s < -32768) s = -32768; if (s > 32767) s = 32767; if (s > peak) peak = s; if (-s > peak) peak = -s; } return peak; } }*/ mp_uint32 ChannelMixer::getSyncSampleCounter() { /*return audioDriver->getNumPlayedSamples();*/ return 0; } #ifdef __MPTIMETRACKING__ #define FULLMIXER_8BIT_NORMAL_TEMP \ if (sample) { \ sd1 = ((mp_sbyte)sample[smppos])<<8; \ sd2 = ((mp_sbyte)sample[smppos+1])<<8; \ sd1 =((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; \ buffer[i] = (sd1*vol)>>9; \ } \ else buffer[i] = 0; \ i++; #define FULLMIXER_16BIT_NORMAL_TEMP \ if (sample) { \ sd1 = ((mp_sword*)(sample))[smppos]; \ sd2 = ((mp_sword*)(sample))[smppos+1]; \ sd1 =((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; \ buffer[i] = (sd1*vol)>>9; \ } \ else buffer[i] = 0; \ i++; #include "ResamplerMacros.h" ///////////////////////////////////////////////////////// // SIMPLE MIXER, NO INTERPOLATION, NO RAMPING // ///////////////////////////////////////////////////////// class ResamplerDummy : public ChannelMixer::ResamplerBase { private: mp_sint32 vol; public: ResamplerDummy(mp_sint32 vol) : vol(vol) { } virtual bool isRamping() { return false; } virtual bool supportsFullChecking() { return true; } virtual bool supportsNoChecking() { return false; } virtual void addBlockFull(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 vol = this->vol; mp_sint32 i = 0; FULLMIXER_TEMPLATE(FULLMIXER_8BIT_NORMAL_TEMP,FULLMIXER_16BIT_NORMAL_TEMP, 16, 0); } }; void ChannelMixer::mixData(mp_sint32 c, mp_sint32* buffer, mp_sint32 count, mp_sint32 sampleShift, mp_sint32 fMul/* = 0*/, mp_sint32 bufferIndex/* = -1*/, mp_sint32 packetIndex/* = -1*/) const { if (fMul == 0) fMul = count; if (packetIndex < 0) packetIndex = 0; const ChannelMixer::TMixerChannel* tempchn = &channel[c]; ChannelMixer::TMixerChannel channel; channel.flags = tempchn->timeRecord[packetIndex].flags; channel.sample = tempchn->timeRecord[packetIndex].sample; channel.smppos = tempchn->timeRecord[packetIndex].smppos; channel.smpposfrac = tempchn->timeRecord[packetIndex].smpposfrac; channel.smpadd = tempchn->timeRecord[packetIndex].smpadd; channel.smplen = tempchn->timeRecord[packetIndex].smplen; channel.loopend = channel.loopendcopy = tempchn->timeRecord[packetIndex].loopend; channel.loopstart = tempchn->timeRecord[packetIndex].loopstart; channel.vol = tempchn->timeRecord[packetIndex].volPan & 0xFFFF; channel.pan = tempchn->timeRecord[packetIndex].volPan >> 16; ChannelMixer::TMixerChannel* chn = &channel; if (startPlay && (chn->flags & MP_SAMPLE_PLAY)) { chn->smpadd = (chn->smpadd*fMul) / (count ? count : 1); mp_sint32 vol = (chn->vol*masterVolume) >> (8 + sampleShift); ResamplerDummy resampler(vol); resampler.addBlockFull(buffer, chn, count); } else { memset(buffer, 0, sizeof(mp_sint32)*count); } } #endif milkytracker-0.90.85+dfsg/src/milkyplay/MasterMixer.cpp0000644000175000017500000003171611163403715022202 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * MasterMixer.cpp * MilkyPlay * * Created by Peter Barth on 14.12.07. * */ #include "MasterMixer.h" #include "MilkyPlayCommon.h" #include "AudioDriverBase.h" #include "AudioDriverManager.h" enum { BlockTimeOut = 5000 }; MasterMixer::MasterMixer(mp_uint32 sampleRate, mp_uint32 bufferSize/* = 0*/, mp_uint32 numDevices/* = 1*/, AudioDriverInterface* audioDriver/* = 0*/) : listener(0), sampleRate(sampleRate), bufferSize(bufferSize), buffer(0), sampleShift(0), disableMixing(false), numDevices(numDevices), filterHook(0), devices(new DeviceDescriptor[numDevices]), audioDriverManager(0), audioDriver(audioDriver), initialized(false), started(false), paused(false) { } MasterMixer::~MasterMixer() { cleanup(); delete audioDriverManager; delete[] devices; } void MasterMixer::setMasterMixerNotificationListener(MasterMixerNotificationListener* listener) { this->listener = listener; } mp_sint32 MasterMixer::openAudioDevice() { if (initialized) return 0; if (audioDriver == 0) { if (audioDriverManager == 0) audioDriverManager = new AudioDriverManager(); audioDriver = audioDriverManager->getPreferredAudioDriver(); } if (bufferSize == 0) { bufferSize = audioDriver->getPreferredBufferSize(); notifyListener(MasterMixerNotificationBufferSizeChanged); } cleanup(); mp_sint32 res = audioDriver->initDevice(bufferSize*MP_NUMCHANNELS, sampleRate, this); if (res < 0) return res; if (res > 0) { // if the result is positive it reflects the number of 16 bit words // in the obtained buffer => divide by MP_NUMCHANNELS is the correct buffer size bufferSize = res / MP_NUMCHANNELS; notifyListener(MasterMixerNotificationBufferSizeChanged); } if (audioDriver->getMixFrequency() != sampleRate) { sampleRate = audioDriver->getMixFrequency(); notifyListener(MasterMixerNotificationSampleRateChanged); } buffer = new mp_sint32[bufferSize*MP_NUMCHANNELS]; initialized = true; return 0; } mp_sint32 MasterMixer::closeAudioDevice() { if (started) stop(); if (!initialized) return 0; mp_sint32 res = 0; if (audioDriver) { res = audioDriver->closeDevice(); if (res == 0) initialized = false; } else { initialized = false; } return res; } mp_sint32 MasterMixer::start() { if (started) return 0; mp_sint32 res = 0; if (!initialized) { res = openAudioDevice(); if (res < 0) return res; } res = audioDriver->start(); if (res != 0) return res; started = true; return 0; } mp_sint32 MasterMixer::stop() { if (!started) return 0; mp_sint32 res = audioDriver->stop(); if (res == 0) started = false; return res; } mp_sint32 MasterMixer::pause() { mp_sint32 res = audioDriver->pause(); paused = true; return res; } mp_sint32 MasterMixer::resume() { paused = false; return audioDriver->resume(); } mp_sint32 MasterMixer::setBufferSize(mp_uint32 bufferSize) { if (bufferSize != this->bufferSize) { mp_sint32 res = closeAudioDevice(); if (res != 0) return res; this->bufferSize = bufferSize; delete[] buffer; buffer = NULL; notifyListener(MasterMixerNotificationBufferSizeChanged); } return 0; } mp_sint32 MasterMixer::setSampleRate(mp_uint32 sampleRate) { if (sampleRate != this->sampleRate) { mp_sint32 res = closeAudioDevice(); if (res != 0) return res; this->sampleRate = sampleRate; notifyListener(MasterMixerNotificationSampleRateChanged); } return 0; } bool MasterMixer::addDevice(Mixable* device, bool paused/* = false*/) { for (mp_uint32 i = 0; i < numDevices; i++) { if (devices[i].mixable == NULL) { devices[i].mixable = device; devices[i].markedForRemoval = false; devices[i].markedForPause = false; devices[i].paused = paused; return true; } } return false; } bool MasterMixer::removeDevice(Mixable* device, bool blocking/* = true*/) { for (mp_uint32 i = 0; i < numDevices; i++) { if (devices[i].mixable == device) { if (!started) { devices[i].markedForRemoval = false; devices[i].mixable = 0; return true; } devices[i].markedForRemoval = true; if (blocking) { // this is going to loop infinitely when the audio device is not running double waitMillis = ((double)(bufferSize/2) / (double)sampleRate) * 1000.0 * 2.0; if (waitMillis < 1.0) waitMillis = 1.0; if (waitMillis > (double)BlockTimeOut) waitMillis = (double)BlockTimeOut; mp_uint32 time = 0; const mp_uint32 sleepTime = 10; while (devices[i].mixable && time < (mp_uint32)waitMillis) { audioDriver->msleep(sleepTime); time+=sleepTime; } // timeout if (time >= waitMillis && devices[i].mixable) { devices[i].mixable = 0; devices[i].markedForRemoval = false; } } return true; } } return false; } bool MasterMixer::isDeviceRemoved(Mixable* device) { for (mp_uint32 i = 0; i < numDevices; i++) { if (devices[i].mixable == device) { return false; } } return true; } bool MasterMixer::pauseDevice(Mixable* device, bool blocking/* = true*/) { for (mp_uint32 i = 0; i < numDevices; i++) { if (devices[i].mixable == device) { if (!started) { devices[i].markedForPause = false; devices[i].paused = true; return true; } devices[i].markedForPause = true; if (blocking) { // this is going to loop infinitely when the audio device is not running double waitMillis = ((double)(bufferSize/2) / (double)sampleRate) * 1000.0 * 2.0; if (waitMillis < 1.0) waitMillis = 1.0; if (waitMillis > (double)BlockTimeOut) waitMillis = (double)BlockTimeOut; mp_uint32 time = 0; const mp_uint32 sleepTime = 10; while (!devices[i].paused && time < (mp_uint32)waitMillis) { audioDriver->msleep(sleepTime); time+=sleepTime; } // timeout if (time >= waitMillis && !devices[i].paused) { devices[i].paused = true; devices[i].markedForPause = false; } } return true; } } return false; } bool MasterMixer::resumeDevice(Mixable* device) { for (mp_uint32 i = 0; i < numDevices; i++) { if (devices[i].mixable == device && devices[i].paused) { devices[i].paused = false; return true; } } return false; } bool MasterMixer::isDevicePaused(Mixable* device) { for (mp_uint32 i = 0; i < numDevices; i++) { if (devices[i].mixable == device) { return devices[i].paused; } } return false; } void MasterMixer::mixerHandler(mp_sword* buffer) { if (!disableMixing) prepareBuffer(); const register mp_sint32 numDevices = this->numDevices; const register mp_uint32 bufferSize = this->bufferSize; mp_sint32* mixBuffer = this->buffer; DeviceDescriptor* device = this->devices; for (mp_sint32 i = 0; i < numDevices; i++, device++) { if (device->markedForRemoval && device->mixable) { device->markedForRemoval = false; device->mixable = 0; } else if (device->mixable && device->markedForPause) { device->markedForPause = false; device->paused = true; } else if (device->mixable && !device->paused) { device->mixable->mix(mixBuffer, bufferSize); } } if (!disableMixing) swapOutBuffer(buffer); } void MasterMixer::notifyListener(MasterMixerNotifications notification) { if (listener) listener->masterMixerNotification(notification); } void MasterMixer::cleanup() { if (started) stop(); if (initialized) closeAudioDevice(); if (buffer) { delete[] buffer; buffer = 0; } } inline void MasterMixer::prepareBuffer() { memset(buffer, 0, bufferSize*MP_NUMCHANNELS*sizeof(mp_sint32)); } inline void MasterMixer::swapOutBuffer(mp_sword* bufferOut) { if (filterHook) filterHook->mix(buffer, bufferSize); register mp_sint32* bufferIn = buffer; const register mp_sint32 sampleShift = this->sampleShift; const register mp_sint32 lowerBound = -((128<bufferSize*MP_NUMCHANNELS; for (mp_sint32 i = 0; i < bufferSize; i++) { mp_sint32 b = *bufferIn++; if (b>upperBound) b = upperBound; else if (b>sampleShift; } /* mp_sint32* buffer32 = mixbuff32; mp_sint32 lsampleShift = sampleShift; mp_sint32 lowerBound = -((128<upperBound) b = upperBound; else if (b>lsampleShift; } } else { lsampleShift = sampleShift; lowerBound = -((128<upperBound) { if (abs(b) > lastPeakValue) lastPeakValue = abs(b); b = upperBound; } else if (b lastPeakValue) lastPeakValue = abs(b); b = lowerBound; } *buffer16++ = b>>lsampleShift; } if (lastPeakValue) { float v = 32768.0f*(1< 256) masterVolume = 256; } //else //{ // masterVolume = 256; // sampleShift = 0; //} }*/ } const char* MasterMixer::getCurrentAudioDriverName() const { if (audioDriver) return audioDriver->getDriverID(); return NULL; } bool MasterMixer::setCurrentAudioDriverByName(const char* name) { bool result = true; if (audioDriverManager == 0) audioDriverManager = new AudioDriverManager(); AudioDriverInterface* newAudioDriver = audioDriverManager->getAudioDriverByName(name); if (newAudioDriver == 0) { newAudioDriver = audioDriverManager->getPreferredAudioDriver(); result = false; } // Same instance, don't allocate new audio driver if (audioDriver == newAudioDriver) return result; mp_sint32 err = 0; if (initialized) { err = closeAudioDevice(); } audioDriver = newAudioDriver; return result; } const AudioDriverManager* MasterMixer::getAudioDriverManager() const { if (audioDriverManager == 0) audioDriverManager = new AudioDriverManager(); return audioDriverManager; } mp_sint32 MasterMixer::getCurrentSample(mp_sint32 position, mp_sint32 channel) { if (position < 0) { position = abs(position); } if (position > (mp_sint32)bufferSize-1) { position %= bufferSize*2; position -= bufferSize; position = bufferSize-1-position; } mp_sint32 val = (mp_sword)this->buffer[position*MP_NUMCHANNELS+channel]; if (val < -32768) val = -32768; if (val > 32767) val = 32767; return val; } mp_sint32 MasterMixer::getCurrentSamplePeak(mp_sint32 position, mp_sint32 channel) { if (audioDriver == 0) return 0; const mp_uint32 mixBufferSize = bufferSize; const mp_sint32* mixbuff32 = this->buffer; if (audioDriver->supportsTimeQuery()) { mp_sword peak = 0; for (mp_sint32 p = position-mixBufferSize; p <= position; p++) { mp_sword s = getCurrentSample(p, channel); if (s > peak) peak = s; if (-s > peak) peak = -s; } return peak; } else { mp_sword peak = 0; for (mp_uint32 pos = 0; pos < mixBufferSize; pos++) { mp_sint32 s = mixbuff32[pos*MP_NUMCHANNELS+channel]; if (s < -32768) s = -32768; if (s > 32767) s = 32767; if (s > peak) peak = s; if (-s > peak) peak = -s; } return peak; } } milkytracker-0.90.85+dfsg/src/milkyplay/Loaders.h0000644000175000017500000001007311163403715020771 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Loaders.h * MilkyPlay * * Created by Peter Barth on Tue Oct 19 2004. * */ #ifndef __LOADERS_H__ #define __LOADERS_H__ #include "XModule.h" #include "LittleEndian.h" // i'm a lazy guy #define DECLARE_LOADERCLASS(LOADERNAME) \ class LOADERNAME : public XModule::LoaderInterface \ { \ public: \ const char* identifyModule(const mp_ubyte* buffer); \ mp_sint32 load(XMFileBase& f, XModule* module); \ }; \ DECLARE_LOADERCLASS(Loader669) // 669 Composer (Uses special FAR Player) DECLARE_LOADERCLASS(LoaderAMF_1) // Asylum Music Format 1.0 DECLARE_LOADERCLASS(LoaderAMF_2) // Digital Sound And Music Interface (DMP module format) DECLARE_LOADERCLASS(LoaderAMSv1) // Extreme Tracker AMS DECLARE_LOADERCLASS(LoaderAMSv2) // Velvet Studio AMS DECLARE_LOADERCLASS(LoaderDBM) // Digibooster Pro DECLARE_LOADERCLASS(LoaderCBA) // Chuck Biscuits / Black Artist special format (only one Music Disk) DECLARE_LOADERCLASS(LoaderDIGI) // Digibooster 1.x DECLARE_LOADERCLASS(LoaderDSMv1) // old digisound interface kit DECLARE_LOADERCLASS(LoaderDSMv2) // new digisound interface kit DECLARE_LOADERCLASS(LoaderDSm) // dynamic studio DECLARE_LOADERCLASS(LoaderDTM_1) // Digitrekker 3.0 (NOT DigiTrakker!!!) DECLARE_LOADERCLASS(LoaderDTM_2) // Digital Tracker DECLARE_LOADERCLASS(LoaderFAR) // Farandole Composer (Uses special Player) //DECLARE_LOADERCLASS(LoaderFNK) DECLARE_LOADERCLASS(LoaderGDM) // General Digimusic DECLARE_LOADERCLASS(LoaderGMC) // Game Music Creator (very similiar to SoundTracker, 15 ins, kept in LoaderMOD.cpp) DECLARE_LOADERCLASS(LoaderIMF) // Imago Orpheus DECLARE_LOADERCLASS(LoaderIT) // Impulse Tracker DECLARE_LOADERCLASS(LoaderMDL) // Digitrakker 2.0/3.0 DECLARE_LOADERCLASS(LoaderMOD) // Protracker and compatible (1..32 channels) DECLARE_LOADERCLASS(LoaderMTM) // MultiTracker DECLARE_LOADERCLASS(LoaderMXM) // Cubic Tiny XM DECLARE_LOADERCLASS(LoaderOKT) // Oktalyzer DECLARE_LOADERCLASS(LoaderPLM) // DisorderTracker II DECLARE_LOADERCLASS(LoaderPSMv1) // old Epic MegaGames MASI (Epic Pinball, ...) DECLARE_LOADERCLASS(LoaderPSMv2) // new Epic MegaGames MASI (Jazz Jack Rabbit, ...) DECLARE_LOADERCLASS(LoaderPTM) // PolyTracker DECLARE_LOADERCLASS(LoaderS3M) // ScreamTracker III DECLARE_LOADERCLASS(LoaderSTM) // ScreamTracker II DECLARE_LOADERCLASS(LoaderSFX) // SoundFX module (very similiar to SoundTracker, 15 ins, kept in LoaderMOD.cpp) DECLARE_LOADERCLASS(LoaderULT) // Ultratracker DECLARE_LOADERCLASS(LoaderUNI) // MikMod internal module DECLARE_LOADERCLASS(LoaderXM) // FT2 Extended Module #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderMXM.cpp0000644000175000017500000005473211163403715021535 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderMXM.cpp * MilkyPlay Module Loader: Cubic Tiny XM (.MXM) * * -------------------------------- * Version History: * -------------------------------- * 07/30/05: Added the worst hack ever to load original orbitalism.mxm by netpoet * 11/23/04: Corrected bugs in 16 bit support, added new MXM format (Elitegroup modifications) * 11/17/04: First work */ #include "Loaders.h" //#define FR_HACK //#define VERBOSE ///////////////////////////////////////////////////// // MXM structures ///////////////////////////////////////////////////// struct TMXMHeader { mp_uint32 sig; mp_uint32 ordnum; mp_uint32 restart; mp_uint32 channum; mp_uint32 patnum; mp_uint32 insnum; mp_ubyte tempo; mp_ubyte speed; mp_uword opt; mp_uint32 sampstart; mp_uint32 samples8; mp_uint32 samples16; mp_sint32 lowpitch; mp_sint32 highpitch; mp_ubyte panpos[32]; }; struct TMXMInstrument { mp_uint32 sampnum; mp_ubyte snum[96]; mp_uword volfade; mp_ubyte vibtype, vibsweep, vibdepth, vibrate; mp_ubyte vnum, vsustain, vloops, vloope; mp_uword venv[12][2]; mp_ubyte pnum, psustain, ploops, ploope; mp_uword penv[12][2]; mp_ubyte res[46]; }; struct TMXMSample { mp_uword gusstartl; mp_ubyte gusstarth; mp_uword gusloopstl; mp_ubyte gusloopsth; mp_uword gusloopendl; mp_ubyte gusloopendh; mp_ubyte gusmode; mp_ubyte vol; mp_ubyte pan; mp_uword relpitch; mp_ubyte res[2]; }; /*struct TMXMSampleNew { unsigned long loopstart; unsigned long end; mp_ubyte gusmode; mp_ubyte vol; mp_ubyte pan; mp_uword relpitch; mp_uword offsindex; mp_ubyte res; };*/ struct TNoteSlot { mp_ubyte Note,Ins,Vol,Eff,Op; }; const char* LoaderMXM::identifyModule(const mp_ubyte* buffer) { // check for .MXM module first if (!memcmp(buffer,"MXM",3)) { return "MXM"; } // this is not an .MXM return NULL; } ////////////////////////////////////////////////////// // load fasttracker II extended module // return: 0 = no error // -7 = out of memory // -8 = other ////////////////////////////////////////////////////// mp_sint32 LoaderMXM::load(XMFileBase& f, XModule* module) { TMXMHeader MXMHeader; TMXMInstrument MXMIns; TMXMSample MXMSmp; TNoteSlot Row[32]; mp_ubyte packbyte,*smpbuffer; mp_sword *smpbuffer16; mp_ubyte note,ins,vol,eff,op,b1; mp_sword b1_2; mp_uint32 patofs[256]; mp_uint32 insofs[128]; mp_uint32* smpofs = new mp_uint32[2048]; if (smpofs == NULL) return -7; mp_uint32 inscnt,smpcnt,patcnt,rowcnt,x,y,z; mp_uint32 numrows,j,i; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_uword* lut = new mp_uword[65536]; if (lut == NULL) { delete[] smpofs; return -7; } // calculate nifty table :) for (i = 0; i < 256; i++) for (j = 0; j < 256; j++) lut[i*256+j] = (mp_uword)((i-96)*256+(j-128)*2); //fread(&MXMHeader,1,sizeof(TMXMHeader),f); MXMHeader.sig = f.readDword(); MXMHeader.ordnum = f.readDword(); MXMHeader.restart = f.readDword(); MXMHeader.channum = f.readDword(); MXMHeader.patnum = f.readDword(); MXMHeader.insnum = f.readDword(); MXMHeader.tempo = f.readByte(); MXMHeader.speed = f.readByte(); MXMHeader.opt = f.readWord(); MXMHeader.sampstart = f.readDword(); MXMHeader.samples8 = f.readDword(); MXMHeader.samples16 = f.readDword(); MXMHeader.lowpitch = f.readDword(); MXMHeader.highpitch = f.readDword(); f.read(MXMHeader.panpos,1,32); f.read(&header->ord, 1, 256); memcpy(&header->sig, &MXMHeader.sig, 3); strcpy(header->tracker,"..converted.."); header->ordnum = (mp_uword)MXMHeader.ordnum; header->restart = (mp_uword)MXMHeader.restart; header->channum = (mp_uword)MXMHeader.channum; header->patnum = (mp_uword)MXMHeader.patnum; header->insnum = (mp_uword)MXMHeader.insnum; header->tempo = MXMHeader.tempo; header->speed = MXMHeader.speed; header->freqtab = MXMHeader.opt&1; header->mainvol = 255; header->flags = XModule::MODULE_XMNOTECLIPPING | XModule::MODULE_XMARPEGGIO | XModule::MODULE_XMPORTANOTEBUFFER | XModule::MODULE_XMVOLCOLUMNVIBRATO; header->uppernotebound = 119; f.readDwords(insofs,512/4); f.readDwords(patofs,1024/4); // old version mp_uint32 mxmVer = 0; // detect MXM version mp_uint32 curPos = f.posWithBaseOffset(); // read number of samples for first instrument mp_uint32 dummy = f.readDword(); // must be smaller or equal 16 if (dummy <= 16) { mp_ubyte nbu[96]; // read sample layout f.read(nbu, 1, 96); for (i = 0; i < 96; i++) if (nbu[i] > (dummy-1)) { // invalid entry => should be new version of MXM format mxmVer = 1; break; } } else mxmVer = 1; f.seekWithBaseOffset(curPos); // read smp offsets for MXM format rev. 2 if (mxmVer == 1) f.readDwords(smpofs,2048); #ifdef FR_HACK ////////// blabla { fpos_t filesize; mxmVer = 1; static char hexTab[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char fileName[] = "/Volumes/192.168.1.3/deus-ex - MXM ohne Samples.rar Folder/xx.wav"; mp_sint32 size = 0; for (i = 1; i <= 0x15; i++) { fileName[59] = hexTab[(i>>4)&0xf]; fileName[60] = hexTab[i&0xf]; FILE *f = fopen(fileName,"rb"); fseek(f,0,SEEK_END); fgetpos(f,&filesize); fclose(f); smpofs[i-1] = size; size+=filesize - 44; } } ///////////////// #endif /////////////////////////////////////////////////// // read instruments /////////////////////////////////////////////////// mp_sint32 sampleIndex = 0; mp_sint32 envelopeIndex = 0; mp_sint32 smpOffset16 = 0; bool correctSmpSize16 = false; mp_sint32 smpOffset8 = 0; bool correctSmpSize8 = false; for (inscnt=0;inscnt(MXMIns.sampnum-1)) instr[inscnt].snum[x] = 255; else instr[inscnt].snum[x] = nbu[x]+sampleIndex; TEnvelope venv; TEnvelope penv; memset(&venv,0,sizeof(venv)); memset(&penv,0,sizeof(penv)); if (MXMIns.vnum !=0 && MXMIns.vnum<24) { venv.num = MXMIns.vnum + 1; venv.type|=1; x=0; for (j = 0;j <= MXMIns.vnum; j++) { venv.env[j][0] = x; venv.env[j][1] = MXMIns.venv[j][1]; x+=MXMIns.venv[j][0]; } } if (MXMIns.vsustain < 24) { venv.type|=2; venv.sustain=MXMIns.vsustain; } if (MXMIns.vloope<24) { venv.type|=4; venv.loops=MXMIns.vloops; venv.loope=MXMIns.vloope; } if (MXMIns.pnum!=0 && MXMIns.pnum<24) { penv.num=MXMIns.pnum+1; penv.type|=1; x=0; for (j=0;j<=MXMIns.pnum;j++) { penv.env[j][0]=x; penv.env[j][1]=MXMIns.penv[j][1]; x+=MXMIns.penv[j][0]; } } if (MXMIns.psustain<24) { penv.type|=2; penv.sustain=MXMIns.psustain; } if (MXMIns.ploope<24) { penv.type|=4; penv.loops=MXMIns.ploops; penv.loope=MXMIns.ploope; } for (mp_sint32 l=0;l<24;l++) { venv.env[l][1]<<=2; penv.env[l][1]<<=2; } if (!module->addVolumeEnvelope(venv)) { delete[] lut; delete[] smpofs; return -7; } if (!module->addPanningEnvelope(penv)) { delete[] lut; delete[] smpofs; return -7; } //XMIns.volfade=MXMIns.volfade; //XMIns.vibsweep=MXMIns.vibsweep; //XMIns.vibdepth=MXMIns.vibdepth; //XMIns.vibrate=MXMIns.vibrate; //XMIns.vibtype=(MXMIns.vibtype==2)?1:(MXMIns.vibtype==3)?2:(MXMIns.vibtype==1)?3:0; //fwrite(&XMIns,1,sizeof(XMIns),f2); //fwrite(&XMIns.name,1,20,f2); for (smpcnt=0;smpcnt>2)&1) { smppos = (smpofs[sampleIndex]-MXMHeader.samples8-MXMHeader.sampstart)>>1; if (!smpOffset16) smpOffset16 = smpofs[sampleIndex]; if (smppos > (signed)MXMHeader.samples16) correctSmpSize16 = true; } else { smppos = (smpofs[sampleIndex]-MXMHeader.sampstart); if (!smpOffset8) smpOffset8 = smpofs[sampleIndex]; if (smppos > (signed)MXMHeader.samples8) correctSmpSize8 = true; } MXMSmp.gusstartl = (mp_uword)(smppos&0xFFFF); MXMSmp.gusstarth = (mp_ubyte)((smppos>>16)&0xFF); MXMSmp.gusloopstl = (mp_uword)(loopstart+smppos)&0xFFFF; MXMSmp.gusloopsth = (mp_ubyte)((loopstart+smppos)>>16)&0xFF; MXMSmp.gusloopendl = (mp_uword)(end+smppos)&0xFFFF; MXMSmp.gusloopendh = (mp_ubyte)((end+smppos)>>16)&0xFF; } else { delete[] lut; delete[] smpofs; return -8; } //fread(&MXMSmp,1,sizeof(MXMSmp),f); //memset(&XMSmp[0],0,sizeof(TXMSample)); smp[sampleIndex].samplen = ((mp_uint32)MXMSmp.gusstarth<<16)+(mp_uint32)MXMSmp.gusstartl; smp[sampleIndex].loopstart=((mp_uint32)MXMSmp.gusloopsth<<16)+(mp_uint32)MXMSmp.gusloopstl; smp[sampleIndex].looplen=((mp_uint32)MXMSmp.gusloopendh<<16)+(mp_uint32)MXMSmp.gusloopendl; smp[sampleIndex].vol = XModule::vol64to255(MXMSmp.vol); smp[sampleIndex].pan = MXMSmp.pan; bool bFound = false; mp_sint32 relNote = -1; mp_sint32 fineTune = -1; for (mp_sint32 i = 0; i < 256; i++) for (mp_sint32 j = 0; j < 256; j++) { if (lut[i*256+j] == MXMSmp.relpitch) { bFound = true; relNote = i-96; fineTune = j-128; break; } if (bFound) break; } if (!bFound) { relNote = fineTune = 0; } smp[sampleIndex].relnote = relNote; smp[sampleIndex].finetune = fineTune; y=(MXMSmp.gusmode>>3)&1; if (y) smp[sampleIndex].type=1; y=(MXMSmp.gusmode>>4)&1; if (y) smp[sampleIndex].type=2; y=(MXMSmp.gusmode>>2)&1; if (y) smp[sampleIndex].type|=16; sampleIndex++; } envelopeIndex++; } if (!correctSmpSize8) smpOffset8 = 0; if (!correctSmpSize16) smpOffset16 = 0; header->smpnum = sampleIndex; header->volenvnum = header->panenvnum = envelopeIndex; delete[] lut; /////////////////////////////////////////////////// // read patterns /////////////////////////////////////////////////// for (patcnt=0;patcntpatnum;patcnt++) { f.seekWithBaseOffset(patofs[patcnt]); numrows = f.readDword(); //pattern = new TNoteSlot[numrows*XMHeader.channum]; //if (pattern==NULL) { //cprintf("Pattern to big (%d)\n",numrows*XMHeader.channum*5); // exit(1); //} phead[patcnt].rows = numrows; phead[patcnt].effnum = 2; phead[patcnt].channum= (mp_ubyte)header->channum; phead[patcnt].patternData = new mp_ubyte[phead[patcnt].rows*header->channum*6]; // out of memory? if (phead[patcnt].patternData == NULL) { delete[] smpofs; return -7; } memset(phead[patcnt].patternData,0,phead[patcnt].rows*header->channum*6); z=0; for (rowcnt=0;rowcnt>5)&1; if (packbyte>0) { if (y) { note = f.readByte(); ins = f.readByte(); } y=(packbyte>>6)&1; if (y) { vol = f.readByte(); } y=(packbyte>>7)&1; if (y) { eff = f.readByte(); op = f.readByte(); if (eff>=36) { op=((eff-36)<<4)|op; eff=0xE; } } y=packbyte&0x1F; Row[y].Note=note; Row[y].Ins=ins; Row[y].Vol=vol; Row[y].Eff=eff; Row[y].Op=op; } } while (packbyte!=0); for (x=0;xchannum;x++) { /*pattern[z].Note=Row[x].Note; pattern[z].Ins=Row[x].Ins; pattern[z].Vol=Row[x].Vol; pattern[z].Eff=Row[x].Eff; pattern[z].Op=Row[x].Op;*/ mp_ubyte slot[5]; slot[0] = Row[x].Note; slot[1] = Row[x].Ins; slot[2] = Row[x].Vol; slot[3] = Row[x].Eff; slot[4] = Row[x].Op; // filter invalid effects // they could have a different meaning in my playercode bool valid = false; for (i=0;i64) bl=64; //slot[4]=(bl*261120)>>16; } if ((!slot[3])&&(slot[4])) slot[3]=0x20; if (slot[3]==0xE) { slot[3]=(slot[4]>>4)+0x30; slot[4]=slot[4]&0xf; } if (slot[3]==0x21) { slot[3]=(slot[4]>>4)+0x40; slot[4]=slot[4]&0xf; } if (slot[0]==97) slot[0]=XModule::NOTE_OFF; phead[patcnt].patternData[z]=slot[0]; phead[patcnt].patternData[z+1]=slot[1]; XModule::convertXMVolumeEffects(Row[x].Vol, phead[patcnt].patternData[z+2], phead[patcnt].patternData[z+3]); phead[patcnt].patternData[z+4]=slot[3]; phead[patcnt].patternData[z+5]=slot[4]; z+=6; } } } /////////////////////////////////////////////////// // read samples /////////////////////////////////////////////////// mp_uint32* gusstart = new mp_uint32[16*256]; mp_uint32* gusend = new mp_uint32[16*256]; mp_uint32* smpOffsets8 = new mp_uint32[256*16]; mp_uint32* smpOffsets16 = new mp_uint32[256*16]; smpbuffer = NULL; smpbuffer16 = NULL; #ifdef FR_HACK ////////// blabla { smpbuffer16 = new mp_sword[3220000>>1]; fpos_t filesize; mxmVer = 1; static char hexTab[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; char fileName[] = "/Volumes/192.168.1.3/deus-ex - MXM ohne Samples.rar Folder/xx.wav"; mp_sint32 size = 0; for (i = 1; i <= 0x15; i++) { fileName[59] = hexTab[(i>>4)&0xf]; fileName[60] = hexTab[i&0xf]; XMFile* f2 = new XMFile(fileName); filesize = f2->sizeWithBaseOffset(); f2->seekWithBaseOffset(44); f2->readWords(smpbuffer16+size, (filesize-44)>>1); delete f2; size+=(filesize-44)>>1; } goto hack; } #endif f.seekWithBaseOffset(MXMHeader.sampstart); if (smpOffset8) MXMHeader.samples8 = f.sizeWithBaseOffset() - f.posWithBaseOffset(); if (MXMHeader.samples8!=0) { smpbuffer = new mp_ubyte[MXMHeader.samples8]; if (smpbuffer==NULL) { //cprintf("Not enough memory for 8 bit samples (%u)",MXMHeader.samples8); delete[] gusstart; delete[] gusend; delete[] smpOffsets8; delete[] smpOffsets16; delete[] smpofs; return -7; } } if (smpOffset16) { f.seekWithBaseOffset(smpOffset16); MXMHeader.samples16 = (f.sizeWithBaseOffset() - f.posWithBaseOffset())>>1; } if (MXMHeader.samples16!=0) { smpbuffer16 = new mp_sword[MXMHeader.samples16]; if (smpbuffer16==NULL) { //cprintf("Not enough memory for 16 bit samples (%u)",MXMHeader.samples16*2); delete[] smpbuffer; delete[] gusstart; delete[] gusend; delete[] smpOffsets8; delete[] smpOffsets16; delete[] smpofs; return -7; } } f.seekWithBaseOffset(MXMHeader.sampstart); f.read(smpbuffer, 1, MXMHeader.samples8); if (smpOffset16) { f.seekWithBaseOffset(smpOffset16); } f.readWords((mp_uword*)smpbuffer16, MXMHeader.samples16); y=(MXMHeader.opt>>2)&1; if (y) { if (MXMHeader.samples8!=0) { b1=0; for (j = 0; jsmpnum;smpcnt++) { if (!(smp[smpcnt].type & 16)) { smpOffsets8[nSmpCnt8++] = smp[smpcnt].samplen; } else { smpOffsets16[nSmpCnt16++] = smp[smpcnt].samplen; } } mp_uint32 nNumSamples8 = nSmpCnt8; mp_uint32 nNumSamples16 = nSmpCnt16; mp_uint32 baseOffset = smpOffsets16[0]; for (inscnt = 0; inscnt < nSmpCnt16; inscnt++) smpOffsets16[inscnt]-=baseOffset; #ifdef VERBOSE for (inscnt = 0; inscnt < nSmpCnt16; inscnt++) printf("New sampleoffsets: %x\n",smpOffsets16[inscnt]); printf("8 bit (complete) samplesize: %i\n",MXMHeader.samples8); printf("8 bit (numsamples): %i\n",nSmpCnt8); printf("16 bit (complete) samplesize: %i\n",MXMHeader.samples16); printf("16 bit (numsamples): %i\n",nSmpCnt16); #endif nSmpCnt8 = nSmpCnt16 = 0; for (smpcnt=0;smpcntsmpnum;smpcnt++) { if (!(smp[smpcnt].type&16)) { if (nSmpCnt8 == (nNumSamples8-1)) { gusstart[smpcnt] = smpOffsets8[nSmpCnt8]; gusend[smpcnt] = MXMHeader.samples8; } else { gusstart[smpcnt] = smpOffsets8[nSmpCnt8]; gusend[smpcnt] = smpOffsets8[nSmpCnt8+1]; } nSmpCnt8++; } else { if (nSmpCnt16 == (nNumSamples16-1)) { gusstart[smpcnt] = smpOffsets16[nSmpCnt16]; gusend[smpcnt] = MXMHeader.samples16; } else { gusstart[smpcnt] = smpOffsets16[nSmpCnt16]; gusend[smpcnt] = smpOffsets16[nSmpCnt16+1]; } nSmpCnt16++; } mp_sint32 loopstart = smp[smpcnt].loopstart; smp[smpcnt].loopstart = smp[smpcnt].loopstart-smp[smpcnt].samplen; smp[smpcnt].samplen = smp[smpcnt].looplen-smp[smpcnt].samplen; #ifdef VERBOSE printf("Len:%i Pos:%i All:%i\n",smp[smpcnt].samplen, gusstart[smpcnt], MXMHeader.samples8); #endif if (smp[smpcnt].type&3) { smp[smpcnt].looplen = smp[smpcnt].looplen-loopstart;//smp[smpcnt].loopstart; if (smp[smpcnt].looplen > smp[smpcnt].samplen || smp[smpcnt].loopstart > smp[smpcnt].samplen) { if (smpbuffer) delete[] smpbuffer; if (smpbuffer16) delete[] smpbuffer16; delete[] gusstart; delete[] gusend; delete[] smpOffsets8; delete[] smpOffsets16; delete[] smpofs; return -8; } } else smp[smpcnt].looplen = smp[smpcnt].loopstart = 0; } for (smpcnt=0;smpcntsmpnum;smpcnt++) { y=(smp[smpcnt].type>>4)&1; if (!y) { if (gusstart[smpcnt] + smp[smpcnt].samplen > MXMHeader.samples8) continue; smp[smpcnt].sample = (mp_sbyte*)module->allocSampleMem(smp[smpcnt].samplen); if (smp[smpcnt].sample == NULL || smpbuffer == NULL) { if (smpbuffer) delete[] smpbuffer; if (smpbuffer16) delete[] smpbuffer16; delete[] gusstart; delete[] gusend; delete[] smpOffsets8; delete[] smpOffsets16; delete[] smpofs; return -7; } memcpy(smp[smpcnt].sample,smpbuffer+gusstart[smpcnt],smp[smpcnt].samplen); } else { if (gusstart[smpcnt] + smp[smpcnt].samplen > MXMHeader.samples16) continue; smp[smpcnt].sample = (mp_sbyte*)module->allocSampleMem(smp[smpcnt].samplen*2); if (smp[smpcnt].sample == NULL || smpbuffer16 == NULL) { if (smpbuffer) delete[] smpbuffer; if (smpbuffer16) delete[] smpbuffer16; delete[] gusstart; delete[] gusend; delete[] smpOffsets8; delete[] smpOffsets16; delete[] smpofs; return -7; } memcpy(smp[smpcnt].sample,smpbuffer16+gusstart[smpcnt],smp[smpcnt].samplen*2); } } if (smpbuffer) delete[] smpbuffer; if (smpbuffer16) delete[] smpbuffer16; delete[] gusstart; delete[] gusend; delete[] smpOffsets8; delete[] smpOffsets16; delete[] smpofs; module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/MilkyPlay.h0000644000175000017500000000412611163403715021315 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * MilkyPlay.h * MilkyPlay * * Created by Peter Barth on Thu Jan 20 2005. * */ #ifndef __MILKYPLAY_H__ #define __MILKYPLAY_H__ #include "AudioDriverManager.h" #include "MasterMixer.h" #include "PlayerSTD.h" #include "PlayerGeneric.h" #include "XModule.h" #ifdef MILKYTRACKER #include "XIInstrument.h" #include "SampleLoaderAbstract.h" #include "SampleLoaderGeneric.h" #else #include "PlayerFAR.h" #include "PlayerIT.h" #endif #define MILKYPLAY_HIVER (mp_uint32)((0<<16) + (0)) #define MILKYPLAY_LOVER (mp_uint32)((2<<16) + (0)) #endif milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderIFF.h0000644000175000017500000000425711163403715022304 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderIFF.h * MilkyPlay * * Created by Peter Barth on 07.01.06. * */ #ifndef SAMPLELOADERIFF__H #define SAMPLELOADERIFF__H #include "SampleLoaderAbstract.h" class SampleLoaderIFF : public SampleLoaderAbstract { /*private: static const char* channelNames[];*/ public: SampleLoaderIFF(const SYSCHAR* fileName, XModule& theModule); virtual bool identifySample(); virtual mp_sint32 getNumChannels(); //virtual const char* getChannelName(mp_sint32 channelIndex); virtual mp_sint32 loadSample(mp_sint32 index, mp_sint32 channelIndex); virtual mp_sint32 saveSample(const SYSCHAR* fileName, mp_sint32); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/XModule.h0000644000175000017500000005411111163403715020756 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * XModule.h * MilkyPlay * * */ #ifndef __XMODULE_H__ #define __XMODULE_H__ #include "XMFile.h" #define MP_MAXTEXT 32 struct TXMHeader { char sig[17]; char name[MP_MAXTEXT]; char whythis1a; char tracker[MP_MAXTEXT]; mp_uword ver; mp_uint32 hdrsize; mp_uword ordnum; mp_uword restart; mp_uword channum; mp_uword patnum; mp_uword insnum; mp_uword smpnum; // additional: number of samples in tune mp_uword volenvnum; // additional: number of volume envelopes mp_uword panenvnum; // additional: number of panning envelopes mp_uword frqenvnum; // additional: number of frequency envelopes (MDL) mp_uword vibenvnum; // additional: number of vibrato envelopes (AMS) mp_uword pitchenvnum; // additional: number of pitch envelopes (IT) mp_uword freqtab; mp_ubyte uppernotebound; // additional: note limit if not zero mp_sbyte relnote; // additional: semitone adjust value mp_dword flags; // additional: some flags mp_uword tempo; mp_uword speed; mp_uword mainvol; mp_ubyte ord[256]; mp_ubyte pan[256]; }; // ** BEWARE :) ** // the order of the different elements concerning the envelope info // is not like in the xm format struct TEnvelope { mp_uword env[256][2]; mp_ubyte num,sustain,susloope,loops,loope,type,speed; }; struct TXMInstrument { enum Flags { IF_ITNOTEREMAPPING = 0x01, IF_ITFADEOUT = 0x02, IF_ITENVELOPES = 0x04, IF_ITGOBALINSVOL = 0x08 }; mp_uint32 size; char name[MP_MAXTEXT]; char type; mp_uword samp; mp_uint32 shsize; mp_sword snum[120]; // -1 is an invalid/empty sample mp_uword flags; // not in .XM => from myself // Also holds NNA (bit 4-5), DCT (bit 6-7), DCA (bit 8-9) mp_ubyte notemap[120]; // Impulse Tracker addition mp_uword volfade; // Impulse Tracker addition mp_uword venvnum; // Impulse Tracker envelopes can't be sample-based (different envelopes can map to the same sample) ... mp_uword penvnum; // ... (only when IF_ITENVELOPES flag is set) mp_uword fenvnum; mp_uword vibenvnum; mp_uword pitchenvnum; // IT pitch envelope mp_uword res; // when bit 3 (= 8) of flags is set, take this as global instrument vol (Impulse Tracker) mp_ubyte ifc; // IT Initial Filter cutoff mp_ubyte ifr; // IT Initial Filter resonance //char extra[20]; }; // some words about the samples: // although the sample buffer is freely available for acess, I would not recommend // accessing it directly if you don't exactly know what you are doing because // to avoid sample clicks when looping samples, it uses a tricky double buffering // technique between smoothed out sample loop areas and the original sample data // If you need to modify sample data yourself, use the provided methods // getSampleValue and setSampleValue and call postProcessSamples when you're done // modifying the sample, so the loop information is updated correctly // Also call postProcessSamples when you're changing the loop information struct TXMSample { private: struct TLoopDoubleBuffProps { enum { StateUnused, StateUsed, StateDirty, }; mp_uint32 samplesize; mp_ubyte state[4]; mp_uint32 lastloopend; }; enum { LoopAreaBackupSize = 4, LoopAreaBackupSizeMaxInBytes = 8, EmptySize = 8, LeadingPadding = sizeof(TLoopDoubleBuffProps) + LoopAreaBackupSizeMaxInBytes + EmptySize, TrailingPadding = 16, PaddingSpace = LeadingPadding+TrailingPadding }; void restoreLoopArea(); public: mp_uint32 samplen; mp_uint32 loopstart; mp_uint32 looplen; mp_ubyte flags; // Bit 0: Use volume // Bit 1: Use panning // Bit 2: Use sample volume as channel global volume (.PLM modules) // Bit 3: Use the res field as global sample volume // Bit 4: Use IT style auto vibrato (not implemented yet) mp_ubyte vol; mp_sbyte finetune; mp_ubyte type; // In Addition to XM: Bit 5: One shot forward looping sample (MOD backward compatibility) mp_ubyte pan; mp_sbyte relnote; mp_uword venvnum; mp_uword penvnum; mp_uword fenvnum; mp_uword vibenvnum; mp_uword pitchenvnum; mp_ubyte vibtype, vibsweep, vibdepth, vibrate; mp_uword volfade; mp_ubyte res; // when bit 3 (= 8) of flags is set, take this as global sample vol (Impulse Tracker) mp_sword freqadjust; char name[MP_MAXTEXT]; mp_ubyte terminate; mp_sbyte* sample; static mp_uint32 getPaddedSize(mp_uint32 size) { return size+TXMSample::PaddingSpace; } static mp_ubyte* getPadStartAddr(mp_ubyte* mem) { return mem-TXMSample::LeadingPadding; } static mp_ubyte* allocPaddedMem(mp_uint32 size) { mp_ubyte* result = new mp_ubyte[getPaddedSize(size)]; if (result == NULL) return NULL; // clear out padding space memset(result, 0, TXMSample::LeadingPadding); memset(result+size+TXMSample::LeadingPadding, 0, TXMSample::TrailingPadding); TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)result; loopBufferProps->samplesize = size; return result + TXMSample::LeadingPadding; } static void freePaddedMem(mp_ubyte* mem) { // behave safely on NULL if (mem == NULL) return; delete[] getPadStartAddr(mem); } static void copyPaddedMem(void* dst, const void* src, mp_uint32 size) { mp_ubyte* _src = ((mp_ubyte*)src) - TXMSample::LeadingPadding; mp_ubyte* _dst = ((mp_ubyte*)dst) - TXMSample::LeadingPadding; memcpy(_dst, _src, getPaddedSize(size)); } static mp_uint32 getSampleSizeInBytes(mp_ubyte* mem) { TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr(mem); return loopBufferProps->samplesize; } static mp_uint32 getSampleSizeInSamples(mp_ubyte* mem) { TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr(mem); return (loopBufferProps->state[1] & 16) ? (loopBufferProps->samplesize >> 1) : loopBufferProps->samplesize; } void smoothLooping(); void restoreOriginalState(); void postProcessSamples(); // get sample value // values range from [-32768,32767] in case of a 16 bit sample // or from [-128,127] in case of an 8 bit sample mp_sint32 getSampleValue(mp_uint32 index); mp_sint32 getSampleValue(mp_ubyte* sample, mp_uint32 index); void setSampleValue(mp_uint32 index, mp_sint32 value); void setSampleValue(mp_ubyte* sample, mp_uint32 index, mp_sint32 value); #ifdef MILKYTRACKER bool equals(const TXMSample& sample) const { if (this->sample != sample.sample) return false; if (samplen != sample.samplen) return false; return true; } bool isMinimizable() const { return (loopstart + looplen < samplen && (type & 3)); } #endif friend class XModule; }; struct TXMPattern { mp_uint32 len; mp_ubyte ptype; mp_uword rows; mp_ubyte effnum; mp_ubyte channum; mp_uword patdata; mp_ubyte* patternData; mp_sint32 compress(mp_ubyte* dest) const; mp_sint32 decompress(mp_ubyte* src, mp_sint32 len); #ifdef MILKYTRACKER bool saveExtendedPattern(const SYSCHAR* fileName) const; bool loadExtendedPattern(const SYSCHAR* fileName); bool saveExtendedTrack(const SYSCHAR* fileName, mp_uint32 channel) const; bool loadExtendedTrack(const SYSCHAR* fileName, mp_uint32 channel); const TXMPattern& operator=(const TXMPattern& src); #endif }; ////////////////////////////////////////////////////////////////////////// // This is the class which handles a MilkyPlay module // ////////////////////////////////////////////////////////////////////////// class XModule { public: enum { IdentificationBufferSize = 2048, }; /////////////////////////////////////////////////////// // this is our loader interface (abstract class) // // each loader has to conform to this interface // /////////////////////////////////////////////////////// class LoaderInterface { public: // make GCC shut up virtual ~LoaderInterface() { } // returns c-string which identifies the module, NULL if loader can't identify module // IMPORTANT: buffer MUST contain eIdentifyBufferSize bytes of the beginning of the file virtual const char* identifyModule(const mp_ubyte* buffer) = 0; // try to load module (check with identifyModule first) virtual mp_sint32 load(XMFileBase& f, XModule* module) = 0; }; enum ModuleTypes { ModuleType_UNKNOWN, ModuleType_669, ModuleType_AMF, ModuleType_AMS, ModuleType_CBA, ModuleType_DBM, ModuleType_DIGI, ModuleType_DSM, ModuleType_DSm, ModuleType_DTM_1, ModuleType_DTM_2, ModuleType_FAR, ModuleType_GDM, ModuleType_GMC, ModuleType_IMF, ModuleType_IT, ModuleType_MDL, ModuleType_MOD, ModuleType_MTM, ModuleType_MXM, ModuleType_OKT, ModuleType_PLM, ModuleType_PSM, ModuleType_PTM, ModuleType_S3M, ModuleType_STM, ModuleType_SFX, ModuleType_UNI, ModuleType_ULT, ModuleType_XM, ModuleType_NONE = -1, }; class SampleLoader { protected: XMFileBase& f; public: SampleLoader(XMFileBase& file) : f(file) { } virtual ~SampleLoader() { } virtual mp_sint32 load_sample_8bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize) = 0; virtual mp_sint32 load_sample_16bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize) = 0; }; private: struct TLoaderInfo { LoaderInterface* loader; ModuleTypes moduleType; }; public: enum { ST_DEFAULT = 0x00, ST_DELTA = 0x01, ST_UNSIGNED = 0x02, ST_16BIT = 0x04, ST_PACKING_MDL = 0x08, ST_DELTA_PTM = 0x10, ST_BIGENDIAN = 0x20, ST_PACKING_IT = 0x40, ST_PACKING_IT215 = 0x80, ST_PACKING_ADPCM = 0x100 }; static const mp_sint32 periods[12]; static const mp_sint32 sfinetunes[16]; static const mp_sbyte modfinetunes[16]; static const mp_ubyte numValidXMEffects; static const mp_ubyte validXMEffects[]; ////////////////////////////////////////////////////////////////////////// // different stuff for importing different module types into own format // ////////////////////////////////////////////////////////////////////////// static mp_sint32 FixedMUL(mp_sint32 a,mp_sint32 b) { return ((mp_sint32)(((mp_int64)(a)*(mp_int64)(b))>>16)); } /////////////////////////////////////////////////////// // convert relative note + finetune into C4 speed // /////////////////////////////////////////////////////// static mp_sint32 getc4spd(mp_sint32 relnote, mp_sint32 finetune); /////////////////////////////////////////////////////// // convert C4 speed into relative note + finetune // /////////////////////////////////////////////////////// static void convertc4spd(mp_uint32 c4spd, mp_sbyte* finetune, mp_sbyte* relnote); static mp_uint32 amigaPeriodToNote(mp_uint32 period); /////////////////////////////////////////////////////// // load sample into memory // /////////////////////////////////////////////////////// static bool loadSample(XMFileBase& f, void* buffer, mp_uint32 size, mp_uint32 length, mp_sint32 flags = ST_DEFAULT); /////////////////////////////////////////////////////// // load a bunch of samples into memory // /////////////////////////////////////////////////////// mp_sint32 loadModuleSample(XMFileBase& f, mp_sint32 index, mp_sint32 flags8 = ST_DEFAULT, mp_sint32 flags16 = ST_16BIT, mp_uint32 alternateSize = 0); mp_sint32 loadModuleSamples(XMFileBase& f, mp_sint32 flags8 = ST_DEFAULT, mp_sint32 flags16 = ST_16BIT); static void convertXMVolumeEffects(mp_ubyte volume, mp_ubyte& eff, mp_ubyte& op); /////////////////////////////////////////////////////// // Allocate sample memory and store pointer in pool // // *Note* that this memory is always padded with 16 // // bytes at the start *AND* 16 bytes at the end. // /////////////////////////////////////////////////////// mp_ubyte* allocSampleMem(mp_uint32 size); /////////////////////////////////////////////////////// // Free sample memory /////////////////////////////////////////////////////// void freeSampleMem(mp_ubyte* mem, bool assertCheck = true); #ifdef MILKYTRACKER void insertSamplePtr(mp_ubyte* ptr); void removeSamplePtr(mp_ubyte* ptr); #endif /////////////////////////////////////////////////////// // Clean up! (Is called before loading a song) // /////////////////////////////////////////////////////// bool cleanUp(); /////////////////////////////////////////////////////// // scan through samples and post process to avoid // // interpolation clicks // /////////////////////////////////////////////////////// void postProcessSamples(bool heavy = false); /////////////////////////////////////////////////////// // set default panning // /////////////////////////////////////////////////////// void setDefaultPanning(); private: // Identify module ModuleTypes type; // Indicates whether a file is loaded or if it's just an empty song bool moduleLoaded; // each module comes with it's own sample-memory management (MILKYPLAY_MAXSAMPLES samples max.) mp_ubyte* samplePool[MP_MAXSAMPLES]; mp_uint32 samplePointerIndex; // song message retrieving char* messagePtr; // subsong position table mp_ubyte subSongPositions[256*2]; mp_sint32 numSubSongs; // add nother envelope to a given list and increase size of array if necessary static bool addEnvelope(TEnvelope*& envs,const TEnvelope& env,mp_uint32& numEnvsAlloc,mp_uint32& numEnvs); // fix broken envelopes (1 point envelope for example) static void fixEnvelopes(TEnvelope* envs, mp_uint32 numEnvs); // holds available loader instances class LoaderManager { private: TLoaderInfo* loaders; mp_uint32 numLoaders; mp_uint32 numAllocatedLoaders; mp_sint32 iteratorCounter; void registerLoader(LoaderInterface* loader, ModuleTypes type); public: LoaderManager(); ~LoaderManager(); TLoaderInfo* getFirstLoaderInfo(); TLoaderInfo* getNextLoaderInfo(); }; friend class LoaderManager; bool validate(); public: // Module flags enum { MODULE_OLDS3MVOLSLIDES = 1, MODULE_ST3NOTECUT = 2, MODULE_ST3DUALCOMMANDS = 4, MODULE_STMARPEGGIO = 8, MODULE_XMARPEGGIO = 16, MODULE_XMVOLCOLUMNVIBRATO = 32, MODULE_XMNOTECLIPPING = 64, MODULE_XMPORTANOTEBUFFER = 128, MODULE_AMSENVELOPES = 256, MODULE_PTNEWINSTRUMENT = 512, MODULE_ST3NEWINSTRUMENT = 1024, MODULE_OLDPTINSTRUMENTCHANGE = 2048, MODULE_ITNOTEOFF = 4096, MODULE_ITNEWEFFECTS = 8192, MODULE_ITNEWGXX = 16384, MODULE_ITLINKPORTAMEM = 32768, MODULE_ITTEMPOSLIDE = 65536, }; enum { NOTE_LAST = 120, NOTE_OFF = 121, NOTE_CUT = 122, NOTE_FADE = 123, SubSongMarkEffect = 0x1E, SubSongMarkOperand = 0xFF, }; TXMHeader header; // module header TXMInstrument* instr; // all instruments (256 of them) TXMSample* smp; // all samples (256 of them, only 255 can be used) TXMPattern* phead; // all pattern headers (256 of them) mp_uint32 messageBytesAlloc; char* message; // song message TEnvelope* venvs; mp_uint32 numVEnvsAlloc; mp_uint32 numVEnvs; // should be equal to header.venvnum bool addVolumeEnvelope(const TEnvelope& env) { return addEnvelope(venvs, env, numVEnvsAlloc, numVEnvs); } TEnvelope* penvs; mp_uint32 numPEnvsAlloc; mp_uint32 numPEnvs; // should be equal to header.penvnum bool addPanningEnvelope(const TEnvelope& env) { return addEnvelope(penvs, env, numPEnvsAlloc, numPEnvs); } TEnvelope* fenvs; mp_uint32 numFEnvsAlloc; mp_uint32 numFEnvs; // should be equal to header.fenvnum bool addFrequencyEnvelope(const TEnvelope& env) { return addEnvelope(fenvs, env, numFEnvsAlloc, numFEnvs); } TEnvelope* vibenvs; mp_uint32 numVibEnvsAlloc; mp_uint32 numVibEnvs; // should be equal to header.vibenvnum bool addVibratoEnvelope(TEnvelope& env) { return addEnvelope(vibenvs, env, numVibEnvsAlloc, numVibEnvs); } TEnvelope* pitchenvs; mp_uint32 numPitchEnvsAlloc; mp_uint32 numPitchEnvs; // should be equal to header.vibenvnum bool addPitchEnvelope(TEnvelope& env) { return addEnvelope(pitchenvs, env, numPitchEnvsAlloc, numPitchEnvs); } /////////////////////////////////////////////////////// // convert volume from range [0..64] to [0..255] // /////////////////////////////////////////////////////// static mp_sint32 vol64to255(mp_sint32 vol) { return ((vol>64?64:vol)*261120+65535)>>16; } /////////////////////////////////////////////////////// // convert volume from range [0..255] to [0..64] // /////////////////////////////////////////////////////// static mp_uint32 vol255to64(mp_uint32 vol) { return (vol*64)/255; } /////////////////////////////////////////////////////// // convert volume from range [0..127] to [0..255] // /////////////////////////////////////////////////////// static mp_sint32 vol127to255(mp_sint32 vol) { return ((vol>127?127:vol)*131588+65535)>>16; } /////////////////////////////////////////////////////// // convert volume from range [0..128] to [0..255] // /////////////////////////////////////////////////////// static mp_sint32 vol128to255(mp_sint32 vol) { return ((vol>128?128:vol)*130560+65535)>>16; } static mp_sint32 pan15to255(mp_sint32 pan) { return pan>=0xF?0xFF:(pan<<4); } /////////////////////////////////////////////////// // Allocate necessary memory for song structures // /////////////////////////////////////////////////// XModule(); /////////////////////////////////////////////////// // Clean up // /////////////////////////////////////////////////// ~XModule(); /////////////////////////////////////////////////// // Get type of module // /////////////////////////////////////////////////// ModuleTypes getType() const { return type; } /////////////////////////////////////////////////// // identify module type // // IMPORTANT: buffer MUST contain // // eIdentifyBufferSize bytes from the beginning // // of the file // /////////////////////////////////////////////////// static const char* identifyModule(const mp_ubyte* buffer); /////////////////////////////////////////////////// // generic module loader // /////////////////////////////////////////////////// mp_sint32 loadModule(XMFileBase& f, bool scanForSubSongs = false); mp_sint32 loadModule(const SYSCHAR* fileName, bool scanForSubSongs = false); /////////////////////////////////////////////////// // Module exporters // /////////////////////////////////////////////////// mp_sint32 saveExtendedModule(const SYSCHAR* fileName); // FT2 (.XM) mp_sint32 saveProtrackerModule(const SYSCHAR* fileName); // Protracker compatible (.MOD) /////////////////////////////////////////////////// // module loaded? // /////////////////////////////////////////////////// bool isModuleLoaded() const { return moduleLoaded; } /////////////////////////////////////////////////// // string processing // /////////////////////////////////////////////////// static void convertStr(char* strIn, const char* strOut, mp_sint32 nLen, bool filter = true); void getTitle(char* str, bool filter = true) const; void getSignature(char* str, bool filter = true) const; void getTracker(char* str, bool filter = true) const; /////////////////////////////////////////////////// // dealing with song message // /////////////////////////////////////////////////// // allocate empty song message void allocateSongMessage(mp_uint32 initialSize = 512); // add one more line of text to the song message void addSongMessageLine(const char* line); // start iterating text lines (get size of line) mp_sint32 getFirstSongMessageLineLength(); // get next size text line mp_sint32 getNextSongMessageLineLength(); // get line void getSongMessageLine(char* line); void buildSubSongTable(); mp_sint32 getNumSubSongs() const { return numSubSongs; } mp_sint32 getSubSongPosStart(mp_sint32 i) const; mp_sint32 getSubSongPosEnd(mp_sint32 i) const; /////////////////////////////////////////////////// // various post processing and analyzing // /////////////////////////////////////////////////// // Remove stupid empty = 0xFE orders void removeOrderSkips(); // Remove unused patterns mp_sint32 removeUnusedPatterns(bool evaluate); // these are located in ExporterXM.cpp mp_sint32 getNumUsedPatterns(); mp_sint32 getNumUsedInstruments(); // Analyse various things, for example if there is an old Protracker instrument change void postLoadAnalyser(); // MilkyTracker additions void createEmptySong(bool clearPatterns = true, bool clearInstruments = true, mp_sint32 numChannels = 8); enum IsPTCompatibleErrorCodes { IsPTCompatibleErrorCodeNoError = 0, IsPTCompatibleErrorCodeTooManyInstruments, IsPTCompatibleErrorCodeLinearFrequencyUsed, IsPTCompatibleErrorCodeIncompatibleSamples, IsPTCompatibleErrorCodeIncompatibleInstruments, IsPTCompatibleErrorCodeIncompatiblePatterns }; IsPTCompatibleErrorCodes isPTCompatible(); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderALL.cpp0000644000175000017500000000607011163403715022636 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderALL.cpp * MilkyPlay * * Created by Peter Barth on 14.09.05. * */ #include "SampleLoaderALL.h" #include "XMFile.h" #include "XModule.h" SampleLoaderALL::SampleLoaderALL(const SYSCHAR* fileName, XModule& theModule) : SampleLoaderAbstract(fileName, theModule) { } bool SampleLoaderALL::identifySample() { return getNumChannels() != 0; } mp_sint32 SampleLoaderALL::getNumChannels() { return 1; } mp_sint32 SampleLoaderALL::loadSample(mp_sint32 index, mp_sint32 channelIndex) { XMFile f(theFileName); TXMSample* smp = &theModule.smp[index]; if (smp->sample) { theModule.freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->samplen = f.size(); // Bigger than 100mb? Probably someone's kidding here... if ((unsigned)smp->samplen > 100*1024*1024) smp->samplen = 100*1024*1024; smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen); if (smp->sample == NULL) return -7; smp->type = 0; smp->flags = 3; smp->looplen = smp->loopstart = 0; nameToSample(preferredDefaultName, smp); // assuming signed data theModule.loadSample(f, smp->sample, smp->samplen, smp->samplen); return 0; } mp_sint32 SampleLoaderALL::saveSample(const SYSCHAR* fileName, mp_sint32 index) { TXMSample* smp = &theModule.smp[index]; XMFile f(fileName, true); if (smp->type & 16) { for (mp_uint32 i = 0; i < smp->samplen; i++) f.writeWord(smp->getSampleValue(i)); } else { for (mp_uint32 i = 0; i < smp->samplen; i++) f.writeByte(smp->getSampleValue(i)); } return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/PlayerGeneric.cpp0000644000175000017500000005567111163403715022501 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerGeneric.cpp * MilkyPlay * * PlayerGeneric is a wrapper that allocates a suiting type of player * for a module while providing the same player interfaces. * Currently there are three types of players: PlayerFAR, PlayerSTD and PlayerIT * */ #include "PlayerGeneric.h" #include "MasterMixer.h" #include "XModule.h" #include "AudioDriver_WAVWriter.h" #include "AudioDriverManager.h" #include "PlayerBase.h" #include "PlayerSTD.h" #ifndef MILKYTRACKER #include "PlayerIT.h" #include "PlayerFAR.h" #endif #undef __VERBOSE__ class MixerNotificationListener : public MasterMixer::MasterMixerNotificationListener { private: class PlayerGeneric& player; public: MixerNotificationListener(PlayerGeneric& player) : player(player) { } virtual void masterMixerNotification(MasterMixer::MasterMixerNotifications notification) { player.adjustSettings(); } }; void PlayerGeneric::adjustSettings() { mp_uint32 bufferSize = mixer->getBufferSize(); mp_uint32 sampleRate = mixer->getSampleRate(); this->bufferSize = bufferSize; this->frequency = sampleRate; if (player) { player->setBufferSize(bufferSize); player->adjustFrequency(sampleRate); } } PlayerBase::PlayerTypes PlayerGeneric::getPreferredPlayerType(XModule* module) { if (module == NULL) return PlayerBase::PlayerType_INVALID; switch (module->getType()) { case XModule::ModuleType_669: case XModule::ModuleType_FAR: #ifndef MILKYTRACKER return PlayerBase::PlayerType_FAR; break; #endif case XModule::ModuleType_IT: #ifndef MILKYTRACKER return PlayerBase::PlayerType_IT; break; #endif case XModule::ModuleType_UNKNOWN: // just assume our standard player can handle this //case XModule::ModuleType_669: case XModule::ModuleType_AMF: case XModule::ModuleType_AMS: case XModule::ModuleType_CBA: case XModule::ModuleType_DBM: case XModule::ModuleType_DIGI: case XModule::ModuleType_DSM: case XModule::ModuleType_DSm: case XModule::ModuleType_DTM_1: case XModule::ModuleType_DTM_2: case XModule::ModuleType_GDM: case XModule::ModuleType_GMC: case XModule::ModuleType_IMF: case XModule::ModuleType_MDL: case XModule::ModuleType_MOD: case XModule::ModuleType_MTM: case XModule::ModuleType_MXM: case XModule::ModuleType_OKT: case XModule::ModuleType_PLM: case XModule::ModuleType_PSM: case XModule::ModuleType_PTM: case XModule::ModuleType_S3M: case XModule::ModuleType_STM: case XModule::ModuleType_SFX: case XModule::ModuleType_UNI: case XModule::ModuleType_ULT: case XModule::ModuleType_XM: case XModule::ModuleType_NONE: return PlayerBase::PlayerType_Generic; break; default: return PlayerBase::PlayerType_INVALID; } } PlayerBase* PlayerGeneric::getPreferredPlayer(XModule* module) const { switch (getPreferredPlayerType(module)) { #ifndef MILKYTRACKER case PlayerBase::PlayerType_FAR: return new PlayerFAR(frequency); case PlayerBase::PlayerType_IT: return new PlayerIT(frequency); #endif case PlayerBase::PlayerType_Generic: return new PlayerSTD(frequency); default: return NULL; } } PlayerGeneric::PlayerGeneric(mp_sint32 frequency, AudioDriverInterface* audioDriver/* = NULL*/) : mixer(NULL), player(NULL), frequency(frequency), audioDriver(audioDriver), audioDriverName(NULL) { listener = new MixerNotificationListener(*this); bufferSize = 0; sampleShift = 0; resamplerType = MIXER_NORMAL; idle = false; playOneRowOnly = false; paused = false; repeat = false; resetOnStopFlag = false; autoAdjustPeak = false; disableMixing = false; allowFilters = false; #ifdef __FORCEPOWEROFTWOBUFFERSIZE__ compensateBufferFlag = true; #else compensateBufferFlag = false; #endif masterVolume = panningSeparation = numMaxVirChannels = 256; resetMainVolumeOnStartPlayFlag = true; playMode = PlayMode_Auto; // Special playmode settings options[PlayModeOptionPanning8xx] = true; options[PlayModeOptionPanningE8x] = false; options[PlayModeOptionForcePTPitchLimit] = true; AudioDriverManager audioDriverManager; const char* defaultName = audioDriverManager.getPreferredAudioDriver()->getDriverID(); if (defaultName) { audioDriverName = new char[strlen(defaultName)+1]; strcpy(audioDriverName, defaultName); } } PlayerGeneric::~PlayerGeneric() { if (mixer) delete mixer; if (player) { if (mixer->isActive() && !mixer->isDeviceRemoved(player)) mixer->removeDevice(player); delete player; } delete[] audioDriverName; delete listener; } // -- wrapping mixer specific stuff ---------------------- void PlayerGeneric::setResamplerType(ResamplerTypes type) { resamplerType = type; if (player) player->setResamplerType(type); } void PlayerGeneric::setResamplerType(bool interpolation, bool ramping) { if (interpolation) { if (ramping) resamplerType = MIXER_LERPING_RAMPING; else resamplerType = MIXER_LERPING; } else { if (ramping) resamplerType = MIXER_NORMAL_RAMPING; else resamplerType = MIXER_NORMAL; } if (player) player->setResamplerType(resamplerType); } ChannelMixer::ResamplerTypes PlayerGeneric::getResamplerType() const { if (player) return player->getResamplerType(); return resamplerType; } void PlayerGeneric::setSampleShift(mp_sint32 shift) { sampleShift = shift; if (mixer) mixer->setSampleShift(shift); } mp_sint32 PlayerGeneric::getSampleShift() const { if (mixer) return mixer->getSampleShift(); return sampleShift; } void PlayerGeneric::setPeakAutoAdjust(bool b) { this->autoAdjustPeak = b; } mp_sint32 PlayerGeneric::adjustFrequency(mp_uint32 frequency) { this->frequency = frequency; mp_sint32 res = 0; if (mixer) res = mixer->setSampleRate(frequency); return res; } mp_sint32 PlayerGeneric::getMixFrequency() const { if (player) return player->getMixFrequency(); return frequency; } mp_sint32 PlayerGeneric::beatPacketsToBufferSize(mp_uint32 numBeats) { return ChannelMixer::beatPacketsToBufferSize(getMixFrequency(), numBeats); } mp_sint32 PlayerGeneric::adjustBufferSize(mp_uint32 numBeats) { return setBufferSize(beatPacketsToBufferSize(numBeats)); } mp_sint32 PlayerGeneric::setBufferSize(mp_uint32 bufferSize) { mp_sint32 res = 0; this->bufferSize = bufferSize; if (mixer) { // If we're told to compensate the samples until we // we reached 2^n buffer sizes if (compensateBufferFlag) { for (mp_uint32 i = 0; i < 16; i++) { if ((unsigned)(1 << i) >= (unsigned)bufferSize) { bufferSize = 1 << i; break; } } } res = mixer->setBufferSize(bufferSize); } return res; } mp_sint32 PlayerGeneric::setPowerOfTwoCompensationFlag(bool b) { if (mixer && compensateBufferFlag != b) { compensateBufferFlag = b; setBufferSize(bufferSize); } return 0; } bool PlayerGeneric::getPowerOfTwoCompensationFlag() const { return compensateBufferFlag; } const char* PlayerGeneric::getCurrentAudioDriverName() const { if (mixer) return mixer->getCurrentAudioDriverName(); return audioDriverName; } bool PlayerGeneric::setCurrentAudioDriverByName(const char* name) { if (name == NULL) return false; if (mixer) { bool res = mixer->setCurrentAudioDriverByName(name); if (audioDriverName) delete[] audioDriverName; const char* curDrvName = getCurrentAudioDriverName(); ASSERT(curDrvName); audioDriverName = new char[strlen(curDrvName)+1]; strcpy(audioDriverName, curDrvName); return res; } AudioDriverManager audioDriverManager; if (audioDriverManager.getAudioDriverByName(name)) { if (audioDriverName) delete[] audioDriverName; audioDriverName = new char[strlen(name)+1]; strcpy(audioDriverName, name); return true; } return false; } bool PlayerGeneric::isInitialized() const { if (mixer) return mixer->isInitialized(); return false; } bool PlayerGeneric::isPlaying() const { if (mixer) return mixer->isPlaying(); return false; } mp_int64 PlayerGeneric::getSampleCounter() const { if (player) return player->getSampleCounter(); return 0; } void PlayerGeneric::resetSampleCounter() { if (player) player->resetSampleCounter(); } mp_sint32 PlayerGeneric::getCurrentSamplePosition() const { if (mixer && mixer->getAudioDriver()) return mixer->getAudioDriver()->getBufferPos(); return 0; } mp_sint32 PlayerGeneric::getCurrentBeatIndex() { if (player) return player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); return 0; } mp_sint32 PlayerGeneric::getCurrentSample(mp_sint32 position, mp_sint32 channel) { if (mixer) return mixer->getCurrentSample(position, channel); return 0; } mp_sint32 PlayerGeneric::getCurrentSamplePeak(mp_sint32 position, mp_sint32 channel) { if (mixer) return mixer->getCurrentSamplePeak(position, channel); return 0; } void PlayerGeneric::resetChannels() { if (player) player->resetChannelsFull(); } mp_sint32 PlayerGeneric::getNumAllocatedChannels() const { if (player) return player->getNumAllocatedChannels(); return 0; } mp_sint32 PlayerGeneric::getNumActiveChannels() const { if (player) return player->getNumActiveChannels(); return 0; } // -- wrapping player specific stuff ---------------------- void PlayerGeneric::setPlayMode(PlayModes mode) { playMode = mode; if (player) player->setPlayMode(mode); } PlayerGeneric::PlayModes PlayerGeneric::getPlayMode() const { if (player) return player->getPlayMode(); return playMode; } void PlayerGeneric::enable(PlayModeOptions option, bool b) { ASSERT(option>=PlayModeOptionFirst && optionenable(option, b); } bool PlayerGeneric::isEnabled(PlayModeOptions option) const { ASSERT(option>=PlayModeOptionFirst && optionisEnabled(option); } void PlayerGeneric::restart(mp_uint32 startPosition/* = 0*/, mp_uint32 startRow/* = 0*/, bool resetMixer/* = true*/, const mp_ubyte* customPanningTable/* = NULL*/, bool playOneRowOnly/* = false*/) { if (player) player->restart(startPosition, startRow, resetMixer, customPanningTable, playOneRowOnly); } void PlayerGeneric::reset() { if (player) player->reset(); } void PlayerGeneric::resetAllSpeed() { if (player) player->resetAllSpeed(); } mp_sint32 PlayerGeneric::startPlaying(XModule* module, bool repeat/* = false*/, mp_uint32 startPosition/* = 0*/, mp_uint32 startRow/* = 0*/, mp_sint32 numChannels/* = -1*/, const mp_ubyte* customPanningTable/* = NULL*/, bool idle/* = false*/, mp_sint32 patternIndex/* = -1*/, bool playOneRowOnly/* = false*/) { this->idle = idle; this->repeat = repeat; this->playOneRowOnly = playOneRowOnly; if (mixer == NULL) { mixer = new MasterMixer(frequency, bufferSize, 1, audioDriver); mixer->setMasterMixerNotificationListener(listener); mixer->setSampleShift(sampleShift); if (audioDriver == NULL) mixer->setCurrentAudioDriverByName(audioDriverName); } if (!player || player->getType() != getPreferredPlayerType(module)) { if (player) { if (!mixer->isDeviceRemoved(player)) mixer->removeDevice(player); delete player; } player = getPreferredPlayer(module); if (player) { // apply our own "state" to the state of the newly allocated player player->resetMainVolumeOnStartPlay(resetMainVolumeOnStartPlayFlag); player->resetOnStop(resetOnStopFlag); player->setBufferSize(bufferSize); player->setResamplerType(resamplerType); player->setMasterVolume(masterVolume); player->setPanningSeparation(panningSeparation); player->setPlayMode(playMode); for (mp_sint32 i = PlayModeOptionFirst; i < PlayModeOptionLast; i++) player->enable((PlayModeOptions)i, options[i]); player->setDisableMixing(disableMixing); player->setAllowFilters(allowFilters); //if (paused) // player->pausePlaying(); // adjust number of virtual channels if necessary setNumMaxVirChannels(numMaxVirChannels); } } if (player && mixer) { if (!mixer->isDeviceRemoved(player)) mixer->removeDevice(player); player->startPlaying(module, repeat, startPosition, startRow, numChannels, customPanningTable, idle, patternIndex, playOneRowOnly); mixer->addDevice(player); if (!mixer->isPlaying()) return mixer->start(); } return 0; } void PlayerGeneric::setPatternToPlay(mp_sint32 patternIndex) { if (player) player->setPatternToPlay(patternIndex); } mp_sint32 PlayerGeneric::stopPlaying() { if (player) player->stopPlaying(); if (mixer) return mixer->stop(); return 0; } bool PlayerGeneric::hasSongHalted() const { if (player) return player->hasSongHalted(); return true; } void PlayerGeneric::setIdle(bool idle) { this->idle = idle; if (player) player->setIdle(idle); } bool PlayerGeneric::isIdle() const { if (player) return player->isIdle(); return idle; } void PlayerGeneric::setRepeat(bool repeat) { this->repeat = repeat; if (player) player->setRepeat(repeat); } bool PlayerGeneric::isRepeating() const { if (player) return player->isRepeating(); return repeat; } mp_sint32 PlayerGeneric::pausePlaying() { paused = true; if (mixer) return mixer->pause(); return 0; } mp_sint32 PlayerGeneric::resumePlaying() { if (player && !player->isPlaying()) player->resumePlaying(); if (mixer && mixer->isPaused()) return mixer->resume(); else if (mixer && !mixer->isPlaying()) return mixer->start(); return 0; } bool PlayerGeneric::isPaused() const { if (mixer) return mixer->isPaused(); return paused; } void PlayerGeneric::setDisableMixing(bool b) { disableMixing = b; if (player) player->setDisableMixing(disableMixing); } void PlayerGeneric::setAllowFilters(bool b) { allowFilters = b; if (player) player->setAllowFilters(allowFilters); } bool PlayerGeneric::getAllowFilters() const { if (player) return player->getAllowFilters(); return allowFilters; } // volume control void PlayerGeneric::setMasterVolume(mp_sint32 vol) { masterVolume = vol; if (player) player->setMasterVolume(vol); } mp_sint32 PlayerGeneric::getMasterVolume() const { if (player) return player->getMasterVolume(); return masterVolume; } // panning control void PlayerGeneric::setPanningSeparation(mp_sint32 separation) { panningSeparation = separation; if (player) player->setPanningSeparation(separation); } mp_sint32 PlayerGeneric::getPanningSeparation() const { if (player) return player->getPanningSeparation(); return panningSeparation; } mp_sint32 PlayerGeneric::getSongMainVolume() const { if (player) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); return player->getSongMainVolume(index); } return 255; } mp_sint32 PlayerGeneric::getRow() const { if (player) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); return player->getRow(index); } return 0; } mp_sint32 PlayerGeneric::getOrder() const { if (player) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); return player->getOrder(index); } return 0; } void PlayerGeneric::getPosition(mp_sint32& order, mp_sint32& row) const { if (player) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); player->getPosition(order, row, index); return; } order = row = 0; } mp_sint32 PlayerGeneric::getLastUnvisitedPosition() const { if (player) return player->getLastUnvisitedPosition(); return 0; } void PlayerGeneric::getPosition(mp_sint32& order, mp_sint32& row, mp_sint32& ticker) const { if (player) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); player->getPosition(order, row, ticker, index); return; } order = row = ticker = 0; } mp_int64 PlayerGeneric::getSyncCount() const { if (player) return player->getSyncCount(); return 0; } mp_uint32 PlayerGeneric::getSyncSampleCounter() const { if (player) return player->getSyncSampleCounter(); return 0; } void PlayerGeneric::nextPattern() { if (player) player->nextPattern(); } void PlayerGeneric::lastPattern() { if (player) player->lastPattern(); } void PlayerGeneric::setPatternPos(mp_uint32 pos, mp_uint32 row/* = 0*/, bool resetChannels/* = true*/, bool resetFXMemory/* = true*/) { if (player) player->setPatternPos(pos, row, resetChannels, resetFXMemory); } mp_sint32 PlayerGeneric::getTempo() const { if (player) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); return player->getTempo(index); } return 0; } mp_sint32 PlayerGeneric::getSpeed() const { if (player) { mp_uint32 index = player->getBeatIndexFromSamplePos(getCurrentSamplePosition()); return player->getSpeed(index); } return 0; } void PlayerGeneric::resetOnStop(bool b) { resetOnStopFlag = b; if (player) player->resetOnStop(b); } void PlayerGeneric::resetMainVolumeOnStartPlay(bool b) { resetMainVolumeOnStartPlayFlag = b; if (player) player->resetMainVolumeOnStartPlay(b); } struct PeakAutoAdjustFilter : public Mixable { mp_uint32 mixerShift; mp_uint32 masterVolume; mp_sint32 lastPeakValue; PeakAutoAdjustFilter() : mixerShift(0), masterVolume(256), lastPeakValue(0) { } virtual void mix(mp_sint32* buffer, mp_uint32 bufferSize) { const mp_sint32* buffer32 = buffer; for (mp_uint32 i = 0; i < bufferSize*MP_NUMCHANNELS; i++) { mp_sint32 b = *buffer32++; if (abs(b) > lastPeakValue) lastPeakValue = abs(b); } } void calculateMasterVolume() { if (lastPeakValue) { float v = 32768.0f*(1< 256) masterVolume = 256; } } }; // export to 16bit stereo WAV mp_sint32 PlayerGeneric::exportToWAV(const SYSCHAR* fileName, XModule* module, mp_sint32 startOrder/* = 0*/, mp_sint32 endOrder/* = -1*/, const mp_ubyte* mutingArray/* = NULL*/, mp_uint32 mutingNumChannels/* = 0*/, const mp_ubyte* customPanningTable/* = NULL*/, AudioDriverBase* preferredDriver/* = NULL*/, mp_sint32* timingLUT/* = NULL*/) { PlayerBase* player = NULL; AudioDriverBase* wavWriter = preferredDriver; bool isWAVWriterDriver = false; if (wavWriter == NULL) { wavWriter = new WAVWriter(fileName); isWAVWriterDriver = true; if (!static_cast(wavWriter)->isOpen()) { delete wavWriter; return -1; } } MasterMixer mixer(frequency, bufferSize, 1, wavWriter); mixer.setSampleShift(sampleShift); mixer.setDisableMixing(disableMixing); player = getPreferredPlayer(module); PeakAutoAdjustFilter filter; if (autoAdjustPeak) mixer.setFilterHook(&filter); if (player) { player->adjustFrequency(frequency); player->resetOnStop(resetOnStopFlag); player->setBufferSize(bufferSize); player->setResamplerType(resamplerType); player->setMasterVolume(masterVolume); player->setPlayMode(playMode); player->setDisableMixing(disableMixing); player->setAllowFilters(allowFilters); #ifndef MILKYTRACKER if (player->getType() == PlayerBase::PlayerType_IT) { static_cast(player)->setNumMaxVirChannels(numMaxVirChannels); } #endif mixer.addDevice(player); } if (player) { if (mutingArray && mutingNumChannels > 0 && mutingNumChannels <= module->header.channum) { for (mp_uint32 i = 0; i < mutingNumChannels; i++) player->muteChannel(i, mutingArray[i] == 1); } player->startPlaying(module, false, startOrder, 0, -1, customPanningTable, false, -1); mixer.start(); } if (endOrder == -1 || endOrder < startOrder || endOrder > module->header.ordnum - 1) endOrder = module->header.ordnum - 1; mp_sint32 curOrderPos = startOrder; if (timingLUT) { for (mp_sint32 i = 0; i < module->header.ordnum; i++) timingLUT[i] = -1; timingLUT[curOrderPos] = 0; } while (!player->hasSongHalted() && player->getOrder(0) <= endOrder) { wavWriter->advance(); if (player->getOrder(0) != curOrderPos) { #ifdef __VERBOSE__ printf("%f\n", (float)wavWriter->getNumPlayedSamples() / (float)getMixFrequency()); #endif curOrderPos = player->getOrder(0); if (timingLUT && curOrderPos < module->header.ordnum && timingLUT[curOrderPos] == -1) timingLUT[curOrderPos] = wavWriter->getNumPlayedSamples(); } } player->stopPlaying(); mixer.stop(); // important step, otherwise destruction of the audio driver will cause // trouble if the mixer instance is removed from this function's stack // and trys to access the driver which is no longer existant mixer.closeAudioDevice(); // Sync value sampleShift = mixer.getSampleShift(); filter.mixerShift = sampleShift; filter.calculateMasterVolume(); masterVolume = filter.masterVolume; delete player; mp_sint32 numWrittenSamples = wavWriter->getNumPlayedSamples(); if (isWAVWriterDriver) delete wavWriter; return numWrittenSamples; } bool PlayerGeneric::grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const { if (player) return player->grabChannelInfo(chn, channelInfo); return false; } void PlayerGeneric::setNumMaxVirChannels(mp_sint32 max) { numMaxVirChannels = max; #ifndef MILKYTRACKER if (player) { if (player->getType() == PlayerBase::PlayerType_IT) { static_cast(player)->setNumMaxVirChannels(max); } } #endif } mp_sint32 PlayerGeneric::getNumMaxVirChannels() const { #ifndef MILKYTRACKER if (player) { if (player->getType() == PlayerBase::PlayerType_IT) { return static_cast(player)->getNumMaxVirChannels(); } } #endif return numMaxVirChannels; } // milkytracker void PlayerGeneric::setPanning(mp_ubyte chn, mp_ubyte pan) { if (player) player->setPanning(chn, pan); } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderIT.cpp0000644000175000017500000006405411163403715021406 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderIT.cpp * MilkyPlay Module Loader: Impulse Tracker */ #include "Loaders.h" const char* LoaderIT::identifyModule(const mp_ubyte* buffer) { // check for .IT module if (!memcmp(buffer,"IMPM",4)) { return "IT"; } // this is not an .IT return NULL; } struct ITEnvelope { mp_ubyte Flg; mp_ubyte Num; mp_ubyte LpB; mp_ubyte LpE; mp_ubyte SLB; mp_ubyte SLE; mp_sbyte Nodes[75]; mp_ubyte unused; }; struct ITInstrument { char sig[4]; char dosName[12]; mp_ubyte unused1; mp_ubyte NNA; mp_ubyte DCT; mp_ubyte DCA; mp_uword FadeOut; mp_ubyte PPS; mp_ubyte PPCxx; mp_ubyte GbV; mp_ubyte DfP; mp_ubyte RV; mp_ubyte RP; mp_uword TrkVers; mp_ubyte NoS; mp_ubyte unused2; char name[26]; mp_ubyte IFC; mp_ubyte IFR; mp_ubyte MCh; mp_ubyte MPr; mp_uword MIDIBnk; mp_ubyte snum[240]; ITEnvelope volEnv; ITEnvelope panEnv; ITEnvelope pitchEnv; }; struct ITSample { char sig[4]; char dosName[12]; mp_ubyte unused1; mp_ubyte GvL; mp_ubyte Flg; mp_ubyte Vol; char name[26]; mp_ubyte Cvt; mp_ubyte DfP; mp_dword Length; mp_dword LoopBeg; mp_dword LoopEnd; mp_dword C5Speed; mp_dword SusLBeg; mp_dword SusLEnd; mp_dword SmpPoint; mp_ubyte ViS; mp_ubyte ViD; mp_ubyte ViR; mp_ubyte ViT; }; static void readITEnvelope(XMFileBase& f, ITEnvelope& itEnv) { itEnv.Flg = f.readByte(); itEnv.Num = f.readByte(); itEnv.LpB = f.readByte(); itEnv.LpE = f.readByte(); itEnv.SLB = f.readByte(); itEnv.SLE = f.readByte(); f.read(itEnv.Nodes, 1, 75); itEnv.unused = f.readByte(); } static void convertITEnvelope(TEnvelope& outEnv, const ITEnvelope& itEnv, mp_sword center = 0) { memset(&outEnv, 0, sizeof(TEnvelope)); outEnv.type = (itEnv.Flg & 1) | (((itEnv.Flg>>1) & 1)<<2) | ((itEnv.SLB == itEnv.SLE) ? (((itEnv.Flg>>2) & 1)<<1) : (((itEnv.Flg>>2) & 1)<<4)); outEnv.num = itEnv.Num; outEnv.sustain = itEnv.SLB; outEnv.susloope = itEnv.SLE; outEnv.loops = itEnv.LpB; outEnv.loope = itEnv.LpE; for (mp_sint32 i = 0; i < outEnv.num; i++) { outEnv.env[i][0] = LittleEndian::GET_WORD(itEnv.Nodes+(i*3+1)); outEnv.env[i][1] = ((mp_sword)itEnv.Nodes[i*3] + center) << 2; } } static void replace(char* str, mp_uint32 size, char from, char to) { for (mp_uint32 i = 0; i < size; i++) if (str[i] == from) str[i] = to; } mp_sint32 LoaderIT::load(XMFileBase& f, XModule* module) { mp_sint32 i,j; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(header->sig, 1, 4); f.read(header->name, 1, 26); f.readWord(); header->ordnum = f.readWord(); header->insnum = f.readWord(); header->smpnum = f.readWord(); header->patnum = f.readWord(); mp_uword cwt = f.readWord(); mp_uword cmwt = f.readWord(); mp_uword flags = f.readWord(); mp_uword special = f.readWord(); header->freqtab = (flags >> 3) & 1; header->mainvol = XModule::vol128to255(f.readByte()); header->flags = XModule::MODULE_ITNOTEOFF | XModule::MODULE_ST3DUALCOMMANDS | XModule::MODULE_ST3NEWINSTRUMENT | XModule::MODULE_ITTEMPOSLIDE | XModule::MODULE_XMPORTANOTEBUFFER; if (!(flags & 16)) header->flags |= XModule::MODULE_ITNEWEFFECTS; if (!(flags & 32)) header->flags |= XModule::MODULE_ITNEWGXX; else header->flags |= XModule::MODULE_ITLINKPORTAMEM; header->relnote = -12; // skip mixer volume f.readByte(); header->tempo = f.readByte(); header->speed = f.readByte(); // skip Sep f.readByte(); // skip PWD f.readByte(); mp_uword messageLength = f.readWord(); mp_dword messageOffset = f.readDword(); // skip reserved f.readDword(); mp_ubyte chnPan[64]; f.read(chnPan, 1, 64); mp_ubyte chnVol[64]; f.read(chnVol, 1, 64); // just assume the order list is smaller than 256 entries mp_ubyte orders[256]; f.read(orders, 1, header->ordnum); j = 0; for (i = 0; i < header->ordnum; i++) { if (orders[i] == 255) break; header->ord[j++] = orders[i]; } header->ordnum = j; // final songlength mp_dword insOffs[256]; mp_dword smpOffs[256]; mp_dword patOffs[256]; // creating some nice potential buffer overflows here f.readDwords(insOffs, header->insnum); f.readDwords(smpOffs, header->smpnum); f.readDwords(patOffs, header->patnum); // read instruments for (i = 0; i < header->insnum; i++) { f.seekWithBaseOffset(insOffs[i]); ITInstrument ins; f.read(ins.sig, 1, 4); // should match "IMPI" if (LittleEndian::GET_DWORD(ins.sig) != 0x49504D49) return -8; f.read(ins.dosName, 1, 12); // 0x00? ins.unused1 = f.readByte(); // enable note remapping instr[i].flags = TXMInstrument::IF_ITNOTEREMAPPING | TXMInstrument::IF_ITFADEOUT | TXMInstrument::IF_ITENVELOPES | TXMInstrument::IF_ITGOBALINSVOL; if (cmwt >= 0x200) { ins.NNA = f.readByte(); ins.DCT = f.readByte(); ins.DCA = f.readByte(); // sanity checks if (ins.NNA > 3) ins.NNA = 0; if (ins.DCT > 3) ins.DCT = 0; if (ins.DCA > 3) ins.DCA = 0; // fill in NNA stuff instr[i].flags |= (((mp_uword)ins.NNA) << 4); instr[i].flags |= (((mp_uword)ins.DCT) << 6); instr[i].flags |= (((mp_uword)ins.DCA) << 8); ins.FadeOut = f.readWord(); mp_sint32 fade = (mp_sint32)ins.FadeOut*64; if (fade > 65535) fade = 65535; instr[i].volfade = fade; ins.PPS = f.readByte(); ins.PPCxx = f.readByte(); ins.GbV = f.readByte(); instr[i].res = XModule::vol128to255(ins.GbV); ins.DfP = f.readByte(); ins.RV = f.readByte(); ins.RP = f.readByte(); ins.TrkVers = f.readWord(); ins.NoS = f.readByte(); // x? ins.unused2 = f.readByte(); f.read(ins.name, 1, 26); replace(ins.name, 26, '\0', ' '); memcpy(instr[i].name, ins.name, 26); ins.IFC = f.readByte(); ins.IFR = f.readByte(); ins.MCh = f.readByte(); ins.MPr = f.readByte(); ins.MIDIBnk = f.readWord(); instr[i].ifc = ins.IFC; instr[i].ifr = ins.IFR; //printf("%i, %i\n", ins.IFC, ins.IFR); f.read(ins.snum, 1, 240); for (j = 0; j < 120; j++) { instr[i].snum[j] = -1; instr[i].notemap[j] = 0xff; } mp_ubyte sampleTable[256]; memset(sampleTable, 0, sizeof(sampleTable)); for (j = 0; j < 120; j++) { if (ins.snum[j*2] != 0xff) { mp_sint32 index = (mp_sword)ins.snum[j*2+1]-1; instr[i].snum[j] = index; instr[i].notemap[j] = ins.snum[j*2]; //if ((j - 12) >= 0) // instr[i].snum[j-12] = index; //if ((j - 12) >= 0 && (ins.snum[j*2] >= 12)) // instr[i].notemap[j-12] = ins.snum[j*2] - 12; if (index >= 0 && index < 256) sampleTable[index] = 1; } } mp_sint32 smpNum = 0; for (j = 0; j < 256; j++) if (sampleTable[j]) smpNum++; instr[i].samp = smpNum; readITEnvelope(f, ins.volEnv); readITEnvelope(f, ins.panEnv); readITEnvelope(f, ins.pitchEnv); // convert envelope TEnvelope venv, penv, pitchenv; convertITEnvelope(venv, ins.volEnv); if (!module->addVolumeEnvelope(venv)) { return -7; } instr[i].venvnum = ++header->volenvnum; convertITEnvelope(penv, ins.panEnv, 32); if (!module->addPanningEnvelope(penv)) { return -7; } instr[i].penvnum = ++header->panenvnum; convertITEnvelope(pitchenv, ins.pitchEnv, 32); if (ins.pitchEnv.Flg & 128) pitchenv.type |= 128; if (!module->addPitchEnvelope(pitchenv)) { return -7; } instr[i].pitchenvnum = ++header->pitchenvnum; } else { // Deal with old format ins.volEnv.Flg = f.readByte(); ins.volEnv.LpB = f.readByte(); ins.volEnv.LpE = f.readByte(); ins.volEnv.SLB = f.readByte(); ins.volEnv.SLE = f.readByte(); f.readWord(); ins.FadeOut = f.readWord(); mp_sint32 fade = (mp_sint32)ins.FadeOut*128; if (fade > 65535) fade = 65535; instr[i].volfade = fade; instr[i].res = 255; ins.NNA = f.readByte(); ins.DCT = f.readByte(); // sanity checks if (ins.NNA > 3) ins.NNA = 0; if (ins.DCT > 3) ins.DCT = 0; // fill in NNA stuff instr[i].flags |= (((mp_uword)ins.NNA) << 4); instr[i].flags |= (((mp_uword)ins.DCT) << 6); ins.TrkVers = f.readWord(); ins.NoS = f.readByte(); // x? ins.unused2 = f.readByte(); f.read(ins.name, 1, 26); replace(ins.name, 26, '\0', ' '); memcpy(instr[i].name, ins.name, 26); f.readDword(); f.readWord(); f.read(ins.snum, 1, 240); mp_ubyte envelope[200]; f.read(envelope, 1, 200); mp_ubyte nodeData[25*2]; f.read(nodeData, 1, 25*2); for (j = 0; j < 25; j++) { if (nodeData[j*2] == 0xff) break; ins.volEnv.Nodes[j*3] = nodeData[j*2+1]; ins.volEnv.Nodes[j*3+1] = nodeData[j*2]; ins.volEnv.Nodes[j*3+2] = 0; } ins.volEnv.Num = j; // convert envelope TEnvelope venv; convertITEnvelope(venv, ins.volEnv); if (!module->addVolumeEnvelope(venv)) { return -7; } instr[i].venvnum = ++header->volenvnum; for (j = 0; j < 120; j++) { instr[i].snum[j] = -1; instr[i].notemap[j] = 0xff; } mp_ubyte sampleTable[256]; memset(sampleTable, 0, sizeof(sampleTable)); for (j = 0; j < 120; j++) { if (ins.snum[j*2] != 0xff) { mp_sint32 index = (mp_sword)ins.snum[j*2+1]-1; instr[i].snum[j] = index; instr[i].snum[j] = index; instr[i].notemap[j] = ins.snum[j*2]; //if ((j - 12) >= 0) // instr[i].snum[j-12] = index; //if ((j - 12) >= 0 && (ins.snum[j*2] >= 12)) // instr[i].notemap[j-12] = ins.snum[j*2] - 12; if (index >= 0 && index < 256) sampleTable[index] = 1; } } mp_sint32 smpNum = 0; for (j = 0; j < 256; j++) if (sampleTable[j]) smpNum++; instr[i].samp = smpNum; } //printf("%i\n", instr[i].flags); } if (header->smpnum > MP_MAXSAMPLES) header->smpnum = MP_MAXSAMPLES; if (header->smpnum > 256) header->smpnum = 256; // read samples for (i = 0; i < header->smpnum; i++) { f.seekWithBaseOffset(smpOffs[i]); ITSample itSmp; f.read(itSmp.sig, 1, 4); // should match "IMPS" if (LittleEndian::GET_DWORD(itSmp.sig) != 0x53504D49) return -8; f.read(itSmp.dosName, 1, 12); // 0x00? itSmp.unused1 = f.readByte(); itSmp.GvL = f.readByte(); itSmp.Flg = f.readByte(); itSmp.Vol = f.readByte(); f.read(itSmp.name, 1, 26); replace(itSmp.name, 26, '\0', ' '); memcpy(smp[i].name, itSmp.name, 26); // sample mode, don't use instruments if (!(flags & 4)) { instr[i].samp = 1; for (j = 0; j < 120; j++) instr[i].snum[j] = i; memcpy(instr[i].name, itSmp.name, 26); } itSmp.Cvt = f.readByte(); itSmp.DfP = f.readByte(); itSmp.Length = f.readDword(); itSmp.LoopBeg = f.readDword(); itSmp.LoopEnd = f.readDword(); itSmp.C5Speed = f.readDword(); itSmp.SusLBeg = f.readDword(); itSmp.SusLEnd = f.readDword(); itSmp.SmpPoint = f.readDword(); itSmp.ViS = f.readByte(); itSmp.ViD = f.readByte(); itSmp.ViR = f.readByte(); itSmp.ViT = f.readByte(); switch (itSmp.ViT) { case 0: // = Sine wave smp[i].vibtype = 0; break; case 1: // = Ramp down smp[i].vibtype = 2; break; case 2: // = Square wave smp[i].vibtype = 1; break; case 3: // = Random (speed is irrelevant) default: smp[i].vibtype = 0; break; } smp[i].vibsweep = itSmp.ViR; smp[i].vibdepth = itSmp.ViD<<1; smp[i].vibrate = itSmp.ViS; smp[i].vol = XModule::vol64to255(itSmp.Vol); smp[i].pan = (itSmp.DfP & 0x80) ? 0x80 : XModule::vol127to255(itSmp.DfP & 0x7f); smp[i].flags = (itSmp.DfP & 0x80) ? 3 : 1; // res field of sample becomes global sample volume // and use IT auto vibrato instead of XM one smp[i].flags |= (8+16); smp[i].res = XModule::vol64to255(itSmp.GvL); smp[i].samplen = itSmp.Length; smp[i].loopstart = itSmp.LoopBeg; mp_sint32 looplen = ((mp_sint32)itSmp.LoopEnd - (mp_sint32)smp[i].loopstart); if (looplen < 0) looplen = 0; smp[i].looplen = looplen; smp[i].type |= (itSmp.Flg & 2) ? 16 : 0; smp[i].type |= (itSmp.Flg & 80) == 80 ? 2 : ((itSmp.Flg & 80) == 16 ? 1 : 0); XModule::convertc4spd(itSmp.C5Speed, &smp[i].finetune, &smp[i].relnote); f.seekWithBaseOffset(itSmp.SmpPoint); if ((itSmp.Flg & 1)) { if (!(smp[i].type&16)) { smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen); if (smp[i].sample == NULL) { return -7; } if (itSmp.Flg & 8) { if (!module->loadSample(f, smp[i].sample, smp[i].samplen, smp[i].samplen, cmwt==0x215 ? XModule::ST_PACKING_IT215 : XModule::ST_PACKING_IT)) { return -7; } } else if (!module->loadSample(f,smp[i].sample,smp[i].samplen,smp[i].samplen, cwt<=0x201 ? XModule::ST_UNSIGNED : XModule::ST_DEFAULT)) { return -7; } } else { smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen*2); if (smp[i].sample == NULL) { return -7; } if (itSmp.Flg & 8) { if (!module->loadSample(f, smp[i].sample, smp[i].samplen, smp[i].samplen, cmwt==0x215 ? (XModule::ST_PACKING_IT215 | XModule::ST_16BIT) : (XModule::ST_PACKING_IT | XModule::ST_16BIT))) { return -7; } } else if (!module->loadSample(f,smp[i].sample,smp[i].samplen<<1,smp[i].samplen, XModule::ST_16BIT | (cwt <= 0x201 ? XModule::ST_UNSIGNED : XModule::ST_DEFAULT))) { return -7; } } } } if (!(flags & 4)) header->insnum = header->smpnum; /*else { for (i = 0; i < header->insnum; i++) { if (instr[i].samp) { for (j = 0; j < 120; j++) { if (instr[i].snum[j] >= 0) { smp[instr[i].snum[j]].venvnum = i+1; smp[instr[i].snum[j]].penvnum = i+1; } } } } }*/ // read patterns => find number of used channels for (i = 0; i < header->patnum; i++) { if (patOffs[i]) { f.seekWithBaseOffset(patOffs[i]); mp_sint32 length = f.readWord(); mp_sint32 rows = f.readWord(); f.readDword(); mp_ubyte* buffer = new mp_ubyte[length]; f.read(buffer, 1, length); j = 0; mp_ubyte maskVariable = 0; mp_ubyte previousMaskVariable[256]; memset(previousMaskVariable, 0, sizeof(previousMaskVariable)); while (j < length) { mp_ubyte channelVariable = buffer[j++]; if (channelVariable) { mp_ubyte channel = (channelVariable-1) & 63; if (channel+1 >= header->channum) header->channum = channel+1; if (channelVariable & 128) maskVariable = previousMaskVariable[channel] = buffer[j++]; else maskVariable = previousMaskVariable[channel]; if (maskVariable & 1) j++; if (maskVariable & 2) j++; if (maskVariable & 4) j++; if (maskVariable & 8) j+=2; } } delete[] buffer; } } // read patterns for (i = 0; i < header->patnum; i++) { /*if (i == 6) { int k = 0; k++; k--; }*/ if (patOffs[i]) { f.seekWithBaseOffset(patOffs[i]); mp_sint32 length = f.readWord(); phead[i].rows = f.readWord(); f.readDword(); phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*6]; // out of memory? if (phead[i].patternData == NULL) return -7; memset(phead[i].patternData, 0, phead[i].rows*header->channum*6); mp_ubyte* buffer = new mp_ubyte[length]; f.read(buffer, 1, length); j = 0; mp_ubyte maskVariable = 0; mp_ubyte previousMaskVariable[256]; mp_ubyte previousNote[256]; mp_ubyte previousInstrument[256]; mp_ubyte previousVolume[256]; mp_ubyte previousCommand[256]; mp_ubyte previousOperand[256]; memset(previousMaskVariable, 0, sizeof(previousMaskVariable)); memset(previousNote, 0, sizeof(previousNote)); memset(previousInstrument, 0, sizeof(previousInstrument)); memset(previousVolume, 0, sizeof(previousVolume)); memset(previousCommand, 0, sizeof(previousCommand)); memset(previousOperand, 0, sizeof(previousOperand)); mp_sint32 row = 0; while (j < length && row < phead[i].rows) { mp_ubyte channelVariable = buffer[j++]; if (channelVariable && row < phead[i].rows) { mp_sint32 channel = (channelVariable-1) & 63; ASSERT(channel < phead[i].channum); ASSERT(row < phead[i].rows); mp_ubyte* slot = phead[i].patternData + (row*header->channum*6) + channel*6; if (channel+1 >= header->channum) header->channum = channel+1; if (channelVariable & 128) maskVariable = previousMaskVariable[channel] = buffer[j++]; else maskVariable = previousMaskVariable[channel]; mp_sint32 note = -1, instrument = -1, volume = -1, command = -1, operand = -1; if (maskVariable & 1) note = previousNote[channel] = buffer[j++]; if (maskVariable & 2) instrument = previousInstrument[channel] = buffer[j++]; if (maskVariable & 4) volume = previousVolume[channel] = buffer[j++]; if (maskVariable & 8) { command = previousCommand[channel] = buffer[j++]; operand = previousOperand[channel] = buffer[j++]; } if (maskVariable & 16) note = previousNote[channel]; if (maskVariable & 32) instrument = previousInstrument[channel]; if (maskVariable & 64) volume = previousVolume[channel]; if (maskVariable & 128) { command = previousCommand[channel]; operand = previousOperand[channel]; } if (note >= 0) { if (note == 255) slot[0] = XModule::NOTE_OFF; // key off else if (note == 254) slot[0] = 122; // note cut else if (note >= 12*10) slot[0] = XModule::NOTE_FADE; // fade out else if (note < 12*10) { note++; //note -= 11; if (note >= 1) slot[0] = note; } } if (instrument >= 1) slot[1] = instrument; if (volume >= 0) { // convert volume if (volume <= 64) { slot[2] = 0x0C; slot[3] = XModule::vol64to255(volume); } // convert Fine volume up else if (volume >= 65 && volume <= 74) { mp_ubyte op = (volume - 65); slot[2] = 0x49; slot[3] = op ? ((op << 4) | 0xF) : 0; } // convert Fine volume down else if (volume >= 75 && volume <= 84) { mp_ubyte op = (volume - 75); slot[2] = 0x49; slot[3] = op ? (op | 0xF0) : 0; } // convert volume up else if (volume >= 85 && volume <= 94) { mp_ubyte op = (volume - 85); slot[2] = 0x49; slot[3] = op ? (op << 4) : 0; } // convert volume down else if (volume >= 95 && volume <= 104) { mp_ubyte op = (volume - 95); slot[2] = 0x49; slot[3] = op ? op : 0; } // convert pitch slide down else if (volume >= 105 && volume <= 114) { slot[2] = 0x48; slot[3] = ((volume - 105) << 4); } // convert pitch slide up else if (volume >= 115 && volume <= 124) { slot[2] = 0x47; slot[3] = (volume - 115); } // convert panning else if (volume >= 128 && volume <= 192) { slot[2] = 0x08; slot[3] = XModule::vol64to255(volume-128); } // portamento to note else if (volume >= 193 && volume <= 202) { static const mp_ubyte portaTab[] = {1, 4, 8, 16, 32, 64, 96, 128, 255}; slot[2] = 0x03; slot[3] = portaTab[volume-193]; } // vibrato else if (volume >= 203 && volume <= 212) { slot[2] = 0x04; slot[3] = volume - 203; } } if (command >= 1) { mp_ubyte op = operand, nEff = 0, nOp = 0, eff; switch (command) { // Axx Set speed case 0x01: nEff = 0x1C; nOp = op; break; // Bxx Jump to Order case 0x02: nEff = 0x0B; nOp = op; break; // Cxx Break to Row case 0x03: nEff = 0x0D; nOp = op; break; // Dxx Volume slide down case 0x04: nEff = 0x49; nOp = op; break; // Exx porta down case 0x05: nEff = 0x48; nOp = op; break; // Fxx porta up case 0x06: nEff = 0x47; nOp = op; break; // Gxx tone porta case 0x07: nEff = 0x03; nOp = op; break; // Hxy Vibrato case 0x08: nEff = 0x04; nOp = op; break; // Ixy Tremor, ontime x, offtime y case 0x09: nEff = 0x1D; nOp = op; break; // Jxy arpeggio case 0x0A: nEff = 0x20; nOp = op; break; // Kxy vibrato & volslide case 0x0B: nEff = 0x06; nOp = op; break; // Lxx tone porta & volslide case 0x0C: nEff = 0x05; nOp = op; break; // Mxx set channel volume case 0x0D: if (nOp <= 64) { nEff = 0x50; nOp = XModule::vol64to255(op); } break; // Nxx channel volslide case 0x0E: nEff = 0x5A; nOp = op; break; // Oxx set sample offset case 0x0F: nEff = 0x09; nOp = op; break; // Pxx panning slide (TO-DO) case 0x10: nEff = 0x5B; nOp = op; break; // Qxx retrig case 0x11: nEff = 0x1B; nOp = op; break; // Rxy tremolo case 0x12: nEff = 0x07; nOp = op; break; // various subeffects case 0x13: eff = op>>4; op&=0xf; switch (eff) { case 0x0: break; // past note actions/envelope trigger control etc. case 0x7: nEff = 0x1E; nOp = 0x70 + op; break; // set panning case 0x8: nEff = 0x08; nOp = XModule::pan15to255(op); break; // set high sample offset case 0xA: nEff = 0x1E; nOp = 0xF0 + op; break; // pattern loop case 0xB: nEff = 0x36; nOp = op; break; // note cut case 0xC: nEff = 0x3C; nOp = op; break; // note delay case 0xD: nEff = 0x3D; nOp = op; break; // pattern delay case 0xE: nEff = 0x3E; nOp = op; break; #ifdef VERBOSE default: printf("Unsupported effect: S%x Op:%x\n", eff, op); #endif } break; // Txx set tempo case 0x14: nEff = 0x16; nOp = op; break; // Uxx fine vibrato case 0x15: nEff = 0x4A; nOp = op; break; // Vxx set global volume case 0x16: if (op>128) op = 128; nEff = 0x10; nOp = XModule::vol128to255(op); break; // Wxx global volume slide (stupid IT/MPT) case 0x17: nEff = 0x59; nOp = op; break; // Xxx set panning (0->FF) case 0x18: nEff = 0x08; nOp = op; break; // Yxx panbrello case 0x19: nEff = 0x5C; nOp = op; break; #ifdef VERBOSE default: printf("Unsupported effect: %x\n", command); #endif } slot[4] = nEff; slot[5] = nOp; } } else row++; } delete[] buffer; } else { phead[i].rows = 64; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*6]; // out of memory? if (phead[i].patternData == NULL) return -7; memset(phead[i].patternData, 0, phead[i].rows*header->channum*6); } } if (messageOffset && messageLength) { f.seekWithBaseOffset(messageOffset); module->allocateSongMessage(messageLength+1); if (module->message == NULL) return -7; // read song message f.read(module->message, 1, messageLength); } strcpy(header->tracker,"Impulse Tracker"); //module->setDefaultPanning(); for (i = 0; i < header->channum; i++) header->pan[i] = (chnPan[i] <= 64) ? XModule::vol64to255(chnPan[i]) : 0x80; module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderAIFF.h0000644000175000017500000000425611163403715022404 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderAIFF.h * MilkyPlay * * Created by Peter Barth on 07.01.06. * */ #ifndef SAMPLELOADERAIFF__H #define SAMPLELOADERAIFF__H #include "SampleLoaderAbstract.h" class SampleLoaderAIFF : public SampleLoaderAbstract { private: static const char* channelNames[]; public: SampleLoaderAIFF(const SYSCHAR* fileName, XModule& theModule); virtual bool identifySample(); virtual mp_sint32 getNumChannels(); virtual const char* getChannelName(mp_sint32 channelIndex); virtual mp_sint32 loadSample(mp_sint32 index, mp_sint32 channelIndex); virtual mp_sint32 saveSample(const SYSCHAR* fileName, mp_sint32); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderULT.cpp0000644000175000017500000002164411163403715021534 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderULT.cpp * MilkyPlay Module Loader: Ultratracker */ #include "Loaders.h" const char* LoaderULT::identifyModule(const mp_ubyte* buffer) { if (memcmp(buffer, "MAS_UTrack_V00", 14) == 0) { if (buffer[14] < '1' || buffer[14] > '4') return NULL; return "ULT"; } // check for .ULT return NULL; } static void convertULTEffects(mp_ubyte& effect, mp_ubyte& operand) { switch (effect) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x07: case 0x0A: case 0x0C: case 0x0D: break; case 0x05: effect = 0x23; break; case 0x09: effect = 0x21; break; case 0x0B: effect = 0x08; operand=(mp_ubyte)XModule::pan15to255(operand); break; case 0x0E: effect = 0x30 + (operand >> 4); operand &= 0xF; break; case 0x0F: if (operand >= 0x30) effect = 0x16; else effect = 0x1C; break; default: effect = operand = 0; } } mp_sint32 LoaderULT::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_sint32 i,j,k; // read header f.read(header->sig, 1, 15); mp_ubyte ver = header->sig[14]; f.read(header->name, 1, 32); i = f.readByte(); // read song message? if (ver >= '2') { char line[33], dummy[40]; for (j = 0; j < i; j++) { memset(line, 0, sizeof(line)); memset(dummy, 0, sizeof(dummy)); f.read(dummy, 1, 32); XModule::convertStr(line, dummy, 33, false); if (*line) module->addSongMessageLine(line); } } // read instruments header->insnum = f.readByte(); mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { mp_ubyte sampleName[32]; mp_ubyte dosName[12]; mp_sint32 loopstart; mp_sint32 loopend; mp_sint32 sizestart; mp_sint32 sizeend; mp_ubyte vol; mp_ubyte looptype; mp_sword finetune; mp_sint32 c2spd = 8363; f.read(sampleName, 1, 32); f.read(dosName, 1, 12); loopstart = f.readDword(); loopend = f.readDword(); sizestart = f.readDword(); sizeend = f.readDword(); vol = f.readByte(); looptype = f.readByte(); if (ver >= '4') c2spd = f.readWord(); finetune = f.readWord(); mp_sint32 smplen = sizeend - sizestart; memcpy(instr[i].name, sampleName, 32); if (smplen) { memcpy(smp[s].name, dosName, 12); instr[i].samp = 1; for (j=0;j<120;j++) instr[i].snum[j] = s; mp_sint32 finalc4spd = c2spd/*+((c2spd*finetune)/32768)*/; XModule::convertc4spd(finalc4spd, &smp[s].finetune, &smp[s].relnote); smp[s].freqadjust = finetune; smp[s].flags = 1; smp[s].vol = vol; smp[s].pan = 0x80; smp[s].samplen = smplen; mp_sint32 looplen = loopend - loopstart; if (looplen < 0) looplen = 0; smp[s].loopstart = loopstart; smp[s].looplen = looplen; if (looptype & 4) { smp[s].loopstart >>= 1; smp[s].looplen >>= 1; smp[s].type |= 16; } if ((looptype & (8+16)) == 24) smp[s].type |= 2; else if (looptype & 8) smp[s].type |= 1; s++; } } header->smpnum = s; f.read(header->ord, 1, 256); bool slenFound = false; for (i = 0; i < 256; i++) { if (header->ord[i] != 255 && !slenFound) header->ordnum = i+1; else { header->ord[i] = 0; slenFound = true; } } header->channum = (mp_sword)f.readByte()+1; header->patnum = (mp_sword)f.readByte()+1; // panning positions module->setDefaultPanning(); if (ver >= '3') { for (i = 0; i < header->channum; i++) header->pan[i] = (mp_ubyte)XModule::pan15to255(f.readByte()); } mp_sint32 numTracks = header->channum*header->patnum; mp_uword* trackSeq = new mp_uword[numTracks]; if (trackSeq == NULL) { return -7; } k = 0; for (i = 0; i < header->channum; i++) for (j = 0; j < header->patnum; j++) trackSeq[j*header->channum+i] = k++; mp_sint32 trackSize = 64*5; mp_ubyte* tracks = new mp_ubyte[trackSize*numTracks]; if (tracks == NULL) { delete[] trackSeq; return -7; } // decode tracks mp_ubyte* track = tracks; for (i = 0; i < numTracks; i++) { mp_sint32 row = 0; while (row < 64) { mp_sint32 rep = 1; mp_ubyte note, ins, eff, op1, op2; note = f.readByte(); if (note == 0xFC) { rep = f.readByte(); note = f.readByte(); } ins = f.readByte(); eff = f.readByte(); op1 = f.readByte(); op2 = f.readByte(); for (j = 0; j < rep; j++) { *track++ = note; *track++ = ins; *track++ = eff; *track++ = op1; *track++ = op2; row++; } } } // build patterns mp_uword* pTrackSeq = trackSeq; for (i = 0; i < header->patnum;i++) { phead[i].rows = 64; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; mp_sint32 slotSize = 2+(2*phead[i].effnum); phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*slotSize]; // out of memory? if (phead[i].patternData == NULL) { delete[] tracks; delete[] trackSeq; return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum*slotSize); mp_sint32 c; for (c=0;cchannum;c++) { if (*pTrackSeq < numTracks && c < header->channum) { mp_ubyte *track = *pTrackSeq*trackSize + tracks; bool portaNote1 = false; bool portaNote2 = false; for (mp_sint32 row = 0; row < 64; row++) { mp_ubyte* dstSlot = phead[i].patternData+row*phead[i].channum*slotSize+c*slotSize; mp_ubyte note = 0, ins = 0, eff1 = 0, op1 = 0, eff2 = 0, op2 = 0; if (*track) note = *track + 24; ins = *(track+1); eff1 = *(track+2) >> 4; eff2 = *(track+2) & 0xF; op2 = *(track+3); op1 = *(track+4); if (*(track+2) != 0x99) { convertULTEffects(eff1, op1); convertULTEffects(eff2, op2); } else { eff1 = 0x22; eff2 = 0x0; } // I need to fill in some portamento to note commands on the first effect if (portaNote1 && !note/* && !(eff1 == 0x03 && op1)*/) { eff1 = 0x03; op1 = 0; } // I need to fill in some portamento to note commands on the second effect if (portaNote2 && !note/* && !(eff2 == 0x03 && op2)*/) { eff2 = 0x03; op2 = 0; } dstSlot[0] = note; dstSlot[1] = ins; dstSlot[2] = eff1; dstSlot[3] = op1; dstSlot[4] = eff2; dstSlot[5] = op2; // we're having a portamento to note, set flag to continue on following // rows if no other note intersects if (eff1 == 0x03 && op1 && note) portaNote1 = true; // note intersects, stop portamento to note else if (note) portaNote1 = false; // we're having a portamento to note, set flag to continue on following // rows if no other note intersects if (eff2 == 0x03 && op2 && note) portaNote2 = true; // note intersects, stop portamento to note else if (note) portaNote2 = false; track+=5; } } pTrackSeq++; } } delete[] trackSeq; delete[] tracks; if (module->loadModuleSamples(f) != 0) return -7; header->speed=125; header->tempo=6; header->mainvol=255; strcpy(header->tracker,"Ultratracker"); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/PlayerFAR.cpp0000644000175000017500000005673711163403715021541 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerFAR.cpp * * Created by Peter Barth on Thu Jan 20 2005. * * I'm not responsible for some very twisted algorithms used in here. * It seems to work so i'm not going to rewrite any of this :) * * -------------------------------- * Version History: * -------------------------------- * 01/24/05: 669 modules are now handled by the FAR replayer * 01/20/05: Created PlayerFAR.cpp * */ // sin() #include #include "PlayerFAR.h" #include "XModule.h" #define TRUE 1 #define FALSE 0 // GUS Frequencies for 16 channels mp_uword PlayerFAR::Freqs[120] = { /*14,14,16,16,18,18,20,22,24,24,26,28, 30,32,32,34,38,40,42,44,46,50,52,56, 58,62,66,70,74,78,84,88,94,98,104,110, 118,124,132,140,148,157,167,176,187,198,211,223, 236,250,264,280,297,315,334,355,375,397,420,446, 472,500,530,559,592,630,667,705,746,792,838,890, 939,995,1057,1115,1179,1252,1318,1410,1493,1561,1664,1750, 1880,2051,2071,2206,2360,2476,2603,2743,3076,3275,3661,3797, 3905,4061,4415,4615,4836,5077,5344,5641,5973,6346,6769,7254, 7718,8181,8703,9090,9739,10226,11055,11687,12395,13195,13635,14609*/ 14,15,16,17,18,19,20,22,23,24,26,27,29, 31,33,34,37,39,41,44,46,49,52,55,58,62, 66,70,74,78,83,88,93,99,105,111,117,124, 132,140,148,157,166,176,187,198,210,222, 235,249,264,280,297,315,333,353,374,396, 420,444,471,499,529,560,594,630,667,707, 749,793,840,890,942,998,1058,1120,1189, 1260,1335,1415,1499,1587,1680,1784,1884, 1996,2122,2240,2386,2520,2670,2840,3009, 3175,3360,3568,3769,3993,4245,4481,4801, 5041,5377,5680,6019,6401,6721,7201,7609, 8065,8580,8962,9602,10082,10899,11522, 12221,13009,13443,14403 // with finetune to 22 /*14,15,16,17,18,19,20,22,23,24,26,28,29, 31,33,35,37,39,41,44,47,49,52,56,59,62, 66,70,74,79,83,88,94,99,105,112,118,125, 133,141,149,158,167,177,188,199,211,224, 237,251,266,282,298,317,335,355,377,399, 423,448,475,503,533,564,598,635,672,712, 755,800,847,898,951,1008,1066,1129,1196, 1272,1344,1425,1510,1600,1694,1800,1902, 2016,2133,2265,2400,2552,2688,2860,3032, 3200,3389,3600,3804,4032,4290,4531,4801, 5105,5377,5761,6110,6401,6835,7201,7609, 8065,8580,9165,9602,10340,10899,11522, 12221,13009,13906,14403 */ }; mp_uword PlayerFAR::VolTab[64]; mp_sint32 PlayerFAR::SinTable[16][128]; mp_sint32 PlayerFAR::mTempo[16]; void PlayerFAR::SetFreq(mp_sint32 chn, mp_sint32 freq) { setFreq(chn, /*freq*35*/(freq*72704)>>11); } /////////////////////////////////////// // FAR set volume, vol:[0-512] /////////////////////////////////////// void PlayerFAR::SetVolume(mp_sint32 chn, mp_sint32 vol) { setVol(chn, (vol*mainVolume)>>8); } /////////////////////////////////////// // FAR set panning, balance:[0-15] /////////////////////////////////////// void PlayerFAR::SetBalance(mp_sint32 chn, mp_ubyte balance) { setPan(chn, balance*0x11); } /////////////////////////////////////// // FAR player constructor /////////////////////////////////////// PlayerFAR::PlayerFAR(mp_uint32 frequency) : PlayerBase(frequency), OverFlow(0), OCount(0), PlayOrder(0), VibAmp(4),TempoType(1), PlayTempo(4), TempoBend(0) { bpm = 80; tickSpeed = 4; mp_sint32 i = 0; static bool done = false; // create sine table used for vibrato if (!done) { double t,f=1,y,amp; for (amp=0;amp<16;amp++) for (t=0;t<1;t+=(1.0/128)) { y=sin(2*3.1415*f*t)*amp; SinTable[(mp_sint32)amp][(mp_sint32)(t*128)]=(mp_sint32)y; } // create volume table for volumes 0-512 for (i = 0; i < 64; i++) VolTab[i] = i<<3; done = true; } // debugging /*for (i = 0; i < 120; i++) { Freqs[i] = player->getlogfreq(player->getlogperiod(i+1,0,0)); }*/ memset(PitchWheel,0,sizeof(PitchWheel)); memset(VibOn,0,sizeof(VibOn)); memset(VibPtr,0,sizeof(VibPtr)); memset(VibInc,0,sizeof(VibInc)); memset(RetLeft,0,sizeof(RetLeft)); // setup default values for (i = 0; i < 16; i++) { CurVols[i] = 0xF; CurBalance[i] = 0x8; DestPitch[i] = 0; Increment[i] = 0; PresPitch[i] = 0; VolWheel[i] = 0; DestVol[i] = 0; VIncrement[i] = 0; PresVol[i] = 0; RetSpc[i] = 0; CurSpc[i] = 0; RetSmp[i] = 0; RetVol[i] = 0; OfftCnt[i] = 0; RetCnt[i] = 0; CurFreqs[i] = 0; CurChSmp[i] = 0; CurNote[i] = 0; CurEff[i] = 0; } CalcTempo(); } /////////////////////////////////////// // FAR player destructor /////////////////////////////////////// PlayerFAR::~PlayerFAR() { } /////////////////////////////////////// // FAR restart (see PlayerBase) /////////////////////////////////////// void PlayerFAR::restart(mp_uint32 startPosition/* = 0*/, mp_uint32 startRow/* = 0*/, bool resetMixer/* = true*/, const mp_ubyte* customPanningTable/* = NULL*/, bool playOneRowOnly/* = false*/) { // base class restart PlayerBase::restart(startPosition, startRow, resetMixer, customPanningTable, playOneRowOnly); VibAmp=4; // 669 uses a different tempo scheme switch (module->getType()) { case XModule::ModuleType_669: TempoType = 0; break; default: TempoType = 1; } //TempoType = 1; PlayTempo = tickSpeed = module->header.tempo; TempoBend = 0; memset(PitchWheel,0,sizeof(PitchWheel)); memset(VibOn,0,sizeof(VibOn)); memset(VibPtr,0,sizeof(VibPtr)); memset(VibInc,0,sizeof(VibInc)); memset(RetLeft,0,sizeof(RetLeft)); for (mp_sint32 i = 0; i < 16; i++) { CurVols[i] = 0xF; CurBalance[i] = 0x8; } CalcTempo(); } /////////////////////////////////////// // Compute FAR tempos /////////////////////////////////////// void PlayerFAR::CalcTempo() { mp_uword q; mTempo[0]=256; for (q=1;q<16;q++) mTempo[q]=128/q; UpdateTempo(mTempo[4]); } /////////////////////////////////////// // Set new tempo // My mixer class emulates a // 250Hz timer so we need to convert // the PC-Int8 timing into our 250Hz // model /////////////////////////////////////// void PlayerFAR::UpdateTempo(mp_sint32 tps) { // original FAR replaying... 669 tempo not supported because of hi timer resolution mp_uint32 eax,di,cx; eax=1197255/tps; cx=0; di=0; while (eax>0xFFFF) { eax>>=1; di++; cx++; } if (cx>=2) di++; di+=3; OverFlow=di; OCount=di; // convert timer frequency into 250Hz base float t = (1197255.0f / (float)eax); t = 1.0f/(250.0f/t); // for tempo 0 we get a period that is slightly shorter than what we can // do with 250Hz but the difference is very small so just correct it by // clamping if (t > 1.0f) t = 1.0f; adder = (mp_uint32)((mp_int64)(t*65536.0*65536.0)); // see above if (!adder) adder = 0xFFFFFFFF; } /////////////////////////////////////// // FAR replay routine timer handler // for 250Hz base timer /////////////////////////////////////// void PlayerFAR::timerHandler(mp_sint32 currentBeatPacket) { PlayerBase::timerHandler(currentBeatPacket); if (paused) return; if (module == NULL) return; // make sure this is a FAR tune if (module->getType() != XModule::ModuleType_FAR && module->getType() != XModule::ModuleType_669) return; // make sure we're dealing with less or equal 16 channels if (module->header.channum > 16) return; setActiveChannels(/*numChannels*/module->header.channum); mp_int64 dummy = (mp_int64)BPMCounter; dummy+=(mp_int64)adder; BPMCounter=(mp_sint32)dummy; // check overflow-carry if ((dummy>>32)) { mp_uword c,/*ov,*/m,q; mp_sint32 fp,sp,t,ch; mp_ubyte fekt; mp_ubyte* Pattern = module->phead[module->header.ord[poscnt]].patternData; mp_sint32 numChannels = module->phead[module->header.ord[poscnt]].channum; mp_sint32 BreakLoc = module->phead[module->header.ord[poscnt]].rows - 2; mp_sint32 CurSpot = rowcnt * module->header.channum * 6; for (ch=0;ch=128) // Reset counter VibPtr[ch]=0; if (!Increment[ch]) // Note port doing it for us? SetFreq(ch,CurFreqs[ch]+PitchWheel[ch]+SinTable[VibAmp][VibPtr[ch]]); } if (Increment[ch]) { // Deal with note port t=(CurFreqs[ch]+PitchWheel[ch]); if (Increment[ch]<0) { if (t<=DestPitch[ch]) { Increment[ch]=0; PresPitch[ch]=0; CurFreqs[ch]=DestPitch[ch]; DestPitch[ch]=0; } else PresPitch[ch]+=Increment[ch]; } else { if (t>=DestPitch[ch]) { Increment[ch]=0; PresPitch[ch]=0; CurFreqs[ch]=DestPitch[ch]; DestPitch[ch]=0; } else PresPitch[ch]+=Increment[ch]; } } PitchWheel[ch]=PresPitch[ch]/256; SetFreq(ch,CurFreqs[ch]+PitchWheel[ch]+SinTable[VibAmp][VibPtr[ch]]); if (VIncrement[ch]) { // Deal with vol port t=(CurVols[ch]*4)+VolWheel[ch]; if (VIncrement[ch]<0) { if (t<=DestVol[ch]) { VIncrement[ch]=0; PresVol[ch]=0; CurVols[ch]=DestVol[ch]/4; DestVol[ch]=0; } else PresVol[ch]+=VIncrement[ch]; } else { if (t>=DestVol[ch]) { VIncrement[ch]=0; PresVol[ch]=0; CurVols[ch]=DestVol[ch]/4; DestPitch[ch]=0; } else PresVol[ch]+=VIncrement[ch]; } VolWheel[ch]=PresVol[ch]; if ( ((CurVols[ch]*4)+VolWheel[ch])< 0) { VIncrement[ch]=0; PresVol[ch]=0; CurVols[ch]=DestVol[ch]/4; DestVol[ch]=0; SetVolume(ch,VolTab[0]); } else SetVolume(ch,VolTab[(CurVols[ch]*4)+VolWheel[ch]]); } if (RetLeft[ch]) { // Deal with retrigger CurSpc[ch]+=2; if (CurSpc[ch]>=RetSpc[ch]) { if (!OfftCnt[ch]) goto DoNote1; // No note offset (retrig) if (OfftCnt[ch]==RetCnt[ch]) goto DoNote1; // Time for output of note goto NoNote1; DoNote1: q=RetSmp[ch]; m=module->smp[module->instr[q].snum[0]].type; CurVols[ch]=RetVol[ch]-1; CurChSmp[ch]=q; if ((m&3) && module->instr[q].snum[0] != -1) { playSample(CurVoice, module->smp[module->instr[q].snum[0]].sample, // sample buffer module->smp[module->instr[q].snum[0]].samplen, // sample size 0, // sample offset 0, // sample offset fraction false, // wrap sample offset when exceeding sample length module->smp[module->instr[q].snum[0]].loopstart, // loop start module->smp[module->instr[q].snum[0]].loopstart+module->smp[module->instr[q].snum[0]].looplen, // loop end m); } else { playSample(CurVoice, module->smp[module->instr[q].snum[0]].sample, // sample buffer module->smp[module->instr[q].snum[0]].samplen, // sample size 0, // sample offset 0, // sample offset fraction false, // wrap sample offset when exceeding sample length 0, // loop start module->smp[module->instr[q].snum[0]].samplen, // loop end m); } SetVolume(ch,VolTab[(CurVols[ch]*4)+VolWheel[ch]]); RetLeft[ch]--; CurSpc[ch]=0; NoNote1: RetCnt[ch]++; } } } //oo: if (OCount--) return; OCount=OverFlow; for (c=0;csmp[module->instr[q].snum[0]].type; //if (Sample[Pattern[CurSpot+1]].SType&1) m|=(1<<2); CurFreqs[CurVoice]=Freqs[Pattern[CurSpot]-1/*-3*12*/]; SetFreq(CurVoice,CurFreqs[CurVoice]); CurChSmp[CurVoice]=q; /*if (m&(1<<2)) PlaySample(module->smp[module->instr[q].snum[0]].Seg/2, module->smp[module->instr[q].snum[0]].Off/2, module->smp[module->instr[q].snum[0]].Rep/2, module->smp[module->instr[q].snum[0]].RepEnd/2, CurVoice,m); else PlaySample(module->smp[module->instr[q].snum[0]].Seg, module->smp[module->instr[q].snum[0]].Off, module->smp[module->instr[q].snum[0]].Rep, module->smp[module->instr[q].snum[0]].RepEnd, CurVoice,m);*/ if ((m&3) && module->instr[q].snum[0] != -1) { playSample(CurVoice, module->smp[module->instr[q].snum[0]].sample, // sample buffer module->smp[module->instr[q].snum[0]].samplen, // sample size 0, // sample offset 0, // sample offset fraction false, // wrap sample offset when exceeding sample length module->smp[module->instr[q].snum[0]].loopstart, // loop start module->smp[module->instr[q].snum[0]].loopstart+module->smp[module->instr[q].snum[0]].looplen, // loop end m); } else { playSample(CurVoice, module->smp[module->instr[q].snum[0]].sample, // sample buffer module->smp[module->instr[q].snum[0]].samplen, // sample size 0, // sample offset 0, // sample offset fraction false, // wrap sample offset when exceeding sample length 0, // loop start module->smp[module->instr[q].snum[0]].samplen, // loop end m); } PresPitch[CurVoice]=0; DestPitch[CurVoice]=0; Increment[CurVoice]=0; // Bars[CurVoice]=(Pattern[CurSpot+2]*fs)/16; } SetBalance(CurVoice,CurBalance[CurVoice]); if ((Pattern[CurSpot+3]) && fekt!=0xa0) { PresVol[CurVoice]=0; VolWheel[CurVoice]=0; DestVol[CurVoice]=0; VIncrement[CurVoice]=0; CurVols[CurVoice]=((Pattern[CurSpot+3]>>4)-1); SetVolume(CurVoice,VolTab[(CurVols[CurVoice]*4)]); // Bars[CurVoice]=(Pattern[CurSpot+2]*fs)/16; } if (Pattern[CurSpot+5]) { switch(Pattern[CurSpot+5]&0xF0) { case 0xf0: // Modify tempo tickSpeed=Pattern[CurSpot+5]&0xF; PlayTempo=tickSpeed; if (TempoType) UpdateTempo(mTempo[PlayTempo]+TempoBend); else UpdateTempo(mTempo[PlayTempo]+(TempoBend*2)); break; case 0xe0: // Fine tempo up/cancel if (Pattern[CurSpot+5]&0xF) { TempoBend+=Pattern[CurSpot+5]&0xF; if ((TempoBend+mTempo[PlayTempo])>=100) TempoBend=100; } else TempoBend=0; if (TempoType) UpdateTempo(mTempo[PlayTempo]+TempoBend); else UpdateTempo(mTempo[PlayTempo]+(TempoBend*2)); break; case 0xd0: // Fine tempo down/cancel if (Pattern[CurSpot+5]&0xF) { TempoBend-=Pattern[CurSpot+5]&0xF; if ((TempoBend+mTempo[PlayTempo])<=0) TempoBend=0; } else TempoBend=0; if (TempoType) UpdateTempo(mTempo[PlayTempo]+TempoBend); else UpdateTempo(mTempo[PlayTempo]+(TempoBend*2)); break; case 0xb0: // Set Balance CurBalance[CurVoice]=Pattern[CurSpot+5]&0xF; SetBalance(CurVoice,CurBalance[CurVoice]); break; case 0x10: // raise pitch PresPitch[CurVoice]+=((Pattern[CurSpot+5]&0xF)*4)*256; PitchWheel[CurVoice]=PresPitch[CurVoice]/256; DestPitch[CurVoice]=0; Increment[CurVoice]=0; SetFreq(ch,CurFreqs[ch]+PitchWheel[ch]+SinTable[VibAmp][VibPtr[ch]]); break; case 0x20: // lower pitch PresPitch[CurVoice]-=((Pattern[CurSpot+5]&0xF)*4)*256; PitchWheel[CurVoice]=PresPitch[CurVoice]/256; DestPitch[CurVoice]=0; Increment[CurVoice]=0; SetFreq(ch,CurFreqs[ch]+PitchWheel[ch]+SinTable[VibAmp][VibPtr[ch]]); break; case 0x30: // Port to note if (Pattern[CurSpot]) { t=0; fp=CurFreqs[CurVoice]+PitchWheel[CurVoice]; sp=Freqs[Pattern[CurSpot]-1/*-3*12*/]; DestPitch[CurVoice]=sp; if (fp>sp) {t=sp;sp=fp;fp=t;} if (module->getType() == XModule::ModuleType_669) { if (Pattern[CurSpot+5]&0xF) Increment[CurVoice]=((sp-fp)*256)/((Pattern[CurSpot+5]&0xF)* (mTempo[PlayTempo]+TempoBend)/4); else Increment[CurVoice]=((sp-fp)*256)/(1* (mTempo[PlayTempo]+TempoBend)/4); } else { if (Pattern[CurSpot+5]&0xF) Increment[CurVoice]=((sp-fp)*256)/((Pattern[CurSpot+5]&0xF)* (mTempo[PlayTempo]+TempoBend)); else Increment[CurVoice]=((sp-fp)*256)/(1* (mTempo[PlayTempo]+TempoBend)); } Increment[CurVoice]*=8; if (t) Increment[CurVoice]=-Increment[CurVoice]; } break; case 0xC0: // Note Offset OfftCnt[CurVoice]=Pattern[CurSpot+5]&0xF; if (Pattern[CurSpot]) { RetLeft[CurVoice]=0xE; if (TempoType) RetSpc[CurVoice]=((mTempo[PlayTempo]+TempoBend)/(RetLeft[CurVoice]+1))/4; else RetSpc[CurVoice]=((mTempo[PlayTempo]+TempoBend)/(RetLeft[CurVoice]+1))/2; RetSmp[CurVoice]=Pattern[CurSpot+1]-1; RetVol[CurVoice]=(Pattern[CurSpot+3]>>4); CurSpc[CurVoice]=0; } break; case 0x40: // Retrigger if (Pattern[CurSpot]) { RetLeft[CurVoice]=(Pattern[CurSpot+5]&0xF)-1; if (TempoType) RetSpc[CurVoice]=((mTempo[PlayTempo]+TempoBend)/(RetLeft[CurVoice]+1))/4; else RetSpc[CurVoice]=((mTempo[PlayTempo]+TempoBend)/(RetLeft[CurVoice]+1))/2; RetSmp[CurVoice]=Pattern[CurSpot+1]-1; RetVol[CurVoice]=(Pattern[CurSpot+3]>>4); CurSpc[CurVoice]=0; } break; case 0x50: // Set vibrato amplitude VibAmp=Pattern[CurSpot+5]&0xF; break; case 0x60: // Vibrato Control if (!VibOn[CurVoice]) { VibOn[CurVoice]=1; VibInc[CurVoice]=(Pattern[CurSpot+5]&0xF)*6; VibPtr[CurVoice]=0; } else VibInc[CurVoice]=(Pattern[CurSpot+5]&0xF)*6; break; case 0x90: // Sustained vibrato control if (Pattern[CurSpot+5]&0xF) { // On if (!VibOn[CurVoice]) { VibOn[CurVoice]=2; VibInc[CurVoice]=(Pattern[CurSpot+5]&0xF)*6; VibPtr[CurVoice]=0; } else VibInc[CurVoice]=(Pattern[CurSpot+5]&0xF)*6; } else { // Off VibPtr[CurVoice]=0; VibInc[CurVoice]=0; VibOn[CurVoice]=FALSE; } break; case 0x70: // VolSldUp q=Pattern[CurSpot+5]&0xF; CurVols[CurVoice]+=q; if (CurVols[CurVoice]>0xF) CurVols[CurVoice]=0xF; SetVolume(CurVoice,VolTab[(CurVols[CurVoice]*4)+VolWheel[CurVoice]]); // Bars[CurVoice]=((CurVols[CurVoice]+1)*fs)/16; break; case 0x80: // VolSldDn q=Pattern[CurSpot+5]&0xF; CurVols[CurVoice]-=q; if (CurVols[CurVoice]<0) CurVols[CurVoice]=0; SetVolume(CurVoice,VolTab[(CurVols[CurVoice]*4)+VolWheel[CurVoice]]); // Bars[CurVoice]=((CurVols[CurVoice]+1)*fs)/16; break; case 0xA0: // Port to Vol if ((Pattern[CurSpot+5])) { t=0; fp=(CurVols[CurVoice]*4)+VolWheel[CurVoice]; sp=((Pattern[CurSpot+3]>>4)*4)-1; DestVol[CurVoice]=sp; if (fp>sp) {t=sp;sp=fp;fp=t;} if (Pattern[CurSpot+5]&0xF) VIncrement[CurVoice]=((sp-fp)*16)/((Pattern[CurSpot+5]&0xF)* (mTempo[PlayTempo]+TempoBend)); else VIncrement[CurVoice]=((sp-fp)*16)/(1* (mTempo[PlayTempo]+TempoBend)); if (t) VIncrement[CurVoice]=-VIncrement[CurVoice]; } break; case 0x00: // Global funct switch(Pattern[CurSpot+5]&0xF) { case 1: // Ramp off case 2: // Ramp on //VolRamps=(Pattern[CurSpot+5]&0xF)-1; break; case 3: q=CurChSmp[CurVoice]; //SetLoops(Sample[q].Seg,Sample[q].Off,Sample[q].Len, // Sample[q].LoopMode&0xf7,CurVoice); break; case 4: // 669 tempos case 5: // far tempos TempoType=(Pattern[CurSpot+5]&0xF)-4; if (TempoType) UpdateTempo(mTempo[PlayTempo]+TempoBend); else UpdateTempo(mTempo[PlayTempo]+(TempoBend*2)); break; } break; } } if (VibOn[CurVoice]==1 && (Pattern[CurSpot+5]&0xF0)!=0x60) { VibPtr[CurVoice]=0; VibInc[CurVoice]=0; VibOn[CurVoice]=FALSE; } /* if (Bars[CurVoice]>=fs) Bars[CurVoice]=fs-1; if (Bars[CurVoice]<1) Bars[CurVoice]=1; */ CurSpot+=6; } //CurVoice=ov; if (rowcnt<=BreakLoc) { rowcnt++; } else { //PutAwayPat(CurPattern); if (poscnt + 1 == module->header.ordnum || module->header.ord[poscnt+1] >= 0xFF) { if (repeat) poscnt=module->header.restart; else { halted = true; BPMCounter = adder = 0; if (resetOnStopFlag) resetChannelsWithoutMuting(); return; } } else { poscnt++; } CurPattern=module->header.ord[poscnt]; //GetPat(CurPattern); rowcnt=0; } } } /////////////////////////////////////// // clear effect memory for song seeking // see PlayerBase /////////////////////////////////////// void PlayerFAR::clearEffectMemory() { mp_sint32 i; OCount=OverFlow; memset(PitchWheel,0,sizeof(PitchWheel)); memset(VibOn,0,sizeof(VibOn)); memset(VibPtr,0,sizeof(VibPtr)); memset(VibInc,0,sizeof(VibInc)); memset(RetLeft,0,sizeof(RetLeft)); for (i = 0; i < 16; i++) { DestPitch[i] = 0; Increment[i] = 0; PresPitch[i] = 0; VolWheel[i] = 0; DestVol[i] = 0; VIncrement[i] = 0; PresVol[i] = 0; RetSpc[i] = 0; CurSpc[i] = 0; RetSmp[i] = 0; RetVol[i] = 0; OfftCnt[i] = 0; RetCnt[i] = 0; CurFreqs[i] = 0; CurChSmp[i] = 0; CurNote[i] = 0; CurEff[i] = 0; } } bool PlayerFAR::grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const { channelInfo.note = CurNote[chn]; channelInfo.instrument = CurChSmp[chn]+1; channelInfo.volume = (CurVols[chn] == 0xF) ? 0xFF : CurVols[chn]*0x10; channelInfo.panning = CurBalance[chn]*0x11; channelInfo.numeffects = 2; memset(channelInfo.effects, 0, sizeof(channelInfo.effects)); memset(channelInfo.operands, 0, sizeof(channelInfo.operands)); channelInfo.effects[0] = 0x70; channelInfo.operands[0] = CurEff[chn]; //memcpy(channelInfo.effects, chninfo[chn].eff, sizeof(chninfo[chn].eff)); //memcpy(channelInfo.operands, chninfo[chn].eop, sizeof(chninfo[chn].eop)); return true; } milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderAbstract.cpp0000644000175000017500000000427211163403715023773 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderAbstract.cpp * MilkyPlay * * Created by Peter Barth on 14.09.05. * */ #include "SampleLoaderAbstract.h" #include "XModule.h" const char* SampleLoaderAbstract::emptyChannelName = ""; SampleLoaderAbstract::SampleLoaderAbstract(const SYSCHAR* fileName, XModule& module) : theModule(module), theFileName(fileName), preferredDefaultName(emptyChannelName) { } void SampleLoaderAbstract::nameToSample(const char* name, TXMSample* smp) { memset(smp->name, 0, sizeof(smp->name)); if (strlen(name) <= sizeof(smp->name)) { memcpy(smp->name, name, strlen(name)); } else { memcpy(smp->name, name, sizeof(smp->name)); } } milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriverManager.cpp0000644000175000017500000001534311163403715023450 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "AudioDriverManager.h" #include "AudioDriverBase.h" #include "MilkyPlayCommon.h" #ifdef HAVE_CONFIG_H #include "config.h" #endif #define ALLOC_DRIVERLIST(NUMDRIVERS) \ enumerationIndex = -1; \ numDrivers = (NUMDRIVERS); \ driverList = new AudioDriverInterface*[numDrivers]; \ memset(driverList, 0, numDrivers*sizeof(AudioDriverInterface*)); #define CLEANUP_DRIVERLIST \ for (mp_sint32 i = 0; i < numDrivers; i++) \ delete driverList[i]; \ delete[] driverList; #if defined(DRIVER_WIN32) ////////////////////////////////////////////////////////////////// // Windows implementation ////////////////////////////////////////////////////////////////// #include "AudioDriver_MMSYSTEM.h" #if !defined(_WIN32_WCE) && !defined(__SKIPRTAUDIO__) #include "AudioDriver_RTAUDIO.h" #endif #if !defined(_WIN32_WCE) && defined(__WASAPI__) #include "AudioDriver_PORTAUDIO.h" #endif AudioDriverManager::AudioDriverManager() : defaultDriverIndex(0) { mp_sint32 driverListSize = 2; #if !defined(_WIN32_WCE) && !defined(__SKIPRTAUDIO__) driverListSize+=3; #endif #if !defined(_WIN32_WCE) && defined(__WASAPI__) driverListSize++; #endif mp_sint32 i = 0; ALLOC_DRIVERLIST(driverListSize); driverList[i++] = new AudioDriver_MMSYSTEM(); driverList[i++] = new AudioDriver_MMSYSTEM(true); #if !defined(_WIN32_WCE) && !defined(__SKIPRTAUDIO__) driverList[i++] = new AudioDriver_RTAUDIO(); driverList[i++] = new AudioDriver_RTAUDIO(AudioDriver_RTAUDIO::WINDOWS_ASIO); driverList[i++] = new AudioDriver_RTAUDIO(AudioDriver_RTAUDIO::WINDOWS_DS); // On windows vista we set the DS driver to the default #ifndef _WIN32_WCE OSVERSIONINFOEX osVersion; ZeroMemory(&osVersion, sizeof(osVersion)); osVersion.dwOSVersionInfoSize = sizeof(osVersion); if (GetVersionEx((LPOSVERSIONINFO)&osVersion)) { if (osVersion.dwMajorVersion > 5) defaultDriverIndex = i-1; } #endif #endif #if !defined(_WIN32_WCE) && defined(__WASAPI__) driverList[i++] = new AudioDriver_PORTAUDIO(); #endif } #elif defined(DRIVER_OSX) ////////////////////////////////////////////////////////////////// // Mac OS X implementation ////////////////////////////////////////////////////////////////// #include "AudioDriver_COREAUDIO.h" #ifdef __MACOSX_CORE__ #include "AudioDriver_RTAUDIO.h" #endif AudioDriverManager::AudioDriverManager() : defaultDriverIndex(0) { #ifdef __MACOSX_CORE__ ALLOC_DRIVERLIST(3); driverList[0] = new AudioDriver_COREAUDIO(); driverList[1] = new AudioDriver_RTAUDIO(); driverList[2] = new AudioDriver_RTAUDIO(AudioDriver_RTAUDIO::MACOSX_CORE); #else ALLOC_DRIVERLIST(1); driverList[0] = new AudioDriver_COREAUDIO(); #endif } #elif defined(DRIVER_UNIX) ////////////////////////////////////////////////////////////////// // UNIX implementation ////////////////////////////////////////////////////////////////// #include "AudioDriver_SDL.h" // #include "AudioDriver_RTAUDIO.h" #ifdef HAVE_LIBASOUND #include "drivers/alsa/AudioDriver_ALSA.h" #endif #ifdef HAVE_JACK_JACK_H #include "AudioDriver_JACK.h" #endif AudioDriverManager::AudioDriverManager() : defaultDriverIndex(0) { int count = 1; #ifdef HAVE_LIBASOUND count++; #endif #ifdef HAVE_JACK_JACK_H count++; #endif ALLOC_DRIVERLIST(count); count = 0; driverList[count++] = new AudioDriver_SDL(); #ifdef HAVE_LIBASOUND driverList[count++] = new AudioDriver_ALSA(); #endif #if HAVE_JACK_JACK_H driverList[count++] = new AudioDriver_JACK(); #endif } #elif defined(DRIVER_SDL) ////////////////////////////////////////////////////////////////// // SDL implementation ////////////////////////////////////////////////////////////////// #include "AudioDriver_SDL.h" AudioDriverManager::AudioDriverManager() : defaultDriverIndex(0) { ALLOC_DRIVERLIST(1); driverList[0] = new AudioDriver_SDL(); } #elif defined(DRIVER_PSP) ////////////////////////////////////////////////////////////////// // PSP implementation ////////////////////////////////////////////////////////////////// #include "AudioDriver_PSP.h" AudioDriverManager::AudioDriverManager() : defaultDriverIndex(0) { ALLOC_DRIVERLIST(1); driverList[0] = new AudioDriver_PSP(); } #endif AudioDriverInterface* AudioDriverManager::getPreferredAudioDriver() { return driverList[defaultDriverIndex]; } AudioDriverManager::~AudioDriverManager() { CLEANUP_DRIVERLIST; } AudioDriverInterface* AudioDriverManager::getAudioDriverByName(const char* name) { if (name == NULL) return NULL; for (mp_sint32 i = 0; i < numDrivers; i++) { if (strcmp(driverList[i]->getDriverID(), name) == 0) return driverList[i]; } return NULL; } const char* AudioDriverManager::getFirstDriverName() const { enumerationIndex = 0; if (enumerationIndex < numDrivers) return driverList[enumerationIndex]->getDriverID(); else return NULL; } const char* AudioDriverManager::getNextDriverName() const { enumerationIndex++; if (enumerationIndex >= numDrivers) { enumerationIndex = -1; return NULL; } return driverList[enumerationIndex]->getDriverID(); } mp_sint32 AudioDriverManager::getPreferredAudioDriverSampleRate() const { return driverList[defaultDriverIndex]->getPreferredSampleRate(); } mp_sint32 AudioDriverManager::getPreferredAudioDriverBufferSize() const { return driverList[defaultDriverIndex]->getPreferredBufferSize(); } milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriver_COMPENSATE.h0000644000175000017500000000505111163403715023333 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_COMPENSATE.h * MilkyPlay * * Created by Peter Barth on 22.04.06. * */ #ifndef __AUDIODRIVER_COMPENSATE_H__ #define __AUDIODRIVER_COMPENSATE_H__ #include "AudioDriverBase.h" #include "MilkyPlayCommon.h" #include "MasterMixer.h" class AudioDriver_COMPENSATE : public AudioDriverBase { protected: bool deviceHasStarted; mp_uint32 sampleCounter; public: AudioDriver_COMPENSATE() : deviceHasStarted(false), sampleCounter(0) { } virtual ~AudioDriver_COMPENSATE() { } virtual mp_uint32 getNumPlayedSamples() const { return sampleCounter; } void fillAudioWithCompensation(char* stream, int length) { // sanity check if (!this->deviceHasStarted) return; MasterMixer* mixer = this->mixer; // Attention: Sample buffer MUST be 16 bit stereo, otherwise this will not work this->sampleCounter+=length>>2; //mixer->updateSampleCounter(length>>2); if (isMixerActive()) mixer->mixerHandler((mp_sword*)stream); else memset(stream, 0, length); } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/computed-blep.h0000644000175000017500000014714710771755363022172 0ustar admin2admin2/* * This file taken from version 2.09 of the uade source code. * * Table generated by contrib/sinc-integral.py. */ #define WINSINCSIZE 2048 // this used to be a 2d array, but due to some stupid GCC bug I've // crunched it into a 1d array and did the 2d lookup manually static const int winsinc_integral[5*WINSINCSIZE] = { 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131070, 131070,131070,131070,131070,131069,131069,131069,131069,131068,131068,131067,131067, 131066,131066,131065,131065,131064,131063,131062,131062,131061,131060,131058,131057, 131056,131055,131053,131051,131050,131048,131046,131043,131041,131039,131036,131033, 131030,131027,131023,131019,131016,131011,131007,131002,130997,130992,130986,130980, 130973,130967,130959,130952,130944,130935,130926,130917,130907,130896,130885,130873, 130861,130848,130835,130820,130805,130789,130773,130756,130737,130718,130698,130677, 130655,130633,130609,130584,130557,130530,130502,130472,130441,130408,130375,130339, 130303,130265,130225,130184,130141,130096,130050,130002,129952,129900,129846,129790, 129732,129672,129609,129545,129478,129409,129337,129263,129186,129107,129025,128940, 128852,128762,128669,128572,128473,128370,128264,128155,128043,127927,127807,127684, 127558,127428,127293,127156,127014,126868,126718,126564,126406,126243,126076,125905, 125729,125549,125364,125174,124980,124780,124576,124367,124152,123933,123708,123478, 123243,123002,122756,122505,122247,121985,121716,121442,121162,120876,120584,120286, 119982,119672,119356,119033,118705,118370,118029,117682,117328,116967,116601,116228, 115848,115462,115069,114670,114264,113851,113432,113006,112573,112134,111688,111236, 110777,110311,109838,109359,108874,108381,107882,107377,106865,106346,105821,105290, 104752,104208,103657,103100,102537,101968,101392,100811,100224,99630,99031,98426, 97816,97199,96578,95950,95318,94680,94037,93389,92736,92079,91416,90749,90077,89401, 88721,88037,87348,86656,85960,85260,84557,83851,83141,82429,81713,80995,80274,79551, 78826,78098,77369,76638,75905,75171,74435,73699,72961,72223,71484,70745,70006,69266, 68527,67788,67050,66312,65576,64840,64106,63373,62641,61912,61184,60459,59736,59015, 58297,57582,56871,56162,55457,54755,54058,53364,52674,51989,51308,50632,49960,49294, 48632,47976,47325,46680,46041,45407,44780,44158,43543,42934,42332,41737,41148,40566, 39991,39424,38863,38310,37765,37227,36696,36173,35659,35152,34652,34161,33678,33204, 32737,32279,31828,31387,30953,30528,30112,29704,29304,28913,28530,28155,27790,27432, 27083,26743,26411,26087,25772,25465,25166,24875,24593,24318,24052,23794,23543,23300, 23066,22838,22619,22406,22202,22004,21814,21631,21454,21285,21122,20966,20816,20673, 20536,20404,20279,20160,20046,19938,19835,19738,19645,19558,19475,19396,19322,19253, 19187,19126,19068,19014,18963,18915,18871,18830,18791,18755,18721,18690,18661,18633, 18608,18584,18561,18540,18520,18501,18483,18465,18448,18431,18414,18398,18381,18364, 18347,18329,18310,18291,18270,18249,18226,18203,18177,18150,18122,18092,18060,18026, 17990,17951,17911,17868,17823,17775,17725,17672,17617,17559,17498,17434,17368,17298, 17226,17150,17072,16990,16906,16818,16727,16634,16537,16437,16334,16228,16119,16007, 15892,15774,15653,15529,15403,15273,15141,15006,14868,14728,14585,14440,14293,14143, 13990,13836,13680,13521,13361,13198,13035,12869,12702,12533,12363,12192,12019,11846, 11671,11496,11320,11143,10966,10789,10611,10433,10255,10076,9898,9721,9543,9367,9190, 9015,8840,8666,8493,8322,8151,7982,7814,7648,7484,7321,7160,7002,6845,6690,6537, 6387,6239,6094,5951,5811,5673,5538,5406,5277,5151,5027,4907,4790,4676,4565,4458, 4354,4253,4155,4061,3970,3882,3798,3718,3640,3567,3496,3430,3366,3306,3250,3197, 3147,3100,3057,3018,2981,2948,2918,2892,2868,2847,2830,2815,2804,2795,2789,2786, 2785,2787,2792,2799,2809,2820,2834,2851,2869,2889,2911,2935,2961,2988,3017,3048, 3079,3113,3147,3182,3218,3256,3294,3332,3372,3412,3452,3493,3534,3575,3616,3657, 3698,3739,3780,3820,3860,3899,3937,3975,4012,4048,4083,4118,4151,4183,4213,4243, 4271,4297,4323,4346,4368,4389,4407,4424,4440,4453,4465,4474,4482,4488,4492,4494, 4494,4491,4487,4481,4472,4462,4449,4435,4418,4399,4378,4355,4330,4303,4274,4243, 4210,4176,4139,4100,4060,4017,3973,3927,3880,3831,3780,3728,3674,3619,3562,3504, 3445,3384,3323,3260,3196,3132,3066,2999,2932,2864,2796,2727,2657,2587,2516,2446, 2375,2304,2232,2161,2090,2019,1948,1878,1807,1738,1668,1599,1531,1464,1397,1331, 1266,1201,1138,1076,1015,954,896,838,782,726,673,620,570,520,473,426,382,339,297, 258,220,184,149,116,86,56,29,4,-20,-42,-62,-80,-96,-111,-123,-134,-143,-151,-156, -160,-162,-162,-161,-158,-153,-147,-139,-130,-119,-107,-93,-78,-61,-43,-24,-4,17,40, 64,89,114,141,168,197,226,256,286,318,349,381,414,447,481,514,548,582,616,651,685, 719,753,787,821,854,887,920,953,985,1016,1047,1077,1107,1136,1164,1192,1218,1244, 1269,1293,1316,1338,1359,1379,1398,1416,1433,1449,1463,1477,1489,1500,1509,1518, 1525,1531,1536,1539,1541,1542,1542,1541,1538,1534,1528,1522,1514,1505,1495,1483, 1471,1457,1442,1426,1409,1391,1372,1352,1331,1309,1286,1262,1238,1212,1186,1159, 1131,1102,1073,1044,1013,983,951,919,887,855,822,789,755,722,688,654,620,586,552, 518,484,451,417,384,351,318,285,253,221,190,159,129,99,69,41,12,-15,-42,-68,-93, -118,-142,-165,-187,-209,-229,-249,-268,-285,-302,-318,-333,-347,-361,-373,-384, -394,-403,-412,-419,-425,-430,-435,-438,-440,-442,-442,-442,-440,-438,-435,-431, -426,-420,-413,-405,-397,-388,-378,-367,-356,-344,-331,-318,-304,-289,-274,-258, -242,-225,-208,-191,-173,-154,-136,-117,-97,-78,-58,-38,-18,2,22,43,63,83,104,124, 144,164,184,204,223,243,262,281,299,317,335,352,369,386,402,418,433,448,462,475, 488,501,513,524,535,545,554,563,571,579,586,592,597,602,606,610,612,615,616,617, 617,616,615,613,610,607,603,599,593,588,581,574,567,559,550,541,532,521,511,500, 488,476,464,451,438,424,411,397,382,368,353,338,322,307,291,275,259,243,227,211, 195,179,163,147,130,115,99,83,67,52,37,21,7,-8,-22,-36,-50,-64,-77,-90,-103,-115, -127,-138,-149,-160,-170,-180,-189,-198,-207,-215,-222,-229,-236,-242,-248,-253, -258,-262,-266,-269,-272,-274,-276,-277,-278,-278,-278,-278,-277,-275,-273,-271, -268,-265,-262,-258,-253,-248,-243,-238,-232,-226,-219,-212,-205,-198,-190,-182, -174,-166,-157,-148,-139,-130,-121,-112,-102,-92,-83,-73,-63,-53,-43,-33,-23,-13,-3, 7,17,27,36,46,55,65,74,83,92,101,109,118,126,134,141,149,156,163,170,177,183,189, 194,200,205,210,214,218,222,226,229,232,234,237,239,240,241,242,243,243,244,243, 243,242,241,239,237,235,233,230,227,224,221,217,213,209,205,200,196,191,186,180, 175,169,163,157,151,145,139,132,126,119,113,106,99,92,85,79,72,65,58,51,44,37,31, 24,17,11,4,-2,-9,-15,-21,-27,-33,-39,-44,-50,-55,-60,-65,-70,-74,-79,-83,-87,-91, -95,-98,-102,-105,-108,-110,-113,-115,-117,-119,-121,-122,-123,-124,-125,-126,-126, -126,-126,-126,-126,-125,-124,-123,-122,-121,-119,-118,-116,-114,-112,-110,-107, -105,-102,-99,-96,-93,-90,-86,-83,-80,-76,-72,-69,-65,-61,-57,-53,-49,-45,-41,-37, -33,-29,-25,-21,-17,-13,-8,-4,0,3,7,11,15,19,22,26,30,33,36,40,43,46,49,52,55,57, 60,62,65,67,69,71,73,74,76,78,79,80,81,82,83,84,84,85,85,85,85,85,85,85,85,84,83, 83,82,81,80,79,77,76,75,73,72,70,68,66,64,62,60,58,56,54,52,49,47,45,42,40,37,35, 32,30,27,25,22,20,17,15,12,10,8,5,3,0,-2,-4,-6,-9,-11,-13,-15,-17,-19,-21,-22,-24, -26,-27,-29,-30,-32,-33,-34,-35,-37,-38,-39,-39,-40,-41,-42,-42,-43,-43,-43,-44, -44,-44,-44,-44,-44,-44,-44,-43,-43,-42,-42,-41,-41,-40,-39,-39,-38,-37,-36,-35, -34,-33,-32,-31,-29,-28,-27,-26,-24,-23,-22,-20,-19,-18,-16,-15,-14,-12,-11,-9,-8, -6,-5,-4,-2,-1,0,2,3,4,6,7,8,9,10,12,13,14,15,16,17,18,18,19,20,21,22,22,23,23,24, 24,25,25,26,26,26,27,27,27,27,27,27,27,27,27,27,27,26,26,26,25,25,25,24,24,23,23, 22,22,21,21,20,19,19,18,17,16,16,15,14,13,13,12,11,10,9,9,8,7,6,5,5,4,3,2,2,1,0, -1,-1,-2,-3,-3,-4,-5,-5,-6,-6,-7,-8,-8,-9,-9,-9,-10,-10,-11,-11,-11,-12,-12,-12, -12,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-13,-12,-12, -12,-12,-11,-11,-11,-11,-10,-10,-10,-9,-9,-9,-8,-8,-8,-7,-7,-6,-6,-5,-5,-5,-4,-4, -3,-3,-3,-2,-2,-1,-1,-1,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,5,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,6,6,6,6,6,6,5,5,5,5,5,4,4,4,4,4,3,3,3,3,3, 2,2,2,2,2,1,1,1,1,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,-2,-2,-2,-3,-3,-3, -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, -3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,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,2,2,2,2,2,2,2,2,2,2,2,2,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // ------------------------------------------------------------------------------------------ 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131070,131070,131070,131070,131070,131070,131070,131070,131070,131070,131070,131070, 131070,131070,131070,131070,131070,131070,131070,131070,131070,131070,131069,131069, 131069,131069,131069,131069,131069,131069,131069,131069,131069,131069,131069,131069, 131069,131068,131068,131068,131068,131068,131068,131068,131068,131068,131068,131067, 131067,131067,131067,131067,131067,131067,131066,131066,131066,131066,131066,131065, 131065,131065,131065,131064,131064,131064,131064,131063,131063,131062,131062,131062, 131061,131061,131060,131060,131059,131059,131058,131058,131057,131056,131056,131055, 131054,131053,131052,131052,131051,131050,131049,131048,131046,131045,131044,131043, 131041,131040,131038,131037,131035,131034,131032,131030,131028,131026,131024,131022, 131020,131017,131015,131012,131010,131007,131004,131001,130998,130994,130991,130987, 130984,130980,130976,130972,130968,130963,130959,130954,130949,130944,130938,130933, 130927,130921,130915,130909,130902,130895,130888,130881,130873,130865,130857,130849, 130840,130831,130822,130813,130803,130793,130782,130771,130760,130749,130737,130725, 130712,130699,130685,130672,130657,130643,130628,130612,130596,130580,130563,130545, 130528,130509,130490,130471,130451,130430,130409,130388,130365,130343,130319,130295, 130270,130245,130219,130193,130165,130137,130109,130079,130049,130018,129987,129954, 129921,129887,129853,129817,129781,129744,129706,129667,129627,129587,129545,129503, 129459,129415,129370,129324,129276,129228,129179,129129,129078,129026,128972,128918, 128862,128806,128748,128690,128630,128569,128507,128443,128379,128313,128246,128178, 128109,128038,127966,127893,127819,127743,127667,127588,127509,127428,127346,127262, 127177,127091,127004,126915,126824,126732,126639,126545,126449,126351,126252,126152, 126050,125947,125842,125736,125628,125519,125408,125296,125182,125067,124950,124832, 124712,124591,124468,124344,124218,124090,123961,123830,123698,123564,123429,123292, 123154,123014,122872,122729,122585,122438,122291,122141,121990,121838,121684,121528, 121371,121212,121052,120891,120727,120562,120396,120228,120059,119888,119715,119541, 119366,119189,119011,118831,118649,118467,118282,118097,117909,117721,117531,117339, 117146,116952,116757,116560,116361,116161,115960,115758,115554,115349,115143,114935, 114726,114516,114305,114092,113878,113663,113447,113229,113011,112791,112570,112348, 112124,111900,111675,111448,111220,110992,110762,110531,110300,110067,109833,109598, 109363,109126,108889,108650,108411,108171,107930,107688,107445,107201,106957,106712, 106466,106219,105972,105723,105474,105225,104974,104723,104471,104219,103966,103712, 103458,103203,102948,102692,102435,102178,101920,101662,101403,101144,100885,100624, 100364,100103,99841,99579,99317,99054,98791,98527,98264,97999,97735,97470,97204,96939, 96673,96407,96140,95873,95606,95339,95071,94804,94536,94267,93999,93730,93461,93192, 92923,92653,92383,92114,91844,91573,91303,91033,90762,90491,90220,89949,89678,89407, 89136,88865,88593,88321,88050,87778,87506,87234,86962,86690,86418,86146,85874,85602, 85330,85057,84785,84513,84240,83968,83696,83423,83151,82878,82606,82333,82061,81789, 81516,81244,80971,80699,80427,80154,79882,79610,79337,79065,78793,78521,78249,77977, 77705,77433,77161,76889,76617,76345,76074,75802,75531,75259,74988,74717,74446,74175, 73904,73633,73362,73092,72821,72551,72280,72010,71740,71470,71201,70931,70661,70392, 70123,69854,69585,69317,69048,68780,68512,68244,67976,67709,67441,67174,66907,66641, 66374,66108,65842,65576,65311,65046,64781,64516,64252,63988,63724,63460,63197,62934, 62672,62409,62147,61886,61624,61363,61103,60843,60583,60323,60064,59805,59547,59289, 59031,58774,58517,58261,58005,57749,57494,57239,56985,56731,56478,56225,55973,55721, 55470,55219,54968,54718,54469,54220,53971,53724,53476,53229,52983,52737,52492,52247, 52003,51759,51516,51274,51032,50791,50550,50310,50070,49831,49593,49355,49118,48881, 48645,48410,48175,47941,47707,47474,47242,47010,46779,46549,46319,46090,45861,45633, 45406,45179,44953,44728,44503,44279,44056,43833,43611,43389,43168,42948,42728,42510, 42291,42074,41857,41640,41425,41210,40995,40782,40568,40356,40144,39933,39723,39513, 39304,39095,38887,38680,38473,38267,38062,37857,37653,37449,37247,37044,36843,36642, 36442,36242,36043,35845,35647,35450,35253,35057,34862,34667,34473,34280,34087,33894, 33703,33512,33321,33132,32942,32754,32566,32378,32192,32006,31820,31635,31451,31267, 31084,30901,30719,30538,30357,30177,29997,29818,29640,29462,29285,29108,28932,28756, 28581,28407,28233,28060,27888,27716,27545,27374,27204,27034,26865,26697,26529,26362, 26195,26029,25863,25699,25534,25371,25207,25045,24883,24722,24561,24401,24241,24082, 23924,23766,23609,23453,23297,23142,22987,22833,22679,22526,22374,22222,22071,21921, 21771,21622,21473,21325,21177,21031,20884,20739,20594,20449,20306,20162,20020,19878, 19737,19596,19456,19316,19178,19039,18902,18765,18628,18493,18358,18223,18089,17956, 17823,17691,17560,17429,17299,17169,17040,16912,16784,16657,16531,16405,16280,16155, 16031,15908,15785,15663,15541,15420,15300,15180,15061,14942,14824,14707,14590,14474, 14358,14243,14129,14015,13901,13789,13677,13565,13454,13344,13234,13125,13016,12908, 12801,12694,12588,12482,12377,12272,12168,12064,11961,11859,11757,11655,11554,11454, 11354,11255,11156,11058,10960,10863,10766,10670,10575,10480,10385,10291,10197,10104, 10012,9920,9828,9737,9646,9556,9466,9377,9289,9200,9113,9025,8939,8852,8766,8681, 8596,8512,8428,8344,8261,8178,8096,8014,7933,7852,7772,7692,7612,7533,7455,7376, 7299,7221,7144,7068,6992,6916,6841,6766,6692,6618,6544,6471,6398,6326,6254,6182, 6111,6041,5970,5901,5831,5762,5693,5625,5557,5490,5423,5356,5290,5224,5159,5093, 5029,4965,4901,4837,4774,4711,4649,4587,4525,4464,4404,4343,4283,4224,4164,4105, 4047,3989,3931,3874,3817,3760,3704,3648,3593,3538,3483,3429,3375,3321,3268,3215, 3163,3111,3059,3008,2957,2906,2856,2806,2756,2707,2658,2610,2562,2514,2466,2419, 2373,2326,2280,2235,2189,2144,2100,2056,2012,1968,1925,1882,1839,1797,1755,1714, 1672,1631,1591,1551,1511,1471,1432,1393,1354,1316,1278,1240,1203,1165,1129,1092, 1056,1020,984,949,914,879,845,811,777,743,710,677,644,612,580,548,516,485,454,423, 393,362,332,303,273,244,215,186,158,129,101,74,46,19,-8,-35,-61,-88,-114,-140,-165, -191,-216,-241,-265,-290,-314,-338,-362,-386,-409,-432,-455,-478,-501,-523,-545, -567,-589,-610,-632,-653,-674,-694,-715,-735,-756,-775,-795,-815,-834,-853,-872, -891,-910,-928,-947,-965,-983,-1000,-1018,-1035,-1052,-1069,-1086,-1103,-1119,-1136, -1152,-1168,-1184,-1199,-1215,-1230,-1245,-1260,-1275,-1289,-1304,-1318,-1332,-1346, -1360,-1373,-1387,-1400,-1413,-1426,-1439,-1452,-1464,-1477,-1489,-1501,-1513,-1524, -1536,-1547,-1558,-1570,-1581,-1591,-1602,-1612,-1623,-1633,-1643,-1653,-1663,-1672, -1682,-1691,-1700,-1709,-1718,-1727,-1735,-1744,-1752,-1760,-1768,-1776,-1784,-1792, -1799,-1807,-1814,-1821,-1828,-1835,-1842,-1848,-1855,-1861,-1867,-1873,-1879,-1885, -1891,-1896,-1902,-1907,-1913,-1918,-1923,-1928,-1932,-1937,-1942,-1946,-1950,-1955, -1959,-1963,-1967,-1971,-1974,-1978,-1981,-1985,-1988,-1991,-1994,-1997,-2000,-2003, -2006,-2009,-2011,-2013,-2016,-2018,-2020,-2022,-2024,-2026,-2028,-2030,-2032,-2033, -2035,-2036,-2037,-2039,-2040,-2041,-2042,-2043,-2044,-2045,-2045,-2046,-2047,-2047, -2048,-2048,-2048,-2049,-2049,-2049,-2049,-2049,-2049,-2049,-2049,-2048,-2048,-2048, -2047,-2047,-2046,-2046,-2045,-2044,-2043,-2043,-2042,-2041,-2040,-2039,-2038,-2036, -2035,-2034,-2033,-2031,-2030,-2028,-2027,-2025,-2024,-2022,-2020,-2019,-2017,-2015, -2013,-2011,-2009,-2007,-2005,-2003,-2001,-1998,-1996,-1994,-1992,-1989,-1987,-1984, -1982,-1979,-1977,-1974,-1971,-1969,-1966,-1963,-1960,-1957,-1954,-1952,-1949,-1946, -1942,-1939,-1936,-1933,-1930,-1927,-1923,-1920,-1917,-1913,-1910,-1906,-1903,-1899, -1896,-1892,-1889,-1885,-1881,-1878,-1874,-1870,-1866,-1863,-1859,-1855,-1851,-1847, -1843,-1839,-1835,-1831,-1827,-1823,-1819,-1814,-1810,-1806,-1802,-1798,-1793,-1789, -1785,-1780,-1776,-1771,-1767,-1763,-1758,-1754,-1749,-1745,-1740,-1736,-1731,-1726, -1722,-1717,-1713,-1708,-1703,-1698,-1694,-1689,-1684,-1680,-1675,-1670,-1665,-1660, -1656,-1651,-1646,-1641,-1636,-1631,-1626,-1622,-1617,-1612,-1607,-1602,-1597,-1592, -1587,-1582,-1577,-1572,-1567,-1562,-1557,-1552,-1547,-1542,-1537,-1532,-1527,-1522, -1517,-1512,-1507,-1502,-1497,-1492,-1487,-1482,-1477,-1471,-1466,-1461,-1456,-1451, -1446,-1441,-1436,-1431,-1426,-1421,-1416,-1411,-1406,-1401,-1395,-1390,-1385,-1380, -1375,-1370,-1365,-1360,-1355,-1350,-1345,-1340,-1335,-1330,-1325,-1320,-1315,-1310, -1305,-1300,-1295,-1290,-1285,-1280,-1275,-1270,-1265,-1260,-1255,-1250,-1245,-1240, -1235,-1230,-1225,-1220,-1215,-1210,-1205,-1200,-1195,-1190,-1185,-1180,-1175,-1171, -1166,-1161,-1156,-1151,-1146,-1141,-1136,-1131,-1127,-1122,-1117,-1112,-1107,-1102, -1098,-1093,-1088,-1083,-1078,-1074,-1069,-1064,-1059,-1055,-1050,-1045,-1040,-1036, -1031,-1026,-1022,-1017,-1012,-1007,-1003,-998,-994,-989,-984,-980,-975,-970,-966, -961,-957,-952,-948,-943,-938,-934,-929,-925,-920,-916,-911,-907,-902,-898,-894, -889,-885,-880,-876,-872,-867,-863,-858,-854,-850,-845,-841,-837,-833,-828,-824, -820,-816,-811,-807,-803,-799,-795,-790,-786,-782,-778,-774,-770,-766,-762,-757, -753,-749,-745,-741,-737,-733,-729,-725,-721,-717,-714,-710,-706,-702,-698,-694, -690,-686,-683,-679,-675,-671,-667,-664,-660,-656,-652,-649,-645,-641,-638,-634, -630,-627,-623,-620,-616,-612,-609,-605,-602,-598,-595,-591,-588,-584,-581,-577, -574,-571,-567,-564,-560,-557,-554,-550,-547,-544,-540,-537,-534,-530,-527,-524, -521,-518,-514,-511,-508,-505,-502,-499,-495,-492,-489,-486,-483,-480,-477,-474, -471,-468,-465,-462,-459,-456,-453,-450,-447,-444,-441,-438,-435,-433,-430,-427, -424,-421,-418,-416,-413,-410,-407,-405,-402,-399,-396,-394,-391,-388,-386,-383, -380,-378,-375,-373,-370,-367,-365,-362,-360,-357,-355,-352,-350,-347,-345,-342, -340,-337,-335,-333,-330,-328,-325,-323,-321,-318,-316,-314,-311,-309,-307,-305, -302,-300,-298,-296,-293,-291,-289,-287,-285,-282,-280,-278,-276,-274,-272,-270, -268,-266,-264,-261,-259,-257,-255,-253,-251,-249,-247,-246,-244,-242,-240,-238, -236,-234,-232,-230,-228,-227,-225,-223,-221,-219,-217,-216,-214,-212,-210,-209, -207,-205,-203,-202,-200,-198,-197,-195,-193,-192,-190,-188,-187,-185,-184,-182, -180,-179,-177,-176,-174,-173,-171,-170,-168,-167,-165,-164,-162,-161,-159,-158, -156,-155,-154,-152,-151,-149,-148,-147,-145,-144,-143,-141,-140,-139,-137,-136, -135,-133,-132,-131,-130,-128,-127,-126,-125,-123,-122,-121,-120,-119,-117,-116, -115,-114,-113,-112,-111,-109,-108,-107,-106,-105,-104,-103,-102,-101,-100,-99,-98, -97,-96,-95,-94,-93,-92,-91,-90,-89,-88,-87,-86,-85,-84,-83,-82,-81,-80,-79,-78, -78,-77,-76,-75,-74,-73,-72,-71,-71,-70,-69,-68,-67,-67,-66,-65,-64,-63,-63,-62, -61,-60,-60,-59,-58,-58,-57,-56,-55,-55,-54,-53,-53,-52,-51,-51,-50,-49,-49,-48, -47,-47,-46,-45,-45,-44,-44,-43,-42,-42,-41,-41,-40,-40,-39,-38,-38,-37,-37,-36, -36,-35,-35,-34,-34,-33,-33,-32,-32,-31,-31,-30,-30,-29,-29,-28,-28,-28,-27,-27, -26,-26,-25,-25,-25,-24,-24,-23,-23,-23,-22,-22,-21,-21,-21,-20,-20,-20,-19,-19, -19,-18,-18,-17,-17,-17,-17,-16,-16,-16,-15,-15,-15,-14,-14,-14,-13,-13,-13,-13, -12,-12,-12,-12,-11,-11,-11,-11,-10,-10,-10,-10,-9,-9,-9,-9,-9,-8,-8,-8,-8,-7,-7, -7,-7,-7,-7,-6,-6,-6,-6,-6,-5,-5,-5,-5,-5,-5,-5,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, -3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // ------------------------------------------------------------------------------------------ 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131071,131071,131071,131071,131071,131071,131070,131070,131070, 131070,131069,131069,131069,131068,131068,131067,131066,131066,131065,131064,131063, 131062,131061,131059,131058,131056,131055,131053,131051,131049,131046,131044,131041, 131038,131035,131031,131028,131024,131019,131015,131010,131004,130998,130992,130986, 130979,130971,130963,130955,130945,130936,130925,130914,130903,130890,130877,130863, 130849,130833,130816,130799,130781,130761,130740,130719,130696,130672,130646,130619, 130591,130562,130531,130498,130463,130427,130390,130350,130308,130265,130219,130172, 130122,130069,130015,129958,129898,129836,129772,129704,129633,129560,129483,129404, 129321,129235,129145,129051,128954,128854,128749,128640,128527,128410,128289,128163, 128033,127898,127758,127613,127463,127308,127147,126982,126810,126633,126450,126261, 126066,125864,125657,125443,125222,124994,124759,124518,124269,124013,123749,123478, 123199,122912,122617,122314,122003,121683,121355,121017,120672,120317,119953,119579, 119197,118805,118403,117992,117570,117139,116698,116246,115784,115312,114829,114336, 113831,113316,112790,112253,111705,111145,110575,109992,109399,108794,108177,107549, 106909,106257,105594,104918,104231,103532,102821,102098,101363,100616,99858,99087, 98304,97510,96703,95885,95054,94212,93358,92493,91616,90727,89827,88915,87992,87058, 86113,85157,84190,83212,82224,81225,80216,79196,78167,77128,76079,75021,73953,72877, 71792,70698,69596,68485,67367,66241,65108,63967,62820,61666,60506,59339,58168,56990, 55808,54621,53429,52234,51034,49832,48626,47417,46206,44994,43779,42563,41347,40130, 38913,37696,36480,35265,34052,32841,31632,30426,29223,28023,26828,25637,24451,23270, 22095,20926,19764,18609,17461,16321,15190,14067,12953,11849,10755,9671,8598,7537, 6487,5449,4423,3410,2411,1425,453,-504,-1447,-2375,-3287,-4184,-5064,-5928,-6775, -7605,-8417,-9212,-9989,-10747,-11487,-12208,-12910,-13592,-14255,-14898,-15521, -16124,-16706,-17268,-17809,-18329,-18829,-19306,-19763,-20198,-20612,-21004,-21374, -21723,-22050,-22355,-22639,-22900,-23140,-23358,-23555,-23729,-23883,-24014,-24124, -24213,-24281,-24328,-24353,-24359,-24343,-24307,-24251,-24175,-24079,-23964,-23830, -23677,-23505,-23314,-23106,-22879,-22636,-22375,-22097,-21804,-21494,-21168,-20827, -20472,-20102,-19718,-19320,-18909,-18486,-18050,-17603,-17144,-16674,-16194,-15705, -15205,-14697,-14181,-13657,-13125,-12587,-12042,-11491,-10936,-10375,-9810,-9242, -8670,-8096,-7520,-6942,-6363,-5783,-5204,-4625,-4047,-3471,-2897,-2325,-1756,-1191, -630,-74,477,1023,1563,2096,2623,3142,3654,4157,4652,5138,5614,6081,6537,6983,7418, 7842,8255,8655,9044,9420,9783,10134,10471,10795,11105,11401,11684,11952,12205,12444, 12669,12878,13073,13252,13417,13567,13701,13820,13924,14012,14086,14144,14187,14215, 14228,14226,14209,14178,14132,14071,13996,13907,13805,13688,13558,13415,13259,13089, 12908,12714,12508,12290,12061,11821,11570,11309,11038,10756,10466,10166,9858,9542, 9218,8886,8547,8201,7850,7492,7129,6761,6388,6011,5631,5247,4860,4471,4080,3687, 3294,2899,2504,2110,1716,1323,931,541,154,-231,-613,-991,-1365,-1736,-2101,-2462, -2817,-3166,-3510,-3847,-4177,-4500,-4816,-5124,-5424,-5716,-5999,-6273,-6539,-6795, -7042,-7279,-7506,-7722,-7929,-8125,-8310,-8485,-8649,-8802,-8943,-9074,-9193,-9300, -9397,-9481,-9555,-9617,-9667,-9706,-9733,-9749,-9754,-9748,-9730,-9701,-9661,-9610, -9548,-9476,-9393,-9300,-9196,-9083,-8960,-8827,-8685,-8534,-8373,-8204,-8027,-7842, -7648,-7447,-7238,-7023,-6801,-6572,-6337,-6096,-5849,-5598,-5341,-5080,-4815,-4545, -4273,-3997,-3718,-3436,-3153,-2867,-2581,-2293,-2004,-1715,-1425,-1136,-848,-560, -274,11,293,574,852,1127,1399,1667,1932,2192,2448,2699,2946,3187,3423,3653,3877, 4095,4306,4511,4709,4900,5084,5261,5430,5591,5744,5889,6026,6155,6276,6388,6492, 6587,6673,6750,6819,6879,6931,6973,7007,7031,7047,7055,7053,7043,7024,6997,6962, 6918,6866,6805,6737,6661,6577,6486,6387,6281,6168,6048,5922,5789,5650,5504,5353, 5196,5034,4866,4694,4517,4336,4150,3960,3767,3571,3371,3168,2963,2755,2546,2334, 2122,1907,1692,1477,1261,1044,828,612,397,183,-30,-241,-451,-659,-864,-1067,-1268, -1465,-1659,-1850,-2037,-2221,-2400,-2575,-2746,-2912,-3073,-3230,-3381,-3527,-3667, -3802,-3931,-4054,-4172,-4283,-4388,-4487,-4579,-4665,-4745,-4818,-4884,-4944,-4997, -5043,-5082,-5115,-5141,-5160,-5173,-5179,-5178,-5171,-5157,-5136,-5110,-5076,-5037, -4991,-4940,-4882,-4819,-4749,-4675,-4594,-4509,-4418,-4322,-4221,-4116,-4006,-3891, -3772,-3650,-3523,-3393,-3259,-3123,-2983,-2840,-2694,-2546,-2396,-2244,-2090,-1934, -1777,-1619,-1459,-1299,-1139,-978,-817,-655,-495,-334,-175,-16,141,298,452,605,757, 906,1053,1197,1339,1478,1615,1748,1878,2004,2127,2247,2362,2474,2582,2685,2785, 2880,2970,3056,3137,3214,3286,3353,3415,3473,3525,3572,3615,3652,3684,3711,3733, 3750,3762,3769,3771,3768,3760,3747,3729,3707,3680,3648,3611,3570,3525,3476,3422, 3364,3302,3236,3166,3093,3016,2936,2852,2766,2676,2583,2488,2390,2290,2187,2082, 1976,1867,1757,1645,1532,1418,1303,1187,1070,952,835,717,599,481,363,246,129,13, -102,-216,-329,-440,-550,-659,-766,-871,-974,-1075,-1174,-1270,-1364,-1456,-1544, -1630,-1714,-1794,-1871,-1945,-2016,-2084,-2148,-2209,-2267,-2321,-2372,-2418,-2462, -2502,-2538,-2570,-2599,-2624,-2645,-2662,-2676,-2686,-2693,-2695,-2694,-2690,-2682, -2670,-2655,-2636,-2614,-2589,-2560,-2528,-2493,-2455,-2414,-2370,-2323,-2274,-2221, -2167,-2109,-2050,-1988,-1923,-1857,-1789,-1719,-1647,-1574,-1499,-1422,-1345,-1266, -1186,-1105,-1023,-941,-858,-774,-690,-606,-522,-438,-354,-270,-187,-104,-21,61,142, 222,301,379,456,532,606,679,750,820,888,954,1018,1081,1141,1199,1255,1309,1361, 1410,1457,1502,1544,1584,1621,1655,1687,1717,1743,1768,1789,1808,1824,1838,1849, 1857,1863,1866,1867,1864,1860,1853,1843,1831,1816,1800,1780,1759,1735,1709,1681, 1651,1619,1585,1549,1511,1472,1431,1388,1344,1298,1251,1202,1153,1102,1050,997,943, 889,833,778,721,664,607,549,491,433,375,317,259,201,143,86,29,-27,-83,-138,-193, -246,-299,-351,-402,-452,-501,-548,-595,-640,-684,-726,-767,-807,-845,-882,-917, -950,-982,-1012,-1040,-1067,-1091,-1115,-1136,-1155,-1173,-1189,-1203,-1215,-1226, -1235,-1241,-1246,-1250,-1251,-1251,-1249,-1245,-1239,-1232,-1223,-1213,-1201,-1187, -1172,-1155,-1137,-1117,-1096,-1074,-1051,-1026,-1000,-973,-944,-915,-885,-854,-822, -789,-755,-720,-685,-650,-613,-577,-539,-502,-464,-426,-387,-349,-310,-272,-233, -194,-156,-118,-80,-42,-4,33,69,105,141,176,210,244,277,309,341,372,401,430,458,485, 512,537,561,584,606,626,646,665,682,698,713,727,740,751,762,771,778,785,791,795, 798,800,801,800,799,796,792,787,781,774,766,757,747,736,724,711,697,682,667,650, 633,616,597,578,558,538,517,496,474,452,429,406,382,359,335,311,286,262,237,213, 188,163,139,114,90,65,41,17,-6,-30,-53,-75,-98,-120,-141,-162,-183,-203,-222,-241, -260,-277,-295,-311,-327,-342,-357,-371,-384,-396,-408,-419,-429,-439,-448,-456, -463,-469,-475,-480,-484,-488,-490,-492,-493,-494,-493,-492,-491,-488,-485,-481, -477,-472,-466,-460,-453,-445,-437,-428,-419,-410,-399,-389,-378,-366,-354,-342, -329,-316,-303,-290,-276,-262,-248,-233,-218,-204,-189,-174,-159,-144,-129,-114,-99, -84,-69,-54,-39,-24,-10,4,18,32,46,59,73,85,98,110,122,134,145,156,167,177,186,196, 205,213,221,229,236,243,249,255,260,265,269,273,277,280,282,284,286,287,288,288, 288,287,286,285,283,281,278,275,272,268,264,259,254,249,244,238,232,225,219,212, 205,198,190,182,175,167,158,150,142,133,125,116,107,98,90,81,72,63,54,46,37,28,20, 11,3,-5,-13,-21,-29,-37,-45,-52,-59,-66,-73,-79,-86,-92,-98,-104,-109,-114,-119, -124,-128,-132,-136,-140,-143,-146,-149,-152,-154,-156,-158,-159,-160,-161,-162, -162,-163,-162,-162,-161,-161,-159,-158,-157,-155,-153,-151,-148,-146,-143,-140, -137,-133,-130,-126,-122,-118,-114,-110,-106,-101,-97,-92,-88,-83,-78,-73,-68,-64, -59,-54,-49,-44,-39,-34,-29,-24,-19,-14,-9,-5,0,5,9,14,18,22,26,30,34,38,42,45,49, 52,55,58,61,64,67,69,72,74,76,78,79,81,82,84,85,86,86,87,88,88,88,88,88,88,88,87, 87,86,85,84,83,82,80,79,77,75,74,72,70,68,66,64,61,59,57,54,52,49,47,44,42,39,36, 34,31,28,25,23,20,17,15,12,9,7,4,2,-1,-3,-6,-8,-10,-12,-15,-17,-19,-21,-23,-25, -26,-28,-30,-31,-33,-34,-36,-37,-38,-39,-40,-41,-42,-43,-43,-44,-45,-45,-45,-46, -46,-46,-46,-46,-46,-46,-45,-45,-45,-44,-44,-43,-42,-42,-41,-40,-39,-38,-37,-36, -35,-34,-33,-32,-30,-29,-28,-27,-25,-24,-23,-21,-20,-18,-17,-16,-14,-13,-11,-10,-9, -7,-6,-5,-3,-2,-1,1,2,3,4,5,7,8,9,10,11,12,13,14,14,15,16,17,17,18,19,19,20,20,21, 21,21,22,22,22,22,22,23,23,23,23,23,22,22,22,22,22,21,21,21,20,20,20,19,19,18,18, 17,16,16,15,15,14,13,13,12,11,11,10,9,9,8,7,7,6,5,5,4,3,3,2,1,1,0,-1,-1,-2,-2,-3, -3,-4,-4,-5,-5,-6,-6,-7,-7,-7,-8,-8,-8,-9,-9,-9,-9,-10,-10,-10,-10,-10,-10,-10, -10,-11,-11,-11,-11,-10,-10,-10,-10,-10,-10,-10,-10,-10,-9,-9,-9,-9,-8,-8,-8,-8,-7, -7,-7,-7,-6,-6,-6,-5,-5,-5,-4,-4,-4,-3,-3,-3,-2,-2,-2,-2,-1,-1,-1,0,0,0,0,1,1,1,2, 2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4, 4,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,-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,-2,-2,-2,-2, -2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, // ------------------------------------------------------------------------------------------ 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072,131072, 131072,131072,131072,131072,131072,131072,131072,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071,131071, 131071,131071,131071,131071,131071,131070,131070,131070,131070,131070,131070,131070, 131070,131070,131070,131070,131069,131069,131069,131069,131069,131069,131068,131068, 131068,131068,131068,131067,131067,131067,131066,131066,131066,131065,131065,131064, 131064,131064,131063,131062,131062,131061,131061,131060,131059,131058,131058,131057, 131056,131055,131054,131053,131052,131051,131049,131048,131047,131045,131044,131042, 131040,131039,131037,131035,131033,131031,131028,131026,131024,131021,131018,131015, 131012,131009,131006,131003,130999,130995,130991,130987,130983,130978,130974,130969, 130964,130959,130953,130947,130941,130935,130929,130922,130915,130908,130900,130892, 130884,130876,130867,130858,130848,130838,130828,130817,130806,130795,130783,130771, 130758,130745,130731,130717,130702,130687,130671,130655,130638,130621,130603,130585, 130566,130546,130526,130505,130483,130461,130437,130414,130389,130364,130338,130311, 130283,130255,130225,130195,130164,130132,130099,130065,130031,129995,129958,129920, 129881,129841,129800,129758,129715,129671,129625,129578,129531,129481,129431,129379, 129326,129272,129216,129159,129101,129041,128980,128918,128853,128788,128721,128652, 128582,128510,128437,128362,128285,128206,128126,128045,127961,127876,127789,127700, 127609,127517,127422,127326,127228,127128,127026,126922,126816,126708,126598,126486, 126371,126255,126137,126016,125894,125769,125642,125513,125382,125248,125112,124974, 124834,124691,124546,124399,124250,124098,123944,123787,123628,123467,123303,123137, 122969,122798,122625,122449,122271,122090,121907,121722,121534,121343,121150,120955, 120757,120557,120354,120149,119941,119731,119519,119304,119086,118866,118644,118419, 118192,117962,117730,117495,117258,117019,116777,116533,116287,116038,115787,115533, 115277,115019,114759,114496,114232,113965,113695,113424,113150,112874,112597,112317, 112035,111750,111464,111176,110886,110594,110300,110004,109706,109406,109105,108801, 108496,108189,107881,107571,107259,106945,106630,106313,105995,105675,105354,105032, 104708,104382,104056,103728,103398,103068,102736,102403,102070,101735,101398,101061, 100723,100384,100044,99704,99362,99020,98676,98333,97988,97643,97297,96950,96603, 96256,95908,95559,95211,94861,94512,94162,93812,93461,93111,92760,92409,92058,91707, 91356,91005,90654,90303,89952,89601,89250,88899,88549,88199,87849,87499,87150,86801, 86452,86104,85756,85408,85061,84715,84369,84023,83678,83334,82990,82646,82304,81962, 81620,81279,80939,80600,80261,79923,79586,79249,78914,78579,78244,77911,77578,77247, 76916,76585,76256,75927,75600,75273,74947,74622,74297,73974,73651,73329,73008,72688, 72369,72051,71733,71417,71101,70786,70472,70159,69847,69535,69225,68915,68606,68298, 67990,67684,67378,67073,66769,66466,66163,65861,65560,65260,64960,64661,64363,64066, 63769,63473,63178,62884,62590,62296,62004,61712,61421,61130,60840,60550,60262,59973, 59686,59399,59112,58826,58541,58256,57972,57688,57405,57122,56840,56558,56277,55996, 55715,55436,55156,54877,54599,54321,54043,53766,53490,53213,52938,52662,52387,52113, 51839,51565,51292,51019,50747,50475,50203,49932,49661,49391,49121,48852,48583,48314, 48046,47778,47511,47244,46978,46712,46446,46181,45917,45653,45389,45126,44864,44601, 44340,44079,43818,43558,43299,43040,42782,42524,42267,42010,41754,41499,41244,40990, 40737,40484,40232,39980,39729,39479,39230,38981,38733,38486,38239,37994,37749,37504, 37261,37018,36777,36536,36296,36056,35818,35580,35343,35108,34873,34639,34405,34173, 33942,33712,33482,33254,33026,32800,32574,32349,32126,31903,31682,31461,31242,31023, 30806,30589,30374,30160,29946,29734,29523,29313,29104,28896,28689,28483,28278,28074, 27872,27670,27470,27270,27072,26875,26678,26483,26289,26096,25904,25713,25524,25335, 25147,24961,24775,24591,24407,24225,24043,23863,23684,23505,23328,23152,22976,22802, 22628,22456,22285,22114,21945,21776,21608,21442,21276,21111,20947,20784,20622,20460, 20300,20140,19981,19823,19666,19510,19355,19200,19046,18893,18741,18589,18438,18288, 18139,17990,17843,17696,17549,17403,17258,17114,16970,16827,16685,16543,16402,16262, 16122,15983,15845,15707,15569,15433,15296,15161,15026,14891,14758,14624,14492,14359, 14228,14097,13966,13836,13707,13578,13449,13321,13194,13067,12941,12815,12689,12565, 12440,12317,12193,12071,11948,11826,11705,11584,11464,11344,11225,11107,10988,10871, 10753,10637,10521,10405,10290,10175,10061,9948,9835,9722,9610,9499,9388,9278,9168, 9059,8950,8842,8735,8628,8522,8416,8311,8206,8102,7998,7896,7793,7692,7591,7490, 7390,7291,7192,7094,6997,6900,6804,6709,6614,6520,6426,6333,6241,6149,6058,5968, 5878,5789,5700,5613,5526,5439,5353,5268,5184,5100,5017,4935,4853,4772,4691,4611, 4532,4454,4376,4299,4222,4146,4071,3997,3923,3849,3777,3705,3634,3563,3493,3423, 3354,3286,3219,3152,3085,3020,2954,2890,2826,2762,2700,2637,2576,2515,2454,2394, 2335,2276,2218,2160,2102,2046,1989,1934,1878,1824,1769,1716,1662,1610,1557,1505, 1454,1403,1352,1302,1253,1203,1155,1106,1058,1011,963,917,870,824,778,733,688,643, 599,555,512,468,425,383,341,299,257,216,175,134,93,53,13,-26,-65,-105,-143,-182, -220,-258,-296,-333,-370,-407,-444,-480,-516,-552,-588,-623,-659,-694,-728,-763, -797,-831,-865,-898,-932,-965,-997,-1030,-1062,-1094,-1126,-1158,-1189,-1220,-1251, -1282,-1312,-1343,-1373,-1402,-1432,-1461,-1490,-1519,-1547,-1575,-1603,-1631,-1659, -1686,-1713,-1739,-1766,-1792,-1818,-1844,-1869,-1894,-1919,-1944,-1968,-1992,-2016, -2039,-2063,-2086,-2108,-2131,-2153,-2175,-2196,-2218,-2239,-2259,-2280,-2300,-2320, -2339,-2359,-2378,-2396,-2415,-2433,-2451,-2469,-2486,-2503,-2520,-2536,-2552,-2568, -2584,-2599,-2614,-2629,-2644,-2658,-2672,-2686,-2699,-2712,-2725,-2738,-2750,-2762, -2774,-2786,-2797,-2808,-2819,-2829,-2840,-2850,-2860,-2869,-2878,-2888,-2896,-2905, -2914,-2922,-2930,-2938,-2945,-2953,-2960,-2967,-2973,-2980,-2986,-2992,-2998,-3004, -3010,-3015,-3020,-3026,-3030,-3035,-3040,-3044,-3048,-3053,-3057,-3060,-3064,-3068, -3071,-3074,-3077,-3080,-3083,-3086,-3089,-3091,-3094,-3096,-3098,-3100,-3102,-3104, -3106,-3108,-3109,-3111,-3112,-3113,-3115,-3116,-3117,-3118,-3119,-3120,-3120,-3121, -3122,-3122,-3123,-3123,-3123,-3124,-3124,-3124,-3124,-3124,-3124,-3124,-3124,-3123, -3123,-3123,-3122,-3122,-3121,-3121,-3120,-3120,-3119,-3118,-3117,-3116,-3115,-3114, -3113,-3112,-3111,-3110,-3108,-3107,-3105,-3104,-3102,-3101,-3099,-3097,-3096,-3094, -3092,-3090,-3088,-3086,-3083,-3081,-3079,-3076,-3074,-3071,-3069,-3066,-3063,-3061, -3058,-3055,-3052,-3049,-3045,-3042,-3039,-3035,-3032,-3028,-3025,-3021,-3017,-3013, -3010,-3005,-3001,-2997,-2993,-2989,-2984,-2980,-2975,-2971,-2966,-2961,-2956,-2951, -2946,-2941,-2936,-2931,-2925,-2920,-2915,-2909,-2903,-2898,-2892,-2886,-2880,-2874, -2868,-2862,-2856,-2850,-2843,-2837,-2830,-2824,-2817,-2811,-2804,-2797,-2791,-2784, -2777,-2770,-2763,-2756,-2749,-2742,-2734,-2727,-2720,-2713,-2705,-2698,-2690,-2683, -2675,-2668,-2660,-2653,-2645,-2637,-2630,-2622,-2614,-2606,-2599,-2591,-2583,-2575, -2567,-2559,-2551,-2544,-2536,-2528,-2520,-2512,-2504,-2496,-2488,-2480,-2472,-2464, -2456,-2448,-2440,-2432,-2424,-2416,-2408,-2400,-2392,-2384,-2376,-2368,-2360,-2352, -2344,-2336,-2328,-2321,-2313,-2305,-2297,-2289,-2281,-2273,-2266,-2258,-2250,-2242, -2234,-2227,-2219,-2211,-2203,-2196,-2188,-2180,-2172,-2165,-2157,-2149,-2142,-2134, -2127,-2119,-2111,-2104,-2096,-2089,-2081,-2074,-2066,-2059,-2051,-2044,-2036,-2029, -2021,-2014,-2006,-1999,-1991,-1984,-1976,-1969,-1962,-1954,-1947,-1939,-1932,-1925, -1917,-1910,-1902,-1895,-1888,-1880,-1873,-1865,-1858,-1851,-1843,-1836,-1829,-1821, -1814,-1806,-1799,-1792,-1784,-1777,-1770,-1762,-1755,-1747,-1740,-1733,-1725,-1718, -1711,-1703,-1696,-1689,-1681,-1674,-1667,-1659,-1652,-1644,-1637,-1630,-1622,-1615, -1608,-1600,-1593,-1586,-1578,-1571,-1564,-1556,-1549,-1542,-1535,-1527,-1520,-1513, -1506,-1498,-1491,-1484,-1477,-1469,-1462,-1455,-1448,-1441,-1433,-1426,-1419,-1412, -1405,-1398,-1391,-1384,-1377,-1370,-1363,-1356,-1349,-1342,-1335,-1328,-1321,-1314, -1307,-1300,-1293,-1287,-1280,-1273,-1266,-1260,-1253,-1246,-1240,-1233,-1226,-1220, -1213,-1207,-1200,-1193,-1187,-1181,-1174,-1168,-1161,-1155,-1149,-1142,-1136,-1130, -1123,-1117,-1111,-1105,-1099,-1093,-1087,-1081,-1074,-1068,-1062,-1057,-1051,-1045, -1039,-1033,-1027,-1021,-1015,-1010,-1004,-998,-992,-987,-981,-976,-970,-964,-959, -953,-948,-942,-937,-931,-926,-920,-915,-910,-904,-899,-894,-888,-883,-878,-873, -868,-862,-857,-852,-847,-842,-837,-832,-827,-822,-817,-812,-807,-802,-797,-792, -787,-782,-777,-772,-768,-763,-758,-753,-748,-744,-739,-734,-729,-725,-720,-715, -711,-706,-702,-697,-692,-688,-683,-679,-674,-670,-665,-661,-657,-652,-648,-643, -639,-635,-630,-626,-622,-617,-613,-609,-605,-600,-596,-592,-588,-584,-579,-575, -571,-567,-563,-559,-555,-551,-547,-543,-539,-535,-531,-527,-523,-519,-516,-512, -508,-504,-500,-497,-493,-489,-485,-482,-478,-474,-471,-467,-463,-460,-456,-453, -449,-446,-442,-439,-435,-432,-428,-425,-422,-418,-415,-412,-408,-405,-402,-399, -395,-392,-389,-386,-383,-379,-376,-373,-370,-367,-364,-361,-358,-355,-352,-349, -346,-343,-340,-338,-335,-332,-329,-326,-323,-321,-318,-315,-312,-310,-307,-304, -302,-299,-296,-294,-291,-289,-286,-283,-281,-278,-276,-273,-271,-268,-266,-264, -261,-259,-256,-254,-252,-249,-247,-245,-242,-240,-238,-236,-233,-231,-229,-227, -224,-222,-220,-218,-216,-214,-212,-209,-207,-205,-203,-201,-199,-197,-195,-193, -191,-189,-187,-185,-183,-181,-180,-178,-176,-174,-172,-170,-168,-166,-165,-163, -161,-159,-157,-156,-154,-152,-151,-149,-147,-145,-144,-142,-140,-139,-137,-136, -134,-132,-131,-129,-128,-126,-124,-123,-121,-120,-118,-117,-115,-114,-113,-111, -110,-108,-107,-105,-104,-103,-101,-100,-99,-97,-96,-95,-93,-92,-91,-89,-88,-87,-86, -84,-83,-82,-81,-80,-78,-77,-76,-75,-74,-73,-71,-70,-69,-68,-67,-66,-65,-64,-63, -62,-61,-60,-59,-58,-57,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46,-46,-45,-44, -43,-42,-41,-40,-40,-39,-38,-37,-36,-36,-35,-34,-33,-32,-32,-31,-30,-30,-29,-28, -27,-27,-26,-25,-25,-24,-23,-23,-22,-21,-21,-20,-19,-19,-18,-18,-17,-16,-16,-15, -15,-14,-14,-13,-12,-12,-11,-11,-10,-10,-9,-9,-8,-8,-7,-7,-6,-6,-5,-5,-5,-4,-4,-3, -3,-2,-2,-1,-1,-1,0,0,0,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9, 10,10,10,10,11,11,11,11,11,12,12,12,12,12,13,13,13,13,13,14,14,14,14,14,14,14,15, 15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17, 17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, 18,18,18,18,18,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,16,16, 16,16,16,16,16,16,16,16,16,16,16,15,15,15,15,15,15,15,15,15,15,14,14,14,14,14,14, 14,14,14,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12,12,11,11,11,11,11,11,11,10, 10,10,10,10,10,10,9,9,9,9,9,9,8,8,8,8,8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,5,5,5,5,5,5,4, 4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0, // ------------------------------------------------------------------------------------------ 131072,131072,131072,131072,131072,131072,131072,131072,131071,131071,131071, 131071,131071,131070,131070,131070,131069,131069,131068,131068,131067,131066,131066, 131065,131064,131063,131061,131060,131058,131057,131055,131053,131051,131048,131046, 131043,131040,131037,131033,131029,131025,131021,131016,131011,131005,130999,130993, 130986,130978,130970,130962,130953,130943,130933,130922,130910,130897,130884,130870, 130855,130839,130822,130804,130785,130765,130744,130721,130697,130672,130646,130618, 130589,130558,130525,130491,130455,130417,130377,130336,130292,130246,130198,130147, 130095,130039,129982,129921,129858,129792,129723,129651,129576,129497,129416,129330, 129242,129149,129053,128953,128849,128741,128628,128512,128390,128265,128134,127998, 127858,127712,127561,127405,127243,127076,126903,126723,126538,126346,126148,125944, 125733,125515,125290,125058,124818,124572,124317,124055,123785,123508,123222,122927, 122624,122313,121993,121664,121326,120978,120622,120255,119880,119494,119099,118693, 118278,117852,117415,116968,116510,116042,115562,115072,114570,114057,113532,112996, 112448,111889,111317,110734,110139,109532,108912,108280,107636,106980,106311,105630, 104936,104229,103510,102778,102034,101276,100506,99724,98928,98120,97299,96466,95620, 94761,93889,93005,92109,91200,90279,89345,88400,87442,86472,85490,84497,83492,82475, 81447,80408,79358,78297,77225,76142,75050,73947,72834,71712,70580,69439,68289,67130, 65963,64787,63604,62413,61215,60009,58797,57578,56354,55123,53887,52646,51401,50151, 48897,47639,46378,45115,43848,42580,41310,40039,38767,37495,36223,34951,33680,32410, 31142,29877,28614,27354,26098,24846,23598,22355,21118,19887,18662,17444,16233,15030, 13835,12649,11472,10304,9147,8001,6865,5741,4629,3529,2442,1368,308,-738,-1769,-2786, -3787,-4772,-5741,-6693,-7628,-8546,-9447,-10329,-11192,-12037,-12863,-13669,-14455, -15221,-15967,-16692,-17396,-18079,-18741,-19380,-19998,-20593,-21167,-21717,-22245, -22750,-23232,-23690,-24126,-24538,-24926,-25291,-25632,-25949,-26243,-26513,-26759, -26981,-27179,-27354,-27505,-27633,-27737,-27818,-27875,-27910,-27921,-27909,-27875, -27818,-27739,-27638,-27516,-27371,-27206,-27019,-26812,-26584,-26336,-26069,-25782, -25476,-25151,-24808,-24448,-24070,-23674,-23263,-22835,-22391,-21933,-21459,-20972, -20470,-19955,-19428,-18888,-18337,-17775,-17202,-16619,-16027,-15425,-14816,-14199, -13574,-12943,-12306,-11663,-11016,-10364,-9709,-9051,-8390,-7728,-7064,-6400,-5735, -5071,-4408,-3747,-3088,-2432,-1779,-1131,-486,153,786,1413,2034,2647,3253,3850,4439, 5018,5587,6147,6696,7233,7759,8274,8776,9265,9741,10204,10652,11087,11507,11912, 12303,12677,13037,13380,13707,14018,14313,14590,14851,15095,15321,15531,15723,15897, 16055,16194,16316,16420,16507,16577,16628,16663,16679,16679,16661,16627,16575,16507, 16422,16320,16203,16069,15920,15755,15575,15380,15170,14946,14708,14456,14191,13913, 13622,13319,13004,12678,12340,11992,11633,11265,10887,10501,10106,9703,9292,8875, 8451,8021,7585,7145,6699,6250,5797,5341,4883,4422,3960,3497,3033,2570,2106,1644, 1183,724,268,-186,-636,-1082,-1524,-1961,-2393,-2820,-3240,-3654,-4061,-4460,-4852, -5236,-5611,-5977,-6334,-6682,-7019,-7347,-7664,-7970,-8265,-8549,-8822,-9082,-9331, -9567,-9791,-10002,-10200,-10386,-10558,-10718,-10864,-10997,-11116,-11222,-11314, -11393,-11458,-11510,-11548,-11573,-11584,-11582,-11566,-11537,-11496,-11441,-11373, -11293,-11200,-11095,-10978,-10849,-10708,-10556,-10392,-10218,-10032,-9837,-9631, -9415,-9190,-8955,-8712,-8460,-8200,-7931,-7656,-7373,-7083,-6787,-6485,-6177,-5864, -5547,-5224,-4898,-4568,-4235,-3899,-3560,-3220,-2878,-2535,-2191,-1847,-1502,-1158, -816,-474,-134,204,540,872,1202,1528,1849,2167,2480,2788,3091,3388,3678,3963,4241, 4512,4776,5033,5281,5522,5754,5979,6194,6400,6598,6786,6965,7134,7293,7443,7582, 7711,7830,7939,8038,8126,8203,8271,8327,8373,8409,8434,8448,8452,8446,8429,8403, 8366,8319,8262,8195,8119,8033,7938,7834,7721,7599,7469,7330,7183,7028,6865,6695, 6518,6334,6143,5946,5743,5534,5319,5100,4875,4646,4412,4175,3934,3689,3442,3192, 2940,2685,2429,2172,1913,1654,1394,1135,875,616,359,102,-153,-406,-657,-906,-1152, -1394,-1634,-1870,-2101,-2329,-2552,-2771,-2985,-3193,-3396,-3594,-3785,-3971,-4150, -4323,-4490,-4649,-4802,-4947,-5086,-5217,-5340,-5456,-5564,-5665,-5757,-5842,-5919, -5987,-6048,-6101,-6145,-6181,-6209,-6229,-6241,-6245,-6241,-6229,-6210,-6182,-6147, -6104,-6053,-5996,-5930,-5858,-5779,-5693,-5600,-5501,-5395,-5283,-5165,-5041,-4911, -4777,-4637,-4491,-4341,-4187,-4028,-3865,-3699,-3528,-3354,-3177,-2998,-2815,-2630, -2444,-2255,-2064,-1872,-1680,-1486,-1292,-1097,-902,-708,-513,-320,-127,64,254,442, 629,813,995,1174,1351,1525,1695,1862,2026,2185,2341,2493,2640,2783,2921,3054,3183, 3306,3424,3537,3645,3746,3843,3933,4018,4097,4170,4237,4298,4353,4402,4445,4482, 4512,4536,4555,4567,4573,4573,4566,4554,4537,4513,4483,4448,4407,4361,4309,4252, 4190,4122,4050,3973,3891,3805,3714,3619,3520,3417,3310,3200,3086,2969,2849,2726, 2600,2472,2341,2209,2074,1938,1800,1660,1520,1378,1236,1093,950,806,663,520,377,235, 93,-48,-187,-325,-462,-597,-730,-862,-991,-1118,-1242,-1364,-1483,-1599,-1712, -1822,-1929,-2032,-2132,-2228,-2320,-2409,-2494,-2575,-2651,-2724,-2792,-2856,-2916, -2971,-3022,-3069,-3111,-3148,-3181,-3210,-3234,-3253,-3268,-3278,-3284,-3285,-3282, -3275,-3263,-3247,-3227,-3202,-3174,-3141,-3104,-3064,-3019,-2971,-2919,-2864,-2805, -2743,-2678,-2610,-2539,-2464,-2387,-2308,-2226,-2142,-2055,-1966,-1876,-1783,-1689, -1594,-1497,-1399,-1299,-1199,-1098,-996,-894,-791,-689,-586,-483,-380,-278,-176,-75, 26,126,224,322,418,513,606,698,788,877,963,1047,1129,1209,1287,1362,1434,1504, 1572,1637,1698,1757,1814,1867,1917,1964,2008,2049,2086,2121,2152,2180,2205,2227, 2245,2260,2272,2280,2286,2288,2287,2283,2276,2265,2252,2236,2216,2194,2169,2142, 2111,2078,2042,2004,1963,1921,1875,1828,1778,1727,1673,1618,1561,1502,1442,1380, 1317,1253,1187,1120,1053,984,915,846,775,705,633,562,491,419,348,277,206,135,65,-5, -74,-142,-209,-276,-341,-406,-469,-531,-592,-651,-709,-765,-820,-873,-924,-974, -1021,-1067,-1111,-1153,-1193,-1231,-1267,-1301,-1332,-1362,-1389,-1414,-1437,-1457, -1476,-1492,-1505,-1517,-1526,-1534,-1538,-1541,-1542,-1540,-1536,-1530,-1522,-1512, -1500,-1486,-1470,-1452,-1432,-1410,-1387,-1362,-1335,-1306,-1276,-1245,-1212,-1178, -1142,-1105,-1067,-1028,-987,-946,-904,-861,-817,-772,-727,-681,-635,-588,-541,-494, -446,-399,-351,-303,-255,-208,-160,-113,-66,-20,26,72,117,161,205,248,290,331,371, 411,449,486,523,558,592,624,656,686,715,743,769,794,817,839,860,879,897,913,928, 941,953,963,972,979,985,989,992,993,993,992,989,984,979,972,963,954,943,931,917, 903,887,870,852,833,813,792,771,748,724,700,675,649,623,596,568,540,512,483,453, 424,394,363,333,302,272,241,210,180,149,119,88,58,28,-1,-30,-59,-88,-115,-143,-170, -196,-222,-247,-272,-296,-319,-341,-363,-384,-404,-423,-441,-459,-476,-491,-506, -520,-533,-545,-557,-567,-576,-584,-592,-598,-604,-608,-612,-614,-616,-617,-616, -615,-613,-610,-607,-602,-597,-591,-583,-576,-567,-558,-548,-537,-526,-514,-501, -488,-474,-460,-445,-430,-414,-398,-382,-365,-347,-330,-312,-294,-276,-257,-239, -220,-201,-182,-163,-144,-126,-107,-88,-69,-51,-32,-14,4,22,39,56,73,90,106,122,137, 152,167,181,195,208,221,233,245,257,267,277,287,296,305,313,320,327,333,339,344, 348,352,355,358,360,362,363,363,363,362,361,359,357,354,351,347,343,338,333,327, 321,315,308,301,293,285,277,268,259,250,241,231,221,211,201,190,180,169,158,147, 136,125,114,103,91,80,69,58,47,36,25,15,4,-7,-17,-27,-37,-47,-56,-66,-75,-84,-92, -101,-109,-117,-124,-131,-138,-145,-151,-157,-163,-168,-173,-178,-182,-186,-189, -193,-196,-198,-200,-202,-204,-205,-206,-206,-206,-206,-206,-205,-204,-203,-201, -199,-197,-194,-191,-188,-185,-181,-178,-174,-169,-165,-160,-155,-150,-145,-140, -135,-129,-123,-117,-111,-105,-99,-93,-87,-81,-74,-68,-62,-55,-49,-43,-36,-30,-24, -18,-12,-6,0,6,12,18,23,29,34,39,44,49,54,58,63,67,71,75,79,82,86,89,92,95,97,100, 102,104,106,107,109,110,111,112,112,113,113,113,113,113,112,112,111,110,109,107, 106,104,103,101,99,97,94,92,89,87,84,81,78,75,72,69,66,63,60,56,53,50,46,43,39,36, 32,29,25,22,18,15,12,8,5,2,-1,-5,-8,-11,-14,-17,-19,-22,-25,-27,-30,-32,-35,-37, -39,-41,-43,-45,-46,-48,-50,-51,-52,-53,-54,-55,-56,-57,-58,-58,-59,-59,-59,-59, -59,-59,-59,-59,-58,-58,-57,-57,-56,-55,-54,-54,-53,-51,-50,-49,-48,-46,-45,-44, -42,-41,-39,-37,-36,-34,-32,-31,-29,-27,-25,-23,-22,-20,-18,-16,-14,-12,-11,-9,-7, -5,-4,-2,0,1,3,5,6,8,9,11,12,13,15,16,17,18,19,20,21,22,23,24,25,25,26,27,27,28, 28,29,29,29,29,29,30,30,30,30,29,29,29,29,29,28,28,27,27,27,26,25,25,24,24,23,22, 21,21,20,19,18,17,16,16,15,14,13,12,11,10,9,8,7,7,6,5,4,3,2,1,0,0,-1,-2,-3,-3,-4, -5,-6,-6,-7,-7,-8,-9,-9,-10,-10,-11,-11,-11,-12,-12,-12,-13,-13,-13,-13,-14,-14, -14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-14,-13,-13,-13,-13,-13,-12,-12,-12,-11, -11,-11,-10,-10,-10,-9,-9,-9,-8,-8,-7,-7,-6,-6,-6,-5,-5,-4,-4,-3,-3,-3,-2,-2,-1,-1, -1,0,0,1,1,1,2,2,2,3,3,3,3,4,4,4,4,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,5,5,5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,0,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,-2,-3,-3,-3,-3,-3,-3, -3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,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,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; milkytracker-0.90.85+dfsg/src/milkyplay/XIInstrument.h0000644000175000017500000000467011163403715022017 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * XIInstrument.h * MilkyPlay * * Created by Peter Barth on 07.03.05. * */ #ifndef XIINSTRUMENT__H #define XIINSTRUMENT__H #include "XModule.h" #include class XIInstrument { private: bool owner; public: mp_ubyte sig[21]; mp_ubyte name[22]; mp_ubyte tracker[20]; mp_ubyte nbu[96]; TEnvelope venv; TEnvelope penv; mp_ubyte vibtype, vibsweep, vibdepth, vibrate; mp_uword volfade; mp_uword res; mp_ubyte extra[20]; mp_uword numsamples; TXMSample samples[16]; public: XIInstrument(); XIInstrument(const XIInstrument& src); ~XIInstrument(); void clean(); // Load instrument, .XI by default, otherwise GUS Patch (.PAT) mp_sint32 load(const SYSCHAR* pszFile); // Load GUS Patch instrument (.PAT) mp_sint32 loadPAT(XMFile& f); mp_sint32 save(const SYSCHAR* pszFile); // assignment operator XIInstrument& operator=(const XIInstrument& src); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/XModule.cpp0000644000175000017500000021277211163403715021322 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * XModule.cpp * MilkyPlay module (based on a hybrid of the XM, MDL, AMS and IT formats) * * */ #include "XModule.h" #include "Loaders.h" #undef VERBOSE #ifdef VERBOSE #include #endif // heavy processing removes some of the nasty clicks found // in 669 and PLM songs (found in 8 bit samples only) void TXMSample::smoothLooping() { if ((type&16) || (type & 3) != 1 || sample == NULL || samplen < 1024 || looplen <= 32) return; mp_sbyte* data = (mp_sbyte*)this->sample; const mp_sint32 blockSize = 8; mp_sint32 max,t; float v1 = data[loopstart]; float v2 = data[loopstart+looplen]; float avg = (v1+v2)*0.5f; // step 1: Fade to avg from what's coming before loopstart max = loopstart; if (max > blockSize) max = blockSize; for (t = 0; t < max; t++) { float ft = (float)t/(float)max; mp_sint32 index = loopstart - max + t; mp_sint32 src = data[index]; float final = src * (1.0f - ft) + (avg * ft); data[index] = (mp_sbyte)final; } // step 2: Fade from avg into what's coming after loopstart max = blockSize; for (t = 0; t < max; t++) { float ft = (float)t/(float)max; mp_sint32 index = loopstart + t; mp_sint32 dst = data[index]; float final = avg * (1.0f - ft) + (dst * ft); data[index] = (mp_sbyte)final; } // step 3 for (t = 0; t < blockSize; t++) { mp_sint32 index = loopstart+looplen - blockSize + t; mp_sint32 src = data[index]; float ft = (float)t/(float)blockSize; float final = src * (1.0f - ft) + (avg * ft); data[index] = (mp_sbyte)final; } } void TXMSample::restoreLoopArea() { if (sample == NULL) return; mp_ubyte* originalSample = getPadStartAddr((mp_ubyte*)sample) + sizeof(TLoopDoubleBuffProps); mp_uint32 saveLen = (type&16) ? LoopAreaBackupSize * sizeof(mp_sword) : LoopAreaBackupSize; TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); ASSERT(saveLen <= LeadingPadding / 2); // 16 bit sample if (type&16) { mp_sword* data = (mp_sword*)this->sample; // save "real" loop area back from double buffer to sample if ((loopBufferProps->state[1] & 16) == (type & 16)) memcpy(data+loopBufferProps->lastloopend, originalSample, saveLen); else { // buffer has been 8 bit, now we're 16 bit => convert upwards for (mp_sint32 i = 0; i < LoopAreaBackupSize; i++) data[loopBufferProps->lastloopend+i] = ((mp_sbyte*)originalSample)[i] << 8; } loopBufferProps->state[0] = TLoopDoubleBuffProps::StateUnused; } // 8 bit sample else { mp_sbyte* data = (mp_sbyte*)this->sample; // save "real" loop area back from double buffer to sample if ((loopBufferProps->state[1] & 16) == (type & 16)) memcpy(data+loopBufferProps->lastloopend, originalSample, saveLen); else { // buffer has been 16 bit, now we're 8 bit => convert downwards for (mp_sint32 i = 0; i < LoopAreaBackupSize; i++) data[loopBufferProps->lastloopend+i] = ((mp_sword*)originalSample)[i] >> 8; } loopBufferProps->state[0] = TLoopDoubleBuffProps::StateUnused; } } void TXMSample::restoreOriginalState() { if (sample == NULL) return; TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); if (loopBufferProps->state[0] == TLoopDoubleBuffProps::StateDirty || loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUsed) { restoreLoopArea(); } } void TXMSample::postProcessSamples() { mp_ubyte buffer[8]; // this is in fact not good if (loopstart + looplen > samplen) { if (loopstart > samplen) loopstart = samplen; // calculate loop end mp_uint32 loopend = loopstart + looplen; // clip loop end if (loopend > samplen) loopend = samplen; // calculate new loop length looplen = loopend - loopstart; // no more looping if loop length is 0 if (looplen == 0) type &= ~3; } if (sample == NULL) return; mp_ubyte* originalSample = getPadStartAddr((mp_ubyte*)sample) + sizeof(TLoopDoubleBuffProps); mp_uint32 saveLen = (type&16) ? LoopAreaBackupSize * sizeof(mp_sword) : LoopAreaBackupSize; TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); ASSERT(saveLen <= sizeof(buffer)); ASSERT(saveLen <= LeadingPadding / 2); const mp_ubyte importantFlags = 3 + 16; if (loopBufferProps->state[0] == TLoopDoubleBuffProps::StateDirty || (((loopBufferProps->lastloopend != loopstart+looplen) || (loopBufferProps->state[1] != (type & importantFlags))) && loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUsed)) { restoreLoopArea(); } // 16 bit sample if (type&16) { mp_sword* data = (mp_sword*)this->sample; if (!(type&3)) { data[-1]=data[0]; data[-2]=data[1]; data[-3]=data[2]; data[-4]=data[3]; data[samplen]=data[samplen-1]; data[samplen+1]=data[samplen-2]; data[samplen+3]=data[samplen-3]; data[samplen+4]=data[samplen-4]; } else if ((type&3) && loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUnused) { // forward loop if ((type&3) == 1) { // padding start data[-1] = data[loopstart+looplen-1]; data[-2] = data[loopstart+looplen-2]; data[-3] = data[loopstart+looplen-3]; data[-4] = data[loopstart+looplen-4]; // save portions after loopend, gets overwritten now memcpy(originalSample, data+loopstart+looplen, saveLen); loopBufferProps->state[0] = TLoopDoubleBuffProps::StateUsed; loopBufferProps->state[1] = type & importantFlags; loopBufferProps->lastloopend = loopstart+looplen; memcpy(buffer, data+loopstart, saveLen); memcpy(data+loopstart+looplen, buffer, saveLen); } else if ((type&3) == 2) { data[-1] = data[0]; data[-2] = data[1]; data[-3] = data[2]; data[-4] = data[3]; mp_sint32 loopend = loopstart+looplen; // save portions after loopend, gets overwritten now memcpy(originalSample, data+loopend, saveLen); loopBufferProps->state[0] = TLoopDoubleBuffProps::StateUsed; loopBufferProps->state[1] = type & importantFlags; loopBufferProps->lastloopend = loopend; data[loopend] = data[loopend-1]; data[loopend+1] = data[loopend-2]; data[loopend+2] = data[loopend-3]; data[loopend+3] = data[loopend-4]; } } } // 8 bit sample else { mp_sbyte* data = (mp_sbyte*)this->sample; if (!(type&3)) { data[-1] = data[0]; data[-2] = data[1]; data[-3] = data[2]; data[-4] = data[3]; data[samplen] = data[samplen-1]; data[samplen+1] = data[samplen-2]; data[samplen+2] = data[samplen-3]; data[samplen+3] = data[samplen-4]; } else if ((type&3) && loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUnused) { // forward loop if ((type&3) == 1) { // leading padding data[-1] = data[loopstart+looplen-1]; data[-2] = data[loopstart+looplen-2]; data[-3] = data[loopstart+looplen-3]; data[-4] = data[loopstart+looplen-4]; // save portions after loopend, gets overwritten now memcpy(originalSample, data+loopstart+looplen, saveLen); loopBufferProps->state[0] = TLoopDoubleBuffProps::StateUsed; loopBufferProps->state[1] = type & importantFlags; loopBufferProps->lastloopend = loopstart+looplen; memcpy(buffer, data+loopstart, saveLen); memcpy(data+loopstart+looplen, buffer, saveLen); } // bidi loop else if ((type&3) == 2) { data[-1] = data[0]; data[-2] = data[1]; data[-3] = data[2]; data[-4] = data[3]; mp_sint32 loopend = loopstart+looplen; // save portions after loopend, gets overwritten now memcpy(originalSample, data+loopend, saveLen); loopBufferProps->state[0] = TLoopDoubleBuffProps::StateUsed; loopBufferProps->state[1] = type & importantFlags; loopBufferProps->lastloopend = loopend; data[loopend] = data[loopend-1]; data[loopend+1] = data[loopend-2]; data[loopend+2] = data[loopend-3]; data[loopend+3] = data[loopend-4]; } } } } // get sample value // values range from [-32768,32767] in case of a 16 bit sample // or from [-128,127] in case of an 8 bit sample mp_sint32 TXMSample::getSampleValue(mp_uint32 index) { if (type & 16) { if ((type & 3) && index >= loopstart+looplen && index < loopstart+looplen+LoopAreaBackupSize) { TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); if (loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUnused) return *(((mp_sword*)sample)+index); mp_sword* buff = (mp_sword*)(getPadStartAddr((mp_ubyte*)sample) + sizeof(TLoopDoubleBuffProps)); return *(buff + (index - (loopstart+looplen))); } else return *(((mp_sword*)sample)+index); } else { if ((type & 3) && index >= loopstart+looplen && index < loopstart+looplen+LoopAreaBackupSize) { TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); if (loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUnused) return *(sample+index); mp_sbyte* buff = (mp_sbyte*)(getPadStartAddr((mp_ubyte*)sample) + sizeof(TLoopDoubleBuffProps)); return *(buff + (index - (loopstart+looplen))); } else return *(sample+index); } } mp_sint32 TXMSample::getSampleValue(mp_ubyte* sample, mp_uint32 index) { if (type & 16) return *(((mp_sword*)sample)+index); else return *(sample+index); } void TXMSample::setSampleValue(mp_uint32 index, mp_sint32 value) { if (type & 16) { if ((type & 3) && index >= loopstart+looplen && index < loopstart+looplen+LoopAreaBackupSize) { TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); if (loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUnused) { *(((mp_sword*)sample)+index) = (mp_sword)value; return; } mp_sword* buff = (mp_sword*)(getPadStartAddr((mp_ubyte*)sample) + sizeof(TLoopDoubleBuffProps)); *(buff + (index - (loopstart+looplen))) = (mp_sword)value; loopBufferProps->state[0] = TLoopDoubleBuffProps::StateDirty; } else if ((type & 3) && index >= loopstart && index < loopstart+LoopAreaBackupSize) { TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); if (loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUsed) loopBufferProps->state[0] = TLoopDoubleBuffProps::StateUnused; *(((mp_sword*)sample)+index) = (mp_sword)value; } else *(((mp_sword*)sample)+index) = (mp_sword)value; } else { if ((type & 3) && index >= loopstart+looplen && index < loopstart+looplen+LoopAreaBackupSize) { TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); if (loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUnused) { *(sample+index) = (mp_sbyte)value; return; } mp_sbyte* buff = (mp_sbyte*)(getPadStartAddr((mp_ubyte*)sample) + sizeof(TLoopDoubleBuffProps)); *(buff + (index - (loopstart+looplen))) = (mp_sbyte)value; loopBufferProps->state[0] = TLoopDoubleBuffProps::StateDirty; } else if ((type & 3) && index >= loopstart && index < loopstart+LoopAreaBackupSize) { TLoopDoubleBuffProps* loopBufferProps = (TLoopDoubleBuffProps*)getPadStartAddr((mp_ubyte*)sample); if (loopBufferProps->state[0] == TLoopDoubleBuffProps::StateUsed) loopBufferProps->state[0] = TLoopDoubleBuffProps::StateUnused; *(sample+index) = (mp_sbyte)value; } else *(sample+index) = (mp_sbyte)value; } } void TXMSample::setSampleValue(mp_ubyte* sample, mp_uint32 index, mp_sint32 value) { if (type & 16) { *(((mp_sword*)sample)+index) = (mp_sword)value; } else *(sample+index) = (mp_sbyte)value; } #define FUNCTION_SUCCESS 0 #define FUNCTION_FAILED -1 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // IT sample loading helper class // ////////////////////////////////////////////////////////////////////////////////////////////////////////////// class ITSampleLoader : public XModule::SampleLoader { private: mp_dword* source_buffer; /* source buffer */ mp_dword* source_position; /* actual reading position */ mp_ubyte source_remaining_bits; /* bits remaining in read dword */ bool it215; public: ITSampleLoader(XMFileBase& file, bool isIt215 = false) : SampleLoader(file), source_buffer(NULL), source_position(NULL), source_remaining_bits(0), it215(isIt215) { } virtual ~ITSampleLoader() { free_IT_compressed_block(); } mp_dword read_n_bits_from_IT_compressed_block(mp_ubyte p_bits_to_read); mp_sint32 read_IT_compressed_block (); void free_IT_compressed_block (); // second parameter is ignored virtual mp_sint32 load_sample_8bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize); // second parameter is ignored virtual mp_sint32 load_sample_16bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize); }; /* * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE -The following sample decompression code is based on CheeseTracker code which is based on xmp's code.(http://xmp.helllabs.org) which is based in openCP code. :D * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE * NOTICE */ mp_dword ITSampleLoader::read_n_bits_from_IT_compressed_block (mp_ubyte p_bits_to_read) { mp_dword aux_return_value; mp_dword val; mp_ubyte *buffer=(mp_ubyte*)source_position; if ( p_bits_to_read <= source_remaining_bits ) { val=buffer[3]; val<<=8; val|=buffer[2]; val<<=8; val|=buffer[1]; val<<=8; val|=buffer[0]; aux_return_value = val & ((1 << p_bits_to_read) - 1); val >>= p_bits_to_read; source_remaining_bits -= p_bits_to_read; buffer[3]=val>>24; buffer[2]=(val>>16)&0xFF; buffer[1]=(val>>8)&0xFF; buffer[0]=(val)&0xFF; } else { aux_return_value=buffer[3]; aux_return_value<<=8; aux_return_value|=buffer[2]; aux_return_value<<=8; aux_return_value|=buffer[1]; aux_return_value<<=8; aux_return_value|=buffer[0]; mp_dword nbits = p_bits_to_read - source_remaining_bits; // aux_return_value = *source_position; source_position++; buffer+=4; val=buffer[3]; val<<=8; val|=buffer[2]; val<<=8; val|=buffer[1]; val<<=8; val|=buffer[0]; aux_return_value |= ((val & ((1 << nbits) - 1)) << source_remaining_bits); val >>= nbits; source_remaining_bits = 32 - nbits; buffer[3]=val>>24; buffer[2]=(val>>16)&0xFF; buffer[1]=(val>>8)&0xFF; buffer[0]=(val)&0xFF; } return aux_return_value; } mp_sint32 ITSampleLoader::read_IT_compressed_block () { mp_uword size; size=f.readWord(); if (f.isEOF()) return FUNCTION_FAILED; mp_sint32 finalSize = 4 * ((size >> 2) + 2); source_buffer = (mp_dword*)new mp_ubyte[finalSize]; if (source_buffer==NULL) return FUNCTION_FAILED; memset(source_buffer, 0, finalSize); mp_sint32 res = f.read(source_buffer, 1, size); if (res != size) { delete[] (mp_ubyte*)source_buffer; source_buffer = NULL; return FUNCTION_FAILED; } source_position = source_buffer; source_remaining_bits = 32; return FUNCTION_SUCCESS; } void ITSampleLoader::free_IT_compressed_block () { if (source_buffer!=NULL) delete[] (mp_ubyte*)source_buffer; source_buffer = NULL; } mp_sint32 ITSampleLoader::load_sample_8bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize) { mp_sbyte *dest_buffer; /* destination buffer which will be returned */ mp_uword block_length; /* length of compressed data block in samples */ mp_uword block_position; /* position in block */ mp_ubyte bit_width; /* actual "bit width" */ mp_uword aux_value; /* value read from file to be processed */ mp_sbyte d1, d2; /* integrator buffers (d2 for it2.15) */ mp_sbyte *dest_position; /* position in output buffer */ mp_sbyte v; /* sample value */ dest_buffer = (mp_sbyte *) p_dest_buffer; if (dest_buffer==NULL) return FUNCTION_FAILED; memset (dest_buffer, 0, p_buffsize); dest_position = dest_buffer; /* now unpack data till the dest buffer is full */ while (p_buffsize) { /* read a new block of compressed data and reset variables */ if ( read_IT_compressed_block() ) return FUNCTION_FAILED; block_length = (p_buffsize < 0x8000) ? p_buffsize : 0x8000; block_position = 0; bit_width = 9; /* start with width of 9 bits */ d1 = d2 = 0; /* reset integrator buffers */ /* now uncompress the data block */ while ( block_position < block_length ) { aux_value = read_n_bits_from_IT_compressed_block(bit_width); /* read bits */ if ( bit_width < 7 ) { /* method 1 (1-6 bits) */ if ( aux_value == (1 << (bit_width - 1)) ) { /* check for "100..." */ aux_value = read_n_bits_from_IT_compressed_block(3) + 1; /* yes -> read new width; */ bit_width = (aux_value < bit_width) ? aux_value : aux_value + 1; /* and expand it */ continue; /* ... next value */ } } else if ( bit_width < 9 ) { /* method 2 (7-8 bits) */ mp_ubyte border = (0xFF >> (9 - bit_width)) - 4; /* lower border for width chg */ if ( aux_value > border && aux_value <= (border + 8) ) { aux_value -= border; /* convert width to 1-8 */ bit_width = (aux_value < bit_width) ? aux_value : aux_value + 1; /* and expand it */ continue; /* ... next value */ } } else if ( bit_width == 9 ) { /* method 3 (9 bits) */ if ( aux_value & 0x100 ) { /* bit 8 set? */ bit_width = (aux_value + 1) & 0xff; /* new width... */ continue; /* ... and next value */ } } else { /* illegal width, abort */ free_IT_compressed_block(); return FUNCTION_FAILED; } /* now expand value to signed byte */ if ( bit_width < 8 ) { mp_ubyte tmp_shift = 8 - bit_width; v=(aux_value << tmp_shift); v>>=tmp_shift; } else v = (mp_sbyte) aux_value; /* integrate upon the sample values */ d1 += v; d2 += d1; /* ... and store it into the buffer */ *(dest_position++) = it215 ? d2 : d1; block_position++; } /* now subtract block lenght from total length and go on */ free_IT_compressed_block(); p_buffsize -= block_length; } return FUNCTION_SUCCESS; } mp_sint32 ITSampleLoader::load_sample_16bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize) { mp_sword *dest_buffer; /* destination buffer which will be returned */ mp_uword block_length; /* length of compressed data block in samples */ mp_uword block_position; /* position in block */ mp_ubyte bit_width; /* actual "bit width" */ mp_dword aux_value; /* value read from file to be processed */ mp_sword d1, d2; /* integrator buffers (d2 for it2.15) */ mp_sword *dest_position; /* position in output buffer */ mp_sword v; /* sample value */ dest_buffer = (mp_sword *) p_dest_buffer; if (dest_buffer==NULL) return FUNCTION_FAILED; memset (dest_buffer, 0, p_buffsize*2); dest_position = dest_buffer; while (p_buffsize) { /* read a new block of compressed data and reset variables */ if ( read_IT_compressed_block() ) { return FUNCTION_FAILED; } block_length = (p_buffsize < 0x4000) ? p_buffsize : 0x4000; block_position = 0; bit_width = 17; /* start with width of 9 bits */ d1 = d2 = 0; /* reset integrator buffers */ while ( block_position < block_length ) { aux_value = read_n_bits_from_IT_compressed_block(bit_width); /* read bits */ if ( bit_width < 7 ) { /* method 1 (1-6 bits) */ if ( (signed)aux_value == (1 << (bit_width - 1)) ) { /* check for "100..." */ aux_value = read_n_bits_from_IT_compressed_block(4) + 1; /* yes -> read new width; */ bit_width = (aux_value < bit_width) ? aux_value : aux_value + 1; /* and expand it */ continue; /* ... next value */ } } else if ( bit_width < 17 ) { mp_uword border = (0xFFFF >> (17 - bit_width)) - 8; if ( (signed)aux_value > border && (signed)aux_value <= (border + 16) ) { aux_value -= border; /* convert width to 1-8 */ bit_width = (aux_value < bit_width) ? aux_value : aux_value + 1; /* and expand it */ continue; /* ... next value */ } } else if ( bit_width == 17 ) { if ( aux_value & 0x10000 ) { /* bit 8 set? */ bit_width = (aux_value + 1) & 0xff; /* new width... */ continue; /* ... and next value */ } } else { /* illegal width, abort */ //ERROR("Sample has illegal BitWidth "); free_IT_compressed_block(); return FUNCTION_FAILED; } /* now expand value to signed byte */ if ( bit_width < 16 ) { mp_ubyte tmp_shift = 16 - bit_width; v=(aux_value << tmp_shift); v>>=tmp_shift; } else v = (mp_sword) aux_value; /* integrate upon the sample values */ d1 += v; d2 += d1; /* ... and store it into the buffer */ *(dest_position++) = it215 ? d2 : d1; block_position++; } /* now subtract block lenght from total length and go on */ free_IT_compressed_block(); p_buffsize -= block_length; } return FUNCTION_SUCCESS; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // MDL sample loading helper class // ////////////////////////////////////////////////////////////////////////////////////////////////////////////// class MDLSampleLoader : public XModule::SampleLoader { private: mp_ubyte* tmpBuffer; mp_ubyte* dstBuffer; // MDL unpacking static mp_ubyte readbits(mp_ubyte* buffer,mp_uint32& bitcount,mp_uint32& bytecount,mp_sint32 numbits) { mp_ubyte val=0,bitti=0; for (mp_sint32 n=0;n>bitcount)&1)<<(bitti++); bitcount++; if (bitcount==8) { bitcount=0; bytecount++; } } return val; } // MDL unpacking static mp_ubyte depackbyte(mp_ubyte* packed,mp_uint32& bitcount,mp_uint32& bytecount) { mp_ubyte b = 0; mp_ubyte sign = readbits(packed,bitcount,bytecount,1); mp_ubyte bit = readbits(packed,bitcount,bytecount,1); if (bit) { b = readbits(packed,bitcount,bytecount,3); goto next; } else b=8; loop:; bit=readbits(packed,bitcount,bytecount,1); if (!bit) { b+=16; goto loop; } else b+=readbits(packed,bitcount,bytecount,4); next:; if (sign) b^=255; return b; } void cleanUp() { if (tmpBuffer) { delete[] tmpBuffer; tmpBuffer = NULL; } if (dstBuffer) { delete[] dstBuffer; dstBuffer = NULL; } } public: MDLSampleLoader(XMFileBase& file) : SampleLoader(file), tmpBuffer(NULL), dstBuffer(NULL) { } virtual ~MDLSampleLoader() { cleanUp(); } virtual mp_sint32 load_sample_8bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize); virtual mp_sint32 load_sample_16bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize); }; mp_sint32 MDLSampleLoader::load_sample_8bits(void* buffer, mp_sint32 size, mp_sint32 length) { cleanUp(); tmpBuffer = new mp_ubyte[size+32]; memset(tmpBuffer,0,size+32); if (tmpBuffer == NULL) return FUNCTION_FAILED; f.read(tmpBuffer,1,size); dstBuffer = new mp_ubyte[length+64]; if (dstBuffer == NULL) return FUNCTION_FAILED; memset(dstBuffer,0,length+64); mp_uint32 bitcount=0, bytecount=0; mp_sint32 i=0; while (bytecount < (unsigned)size && i < length) { dstBuffer[i++]=depackbyte((mp_ubyte*)tmpBuffer,bitcount,bytecount); } mp_sbyte b1=0; for (i = 0; i < length; i++) dstBuffer[i] = b1+=dstBuffer[i]; memcpy(buffer,dstBuffer,length); return FUNCTION_SUCCESS; } mp_sint32 MDLSampleLoader::load_sample_16bits(void* buffer, mp_sint32 size, mp_sint32 length) { cleanUp(); tmpBuffer = new mp_ubyte[size+32]; memset(tmpBuffer,0,size+32); if (tmpBuffer == NULL) return FUNCTION_FAILED; f.read(tmpBuffer,1,size); dstBuffer = new mp_ubyte[length*2+64]; if (dstBuffer == NULL) return FUNCTION_FAILED; memset(dstBuffer,0,length+64); mp_uint32 bitcount=0, bytecount=0; mp_sint32 i=0; while (bytecount<(unsigned)size && i < length*2) { dstBuffer[i++]=readbits((mp_ubyte*)tmpBuffer,bitcount,bytecount,8); dstBuffer[i++]=depackbyte((mp_ubyte*)tmpBuffer,bitcount,bytecount); } mp_sbyte b1=0; for (i = 0; i < length; i++) dstBuffer[i*2+1] = b1+=dstBuffer[i*2+1]; mp_sword* dstBuffer16 = (mp_sword*)buffer; mp_ubyte* srcBuffer = (mp_ubyte*)dstBuffer; for (i = 0; i < length; i++) *dstBuffer16++ = LittleEndian::GET_WORD(srcBuffer+=2); return FUNCTION_SUCCESS; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // ADPCM sample loading helper class: // // 4-bit ADPCM is coding the delta values between a sample and // the next in 4-bits (starting value is zero). The delta values are // stored as a 16-byte table at the start of the sample data: // [16-bytes delta values][(length+1)/2 bytes of 4-bit indexes...] // ////////////////////////////////////////////////////////////////////////////////////////////////////////////// class ADPCMSampleLoader : public XModule::SampleLoader { private: mp_ubyte* tmpBuffer; void cleanUp() { if (tmpBuffer) { delete[] tmpBuffer; tmpBuffer = NULL; } } public: ADPCMSampleLoader(XMFileBase& file) : SampleLoader(file), tmpBuffer(NULL) { } virtual ~ADPCMSampleLoader() { cleanUp(); } virtual mp_sint32 load_sample_8bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize) { cleanUp(); mp_sbyte deltaValues[16]; // read delta values table f.read(deltaValues, 1, 16); // this is the actual size of the compressed size const mp_uint32 blockSize = (p_buffsize + 1) / 2; // allocate some memory for it tmpBuffer = new mp_ubyte[blockSize]; // read compressed data f.read(tmpBuffer, 1, blockSize); mp_sbyte b1 = 0; mp_sbyte* srcPtr = (mp_sbyte*)p_dest_buffer; for (mp_uint32 i = 0; i < blockSize; i++) { mp_uint32 index = tmpBuffer[i] & 0xF; *srcPtr++ = b1+=deltaValues[index]; index = tmpBuffer[i] >> 4; *srcPtr++ = b1+=deltaValues[index]; } return FUNCTION_SUCCESS; } virtual mp_sint32 load_sample_16bits(void* p_dest_buffer, mp_sint32 compressedSize, mp_sint32 p_buffsize) { cleanUp(); return FUNCTION_SUCCESS; } }; mp_sint32 TXMPattern::compress(mp_ubyte* dest) const { mp_sint32 patternSize = rows*channum*(2+effnum*2); mp_ubyte* srcPtr = patternData; mp_ubyte* dstPtr = dest; mp_sint32 i = 0; mp_sint32 len = 0; // retrieve buffer size only if (!dest) { while (i < patternSize) { if (*srcPtr > 0 && *srcPtr < 128) { srcPtr++; i++; len++; } else if (*srcPtr >= 128) { srcPtr++; i++; len+=2; } else { mp_sint32 j = 0; while (i < patternSize && j < 125 && *srcPtr == 0) { srcPtr++; j++; i++; } if (j == 1) { len++; } else { ASSERT(128+j < 255); len++; } } } return len; } // compress and store while (i < patternSize) { if (*srcPtr > 0 && *srcPtr < 128) { *dstPtr++ = *srcPtr++; i++; len++; } else if (*srcPtr >= 128) { *dstPtr++ = 255; *dstPtr++ = *srcPtr++; i++; len+=2; } else { mp_sint32 j = 0; while (i < patternSize && j < 125 && *srcPtr == 0) { srcPtr++; j++; i++; } if (j == 1) { *dstPtr++ = 0; len++; } else { *dstPtr++ = 128 + j; ASSERT(128+j < 255); len++; } } } return len; } mp_sint32 TXMPattern::decompress(mp_ubyte* src, mp_sint32 len) { mp_sint32 patternSize = rows*channum*(2+effnum*2); mp_ubyte* srcPtr = src; mp_ubyte* dstPtr = patternData; mp_sint32 i = 0; mp_sint32 j = 0; while (i < len && j < patternSize) { if (*srcPtr < 128) { *dstPtr++ = *srcPtr++; i++; j++; } else if (*srcPtr == 255) { srcPtr++; *dstPtr++ = *srcPtr++; i+=2; j++; } else { mp_sint32 k = *srcPtr++ & 127; for (mp_sint32 l = 0; l < k; l++) { if (j < patternSize) *dstPtr++ = 0; else { ASSERT(false); } j++; } i++; } } return 0; } #ifdef MILKYTRACKER const TXMPattern& TXMPattern::operator=(const TXMPattern& src) { if (this != &src) { delete[] patternData; const mp_uint32 size = (mp_uint32)src.channum*(2+(mp_uint32)src.effnum*2)*(mp_uint32)src.rows; patternData = new mp_ubyte[size]; memcpy(patternData, src.patternData, size); channum = src.channum; effnum = src.effnum; len = src.len; patdata = src.patdata; ptype = src.ptype; rows = src.rows; } return *this; } #endif // Constructor for loader manager (private) XModule::LoaderManager::LoaderManager() : loaders(NULL), numLoaders(0), numAllocatedLoaders(0), iteratorCounter(-1) { #ifndef MP_XMONLY registerLoader(new Loader669(), ModuleType_669); registerLoader(new LoaderAMF_1(), ModuleType_AMF); registerLoader(new LoaderAMF_2(), ModuleType_AMF); registerLoader(new LoaderAMSv1(), ModuleType_AMS); registerLoader(new LoaderAMSv2(), ModuleType_AMS); registerLoader(new LoaderCBA(), ModuleType_CBA); registerLoader(new LoaderDBM(), ModuleType_DBM); registerLoader(new LoaderDIGI(), ModuleType_DIGI); registerLoader(new LoaderDSMv1(), ModuleType_DSM); registerLoader(new LoaderDSMv2(), ModuleType_DSM); registerLoader(new LoaderDSm(), ModuleType_DSm); registerLoader(new LoaderDTM_1(), ModuleType_DTM_1); registerLoader(new LoaderDTM_2(), ModuleType_DTM_2); registerLoader(new LoaderFAR(), ModuleType_FAR); registerLoader(new LoaderGDM(), ModuleType_GDM); registerLoader(new LoaderIMF(), ModuleType_IMF); registerLoader(new LoaderIT(), ModuleType_IT); //registerLoader(new LoaderFNK(), funk format sucks registerLoader(new LoaderMDL(), ModuleType_MDL); registerLoader(new LoaderMTM(), ModuleType_MTM); registerLoader(new LoaderMXM(), ModuleType_MXM); registerLoader(new LoaderOKT(), ModuleType_OKT); registerLoader(new LoaderPLM(), ModuleType_PLM); registerLoader(new LoaderPSMv1(), ModuleType_PSM); registerLoader(new LoaderPSMv2(), ModuleType_PSM); registerLoader(new LoaderPTM(), ModuleType_PTM); registerLoader(new LoaderS3M(), ModuleType_S3M); registerLoader(new LoaderSTM(), ModuleType_STM); registerLoader(new LoaderSFX(), ModuleType_SFX); registerLoader(new LoaderUNI(), ModuleType_UNI); registerLoader(new LoaderULT(), ModuleType_ULT); registerLoader(new LoaderXM(), ModuleType_XM); // Game Music Creator may not be recognized perfectly registerLoader(new LoaderGMC(), ModuleType_GMC); // Last loader is MOD because there is a slight chance that other formats will be misinterpreted as 15 ins. MODs registerLoader(new LoaderMOD(), ModuleType_MOD); #else registerLoader(new LoaderXM(), ModuleType_XM); #endif } XModule::LoaderManager::~LoaderManager() { for (mp_uint32 i = 0; i < numLoaders; i++) delete loaders[i].loader; delete[] loaders; } void XModule::LoaderManager::registerLoader(LoaderInterface* loader, ModuleTypes type) { if (numLoaders+1 > numAllocatedLoaders) { numAllocatedLoaders+=16; TLoaderInfo* newLoaders = new TLoaderInfo[numAllocatedLoaders]; for (mp_uint32 i = 0; i < numLoaders; i++) newLoaders[i] = loaders[i]; delete[] loaders; loaders = newLoaders; } loaders[numLoaders].loader = loader; loaders[numLoaders].moduleType = type; numLoaders++; } XModule::TLoaderInfo* XModule::LoaderManager::getFirstLoaderInfo() { if (numLoaders) { iteratorCounter = 0; return loaders; } else return NULL; } XModule::TLoaderInfo* XModule::LoaderManager::getNextLoaderInfo() { iteratorCounter++; if (iteratorCounter < (signed)numLoaders) return loaders+iteratorCounter; else { iteratorCounter = -1; return NULL; } } const mp_sint32 XModule::periods[12] = {1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,907}; const mp_sint32 XModule::sfinetunes[16] = {8363,8413,8463,8529,8581,8651,8723,8757, 7895,7941,7985,8046,8107,8169,8232,8280}; const mp_sbyte XModule::modfinetunes[16] = {0,16,32,48,64,80,96,112,-128,-112,-96,-80,-64,-48,-32,-16}; const mp_ubyte XModule::numValidXMEffects = 24; const mp_ubyte XModule::validXMEffects[XModule::numValidXMEffects] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20,21,25,27,29,33}; ////////////////////////////////////////////////////////////////////////// // various tools for loading and converting modules // ////////////////////////////////////////////////////////////////////////// mp_sint32 XModule::getc4spd(mp_sint32 relnote,mp_sint32 finetune) { static const mp_sint32 table[] = {65536,69432,73561,77935,82570,87480,92681,98193,104031,110217,116771,123715, 65536,65565,65595,65624,65654,65684,65713,65743,65773,65802,65832,65862,65891, 65921,65951,65981,66010,66040,66070,66100,66130,66160,66189,66219,66249,66279, 66309,66339,66369,66399,66429,66459,66489,66519,66549,66579,66609,66639,66669, 66699,66729,66759,66789,66820,66850,66880,66910,66940,66971,67001,67031,67061, 67092,67122,67152,67182,67213,67243,67273,67304,67334,67365,67395,67425,67456, 67486,67517,67547,67578,67608,67639,67669,67700,67730,67761,67792,67822,67853, 67883,67914,67945,67975,68006,68037,68067,68098,68129,68160,68190,68221,68252, 68283,68314,68344,68375,68406,68437,68468,68499,68530,68561,68592,68623,68654, 68685,68716,68747,68778,68809,68840,68871,68902,68933,68964,68995,69026,69057, 69089,69120,69151,69182,69213,69245,69276,69307,69339,69370,69401}; mp_sint32 c4spd = 8363; mp_sbyte xmfine = finetune; mp_sbyte octave = (relnote+96)/12; mp_sbyte note = (relnote+96)%12; mp_sbyte o2 = octave-8; if (xmfine<0) { xmfine+=(mp_sbyte)128; note--; if (note<0) { note+=12; o2--; } } if (o2>=0) { c4spd<<=o2; } else { c4spd>>=-o2; } mp_sint32 f = FixedMUL(table[(mp_ubyte)note],c4spd); return (FixedMUL(f,table[(mp_ubyte)xmfine+12])); } void XModule::convertc4spd(mp_uint32 c4spd,mp_sbyte *finetune,mp_sbyte *relnote) { mp_sint32 xmfine = 0; mp_sbyte cl = 0; mp_sbyte ch = 0; mp_uint32 ebp = 0xFFFFFFFF; mp_uint32 ebx = c4spd; aloop: mp_uint32 c4s2 = ebx; mp_uint32 c4s = getc4spd((mp_sint32)cl-48,0); if (c4s>((y/12)))>>2; if (period >= per) return y+1; } return 0; } //////////////////////////////////////////// // Load sample into given memory. // // Sample size is in BYTES not in samples // // Sample length is number of samples, // //////////////////////////////////////////// bool XModule::loadSample(XMFileBase& f,void* buffer,mp_uint32 size,mp_uint32 length,mp_sint32 flags /* = ST_DEFAULT */) { mp_ubyte* tmpBuffer = NULL; mp_ubyte* dstBuffer = NULL; // MDL style packing if (flags & ST_PACKING_MDL) { MDLSampleLoader sampleLoader(f); if (flags & ST_16BIT) { if (sampleLoader.load_sample_16bits(buffer, size, length)) return false; } else { if (sampleLoader.load_sample_8bits(buffer, size, length)) return false; } return true; } else if ((flags & ST_PACKING_IT) || (flags & ST_PACKING_IT215)) { ITSampleLoader sampleLoader(f, (flags & ST_PACKING_IT215)); if (flags & ST_16BIT) { if (sampleLoader.load_sample_16bits(buffer, -1, length)) return false; } else { if (sampleLoader.load_sample_8bits(buffer, -1, length)) return false; } return true; } else if (flags & ST_PACKING_ADPCM) { ADPCMSampleLoader sampleLoader(f); if (flags & ST_16BIT) { if (sampleLoader.load_sample_16bits(buffer, size, length)) return false; } else { if (sampleLoader.load_sample_8bits(buffer, size, length)) return false; } return true; } else { memset(buffer, 0, size); f.read(buffer,1,size); } // 16 bit sample if (flags & ST_16BIT) { mp_sword* dstPtr = (mp_sword*)buffer; mp_ubyte* srcPtr = (mp_ubyte*)buffer; // PTM delta storing if (flags & ST_DELTA_PTM) { mp_sbyte b1=0; for (mp_uint32 i = 0; i < length*2; i++) srcPtr[i] = b1+=srcPtr[i]; } mp_uint32 i; if (flags & ST_BIGENDIAN) { for (i = 0; i < length; i++) dstPtr[i] = BigEndian::GET_WORD(srcPtr+i*2); } else { for (i = 0; i < length; i++) dstPtr[i] = LittleEndian::GET_WORD(srcPtr+i*2); } // delta-storing if (flags & ST_DELTA) { mp_sword b1=0; for (i = 0; i < length; i++) dstPtr[i] = b1+=dstPtr[i]; } // unsigned sample data if (flags & ST_UNSIGNED) { for (i = 0; i < length; i++) dstPtr[i] = (dstPtr[i]^32767); } } // 8 bit sample else { mp_sbyte* smpPtr = (mp_sbyte*)buffer; // delta-storing if (flags & ST_DELTA) { mp_sbyte b1=0; for (mp_uint32 i = 0; i < length; i++) smpPtr[i] = b1+=smpPtr[i]; } // unsigned sample data if (flags & ST_UNSIGNED) { for (mp_uint32 i = 0; i < length; i++) smpPtr[i] ^= 127; } } if (tmpBuffer) delete[] tmpBuffer; if (dstBuffer) delete[] dstBuffer; return true; } mp_sint32 XModule::loadModuleSample(XMFileBase& f, mp_sint32 index, mp_sint32 flags8/* = ST_DEFAULT*/, mp_sint32 flags16/* = ST_16BIT*/, mp_uint32 alternateSize/* = 0*/) { if (smp[index].type & 16) { mp_uint32 finalSize = alternateSize ? alternateSize : smp[index].samplen*2; smp[index].sample = (mp_sbyte*)allocSampleMem(finalSize); if (smp[index].sample == NULL) { return -7; } if (!loadSample(f,smp[index].sample, finalSize, smp[index].samplen, flags16)) { return -7; } } else { mp_uint32 finalSize = alternateSize ? alternateSize : smp[index].samplen; smp[index].sample = (mp_sbyte*)allocSampleMem(finalSize); if (smp[index].sample == NULL) { return -7; } if (!loadSample(f,smp[index].sample, finalSize, smp[index].samplen, flags8)) { return -7; } } return 0; } mp_sint32 XModule::loadModuleSamples(XMFileBase& f, mp_sint32 flags8/* = ST_DEFAULT*/, mp_sint32 flags16/* = ST_16BIT*/) { for (mp_sint32 i = 0; i < header.smpnum; i++) { mp_sint32 res = loadModuleSample(f, i, flags8, flags16); if (res != 0) return res; } return 0; } //////////////////////////////////////////// // Before using the sample postprocessing // // please make sure that the memory // // allocated for the samples has another // // 16 bytes padding space // //////////////////////////////////////////// void XModule::postProcessSamples(bool heavy/* = false*/) { for (mp_uint32 i = 0; i < header.smpnum; i++) { TXMSample* smp = &this->smp[i]; #ifdef VERBOSE printf("%i: %i, %i, %i, %x\n",i,smp->samplen, smp->loopstart, smp->looplen,smp->pan); #endif if (smp->samplen == 0) { freeSampleMem((mp_ubyte*)smp->sample, false); smp->sample = NULL; continue; } if (heavy) smp->smoothLooping(); smp->postProcessSamples(); } } void XModule::setDefaultPanning() { for (mp_sint32 i = 0; i < header.channum; i++) { if (i & 1) header.pan[i] = 192; else header.pan[i] = 64; } } mp_ubyte* XModule::allocSampleMem(mp_uint32 size) { // sample is always padded at start and end with 16 bytes for (mp_sint32 i = 0; i < (signed)samplePointerIndex; i++) { if (samplePool[i] == NULL) { samplePool[i] = TXMSample::allocPaddedMem(size); return samplePool[i]; } } samplePool[samplePointerIndex] = TXMSample::allocPaddedMem(size); return samplePool[samplePointerIndex++]; } void XModule::freeSampleMem(mp_ubyte* mem, bool assertCheck/* = true*/) { bool found = false; for (mp_sint32 i = 0; i < (signed)samplePointerIndex; i++) { if (samplePool[i] == mem) { found = true; TXMSample::freePaddedMem(samplePool[i]); samplePool[i] = NULL; if (i == (signed)samplePointerIndex - 1) { samplePointerIndex--; break; } } } if (assertCheck) { ASSERT(found); } } #ifdef MILKYTRACKER void XModule::insertSamplePtr(mp_ubyte* ptr) { for (mp_sint32 i = 0; i < (signed)samplePointerIndex; i++) { if (samplePool[i] == NULL) { samplePool[i] = ptr; return; } } samplePool[samplePointerIndex++] = ptr; } void XModule::removeSamplePtr(mp_ubyte* ptr) { for (mp_sint32 i = 0; i < (signed)samplePointerIndex; i++) { if (samplePool[i] == ptr) { samplePool[i] = NULL; } } } #endif bool XModule::addEnvelope(TEnvelope*& envs, const TEnvelope& env, mp_uint32& numEnvsAlloc, mp_uint32& numEnvs) { if (envs == NULL) { numEnvsAlloc = 8; envs = new TEnvelope[numEnvsAlloc]; if (envs == NULL) return false; envs[numEnvs++] = env; return true; } else { if (numEnvs >= numEnvsAlloc) { numEnvsAlloc+=8; TEnvelope* tmpEnvs = new TEnvelope[numEnvsAlloc]; if (tmpEnvs == NULL) return false; memcpy(tmpEnvs,envs,numEnvs*sizeof(TEnvelope)); delete[] envs; envs = tmpEnvs; } envs[numEnvs++] = env; } return true; } // fix broken envelopes (1 point envelope for example) void XModule::fixEnvelopes(TEnvelope* envs, mp_uint32 numEnvs) { TEnvelope* env = envs; for (mp_uint32 i = 0; i < numEnvs; i++, env++) { // Check for envelope with single point (seen in a DBM module) if (env->num == 1) { // make sure point one starts at x-position 0 env->env[0][0] = 0; // add second point with y-coordinate from point one env->env[1][1] = env->env[0][1]; // x-coordinate is just a few ticks right from point one env->env[1][0] = env->env[0][0] + 64; env->num++; } } } // better destructor, should be called before loading a song // just in case loading of a module failed and someone tries to load another // module right after that bool XModule::cleanUp() { if (venvs) { delete[] venvs; venvs = NULL; numVEnvsAlloc = numVEnvs = 0; } if (penvs) { delete[] penvs; penvs = NULL; numPEnvsAlloc = numPEnvs = 0; } if (fenvs) { delete[] fenvs; fenvs = NULL; numFEnvsAlloc = numFEnvs = 0; } if (vibenvs) { delete[] vibenvs; vibenvs = NULL; numVibEnvsAlloc = numVibEnvs = 0; } if (pitchenvs) { delete[] pitchenvs; pitchenvs = NULL; numPitchEnvsAlloc = numPitchEnvs = 0; } if (message) { delete[] message; message = NULL; messageBytesAlloc = 0; } // release pattern memory mp_uint32 i; #ifdef MILKYTRACKER for (i = 0; i < 256; i++) #else for (i = 0; i < header.patnum; i++) #endif { if (phead[i].patternData) { delete[] phead[i].patternData; phead[i].patternData = NULL; } } // release sample-memory for (i = 0; i < samplePointerIndex; i++) { if (samplePool[i]) { TXMSample::freePaddedMem(samplePool[i]); samplePool[i] = NULL; } } samplePointerIndex = 0; memset(&header,0,sizeof(TXMHeader)); if (instr) memset(instr,0,sizeof(TXMInstrument)*256); if (smp) memset(smp,0,sizeof(TXMSample)*MP_MAXSAMPLES); if (phead) memset(phead,0,sizeof(TXMPattern)*256); // subsong stuff memset(subSongPositions, 0, sizeof(subSongPositions)); numSubSongs = 0; moduleLoaded = false; return true; } XModule::XModule() { // allocated necessary space for all possible patterns, instruments and samples phead = new TXMPattern[256]; instr = new TXMInstrument[256]; smp = new TXMSample[MP_MAXSAMPLES]; type = ModuleType_NONE; // no module loaded (empty song) moduleLoaded = false; // initialise all sample pointers to NULL memset(samplePool,0,sizeof(samplePool)); // reset current sample index samplePointerIndex = 0; memset(&header,0,sizeof(TXMHeader)); if (instr) memset(instr,0,sizeof(TXMInstrument)*256); if (smp) memset(smp,0,sizeof(TXMSample)*MP_MAXSAMPLES); if (phead) memset(phead,0,sizeof(TXMPattern)*256); // subsong stuff memset(subSongPositions, 0, sizeof(subSongPositions)); numSubSongs = 0; venvs = NULL; numVEnvsAlloc = numVEnvs = 0; penvs = NULL; numPEnvsAlloc = numPEnvs = 0; fenvs = NULL; numFEnvsAlloc = numFEnvs = 0; vibenvs = NULL; numVibEnvsAlloc = numVibEnvs = 0; pitchenvs = NULL; numPitchEnvsAlloc = numPitchEnvs = 0; message = NULL; messageBytesAlloc = 0; } XModule::~XModule() { cleanUp(); delete[] phead; delete[] instr; delete[] smp; } const char* XModule::identifyModule(const mp_ubyte* buffer) { // browse through all available loaders and find suitable LoaderManager loaderManager; TLoaderInfo* loaderInfo; loaderInfo = loaderManager.getFirstLoaderInfo(); while (loaderInfo) { // if loader can identify module return ID const char* id = loaderInfo->loader->identifyModule(buffer); if (id) { return id; } loaderInfo = loaderManager.getNextLoaderInfo(); } return NULL; } mp_sint32 XModule::loadModule(const SYSCHAR* fileName, bool scanForSubSongs/* = false*/) { XMFile f(fileName); return f.isOpen() ? loadModule(f, scanForSubSongs) : -8; } mp_sint32 XModule::loadModule(XMFileBase& f, bool scanForSubSongs/* = false*/) { mp_ubyte buffer[IdentificationBufferSize]; memset(buffer, 0, sizeof(buffer)); f.setBaseOffset(f.pos()); f.read(buffer, 1, sizeof(buffer)); // browse through all available loaders and find suitable LoaderManager loaderManager; TLoaderInfo* loaderInfo; loaderInfo = loaderManager.getFirstLoaderInfo(); while (loaderInfo) { // if loader can identify module take that loader if (loaderInfo->loader->identifyModule(buffer)) { // try to load module f.seekWithBaseOffset(0); mp_sint32 err = loaderInfo->loader->load(f, this); if (err == 0) { moduleLoaded = true; bool res = validate(); if (!res) return -7; type = loaderInfo->moduleType; if (scanForSubSongs) buildSubSongTable(); } return err; } loaderInfo = loaderManager.getNextLoaderInfo(); } #ifdef MILKYTRACKER return -9; #else return -8; #endif } bool XModule::validate() { if (header.channum == 0) header.channum++; if (header.insnum == 0) header.insnum++; /*for (mp_sint32 i = 0; i < header.ordnum; i++) if (header.ord[i] >= header.patnum) header.ord[i] = 0;*/ // if we're not having any pattern just create an empty dummy pattern if (!header.patnum) { header.patnum++; phead[0].rows = 64; #ifdef MILKYTRACKER phead[0].effnum = 2; #else phead[0].effnum = 1; #endif phead[0].channum = (mp_ubyte)header.channum; phead[0].patternData = new mp_ubyte[phead[0].rows*header.channum*(2+phead[0].effnum*2)]; // out of memory? if (phead[0].patternData == NULL) { return false; } memset(phead[0].patternData,0,phead[0].rows*header.channum*(2+phead[0].effnum*2)); } removeOrderSkips(); if (!header.ordnum) { header.ordnum++; header.ord[0] = 0; } fixEnvelopes(venvs, numVEnvs); fixEnvelopes(penvs, numPEnvs); fixEnvelopes(fenvs, numFEnvs); fixEnvelopes(vibenvs, numVibEnvs); fixEnvelopes(pitchenvs, numPitchEnvs); return true; } void XModule::convertStr(char* strIn, const char* strOut, mp_sint32 nLen, bool filter) { memset(strIn, 0, nLen); mp_sint32 i; for (i = 0; i < nLen; i++) { strIn[i] = strOut[i]; // must be an asciiz string if (strIn[i] == '\0') break; // Filter non-viewable characters if (filter && (strIn[i]<32 || (unsigned)strIn[i]>127)) strIn[i] = 32; } i = nLen-1; while (i>=0 && strIn[i]<=32) i--; i++; strIn[i] = '\0'; } void XModule::getTitle(char* str, bool filter /* = true */) const { if (!moduleLoaded) { memset(str, 0, 33); return; } convertStr(str, (const char*)&header.name, 32, filter); } void XModule::getSignature(char* str, bool filter /* = true */) const { if (!moduleLoaded) { memset(str, 0, 18); return; } convertStr(str, (const char*)&header.sig, 17, filter); } void XModule::getTracker(char* str, bool filter /* = true */) const { if (!moduleLoaded) { memset(str, 0, 33); return; } convertStr(str, (const char*)&header.tracker, 32, filter); } /////////////////////////////////////////////////// // dealing with song messages // /////////////////////////////////////////////////// void XModule::allocateSongMessage(mp_uint32 initialSize/* = 512*/) { if (message) { delete[] message; message = NULL; messageBytesAlloc = 0; } message = new char[initialSize]; if (message) { memset(message, 0, initialSize); messageBytesAlloc = initialSize; } } // add one more line of text to songmessage void XModule::addSongMessageLine(const char* line) { if (!message) { allocateSongMessage(); if (!message) return; } mp_uint32 oSize = (mp_uint32)strlen(message) + 1; mp_uint32 nSize = (mp_uint32)strlen(line) + 1; mp_uint32 size = oSize + nSize + 2; if (size > messageBytesAlloc) { char* tempMessage = new char[size]; if (tempMessage) { memset(tempMessage, 0, size); messageBytesAlloc = size; strcpy(tempMessage, message); delete[] message; message = tempMessage; } else return; } // if this is not the first line in song message, // add CR to the previous line if (strlen(message) != 0) { message[strlen(message)] = 0x0D; message[strlen(message)+1] = '\0'; } strcat(message, line); } // start iterating text lines (get size of line) mp_sint32 XModule::getFirstSongMessageLineLength() { if (message == NULL) return -1; // no song message at all if (*message == '\0') return -1; messagePtr = message; mp_sint32 i = 0; while (messagePtr[i] != 0x0D && messagePtr[i] != '\0') i++; return i; } // get next size text line mp_sint32 XModule::getNextSongMessageLineLength() { if (message == NULL) return -1; // advance to next line first while (*messagePtr != 0x0D && *messagePtr != '\0') messagePtr++; // we reached end of song message if (*messagePtr == '\0') return -1; ASSERT(*messagePtr == 0x0D); // skip CR messagePtr++; mp_sint32 i = 0; while (messagePtr[i] != 0x0D && messagePtr[i] != '\0') i++; return i; } // get line void XModule::getSongMessageLine(char* line) { mp_sint32 i = 0; while (messagePtr[i] != 0x0D && messagePtr[i] != '\0') { line[i] = messagePtr[i]; i++; } line[i] = '\0'; } // search for subsongs void XModule::buildSubSongTable() { if (!moduleLoaded) return; mp_ubyte* positionLookup = new mp_ubyte[header.ordnum*256]; if (positionLookup == NULL) return; memset(positionLookup, 0, header.ordnum*256); // entire song = first subsong, starts at 0 subSongPositions[numSubSongs*2] = 0; subSongPositions[numSubSongs*2+1] = 0; mp_ubyte pbreak = 0; mp_ubyte pbreakpos = 0; mp_ubyte pjump = 0; mp_ubyte pjumppos = 0, pjumprow = 0; mp_sint32 poscnt = 0, rowcnt = 0; mp_sint32 poscntMax = -1; while (true) { bool breakMain = false; while (!breakMain) { /*if (header.ord[poscnt]==254) { while (header.ord[poscnt]==254) { poscnt++; if (poscnt>=header.ordnum) { breakMain = true; break; } } }*/ if (!breakMain) { mp_sint32 ord = header.ord[poscnt]; if (ord < header.patnum) { mp_ubyte* pattern = phead[ord].patternData; mp_sint32 r = rowcnt; mp_sint32 i = poscnt*256+r; if (!positionLookup[i]) positionLookup[i]++; else { subSongPositions[numSubSongs*2+1] = poscntMax; numSubSongs++; breakMain = true; continue; } pbreak = pbreakpos = pjump = pjumppos = pjumprow = 0; for (mp_sint32 c = 0; c < phead[ord].channum; c++) { mp_sint32 slotSize = 2 + 2*phead[ord].effnum; mp_ubyte* slot = pattern + r*phead[ord].channum*slotSize + c*slotSize; for (mp_sint32 e = 0; e < phead[ord].effnum; e++) { mp_ubyte eff = slot[2+e*2]; mp_ubyte eop = slot[2+e*2+1]; switch (eff) { case 0x0B : { pjump = 1; pjumppos = eop; pjumprow = 0; break; } case 0x0D : { pbreak=1; pbreakpos = (eop>>4)*10+(eop&0xf); break; } case 0x0F: { if (eop == 0) { subSongPositions[numSubSongs*2+1] = poscntMax; numSubSongs++; breakMain = true; poscnt++; rowcnt = 0; goto skipChannels; } break; } case SubSongMarkEffect: { if (eop == SubSongMarkOperand) { subSongPositions[numSubSongs*2+1] = poscntMax; numSubSongs++; breakMain = true; continue; } } case 0x2B: { pjump = 1; pjumppos = eop; pjumprow = slot[2+((e+1)%phead[ord].effnum)*2+1]; break; } } } // effects } // channels if (poscnt > poscntMax) poscntMax = poscnt; // player logic // break pattern? if (pbreak&&(poscnt<(header.ordnum-1))) { if (!pjump) poscnt++; rowcnt=pbreakpos-1; } else if (pbreak&&(poscnt==(header.ordnum-1))) { if (!pjump) poscnt=0; rowcnt=pbreakpos-1; } // pattern jump? if (pjump) { if (!pbreak) rowcnt = pjumprow-1; if (pjumppos < header.ordnum) poscnt = pjumppos; } rowcnt++; // make sure we're getting the right pattern, position might // have changed because of position jumps or pattern breaks ord = header.ord[poscnt]; if (rowcnt >= phead[ord].rows) { poscnt++; rowcnt = 0; if (poscnt >= header.ordnum) { poscnt = 0; } } skipChannels:; } else { mp_sint32 i = poscnt*256; memset(positionLookup+i, 1, 256); poscnt++; rowcnt = 0; if (poscnt >= header.ordnum) poscnt = 0; } } } if (numSubSongs >= 256) break; bool allPlayed = true; for (poscnt = 0; poscnt < header.ordnum; poscnt++) { mp_sint32 ord = header.ord[poscnt]; if (ord < header.patnum) { bool played = false; mp_sint32 slotSize = 2 + 2*phead[ord].effnum; for (mp_sint32 i = 0; i < phead[ord].rows; i++) { if (positionLookup[poscnt*256+i]) { played = true; break; } } if (!played) { bool empty = true; mp_sint32 offs = 0; mp_ubyte* pattern = phead[ord].patternData; for (mp_sint32 i = 0; i < phead[ord].rows*phead[ord].channum; i++) { if (pattern[offs]) { empty = false; break; } offs+=slotSize; } if (empty) { memset(positionLookup+poscnt*256, 1, 256); played = true; } } if (!played) { subSongPositions[numSubSongs*2] = poscnt; // make it safe subSongPositions[numSubSongs*2+1] = poscnt; poscntMax = poscnt; //numSubSongs++; rowcnt = 0; allPlayed = false; break; } } } if (allPlayed) break; } delete[] positionLookup; #if 0 if (subSongPositions[(numSubSongs-1)*2+1] < header.ordnum - 1) { numSubSongs++; subSongPositions[(numSubSongs-1)*2] = subSongPositions[(numSubSongs-2)*2+1] + 1; subSongPositions[(numSubSongs-1)*2+1] = header.ordnum - 1; } #endif //subSongPositions[3*2] = 3; //subSongPositions[3*2+1] = 10; //for (mp_sint32 i = 0; i < numSubSongs*2; i++) // printf("%i: %i\n",i,subSongPositions[i]); //printf("\n\n"); mp_sint32 i,j = 0,k = 0; mp_sint32 tempSubSongPositions[256*2]; for (i = 0; i < numSubSongs*2; i++) tempSubSongPositions[i] = subSongPositions[i]; // find subsets of sub songs and merge them for (i = 0; i < numSubSongs; i++) { mp_sint32 start = tempSubSongPositions[i*2]; mp_sint32 end = tempSubSongPositions[i*2+1]; if (start != -1 && end != -1) { for (j = 0; j < numSubSongs; j++) { if (j != i) { if ((start <= tempSubSongPositions[j*2]) && (end >= tempSubSongPositions[j*2+1])) { tempSubSongPositions[j*2] = tempSubSongPositions[j*2+1] = -1; } else if ((start <= tempSubSongPositions[j*2]) && (end >= tempSubSongPositions[j*2])) { end = tempSubSongPositions[j*2+1]; tempSubSongPositions[j*2] = tempSubSongPositions[j*2+1] = -1; } else if ((start <= tempSubSongPositions[j*2+1]) && (end >= tempSubSongPositions[j*2+1])) { start = tempSubSongPositions[j*2]; tempSubSongPositions[j*2] = tempSubSongPositions[j*2+1] = -1; } } } } tempSubSongPositions[i*2] = start; tempSubSongPositions[i*2+1] = end; } // cut out sets which have been merged/replaced for (i = 0; i < numSubSongs; i++) { if ((tempSubSongPositions[i*2] != -1) && (tempSubSongPositions[i*2+1] != -1)) { subSongPositions[k*2] = (mp_ubyte)tempSubSongPositions[i*2]; subSongPositions[k*2+1] = (mp_ubyte)tempSubSongPositions[i*2+1]; k++; } } //printf("subsongs initial: %i, after: %i\n", numSubSongs, k); numSubSongs = k; //for (mp_sint32 i = 0; i < numSubSongs*2; i++) // printf("%i: %i\n",i,subSongPositions[i]); // one subsong is no subsong if (numSubSongs == 1) numSubSongs = 0; } // get subsong pos mp_sint32 XModule::getSubSongPosStart(mp_sint32 i) const { if (i >= 0 && i < numSubSongs) return subSongPositions[i*2]; return 0; } mp_sint32 XModule::getSubSongPosEnd(mp_sint32 i) const { if (i >= 0 && i < numSubSongs) return subSongPositions[i*2+1]; return 0; } // MilkyTracker additions void XModule::createEmptySong(bool clearPatterns/* = true*/, bool clearInstruments/* = true*/, mp_sint32 numChannels/* = 8*/) { moduleLoaded = true; type = ModuleType_XM; mp_uint32 i; if (clearPatterns) { #ifdef MILKYTRACKER for (i = 0; i < 256; i++) #else for (i = 0; i < header.patnum; i++) #endif { if (phead[i].patternData) { delete[] phead[i].patternData; phead[i].patternData = NULL; } } memset(header.ord, 0, sizeof(header.ord)); // song length header.ordnum = 1; header.patnum = 0; header.restart = 0; } if (clearInstruments) { if (venvs) { delete[] venvs; venvs = NULL; numVEnvsAlloc = numVEnvs = 0; } if (penvs) { delete[] penvs; penvs = NULL; numPEnvsAlloc = numPEnvs = 0; } if (fenvs) { delete[] fenvs; fenvs = NULL; numFEnvsAlloc = numFEnvs = 0; } if (vibenvs) { delete[] vibenvs; vibenvs = NULL; numVibEnvsAlloc = numVibEnvs = 0; } if (pitchenvs) { delete[] pitchenvs; pitchenvs = NULL; numPitchEnvsAlloc = numPitchEnvs = 0; } if (message) { delete[] message; message = NULL; messageBytesAlloc = 0; } // release sample-memory for (i = 0; i < samplePointerIndex; i++) { if (samplePool[i]) { TXMSample::freePaddedMem(samplePool[i]); samplePool[i] = NULL; } } samplePointerIndex = 0; if (instr) memset(instr,0,sizeof(TXMInstrument)*256); // some default values please if (smp) { memset(smp,0,sizeof(TXMSample)*MP_MAXSAMPLES); for (i = 0; i < MP_MAXSAMPLES; i++) { smp[i].vol = 0xff; smp[i].pan = 0x80; smp[i].flags = 3; smp[i].volfade = 65535; } } header.insnum = 128; header.smpnum = 128*16; header.volenvnum = 0; header.panenvnum = 0; header.frqenvnum = 0; header.vibenvnum = 0; header.pitchenvnum = 0; } // clear entire song if (clearPatterns && clearInstruments) { memset(&header,0,sizeof(TXMHeader)); header.insnum = 128; header.smpnum = 128*16; header.ordnum = 1; header.patnum = 0; header.restart = 0; header.channum = numChannels; header.freqtab = 1; header.mainvol = 255; // number of patterns header.speed = 125; header.tempo = 6; if (message) { delete[] message; message = NULL; messageBytesAlloc = 0; } setDefaultPanning(); } header.flags = XModule::MODULE_XMNOTECLIPPING | XModule::MODULE_XMARPEGGIO | XModule::MODULE_XMPORTANOTEBUFFER | XModule::MODULE_XMVOLCOLUMNVIBRATO; } void XModule::removeOrderSkips() { mp_sint32 newOrderListReloc[256]; mp_ubyte newOrderList[256]; mp_sint32 i,j; j = 0; for (i = 0; i < header.ordnum; i++) { if (header.ord[i] < header.patnum) { newOrderListReloc[i] = j; newOrderList[j++] = header.ord[i]; } else { newOrderListReloc[i] = -1; } } mp_sint32 newLen = j; for (i = 0; i < header.ordnum; i++) { if (newOrderListReloc[i] == -1) { j = i; mp_sint32 reloc = 0; while (newOrderListReloc[j] == -1 && j < header.ordnum) j++; if (j != header.ordnum) reloc = newOrderListReloc[j]; newOrderListReloc[i] = reloc; } } for (i = 0; i < header.patnum; i++) { if (phead[i].patternData) { mp_ubyte* data = phead[i].patternData; mp_sint32 slotSize = phead[i].effnum * 2 + 2; mp_sint32 patternSize = phead[i].channum * phead[i].rows; for (j = 0; j < patternSize; j++) { mp_ubyte* ptr = data+j*slotSize+2; for (mp_sint32 e = 0; e < phead[i].effnum; e++) { if (ptr[e*2] == 0x0B && ptr[e*2+1] < header.ordnum) { ptr[e*2+1] = newOrderListReloc[ptr[e*2+1]]; } } } } } header.ordnum = newLen; memset(header.ord, 0, sizeof(header.ord)); memcpy(header.ord, newOrderList, newLen); } mp_sint32 XModule::removeUnusedPatterns(bool evaluate) { if (!header.patnum) return 0; mp_sint32 i,j; mp_ubyte* bitMap = new mp_ubyte[header.patnum]; memset(bitMap, 0, sizeof(mp_ubyte)*header.patnum); mp_sint32 numUsedPatterns = 0; for (i = 0; i < header.ordnum; i++) { j = header.ord[i]; // this must *should* be always the case if (j < header.patnum && !bitMap[j]) { bitMap[j] = 1; numUsedPatterns++; } } if (!numUsedPatterns || numUsedPatterns == header.patnum) { delete[] bitMap; return 0; } mp_sint32 result = abs(header.patnum - numUsedPatterns); if (evaluate) { delete[] bitMap; return result; } mp_sint32* patRelocTable = new mp_sint32[header.patnum]; for (i = 0, j = 0; i < header.patnum; i++) { if (bitMap[i]) { patRelocTable[i] = j++; } } TXMPattern* tempPHeads = new TXMPattern[header.patnum]; memcpy(tempPHeads, phead, header.patnum*sizeof(TXMPattern)); memset(phead, 0, header.patnum*sizeof(TXMPattern)); for (i = 0; i < header.patnum; i++) { if (bitMap[i]) { j = patRelocTable[i]; phead[j] = tempPHeads[i]; } else { delete[] tempPHeads[i].patternData; tempPHeads[i].patternData = NULL; } } for (i = 0; i < header.ordnum; i++) { header.ord[i] = (mp_ubyte)patRelocTable[header.ord[i]]; } delete[] tempPHeads; delete[] patRelocTable; delete[] bitMap; header.patnum = numUsedPatterns; return result; } void XModule::postLoadAnalyser() { mp_sint32 i,r,c; bool oldPTProbability = false; for (i = 0; i < header.patnum; i++) { if (phead[i].patternData) { mp_ubyte* data = phead[i].patternData; mp_sint32 slotSize = phead[i].effnum * 2 + 2; mp_sint32 rowSize = slotSize * phead[i].channum; for (c = 0; c < phead[i].channum; c++) { mp_sint32 insCycleCounter = 0; mp_sint32 lastCycleIns = -1; mp_sint32 lastIns = -1; bool hasCycled = false; for (r = 0; r < phead[i].rows; r++) { mp_ubyte* slot = data + r*rowSize + c*slotSize; if (!oldPTProbability) { if (slot[1] && !slot[0] && (mp_sint32)slot[1] != lastCycleIns) { insCycleCounter++; hasCycled = true; lastCycleIns = slot[1]; } else if (slot[1] && slot[0] && hasCycled) { insCycleCounter = 0; hasCycled = false; lastCycleIns = -1; } if (insCycleCounter >= 3 && hasCycled) { #ifdef VERBOSE printf("pattern:%i, channel:%i, row:%i\n",i,c,r); #endif oldPTProbability = true; } // another try: if (lastIns != -1) { if (slot[0] && slot[1] && (slot[1] != lastIns) && (slot[2] == 0x03 || slot[2] == 0x05)) { #ifdef VERBOSE printf("pattern:%i, channel:%i, row:%i\n",i,c,r); #endif oldPTProbability = true; } } } if (slot[1]) lastIns = slot[1]; } } } } if (oldPTProbability) header.flags |= MODULE_OLDPTINSTRUMENTCHANGE; #ifdef VERBOSE printf("%s: %i\n", header.name, oldPTProbability); #endif } void XModule::convertXMVolumeEffects(mp_ubyte vol, mp_ubyte& effect, mp_ubyte& operand) { effect = 0; operand = 0; if (vol>=0x10&&vol<=0x50) { effect = 0x0C; operand = XModule::vol64to255(vol-0x10); } if (vol>=0x60) { mp_ubyte eff = vol>>4; mp_ubyte op = vol&0xf; /*printf("%x, %x\r\n",eff,op); getch();*/ if (op) { switch (eff) { case 0x6 : { effect=0x0A; operand=op; }; break; case 0x7 : { effect=0x0A; operand=op<<4; }; break; case 0x8 : { effect=0x3B; operand=op; }; break; case 0x9 : { effect=0x3A; operand=op; }; break; case 0xA : { effect=0x4; operand=op<<4; }; break; case 0xB : { effect=0x4; operand=op; }; break; case 0xC : { effect=0x8; operand=(mp_ubyte)XModule::pan15to255(op); }; break; case 0xD : { effect=0x19; operand=op; }; break; case 0xE : { effect=0x19; operand=op<<4; }; break; case 0xF : { effect=0x3; operand=op<<4; }; break; } } else { switch (eff) { case 0xB : { effect=0x4; operand=op; }; break; case 0xC : { effect=0x8; operand=(mp_ubyte)XModule::pan15to255(op); }; break; case 0xF : { effect=0x3; operand=op; }; break; } } } } XModule::IsPTCompatibleErrorCodes XModule::isPTCompatible() { mp_sint32 i; // step 1: linear frequencies are used if (header.freqtab & 1) return IsPTCompatibleErrorCodeLinearFrequencyUsed; // step 2: find last used instrument, if greater than 31 => too many samples mp_sint32 insNum = header.insnum; for (i = header.insnum - 1; i > 0; i--) { mp_ubyte buffer[MP_MAXTEXT+1]; convertStr(reinterpret_cast(buffer), reinterpret_cast(instr[i].name), MP_MAXTEXT, false); if (strlen((char*)buffer)) { insNum = i+1; break; } if (instr[i].samp) { mp_sint32 lasts = -1; #ifdef MILKYTRACKER for (mp_sint32 j = 0; j < 96; j++) #else for (mp_sint32 j = 0; j < 120; j++) #endif { mp_sint32 s = instr[i].snum[j]; if (lasts != -1 && s != lasts) return IsPTCompatibleErrorCodeIncompatibleInstruments; lasts = s; if (s >= 0) { convertStr(reinterpret_cast(buffer), reinterpret_cast(smp[s].name), MP_MAXTEXT, false); if (strlen((char*)buffer) || (smp[s].sample && smp[s].samplen)) { insNum = i+1; goto insFound; } } } } } insFound: if (i == 0) insNum = 1; if (insNum > 31) return IsPTCompatibleErrorCodeTooManyInstruments; // step 3: incompatible samples for (i = 0; i < MP_MAXSAMPLES; i++) { if (smp[i].samplen >= 128*1024 || (smp[i].samplen && ((smp[i].type & 16) || (smp[i].type & 3) == 2 || smp[i].relnote || smp[i].pan != 0x80))) return IsPTCompatibleErrorCodeIncompatibleSamples; if (smp[i].venvnum) { if (venvs[smp[i].venvnum-1].type & 1) return IsPTCompatibleErrorCodeIncompatibleInstruments; } if (smp[i].penvnum) { if (penvs[smp[i].penvnum-1].type & 1) return IsPTCompatibleErrorCodeIncompatibleInstruments; } if (smp[i].vibdepth && smp[i].vibrate) return IsPTCompatibleErrorCodeIncompatibleInstruments; } // step 4: incompatible patterns for (i = 0; i < header.patnum; i++) { mp_sint32 slotSize = phead[i].effnum * 2 + 2; mp_sint32 rowSizeSrc = slotSize*phead[i].channum; if (phead[i].rows != 64) return IsPTCompatibleErrorCodeIncompatiblePatterns; for (mp_sint32 r = 0; r < phead[i].rows; r++) for (mp_sint32 c = 0; c < header.channum; c++) { if (c < phead[i].channum) { mp_ubyte* src = phead[i].patternData + r*rowSizeSrc+c*slotSize; // check note range mp_ubyte note = *src; if (note) { note--; if (!(note >= 36 && note < 36+12*3)) return IsPTCompatibleErrorCodeIncompatiblePatterns; } // check volume command mp_ubyte eff = *(src+2); if (eff) return IsPTCompatibleErrorCodeIncompatiblePatterns; // check for normal commands eff = *(src+4); if (eff > 0xF && (eff < 0x30 || eff >=0x3F) && eff != 0x20) return IsPTCompatibleErrorCodeIncompatiblePatterns; } } } return IsPTCompatibleErrorCodeNoError; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderPLM.cpp0000644000175000017500000003513511163403715021520 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderPLM.cpp * MilkyPlay Module Loader: DisorderTracker PLM Loader * * -------------------------------- * Version History: * -------------------------------- * 02/24/05: Added a flag in the sample field (bit 2 = 4) to take the sample * volume as channel mastervolume (see PlayerSTD.h) * 11/22/04: Position jump (tested) & pattern break (untested) support * 11/21/04: Overlapping patterns * 11/19/04: First work */ #include "Loaders.h" #define PATTERNSIZE 64 struct TOrdHdr { mp_uword startPos; mp_ubyte startChannel; mp_ubyte patternIndex; }; const char* LoaderPLM::identifyModule(const mp_ubyte* buffer) { // check for .PLM module first if (!memcmp(buffer,"PLM\x1A",4)) { return "PLM"; } // this is not an .PLM return NULL; } ////////////////////////////////////////////////////// // Load DisorderTracker II module // return: 0 = no error // -7 = out of memory // -8 = other ////////////////////////////////////////////////////// mp_sint32 LoaderPLM::load(XMFileBase& f, XModule* module) { mp_sint32 i,j; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; /////////////////////////////////////////////////// // read header /////////////////////////////////////////////////// f.read(header->sig,1,3); f.readByte(); mp_uint32 hdrSize = f.readByte(); mp_ubyte ver = f.readByte(); if (ver != 0x10) return -8; f.read(header->name, 1, 32); // skip remaining bytes from the song name f.readDword(); // 36 f.readDword(); // 40 f.readDword(); // 44 f.readDword(); // 48 => skipped rest of song name :) header->channum = f.readByte(); f.readByte(); // doc says ignore flags byte mp_ubyte maxVol = f.readByte(); f.readByte(); // skip soundblaster amplify header->speed = f.readByte(); header->tempo = f.readByte(); // panning positions for (i = 0; i < 32; i++) header->pan[i] = (mp_ubyte)XModule::pan15to255(f.readByte()); header->smpnum = header->insnum = f.readByte(); mp_sint32 numPatterns = f.readByte(); mp_sint32 numOrders = f.readWord(); header->mainvol = 255; /////////////////////////////////////////////////// // read orderlist, special with PLM /////////////////////////////////////////////////// f.seekWithBaseOffset(hdrSize); TOrdHdr* ordHeaders = new TOrdHdr[numOrders]; for (i = 0; i < numOrders; i++) { ordHeaders[i].startPos = f.readWord(); ordHeaders[i].startChannel = f.readByte(); ordHeaders[i].patternIndex = f.readByte(); /*printf("%x, %i, %i, %i\n",f.posWithBaseOffset(), ordHeaders[i].startPos, ordHeaders[i].startChannel, ordHeaders[i].patternIndex); getch();*/ } mp_uint32* patOffsets = new mp_uint32[numPatterns]; mp_uint32* smpOffsets = new mp_uint32[header->insnum]; f.readDwords(patOffsets, numPatterns); f.readDwords(smpOffsets, header->insnum); /////////////////////////////////////////////////// // read patterns /////////////////////////////////////////////////// mp_ubyte* patterns[256]; for (i = 0; i < numPatterns; i++) { if (patOffsets[i] != 0) { f.seekWithBaseOffset(patOffsets[i]); mp_uint32 size = f.readDword(); patterns[i] = new mp_ubyte[size]; if (patterns[i] == NULL) { for (j = 0; j < i; j++) delete[] patterns[j]; delete[] smpOffsets; delete[] patOffsets; return -7; } f.read(patterns[i], 1, size); } else { patterns[i] = NULL; } } /////////////////////////////////////////////////// // read instruments (+samples) /////////////////////////////////////////////////// /* Sample layout: id 4 bytes 0 ; ID (PLS+28) headersize 1 byte 4 ; size of header in bytes, including ID etc version 1 byte 5 fullname 32 byte 6 ; NOT asciiz filename 12 byte 38 ; ditto pan byte 50 ; default pan, 0..f, >f=none vol byte 51 ; default vol 0..40h flags byte 52 ; 1 = 16 bit , 0=8 bit c4spd word 53 ; c4spd (as for S3M) gusloc dword 55 ; posn in gusram (not used in file) loopst dword 59 ; loopstart loopen dword 63 ; loopend len dword 67 ; data size IN BYTES data lots of bytes ; unsigned data*/ for (i = 0; i < header->insnum; i++) { if (!smpOffsets[i]) continue; f.seekWithBaseOffset(smpOffsets[i]); mp_uint32 id = f.readDword(); if (id != 0x1a534c50) { for (j = 0; j < numPatterns; j++) delete[] patterns[j]; delete[] smpOffsets; delete[] patOffsets; return -8; } mp_uint32 sHdrSize = f.readByte(); mp_ubyte ver = f.readByte(); f.read(instr[i].name, 1, 32); f.read(smp[i].name, 1, 12); mp_ubyte pan = f.readByte(); smp[i].flags = 4; if (pan <= 0xf) { smp[i].pan = (mp_ubyte)XModule::pan15to255(pan); smp[i].flags|=2; } mp_ubyte vol = f.readByte(); smp[i].vol = vol <= 64 ? XModule::vol64to255(vol) : 255/*0xff*/; mp_ubyte flags = f.readByte(); smp[i].type = (flags&1)?16:0; XModule::convertc4spd(f.readWord(), &smp[i].finetune, &smp[i].relnote); f.readDword(); // skip guspos smp[i].loopstart = f.readDword(); //smp[i].looplen = f.readDword(); mp_sint32 looplen = ((mp_sint32)f.readDword() - (mp_sint32)smp[i].loopstart) - ((flags&1)?2:1); if (looplen < 0) looplen = 0; smp[i].looplen = looplen; if (smp[i].looplen) { smp[i].type = (flags & 2) ? 2 : 1; } smp[i].samplen = f.readDword(); #ifdef VERBOSE printf("%i: %i, %i, %x\n",i+1,vol,flags,smp[i].samplen); #endif if (smp[i].samplen) { instr[i].samp = 1; for (j = 0; j < 120; j++) { instr[i].snum[j] = i; } smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen); if (smp[i].sample == NULL) { for (j = 0; j < numPatterns; j++) delete[] patterns[j]; delete[] smpOffsets; delete[] patOffsets; return -7; } if (flags&1) { module->loadSample(f, smp[i].sample, smp[i].samplen, smp[i].samplen>>1, XModule::ST_UNSIGNED); smp[i].samplen>>=1; } else { module->loadSample(f, smp[i].sample, smp[i].samplen, smp[i].samplen, XModule::ST_UNSIGNED); // due to some bug in DT2 it seems all samples are starting with // signed byte -47 // we're trying to apply some correction to that if (smp[i].samplen) smp[i].sample[0] = smp[i].sample[1]; } } } delete[] smpOffsets; delete[] patOffsets; /////////////////////////////////////////////////// // convert song /////////////////////////////////////////////////// mp_sint32 maxLen = 0; for (i = 0; i < numOrders; i++) { j = ordHeaders[i].patternIndex; if (patterns[j] != NULL) { mp_sint32 rows = *patterns[j]; if ((ordHeaders[i].startPos + rows) > maxLen) maxLen = ordHeaders[i].startPos + rows; } } mp_sint32 numConvertedPatterns = maxLen / PATTERNSIZE; mp_sint32 lastPatternLength = maxLen & (PATTERNSIZE-1); if (lastPatternLength) numConvertedPatterns++; if (numConvertedPatterns > 255) numConvertedPatterns = 255; #ifdef VERBOSE printf("Number of rows in song %i => %i patterns\n", maxLen, numConvertedPatterns); #endif header->patnum = numConvertedPatterns; header->ordnum = numConvertedPatterns; mp_uint32 rowCnt = 0; mp_uword* ordTable = new mp_uword[65536]; for (i = 0; i < numConvertedPatterns; i++) { header->ord[i] = i; phead[i].rows = PATTERNSIZE; phead[i].effnum = 3; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*8]; memset(phead[i].patternData, 0, phead[i].rows*header->channum*8); // find possible hits within this pattern mp_sint32 numResults = 0; for (j = 0; j < numOrders; j++) { // valid pattern? if (patterns[ordHeaders[j].patternIndex] != NULL) { // pattern intersection scenario if ((mp_uint32)ordHeaders[j].startPos+(mp_uint32)*patterns[ordHeaders[j].patternIndex] < rowCnt || ordHeaders[j].startPos > (rowCnt+PATTERNSIZE)) { continue; } ordTable[numResults++] = j; } } for (mp_sint32 rows = 0; rows < PATTERNSIZE; rows++) { for (mp_sint32 c = 0; c < header->channum; c++) { mp_sint32 lastStartPos = -1; mp_sint32 lastIndex = -1; mp_sint32 theIndex = -1; for (j = 0; j < numResults/*numOrders*/; j++) { mp_sint32 index = ordTable[j]; //mp_sint32 index = j; if (ordHeaders[index].startPos <= rowCnt && ((mp_uint32)ordHeaders[index].startPos + (mp_uint32)*patterns[ordHeaders[index].patternIndex]) > rowCnt && ordHeaders[index].startChannel <= c && ordHeaders[index].startChannel + *(patterns[ordHeaders[index].patternIndex]+1) > c /*&& ordHeaders[index].startPos >= lastStartPos*/) { if (ordHeaders[index].startPos == lastStartPos) { if (ordHeaders[index].patternIndex > lastIndex) { theIndex = index; lastIndex = ordHeaders[index].patternIndex; lastStartPos = ordHeaders[index].startPos; } } else { theIndex = index; lastIndex = ordHeaders[index].patternIndex; lastStartPos = ordHeaders[index].startPos; } } } if (theIndex != -1) { // position within pattern mp_sint32 baseRow = rowCnt - ordHeaders[theIndex].startPos; mp_sint32 numChannels = *(patterns[ordHeaders[theIndex].patternIndex]+1); mp_ubyte* pattern = patterns[ordHeaders[theIndex].patternIndex]+28; mp_ubyte* srcSlot = pattern + ((c-ordHeaders[theIndex].startChannel)*5 + baseRow*numChannels*5); mp_ubyte* dstSlot = phead[i].patternData + (c*8 + rows*header->channum*8); mp_ubyte note = srcSlot[0]; mp_ubyte ins = srcSlot[1]; mp_ubyte vol = srcSlot[2]; mp_ubyte eff = srcSlot[3]; mp_ubyte op = srcSlot[4]; dstSlot[0] = note ? (((note>>4)*12+(note&0xf))+1) : 0; dstSlot[1] = ins; if (vol!=255) { dstSlot[2] = 0xC; dstSlot[3] = vol<=64 ? XModule::vol64to255(vol) : 255; } mp_ubyte dstEff = 0; mp_ubyte dstOp = 0; switch (eff) { case 0x00: break; // s3m porta up case 0x01: dstEff = 0x47; dstOp = op; break; // s3m porta down case 0x02: dstEff = 0x48; dstOp = op; break; // porta to note case 0x03: dstEff = 0x03; dstOp = op; break; // s3m volslide case 0x04: dstEff = 0x49; dstOp = op; break; case 0x05: dstEff = 0x07; dstOp = op; break; case 0x06: dstEff = 0x04; dstOp = op; break; case 0x07: dstEff = 0x37; dstOp = op; break; case 0x08: dstEff = 0x34; dstOp = op; break; case 0x09: dstEff = 0x16; dstOp = op; break; case 0x0A: dstEff = 0x1C; dstOp = op; break; // position jump case 0x0B: dstEff = 0x2B; dstOp = (ordHeaders[op].startPos / PATTERNSIZE); dstSlot[7] = ordHeaders[op].startPos & (PATTERNSIZE-1); break; // pattern break case 0x0C: dstEff = 0x2B; dstOp = ((ordHeaders[theIndex+1].startPos+op) / PATTERNSIZE); dstSlot[7] = (ordHeaders[theIndex+1].startPos+op) & (PATTERNSIZE-1); break; case 0x0D: dstEff = 0x09; dstOp = op; break; case 0x0E: dstEff = 0x08; dstOp = (mp_ubyte)XModule::pan15to255(op); break; case 0x0F: dstEff = 0x1B; dstOp = op; break; case 0x10: dstEff = 0x3D; dstOp = op; break; case 0x11: dstEff = 0x3C; dstOp = op; break; case 0x12: dstEff = 0x3E; dstOp = op; break; case 0x13: dstEff = 0x4A; dstOp = op; break; case 0x14: dstEff = 0x6; dstOp = op; break; case 0x15: dstEff = 0x5; dstOp = op; break; case 0x16: dstEff = 0x8; dstOp = op; break; #ifdef VERBOSE default: printf("%x:%x\n",eff,op); #endif } dstSlot[4] = dstEff; dstSlot[5] = dstOp; #ifdef VERBOSE if (c >= 0x02 && c < 0x3 && rowCnt >= 0xA0 && rowCnt <= 0xB0) { printf("row %i: %i, %i, %i, %x, %x (source: %i, %i, %i)\n",rowCnt,srcSlot[0],srcSlot[1],srcSlot[2],srcSlot[3],srcSlot[4],ordHeaders[theIndex].patternIndex,ordHeaders[theIndex].startChannel,numChannels); } #endif } } rowCnt++; } } delete[] ordTable; for (j = 0; j < numPatterns; j++) delete[] patterns[j]; delete[] ordHeaders; strcpy(header->tracker,"DisorderTracker 2"); // take panning positions from start //module->setDefaultPanning(); module->postProcessSamples(true); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/ResamplerSinc.h0000644000175000017500000004264211163403715022156 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ResamplerSinc.h * MilkyPlay * * Created by Peter Barth on 03.01.08. * */ #include /* * Sinc resamplers based on: * http://www.cs.princeton.edu/courses/archive/spr07/cos325/src/TimeStuf/srconvrt.c * */ #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define fpmul MP_FP_MUL #define advancePos(CHNsmppos, CHNflags, CHNloopstart, CHNloopend, CHNloopendcopy) \ if (((((CHNflags&3) == 0 || (CHNflags&3) == 1)) && !(CHNflags&ChannelMixer::MP_SAMPLE_BACKWARD)) || \ ((CHNflags&3) == 2 && (CHNflags&ChannelMixer::MP_SAMPLE_BACKWARD) == 0)) \ { \ CHNsmppos++; \ /* stop playing if necessary */ \ if (CHNsmppos>=CHNloopend) \ { \ if ((CHNflags & 3) == 0) \ { \ if (CHNflags & ChannelMixer::MP_SAMPLE_ONESHOT) \ { \ CHNflags &= ~ChannelMixer::MP_SAMPLE_ONESHOT; \ CHNflags |= 1; \ CHNloopend = CHNloopendcopy; \ CHNsmppos = CHNloopstart; \ } \ else \ { \ CHNflags&=~ChannelMixer::MP_SAMPLE_PLAY; \ } \ } \ else if ((CHNflags & 3) == 1) \ { \ CHNsmppos = CHNloopstart; \ } \ else \ { \ CHNflags|=ChannelMixer::MP_SAMPLE_BACKWARD; \ CHNsmppos = CHNloopend-1; \ } \ }\ } \ /* bi-dir loop */ \ else \ { \ CHNsmppos--; \ if (CHNloopstart>CHNsmppos) \ { \ if ((CHNflags & 3) == 0) \ { \ CHNflags&=~ChannelMixer::MP_SAMPLE_PLAY; \ } \ else if ((CHNflags & 3) == 1) \ { \ CHNsmppos = CHNloopend-1; \ } \ else \ { \ CHNflags&=~ChannelMixer::MP_SAMPLE_BACKWARD; \ CHNsmppos = CHNloopstart; \ } \ } \ } // double precision sinc without window function template class SincResamplerDummy { private: static inline double sinc(double x) { if (x==0.0) return 1.0; else { double temp = M_PI * x; return sin(temp) / (temp); } } enum { WINDOWSIZE = windowSize, // must be even WIDTH = (WINDOWSIZE / 2) }; public: static inline void addBlock(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { const bufferType* sample = (const bufferType*)chn->sample; mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; const mp_sint32 rampFromVolStepL = ramping ? chn->rampFromVolStepL : 0; const mp_sint32 rampFromVolStepR = ramping ? chn->rampFromVolStepR : 0; mp_sint32 smppos = chn->smppos; mp_sint32 smpposfrac = chn->smpposfrac; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; const mp_sint32 flags = chn->flags; const mp_sint32 loopstart = chn->loopstart; const mp_sint32 loopend = chn->loopend; const mp_sint32 loopendcopy = chn->loopendcopy; const mp_sint32 smplen = chn->smplen; mp_sint32 fixedtimefrac = chn->fixedtimefrac; const mp_sint32 timeadd = chn->smpadd; ChannelMixer::TMixerChannel pos(true); while (count--) { double result = 0; const double time_now = fixedtimefrac * (1.0 / 65536.0); if (abs(smpadd)<65536) { pos.smppos = smppos; pos.loopstart = loopstart; pos.loopend = loopend; pos.loopendcopy = loopendcopy; pos.flags = smpadd < 0 ? (flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) : ((flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) | ChannelMixer::MP_SAMPLE_BACKWARD); // check whether we are outside loop points // if that's the case we're treating the sample as a normal finite signal // note that this is still not totally correct treatment const bool outSideLoop = !(((flags & 3) && pos.smppos >= loopstart && pos.smppos < loopend)); if (outSideLoop) { pos.loopstart = 0; pos.loopend = smplen; pos.flags &= ~3; } double time = time_now; if (!fixedtimefrac && (flags & ChannelMixer::MP_SAMPLE_BACKWARD)) time = 1.0; mp_sint32 j; for (j = 0; j 0 ? (flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) : ((flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) | ChannelMixer::MP_SAMPLE_BACKWARD); if (outSideLoop) pos.flags &= ~3; time = time_now; if (!fixedtimefrac && (flags & ChannelMixer::MP_SAMPLE_BACKWARD)) time = 1.0; for (j = 1; j= loopstart && pos.smppos < loopend)); if (outSideLoop) { pos.loopstart = 0; pos.loopend = smplen; pos.flags &= ~3; } double time = time_now; if (!fixedtimefrac && (flags & ChannelMixer::MP_SAMPLE_BACKWARD)) time = 1.0; mp_sint32 j; for (j = 0; j 0 ? (flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) : ((flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) | ChannelMixer::MP_SAMPLE_BACKWARD); if (outSideLoop) pos.flags &= ~3; time = time_now; if (!fixedtimefrac && (flags & ChannelMixer::MP_SAMPLE_BACKWARD)) time = 1.0; for (j = 1; j>15))>>15); (*buffer++)+=((final*(volr>>15))>>15); if (ramping) { voll+=rampFromVolStepL; volr+=rampFromVolStepR; } MP_INCREASESMPPOS(smppos, smpposfrac, smpadd, 16); fixedtimefrac=(fixedtimefrac+timeadd) & 65535; } chn->smppos = smppos; chn->smpposfrac = smpposfrac; chn->fixedtimefrac = fixedtimefrac; if (ramping) { chn->finalvoll = voll; chn->finalvolr = volr; } } }; template class ResamplerSinc : public ChannelMixer::ResamplerBase { private: public: virtual bool isRamping() { return ramping; } virtual bool supportsFullChecking() { return false; } virtual bool supportsNoChecking() { return true; } virtual void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { if (chn->flags & 4) SincResamplerDummy::addBlock(buffer, chn, count); else SincResamplerDummy::addBlock(buffer, chn, count); } }; // fixed point sinc with almost hamming window // you like that, eh? #define SINCTAB ResamplerSincTableBase::sinc_table #define WSIZE ResamplerSincTableBase::WIDTH #define SPZCSHIFT ResamplerSincTableBase::SAMPLES_PER_ZERO_CROSSING_SHIFT #define SINC(x) \ ((abs(x)>>16)>=(WSIZE-1) ? 0 : \ (SINCTAB[abs(x) >> (16-SPZCSHIFT)] + \ fpmul((SINCTAB[(abs(x) >> (16-SPZCSHIFT)) + 1] - \ SINCTAB[abs(x) >> (16-SPZCSHIFT)]), \ (abs(x) >> (16-SPZCSHIFT)) & 65535))) // share sinc lookup table template class ResamplerSincTableBase : public ChannelMixer::ResamplerBase { protected: enum { WINDOWSIZE = windowSize, // must be even WIDTH = (WINDOWSIZE / 2), SAMPLES_PER_ZERO_CROSSING_SHIFT = 10, SAMPLES_PER_ZERO_CROSSING = (1 << SAMPLES_PER_ZERO_CROSSING_SHIFT), TABLESIZE = SAMPLES_PER_ZERO_CROSSING*WIDTH, }; static mp_sint32* sinc_table; void make_sinc() { mp_sint32 i; double temp,win_freq,win; win_freq = M_PI / WIDTH / SAMPLES_PER_ZERO_CROSSING; sinc_table[0] = 65536; for (i=1;i bool ResamplerSincTableBase::tableInit = false; template mp_sint32* ResamplerSincTableBase::sinc_table = NULL; template class SincTableResamplerDummy : public ResamplerSincTableBase { public: static inline void addBlock(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { const bufferType* sample = (const bufferType*)chn->sample; mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; const mp_sint32 rampFromVolStepL = ramping ? chn->rampFromVolStepL : 0; const mp_sint32 rampFromVolStepR = ramping ? chn->rampFromVolStepR : 0; mp_sint32 smppos = chn->smppos; mp_sint32 smpposfrac = chn->smpposfrac; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; const mp_sint32 rsmpadd = chn->rsmpadd; const mp_sint32 flags = chn->flags; const mp_sint32 loopstart = chn->loopstart; const mp_sint32 loopend = chn->loopend; const mp_sint32 loopendcopy = chn->loopendcopy; const mp_sint32 smplen = chn->smplen; mp_sint32 fixedtimefrac = chn->fixedtimefrac; const mp_sint32 timeadd = chn->smpadd; const mp_sint32 negflags = smpadd < 0 ? (flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) : ((flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) | ChannelMixer::MP_SAMPLE_BACKWARD); const mp_sint32 posflags = smpadd > 0 ? (flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) : ((flags & ~ChannelMixer::MP_SAMPLE_BACKWARD) | ChannelMixer::MP_SAMPLE_BACKWARD); mp_sint32 tmpsmppos; mp_sint32 tmpflags; mp_sint32 tmploopstart; mp_sint32 tmploopend; if (timeadd < 65536) { while (count--) { mp_sint32 result = 0; tmpsmppos = smppos; tmploopstart = loopstart; tmploopend = loopend; tmpflags = negflags; // check whether we are outside loop points // if that's the case we're treating the sample as a normal finite signal // note that this is still not totally correct treatment const bool outSideLoop = !(((flags & 3) && tmpsmppos >= loopstart && tmpsmppos < loopend)); if (outSideLoop) { tmploopstart = 0; tmploopend = smplen; tmpflags &= ~3; } mp_sint32 time = fixedtimefrac; if (!time && (flags & ChannelMixer::MP_SAMPLE_BACKWARD)) time = 65536; mp_sint32 j; for (j = 0; j::WIDTH; j++) { result += (sample[tmpsmppos] * SINC(time)) >> shift; time+=65536; advancePos(tmpsmppos, tmpflags, tmploopstart, tmploopend, loopendcopy); if (!(tmpflags & ChannelMixer::MP_SAMPLE_PLAY)) break; } tmpsmppos = smppos; tmpflags = posflags; if (outSideLoop) tmpflags &= ~3; time = fixedtimefrac; if (!time && (flags & ChannelMixer::MP_SAMPLE_BACKWARD)) time = 65536; for (j = 1; j::WIDTH; j++) { advancePos(tmpsmppos, tmpflags, tmploopstart, tmploopend, loopendcopy); time-=65536; if (!(tmpflags & ChannelMixer::MP_SAMPLE_PLAY)) break; result += (sample[tmpsmppos] * SINC(time)) >> shift; } (*buffer++)+=(((result)*(voll>>15))>>15); (*buffer++)+=(((result)*(volr>>15))>>15); if (ramping) { voll+=rampFromVolStepL; volr+=rampFromVolStepR; } MP_INCREASESMPPOS(smppos, smpposfrac, smpadd, 16); fixedtimefrac=(fixedtimefrac+timeadd) & 65535; } } else { while (count--) { mp_sint32 result = 0; tmpsmppos = smppos; tmploopstart = loopstart; tmploopend = loopend; tmpflags = negflags; // check whether we are outside loop points // if that's the case we're treating the sample as a normal finite signal // note that this is still not totally correct treatment const bool outSideLoop = !(((flags & 3) && tmpsmppos >= loopstart && tmpsmppos < loopend)); if (outSideLoop) { tmploopstart = 0; tmploopend = smplen; tmpflags &= ~3; } mp_sint32 time = fpmul(fixedtimefrac, rsmpadd); if (!time && (flags & ChannelMixer::MP_SAMPLE_BACKWARD)) time = 65536; mp_sint32 j; for (j = 0; j::WIDTH; j++) { result += (sample[tmpsmppos] * fpmul(SINC(time), rsmpadd)) >> shift; advancePos(tmpsmppos, tmpflags, tmploopstart, tmploopend, loopendcopy); time+=rsmpadd; if (!(tmpflags & ChannelMixer::MP_SAMPLE_PLAY)) break; } tmpsmppos = smppos; tmpflags = posflags; if (outSideLoop) tmpflags &= ~3; time = fpmul(fixedtimefrac, rsmpadd); if (!time && (flags & ChannelMixer::MP_SAMPLE_BACKWARD)) time = 65536; for (j = 1; j::WIDTH; j++) { advancePos(tmpsmppos, tmpflags, tmploopstart, tmploopend, loopendcopy); time-=rsmpadd; if (!(tmpflags & ChannelMixer::MP_SAMPLE_PLAY)) break; result += (sample[tmpsmppos] * fpmul(SINC(time), rsmpadd)) >> shift; } (*buffer++)+=(((result)*(voll>>15))>>15); (*buffer++)+=(((result)*(volr>>15))>>15); if (ramping) { voll+=rampFromVolStepL; volr+=rampFromVolStepR; } MP_INCREASESMPPOS(smppos, smpposfrac, smpadd, 16); fixedtimefrac=(fixedtimefrac+timeadd) & 65535; } } chn->smppos = smppos; chn->smpposfrac = smpposfrac; chn->fixedtimefrac = fixedtimefrac; if (ramping) { chn->finalvoll = voll; chn->finalvolr = volr; } } }; template class ResamplerSincTable : public ResamplerSincTableBase { public: ResamplerSincTable() : ResamplerSincTableBase() { } virtual bool isRamping() { return ramping; } virtual bool supportsFullChecking() { return false; } virtual bool supportsNoChecking() { return true; } virtual void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { if (chn->flags & 4) SincTableResamplerDummy::addBlock(buffer, chn, count); else SincTableResamplerDummy::addBlock(buffer, chn, count); } }; #undef SINC #undef SPZCSHIFT #undef WSIZE #undef SINCTAB #undef fpmul milkytracker-0.90.85+dfsg/src/milkyplay/fix_newline.sh0000755000175000017500000000036410737736041022106 0ustar admin2admin2#!/bin/sh # for i in `ls` do if [ -f $i ] then if [ -n "`tail -1c $i`" ] then echo "Bearbeite $i" echo >> $i fi fi done milkytracker-0.90.85+dfsg/src/milkyplay/LoaderIMF.cpp0000644000175000017500000003140111163403715021473 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderIMF.cpp * MilkyPlay Module Loader: Imago Orpheus * * Much thanks to the MikMod team for providing lots of information about the format * * -------------------------------- * Version History: * -------------------------------- * 01/24/05: Started... */ #include "Loaders.h" //#define VERBOSE const char* LoaderIMF::identifyModule(const mp_ubyte* buffer) { // check for .IMF module first if (!memcmp(buffer+0x3c,"IM10",4)) { return "IMF"; } // this is not an .IMF return NULL; } struct IMFChannel { char name[12]; mp_ubyte chorus, reverb, panning, status; }; struct IMFInstrument { char name[32]; mp_ubyte snum[120]; mp_uword volenv[16*2]; mp_uword panenv[16*2]; mp_uword pitenv[16*2]; mp_ubyte volpts; mp_ubyte volsus; mp_ubyte volbeg; mp_ubyte volend; mp_ubyte volflg; mp_ubyte panpts; mp_ubyte pansus; mp_ubyte panbeg; mp_ubyte panend; mp_ubyte panflg; mp_ubyte pitpts; mp_ubyte pitsus; mp_ubyte pitbeg; mp_ubyte pitend; mp_ubyte pitflg; mp_uword volfade; mp_uword numsmp; char signature[4]; }; struct IMFSample { char name[13]; mp_uint32 length; mp_uint32 loopstart; mp_uint32 loopend; mp_uint32 samplerate; mp_ubyte volume; mp_ubyte pan; mp_ubyte flags; }; static void convertEffect(mp_ubyte& eff, mp_ubyte& op) { switch (eff) { case 0x01: // set speed eff = 0x1C; break; case 0x02: // set tempo eff = 0x16; break; case 0x03: // portamento to note break; case 0x04: // porta to note + volslide eff = 0x05; break; case 0x05: // vibrato eff = 0x04; break; case 0x06: // vibrato + volslide break; case 0x07: // fine vibrato eff = 0x4A; break; case 0x08: // tremolo eff = 0x07; break; case 0x09: // argpeggio eff = 0x20; break; case 0x0A: // set panning eff = 0x08; break; case 0x0B: // panning slide eff = 0x19; break; case 0x0C: // set volume op = XModule::vol64to255(op); break; case 0x0D: // volume slide eff = 0x0A; break; case 0x0E: // fine volume slide if (op) { if (op>>4) { eff = 0x49; op = 0x0f | (op & 0xF0); } else { eff = 0x49; op = 0xf0 | (op & 0xF); } } else eff = 0x49; break; case 0x0F: // set finetune eff = 0x35; break; case 0x12: // porta up eff = 0x01; break; case 0x13: // porta down eff = 0x02; break; case 0x14: // fine porta up eff = 0x41; break; case 0x15: // fine porta down eff = 0x42; break; case 0x18: // set sample offset eff = 0x09; break; case 0x1A: // set keyoff eff = 0x51; break; case 0x1B: // multi retrig break; case 0x1D: // pos jump eff = 0x0B; break; case 0x1E: // pattern break eff = 0x0D; break; case 0x1F: // set mainvol eff = 0x10; op = XModule::vol64to255(op); break; case 0x20: // mainvolslide eff = 0x11; break; case 0x21: switch (op >> 4) { case 0x0A: // loop eff = 0x36; op&=0x0f; break; case 0x0B: // pattern delay eff = 0x3e; op&=0x0f; break; case 0x0C: // note cut eff = 0x3c; op&=0x0f; break; case 0x0D: // note cut eff = 0x3d; op&=0x0f; break; default: #ifdef VERBOSE printf("Missing IMF Sub-Effect: %x, %x\n", op>>4, op&0xf); #endif eff = op = 0; break; } case 0: op = 0; break; default: #ifdef VERBOSE printf("Missing IMF Effect: %x, %x\n", eff, op); #endif eff = op = 0; } } mp_sint32 LoaderIMF::load(XMFileBase& f, XModule* module) { mp_sint32 i,j,k; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; memcpy(header->sig, "IM10", 4); f.read(header->name, 1, 32); header->ordnum = f.readWord(); header->patnum = f.readWord(); header->insnum = f.readWord(); header->freqtab = f.readWord() & 1; f.readDword(); f.readDword(); header->tempo = f.readByte(); header->speed = f.readByte(); header->mainvol = XModule::vol64to255(f.readByte()); header->flags = XModule::MODULE_ST3DUALCOMMANDS; f.seekWithBaseOffset(64); IMFChannel channels[32]; for (i = 0; i < 32; i++) { f.read(channels[i].name, 1, 12); channels[i].chorus = f.readByte(); channels[i].reverb = f.readByte(); channels[i].panning = f.readByte(); channels[i].status = f.readByte(); } // ripped from MikMod loader :) if (!channels[0].status) { for (i = 1; i < 16; i++) if (channels[i].status!=1) break; if (i==16) for (i=1;i<16;i++) channels[i].status=0; } header->channum = 32; while (channels[header->channum-1].status == 2 && header->channum > 1) header->channum--; #ifdef VERBOSE for (i = 0; i < header->channum; i++) { printf("Channel: %i\n", channels[i].status); } #endif f.read(header->ord, 1, 256); for (i = 0; i < 256; i++) if (header->ord[i] == 255) header->ord[i]--; // we want patterns for (i = 0; i < header->patnum; i++) { if (i == header->ord[2]) { i = header->ord[2]; } mp_sint32 size = f.readWord() - 4; mp_sint32 rows = f.readWord(); if (size < 0 || rows > 256) return -8; phead[i].rows = rows; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)]; #ifdef VERBOSE printf("%i, %x, %i\n", i, f.posWithBaseOffset(), phead[i].rows); #endif // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)); if (size) { mp_ubyte* packed = new mp_ubyte[size]; f.read(packed, 1, size); mp_sint32 index = 0; mp_uint32 row = 0; while (index= 0xa0) { #ifdef VERBOSE printf("blabla"); #endif note = XModule::NOTE_OFF; } else { note = ((slot[0]>>4)*12+(slot[0]&0x0f))+1; } } slot[0] = note; convertEffect(slot[2], slot[3]); convertEffect(slot[4], slot[5]); memcpy(phead[i].patternData + o, slot, sizeof(slot)); } } delete[] packed; } } mp_sint32 vEnvIdx = 0; mp_sint32 pEnvIdx = 0; // i think pitch envelope is pretty much AMS vibrato envelope => no it's not :( //mp_sint32 vibEnvIdx = 0; mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { IMFInstrument ins; f.read(ins.name, 1, 32); f.read(ins.snum, 1, 120); f.readDword(); f.readDword(); f.readWords(ins.volenv, 16*2); f.readWords(ins.panenv, 16*2); f.readWords(ins.pitenv, 16*2); ins.volpts = f.readByte(); ins.volsus = f.readByte(); ins.volbeg = f.readByte(); ins.volend = f.readByte(); ins.volflg = f.readByte(); f.readByte(); f.readByte(); f.readByte(); ins.panpts = f.readByte(); ins.pansus = f.readByte(); ins.panbeg = f.readByte(); ins.panend = f.readByte(); ins.panflg = f.readByte(); f.readByte(); f.readByte(); f.readByte(); ins.pitpts = f.readByte(); ins.pitsus = f.readByte(); ins.pitbeg = f.readByte(); ins.pitend = f.readByte(); ins.pitflg = f.readByte(); f.readByte(); f.readByte(); f.readByte(); ins.volfade = f.readWord(); ins.numsmp = f.readWord(); f.read(ins.signature, 1, 4); instr[i].samp = ins.numsmp; for (j = 0; j < 120; j++) instr[i].snum[j] = ins.snum[j]+s; memcpy(instr[i].name, ins.name, 32); if (ins.volflg) { vEnvIdx++; TEnvelope venv; memset(&venv,0,sizeof(venv)); for (k = 0; k < 16; k++) { venv.env[k][0] = ins.volenv[k*2]; venv.env[k][1] = ins.volenv[k*2+1] << 2; } venv.num = ins.volpts; venv.sustain = ins.volsus; venv.loops = ins.volbeg; venv.loope = ins.volend; venv.type = ins.volflg; if (!module->addVolumeEnvelope(venv)) return -7; } if (ins.panflg) { pEnvIdx++; TEnvelope penv; memset(&penv,0,sizeof(penv)); for (k = 0; k < 16; k++) { penv.env[k][0] = ins.panenv[k*2]; penv.env[k][1] = ins.panenv[k*2+1]; } penv.num = ins.panpts; penv.sustain = ins.pansus; penv.loops = ins.panbeg; penv.loope = ins.panend; penv.type = ins.panflg; if (!module->addPanningEnvelope(penv)) return -7; } /*if (ins.pitflg) { vibEnvIdx++; TEnvelope vibenv; memset(&vibenv,0,sizeof(vibenv)); for (k = 0; k < 16; k++) { vibenv.env[k][0] = ins.pitenv[k*2]; vibenv.env[k][1] = 256-ins.pitenv[k*2+1]; } vibenv.num = ins.pitpts; vibenv.sustain = ins.pitsus; vibenv.loops = ins.pitbeg; vibenv.loope = ins.pitend; vibenv.type = ins.pitflg + (2<<6); if (!module->addVibratoEnvelope(vibenv)) return -7; } printf("%i\n",ins.pitflg);*/ for (j = 0; j < ins.numsmp; j++) { IMFSample samp; f.read(samp.name, 1, 13); f.readByte(); f.readByte(); f.readByte(); samp.length = f.readDword(); samp.loopstart = f.readDword(); samp.loopend = f.readDword(); samp.samplerate = f.readDword(); samp.volume = f.readByte(); samp.pan = f.readByte(); mp_ubyte buffer[14]; f.read(buffer, 1, 14); samp.flags = f.readByte(); f.read(buffer, 1, 15); memcpy(smp[s].name, samp.name, 13); smp[s].samplen = samp.length; smp[s].loopstart = samp.loopstart; smp[s].looplen = samp.loopend - samp.loopstart; smp[s].vol = XModule::vol64to255(samp.volume); smp[s].flags = 1; smp[s].pan = samp.pan; smp[s].volfade = ins.volfade<<1; if (ins.volflg) smp[s].venvnum = vEnvIdx; if (ins.panflg) smp[s].penvnum = pEnvIdx; /*if (ins.pitflg) smp[s].vibenvnum = vibEnvIdx;*/ XModule::convertc4spd(samp.samplerate, &smp[s].finetune, &smp[s].relnote); if (samp.flags&0x1) smp[s].type = 1; if (samp.flags&0x2) smp[s].type = 2; if (samp.flags&0x8) smp[s].flags |= 2; if (samp.flags&0x4) smp[s].type |= 16; if (smp[s].type & 16) { smp[s].samplen>>=1; smp[s].loopstart>>=1; smp[s].looplen>>=1; } if (module->loadModuleSample(f, s) != 0) return -7; s++; } } strcpy(header->tracker,"Imago Orpheus"); header->volenvnum = vEnvIdx; header->panenvnum = pEnvIdx; //header->vibenvnum = vibEnvIdx; header->smpnum = s; module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderMOD.cpp0000644000175000017500000004726511163403715021516 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderMOD.cpp * MilkyPlay Module Loader: Protracker compatible * MilkyPlay Module Loader: Game Music Creator (very similiar to MOD, kept in here) * MilkyPlay Module Loader: SoundFX (very similiar to MOD, kept in here) */ #include "Loaders.h" // get number of channels of protracker compatible song static mp_sint32 getPTnumchannels(char *id) { struct TModID { const char* ID; mp_sint32 numChannels; }; TModID modIDs[] = { {"M.K.",4},{"M!K!",4},{"FLT4",4},{"FLT8",8},{"OKTA",8},{"OCTA",8},{"FA08",8},{"CD81",8}, {"1CHN",1},{"2CHN",2},{"3CHN",3},{"4CHN",4},{"5CHN",5},{"6CHN",6},{"7CHN",7},{"8CHN",8},{"9CHN",9},{"10CH",10}, {"11CH",11},{"12CH",12},{"13CH",13},{"14CH",14},{"15CH",15},{"16CH",16},{"17CH",17},{"18CH",18},{"19CH",19},{"20CH",20}, {"21CH",21},{"22CH",22},{"23CH",23},{"24CH",24},{"25CH",25},{"26CH",26},{"27CH",27},{"28CH",28},{"29CH",29},{"30CH",30},{"31CH",31},{"32CH",32} }; mp_sint32 *id1 = (mp_sint32*)id; for (mp_uint32 x=0;x>8)+((x&255)<<8); } const char* LoaderMOD::identifyModule(const mp_ubyte* buffer) { // check for .MOD if (getPTnumchannels((char*)buffer+1080)) { return "MOD"; } mp_sint32 i,j; mp_ubyte* uBuffer = (mp_ubyte*)buffer; // see if we're getting a song title for (i = 0; i < 20; i++) if (uBuffer[i] >= 126 || (uBuffer[i] < 32 && uBuffer[i])) return NULL; uBuffer+=20; mp_sint32 lastAsciiValues = -1; for (j = 0; j < 15; j++) { if (uBuffer[24]) break; if (uBuffer[25] > 64) break; bool ascii = true; for (i = 0; i < 22; i++) { if (uBuffer[i] >= 126 || (uBuffer[i] < 14 && uBuffer[i])) { ascii = false; break; } } if (ascii) lastAsciiValues = j; else break; uBuffer+=30; } if (lastAsciiValues != 14) return NULL; if (!*uBuffer || *uBuffer > 128) return NULL; *uBuffer+=2; for (i = 0; i < 128; i++) if (uBuffer[i] > 128) return NULL; return "M15"; } mp_sint32 LoaderMOD::load(XMFileBase& f, XModule* module) { enum ModuleTypes { ModuleTypeUnknown, ModuleTypeIns31, ModuleTypeIns15 }; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; char block[2048]; f.read(block, 1, 2048); const char* id = identifyModule((mp_ubyte*)block); if (!id) return -8; ModuleTypes moduleType = ModuleTypeUnknown; if (strcmp(id, "M15") == 0) moduleType = ModuleTypeIns15; else if (strcmp(id, "MOD") == 0) moduleType = ModuleTypeIns31; if (moduleType == ModuleTypeUnknown) return -8; f.seekWithBaseOffset(0); f.read(&header->name,1,20); switch (moduleType) { case ModuleTypeIns15: header->insnum = 15; break; case ModuleTypeIns31: header->insnum = 31; break; default: return -8; } #ifdef VERBOSE printf("Loading...\n"); #endif mp_sint32 i, s = 0; for (i = 0; i < header->insnum; i++) { mp_ubyte insname[22]; mp_uword smplen=0; mp_ubyte finetune=0; mp_ubyte vol=0; mp_uword loopstart=0; mp_uword looplen=0; f.read(&insname,1,22); smplen = f.readWord(); f.read(&finetune,1,1); f.read(&vol,1,1); loopstart = f.readWord(); looplen = f.readWord(); #ifdef VERBOSE printf("Ins %i, smplen: %i, loopstart: %i, looplen: %i\n", i, mot2int(smplen), mot2int(loopstart), mot2int(looplen)); #endif memcpy(instr[i].name, insname, 22); // valid sample? if ((mot2int(smplen)<<1) > 2) { TXMSample* smp = &module->smp[s]; memcpy(smp->name, insname, 22); instr[i].samp=1; for (mp_sint32 j=0;j<120;j++) instr[i].snum[j] = s; smp->finetune = XModule::modfinetunes[finetune & 15]; smp->relnote = 0; //module->convertc4spd(module->sfinetunes[finetune],&smp->finetune,&smp->relnote); smp->flags=1; smp->samplen=mot2int(smplen)<<1; smp->loopstart=mot2int(loopstart)<<1; smp->looplen=mot2int(looplen)<<1; smp->vol=XModule::vol64to255(vol); if (smp->samplen<=2) { smp->samplen=0; instr[s].samp=0; } if ((smp->loopstart+smp->looplen)>smp->samplen) { // first correct loop start mp_sint32 dx = (smp->loopstart+smp->looplen)-smp->samplen; smp->loopstart-=dx; // still incorrect? => correct loop length if ((smp->loopstart+smp->looplen)>smp->samplen) { dx = (smp->loopstart+smp->looplen)-smp->samplen; smp->looplen-=dx; } } if (smp->loopstart<2 && smp->looplen>2) { if (smp->looplen < smp->samplen) // smp->loopstart=0; smp->type |= 32; #ifdef VERBOSE printf("Contains one shot samples %i...\n", s); #endif } if (smp->looplen<=2) smp->looplen=0; else { /*if (smp->loopstart > 2) { smp->loopstart -=2; smp->looplen+=2; }*/ smp->type|=1; } smp->pan=0x80; s++; } //ins[i].c4spd=sfinetunes[ins[i].finetune]; } header->smpnum = s; header->ordnum = f.readByte(); f.read(&header->whythis1a,1,1); f.read(&header->ord,1,128); if (moduleType == ModuleTypeIns31) f.read(header->sig,1,4); if ((memcmp(header->sig+2,"CH",2) != 0 && memcmp(header->sig+1,"CHN",3) != 0) || moduleType == ModuleTypeIns15) header->flags = XModule::MODULE_PTNEWINSTRUMENT; header->patnum=0; for (i=0;i<128;i++) if (header->ord[i]>header->patnum) header->patnum=header->ord[i]; header->patnum++; //patterns = new mp_ubyte*[modhead.numpatts]; if (moduleType == ModuleTypeIns31) header->channum = getPTnumchannels((char*)&header->sig); else if (moduleType == ModuleTypeIns15) header->channum = 4; if (!header->channum) { return -8; } //mp_sint32 patternsize = modhead.numchannels*modhead.numrows*5; mp_sint32 modpatternsize = header->channum*64*4; mp_ubyte *buffer = new mp_ubyte[modpatternsize]; if (buffer == NULL) { return -7; } for (i=0;ipatnum;i++) { f.read(buffer,1,modpatternsize); phead[i].rows=64; phead[i].effnum=1; phead[i].channum=(mp_ubyte)header->channum; phead[i].patternData=new mp_ubyte[phead[i].rows*header->channum*4]; // out of memory? if (phead[i].patternData == NULL) { delete[] buffer; return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum*4); mp_sint32 r,c,cnt=0; for (r=0;r<64;r++) { for (c=0;cchannum;c++) { mp_ubyte b1 = buffer[cnt]; mp_ubyte b2 = buffer[cnt+1]; mp_ubyte b3 = buffer[cnt+2]; mp_ubyte b4 = buffer[cnt+3]; mp_sint32 note,ins,eff,notenum = 0; note = ((b1&0xf)<<8)+b2; ins = (b1&0xf0)+(b3>>4); eff = b3&0xf; if (eff==0xE) { eff=(b4>>4)+0x30; b4&=0xf; } if ((!eff)&&b4) eff=0x20; // old style modules don't support last effect for: // - portamento up/down // - volume slide if (eff==0x1&&(!b4)) eff = 0; if (eff==0x2&&(!b4)) eff = 0; if (eff==0xA&&(!b4)) eff = 0; if (eff==0x5&&(!b4)) eff = 0x3; if (eff==0x6&&(!b4)) eff = 0x4; if (eff==0xC) { b4 = XModule::vol64to255(b4); } if (note) notenum = XModule::amigaPeriodToNote(note); phead[i].patternData[cnt]=notenum; phead[i].patternData[cnt+1]=ins; phead[i].patternData[cnt+2]=eff; phead[i].patternData[cnt+3]=b4; cnt+=4; } } } delete[] buffer; for (i=0; i < header->smpnum; i++) { // Take a peek of the sample and check if we have to do some nasty MODPLUG ADPCM decompression bool adpcm = false; if (f.posWithBaseOffset() + 5 <= f.sizeWithBaseOffset()) { f.read(block, 1, 5); adpcm = memcmp(block, "ADPCM", 5) == 0; if (!adpcm) f.seekWithBaseOffset(f.posWithBaseOffset() - 5); } if (module->loadModuleSample(f, i, adpcm ? XModule::ST_PACKING_ADPCM : XModule::ST_DEFAULT) != 0) return -7; } header->speed=125; header->tempo=6; header->mainvol=255; //header->freqtab=1; if (moduleType == ModuleTypeIns15) strcpy(header->tracker,"Soundtracker"); else strcpy(header->tracker,"Protracker"); module->postLoadAnalyser(); // Amiga panning LRRL for (i = 0; i < header->channum; i++) { switch (i & 3) { case 0: case 3: header->pan[i] = 0; break; case 1: case 2: header->pan[i] = 255; break; } } module->postProcessSamples(); #ifdef VERBOSE printf("%i / %i\n", f.pos(), f.size()); #endif return 0; } const char* LoaderGMC::identifyModule(const mp_ubyte* buffer) { mp_sint32 i = 0; // check instrument volume for value from 0x00 to 0x40 const mp_ubyte* ptr = buffer + 7; bool ok = true; for (i = 0; i < 15 && ok; i++) { if (*ptr > 0x40) ok = false; ptr+=16; } if (!ok) return NULL; // Those 3 bytes should all be zero if (buffer[0xF0] || buffer[0xF1] || buffer[0xF2]) return NULL; // this should not be zero if (!buffer[0xF3]) return NULL; ptr = buffer + 0xF4; ok = true; // check orders to be divisible by 0x400 for (i = 0; i < *(buffer + 0xF3) && ok; i++) { if (BigEndian::GET_WORD(ptr) & 0x3ff) ok = false; ptr+=2; } if (!ok) return NULL; return "GMC"; } mp_sint32 LoaderGMC::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_sint32 i,j,k; // read GMC instruments, always 15 header->insnum = 15; // channels always 4 header->channum = 4; j = 0; for (i = 0; i < header->insnum; i++) { // Ignore DWORD (probably some address) f.readDword(); mp_uint32 samplen = mot2int(f.readWord()) << 1; mp_ubyte finetune = f.readByte(); mp_ubyte vol = f.readByte(); // Ignore DWORD (probably some address) f.readDword(); mp_sint32 looplen = mot2int(f.readWord()) << 1; mp_sint32 loopstart = mot2int(f.readWord()) << 1; mp_sint32 newloopstart = samplen - looplen; mp_sint32 newloopend = samplen - loopstart; if (looplen > 4) { loopstart = newloopstart; looplen = newloopend - loopstart; } // valid sample? if (samplen) { TXMSample* smp = &module->smp[j]; instr[i].samp=1; for (k = 0; k < 120; k++) instr[i].snum[k] = j; smp->finetune = XModule::modfinetunes[finetune & 15]; smp->relnote = 0; smp->flags = 1; smp->samplen = samplen; smp->loopstart = loopstart; smp->looplen = looplen; smp->vol = XModule::vol64to255(vol); if (smp->samplen <= 4) { smp->samplen = 0; instr[i].samp = 0; } if (smp->looplen <= 4) smp->looplen = 0; else { smp->type|=1; } smp->pan = 0x80; j++; } } header->smpnum = j; // skip something f.readByte(); f.readByte(); f.readByte(); header->ordnum = f.readByte(); mp_uword ord[100]; f.readWords(ord, 100); mp_sint32 patnum = 0; for (i = 0; i < 100; i++) { header->ord[i] = mot2int(ord[i]) >> 10; if (header->ord[i] > patnum) patnum = header->ord[i]; } header->patnum = patnum+1; mp_sint32 modpatternsize = header->channum*64*4; mp_ubyte *buffer = new mp_ubyte[modpatternsize]; if (buffer == NULL) { return -7; } for ( i = 0; i < header->patnum; i++) { f.read(buffer, 1, modpatternsize); phead[i].rows = 64; phead[i].effnum = 1; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*4]; // out of memory? if (phead[i].patternData == NULL) { delete[] buffer; return -7; } memset(phead[i].patternData, 0, phead[i].rows*header->channum*4); mp_sint32 r,c,cnt=0; for (r = 0; r < 64; r++) { for ( c = 0; c < header->channum; c++) { mp_ubyte b1 = buffer[cnt]; mp_ubyte b2 = buffer[cnt+1]; mp_ubyte b3 = buffer[cnt+2]; mp_ubyte b4 = buffer[cnt+3]; mp_sint32 note,ins,eff,notenum = 0; note = ((b1&0xf)<<8)+b2; ins = (b1&0xf0)+(b3>>4); eff = b3&0xf; switch (eff) { case 0x01: case 0x02: break; case 0x03: eff = 0x0C; b4 = XModule::vol64to255(b4); break; case 0x04: eff = 0x0D; break; case 0x05: eff = 0x0B; break; case 0x08: eff = 0x0F; break; default: eff = b4 = 0; } if (note) notenum = XModule::amigaPeriodToNote(note); phead[i].patternData[cnt] = notenum; phead[i].patternData[cnt+1] = ins; phead[i].patternData[cnt+2] = eff; phead[i].patternData[cnt+3] = b4; cnt+=4; } } } delete[] buffer; if (module->loadModuleSamples(f) != 0) return -7; header->speed = 125; header->tempo = 6; header->mainvol = 255; // Amiga panning LRRL for (i = 0; i < header->channum; i++) { switch (i & 3) { case 0: case 3: header->pan[i] = 0; break; case 1: case 2: header->pan[i] = 255; break; } } module->postProcessSamples(); strcpy(header->tracker,"Game Music Creator"); return 0; } const char* LoaderSFX::identifyModule(const mp_ubyte* buffer) { // check for .SFX module if (!memcmp(buffer+60,"SONG",4)) { // Check if first 15 big endian DWORDS contain valid sample sizes for (mp_sint32 i = 0; i < 15; i++) if (BigEndian::GET_DWORD(buffer+i*4) > 65536*2) return NULL; return "SFX"; } return NULL; } mp_sint32 LoaderSFX::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_sint32 i,j,k; // read SoundFX instruments, always 15 header->insnum = header->smpnum = 15; // channels always 4 header->channum = 4; mp_dword sampSizeTab[15]; for (i = 0; i < header->smpnum; i++) { mp_ubyte temp[4]; f.read(temp, 1, 4); sampSizeTab[i] = BigEndian::GET_DWORD(temp); } // read signature f.read(header->sig, 1, 4); mp_sint32 delayValue = mot2int(f.readWord()); // skip 14 bytes garbage f.readDword(); f.readDword(); f.readDword(); f.readWord(); header->speed = 122 * 14565 / delayValue; header->tempo = 6; header->mainvol = 255; j = 0; for (i = 0; i < header->insnum; i++) { f.read(instr[i].name, 1, 22); mp_uint32 samplen = mot2int(f.readWord()) << 1; samplen = sampSizeTab[i]; mp_ubyte finetune = f.readByte(); mp_ubyte vol = f.readByte(); mp_sint32 loopstart = mot2int(f.readWord()); mp_sint32 looplen = mot2int(f.readWord()) << 1; // valid sample? if (samplen > 4) { TXMSample* smp = &module->smp[j]; instr[i].samp=1; for (k = 0; k < 120; k++) instr[i].snum[k] = j; smp->finetune = XModule::modfinetunes[finetune & 15]; smp->relnote = 0; smp->flags = 1; smp->samplen = samplen; smp->loopstart = loopstart; smp->looplen = looplen; smp->vol = XModule::vol64to255((mp_sint32)vol*64/63); if (smp->samplen <= 4) { smp->samplen = 0; instr[i].samp = 0; } if (smp->looplen <= 4) smp->looplen = 0; else { smp->type|=1; } smp->pan = 0x80; j++; } } header->smpnum = j; header->ordnum = f.readByte(); header->restart = f.readByte(); f.read(&header->ord, 1, 128); header->patnum = 0; for (i = 0; i < 128; i++) if (header->ord[i] > header->patnum) header->patnum = header->ord[i]; header->patnum++; mp_sint32 modpatternsize = header->channum*64*4; mp_ubyte *buffer = new mp_ubyte[modpatternsize]; if (buffer == NULL) { return -7; } for ( i = 0; i < header->patnum; i++) { f.read(buffer, 1, modpatternsize); phead[i].rows = 64; phead[i].effnum = 1; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*4]; // out of memory? if (phead[i].patternData == NULL) { delete[] buffer; return -7; } memset(phead[i].patternData, 0, phead[i].rows*header->channum*4); mp_sint32 r,c,cnt=0; for (r = 0; r < 64; r++) { for ( c = 0; c < header->channum; c++) { mp_ubyte b1 = buffer[cnt]; mp_ubyte b2 = buffer[cnt+1]; mp_ubyte b3 = buffer[cnt+2]; mp_ubyte b4 = buffer[cnt+3]; mp_sint32 note,ins,eff,notenum = 0; note = ((b1&0xf)<<8)+b2; ins = (b1&0xf0)+(b3>>4); eff = b3&0xf; if (b1 == 0xFF && b2 >= 0xFC) { if (b2 == 0xFE) { note = notenum = ins = 0; eff = 0x0C; b4 = 0; } else if (b2 == 0xFD) { ins = eff = b4 = 0; } else if (b2 == 0xFC) { note = notenum = 0; } } else { switch (eff) { // arpeggio? case 0x01: if (b4) eff = 0x20; break; // pitch bend? case 0x02: // portamento up if (b4 & 0xf) eff = 0x01; // porta down else if (b4 >> 4) { eff = 0x02; b4>>=4; } break; // add something to the volume? case 0x05: eff = 0x3A; break; // set volume case 0x06: eff = 0x0C; b4 = 255-XModule::vol64to255(b4); break; // portamento again? case 0x07: eff = 0x01; break; // portamento again? case 0x08: eff = 0x02; break; default: eff = b4 = 0; } } if (note) notenum = XModule::amigaPeriodToNote(note); phead[i].patternData[cnt] = notenum; phead[i].patternData[cnt+1] = ins; phead[i].patternData[cnt+2] = eff; phead[i].patternData[cnt+3] = b4; cnt+=4; } } } delete[] buffer; if (module->loadModuleSamples(f) != 0) return -7; // Amiga panning LRRL for (i = 0; i < header->channum; i++) { switch (i & 3) { case 0: case 3: header->pan[i] = 0; break; case 1: case 2: header->pan[i] = 255; break; } } module->postProcessSamples(); strcpy(header->tracker,"SoundFX"); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/ResamplerFactory.h0000644000175000017500000000355611163403715022672 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ResamplerFactory.h * MilkyPlay * * Created by Peter Barth on 08.11.07. * */ #ifndef __RESAMPLERFACTORY_H__ #define __RESAMPLERFACTORY_H__ #include "ChannelMixer.h" class ResamplerFactory : public MixerSettings { public: static ChannelMixer::ResamplerBase* createResampler(ResamplerTypes type); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderAbstract.h0000644000175000017500000000506111163403715023435 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderAbstract.h * MilkyPlay * * Created by Peter Barth on 14.09.05. * */ #ifndef SAMPLELOADERABSTRACT__H #define SAMPLELOADERABSTRACT__H #include "XMFile.h" class XModule; struct TXMSample; class SampleLoaderAbstract { private: static const char* emptyChannelName; protected: XModule& theModule; const SYSCHAR* theFileName; const char* preferredDefaultName; void nameToSample(const char* name, TXMSample* smp); public: SampleLoaderAbstract(const SYSCHAR* fileName, XModule& module); virtual ~SampleLoaderAbstract() {} virtual bool identifySample() = 0; virtual mp_sint32 getNumChannels() { return 1; } virtual const char* getChannelName(mp_sint32 channelIndex) { return emptyChannelName; } virtual mp_sint32 loadSample(mp_sint32 index, mp_sint32 channelIndex) = 0; virtual mp_sint32 saveSample(const SYSCHAR* fileName, mp_sint32) { return 0; } void setPreferredDefaultName(const char* preferredDefaultName) { this->preferredDefaultName = preferredDefaultName; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderOKT.cpp0000644000175000017500000002140611163403715021521 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderOKT.cpp * MilkyPlay Module Loader: Oktalyzer * */ #include "Loaders.h" const char* LoaderOKT::identifyModule(const mp_ubyte* buffer) { // check for .OKT module if (!memcmp(buffer,"OKTASONG",8)) { return "OKT"; } return NULL; } static void convertOKTEffects(mp_ubyte& eff, mp_ubyte& op) { switch (eff) { case 00: op = 0; break; case 01: // porta down eff = 0x02; break; case 02: // porta up eff = 0x01; break; case 10: // arpeggio I case 11: // arpeggio II case 12: // arpeggio III eff = (eff-10)+0x56; break; case 13: // note slide down eff = 0x54; break; case 17: // note slide up eff = 0x55; break; case 21: // fine note slide down eff = 0x54; break; case 25: // position jump eff = 0x0B; break; case 30: // fine note slide up eff = 0x55; break; case 27: // play release part eff = 0x4F; op = 3; break; case 28: // set speed eff = 0x0f; break; case 31: // volume stuff { if (op <= 0x40) { eff = 0x0c; op = XModule::vol64to255(op); } else if (op > 0x40 && op <= 0x50) // volslide down { eff = 0x0A; op = (op-0x40); } else if (op > 0x50 && op <= 0x60) // volslide up { eff = 0x0A; op = (op-0x50) << 4; } else if (op > 0x60 && op <= 0x70) // fine volslide down { eff = 0x3B; op = (op-0x60); } else if (op > 0x70 && op <= 0x80) // fine volslide up { eff = 0x3A; op = (op-0x70); } else { #ifdef VERBOSE printf("Unsupported Oktalyzer effect: %i/%i\n", eff, op); #endif eff = op = 0; } break; } default: #ifdef VERBOSE printf("Unsupported Oktalyzer effect: %i/%i\n", eff, op); #endif eff = op = 0; } } mp_sint32 LoaderOKT::load(XMFileBase& f, XModule* module) { // max pattern size mp_ubyte buffer[8192]; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(header->sig, 1, 8); header->speed = 125; header->tempo = 6; header->mainvol = 255; mp_sint32 pc = 0; mp_sint32 sc = 0; while (true) { mp_ubyte ID[4]; mp_uint32 bytesRead = f.read(&ID, 4, 1); if (bytesRead != 4) break; switch (BigEndian::GET_DWORD(ID)) { case 0x434D4F44: // 'CMOD' { f.read(buffer, 4, 1); if (BigEndian::GET_DWORD(buffer) != 8) return -8; for (mp_sint32 i = 0; i < 4; i++) { f.read(buffer, 2, 1); if (!BigEndian::GET_WORD(buffer)) header->channum++; else header->channum+=2; } break; } case 0x53414D50: // 'SAMP' { f.read(buffer, 4, 1); header->insnum = BigEndian::GET_DWORD(buffer) / 32; mp_sint32 s = 0; for (mp_sint32 i = 0; i < header->insnum; i++) { f.read(buffer, 1, 32); memcpy(instr[i].name, buffer, 20); if (BigEndian::GET_DWORD(buffer+20)) { instr[i].samp = 1; memcpy(smp[s].name, buffer, 20); smp[s].samplen = BigEndian::GET_DWORD(buffer+20); smp[s].loopstart = BigEndian::GET_WORD(buffer+24) << 1; smp[s].looplen = BigEndian::GET_WORD(buffer+26) << 1; smp[s].vol = XModule::vol64to255(BigEndian::GET_WORD(buffer+29)); smp[s].flags = 1; if (smp[s].looplen > 2) smp[s].type = 1; for (mp_sint32 j = 0; j < 120; j++) instr[i].snum[j] = s; s++; } header->smpnum = s; } break; } case 0x53504545: // 'SPEE' { f.read(buffer, 4, 1); if (BigEndian::GET_DWORD(buffer) != 2) return -8; f.read(buffer, 2, 1); header->tempo = BigEndian::GET_WORD(buffer); break; } case 0x534C454E: // 'SLEN' { f.read(buffer, 4, 1); if (BigEndian::GET_DWORD(buffer) != 2) return -8; f.read(buffer, 2, 1); header->patnum = BigEndian::GET_WORD(buffer); break; } case 0x504C454E: // 'PLEN' { f.read(buffer, 4, 1); if (BigEndian::GET_DWORD(buffer) != 2) return -8; f.read(buffer, 2, 1); header->ordnum = BigEndian::GET_WORD(buffer); break; } case 0x50415454: // 'PATT' { f.read(buffer, 4, 1); if (BigEndian::GET_DWORD(buffer) > 256) return -8; f.read(header->ord, 1, BigEndian::GET_DWORD(buffer)); break; } case 0x50424F44 : // 'PBOD' { f.read(buffer, 4, 1); mp_sint32 chunkLen = BigEndian::GET_DWORD(buffer); mp_sint32 i = pc; if (chunkLen) { f.read(buffer, 1, chunkLen); phead[i].rows = BigEndian::GET_WORD(buffer); phead[i].effnum = 1; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)]; // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)); mp_ubyte* pattern = buffer+2; mp_sint32 r,c,cnt = 0; mp_sint32 offs = 0; for (r = 0; r < phead[i].rows; r++) { for (c = 0; c < header->channum;c++) { mp_ubyte note = pattern[cnt]; if (note) note+=12*3; mp_ubyte ins = pattern[cnt+1]; if (note) ins++; else ins = 0; mp_ubyte eff = pattern[cnt+2]; mp_ubyte op = pattern[cnt+3]; convertOKTEffects(eff, op); #ifdef VERBOSE if (pattern[cnt+2] && !eff) { printf("Pattern: %i, %i, %i\n", i, c, r); } #endif phead[i].patternData[offs] = note; phead[i].patternData[offs+1] = ins; phead[i].patternData[offs+2] = eff; phead[i].patternData[offs+3] = op; offs+=(phead[i].effnum * 2 + 2); cnt+=4; } } } else // empty pattern { phead[i].rows = 64; phead[i].effnum = 1; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)]; // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)); } pc++; break; } case 0x53424F44 : // 'SBOD' { f.read(buffer, 4, 1); mp_sint32 sampLen = BigEndian::GET_DWORD(buffer); mp_uint32 allocMem = sampLen; if (smp[sc].samplen > allocMem) allocMem = smp[sc].samplen; smp[sc].sample = (mp_sbyte*)module->allocSampleMem(allocMem); memset(smp[sc].sample, 0, allocMem); if (smp[sc].sample == NULL) { return -7; } if (!module->loadSample(f,smp[sc].sample,sampLen,sampLen)) { return -7; } sc++; } } } strcpy(header->tracker,"Oktalyzer"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/ChannelMixer.h0000644000175000017500000004034511163403715021762 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ChannelMixer.h * MilkyPlay * * Created by Peter Barth on Tue Oct 19 2004. * * This class is pretty much emulating a Gravis Ultrasound with a timer set to 250Hz * i.e. mixerHandler() will call a timer routine 250 times per second while mixing * the audio stream in between. */ #ifndef __CHANNELMIXER_H__ #define __CHANNELMIXER_H__ #include "MilkyPlayCommon.h" #include "AudioDriverBase.h" #include "Mixable.h" #define MP_FP_CEIL(x) (((x)+65535)>>16) #define MP_FP_MUL(a, b) ((mp_sint32)(((mp_int64)(a)*(mp_int64)(b))>>16)) #define MP_INCREASESMPPOS(intpart, fracpart, fp, fractbits) \ intpart+=((fp)>>(fractbits)); \ fracpart+=((fp)&(1<<(fractbits))-1); \ if (((fracpart)>>(fractbits))==1) \ { \ intpart++; \ fracpart&=(1<<(fractbits))-1; \ } class ChannelMixer; typedef void (ChannelMixer::*TSetFreq)(mp_sint32 c, mp_sint32 f); class MixerSettings { protected: enum { NUMRESAMPLERTYPES = 21, }; public: // These are arranged in a way, so that the ramping flag toggles with the // LSB (bit 0) if you count through them enum ResamplerTypes { MIXER_NORMAL, MIXER_NORMAL_RAMPING, MIXER_LERPING, MIXER_LERPING_RAMPING, MIXER_LAGRANGE, MIXER_LAGRANGE_RAMPING, MIXER_SPLINE, MIXER_SPLINE_RAMPING, MIXER_SINCTABLE, MIXER_SINCTABLE_RAMPING, MIXER_SINC, MIXER_SINC_RAMPING, MIXER_AMIGA500, MIXER_AMIGA500_RAMPING, MIXER_AMIGA500LED, MIXER_AMIGA500LED_RAMPING, MIXER_AMIGA1200, MIXER_AMIGA1200_RAMPING, MIXER_AMIGA1200LED, MIXER_AMIGA1200LED_RAMPING, MIXER_DUMMY, MIXER_INVALID }; enum { // pretty large buffer for most systems BUFFERSIZE_DEFAULT = 8192 }; }; class ChannelMixer : public MixerSettings, public Mixable { public: enum { // This is the basis for timing & mixing // 250hz timer MP_TIMERFREQ = 250, MP_BASEFREQ = 48000, // is chosen because (48000 % 250) == 0 // period in samples for MP_TIMERFREQ MP_BEATLENGTH = (MP_BASEFREQ/MP_TIMERFREQ), // mixer state flags MP_SAMPLE_FILTERLP = 65536, MP_SAMPLE_MUTE = 32768, MP_SAMPLE_ONESHOT = 8192, MP_SAMPLE_FADEOFF = 4096, MP_SAMPLE_FADEOUT = 2048, MP_SAMPLE_FADEIN = 1024, MP_SAMPLE_PLAY = 256, MP_SAMPLE_BACKWARD = 128, MP_INVALID_VALUE = 0x7FFFFFFF, MP_FILTERPRECISION = 8 }; static inline mp_sint32 fixedmul(mp_sint32 a,mp_sint32 b) { return MP_FP_MUL(a,b); } static inline mp_sint32 fixeddiv(mp_sint32 a,mp_sint32 b) { return ((mp_sint32)(((mp_int64)(a)*65536/(mp_int64)(b)))); } // this is a subset of the channel state which is stored along // with the time progress, so you can do a look up of the state // even with large buffer sizes struct TTimeRecord { mp_uint32 flags; // bit 8 = sample played // bit 9 = sample direction (0 = forward, 1 = backward) // bit 10-11 = sample ticker used to represent ramping states // bit 12 = scheduled to stop // bit 13 = one shot looping // bit 15 = mute channel const mp_sbyte* sample; // pointer to sample mp_sint32 smppos; // 32 bit integer part of sample position mp_sint32 volPan; // 32 bits, upper 16 bits = pan, lower 16 bits = vol mp_sint32 smplen; mp_sint32 smpposfrac; // 16 bit fractional part of sample position mp_sint32 smpadd; // 16:16 fixedpoint increment mp_sint32 loopend; mp_sint32 loopstart; mp_sint32 fixedtime; // for amiga resampler (running time) mp_sint32 fixedtimefrac; // for sinc/amiga resamplers (running time fraction) TTimeRecord() : flags(0), sample(NULL), smppos(0), volPan(0), smplen(0), smpposfrac(0), smpadd(0), loopend(0), loopstart(0), fixedtime(0), fixedtimefrac(0) { } }; struct TMixerChannel { mp_uint32 flags; // bit 8 = sample played // bit 9 = sample direction (0 = forward, 1 = backward) // bit 10-11 = sample ticker used to represent ramping states // bit 12 = scheduled to stop // bit 13 = one shot looping // bit 15 = mute channel const mp_sbyte* sample; // pointer to sample mp_sint32 smplen; mp_sint32 smppos; // 32 bit integer part of sample position mp_sint32 smpposfrac; // 16 bit fractional part of sample position mp_sint32 smpadd; // 16:16 fixed point increment mp_sint32 rsmpadd; // fixed point reciprocal of the increment mp_sint32 loopend; // loop end mp_sint32 loopendcopy; // Temporary placeholder for one-shot looping mp_sint32 loopstart; // loop start mp_sint32 finalvolr; mp_sint32 finalvoll; mp_sint32 vol; mp_sint32 pan; mp_sint32 rampFromVolStepR; mp_sint32 rampFromVolStepL; mp_sint32 a,b,c; // Filter coefficients mp_sint32 currsample; // sample history for filtering mp_sint32 prevsample; // see above mp_sint32 cutoff; mp_sint32 resonance; mp_sint32 fixedtime; // for amiga resampler (running time) mp_sint32 fixedtimefrac; // for sinc/amiga resamplers (running time fraction) mp_uint32 timeRecordSize; TTimeRecord* timeRecord; mp_sint32 index; // For Amiga resampler TMixerChannel() : timeRecordSize(0), timeRecord(NULL) { clear(); } TMixerChannel(bool fastContruction) : timeRecordSize(0), timeRecord(NULL) { } ~TMixerChannel() { if (timeRecord) delete[] timeRecord; } void clear() { flags = 0; sample = NULL; smplen = 0; smppos = 0; smpposfrac = 0; smpadd = 0; rsmpadd = 0; loopend = 0; loopendcopy = 0; loopstart = 0; finalvolr = 0; finalvoll = 0; vol = 0; pan = 128; rampFromVolStepR = 0; rampFromVolStepL = 0; a = b = c = 0; currsample = 0; prevsample = 0; cutoff = MP_INVALID_VALUE; resonance = MP_INVALID_VALUE; fixedtime = 0; fixedtimefrac = 0; index = -1; // is filled during runtime if (timeRecord) memset(timeRecord, 0, sizeof(TTimeRecord) * timeRecordSize); } void reallocTimeRecord(mp_uint32 size) { delete[] timeRecord; timeRecordSize = size; timeRecord = new TTimeRecord[size]; } }; class ResamplerBase { private: // add channels without volume ramping void addChannelsNormal(ChannelMixer* mixer, mp_uint32 numChannels, mp_sint32* buffer32,mp_sint32 beatNum, mp_sint32 beatlength); // add channels with volume ramping void addChannelsRamping(ChannelMixer* mixer, mp_uint32 numChannels, mp_sint32* buffer32,mp_sint32 beatNum, mp_sint32 beatlength); public: virtual ~ResamplerBase() { } void addChannels(ChannelMixer* mixer, mp_uint32 numChannels, mp_sint32* buffer32,mp_sint32 beatNum, mp_sint32 beatlength); void addChannel(TMixerChannel* chn, mp_sint32* buffer32, const mp_sint32 beatlength, const mp_sint32 beatSize); // walk along the sample // intpart is the 32 bit integer part of the position // fracpart is the fractional part of the position // fp is the amount of samples to advance // is the resolution of the fractional part in bits (default is 16) static inline void advanceSamplePosition(mp_sint32& intpart, mp_sint32& fracpart, const mp_sint32 fp, const mp_sint32 fracbits = 16) { MP_INCREASESMPPOS(intpart, fracpart, fp, fracbits); } // if this resampler is doing ramping virtual bool isRamping() = 0; // this resampler can perform a normal block add to the mixing buffer virtual bool supportsNoChecking() = 0; // optional: if this resampler is able to perform a full checked walk along the sample virtual bool supportsFullChecking() = 0; // see above, you will need to implement at least one of the following virtual void addBlockNoCheck(mp_sint32* buffer, TMixerChannel* chn, mp_uint32 count) { // if this is called your own derived resampler is not properly working ASSERT(false); } // see above for comments virtual void addBlockFull(mp_sint32* buffer, TMixerChannel* chn, mp_uint32 count) { ASSERT(false); } // in case the resampler needs to get hold of the current mixing frequency virtual void setFrequency(mp_sint32 frequency) { } // in case the resampler needs to get hold of the current number of channels virtual void setNumChannels(mp_sint32 num) { } }; friend class ChannelMixer::ResamplerBase; private: mp_uint32 mixerNumAllocatedChannels; // Number of channels to be allocated by mixer mp_uint32 mixerNumActiveChannels; // Number of channels to be mixed mp_uint32 mixerLastNumAllocatedChannels; mp_uint32 mixFrequency; // Mixing frequency mp_uint32 rMixFrequency; // 0x7FFFFFFF/mixFrequency mp_sint32* mixbuffBeatPacket; mp_uint32 mixBufferSize; // this is the resulting buffer size in 16 bit words mp_uint32 beatPacketSize; // size of 1/250 of a second in samples mp_uint32 numBeatPackets; // how many of these fit in our buffer size mp_uint32 lastBeatRemainder; // used while filling the buffer, if the buffer is not an exact multiple of beatPacketSize TMixerChannel* channel; TMixerChannel* newChannel; mp_sint32 masterVolume; // mixer master volume mp_sint32 panningSeparation; // panning separation from 0 (mono) to 256 (full stereo) ResamplerTypes resamplerType; TSetFreq setFreqFuncTable[NUMRESAMPLERTYPES]; // If different precisions are used, use other frequency calculation procedures ResamplerBase* resamplerTable[NUMRESAMPLERTYPES]; bool paused; bool disableMixing; bool allowFilters; void setFrequency(mp_sint32 frequency); void mixBeatPacket(mp_uint32 numChannels, mp_sint32* buffer32, mp_sint32 beatPacketIndex, mp_sint32 beatPacketSize) { resamplerTable[resamplerType]->addChannels(this, numChannels, buffer32, beatPacketIndex, beatPacketSize); } inline void timer(mp_uint32 beatIndex) { timerHandler(beatIndex <= getNumBeatPackets() ? beatIndex : getNumBeatPackets()); } void reallocChannels(); void clearChannels(); public: ChannelMixer(mp_uint32 numChannels, mp_uint32 frequency); virtual ~ChannelMixer(); mp_uint32 getMixBufferSize() const { return mixBufferSize; } void mix(mp_sint32* buffer, mp_uint32 numSamples); void updateSampleCounter(mp_sint32 numSamples) { sampleCounter+=numSamples; } void resetSampleCounter() { sampleCounter=0; } mp_sint32 initDevice(); mp_sint32 closeDevice(); void stop(); mp_sint32 pause(); mp_sint32 resume(); void setDisableMixing(bool disableMixing) { this->disableMixing = disableMixing; } void setAllowFilters(bool allowFilters) { this->allowFilters = allowFilters; } bool getAllowFilters() const { return allowFilters; } void resetChannelsFull(); void resetChannelsWithoutMuting(); void setResamplerType(ResamplerTypes type); ResamplerTypes getResamplerType() const { return resamplerType; } bool isRamping() const { return resamplerTable[resamplerType]->isRamping(); } virtual mp_sint32 adjustFrequency(mp_uint32 frequency); mp_sint32 getMixFrequency() { return mixFrequency; } static mp_sint32 beatPacketsToBufferSize(mp_uint32 mixFrequency, mp_uint32 numBeats); virtual mp_sint32 setBufferSize(mp_uint32 bufferSize); mp_uint32 getBeatPacketSize() const { return beatPacketSize; } mp_uint32 getNumBeatPackets() const { return mixBufferSize / beatPacketSize; } // volume control void setMasterVolume(mp_sint32 vol) { masterVolume = vol; } mp_sint32 getMasterVolume() const { return masterVolume; } // panning control void setPanningSeparation(mp_sint32 separation) { panningSeparation = separation; } mp_sint32 getPanningSeparation() const { return panningSeparation; } bool isInitialized() const { return initialized; } bool isPlaying() const { return startPlay; } mp_sint32 getNumActiveChannels(); mp_sint32 getNumAllocatedChannels() const { return mixerNumActiveChannels; } mp_int64 getSampleCounter() const { return sampleCounter; } mp_sint32 getBeatIndexFromSamplePos(mp_uint32 smpPos) const; ResamplerBase* getCurrentResampler() const { return resamplerTable[resamplerType]; } protected: bool initialized; bool startPlay; mp_int64 sampleCounter; // number of samples played (per song) void startMixer() { lastBeatRemainder = 0; } void setNumChannels(mp_uint32 num); void setActiveChannels(mp_uint32 num); public: void setVol(mp_sint32 c,mp_sint32 v) { channel[c].vol = v; } mp_sint32 getVol(mp_sint32 c) { return channel[c].vol; } void setPan(mp_sint32 c,mp_sint32 p) { channel[c].pan = p; } void setFreq(mp_sint32 c,mp_sint32 f) { (this->*setFreqFuncTable[resamplerType])(c,f); } // Default low precision calculations void setChannelFrequency(mp_sint32 c, mp_sint32 f); void setFilterAttributes(mp_sint32 c, mp_sint32 cutoff, mp_sint32 resonance); void playSample(mp_sint32 c, // channel mp_sbyte* smp, // sample buffer mp_sint32 smplen, // sample size mp_sint32 smpoffs, // sample offset mp_sint32 smpoffsfrac, bool smpOffsetWrap, mp_sint32 lstart, // loop start mp_sint32 len, // loop end mp_sint32 flags, bool ramp = true); bool isChannelPlaying(mp_sint32 c) { return (channel[c].flags&MP_SAMPLE_PLAY) != 0; } void stopSample(mp_sint32 c) { channel[c].flags&=~(MP_SAMPLE_FADEIN|MP_SAMPLE_FADEOUT); channel[c].flags|=MP_SAMPLE_FADEOFF; } void breakLoop(mp_sint32 c) { channel[c].flags&=~3; channel[c].loopend = channel[c].smplen; } // handle with care void setSamplePos(mp_sint32 c, mp_sint32 pos) { channel[c].smppos = pos; channel[c].smpposfrac = 0; } mp_sint32 getSamplePos(mp_sint32 c) { return channel[c].smppos; } mp_sint32 getSamplePosFrac(mp_sint32 c) { return channel[c].smpposfrac; } void setBackward(mp_sint32 c) { if (channel[c].flags & MP_SAMPLE_PLAY) { channel[c].flags |= MP_SAMPLE_BACKWARD; if (channel[c].smppos < channel[c].loopstart) { channel[c].smppos = channel[c].loopend; } } } void setForward(mp_sint32 c) { if (channel[c].flags & MP_SAMPLE_PLAY) { channel[c].flags &= ~MP_SAMPLE_BACKWARD; if (channel[c].smppos > channel[c].loopend) { channel[c].smppos = channel[c].loopstart; } } } void muteChannel(mp_sint32 c, bool m); bool isChannelMuted(mp_sint32 c); mp_uint32 getSyncSampleCounter(); protected: // timer procedure for mixing virtual void timerHandler(mp_sint32 currentBeatPacket) = 0; #ifdef MILKYTRACKER friend class PlayerController; #endif #ifdef __MPTIMETRACKING__ public: void mixData(mp_sint32 c, mp_sint32* buffer, mp_sint32 count, mp_sint32 sampleShift, mp_sint32 fMul = 0, mp_sint32 bufferIndex = -1, mp_sint32 packetIndex = -1) const; #endif }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderAIFF.cpp0000644000175000017500000002276311163403715022742 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderAIFF.cpp * MilkyPlay * * Created by Peter Barth on 07.01.06. * */ #include "SampleLoaderAIFF.h" #include "XMFile.h" #include "XModule.h" #include "LittleEndian.h" const char* SampleLoaderAIFF::channelNames[] = {"Left","Right"}; SampleLoaderAIFF::SampleLoaderAIFF(const SYSCHAR* fileName, XModule& theModule) : SampleLoaderAbstract(fileName, theModule) { } bool SampleLoaderAIFF::identifySample() { return getNumChannels() != 0; } mp_sint32 SampleLoaderAIFF::getNumChannels() { mp_ubyte ID[4], buffer[4]; mp_dword chunkLen; XMFile f(theFileName); f.read(ID, 4, 1); if (memcmp(ID, "FORM", 4) != 0) return 0; f.seek(0); bool hasFORM = false; bool hasFVER = false; bool hasCOMM = false; bool hasSSND = false; mp_sint32 numChannels = 0; while (!(hasFORM && hasFVER && hasCOMM && hasSSND)) { mp_uint32 bytesRead = f.read(ID, 4, 1); if (bytesRead != 4) break; bytesRead = f.read(buffer, 4, 1); if (bytesRead != 4) break; chunkLen = BigEndian::GET_DWORD(buffer); switch (BigEndian::GET_DWORD(ID)) { case 0x464F524D: // 'FORM' { f.read(buffer, 4, 1); if (memcmp(buffer, "AIFC", 4) == 0) hasFORM = true; else if (memcmp(buffer, "AIFF", 4) == 0) hasFORM = hasFVER = true; break; } case 0x46564552 : // 'FVER' { hasFVER = true; mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); break; } case 0x434F4D4D: // 'COMM' { hasCOMM = true; mp_uint32 pos = f.pos(); f.read(buffer, 2, 1); numChannels = BigEndian::GET_WORD(buffer); f.seek(pos + chunkLen); break; } case 0x53534E44 : // 'SSND' { hasSSND = true; mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); break; } default: { mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); } } } return (hasFORM && hasFVER && hasCOMM && hasSSND) ? numChannels : 0; } const char* SampleLoaderAIFF::getChannelName(mp_sint32 channelIndex) { if (channelIndex < 2) return channelNames[channelIndex]; else return SampleLoaderAbstract::getChannelName(channelIndex); } struct AIFC_CommChunk { mp_uword numChannels; //number of channels mp_uint32 numSampleFrames; //number of sample frames mp_uword sampleSize; //number of bits per sample mp_uint32 sampleRate; //number of frames per second mp_uint32 compressionType; //compression type ID AIFC_CommChunk() : numChannels(0), numSampleFrames(0), sampleSize(0), sampleRate(0), compressionType(0) { } }; mp_sint32 SampleLoaderAIFF::loadSample(mp_sint32 index, mp_sint32 channelIndex) { mp_ubyte ID[4], buffer[4]; mp_dword chunkLen; AIFC_CommChunk commChunk; XMFile f(theFileName); f.read(ID, 4, 1); if (memcmp(ID, "FORM", 4) != 0) return -8; f.seek(0); bool hasFORM = false; bool hasFVER = false; bool hasCOMM = false; bool hasSSND = false; bool aifc = false; bool sowt = false; mp_sbyte* sampleData = NULL; mp_sint32 sampleDataLen = 0; while (!(hasFORM && hasFVER && hasCOMM && hasSSND)) { mp_uint32 bytesRead = f.read(ID, 4, 1); if (bytesRead != 4) break; bytesRead = f.read(buffer, 4, 1); if (bytesRead != 4) break; chunkLen = BigEndian::GET_DWORD(buffer); switch (BigEndian::GET_DWORD(ID)) { case 0x464F524D: // 'FORM' { f.read(buffer, 4, 1); if (memcmp(buffer, "AIFC", 4) == 0) { hasFORM = true; aifc = true; } else if (memcmp(buffer, "AIFF", 4) == 0) { hasFORM = hasFVER = true; aifc = false; } break; } case 0x46564552 : // 'FVER' { hasFVER = true; mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); break; } case 0x434F4D4D: // 'COMM' { hasCOMM = true; //mp_uint32 pos = f.pos(); mp_ubyte* temp = new mp_ubyte[chunkLen]; f.read(temp, chunkLen, 1); commChunk.numChannels = BigEndian::GET_WORD(temp); commChunk.numSampleFrames = BigEndian::GET_DWORD(temp+2); commChunk.sampleSize = BigEndian::GET_WORD(temp+6); commChunk.sampleRate = BigEndian::GET_DWORD(temp+10) >> 16; if (aifc) { commChunk.compressionType = BigEndian::GET_DWORD(temp+14); mp_dword compressionName = BigEndian::GET_DWORD(temp+18); sowt = (compressionName == 0x736F7774); } delete[] temp; if ((commChunk.compressionType != 0) && (commChunk.compressionType != 0x4E4F4E45/*NONE*/)) { return -8; } break; } case 0x53534E44 : // 'SSND' { hasSSND = true; sampleDataLen = chunkLen; sampleData = new mp_sbyte[chunkLen]; f.read(sampleData, chunkLen, 1); break; } default: { mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); } } } if (hasFORM && hasFVER && hasCOMM && hasSSND) { if ((commChunk.numChannels >= 1) && (commChunk.numChannels <= 2) && (commChunk.sampleSize == 8 || commChunk.sampleSize == 16)) { sampleDataLen = (commChunk.numChannels * commChunk.numSampleFrames * commChunk.sampleSize) / 8; TXMSample* smp = &theModule.smp[index]; if (smp->sample) { theModule.freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->samplen = ((commChunk.sampleSize == 16) ? sampleDataLen >> 1 : sampleDataLen) / commChunk.numChannels; smp->sample = (mp_sbyte*)theModule.allocSampleMem((commChunk.sampleSize == 16) ? (smp->samplen<<1) : smp->samplen); if (smp->sample == NULL) { if (sampleData) delete[] sampleData; return -7; } if (commChunk.sampleSize == 8) { mp_sbyte* ptr = (mp_sbyte*)smp->sample; mp_sbyte* src = (mp_sbyte*)sampleData; if (commChunk.numChannels == 1) { memcpy(ptr, src, smp->samplen); } else if (commChunk.numChannels == 2) { if (channelIndex == 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) { *ptr = *src; ptr++; src+=2; } } else if (channelIndex == 1) { for (mp_uint32 i = 0; i < smp->samplen; i++) { *ptr = *(src+1); ptr++; src+=2; } } else if (channelIndex == -1) { for (mp_uint32 i = 0; i < smp->samplen; i++) { *ptr = (mp_sbyte)(((mp_sword)(*src) + (mp_sword)(*(src+1))) >> 1); ptr++; src+=2; } } } } else if (commChunk.sampleSize == 16) { mp_uword* ptr = (mp_uword*)smp->sample; mp_ubyte* src = (mp_ubyte*)sampleData; if (commChunk.numChannels == 1) { for (mp_uint32 i = 0; i < smp->samplen; i++) { *ptr = sowt ? LittleEndian::GET_WORD(src) : BigEndian::GET_WORD(src); ptr++; src+=2; } } else if (commChunk.numChannels == 2) { if (channelIndex == 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) { *ptr = sowt ? LittleEndian::GET_WORD(src) : BigEndian::GET_WORD(src); ptr++; src+=4; } } else if (channelIndex == 1) { for (mp_uint32 i = 0; i < smp->samplen; i++) { *ptr = sowt ? LittleEndian::GET_WORD(src+2) : BigEndian::GET_WORD(src+2); ptr++; src+=4; } } else if (channelIndex == -1) { for (mp_uint32 i = 0; i < smp->samplen; i++) { *ptr = sowt ? (mp_sword)(((mp_sint32)((mp_sword)LittleEndian::GET_WORD(src)) + (mp_sint32)((mp_sword)LittleEndian::GET_WORD(src+2))) >> 1) : (mp_sword)(((mp_sint32)((mp_sword)BigEndian::GET_WORD(src)) + (mp_sint32)((mp_sword)BigEndian::GET_WORD(src+2))) >> 1); ptr++; src+=4; } } } } delete[] sampleData; smp->loopstart = 0; smp->looplen = 0; smp->type = 0; if ((commChunk.sampleSize == 16)) smp->type |= 16; nameToSample(preferredDefaultName, smp); XModule::convertc4spd(commChunk.sampleRate, &smp->finetune, &smp->relnote); return 0; } } delete[] sampleData; return -8; } mp_sint32 SampleLoaderAIFF::saveSample(const SYSCHAR* fileName, mp_sint32 index) { return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderPSM.cpp0000644000175000017500000006714011315767511021536 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderPSM.cpp * MilkyPlay Module Loader: Version 1/2 of Epic MegaGames MASI */ #include "Loaders.h" #include static bool PATTTest(mp_ubyte* p, mp_sint32& size) { if (p[0] != 'P') return false; // type Pxxx if (p[1] != 'A') { if (p[1] < '0' || p[1] > '9') return false; if ((p[2] < '0' || p[2] > '9') && p[2] != ' ') return false; if ((p[3] < '0' || p[3] > '9') && p[3] != ' ') return false; size = 4; return true; } // type PATTxxxx else { if (p[2] != 'T' || p[3] != 'T') return false; if (p[4] < '0' || p[4] > '9') return false; if ((p[5] < '0' || p[5] > '9') && p[5] != ' ') return false; if ((p[6] < '0' || p[6] > '9') && p[6] != ' ') return false; if ((p[7] < '0' || p[7] > '9') && p[7] != ' ') return false; size = 8; return true; } } #define RELEASE_PATTERNS { \ for (mp_sint32 i = 0; i < 1024; i++) \ if (patterns[i]) \ { \ delete[] patterns[i]; \ patterns[i] = NULL; \ } \ delete[] patterns; \ } const char* LoaderPSMv2::identifyModule(const mp_ubyte* buffer) { // check for .PSM (new) module if (!memcmp(buffer,"PSM\x20",4)) { return "PSMv2"; } // this is not an .PSM return NULL; } mp_sint32 LoaderPSMv2::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; // size for 1024 patterns // should be enough, really mp_ubyte** patterns = new mp_ubyte*[1024]; if (patterns == NULL) return -7; mp_uint32* patternSizes = new mp_uint32[1024]; if (patternSizes == NULL) { delete[] patterns; return -7; } for (mp_sint32 j = 0; j < 1024; j++) patterns[j] = NULL; memset(patternSizes,0,1024*sizeof(mp_uint32)); //mp_uint32 songSize = 0; mp_uint32 patIndex = 0; mp_uint32 insIndex = 0; mp_uint32 smpIndex = 0; mp_ubyte* songSignature = NULL; mp_uint32 signatureSize = 0; bool sinaria = false; while (true) { mp_ubyte ID[4]; mp_uint32 bytesRead = f.read(&ID,4,1); if (bytesRead != 4) break; switch (LittleEndian::GET_DWORD(ID)) { // 'PSM ' case 0x204d5350: memcpy(header->sig,"PSM",3); f.readDword(); // consume chunk size (song size) break; // 'FILE' case 0x454c4946: // just eat ID break; // 'SDFT' case 0x54464453: // whatever this is signatureSize = f.readDword(); // get chunk size delete[] songSignature; songSignature = new mp_ubyte[signatureSize]; // typically size is 8 and buffer will contain "MAINSONG" f.read(songSignature,1,signatureSize); break; // 'TITL' case 0x4c544954: // title chunk... song contains title { mp_uint32 size = f.readDword(); // get chunk size mp_ubyte* buffer = new mp_ubyte[size]; f.read(buffer,1,size); // just make sure title fits into our name field if (size > sizeof(header->name)) size = sizeof(header->name); memcpy(header->name,buffer,size); delete[] buffer; break; } // 'PBOD' case 0x444f4250: // pattern chunk { mp_uint32 size = f.readDword(); // get chunk size patterns[patIndex] = new mp_ubyte[size]; patternSizes[patIndex] = size; f.read(patterns[patIndex++],1,size); break; } // 'SONG' case 0x474E4F53: // song chunk { f.readDword(); // consume chunk size mp_ubyte buffer[9]; f.read(buffer,1,8); buffer[8] = '\0'; /*if (memcmp(buffer,songSignature,signatureSize)!=0) { printf("Something went wrong here!"); exit(0); } delete buffer;*/ #ifdef VERBOSE printf("Song (pos: %i): %s\n",header->ordnum,buffer); #endif f.readByte(); // what's this? f.readByte(); // what's this? mp_ubyte numchannels = f.readByte(); if (numchannels > header->channum) header->channum = numchannels; break; } // 'OPLH' case 0x484c504f: { mp_uint32 size = f.readDword(); // the following is a little bit messy, but i dunno all the fields // so the data i'll need is looked up by a brute force search mp_ubyte* buffer = new mp_ubyte[size]; f.read(buffer,1,size); bool helperPattern = false; mp_uint32 i = 0; for (;;) { if (buffer[i] == 0x07 && buffer[i+2] == 0x08) { i++; if (header->ordnum == 0) { header->tempo = buffer[i]; // tickspeed header->speed = buffer[i+2]; // BPM } // if there are more then 1 songs contained in the file we need to create a little // helper pattern to set speed and tempo for that particular song else { char patSig[10]; sprintf(patSig, "P%i ", patIndex % 999); patterns[patIndex] = new mp_ubyte[20]; memset(patterns[patIndex],0,20); memcpy(patterns[patIndex]+4, patSig, 4); patternSizes[patIndex] = 20; mp_ubyte* pattern = patterns[patIndex]; pattern[0] = 0xFF; pattern[1] = 0xFF; pattern[2] = 0xFF; pattern[3] = 0xFF; pattern[8] = 0x01; // just one row pattern[10] = 0x0A; // 10 bytes in size pattern[12] = 0x10; // read effect + operand pattern[13] = 0x00; // channel 0 and pattern[14] = 0x3E; // set BPM pattern[15] = buffer[i+2]; pattern[16] = 0x10; // read effect + operand pattern[17] = 0x01; // channel 1 pattern[18] = 0x3D; // set speed pattern[19] = buffer[i]; helperPattern = true; patIndex++; } break; } i++; if (i >= size) break; } mp_sint32 patIDSize = 0; while (!PATTTest(buffer+i+1, patIDSize) && i < size) i++; if (patIDSize == 8) sinaria = true; // hier lief was schief if (i >= size || (patIDSize != 4 && patIDSize != 8)) { delete[] buffer; RELEASE_PATTERNS; return -8; } //header->ordnum = 0; // place helper pattern right before the song if (header->ordnum != 0 && helperPattern) header->ord[header->ordnum++] = patIndex-1; while (buffer[i+1]=='P' && i < (size-5)) { for (mp_uint32 j = 0; j < patIndex; j++) { if (memcmp(buffer+i+1,patterns[j]+4,patIDSize) == 0) { header->ord[header->ordnum] = j; break; } } i+=patIDSize+1; header->ordnum++; } delete[] buffer; break; } // 'DATE' case 0x45544144: // date chunk (ASCII string) // 'PPAN' case 0x4E415050: // panning found in sinaria PSM modules // 'PATT' case 0x54544150: // list of used patterns? pretty useless to me... // 'DSAM' case 0x4d415344: // another useless chunk... { mp_uint32 size = f.readDword(); // read and discard mp_ubyte* buffer = new mp_ubyte[size]; f.read(buffer,1,size); delete[] buffer; break; } // 'DSMP' case 0x504d5344: { mp_uint32 size = f.readDword(); mp_uint32 infoSize = size>96 ? 96:size; // read sample info first mp_ubyte* buffer = new mp_ubyte[infoSize]; f.read(buffer,1,infoSize); if (infoSize == 96) { mp_sint32 offsetName = 13; mp_sint32 offsetSamplen = 54; mp_sint32 offsetLoopstart = 58; mp_sint32 offsetLoopEnd = 62; mp_sint32 offsetVolume = 68; mp_sint32 offsetC4spd = 73; if (sinaria) { offsetName += 4; offsetSamplen += 4; offsetLoopstart += 4; offsetLoopEnd += 4; offsetVolume += 5; offsetC4spd += 5; } memcpy(instr[insIndex].name, buffer+offsetName, 24); if (size > 96) { instr[insIndex].samp = 1; // one sample used for (mp_sint32 j = 0; j < 120; j++) instr[insIndex].snum[j] = smpIndex; // build sample table smp[smpIndex].samplen = (mp_sint32)LittleEndian::GET_DWORD(buffer+offsetSamplen); // sample size smp[smpIndex].loopstart = (mp_sint32)LittleEndian::GET_DWORD(buffer+offsetLoopstart); // loop start smp[smpIndex].looplen = ((mp_sint32)LittleEndian::GET_DWORD(buffer+offsetLoopEnd)) - ((mp_sint32)LittleEndian::GET_DWORD(buffer+offsetLoopstart))+1; // loop length mp_sint32 finetune = 0; if (sinaria) finetune = buffer[offsetVolume-1] & 0xf; smp[smpIndex].vol = module->vol127to255(buffer[offsetVolume]); // volume smp[smpIndex].flags = 1; // set volume flag if (buffer[0] & 0x80) { smp[smpIndex].type = 1; // looped sample // correct looplen if necessary if ((smp[smpIndex].loopstart+smp[smpIndex].looplen)>smp[smpIndex].samplen) smp[smpIndex].looplen-=(smp[smpIndex].loopstart+smp[smpIndex].looplen)-smp[smpIndex].samplen; } mp_uint32 c4speed = (mp_uword)LittleEndian::GET_WORD(buffer+offsetC4spd); mp_uint32 ftC4Speed = module->sfinetunes[finetune]; module->convertc4spd(c4speed*ftC4Speed/8448, &smp[smpIndex].finetune,&smp[smpIndex].relnote); //module->convertc4spd((mp_uword)LittleEndian::GET_WORD(buffer+offsetC4spd),&smp[smpIndex].finetune,&smp[smpIndex].relnote); ASSERT(smp[smpIndex].samplen+96 == size); if (module->loadModuleSample(f, smpIndex, XModule::ST_DELTA) != 0) { delete[] buffer; RELEASE_PATTERNS; return -7; } //if (sinaria) //{ // if (smp[smpIndex].samplen > 2) // smp[smpIndex].samplen-=2; // if (smp[smpIndex].looplen > 2) // smp[smpIndex].looplen-=2; //} smpIndex++; } insIndex++; } delete[] buffer; break; } default: #ifdef VERBOSE printf("Unknown chunk: %X\n",ID); #endif return -8; break; } } if (songSignature) delete[] songSignature; mp_ubyte* pattern = new mp_ubyte[32*256*5]; if (pattern == NULL) { RELEASE_PATTERNS; return -7; } for (mp_uint32 i = 0; i < patIndex; i++) { for (mp_sint32 j = 0; j < 32*256; j++) { pattern[j*5] = 0xFF; pattern[j*5+1] = 0xFF; pattern[j*5+2] = 0xFF; pattern[j*5+3] = 0; pattern[j*5+4] = 0; } mp_sint32 patIDSize = 0; if (!PATTTest(patterns[i]+4, patIDSize)) { RELEASE_PATTERNS; return -7; } mp_sint32 offset = 6+patIDSize; mp_ubyte* packed = patterns[i]+offset; mp_uint32 index = 0; mp_uint32 row = 0; mp_uint32 maxChannels = 0; while (index<(patternSizes[i]-offset)) { mp_uint32 size = ((mp_uword)LittleEndian::GET_WORD(packed+index))-2; index+=2; // advance pointer mp_uint32 dstIndex = index+size; if (size) { do { mp_ubyte pi = packed[index++]; mp_uint32 chn = packed[index++]; if (chn>maxChannels) maxChannels = chn; mp_ubyte* slot = pattern+(row*32*5)+chn*5; // note if (pi & 0x80) { mp_ubyte note = packed[index++]; // key off note if (note == 255) note = 254; else if (patIDSize == 8) { note = ((note+23) / 12) * 16 + (((note+23)) % 12); } slot[0] = note; } // instrument if (pi & 0x40) { slot[1] = packed[index++]; } // volume if (pi & 0x20) { slot[2] = packed[index++]; } // effect & operand if (pi & 0x10) { slot[3] = packed[index++]; slot[4] = packed[index++]; if (slot[3] == 0x29) { slot[4] = packed[index+=2]; } else if (slot[3] == 0x2D) { slot[4] = packed[index+=3]; } } } while (index < dstIndex); #ifdef VERBOSE if (index!=dstIndex) printf("nagnag "); #endif } row++; } maxChannels++; if (maxChannels > header->channum) maxChannels = header->channum; // convert pattern here: phead[i].rows = (mp_uword)LittleEndian::GET_WORD(patterns[i]+offset-2); phead[i].effnum = 3; phead[i].channum = maxChannels; phead[i].patternData = new mp_ubyte[phead[i].rows*maxChannels*8]; if (phead[i].patternData == NULL) { delete[] pattern; RELEASE_PATTERNS; return -7; } memset(phead[i].patternData,0,maxChannels*8*phead[i].rows); mp_ubyte* dstSlot = phead[i].patternData; for (row = 0; row < phead[i].rows; row++) { for (mp_uint32 c = 0; c < maxChannels; c++) { const mp_ubyte* srcSlot = pattern+row*32*5+c*5; mp_ubyte note = srcSlot[0]; mp_ubyte finalNote = 0; if (note<254) { finalNote = ((note>>4)*12+(note&0x0f))+1; if (finalNote>120) { #ifdef VERBOSE printf("Wrong note: %i",finalNote); #endif finalNote = 0; } } else if (note==254) { finalNote = 122; // key off, s3m style } dstSlot[0] = finalNote; if (srcSlot[1] != 0xFF) dstSlot[1] = srcSlot[1]+1; if (srcSlot[2]<=128) { dstSlot[2] = 0xC; dstSlot[3] = XModule::vol127to255(srcSlot[2]); } mp_ubyte eff = srcSlot[3]; mp_ubyte op = srcSlot[4]; switch (eff) { // set sample offset case 0x29: eff = 0x09; break; // set BPM case 0x3D: eff = 0x1C; break; // set tickspeed case 0x3E: eff = 0x16; break; // pattern break case 0x34: eff = 0x0D; break; // vibrato case 0x15: eff = 0x04; break; // tone porta case 0x0F: eff = 0x03; break; // arpeggio case 0x47: eff = 0x20; break; // portamento up case 0x0C: eff = 0x4D; break; // portamento down case 0x0E: eff = 0x4E; break; // volume slide up = MDL volslide up case 02: eff = 0x45; op<<=1; break; // volume slide down = MDL volslide down case 04: eff = 0x46; op<<=1; break; // extra fine volume slide up case 01: eff = 0x4B; op<<=1; break; // extra fine volume slide down case 03: eff = 0x4C; op<<=1; break; // retrig note case 0x2A: eff = 0x1B; break; // fine portamento up case 11: eff = 0x31; break; // fine portamento down case 13: eff = 0x32; break; // note-cut case 0x2B: eff = 0x3C; break; // note-delay case 0x2C: eff = 0x3D; break; // jump loop case 0x35: eff = 0x36; break; // pattern delay case 0x36: eff = 0x3E; break; // position jump case 50: eff = 0x0B; break; /*// tone porta + volslide case 17: eff = 0x05; if (op) op >>= 1; break;*/ // tone porta + volslide up case 16: dstSlot[6] = 0x45; dstSlot[7] = op<<1; eff = 0x03; op = 0; break; // tone porta + volslide down case 17: dstSlot[6] = 0x46; dstSlot[7] = op<<1; eff = 0x03; op = 0; break; // vibrato + volslide up case 0x17: dstSlot[6] = 0x45; dstSlot[7] = op<<1; eff = 0x04; op = 0; break; // vibrato + volslide down case 0x18: dstSlot[6] = 0x46; dstSlot[7] = op<<1; eff = 0x04; op = 0; break; // tremolo case 0x1F: eff = 0x07; break; // set panning case 0x49: eff = 0x08; break; default: #ifdef VERBOSE if (eff != 0) { printf("%i, %x, %x\n",i,eff,op); } #endif //eff = op = 0; break; } //eff = op = 0; /*if (i == 13 && c == 0) { printf("%x, %x, %x, %x\n",finalNote,dstSlot[1],eff,op); }*/ dstSlot[4] = eff; dstSlot[5] = op; dstSlot+=8; } } bool dummyPattern = (*(patterns[i]) == 0xFF && *(patterns[i]+1) == 0xFF && *(patterns[i]+2) == 0xFF && *(patterns[i]+3) == 0xFF); // mark song start with effect 0x1E + operand 0xFF if (dummyPattern && phead[i].rows == 1) { phead[i].patternData[2] = XModule::SubSongMarkEffect; phead[i].patternData[3] = XModule::SubSongMarkOperand; } } delete[] pattern; RELEASE_PATTERNS; header->smpnum = smpIndex; header->insnum = insIndex; header->patnum = patIndex; header->mainvol = 255; module->setDefaultPanning(); module->postProcessSamples(); strcpy(header->tracker,"Epic Megagames MASI "); return 0; } ////////////////////////////////////////////////////////////////////////// // Old epic pinball PSM loader. Not much tested yet // // Warning: This is an one-by-one conversion of an assembler version ;) // ////////////////////////////////////////////////////////////////////////// #define MEMREAD(dst,size,count) \ memcpy(dst,buffer+memPos,size*count); \ memPos+=size*count #define MEMSEEK(position) \ memPos=position; #define MEMADVANCE(amount) \ memPos+=amount; const char* LoaderPSMv1::identifyModule(const mp_ubyte* buffer) { // check for .PSM (old) module if (!memcmp(buffer,"PSM\xFE",4)) { return "PSMv1"; } // this is not an .PSM return NULL; } mp_sint32 LoaderPSMv1::load(XMFileBase& f, XModule* module) { mp_uint32 memPos = 0; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_ubyte* buffer = new mp_ubyte[f.sizeWithBaseOffset()]; if (buffer == NULL) return -7; f.read(buffer,1,f.sizeWithBaseOffset()); MEMSEEK(0); MEMREAD(header->sig, 1, 3); // PSM signature MEMADVANCE(1); MEMREAD(header->name,1,20); // Don't know how long this is actually header->tempo = buffer[67]; // Tickspeed header->speed = buffer[68]; // BPM header->mainvol = 255; header->ordnum = buffer[72]; header->insnum = header->smpnum = buffer[76]; header->patnum = buffer[74]; MEMSEEK((mp_sint32)LittleEndian::GET_DWORD(buffer+82)); MEMREAD(header->ord,1,header->ordnum); MEMSEEK((mp_sint32)LittleEndian::GET_DWORD(buffer+94)); mp_uint32 samplePtrs[256]; mp_uint32 maxInstruments = 0; mp_sint32 i; for (i = 0; i < header->insnum; i++) { mp_ubyte ins[64]; MEMREAD(ins,1,64); // sample size if ((mp_sint32)LittleEndian::GET_DWORD(ins+48) > 0) { mp_uint32 insIndex = ins[45]-1; if (insIndex > maxInstruments) maxInstruments = insIndex; memcpy(smp[i].name,ins,12); memcpy(instr[insIndex].name,ins+13,22); samplePtrs[i] = (mp_sint32)LittleEndian::GET_DWORD(ins+37); // store sample offset instr[insIndex].samp = 1; // one sample used for (mp_sint32 j = 0; j < 120; j++) instr[insIndex].snum[j] = i; // build sample table smp[i].samplen = (mp_sint32)LittleEndian::GET_DWORD(ins+48); // sample size smp[i].loopstart = (mp_sint32)LittleEndian::GET_DWORD(ins+52); // loop start smp[i].looplen = ((mp_sint32)LittleEndian::GET_DWORD(ins+56)) - ((mp_sint32)LittleEndian::GET_DWORD(ins+52)); // loop length smp[i].vol = module->vol64to255(ins[61]); // volume smp[i].flags = 1; // set volume flag if ((mp_sint32)LittleEndian::GET_DWORD(ins+56) > 0 && (ins[47]&0x80)) { smp[i].type = 1; // looped sample } mp_uint32 c4speed = ((mp_uword)LittleEndian::GET_WORD(ins+62)); mp_sint32 finetune = ins[60]&0xf; mp_uint32 ftC4Speed = module->sfinetunes[finetune]; module->convertc4spd(c4speed*ftC4Speed/8363, &smp[i].finetune,&smp[i].relnote); } } maxInstruments++; header->insnum = maxInstruments; MEMSEEK((mp_sint32)LittleEndian::GET_DWORD(buffer+90)); ////////////////////// // read patterns // ////////////////////// mp_ubyte* pattern = new mp_ubyte[256*32*5]; if (pattern == NULL) { delete[] buffer; return -7; } for (i = 0; i < header->patnum; i++) { for (mp_sint32 j = 0; j < 32*256; j++) { pattern[j*5] = 0x00; pattern[j*5+1] = 0x00; pattern[j*5+2] = 0xFF; pattern[j*5+3] = 0x00; pattern[j*5+4] = 0x00; } mp_uword size; mp_ubyte numRows, numChannels; MEMREAD(&size,2,1); size = LittleEndian::GET_WORD((mp_ubyte*)&size); MEMREAD(&numRows,1,1); MEMREAD(&numChannels,1,1); mp_ubyte* packed = new mp_ubyte[size-4+5]; if (packed == NULL) { delete[] buffer; delete[] pattern; return -7; } memset(packed,0,size-4+5); MEMREAD(packed,1,size-4); mp_uint32 index = 0; mp_uint32 row = 0; mp_uint32 maxChannels = 0; while (indexmaxChannels) maxChannels = chn; mp_ubyte* slot = pattern+(row*32*5)+chn*5; if (pi & 128) { slot[0] = packed[index++]; slot[1] = packed[index++]; } if (pi & 64) { slot[2] = packed[index++]; } if (pi & 32) { slot[3] = packed[index++]; slot[4] = packed[index++]; } } maxChannels++; if (maxChannels > numChannels) maxChannels = numChannels; if (maxChannels > header->channum) header->channum = maxChannels; delete[] packed; phead[i].rows = numRows; phead[i].effnum = 3; phead[i].channum = maxChannels; phead[i].patternData = new mp_ubyte[phead[i].rows*maxChannels*8]; if (phead[i].patternData == NULL) { delete[] buffer; delete[] pattern; return -7; } memset(phead[i].patternData,0,maxChannels*8*phead[i].rows); mp_ubyte* dstSlot = phead[i].patternData; for (row = 0; row < phead[i].rows; row++) for (mp_uint32 c = 0; c < maxChannels; c++) { const mp_ubyte* srcSlot = pattern+row*32*5+c*5; mp_ubyte note = srcSlot[0]; if (note && (note!=254)) note+=24; else if (note == 254) note = 122; dstSlot[0] = note; dstSlot[1] = srcSlot[1]; if (srcSlot[2]<=64) { dstSlot[2] = 0xC; dstSlot[3] = XModule::vol64to255(srcSlot[2]); } mp_ubyte eff = srcSlot[3]; mp_ubyte op = srcSlot[4]; switch (eff) { // fine volume slide up case 01: eff = 0x3A; break; // volume slide up = MDL volslide up case 02: eff = 0x45; op<<=2; break; // fine volume slide down case 03: eff = 0x3B; break; // volume slide down = MDL volslide down case 04: eff = 0x46; op<<=2; break; // fine portamento up case 10: eff = 0x31; break; // portamento up case 11: eff = 0x01; break; // fine portamento down case 12: eff = 0x32; break; // portamento down case 13: eff = 0x02; break; // tone porta case 14: eff = 0x03; break; // glissando control case 15: eff = 0x33; break; // tone porta + volslide up case 16: dstSlot[6] = 0x45; dstSlot[7] = op<<2; eff = 0x03; op = 0; break; // tone porta + volslide down case 17: dstSlot[6] = 0x46; dstSlot[7] = op<<2; eff = 0x03; op = 0; break; // vibrato case 20: eff = 0x04; break; // set vibrato waveform case 21: eff = 0x34; break; // vibrato + volslide up case 22: dstSlot[6] = 0x45; dstSlot[7] = op<<2; eff = 0x04; op = 0; break; // vibrato + volslide down case 23: dstSlot[6] = 0x46; dstSlot[7] = op<<2; eff = 0x04; op = 0; break; // tremolo case 30: eff = 0x07; break; // set tremolo waveform case 31: eff = 0x37; break; // set sample offset case 40: eff = 0x09; break; // retrig note case 41: eff = 0x1B; break; // note-cut case 42: eff = 0x3C; break; // note-delay case 43: eff = 0x3D; break; // position jump case 50: eff = 0x0B; break; // pattern break case 51: eff = 0x0D; break; // jump loop case 52: eff = 0x36; break; // pattern delay case 53: eff = 0x3E; break; // set tickspeed case 60: eff = 0x1C; break; // set BPM case 61: eff = 0x16; break; // arpeggio case 70: eff = 0x20; break; // set finetune case 71: eff = 0x35; break; // set panning case 72: eff = 0x08; op*=17; break; default: #ifdef VERBOSE if (eff != 0) { printf("%i, %x, %x\n",i,eff,op); } #endif //eff = op = 0; break; } dstSlot[4] = eff; dstSlot[5] = op; dstSlot+=8; } } /*for (i = 0; i < header->ordnum; i++) printf("%i ",header->ord[i]); header->ord[0] = 0; header->ord[1] = 0; header->ord[2] = 6;*/ delete[] pattern; for (i=0;ismpnum;i++) { MEMSEEK(samplePtrs[i]); smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen); if (smp[i].sample == NULL) { delete[] buffer; return -7; } MEMREAD(smp[i].sample,1,smp[i].samplen); mp_sbyte b1=0; for (mp_uint32 j = 0; j < smp[i].samplen; j++) smp[i].sample[j] = b1+=smp[i].sample[j]; } delete[] buffer; module->setDefaultPanning(); module->postProcessSamples(); strcpy(header->tracker,"Epic Megagames MASI "); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/ResamplerCubic.h0000644000175000017500000001627211163403715022307 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ResamplerCubic.h * MilkyPlay * * Created by Peter Barth on 03.01.08. * */ /* * Cubic 4 Point 3rd order polynomial interpolation resampler * * Formulas from: * Polynomial Interpolators for High-Quality Resampling of Oversampled Audio by * Olli Niemitalo ollinie@freenet.hut.fi * * Website: http://www.student.oulu.fi/~oniemita/DSP/INDEX.HTM * */ #define __DEIP__ #define fpmul MP_FP_MUL enum CubicResamplers { CubicResamplerLagrange, CubicResamplerSpline }; // here is some code to work around my VS6.1 backward compability template class CubicResamplerDummy { public: static inline mp_sint32 interpolate_lagrange4Point(const bufferType* sample, const mp_sint32 smppos) { // note that the sample buffer is padded with leading and // trailing space which is filled with samples from the // beginning/end, so even if it SEEMS we are crossing sample // boundaries by -1, +1 and +2, it doesn't happen #ifdef __DEIP__ const mp_sint32 v1 = (mp_sint32)sample[(smppos>>16)] << (16-shift); const mp_sint32 v2 = (mp_sint32)sample[(smppos>>16) + 1] << (16-shift); const mp_sint32 v0 = (mp_sint32)sample[(smppos>>16) - 1] << (16-shift); const mp_sint32 v3 = (mp_sint32)sample[(smppos>>16) + 2] << (16-shift); const mp_sint32 x = smppos & 65535; mp_sint32 c0 = v1; mp_sint32 c1 = v2 - ((v0*(65536/3))>>16) - ((v3*(65536/6))>>16) - (v1>>1); mp_sint32 c2 = ((v0+v2)>>1) - v1; mp_sint32 c3 = (((65536/6)*(v3-v0))>>16) + ((v1-v2)>>1); return fpmul(fpmul(fpmul(c3,x)+c2,x)+c1, x)+c0; #else const mp_sint32 v1 = sample[(smppos>>16)] << (16-shift); const mp_sint32 v2 = sample[(smppos>>16) + 1] << (16-shift); const mp_sint32 v0 = sample[(smppos>>16) - 1] << (16-shift); mp_sint32 v3 = sample[(smppos>>16) + 2] << 8; const mp_sint32 ofsf = (smppos&65535) + 65536; v3 += -3*v2 + 3*v1 - v0; v3 = fpmul(v3, ((ofsf - 2*65536) * (65536/6)) >> 16); v3 += v2 - v1 - v1 + v0; v3 = fpmul(v3, (ofsf - 65536) >> 1); v3 += v1 - v0; v3 = fpmul(v3, ofsf); v3 += v0; return v3; #endif } static inline mp_sint32 interpolate_spline4Point(const bufferType* sample, const mp_sint32 smppos) { #ifdef __DEIP__ const mp_sint32 v1 = sample[(smppos>>16)] << (16-shift); const mp_sint32 v2 = sample[(smppos>>16) + 1] << (16-shift); const mp_sint32 v0 = sample[(smppos>>16) - 1] << (16-shift); const mp_sint32 v3 = sample[(smppos>>16) + 2] << (16-shift); const mp_sint32 x = smppos & 65535; mp_sint32 ym1py1 = v0+v2; mp_sint32 c0 = (((65536/6)*ym1py1) + (65536*2/3)*v1) >> 16; mp_sint32 c1 = (v2-v0)>>1; mp_sint32 c2 = (ym1py1>>1) - v1; mp_sint32 c3 = ((v1-v2)>>1) + (((65536/6)*(v3-v0)) >> 16); return fpmul(fpmul(fpmul(c3,x)+c2,x)+c1, x)+c0; #else // this the stuff timidity uses, I have no clue what it does, but // it causes heavy gibbs phenomena and doesn't look nearly as the above const mp_sint32 v1 = sample[(smppos>>16)] << 8; const mp_sint32 v2 = sample[(smppos>>16) + 1] << 8; const mp_sint32 v0 = sample[(smppos>>16) - 1] << 8; const mp_sint32 v3 = sample[(smppos>>16) + 2] << 8; const mp_sint32 ofsf = smppos & 65535; const mp_sint32 temp = v2; const mp_sint32 temp2 = (5 * v3 - 11 * v2 + 7 * v1 - v0) >> 2; const mp_sint32 hres = fpmul(fpmul(fpmul(temp2, ofsf + 65536), (ofsf - 65536)) + 6*v2, ofsf); const mp_sint32 temp3 = (5 * v0 - 11 * v1 + 7 * temp - v3) >> 2; const mp_sint32 temp4 = fpmul(temp3, ofsf) >> 16; const mp_sint32 temp5 = fpmul(temp4, ofsf - 65536*2) >> 16; const mp_sint32 res = fpmul(6*v1+temp5, 65536 - ofsf); return fpmul(res + hres, 65536 / 6); #endif } static inline void addBlock(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { // adding some local variables, will be faster to access than attributes of chn mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; const mp_sint32 rampFromVolStepL = ramping ? chn->rampFromVolStepL : 0; const mp_sint32 rampFromVolStepR = ramping ? chn->rampFromVolStepR : 0; mp_sint32 smppos = chn->smppos; mp_sint32 smpposfrac = chn->smpposfrac; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; mp_sint32 fp = smpadd*count; MP_INCREASESMPPOS(chn->smppos,chn->smpposfrac,fp,16); const bufferType* sample = ((const bufferType*)chn->sample) + smppos; smppos = smpposfrac; while (count--) { mp_sint32 s; switch (type) { case CubicResamplerLagrange: s = interpolate_lagrange4Point(sample, smppos); break; case CubicResamplerSpline: s = interpolate_spline4Point(sample, smppos); break; } (*buffer++)+=(s*(voll>>15))>>15; (*buffer++)+=(s*(volr>>15))>>15; // ramping is a template parameter // see explanation above if (ramping) { voll+=rampFromVolStepL; volr+=rampFromVolStepR; } smppos+=smpadd; } if (ramping) { chn->finalvoll = voll; chn->finalvolr = volr; } } }; template class ResamplerLagrange : public ChannelMixer::ResamplerBase { public: virtual bool isRamping() { return ramping; } virtual bool supportsFullChecking() { return false; } virtual bool supportsNoChecking() { return true; } virtual void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { if (chn->flags & 4) CubicResamplerDummy::addBlock(buffer, chn, count); else CubicResamplerDummy::addBlock(buffer, chn, count); } }; #undef __DEIP__ #undef fpmul milkytracker-0.90.85+dfsg/src/milkyplay/ResamplerFast.h0000644000175000017500000003467711163403715022170 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ResamplerFast.h * MilkyPlay * * Created by Peter Barth on 08.11.07. * * The goal of the resamplers in this file is to be as fast as possible. * No compromises have been made for readability nor maintainability. * (hence the use of some evil macro templates) */ #ifndef __RESAMPLERFAST_H__ #define __RESAMPLERFAST_H__ #include "ResamplerMacros.h" /* * Resampler without interpolation or ramping */ class ResamplerSimple : public ChannelMixer::ResamplerBase { public: virtual bool isRamping() { return false; } virtual bool supportsFullChecking() { return true; } virtual bool supportsNoChecking() { return true; } virtual void addBlockFull(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; FULLMIXER_TEMPLATE(FULLMIXER_8BIT_NORMAL, FULLMIXER_16BIT_NORMAL, 16, 0); } virtual void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; mp_sint32 smppos = chn->smppos; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; const mp_sint32 basepos = smppos; mp_sint32 posfixed = chn->smpposfrac; mp_sint32 fp = smpadd*count; MP_INCREASESMPPOS(chn->smppos,chn->smpposfrac,fp,16); if ((voll == 0) && (volr == 0)) return; mp_sint32 sd1,sd2; NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_NORMAL, NOCHECKMIXER_16BIT_NORMAL); } }; /* * Resampler without interpolation but with ramping. */ class ResamplerSimpleRamp : public ChannelMixer::ResamplerBase { public: virtual bool isRamping() { return true; } virtual bool supportsFullChecking() { return true; } virtual bool supportsNoChecking() { return true; } virtual void addBlockFull(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; mp_sint32 rampFromVolStepL = chn->rampFromVolStepL; mp_sint32 rampFromVolStepR = chn->rampFromVolStepR; if (rampFromVolStepL || rampFromVolStepR) { FULLMIXER_TEMPLATE(FULLMIXER_8BIT_NORMAL_RAMP(true), FULLMIXER_16BIT_NORMAL_RAMP(true), 16, 0); } else { FULLMIXER_TEMPLATE(FULLMIXER_8BIT_NORMAL_RAMP(false), FULLMIXER_16BIT_NORMAL_RAMP(false), 16, 1); } chn->finalvoll = voll; chn->finalvolr = volr; } virtual void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; mp_sint32 rampFromVolStepL = chn->rampFromVolStepL; mp_sint32 rampFromVolStepR = chn->rampFromVolStepR; mp_sint32 smppos = chn->smppos; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; const mp_sint32 basepos = smppos; mp_sint32 posfixed = chn->smpposfrac; mp_sint32 fp = smpadd*count; MP_INCREASESMPPOS(chn->smppos,chn->smpposfrac, fp, 16); if ((voll == 0 && rampFromVolStepL == 0) && (volr == 0 && rampFromVolStepR == 0)) return; mp_sint32 sd1,sd2; if (rampFromVolStepL || rampFromVolStepR) { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_NORMAL_RAMP(true), NOCHECKMIXER_16BIT_NORMAL_RAMP(true)); } else { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_NORMAL_RAMP(false), NOCHECKMIXER_16BIT_NORMAL_RAMP(false)); } chn->finalvoll = voll; chn->finalvolr = volr; } }; /* * Resampler using linear interpolation but without ramping. */ class ResamplerLerp : public ChannelMixer::ResamplerBase { public: virtual bool isRamping() { return false; } virtual bool supportsFullChecking() { return true; } virtual bool supportsNoChecking() { return true; } virtual void addBlockFull(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; FULLMIXER_TEMPLATE(FULLMIXER_8BIT_LERP, FULLMIXER_16BIT_LERP, 16, 0); } virtual void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; mp_sint32 smppos = chn->smppos; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; const mp_sint32 basepos = smppos; mp_sint32 posfixed = chn->smpposfrac; mp_sint32 fp = smpadd*count; MP_INCREASESMPPOS(chn->smppos, chn->smpposfrac, fp, 16); if ((voll == 0) && (volr == 0)) return; mp_sint32 sd1,sd2; NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP,NOCHECKMIXER_16BIT_LERP); } }; /* * Resampler using linear interpolation and ramping. * Also supports the low pass filter used by Impulse Tracker */ class ResamplerLerpRampFilter : public ChannelMixer::ResamplerBase { public: virtual bool isRamping() { return true; } virtual bool supportsFullChecking() { return true; } virtual bool supportsNoChecking() { return true; } virtual void addBlockFull(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; mp_sint32 rampFromVolStepL = chn->rampFromVolStepL; mp_sint32 rampFromVolStepR = chn->rampFromVolStepR; // filter in use? if (chn->cutoff != ChannelMixer::MP_INVALID_VALUE && chn->resonance != ChannelMixer::MP_INVALID_VALUE) { const mp_sint32 a = chn->a; const mp_sint32 b = chn->b; const mp_sint32 c = chn->c; mp_sint32 currsample = chn->currsample; mp_sint32 prevsample = chn->prevsample; if (rampFromVolStepL || rampFromVolStepR) { FULLMIXER_TEMPLATE(FULLMIXER_8BIT_LERP_RAMP_FILTER(true), FULLMIXER_16BIT_LERP_RAMP_FILTER(true), 16, 0); } else { FULLMIXER_TEMPLATE(FULLMIXER_8BIT_LERP_RAMP_FILTER(false), FULLMIXER_16BIT_LERP_RAMP_FILTER(false), 16, 1); } chn->currsample = currsample; chn->prevsample = prevsample; } // no filter else { if (rampFromVolStepL || rampFromVolStepR) { FULLMIXER_TEMPLATE(FULLMIXER_8BIT_LERP_RAMP(true), FULLMIXER_16BIT_LERP_RAMP(true), 16, 2); } else { FULLMIXER_TEMPLATE(FULLMIXER_8BIT_LERP_RAMP(false), FULLMIXER_16BIT_LERP_RAMP(false), 16, 3); } } chn->finalvoll = voll; chn->finalvolr = volr; } virtual void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; mp_sint32 rampFromVolStepL = chn->rampFromVolStepL; mp_sint32 rampFromVolStepR = chn->rampFromVolStepR; mp_sint32 smppos = chn->smppos; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; const mp_sint32 basepos = smppos; mp_sint32 posfixed = chn->smpposfrac; mp_sint32 fp = smpadd*count; MP_INCREASESMPPOS(chn->smppos, chn->smpposfrac, fp, 16); mp_sint32 sd1,sd2; // filter in use? if (chn->cutoff != ChannelMixer::MP_INVALID_VALUE && chn->resonance != ChannelMixer::MP_INVALID_VALUE) { const mp_sint32 a = chn->a; const mp_sint32 b = chn->b; const mp_sint32 c = chn->c; mp_sint32 currsample = chn->currsample; mp_sint32 prevsample = chn->prevsample; // check if ramping has to be performed if (rampFromVolStepL || rampFromVolStepR) { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP_RAMP_FILTER(true), NOCHECKMIXER_16BIT_LERP_RAMP_FILTER(true)); } else { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP_RAMP_FILTER(false), NOCHECKMIXER_16BIT_LERP_RAMP_FILTER(false)); } chn->currsample = currsample; chn->prevsample = prevsample; } // no filter else { if ((voll == 0 && rampFromVolStepL == 0) && (volr == 0 && rampFromVolStepR == 0)) return; // check if ramping has to be performed if (rampFromVolStepL || rampFromVolStepR) { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP_RAMP(true), NOCHECKMIXER_16BIT_LERP_RAMP(true)); } else { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP_RAMP(false), NOCHECKMIXER_16BIT_LERP_RAMP(false)); } } chn->finalvoll = voll; chn->finalvolr = volr; } }; /* * only for testing purpose, some dummy resampler that can be used to * play around etc. */ class ResamplerDummy : public ChannelMixer::ResamplerBase { public: virtual bool isRamping() { return false; } virtual bool supportsFullChecking() { return false; } virtual bool supportsNoChecking() { return true; } virtual void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; //const mp_sint32 rampFromVolStepL = chn->rampFromVolStepL; //const mp_sint32 rampFromVolStepR = chn->rampFromVolStepR; mp_sint32 smppos = chn->smppos; mp_sint32 smpposfrac = chn->smpposfrac; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; mp_sint32 sd1,sd2; const mp_sint32 flags = chn->flags; const mp_sint32 loopstart = chn->loopstart; const mp_sint32 loopend = chn->loopend; const mp_sint32 smplen = chn->smplen; mp_sint32 fixedtimefrac = chn->fixedtimefrac; const mp_sint32 timeadd = chn->smpadd; if (!(flags&4)) { const mp_sbyte* sample = chn->sample; while (count--) { /*sd1 = sample[smppos] << 8; sd2 = sample[smppos+1] << 8; sd1 = ((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; (*buffer++)+=((sd1*(voll>>15))>>15); (*buffer++)+=((sd1*(volr>>15))>>15); voll+=rampFromVolStepL; volr+=rampFromVolStepR; */ mp_sint32 ofsf, v0, v1, v2, v3; v1 = sample[smppos] << 8; v2 = sample[smppos + 1] << 8; v0 = sample[smppos - 1] << 8; v3 = sample[smppos + 2] << 8; ofsf = smpposfrac + 65536; v3 += -3*v2 + 3*v1 - v0; v3 = ChannelMixer::fixedmul(v3, (ofsf - 2*65536) / 6); v3 += v2 - v1 - v1 + v0; v3 = ChannelMixer::fixedmul(v3, (ofsf - 65536) >> 1); v3 += v1 - v0; v3 = ChannelMixer::fixedmul(v3, ofsf); v3 += v0; (*buffer++)+=((v3*(voll>>15))>>15); (*buffer++)+=((v3*(volr>>15))>>15); //voll+=rampFromVolStepL; //volr+=rampFromVolStepR; MP_INCREASESMPPOS(smppos, smpposfrac, smpadd, 16); } } else { const mp_sword* sample = (const mp_sword*)chn->sample; while (count--) { mp_sint32 ofsf, v0, v1, v2, v3; v1 = sample[smppos]; v2 = sample[smppos + 1]; v0 = sample[smppos - 1]; v3 = sample[smppos + 2]; ofsf = smpposfrac + 65536; v3 += -3*v2 + 3*v1 - v0; v3 = ChannelMixer::fixedmul(v3, (ofsf - 2*65536) / 6); v3 += v2 - v1 - v1 + v0; v3 = ChannelMixer::fixedmul(v3, (ofsf - 65536) >> 1); v3 += v1 - v0; v3 = ChannelMixer::fixedmul(v3, ofsf); v3 += v0; (*buffer++)+=((v3*(voll>>15))>>15); (*buffer++)+=((v3*(volr>>15))>>15); //voll+=rampFromVolStepL; //volr+=rampFromVolStepR; MP_INCREASESMPPOS(smppos, smpposfrac, smpadd, 16); } } chn->smppos = smppos; chn->smpposfrac = smpposfrac; chn->fixedtimefrac = fixedtimefrac; /*if (!(chn->flags&4)) { const mp_sbyte* sample = chn->sample + basepos; while (count--) { sd1 = sample[posfixed>>16]<<8; sd2 = sample[(posfixed>>16)+1]<<8; sd1 =((sd1<<12)+((posfixed>>4)&0xfff)*(sd2-sd1))>>12; (*buffer++)+=((sd1*(voll>>15))>>15); (*buffer++)+=((sd1*(volr>>15))>>15); voll+=rampFromVolStepL; volr+=rampFromVolStepR; posfixed+=smpadd; } } else { const mp_sword* sample = (const mp_sword*)chn->sample + basepos; while (count--) { sd1 = sample[posfixed>>16]; sd2 = sample[(posfixed>>16)+1]; sd1 =((sd1<<12)+((posfixed>>4)&0xfff)*(sd2-sd1))>>12; (*buffer++)+=((sd1*(voll>>15))>>15); (*buffer++)+=((sd1*(volr>>15))>>15); voll+=rampFromVolStepL; volr+=rampFromVolStepR; posfixed+=smpadd; } } */ /* if (chn->cutoff != MP_INVALID_VALUE && chn->resonance != MP_INVALID_VALUE) { const mp_sint32 a = chn->a; const mp_sint32 b = chn->b; const mp_sint32 c = chn->c; mp_sint32 currsample = chn->currsample; mp_sint32 prevsample = chn->prevsample; // check if ramping has to be performed if (rampFromVolStepL || rampFromVolStepR) { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP_RAMP_FILTER(true),NOCHECKMIXER_16BIT_LERP_RAMP_FILTER(true)); } else { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP_RAMP_FILTER(false),NOCHECKMIXER_16BIT_LERP_RAMP_FILTER(false)); } chn->currsample = currsample; chn->prevsample = prevsample; } else { if ((voll == 0 && rampFromVolStepL == 0) && (volr == 0 && rampFromVolStepR == 0)) return; // check if ramping has to be performed if (rampFromVolStepL || rampFromVolStepR) { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP_RAMP(true),NOCHECKMIXER_16BIT_LERP_RAMP(true)); } else { NOCHECKMIXER_TEMPLATE(NOCHECKMIXER_8BIT_LERP_RAMP(false),NOCHECKMIXER_16BIT_LERP_RAMP(false)); } }*/ //chn->finalvoll = voll; //chn->finalvolr = volr; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderIFF.cpp0000644000175000017500000003112011163403715022624 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderIFF.cpp * MilkyPlay * * Created by Peter Barth on 07.01.06. * */ #include "SampleLoaderIFF.h" #include "XMFile.h" #include "XModule.h" #include "LittleEndian.h" SampleLoaderIFF::SampleLoaderIFF(const SYSCHAR* fileName, XModule& theModule) : SampleLoaderAbstract(fileName, theModule) { } bool SampleLoaderIFF::identifySample() { return getNumChannels() != 0; } mp_sint32 SampleLoaderIFF::getNumChannels() { mp_ubyte ID[4], buffer[4]; mp_dword chunkLen; XMFile f(theFileName); f.read(ID, 4, 1); if (memcmp(ID, "FORM", 4) != 0) return 0; f.seek(0); bool hasFORM = false; bool hasVHDR = false; bool hasBODY = false; while (!(hasFORM && hasVHDR && hasBODY)) { mp_uint32 bytesRead = f.read(ID, 4, 1); if (bytesRead != 4) break; bytesRead = f.read(buffer, 4, 1); if (bytesRead != 4) break; chunkLen = BigEndian::GET_DWORD(buffer); switch (BigEndian::GET_DWORD(ID)) { case 0x464F524D: // 'FORM' { f.read(buffer, 4, 1); if (memcmp(buffer, "8SVX", 4) == 0) hasFORM = true; else if (memcmp(buffer, "16SV", 4) == 0) hasFORM = true; break; } /*case 0x4E414D45: // 'NAME' { break; }*/ case 0x56484452: // 'VHDR' { hasVHDR = true; mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); break; } case 0x424F4459: // 'BODY' { hasBODY = true; mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); break; } default: { mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); } } // odd chunks are padded with zero if (chunkLen&1) f.readByte(); } return (hasFORM && hasVHDR && hasBODY) ? 1 : 0; } /* 8SVX Voice8Header Structure Definition */ struct SVX8_Vhdr { mp_dword Oneshothi; /* Num Samples in high octave 1-shot part */ mp_dword Repeathi; /* Num Samples in high octave repeat part */ mp_dword Samplescycle; /* Num Samples/cycle in high octave, else 0 */ mp_uword Samplessec; /* Samples Per Second - Sampling Rate */ mp_ubyte Octaves; /* Number of Octaves */ mp_ubyte Compression; /* Compression algorithm used - see below */ mp_sint32 Volume; /* Volume from 0 to Unity - see below */ }; mp_sint32 SampleLoaderIFF::loadSample(mp_sint32 index, mp_sint32 channelIndex) { mp_ubyte ID[4], buffer[4]; mp_dword chunkLen; SVX8_Vhdr vhdr; XMFile f(theFileName); f.read(ID, 4, 1); if (memcmp(ID, "FORM", 4) != 0) return -8; f.seek(0); bool hasFORM = false; bool hires = false; bool hasVHDR = false; bool hasBODY = false; mp_ubyte* name = NULL; mp_ubyte* anno = NULL; mp_sbyte* sampleData = NULL; mp_sint32 sampleDataLen = 0; mp_dword iffSize = 0; while (!(hasFORM && hasVHDR && hasBODY)) { mp_uint32 bytesRead = f.read(ID, 4, 1); if (bytesRead != 4) break; bytesRead = f.read(buffer, 4, 1); if (bytesRead != 4) break; chunkLen = BigEndian::GET_DWORD(buffer); switch (BigEndian::GET_DWORD(ID)) { case 0x464F524D: // 'FORM' { f.read(buffer, 4, 1); if (memcmp(buffer, "8SVX", 4) == 0) { hasFORM = true; hires = false; } else if (memcmp(buffer, "16SV", 4) == 0) { hasFORM = true; hires = true; } iffSize = chunkLen; break; } case 0x4E414D45: // 'NAME' { if (name) delete[] name; name = new mp_ubyte[chunkLen+1]; if (name == NULL) { if (sampleData) delete[] sampleData; if (name) delete[] name; if (anno) delete[] anno; return -7; } f.read(name, 1, chunkLen); name[chunkLen] = '\0'; break; } case 0x414E4E4F : // 'ANNO' { if (anno) delete[] anno; anno = new mp_ubyte[chunkLen+1]; if (anno == NULL) { if (sampleData) delete[] sampleData; if (name) delete[] name; if (anno) delete[] anno; return -7; } f.read(anno, 1, chunkLen); anno[chunkLen] = '\0'; break; } case 0x56484452: // 'VHDR' { hasVHDR = true; mp_uint32 pos = f.pos(); if (chunkLen < 20) { if (sampleData) delete[] sampleData; if (name) delete[] name; if (anno) delete[] anno; return -8; } f.read(buffer, 1, 4); vhdr.Oneshothi = BigEndian::GET_DWORD(buffer); // sample len f.read(buffer, 1, 4); vhdr.Repeathi = BigEndian::GET_DWORD(buffer); // loop start f.read(buffer, 1, 4); vhdr.Samplescycle = BigEndian::GET_DWORD(buffer); // loop len f.read(buffer, 1, 2); vhdr.Samplessec = BigEndian::GET_WORD(buffer); // c4 speed vhdr.Octaves = f.readByte(); vhdr.Compression = f.readByte(); f.read(buffer, 1, 4); vhdr.Volume = BigEndian::GET_DWORD(buffer); // volume f.seek(pos + chunkLen); break; } case 0x424F4459: // 'BODY' { if (!hasVHDR) goto bail; mp_uint32 pos = f.pos(); switch (vhdr.Compression) { // uncompressed IFF case 0: { hasBODY = true; // check for some nasty invalid TFMX IFF // (contains zero length body but file contains actually some data) if (chunkLen == 0) { sampleDataLen = iffSize - f.pos(); } else { sampleDataLen = chunkLen; } if (vhdr.Oneshothi < chunkLen) vhdr.Oneshothi = chunkLen; if (sampleDataLen > (signed)vhdr.Oneshothi) sampleDataLen = vhdr.Oneshothi; else if (sampleDataLen < (signed)vhdr.Oneshothi) sampleDataLen = vhdr.Oneshothi; sampleData = new mp_sbyte[sampleDataLen]; if (sampleData == NULL) { if (sampleData) delete[] sampleData; if (name) delete[] name; if (anno) delete[] anno; return -7; } memset(sampleData, 0, sampleDataLen); f.read(sampleData, 1, (signed)chunkLen > sampleDataLen ? sampleDataLen : chunkLen); break; } case 1: case 2: { if (hires) goto bail; hasBODY = true; mp_sbyte *Body,*src,*dst; mp_ubyte d; mp_sbyte x; mp_sint32 i,n,lim; mp_sbyte fibtab[16] = { -34,-21,-13,-8,-5,-3,-2,-1,0,1,2,3,5,8,13,21 }; mp_sbyte exptab[16] = {-128,-64,-32,-16,-8,-4,-2,-1,0,1,2,4,8,16,32,64}; Body = new mp_sbyte[chunkLen]; if (!Body) { if (sampleData) delete[] sampleData; if (name) delete[] name; if (anno) delete[] anno; return -7; } f.read(Body, 1, chunkLen); sampleDataLen = chunkLen<<1; sampleData = new mp_sbyte[sampleDataLen]; if (!sampleData) { if (sampleData) delete[] sampleData; if (name) delete[] name; if (anno) delete[] anno; return -7; } /* Fibonacci Delta Decompression */ mp_sbyte* CodeToDelta = NULL; if (vhdr.Compression == 1) CodeToDelta = fibtab; /* Exponential Delta Decompression */ else CodeToDelta = exptab; src = Body+2; dst = sampleData; n = chunkLen-2; x = Body[1]; lim = n << 1; for(i = 0; i < lim; ++i) { d = src[i >> 1]; if(i & 1) d &= 0xF; else d >>= 4; x += CodeToDelta[d]; dst[i] = x; } delete[] Body; if ((signed)vhdr.Oneshothi < sampleDataLen) vhdr.Oneshothi = sampleDataLen; break; } default: hasBODY = false; goto bail; } f.seek(pos + chunkLen); break; } default: { bail: mp_uint32 pos = f.pos(); f.seek(pos + chunkLen); } } // odd chunks are padded with zero if (chunkLen&1) f.readByte(); } if (hasFORM && hasVHDR && hasBODY) { TXMSample* smp = &theModule.smp[index]; if (smp->sample) { theModule.freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->samplen = hires ? sampleDataLen >> 1 : sampleDataLen; smp->sample = (mp_sbyte*)theModule.allocSampleMem(hires ? (smp->samplen<<1) : smp->samplen); if (smp->sample == NULL) { if (sampleData) delete[] sampleData; if (name) delete[] name; if (anno) delete[] anno; return -7; } memcpy(smp->sample, sampleData, sampleDataLen); if (hires) { // huuuu? 16 bit IFF samples are little endian? how stupid is that? mp_uword* ptr = (mp_uword*)smp->sample; for (mp_uint32 i = 0; i < smp->samplen; i++) { *ptr = LittleEndian::GET_WORD(ptr); ptr++; } } delete[] sampleData; smp->loopstart = hires ? vhdr.Repeathi >> 1 : vhdr.Repeathi; smp->looplen = hires ? vhdr.Samplescycle >> 1 : vhdr.Samplescycle; mp_sint32 vol = (vhdr.Volume*255)>>16; smp->vol = (mp_ubyte)(vol > 255 ? 255 : vol); smp->pan = 0x80; smp->flags = 3; memset(smp->name, 0, sizeof(smp->name)); if (name || anno) { const char* buff = name ? (const char*)name : (const char*)anno; nameToSample(buff, smp); if (name) delete[] name; if (anno) delete[] anno; } else { nameToSample(preferredDefaultName, smp); } smp->type = 0; if (smp->looplen) smp->type |= 1; if (hires) smp->type |= 16; XModule::convertc4spd(vhdr.Samplessec, &smp->finetune, &smp->relnote); if (smp->samplen > vhdr.Oneshothi) smp->samplen = vhdr.Oneshothi; return 0; } delete[] name; delete[] sampleData; return -8; } static inline mp_uword swapW(mp_uword x) { return (x>>8)+((x&255)<<8); } static inline mp_dword swapDW(mp_dword x) { return (mp_dword)swapW(x>>16) | (mp_dword)swapW(x&0xFFFF) << 16; } mp_sint32 SampleLoaderIFF::saveSample(const SYSCHAR* fileName, mp_sint32 index) { TXMSample* smp = &theModule.smp[index]; XMFile f(fileName, true); f.write("FORM", 1, 4); bool hires = (smp->type & 16) != 0; mp_dword chunkLen = 70 + hires ? smp->samplen << 1 : smp->samplen; f.writeDword(swapDW(chunkLen)); f.write(hires ? "16SV" : "8SVX", 1, 4); f.write("NAME", 1, 4); f.writeDword(swapDW(22)); f.write(smp->name, 1, 22); SVX8_Vhdr vhdr; vhdr.Oneshothi = hires ? smp->samplen << 1 : smp->samplen; vhdr.Repeathi = (smp->type & 3) ? (hires ? smp->loopstart << 1 : smp->loopstart) : 0; vhdr.Samplescycle = (smp->type & 3) ? (hires ? smp->looplen << 1 : smp->looplen) : 0; vhdr.Samplessec = XModule::getc4spd(smp->relnote,smp->finetune); vhdr.Octaves = 1; vhdr.Compression = 0; vhdr.Volume = (smp->vol*65536)/255; f.write("VHDR", 1, 4); f.writeDword(swapDW(0x14)); f.writeDword(swapDW(vhdr.Oneshothi)); f.writeDword(swapDW(vhdr.Repeathi)); f.writeDword(swapDW(vhdr.Samplescycle)); f.writeWord(swapW(vhdr.Samplessec)); f.writeByte(vhdr.Octaves); f.writeByte(vhdr.Compression); f.writeDword(swapDW(vhdr.Volume)); f.write("BODY", 1, 4); f.writeDword(swapDW(hires ? smp->samplen << 16 : smp->samplen)); if (smp->type & 16) { for (mp_uint32 i = 0; i < smp->samplen; i++) f.writeWord(smp->getSampleValue(i)); } else { for (mp_uint32 i = 0; i < smp->samplen; i++) f.writeByte(smp->getSampleValue(i)); } return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderMTM.cpp0000644000175000017500000001573111163403715021525 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderMTM.cpp * MilkyPlay Module Loader: Multitracker * * Warning: This is an one-by-one conversion of an assembler version ;) * */ #include "Loaders.h" const char* LoaderMTM::identifyModule(const mp_ubyte* buffer) { // check for .MTM module if (!memcmp(buffer,"MTM\x10",4)) { return "MTM"; } return NULL; } mp_sint32 LoaderMTM::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(header->sig, 1, 3); // read signature if (f.readByte() != 0x10) return -8; f.read(header->name, 1, 20); mp_uword numTracks = f.readWord(); header->flags = XModule::MODULE_PTNEWINSTRUMENT; header->mainvol = 255; header->tempo = 6; header->speed = 125; header->patnum = f.readByte() + 1; header->ordnum = f.readByte() + 1; mp_uword locf = f.readWord(); header->insnum = f.readByte(); header->smpnum = header->insnum; f.readByte(); mp_sint32 numRows = f.readByte(); mp_sint32 trackSize = numRows*3; header->channum = f.readByte(); mp_ubyte panPositions[32]; f.read(panPositions, 1, 32); mp_sint32 i,s = 0; for (i = 0; i < header->insnum; i++) { f.read(instr[i].name,1,22); mp_uint32 size = f.readDword(); mp_uint32 loopstart = f.readDword(); mp_uint32 loopend = f.readDword(); mp_sbyte finetune = f.readByte()*16; mp_ubyte volume = XModule::vol64to255(f.readByte()); /*mp_ubyte flags = */f.readByte(); if (size) { instr[i].samp = 1; memcpy(smp[s].name,instr[i].name,22); smp[s].flags = 1; smp[s].samplen = size; smp[s].loopstart = loopstart; smp[s].looplen = loopend - loopstart; smp[s].vol = volume; smp[s].finetune = finetune; for (mp_sint32 j = 0; j < 120; j++) instr[i].snum[j] = s; if ((smp[s].loopstart+smp[s].looplen)>smp[s].samplen) smp[s].looplen-=(smp[s].loopstart+smp[s].looplen)-smp[s].samplen; if (smp[s].loopstart<=2) smp[s].loopstart=0; if (smp[s].looplen<=2) smp[s].looplen=0; else smp[s].type=1; s++; } } header->smpnum = s; mp_ubyte orders[128]; f.read(orders, 1, 128); for (i = 0; i < header->ordnum; i++) header->ord[i] = orders[i]; mp_ubyte* tracks = new mp_ubyte[trackSize*numTracks]; if (tracks == NULL) return -7; f.read(tracks, trackSize, numTracks); mp_uword* trackSeq = new mp_uword[header->patnum * 32]; if (trackSeq == NULL) { delete[] tracks; return -7; } f.readWords(trackSeq, header->patnum * 32); mp_uword* pTrackSeq = trackSeq; for (i = 0; i < header->patnum;i++) { phead[i].rows = numRows; phead[i].effnum = 1; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*4]; // out of memory? if (phead[i].patternData == NULL) { delete[] tracks; delete[] trackSeq; return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum*4); mp_sint32 c; for (c=0;c<32;c++) { if (*pTrackSeq && (*pTrackSeq-1) < numTracks && c < header->channum) { mp_ubyte *track = (*pTrackSeq-1)*trackSize + tracks; #ifdef VERBOSE if ((*pTrackSeq-1) >= numTracks) printf("piiiiep"); #endif for (mp_sint32 row = 0; row < numRows; row++) { mp_ubyte* dstSlot = phead[i].patternData+row*phead[i].channum*4+c*4; mp_ubyte note = track[0]>>2; if (note) note+=25; mp_ubyte ins = ((track[0]&0x03)<<4)+(track[1]>>4); mp_ubyte eff = track[1]&0x0f; mp_ubyte op = track[2]; if (eff==0xE) { eff=(op>>4)+0x30; op&=0xf; if (eff == 0x38) { eff = 0x08; op <<= 4; } } if ((!eff)&&op) eff=0x20; // old style modules don't support last effect for: // - portamento up/down // - volume slide if (eff==0x1&&(!op)) eff = 0; if (eff==0x2&&(!op)) eff = 0; if (eff==0xA&&(!op)) eff = 0; if (eff==0x5&&(!op)) eff=0x3; if (eff==0x6&&(!op)) eff=0x4; if (eff==0xC) op = XModule::vol64to255(op); dstSlot[0] = note; dstSlot[1] = ins; dstSlot[2] = eff; dstSlot[3] = op; track+=3; } } pTrackSeq++; } } delete[] trackSeq; delete[] tracks; /*for (i = 0; i < locf; i++) { printf("%c",f.readByte()); } printf("\n");*/ // song message if (locf) { char* unpackedSongMessage = new char[locf]; f.read(unpackedSongMessage, 1, locf); mp_sint32 size = locf; // song message isn't null terminated for (i = 0; i < size; i++) if (unpackedSongMessage[i] == '\0') unpackedSongMessage[i] = ' '; for (i = 0; i < size; i++) { char line[50]; memset(line, 0, sizeof(line)); if (size - i >= 39) { XModule::convertStr(line, unpackedSongMessage+i, 40, false); i+=39; } else { XModule::convertStr(line, unpackedSongMessage+i, size-i, false); i+=size-i; } module->addSongMessageLine(line); } delete[] unpackedSongMessage; #ifdef VERBOSE printf("%s\n",module->message); #endif } if (module->loadModuleSamples(f, XModule::ST_UNSIGNED) != 0) return -7; strcpy(header->tracker,"Multitracker"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LittleEndian.h0000644000175000017500000000373411163403715021762 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LittleEndian.h * MilkyPlay * * Created by Peter Barth on Tue Oct 19 2004. * */ #ifndef __LITTLEENDIAN_H__ #define __LITTLEENDIAN_H__ #include "MilkyPlayTypes.h" class LittleEndian { public: static mp_uword GET_WORD(const void* ptr); static mp_uint32 GET_DWORD(const void* ptr); }; class BigEndian { public: static mp_uword GET_WORD(const void* ptr); static mp_uint32 GET_DWORD(const void* ptr); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriverBase.cpp0000644000175000017500000000574211163403715022752 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriverBase.cpp * MilkyPlay * * Created by Peter Barth on 15.12.07. * */ #include "AudioDriverBase.h" #include "MasterMixer.h" #if defined(__PSP__) #include #elif !defined(WIN32) && !defined(_WIN32_WCE) #include #else #include #endif void AudioDriverBase::msleep(mp_uint32 msecs) { #ifdef WIN32 ::Sleep(msecs); #elif defined(__PSP__) sceKernelDelayThreadCB(msecs*1000); #elif defined(__AROS__) // usleep is not implemented on AROS if(msecs < 1000) msecs = 1000; sleep(msecs/1000); #else usleep(msecs*1000); #endif } bool AudioDriverBase::isMixerActive() { if (idle) return false; if (markedAsIdle) { markedAsIdle = false; idle = true; return false; } return (mixer && mixer->isPlaying()); } void AudioDriverBase::setIdle(bool idle) { if (mixer == 0) return; if (idle) { if (markedAsIdle || this->idle) return; markedAsIdle = true; // this is going to loop infinitely when the audio device is not running double waitMillis = ((double)(bufferSize/2) / (double)mixFrequency) * 1000.0 * 2.0; if (waitMillis < 1.0) waitMillis = 1.0; if (waitMillis > 5000.0) waitMillis = 5000.0; mp_uint32 time = 0; const mp_uint32 sleepTime = 10; while (!this->idle && time <= (mp_uint32)waitMillis) { msleep(sleepTime); time+=sleepTime; } if (!this->idle) this->idle = true; } else { this->idle = false; this->markedAsIdle = false; } } milkytracker-0.90.85+dfsg/src/milkyplay/ExporterXM.cpp0000644000175000017500000015346011163403715022020 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ExporterXM.cpp * MilkyPlay XM writer (trying hard to export something useful) * * -------------------------------- * Version History: * -------------------------------- * 26/03/06: PLM Far position jump fix & effects are relocated to other channels if possible * 01/01/06: Happy new year ;) MilkyTracker XMs are now even smaller then FT2 XMs * 02/12/05: Fixed problems with last operand restoration for S3M and MDL commands. VERY SLOW(!!) but working * 06/02/05: Added simulation of multitracker behaviour with FT2 features * 05/02/05: Added simulation of protracker behaviour with FT2 features * 07/12/04: Writes all other instrument related stuff too (envelopes, auto-vibrato etc.) * 06/12/04: Added sample relative note remapper when note range exceeds regular XM note range (RIGHT.PTM) * 05/12/04: First acceptable results with one-effect modules (.MOD / .MTM) * 04/12/04: Started work * */ #include "MilkyPlay.h" #ifdef VERBOSE #include "stdio.h" #endif struct TWorkBuffers { mp_sint32 noteRangeRemapper[256]; mp_ubyte lastArpeggio[256]; mp_ubyte lastVolSlide[256]; mp_ubyte lastGVolSlide[256]; mp_ubyte lastPorta[256]; mp_ubyte lastTempoSlide[256]; mp_sint32 globalVolume; mp_sint32 bpm, baseBpm, speed; mp_ubyte lastIns[256]; mp_ubyte lastNote[256]; void clearBuffers() { memset(lastArpeggio, 0, sizeof(noteRangeRemapper)); memset(lastVolSlide, 0, sizeof(noteRangeRemapper)); memset(lastGVolSlide, 0, sizeof(noteRangeRemapper)); memset(lastPorta, 0, sizeof(lastPorta)); memset(lastTempoSlide, 0, sizeof(lastTempoSlide)); memset(lastIns, 0, sizeof(lastIns)); memset(lastNote, 0, sizeof(lastNote)); globalVolume = 64; baseBpm = 125; bpm = 125; speed = 6; } TWorkBuffers() { clearBuffers(); memset(noteRangeRemapper, 0, sizeof(noteRangeRemapper)); } }; static void convertEffect(mp_ubyte effIn, mp_ubyte opIn, mp_ubyte& effOut, mp_ubyte& opOut, mp_sint32 curChan, TWorkBuffers& workBuffers, bool convertITTempoSlides) { mp_ubyte* lastArpeggio = workBuffers.lastArpeggio; mp_ubyte* lastVolSlide = workBuffers.lastVolSlide; mp_ubyte* lastGVolSlide = workBuffers.lastGVolSlide; mp_ubyte* lastPorta = workBuffers.lastPorta; mp_ubyte* lastTempoSlide = workBuffers.lastTempoSlide; effOut = opOut = 0; // Protracker commands if (effIn > 0 && effIn <= 0x11) { effOut = effIn; opOut = opIn; if (effIn == 0x0C || effIn == 0x10) opOut = (mp_ubyte)(((mp_sint32)opOut*64)/255); if (effIn == 0x10) workBuffers.globalVolume = (mp_ubyte)(((mp_sint32)opOut*64)/255); // Cope with set BPM in case we're having a DBM "set real BPM command" if (effIn == 0x0f && opIn >= 32) { // real BPM is not the default value => recalculate BPM if (workBuffers.baseBpm != 125) { // First store current BPM workBuffers.bpm = opIn; // Now calculate new BPM (see DBM player source) mp_sint32 realCiaTempo = (workBuffers.bpm * (workBuffers.baseBpm << 8) / 125) >> 8; // clip if necessary if (realCiaTempo > 255) realCiaTempo = 255; if (realCiaTempo < 32) realCiaTempo = 32; // This is our new set BPM opOut = realCiaTempo; } } } // set envelope position else if (effIn == 0x14 || effIn == 0x51) { effOut = 0x14; opOut = opIn; } // set envelope position else if (effIn == 0x15) { effOut = effIn; opOut = opIn; } // set tempo else if (effIn == 0x16) { if (opIn >= 32) { // First store current BPM workBuffers.bpm = opIn; // Cope with set BPM in case we're having a DBM "set real BPM command" if (workBuffers.baseBpm != 125) { // Now calculate new BPM (see DBM player source) mp_sint32 realCiaTempo = (workBuffers.bpm * (workBuffers.baseBpm << 8) / 125) >> 8; // clip if (realCiaTempo > 255) realCiaTempo = 255; if (realCiaTempo < 32) realCiaTempo = 32; // new effect 0xF with new BPM effOut = 0x0F; opOut = realCiaTempo; } else { if (opIn < 32) opIn = 32; effOut = 0x0F; opOut = opIn; } } else if (convertITTempoSlides) { if (opIn) lastTempoSlide[curChan] = opIn; if (lastTempoSlide[curChan]) { mp_ubyte y = lastTempoSlide[curChan]>>4; mp_ubyte x = lastTempoSlide[curChan]&0xf; // tempo slide up if (y) { effOut = 0x0F; workBuffers.bpm+=x*(workBuffers.speed-1); if (workBuffers.bpm > 255) workBuffers.bpm = 255; opOut = workBuffers.bpm; } // tempo slide down else { effOut = 0xF; workBuffers.bpm-=x*(workBuffers.speed-1); if (workBuffers.bpm < 32) workBuffers.bpm = 32; opOut = workBuffers.bpm; } } } } // Panning slide / Multi retrig / tremor else if (effIn == 0x19 || effIn == 0x1B || effIn == 0x1D) { effOut = effIn; opOut = opIn; } // set speed else if (effIn == 0x1C) { if (opIn) { if (opIn > 31) opIn = 31; effOut = 0x0F; opOut = opIn; } } // MDL set sample offset else if (effIn == 0x1F) { effOut = 0x09; opOut = opIn; } // PLM position jump else if (effIn == 0x2B) { effOut = 0x0B; opOut = opIn; } // Protracker subcommands (most likely) else if (effIn >= 0x30 && effIn <= 0x3F) { effOut = 0x0E; opOut = ((effIn-0x30)<<4)+(opIn&0xF); } // arpeggio else if (effIn == 0x20) { if (!opIn) opIn = lastArpeggio[curChan]; if (opIn) { effOut = 0; opOut = opIn; lastArpeggio[curChan] = opIn; } } // extra fine porta commands else if (effIn == 0x41) { effOut = 0x21; opOut = 0x10 + (opIn <= 0xf ? opIn&0xF : 0xF); } else if (effIn == 0x42) { effOut = 0x21; opOut = 0x20 + (opIn <= 0xf ? opIn&0xF : 0xF); } // MDL porta up else if (effIn == 0x43) { if (opIn) lastPorta[curChan] = opIn; if (lastPorta[curChan] >= 0xE0) { mp_ubyte y = lastPorta[curChan]>>4; mp_ubyte x = lastPorta[curChan]&0xf; switch (y) { case 0xF: effOut = 0xE; opOut = 0x10 + x; break; case 0xE: effOut = 0x21; opOut = 0x10 + (x>>1); break; } } else if (lastPorta[curChan]) { effOut = 0x1; opOut = lastPorta[curChan]; } } // MDL porta down else if (effIn == 0x44) { if (opIn) lastPorta[curChan] = opIn; if (lastPorta[curChan] >= 0xE0) { mp_ubyte y = lastPorta[curChan] >> 4; mp_ubyte x = lastPorta[curChan] & 0xf; switch (y) { case 0xF: effOut = 0xE; opOut = 0x20 + x; break; case 0xE: effOut = 0x21; opOut = 0x20 + (x>>1); break; } } else if (lastPorta[curChan]) { effOut = 0x2; opOut = lastPorta[curChan]; } } // MDL volslide up else if (effIn == 0x45) { if (opIn) lastVolSlide[curChan] = opIn; if (lastVolSlide[curChan] >= 0xE0) { mp_ubyte y = lastVolSlide[curChan]>>4; mp_ubyte x = lastVolSlide[curChan]&0xf; switch (y) { case 0xF: effOut = 0xE; opOut = 0xA0 + x; break; case 0xE: effOut = 0xE; opOut = 0xA0 + (x>>2); break; } } else if (lastVolSlide[curChan]) { effOut = 0xA; opOut = (lastVolSlide[curChan]>>2) <= 0xF ? (lastVolSlide[curChan]>>2)<<4 : 0xF0; } } // MDL volslide down else if (effIn == 0x46) { if (opIn) lastVolSlide[curChan] = opIn; if (lastVolSlide[curChan] >= 0xE0) { mp_ubyte y = lastVolSlide[curChan] >> 4; mp_ubyte x = lastVolSlide[curChan] & 0xf; switch (y) { case 0xF: effOut = 0xE; opOut = 0xB0 + x; break; case 0xE: effOut = 0xE; opOut = 0xB0 + (x>>2); break; } } else if (lastVolSlide[curChan]) { effOut = 0xA; opOut = (lastVolSlide[curChan]>>2) <= 0xF ? (lastVolSlide[curChan]>>2) : 0xF; } } // S3M porta up else if (effIn == 0x47) { if (opIn) lastPorta[curChan] = opIn; if (lastPorta[curChan] >= 0xE0) { mp_ubyte y = lastPorta[curChan] >> 4; mp_ubyte x = lastPorta[curChan] & 0xf; switch (y) { case 0xF: effOut = 0xE; opOut = 0x10 + x; break; case 0xE: effOut = 0x21; opOut = 0x10 + x; break; } } else if (lastPorta[curChan]) { effOut = 0x1; opOut = lastPorta[curChan]; } } // S3M porta down else if (effIn == 0x48) { if (opIn) lastPorta[curChan] = opIn; if (lastPorta[curChan] >= 0xE0) { mp_ubyte y = lastPorta[curChan] >> 4; mp_ubyte x = lastPorta[curChan] & 0xf; switch (y) { case 0xF: effOut = 0xE; opOut = 0x20 + x; break; case 0xE: effOut = 0x21; opOut = 0x20 + x; break; } } else if (lastPorta[curChan]) { effOut = 0x2; opOut = lastPorta[curChan]; } } // S3M volslide else if (effIn == 0x49) { if (opIn) lastVolSlide[curChan] = opIn; if (lastVolSlide[curChan]) { mp_ubyte y = lastVolSlide[curChan]>>4; mp_ubyte x = lastVolSlide[curChan]&0xf; if (!(x == 0xF && y)&&!(y == 0xF && x)) { if (x && y) x = 0; if (y) { effOut = 0xA; opOut = y<<4; } else if (x) { effOut = 0xA; opOut = x; } } else { if (!(x==0x0F && !y) && !(y==0x0F && !x)) { if (x==0x0F) { effOut = 0xE; opOut = 0xA0+y; } else if (y==0x0F) { effOut = 0xE; opOut = 0xB0+x; } } } } } // PSM fine volslide up else if (effIn == 0x4B) { effOut = 0x0E; opOut = opIn>>2; if (opOut>0xF) opOut=0x0F; opOut+=0xA0; } // PSM fine volslide down else if (effIn == 0x4C) { effOut = 0x0E; opOut = opIn>>2; if (opOut>0xF) opOut=0x0F; opOut+=0xB0; } // PSM porta up else if (effIn == 0x4D) { effOut = 0x01; opOut = opIn>>2; } // PSM porta down else if (effIn == 0x4E) { effOut = 0x02; opOut = opIn>>2; } // "S3M" global volslide, this is an IT/MODPLUG feature else if (effIn == 0x59) { if (opIn) lastGVolSlide[curChan] = opIn; if (lastGVolSlide[curChan]) { mp_ubyte y = lastGVolSlide[curChan]>>4; mp_ubyte x = lastGVolSlide[curChan]&0xf; if (!(x == 0xF && y)&&!(y == 0xF && x)) { if (x && y) x = 0; if (y) { effOut = 0x11; opOut = y<<4; workBuffers.globalVolume+=y*(workBuffers.speed-1); if (workBuffers.globalVolume > 64) workBuffers.globalVolume = 64; } else if (x) { effOut = 0x11; opOut = x; workBuffers.globalVolume-=x*(workBuffers.speed-1); if (workBuffers.globalVolume < 0) workBuffers.globalVolume = 0; } } else { // SUCKS if (!(x==0x0F && !y) && !(y==0x0F && !x)) { if (x==0x0F) { workBuffers.globalVolume += y; if (workBuffers.globalVolume > 64) workBuffers.globalVolume = 64; effOut = 0x10; opOut = (mp_ubyte)workBuffers.globalVolume; } else if (y==0x0F) { workBuffers.globalVolume -= y; if (workBuffers.globalVolume < 0) workBuffers.globalVolume = 0; effOut = 0x10; opOut = (mp_ubyte)workBuffers.globalVolume; } } } } } // set digibooster real BPM else if (effIn == 0x52) { // store new BPM base workBuffers.baseBpm = opIn; // if it's not the default value recalculate BPM if (workBuffers.baseBpm != 125) { // see digibooster pro player source mp_sint32 realCiaTempo = (workBuffers.bpm * (workBuffers.baseBpm << 8) / 125) >> 8; // clip if necessary if (realCiaTempo > 255) realCiaTempo = 255; if (realCiaTempo < 32) realCiaTempo = 32; // write new command: 0xF with new operand effOut = 0x0F; opOut = realCiaTempo; } } // FAR/669 (effects are really different, conversion doesn't make much sense) else if (effIn == 0x70) { switch (opIn>>4) { case 0x0f: effOut = 0xf; opOut = opIn&0xf; break; } } else if (effIn) { #ifdef VERBOSE printf("Missing effect %i, %i\n", effIn, opIn); #endif } } // convert FT2 compatible effect to volumn column effect if possible static mp_ubyte convertToVolume(mp_ubyte eff, mp_ubyte op) { mp_ubyte vol = 0; /*if (eff && eff != 0x0C) { printf("%i, %i\n", eff, op); }*/ // set volume if (eff == 0x0C) { vol = 0x10 + op; } // volslide else if (eff == 0x0A) { // use last operand? if (!op) { vol = 0x60; } // volslide down else if (op & 0xF) { vol = 0x60 + (op&0xF); } // volslide up else if (op >> 4) { vol = 0x70 + (op>>4); } } // extra fine volslide up else if (eff == 0xE && ((op>>4)==0xA)) { vol = 0x90 + (op & 0xF); } // extra fine volslide down else if (eff == 0xE && ((op>>4)==0xB)) { vol = 0x80 + (op & 0xF); } // extra vibrato else if (eff == 0x4) { if ((op>>4) && !(op&0xF)) { vol = 0xA0 + (op>>4); } else if (!(op>>4)/* && (op&0xF)*/) { vol = 0xB0 + op; } } // set panning else if (eff == 0x8) { vol = 0xC0 + (op>>4); } // panning slide else if (eff == 0x19) { // use last operand? if (!op) { vol = 0xD0; } // panning slide left else if (op & 0xF) { vol = 0xD0 + (op&0xF); } // panning slide right else if (op >> 4) { vol = 0xE0 + (op>>4); } } // porta to note else if (eff == 0x03) { vol = 0xF0 + (op>>4); } return vol; } // Convert a bunch of effects (srcSlot with numEffects) // into volume, eff and op (XM operands) // curChan is the current channel // workBuffers holds the last effect operands while processing // effectBuffer holds a bunch (numEffectsInBuffer) of remaining // effects from the last columns which might be allowed to go // into another channel // swapBuffer must be at least of effectBuffer size static void convertEffects(mp_ubyte* srcSlot, mp_sint32 numEffects, mp_ubyte& volume, mp_ubyte& eff, mp_ubyte& op, mp_sint32 curChan, TWorkBuffers& workBuffers, mp_ubyte* effectBuffer, mp_sint32& numEffectsInBuffer, mp_ubyte* swapBuffer, bool convertITTempoSlides) { mp_sint32 i; // If there is only one effect this goes into the effect column if (numEffects == 1) { volume = 0; convertEffect(srcSlot[2], srcSlot[3], eff, op, curChan, workBuffers, convertITTempoSlides); } else if (numEffects >= 2) { mp_sint32 oldNum = numEffects; numEffects+=numEffectsInBuffer; mp_ubyte* effects = swapBuffer; // Convert effects to be FT2 compatible // Result will be written in effects for (i = 0; i < oldNum; i++) { effects[i*2] = effects[i*2+1] = 0; convertEffect(srcSlot[2+i*2], srcSlot[2+i*2+1], effects[i*2], effects[i*2+1], curChan, workBuffers, convertITTempoSlides); } // Append replacable effects which are left from other columns for (i = 0; i < numEffectsInBuffer; i++) { mp_uint32 j = oldNum + i; effects[j*2] = effectBuffer[i*2]; effects[j*2+1] = effectBuffer[i*2+1]; } // Now "effects" contains all effects+operands // We try to find a home for them for (i = 0; i < numEffects; i++) { // could be MDL portamento + volslide if (numEffects >= 3 && effects[i*2] == 0x3 && effects[i*2+1] == 0) { for (mp_sint32 j = 0; j < numEffects; j++) { if (effects[j*2] == 0xA && effects[j*2+1] != 0) { effects[i*2] = 0x5; effects[i*2+1] = effects[j*2+1]; // clear out effects[j*2] = 0; effects[j*2+1] = 0; } } } // could be MDL vibrato + volslide if (numEffects >= 3 && effects[i*2] == 0x4 && effects[i*2+1] == 0) { for (mp_sint32 j = 0; j < numEffects; j++) { if (effects[j*2] == 0xA && effects[j*2+1] != 0) { effects[i*2] = 0x6; effects[i*2+1] = effects[j*2+1]; // clear out effects[j*2] = 0; effects[j*2+1] = 0; } } } } volume = 0; eff = 0; op = 0; for (i = 0; i < numEffects; i++) { // Effect nr. 1 => try to stuff into volume column first if (i == 0) { // If this is a portamento to note command and it's // volume column compatible we'll place it in the // volume column bool notePortaNotVolumeCompatible = ((effects[i*2] == 0x03) && (effects[i*2+1]&0xF)); if (convertToVolume(effects[i*2], effects[i*2+1]) && !volume && !notePortaNotVolumeCompatible) { volume = convertToVolume(effects[i*2], effects[i*2+1]); // clear out effects[i*2] = effects[i*2+1] = 0; } // didn't work else if ((effects[i*2] || effects[i*2+1]) && (!eff && !op)) { eff = effects[i*2]; op = effects[i*2+1]; // clear out effects[i*2] = effects[i*2+1] = 0; } } // for the rest of the effects, try to find // free space, take effect column first, volume column secondly else { if ((effects[i*2] || effects[i*2+1]) && (!eff && !op)) { eff = effects[i*2]; op = effects[i*2+1]; // clear out effects[i*2] = effects[i*2+1] = 0; } else if (convertToVolume(effects[i*2], effects[i*2+1]) && !volume) { volume = convertToVolume(effects[i*2], effects[i*2+1]); // clear out effects[i*2] = effects[i*2+1] = 0; } } } mp_uint32 numOutEffs = 0; // Scan what's left and sort out effects which are not allowed to go into another channel for (i = 0; i < numEffects; i++) { switch (effects[i*2]) { case 0x0B: case 0x0D: case 0x0E: switch (effects[i*2+1] >> 4) { case 0xE: goto takeEffect; } break; case 0x0F: takeEffect: effectBuffer[numOutEffs*2] = effects[i*2]; effectBuffer[numOutEffs*2+1] = effects[i*2+1]; numOutEffs++; break; } } numEffectsInBuffer = numOutEffs; //if (numOutEffs) // printf("%i\n", numOutEffs); } } static void fillWorkBuffers(const XModule* module, mp_uint32 orderListIndex, TWorkBuffers& workBuffers) { workBuffers.clearBuffers(); mp_ubyte* lastArpeggio = workBuffers.lastArpeggio; mp_ubyte* lastVolSlide = workBuffers.lastVolSlide; mp_ubyte* lastGVolSlide = workBuffers.lastGVolSlide; mp_ubyte* lastPorta = workBuffers.lastPorta; mp_ubyte* lastNote = workBuffers.lastNote; mp_ubyte* lastIns = workBuffers.lastIns; mp_ubyte* lastTempoSlide = workBuffers.lastTempoSlide; for (mp_uint32 orderIndex = 0; orderIndex < orderListIndex; orderIndex++) { mp_uint32 patIndex = module->header.ord[orderIndex]; TXMPattern* pattern = &module->phead[patIndex]; mp_sint32 slotSize = pattern->effnum*2+2; mp_sint32 channum = pattern->channum, effnum = pattern->effnum; mp_ubyte* srcSlot = pattern->patternData; for (mp_sint32 rows = 0; rows < pattern->rows; rows++) { for (mp_sint32 c = 0; c < channum; c++) { if (srcSlot[0]) lastNote[c] = srcSlot[0]; if (srcSlot[1]) lastIns[c] = srcSlot[1]; // ----------- store last operands for S3M/MDL/DBM effects --------------- const mp_ubyte* effSlot = srcSlot+2; for (mp_sint32 effCnt = 0; effCnt < effnum; effCnt++) { mp_ubyte effIn = *effSlot; mp_ubyte opIn = *(effSlot+1); effSlot+=2; if (effIn < 0x0f || effIn > 0x5a) continue; switch (effIn) { case 0x0f: if (opIn >= 32) workBuffers.bpm = opIn; break; case 0x10: workBuffers.globalVolume = (mp_ubyte)(((mp_sint32)opIn*64)/255); break; case 0x16: if (opIn >= 32) { workBuffers.bpm = opIn; } else { if (opIn) lastTempoSlide[c] = opIn; if (lastTempoSlide[c]) { mp_ubyte y = lastTempoSlide[c]>>4; mp_ubyte x = lastTempoSlide[c]&0xf; // tempo slide up if (y) { workBuffers.bpm+=x*(workBuffers.speed-1); if (workBuffers.bpm > 255) workBuffers.bpm = 255; } // tempo slide down else { workBuffers.bpm-=x*(workBuffers.speed-1); if (workBuffers.bpm < 32) workBuffers.bpm = 32; } } } break; case 0x1C: if (opIn) workBuffers.speed = opIn; break; case 0x20: if (!opIn) break; lastArpeggio[c] = opIn; break; case 0x43: if (!opIn) break; lastPorta[c] = opIn; break; case 0x44: if (!opIn) break; lastPorta[c] = opIn; break; case 0x45: if (!opIn) break; lastVolSlide[c] = opIn; break; case 0x46: if (!opIn) break; lastVolSlide[c] = opIn; break; case 0x47: if (!opIn) break; lastPorta[c] = opIn; break; case 0x48: if (!opIn) break; lastPorta[c] = opIn; break; case 0x49: if (!opIn) break; lastVolSlide[c] = opIn; break; case 0x52: workBuffers.baseBpm = opIn; break; case 0x59: { if (opIn) lastGVolSlide[c] = opIn; if (lastGVolSlide[c]) { mp_ubyte y = lastGVolSlide[c]>>4; mp_ubyte x = lastGVolSlide[c]&0xf; if (!(x == 0xF && y)&&!(y == 0xF && x)) { if (x && y) x = 0; if (y) { workBuffers.globalVolume+=y*(workBuffers.speed-1); if (workBuffers.globalVolume > 64) workBuffers.globalVolume = 64; } else if (x) { workBuffers.globalVolume-=x*(workBuffers.speed-1); if (workBuffers.globalVolume < 0) workBuffers.globalVolume = 0; } } else { // SUCKS if (!(x==0x0F && !y) && !(y==0x0F && !x)) { if (x==0x0F) { workBuffers.globalVolume += y; if (workBuffers.globalVolume > 64) workBuffers.globalVolume = 64; } else if (y==0x0F) { workBuffers.globalVolume -= y; if (workBuffers.globalVolume < 0) workBuffers.globalVolume = 0; } } } } break; } } } srcSlot+=slotSize; } } } } static mp_sint32 convertPattern(const XModule* module, const TXMPattern* srcPattern, mp_ubyte* dstPattern, mp_sint32 numChannels, TWorkBuffers& workBuffers, bool verbose) { bool convertITTempoSlides = module ? (module->getType() == XModule::ModuleType_IT) : false; bool newInsPTFlag = module ? ((module->header.flags & XModule::MODULE_PTNEWINSTRUMENT) != 0) : false; bool newInsST3Flag = module ? ((module->header.flags & XModule::MODULE_ST3NEWINSTRUMENT) != 0) : false; if (module) { mp_sint32 patNum = -1; for (mp_uint32 i = 0; i < module->header.patnum; i++) { if (srcPattern == &module->phead[i]) { patNum = i; break; } } if (patNum != -1) { mp_sint32 orderListPos = -1; for (mp_uint32 i = 0; i < module->header.ordnum; i++) { if (module->header.ord[i] == patNum) { orderListPos = i; break; } } if (orderListPos != -1) { fillWorkBuffers(module, orderListPos, workBuffers); } } } mp_ubyte* lastNote = workBuffers.lastNote; mp_ubyte* lastIns = workBuffers.lastIns; #ifdef MILKYTRACKER newInsPTFlag = false; #endif mp_ubyte* effectBuffer = new mp_ubyte[srcPattern->rows * numChannels * srcPattern->effnum]; mp_ubyte* swapBuffer = new mp_ubyte[srcPattern->rows * numChannels * srcPattern->effnum]; mp_sint32 numEffectsInBuffer = 0; for (mp_sint32 rows = 0; rows < srcPattern->rows; rows++) { bool correctPLMFarJump = false; mp_uint32 correctPLMFarJumpChannel = 0; mp_sint32 PLMFarJumpPos = 0; mp_sint32 PLMFarJumpRow = 0; mp_sint32 c; for (c = 0; c < srcPattern->channum; c++) { if (c < numChannels) { mp_ubyte* dstSlot = dstPattern+(rows*(numChannels*5) + (c*5)); mp_ubyte* srcSlot = srcPattern->patternData+(rows*(srcPattern->channum*(srcPattern->effnum*2+2)) + c*(srcPattern->effnum*2+2)); if (srcSlot[0]) lastNote[c] = srcSlot[0]; if (srcSlot[1]) { lastIns[c] = srcSlot[1]; //if (srcSlot[0]) // lastIns2[c] = srcSlot[1]; } mp_sint32 srcNote = (mp_sint32)srcSlot[0]; if (lastIns[c] && srcNote > 0 && srcNote <= XModule::NOTE_LAST) { srcNote+=workBuffers.noteRangeRemapper[lastIns[c]-1]; if (srcNote > XModule::NOTE_LAST || srcNote < 0) srcNote = 0; } if (srcNote == XModule::NOTE_OFF || srcNote == XModule::NOTE_CUT) srcNote = 97; else if (srcNote > 96) srcNote = 0; dstSlot[0] = srcNote; // instrument dstSlot[1] = srcSlot[1]; convertEffects(srcSlot, srcPattern->effnum, dstSlot[2], dstSlot[3], dstSlot[4], c, workBuffers, effectBuffer, numEffectsInBuffer, swapBuffer, convertITTempoSlides); // try to find workaround for PLM far-jump if (module && module->getType() == XModule::ModuleType_PLM && dstSlot[3] == 0x0B) { mp_ubyte* eff = srcSlot+2; for (mp_sint32 i = 0; i < srcPattern->effnum; i++) { if (eff[i*2] == 0x2B) { PLMFarJumpPos = eff[i*2+1]; PLMFarJumpRow = eff[((i+1)%srcPattern->effnum)*2+1]; correctPLMFarJump = true; correctPLMFarJumpChannel = c; break; } } } // * some nasty protracker style fixes // * trying to emulate protracker 3.15 behaviour with FT2 methods mp_sint32 i = srcSlot[1]; if (module && i && newInsPTFlag) { if (!dstSlot[0]) { if (module->instr[i-1].samp == 0 || module->instr[i-1].snum[0] == -1) { dstSlot[0] = 97; } else { mp_sint32 s = module->instr[i-1].snum[0]; if (s != -1 && !dstSlot[2]) dstSlot[2] = (mp_ubyte)(((mp_sint32)module->smp[s].vol*64)/255)+0x10; } } else { if (module->instr[i-1].samp == 0 || module->instr[i-1].snum[dstSlot[0]] == -1) { dstSlot[0] = 97; } } } else if (module && i && newInsST3Flag) { if (!dstSlot[0]) { if (!(module->instr[i-1].samp == 0 || module->instr[i-1].snum[0] == -1)) { mp_sint32 s = module->instr[i-1].snum[0]; if (s != -1 && !dstSlot[2]) dstSlot[2] = (mp_ubyte)(((mp_sint32)module->smp[s].vol*64)/255)+0x10; } else { dstSlot[0] = 0; } } } // * trying to emulate MTM behaviour // * Sample offset command triggers last note again if (module && module->getType() == XModule::ModuleType_MTM && !dstSlot[0] && dstSlot[3] == 0x9) dstSlot[0] = lastNote[c]; } if (correctPLMFarJump) { for (c = 0; c < srcPattern->channum; c++) { mp_ubyte* dstSlot = dstPattern+(rows*(numChannels*5) + (c*5)); if (dstSlot[3] == 0) { if (c > (signed)correctPLMFarJumpChannel) { dstSlot[3] = 0x0D; dstSlot[4] = (PLMFarJumpRow/10)*16+(PLMFarJumpRow%10); } else { mp_ubyte* srcSlot = dstPattern+(rows*(numChannels*5) + (correctPLMFarJumpChannel*5)); dstSlot[3] = srcSlot[3]; dstSlot[4] = srcSlot[4]; srcSlot[3] = 0x0D; srcSlot[4] = (PLMFarJumpRow/10)*16+(PLMFarJumpRow%10); } break; } } } } } delete[] swapBuffer; delete[] effectBuffer; return 0; } mp_sint32 packPattern(const mp_ubyte* pattern, mp_ubyte* outputPattern, mp_sint32 numRows, mp_sint32 numChannels) { mp_sint32 i,j,z,b1,x,y; mp_ubyte pack[6]; /*i = numRows*numChannels*5 - 1; while (i > 0 && !pattern[i]) i--; mp_sint32 max = i; printf("%i, %i\n", numRows*numChannels*5, max); */ // ------------------------- // pack pattern (xm packing) // ------------------------- j = z = b1 = 0; for (x=0; x < numRows; x++) for (y=0; y < numChannels; y++) { //if (z > max) // goto finishedPacking; memset(&pack,0,6); i=0; if (pattern[z]) { b1=1; pack[0]|=1; pack[i+1]=pattern[z]; i++; } if (pattern[z+1]) { b1=1; pack[0]|=2; pack[i+1]=pattern[z+1]; i++; } if (pattern[z+2]) { b1=1; pack[0]|=4; pack[i+1]=pattern[z+2]; i++; } if (pattern[z+3]) { b1=1; pack[0]|=8; pack[i+1]=pattern[z+3]; i++; } if (pattern[z+4]) { b1=1; pack[0]|=16; pack[i+1]=pattern[z+4]; i++; } if (i<5) { pack[0]|=128; memcpy(outputPattern+j,&pack,i+1); j+=i+1; } else { memcpy(outputPattern+j,pattern+z,5); j+=5; } z+=5; } //finishedPacking: return j; } static void sort(mp_sword* array,mp_sint32 l, mp_sint32 r) { mp_sint32 i,j; mp_sword x,y; i=l; j=r; x=array[(l+r)/2]; do { while (array[i](titleBuffer), reinterpret_cast(header.name), MP_MAXTEXT); if (strlen(titleBuffer) > 20) { mp_sint32 i = 0; mp_sint32 len = (mp_sint32)strlen(titleBuffer); while (titleBuffer[i] <= ' ' && i < len) i++; memcpy(titleBufferTemp, titleBuffer+i, strlen(titleBuffer) - i); f.write(titleBufferTemp, 1, 20); } else f.write(header.name, 1, 20); header.whythis1a = 0x1a; f.writeByte(header.whythis1a); #ifndef MILKYTRACKER f.write(header.tracker, 1, 20); #else f.write("MilkyTracker ", 1, 20); #endif header.ver = 0x104; f.writeWord(header.ver); header.hdrsize = 276; f.writeDword(header.hdrsize); f.writeWord(header.ordnum); f.writeWord(header.restart); mp_uword numChannels = header.channum&1 ? header.channum+1 : header.channum; f.writeWord(numChannels); f.writeWord(patNum); f.writeWord(insNum); f.writeWord(header.freqtab); f.writeWord(header.tempo); f.writeWord(header.speed); f.write(header.ord,1,256); mp_ubyte lowerNoteBound[256]; mp_ubyte upperNoteBound[256]; for (i = 0; i < 256; i++) { lowerNoteBound[i] = XModule::NOTE_LAST; upperNoteBound[i] = 0; } mp_ubyte* lastIns = new mp_ubyte[header.channum]; memset(lastIns, 0, header.channum); for (i = 0; i < patNum; i++) { TXMPattern* srcPattern = &phead[i]; mp_sint32 channum = srcPattern->channum >= header.channum ? header.channum : srcPattern->channum; for (mp_sint32 rows = 0; rows < srcPattern->rows; rows++) for (mp_sint32 c = 0; c < channum; c++) { mp_ubyte* srcSlot = srcPattern->patternData+(rows*(srcPattern->channum*(srcPattern->effnum*2+2)) + c*(srcPattern->effnum*2+2)); if (srcSlot[1]) lastIns[c] = srcSlot[1]; if (lastIns[c] && srcSlot[0] && srcSlot[0] < XModule::NOTE_OFF) { if (srcSlot[0] > upperNoteBound[lastIns[c]-1]) upperNoteBound[lastIns[c]-1] = srcSlot[0]; if (srcSlot[0] < lowerNoteBound[lastIns[c]-1]) lowerNoteBound[lastIns[c]-1] = srcSlot[0]; } } } delete lastIns; for (i = 0; i < insNum; i++) { mp_sint32 remapper = 0; if (upperNoteBound[i] > 96) remapper = upperNoteBound[i] - 96; if (remapper < lowerNoteBound[i]) workBuffers.noteRangeRemapper[i] = -remapper; #ifdef VERBOSE printf("%i - %i (%i)\n", lowerNoteBound[i], upperNoteBound[i], workBuffers.noteRangeRemapper[i]); #endif } for (i = 0; i < patNum; i++) { mp_sint32 numRows = phead[i].rows; if (numRows == 0) numRows = 1; mp_sint32 patChNum = (phead[i].channum+(phead[i].channum&1)); if (patChNum < numChannels) patChNum = numChannels; mp_sint32 len = numRows * patChNum * 5; mp_ubyte* srcPattern = new mp_ubyte[len]; mp_ubyte* dstPattern = new mp_ubyte[len]; memset(srcPattern, 0, len); memset(dstPattern, 0, len); convertPattern(this, &phead[i], srcPattern, numChannels, workBuffers, false); len = packPattern(srcPattern, dstPattern, numRows, numChannels); #ifdef VERBOSE printf("Uncompressed pattern size: %i, compressed: %i\n", numRows * numChannels * 5, len); #endif f.writeDword(9); f.writeByte(0); f.writeWord(numRows); f.writeWord(len); f.write(dstPattern, 1, len); //printf("Packed Size: %i\n", len); delete[] srcPattern; delete[] dstPattern; } for (i = 0; i < insNum; i++) { //mp_sint32 maxSample = instr[i].samp - 1; if (instr[i].samp > 0) { mp_sword usedSamples[256]; memset(usedSamples, 0, sizeof(usedSamples)); mp_sint32 numUsedSamples = 0; #ifdef MILKYTRACKER if (type == ModuleType_XM && header.smpnum == header.insnum*16) { // save all samples within an instrument rather than the // used ones (referenced by note mapping) for (j = 0; j < 16; j++) usedSamples[j] = i*16+j; numUsedSamples = 0; // find last used sample in instrument for (j = 15; j >= 0; j--) { mp_sint32 index = usedSamples[j]; char buffer[MP_MAXTEXT+1]; convertStr(buffer, reinterpret_cast(smp[index].name), MP_MAXTEXT); if (strlen(buffer) || smp[index].samplen) { numUsedSamples = j+1; break; } } } else #endif { // find referenced samples in instrument and save those for (j = 0; j < 96; j++) { mp_sword s = instr[i].snum[j]; if (s == -1) continue; bool used = false; for (k = 0; k < numUsedSamples; k++) { if (usedSamples[k] == s) { used = true; break; } } if (!used && smp[s].sample && smp[s].samplen) usedSamples[numUsedSamples++] = s; } sort(usedSamples, 0, numUsedSamples-1); } f.writeDword(numUsedSamples > 0 ? 263 : 29); f.write(&instr[i].name,1,22); f.writeByte(0); f.writeWord(numUsedSamples); if (!numUsedSamples) continue; f.writeDword(40); mp_ubyte nbu[96]; for (j = 0; j < 96; j++) { mp_sword s = instr[i].snum[j]; for (k = 0; k < numUsedSamples; k++) if (usedSamples[k] == s) { nbu[j] = k; break; } } f.write(nbu, 1, 96); mp_sint32 venvIndex = -1; mp_sint32 penvIndex = -1; for (j = 0; j < numUsedSamples; j++) { if (smp[usedSamples[j]].venvnum && venvIndex == -1) venvIndex = smp[usedSamples[j]].venvnum - 1; if (smp[usedSamples[j]].penvnum && penvIndex == -1) penvIndex = smp[usedSamples[j]].penvnum - 1; } #ifdef VERBOSE printf("%i, %i\n", venvIndex, penvIndex); #endif mp_sint32 step = 0; if (venvIndex >= 0 && venvIndex < header.volenvnum) { step = venvs[venvIndex].num > 12 ? venvs[venvIndex].num*256 / 12 : 256; l = 0; for (k = 0; k < 12; k++) { f.writeWord(venvs[venvIndex].env[l>>8][0]); f.writeWord(venvs[venvIndex].env[l>>8][1]>>2); l+=step; } } else { // emptyness for (k = 0; k < 12; k++) { f.writeWord(0); f.writeWord(0); } } if (penvIndex >= 0 && penvIndex < header.panenvnum) { step = penvs[penvIndex].num > 12 ? penvs[penvIndex].num*256 / 12 : 256; l = 0; for (k = 0; k < 12; k++) { f.writeWord(penvs[penvIndex].env[l>>8][0]); f.writeWord(penvs[penvIndex].env[l>>8][1]>>2); l+=step; } } else { // emptyness for (k = 0; k < 12; k++) { f.writeWord(0); f.writeWord(0); } } if (venvIndex >= 0 && venvIndex < header.volenvnum) f.writeByte(venvs[venvIndex].num > 12 ? 12 : venvs[venvIndex].num); // number of volume points else f.writeByte(0); // number of volume points if (penvIndex >= 0 && penvIndex < header.panenvnum) f.writeByte(penvs[penvIndex].num > 12 ? 12 : penvs[penvIndex].num); // number of panning points else f.writeByte(0); // number of panning points if (venvIndex >= 0 && venvIndex < header.volenvnum) { f.writeByte(venvs[venvIndex].sustain); // volume sustain point f.writeByte(venvs[venvIndex].loops); // volume start point f.writeByte(venvs[venvIndex].loope); // volume end point } else { f.writeByte(0); f.writeByte(0); f.writeByte(0); } if (penvIndex >= 0 && penvIndex < header.panenvnum) { f.writeByte(penvs[penvIndex].sustain); // panning sustain point f.writeByte(penvs[penvIndex].loops); // panning start point f.writeByte(penvs[penvIndex].loope); // panning end point } else { f.writeByte(0); f.writeByte(0); f.writeByte(0); } if (venvIndex >= 0 && venvIndex < header.volenvnum) f.writeByte(venvs[venvIndex].type); // volume type else f.writeByte(0); if (penvIndex >= 0 && penvIndex < header.panenvnum) f.writeByte(penvs[penvIndex].type); // panning type else f.writeByte(0); // take rest of the instrument info from first sample in the instrument // will probably not work for exported .MDL songs. // solution might be to create one instrument for each // sample and remap instrument field in the patterns l = usedSamples[0]; f.writeByte(smp[l].vibtype); // vibrato type f.writeByte(smp[l].vibsweep); // vibrato sweep f.writeByte(smp[l].vibdepth>>1); // vibrato depth f.writeByte(smp[l].vibrate); // vibrato rate if (instr[i].flags & TXMInstrument::IF_ITFADEOUT) f.writeWord(instr[i].volfade>>1); // volume fadeout else f.writeWord(smp[l].volfade>>1); // volume fadeout f.writeWord(0); // reserved mp_ubyte extra[20]; memset(extra, 0, sizeof(extra)); f.write(extra, 1, 20); for (j = 0; j < numUsedSamples; j++) { k = usedSamples[j]; f.writeDword((smp[k].type&16) ? smp[k].samplen <<1 : smp[k].samplen); f.writeDword((smp[k].type&16) ? smp[k].loopstart << 1 : smp[k].loopstart); f.writeDword((smp[k].type&16) ? smp[k].looplen << 1 : smp[k].looplen); mp_sint32 relnote = smp[k].relnote - workBuffers.noteRangeRemapper[i] + header.relnote; if (relnote<-96) relnote = -96; if (relnote>95) relnote = 95; mp_sint32 finetune = smp[k].finetune; // make some ULT linear finetune to finetune & relative note num approximation if (smp[k].freqadjust != 0) { mp_sint32 c4spd = getc4spd(relnote,finetune); c4spd+=((c4spd*smp[k].freqadjust)/32768); mp_sbyte rn,ft; convertc4spd(c4spd, &ft, &rn); finetune = ft; relnote = rn; } f.writeByte(smp[k].vol*64/255); f.writeByte((mp_sbyte)finetune); mp_ubyte type = smp[k].type; // Only alowed bits 0,1 and 3 type &= 3+16; // Bits 0 and 1 are not allowed to be set at the same time if ((type & 3) == 3) type &= ~1; f.writeByte(type); f.writeByte((smp[k].flags & 2) ? smp[k].pan : 0x80); f.writeByte((mp_sbyte)relnote); f.writeByte(0); f.write(smp[k].name, 1, 22); } for (j = 0; j < numUsedSamples; j++) { k = usedSamples[j]; if (!smp[k].sample) continue; if (smp[k].type & 16) { mp_sword* packedSampleData = new mp_sword[smp[k].samplen]; mp_sword b1,b2,b3; b1=0; for (mp_uint32 j = 0; j < smp[k].samplen; j++) { b3 = smp[k].getSampleValue(j); b2 = b3-b1; packedSampleData[j] = b2; b1 = b3; } f.writeWords((mp_uword*)packedSampleData, smp[k].samplen); delete[] packedSampleData; } else { mp_sbyte* packedSampleData = new mp_sbyte[smp[k].samplen]; mp_sbyte b1,b2,b3; b1=0; for (mp_uint32 j = 0; j < smp[k].samplen; j++) { b3 = smp[k].getSampleValue(j); b2 = b3-b1; packedSampleData[j] = b2; b1 = b3; } f.write(packedSampleData, 1, smp[k].samplen); delete[] packedSampleData; } } } else { f.writeDword(instr[i].samp > 0 ? 263 : 29); f.write(&instr[i].name,1,22); f.writeByte(0); f.writeWord(instr[i].samp); } } return 0; } static mp_uword swap(mp_uword x) { return (x>>8)+((x&255)<<8); } static mp_uword prep(mp_sint32 v) { if (v&1) v++; if (v >= 65536*2) v = 65536*2-1; return (mp_uword)(v>>1); } mp_sint32 XModule::saveProtrackerModule(const SYSCHAR* fileName) { static const char* modIDs[16] = {"2CHN","M.K.","6CHN","8CHN","10CH", "12CH","14CH","16CH","18CH","20CH", "22CH","24CH","26CH","28CH","30CH","32CH"}; static const mp_sint32 periods[12] = {1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,907}; static const mp_sint32 originalPeriods[] = {1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,906, 856,808,762,720,678,640,604,570,538,508,480,453, 428,404,381,360,339,320,302,285,269,254,240,226, 214,202,190,180,170,160,151,143,135,127,120,113, 107,101,95,90,85,80,75,71,67,63,60,56}; TWorkBuffers workBuffers; XMFile f(fileName, true); if (!f.isOpenForWriting()) return -1; f.write(header.name,1,20); mp_sint32 i,j,k; // - instruments ------------------------------------------- for (i = 0; i < 31; i++) { f.write(instr[i].name, 1, 22); // sample seems to be used if (instr[i].samp) { mp_sint32 s = -1; for (j = 0; j < 120; j++) if (instr[i].snum[j] >= 0) { s = instr[i].snum[j]; break; } if (s == -1) goto unused; mp_sint32 fti = (mp_sint32)smp[s].finetune + 128; if (!(fti & 0xF) && !smp[s].relnote) { k = (((mp_uint32)(fti-128)) >> 4) & 0xF; } else { mp_sint32 c4spd = getc4spd(smp[s].relnote, smp[s].finetune); mp_sint32 dc4 = abs(sfinetunes[0]-c4spd); k = 0; for (j = 1; j < 16; j++) if (abs(sfinetunes[j]-c4spd) < dc4) { dc4 = abs(sfinetunes[j]-c4spd); k = j; } } f.writeWord(swap(prep(smp[s].samplen))); f.writeByte(k); f.writeByte((mp_ubyte)(((mp_sint32)smp[s].vol*64)/255)); if (smp[s].type & 3) { mp_sint32 loopend = /*smp[s].loopstart + */smp[s].looplen; if (smp[s].type & 32) { f.writeWord(0); } else { if (!smp[s].loopstart && smp[s].looplen != smp[s].samplen) { f.writeWord(swap(1)); } else if (!smp[s].loopstart && smp[s].looplen == smp[s].samplen) { f.writeWord(0); } else f.writeWord(swap(prep(smp[s].loopstart))); } f.writeWord(swap(prep(loopend))); } else { f.writeWord(swap(0)); f.writeWord(swap(1)); } } else { unused: f.writeWord(swap(0)); f.writeByte(0); f.writeByte(0); f.writeWord(swap(0)); f.writeWord(swap(1)); } } // - orderlist ------------------------------------------- f.writeByte((mp_ubyte)header.ordnum); f.writeByte(127); mp_ubyte ord[128]; memset(ord, 0, sizeof(ord)); j = 0; for (i = 0; i < 128; i++) { if (header.ord[i] < 254) ord[j++] = header.ord[i]; else if (header.ord[i] == 255) break; } f.write(ord, 1, 128); mp_uword numChannels = header.channum&1 ? header.channum+1 : header.channum; if (numChannels < 2 || numChannels > 32) return -8; f.write(modIDs[(numChannels >> 1)-1], 1, 4); // - patterns ------------------------------------------- mp_sint32 numPatterns = 0; for (i = 0; i < 128; i++) { if (ord[i] > numPatterns) numPatterns = ord[i]; } for (i = 0; i < numPatterns+1; i++) { mp_sint32 numRows = phead[i].rows; if (numRows == 0) numRows = 1; mp_sint32 patChNum = (phead[i].channum+(phead[i].channum&1)); if (patChNum < numChannels) patChNum = numChannels; mp_sint32 len = numRows * patChNum * 5; mp_sint32 lenDst = (numRows < 64 ? 64 : numRows) * patChNum * 4; mp_ubyte* srcPattern = new mp_ubyte[len]; mp_ubyte* dstPattern = new mp_ubyte[lenDst]; memset(srcPattern, 0, len); memset(dstPattern, 0, lenDst); convertPattern(this, &phead[i], srcPattern, numChannels, workBuffers, false); for (mp_sint32 r = 0; r < 64; r++) for (mp_sint32 c = 0; c < numChannels; c++) { if (r < numRows) { mp_sint32 srcIndex = (r*numChannels*5)+(c*5); mp_sint32 dstIndex = (r*numChannels*4)+(c*4); mp_sint32 period = 0; mp_ubyte note = srcPattern[srcIndex]; //note = r+24+1; if (note) { note--; if (note >= 24 && note < 24+12*5) period = originalPeriods[note-24]; else period = (periods[note%12]*16>>((note/12)))>>2; } mp_ubyte ins = srcPattern[srcIndex+1]; if (ins > 31) ins = 0; mp_ubyte eff = 0; mp_ubyte op = 0; // First convert volume command to PT compatible effect again :) XModule::convertXMVolumeEffects(srcPattern[srcIndex+2], eff, op); mp_ubyte tmpEff = eff, tmpOp = op; convertEffect(tmpEff, tmpOp, eff, op, c, workBuffers, getType() == XModule::ModuleType_IT); // Having an effect? Overwrite what we already have... if (srcPattern[srcIndex+3] || srcPattern[srcIndex+4]) { eff = srcPattern[srcIndex+3]; op = srcPattern[srcIndex+4]; } if (eff > 0x0f) { eff = op = 0; } /*if (srcPattern[srcIndex+2] >= 0x10 && srcPattern[srcIndex+2] <= 0x50 && eff == 0 && op == 0) { eff = 0x0C; op = srcPattern[srcIndex+2] - 0x10; }*/ dstPattern[dstIndex] = (ins & 0xF0) + ((period>>8)&0x0F); dstPattern[dstIndex+1] = (mp_ubyte)(period&0xFF); dstPattern[dstIndex+2] = ((ins & 0x0F) << 4) + (eff); dstPattern[dstIndex+3] = op; } } f.write(dstPattern, 4, numChannels*64); delete[] srcPattern; delete[] dstPattern; } for (i = 0; i < header.smpnum; i++) { mp_uint32 smplen = prep(smp[i].samplen) << 1; if (smp[i].type & 16) { for (mp_uint32 j = 0; j < smplen; j++) f.writeByte(smp[i].getSampleValue(j) >> 8); } else { for (mp_uint32 j = 0; j < smplen; j++) f.writeByte(smp[i].getSampleValue(j)); } } return 0; } #ifdef MILKYTRACKER bool TXMPattern::saveExtendedPattern(const SYSCHAR* fileName) const { TWorkBuffers workBuffers; // ------ start --------------------------------- XMFile f(fileName, true); if (!f.isOpenForWriting()) return false; f.writeWord(0x1); f.writeWord(rows); mp_sint32 len = rows * channum * 5; mp_ubyte* srcPattern = new mp_ubyte[len]; memset(srcPattern, 0, len); convertPattern(NULL, this, srcPattern, channum, workBuffers, false); f.write(srcPattern, 1, len); delete[] srcPattern; return true; } bool TXMPattern::saveExtendedTrack(const SYSCHAR* fileName, mp_uint32 channel) const { if (channel >= channum) return false; TWorkBuffers workBuffers; // ------ start --------------------------------- XMFile f(fileName, true); if (!f.isOpenForWriting()) return false; f.writeWord(0x1); f.writeWord(rows); mp_sint32 len = rows * channum * 5; mp_ubyte* srcPattern = new mp_ubyte[len]; mp_ubyte* dstPattern = new mp_ubyte[len]; memset(srcPattern, 0, len); convertPattern(NULL, this, srcPattern, channum, workBuffers, false); for (mp_sint32 r = 0; r < rows; r++) { mp_sint32 srcIndex = r*this->channum*5 + channel*5; dstPattern[r*5] = srcPattern[srcIndex]; dstPattern[r*5+1] = srcPattern[srcIndex+1]; dstPattern[r*5+2] = srcPattern[srcIndex+2]; dstPattern[r*5+3] = srcPattern[srcIndex+3]; dstPattern[r*5+4] = srcPattern[srcIndex+4]; } f.write(dstPattern, 1, len); delete[] srcPattern; delete[] dstPattern; return true; } bool TXMPattern::loadExtendedPattern(const SYSCHAR* fileName) { XMFile f(fileName); if (f.readWord() != 0x01) return false; mp_uword rows = f.readWord(); if (rows == 0 || rows > 256) return false; mp_sint32 len = rows * 32 * 5; mp_ubyte* srcPattern = new mp_ubyte[len]; f.read(srcPattern, 1, len); // throw away old pattern delete[] patternData; this->rows = rows; this->channum = 32; this->effnum = 2; patternData = new mp_ubyte[rows*channum*(effnum*2+2)]; mp_ubyte* slot = srcPattern; mp_sint32 bc = 0; for (mp_sint32 r=0;r>4)+0x30; slot[4]=slot[4]&0xf; } if (slot[3]==0x21) { slot[3]=(slot[4]>>4)+0x40; slot[4]=slot[4]&0xf; } if (slot[0]==97) slot[0]=XModule::NOTE_OFF; patternData[bc]=slot[0]; patternData[bc+1]=slot[1]; XModule::convertXMVolumeEffects(slot[2], patternData[bc+2], patternData[bc+3]); patternData[bc+4]=slot[3]; patternData[bc+5]=slot[4]; bc+=6; slot+=5; } // for c } // for r delete[] srcPattern; return true; } bool TXMPattern::loadExtendedTrack(const SYSCHAR* fileName, mp_uint32 channel) { XMFile f(fileName); if (f.readWord() != 0x01) return false; mp_uword rows = f.readWord(); if (rows == 0 || rows > 256) return false; if (rows > this->rows) rows = this->rows; mp_sint32 len = rows * 32 * 5; mp_ubyte* srcPattern = new mp_ubyte[len]; f.read(srcPattern, 1, len); // throw away old pattern mp_ubyte* slot = srcPattern; mp_sint32 bc = 0, r; for (r=0;rchannum*(this->effnum*2+2) + channel*(this->effnum*2+2); char gl=0; for (mp_sint32 i=0;i>4)+0x30; slot[4]=slot[4]&0xf; } if (slot[3]==0x21) { slot[3]=(slot[4]>>4)+0x40; slot[4]=slot[4]&0xf; } if (slot[0]==97) slot[0]=XModule::NOTE_OFF; patternData[bc]=slot[0]; patternData[bc+1]=slot[1]; XModule::convertXMVolumeEffects(slot[2], patternData[bc+2], patternData[bc+3]); patternData[bc+4]=slot[3]; patternData[bc+5]=slot[4]; slot+=5; } // for r for (r = rows; r < this->rows; r++) { bc = r*this->channum*(this->effnum*2+2) + channel*(this->effnum*2+2); memset(patternData + bc, 0, (this->effnum*2+2)); } delete[] srcPattern; return true; } #endif mp_sint32 XModule::getNumUsedPatterns() { mp_sint32 i; mp_sint32 patNum = header.patnum; for (i = header.patnum - 1; i > 0; i--) { TXMPattern* pattern = &phead[i]; if (pattern->patternData == NULL) continue; mp_sint32 slotSize = pattern->effnum * 2 + 2; mp_sint32 patternSize = slotSize * pattern->channum * pattern->rows; bool empty = true; for (mp_sint32 j = 0; j < patternSize; j++) if (pattern->patternData[j]) { empty = false; patNum = i+1; break; } if (empty) { bool found = false; for (mp_sint32 j = 0; j < header.ordnum; j++) if (header.ord[j] == i) { found = true; break; } if (found) { patNum = i+1; break; } } else { patNum = i+1; break; } } if (i == 0) return 0; return patNum; } mp_sint32 XModule::getNumUsedInstruments() { mp_sint32 i; mp_sint32 insNum = header.insnum; for (i = header.insnum - 1; i > 0; i--) { mp_ubyte buffer[MP_MAXTEXT+1]; convertStr(reinterpret_cast(buffer), reinterpret_cast(instr[i].name), MP_MAXTEXT, false); if (strlen((char*)buffer)) { insNum = i+1; break; } if (instr[i].samp) { for (mp_sint32 j = 0; j < 120; j++) { mp_sint32 s = instr[i].snum[j]; if (s >= 0) { convertStr(reinterpret_cast(buffer), reinterpret_cast(smp[s].name), MP_MAXTEXT, false); if (strlen((char*)buffer) || (smp[s].sample && smp[s].samplen)) { insNum = i+1; goto insFound; } } } } } insFound: if (i == 0) return 0; return insNum; } milkytracker-0.90.85+dfsg/src/milkyplay/PlayerBase.h0000644000175000017500000002321211163403715021426 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerBase.h * MilkyPlay * * Created by Peter Barth on Thu Jan 20 2005. * */ #ifndef __PLAYERBASE_H__ #define __PLAYERBASE_H__ #include "ChannelMixer.h" class XModule; struct TPlayerChannelInfo { mp_ubyte note; mp_ubyte instrument; mp_ubyte volume; mp_ubyte panning; mp_ubyte numeffects; mp_ubyte effects[MP_NUMEFFECTS]; mp_ubyte operands[MP_NUMEFFECTS]; void clear() { memset(this, 0, sizeof(TPlayerChannelInfo)); } }; class PlayModeSettings { public: enum PlayModes { PlayMode_Auto, PlayMode_ProTracker2, PlayMode_ProTracker3, PlayMode_ScreamTracker3, PlayMode_FastTracker2, PlayMode_ImpulseTracker }; enum PlayModeOptions { PlayModeOptionFirst = 0, PlayModeOptionPanning8xx = 0, PlayModeOptionPanningE8x = 1, // Only affects PTK playback mode PlayModeOptionForcePTPitchLimit = 2, PlayModeOptionLast }; protected: bool options[PlayModeOptionLast]; PlayModes playMode; }; class PlayerBase : public ChannelMixer, public PlayModeSettings { private: struct TimeRecord { enum BITPOSITIONS { BITPOS_POS = 0, BITPOS_ROW = 8, BITPOS_TEMPO = 16, BITPOS_SPEED = 24, BITPOS_MAINVOL = 0, BITPOS_TICKER = 8 }; mp_uint32 posRowTempoSpeed; mp_sint32 mainVolumeTicker; TimeRecord() { } TimeRecord(mp_uint32 pos, mp_uint32 row, mp_uint32 tempo, mp_uint32 speed, mp_sint32 mainVol, mp_sint32 ticker) : posRowTempoSpeed((pos << BITPOS_POS) + (row << BITPOS_ROW) + (tempo << BITPOS_TEMPO) + (speed << BITPOS_SPEED)), mainVolumeTicker((mainVol << BITPOS_MAINVOL) + (ticker << BITPOS_TICKER)) { } }; TimeRecord* timeRecord; void reallocTimeRecord() { delete[] timeRecord; timeRecord = new TimeRecord[getNumBeatPackets()+1]; updateTimeRecord(); } void updateTimeRecord() { for (mp_uint32 i = 0; i < getNumBeatPackets()+1; i++) { timeRecord[i] = TimeRecord(poscnt, rowcnt, bpm, tickSpeed, mainVolume, ticker); } } public: enum PlayerTypes { PlayerType_Generic, // generic module player, can play most of the Protracker style formats PlayerType_FAR, // Farandole composer player PlayerType_IT, // Supposed to be a compatible IT replayer PlayerType_INVALID = -1 // NULL player :D }; protected: XModule* module; bool paused; // Player is paused bool halted; // Playing has been stopped (song is over) bool repeat; // Player will repeat song bool idle; // Player is mixing, but not processing song bool playOneRowOnly; // Player will only play one row and not advance to the next row (used for milkytracker) bool resetOnStopFlag; bool resetMainVolumeOnStartPlayFlag; mp_sint32 initialNumChannels; // Fixed number of channels, can be set manually in StartPlaying // otherwise it will be module->header.channum mp_sint32 mainVolume; // current song's main volume mp_sint32 tickSpeed; // our tickspeed mp_sint32 baseBpm; // Support digibooster REAL BPM value mp_sint32 bpm; // BPM speed mp_sint32 ticker; // runs from 0 to tickspeed-1 mp_sint32 rowcnt; // counts through each row in a pattern mp_sint32 poscnt; // counts through each index the pattern index table mp_int64 synccnt; // will increment 250 times per mixed second mp_sint32 lastUnvisitedPos; // the last order we visited before a new order has been set mp_uint32 adder, BPMCounter; mp_sint32 patternIndexToPlay; // Play special pattern, -1 = Play entire song mp_sint32 kick(); virtual mp_sint32 allocateStructures() { return 0; } virtual void clearEffectMemory() { } public: PlayerBase(mp_uint32 frequency); virtual ~PlayerBase(); virtual mp_sint32 adjustFrequency(mp_uint32 frequency); virtual mp_sint32 setBufferSize(mp_uint32 bufferSize); void setPlayMode(PlayModes mode) { playMode = mode; } PlayModes getPlayMode() const { return playMode; } void enable(PlayModeOptions option, bool b) { ASSERT(option>=PlayModeOptionFirst && option=PlayModeOptionFirst && optionidle = idle; } bool isIdle() const { return idle; } virtual void setRepeat(bool repeat) { this->repeat = repeat; } bool isRepeating() const { return repeat; } mp_sint32 pausePlaying(); mp_sint32 resumePlaying(bool unpause = true); bool isPaused() const { return paused; } // Set song main volume void setSongMainVolume(mp_ubyte volume) { mainVolume = volume; } mp_sint32 getSongMainVolume(mp_uint32 i = 0) const { return (timeRecord[i].mainVolumeTicker >> TimeRecord::BITPOS_MAINVOL) & 255; } // Reset sound mixer on song stop void resetOnStop(bool b) { resetOnStopFlag = b; } // Reset main volume when song is started void resetMainVolumeOnStartPlay(bool b) { resetMainVolumeOnStartPlayFlag = b; } virtual mp_sint32 getOrder(mp_uint32 i = 0) const { return (timeRecord[i].posRowTempoSpeed >> TimeRecord::BITPOS_POS) & 255; } virtual mp_sint32 getRow(mp_uint32 i = 0) const { return (timeRecord[i].posRowTempoSpeed >> TimeRecord::BITPOS_ROW) & 255; } virtual void getPosition(mp_sint32& order, mp_sint32& row, mp_uint32 i = 0) const { order = (timeRecord[i].posRowTempoSpeed >> TimeRecord::BITPOS_POS) & 255; row = (timeRecord[i].posRowTempoSpeed >> TimeRecord::BITPOS_ROW) & 255; } virtual mp_sint32 getLastUnvisitedPosition() const { return lastUnvisitedPos; } virtual void getPosition(mp_sint32& order, mp_sint32& row, mp_sint32& ticker, mp_uint32 i = 0) const { order = (timeRecord[i].posRowTempoSpeed >> TimeRecord::BITPOS_POS) & 255; row = (timeRecord[i].posRowTempoSpeed >> TimeRecord::BITPOS_ROW) & 255; ticker = (timeRecord[i].mainVolumeTicker >> TimeRecord::BITPOS_TICKER) & 255; } virtual mp_int64 getSyncCount() const { return synccnt; } virtual void nextPattern(); virtual void lastPattern(); virtual void setPatternPos(mp_uint32 pos, mp_uint32 row = 0, bool resetChannels = true, bool resetFXMemory = true); virtual void setTempo(mp_sint32 tempo) { bpm = tempo; updateTimeRecord(); } virtual void setSpeed(mp_sint32 speed) { if (speed != tickSpeed) { tickSpeed = speed; if (ticker >= speed) ticker = 0; updateTimeRecord(); } } virtual mp_sint32 getTempo(mp_uint32 i = 0) const { if (isPlaying() && !isIdle()) { return (timeRecord[i].posRowTempoSpeed >> TimeRecord::BITPOS_TEMPO) & 255; } return bpm; } virtual mp_sint32 getSpeed(mp_uint32 i = 0) const { if (isPlaying() && !isIdle()) { return (timeRecord[i].posRowTempoSpeed >> TimeRecord::BITPOS_SPEED) & 255;; } return tickSpeed; } virtual bool grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const { channelInfo.clear(); return false; } // milkytracker virtual void playNote(mp_ubyte chn, mp_sint32 note, mp_sint32 ins, mp_sint32 vol = -1) {} virtual void setPanning(mp_ubyte chn, mp_ubyte pan) {} }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/XIInstrument.cpp0000644000175000017500000004505011163403715022347 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * XIInstrument.cpp * MilkyPlay * * Created by Peter Barth on 07.03.05. * */ #include "XIInstrument.h" XIInstrument::XIInstrument() : owner(false) { memset(&samples, 0, sizeof(samples)); memset(sig, 0, sizeof(sig)); memset(name, 0, sizeof(name)); memset(tracker, 0, sizeof(tracker)); memset(nbu, 0, sizeof(nbu)); memset(&venv, 0, sizeof(venv)); memset(&penv, 0, sizeof(penv)); vibtype = vibsweep = vibdepth = vibrate = 0; volfade = 0; res = 0; memset(extra, 0, sizeof(extra)); numsamples = 0; } XIInstrument::XIInstrument(const XIInstrument& source) : owner(true) { memset(&samples, 0, sizeof(samples)); memcpy(sig, source.sig, sizeof(sig)); memcpy(name, source.name, sizeof(name)); memcpy(tracker, source.tracker, sizeof(tracker)); memcpy(nbu, source.nbu, sizeof(nbu)); venv = source.venv; penv = source.penv; vibtype = source.vibtype; vibsweep = source.vibsweep; vibdepth = source.vibdepth; vibrate = source.vibrate; volfade = source.volfade; res = source.res; memcpy(extra, source.extra, sizeof(extra)); numsamples = source.numsamples; for (mp_sint32 i = 0; i < numsamples; i++) { const TXMSample* src = &source.samples[i]; TXMSample* dst = &samples[i]; dst->samplen = src->samplen; dst->loopstart = src->loopstart; dst->looplen = src->looplen; dst->flags = src->flags; dst->vol = src->vol; dst->finetune = src->finetune; dst->type = src->type; dst->pan = src->pan; dst->relnote = src->relnote; dst->venvnum = src->venvnum; dst->penvnum = src->penvnum; dst->fenvnum = src->fenvnum; dst->vibenvnum = src->vibenvnum; dst->vibtype = src->vibtype; dst->vibsweep = src->vibsweep; dst->vibdepth = src->vibdepth; dst->vibrate = src->vibrate; dst->volfade = src->volfade; dst->res = src->res; memcpy(dst->name, src->name, sizeof(src->name)); dst->terminate = src->terminate; if (src->sample) { if (src->type & 16) { dst->sample = (mp_sbyte*)(TXMSample::allocPaddedMem(src->samplen*2)); TXMSample::copyPaddedMem(dst->sample, src->sample, src->samplen*2); } else { dst->sample = (mp_sbyte*)(TXMSample::allocPaddedMem(src->samplen)); TXMSample::copyPaddedMem(dst->sample, src->sample, src->samplen); } } } } XIInstrument::~XIInstrument() { mp_sint32 numSamples = sizeof(samples)/sizeof(TXMSample); if (owner) { for (mp_sint32 i = 0; i < numSamples; i++) TXMSample::freePaddedMem((mp_ubyte*)samples[i].sample); } } void XIInstrument::clean() { // find last used sample mp_sint32 numsmp = numsamples; mp_sint32 i; for (i = numsamples - 1; i >= 0; i--) { mp_ubyte buffer[MP_MAXTEXT+1]; XModule::convertStr(reinterpret_cast(buffer), reinterpret_cast(samples[i].name), MP_MAXTEXT, false); if (samples[i].sample || strlen(reinterpret_cast(buffer))) { numsmp = i+1; break; } } if (i == -1) numsmp = 0; numsamples = numsmp; } mp_sint32 XIInstrument::load(const SYSCHAR* fileName) { XMFile f(fileName); f.read(sig, 1, 21); if (memcmp(sig,"GF1PATCH",8) == 0) { f.seek(0); return loadPAT(f); } if (memcmp(sig,"Extended Instrument: ",21) != 0) return -8; f.read(name, 1, 22); if (f.readByte() != 0x1A) return -8; f.read(tracker, 1, 20); if (f.readWord() != 0x102) // read version return -8; // read note instrument table f.read(nbu, 1, 96); mp_sint32 k; for (k = 0; k < 96; k++) if (nbu[k]>15) nbu[k] = 15; // read envelopes memset(&venv,0,sizeof(venv)); memset(&penv,0,sizeof(penv)); for (k = 0; k < 12; k++) { venv.env[k][0] = f.readWord(); venv.env[k][1] = f.readWord()<<2; } for (k = 0; k < 12; k++) { penv.env[k][0] = f.readWord(); penv.env[k][1] = f.readWord()<<2; } // read envelope flags venv.num = f.readByte(); penv.num = f.readByte(); venv.sustain = f.readByte(); venv.loops = f.readByte(); venv.loope = f.readByte(); penv.sustain = f.readByte(); penv.loops = f.readByte(); penv.loope = f.readByte(); venv.type = f.readByte(); penv.type = f.readByte(); vibtype = f.readByte(); vibsweep = f.readByte(); vibdepth = f.readByte(); vibrate = f.readByte(); vibdepth<<=1; volfade = f.readWord(); volfade<<=1; res = f.readWord(); f.read(extra, 1, 20); numsamples = f.readWord(); if (numsamples > 16) numsamples = 16; // read sample infos for (k = 0; k < numsamples; k++) { samples[k].samplen = f.readDword(); samples[k].loopstart = f.readDword(); samples[k].looplen = f.readDword(); samples[k].vol = XModule::vol64to255(f.readByte()); samples[k].finetune = f.readByte(); samples[k].type = f.readByte(); samples[k].pan = f.readByte(); samples[k].relnote = f.readByte(); samples[k].res = f.readByte(); samples[k].volfade = volfade; samples[k].vibtype = vibtype; samples[k].vibsweep = vibsweep; samples[k].vibdepth = vibdepth; samples[k].vibrate = vibrate; f.read(samples[k].name, 1, 22); } // lazy guy TXMSample* smp = reinterpret_cast(&samples); // read samples for (k = 0; k < numsamples; k++) { if (!(smp[k].type&16) && smp[k].samplen) { smp[k].sample = (mp_sbyte*)TXMSample::allocPaddedMem(smp[k].samplen); if (smp[k].sample == NULL) { return -7; } owner = true; if (!XModule::loadSample(f,smp[k].sample,smp[k].samplen,smp[k].samplen,XModule::ST_DELTA)) { return -7; } } else if (smp[k].samplen) { smp[k].sample = (mp_sbyte*)TXMSample::allocPaddedMem(smp[k].samplen); if (smp[k].sample == NULL) { return -7; } owner = true; if (!XModule::loadSample(f,smp[k].sample,smp[k].samplen,smp[k].samplen>>1,XModule::ST_DELTA | XModule::ST_16BIT)) { return -7; } smp[k].samplen>>=1; smp[k].loopstart>>=1; smp[k].looplen>>=1; } } return 0; } static mp_sint32 gusFreqToFT2Note(mp_dword freq) { static const mp_dword scale_table[109] = { /*C-0..B-*/ /* Octave 0 */ 16351, 17323, 18354, 19445, 20601, 21826, 23124, 24499, 25956, 27500, 29135, 30867, /* Octave 1 */ 32703, 34647, 36708, 38890, 41203, 43653, 46249, 48999, 51913, 54999, 58270, 61735, /* Octave 2 */ 65406, 69295, 73416, 77781, 82406, 87306, 92498, 97998, 103826, 109999, 116540, 123470, /* Octave 3 */ 130812, 138591, 146832, 155563, 164813, 174614, 184997, 195997, 207652, 219999, 233081, 246941, /* Octave 4 */ 261625, 277182, 293664, 311126, 329627, 349228, 369994, 391995, 415304, 440000, 466163, 493883, /* Octave 5 */ 523251, 554365, 587329, 622254, 659255, 698456, 739989, 783991, 830609, 880000, 932328, 987767, /* Octave 6 */ 1046503, 1108731, 1174660, 1244509, 1318511, 1396914, 1479979, 1567983, 1661220, 1760002, 1864657, 1975536, /* Octave 7 */ 2093007, 2217464, 2349321, 2489019, 2637024, 2793830, 2959960, 3135968, 3322443, 3520006, 3729316, 3951073, /* Octave 8 */ 4186073, 4434930, 4698645, 4978041, 5274051, 5587663, 5919922, 6271939, 6644889, 7040015, 7458636, 7902150, 0xFFFFFFFF }; for (mp_uint32 no = 0; no < sizeof(scale_table)/sizeof(mp_dword)-1; no++) { if (scale_table[no] <= freq && scale_table[no+1] >= freq) return (no-12); } return 4*12; } #define PAT_CLEAN \ for (mp_uint32 j = 0; j < sizeof(nbu); j++) \ if (nbu[j] == 0xFF) nbu[j] = 0; mp_sint32 XIInstrument::loadPAT(XMFile& f) { struct TGF1PatchHeader { mp_ubyte sig[22]; mp_ubyte desc[60]; mp_ubyte insnum; mp_ubyte voicenum; mp_ubyte channum; mp_uword waveforms; mp_uword mastervol; mp_uint32 datasize; mp_ubyte reserved1[36]; mp_uword insID; mp_ubyte insname[16]; mp_uint32 inssize; mp_ubyte layers; mp_ubyte reserved2[40]; mp_ubyte layerduplicate; mp_ubyte layer; mp_uint32 layersize; mp_ubyte smpnum; mp_ubyte reserved3[40]; }; struct TGF1PatchSampleHeader { mp_ubyte wavename[7]; mp_ubyte fractions; mp_uint32 samplesize; mp_sint32 loopstart; mp_sint32 loopend; mp_uword samplerate; mp_uint32 lofreq; mp_uint32 hifreq; mp_uint32 rtfreq; mp_uword tune; mp_ubyte panning; mp_ubyte envelopes[4*3]; mp_ubyte tremolo[3]; mp_ubyte vibrato[3]; mp_ubyte smpmode; mp_uword scalefreq; mp_uword scalefac; mp_ubyte reserved[36]; }; TGF1PatchHeader header; f.read(header.sig, 1, 22); f.read(header.desc, 1, 60); header.insnum = f.readByte(); header.voicenum = f.readByte(); header.channum = f.readByte(); header.waveforms = f.readWord(); header.mastervol = f.readWord(); header.datasize = f.readDword(); f.read(header.reserved1, 1, 36); header.insID = f.readWord(); f.read(header.insname, 1, 16); header.inssize = f.readDword(); header.layers = f.readByte(); f.read(header.reserved2, 1, 40); header.layerduplicate = f.readByte(); header.layer = f.readByte(); header.layersize = f.readDword(); header.smpnum = f.readByte(); f.read(header.reserved3, 1, 40); // apply data memcpy(name, header.insname, 16); numsamples = header.smpnum <= 16 ? header.smpnum : 16; // lazy guy TXMSample* smp = reinterpret_cast(&samples); memset(nbu, 0xFF, sizeof(nbu)); for (mp_sint32 i = 0; i < numsamples; i++) { TGF1PatchSampleHeader smphdr; f.read(smphdr.wavename, 1, 7); smphdr.fractions = f.readByte(); smphdr.samplesize = f.readDword(); smphdr.loopstart = f.readDword(); smphdr.loopend = f.readDword(); smphdr.samplerate = f.readWord(); smphdr.lofreq = f.readDword(); smphdr.hifreq = f.readDword(); smphdr.rtfreq = f.readDword(); mp_sint32 lo = gusFreqToFT2Note(smphdr.lofreq); mp_sint32 hi = gusFreqToFT2Note(smphdr.hifreq); if (lo < 0) lo = 0; if (hi < 0) hi = 0; if (lo > 95) lo = 95; if (hi > 95) hi = 95; // sanity check if (lo > hi) { mp_sint32 s = lo; lo = hi; hi = s; } //if (i == numsamples - 1) // hi = 96; for (mp_sint32 j = lo; j < hi; j++) if (j >= 0 && j <= 95) if (nbu[j] == 0xFF) nbu[j] = i; //ld(x) = log(x)/log(2) #ifdef VERBOSE printf("%i:\nlo:%i,hi:%i,rt:%i,%i:%i\n", i, smphdr.lofreq, smphdr.hifreq, smphdr.rtfreq,lo,hi); #endif smphdr.tune = f.readWord(); smphdr.panning = f.readByte(); f.read(smphdr.envelopes, 3, 4); f.read(smphdr.tremolo, 1, 3); f.read(smphdr.vibrato, 1, 3); smphdr.smpmode = f.readByte(); smphdr.scalefreq = f.readWord(); smphdr.scalefac = f.readWord(); f.read(smphdr.reserved, 1, 36); samples[i].samplen = smphdr.samplesize; samples[i].loopstart = smphdr.loopstart; samples[i].looplen = smphdr.loopend - smphdr.loopstart; // disable looping on invalid loop range if ((mp_sint32)samples[i].looplen < 0) { samples[i].looplen = 0; smphdr.smpmode &= ~(1<<2); } samples[i].vol = XModule::vol127to255(header.mastervol); samples[i].pan = (mp_ubyte)XModule::pan15to255(smphdr.panning); #if 1 mp_sint32 no = gusFreqToFT2Note(smphdr.rtfreq); no-=48; //mp_sint32 rate = XModule::getc4spd(no, 0); XModule::convertc4spd(smphdr.samplerate/**rate/8363*/, &samples[i].finetune, &samples[i].relnote); mp_sint32 relnote = (mp_sint32)samples[i].relnote-no; // validate note range if (relnote < -96) relnote = -96; if (relnote > 95) relnote = 95; samples[i].relnote=relnote; #else XModule::convertc4spd(smphdr.samplerate, &samples[i].finetune, &samples[i].relnote); #endif // 16 bit sample if (smphdr.smpmode & 1) { samples[i].type = 16; } // looping if (smphdr.smpmode & 4) samples[i].type |= 1; // bi-loop if (smphdr.smpmode & 8) { samples[i].type &= ~3; samples[i].type |= 2; } memcpy(samples[i].name, smphdr.wavename, 7); if (!(smp[i].type&16) && smp[i].samplen) { smp[i].sample = (mp_sbyte*)TXMSample::allocPaddedMem(smp[i].samplen); if (smp[i].sample == NULL) { PAT_CLEAN; return -7; } owner = true; if (smphdr.smpmode & 2) { if (!XModule::loadSample(f,smp[i].sample,smp[i].samplen,smp[i].samplen,XModule::ST_UNSIGNED)) { PAT_CLEAN; return -7; } } else { if (!XModule::loadSample(f,smp[i].sample,smp[i].samplen,smp[i].samplen)) { PAT_CLEAN; return -7; } } } else if (smp[i].samplen) { smp[i].sample = (mp_sbyte*)TXMSample::allocPaddedMem(smp[i].samplen); if (smp[i].sample == NULL) { PAT_CLEAN; return -7; } owner = true; if (smphdr.smpmode & 2) { if (!XModule::loadSample(f,smp[i].sample,smp[i].samplen,smp[i].samplen>>1,XModule::ST_16BIT | XModule::ST_UNSIGNED)) { PAT_CLEAN; return -7; } } else { if (!XModule::loadSample(f,smp[i].sample,smp[i].samplen,smp[i].samplen>>1,XModule::ST_16BIT)) { PAT_CLEAN; return -7; } } smp[i].samplen>>=1; smp[i].loopstart>>=1; smp[i].looplen>>=1; } } PAT_CLEAN; return 0; } mp_sint32 XIInstrument::save(const SYSCHAR* fileName) { clean(); XMFile f(fileName, true); f.write("Extended Instrument: ", 1, 21); f.write(name, 1, 22); f.writeByte(0x1A); f.write("FastTracker v2.00 ", 1, 20); f.writeWord(0x102); f.write(nbu, 1, 96); mp_sint32 k; for (k = 0; k < 12; k++) { f.writeWord(venv.env[k][0]); f.writeWord(venv.env[k][1]>>2); } for (k = 0; k < 12; k++) { f.writeWord(penv.env[k][0]); f.writeWord(penv.env[k][1]>>2); } // read envelope flags f.writeByte(venv.num); f.writeByte(penv.num); f.writeByte(venv.sustain); f.writeByte(venv.loops); f.writeByte(venv.loope); f.writeByte(penv.sustain); f.writeByte(penv.loops); f.writeByte(penv.loope); f.writeByte(venv.type); f.writeByte(penv.type); f.writeByte(vibtype); f.writeByte(vibsweep); f.writeByte(vibdepth>>1); f.writeByte(vibrate); f.writeWord(volfade>>1); f.writeWord(0); memset(extra, 0, sizeof(extra)); f.write(extra, 1, 20); f.writeWord(numsamples); // read sample infos for (k = 0; k < numsamples; k++) { if (samples[k].type&16) { f.writeDword(samples[k].samplen<<1); f.writeDword(samples[k].loopstart<<1); f.writeDword(samples[k].looplen<<1); } else { f.writeDword(samples[k].samplen); f.writeDword(samples[k].loopstart); f.writeDword(samples[k].looplen); } f.writeByte(samples[k].vol*64/255); f.writeByte(samples[k].finetune); f.writeByte(samples[k].type); f.writeByte(samples[k].pan); f.writeByte(samples[k].relnote); f.writeByte(samples[k].res); f.write(samples[k].name, 1, 22); } // lazy guy TXMSample* smp = reinterpret_cast(&samples); // write samples for (k = 0; k < numsamples; k++) { if ((smp[k].type&16) && smp[k].samplen && smp[k].sample) { mp_sword* dst = new mp_sword[smp[k].samplen]; mp_sword last = 0; for (mp_uint32 i = 0; i < smp[k].samplen; i++) { dst[i] = smp[k].getSampleValue(i)-last; last = smp[k].getSampleValue(i); } f.writeWords((mp_uword*)dst, smp[k].samplen); delete[] dst; } else if (smp[k].samplen && smp[k].sample) { mp_sbyte* dst = new mp_sbyte[smp[k].samplen]; mp_sbyte last = 0; for (mp_uint32 i = 0; i < smp[k].samplen; i++) { dst[i] = smp[k].getSampleValue(i)-last; last = smp[k].getSampleValue(i); } f.write(dst, 1, smp[k].samplen); delete[] dst; } } return 0; } XIInstrument& XIInstrument::operator=(const XIInstrument& source) { // no self-assignment if (this != &source) { // free up whatever is in there if (owner) { mp_sint32 numSamples = sizeof(samples)/sizeof(TXMSample); for (mp_sint32 i = 0; i < numSamples; i++) TXMSample::freePaddedMem((mp_ubyte*)samples[i].sample); } memset(&samples, 0, sizeof(samples)); // owner is now true owner = true; // copy memcpy(sig, source.sig, sizeof(sig)); memcpy(name, source.name, sizeof(name)); memcpy(tracker, source.tracker, sizeof(tracker)); memcpy(nbu, source.nbu, sizeof(nbu)); venv = source.venv; penv = source.penv; vibtype = source.vibtype; vibsweep = source.vibsweep; vibdepth = source.vibdepth; vibrate = source.vibrate; volfade = source.volfade; res = source.res; memcpy(extra, source.extra, sizeof(extra)); numsamples = source.numsamples; for (mp_sint32 i = 0; i < numsamples; i++) { const TXMSample* src = &source.samples[i]; TXMSample* dst = &samples[i]; dst->samplen = src->samplen; dst->loopstart = src->loopstart; dst->looplen = src->looplen; dst->flags = src->flags; dst->vol = src->vol; dst->finetune = src->finetune; dst->type = src->type; dst->pan = src->pan; dst->relnote = src->relnote; dst->venvnum = src->venvnum; dst->penvnum = src->penvnum; dst->fenvnum = src->fenvnum; dst->vibenvnum = src->vibenvnum; dst->vibtype = src->vibtype; dst->vibsweep = src->vibsweep; dst->vibdepth = src->vibdepth; dst->vibrate = src->vibrate; dst->volfade = src->volfade; dst->res = src->res; memcpy(dst->name, src->name, sizeof(src->name)); dst->terminate = src->terminate; if (src->sample) { if (src->type & 16) { dst->sample = (mp_sbyte*)(TXMSample::allocPaddedMem(src->samplen*2)); TXMSample::copyPaddedMem(dst->sample, src->sample, src->samplen*2); } else { dst->sample = (mp_sbyte*)(TXMSample::allocPaddedMem(src->samplen)); TXMSample::copyPaddedMem(dst->sample, src->sample, src->samplen); } } } } return *this; } milkytracker-0.90.85+dfsg/src/milkyplay/PlayerBase.cpp0000644000175000017500000001674711163403715022000 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerBase.cpp * MilkyPlay * * Created by Peter Barth on Thu Jan 20 2005. * */ #include "PlayerBase.h" #include "XModule.h" mp_sint32 PlayerBase::kick() { // if the player hasn't been initialized until now => DO IT if (!isInitialized()) { mp_sint32 err = initDevice(); if (err!=0) { return err; } } // - configure player: -------------- // playing => song is not paused yet paused = false; // playing => song has not stopped yet halted = false; // repeat mode this->repeat = repeat; // set idle mode setIdle(idle); // - configure mixer: --------------- // mixer reset resetChannelsWithoutMuting(); // start playing (mixer flag) startPlay = true; // mix buffers startMixer(); //SetThreadPriority(hThread,THREAD_PRIORITY_NORMAL); // reset sample counters sampleCounter = 0; return 0; } PlayerBase::PlayerBase(mp_uint32 frequency) : ChannelMixer(32, frequency), timeRecord(NULL) { module = NULL; initialNumChannels = 8; mainVolume = 255; rowcnt = 0; // counts through each row in a pattern poscnt = 0; // counts through each index the pattern index table synccnt = 0; lastUnvisitedPos = 0; startPlay = false; paused = false; halted = false; idle = false; resetOnStopFlag = false; resetMainVolumeOnStartPlayFlag = true; adder = BPMCounter = 0; patternIndexToPlay = -1; playMode = PlayMode_Auto; reallocTimeRecord(); } PlayerBase::~PlayerBase() { //if (isPlaying()) // stopPlaying(); ChannelMixer::closeDevice(); delete[] timeRecord; } mp_sint32 PlayerBase::adjustFrequency(mp_uint32 frequency) { mp_uint32 lastNumBeatPackets = getNumBeatPackets()+1; mp_sint32 res = ChannelMixer::adjustFrequency(frequency); if (res < 0) return res; // nothing has changed if (lastNumBeatPackets == getNumBeatPackets()+1) return 0; reallocTimeRecord(); return 0; } mp_sint32 PlayerBase::setBufferSize(mp_uint32 bufferSize) { mp_uint32 lastNumBeatPackets = getNumBeatPackets()+1; mp_sint32 res = ChannelMixer::setBufferSize(bufferSize); if (res < 0) return res; // nothing has changed if (lastNumBeatPackets == getNumBeatPackets()+1) return 0; reallocTimeRecord(); return 0; } void PlayerBase::restart(mp_uint32 startPosition/* = 0*/, mp_uint32 startRow/* = 0*/, bool resetMixer/* = true*/, const mp_ubyte* customPanningTable/* = NULL*/, bool playOneRowOnly /* = false*/) { if (module == NULL) return; if (resetMixer) resetChannelsWithoutMuting(); // initialise crappy global variables baseBpm = 125; halted = false; synccnt = 0; rowcnt = startRow; poscnt = startPosition; lastUnvisitedPos = poscnt; synccnt = 0; this->playOneRowOnly = playOneRowOnly; if (resetMainVolumeOnStartPlayFlag) mainVolume = module->header.mainvol; // Clear position/speed lookup tables updateTimeRecord(); } ////////////////////////////////////////////////////// // setup mixer and start playing // return: 0 = no error // -1 = no free device // -2 = can't get device ID // -3 = can't get device capabilities // -4 = device can't handle requested format // -5 = can't close device // -6 = can't open device // -7 = out of memory ////////////////////////////////////////////////////// mp_sint32 PlayerBase::startPlaying(XModule *module, bool repeat /* = false*/, mp_uint32 startPosition /* = 0*/, mp_uint32 startRow /* = 0*/, mp_sint32 numChannels /* = -1*/, const mp_ubyte* customPanningTable /* = NULL*/, bool idle /* = false*/, mp_sint32 patternIndex /* = -1*/, bool playOneRowOnly /* = false*/) { this->module = module; if (numChannels == -1) initialNumChannels = module->header.channum; else initialNumChannels = numChannels; ChannelMixer::setNumChannels(initialNumChannels); this->idle = idle; this->repeat = repeat; mp_sint32 res = allocateStructures(); if (res != 0) return res; patternIndexToPlay = patternIndex; restart(startPosition, startRow, true, customPanningTable, playOneRowOnly); return PlayerBase::kick(); } mp_sint32 PlayerBase::stopPlaying() { stop(); mp_sint32 err = closeDevice(); module = NULL; return err; } mp_sint32 PlayerBase::pausePlaying() { if (!paused) { ChannelMixer::pause(); paused = true; } return 0; } mp_sint32 PlayerBase::resumePlaying(bool unpause/* = true*/) { if (paused && unpause) { paused = false; return resume(); } if (module) { // if the player hasn't been initialized until now => DO IT if (!isInitialized()) { mp_sint32 err = initDevice(); if (err!=0) { return err; } } startMixer(); startPlay = true; } return 0; } void PlayerBase::nextPattern() { if (!module) return; if (startPlay && !paused) { if (poscntheader.ordnum-1) { ChannelMixer::resetChannelsWithoutMuting(); rowcnt = 0; poscnt++; lastUnvisitedPos = poscnt; clearEffectMemory(); } } } void PlayerBase::lastPattern() { if (!module) return; if (startPlay && !paused) { if (poscnt>0) { //memset(chninfo,0,sizeof(TModuleChannel)*module->header.channum); ChannelMixer::resetChannelsWithoutMuting(); rowcnt = 0; poscnt--; lastUnvisitedPos = poscnt; clearEffectMemory(); } } } void PlayerBase::setPatternPos(mp_uint32 pos, mp_uint32 row/* = 0*/, bool resetChannels/* = true*/, bool resetFXMemory/* = true*/) { if (!module) return; if (startPlay && !paused && (pos < module->header.ordnum)) { //memset(chninfo,0,sizeof(TModuleChannel)*module->header.channum); if (resetChannels) ChannelMixer::resetChannelsWithoutMuting(); poscnt = pos; rowcnt = row; lastUnvisitedPos = poscnt; updateTimeRecord(); if (resetFXMemory) clearEffectMemory(); } } void PlayerBase::timerHandler(mp_sint32 currentBeatPacket) { timeRecord[currentBeatPacket] = TimeRecord(poscnt, rowcnt, bpm, tickSpeed, mainVolume, ticker); } milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderGeneric.h0000644000175000017500000000451111163403715023245 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderGeneric.h * MilkyPlay * * Created by Peter Barth on 16.09.05. * */ #ifndef SAMPLELOADERGENERIC__H #define SAMPLELOADERGENERIC__H #include "SampleLoaderAbstract.h" class SampleLoaderGeneric : public SampleLoaderAbstract { public: enum OutputFiletypes { OutputFiletypeWAV, OutputFiletypeIFF, OutputFiletypeAIFF, OutputFiletypeRAW }; SampleLoaderGeneric(const SYSCHAR* fileName, XModule& module); virtual bool identifySample(); virtual mp_sint32 getNumChannels(); virtual const char* getChannelName(mp_sint32 channelIndex); virtual mp_sint32 loadSample(mp_sint32 index, mp_sint32 channelIndex); mp_sint32 saveSample(const SYSCHAR* fileName, mp_sint32 index, OutputFiletypes type); private: SampleLoaderAbstract* getSuitableLoader(); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderSTM.cpp0000644000175000017500000001637611163403715021541 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderSTM.cpp * MilkyPlay Module Loader: ScreamTracker 2 * * Warning: This is an one-by-one conversion of an assembler version ;) * */ #include "Loaders.h" const char* LoaderSTM::identifyModule(const mp_ubyte* buffer) { // check for .STM module if (!memcmp(buffer+20,"!Scream!",8) || !memcmp(buffer+20,"BMOD2STM",8)) { return "STM"; } // this is not an .STM return NULL; } mp_sint32 LoaderSTM::load(XMFileBase& f, XModule* module) { mp_sint32 i,j; mp_ubyte buffer[128]; mp_uint32 samplePtrs[31]; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(buffer,1,48); memcpy(header->name,buffer,20); memcpy(header->sig,buffer+20,8); header->tempo = buffer[32]>>4; // default tickspeed header->speed = 124; // default tempo header->patnum = buffer[33]; // number of patterns header->mainvol = XModule::vol64to255(buffer[34]); header->flags = module->MODULE_OLDS3MVOLSLIDES | module->MODULE_STMARPEGGIO; header->insnum = 31; // number of instruments //header->smpnum = 31; // number of samples header->channum = 4; mp_uint32 s = 0; for (i = 0; i < header->insnum; i++) { f.read(buffer,1,32); memcpy(instr[i].name,buffer,12); mp_uint32 size = LittleEndian::GET_WORD(buffer+16); mp_uint32 loopstart = LittleEndian::GET_WORD(buffer+18); mp_uint32 loopend = LittleEndian::GET_WORD(buffer+20); mp_ubyte volume = XModule::vol64to255(buffer[22]); // fix for janis.stm if (size < 32) { instr[i].samp = 0; } else { memcpy(smp[s].name,buffer,12); samplePtrs[s] = (mp_uint32)LittleEndian::GET_WORD(buffer+14)<<4; XModule::convertc4spd((LittleEndian::GET_WORD(buffer+24)*8363)/8448,&smp[s].finetune,&smp[s].relnote); smp[s].flags = 1; smp[s].samplen = size; smp[s].loopstart = loopstart; smp[s].looplen = loopend; smp[s].vol = volume; instr[i].samp = 1; for (mp_sint32 j = 0; j < 120; j++) instr[i].snum[j] = s; if (smp[s].looplen < 0xFFFF && smp[s].looplen != 0) { if (smp[s].looplen > smp[s].samplen) smp[s].looplen = smp[s].samplen; if ((smp[s].loopstart+smp[s].looplen)>smp[s].samplen) smp[s].looplen-=(smp[s].loopstart+smp[s].looplen)-smp[s].samplen; smp[s].type=1; } else smp[s].looplen = 0; s++; } } header->smpnum = s; f.read(buffer,1,128); j = 0; for (i = 0; i < 128; i++) { if (buffer[i] == 'c') break; else header->ord[j++] = buffer[i]; } header->ordnum = j; mp_ubyte* srcPattern = new mp_ubyte[64*4*4]; if (srcPattern == NULL) return -7; for (i = 0; i < header->patnum;i++) { f.read(srcPattern,1,64*4*4); phead[i].rows = 64; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*6]; // out of memory? if (phead[i].patternData == NULL) { delete[] srcPattern; return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum*6); mp_sint32 r,c,cnt = 0,offs = 0; for (r=0;r<64;r++) { for (c=0;cchannum;c++) { mp_ubyte note = srcPattern[offs]; mp_ubyte ins = 0; mp_ubyte b1 = srcPattern[offs+1]; mp_ubyte b2 = srcPattern[offs+2]; mp_ubyte op = srcPattern[offs+3]; mp_ubyte nEff = 0; mp_ubyte nOp = 0; if (note != 255) { note = (((note>>4)+2)*12+(note&0xf))+1; } else note = 0; ins = b1>>3; mp_ubyte vol = (b1&0x07)+((b2&0xF0)>>1); if (vol<=64) { phead[i].patternData[cnt+2] = 0x0C; phead[i].patternData[cnt+3] = XModule::vol64to255(vol); } switch (b2&0xf) { // Arpeggio case 0x00: if (op != 00) { nEff = 0x20; nOp = op; } break; // set tickspeed case 0x01: nEff = 0x1C; nOp = op>>4; break; // position jump case 0x02: nEff = 0x0B; nOp = op; // pattern break case 0x03: nEff = 0x0D; nOp = op; break; // s3m volslide case 0x04: nEff = 0x49; nOp = op; break; // porta down case 0x05: nEff = 0x48; nOp = op; break; // porta up case 0x06: nEff = 0x47; nOp = op; break; // porta to note case 0x07: nEff = 0x03; nOp = op; break; // vibrato case 0x08: nEff = 0x04; nOp = op; break; // tremor case 0x09: nEff = 0x1D; nOp = op; break; // s3m arpeggio (in combination with the STMARPEGGIO flag) case 0x0A: nEff = 0x20; nOp = op; break; // vibrato + volume slide case 0x0B: nEff = 0x06; nOp = op; break; // tone porta + volume slide case 0x0C: nEff = 0x05; nOp = op; break; // tremolo case 0x0D: nEff = 0x07; nOp = op; break; // sample offset case 0x0E: case 0x0F: nEff = 0x09; nOp = op; break; } phead[i].patternData[cnt]=note; phead[i].patternData[cnt+1]=ins; phead[i].patternData[cnt+4]=nEff; phead[i].patternData[cnt+5]=nOp; cnt+=6; offs+=4; } } } delete[] srcPattern; for (i = 0; i < header->smpnum; i++) { mp_uint32 smpOffs = samplePtrs[i]; if (smpOffs) { f.seekWithBaseOffset(smpOffs); if (module->loadModuleSample(f, i) != 0) return -7; } } strcpy(header->tracker,"Screamtracker 2"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriver_NULL.h0000644000175000017500000000471411163403715022454 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_NULL.h * MilkyPlay * * Created by Peter Barth on 29.07.05. * */ #ifndef __AUDIODRIVER_NULL_H__ #define __AUDIODRIVER_NULL_H__ #include "AudioDriverBase.h" #include "MilkyPlayTypes.h" class AudioDriver_NULL : public AudioDriverBase { protected: mp_uint32 numSamplesWritten; mp_sword* compensateBuffer; public: AudioDriver_NULL(); virtual ~AudioDriver_NULL(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual mp_uint32 getNumPlayedSamples() const { return numSamplesWritten; }; virtual const char* getDriverID() { return "NULL"; } virtual mp_sint32 getPreferredBufferSize() const { return 0; } virtual void advance(); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriver_WAVWriter.h0000644000175000017500000000432011163403715023525 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_WAVWriter.h * MilkyPlay * * Created by Peter Barth on 29.07.05. * */ #ifndef __AUDIODRIVER_WAVWRITER_H__ #define __AUDIODRIVER_WAVWRITER_H__ #include "AudioDriver_NULL.h" #include "XMFile.h" class WAVWriter : public AudioDriver_NULL { private: XMFile* f; mp_sint32 mixFreq; public: WAVWriter(const SYSCHAR* fileName); virtual ~WAVWriter(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual const char* getDriverID() { return "WAVWriter"; } virtual void advance(); bool isOpen() { return f != NULL; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/PlayerGeneric.h0000644000175000017500000005611611163403715022141 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerGeneric.h * MilkyPlay * * This class is meant to be a wrapper class that handles all * different sorts of players for different Module types. * * Created by Peter Barth on 21.01.05. * */ #ifndef __PLAYERGENERIC_H__ #define __PLAYERGENERIC_H__ #include "MilkyPlayTypes.h" #include "XMFile.h" #include "ChannelMixer.h" #include "PlayerBase.h" class XModule; class AudioDriverInterface; class PlayerGeneric : public MixerSettings, public PlayModeSettings { private: class MasterMixer* mixer; class MixerNotificationListener* listener; // the current PlayerBase instance PlayerBase* player; // ---------------------------------------------------------- // Since we are destroying and creating PlayerBase instances // within this class there is no way to keep the settings // we set for this special instance, so we need to store them // not only in the instance but also in this class: // ---------------------------------------------------------- // remember mixer type ChannelMixer::ResamplerTypes resamplerType; // remember mixing frequency mp_uint32 frequency; // overwrite default audiodriver AudioDriverInterface* audioDriver; // remember buffersize mp_uint32 bufferSize; // remember sample shift mp_uint32 sampleShift; // this flag indicates if audiodriver tries to compensate for 2^n buffer sizes bool compensateBufferFlag; // This contains the string of the selected audio driver char* audioDriverName; // remember paused state bool paused; // remember if mixing has been disabled bool disableMixing; // remember if filters are allowed bool allowFilters; // remember idle state bool idle; // remember to play only one row bool playOneRowOnly; // remember to repeat the song bool repeat; // remember to reset on stop bool resetOnStopFlag; // remember to reset main volume on start bool resetMainVolumeOnStartPlayFlag; // remember to auto adjust the peak bool autoAdjustPeak; // remember our mixer mastervolume mp_sint32 masterVolume; // remember our mixer panning separation mp_sint32 panningSeparation; // remember maximum amount of virtual channels mp_sint32 numMaxVirChannels; void adjustSettings(); /** * Determine the best player type for a given module * @param module the module which should be played * @return an enum with identifies the player type */ static PlayerBase::PlayerTypes getPreferredPlayerType(XModule* module); /** * Return an actual player instance for a given module * This instance MUST be deleted after usage * @param module the module which should be played * @param audioDriver you can specify your own audioDriver instance, if this is NULL the default driver will be selected * @return a PlayerBase instance is returned */ PlayerBase* getPreferredPlayer(XModule* module) const; public: /** * Construct a PlayerGeneric object for a given output frequency * @param frequency output frequency for the mixer */ PlayerGeneric(mp_sint32 frequency, AudioDriverInterface* audioDriver = NULL); /** * Destructor */ ~PlayerGeneric(); /////////////////////////////////////////////////////////////////////////////////////////// // -------------------------- wrapping mixer specific stuff ------------------------------- /////////////////////////////////////////////////////////////////////////////////////////// /** * Specify mixer type. This basically selects the output quality * @param type mixer type * @see MixerSettings */ void setResamplerType(ResamplerTypes type); /** * Specify mixer type with two flags indicating whether to interpolate or to do volume ramping. * @param type mixer type * @see MixerSettings */ void setResamplerType(bool interpolation, bool ramping); /** * Get the mixer type * @return mixer type * @see setResamplerType */ ChannelMixer::ResamplerTypes getResamplerType() const; /** * Specify the amount of which the sample data is right-shifted before sent to the sound driver * This is an amplify in the opposite direction (shift value of 2 means 25% of the original volume) * @param shift sample data shift amount */ void setSampleShift(mp_sint32 shift); /** * Get the shift amount * @return shift amount * @see setSampleShift */ mp_sint32 getSampleShift() const; /** * Doesn't work. Don't call. * @param b true or false */ void setPeakAutoAdjust(bool b); /** * Set the desired output frequency * It's up the the driver if the wanted frequency is possible or not * Note that there is no fallback, if the driver can't handle the frequency * your song will probably sound to fast or to slow * @param frequency output frequency for the mixer */ mp_sint32 adjustFrequency(mp_uint32 frequency); /** * Get the current mixer output frequency * @return output frequency * @see adjustFrequency */ mp_sint32 getMixFrequency() const; /** * Convert number of beat backets to buffer size: * The ChannelMixer class uses a fixed 250Hz timer so the mixer size is * always a multiple of CurrentOutputFrequency / 250 * E.g. if you're mixing at 44100Hz the buffer size is always a multiple * of 176 samples. * Thus specifying a value of 10 will result in a buffer of 1760 samples size. * Important: Some sound device drivers don't allow buffer sizes which are * not multiple of 2^n that's why on some systems setting up the sound * device with such a buffer size might not work. Use adjustBufferSize with * a 2^n buffer size or call setPowerOfTwoCompensationFlag(true). * * @param numBeats The number of beat "packets" */ mp_sint32 beatPacketsToBufferSize(mp_uint32 numBeats); /** * Here for legacy reasons, sets the buffer size according to the number * of beat packets (see function above) */ mp_sint32 adjustBufferSize(mp_uint32 numBeats); /** * Set the desired buffer size * Important: Some sound device drivers don't allow buffer sizes which are * not multiple of 2^n that's why on some systems you might call * setPowerOfTwoCompensationFlag(true) to always round to the next 2^n buffer size * * @param bufferSize buffer size description */ mp_sint32 setBufferSize(mp_uint32 bufferSize); /** * Tell the sound driver to force forcing 2^n buffer blocks if possible * @param b true or false * @see getPowerOfTwoCompensationFlag, audioDriverSupportsPowerOfTwoCompensation */ mp_sint32 setPowerOfTwoCompensationFlag(bool b); /** * Query if the sound driver is currently forcing 2^n buffer blocks * @return true or false * @see setPowerOfTwoCompensationFlag, audioDriverSupportsPowerOfTwoCompensation */ bool getPowerOfTwoCompensationFlag() const; /** * Query the the sound drivers name * @return Name of the audio driver. Do NOT save this value. It's only temporary and may change. */ const char* getCurrentAudioDriverName() const; /** * Select an audio driver from the available list of audio drivers * specified by the given name * If the return value is false the select has failed but * the default driver has been selected instead so playback * is still possible * @param name Full qualified name of the audio driver * @return true or false indicating if the selection has succeeded */ bool setCurrentAudioDriverByName(const char* name); /** * Get state information about the mixer: Check if the mixer has been initialized * @return true or false */ bool isInitialized() const; /** * Get state information about the player: Check if we're playing a song * @return true or false */ bool isPlaying() const; /** * Get how many samples have been played since the player has started playing * this is only 32 bit and might overflow quickly depending on your output frequency * @return number of samples played */ mp_int64 getSampleCounter() const; /** * Reset the sample counter * @see getSampleCounter */ void resetSampleCounter(); /** * For hi latency audio drivers this might return * a pointer to the sample which is currently played * in the mixing BUFFER!!! Don't depend on this function * it might not work on your system * @return the position of the driver within the sample buffer */ mp_sint32 getCurrentSamplePosition() const; mp_sint32 getCurrentBeatIndex(); /** * Get a sample from the current mixing buffer * a pointer to the sample which is currently played * in the mixing BUFFER!!! Don't depend on this function * it might not work on your system * @param position position within the mixing buffer * @param channel the channel (0 = left, 1 = right [mixing is always stereo]) * @return a sample between -32768 and 32768 */ mp_sint32 getCurrentSample(mp_sint32 position, mp_sint32 channel); /** * Get some peaks around the position "pos" in the current mixing buffer * Just looks good when displayed, is not a perfect peak detector * @param position in the buffer, needs to be within the valid range * @param channel the channel (0 = left, 1 = right [mixing is always stereo]) */ mp_sint32 getCurrentSamplePeak(mp_sint32 position, mp_sint32 channel); /** * Reset channels. All channels will immediately stop playing after this has been called. */ void resetChannels(); /** * How many active channels do we have? * @return return the number of channels which are active in the mixing process */ mp_sint32 getNumActiveChannels() const; /** * How many channels have been allocated for playback? * @return return the number of channels allocated for playback */ mp_sint32 getNumAllocatedChannels() const; /////////////////////////////////////////////////////////////////////////////////////////// // -------------------------- wrapping player specific stuff ------------------------------ /////////////////////////////////////////////////////////////////////////////////////////// /** * Set a specified play mode * @param mode play mode * @see PlayModeSettings */ void setPlayMode(PlayModes mode); /** * Get current selected play mode * @return current play mode * @see setPlayMode */ PlayModes getPlayMode() const; /** * Switch special playmode flags, only applies to players * which are able to play the kind of modules of interest * @param option option to enable or disable * @param b enable or disable option */ void enable(PlayModeOptions option, bool b); /** * See if a special flags is enabled for the current player * @param option option to enable or disable * @return true if option is enabled, false otherwise */ bool isEnabled(PlayModeOptions option) const; /** * Restart playback * @param startPosition start position within the song * @param startRow start position within the pattern * @param resetMixer whether or not to reset the mixer * @param customPanningTable When specifying a custom panning table the panning default from the module is ignored * @param playOneRowOnly stop after playing exactly ONE row */ void restart(mp_uint32 startPosition = 0, mp_uint32 startRow = 0, bool resetMixer = true, const mp_ubyte* customPanningTable = NULL, bool playOneRowOnly = false); /** * Reset everything. Includes audio device if there is one. */ void reset(); /** * Reset speed settings to the default. */ void resetAllSpeed(); /** * Start playback * @param module module to play * @param repeat repeat song? * @param startPosition start position within the song * @param startRow start position within the pattern * @param numChannels number of channels to be allocated for playback, supply -1 for auto adjust * @param customPanningTable When specifying a custom panning table the panning default from the module is ignored * @param idle whether or not to start in idle mode * @param patternIndex this specifies to play a given pattern only, supply -1 to play entire song instead of just one pattern */ mp_sint32 startPlaying(XModule* module, bool repeat = false, mp_uint32 startPosition = 0, mp_uint32 startRow = 0, mp_sint32 numChannels = -1, const mp_ubyte* customPanningTable = NULL, bool idle = false, mp_sint32 patternIndex = -1, bool playOneRowOnly = false); /** * Specify a pattern to be played instead of playing the entire song * @param patternIndex this specifies to play a given pattern only, supply -1 to play entire song instead of just one pattern */ void setPatternToPlay(mp_sint32 patternIndex); /** * Stop playing, also stops audio device (easy, huh?) * @return error code (0 = everything is fine) */ mp_sint32 stopPlaying(); /** * Check if song has been stopped (either the song did something stupid or it played once and repeat is false) * NOTE: This will not mean that audio streaming has stopped, it only tells you that the song hit a position * that was already played and if it's not in repeat mode it will halt. * If the player is in repeat mode this will most probably always return false and even if it is true you need * to still call stopPlaying() if you want to play another song. * @return true or false */ bool hasSongHalted() const; /** * This is probably only used by MilkyTracker * You can tell the core not to play any song, but the mixer is still active * So if you play samples on the channels manually they will still be mixed * @param idle true = go into idle mode stop song but mixer stays active, false = start playing the song again */ void setIdle(bool idle); /** * Check if player is in idle state * @return true or false * @see setIdle */ bool isIdle() const; /** * Tell the player to enable/disable repeating * @param repeat true or false */ void setRepeat(bool repeat); /** * Check if player is repeating * @return true or false * @see setRepeat */ bool isRepeating() const; /** * Pause the player */ mp_sint32 pausePlaying(); /** * Resume from paused state * @see pausePlaying */ mp_sint32 resumePlaying(); /** * Check if player is in paused state * @return true or false * @see pausePlaying */ bool isPaused() const; /** * Turn mixer off, but song is still played * This is used for calculating the song length: * Song is played internally but the entire mixer * is disabled so playing will be really fast * @param b true or false */ void setDisableMixing(bool b); /** * Allow DSP filters. * IT uses a low pass resonanance IIR filter * which can be disabled to save CPU power. * @param b true or false */ void setAllowFilters(bool b); /** * Tell if filters are allowed. * @return true if filters are enabled. * @see setAllowFilters */ bool getAllowFilters() const; /** * Set master volume for the mixer * @param vol Master volume between 0 and 256 */ void setMasterVolume(mp_sint32 vol); /** * Return the master volume for the mixer * @return master volume (usually a volume between 0 and 256) * @see setMasterVolume */ mp_sint32 getMasterVolume() const; /** * Set panning separation for the mixer * @param separation Panning separation between 0 (none) and 256 (full) */ void setPanningSeparation(mp_sint32 separation); /** * Return the panning separation for the mixer * @return Panning separation between 0 (none) and 256 (full) * @see setPanningSeparation */ mp_sint32 getPanningSeparation() const; /** * Return the main volume of the currently played song, this is NOT the mixer master volume * @return main volume between 0 and 255 */ mp_sint32 getSongMainVolume() const; /** * Which row in the current pattern is the player at? * @return current row in current pattern */ mp_sint32 getRow() const; /** * Which order position is the player at? * @return order position from 0 to 255 (might return bigger values in future) */ mp_sint32 getOrder() const; /** * Return both, order and row at the same time, * might be needed for sync reasons (MilkyTracker) * Retrieving the row requires very low latency output, so it might * not be as precise as you want to have it * @param order reference to an 32 bit integer to hold the order * @param row reference to an 32 bit integer to hold the row */ void getPosition(mp_sint32& order, mp_sint32& row) const; mp_sint32 getLastUnvisitedPosition() const; /** * Return order, row and ticker at the same time, * might be needed for sync reasons (MilkyTracker) * Retrieving the ticker/row requires very low latency output, so it might * not be as precise as you want to have it * @param order reference to an 32 bit integer to hold the order * @param row reference to an 32 bit integer to hold the row * @param ticker reference to an 32 bit integer to hold the ticker */ void getPosition(mp_sint32& order, mp_sint32& row, mp_sint32& ticker) const; /** * Return the number of rows played since the player has started * Might become handy for sync reasons. * @return number of rows played since start */ mp_int64 getSyncCount() const; /** * Return number of samples played but this time the * audio driver will return this value. * This is also used for VERY accurate synching especially * using MMSYSTEM. The value will be resettet on calling stopPlaying() * @return number of samples the audiodriver has played since start */ mp_uint32 getSyncSampleCounter() const; /** * Jump to next pattern */ void nextPattern(); /** * Jump to previous pattern */ void lastPattern(); /** * Select a new position within the song * @param pos new order position * @param row new row * @param resetChannels reset channels, yes or no */ void setPatternPos(mp_uint32 pos, mp_uint32 row = 0, bool resetChannels = true, bool resetFXMemory = true); /** * Return the tempo of the song at the current position (in BPM) * When there is no song playing the last active tempo will be returned * @return current tempo in BPM */ mp_sint32 getTempo() const; /** * Return the speed of the current position in ticks * When there is no song playing the last active tick speed will be returned * @return current speed in ticks */ mp_sint32 getSpeed() const; /** * Tell the player to reset the channels when the song stops (= is played once) * When the player is in repeat mode the channels will never be resettet, not * even when the song loops * @param b reset on stop, yes or no */ void resetOnStop(bool b); /** * Tell the player to reset the main volume of the player (not the mixer master volume) * when the song is restarted (MilkyTracker does not want the volume to be reset) * @param b reset volume on start, yes or no */ void resetMainVolumeOnStartPlay(bool b); /** * Export the song as WAV file * @param fileName the path and the filename to export to * @param module the module to export * @param startOrder the start position within the order list of the song * @param endOrder the last order to be played * @param mutingArray optional: an array telling which channels to mute * @param mutingNumChannels optional: many channels does the muting array contain? * @param customPanningTable When specifying a custom panning table the panning default from the module is ignored * @param preferredDriver optional: specify another output audio driver here (NULL = WAV driver) * @param timingLUT optional: specify a pointer to a buffer which will hold the * number of samples played up to this position in the orderlist * the buffer needs at least module->header.ordnum entries */ mp_sint32 exportToWAV(const SYSCHAR* fileName, XModule* module, mp_sint32 startOrder = 0, mp_sint32 endOrder = -1, const mp_ubyte* mutingArray = NULL, mp_uint32 mutingNumChannels = 0, const mp_ubyte* customPanningTable = NULL, AudioDriverBase* preferredDriver = NULL, mp_sint32* timingLUT = NULL); /** * Grab current channel data from a module channel * @param chn the channel index to grab the data from * @param channelInfo reference to a channelInfo structure to be filled */ bool grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const; /** * Set the maximum number of virtual channels to be allocated while playing. * This might reduce CPU consumption a lot but only if the current player is using * virtual channels (like PlayerIT for example). If the current player doesn't * support virtual channels, this function has no effect. * * IMPORTANT: call this only before startPlaying, otherwise it will have no effect. * * @param max maximum amount of virtual channels (default is 256) */ void setNumMaxVirChannels(mp_sint32 max); /** * Return the maximum number of virtual channels to be allocated while playing. * @return maximum amount of virtual channels (default is 256) */ mp_sint32 getNumMaxVirChannels() const; // ---------------------------- milkytracker ---------------------------- /** * Change panning of a current playing channel * @param chn the channel * @param pan new panning value Left(0..255)Right */ void setPanning(mp_ubyte chn, mp_ubyte pan); /** * Return the currently used player instance (handle with care) * @return a PlayerBase instance is returned or NULL if there is none right now */ PlayerBase* getPlayerInstance() { return player; } friend class MixerNotificationListener; }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderXM.cpp0000644000175000017500000005076511163403715021422 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderXM.cpp * MilkyPlay Module Loader: Fasttracker 2 * * -------------------------------- * Version History: * -------------------------------- * 02/27/05: Added support for MODPLUG song message * 10/19/04: Fixed MOOH.XM loading problems. Header says there are more instruments than actually stored in the file. * 10/14/04: Added sample relocation technique to get rid of unused samples * ??/??/98: First version of this XM loader */ #include "Loaders.h" //#define VERBOSE #define XM_ENVELOPENUMPOINTS 12 const char* LoaderXM::identifyModule(const mp_ubyte* buffer) { // check for .XM module first if (!memcmp(buffer,"Extended Module:",16)) { return "XM"; } // this is not an .XM return NULL; } ////////////////////////////////////////////////////// // load fasttracker II extended module // return: 0 = no error // -7 = out of memory // -8 = other ////////////////////////////////////////////////////// mp_sint32 LoaderXM::load(XMFileBase& f, XModule* module) { mp_ubyte insData[230]; mp_sint32 smpReloc[16]; mp_ubyte nbu[96]; mp_uint32 fileSize = 0; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; fileSize = f.sizeWithBaseOffset(); f.read(&header->sig,1,17); f.read(&header->name,1,20); f.read(&header->whythis1a,1,1); header->whythis1a=0; f.read(&header->tracker,1,20); f.readWords(&header->ver,1); if (header->ver != 0x102 && header->ver != 0x103 && // untested header->ver != 0x104) return -8; f.readDwords(&header->hdrsize,1); header->hdrsize-=4; mp_uint32 hdrSize = 0x110; if (header->hdrsize > hdrSize) hdrSize = header->hdrsize; mp_ubyte* hdrBuff = new mp_ubyte[hdrSize]; memset(hdrBuff, 0, hdrSize); f.read(hdrBuff, 1, header->hdrsize); header->ordnum = LittleEndian::GET_WORD(hdrBuff); header->restart = LittleEndian::GET_WORD(hdrBuff+2); header->channum = LittleEndian::GET_WORD(hdrBuff+4); header->patnum = LittleEndian::GET_WORD(hdrBuff+6); header->insnum = LittleEndian::GET_WORD(hdrBuff+8); header->freqtab = LittleEndian::GET_WORD(hdrBuff+10); header->tempo = LittleEndian::GET_WORD(hdrBuff+12); header->speed = LittleEndian::GET_WORD(hdrBuff+14); memcpy(header->ord, hdrBuff+16, 256); delete[] hdrBuff; header->mainvol=255; header->flags = XModule::MODULE_XMNOTECLIPPING | XModule::MODULE_XMARPEGGIO | XModule::MODULE_XMPORTANOTEBUFFER | XModule::MODULE_XMVOLCOLUMNVIBRATO; header->uppernotebound = 119; mp_sint32 i,y,sc; for (i=0;i<32;i++) header->pan[i]=0x80; // old version? if (header->ver == 0x102 || header->ver == 0x103) { mp_sint32 s = 0; mp_sint32 e = 0; for (y=0;yinsnum;y++) { f.readDwords(&instr[y].size,1); f.read(&instr[y].name,1,22); f.read(&instr[y].type,1,1); f.readWords(&instr[y].samp,1); if (instr[y].size == 29) { #ifdef MILKYTRACKER s+=16; #endif for (mp_sint32 i = 0; i < 120; i++) instr[y].snum[i] = -1; continue; } f.readDwords(&instr[y].shsize,1); memset(insData, 0, 230); if (instr[y].size - 33 > 230) return -7; f.read(insData, 1, instr[y].size - 33); if (instr[y].samp) { mp_ubyte* insDataPtr = insData; memcpy(nbu, insDataPtr, 96); insDataPtr+=96; TEnvelope venv; TEnvelope penv; memset(&venv,0,sizeof(venv)); memset(&penv,0,sizeof(penv)); mp_sint32 k; for (k = 0; k < XM_ENVELOPENUMPOINTS; k++) { venv.env[k][0] = LittleEndian::GET_WORD(insDataPtr); venv.env[k][1] = LittleEndian::GET_WORD(insDataPtr+2); insDataPtr+=4; } for (k = 0; k < XM_ENVELOPENUMPOINTS; k++) { penv.env[k][0] = LittleEndian::GET_WORD(insDataPtr); penv.env[k][1] = LittleEndian::GET_WORD(insDataPtr+2); insDataPtr+=4; } venv.num = *insDataPtr++; if (venv.num > XM_ENVELOPENUMPOINTS) venv.num = XM_ENVELOPENUMPOINTS; penv.num = *insDataPtr++; if (penv.num > XM_ENVELOPENUMPOINTS) penv.num = XM_ENVELOPENUMPOINTS; venv.sustain = *insDataPtr++; venv.loops = *insDataPtr++; venv.loope = *insDataPtr++; penv.sustain = *insDataPtr++; penv.loops = *insDataPtr++; penv.loope = *insDataPtr++; venv.type = *insDataPtr++; penv.type = *insDataPtr++; mp_ubyte vibtype, vibsweep, vibdepth, vibrate; mp_uword volfade; vibtype = *insDataPtr++; vibsweep = *insDataPtr++; vibdepth = *insDataPtr++; vibrate = *insDataPtr++; vibdepth<<=1; volfade = LittleEndian::GET_WORD(insDataPtr); insDataPtr+=2; volfade<<=1; //instr[y].res = LittleEndian::GET_WORD(insDataPtr); insDataPtr+=2; for (mp_sint32 l=0;laddVolumeEnvelope(venv)) return -7; if (!module->addPanningEnvelope(penv)) return -7; mp_sint32 g=0, sc; for (sc=0;scaddSongMessageLine(line); // ignore empty samples #ifndef MILKYTRACKER // ignore empty samples when not being a tracker if (smp[g+s].samplen) { smpReloc[sc] = g; g++; } else smpReloc[sc] = -1; #else smpReloc[sc] = g; g++; #endif } instr[y].samp = g; for (sc = 0; sc < 96; sc++) { if (smpReloc[nbu[sc]] == -1) instr[y].snum[sc] = -1; else instr[y].snum[sc] = smpReloc[nbu[sc]]+s; } e++; } else { for (mp_sint32 i = 0; i < 120; i++) instr[y].snum[i] = -1; } #ifdef MILKYTRACKER s+=16; #else s+=instr[y].samp; #endif } header->smpnum=s; header->volenvnum=e; header->panenvnum=e; } for (y=0;ypatnum;y++) { if (header->ver == 0x104 || header->ver == 0x103) { f.readDwords(&phead[y].len,1); f.read(&phead[y].ptype,1,1); f.readWords(&phead[y].rows,1); f.readWords(&phead[y].patdata,1); } else { f.readDwords(&phead[y].len,1); f.read(&phead[y].ptype,1,1); phead[y].rows = (mp_uword)f.readByte()+1; f.readWords(&phead[y].patdata,1); } phead[y].effnum=2; phead[y].channum=(mp_ubyte)header->channum; phead[y].patternData = new mp_ubyte[phead[y].rows*header->channum*6]; // out of memory? if (phead[y].patternData == NULL) { return -7; } memset(phead[y].patternData,0,phead[y].rows*header->channum*6); if (phead[y].patdata) { mp_ubyte *buffer = new mp_ubyte[phead[y].patdata]; // out of memory? if (buffer == NULL) { return -7; } f.read(buffer,1,phead[y].patdata); //printf("%i\n", phead[y].patdata); mp_sint32 pc = 0, bc = 0; for (mp_sint32 r=0;rchannum;c++) { mp_ubyte slot[5]; memset(slot,0,5); if ((buffer[pc]&128)) { mp_ubyte pb = buffer[pc]; pc++; if ((pb&1)) { //phead[y].patternData[bc]=buffer[pc]; slot[0]=buffer[pc]; pc++; } if ((pb&2)) { //phead[y].patternData[bc+1]=buffer[pc]; slot[1]=buffer[pc]; pc++; } if ((pb&4)) { //phead[y].patternData[bc+2]=buffer[pc]; slot[2]=buffer[pc]; pc++; } if ((pb&8)) { //phead[y].patternData[bc+3]=buffer[pc]; slot[3]=buffer[pc]; pc++; } if ((pb&16)) { //phead[y].patternData[bc+4]=buffer[pc]; slot[4]=buffer[pc]; pc++; } } else { //memcpy(phead[y].patternData+bc,buffer+pc,5); memcpy(slot,buffer+pc,5); pc+=5; } char gl=0; for (mp_sint32 i=0;i64) bl=64; slot[4]=(bl*261120)>>16;*/ } if ((!slot[3])&&(slot[4])) slot[3]=0x20; if (slot[3]==0xE) { slot[3]=(slot[4]>>4)+0x30; slot[4]=slot[4]&0xf; } if (slot[3]==0x21) { slot[3]=(slot[4]>>4)+0x40; slot[4]=slot[4]&0xf; } if (slot[0]==97) slot[0]=XModule::NOTE_OFF; phead[y].patternData[bc]=slot[0]; phead[y].patternData[bc+1]=slot[1]; XModule::convertXMVolumeEffects(slot[2], phead[y].patternData[bc+2], phead[y].patternData[bc+3]); phead[y].patternData[bc+4]=slot[3]; phead[y].patternData[bc+5]=slot[4]; /*if ((y==3)&&(c==2)) { for (mp_sint32 bl=0;bl<6;bl++) cprintf("%x ",phead[y].patternData[bc+bl]); cprintf("\r\n"); getch(); };*/ /*printf("Note : %i\r\n",phead[y].patternData[bc]); printf("Ins : %i\r\n",phead[y].patternData[bc+1]); printf("Vol : %i\r\n",phead[y].patternData[bc+2]); printf("Eff : %i\r\n",phead[y].patternData[bc+3]); printf("Effop: %i\r\n",phead[y].patternData[bc+4]); getch();*/ bc+=6; } // for c } // for r delete[] buffer; } } if (header->ver == 0x104) { mp_sint32 s = 0; mp_sint32 e = 0; for (y=0;yinsnum;y++) { // fixes MOOH.XM loading problems // seems to store more instruments in the header than in the actual file if (f.posWithBaseOffset() >= fileSize) break; //TXMInstrument* ins = &instr[y]; f.readDwords(&instr[y].size,1); if (instr[y].size < 29) { mp_ubyte buffer[29]; memset(buffer, 0, sizeof(buffer)); f.read(buffer, 1, instr[y].size - 4); memcpy(instr[y].name, buffer, 22); instr[y].type = buffer[22]; instr[y].samp = LittleEndian::GET_WORD(buffer + 23); } else { f.read(&instr[y].name,1,22); f.read(&instr[y].type,1,1); f.readWords(&instr[y].samp,1); } //printf("%i, %i\n", instr[y].size, instr[y].samp); if (instr[y].size <= 29) { #ifdef MILKYTRACKER s+=16; #endif for (mp_sint32 i = 0; i < 120; i++) instr[y].snum[i] = -1; continue; } f.readDwords(&instr[y].shsize,1); #ifdef VERBOSE printf("%i/%i: %i, %i, %i, %s\n",y,header->insnum-1,instr[y].size,instr[y].shsize,instr[y].samp,instr[y].name); #endif memset(insData, 0, 230); if (instr[y].size - 33 > 230) { //return -7; break; } f.read(insData, 1, instr[y].size - 33); /*printf("%i\r\n",instr[y].size); printf("%s\r\n",instr[y].name); printf("%i\r\n",instr[y].type); printf("%i\r\n",instr[y].samp); printf("%i\r\n",instr[y].shsize);*/ //getch(); memset(smpReloc, 0, sizeof(smpReloc)); if (instr[y].samp) { mp_ubyte* insDataPtr = insData; //f.read(&nbu,1,96); memcpy(nbu, insDataPtr, 96); insDataPtr+=96; TEnvelope venv; TEnvelope penv; memset(&venv,0,sizeof(venv)); memset(&penv,0,sizeof(penv)); mp_sint32 k; for (k = 0; k < XM_ENVELOPENUMPOINTS; k++) { venv.env[k][0] = LittleEndian::GET_WORD(insDataPtr); venv.env[k][1] = LittleEndian::GET_WORD(insDataPtr+2); insDataPtr+=4; } for (k = 0; k < XM_ENVELOPENUMPOINTS; k++) { penv.env[k][0] = LittleEndian::GET_WORD(insDataPtr); penv.env[k][1] = LittleEndian::GET_WORD(insDataPtr+2); insDataPtr+=4; } venv.num = *insDataPtr++; if (venv.num > XM_ENVELOPENUMPOINTS) venv.num = XM_ENVELOPENUMPOINTS; penv.num = *insDataPtr++; if (penv.num > XM_ENVELOPENUMPOINTS) penv.num = XM_ENVELOPENUMPOINTS; venv.sustain = *insDataPtr++; venv.loops = *insDataPtr++; venv.loope = *insDataPtr++; penv.sustain = *insDataPtr++; penv.loops = *insDataPtr++; penv.loope = *insDataPtr++; venv.type = *insDataPtr++; penv.type = *insDataPtr++; mp_ubyte vibtype, vibsweep, vibdepth, vibrate; mp_uword volfade; vibtype = *insDataPtr++; vibsweep = *insDataPtr++; vibdepth = *insDataPtr++; vibrate = *insDataPtr++; vibdepth<<=1; //f.readWords(&volfade,1); volfade = LittleEndian::GET_WORD(insDataPtr); insDataPtr+=2; volfade<<=1; //instr[y].res = LittleEndian::GET_WORD(insDataPtr); insDataPtr+=2; for (mp_sint32 l=0;laddVolumeEnvelope(venv)) return -7; if (!module->addPanningEnvelope(penv)) return -7; mp_sint32 g=0, sc; for (sc=0;scaddSongMessageLine(line); #ifndef MILKYTRACKER // ignore empty samples when not being a tracker if (smp[g+s].samplen) { smpReloc[sc] = g; g++; } else smpReloc[sc] = -1; #else smpReloc[sc] = g; g++; #endif } instr[y].samp = g; for (sc = 0; sc < 96; sc++) { if (smpReloc[nbu[sc]] == -1) instr[y].snum[sc] = -1; else instr[y].snum[sc] = smpReloc[nbu[sc]]+s; } for (sc=0;sc>=1; smp[s].loopstart>>=1; smp[s].looplen>>=1; } if (module->loadModuleSample(f, s, adpcm ? XModule::ST_PACKING_ADPCM : XModule::ST_DELTA, adpcm ? (XModule::ST_PACKING_ADPCM | XModule::ST_16BIT) : (XModule::ST_DELTA | XModule::ST_16BIT), oldSize) != 0) return -7; if (adpcm) smp[s].res = 0; } s++; if (s>=MP_MAXSAMPLES) return -7; } e++; } else { for (mp_sint32 i = 0; i < 120; i++) instr[y].snum[i] = -1; } #ifdef MILKYTRACKER s+=16 - instr[y].samp; #endif } header->smpnum=s; header->volenvnum=e; header->panenvnum=e; } else { mp_sint32 s = 0; for (y=0;yinsnum;y++) { for (sc=0;sc>=1; smp[s].loopstart>>=1; smp[s].looplen>>=1; } if (module->loadModuleSample(f, s, XModule::ST_DELTA, XModule::ST_DELTA | XModule::ST_16BIT, oldSize) != 0) return -7; } s++; if (s>=MP_MAXSAMPLES) return -7; } #ifdef MILKYTRACKER s+=16 - instr[y].samp; #endif } } // convert modplug stereo samples for (mp_sint32 s = 0; s < header->smpnum; s++) { if (smp[s].type & 32) { // that's what's allowed, stupid modplug tracker smp[s].type &= 3+16; if (smp[s].sample == NULL) continue; if (!(smp[s].type&16)) { smp[s].samplen>>=1; smp[s].loopstart>>=1; smp[s].looplen>>=1; mp_sbyte* sample = (mp_sbyte*)smp[s].sample; mp_sint32 samplen = smp[s].samplen; for (mp_sint32 i = 0; i < samplen; i++) { mp_sint32 s = ((mp_sint32)sample[i] + (mp_sint32)sample[i + samplen]) >> 1; if (s < -128) s = -128; if (s > 127) s = 127; sample[i] = (mp_sbyte)s; } } else { smp[s].samplen>>=1; smp[s].loopstart>>=1; smp[s].looplen>>=1; mp_sword* sample = (mp_sword*)smp[s].sample; mp_sint32 samplen = smp[s].samplen; for (mp_sint32 i = 0; i < samplen; i++) { mp_sint32 s = ((mp_sint32)sample[i] + (mp_sint32)sample[i + samplen]) >> 1; if (s < -32768) s = -32768; if (s > 32767) s = 32767; sample[i] = (mp_sword)s; } } } // correct loop type 0x03 (undefined) // will become ping pong loop // note that FT2 will refuse to load XM files with such a loop type if ((smp[s].type & 0x3) == 0x3) smp[s].type&=~1; } // correct number of patterns if necessary, otherwise the post processing will remove // the "invalid" patterns from the order list bool addPatterns = false; for (i = 0; i < header->ordnum; i++) if (header->ord[i]+1 > header->patnum) { header->patnum = header->ord[i]+1; addPatterns = true; } // if the pattern number has been adjusted, add some empty patterns if (addPatterns) { for (i = 0; i < header->patnum; i++) if (phead[i].patternData == NULL) { phead[i].rows = 64; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*6]; // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum*6); } } // check for MODPLUG extensions if (f.posWithBaseOffset() + 8 <= fileSize) { char buffer[4]; f.read(buffer, 1, 4); if (memcmp(buffer, "text", 4) == 0) { mp_uint32 len = f.readDword(); module->allocateSongMessage(len+1); memset(module->message, 0, len+1); f.read(module->message, 1, len); } } module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderMDL.cpp0000644000175000017500000007162011163403715021503 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderMDL.cpp * MilkyPlay Module Loader: Digitracker 3 * -------------------------------- * Version History: * -------------------------------- * 01/16/05: Added loader for version 0.0 (no joke) * ??/??/04: Make it working with platform independent file loading routines * ??/??/98: First version of this MDL loader */ #include "Loaders.h" struct tmdlins { mp_ubyte sampnum; mp_ubyte playrangeend; mp_ubyte vol; mp_ubyte volenv; mp_ubyte pan; mp_ubyte panenv; mp_uint32 volfade; mp_ubyte vibspeed; mp_ubyte vibdepth; mp_ubyte vibsweep; mp_ubyte vibform; mp_ubyte reserved; mp_ubyte freqenv; }; struct tmdlsamp { mp_ubyte sampnum; mp_ubyte smpname[32]; mp_ubyte filename[8]; mp_uint32 c4spd; mp_uint32 samplen; mp_uint32 loopstart; mp_uint32 looplen; mp_ubyte reserved; mp_ubyte infobyte; mp_sbyte *smp; }; static inline mp_uint32 cvol(mp_ubyte vol) { return (((mp_sint32)(vol-1))*65795)>>16; } static inline mp_uint32 cpan(mp_ubyte pan) { return (((mp_uint32)pan)*131589)>>16; } const char* LoaderMDL::identifyModule(const mp_ubyte* buffer) { // check for .MDL module if (!memcmp(buffer,"DMDL",4)) { return "MDL"; } return NULL; } mp_sint32 LoaderMDL::load(XMFileBase& f, XModule* module) { mp_uint32 i,e; mp_ubyte dummy[256]; module->cleanUp(); TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_ubyte sig[5]; f.read(&sig,1,5); if (memcmp(sig,"DMDL",4)) { return -8; } mp_ubyte hVer = sig[4]>>4; if (hVer > 1) { return -8; } memcpy(header->sig,sig,4); strcpy(header->tracker,"Digitracker 3"); mp_uint32 numtracks=0; mp_uint32 numins=0; mp_uint32 numsamples=0; mp_ubyte *tracks = NULL; // waste some memory tmdlins *mdlins = new tmdlins[16*256]; tmdlsamp *mdlsamp = new tmdlsamp[256]; mp_uint32 *trackseq = new mp_uint32[256*32]; if (mdlins == NULL || mdlsamp == NULL || trackseq == NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; return -7; } memset(mdlins,0,sizeof(tmdlins)*16*256); memset(mdlsamp,0,sizeof(tmdlsamp)*256); memset(trackseq,0,256*32*4); header->ver=sig[4]; mp_ubyte blockhead[6]; while (f.read(&blockhead,1,6)) { mp_ubyte id[3]; memcpy(id,blockhead,2); id[2]=0; mp_uint32 blocklen = LittleEndian::GET_DWORD(blockhead+2); if (!memcmp(&blockhead,"IN",2)) { f.read(&header->name,1,32); f.read(&dummy,1,20); f.readWords(&header->ordnum,1); f.readWords(&header->restart,1); header->mainvol = f.readByte(); header->tempo = f.readByte(); header->speed = f.readByte(); f.read(&dummy,1,32); mp_uint32 c=32; while ((dummy[c-1]&128)) c--; header->channum=c; for (i=0;ipan[i]=cpan(dummy[i]&127); f.read(&header->ord,1,header->ordnum); for (i=0;ipatnum = f.readByte(); for (mp_sint32 p=0;ppatnum;p++) { mp_ubyte numch = 0; mp_sint32 numrows=0; if (hVer == 1) { numch = f.readByte(); numrows = f.readByte(); f.read(&dummy,1,16); } else if (hVer == 0) { numch = 32; numrows = 63; } for (mp_sint32 c=0;cheader->channum) numch=(char)header->channum; numch=(mp_ubyte)header->channum; numrows++; phead[p].rows=numrows; phead[p].effnum=3; phead[p].channum=numch < (mp_ubyte)header->channum ? numch : (mp_ubyte)header->channum; phead[p].patternData=new mp_ubyte[phead[p].rows*phead[p].channum*8]; // out of memory? if (phead[p].patternData == NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; return -7; } memset(phead[p].patternData,0,phead[p].rows*phead[p].channum*8); } } else if (!memcmp(&blockhead,"TR",2)) { mp_ubyte *buffer = new mp_ubyte[2048]; numtracks = f.readWord(); tracks = new mp_ubyte[(mp_uint32)numtracks*256*6]; if (buffer == NULL || tracks == NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (buffer) delete[] buffer; if (tracks) delete[] tracks; return -7; } for (mp_uint32 t=0;t>2; switch (pb) { case 0: { for (i=0;i<(op+1);i++) { memset(track+(p*6),0,6); p++; } break; }; case 1: { mp_sint32 lp=p-1; for (i=0;i<(op+1);i++) { memcpy(track+(p*6),track+(lp*6),6); p++; } break; }; case 2: { memcpy(track+(p*6),track+(op*6),6); p++; break; }; case 3: { if ((op&1)) track[p*6]=buffer[d++]; if ((op&2)) track[p*6+1]=buffer[d++]; if ((op&4)) track[p*6+2]=buffer[d++]; if ((op&8)) track[p*6+3]=buffer[d++]; if ((op&16)) track[p*6+4]=buffer[d++]; if ((op&32)) track[p*6+5]=buffer[d++]; p++; break; }; } } // something went wrong here if (d!=tracksize) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (buffer) delete[] buffer; if (tracks) delete[] tracks; return -8; } } delete[] buffer; } else if (!memcmp(&blockhead,"II",2)) { mp_uint32 insnum = 0,numsamples = 0; numins = f.readByte(); for (i=0;iinsnum=insnum; } else if (!memcmp(&blockhead,"IS",2)) { numsamples = f.readByte(); for (mp_uint32 s=0;s>2)&3; switch (pb) { case 0: { if (!(mdlsamp[s].infobyte&1)) { mdlsamp[s].smp = (mp_sbyte*)module->allocSampleMem(mdlsamp[s].samplen); // out of memory if (mdlsamp[s].smp==NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } if (!module->loadSample(f,mdlsamp[s].smp,mdlsamp[s].samplen,mdlsamp[s].samplen)) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } } else { mdlsamp[s].smp = (mp_sbyte*)module->allocSampleMem(mdlsamp[s].samplen); // out of memory if (mdlsamp[s].smp==NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } if (!module->loadSample(f,mdlsamp[s].smp,mdlsamp[s].samplen,mdlsamp[s].samplen>>1,XModule::ST_16BIT)) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } //mp_uint32 samplen = mdlsamp[s].samplen>>1; //mp_uint32 loopstart = mdlsamp[s].loopstart>>1; //mp_uint32 looplen = mdlsamp[s].looplen>>1; } }; break; case 1: { mp_sint32 size = (mp_sint32)f.readDword(); mdlsamp[s].smp = (mp_sbyte*)module->allocSampleMem(mdlsamp[s].samplen); // out of memory if (mdlsamp[s].smp==NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } if (!module->loadSample(f,mdlsamp[s].smp,size,mdlsamp[s].samplen,XModule::ST_PACKING_MDL)) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } }; break; case 2: { mp_sint32 size = (mp_sint32)f.readDword(); mdlsamp[s].smp = (mp_sbyte*)module->allocSampleMem(mdlsamp[s].samplen); // out of memory if (mdlsamp[s].smp==NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } mp_uint32 samplen = mdlsamp[s].samplen>>1; //mp_uint32 loopstart = mdlsamp[s].loopstart>>1; //mp_uint32 looplen = mdlsamp[s].looplen>>1; if (!module->loadSample(f,mdlsamp[s].smp,size,samplen,XModule::ST_PACKING_MDL | XModule::ST_16BIT)) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } }; break; } } } else if (!memcmp(&blockhead,"VE",2)) { mp_uint32 numenvs = f.readByte(); mp_ubyte *envelopes = new mp_ubyte[numenvs*33]; // out of memory if (envelopes==NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } f.read(envelopes,33,numenvs); mp_ubyte *env=envelopes; mp_ubyte num; mp_uint32 envnum = 0; mp_uint32 lastEnv = 0; for (e=0;elastEnv) lastEnv = envnum; } module->venvs = new TEnvelope[lastEnv+1]; if (module->venvs == NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } memset(module->venvs, 0, sizeof(TEnvelope)*(lastEnv+1)); module->numVEnvsAlloc = lastEnv+1; module->numVEnvs = lastEnv+1; for (e=0;e>16; module->venvs[envnum].env[num][0]=x-1; module->venvs[envnum].env[num][1]=y; num++; } module->venvs[envnum].num=num; module->venvs[envnum].sustain=env[31]&0xf; module->venvs[envnum].loops=env[32]&0xf; module->venvs[envnum].loope=env[32]>>4; module->venvs[envnum].type=1; if ((env[31]&16)) module->venvs[envnum].type|=2; if ((env[31]&32)) module->venvs[envnum].type|=4; env+=33; } header->volenvnum=envnum+1; delete[] envelopes; } else if (!memcmp(&blockhead,"PE",2)) { mp_uint32 numenvs = f.readByte(); mp_ubyte *envelopes = new mp_ubyte[numenvs*33]; // out of memory if (envelopes==NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } f.read(envelopes,33,numenvs); mp_ubyte *env=envelopes; mp_ubyte num; mp_uint32 envnum = 0; mp_uint32 lastEnv = 0; for (e=0;elastEnv) lastEnv = envnum; } module->penvs = new TEnvelope[lastEnv+1]; if (module->penvs == NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } memset(module->penvs, 0, sizeof(TEnvelope)*(lastEnv+1)); module->numPEnvsAlloc = lastEnv+1; module->numPEnvs = lastEnv+1; for (e=0;e>16; module->penvs[envnum].env[num][0]=x-1; module->penvs[envnum].env[num][1]=y; num++; } module->penvs[envnum].num=num; module->penvs[envnum].sustain=env[31]&0xf; module->penvs[envnum].loops=env[32]&0xf; module->penvs[envnum].loope=env[32]>>4; module->penvs[envnum].type=1; if ((env[31]&16)) module->penvs[envnum].type|=2; if ((env[31]&32)) module->penvs[envnum].type|=4; env+=33; } header->panenvnum=envnum+1; delete[] envelopes; } else if (!memcmp(&blockhead,"FE",2)) { mp_uint32 numenvs = f.readByte(); mp_ubyte *envelopes = new mp_ubyte[numenvs*33]; // out of memory if (envelopes==NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } f.read(envelopes,33,numenvs); mp_ubyte *env=envelopes; mp_ubyte num; mp_uint32 envnum = 0; mp_uint32 lastEnv = 0; for (e=0;elastEnv) lastEnv = envnum; } module->fenvs = new TEnvelope[lastEnv+1]; if (module->fenvs == NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } memset(module->fenvs, 0, sizeof(TEnvelope)*(lastEnv+1)); module->numFEnvsAlloc = lastEnv+1; module->numFEnvs = lastEnv+1; for (e=0;e>16; module->fenvs[envnum].env[num][0]=x-1; module->fenvs[envnum].env[num][1]=y; num++; } module->fenvs[envnum].num=num; module->fenvs[envnum].sustain=env[31]&0xf; module->fenvs[envnum].loops=env[32]&0xf; module->fenvs[envnum].loope=env[32]>>4; module->fenvs[envnum].type=1; if ((env[31]&16)) module->fenvs[envnum].type|=2; if ((env[31]&32)) module->fenvs[envnum].type|=4; env+=33; } header->frqenvnum=envnum+1; delete[] envelopes; } else if (!memcmp(&blockhead,"ME",2)) { // MDL doc says song message is always 0 terminated, // well allocate one more byte to make sure it's really, really 0-terminated module->allocateSongMessage(blocklen+1); if (module->message == NULL) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } // read song message f.read(module->message, 1, blocklen); } else { /*mp_ubyte *buffer = new mp_ubyte[blocklen]; if (buffer == NULL) { // out of memory if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } f.read(buffer,1,blocklen); delete[] buffer;*/ f.seekWithBaseOffset(f.posWithBaseOffset() + blocklen); } } // --------------------------------------------------------------- // build new song structure // --------------------------------------------------------------- if (hVer == 1) { // create static envelope for samples samples without volume envelope TEnvelope venv; //venvs[header->volenvnum].type=5; //venvs[header->volenvnum].num=2; //venvs[header->volenvnum].loops=0; //venvs[header->volenvnum].loope=1; //venvs[header->volenvnum].env[0][0]=0; //venvs[header->volenvnum].env[0][1]=256; //venvs[header->volenvnum].env[1][0]=128; //venvs[header->volenvnum].env[1][1]=256; venv.type=5; venv.num=2; venv.loops=0; venv.loope=1; venv.env[0][0]=0; venv.env[0][1]=256; venv.env[1][0]=128; venv.env[1][1]=256; if (!module->addVolumeEnvelope(venv)) { if (mdlins) delete[] mdlins; if (mdlsamp) delete[] mdlsamp; if (trackseq) delete[] trackseq; if (tracks) delete[] tracks; return -7; } header->volenvnum++; mp_uint32 sampcnt=0; for (i=0;iinsnum;i++) { //cprintf("%i\r\n",instr[i].samp); if (instr[i].samp) { mp_sint32 bs=0; for (mp_uint32 s=0;svolenvnum; if ((mdlins[i*16+s].panenv&128)) smp[sampcnt].penvnum=(mdlins[i*16+s].panenv&63)+1; if ((mdlins[i*16+s].freqenv&128)) smp[sampcnt].fenvnum=(mdlins[i*16+s].freqenv&63)+1; smp[sampcnt].vol=cvol(mdlins[i*16+s].vol); XModule::convertc4spd(mdlsamp[l].c4spd,&smp[sampcnt].finetune,&smp[sampcnt].relnote); if (mdlsamp[l].looplen&&(mdlsamp[l].infobyte&2)) smp[sampcnt].type=2; else if (mdlsamp[l].looplen&&(!(mdlsamp[l].infobyte&2))) smp[sampcnt].type=1; if ((mdlsamp[l].infobyte&1)) { smp[sampcnt].samplen>>=1; smp[sampcnt].loopstart>>=1; smp[sampcnt].looplen>>=1; smp[sampcnt].type|=16; } smp[sampcnt].pan=cpan(mdlins[i*16+s].pan); smp[sampcnt].vibtype=mdlins[i*16+s].vibform; smp[sampcnt].vibsweep=mdlins[i*16+s].vibsweep; smp[sampcnt].vibdepth=mdlins[i*16+s].vibdepth; smp[sampcnt].vibrate=mdlins[i*16+s].vibspeed; smp[sampcnt].volfade=mdlins[i*16+s].volfade; smp[sampcnt].sample=mdlsamp[l].smp; memcpy(&smp[sampcnt].name,&mdlsamp[l].smpname,32); sampcnt++; continue; } } } } } header->smpnum=sampcnt; } else if (hVer == 0) { header->insnum = 0; for (mp_uint32 s = 0; s < numsamples; s++) { i = mdlsamp[s].sampnum - 1; if ((i+1) > header->insnum) header->insnum = i + 1; instr[i].samp = 1; for (mp_sint32 j = 0; j < 120; j++) instr[i].snum[j] = s; memcpy(instr[i].name, mdlsamp[s].smpname, 32); memcpy(smp[s].name, mdlsamp[s].filename, 8); XModule::convertc4spd(mdlsamp[s].c4spd,&smp[s].finetune,&smp[s].relnote); smp[s].vol=cvol(mdlsamp[s].reserved); smp[s].flags = 1; smp[s].samplen = mdlsamp[s].samplen; smp[s].loopstart = mdlsamp[s].loopstart; smp[s].looplen= mdlsamp[s].looplen; if (mdlsamp[s].looplen&&(mdlsamp[s].infobyte&2)) smp[s].type=2; else if (mdlsamp[s].looplen&&(!(mdlsamp[s].infobyte&2))) smp[s].type=1; if ((mdlsamp[s].infobyte&1)) { smp[s].samplen>>=1; smp[s].loopstart>>=1; smp[s].looplen>>=1; smp[s].type|=16; } smp[s].sample = mdlsamp[s].smp; /*mdlsamp[s].samplen = f.readDword(); mdlsamp[s].loopstart = f.readDword(); mdlsamp[s].looplen = f.readDword(); mdlsamp[s].reserved = f.readByte(); mdlsamp[s].infobyte = f.readByte();*/ } header->smpnum = numsamples; } for (i=0;ipatnum;i++) { mp_ubyte* pattern = phead[i].patternData; mp_uint32 numrows = phead[i].rows; mp_uint32 numch = phead[i].channum; for (mp_uint32 r=0;r>4; switch (eff1) { case 0x1 : { pattern[pos+4]=0x43; pattern[pos+5]=track[4]; }; break; case 0x2 : { pattern[pos+4]=0x44; pattern[pos+5]=track[4]; }; break; case 0x3 : { pattern[pos+4]=0x03; pattern[pos+5]=track[4]; }; break; case 0x4 : { pattern[pos+4]=0x04; pattern[pos+5]=track[4]; }; break; case 0x5 : { pattern[pos+4]=0x20; pattern[pos+5]=track[4]; }; break; case 0x7 : { pattern[pos+4]=0x16; pattern[pos+5]=track[4]; }; break; case 0x8 : { pattern[pos+4]=0x08; pattern[pos+5]=cpan(track[4]); }; break; case 0xB : { pattern[pos+4]=0x0B; pattern[pos+5]=track[4]; }; break; case 0xC : { pattern[pos+4]=0x10; pattern[pos+5]=cvol(track[4]); }; break; case 0xD : { pattern[pos+4]=0x0D; pattern[pos+5]=track[4]; }; break; case 0xE : { switch (track[4]>>4) { case 0x1 : { pattern[pos+4]=0x1E; pattern[pos+5]=track[4]; }; break; case 0x2 : { pattern[pos+4]=0x1E; pattern[pos+5]=track[4]; }; break; case 0x6 : { pattern[pos+4]=0x36; pattern[pos+5]=track[4]&0xf; }; break; case 0x7 : { pattern[pos+4]=0x37; pattern[pos+5]=track[4]&0xf; }; break; case 0x9 : { pattern[pos+4]=0x39; pattern[pos+5]=track[4]&0xf; }; break; case 0xA : { pattern[pos+4]=0x1E; pattern[pos+5]=track[4]; }; break; case 0xB : { pattern[pos+4]=0x1E; pattern[pos+5]=track[4]; }; break; case 0xC : { pattern[pos+4]=0x3C; pattern[pos+5]=track[4]&0xf; }; break; case 0xD : { pattern[pos+4]=0x3D; pattern[pos+5]=track[4]&0xf; }; break; case 0xE : { pattern[pos+4]=0x3E; pattern[pos+5]=track[4]&0xf; }; break; case 0xF : { pattern[pos+4]=0x1F; pattern[pos+5]=track[5]; pattern[pos+6]=0; pattern[pos+7]=track[4]&0xf; }; break; } }; break; case 0xF : { pattern[pos+4]=0x1C; pattern[pos+5]=track[4]; }; break; default : { if (eff1) { //cprintf("Eff1: %i, %i\r\n",eff1,track[4]); //getch(); } }; break; } switch (eff2) { case 0x1 : { pattern[pos+6]=0x45; pattern[pos+7]=track[5]; }; break; case 0x2 : { pattern[pos+6]=0x46; pattern[pos+7]=track[5]; }; break; case 0x3 : { pattern[pos+6]=0x1B; pattern[pos+7]=track[5]; }; break; case 0x4 : { pattern[pos+6]=0x07; pattern[pos+7]=track[5]; }; break; case 0x7 : { pattern[pos+6]=0x16; pattern[pos+7]=track[5]; }; break; case 0x8 : { pattern[pos+6]=0x08; pattern[pos+7]=cpan(track[5]); }; break; case 0xB : { pattern[pos+6]=0x0B; pattern[pos+7]=track[5]; }; break; case 0xC : { pattern[pos+6]=0x10; pattern[pos+7]=cvol(track[5]); }; break; case 0xD : { pattern[pos+6]=0x0D; pattern[pos+7]=track[5]; }; break; case 0xE : { switch (track[5]>>4) { case 0x1 : { pattern[pos+6]=0x1E; pattern[pos+7]=track[5]; }; break; case 0x2 : { pattern[pos+6]=0x1E; pattern[pos+7]=track[5]; }; break; case 0x6 : { pattern[pos+6]=0x36; pattern[pos+7]=track[5]&0xf; }; break; case 0x7 : { pattern[pos+6]=0x37; pattern[pos+7]=track[5]&0xf; }; break; case 0x9 : { pattern[pos+6]=0x39; pattern[pos+7]=track[5]&0xf; }; break; case 0xA : { pattern[pos+6]=0x1E; pattern[pos+7]=track[5]; }; break; case 0xB : { pattern[pos+6]=0x1E; pattern[pos+7]=track[5]; }; break; case 0xC : { pattern[pos+6]=0x3C; pattern[pos+7]=track[5]&0xf; }; break; case 0xD : { pattern[pos+6]=0x3D; pattern[pos+7]=track[5]&0xf; }; break; case 0xE : { pattern[pos+6]=0x3E; pattern[pos+7]=track[5]&0xf; }; break; case 0xF : { pattern[pos+4]=0x1F; pattern[pos+5]=track[4]; pattern[pos+6]=0; pattern[pos+7]=track[5]&0xf; }; break; } }; break; case 0xF : { pattern[pos+6]=0x1C; pattern[pos+7]=track[5]; }; break; default : { if (eff2) { //cprintf("Eff2: %i, %i\r\n",eff2,track[5]); //getch(); } }; break; } } } } } //cprintf("%i\r\n",phead[1].channum); //for (mp_sint32 r=0;r<64;r++) { //mp_sint32 o=(24*8)*r-2; //for (i=15;i<16;i++) { // cprintf("n: %x, i: %x\r\n",phead[1].pattern[i*8+6+o],phead[1].pattern[i*8+7+o]); // getch(); //} //} delete[] tracks; delete[] trackseq; delete[] mdlins; delete[] mdlsamp; module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/Makefile.am0000644000175000017500000000617211135201273021262 0ustar admin2admin2noinst_LIBRARIES = libmilkyplay.a libmilkyplay_a_SOURCES = AudioDriverBase.cpp AudioDriverManager.cpp \ AudioDriver_NULL.cpp AudioDriver_WAVWriter.cpp ChannelMixer.cpp ExporterXM.cpp \ LittleEndian.cpp Loader669.cpp LoaderAMF.cpp LoaderAMS.cpp LoaderCBA.cpp \ LoaderDBM.cpp LoaderDIGI.cpp LoaderDSM.cpp LoaderDTM.cpp LoaderFAR.cpp \ LoaderGDM.cpp LoaderIMF.cpp LoaderIT.cpp LoaderMDL.cpp LoaderMOD.cpp \ LoaderMTM.cpp LoaderMXM.cpp LoaderOKT.cpp LoaderPLM.cpp LoaderPSM.cpp \ LoaderPTM.cpp LoaderS3M.cpp LoaderSTM.cpp LoaderULT.cpp LoaderUNI.cpp \ LoaderXM.cpp MasterMixer.cpp PlayerBase.cpp PlayerGeneric.cpp PlayerSTD.cpp \ ResamplerFactory.cpp SampleLoaderAIFF.cpp SampleLoaderALL.cpp \ SampleLoaderAbstract.cpp SampleLoaderGeneric.cpp SampleLoaderIFF.cpp \ SampleLoaderWAV.cpp XIInstrument.cpp XMFile.cpp XModule.cpp \ drivers/alsa/AudioDriver_ALSA.cpp drivers/jack/AudioDriver_JACK.cpp \ drivers/sdl/AudioDriver_SDL.cpp noinst_HEADERS = AudioDriverBase.h AudioDriverManager.h \ AudioDriver_COMPENSATE.h AudioDriver_NULL.h AudioDriver_WAVWriter.h \ ChannelMixer.h LittleEndian.h Loaders.h MasterMixer.h MilkyPlay.h \ MilkyPlayCommon.h MilkyPlayTypes.h Mixable.h PlayerBase.h PlayerGeneric.h \ PlayerSTD.h ResamplerAmiga.h ResamplerCubic.h ResamplerFactory.h \ ResamplerFast.h ResamplerMacros.h ResamplerSinc.h SampleLoaderAIFF.h \ SampleLoaderALL.h SampleLoaderAbstract.h SampleLoaderGeneric.h \ SampleLoaderIFF.h SampleLoaderWAV.h XIInstrument.h XMFile.h XModule.h \ computed-blep.h drivers/alsa/AudioDriver_ALSA.h \ drivers/jack/AudioDriver_JACK.h drivers/sdl/AudioDriver_SDL.h INCLUDES = -I$(top_srcdir)/src/milkyplay \ -I$(top_srcdir)/src/milkyplay/drivers/generic \ -I$(top_srcdir)/src/milkyplay/drivers/jack \ -I$(top_srcdir)/src/milkyplay/drivers/sdl AM_CPPFLAGS=-DMILKYTRACKER -D__THREADTIMER__ -DDRIVER_UNIX ${SDL_CFLAGS} \ EXTRA_DIST = PlayerFAR.cpp PlayerFAR.h PlayerIT.cpp PlayerIT.h \ drivers/generic/AudioDriver_PORTAUDIO.cpp \ drivers/generic/AudioDriver_PORTAUDIO.h \ drivers/generic/AudioDriver_RTAUDIO.cpp drivers/generic/AudioDriver_RTAUDIO.h \ drivers/generic/RtAudio3Impl.cpp drivers/generic/RtAudio4Impl.cpp \ drivers/generic/portaudio/portaudio.h drivers/generic/rtaudio/RtAudio3.cpp \ drivers/generic/rtaudio/RtAudio3.h drivers/generic/rtaudio/RtAudio4.cpp \ drivers/generic/rtaudio/RtAudio4.h drivers/generic/rtaudio/RtError3.h \ drivers/generic/rtaudio/RtError4.h drivers/generic/rtaudio/asio/asio.cpp \ drivers/generic/rtaudio/asio/asio.h \ drivers/generic/rtaudio/asio/asiodrivers.cpp \ drivers/generic/rtaudio/asio/asiodrivers.h \ drivers/generic/rtaudio/asio/asiodrvr.h \ drivers/generic/rtaudio/asio/asiolist.cpp \ drivers/generic/rtaudio/asio/asiolist.h drivers/generic/rtaudio/asio/asiosys.h \ drivers/generic/rtaudio/asio/ginclude.h \ drivers/generic/rtaudio/asio/iasiodrv.h \ drivers/generic/rtaudio/asio/iasiothiscallresolver.cpp \ drivers/generic/rtaudio/asio/iasiothiscallresolver.h \ drivers/generic/rtaudio/oss/soundcard.h drivers/osx/AudioDriver_COREAUDIO.cpp \ drivers/osx/AudioDriver_COREAUDIO.h drivers/psp/AudioDriver_PSP.cpp \ drivers/psp/AudioDriver_PSP.h drivers/windows/AudioDriver_MMSYSTEM.cpp \ drivers/windows/AudioDriver_MMSYSTEM.h milkytracker-0.90.85+dfsg/src/milkyplay/LoaderUNI.cpp0000644000175000017500000005446111163403715021526 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderUNI.cpp * MilkyPlay Module Loader: MikMod UNIversal Module * * Warning: This is an one-by-one conversion of my pascal uni2xm converter ;) * */ #include "Loaders.h" //#define VERBOSE struct Uniheader { mp_ubyte FileID[4]; mp_ubyte NumChannels; mp_uword SongLength; mp_uword RepeatPos; mp_uword NumPatterns; mp_uword NumTracks; mp_uword NumIns; mp_ubyte InitSpeed; mp_ubyte InitTempo; mp_ubyte OrderList[256]; mp_ubyte DefPanning[32]; mp_ubyte Flags; }; struct Uniinstrument { mp_ubyte NumSamps; mp_ubyte SampleNums[96]; mp_ubyte volflg; mp_ubyte volpts; mp_ubyte volsus; mp_ubyte volbeg; mp_ubyte volend; mp_sword VolPoints[12*2]; mp_ubyte panflg; mp_ubyte panpts; mp_ubyte pansus; mp_ubyte panbeg; mp_ubyte panend; mp_sword PanPoints[12*2]; mp_ubyte vibtype; mp_ubyte vibsweep; mp_ubyte vibdepth; mp_ubyte vibrate; mp_uword volfade; }; struct Unisample { mp_uword C2spd; mp_sbyte relnotenum; mp_ubyte volume; mp_ubyte panning; mp_uint32 smplength; mp_uint32 smploopstart; mp_uint32 smploopend; mp_uword flags; }; struct MytrackSlot { mp_ubyte note, instrument; mp_ubyte effects[7]; mp_ubyte operands[7]; }; const char* LoaderUNI::identifyModule(const mp_ubyte* buffer) { // check for .UNI module if (!memcmp(buffer,"UN0",3)) { if (buffer[3] != '4' && buffer[3] != '5') return NULL; return "UNI"; } return NULL; } static mp_sint32 getMaxEffectsFromTrack(mp_ubyte* track) { mp_sint32 y; mp_sint32 i = 0; mp_sint32 rowcnt = 0; mp_sint32 effectCnt = 1; mp_sint32 maxEffectsPerRow = 0; do { mp_ubyte x = track[i]; mp_ubyte rep = x >> 5; mp_ubyte len = x & 31; for (mp_ubyte repcnt = 0; repcnt <= rep; repcnt++) { y = 1; if (len > 1) { for (mp_ubyte c = 1; c <= len-1; c++) { if (track[y+i]) { switch (track[y+i]) { case 1: //DeTrack[rowcnt].Note:=Track[y+i+1]+1; y+=2; c++; break; case 2: //DeTrack[rowcnt].Instrument:=Track[y+i+1]+1; y+=2; c++; break; case 13: //if (track[y+i+1]) { //DeTrack[rowcnt].Effect:=$A; //DeTrack[rowcnt].Operand:=Track[y+i+1]; //} //else { //DeTrack[rowcnt].Effect:=0; //DeTrack[rowcnt].Operand:=0; //} y+=2; c++; effectCnt++; break; case 15: //DeTrack[rowcnt].Volume:=Track[y+i+1]+$10 y+=2; c++; break; case 19: //DeTrack[rowcnt].Effect:=$F; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; case 20: //DeTrack[rowcnt].Effect:=250; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; case 21: //DeTrack[rowcnt].Effect:=251; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; case 22: //DeTrack[rowcnt].Effect:=252; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; case 23: //DeTrack[rowcnt].Effect:=29; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; case 24: //DeTrack[rowcnt].Effect:=27; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; case 25: //DeTrack[rowcnt].Effect:=$F; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; case 26: //DeTrack[rowcnt].Effect:=$A; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; case 27: //DeTrack[rowcnt].Effect:=$14; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; break; default: //DeTrack[rowcnt].Effect:=Track[y+i]-3; //DeTrack[rowcnt].Operand:=Track[y+i+1]; y+=2; c++; effectCnt++; } } } } /*if Detrack[rowcnt].Effect = $E then if Detrack[rowcnt].Operand shr 4 = 8 then begin Detrack[rowcnt].Effect:=8; Detrack[rowcnt].Operand:=(Detrack[rowcnt].Operand and $F) shl 4; end; if modeffmode then begin if (Detrack[rowcnt].Effect=5) and (Detrack[rowcnt].Operand=0) then Detrack[rowcnt].Effect:=3; if (Detrack[rowcnt].Effect=6) and (Detrack[rowcnt].Operand=0) then Detrack[rowcnt].Effect:=4; if (Detrack[rowcnt].Effect=$A) and (Detrack[rowcnt].Operand=0) then begin Detrack[rowcnt].Effect:=0; Detrack[rowcnt].Operand:=0; end; end;*/ rowcnt++; if (effectCnt > maxEffectsPerRow) maxEffectsPerRow = effectCnt; effectCnt = 1; } i+=len; } while (rowcnt<256); return maxEffectsPerRow; } static void demuxTrack(mp_ubyte* track, MytrackSlot* deTrack) { memset(deTrack, 0, sizeof(MytrackSlot)*256); mp_sint32 y; mp_sint32 i = 0; mp_sint32 rowcnt = 0; mp_sint32 effectCnt = 1; mp_sint32 maxEffectsPerRow = 0; do { mp_ubyte x = track[i]; mp_ubyte rep = x >> 5; mp_ubyte len = x & 31; for (mp_ubyte repcnt = 0; repcnt <= rep; repcnt++) { y = 1; if (len > 1) { for (mp_ubyte c = 1; c <= len-1; c++) { if (track[y+i]) { switch (track[y+i]) { case 1: deTrack[rowcnt].note = track[y+i+1]+1; if (deTrack[rowcnt].note == 97) deTrack[rowcnt].note = XModule::NOTE_OFF; y+=2; c++; break; case 2: deTrack[rowcnt].instrument = track[y+i+1]+1; y+=2; c++; break; case 13: if (track[y+i+1]) { deTrack[rowcnt].effects[effectCnt] = 0xA; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; } else { deTrack[rowcnt].effects[effectCnt] = 0; deTrack[rowcnt].operands[effectCnt] = 0; } y+=2; c++; effectCnt++; break; case 15: deTrack[rowcnt].effects[0] = 0x0C; deTrack[rowcnt].operands[0] = XModule::vol64to255(track[y+i+1]); y+=2; c++; break; case 19: deTrack[rowcnt].effects[effectCnt] = 0xF; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; case 20: deTrack[rowcnt].effects[effectCnt] = 0x49; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; case 21: deTrack[rowcnt].effects[effectCnt] = 0x48; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; case 22: deTrack[rowcnt].effects[effectCnt] = 0x47; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; case 23: // key off? deTrack[rowcnt].effects[effectCnt] = 51; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; case 24: deTrack[rowcnt].effects[effectCnt] = 27; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; case 25: deTrack[rowcnt].effects[effectCnt] = 0x0F; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; case 26: deTrack[rowcnt].effects[effectCnt] = 0x0A; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; case 27: deTrack[rowcnt].effects[effectCnt] = 0x14; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; y+=2; c++; effectCnt++; break; default: deTrack[rowcnt].effects[effectCnt] = track[y+i]-3; deTrack[rowcnt].operands[effectCnt] = track[y+i+1]; if (deTrack[rowcnt].effects[effectCnt] == 0xC) { deTrack[rowcnt].operands[effectCnt] = XModule::vol64to255(deTrack[rowcnt].operands[effectCnt]); } else if (deTrack[rowcnt].effects[effectCnt] == 0xE) { deTrack[rowcnt].effects[effectCnt] = (deTrack[rowcnt].operands[effectCnt]>>4)+0x30; deTrack[rowcnt].operands[effectCnt]&=0x0F; } else if (deTrack[rowcnt].effects[effectCnt] == 0xD) { deTrack[rowcnt].operands[effectCnt] = ((deTrack[rowcnt].operands[effectCnt]/10)<<4) + (deTrack[rowcnt].operands[effectCnt]%10); } else if (deTrack[rowcnt].effects[effectCnt] == 0) { deTrack[rowcnt].effects[effectCnt] = 0x20; } y+=2; c++; effectCnt++; } } } } /*if (detrack[rowcnt].Effect = $E then if Detrack[rowcnt].Operand shr 4 = 8 then begin Detrack[rowcnt].Effect:=8; Detrack[rowcnt].Operand:=(Detrack[rowcnt].Operand and $F) shl 4; end; if modeffmode then begin if (Detrack[rowcnt].Effect=5) and (Detrack[rowcnt].Operand=0) then Detrack[rowcnt].Effect:=3; if (Detrack[rowcnt].Effect=6) and (Detrack[rowcnt].Operand=0) then Detrack[rowcnt].Effect:=4; if (Detrack[rowcnt].Effect=$A) and (Detrack[rowcnt].Operand=0) then begin Detrack[rowcnt].Effect:=0; Detrack[rowcnt].Operand:=0; end; end;*/ rowcnt++; if (effectCnt > maxEffectsPerRow) maxEffectsPerRow = effectCnt; effectCnt = 1; } i+=len; } while (rowcnt<256); } mp_sint32 LoaderUNI::load(XMFileBase& f, XModule* module) { Uniheader uniheader; Uniinstrument uniinstrument; Unisample unisample; mp_uint32 i,j; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(uniheader.FileID, 1, 4); mp_sbyte uniVersion = -1; uniheader.NumChannels = f.readByte(); uniheader.SongLength = f.readWord(); if (uniheader.FileID[3] == '4') uniVersion = 4; else if (uniheader.FileID[3] == '5') uniVersion = 5; if (uniVersion == -1) return -8; if (uniVersion == 5) uniheader.RepeatPos = f.readWord(); else uniheader.RepeatPos = 0; uniheader.NumPatterns = f.readWord(); uniheader.NumTracks = f.readWord(); uniheader.NumIns = f.readWord(); uniheader.InitSpeed = f.readByte(); uniheader.InitTempo = f.readByte(); //f.read(uniheader.OrderList, 1, 256); f.read(header->ord, 1, 256); f.read(uniheader.DefPanning, 1, 32); uniheader.Flags = f.readByte(); i = f.readWord(); mp_ubyte* text = new mp_ubyte[i]; if (text == NULL) return -7; f.read(text, 1, i); if (i > 32) i = 32; memcpy(header->name, text, i); delete[] text; i = f.readWord(); text = new mp_ubyte[i]; if (text == NULL) return -7; f.read(text, 1, i); if (i > 16) i = 16; memcpy(header->sig, text, i); delete[] text; i = f.readWord(); f.seekWithBaseOffset(f.posWithBaseOffset() + i); // convert header data header->ordnum = (mp_uword)uniheader.SongLength; header->restart = (mp_uword)uniheader.RepeatPos; header->channum = (mp_uword)uniheader.NumChannels; header->patnum = (mp_uword)uniheader.NumPatterns; header->insnum = (mp_uword)uniheader.NumIns; header->tempo = uniheader.InitSpeed; header->speed = uniheader.InitTempo; header->freqtab = (uniheader.Flags>>1)&1; header->mainvol = 255; mp_sint32 s = 0; mp_sint32 e = 0; for (i = 0; i < uniheader.NumIns; i++) { uniinstrument.NumSamps = f.readByte(); f.read(uniinstrument.SampleNums, 1, 96); uniinstrument.volflg = f.readByte(); uniinstrument.volpts = f.readByte(); uniinstrument.volsus = f.readByte(); uniinstrument.volbeg = f.readByte(); uniinstrument.volend = f.readByte(); f.readWords((mp_uword*)uniinstrument.VolPoints, 12*2); uniinstrument.panflg = f.readByte(); uniinstrument.panpts = f.readByte(); uniinstrument.pansus = f.readByte(); uniinstrument.panbeg = f.readByte(); uniinstrument.panend = f.readByte(); f.readWords((mp_uword*)uniinstrument.PanPoints, 12*2); uniinstrument.vibtype = f.readByte(); uniinstrument.vibsweep = f.readByte(); uniinstrument.vibdepth = f.readByte(); uniinstrument.vibrate = f.readByte(); uniinstrument.volfade = f.readWord(); mp_sint32 len = f.readWord(); text = new mp_ubyte[len]; if (text == NULL) return -7; f.read(text, 1, len); if (len > 32) len = 32; memcpy(instr[i].name, text, len); delete[] text; #ifdef VERBOSE printf("%s\n",text); #endif // convert instrument data instr[i].samp = uniinstrument.NumSamps; for (j = 0; j < 96; j++) instr[i].snum[j] = uniinstrument.SampleNums[j] + s; //memcpy(instr[i].name, text, len); // envelopes TEnvelope venv; TEnvelope penv; memset(&venv,0,sizeof(venv)); memset(&penv,0,sizeof(penv)); mp_sint32 k; for (k = 0; k < 12; k++) { venv.env[k][0] = uniinstrument.VolPoints[k*2]; venv.env[k][1] = uniinstrument.VolPoints[k*2+1]; } for (k = 0; k < 12; k++) { penv.env[k][0] = uniinstrument.PanPoints[k*2]; penv.env[k][1] = uniinstrument.PanPoints[k*2+1]; } venv.num = uniinstrument.volpts; penv.num = uniinstrument.panpts; venv.sustain = uniinstrument.volsus; venv.loops = uniinstrument.volbeg; venv.loope = uniinstrument.volend; penv.sustain = uniinstrument.pansus; penv.loops = uniinstrument.panbeg; penv.loope = uniinstrument.panend; venv.type = uniinstrument.volflg; penv.type = uniinstrument.panflg; if (!module->addVolumeEnvelope(venv)) return -7; if (!module->addPanningEnvelope(penv)) return -7; for (j = 0; j < uniinstrument.NumSamps; j++) { unisample.C2spd = f.readWord(); unisample.relnotenum = f.readByte(); unisample.volume = f.readByte(); unisample.panning = f.readByte(); unisample.smplength = f.readDword(); unisample.smploopstart = f.readDword(); unisample.smploopend = f.readDword(); unisample.flags = f.readWord(); mp_sint32 len = f.readWord(); text = new mp_ubyte[len]; if (text == NULL) return -7; f.read(text, 1, len); if (len > 32) len = 32; memcpy(smp[s].name, text, len); delete[] text; // convert sample data smp[s].vibtype = uniinstrument.vibtype; smp[s].vibsweep = uniinstrument.vibsweep; smp[s].vibdepth = uniinstrument.vibdepth << 1; smp[s].vibrate = uniinstrument.vibrate; smp[s].volfade = uniinstrument.volfade << 1; smp[s].venvnum = e + 1; smp[s].penvnum = e + 1; if (uniVersion == 4) { if ((unisample.flags & 32) == 0) smp[s].flags |= 128; // no delta if ((unisample.flags & 4) == 0) smp[s].flags |= 64; // usigned } else { if ((unisample.flags & 4) == 0) smp[s].flags |= 128; // no delta if ((unisample.flags & 2) == 0) smp[s].flags |= 64; // unsigned } // 16 bit sample /*if (unisample.flags & 1) { unisample.smplength <<= 1; unisample.smploopstart <<= 1; unisample.smploopend <<= 1; }*/ //memcpy(smp[s].name, text, len); smp[s].vol = XModule::vol64to255(unisample.volume); smp[s].pan = unisample.panning; smp[s].samplen = unisample.smplength; smp[s].loopstart = unisample.smploopstart; smp[s].looplen = unisample.smploopend - unisample.smploopstart; smp[s].flags |= 3; mp_ubyte type = 0; if (uniVersion == 4) { type=0; if ((unisample.flags & 8) == 8) type = 1; if ((unisample.flags & 16) == 16) type = 2; if ((unisample.flags & 1) == 1) type+=16; } else if (uniVersion == 5) { if (((unisample.flags>>4) & 3) == 0) type = 0; if (((unisample.flags>>4) & 3) == 1) type = 1; if (((unisample.flags>>4) & 3) == 3) type = 2; if (unisample.flags&1) type+=16; } smp[s].type = type; if (!(uniheader.Flags&1)) { mp_sbyte rnn = 0; mp_sbyte ft = 0; switch (unisample.C2spd) { case 8280: ft=-16; break; case 8232: ft=-32; break; case 8169: ft=-48; break; case 8107: ft=-64; break; case 8046: ft=-80; break; case 7985: ft=-96; break; case 7941: ft=-112; break; case 7895: ft=-128; break; case 8363: ft=0; break; case 8413: ft=16; break; case 8463: ft=32; break; case 8529: ft=48; break; case 8581: ft=64; break; case 8651: ft=96; break; case 8723: ft=112; break; case 8757: ft=127; break; default: XModule::convertc4spd(unisample.C2spd, &ft, &rnn); break; } smp[s].relnote = rnn; smp[s].finetune = ft; } else { smp[s].finetune = (mp_sbyte)(unisample.C2spd - 128); smp[s].relnote = unisample.relnotenum; } s++; } e++; } header->smpnum = s; mp_uword* patternRows = new mp_uword[uniheader.NumPatterns]; mp_uword* trackSeq = new mp_uword[uniheader.NumPatterns*uniheader.NumChannels]; f.readWords(patternRows, uniheader.NumPatterns); f.readWords(trackSeq, uniheader.NumPatterns*uniheader.NumChannels); mp_ubyte** tracks = new mp_ubyte*[uniheader.NumTracks]; for (i = 0; i < uniheader.NumTracks; i++) { mp_uint32 len = f.readWord(); tracks[i] = new mp_ubyte[len]; f.read(tracks[i], 1, len); #ifdef VERBOSE printf("Maximum number of effects in track %i: %i\n",i,getMaxEffectsFromTrack(tracks[i])); #endif } MytrackSlot* deTrack = new MytrackSlot[256]; mp_sint32 trackIndex = 0; for (i = 0; i < uniheader.NumPatterns; i++) { mp_sint32 maxEffects = 0; for (j = 0; j < uniheader.NumChannels; j++) { #ifdef VERBOSE printf("%i, ",trackSeq[trackIndex]); #endif if ((s=getMaxEffectsFromTrack(tracks[trackSeq[trackIndex]])) > maxEffects) maxEffects = s; trackIndex++; } trackIndex-=uniheader.NumChannels; #ifdef VERBOSE printf("Maxeffects for pattern %i: %i\n", i, maxEffects); #endif phead[i].rows = patternRows[i]; phead[i].effnum = maxEffects; phead[i].channum = uniheader.NumChannels; mp_sint32 slotSize = (phead[i].effnum * 2 + 2); phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum * slotSize]; // out of memory? if (phead[i].patternData == NULL) { delete[] deTrack; for (i = 0; i < uniheader.NumTracks; i++) delete[] tracks[i]; delete[] tracks; delete[] trackSeq; delete[] patternRows; return -7; } memset(phead[i].patternData, 0, phead[i].rows*header->channum * slotSize); mp_ubyte* pattern = phead[i].patternData; for (mp_sint32 c = 0; c < uniheader.NumChannels; c++) { demuxTrack(tracks[trackSeq[trackIndex]], deTrack); for (mp_sint32 rows = 0; rows < phead[i].rows; rows++) { mp_sint32 offset = (rows * slotSize*uniheader.NumChannels) + (slotSize * c); pattern[offset++] = deTrack[rows].note; pattern[offset++] = deTrack[rows].instrument; for (mp_sint32 eff = 0; eff < phead[i].effnum; eff++) { pattern[offset++] = deTrack[rows].effects[eff]; pattern[offset++] = deTrack[rows].operands[eff]; #ifdef VERBOSE if (c == 9 && i == 1 && eff == 1) { printf("%x, %x\n",deTrack[rows].effects[eff],deTrack[rows].operands[eff]); } #endif } } trackIndex++; } } delete[] deTrack; for (i = 0; i < uniheader.NumTracks; i++) delete[] tracks[i]; delete[] tracks; delete[] trackSeq; delete[] patternRows; // lad ma samples du penner for (i=0;ismpnum;i++) { #ifdef VERBOSE printf("%i\n",smp[i].type); #endif //if (!smp[i].samplen) // continue; if (smp[i].type & 16) smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen<<1); else smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen); if (smp[i].sample == NULL) { return -7; } mp_sint32 loadFlags = XModule::ST_DEFAULT; if (smp[i].type & 16) loadFlags |= XModule::ST_16BIT; if (((smp[i].flags >> 7) & 1) == 0) loadFlags |= XModule::ST_DELTA; if (((smp[i].flags >> 6) & 1) == 1) loadFlags |= XModule::ST_UNSIGNED; // 16bit sample if (smp[i].type & 16) { if (!module->loadSample(f,smp[i].sample,smp[i].samplen<<1,smp[i].samplen,loadFlags)) { return -7; } } // 8bit sample else { if (!module->loadSample(f,smp[i].sample,smp[i].samplen,smp[i].samplen,loadFlags)) { return -7; } } } header->volenvnum = module->numVEnvs; header->panenvnum = module->numPEnvs; strcpy(header->tracker,"..converted.."); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderAMS.cpp0000644000175000017500000010031711163403715021503 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderAMS.cpp * MilkyPlay Module Loader: Velvet Studio and Extreme Tracker formats * * Created by Peter Barth on 17.12.04. * */ #include "Loaders.h" #ifdef VERBOSE #include #endif // Hm well, AMS can handle up to 7 effects but my player is only configured to handle 4 #define MAXEFFECTS MP_NUMEFFECTS static void convertAMSEffects(mp_ubyte& effect, mp_ubyte& operand) { switch (effect) { case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x09: case 0x0A: case 0x0B: case 0x0D: case 0x0F: break; case 0x0E: effect = 0x30 + (operand >> 4); operand &= 0xF; // break sample loop if (effect == 0x38 && !operand) { effect = 0x4F; operand = 0x3; } break; case 0x08: operand = (mp_ubyte)XModule::pan15to255(operand); break; case 0x10: effect = 0x4F; if (operand > 2) effect = operand = 0; break; case 0x11: effect = 0x41; break; case 0x12: effect = 0x42; break; case 0x13: effect = 0x1B; break; case 0x18: operand = ((operand & 0xf) << 4) | (operand>>4); break; case 0x1A: if (operand & 0xF) { effect = 0x46; operand = (operand&0xF)<<1; } else if (operand >> 4) { effect = 0x45; operand = (operand>>4)<<1; } break; case 0x1C: effect = 0x50; operand = XModule::vol127to255(operand); break; case 0x1E: switch (operand>>4) { case 0x01: effect = 0x31; operand &= 0xF; break; case 0x02: effect = 0x32; operand &= 0xF; break; // extra fine volume slide up case 0x0A: effect = 0x4B; operand = (operand&0xf)<<1; break; // extra fine volume slide down case 0x0B: effect = 0x4C; operand = (operand&0xf)<<1; break; default: #ifdef VERBOSE printf("Missing: E%x\n", operand>>4); #endif break; }; break; case 0x20: effect = 0x51; break; case 0x21: effect = 1; break; case 0x22: effect = 2; break; case 0x2A: effect = 0x1E; if (operand & 0xF) { operand = 0xB0 + ((((operand & 0xF) << 1) < 0x10) ? ((operand & 0xF) << 1) : 0xF); } else if (operand >> 4) { operand = 0xA0 + ((((operand >> 4) << 1) < 0x10) ? ((operand >> 4) << 1) : 0xF); } break; case 0x2C: effect = 0x10; operand = XModule::vol127to255(operand); break; case 0x0C: operand = XModule::vol127to255(operand); break; default: #ifdef VERBOSE printf("Missing: %x/%x\n", effect, operand); #endif effect = operand = 0; break; } } mp_uint32 UnpackMethod1(mp_ubyte* input, mp_ubyte* output, mp_uint32 inputsize); static const mp_sint32 loadAMSSamples(XModule* module, XMFileBase& f) { // this will make code much easier to read TXMHeader* header = &module->header; TXMSample* smp = module->smp; mp_sint32 i,j; for (i = 0; i < header->smpnum; i++) { if (!(smp[i].flags & 64)) { if (smp[i].flags & 128) { mp_sint32 pos = f.posWithBaseOffset(); j = f.readDword(); mp_sint32 packedSize = f.readDword(); mp_ubyte* packedData = new mp_ubyte[j>(packedSize+9)?j:(packedSize*2+9)]; if (packedData == NULL) { return -7; } f.seekWithBaseOffset(pos); f.read(packedData, 1, packedSize + 9); smp[i].sample = (mp_sbyte*)module->allocSampleMem(j); if (smp[i].sample == NULL) { delete[] packedData; return -7; } UnpackMethod1(packedData, (mp_ubyte*)smp[i].sample, packedSize); if (smp[i].type&16) { mp_sword* buffer = (mp_sword*)smp[i].sample; for (j = 0; j < (signed)smp[i].samplen; j++) { mp_sword v = LittleEndian::GET_WORD(buffer); *buffer++ = v; } } delete[] packedData; } else { if (!(smp[i].type&16)) { smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen); if (smp[i].sample == NULL) { return -7; } if (!module->loadSample(f,smp[i].sample,smp[i].samplen,smp[i].samplen)) { return -7; } } else { smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen*2); if (smp[i].sample == NULL) { return -7; } if (!module->loadSample(f,smp[i].sample, smp[i].samplen*2, smp[i].samplen, XModule::ST_16BIT)) { return -7; } } } } } return 0; } const char* LoaderAMSv1::identifyModule(const mp_ubyte* buffer) { // check for .AMS module if (!memcmp(buffer,"Extreme\x30\x1",9)) { return "AMSv1"; } return NULL; } mp_sint32 LoaderAMSv1::load(XMFileBase& f, XModule* module) { mp_sint32 i,j; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(header->sig, 1, 7); if (f.readWord() != 0x130) return -8; header->mainvol = 0xff; memcpy(header->tracker, "Extreme Tracker", 15); i = f.readByte(); header->channum = (i & 31) + 1; mp_ubyte effnum = i>>5; header->insnum = f.readByte(); header->patnum = f.readWord(); header->ordnum = f.readWord(); header->speed = 125; header->tempo = 6; f.readByte(); i = f.readWord(); f.seekWithBaseOffset(f.posWithBaseOffset() + i); mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { mp_sint32 smpLen = f.readDword(); if (smpLen) { instr[i].samp = 1; for (j = 0; j < 120; j++) instr[i].snum[j] = s; } mp_sint32 loopStart = f.readDword(); mp_sint32 loopEnd = f.readDword(); mp_ubyte panPosFinetune = f.readByte(); mp_sint32 c4spd = f.readWord(); mp_ubyte volume = f.readByte(); mp_ubyte infoByte = f.readByte(); if (instr[i].samp) { smp[s].samplen = smpLen; smp[s].loopstart = loopStart; smp[s].looplen = loopEnd - loopStart; mp_sint32 newC4spd = XModule::getc4spd(0, XModule::modfinetunes[panPosFinetune & 0xF]); newC4spd = (c4spd*newC4spd) / 8363; XModule::convertc4spd(newC4spd, &smp[s].finetune, &smp[s].relnote); smp[s].vol = XModule::vol127to255(volume); if (loopEnd) smp[s].type = 1; // 16 bit sample smp[s].type |= (infoByte&128)>>3; // mark as packed sample (for now) smp[s].flags = ((infoByte&1) << 7) | 1; if (panPosFinetune >> 4) { smp[s].flags |= 2; smp[s].pan = (((panPosFinetune >> 4)-1)*1259226) >> 16; } else { smp[s].pan = 0x80; } s++; } } header->smpnum = s; i = f.readByte(); f.read(header->name, 1, i); for (j = 0; j < header->insnum; j++) { i = f.readByte(); f.read(instr[j].name, 1, i); } for (j = 0; j < header->channum; j++) { i = f.readByte(); f.seekWithBaseOffset(f.posWithBaseOffset()+i); } for (j = 0; j < header->patnum; j++) { i = f.readByte(); f.seekWithBaseOffset(f.posWithBaseOffset()+i); } // read song message mp_sint32 size = f.readWord(); mp_ubyte* packedSongMessage = new mp_ubyte[size]; f.read(packedSongMessage, 1, size); j = 0; for (i = 0; i < size; i++) { if (packedSongMessage[i] & 0x80) j+=packedSongMessage[i] & 127; else j++; } char* unpackedSongMessage = new char[j+1]; j = 0; for (i = 0; i < size; i++) { if (packedSongMessage[i] & 0x80) { mp_sint32 len = packedSongMessage[i] & 0x7f; for (mp_sint32 k = 0; k < len; k++) unpackedSongMessage[j++] = ' '; } else unpackedSongMessage[j++] = packedSongMessage[i]; } unpackedSongMessage[j] = '\0'; delete[] packedSongMessage; for (i = 0; i < j; i++) { char line[80]; memset(line, 0, sizeof(line)); if (j - i >= 75) { XModule::convertStr(line, unpackedSongMessage+i, 76, false); i+=75; } else { XModule::convertStr(line, unpackedSongMessage+i, j-i, false); i+=j-i; } module->addSongMessageLine(line); } delete[] unpackedSongMessage; #ifdef VERBOSE printf("%s",module->message); #endif mp_uword* orders = new mp_uword[header->ordnum]; f.readWords(orders, header->ordnum); if (header->ordnum > 255) header->ordnum = 255; for (i = 0; i < header->ordnum; i++) header->ord[i] = (mp_ubyte)orders[i]; delete[] orders; for (i = 0; i < header->patnum; i++) { mp_sint32 patSize = f.readDword(); phead[i].rows = 64; phead[i].channum = (mp_ubyte)header->channum; phead[i].effnum = effnum; if (phead[i].effnum > MAXEFFECTS) phead[i].effnum = MAXEFFECTS; mp_sint32 slotSize = phead[i].effnum*2 + 2; phead[i].patternData = new mp_ubyte[slotSize * phead[i].channum * phead[i].rows]; if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData, 0, slotSize * phead[i].channum * phead[i].rows); if (patSize) { mp_ubyte* pattern = new mp_ubyte[patSize*2]; if (pattern == NULL) { return -7; } memset(pattern, 0xff, patSize*2); f.read(pattern, 1, patSize); mp_ubyte fullRow[(7*2+2)*32]; mp_sint32 patOfs = 0; mp_sint32 rowOfs = 0; memset(fullRow, 0, sizeof(fullRow)); mp_sint32 rowCnt = 0; while (patOfs < patSize) { mp_ubyte ins = 0; mp_ubyte note = 0; mp_ubyte b = 0; mp_ubyte flag = 0; if ((b = pattern[patOfs++]) != 0xFF) { // channel rowOfs = (b & 31)*slotSize; flag = 1; // if bit 6 not set, read note and instrument if (!(b & 64)) { note = pattern[patOfs++]; ins = pattern[patOfs++]; flag = note>>7; note = note&127; if (note) note += 12; fullRow[rowOfs++] = note; fullRow[rowOfs++] = ins; } else rowOfs+=2; if (flag) { mp_sint32 numfx = 0; while (true) { mp_ubyte command = pattern[patOfs++]; // volume if (command & 64) { // add volume if (numfx < phead[i].effnum) { fullRow[rowOfs++] = 0x0C; fullRow[rowOfs++] = XModule::vol127to255((command&63)<<1); } else { #ifdef VERBOSE printf("Skipping"); #endif } numfx++; } else { mp_ubyte operand = pattern[patOfs++]; mp_ubyte effect = command & 63; convertAMSEffects(effect, operand); if (numfx < phead[i].effnum) { fullRow[rowOfs++] = effect; fullRow[rowOfs++] = operand; } else { #ifdef VERBOSE printf("Skipping"); #endif } numfx++; } if (!(command & 128)) break; } } } // row finished? if ((b & 128)) { ASSERT(rowCnt < phead[i].rows); memcpy(phead[i].patternData + rowCnt * phead[i].channum * slotSize, fullRow, slotSize * phead[i].channum); memset(fullRow, 0, sizeof(fullRow)); rowCnt++; } } #ifdef VERBOSE printf("Pattern (%i) finished %i/%i, %i/%i\n", i, patOfs, patSize, rowCnt, phead[i].rows); #endif delete[] pattern; } } if (loadAMSSamples(module, f) != 0) return -7; module->setDefaultPanning(); module->postProcessSamples(); return 0; } const char* LoaderAMSv2::identifyModule(const mp_ubyte* buffer) { // check for .AMS module if (!memcmp(buffer,"AMShdr\x1a",7)) { return "AMSv2"; } return NULL; } mp_sint32 LoaderAMSv2::load(XMFileBase& f, XModule* module) { mp_sint32 i,j,k; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(header->sig, 1, 6); f.readByte(); i = f.readByte(); f.read(header->name, 1, i); mp_sint32 ver = f.readWord(); if ((ver != 0x202) && (ver != 0x201)) return -8; header->mainvol = 0xff; memcpy(header->tracker, "Velvet Studio", 13); header->insnum = f.readByte(); header->patnum = f.readWord(); header->ordnum = f.readWord(); if (ver == 0x202) header->speed = f.readWord() >> 8; else header->speed = f.readByte(); header->tempo = f.readByte(); mp_sint32 defaultChannels, defaultCommands, defaultRows, flags; if (ver == 0x202) { defaultChannels = f.readByte(); defaultCommands = f.readByte(); defaultRows = f.readByte(); flags = f.readWord(); } else flags = f.readByte(); header->freqtab = (flags>>6)&1; mp_ubyte* shadowInsLut = new mp_ubyte[header->insnum*16]; mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { j = f.readByte(); f.read(instr[i].name, 1, j); instr[i].samp = f.readByte(); if (instr[i].samp) { mp_ubyte nbu[120]; f.read(nbu, 1, 120); for (j = 0; j < 120; j++) instr[i].snum[j] = nbu[j] + s; mp_sint32 envSpeed; mp_sint32 susPt; mp_sint32 loopStart; mp_sint32 loopEnd; mp_sint32 numPts; mp_ubyte envelope[64*3]; TEnvelope env; // read volume envelope envSpeed = f.readByte(); susPt = f.readByte(); loopStart = f.readByte(); loopEnd = f.readByte(); numPts = f.readByte(); f.read(envelope, 3, numPts); if (numPts) { memset(&env,0,sizeof(env)); mp_uword x = 0; for (j = 0; j < numPts; j++) { mp_uword dx = (mp_uword)envelope[j*3] + (((mp_uword)envelope[j*3+1] << 8) & 256); x+=dx; env.env[j][0] = x; env.env[j][1] = XModule::vol127to255(envelope[j*3+2]); } env.num = numPts; env.sustain = susPt; env.loops = loopStart; env.loope = loopEnd; env.speed = envSpeed; if (!module->addVolumeEnvelope(env)) { delete[] shadowInsLut; return -7; } } // read panning envelope envSpeed = f.readByte(); susPt = f.readByte(); loopStart = f.readByte(); loopEnd = f.readByte(); numPts = f.readByte(); f.read(envelope, 3, numPts); if (numPts) { memset(&env,0,sizeof(env)); mp_uword x = 0; for (j = 0; j < numPts; j++) { mp_uword dx = (mp_uword)envelope[j*3] + (((mp_uword)envelope[j*3+1] << 8) & 256); x+=dx; env.env[j][0] = x; env.env[j][1] = envelope[j*3+2]; } env.num = numPts; env.sustain = susPt; env.loops = loopStart; env.loope = loopEnd; env.speed = envSpeed; if (!module->addPanningEnvelope(env)) { delete[] shadowInsLut; return -7; } } // read vibrato envelope envSpeed = f.readByte(); susPt = f.readByte(); loopStart = f.readByte(); loopEnd = f.readByte(); numPts = f.readByte(); f.read(envelope, 3, numPts); if (numPts) { memset(&env,0,sizeof(env)); mp_uword x = 0; for (j = 0; j < numPts; j++) { mp_uword dx = (mp_uword)envelope[j*3] + (((mp_uword)envelope[j*3+1] << 8) & 256); x+=dx; env.env[j][0] = x; env.env[j][1] = envelope[j*3+2]; } env.num = numPts; env.sustain = susPt; env.loops = loopStart; env.loope = loopEnd; env.speed = envSpeed; if (!module->addVibratoEnvelope(env)) { delete[] shadowInsLut; return -7; } } mp_sint32 shadowIns = f.readByte(); instr[i].res = shadowIns; mp_sint32 vibAmpVolFade = f.readWord(); mp_sint32 envFlags = f.readWord(); // convert volume envelope flags if ((envFlags & 4) && module->numVEnvs) { module->venvs[module->numVEnvs-1].type |= 1; } if ((envFlags & 2) && module->numVEnvs) { module->venvs[module->numVEnvs-1].type |= 2; } if ((envFlags & 1) && module->numVEnvs) { module->venvs[module->numVEnvs-1].type |= 4; } if ((envFlags & 512) && module->numVEnvs) { module->venvs[module->numVEnvs-1].type |= 8; } // convert panning envelope flags if ((envFlags & 32) && module->numPEnvs) { module->penvs[module->numPEnvs-1].type |= 1; } if ((envFlags & 16) && module->numPEnvs) { module->penvs[module->numPEnvs-1].type |= 2; } if ((envFlags & 8) && module->numPEnvs) { module->penvs[module->numPEnvs-1].type |= 4; } if ((envFlags & 1024) && module->numPEnvs) { module->penvs[module->numPEnvs-1].type |= 8; } // convert vibrato envelope flags if ((envFlags & 256) && module->numVibEnvs) { module->vibenvs[module->numVibEnvs-1].type |= 1; module->vibenvs[module->numVibEnvs-1].type |= (vibAmpVolFade>>12)<<(8-2); } if ((envFlags & 128) && module->numVibEnvs) { module->vibenvs[module->numVibEnvs-1].type |= 2; } if ((envFlags & 64) && module->numVibEnvs) { module->vibenvs[module->numVibEnvs-1].type |= 4; } if ((envFlags & 2048) && module->numVibEnvs) { module->vibenvs[module->numVibEnvs-1].type |= 8; } for (j = 0; j < instr[i].samp; j++) { shadowInsLut[i*16+j] = s; //instr[i].extra[j] = s; k = f.readByte(); f.read(smp[s].name, 1, k); mp_sint32 smpLen = f.readDword(); mp_sint32 loopStart = f.readDword(); mp_sint32 loopEnd = f.readDword(); mp_sint32 smpRate = f.readWord(); mp_ubyte panPosFinetune = f.readByte(); mp_sint32 c4spd = f.readWord(); // achtung signed byte mp_sbyte relNote = f.readByte(); mp_ubyte volume = f.readByte(); mp_ubyte infoByte = f.readByte(); if (envFlags & 4) smp[s].venvnum = module->numVEnvs; if (envFlags & 32) smp[s].penvnum = module->numPEnvs; if (envFlags & 256) smp[s].vibenvnum = module->numVibEnvs; smp[s].volfade = (vibAmpVolFade & 4095) << 1; smp[s].samplen = smpLen; smp[s].loopstart = loopStart; smp[s].looplen = loopEnd - loopStart; mp_sint32 newC4spd = XModule::getc4spd(relNote, XModule::modfinetunes[panPosFinetune & 0xF]); newC4spd = (c4spd*newC4spd) / 8363; XModule::convertc4spd(newC4spd, &smp[s].finetune, &smp[s].relnote); smp[s].vol = XModule::vol127to255(volume); // looping if ((infoByte&8) && !(infoByte&16)) smp[s].type = 1; else if (infoByte&16) smp[s].type = 2; // 16 bit sample smp[s].type |= (infoByte&4)<<2; // reversed smp[s].type |= (infoByte&64)<<1; // mark as packed sample (for now) smp[s].flags = ((infoByte&1) << 7) | 1; smp[s].flags |= (shadowIns?64:0); if (panPosFinetune >> 4) { smp[s].flags |= 2; smp[s].pan = (((panPosFinetune >> 4)-1)*1259226) >> 16; } else { smp[s].pan = 0x80; } s++; } } } header->smpnum = s; header->volenvnum = module->numVEnvs; header->panenvnum = module->numPEnvs; header->vibenvnum = module->numVibEnvs; // skip composer, who needs to know the composer? :D i = f.readByte(); f.seekWithBaseOffset(f.posWithBaseOffset() + i); // skip channel names for (j = 0; j < 32; j++) { i = f.readByte(); f.seekWithBaseOffset(f.posWithBaseOffset() + i); } // read song message i = f.readDword() - 4; mp_ubyte* packedSongMessage = new mp_ubyte[i]; f.read(packedSongMessage, 1, i); mp_sint32 size = LittleEndian::GET_DWORD(packedSongMessage); char* unpackedSongMessage = new char[size+1]; mp_ubyte* srcPtr = packedSongMessage + 7; // preferred because of bounds check mp_sint32 dstPtr = 0; j = i-7; while (j>0) { if (*srcPtr == 255) { char c = *(++srcPtr); srcPtr++; for (k = 0; k < *srcPtr; k++) if (dstPtr < size) unpackedSongMessage[dstPtr++] = c; srcPtr++; j-=3; } else { if (dstPtr < size) unpackedSongMessage[dstPtr++] = *srcPtr++; j--; } } unpackedSongMessage[size] = '\0'; delete[] packedSongMessage; /*for (i = 0; i < size; i++) { printf("%c", unpackedSongMessage[i]); if ((i % 74) == 73) printf("\n"); }*/ for (i = 0; i < size; i++) { char line[80]; memset(line, 0, sizeof(line)); if (size - i >= 73) { XModule::convertStr(line, unpackedSongMessage+i, 74, false); i+=73; } else { XModule::convertStr(line, unpackedSongMessage+i, size-i, false); i+=size-i; } module->addSongMessageLine(line); } delete[] unpackedSongMessage; #ifdef VERBOSE printf("%s",module->message); #endif mp_uword* orders = new mp_uword[header->ordnum]; f.readWords(orders, header->ordnum); if (header->ordnum > 255) header->ordnum = 255; for (i = 0; i < header->ordnum; i++) header->ord[i] = (mp_ubyte)orders[i]; delete[] orders; header->channum = 0; for (i = 0; i < header->patnum; i++) { mp_sint32 patSize = f.readDword(); phead[i].rows = f.readByte()+1; mp_sint32 numEffectsChannels = f.readByte(); phead[i].channum = (numEffectsChannels & 31) + 1; if (phead[i].channum > header->channum) header->channum = phead[i].channum; phead[i].effnum = numEffectsChannels >> 5; if (phead[i].effnum > MAXEFFECTS) phead[i].effnum = MAXEFFECTS; mp_sint32 slotSize = phead[i].effnum*2 + 2; phead[i].patternData = new mp_ubyte[slotSize * phead[i].channum * phead[i].rows]; if (phead[i].patternData == NULL) { delete[] shadowInsLut; return -7; } memset(phead[i].patternData, 0, slotSize * phead[i].channum * phead[i].rows); j = f.readByte(); f.seekWithBaseOffset(f.posWithBaseOffset() + j); patSize-=(3+j); if (patSize) { mp_ubyte* pattern = new mp_ubyte[patSize*2]; if (pattern == NULL) { delete[] shadowInsLut; return -7; } memset(pattern, 0xff, patSize*2); f.read(pattern, 1, patSize); mp_ubyte fullRow[(7*2+2)*32]; mp_sint32 patOfs = 0; mp_sint32 rowOfs = 0; memset(fullRow, 0, sizeof(fullRow)); mp_sint32 rowCnt = 0; while (patOfs < patSize) { mp_ubyte ins = 0; mp_ubyte note = 0; mp_ubyte b = 0; mp_ubyte flag = 0; if ((b = pattern[patOfs++]) != 0xFF) { // channel rowOfs = (b & 31)*slotSize; flag = 1; // if bit 6 not set, read note and instrument if (!(b & 64)) { note = pattern[patOfs++]; ins = pattern[patOfs++]; /*if (ins == 0x1B) { printf("%i: %i\n",i,b&31); }*/ flag = note>>7; note = note&127; if (note) note = (note == 1)?XModule::NOTE_OFF:(note-1); fullRow[rowOfs++] = note; fullRow[rowOfs++] = ins; } else rowOfs+=2; if (flag) { mp_sint32 numfx = 0; while (true) { mp_ubyte command = pattern[patOfs++]; // volume if (command & 64) { // add volume if (numfx < phead[i].effnum) { fullRow[rowOfs++] = 0x0C; fullRow[rowOfs++] = XModule::vol127to255((command&63)<<1); } else { #ifdef VERBOSE printf("Skipping"); #endif } numfx++; } else { mp_ubyte operand = pattern[patOfs++]; mp_ubyte effect = command & 63; convertAMSEffects(effect, operand); if (numfx < phead[i].effnum) { fullRow[rowOfs++] = effect; fullRow[rowOfs++] = operand; } else { #ifdef VERBOSE printf("Skipping"); #endif } numfx++; } if (!(command & 128)) break; } } } // row finished? if ((b & 128)) { ASSERT(rowCnt < phead[i].rows); memcpy(phead[i].patternData + rowCnt * phead[i].channum * slotSize, fullRow, slotSize * phead[i].channum); memset(fullRow, 0, sizeof(fullRow)); rowCnt++; } } delete[] pattern; } } if (loadAMSSamples(module, f) != 0) { delete[] shadowInsLut; return -7; } // duplicate shadowed samples for (i = 0; i < header->smpnum; i++) { if ((smp[i].flags & 64)) { for (j = 0; j < header->insnum; j++) { for (k = 0; k < instr[j].samp; k++) // that's where i am //if (instr[j].extra[k] == i) if (shadowInsLut[j*16+k] == i) { mp_sint32 shadowIns = instr[j].res-1; // copy sample mp_sint32 size = (smp[i].type & 16)?(smp[i].samplen<<1):smp[i].samplen; smp[i].sample = (mp_sbyte*)module->allocSampleMem(size); //memcpy(smp[i].sample, smp[instr[shadowIns].extra[k]].sample, size); memcpy(smp[i].sample, smp[shadowInsLut[shadowIns*16+k]].sample, size); } } } } delete[] shadowInsLut; header->flags |= module->MODULE_AMSENVELOPES; module->setDefaultPanning(); module->postProcessSamples(); return 0; } /////////////////////////////////////////////////////////////////////////////////////////// // You better don't look at what's coming next: // I was so lazy and i had to find a way to way to decompress AMS samples packed samples // and all i had was this assembler source for unpacking so guess what? I converted // the assembler stuff right into C++ using a little helper class for representing // an x86 32bit register // No more comments... /////////////////////////////////////////////////////////////////////////////////////////// struct Reg { mp_ubyte hh,hl,lh,ll; Reg() { hh = hl = lh = ll = 0; } mp_uint32 ex() { return (mp_uint32)ll + (mp_uint32)(lh << 8) + (mp_uint32)(hl << 16) + (mp_uint32)(hh << 24); } mp_uword x() { return (mp_uword)ll + (mp_uword)(lh << 8); } void setEx(mp_uint32 v) { hh = (mp_ubyte)(v>>24); hl = (mp_ubyte)(v>>16); lh = (mp_ubyte)(v>>8); ll = (mp_ubyte)(v); } void setX(mp_uword v) { lh = (mp_ubyte)(v>>8); ll = (mp_ubyte)(v); } void add(mp_uint32 v) { setEx(ex()+v); } void sub(mp_uint32 v) { setEx(ex()-v); } void shr(mp_uint32 v) { setEx(ex()>>v); } void shl(mp_uint32 v) { setEx(ex()<>c | (b>>c))); /*;²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²² ; UnPack sample method 1 ;²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²² ; Input: ; esi = input offset ; edi = dest offset ; ecx = input size ; Output: ; ecx = output size ;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±*/ mp_uint32 UnpackMethod1(mp_ubyte* input, mp_ubyte* output, mp_uint32 inputsize) { Reg a, b, d; mp_sint32 c, di, si, bp, cx2; mp_ubyte cl; mp_ubyte packcharacter; si = 0; // mov esi,cs:inputoffset di = 0; // mov edi,cs:outputoffset inputsize = getDword(input+si); // mov ecx,fs:[esi]; mov cs:inputsize,ecx c = getDword(input+si+4); // mov ecx,fs:[esi+4] packcharacter = a.ll = *(input+si+8); // mov al,fs:[esi+8]; mov cs:packcharacter,al si+=9; // add esi,9 unpackloop: a.ll = *(input+si); // mov al,fs:[esi] si+=1; // inc esi if (a.ll == packcharacter) // cmp al,cs:packcharacter goto unpacka; // jz unpacka *(output+di) = a.ll; // mov fs:[edi],al di+=1; // inc edi c--; if (c != 0) goto unpackloop; // loop unpackloop goto endofunpack; // endofunpack unpacka: a.ll = *(input+si); // mov al,fs:[esi] si+=1; // inc esi c--; // dec ecx if (a.ll == 0) // or al,al goto putpackcharacter; // jz putpackcharacter cx2 = a.ll; // movzx ecx,al a.ll = *(input+si); // mov al,fs:[esi] si+=1; // inc esi if (cx2 == 0) // or ecx,ecx goto stosbd1; // jz @stosbd1 stosbl1: *(output+di) = a.ll; // mov fs:[edi],al di+=1; // inc edi cx2--; // dec ecx if (cx2 != 0) goto stosbl1; // jnz @stosbl1 stosbd1: c--; // dec ecx c--; // again because of the loop if (c != 0) goto unpackloop; // loop unpackloop goto endofunpack; // jmp endofunpack putpackcharacter: a.ll = packcharacter; // mov al,cs:packcharacter *(output+di) = a.ll; // mov fs:[edi],al di+=1; // inc edi c--; if (c != 0) goto unpackloop; // loop unpackloop endofunpack: di = 0; // mov edi,cs:inputoffset c = inputsize; // mov ecx,cs:inputsize a.setEx(0); // xor eax,eax d.setEx(c); // mov edx,ecx c >>= 2; // shr ecx,2 if (c == 0) // or ecx,ecx goto stosdd1; // jz @stosdd1 stosdl1: *(input+di) = a.ll; // mov fs:[edi],eax *(input+di+1) = a.lh; *(input+di+2) = a.hl; *(input+di+3) = a.hh; di+=4; // add edi,4 c--; // dec ecx if (c != 0) goto stosdl1; // jnz @stosdl1 stosdd1: c = d.ex()&3; // mov ecx,edx; and ecx,3 if (c==0) // or ecx,ecx goto stosbd2; // jz @stosbd2 stosbl2: *(input+di) = a.ll; // mov fs:[edi],al di+=1; // inc edi c--; // dec ecx if (c != 0) goto stosbl2; // jnz @stosbl2 stosbd2: di = 0; // mov edi,cs:inputoffset si = 0; // mov esi,cs:outputoffset bp = di; // mov ebp,edi c = inputsize; // mov ecx,cs:inputsize bp+=c; // add ebp,ecx d.ll = 128; // mov dl,10000000b bitunpackloop: d.lh = 0; // xor dh,dh a.ll = *(output + si); // mov al,fs:[esi] si+=1; // inc esi cl = 8; // mov cl,8 bitunpack2: b.ll = a.ll; // mov bl,al b.ll &= d.ll; // and bl,dl cl += d.lh; // add cl,dh b.ll = ror(b.ll, cl); // ror bl,cl cl -= d.lh; // sub cl,dh d.ll = ror(d.ll, 1); // ror dl,1 *(input + di) |= b.ll; // or fs:[edi],bl di+=1; // inc edi if (di != bp) // cmp edi,ebp goto notsettaback; // jnz notsettaback di = 0; // mov edi,cs:inputoffset d.lh++; // inc dh notsettaback: cl--; // dec ecx if (cl != 0) goto bitunpack2; // jnz bitunpack2 cl = d.lh; // mov cl,dh d.ll = ror(d.ll, cl); // ror dl,cl c--; if (c != 0) goto bitunpackloop; // loop bitunpackloop si = 0; // cs:inputoffset di = 0; // cs:outputoffset c = inputsize; // cs:inputsize b.ll = 0; // xor bl,bl deltaunpack: a.ll = *(input+si); // mov al,fs:[esi] si+=1; // inc esi if (a.ll == 128) // cmp al,128 goto notnegative; // jz notnegative if (!(a.ll&128)) // test al,10000000b goto notnegative; // jz notnegative a.ll&=127; // and al,01111111b a.ll = -a.ll; // neg al notnegative: b.ll-=a.ll; // sub bl,al *(output+di) = b.ll; // mov fs:[edi],bl di+=1; // inc edi c--; if (c != 0) goto deltaunpack; // loop deltaunpack return di; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderAMF.cpp0000644000175000017500000006752111163403715021477 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderAMF.cpp * MilkyPlay Module Loaders: Asylum Music Format 1.0 and DSMI AMF * * Thanks to Grom PE for the additional DMF loader which is a DSMI AMF variant * used in the Tronic, game by Webfoot Technologies inc. * * Warning: This is an one-by-one conversion of an assembler version ;) * */ #include "Loaders.h" const char* LoaderAMF_1::identifyModule(const mp_ubyte* buffer) { // check for .AMF module if (!memcmp(buffer,"ASYLUM Music Format",19)) { return "AMF_1"; } return NULL; } mp_sint32 LoaderAMF_1::load(XMFileBase& f, XModule* module) { mp_ubyte buffer[2048]; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(buffer,1,294); memcpy(header->sig,buffer,6); header->ordnum = buffer[36]; // song length header->insnum = buffer[34]; // number of instruments header->patnum = buffer[35]; // number of patterns header->speed = buffer[33]; // default tickspeed header->tempo = buffer[32]; // default tempo header->mainvol = 255; header->channum = 8; header->flags = XModule::MODULE_PTNEWINSTRUMENT; memcpy(header->ord,buffer+38,256); // order list mp_sint32 i, s = 0; for (i = 0; i < header->insnum; i++) { f.read(smp[s].name,1,22); memcpy(instr[i].name,smp[s].name,22); mp_ubyte finetune = f.readByte(); mp_ubyte volume = module->vol64to255(f.readByte()); f.readByte(); // skip something (maybe volume is a 16bit word?) mp_uint32 size = f.readDword(); mp_uint32 loopstart = f.readDword(); mp_uint32 loopend = f.readDword(); module->convertc4spd(module->sfinetunes[finetune],&smp[s].finetune,&smp[s].relnote); smp[s].flags = 1; smp[s].samplen = size; smp[s].loopstart = loopstart; smp[s].looplen = loopend; smp[s].vol = volume; if (smp[s].samplen <= 2) { instr[i].samp = 0; } else { instr[i].samp = 1; for (mp_sint32 j = 0; j < 120; j++) instr[i].snum[j] = s; if ((smp[s].loopstart+smp[s].looplen)>smp[s].samplen) smp[s].looplen-=(smp[s].loopstart+smp[s].looplen)-smp[s].samplen; if (smp[s].loopstart<=2) smp[s].loopstart=0; if (smp[s].looplen<=2) smp[s].looplen=0; else smp[s].type=1; s++; } } header->smpnum = s; f.read(buffer,1,2663-1442); for (i = 0; i < header->patnum;i++) { f.read(buffer,1,2048); phead[i].rows=64; phead[i].effnum=1; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*4]; // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum*4); mp_sint32 r,c,cnt=0; for (r=0;r<64;r++) { for (c=0;cchannum;c++) { mp_ubyte note = buffer[cnt]; mp_ubyte ins = buffer[cnt+1]; mp_ubyte eff = buffer[cnt+2]; mp_ubyte op = buffer[cnt+3]; if (note) note++; if (eff==0xE) { eff=(op>>4)+0x30; op&=0xf; if (eff == 0x38) { eff = 0x08; op<<=4; } } if ((!eff)&&op) eff=0x20; // old style modules don't support last effect for: // - portamento up/down // - volume slide if (eff==0x1&&(!op)) eff = 0; if (eff==0x2&&(!op)) eff = 0; if (eff==0xA&&(!op)) eff = 0; if (eff==0x5&&(!op)) eff=0x3; if (eff==0x6&&(!op)) eff=0x4; if (eff==0xC) { op = XModule::vol64to255(op); } phead[i].patternData[cnt]=note; phead[i].patternData[cnt+1]=ins; phead[i].patternData[cnt+2]=eff; phead[i].patternData[cnt+3]=op; cnt+=4; } } } if (module->loadModuleSamples(f) != 0) return -7; strcpy(header->tracker,"..converted.."); module->setDefaultPanning(); module->postProcessSamples(); return 0; } #if 0 const char* LoaderAMF_2::identifyModule(const mp_ubyte* buffer) { // check for .AMF module if (!memcmp(buffer,"AMF", 3)) { // check for version if (buffer[3] < 0xA || buffer[3] > 0xE) return NULL; return "AMF_2"; } return NULL; } // shamelessly copied from MikMod struct AMFNoteSlot { mp_ubyte note,instr,fxcnt; mp_ubyte effect[3]; mp_sbyte parameter[3]; }; #define CLEAN_UP \ for (j = 0; j < maxTracks; j++) \ delete[] tracks[j]; \ delete[] tracks; \ delete[] trackTable; \ delete[] rows; \ delete[] amfOrders; mp_sint32 LoaderAMF_2::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; // ---- read header info ---- f.read(header->sig, 1, 3); mp_ubyte ver = f.readByte(); f.read(header->name, 1, 32); header->insnum = f.readByte(); header->ordnum = header->patnum = f.readByte(); mp_uword numTracks = f.readWord(); header->channum = f.readByte(); mp_sint32 channelRemap[16]; if (ver >= 11) { mp_ubyte panpos[32]; f.read(panpos, 1, (ver >= 13) ? 32 : 16); } else { for (mp_sint32 i = 0; i < 16; i++) channelRemap[i] = f.readByte(); } if (ver >= 13) { // read BPM header->speed = f.readByte(); // read speed header->tempo = f.readByte(); } else { header->speed = 125; header->tempo = 6; } header->mainvol = 255; mp_sint32 i,j,k; for (i = 0; i < header->ordnum; i++) header->ord[i] = i; mp_uword* amfOrders = new mp_uword[header->channum*header->ordnum]; mp_uword* rows = new mp_uword[header->ordnum]; for (i = 0; i < header->ordnum; i++) { rows[i] = 64; if (ver >= 14) rows[i] = f.readWord(); if (ver > 10) f.readWords(amfOrders+(i*header->channum), header->channum); else { for(j = 0; j < header->channum; j++) amfOrders[i*header->channum+channelRemap[j]]=f.readWord(); } } // ---- read sample info ---- j = 0; for (i = 0; i < header->insnum; i++) { mp_ubyte type = f.readByte(); f.read(instr[i].name, 1, 32); mp_ubyte dosname[13]; f.read(dosname, 1, 13); mp_sint32 offset = f.readDword(); mp_sint32 length = f.readDword(); mp_dword c2spd = f.readWord(); mp_ubyte vol = f.readByte(); mp_sint32 loopstart; mp_sint32 loopend; if (ver >= 10) { loopstart = f.readDword(); loopend = f.readDword(); } else { loopstart = f.readWord(); loopend = length; } if (type) { memcpy(smp[j].name, dosname, 13); module->convertc4spd(c2spd, &smp[j].finetune, &smp[j].relnote); if (loopend - loopstart > 2) smp[j].type = 1; smp[j].flags = 1; smp[j].samplen = length; smp[j].loopstart = loopstart; smp[j].looplen = loopend; smp[j].vol = XModule::vol64to255(vol); instr[i].samp = 1; for (mp_sint32 k = 0; k < 120; k++) instr[i].snum[k] = j; j++; } } header->smpnum = j; mp_uword* trackTable = new mp_uword[numTracks]; mp_uword maxTracks = 0; f.readWords(trackTable, numTracks); for (i = 0; i < numTracks; i++) if (trackTable[i] > maxTracks) maxTracks = trackTable[i]; // ---- read tracks ---- AMFNoteSlot** tracks = new AMFNoteSlot*[maxTracks]; memset(tracks, 0, sizeof(AMFNoteSlot*)*maxTracks); for (i = 0; i < maxTracks; i++) { tracks[i] = new AMFNoteSlot[64]; memset(tracks[i], 0, sizeof(AMFNoteSlot)*64); AMFNoteSlot* track = tracks[i]; // shamelessly copied from MikMod mp_sint32 tracksize; mp_ubyte row,cmd; mp_sbyte arg; tracksize = f.readWord(); tracksize+=((mp_sint32)f.readByte()) << 16; if (tracksize) while(tracksize--) { row = f.readByte(); cmd = f.readByte(); arg = f.readByte(); // unexpected end of track if (!tracksize) { if((row==0xff) && (cmd==0xff) && (arg==-1)) break; /* the last triplet should be FF FF FF, but this is not always the case... maybe a bug in m2amf ? else return 0; */ } // invalid row (probably unexpected end of row) if (row>=64) { CLEAN_UP return -8; } if (cmd<0x7f) { // note, vol track[row].note=cmd+1; if (track[row].fxcnt<3) { track[row].effect[track[row].fxcnt] = 0x03; track[row].parameter[track[row].fxcnt] = (mp_ubyte)arg; track[row].fxcnt++; } } else if (cmd==0x7f) { // duplicate row if ((arg<0)&&(row+arg>=0)) { memcpy(track+row,track+(row+arg),sizeof(AMFNoteSlot)); } } else if (cmd==0x80) { // instr track[row].instr=arg+1; } else if (cmd==0xff) { // apparently, some M2AMF version fail to estimate the // size of the compressed patterns correctly, and end // up with blanks, i.e. dead triplets. Those are marked // with cmd == 0xff. Let's ignore them. } else if (track[row].fxcnt<3) { // effect, param if (cmd > 0x97) { CLEAN_UP return -8; } track[row].effect[track[row].fxcnt]=cmd&0x7f; track[row].parameter[track[row].fxcnt]=arg; track[row].fxcnt++; } else { CLEAN_UP return -8; } } } // ---- convert tracks to patterns ---- for (i = 0; i < header->ordnum; i++) { phead[i].rows = rows[i]; phead[i].channum = (mp_ubyte)header->channum; phead[i].effnum = 3; mp_sint32 slotSize = (mp_sint32)(2+phead[i].effnum*2); mp_sint32 patSize = (mp_sint32)phead[i].rows*(mp_sint32)header->channum*slotSize; phead[i].patternData = new mp_ubyte[patSize]; // out of memory? if (phead[i].patternData == NULL) { CLEAN_UP return -7; } memset(phead[i].patternData, 0, patSize); for (mp_sint32 row = 0; row < phead[i].rows; row++) for (mp_sint32 chn = 0; chn < phead[i].channum; chn++) { j = amfOrders[i*phead[i].channum+chn]; if (j && j <= numTracks) { j = trackTable[j-1]; if (j && j <= maxTracks) { AMFNoteSlot* track = tracks[j-1]; mp_ubyte* dstSlot = phead[i].patternData+row*phead[i].channum*slotSize+chn*slotSize; // convert note slot if (track[row].note) dstSlot[0] = track[row].note - 12; dstSlot[1] = track[row].instr; mp_sint32 l = 0; for (k = 0; k < track[row].fxcnt; k++) { mp_ubyte nEff = 0; mp_ubyte nOp = 0; mp_sbyte op = track[row].parameter[k]; switch (track[row].effect[k]) { // Set speed (ticks) case 0x01: nEff = 0x1C; nOp = op; break; // Volume slide case 2: nEff = 0x0A; if (op) { if (op>=0) nOp = ((op&0xf)<<4); else nOp = (-op)&0xf; } break; // set volume case 0x03: nEff = 0x0C; nOp = XModule::vol64to255(op); break; // portamento up/down case 0x04: if (op >= 0) { nEff = 0x02; nOp = op & 0xf; } else { nEff = 0x01; nOp = (-op) & 0xf; } break; // Porta to note case 0x06: nEff = 0x03; nOp = op; break; // tremor case 0x07: nEff = 0x1D; nOp = op; break; // arpeggio case 0x08: nEff = 0x20; nOp = op; break; // vibrato case 0x09: nEff = 0x04; nOp = op; break; // Porta + Volume slide case 0xA: nEff = 0x05; if (op) { if (op>=0) nOp = ((op&0xf)<<4); else nOp = (-op) & 0xf; } break; // Vibrato + Volume slide case 0xB: nEff = 0x06; if (op) { if (op>=0) nOp = ((op&0xf)<<4); else nOp = (-op) & 0xf; } break; // Pattern break (in hex) case 0xC: nEff = 0x0D; nOp = (op/10)*16 + (op%10); break; // Pos. jump case 0xD: nEff = 0x0B; nOp = op; break; // Retrig case 0xF: nEff = 0x1B; nOp = op; break; // Sample offset case 0x10: nEff = 0x09; nOp = op; break; // Fine Volume slide case 0x11: if (op) { if (op>=0) { nEff = 0x3A; nOp = op & 0x0f; } else { nEff = 0x3B; nOp = (-op) & 0x0f; } } break; // Fine Porta case 0x12: if (op) { if (op>=0) { nEff = 0x32; nOp = op & 0x0f; } else { nEff = 0x31; nOp = (-op) & 0x0f; } } break; // Note delay case 0x13: nEff = 0x3D; nOp = op; break; // Note cut case 0x14: nEff = 0x3C; nOp = op; break; // Set tempo (bpm) case 0x15: nEff = 0x16; nOp = op; break; // Set panning case 0x17: if (op > 64) { nEff = 0x08; nOp = XModule::vol64to255(op); } break; } // put volume in first command // otherwise in second if (l == 0 && nEff != 0x0C) { l = 1; } // if not first effect search for empty effect slot else { for (mp_sint32 m = 0; m < phead[i].effnum; m++) if (!dstSlot[2+m*2]) { l = m; break; } } if (nEff) { dstSlot[2+l*2] = nEff; dstSlot[2+l*2+1] = nOp; } } } } } } CLEAN_UP if (module->loadModuleSamples(f, XModule::ST_UNSIGNED) != 0) return -7; // --- kick out duplicate patterns --- mp_ubyte patReloc[255]; memset(patReloc, 0xFF, sizeof(patReloc)); for (i = 0; i < header->patnum; i++) { if (patReloc[i] == 0xFF) { for (j = 0; j < header->patnum; j++) { if ((j != i && patReloc[j] == 0xFF) && phead[i].rows == phead[j].rows && phead[i].channum == phead[j].channum && phead[i].effnum == phead[j].effnum) { mp_sint32 slotSize = (mp_sint32)(2+phead[i].effnum*2); mp_sint32 patSize = (mp_sint32)phead[i].rows*(mp_sint32)header->channum*slotSize; if (memcmp(phead[i].patternData, phead[j].patternData, patSize) == 0) { patReloc[j] = i; } } } } } for (i = 0; i < header->ordnum; i++) { if (patReloc[header->ord[i]] != 255) header->ord[i] = patReloc[header->ord[i]]; } module->removeUnusedPatterns(false); strcpy(header->tracker,"..converted.."); module->setDefaultPanning(); module->postProcessSamples(); return 0; } // --------------- #else const char* LoaderAMF_2::identifyModule(const mp_ubyte* buffer) { // check for .AMF module if (!memcmp(buffer,"DMF", 3)) { // check for version if (buffer[3] < 0xA || buffer[3] > 0xE) return NULL; return "AMF_2"; } return NULL; } // shamelessly copied from MikMod struct AMFNoteSlot { mp_ubyte note,instr,fxcnt; mp_ubyte effect[3]; mp_sbyte parameter[3]; }; #define CLEAN_UP \ for (j = 0; j < maxTracks; j++) \ delete[] tracks[j]; \ delete[] tracks; \ delete[] trackTable; \ delete[] rows; \ delete[] amfOrders; mp_sint32 LoaderAMF_2::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; // ---- read header info ---- f.read(header->sig, 1, 3); mp_ubyte ver = f.readByte(); // f.read(header->name, 1, 32); header->insnum = f.readByte(); header->ordnum = header->patnum = f.readByte(); mp_uword numTracks = f.readWord(); header->channum = f.readByte(); mp_sint32 channelRemap[16]; if (ver >= 11) { mp_ubyte panpos[32]; f.read(panpos, 1, (ver >= 13) ? 32 : 16); } else { for (mp_sint32 i = 0; i < 16; i++) channelRemap[i] = f.readByte(); } if (ver >= 13) { // read BPM header->speed = f.readByte(); // read speed header->tempo = f.readByte(); } else { header->speed = 125; header->tempo = 6; } header->mainvol = 255; mp_sint32 i,j,k; for (i = 0; i < header->ordnum; i++) header->ord[i] = i; mp_uword* amfOrders = new mp_uword[header->channum*header->ordnum]; mp_uword* rows = new mp_uword[header->ordnum]; for (i = 0; i < header->ordnum; i++) { rows[i] = 64; if (ver >= 14) rows[i] = f.readWord(); if (ver > 10) f.readWords(amfOrders+(i*header->channum), header->channum); else { for(j = 0; j < header->channum; j++) amfOrders[i*header->channum+channelRemap[j]]=f.readWord(); } } // ---- read sample info ---- j = 0; for (i = 0; i < header->insnum; i++) { mp_ubyte type = f.readByte(); // f.read(instr[i].name, 1, 32); // mp_ubyte dosname[13]; // f.read(dosname, 1, 13); // f.readByte(); // FIXME: where's missing byte? mp_sint32 offset = f.readDword() >> 8; mp_sint32 length = f.readDword() >> 8; mp_ubyte vol = f.readByte(); mp_dword c2spd = f.readWord(); // f.seek(-1, f.SeekOffsetTypeCurrent); // Restore missing byte mp_sint32 loopstart; mp_sint32 loopend; if (ver >= 10) { loopstart = f.readDword() >> 8; loopend = f.readDword() >> 8; } else { loopstart = f.readWord(); loopend = length; } if (type) { // memcpy(smp[j].name, dosname, 13); module->convertc4spd(c2spd, &smp[j].finetune, &smp[j].relnote); if (loopend - loopstart > 2) smp[j].type = 1; smp[j].flags = 1; smp[j].samplen = length; smp[j].loopstart = loopstart; smp[j].looplen = loopend; smp[j].vol = XModule::vol64to255(vol); instr[i].samp = 1; for (mp_sint32 k = 0; k < 120; k++) instr[i].snum[k] = j; j++; } } header->smpnum = j; mp_uword* trackTable = new mp_uword[numTracks]; mp_uword maxTracks = 0; f.readWords(trackTable, numTracks); for (i = 0; i < numTracks; i++) if (trackTable[i] > maxTracks) maxTracks = trackTable[i]; // ---- read tracks ---- AMFNoteSlot** tracks = new AMFNoteSlot*[maxTracks]; memset(tracks, 0, sizeof(AMFNoteSlot*)*maxTracks); for (i = 0; i < maxTracks; i++) { tracks[i] = new AMFNoteSlot[64]; memset(tracks[i], 0, sizeof(AMFNoteSlot)*64); AMFNoteSlot* track = tracks[i]; // shamelessly copied from MikMod mp_sint32 tracksize; mp_ubyte row,cmd; mp_sbyte arg; tracksize = f.readWord(); tracksize+=((mp_sint32)f.readByte()) << 16; if (tracksize) while(tracksize--) { row = f.readByte(); cmd = f.readByte(); arg = f.readByte(); // unexpected end of track if (!tracksize) { if((row==0xff) && (cmd==0xff) && (arg==-1)) break; /* the last triplet should be FF FF FF, but this is not always the case... maybe a bug in m2amf ? else return 0; */ } // invalid row (probably unexpected end of row) if (row>=64) { CLEAN_UP return -8; } if (cmd<0x7f) { // note, vol track[row].note=cmd+1; if (track[row].fxcnt<3) { track[row].effect[track[row].fxcnt] = 0x03; track[row].parameter[track[row].fxcnt] = (mp_ubyte)arg; track[row].fxcnt++; } } else if (cmd==0x7f) { // duplicate row if ((arg<0)&&(row+arg>=0)) { memcpy(track+row,track+(row+arg),sizeof(AMFNoteSlot)); } } else if (cmd==0x80) { // instr track[row].instr=arg+1; } else if (cmd==0xff) { // apparently, some M2AMF version fail to estimate the // size of the compressed patterns correctly, and end // up with blanks, i.e. dead triplets. Those are marked // with cmd == 0xff. Let's ignore them. } else if (track[row].fxcnt<3) { // effect, param if (cmd > 0x97) { CLEAN_UP return -8; } track[row].effect[track[row].fxcnt]=cmd&0x7f; track[row].parameter[track[row].fxcnt]=arg; track[row].fxcnt++; } else { CLEAN_UP return -8; } } } // ---- convert tracks to patterns ---- for (i = 0; i < header->ordnum; i++) { phead[i].rows = rows[i]; phead[i].channum = (mp_ubyte)header->channum; phead[i].effnum = 3; mp_sint32 slotSize = (mp_sint32)(2+phead[i].effnum*2); mp_sint32 patSize = (mp_sint32)phead[i].rows*(mp_sint32)header->channum*slotSize; phead[i].patternData = new mp_ubyte[patSize]; // out of memory? if (phead[i].patternData == NULL) { CLEAN_UP return -7; } memset(phead[i].patternData, 0, patSize); for (mp_sint32 row = 0; row < phead[i].rows; row++) for (mp_sint32 chn = 0; chn < phead[i].channum; chn++) { j = amfOrders[i*phead[i].channum+chn]; if (j && j <= numTracks) { j = trackTable[j-1]; if (j && j <= maxTracks) { AMFNoteSlot* track = tracks[j-1]; mp_ubyte* dstSlot = phead[i].patternData+row*phead[i].channum*slotSize+chn*slotSize; // convert note slot if (track[row].note) dstSlot[0] = track[row].note - 12; dstSlot[1] = track[row].instr; mp_sint32 l = 0; for (k = 0; k < track[row].fxcnt; k++) { mp_ubyte nEff = 0; mp_ubyte nOp = 0; mp_sbyte op = track[row].parameter[k]; switch (track[row].effect[k]) { // Set speed (ticks) case 0x01: nEff = 0x1C; nOp = op; break; // Volume slide case 2: nEff = 0x0A; if (op) { if (op>=0) nOp = ((op&0xf)<<4); else nOp = (-op)&0xf; } break; // set volume case 0x03: nEff = 0x0C; nOp = XModule::vol64to255(op); break; // portamento up/down case 0x04: if (op >= 0) { nEff = 0x02; nOp = op & 0xf; } else { nEff = 0x01; nOp = (-op) & 0xf; } break; // Porta to note case 0x06: nEff = 0x03; nOp = op; break; // tremor case 0x07: nEff = 0x1D; nOp = op; break; // arpeggio case 0x08: nEff = 0x20; nOp = op; break; // vibrato case 0x09: nEff = 0x04; nOp = op; break; // Porta + Volume slide case 0xA: nEff = 0x05; if (op) { if (op>=0) nOp = ((op&0xf)<<4); else nOp = (-op) & 0xf; } break; // Vibrato + Volume slide case 0xB: nEff = 0x06; if (op) { if (op>=0) nOp = ((op&0xf)<<4); else nOp = (-op) & 0xf; } break; // Pattern break (in hex) case 0xC: nEff = 0x0D; nOp = (op/10)*16 + (op%10); break; // Pos. jump case 0xD: nEff = 0x0B; nOp = op; break; // Retrig case 0xF: nEff = 0x1B; nOp = op; break; // Sample offset case 0x10: nEff = 0x09; nOp = op; break; // Fine Volume slide case 0x11: if (op) { if (op>=0) { nEff = 0x3A; nOp = op & 0x0f; } else { nEff = 0x3B; nOp = (-op) & 0x0f; } } break; // Fine Porta case 0x12: if (op) { if (op>=0) { nEff = 0x32; nOp = op & 0x0f; } else { nEff = 0x31; nOp = (-op) & 0x0f; } } break; // Note delay case 0x13: nEff = 0x3D; nOp = op; break; // Note cut case 0x14: nEff = 0x3C; nOp = op; break; // Set tempo (bpm) case 0x15: nEff = 0x16; nOp = op; break; // Set panning case 0x17: if (op > 64) { nEff = 0x08; nOp = XModule::vol64to255(op); } break; } // put volume in first command // otherwise in second if (l == 0 && nEff != 0x0C) { l = 1; } // if not first effect search for empty effect slot else { for (mp_sint32 m = 0; m < phead[i].effnum; m++) if (!dstSlot[2+m*2]) { l = m; break; } } if (nEff) { dstSlot[2+l*2] = nEff; dstSlot[2+l*2+1] = nOp; } } } } } } CLEAN_UP if (module->loadModuleSamples(f, XModule::ST_DEFAULT) != 0) return -7; // --- kick out duplicate patterns --- mp_ubyte patReloc[255]; memset(patReloc, 0xFF, sizeof(patReloc)); for (i = 0; i < header->patnum; i++) { if (patReloc[i] == 0xFF) { for (j = 0; j < header->patnum; j++) { if ((j != i && patReloc[j] == 0xFF) && phead[i].rows == phead[j].rows && phead[i].channum == phead[j].channum && phead[i].effnum == phead[j].effnum) { mp_sint32 slotSize = (mp_sint32)(2+phead[i].effnum*2); mp_sint32 patSize = (mp_sint32)phead[i].rows*(mp_sint32)header->channum*slotSize; if (memcmp(phead[i].patternData, phead[j].patternData, patSize) == 0) { patReloc[j] = i; } } } } } for (i = 0; i < header->ordnum; i++) { if (patReloc[header->ord[i]] != 255) header->ord[i] = patReloc[header->ord[i]]; } module->removeUnusedPatterns(false); strcpy(header->tracker,"..converted.."); module->setDefaultPanning(); module->postProcessSamples(); return 0; } #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/0000755000175000017500000000000011317506072020705 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/sdl/0000755000175000017500000000000011317506072021467 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/sdl/AudioDriver_SDL.h0000644000175000017500000000465011163403715024563 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_SDL.h * MilkyPlay * * Created by Peter Barth on 09.06.05. * */ #ifndef __AUDIODRIVER_SDL_H__ #define __AUDIODRIVER_SDL_H__ #include #include #include "AudioDriver_COMPENSATE.h" class AudioDriver_SDL : public AudioDriver_COMPENSATE { private: mp_uint32 periodSize; static void SDLCALL fill_audio(void *udata, Uint8 *stream, int len); public: AudioDriver_SDL(); virtual ~AudioDriver_SDL(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual const char* getDriverID() { return "SDLAudio"; } virtual mp_sint32 getPreferredBufferSize() const { return 2048; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/sdl/AudioDriver_SDL.cpp0000644000175000017500000001150011163403715025106 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_SDL.cpp * MilkyPlay * * Created by Peter Barth on 09.06.05. * * Christopher O'Neill 16/3/06: * fill_audio() rewritten to solve issues on certain systems * * */ #include "AudioDriver_SDL.h" void SDLCALL AudioDriver_SDL::fill_audio(void *udata, Uint8 *stream, int length) { AudioDriver_SDL* audioDriver = (AudioDriver_SDL*)udata; if(length>>2 != audioDriver->periodSize) fprintf(stderr, "SDL: Invalid buffer size: %i (should be %i), skipping..\n", length >> 2, audioDriver->periodSize); // See comment in AudioDriver_ALSA.cpp else audioDriver->fillAudioWithCompensation((char*)stream, length); } AudioDriver_SDL::AudioDriver_SDL() : AudioDriver_COMPENSATE() { } AudioDriver_SDL::~AudioDriver_SDL() { } // On error return a negative value // If the requested buffer size can be served return 0, // otherwise return the number of 16 bit words contained in the obtained buffer mp_sint32 AudioDriver_SDL::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { SDL_AudioSpec wanted, obtained, saved; char name[32]; mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; wanted.freq = mixFrequency; wanted.format = AUDIO_S16SYS; wanted.channels = 2; /* 1 = mono, 2 = stereo */ wanted.samples = bufferSizeInWords / wanted.channels; /* Good low-latency value for callback */ wanted.callback = fill_audio; wanted.userdata = (void*)this; mp_sint32 finalWantedSize = wanted.samples * wanted.channels; // Some soundcard drivers modify the wanted structure, so we copy it here memcpy(&saved, &wanted, sizeof(wanted)); if(SDL_OpenAudio(&wanted, &obtained) < 0) { memcpy(&wanted, &saved, sizeof(wanted)); fprintf(stderr, "SDL: Failed to open audio device! (buffer = %d bytes)..\n", saved.samples*4); fprintf(stderr, "SDL: Try setting \"Force 2^n sizes\" in the config menu and restarting.\n"); return -1; } printf("SDL: Using audio driver: %s\n", SDL_AudioDriverName(name, 32)); if(wanted.format != obtained.format) { fprintf(stderr, "SDL: Audio driver doesn't support 16-bit signed samples!\n"); return -1; } if (wanted.channels != obtained.channels) { fprintf(stderr, "SDL: Failed to obtain requested audio format. Suggested format:\n"); fprintf(stderr, "SDL: Frequency: %d\nChannels: %d\n", obtained.freq, obtained.channels); return -1; } // fallback for obtained sample rate if (wanted.freq != obtained.freq) this->mixFrequency = obtained.freq; printf("SDL: Buffer size = %i samples (requested %i)\n", obtained.samples, finalWantedSize / wanted.channels); periodSize = obtained.samples; // If we got what we requested, return 0, // otherwise return the actual number of samples * number of channels return (bufferSizeInWords / wanted.channels == obtained.samples) ? 0 : obtained.samples * obtained.channels; } mp_sint32 AudioDriver_SDL::stop() { SDL_PauseAudio(1); deviceHasStarted = false; return 0; } mp_sint32 AudioDriver_SDL::closeDevice() { SDL_CloseAudio(); deviceHasStarted = false; return 0; } mp_sint32 AudioDriver_SDL::start() { SDL_PauseAudio(0); deviceHasStarted = true; return 0; } mp_sint32 AudioDriver_SDL::pause() { SDL_PauseAudio(1); return 0; } mp_sint32 AudioDriver_SDL::resume() { SDL_PauseAudio(0); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/drivers/jack/0000755000175000017500000000000011317506072021615 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/jack/AudioDriver_JACK.cpp0000644000175000017500000001434611163403715025335 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_JACK.cpp * JACK Audio * * Created by Christopher O'Neill on 8/12/07 * * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif // Hack to simplify build scripts #ifdef HAVE_JACK_JACK_H #include #include #include #include #include "AudioDriver_JACK.h" int AudioDriver_JACK::jackProcess(jack_nframes_t nframes, void *arg) { jack_default_audio_sample_t *leftBuffer, *rightBuffer; AudioDriver_JACK* audioDriver = (AudioDriver_JACK*)arg; if(audioDriver->paused) return 0; // This could change, we need to setup a callback to deal with it // But for now, just panic assert(nframes == audioDriver->jackFrames); leftBuffer = (jack_default_audio_sample_t*) audioDriver->jack_port_get_buffer(audioDriver->leftPort, nframes); rightBuffer = (jack_default_audio_sample_t*) audioDriver->jack_port_get_buffer(audioDriver->rightPort, nframes); audioDriver->fillAudioWithCompensation((char*)audioDriver->rawStream, nframes * 4); // JACK uses non-interleaved floating-point samples, we need to convert for(int out = 0, in = 0; in < nframes; in++) { leftBuffer[in] = audioDriver->rawStream[out++] * (1.0/32768.0); rightBuffer[in] = audioDriver->rawStream[out++] * (1.0/32768.0); } return 0; } AudioDriver_JACK::AudioDriver_JACK() : AudioDriver_COMPENSATE(), paused(false), rawStream(NULL) { } AudioDriver_JACK::~AudioDriver_JACK() { if(rawStream) delete[] rawStream; } // On error return a negative value // If the requested buffer size can be served return 0, // otherwise return the number of 16 bit words contained in the obtained buffer mp_sint32 AudioDriver_JACK::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { // First load libjack libJack = dlopen("libjack.so", RTLD_LAZY); if(!libJack) { fprintf(stderr, "JACK: Can't load libjack (is it installed?)\n"); return -1; } // Get function addresses // Each function has to be cast.. surely there must be an easier way? dlerror(); jack_port_get_buffer = (void* (*)(jack_port_t*, jack_nframes_t)) dlsym(libJack, "jack_port_get_buffer"); jack_client_new = (jack_client_t* (*)(const char*)) dlsym(libJack, "jack_client_new"); jack_port_register = (jack_port_t* (*)(jack_client_t*, const char*, const char*, long unsigned int, long unsigned int)) dlsym(libJack, "jack_port_register"); jack_set_process_callback = (int (*)(jack_client_t*, int (*)(jack_nframes_t, void*), void*)) dlsym(libJack, "jack_set_process_callback"); jack_get_buffer_size = (jack_nframes_t (*)(jack_client_t*)) dlsym(libJack, "jack_get_buffer_size"); jack_deactivate = (int (*)(jack_client_t*)) dlsym(libJack, "jack_deactivate"); jack_client_close = (int (*)(jack_client_t*)) dlsym(libJack, "jack_client_close"); jack_activate = (int (*)(jack_client_t*)) dlsym(libJack, "jack_activate"); jack_get_sample_rate = (jack_nframes_t (*)(jack_client_t *)) dlsym(libJack, "jack_get_sample_rate"); if(dlerror()) { fprintf(stderr, "JACK: An error occured whilst loading symbols, aborting.\n"); return -1; } mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; // Connect to JACK hJack = jack_client_new("Milkytracker"); if (!hJack) { fprintf(stderr, "JACK: Can't connect to JACK (is it running?)\n"); return -1; } // Register ports leftPort = jack_port_register(hJack, "Left", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); rightPort = jack_port_register(hJack, "Right", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); if(!leftPort || !rightPort) { fprintf(stderr, "JACK: Failed to register ports\n"); return -1; } // Set callback jack_set_process_callback(hJack, jackProcess, (void *) this); // Get buffer-size jackFrames = jack_get_buffer_size(hJack); bufferSize = jackFrames * 2; this->mixFrequency = jack_get_sample_rate(hJack); printf("JACK: Mixer frequency: %i\n", this->mixFrequency); //delete[] rawStream; // pailes: make sure this isn't allocated yet assert(!rawStream); // If it is allocated, something went wrong and we need to know about it rawStream = new mp_sword[bufferSize]; printf("JACK: Latency = %i frames\n", jackFrames); return bufferSize; } mp_sint32 AudioDriver_JACK::stop() { jack_deactivate(hJack); deviceHasStarted = false; return 0; } mp_sint32 AudioDriver_JACK::closeDevice() { deviceHasStarted = false; jack_client_close(hJack); if(rawStream) delete[] rawStream; rawStream = NULL; dlclose(libJack); libJack = NULL; return 0; } mp_sint32 AudioDriver_JACK::start() { jack_activate(hJack); deviceHasStarted = true; return 0; } mp_sint32 AudioDriver_JACK::pause() { paused = true; return 0; } mp_sint32 AudioDriver_JACK::resume() { paused = false; return 0; } #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/jack/AudioDriver_JACK.h0000644000175000017500000000644111163403715024777 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_JACK.h * JACK Audio * * Created by Christopher O'Neill on 8/12/07 * * */ #ifndef __AUDIODRIVER_JACK_H__ #define __AUDIODRIVER_JACK_H__ #include "AudioDriver_COMPENSATE.h" #include class AudioDriver_JACK : public AudioDriver_COMPENSATE { private: jack_client_t *hJack; jack_port_t *leftPort, *rightPort; mp_sword *rawStream; int jackFrames; bool paused; void *libJack; static int jackProcess(jack_nframes_t nframes, void *arg); // Jack library functions jack_client_t *(*jack_client_new) (const char *client_name); int (*jack_client_close) (jack_client_t *client); int (*jack_set_process_callback) (jack_client_t *client, JackProcessCallback process_callback, void *arg); int (*jack_activate) (jack_client_t *client); int (*jack_deactivate) (jack_client_t *client); jack_port_t *(*jack_port_register) (jack_client_t *client, const char *port_name, const char *port_type, unsigned long flags, unsigned long buffer_size); void *(*jack_port_get_buffer) (jack_port_t *, jack_nframes_t); jack_nframes_t (*jack_get_buffer_size) (jack_client_t *); jack_nframes_t (*jack_get_sample_rate) (jack_client_t *); public: AudioDriver_JACK(); virtual ~AudioDriver_JACK(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual bool supportsPowerOfTwoCompensation() { return true; } virtual const char* getDriverID() { return "JACK"; } virtual mp_sint32 getPreferredBufferSize() const { return 2048; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/osx/0000755000175000017500000000000011317506072021516 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/osx/AudioDriver_COREAUDIO.h0000644000175000017500000000614411163403715025502 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver.h * MilkyPlay * * Created by Peter Barth on Fri Sep 10 2004. * */ #ifndef __AUDIODRIVER_COREAUDIO_H__ #define __AUDIODRIVER_COREAUDIO_H__ #include #include "AudioDriverBase.h" class AudioDriver_COREAUDIO : public AudioDriverBase { private: mp_uint32 sampleCounter; mp_sword* compensateBuffer; AudioDeviceID soundDeviceID; mp_sint32 lastError; Boolean IOProcIsInstalled; OSStatus (*gAudioIOProc) (AudioDeviceID, const AudioTimeStamp *, const AudioBufferList *, const AudioTimeStamp *, AudioBufferList *, const AudioTimeStamp *, void *); static OSStatus OSX_AudioIOProc16Bit (AudioDeviceID inDevice, const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* inInputTime, AudioBufferList* outOutputData, const AudioTimeStamp *inOutputTime, void* inClientData); bool deviceHasStarted; public: AudioDriver_COREAUDIO(); virtual ~AudioDriver_COREAUDIO(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual mp_uint32 getNumPlayedSamples() const { return sampleCounter; } virtual const char* getDriverID() { return "CoreAudio"; } virtual mp_sint32 getPreferredBufferSize() const { return 1024; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/osx/AudioDriver_COREAUDIO.cpp0000644000175000017500000002045411163403715026035 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_COREAUDIO.cpp * MilkyPlay * * The base of this code was a MikMod CoreAudio driver by Fruitz^Dojo * It was heavily modified and improved to deal with some strange behaviour * of my G4 Cube USB speakers. It seems to be rather solid now. */ #include "AudioDriver_COREAUDIO.h" #include "MasterMixer.h" #include #define CHECK_ERROR(ERRNO, RESULT) \ if (RESULT != kAudioHardwareNoError) \ { \ lastError = ERRNO; \ return -1; \ } #define SET_PROPS() \ if (AudioDeviceSetProperty (soundDeviceID, NULL, 0, 0, \ kAudioDevicePropertyStreamFormat, \ myPropertySize, &mySoundBasicDescription)) \ { \ CHECK_ERROR \ ( \ MPERR_OSX_BAD_PROPERTY, \ AudioDeviceGetProperty (soundDeviceID, 0, 0, \ kAudioDevicePropertyStreamFormat, \ &myPropertySize, &mySoundBasicDescription) \ ); \ } #define MPERR_DETECTING_DEVICE -1 #define MPERR_OSX_UNKNOWN_DEVICE -2 #define MPERR_OSX_BAD_PROPERTY -3 #define MPERR_OSX_UNSUPPORTED_FORMAT -4 #define MPERR_OSX_BUFFER_ALLOC -5 #define MPERR_OSX_ADD_IO_PROC -6 #define MPERR_OUT_OF_MEMORY -7 #define MPERR_OSX_DEVICE_START -8 OSStatus AudioDriver_COREAUDIO::OSX_AudioIOProc16Bit (AudioDeviceID inDevice, const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* inInputTime, AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime, void *inClientData) { register float* myOutBuffer = (float *) outOutputData->mBuffers[0].mData; AudioDriver_COREAUDIO* audioDriver = reinterpret_cast(inClientData); MasterMixer* mixer = audioDriver->mixer; register SInt16* myInBuffer = (SInt16*)audioDriver->compensateBuffer; register UInt32 size = (outOutputData->mBuffers[0].mDataByteSize / outOutputData->mBuffers[0].mNumberChannels) / sizeof(float); audioDriver->sampleCounter+=size; if (audioDriver->isMixerActive()) mixer->mixerHandler(myInBuffer); else memset(myInBuffer, 0, size*MP_NUMCHANNELS*sizeof(mp_sword)); register UInt32 i; if (audioDriver->mono) { for (i = 0; i < size; i++) myOutBuffer[i] = (myInBuffer[i*2]+myInBuffer[i*2+1])*(1.0f/(32768.0f*2.0f)); } else { for (i = 0; i < size; i++) { myOutBuffer[i*2] = (myInBuffer[i*2])*(1.0f/32768.0f); myOutBuffer[i*2+1] = (myInBuffer[i*2+1])*(1.0f/32768.0f); } } return noErr; } AudioDriver_COREAUDIO::AudioDriver_COREAUDIO() : AudioDriverBase(), sampleCounter(0), compensateBuffer(NULL), IOProcIsInstalled(0), deviceHasStarted(false) { } AudioDriver_COREAUDIO::~AudioDriver_COREAUDIO() { delete[] compensateBuffer; } mp_sint32 AudioDriver_COREAUDIO::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; sampleCounter = 0; AudioStreamBasicDescription mySoundBasicDescription; UInt32 myPropertySize, myBufferByteCount; // get the device... myPropertySize = sizeof (soundDeviceID); CHECK_ERROR ( MPERR_DETECTING_DEVICE, AudioHardwareGetProperty (kAudioHardwarePropertyDefaultOutputDevice, &myPropertySize, &soundDeviceID) ); if (soundDeviceID == kAudioDeviceUnknown) { lastError = MPERR_OSX_UNKNOWN_DEVICE; return -1; } // get the device format... myPropertySize = sizeof (mySoundBasicDescription); CHECK_ERROR ( MPERR_OSX_BAD_PROPERTY, AudioDeviceGetProperty (soundDeviceID, 0, 0, kAudioDevicePropertyStreamFormat, &myPropertySize, &mySoundBasicDescription) ); // try the selected mix frequency, if failure, fall back to native frequency... if (mySoundBasicDescription.mSampleRate != mixFrequency) { mySoundBasicDescription.mSampleRate = mixFrequency; SET_PROPS (); //md_mixfreq = mySoundBasicDescription.mSampleRate; } // try selected channels, if failure select native channels... if (mySoundBasicDescription.mChannelsPerFrame != 2) { mySoundBasicDescription.mChannelsPerFrame = 2; SET_PROPS(); } // linear PCM is required... if (mySoundBasicDescription.mFormatID != kAudioFormatLinearPCM) { lastError = MPERR_OSX_UNSUPPORTED_FORMAT; return -1; } // get the device format again and verify if we could set the settings myPropertySize = sizeof (mySoundBasicDescription); CHECK_ERROR ( MPERR_OSX_BAD_PROPERTY, AudioDeviceGetProperty (soundDeviceID, 0, 0, kAudioDevicePropertyStreamFormat, &myPropertySize, &mySoundBasicDescription) ); if (mySoundBasicDescription.mChannelsPerFrame > 2 || mySoundBasicDescription.mChannelsPerFrame < 1) return -1; // force some stereo -> mono conversion if (mySoundBasicDescription.mChannelsPerFrame == 1) mono = true; // couldn't set sample rate, fall back if (mySoundBasicDescription.mSampleRate != mixFrequency) this->mixFrequency = (mp_uint32)mySoundBasicDescription.mSampleRate; gAudioIOProc = OSX_AudioIOProc16Bit; myBufferByteCount = (bufferSizeInWords >> (mono ? 1 : 0))* sizeof(float); CHECK_ERROR ( MPERR_OSX_BUFFER_ALLOC, AudioDeviceSetProperty (soundDeviceID, NULL, 0, 0, kAudioDevicePropertyBufferSize, sizeof(myBufferByteCount), &myBufferByteCount) ); // add our audio IO procedure.... CHECK_ERROR ( MPERR_OSX_ADD_IO_PROC, AudioDeviceAddIOProc (soundDeviceID, gAudioIOProc, (void*)this) ); IOProcIsInstalled = 1; deviceHasStarted = false; if (compensateBuffer) delete[] compensateBuffer; compensateBuffer = new mp_sword[bufferSizeInWords]; return 0; } mp_sint32 AudioDriver_COREAUDIO::stop() { AudioDeviceStop (soundDeviceID, gAudioIOProc); deviceHasStarted = false; return 0; } mp_sint32 AudioDriver_COREAUDIO::closeDevice() { if (IOProcIsInstalled) { AudioDeviceRemoveIOProc (soundDeviceID, gAudioIOProc); deviceHasStarted = false; } return 0; } mp_sint32 AudioDriver_COREAUDIO::start() { // start the audio IO Proc... if (AudioDeviceStart (soundDeviceID, gAudioIOProc)) { lastError = MPERR_OSX_DEVICE_START; return -1; } deviceHasStarted = true; return 0; } mp_sint32 AudioDriver_COREAUDIO::pause() { AudioDeviceStop (soundDeviceID, gAudioIOProc); deviceHasStarted = false; return 0; } mp_sint32 AudioDriver_COREAUDIO::resume() { if (!deviceHasStarted) { // start the audio IO Proc... if (AudioDeviceStart (soundDeviceID, gAudioIOProc)) { lastError = MPERR_OSX_DEVICE_START; return -1; } deviceHasStarted = true; } return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/drivers/psp/0000755000175000017500000000000011317506071021506 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/psp/AudioDriver_PSP.h0000644000175000017500000000473111163403715024623 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_PSP.h * PSPAudio * * Created by Shazz * */ #ifndef __AUDIODRIVER_PSP_H__ #define __AUDIODRIVER_PSP_H__ #include "AudioDriver_COMPENSATE.h" class AudioDriver_PSP : public AudioDriver_COMPENSATE { private: mp_uint32 psp_channel; bool didInit; static void fill_audio(void *udata, unsigned int numSamples, void *userdata); public: AudioDriver_PSP(); virtual ~AudioDriver_PSP(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual const char* getDriverID() { return "PSPAudio"; } virtual mp_sint32 getPreferredSampleRate() const { return 44100; } virtual mp_sint32 getPreferredBufferSize() const { return 1024; } }; #endif /* __AUDIODRIVER_PSP_H__ */ milkytracker-0.90.85+dfsg/src/milkyplay/drivers/psp/AudioDriver_PSP.cpp0000644000175000017500000002224411163403715025155 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_PSP.cpp * PSP Audio * * Created by Shazz * * * */ #include "AudioDriver_PSP.h" #include #include "MasterMixer.h" #include #include #include #include #include #include #include #include #include #define PSP_AUDIO_CHANNEL 0 #define PSP_NB_CHANNELS 2 #define PSP_NUM_AUDIO_CHANNELS 4 /** This is the number of frames you can update per callback, a frame being * 1 sample for mono, 2 samples for stereo etc. */ #define PSP_NUM_AUDIO_SAMPLES 1024 #define PSP_VOLUME_MAX 0x8000 typedef void (* pspAudioCallback_t)(void *buf, unsigned int reqn, void *pdata); typedef struct { int threadhandle; int handle; int volumeleft; int volumeright; pspAudioCallback_t callback; void *pdata; } psp_audio_channelinfo; typedef int (* pspAudioThreadfunc_t)(int args, void *argp); // some function forward declarations static int pspAudioInit(); static void pspAudioEnd(); static void pspAudioSetChannelCallback(int channel, pspAudioCallback_t callback, void *pdata); static void pspAudioSetVolume(int channel, int left, int right); // ------------------------------ driver starts here ------------------------------ void AudioDriver_PSP::fill_audio(void *udata, unsigned int numSamples, void *userdata) { AudioDriver_PSP * audioDriver = (AudioDriver_PSP *)userdata; if(audioDriver->deviceHasStarted && audioDriver->mixer->isPlaying()) { audioDriver->fillAudioWithCompensation((char*)udata, numSamples*4); } else { // Not Playing , so clear buffer short * _buf = (short *) udata; unsigned int count; for (count = 0; count < numSamples * 2; count++) *(_buf + count) = 0; } } AudioDriver_PSP::AudioDriver_PSP() : AudioDriver_COMPENSATE(), didInit(false) { } AudioDriver_PSP::~AudioDriver_PSP() { stop(); if (didInit) { pspAudioEnd(); } } // On error return a negative value // If the requested buffer size can be served return 0, mp_sint32 AudioDriver_PSP::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; if (!didInit) { //printf("Opening audio PSPdriver, buffer size %u bytes at %u Hz\n", bufferSizeInWords, mixFrequency); pspAudioInit(); didInit = true; } return PSP_NUM_AUDIO_SAMPLES*PSP_NB_CHANNELS; } mp_sint32 AudioDriver_PSP::stop() { deviceHasStarted = false; pspAudioSetChannelCallback(PSP_AUDIO_CHANNEL, 0, NULL); return 0; } mp_sint32 AudioDriver_PSP::closeDevice() { if (deviceHasStarted) { deviceHasStarted = false; pspAudioSetChannelCallback(PSP_AUDIO_CHANNEL, 0, NULL); } return 0; } mp_sint32 AudioDriver_PSP::start() { deviceHasStarted = true; pspAudioSetChannelCallback(PSP_AUDIO_CHANNEL, fill_audio, (void*)this); return 0; } mp_sint32 AudioDriver_PSP::pause() { deviceHasStarted = false; pspAudioSetChannelCallback(PSP_AUDIO_CHANNEL, 0, NULL); return 0; } mp_sint32 AudioDriver_PSP::resume() { if (!deviceHasStarted) { deviceHasStarted = true; pspAudioSetChannelCallback(PSP_AUDIO_CHANNEL, fill_audio, (void*)this); } return 0; } // ------------------------------ modified PSP audiolib here ------------------------------ static int audio_ready=0; static short audio_sndbuf[PSP_NUM_AUDIO_CHANNELS][2][PSP_NUM_AUDIO_SAMPLES][2]; static psp_audio_channelinfo AudioStatus[PSP_NUM_AUDIO_CHANNELS]; static volatile int audio_terminate=0; static SceUID semaID; static void enterCriticalSection() { if(semaID > 0) { sceKernelWaitSema(semaID, 1, NULL); } } static void leaveCriticalSection() { if(semaID > 0) { sceKernelSignalSema(semaID, 1); } } static void pspAudioSetVolume(int channel, int left, int right) { AudioStatus[channel].volumeright = right; AudioStatus[channel].volumeleft = left; } //static void pspAudioChannelThreadCallback(int channel, void *buf, unsigned int reqn) //{ // pspAudioCallback_t callback; // callback=AudioStatus[channel].callback; //} static void pspAudioSetChannelCallback(int channel, pspAudioCallback_t callback, void *pdata) { enterCriticalSection(); volatile psp_audio_channelinfo *pci = &AudioStatus[channel]; pci->callback=0; pci->pdata=pdata; pci->callback=callback; leaveCriticalSection(); } static int pspAudioOutBlocking(unsigned int channel, unsigned int vol1, unsigned int vol2, void *buf) { if (!audio_ready) return -1; if (channel>=PSP_NUM_AUDIO_CHANNELS) return -1; if (vol1>PSP_VOLUME_MAX) vol1=PSP_VOLUME_MAX; if (vol2>PSP_VOLUME_MAX) vol2=PSP_VOLUME_MAX; return sceAudioOutputPannedBlocking(AudioStatus[channel].handle,vol1,vol2,buf); } static int AudioChannelThread(SceSize args, void *argp) { volatile int bufidx=0; int channel=*(int *)argp; while (audio_terminate==0) { void *bufptr=&audio_sndbuf[channel][bufidx]; pspAudioCallback_t callback; enterCriticalSection(); callback=AudioStatus[channel].callback; if (callback) { callback(bufptr, PSP_NUM_AUDIO_SAMPLES, AudioStatus[channel].pdata); } else { unsigned int *ptr=(unsigned int*)bufptr; int i; for (i=0; i 0) sceKernelDeleteSema(semaID); } /**************************************************************************************/ milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/0000755000175000017500000000000011317506077022326 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/0000755000175000017500000000000011317506077023775 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/RtAudio4.h0000755000175000017500000011357011163425013025600 0ustar admin2admin2/************************************************************************/ /*! \class RtAudio \brief Realtime audio i/o C++ classes. RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), SGI, Macintosh OS X (CoreAudio and Jack), and Windows (DirectSound and ASIO) operating systems. RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2008 Gary P. Scavone 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. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. 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. */ /************************************************************************/ /*! \file RtAudio.h */ // RtAudio: Version 4.0.4 #ifndef __RTAUDIO_H #define __RTAUDIO_H #include #include #include "RtError4.h" namespace RtAudio4 { /*! \typedef typedef unsigned long RtAudioFormat; \brief RtAudio data format type. Support for signed integers and floats. Audio data fed to/from an RtAudio stream is assumed to ALWAYS be in host byte order. The internal routines will automatically take care of any necessary byte-swapping between the host format and the soundcard. Thus, endian-ness is not a concern in the following format definitions. - \e RTAUDIO_SINT8: 8-bit signed integer. - \e RTAUDIO_SINT16: 16-bit signed integer. - \e RTAUDIO_SINT24: Upper 3 bytes of 32-bit signed integer. - \e RTAUDIO_SINT32: 32-bit signed integer. - \e RTAUDIO_FLOAT32: Normalized between plus/minus 1.0. - \e RTAUDIO_FLOAT64: Normalized between plus/minus 1.0. */ typedef unsigned long RtAudioFormat; static const RtAudioFormat RTAUDIO_SINT8 = 0x1; // 8-bit signed integer. static const RtAudioFormat RTAUDIO_SINT16 = 0x2; // 16-bit signed integer. static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // Lower 3 bytes of 32-bit signed integer. static const RtAudioFormat RTAUDIO_SINT32 = 0x8; // 32-bit signed integer. static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0. static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0. /*! \typedef typedef unsigned long RtAudioStreamFlags; \brief RtAudio stream option flags. The following flags can be OR'ed together to allow a client to make changes to the default stream behavior: - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with \c nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index \c nFrames (assuming the \c buffer pointer was recast to the correct data type for the stream). Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance. If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs. */ typedef unsigned int RtAudioStreamFlags; static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1; // Use non-interleaved buffers (default = interleaved). static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2; // Attempt to set stream parameters for lowest possible latency. static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4; // Attempt grab device and prevent use by others. /*! \typedef typedef unsigned long RtAudioStreamStatus; \brief RtAudio stream status (over- or underflow) flags. Notification of a stream over- or underflow is indicated by a non-zero stream \c status argument in the RtAudioCallback function. The stream status can be one of the following two options, depending on whether the stream is open for output and/or input: - \e RTAUDIO_INPUT_OVERFLOW: Input data was discarded because of an overflow condition at the driver. - \e RTAUDIO_OUTPUT_UNDERFLOW: The output buffer ran low, likely producing a break in the output sound. */ typedef unsigned int RtAudioStreamStatus; static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1; // Input data was discarded because of an overflow condition at the driver. static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2; // The output buffer ran low, likely causing a gap in the output sound. //! RtAudio callback function prototype. /*! All RtAudio clients must create a function of type RtAudioCallback to read and/or write data from/to the audio stream. When the underlying audio system is ready for new input or output data, this function will be invoked. \param outputBuffer For output (or duplex) streams, the client should write \c nFrames of audio sample frames into this buffer. This argument should be recast to the datatype specified when the stream was opened. For input-only streams, this argument will be NULL. \param inputBuffer For input (or duplex) streams, this buffer will hold \c nFrames of input audio sample frames. This argument should be recast to the datatype specified when the stream was opened. For output-only streams, this argument will be NULL. \param nFrames The number of sample frames of input or output data in the buffers. The actual buffer size in bytes is dependent on the data type and number of channels in use. \param streamTime The number of seconds that have elapsed since the stream was started. \param status If non-zero, this argument indicates a data overflow or underflow condition for the stream. The particular condition can be determined by comparison with the RtAudioStreamStatus flags. \param userData A pointer to optional data provided by the client when opening the stream (default = NULL). To continue normal stream operation, the RtAudioCallback function should return a value of zero. To stop the stream and drain the output buffer, the function should return a value of one. To abort the stream immediately, the client should return a value of two. */ typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData ); // **************************************************************** // // // RtAudio class declaration. // // RtAudio is a "controller" used to select an available audio i/o // interface. It presents a common API for the user to call but all // functionality is implemented by the class RtApi and its // subclasses. RtAudio creates an instance of an RtApi subclass // based on the user's API choice. If no choice is made, RtAudio // attempts to make a "logical" API selection. // // **************************************************************** // class RtApi; class RtAudio { public: //! Audio API specifier arguments. enum Api { UNSPECIFIED, /*!< Search for a working compiled API. */ LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ LINUX_OSS, /*!< The Linux Open Sound System API. */ UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ }; //! The public device information structure for returning queried values. struct DeviceInfo { bool probed; /*!< true if the device capabilities were successfully probed. */ std::string name; /*!< Character string device identifier. */ unsigned int outputChannels; /*!< Maximum output channels supported by device. */ unsigned int inputChannels; /*!< Maximum input channels supported by device. */ unsigned int duplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ bool isDefaultOutput; /*!< true if this is the default output device. */ bool isDefaultInput; /*!< true if this is the default input device. */ std::vector sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ // Default constructor. DeviceInfo() :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {} }; //! The structure for specifying input or ouput stream parameters. struct StreamParameters { unsigned int deviceId; /*!< Device index (0 to getDeviceCount() - 1). */ unsigned int nChannels; /*!< Number of channels. */ unsigned int firstChannel; /*!< First channel index on device (default = 0). */ // Default constructor. StreamParameters() : deviceId(0), nChannels(0), firstChannel(0) {} }; //! The structure for specifying stream options. /*! The following flags can be OR'ed together to allow a client to make changes to the default stream behavior: - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with \c nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index \c nFrames (assuming the \c buffer pointer was recast to the correct data type for the stream). Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance. If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs. The \c numberOfBuffers parameter can be used to control stream latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs only. A value of two is usually the smallest allowed. Larger numbers can potentially result in more robust stream performance, though likely at the cost of stream latency. The value set by the user is replaced during execution of the RtAudio::openStream() function by the value actually used by the system. The \c streamName parameter can be used to set the client name when using the Jack API. By default, the client name is set to RtApiJack. However, if you wish to create multiple instances of RtAudio with Jack, each instance must have a unique client name. */ struct StreamOptions { RtAudioStreamFlags flags; /*!< A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE). */ unsigned int numberOfBuffers; /*!< Number of stream buffers. */ std::string streamName; /*!< A stream name (currently used only in Jack). */ // Default constructor. StreamOptions() : flags(0), numberOfBuffers(0) {} }; //! A static function to determine the available compiled audio APIs. /*! The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems. */ static void getCompiledApi( std::vector &apis ) throw(); //! The class constructor. /*! The constructor performs minor initialization tasks. No exceptions can be thrown. If no API argument is specified and multiple API support has been compiled, the default order of use is JACK, ALSA, OSS (Linux systems) and ASIO, DS (Windows systems). */ RtAudio( Api api=UNSPECIFIED ) throw(); //! The destructor. /*! If a stream is running or open, it will be stopped and closed automatically. */ ~RtAudio() throw(); //! Returns the audio API specifier for the current instance of RtAudio. RtAudio::Api getCurrentApi( void ) throw(); //! A public function that queries for the number of audio devices available. /*! This function performs a system query of available devices each time it is called, thus supporting devices connected \e after instantiation. If a system error occurs during processing, a warning will be issued. */ unsigned int getDeviceCount( void ) throw(); //! Return an RtAudio::DeviceInfo structure for a specified device number. /*! Any device integer between 0 and getDeviceCount() - 1 is valid. If an invalid argument is provided, an RtError (type = INVALID_USE) will be thrown. If a device is busy or otherwise unavailable, the structure member "probed" will have a value of "false" and all other members are undefined. If the specified device is the current default input or output device, the corresponding "isDefault" member will have a value of "true". */ RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); //! A function that returns the index of the default output device. /*! If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream. */ unsigned int getDefaultOutputDevice( void ) throw(); //! A function that returns the index of the default input device. /*! If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream. */ unsigned int getDefaultInputDevice( void ) throw(); //! A public function for opening a stream with the specified parameters. /*! An RtError (type = SYSTEM_ERROR) is thrown if a stream cannot be opened with the specified parameters or an error occurs during processing. An RtError (type = INVALID_USE) is thrown if any invalid device ID or channel number parameters are specified. \param outputParameters Specifies output stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For input-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1. \param inputParameters Specifies input stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For output-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1. \param format An RtAudioFormat specifying the desired sample data format. \param sampleRate The desired sample rate (sample frames per second). \param *bufferFrames A pointer to a value indicating the desired internal buffer size in sample frames. The actual value used by the device is returned via the same pointer. A value of zero can be specified, in which case the lowest allowable value is determined. \param callback A client-defined function that will be invoked when input data is available and/or output data is needed. \param userData An optional pointer to data that can be accessed from within the callback function. \param options An optional pointer to a structure containing various global stream options, including a list of OR'ed RtAudioStreamFlags and a suggested number of stream buffers that can be used to control stream latency. More buffers typically result in more robust performance, though at a cost of greater latency. If a value of zero is specified, a system-specific median value is chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the lowest allowable value is used. The actual value used is returned via the structure argument. The parameter is API dependent. */ void openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData = NULL, RtAudio::StreamOptions *options = NULL ); //! A function that closes a stream and frees any associated stream memory. /*! If a stream is not open, this function issues a warning and returns (no exception is thrown). */ void closeStream( void ) throw(); //! A function that starts a stream. /*! An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already running. */ void startStream( void ); //! Stop a stream, allowing any samples remaining in the output queue to be played. /*! An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped. */ void stopStream( void ); //! Stop a stream, discarding any samples remaining in the input/output queue. /*! An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped. */ void abortStream( void ); //! Returns true if a stream is open and false if not. bool isStreamOpen( void ) throw(); //! Returns true if the stream is running and false if it is stopped or not open. bool isStreamRunning( void ) throw(); //! Returns the number of elapsed seconds since the stream was started. /*! If a stream is not open, an RtError (type = INVALID_USE) will be thrown. */ double getStreamTime( void ); //! Returns the internal stream latency in sample frames. /*! The stream latency refers to delay in audio input and/or output caused by internal buffering by the audio system and/or hardware. For duplex streams, the returned value will represent the sum of the input and output latencies. If a stream is not open, an RtError (type = INVALID_USE) will be thrown. If the API does not report latency, the return value will be zero. */ long getStreamLatency( void ); //! Specify whether warning messages should be printed to stderr. void showWarnings( bool value = true ) throw(); protected: void openRtApi( RtAudio::Api api ); RtApi *rtapi_; }; }; // Operating system dependent thread functionality. #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) #include #include namespace RtAudio4 { typedef unsigned long ThreadHandle; typedef CRITICAL_SECTION StreamMutex; }; #elif defined(__LINUX_ALSA__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) // Using pthread library for various flavors of unix. #include namespace RtAudio4 { typedef pthread_t ThreadHandle; typedef pthread_mutex_t StreamMutex; }; #else // Setup for "dummy" behavior namespace RtAudio4 { #define __RTAUDIO_DUMMY__ typedef int ThreadHandle; typedef int StreamMutex; }; #endif namespace RtAudio4 { // This global structure type is used to pass callback information // between the private RtAudio stream structure and global callback // handling functions. struct CallbackInfo { void *object; // Used as a "this" pointer. ThreadHandle thread; void *callback; void *userData; void *apiInfo; // void pointer for API specific callback information bool isRunning; // Default constructor. CallbackInfo() :object(0), callback(0), userData(0), apiInfo(0), isRunning(false) {} }; }; // **************************************************************** // // // RtApi class declaration. // // Subclasses of RtApi contain all API- and OS-specific code necessary // to fully implement the RtAudio API. // // Note that RtApi is an abstract base class and cannot be // explicitly instantiated. The class RtAudio will create an // instance of an RtApi subclass (RtApiOss, RtApiAlsa, // RtApiJack, RtApiCore, RtApiAl, RtApiDs, or RtApiAsio). // // **************************************************************** // #if defined( HAVE_GETTIMEOFDAY ) #include #endif #include namespace RtAudio4 { class RtApi { public: RtApi(); virtual ~RtApi(); virtual RtAudio::Api getCurrentApi( void ) = 0; virtual unsigned int getDeviceCount( void ) = 0; virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0; virtual unsigned int getDefaultInputDevice( void ); virtual unsigned int getDefaultOutputDevice( void ); void openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options ); virtual void closeStream( void ); virtual void startStream( void ) = 0; virtual void stopStream( void ) = 0; virtual void abortStream( void ) = 0; long getStreamLatency( void ); virtual double getStreamTime( void ); bool isStreamOpen( void ) { return stream_.state != STREAM_CLOSED; }; bool isStreamRunning( void ) { return stream_.state == STREAM_RUNNING; }; void showWarnings( bool value ) { showWarnings_ = value; }; protected: static const unsigned int MAX_SAMPLE_RATES; static const unsigned int SAMPLE_RATES[]; enum { FAILURE, SUCCESS }; enum StreamState { STREAM_STOPPED, STREAM_RUNNING, STREAM_CLOSED = -50 }; enum StreamMode { OUTPUT, INPUT, DUPLEX, UNINITIALIZED = -75 }; // A protected structure used for buffer conversion. struct ConvertInfo { int channels; int inJump, outJump; RtAudioFormat inFormat, outFormat; std::vector inOffset; std::vector outOffset; }; // A protected structure for audio streams. struct RtApiStream { unsigned int device[2]; // Playback and record, respectively. void *apiHandle; // void pointer for API specific stream handle information StreamMode mode; // OUTPUT, INPUT, or DUPLEX. StreamState state; // STOPPED, RUNNING, or CLOSED char *userBuffer[2]; // Playback and record, respectively. char *deviceBuffer; bool doConvertBuffer[2]; // Playback and record, respectively. bool userInterleaved; bool deviceInterleaved[2]; // Playback and record, respectively. bool doByteSwap[2]; // Playback and record, respectively. unsigned int sampleRate; unsigned int bufferSize; unsigned int nBuffers; unsigned int nUserChannels[2]; // Playback and record, respectively. unsigned int nDeviceChannels[2]; // Playback and record channels, respectively. unsigned int channelOffset[2]; // Playback and record, respectively. unsigned long latency[2]; // Playback and record, respectively. RtAudioFormat userFormat; RtAudioFormat deviceFormat[2]; // Playback and record, respectively. StreamMutex mutex; CallbackInfo callbackInfo; ConvertInfo convertInfo[2]; double streamTime; // Number of elapsed seconds since the stream started. #if defined(HAVE_GETTIMEOFDAY) struct timeval lastTickTimestamp; #endif RtApiStream() :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; } }; typedef signed short Int16; typedef signed int Int32; typedef float Float32; typedef double Float64; std::ostringstream errorStream_; std::string errorText_; bool showWarnings_; RtApiStream stream_; /*! Protected, api-specific method that attempts to open a device with the given parameters. This function MUST be implemented by all subclasses. If an error is encountered during the probe, a "warning" message is reported and FAILURE is returned. A successful probe is indicated by a return value of SUCCESS. */ virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); //! A protected function used to increment the stream time. void tickStreamTime( void ); //! Protected common method to clear an RtApiStream structure. void clearStreamInfo(); /*! Protected common method that throws an RtError (type = INVALID_USE) if a stream is not open. */ void verifyStream( void ); //! Protected common error method to allow global control over error handling. void error( RtError::Type type ); /*! Protected method used to perform format, channel number, and/or interleaving conversions between the user and device buffers. */ void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ); //! Protected common method used to perform byte-swapping on buffers. void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ); //! Protected common method that returns the number of bytes for a given format. unsigned int formatBytes( RtAudioFormat format ); //! Protected common method that sets up the parameters for buffer conversion. void setConvertInfo( StreamMode mode, unsigned int firstChannel ); }; // **************************************************************** // // // Inline RtAudio definitions. // // **************************************************************** // inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); } inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); } inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); } inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); } inline void RtAudio :: closeStream( void ) throw() { rtapi_->closeStream(); } inline void RtAudio :: startStream( void ) { rtapi_->startStream(); } inline void RtAudio :: stopStream( void ) { rtapi_->stopStream(); } inline void RtAudio :: abortStream( void ) { rtapi_->abortStream(); } inline bool RtAudio :: isStreamOpen( void ) throw() { return rtapi_->isStreamOpen(); } inline bool RtAudio :: isStreamRunning( void ) throw() { return rtapi_->isStreamRunning(); } inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); } inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); } inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); } }; // RtApi Subclass prototypes. #if defined(__MACOSX_CORE__) #include namespace RtAudio4 { class RtApiCore: public RtApi { public: RtApiCore(); ~RtApiCore(); RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); unsigned int getDefaultOutputDevice( void ); unsigned int getDefaultInputDevice( void ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( AudioDeviceID deviceId, const AudioBufferList *inBufferList, const AudioBufferList *outBufferList ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); static const char* getErrorCode( OSStatus code ); }; }; #endif #if defined(__UNIX_JACK__) namespace RtAudio4 { class RtApiJack: public RtApi { public: RtApiJack(); ~RtApiJack(); RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( unsigned long nframes ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; }; #endif #if defined(__WINDOWS_ASIO__) namespace RtAudio4 { class RtApiAsio: public RtApi { public: RtApiAsio(); ~RtApiAsio(); RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( long bufferIndex ); private: std::vector devices_; void saveDeviceInfo( void ); bool coInitialized_; bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; }; #endif #if defined(__WINDOWS_DS__) namespace RtAudio4 { class RtApiDs: public RtApi { public: RtApiDs(); ~RtApiDs(); RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; }; unsigned int getDeviceCount( void ); unsigned int getDefaultOutputDevice( void ); unsigned int getDefaultInputDevice( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: bool coInitialized_; bool buffersRolling; long duplexPrerollBytes; bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; }; #endif #if defined(__LINUX_ALSA__) namespace RtAudio4 { class RtApiAlsa: public RtApi { public: RtApiAlsa(); ~RtApiAlsa(); RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: std::vector devices_; void saveDeviceInfo( void ); bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; }; #endif #if defined(__LINUX_OSS__) namespace RtAudio4 { class RtApiOss: public RtApi { public: RtApiOss(); ~RtApiOss(); RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; }; #endif #if defined(__RTAUDIO_DUMMY__) namespace RtAudio4 { class RtApiDummy: public RtApi { public: RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtError::WARNING ); }; RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; }; unsigned int getDeviceCount( void ) { return 0; }; RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; return info; }; void closeStream( void ) {}; void startStream( void ) {}; void stopStream( void ) {}; void abortStream( void ) {}; private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { return false; }; }; }; #endif #endif // Indentation settings for Vim and Emacs // // Local Variables: // c-basic-offset: 2 // indent-tabs-mode: nil // End: // // vim: et sts=2 sw=2 milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/RtAudio3.cpp0000755000175000017500000111105711163425013026131 0ustar admin2admin2/************************************************************************/ /*! \class RtAudio \brief Realtime audio i/o C++ classes. RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), SGI, Macintosh OS X (CoreAudio), and Windows (DirectSound and ASIO) operating systems. RtAudio WWW site: http://music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2005 Gary P. Scavone 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ /************************************************************************/ // RtAudio: Version 3.0.3 (18 November 2005) #include "RtAudio3.h" #include #include // Static variable definitions. const unsigned int RtApi::MAX_SAMPLE_RATES = 14; const unsigned int RtApi::SAMPLE_RATES[] = { 4000, 5512, 8000, 9600, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) #define MUTEX_INITIALIZE(A) InitializeCriticalSection(A) #define MUTEX_DESTROY(A) DeleteCriticalSection(A); #define MUTEX_LOCK(A) EnterCriticalSection(A) #define MUTEX_UNLOCK(A) LeaveCriticalSection(A) #else // pthread API #define MUTEX_INITIALIZE(A) pthread_mutex_init(A, NULL) #define MUTEX_DESTROY(A) pthread_mutex_destroy(A); #define MUTEX_LOCK(A) pthread_mutex_lock(A) #define MUTEX_UNLOCK(A) pthread_mutex_unlock(A) #endif // *************************************************** // // // Public common (OS-independent) methods. // // *************************************************** // RtAudio :: RtAudio( RtAudioApi api ) { initialize( api ); } RtAudio :: RtAudio( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers, RtAudioApi api ) { initialize( api ); try { rtapi_->openStream( outputDevice, outputChannels, inputDevice, inputChannels, format, sampleRate, bufferSize, numberOfBuffers ); } catch (RtError &exception) { // Deallocate the RtApi instance. delete rtapi_; throw exception; } } RtAudio :: RtAudio( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers, RtAudioApi api ) { initialize( api ); try { rtapi_->openStream( outputDevice, outputChannels, inputDevice, inputChannels, format, sampleRate, bufferSize, numberOfBuffers ); } catch (RtError &exception) { // Deallocate the RtApi instance. delete rtapi_; throw exception; } } RtAudio :: ~RtAudio() { delete rtapi_; } void RtAudio :: openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers ) { rtapi_->openStream( outputDevice, outputChannels, inputDevice, inputChannels, format, sampleRate, bufferSize, numberOfBuffers ); } void RtAudio :: openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers ) { rtapi_->openStream( outputDevice, outputChannels, inputDevice, inputChannels, format, sampleRate, bufferSize, *numberOfBuffers ); } void RtAudio::initialize( RtAudioApi api ) { rtapi_ = 0; // First look for a compiled match to a specified API value. If one // of these constructors throws an error, it will be passed up the // inheritance chain. #if defined(__LINUX_JACK__) if ( api == LINUX_JACK ) rtapi_ = new RtApiJack(); #endif #if defined(__LINUX_ALSA__) if ( api == LINUX_ALSA ) rtapi_ = new RtApiAlsa(); #endif #if defined(__LINUX_OSS__) if ( api == LINUX_OSS ) rtapi_ = new RtApiOss(); #endif #if defined(__WINDOWS_ASIO__) if ( api == WINDOWS_ASIO ) rtapi_ = new RtApiAsio(); #endif #if defined(__WINDOWS_DS__) if ( api == WINDOWS_DS ) rtapi_ = new RtApiDs(); #endif #if defined(__IRIX_AL__) if ( api == IRIX_AL ) rtapi_ = new RtApiAl(); #endif #if defined(__MACOSX_CORE__) if ( api == MACOSX_CORE ) rtapi_ = new RtApiCore(); #endif if ( rtapi_ ) return; if ( api > 0 ) { // No compiled support for specified API value. throw RtError( "RtAudio: no compiled support for specified API argument!", RtError::INVALID_PARAMETER ); } // No specified API ... search for "best" option. try { #if defined(__LINUX_JACK__) rtapi_ = new RtApiJack(); #elif defined(__WINDOWS_ASIO__) rtapi_ = new RtApiAsio(); #elif defined(__IRIX_AL__) rtapi_ = new RtApiAl(); #elif defined(__MACOSX_CORE__) rtapi_ = new RtApiCore(); #else ; #endif } catch (RtError &) { #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtAudio: no devices found for first api option (JACK, ASIO, Al, or CoreAudio).\n\n"); #endif rtapi_ = 0; } if ( rtapi_ ) return; // Try second API support if ( rtapi_ == 0 ) { try { #if defined(__LINUX_ALSA__) rtapi_ = new RtApiAlsa(); #elif defined(__WINDOWS_DS__) rtapi_ = new RtApiDs(); #else ; #endif } catch (RtError &) { #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtAudio: no devices found for second api option (Alsa or DirectSound).\n\n"); #endif rtapi_ = 0; } } if ( rtapi_ ) return; // Try third API support if ( rtapi_ == 0 ) { #if defined(__LINUX_OSS__) try { rtapi_ = new RtApiOss(); } catch (RtError &error) { rtapi_ = 0; } #else ; #endif } if ( rtapi_ == 0 ) { // No devices found. throw RtError( "RtAudio: no devices found for compiled audio APIs!", RtError::NO_DEVICES_FOUND ); } } RtApi :: RtApi() { stream_.mode = UNINITIALIZED; stream_.state = STREAM_STOPPED; stream_.apiHandle = 0; MUTEX_INITIALIZE(&stream_.mutex); } RtApi :: ~RtApi() { MUTEX_DESTROY(&stream_.mutex); } void RtApi :: openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers ) { this->openStream( outputDevice, outputChannels, inputDevice, inputChannels, format, sampleRate, bufferSize, *numberOfBuffers ); *numberOfBuffers = stream_.nBuffers; } void RtApi :: openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers ) { if ( stream_.mode != UNINITIALIZED ) { sprintf(message_, "RtApi: only one open stream allowed per class instance."); error(RtError::INVALID_STREAM); } if (outputChannels < 1 && inputChannels < 1) { sprintf(message_,"RtApi: one or both 'channel' parameters must be greater than zero."); error(RtError::INVALID_PARAMETER); } if ( formatBytes(format) == 0 ) { sprintf(message_,"RtApi: 'format' parameter value is undefined."); error(RtError::INVALID_PARAMETER); } if ( outputChannels > 0 ) { if (outputDevice > nDevices_ || outputDevice < 0) { sprintf(message_,"RtApi: 'outputDevice' parameter value (%d) is invalid.", outputDevice); error(RtError::INVALID_PARAMETER); } } if ( inputChannels > 0 ) { if (inputDevice > nDevices_ || inputDevice < 0) { sprintf(message_,"RtApi: 'inputDevice' parameter value (%d) is invalid.", inputDevice); error(RtError::INVALID_PARAMETER); } } std::string errorMessages; clearStreamInfo(); bool result = FAILURE; int device, defaultDevice = 0; StreamMode mode; int channels; if ( outputChannels > 0 ) { mode = OUTPUT; channels = outputChannels; if ( outputDevice == 0 ) { // Try default device first. defaultDevice = getDefaultOutputDevice(); device = defaultDevice; } else device = outputDevice - 1; for ( int i=-1; i= 0 ) { if ( i == defaultDevice ) continue; device = i; } if ( devices_[device].probed == false ) { // If the device wasn't successfully probed before, try it // (again) now. clearDeviceInfo(&devices_[device]); probeDeviceInfo(&devices_[device]); } if ( devices_[device].probed ) result = probeDeviceOpen(device, mode, channels, sampleRate, format, bufferSize, numberOfBuffers); if ( result == SUCCESS ) break; errorMessages.append( " " ); errorMessages.append( message_ ); errorMessages.append( "\n" ); if ( outputDevice > 0 ) break; clearStreamInfo(); } } if ( inputChannels > 0 && ( result == SUCCESS || outputChannels <= 0 ) ) { mode = INPUT; channels = inputChannels; if ( inputDevice == 0 ) { // Try default device first. defaultDevice = getDefaultInputDevice(); device = defaultDevice; } else device = inputDevice - 1; for ( int i=-1; i= 0 ) { if ( i == defaultDevice ) continue; device = i; } if ( devices_[device].probed == false ) { // If the device wasn't successfully probed before, try it // (again) now. clearDeviceInfo(&devices_[device]); probeDeviceInfo(&devices_[device]); } if ( devices_[device].probed ) result = probeDeviceOpen( device, mode, channels, sampleRate, format, bufferSize, numberOfBuffers ); if ( result == SUCCESS ) break; errorMessages.append( " " ); errorMessages.append( message_ ); errorMessages.append( "\n" ); if ( inputDevice > 0 ) break; } } if ( result == SUCCESS ) return; // If we get here, all attempted probes failed. Close any opened // devices and clear the stream structure. if ( stream_.mode != UNINITIALIZED ) closeStream(); clearStreamInfo(); if ( ( outputDevice == 0 && outputChannels > 0 ) || ( inputDevice == 0 && inputChannels > 0 ) ) sprintf(message_,"RtApi: no devices found for given stream parameters: \n%s", errorMessages.c_str()); else sprintf(message_,"RtApi: unable to open specified device(s) with given stream parameters: \n%s", errorMessages.c_str()); error(RtError::INVALID_PARAMETER); return; } int RtApi :: getDeviceCount(void) { return devices_.size(); } RtApi::StreamState RtApi :: getStreamState( void ) const { return stream_.state; } RtAudioDeviceInfo RtApi :: getDeviceInfo( int device ) { if (device > (int) devices_.size() || device < 1) { sprintf(message_, "RtApi: invalid device specifier (%d)!", device); error(RtError::INVALID_DEVICE); } RtAudioDeviceInfo info; int deviceIndex = device - 1; // If the device wasn't successfully probed before, try it now (or again). if (devices_[deviceIndex].probed == false) { clearDeviceInfo(&devices_[deviceIndex]); probeDeviceInfo(&devices_[deviceIndex]); } info.name.append( devices_[deviceIndex].name ); info.probed = devices_[deviceIndex].probed; if ( info.probed == true ) { info.outputChannels = devices_[deviceIndex].maxOutputChannels; info.inputChannels = devices_[deviceIndex].maxInputChannels; info.duplexChannels = devices_[deviceIndex].maxDuplexChannels; for (unsigned int i=0; i #include #include #include #include #include #include #include #include #define DAC_NAME "/dev/dsp" #define MAX_DEVICES 16 #define MAX_CHANNELS 16 extern "C" void *ossCallbackHandler(void * ptr); RtApiOss :: RtApiOss() { this->initialize(); if (nDevices_ <= 0) { sprintf(message_, "RtApiOss: no Linux OSS audio devices found!"); error(RtError::NO_DEVICES_FOUND); } } RtApiOss :: ~RtApiOss() { if ( stream_.mode != UNINITIALIZED ) closeStream(); } void RtApiOss :: initialize(void) { // Count cards and devices nDevices_ = 0; // We check /dev/dsp before probing devices. /dev/dsp is supposed to // be a link to the "default" audio device, of the form /dev/dsp0, // /dev/dsp1, etc... However, I've seen many cases where /dev/dsp was a // real device, so we need to check for that. Also, sometimes the // link is to /dev/dspx and other times just dspx. I'm not sure how // the latter works, but it does. char device_name[16]; struct stat dspstat; int dsplink = -1; int i = 0; if (lstat(DAC_NAME, &dspstat) == 0) { if (S_ISLNK(dspstat.st_mode)) { i = readlink(DAC_NAME, device_name, sizeof(device_name)); if (i > 0) { device_name[i] = '\0'; if (i > 8) { // check for "/dev/dspx" if (!strncmp(DAC_NAME, device_name, 8)) dsplink = atoi(&device_name[8]); } else if (i > 3) { // check for "dspx" if (!strncmp("dsp", device_name, 3)) dsplink = atoi(&device_name[3]); } } else { sprintf(message_, "RtApiOss: cannot read value of symbolic link %s.", DAC_NAME); error(RtError::SYSTEM_ERROR); } } } else { sprintf(message_, "RtApiOss: cannot stat %s.", DAC_NAME); error(RtError::SYSTEM_ERROR); } // The OSS API doesn't provide a routine for determining the number // of devices. Thus, we'll just pursue a brute force method. The // idea is to start with /dev/dsp(0) and continue with higher device // numbers until we reach MAX_DSP_DEVICES. This should tell us how // many devices we have ... it is not a fullproof scheme, but hopefully // it will work most of the time. int fd = 0; RtApiDevice device; for (i=-1; i= 0) close(fd); device.name.erase(); device.name.append( (const char *)device_name, strlen(device_name)+1); devices_.push_back(device); nDevices_++; } } void RtApiOss :: probeDeviceInfo(RtApiDevice *info) { int i, fd, channels, mask; // The OSS API doesn't provide a means for probing the capabilities // of devices. Thus, we'll just pursue a brute force method. // First try for playback fd = open(info->name.c_str(), O_WRONLY | O_NONBLOCK); if (fd == -1) { // Open device failed ... either busy or doesn't exist if (errno == EBUSY || errno == EAGAIN) sprintf(message_, "RtApiOss: OSS playback device (%s) is busy and cannot be probed.", info->name.c_str()); else sprintf(message_, "RtApiOss: OSS playback device (%s) open error.", info->name.c_str()); error(RtError::DEBUG_WARNING); goto capture_probe; } // We have an open device ... see how many channels it can handle for (i=MAX_CHANNELS; i>0; i--) { channels = i; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1) { // This would normally indicate some sort of hardware error, but under ALSA's // OSS emulation, it sometimes indicates an invalid channel value. Further, // the returned channel value is not changed. So, we'll ignore the possible // hardware error. continue; // try next channel number } // Check to see whether the device supports the requested number of channels if (channels != i ) continue; // try next channel number // If here, we found the largest working channel value break; } info->maxOutputChannels = i; // Now find the minimum number of channels it can handle for (i=1; i<=info->maxOutputChannels; i++) { channels = i; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1 || channels != i) continue; // try next channel number // If here, we found the smallest working channel value break; } info->minOutputChannels = i; close(fd); capture_probe: // Now try for capture fd = open(info->name.c_str(), O_RDONLY | O_NONBLOCK); if (fd == -1) { // Open device for capture failed ... either busy or doesn't exist if (errno == EBUSY || errno == EAGAIN) sprintf(message_, "RtApiOss: OSS capture device (%s) is busy and cannot be probed.", info->name.c_str()); else sprintf(message_, "RtApiOss: OSS capture device (%s) open error.", info->name.c_str()); error(RtError::DEBUG_WARNING); if (info->maxOutputChannels == 0) // didn't open for playback either ... device invalid return; goto probe_parameters; } // We have the device open for capture ... see how many channels it can handle for (i=MAX_CHANNELS; i>0; i--) { channels = i; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1 || channels != i) { continue; // as above } // If here, we found a working channel value break; } info->maxInputChannels = i; // Now find the minimum number of channels it can handle for (i=1; i<=info->maxInputChannels; i++) { channels = i; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1 || channels != i) continue; // try next channel number // If here, we found the smallest working channel value break; } info->minInputChannels = i; close(fd); if (info->maxOutputChannels == 0 && info->maxInputChannels == 0) { sprintf(message_, "RtApiOss: device (%s) reports zero channels for input and output.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // If device opens for both playback and capture, we determine the channels. if (info->maxOutputChannels == 0 || info->maxInputChannels == 0) goto probe_parameters; fd = open(info->name.c_str(), O_RDWR | O_NONBLOCK); if (fd == -1) goto probe_parameters; ioctl(fd, SNDCTL_DSP_SETDUPLEX, 0); ioctl(fd, SNDCTL_DSP_GETCAPS, &mask); if (mask & DSP_CAP_DUPLEX) { info->hasDuplexSupport = true; // We have the device open for duplex ... see how many channels it can handle for (i=MAX_CHANNELS; i>0; i--) { channels = i; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1 || channels != i) continue; // as above // If here, we found a working channel value break; } info->maxDuplexChannels = i; // Now find the minimum number of channels it can handle for (i=1; i<=info->maxDuplexChannels; i++) { channels = i; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1 || channels != i) continue; // try next channel number // If here, we found the smallest working channel value break; } info->minDuplexChannels = i; } close(fd); probe_parameters: // At this point, we need to figure out the supported data formats // and sample rates. We'll proceed by openning the device in the // direction with the maximum number of channels, or playback if // they are equal. This might limit our sample rate options, but so // be it. if (info->maxOutputChannels >= info->maxInputChannels) { fd = open(info->name.c_str(), O_WRONLY | O_NONBLOCK); channels = info->maxOutputChannels; } else { fd = open(info->name.c_str(), O_RDONLY | O_NONBLOCK); channels = info->maxInputChannels; } if (fd == -1) { // We've got some sort of conflict ... abort sprintf(message_, "RtApiOss: device (%s) won't reopen during probe.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // We have an open device ... set to maximum channels. i = channels; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &channels) == -1 || channels != i) { // We've got some sort of conflict ... abort close(fd); sprintf(message_, "RtApiOss: device (%s) won't revert to previous channel setting.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } if (ioctl(fd, SNDCTL_DSP_GETFMTS, &mask) == -1) { close(fd); sprintf(message_, "RtApiOss: device (%s) can't get supported audio formats.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // Probe the supported data formats ... we don't care about endian-ness just yet. int format; info->nativeFormats = 0; #if defined (AFMT_S32_BE) // This format does not seem to be in the 2.4 kernel version of OSS soundcard.h if (mask & AFMT_S32_BE) { format = AFMT_S32_BE; info->nativeFormats |= RTAUDIO_SINT32; } #endif #if defined (AFMT_S32_LE) /* This format is not in the 2.4.4 kernel version of OSS soundcard.h */ if (mask & AFMT_S32_LE) { format = AFMT_S32_LE; info->nativeFormats |= RTAUDIO_SINT32; } #endif if (mask & AFMT_S8) { format = AFMT_S8; info->nativeFormats |= RTAUDIO_SINT8; } if (mask & AFMT_S16_BE) { format = AFMT_S16_BE; info->nativeFormats |= RTAUDIO_SINT16; } if (mask & AFMT_S16_LE) { format = AFMT_S16_LE; info->nativeFormats |= RTAUDIO_SINT16; } // Check that we have at least one supported format if (info->nativeFormats == 0) { close(fd); sprintf(message_, "RtApiOss: device (%s) data format not supported by RtAudio.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // Set the format i = format; if (ioctl(fd, SNDCTL_DSP_SETFMT, &format) == -1 || format != i) { close(fd); sprintf(message_, "RtApiOss: device (%s) error setting data format.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // Probe the supported sample rates. info->sampleRates.clear(); for (unsigned int k=0; ksampleRates.push_back(speed); } if (info->sampleRates.size() == 0) { close(fd); sprintf(message_, "RtApiOss: no supported sample rates found for device (%s).", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // That's all ... close the device and return close(fd); info->probed = true; return; } bool RtApiOss :: probeDeviceOpen(int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers) { int buffers, buffer_bytes, device_channels, device_format; int srate, temp, fd; int *handle = (int *) stream_.apiHandle; const char *name = devices_[device].name.c_str(); if (mode == OUTPUT) fd = open(name, O_WRONLY | O_NONBLOCK); else { // mode == INPUT if (stream_.mode == OUTPUT && stream_.device[0] == device) { // We just set the same device for playback ... close and reopen for duplex (OSS only). close(handle[0]); handle[0] = 0; // First check that the number previously set channels is the same. if (stream_.nUserChannels[0] != channels) { sprintf(message_, "RtApiOss: input/output channels must be equal for OSS duplex device (%s).", name); goto error; } fd = open(name, O_RDWR | O_NONBLOCK); } else fd = open(name, O_RDONLY | O_NONBLOCK); } if (fd == -1) { if (errno == EBUSY || errno == EAGAIN) sprintf(message_, "RtApiOss: device (%s) is busy and cannot be opened.", name); else sprintf(message_, "RtApiOss: device (%s) cannot be opened.", name); goto error; } // Now reopen in blocking mode. close(fd); if (mode == OUTPUT) fd = open(name, O_WRONLY | O_SYNC); else { // mode == INPUT if (stream_.mode == OUTPUT && stream_.device[0] == device) fd = open(name, O_RDWR | O_SYNC); else fd = open(name, O_RDONLY | O_SYNC); } if (fd == -1) { sprintf(message_, "RtApiOss: device (%s) cannot be opened.", name); goto error; } // Get the sample format mask int mask; if (ioctl(fd, SNDCTL_DSP_GETFMTS, &mask) == -1) { close(fd); sprintf(message_, "RtApiOss: device (%s) can't get supported audio formats.", name); goto error; } // Determine how to set the device format. stream_.userFormat = format; device_format = -1; stream_.doByteSwap[mode] = false; if (format == RTAUDIO_SINT8) { if (mask & AFMT_S8) { device_format = AFMT_S8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } } else if (format == RTAUDIO_SINT16) { if (mask & AFMT_S16_NE) { device_format = AFMT_S16_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } #if BYTE_ORDER == LITTLE_ENDIAN else if (mask & AFMT_S16_BE) { device_format = AFMT_S16_BE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } #else else if (mask & AFMT_S16_LE) { device_format = AFMT_S16_LE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } #endif } #if defined (AFMT_S32_NE) && defined (AFMT_S32_LE) && defined (AFMT_S32_BE) else if (format == RTAUDIO_SINT32) { if (mask & AFMT_S32_NE) { device_format = AFMT_S32_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; } #if BYTE_ORDER == LITTLE_ENDIAN else if (mask & AFMT_S32_BE) { device_format = AFMT_S32_BE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } #else else if (mask & AFMT_S32_LE) { device_format = AFMT_S32_LE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } #endif } #endif if (device_format == -1) { // The user requested format is not natively supported by the device. if (mask & AFMT_S16_NE) { device_format = AFMT_S16_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } #if BYTE_ORDER == LITTLE_ENDIAN else if (mask & AFMT_S16_BE) { device_format = AFMT_S16_BE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } #else else if (mask & AFMT_S16_LE) { device_format = AFMT_S16_LE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } #endif #if defined (AFMT_S32_NE) && defined (AFMT_S32_LE) && defined (AFMT_S32_BE) else if (mask & AFMT_S32_NE) { device_format = AFMT_S32_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; } #if BYTE_ORDER == LITTLE_ENDIAN else if (mask & AFMT_S32_BE) { device_format = AFMT_S32_BE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } #else else if (mask & AFMT_S32_LE) { device_format = AFMT_S32_LE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } #endif #endif else if (mask & AFMT_S8) { device_format = AFMT_S8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } } if (stream_.deviceFormat[mode] == 0) { // This really shouldn't happen ... close(fd); sprintf(message_, "RtApiOss: device (%s) data format not supported by RtAudio.", name); goto error; } // Determine the number of channels for this device. Note that the // channel value requested by the user might be < min_X_Channels. stream_.nUserChannels[mode] = channels; device_channels = channels; if (mode == OUTPUT) { if (channels < devices_[device].minOutputChannels) device_channels = devices_[device].minOutputChannels; } else { // mode == INPUT if (stream_.mode == OUTPUT && stream_.device[0] == device) { // We're doing duplex setup here. if (channels < devices_[device].minDuplexChannels) device_channels = devices_[device].minDuplexChannels; } else { if (channels < devices_[device].minInputChannels) device_channels = devices_[device].minInputChannels; } } stream_.nDeviceChannels[mode] = device_channels; // Attempt to set the buffer size. According to OSS, the minimum // number of buffers is two. The supposed minimum buffer size is 16 // bytes, so that will be our lower bound. The argument to this // call is in the form 0xMMMMSSSS (hex), where the buffer size (in // bytes) is given as 2^SSSS and the number of buffers as 2^MMMM. // We'll check the actual value used near the end of the setup // procedure. buffer_bytes = *bufferSize * formatBytes(stream_.deviceFormat[mode]) * device_channels; if (buffer_bytes < 16) buffer_bytes = 16; buffers = numberOfBuffers; if (buffers < 2) buffers = 2; temp = ((int) buffers << 16) + (int)(log10((double)buffer_bytes)/log10(2.0)); if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &temp)) { close(fd); sprintf(message_, "RtApiOss: error setting fragment size for device (%s).", name); goto error; } stream_.nBuffers = buffers; // Set the data format. temp = device_format; if (ioctl(fd, SNDCTL_DSP_SETFMT, &device_format) == -1 || device_format != temp) { close(fd); sprintf(message_, "RtApiOss: error setting data format for device (%s).", name); goto error; } // Set the number of channels. temp = device_channels; if (ioctl(fd, SNDCTL_DSP_CHANNELS, &device_channels) == -1 || device_channels != temp) { close(fd); sprintf(message_, "RtApiOss: error setting %d channels on device (%s).", temp, name); goto error; } // Set the sample rate. srate = sampleRate; temp = srate; if (ioctl(fd, SNDCTL_DSP_SPEED, &srate) == -1) { close(fd); sprintf(message_, "RtApiOss: error setting sample rate = %d on device (%s).", temp, name); goto error; } // Verify the sample rate setup worked. if (abs(srate - temp) > 100) { close(fd); sprintf(message_, "RtApiOss: error ... audio device (%s) doesn't support sample rate of %d.", name, temp); goto error; } stream_.sampleRate = sampleRate; if (ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &buffer_bytes) == -1) { close(fd); sprintf(message_, "RtApiOss: error getting buffer size for device (%s).", name); goto error; } // Save buffer size (in sample frames). *bufferSize = buffer_bytes / (formatBytes(stream_.deviceFormat[mode]) * device_channels); stream_.bufferSize = *bufferSize; if (mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device) { // We're doing duplex setup here. stream_.deviceFormat[0] = stream_.deviceFormat[1]; stream_.nDeviceChannels[0] = device_channels; } // Allocate the stream handles if necessary and then save. if ( stream_.apiHandle == 0 ) { handle = (int *) calloc(2, sizeof(int)); stream_.apiHandle = (void *) handle; handle[0] = 0; handle[1] = 0; } else { handle = (int *) stream_.apiHandle; } handle[mode] = fd; // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode]) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers if ( stream_.nUserChannels[0] != stream_.nUserChannels[1] ) { long buffer_bytes; if (stream_.nUserChannels[0] >= stream_.nUserChannels[1]) buffer_bytes = stream_.nUserChannels[0]; else buffer_bytes = stream_.nUserChannels[1]; buffer_bytes *= *bufferSize * formatBytes(stream_.userFormat); if (stream_.userBuffer) free(stream_.userBuffer); stream_.userBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.userBuffer == NULL) { close(fd); sprintf(message_, "RtApiOss: error allocating user buffer memory (%s).", name); goto error; } } if ( stream_.doConvertBuffer[mode] ) { long buffer_bytes; bool makeBuffer = true; if ( mode == OUTPUT ) buffer_bytes = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); else { // mode == INPUT buffer_bytes = stream_.nDeviceChannels[1] * formatBytes(stream_.deviceFormat[1]); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { long bytes_out = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( buffer_bytes < bytes_out ) makeBuffer = false; } } if ( makeBuffer ) { buffer_bytes *= *bufferSize; if (stream_.deviceBuffer) free(stream_.deviceBuffer); stream_.deviceBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.deviceBuffer == NULL) { close(fd); sprintf(message_, "RtApiOss: error allocating device buffer memory (%s).", name); goto error; } } } stream_.device[mode] = device; stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT && mode == INPUT ) { stream_.mode = DUPLEX; if (stream_.device[0] == device) handle[0] = fd; } else stream_.mode = mode; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if (mode == INPUT) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( mode == INPUT && stream_.deInterleave[1] ) { for (int k=0; kstopStream(); } void RtApiOss :: setStreamCallback(RtAudioCallback callback, void *userData) { verifyStream(); CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; if ( info->usingCallback ) { sprintf(message_, "RtApiOss: A callback is already set for this stream!"); error(RtError::WARNING); return; } info->callback = (void *) callback; info->userData = userData; info->usingCallback = true; info->object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority. The higher priority will only take affect if the // program is run as root or suid. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_RR); int err = pthread_create(&(info->thread), &attr, ossCallbackHandler, &stream_.callbackInfo); pthread_attr_destroy(&attr); if (err) { info->usingCallback = false; sprintf(message_, "RtApiOss: error starting callback thread!"); error(RtError::THREAD_ERROR); } } void RtApiOss :: cancelStreamCallback() { verifyStream(); if (stream_.callbackInfo.usingCallback) { if (stream_.state == STREAM_RUNNING) stopStream(); MUTEX_LOCK(&stream_.mutex); stream_.callbackInfo.usingCallback = false; pthread_join(stream_.callbackInfo.thread, NULL); stream_.callbackInfo.thread = 0; stream_.callbackInfo.callback = NULL; stream_.callbackInfo.userData = NULL; MUTEX_UNLOCK(&stream_.mutex); } } extern "C" void *ossCallbackHandler(void *ptr) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiOss *object = (RtApiOss *) info->object; bool *usingCallback = &info->usingCallback; while ( *usingCallback ) { pthread_testcancel(); try { object->tickStream(); } catch (RtError &exception) { fprintf(stderr, "\nRtApiOss: callback thread error (%s) ... closing thread.\n\n", exception.getMessageString()); break; } } return 0; } //******************** End of __LINUX_OSS__ *********************// #endif #if defined(__MACOSX_CORE__) // The OS X CoreAudio API is designed to use a separate callback // procedure for each of its audio devices. A single RtAudio duplex // stream using two different devices is supported here, though it // cannot be guaranteed to always behave correctly because we cannot // synchronize these two callbacks. This same functionality can be // achieved with better synchrony by opening two separate streams for // the devices and using RtAudio blocking calls (i.e. tickStream()). // // A property listener is installed for over/underrun information. // However, no functionality is currently provided to allow property // listeners to trigger user handlers because it is unclear what could // be done if a critical stream parameter (buffer size, sample rate, // device disconnect) notification arrived. The listeners entail // quite a bit of extra code and most likely, a user program wouldn't // be prepared for the result anyway. // A structure to hold various information related to the CoreAudio API // implementation. struct CoreHandle { UInt32 index[2]; bool stopStream; bool xrun; char *deviceBuffer; pthread_cond_t condition; CoreHandle() :stopStream(false), xrun(false), deviceBuffer(0) {} }; RtApiCore :: RtApiCore() { this->initialize(); if (nDevices_ <= 0) { sprintf(message_, "RtApiCore: no Macintosh OS-X Core Audio devices found!"); error(RtError::NO_DEVICES_FOUND); } } RtApiCore :: ~RtApiCore() { // The subclass destructor gets called before the base class // destructor, so close an existing stream before deallocating // apiDeviceId memory. if ( stream_.mode != UNINITIALIZED ) closeStream(); // Free our allocated apiDeviceId memory. AudioDeviceID *id; for ( unsigned int i=0; iapiDeviceId; err = AudioDeviceGetProperty( *id, 0, false, kAudioDevicePropertyDeviceManufacturer, &dataSize, name ); if (err != noErr) { sprintf( message_, "RtApiCore: OS-X error getting device manufacturer." ); error(RtError::DEBUG_WARNING); return; } strncpy(fullname, name, 256); strcat(fullname, ": " ); dataSize = 256; err = AudioDeviceGetProperty( *id, 0, false, kAudioDevicePropertyDeviceName, &dataSize, name ); if (err != noErr) { sprintf( message_, "RtApiCore: OS-X error getting device name." ); error(RtError::DEBUG_WARNING); return; } strncat(fullname, name, 254); info->name.erase(); info->name.append( (const char *)fullname, strlen(fullname)+1); // Get output channel information. unsigned int i, minChannels = 0, maxChannels = 0, nStreams = 0; AudioBufferList *bufferList = nil; err = AudioDeviceGetPropertyInfo( *id, 0, false, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (err == noErr && dataSize > 0) { bufferList = (AudioBufferList *) malloc( dataSize ); if (bufferList == NULL) { sprintf(message_, "RtApiCore: memory allocation error!"); error(RtError::DEBUG_WARNING); return; } err = AudioDeviceGetProperty( *id, 0, false, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if (err == noErr) { maxChannels = 0; minChannels = 1000; nStreams = bufferList->mNumberBuffers; for ( i=0; imBuffers[i].mNumberChannels; if ( bufferList->mBuffers[i].mNumberChannels < minChannels ) minChannels = bufferList->mBuffers[i].mNumberChannels; } } } free (bufferList); if (err != noErr || dataSize <= 0) { sprintf( message_, "RtApiCore: OS-X error getting output channels for device (%s).", info->name.c_str() ); error(RtError::DEBUG_WARNING); return; } if ( nStreams ) { if ( maxChannels > 0 ) info->maxOutputChannels = maxChannels; if ( minChannels > 0 ) info->minOutputChannels = minChannels; } // Get input channel information. bufferList = nil; err = AudioDeviceGetPropertyInfo( *id, 0, true, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (err == noErr && dataSize > 0) { bufferList = (AudioBufferList *) malloc( dataSize ); if (bufferList == NULL) { sprintf(message_, "RtApiCore: memory allocation error!"); error(RtError::DEBUG_WARNING); return; } err = AudioDeviceGetProperty( *id, 0, true, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if (err == noErr) { maxChannels = 0; minChannels = 1000; nStreams = bufferList->mNumberBuffers; for ( i=0; imBuffers[i].mNumberChannels < minChannels ) minChannels = bufferList->mBuffers[i].mNumberChannels; maxChannels += bufferList->mBuffers[i].mNumberChannels; } } } free (bufferList); if (err != noErr || dataSize <= 0) { sprintf( message_, "RtApiCore: OS-X error getting input channels for device (%s).", info->name.c_str() ); error(RtError::DEBUG_WARNING); return; } if ( nStreams ) { if ( maxChannels > 0 ) info->maxInputChannels = maxChannels; if ( minChannels > 0 ) info->minInputChannels = minChannels; } // If device opens for both playback and capture, we determine the channels. if (info->maxOutputChannels > 0 && info->maxInputChannels > 0) { info->hasDuplexSupport = true; info->maxDuplexChannels = (info->maxOutputChannels > info->maxInputChannels) ? info->maxInputChannels : info->maxOutputChannels; info->minDuplexChannels = (info->minOutputChannels > info->minInputChannels) ? info->minInputChannels : info->minOutputChannels; } // Probe the device sample rate and data format parameters. The // core audio query mechanism is performed on a "stream" // description, which can have a variable number of channels and // apply to input or output only. // Create a stream description structure. AudioStreamBasicDescription description; dataSize = sizeof( AudioStreamBasicDescription ); memset(&description, 0, sizeof(AudioStreamBasicDescription)); bool isInput = false; if ( info->maxOutputChannels == 0 ) isInput = true; bool isDuplex = false; if ( info->maxDuplexChannels > 0 ) isDuplex = true; // Determine the supported sample rates. info->sampleRates.clear(); for (unsigned int k=0; ksampleRates.push_back( SAMPLE_RATES[k] ); } if (info->sampleRates.size() == 0) { sprintf( message_, "RtApiCore: No supported sample rates found for OS-X device (%s).", info->name.c_str() ); error(RtError::DEBUG_WARNING); return; } // Determine the supported data formats. info->nativeFormats = 0; description.mFormatID = kAudioFormatLinearPCM; description.mBitsPerChannel = 8; description.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_SINT8; else { description.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_SINT8; } description.mBitsPerChannel = 16; description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_SINT16; else { description.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_SINT16; } description.mBitsPerChannel = 32; description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_SINT32; else { description.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_SINT32; } description.mBitsPerChannel = 24; description.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsAlignedHigh | kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_SINT24; else { description.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_SINT24; } description.mBitsPerChannel = 32; description.mFormatFlags = kLinearPCMFormatFlagIsFloat | kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_FLOAT32; else { description.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_FLOAT32; } description.mBitsPerChannel = 64; description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_FLOAT64; else { description.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian; if ( deviceSupportsFormat( *id, isInput, &description, isDuplex ) ) info->nativeFormats |= RTAUDIO_FLOAT64; } // Check that we have at least one supported format. if (info->nativeFormats == 0) { sprintf(message_, "RtApiCore: OS-X device (%s) data format not supported by RtAudio.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } info->probed = true; } OSStatus callbackHandler( AudioDeviceID inDevice, const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* inInputTime, AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime, void* infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiCore *object = (RtApiCore *) info->object; try { object->callbackEvent( inDevice, (void *)inInputData, (void *)outOutputData ); } catch (RtError &exception) { fprintf(stderr, "\nRtApiCore: callback handler error (%s)!\n\n", exception.getMessageString()); return kAudioHardwareUnspecifiedError; } return kAudioHardwareNoError; } OSStatus deviceListener( AudioDeviceID inDevice, UInt32 channel, Boolean isInput, AudioDevicePropertyID propertyID, void* handlePointer ) { CoreHandle *handle = (CoreHandle *) handlePointer; if ( propertyID == kAudioDeviceProcessorOverload ) { if ( isInput ) fprintf(stderr, "\nRtApiCore: OS-X audio input overrun detected!\n"); else fprintf(stderr, "\nRtApiCore: OS-X audio output underrun detected!\n"); handle->xrun = true; } return kAudioHardwareNoError; } bool RtApiCore :: probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ) { // Setup for stream mode. bool isInput = false; AudioDeviceID id = *((AudioDeviceID *) devices_[device].apiDeviceId); if ( mode == INPUT ) isInput = true; // Search for a stream which contains the desired number of channels. OSStatus err = noErr; UInt32 dataSize; unsigned int deviceChannels, nStreams = 0; UInt32 iChannel = 0, iStream = 0; AudioBufferList *bufferList = nil; err = AudioDeviceGetPropertyInfo( id, 0, isInput, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (err == noErr && dataSize > 0) { bufferList = (AudioBufferList *) malloc( dataSize ); if (bufferList == NULL) { sprintf(message_, "RtApiCore: memory allocation error in probeDeviceOpen()!"); error(RtError::DEBUG_WARNING); return FAILURE; } err = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if (err == noErr) { stream_.deInterleave[mode] = false; nStreams = bufferList->mNumberBuffers; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels >= (unsigned int) channels ) break; iChannel += bufferList->mBuffers[iStream].mNumberChannels; } // If we didn't find a single stream above, see if we can meet // the channel specification in mono mode (i.e. using separate // non-interleaved buffers). This can only work if there are N // consecutive one-channel streams, where N is the number of // desired channels. iChannel = 0; if ( iStream >= nStreams && nStreams >= (unsigned int) channels ) { int counter = 0; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels == 1 ) counter++; else counter = 0; if ( counter == channels ) { iStream -= channels - 1; iChannel -= channels - 1; stream_.deInterleave[mode] = true; break; } iChannel += bufferList->mBuffers[iStream].mNumberChannels; } } } } if (err != noErr || dataSize <= 0) { if ( bufferList ) free( bufferList ); sprintf( message_, "RtApiCore: OS-X error getting channels for device (%s).", devices_[device].name.c_str() ); error(RtError::DEBUG_WARNING); return FAILURE; } if (iStream >= nStreams) { free (bufferList); sprintf( message_, "RtApiCore: unable to find OS-X audio stream on device (%s) for requested channels (%d).", devices_[device].name.c_str(), channels ); error(RtError::DEBUG_WARNING); return FAILURE; } // This is ok even for mono mode ... it gets updated later. deviceChannels = bufferList->mBuffers[iStream].mNumberChannels; free (bufferList); // Determine the buffer size. AudioValueRange bufferRange; dataSize = sizeof(AudioValueRange); err = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyBufferSizeRange, &dataSize, &bufferRange); if (err != noErr) { sprintf( message_, "RtApiCore: OS-X error getting buffer size range for device (%s).", devices_[device].name.c_str() ); error(RtError::DEBUG_WARNING); return FAILURE; } long bufferBytes = *bufferSize * deviceChannels * formatBytes(RTAUDIO_FLOAT32); if (bufferRange.mMinimum > bufferBytes) bufferBytes = (int) bufferRange.mMinimum; else if (bufferRange.mMaximum < bufferBytes) bufferBytes = (int) bufferRange.mMaximum; // Set the buffer size. For mono mode, I'm assuming we only need to // make this setting for the first channel. UInt32 theSize = (UInt32) bufferBytes; dataSize = sizeof( UInt32); err = AudioDeviceSetProperty(id, NULL, 0, isInput, kAudioDevicePropertyBufferSize, dataSize, &theSize); if (err != noErr) { sprintf( message_, "RtApiCore: OS-X error setting the buffer size for device (%s).", devices_[device].name.c_str() ); error(RtError::DEBUG_WARNING); return FAILURE; } // If attempting to setup a duplex stream, the bufferSize parameter // MUST be the same in both directions! *bufferSize = bufferBytes / ( deviceChannels * formatBytes(RTAUDIO_FLOAT32) ); if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { sprintf( message_, "RtApiCore: OS-X error setting buffer size for duplex stream on device (%s).", devices_[device].name.c_str() ); error(RtError::DEBUG_WARNING); return FAILURE; } stream_.bufferSize = *bufferSize; stream_.nBuffers = 1; // Set the stream format description. Do for each channel in mono mode. AudioStreamBasicDescription description; dataSize = sizeof( AudioStreamBasicDescription ); if ( stream_.deInterleave[mode] ) nStreams = channels; else nStreams = 1; for ( unsigned int i=0; i 1 && stream_.deInterleave[mode]) stream_.doConvertBuffer[mode] = true; // Allocate our CoreHandle structure for the stream. CoreHandle *handle; if ( stream_.apiHandle == 0 ) { handle = (CoreHandle *) calloc(1, sizeof(CoreHandle)); if ( handle == NULL ) { sprintf(message_, "RtApiCore: OS-X error allocating coreHandle memory (%s).", devices_[device].name.c_str()); goto error; } handle->index[0] = 0; handle->index[1] = 0; if ( pthread_cond_init(&handle->condition, NULL) ) { sprintf(message_, "RtApiCore: error initializing pthread condition variable (%s).", devices_[device].name.c_str()); goto error; } stream_.apiHandle = (void *) handle; } else handle = (CoreHandle *) stream_.apiHandle; handle->index[mode] = iStream; // Allocate necessary internal buffers. if ( stream_.nUserChannels[0] != stream_.nUserChannels[1] ) { long buffer_bytes; if (stream_.nUserChannels[0] >= stream_.nUserChannels[1]) buffer_bytes = stream_.nUserChannels[0]; else buffer_bytes = stream_.nUserChannels[1]; buffer_bytes *= *bufferSize * formatBytes(stream_.userFormat); if (stream_.userBuffer) free(stream_.userBuffer); stream_.userBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.userBuffer == NULL) { sprintf(message_, "RtApiCore: OS-X error allocating user buffer memory (%s).", devices_[device].name.c_str()); goto error; } } if ( stream_.deInterleave[mode] ) { long buffer_bytes; bool makeBuffer = true; if ( mode == OUTPUT ) buffer_bytes = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); else { // mode == INPUT buffer_bytes = stream_.nDeviceChannels[1] * formatBytes(stream_.deviceFormat[1]); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { long bytes_out = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( buffer_bytes < bytes_out ) makeBuffer = false; } } if ( makeBuffer ) { buffer_bytes *= *bufferSize; if (stream_.deviceBuffer) free(stream_.deviceBuffer); stream_.deviceBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.deviceBuffer == NULL) { sprintf(message_, "RtApiCore: error allocating device buffer memory (%s).", devices_[device].name.c_str()); goto error; } // If not de-interleaving, we point stream_.deviceBuffer to the // OS X supplied device buffer before doing any necessary data // conversions. This presents a problem if we have a duplex // stream using one device which needs de-interleaving and // another device which doesn't. So, save a pointer to our own // device buffer in the CallbackInfo structure. handle->deviceBuffer = stream_.deviceBuffer; } } stream_.sampleRate = sampleRate; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; stream_.callbackInfo.object = (void *) this; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if (mode == INPUT) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( mode == INPUT && stream_.deInterleave[1] ) { for (int k=0; kcondition); free(handle); stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } error(RtError::DEBUG_WARNING); return FAILURE; } void RtApiCore :: closeStream() { // We don't want an exception to be thrown here because this // function is called by our class destructor. So, do our own // stream check. if ( stream_.mode == UNINITIALIZED ) { sprintf(message_, "RtApiCore::closeStream(): no open stream to close!"); error(RtError::WARNING); return; } AudioDeviceID id = *( (AudioDeviceID *) devices_[stream_.device[0]].apiDeviceId ); if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { if (stream_.state == STREAM_RUNNING) AudioDeviceStop( id, callbackHandler ); AudioDeviceRemoveIOProc( id, callbackHandler ); } id = *( (AudioDeviceID *) devices_[stream_.device[1]].apiDeviceId ); if (stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1]) ) { if (stream_.state == STREAM_RUNNING) AudioDeviceStop( id, callbackHandler ); AudioDeviceRemoveIOProc( id, callbackHandler ); } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } if ( stream_.deInterleave[0] || stream_.deInterleave[1] ) { free(stream_.deviceBuffer); stream_.deviceBuffer = 0; } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; // Destroy pthread condition variable and free the CoreHandle structure. if ( handle ) { pthread_cond_destroy(&handle->condition); free( handle ); stream_.apiHandle = 0; } stream_.mode = UNINITIALIZED; } void RtApiCore :: startStream() { verifyStream(); if (stream_.state == STREAM_RUNNING) return; MUTEX_LOCK(&stream_.mutex); OSStatus err; AudioDeviceID id; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { id = *( (AudioDeviceID *) devices_[stream_.device[0]].apiDeviceId ); err = AudioDeviceStart(id, callbackHandler); if (err != noErr) { sprintf(message_, "RtApiCore: OS-X error starting callback procedure on device (%s).", devices_[stream_.device[0]].name.c_str()); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } if (stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1]) ) { id = *( (AudioDeviceID *) devices_[stream_.device[1]].apiDeviceId ); err = AudioDeviceStart(id, callbackHandler); if (err != noErr) { sprintf(message_, "RtApiCore: OS-X error starting input callback procedure on device (%s).", devices_[stream_.device[0]].name.c_str()); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; handle->stopStream = false; stream_.state = STREAM_RUNNING; MUTEX_UNLOCK(&stream_.mutex); } void RtApiCore :: stopStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK(&stream_.mutex); OSStatus err; AudioDeviceID id; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { id = *( (AudioDeviceID *) devices_[stream_.device[0]].apiDeviceId ); err = AudioDeviceStop(id, callbackHandler); if (err != noErr) { sprintf(message_, "RtApiCore: OS-X error stopping callback procedure on device (%s).", devices_[stream_.device[0]].name.c_str()); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } if (stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1]) ) { id = *( (AudioDeviceID *) devices_[stream_.device[1]].apiDeviceId ); err = AudioDeviceStop(id, callbackHandler); if (err != noErr) { sprintf(message_, "RtApiCore: OS-X error stopping input callback procedure on device (%s).", devices_[stream_.device[0]].name.c_str()); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } MUTEX_UNLOCK(&stream_.mutex); } void RtApiCore :: abortStream() { stopStream(); } void RtApiCore :: tickStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; if (stream_.callbackInfo.usingCallback) { sprintf(message_, "RtApiCore: tickStream() should not be used when a callback function is set!"); error(RtError::WARNING); return; } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; MUTEX_LOCK(&stream_.mutex); pthread_cond_wait(&handle->condition, &stream_.mutex); MUTEX_UNLOCK(&stream_.mutex); } void RtApiCore :: callbackEvent( AudioDeviceID deviceId, void *inData, void *outData ) { verifyStream(); if (stream_.state == STREAM_STOPPED) return; CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; AudioBufferList *inBufferList = (AudioBufferList *) inData; AudioBufferList *outBufferList = (AudioBufferList *) outData; if ( info->usingCallback && handle->stopStream ) { // Check if the stream should be stopped (via the previous user // callback return value). We stop the stream here, rather than // after the function call, so that output data can first be // processed. this->stopStream(); return; } MUTEX_LOCK(&stream_.mutex); // Invoke user callback first, to get fresh output data. Don't // invoke the user callback if duplex mode AND the input/output devices // are different AND this function is called for the input device. AudioDeviceID id = *( (AudioDeviceID *) devices_[stream_.device[0]].apiDeviceId ); if ( info->usingCallback && (stream_.mode != DUPLEX || deviceId == id ) ) { RtAudioCallback callback = (RtAudioCallback) info->callback; handle->stopStream = callback(stream_.userBuffer, stream_.bufferSize, info->userData); if ( handle->xrun == true ) { handle->xrun = false; MUTEX_UNLOCK(&stream_.mutex); return; } } if ( stream_.mode == OUTPUT || ( stream_.mode == DUPLEX && deviceId == id ) ) { if (stream_.doConvertBuffer[0]) { if ( !stream_.deInterleave[0] ) stream_.deviceBuffer = (char *) outBufferList->mBuffers[handle->index[0]].mData; else stream_.deviceBuffer = handle->deviceBuffer; convertBuffer( stream_.deviceBuffer, stream_.userBuffer, stream_.convertInfo[0] ); if ( stream_.doByteSwap[0] ) byteSwapBuffer(stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[0], stream_.deviceFormat[0]); if ( stream_.deInterleave[0] ) { int bufferBytes = outBufferList->mBuffers[handle->index[0]].mDataByteSize; for ( int i=0; imBuffers[handle->index[0]+i].mData, &stream_.deviceBuffer[i*bufferBytes], bufferBytes ); } } } else { if (stream_.doByteSwap[0]) byteSwapBuffer(stream_.userBuffer, stream_.bufferSize * stream_.nUserChannels[0], stream_.userFormat); memcpy(outBufferList->mBuffers[handle->index[0]].mData, stream_.userBuffer, outBufferList->mBuffers[handle->index[0]].mDataByteSize ); } } id = *( (AudioDeviceID *) devices_[stream_.device[1]].apiDeviceId ); if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && deviceId == id ) ) { if (stream_.doConvertBuffer[1]) { if ( stream_.deInterleave[1] ) { stream_.deviceBuffer = (char *) handle->deviceBuffer; int bufferBytes = inBufferList->mBuffers[handle->index[1]].mDataByteSize; for ( int i=0; imBuffers[handle->index[1]+i].mData, bufferBytes ); } } else stream_.deviceBuffer = (char *) inBufferList->mBuffers[handle->index[1]].mData; if ( stream_.doByteSwap[1] ) byteSwapBuffer(stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[1], stream_.deviceFormat[1]); convertBuffer( stream_.userBuffer, stream_.deviceBuffer, stream_.convertInfo[1] ); } else { memcpy(stream_.userBuffer, inBufferList->mBuffers[handle->index[1]].mData, inBufferList->mBuffers[handle->index[1]].mDataByteSize ); if (stream_.doByteSwap[1]) byteSwapBuffer(stream_.userBuffer, stream_.bufferSize * stream_.nUserChannels[1], stream_.userFormat); } } if ( !info->usingCallback && (stream_.mode != DUPLEX || deviceId == id ) ) pthread_cond_signal(&handle->condition); MUTEX_UNLOCK(&stream_.mutex); } void RtApiCore :: setStreamCallback(RtAudioCallback callback, void *userData) { verifyStream(); if ( stream_.callbackInfo.usingCallback ) { sprintf(message_, "RtApiCore: A callback is already set for this stream!"); error(RtError::WARNING); return; } stream_.callbackInfo.callback = (void *) callback; stream_.callbackInfo.userData = userData; stream_.callbackInfo.usingCallback = true; } void RtApiCore :: cancelStreamCallback() { verifyStream(); if (stream_.callbackInfo.usingCallback) { if (stream_.state == STREAM_RUNNING) stopStream(); MUTEX_LOCK(&stream_.mutex); stream_.callbackInfo.usingCallback = false; stream_.callbackInfo.userData = NULL; stream_.state = STREAM_STOPPED; stream_.callbackInfo.callback = NULL; MUTEX_UNLOCK(&stream_.mutex); } } //******************** End of __MACOSX_CORE__ *********************// #endif #if defined(__LINUX_JACK__) // JACK is a low-latency audio server, written primarily for the // GNU/Linux operating system. It can connect a number of different // applications to an audio device, as well as allowing them to share // audio between themselves. // // The JACK server must be running before RtApiJack can be instantiated. // RtAudio will report just a single "device", which is the JACK audio // server. The JACK server is typically started in a terminal as follows: // // .jackd -d alsa -d hw:0 // // or through an interface program such as qjackctl. Many of the // parameters normally set for a stream are fixed by the JACK server // and can be specified when the JACK server is started. In // particular, // // .jackd -d alsa -d hw:0 -r 44100 -p 512 -n 4 // // specifies a sample rate of 44100 Hz, a buffer size of 512 sample // frames, and number of buffers = 4. Once the server is running, it // is not possible to override these values. If the values are not // specified in the command-line, the JACK server uses default values. #include #include // A structure to hold various information related to the Jack API // implementation. struct JackHandle { jack_client_t *client; jack_port_t **ports[2]; bool clientOpen; bool stopStream; pthread_cond_t condition; JackHandle() :client(0), clientOpen(false), stopStream(false) {} }; std::string jackmsg; static void jackerror (const char *desc) { jackmsg.erase(); jackmsg.append( desc, strlen(desc)+1 ); } RtApiJack :: RtApiJack() { this->initialize(); if (nDevices_ <= 0) { sprintf(message_, "RtApiJack: no Linux Jack server found or connection error (jack: %s)!", jackmsg.c_str()); error(RtError::NO_DEVICES_FOUND); } } RtApiJack :: ~RtApiJack() { if ( stream_.mode != UNINITIALIZED ) closeStream(); } void RtApiJack :: initialize(void) { nDevices_ = 0; // Tell the jack server to call jackerror() when it experiences an // error. This function saves the error message for subsequent // reporting via the normal RtAudio error function. jack_set_error_function( jackerror ); // Look for jack server and try to become a client. jack_client_t *client; if ( (client = jack_client_new( "RtApiJack" )) == 0) return; /* RtApiDevice device; // Determine the name of the device. device.name = "Jack Server"; devices_.push_back(device); nDevices_++; */ const char **ports; std::string port, prevPort; unsigned int nChannels = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { port = (char *) ports[ nChannels ]; unsigned int colonPos = 0; do { port = (char *) ports[ nChannels ]; if ( (colonPos = port.find(":")) != std::string::npos ) { port = port.substr( 0, colonPos+1 ); if ( port != prevPort ) { RtApiDevice device; device.name = port; devices_.push_back( device ); nDevices_++; prevPort = port; } } } while ( ports[++nChannels] ); free( ports ); } jack_client_close(client); } void RtApiJack :: probeDeviceInfo(RtApiDevice *info) { // Look for jack server and try to become a client. jack_client_t *client; if ( (client = jack_client_new( "RtApiJack_Probe" )) == 0) { sprintf(message_, "RtApiJack: error connecting to Linux Jack server in probeDeviceInfo() (jack: %s)!", jackmsg.c_str()); error(RtError::WARNING); return; } // Get the current jack server sample rate. info->sampleRates.clear(); info->sampleRates.push_back( jack_get_sample_rate(client) ); // Count the available ports as device channels. Jack "input ports" // equal RtAudio output channels. const char **ports; char *port; unsigned int nChannels = 0; ports = jack_get_ports( client, info->name.c_str(), NULL, JackPortIsInput ); if ( ports ) { port = (char *) ports[nChannels]; while ( port ) port = (char *) ports[++nChannels]; free( ports ); info->maxOutputChannels = nChannels; info->minOutputChannels = 1; } // Jack "output ports" equal RtAudio input channels. nChannels = 0; ports = jack_get_ports( client, info->name.c_str(), NULL, JackPortIsOutput ); if ( ports ) { port = (char *) ports[nChannels]; while ( port ) port = (char *) ports[++nChannels]; free( ports ); info->maxInputChannels = nChannels; info->minInputChannels = 1; } if (info->maxOutputChannels == 0 && info->maxInputChannels == 0) { jack_client_close(client); sprintf(message_, "RtApiJack: error determining jack input/output channels!"); error(RtError::DEBUG_WARNING); return; } if (info->maxOutputChannels > 0 && info->maxInputChannels > 0) { info->hasDuplexSupport = true; info->maxDuplexChannels = (info->maxOutputChannels > info->maxInputChannels) ? info->maxInputChannels : info->maxOutputChannels; info->minDuplexChannels = (info->minOutputChannels > info->minInputChannels) ? info->minInputChannels : info->minOutputChannels; } // Get the jack data format type. There isn't much documentation // regarding supported data formats in jack. I'm assuming here that // the default type will always be a floating-point type, of length // equal to either 4 or 8 bytes. int sample_size = sizeof( jack_default_audio_sample_t ); if ( sample_size == 4 ) info->nativeFormats = RTAUDIO_FLOAT32; else if ( sample_size == 8 ) info->nativeFormats = RTAUDIO_FLOAT64; // Check that we have a supported format if (info->nativeFormats == 0) { jack_client_close(client); sprintf(message_, "RtApiJack: error determining jack server data format!"); error(RtError::DEBUG_WARNING); return; } jack_client_close(client); info->probed = true; } int jackCallbackHandler(jack_nframes_t nframes, void *infoPointer) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiJack *object = (RtApiJack *) info->object; try { object->callbackEvent( (unsigned long) nframes ); } catch (RtError &exception) { fprintf(stderr, "\nRtApiJack: callback handler error (%s)!\n\n", exception.getMessageString()); return 0; } return 0; } void jackShutdown(void *infoPointer) { CallbackInfo *info = (CallbackInfo *) infoPointer; JackHandle *handle = (JackHandle *) info->apiInfo; handle->clientOpen = false; RtApiJack *object = (RtApiJack *) info->object; // Check current stream state. If stopped, then we'll assume this // was called as a result of a call to RtApiJack::stopStream (the // deactivation of a client handle causes this function to be called). // If not, we'll assume the Jack server is shutting down or some // other problem occurred and we should close the stream. if ( object->getStreamState() == RtApi::STREAM_STOPPED ) return; try { object->closeStream(); } catch (RtError &exception) { fprintf(stderr, "\nRtApiJack: jackShutdown error (%s)!\n\n", exception.getMessageString()); return; } fprintf(stderr, "\nRtApiJack: the Jack server is shutting down this client ... stream stopped and closed!!!\n\n"); } int jackXrun( void * ) { fprintf(stderr, "\nRtApiJack: audio overrun/underrun reported!\n"); return 0; } bool RtApiJack :: probeDeviceOpen(int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers) { // Compare the jack server channels to the requested number of channels. if ( (mode == OUTPUT && devices_[device].maxOutputChannels < channels ) || (mode == INPUT && devices_[device].maxInputChannels < channels ) ) { sprintf(message_, "RtApiJack: the Jack server does not support requested channels!"); error(RtError::DEBUG_WARNING); return FAILURE; } JackHandle *handle = (JackHandle *) stream_.apiHandle; // Look for jack server and try to become a client (only do once per stream). char label[32]; jack_client_t *client = 0; if ( mode == OUTPUT || (mode == INPUT && stream_.mode != OUTPUT) ) { snprintf(label, 32, "RtApiJack"); if ( (client = jack_client_new( (const char *) label )) == 0) { sprintf(message_, "RtApiJack: cannot connect to Linux Jack server in probeDeviceOpen() (jack: %s)!", jackmsg.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } } else { // The handle must have been created on an earlier pass. client = handle->client; } // First, check the jack server sample rate. int jack_rate; jack_rate = (int) jack_get_sample_rate(client); if ( sampleRate != jack_rate ) { jack_client_close(client); sprintf( message_, "RtApiJack: the requested sample rate (%d) is different than the JACK server rate (%d).", sampleRate, jack_rate ); error(RtError::DEBUG_WARNING); return FAILURE; } stream_.sampleRate = jack_rate; // The jack server seems to support just a single floating-point // data type. Since we already checked it before, just use what we // found then. stream_.deviceFormat[mode] = devices_[device].nativeFormats; stream_.userFormat = format; // Jack always uses non-interleaved buffers. We'll need to // de-interleave if we have more than one channel. stream_.deInterleave[mode] = false; if ( channels > 1 ) stream_.deInterleave[mode] = true; // Jack always provides host byte-ordered data. stream_.doByteSwap[mode] = false; // Get the buffer size. The buffer size and number of buffers // (periods) is set when the jack server is started. stream_.bufferSize = (int) jack_get_buffer_size(client); *bufferSize = stream_.bufferSize; stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; stream_.doConvertBuffer[mode] = false; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.deInterleave[mode]) stream_.doConvertBuffer[mode] = true; // Allocate our JackHandle structure for the stream. if ( handle == 0 ) { handle = (JackHandle *) calloc(1, sizeof(JackHandle)); if ( handle == NULL ) { sprintf(message_, "RtApiJack: error allocating JackHandle memory (%s).", devices_[device].name.c_str()); goto error; } handle->ports[0] = 0; handle->ports[1] = 0; if ( pthread_cond_init(&handle->condition, NULL) ) { sprintf(message_, "RtApiJack: error initializing pthread condition variable!"); goto error; } stream_.apiHandle = (void *) handle; handle->client = client; handle->clientOpen = true; } // Allocate necessary internal buffers. if ( stream_.nUserChannels[0] != stream_.nUserChannels[1] ) { long buffer_bytes; if (stream_.nUserChannels[0] >= stream_.nUserChannels[1]) buffer_bytes = stream_.nUserChannels[0]; else buffer_bytes = stream_.nUserChannels[1]; buffer_bytes *= *bufferSize * formatBytes(stream_.userFormat); if (stream_.userBuffer) free(stream_.userBuffer); stream_.userBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.userBuffer == NULL) { sprintf(message_, "RtApiJack: error allocating user buffer memory (%s).", devices_[device].name.c_str()); goto error; } } if ( stream_.doConvertBuffer[mode] ) { long buffer_bytes; bool makeBuffer = true; if ( mode == OUTPUT ) buffer_bytes = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); else { // mode == INPUT buffer_bytes = stream_.nDeviceChannels[1] * formatBytes(stream_.deviceFormat[1]); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { long bytes_out = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( buffer_bytes < bytes_out ) makeBuffer = false; } } if ( makeBuffer ) { buffer_bytes *= *bufferSize; if (stream_.deviceBuffer) free(stream_.deviceBuffer); stream_.deviceBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.deviceBuffer == NULL) { sprintf(message_, "RtApiJack: error allocating device buffer memory (%s).", devices_[device].name.c_str()); goto error; } } } // Allocate memory for the Jack ports (channels) identifiers. handle->ports[mode] = (jack_port_t **) malloc (sizeof (jack_port_t *) * channels); if ( handle->ports[mode] == NULL ) { sprintf(message_, "RtApiJack: error allocating port handle memory (%s).", devices_[device].name.c_str()); goto error; } stream_.device[mode] = device; stream_.state = STREAM_STOPPED; stream_.callbackInfo.usingCallback = false; stream_.callbackInfo.object = (void *) this; stream_.callbackInfo.apiInfo = (void *) handle; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up the stream for output. stream_.mode = DUPLEX; else { stream_.mode = mode; jack_set_process_callback( handle->client, jackCallbackHandler, (void *) &stream_.callbackInfo ); jack_set_xrun_callback( handle->client, jackXrun, NULL ); jack_on_shutdown( handle->client, jackShutdown, (void *) &stream_.callbackInfo ); } // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if (mode == INPUT) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( mode == INPUT && stream_.deInterleave[1] ) { for (int k=0; kcondition); if ( handle->clientOpen == true ) jack_client_close(handle->client); if ( handle->ports[0] ) free(handle->ports[0]); if ( handle->ports[1] ) free(handle->ports[1]); free( handle ); stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } error(RtError::DEBUG_WARNING); return FAILURE; } void RtApiJack :: closeStream() { // We don't want an exception to be thrown here because this // function is called by our class destructor. So, do our own // stream check. if ( stream_.mode == UNINITIALIZED ) { sprintf(message_, "RtApiJack::closeStream(): no open stream to close!"); error(RtError::WARNING); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( handle && handle->clientOpen == true ) { if (stream_.state == STREAM_RUNNING) jack_deactivate(handle->client); jack_client_close(handle->client); } if ( handle ) { if ( handle->ports[0] ) free(handle->ports[0]); if ( handle->ports[1] ) free(handle->ports[1]); pthread_cond_destroy(&handle->condition); free( handle ); stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } if (stream_.deviceBuffer) { free(stream_.deviceBuffer); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; } void RtApiJack :: startStream() { verifyStream(); if (stream_.state == STREAM_RUNNING) return; MUTEX_LOCK(&stream_.mutex); char label[64]; JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { for ( int i=0; iports[0][i] = jack_port_register(handle->client, (const char *)label, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { for ( int i=0; iports[1][i] = jack_port_register(handle->client, (const char *)label, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); } } if (jack_activate(handle->client)) { sprintf(message_, "RtApiJack: unable to activate JACK client!"); error(RtError::SYSTEM_ERROR); } const char **ports; int result; // Get the list of available ports. if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { ports = jack_get_ports(handle->client, devices_[stream_.device[0]].name.c_str(), NULL, JackPortIsInput); if ( ports == NULL) { sprintf(message_, "RtApiJack: error determining available jack input ports!"); error(RtError::SYSTEM_ERROR); } // Now make the port connections. Since RtAudio wasn't designed to // allow the user to select particular channels of a device, we'll // just open the first "nChannels" ports. for ( int i=0; iclient, jack_port_name(handle->ports[0][i]), ports[i] ); if ( result ) { free(ports); sprintf(message_, "RtApiJack: error connecting output ports!"); error(RtError::SYSTEM_ERROR); } } free(ports); } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { ports = jack_get_ports( handle->client, devices_[stream_.device[1]].name.c_str(), NULL, JackPortIsOutput ); if ( ports == NULL) { sprintf(message_, "RtApiJack: error determining available jack output ports!"); error(RtError::SYSTEM_ERROR); } // Now make the port connections. See note above. for ( int i=0; iclient, ports[i], jack_port_name(handle->ports[1][i]) ); if ( result ) { free(ports); sprintf(message_, "RtApiJack: error connecting input ports!"); error(RtError::SYSTEM_ERROR); } } free(ports); } handle->stopStream = false; stream_.state = STREAM_RUNNING; MUTEX_UNLOCK(&stream_.mutex); } void RtApiJack :: stopStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK(&stream_.mutex); JackHandle *handle = (JackHandle *) stream_.apiHandle; jack_deactivate(handle->client); MUTEX_UNLOCK(&stream_.mutex); } void RtApiJack :: abortStream() { stopStream(); } void RtApiJack :: tickStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; if (stream_.callbackInfo.usingCallback) { sprintf(message_, "RtApiJack: tickStream() should not be used when a callback function is set!"); error(RtError::WARNING); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; MUTEX_LOCK(&stream_.mutex); pthread_cond_wait(&handle->condition, &stream_.mutex); MUTEX_UNLOCK(&stream_.mutex); } void RtApiJack :: callbackEvent( unsigned long nframes ) { verifyStream(); if (stream_.state == STREAM_STOPPED) return; CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( info->usingCallback && handle->stopStream ) { // Check if the stream should be stopped (via the previous user // callback return value). We stop the stream here, rather than // after the function call, so that output data can first be // processed. this->stopStream(); return; } MUTEX_LOCK(&stream_.mutex); // Invoke user callback first, to get fresh output data. if ( info->usingCallback ) { RtAudioCallback callback = (RtAudioCallback) info->callback; handle->stopStream = callback(stream_.userBuffer, stream_.bufferSize, info->userData); } jack_default_audio_sample_t *jackbuffer; long bufferBytes = nframes * sizeof(jack_default_audio_sample_t); if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if (stream_.doConvertBuffer[0]) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer, stream_.convertInfo[0] ); for ( int i=0; iports[0][i], (jack_nframes_t) nframes); memcpy(jackbuffer, &stream_.deviceBuffer[i*bufferBytes], bufferBytes ); } } else { // single channel only jackbuffer = (jack_default_audio_sample_t *) jack_port_get_buffer(handle->ports[0][0], (jack_nframes_t) nframes); memcpy(jackbuffer, stream_.userBuffer, bufferBytes ); } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { if (stream_.doConvertBuffer[1]) { for ( int i=0; iports[1][i], (jack_nframes_t) nframes); memcpy(&stream_.deviceBuffer[i*bufferBytes], jackbuffer, bufferBytes ); } convertBuffer( stream_.userBuffer, stream_.deviceBuffer, stream_.convertInfo[1] ); } else { // single channel only jackbuffer = (jack_default_audio_sample_t *) jack_port_get_buffer(handle->ports[1][0], (jack_nframes_t) nframes); memcpy(stream_.userBuffer, jackbuffer, bufferBytes ); } } if ( !info->usingCallback ) pthread_cond_signal(&handle->condition); MUTEX_UNLOCK(&stream_.mutex); } void RtApiJack :: setStreamCallback(RtAudioCallback callback, void *userData) { verifyStream(); if ( stream_.callbackInfo.usingCallback ) { sprintf(message_, "RtApiJack: A callback is already set for this stream!"); error(RtError::WARNING); return; } stream_.callbackInfo.callback = (void *) callback; stream_.callbackInfo.userData = userData; stream_.callbackInfo.usingCallback = true; } void RtApiJack :: cancelStreamCallback() { verifyStream(); if (stream_.callbackInfo.usingCallback) { if (stream_.state == STREAM_RUNNING) stopStream(); MUTEX_LOCK(&stream_.mutex); stream_.callbackInfo.usingCallback = false; stream_.callbackInfo.userData = NULL; stream_.state = STREAM_STOPPED; stream_.callbackInfo.callback = NULL; MUTEX_UNLOCK(&stream_.mutex); } } #endif #if defined(__LINUX_ALSA__) #include #include #include // A structure to hold various information related to the ALSA API // implementation. struct AlsaHandle { snd_pcm_t *handles[2]; bool synchronized; char *tempBuffer; AlsaHandle() :synchronized(false), tempBuffer(0) {} }; extern "C" void *alsaCallbackHandler(void * ptr); RtApiAlsa :: RtApiAlsa() { this->initialize(); if (nDevices_ <= 0) { sprintf(message_, "RtApiAlsa: no Linux ALSA audio devices found!"); error(RtError::NO_DEVICES_FOUND); } } RtApiAlsa :: ~RtApiAlsa() { if ( stream_.mode != UNINITIALIZED ) closeStream(); } void RtApiAlsa :: initialize(void) { int card, subdevice, result; char name[64]; const char *cardId; snd_ctl_t *handle; snd_ctl_card_info_t *info; snd_ctl_card_info_alloca(&info); RtApiDevice device; // Count cards and devices nDevices_ = 0; card = -1; snd_card_next(&card); while ( card >= 0 ) { sprintf(name, "hw:%d", card); result = snd_ctl_open(&handle, name, 0); if (result < 0) { sprintf(message_, "RtApiAlsa: control open (%i): %s.", card, snd_strerror(result)); error(RtError::DEBUG_WARNING); goto next_card; } result = snd_ctl_card_info(handle, info); if (result < 0) { sprintf(message_, "RtApiAlsa: control hardware info (%i): %s.", card, snd_strerror(result)); error(RtError::DEBUG_WARNING); goto next_card; } cardId = snd_ctl_card_info_get_id(info); subdevice = -1; while (1) { result = snd_ctl_pcm_next_device(handle, &subdevice); if (result < 0) { sprintf(message_, "RtApiAlsa: control next device (%i): %s.", card, snd_strerror(result)); error(RtError::DEBUG_WARNING); break; } if (subdevice < 0) break; sprintf( name, "hw:%d,%d", card, subdevice ); // If a cardId exists and it contains at least one non-numeric // character, use it to identify the device. This avoids a bug // in ALSA such that a numeric string is interpreted as a device // number. for ( unsigned int i=0; iname.c_str(), 64 ); card = strtok(name, ","); err = snd_ctl_open(&chandle, card, SND_CTL_NONBLOCK); if (err < 0) { sprintf(message_, "RtApiAlsa: control open (%s): %s.", card, snd_strerror(err)); error(RtError::DEBUG_WARNING); return; } unsigned int dev = (unsigned int) atoi( strtok(NULL, ",") ); // First try for playback stream = SND_PCM_STREAM_PLAYBACK; snd_pcm_info_set_device(pcminfo, dev); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, stream); if ((err = snd_ctl_pcm_info(chandle, pcminfo)) < 0) { if (err == -ENOENT) { sprintf(message_, "RtApiAlsa: pcm device (%s) doesn't handle output!", info->name.c_str()); error(RtError::DEBUG_WARNING); } else { sprintf(message_, "RtApiAlsa: snd_ctl_pcm_info error for device (%s) output: %s", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); } goto capture_probe; } err = snd_pcm_open(&handle, info->name.c_str(), stream, open_mode | SND_PCM_NONBLOCK ); if (err < 0) { if ( err == EBUSY ) sprintf(message_, "RtApiAlsa: pcm playback device (%s) is busy: %s.", info->name.c_str(), snd_strerror(err)); else sprintf(message_, "RtApiAlsa: pcm playback open (%s) error: %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); goto capture_probe; } // We have an open device ... allocate the parameter structure. err = snd_pcm_hw_params_any(handle, params); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: hardware probe error (%s): %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); goto capture_probe; } // Get output channel information. unsigned int value; err = snd_pcm_hw_params_get_channels_min(params, &value); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: hardware minimum channel probe error (%s): %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); goto capture_probe; } info->minOutputChannels = value; err = snd_pcm_hw_params_get_channels_max(params, &value); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: hardware maximum channel probe error (%s): %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); goto capture_probe; } info->maxOutputChannels = value; snd_pcm_close(handle); capture_probe: // Now try for capture stream = SND_PCM_STREAM_CAPTURE; snd_pcm_info_set_stream(pcminfo, stream); err = snd_ctl_pcm_info(chandle, pcminfo); snd_ctl_close(chandle); if ( err < 0 ) { if (err == -ENOENT) { sprintf(message_, "RtApiAlsa: pcm device (%s) doesn't handle input!", info->name.c_str()); error(RtError::DEBUG_WARNING); } else { sprintf(message_, "RtApiAlsa: snd_ctl_pcm_info error for device (%s) input: %s", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); } if (info->maxOutputChannels == 0) // didn't open for playback either ... device invalid return; goto probe_parameters; } err = snd_pcm_open(&handle, info->name.c_str(), stream, open_mode | SND_PCM_NONBLOCK); if (err < 0) { if ( err == EBUSY ) sprintf(message_, "RtApiAlsa: pcm capture device (%s) is busy: %s.", info->name.c_str(), snd_strerror(err)); else sprintf(message_, "RtApiAlsa: pcm capture open (%s) error: %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); if (info->maxOutputChannels == 0) // didn't open for playback either ... device invalid return; goto probe_parameters; } // We have an open capture device ... allocate the parameter structure. err = snd_pcm_hw_params_any(handle, params); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: hardware probe error (%s): %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); if (info->maxOutputChannels > 0) goto probe_parameters; else return; } // Get input channel information. err = snd_pcm_hw_params_get_channels_min(params, &value); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: hardware minimum in channel probe error (%s): %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); if (info->maxOutputChannels > 0) goto probe_parameters; else return; } info->minInputChannels = value; err = snd_pcm_hw_params_get_channels_max(params, &value); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: hardware maximum in channel probe error (%s): %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); if (info->maxOutputChannels > 0) goto probe_parameters; else return; } info->maxInputChannels = value; snd_pcm_close(handle); // If device opens for both playback and capture, we determine the channels. if (info->maxOutputChannels == 0 || info->maxInputChannels == 0) goto probe_parameters; info->hasDuplexSupport = true; info->maxDuplexChannels = (info->maxOutputChannels > info->maxInputChannels) ? info->maxInputChannels : info->maxOutputChannels; info->minDuplexChannels = (info->minOutputChannels > info->minInputChannels) ? info->minInputChannels : info->minOutputChannels; probe_parameters: // At this point, we just need to figure out the supported data // formats and sample rates. We'll proceed by opening the device in // the direction with the maximum number of channels, or playback if // they are equal. This might limit our sample rate options, but so // be it. if (info->maxOutputChannels >= info->maxInputChannels) stream = SND_PCM_STREAM_PLAYBACK; else stream = SND_PCM_STREAM_CAPTURE; err = snd_pcm_open(&handle, info->name.c_str(), stream, open_mode); if (err < 0) { sprintf(message_, "RtApiAlsa: pcm (%s) won't reopen during probe: %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); return; } // We have an open device ... allocate the parameter structure. err = snd_pcm_hw_params_any(handle, params); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: hardware reopen probe error (%s): %s.", info->name.c_str(), snd_strerror(err)); error(RtError::DEBUG_WARNING); return; } // Test our discrete set of sample rate values. int dir = 0; info->sampleRates.clear(); for (unsigned int i=0; isampleRates.push_back(SAMPLE_RATES[i]); } if (info->sampleRates.size() == 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: no supported sample rates found for device (%s).", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // Probe the supported data formats ... we don't care about endian-ness just yet snd_pcm_format_t format; info->nativeFormats = 0; format = SND_PCM_FORMAT_S8; if (snd_pcm_hw_params_test_format(handle, params, format) == 0) info->nativeFormats |= RTAUDIO_SINT8; format = SND_PCM_FORMAT_S16; if (snd_pcm_hw_params_test_format(handle, params, format) == 0) info->nativeFormats |= RTAUDIO_SINT16; format = SND_PCM_FORMAT_S24; if (snd_pcm_hw_params_test_format(handle, params, format) == 0) info->nativeFormats |= RTAUDIO_SINT24; format = SND_PCM_FORMAT_S32; if (snd_pcm_hw_params_test_format(handle, params, format) == 0) info->nativeFormats |= RTAUDIO_SINT32; format = SND_PCM_FORMAT_FLOAT; if (snd_pcm_hw_params_test_format(handle, params, format) == 0) info->nativeFormats |= RTAUDIO_FLOAT32; format = SND_PCM_FORMAT_FLOAT64; if (snd_pcm_hw_params_test_format(handle, params, format) == 0) info->nativeFormats |= RTAUDIO_FLOAT64; // Check that we have at least one supported format if (info->nativeFormats == 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: pcm device (%s) data format not supported by RtAudio.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // That's all ... close the device and return snd_pcm_close(handle); info->probed = true; return; } bool RtApiAlsa :: probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ) { #if defined(__RTAUDIO_DEBUG__) snd_output_t *out; snd_output_stdio_attach(&out, stderr, 0); #endif // I'm not using the "plug" interface ... too much inconsistent behavior. const char *name = devices_[device].name.c_str(); snd_pcm_stream_t alsa_stream; if (mode == OUTPUT) alsa_stream = SND_PCM_STREAM_PLAYBACK; else alsa_stream = SND_PCM_STREAM_CAPTURE; int err; snd_pcm_t *handle; int alsa_open_mode = SND_PCM_ASYNC; err = snd_pcm_open(&handle, name, alsa_stream, alsa_open_mode); if (err < 0) { sprintf(message_,"RtApiAlsa: pcm device (%s) won't open: %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } // Fill the parameter structure. snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_alloca(&hw_params); err = snd_pcm_hw_params_any(handle, hw_params); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error getting parameter handle (%s): %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump hardware params just after device open:\n\n"); snd_pcm_hw_params_dump(hw_params, out); #endif // Set access ... try interleaved access first, then non-interleaved if ( !snd_pcm_hw_params_test_access( handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED) ) { err = snd_pcm_hw_params_set_access(handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); } else if ( !snd_pcm_hw_params_test_access( handle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED) ) { err = snd_pcm_hw_params_set_access(handle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED); stream_.deInterleave[mode] = true; } else { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: device (%s) access not supported by RtAudio.", name); error(RtError::DEBUG_WARNING); return FAILURE; } if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error setting access ( (%s): %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } // Determine how to set the device format. stream_.userFormat = format; snd_pcm_format_t device_format = SND_PCM_FORMAT_UNKNOWN; if (format == RTAUDIO_SINT8) device_format = SND_PCM_FORMAT_S8; else if (format == RTAUDIO_SINT16) device_format = SND_PCM_FORMAT_S16; else if (format == RTAUDIO_SINT24) device_format = SND_PCM_FORMAT_S24; else if (format == RTAUDIO_SINT32) device_format = SND_PCM_FORMAT_S32; else if (format == RTAUDIO_FLOAT32) device_format = SND_PCM_FORMAT_FLOAT; else if (format == RTAUDIO_FLOAT64) device_format = SND_PCM_FORMAT_FLOAT64; if (snd_pcm_hw_params_test_format(handle, hw_params, device_format) == 0) { stream_.deviceFormat[mode] = format; goto set_format; } // The user requested format is not natively supported by the device. device_format = SND_PCM_FORMAT_FLOAT64; if (snd_pcm_hw_params_test_format(handle, hw_params, device_format) == 0) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; goto set_format; } device_format = SND_PCM_FORMAT_FLOAT; if (snd_pcm_hw_params_test_format(handle, hw_params, device_format) == 0) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; goto set_format; } device_format = SND_PCM_FORMAT_S32; if (snd_pcm_hw_params_test_format(handle, hw_params, device_format) == 0) { stream_.deviceFormat[mode] = RTAUDIO_SINT32; goto set_format; } device_format = SND_PCM_FORMAT_S24; if (snd_pcm_hw_params_test_format(handle, hw_params, device_format) == 0) { stream_.deviceFormat[mode] = RTAUDIO_SINT24; goto set_format; } device_format = SND_PCM_FORMAT_S16; if (snd_pcm_hw_params_test_format(handle, hw_params, device_format) == 0) { stream_.deviceFormat[mode] = RTAUDIO_SINT16; goto set_format; } device_format = SND_PCM_FORMAT_S8; if (snd_pcm_hw_params_test_format(handle, hw_params, device_format) == 0) { stream_.deviceFormat[mode] = RTAUDIO_SINT8; goto set_format; } // If we get here, no supported format was found. sprintf(message_,"RtApiAlsa: pcm device (%s) data format not supported by RtAudio.", name); snd_pcm_close(handle); error(RtError::DEBUG_WARNING); return FAILURE; set_format: err = snd_pcm_hw_params_set_format(handle, hw_params, device_format); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error setting format (%s): %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } // Determine whether byte-swaping is necessary. stream_.doByteSwap[mode] = false; if (device_format != SND_PCM_FORMAT_S8) { err = snd_pcm_format_cpu_endian(device_format); if (err == 0) stream_.doByteSwap[mode] = true; else if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error getting format endian-ness (%s): %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } } // Set the sample rate. err = snd_pcm_hw_params_set_rate(handle, hw_params, (unsigned int)sampleRate, 0); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error setting sample rate (%d) on device (%s): %s.", sampleRate, name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } // Determine the number of channels for this device. We support a possible // minimum device channel number > than the value requested by the user. stream_.nUserChannels[mode] = channels; unsigned int value; err = snd_pcm_hw_params_get_channels_max(hw_params, &value); int device_channels = value; if (err < 0 || device_channels < channels) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: channels (%d) not supported by device (%s).", channels, name); error(RtError::DEBUG_WARNING); return FAILURE; } err = snd_pcm_hw_params_get_channels_min(hw_params, &value); if (err < 0 ) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error getting min channels count on device (%s).", name); error(RtError::DEBUG_WARNING); return FAILURE; } device_channels = value; if (device_channels < channels) device_channels = channels; stream_.nDeviceChannels[mode] = device_channels; // Set the device channels. err = snd_pcm_hw_params_set_channels(handle, hw_params, device_channels); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error setting channels (%d) on device (%s): %s.", device_channels, name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } // Set the buffer number, which in ALSA is referred to as the "period". int dir; unsigned int periods = numberOfBuffers; // Even though the hardware might allow 1 buffer, it won't work reliably. if (periods < 2) periods = 2; err = snd_pcm_hw_params_set_periods_near(handle, hw_params, &periods, &dir); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error setting periods (%s): %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } // Set the buffer (or period) size. snd_pcm_uframes_t period_size = *bufferSize; err = snd_pcm_hw_params_set_period_size_near(handle, hw_params, &period_size, &dir); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error setting period size (%s): %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } *bufferSize = period_size; // If attempting to setup a duplex stream, the bufferSize parameter // MUST be the same in both directions! if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { sprintf( message_, "RtApiAlsa: error setting buffer size for duplex stream on device (%s).", name ); error(RtError::DEBUG_WARNING); return FAILURE; } stream_.bufferSize = *bufferSize; // Install the hardware configuration err = snd_pcm_hw_params(handle, hw_params); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtApiAlsa: error installing hardware configuration (%s): %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump hardware params after installation:\n\n"); snd_pcm_hw_params_dump(hw_params, out); #endif // Set the software configuration to fill buffers with zeros and prevent device stopping on xruns. snd_pcm_sw_params_t *sw_params = NULL; snd_pcm_sw_params_alloca( &sw_params ); snd_pcm_sw_params_current( handle, sw_params ); snd_pcm_sw_params_set_start_threshold( handle, sw_params, *bufferSize ); snd_pcm_sw_params_set_stop_threshold( handle, sw_params, 0x7fffffff ); snd_pcm_sw_params_set_silence_threshold( handle, sw_params, 0 ); snd_pcm_sw_params_set_silence_size( handle, sw_params, INT_MAX ); err = snd_pcm_sw_params( handle, sw_params ); if (err < 0) { snd_pcm_close(handle); sprintf(message_, "RtAudio: ALSA error installing software configuration (%s): %s.", name, snd_strerror(err)); error(RtError::DEBUG_WARNING); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump software params after installation:\n\n"); snd_pcm_sw_params_dump(sw_params, out); #endif // Allocate the ApiHandle if necessary and then save. AlsaHandle *apiInfo = 0; if ( stream_.apiHandle == 0 ) { apiInfo = (AlsaHandle *) new AlsaHandle; stream_.apiHandle = (void *) apiInfo; apiInfo->handles[0] = 0; apiInfo->handles[1] = 0; } else { apiInfo = (AlsaHandle *) stream_.apiHandle; } apiInfo->handles[mode] = handle; // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.nUserChannels[mode] > 1 && stream_.deInterleave[mode]) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers if ( stream_.nUserChannels[0] != stream_.nUserChannels[1] ) { long buffer_bytes; if (stream_.nUserChannels[0] >= stream_.nUserChannels[1]) buffer_bytes = stream_.nUserChannels[0]; else buffer_bytes = stream_.nUserChannels[1]; buffer_bytes *= *bufferSize * formatBytes(stream_.userFormat); if (stream_.userBuffer) free(stream_.userBuffer); if (apiInfo->tempBuffer) free(apiInfo->tempBuffer); stream_.userBuffer = (char *) calloc(buffer_bytes, 1); apiInfo->tempBuffer = (char *) calloc(buffer_bytes, 1); if ( stream_.userBuffer == NULL || apiInfo->tempBuffer == NULL ) { sprintf(message_, "RtApiAlsa: error allocating user buffer memory (%s).", devices_[device].name.c_str()); goto error; } } if ( stream_.doConvertBuffer[mode] ) { long buffer_bytes; bool makeBuffer = true; if ( mode == OUTPUT ) buffer_bytes = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); else { // mode == INPUT buffer_bytes = stream_.nDeviceChannels[1] * formatBytes(stream_.deviceFormat[1]); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { long bytes_out = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( buffer_bytes < bytes_out ) makeBuffer = false; } } if ( makeBuffer ) { buffer_bytes *= *bufferSize; if (stream_.deviceBuffer) free(stream_.deviceBuffer); stream_.deviceBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.deviceBuffer == NULL) { sprintf(message_, "RtApiAlsa: error allocating device buffer memory (%s).", devices_[device].name.c_str()); goto error; } } } stream_.device[mode] = device; stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT && mode == INPUT ) { // We had already set up an output stream. stream_.mode = DUPLEX; // Link the streams if possible. apiInfo->synchronized = false; if (snd_pcm_link( apiInfo->handles[0], apiInfo->handles[1] ) == 0) apiInfo->synchronized = true; else { sprintf(message_, "RtApiAlsa: unable to synchronize input and output streams (%s).", devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); } } else stream_.mode = mode; stream_.nBuffers = periods; stream_.sampleRate = sampleRate; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if (mode == INPUT) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( mode == INPUT && stream_.deInterleave[1] ) { for (int k=0; khandles[0]) snd_pcm_close(apiInfo->handles[0]); if (apiInfo->handles[1]) snd_pcm_close(apiInfo->handles[1]); if ( apiInfo->tempBuffer ) free(apiInfo->tempBuffer); delete apiInfo; stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } error(RtError::DEBUG_WARNING); return FAILURE; } void RtApiAlsa :: closeStream() { // We don't want an exception to be thrown here because this // function is called by our class destructor. So, do our own // stream check. if ( stream_.mode == UNINITIALIZED ) { sprintf(message_, "RtApiAlsa::closeStream(): no open stream to close!"); error(RtError::WARNING); return; } AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; if (stream_.state == STREAM_RUNNING) { if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) snd_pcm_drop(apiInfo->handles[0]); if (stream_.mode == INPUT || stream_.mode == DUPLEX) snd_pcm_drop(apiInfo->handles[1]); stream_.state = STREAM_STOPPED; } if (stream_.callbackInfo.usingCallback) { stream_.callbackInfo.usingCallback = false; pthread_join(stream_.callbackInfo.thread, NULL); } if (apiInfo) { if (apiInfo->handles[0]) snd_pcm_close(apiInfo->handles[0]); if (apiInfo->handles[1]) snd_pcm_close(apiInfo->handles[1]); free(apiInfo->tempBuffer); delete apiInfo; stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } if (stream_.deviceBuffer) { free(stream_.deviceBuffer); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; } // Pump a bunch of zeros into the output buffer. This is needed only when we // are doing duplex operations. bool RtApiAlsa :: primeOutputBuffer() { int err; char *buffer; int channels; snd_pcm_t **handle; RtAudioFormat format; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; handle = (snd_pcm_t **) apiInfo->handles; if (stream_.mode == DUPLEX) { // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, apiInfo->tempBuffer, stream_.convertInfo[0] ); channels = stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { channels = stream_.nUserChannels[0]; format = stream_.userFormat; } buffer = new char[stream_.bufferSize * formatBytes(format) * channels]; bzero(buffer, stream_.bufferSize * formatBytes(format) * channels); for (int i=0; ihandles; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { state = snd_pcm_state(handle[0]); if (state != SND_PCM_STATE_PREPARED) { err = snd_pcm_prepare(handle[0]); if (err < 0) { sprintf(message_, "RtApiAlsa: error preparing pcm device (%s): %s.", devices_[stream_.device[0]].name.c_str(), snd_strerror(err)); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } // Reprime output buffer if needed if ( (stream_.mode == DUPLEX) && ( !primeOutputBuffer() ) ) { MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } } if ( (stream_.mode == INPUT || stream_.mode == DUPLEX) && !apiInfo->synchronized ) { state = snd_pcm_state(handle[1]); if (state != SND_PCM_STATE_PREPARED) { err = snd_pcm_prepare(handle[1]); if (err < 0) { sprintf(message_, "RtApiAlsa: error preparing pcm device (%s): %s.", devices_[stream_.device[1]].name.c_str(), snd_strerror(err)); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } } if ( (stream_.mode == DUPLEX) && ( !primeOutputBuffer() ) ) { MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } stream_.state = STREAM_RUNNING; MUTEX_UNLOCK(&stream_.mutex); } void RtApiAlsa :: stopStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK(&stream_.mutex); int err; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { err = snd_pcm_drain(handle[0]); if (err < 0) { sprintf(message_, "RtApiAlsa: error draining pcm device (%s): %s.", devices_[stream_.device[0]].name.c_str(), snd_strerror(err)); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } if ( (stream_.mode == INPUT || stream_.mode == DUPLEX) && !apiInfo->synchronized ) { err = snd_pcm_drain(handle[1]); if (err < 0) { sprintf(message_, "RtApiAlsa: error draining pcm device (%s): %s.", devices_[stream_.device[1]].name.c_str(), snd_strerror(err)); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } MUTEX_UNLOCK(&stream_.mutex); } void RtApiAlsa :: abortStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK(&stream_.mutex); int err; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { err = snd_pcm_drop(handle[0]); if (err < 0) { sprintf(message_, "RtApiAlsa: error draining pcm device (%s): %s.", devices_[stream_.device[0]].name.c_str(), snd_strerror(err)); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } if ( (stream_.mode == INPUT || stream_.mode == DUPLEX) && !apiInfo->synchronized ) { err = snd_pcm_drop(handle[1]); if (err < 0) { sprintf(message_, "RtApiAlsa: error draining pcm device (%s): %s.", devices_[stream_.device[1]].name.c_str(), snd_strerror(err)); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } MUTEX_UNLOCK(&stream_.mutex); } int RtApiAlsa :: streamWillBlock() { verifyStream(); if (stream_.state == STREAM_STOPPED) return 0; MUTEX_LOCK(&stream_.mutex); int err = 0, frames = 0; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { err = snd_pcm_avail_update(handle[0]); if (err < 0) { sprintf(message_, "RtApiAlsa: error getting available frames for device (%s): %s.", devices_[stream_.device[0]].name.c_str(), snd_strerror(err)); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } } frames = err; if (stream_.mode == INPUT || stream_.mode == DUPLEX) { err = snd_pcm_avail_update(handle[1]); if (err < 0) { sprintf(message_, "RtApiAlsa: error getting available frames for device (%s): %s.", devices_[stream_.device[1]].name.c_str(), snd_strerror(err)); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } if (frames > err) frames = err; } frames = stream_.bufferSize - frames; if (frames < 0) frames = 0; MUTEX_UNLOCK(&stream_.mutex); return frames; } void RtApiAlsa :: tickStream() { verifyStream(); int stopStream = 0; if (stream_.state == STREAM_STOPPED) { if (stream_.callbackInfo.usingCallback) usleep(50000); // sleep 50 milliseconds return; } else if (stream_.callbackInfo.usingCallback) { RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; stopStream = callback(stream_.userBuffer, stream_.bufferSize, stream_.callbackInfo.userData); } MUTEX_LOCK(&stream_.mutex); // The state might change while waiting on a mutex. if (stream_.state == STREAM_STOPPED) goto unlock; int err; char *buffer; int channels; AlsaHandle *apiInfo; snd_pcm_t **handle; RtAudioFormat format; apiInfo = (AlsaHandle *) stream_.apiHandle; handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == DUPLEX ) { // In duplex mode, we need to make the snd_pcm_read call before // the snd_pcm_write call in order to avoid under/over runs. So, // copy the userData to our temporary buffer. int bufferBytes; bufferBytes = stream_.bufferSize * stream_.nUserChannels[0] * formatBytes(stream_.userFormat); memcpy( apiInfo->tempBuffer, stream_.userBuffer, bufferBytes ); } if (stream_.mode == INPUT || stream_.mode == DUPLEX) { // Setup parameters. if (stream_.doConvertBuffer[1]) { buffer = stream_.deviceBuffer; channels = stream_.nDeviceChannels[1]; format = stream_.deviceFormat[1]; } else { buffer = stream_.userBuffer; channels = stream_.nUserChannels[1]; format = stream_.userFormat; } // Read samples from device in interleaved/non-interleaved format. if (stream_.deInterleave[1]) { void *bufs[channels]; size_t offset = stream_.bufferSize * formatBytes(format); for (int i=0; itempBuffer, stream_.convertInfo[0] ); else convertBuffer( buffer, stream_.userBuffer, stream_.convertInfo[0] ); channels = stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { if ( stream_.mode == DUPLEX ) buffer = apiInfo->tempBuffer; else buffer = stream_.userBuffer; channels = stream_.nUserChannels[0]; format = stream_.userFormat; } // Do byte swapping if necessary. if (stream_.doByteSwap[0]) byteSwapBuffer(buffer, stream_.bufferSize * channels, format); // Write samples to device in interleaved/non-interleaved format. if (stream_.deInterleave[0]) { void *bufs[channels]; size_t offset = stream_.bufferSize * formatBytes(format); for (int i=0; istopStream(); } void RtApiAlsa :: setStreamCallback(RtAudioCallback callback, void *userData) { verifyStream(); CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; if ( info->usingCallback ) { sprintf(message_, "RtApiAlsa: A callback is already set for this stream!"); error(RtError::WARNING); return; } info->callback = (void *) callback; info->userData = userData; info->usingCallback = true; info->object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority. The higher priority will only take affect if the // program is run as root or suid. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_RR); int err = pthread_create(&info->thread, &attr, alsaCallbackHandler, &stream_.callbackInfo); pthread_attr_destroy(&attr); if (err) { info->usingCallback = false; sprintf(message_, "RtApiAlsa: error starting callback thread!"); error(RtError::THREAD_ERROR); } } void RtApiAlsa :: cancelStreamCallback() { verifyStream(); if (stream_.callbackInfo.usingCallback) { if (stream_.state == STREAM_RUNNING) stopStream(); MUTEX_LOCK(&stream_.mutex); stream_.callbackInfo.usingCallback = false; pthread_join(stream_.callbackInfo.thread, NULL); stream_.callbackInfo.thread = 0; stream_.callbackInfo.callback = NULL; stream_.callbackInfo.userData = NULL; MUTEX_UNLOCK(&stream_.mutex); } } extern "C" void *alsaCallbackHandler(void *ptr) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiAlsa *object = (RtApiAlsa *) info->object; bool *usingCallback = &info->usingCallback; while ( *usingCallback ) { try { object->tickStream(); } catch (RtError &exception) { fprintf(stderr, "\nRtApiAlsa: callback thread error (%s) ... closing thread.\n\n", exception.getMessageString()); break; } } pthread_exit(NULL); } //******************** End of __LINUX_ALSA__ *********************// #endif #if defined(__WINDOWS_ASIO__) // ASIO API on Windows // The ASIO API is designed around a callback scheme, so this // implementation is similar to that used for OS-X CoreAudio and Linux // Jack. The primary constraint with ASIO is that it only allows // access to a single driver at a time. Thus, it is not possible to // have more than one simultaneous RtAudio stream. // // This implementation also requires a number of external ASIO files // and a few global variables. The ASIO callback scheme does not // allow for the passing of user data, so we must create a global // pointer to our callbackInfo structure. // // On unix systems, we make use of a pthread condition variable. // Since there is no equivalent in Windows, I hacked something based // on information found in // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html. #include "asio/asiosys.h" #include "asio/asio.h" #include "asio/iasiothiscallresolver.h" #include "asio/asiodrivers.h" #include AsioDrivers drivers; ASIOCallbacks asioCallbacks; ASIODriverInfo driverInfo; CallbackInfo *asioCallbackInfo; struct AsioHandle { bool stopStream; ASIOBufferInfo *bufferInfos; HANDLE condition; AsioHandle() :stopStream(false), bufferInfos(0) {} }; static const char* GetAsioErrorString( ASIOError result ) { struct Messages { ASIOError value; const char*message; }; static Messages m[] = { { ASE_NotPresent, "Hardware input or output is not present or available." }, { ASE_HWMalfunction, "Hardware is malfunctioning." }, { ASE_InvalidParameter, "Invalid input parameter." }, { ASE_InvalidMode, "Invalid mode." }, { ASE_SPNotAdvancing, "Sample position not advancing." }, { ASE_NoClock, "Sample clock or rate cannot be determined or is not present." }, { ASE_NoMemory, "Not enough memory to complete the request." } }; for (unsigned int i = 0; i < sizeof(m)/sizeof(m[0]); ++i) if (m[i].value == result) return m[i].message; return "Unknown error."; } RtApiAsio :: RtApiAsio() { this->coInitialized = false; this->initialize(); if (nDevices_ <= 0) { sprintf(message_, "RtApiAsio: no Windows ASIO audio drivers found!"); error(RtError::NO_DEVICES_FOUND); } } RtApiAsio :: ~RtApiAsio() { if ( stream_.mode != UNINITIALIZED ) closeStream(); if ( coInitialized ) CoUninitialize(); } void RtApiAsio :: initialize(void) { // ASIO cannot run on a multi-threaded appartment. You can call CoInitialize beforehand, but it must be // for appartment threading (in which case, CoInitilialize will return S_FALSE here). coInitialized = false; HRESULT hr = CoInitialize(NULL); if ( FAILED(hr) ) { sprintf(message_,"RtApiAsio: ASIO requires a single-threaded appartment. Call CoInitializeEx(0,COINIT_APARTMENTTHREADED)"); } coInitialized = true; nDevices_ = drivers.asioGetNumDev(); if (nDevices_ <= 0) return; // Create device structures and write device driver names to each. RtApiDevice device; char name[128]; for (int i=0; iname.c_str() ) ) { sprintf(message_, "RtApiAsio: error loading driver (%s).", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } ASIOError result = ASIOInit( &driverInfo ); if ( result != ASE_OK ) { sprintf(message_, "RtApiAsio: error (%s) initializing driver (%s).", GetAsioErrorString(result), info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // Determine the device channel information. long inputChannels, outputChannels; result = ASIOGetChannels( &inputChannels, &outputChannels ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: error (%s) getting input/output channel count (%s).", GetAsioErrorString(result), info->name.c_str()); error(RtError::DEBUG_WARNING); return; } info->maxOutputChannels = outputChannels; if ( outputChannels > 0 ) info->minOutputChannels = 1; info->maxInputChannels = inputChannels; if ( inputChannels > 0 ) info->minInputChannels = 1; // If device opens for both playback and capture, we determine the channels. if (info->maxOutputChannels > 0 && info->maxInputChannels > 0) { info->hasDuplexSupport = true; info->maxDuplexChannels = (info->maxOutputChannels > info->maxInputChannels) ? info->maxInputChannels : info->maxOutputChannels; info->minDuplexChannels = (info->minOutputChannels > info->minInputChannels) ? info->minInputChannels : info->minOutputChannels; } // Determine the supported sample rates. info->sampleRates.clear(); for (unsigned int i=0; isampleRates.push_back( SAMPLE_RATES[i] ); } if (info->sampleRates.size() == 0) { drivers.removeCurrentDriver(); sprintf( message_, "RtApiAsio: No supported sample rates found for driver (%s).", info->name.c_str() ); error(RtError::DEBUG_WARNING); return; } // Determine supported data types ... just check first channel and assume rest are the same. ASIOChannelInfo channelInfo; channelInfo.channel = 0; channelInfo.isInput = true; if ( info->maxInputChannels <= 0 ) channelInfo.isInput = false; result = ASIOGetChannelInfo( &channelInfo ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: error (%s) getting driver (%s) channel information.", GetAsioErrorString(result), info->name.c_str()); error(RtError::DEBUG_WARNING); return; } if ( channelInfo.type == ASIOSTInt16MSB || channelInfo.type == ASIOSTInt16LSB ) info->nativeFormats |= RTAUDIO_SINT16; else if ( channelInfo.type == ASIOSTInt32MSB || channelInfo.type == ASIOSTInt32LSB ) info->nativeFormats |= RTAUDIO_SINT32; else if ( channelInfo.type == ASIOSTFloat32MSB || channelInfo.type == ASIOSTFloat32LSB ) info->nativeFormats |= RTAUDIO_FLOAT32; else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB ) info->nativeFormats |= RTAUDIO_FLOAT64; // Check that we have at least one supported format. if (info->nativeFormats == 0) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: driver (%s) data format not supported by RtAudio.", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } info->probed = true; drivers.removeCurrentDriver(); } void bufferSwitch(long index, ASIOBool processNow) { RtApiAsio *object = (RtApiAsio *) asioCallbackInfo->object; try { object->callbackEvent( index ); } catch (RtError &exception) { fprintf(stderr, "\nRtApiAsio: callback handler error (%s)!\n\n", exception.getMessageString()); return; } return; } void sampleRateChanged(ASIOSampleRate sRate) { // The ASIO documentation says that this usually only happens during // external sync. Audio processing is not stopped by the driver, // actual sample rate might not have even changed, maybe only the // sample rate status of an AES/EBU or S/PDIF digital input at the // audio device. RtAudio *object = (RtAudio *) asioCallbackInfo->object; try { object->stopStream(); } catch (RtError &exception) { fprintf(stderr, "\nRtApiAsio: sampleRateChanged() error (%s)!\n\n", exception.getMessageString()); return; } fprintf(stderr, "\nRtApiAsio: driver reports sample rate changed to %d ... stream stopped!!!", (int) sRate); } long asioMessages(long selector, long value, void* message, double* opt) { long ret = 0; switch(selector) { case kAsioSelectorSupported: if(value == kAsioResetRequest || value == kAsioEngineVersion || value == kAsioResyncRequest || value == kAsioLatenciesChanged // The following three were added for ASIO 2.0, you don't // necessarily have to support them. || value == kAsioSupportsTimeInfo || value == kAsioSupportsTimeCode || value == kAsioSupportsInputMonitor) ret = 1L; break; case kAsioResetRequest: // Defer the task and perform the reset of the driver during the // next "safe" situation. You cannot reset the driver right now, // as this code is called from the driver. Reset the driver is // done by completely destruct is. I.e. ASIOStop(), // ASIODisposeBuffers(), Destruction Afterwards you initialize the // driver again. fprintf(stderr, "\nRtApiAsio: driver reset requested!!!"); ret = 1L; break; case kAsioResyncRequest: // This informs the application that the driver encountered some // non-fatal data loss. It is used for synchronization purposes // of different media. Added mainly to work around the Win16Mutex // problems in Windows 95/98 with the Windows Multimedia system, // which could lose data because the Mutex was held too long by // another thread. However a driver can issue it in other // situations, too. fprintf(stderr, "\nRtApiAsio: driver resync requested!!!"); ret = 1L; break; case kAsioLatenciesChanged: // This will inform the host application that the drivers were // latencies changed. Beware, it this does not mean that the // buffer sizes have changed! You might need to update internal // delay data. fprintf(stderr, "\nRtApiAsio: driver latency may have changed!!!"); ret = 1L; break; case kAsioEngineVersion: // Return the supported ASIO version of the host application. If // a host application does not implement this selector, ASIO 1.0 // is assumed by the driver. ret = 2L; break; case kAsioSupportsTimeInfo: // Informs the driver whether the // asioCallbacks.bufferSwitchTimeInfo() callback is supported. // For compatibility with ASIO 1.0 drivers the host application // should always support the "old" bufferSwitch method, too. ret = 0; break; case kAsioSupportsTimeCode: // Informs the driver wether application is interested in time // code info. If an application does not need to know about time // code, the driver has less work to do. ret = 0; break; } return ret; } bool RtApiAsio :: probeDeviceOpen(int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers) { // For ASIO, a duplex stream MUST use the same driver. if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] != device ) { sprintf(message_, "RtApiAsio: duplex stream must use the same device for input and output."); error(RtError::WARNING); return FAILURE; } // Only load the driver once for duplex stream. ASIOError result; if ( mode != INPUT || stream_.mode != OUTPUT ) { if ( !drivers.loadDriver( (char *)devices_[device].name.c_str() ) ) { sprintf(message_, "RtApiAsio: error loading driver (%s).", devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } result = ASIOInit( &driverInfo ); if ( result != ASE_OK ) { sprintf(message_, "RtApiAsio: error (%s) initializing driver (%s).", GetAsioErrorString(result), devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } } // Check the device channel count. long inputChannels, outputChannels; result = ASIOGetChannels( &inputChannels, &outputChannels ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: error (%s) getting input/output channel count (%s).", GetAsioErrorString(result), devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } if ( ( mode == OUTPUT && channels > outputChannels) || ( mode == INPUT && channels > inputChannels) ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: driver (%s) does not support requested channel count (%d).", devices_[device].name.c_str(), channels); error(RtError::DEBUG_WARNING); return FAILURE; } stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; // Verify the sample rate is supported. result = ASIOCanSampleRate( (ASIOSampleRate) sampleRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: driver (%s) does not support requested sample rate (%d).", devices_[device].name.c_str(), sampleRate); error(RtError::DEBUG_WARNING); return FAILURE; } // Set the sample rate. result = ASIOSetSampleRate( (ASIOSampleRate) sampleRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: driver (%s) error setting sample rate (%d).", devices_[device].name.c_str(), sampleRate); error(RtError::DEBUG_WARNING); return FAILURE; } // Determine the driver data type. ASIOChannelInfo channelInfo; channelInfo.channel = 0; if ( mode == OUTPUT ) channelInfo.isInput = false; else channelInfo.isInput = true; result = ASIOGetChannelInfo( &channelInfo ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: driver (%s) error getting data format.", devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } // Assuming WINDOWS host is always little-endian. stream_.doByteSwap[mode] = false; stream_.userFormat = format; stream_.deviceFormat[mode] = 0; if ( channelInfo.type == ASIOSTInt16MSB || channelInfo.type == ASIOSTInt16LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT16; if ( channelInfo.type == ASIOSTInt16MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTInt32MSB || channelInfo.type == ASIOSTInt32LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT32; if ( channelInfo.type == ASIOSTInt32MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTFloat32MSB || channelInfo.type == ASIOSTFloat32LSB ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; if ( channelInfo.type == ASIOSTFloat32MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; if ( channelInfo.type == ASIOSTFloat64MSB ) stream_.doByteSwap[mode] = true; } if ( stream_.deviceFormat[mode] == 0 ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: driver (%s) data format not supported by RtAudio.", devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } // Set the buffer size. For a duplex stream, this will end up // setting the buffer size based on the input constraints, which // should be ok. long minSize, maxSize, preferSize, granularity; result = ASIOGetBufferSize( &minSize, &maxSize, &preferSize, &granularity ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: error (%s) on driver (%s) error getting buffer size.", GetAsioErrorString(result), devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } if ( *bufferSize < minSize ) *bufferSize = minSize; else if ( *bufferSize > maxSize ) *bufferSize = maxSize; else if ( granularity == -1 ) { // Make sure bufferSize is a power of two. double power = log10( (double) *bufferSize ) / log10( 2.0 ); *bufferSize = (int) pow( 2.0, floor(power+0.5) ); if ( *bufferSize < minSize ) *bufferSize = minSize; else if ( *bufferSize > maxSize ) *bufferSize = maxSize; else *bufferSize = preferSize; } else if (granularity != 0) { // to an even multiple of granularity, rounding up. *bufferSize = (*bufferSize + granularity-1)/granularity*granularity; } if ( mode == INPUT && stream_.mode == OUTPUT && stream_.bufferSize != *bufferSize ) std::cerr << "Possible input/output buffersize discrepancy!" << std::endl; stream_.bufferSize = *bufferSize; stream_.nBuffers = 2; // ASIO always uses deinterleaved channels. stream_.deInterleave[mode] = true; // Allocate, if necessary, our AsioHandle structure for the stream. AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( handle == 0 ) { handle = (AsioHandle *) calloc(1, sizeof(AsioHandle)); if ( handle == NULL ) { drivers.removeCurrentDriver(); sprintf(message_, "RtApiAsio: error allocating AsioHandle memory (%s).", devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } handle->bufferInfos = 0; // Create a manual-reset event. handle->condition = CreateEvent( NULL, // no security TRUE, // manual-reset FALSE, // non-signaled initially NULL ); // unnamed stream_.apiHandle = (void *) handle; } // Create the ASIO internal buffers. Since RtAudio sets up input // and output separately, we'll have to dispose of previously // created output buffers for a duplex stream. if ( mode == INPUT && stream_.mode == OUTPUT ) { ASIODisposeBuffers(); if ( handle->bufferInfos ) free( handle->bufferInfos ); } // Allocate, initialize, and save the bufferInfos in our stream callbackInfo structure. int i, nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; handle->bufferInfos = (ASIOBufferInfo *) malloc( nChannels * sizeof(ASIOBufferInfo) ); if (handle->bufferInfos == NULL) { sprintf(message_, "RtApiAsio: error allocating bufferInfo memory (%s).", devices_[device].name.c_str()); goto error; } ASIOBufferInfo *infos; infos = handle->bufferInfos; for ( i=0; iisInput = ASIOFalse; infos->channelNum = i; infos->buffers[0] = infos->buffers[1] = 0; } for ( i=0; iisInput = ASIOTrue; infos->channelNum = i; infos->buffers[0] = infos->buffers[1] = 0; } // Set up the ASIO callback structure and create the ASIO data buffers. asioCallbacks.bufferSwitch = &bufferSwitch; asioCallbacks.sampleRateDidChange = &sampleRateChanged; asioCallbacks.asioMessage = &asioMessages; asioCallbacks.bufferSwitchTimeInfo = NULL; result = ASIOCreateBuffers( handle->bufferInfos, nChannels, stream_.bufferSize, &asioCallbacks); if ( result != ASE_OK ) { sprintf(message_, "RtApiAsio: eror (%s) on driver (%s) error creating buffers.", GetAsioErrorString(result), devices_[device].name.c_str()); goto error; } // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.nUserChannels[mode] > 1 && stream_.deInterleave[mode]) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers if ( stream_.nUserChannels[0] != stream_.nUserChannels[1] ) { long buffer_bytes; if (stream_.nUserChannels[0] >= stream_.nUserChannels[1]) buffer_bytes = stream_.nUserChannels[0]; else buffer_bytes = stream_.nUserChannels[1]; buffer_bytes *= *bufferSize * formatBytes(stream_.userFormat); if (stream_.userBuffer) free(stream_.userBuffer); stream_.userBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.userBuffer == NULL) { sprintf(message_, "RtApiAsio: error (%s) allocating user buffer memory (%s).", GetAsioErrorString(result), devices_[device].name.c_str()); goto error; } } if ( stream_.doConvertBuffer[mode] ) { long buffer_bytes; bool makeBuffer = true; if ( mode == OUTPUT ) buffer_bytes = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); else { // mode == INPUT buffer_bytes = stream_.nDeviceChannels[1] * formatBytes(stream_.deviceFormat[1]); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { long bytes_out = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( buffer_bytes < bytes_out ) makeBuffer = false; } } if ( makeBuffer ) { buffer_bytes *= *bufferSize; if (stream_.deviceBuffer) free(stream_.deviceBuffer); stream_.deviceBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.deviceBuffer == NULL) { sprintf(message_, "RtApiAsio: error (%s) allocating device buffer memory (%s).", GetAsioErrorString(result), devices_[device].name.c_str()); goto error; } } } stream_.device[mode] = device; stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; stream_.sampleRate = sampleRate; asioCallbackInfo = &stream_.callbackInfo; stream_.callbackInfo.object = (void *) this; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if (mode == INPUT) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( mode == INPUT && stream_.deInterleave[1] ) { for (int k=0; kcondition ); if ( handle->bufferInfos ) free( handle->bufferInfos ); free( handle ); stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } error(RtError::DEBUG_WARNING); return FAILURE; } void RtApiAsio :: closeStream() { // We don't want an exception to be thrown here because this // function is called by our class destructor. So, do our own // streamId check. if ( stream_.mode == UNINITIALIZED ) { sprintf(message_, "RtApiAsio::closeStream(): no open stream to close!"); error(RtError::WARNING); return; } if (stream_.state == STREAM_RUNNING) ASIOStop(); ASIODisposeBuffers(); drivers.removeCurrentDriver(); AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( handle ) { CloseHandle( handle->condition ); if ( handle->bufferInfos ) free( handle->bufferInfos ); free( handle ); stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } if (stream_.deviceBuffer) { free(stream_.deviceBuffer); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; } void RtApiAsio :: setStreamCallback(RtAudioCallback callback, void *userData) { verifyStream(); if ( stream_.callbackInfo.usingCallback ) { sprintf(message_, "RtApiAsio: A callback is already set for this stream!"); error(RtError::WARNING); return; } stream_.callbackInfo.callback = (void *) callback; stream_.callbackInfo.userData = userData; stream_.callbackInfo.usingCallback = true; } void RtApiAsio :: cancelStreamCallback() { verifyStream(); if (stream_.callbackInfo.usingCallback) { if (stream_.state == STREAM_RUNNING) stopStream(); MUTEX_LOCK(&stream_.mutex); stream_.callbackInfo.usingCallback = false; stream_.callbackInfo.userData = NULL; stream_.state = STREAM_STOPPED; stream_.callbackInfo.callback = NULL; MUTEX_UNLOCK(&stream_.mutex); } } void RtApiAsio :: startStream() { verifyStream(); if (stream_.state == STREAM_RUNNING) return; MUTEX_LOCK(&stream_.mutex); ASIOError result = ASIOStart(); if ( result != ASE_OK ) { sprintf(message_, "RtApiAsio: error starting device (%s).", devices_[stream_.device[0]].name.c_str()); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } AsioHandle *handle = (AsioHandle *) stream_.apiHandle; handle->stopStream = false; stream_.state = STREAM_RUNNING; MUTEX_UNLOCK(&stream_.mutex); } void RtApiAsio :: stopStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK(&stream_.mutex); ASIOError result = ASIOStop(); if ( result != ASE_OK ) { sprintf(message_, "RtApiAsio: error stopping device (%s).", devices_[stream_.device[0]].name.c_str()); MUTEX_UNLOCK(&stream_.mutex); error(RtError::DRIVER_ERROR); } MUTEX_UNLOCK(&stream_.mutex); } void RtApiAsio :: abortStream() { stopStream(); } void RtApiAsio :: tickStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; if (stream_.callbackInfo.usingCallback) { sprintf(message_, "RtApiAsio: tickStream() should not be used when a callback function is set!"); error(RtError::WARNING); return; } AsioHandle *handle = (AsioHandle *) stream_.apiHandle; MUTEX_LOCK(&stream_.mutex); // Release the stream_mutex here and wait for the event // to become signaled by the callback process. MUTEX_UNLOCK(&stream_.mutex); WaitForMultipleObjects(1, &handle->condition, FALSE, INFINITE); ResetEvent( handle->condition ); } void RtApiAsio :: callbackEvent(long bufferIndex) { verifyStream(); if (stream_.state == STREAM_STOPPED) return; CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( info->usingCallback && handle->stopStream ) { // Check if the stream should be stopped (via the previous user // callback return value). We stop the stream here, rather than // after the function call, so that output data can first be // processed. this->stopStream(); return; } MUTEX_LOCK(&stream_.mutex); // Invoke user callback first, to get fresh output data. if ( info->usingCallback ) { RtAudioCallback callback = (RtAudioCallback) info->callback; if ( callback(stream_.userBuffer, stream_.bufferSize, info->userData) ) handle->stopStream = true; } int bufferBytes, j; int nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { bufferBytes = stream_.bufferSize * formatBytes(stream_.deviceFormat[0]); if (stream_.doConvertBuffer[0]) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer, stream_.convertInfo[0] ); if ( stream_.doByteSwap[0] ) byteSwapBuffer(stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[0], stream_.deviceFormat[0]); // Always de-interleave ASIO output data. j = 0; for ( int i=0; ibufferInfos[i].isInput != ASIOTrue ) memcpy(handle->bufferInfos[i].buffers[bufferIndex], &stream_.deviceBuffer[j++*bufferBytes], bufferBytes ); } } else { // single channel only if (stream_.doByteSwap[0]) byteSwapBuffer(stream_.userBuffer, stream_.bufferSize * stream_.nUserChannels[0], stream_.userFormat); for ( int i=0; ibufferInfos[i].isInput != ASIOTrue ) { memcpy(handle->bufferInfos[i].buffers[bufferIndex], stream_.userBuffer, bufferBytes ); break; } } } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { bufferBytes = stream_.bufferSize * formatBytes(stream_.deviceFormat[1]); if (stream_.doConvertBuffer[1]) { // Always interleave ASIO input data. j = 0; for ( int i=0; ibufferInfos[i].isInput == ASIOTrue ) memcpy(&stream_.deviceBuffer[j++*bufferBytes], handle->bufferInfos[i].buffers[bufferIndex], bufferBytes ); } if ( stream_.doByteSwap[1] ) byteSwapBuffer(stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[1], stream_.deviceFormat[1]); convertBuffer( stream_.userBuffer, stream_.deviceBuffer, stream_.convertInfo[1] ); } else { // single channel only for ( int i=0; ibufferInfos[i].isInput == ASIOTrue ) { memcpy(stream_.userBuffer, handle->bufferInfos[i].buffers[bufferIndex], bufferBytes ); break; } } if (stream_.doByteSwap[1]) byteSwapBuffer(stream_.userBuffer, stream_.bufferSize * stream_.nUserChannels[1], stream_.userFormat); } } if ( !info->usingCallback ) SetEvent( handle->condition ); // The following call was suggested by Malte Clasen. While the API // documentation indicates it should not be required, some device // drivers apparently do not function correctly without it. ASIOOutputReady(); MUTEX_UNLOCK(&stream_.mutex); } //******************** End of __WINDOWS_ASIO__ *********************// #endif #if defined(__WINDOWS_DS__) // Windows DirectSound API #include #include #define MINIMUM_DEVICE_BUFFER_SIZE 32768 #ifdef _MSC_VER // if Microsoft Visual C++ #pragma comment(lib,"winmm.lib") // then, auto-link winmm.lib. Otherwise, it has to be added manually. #endif static inline DWORD dsPointerDifference(DWORD laterPointer,DWORD earlierPointer,DWORD bufferSize) { if (laterPointer > earlierPointer) return laterPointer-earlierPointer; else return laterPointer-earlierPointer+bufferSize; } static inline DWORD dsPointerBetween(DWORD pointer, DWORD laterPointer,DWORD earlierPointer, DWORD bufferSize) { if (pointer > bufferSize) pointer -= bufferSize; if (laterPointer < earlierPointer) laterPointer += bufferSize; if (pointer < earlierPointer) pointer += bufferSize; return pointer >= earlierPointer && pointer < laterPointer; } #undef GENERATE_DEBUG_LOG // Define this to generate a debug timing log file in c:/rtaudiolog.txt" #ifdef GENERATE_DEBUG_LOG #include "mmsystem.h" #include "fstream" struct TTickRecord { DWORD currentReadPointer, safeReadPointer; DWORD currentWritePointer, safeWritePointer; DWORD readTime, writeTime; DWORD nextWritePointer, nextReadPointer; }; int currentDebugLogEntry = 0; std::vector debugLog(2000); #endif // A structure to hold various information related to the DirectSound // API implementation. struct DsHandle { void *object; void *buffer; UINT bufferPointer; DWORD dsBufferSize; DWORD dsPointerLeadTime; // the number of bytes ahead of the safe pointer to lead by. }; RtApiDs::RtDsStatistics RtApiDs::statistics; // Provides a backdoor hook to monitor for DirectSound read overruns and write underruns. RtApiDs::RtDsStatistics RtApiDs::getDsStatistics() { RtDsStatistics s = statistics; // update the calculated fields. if (s.inputFrameSize != 0) s.latency += s.readDeviceSafeLeadBytes*1.0/s.inputFrameSize / s.sampleRate; if (s.outputFrameSize != 0) s.latency += (s.writeDeviceSafeLeadBytes+ s.writeDeviceBufferLeadBytes)*1.0/s.outputFrameSize / s.sampleRate; return s; } // Declarations for utility functions, callbacks, and structures // specific to the DirectSound implementation. static bool CALLBACK deviceCountCallback(LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext); static bool CALLBACK deviceInfoCallback(LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext); static bool CALLBACK defaultDeviceCallback(LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext); static bool CALLBACK deviceIdCallback(LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext); static char* getErrorString(int code); extern "C" unsigned __stdcall callbackHandler(void *ptr); struct enum_info { std::string name; LPGUID id; bool isInput; bool isValid; }; RtApiDs :: RtApiDs() { // Dsound will run both-threaded. If CoInitialize fails, then just // accept whatever the mainline chose for a threading model. coInitialized = false; HRESULT hr = CoInitialize(NULL); if ( !FAILED(hr) ) coInitialized = true; this->initialize(); if (nDevices_ <= 0) { sprintf(message_, "RtApiDs: no Windows DirectSound audio devices found!"); error(RtError::NO_DEVICES_FOUND); } } RtApiDs :: ~RtApiDs() { if (coInitialized) CoUninitialize(); // balanced call. if ( stream_.mode != UNINITIALIZED ) closeStream(); } int RtApiDs :: getDefaultInputDevice(void) { enum_info info; // Enumerate through devices to find the default output. HRESULT result = DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)defaultDeviceCallback, &info); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Error performing default input device enumeration: %s.", getErrorString(result)); error(RtError::WARNING); return 0; } for ( int i=0; i info(count); for (i=0; iname; dsinfo.isValid = false; // Enumerate through input devices to find the id (if it exists). HRESULT result = DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)deviceIdCallback, &dsinfo); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Error performing input device id enumeration: %s.", getErrorString(result)); error(RtError::DEBUG_WARNING); return; } // Do capture probe first. if ( dsinfo.isValid == false ) goto playback_probe; LPDIRECTSOUNDCAPTURE input; result = DirectSoundCaptureCreate( dsinfo.id, &input, NULL ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Could not create capture object (%s): %s.", info->name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); goto playback_probe; } DSCCAPS in_caps; in_caps.dwSize = sizeof(in_caps); result = input->GetCaps( &in_caps ); if ( FAILED(result) ) { input->Release(); sprintf(message_, "RtApiDs: Could not get capture capabilities (%s): %s.", info->name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); goto playback_probe; } // Get input channel information. info->minInputChannels = 1; info->maxInputChannels = in_caps.dwChannels; // Get sample rate and format information. info->sampleRates.clear(); if( in_caps.dwChannels == 2 ) { if( in_caps.dwFormats & WAVE_FORMAT_1S16 ) info->nativeFormats |= RTAUDIO_SINT16; if( in_caps.dwFormats & WAVE_FORMAT_2S16 ) info->nativeFormats |= RTAUDIO_SINT16; if( in_caps.dwFormats & WAVE_FORMAT_4S16 ) info->nativeFormats |= RTAUDIO_SINT16; if( in_caps.dwFormats & WAVE_FORMAT_1S08 ) info->nativeFormats |= RTAUDIO_SINT8; if( in_caps.dwFormats & WAVE_FORMAT_2S08 ) info->nativeFormats |= RTAUDIO_SINT8; if( in_caps.dwFormats & WAVE_FORMAT_4S08 ) info->nativeFormats |= RTAUDIO_SINT8; if ( info->nativeFormats & RTAUDIO_SINT16 ) { if( in_caps.dwFormats & WAVE_FORMAT_1S16 ) info->sampleRates.push_back( 11025 ); if( in_caps.dwFormats & WAVE_FORMAT_2S16 ) info->sampleRates.push_back( 22050 ); if( in_caps.dwFormats & WAVE_FORMAT_4S16 ) info->sampleRates.push_back( 44100 ); } else if ( info->nativeFormats & RTAUDIO_SINT8 ) { if( in_caps.dwFormats & WAVE_FORMAT_1S08 ) info->sampleRates.push_back( 11025 ); if( in_caps.dwFormats & WAVE_FORMAT_2S08 ) info->sampleRates.push_back( 22050 ); if( in_caps.dwFormats & WAVE_FORMAT_4S08 ) info->sampleRates.push_back( 44100 ); } } else if ( in_caps.dwChannels == 1 ) { if( in_caps.dwFormats & WAVE_FORMAT_1M16 ) info->nativeFormats |= RTAUDIO_SINT16; if( in_caps.dwFormats & WAVE_FORMAT_2M16 ) info->nativeFormats |= RTAUDIO_SINT16; if( in_caps.dwFormats & WAVE_FORMAT_4M16 ) info->nativeFormats |= RTAUDIO_SINT16; if( in_caps.dwFormats & WAVE_FORMAT_1M08 ) info->nativeFormats |= RTAUDIO_SINT8; if( in_caps.dwFormats & WAVE_FORMAT_2M08 ) info->nativeFormats |= RTAUDIO_SINT8; if( in_caps.dwFormats & WAVE_FORMAT_4M08 ) info->nativeFormats |= RTAUDIO_SINT8; if ( info->nativeFormats & RTAUDIO_SINT16 ) { if( in_caps.dwFormats & WAVE_FORMAT_1M16 ) info->sampleRates.push_back( 11025 ); if( in_caps.dwFormats & WAVE_FORMAT_2M16 ) info->sampleRates.push_back( 22050 ); if( in_caps.dwFormats & WAVE_FORMAT_4M16 ) info->sampleRates.push_back( 44100 ); } else if ( info->nativeFormats & RTAUDIO_SINT8 ) { if( in_caps.dwFormats & WAVE_FORMAT_1M08 ) info->sampleRates.push_back( 11025 ); if( in_caps.dwFormats & WAVE_FORMAT_2M08 ) info->sampleRates.push_back( 22050 ); if( in_caps.dwFormats & WAVE_FORMAT_4M08 ) info->sampleRates.push_back( 44100 ); } } else info->minInputChannels = 0; // technically, this would be an error input->Release(); playback_probe: dsinfo.isValid = false; // Enumerate through output devices to find the id (if it exists). result = DirectSoundEnumerate((LPDSENUMCALLBACK)deviceIdCallback, &dsinfo); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Error performing output device id enumeration: %s.", getErrorString(result)); error(RtError::DEBUG_WARNING); return; } // Now do playback probe. if ( dsinfo.isValid == false ) goto check_parameters; LPDIRECTSOUND output; DSCAPS out_caps; result = DirectSoundCreate( dsinfo.id, &output, NULL ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Could not create playback object (%s): %s.", info->name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); goto check_parameters; } out_caps.dwSize = sizeof(out_caps); result = output->GetCaps( &out_caps ); if ( FAILED(result) ) { output->Release(); sprintf(message_, "RtApiDs: Could not get playback capabilities (%s): %s.", info->name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); goto check_parameters; } // Get output channel information. info->minOutputChannels = 1; info->maxOutputChannels = ( out_caps.dwFlags & DSCAPS_PRIMARYSTEREO ) ? 2 : 1; // Get sample rate information. Use capture device rate information // if it exists. if ( info->sampleRates.size() == 0 ) { info->sampleRates.push_back( (int) out_caps.dwMinSecondarySampleRate ); if ( out_caps.dwMaxSecondarySampleRate > out_caps.dwMinSecondarySampleRate ) info->sampleRates.push_back( (int) out_caps.dwMaxSecondarySampleRate ); } else { // Check input rates against output rate range. If there's an // inconsistency (such as a duplex-capable device which reports a // single output rate of 48000 Hz), we'll go with the output // rate(s) since the DirectSoundCapture API is stupid and broken. // Note that the probed sample rate values are NOT used when // opening the device. Thanks to Tue Andersen for reporting this. if ( info->sampleRates.back() < (int) out_caps.dwMinSecondarySampleRate ) { info->sampleRates.clear(); info->sampleRates.push_back( (int) out_caps.dwMinSecondarySampleRate ); if ( out_caps.dwMaxSecondarySampleRate > out_caps.dwMinSecondarySampleRate ) info->sampleRates.push_back( (int) out_caps.dwMaxSecondarySampleRate ); } else { for ( int i=info->sampleRates.size()-1; i>=0; i-- ) { if ( (unsigned int) info->sampleRates[i] > out_caps.dwMaxSecondarySampleRate ) info->sampleRates.erase( info->sampleRates.begin() + i ); } while ( info->sampleRates.size() > 0 && ((unsigned int) info->sampleRates[0] < out_caps.dwMinSecondarySampleRate) ) { info->sampleRates.erase( info->sampleRates.begin() ); } } } // Get format information. if ( out_caps.dwFlags & DSCAPS_PRIMARY16BIT ) info->nativeFormats |= RTAUDIO_SINT16; if ( out_caps.dwFlags & DSCAPS_PRIMARY8BIT ) info->nativeFormats |= RTAUDIO_SINT8; output->Release(); check_parameters: if ( info->maxInputChannels == 0 && info->maxOutputChannels == 0 ) { sprintf(message_, "RtApiDs: no reported input or output channels for device (%s).", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } if ( info->sampleRates.size() == 0 || info->nativeFormats == 0 ) { sprintf(message_, "RtApiDs: no reported sample rates or data formats for device (%s).", info->name.c_str()); error(RtError::DEBUG_WARNING); return; } // Determine duplex status. if (info->maxInputChannels < info->maxOutputChannels) info->maxDuplexChannels = info->maxInputChannels; else info->maxDuplexChannels = info->maxOutputChannels; if (info->minInputChannels < info->minOutputChannels) info->minDuplexChannels = info->minInputChannels; else info->minDuplexChannels = info->minOutputChannels; if ( info->maxDuplexChannels > 0 ) info->hasDuplexSupport = true; else info->hasDuplexSupport = false; info->probed = true; return; } bool RtApiDs :: probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers) { HRESULT result; HWND hWnd = GetForegroundWindow(); // According to a note in PortAudio, using GetDesktopWindow() // instead of GetForegroundWindow() is supposed to avoid problems // that occur when the application's window is not the foreground // window. Also, if the application window closes before the // DirectSound buffer, DirectSound can crash. However, for console // applications, no sound was produced when using GetDesktopWindow(). long buffer_size; LPVOID audioPtr; DWORD dataLen; int nBuffers; // Check the numberOfBuffers parameter and limit the lowest value to // two. This is a judgement call and a value of two is probably too // low for capture, but it should work for playback. if (numberOfBuffers < 2) nBuffers = 2; else nBuffers = numberOfBuffers; // Define the wave format structure (16-bit PCM, srate, channels) WAVEFORMATEX waveFormat; ZeroMemory(&waveFormat, sizeof(WAVEFORMATEX)); waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.nChannels = channels; waveFormat.nSamplesPerSec = (unsigned long) sampleRate; // Determine the data format. if ( devices_[device].nativeFormats ) { // 8-bit and/or 16-bit support if ( format == RTAUDIO_SINT8 ) { if ( devices_[device].nativeFormats & RTAUDIO_SINT8 ) waveFormat.wBitsPerSample = 8; else waveFormat.wBitsPerSample = 16; } else { if ( devices_[device].nativeFormats & RTAUDIO_SINT16 ) waveFormat.wBitsPerSample = 16; else waveFormat.wBitsPerSample = 8; } } else { sprintf(message_, "RtApiDs: no reported data formats for device (%s).", devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; // Determine the device buffer size. By default, 32k, but we will // grow it to make allowances for very large software buffer sizes. DWORD dsBufferSize = 0; DWORD dsPointerLeadTime = 0; buffer_size = MINIMUM_DEVICE_BUFFER_SIZE; // sound cards will always *knock wood* support this enum_info dsinfo; void *ohandle = 0, *bhandle = 0; // strncpy( dsinfo.name, devices_[device].name.c_str(), 64 ); dsinfo.name = devices_[device].name; dsinfo.isValid = false; if ( mode == OUTPUT ) { dsPointerLeadTime = numberOfBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; // If the user wants an even bigger buffer, increase the device buffer size accordingly. while ( dsPointerLeadTime * 2U > (DWORD)buffer_size ) buffer_size *= 2; if ( devices_[device].maxOutputChannels < channels ) { sprintf(message_, "RtApiDs: requested channels (%d) > than supported (%d) by device (%s).", channels, devices_[device].maxOutputChannels, devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } // Enumerate through output devices to find the id (if it exists). result = DirectSoundEnumerate((LPDSENUMCALLBACK)deviceIdCallback, &dsinfo); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Error performing output device id enumeration: %s.", getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } if ( dsinfo.isValid == false ) { sprintf(message_, "RtApiDs: output device (%s) id not found!", devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } LPGUID id = dsinfo.id; LPDIRECTSOUND object; LPDIRECTSOUNDBUFFER buffer; DSBUFFERDESC bufferDescription; result = DirectSoundCreate( id, &object, NULL ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Could not create playback object (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } // Set cooperative level to DSSCL_EXCLUSIVE result = object->SetCooperativeLevel(hWnd, DSSCL_EXCLUSIVE); if ( FAILED(result) ) { object->Release(); sprintf(message_, "RtApiDs: Unable to set cooperative level (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } // Even though we will write to the secondary buffer, we need to // access the primary buffer to set the correct output format // (since the default is 8-bit, 22 kHz!). Setup the DS primary // buffer description. ZeroMemory(&bufferDescription, sizeof(DSBUFFERDESC)); bufferDescription.dwSize = sizeof(DSBUFFERDESC); bufferDescription.dwFlags = DSBCAPS_PRIMARYBUFFER; // Obtain the primary buffer result = object->CreateSoundBuffer(&bufferDescription, &buffer, NULL); if ( FAILED(result) ) { object->Release(); sprintf(message_, "RtApiDs: Unable to access primary buffer (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } // Set the primary DS buffer sound format. result = buffer->SetFormat(&waveFormat); if ( FAILED(result) ) { object->Release(); sprintf(message_, "RtApiDs: Unable to set primary buffer format (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } // Setup the secondary DS buffer description. dsBufferSize = (DWORD)buffer_size; ZeroMemory(&bufferDescription, sizeof(DSBUFFERDESC)); bufferDescription.dwSize = sizeof(DSBUFFERDESC); bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE ); // Force hardware mixing bufferDescription.dwBufferBytes = buffer_size; bufferDescription.lpwfxFormat = &waveFormat; // Try to create the secondary DS buffer. If that doesn't work, // try to use software mixing. Otherwise, there's a problem. result = object->CreateSoundBuffer(&bufferDescription, &buffer, NULL); if ( FAILED(result) ) { bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCSOFTWARE ); // Force software mixing result = object->CreateSoundBuffer(&bufferDescription, &buffer, NULL); if ( FAILED(result) ) { object->Release(); sprintf(message_, "RtApiDs: Unable to create secondary DS buffer (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } } // Get the buffer size ... might be different from what we specified. DSBCAPS dsbcaps; dsbcaps.dwSize = sizeof(DSBCAPS); buffer->GetCaps(&dsbcaps); buffer_size = dsbcaps.dwBufferBytes; // Lock the DS buffer result = buffer->Lock(0, buffer_size, &audioPtr, &dataLen, NULL, NULL, 0); if ( FAILED(result) ) { object->Release(); buffer->Release(); sprintf(message_, "RtApiDs: Unable to lock buffer (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } // Zero the DS buffer ZeroMemory(audioPtr, dataLen); // Unlock the DS buffer result = buffer->Unlock(audioPtr, dataLen, NULL, 0); if ( FAILED(result) ) { object->Release(); buffer->Release(); sprintf(message_, "RtApiDs: Unable to unlock buffer(%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } ohandle = (void *) object; bhandle = (void *) buffer; stream_.nDeviceChannels[0] = channels; } if ( mode == INPUT ) { if ( devices_[device].maxInputChannels < channels ) { sprintf(message_, "RtAudioDS: device (%s) does not support %d channels.", devices_[device].name.c_str(), channels); error(RtError::DEBUG_WARNING); return FAILURE; } // Enumerate through input devices to find the id (if it exists). result = DirectSoundCaptureEnumerate((LPDSENUMCALLBACK)deviceIdCallback, &dsinfo); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Error performing input device id enumeration: %s.", getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } if ( dsinfo.isValid == false ) { sprintf(message_, "RtAudioDS: input device (%s) id not found!", devices_[device].name.c_str()); error(RtError::DEBUG_WARNING); return FAILURE; } LPGUID id = dsinfo.id; LPDIRECTSOUNDCAPTURE object; LPDIRECTSOUNDCAPTUREBUFFER buffer; DSCBUFFERDESC bufferDescription; result = DirectSoundCaptureCreate( id, &object, NULL ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Could not create capture object (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } // Setup the secondary DS buffer description. dsBufferSize = buffer_size; ZeroMemory(&bufferDescription, sizeof(DSCBUFFERDESC)); bufferDescription.dwSize = sizeof(DSCBUFFERDESC); bufferDescription.dwFlags = 0; bufferDescription.dwReserved = 0; bufferDescription.dwBufferBytes = buffer_size; bufferDescription.lpwfxFormat = &waveFormat; // Create the capture buffer. result = object->CreateCaptureBuffer(&bufferDescription, &buffer, NULL); if ( FAILED(result) ) { object->Release(); sprintf(message_, "RtApiDs: Unable to create capture buffer (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } // Lock the capture buffer result = buffer->Lock(0, buffer_size, &audioPtr, &dataLen, NULL, NULL, 0); if ( FAILED(result) ) { object->Release(); buffer->Release(); sprintf(message_, "RtApiDs: Unable to lock capture buffer (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } // Zero the buffer ZeroMemory(audioPtr, dataLen); // Unlock the buffer result = buffer->Unlock(audioPtr, dataLen, NULL, 0); if ( FAILED(result) ) { object->Release(); buffer->Release(); sprintf(message_, "RtApiDs: Unable to unlock capture buffer (%s): %s.", devices_[device].name.c_str(), getErrorString(result)); error(RtError::DEBUG_WARNING); return FAILURE; } ohandle = (void *) object; bhandle = (void *) buffer; stream_.nDeviceChannels[1] = channels; } stream_.userFormat = format; if ( waveFormat.wBitsPerSample == 8 ) stream_.deviceFormat[mode] = RTAUDIO_SINT8; else stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.nUserChannels[mode] = channels; stream_.bufferSize = *bufferSize; // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode]) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers if ( stream_.nUserChannels[0] != stream_.nUserChannels[1] ) { long buffer_bytes; if (stream_.nUserChannels[0] >= stream_.nUserChannels[1]) buffer_bytes = stream_.nUserChannels[0]; else buffer_bytes = stream_.nUserChannels[1]; buffer_bytes *= *bufferSize * formatBytes(stream_.userFormat); if (stream_.userBuffer) free(stream_.userBuffer); stream_.userBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.userBuffer == NULL) { sprintf(message_, "RtApiDs: error allocating user buffer memory (%s).", devices_[device].name.c_str()); goto error; } } if ( stream_.doConvertBuffer[mode] ) { long buffer_bytes; bool makeBuffer = true; if ( mode == OUTPUT ) buffer_bytes = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); else { // mode == INPUT buffer_bytes = stream_.nDeviceChannels[1] * formatBytes(stream_.deviceFormat[1]); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { long bytes_out = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( buffer_bytes < bytes_out ) makeBuffer = false; } } if ( makeBuffer ) { buffer_bytes *= *bufferSize; if (stream_.deviceBuffer) free(stream_.deviceBuffer); stream_.deviceBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.deviceBuffer == NULL) { sprintf(message_, "RtApiDs: error allocating device buffer memory (%s).", devices_[device].name.c_str()); goto error; } } } // Allocate our DsHandle structures for the stream. DsHandle *handles; if ( stream_.apiHandle == 0 ) { handles = (DsHandle *) calloc(2, sizeof(DsHandle)); if ( handles == NULL ) { sprintf(message_, "RtApiDs: Error allocating DsHandle memory (%s).", devices_[device].name.c_str()); goto error; } handles[0].object = 0; handles[1].object = 0; stream_.apiHandle = (void *) handles; } else handles = (DsHandle *) stream_.apiHandle; handles[mode].object = ohandle; handles[mode].buffer = bhandle; handles[mode].dsBufferSize = dsBufferSize; handles[mode].dsPointerLeadTime = dsPointerLeadTime; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; stream_.nBuffers = nBuffers; stream_.sampleRate = sampleRate; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if (mode == INPUT) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( mode == INPUT && stream_.deInterleave[1] ) { for (int k=0; kRelease(); object->Release(); } if (handles[1].object) { LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handles[1].object; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handles[1].buffer; if (buffer) buffer->Release(); object->Release(); } free(handles); stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } error(RtError::DEBUG_WARNING); return FAILURE; } void RtApiDs :: setStreamCallback(RtAudioCallback callback, void *userData) { verifyStream(); CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; if ( info->usingCallback ) { sprintf(message_, "RtApiDs: A callback is already set for this stream!"); error(RtError::WARNING); return; } info->callback = (void *) callback; info->userData = userData; info->usingCallback = true; info->object = (void *) this; unsigned thread_id; info->thread = _beginthreadex(NULL, 0, &callbackHandler, &stream_.callbackInfo, 0, &thread_id); if (info->thread == 0) { info->usingCallback = false; sprintf(message_, "RtApiDs: error starting callback thread!"); error(RtError::THREAD_ERROR); } // When spawning multiple threads in quick succession, it appears to be // necessary to wait a bit for each to initialize ... another windoism! Sleep(1); } void RtApiDs :: cancelStreamCallback() { verifyStream(); if (stream_.callbackInfo.usingCallback) { if (stream_.state == STREAM_RUNNING) stopStream(); MUTEX_LOCK(&stream_.mutex); stream_.callbackInfo.usingCallback = false; WaitForSingleObject( (HANDLE)stream_.callbackInfo.thread, INFINITE ); CloseHandle( (HANDLE)stream_.callbackInfo.thread ); stream_.callbackInfo.thread = 0; stream_.callbackInfo.callback = NULL; stream_.callbackInfo.userData = NULL; MUTEX_UNLOCK(&stream_.mutex); } } void RtApiDs :: closeStream() { // We don't want an exception to be thrown here because this // function is called by our class destructor. So, do our own // streamId check. if ( stream_.mode == UNINITIALIZED ) { sprintf(message_, "RtApiDs::closeStream(): no open stream to close!"); error(RtError::WARNING); return; } if (stream_.callbackInfo.usingCallback) { stream_.callbackInfo.usingCallback = false; WaitForSingleObject( (HANDLE)stream_.callbackInfo.thread, INFINITE ); CloseHandle( (HANDLE)stream_.callbackInfo.thread ); } DsHandle *handles = (DsHandle *) stream_.apiHandle; if (handles) { if (handles[0].object) { LPDIRECTSOUND object = (LPDIRECTSOUND) handles[0].object; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handles[0].buffer; if (buffer) { buffer->Stop(); buffer->Release(); } object->Release(); } if (handles[1].object) { LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handles[1].object; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handles[1].buffer; if (buffer) { buffer->Stop(); buffer->Release(); } object->Release(); } free(handles); stream_.apiHandle = 0; } if (stream_.userBuffer) { free(stream_.userBuffer); stream_.userBuffer = 0; } if (stream_.deviceBuffer) { free(stream_.deviceBuffer); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; } void RtApiDs :: startStream() { verifyStream(); if (stream_.state == STREAM_RUNNING) return; // Increase scheduler frequency on lesser windows (a side-effect of // increasing timer accuracy). On greater windows (Win2K or later), // this is already in effect. MUTEX_LOCK(&stream_.mutex); DsHandle *handles = (DsHandle *) stream_.apiHandle; timeBeginPeriod(1); memset(&statistics,0,sizeof(statistics)); statistics.sampleRate = stream_.sampleRate; statistics.writeDeviceBufferLeadBytes = handles[0].dsPointerLeadTime ; buffersRolling = false; duplexPrerollBytes = 0; if (stream_.mode == DUPLEX) { // 0.5 seconds of silence in DUPLEX mode while the devices spin up and synchronize. duplexPrerollBytes = (int)(0.5*stream_.sampleRate*formatBytes( stream_.deviceFormat[1])*stream_.nDeviceChannels[1]); } #ifdef GENERATE_DEBUG_LOG currentDebugLogEntry = 0; #endif HRESULT result; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { statistics.outputFrameSize = formatBytes( stream_.deviceFormat[0]) *stream_.nDeviceChannels[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handles[0].buffer; result = buffer->Play( 0, 0, DSBPLAY_LOOPING ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to start buffer (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } } if (stream_.mode == INPUT || stream_.mode == DUPLEX) { statistics.inputFrameSize = formatBytes( stream_.deviceFormat[1]) *stream_.nDeviceChannels[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handles[1].buffer; result = buffer->Start(DSCBSTART_LOOPING ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to start capture buffer (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } } stream_.state = STREAM_RUNNING; MUTEX_UNLOCK(&stream_.mutex); } void RtApiDs :: stopStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK(&stream_.mutex); timeEndPeriod(1); // revert to normal scheduler frequency on lesser windows. #ifdef GENERATE_DEBUG_LOG // Write the timing log to a .TSV file for analysis in Excel. unlink("c:/rtaudiolog.txt"); std::ofstream os("c:/rtaudiolog.txt"); os << "writeTime\treadDelay\tnextWritePointer\tnextReadPointer\tcurrentWritePointer\tsafeWritePointer\tcurrentReadPointer\tsafeReadPointer" << std::endl; for (int i = 0; i < currentDebugLogEntry ; ++i) { TTickRecord &r = debugLog[i]; os << r.writeTime-debugLog[0].writeTime << "\t" << (r.readTime-r.writeTime) << "\t" << r.nextWritePointer % BUFFER_SIZE << "\t" << r.nextReadPointer % BUFFER_SIZE << "\t" << r.currentWritePointer % BUFFER_SIZE << "\t" << r.safeWritePointer % BUFFER_SIZE << "\t" << r.currentReadPointer % BUFFER_SIZE << "\t" << r.safeReadPointer % BUFFER_SIZE << std::endl; } #endif // There is no specific DirectSound API call to "drain" a buffer // before stopping. We can hack this for playback by writing // buffers of zeroes over the entire buffer. For capture, the // concept is less clear so we'll repeat what we do in the // abortStream() case. HRESULT result; DWORD dsBufferSize; LPVOID buffer1 = NULL; LPVOID buffer2 = NULL; DWORD bufferSize1 = 0; DWORD bufferSize2 = 0; DsHandle *handles = (DsHandle *) stream_.apiHandle; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { DWORD currentPos, safePos; long buffer_bytes = stream_.bufferSize * stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); LPDIRECTSOUNDBUFFER dsBuffer = (LPDIRECTSOUNDBUFFER) handles[0].buffer; DWORD nextWritePos = handles[0].bufferPointer; dsBufferSize = handles[0].dsBufferSize; DWORD dsBytesWritten = 0; // Write zeroes for at least dsBufferSize bytes. while ( dsBytesWritten < dsBufferSize ) { // Find out where the read and "safe write" pointers are. result = dsBuffer->GetCurrentPosition( ¤tPos, &safePos ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current position (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // Chase nextWritePosition. if ( currentPos < nextWritePos ) currentPos += dsBufferSize; // unwrap offset DWORD endWrite = nextWritePos + buffer_bytes; // Check whether the entire write region is behind the play pointer. while ( currentPos < endWrite ) { double millis = (endWrite - currentPos) * 900.0; millis /= ( formatBytes(stream_.deviceFormat[0]) * stream_.nDeviceChannels[0] *stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; Sleep( (DWORD) millis ); // Wake up, find out where we are now result = dsBuffer->GetCurrentPosition( ¤tPos, &safePos ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current position (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } if ( currentPos < (DWORD)nextWritePos ) currentPos += dsBufferSize; // unwrap offset } // Lock free space in the buffer result = dsBuffer->Lock( nextWritePos, buffer_bytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to lock buffer during playback (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // Zero the free space ZeroMemory( buffer1, bufferSize1 ); if (buffer2 != NULL) ZeroMemory( buffer2, bufferSize2 ); // Update our buffer offset and unlock sound buffer dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to unlock buffer during playback (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } nextWritePos = (nextWritePos + bufferSize1 + bufferSize2) % dsBufferSize; handles[0].bufferPointer = nextWritePos; dsBytesWritten += buffer_bytes; } // OK, now stop the buffer. result = dsBuffer->Stop(); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to stop buffer (%s): %s", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // If we play again, start at the beginning of the buffer. handles[0].bufferPointer = 0; } if (stream_.mode == INPUT || stream_.mode == DUPLEX) { LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handles[1].buffer; buffer1 = NULL; bufferSize1 = 0; result = buffer->Stop(); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to stop capture buffer (%s): %s", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } dsBufferSize = handles[1].dsBufferSize; // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock(0, dsBufferSize, &buffer1, &bufferSize1, NULL, NULL, 0); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to lock capture buffer (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // Zero the DS buffer ZeroMemory(buffer1, bufferSize1); // Unlock the DS buffer result = buffer->Unlock(buffer1, bufferSize1, NULL, 0); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to unlock capture buffer (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // If we start recording again, we must begin at beginning of buffer. handles[1].bufferPointer = 0; } MUTEX_UNLOCK(&stream_.mutex); } void RtApiDs :: abortStream() { verifyStream(); if (stream_.state == STREAM_STOPPED) return; // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK(&stream_.mutex); timeEndPeriod(1); // revert to normal scheduler frequency on lesser windows. HRESULT result; long dsBufferSize; LPVOID audioPtr; DWORD dataLen; DsHandle *handles = (DsHandle *) stream_.apiHandle; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handles[0].buffer; result = buffer->Stop(); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to stop buffer (%s): %s", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } dsBufferSize = handles[0].dsBufferSize; // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock(0, dsBufferSize, &audioPtr, &dataLen, NULL, NULL, 0); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to lock buffer (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // Zero the DS buffer ZeroMemory(audioPtr, dataLen); // Unlock the DS buffer result = buffer->Unlock(audioPtr, dataLen, NULL, 0); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to unlock buffer (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // If we start playing again, we must begin at beginning of buffer. handles[0].bufferPointer = 0; } if (stream_.mode == INPUT || stream_.mode == DUPLEX) { LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handles[1].buffer; audioPtr = NULL; dataLen = 0; result = buffer->Stop(); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to stop capture buffer (%s): %s", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } dsBufferSize = handles[1].dsBufferSize; // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock(0, dsBufferSize, &audioPtr, &dataLen, NULL, NULL, 0); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to lock capture buffer (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // Zero the DS buffer ZeroMemory(audioPtr, dataLen); // Unlock the DS buffer result = buffer->Unlock(audioPtr, dataLen, NULL, 0); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to unlock capture buffer (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // If we start recording again, we must begin at beginning of buffer. handles[1].bufferPointer = 0; } MUTEX_UNLOCK(&stream_.mutex); } int RtApiDs :: streamWillBlock() { verifyStream(); if (stream_.state == STREAM_STOPPED) return 0; MUTEX_LOCK(&stream_.mutex); int channels; int frames = 0; HRESULT result; DWORD currentPos, safePos; channels = 1; DsHandle *handles = (DsHandle *) stream_.apiHandle; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { LPDIRECTSOUNDBUFFER dsBuffer = (LPDIRECTSOUNDBUFFER) handles[0].buffer; UINT nextWritePos = handles[0].bufferPointer; channels = stream_.nDeviceChannels[0]; DWORD dsBufferSize = handles[0].dsBufferSize; // Find out where the read and "safe write" pointers are. result = dsBuffer->GetCurrentPosition(¤tPos, &safePos); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current position (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } DWORD leadPos = safePos + handles[0].dsPointerLeadTime; if (leadPos > dsBufferSize) { leadPos -= dsBufferSize; } if ( leadPos < nextWritePos ) leadPos += dsBufferSize; // unwrap offset frames = (leadPos - nextWritePos); frames /= channels * formatBytes(stream_.deviceFormat[0]); } if (stream_.mode == INPUT ) { // note that we don't block on DUPLEX input anymore. We run lockstep with the write pointer instead. LPDIRECTSOUNDCAPTUREBUFFER dsBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handles[1].buffer; UINT nextReadPos = handles[1].bufferPointer; channels = stream_.nDeviceChannels[1]; DWORD dsBufferSize = handles[1].dsBufferSize; // Find out where the write and "safe read" pointers are. result = dsBuffer->GetCurrentPosition(¤tPos, &safePos); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current capture position (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } if ( safePos < (DWORD)nextReadPos ) safePos += dsBufferSize; // unwrap offset frames = (int)(safePos - nextReadPos); frames /= channels * formatBytes(stream_.deviceFormat[1]); } frames = stream_.bufferSize - frames; if (frames < 0) frames = 0; MUTEX_UNLOCK(&stream_.mutex); return frames; } void RtApiDs :: tickStream() { verifyStream(); int stopStream = 0; if (stream_.state == STREAM_STOPPED) { if (stream_.callbackInfo.usingCallback) Sleep(50); // sleep 50 milliseconds return; } else if (stream_.callbackInfo.usingCallback) { RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; stopStream = callback(stream_.userBuffer, stream_.bufferSize, stream_.callbackInfo.userData); } MUTEX_LOCK(&stream_.mutex); // The state might change while waiting on a mutex. if (stream_.state == STREAM_STOPPED) { MUTEX_UNLOCK(&stream_.mutex); return; } HRESULT result; DWORD currentWritePos, safeWritePos; DWORD currentReadPos, safeReadPos; DWORD leadPos; UINT nextWritePos; #ifdef GENERATE_DEBUG_LOG DWORD writeTime, readTime; #endif LPVOID buffer1 = NULL; LPVOID buffer2 = NULL; DWORD bufferSize1 = 0; DWORD bufferSize2 = 0; char *buffer; long buffer_bytes; DsHandle *handles = (DsHandle *) stream_.apiHandle; if (stream_.mode == DUPLEX && !buffersRolling) { assert(handles[0].dsBufferSize == handles[1].dsBufferSize); // It takes a while for the devices to get rolling. As a result, // there's no guarantee that the capture and write device pointers // will move in lockstep. Wait here for both devices to start // rolling, and then set our buffer pointers accordingly. // e.g. Crystal Drivers: the capture buffer starts up 5700 to 9600 // bytes later than the write buffer. // Stub: a serious risk of having a pre-emptive scheduling round // take place between the two GetCurrentPosition calls... but I'm // really not sure how to solve the problem. Temporarily boost to // Realtime priority, maybe; but I'm not sure what priority the // directsound service threads run at. We *should* be roughly // within a ms or so of correct. LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handles[0].buffer; LPDIRECTSOUNDCAPTUREBUFFER dsCaptureBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handles[1].buffer; DWORD initialWritePos, initialSafeWritePos; DWORD initialReadPos, initialSafeReadPos;; result = dsWriteBuffer->GetCurrentPosition(&initialWritePos, &initialSafeWritePos); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current position (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } result = dsCaptureBuffer->GetCurrentPosition(&initialReadPos, &initialSafeReadPos); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current capture position (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } while (true) { result = dsWriteBuffer->GetCurrentPosition(¤tWritePos, &safeWritePos); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current position (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } result = dsCaptureBuffer->GetCurrentPosition(¤tReadPos, &safeReadPos); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current capture position (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } if (safeWritePos != initialSafeWritePos && safeReadPos != initialSafeReadPos) { break; } Sleep(1); } assert( handles[0].dsBufferSize == handles[1].dsBufferSize ); buffersRolling = true; handles[0].bufferPointer = (safeWritePos + handles[0].dsPointerLeadTime); handles[1].bufferPointer = safeReadPos; } if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { LPDIRECTSOUNDBUFFER dsBuffer = (LPDIRECTSOUNDBUFFER) handles[0].buffer; // Setup parameters and do buffer conversion if necessary. if (stream_.doConvertBuffer[0]) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer, stream_.convertInfo[0] ); buffer_bytes = stream_.bufferSize * stream_.nDeviceChannels[0]; buffer_bytes *= formatBytes(stream_.deviceFormat[0]); } else { buffer = stream_.userBuffer; buffer_bytes = stream_.bufferSize * stream_.nUserChannels[0]; buffer_bytes *= formatBytes(stream_.userFormat); } // No byte swapping necessary in DirectSound implementation. // Ahhh ... windoze. 16-bit data is signed but 8-bit data is // unsigned. So, we need to convert our signed 8-bit data here to // unsigned. if ( stream_.deviceFormat[0] == RTAUDIO_SINT8 ) for ( int i=0; iGetCurrentPosition(¤tWritePos, &safeWritePos); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current position (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } leadPos = safeWritePos + handles[0].dsPointerLeadTime; if ( leadPos > dsBufferSize ) leadPos -= dsBufferSize; if ( leadPos < nextWritePos ) leadPos += dsBufferSize; // unwrap offset endWrite = nextWritePos + buffer_bytes; // Check whether the entire write region is behind the play pointer. if ( leadPos >= endWrite ) break; // If we are here, then we must wait until the play pointer gets // beyond the write region. The approach here is to use the // Sleep() function to suspend operation until safePos catches // up. Calculate number of milliseconds to wait as: // time = distance * (milliseconds/second) * fudgefactor / // ((bytes/sample) * (samples/second)) // A "fudgefactor" less than 1 is used because it was found // that sleeping too long was MUCH worse than sleeping for // several shorter periods. double millis = (endWrite - leadPos) * 900.0; millis /= ( formatBytes(stream_.deviceFormat[0]) *stream_.nDeviceChannels[0]* stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; if ( millis > 50.0 ) { static int nOverruns = 0; ++nOverruns; } Sleep( (DWORD) millis ); } #ifdef GENERATE_DEBUG_LOG writeTime = timeGetTime(); #endif if (statistics.writeDeviceSafeLeadBytes < dsPointerDifference(safeWritePos,currentWritePos,handles[0].dsBufferSize)) { statistics.writeDeviceSafeLeadBytes = dsPointerDifference(safeWritePos,currentWritePos,handles[0].dsBufferSize); } if ( dsPointerBetween( nextWritePos, safeWritePos, currentWritePos, dsBufferSize ) || dsPointerBetween( endWrite, safeWritePos, currentWritePos, dsBufferSize ) ) { // We've strayed into the forbidden zone ... resync the read pointer. ++statistics.numberOfWriteUnderruns; nextWritePos = safeWritePos + handles[0].dsPointerLeadTime-buffer_bytes+dsBufferSize; while (nextWritePos >= dsBufferSize) nextWritePos-= dsBufferSize; handles[0].bufferPointer = nextWritePos; endWrite = nextWritePos + buffer_bytes; } // Lock free space in the buffer result = dsBuffer->Lock( nextWritePos, buffer_bytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0 ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to lock buffer during playback (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } // Copy our buffer into the DS buffer CopyMemory(buffer1, buffer, bufferSize1); if (buffer2 != NULL) CopyMemory(buffer2, buffer+bufferSize1, bufferSize2); // Update our buffer offset and unlock sound buffer dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to unlock buffer during playback (%s): %s.", devices_[stream_.device[0]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } nextWritePos = (nextWritePos + bufferSize1 + bufferSize2) % dsBufferSize; handles[0].bufferPointer = nextWritePos; } if (stream_.mode == INPUT || stream_.mode == DUPLEX) { // Setup parameters. if (stream_.doConvertBuffer[1]) { buffer = stream_.deviceBuffer; buffer_bytes = stream_.bufferSize * stream_.nDeviceChannels[1]; buffer_bytes *= formatBytes(stream_.deviceFormat[1]); } else { buffer = stream_.userBuffer; buffer_bytes = stream_.bufferSize * stream_.nUserChannels[1]; buffer_bytes *= formatBytes(stream_.userFormat); } LPDIRECTSOUNDCAPTUREBUFFER dsBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handles[1].buffer; long nextReadPos = handles[1].bufferPointer; DWORD dsBufferSize = handles[1].dsBufferSize; // Find out where the write and "safe read" pointers are. result = dsBuffer->GetCurrentPosition(¤tReadPos, &safeReadPos); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current capture position (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } if ( safeReadPos < (DWORD)nextReadPos ) safeReadPos += dsBufferSize; // unwrap offset DWORD endRead = nextReadPos + buffer_bytes; // Handling depends on whether we are INPUT or DUPLEX. // If we're in INPUT mode then waiting is a good thing. If we're in DUPLEX mode, // then a wait here will drag the write pointers into the forbidden zone. // // In DUPLEX mode, rather than wait, we will back off the read pointer until // it's in a safe position. This causes dropouts, but it seems to be the only // practical way to sync up the read and write pointers reliably, given the // the very complex relationship between phase and increment of the read and write // pointers. // // In order to minimize audible dropouts in DUPLEX mode, we will // provide a pre-roll period of 0.5 seconds in which we return // zeros from the read buffer while the pointers sync up. if (stream_.mode == DUPLEX) { if (safeReadPos < endRead) { if (duplexPrerollBytes <= 0) { // pre-roll time over. Be more agressive. int adjustment = endRead-safeReadPos; ++statistics.numberOfReadOverruns; // Two cases: // large adjustments: we've probably run out of CPU cycles, so just resync exactly, // and perform fine adjustments later. // small adjustments: back off by twice as much. if (adjustment >= 2*buffer_bytes) { nextReadPos = safeReadPos-2*buffer_bytes; } else { nextReadPos = safeReadPos-buffer_bytes-adjustment; } statistics.readDeviceSafeLeadBytes = currentReadPos-nextReadPos; if (statistics.readDeviceSafeLeadBytes < 0) statistics.readDeviceSafeLeadBytes += dsBufferSize; if (nextReadPos < 0) nextReadPos += dsBufferSize; } else { // in pre=roll time. Just do it. nextReadPos = safeReadPos-buffer_bytes; while (nextReadPos < 0) nextReadPos += dsBufferSize; } endRead = nextReadPos + buffer_bytes; } } else { while ( safeReadPos < endRead ) { // See comments for playback. double millis = (endRead - safeReadPos) * 900.0; millis /= ( formatBytes(stream_.deviceFormat[1]) * stream_.nDeviceChannels[1] * stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; Sleep( (DWORD) millis ); // Wake up, find out where we are now result = dsBuffer->GetCurrentPosition( ¤tReadPos, &safeReadPos ); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to get current capture position (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } if ( safeReadPos < (DWORD)nextReadPos ) safeReadPos += dsBufferSize; // unwrap offset } } #ifdef GENERATE_DEBUG_LOG readTime = timeGetTime(); #endif if (statistics.readDeviceSafeLeadBytes < dsPointerDifference(currentReadPos,nextReadPos ,dsBufferSize)) { statistics.readDeviceSafeLeadBytes = dsPointerDifference(currentReadPos,nextReadPos ,dsBufferSize); } // Lock free space in the buffer result = dsBuffer->Lock (nextReadPos, buffer_bytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to lock buffer during capture (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } if (duplexPrerollBytes <= 0) { // Copy our buffer into the DS buffer CopyMemory(buffer, buffer1, bufferSize1); if (buffer2 != NULL) CopyMemory(buffer+bufferSize1, buffer2, bufferSize2); } else { memset(buffer,0,bufferSize1); if (buffer2 != NULL) memset(buffer+bufferSize1,0,bufferSize2); duplexPrerollBytes -= bufferSize1 + bufferSize2; } // Update our buffer offset and unlock sound buffer nextReadPos = (nextReadPos + bufferSize1 + bufferSize2) % dsBufferSize; dsBuffer->Unlock (buffer1, bufferSize1, buffer2, bufferSize2); if ( FAILED(result) ) { sprintf(message_, "RtApiDs: Unable to unlock buffer during capture (%s): %s.", devices_[stream_.device[1]].name.c_str(), getErrorString(result)); error(RtError::DRIVER_ERROR); } handles[1].bufferPointer = nextReadPos; // No byte swapping necessary in DirectSound implementation. // If necessary, convert 8-bit data from unsigned to signed. if ( stream_.deviceFormat[1] == RTAUDIO_SINT8 ) for ( int j=0; jstopStream(); } // Definitions for utility functions and callbacks // specific to the DirectSound implementation. extern "C" unsigned __stdcall callbackHandler(void *ptr) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiDs *object = (RtApiDs *) info->object; bool *usingCallback = &info->usingCallback; while ( *usingCallback ) { try { object->tickStream(); } catch (RtError &exception) { fprintf(stderr, "\nRtApiDs: callback thread error (%s) ... closing thread.\n\n", exception.getMessageString()); break; } } _endthreadex( 0 ); return 0; } static bool CALLBACK deviceCountCallback(LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext) { int *pointer = ((int *) lpContext); (*pointer)++; return true; } #include "tchar.h" std::string convertTChar( LPCTSTR name ) { std::string s; #if defined( UNICODE ) || defined( _UNICODE ) // Yes, this conversion doesn't make sense for two-byte characters // but RtAudio is currently written to return an std::string of // one-byte chars for the device name. for ( unsigned int i=0; iname.empty() ) info++; info->name = convertTChar( description ); info->id = lpguid; HRESULT hr; info->isValid = false; if (info->isInput == true) { DSCCAPS caps; LPDIRECTSOUNDCAPTURE object; hr = DirectSoundCaptureCreate( lpguid, &object, NULL ); if( hr != DS_OK ) return true; caps.dwSize = sizeof(caps); hr = object->GetCaps( &caps ); if( hr == DS_OK ) { if (caps.dwChannels > 0 && caps.dwFormats > 0) info->isValid = true; } object->Release(); } else { DSCAPS caps; LPDIRECTSOUND object; hr = DirectSoundCreate( lpguid, &object, NULL ); if( hr != DS_OK ) return true; caps.dwSize = sizeof(caps); hr = object->GetCaps( &caps ); if( hr == DS_OK ) { if ( caps.dwFlags & DSCAPS_PRIMARYMONO || caps.dwFlags & DSCAPS_PRIMARYSTEREO ) info->isValid = true; } object->Release(); } return true; } static bool CALLBACK defaultDeviceCallback(LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext) { enum_info *info = ((enum_info *) lpContext); if ( lpguid == NULL ) { info->name = convertTChar( description ); return false; } return true; } static bool CALLBACK deviceIdCallback(LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext) { enum_info *info = ((enum_info *) lpContext); std::string s = convertTChar( description ); if ( info->name == s ) { info->id = lpguid; info->isValid = true; return false; } return true; } static char* getErrorString(int code) { switch (code) { case DSERR_ALLOCATED: return "Already allocated."; case DSERR_CONTROLUNAVAIL: return "Control unavailable."; case DSERR_INVALIDPARAM: return "Invalid parameter."; case DSERR_INVALIDCALL: return "Invalid call."; case DSERR_GENERIC: return "Generic error."; case DSERR_PRIOLEVELNEEDED: return "Priority level needed"; case DSERR_OUTOFMEMORY: return "Out of memory"; case DSERR_BADFORMAT: return "The sample rate or the channel format is not supported."; case DSERR_UNSUPPORTED: return "Not supported."; case DSERR_NODRIVER: return "No driver."; case DSERR_ALREADYINITIALIZED: return "Already initialized."; case DSERR_NOAGGREGATION: return "No aggregation."; case DSERR_BUFFERLOST: return "Buffer lost."; case DSERR_OTHERAPPHASPRIO: return "Another application already has priority."; case DSERR_UNINITIALIZED: return "Uninitialized."; default: return "DirectSound unknown error"; } } //******************** End of __WINDOWS_DS__ *********************// #endif #if defined(__IRIX_AL__) // SGI's AL API for IRIX #include #include #include extern "C" void *callbackHandler(void * ptr); RtApiAl :: RtApiAl() { this->initialize(); if (nDevices_ <= 0) { sprintf(message_, "RtApiAl: no Irix AL audio devices found!"); error(RtError::NO_DEVICES_FOUND); } } RtApiAl :: ~RtApiAl() { // The subclass destructor gets called before the base class // destructor, so close any existing streams before deallocating // apiDeviceId memory. if ( stream_.mode != UNINITIALIZED ) closeStream(); // Free our allocated apiDeviceId memory. long *id; for ( unsigned int i=0; iapiDeviceId; resource = id[0]; if (resource > 0) { // Probe output device parameters. result = alQueryValues(resource, AL_CHANNELS, &value, 1, 0, 0); if (result < 0) { sprintf(message_, "RtApiAl: error getting device (%s) channels: %s.", info->name.c_str(), alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); } else { info->maxOutputChannels = value.i; info->minOutputChannels = 1; } result = alGetParamInfo(resource, AL_RATE, &pinfo); if (result < 0) { sprintf(message_, "RtApiAl: error getting device (%s) rates: %s.", info->name.c_str(), alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); } else { info->sampleRates.clear(); for (unsigned int k=0; k= pinfo.min.i && SAMPLE_RATES[k] <= pinfo.max.i ) info->sampleRates.push_back( SAMPLE_RATES[k] ); } } // The AL library supports all our formats, except 24-bit and 32-bit ints. info->nativeFormats = (RtAudioFormat) 51; } // Now get input resource ID if it exists. resource = id[1]; if (resource > 0) { // Probe input device parameters. result = alQueryValues(resource, AL_CHANNELS, &value, 1, 0, 0); if (result < 0) { sprintf(message_, "RtApiAl: error getting device (%s) channels: %s.", info->name.c_str(), alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); } else { info->maxInputChannels = value.i; info->minInputChannels = 1; } result = alGetParamInfo(resource, AL_RATE, &pinfo); if (result < 0) { sprintf(message_, "RtApiAl: error getting device (%s) rates: %s.", info->name.c_str(), alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); } else { // In the case of the default device, these values will // overwrite the rates determined for the output device. Since // the input device is most likely to be more limited than the // output device, this is ok. info->sampleRates.clear(); for (unsigned int k=0; k= pinfo.min.i && SAMPLE_RATES[k] <= pinfo.max.i ) info->sampleRates.push_back( SAMPLE_RATES[k] ); } } // The AL library supports all our formats, except 24-bit and 32-bit ints. info->nativeFormats = (RtAudioFormat) 51; } if ( info->maxInputChannels == 0 && info->maxOutputChannels == 0 ) return; if ( info->sampleRates.size() == 0 ) return; // Determine duplex status. if (info->maxInputChannels < info->maxOutputChannels) info->maxDuplexChannels = info->maxInputChannels; else info->maxDuplexChannels = info->maxOutputChannels; if (info->minInputChannels < info->minOutputChannels) info->minDuplexChannels = info->minInputChannels; else info->minDuplexChannels = info->minOutputChannels; if ( info->maxDuplexChannels > 0 ) info->hasDuplexSupport = true; else info->hasDuplexSupport = false; info->probed = true; return; } bool RtApiAl :: probeDeviceOpen(int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers) { int result, nBuffers; long resource; ALconfig al_config; ALport port; ALpv pvs[2]; long *id = (long *) devices_[device].apiDeviceId; // Get a new ALconfig structure. al_config = alNewConfig(); if ( !al_config ) { sprintf(message_,"RtApiAl: can't get AL config: %s.", alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } // Set the channels. result = alSetChannels(al_config, channels); if ( result < 0 ) { alFreeConfig(al_config); sprintf(message_,"RtApiAl: can't set %d channels in AL config: %s.", channels, alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } // Attempt to set the queue size. The al API doesn't provide a // means for querying the minimum/maximum buffer size of a device, // so if the specified size doesn't work, take whatever the // al_config structure returns. if ( numberOfBuffers < 1 ) nBuffers = 1; else nBuffers = numberOfBuffers; long buffer_size = *bufferSize * nBuffers; result = alSetQueueSize(al_config, buffer_size); // in sample frames if ( result < 0 ) { // Get the buffer size specified by the al_config and try that. buffer_size = alGetQueueSize(al_config); result = alSetQueueSize(al_config, buffer_size); if ( result < 0 ) { alFreeConfig(al_config); sprintf(message_,"RtApiAl: can't set buffer size (%ld) in AL config: %s.", buffer_size, alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } *bufferSize = buffer_size / nBuffers; } // Set the data format. stream_.userFormat = format; stream_.deviceFormat[mode] = format; if (format == RTAUDIO_SINT8) { result = alSetSampFmt(al_config, AL_SAMPFMT_TWOSCOMP); result = alSetWidth(al_config, AL_SAMPLE_8); } else if (format == RTAUDIO_SINT16) { result = alSetSampFmt(al_config, AL_SAMPFMT_TWOSCOMP); result = alSetWidth(al_config, AL_SAMPLE_16); } else if (format == RTAUDIO_SINT24) { // Our 24-bit format assumes the upper 3 bytes of a 4 byte word. // The AL library uses the lower 3 bytes, so we'll need to do our // own conversion. result = alSetSampFmt(al_config, AL_SAMPFMT_FLOAT); stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; } else if (format == RTAUDIO_SINT32) { // The AL library doesn't seem to support the 32-bit integer // format, so we'll need to do our own conversion. result = alSetSampFmt(al_config, AL_SAMPFMT_FLOAT); stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; } else if (format == RTAUDIO_FLOAT32) result = alSetSampFmt(al_config, AL_SAMPFMT_FLOAT); else if (format == RTAUDIO_FLOAT64) result = alSetSampFmt(al_config, AL_SAMPFMT_DOUBLE); if ( result == -1 ) { alFreeConfig(al_config); sprintf(message_,"RtApiAl: error setting sample format in AL config: %s.", alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } if (mode == OUTPUT) { // Set our device. if (device == 0) resource = AL_DEFAULT_OUTPUT; else resource = id[0]; result = alSetDevice(al_config, resource); if ( result == -1 ) { alFreeConfig(al_config); sprintf(message_,"RtApiAl: error setting device (%s) in AL config: %s.", devices_[device].name.c_str(), alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } // Open the port. port = alOpenPort("RtApiAl Output Port", "w", al_config); if( !port ) { alFreeConfig(al_config); sprintf(message_,"RtApiAl: error opening output port: %s.", alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } // Set the sample rate pvs[0].param = AL_MASTER_CLOCK; pvs[0].value.i = AL_CRYSTAL_MCLK_TYPE; pvs[1].param = AL_RATE; pvs[1].value.ll = alDoubleToFixed((double)sampleRate); result = alSetParams(resource, pvs, 2); if ( result < 0 ) { alClosePort(port); alFreeConfig(al_config); sprintf(message_,"RtApiAl: error setting sample rate (%d) for device (%s): %s.", sampleRate, devices_[device].name.c_str(), alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } } else { // mode == INPUT // Set our device. if (device == 0) resource = AL_DEFAULT_INPUT; else resource = id[1]; result = alSetDevice(al_config, resource); if ( result == -1 ) { alFreeConfig(al_config); sprintf(message_,"RtApiAl: error setting device (%s) in AL config: %s.", devices_[device].name.c_str(), alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } // Open the port. port = alOpenPort("RtApiAl Input Port", "r", al_config); if( !port ) { alFreeConfig(al_config); sprintf(message_,"RtApiAl: error opening input port: %s.", alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } // Set the sample rate pvs[0].param = AL_MASTER_CLOCK; pvs[0].value.i = AL_CRYSTAL_MCLK_TYPE; pvs[1].param = AL_RATE; pvs[1].value.ll = alDoubleToFixed((double)sampleRate); result = alSetParams(resource, pvs, 2); if ( result < 0 ) { alClosePort(port); alFreeConfig(al_config); sprintf(message_,"RtApiAl: error setting sample rate (%d) for device (%s): %s.", sampleRate, devices_[device].name.c_str(), alGetErrorString(oserror())); error(RtError::DEBUG_WARNING); return FAILURE; } } alFreeConfig(al_config); stream_.nUserChannels[mode] = channels; stream_.nDeviceChannels[mode] = channels; // Save stream handle. ALport *handle = (ALport *) stream_.apiHandle; if ( handle == 0 ) { handle = (ALport *) calloc(2, sizeof(ALport)); if ( handle == NULL ) { sprintf(message_, "RtApiAl: Irix Al error allocating handle memory (%s).", devices_[device].name.c_str()); goto error; } stream_.apiHandle = (void *) handle; handle[0] = 0; handle[1] = 0; } handle[mode] = port; // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers if ( stream_.nUserChannels[0] != stream_.nUserChannels[1] ) { long buffer_bytes; if (stream_.nUserChannels[0] >= stream_.nUserChannels[1]) buffer_bytes = stream_.nUserChannels[0]; else buffer_bytes = stream_.nUserChannels[1]; buffer_bytes *= *bufferSize * formatBytes(stream_.userFormat); if (stream_.userBuffer) free(stream_.userBuffer); stream_.userBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.userBuffer == NULL) { sprintf(message_, "RtApiAl: error allocating user buffer memory (%s).", devices_[device].name.c_str()); goto error; } } if ( stream_.doConvertBuffer[mode] ) { long buffer_bytes; bool makeBuffer = true; if ( mode == OUTPUT ) buffer_bytes = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); else { // mode == INPUT buffer_bytes = stream_.nDeviceChannels[1] * formatBytes(stream_.deviceFormat[1]); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { long bytes_out = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( buffer_bytes < bytes_out ) makeBuffer = false; } } if ( makeBuffer ) { buffer_bytes *= *bufferSize; if (stream_.deviceBuffer) free(stream_.deviceBuffer); stream_.deviceBuffer = (char *) calloc(buffer_bytes, 1); if (stream_.deviceBuffer == NULL) { sprintf(message_, "RtApiAl: error allocating device buffer memory (%s).", devices_[device].name.c_str()); goto error; } } } stream_.device[mode] = device; stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; stream_.nBuffers = nBuffers; stream_.bufferSize = *bufferSize; stream_.sampleRate = sampleRate; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if (mode == INPUT) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( mode == INPUT && stream_.deInterleave[1] ) { for (int k=0; k err) frames = err; } frames = stream_.bufferSize - frames; if (frames < 0) frames = 0; MUTEX_UNLOCK(&stream_.mutex); return frames; } void RtApiAl :: tickStream() { verifyStream(); int stopStream = 0; if (stream_.state == STREAM_STOPPED) { if (stream_.callbackInfo.usingCallback) usleep(50000); // sleep 50 milliseconds return; } else if (stream_.callbackInfo.usingCallback) { RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; stopStream = callback(stream_.userBuffer, stream_.bufferSize, stream_.callbackInfo.userData); } MUTEX_LOCK(&stream_.mutex); // The state might change while waiting on a mutex. if (stream_.state == STREAM_STOPPED) goto unlock; char *buffer; int channels; RtAudioFormat format; ALport *handle = (ALport *) stream_.apiHandle; if (stream_.mode == OUTPUT || stream_.mode == DUPLEX) { // Setup parameters and do buffer conversion if necessary. if (stream_.doConvertBuffer[0]) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer, stream_.convertInfo[0] ); channels = stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer; channels = stream_.nUserChannels[0]; format = stream_.userFormat; } // Do byte swapping if necessary. if (stream_.doByteSwap[0]) byteSwapBuffer(buffer, stream_.bufferSize * channels, format); // Write interleaved samples to device. alWriteFrames(handle[0], buffer, stream_.bufferSize); } if (stream_.mode == INPUT || stream_.mode == DUPLEX) { // Setup parameters. if (stream_.doConvertBuffer[1]) { buffer = stream_.deviceBuffer; channels = stream_.nDeviceChannels[1]; format = stream_.deviceFormat[1]; } else { buffer = stream_.userBuffer; channels = stream_.nUserChannels[1]; format = stream_.userFormat; } // Read interleaved samples from device. alReadFrames(handle[1], buffer, stream_.bufferSize); // Do byte swapping if necessary. if (stream_.doByteSwap[1]) byteSwapBuffer(buffer, stream_.bufferSize * channels, format); // Do buffer conversion if necessary. if (stream_.doConvertBuffer[1]) convertBuffer( stream_.userBuffer, stream_.deviceBuffer, stream_.convertInfo[1] ); } unlock: MUTEX_UNLOCK(&stream_.mutex); if (stream_.callbackInfo.usingCallback && stopStream) this->stopStream(); } void RtApiAl :: setStreamCallback(RtAudioCallback callback, void *userData) { verifyStream(); CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; if ( info->usingCallback ) { sprintf(message_, "RtApiAl: A callback is already set for this stream!"); error(RtError::WARNING); return; } info->callback = (void *) callback; info->userData = userData; info->usingCallback = true; info->object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority. The higher priority will only take affect if the // program is run as root or suid. pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_attr_setschedpolicy(&attr, SCHED_RR); int err = pthread_create(&info->thread, &attr, callbackHandler, &stream_.callbackInfo); pthread_attr_destroy(&attr); if (err) { info->usingCallback = false; sprintf(message_, "RtApiAl: error starting callback thread!"); error(RtError::THREAD_ERROR); } } void RtApiAl :: cancelStreamCallback() { verifyStream(); if (stream_.callbackInfo.usingCallback) { if (stream_.state == STREAM_RUNNING) stopStream(); MUTEX_LOCK(&stream_.mutex); stream_.callbackInfo.usingCallback = false; pthread_join(stream_.callbackInfo.thread, NULL); stream_.callbackInfo.thread = 0; stream_.callbackInfo.callback = NULL; stream_.callbackInfo.userData = NULL; MUTEX_UNLOCK(&stream_.mutex); } } extern "C" void *callbackHandler(void *ptr) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiAl *object = (RtApiAl *) info->object; bool *usingCallback = &info->usingCallback; while ( *usingCallback ) { try { object->tickStream(); } catch (RtError &exception) { fprintf(stderr, "\nRtApiAl: callback thread error (%s) ... closing thread.\n\n", exception.getMessageString()); break; } } return 0; } //******************** End of __IRIX_AL__ *********************// #endif // *************************************************** // // // Protected common (OS-independent) RtAudio methods. // // *************************************************** // // This method can be modified to control the behavior of error // message reporting and throwing. void RtApi :: error(RtError::Type type) { if (type == RtError::WARNING) { fprintf(stderr, "\n%s\n\n", message_); } else if (type == RtError::DEBUG_WARNING) { #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\n%s\n\n", message_); #endif } else { #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\n%s\n\n", message_); #endif throw RtError(std::string(message_), type); } } void RtApi :: verifyStream() { if ( stream_.mode == UNINITIALIZED ) { sprintf(message_, "RtAudio: stream is not open!"); error(RtError::INVALID_STREAM); } } void RtApi :: clearDeviceInfo(RtApiDevice *info) { // Don't clear the name or DEVICE_ID fields here ... they are // typically set prior to a call of this function. info->probed = false; info->maxOutputChannels = 0; info->maxInputChannels = 0; info->maxDuplexChannels = 0; info->minOutputChannels = 0; info->minInputChannels = 0; info->minDuplexChannels = 0; info->hasDuplexSupport = false; info->sampleRates.clear(); info->nativeFormats = 0; } void RtApi :: clearStreamInfo() { stream_.mode = UNINITIALIZED; stream_.state = STREAM_STOPPED; stream_.sampleRate = 0; stream_.bufferSize = 0; stream_.nBuffers = 0; stream_.userFormat = 0; for ( int i=0; i<2; i++ ) { stream_.device[i] = 0; stream_.doConvertBuffer[i] = false; stream_.deInterleave[i] = false; stream_.doByteSwap[i] = false; stream_.nUserChannels[i] = 0; stream_.nDeviceChannels[i] = 0; stream_.deviceFormat[i] = 0; } } int RtApi :: formatBytes(RtAudioFormat format) { if (format == RTAUDIO_SINT16) return 2; else if (format == RTAUDIO_SINT24 || format == RTAUDIO_SINT32 || format == RTAUDIO_FLOAT32) return 4; else if (format == RTAUDIO_FLOAT64) return 8; else if (format == RTAUDIO_SINT8) return 1; sprintf(message_,"RtApi: undefined format in formatBytes()."); error(RtError::WARNING); return 0; } void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ) { // This function does format conversion, input/output channel compensation, and // data interleaving/deinterleaving. 24-bit integers are assumed to occupy // the upper three bytes of a 32-bit integer. // Clear our device buffer when in/out duplex device channels are different if ( outBuffer == stream_.deviceBuffer && stream_.mode == DUPLEX && stream_.nDeviceChannels[0] != stream_.nDeviceChannels[1] ) memset( outBuffer, 0, stream_.bufferSize * info.outJump * formatBytes( info.outFormat ) ); int j; if (info.outFormat == RTAUDIO_FLOAT64) { Float64 scale; Float64 *out = (Float64 *)outBuffer; if (info.inFormat == RTAUDIO_SINT8) { signed char *in = (signed char *)inBuffer; scale = 1.0 / 128.0; for (int i=0; i> 16) & 0x0000ffff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; for (int i=0; i> 16) & 0x0000ffff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (int i=0; i> 8) & 0x00ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT24) { Int32 *in = (Int32 *)inBuffer; for (int i=0; i> 24) & 0x000000ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; for (int i=0; i> 24) & 0x000000ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (int i=0; i #include class RtError { public: //! Defined RtError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ INVALID_STREAM, /*!< An invalid stream ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; protected: std::string message_; Type type_; public: //! The constructor. RtError(const std::string& message, Type type = RtError::UNSPECIFIED) : message_(message), type_(type) {} //! The destructor. virtual ~RtError(void) {}; //! Prints thrown error message to stderr. virtual void printMessage(void) { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) { return message_; } //! Returns the thrown error message as a C string. virtual const char *getMessageString(void) { return message_.c_str(); } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/oss/0000755000175000017500000000000011317506073024575 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/oss/soundcard.h0000644000175000017500000022341311163425013026726 0ustar admin2admin2#ifndef SOUNDCARD_H #define SOUNDCARD_H /* **************************************************************************** * ****************************************************************************** * Modifications to this file are NOT allowed. This header file controls the * OSS API. For compatibility reasons only 4Front Technologies can make changes * to the definitions. If you have any questions, please contact * hannu@opensound.com. ****************************************************************************** * * Redistribution and use in source and binary forms, without * modification, are permitted provided that the following conditions are * notice, this list of conditions and the following disclaimer. 2. * 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. **************************************************************************** */ /* * Purpose: The C/C++ header file that defines the OSS API. * Description: * This header file contains all the declarations required to compile OSS * programs. The latest version is always installed together with OSS * use of the latest version is strongly recommended. * * {!notice This header file contains many obsolete definitions * (for compatibility with older applications that still ned them). * Do not use this file as a reference manual of OSS. * Please check the OSS Programmer's guide for descriptions * of the supported API details (http://www.opensound.com/pguide).} */ #if defined(__cplusplus) #define EXTERNC extern "C" #else #define EXTERNC extern #endif /* EXTERN_C_WRAPPERS */ #define OSS_VERSION 0x040002 #define SOUND_VERSION OSS_VERSION #define OPEN_SOUND_SYSTEM #if defined(__hpux) && !defined(_HPUX_SOURCE) # error "-D_HPUX_SOURCE must be used when compiling OSS applications" #endif #ifdef __hpux #include #endif #ifdef linux /* In Linux we need to be prepared for cross compiling */ #include #else # ifdef __FreeBSD__ # include # else # include # endif #endif #ifndef __SIOWR #if defined(__hpux) || (defined(_IOWR) && (defined(_AIX) || (!defined(sun) && !defined(sparc) && !defined(__INCioctlh) && !defined(__Lynx__)))) /* * Make sure the ioctl macros are compatible with the ones already used * by this operating system. */ #define SIOCPARM_MASK IOCPARM_MASK #define SIOC_VOID IOC_VOID #define SIOC_OUT IOC_OUT #define SIOC_IN IOC_IN #define SIOC_INOUT IOC_INOUT #define __SIOC_SIZE _IOC_SIZE #define __SIOC_DIR _IOC_DIR #define __SIOC_NONE _IOC_NONE #define __SIOC_READ _IOC_READ #define __SIOC_WRITE _IOC_WRITE #define __SIO _IO #define __SIOR _IOR #define __SIOW _IOW #define __SIOWR _IOWR #else /* #define SIOCTYPE (0xff<<8) */ #define SIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */ #define SIOC_VOID 0x00000000 /* no parameters */ #define SIOC_OUT 0x20000000 /* copy out parameters */ #define SIOC_IN 0x40000000 /* copy in parameters */ #define SIOC_INOUT (SIOC_IN|SIOC_OUT) #define __SIO(x,y) ((int)(SIOC_VOID|(x<<8)|y)) #define __SIOR(x,y,t) ((int)(SIOC_OUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) #define __SIOW(x,y,t) ((int)(SIOC_IN|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) #define __SIOWR(x,y,t) ((int)(SIOC_INOUT|((sizeof(t)&SIOCPARM_MASK)<<16)|(x<<8)|y)) #define __SIOC_SIZE(x) ((x>>16)&SIOCPARM_MASK) #define __SIOC_DIR(x) (x & 0xf0000000) #define __SIOC_NONE SIOC_VOID #define __SIOC_READ SIOC_OUT #define __SIOC_WRITE SIOC_IN # endif /* _IOWR */ #endif /* !__SIOWR */ #define OSS_LONGNAME_SIZE 64 #define OSS_LABEL_SIZE 16 #define OSS_DEVNODE_SIZE 32 typedef char oss_longname_t[OSS_LONGNAME_SIZE]; typedef char oss_label_t[OSS_LABEL_SIZE]; typedef char oss_devnode_t[OSS_DEVNODE_SIZE]; #ifndef DISABLE_SEQUENCER /* **************************************************************************** * IOCTL Commands for /dev/sequencer and /dev/music (AKA /dev/sequencer2) * * Note that this interface is obsolete and no longer developed. New * applications should use /dev/midi instead. ****************************************************************************/ #define SNDCTL_SEQ_RESET __SIO ('Q', 0) #define SNDCTL_SEQ_SYNC __SIO ('Q', 1) #define SNDCTL_SYNTH_INFO __SIOWR('Q', 2, struct synth_info) #define SNDCTL_SEQ_CTRLRATE __SIOWR('Q', 3, int) /* Set/get timer resolution (HZ) */ #define SNDCTL_SEQ_GETOUTCOUNT __SIOR ('Q', 4, int) #define SNDCTL_SEQ_GETINCOUNT __SIOR ('Q', 5, int) #define SNDCTL_SEQ_PERCMODE __SIOW ('Q', 6, int) #define SNDCTL_FM_LOAD_INSTR __SIOW ('Q', 7, struct sbi_instrument) /* Obsolete. Don't use!!!!!! */ #define SNDCTL_SEQ_TESTMIDI __SIOW ('Q', 8, int) #define SNDCTL_SEQ_RESETSAMPLES __SIOW ('Q', 9, int) #define SNDCTL_SEQ_NRSYNTHS __SIOR ('Q',10, int) #define SNDCTL_SEQ_NRMIDIS __SIOR ('Q',11, int) #define SNDCTL_MIDI_INFO __SIOWR('Q',12, struct midi_info) /* OBSOLETE - use SNDCTL_MIDIINFO instead */ #define SNDCTL_SEQ_THRESHOLD __SIOW ('Q',13, int) #define SNDCTL_SYNTH_MEMAVL __SIOWR('Q',14, int) /* in=dev#, out=memsize */ #define SNDCTL_FM_4OP_ENABLE __SIOW ('Q',15, int) /* in=dev# */ #define SNDCTL_SEQ_PANIC __SIO ('Q',17) #define SNDCTL_SEQ_OUTOFBAND __SIOW ('Q',18, struct seq_event_rec) #define SNDCTL_SEQ_GETTIME __SIOR ('Q',19, int) #define SNDCTL_SYNTH_ID __SIOWR('Q',20, struct synth_info) #define SNDCTL_SYNTH_CONTROL __SIOWR('Q',21, struct synth_control) #define SNDCTL_SYNTH_REMOVESAMPLE __SIOWR('Q',22, struct remove_sample) /* Reserved for future use */ #define SNDCTL_SEQ_TIMING_ENABLE __SIO ('Q', 23) /* Enable incoming MIDI timing messages */ #define SNDCTL_SEQ_ACTSENSE_ENABLE __SIO ('Q', 24) /* Enable incoming active sensing messages */ #define SNDCTL_SEQ_RT_ENABLE __SIO ('Q', 25) /* Enable other incoming realtime messages */ typedef struct synth_control { int devno; /* Synthesizer # */ char data[4000]; /* Device spesific command/data record */ } synth_control; typedef struct remove_sample { int devno; /* Synthesizer # */ int bankno; /* MIDI bank # (0=General MIDI) */ int instrno; /* MIDI instrument number */ } remove_sample; typedef struct seq_event_rec { unsigned char arr[8]; } seq_event_rec; #define SNDCTL_TMR_TIMEBASE __SIOWR('T', 1, int) #define SNDCTL_TMR_START __SIO ('T', 2) #define SNDCTL_TMR_STOP __SIO ('T', 3) #define SNDCTL_TMR_CONTINUE __SIO ('T', 4) #define SNDCTL_TMR_TEMPO __SIOWR('T', 5, int) #define SNDCTL_TMR_SOURCE __SIOWR('T', 6, int) # define TMR_INTERNAL 0x00000001 # define TMR_EXTERNAL 0x00000002 # define TMR_MODE_MIDI 0x00000010 # define TMR_MODE_FSK 0x00000020 # define TMR_MODE_CLS 0x00000040 # define TMR_MODE_SMPTE 0x00000080 #define SNDCTL_TMR_METRONOME __SIOW ('T', 7, int) #define SNDCTL_TMR_SELECT __SIOW ('T', 8, int) /* * Sample loading mechanism for internal synthesizers (/dev/sequencer) * (for the .PAT format). */ struct patch_info { unsigned short key; /* Use WAVE_PATCH here */ #define WAVE_PATCH _PATCHKEY(0x04) #define GUS_PATCH WAVE_PATCH #define WAVEFRONT_PATCH _PATCHKEY(0x06) short device_no; /* Synthesizer number */ short instr_no; /* Midi pgm# */ unsigned int mode; /* * The least significant byte has the same format than the GUS .PAT * files */ #define WAVE_16_BITS 0x01 /* bit 0 = 8 or 16 bit wave data. */ #define WAVE_UNSIGNED 0x02 /* bit 1 = Signed - Unsigned data. */ #define WAVE_LOOPING 0x04 /* bit 2 = looping enabled-1. */ #define WAVE_BIDIR_LOOP 0x08 /* bit 3 = Set is bidirectional looping. */ #define WAVE_LOOP_BACK 0x10 /* bit 4 = Set is looping backward. */ #define WAVE_SUSTAIN_ON 0x20 /* bit 5 = Turn sustaining on. (Env. pts. 3) */ #define WAVE_ENVELOPES 0x40 /* bit 6 = Enable envelopes - 1 */ #define WAVE_FAST_RELEASE 0x80 /* bit 7 = Shut off immediately after note off */ /* (use the env_rate/env_offs fields). */ /* Linux specific bits */ #define WAVE_VIBRATO 0x00010000 /* The vibrato info is valid */ #define WAVE_TREMOLO 0x00020000 /* The tremolo info is valid */ #define WAVE_SCALE 0x00040000 /* The scaling info is valid */ #define WAVE_FRACTIONS 0x00080000 /* Fraction information is valid */ /* Reserved bits */ #define WAVE_ROM 0x40000000 /* For future use */ #define WAVE_MULAW 0x20000000 /* For future use */ /* Other bits must be zeroed */ int len; /* Size of the wave data in bytes */ int loop_start, loop_end; /* Byte offsets from the beginning */ /* * The base_freq and base_note fields are used when computing the * playback speed for a note. The base_note defines the tone frequency * which is heard if the sample is played using the base_freq as the * playback speed. * * The low_note and high_note fields define the minimum and maximum note * frequencies for which this sample is valid. It is possible to define * more than one samples for an instrument number at the same time. The * low_note and high_note fields are used to select the most suitable one. * * The fields base_note, high_note and low_note should contain * the note frequency multiplied by 1000. For example value for the * middle A is 440*1000. */ unsigned int base_freq; unsigned int base_note; unsigned int high_note; unsigned int low_note; int panning; /* -128=left, 127=right */ int detuning; /* Envelope. Enabled by mode bit WAVE_ENVELOPES */ unsigned char env_rate[6]; /* GUS HW ramping rate */ unsigned char env_offset[6]; /* 255 == 100% */ /* * The tremolo, vibrato and scale info are not supported yet. * Enable by setting the mode bits WAVE_TREMOLO, WAVE_VIBRATO or * WAVE_SCALE */ unsigned char tremolo_sweep; unsigned char tremolo_rate; unsigned char tremolo_depth; unsigned char vibrato_sweep; unsigned char vibrato_rate; unsigned char vibrato_depth; int scale_frequency; unsigned int scale_factor; /* from 0 to 2048 or 0 to 2 */ int volume; int fractions; int reserved1; int spare[2]; char data[1]; /* The waveform data starts here */ }; struct sysex_info { short key; /* Use SYSEX_PATCH or MAUI_PATCH here */ #define SYSEX_PATCH _PATCHKEY(0x05) #define MAUI_PATCH _PATCHKEY(0x06) short device_no; /* Synthesizer number */ int len; /* Size of the sysex data in bytes */ unsigned char data[1]; /* Sysex data starts here */ }; /* * /dev/sequencer input events. * * The data written to the /dev/sequencer is a stream of events. Events * are records of 4 or 8 bytes. The first byte defines the size. * Any number of events can be written with a write call. There * is a set of macros for sending these events. Use these macros if you * want to maximize portability of your program. * * Events SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO. Are also input events. * (All input events are currently 4 bytes long. Be prepared to support * 8 byte events also. If you receive any event having first byte >= 128, * it's a 8 byte event. * * The events are documented at the end of this file. * * Normal events (4 bytes) * There is also a 8 byte version of most of the 4 byte events. The * 8 byte one is recommended. * * NOTE! All 4 byte events are now obsolete. Applications should not write * them. However 4 byte events are still used as inputs from * /dev/sequencer (/dev/music uses only 8 byte ones). */ #define SEQ_NOTEOFF 0 #define SEQ_FMNOTEOFF SEQ_NOTEOFF /* Just old name */ #define SEQ_NOTEON 1 #define SEQ_FMNOTEON SEQ_NOTEON #define SEQ_WAIT TMR_WAIT_ABS #define SEQ_PGMCHANGE 3 #define SEQ_FMPGMCHANGE SEQ_PGMCHANGE #define SEQ_SYNCTIMER TMR_START #define SEQ_MIDIPUTC 5 #define SEQ_DRUMON 6 /*** OBSOLETE ***/ #define SEQ_DRUMOFF 7 /*** OBSOLETE ***/ #define SEQ_ECHO TMR_ECHO /* For synching programs with output */ #define SEQ_AFTERTOUCH 9 #define SEQ_CONTROLLER 10 #define SEQ_BALANCE 11 #define SEQ_VOLMODE 12 /************************************ * Midi controller numbers * ************************************/ /* * Controllers 0 to 31 (0x00 to 0x1f) and * 32 to 63 (0x20 to 0x3f) are continuous * controllers. * In the MIDI 1.0 these controllers are sent using * two messages. Controller numbers 0 to 31 are used * to send the MSB and the controller numbers 32 to 63 * are for the LSB. Note that just 7 bits are used in MIDI bytes. */ #define CTL_BANK_SELECT 0x00 #define CTL_MODWHEEL 0x01 #define CTL_BREATH 0x02 /* undefined 0x03 */ #define CTL_FOOT 0x04 #define CTL_PORTAMENTO_TIME 0x05 #define CTL_DATA_ENTRY 0x06 #define CTL_MAIN_VOLUME 0x07 #define CTL_BALANCE 0x08 /* undefined 0x09 */ #define CTL_PAN 0x0a #define CTL_EXPRESSION 0x0b /* undefined 0x0c */ /* undefined 0x0d */ /* undefined 0x0e */ /* undefined 0x0f */ #define CTL_GENERAL_PURPOSE1 0x10 #define CTL_GENERAL_PURPOSE2 0x11 #define CTL_GENERAL_PURPOSE3 0x12 #define CTL_GENERAL_PURPOSE4 0x13 /* undefined 0x14 - 0x1f */ /* undefined 0x20 */ /* The controller numbers 0x21 to 0x3f are reserved for the */ /* least significant bytes of the controllers 0x00 to 0x1f. */ /* These controllers are not recognised by the driver. */ /* Controllers 64 to 69 (0x40 to 0x45) are on/off switches. */ /* 0=OFF and 127=ON (intermediate values are possible) */ #define CTL_DAMPER_PEDAL 0x40 #define CTL_SUSTAIN 0x40 /* Alias */ #define CTL_HOLD 0x40 /* Alias */ #define CTL_PORTAMENTO 0x41 #define CTL_SOSTENUTO 0x42 #define CTL_SOFT_PEDAL 0x43 /* undefined 0x44 */ #define CTL_HOLD2 0x45 /* undefined 0x46 - 0x4f */ #define CTL_GENERAL_PURPOSE5 0x50 #define CTL_GENERAL_PURPOSE6 0x51 #define CTL_GENERAL_PURPOSE7 0x52 #define CTL_GENERAL_PURPOSE8 0x53 /* undefined 0x54 - 0x5a */ #define CTL_EXT_EFF_DEPTH 0x5b #define CTL_TREMOLO_DEPTH 0x5c #define CTL_CHORUS_DEPTH 0x5d #define CTL_DETUNE_DEPTH 0x5e #define CTL_CELESTE_DEPTH 0x5e /* Alias for the above one */ #define CTL_PHASER_DEPTH 0x5f #define CTL_DATA_INCREMENT 0x60 #define CTL_DATA_DECREMENT 0x61 #define CTL_NONREG_PARM_NUM_LSB 0x62 #define CTL_NONREG_PARM_NUM_MSB 0x63 #define CTL_REGIST_PARM_NUM_LSB 0x64 #define CTL_REGIST_PARM_NUM_MSB 0x65 /* undefined 0x66 - 0x78 */ /* reserved 0x79 - 0x7f */ /* Pseudo controllers (not midi compatible) */ #define CTRL_PITCH_BENDER 255 #define CTRL_PITCH_BENDER_RANGE 254 #define CTRL_EXPRESSION 253 /* Obsolete */ #define CTRL_MAIN_VOLUME 252 /* Obsolete */ /* * Volume mode defines how volumes are used */ #define VOL_METHOD_ADAGIO 1 #define VOL_METHOD_LINEAR 2 /* * Note! SEQ_WAIT, SEQ_MIDIPUTC and SEQ_ECHO are used also as * input events. */ /* * Event codes 0xf0 to 0xfc are reserved for future extensions. */ #define SEQ_FULLSIZE 0xfd /* Long events */ /* * SEQ_FULLSIZE events are used for loading patches/samples to the * synthesizer devices. These events are passed directly to the driver * of the associated synthesizer device. There is no limit to the size * of the extended events. These events are not queued but executed * immediately when the write() is called (execution can take several * seconds of time). * * When a SEQ_FULLSIZE message is written to the device, it must * be written using exactly one write() call. Other events cannot * be mixed to the same write. * * For FM synths (YM3812/OPL3) use struct sbi_instrument and write it to the * /dev/sequencer. Don't write other data together with the instrument structure * Set the key field of the structure to FM_PATCH. The device field is used to * route the patch to the corresponding device. * * For wave table use struct patch_info. Initialize the key field * to WAVE_PATCH. */ #define SEQ_PRIVATE 0xfe /* Low level HW dependent events (8 bytes) */ #define SEQ_EXTENDED 0xff /* Extended events (8 bytes) OBSOLETE */ /* * Record for FM patches */ typedef unsigned char sbi_instr_data[32]; struct sbi_instrument { unsigned short key; /* FM_PATCH or OPL3_PATCH */ #define FM_PATCH _PATCHKEY(0x01) #define OPL3_PATCH _PATCHKEY(0x03) short device; /* Synth# (0-4) */ int channel; /* Program# to be initialized */ sbi_instr_data operators; /* Register settings for operator cells (.SBI format) */ }; struct synth_info { /* Read only */ char name[30]; int device; /* 0-N. INITIALIZE BEFORE CALLING */ int synth_type; #define SYNTH_TYPE_FM 0 #define SYNTH_TYPE_SAMPLE 1 #define SYNTH_TYPE_MIDI 2 /* Midi interface */ int synth_subtype; #define FM_TYPE_ADLIB 0x00 #define FM_TYPE_OPL3 0x01 #define MIDI_TYPE_MPU401 0x401 #define SAMPLE_TYPE_BASIC 0x10 #define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC #define SAMPLE_TYPE_WAVEFRONT 0x11 int perc_mode; /* No longer supported */ int nr_voices; int nr_drums; /* Obsolete field */ int instr_bank_size; unsigned int capabilities; #define SYNTH_CAP_PERCMODE 0x00000001 /* No longer used */ #define SYNTH_CAP_OPL3 0x00000002 /* Set if OPL3 supported */ #define SYNTH_CAP_INPUT 0x00000004 /* Input (MIDI) device */ int dummies[19]; /* Reserve space */ }; struct sound_timer_info { char name[32]; int caps; }; struct midi_info /* OBSOLETE */ { char name[30]; int device; /* 0-N. INITIALIZE BEFORE CALLING */ unsigned int capabilities; /* To be defined later */ int dev_type; int dummies[18]; /* Reserve space */ }; /* * Level 2 event types for /dev/sequencer */ /* * The 4 most significant bits of byte 0 specify the class of * the event: * * 0x8X = system level events, * 0x9X = device/port specific events, event[1] = device/port, * The last 4 bits give the subtype: * 0x02 = Channel event (event[3] = chn). * 0x01 = note event (event[4] = note). * (0x01 is not used alone but always with bit 0x02). * event[2] = MIDI message code (0x80=note off etc.) * */ #define EV_SEQ_LOCAL 0x80 #define EV_TIMING 0x81 #define EV_CHN_COMMON 0x92 #define EV_CHN_VOICE 0x93 #define EV_SYSEX 0x94 #define EV_SYSTEM 0x95 /* MIDI system and real time messages (input only) */ /* * Event types 200 to 220 are reserved for application use. * These numbers will not be used by the driver. */ /* * Events for event type EV_CHN_VOICE */ #define MIDI_NOTEOFF 0x80 #define MIDI_NOTEON 0x90 #define MIDI_KEY_PRESSURE 0xA0 /* * Events for event type EV_CHN_COMMON */ #define MIDI_CTL_CHANGE 0xB0 #define MIDI_PGM_CHANGE 0xC0 #define MIDI_CHN_PRESSURE 0xD0 #define MIDI_PITCH_BEND 0xE0 #define MIDI_SYSTEM_PREFIX 0xF0 /* * Timer event types */ #define TMR_WAIT_REL 1 /* Time relative to the prev time */ #define TMR_WAIT_ABS 2 /* Absolute time since TMR_START */ #define TMR_STOP 3 #define TMR_START 4 #define TMR_CONTINUE 5 #define TMR_TEMPO 6 #define TMR_ECHO 8 #define TMR_CLOCK 9 /* MIDI clock */ #define TMR_SPP 10 /* Song position pointer */ #define TMR_TIMESIG 11 /* Time signature */ /* * Local event types */ #define LOCL_STARTAUDIO 1 #define LOCL_STARTAUDIO2 2 #define LOCL_STARTAUDIO3 3 #define LOCL_STARTAUDIO4 4 #if (!defined(__KERNEL__) && !defined(KERNEL) && !defined(INKERNEL) && !defined(_KERNEL)) || defined(USE_SEQ_MACROS) /* * Some convenience macros to simplify programming of the * /dev/sequencer interface * * These macros define the API which should be used when possible. */ #define SEQ_DECLAREBUF() SEQ_USE_EXTBUF() void seqbuf_dump (void); /* This function must be provided by programs */ EXTERNC int OSS_init (int seqfd, int buflen); EXTERNC void OSS_seqbuf_dump (int fd, unsigned char *buf, int buflen); EXTERNC void OSS_seq_advbuf (int len, int fd, unsigned char *buf, int buflen); EXTERNC void OSS_seq_needbuf (int len, int fd, unsigned char *buf, int buflen); EXTERNC void OSS_patch_caching (int dev, int chn, int patch, int fd, unsigned char *buf, int buflen); EXTERNC void OSS_drum_caching (int dev, int chn, int patch, int fd, unsigned char *buf, int buflen); EXTERNC void OSS_write_patch (int fd, unsigned char *buf, int len); EXTERNC int OSS_write_patch2 (int fd, unsigned char *buf, int len); #define SEQ_PM_DEFINES int __foo_bar___ #ifdef OSSLIB # define SEQ_USE_EXTBUF() \ EXTERNC unsigned char *_seqbuf; \ EXTERNC int _seqbuflen;EXTERNC int _seqbufptr # define SEQ_DEFINEBUF(len) SEQ_USE_EXTBUF();static int _requested_seqbuflen=len # define _SEQ_ADVBUF(len) OSS_seq_advbuf(len, seqfd, _seqbuf, _seqbuflen) # define _SEQ_NEEDBUF(len) OSS_seq_needbuf(len, seqfd, _seqbuf, _seqbuflen) # define SEQ_DUMPBUF() OSS_seqbuf_dump(seqfd, _seqbuf, _seqbuflen) # define SEQ_LOAD_GMINSTR(dev, instr) \ OSS_patch_caching(dev, -1, instr, seqfd, _seqbuf, _seqbuflen) # define SEQ_LOAD_GMDRUM(dev, drum) \ OSS_drum_caching(dev, -1, drum, seqfd, _seqbuf, _seqbuflen) #else /* !OSSLIB */ # define SEQ_LOAD_GMINSTR(dev, instr) # define SEQ_LOAD_GMDRUM(dev, drum) # define SEQ_USE_EXTBUF() \ EXTERNC unsigned char _seqbuf[]; \ EXTERNC int _seqbuflen;EXTERNC int _seqbufptr #ifndef USE_SIMPLE_MACROS /* Sample seqbuf_dump() implementation: * * SEQ_DEFINEBUF (2048); -- Defines a buffer for 2048 bytes * * int seqfd; -- The file descriptor for /dev/sequencer. * * void * seqbuf_dump () * { * if (_seqbufptr) * if (write (seqfd, _seqbuf, _seqbufptr) == -1) * { * perror ("write /dev/sequencer"); * exit (-1); * } * _seqbufptr = 0; * } */ #define SEQ_DEFINEBUF(len) \ unsigned char _seqbuf[len]; int _seqbuflen = len;int _seqbufptr = 0 #define _SEQ_NEEDBUF(len) \ if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump() #define _SEQ_ADVBUF(len) _seqbufptr += len #define SEQ_DUMPBUF seqbuf_dump #else /* * This variation of the sequencer macros is used just to format one event * using fixed buffer. * * The program using the macro library must define the following macros before * using this library. * * #define _seqbuf name of the buffer (unsigned char[]) * #define _SEQ_ADVBUF(len) If the applic needs to know the exact * size of the event, this macro can be used. * Otherwise this must be defined as empty. * #define _seqbufptr Define the name of index variable or 0 if * not required. */ #define _SEQ_NEEDBUF(len) /* empty */ #endif #endif /* !OSSLIB */ #define SEQ_VOLUME_MODE(dev, mode) \ {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\ _seqbuf[_seqbufptr+1] = SEQ_VOLMODE;\ _seqbuf[_seqbufptr+2] = (dev);\ _seqbuf[_seqbufptr+3] = (mode);\ _seqbuf[_seqbufptr+4] = 0;\ _seqbuf[_seqbufptr+5] = 0;\ _seqbuf[_seqbufptr+6] = 0;\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);} /* * Midi voice messages */ #define _CHN_VOICE(dev, event, chn, note, parm) \ {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_CHN_VOICE;\ _seqbuf[_seqbufptr+1] = (dev);\ _seqbuf[_seqbufptr+2] = (event);\ _seqbuf[_seqbufptr+3] = (chn);\ _seqbuf[_seqbufptr+4] = (note);\ _seqbuf[_seqbufptr+5] = (parm);\ _seqbuf[_seqbufptr+6] = (0);\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);} #define SEQ_START_NOTE(dev, chn, note, vol) \ _CHN_VOICE(dev, MIDI_NOTEON, chn, note, vol) #define SEQ_STOP_NOTE(dev, chn, note, vol) \ _CHN_VOICE(dev, MIDI_NOTEOFF, chn, note, vol) #define SEQ_KEY_PRESSURE(dev, chn, note, pressure) \ _CHN_VOICE(dev, MIDI_KEY_PRESSURE, chn, note, pressure) /* * Midi channel messages */ #define _CHN_COMMON(dev, event, chn, p1, p2, w14) \ {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_CHN_COMMON;\ _seqbuf[_seqbufptr+1] = (dev);\ _seqbuf[_seqbufptr+2] = (event);\ _seqbuf[_seqbufptr+3] = (chn);\ _seqbuf[_seqbufptr+4] = (p1);\ _seqbuf[_seqbufptr+5] = (p2);\ *(short *)&_seqbuf[_seqbufptr+6] = (w14);\ _SEQ_ADVBUF(8);} /* * SEQ_SYSEX permits sending of sysex messages. (It may look that it permits * sending any MIDI bytes but it's absolutely not possible. Trying to do * so _will_ cause problems with MPU401 intelligent mode). * * Sysex messages are sent in blocks of 1 to 6 bytes. Longer messages must be * sent by calling SEQ_SYSEX() several times (there must be no other events * between them). First sysex fragment must have 0xf0 in the first byte * and the last byte (buf[len-1] of the last fragment must be 0xf7. No byte * between these sysex start and end markers cannot be larger than 0x7f. Also * lengths of each fragments (except the last one) must be 6. * * Breaking the above rules may work with some MIDI ports but is likely to * cause fatal problems with some other devices (such as MPU401). */ #define SEQ_SYSEX(dev, buf, len) \ {int ii, ll=(len); \ unsigned char *bufp=buf;\ if (ll>6)ll=6;\ _SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr] = EV_SYSEX;\ _seqbuf[_seqbufptr+1] = (dev);\ for(ii=0;ii>8)&0xff);\ _seqbuf[_seqbufptr+7] = 0;\ _SEQ_ADVBUF(8);} /* * The following 5 macros are incorrectly implemented and obsolete. * Use SEQ_BENDER and SEQ_CONTROL (with proper controller) instead. */ #define SEQ_PITCHBEND(dev, voice, value) \ SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER, value) #define SEQ_BENDER_RANGE(dev, voice, value) \ SEQ_V2_X_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value) #define SEQ_EXPRESSION(dev, voice, value) \ SEQ_CONTROL(dev, voice, CTL_EXPRESSION, value*128) #define SEQ_MAIN_VOLUME(dev, voice, value) \ SEQ_CONTROL(dev, voice, CTL_MAIN_VOLUME, (value*16383)/100) #define SEQ_PANNING(dev, voice, pos) \ SEQ_CONTROL(dev, voice, CTL_PAN, (pos+128) / 2) /* * Timing and syncronization macros */ #define _TIMER_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr+0] = EV_TIMING; \ _seqbuf[_seqbufptr+1] = (ev); \ _seqbuf[_seqbufptr+2] = 0;\ _seqbuf[_seqbufptr+3] = 0;\ *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ _SEQ_ADVBUF(8);} #define SEQ_START_TIMER() _TIMER_EVENT(TMR_START, 0) #define SEQ_STOP_TIMER() _TIMER_EVENT(TMR_STOP, 0) #define SEQ_CONTINUE_TIMER() _TIMER_EVENT(TMR_CONTINUE, 0) #define SEQ_WAIT_TIME(ticks) _TIMER_EVENT(TMR_WAIT_ABS, ticks) #define SEQ_DELTA_TIME(ticks) _TIMER_EVENT(TMR_WAIT_REL, ticks) #define SEQ_ECHO_BACK(key) _TIMER_EVENT(TMR_ECHO, key) #define SEQ_SET_TEMPO(value) _TIMER_EVENT(TMR_TEMPO, value) #define SEQ_SONGPOS(pos) _TIMER_EVENT(TMR_SPP, pos) #define SEQ_TIME_SIGNATURE(sig) _TIMER_EVENT(TMR_TIMESIG, sig) /* * Local control events */ #define _LOCAL_EVENT(ev, parm) {_SEQ_NEEDBUF(8);\ _seqbuf[_seqbufptr+0] = EV_SEQ_LOCAL; \ _seqbuf[_seqbufptr+1] = (ev); \ _seqbuf[_seqbufptr+2] = 0;\ _seqbuf[_seqbufptr+3] = 0;\ *(unsigned int *)&_seqbuf[_seqbufptr+4] = (parm); \ _SEQ_ADVBUF(8);} #define SEQ_PLAYAUDIO(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO, devmask) #define SEQ_PLAYAUDIO2(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO2, devmask) #define SEQ_PLAYAUDIO3(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO3, devmask) #define SEQ_PLAYAUDIO4(devmask) _LOCAL_EVENT(LOCL_STARTAUDIO4, devmask) /* * Events for the level 1 interface only */ #define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\ _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\ _seqbuf[_seqbufptr+1] = (byte);\ _seqbuf[_seqbufptr+2] = (device);\ _seqbuf[_seqbufptr+3] = 0;\ _SEQ_ADVBUF(4);} /* * Patch loading. */ #ifdef OSSLIB # define SEQ_WRPATCH(patchx, len) \ OSS_write_patch(seqfd, (char*)(patchx), len) # define SEQ_WRPATCH2(patchx, len) \ OSS_write_patch2(seqfd, (char*)(patchx), len) #else # define SEQ_WRPATCH(patchx, len) \ {if (_seqbufptr) SEQ_DUMPBUF();\ if (write(seqfd, (char*)(patchx), len)==-1) \ perror("Write patch: /dev/sequencer");} # define SEQ_WRPATCH2(patchx, len) \ (SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len)) #endif #endif #endif /* ifndef DISABLE_SEQUENCER */ /* **************************************************************************** * ioctl commands for the /dev/midi## ****************************************************************************/ #define SNDCTL_MIDI_PRETIME __SIOWR('m', 0, int) #if 0 /* * The SNDCTL_MIDI_MPUMODE and SNDCTL_MIDI_MPUCMD calls * are completely obsolete. The hardware device (MPU-401 "intelligent mode" * and compatibles) has disappeared from the market 10 years ago so there * is no need for this stuff. The MPU-401 "UART" mode devices don't support * this stuff. */ typedef struct { unsigned char cmd; char nr_args, nr_returns; unsigned char data[30]; } mpu_command_rec; #define SNDCTL_MIDI_MPUMODE __SIOWR('m', 1, int) #define SNDCTL_MIDI_MPUCMD __SIOWR('m', 2, mpu_command_rec) #endif /* * SNDCTL_MIDI_MTCINPUT turns on a mode where OSS automatically inserts * MTC quarter frame messages (F1 xx) to the input. * The argument is the MTC mode: * * -1 = Turn MTC messages OFF (default) * 24 = 24 FPS * 25 = 25 FPS * 29 = 30 FPS drop frame * 30 = 30 FPS * * Note that 25 FPS mode is probably the only mode that is supported. Other * modes may be supported in the future versions of OSS, 25 FPS is handy * because it generates 25*4=100 quarter frame messages per second which * matches the usual 100 HZ system timer rate). * * The quarter frame timer will be reset to 0:00:00:00.0 at the moment this * ioctl is made. */ #define SNDCTL_MIDI_MTCINPUT __SIOWR('m', 3, int) /* * MTC/SMPTE time code record (for future use) */ typedef struct { unsigned char hours, minutes, seconds, frames, qframes; char direction; #define MTC_DIR_STOPPED 0 #define MTC_DIR_FORWARD 1 #define MTC_DIR_BACKWARD -1 unsigned char time_code_type; unsigned int flags; } oss_mtc_data_t; #define SNDCTL_MIDI_SETMODE __SIOWR('m', 6, int) # define MIDI_MODE_TRADITIONAL 0 # define MIDI_MODE_TIMED 1 /* Input times are in MIDI ticks */ # define MIDI_MODE_TIMED_ABS 2 /* Input times are absolute (usecs) */ /* * Packet header for MIDI_MODE_TIMED and MIDI_MODE_TIMED_ABS */ typedef unsigned long long oss_midi_time_t; /* Variable type for MIDI time (clock ticks) */ typedef struct { int magic; /* Initialize to MIDI_HDR_MAGIC */ #define MIDI_HDR_MAGIC -1 unsigned short event_type; #define MIDI_EV_WRITE 0 /* Write or read (with payload) */ #define MIDI_EV_TEMPO 1 #define MIDI_EV_ECHO 2 #define MIDI_EV_START 3 #define MIDI_EV_STOP 4 #define MIDI_EV_CONTINUE 5 #define MIDI_EV_XPRESSWRITE 6 #define MIDI_EV_TIMEBASE 7 #define MIDI_EV_DEVCTL 8 /* Device control read/write */ unsigned short options; #define MIDI_OPT_NONE 0x0000 #define MIDI_OPT_TIMED 0x0001 #define MIDI_OPT_CONTINUATION 0x0002 #define MIDI_OPT_USECTIME 0x0004 /* Time is absolute (in usecs) */ #define MIDI_OPT_BUSY 0x0008 /* Reserved for internal use */ oss_midi_time_t time; int parm; int filler[3]; /* Fur future expansion - init to zeros */ } midi_packet_header_t; /* * MIDI_PAYLOAD_SIZE is the maximum size of one MIDI input chunk. It must be * less (or equal) than 1024 which is the read size recommended in the * documentation. TODO: Explain this better. */ #define MIDI_PAYLOAD_SIZE 1000 typedef struct { midi_packet_header_t hdr; unsigned char payload[MIDI_PAYLOAD_SIZE]; } midi_packet_t; #define SNDCTL_MIDI_TIMEBASE __SIOWR('m', 7, int) #define SNDCTL_MIDI_TEMPO __SIOWR('m', 8, int) /* * User land MIDI servers (synths) can use SNDCTL_MIDI_SET_LATENCY * to request MIDI events to be sent to them in advance. The parameter * (in microseconds) tells how much before the events are submitted. * * This feature is only valid for loopback devices and possibly some other * types of virtual devices. */ #define SNDCTL_MIDI_SET_LATENCY __SIOW ('m', 9, int) /* **************************************************************************** * IOCTL commands for /dev/dsp ****************************************************************************/ #define SNDCTL_DSP_HALT __SIO ('P', 0) #define SNDCTL_DSP_RESET SNDCTL_DSP_HALT /* Old name */ #define SNDCTL_DSP_SYNC __SIO ('P', 1) #define SNDCTL_DSP_SPEED __SIOWR('P', 2, int) /* SNDCTL_DSP_STEREO is obsolete - use SNDCTL_DSP_CHANNELS instead */ #define SNDCTL_DSP_STEREO __SIOWR('P', 3, int) /* SNDCTL_DSP_STEREO is obsolete - use SNDCTL_DSP_CHANNELS instead */ #define SNDCTL_DSP_GETBLKSIZE __SIOWR('P', 4, int) #define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT #define SNDCTL_DSP_CHANNELS __SIOWR('P', 6, int) #define SNDCTL_DSP_POST __SIO ('P', 8) #define SNDCTL_DSP_SUBDIVIDE __SIOWR('P', 9, int) #define SNDCTL_DSP_SETFRAGMENT __SIOWR('P',10, int) /* Audio data formats (Note! U8=8 and S16_LE=16 for compatibility) */ #define SNDCTL_DSP_GETFMTS __SIOR ('P',11, int) /* Returns a mask */ #define SNDCTL_DSP_SETFMT __SIOWR('P',5, int) /* Selects ONE fmt */ # define AFMT_QUERY 0x00000000 /* Return current fmt */ # define AFMT_MU_LAW 0x00000001 # define AFMT_A_LAW 0x00000002 # define AFMT_IMA_ADPCM 0x00000004 # define AFMT_U8 0x00000008 # define AFMT_S16_LE 0x00000010 /* Little endian signed 16 */ # define AFMT_S16_BE 0x00000020 /* Big endian signed 16 */ # define AFMT_S8 0x00000040 # define AFMT_U16_LE 0x00000080 /* Little endian U16 */ # define AFMT_U16_BE 0x00000100 /* Big endian U16 */ # define AFMT_MPEG 0x00000200 /* MPEG (2) audio */ /* AC3 _compressed_ bitstreams (See Programmer's Guide for details). */ # define AFMT_AC3 0x00000400 /* Ogg Vorbis _compressed_ bit streams */ # define AFMT_VORBIS 0x00000800 /* 32 bit formats (MSB aligned) formats */ # define AFMT_S32_LE 0x00001000 # define AFMT_S32_BE 0x00002000 /* Reserved for _native_ endian double precision IEEE floating point */ # define AFMT_FLOAT 0x00004000 /* 24 bit formats (LSB aligned in 32 bit word) formats */ # define AFMT_S24_LE 0x00008000 # define AFMT_S24_BE 0x00010000 /* * S/PDIF raw format. In this format the S/PDIF frames (including all * control and user bits) are included in the data stream. Each sample * is stored in a 32 bit frame (see IEC-958 for more info). This format * is supported by very few devices and it's only usable for purposes * where full access to the control/user bits is required (real time control). */ # define AFMT_SPDIF_RAW 0x00020000 /* 24 bit packed (3 byte) little endian format (USB compatibility) */ # define AFMT_S24_PACKED 0x00040000 /* * Some big endian/little endian handling macros (native endian and opposite * endian formats). The usage of these macros is described in the OSS * Programmer's Manual. */ #if defined(_AIX) || defined(AIX) || defined(sparc) || defined(__hppa) || defined(PPC) || defined(__powerpc__) && !defined(i386) && !defined(__i386) && !defined(__i386__) /* Big endian machines */ # define _PATCHKEY(id) (0xfd00|id) # define AFMT_S16_NE AFMT_S16_BE # define AFMT_U16_NE AFMT_U16_BE # define AFMT_S32_NE AFMT_S32_BE # define AFMT_S24_NE AFMT_S24_BE # define AFMT_S16_OE AFMT_S16_LE # define AFMT_S32_OE AFMT_S32_LE # define AFMT_S24_OE AFMT_S24_LE #else # define _PATCHKEY(id) ((id<<8)|0xfd) # define AFMT_S16_NE AFMT_S16_LE # define AFMT_U16_NE AFMT_U16_LE # define AFMT_S32_NE AFMT_S32_LE # define AFMT_S24_NE AFMT_S24_LE # define AFMT_S16_OE AFMT_S16_BE # define AFMT_S32_OE AFMT_S32_BE # define AFMT_S24_OE AFMT_S24_BE #endif /* * Buffer status queries. */ typedef struct audio_buf_info { int fragments; /* # of available fragments (partially usend ones not counted) */ int fragstotal; /* Total # of fragments allocated */ int fragsize; /* Size of a fragment in bytes */ int bytes; /* Available space in bytes (includes partially used fragments) */ /* Note! 'bytes' could be more than fragments*fragsize */ } audio_buf_info; #define SNDCTL_DSP_GETOSPACE __SIOR ('P',12, audio_buf_info) #define SNDCTL_DSP_GETISPACE __SIOR ('P',13, audio_buf_info) #define SNDCTL_DSP_GETCAPS __SIOR ('P',15, int) # define PCM_CAP_REVISION 0x000000ff /* Bits for revision level (0 to 255) */ # define PCM_CAP_DUPLEX 0x00000100 /* Full duplex record/playback */ # define PCM_CAP_REALTIME 0x00000200 /* Not in use */ # define PCM_CAP_BATCH 0x00000400 /* Device has some kind of */ /* internal buffers which may */ /* cause some delays and */ /* decrease precision of timing */ # define PCM_CAP_COPROC 0x00000800 /* Has a coprocessor */ /* Sometimes it's a DSP */ /* but usually not */ # define PCM_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */ # define PCM_CAP_MMAP 0x00002000 /* Supports mmap() */ # define PCM_CAP_MULTI 0x00004000 /* Supports multiple open */ # define PCM_CAP_BIND 0x00008000 /* Supports binding to front/rear/center/lfe */ # define PCM_CAP_INPUT 0x00010000 /* Supports recording */ # define PCM_CAP_OUTPUT 0x00020000 /* Supports playback */ # define PCM_CAP_VIRTUAL 0x00040000 /* Virtuial device */ /* 0x00040000 and 0x00080000 reserved for future use */ /* Analog/digital control capabilities */ # define PCM_CAP_ANALOGOUT 0x00100000 # define PCM_CAP_ANALOGIN 0x00200000 # define PCM_CAP_DIGITALOUT 0x00400000 # define PCM_CAP_DIGITALIN 0x00800000 # define PCM_CAP_ADMASK 0x00f00000 /* * NOTE! (capabilities & PCM_CAP_ADMASK)==0 means just that the * digital/analog interface control features are not supported by the * device/driver. However the device still supports analog, digital or * both inputs/outputs (depending on the device). See the OSS Programmer's * Guide for full details. */ # define PCM_CAP_SHADOW 0x01000000 /* "Shadow" device */ /* * Preferred channel usage. These bits can be used to * give recommendations to the application. Used by few drivers. * For example if ((caps & DSP_CH_MASK) == DSP_CH_MONO) means that * the device works best in mono mode. However it doesn't necessarily mean * that the device cannot be used in stereo. These bits should only be used * special applications such as multi track hard disk recorders to find out * the initial setup. However the user should be able to override this * selection. * * To find out which modes are actually supported the application should * try to select them using SNDCTL_DSP_CHANNELS. */ # define DSP_CH_MASK 0x06000000 /* Mask */ # define DSP_CH_ANY 0x00000000 /* No preferred mode */ # define DSP_CH_MONO 0x02000000 # define DSP_CH_STEREO 0x04000000 # define DSP_CH_MULTI 0x06000000 /* More than two channels */ # define PCM_CAP_HIDDEN 0x08000000 /* Hidden device */ # define PCM_CAP_FREERATE 0x10000000 # define PCM_CAP_MODEM 0x20000000 /* Modem device */ # define PCM_CAP_DEFAULT 0x40000000 /* "Default" device */ /* * The PCM_CAP_* capability names were known as DSP_CAP_* prior OSS 4.0 * so it's necessary to define the older names too. */ #define DSP_CAP_ADMASK PCM_CAP_ADMASK #define DSP_CAP_ANALOGIN PCM_CAP_ANALOGIN #define DSP_CAP_ANALOGOUT PCM_CAP_ANALOGOUT #define DSP_CAP_BATCH PCM_CAP_BATCH #define DSP_CAP_BIND PCM_CAP_BIND #define DSP_CAP_COPROC PCM_CAP_COPROC #define DSP_CAP_DEFAULT PCM_CAP_DEFAULT #define DSP_CAP_DIGITALIN PCM_CAP_DIGITALIN #define DSP_CAP_DIGITALOUT PCM_CAP_DIGITALOUT #define DSP_CAP_DUPLEX PCM_CAP_DUPLEX #define DSP_CAP_FREERATE PCM_CAP_FREERATE #define DSP_CAP_HIDDEN PCM_CAP_HIDDEN #define DSP_CAP_INPUT PCM_CAP_INPUT #define DSP_CAP_MMAP PCM_CAP_MMAP #define DSP_CAP_MODEM PCM_CAP_MODEM #define DSP_CAP_MULTI PCM_CAP_MULTI #define DSP_CAP_OUTPUT PCM_CAP_OUTPUT #define DSP_CAP_REALTIME PCM_CAP_REALTIME #define DSP_CAP_REVISION PCM_CAP_REVISION #define DSP_CAP_SHADOW PCM_CAP_SHADOW #define DSP_CAP_TRIGGER PCM_CAP_TRIGGER #define DSP_CAP_VIRTUAL PCM_CAP_VIRTUAL #define SNDCTL_DSP_GETTRIGGER __SIOR ('P',16, int) #define SNDCTL_DSP_SETTRIGGER __SIOW ('P',16, int) # define PCM_ENABLE_INPUT 0x00000001 # define PCM_ENABLE_OUTPUT 0x00000002 typedef struct count_info { unsigned int bytes; /* Total # of bytes processed */ int blocks; /* # of fragment transitions since last time */ int ptr; /* Current DMA pointer value */ } count_info; #define SNDCTL_DSP_GETIPTR __SIOR ('P',17, count_info) #define SNDCTL_DSP_GETOPTR __SIOR ('P',18, count_info) typedef struct buffmem_desc { unsigned *buffer; int size; } buffmem_desc; #define SNDCTL_DSP_SETSYNCRO __SIO ('P', 21) #define SNDCTL_DSP_SETDUPLEX __SIO ('P', 22) #define SNDCTL_DSP_PROFILE __SIOW ('P', 23, int) /* OBSOLETE */ #define APF_NORMAL 0 /* Normal applications */ #define APF_NETWORK 1 /* Underruns probably caused by an "external" delay */ #define APF_CPUINTENS 2 /* Underruns probably caused by "overheating" the CPU */ #define SNDCTL_DSP_GETODELAY __SIOR ('P', 23, int) typedef struct audio_errinfo { int play_underruns; int rec_overruns; unsigned int play_ptradjust; unsigned int rec_ptradjust; int play_errorcount; int rec_errorcount; int play_lasterror; int rec_lasterror; int play_errorparm; int rec_errorparm; int filler[16]; } audio_errinfo; #define SNDCTL_DSP_GETPLAYVOL __SIOR ('P', 24, int) #define SNDCTL_DSP_SETPLAYVOL __SIOWR('P', 24, int) #define SNDCTL_DSP_GETERROR __SIOR ('P', 25, audio_errinfo) /* **************************************************************************** * Digital interface (S/PDIF) control interface */ typedef struct oss_digital_control { unsigned int caps; #define DIG_CBITIN_NONE 0x00000000 #define DIG_CBITIN_LIMITED 0x00000001 #define DIG_CBITIN_DATA 0x00000002 #define DIG_CBITIN_BYTE0 0x00000004 #define DIG_CBITIN_FULL 0x00000008 #define DIG_CBITIN_MASK 0x0000000f #define DIG_CBITOUT_NONE 0x00000000 #define DIG_CBITOUT_LIMITED 0x00000010 #define DIG_CBITOUT_BYTE0 0x00000020 #define DIG_CBITOUT_FULL 0x00000040 #define DIG_CBITOUT_DATA 0x00000080 #define DIG_CBITOUT_MASK 0x000000f0 #define DIG_UBITIN 0x00000100 #define DIG_UBITOUT 0x00000200 #define DIG_VBITOUT 0x00000400 #define DIG_OUTRATE 0x00000800 #define DIG_INRATE 0x00001000 #define DIG_INBITS 0x00002000 #define DIG_OUTBITS 0x00004000 #define DIG_EXACT 0x00010000 #define DIG_PRO 0x00020000 #define DIG_CONSUMER 0x00040000 #define DIG_PASSTHROUGH 0x00080000 #define DIG_OUTSEL 0x00100000 unsigned int valid; #define VAL_CBITIN 0x00000001 #define VAL_UBITIN 0x00000002 #define VAL_CBITOUT 0x00000004 #define VAL_UBITOUT 0x00000008 #define VAL_ISTATUS 0x00000010 #define VAL_IRATE 0x00000020 #define VAL_ORATE 0x00000040 #define VAL_INBITS 0x00000080 #define VAL_OUTBITS 0x00000100 #define VAL_REQUEST 0x00000200 #define VAL_OUTSEL 0x00000400 #define VAL_OUTMASK (VAL_CBITOUT|VAL_UBITOUT|VAL_ORATE|VAL_OUTBITS|VAL_OUTSEL) unsigned int request, param; #define SPD_RQ_PASSTHROUGH 1 unsigned char cbitin[24]; unsigned char ubitin[24]; unsigned char cbitout[24]; unsigned char ubitout[24]; unsigned int outsel; #define OUTSEL_DIGITAL 1 #define OUTSEL_ANALOG 2 #define OUTSEL_BOTH (OUTSEL_DIGITAL|OUTSEL_ANALOG) int in_data; /* Audio/data if autodetectable by the receiver */ #define IND_UNKNOWN 0 #define IND_AUDIO 1 #define IND_DATA 2 int in_locked; /* Receiver locked */ #define LOCK_NOT_INDICATED 0 #define LOCK_UNLOCKED 1 #define LOCK_LOCKED 2 int in_quality; /* Input signal quality */ #define IN_QUAL_NOT_INDICATED 0 #define IN_QUAL_POOR 1 #define IN_QUAL_GOOD 2 int in_vbit, out_vbit; /* V bits */ #define VBIT_NOT_INDICATED 0 #define VBIT_OFF 1 #define VBIT_ON 2 unsigned int in_errors; /* Various input errro conditions */ #define INERR_CRC 0x0001 #define INERR_QCODE_CRC 0x0002 #define INERR_PARITY 0x0004 #define INERR_BIPHASE 0x0008 int srate_in, srate_out; int bits_in, bits_out; int filler[32]; } oss_digital_control; #define SNDCTL_DSP_READCTL __SIOWR('P', 26, oss_digital_control) #define SNDCTL_DSP_WRITECTL __SIOWR('P', 27, oss_digital_control) /* **************************************************************************** * Sync groups for audio devices */ typedef struct oss_syncgroup { int id; int mode; int filler[16]; } oss_syncgroup; #define SNDCTL_DSP_SYNCGROUP __SIOWR('P', 28, oss_syncgroup) #define SNDCTL_DSP_SYNCSTART __SIOW ('P', 29, int) /* ************************************************************************** * "cooked" mode enables software based conversions for sample rate, sample * format (bits) and number of channels (mono/stereo). These conversions are * required with some devices that support only one sample rate or just stereo * to let the applications to use other formats. The cooked mode is enabled by * default. However it's necessary to disable this mode when mmap() is used or * when very deterministic timing is required. SNDCTL_DSP_COOKEDMODE is an * optional call introduced in OSS 3.9.6f. It's _error return must be ignored_ * since normally this call will return erno=EINVAL. * * SNDCTL_DSP_COOKEDMODE must be called immediately after open before doing * anything else. Otherwise the call will not have any effect. */ #define SNDCTL_DSP_COOKEDMODE __SIOW ('P', 30, int) /* ************************************************************************** * SNDCTL_DSP_SILENCE and SNDCTL_DSP_SKIP are new calls in OSS 3.99.0 * that can be used to implement pause/continue during playback (no effect * on recording). */ #define SNDCTL_DSP_SILENCE __SIO ('P', 31) #define SNDCTL_DSP_SKIP __SIO ('P', 32) /* **************************************************************************** * Abort transfer (reset) functions for input and output */ #define SNDCTL_DSP_HALT_INPUT __SIO ('P', 33) #define SNDCTL_DSP_RESET_INPUT SNDCTL_DSP_HALT_INPUT /* Old name */ #define SNDCTL_DSP_HALT_OUTPUT __SIO ('P', 34) #define SNDCTL_DSP_RESET_OUTPUT SNDCTL_DSP_HALT_OUTPUT /* Old name */ /* **************************************************************************** * Low water level control */ #define SNDCTL_DSP_LOW_WATER __SIOW ('P', 34, int) /* **************************************************************************** * 64 bit pointer support. Only available in environments that support * the 64 bit (long long) integer type. */ #ifndef OSS_NO_LONG_LONG typedef struct { long long samples; int fifo_samples; int filler[32]; /* For future use */ } oss_count_t; #define SNDCTL_DSP_CURRENT_IPTR __SIOR ('P', 35, oss_count_t) #define SNDCTL_DSP_CURRENT_OPTR __SIOR ('P', 36, oss_count_t) #endif /* **************************************************************************** * Interface for selecting recording sources and playback output routings. */ #define SNDCTL_DSP_GET_RECSRC_NAMES __SIOR ('P', 37, oss_mixer_enuminfo) #define SNDCTL_DSP_GET_RECSRC __SIOR ('P', 38, int) #define SNDCTL_DSP_SET_RECSRC __SIOWR('P', 38, int) #define SNDCTL_DSP_GET_PLAYTGT_NAMES __SIOR ('P', 39, oss_mixer_enuminfo) #define SNDCTL_DSP_GET_PLAYTGT __SIOR ('P', 40, int) #define SNDCTL_DSP_SET_PLAYTGT __SIOWR('P', 40, int) #define SNDCTL_DSP_GETRECVOL __SIOR ('P', 41, int) #define SNDCTL_DSP_SETRECVOL __SIOWR('P', 41, int) /* *************************************************************************** * Some calls for setting the channel assignment with multi channel devices * (see the manual for details). */ #ifndef OSS_NO_LONG_LONG #define SNDCTL_DSP_GET_CHNORDER __SIOR ('P', 42, unsigned long long) #define SNDCTL_DSP_SET_CHNORDER __SIOWR('P', 42, unsigned long long) # define CHID_UNDEF 0 # define CHID_L 1 # define CHID_R 2 # define CHID_C 3 # define CHID_LFE 4 # define CHID_LS 5 # define CHID_RS 6 # define CHID_LR 7 # define CHID_RR 8 #define CHNORDER_UNDEF 0x0000000000000000ULL #define CHNORDER_NORMAL 0x0000000087654321ULL #endif #define MAX_PEAK_CHANNELS 128 typedef unsigned short oss_peaks_t[MAX_PEAK_CHANNELS]; #define SNDCTL_DSP_GETIPEAKS __SIOR('P', 43, oss_peaks_t) #define SNDCTL_DSP_GETOPEAKS __SIOR('P', 44, oss_peaks_t) #define SNDCTL_DSP_POLICY __SIOW('P', 45, int) /* See the manual */ /* **************************************************************************** * Few ioctl calls that are not official parts of OSS. They have been used * by few freeware implementations of OSS. */ #define SNDCTL_DSP_GETCHANNELMASK __SIOWR('P', 64, int) #define SNDCTL_DSP_BIND_CHANNEL __SIOWR('P', 65, int) # define DSP_BIND_QUERY 0x00000000 # define DSP_BIND_FRONT 0x00000001 # define DSP_BIND_SURR 0x00000002 # define DSP_BIND_CENTER_LFE 0x00000004 # define DSP_BIND_HANDSET 0x00000008 # define DSP_BIND_MIC 0x00000010 # define DSP_BIND_MODEM1 0x00000020 # define DSP_BIND_MODEM2 0x00000040 # define DSP_BIND_I2S 0x00000080 # define DSP_BIND_SPDIF 0x00000100 # define DSP_BIND_REAR 0x00000200 #ifndef NO_LEGACY_MIXER /* **************************************************************************** * IOCTL commands for the "legacy " /dev/mixer API (obsolete) * * Mixer controls * * There can be up to 20 different analog mixer channels. The * SOUND_MIXER_NRDEVICES gives the currently supported maximum. * The SOUND_MIXER_READ_DEVMASK returns a bitmask which tells * the devices supported by the particular mixer. * * {!notice This "legacy" mixer API is obsolete. It has been superceded * by a new one (see below). */ #define SOUND_MIXER_NRDEVICES 28 #define SOUND_MIXER_VOLUME 0 #define SOUND_MIXER_BASS 1 #define SOUND_MIXER_TREBLE 2 #define SOUND_MIXER_SYNTH 3 #define SOUND_MIXER_PCM 4 #define SOUND_MIXER_SPEAKER 5 #define SOUND_MIXER_LINE 6 #define SOUND_MIXER_MIC 7 #define SOUND_MIXER_CD 8 #define SOUND_MIXER_IMIX 9 /* Recording monitor */ #define SOUND_MIXER_ALTPCM 10 #define SOUND_MIXER_RECLEV 11 /* Recording level */ #define SOUND_MIXER_IGAIN 12 /* Input gain */ #define SOUND_MIXER_OGAIN 13 /* Output gain */ /* * Some soundcards have three line level inputs (line, aux1 and aux2). * Since each card manufacturer has assigned different meanings to * these inputs, it's impractical to assign specific meanings * (eg line, cd, synth etc.) to them. */ #define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */ #define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */ #define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */ #define SOUND_MIXER_DIGITAL1 17 /* Digital I/O 1 */ #define SOUND_MIXER_DIGITAL2 18 /* Digital I/O 2 */ #define SOUND_MIXER_DIGITAL3 19 /* Digital I/O 3 */ #define SOUND_MIXER_PHONE 20 /* Phone */ #define SOUND_MIXER_MONO 21 /* Mono Output */ #define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */ #define SOUND_MIXER_RADIO 23 /* Radio in */ #define SOUND_MIXER_DEPTH 24 /* Surround depth */ #define SOUND_MIXER_REARVOL 25 /* Rear/Surround speaker vol */ #define SOUND_MIXER_CENTERVOL 26 /* Center/LFE speaker vol */ #define SOUND_MIXER_SIDEVOL 27 /* Side-Surround (8speaker) vol */ /* * Warning: SOUND_MIXER_SURRVOL is an old name of SOUND_MIXER_SIDEVOL. * They are both assigned to the same mixer control. Don't * use both control names in the same program/driver. */ #define SOUND_MIXER_SURRVOL SOUND_MIXER_SIDEVOL /* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */ /* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */ #define SOUND_ONOFF_MIN 28 #define SOUND_ONOFF_MAX 30 /* Note! Number 31 cannot be used since the sign bit is reserved */ #define SOUND_MIXER_NONE 31 /* * The following unsupported macros are no longer functional. * Use SOUND_MIXER_PRIVATE# macros in future. */ #define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE #define SOUND_MIXER_MUTE SOUND_MIXER_NONE #define SOUND_MIXER_LOUD SOUND_MIXER_NONE #define SOUND_DEVICE_LABELS \ {"Vol ", "Bass ", "Treble", "Synth", "Pcm ", "Speaker ", "Line ", \ "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \ "Aux1", "Aux2", "Aux3", "Digital1", "Digital2", "Digital3", \ "Phone", "Mono", "Video", "Radio", "Depth", \ "Rear", "Center", "Side"} #define SOUND_DEVICE_NAMES \ {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \ "aux1", "aux2", "aux3", "dig1", "dig2", "dig3", \ "phone", "mono", "video", "radio", "depth", \ "rear", "center", "side"} /* Device bitmask identifiers */ #define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */ #define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */ #define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */ #define SOUND_MIXER_CAPS 0xfc # define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */ # define SOUND_CAP_NOLEGACY 0x00000004 /* For internal use only */ # define SOUND_CAP_NORECSRC 0x00000008 #define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ /* OSS/Free ONLY */ #define SOUND_MIXER_OUTSRC 0xfa /* Arg contains a bit for each input source to output */ #define SOUND_MIXER_OUTMASK 0xf9 /* Arg contains a bit for each supported input source to output */ /* OSS/Free ONLY */ /* Device mask bits */ #define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) #define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) #define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) #define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) #define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) #define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) #define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) #define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) #define SOUND_MASK_CD (1 << SOUND_MIXER_CD) #define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) #define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) #define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) #define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN) #define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN) #define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1) #define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2) #define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3) #define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1) #define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2) #define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3) #define SOUND_MASK_MONO (1 << SOUND_MIXER_MONO) #define SOUND_MASK_PHONE (1 << SOUND_MIXER_PHONE) #define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO) #define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO) #define SOUND_MASK_DEPTH (1 << SOUND_MIXER_DEPTH) #define SOUND_MASK_REARVOL (1 << SOUND_MIXER_REARVOL) #define SOUND_MASK_CENTERVOL (1 << SOUND_MIXER_CENTERVOL) #define SOUND_MASK_SIDEVOL (1 << SOUND_MIXER_SIDEVOL) /* Note! SOUND_MASK_SURRVOL is alias of SOUND_MASK_SIDEVOL */ #define SOUND_MASK_SURRVOL (1 << SOUND_MIXER_SIDEVOL) /* Obsolete macros */ #define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) #define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) #define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) #define MIXER_READ(dev) __SIOR('M', dev, int) #define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) #define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) #define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) #define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) #define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) #define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) #define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) #define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) #define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) #define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) #define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) #define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) #define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN) #define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN) #define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1) #define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2) #define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3) /* Obsolete macros */ #define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) #define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) #define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) #define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) #define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) #define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) #define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) #define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) #define MIXER_WRITE(dev) __SIOWR('M', dev, int) #define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) #define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) #define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) #define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) #define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) #define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) #define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) #define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) #define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) #define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) #define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) #define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) #define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN) #define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN) #define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1) #define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2) #define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3) /* Obsolete macros */ #define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) #define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) #define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) #define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) typedef struct mixer_info /* OBSOLETE */ { char id[16]; char name[32]; int modify_counter; int card_number; int port_number; char handle[32]; } mixer_info; /* SOUND_MIXER_INFO is obsolete - use SNDCTL_MIXERINFO instead */ #define SOUND_MIXER_INFO __SIOR ('M', 101, mixer_info) /* * Two ioctls for special souncard function (OSS/Free only) */ #define SOUND_MIXER_AGC _SIOWR('M', 103, int) #define SOUND_MIXER_3DSE _SIOWR('M', 104, int) /* * The SOUND_MIXER_PRIVATE# commands can be redefined by low level drivers. * These features can be used when accessing device specific features. */ #define SOUND_MIXER_PRIVATE1 __SIOWR('M', 111, int) #define SOUND_MIXER_PRIVATE2 __SIOWR('M', 112, int) #define SOUND_MIXER_PRIVATE3 __SIOWR('M', 113, int) #define SOUND_MIXER_PRIVATE4 __SIOWR('M', 114, int) #define SOUND_MIXER_PRIVATE5 __SIOWR('M', 115, int) /* The following two controls were never implemented and they should not be used. */ #define SOUND_MIXER_READ_MAINVOL __SIOR ('M', 116, int) #define SOUND_MIXER_WRITE_MAINVOL __SIOWR('M', 116, int) /* * SOUND_MIXER_GETLEVELS and SOUND_MIXER_SETLEVELS calls can be used * for querying current mixer settings from the driver and for loading * default volume settings _prior_ activating the mixer (loading * doesn't affect current state of the mixer hardware). These calls * are for internal use by the driver software only. */ typedef struct mixer_vol_table { int num; /* Index to volume table */ char name[32]; int levels[32]; } mixer_vol_table; #define SOUND_MIXER_GETLEVELS __SIOWR('M', 116, mixer_vol_table) #define SOUND_MIXER_SETLEVELS __SIOWR('M', 117, mixer_vol_table) #define OSS_GETVERSION __SIOR ('M', 118, int) /* * Calls to set/get the recording gain for the currently active * recording source. These calls automatically map to the right control. * Note that these calls are not supported by all drivers. In this case * the call will return -1 with errno set to EINVAL * * The _MONGAIN work in similar way but set/get the monitoring gain for * the currently selected recording source. */ #define SOUND_MIXER_READ_RECGAIN __SIOR ('M', 119, int) #define SOUND_MIXER_WRITE_RECGAIN __SIOWR('M', 119, int) #define SOUND_MIXER_READ_MONGAIN __SIOR ('M', 120, int) #define SOUND_MIXER_WRITE_MONGAIN __SIOWR('M', 120, int) /* The following call is for driver development time purposes. It's not * present in any released drivers. */ typedef unsigned char oss_reserved_t[512]; #define SOUND_MIXER_RESERVED __SIOWR('M', 121, oss_reserved_t) #endif /* ifndef NO_LEGACY_MIXER */ /* ************************************************************************* * The "new" mixer API of OSS 4.0 and later. * * This improved mixer API makes it possible to access every possible feature * of every possible device. However you should read the mixer programming * section of the OSS API Developer's Manual. There is no chance that you * could use this interface correctly just by examining this header. */ typedef struct oss_sysinfo { char product[32]; /* For example OSS/Free, OSS/Linux or OSS/Solaris */ char version[32]; /* For example 4.0a */ int versionnum; /* See OSS_GETVERSION */ char options[128]; /* Reserved */ int numaudios; /* # of audio/dsp devices */ int openedaudio[8]; /* Bit mask telling which audio devices are busy */ int numsynths; /* # of availavle synth devices */ int nummidis; /* # of available MIDI ports */ int numtimers; /* # of available timer devices */ int nummixers; /* # of mixer devices */ int openedmidi[8]; /* Bit mask telling which midi devices are busy */ int numcards; /* Number of sound cards in the system */ int numaudioengines; /* Number of audio engines in the system */ int filler[240]; /* For future expansion (set to -1) */ } oss_sysinfo; typedef struct oss_mixext { int dev; /* Mixer device number */ int ctrl; /* Controller number */ int type; /* Entry type */ # define MIXT_DEVROOT 0 /* Device root entry */ # define MIXT_GROUP 1 /* Controller group */ # define MIXT_ONOFF 2 /* OFF (0) or ON (1) */ # define MIXT_ENUM 3 /* Enumerated (0 to maxvalue) */ # define MIXT_MONOSLIDER 4 /* Mono slider (0 to 255) */ # define MIXT_STEREOSLIDER 5 /* Stereo slider (dual 0 to 255) */ # define MIXT_MESSAGE 6 /* (Readable) textual message */ # define MIXT_MONOVU 7 /* VU meter value (mono) */ # define MIXT_STEREOVU 8 /* VU meter value (stereo) */ # define MIXT_MONOPEAK 9 /* VU meter peak value (mono) */ # define MIXT_STEREOPEAK 10 /* VU meter peak value (stereo) */ # define MIXT_RADIOGROUP 11 /* Radio button group */ # define MIXT_MARKER 12 /* Separator between normal and extension entries */ # define MIXT_VALUE 13 /* Decimal value entry */ # define MIXT_HEXVALUE 14 /* Hexadecimal value entry */ # define MIXT_MONODB 15 /* OBSOLETE */ # define MIXT_STEREODB 16 /* OBSOLETE */ # define MIXT_SLIDER 17 /* Slider (mono) with full (31 bit) postitive integer range */ # define MIXT_3D 18 /* * Sliders with range expanded to 15 bits per channel (0-32767) */ # define MIXT_MONOSLIDER16 19 # define MIXT_STEREOSLIDER16 20 /* Possible value range (minvalue to maxvalue) */ /* Note that maxvalue may also be smaller than minvalue */ int maxvalue; int minvalue; int flags; # define MIXF_READABLE 0x00000001 /* Has readable value */ # define MIXF_WRITEABLE 0x00000002 /* Has writeable value */ # define MIXF_POLL 0x00000004 /* May change itself */ # define MIXF_HZ 0x00000008 /* Herz scale */ # define MIXF_STRING 0x00000010 /* Use dynamic extensions for value */ # define MIXF_DYNAMIC 0x00000010 /* Supports dynamic extensions */ # define MIXF_OKFAIL 0x00000020 /* Interpret value as 1=OK, 0=FAIL */ # define MIXF_FLAT 0x00000040 /* Flat vertical space requirements */ # define MIXF_LEGACY 0x00000080 /* Legacy mixer control group */ # define MIXF_CENTIBEL 0x00000100 /* Centibel (0.1 dB) step size */ # define MIXF_DECIBEL 0x00000200 /* Step size of 1 dB */ # define MIXF_MAINVOL 0x00000400 /* Main volume control */ # define MIXF_PCMVOL 0x00000800 /* PCM output volume control */ # define MIXF_RECVOL 0x00001000 /* PCM recording volume control */ char id[16]; /* Mnemonic ID (mainly for internal use) */ int parent; /* Entry# of parent (group) node (-1 if root) */ int dummy; /* Internal use */ int timestamp; char data[64]; /* Misc data (entry type dependent) */ unsigned char enum_present[32]; /* Mask of allowed enum values */ int control_no; /* SOUND_MIXER_VOLUME..SOUND_MIXER_MIDI */ /* (-1 means not indicated) */ /* * The desc field is reserved for internal purposes of OSS. It should not be * used by applications. */ unsigned int desc; #define MIXEXT_SCOPE_MASK 0x0000003f #define MIXEXT_SCOPE_OTHER 0x00000000 #define MIXEXT_SCOPE_INPUT 0x00000001 #define MIXEXT_SCOPE_OUTPUT 0x00000002 #define MIXEXT_SCOPE_MONITOR 0x00000003 #define MIXEXT_SCOPE_RECSWITCH 0x00000004 char extname[32]; int update_counter; int filler[7]; } oss_mixext; typedef struct oss_mixext_root { char id[16]; char name[48]; } oss_mixext_root; typedef struct oss_mixer_value { int dev; int ctrl; int value; int flags; /* Reserved for future use. Initialize to 0 */ int timestamp; /* Must be set to oss_mixext.timestamp */ int filler[8]; /* Reserved for future use. Initialize to 0 */ } oss_mixer_value; #define OSS_ENUM_MAXVALUE 255 typedef struct oss_mixer_enuminfo { int dev; int ctrl; int nvalues; int version; /* Read the manual */ short strindex[OSS_ENUM_MAXVALUE]; char strings[3000]; } oss_mixer_enuminfo; #define OPEN_READ PCM_ENABLE_INPUT #define OPEN_WRITE PCM_ENABLE_OUTPUT #define OPEN_READWRITE (OPEN_READ|OPEN_WRITE) typedef struct oss_audioinfo { int dev; /* Audio device number */ char name[64]; int busy; /* 0, OPEN_READ, OPEN_WRITE or OPEN_READWRITE */ int pid; int caps; /* PCM_CAP_INPUT, PCM_CAP_OUTPUT */ int iformats, oformats; int magic; /* Reserved for internal use */ char cmd[64]; /* Command using the device (if known) */ int card_number; int port_number; int mixer_dev; int legacy_device; /* Obsolete field. Replaced by devnode */ int enabled; /* 1=enabled, 0=device not ready at this moment */ int flags; /* For internal use only - no practical meaning */ int min_rate, max_rate; /* Sample rate limits */ int min_channels, max_channels; /* Number of channels supported */ int binding; /* DSP_BIND_FRONT, etc. 0 means undefined */ int rate_source; char handle[32]; #define OSS_MAX_SAMPLE_RATES 20 /* Cannot be changed */ unsigned int nrates, rates[OSS_MAX_SAMPLE_RATES]; /* Please read the manual before using these */ oss_longname_t song_name; /* Song name (if given) */ oss_label_t label; /* Device label (if given) */ int latency; /* In usecs, -1=unknown */ oss_devnode_t devnode; /* Device special file name (absolute path) */ int next_play_engine; /* Read the documentation for more info */ int next_rec_engine; /* Read the documentation for more info */ int filler[184]; } oss_audioinfo; typedef struct oss_mixerinfo { int dev; char id[16]; char name[32]; int modify_counter; int card_number; int port_number; char handle[32]; int magic; /* Reserved */ int enabled; /* Reserved */ int caps; #define MIXER_CAP_VIRTUAL 0x00000001 #define MIXER_CAP_LAYOUT_B 0x00000002 /* For internal use only */ #define MIXER_CAP_NARROW 0x00000004 /* Conserve horiz space */ int flags; /* Reserved */ int nrext; /* * The priority field can be used to select the default (motherboard) * mixer device. The mixer with the highest priority is the * most preferred one. -2 or less means that this device cannot be used * as the default mixer. */ int priority; oss_devnode_t devnode; /* Device special file name (absolute path) */ int legacy_device; int filler[245]; /* Reserved */ } oss_mixerinfo; typedef struct oss_midi_info { int dev; /* Midi device number */ char name[64]; int busy; /* 0, OPEN_READ, OPEN_WRITE or OPEN_READWRITE */ int pid; char cmd[64]; /* Command using the device (if known) */ int caps; #define MIDI_CAP_MPU401 0x00000001 /**** OBSOLETE ****/ #define MIDI_CAP_INPUT 0x00000002 #define MIDI_CAP_OUTPUT 0x00000004 #define MIDI_CAP_INOUT (MIDI_CAP_INPUT|MIDI_CAP_OUTPUT) #define MIDI_CAP_VIRTUAL 0x00000008 /* Pseudo device */ #define MIDI_CAP_MTCINPUT 0x00000010 /* Supports SNDCTL_MIDI_MTCINPUT */ #define MIDI_CAP_CLIENT 0x00000020 /* Virtual client side device */ #define MIDI_CAP_SERVER 0x00000040 /* Virtual server side device */ #define MIDI_CAP_INTERNAL 0x00000080 /* Internal (synth) device */ #define MIDI_CAP_EXTERNAL 0x00000100 /* external (MIDI port) device */ #define MIDI_CAP_PTOP 0x00000200 /* Point to point link to one device */ #define MIDI_CAP_MTC 0x00000400 /* MTC/SMPTE (control) device */ int magic; /* Reserved for internal use */ int card_number; int port_number; int enabled; /* 1=enabled, 0=device not ready at this moment */ int flags; /* For internal use only - no practical meaning */ char handle[32]; oss_longname_t song_name; /* Song name (if known) */ oss_label_t label; /* Device label (if given) */ int latency; /* In usecs, -1=unknown */ oss_devnode_t devnode; /* Device special file name (absolute path) */ int legacy_device; /* Legacy device mapping */ int filler[235]; } oss_midi_info; typedef struct oss_card_info { int card; char shortname[16]; char longname[128]; int flags; int filler[256]; } oss_card_info; #define SNDCTL_SYSINFO __SIOR ('X', 1, oss_sysinfo) #define OSS_SYSINFO SNDCTL_SYSINFO /* Old name */ #define SNDCTL_MIX_NRMIX __SIOR ('X', 2, int) #define SNDCTL_MIX_NREXT __SIOWR('X', 3, int) #define SNDCTL_MIX_EXTINFO __SIOWR('X', 4, oss_mixext) #define SNDCTL_MIX_READ __SIOWR('X', 5, oss_mixer_value) #define SNDCTL_MIX_WRITE __SIOWR('X', 6, oss_mixer_value) #define SNDCTL_AUDIOINFO __SIOWR('X', 7, oss_audioinfo) #define SNDCTL_MIX_ENUMINFO __SIOWR('X', 8, oss_mixer_enuminfo) #define SNDCTL_MIDIINFO __SIOWR('X', 9, oss_midi_info) #define SNDCTL_MIXERINFO __SIOWR('X',10, oss_mixerinfo) #define SNDCTL_CARDINFO __SIOWR('X',11, oss_card_info) #define SNDCTL_ENGINEINFO __SIOWR('X',12, oss_audioinfo) #define SNDCTL_AUDIOINFO_EX __SIOWR('X',13, oss_audioinfo) /* ioctl codes 'X', 200-255 are reserved for internal use */ /* * Few more "globally" available ioctl calls. */ #define SNDCTL_SETSONG __SIOW ('Y', 2, oss_longname_t) #define SNDCTL_GETSONG __SIOR ('Y', 2, oss_longname_t) #define SNDCTL_SETNAME __SIOW ('Y', 3, oss_longname_t) #define SNDCTL_SETLABEL __SIOW ('Y', 4, oss_label_t) #define SNDCTL_GETLABEL __SIOR ('Y', 4, oss_label_t) /* * The "new" mixer API definitions end here. *************************************** */ /* ********************************************************* * Few routines that are included in -lOSSlib * * At this moment this interface is not used. OSSlib contains just * stubs that call the related system calls directly. */ #ifdef OSSLIB extern int osslib_open (const char *path, int flags, int dummy); extern void osslib_close (int fd); extern int osslib_write (int fd, const void *buf, int count); extern int osslib_read (int fd, void *buf, int count); extern int osslib_ioctl (int fd, unsigned int request, void *arg); #else # define osslib_open open # define osslib_close close # define osslib_write write # define osslib_read read # define osslib_ioctl ioctl #endif #if 1 #define SNDCTL_DSP_NONBLOCK __SIO ('P',14) /* Obsolete. Not supported any more */ #endif #if 1 /* * Some obsolete macros that are not part of Open Sound System API. */ #define SOUND_PCM_READ_RATE SOUND_PCM_READ_RATE_is_obsolete #define SOUND_PCM_READ_BITS SOUND_PCM_READ_BITS_is_obsolete #define SOUND_PCM_READ_CHANNELS SOUND_PCM_READ_CHANNELS_is_obsolete #define SOUND_PCM_WRITE_RATE SOUND_PCM_WRITE_RATE_is_obsolet_use_SNDCTL_DSP_SPEED_instead #define SOUND_PCM_WRITE_CHANNELS SOUND_PCM_WRITE_CHANNELS_is_obsolete_use_SNDCTL_DSP_CHANNELS_instead #define SOUND_PCM_WRITE_BITS SOUND_PCM_WRITE_BITS_is_obsolete_use_SNDCTL_DSP_SETFMT_instead #define SOUND_PCM_POST SOUND_PCM_POST_is_obsolete_use_SNDCTL_DSP_POST_instead #define SOUND_PCM_RESET SOUND_PCM_RESET_is_obsolete_use_SNDCTL_DSP_HALT_instead #define SOUND_PCM_SYNC SOUND_PCM_SYNC_is_obsolete_use_SNDCTL_DSP_SYNC_instead #define SOUND_PCM_SUBDIVIDE SOUND_PCM_SUBDIVIDE_is_obsolete_use_SNDCTL_DSP_SUBDIVIDE_instead #define SOUND_PCM_SETFRAGMENT SOUND_PCM_SETFRAGMENT_is_obsolete_use_SNDCTL_DSP_SETFRAGMENT_instead #define SOUND_PCM_GETFMTS SOUND_PCM_GETFMTS_is_obsolete_use_SNDCTL_DSP_GETFMTS_instead #define SOUND_PCM_SETFMT SOUND_PCM_SETFMT_is_obsolete_use_SNDCTL_DSP_SETFMT_instead #define SOUND_PCM_GETOSPACE SOUND_PCM_GETOSPACE_is_obsolete_use_SNDCTL_DSP_GETOSPACE_instead #define SOUND_PCM_GETISPACE SOUND_PCM_GETISPACE_is_obsolete_use_SNDCTL_DSP_GETISPACE_instead #define SOUND_PCM_NONBLOCK SOUND_PCM_NONBLOCK_is_obsolete_use_SNDCTL_DSP_NONBLOCK_instead #define SOUND_PCM_GETCAPS SOUND_PCM_GETCAPS_is_obsolete_use_SNDCTL_DSP_GETCAPS_instead #define SOUND_PCM_GETTRIGGER SOUND_PCM_GETTRIGGER_is_obsolete_use_SNDCTL_DSP_GETTRIGGER_instead #define SOUND_PCM_SETTRIGGER SOUND_PCM_SETTRIGGER_is_obsolete_use_SNDCTL_DSP_SETTRIGGER_instead #define SOUND_PCM_SETSYNCRO SOUND_PCM_SETSYNCRO_is_obsolete_use_SNDCTL_DSP_SETSYNCRO_instead #define SOUND_PCM_GETIPTR SOUND_PCM_GETIPTR_is_obsolete_use_SNDCTL_DSP_GETIPTR_instead #define SOUND_PCM_GETOPTR SOUND_PCM_GETOPTR_is_obsolete_use_SNDCTL_DSP_GETOPTR_instead #define SOUND_PCM_MAPINBUF SOUND_PCM_MAPINBUF_is_obsolete_use_SNDCTL_DSP_MAPINBUF_instead #define SOUND_PCM_MAPOUTBUF SOUND_PCM_MAPOUTBUF_is_obsolete_use_SNDCTL_DSP_MAPOUTBUF_instead #endif #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/RtAudio4.cpp0000755000175000017500000101317111315742437026143 0ustar admin2admin2/************************************************************************/ /*! \class RtAudio \brief Realtime audio i/o C++ classes. RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), SGI, Macintosh OS X (CoreAudio and Jack), and Windows (DirectSound and ASIO) operating systems. RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2008 Gary P. Scavone 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. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. 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. */ /************************************************************************/ // RtAudio: Version 4.0.4 #include "RtAudio4.h" #include namespace RtAudio4 { // Static variable definitions. const unsigned int RtApi::MAX_SAMPLE_RATES = 14; const unsigned int RtApi::SAMPLE_RATES[] = { 4000, 5512, 8000, 9600, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) #define MUTEX_INITIALIZE(A) InitializeCriticalSection(A) #define MUTEX_DESTROY(A) DeleteCriticalSection(A) #define MUTEX_LOCK(A) EnterCriticalSection(A) #define MUTEX_UNLOCK(A) LeaveCriticalSection(A) #elif defined(__LINUX_ALSA__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) // pthread API #define MUTEX_INITIALIZE(A) pthread_mutex_init(A, NULL) #define MUTEX_DESTROY(A) pthread_mutex_destroy(A) #define MUTEX_LOCK(A) pthread_mutex_lock(A) #define MUTEX_UNLOCK(A) pthread_mutex_unlock(A) #else #define MUTEX_INITIALIZE(A) abs(*A) // dummy definitions #define MUTEX_DESTROY(A) abs(*A) // dummy definitions #endif // *************************************************** // // // RtAudio definitions. // // *************************************************** // void RtAudio :: getCompiledApi( std::vector &apis ) throw() { apis.clear(); // The order here will control the order of RtAudio's API search in // the constructor. #if defined(__UNIX_JACK__) apis.push_back( UNIX_JACK ); #endif #if defined(__LINUX_ALSA__) apis.push_back( LINUX_ALSA ); #endif #if defined(__LINUX_OSS__) apis.push_back( LINUX_OSS ); #endif #if defined(__WINDOWS_ASIO__) apis.push_back( WINDOWS_ASIO ); #endif #if defined(__WINDOWS_DS__) apis.push_back( WINDOWS_DS ); #endif #if defined(__MACOSX_CORE__) apis.push_back( MACOSX_CORE ); #endif #if defined(__RTAUDIO_DUMMY__) apis.push_back( RTAUDIO_DUMMY ); #endif } void RtAudio :: openRtApi( RtAudio::Api api ) { #if defined(__UNIX_JACK__) if ( api == UNIX_JACK ) rtapi_ = new RtApiJack(); #endif #if defined(__LINUX_ALSA__) if ( api == LINUX_ALSA ) rtapi_ = new RtApiAlsa(); #endif #if defined(__LINUX_OSS__) if ( api == LINUX_OSS ) rtapi_ = new RtApiOss(); #endif #if defined(__WINDOWS_ASIO__) if ( api == WINDOWS_ASIO ) rtapi_ = new RtApiAsio(); #endif #if defined(__WINDOWS_DS__) if ( api == WINDOWS_DS ) rtapi_ = new RtApiDs(); #endif #if defined(__MACOSX_CORE__) if ( api == MACOSX_CORE ) rtapi_ = new RtApiCore(); #endif #if defined(__RTAUDIO_DUMMY__) if ( api == RTAUDIO_DUMMY ) rtapi_ = new RtApiDummy(); #endif } RtAudio :: RtAudio( RtAudio::Api api ) throw() { rtapi_ = 0; if ( api != UNSPECIFIED ) { // Attempt to open the specified API. openRtApi( api ); if ( rtapi_ ) return; // No compiled support for specified API value. Issue a debug // warning and continue as if no API was specified. std::cerr << "\nRtAudio: no compiled support for specified API argument!\n" << std::endl; } // Iterate through the compiled APIs and return as soon as we find // one with at least one device or we reach the end of the list. std::vector< RtAudio::Api > apis; getCompiledApi( apis ); for ( unsigned int i=0; igetDeviceCount() ) break; } if ( rtapi_ ) return; // It should not be possible to get here because the preprocessor // definition __RTAUDIO_DUMMY__ is automatically defined if no // API-specific definitions are passed to the compiler. But just in // case something weird happens, we'll print out an error message. std::cerr << "\nRtAudio: no compiled API support found ... critical error!!\n\n"; } RtAudio :: ~RtAudio() throw() { delete rtapi_; } void RtAudio :: openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options ) { rtapi_->openStream( outputParameters, inputParameters, format, sampleRate, bufferFrames, callback, userData, options ); } // *************************************************** // // // Public RtApi definitions (see end of file for // private or protected utility functions). // // *************************************************** // RtApi :: RtApi() { stream_.state = STREAM_CLOSED; stream_.mode = UNINITIALIZED; stream_.apiHandle = 0; stream_.userBuffer[0] = 0; stream_.userBuffer[1] = 0; MUTEX_INITIALIZE( &stream_.mutex ); showWarnings_ = true; } RtApi :: ~RtApi() { MUTEX_DESTROY( &stream_.mutex ); } void RtApi :: openStream( RtAudio::StreamParameters *oParams, RtAudio::StreamParameters *iParams, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options ) { if ( stream_.state != STREAM_CLOSED ) { errorText_ = "RtApi::openStream: a stream is already open!"; error( RtError::INVALID_USE ); } if ( oParams && oParams->nChannels < 1 ) { errorText_ = "RtApi::openStream: a non-NULL output StreamParameters structure cannot have an nChannels value less than one."; error( RtError::INVALID_USE ); } if ( iParams && iParams->nChannels < 1 ) { errorText_ = "RtApi::openStream: a non-NULL input StreamParameters structure cannot have an nChannels value less than one."; error( RtError::INVALID_USE ); } if ( oParams == NULL && iParams == NULL ) { errorText_ = "RtApi::openStream: input and output StreamParameters structures are both NULL!"; error( RtError::INVALID_USE ); } if ( formatBytes(format) == 0 ) { errorText_ = "RtApi::openStream: 'format' parameter value is undefined."; error( RtError::INVALID_USE ); } unsigned int nDevices = getDeviceCount(); unsigned int oChannels = 0; if ( oParams ) { oChannels = oParams->nChannels; if ( oParams->deviceId >= nDevices ) { errorText_ = "RtApi::openStream: output device parameter value is invalid."; error( RtError::INVALID_USE ); } } unsigned int iChannels = 0; if ( iParams ) { iChannels = iParams->nChannels; if ( iParams->deviceId >= nDevices ) { errorText_ = "RtApi::openStream: input device parameter value is invalid."; error( RtError::INVALID_USE ); } } clearStreamInfo(); bool result; if ( oChannels > 0 ) { result = probeDeviceOpen( oParams->deviceId, OUTPUT, oChannels, oParams->firstChannel, sampleRate, format, bufferFrames, options ); if ( result == false ) error( RtError::SYSTEM_ERROR ); } if ( iChannels > 0 ) { result = probeDeviceOpen( iParams->deviceId, INPUT, iChannels, iParams->firstChannel, sampleRate, format, bufferFrames, options ); if ( result == false ) { if ( oChannels > 0 ) closeStream(); error( RtError::SYSTEM_ERROR ); } } stream_.callbackInfo.callback = (void *) callback; stream_.callbackInfo.userData = userData; if ( options ) options->numberOfBuffers = stream_.nBuffers; stream_.state = STREAM_STOPPED; } unsigned int RtApi :: getDefaultInputDevice( void ) { // Should be implemented in subclasses if possible. return 0; } unsigned int RtApi :: getDefaultOutputDevice( void ) { // Should be implemented in subclasses if possible. return 0; } void RtApi :: closeStream( void ) { // MUST be implemented in subclasses! return; } bool RtApi :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { // MUST be implemented in subclasses! return FAILURE; } void RtApi :: tickStreamTime( void ) { // Subclasses that do not provide their own implementation of // getStreamTime should call this function once per buffer I/O to // provide basic stream time support. stream_.streamTime += ( stream_.bufferSize * 1.0 / stream_.sampleRate ); #if defined( HAVE_GETTIMEOFDAY ) gettimeofday( &stream_.lastTickTimestamp, NULL ); #endif } long RtApi :: getStreamLatency( void ) { verifyStream(); long totalLatency = 0; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) totalLatency = stream_.latency[0]; if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) totalLatency += stream_.latency[1]; return totalLatency; } double RtApi :: getStreamTime( void ) { verifyStream(); #if defined( HAVE_GETTIMEOFDAY ) // Return a very accurate estimate of the stream time by // adding in the elapsed time since the last tick. struct timeval then; struct timeval now; if ( stream_.state != STREAM_RUNNING || stream_.streamTime == 0.0 ) return stream_.streamTime; gettimeofday( &now, NULL ); then = stream_.lastTickTimestamp; return stream_.streamTime + ((now.tv_sec + 0.000001 * now.tv_usec) - (then.tv_sec + 0.000001 * then.tv_usec)); #else return stream_.streamTime; #endif } }; // *************************************************** // // // OS/API-specific methods. // // *************************************************** // #if defined(__MACOSX_CORE__) namespace RtAudio4 { // The OS X CoreAudio API is designed to use a separate callback // procedure for each of its audio devices. A single RtAudio duplex // stream using two different devices is supported here, though it // cannot be guaranteed to always behave correctly because we cannot // synchronize these two callbacks. // // A property listener is installed for over/underrun information. // However, no functionality is currently provided to allow property // listeners to trigger user handlers because it is unclear what could // be done if a critical stream parameter (buffer size, sample rate, // device disconnect) notification arrived. The listeners entail // quite a bit of extra code and most likely, a user program wouldn't // be prepared for the result anyway. However, we do provide a flag // to the client callback function to inform of an over/underrun. // // The mechanism for querying and setting system parameters was // updated (and perhaps simplified) in OS-X version 10.4. However, // since 10.4 support is not necessarily available to all users, I've // decided not to update the respective code at this time. Perhaps // this will happen when Apple makes 10.4 free for everyone. :-) // A structure to hold various information related to the CoreAudio API // implementation. struct CoreHandle { AudioDeviceID id[2]; // device ids UInt32 iStream[2]; // device stream index (first for mono mode) bool xrun[2]; char *deviceBuffer; pthread_cond_t condition; int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. CoreHandle() :deviceBuffer(0), drainCounter(0), internalDrain(false) { id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } }; RtApiCore :: RtApiCore() { // Nothing to do here. } RtApiCore :: ~RtApiCore() { // The subclass destructor gets called before the base class // destructor, so close an existing stream before deallocating // apiDeviceId memory. if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiCore :: getDeviceCount( void ) { // Find out how many audio devices there are, if any. UInt32 dataSize; OSStatus result = AudioHardwareGetPropertyInfo( kAudioHardwarePropertyDevices, &dataSize, NULL ); if ( result != noErr ) { errorText_ = "RtApiCore::getDeviceCount: OS-X error getting device info!"; error( RtError::WARNING ); return 0; } return dataSize / sizeof( AudioDeviceID ); } unsigned int RtApiCore :: getDefaultInputDevice( void ) { unsigned int nDevices = getDeviceCount(); if ( nDevices <= 1 ) return 0; AudioDeviceID id; UInt32 dataSize = sizeof( AudioDeviceID ); OSStatus result = AudioHardwareGetProperty( kAudioHardwarePropertyDefaultInputDevice, &dataSize, &id ); if ( result != noErr ) { errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device."; error( RtError::WARNING ); return 0; } dataSize *= nDevices; AudioDeviceID deviceList[ nDevices ]; result = AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device IDs."; error( RtError::WARNING ); return 0; } for ( unsigned int i=0; i= nDevices ) { errorText_ = "RtApiCore::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } AudioDeviceID deviceList[ nDevices ]; UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; OSStatus result = AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::getDeviceInfo: OS-X system error getting device IDs."; error( RtError::WARNING ); return info; } AudioDeviceID id = deviceList[ device ]; // Get the device name. info.name.erase(); char name[256]; dataSize = 256; result = AudioDeviceGetProperty( id, 0, false, kAudioDevicePropertyDeviceManufacturer, &dataSize, name ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device manufacturer."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } info.name.append( (const char *)name, strlen(name) ); info.name.append( ": " ); dataSize = 256; result = AudioDeviceGetProperty( id, 0, false, kAudioDevicePropertyDeviceName, &dataSize, name ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device name."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } info.name.append( (const char *)name, strlen(name) ); // Get the output stream "configuration". AudioBufferList *bufferList = nil; result = AudioDeviceGetPropertyInfo( id, 0, false, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (result != noErr || dataSize == 0) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::getDeviceInfo: memory error allocating output AudioBufferList."; error( RtError::WARNING ); return info; } result = AudioDeviceGetProperty( id, 0, false, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if ( result != noErr ) { free( bufferList ); errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Get output channel information. unsigned int i, nStreams = bufferList->mNumberBuffers; for ( i=0; imBuffers[i].mNumberChannels; free( bufferList ); // Get the input stream "configuration". result = AudioDeviceGetPropertyInfo( id, 0, true, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (result != noErr || dataSize == 0) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::getDeviceInfo: memory error allocating input AudioBufferList."; error( RtError::WARNING ); return info; } result = AudioDeviceGetProperty( id, 0, true, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if ( result != noErr ) { free( bufferList ); errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Get input channel information. nStreams = bufferList->mNumberBuffers; for ( i=0; imBuffers[i].mNumberChannels; free( bufferList ); // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Probe the device sample rates. bool isInput = false; if ( info.outputChannels == 0 ) isInput = true; // Determine the supported sample rates. result = AudioDeviceGetPropertyInfo( id, 0, isInput, kAudioDevicePropertyAvailableNominalSampleRates, &dataSize, NULL ); if ( result != kAudioHardwareNoError || dataSize == 0 ) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rate info."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } UInt32 nRanges = dataSize / sizeof( AudioValueRange ); AudioValueRange rangeList[ nRanges ]; result = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyAvailableNominalSampleRates, &dataSize, &rangeList ); if ( result != kAudioHardwareNoError ) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rates."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } Float64 minimumRate = 100000000.0, maximumRate = 0.0; for ( UInt32 i=0; i maximumRate ) maximumRate = rangeList[i].mMaximum; } info.sampleRates.clear(); for ( unsigned int k=0; k= (unsigned int) minimumRate && SAMPLE_RATES[k] <= (unsigned int) maximumRate ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } if ( info.sampleRates.size() == 0 ) { errorStream_ << "RtApiCore::probeDeviceInfo: No supported sample rates found for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // CoreAudio always uses 32-bit floating point data for PCM streams. // Thus, any other "physical" formats supported by the device are of // no interest to the client. info.nativeFormats = RTAUDIO_FLOAT32; if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; info.probed = true; return info; } OSStatus callbackHandler( AudioDeviceID inDevice, const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* inInputTime, AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime, void* infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiCore *object = (RtApiCore *) info->object; if ( object->callbackEvent( inDevice, inInputData, outOutputData ) == false ) return kAudioHardwareUnspecifiedError; else return kAudioHardwareNoError; } OSStatus deviceListener( AudioDeviceID inDevice, UInt32 channel, Boolean isInput, AudioDevicePropertyID propertyID, void* handlePointer ) { CoreHandle *handle = (CoreHandle *) handlePointer; if ( propertyID == kAudioDeviceProcessorOverload ) { if ( isInput ) handle->xrun[1] = true; else handle->xrun[0] = true; } return kAudioHardwareNoError; } static bool hasProperty( AudioDeviceID id, UInt32 channel, bool isInput, AudioDevicePropertyID property ) { OSStatus result = AudioDeviceGetPropertyInfo( id, channel, isInput, property, NULL, NULL ); return result == 0; } bool RtApiCore :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { // Get device ID unsigned int nDevices = getDeviceCount(); if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiCore::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiCore::probeDeviceOpen: device ID is invalid!"; return FAILURE; } AudioDeviceID deviceList[ nDevices ]; UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; OSStatus result = AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::probeDeviceOpen: OS-X system error getting device IDs."; return FAILURE; } AudioDeviceID id = deviceList[ device ]; // Setup for stream mode. bool isInput = false; if ( mode == INPUT ) isInput = true; // Set or disable "hog" mode. dataSize = sizeof( UInt32 ); UInt32 doHog = 0; if ( options && options->flags & RTAUDIO_HOG_DEVICE ) doHog = 1; result = AudioHardwareSetProperty( kAudioHardwarePropertyHogModeIsAllowed, dataSize, &doHog ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting 'hog' state!"; errorText_ = errorStream_.str(); return FAILURE; } // Get the stream "configuration". AudioBufferList *bufferList; result = AudioDeviceGetPropertyInfo( id, 0, isInput, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (result != noErr || dataSize == 0) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: memory error allocating AudioBufferList."; return FAILURE; } result = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if ( result != noErr ) { free( bufferList ); errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Search for a stream that contains the desired number of // channels. CoreAudio devices can have an arbitrary number of // streams and each stream can have an arbitrary number of channels. // For each stream, a single buffer of interleaved samples is // provided. RtAudio currently only supports the use of one stream // of interleaved data or multiple consecutive single-channel // streams. Thus, our search below is limited to these two // contexts. unsigned int streamChannels = 0, nStreams = 0; UInt32 iChannel = 0, iStream = 0; unsigned int offsetCounter = firstChannel; stream_.deviceInterleaved[mode] = true; nStreams = bufferList->mNumberBuffers; bool foundStream = false; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; if ( streamChannels >= channels + offsetCounter ) { iChannel += offsetCounter; foundStream = true; break; } if ( streamChannels > offsetCounter ) break; offsetCounter -= streamChannels; iChannel += streamChannels; } // If we didn't find a single stream above, see if we can meet // the channel specification in mono mode (i.e. using separate // non-interleaved buffers). This can only work if there are N // consecutive one-channel streams, where N is the number of // desired channels (+ channel offset). if ( foundStream == false ) { unsigned int counter = 0; offsetCounter = firstChannel; iChannel = 0; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; if ( offsetCounter ) { if ( streamChannels > offsetCounter ) break; offsetCounter -= streamChannels; } else if ( streamChannels == 1 ) counter++; else counter = 0; if ( counter == channels ) { iStream -= channels - 1; iChannel -= channels - 1; stream_.deviceInterleaved[mode] = false; foundStream = true; break; } iChannel += streamChannels; } } free( bufferList ); if ( foundStream == false ) { errorStream_ << "RtApiCore::probeDeviceOpen: unable to find OS-X stream on device (" << device << ") for requested channels."; errorText_ = errorStream_.str(); return FAILURE; } // Determine the buffer size. AudioValueRange bufferRange; dataSize = sizeof( AudioValueRange ); result = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &dataSize, &bufferRange ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting buffer size range for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ( bufferRange.mMinimum > *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMinimum; else if ( bufferRange.mMaximum < *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMaximum; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) *bufferSize = (unsigned long) bufferRange.mMinimum; // Set the buffer size. For mono mode, I'm assuming we only need to // make this setting for the master channel. UInt32 theSize = (UInt32) *bufferSize; dataSize = sizeof( UInt32 ); result = AudioDeviceSetProperty( id, NULL, 0, isInput, kAudioDevicePropertyBufferFrameSize, dataSize, &theSize ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting the buffer size for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // If attempting to setup a duplex stream, the bufferSize parameter // MUST be the same in both directions! *bufferSize = theSize; if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.bufferSize = *bufferSize; stream_.nBuffers = 1; // Get the stream ID(s) so we can set the stream format. In mono // mode, we'll have to do this for each stream (channel). AudioStreamID streamIDs[ nStreams ]; dataSize = nStreams * sizeof( AudioStreamID ); result = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyStreams, &dataSize, &streamIDs ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream ID(s) for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Now set the stream format. Also, check the physical format of the // device and change that if necessary. AudioStreamBasicDescription description; dataSize = sizeof( AudioStreamBasicDescription ); if ( stream_.deviceInterleaved[mode] ) nStreams = 1; else nStreams = channels; bool updateFormat; for ( unsigned int i=0; i 1.0 ) { description.mSampleRate = (double) sampleRate; updateFormat = true; } if ( description.mFormatID != kAudioFormatLinearPCM ) { description.mFormatID = kAudioFormatLinearPCM; updateFormat = true; } if ( updateFormat ) { result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyVirtualFormat, dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate or data format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Now check the physical format. result = AudioStreamGetProperty( streamIDs[iStream+i], 0, kAudioStreamPropertyPhysicalFormat, &dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream physical format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ( description.mFormatID != kAudioFormatLinearPCM || description.mBitsPerChannel < 24 ) { description.mFormatID = kAudioFormatLinearPCM; AudioStreamBasicDescription testDescription = description; unsigned long formatFlags; // We'll try higher bit rates first and then work our way down. testDescription.mBitsPerChannel = 32; formatFlags = description.mFormatFlags | kLinearPCMFormatFlagIsFloat & ~kLinearPCMFormatFlagIsSignedInteger; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if (result == noErr) { AudioStreamBasicDescription newDescription; result = AudioStreamGetProperty( streamIDs[iStream+i], 0, kAudioStreamPropertyPhysicalFormat, &dataSize, &newDescription ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ((testDescription.mBitsPerChannel != newDescription.mBitsPerChannel) || (testDescription.mChannelsPerFrame != newDescription.mChannelsPerFrame)) { result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } else continue; } testDescription = description; testDescription.mBitsPerChannel = 32; formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsSignedInteger) & ~kLinearPCMFormatFlagIsFloat; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if (result == noErr) { AudioStreamBasicDescription newDescription; result = AudioStreamGetProperty( streamIDs[iStream+i], 0, kAudioStreamPropertyPhysicalFormat, &dataSize, &newDescription ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ((testDescription.mBitsPerChannel != newDescription.mBitsPerChannel) || (testDescription.mChannelsPerFrame != newDescription.mChannelsPerFrame)) { result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } else continue; } testDescription = description; testDescription.mBitsPerChannel = 24; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if (result == noErr) { AudioStreamBasicDescription newDescription; result = AudioStreamGetProperty( streamIDs[iStream+i], 0, kAudioStreamPropertyPhysicalFormat, &dataSize, &newDescription ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ((testDescription.mBitsPerChannel != newDescription.mBitsPerChannel) || (testDescription.mChannelsPerFrame != newDescription.mChannelsPerFrame)) { result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } else continue; } testDescription = description; testDescription.mBitsPerChannel = 16; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if (result == noErr) { AudioStreamBasicDescription newDescription; result = AudioStreamGetProperty( streamIDs[iStream+i], 0, kAudioStreamPropertyPhysicalFormat, &dataSize, &newDescription ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ((testDescription.mBitsPerChannel != newDescription.mBitsPerChannel) || (testDescription.mChannelsPerFrame != newDescription.mChannelsPerFrame)) { result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } else continue; } testDescription = description; testDescription.mBitsPerChannel = 8; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if (result == noErr) { AudioStreamBasicDescription newDescription; result = AudioStreamGetProperty( streamIDs[iStream+i], 0, kAudioStreamPropertyPhysicalFormat, &dataSize, &newDescription ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ((testDescription.mBitsPerChannel != newDescription.mBitsPerChannel) || (testDescription.mChannelsPerFrame != newDescription.mChannelsPerFrame)) { result = AudioStreamSetProperty( streamIDs[iStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } else { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting physical data format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } } } // Get the stream latency. There can be latency in both the device // and the stream. First, attempt to get the device latency on the // master channel or the first open channel. Errors that might // occur here are not deemed critical. UInt32 latency, channel = 0; dataSize = sizeof( UInt32 ); AudioDevicePropertyID property = kAudioDevicePropertyLatency; for ( int i=0; i<2; i++ ) { if ( hasProperty( id, channel, isInput, property ) == true ) break; channel = iChannel + 1 + i; } if ( channel <= iChannel + 1 ) { result = AudioDeviceGetProperty( id, channel, isInput, property, &dataSize, &latency ); if ( result == kAudioHardwareNoError ) stream_.latency[ mode ] = latency; else { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting device latency for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); } } // Now try to get the stream latency. For "mono" mode, I assume the // latency is equal for all single-channel streams. result = AudioStreamGetProperty( streamIDs[iStream], 0, property, &dataSize, &latency ); if ( result == kAudioHardwareNoError ) stream_.latency[ mode ] += latency; else { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream latency for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); } // Byte-swapping: According to AudioHardware.h, the stream data will // always be presented in native-endian format, so we should never // need to byte swap. stream_.doByteSwap[mode] = false; // From the CoreAudio documentation, PCM data must be supplied as // 32-bit floats. stream_.userFormat = format; stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; if ( stream_.deviceInterleaved[mode] ) stream_.nDeviceChannels[mode] = description.mChannelsPerFrame; else // mono mode stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; stream_.channelOffset[mode] = iChannel; // offset within a CoreAudio stream if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate our CoreHandle structure for the stream. CoreHandle *handle = 0; long unsigned int bufferBytes = 0; if ( stream_.apiHandle == 0 ) { try { handle = new CoreHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating CoreHandle memory."; goto error; } if ( pthread_cond_init( &handle->condition, NULL ) ) { errorText_ = "RtApiCore::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) handle; } else handle = (CoreHandle *) stream_.apiHandle; handle->iStream[mode] = iStream; handle->id[mode] = id; // Allocate necessary internal buffers. bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating user buffer memory."; goto error; } // If possible, we will make use of the CoreAudio stream buffers as // "device buffers". However, we can't do this if the device // buffers are non-interleaved ("mono" mode). if ( !stream_.deviceInterleaved[mode] && stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating device buffer memory."; goto error; } // Save a pointer to our own device buffer in the CoreHandle // structure because we may need to use the stream_.deviceBuffer // variable to point to the CoreAudio buffer before buffer // conversion (if we have a duplex stream with two different // conversion schemes). handle->deviceBuffer = stream_.deviceBuffer; } } stream_.sampleRate = sampleRate; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; stream_.callbackInfo.object = (void *) this; // Setup the buffer conversion information structure. We override // the channel offset value and perform our own setting for that // here. if ( stream_.doConvertBuffer[mode] ) { setConvertInfo( mode, 0 ); // Add channel offset for interleaved channels. if ( firstChannel > 0 && stream_.deviceInterleaved[mode] ) { if ( mode == OUTPUT ) { for ( int k=0; kcondition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiCore :: closeStream( void ) { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( stream_.state == STREAM_RUNNING ) AudioDeviceStop( handle->id[0], callbackHandler ); AudioDeviceRemoveIOProc( handle->id[0], callbackHandler ); } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { if ( stream_.state == STREAM_RUNNING ) AudioDeviceStop( handle->id[1], callbackHandler ); AudioDeviceRemoveIOProc( handle->id[1], callbackHandler ); } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( handle->deviceBuffer ) { free( handle->deviceBuffer ); stream_.deviceBuffer = 0; } // Destroy pthread condition variable. pthread_cond_destroy( &handle->condition ); delete handle; stream_.apiHandle = 0; stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiCore :: startStream( void ) { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiCore::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); OSStatus result = noErr; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = AudioDeviceStart( handle->id[0], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::startStream: system error (" << getErrorCode( result ) << ") starting callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { result = AudioDeviceStart( handle->id[1], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::startStream: system error starting input callback procedure on device (" << stream_.device[1] << ")."; errorText_ = errorStream_.str(); goto unlock; } } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( result == noErr ) return; error( RtError::SYSTEM_ERROR ); } void RtApiCore :: stopStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiCore::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); OSStatus result = noErr; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 1; pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled } result = AudioDeviceStop( handle->id[0], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { result = AudioDeviceStop( handle->id[1], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping input callback procedure on device (" << stream_.device[1] << ")."; errorText_ = errorStream_.str(); goto unlock; } } unlock: MUTEX_UNLOCK( &stream_.mutex ); stream_.state = STREAM_STOPPED; if ( result == noErr ) return; error( RtError::SYSTEM_ERROR ); } void RtApiCore :: abortStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiCore::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; handle->drainCounter = 1; stopStream(); } bool RtApiCore :: callbackEvent( AudioDeviceID deviceId, const AudioBufferList *inBufferList, const AudioBufferList *outBufferList ) { if ( stream_.state == STREAM_STOPPED ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > 3 ) { if ( handle->internalDrain == false ) pthread_cond_signal( &handle->condition ); else stopStream(); return SUCCESS; } MUTEX_LOCK( &stream_.mutex ); AudioDeviceID outputDevice = handle->id[0]; // Invoke user callback to get fresh output data UNLESS we are // draining stream or duplex mode AND the input/output devices are // different AND this function is called for the input device. if ( handle->drainCounter == 0 && ( stream_.mode != DUPLEX || deviceId == outputDevice ) ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } handle->drainCounter = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( handle->drainCounter == 2 ) { MUTEX_UNLOCK( &stream_.mutex ); abortStream(); return SUCCESS; } else if ( handle->drainCounter == 1 ) handle->internalDrain = true; } AudioDeviceID inputDevice; if ( stream_.mode == OUTPUT || ( stream_.mode == DUPLEX && deviceId == outputDevice ) ) { if ( handle->drainCounter > 1 ) { // write zeros to the output stream if ( stream_.deviceInterleaved[0] ) { memset( outBufferList->mBuffers[handle->iStream[0]].mData, 0, outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); } else { for ( unsigned int i=0; imBuffers[handle->iStream[0]+i].mData, 0, outBufferList->mBuffers[handle->iStream[0]+i].mDataByteSize ); } } } else if ( stream_.doConvertBuffer[0] ) { if ( stream_.deviceInterleaved[0] ) stream_.deviceBuffer = (char *) outBufferList->mBuffers[handle->iStream[0]].mData; else stream_.deviceBuffer = handle->deviceBuffer; convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); if ( !stream_.deviceInterleaved[0] ) { UInt32 bufferBytes = outBufferList->mBuffers[handle->iStream[0]].mDataByteSize; for ( unsigned int i=0; imBuffers[handle->iStream[0]+i].mData, &stream_.deviceBuffer[i*bufferBytes], bufferBytes ); } } } else { if ( stream_.deviceInterleaved[0] ) { memcpy( outBufferList->mBuffers[handle->iStream[0]].mData, stream_.userBuffer[0], outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); } else { UInt32 bufferBytes = outBufferList->mBuffers[handle->iStream[0]].mDataByteSize; for ( unsigned int i=0; imBuffers[handle->iStream[0]+i].mData, &stream_.userBuffer[0][i*bufferBytes], bufferBytes ); } } } if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } } inputDevice = handle->id[1]; if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && deviceId == inputDevice ) ) { if ( stream_.doConvertBuffer[1] ) { if ( stream_.deviceInterleaved[1] ) stream_.deviceBuffer = (char *) inBufferList->mBuffers[handle->iStream[1]].mData; else { stream_.deviceBuffer = (char *) handle->deviceBuffer; UInt32 bufferBytes = inBufferList->mBuffers[handle->iStream[1]].mDataByteSize; for ( unsigned int i=0; imBuffers[handle->iStream[1]+i].mData, bufferBytes ); } } convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } else { memcpy( stream_.userBuffer[1], inBufferList->mBuffers[handle->iStream[1]].mData, inBufferList->mBuffers[handle->iStream[1]].mDataByteSize ); } } unlock: MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); return SUCCESS; } const char* RtApiCore :: getErrorCode( OSStatus code ) { switch( code ) { case kAudioHardwareNotRunningError: return "kAudioHardwareNotRunningError"; case kAudioHardwareUnspecifiedError: return "kAudioHardwareUnspecifiedError"; case kAudioHardwareUnknownPropertyError: return "kAudioHardwareUnknownPropertyError"; case kAudioHardwareBadPropertySizeError: return "kAudioHardwareBadPropertySizeError"; case kAudioHardwareIllegalOperationError: return "kAudioHardwareIllegalOperationError"; case kAudioHardwareBadObjectError: return "kAudioHardwareBadObjectError"; case kAudioHardwareBadDeviceError: return "kAudioHardwareBadDeviceError"; case kAudioHardwareBadStreamError: return "kAudioHardwareBadStreamError"; case kAudioHardwareUnsupportedOperationError: return "kAudioHardwareUnsupportedOperationError"; case kAudioDeviceUnsupportedFormatError: return "kAudioDeviceUnsupportedFormatError"; case kAudioDevicePermissionsError: return "kAudioDevicePermissionsError"; default: return "CoreAudio unknown error"; } } }; //******************** End of __MACOSX_CORE__ *********************// #endif #if defined(__UNIX_JACK__) // JACK is a low-latency audio server, originally written for the // GNU/Linux operating system and now also ported to OS-X. It can // connect a number of different applications to an audio device, as // well as allowing them to share audio between themselves. // // When using JACK with RtAudio, "devices" refer to JACK clients that // have ports connected to the server. The JACK server is typically // started in a terminal as follows: // // .jackd -d alsa -d hw:0 // // or through an interface program such as qjackctl. Many of the // parameters normally set for a stream are fixed by the JACK server // and can be specified when the JACK server is started. In // particular, // // .jackd -d alsa -d hw:0 -r 44100 -p 512 -n 4 // // specifies a sample rate of 44100 Hz, a buffer size of 512 sample // frames, and number of buffers = 4. Once the server is running, it // is not possible to override these values. If the values are not // specified in the command-line, the JACK server uses default values. // // The JACK server does not have to be running when an instance of // RtApiJack is created, though the function getDeviceCount() will // report 0 devices found until JACK has been started. When no // devices are available (i.e., the JACK server is not running), a // stream cannot be opened. #include #include namespace RtAudio4 { // A structure to hold various information related to the Jack API // implementation. struct JackHandle { jack_client_t *client; jack_port_t **ports[2]; std::string deviceName[2]; bool xrun[2]; pthread_cond_t condition; int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. JackHandle() :client(0), drainCounter(0), internalDrain(false) { ports[0] = 0; ports[1] = 0; xrun[0] = false; xrun[1] = false; } }; RtApiJack :: RtApiJack() { // Nothing to do here. } RtApiJack :: ~RtApiJack() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiJack :: getDeviceCount( void ) { // See if we can become a jack client. jack_client_t *client = jack_client_new( "RtApiJackCount" ); if ( client == 0 ) return 0; const char **ports; std::string port, previousPort; unsigned int nChannels = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). unsigned int iColon = 0; do { port = (char *) ports[ nChannels ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon + 1 ); if ( port != previousPort ) { nDevices++; previousPort = port; } } } while ( ports[++nChannels] ); free( ports ); } jack_client_close( client ); return nDevices; } RtAudio::DeviceInfo RtApiJack :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; jack_client_t *client = jack_client_new( "RtApiJackInfo" ); if ( client == 0 ) { errorText_ = "RtApiJack::getDeviceInfo: Jack server not found or connection error!"; error( RtError::WARNING ); return info; } const char **ports; std::string port, previousPort; unsigned int nPorts = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). unsigned int iColon = 0; do { port = (char *) ports[ nPorts ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon ); if ( port != previousPort ) { if ( nDevices == device ) info.name = port; nDevices++; previousPort = port; } } } while ( ports[++nPorts] ); free( ports ); } if ( device >= nDevices ) { errorText_ = "RtApiJack::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } // Get the current jack server sample rate. info.sampleRates.clear(); info.sampleRates.push_back( jack_get_sample_rate( client ) ); // Count the available ports containing the client name as device // channels. Jack "input ports" equal RtAudio output channels. unsigned int nChannels = 0; ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsInput ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); info.outputChannels = nChannels; } // Jack "output ports" equal RtAudio input channels. nChannels = 0; ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsOutput ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); info.inputChannels = nChannels; } if ( info.outputChannels == 0 && info.inputChannels == 0 ) { jack_client_close(client); errorText_ = "RtApiJack::getDeviceInfo: error determining Jack input/output channels!"; error( RtError::WARNING ); return info; } // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Jack always uses 32-bit floats. info.nativeFormats = RTAUDIO_FLOAT32; // Jack doesn't provide default devices so we'll use the first available one. if ( device == 0 && info.outputChannels > 0 ) info.isDefaultOutput = true; if ( device == 0 && info.inputChannels > 0 ) info.isDefaultInput = true; jack_client_close(client); info.probed = true; return info; } int jackCallbackHandler( jack_nframes_t nframes, void *infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiJack *object = (RtApiJack *) info->object; if ( object->callbackEvent( (unsigned long) nframes ) == false ) return 1; return 0; } void jackShutdown( void *infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiJack *object = (RtApiJack *) info->object; // Check current stream state. If stopped, then we'll assume this // was called as a result of a call to RtApiJack::stopStream (the // deactivation of a client handle causes this function to be called). // If not, we'll assume the Jack server is shutting down or some // other problem occurred and we should close the stream. if ( object->isStreamRunning() == false ) return; object->closeStream(); std::cerr << "\nRtApiJack: the Jack server is shutting down this client ... stream stopped and closed!!\n" << std::endl; } int jackXrun( void *infoPointer ) { JackHandle *handle = (JackHandle *) infoPointer; if ( handle->ports[0] ) handle->xrun[0] = true; if ( handle->ports[1] ) handle->xrun[1] = true; return 0; } bool RtApiJack :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { JackHandle *handle = (JackHandle *) stream_.apiHandle; // Look for jack server and try to become a client (only do once per stream). jack_client_t *client = 0; if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) { if ( options && !options->streamName.empty() ) client = jack_client_new( options->streamName.c_str() ); else client = jack_client_new( "RtApiJack" ); if ( client == 0 ) { errorText_ = "RtApiJack::probeDeviceOpen: Jack server not found or connection error!"; error( RtError::WARNING ); return FAILURE; } } else { // The handle must have been created on an earlier pass. client = handle->client; } const char **ports; std::string port, previousPort, deviceName; unsigned int nPorts = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). unsigned int iColon = 0; do { port = (char *) ports[ nPorts ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon ); if ( port != previousPort ) { if ( nDevices == device ) deviceName = port; nDevices++; previousPort = port; } } } while ( ports[++nPorts] ); free( ports ); } if ( device >= nDevices ) { errorText_ = "RtApiJack::probeDeviceOpen: device ID is invalid!"; return FAILURE; } // Count the available ports containing the client name as device // channels. Jack "input ports" equal RtAudio output channels. unsigned int nChannels = 0; unsigned long flag = JackPortIsInput; if ( mode == INPUT ) flag = JackPortIsOutput; ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); } // Compare the jack ports for specified client to the requested number of channels. if ( nChannels < (channels + firstChannel) ) { errorStream_ << "RtApiJack::probeDeviceOpen: requested number of channels (" << channels << ") + offset (" << firstChannel << ") not found for specified device (" << device << ":" << deviceName << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Check the jack server sample rate. unsigned int jackRate = jack_get_sample_rate( client ); if ( sampleRate != jackRate ) { jack_client_close( client ); errorStream_ << "RtApiJack::probeDeviceOpen: the requested sample rate (" << sampleRate << ") is different than the JACK server rate (" << jackRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.sampleRate = jackRate; // Get the latency of the JACK port. ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); if ( ports[ firstChannel ] ) stream_.latency[mode] = jack_port_get_latency( jack_port_by_name( client, ports[ firstChannel ] ) ); free( ports ); // The jack server always uses 32-bit floating-point data. stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; stream_.userFormat = format; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // Jack always uses non-interleaved buffers. stream_.deviceInterleaved[mode] = false; // Jack always provides host byte-ordered data. stream_.doByteSwap[mode] = false; // Get the buffer size. The buffer size and number of buffers // (periods) is set when the jack server is started. stream_.bufferSize = (int) jack_get_buffer_size( client ); *bufferSize = stream_.bufferSize; stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate our JackHandle structure for the stream. if ( handle == 0 ) { try { handle = new JackHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating JackHandle memory."; goto error; } if ( pthread_cond_init(&handle->condition, NULL) ) { errorText_ = "RtApiJack::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) handle; handle->client = client; } handle->deviceName[mode] = deviceName; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; if ( mode == OUTPUT ) bufferBytes = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); else { // mode == INPUT bufferBytes = stream_.nDeviceChannels[1] * formatBytes( stream_.deviceFormat[1] ); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( bufferBytes < bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } // Allocate memory for the Jack ports (channels) identifiers. handle->ports[mode] = (jack_port_t **) malloc ( sizeof (jack_port_t *) * channels ); if ( handle->ports[mode] == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating port memory."; goto error; } stream_.device[mode] = device; stream_.channelOffset[mode] = firstChannel; stream_.state = STREAM_STOPPED; stream_.callbackInfo.object = (void *) this; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up the stream for output. stream_.mode = DUPLEX; else { stream_.mode = mode; jack_set_process_callback( handle->client, jackCallbackHandler, (void *) &stream_.callbackInfo ); jack_set_xrun_callback( handle->client, jackXrun, (void *) &handle ); jack_on_shutdown( handle->client, jackShutdown, (void *) &stream_.callbackInfo ); } // Register our ports. char label[64]; if ( mode == OUTPUT ) { for ( unsigned int i=0; iports[0][i] = jack_port_register( handle->client, (const char *)label, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); } } else { for ( unsigned int i=0; iports[1][i] = jack_port_register( handle->client, (const char *)label, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0 ); } } // Setup the buffer conversion information structure. We don't use // buffers to do channel offsets, so we override that parameter // here. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); return SUCCESS; error: if ( handle ) { pthread_cond_destroy( &handle->condition ); jack_client_close( handle->client ); if ( handle->ports[0] ) free( handle->ports[0] ); if ( handle->ports[1] ) free( handle->ports[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiJack :: closeStream( void ) { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiJack::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( handle ) { if ( stream_.state == STREAM_RUNNING ) jack_deactivate( handle->client ); jack_client_close( handle->client ); } if ( handle ) { if ( handle->ports[0] ) free( handle->ports[0] ); if ( handle->ports[1] ) free( handle->ports[1] ); pthread_cond_destroy( &handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiJack :: startStream( void ) { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiJack::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK(&stream_.mutex); JackHandle *handle = (JackHandle *) stream_.apiHandle; int result = jack_activate( handle->client ); if ( result ) { errorText_ = "RtApiJack::startStream(): unable to activate JACK client!"; goto unlock; } const char **ports; // Get the list of available ports. if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = 1; ports = jack_get_ports( handle->client, handle->deviceName[0].c_str(), NULL, JackPortIsInput); if ( ports == NULL) { errorText_ = "RtApiJack::startStream(): error determining available JACK input ports!"; goto unlock; } // Now make the port connections. Since RtAudio wasn't designed to // allow the user to select particular channels of a device, we'll // just open the first "nChannels" ports with offset. for ( unsigned int i=0; iclient, jack_port_name( handle->ports[0][i] ), ports[ stream_.channelOffset[0] + i ] ); if ( result ) { free( ports ); errorText_ = "RtApiJack::startStream(): error connecting output ports!"; goto unlock; } } free(ports); } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { result = 1; ports = jack_get_ports( handle->client, handle->deviceName[1].c_str(), NULL, JackPortIsOutput ); if ( ports == NULL) { errorText_ = "RtApiJack::startStream(): error determining available JACK output ports!"; goto unlock; } // Now make the port connections. See note above. for ( unsigned int i=0; iclient, ports[ stream_.channelOffset[1] + i ], jack_port_name( handle->ports[1][i] ) ); if ( result ) { free( ports ); errorText_ = "RtApiJack::startStream(): error connecting input ports!"; goto unlock; } } free(ports); } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; unlock: MUTEX_UNLOCK(&stream_.mutex); if ( result == 0 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiJack :: stopStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiJack::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 1; pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled } } jack_deactivate( handle->client ); stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); } void RtApiJack :: abortStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiJack::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; handle->drainCounter = 1; stopStream(); } bool RtApiJack :: callbackEvent( unsigned long nframes ) { if ( stream_.state == STREAM_STOPPED ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return FAILURE; } if ( stream_.bufferSize != nframes ) { errorText_ = "RtApiCore::callbackEvent(): the JACK buffer size has changed ... cannot process!"; error( RtError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; JackHandle *handle = (JackHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > 3 ) { if ( handle->internalDrain == false ) pthread_cond_signal( &handle->condition ); else stopStream(); return SUCCESS; } MUTEX_LOCK( &stream_.mutex ); // Invoke user callback first, to get fresh output data. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } handle->drainCounter = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( handle->drainCounter == 2 ) { MUTEX_UNLOCK( &stream_.mutex ); abortStream(); return SUCCESS; } else if ( handle->drainCounter == 1 ) handle->internalDrain = true; } jack_default_audio_sample_t *jackbuffer; unsigned long bufferBytes = nframes * sizeof( jack_default_audio_sample_t ); if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter > 0 ) { // write zeros to the output stream for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memset( jackbuffer, 0, bufferBytes ); } } else if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memcpy( jackbuffer, &stream_.deviceBuffer[i*bufferBytes], bufferBytes ); } } else { // no buffer conversion for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memcpy( jackbuffer, &stream_.userBuffer[0][i*bufferBytes], bufferBytes ); } } if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { if ( stream_.doConvertBuffer[1] ) { for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); memcpy( &stream_.deviceBuffer[i*bufferBytes], jackbuffer, bufferBytes ); } convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } else { // no buffer conversion for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); memcpy( &stream_.userBuffer[1][i*bufferBytes], jackbuffer, bufferBytes ); } } } unlock: MUTEX_UNLOCK(&stream_.mutex); RtApi::tickStreamTime(); return SUCCESS; } }; //******************** End of __UNIX_JACK__ *********************// #endif #if defined(__WINDOWS_ASIO__) // ASIO API on Windows // The ASIO API is designed around a callback scheme, so this // implementation is similar to that used for OS-X CoreAudio and Linux // Jack. The primary constraint with ASIO is that it only allows // access to a single driver at a time. Thus, it is not possible to // have more than one simultaneous RtAudio stream. // // This implementation also requires a number of external ASIO files // and a few global variables. The ASIO callback scheme does not // allow for the passing of user data, so we must create a global // pointer to our callbackInfo structure. // // On unix systems, we make use of a pthread condition variable. // Since there is no equivalent in Windows, I hacked something based // on information found in // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html. #include "asio/asiosys.h" #include "asio/asio.h" #include "asio/iasiothiscallresolver.h" #include "asio/asiodrivers.h" #include namespace RtAudio4 { AsioDrivers drivers; ASIOCallbacks asioCallbacks; ASIODriverInfo driverInfo; CallbackInfo *asioCallbackInfo; bool asioXRun; struct AsioHandle { int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. ASIOBufferInfo *bufferInfos; HANDLE condition; AsioHandle() :drainCounter(0), internalDrain(false), bufferInfos(0) {} }; // Function declarations (definitions at end of section) static const char* getAsioErrorString( ASIOError result ); void sampleRateChanged( ASIOSampleRate sRate ); long asioMessages( long selector, long value, void* message, double* opt ); RtApiAsio :: RtApiAsio() { // ASIO cannot run on a multi-threaded appartment. You can call // CoInitialize beforehand, but it must be for appartment threading // (in which case, CoInitilialize will return S_FALSE here). coInitialized_ = false; HRESULT hr = CoInitialize( NULL ); if ( FAILED(hr) ) { errorText_ = "RtApiAsio::ASIO requires a single-threaded appartment. Call CoInitializeEx(0,COINIT_APARTMENTTHREADED)"; error( RtError::WARNING ); } coInitialized_ = true; drivers.removeCurrentDriver(); driverInfo.asioVersion = 2; // See note in DirectSound implementation about GetDesktopWindow(). driverInfo.sysRef = GetForegroundWindow(); } RtApiAsio :: ~RtApiAsio() { if ( stream_.state != STREAM_CLOSED ) closeStream(); if ( coInitialized_ ) CoUninitialize(); } unsigned int RtApiAsio :: getDeviceCount( void ) { return (unsigned int) drivers.asioGetNumDev(); } RtAudio::DeviceInfo RtApiAsio :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; // Get device ID unsigned int nDevices = getDeviceCount(); if ( nDevices == 0 ) { errorText_ = "RtApiAsio::getDeviceInfo: no devices found!"; error( RtError::INVALID_USE ); } if ( device >= nDevices ) { errorText_ = "RtApiAsio::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } // If a stream is already open, we cannot probe other devices. Thus, use the saved results. if ( stream_.state != STREAM_CLOSED ) { if ( device >= devices_.size() ) { errorText_ = "RtApiAsio::getDeviceInfo: device ID was not present before stream was opened."; error( RtError::WARNING ); return info; } return devices_[ device ]; } char driverName[32]; ASIOError result = drivers.asioGetDriverName( (int) device, driverName, 32 ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::getDeviceInfo: unable to get driver name (" << getAsioErrorString( result ) << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } info.name = driverName; if ( !drivers.loadDriver( driverName ) ) { errorStream_ << "RtApiAsio::getDeviceInfo: unable to load driver (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } result = ASIOInit( &driverInfo ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Determine the device channel information. long inputChannels, outputChannels; result = ASIOGetChannels( &inputChannels, &outputChannels ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } info.outputChannels = outputChannels; info.inputChannels = inputChannels; if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Determine the supported sample rates. info.sampleRates.clear(); for ( unsigned int i=0; iobject; object->callbackEvent( index ); } void RtApiAsio :: saveDeviceInfo( void ) { devices_.clear(); unsigned int nDevices = getDeviceCount(); devices_.resize( nDevices ); for ( unsigned int i=0; isaveDeviceInfo(); // Only load the driver once for duplex stream. if ( mode != INPUT || stream_.mode != OUTPUT ) { if ( !drivers.loadDriver( driverName ) ) { errorStream_ << "RtApiAsio::probeDeviceOpen: unable to load driver (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } result = ASIOInit( &driverInfo ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Check the device channel count. long inputChannels, outputChannels; result = ASIOGetChannels( &inputChannels, &outputChannels ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ( ( mode == OUTPUT && (channels+firstChannel) > (unsigned int) outputChannels) || ( mode == INPUT && (channels+firstChannel) > (unsigned int) inputChannels) ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested channel count (" << channels << ") + offset (" << firstChannel << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; stream_.channelOffset[mode] = firstChannel; // Verify the sample rate is supported. result = ASIOCanSampleRate( (ASIOSampleRate) sampleRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Get the current sample rate ASIOSampleRate currentRate; result = ASIOGetSampleRate( ¤tRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error getting sample rate."; errorText_ = errorStream_.str(); return FAILURE; } // Set the sample rate only if necessary if ( currentRate != sampleRate ) { result = ASIOSetSampleRate( (ASIOSampleRate) sampleRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error setting sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Determine the driver data type. ASIOChannelInfo channelInfo; channelInfo.channel = 0; if ( mode == OUTPUT ) channelInfo.isInput = false; else channelInfo.isInput = true; result = ASIOGetChannelInfo( &channelInfo ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting data format."; errorText_ = errorStream_.str(); return FAILURE; } // Assuming WINDOWS host is always little-endian. stream_.doByteSwap[mode] = false; stream_.userFormat = format; stream_.deviceFormat[mode] = 0; if ( channelInfo.type == ASIOSTInt16MSB || channelInfo.type == ASIOSTInt16LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT16; if ( channelInfo.type == ASIOSTInt16MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTInt32MSB || channelInfo.type == ASIOSTInt32LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT32; if ( channelInfo.type == ASIOSTInt32MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTFloat32MSB || channelInfo.type == ASIOSTFloat32LSB ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; if ( channelInfo.type == ASIOSTFloat32MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; if ( channelInfo.type == ASIOSTFloat64MSB ) stream_.doByteSwap[mode] = true; } if ( stream_.deviceFormat[mode] == 0 ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; } // Set the buffer size. For a duplex stream, this will end up // setting the buffer size based on the input constraints, which // should be ok. long minSize, maxSize, preferSize, granularity; result = ASIOGetBufferSize( &minSize, &maxSize, &preferSize, &granularity ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting buffer size."; errorText_ = errorStream_.str(); return FAILURE; } if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; else if ( granularity == -1 ) { // Make sure bufferSize is a power of two. double power = log10( (double) *bufferSize ) / log10( 2.0 ); *bufferSize = (int) pow( 2.0, floor(power+0.5) ); if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; else *bufferSize = preferSize; } else if ( granularity != 0 ) { // Set to an even multiple of granularity, rounding up. *bufferSize = (*bufferSize + granularity-1) / granularity * granularity; } if ( mode == INPUT && stream_.mode == OUTPUT && stream_.bufferSize != *bufferSize ) { drivers.removeCurrentDriver(); errorText_ = "RtApiAsio::probeDeviceOpen: input/output buffersize discrepancy!"; return FAILURE; } stream_.bufferSize = *bufferSize; stream_.nBuffers = 2; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // ASIO always uses non-interleaved buffers. stream_.deviceInterleaved[mode] = false; // Allocate, if necessary, our AsioHandle structure for the stream. AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( handle == 0 ) { try { handle = new AsioHandle; } catch ( std::bad_alloc& ) { //if ( handle == NULL ) { drivers.removeCurrentDriver(); errorText_ = "RtApiAsio::probeDeviceOpen: error allocating AsioHandle memory."; return FAILURE; } handle->bufferInfos = 0; // Create a manual-reset event. handle->condition = CreateEvent( NULL, // no security TRUE, // manual-reset FALSE, // non-signaled initially NULL ); // unnamed stream_.apiHandle = (void *) handle; } // Create the ASIO internal buffers. Since RtAudio sets up input // and output separately, we'll have to dispose of previously // created output buffers for a duplex stream. long inputLatency, outputLatency; if ( mode == INPUT && stream_.mode == OUTPUT ) { ASIODisposeBuffers(); if ( handle->bufferInfos ) free( handle->bufferInfos ); } // Allocate, initialize, and save the bufferInfos in our stream callbackInfo structure. bool buffersAllocated = false; unsigned int i, nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; handle->bufferInfos = (ASIOBufferInfo *) malloc( nChannels * sizeof(ASIOBufferInfo) ); if ( handle->bufferInfos == NULL ) { errorStream_ << "RtApiAsio::probeDeviceOpen: error allocating bufferInfo memory for driver (" << driverName << ")."; errorText_ = errorStream_.str(); goto error; } ASIOBufferInfo *infos; infos = handle->bufferInfos; for ( i=0; iisInput = ASIOFalse; infos->channelNum = i + stream_.channelOffset[0]; infos->buffers[0] = infos->buffers[1] = 0; } for ( i=0; iisInput = ASIOTrue; infos->channelNum = i + stream_.channelOffset[1]; infos->buffers[0] = infos->buffers[1] = 0; } // Set up the ASIO callback structure and create the ASIO data buffers. asioCallbacks.bufferSwitch = &bufferSwitch; asioCallbacks.sampleRateDidChange = &sampleRateChanged; asioCallbacks.asioMessage = &asioMessages; asioCallbacks.bufferSwitchTimeInfo = NULL; result = ASIOCreateBuffers( handle->bufferInfos, nChannels, stream_.bufferSize, &asioCallbacks ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") creating buffers."; errorText_ = errorStream_.str(); goto error; } buffersAllocated = true; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiAsio::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiAsio::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.sampleRate = sampleRate; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; asioCallbackInfo = &stream_.callbackInfo; stream_.callbackInfo.object = (void *) this; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; // Determine device latencies result = ASIOGetLatencies( &inputLatency, &outputLatency ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting latency."; errorText_ = errorStream_.str(); error( RtError::WARNING); // warn but don't fail } else { stream_.latency[0] = outputLatency; stream_.latency[1] = inputLatency; } // Setup the buffer conversion information structure. We don't use // buffers to do channel offsets, so we override that parameter // here. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); return SUCCESS; error: if ( buffersAllocated ) ASIODisposeBuffers(); drivers.removeCurrentDriver(); if ( handle ) { CloseHandle( handle->condition ); if ( handle->bufferInfos ) free( handle->bufferInfos ); delete handle; stream_.apiHandle = 0; } for ( i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiAsio :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAsio::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } if ( stream_.state == STREAM_RUNNING ) { stream_.state = STREAM_STOPPED; ASIOStop(); } ASIODisposeBuffers(); drivers.removeCurrentDriver(); AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( handle ) { CloseHandle( handle->condition ); if ( handle->bufferInfos ) free( handle->bufferInfos ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiAsio :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiAsio::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); AsioHandle *handle = (AsioHandle *) stream_.apiHandle; ASIOError result = ASIOStart(); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::startStream: error (" << getAsioErrorString( result ) << ") starting device."; errorText_ = errorStream_.str(); goto unlock; } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; asioXRun = false; unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( result == ASE_OK ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAsio :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAsio::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 1; MUTEX_UNLOCK( &stream_.mutex ); WaitForMultipleObjects( 1, &handle->condition, FALSE, INFINITE ); // block until signaled ResetEvent( handle->condition ); MUTEX_LOCK( &stream_.mutex ); } } ASIOError result = ASIOStop(); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::stopStream: error (" << getAsioErrorString( result ) << ") stopping device."; errorText_ = errorStream_.str(); } stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( result == ASE_OK ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAsio :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAsio::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } // The following lines were commented-out because some behavior was // noted where the device buffers need to be zeroed to avoid // continuing sound, even when the device buffers are completed // disposed. So now, calling abort is the same as calling stop. //AsioHandle *handle = (AsioHandle *) stream_.apiHandle; //handle->drainCounter = 1; stopStream(); } bool RtApiAsio :: callbackEvent( long bufferIndex ) { unsigned int nChannels; if ( stream_.state == STREAM_STOPPED ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAsio::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; AsioHandle *handle = (AsioHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > 3 ) { if ( handle->internalDrain == false ) SetEvent( handle->condition ); else stopStream(); return SUCCESS; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) goto unlock; // Invoke user callback to get fresh output data UNLESS we are // draining stream. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && asioXRun == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; asioXRun = false; } if ( stream_.mode != OUTPUT && asioXRun == true ) { status |= RTAUDIO_INPUT_OVERFLOW; asioXRun = false; } handle->drainCounter = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( handle->drainCounter == 2 ) { MUTEX_UNLOCK( &stream_.mutex ); abortStream(); return SUCCESS; } else if ( handle->drainCounter == 1 ) handle->internalDrain = true; } unsigned int bufferBytes, i, j; nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { bufferBytes = stream_.bufferSize * formatBytes( stream_.deviceFormat[0] ); if ( handle->drainCounter > 1 ) { // write zeros to the output stream for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memset( handle->bufferInfos[i].buffers[bufferIndex], 0, bufferBytes ); } } else if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); if ( stream_.doByteSwap[0] ) byteSwapBuffer( stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[0], stream_.deviceFormat[0] ); for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memcpy( handle->bufferInfos[i].buffers[bufferIndex], &stream_.deviceBuffer[j++*bufferBytes], bufferBytes ); } } else { if ( stream_.doByteSwap[0] ) byteSwapBuffer( stream_.userBuffer[0], stream_.bufferSize * stream_.nUserChannels[0], stream_.userFormat ); for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memcpy( handle->bufferInfos[i].buffers[bufferIndex], &stream_.userBuffer[0][bufferBytes*j++], bufferBytes ); } } if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { bufferBytes = stream_.bufferSize * formatBytes(stream_.deviceFormat[1]); if (stream_.doConvertBuffer[1]) { // Always interleave ASIO input data. for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) memcpy( &stream_.deviceBuffer[j++*bufferBytes], handle->bufferInfos[i].buffers[bufferIndex], bufferBytes ); } if ( stream_.doByteSwap[1] ) byteSwapBuffer( stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[1], stream_.deviceFormat[1] ); convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } else { for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) { memcpy( &stream_.userBuffer[1][bufferBytes*j++], handle->bufferInfos[i].buffers[bufferIndex], bufferBytes ); } } if ( stream_.doByteSwap[1] ) byteSwapBuffer( stream_.userBuffer[1], stream_.bufferSize * stream_.nUserChannels[1], stream_.userFormat ); } } unlock: // The following call was suggested by Malte Clasen. While the API // documentation indicates it should not be required, some device // drivers apparently do not function correctly without it. ASIOOutputReady(); MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); return SUCCESS; } void sampleRateChanged( ASIOSampleRate sRate ) { // The ASIO documentation says that this usually only happens during // external sync. Audio processing is not stopped by the driver, // actual sample rate might not have even changed, maybe only the // sample rate status of an AES/EBU or S/PDIF digital input at the // audio device. RtApi *object = (RtApi *) asioCallbackInfo->object; try { object->stopStream(); } catch ( RtError &exception ) { std::cerr << "\nRtApiAsio: sampleRateChanged() error (" << exception.getMessage() << ")!\n" << std::endl; return; } std::cerr << "\nRtApiAsio: driver reports sample rate changed to " << sRate << " ... stream stopped!!!\n" << std::endl; } long asioMessages( long selector, long value, void* message, double* opt ) { long ret = 0; switch( selector ) { case kAsioSelectorSupported: if ( value == kAsioResetRequest || value == kAsioEngineVersion || value == kAsioResyncRequest || value == kAsioLatenciesChanged // The following three were added for ASIO 2.0, you don't // necessarily have to support them. || value == kAsioSupportsTimeInfo || value == kAsioSupportsTimeCode || value == kAsioSupportsInputMonitor) ret = 1L; break; case kAsioResetRequest: // Defer the task and perform the reset of the driver during the // next "safe" situation. You cannot reset the driver right now, // as this code is called from the driver. Reset the driver is // done by completely destruct is. I.e. ASIOStop(), // ASIODisposeBuffers(), Destruction Afterwards you initialize the // driver again. std::cerr << "\nRtApiAsio: driver reset requested!!!" << std::endl; ret = 1L; break; case kAsioResyncRequest: // This informs the application that the driver encountered some // non-fatal data loss. It is used for synchronization purposes // of different media. Added mainly to work around the Win16Mutex // problems in Windows 95/98 with the Windows Multimedia system, // which could lose data because the Mutex was held too long by // another thread. However a driver can issue it in other // situations, too. // std::cerr << "\nRtApiAsio: driver resync requested!!!" << std::endl; asioXRun = true; ret = 1L; break; case kAsioLatenciesChanged: // This will inform the host application that the drivers were // latencies changed. Beware, it this does not mean that the // buffer sizes have changed! You might need to update internal // delay data. std::cerr << "\nRtApiAsio: driver latency may have changed!!!" << std::endl; ret = 1L; break; case kAsioEngineVersion: // Return the supported ASIO version of the host application. If // a host application does not implement this selector, ASIO 1.0 // is assumed by the driver. ret = 2L; break; case kAsioSupportsTimeInfo: // Informs the driver whether the // asioCallbacks.bufferSwitchTimeInfo() callback is supported. // For compatibility with ASIO 1.0 drivers the host application // should always support the "old" bufferSwitch method, too. ret = 0; break; case kAsioSupportsTimeCode: // Informs the driver whether application is interested in time // code info. If an application does not need to know about time // code, the driver has less work to do. ret = 0; break; } return ret; } static const char* getAsioErrorString( ASIOError result ) { struct Messages { ASIOError value; const char*message; }; static Messages m[] = { { ASE_NotPresent, "Hardware input or output is not present or available." }, { ASE_HWMalfunction, "Hardware is malfunctioning." }, { ASE_InvalidParameter, "Invalid input parameter." }, { ASE_InvalidMode, "Invalid mode." }, { ASE_SPNotAdvancing, "Sample position not advancing." }, { ASE_NoClock, "Sample clock or rate cannot be determined or is not present." }, { ASE_NoMemory, "Not enough memory to complete the request." } }; for ( unsigned int i = 0; i < sizeof(m)/sizeof(m[0]); ++i ) if ( m[i].value == result ) return m[i].message; return "Unknown error."; } }; //******************** End of __WINDOWS_ASIO__ *********************// #endif #if defined(__WINDOWS_DS__) // Windows DirectSound API // Modified by Robin Davies, October 2005 // - Improvements to DirectX pointer chasing. // - Backdoor RtDsStatistics hook provides DirectX performance information. // - Bug fix for non-power-of-two Asio granularity used by Edirol PCR-A30. // - Auto-call CoInitialize for DSOUND and ASIO platforms. // Various revisions for RtAudio 4.0 by Gary Scavone, April 2007 #include #include #ifndef WAVE_FORMAT_96M08 #define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ #endif #ifndef WAVE_FORMAT_96S16 #define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ #endif #ifndef WAVE_FORMAT_96S16 #define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ #endif #ifndef WAVE_FORMAT_96S16 #define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */ #endif #define MINIMUM_DEVICE_BUFFER_SIZE 32768 #ifdef _MSC_VER // if Microsoft Visual C++ #pragma comment( lib, "winmm.lib" ) // then, auto-link winmm.lib. Otherwise, it has to be added manually. #endif namespace RtAudio4 { static inline DWORD dsPointerDifference( DWORD laterPointer, DWORD earlierPointer, DWORD bufferSize ) { if (laterPointer > earlierPointer) return laterPointer - earlierPointer; else return laterPointer - earlierPointer + bufferSize; } static inline DWORD dsPointerBetween( DWORD pointer, DWORD laterPointer, DWORD earlierPointer, DWORD bufferSize ) { if ( pointer > bufferSize ) pointer -= bufferSize; if ( laterPointer < earlierPointer ) laterPointer += bufferSize; if ( pointer < earlierPointer ) pointer += bufferSize; return pointer >= earlierPointer && pointer < laterPointer; } // A structure to hold various information related to the DirectSound // API implementation. struct DsHandle { unsigned int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. void *id[2]; void *buffer[2]; bool xrun[2]; UINT bufferPointer[2]; DWORD dsBufferSize[2]; DWORD dsPointerLeadTime[2]; // the number of bytes ahead of the safe pointer to lead by. HANDLE condition; DsHandle() :drainCounter(0), internalDrain(false) { id[0] = 0; id[1] = 0; buffer[0] = 0; buffer[1] = 0; xrun[0] = false; xrun[1] = false; bufferPointer[0] = 0; bufferPointer[1] = 0; } }; /* RtApiDs::RtDsStatistics RtApiDs::statistics; // Provides a backdoor hook to monitor for DirectSound read overruns and write underruns. RtApiDs::RtDsStatistics RtApiDs::getDsStatistics() { RtDsStatistics s = statistics; // update the calculated fields. if ( s.inputFrameSize != 0 ) s.latency += s.readDeviceSafeLeadBytes * 1.0 / s.inputFrameSize / s.sampleRate; if ( s.outputFrameSize != 0 ) s.latency += (s.writeDeviceSafeLeadBytes + s.writeDeviceBufferLeadBytes) * 1.0 / s.outputFrameSize / s.sampleRate; return s; } */ // Declarations for utility functions, callbacks, and structures // specific to the DirectSound implementation. static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext ); static char* getErrorString( int code ); extern "C" unsigned __stdcall callbackHandler_rt4( void *ptr ); struct EnumInfo { bool isInput; bool getDefault; bool findIndex; unsigned int counter; unsigned int index; LPGUID id; std::string name; EnumInfo() : isInput(false), getDefault(false), findIndex(false), counter(0), index(0) {} }; RtApiDs :: RtApiDs() { // Dsound will run both-threaded. If CoInitialize fails, then just // accept whatever the mainline chose for a threading model. coInitialized_ = false; HRESULT hr = CoInitialize( NULL ); if ( !FAILED( hr ) ) coInitialized_ = true; } RtApiDs :: ~RtApiDs() { if ( coInitialized_ ) CoUninitialize(); // balanced call. if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiDs :: getDefaultInputDevice( void ) { // Count output devices. EnumInfo info; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultOutputDevice: error (" << getErrorString( result ) << ") counting output devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return 0; } // Now enumerate input devices until we find the id = NULL. info.isInput = true; info.getDefault = true; result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultInputDevice: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return 0; } if ( info.counter > 0 ) return info.counter - 1; return 0; } unsigned int RtApiDs :: getDefaultOutputDevice( void ) { // Enumerate output devices until we find the id = NULL. EnumInfo info; info.getDefault = true; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultOutputDevice: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return 0; } if ( info.counter > 0 ) return info.counter - 1; return 0; } unsigned int RtApiDs :: getDeviceCount( void ) { // Count DirectSound devices. EnumInfo info; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceCount: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); } // Count DirectSoundCapture devices. info.isInput = true; result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceCount: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); } return info.counter; } RtAudio::DeviceInfo RtApiDs :: getDeviceInfo( unsigned int device ) { unsigned int k; // Because DirectSound always enumerates input and output devices // separately (and because we don't attempt to combine devices // internally), none of our "devices" will ever be duplex. RtAudio::DeviceInfo info; info.probed = false; // Enumerate through devices to find the id (if it exists). Note // that we have to do the output enumeration first, even if this is // an input device, in order for the device counter to be correct. EnumInfo dsinfo; dsinfo.findIndex = true; dsinfo.index = device; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); } if ( dsinfo.name.empty() ) goto probeInput; LPDIRECTSOUND output; DSCAPS outCaps; result = DirectSoundCreate( dsinfo.id, &output, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening output device (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } outCaps.dwSize = sizeof( outCaps ); result = output->GetCaps( &outCaps ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting capabilities!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Get output channel information. info.outputChannels = ( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ? 2 : 1; // Get sample rate information. info.sampleRates.clear(); for ( k=0; k= (unsigned int) outCaps.dwMinSecondarySampleRate && SAMPLE_RATES[k] <= (unsigned int) outCaps.dwMaxSecondarySampleRate ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } // Get format information. if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT ) info.nativeFormats |= RTAUDIO_SINT16; if ( outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) info.nativeFormats |= RTAUDIO_SINT8; output->Release(); if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; // Copy name and return. info.name = dsinfo.name; info.probed = true; return info; probeInput: dsinfo.isInput = true; result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); } if ( dsinfo.name.empty() ) return info; LPDIRECTSOUNDCAPTURE input; result = DirectSoundCaptureCreate( dsinfo.id, &input, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening input device (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } DSCCAPS inCaps; inCaps.dwSize = sizeof( inCaps ); result = input->GetCaps( &inCaps ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting object capabilities (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Get input channel information. info.inputChannels = inCaps.dwChannels; // Get sample rate and format information. if ( inCaps.dwChannels == 2 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( info.nativeFormats & RTAUDIO_SINT16 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) info.sampleRates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) info.sampleRates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) info.sampleRates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) info.sampleRates.push_back( 96000 ); } else if ( info.nativeFormats & RTAUDIO_SINT8 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) info.sampleRates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) info.sampleRates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) info.sampleRates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) info.sampleRates.push_back( 44100 ); } } else if ( inCaps.dwChannels == 1 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( info.nativeFormats & RTAUDIO_SINT16 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) info.sampleRates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) info.sampleRates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) info.sampleRates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) info.sampleRates.push_back( 96000 ); } else if ( info.nativeFormats & RTAUDIO_SINT8 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) info.sampleRates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) info.sampleRates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) info.sampleRates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) info.sampleRates.push_back( 96000 ); } } else info.inputChannels = 0; // technically, this would be an error input->Release(); if ( info.inputChannels == 0 ) return info; if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; // Copy name and return. info.name = dsinfo.name; info.probed = true; return info; } bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { if ( channels + firstChannel > 2 ) { errorText_ = "RtApiDs::probeDeviceOpen: DirectSound does not support more than 2 channels per device."; return FAILURE; } // Enumerate through devices to find the id (if it exists). Note // that we have to do the output enumeration first, even if this is // an input device, in order for the device counter to be correct. EnumInfo dsinfo; dsinfo.findIndex = true; dsinfo.index = device; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); return FAILURE; } if ( mode == OUTPUT ) { if ( dsinfo.name.empty() ) { errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support output!"; errorText_ = errorStream_.str(); return FAILURE; } } else { // mode == INPUT dsinfo.isInput = true; HRESULT result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); return FAILURE; } if ( dsinfo.name.empty() ) { errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support input!"; errorText_ = errorStream_.str(); return FAILURE; } } // According to a note in PortAudio, using GetDesktopWindow() // instead of GetForegroundWindow() is supposed to avoid problems // that occur when the application's window is not the foreground // window. Also, if the application window closes before the // DirectSound buffer, DirectSound can crash. However, for console // applications, no sound was produced when using GetDesktopWindow(). HWND hWnd = GetForegroundWindow(); // Check the numberOfBuffers parameter and limit the lowest value to // two. This is a judgement call and a value of two is probably too // low for capture, but it should work for playback. int nBuffers = 0; if ( options ) nBuffers = options->numberOfBuffers; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) nBuffers = 2; if ( nBuffers < 2 ) nBuffers = 3; // Create the wave format structure. The data format setting will // be determined later. WAVEFORMATEX waveFormat; ZeroMemory( &waveFormat, sizeof(WAVEFORMATEX) ); waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.nChannels = channels + firstChannel; waveFormat.nSamplesPerSec = (unsigned long) sampleRate; // Determine the device buffer size. By default, 32k, but we will // grow it to make allowances for very large software buffer sizes. DWORD dsBufferSize = 0; DWORD dsPointerLeadTime = 0; long bufferBytes = MINIMUM_DEVICE_BUFFER_SIZE; // sound cards will always *knock wood* support this void *ohandle = 0, *bhandle = 0; if ( mode == OUTPUT ) { LPDIRECTSOUND output; result = DirectSoundCreate( dsinfo.id, &output, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening output device (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } DSCAPS outCaps; outCaps.dwSize = sizeof( outCaps ); result = output->GetCaps( &outCaps ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting capabilities (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Check channel information. if ( channels + firstChannel == 2 && !( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ) { errorStream_ << "RtApiDs::getDeviceInfo: the output device (" << dsinfo.name << ") does not support stereo playback."; errorText_ = errorStream_.str(); return FAILURE; } // Check format information. Use 16-bit format unless not // supported or user requests 8-bit. if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT && !( format == RTAUDIO_SINT8 && outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) ) { waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } stream_.userFormat = format; // Update wave format structure and buffer information. waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; // If the user wants an even bigger buffer, increase the device buffer size accordingly. while ( dsPointerLeadTime * 2U > (DWORD) bufferBytes ) bufferBytes *= 2; // Set cooperative level to DSSCL_EXCLUSIVE ... sound stops when window focus changes. //result = output->SetCooperativeLevel( hWnd, DSSCL_EXCLUSIVE ); // Set cooperative level to DSSCL_PRIORITY ... sound remains when window focus changes. result = output->SetCooperativeLevel( hWnd, DSSCL_PRIORITY ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting cooperative level (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Even though we will write to the secondary buffer, we need to // access the primary buffer to set the correct output format // (since the default is 8-bit, 22 kHz!). Setup the DS primary // buffer description. DSBUFFERDESC bufferDescription; ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSBUFFERDESC ); bufferDescription.dwFlags = DSBCAPS_PRIMARYBUFFER; // Obtain the primary buffer LPDIRECTSOUNDBUFFER buffer; result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") accessing primary buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Set the primary DS buffer sound format. result = buffer->SetFormat( &waveFormat ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting primary buffer format (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Setup the secondary DS buffer description. dsBufferSize = (DWORD) bufferBytes; ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSBUFFERDESC ); bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE ); // Force hardware mixing bufferDescription.dwBufferBytes = bufferBytes; bufferDescription.lpwfxFormat = &waveFormat; // Try to create the secondary DS buffer. If that doesn't work, // try to use software mixing. Otherwise, there's a problem. result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCSOFTWARE ); // Force software mixing result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating secondary buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } } // Get the buffer size ... might be different from what we specified. DSBCAPS dsbcaps; dsbcaps.dwSize = sizeof( DSBCAPS ); result = buffer->GetCaps( &dsbcaps ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } bufferBytes = dsbcaps.dwBufferBytes; // Lock the DS buffer LPVOID audioPtr; DWORD dataLen; result = buffer->Lock( 0, bufferBytes, &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } dsBufferSize = bufferBytes; ohandle = (void *) output; bhandle = (void *) buffer; } if ( mode == INPUT ) { LPDIRECTSOUNDCAPTURE input; result = DirectSoundCaptureCreate( dsinfo.id, &input, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening input device (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } DSCCAPS inCaps; inCaps.dwSize = sizeof( inCaps ); result = input->GetCaps( &inCaps ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting input capabilities (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Check channel information. if ( inCaps.dwChannels < channels + firstChannel ) { errorText_ = "RtApiDs::getDeviceInfo: the input device does not support requested input channels."; return FAILURE; } // Check format information. Use 16-bit format unless user // requests 8-bit. DWORD deviceFormats; if ( channels + firstChannel == 2 ) { deviceFormats = WAVE_FORMAT_1S08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_96S08; if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } else { // assume 16-bit is supported waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } } else { // channel == 1 deviceFormats = WAVE_FORMAT_1M08 | WAVE_FORMAT_2M08 | WAVE_FORMAT_4M08 | WAVE_FORMAT_96M08; if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } else { // assume 16-bit is supported waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } } stream_.userFormat = format; // Update wave format structure and buffer information. waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; // Setup the secondary DS buffer description. dsBufferSize = bufferBytes; DSCBUFFERDESC bufferDescription; ZeroMemory( &bufferDescription, sizeof( DSCBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSCBUFFERDESC ); bufferDescription.dwFlags = 0; bufferDescription.dwReserved = 0; bufferDescription.dwBufferBytes = bufferBytes; bufferDescription.lpwfxFormat = &waveFormat; // Create the capture buffer. LPDIRECTSOUNDCAPTUREBUFFER buffer; result = input->CreateCaptureBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating input buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Lock the capture buffer LPVOID audioPtr; DWORD dataLen; result = buffer->Lock( 0, bufferBytes, &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { input->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking input buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Zero the buffer ZeroMemory( audioPtr, dataLen ); // Unlock the buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { input->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking input buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } dsBufferSize = bufferBytes; ohandle = (void *) input; bhandle = (void *) buffer; } // Set various stream parameters stream_.nDeviceChannels[mode] = channels + firstChannel; stream_.nUserChannels[mode] = channels; stream_.bufferSize = *bufferSize; stream_.channelOffset[mode] = firstChannel; stream_.deviceInterleaved[mode] = true; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // Set flag for buffer conversion stream_.doConvertBuffer[mode] = false; if (stream_.nUserChannels[mode] != stream_.nDeviceChannels[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= (long) bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } // Allocate our DsHandle structures for the stream. DsHandle *handle; if ( stream_.apiHandle == 0 ) { try { handle = new DsHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating AsioHandle memory."; goto error; } memset(handle, 0, sizeof(DsHandle)); // Create a manual-reset event. handle->condition = CreateEvent( NULL, // no security TRUE, // manual-reset FALSE, // non-signaled initially NULL ); // unnamed stream_.apiHandle = (void *) handle; } else handle = (DsHandle *) stream_.apiHandle; handle->id[mode] = ohandle; handle->buffer[mode] = bhandle; handle->dsBufferSize[mode] = dsBufferSize; handle->dsPointerLeadTime[mode] = dsPointerLeadTime; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; stream_.nBuffers = nBuffers; stream_.sampleRate = sampleRate; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup the callback thread. unsigned threadId; stream_.callbackInfo.object = (void *) this; stream_.callbackInfo.isRunning = true; stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &callbackHandler_rt4, &stream_.callbackInfo, 0, &threadId ); if ( stream_.callbackInfo.thread == 0 ) { errorText_ = "RtApiDs::probeDeviceOpen: error creating callback thread!"; goto error; } // Boost DS thread priority SetThreadPriority( (HANDLE) stream_.callbackInfo.thread, THREAD_PRIORITY_HIGHEST ); return SUCCESS; error: if ( handle ) { if ( handle->buffer[0] ) { // the object pointer can be NULL and valid LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( buffer ) buffer->Release(); object->Release(); } if ( handle->buffer[1] ) { LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; if ( buffer ) buffer->Release(); object->Release(); } CloseHandle( handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiDs :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiDs::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } // Stop the callback thread. stream_.callbackInfo.isRunning = false; WaitForSingleObject( (HANDLE) stream_.callbackInfo.thread, INFINITE ); CloseHandle( (HANDLE) stream_.callbackInfo.thread ); DsHandle *handle = (DsHandle *) stream_.apiHandle; if ( handle ) { if ( handle->buffer[0] ) { // the object pointer can be NULL and valid LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( buffer ) { buffer->Stop(); buffer->Release(); } object->Release(); } if ( handle->buffer[1] ) { LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; if ( buffer ) { buffer->Stop(); buffer->Release(); } object->Release(); } CloseHandle( handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiDs :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiDs::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } // Increase scheduler frequency on lesser windows (a side-effect of // increasing timer accuracy). On greater windows (Win2K or later), // this is already in effect. MUTEX_LOCK( &stream_.mutex ); DsHandle *handle = (DsHandle *) stream_.apiHandle; timeBeginPeriod( 1 ); /* memset( &statistics, 0, sizeof( statistics ) ); statistics.sampleRate = stream_.sampleRate; statistics.writeDeviceBufferLeadBytes = handle->dsPointerLeadTime[0]; */ buffersRolling = false; duplexPrerollBytes = 0; if ( stream_.mode == DUPLEX ) { // 0.5 seconds of silence in DUPLEX mode while the devices spin up and synchronize. duplexPrerollBytes = (int) ( 0.5 * stream_.sampleRate * formatBytes( stream_.deviceFormat[1] ) * stream_.nDeviceChannels[1] ); } HRESULT result = 0; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { //statistics.outputFrameSize = formatBytes( stream_.deviceFormat[0] ) * stream_.nDeviceChannels[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; result = buffer->Play( 0, 0, DSBPLAY_LOOPING ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting output buffer!"; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { //statistics.inputFrameSize = formatBytes( stream_.deviceFormat[1]) * stream_.nDeviceChannels[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; result = buffer->Start( DSCBSTART_LOOPING ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting input buffer!"; errorText_ = errorStream_.str(); goto unlock; } } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( FAILED( result ) ) error( RtError::SYSTEM_ERROR ); } void RtApiDs :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiDs::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); HRESULT result = 0; LPVOID audioPtr; DWORD dataLen; DsHandle *handle = (DsHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 1; MUTEX_UNLOCK( &stream_.mutex ); WaitForMultipleObjects( 1, &handle->condition, FALSE, INFINITE ); // block until signaled ResetEvent( handle->condition ); MUTEX_LOCK( &stream_.mutex ); } // Stop the buffer and clear memory LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; result = buffer->Stop(); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::abortStream: error (" << getErrorString( result ) << ") stopping output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock( 0, handle->dsBufferSize[0], &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::abortStream: error (" << getErrorString( result ) << ") locking output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::abortStream: error (" << getErrorString( result ) << ") unlocking output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // If we start playing again, we must begin at beginning of buffer. handle->bufferPointer[0] = 0; } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; audioPtr = NULL; dataLen = 0; result = buffer->Stop(); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::abortStream: error (" << getErrorString( result ) << ") stopping input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock( 0, handle->dsBufferSize[1], &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::abortStream: error (" << getErrorString( result ) << ") locking input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::abortStream: error (" << getErrorString( result ) << ") unlocking input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // If we start recording again, we must begin at beginning of buffer. handle->bufferPointer[1] = 0; } unlock: timeEndPeriod( 1 ); // revert to normal scheduler frequency on lesser windows. stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); double waitMillis = ((double)stream_.bufferSize / (double)stream_.sampleRate) * 1000.0 * 4.0; if (waitMillis < 1.0) waitMillis = 1.0; if (waitMillis > 1000.0) waitMillis = 1000.0; ::Sleep((DWORD)waitMillis); if ( FAILED( result ) ) error( RtError::SYSTEM_ERROR ); } void RtApiDs :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiDs::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } DsHandle *handle = (DsHandle *) stream_.apiHandle; handle->drainCounter = 1; stopStream(); } void RtApiDs :: callbackEvent() { if ( stream_.state == STREAM_STOPPED ) { Sleep(50); // sleep 50 milliseconds return; } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiDs::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; DsHandle *handle = (DsHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > stream_.nBuffers + 2 ) { if ( handle->internalDrain == false ) SetEvent( handle->condition ); else stopStream(); return; } MUTEX_LOCK( &stream_.mutex ); // Invoke user callback to get fresh output data UNLESS we are // draining stream. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } handle->drainCounter = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( handle->drainCounter == 2 ) { MUTEX_UNLOCK( &stream_.mutex ); abortStream(); return; } else if ( handle->drainCounter == 1 ) handle->internalDrain = true; } HRESULT result; DWORD currentWritePos, safeWritePos; DWORD currentReadPos, safeReadPos; DWORD leadPos; UINT nextWritePos; #ifdef GENERATE_DEBUG_LOG DWORD writeTime, readTime; #endif LPVOID buffer1 = NULL; LPVOID buffer2 = NULL; DWORD bufferSize1 = 0; DWORD bufferSize2 = 0; char *buffer; long bufferBytes; if ( stream_.mode == DUPLEX && !buffersRolling ) { assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); // It takes a while for the devices to get rolling. As a result, // there's no guarantee that the capture and write device pointers // will move in lockstep. Wait here for both devices to start // rolling, and then set our buffer pointers accordingly. // e.g. Crystal Drivers: the capture buffer starts up 5700 to 9600 // bytes later than the write buffer. // Stub: a serious risk of having a pre-emptive scheduling round // take place between the two GetCurrentPosition calls... but I'm // really not sure how to solve the problem. Temporarily boost to // Realtime priority, maybe; but I'm not sure what priority the // DirectSound service threads run at. We *should* be roughly // within a ms or so of correct. LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; LPDIRECTSOUNDCAPTUREBUFFER dsCaptureBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; DWORD initialWritePos, initialSafeWritePos; DWORD initialReadPos, initialSafeReadPos; result = dsWriteBuffer->GetCurrentPosition( &initialWritePos, &initialSafeWritePos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } result = dsCaptureBuffer->GetCurrentPosition( &initialReadPos, &initialSafeReadPos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } while ( true ) { result = dsWriteBuffer->GetCurrentPosition( ¤tWritePos, &safeWritePos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } result = dsCaptureBuffer->GetCurrentPosition( ¤tReadPos, &safeReadPos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } if ( safeWritePos != initialSafeWritePos && safeReadPos != initialSafeReadPos ) break; Sleep( 1 ); } assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); buffersRolling = true; handle->bufferPointer[0] = ( safeWritePos + handle->dsPointerLeadTime[0] ); handle->bufferPointer[1] = safeReadPos; } if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { LPDIRECTSOUNDBUFFER dsBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( handle->drainCounter > 1 ) { // write zeros to the output stream bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; bufferBytes *= formatBytes( stream_.userFormat ); memset( stream_.userBuffer[0], 0, bufferBytes ); } // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[0]; bufferBytes *= formatBytes( stream_.deviceFormat[0] ); } else { buffer = stream_.userBuffer[0]; bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; bufferBytes *= formatBytes( stream_.userFormat ); } // No byte swapping necessary in DirectSound implementation. // Ahhh ... windoze. 16-bit data is signed but 8-bit data is // unsigned. So, we need to convert our signed 8-bit data here to // unsigned. if ( stream_.deviceFormat[0] == RTAUDIO_SINT8 ) for ( int i=0; idsBufferSize[0]; nextWritePos = handle->bufferPointer[0]; DWORD endWrite; MUTEX_UNLOCK( &stream_.mutex ); // MilkyTracker: Prevent hang on exit (mutex is re-locked further down) while ( true ) { // Find out where the read and "safe write" pointers are. result = dsBuffer->GetCurrentPosition( ¤tWritePos, &safeWritePos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } leadPos = safeWritePos + handle->dsPointerLeadTime[0]; if ( leadPos > dsBufferSize ) leadPos -= dsBufferSize; if ( leadPos < nextWritePos ) leadPos += dsBufferSize; // unwrap offset endWrite = nextWritePos + bufferBytes; // Check whether the entire write region is behind the play pointer. if ( leadPos >= endWrite ) break; // If we are here, then we must wait until the play pointer gets // beyond the write region. The approach here is to use the // Sleep() function to suspend operation until safePos catches // up. Calculate number of milliseconds to wait as: // time = distance * (milliseconds/second) * fudgefactor / // ((bytes/sample) * (samples/second)) // A "fudgefactor" less than 1 is used because it was found // that sleeping too long was MUCH worse than sleeping for // several shorter periods. double millis = ( endWrite - leadPos ) * 900.0; millis /= ( formatBytes( stream_.deviceFormat[0]) * stream_.nDeviceChannels[0] * stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; if ( millis > 50.0 ) { static int nOverruns = 0; ++nOverruns; } Sleep( (DWORD) millis ); // MilkyTracker: Hang on exit was occurring here } MUTEX_LOCK( &stream_.mutex ); // MilkyTracker: Re-lock stream here //if ( statistics.writeDeviceSafeLeadBytes < dsPointerDifference( safeWritePos, currentWritePos, handle->dsBufferSize[0] ) ) { // statistics.writeDeviceSafeLeadBytes = dsPointerDifference( safeWritePos, currentWritePos, handle->dsBufferSize[0] ); //} if ( dsPointerBetween( nextWritePos, safeWritePos, currentWritePos, dsBufferSize ) || dsPointerBetween( endWrite, safeWritePos, currentWritePos, dsBufferSize ) ) { // We've strayed into the forbidden zone ... resync the read pointer. //++statistics.numberOfWriteUnderruns; handle->xrun[0] = true; nextWritePos = safeWritePos + handle->dsPointerLeadTime[0] - bufferBytes + dsBufferSize; while ( nextWritePos >= dsBufferSize ) nextWritePos -= dsBufferSize; handle->bufferPointer[0] = nextWritePos; endWrite = nextWritePos + bufferBytes; } // Lock free space in the buffer result = dsBuffer->Lock( nextWritePos, bufferBytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking buffer during playback!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } // Copy our buffer into the DS buffer CopyMemory( buffer1, buffer, bufferSize1 ); if ( buffer2 != NULL ) CopyMemory( buffer2, buffer+bufferSize1, bufferSize2 ); // Update our buffer offset and unlock sound buffer dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking buffer during playback!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } nextWritePos = ( nextWritePos + bufferSize1 + bufferSize2 ) % dsBufferSize; handle->bufferPointer[0] = nextWritePos; if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[1]; bufferBytes *= formatBytes( stream_.deviceFormat[1] ); } else { buffer = stream_.userBuffer[1]; bufferBytes = stream_.bufferSize * stream_.nUserChannels[1]; bufferBytes *= formatBytes( stream_.userFormat ); } LPDIRECTSOUNDCAPTUREBUFFER dsBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; long nextReadPos = handle->bufferPointer[1]; DWORD dsBufferSize = handle->dsBufferSize[1]; // Find out where the write and "safe read" pointers are. result = dsBuffer->GetCurrentPosition( ¤tReadPos, &safeReadPos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } if ( safeReadPos < (DWORD)nextReadPos ) safeReadPos += dsBufferSize; // unwrap offset DWORD endRead = nextReadPos + bufferBytes; // Handling depends on whether we are INPUT or DUPLEX. // If we're in INPUT mode then waiting is a good thing. If we're in DUPLEX mode, // then a wait here will drag the write pointers into the forbidden zone. // // In DUPLEX mode, rather than wait, we will back off the read pointer until // it's in a safe position. This causes dropouts, but it seems to be the only // practical way to sync up the read and write pointers reliably, given the // the very complex relationship between phase and increment of the read and write // pointers. // // In order to minimize audible dropouts in DUPLEX mode, we will // provide a pre-roll period of 0.5 seconds in which we return // zeros from the read buffer while the pointers sync up. if ( stream_.mode == DUPLEX ) { if ( safeReadPos < endRead ) { if ( duplexPrerollBytes <= 0 ) { // Pre-roll time over. Be more agressive. int adjustment = endRead-safeReadPos; handle->xrun[1] = true; //++statistics.numberOfReadOverruns; // Two cases: // - large adjustments: we've probably run out of CPU cycles, so just resync exactly, // and perform fine adjustments later. // - small adjustments: back off by twice as much. if ( adjustment >= 2*bufferBytes ) nextReadPos = safeReadPos-2*bufferBytes; else nextReadPos = safeReadPos-bufferBytes-adjustment; //statistics.readDeviceSafeLeadBytes = currentReadPos-nextReadPos; //if ( statistics.readDeviceSafeLeadBytes < 0) statistics.readDeviceSafeLeadBytes += dsBufferSize; if ( nextReadPos < 0 ) nextReadPos += dsBufferSize; } else { // In pre=roll time. Just do it. nextReadPos = safeReadPos-bufferBytes; while ( nextReadPos < 0 ) nextReadPos += dsBufferSize; } endRead = nextReadPos + bufferBytes; } } else { // mode == INPUT while ( safeReadPos < endRead ) { // See comments for playback. double millis = (endRead - safeReadPos) * 900.0; millis /= ( formatBytes(stream_.deviceFormat[1]) * stream_.nDeviceChannels[1] * stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; Sleep( (DWORD) millis ); // Wake up, find out where we are now result = dsBuffer->GetCurrentPosition( ¤tReadPos, &safeReadPos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } if ( safeReadPos < (DWORD)nextReadPos ) safeReadPos += dsBufferSize; // unwrap offset } } //if (statistics.readDeviceSafeLeadBytes < dsPointerDifference( currentReadPos, nextReadPos, dsBufferSize ) ) // statistics.readDeviceSafeLeadBytes = dsPointerDifference( currentReadPos, nextReadPos, dsBufferSize ); // Lock free space in the buffer result = dsBuffer->Lock( nextReadPos, bufferBytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking capture buffer!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } if ( duplexPrerollBytes <= 0 ) { // Copy our buffer into the DS buffer CopyMemory( buffer, buffer1, bufferSize1 ); if ( buffer2 != NULL ) CopyMemory( buffer+bufferSize1, buffer2, bufferSize2 ); } else { memset( buffer, 0, bufferSize1 ); if ( buffer2 != NULL ) memset( buffer + bufferSize1, 0, bufferSize2 ); duplexPrerollBytes -= bufferSize1 + bufferSize2; } // Update our buffer offset and unlock sound buffer nextReadPos = ( nextReadPos + bufferSize1 + bufferSize2 ) % dsBufferSize; dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking capture buffer!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } handle->bufferPointer[1] = nextReadPos; // No byte swapping necessary in DirectSound implementation. // If necessary, convert 8-bit data from unsigned to signed. if ( stream_.deviceFormat[1] == RTAUDIO_SINT8 ) for ( int j=0; jobject; bool* isRunning = &info->isRunning; while ( *isRunning == true ) { object->callbackEvent(); } _endthreadex( 0 ); return 0; } #include "tchar.h" std::string convertTChar( LPCTSTR name ) { std::string s; #if defined( UNICODE ) || defined( _UNICODE ) // Yes, this conversion doesn't make sense for two-byte characters // but RtAudio is currently written to return an std::string of // one-byte chars for the device name. for ( unsigned int i=0; iisInput == true ) { DSCCAPS caps; LPDIRECTSOUNDCAPTURE object; hr = DirectSoundCaptureCreate( lpguid, &object, NULL ); if ( hr != DS_OK ) return TRUE; caps.dwSize = sizeof(caps); hr = object->GetCaps( &caps ); if ( hr == DS_OK ) { if ( caps.dwChannels > 0 && caps.dwFormats > 0 ) info->counter++; } object->Release(); } else { DSCAPS caps; LPDIRECTSOUND object; hr = DirectSoundCreate( lpguid, &object, NULL ); if ( hr != DS_OK ) return TRUE; caps.dwSize = sizeof(caps); hr = object->GetCaps( &caps ); if ( hr == DS_OK ) { if ( caps.dwFlags & DSCAPS_PRIMARYMONO || caps.dwFlags & DSCAPS_PRIMARYSTEREO ) info->counter++; } object->Release(); } if ( info->getDefault && lpguid == NULL ) return FALSE; if ( info->findIndex && info->counter > info->index ) { info->id = lpguid; info->name = convertTChar( description ); return FALSE; } return TRUE; } static char* getErrorString( int code ) { switch ( code ) { case DSERR_ALLOCATED: return "Already allocated"; case DSERR_CONTROLUNAVAIL: return "Control unavailable"; case DSERR_INVALIDPARAM: return "Invalid parameter"; case DSERR_INVALIDCALL: return "Invalid call"; case DSERR_GENERIC: return "Generic error"; case DSERR_PRIOLEVELNEEDED: return "Priority level needed"; case DSERR_OUTOFMEMORY: return "Out of memory"; case DSERR_BADFORMAT: return "The sample rate or the channel format is not supported"; case DSERR_UNSUPPORTED: return "Not supported"; case DSERR_NODRIVER: return "No driver"; case DSERR_ALREADYINITIALIZED: return "Already initialized"; case DSERR_NOAGGREGATION: return "No aggregation"; case DSERR_BUFFERLOST: return "Buffer lost"; case DSERR_OTHERAPPHASPRIO: return "Another application already has priority"; case DSERR_UNINITIALIZED: return "Uninitialized"; default: return "DirectSound unknown error"; } } }; //******************** End of __WINDOWS_DS__ *********************// #endif #if defined(__LINUX_ALSA__) #include #include namespace RtAudio4 { // A structure to hold various information related to the ALSA API // implementation. struct AlsaHandle { snd_pcm_t *handles[2]; bool synchronized; bool xrun[2]; AlsaHandle() :synchronized(false) { xrun[0] = false; xrun[1] = false; } }; extern "C" void *alsaCallbackHandler( void * ptr ); RtApiAlsa :: RtApiAlsa() { // Nothing to do here. } RtApiAlsa :: ~RtApiAlsa() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiAlsa :: getDeviceCount( void ) { unsigned nDevices = 0; int result, subdevice, card; char name[64]; snd_ctl_t *handle; // Count cards and devices card = -1; snd_card_next( &card ); while ( card >= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &handle, name, 0 ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceCount: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto nextcard; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( handle, &subdevice ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceCount: control next device, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); break; } if ( subdevice < 0 ) break; nDevices++; } nextcard: snd_ctl_close( handle ); snd_card_next( &card ); } return nDevices; } RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; unsigned nDevices = 0; int result, subdevice, card; char name[64]; snd_ctl_t *chandle; // Count cards and devices card = -1; snd_card_next( &card ); while ( card >= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto nextcard; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( chandle, &subdevice ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: control next device, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); break; } if ( subdevice < 0 ) break; if ( nDevices == device ) { sprintf( name, "hw:%d,%d", card, subdevice ); goto foundDevice; } nDevices++; } nextcard: snd_ctl_close( chandle ); snd_card_next( &card ); } if ( nDevices == 0 ) { errorText_ = "RtApiAlsa::getDeviceInfo: no devices found!"; error( RtError::INVALID_USE ); } if ( device >= nDevices ) { errorText_ = "RtApiAlsa::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } foundDevice: // If a stream is already open, we cannot probe the stream devices. // Thus, use the saved results. if ( stream_.state != STREAM_CLOSED && ( stream_.device[0] == device || stream_.device[1] == device ) ) { if ( device >= devices_.size() ) { errorText_ = "RtApiAlsa::getDeviceInfo: device ID was not present before stream was opened."; error( RtError::WARNING ); return info; } return devices_[ device ]; } int openMode = SND_PCM_ASYNC; snd_pcm_stream_t stream; snd_pcm_info_t *pcminfo; snd_pcm_info_alloca( &pcminfo ); snd_pcm_t *phandle; snd_pcm_hw_params_t *params; snd_pcm_hw_params_alloca( ¶ms ); // First try for playback stream = SND_PCM_STREAM_PLAYBACK; snd_pcm_info_set_device( pcminfo, subdevice ); snd_pcm_info_set_subdevice( pcminfo, 0 ); snd_pcm_info_set_stream( pcminfo, stream ); result = snd_ctl_pcm_info( chandle, pcminfo ); if ( result < 0 ) { // Device probably doesn't support playback. goto captureProbe; } result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto captureProbe; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto captureProbe; } // Get output channel information. unsigned int value; result = snd_pcm_hw_params_get_channels_max( params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") output channels, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto captureProbe; } info.outputChannels = value; snd_pcm_close( phandle ); captureProbe: // Now try for capture stream = SND_PCM_STREAM_CAPTURE; snd_pcm_info_set_stream( pcminfo, stream ); result = snd_ctl_pcm_info( chandle, pcminfo ); snd_ctl_close( chandle ); if ( result < 0 ) { // Device probably doesn't support capture. if ( info.outputChannels == 0 ) return info; goto probeParameters; } result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } result = snd_pcm_hw_params_get_channels_max( params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") input channels, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } info.inputChannels = value; snd_pcm_close( phandle ); // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // ALSA doesn't provide default devices so we'll use the first available one. if ( device == 0 && info.outputChannels > 0 ) info.isDefaultOutput = true; if ( device == 0 && info.inputChannels > 0 ) info.isDefaultInput = true; probeParameters: // At this point, we just need to figure out the supported data // formats and sample rates. We'll proceed by opening the device in // the direction with the maximum number of channels, or playback if // they are equal. This might limit our sample rate options, but so // be it. if ( info.outputChannels >= info.inputChannels ) stream = SND_PCM_STREAM_PLAYBACK; else stream = SND_PCM_STREAM_CAPTURE; snd_pcm_info_set_stream( pcminfo, stream ); result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Test our discrete set of sample rate values. info.sampleRates.clear(); for ( unsigned int i=0; i= 0 ) sprintf( name, "hw:%s,%d", cardname, subdevice ); info.name = name; // That's all ... close the device and return snd_pcm_close( phandle ); info.probed = true; return info; } void RtApiAlsa :: saveDeviceInfo( void ) { devices_.clear(); unsigned int nDevices = getDeviceCount(); devices_.resize( nDevices ); for ( unsigned int i=0; i= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::probeDeviceOpen: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( chandle, &subdevice ); if ( result < 0 ) break; if ( subdevice < 0 ) break; if ( nDevices == device ) { sprintf( name, "hw:%d,%d", card, subdevice ); snd_ctl_close( chandle ); goto foundDevice; } nDevices++; } snd_ctl_close( chandle ); snd_card_next( &card ); } if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiAlsa::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiAlsa::probeDeviceOpen: device ID is invalid!"; return FAILURE; } foundDevice: // The getDeviceInfo() function will not work for a device that is // already open. Thus, we'll probe the system before opening a // stream and save the results for use by getDeviceInfo(). if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) // only do once this->saveDeviceInfo(); snd_pcm_stream_t stream; if ( mode == OUTPUT ) stream = SND_PCM_STREAM_PLAYBACK; else stream = SND_PCM_STREAM_CAPTURE; snd_pcm_t *phandle; int openMode = SND_PCM_ASYNC; result = snd_pcm_open( &phandle, name, stream, openMode ); if ( result < 0 ) { if ( mode == OUTPUT ) errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for output."; else errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for input."; errorText_ = errorStream_.str(); return FAILURE; } // Fill the parameter structure. snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_alloca( &hw_params ); result = snd_pcm_hw_params_any( phandle, hw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") parameters, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf( stderr, "\nRtApiAlsa: dump hardware params just after device open:\n\n" ); snd_pcm_hw_params_dump( hw_params, out ); #endif // Set access ... check user preference. if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) { stream_.userInterleaved = false; result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); if ( result < 0 ) { result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); stream_.deviceInterleaved[mode] = true; } else stream_.deviceInterleaved[mode] = false; } else { stream_.userInterleaved = true; result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); if ( result < 0 ) { result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); stream_.deviceInterleaved[mode] = false; } else stream_.deviceInterleaved[mode] = true; } if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") access, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine how to set the device format. stream_.userFormat = format; snd_pcm_format_t deviceFormat = SND_PCM_FORMAT_UNKNOWN; if ( format == RTAUDIO_SINT8 ) deviceFormat = SND_PCM_FORMAT_S8; else if ( format == RTAUDIO_SINT16 ) deviceFormat = SND_PCM_FORMAT_S16; else if ( format == RTAUDIO_SINT24 ) deviceFormat = SND_PCM_FORMAT_S24; else if ( format == RTAUDIO_SINT32 ) deviceFormat = SND_PCM_FORMAT_S32; else if ( format == RTAUDIO_FLOAT32 ) deviceFormat = SND_PCM_FORMAT_FLOAT; else if ( format == RTAUDIO_FLOAT64 ) deviceFormat = SND_PCM_FORMAT_FLOAT64; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat) == 0) { stream_.deviceFormat[mode] = format; goto setFormat; } // The user requested format is not natively supported by the device. deviceFormat = SND_PCM_FORMAT_FLOAT64; if ( snd_pcm_hw_params_test_format( phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; goto setFormat; } deviceFormat = SND_PCM_FORMAT_FLOAT; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S32; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT32; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S24; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT24; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S16; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT16; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S8; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT8; goto setFormat; } // If we get here, no supported format was found. errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device " << device << " data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; setFormat: result = snd_pcm_hw_params_set_format( phandle, hw_params, deviceFormat ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") data format, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine whether byte-swaping is necessary. stream_.doByteSwap[mode] = false; if ( deviceFormat != SND_PCM_FORMAT_S8 ) { result = snd_pcm_format_cpu_endian( deviceFormat ); if ( result == 0 ) stream_.doByteSwap[mode] = true; else if (result < 0) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") endian-ness, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } } // Set the sample rate. result = snd_pcm_hw_params_set_rate_near( phandle, hw_params, (unsigned int*) &sampleRate, 0 ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting sample rate on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine the number of channels for this device. We support a possible // minimum device channel number > than the value requested by the user. stream_.nUserChannels[mode] = channels; unsigned int value; result = snd_pcm_hw_params_get_channels_max( hw_params, &value ); unsigned int deviceChannels = value; if ( result < 0 || deviceChannels < channels + firstChannel ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: requested channel parameters not supported by device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } result = snd_pcm_hw_params_get_channels_min( hw_params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting minimum channels for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } deviceChannels = value; if ( deviceChannels < channels + firstChannel ) deviceChannels = channels + firstChannel; stream_.nDeviceChannels[mode] = deviceChannels; // Set the device channels. result = snd_pcm_hw_params_set_channels( phandle, hw_params, deviceChannels ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting channels for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Set the buffer number, which in ALSA is referred to as the "period". int dir; unsigned int periods = 0; if ( options ) periods = options->numberOfBuffers; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) periods = 2; // Even though the hardware might allow 1 buffer, it won't work reliably. if ( periods < 2 ) periods = 2; result = snd_pcm_hw_params_set_periods_near( phandle, hw_params, &periods, &dir ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting periods for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Set the buffer (or period) size. snd_pcm_uframes_t periodSize = *bufferSize; result = snd_pcm_hw_params_set_period_size_near( phandle, hw_params, &periodSize, &dir ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting period size for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } *bufferSize = periodSize; // If attempting to setup a duplex stream, the bufferSize parameter // MUST be the same in both directions! if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { errorStream_ << "RtApiAlsa::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.bufferSize = *bufferSize; // Install the hardware configuration result = snd_pcm_hw_params( phandle, hw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing hardware configuration on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump hardware params after installation:\n\n"); snd_pcm_hw_params_dump( hw_params, out ); #endif // Set the software configuration to fill buffers with zeros and prevent device stopping on xruns. snd_pcm_sw_params_t *sw_params = NULL; snd_pcm_sw_params_alloca( &sw_params ); snd_pcm_sw_params_current( phandle, sw_params ); snd_pcm_sw_params_set_start_threshold( phandle, sw_params, *bufferSize ); snd_pcm_sw_params_set_stop_threshold( phandle, sw_params, 0x7fffffff ); snd_pcm_sw_params_set_silence_threshold( phandle, sw_params, 0 ); snd_pcm_sw_params_set_silence_size( phandle, sw_params, INT_MAX ); result = snd_pcm_sw_params( phandle, sw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing software configuration on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump software params after installation:\n\n"); snd_pcm_sw_params_dump( sw_params, out ); #endif // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate the ApiHandle if necessary and then save. AlsaHandle *apiInfo = 0; if ( stream_.apiHandle == 0 ) { try { apiInfo = (AlsaHandle *) new AlsaHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating AlsaHandle memory."; goto error; } stream_.apiHandle = (void *) apiInfo; apiInfo->handles[0] = 0; apiInfo->handles[1] = 0; } else { apiInfo = (AlsaHandle *) stream_.apiHandle; } apiInfo->handles[mode] = phandle; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.sampleRate = sampleRate; stream_.nBuffers = periods; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup thread if necessary. if ( stream_.mode == OUTPUT && mode == INPUT ) { // We had already set up an output stream. stream_.mode = DUPLEX; // Link the streams if possible. apiInfo->synchronized = false; if ( snd_pcm_link( apiInfo->handles[0], apiInfo->handles[1] ) == 0 ) apiInfo->synchronized = true; else { errorText_ = "RtApiAlsa::probeDeviceOpen: unable to synchronize input and output devices."; error( RtError::WARNING ); } } else { stream_.mode = mode; // Setup callback thread. stream_.callbackInfo.object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority. The higher priority will only take affect if the // program is run as root or suid. pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); #ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) pthread_attr_setschedpolicy( &attr, SCHED_RR ); #else pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #endif stream_.callbackInfo.isRunning = true; result = pthread_create( &stream_.callbackInfo.thread, &attr, alsaCallbackHandler, &stream_.callbackInfo ); pthread_attr_destroy( &attr ); if ( result ) { stream_.callbackInfo.isRunning = false; errorText_ = "RtApiAlsa::error creating callback thread!"; goto error; } } return SUCCESS; error: if ( apiInfo ) { if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); delete apiInfo; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiAlsa :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAlsa::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } stream_.callbackInfo.isRunning = false; pthread_join( stream_.callbackInfo.thread, NULL ); AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; if ( stream_.state == STREAM_RUNNING ) { stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) snd_pcm_drop( apiInfo->handles[0] ); if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) snd_pcm_drop( apiInfo->handles[1] ); } if ( apiInfo ) { if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); delete apiInfo; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiAlsa :: startStream() { // This method calls snd_pcm_prepare if the device isn't already in that state. verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiAlsa::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); int result = 0; snd_pcm_state_t state; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { state = snd_pcm_state( handle[0] ); if ( state != SND_PCM_STATE_PREPARED ) { result = snd_pcm_prepare( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::startStream: error preparing output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { state = snd_pcm_state( handle[1] ); if ( state != SND_PCM_STATE_PREPARED ) { result = snd_pcm_prepare( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::startStream: error preparing input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } } stream_.state = STREAM_RUNNING; unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( result >= 0 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAlsa :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAlsa::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); int result = 0; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( apiInfo->synchronized ) result = snd_pcm_drop( handle[0] ); else result = snd_pcm_drain( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::stopStream: error draining output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { result = snd_pcm_drop( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::stopStream: error stopping input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( result >= 0 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAlsa :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAlsa::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); int result = 0; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = snd_pcm_drop( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::abortStream: error aborting output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { result = snd_pcm_drop( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::abortStream: error aborting input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } unlock: MUTEX_UNLOCK( &stream_.mutex ); stream_.state = STREAM_STOPPED; if ( result >= 0 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAlsa :: callbackEvent() { if ( stream_.state == STREAM_STOPPED ) { if ( stream_.callbackInfo.isRunning ) usleep( 50000 ); // sleep 50 milliseconds return; } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAlsa::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return; } int doStopStream = 0; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && apiInfo->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; apiInfo->xrun[0] = false; } if ( stream_.mode != OUTPUT && apiInfo->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; apiInfo->xrun[1] = false; } doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) goto unlock; int result; char *buffer; int channels; snd_pcm_t **handle; snd_pcm_sframes_t frames; RtAudioFormat format; handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; channels = stream_.nDeviceChannels[1]; format = stream_.deviceFormat[1]; } else { buffer = stream_.userBuffer[1]; channels = stream_.nUserChannels[1]; format = stream_.userFormat; } // Read samples from device in interleaved/non-interleaved format. if ( stream_.deviceInterleaved[1] ) result = snd_pcm_readi( handle[1], buffer, stream_.bufferSize ); else { void *bufs[channels]; size_t offset = stream_.bufferSize * formatBytes( format ); for ( int i=0; ixrun[1] = true; result = snd_pcm_prepare( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after overrun, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: audio read error, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } error( RtError::WARNING ); goto unlock; } // Do byte swapping if necessary. if ( stream_.doByteSwap[1] ) byteSwapBuffer( buffer, stream_.bufferSize * channels, format ); // Do buffer conversion if necessary. if ( stream_.doConvertBuffer[1] ) convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); // Check stream latency result = snd_pcm_delay( handle[1], &frames ); if ( result == 0 && frames > 0 ) stream_.latency[1] = frames; } if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); channels = stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; channels = stream_.nUserChannels[0]; format = stream_.userFormat; } // Do byte swapping if necessary. if ( stream_.doByteSwap[0] ) byteSwapBuffer(buffer, stream_.bufferSize * channels, format); // Write samples to device in interleaved/non-interleaved format. if ( stream_.deviceInterleaved[0] ) result = snd_pcm_writei( handle[0], buffer, stream_.bufferSize ); else { void *bufs[channels]; size_t offset = stream_.bufferSize * formatBytes( format ); for ( int i=0; ixrun[0] = true; result = snd_pcm_prepare( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after underrun, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: audio write error, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } error( RtError::WARNING ); goto unlock; } // Check stream latency result = snd_pcm_delay( handle[0], &frames ); if ( result == 0 && frames > 0 ) stream_.latency[0] = frames; } unlock: MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); if ( doStopStream == 1 ) this->stopStream(); else if ( doStopStream == 2 ) this->abortStream(); } extern "C" void *alsaCallbackHandler( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiAlsa *object = (RtApiAlsa *) info->object; bool *isRunning = &info->isRunning; #ifdef SCHED_RR // Set a higher scheduler priority (P.J. Leonard) struct sched_param param; int min = sched_get_priority_min( SCHED_RR ); int max = sched_get_priority_max( SCHED_RR ); param.sched_priority = min + ( max - min ) / 2; // Is this the best number? sched_setscheduler( 0, SCHED_RR, ¶m ); #endif while ( *isRunning == true ) { pthread_testcancel(); object->callbackEvent(); } pthread_exit( NULL ); } }; //******************** End of __LINUX_ALSA__ *********************// #endif #if defined(__LINUX_OSS__) #include #include #include #include #include "oss/soundcard.h" #include #include namespace RtAudio4 { extern "C" void *ossCallbackHandler(void * ptr); // A structure to hold various information related to the OSS API // implementation. struct OssHandle { int id[2]; // device ids bool xrun[2]; bool triggered; OssHandle() :triggered(false) { id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } }; RtApiOss :: RtApiOss() { // Nothing to do here. } RtApiOss :: ~RtApiOss() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiOss :: getDeviceCount( void ) { int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::getDeviceCount: error opening '/dev/mixer'."; error( RtError::WARNING ); return 0; } oss_sysinfo sysinfo; if ( ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ) == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceCount: error getting sysinfo, OSS version >= 4.0 is required."; error( RtError::WARNING ); return 0; } close( mixerfd ); return sysinfo.numaudios; } RtAudio::DeviceInfo RtApiOss :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::getDeviceInfo: error opening '/dev/mixer'."; error( RtError::WARNING ); return info; } oss_sysinfo sysinfo; int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); if ( result == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: error getting sysinfo, OSS version >= 4.0 is required."; error( RtError::WARNING ); return info; } unsigned nDevices = sysinfo.numaudios; if ( nDevices == 0 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: no devices found!"; error( RtError::INVALID_USE ); } if ( device >= nDevices ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } oss_audioinfo ainfo; ainfo.dev = device; result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); close( mixerfd ); if ( result == -1 ) { errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Probe channels if ( ainfo.caps & PCM_CAP_OUTPUT ) info.outputChannels = ainfo.max_channels; if ( ainfo.caps & PCM_CAP_INPUT ) info.inputChannels = ainfo.max_channels; if ( ainfo.caps & PCM_CAP_DUPLEX ) { if ( info.outputChannels > 0 && info.inputChannels > 0 && ainfo.caps & PCM_CAP_DUPLEX ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; } // Probe data formats ... do for input unsigned long mask = ainfo.iformats; if ( mask & AFMT_S16_LE || mask & AFMT_S16_BE ) info.nativeFormats |= RTAUDIO_SINT16; if ( mask & AFMT_S8 ) info.nativeFormats |= RTAUDIO_SINT8; if ( mask & AFMT_S32_LE || mask & AFMT_S32_BE ) info.nativeFormats |= RTAUDIO_SINT32; if ( mask & AFMT_FLOAT ) info.nativeFormats |= RTAUDIO_FLOAT32; if ( mask & AFMT_S24_LE || mask & AFMT_S24_BE ) info.nativeFormats |= RTAUDIO_SINT24; // Check that we have at least one supported format if ( info.nativeFormats == 0 ) { errorStream_ << "RtApiOss::getDeviceInfo: device (" << ainfo.name << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Probe the supported sample rates. info.sampleRates.clear(); if ( ainfo.nrates ) { for ( unsigned int i=0; i= (int) SAMPLE_RATES[k] ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } } if ( info.sampleRates.size() == 0 ) { errorStream_ << "RtApiOss::getDeviceInfo: no supported sample rates found for device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); } else { info.probed = true; info.name = ainfo.name; } return info; } bool RtApiOss :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::probeDeviceOpen: error opening '/dev/mixer'."; return FAILURE; } oss_sysinfo sysinfo; int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); if ( result == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: error getting sysinfo, OSS version >= 4.0 is required."; return FAILURE; } unsigned nDevices = sysinfo.numaudios; if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: device ID is invalid!"; return FAILURE; } oss_audioinfo ainfo; ainfo.dev = device; result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); close( mixerfd ); if ( result == -1 ) { errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; errorText_ = errorStream_.str(); return FAILURE; } // Check if device supports input or output if ( ( mode == OUTPUT && !( ainfo.caps & PCM_CAP_OUTPUT ) ) || ( mode == INPUT && !( ainfo.caps & PCM_CAP_INPUT ) ) ) { if ( mode == OUTPUT ) errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support output."; else errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support input."; errorText_ = errorStream_.str(); return FAILURE; } int flags = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( mode == OUTPUT ) flags |= O_WRONLY; else { // mode == INPUT if (stream_.mode == OUTPUT && stream_.device[0] == device) { // We just set the same device for playback ... close and reopen for duplex (OSS only). close( handle->id[0] ); handle->id[0] = 0; if ( !( ainfo.caps & PCM_CAP_DUPLEX ) ) { errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support duplex mode."; errorText_ = errorStream_.str(); return FAILURE; } // Check that the number previously set channels is the same. if ( stream_.nUserChannels[0] != channels ) { errorStream_ << "RtApiOss::probeDeviceOpen: input/output channels must be equal for OSS duplex device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } flags |= O_RDWR; } else flags |= O_RDONLY; } // Set exclusive access if specified. if ( options && options->flags & RTAUDIO_HOG_DEVICE ) flags |= O_EXCL; // Try to open the device. int fd; fd = open( ainfo.devnode, flags, 0 ); if ( fd == -1 ) { if ( errno == EBUSY ) errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") is busy."; else errorStream_ << "RtApiOss::probeDeviceOpen: error opening device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // For duplex operation, specifically set this mode (this doesn't seem to work). /* if ( flags | O_RDWR ) { result = ioctl( fd, SNDCTL_DSP_SETDUPLEX, NULL ); if ( result == -1) { errorStream_ << "RtApiOss::probeDeviceOpen: error setting duplex mode for device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } } */ // Check the device channel support. stream_.nUserChannels[mode] = channels; if ( ainfo.max_channels < (int)(channels + firstChannel) ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: the device (" << ainfo.name << ") does not support requested channel parameters."; errorText_ = errorStream_.str(); return FAILURE; } // Set the number of channels. int deviceChannels = channels + firstChannel; result = ioctl( fd, SNDCTL_DSP_CHANNELS, &deviceChannels ); if ( result == -1 || deviceChannels < (int)(channels + firstChannel) ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting channel parameters on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nDeviceChannels[mode] = deviceChannels; // Get the data format mask int mask; result = ioctl( fd, SNDCTL_DSP_GETFMTS, &mask ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error getting device (" << ainfo.name << ") data formats."; errorText_ = errorStream_.str(); return FAILURE; } // Determine how to set the device format. stream_.userFormat = format; int deviceFormat = -1; stream_.doByteSwap[mode] = false; if ( format == RTAUDIO_SINT8 ) { if ( mask & AFMT_S8 ) { deviceFormat = AFMT_S8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } } else if ( format == RTAUDIO_SINT16 ) { if ( mask & AFMT_S16_NE ) { deviceFormat = AFMT_S16_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else if ( mask & AFMT_S16_OE ) { deviceFormat = AFMT_S16_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } } else if ( format == RTAUDIO_SINT24 ) { if ( mask & AFMT_S24_NE ) { deviceFormat = AFMT_S24_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; } else if ( mask & AFMT_S24_OE ) { deviceFormat = AFMT_S24_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; stream_.doByteSwap[mode] = true; } } else if ( format == RTAUDIO_SINT32 ) { if ( mask & AFMT_S32_NE ) { deviceFormat = AFMT_S32_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; } else if ( mask & AFMT_S32_OE ) { deviceFormat = AFMT_S32_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } } if ( deviceFormat == -1 ) { // The user requested format is not natively supported by the device. if ( mask & AFMT_S16_NE ) { deviceFormat = AFMT_S16_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else if ( mask & AFMT_S32_NE ) { deviceFormat = AFMT_S32_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; } else if ( mask & AFMT_S24_NE ) { deviceFormat = AFMT_S24_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; } else if ( mask & AFMT_S16_OE ) { deviceFormat = AFMT_S16_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S32_OE ) { deviceFormat = AFMT_S32_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S24_OE ) { deviceFormat = AFMT_S24_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S8) { deviceFormat = AFMT_S8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } } if ( stream_.deviceFormat[mode] == 0 ) { // This really shouldn't happen ... close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; } // Set the data format. int temp = deviceFormat; result = ioctl( fd, SNDCTL_DSP_SETFMT, &deviceFormat ); if ( result == -1 || deviceFormat != temp ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting data format on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Attempt to set the buffer size. According to OSS, the minimum // number of buffers is two. The supposed minimum buffer size is 16 // bytes, so that will be our lower bound. The argument to this // call is in the form 0xMMMMSSSS (hex), where the buffer size (in // bytes) is given as 2^SSSS and the number of buffers as 2^MMMM. // We'll check the actual value used near the end of the setup // procedure. int ossBufferBytes = *bufferSize * formatBytes( stream_.deviceFormat[mode] ) * deviceChannels; if ( ossBufferBytes < 16 ) ossBufferBytes = 16; int buffers = 0; if ( options ) buffers = options->numberOfBuffers; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) buffers = 2; if ( buffers < 2 ) buffers = 3; temp = ((int) buffers << 16) + (int)( log10( (double)ossBufferBytes ) / log10( 2.0 ) ); result = ioctl( fd, SNDCTL_DSP_SETFRAGMENT, &temp ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting buffer size on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nBuffers = buffers; // Save buffer size (in sample frames). *bufferSize = ossBufferBytes / ( formatBytes(stream_.deviceFormat[mode]) * deviceChannels ); stream_.bufferSize = *bufferSize; // Set the sample rate. int srate = sampleRate; result = ioctl( fd, SNDCTL_DSP_SPEED, &srate ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting sample rate (" << sampleRate << ") on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Verify the sample rate setup worked. if ( abs( srate - sampleRate ) > 100 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.sampleRate = sampleRate; if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device) { // We're doing duplex setup here. stream_.deviceFormat[0] = stream_.deviceFormat[1]; stream_.nDeviceChannels[0] = deviceChannels; } // Set interleaving parameters. stream_.userInterleaved = true; stream_.deviceInterleaved[mode] = true; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate the stream handles if necessary and then save. if ( stream_.apiHandle == 0 ) { try { handle = new OssHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating OssHandle memory."; goto error; } stream_.apiHandle = (void *) handle; } else { handle = (OssHandle *) stream_.apiHandle; } handle->id[mode] = fd; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.device[mode] = device; stream_.state = STREAM_STOPPED; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup thread if necessary. if ( stream_.mode == OUTPUT && mode == INPUT ) { // We had already set up an output stream. stream_.mode = DUPLEX; if ( stream_.device[0] == device ) handle->id[0] = fd; } else { stream_.mode = mode; // Setup callback thread. stream_.callbackInfo.object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority. The higher priority will only take affect if the // program is run as root or suid. pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); #ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) pthread_attr_setschedpolicy( &attr, SCHED_RR ); #else pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #endif stream_.callbackInfo.isRunning = true; result = pthread_create( &stream_.callbackInfo.thread, &attr, ossCallbackHandler, &stream_.callbackInfo ); pthread_attr_destroy( &attr ); if ( result ) { stream_.callbackInfo.isRunning = false; errorText_ = "RtApiOss::error creating callback thread!"; goto error; } } return SUCCESS; error: if ( handle ) { if ( handle->id[0] ) close( handle->id[0] ); if ( handle->id[1] ) close( handle->id[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiOss :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiOss::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } stream_.callbackInfo.isRunning = false; pthread_join( stream_.callbackInfo.thread, NULL ); OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.state == STREAM_RUNNING ) { if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); else ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); stream_.state = STREAM_STOPPED; } if ( handle ) { if ( handle->id[0] ) close( handle->id[0] ); if ( handle->id[1] ) close( handle->id[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiOss :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiOss::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); stream_.state = STREAM_RUNNING; // No need to do anything else here ... OSS automatically starts // when fed samples. MUTEX_UNLOCK( &stream_.mutex ); } void RtApiOss :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiOss::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); int result = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Flush the output with zeros a few times. char *buffer; int samples; RtAudioFormat format; if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; samples = stream_.bufferSize * stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; samples = stream_.bufferSize * stream_.nUserChannels[0]; format = stream_.userFormat; } memset( buffer, 0, samples * formatBytes(format) ); for ( unsigned int i=0; iid[0], buffer, samples * formatBytes(format) ); if ( result == -1 ) { errorText_ = "RtApiOss::stopStream: audio write error."; error( RtError::WARNING ); } } result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::stopStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } handle->triggered = false; } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::stopStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } unlock: MUTEX_UNLOCK( &stream_.mutex ); stream_.state = STREAM_STOPPED; if ( result != -1 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiOss :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiOss::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } // Change the state before the lock to improve shutdown response // when using a callback. stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); int result = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::abortStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } handle->triggered = false; } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::abortStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } unlock: MUTEX_UNLOCK( &stream_.mutex ); stream_.state = STREAM_STOPPED; if ( result != -1 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiOss :: callbackEvent() { if ( stream_.state == STREAM_STOPPED ) { if ( stream_.callbackInfo.isRunning ) usleep( 50000 ); // sleep 50 milliseconds return; } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiOss::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return; } // Invoke user callback to get fresh output data. int doStopStream = 0; RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) goto unlock; int result; char *buffer; int samples; RtAudioFormat format; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); samples = stream_.bufferSize * stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; samples = stream_.bufferSize * stream_.nUserChannels[0]; format = stream_.userFormat; } // Do byte swapping if necessary. if ( stream_.doByteSwap[0] ) byteSwapBuffer( buffer, samples, format ); if ( stream_.mode == DUPLEX && handle->triggered == false ) { int trig = 0; ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); result = write( handle->id[0], buffer, samples * formatBytes(format) ); trig = PCM_ENABLE_INPUT|PCM_ENABLE_OUTPUT; ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); handle->triggered = true; } else // Write samples to device. result = write( handle->id[0], buffer, samples * formatBytes(format) ); if ( result == -1 ) { // We'll assume this is an underrun, though there isn't a // specific means for determining that. handle->xrun[0] = true; errorText_ = "RtApiOss::callbackEvent: audio write error."; error( RtError::WARNING ); goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; samples = stream_.bufferSize * stream_.nDeviceChannels[1]; format = stream_.deviceFormat[1]; } else { buffer = stream_.userBuffer[1]; samples = stream_.bufferSize * stream_.nUserChannels[1]; format = stream_.userFormat; } // Read samples from device. result = read( handle->id[1], buffer, samples * formatBytes(format) ); if ( result == -1 ) { // We'll assume this is an overrun, though there isn't a // specific means for determining that. handle->xrun[1] = true; errorText_ = "RtApiOss::callbackEvent: audio read error."; error( RtError::WARNING ); goto unlock; } // Do byte swapping if necessary. if ( stream_.doByteSwap[1] ) byteSwapBuffer( buffer, samples, format ); // Do buffer conversion if necessary. if ( stream_.doConvertBuffer[1] ) convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } unlock: MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); if ( doStopStream == 1 ) this->stopStream(); else if ( doStopStream == 2 ) this->abortStream(); } extern "C" void *ossCallbackHandler( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiOss *object = (RtApiOss *) info->object; bool *isRunning = &info->isRunning; #ifdef SCHED_RR // Set a higher scheduler priority (P.J. Leonard) struct sched_param param; param.sched_priority = 39; // Is this the best number? sched_setscheduler( 0, SCHED_RR, ¶m ); #endif while ( *isRunning == true ) { pthread_testcancel(); object->callbackEvent(); } pthread_exit( NULL ); } }; //******************** End of __LINUX_OSS__ *********************// #endif namespace RtAudio4 { // *************************************************** // // // Protected common (OS-independent) RtAudio methods. // // *************************************************** // // This method can be modified to control the behavior of error // message printing. void RtApi :: error( RtError::Type type ) { errorStream_.str(""); // clear the ostringstream if ( type == RtError::WARNING && showWarnings_ == true ) std::cerr << '\n' << errorText_ << "\n\n"; else throw( RtError( errorText_, type ) ); } void RtApi :: verifyStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApi:: a stream is not open!"; error( RtError::INVALID_USE ); } } void RtApi :: clearStreamInfo() { stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; stream_.sampleRate = 0; stream_.bufferSize = 0; stream_.nBuffers = 0; stream_.userFormat = 0; stream_.userInterleaved = true; stream_.streamTime = 0.0; stream_.apiHandle = 0; stream_.deviceBuffer = 0; stream_.callbackInfo.callback = 0; stream_.callbackInfo.userData = 0; stream_.callbackInfo.isRunning = false; for ( int i=0; i<2; i++ ) { stream_.device[i] = 11111; stream_.doConvertBuffer[i] = false; stream_.deviceInterleaved[i] = true; stream_.doByteSwap[i] = false; stream_.nUserChannels[i] = 0; stream_.nDeviceChannels[i] = 0; stream_.channelOffset[i] = 0; stream_.deviceFormat[i] = 0; stream_.latency[i] = 0; stream_.userBuffer[i] = 0; stream_.convertInfo[i].channels = 0; stream_.convertInfo[i].inJump = 0; stream_.convertInfo[i].outJump = 0; stream_.convertInfo[i].inFormat = 0; stream_.convertInfo[i].outFormat = 0; stream_.convertInfo[i].inOffset.clear(); stream_.convertInfo[i].outOffset.clear(); } } unsigned int RtApi :: formatBytes( RtAudioFormat format ) { if ( format == RTAUDIO_SINT16 ) return 2; else if ( format == RTAUDIO_SINT24 || format == RTAUDIO_SINT32 || format == RTAUDIO_FLOAT32 ) return 4; else if ( format == RTAUDIO_FLOAT64 ) return 8; else if ( format == RTAUDIO_SINT8 ) return 1; errorText_ = "RtApi::formatBytes: undefined format."; error( RtError::WARNING ); return 0; } void RtApi :: setConvertInfo( StreamMode mode, unsigned int firstChannel ) { if ( mode == INPUT ) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( stream_.deviceInterleaved[mode] != stream_.userInterleaved ) { if ( ( mode == OUTPUT && stream_.deviceInterleaved[mode] ) || ( mode == INPUT && stream_.userInterleaved ) ) { for ( int k=0; k 0 ) { if ( stream_.deviceInterleaved[mode] ) { if ( mode == OUTPUT ) { for ( int k=0; k>= 8; } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i> 8) & 0x0000ffff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; for (unsigned int i=0; i> 16) & 0x0000ffff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i> 8) & 0x00ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT24) { Int32 *in = (Int32 *)inBuffer; for (unsigned int i=0; i> 16) & 0x000000ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; for (unsigned int i=0; i> 24) & 0x000000ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i #include #include namespace RtAudio4 { class RtError : public std::exception { public: //! Defined RtError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ INVALID_USE, /*!< The function was called incorrectly. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; //! The constructor. RtError( const std::string& message, Type type = RtError::UNSPECIFIED ) throw() : message_(message), type_(type) {} //! The destructor. virtual ~RtError( void ) throw() {} //! Prints thrown error message to stderr. virtual void printMessage( void ) throw() { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) throw() { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) throw() { return message_; } //! Returns the thrown error message as a c-style string. virtual const char* what( void ) const throw() { return message_.c_str(); } protected: std::string message_; Type type_; }; }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/RtAudio3.h0000755000175000017500000007346611163425013025610 0ustar admin2admin2/************************************************************************/ /*! \class RtAudio \brief Realtime audio i/o C++ classes. RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), SGI, Macintosh OS X (CoreAudio), and Windows (DirectSound and ASIO) operating systems. RtAudio WWW site: http://music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2005 Gary P. Scavone 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. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. 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. */ /************************************************************************/ // RtAudio: Version 3.0.3 (18 November 2005) #ifndef __RTAUDIO_H #define __RTAUDIO_H #include "RtError3.h" #include #include // Operating system dependent thread functionality. #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) #include #include typedef unsigned long ThreadHandle; typedef CRITICAL_SECTION StreamMutex; #else // Various unix flavors with pthread support. #include typedef pthread_t ThreadHandle; typedef pthread_mutex_t StreamMutex; #endif // This global structure type is used to pass callback information // between the private RtAudio stream structure and global callback // handling functions. struct CallbackInfo { void *object; // Used as a "this" pointer. ThreadHandle thread; bool usingCallback; void *callback; void *userData; void *apiInfo; // void pointer for API specific callback information // Default constructor. CallbackInfo() :object(0), usingCallback(false), callback(0), userData(0), apiInfo(0) {} }; // Support for signed integers and floats. Audio data fed to/from // the tickStream() routine is assumed to ALWAYS be in host // byte order. The internal routines will automatically take care of // any necessary byte-swapping between the host format and the // soundcard. Thus, endian-ness is not a concern in the following // format definitions. typedef unsigned long RtAudioFormat; static const RtAudioFormat RTAUDIO_SINT8 = 0x1; /*!< 8-bit signed integer. */ static const RtAudioFormat RTAUDIO_SINT16 = 0x2; /*!< 16-bit signed integer. */ static const RtAudioFormat RTAUDIO_SINT24 = 0x4; /*!< Upper 3 bytes of 32-bit signed integer. */ static const RtAudioFormat RTAUDIO_SINT32 = 0x8; /*!< 32-bit signed integer. */ static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; /*!< Normalized between plus/minus 1.0. */ static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; /*!< Normalized between plus/minus 1.0. */ typedef int (*RtAudioCallback)(char *buffer, int bufferSize, void *userData); //! The public device information structure for returning queried values. struct RtAudioDeviceInfo { std::string name; /*!< Character string device identifier. */ bool probed; /*!< true if the device capabilities were successfully probed. */ int outputChannels; /*!< Maximum output channels supported by device. */ int inputChannels; /*!< Maximum input channels supported by device. */ int duplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ bool isDefault; /*!< true if this is the default output or input device. */ std::vector sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ // Default constructor. RtAudioDeviceInfo() :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), isDefault(false), nativeFormats(0) {} }; // **************************************************************** // // // RtApi class declaration. // // Note that RtApi is an abstract base class and cannot be // explicitly instantiated. The class RtAudio will create an // instance of an RtApi subclass (RtApiOss, RtApiAlsa, // RtApiJack, RtApiCore, RtApiAl, RtApiDs, or RtApiAsio). // // **************************************************************** // class RtApi { public: enum StreamState { STREAM_STOPPED, STREAM_RUNNING }; RtApi(); virtual ~RtApi(); void openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers ); void openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers ); virtual void setStreamCallback( RtAudioCallback callback, void *userData ) = 0; virtual void cancelStreamCallback() = 0; int getDeviceCount(void); RtAudioDeviceInfo getDeviceInfo( int device ); char * const getStreamBuffer(); RtApi::StreamState getStreamState() const; virtual void tickStream() = 0; virtual void closeStream(); virtual void startStream() = 0; virtual void stopStream() = 0; virtual void abortStream() = 0; protected: static const unsigned int MAX_SAMPLE_RATES; static const unsigned int SAMPLE_RATES[]; enum { FAILURE, SUCCESS }; enum StreamMode { OUTPUT, INPUT, DUPLEX, UNINITIALIZED = -75 }; // A protected structure used for buffer conversion. struct ConvertInfo { int channels; int inJump, outJump; RtAudioFormat inFormat, outFormat; std::vector inOffset; std::vector outOffset; }; // A protected structure for audio streams. struct RtApiStream { int device[2]; // Playback and record, respectively. void *apiHandle; // void pointer for API specific stream handle information StreamMode mode; // OUTPUT, INPUT, or DUPLEX. StreamState state; // STOPPED or RUNNING char *userBuffer; char *deviceBuffer; bool doConvertBuffer[2]; // Playback and record, respectively. bool deInterleave[2]; // Playback and record, respectively. bool doByteSwap[2]; // Playback and record, respectively. int sampleRate; int bufferSize; int nBuffers; int nUserChannels[2]; // Playback and record, respectively. int nDeviceChannels[2]; // Playback and record channels, respectively. RtAudioFormat userFormat; RtAudioFormat deviceFormat[2]; // Playback and record, respectively. StreamMutex mutex; CallbackInfo callbackInfo; ConvertInfo convertInfo[2]; RtApiStream() :apiHandle(0), userBuffer(0), deviceBuffer(0) {} }; // A protected device structure for audio devices. struct RtApiDevice { std::string name; /*!< Character string device identifier. */ bool probed; /*!< true if the device capabilities were successfully probed. */ void *apiDeviceId; // void pointer for API specific device information int maxOutputChannels; /*!< Maximum output channels supported by device. */ int maxInputChannels; /*!< Maximum input channels supported by device. */ int maxDuplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ int minOutputChannels; /*!< Minimum output channels supported by device. */ int minInputChannels; /*!< Minimum input channels supported by device. */ int minDuplexChannels; /*!< Minimum simultaneous input/output channels supported by device. */ bool hasDuplexSupport; /*!< true if device supports duplex mode. */ bool isDefault; /*!< true if this is the default output or input device. */ std::vector sampleRates; /*!< Supported sample rates. */ RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ // Default constructor. RtApiDevice() :probed(false), apiDeviceId(0), maxOutputChannels(0), maxInputChannels(0), maxDuplexChannels(0), minOutputChannels(0), minInputChannels(0), minDuplexChannels(0), isDefault(false), nativeFormats(0) {} }; typedef signed short Int16; typedef signed int Int32; typedef float Float32; typedef double Float64; char message_[1024]; int nDevices_; std::vector devices_; RtApiStream stream_; /*! Protected, api-specific method to count and identify the system audio devices. This function MUST be implemented by all subclasses. */ virtual void initialize(void) = 0; /*! Protected, api-specific method which attempts to fill an RtAudioDevice structure for a given device. This function MUST be implemented by all subclasses. If an error is encountered during the probe, a "warning" message is reported and the value of "probed" remains false (no exception is thrown). A successful probe is indicated by probed = true. */ virtual void probeDeviceInfo( RtApiDevice *info ); /*! Protected, api-specific method which attempts to open a device with the given parameters. This function MUST be implemented by all subclasses. If an error is encountered during the probe, a "warning" message is reported and FAILURE is returned (no exception is thrown). A successful probe is indicated by a return value of SUCCESS. */ virtual bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); /*! Protected method which returns the index in the devices array to the default input device. */ virtual int getDefaultInputDevice(void); /*! Protected method which returns the index in the devices array to the default output device. */ virtual int getDefaultOutputDevice(void); //! Protected common method to clear an RtApiDevice structure. void clearDeviceInfo( RtApiDevice *info ); //! Protected common method to clear an RtApiStream structure. void clearStreamInfo(); //! Protected common error method to allow global control over error handling. void error( RtError::Type type ); /*! Protected common method used to check whether a stream is open. If not, an "invalid identifier" exception is thrown. */ void verifyStream(); /*! Protected method used to perform format, channel number, and/or interleaving conversions between the user and device buffers. */ void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ); //! Protected common method used to perform byte-swapping on buffers. void byteSwapBuffer( char *buffer, int samples, RtAudioFormat format ); //! Protected common method which returns the number of bytes for a given format. int formatBytes( RtAudioFormat format ); }; // **************************************************************** // // // RtAudio class declaration. // // RtAudio is a "controller" used to select an available audio i/o // interface. It presents a common API for the user to call but all // functionality is implemented by the class RtAudioApi and its // subclasses. RtAudio creates an instance of an RtAudioApi subclass // based on the user's API choice. If no choice is made, RtAudio // attempts to make a "logical" API selection. // // **************************************************************** // class RtAudio { public: //! Audio API specifier arguments. enum RtAudioApi { UNSPECIFIED, /*!< Search for a working compiled API. */ LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ LINUX_OSS, /*!< The Linux Open Sound System API. */ LINUX_JACK, /*!< The Linux Jack Low-Latency Audio Server API. */ MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ IRIX_AL, /*!< The Irix Audio Library API. */ WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ WINDOWS_DS /*!< The Microsoft Direct Sound API. */ }; //! The default class constructor. /*! Probes the system to make sure at least one audio input/output device is available and determines the api-specific identifier for each device found. An RtError error can be thrown if no devices are found or if a memory allocation error occurs. If no API argument is specified and multiple API support has been compiled, the default order of use is JACK, ALSA, OSS (Linux systems) and ASIO, DS (Windows systems). */ RtAudio( RtAudioApi api=UNSPECIFIED ); //! A constructor which can be used to open a stream during instantiation. /*! The specified output and/or input device identifiers correspond to those enumerated via the getDeviceInfo() method. If device = 0, the default or first available devices meeting the given parameters is selected. If an output or input channel value is zero, the corresponding device value is ignored. When a stream is successfully opened, its identifier is returned via the "streamId" pointer. An RtError can be thrown if no devices are found for the given parameters, if a memory allocation error occurs, or if a driver error occurs. \sa openStream() */ RtAudio( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers, RtAudioApi api=UNSPECIFIED ); //! An overloaded constructor which opens a stream and also returns \c numberOfBuffers parameter via pointer argument. /*! See the previous constructor call for details. This overloaded version differs only in that it takes a pointer argument for the \c numberOfBuffers parameter and returns the value used by the audio device (which may be different from that requested). Note that the \c numberofBuffers parameter is not used with the Linux Jack, Macintosh CoreAudio, and Windows ASIO APIs. */ RtAudio( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers, RtAudioApi api=UNSPECIFIED ); //! The destructor. /*! Stops and closes an open stream and devices and deallocates buffer and structure memory. */ ~RtAudio(); //! A public method for opening a stream with the specified parameters. /*! An RtError is thrown if a stream cannot be opened. \param outputDevice: If equal to 0, the default or first device found meeting the given parameters is opened. Otherwise, the device number should correspond to one of those enumerated via the getDeviceInfo() method. \param outputChannels: The desired number of output channels. If equal to zero, the outputDevice identifier is ignored. \param inputDevice: If equal to 0, the default or first device found meeting the given parameters is opened. Otherwise, the device number should correspond to one of those enumerated via the getDeviceInfo() method. \param inputChannels: The desired number of input channels. If equal to zero, the inputDevice identifier is ignored. \param format: An RtAudioFormat specifying the desired sample data format. \param sampleRate: The desired sample rate (sample frames per second). \param *bufferSize: A pointer value indicating the desired internal buffer size in sample frames. The actual value used by the device is returned via the same pointer. A value of zero can be specified, in which case the lowest allowable value is determined. \param numberOfBuffers: A value which can be used to help control device latency. More buffers typically result in more robust performance, though at a cost of greater latency. A value of zero can be specified, in which case the lowest allowable value is used. */ void openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int numberOfBuffers ); //! A public method for opening a stream and also returning \c numberOfBuffers parameter via pointer argument. /*! See the previous function call for details. This overloaded version differs only in that it takes a pointer argument for the \c numberOfBuffers parameter and returns the value used by the audio device (which may be different from that requested). Note that the \c numberofBuffers parameter is not used with the Linux Jack, Macintosh CoreAudio, and Windows ASIO APIs. */ void openStream( int outputDevice, int outputChannels, int inputDevice, int inputChannels, RtAudioFormat format, int sampleRate, int *bufferSize, int *numberOfBuffers ); //! A public method which sets a user-defined callback function for a given stream. /*! This method assigns a callback function to a previously opened stream for non-blocking stream functionality. A separate process is initiated, though the user function is called only when the stream is "running" (between calls to the startStream() and stopStream() methods, respectively). The callback process remains active for the duration of the stream and is automatically shutdown when the stream is closed (via the closeStream() method or by object destruction). The callback process can also be shutdown and the user function de-referenced through an explicit call to the cancelStreamCallback() method. Note that the stream can use only blocking or callback functionality at a particular time, though it is possible to alternate modes on the same stream through the use of the setStreamCallback() and cancelStreamCallback() methods (the blocking tickStream() method can be used before a callback is set and/or after a callback is cancelled). An RtError will be thrown if called when no stream is open or a thread errors occurs. */ void setStreamCallback(RtAudioCallback callback, void *userData) { rtapi_->setStreamCallback( callback, userData ); }; //! A public method which cancels a callback process and function for the stream. /*! This method shuts down a callback process and de-references the user function for the stream. Callback functionality can subsequently be restarted on the stream via the setStreamCallback() method. An RtError will be thrown if called when no stream is open. */ void cancelStreamCallback() { rtapi_->cancelStreamCallback(); }; //! A public method which returns the number of audio devices found. int getDeviceCount(void) { return rtapi_->getDeviceCount(); }; //! Return an RtAudioDeviceInfo structure for a specified device number. /*! Any device integer between 1 and getDeviceCount() is valid. If a device is busy or otherwise unavailable, the structure member "probed" will have a value of "false" and all other members are undefined. If the specified device is the current default input or output device, the "isDefault" member will have a value of "true". An RtError will be thrown for an invalid device argument. */ RtAudioDeviceInfo getDeviceInfo(int device) { return rtapi_->getDeviceInfo( device ); }; //! A public method which returns a pointer to the buffer for an open stream. /*! The user should fill and/or read the buffer data in interleaved format and then call the tickStream() method. An RtError will be thrown if called when no stream is open. */ char * const getStreamBuffer() { return rtapi_->getStreamBuffer(); }; //! Public method used to trigger processing of input/output data for a stream. /*! This method blocks until all buffer data is read/written. An RtError will be thrown if a driver error occurs or if called when no stream is open. */ void tickStream() { rtapi_->tickStream(); }; //! Public method which closes a stream and frees any associated buffers. /*! If a stream is not open, this method issues a warning and returns (an RtError is not thrown). */ void closeStream() { rtapi_->closeStream(); }; //! Public method which starts a stream. /*! An RtError will be thrown if a driver error occurs or if called when no stream is open. */ void startStream() { rtapi_->startStream(); }; //! Stop a stream, allowing any samples remaining in the queue to be played out and/or read in. /*! An RtError will be thrown if a driver error occurs or if called when no stream is open. */ void stopStream() { rtapi_->stopStream(); }; //! Stop a stream, discarding any samples remaining in the input/output queue. /*! An RtError will be thrown if a driver error occurs or if called when no stream is open. */ void abortStream() { rtapi_->abortStream(); }; protected: void initialize( RtAudioApi api ); RtApi *rtapi_; }; // RtApi Subclass prototypes. #if defined(__LINUX_ALSA__) class RtApiAlsa: public RtApi { public: RtApiAlsa(); ~RtApiAlsa(); void tickStream(); void closeStream(); void startStream(); void stopStream(); void abortStream(); int streamWillBlock(); void setStreamCallback( RtAudioCallback callback, void *userData ); void cancelStreamCallback(); private: void initialize(void); bool primeOutputBuffer(); void probeDeviceInfo( RtApiDevice *info ); bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); }; #endif #if defined(__LINUX_JACK__) class RtApiJack: public RtApi { public: RtApiJack(); ~RtApiJack(); void tickStream(); void closeStream(); void startStream(); void stopStream(); void abortStream(); void setStreamCallback( RtAudioCallback callback, void *userData ); void cancelStreamCallback(); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( unsigned long nframes ); private: void initialize(void); void probeDeviceInfo( RtApiDevice *info ); bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); }; #endif #if defined(__LINUX_OSS__) class RtApiOss: public RtApi { public: RtApiOss(); ~RtApiOss(); void tickStream(); void closeStream(); void startStream(); void stopStream(); void abortStream(); int streamWillBlock(); void setStreamCallback( RtAudioCallback callback, void *userData ); void cancelStreamCallback(); private: void initialize(void); void probeDeviceInfo( RtApiDevice *info ); bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); }; #endif #if defined(__MACOSX_CORE__) #include class RtApiCore: public RtApi { public: RtApiCore(); ~RtApiCore(); int getDefaultOutputDevice(void); int getDefaultInputDevice(void); void tickStream(); void closeStream(); void startStream(); void stopStream(); void abortStream(); void setStreamCallback( RtAudioCallback callback, void *userData ); void cancelStreamCallback(); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( AudioDeviceID deviceId, void *inData, void *outData ); private: void initialize(void); void probeDeviceInfo( RtApiDevice *info ); bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); }; #endif #if defined(__WINDOWS_DS__) class RtApiDs: public RtApi { public: RtApiDs(); ~RtApiDs(); int getDefaultOutputDevice(void); int getDefaultInputDevice(void); void tickStream(); void closeStream(); void startStream(); void stopStream(); void abortStream(); int streamWillBlock(); void setStreamCallback( RtAudioCallback callback, void *userData ); void cancelStreamCallback(); public: // \brief Internal structure that provide debug information on the state of a running DSound device. struct RtDsStatistics { // \brief Sample Rate. long sampleRate; // \brief The size of one sample * number of channels on the input device. int inputFrameSize; // \brief The size of one sample * number of channels on the output device. int outputFrameSize; /* \brief The number of times the read pointer had to be adjusted to avoid reading from an unsafe buffer position. * * This field is only used when running in DUPLEX mode. INPUT mode devices just wait until the data is * available. */ int numberOfReadOverruns; // \brief The number of times the write pointer had to be adjusted to avoid writing in an unsafe buffer position. int numberOfWriteUnderruns; // \brief Number of bytes by attribute to buffer configuration by which writing must lead the current write pointer. int writeDeviceBufferLeadBytes; // \brief Number of bytes by attributable to the device driver by which writing must lead the current write pointer on this output device. unsigned long writeDeviceSafeLeadBytes; // \brief Number of bytes by which reading must trail the current read pointer on this input device. unsigned long readDeviceSafeLeadBytes; /* \brief Estimated latency in seconds. * * For INPUT mode devices, based the latency of the device's safe read pointer, plus one buffer's * worth of additional latency. * * For OUTPUT mode devices, the latency of the device's safe write pointer, plus N buffers of * additional buffer latency. * * For DUPLEX devices, the sum of latencies for both input and output devices. DUPLEX devices * also back off the read pointers an additional amount in order to maintain synchronization * between out-of-phase read and write pointers. This time is also included. * * Note that most software packages report latency between the safe write pointer * and the software lead pointer, excluding the hardware device's safe write pointer * latency. Figures of 1 or 2ms of latency on Windows audio devices are invariably of this type. * The reality is that hardware devices often have latencies of 30ms or more (often much * higher for duplex operation). */ double latency; }; // \brief Report on the current state of a running DSound device. static RtDsStatistics getDsStatistics(); private: void initialize(void); void probeDeviceInfo( RtApiDevice *info ); bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); bool coInitialized; bool buffersRolling; long duplexPrerollBytes; static RtDsStatistics statistics; }; #endif #if defined(__WINDOWS_ASIO__) class RtApiAsio: public RtApi { public: RtApiAsio(); ~RtApiAsio(); void tickStream(); void closeStream(); void startStream(); void stopStream(); void abortStream(); void setStreamCallback( RtAudioCallback callback, void *userData ); void cancelStreamCallback(); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( long bufferIndex ); private: void initialize(void); void probeDeviceInfo( RtApiDevice *info ); bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); bool coInitialized; }; #endif #if defined(__IRIX_AL__) class RtApiAl: public RtApi { public: RtApiAl(); ~RtApiAl(); int getDefaultOutputDevice(void); int getDefaultInputDevice(void); void tickStream(); void closeStream(); void startStream(); void stopStream(); void abortStream(); int streamWillBlock(); void setStreamCallback( RtAudioCallback callback, void *userData ); void cancelStreamCallback(); private: void initialize(void); void probeDeviceInfo( RtApiDevice *info ); bool probeDeviceOpen( int device, StreamMode mode, int channels, int sampleRate, RtAudioFormat format, int *bufferSize, int numberOfBuffers ); }; #endif // Define the following flag to have extra information spewed to stderr. //#define __RTAUDIO_DEBUG__ #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/0000755000175000017500000000000011317506076024727 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/asiodrivers.h0000644000175000017500000000124611163425013027423 0ustar admin2admin2#ifndef __AsioDrivers__ #define __AsioDrivers__ #include "ginclude.h" #if MAC #include "CodeFragments.hpp" class AsioDrivers : public CodeFragments #elif WINDOWS #include #include "asiolist.h" class AsioDrivers : public AsioDriverList #elif SGI || BEOS #include "asiolist.h" class AsioDrivers : public AsioDriverList #else #error implement me #endif { public: AsioDrivers(); ~AsioDrivers(); bool getCurrentDriverName(char *name); long getDriverNames(char **names, long maxDrivers); bool loadDriver(char *name); void removeCurrentDriver(); long getCurrentDriverIndex() {return curIndex;} protected: unsigned long connID; long curIndex; }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/iasiothiscallresolver.h0000644000175000017500000002245011163425013031503 0ustar admin2admin2// **************************************************************************** // // Changed: I have modified this file slightly (includes) to work with // RtAudio. RtAudio.cpp must include this file after asio.h. // // File: IASIOThiscallResolver.h // Description: The IASIOThiscallResolver class implements the IASIO // interface and acts as a proxy to the real IASIO interface by // calling through its vptr table using the thiscall calling // convention. To put it another way, we interpose // IASIOThiscallResolver between ASIO SDK code and the driver. // This is necessary because most non-Microsoft compilers don't // implement the thiscall calling convention used by IASIO. // // iasiothiscallresolver.cpp contains the background of this // problem plus a technical description of the vptr // manipulations. // // In order to use this mechanism one simply has to add // iasiothiscallresolver.cpp to the list of files to compile // and #include // // Note that this #include must come after the other ASIO SDK // #includes, for example: // // #include // #include // #include // #include // #include // // Actually the important thing is to #include // after . We have // incorporated a test to enforce this ordering. // // The code transparently takes care of the interposition by // using macro substitution to intercept calls to ASIOInit() // and ASIOExit(). We save the original ASIO global // "theAsioDriver" in our "that" variable, and then set // "theAsioDriver" to equal our IASIOThiscallResolver instance. // // Whilst this method of resolving the thiscall problem requires // the addition of #include to client // code it has the advantage that it does not break the terms // of the ASIO licence by publishing it. We are NOT modifying // any Steinberg code here, we are merely implementing the IASIO // interface in the same way that we would need to do if we // wished to provide an open source ASIO driver. // // For compilation with MinGW -lole32 needs to be added to the // linker options. For BORLAND, linking with Import32.lib is // sufficient. // // The dependencies are with: CoInitialize, CoUninitialize, // CoCreateInstance, CLSIDFromString - used by asiolist.cpp // and are required on Windows whether ThiscallResolver is used // or not. // // Searching for the above strings in the root library path // of your compiler should enable the correct libraries to be // identified if they aren't immediately obvious. // // Note that the current implementation of IASIOThiscallResolver // is not COM compliant - it does not correctly implement the // IUnknown interface. Implementing it is not necessary because // it is not called by parts of the ASIO SDK which call through // theAsioDriver ptr. The IUnknown methods are implemented as // assert(false) to ensure that the code fails if they are // ever called. // Restrictions: None. Public Domain & Open Source distribute freely // You may use IASIOThiscallResolver commercially as well as // privately. // You the user assume the responsibility for the use of the // files, binary or text, and there is no guarantee or warranty, // expressed or implied, including but not limited to the // implied warranties of merchantability and fitness for a // particular purpose. You assume all responsibility and agree // for any loss of data or inaccurate representations of data // as a result of using IASIOThiscallResolver. // Version: 1.4 Added separate macro CALL_THISCALL_1_DOUBLE from // Andrew Baldwin, and volatile for whole gcc asm blocks, // both for compatibility with newer gcc versions. Cleaned up // Borland asm to use one less register. // 1.3 Switched to including assert.h for better compatibility. // Wrapped entire .h and .cpp contents with a check for // _MSC_VER to provide better compatibility with MS compilers. // Changed Singleton implementation to use static instance // instead of freestore allocated instance. Removed ASIOExit // macro as it is no longer needed. // 1.2 Removed semicolons from ASIOInit and ASIOExit macros to // allow them to be embedded in expressions (if statements). // Cleaned up some comments. Removed combase.c dependency (it // doesn't compile with BCB anyway) by stubbing IUnknown. // 1.1 Incorporated comments from Ross Bencina including things // such as changing name from ThiscallResolver to // IASIOThiscallResolver, tidying up the constructor, fixing // a bug in IASIOThiscallResolver::ASIOExit() and improving // portability through the use of conditional compilation // 1.0 Initial working version. // Created: 6/09/2003 // Authors: Fraser Adams // Ross Bencina // Rene G. Ceballos // Martin Fay // Antti Silvast // Andrew Baldwin // // **************************************************************************** #ifndef included_iasiothiscallresolver_h #define included_iasiothiscallresolver_h // We only need IASIOThiscallResolver at all if we are on Win32. For other // platforms we simply bypass the IASIOThiscallResolver definition to allow us // to be safely #include'd whatever the platform to keep client code portable #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) // If microsoft compiler we can call IASIO directly so IASIOThiscallResolver // is not used. #if !defined(_MSC_VER) // The following is in order to ensure that this header is only included after // the other ASIO headers (except for the case of iasiothiscallresolver.cpp). // We need to do this because IASIOThiscallResolver works by eclipsing the // original definition of ASIOInit() with a macro (see below). #if !defined(iasiothiscallresolver_sourcefile) #if !defined(__ASIO_H) #error iasiothiscallresolver.h must be included AFTER asio.h #endif #endif #include #include "iasiodrv.h" /* From ASIO SDK */ class IASIOThiscallResolver : public IASIO { private: IASIO* that_; // Points to the real IASIO static IASIOThiscallResolver instance; // Singleton instance // Constructors - declared private so construction is limited to // our Singleton instance IASIOThiscallResolver(); IASIOThiscallResolver(IASIO* that); public: // Methods from the IUnknown interface. We don't fully implement IUnknown // because the ASIO SDK never calls these methods through theAsioDriver ptr. // These methods are implemented as assert(false). virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv); virtual ULONG STDMETHODCALLTYPE AddRef(); virtual ULONG STDMETHODCALLTYPE Release(); // Methods from the IASIO interface, implemented as forwarning calls to that. virtual ASIOBool init(void *sysHandle); virtual void getDriverName(char *name); virtual long getDriverVersion(); virtual void getErrorMessage(char *string); virtual ASIOError start(); virtual ASIOError stop(); virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels); virtual ASIOError getLatencies(long *inputLatency, long *outputLatency); virtual ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); virtual ASIOError canSampleRate(ASIOSampleRate sampleRate); virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate); virtual ASIOError setSampleRate(ASIOSampleRate sampleRate); virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); virtual ASIOError setClockSource(long reference); virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); virtual ASIOError getChannelInfo(ASIOChannelInfo *info); virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); virtual ASIOError disposeBuffers(); virtual ASIOError controlPanel(); virtual ASIOError future(long selector,void *opt); virtual ASIOError outputReady(); // Class method, see ASIOInit() macro below. static ASIOError ASIOInit(ASIODriverInfo *info); // Delegates to ::ASIOInit }; // Replace calls to ASIOInit with our interposing version. // This macro enables us to perform thiscall resolution simply by #including // after the asio #includes (this file _must_ be // included _after_ the asio #includes) #define ASIOInit(name) IASIOThiscallResolver::ASIOInit((name)) #endif /* !defined(_MSC_VER) */ #endif /* Win32 */ #endif /* included_iasiothiscallresolver_h */ milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/asiodrvr.h0000644000175000017500000000421611163425013026722 0ustar admin2admin2/* Steinberg Audio Stream I/O API (c) 1996, Steinberg Soft- und Hardware GmbH charlie (May 1996) asiodrvr.h c++ superclass to implement asio functionality. from this, you can derive whatever required */ #ifndef _asiodrvr_ #define _asiodrvr_ // cpu and os system we are running on #include "asiosys.h" // basic "C" interface #include "asio.h" class AsioDriver; extern AsioDriver *getDriver(); // for generic constructor #if WINDOWS #include #include "combase.h" #include "iasiodrv.h" class AsioDriver : public IASIO ,public CUnknown { public: AsioDriver(LPUNKNOWN pUnk, HRESULT *phr); DECLARE_IUNKNOWN // Factory method static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr); // IUnknown virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject); #else class AsioDriver { public: AsioDriver(); #endif virtual ~AsioDriver(); virtual ASIOBool init(void* sysRef); virtual void getDriverName(char *name); // max 32 bytes incl. terminating zero virtual long getDriverVersion(); virtual void getErrorMessage(char *string); // max 124 bytes incl. virtual ASIOError start(); virtual ASIOError stop(); virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels); virtual ASIOError getLatencies(long *inputLatency, long *outputLatency); virtual ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); virtual ASIOError canSampleRate(ASIOSampleRate sampleRate); virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate); virtual ASIOError setSampleRate(ASIOSampleRate sampleRate); virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); virtual ASIOError setClockSource(long reference); virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); virtual ASIOError getChannelInfo(ASIOChannelInfo *info); virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); virtual ASIOError disposeBuffers(); virtual ASIOError controlPanel(); virtual ASIOError future(long selector, void *opt); virtual ASIOError outputReady(); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/ginclude.h0000644000175000017500000000112611163425013026660 0ustar admin2admin2#ifndef __gInclude__ #define __gInclude__ #if SGI #undef BEOS #undef MAC #undef WINDOWS // #define ASIO_BIG_ENDIAN 1 #define ASIO_CPU_MIPS 1 #elif defined WIN32 #undef BEOS #undef MAC #undef SGI #define WINDOWS 1 #define ASIO_LITTLE_ENDIAN 1 #define ASIO_CPU_X86 1 #elif BEOS #undef MAC #undef SGI #undef WINDOWS #define ASIO_LITTLE_ENDIAN 1 #define ASIO_CPU_X86 1 // #else #define MAC 1 #undef BEOS #undef WINDOWS #undef SGI #define ASIO_BIG_ENDIAN 1 #define ASIO_CPU_PPC 1 #endif // always #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #endif // __gInclude__ milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/asiolist.cpp0000644000175000017500000001677411163425013027267 0ustar admin2admin2#include #include "iasiodrv.h" #include "asiolist.h" #define ASIODRV_DESC "description" #define INPROC_SERVER "InprocServer32" #define ASIO_PATH "software\\asio" #define COM_CLSID "clsid" // ****************************************************************** // Local Functions // ****************************************************************** static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize) { HKEY hkEnum,hksub,hkpath; char databuf[512]; LONG cr,rc = -1; DWORD datatype,datasize; DWORD index; OFSTRUCT ofs; HFILE hfile; BOOL found = FALSE; #ifdef UNICODE CharLowerBuffA(clsidstr,strlen(clsidstr)); if ((cr = RegOpenKeyA(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) { index = 0; while (cr == ERROR_SUCCESS && !found) { cr = RegEnumKeyA(hkEnum,index++,databuf,512); if (cr == ERROR_SUCCESS) { CharLowerBuffA(databuf,strlen(databuf)); if (!(strcmp(databuf,clsidstr))) { if ((cr = RegOpenKeyExA(hkEnum,databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { if ((cr = RegOpenKeyExA(hksub,INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) { datatype = REG_SZ; datasize = (DWORD)dllpathsize; cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize); if (cr == ERROR_SUCCESS) { memset(&ofs,0,sizeof(OFSTRUCT)); ofs.cBytes = sizeof(OFSTRUCT); hfile = OpenFile(dllpath,&ofs,OF_EXIST); if (hfile) rc = 0; } RegCloseKey(hkpath); } RegCloseKey(hksub); } found = TRUE; // break out } } } RegCloseKey(hkEnum); } #else CharLowerBuff(clsidstr,strlen(clsidstr)); if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) { index = 0; while (cr == ERROR_SUCCESS && !found) { cr = RegEnumKey(hkEnum,index++,databuf,512); if (cr == ERROR_SUCCESS) { CharLowerBuff(databuf,strlen(databuf)); if (!(strcmp(databuf,clsidstr))) { if ((cr = RegOpenKeyEx(hkEnum,databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { if ((cr = RegOpenKeyEx(hksub,INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) { datatype = REG_SZ; datasize = (DWORD)dllpathsize; cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize); if (cr == ERROR_SUCCESS) { memset(&ofs,0,sizeof(OFSTRUCT)); ofs.cBytes = sizeof(OFSTRUCT); hfile = OpenFile(dllpath,&ofs,OF_EXIST); if (hfile) rc = 0; } RegCloseKey(hkpath); } RegCloseKey(hksub); } found = TRUE; // break out } } } RegCloseKey(hkEnum); } #endif return rc; } static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv) { HKEY hksub; char databuf[256]; char dllpath[MAXPATHLEN]; WORD wData[100]; CLSID clsid; DWORD datatype,datasize; LONG cr,rc; if (!lpdrv) { if ((cr = RegOpenKeyExA(hkey,keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { datatype = REG_SZ; datasize = 256; cr = RegQueryValueExA(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize); if (cr == ERROR_SUCCESS) { rc = findDrvPath (databuf,dllpath,MAXPATHLEN); if (rc == 0) { lpdrv = new ASIODRVSTRUCT[1]; if (lpdrv) { memset(lpdrv,0,sizeof(ASIODRVSTRUCT)); lpdrv->drvID = drvID; MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100); if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) { memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID)); } datatype = REG_SZ; datasize = 256; cr = RegQueryValueExA(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize); if (cr == ERROR_SUCCESS) { strcpy(lpdrv->drvname,databuf); } else strcpy(lpdrv->drvname,keyname); } } } RegCloseKey(hksub); } } else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next); return lpdrv; } static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv) { IASIO *iasio; if (lpdrv != 0) { deleteDrvStruct(lpdrv->next); if (lpdrv->asiodrv) { iasio = (IASIO *)lpdrv->asiodrv; iasio->Release(); } delete lpdrv; } } static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv) { while (lpdrv) { if (lpdrv->drvID == drvID) return lpdrv; lpdrv = lpdrv->next; } return 0; } // ****************************************************************** // ****************************************************************** // AsioDriverList // ****************************************************************** AsioDriverList::AsioDriverList () { HKEY hkEnum = 0; char keyname[MAXDRVNAMELEN]; LPASIODRVSTRUCT pdl; LONG cr; DWORD index = 0; BOOL fin = FALSE; numdrv = 0; lpdrvlist = 0; #ifdef UNICODE cr = RegOpenKeyA(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum); #else cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum); #endif while (cr == ERROR_SUCCESS) { #ifdef UNICODE if ((cr = RegEnumKeyA(hkEnum,index++,keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) { #else if ((cr = RegEnumKey(hkEnum,index++,keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) { #endif lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist); } else fin = TRUE; } if (hkEnum) RegCloseKey(hkEnum); pdl = lpdrvlist; while (pdl) { numdrv++; pdl = pdl->next; } if (numdrv) CoInitialize(0); // initialize COM } AsioDriverList::~AsioDriverList () { if (numdrv) { deleteDrvStruct(lpdrvlist); CoUninitialize(); } } LONG AsioDriverList::asioGetNumDev (VOID) { return (LONG)numdrv; } LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv) { LPASIODRVSTRUCT lpdrv = 0; long rc; if (!asiodrv) return DRVERR_INVALID_PARAM; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { if (!lpdrv->asiodrv) { rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv); if (rc == S_OK) { lpdrv->asiodrv = *asiodrv; return 0; } // else if (rc == REGDB_E_CLASSNOTREG) // strcpy (info->messageText, "Driver not registered in the Registration Database!"); } else rc = DRVERR_DEVICE_ALREADY_OPEN; } else rc = DRVERR_DEVICE_NOT_FOUND; return rc; } LONG AsioDriverList::asioCloseDriver (int drvID) { LPASIODRVSTRUCT lpdrv = 0; IASIO *iasio; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { if (lpdrv->asiodrv) { iasio = (IASIO *)lpdrv->asiodrv; iasio->Release(); lpdrv->asiodrv = 0; } } return 0; } LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize) { LPASIODRVSTRUCT lpdrv = 0; if (!drvname) return DRVERR_INVALID_PARAM; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) { strcpy(drvname,lpdrv->drvname); } else { memcpy(drvname,lpdrv->drvname,drvnamesize-4); drvname[drvnamesize-4] = '.'; drvname[drvnamesize-3] = '.'; drvname[drvnamesize-2] = '.'; drvname[drvnamesize-1] = 0; } return 0; } return DRVERR_DEVICE_NOT_FOUND; } LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize) { LPASIODRVSTRUCT lpdrv = 0; if (!dllpath) return DRVERR_INVALID_PARAM; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) { strcpy(dllpath,lpdrv->dllpath); return 0; } dllpath[0] = 0; return DRVERR_INVALID_PARAM; } return DRVERR_DEVICE_NOT_FOUND; } LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid) { LPASIODRVSTRUCT lpdrv = 0; if (!clsid) return DRVERR_INVALID_PARAM; if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { memcpy(clsid,&lpdrv->clsid,sizeof(CLSID)); return 0; } return DRVERR_DEVICE_NOT_FOUND; } milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/iasiodrv.h0000644000175000017500000000301711163425013026707 0ustar admin2admin2#include "asiosys.h" #include "asio.h" /* Forward Declarations */ #ifndef __ASIODRIVER_FWD_DEFINED__ #define __ASIODRIVER_FWD_DEFINED__ typedef interface IASIO IASIO; #endif /* __ASIODRIVER_FWD_DEFINED__ */ interface IASIO : public IUnknown { virtual ASIOBool init(void *sysHandle) = 0; virtual void getDriverName(char *name) = 0; virtual long getDriverVersion() = 0; virtual void getErrorMessage(char *string) = 0; virtual ASIOError start() = 0; virtual ASIOError stop() = 0; virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels) = 0; virtual ASIOError getLatencies(long *inputLatency, long *outputLatency) = 0; virtual ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) = 0; virtual ASIOError canSampleRate(ASIOSampleRate sampleRate) = 0; virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate) = 0; virtual ASIOError setSampleRate(ASIOSampleRate sampleRate) = 0; virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources) = 0; virtual ASIOError setClockSource(long reference) = 0; virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0; virtual ASIOError getChannelInfo(ASIOChannelInfo *info) = 0; virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) = 0; virtual ASIOError disposeBuffers() = 0; virtual ASIOError controlPanel() = 0; virtual ASIOError future(long selector,void *opt) = 0; virtual ASIOError outputReady() = 0; }; milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/asiosys.h0000644000175000017500000000237611163425013026570 0ustar admin2admin2#ifndef __asiosys__ #define __asiosys__ #ifdef WIN32 #undef MAC #define PPC 0 #define WINDOWS 1 #define SGI 0 #define SUN 0 #define LINUX 0 #define BEOS 0 #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #elif BEOS #define MAC 0 #define PPC 0 #define WINDOWS 0 #define PC 0 #define SGI 0 #define SUN 0 #define LINUX 0 #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #ifndef DEBUG #define DEBUG 0 #if DEBUG void DEBUGGERMESSAGE(char *string); #else #define DEBUGGERMESSAGE(a) #endif #endif #elif SGI #define MAC 0 #define PPC 0 #define WINDOWS 0 #define PC 0 #define SUN 0 #define LINUX 0 #define BEOS 0 #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #ifndef DEBUG #define DEBUG 0 #if DEBUG void DEBUGGERMESSAGE(char *string); #else #define DEBUGGERMESSAGE(a) #endif #endif #else // MAC #define MAC 1 #define PPC 1 #define WINDOWS 0 #define PC 0 #define SGI 0 #define SUN 0 #define LINUX 0 #define BEOS 0 #define NATIVE_INT64 0 #define IEEE754_64FLOAT 1 #ifndef DEBUG #define DEBUG 0 #if DEBUG void DEBUGGERMESSAGE(char *string); #else #define DEBUGGERMESSAGE(a) #endif #endif #endif #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/asiolist.h0000644000175000017500000000166411163425013026724 0ustar admin2admin2#ifndef __asiolist__ #define __asiolist__ #define DRVERR -5000 #define DRVERR_INVALID_PARAM DRVERR-1 #define DRVERR_DEVICE_ALREADY_OPEN DRVERR-2 #define DRVERR_DEVICE_NOT_FOUND DRVERR-3 #define MAXPATHLEN 512 #define MAXDRVNAMELEN 128 struct asiodrvstruct { int drvID; CLSID clsid; char dllpath[MAXPATHLEN]; char drvname[MAXDRVNAMELEN]; LPVOID asiodrv; struct asiodrvstruct *next; }; typedef struct asiodrvstruct ASIODRVSTRUCT; typedef ASIODRVSTRUCT *LPASIODRVSTRUCT; class AsioDriverList { public: AsioDriverList(); ~AsioDriverList(); LONG asioOpenDriver (int,VOID **); LONG asioCloseDriver (int); // nice to have LONG asioGetNumDev (VOID); LONG asioGetDriverName (int,char *,int); LONG asioGetDriverPath (int,char *,int); LONG asioGetDriverCLSID (int,CLSID *); // or use directly access LPASIODRVSTRUCT lpdrvlist; int numdrv; }; typedef class AsioDriverList *LPASIODRIVERLIST; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/asiodrivers.cpp0000644000175000017500000000625011163425013027756 0ustar admin2admin2#include #include "asiodrivers.h" AsioDrivers* asioDrivers = 0; bool loadAsioDriver(char *name); bool loadAsioDriver(char *name) { if(!asioDrivers) asioDrivers = new AsioDrivers(); if(asioDrivers) return asioDrivers->loadDriver(name); return false; } //------------------------------------------------------------------------------------ #if MAC bool resolveASIO(unsigned long aconnID); AsioDrivers::AsioDrivers() : CodeFragments("ASIO Drivers", 'AsDr', 'Asio') { connID = -1; curIndex = -1; } AsioDrivers::~AsioDrivers() { removeCurrentDriver(); } bool AsioDrivers::getCurrentDriverName(char *name) { if(curIndex >= 0) return getName(curIndex, name); return false; } long AsioDrivers::getDriverNames(char **names, long maxDrivers) { for(long i = 0; i < getNumFragments() && i < maxDrivers; i++) getName(i, names[i]); return getNumFragments() < maxDrivers ? getNumFragments() : maxDrivers; } bool AsioDrivers::loadDriver(char *name) { char dname[64]; unsigned long newID; for(long i = 0; i < getNumFragments(); i++) { if(getName(i, dname) && !strcmp(name, dname)) { if(newInstance(i, &newID)) { if(resolveASIO(newID)) { if(connID != -1) removeInstance(curIndex, connID); curIndex = i; connID = newID; return true; } } break; } } return false; } void AsioDrivers::removeCurrentDriver() { if(connID != -1) removeInstance(curIndex, connID); connID = -1; curIndex = -1; } //------------------------------------------------------------------------------------ #elif WINDOWS #include "iasiodrv.h" extern IASIO* theAsioDriver; AsioDrivers::AsioDrivers() : AsioDriverList() { curIndex = -1; } AsioDrivers::~AsioDrivers() { } bool AsioDrivers::getCurrentDriverName(char *name) { if(curIndex >= 0) return asioGetDriverName(curIndex, name, 32) == 0 ? true : false; name[0] = 0; return false; } long AsioDrivers::getDriverNames(char **names, long maxDrivers) { for(long i = 0; i < asioGetNumDev() && i < maxDrivers; i++) asioGetDriverName(i, names[i], 32); return asioGetNumDev() < maxDrivers ? asioGetNumDev() : maxDrivers; } bool AsioDrivers::loadDriver(char *name) { char dname[64]; char curName[64]; for(long i = 0; i < asioGetNumDev(); i++) { if(!asioGetDriverName(i, dname, 32) && !strcmp(name, dname)) { curName[0] = 0; getCurrentDriverName(curName); // in case we fail... removeCurrentDriver(); if(!asioOpenDriver(i, (void **)&theAsioDriver)) { curIndex = i; return true; } else { theAsioDriver = 0; if(curName[0] && strcmp(dname, curName)) loadDriver(curName); // try restore } break; } } return false; } void AsioDrivers::removeCurrentDriver() { if(curIndex != -1) asioCloseDriver(curIndex); curIndex = -1; } #elif SGI || BEOS #include "asiolist.h" AsioDrivers::AsioDrivers() : AsioDriverList() { curIndex = -1; } AsioDrivers::~AsioDrivers() { } bool AsioDrivers::getCurrentDriverName(char *name) { return false; } long AsioDrivers::getDriverNames(char **names, long maxDrivers) { return 0; } bool AsioDrivers::loadDriver(char *name) { return false; } void AsioDrivers::removeCurrentDriver() { } #else #error implement me #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/asio.cpp0000644000175000017500000001231011163425013026351 0ustar admin2admin2/* Steinberg Audio Stream I/O API (c) 1996, Steinberg Soft- und Hardware GmbH asio.cpp asio functions entries which translate the asio interface to the asiodrvr class methods */ #include #include "asiosys.h" // platform definition #include "asio.h" #if MAC #include "asiodrvr.h" #pragma export on AsioDriver *theAsioDriver = 0; extern "C" { long main() { return 'ASIO'; } #elif WINDOWS #include "windows.h" #include "iasiodrv.h" #include "asiodrivers.h" IASIO *theAsioDriver = 0; extern AsioDrivers *asioDrivers; #elif SGI || SUN || BEOS || LINUX #include "asiodrvr.h" static AsioDriver *theAsioDriver = 0; #endif //----------------------------------------------------------------------------------------------------- ASIOError ASIOInit(ASIODriverInfo *info) { #if MAC || SGI || SUN || BEOS || LINUX if(theAsioDriver) { delete theAsioDriver; theAsioDriver = 0; } info->driverVersion = 0; strcpy(info->name, "No ASIO Driver"); theAsioDriver = getDriver(); if(!theAsioDriver) { strcpy(info->errorMessage, "Not enough memory for the ASIO driver!"); return ASE_NotPresent; } if(!theAsioDriver->init(info->sysRef)) { theAsioDriver->getErrorMessage(info->errorMessage); delete theAsioDriver; theAsioDriver = 0; return ASE_NotPresent; } strcpy(info->errorMessage, "No ASIO Driver Error"); theAsioDriver->getDriverName(info->name); info->driverVersion = theAsioDriver->getDriverVersion(); return ASE_OK; #else info->driverVersion = 0; strcpy(info->name, "No ASIO Driver"); if(theAsioDriver) // must be loaded! { if(!theAsioDriver->init(info->sysRef)) { theAsioDriver->getErrorMessage(info->errorMessage); theAsioDriver = 0; return ASE_NotPresent; } strcpy(info->errorMessage, "No ASIO Driver Error"); theAsioDriver->getDriverName(info->name); info->driverVersion = theAsioDriver->getDriverVersion(); return ASE_OK; } return ASE_NotPresent; #endif // !MAC } ASIOError ASIOExit(void) { if(theAsioDriver) { #if WINDOWS asioDrivers->removeCurrentDriver(); #else delete theAsioDriver; #endif } theAsioDriver = 0; return ASE_OK; } ASIOError ASIOStart(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->start(); } ASIOError ASIOStop(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->stop(); } ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels) { if(!theAsioDriver) { *numInputChannels = *numOutputChannels = 0; return ASE_NotPresent; } return theAsioDriver->getChannels(numInputChannels, numOutputChannels); } ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency) { if(!theAsioDriver) { *inputLatency = *outputLatency = 0; return ASE_NotPresent; } return theAsioDriver->getLatencies(inputLatency, outputLatency); } ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) { if(!theAsioDriver) { *minSize = *maxSize = *preferredSize = *granularity = 0; return ASE_NotPresent; } return theAsioDriver->getBufferSize(minSize, maxSize, preferredSize, granularity); } ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->canSampleRate(sampleRate); } ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->getSampleRate(currentRate); } ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->setSampleRate(sampleRate); } ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources) { if(!theAsioDriver) { *numSources = 0; return ASE_NotPresent; } return theAsioDriver->getClockSources(clocks, numSources); } ASIOError ASIOSetClockSource(long reference) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->setClockSource(reference); } ASIOError ASIOGetSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->getSamplePosition(sPos, tStamp); } ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info) { if(!theAsioDriver) { info->channelGroup = -1; info->type = ASIOSTInt16MSB; strcpy(info->name, "None"); return ASE_NotPresent; } return theAsioDriver->getChannelInfo(info); } ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) { if(!theAsioDriver) { ASIOBufferInfo *info = bufferInfos; for(long i = 0; i < numChannels; i++, info++) info->buffers[0] = info->buffers[1] = 0; return ASE_NotPresent; } return theAsioDriver->createBuffers(bufferInfos, numChannels, bufferSize, callbacks); } ASIOError ASIODisposeBuffers(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->disposeBuffers(); } ASIOError ASIOControlPanel(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->controlPanel(); } ASIOError ASIOFuture(long selector, void *opt) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->future(selector, opt); } ASIOError ASIOOutputReady(void) { if(!theAsioDriver) return ASE_NotPresent; return theAsioDriver->outputReady(); } #if MAC } // extern "C" #pragma export off #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/asio.h0000644000175000017500000012155311163425013026030 0ustar admin2admin2//--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- /* Steinberg Audio Stream I/O API (c) 1997 - 2005, Steinberg Media Technologies GmbH ASIO Interface Specification v 2.1 2005 - Added support for DSD sample data (in cooperation with Sony) basic concept is an i/o synchronous double-buffer scheme: on bufferSwitch(index == 0), host will read/write: after ASIOStart(), the read first input buffer A (index 0) | will be invalid (empty) * ------------------------ |------------------------|-----------------------| | | | | Input Buffer A (0) | Input Buffer B (1) | | | | |------------------------|-----------------------| | | | | Output Buffer A (0) | Output Buffer B (1) | | | | |------------------------|-----------------------| * ------------------------- | before calling ASIOStart(), write host will have filled output buffer B (index 1) already *please* take special care of proper statement of input and output latencies (see ASIOGetLatencies()), these control sequencer sync accuracy */ //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- /* prototypes summary: ASIOError ASIOInit(ASIODriverInfo *info); ASIOError ASIOExit(void); ASIOError ASIOStart(void); ASIOError ASIOStop(void); ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels); ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency); ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate); ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate); ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate); ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources); ASIOError ASIOSetClockSource(long reference); ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info); ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); ASIOError ASIODisposeBuffers(void); ASIOError ASIOControlPanel(void); void *ASIOFuture(long selector, void *params); ASIOError ASIOOutputReady(void); */ //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- #ifndef __ASIO_H #define __ASIO_H // force 4 byte alignment #if defined(_MSC_VER) && !defined(__MWERKS__) #pragma pack(push,4) #elif PRAGMA_ALIGN_SUPPORTED #pragma options align = native #endif //- - - - - - - - - - - - - - - - - - - - - - - - - // Type definitions //- - - - - - - - - - - - - - - - - - - - - - - - - // number of samples data type is 64 bit integer #if NATIVE_INT64 typedef long long int ASIOSamples; #else typedef struct ASIOSamples { unsigned long hi; unsigned long lo; } ASIOSamples; #endif // Timestamp data type is 64 bit integer, // Time format is Nanoseconds. #if NATIVE_INT64 typedef long long int ASIOTimeStamp ; #else typedef struct ASIOTimeStamp { unsigned long hi; unsigned long lo; } ASIOTimeStamp; #endif // Samplerates are expressed in IEEE 754 64 bit double float, // native format as host computer #if IEEE754_64FLOAT typedef double ASIOSampleRate; #else typedef struct ASIOSampleRate { char ieee[8]; } ASIOSampleRate; #endif // Boolean values are expressed as long typedef long ASIOBool; enum { ASIOFalse = 0, ASIOTrue = 1 }; // Sample Types are expressed as long typedef long ASIOSampleType; enum { ASIOSTInt16MSB = 0, ASIOSTInt24MSB = 1, // used for 20 bits as well ASIOSTInt32MSB = 2, ASIOSTFloat32MSB = 3, // IEEE 754 32 bit float ASIOSTFloat64MSB = 4, // IEEE 754 64 bit double float // these are used for 32 bit data buffer, with different alignment of the data inside // 32 bit PCI bus systems can be more easily used with these ASIOSTInt32MSB16 = 8, // 32 bit data with 16 bit alignment ASIOSTInt32MSB18 = 9, // 32 bit data with 18 bit alignment ASIOSTInt32MSB20 = 10, // 32 bit data with 20 bit alignment ASIOSTInt32MSB24 = 11, // 32 bit data with 24 bit alignment ASIOSTInt16LSB = 16, ASIOSTInt24LSB = 17, // used for 20 bits as well ASIOSTInt32LSB = 18, ASIOSTFloat32LSB = 19, // IEEE 754 32 bit float, as found on Intel x86 architecture ASIOSTFloat64LSB = 20, // IEEE 754 64 bit double float, as found on Intel x86 architecture // these are used for 32 bit data buffer, with different alignment of the data inside // 32 bit PCI bus systems can more easily used with these ASIOSTInt32LSB16 = 24, // 32 bit data with 18 bit alignment ASIOSTInt32LSB18 = 25, // 32 bit data with 18 bit alignment ASIOSTInt32LSB20 = 26, // 32 bit data with 20 bit alignment ASIOSTInt32LSB24 = 27, // 32 bit data with 24 bit alignment // ASIO DSD format. ASIOSTDSDInt8LSB1 = 32, // DSD 1 bit data, 8 samples per byte. First sample in Least significant bit. ASIOSTDSDInt8MSB1 = 33, // DSD 1 bit data, 8 samples per byte. First sample in Most significant bit. ASIOSTDSDInt8NER8 = 40, // DSD 8 bit data, 1 sample per byte. No Endianness required. ASIOSTLastEntry }; /*----------------------------------------------------------------------------- // DSD operation and buffer layout // Definition by Steinberg/Sony Oxford. // // We have tried to treat DSD as PCM and so keep a consistant structure across // the ASIO interface. // // DSD's sample rate is normally referenced as a multiple of 44.1Khz, so // the standard sample rate is refered to as 64Fs (or 2.8224Mhz). We looked // at making a special case for DSD and adding a field to the ASIOFuture that // would allow the user to select the Over Sampleing Rate (OSR) as a seperate // entity but decided in the end just to treat it as a simple value of // 2.8224Mhz and use the standard interface to set it. // // The second problem was the "word" size, in PCM the word size is always a // greater than or equal to 8 bits (a byte). This makes life easy as we can // then pack the samples into the "natural" size for the machine. // In DSD the "word" size is 1 bit. This is not a major problem and can easily // be dealt with if we ensure that we always deal with a multiple of 8 samples. // // DSD brings with it another twist to the Endianness religion. How are the // samples packed into the byte. It would be nice to just say the most significant // bit is always the first sample, however there would then be a performance hit // on little endian machines. Looking at how some of the processing goes... // Little endian machines like the first sample to be in the Least Significant Bit, // this is because when you write it to memory the data is in the correct format // to be shifted in and out of the words. // Big endian machine prefer the first sample to be in the Most Significant Bit, // again for the same reasion. // // And just when things were looking really muddy there is a proposed extension to // DSD that uses 8 bit word sizes. It does not care what endianness you use. // // Switching the driver between DSD and PCM mode // ASIOFuture allows for extending the ASIO API quite transparently. // See kAsioSetIoFormat, kAsioGetIoFormat, kAsioCanDoIoFormat // //-----------------------------------------------------------------------------*/ //- - - - - - - - - - - - - - - - - - - - - - - - - // Error codes //- - - - - - - - - - - - - - - - - - - - - - - - - typedef long ASIOError; enum { ASE_OK = 0, // This value will be returned whenever the call succeeded ASE_SUCCESS = 0x3f4847a0, // unique success return value for ASIOFuture calls ASE_NotPresent = -1000, // hardware input or output is not present or available ASE_HWMalfunction, // hardware is malfunctioning (can be returned by any ASIO function) ASE_InvalidParameter, // input parameter invalid ASE_InvalidMode, // hardware is in a bad mode or used in a bad mode ASE_SPNotAdvancing, // hardware is not running when sample position is inquired ASE_NoClock, // sample clock or rate cannot be determined or is not present ASE_NoMemory // not enough memory for completing the request }; //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- //- - - - - - - - - - - - - - - - - - - - - - - - - // Time Info support //- - - - - - - - - - - - - - - - - - - - - - - - - typedef struct ASIOTimeCode { double speed; // speed relation (fraction of nominal speed) // optional; set to 0. or 1. if not supported ASIOSamples timeCodeSamples; // time in samples unsigned long flags; // some information flags (see below) char future[64]; } ASIOTimeCode; typedef enum ASIOTimeCodeFlags { kTcValid = 1, kTcRunning = 1 << 1, kTcReverse = 1 << 2, kTcOnspeed = 1 << 3, kTcStill = 1 << 4, kTcSpeedValid = 1 << 8 } ASIOTimeCodeFlags; typedef struct AsioTimeInfo { double speed; // absolute speed (1. = nominal) ASIOTimeStamp systemTime; // system time related to samplePosition, in nanoseconds // on mac, must be derived from Microseconds() (not UpTime()!) // on windows, must be derived from timeGetTime() ASIOSamples samplePosition; ASIOSampleRate sampleRate; // current rate unsigned long flags; // (see below) char reserved[12]; } AsioTimeInfo; typedef enum AsioTimeInfoFlags { kSystemTimeValid = 1, // must always be valid kSamplePositionValid = 1 << 1, // must always be valid kSampleRateValid = 1 << 2, kSpeedValid = 1 << 3, kSampleRateChanged = 1 << 4, kClockSourceChanged = 1 << 5 } AsioTimeInfoFlags; typedef struct ASIOTime // both input/output { long reserved[4]; // must be 0 struct AsioTimeInfo timeInfo; // required struct ASIOTimeCode timeCode; // optional, evaluated if (timeCode.flags & kTcValid) } ASIOTime; /* using time info: it is recommended to use the new method with time info even if the asio device does not support timecode; continuous calls to ASIOGetSamplePosition and ASIOGetSampleRate are avoided, and there is a more defined relationship between callback time and the time info. see the example below. to initiate time info mode, after you have received the callbacks pointer in ASIOCreateBuffers, you will call the asioMessage callback with kAsioSupportsTimeInfo as the argument. if this returns 1, host has accepted time info mode. now host expects the new callback bufferSwitchTimeInfo to be used instead of the old bufferSwitch method. the ASIOTime structure is assumed to be valid and accessible until the callback returns. using time code: if the device supports reading time code, it will call host's asioMessage callback with kAsioSupportsTimeCode as the selector. it may then fill the according fields and set the kTcValid flag. host will call the future method with the kAsioEnableTimeCodeRead selector when it wants to enable or disable tc reading by the device. you should also support the kAsioCanTimeInfo and kAsioCanTimeCode selectors in ASIOFuture (see example). note: the AsioTimeInfo/ASIOTimeCode pair is supposed to work in both directions. as a matter of convention, the relationship between the sample position counter and the time code at buffer switch time is (ignoring offset between tc and sample pos when tc is running): on input: sample 0 -> input buffer sample 0 -> time code 0 on output: sample 0 -> output buffer sample 0 -> time code 0 this means that for 'real' calculations, one has to take into account the according latencies. example: ASIOTime asioTime; in createBuffers() { memset(&asioTime, 0, sizeof(ASIOTime)); AsioTimeInfo* ti = &asioTime.timeInfo; ti->sampleRate = theSampleRate; ASIOTimeCode* tc = &asioTime.timeCode; tc->speed = 1.; timeInfoMode = false; canTimeCode = false; if(callbacks->asioMessage(kAsioSupportsTimeInfo, 0, 0, 0) == 1) { timeInfoMode = true; #if kCanTimeCode if(callbacks->asioMessage(kAsioSupportsTimeCode, 0, 0, 0) == 1) canTimeCode = true; #endif } } void switchBuffers(long doubleBufferIndex, bool processNow) { if(timeInfoMode) { AsioTimeInfo* ti = &asioTime.timeInfo; ti->flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid; ti->systemTime = theNanoSeconds; ti->samplePosition = theSamplePosition; if(ti->sampleRate != theSampleRate) ti->flags |= kSampleRateChanged; ti->sampleRate = theSampleRate; #if kCanTimeCode if(canTimeCode && timeCodeEnabled) { ASIOTimeCode* tc = &asioTime.timeCode; tc->timeCodeSamples = tcSamples; // tc in samples tc->flags = kTcValid | kTcRunning | kTcOnspeed; // if so... } ASIOTime* bb = callbacks->bufferSwitchTimeInfo(&asioTime, doubleBufferIndex, processNow ? ASIOTrue : ASIOFalse); #else callbacks->bufferSwitchTimeInfo(&asioTime, doubleBufferIndex, processNow ? ASIOTrue : ASIOFalse); #endif } else callbacks->bufferSwitch(doubleBufferIndex, ASIOFalse); } ASIOError ASIOFuture(long selector, void *params) { switch(selector) { case kAsioEnableTimeCodeRead: timeCodeEnabled = true; return ASE_SUCCESS; case kAsioDisableTimeCodeRead: timeCodeEnabled = false; return ASE_SUCCESS; case kAsioCanTimeInfo: return ASE_SUCCESS; #if kCanTimeCode case kAsioCanTimeCode: return ASE_SUCCESS; #endif } return ASE_NotPresent; }; */ //- - - - - - - - - - - - - - - - - - - - - - - - - // application's audio stream handler callbacks //- - - - - - - - - - - - - - - - - - - - - - - - - typedef struct ASIOCallbacks { void (*bufferSwitch) (long doubleBufferIndex, ASIOBool directProcess); // bufferSwitch indicates that both input and output are to be processed. // the current buffer half index (0 for A, 1 for B) determines // - the output buffer that the host should start to fill. the other buffer // will be passed to output hardware regardless of whether it got filled // in time or not. // - the input buffer that is now filled with incoming data. Note that // because of the synchronicity of i/o, the input always has at // least one buffer latency in relation to the output. // directProcess suggests to the host whether it should immedeately // start processing (directProcess == ASIOTrue), or whether its process // should be deferred because the call comes from a very low level // (for instance, a high level priority interrupt), and direct processing // would cause timing instabilities for the rest of the system. If in doubt, // directProcess should be set to ASIOFalse. // Note: bufferSwitch may be called at interrupt time for highest efficiency. void (*sampleRateDidChange) (ASIOSampleRate sRate); // gets called when the AudioStreamIO detects a sample rate change // If sample rate is unknown, 0 is passed (for instance, clock loss // when externally synchronized). long (*asioMessage) (long selector, long value, void* message, double* opt); // generic callback for various purposes, see selectors below. // note this is only present if the asio version is 2 or higher ASIOTime* (*bufferSwitchTimeInfo) (ASIOTime* params, long doubleBufferIndex, ASIOBool directProcess); // new callback with time info. makes ASIOGetSamplePosition() and various // calls to ASIOGetSampleRate obsolete, // and allows for timecode sync etc. to be preferred; will be used if // the driver calls asioMessage with selector kAsioSupportsTimeInfo. } ASIOCallbacks; // asioMessage selectors enum { kAsioSelectorSupported = 1, // selector in , returns 1L if supported, // 0 otherwise kAsioEngineVersion, // returns engine (host) asio implementation version, // 2 or higher kAsioResetRequest, // request driver reset. if accepted, this // will close the driver (ASIO_Exit() ) and // re-open it again (ASIO_Init() etc). some // drivers need to reconfigure for instance // when the sample rate changes, or some basic // changes have been made in ASIO_ControlPanel(). // returns 1L; note the request is merely passed // to the application, there is no way to determine // if it gets accepted at this time (but it usually // will be). kAsioBufferSizeChange, // not yet supported, will currently always return 0L. // for now, use kAsioResetRequest instead. // once implemented, the new buffer size is expected // in , and on success returns 1L kAsioResyncRequest, // the driver went out of sync, such that // the timestamp is no longer valid. this // is a request to re-start the engine and // slave devices (sequencer). returns 1 for ok, // 0 if not supported. kAsioLatenciesChanged, // the drivers latencies have changed. The engine // will refetch the latencies. kAsioSupportsTimeInfo, // if host returns true here, it will expect the // callback bufferSwitchTimeInfo to be called instead // of bufferSwitch kAsioSupportsTimeCode, // kAsioMMCCommand, // unused - value: number of commands, message points to mmc commands kAsioSupportsInputMonitor, // kAsioSupportsXXX return 1 if host supports this kAsioSupportsInputGain, // unused and undefined kAsioSupportsInputMeter, // unused and undefined kAsioSupportsOutputGain, // unused and undefined kAsioSupportsOutputMeter, // unused and undefined kAsioOverload, // driver detected an overload kAsioNumMessageSelectors }; //--------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------- //- - - - - - - - - - - - - - - - - - - - - - - - - // (De-)Construction //- - - - - - - - - - - - - - - - - - - - - - - - - typedef struct ASIODriverInfo { long asioVersion; // currently, 2 long driverVersion; // driver specific char name[32]; char errorMessage[124]; void *sysRef; // on input: system reference // (Windows: application main window handle, Mac & SGI: 0) } ASIODriverInfo; ASIOError ASIOInit(ASIODriverInfo *info); /* Purpose: Initialize the AudioStreamIO. Parameter: info: pointer to an ASIODriver structure: - asioVersion: - on input, the host version. *** Note *** this is 0 for earlier asio implementations, and the asioMessage callback is implemeted only if asioVersion is 2 or greater. sorry but due to a design fault the driver doesn't have access to the host version in ASIOInit :-( added selector for host (engine) version in the asioMessage callback so we're ok from now on. - on return, asio implementation version. older versions are 1 if you support this version (namely, ASIO_outputReady() ) this should be 2 or higher. also see the note in ASIO_getTimeStamp() ! - version: on return, the driver version (format is driver specific) - name: on return, a null-terminated string containing the driver's name - error message: on return, should contain a user message describing the type of error that occured during ASIOInit(), if any. - sysRef: platform specific Returns: If neither input nor output is present ASE_NotPresent will be returned. ASE_NoMemory, ASE_HWMalfunction are other possible error conditions */ ASIOError ASIOExit(void); /* Purpose: Terminates the AudioStreamIO. Parameter: None. Returns: If neither input nor output is present ASE_NotPresent will be returned. Notes: this implies ASIOStop() and ASIODisposeBuffers(), meaning that no host callbacks must be accessed after ASIOExit(). */ //- - - - - - - - - - - - - - - - - - - - - - - - - // Start/Stop //- - - - - - - - - - - - - - - - - - - - - - - - - ASIOError ASIOStart(void); /* Purpose: Start input and output processing synchronously. This will - reset the sample counter to zero - start the hardware (both input and output) The first call to the hosts' bufferSwitch(index == 0) then tells the host to read from input buffer A (index 0), and start processing to output buffer A while output buffer B (which has been filled by the host prior to calling ASIOStart()) is possibly sounding (see also ASIOGetLatencies()) Parameter: None. Returns: If neither input nor output is present, ASE_NotPresent will be returned. If the hardware fails to start, ASE_HWMalfunction will be returned. Notes: There is no restriction on the time that ASIOStart() takes to perform (that is, it is not considered a realtime trigger). */ ASIOError ASIOStop(void); /* Purpose: Stops input and output processing altogether. Parameter: None. Returns: If neither input nor output is present ASE_NotPresent will be returned. Notes: On return from ASIOStop(), the driver must in no case call the hosts' bufferSwitch() routine. */ //- - - - - - - - - - - - - - - - - - - - - - - - - // Inquiry methods and sample rate //- - - - - - - - - - - - - - - - - - - - - - - - - ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels); /* Purpose: Returns number of individual input/output channels. Parameter: numInputChannels will hold the number of available input channels numOutputChannels will hold the number of available output channels Returns: If no input/output is present ASE_NotPresent will be returned. If only inputs, or only outputs are available, the according other parameter will be zero, and ASE_OK is returned. */ ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency); /* Purpose: Returns the input and output latencies. This includes device specific delays, like FIFOs etc. Parameter: inputLatency will hold the 'age' of the first sample frame in the input buffer when the hosts reads it in bufferSwitch() (this is theoretical, meaning it does not include the overhead and delay between the actual physical switch, and the time when bufferSitch() enters). This will usually be the size of one block in sample frames, plus device specific latencies. outputLatency will specify the time between the buffer switch, and the time when the next play buffer will start to sound. The next play buffer is defined as the one the host starts processing after (or at) bufferSwitch(), indicated by the index parameter (0 for buffer A, 1 for buffer B). It will usually be either one block, if the host writes directly to a dma buffer, or two or more blocks if the buffer is 'latched' by the driver. As an example, on ASIOStart(), the host will have filled the play buffer at index 1 already; when it gets the callback (with the parameter index == 0), this tells it to read from the input buffer 0, and start to fill the play buffer 0 (assuming that now play buffer 1 is already sounding). In this case, the output latency is one block. If the driver decides to copy buffer 1 at that time, and pass it to the hardware at the next slot (which is most commonly done, but should be avoided), the output latency becomes two blocks instead, resulting in a total i/o latency of at least 3 blocks. As memory access is the main bottleneck in native dsp processing, and to acheive less latency, it is highly recommended to try to avoid copying (this is also why the driver is the owner of the buffers). To summarize, the minimum i/o latency can be acheived if the input buffer is processed by the host into the output buffer which will physically start to sound on the next time slice. Also note that the host expects the bufferSwitch() callback to be accessed for each time slice in order to retain sync, possibly recursively; if it fails to process a block in time, it will suspend its operation for some time in order to recover. Returns: If no input/output is present ASE_NotPresent will be returned. */ ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); /* Purpose: Returns min, max, and preferred buffer sizes for input/output Parameter: minSize will hold the minimum buffer size maxSize will hold the maxium possible buffer size preferredSize will hold the preferred buffer size (a size which best fits performance and hardware requirements) granularity will hold the granularity at which buffer sizes may differ. Usually, the buffer size will be a power of 2; in this case, granularity will hold -1 on return, signalling possible buffer sizes starting from minSize, increased in powers of 2 up to maxSize. Returns: If no input/output is present ASE_NotPresent will be returned. Notes: When minimum and maximum buffer size are equal, the preferred buffer size has to be the same value as well; granularity should be 0 in this case. */ ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate); /* Purpose: Inquires the hardware for the available sample rates. Parameter: sampleRate is the rate in question. Returns: If the inquired sample rate is not supported, ASE_NoClock will be returned. If no input/output is present ASE_NotPresent will be returned. */ ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate); /* Purpose: Get the current sample Rate. Parameter: currentRate will hold the current sample rate on return. Returns: If sample rate is unknown, sampleRate will be 0 and ASE_NoClock will be returned. If no input/output is present ASE_NotPresent will be returned. Notes: */ ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate); /* Purpose: Set the hardware to the requested sample Rate. If sampleRate == 0, enable external sync. Parameter: sampleRate: on input, the requested rate Returns: If sampleRate is unknown ASE_NoClock will be returned. If the current clock is external, and sampleRate is != 0, ASE_InvalidMode will be returned If no input/output is present ASE_NotPresent will be returned. Notes: */ typedef struct ASIOClockSource { long index; // as used for ASIOSetClockSource() long associatedChannel; // for instance, S/PDIF or AES/EBU long associatedGroup; // see channel groups (ASIOGetChannelInfo()) ASIOBool isCurrentSource; // ASIOTrue if this is the current clock source char name[32]; // for user selection } ASIOClockSource; ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources); /* Purpose: Get the available external audio clock sources Parameter: clocks points to an array of ASIOClockSource structures: - index: this is used to identify the clock source when ASIOSetClockSource() is accessed, should be an index counting from zero - associatedInputChannel: the first channel of an associated input group, if any. - associatedGroup: the group index of that channel. groups of channels are defined to seperate for instance analog, S/PDIF, AES/EBU, ADAT connectors etc, when present simultaniously. Note that associated channel is enumerated according to numInputs/numOutputs, means it is independant from a group (see also ASIOGetChannelInfo()) inputs are associated to a clock if the physical connection transfers both data and clock (like S/PDIF, AES/EBU, or ADAT inputs). if there is no input channel associated with the clock source (like Word Clock, or internal oscillator), both associatedChannel and associatedGroup should be set to -1. - isCurrentSource: on exit, ASIOTrue if this is the current clock source, ASIOFalse else - name: a null-terminated string for user selection of the available sources. numSources: on input: the number of allocated array members on output: the number of available clock sources, at least 1 (internal clock generator). Returns: If no input/output is present ASE_NotPresent will be returned. Notes: */ ASIOError ASIOSetClockSource(long index); /* Purpose: Set the audio clock source Parameter: index as obtained from an inquiry to ASIOGetClockSources() Returns: If no input/output is present ASE_NotPresent will be returned. If the clock can not be selected because an input channel which carries the current clock source is active, ASE_InvalidMode *may* be returned (this depends on the properties of the driver and/or hardware). Notes: Should *not* return ASE_NoClock if there is no clock signal present at the selected source; this will be inquired via ASIOGetSampleRate(). It should call the host callback procedure sampleRateHasChanged(), if the switch causes a sample rate change, or if no external clock is present at the selected source. */ ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); /* Purpose: Inquires the sample position/time stamp pair. Parameter: sPos will hold the sample position on return. The sample position is reset to zero when ASIOStart() gets called. tStamp will hold the system time when the sample position was latched. Returns: If no input/output is present, ASE_NotPresent will be returned. If there is no clock, ASE_SPNotAdvancing will be returned. Notes: in order to be able to synchronise properly, the sample position / time stamp pair must refer to the current block, that is, the engine will call ASIOGetSamplePosition() in its bufferSwitch() callback and expect the time for the current block. thus, when requested in the very first bufferSwitch after ASIO_Start(), the sample position should be zero, and the time stamp should refer to the very time where the stream was started. it also means that the sample position must be block aligned. the driver must ensure proper interpolation if the system time can not be determined for the block position. the driver is responsible for precise time stamps as it usually has most direct access to lower level resources. proper behaviour of ASIO_GetSamplePosition() and ASIO_GetLatencies() are essential for precise media synchronization! */ typedef struct ASIOChannelInfo { long channel; // on input, channel index ASIOBool isInput; // on input ASIOBool isActive; // on exit long channelGroup; // dto ASIOSampleType type; // dto char name[32]; // dto } ASIOChannelInfo; ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info); /* Purpose: retreive information about the nature of a channel Parameter: info: pointer to a ASIOChannelInfo structure with - channel: on input, the channel index of the channel in question. - isInput: on input, ASIOTrue if info for an input channel is requested, else output - channelGroup: on return, the channel group that the channel belongs to. For drivers which support different types of channels, like analog, S/PDIF, AES/EBU, ADAT etc interfaces, there should be a reasonable grouping of these types. Groups are always independant form a channel index, that is, a channel index always counts from 0 to numInputs/numOutputs regardless of the group it may belong to. There will always be at least one group (group 0). Please also note that by default, the host may decide to activate channels 0 and 1; thus, these should belong to the most useful type (analog i/o, if present). - type: on return, contains the sample type of the channel - isActive: on return, ASIOTrue if channel is active as it was installed by ASIOCreateBuffers(), ASIOFalse else - name: describing the type of channel in question. Used to allow for user selection, and enabling of specific channels. examples: "Analog In", "SPDIF Out" etc Returns: If no input/output is present ASE_NotPresent will be returned. Notes: If possible, the string should be organised such that the first characters are most significantly describing the nature of the port, to allow for identification even if the view showing the port name is too small to display more than 8 characters, for instance. */ //- - - - - - - - - - - - - - - - - - - - - - - - - // Buffer preparation //- - - - - - - - - - - - - - - - - - - - - - - - - typedef struct ASIOBufferInfo { ASIOBool isInput; // on input: ASIOTrue: input, else output long channelNum; // on input: channel index void *buffers[2]; // on output: double buffer addresses } ASIOBufferInfo; ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); /* Purpose: Allocates input/output buffers for all input and output channels to be activated. Parameter: bufferInfos is a pointer to an array of ASIOBufferInfo structures: - isInput: on input, ASIOTrue if the buffer is to be allocated for an input, output buffer else - channelNum: on input, the index of the channel in question (counting from 0) - buffers: on exit, 2 pointers to the halves of the channels' double-buffer. the size of the buffer(s) of course depend on both the ASIOSampleType as obtained from ASIOGetChannelInfo(), and bufferSize numChannels is the sum of all input and output channels to be created; thus bufferInfos is a pointer to an array of numChannels ASIOBufferInfo structures. bufferSize selects one of the possible buffer sizes as obtained from ASIOGetBufferSizes(). callbacks is a pointer to an ASIOCallbacks structure. Returns: If not enough memory is available ASE_NoMemory will be returned. If no input/output is present ASE_NotPresent will be returned. If bufferSize is not supported, or one or more of the bufferInfos elements contain invalid settings, ASE_InvalidMode will be returned. Notes: If individual channel selection is not possible but requested, the driver has to handle this. namely, bufferSwitch() will only have filled buffers of enabled outputs. If possible, processing and buss activities overhead should be avoided for channels which were not enabled here. */ ASIOError ASIODisposeBuffers(void); /* Purpose: Releases all buffers for the device. Parameter: None. Returns: If no buffer were ever prepared, ASE_InvalidMode will be returned. If no input/output is present ASE_NotPresent will be returned. Notes: This implies ASIOStop(). */ ASIOError ASIOControlPanel(void); /* Purpose: request the driver to start a control panel component for device specific user settings. This will not be accessed on some platforms (where the component is accessed instead). Parameter: None. Returns: If no panel is available ASE_NotPresent will be returned. Actually, the return code is ignored. Notes: if the user applied settings which require a re-configuration of parts or all of the enigine and/or driver (such as a change of the block size), the asioMessage callback can be used (see ASIO_Callbacks). */ ASIOError ASIOFuture(long selector, void *params); /* Purpose: various Parameter: selector: operation Code as to be defined. zero is reserved for testing purposes. params: depends on the selector; usually pointer to a structure for passing and retreiving any type and amount of parameters. Returns: the return value is also selector dependant. if the selector is unknown, ASE_InvalidParameter should be returned to prevent further calls with this selector. on success, ASE_SUCCESS must be returned (note: ASE_OK is *not* sufficient!) Notes: see selectors defined below. */ enum { kAsioEnableTimeCodeRead = 1, // no arguments kAsioDisableTimeCodeRead, // no arguments kAsioSetInputMonitor, // ASIOInputMonitor* in params kAsioTransport, // ASIOTransportParameters* in params kAsioSetInputGain, // ASIOChannelControls* in params, apply gain kAsioGetInputMeter, // ASIOChannelControls* in params, fill meter kAsioSetOutputGain, // ASIOChannelControls* in params, apply gain kAsioGetOutputMeter, // ASIOChannelControls* in params, fill meter kAsioCanInputMonitor, // no arguments for kAsioCanXXX selectors kAsioCanTimeInfo, kAsioCanTimeCode, kAsioCanTransport, kAsioCanInputGain, kAsioCanInputMeter, kAsioCanOutputGain, kAsioCanOutputMeter, // DSD support // The following extensions are required to allow switching // and control of the DSD subsystem. kAsioSetIoFormat = 0x23111961, /* ASIOIoFormat * in params. */ kAsioGetIoFormat = 0x23111983, /* ASIOIoFormat * in params. */ kAsioCanDoIoFormat = 0x23112004, /* ASIOIoFormat * in params. */ }; typedef struct ASIOInputMonitor { long input; // this input was set to monitor (or off), -1: all long output; // suggested output for monitoring the input (if so) long gain; // suggested gain, ranging 0 - 0x7fffffffL (-inf to +12 dB) ASIOBool state; // ASIOTrue => on, ASIOFalse => off long pan; // suggested pan, 0 => all left, 0x7fffffff => right } ASIOInputMonitor; typedef struct ASIOChannelControls { long channel; // on input, channel index ASIOBool isInput; // on input long gain; // on input, ranges 0 thru 0x7fffffff long meter; // on return, ranges 0 thru 0x7fffffff char future[32]; } ASIOChannelControls; typedef struct ASIOTransportParameters { long command; // see enum below ASIOSamples samplePosition; long track; long trackSwitches[16]; // 512 tracks on/off char future[64]; } ASIOTransportParameters; enum { kTransStart = 1, kTransStop, kTransLocate, // to samplePosition kTransPunchIn, kTransPunchOut, kTransArmOn, // track kTransArmOff, // track kTransMonitorOn, // track kTransMonitorOff, // track kTransArm, // trackSwitches kTransMonitor // trackSwitches }; /* // DSD support // Some notes on how to use ASIOIoFormatType. // // The caller will fill the format with the request types. // If the board can do the request then it will leave the // values unchanged. If the board does not support the // request then it will change that entry to Invalid (-1) // // So to request DSD then // // ASIOIoFormat NeedThis={kASIODSDFormat}; // // if(ASE_SUCCESS != ASIOFuture(kAsioSetIoFormat,&NeedThis) ){ // // If the board did not accept one of the parameters then the // // whole call will fail and the failing parameter will // // have had its value changes to -1. // } // // Note: Switching between the formats need to be done before the "prepared" // state (see ASIO 2 documentation) is entered. */ typedef long int ASIOIoFormatType; enum ASIOIoFormatType_e { kASIOFormatInvalid = -1, kASIOPCMFormat = 0, kASIODSDFormat = 1, }; typedef struct ASIOIoFormat_s { ASIOIoFormatType FormatType; char future[512-sizeof(ASIOIoFormatType)]; } ASIOIoFormat; ASIOError ASIOOutputReady(void); /* Purpose: this tells the driver that the host has completed processing the output buffers. if the data format required by the hardware differs from the supported asio formats, but the hardware buffers are DMA buffers, the driver will have to convert the audio stream data; as the bufferSwitch callback is usually issued at dma block switch time, the driver will have to convert the *previous* host buffer, which increases the output latency by one block. when the host finds out that ASIOOutputReady() returns true, it will issue this call whenever it completed output processing. then the driver can convert the host data directly to the dma buffer to be played next, reducing output latency by one block. another way to look at it is, that the buffer switch is called in order to pass the *input* stream to the host, so that it can process the input into the output, and the output stream is passed to the driver when the host has completed its process. Parameter: None Returns: only if the above mentioned scenario is given, and a reduction of output latency can be acheived by this mechanism, should ASE_OK be returned. otherwise (and usually), ASE_NotPresent should be returned in order to prevent further calls to this function. note that the host may want to determine if it is to use this when the system is not yet fully initialized, so ASE_OK should always be returned if the mechanism makes sense. Notes: please remeber to adjust ASIOGetLatencies() according to whether ASIOOutputReady() was ever called or not, if your driver supports this scenario. also note that the engine may fail to call ASIO_OutputReady() in time in overload cases. as already mentioned, bufferSwitch should be called for every block regardless of whether a block could be processed in time. */ // restore old alignment #if defined(_MSC_VER) && !defined(__MWERKS__) #pragma pack(pop) #elif PRAGMA_ALIGN_SUPPORTED #pragma options align = reset #endif #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/rtaudio/asio/iasiothiscallresolver.cpp0000644000175000017500000005534111163425013032043 0ustar admin2admin2/* IASIOThiscallResolver.cpp see the comments in iasiothiscallresolver.h for the top level description - this comment describes the technical details of the implementation. The latest version of this file is available from: http://www.audiomulch.com/~rossb/code/calliasio please email comments to Ross Bencina BACKGROUND The IASIO interface declared in the Steinberg ASIO 2 SDK declares functions with no explicit calling convention. This causes MSVC++ to default to using the thiscall convention, which is a proprietary convention not implemented by some non-microsoft compilers - notably borland BCC, C++Builder, and gcc. MSVC++ is the defacto standard compiler used by Steinberg. As a result of this situation, the ASIO sdk will compile with any compiler, however attempting to execute the compiled code will cause a crash due to different default calling conventions on non-Microsoft compilers. IASIOThiscallResolver solves the problem by providing an adapter class that delegates to the IASIO interface using the correct calling convention (thiscall). Due to the lack of support for thiscall in the Borland and GCC compilers, the calls have been implemented in assembly language. A number of macros are defined for thiscall function calls with different numbers of parameters, with and without return values - it may be possible to modify the format of these macros to make them work with other inline assemblers. THISCALL DEFINITION A number of definitions of the thiscall calling convention are floating around the internet. The following definition has been validated against output from the MSVC++ compiler: For non-vararg functions, thiscall works as follows: the object (this) pointer is passed in ECX. All arguments are passed on the stack in right to left order. The return value is placed in EAX. The callee clears the passed arguments from the stack. FINDING FUNCTION POINTERS FROM AN IASIO POINTER The first field of a COM object is a pointer to its vtble. Thus a pointer to an object implementing the IASIO interface also points to a pointer to that object's vtbl. The vtble is a table of function pointers for all of the virtual functions exposed by the implemented interfaces. If we consider a variable declared as a pointer to IASO: IASIO *theAsioDriver theAsioDriver points to: object implementing IASIO { IASIOvtbl *vtbl other data } in other words, theAsioDriver points to a pointer to an IASIOvtbl vtbl points to a table of function pointers: IASIOvtbl ( interface IASIO : public IUnknown ) { (IUnknown functions) 0 virtual HRESULT STDMETHODCALLTYPE (*QueryInterface)(REFIID riid, void **ppv) = 0; 4 virtual ULONG STDMETHODCALLTYPE (*AddRef)() = 0; 8 virtual ULONG STDMETHODCALLTYPE (*Release)() = 0; (IASIO functions) 12 virtual ASIOBool (*init)(void *sysHandle) = 0; 16 virtual void (*getDriverName)(char *name) = 0; 20 virtual long (*getDriverVersion)() = 0; 24 virtual void (*getErrorMessage)(char *string) = 0; 28 virtual ASIOError (*start)() = 0; 32 virtual ASIOError (*stop)() = 0; 36 virtual ASIOError (*getChannels)(long *numInputChannels, long *numOutputChannels) = 0; 40 virtual ASIOError (*getLatencies)(long *inputLatency, long *outputLatency) = 0; 44 virtual ASIOError (*getBufferSize)(long *minSize, long *maxSize, long *preferredSize, long *granularity) = 0; 48 virtual ASIOError (*canSampleRate)(ASIOSampleRate sampleRate) = 0; 52 virtual ASIOError (*getSampleRate)(ASIOSampleRate *sampleRate) = 0; 56 virtual ASIOError (*setSampleRate)(ASIOSampleRate sampleRate) = 0; 60 virtual ASIOError (*getClockSources)(ASIOClockSource *clocks, long *numSources) = 0; 64 virtual ASIOError (*setClockSource)(long reference) = 0; 68 virtual ASIOError (*getSamplePosition)(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0; 72 virtual ASIOError (*getChannelInfo)(ASIOChannelInfo *info) = 0; 76 virtual ASIOError (*createBuffers)(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) = 0; 80 virtual ASIOError (*disposeBuffers)() = 0; 84 virtual ASIOError (*controlPanel)() = 0; 88 virtual ASIOError (*future)(long selector,void *opt) = 0; 92 virtual ASIOError (*outputReady)() = 0; }; The numbers in the left column show the byte offset of each function ptr from the beginning of the vtbl. These numbers are used in the code below to select different functions. In order to find the address of a particular function, theAsioDriver must first be dereferenced to find the value of the vtbl pointer: mov eax, theAsioDriver mov edx, [theAsioDriver] // edx now points to vtbl[0] Then an offset must be added to the vtbl pointer to select a particular function, for example vtbl+44 points to the slot containing a pointer to the getBufferSize function. Finally vtbl+x must be dereferenced to obtain the value of the function pointer stored in that address: call [edx+44] // call the function pointed to by // the value in the getBufferSize field of the vtbl SEE ALSO Martin Fay's OpenASIO DLL at http://www.martinfay.com solves the same problem by providing a new COM interface which wraps IASIO with an interface that uses portable calling conventions. OpenASIO must be compiled with MSVC, and requires that you ship the OpenASIO DLL with your application. ACKNOWLEDGEMENTS Ross Bencina: worked out the thiscall details above, wrote the original Borland asm macros, and a patch for asio.cpp (which is no longer needed). Thanks to Martin Fay for introducing me to the issues discussed here, and to Rene G. Ceballos for assisting with asm dumps from MSVC++. Antti Silvast: converted the original calliasio to work with gcc and NASM by implementing the asm code in a separate file. Fraser Adams: modified the original calliasio containing the Borland inline asm to add inline asm for gcc i.e. Intel syntax for Borland and AT&T syntax for gcc. This seems a neater approach for gcc than to have a separate .asm file and it means that we only need one version of the thiscall patch. Fraser Adams: rewrote the original calliasio patch in the form of the IASIOThiscallResolver class in order to avoid modifications to files from the Steinberg SDK, which may have had potential licence issues. Andrew Baldwin: contributed fixes for compatibility problems with more recent versions of the gcc assembler. */ // We only need IASIOThiscallResolver at all if we are on Win32. For other // platforms we simply bypass the IASIOThiscallResolver definition to allow us // to be safely #include'd whatever the platform to keep client code portable #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) // If microsoft compiler we can call IASIO directly so IASIOThiscallResolver // is not used. #if !defined(_MSC_VER) #include #include // We have a mechanism in iasiothiscallresolver.h to ensure that asio.h is // #include'd before it in client code, we do NOT want to do this test here. #define iasiothiscallresolver_sourcefile 1 #include "iasiothiscallresolver.h" #undef iasiothiscallresolver_sourcefile // iasiothiscallresolver.h redefines ASIOInit for clients, but we don't want // this macro defined in this translation unit. #undef ASIOInit // theAsioDriver is a global pointer to the current IASIO instance which the // ASIO SDK uses to perform all actions on the IASIO interface. We substitute // our own forwarding interface into this pointer. extern IASIO* theAsioDriver; // The following macros define the inline assembler for BORLAND first then gcc #if defined(__BCPLUSPLUS__) || defined(__BORLANDC__) #define CALL_THISCALL_0( resultName, thisPtr, funcOffset )\ void *this_ = (thisPtr); \ __asm { \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #define CALL_VOID_THISCALL_1( thisPtr, funcOffset, param1 )\ void *this_ = (thisPtr); \ __asm { \ mov eax, param1 ; \ push eax ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ } #define CALL_THISCALL_1( resultName, thisPtr, funcOffset, param1 )\ void *this_ = (thisPtr); \ __asm { \ mov eax, param1 ; \ push eax ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #define CALL_THISCALL_1_DOUBLE( resultName, thisPtr, funcOffset, param1 )\ void *this_ = (thisPtr); \ void *doubleParamPtr_ (¶m1); \ __asm { \ mov eax, doubleParamPtr_ ; \ push [eax+4] ; \ push [eax] ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #define CALL_THISCALL_2( resultName, thisPtr, funcOffset, param1, param2 )\ void *this_ = (thisPtr); \ __asm { \ mov eax, param2 ; \ push eax ; \ mov eax, param1 ; \ push eax ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #define CALL_THISCALL_4( resultName, thisPtr, funcOffset, param1, param2, param3, param4 )\ void *this_ = (thisPtr); \ __asm { \ mov eax, param4 ; \ push eax ; \ mov eax, param3 ; \ push eax ; \ mov eax, param2 ; \ push eax ; \ mov eax, param1 ; \ push eax ; \ mov ecx, this_ ; \ mov eax, [ecx] ; \ call [eax+funcOffset] ; \ mov resultName, eax ; \ } #elif defined(__GNUC__) #define CALL_THISCALL_0( resultName, thisPtr, funcOffset ) \ __asm__ __volatile__ ("movl (%1), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"c"(thisPtr) /* Input Operands */ \ ); \ #define CALL_VOID_THISCALL_1( thisPtr, funcOffset, param1 ) \ __asm__ __volatile__ ("pushl %0\n\t" \ "movl (%1), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ : /* Output Operands */ \ :"r"(param1), /* Input Operands */ \ "c"(thisPtr) \ ); \ #define CALL_THISCALL_1( resultName, thisPtr, funcOffset, param1 ) \ __asm__ __volatile__ ("pushl %1\n\t" \ "movl (%2), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"r"(param1), /* Input Operands */ \ "c"(thisPtr) \ ); \ #define CALL_THISCALL_1_DOUBLE( resultName, thisPtr, funcOffset, param1 ) \ __asm__ __volatile__ ("pushl 4(%1)\n\t" \ "pushl (%1)\n\t" \ "movl (%2), %%edx\n\t" \ "call *"#funcOffset"(%%edx);\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"a"(¶m1), /* Input Operands */ \ /* Note: Using "r" above instead of "a" fails */ \ /* when using GCC 3.3.3, and maybe later versions*/\ "c"(thisPtr) \ ); \ #define CALL_THISCALL_2( resultName, thisPtr, funcOffset, param1, param2 ) \ __asm__ __volatile__ ("pushl %1\n\t" \ "pushl %2\n\t" \ "movl (%3), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"r"(param2), /* Input Operands */ \ "r"(param1), \ "c"(thisPtr) \ ); \ #define CALL_THISCALL_4( resultName, thisPtr, funcOffset, param1, param2, param3, param4 )\ __asm__ __volatile__ ("pushl %1\n\t" \ "pushl %2\n\t" \ "pushl %3\n\t" \ "pushl %4\n\t" \ "movl (%5), %%edx\n\t" \ "call *"#funcOffset"(%%edx)\n\t" \ :"=a"(resultName) /* Output Operands */ \ :"r"(param4), /* Input Operands */ \ "r"(param3), \ "r"(param2), \ "r"(param1), \ "c"(thisPtr) \ ); \ #endif // Our static singleton instance. IASIOThiscallResolver IASIOThiscallResolver::instance; // Constructor called to initialize static Singleton instance above. Note that // it is important not to clear that_ incase it has already been set by the call // to placement new in ASIOInit(). IASIOThiscallResolver::IASIOThiscallResolver() { } // Constructor called from ASIOInit() below IASIOThiscallResolver::IASIOThiscallResolver(IASIO* that) : that_( that ) { } // Implement IUnknown methods as assert(false). IASIOThiscallResolver is not // really a COM object, just a wrapper which will work with the ASIO SDK. // If you wanted to use ASIO without the SDK you might want to implement COM // aggregation in these methods. HRESULT STDMETHODCALLTYPE IASIOThiscallResolver::QueryInterface(REFIID riid, void **ppv) { (void)riid; // suppress unused variable warning assert( false ); // this function should never be called by the ASIO SDK. *ppv = NULL; return E_NOINTERFACE; } ULONG STDMETHODCALLTYPE IASIOThiscallResolver::AddRef() { assert( false ); // this function should never be called by the ASIO SDK. return 1; } ULONG STDMETHODCALLTYPE IASIOThiscallResolver::Release() { assert( false ); // this function should never be called by the ASIO SDK. return 1; } // Implement the IASIO interface methods by performing the vptr manipulation // described above then delegating to the real implementation. ASIOBool IASIOThiscallResolver::init(void *sysHandle) { ASIOBool result; CALL_THISCALL_1( result, that_, 12, sysHandle ); return result; } void IASIOThiscallResolver::getDriverName(char *name) { CALL_VOID_THISCALL_1( that_, 16, name ); } long IASIOThiscallResolver::getDriverVersion() { ASIOBool result; CALL_THISCALL_0( result, that_, 20 ); return result; } void IASIOThiscallResolver::getErrorMessage(char *string) { CALL_VOID_THISCALL_1( that_, 24, string ); } ASIOError IASIOThiscallResolver::start() { ASIOBool result; CALL_THISCALL_0( result, that_, 28 ); return result; } ASIOError IASIOThiscallResolver::stop() { ASIOBool result; CALL_THISCALL_0( result, that_, 32 ); return result; } ASIOError IASIOThiscallResolver::getChannels(long *numInputChannels, long *numOutputChannels) { ASIOBool result; CALL_THISCALL_2( result, that_, 36, numInputChannels, numOutputChannels ); return result; } ASIOError IASIOThiscallResolver::getLatencies(long *inputLatency, long *outputLatency) { ASIOBool result; CALL_THISCALL_2( result, that_, 40, inputLatency, outputLatency ); return result; } ASIOError IASIOThiscallResolver::getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) { ASIOBool result; CALL_THISCALL_4( result, that_, 44, minSize, maxSize, preferredSize, granularity ); return result; } ASIOError IASIOThiscallResolver::canSampleRate(ASIOSampleRate sampleRate) { ASIOBool result; CALL_THISCALL_1_DOUBLE( result, that_, 48, sampleRate ); return result; } ASIOError IASIOThiscallResolver::getSampleRate(ASIOSampleRate *sampleRate) { ASIOBool result; CALL_THISCALL_1( result, that_, 52, sampleRate ); return result; } ASIOError IASIOThiscallResolver::setSampleRate(ASIOSampleRate sampleRate) { ASIOBool result; CALL_THISCALL_1_DOUBLE( result, that_, 56, sampleRate ); return result; } ASIOError IASIOThiscallResolver::getClockSources(ASIOClockSource *clocks, long *numSources) { ASIOBool result; CALL_THISCALL_2( result, that_, 60, clocks, numSources ); return result; } ASIOError IASIOThiscallResolver::setClockSource(long reference) { ASIOBool result; CALL_THISCALL_1( result, that_, 64, reference ); return result; } ASIOError IASIOThiscallResolver::getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) { ASIOBool result; CALL_THISCALL_2( result, that_, 68, sPos, tStamp ); return result; } ASIOError IASIOThiscallResolver::getChannelInfo(ASIOChannelInfo *info) { ASIOBool result; CALL_THISCALL_1( result, that_, 72, info ); return result; } ASIOError IASIOThiscallResolver::createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) { ASIOBool result; CALL_THISCALL_4( result, that_, 76, bufferInfos, numChannels, bufferSize, callbacks ); return result; } ASIOError IASIOThiscallResolver::disposeBuffers() { ASIOBool result; CALL_THISCALL_0( result, that_, 80 ); return result; } ASIOError IASIOThiscallResolver::controlPanel() { ASIOBool result; CALL_THISCALL_0( result, that_, 84 ); return result; } ASIOError IASIOThiscallResolver::future(long selector,void *opt) { ASIOBool result; CALL_THISCALL_2( result, that_, 88, selector, opt ); return result; } ASIOError IASIOThiscallResolver::outputReady() { ASIOBool result; CALL_THISCALL_0( result, that_, 92 ); return result; } // Implement our substitute ASIOInit() method ASIOError IASIOThiscallResolver::ASIOInit(ASIODriverInfo *info) { // To ensure that our instance's vptr is correctly constructed, even if // ASIOInit is called prior to main(), we explicitly call its constructor // (potentially over the top of an existing instance). Note that this is // pretty ugly, and is only safe because IASIOThiscallResolver has no // destructor and contains no objects with destructors. new((void*)&instance) IASIOThiscallResolver( theAsioDriver ); // Interpose between ASIO client code and the real driver. theAsioDriver = &instance; // Note that we never need to switch theAsioDriver back to point to the // real driver because theAsioDriver is reset to zero in ASIOExit(). // Delegate to the real ASIOInit return ::ASIOInit(info); } #endif /* !defined(_MSC_VER) */ #endif /* Win32 */ milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/RtAudio3Impl.cpp0000755000175000017500000001773211163403715025315 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * RtAudio3Impl.cpp * MilkyPlay * * Created by Peter Barth on 06.04.08. * * */ #include "AudioDriver_RTAUDIO.h" #include "RtAudio3.h" #ifdef DRIVER_UNIX #include #include #endif class Rt3AudioDriverImpl : public AudioDriver_COMPENSATE { private: RtAudio* audio; RtAudio::RtAudioApi selectedAudioApi; static int fill_audio(char* stream, int length, void *udata) { // upgrade to reflect number of bytes, instead number of samples length<<=2; Rt3AudioDriverImpl* audioDriver = (Rt3AudioDriverImpl*)udata; // Base class can handle this audioDriver->fillAudioWithCompensation((char *) stream, length); return 0; } public: Rt3AudioDriverImpl(RtAudio::RtAudioApi audioApi = RtAudio::UNSPECIFIED) : AudioDriver_COMPENSATE(), audio(NULL), selectedAudioApi(audioApi) { } virtual ~Rt3AudioDriverImpl() { } virtual mp_sint32 getPreferredBufferSize() const { switch (selectedAudioApi) { case RtAudio::UNSPECIFIED: return 1024; case RtAudio::LINUX_ALSA: return 2048; case RtAudio::LINUX_OSS: return 2048; case RtAudio::MACOSX_CORE: return 1024; case RtAudio::WINDOWS_ASIO: return 1024; case RtAudio::WINDOWS_DS: return 2048; } return 2048; } // On error return a negative value // If the requested buffer size can be served return 0, // otherwise return the number of 16 bit words contained in the obtained buffer virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { /*mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; // construction will not throw any RtAudio specific exceptions audio = new RtAudio(selectedAudioApi); mp_uint32 numDevices = audio->getDeviceCount(); mp_uint32 deviceId = 0; for (mp_uint32 i = 0; i < numDevices; i++) { RtAudio::DeviceInfo deviceInfo = audio->getDeviceInfo(i); if (deviceInfo.isDefaultOutput) { deviceId = i; break; } } #ifdef DRIVER_UNIX int channels = 2; unsigned int sampleRate = mixFrequency; unsigned int bufferSize = bufferSizeInWords / channels; RtAudio::StreamParameters sStreamParams; sStreamParams.deviceId = deviceId; RtAudio::StreamOptions sStreamOptions; char streamName[32]; snprintf(streamName, sizeof(streamName), "Milkytracker %i", getpid()); sStreamOptions.streamName = streamName; sStreamOptions.numberOfBuffers = 2; sStreamParams.nChannels = 2; // Open a stream during RtAudio instantiation try { audio->openStream(&sStreamParams, NULL, RTAUDIO_SINT16, sampleRate, &bufferSize, &fill_audio, (void *)this, &sStreamOptions); } #else int channels = 2; unsigned int sampleRate = mixFrequency; unsigned int bufferSize = bufferSizeInWords / channels; RtAudio::StreamParameters sStreamParams; sStreamParams.deviceId = deviceId; sStreamParams.nChannels = 2; // Open a stream during RtAudio instantiation try { audio->openStream(&sStreamParams, NULL, RTAUDIO_SINT16, sampleRate, &bufferSize, &fill_audio, (void *)this); } #endif catch (RtError &error) { error.printMessage(); return -1; } #ifndef WIN32 printf("Audio buffer: Wanted %d bytes, got %d\n", bufferSizeInWords / channels * 4, bufferSize * 4); #endif // If we got what we requested, return 0, // otherwise return the actual number of samples * number of channels return (bufferSizeInWords / channels == (signed)bufferSize) ? 0 : bufferSize * channels;*/ mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; int channels = 2; int sampleRate = mixFrequency; int bufferSize = bufferSizeInWords / channels; int nBuffers = 4; int device = 0; // 0 indicates the default or first available device // Open a stream during RtAudio instantiation try { audio = new RtAudio(device, channels, 0, 0, RTAUDIO_SINT16, sampleRate, &bufferSize, nBuffers, selectedAudioApi); audio->setStreamCallback(&fill_audio, (void *)this); } catch (RtError &error) { error.printMessage(); return -1; } #ifndef WIN32 printf("Audio buffer: Wanted %d bytes, got %d\n", bufferSizeInWords / channels * 4, bufferSize * 4); #endif // If we got what we requested, return 0, // otherwise return the actual number of samples * number of channels return (bufferSizeInWords / channels == bufferSize) ? 0 : bufferSize * channels; } virtual mp_sint32 stop() { if (audio) { try { audio->stopStream(); deviceHasStarted = false; return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual mp_sint32 closeDevice() { if (audio) { try { audio->closeStream(); deviceHasStarted = false; return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual mp_sint32 start() { if (audio) { try { audio->startStream(); deviceHasStarted = true; return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual mp_sint32 pause() { if (audio) { try { audio->stopStream(); return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual mp_sint32 resume() { if (audio) { try { audio->startStream(); return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual const char* getDriverID() { static const char*driverNames[] = { "Unspecified (RtAudio3)", "Alsa (RtAudio3)", "OSS (RtAudio3)", "Jack (RtAudio3)", "CoreAudio (RtAudio3)", "Irix (RtAudio3)", "ASIO (RtAudio3)", "DirectSound (RtAudio3)" }; return driverNames[selectedAudioApi]; } }; void AudioDriver_RTAUDIO::createRt3Instance(Api audioApi/* = UNSPECIFIED*/) { RtAudio::RtAudioApi rtApi = RtAudio::UNSPECIFIED; switch (audioApi) { case LINUX_ALSA: rtApi = RtAudio::LINUX_ALSA; break; case LINUX_OSS: rtApi = RtAudio::LINUX_OSS; break; case MACOSX_CORE: rtApi = RtAudio::MACOSX_CORE; break; case WINDOWS_ASIO: rtApi = RtAudio::WINDOWS_ASIO; break; case WINDOWS_DS: rtApi = RtAudio::WINDOWS_DS; break; } if (impl) delete impl; impl = new Rt3AudioDriverImpl(rtApi); } milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/RtAudio4Impl.cpp0000755000175000017500000001657111163403715025316 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * RtAudio4Impl.cpp * MilkyPlay * * Created by Peter Barth on 06.04.08. * * */ #include "AudioDriver_RTAUDIO.h" #ifndef __OSX_PANTHER__ #include "RtAudio4.h" #ifdef DRIVER_UNIX #include #include #endif using namespace RtAudio4; class Rt4AudioDriverImpl : public AudioDriver_COMPENSATE { private: RtAudio* audio; RtAudio::Api selectedAudioApi; static int fill_audio(void* stream, void*, unsigned int length, double streamTime, RtAudioStreamStatus status, void *udata) { // upgrade to reflect number of bytes, instead number of samples length<<=2; Rt4AudioDriverImpl* audioDriver = (Rt4AudioDriverImpl*)udata; // Base class can handle this audioDriver->fillAudioWithCompensation((char *) stream, length); return 0; } public: Rt4AudioDriverImpl(RtAudio::Api audioApi = RtAudio::UNSPECIFIED) : AudioDriver_COMPENSATE(), audio(NULL), selectedAudioApi(audioApi) { } virtual ~Rt4AudioDriverImpl() { } virtual mp_sint32 getPreferredBufferSize() const { switch (selectedAudioApi) { case RtAudio::UNSPECIFIED: return 1024; case RtAudio::LINUX_ALSA: return 2048; case RtAudio::LINUX_OSS: return 2048; case RtAudio::UNIX_JACK: return 1024; case RtAudio::MACOSX_CORE: return 1024; case RtAudio::WINDOWS_ASIO: return 1024; case RtAudio::WINDOWS_DS: return 2048; } return 2048; } // On error return a negative value // If the requested buffer size can be served return 0, // otherwise return the number of 16 bit words contained in the obtained buffer virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; // construction will not throw any RtAudio specific exceptions audio = new RtAudio(selectedAudioApi); mp_uint32 numDevices = audio->getDeviceCount(); mp_uint32 deviceId = 0; for (mp_uint32 i = 0; i < numDevices; i++) { RtAudio::DeviceInfo deviceInfo = audio->getDeviceInfo(i); if (deviceInfo.isDefaultOutput) { deviceId = i; break; } } #ifdef DRIVER_UNIX int channels = 2; unsigned int sampleRate = mixFrequency; unsigned int bufferSize = bufferSizeInWords / channels; RtAudio::StreamParameters sStreamParams; sStreamParams.deviceId = deviceId; RtAudio::StreamOptions sStreamOptions; char streamName[32]; snprintf(streamName, sizeof(streamName), "Milkytracker %i", getpid()); sStreamOptions.streamName = streamName; sStreamOptions.numberOfBuffers = 2; sStreamParams.nChannels = 2; // Open a stream during RtAudio instantiation try { audio->openStream(&sStreamParams, NULL, RTAUDIO_SINT16, sampleRate, &bufferSize, &fill_audio, (void *)this, &sStreamOptions); } #else int channels = 2; unsigned int sampleRate = mixFrequency; unsigned int bufferSize = bufferSizeInWords / channels; RtAudio::StreamParameters sStreamParams; sStreamParams.deviceId = deviceId; sStreamParams.nChannels = 2; // Open a stream during RtAudio instantiation try { audio->openStream(&sStreamParams, NULL, RTAUDIO_SINT16, sampleRate, &bufferSize, &fill_audio, (void *)this); } #endif catch (RtError &error) { error.printMessage(); return -1; } #ifndef WIN32 printf("Audio buffer: Wanted %d bytes, got %d\n", bufferSizeInWords / channels * 4, bufferSize * 4); #endif // If we got what we requested, return 0, // otherwise return the actual number of samples * number of channels return (bufferSizeInWords / channels == (signed)bufferSize) ? 0 : bufferSize * channels; } virtual mp_sint32 stop() { if (audio) { try { audio->stopStream(); deviceHasStarted = false; return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual mp_sint32 closeDevice() { if (audio) { try { audio->closeStream(); deviceHasStarted = false; return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual mp_sint32 start() { if (audio) { try { audio->startStream(); deviceHasStarted = true; return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual mp_sint32 pause() { if (audio) { try { audio->stopStream(); return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual mp_sint32 resume() { if (audio) { try { audio->startStream(); return 0; } catch (RtError &error) { error.printMessage(); return -1; } } else return -1; } virtual const char* getDriverID() { static const char* driverNames[] = { "Unspecified (RtAudio4)", "Alsa (RtAudio4)", "OSS (RtAudio4)", "Jack (RtAudio4)", "CoreAudio (RtAudio4)", "ASIO (RtAudio4)", "DirectSound (RtAudio4)", "Dummy (RtAudio4)" }; return driverNames[selectedAudioApi]; } }; void AudioDriver_RTAUDIO::createRt4Instance(Api audioApi/* = UNSPECIFIED*/) { RtAudio::Api rtApi = RtAudio::UNSPECIFIED; switch (audioApi) { case LINUX_ALSA: rtApi = RtAudio::LINUX_ALSA; break; case LINUX_OSS: rtApi = RtAudio::LINUX_OSS; break; case UNIX_JACK: rtApi = RtAudio::UNIX_JACK; break; case MACOSX_CORE: rtApi = RtAudio::MACOSX_CORE; break; case WINDOWS_ASIO: rtApi = RtAudio::WINDOWS_ASIO; break; case WINDOWS_DS: rtApi = RtAudio::WINDOWS_DS; break; case RTAUDIO_DUMMY: rtApi = RtAudio::RTAUDIO_DUMMY; break; } if (impl) delete impl; impl = new Rt4AudioDriverImpl(rtApi); } #else void AudioDriver_RTAUDIO::createRt4Instance(Api audioApi/* = UNSPECIFIED*/) { } #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/portaudio/0000755000175000017500000000000011317506072024327 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/portaudio/portaudio.h0000644000175000017500000012507611163403715026520 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 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 text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * Any person wishing to distribute modifications to the Software is * requested to send the modifications to the original developer so that * they can be incorporated into the canonical version. It is also * requested that these non-binding requests be included along with the * license above. */ /** @file @brief The PortAudio API. */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** Retrieve the release number of the currently running PortAudio build, eg 1900. */ int Pa_GetVersion( void ); /** Retrieve a textual description of the current PortAudio build, eg "PortAudio V19-devel 13 October 2002". */ const char* Pa_GetVersionText( void ); /** Error codes returned by PortAudio functions. Note that with the exception of paNoError, all PaErrorCodes are negative. */ typedef int PaError; typedef enum PaErrorCode { paNoError = 0, paNotInitialized = -10000, paUnanticipatedHostError, paInvalidChannelCount, paInvalidSampleRate, paInvalidDevice, paInvalidFlag, paSampleFormatNotSupported, paBadIODeviceCombination, paInsufficientMemory, paBufferTooBig, paBufferTooSmall, paNullCallback, paBadStreamPtr, paTimedOut, paInternalError, paDeviceUnavailable, paIncompatibleHostApiSpecificStreamInfo, paStreamIsStopped, paStreamIsNotStopped, paInputOverflowed, paOutputUnderflowed, paHostApiNotFound, paInvalidHostApi, paCanNotReadFromACallbackStream, /**< @todo review error code name */ paCanNotWriteToACallbackStream, /**< @todo review error code name */ paCanNotReadFromAnOutputOnlyStream, /**< @todo review error code name */ paCanNotWriteToAnInputOnlyStream, /**< @todo review error code name */ paIncompatibleStreamHostApi, paBadBufferPtr } PaErrorCode; /** Translate the supplied PortAudio error code into a human readable message. */ const char *Pa_GetErrorText( PaError errorCode ); /** Library initialization function - call this before using PortAudio. This function initialises internal data structures and prepares underlying host APIs for use. With the exception of Pa_GetVersion(), Pa_GetVersionText(), and Pa_GetErrorText(), this function MUST be called before using any other PortAudio API functions. If Pa_Initialize() is called multiple times, each successful call must be matched with a corresponding call to Pa_Terminate(). Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not required to be fully nested. Note that if Pa_Initialize() returns an error code, Pa_Terminate() should NOT be called. @return paNoError if successful, otherwise an error code indicating the cause of failure. @see Pa_Terminate */ PaError Pa_Initialize( void ); /** Library termination function - call this when finished using PortAudio. This function deallocates all resources allocated by PortAudio since it was initializied by a call to Pa_Initialize(). In cases where Pa_Initialise() has been called multiple times, each call must be matched with a corresponding call to Pa_Terminate(). The final matching call to Pa_Terminate() will automatically close any PortAudio streams that are still open. Pa_Terminate() MUST be called before exiting a program which uses PortAudio. Failure to do so may result in serious resource leaks, such as audio devices not being available until the next reboot. @return paNoError if successful, otherwise an error code indicating the cause of failure. @see Pa_Initialize */ PaError Pa_Terminate( void ); /** The type used to refer to audio devices. Values of this type usually range from 0 to (Pa_GetDeviceCount()-1), and may also take on the PaNoDevice and paUseHostApiSpecificDeviceSpecification values. @see Pa_GetDeviceCount, paNoDevice, paUseHostApiSpecificDeviceSpecification */ typedef int PaDeviceIndex; /** A special PaDeviceIndex value indicating that no device is available, or should be used. @see PaDeviceIndex */ #define paNoDevice ((PaDeviceIndex)-1) /** A special PaDeviceIndex value indicating that the device(s) to be used are specified in the host api specific stream info structure. @see PaDeviceIndex */ #define paUseHostApiSpecificDeviceSpecification ((PaDeviceIndex)-2) /* Host API enumeration mechanism */ /** The type used to enumerate to host APIs at runtime. Values of this type range from 0 to (Pa_GetHostApiCount()-1). @see Pa_GetHostApiCount */ typedef int PaHostApiIndex; /** Retrieve the number of available host APIs. Even if a host API is available it may have no devices available. @return A non-negative value indicating the number of available host APIs or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. @see PaHostApiIndex */ PaHostApiIndex Pa_GetHostApiCount( void ); /** Retrieve the index of the default host API. The default host API will be the lowest common denominator host API on the current platform and is unlikely to provide the best performance. @return A non-negative value ranging from 0 to (Pa_GetHostApiCount()-1) indicating the default host API index or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. */ PaHostApiIndex Pa_GetDefaultHostApi( void ); /** Unchanging unique identifiers for each supported host API. This type is used in the PaHostApiInfo structure. The values are guaranteed to be unique and to never change, thus allowing code to be written that conditionally uses host API specific extensions. New type ids will be allocated when support for a host API reaches "public alpha" status, prior to that developers should use the paInDevelopment type id. @see PaHostApiInfo */ typedef enum PaHostApiTypeId { paInDevelopment=0, /* use while developing support for a new host API */ paDirectSound=1, paMME=2, paASIO=3, paSoundManager=4, paCoreAudio=5, paOSS=7, paALSA=8, paAL=9, paBeOS=10, paWDMKS=11, paJACK=12, paWASAPI=13, paAudioScienceHPI=14 } PaHostApiTypeId; /** A structure containing information about a particular host API. */ typedef struct PaHostApiInfo { /** this is struct version 1 */ int structVersion; /** The well known unique identifier of this host API @see PaHostApiTypeId */ PaHostApiTypeId type; /** A textual description of the host API for display on user interfaces. */ const char *name; /** The number of devices belonging to this host API. This field may be used in conjunction with Pa_HostApiDeviceIndexToDeviceIndex() to enumerate all devices for this host API. @see Pa_HostApiDeviceIndexToDeviceIndex */ int deviceCount; /** The default input device for this host API. The value will be a device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice if no default input device is available. */ PaDeviceIndex defaultInputDevice; /** The default output device for this host API. The value will be a device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice if no default output device is available. */ PaDeviceIndex defaultOutputDevice; } PaHostApiInfo; /** Retrieve a pointer to a structure containing information about a specific host Api. @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1) @return A pointer to an immutable PaHostApiInfo structure describing a specific host API. If the hostApi parameter is out of range or an error is encountered, the function returns NULL. The returned structure is owned by the PortAudio implementation and must not be manipulated or freed. The pointer is only guaranteed to be valid between calls to Pa_Initialize() and Pa_Terminate(). */ const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi ); /** Convert a static host API unique identifier, into a runtime host API index. @param type A unique host API identifier belonging to the PaHostApiTypeId enumeration. @return A valid PaHostApiIndex ranging from 0 to (Pa_GetHostApiCount()-1) or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. The paHostApiNotFound error code indicates that the host API specified by the type parameter is not available. @see PaHostApiTypeId */ PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type ); /** Convert a host-API-specific device index to standard PortAudio device index. This function may be used in conjunction with the deviceCount field of PaHostApiInfo to enumerate all devices for the specified host API. @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1) @param hostApiDeviceIndex A valid per-host device index in the range 0 to (Pa_GetHostApiInfo(hostApi)->deviceCount-1) @return A non-negative PaDeviceIndex ranging from 0 to (Pa_GetDeviceCount()-1) or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. A paInvalidHostApi error code indicates that the host API index specified by the hostApi parameter is out of range. A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter is out of range. @see PaHostApiInfo */ PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi, int hostApiDeviceIndex ); /** Structure used to return information about a host error condition. */ typedef struct PaHostErrorInfo{ PaHostApiTypeId hostApiType; /**< the host API which returned the error code */ long errorCode; /**< the error code returned */ const char *errorText; /**< a textual description of the error if available, otherwise a zero-length string */ }PaHostErrorInfo; /** Return information about the last host error encountered. The error information returned by Pa_GetLastHostErrorInfo() will never be modified asyncronously by errors occurring in other PortAudio owned threads (such as the thread that manages the stream callback.) This function is provided as a last resort, primarily to enhance debugging by providing clients with access to all available error information. @return A pointer to an immutable structure constaining information about the host error. The values in this structure will only be valid if a PortAudio function has previously returned the paUnanticipatedHostError error code. */ const PaHostErrorInfo* Pa_GetLastHostErrorInfo( void ); /* Device enumeration and capabilities */ /** Retrieve the number of available devices. The number of available devices may be zero. @return A non-negative value indicating the number of available devices or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. */ PaDeviceIndex Pa_GetDeviceCount( void ); /** Retrieve the index of the default input device. The result can be used in the inputDevice parameter to Pa_OpenStream(). @return The default input device index for the default host API, or paNoDevice if no default input device is available or an error was encountered. */ PaDeviceIndex Pa_GetDefaultInputDevice( void ); /** Retrieve the index of the default output device. The result can be used in the outputDevice parameter to Pa_OpenStream(). @return The default output device index for the defualt host API, or paNoDevice if no default output device is available or an error was encountered. @note On the PC, the user can specify a default device by setting an environment variable. For example, to use device #1.
 set PA_RECOMMENDED_OUTPUT_DEVICE=1
The user should first determine the available device ids by using the supplied application "pa_devs". */ PaDeviceIndex Pa_GetDefaultOutputDevice( void ); /** The type used to represent monotonic time in seconds that can be used for syncronisation. The type is used for the outTime argument to the PaStreamCallback and as the result of Pa_GetStreamTime(). @see PaStreamCallback, Pa_GetStreamTime */ typedef double PaTime; /** A type used to specify one or more sample formats. Each value indicates a possible format for sound data passed to and from the stream callback, Pa_ReadStream and Pa_WriteStream. The standard formats paFloat32, paInt16, paInt32, paInt24, paInt8 and aUInt8 are usually implemented by all implementations. The floating point representation (paFloat32) uses +1.0 and -1.0 as the maximum and minimum respectively. paUInt8 is an unsigned 8 bit format where 128 is considered "ground" The paNonInterleaved flag indicates that a multichannel buffer is passed as a set of non-interleaved pointers. @see Pa_OpenStream, Pa_OpenDefaultStream, PaDeviceInfo @see paFloat32, paInt16, paInt32, paInt24, paInt8 @see paUInt8, paCustomFormat, paNonInterleaved */ typedef unsigned long PaSampleFormat; #define paFloat32 ((PaSampleFormat) 0x00000001) /**< @see PaSampleFormat */ #define paInt32 ((PaSampleFormat) 0x00000002) /**< @see PaSampleFormat */ #define paInt24 ((PaSampleFormat) 0x00000004) /**< Packed 24 bit format. @see PaSampleFormat */ #define paInt16 ((PaSampleFormat) 0x00000008) /**< @see PaSampleFormat */ #define paInt8 ((PaSampleFormat) 0x00000010) /**< @see PaSampleFormat */ #define paUInt8 ((PaSampleFormat) 0x00000020) /**< @see PaSampleFormat */ #define paCustomFormat ((PaSampleFormat) 0x00010000)/**< @see PaSampleFormat */ #define paNonInterleaved ((PaSampleFormat) 0x80000000) /** A structure providing information and capabilities of PortAudio devices. Devices may support input, output or both input and output. */ typedef struct PaDeviceInfo { int structVersion; /* this is struct version 2 */ const char *name; PaHostApiIndex hostApi; /* note this is a host API index, not a type id*/ int maxInputChannels; int maxOutputChannels; /* Default latency values for interactive performance. */ PaTime defaultLowInputLatency; PaTime defaultLowOutputLatency; /* Default latency values for robust non-interactive applications (eg. playing sound files). */ PaTime defaultHighInputLatency; PaTime defaultHighOutputLatency; double defaultSampleRate; } PaDeviceInfo; /** Retrieve a pointer to a PaDeviceInfo structure containing information about the specified device. @return A pointer to an immutable PaDeviceInfo structure. If the device parameter is out of range the function returns NULL. @param device A valid device index in the range 0 to (Pa_GetDeviceCount()-1) @note PortAudio manages the memory referenced by the returned pointer, the client must not manipulate or free the memory. The pointer is only guaranteed to be valid between calls to Pa_Initialize() and Pa_Terminate(). @see PaDeviceInfo, PaDeviceIndex */ const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device ); /** Parameters for one direction (input or output) of a stream. */ typedef struct PaStreamParameters { /** A valid device index in the range 0 to (Pa_GetDeviceCount()-1) specifying the device to be used or the special constant paUseHostApiSpecificDeviceSpecification which indicates that the actual device(s) to use are specified in hostApiSpecificStreamInfo. This field must not be set to paNoDevice. */ PaDeviceIndex device; /** The number of channels of sound to be delivered to the stream callback or accessed by Pa_ReadStream() or Pa_WriteStream(). It can range from 1 to the value of maxInputChannels in the PaDeviceInfo record for the device specified by the device parameter. */ int channelCount; /** The sample format of the buffer provided to the stream callback, a_ReadStream() or Pa_WriteStream(). It may be any of the formats described by the PaSampleFormat enumeration. */ PaSampleFormat sampleFormat; /** The desired latency in seconds. Where practical, implementations should configure their latency based on these parameters, otherwise they may choose the closest viable latency instead. Unless the suggested latency is greater than the absolute upper limit for the device implementations should round the suggestedLatency up to the next practial value - ie to provide an equal or higher latency than suggestedLatency wherever possibe. Actual latency values for an open stream may be retrieved using the inputLatency and outputLatency fields of the PaStreamInfo structure returned by Pa_GetStreamInfo(). @see default*Latency in PaDeviceInfo, *Latency in PaStreamInfo */ PaTime suggestedLatency; /** An optional pointer to a host api specific data structure containing additional information for device setup and/or stream processing. hostApiSpecificStreamInfo is never required for correct operation, if not used it should be set to NULL. */ void *hostApiSpecificStreamInfo; } PaStreamParameters; /** Return code for Pa_IsFormatSupported indicating success. */ #define paFormatIsSupported (0) /** Determine whether it would be possible to open a stream with the specified parameters. @param inputParameters A structure that describes the input parameters used to open a stream. The suggestedLatency field is ignored. See PaStreamParameters for a description of these parameters. inputParameters must be NULL for output-only streams. @param outputParameters A structure that describes the output parameters used to open a stream. The suggestedLatency field is ignored. See PaStreamParameters for a description of these parameters. outputParameters must be NULL for input-only streams. @param sampleRate The required sampleRate. For full-duplex streams it is the sample rate for both input and output @return Returns 0 if the format is supported, and an error code indicating why the format is not supported otherwise. The constant paFormatIsSupported is provided to compare with the return value for success. @see paFormatIsSupported, PaStreamParameters */ PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters, const PaStreamParameters *outputParameters, double sampleRate ); /* Streaming types and functions */ /** A single PaStream can provide multiple channels of real-time streaming audio input and output to a client application. A stream provides access to audio hardware represented by one or more PaDevices. Depending on the underlying Host API, it may be possible to open multiple streams using the same device, however this behavior is implementation defined. Portable applications should assume that a PaDevice may be simultaneously used by at most one PaStream. Pointers to PaStream objects are passed between PortAudio functions that operate on streams. @see Pa_OpenStream, Pa_OpenDefaultStream, Pa_OpenDefaultStream, Pa_CloseStream, Pa_StartStream, Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive, Pa_GetStreamTime, Pa_GetStreamCpuLoad */ typedef void PaStream; /** Can be passed as the framesPerBuffer parameter to Pa_OpenStream() or Pa_OpenDefaultStream() to indicate that the stream callback will accept buffers of any size. */ #define paFramesPerBufferUnspecified (0) /** Flags used to control the behavior of a stream. They are passed as parameters to Pa_OpenStream or Pa_OpenDefaultStream. Multiple flags may be ORed together. @see Pa_OpenStream, Pa_OpenDefaultStream @see paNoFlag, paClipOff, paDitherOff, paNeverDropInput, paPrimeOutputBuffersUsingStreamCallback, paPlatformSpecificFlags */ typedef unsigned long PaStreamFlags; /** @see PaStreamFlags */ #define paNoFlag ((PaStreamFlags) 0) /** Disable default clipping of out of range samples. @see PaStreamFlags */ #define paClipOff ((PaStreamFlags) 0x00000001) /** Disable default dithering. @see PaStreamFlags */ #define paDitherOff ((PaStreamFlags) 0x00000002) /** Flag requests that where possible a full duplex stream will not discard overflowed input samples without calling the stream callback. This flag is only valid for full duplex callback streams and only when used in combination with the paFramesPerBufferUnspecified (0) framesPerBuffer parameter. Using this flag incorrectly results in a paInvalidFlag error being returned from Pa_OpenStream and Pa_OpenDefaultStream. @see PaStreamFlags, paFramesPerBufferUnspecified */ #define paNeverDropInput ((PaStreamFlags) 0x00000004) /** Call the stream callback to fill initial output buffers, rather than the default behavior of priming the buffers with zeros (silence). This flag has no effect for input-only and blocking read/write streams. @see PaStreamFlags */ #define paPrimeOutputBuffersUsingStreamCallback ((PaStreamFlags) 0x00000008) /** A mask specifying the platform specific bits. @see PaStreamFlags */ #define paPlatformSpecificFlags ((PaStreamFlags)0xFFFF0000) /** Timing information for the buffers passed to the stream callback. */ typedef struct PaStreamCallbackTimeInfo{ PaTime inputBufferAdcTime; PaTime currentTime; PaTime outputBufferDacTime; } PaStreamCallbackTimeInfo; /** Flag bit constants for the statusFlags to PaStreamCallback. @see paInputUnderflow, paInputOverflow, paOutputUnderflow, paOutputOverflow, paPrimingOutput */ typedef unsigned long PaStreamCallbackFlags; /** In a stream opened with paFramesPerBufferUnspecified, indicates that input data is all silence (zeros) because no real data is available. In a stream opened without paFramesPerBufferUnspecified, it indicates that one or more zero samples have been inserted into the input buffer to compensate for an input underflow. @see PaStreamCallbackFlags */ #define paInputUnderflow ((PaStreamCallbackFlags) 0x00000001) /** In a stream opened with paFramesPerBufferUnspecified, indicates that data prior to the first sample of the input buffer was discarded due to an overflow, possibly because the stream callback is using too much CPU time. Otherwise indicates that data prior to one or more samples in the input buffer was discarded. @see PaStreamCallbackFlags */ #define paInputOverflow ((PaStreamCallbackFlags) 0x00000002) /** Indicates that output data (or a gap) was inserted, possibly because the stream callback is using too much CPU time. @see PaStreamCallbackFlags */ #define paOutputUnderflow ((PaStreamCallbackFlags) 0x00000004) /** Indicates that output data will be discarded because no room is available. @see PaStreamCallbackFlags */ #define paOutputOverflow ((PaStreamCallbackFlags) 0x00000008) /** Some of all of the output data will be used to prime the stream, input data may be zero. @see PaStreamCallbackFlags */ #define paPrimingOutput ((PaStreamCallbackFlags) 0x00000010) /** Allowable return values for the PaStreamCallback. @see PaStreamCallback */ typedef enum PaStreamCallbackResult { paContinue=0, paComplete=1, paAbort=2 } PaStreamCallbackResult; /** Functions of type PaStreamCallback are implemented by PortAudio clients. They consume, process or generate audio in response to requests from an active PortAudio stream. @param input and @param output are arrays of interleaved samples, the format, packing and number of channels used by the buffers are determined by parameters to Pa_OpenStream(). @param frameCount The number of sample frames to be processed by the stream callback. @param timeInfo The time in seconds when the first sample of the input buffer was received at the audio input, the time in seconds when the first sample of the output buffer will begin being played at the audio output, and the time in seconds when the stream callback was called. See also Pa_GetStreamTime() @param statusFlags Flags indicating whether input and/or output buffers have been inserted or will be dropped to overcome underflow or overflow conditions. @param userData The value of a user supplied pointer passed to Pa_OpenStream() intended for storing synthesis data etc. @return The stream callback should return one of the values in the PaStreamCallbackResult enumeration. To ensure that the callback continues to be called, it should return paContinue (0). Either paComplete or paAbort can be returned to finish stream processing, after either of these values is returned the callback will not be called again. If paAbort is returned the stream will finish as soon as possible. If paComplete is returned, the stream will continue until all buffers generated by the callback have been played. This may be useful in applications such as soundfile players where a specific duration of output is required. However, it is not necessary to utilise this mechanism as Pa_StopStream(), Pa_AbortStream() or Pa_CloseStream() can also be used to stop the stream. The callback must always fill the entire output buffer irrespective of its return value. @see Pa_OpenStream, Pa_OpenDefaultStream @note With the exception of Pa_GetStreamCpuLoad() it is not permissable to call PortAudio API functions from within the stream callback. */ typedef int PaStreamCallback( const void *input, void *output, unsigned long frameCount, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData ); /** Opens a stream for either input, output or both. @param stream The address of a PaStream pointer which will receive a pointer to the newly opened stream. @param inputParameters A structure that describes the input parameters used by the opened stream. See PaStreamParameters for a description of these parameters. inputParameters must be NULL for output-only streams. @param outputParameters A structure that describes the output parameters used by the opened stream. See PaStreamParameters for a description of these parameters. outputParameters must be NULL for input-only streams. @param sampleRate The desired sampleRate. For full-duplex streams it is the sample rate for both input and output @param framesPerBuffer The number of frames passed to the stream callback function, or the preferred block granularity for a blocking read/write stream. The special value paFramesPerBufferUnspecified (0) may be used to request that the stream callback will recieve an optimal (and possibly varying) number of frames based on host requirements and the requested latency settings. Note: With some host APIs, the use of non-zero framesPerBuffer for a callback stream may introduce an additional layer of buffering which could introduce additional latency. PortAudio guarantees that the additional latency will be kept to the theoretical minimum however, it is strongly recommended that a non-zero framesPerBuffer value only be used when your algorithm requires a fixed number of frames per stream callback. @param streamFlags Flags which modify the behaviour of the streaming process. This parameter may contain a combination of flags ORed together. Some flags may only be relevant to certain buffer formats. @param streamCallback A pointer to a client supplied function that is responsible for processing and filling input and output buffers. If this parameter is NULL the stream will be opened in 'blocking read/write' mode. In blocking mode, the client can receive sample data using Pa_ReadStream and write sample data using Pa_WriteStream, the number of samples that may be read or written without blocking is returned by Pa_GetStreamReadAvailable and Pa_GetStreamWriteAvailable respectively. @param userData A client supplied pointer which is passed to the stream callback function. It could for example, contain a pointer to instance data necessary for processing the audio buffers. This parameter is ignored if streamCallback is NULL. @return Upon success Pa_OpenStream() returns paNoError and places a pointer to a valid PaStream in the stream argument. The stream is inactive (stopped). If a call to Pa_OpenStream() fails, a non-zero error code is returned (see PaError for possible error codes) and the value of stream is invalid. @see PaStreamParameters, PaStreamCallback, Pa_ReadStream, Pa_WriteStream, Pa_GetStreamReadAvailable, Pa_GetStreamWriteAvailable */ PaError Pa_OpenStream( PaStream** stream, const PaStreamParameters *inputParameters, const PaStreamParameters *outputParameters, double sampleRate, unsigned long framesPerBuffer, PaStreamFlags streamFlags, PaStreamCallback *streamCallback, void *userData ); /** A simplified version of Pa_OpenStream() that opens the default input and/or output devices. @param stream The address of a PaStream pointer which will receive a pointer to the newly opened stream. @param numInputChannels The number of channels of sound that will be supplied to the stream callback or returned by Pa_ReadStream. It can range from 1 to the value of maxInputChannels in the PaDeviceInfo record for the default input device. If 0 the stream is opened as an output-only stream. @param numOutputChannels The number of channels of sound to be delivered to the stream callback or passed to Pa_WriteStream. It can range from 1 to the value of maxOutputChannels in the PaDeviceInfo record for the default output dvice. If 0 the stream is opened as an output-only stream. @param sampleFormat The sample format of both the input and output buffers provided to the callback or passed to and from Pa_ReadStream and Pa_WriteStream. sampleFormat may be any of the formats described by the PaSampleFormat enumeration. @param sampleRate Same as Pa_OpenStream parameter of the same name. @param framesPerBuffer Same as Pa_OpenStream parameter of the same name. @param streamCallback Same as Pa_OpenStream parameter of the same name. @param userData Same as Pa_OpenStream parameter of the same name. @return As for Pa_OpenStream @see Pa_OpenStream, PaStreamCallback */ PaError Pa_OpenDefaultStream( PaStream** stream, int numInputChannels, int numOutputChannels, PaSampleFormat sampleFormat, double sampleRate, unsigned long framesPerBuffer, PaStreamCallback *streamCallback, void *userData ); /** Closes an audio stream. If the audio stream is active it discards any pending buffers as if Pa_AbortStream() had been called. */ PaError Pa_CloseStream( PaStream *stream ); /** Functions of type PaStreamFinishedCallback are implemented by PortAudio clients. They can be registered with a stream using the Pa_SetStreamFinishedCallback function. Once registered they are called when the stream becomes inactive (ie once a call to Pa_StopStream() will not block). A stream will become inactive after the stream callback returns non-zero, or when Pa_StopStream or Pa_AbortStream is called. For a stream providing audio output, if the stream callback returns paComplete, or Pa_StopStream is called, the stream finished callback will not be called until all generated sample data has been played. @param userData The userData parameter supplied to Pa_OpenStream() @see Pa_SetStreamFinishedCallback */ typedef void PaStreamFinishedCallback( void *userData ); /** Register a stream finished callback function which will be called when the stream becomes inactive. See the description of PaStreamFinishedCallback for further details about when the callback will be called. @param stream a pointer to a PaStream that is in the stopped state - if the stream is not stopped, the stream's finished callback will remain unchanged and an error code will be returned. @param streamFinishedCallback a pointer to a function with the same signature as PaStreamFinishedCallback, that will be called when the stream becomes inactive. Passing NULL for this parameter will un-register a previously registered stream finished callback function. @return on success returns paNoError, otherwise an error code indicating the cause of the error. @see PaStreamFinishedCallback */ PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); /** Commences audio processing. */ PaError Pa_StartStream( PaStream *stream ); /** Terminates audio processing. It waits until all pending audio buffers have been played before it returns. */ PaError Pa_StopStream( PaStream *stream ); /** Terminates audio processing immediately without waiting for pending buffers to complete. */ PaError Pa_AbortStream( PaStream *stream ); /** Determine whether the stream is stopped. A stream is considered to be stopped prior to a successful call to Pa_StartStream and after a successful call to Pa_StopStream or Pa_AbortStream. If a stream callback returns a value other than paContinue the stream is NOT considered to be stopped. @return Returns one (1) when the stream is stopped, zero (0) when the stream is running or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive */ PaError Pa_IsStreamStopped( PaStream *stream ); /** Determine whether the stream is active. A stream is active after a successful call to Pa_StartStream(), until it becomes inactive either as a result of a call to Pa_StopStream() or Pa_AbortStream(), or as a result of a return value other than paContinue from the stream callback. In the latter case, the stream is considered inactive after the last buffer has finished playing. @return Returns one (1) when the stream is active (ie playing or recording audio), zero (0) when not playing or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamStopped */ PaError Pa_IsStreamActive( PaStream *stream ); /** A structure containing unchanging information about an open stream. @see Pa_GetStreamInfo */ typedef struct PaStreamInfo { /** this is struct version 1 */ int structVersion; /** The input latency of the stream in seconds. This value provides the most accurate estimate of input latency available to the implementation. It may differ significantly from the suggestedLatency value passed to Pa_OpenStream(). The value of this field will be zero (0.) for output-only streams. @see PaTime */ PaTime inputLatency; /** The output latency of the stream in seconds. This value provides the most accurate estimate of output latency available to the implementation. It may differ significantly from the suggestedLatency value passed to Pa_OpenStream(). The value of this field will be zero (0.) for input-only streams. @see PaTime */ PaTime outputLatency; /** The sample rate of the stream in Hertz (samples per second). In cases where the hardware sample rate is inaccurate and PortAudio is aware of it, the value of this field may be different from the sampleRate parameter passed to Pa_OpenStream(). If information about the actual hardware sample rate is not available, this field will have the same value as the sampleRate parameter passed to Pa_OpenStream(). */ double sampleRate; } PaStreamInfo; /** Retrieve a pointer to a PaStreamInfo structure containing information about the specified stream. @return A pointer to an immutable PaStreamInfo structure. If the stream parameter invalid, or an error is encountered, the function returns NULL. @param stream A pointer to an open stream previously created with Pa_OpenStream. @note PortAudio manages the memory referenced by the returned pointer, the client must not manipulate or free the memory. The pointer is only guaranteed to be valid until the specified stream is closed. @see PaStreamInfo */ const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream ); /** Determine the current time for the stream according to the same clock used to generate buffer timestamps. This time may be used for syncronising other events to the audio stream, for example synchronizing audio to MIDI. @return The stream's current time in seconds, or 0 if an error occurred. @see PaTime, PaStreamCallback */ PaTime Pa_GetStreamTime( PaStream *stream ); /** Retrieve CPU usage information for the specified stream. The "CPU Load" is a fraction of total CPU time consumed by a callback stream's audio processing routines including, but not limited to the client supplied stream callback. This function does not work with blocking read/write streams. This function may be called from the stream callback function or the application. @return A floating point value, typically between 0.0 and 1.0, where 1.0 indicates that the stream callback is consuming the maximum number of CPU cycles possible to maintain real-time operation. A value of 0.5 would imply that PortAudio and the stream callback was consuming roughly 50% of the available CPU time. The return value may exceed 1.0. A value of 0.0 will always be returned for a blocking read/write stream, or if an error occurrs. */ double Pa_GetStreamCpuLoad( PaStream* stream ); /** Read samples from an input stream. The function doesn't return until the entire buffer has been filled - this may involve waiting for the operating system to supply the data. @param stream A pointer to an open stream previously created with Pa_OpenStream. @param buffer A pointer to a buffer of sample frames. The buffer contains samples in the format specified by the inputParameters->sampleFormat field used to open the stream, and the number of channels specified by inputParameters->numChannels. If non-interleaved samples were requested, buffer is a pointer to the first element of an array of non-interleaved buffer pointers, one for each channel. @param frames The number of frames to be read into buffer. This parameter is not constrained to a specific range, however high performance applications will want to match this parameter to the framesPerBuffer parameter used when opening the stream. @return On success PaNoError will be returned, or PaInputOverflowed if input data was discarded by PortAudio after the previous call and before this call. */ PaError Pa_ReadStream( PaStream* stream, void *buffer, unsigned long frames ); /** Write samples to an output stream. This function doesn't return until the entire buffer has been consumed - this may involve waiting for the operating system to consume the data. @param stream A pointer to an open stream previously created with Pa_OpenStream. @param buffer A pointer to a buffer of sample frames. The buffer contains samples in the format specified by the outputParameters->sampleFormat field used to open the stream, and the number of channels specified by outputParameters->numChannels. If non-interleaved samples were requested, buffer is a pointer to the first element of an array of non-interleaved buffer pointers, one for each channel. @param frames The number of frames to be written from buffer. This parameter is not constrained to a specific range, however high performance applications will want to match this parameter to the framesPerBuffer parameter used when opening the stream. @return On success PaNoError will be returned, or paOutputUnderflowed if additional output data was inserted after the previous call and before this call. */ PaError Pa_WriteStream( PaStream* stream, const void *buffer, unsigned long frames ); /** Retrieve the number of frames that can be read from the stream without waiting. @return Returns a non-negative value representing the maximum number of frames that can be read from the stream without blocking or busy waiting or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. */ signed long Pa_GetStreamReadAvailable( PaStream* stream ); /** Retrieve the number of frames that can be written to the stream without waiting. @return Returns a non-negative value representing the maximum number of frames that can be written to the stream without blocking or busy waiting or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. */ signed long Pa_GetStreamWriteAvailable( PaStream* stream ); /* Miscellaneous utilities */ /** Retrieve the size of a given sample format in bytes. @return The size in bytes of a single sample in the specified format, or paSampleFormatNotSupported if the format is not supported. */ PaError Pa_GetSampleSize( PaSampleFormat format ); /** Put the caller to sleep for at least 'msec' milliseconds. This function is provided only as a convenience for authors of portable code (such as the tests and examples in the PortAudio distribution.) The function may sleep longer than requested so don't rely on this for accurate musical timing. */ void Pa_Sleep( long msec ); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* PORTAUDIO_H */ milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/AudioDriver_RTAUDIO.h0000644000175000017500000000637211315741615026110 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_RTAUDIO.h * MilkyPlay * * Created by Peter Barth on 09.06.05. * */ #ifndef __AUDIODRIVER_RTAUDIO_H__ #define __AUDIODRIVER_RTAUDIO_H__ #include "AudioDriver_COMPENSATE.h" class AudioDriver_RTAUDIO : public AudioDriverInterface { private: AudioDriverInterface* impl; public: enum Api { UNSPECIFIED, /*!< Search for a working compiled API. */ LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ LINUX_OSS, /*!< The Linux Open Sound System API. */ UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ }; AudioDriver_RTAUDIO(Api audioApi = UNSPECIFIED); virtual ~AudioDriver_RTAUDIO(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_uint32 getMixFrequency() const; virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual mp_uint32 getNumPlayedSamples() const; virtual mp_uint32 getBufferPos() const; virtual bool supportsTimeQuery(); virtual const char* getDriverID(); virtual void advance(); virtual mp_sint32 getPreferredSampleRate() const; virtual mp_sint32 getPreferredBufferSize() const; virtual void msleep(mp_uint32 msecs); virtual bool isMixerActive(); virtual void setIdle(bool idle); void createRt4Instance(Api audioApi = UNSPECIFIED); void createRt3Instance(Api audioApi = UNSPECIFIED); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/AudioDriver_PORTAUDIO.cpp0000644000175000017500000001234511163403715026674 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_PORTAUDIO.cpp * SDL Audio * * Created by Peter Barth on 09.06.05. * * Christopher O'Neill 16/3/06: * fill_audio() rewritten to solve issues on certain systems * * */ #include "AudioDriver_PORTAUDIO.h" const char* AudioDriver_PORTAUDIO::driverNames[] = { "WASAPI (PortAudio)" }; int AudioDriver_PORTAUDIO::refCount = 0; int AudioDriver_PORTAUDIO::patestCallback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData ) { framesPerBuffer<<=2; AudioDriver_PORTAUDIO* audioDriver = (AudioDriver_PORTAUDIO*)userData; // Base class can handle this audioDriver->fillAudioWithCompensation((char*)outputBuffer, framesPerBuffer); return paContinue; } AudioDriver_PORTAUDIO::AudioDriver_PORTAUDIO() : AudioDriver_COMPENSATE(), stream(NULL) { if (++refCount == 1) Pa_Initialize(); } AudioDriver_PORTAUDIO::~AudioDriver_PORTAUDIO() { if (stream) closeDevice(); if (--refCount == 0) Pa_Terminate(); } // On error return a negative value // If the requested buffer size can be served return 0, // otherwise return the number of 16 bit words contained in the obtained buffer mp_sint32 AudioDriver_PORTAUDIO::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; int channels = 2; int sampleRate = mixFrequency; int bufferSize = bufferSizeInWords / channels; PaStreamParameters outputParameters; PaError err; //printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); err = Pa_Initialize(); if( err != paNoError ) return -1; outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ outputParameters.channelCount = channels; /* stereo output */ outputParameters.sampleFormat = paInt16; /* 32 bit floating point output */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; err = Pa_OpenStream( &stream, NULL, /* no input */ &outputParameters, sampleRate, bufferSize, paClipOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, this); if( err != paNoError ) return -1; #ifndef WIN32 printf("Audio buffer: Wanted %d bytes, got %d\n", bufferSizeInWords / channels * 4, bufferSize * 4); #endif // If we got what we requested, return 0, // otherwise return the actual number of samples * number of channels return (bufferSizeInWords / channels == bufferSize) ? 0 : bufferSize * channels; } mp_sint32 AudioDriver_PORTAUDIO::stop() { PaError err = Pa_StopStream( stream ); if( err != paNoError ) return -1; deviceHasStarted = false; return 0; } mp_sint32 AudioDriver_PORTAUDIO::closeDevice() { if (deviceHasStarted) stop(); //Pa_Sleep(1000); PaError err = Pa_CloseStream( stream ); if( err != paNoError ) return -1; stream = NULL; //Pa_Sleep(1000); return 0; } mp_sint32 AudioDriver_PORTAUDIO::start() { // hopefully this works // no error checking performed PaError err = Pa_StartStream( stream ); if (err != paNoError) { deviceHasStarted = false; return -1; } deviceHasStarted = true; return 0; } mp_sint32 AudioDriver_PORTAUDIO::pause() { return 0; } mp_sint32 AudioDriver_PORTAUDIO::resume() { return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/AudioDriver_PORTAUDIO.h0000644000175000017500000000523111163403715026335 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_PORTAUDIO.h * SDL Audio * * Created by Peter Barth on 09.06.05. * */ #ifndef __AUDIODRIVER_PORTAUDIO_H__ #define __AUDIODRIVER_PORTAUDIO_H__ #include "portaudio.h" #include "AudioDriver_COMPENSATE.h" class AudioDriver_PORTAUDIO : public AudioDriver_COMPENSATE { private: static const char* driverNames[]; static int refCount; static int patestCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData); PaStream* stream; public: AudioDriver_PORTAUDIO(); virtual ~AudioDriver_PORTAUDIO(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual const char* getDriverID() { return driverNames[0]; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/generic/AudioDriver_RTAUDIO.cpp0000644000175000017500000000674211315741615026444 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_RTAUDIO.cpp * MilkyPlay * * Created by Peter Barth on 09.06.05. * * Christopher O'Neill 16/3/06: * fill_audio() rewritten to solve issues on certain systems * * */ #include "AudioDriver_RTAUDIO.h" AudioDriver_RTAUDIO::AudioDriver_RTAUDIO(Api audioApi/* = UNSPECIFIED*/) : impl(0) { #ifdef __OSX_PANTHER__ createRt3Instance(audioApi); #else createRt4Instance(audioApi); #endif } AudioDriver_RTAUDIO::~AudioDriver_RTAUDIO() { delete impl; } mp_sint32 AudioDriver_RTAUDIO::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { return impl->initDevice(bufferSizeInWords, mixFrequency, mixer); } mp_uint32 AudioDriver_RTAUDIO::getMixFrequency() const { return impl->getMixFrequency(); } mp_sint32 AudioDriver_RTAUDIO::closeDevice() { return impl->closeDevice(); } mp_sint32 AudioDriver_RTAUDIO::start() { return impl->start(); } mp_sint32 AudioDriver_RTAUDIO::stop() { return impl->stop(); } mp_sint32 AudioDriver_RTAUDIO::pause() { return impl->pause(); } mp_sint32 AudioDriver_RTAUDIO::resume() { return impl->resume(); } mp_uint32 AudioDriver_RTAUDIO::getNumPlayedSamples() const { return impl->getNumPlayedSamples(); } mp_uint32 AudioDriver_RTAUDIO::getBufferPos() const { return impl->getBufferPos(); } bool AudioDriver_RTAUDIO::supportsTimeQuery() { return impl->supportsTimeQuery(); } const char* AudioDriver_RTAUDIO::getDriverID() { return impl->getDriverID(); } void AudioDriver_RTAUDIO::advance() { impl->advance(); } mp_sint32 AudioDriver_RTAUDIO::getPreferredSampleRate() const { return impl->getPreferredSampleRate(); } mp_sint32 AudioDriver_RTAUDIO::getPreferredBufferSize() const { return impl->getPreferredBufferSize(); } void AudioDriver_RTAUDIO::msleep(mp_uint32 msecs) { impl->msleep(msecs); } bool AudioDriver_RTAUDIO::isMixerActive() { return impl->isMixerActive(); } void AudioDriver_RTAUDIO::setIdle(bool idle) { impl->setIdle(idle); } milkytracker-0.90.85+dfsg/src/milkyplay/drivers/windows/0000755000175000017500000000000011317506072022377 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/windows/AudioDriver_MMSYSTEM.cpp0000644000175000017500000002157511163403715026667 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_MMSYSTEM.cpp * MilkyPlay audiodriver * * Sorry this is unfinished... (hacked) */ #include "AudioDriver_MMSYSTEM.h" #include "MasterMixer.h" // some more formats #define WAVE_FORMAT_48S16 0x00008000 /* 48 kHz, Stereo, 16-bit */ // hack trying to prevent AudioDriver_MMSYSTEM::waveOutProc to be called after device has been closed static bool deviceOpen = false; void CALLBACK AudioDriver_MMSYSTEM::waveOutProc(HWAVEOUT hwo,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2) { if (uMsg==MM_WOM_DONE && deviceOpen) { LPWAVEHDR wavhdr = (LPWAVEHDR)dwParam1; ::waveOutUnprepareHeader(hwo,wavhdr,sizeof(WAVEHDR)); AudioDriver_MMSYSTEM* audioDriver = (AudioDriver_MMSYSTEM*)dwInstance; if (!audioDriver->deviceHasStarted) return; EnterCriticalSection(&audioDriver->cs); MasterMixer* mixer = audioDriver->mixer; audioDriver->sampleCounterTotal+=audioDriver->bufferSize>>1; if (audioDriver->timeEmulation) { audioDriver->sampleCounter+=audioDriver->bufferSize>>1; audioDriver->timeInSamples = audioDriver->sampleCounter; } audioDriver->kick(); LeaveCriticalSection(&audioDriver->cs); } } AudioDriver_MMSYSTEM::AudioDriver_MMSYSTEM(bool timeEmulation/* = false*/) : AudioDriverBase(), paused(false), deviceHasStarted(false), currentBufferIndex(0), sampleCounterTotal(0), timeEmulation(timeEmulation) { memset(&mixbuff16, 0, sizeof(mixbuff16)); memset(&wavhdr, 0, sizeof(wavhdr)); InitializeCriticalSection(&cs); } AudioDriver_MMSYSTEM::~AudioDriver_MMSYSTEM() { if (deviceHasStarted) stop(); for (mp_sint32 c = 0; c < NUMBUFFERS; c++) { if (mixbuff16[NUMBUFFERS-1-c]) delete[] mixbuff16[NUMBUFFERS-1-c]; } DeleteCriticalSection(&cs); } mp_sint32 AudioDriver_MMSYSTEM::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* pMixer) { mp_sint32 res = AudioDriverBase::initDevice(bufferSizeInWords, mixFrequency, pMixer); if (res != 0) return res; sampleRate = mixFrequency; mp_uint32 supportedFormats[] = {WAVE_FORMAT_48S16,48000, WAVE_FORMAT_4S16,44100, WAVE_FORMAT_2S16,22050, WAVE_FORMAT_1S16,11025}; bool modeFound = false; DWORD dwFormat = 0; for (mp_uint32 i = 0; i < sizeof(supportedFormats)>>1; i++) { if (supportedFormats[i*2+1] == mixFrequency) { dwFormat = supportedFormats[i*2]; modeFound = TRUE; break; } } if (!modeFound) return -4; WAVEFORMATEX format; format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = NUMCHANNELS; format.nSamplesPerSec = mixFrequency; format.wBitsPerSample = NUMBITS; format.nAvgBytesPerSec = (format.nChannels*format.nSamplesPerSec*format.wBitsPerSample)/8; format.nBlockAlign = (format.nChannels*format.wBitsPerSample)/8; format.cbSize=0; // Find a usable waveOut device and open it for (UINT devid = 0; devid < ::waveOutGetNumDevs(); devid++) { if (devid == ::waveOutGetNumDevs()) { return -1; } if (::waveOutOpen(&hwo, WAVE_MAPPER, &format, 0, 0, CALLBACK_NULL) == MMSYSERR_NOERROR) { // Usable device found, stop searching break; } } UINT waveOutID; if (::waveOutGetID(hwo,(LPUINT)&waveOutID) != MMSYSERR_NOERROR) { return -2; } MMRESULT r = ::waveOutGetDevCaps((UINT)waveOutID, &waveoutcaps, sizeof(waveoutcaps)); if (r != MMSYSERR_NOERROR) { return -3; } if (!(waveoutcaps.dwFormats & dwFormat)) { return -4; } ::waveOutReset(hwo); if (::waveOutClose(hwo)!= MMSYSERR_NOERROR) { return -5; } if (::waveOutOpen(&hwo, WAVE_MAPPER, &format, (LONG)&waveOutProc, (LONG)this, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) { return -6; } lastSampleIndex = 0; for (mp_sint32 c = 0; c < NUMBUFFERS; c++) { delete[] mixbuff16[c]; // cope with out of memory someday mixbuff16[c] = new mp_sword[bufferSizeInWords]; } deviceOpen = true; deviceHasStarted = false; sampleCounterTotal = 0; return 0; } mp_sint32 AudioDriver_MMSYSTEM::stop() { if (!deviceHasStarted) return 0; bool resetVolume = false; DWORD dwVol; if (paused) { ::waveOutGetVolume(hwo, &dwVol); ::waveOutSetVolume(hwo, 0); resetVolume = true; resume(); } // wait for buffers to be played deviceHasStarted = false; // wait at least 2 seconds const mp_sint32 timeOutVal = 2000; mp_sint32 timeCounter = 0; const mp_sint32 waitTime = 60; while (true/* && timeCounter < timeOutVal*/) { bool notDone = false; for (mp_sint32 i = 0; i < NUMBUFFERS; i++) { if (! (wavhdr[i].dwFlags & WHDR_DONE)) { notDone = TRUE; break; } } //timeCounter+=waitTime; ::Sleep(waitTime); if (!notDone) break; } for (mp_sint32 i = 0; i < NUMBUFFERS; i++) { if (wavhdr[i].dwFlags & WHDR_PREPARED) { ::waveOutUnprepareHeader(hwo,&wavhdr[i],sizeof(WAVEHDR)); wavhdr[i].dwFlags &= ~WHDR_PREPARED; break; } } // reset device ::waveOutReset(hwo); if (resetVolume) ::waveOutSetVolume(hwo, dwVol); lastSampleIndex = 0; sampleCounterTotal = 0; return 0; } mp_sint32 AudioDriver_MMSYSTEM::closeDevice() { deviceOpen = false; if (::waveOutClose(hwo)!=MMSYSERR_NOERROR) { return -5; } return 0; } void AudioDriver_MMSYSTEM::kick() { if (isMixerActive()) mixer->mixerHandler(mixbuff16[currentBufferIndex]); else memset(mixbuff16[currentBufferIndex], 0, bufferSize*sizeof(mp_sword)); wavhdr[currentBufferIndex].lpData = (char*)mixbuff16[currentBufferIndex]; wavhdr[currentBufferIndex].dwBufferLength = (bufferSize*NUMBITS)/8; wavhdr[currentBufferIndex].dwFlags = 0; wavhdr[currentBufferIndex].dwLoops = 0; wavhdr[currentBufferIndex].dwUser = (DWORD)mixbuff16[currentBufferIndex]; if (::waveOutPrepareHeader(hwo,&wavhdr[currentBufferIndex],sizeof(WAVEHDR)) != MMSYSERR_NOERROR) return; if (::waveOutWrite(hwo,&wavhdr[currentBufferIndex],sizeof(WAVEHDR)) != MMSYSERR_NOERROR) return; currentBufferIndex = (currentBufferIndex+1) % NUMBUFFERS; } mp_sint32 AudioDriver_MMSYSTEM::start() { deviceHasStarted = true; for (int i = 0; i < NUMBUFFERS; i++) { kick(); } sampleCounterTotal = 0; if (timeEmulation) { lastTimeInMillis = ::GetTickCount(); timeInSamples = sampleCounter = 0; } return 0; } mp_sint32 AudioDriver_MMSYSTEM::pause() { ::waveOutPause(hwo); paused = true; return 0; } mp_sint32 AudioDriver_MMSYSTEM::resume() { ::waveOutRestart(hwo); paused = false; return 0; } mp_uint32 AudioDriver_MMSYSTEM::getNumPlayedSamples() const { if (timeEmulation) { EnterCriticalSection(&cs); mp_uint32 currentMillis = ::GetTickCount(); this->timeInSamples+=(mp_uint32)((float)(currentMillis - lastTimeInMillis) * (sampleRate / 1000.0f)); lastTimeInMillis = currentMillis; LeaveCriticalSection(&cs); return timeInSamples; } else { EnterCriticalSection(&cs); MMTIME mmtime; mmtime.wType = TIME_SAMPLES; if (::waveOutGetPosition(hwo,&mmtime,sizeof(mmtime)) == MMSYSERR_NOERROR) { if (mmtime.u.sample > lastSampleIndex) lastSampleIndex = mmtime.u.sample; LeaveCriticalSection(&cs); return lastSampleIndex; } LeaveCriticalSection(&cs); return lastSampleIndex; } } mp_uint32 AudioDriver_MMSYSTEM::getBufferPos() const { mp_sint32 smpPos = (mp_sint32)getNumPlayedSamples() - (mp_sint32)sampleCounterTotal; mp_sint32 maxSize = bufferSize >> 1; if (smpPos < 0) smpPos = 0; if (smpPos > maxSize) smpPos = maxSize; return smpPos; } milkytracker-0.90.85+dfsg/src/milkyplay/drivers/windows/AudioDriver_MMSYSTEM.h0000644000175000017500000000655511163403715026335 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_MMSYSTEM.h * MilkyPlay core * * Created by Peter Barth on Fri Sep 10 2004. * */ #ifndef __AUDIODRIVER_MMSYSTEM_H__ #define __AUDIODRIVER_MMSYSTEM_H__ #include #ifndef _WIN32_WCE #include #endif #include "AudioDriverBase.h" class AudioDriver_MMSYSTEM : public AudioDriverBase { private: enum { // WAV Header & mixing buffer info NUMCHANNELS = MP_NUMCHANNELS, NUMBITS = MP_NUMBITS, NUMBYTES = MP_NUMBYTES, NUMBUFFERS = 2 }; bool paused; bool deviceHasStarted; HWAVEOUT hwo; WAVEOUTCAPS waveoutcaps; WAVEHDR wavhdr[NUMBUFFERS]; mp_sword* mixbuff16[NUMBUFFERS]; mp_sint32 currentBufferIndex; mp_uint32 sampleCounterTotal; bool timeEmulation; mp_uint32 sampleRate; mutable mp_uint32 lastSampleIndex; mutable mp_uint32 lastTimeInMillis; mutable mp_uint32 timeInSamples; mutable mp_uint32 sampleCounter; mutable CRITICAL_SECTION cs; static void CALLBACK waveOutProc(HWAVEOUT hwo,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2); void kick(); public: AudioDriver_MMSYSTEM(bool timeEmulation = false); virtual ~AudioDriver_MMSYSTEM(); virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual mp_uint32 getNumPlayedSamples() const; virtual mp_uint32 getBufferPos() const; virtual bool supportsTimeQuery() { return true; } virtual const char* getDriverID() { return timeEmulation ? "WaveOut (Vista)" : "WaveOut (old)"; } virtual mp_sint32 getPreferredSampleRate() const { return 44100; } virtual mp_sint32 getPreferredBufferSize() const { return 8192; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/alsa/0000755000175000017500000000000011317506071021624 5ustar admin2admin2milkytracker-0.90.85+dfsg/src/milkyplay/drivers/alsa/AudioDriver_ALSA.cpp0000644000175000017500000002014011315767511025350 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_ALSA.cpp * ALSA Audio * * Created by Christopher O'Neill on 19/1/2008 * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif // Hack to simplify build scripts #ifdef HAVE_LIBASOUND #include "AudioDriver_ALSA.h" void AudioDriver_ALSA::async_direct_callback(snd_async_handler_t *ahandler) { snd_pcm_t *handle = snd_async_handler_get_pcm(ahandler); AudioDriver_ALSA* audioDriver = (AudioDriver_ALSA*) snd_async_handler_get_callback_private(ahandler); const snd_pcm_channel_area_t *my_areas; snd_pcm_uframes_t offset, frames, size; snd_pcm_sframes_t avail, commitres; snd_pcm_state_t state; int first = 0, err; while (1) { state = snd_pcm_state(handle); if (state == SND_PCM_STATE_XRUN) { err = snd_pcm_recover(handle, -EPIPE, 0); if (err < 0) { fprintf(stderr, "ALSA: XRUN recovery failed: %s\n", snd_strerror(err)); } first = 1; } else if (state == SND_PCM_STATE_SUSPENDED) { err = snd_pcm_recover(handle, ESTRPIPE, 0); if (err < 0) { fprintf(stderr, "ALSA: SUSPEND recovery failed: %s\n", snd_strerror(err)); } } avail = snd_pcm_avail_update(handle); if (avail < 0) { err = snd_pcm_recover(handle, avail, 0); if (err < 0) { fprintf(stderr, "ALSA: avail update failed: %s\n", snd_strerror(err)); } first = 1; continue; } if (avail < audioDriver->period_size) { if (first) { first = 0; err = snd_pcm_start(handle); if (err < 0) { fprintf(stderr, "ALSA: Start error: %s\n", snd_strerror(err)); } } else { break; } continue; } frames = audioDriver->period_size; err = snd_pcm_mmap_begin(handle, &my_areas, &offset, &frames); if (err < 0) { if ((err = snd_pcm_recover(handle, err, 0)) < 0) { fprintf(stderr, "ALSA: MMAP begin avail error: %s\n", snd_strerror(err)); } first = 1; } if(frames != audioDriver->period_size) fprintf(stderr, "ALSA: Invalid buffer size: %i (should be %i), skipping..\n", frames, audioDriver->period_size); // Certain audio drivers will periodically request buffers of less than one period when // soft-resampling (ie, not running at native frequency). Milkytracker can't handle this, // and bad things happen - so best to warn the user and not process. // PS - I've disabled soft-resampling for now (see below) so this shouldn't happen. // PPS - The downside is that if the user has the wrong mixer rate, they will get an error // dialog - hopefully they'll read the message on stderr... else audioDriver->fillAudioWithCompensation(static_cast (my_areas->addr) + offset*4, frames * 2); commitres = snd_pcm_mmap_commit(handle, offset, frames); if (commitres < 0 || (snd_pcm_uframes_t)commitres != frames) { if ((err = snd_pcm_recover(handle, commitres >= 0 ? -EPIPE : commitres, 0)) < 0) { fprintf(stderr, "ALSA: MMAP commit error: %s\n", snd_strerror(err)); // What now? // exit(1); } first = 1; } } } AudioDriver_ALSA::AudioDriver_ALSA() : AudioDriver_COMPENSATE() { } AudioDriver_ALSA::~AudioDriver_ALSA() { } // On error return a negative value // If the requested buffer size can be served return 0, // otherwise return the number of 16 bit words contained in the obtained buffer mp_sint32 AudioDriver_ALSA::initDevice(mp_sint32 periodSizeAsSamples, const mp_uint32 mixFrequency, MasterMixer* mixer) { snd_pcm_sw_params_t *swparams; snd_pcm_uframes_t buffer_size; int err; snd_pcm_sw_params_alloca(&swparams); if ((err = snd_pcm_open(&pcm, "default", SND_PCM_STREAM_PLAYBACK, 0)) < 0) { fprintf(stderr, "ALSA: Failed to open device 'default' (%s)\n", snd_strerror(err)); return -1; } if ((err = snd_pcm_set_params(pcm, SND_PCM_FORMAT_S16, SND_PCM_ACCESS_MMAP_INTERLEAVED, 2, // channels mixFrequency, 0, // disallow soft resampling (2000000 * static_cast (periodSizeAsSamples)) / mixFrequency)) < 0) // period size in uS { fprintf(stderr, "ALSA: Playback open error (%s)\nALSA: Is your mixer frequency correct? Try 48000Hz\nALSA: If you are seeing \"Access type not available for PLAYBACK\" then your audio driver does not support MMAP access, and will not work with this version of MilkyTracker using the ALSA driver (try SDL instead).\n", snd_strerror(err)); return -1; } snd_pcm_prepare(pcm); period_size = periodSizeAsSamples * 2; snd_pcm_get_params(pcm, &buffer_size, &period_size); stream = new char[period_size * 2]; printf("ALSA: Period size = %i frames (requested %i), buffer size = %i frames\n", period_size, periodSizeAsSamples / 2, buffer_size); /* get the current swparams */ err = snd_pcm_sw_params_current(pcm, swparams); if (err < 0) { fprintf(stderr, "ALSA: Unable to determine current swparams for playback: %s\n", snd_strerror(err)); return -1; } AudioDriverBase::initDevice(period_size * 2, mixFrequency, mixer); return period_size * 2; // 2 = number of channels } mp_sint32 AudioDriver_ALSA::stop() { snd_pcm_drop(pcm); deviceHasStarted = false; return 0; } mp_sint32 AudioDriver_ALSA::closeDevice() { snd_pcm_close(pcm); delete[] stream; stream = NULL; deviceHasStarted = false; return 0; } mp_sint32 AudioDriver_ALSA::start() { const snd_pcm_channel_area_t *my_areas; snd_pcm_uframes_t offset, frames, size; snd_async_handler_t *ahandler; int err; err = snd_async_add_pcm_handler(&ahandler, pcm, async_direct_callback, this); if (err < 0) { fprintf(stderr, "ALSA: Unable to register async handler (%s)\n", snd_strerror(err)); } for (int count = 0; count < 2; count++) { size = period_size; while (size > 0) { frames = size; err = snd_pcm_mmap_begin(pcm, &my_areas, &offset, &frames); if (err < 0) { if ((err = snd_pcm_recover(pcm, err, 0)) < 0) { fprintf(stderr, "ALSA: MMAP begin error: %s\n", snd_strerror(err)); } } // Sanity check if (my_areas->step != 32 && my_areas->first != 0) fprintf(stderr, "ALSA: Unsupported audio format.\n"); memset(static_cast (my_areas->addr) + offset*4, 0, frames * 4); int commitres = snd_pcm_mmap_commit(pcm, offset, frames); if (err < 0 || (snd_pcm_uframes_t)commitres != frames) { if ((err = snd_pcm_recover(pcm, commitres >= 0 ? -EPIPE : commitres, 0)) < 0) { fprintf(stderr, "ALSA: MMAP commit error: %s\n", snd_strerror(err)); } } size -= frames; } } \ err = snd_pcm_start(pcm); if (err < 0) { fprintf(stderr, "ALSA: Could not start PCM device (%s)\n", snd_strerror(err)); return -1; } deviceHasStarted = true; return 0; } mp_sint32 AudioDriver_ALSA::pause() { snd_pcm_pause(pcm, true); return 0; } mp_sint32 AudioDriver_ALSA::resume() { snd_pcm_pause(pcm, false); return 0; } #endif milkytracker-0.90.85+dfsg/src/milkyplay/drivers/alsa/AudioDriver_ALSA.h0000644000175000017500000000470111163403715025014 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_ALSA.h * ALSA Audio * * Created by Christopher O'Neill on 19/1/2008 * */ #ifndef __AUDIODRIVER_ALSA_H__ #define __AUDIODRIVER_ALSA_H__ #include "AudioDriver_COMPENSATE.h" #include class AudioDriver_ALSA : public AudioDriver_COMPENSATE { private: snd_pcm_t *pcm; char *stream; snd_pcm_uframes_t period_size; static void async_direct_callback(snd_async_handler_t *ahandler); public: AudioDriver_ALSA(); virtual ~AudioDriver_ALSA(); virtual mp_sint32 initDevice(mp_sint32 periodSizeAsSamples, mp_uint32 mixFrequency, MasterMixer* mixer); virtual mp_sint32 closeDevice(); virtual mp_sint32 start(); virtual mp_sint32 stop(); virtual mp_sint32 pause(); virtual mp_sint32 resume(); virtual const char* getDriverID() { return "ALSA"; } virtual mp_sint32 getPreferredBufferSize() const { return 2048; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LittleEndian.cpp0000644000175000017500000000532111163403715022307 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "LittleEndian.h" ////////////////////////////////////////////////////////////////////////// // system independent loading of little endian numbers // ////////////////////////////////////////////////////////////////////////// mp_uword LittleEndian::GET_WORD(const void* ptr) { const mp_ubyte* buffer = (const mp_ubyte*)ptr; return ((mp_uword)buffer[0]+((mp_uword)buffer[1]<<8)); } mp_uint32 LittleEndian::GET_DWORD(const void* ptr) { const mp_ubyte* buffer = (const mp_ubyte*)ptr; return ((mp_uint32)buffer[0]+((mp_uint32)buffer[1]<<8)+((mp_uint32)buffer[2]<<16)+((mp_uint32)buffer[3]<<24)); } ////////////////////////////////////////////////////////////////////////// // system independent loading of big endian numbers // ////////////////////////////////////////////////////////////////////////// mp_uword BigEndian::GET_WORD(const void* ptr) { const mp_ubyte* buffer = (const mp_ubyte*)ptr; return ((mp_uword)buffer[1]+((mp_uword)buffer[0]<<8)); } mp_uint32 BigEndian::GET_DWORD(const void* ptr) { const mp_ubyte* buffer = (const mp_ubyte*)ptr; return ((mp_uint32)buffer[3]+((mp_uint32)buffer[2]<<8)+((mp_uint32)buffer[1]<<16)+((mp_uint32)buffer[0]<<24)); } milkytracker-0.90.85+dfsg/src/milkyplay/ResamplerFactory.cpp0000644000175000017500000000712311163403715023217 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Resampler.cpp * MilkyPlay * * Created by Peter Barth on 08.11.07. * */ #include "ResamplerFactory.h" #include "ResamplerCubic.h" #include "ResamplerFast.h" #include "ResamplerSinc.h" #include "ResamplerAmiga.h" ChannelMixer::ResamplerBase* ResamplerFactory::createResampler(ResamplerTypes type) { switch (type) { case MIXER_NORMAL: return new ResamplerSimple(); case MIXER_NORMAL_RAMPING: return new ResamplerSimpleRamp(); case MIXER_LERPING: return new ResamplerLerp(); case MIXER_LERPING_RAMPING: return new ResamplerLerpRampFilter(); case MIXER_LAGRANGE: return new ResamplerLagrange(); case MIXER_LAGRANGE_RAMPING: return new ResamplerLagrange(); case MIXER_SPLINE: return new ResamplerLagrange(); case MIXER_SPLINE_RAMPING: return new ResamplerLagrange(); case MIXER_SINCTABLE: return new ResamplerSincTable(); case MIXER_SINCTABLE_RAMPING: return new ResamplerSincTable(); case MIXER_SINC: return new ResamplerSinc(); case MIXER_SINC_RAMPING: return new ResamplerSinc(); case MIXER_AMIGA500: return new ResamplerAmiga<0>(); case MIXER_AMIGA500_RAMPING: return new ResamplerAmiga<0>(); case MIXER_AMIGA500LED: return new ResamplerAmiga<1>(); case MIXER_AMIGA500LED_RAMPING: return new ResamplerAmiga<1>(); case MIXER_AMIGA1200: return new ResamplerAmiga<2>(); case MIXER_AMIGA1200_RAMPING: return new ResamplerAmiga<2>(); case MIXER_AMIGA1200LED: return new ResamplerAmiga<3>(); case MIXER_AMIGA1200LED_RAMPING: return new ResamplerAmiga<3>(); /* There is also ResamplerAmiga<5> which is a generic 22khz LP filter, it still emulates Paula's pulse chain but does not emulate any of the Amiga's internal filter circuitry. Already we have many options here so it's probably not worth including. */ case MIXER_DUMMY: return new ResamplerDummy(); } return NULL; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderCBA.cpp0000644000175000017500000001654211163403715021456 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderCBA.cpp * MilkyPlay Module Loader: Chuck Biscuits Music whatever * */ #include "Loaders.h" const char* LoaderCBA::identifyModule(const mp_ubyte* buffer) { // check for .AMF module if (!memcmp(buffer,"CBA\xF9",4)) { return "CBA"; } return NULL; } static void convertEffect(mp_ubyte& eff, mp_ubyte& op) { switch (eff) { case 0x01: // arpeggio eff = 0x20; break; case 0x02: // porta up eff = 0x47; break; case 0x03: // porta down eff = 0x48; break; case 0x04: // porta to note eff = 0x03; break; case 0x05: // vibrato eff = 0x04; break; case 0x06: // porta to note + volslide eff = 0x05; break; case 0x07: // vibrato + volslide eff = 0x06; break; case 0x08: // tremolo eff = 0x07; break; case 0x09: // set panning eff = 0x08; break; case 0x0a: // sample offset eff = 0x9; break; case 0x0B: // volslide eff = 0x49; break; case 0x0C: // position jump eff = 0x0B; break; case 0x0e: // pattern break eff = 0x0D; break; /*case 0x0f: eff = 0x4A; break;*/ case 0x10: // fine porta up eff = 0x31; break; case 0x11: // fine porta down eff = 0x32; break; case 0x12: eff = 0x33; break; case 0x13: eff = 0x34; break; case 0x14: eff = 0x35; break; case 0x15: // loop eff = 0x36; break; case 0x16: eff = 0x37; break; case 0x17: // set panning eff = 0x8; op<<=4; break; case 0x18: // retrig with volslide eff = 0x1B; break; case 0x19: // fine volslide up eff = 0x3a; break; case 0x1a: // fine volslide down eff = 0x3b; break; case 0x1b: // note cut eff = 0x3c; break; case 0x1c: // note delay eff = 0x3d; break; case 0x1d: // pattern delay eff = 0x3e; break; case 0x1f: // set speed eff = 0x1C; break; case 0x20: // set tempo eff = 0x16; break; case 0: op = 0; break; default: #ifdef VERBOSE printf("Missing CBA Effect: %x, %x\n", eff, op); #endif eff = op = 0; } } mp_sint32 LoaderCBA::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(header->sig, 1, 3); f.readByte(); // skip 0xF9 f.read(header->name, 1, 32); f.readByte(); // skip 0x1A mp_sint32 songMsgLen = f.readWord(); header->channum = f.readByte(); header->patnum = f.readByte()+1; // number of patterns header->ordnum = f.readByte(); // song length header->insnum = f.readByte(); // number of instruments header->tempo = f.readByte(); // default tickspeed header->speed = f.readByte(); // default tempo header->flags = XModule::MODULE_ST3NEWINSTRUMENT; header->mainvol = 255; f.read(header->pan, 1, 32); f.read(header->ord, 1, 255); mp_sint32 i, s = 0; for (i = 0; i < header->insnum; i++) { mp_ubyte name[32]; mp_ubyte flags; mp_ubyte vol; mp_uword c4spd; mp_sint32 len; mp_sint32 loopstart; mp_sint32 loopend; f.read(name, 1, 32); flags = f.readByte(); vol = f.readByte(); c4spd = f.readWord(); len = f.readDword(); loopstart = f.readDword(); loopend = f.readDword(); memcpy(instr[i].name, name, 32); if ((flags & 0x02) && len) { instr[i].samp = 1; memcpy(smp[s].name, name, 32); for (mp_sint32 j = 0; j < 120; j++) instr[i].snum[j] = s; smp[s].flags = 1; smp[s].samplen = len; mp_sint32 looplen = (loopend - loopstart); if (looplen < 0) looplen = 0; smp[s].looplen = looplen; smp[s].loopstart = loopstart; smp[s].vol = XModule::vol64to255(vol); if (flags & 0x08) smp[s].type = 1; XModule::convertc4spd(c4spd, &smp[s].finetune, &smp[s].relnote); s++; } } header->smpnum = s; mp_ubyte* pattern = new mp_ubyte[header->channum*64*5]; if (pattern == NULL) return -7; for (i = 0; i < header->patnum;i++) { f.read(pattern, 1, header->channum*64*5); phead[i].rows = 64; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)]; // out of memory? if (phead[i].patternData == NULL) { delete[] pattern; return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)); mp_sint32 r,c,cnt = 0; mp_sint32 offs = 0; for (r=0; r < 64; r++) { for (c = 0; c < header->channum; c++) { mp_ubyte ins = pattern[cnt]; mp_ubyte note = pattern[cnt+1]; mp_ubyte vol = pattern[cnt+2]; mp_ubyte eff = pattern[cnt+3]; mp_ubyte op = pattern[cnt+4]; if (note == 255) note = 122; phead[i].patternData[offs] = note; phead[i].patternData[offs+1] = ins; if (vol) { phead[i].patternData[offs+2] = 0x0C; phead[i].patternData[offs+3] = XModule::vol64to255(vol-1); } convertEffect(eff, op); #ifdef VERBOSE if (eff == 0 && pattern[cnt+3]) { printf("pattern: %i, row: %i, channel %i: %x, %x\n", i, r, c, pattern[cnt+3], pattern[cnt+4]); } #endif phead[i].patternData[offs+4] = eff; phead[i].patternData[offs+5] = op; cnt+=5; offs+=(phead[i].effnum * 2 + 2); } } } delete[] pattern; if (module->loadModuleSamples(f, XModule::ST_DELTA) != 0) return -7; module->allocateSongMessage(songMsgLen+1); if (module->message) { memset(module->message, 0, songMsgLen+1); f.read(module->message, 1, songMsgLen); } strcpy(header->tracker,"..converted.."); //module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/PlayerIT.cpp0000644000175000017500000032324611163403715021435 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerIT.cpp * MilkyPlay IT player. Note that this evolved out of the standard player which * aims at correct XM replay, so many things might still be not correct for * impulse tracker. So this code is subject to change. * * */ #include "PlayerIT.h" // if we're in background we work on our own state // if not, we're just going to work on the host state PlayerIT::TChnState& PlayerIT::TVirtualChannel::chnstat() { return host ? host->state : state; } #define CHANNEL_FLAGS_DVS 0x10000 #define CHANNEL_FLAGS_DFS 0x20000 #define CHANNEL_FLAGS_DPS 0x40000 #define CHANNEL_FLAGS_FORCE_FORWARD 0x00001 #define CHANNEL_FLAGS_FORCE_BACKWARD 0x00002 #define CHANNEL_FLAGS_FORCE_BILOOP 0x00004 #define CHANNEL_FLAGS_UPDATE_IGNORE 0x00100 //#define MINPERIOD (113*4) // must be called after the poscnt has been properly set #define RESETLOOPING \ { \ chnInf->loopstart=chnInf->loopcounter=chnInf->execloop=0; \ chnInf->isLooping = false; \ chnInf->loopingValidPosition = poscnt; \ } #define RESET_ALL_LOOPING \ { \ for (mp_sint32 c = 0; c < numModuleChannels; c++) \ { \ TModuleChannel *chnInf = &chninfo[c]; \ RESETLOOPING \ } \ } static inline mp_sint32 myMod(mp_sint32 a, mp_sint32 b) { mp_sint32 r = a % b; return r < 0 ? b + r : r; } const mp_sint32 PlayerIT::vibtab[32] = { 0,24,49,74,97,120,141,161, 180,197,212,224,235,244,250,253, 255,253,250,244,235,224,212,197, 180,161,141,120,97,74,49,24 }; const mp_sint32 PlayerIT::finesintab[256] = { 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60, 59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26, 24, 23, 22, 20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2, 0, -2, -3, -5, -6, -8, -9,-11,-12,-14,-16,-17,-19,-20,-22,-23, -24,-26,-27,-29,-30,-32,-33,-34,-36,-37,-38,-39,-41,-42,-43,-44, -45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-56,-57,-58,-59, -59,-60,-60,-61,-61,-62,-62,-62,-63,-63,-63,-64,-64,-64,-64,-64, -64,-64,-64,-64,-64,-64,-63,-63,-63,-62,-62,-62,-61,-61,-60,-60, -59,-59,-58,-57,-56,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46, -45,-44,-43,-42,-41,-39,-38,-37,-36,-34,-33,-32,-30,-29,-27,-26, -24,-23,-22,-20,-19,-17,-16,-14,-12,-11, -9, -8, -6, -5, -3, -2 }; #define MAXNOTES (16*12) #define LINEAR_PERIOD_MAX (MAXNOTES*16*4) const mp_uword PlayerIT::lintab[769] = { 16726,16741,16756,16771,16786,16801,16816,16832,16847,16862,16877,16892,16908,16923,16938,16953, 16969,16984,16999,17015,17030,17046,17061,17076,17092,17107,17123,17138,17154,17169,17185,17200, 17216,17231,17247,17262,17278,17293,17309,17325,17340,17356,17372,17387,17403,17419,17435,17450, 17466,17482,17498,17513,17529,17545,17561,17577,17593,17608,17624,17640,17656,17672,17688,17704, 17720,17736,17752,17768,17784,17800,17816,17832,17848,17865,17881,17897,17913,17929,17945,17962, 17978,17994,18010,18027,18043,18059,18075,18092,18108,18124,18141,18157,18174,18190,18206,18223, 18239,18256,18272,18289,18305,18322,18338,18355,18372,18388,18405,18421,18438,18455,18471,18488, 18505,18521,18538,18555,18572,18588,18605,18622,18639,18656,18672,18689,18706,18723,18740,18757, 18774,18791,18808,18825,18842,18859,18876,18893,18910,18927,18944,18961,18978,18995,19013,19030, 19047,19064,19081,19099,19116,19133,19150,19168,19185,19202,19220,19237,19254,19272,19289,19306, 19324,19341,19359,19376,19394,19411,19429,19446,19464,19482,19499,19517,19534,19552,19570,19587, 19605,19623,19640,19658,19676,19694,19711,19729,19747,19765,19783,19801,19819,19836,19854,19872, 19890,19908,19926,19944,19962,19980,19998,20016,20034,20052,20071,20089,20107,20125,20143,20161, 20179,20198,20216,20234,20252,20271,20289,20307,20326,20344,20362,20381,20399,20418,20436,20455, 20473,20492,20510,20529,20547,20566,20584,20603,20621,20640,20659,20677,20696,20715,20733,20752, 20771,20790,20808,20827,20846,20865,20884,20902,20921,20940,20959,20978,20997,21016,21035,21054, 21073,21092,21111,21130,21149,21168,21187,21206,21226,21245,21264,21283,21302,21322,21341,21360, 21379,21399,21418,21437,21457,21476,21496,21515,21534,21554,21573,21593,21612,21632,21651,21671, 21690,21710,21730,21749,21769,21789,21808,21828,21848,21867,21887,21907,21927,21946,21966,21986, 22006,22026,22046,22066,22086,22105,22125,22145,22165,22185,22205,22226,22246,22266,22286,22306, 22326,22346,22366,22387,22407,22427,22447,22468,22488,22508,22528,22549,22569,22590,22610,22630, 22651,22671,22692,22712,22733,22753,22774,22794,22815,22836,22856,22877,22897,22918,22939,22960, 22980,23001,23022,23043,23063,23084,23105,23126,23147,23168,23189,23210,23230,23251,23272,23293, 23315,23336,23357,23378,23399,23420,23441,23462,23483,23505,23526,23547,23568,23590,23611,23632, 23654,23675,23696,23718,23739,23761,23782,23804,23825,23847,23868,23890,23911,23933,23954,23976, 23998,24019,24041,24063,24084,24106,24128,24150,24172,24193,24215,24237,24259,24281,24303,24325, 24347,24369,24391,24413,24435,24457,24479,24501,24523,24545,24567,24590,24612,24634,24656,24679, 24701,24723,24746,24768,24790,24813,24835,24857,24880,24902,24925,24947,24970,24992,25015,25038, 25060,25083,25105,25128,25151,25174,25196,25219,25242,25265,25287,25310,25333,25356,25379,25402, 25425,25448,25471,25494,25517,25540,25563,25586,25609,25632,25655,25678,25702,25725,25748,25771, 25795,25818,25841,25864,25888,25911,25935,25958,25981,26005,26028,26052,26075,26099,26123,26146, 26170,26193,26217,26241,26264,26288,26312,26336,26359,26383,26407,26431,26455,26479,26502,26526, 26550,26574,26598,26622,26646,26670,26695,26719,26743,26767,26791,26815,26839,26864,26888,26912, 26937,26961,26985,27010,27034,27058,27083,27107,27132,27156,27181,27205,27230,27254,27279,27304, 27328,27353,27378,27402,27427,27452,27477,27502,27526,27551,27576,27601,27626,27651,27676,27701, 27726,27751,27776,27801,27826,27851,27876,27902,27927,27952,27977,28003,28028,28053,28078,28104, 28129,28155,28180,28205,28231,28256,28282,28307,28333,28359,28384,28410,28435,28461,28487,28513, 28538,28564,28590,28616,28642,28667,28693,28719,28745,28771,28797,28823,28849,28875,28901,28927, 28953,28980,29006,29032,29058,29084,29111,29137,29163,29190,29216,29242,29269,29295,29322,29348, 29375,29401,29428,29454,29481,29507,29534,29561,29587,29614,29641,29668,29694,29721,29748,29775, 29802,29829,29856,29883,29910,29937,29964,29991,30018,30045,30072,30099,30126,30154,30181,30208, 30235,30263,30290,30317,30345,30372,30400,30427,30454,30482,30509,30537,30565,30592,30620,30647, 30675,30703,30731,30758,30786,30814,30842,30870,30897,30925,30953,30981,31009,31037,31065,31093, 31121,31149,31178,31206,31234,31262,31290,31319,31347,31375,31403,31432,31460,31489,31517,31546, 31574,31602,31631,31660,31688,31717,31745,31774,31803,31832,31860,31889,31918,31947,31975,32004, 32033,32062,32091,32120,32149,32178,32207,32236,32265,32295,32324,32353,32382,32411,32441,32470, 32499,32529,32558,32587,32617,32646,32676,32705,32735,32764,32794,32823,32853,32883,32912,32942, 32972,33002,33031,33061,33091,33121,33151,33181,33211,33241,33271,33301,33331,33361,33391,33421, 33451 // one more value because of linear interpolation }; #define LOGFAC 2*16 const mp_uint32 PlayerIT::logtab[] = { LOGFAC*907,LOGFAC*900,LOGFAC*894,LOGFAC*887,LOGFAC*881,LOGFAC*875,LOGFAC*868,LOGFAC*862, LOGFAC*856,LOGFAC*850,LOGFAC*844,LOGFAC*838,LOGFAC*832,LOGFAC*826,LOGFAC*820,LOGFAC*814, LOGFAC*808,LOGFAC*802,LOGFAC*796,LOGFAC*791,LOGFAC*785,LOGFAC*779,LOGFAC*774,LOGFAC*768, LOGFAC*762,LOGFAC*757,LOGFAC*752,LOGFAC*746,LOGFAC*741,LOGFAC*736,LOGFAC*730,LOGFAC*725, LOGFAC*720,LOGFAC*715,LOGFAC*709,LOGFAC*704,LOGFAC*699,LOGFAC*694,LOGFAC*689,LOGFAC*684, LOGFAC*678,LOGFAC*675,LOGFAC*670,LOGFAC*665,LOGFAC*660,LOGFAC*655,LOGFAC*651,LOGFAC*646, LOGFAC*640,LOGFAC*636,LOGFAC*632,LOGFAC*628,LOGFAC*623,LOGFAC*619,LOGFAC*614,LOGFAC*610, LOGFAC*604,LOGFAC*601,LOGFAC*597,LOGFAC*592,LOGFAC*588,LOGFAC*584,LOGFAC*580,LOGFAC*575, LOGFAC*570,LOGFAC*567,LOGFAC*563,LOGFAC*559,LOGFAC*555,LOGFAC*551,LOGFAC*547,LOGFAC*543, LOGFAC*538,LOGFAC*535,LOGFAC*532,LOGFAC*528,LOGFAC*524,LOGFAC*520,LOGFAC*516,LOGFAC*513, LOGFAC*508,LOGFAC*505,LOGFAC*502,LOGFAC*498,LOGFAC*494,LOGFAC*491,LOGFAC*487,LOGFAC*484, LOGFAC*480,LOGFAC*477,LOGFAC*474,LOGFAC*470,LOGFAC*467,LOGFAC*463,LOGFAC*460,LOGFAC*457, LOGFAC*453,LOGFAC*450,LOGFAC*447,LOGFAC*443,LOGFAC*440,LOGFAC*437,LOGFAC*434,LOGFAC*431, LOGFAC*428 // one more value because of linear interpolation }; // 2^(SlideValue/768) in 16.16 fixed point // SlideValue in [-256..256] const mp_uint32 PlayerIT::powtab[] = { 52015, 52062, 52109, 52156, 52204, 52251, 52298, 52345, 52392, 52440, 52487, 52534, 52582, 52629, 52677, 52724, 52772, 52820, 52867, 52915, 52963, 53011, 53059, 53107, 53154, 53202, 53250, 53299, 53347, 53395, 53443, 53491, 53540, 53588, 53636, 53685, 53733, 53782, 53830, 53879, 53928, 53976, 54025, 54074, 54123, 54172, 54220, 54269, 54318, 54367, 54417, 54466, 54515, 54564, 54613, 54663, 54712, 54761, 54811, 54860, 54910, 54959, 55009, 55059, 55108, 55158, 55208, 55258, 55308, 55358, 55408, 55458, 55508, 55558, 55608, 55658, 55709, 55759, 55809, 55860, 55910, 55961, 56011, 56062, 56112, 56163, 56214, 56264, 56315, 56366, 56417, 56468, 56519, 56570, 56621, 56672, 56723, 56775, 56826, 56877, 56928, 56980, 57031, 57083, 57134, 57186, 57238, 57289, 57341, 57393, 57445, 57496, 57548, 57600, 57652, 57704, 57757, 57809, 57861, 57913, 57965, 58018, 58070, 58123, 58175, 58228, 58280, 58333, 58385, 58438, 58491, 58544, 58597, 58650, 58702, 58755, 58809, 58862, 58915, 58968, 59021, 59075, 59128, 59181, 59235, 59288, 59342, 59395, 59449, 59503, 59556, 59610, 59664, 59718, 59772, 59826, 59880, 59934, 59988, 60042, 60096, 60151, 60205, 60259, 60314, 60368, 60423, 60477, 60532, 60586, 60641, 60696, 60751, 60806, 60860, 60915, 60970, 61025, 61081, 61136, 61191, 61246, 61301, 61357, 61412, 61468, 61523, 61579, 61634, 61690, 61746, 61801, 61857, 61913, 61969, 62025, 62081, 62137, 62193, 62249, 62305, 62362, 62418, 62474, 62531, 62587, 62644, 62700, 62757, 62814, 62870, 62927, 62984, 63041, 63098, 63155, 63212, 63269, 63326, 63383, 63440, 63498, 63555, 63612, 63670, 63727, 63785, 63842, 63900, 63958, 64016, 64073, 64131, 64189, 64247, 64305, 64363, 64421, 64479, 64538, 64596, 64654, 64713, 64771, 64830, 64888, 64947, 65005, 65064, 65123, 65182, 65240, 65299, 65358, 65417, 65476, 65536, 65595, 65654, 65713, 65773, 65832, 65891, 65951, 66010, 66070, 66130, 66189, 66249, 66309, 66369, 66429, 66489, 66549, 66609, 66669, 66729, 66789, 66850, 66910, 66971, 67031, 67092, 67152, 67213, 67273, 67334, 67395, 67456, 67517, 67578, 67639, 67700, 67761, 67822, 67883, 67945, 68006, 68067, 68129, 68190, 68252, 68314, 68375, 68437, 68499, 68561, 68623, 68685, 68747, 68809, 68871, 68933, 68995, 69057, 69120, 69182, 69245, 69307, 69370, 69432, 69495, 69558, 69621, 69684, 69747, 69809, 69873, 69936, 69999, 70062, 70125, 70189, 70252, 70315, 70379, 70442, 70506, 70570, 70633, 70697, 70761, 70825, 70889, 70953, 71017, 71081, 71145, 71209, 71274, 71338, 71403, 71467, 71532, 71596, 71661, 71725, 71790, 71855, 71920, 71985, 72050, 72115, 72180, 72245, 72310, 72376, 72441, 72507, 72572, 72638, 72703, 72769, 72834, 72900, 72966, 73032, 73098, 73164, 73230, 73296, 73362, 73429, 73495, 73561, 73628, 73694, 73761, 73827, 73894, 73961, 74027, 74094, 74161, 74228, 74295, 74362, 74429, 74497, 74564, 74631, 74699, 74766, 74833, 74901, 74969, 75036, 75104, 75172, 75240, 75308, 75376, 75444, 75512, 75580, 75648, 75717, 75785, 75853, 75922, 75991, 76059, 76128, 76197, 76265, 76334, 76403, 76472, 76541, 76610, 76679, 76749, 76818, 76887, 76957, 77026, 77096, 77165, 77235, 77305, 77375, 77445, 77514, 77584, 77655, 77725, 77795, 77865, 77935, 78006, 78076, 78147, 78217, 78288, 78359, 78429, 78500, 78571, 78642, 78713, 78784, 78855, 78926, 78998, 79069, 79140, 79212, 79283, 79355, 79427, 79498, 79570, 79642, 79714, 79786, 79858, 79930, 80002, 80074, 80147, 80219, 80292, 80364, 80437, 80509, 80582, 80655, 80727, 80800, 80873, 80946, 81019, 81093, 81166, 81239, 81312, 81386, 81459, 81533, 81607, 81680, 81754, 81828, 81902, 81976, 82050, 82124, 82198, 82272, 82346, 82421, 82495, 82570 // one more value because of linear interpolation }; mp_sint32 PlayerIT::interpolate(mp_sint32 eax,mp_sint32 ebx,mp_sint32 ecx,mp_sint32 edi,mp_sint32 esi) { if (ebx==ecx) return edi; mp_sint32 di = ((eax-ebx)*(esi-edi))/(ecx-ebx)+edi; return (mp_sint32)di; } // This takes the period with 8 bit fractional part mp_sint32 PlayerIT::getlinfreq(mp_sint32 per) { if (per<0) per=0; if (per>LINEAR_PERIOD_MAX*256) per=LINEAR_PERIOD_MAX*256; mp_sint32 t = (LINEAR_PERIOD_MAX*256-per)/(768*256); mp_sint32 r = myMod(LINEAR_PERIOD_MAX*256-per, 768*256); // Linear interpolation seems to be wrong here /*mp_sint32 frac = r & 255; mp_sint32 r1 = ((lintab[r>>8])<>5; mp_sint32 r2 = ((lintab[(r>>8)+1])<>5; return ((255-frac)*r1 + frac*r2) >> 8;*/ return t >= 0 ? (((lintab[r>>8])<>5) : (((lintab[r>>8])>>(-t))>>5); } // This takes the period with 8 bit fractional part mp_sint32 PlayerIT::getlogfreq(mp_sint32 per) { return fixeddiv(14317056, per)>>8; } mp_sint32 PlayerIT::getlinperiod(mp_sint32 note,mp_sint32 relnote,mp_sint32 finetune) { note+=relnote+(mp_sint32)module->header.relnote; //if (note<1) note = 1; if (note>MAXNOTES) note = MAXNOTES; // t=(24L*OCTAVE+2-note)*32L-(fine>>1); return ((LINEAR_PERIOD_MAX-((note-1)*16*4)-(finetune/2))); } mp_sint32 PlayerIT::getlogperiod(mp_sint32 note,mp_sint32 relnote,mp_sint32 finetune) { note+=relnote+(mp_sint32)module->header.relnote; //if (note<1) note = 1; if (note>MAXNOTES) note = MAXNOTES; mp_sint32 ft = finetune; ft+=128; mp_sint32 octave = (note-1)/12; mp_sint32 n = myMod(note-1, 12)<<3; mp_sint32 pi = (ft>>4)+n; mp_sint32 v1 = logtab[pi]; mp_sint32 v2 = logtab[pi+1]; mp_sint32 t = (ft>>4)-8; //mp_sint32 t = (ft>>4); return octave >= 0 ? (interpolate(t,0,15,v1,v2)>>octave) : (interpolate(t,0,15,v1,v2)<<(-octave)); } PlayerIT::PlayerIT(mp_uint32 frequency) : PlayerBase(frequency) { chninfo = NULL; vchninfo = NULL; attick = NULL; // fill in some default values, don't know if this is necessary tickSpeed = 6; // our tickspeed bpm = 125; // BPM speed ticker = tickSpeed-1; // runs from 0 to tickspeed-1 patternIndex = 0; // holds current pattern index numEffects = 0; // current number of effects numChannels = 0; // current number of channels numMaxVirChannels = 256; // maximum amount of virtual channels //loopstart = execloop = loopcounter=0; patDelay = false; patDelayCount = 0; haltFlag = false; options[PlayModeOptionPanning8xx] = true; options[PlayModeOptionPanningE8x] = false; options[PlayModeOptionForcePTPitchLimit] = true; } PlayerIT::~PlayerIT() { freeMemory(); } #define MYMAX(a, b) (mp_sint32)((a) > (b) ? (a) : (b)) void PlayerIT::timerHandler(mp_sint32 currentBeatPacket) { PlayerBase::timerHandler(currentBeatPacket); if (paused) return; // get current maximum virtual channels mp_sint32 oldMaxVirChannels = curMaxVirChannels; mp_int64 dummy = (mp_int64)BPMCounter; dummy+=(mp_int64)adder; BPMCounter=(mp_sint32)dummy; // check overflow-carry if ((dummy>>32)) { tickhandler(); } if (module->header.flags & XModule::MODULE_AMSENVELOPES) updateBPMIndependent(); // if the new maximum of virtual channels is greater than the old one // set it to the new one, else keep the old one, because if some channels were // cut by stopSample() the mixer needs to shut these off setActiveChannels(MYMAX(curMaxVirChannels, oldMaxVirChannels)); } mp_sint32 PlayerIT::startPlaying(XModule* module, bool repeat/* = false*/, mp_uint32 startPosition/* = 0*/, mp_uint32 startRow/* = 0*/, mp_sint32 numChannels/* = -1*/, const mp_ubyte* customPanningTable/* = NULL*/, bool idle/* = false*/, mp_sint32 patternIndex/* = -1*/, bool playOneRowOnly/* = false*/) { /*for (mp_sint32 vmd = -256; vmd < 257; vmd++) { double fac = pow(2.0, vmd/768.0); printf("%d, ", (mp_sint32)(fac * 65536.0)); }*/ numModuleChannels = module->header.channum; numVirtualChannels = numMaxVirChannels < numModuleChannels ? numModuleChannels : numMaxVirChannels; return PlayerBase::startPlaying(module, repeat, startPosition, startRow, numVirtualChannels, customPanningTable, idle, patternIndex, playOneRowOnly); } void PlayerIT::restart(mp_uint32 startPosition/* = 0*/, mp_uint32 startRow/* = 0*/, bool resetMixer/* = true*/, const mp_ubyte* customPanningTable/* = NULL*/, bool playOneRowOnly/* = false*/) { if (chninfo == NULL) return; bpm = module->header.speed; tickSpeed = module->header.tempo; ticker = 0; // after the speed has been assigned, it's time to call PlayerBase::restart PlayerBase::restart(startPosition, startRow, resetMixer, customPanningTable, playOneRowOnly); this->adder = getbpmrate(this->bpm); mp_sint32 i,j; // clean up player specific variables patternIndex = 0; numEffects = 0; numChannels = 0; patDelay = false; patDelayCount = 0; haltFlag = false; startNextRow = -1; reset(); for (i = 0; i < numModuleChannels; i++) { chninfo[i].setMasterVol(0xff); chninfo[i].setPan(customPanningTable ? customPanningTable[i] : module->header.pan[i]); } memset(rowHits, 0, sizeof(rowHits)); for (i = 0; i < (signed)startPosition; i++) for (j = 0; j < 256; j++) visitRow(i*256+j); for (i = 0; i < (signed)startRow; i++) visitRow(startPosition*256+i); } void PlayerIT::reset() { curMaxVirChannels = 0; memset(chninfo, 0, sizeof(TModuleChannel)*numModuleChannels); memset(vchninfo, 0, sizeof(TVirtualChannel)*numVirtualChannels); RESET_ALL_LOOPING } void PlayerIT::resetAllSpeed() { bpm = module->header.speed; tickSpeed = module->header.tempo; ticker = 0; this->adder = getbpmrate(this->bpm); } mp_sint32 PlayerIT::allocateStructures() { freeMemory(); chninfo = new TModuleChannel[numModuleChannels]; vchninfo = new TVirtualChannel[numVirtualChannels]; attick = new mp_ubyte[numModuleChannels]; return 0; } void PlayerIT::freeMemory() { if (chninfo) { delete[] chninfo; chninfo = NULL; } if (vchninfo) \ { delete[] vchninfo; vchninfo = NULL; } if (attick) { delete[] attick; attick = NULL; } } /////////////////////////////////////////////////////////////////////////////////// // controlling current song position // /////////////////////////////////////////////////////////////////////////////////// void PlayerIT::clearEffectMemory() { if (!module || !chninfo) return; ticker = 0; //loopstart = execloop = loopcounter=0; mp_sint32 i; for (i = 0; i < numModuleChannels; i++) { TModuleChannel *chnInf = &chninfo[i]; RESETLOOPING } patDelay = false; patDelayCount = 0; haltFlag = false; startNextRow = -1; memset(rowHits, 0, sizeof(rowHits)); for (i = 0; i < poscnt; i++) for (mp_sint32 j = 0; j < 256; j++) visitRow(i*256+j); for (i = 0; i < (signed)rowcnt; i++) visitRow(poscnt*256+i); } PlayerIT::TVirtualChannel* PlayerIT::allocateVirtualChannel() { const mp_sint32 numVirtualChannels = this->numVirtualChannels; mp_sint32 i; TVirtualChannel* vchn = vchninfo; for (i = 0; i < numVirtualChannels; i++, vchn++) { if (vchn->getBackground()) { if (!vchn->getActive()) { if (i+1 > curMaxVirChannels) curMaxVirChannels = i+1; vchn->setChannelIndex(i); return vchn; } } } mp_sint32 chnIndex = -1; mp_sint32 vol = 0x7FFFFFFF; vchn = vchninfo; for (i = 0; i < curMaxVirChannels; i++, vchn++) { if (vchn->getBackground()) { mp_sint32 newVol = vchn->getResultingVolume(); if (newVol < vol) { vol = newVol; chnIndex = i; } } } if (chnIndex != -1) { vchn = vchninfo + chnIndex; vchn->setChannelIndex(chnIndex); return vchn; } return NULL; } void PlayerIT::handleNoteOFF(TChnState& state) { const mp_sint32 ins = state.getIns(); if (ins && ins <= module->header.insnum) { // IT style fadeout also works without active envelope if (module->instr[ins-1].flags & TXMInstrument::IF_ITFADEOUT) { if (state.getVenv().envstruc!=NULL) { // envelope is off or on and looping if (!state.getVenv().isEnabled() || (state.getVenv().isEnabled() && (state.getVenv().envstruc->type&4))) { state.setFadeout(true); } } // no envelope at all else { state.setFadeout(true); } } // XM style (envelope is off) else if (!state.getVenv().isEnabled()) { state.setVol(0); state.adjustTremoloTremorVol(); } } state.setKeyon(false); } void PlayerIT::handlePastNoteAction(TModuleChannel* chnInf, mp_ubyte pastNoteActionType) { TVirtualChannel* vchn = vchninfo; const mp_sint32 curMaxVirChannels = this->curMaxVirChannels; switch (pastNoteActionType) { case 0: { for (mp_sint32 i = 0; i < curMaxVirChannels; i++, vchn++) if (vchn->getActive() && (vchn->getOldHost() == chnInf)) { mp_sint32 index = vchn->getChannelIndex(); stopSample(index); releaseVirtualChannel(vchn); } break; } case 1: { for (mp_sint32 i = 0; i < curMaxVirChannels; i++, vchn++) if (vchn->getActive() && (vchn->getOldHost() == chnInf)) handleNoteOFF(vchn->getRealState()); break; } case 2: { for (mp_sint32 i = 0; i < curMaxVirChannels; i++, vchn++) if (vchn->getActive() && (vchn->getOldHost() == chnInf)) vchn->getRealState().setFadeout(true); break; } } } bool PlayerIT::handleDCT(TModuleChannel* chnInf, const TNNATriggerInfo& triggerInfo, mp_ubyte DCT, mp_ubyte DCA) { TVirtualChannel* vchn = vchninfo; const mp_sint32 curMaxVirChannels = this->curMaxVirChannels; for (mp_sint32 i = 0; i < curMaxVirChannels; i++, vchn++) { if (vchn->getActive() && (vchn->getOldHost() == chnInf || vchn->getHost() == chnInf)) { bool matchDCT; // normal case (instrument supplied with note) if (triggerInfo.ins) { // must always be the same instrument matchDCT = (vchn->getIns() == triggerInfo.ins); // check for note if (DCT == 1) matchDCT &= (vchn->getNote() == triggerInfo.note); // check for sample else if (DCT == 2) matchDCT &= (vchn->getSmp() == triggerInfo.smp); } // no instrument supplied with note else { matchDCT = true; // note check doesn't do anything if instrument is 0 if (DCT == 1) continue; } if (!matchDCT) continue; // cut = keep channel if (DCA == 0) { mp_sint32 index = vchn->getChannelIndex(); stopSample(index); releaseVirtualChannel(vchn); } // note off else if (DCA == 1) { // virtual channel is no longer linked to host if (vchn->getOldHost() == chnInf) handleNoteOFF(vchn->getRealState()); // virtual channel is linked to host, unlink and handle note off else { // important: first set host to NULL // THEN set key on flag TVirtualChannel* oldvchn = chnInf->unlinkVchn(); handleNoteOFF(oldvchn->getRealState()); } } // note fade else if (DCA == 2) { // virtual channel is no longer linked to host if (vchn->getOldHost() == chnInf) vchn->getRealState().setFadeout(true); // virtual channel is linked to host, unlink and handle fade out else { // important: first set host to NULL // THEN set fade out chnInf->unlinkVchn()->setFadeout(true); } } } } // deal with no instrument case if (!triggerInfo.ins) { // if DCT is set to note, just continue with playing the note if (DCT == 1) return true; // if DCT is set to ins/smp and DCA is set to cut, cut and don't play the current note else if (DCA == 0) return false; } return true; } bool PlayerIT::handleNNAs(TModuleChannel* chnInf, const TNNATriggerInfo& triggerInfo) { /*if (poscnt == 7 && rowcnt == 00) { int i=0; i++; i--; }*/ // sanity checks if (triggerInfo.ins > module->header.insnum || !triggerInfo.note || triggerInfo.smp < 0) return true; TVirtualChannel* newVchn = allocateVirtualChannel(); if (newVchn == NULL) return false; mp_uword insflags = chnInf->getInsflags(); mp_ubyte NNA = (insflags>>4) & 3; mp_ubyte DCT = (insflags>>6) & 3; mp_ubyte DCA = (insflags>>8) & 3; if (DCT) { if (!handleDCT(chnInf, triggerInfo, DCT, DCA)) return false; } // do we have some virtual channel already? if (chnInf->hasVchn()) { // NNA = CUT? Use the same virtual channel for playback if (NNA == 0) return true; // NNA = continue else if (NNA == 1) { chnInf->unlinkVchn(); chnInf->linkVchn(newVchn); return true; } // NNA = note off else if (NNA == 2) { // important: first set host to NULL // THEN set key on flag TVirtualChannel* oldvchn = chnInf->unlinkVchn(); handleNoteOFF(oldvchn->getRealState()); chnInf->linkVchn(newVchn); return true; } // NNA = note fade else if (NNA == 3) { // important: first set host to NULL // THEN set fade out chnInf->unlinkVchn()->setFadeout(true); chnInf->linkVchn(newVchn); return true; } } else { chnInf->linkVchn(newVchn); } return true; } void PlayerIT::adjustVirtualChannels() { mp_sint32 i; TVirtualChannel* vchn = vchninfo; for (i = 0; i < curMaxVirChannels; i++, vchn++) { if (!vchn->getActive()) continue; if (vchn->getBackground()) { if (!isChannelPlaying(i) || !vchn->getVol() || !vchn->getMasterVol() || !vchn->getFadevolstart() || vchn->getVenv().cutted(vchn->getKeyon())) { //bool cutted = vchn->getVenv().cutted(vchn->getKeyon()); mp_sint32 index = vchn->getChannelIndex(); stopSample(index); releaseVirtualChannel(vchn); continue; } } /*else { if (!vchn->getFadevolstart() || vchn->getVenv().cutted(vchn->getKeyon())) { mp_sint32 index = vchn->getChannelIndex(); stopSample(index); continue; } }*/ } } void PlayerIT::prenvelope(TPrEnv *env, bool keyon, bool timingIT) { if (env->isEnabled()) { // if we're sitting on a sustain point and key is on, we don't advance further if ((env->envstruc->type&2) && (env->a==env->envstruc->sustain) && (env->step == env->envstruc->env[env->a][0]) && keyon) return; // IT-style envelopes count differently if (timingIT) { if ((env->step<=env->envstruc->env[env->b][0]) && (env->b < env->envstruc->num)) env->step++; if (env->step > env->envstruc->env[env->b][0]) { // normal loop if ((env->envstruc->type&4)) { // check for envelope loop break (AMS) if ((!(env->envstruc->type&8) || keyon) && !(!keyon && (env->envstruc->type&2) && env->envstruc->sustain == env->envstruc->loope)) // Break envelope if sustain pt == loop end point AND sustain is enabled AND key off is send { if (env->b==env->envstruc->loope) { env->a=env->envstruc->loops; env->b=env->envstruc->loops+1; env->step=env->envstruc->env[env->a][0]; return; } } } // sustain loop (IT) if ((env->envstruc->type&16)) { if (keyon) { if (env->b==env->envstruc->susloope) { env->a=env->envstruc->sustain; env->b=env->envstruc->sustain+1; env->step=env->envstruc->env[env->a][0]; return; } } } // Increase envelope position if there are more points to come if (env->b < env->envstruc->num - 1) { env->a++; env->b++; } //else //{ // // fuck you // printf("fuck"); //} } } else { if ((env->step!=env->envstruc->env[env->b][0]) && (env->b < env->envstruc->num)) env->step++; if (env->step == env->envstruc->env[env->b][0]) { // normal loop if ((env->envstruc->type&4)) { // check for envelope loop break (AMS) if ((!(env->envstruc->type&8) || keyon) && !(!keyon && (env->envstruc->type&2) && env->envstruc->sustain == env->envstruc->loope)) // Break envelope if sustain pt == loop end point AND sustain is enabled AND key off is send { if (env->b==env->envstruc->loope) { env->a=env->envstruc->loops; env->b=env->envstruc->loops+1; env->step=env->envstruc->env[env->a][0]; return; } } } // sustain loop (IT) if ((env->envstruc->type&16)) { if (keyon) // Break envelope if sustain pt == loop end point AND sustain is enabled AND key off is send { if (env->b==env->envstruc->susloope) { env->a=env->envstruc->sustain; env->b=env->envstruc->sustain+1; env->step=env->envstruc->env[env->a][0]; return; } } } // Increase envelope position if there are more points to come if (env->b < env->envstruc->num - 1) { env->a++; env->b++; } } } } } mp_sint32 PlayerIT::getenvval(TPrEnv *env,mp_sint32 n) { if (env->isEnabled()) { mp_sint32 step = env->step; if (step > env->envstruc->env[env->b][0]) step = env->envstruc->env[env->b][0]; mp_sint32 dx = (env->envstruc->env[env->b][0]-env->envstruc->env[env->a][0]); if (dx==0) dx=1; mp_sint32 t = (env->envstruc->env[env->b][0]-step)*65536/dx; mp_sint32 y0 = env->envstruc->env[env->a][1]; mp_sint32 y1 = env->envstruc->env[env->b][1]; mp_sint32 y = (y0*t)+(y1*(65536-t)); return y>>16; } return n; } mp_sint32 PlayerIT::getFinalPeriod(TChnState& state, mp_sint32 p) { mp_sint32 envVib = 0; p<<=8; if (state.vibenv.isEnabled()) { mp_sint32 eval = (getenvval(&state.vibenv,128)-128) << (state.vibenv.envstruc->type>>6); // AMS doc says vibrato with amplify set to 8 equals vibrato 0xF // => alright envVib = (eval*61408)>>(3+16-8); } if (state.avibused & 127) { // if this is XM style auto vibrato, the running counter is divided by 4 mp_ubyte vp = state.avibcnt >> ((state.avibused & 128) ? 0 : 2); mp_ubyte vd = state.avibdepth; mp_sint32 vm = 0; mp_sint32 vl = 0; switch (state.avibused & 127) { // sine case 1 : vl=vibtab[vp&31]; break; // square case 2 : vl=255; break; // ramp down case 3 : { vl=((vp&31)*539087)>>16; if ((vp&63)>31) vl=255-vl; vl=-vl; }; break; // ramp up case 4 : { vl=((vp&31)*539087)>>16; if ((vp&63)>31) vl=255-vl; }; break; } // IT style vibrato sweep if (state.avibused & 128) { if (state.avibsweep && state.avibswcnt < (vd << 8)) vm = (vl*state.avibswcnt)>>(1+8); else vm = (vl*vd)>>1; } // XM style vibrato sweep else { vm = (vl*vd)>>1; if (state.avibsweep) { vm*=(mp_sint32)state.avibswcnt * 256; vm/=state.avibsweep; vm>>=8; } } if ((vp&63)>31) vm=-vm; // IT style envelope and amiga periods? if (!(module->header.freqtab&1) && (state.avibused & 128)) { // vibrato value has 8 bit fractional part mp_uint32 vmi = vm >> 8; // convert fraction to 16 bit mp_uint32 vmf = (vm & 255) << 8; // table ranges from [-256..256] // elevate index to start by 0 mp_uint32 fac1 = powtab[vmi+256]; mp_uint32 fac2 = powtab[vmi+256+1]; // interpolate between two array values mp_uint32 fac = fixedmul(65536-vmf, fac1) + fixedmul(vmf, fac2); return (fixedmul(p<<8, fac)>>8) + envVib; // see ITTECH.TXT //double fac = pow(2.0, vm/(768.0*256.0)); //return (mp_sint32)(p*fac) + envVib; } // linear periods return (p+vm+envVib); } else return (p+envVib); } void PlayerIT::playInstrument(TModuleChannel* chnInf, bool bNoRestart/* = false*/) { const mp_sint32 ins = chnInf->getIns(); const mp_sint32 smp = chnInf->getSmp(); const mp_sint32 chn = chnInf->getPlaybackChannelIndex(); if (chn < 0 || !ins || ins > module->header.insnum) return; if (module->instr[ins-1].samp && smp != -1) { chnInf->resetFlag(CHANNEL_FLAGS_UPDATE_IGNORE); const mp_sint32 i = smp; // start out with the flags for 16bit sample mp_sint32 flags = ((module->smp[i].type&16)>>4)<<2; // add looping + backward flags flags |= module->smp[i].type&(3+128); // one shot forward looping? flags |= module->smp[i].type & 32; // force forward playing if (chnInf->isFlagSet(CHANNEL_FLAGS_FORCE_FORWARD)) flags &= ~128; // force backward playing if (chnInf->isFlagSet(CHANNEL_FLAGS_FORCE_BACKWARD)) flags |= 128; if (flags&3) { if (chnInf->isFlagSet(CHANNEL_FLAGS_FORCE_BILOOP)) flags = (flags & ~3) | 2; // bNoRestart = false means play new sample from beginning or sample offset if (!bNoRestart) { playSample(chn, (mp_sbyte*)module->smp[i].sample, module->smp[i].samplen, chnInf->smpoffs + chnInf->smpoffshigh, 0, // sample offset fraction !playModeChopSampleOffset, module->smp[i].loopstart, module->smp[i].loopstart+module->smp[i].looplen, flags); } // bNoRestart = true means play new sample from beginning of the last sample else { mp_sint32 smpoffset = chnInf->smpoffs ? (chnInf->smpoffs+chnInf->smpoffshigh) : getSamplePos(chn); mp_sint32 smpoffsetfrac = chnInf->smpoffs ? 0 : getSamplePosFrac(chn); playSample(chn, (mp_sbyte*)module->smp[i].sample, module->smp[i].samplen, smpoffset, smpoffsetfrac, // sample offset fraction true, module->smp[i].loopstart, module->smp[i].loopstart+module->smp[i].looplen, flags); } } else { // bNoRestart = false means play new sample from beginning or sample offset if (!bNoRestart) { playSample(chn,(mp_sbyte*)module->smp[i].sample, module->smp[i].samplen, chnInf->smpoffs + chnInf->smpoffshigh, 0, // sample offset fraction !playModeChopSampleOffset, 0, module->smp[i].samplen, flags); } // bNoRestart = true means play new sample from beginning of the last sample AND don't ramp volume up else { mp_sint32 smpoffset = chnInf->smpoffs ? (chnInf->smpoffs+chnInf->smpoffshigh) : getSamplePos(chn); mp_sint32 smpoffsetfrac = chnInf->smpoffs ? 0 : getSamplePosFrac(chn); playSample(chn,(mp_sbyte*)module->smp[i].sample, module->smp[i].samplen, smpoffset, smpoffsetfrac, // sample offset fraction true, 0, module->smp[i].samplen, flags); } } } else { stopSample(chn); } } void PlayerIT::updatePlayModeFlags() { // the following flags are exclusive newInsPTFlag = (module->header.flags & XModule::MODULE_PTNEWINSTRUMENT); newInsST3Flag = (module->header.flags & XModule::MODULE_ST3NEWINSTRUMENT); oldPTInsChangeFlag = (module->header.flags & XModule::MODULE_OLDPTINSTRUMENTCHANGE); // 4-channel Protracker module = EXACT PTK replay should be applied playModePT = ((module->header.flags & XModule::MODULE_PTNEWINSTRUMENT) && (module->header.channum == 4) && playMode == PlayMode_Auto) || (playMode == PlayMode_ProTracker2) || (playMode == PlayMode_ProTracker3); // This is a module with PTK limits playModePTPitchLimit = ((module->header.flags & XModule::MODULE_PTNEWINSTRUMENT) && playMode == PlayMode_Auto) || (playMode == PlayMode_ProTracker2) || (playMode == PlayMode_ProTracker3); // Override module playmode settings switch (playMode) { case PlayMode_ProTracker2: newInsPTFlag = true; newInsST3Flag = false; oldPTInsChangeFlag = true; break; case PlayMode_ProTracker3: newInsPTFlag = true; newInsST3Flag = false; oldPTInsChangeFlag = false; break; case PlayMode_ScreamTracker3: case PlayMode_ImpulseTracker: newInsPTFlag = false; newInsST3Flag = true; oldPTInsChangeFlag = false; break; case PlayMode_FastTracker2: newInsPTFlag = false; newInsST3Flag = false; oldPTInsChangeFlag = false; break; case PlayMode_Auto: break; } playModeFT2 = (playMode == PlayMode_FastTracker2 ? true : false); if (playMode == PlayMode_Auto && (module->header.flags & XModule::MODULE_XMARPEGGIO)) playModeFT2 = true; // Chop off samples which sample offsets greater sample length? playModeChopSampleOffset = playModeFT2 || (playMode == PlayMode_ProTracker3); } mp_sint32 PlayerIT::calcVibrato(TModuleChannel* chnInf, mp_sint32 effcnt, mp_sint32 depthShift/* = 5*/) { mp_sint32 vp = chnInf->vibpos[effcnt]; mp_sint32 vd = chnInf->vibdepth[effcnt]; mp_sint32 vm = (vibtab[vp&31]*vd) >> ((module->header.flags & XModule::MODULE_ITNEWEFFECTS) ? (depthShift+1) : depthShift); if ((vp&63)>31) vm=-vm; return vm; } void PlayerIT::doTickVolslidePT(TModuleChannel* chnInf, mp_sint32 effcnt) { mp_ubyte x = chnInf->old[effcnt].volslide>>4; mp_ubyte y = chnInf->old[effcnt].volslide&0xf; // 08/31/04: fixed... // don't reject volume slide if both operands are set // instead, slide up // see other volume slides as well if (x&&y) y = 0; if (ticker) { if (x) { chnInf->incVol(x*4); } if (y) { chnInf->decVol(y*4); } chnInf->adjustTremoloTremorVol(); } } void PlayerIT::doTickVolslideST(TModuleChannel* chnInf, mp_sint32 effcnt) { if (!(module->header.flags & XModule::MODULE_OLDS3MVOLSLIDES) && ticker == 0) return; mp_ubyte x = chnInf->old[effcnt].volslide>>4; mp_ubyte y = chnInf->old[effcnt].volslide&0xf; if (x == 0xF && y) return; if (y == 0xF && x) return; if (x && y) y = 0; if (x) { chnInf->incVol(x*4); } if (y) { chnInf->decVol(y*4); } chnInf->adjustTremoloTremorVol(); } void PlayerIT::doTickEffect(TModuleChannel* chnInf, mp_sint32 effcnt) { const mp_sint32 chn = chnInf->getPlaybackChannelIndex(); mp_ubyte x,y; mp_ubyte vp,vd; mp_sint32 vm; // IN PTK playmode, we've got a bunch of tick 0 effects // which are repeated as long as the pattern delay applies // ONLY valid for PTK playmode & effects, for other effects this leads to undefined results if (playModePT) { if (patDelay && ticker && // Those effects are NOT executed chnInf->eff[effcnt] > 0x09 && chnInf->eff[effcnt] != 0x33 && chnInf->eff[effcnt] != 0x34 && chnInf->eff[effcnt] != 0x35 && chnInf->eff[effcnt] != 0x36 && chnInf->eff[effcnt] != 0x37 && chnInf->eff[effcnt] != 0x38 && chnInf->eff[effcnt] < 0x3C) { if (!(ticker % tickSpeed)) doEffect(chnInf, effcnt); } } switch (chnInf->eff[effcnt]) { // portamento up case 0x01: if (ticker) { chnInf->decPer(chnInf->old[effcnt].portaup*4); handlePeriodUnderflow(chnInf); chnInf->adjustVibratoPer(); } break; // portamento down case 0x02: if (ticker) { chnInf->incPer(chnInf->old[effcnt].portadown*4); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); } break; // note portamento case 0x03: { if (ticker&&chnInf->destnote) { // If this is an XM module we need to store the last portamento operand always in the buffer for the second effect mp_sint32 op = ((module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) && numEffects == 2) ? chnInf->old[1].portanote : chnInf->old[effcnt].portanote; chnInf->slideToPer(op*4); chnInf->adjustVibratoPer(); } break; } // vibrato (applying extra hacks for XM compatibility) // In FT2 the vibrato contained in the volume column works a bit different // than the vibrato in the effect column: // After the vibrato has occured in the volumn column the pitch of the last // vibrato calculation stays on until the next pitch effect occurs case 0x04: { x = chnInf->eop[effcnt]>>4; y = chnInf->eop[effcnt]&0xf; mp_sint32 effNum = effcnt; // in FT2 play mode the last vibrato // value comes always from the effect column (index 1) if ((module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) && numEffects == 2) { effNum = 1; } if (x) chnInf->vibspeed[effNum]=x; if (y) chnInf->vibdepth[effNum]=y; mp_sint32 vmp = chnInf->getPer(); vm = calcVibrato(chnInf, effNum); if (ticker || (module->header.flags & XModule::MODULE_ITNEWEFFECTS)) chnInf->vibpos[effNum]+=chnInf->vibspeed[effNum]; vmp+=vm; mp_sint32 maxTicks = patDelay ? patDelayCount : tickSpeed; // the vibrato in the volumn volumn (index 0) works differently // before applying that, we assure that this is an XM module by checking // the module header if ((module->header.flags & XModule::MODULE_XMVOLCOLUMNVIBRATO) && ticker == maxTicks - 1) { if (!effcnt) chnInf->setFinalVibratoPer(vmp); else chnInf->adjustVibratoPer(); } if (chn >= 0) setFreq(chn,getFinalFreq(chnInf->chnstat(),getFinalPeriod(chnInf->chnstat(),vmp))); break; } // note porta + volume slide case 0x05: { if (ticker&&chnInf->destnote) { // If this is an XM module we need to store the last portamento operand always in the buffer for the second effect mp_sint32 op = (module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) ? chnInf->old[1].portanote : chnInf->old[effcnt].portanote; chnInf->slideToPer(op*4); chnInf->adjustVibratoPer(); } if (module->header.flags & XModule::MODULE_ST3DUALCOMMANDS) doTickVolslideST(chnInf, effcnt); else doTickVolslidePT(chnInf, effcnt); break; } // vibrato + volume slide case 0x06: { vm = calcVibrato(chnInf, effcnt); if (ticker) chnInf->vibpos[effcnt]+=chnInf->vibspeed[effcnt]; if (chn >= 0) setFreq(chn,getFinalFreq(chnInf->chnstat(),getFinalPeriod(chnInf->chnstat(),chnInf->getPer()+vm))); if (module->header.flags & XModule::MODULE_ST3DUALCOMMANDS) doTickVolslideST(chnInf, effcnt); else doTickVolslidePT(chnInf, effcnt); break; } // tremolo, this is not the exact FT2 way. FT2 way doesn't make sense at all, fuck it // (applying extra hacks for XM compatibility) case 0x07: { x = chnInf->eop[effcnt]>>4; y = chnInf->eop[effcnt]&0xf; if (x) chnInf->trmspeed[effcnt]=x; if (y) chnInf->trmdepth[effcnt]=y; vp = chnInf->trmpos[effcnt]; vd = chnInf->trmdepth[effcnt]; mp_sint32 vmp = playModeFT2 ? (ticker == 0 ? chnInf->getVolume() : chnInf->getTremoloVol()) : chnInf->getVolume(); // IT in new effects mode processes at non row tick if (ticker || (module->header.flags & XModule::MODULE_ITNEWEFFECTS)) { // IT in new effects mode is two times finer vm = (vibtab[vp&31]*vd) >> ((module->header.flags & XModule::MODULE_ITNEWEFFECTS) ? (6-1) : (6-2)); if ((vp&63)>31) vm=-vm; vmp+=vm; if (vmp<0) vmp=0; if (vmp>255) vmp=255; chnInf->trmpos[effcnt]+=chnInf->trmspeed[effcnt]; } // FT2 hack... final tremolo volume stays on if (playModeFT2 && (ticker == tickSpeed - 1)) { chnInf->setFinalTremVol(vmp); } if (chn >= 0) setVol(chn, getFinalVolume(chnInf->chnstat(), vmp, mainVolume)); break; } // volume slide case 0x0A: { doTickVolslidePT(chnInf, effcnt); break; } // global volume slide case 0x11: { x = chnInf->old[effcnt].gvolslide>>4; y = chnInf->old[effcnt].gvolslide&0xf; if (x&&y) y = 0; if (ticker) { if (x) { mainVolume+=x*4; if (mainVolume>255) mainVolume=255; } if (y) { mainVolume-=y*4; if (mainVolume<0) mainVolume=0; } } break; } // deal with eventual tempo slide case 0x16: { if (!ticker || chnInf->old[effcnt].temposlide >= 0x20 || !(module->header.flags & XModule::MODULE_ITTEMPOSLIDE)) break; x = chnInf->old[effcnt].temposlide>>4; y = chnInf->old[effcnt].temposlide&0xf; switch (x >> 4) { case 0: bpm-=y & 0x0F; if (bpm < 32) bpm = 32; break; case 1: bpm+=y & 0x0F; if (bpm > 255) bpm = 255; break; } this->adder = getbpmrate(bpm); break; } // panning slide case 0x19: { x = chnInf->old[effcnt].panslide>>4; y = chnInf->old[effcnt].panslide&0xf; if (x&&y) y = 0; if (ticker) { if (x) { chnInf->incPan(x); } if (y) { chnInf->decPan(y); } } break; } // retrig + volslide (I worked my ass OFF on this fucking shit) // A few notes about FT2 playback: // Rxx Retrig doesn't restart envelopes, even with instrument set // It only retrigs if the last note has been been within valid range: 1 <= note <= XModule::NOTE_LAST case 0x1B: { if ((chnInf->old[effcnt].retrig&0xf)) { if (chnInf->retrigcounterRxx[effcnt] >= chnInf->retrigmaxRxx[effcnt]) { chnInf->retrigcounterRxx[effcnt] = 0; chnInf->retrigmaxRxx[effcnt] = chnInf->old[effcnt].retrig&0xf; switch (chnInf->old[effcnt].retrig>>4) { case 0x1 : chnInf->decVol(4); break; case 0x2 : chnInf->decVol(8); break; case 0x3 : chnInf->decVol(16); break; case 0x4 : chnInf->decVol(32); break; case 0x5 : chnInf->decVol(64); break; case 0x6 : chnInf->setVol(chnInf->getVol()*2/3); break; case 0x7 : chnInf->setVol(chnInf->getVol()>>1); break; case 0x9 : chnInf->incVol(4); break; case 0xA : chnInf->incVol(8); break; case 0xB : chnInf->incVol(16); break; case 0xC : chnInf->incVol(32); break; case 0xD : chnInf->incVol(64); break; case 0xE : { mp_sint32 vol = (chnInf->getVol()*3) >> 1; if (vol > 255) vol = 255; chnInf->setVol(vol); break; } case 0xF : { mp_sint32 vol = chnInf->getVol() << 1; if (vol > 255) vol = 255; chnInf->setVol(vol); break; } } chnInf->adjustTremoloTremorVol(); if (chnInf->validnote) playInstrument(chnInf); } chnInf->retrigcounterRxx[effcnt]++; } break; } // tremor (I worked my ass OFF on this fucking shit) case 0x1D: { x = (chnInf->old[effcnt].tremor>>4) + 1; y = (chnInf->old[effcnt].tremor&0xf) + 1; mp_sint32 v = (ticker == 0 ? chnInf->getVol() : chnInf->getTremorVol()); if (ticker && chnInf->tremorcnt[effcnt] % (x+y) >= x) v = 0; if (ticker) chnInf->tremorcnt[effcnt]++; if (ticker == tickSpeed - 1) { chnInf->setVol(v); chnInf->adjustTremoloVol(); } if (chn >= 0) setVol(chn,getFinalVolume(chnInf->chnstat(), v, mainVolume)); break; } // MDL/IT Subcommands case 0x1E: { mp_ubyte eff = chnInf->eop[effcnt]>>4; mp_ubyte eop = chnInf->eop[effcnt]&0xf; switch (eff) { case 0x1 : if (ticker) { chnInf->decPan(eop); } break; case 0x2 : if (ticker) { chnInf->incPan(eop); } break; case 0xA : if (ticker) { mainVolume+=eop; if (mainVolume>255) mainVolume=255; } break; case 0xB : if (ticker) { mainVolume-=eop; if (mainVolume<0) mainVolume=0; } break; } break; } // arpeggio case 0x20: { if (chnInf->getNote()) { mp_ubyte arpegLUT[3]; mp_sint32 r = 0; mp_sint32 note = 0, onote = chnInf->getNote(); //mp_sint32 c4spd = chnInf->c4spd; mp_sint32 relnote = chnInf->getRelnote(); mp_sint32 finetune = chnInf->getFinetune(); mp_sint32 per,nper; mp_ubyte eop = chnInf->old[effcnt].arpeg; mp_sint32 x = eop>>4; mp_sint32 y = eop&0xf; if (playModeFT2) { // dammit, FT2 arpeggios are so screwed: // the first 11 tick speeds and their arpeggio patterns (0 is note, 3 is fx digit 3, 2 is fx digit 2): // 0: Totally fucked up. Just test it. // 1: 0 // 2: 02 // 3: 032 // 4: 0032 // 5: 02320 // 6: 032032 // 7: 0032032 // 8: 02032032 // 9: 032032032 // A: 0032032032 if (ticker == 0) r = 0; else r = myMod(ticker-tickSpeed,3); arpegLUT[0] = 0; arpegLUT[1] = 2; arpegLUT[2] = 1; } else { r = (ticker)%3; arpegLUT[0] = 0; arpegLUT[1] = 1; arpegLUT[2] = 2; } if (arpegLUT[r] == 0) { note=chnInf->getNote(); } else if (arpegLUT[r] == 1) { note=chnInf->getNote()+x; } else if (arpegLUT[r] == 2) { note=chnInf->getNote()+y; } // Perform note clipping for XM note range if necessary if ((arpegLUT[r] != 0) && // Only done for arpeggio tick 1 & 2 (module->header.flags & XModule::MODULE_XMNOTECLIPPING) && // Only when enabled (note + relnote > 96)) // Only when exceeding range { note-=((note+relnote) - 97); } // special case for STM arpeggio (thanks to Skaven/FC) // Will not work in combination with other period // related effects if (module->header.flags & XModule::MODULE_STMARPEGGIO) { chnInf->setPer(getperiod(note,relnote,finetune)); if (chn >= 0) setFreq(chn,getFinalFreq(chnInf->chnstat(),getFinalPeriod(chnInf->chnstat(),chnInf->getPer()))); } else { nper=getperiod(note,relnote,finetune); per=getperiod(onote,relnote,finetune); //nper = (8363*periods[(note-1)%12]*16>>(((note-1)/12)))/c4spd; //per = (8363*periods[(onote-1)%12]*16>>(((onote-1)/12)))/c4spd; nper-=per; nper+=chnInf->getPer(); if (chn >= 0) setFreq(chn,getFinalFreq(chnInf->chnstat(),getFinalPeriod(chnInf->chnstat(),nper))); } } break; } // normal retrig // A few notes about FT2 playback: // E9x Retrig does!!! (while Rxx doesn't) restart envelopes, even without instrument set // It only retrigs if the last note has been been within valid range: 1 <= note <= XModule::NOTE_LAST case 0x39: { if ((chnInf->eop[effcnt]&0xf) && ticker) { if (chnInf->retrigcounterE9x[effcnt] >= chnInf->retrigmaxE9x[effcnt]) { chnInf->retrigcounterE9x[effcnt] = 0; chnInf->retrigmaxE9x[effcnt] = chnInf->eop[effcnt]&0xf; // trigger envelopes ALWAYS triggerInstrumentFX(chnInf); chnInf->setKeyon(true); // trigger replay only when last note has been valid if (chnInf->validnote) playInstrument(chnInf); } chnInf->retrigcounterE9x[effcnt]++; } break; } // note cut case 0x3C: // S3M ignores tick 0 note cut if ((module->header.flags & XModule::MODULE_ST3NOTECUT) && !chnInf->eop[effcnt]) break; // Fasttracker cuts note at tick 0 //if (chnInf->eop[effcnt]) { if (ticker == chnInf->eop[effcnt]) { chnInf->setVol(0); chnInf->adjustTremoloTremorVol(); } //} break; // MDL porta up case 0x43: if (ticker) { if (chnInf->old[effcnt].portaup<=0xDF) { chnInf->decPer(chnInf->old[effcnt].portaup*4); handlePeriodUnderflow(chnInf); chnInf->adjustVibratoPer(); } } break; // MDL porta down case 0x44: if (ticker) { if (chnInf->old[effcnt].portaup<=0xDF) { chnInf->incPer(chnInf->old[effcnt].portaup*4); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); } } break; // MDL volslide up case 0x45: if (ticker) { if (chnInf->old[effcnt].volslide<=0xDF) { chnInf->incVol(chnInf->old[effcnt].volslide); chnInf->adjustTremoloTremorVol(); } } break; // MDL volslide down case 0x46: if (ticker) { if (chnInf->old[effcnt].volslide<=0xDF) { chnInf->decVol(chnInf->old[effcnt].volslide); chnInf->adjustTremoloTremorVol(); } } break; // S3M porta up case 0x47: if (ticker) { const mp_sint32 effidx = ((module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) && numEffects == 2) ? 1 : effcnt; mp_ubyte* op = (module->header.flags & XModule::MODULE_ITLINKPORTAMEM) ? &chnInf->old[effidx].portanote : &chnInf->old[effidx].portaup; if (*op<=0xDF) { chnInf->decPer(*op*4); // Special for ST3 if (chnInf->getPer() <= 0 && chn >= 0) stopSample(chn); chnInf->adjustVibratoPer(); } } break; // S3M porta down case 0x48: if (ticker) { const mp_sint32 effidx = ((module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) && numEffects == 2) ? 1 : effcnt; mp_ubyte* op = (module->header.flags & XModule::MODULE_ITLINKPORTAMEM) ? &chnInf->old[effidx].portanote : &chnInf->old[effidx].portaup; if (*op<=0xDF) { chnInf->incPer(*op*4); chnInf->adjustVibratoPer(); } } break; // S3M volslide case 0x49: { doTickVolslideST(chnInf, effcnt); break; } // fine vibrato case 0x4A: { x = chnInf->eop[effcnt]>>4; y = chnInf->eop[effcnt]&0xf; if (x) chnInf->vibspeed[effcnt]=x; if (y) chnInf->vibdepth[effcnt]=y; mp_sint32 vmp = chnInf->getPer(); vm = calcVibrato(chnInf, effcnt, 7); vp = chnInf->vibpos[effcnt]; if (ticker || (module->header.flags & XModule::MODULE_ITNEWEFFECTS)) chnInf->vibpos[effcnt]+=chnInf->vibspeed[effcnt]; vmp+=vm; if (chn >= 0) setFreq(chn,getFinalFreq(chnInf->chnstat(),getFinalPeriod(chnInf->chnstat(),vmp))); break; } // high precision portamento up case 0x4D: if (ticker) { chnInf->decPer(chnInf->old[effcnt].portaup); handlePeriodUnderflow(chnInf); chnInf->adjustVibratoPer(); } break; // high precision portamento down case 0x4E: if (ticker) { chnInf->incPer(chnInf->old[effcnt].portaup); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); } break; // XM: Key off at tick case 0x14: // not at tick 0 if (!ticker) break; // AMS: Key off at tick case 0x51: if (ticker == chnInf->eop[effcnt]) { if (chnInf->getVenv().envstruc!=NULL) { if (!chnInf->getVenv().isEnabled()) chnInf->setVol(0); } else chnInf->setVol(0); chnInf->adjustTremoloTremorVol(); chnInf->setKeyon(false); } break; // Oktalyzer arpeggio I, II, III case 0x56: case 0x57: case 0x58: { if (chnInf->getNote()) { mp_sint32 eff = chnInf->eff[effcnt]-0x56; mp_sint32 r; if (eff == 1) r = (ticker)&3; else r = (ticker)%3; mp_sint32 note = 0,onote = chnInf->getNote(); mp_sint32 relnote = chnInf->getRelnote(); mp_sint32 finetune = chnInf->getFinetune(); mp_sint32 per,nper; mp_ubyte eop = chnInf->eop[effcnt]; mp_sint32 x = eop>>4; mp_sint32 y = eop&0xf; switch (eff) { case 0x00: { switch (r) { case 0 : note=chnInf->getNote()-x; break; case 1 : note=chnInf->getNote(); break; case 2 : note=chnInf->getNote()+y; break; } break; } case 0x01: { switch (r) { case 0 : note=chnInf->getNote(); break; case 1 : note=chnInf->getNote()+y; break; case 2 : note=chnInf->getNote(); break; case 3 : note=chnInf->getNote()-x; break; } break; } case 0x02: { switch (r) { case 0 : note=chnInf->getNote()+y; break; case 1 : note=chnInf->getNote()+y; break; case 2 : note=chnInf->getNote(); break; } break; } } nper=getperiod(note,relnote,finetune); per=getperiod(onote,relnote,finetune); nper-=per; nper+=chnInf->getPer(); if (chn >= 0) setFreq(chn,getFinalFreq(chnInf->chnstat(),getFinalPeriod(chnInf->chnstat(),nper))); } break; } // Global volslide case 0x59: { if (!(module->header.flags & XModule::MODULE_OLDS3MVOLSLIDES) && ticker == 0) break; x = chnInf->old[effcnt].gvolslide>>4; y = chnInf->old[effcnt].gvolslide&0xf; if (x == 0xF && y) break; if (y == 0xF && x) break; if (x && y) y = 0; if (x) { // IT modules increment by 2, all others by 4 mainVolume+=x*((module->header.flags & XModule::MODULE_ITNOTEOFF) ? 2 : 4); if (mainVolume>255) mainVolume=255; } if (y) { // IT modules decrement by 2, all others by 4 mainVolume-=y*((module->header.flags & XModule::MODULE_ITNOTEOFF) ? 2 : 4); if (mainVolume<0) mainVolume=0; } break; } // IT/S3M Channel volslide case 0x5A: { if (!(module->header.flags & XModule::MODULE_OLDS3MVOLSLIDES) && ticker == 0) break; x = chnInf->old[effcnt].chnvolslide>>4; y = chnInf->old[effcnt].chnvolslide&0xf; if (x == 0xF && y) break; if (y == 0xF && x) break; if (x && y) y = 0; if (x) { chnInf->incMasterVol(x*4); } if (y) { chnInf->decMasterVol(y*4); } break; } // IT panning slide case 0x5B: { if (!(module->header.flags & XModule::MODULE_OLDS3MVOLSLIDES) && ticker == 0) break; x = chnInf->old[effcnt].panslide>>4; y = chnInf->old[effcnt].panslide&0xf; if (x == 0xF && y) break; if (y == 0xF && x) break; if (x && y) y = 0; if (x) { chnInf->decPan(x*4); } if (y) { chnInf->incPan(y*4); } break; } // panbrello (Impulse Tracker only) case 0x5C: { x = chnInf->eop[effcnt]>>4; y = chnInf->eop[effcnt]&0xf; if (x) chnInf->panbrellospeed[effcnt]=x; if (y) chnInf->panbrellodepth[effcnt]=y; vp = chnInf->panbrellopos[effcnt]; vd = chnInf->panbrellodepth[effcnt]; mp_sint32 vmp = chnInf->getPan(); // IT in new effects mode processes at non row tick if (ticker || (module->header.flags & XModule::MODULE_ITNEWEFFECTS)) { // IT in new effects mode is two times finer vm = (finesintab[vp&255]*vd) >> ((module->header.flags & XModule::MODULE_ITNEWEFFECTS) ? (3-1) : (3-2)); vmp+=vm; if (vmp<0) vmp=0; if (vmp>255) vmp=255; chnInf->panbrellopos[effcnt]+=chnInf->panbrellospeed[effcnt]; } if (chn >= 0) setPan(chn, getFinalPanning(chnInf->chnstat(), vmp)); break; } } } void PlayerIT::doVolslidePT(TModuleChannel* chnInf, mp_sint32 effcnt, mp_ubyte eop) { if (eop) chnInf->old[effcnt].volslide=eop; } void PlayerIT::doVolslideST(TModuleChannel* chnInf, mp_sint32 effcnt, mp_ubyte eop) { if (eop) chnInf->old[effcnt].volslide=eop; if (chnInf->old[effcnt].volslide) { mp_ubyte y=chnInf->old[effcnt].volslide>>4; mp_ubyte x=chnInf->old[effcnt].volslide&0xf; if ((x!=0x0F)&&(y!=0x0F)) return; if (x==0x0F && !y) return; if (y==0x0F && !x) return; if (x==0x0F) { chnInf->incVol(y*4); chnInf->adjustTremoloTremorVol(); return; } if (y==0x0F) { chnInf->decVol(x*4); chnInf->adjustTremoloTremorVol(); return; } } } void PlayerIT::doEffect(TModuleChannel* chnInf, mp_sint32 effcnt) { const mp_sint32 chn = chnInf->getPlaybackChannelIndex(); mp_ubyte x,y; mp_sint32 eop=chnInf->eop[effcnt]; switch (chnInf->eff[effcnt]) { case 0x01 : if (eop) chnInf->old[effcnt].portaup=eop; break; case 0x02 : if (eop) chnInf->old[effcnt].portadown=eop; break; case 0x03 : if (module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) { ASSERT(numEffects >= 2); if (eop) chnInf->old[1].portanote=eop; } else { if (eop) chnInf->old[effcnt].portanote=eop; } break; case 0x05 : case 0x06 : { if (module->header.flags & XModule::MODULE_ST3DUALCOMMANDS) doVolslideST(chnInf, effcnt, eop); else doVolslidePT(chnInf, effcnt, eop); break; } case 0x08 : if (options[PlayModeOptionPanning8xx]) chnInf->setPan(eop); break; case 0x09 : { if (eop) chnInf->old[effcnt].smpoffset = eop; chnInf->smpoffs = chnInf->old[effcnt].smpoffset<<8; }; break; case 0x0A : doVolslidePT(chnInf, effcnt, eop); break; case 0x0B : { pjump = 1; pjumppos = eop; pjumprow = 0; pjumpPriority = MP_NUMEFFECTS*chnInf->channelIndex + effcnt; }; break; case 0x0C : chnInf->setVol(eop); chnInf->adjustTremoloTremorVol(); chnInf->hasSetVolume = true; break; case 0x0D : { pbreak=1; pbreakpos = (eop>>4)*10+(eop&0xf); if (pbreakpos > 63) pbreakpos = 0; pbreakPriority = MP_NUMEFFECTS*chnInf->channelIndex + effcnt; }; break; case 0x0F : { if (eop) { if (eop>=32) { bpm=eop; this->adder = getbpmrate(eop); } } else { haltFlag = true; } }; break; case 0x10 : mainVolume=eop; break; case 0x11 : if (eop) chnInf->old[effcnt].gvolslide=eop; break; // set envelope position case 0x15 : { if (chnInf->getVenv().envstruc == NULL) break; bool bSet = false; TPrEnv* env = &chnInf->getVenv(); for (mp_sint32 i = 0; i < env->envstruc->num-1; i++) { if (eop >= env->envstruc->env[i][0] && eop < env->envstruc->env[i+1][0]) { env->a = i; env->b = i+1; env->step = eop; bSet = true; break; } } if (!bSet) { // if position is beyond the last envelope point // we limit it to the last point and exit bool beyond = eop > env->envstruc->env[env->envstruc->num-1][0]; env->a = env->envstruc->num-1; env->b = env->envstruc->num; env->step = env->envstruc->env[env->envstruc->num-1][0]; if (beyond) break; } // check if we set envelope position to a loop end point // in that case wrap to the loop start, otherwise the loop // end is skipped and the envelope will roll out without // looping if ((env->envstruc->type & 4) && env->step == env->envstruc->env[env->envstruc->loope][0]) { env->a=env->envstruc->loops; env->b=env->envstruc->loops+1; env->step=env->envstruc->env[env->a][0]; } break; } // set BPM case 0x16 : { if (eop) { chnInf->old[effcnt].temposlide = eop; if ((module->header.flags & XModule::MODULE_ITTEMPOSLIDE) && eop < 0x20) break; bpm=eop; this->adder = getbpmrate(eop); } }; break; case 0x19 : if (eop) chnInf->old[effcnt].panslide=eop; break; case 0x1B : { x = eop & 0xf; y = eop & 0xF0; if (x) chnInf->old[effcnt].retrig = (chnInf->old[effcnt].retrig & 0xF0) | x; if (y) chnInf->old[effcnt].retrig = (chnInf->old[effcnt].retrig & 0x0F) | y; eop = chnInf->old[effcnt].retrig; chnInf->retrigmaxRxx[effcnt] = eop & 0xF; // Simulate really nasty FT2 bug: // When a volume is set in the volume column // the interval for the first retrig is lengthen by one tick if (chnInf->hasSetVolume && playModeFT2) { chnInf->retrigcounterRxx[effcnt] = -1; chnInf->hasSetVolume = false; } // If a note is playing on tick 0, increase counter if (chnInf->currentnote && chnInf->validnote) chnInf->retrigcounterRxx[effcnt]++; break; } // Tremor case 0x1D : if (eop) chnInf->old[effcnt].tremor=eop; break; // MDL/IT Subcommands case 0x1E: { mp_ubyte eff = chnInf->eop[effcnt] >> 4; mp_ubyte eop = chnInf->eop[effcnt] & 0xf; switch (eff) { // past note actions/envelope trigger control etc. case 0x7: { switch (eop) { case 0x0: case 0x1: case 0x2: handlePastNoteAction(chnInf, eop); break; // set NNA to cut/continue/note off/note fade case 0x3: case 0x4: case 0x5: case 0x6: // clear out bits 4 and 5 // shift new NNA value into the position chnInf->setInsflags((chnInf->getInsflags() & ~(3 << 4)) | ((eop-0x03) << 4)); break; // turn off volume envelope case 0x7: chnInf->getVenv().setEnabled(false); break; // turn on volume envelope case 0x8: chnInf->getVenv().setEnabled(true); break; // turn off panning envelope case 0x9: chnInf->getPenv().setEnabled(false); break; // turn on panning envelope case 0xA: chnInf->getPenv().setEnabled(true); break; // turn off pitch envelope case 0xB: chnInf->getPitchenv().setEnabled(false); break; // turn on pitch envelope case 0xC: chnInf->getPitchenv().setEnabled(true); break; } break; } // set high sample offset case 0xF: { chnInf->smpoffshigh = (mp_uint32)eop << 16; break; } } break; } // MDL set sample offset case 0x1F : { chnInf->smpoffs=((mp_sint32)eop<<8)+((mp_sint32)chnInf->eop[(effcnt+1)%numEffects]<<16); }; break; case 0x20 : if (eop) chnInf->old[effcnt].arpeg=eop; break; // ULT set sample offset case 0x21 : { chnInf->smpoffs=((mp_sint32)eop<<10); }; break; // ULT Fine set sample offset case 0x22 : { mp_sint32 op = (((mp_sint32)eop)<<8) + ((mp_sint32)chnInf->eop[(effcnt+1)%numEffects]); chnInf->smpoffs=op<<2; }; break; // ULT special commands case 0x23 : { if (((eop >> 4) == 1 || (eop&0xF) == 1) || ((eop >> 4) == 12 || (eop&0xF) == 12)) { if (chn < 0) break; breakLoop(chn); } if ((eop >> 4) == 2 || (eop&0xF) == 2) { chnInf->resetFlag(CHANNEL_FLAGS_FORCE_FORWARD); chnInf->setFlag(CHANNEL_FLAGS_FORCE_BACKWARD); if (chn < 0) break; setBackward(chn); } }; break; // Far position jump (PLM support) case 0x2B : { pjump = 1; pjumppos = eop; pjumprow = chnInf->eop[(effcnt+1)%numEffects]; pjumpPriority = MP_NUMEFFECTS*chnInf->channelIndex + effcnt; }; break; // Fine porta up case 0x31 : { if (eop) chnInf->old[effcnt].fineportaup=eop; chnInf->decPer(chnInf->old[effcnt].fineportaup*4); handlePeriodUnderflow(chnInf); chnInf->adjustVibratoPer(); }; break; // Fine porta down case 0x32 : { if (eop) chnInf->old[effcnt].fineportadown=eop; chnInf->incPer(chnInf->old[effcnt].fineportadown*4); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); }; break; case 0x36 : { mp_ubyte op = eop; // Imitate IT/ST3 behaviour // not only S60 can be the loop start point // if we jump back to the start row, ignore the argument of this S6x if (newInsST3Flag && (chnInf->loopstart==rowcnt) && chnInf->isLooping) op = 0; if (!op) { chnInf->execloop=0; chnInf->loopstart=rowcnt; chnInf->loopingValidPosition = poscnt; } else { if (chnInf->loopcounter==op) { // Imitate nasty XM bug here: if (playModeFT2) { startNextRow = chnInf->loopstart; } RESETLOOPING // Imitate IT/ST3 behaviour // not only S60 can be the loop start point if (newInsST3Flag) { chnInf->execloop=0; chnInf->loopstart=rowcnt; chnInf->loopingValidPosition = poscnt; } } else { chnInf->execloop=1; chnInf->loopcounter++; } } }; break; case 0x38 : if (options[PlayModeOptionPanningE8x]) chnInf->setPan((mp_ubyte)XModule::pan15to255(eop)); break; case 0x39 : { chnInf->retrigcounterE9x[effcnt] = 0; if (eop) { chnInf->retrigmaxE9x[effcnt] = eop & 0xF; // If a note is playing on tick 0, increase counter if (chnInf->currentnote && chnInf->validnote) chnInf->retrigcounterE9x[effcnt]++; } else if (!chnInf->currentnote) { // trigger envelopes ALWAYS triggerInstrumentFX(chnInf); chnInf->setKeyon(true); // trigger replay only when last note has been valid if (chnInf->validnote) playInstrument(chnInf); } }; break; case 0x3A : { if (eop) chnInf->old[effcnt].finevolslide=eop; chnInf->incVol(chnInf->old[effcnt].finevolslide*4); chnInf->adjustTremoloTremorVol(); }; break; case 0x3B : { if (eop) chnInf->old[effcnt].finevolslide=eop; chnInf->decVol(chnInf->old[effcnt].finevolslide*4); chnInf->adjustTremoloTremorVol(); }; break; // Note delay triggers envelopes/autovibrato/fade out again case 0x3D : { triggerInstrumentFX(chnInf); chnInf->setKeyon(true); }; break; case 0x3E : { patDelay = true; patDelayCount = (mp_sint32)tickSpeed*((mp_sint32)eop+1); }; break; // Xtra fine porta up case 0x41 : { if (eop) chnInf->old[effcnt].xfineportaup=eop; chnInf->decPer(chnInf->old[effcnt].xfineportaup); handlePeriodUnderflow(chnInf); chnInf->adjustVibratoPer(); }; break; case 0x42 : { if (eop) chnInf->old[effcnt].xfineportadown=eop; chnInf->incPer(chnInf->old[effcnt].xfineportadown); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); }; break; // MDL fine portas up case 0x43 : { if (eop) chnInf->old[effcnt].portaup=eop; if (chnInf->old[effcnt].portaup>=0xE0) { y=chnInf->old[effcnt].portaup>>4; x=chnInf->old[effcnt].portaup&0xf; switch (y) { case 0xF: chnInf->decPer(x*4); handlePeriodUnderflow(chnInf); chnInf->adjustVibratoPer(); break; case 0xE: chnInf->decPer(x>>1); handlePeriodUnderflow(chnInf); chnInf->adjustVibratoPer(); break; } } }; break; case 0x44 : { if (eop) chnInf->old[effcnt].portaup=eop; if (chnInf->old[effcnt].portaup>=0xE0) { y=chnInf->old[effcnt].portaup>>4; x=chnInf->old[effcnt].portaup&0xf; switch (y) { case 0xF : chnInf->incPer(x*4); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); break; case 0xE : chnInf->incPer(x>>1); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); break; } } }; break; case 0x45 : { if (eop) chnInf->old[effcnt].volslide=eop; if (chnInf->old[effcnt].volslide>=0xE0) { y=chnInf->old[effcnt].volslide>>4; x=chnInf->old[effcnt].volslide&0xf; switch (y) { case 0xF : chnInf->incVol(x*4); chnInf->adjustTremoloTremorVol(); break; case 0xE : chnInf->incVol(x); chnInf->adjustTremoloTremorVol(); break; } } } break; case 0x46 : { if (eop) chnInf->old[effcnt].volslide=eop; if (chnInf->old[effcnt].volslide>=0xE0) { y=chnInf->old[effcnt].volslide>>4; x=chnInf->old[effcnt].volslide&0xf; switch (y) { case 0xF : chnInf->decVol(x*4); chnInf->adjustTremoloTremorVol(); break; case 0xE : chnInf->decVol(x); chnInf->adjustTremoloTremorVol(); break; } } }; break; // S3M porta up case 0x47 : { // when MODULE_XMPORTANOTEBUFFER is set // we link all effects to the second effect memory const mp_sint32 effidx = ((module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) && numEffects == 2) ? 1 : effcnt; mp_ubyte* op = (module->header.flags & XModule::MODULE_ITLINKPORTAMEM) ? &chnInf->old[effidx].portanote : &chnInf->old[effidx].portaup; if (eop) *op=eop; if (*op>=0xE0) { y=*op>>4; x=*op&0xf; switch (y) { case 0xF: chnInf->decPer(x*4); // Special for ST3 if (chnInf->getPer() <= 0 && chn >= 0) stopSample(chn); chnInf->adjustVibratoPer(); break; case 0xE: chnInf->decPer(x); // Special for ST3 if (chnInf->getPer() <= 0 && chn >= 0) stopSample(chn); chnInf->adjustVibratoPer(); break; } } }; break; // S3M porta down case 0x48 : { // when MODULE_XMPORTANOTEBUFFER is set // we link all effects to the second effect memory const mp_sint32 effidx = ((module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) && numEffects == 2) ? 1 : effcnt; mp_ubyte* op = (module->header.flags & XModule::MODULE_ITLINKPORTAMEM) ? &chnInf->old[effidx].portanote : &chnInf->old[effidx].portaup; if (eop) *op=eop; if (*op>=0xE0) { y=*op>>4; x=*op&0xf; switch (y) { case 0xF : chnInf->incPer(x*4); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); break; case 0xE : chnInf->incPer(x); handlePeriodOverflow(chnInf); chnInf->adjustVibratoPer(); break; } } }; break; // S3M volslide case 0x49 : doVolslideST(chnInf, effcnt, eop); break; // extra fine volslide up (PSM support) case 0x4B : { if (eop) chnInf->old[effcnt].finevolslide=eop; chnInf->incVol(chnInf->old[effcnt].finevolslide); chnInf->adjustTremoloTremorVol(); }; break; // extra fine volslide down (PSM support) case 0x4C : { if (eop) chnInf->old[effcnt].finevolslide=eop; chnInf->decVol(chnInf->old[effcnt].finevolslide); chnInf->adjustTremoloTremorVol(); }; break; // high precision porta up (PSM support) // same as 0x01 but 4x more accurate case 0x4D : if (eop) chnInf->old[effcnt].portaup=eop; break; // high precision porta down (PSM support) // same as 0x02 but 4x more accurate case 0x4E : if (eop) chnInf->old[effcnt].portaup=eop; break; // AMS: Set sampleflags case 0x4F : if (!eop) { chnInf->resetFlag(CHANNEL_FLAGS_FORCE_BACKWARD); chnInf->setFlag(CHANNEL_FLAGS_FORCE_FORWARD); if (chn < 0) break; setForward(chn); } else if (eop == 1) { chnInf->resetFlag(CHANNEL_FLAGS_FORCE_FORWARD); chnInf->setFlag(CHANNEL_FLAGS_FORCE_BACKWARD); if (chn < 0) break; setBackward(chn); } else if (eop == 2) { chnInf->setFlag(CHANNEL_FLAGS_FORCE_BILOOP); } else if (eop == 3) // break sampleloop / oktalyzer too { if (chn < 0) break; breakLoop(chn); } break; // AMS: Set channel mastervol case 0x50 : chnInf->setMasterVol(eop); break; // Digibooster set real BPM case 0x52 : { if (eop) { baseBpm = eop >= 32 ? eop : 32; // Simply recalculate this->adder = getbpmrate(bpm); } break; } // Oktalyzer: fine note slide down case 0x54: { if (chnInf->getNote() > eop) { mp_sint32 note = chnInf->getNote(); note-=eop; if (note < 3*12) note = 3*12; chnInf->setNote(note); chnInf->setPer(getperiod(chnInf->getNote(),chnInf->getRelnote(),chnInf->getFinetune())); chnInf->adjustVibratoPer(); } } break; // Oktalyzer: fine note slide up case 0x55: { if (chnInf->getNote() < XModule::NOTE_LAST-eop) { mp_sint32 note = chnInf->getNote(); note+=eop; if (note > 6*12) note = 6*12; chnInf->setNote(note); chnInf->setPer(getperiod(chnInf->getNote(),chnInf->getRelnote(),chnInf->getFinetune())); chnInf->adjustVibratoPer(); } } break; // IT/S3M global volslide (Impulse Tracker) case 0x59 : { if (eop) chnInf->old[effcnt].gvolslide=eop; if (chnInf->old[effcnt].gvolslide) { y=chnInf->old[effcnt].gvolslide>>4; x=chnInf->old[effcnt].gvolslide&0xf; if ((x!=0x0F)&&(y!=0x0F)) break; if (x==0x0F && !y) break; if (y==0x0F && !x) break; if (x==0x0F) { mainVolume+=y*((module->header.flags & XModule::MODULE_ITNOTEOFF) ? 2 : 4); if (mainVolume>255) mainVolume=255; break; } if (y==0x0F) { mainVolume-=x*((module->header.flags & XModule::MODULE_ITNOTEOFF) ? 2 : 4); if (mainVolume<0) mainVolume=0; break; } } break; } // IT Channel volslide case 0x5A : { if (eop) chnInf->old[effcnt].chnvolslide=eop; if (chnInf->old[effcnt].chnvolslide) { y=chnInf->old[effcnt].chnvolslide>>4; x=chnInf->old[effcnt].chnvolslide&0xf; if ((x!=0x0F)&&(y!=0x0F)) break; if (x==0x0F && !y) break; if (y==0x0F && !x) break; if (x==0x0F) { chnInf->incMasterVol(y*4); break; } if (y==0x0F) { chnInf->decMasterVol(x*4); break; } } }; break; // IT panning slide case 0x5B : { if (eop) chnInf->old[effcnt].panslide=eop; if (chnInf->old[effcnt].panslide) { y=chnInf->old[effcnt].panslide>>4; x=chnInf->old[effcnt].panslide&0xf; if ((x!=0x0F)&&(y!=0x0F)) break; if (x==0x0F && !y) break; if (y==0x0F && !x) break; if (x==0x0F) { chnInf->decPan(y*4); break; } if (y==0x0F) { chnInf->incPan(x*4); break; } } }; break; } // switch } void PlayerIT::doTickeffects() { TModuleChannel* chnInf = chninfo; for (mp_sint32 chn = 0; chn < numChannels; chn++, chnInf++) { for (mp_sint32 effcnt = 0; effcnt < numEffects; effcnt++) { doTickEffect(chnInf, effcnt); } } } void PlayerIT::triggerEnvelope(TPrEnv& dstEnv, TEnvelope& srcEnv) { // if the same envelope has been not been assigned already, // we take over the "enabled" flag from the envelope if (dstEnv.envstruc != &srcEnv) dstEnv.enabled = srcEnv.type & 1; dstEnv.envstruc = &srcEnv; dstEnv.a = 0; dstEnv.b = 1; dstEnv.step = 0; dstEnv.bpmCounter = 0; if (dstEnv.envstruc->speed) dstEnv.bpmAdder = getbpmrate(dstEnv.envstruc->speed); } void PlayerIT::triggerEnvelopes(TModuleChannel* chnInf) { const mp_sint32 smp = chnInf->getSmp(); const mp_sint32 ins = chnInf->getIns(); bool insEnv = (module->instr[ins-1].flags & TXMInstrument::IF_ITENVELOPES); mp_uword e = insEnv ? module->instr[ins-1].venvnum : module->smp[smp].venvnum; if (e) triggerEnvelope(chnInf->getVenv(), module->venvs[e-1]); else chnInf->getVenv().envstruc=NULL; e = insEnv ? module->instr[ins-1].penvnum : module->smp[smp].penvnum; if (e) triggerEnvelope(chnInf->getPenv(), module->penvs[e-1]); else chnInf->getPenv().envstruc=NULL; e = insEnv ? module->instr[ins-1].fenvnum : module->smp[smp].fenvnum; if (e) triggerEnvelope(chnInf->getFenv(), module->fenvs[e-1]); else chnInf->getFenv().envstruc=NULL; e = insEnv ? module->instr[ins-1].vibenvnum : module->smp[smp].vibenvnum; if (e) triggerEnvelope(chnInf->getVibenv(), module->vibenvs[e-1]); else chnInf->getVibenv().envstruc=NULL; e = insEnv ? module->instr[ins-1].pitchenvnum : module->smp[smp].pitchenvnum; if (e) triggerEnvelope(chnInf->getPitchenv(), module->pitchenvs[e-1]); else chnInf->getPitchenv().envstruc=NULL; } void PlayerIT::triggerAutovibrato(TModuleChannel* chnInf) { const mp_sint32 smp = chnInf->getSmp(); if (module->smp[smp].vibdepth&&module->smp[smp].vibrate) { //chnInf->avibused=1; chnInf->setAvibused((module->smp[smp].vibtype+1) | ((module->smp[smp].flags & 16) ? 128 : 0)); chnInf->setAvibdepth(module->smp[smp].vibdepth); chnInf->setAvibspd(module->smp[smp].vibrate); chnInf->setAvibswcnt(0); chnInf->setAvibsweep(module->smp[smp].vibsweep); } else chnInf->setAvibused(0); } void PlayerIT::triggerInstrumentFX(TModuleChannel* chnInf, bool triggerEnv/* = true*/) { const mp_sint32 smp = chnInf->getSmp(); const mp_sint32 ins = chnInf->getIns(); if (smp != -1) { if (triggerEnv) triggerEnvelopes(chnInf); triggerAutovibrato(chnInf); chnInf->setFadevolstart(65536); // Check for IT style fadeout (instrument rather than sample based) if (ins && (module->instr[ins-1].flags & TXMInstrument::IF_ITFADEOUT)) chnInf->setFadevolstep(module->instr[ins-1].volfade); else chnInf->setFadevolstep(module->smp[smp].volfade); } } #define INVALIDVALUE -12345678 void PlayerIT::progressRow() { mp_sint32 slotsize = (numEffects*2)+2; TXMPattern* pattern = &module->phead[patternIndex]; mp_ubyte *row = pattern->patternData+ (pattern->channum*slotsize*rowcnt); /*if (rowcnt == 3) { int i = 0; i++; i--; }*/ //for (mp_sint32 chn=4;chn<5;chn++) { for (mp_sint32 chn=0;chncurrentnote = row[pp]; mp_sint32 i = row[pp+1]; bool noteporta = false; bool notedelay = false; bool forcefade = false; mp_sint32 oldIns = chnInf->getIns(); mp_sint32 oldSmp = chnInf->getSmp(); // Effect preprocessor & get effect + operand from interleaved pattern data mp_sint32 effcnt, finetune = 0x7FFFFFFF; for (effcnt = 0; effcnt < numEffects; effcnt++) { chnInf->eff[effcnt] = row[(pp+2)+(effcnt*2)]; chnInf->eop[effcnt] = row[(pp+2)+(effcnt*2+1)]; switch (chnInf->eff[effcnt]) { // We need to know if we process the note as new note or or portamento destination period case 0x03: case 0x05: noteporta = true; break; // nasty FT2 "feature" // if there is a set volume in the first column // and note == NOTE_OFF set a flag for later use case 0x0C: { if (playModeFT2 && (note == XModule::NOTE_OFF || (effcnt == 0 && numEffects == 2 && chnInf->eff[effcnt+1] == 0x14))) { forcefade = true; } break; } // XM key off at tick with tick operand == 0 is like normal key off case 0x14: if (chnInf->eop[effcnt] == 0) note = XModule::NOTE_OFF; break; // set finetune will override the instrument setting case 0x35: finetune = XModule::modfinetunes[playModeFT2 ? ((chnInf->eop[effcnt] - 8) & 0xF) : (chnInf->eop[effcnt] & 0xF)]; break; // note delay without note retriggers last bnote case 0x3d: notedelay = true; if (!note && chnInf->eop[effcnt] && playModeFT2) note = chnInf->lastnoportanote; break; } } // Temporary placeholders, those will be applied after // having allocated a new virtual channel mp_sint32 finalNote = chnInf->getNote(); mp_sint32 finalIns = chnInf->getIns(); mp_uword finalInsflags = chnInf->getInsflags(); mp_sint32 finalSmp = chnInf->getSmp(); mp_sint32 finalPeriod = chnInf->getPer(); mp_sint32 finalFreqAdjust = chnInf->getFreqadjust(); mp_sint32 finalRelnote = chnInf->getRelnote(); mp_sint32 finalFinetune = chnInf->getFinetune(); mp_sint32 finalVolume = chnInf->getVolume(); bool stopChannel = false; // Check new instrument settings only if valid note or no note at all if (i && note <= XModule::NOTE_LAST) { // valid sample? bool invalidIns = true; bool invalidSmp = true; // invalid instrument if (i <= module->header.insnum && module->instr[i-1].samp) invalidIns = false; // invalid sample if (module->instr[i-1].samp && module->instr[i-1].snum[0] != -1) invalidSmp = false; if (!invalidIns) // valid sample finalIns = i; else if (note) // invalid sample { // cut means stop sample in FT2 if (!newInsPTFlag && !newInsST3Flag && !noteporta) { finalSmp = -1; finalIns = 0; stopChannel = true; } } // protracker sample cut when invalid instrument is triggered if (newInsPTFlag) { if (!note) { if (invalidSmp) { finalSmp = -1; finalIns = 0; finalVolume = 0; // cut means: volume to zero (no stop sample) } else { finalSmp = module->instr[i-1].snum[0]; } } else { if (invalidSmp) { finalSmp = -1; finalIns = 0; finalVolume = 0; // cut means: volume to zero (no stop sample) // NOT sure!!! //stopSample(chn); } } } // screamtracker continues playing when invalid instrument is triggered // applies new volume when instrument only is triggered else if (newInsST3Flag) { if (!note) { if (!invalidSmp) { finalSmp = module->instr[i-1].snum[0]; } // completely invalid instrument without note, does nothing at all else { i = 0; } } } } chnInf->validnote = true; if (note && note < XModule::NOTE_OFF) { const mp_sint32 ins = finalIns; if (ins) { finalSmp = module->instr[ins-1].snum[note-1]; if ((module->instr[ins-1].flags & 1) && module->instr[ins-1].notemap[note-1] != 0xFF) { chnInf->currentnote = note = module->instr[ins-1].notemap[note-1] + 1; } // if Impulse Tracker instrument, we only apply the sample finetune / relnote when // there is a note AND an instrument set, otherwise keep settings if (!(module->instr[ins-1].flags & 1) || ((module->instr[ins-1].flags & 1) && i)) { // invalid sample entry? // Only apply new fintune / relative note number when not doing portamento mp_sint32 smp = finalSmp; if (smp != -1 && !noteporta) { mp_sint32 finalNote = note + (mp_sint32)module->smp[smp].relnote; // limit to upper boundary is enabled (FT2) if (module->header.uppernotebound) { // Within current note range? if (finalNote >= 1 && finalNote <= (mp_sint32)module->header.uppernotebound) { finalFinetune = (finetune != 0x7FFFFFFF ? finetune : module->smp[smp].finetune); finalRelnote = module->smp[smp].relnote; finalFreqAdjust = module->smp[smp].freqadjust; } // This is not a valid note else { chnInf->validnote = false; note = finalNote; } } else { finalFinetune = (finetune != 0x7FFFFFFF ? finetune : module->smp[smp].finetune); finalRelnote = module->smp[smp].relnote; finalFreqAdjust = module->smp[smp].freqadjust; } } } } mp_sint32 relnote = finalRelnote; mp_sint32 finetune = finalFinetune; // If this is not a note portamento // and a valid note => keep that note and calculate new period if (!noteporta) { finalNote = chnInf->lastnoportanote = note; finalPeriod = getperiod(note,relnote,finetune); // if there is a valid note => destroy portamento to note memory when playing an S3M(?) if (/*newInsPTFlag||*/newInsST3Flag) { chnInf->destnote=0; chnInf->destper=0; } } // If this is a note portamento keep destination's note + period else { // if a note delay is happening while the portamento is set, AND we don't have a note (?) // we restore the original period, but the destination period keeps set if (playModeFT2 && notedelay && !chnInf->currentnote) finalPeriod=getperiod(note,relnote,finetune); else { chnInf->lastnoportanote=finalNote; chnInf->destnote=finalNote=note; chnInf->destper=getperiod(note,relnote,finetune); } } // If this has not been a valid note, do not trigger it if (!chnInf->validnote) note = 0; } // take over instrument flags (NNA/DCT/DCA) if ((i == finalIns) && finalIns) finalInsflags = module->instr[finalIns-1].flags; // --- this is the place to allocate new virtual channels --- if (finalSmp != -1 && !noteporta && note && note < XModule::NOTE_OFF) { TNNATriggerInfo triggerInfo; triggerInfo.ins = i; triggerInfo.smp = finalSmp; triggerInfo.note = note; if (!handleNNAs(chnInf, triggerInfo)) continue; } // apply new state to new channel if (finalNote != chnInf->getNote()) { chnInf->setNote(finalNote); } if (finalIns != chnInf->getIns()) { chnInf->setIns(finalIns); } if (finalInsflags != chnInf->getInsflags()) { chnInf->setInsflags(finalInsflags); } if (finalSmp != chnInf->getSmp()) { chnInf->setSmp(finalSmp); } if (finalPeriod != chnInf->getPer()) { chnInf->setPer(finalPeriod); chnInf->adjustVibratoPer(); } if (finalFreqAdjust != chnInf->getFreqadjust()) { chnInf->setFreqadjust(finalFreqAdjust); } if (finalRelnote != chnInf->getRelnote()) { chnInf->setRelnote(finalRelnote); } if (finalFinetune != chnInf->getFinetune()) { chnInf->setFinetune(finalFinetune); } if (finalVolume != chnInf->getVol()) { chnInf->setVol(finalVolume); chnInf->adjustTremoloTremorVol(); } if (stopChannel && chnInf->hasVchn()) { stopSample(chnInf->getPlaybackChannelIndex()); } // man this FT2 bug emulation starts getting on my nerves: // only take new instrument of there is no note porta if (playModeFT2 && i && (noteporta || !chnInf->validnote)) { i = oldIns; chnInf->setIns(i); chnInf->setSmp(oldSmp); } // when we have a new instrument we apply the settings for this instrument if (i && chnInf->getSmp() != -1 && note < XModule::NOTE_OFF) { if (module->instr[i-1].flags & TXMInstrument::IF_ITGOBALINSVOL) chnInf->setInsMasterVol(module->instr[i-1].res); else chnInf->setInsMasterVol(255); mp_sint32 smp = chnInf->getSmp(); if ((module->smp[smp].flags&1)) { chnInf->setVol(module->smp[smp].vol); chnInf->adjustTremoloTremorVol(); } if (playModeFT2 && (module->smp[smp].flags&2)) chnInf->setPan(module->smp[smp].pan); if ((module->smp[smp].flags&4)) chnInf->setMasterVol(module->smp[smp].vol); if ((module->smp[smp].flags&8)) chnInf->setSmpMasterVol(module->smp[smp].res); else chnInf->setSmpMasterVol(255); chnInf->setCutoff(module->instr[i-1].ifc); chnInf->setResonance(module->instr[i-1].ifr); if (noteporta && (module->header.flags & XModule::MODULE_ITNEWGXX)) triggerInstrumentFX(chnInf, false); else triggerInstrumentFX(chnInf); // reset vibrato/tremolo/tremor/retrig counters for (effcnt=0;effcntvibpos[effcnt] = chnInf->tremorcnt[effcnt] = chnInf->trmpos[effcnt] = chnInf->panbrellopos[effcnt] = chnInf->retrigcounterRxx[effcnt] = 0; if (playModePT) chnInf->smpoffs = 0; chnInf->setKeyon(true); } // ------ 11/05/05: it seems that note off commands are processed BEFORE effect commands // S3M style keyoff: // sample is stopped if (note == XModule::NOTE_CUT) { note=0; if (chnInf->getVenv().envstruc!=NULL) { if (!chnInf->getVenv().isEnabled()) { chnInf->setVol(0); chnInf->adjustTremoloTremorVol(); if (chnInf->getPlaybackChannelIndex() >= 0) stopSample(chnInf->getPlaybackChannelIndex()); } } else { chnInf->setVol(0); chnInf->adjustTremoloTremorVol(); if (chnInf->getPlaybackChannelIndex() >= 0) stopSample(chnInf->getPlaybackChannelIndex()); } } // XM/IT style keyoff: else if (note == XModule::NOTE_OFF) { note = 0; handleNoteOFF(chnInf->chnstat()); } chnInf->hasSetVolume = false; for (effcnt=0;effcnteff[effcnt] == 0x09 && !note && module->getType() == XModule::ModuleType_MTM) { note = chnInf->getNote(); } doEffect(chnInf, effcnt); } // for if (note) { if (note <= XModule::NOTE_OFF) { if (!noteporta) { playInstrument(chnInf); } else if (oldPTInsChangeFlag && newInsPTFlag && noteporta && i && chnInf->getSmp() != -1 && chnInf->getNote()) { playInstrument(chnInf, true); } } } // note else if (oldPTInsChangeFlag && newInsPTFlag && i && chnInf->getNote() && chnInf->getPer()) { playInstrument(chnInf, true); } } } } void PlayerIT::update() { mp_sint32 c; TVirtualChannel* chn = vchninfo; const mp_sint32 curMaxVirChannels = this->curMaxVirChannels; for (c = 0; c < curMaxVirChannels; c++, chn++) { if (!chn->getActive()) continue; if (chn->isFlagSet(CHANNEL_FLAGS_UPDATE_IGNORE)) continue; const mp_sint32 ins = chn->getIns(); bool ITEnvelopes = (ins && ins <= module->header.insnum) ? (module->instr[ins-1].flags & TXMInstrument::IF_ITENVELOPES) : false; mp_sint32 dfs = chn->getFlags() & CHANNEL_FLAGS_DFS; mp_sint32 dvs = chn->getFlags() & CHANNEL_FLAGS_DVS; mp_sint32 dps = chn->getFlags() & CHANNEL_FLAGS_DPS; if (chn->getPeriod() && !dfs) setFreq(c,getFinalFreq(chn->chnstat(),getFinalPeriod(chn->chnstat(),chn->getPeriod()))); if (!dvs) setVol(c,getFinalVolume(chn->chnstat(), chn->getVolume(), mainVolume)); if (!dps) setPan(c,getFinalPanning(chn->chnstat(),chn->getPan())); if (chn->getVenv().envstruc != NULL && !chn->getVenv().envstruc->speed) { prenvelope(&chn->getVenv(), chn->getKeyon(), ITEnvelopes); if (ins && ins <= module->header.insnum && (module->instr[ins-1].flags & TXMInstrument::IF_ITFADEOUT)) { if (chn->getVenv().finished(chn->getKeyon()) && !chn->getFadeout()) { chn->setFadeout(true); } } } // IT filter processing mp_sint32 cutoff = MP_INVALID_VALUE; if (chn->getCutoff() >= 128) cutoff = chn->getCutoff() - 128; mp_sint32 resonance = 0; if (chn->getResonance() >= 128) resonance = chn->getResonance() - 128; setFilterAttributes(c, getFinalCutoff(chn->chnstat(), cutoff), resonance); if (chn->getPenv().envstruc != NULL && !chn->getPenv().envstruc->speed) { prenvelope(&chn->getPenv(), chn->getKeyon(), ITEnvelopes); } if (chn->getFenv().envstruc != NULL && !chn->getFenv().envstruc->speed) { prenvelope(&chn->getFenv(), chn->getKeyon(), ITEnvelopes); } if (chn->getVibenv().envstruc != NULL && !chn->getVibenv().envstruc->speed) { prenvelope(&chn->getVibenv(), chn->getKeyon(), ITEnvelopes); } if (chn->getPitchenv().envstruc != NULL && !chn->getPitchenv().envstruc->speed) { prenvelope(&chn->getPitchenv(), chn->getKeyon(), ITEnvelopes); } if (ins && ins <= module->header.insnum) { // IT style fadeout also works without active envelope if ((module->instr[ins-1].flags & TXMInstrument::IF_ITFADEOUT) && chn->getFadeout()) { chn->decFadevolstart(); } // XM style fadeout works only with key off else if (!chn->getKeyon()) { chn->decFadevolstart(); } } if (chn->getAvibused()) { chn->avibAdvance(); } } adjustVirtualChannels(); } void PlayerIT::updateBPMIndependent() { mp_int64 dummy; TVirtualChannel* chn = vchninfo; const mp_sint32 curMaxVirChannels = this->curMaxVirChannels; for (mp_sint32 c = 0; c < curMaxVirChannels; c++,chn++) { TVirtualChannel* chn = &vchninfo[c]; if (!chn->getActive()) continue; if (chn->isFlagSet(CHANNEL_FLAGS_UPDATE_IGNORE)) continue; const mp_sint32 ins = chn->getIns(); bool ITEnvelopes = (ins && ins <= module->header.insnum) ? (module->instr[ins-1].flags & TXMInstrument::IF_ITENVELOPES) : false; mp_sint32 dfs = chn->getFlags() & CHANNEL_FLAGS_DFS, dvs = chn->getFlags() & CHANNEL_FLAGS_DVS; // Volume envelope if (chn->getVenv().envstruc != NULL && chn->getVenv().envstruc->speed) { dummy = (mp_int64)chn->getVenv().bpmCounter; dummy+=(mp_int64)chn->getVenv().bpmAdder; chn->getVenv().bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(&chn->getVenv(), chn->getKeyon(), ITEnvelopes); if (!dvs) setVol(c,getFinalVolume(chn->chnstat(), chn->getVolume(), mainVolume)); } } // Panning envelope if (chn->getPenv().envstruc != NULL && chn->getPenv().envstruc->speed) { dummy = (mp_int64)chn->getPenv().bpmCounter; dummy+=(mp_int64)chn->getPenv().bpmAdder; chn->getPenv().bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(&chn->getPenv(), chn->getKeyon(), ITEnvelopes); setPan(c,getFinalPanning(chn->chnstat(),chn->getPan())); } } // Frequency envelope: Digitracker MDL if (chn->getFenv().envstruc != NULL && chn->getFenv().envstruc->speed) { dummy = (mp_int64)chn->getFenv().bpmCounter; dummy+=(mp_int64)chn->getFenv().bpmAdder; chn->getFenv().bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(&chn->getFenv(), chn->getKeyon(), ITEnvelopes); if (chn->getPeriod()&&(!dfs)) setFreq(c,getFinalFreq(chn->chnstat(),getFinalPeriod(chn->chnstat(),chn->getPeriod()))); } } // Vibrato envelope: Velvet Studio AMS if (chn->getVibenv().envstruc != NULL && chn->getVibenv().envstruc->speed) { dummy = (mp_int64)chn->getVibenv().bpmCounter; dummy+=(mp_int64)chn->getVibenv().bpmAdder; chn->getVibenv().bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(&chn->getVibenv(), chn->getKeyon(), ITEnvelopes); if (chn->getPeriod()&&(!dfs)) setFreq(c,getFinalFreq(chn->chnstat(),getFinalPeriod(chn->chnstat(),chn->getPeriod()))); } } // Pitch envelope: Impulse Tracker if (chn->getPitchenv().envstruc != NULL && chn->getPitchenv().envstruc->speed) { dummy = (mp_int64)chn->getPitchenv().bpmCounter; dummy+=(mp_int64)chn->getPitchenv().bpmAdder; chn->getPitchenv().bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(&chn->getPitchenv(), chn->getKeyon(), ITEnvelopes); if (chn->getPeriod()&&(!dfs)) setFreq(c,getFinalFreq(chn->chnstat(),getFinalPeriod(chn->chnstat(),chn->getPeriod()))); } } } adjustVirtualChannels(); } void inline PlayerIT::setNewPosition(mp_sint32 poscnt) { if (poscnt == this->poscnt) return; if (poscnt>=module->header.ordnum) poscnt=module->header.restart; // reset looping flags RESET_ALL_LOOPING lastUnvisitedPos = this->poscnt; this->poscnt = poscnt; } void PlayerIT::tickhandler() { mp_sint32 maxTicks; if (!idle) { // Important! Without this, the different playmodes will not be recognized properly updatePlayModeFlags(); // sanity check 1 if (patternIndexToPlay == -1 && poscnt >= module->header.ordnum) { halt(); return; } // Play special pattern? if (patternIndexToPlay == -1) patternIndex = module->header.ord[poscnt]; else patternIndex = patternIndexToPlay; TXMPattern* pattern = &module->phead[patternIndex]; if (pattern->patternData == NULL) { halt(); return; } // sanity check 2 :) if (rowcnt >= pattern->rows) { if (patternIndexToPlay == -1) { //rowcnt = 0; ticker = 0; goto nextrow; } else { //halt(); //return; rowcnt = 0; ticker = 0; } } numEffects = pattern->effnum; numChannels = pattern->channum <= module->header.channum ? pattern->channum : module->header.channum; mp_sint32 c; if (ticker == 0) { // Keep track of visited rows mp_sint32 absolutePos = poscnt*256+rowcnt; if (isRowVisited(absolutePos) && !repeat) { // pattern loop active? bool b = false; for (c=0;cpatternData+(pattern->channum*slotsize*rowcnt); // process high priority effects in advance to other effects mp_ubyte* slot = row; for (c=0;c=maxTicks) { if (patDelay) patDelay = false; // reset ticker ticker=0; // if we're told to play this row only, we will stop now // and neither process any of those pattern jump/repeat stuff if (playOneRowOnly) { BPMCounter = adder = 0; return; } if (patternIndexToPlay == -1) { // break pattern? if (pbreak&&(poscnt<(module->header.ordnum-1))) { if (!pjump || (pjump && pjumpPriority > pbreakPriority)) setNewPosition(poscnt+1); rowcnt=pbreakpos-1; startNextRow = -1; } else if (pbreak&&(poscnt==(module->header.ordnum-1))) { // Pattern break on the last order? Break to restart position if (!pjump || (pjump && pjumpPriority > pbreakPriority)) setNewPosition(module->header.restart); rowcnt=pbreakpos-1; startNextRow = -1; } // pattern jump? if (pjump) { if (!pbreak || (pbreak && pjumpPriority > pbreakPriority)) rowcnt = pjumprow-1; setNewPosition(pjumppos); startNextRow = -1; } // it could be that our position has changed because // of position jumps, so make sure we're getting the real position here patternIndex = module->header.ord[poscnt]; } // We have one pattern to play else { // Position jump occurred and repeating is allowed, start again if (pjump || pbreak) { rowcnt = -1; startNextRow = -1; } //RESETLOOPING // macro } // handle loop for (c=0;c=module->phead[patternIndex].rows) { // start at row 0? if (startNextRow != -1) { rowcnt = startNextRow; startNextRow = -1; } else { rowcnt = 0; } if (patternIndexToPlay == -1) { // play next order setNewPosition(poscnt+1); } // We have one pattern to play but repeating isn't allowed, so stop here else if (!repeat) { halt(); return; } // We have one pattern to play and repeating is allowed so start again else { rowcnt = 0; // reset looping flags RESET_ALL_LOOPING } } // halting has been requested if (haltFlag) { halt(); } } } else { numChannels = module->header.channum; } update(); } void PlayerIT::halt() { halted = true; BPMCounter = adder = 0; if (resetOnStopFlag) resetChannelsWithoutMuting(); } bool PlayerIT::grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const { channelInfo.note = chninfo[chn].currentnote; channelInfo.instrument = chninfo[chn].getIns(); channelInfo.volume = chninfo[chn].getVol(); channelInfo.panning = chninfo[chn].getPan(); channelInfo.numeffects = numEffects; memcpy(channelInfo.effects, chninfo[chn].eff, sizeof(chninfo[chn].eff)); memcpy(channelInfo.operands, chninfo[chn].eop, sizeof(chninfo[chn].eop)); return true; } milkytracker-0.90.85+dfsg/src/milkyplay/MilkyPlayTypes.h0000644000175000017500000000367011163403715022345 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Types.h * MilkyPlay * * Created by Peter Barth on Tue Oct 19 2004. * */ #ifndef __MILKYPLAYTYPES_H__ #define __MILKYPLAYTYPES_H__ typedef signed char mp_sbyte; typedef unsigned char mp_ubyte; typedef char mp_char; typedef signed short mp_sword; typedef unsigned short mp_uword; typedef unsigned int mp_dword; typedef unsigned int mp_uint32; typedef int mp_sint32; #endif milkytracker-0.90.85+dfsg/src/milkyplay/PlayerSTD.cpp0000644000175000017500000025570411163403715021556 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerSTD.cpp * MilkyPlay standard player * * */ #include "PlayerSTD.h" #define CHANNEL_FLAGS_DVS 0x10000 #define CHANNEL_FLAGS_DFS 0x20000 #define CHANNEL_FLAGS_FORCE_FORWARD 0x00001 #define CHANNEL_FLAGS_FORCE_BACKWARD 0x00002 #define CHANNEL_FLAGS_FORCE_BILOOP 0x00004 #define CHANNEL_FLAGS_UPDATE_IGNORE 0x00100 //#define MINPERIOD (113*4) #define FREEMEMORY \ #define CLEAROLDOPERANDS \ { \ for (mp_sint32 i = 0; i < numChannels; i++) { \ chninfo[i].ins = 0; \ /*memset(&chninfo[i].old,0,sizeof(TLastOperands));*/ \ } \ } // must be called after the poscnt has been properly set #define RESETLOOPING \ { \ chnInf->loopstart=chnInf->loopcounter=chnInf->execloop=0; \ chnInf->isLooping = false; \ chnInf->loopingValidPosition = poscnt; \ } #define RESET_ALL_LOOPING \ { \ for (mp_sint32 c = 0; c < module->header.channum; c++) \ { \ TModuleChannel *chnInf = &chninfo[c]; \ RESETLOOPING \ } \ } const mp_sint32 PlayerSTD::vibtab[32] = {0,24,49,74,97,120,141,161, 180,197,212,224,235,244,250,253, 255,253,250,244,235,224,212,197, 180,161,141,120,97,74,49,24}; const mp_uword PlayerSTD::lintab[768+1] = { 16726,16741,16756,16771,16786,16801,16816,16832,16847,16862,16877,16892,16908,16923,16938,16953, 16969,16984,16999,17015,17030,17046,17061,17076,17092,17107,17123,17138,17154,17169,17185,17200, 17216,17231,17247,17262,17278,17293,17309,17325,17340,17356,17372,17387,17403,17419,17435,17450, 17466,17482,17498,17513,17529,17545,17561,17577,17593,17608,17624,17640,17656,17672,17688,17704, 17720,17736,17752,17768,17784,17800,17816,17832,17848,17865,17881,17897,17913,17929,17945,17962, 17978,17994,18010,18027,18043,18059,18075,18092,18108,18124,18141,18157,18174,18190,18206,18223, 18239,18256,18272,18289,18305,18322,18338,18355,18372,18388,18405,18421,18438,18455,18471,18488, 18505,18521,18538,18555,18572,18588,18605,18622,18639,18656,18672,18689,18706,18723,18740,18757, 18774,18791,18808,18825,18842,18859,18876,18893,18910,18927,18944,18961,18978,18995,19013,19030, 19047,19064,19081,19099,19116,19133,19150,19168,19185,19202,19220,19237,19254,19272,19289,19306, 19324,19341,19359,19376,19394,19411,19429,19446,19464,19482,19499,19517,19534,19552,19570,19587, 19605,19623,19640,19658,19676,19694,19711,19729,19747,19765,19783,19801,19819,19836,19854,19872, 19890,19908,19926,19944,19962,19980,19998,20016,20034,20052,20071,20089,20107,20125,20143,20161, 20179,20198,20216,20234,20252,20271,20289,20307,20326,20344,20362,20381,20399,20418,20436,20455, 20473,20492,20510,20529,20547,20566,20584,20603,20621,20640,20659,20677,20696,20715,20733,20752, 20771,20790,20808,20827,20846,20865,20884,20902,20921,20940,20959,20978,20997,21016,21035,21054, 21073,21092,21111,21130,21149,21168,21187,21206,21226,21245,21264,21283,21302,21322,21341,21360, 21379,21399,21418,21437,21457,21476,21496,21515,21534,21554,21573,21593,21612,21632,21651,21671, 21690,21710,21730,21749,21769,21789,21808,21828,21848,21867,21887,21907,21927,21946,21966,21986, 22006,22026,22046,22066,22086,22105,22125,22145,22165,22185,22205,22226,22246,22266,22286,22306, 22326,22346,22366,22387,22407,22427,22447,22468,22488,22508,22528,22549,22569,22590,22610,22630, 22651,22671,22692,22712,22733,22753,22774,22794,22815,22836,22856,22877,22897,22918,22939,22960, 22980,23001,23022,23043,23063,23084,23105,23126,23147,23168,23189,23210,23230,23251,23272,23293, 23315,23336,23357,23378,23399,23420,23441,23462,23483,23505,23526,23547,23568,23590,23611,23632, 23654,23675,23696,23718,23739,23761,23782,23804,23825,23847,23868,23890,23911,23933,23954,23976, 23998,24019,24041,24063,24084,24106,24128,24150,24172,24193,24215,24237,24259,24281,24303,24325, 24347,24369,24391,24413,24435,24457,24479,24501,24523,24545,24567,24590,24612,24634,24656,24679, 24701,24723,24746,24768,24790,24813,24835,24857,24880,24902,24925,24947,24970,24992,25015,25038, 25060,25083,25105,25128,25151,25174,25196,25219,25242,25265,25287,25310,25333,25356,25379,25402, 25425,25448,25471,25494,25517,25540,25563,25586,25609,25632,25655,25678,25702,25725,25748,25771, 25795,25818,25841,25864,25888,25911,25935,25958,25981,26005,26028,26052,26075,26099,26123,26146, 26170,26193,26217,26241,26264,26288,26312,26336,26359,26383,26407,26431,26455,26479,26502,26526, 26550,26574,26598,26622,26646,26670,26695,26719,26743,26767,26791,26815,26839,26864,26888,26912, 26937,26961,26985,27010,27034,27058,27083,27107,27132,27156,27181,27205,27230,27254,27279,27304, 27328,27353,27378,27402,27427,27452,27477,27502,27526,27551,27576,27601,27626,27651,27676,27701, 27726,27751,27776,27801,27826,27851,27876,27902,27927,27952,27977,28003,28028,28053,28078,28104, 28129,28155,28180,28205,28231,28256,28282,28307,28333,28359,28384,28410,28435,28461,28487,28513, 28538,28564,28590,28616,28642,28667,28693,28719,28745,28771,28797,28823,28849,28875,28901,28927, 28953,28980,29006,29032,29058,29084,29111,29137,29163,29190,29216,29242,29269,29295,29322,29348, 29375,29401,29428,29454,29481,29507,29534,29561,29587,29614,29641,29668,29694,29721,29748,29775, 29802,29829,29856,29883,29910,29937,29964,29991,30018,30045,30072,30099,30126,30154,30181,30208, 30235,30263,30290,30317,30345,30372,30400,30427,30454,30482,30509,30537,30565,30592,30620,30647, 30675,30703,30731,30758,30786,30814,30842,30870,30897,30925,30953,30981,31009,31037,31065,31093, 31121,31149,31178,31206,31234,31262,31290,31319,31347,31375,31403,31432,31460,31489,31517,31546, 31574,31602,31631,31660,31688,31717,31745,31774,31803,31832,31860,31889,31918,31947,31975,32004, 32033,32062,32091,32120,32149,32178,32207,32236,32265,32295,32324,32353,32382,32411,32441,32470, 32499,32529,32558,32587,32617,32646,32676,32705,32735,32764,32794,32823,32853,32883,32912,32942, 32972,33002,33031,33061,33091,33121,33151,33181,33211,33241,33271,33301,33331,33361,33391,33421, 33451 // one more value because of linear interpolation }; #define LOGFAC 2*16 const mp_uint32 PlayerSTD::logtab[13*8+1] = { LOGFAC*907,LOGFAC*900,LOGFAC*894,LOGFAC*887,LOGFAC*881,LOGFAC*875,LOGFAC*868,LOGFAC*862, LOGFAC*856,LOGFAC*850,LOGFAC*844,LOGFAC*838,LOGFAC*832,LOGFAC*826,LOGFAC*820,LOGFAC*814, LOGFAC*808,LOGFAC*802,LOGFAC*796,LOGFAC*791,LOGFAC*785,LOGFAC*779,LOGFAC*774,LOGFAC*768, LOGFAC*762,LOGFAC*757,LOGFAC*752,LOGFAC*746,LOGFAC*741,LOGFAC*736,LOGFAC*730,LOGFAC*725, LOGFAC*720,LOGFAC*715,LOGFAC*709,LOGFAC*704,LOGFAC*699,LOGFAC*694,LOGFAC*689,LOGFAC*684, LOGFAC*678,LOGFAC*675,LOGFAC*670,LOGFAC*665,LOGFAC*660,LOGFAC*655,LOGFAC*651,LOGFAC*646, LOGFAC*640,LOGFAC*636,LOGFAC*632,LOGFAC*628,LOGFAC*623,LOGFAC*619,LOGFAC*614,LOGFAC*610, LOGFAC*604,LOGFAC*601,LOGFAC*597,LOGFAC*592,LOGFAC*588,LOGFAC*584,LOGFAC*580,LOGFAC*575, LOGFAC*570,LOGFAC*567,LOGFAC*563,LOGFAC*559,LOGFAC*555,LOGFAC*551,LOGFAC*547,LOGFAC*543, LOGFAC*538,LOGFAC*535,LOGFAC*532,LOGFAC*528,LOGFAC*524,LOGFAC*520,LOGFAC*516,LOGFAC*513, LOGFAC*508,LOGFAC*505,LOGFAC*502,LOGFAC*498,LOGFAC*494,LOGFAC*491,LOGFAC*487,LOGFAC*484, LOGFAC*480,LOGFAC*477,LOGFAC*474,LOGFAC*470,LOGFAC*467,LOGFAC*463,LOGFAC*460,LOGFAC*457, LOGFAC*453,LOGFAC*450,LOGFAC*447,LOGFAC*443,LOGFAC*440,LOGFAC*437,LOGFAC*434,LOGFAC*431, LOGFAC*428 // one more value because of linear interpolation }; // This takes the period with 8 bit fractional part mp_sint32 PlayerSTD::getlinfreq(mp_sint32 per) { if (per<0) per=0; if (per>7680*256) per=7680*256; mp_sint32 t = (7680*256-per)/(768*256); mp_sint32 r = (7680*256-per)%(768*256); // Linear interpolation seems to be wrong here /*mp_sint32 frac = r & 255; mp_sint32 r1 = ((lintab[r>>8])<>5; mp_sint32 r2 = ((lintab[(r>>8)+1])<>5; return ((255-frac)*r1 + frac*r2) >> 8;*/ return ((lintab[r>>8])<>5; } // This takes the period with 8 bit fractional part mp_sint32 PlayerSTD::getlogfreq(mp_sint32 per) { return fixeddiv(14317056, per)>>8; } mp_sint32 PlayerSTD::getlinperiod(mp_sint32 note,mp_sint32 relnote,mp_sint32 finetune) { note+=relnote; if (note<1) note=1; if (note>XModule::NOTE_LAST) note=XModule::NOTE_LAST; return ((7680-((note-1)<<6)-(finetune/2))); } mp_sint32 PlayerSTD::interpolate(mp_sint32 eax,mp_sint32 ebx,mp_sint32 ecx,mp_sint32 edi,mp_sint32 esi) { if (ebx==ecx) return edi; mp_sint32 di = ((eax-ebx)*(esi-edi))/(ecx-ebx)+edi; return (mp_sint32)di; } mp_sint32 PlayerSTD::getlogperiod(mp_sint32 note,mp_sint32 relnote,mp_sint32 finetune) { note+=relnote; if (note<1) note=1; if (note>XModule::NOTE_LAST) note=XModule::NOTE_LAST; mp_sint32 ft = finetune; ft+=128; mp_sint32 octave = (note-1)/12; mp_sint32 n = ((note-1)%12)<<3; mp_sint32 pi = (ft>>4)+n; mp_sint32 v1 = logtab[pi]; mp_sint32 v2 = logtab[pi+1]; mp_sint32 t = (ft>>4)-8; //mp_sint32 t = (ft>>4); return interpolate(t,0,15,v1,v2)>>octave; } PlayerSTD::PlayerSTD(mp_uint32 frequency, StatusEventListener* statusEventListener/* = NULL*/) : PlayerBase(frequency), statusEventListener(statusEventListener), chninfo(NULL), lastNumAllocatedChannels(-1) { smpoffs = NULL; attick = NULL; // fill in some default values, don't know if this is necessary tickSpeed = 6; // our tickspeed bpm = 125; // BPM speed ticker = tickSpeed-1; // runs from 0 to tickspeed-1 patternIndex = 0; // holds current pattern index numEffects = 0; // current number of effects numChannels = 0; // current number of channels patDelay = false; patDelayCount = 0; haltFlag = false; options[PlayModeOptionPanning8xx] = true; options[PlayModeOptionPanningE8x] = false; options[PlayModeOptionForcePTPitchLimit] = true; } PlayerSTD::~PlayerSTD() { freeMemory(); } mp_sint32 PlayerSTD::adjustFrequency(mp_uint32 frequency) { mp_uint32 lastNumBeatPackets = getNumBeatPackets()+1; mp_sint32 res = PlayerBase::adjustFrequency(frequency); if (res < 0) return res; // nothing has changed if (lastNumBeatPackets == getNumBeatPackets()+1) return 0; res = allocateStructures(); return res; } mp_sint32 PlayerSTD::setBufferSize(mp_uint32 bufferSize) { mp_uint32 lastNumBeatPackets = getNumBeatPackets()+1; mp_sint32 res = PlayerBase::setBufferSize(bufferSize); if (res < 0) return res; // nothing has changed if (lastNumBeatPackets == getNumBeatPackets()+1) return 0; res = allocateStructures(); return res; } void PlayerSTD::timerHandler(mp_sint32 currentBeatPacket) { PlayerBase::timerHandler(currentBeatPacket); if (paused) return; if (statusEventListener) statusEventListener->timerTickStarted(*this, *module); mp_int64 dummy = (mp_int64)BPMCounter; dummy+=(mp_int64)adder; BPMCounter=(mp_sint32)dummy; // check overflow-carry if ((dummy>>32)) { #ifdef MILKYTRACKER setActiveChannels(initialNumChannels); #else setActiveChannels(module->header.channum); #endif if (statusEventListener) statusEventListener->playerTickStarted(*this, *module); tickhandler(); if (statusEventListener) statusEventListener->playerTickEnded(*this, *module); } if (module->header.flags & XModule::MODULE_AMSENVELOPES) updateBPMIndependent(); #ifdef MILKYTRACKER TModuleChannel* chnInf = chninfo; for (mp_sint32 i = 0; i < initialNumChannels; i++) { // track envelope position state TPrEnv* env = &chnInf->venv; if ((env->envstruc && (env->envstruc->type & 1) && env->envstruc->num) && (env->step < env->envstruc->env[env->envstruc->num-1][0])) { env->timeRecord[currentBeatPacket].pos = env->step; env->timeRecord[currentBeatPacket].envstruc = env->envstruc; } else { env->timeRecord[currentBeatPacket].pos = 0; env->timeRecord[currentBeatPacket].envstruc = NULL; } env = &chnInf->penv; if ((env->envstruc && (env->envstruc->type & 1) && env->envstruc->num) && (env->step < env->envstruc->env[env->envstruc->num-1][0])) { env->timeRecord[currentBeatPacket].pos = env->step; env->timeRecord[currentBeatPacket].envstruc = env->envstruc; } else { env->timeRecord[currentBeatPacket].pos = 0; env->timeRecord[currentBeatPacket].envstruc = NULL; } chnInf++; } #endif if (statusEventListener) statusEventListener->timerTickStarted(*this, *module); } void PlayerSTD::restart(mp_uint32 startPosition/* = 0*/, mp_uint32 startRow/* = 0*/, bool resetMixer/* = true*/, const mp_ubyte* customPanningTable/* = NULL*/, bool playOneRowOnly/* = false*/) { if (chninfo == NULL) return; bpm = module->header.speed; tickSpeed = module->header.tempo; ticker = 0; // after the speed has been assigned, it's time to call PlayerBase::restart PlayerBase::restart(startPosition, startRow, resetMixer, customPanningTable, playOneRowOnly); this->adder = getbpmrate(this->bpm); mp_sint32 i,j; // clean up player specific variables patternIndex = 0; numEffects = 0; numChannels = 0; patDelay = false; patDelayCount = 0; haltFlag = false; startNextRow = -1; reset(); for (i = 0; i < initialNumChannels; i++) chninfo[i].masterVol = 0xff; for (i = 0; i < module->header.channum; i++) chninfo[i].pan = customPanningTable ? customPanningTable[i] : module->header.pan[i]; memset(rowHits, 0, sizeof(rowHits)); for (i = 0; i < (signed)startPosition; i++) for (j = 0; j < 256; j++) visitRow(i*256+j); for (i = 0; i < (signed)startRow; i++) visitRow(startPosition*256+i); } void PlayerSTD::reset() { for (mp_sint32 i = 0; i < initialNumChannels; i++) chninfo[i].clear(); RESET_ALL_LOOPING } void PlayerSTD::resetAllSpeed() { bpm = module->header.speed; tickSpeed = module->header.tempo; ticker = 0; this->adder = getbpmrate(this->bpm); } mp_sint32 PlayerSTD::allocateStructures() { if (lastNumAllocatedChannels != initialNumChannels) { freeMemory(); chninfo = new TModuleChannel[initialNumChannels]; smpoffs = new mp_uint32[initialNumChannels]; attick = new mp_ubyte[initialNumChannels]; lastNumAllocatedChannels = initialNumChannels; } #ifdef MILKYTRACKER for (mp_sint32 i = 0; i < initialNumChannels; i++) chninfo[i].reallocTimeRecord(getNumBeatPackets()+1); #endif return 0; } void PlayerSTD::freeMemory() { if (chninfo) { delete[] chninfo; chninfo = NULL; lastNumAllocatedChannels = -1; } if (smpoffs) { delete[] smpoffs; smpoffs = NULL; } if (attick) { delete[] attick; attick = NULL; } } /////////////////////////////////////////////////////////////////////////////////// // controlling current song position // /////////////////////////////////////////////////////////////////////////////////// void PlayerSTD::clearEffectMemory() { if (!module || !chninfo) return; ticker = 0; //loopstart = execloop = loopcounter=0; mp_sint32 i; for (i = 0; i < module->header.channum; i++) { TModuleChannel *chnInf = &chninfo[i]; RESETLOOPING } patDelay = false; patDelayCount = 0; haltFlag = false; startNextRow = -1; memset(rowHits, 0, sizeof(rowHits)); for (i = 0; i < poscnt; i++) for (mp_sint32 j = 0; j < 256; j++) visitRow(i*256+j); for (i = 0; i < (signed)rowcnt; i++) visitRow(poscnt*256+i); } void PlayerSTD::prenvelope(mp_sint32 c,TPrEnv *env,mp_sint32 keyon) { if (env->envstruc!=NULL && (env->envstruc->type&1)) { // if we're sitting on a sustain point and key is on, we don't advance further if ((env->envstruc->type&2) && (env->a==env->envstruc->sustain) && (env->step == env->envstruc->env[env->a][0]) && keyon) return; if ((env->step != env->envstruc->env[env->b][0]) && (env->b < env->envstruc->num)) env->step++; if (env->step == env->envstruc->env[env->b][0]) { if ((env->envstruc->type&4)) { if ((!(env->envstruc->type&8) || keyon) && !(!keyon && (env->envstruc->type&2) && env->envstruc->sustain == env->envstruc->loope)) // Break envelope if sustain pt == loop end point AND sustain is enabled AND key off is send { if (env->b==env->envstruc->loope) { env->a=env->envstruc->loops; env->b=env->envstruc->loops+1; env->step=env->envstruc->env[env->a][0]; return; } } } // Increase envelope position if there are more points to come if (env->b < env->envstruc->num - 1) { env->a++; env->b++; } } } } mp_sint32 PlayerSTD::getenvval(mp_sint32 c,TPrEnv *env,mp_sint32 n) { if (env->envstruc==NULL) return n; if ((env->envstruc->type&1)) { mp_sint32 dx = (env->envstruc->env[env->b][0]-env->envstruc->env[env->a][0]); if (dx==0) dx=1; mp_sint32 t = (env->envstruc->env[env->b][0]-env->step)*65536/dx; mp_sint32 y0 = env->envstruc->env[env->a][1]; mp_sint32 y1 = env->envstruc->env[env->b][1]; mp_sint32 y = (y0*t)+(y1*(65536-t)); return y>>16; } else return n; } mp_sint32 PlayerSTD::getfinalperiod(mp_sint32 c,mp_sint32 p) { mp_sint32 envVib = 0; p<<=8; if (chninfo[c].vibenv.envstruc != NULL && (chninfo[c].vibenv.envstruc->type&1)) { mp_sint32 eval = (getenvval(c,&chninfo[c].vibenv,128)-128) << (chninfo[c].vibenv.envstruc->type>>6); // AMS doc says vibrato with amplify set to 8 equals vibrato 0xF // => alright envVib = (eval*61408)>>(3+16-8); } if (chninfo[c].avibused) { mp_ubyte vp = chninfo[c].avibcnt>>2; mp_ubyte vd = chninfo[c].avibdepth; mp_sint32 vm = 0; mp_sint32 vl = 0; switch (chninfo[c].avibused) { // sine case 1 : vl=vibtab[vp&31]; break; // square case 2 : vl=255; break; // ramp down case 3 : { vl=((vp&31)*539087)>>16; if ((vp&63)>31) vl=255-vl; vl=-vl; }; break; // ramp up case 4 : { vl=((vp&31)*539087)>>16; if ((vp&63)>31) vl=255-vl; }; break; } vm = ((vl*vd)>>1); if (chninfo[c].avibsweep) { vm*=(mp_sint32)chninfo[c].avibswcnt * 256; vm/=chninfo[c].avibsweep; vm>>=8; } if ((vp&63)>31) vm=-vm; return (p+vm+envVib); } else return (p+envVib); } void PlayerSTD::playInstrument(mp_sint32 chn, TModuleChannel* chnInf, bool bNoRestart/* = false*/) { if (chnInf->ins && chnInf->ins <= module->header.insnum) { if (module->instr[chnInf->ins-1].samp && chnInf->smp != -1) { chnInf->flags &= ~CHANNEL_FLAGS_UPDATE_IGNORE; mp_sint32 i = chnInf->smp; // start out with the flags for 16bit sample mp_sint32 flags = ((module->smp[i].type&16)>>4)<<2; // add looping + backward flags flags |= module->smp[i].type&(3+128); // one shot forward looping? flags |= module->smp[i].type & 32; // force forward playing if (chnInf->flags & CHANNEL_FLAGS_FORCE_FORWARD) flags &= ~128; // force backward playing if (chnInf->flags & CHANNEL_FLAGS_FORCE_BACKWARD) flags |= 128; if (flags&3) { if (chnInf->flags & CHANNEL_FLAGS_FORCE_BILOOP) flags = (flags & ~3) | 2; // bNoRestart = false means play new sample from beginning or sample offset if (!bNoRestart) { playSample(chn, (mp_sbyte*)module->smp[i].sample, module->smp[i].samplen, smpoffs[chn], 0, // sample offset fraction !playModeChopSampleOffset, module->smp[i].loopstart, module->smp[i].loopstart+module->smp[i].looplen, flags); } // bNoRestart = true means play new sample from beginning of the last sample else { mp_sint32 smpoffset = smpoffs[chn] ? smpoffs[chn] : getSamplePos(chn); mp_sint32 smpoffsetfrac = smpoffs[chn] ? 0 : getSamplePosFrac(chn); playSample(chn, (mp_sbyte*)module->smp[i].sample, module->smp[i].samplen, smpoffset, smpoffsetfrac, // sample offset fraction true, module->smp[i].loopstart, module->smp[i].loopstart+module->smp[i].looplen, flags); } } else { // bNoRestart = false means play new sample from beginning or sample offset if (!bNoRestart) { playSample(chn,(mp_sbyte*)module->smp[i].sample, module->smp[i].samplen, smpoffs[chn], 0, // sample offset fraction !playModeChopSampleOffset, 0, module->smp[i].samplen, flags); } // bNoRestart = true means play new sample from beginning of the last sample AND don't ramp volume up else { mp_sint32 smpoffset = smpoffs[chn] ? smpoffs[chn] : getSamplePos(chn); mp_sint32 smpoffsetfrac = smpoffs[chn] ? 0 : getSamplePosFrac(chn); playSample(chn,(mp_sbyte*)module->smp[i].sample, module->smp[i].samplen, smpoffset, smpoffsetfrac, // sample offset fraction true, 0, module->smp[i].samplen, flags); } } } else { stopSample(chn); } } } void PlayerSTD::updatePlayModeFlags() { // the following flags are exclusive newInsPTFlag = (module->header.flags & XModule::MODULE_PTNEWINSTRUMENT); newInsST3Flag = (module->header.flags & XModule::MODULE_ST3NEWINSTRUMENT); oldPTInsChangeFlag = (module->header.flags & XModule::MODULE_OLDPTINSTRUMENTCHANGE); // 4-channel Protracker module = EXACT PTK replay should be applied playModePT = ((module->header.flags & XModule::MODULE_PTNEWINSTRUMENT) && (module->header.channum == 4) && playMode == PlayMode_Auto) || (playMode == PlayMode_ProTracker2) || (playMode == PlayMode_ProTracker3); // This is a module with PTK limits playModePTPitchLimit = ((module->header.flags & XModule::MODULE_PTNEWINSTRUMENT) && playMode == PlayMode_Auto) || (playMode == PlayMode_ProTracker2) || (playMode == PlayMode_ProTracker3); // Override module playmode settings switch (playMode) { case PlayMode_ProTracker2: newInsPTFlag = true; newInsST3Flag = false; oldPTInsChangeFlag = true; break; case PlayMode_ProTracker3: newInsPTFlag = true; newInsST3Flag = false; oldPTInsChangeFlag = false; break; case PlayMode_ScreamTracker3: newInsPTFlag = false; newInsST3Flag = true; oldPTInsChangeFlag = false; break; case PlayMode_FastTracker2: newInsPTFlag = false; newInsST3Flag = false; oldPTInsChangeFlag = false; break; case PlayMode_Auto: break; } playModeFT2 = (playMode == PlayMode_FastTracker2 ? true : false); if (playMode == PlayMode_Auto && (module->header.flags & XModule::MODULE_XMARPEGGIO)) playModeFT2 = true; // Chop off samples which sample offsets greater sample length? playModeChopSampleOffset = playModeFT2 || (playMode == PlayMode_ProTracker3); } static inline mp_sint32 myMod(mp_sint32 a, mp_sint32 b) { mp_sint32 r = a % b; return r < 0 ? b + r : r; } mp_sint32 PlayerSTD::calcVibrato(TModuleChannel* chnInf, mp_sint32 effcnt) { mp_sint32 vp = chnInf->vibpos[effcnt]; mp_sint32 vd = chnInf->vibdepth[effcnt]; mp_sint32 vm = ((vibtab[vp&31]*vd)>>(7-2)); if ((vp&63)>31) vm=-vm; return vm; } void PlayerSTD::doTickEffect(mp_sint32 chn, TModuleChannel* chnInf, mp_sint32 effcnt) { mp_ubyte x,y; mp_ubyte vp,vd; mp_sint32 vm; // IN PTK playmode, we've got a bunch of tick 0 effects // which are repeated as long as the pattern delay applies // ONLY valid for PTK playmode & effects, for other effects this leads to undefined results if (playModePT) { if (patDelay && ticker && // Those effects are NOT executed chnInf->eff[effcnt] > 0x09 && chnInf->eff[effcnt] != 0x33 && chnInf->eff[effcnt] != 0x34 && chnInf->eff[effcnt] != 0x35 && chnInf->eff[effcnt] != 0x36 && chnInf->eff[effcnt] != 0x37 && chnInf->eff[effcnt] != 0x38 && chnInf->eff[effcnt] < 0x3C) { if (!(ticker % tickSpeed)) doEffect(chn, chnInf, effcnt); } } switch (chnInf->eff[effcnt]) { // portamento up case 0x01: if (ticker) { chnInf->per-=chnInf->old[effcnt].portaup*4; handlePeriodUnderflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } break; // portamento down case 0x02: if (ticker) { chnInf->per+=chnInf->old[effcnt].portadown*4; handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } break; // note portamento case 0x03: { if (ticker&&chnInf->destnote) { // If this is an XM module we need to store the last portamento operand always in the buffer for the second effect mp_sint32 op = ((module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) && numEffects == 2) ? chnInf->old[1].portanote : chnInf->old[effcnt].portanote; if (chnInf->destper>chnInf->per) { chnInf->per+=op*4; if (chnInf->per>chnInf->destper) chnInf->per=chnInf->destper; } else if (chnInf->destperper) { chnInf->per-=op*4; if (chnInf->perdestper) chnInf->per=chnInf->destper; } chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } break; } // vibrato (applying extra hacks for XM compatibility) // In FT2 the vibrato contained in the volume column works a bit different // than the vibrato in the effect column: // After the vibrato has occured in the volumn column the pitch of the last // vibrato calculation stays on until the next pitch effect occurs case 0x04: { x = chnInf->eop[effcnt]>>4; y = chnInf->eop[effcnt]&0xf; mp_sint32 effNum = effcnt; // in FT2 play mode the last vibrato // value comes always from the effect column (index 1) if ((module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) && numEffects == 2) { effNum = 1; } if (x) chnInf->vibspeed[effNum]=x; if (y) chnInf->vibdepth[effNum]=y; mp_sint32 vmp = chnInf->per; vm = calcVibrato(chnInf, effNum); if (ticker) chnInf->vibpos[effNum]+=chnInf->vibspeed[effNum]; vmp+=vm; mp_sint32 maxTicks = patDelay ? patDelayCount : tickSpeed; // the vibrato in the volumn volumn (index 0) works differently // before applying that, we assure that this is an XM module by checking // the module header (checking for FT2 replay mode is not enough, // since it won't guarantee that there is volume and effect column) if ((module->header.flags & XModule::MODULE_XMVOLCOLUMNVIBRATO) && ticker == maxTicks - 1) { // if this is a volume column vibrato we keep the pitch if (!effcnt) { chnInf->finalVibratoPer = vmp; chnInf->hasVibrato = true; } // if not we reset that else { chnInf->finalVibratoPer = 0; chnInf->hasVibrato = false; } } setFreq(chn,getfreq(chn,getfinalperiod(chn,vmp),chnInf->freqadjust)); break; } // note porta + volume slide case 0x05: { if (ticker&&chnInf->destnote) { // If this is an XM module we need to store the last portamento operand always in the buffer for the second effect mp_sint32 op = (module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) ? chnInf->old[1].portanote : chnInf->old[effcnt].portanote; if (chnInf->destper>chnInf->per) { chnInf->per+=op*4; if (chnInf->per>chnInf->destper) chnInf->per=chnInf->destper; } else if (chnInf->destperper) { chnInf->per-=op*4; if (chnInf->perdestper) chnInf->per=chnInf->destper; } chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } x = chnInf->old[effcnt].volslide>>4; y = chnInf->old[effcnt].volslide&0xf; if (x&&y) y = 0; // i'm not completely sure about this // that case isn't mentioned mp_sint32 the S3M docs if (!(module->header.flags & XModule::MODULE_OLDS3MVOLSLIDES) && ticker == 0) break; if (x) { chnInf->vol+=x*4; if (chnInf->vol>255) chnInf->vol=255; } if (y) { chnInf->vol-=y*4; if (chnInf->vol<0) chnInf->vol=0; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; break; } // vibrato + volume slide case 0x06: { vm = calcVibrato(chnInf, effcnt); if (ticker) chnInf->vibpos[effcnt]+=chnInf->vibspeed[effcnt]; setFreq(chn,getfreq(chn,getfinalperiod(chn,chnInf->per+vm),chnInf->freqadjust)); x = chnInf->old[effcnt].volslide>>4; y = chnInf->old[effcnt].volslide&0xf; if (x&&y) y = 0; // i'm not completely sure about this // that case isn't mentioned in the S3M docs if (!(module->header.flags & XModule::MODULE_OLDS3MVOLSLIDES) && ticker == 0) break; if (x) { chnInf->vol+=x*4; if (chnInf->vol>255) chnInf->vol=255; } if (y) { chnInf->vol-=y*4; if (chnInf->vol<0) chnInf->vol=0; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; break; } // tremolo, this is not the exact FT2 way. FT2 way doesn't make sense at all, fuck it // (applying extra hacks for XM compatibility) case 0x07: { x = chnInf->eop[effcnt]>>4; y = chnInf->eop[effcnt]&0xf; if (x) chnInf->trmspeed[effcnt]=x; if (y) chnInf->trmdepth[effcnt]=y; vp = chnInf->trmpos[effcnt]; vd = chnInf->trmdepth[effcnt]; mp_sint32 vmp = (ticker == 0 ? (chnInf->hasTremolo ? chnInf->finalTremoloVol : chnInf->vol) : chnInf->tremoloVol); if (ticker) { vm = ((vibtab[vp&31]*vd)>>(6-2)); if ((vp&63)>31) vm=-vm; vmp+=vm; if (vmp<0) vmp=0; if (vmp>255) vmp=255; chnInf->trmpos[effcnt]+=chnInf->trmspeed[effcnt]; } if (ticker == tickSpeed - 1) { chnInf->finalTremoloVol = vmp; chnInf->hasTremolo = true; } setVol(chn,getvolume(chn,vmp)); break; } // volume slide case 0x0A: { x = chnInf->old[effcnt].volslide>>4; y = chnInf->old[effcnt].volslide&0xf; // 08/31/04: fixed... // don't reject volume slide if both operands are set // instead, slide up // see other volume slides as well if (x&&y) y = 0; if (ticker) { if (x) { chnInf->vol+=x*4; if (chnInf->vol>255) chnInf->vol=255; } if (y) { chnInf->vol-=y*4; if (chnInf->vol<0) chnInf->vol=0; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } break; } // global volume slide case 0x11: { x = chnInf->old[effcnt].gvolslide>>4; y = chnInf->old[effcnt].gvolslide&0xf; if (x&&y) y = 0; if (ticker) { if (x) { mainVolume+=x*4; if (mainVolume>255) mainVolume=255; } if (y) { mainVolume-=y*4; if (mainVolume<0) mainVolume=0; } } break; } // panning slide case 0x19: { x = chnInf->old[effcnt].panslide>>4; y = chnInf->old[effcnt].panslide&0xf; if (x&&y) y = 0; if (ticker) { if (x) { chnInf->pan+=x; if (chnInf->pan>255) chnInf->pan=255; } if (y) { chnInf->pan-=y; if (chnInf->pan<0) chnInf->pan=0; } } break; } // retrig + volslide (I worked my ass OFF on this fucking shit) // A few notes about FT2 playback: // Rxx Retrig doesn't restart envelopes, even with instrument set // It only retrigs if the last note has been been within valid range: 1 <= note <= XModule::NOTE_LAST case 0x1B: { if ((chnInf->old[effcnt].retrig&0xf)) { if (chnInf->retrigcounterRxx[effcnt] >= chnInf->retrigmaxRxx[effcnt]) { chnInf->retrigcounterRxx[effcnt] = 0; chnInf->retrigmaxRxx[effcnt] = chnInf->old[effcnt].retrig&0xf; switch (chnInf->old[effcnt].retrig>>4) { case 0x1 : chnInf->vol-=4; if (chnInf->vol<0) chnInf->vol=0; break; case 0x2 : chnInf->vol-=8; if (chnInf->vol<0) chnInf->vol=0; break; case 0x3 : chnInf->vol-=16; if (chnInf->vol<0) chnInf->vol=0; break; case 0x4 : chnInf->vol-=32; if (chnInf->vol<0) chnInf->vol=0; break; case 0x5 : chnInf->vol-=64; if (chnInf->vol<0) chnInf->vol=0; break; case 0x6 : chnInf->vol=(chnInf->vol*2)/3; break; case 0x7 : chnInf->vol>>=1; break; case 0x9 : chnInf->vol+=4; if (chnInf->vol>255) chnInf->vol=255; break; case 0xA : chnInf->vol+=8; if (chnInf->vol>255) chnInf->vol=255; break; case 0xB : chnInf->vol+=16; if (chnInf->vol>255) chnInf->vol=255; break; case 0xC : chnInf->vol+=32; if (chnInf->vol>255) chnInf->vol=255; break; case 0xD : chnInf->vol+=64; if (chnInf->vol>255) chnInf->vol=255; break; case 0xE : chnInf->vol=(chnInf->vol*3)>>1; if (chnInf->vol>255) chnInf->vol=255; break; case 0xF : chnInf->vol<<=1; if (chnInf->vol>255) chnInf->vol=255; break; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; if (chnInf->validnote) playInstrument(chn, chnInf); } chnInf->retrigcounterRxx[effcnt]++; } break; } // tremor (I worked my ass OFF on this fucking shit) case 0x1D: { x = (chnInf->old[effcnt].tremor>>4) + 1; y = (chnInf->old[effcnt].tremor&0xf) + 1; mp_sint32 v = (ticker == 0 ? chnInf->vol : chnInf->tremorVol); if (ticker && chnInf->tremorcnt[effcnt] % (x+y) >= x) v = 0; if (ticker) chnInf->tremorcnt[effcnt]++; if (ticker == tickSpeed - 1) { chnInf->vol = v; chnInf->tremoloVol = v; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } setVol(chn,getvolume(chn,v)); break; } // MDL Subcommands case 0x1E: { mp_ubyte eff = chnInf->eop[effcnt]>>4; mp_ubyte eop = chnInf->eop[effcnt]&0xf; switch (eff) { case 0x1 : if (ticker) { chnInf->pan-=eop; if (chnInf->pan<0) chnInf->pan=0; } break; case 0x2 : if (ticker) { chnInf->pan+=eop; if (chnInf->pan>255) chnInf->pan=255; } break; case 0xA : if (ticker) { mainVolume+=eop; if (mainVolume>255) mainVolume=255; } break; case 0xB : if (ticker) { mainVolume-=eop; if (mainVolume<0) mainVolume=0; } break; } break; } // arpeggio case 0x20: { if (chnInf->note) { mp_ubyte arpegLUT[3]; mp_sint32 r = 0; mp_sint32 note = 0, onote = chnInf->note; //mp_sint32 c4spd = chnInf->c4spd; mp_sint32 relnote = chnInf->relnote; mp_sint32 finetune = chnInf->finetune; mp_sint32 per,nper; mp_ubyte eop = chnInf->old[effcnt].arpeg; mp_sint32 x = eop>>4; mp_sint32 y = eop&0xf; if (playModeFT2) { // dammit, FT2 arpeggios are so screwed: // the first 11 tick speeds and their arpeggio patterns (0 is note, 3 is fx digit 3, 2 is fx digit 2): // 0: Totally fucked up. Just test it. // 1: 0 // 2: 02 // 3: 032 // 4: 0032 // 5: 02320 // 6: 032032 // 7: 0032032 // 8: 02032032 // 9: 032032032 // A: 0032032032 if (ticker == 0) r = 0; else r = myMod(ticker-tickSpeed,3); arpegLUT[0] = 0; arpegLUT[1] = 2; arpegLUT[2] = 1; } else { r = (ticker)%3; arpegLUT[0] = 0; arpegLUT[1] = 1; arpegLUT[2] = 2; } if (arpegLUT[r] == 0) { note=chnInf->note; } else if (arpegLUT[r] == 1) { note=chnInf->note+x; } else if (arpegLUT[r] == 2) { note=chnInf->note+y; } // Perform note clipping for XM note range if necessary if ((arpegLUT[r] != 0) && // Only done for arpeggio tick 1 & 2 (module->header.flags & XModule::MODULE_XMNOTECLIPPING) && // Only when enabled (note + relnote > 96)) // Only when exceeding range { note-=((note+relnote) - 97); } // special case for STM arpeggio (thanks to Skaven/FC) // Will not work in combination with other period // related effects if (module->header.flags & XModule::MODULE_STMARPEGGIO) { chnInf->per = getperiod(note,relnote,finetune); setFreq(chn,getfreq(chn,getfinalperiod(chn,chnInf->per),chnInf->freqadjust)); } else { nper=getperiod(note,relnote,finetune); per=getperiod(onote,relnote,finetune); //nper = (8363*periods[(note-1)%12]*16>>(((note-1)/12)))/c4spd; //per = (8363*periods[(onote-1)%12]*16>>(((onote-1)/12)))/c4spd; nper-=per; nper+=chnInf->per; setFreq(chn,getfreq(chn,getfinalperiod(chn,nper),chnInf->freqadjust)); } } break; } // normal retrig // A few notes about FT2 playback: // E9x Retrig does!!! (while Rxx doesn't) restart envelopes, even without instrument set // It only retrigs if the last note has been been within valid range: 1 <= note <= XModule::NOTE_LAST case 0x39: { if ((chnInf->eop[effcnt]&0xf) && ticker) { if (chnInf->retrigcounterE9x[effcnt] >= chnInf->retrigmaxE9x[effcnt]) { chnInf->retrigcounterE9x[effcnt] = 0; chnInf->retrigmaxE9x[effcnt] = chnInf->eop[effcnt]&0xf; // trigger envelopes ALWAYS triggerInstrumentFX(chnInf); chnInf->keyon = true; // trigger replay only when last note has been valid if (chnInf->validnote) playInstrument(chn, chnInf); } chnInf->retrigcounterE9x[effcnt]++; } break; } // note cut case 0x3C: // S3M ignores tick 0 note cut if ((module->header.flags & XModule::MODULE_ST3NOTECUT) && !chnInf->eop[effcnt]) break; // Fasttracker cuts note at tick 0 //if (chnInf->eop[effcnt]) { if (ticker == chnInf->eop[effcnt]) { chnInf->vol=0; chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } //} break; // MDL porta up case 0x43: if (ticker) { if (chnInf->old[effcnt].portaup<=0xDF) { chnInf->per-=chnInf->old[effcnt].portaup*4; handlePeriodUnderflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } } break; // MDL porta down case 0x44: if (ticker) { if (chnInf->old[effcnt].portaup<=0xDF) { chnInf->per+=chnInf->old[effcnt].portaup*4; handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } } break; // MDL volslide up case 0x45: if (ticker) { if (chnInf->old[effcnt].volslide<=0xDF) { chnInf->vol+=chnInf->old[effcnt].volslide; if (chnInf->vol>255) chnInf->vol=255; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } break; // MDL volslide down case 0x46: if (ticker) { if (chnInf->old[effcnt].volslide<=0xDF) { chnInf->vol-=chnInf->old[effcnt].volslide; if (chnInf->vol<0) chnInf->vol=0; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } break; // S3M porta up case 0x47: if (ticker) { if (chnInf->old[effcnt].portaup<=0xDF) { chnInf->per-=chnInf->old[effcnt].portaup*4; // Special for ST3 if (chnInf->per <= 0) stopSample(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } } break; // S3M porta down case 0x48: if (ticker) { if (chnInf->old[effcnt].portaup<=0xDF) { chnInf->per+=chnInf->old[effcnt].portaup*4; chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } } break; // S3M volslide case 0x49: { if (!(module->header.flags & XModule::MODULE_OLDS3MVOLSLIDES) && ticker == 0) break; x = chnInf->old[effcnt].volslide>>4; y = chnInf->old[effcnt].volslide&0xf; if (x == 0xF && y) break; if (y == 0xF && x) break; if (x && y) y = 0; if (x) { chnInf->vol+=x*4; if (chnInf->vol>255) chnInf->vol=255; } if (y) { chnInf->vol-=y*4; if (chnInf->vol<0) chnInf->vol=0; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; break; } // fine vibrato case 0x4A: { x = chnInf->eop[effcnt]>>4; y = chnInf->eop[effcnt]&0xf; if (x) chnInf->vibspeed[effcnt]=x; if (y) chnInf->vibdepth[effcnt]=y; mp_sint32 vmp = chnInf->per; vp = chnInf->vibpos[effcnt]; vd = chnInf->vibdepth[effcnt]; vm = ((vibtab[vp&31]*vd)>>7); if ((vp&63)>31) vm=-vm; vmp+=vm; if (ticker) chnInf->vibpos[effcnt]+=chnInf->vibspeed[effcnt]; setFreq(chn,getfreq(chn,getfinalperiod(chn,vmp),chnInf->freqadjust)); break; } // high precision portamento up case 0x4D: if (ticker) { chnInf->per-=chnInf->old[effcnt].portaup; handlePeriodUnderflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } break; // high precision portamento down case 0x4E: if (ticker) { chnInf->per+=chnInf->old[effcnt].portaup; handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } break; // XM: Key off at tick case 0x14: // not at tick 0 if (!ticker) break; // AMS: Key off at tick case 0x51: if (ticker == chnInf->eop[effcnt]) { if (chnInf->venv.envstruc!=NULL) { if (!(chnInf->venv.envstruc->type&1)) chnInf->vol = 0; } else chnInf->vol=0; chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; chnInf->keyon = false; } break; // Oktalyzer: Note slide down /*case 0x52: if (ticker && chnInf->note) { if (chnInf->note > chnInf->eop[effcnt]) { chnInf->note-=chnInf->eop[effcnt]; if (chnInf->note < 3*12) chnInf->note = 3*12; chnInf->per = getperiod(chnInf->note,chnInf->relnote,chnInf->finetune); } } break; // Oktalyzer: Note slide up case 0x53: if (ticker && chnInf->note) { if (chnInf->note < 120-chnInf->eop[effcnt]) { chnInf->note+=chnInf->eop[effcnt]; if (chnInf->note > 6*12) chnInf->note = 6*12; chnInf->per = getperiod(chnInf->note,chnInf->relnote,chnInf->finetune); } } break;*/ // Oktalyzer arpeggio I, II, III case 0x56: case 0x57: case 0x58: { if (chnInf->note) { mp_sint32 eff = chnInf->eff[effcnt]-0x56; mp_sint32 r; if (eff == 1) r = (ticker)&3; else r = (ticker)%3; mp_sint32 note = 0,onote = chnInf->note; mp_sint32 relnote = chnInf->relnote; mp_sint32 finetune = chnInf->finetune; mp_sint32 per,nper; mp_ubyte eop = chnInf->eop[effcnt]; mp_sint32 x = eop>>4; mp_sint32 y = eop&0xf; switch (eff) { case 0x00: { switch (r) { case 0 : note=chnInf->note-x; break; case 1 : note=chnInf->note; break; case 2 : note=chnInf->note+y; break; } break; } case 0x01: { switch (r) { case 0 : note=chnInf->note; break; case 1 : note=chnInf->note+y; break; case 2 : note=chnInf->note; break; case 3 : note=chnInf->note-x; break; } break; } case 0x02: { switch (r) { case 0 : note=chnInf->note+y; break; case 1 : note=chnInf->note+y; break; case 2 : note=chnInf->note; break; } break; } } nper=getperiod(note,relnote,finetune); per=getperiod(onote,relnote,finetune); nper-=per; nper+=chnInf->per; setFreq(chn,getfreq(chn,getfinalperiod(chn,nper),chnInf->freqadjust)); } break; } // Global volslide case 0x59: { if (ticker == 0) break; x = chnInf->old[effcnt].gvolslide>>4; y = chnInf->old[effcnt].gvolslide&0xf; if (x == 0xF && y) break; if (y == 0xF && x) break; if (x && y) y = 0; if (x) { mainVolume+=x*4; if (mainVolume>255) mainVolume=255; } if (y) { mainVolume-=y*4; if (mainVolume<0) mainVolume=0; } break; } } } void PlayerSTD::doEffect(mp_sint32 chn, TModuleChannel* chnInf, mp_sint32 effcnt) { mp_ubyte x,y; mp_sint32 eop=chnInf->eop[effcnt]; switch (chnInf->eff[effcnt]) { case 0x01 : if (eop) chnInf->old[effcnt].portaup=eop; break; case 0x02 : if (eop) chnInf->old[effcnt].portadown=eop; break; case 0x03 : if (module->header.flags & XModule::MODULE_XMPORTANOTEBUFFER) { // XM compatible playing? /*if (!newInsPTFlag && !newInsST3Flag && !oldPTInsChangeFlag && !note && chnInf->note) { chnInf->destper=getperiod(chnInf->note,chnInf->relnote,chnInf->finetune); }*/ ASSERT(numEffects >= 2); if (eop) chnInf->old[1].portanote=eop; } else { if (eop) chnInf->old[effcnt].portanote=eop; } break; case 0x05 : if (eop) chnInf->old[effcnt].volslide=eop; break; case 0x06 : if (eop) chnInf->old[effcnt].volslide=eop; break; case 0x08 : if (options[PlayModeOptionPanning8xx]) chnInf->pan=eop; break; case 0x09 : { if (eop) chnInf->old[effcnt].smpoffset = eop; smpoffs[chn] = chnInf->old[effcnt].smpoffset<<8; }; break; case 0x0A : if (eop) chnInf->old[effcnt].volslide=eop; break; case 0x0B : { pjump = 1; pjumppos = eop; pjumprow = 0; pjumpPriority = MP_NUMEFFECTS*chn + effcnt; }; break; case 0x0C : chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = eop; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; chnInf->hasSetVolume = true; break; case 0x0D : { pbreak=1; pbreakpos = (eop>>4)*10+(eop&0xf); if (pbreakpos > 63) pbreakpos = 0; pbreakPriority = MP_NUMEFFECTS*chn + effcnt; }; break; case 0x0F : { if (eop) { if (eop>=32) { bpm=eop; this->adder = getbpmrate(eop); } } else { haltFlag = true; } }; break; case 0x10 : mainVolume=eop; break; case 0x11 : if (eop) chnInf->old[effcnt].gvolslide=eop; break; // set envelope position case 0x15 : { if (chnInf->venv.envstruc == NULL) break; bool bSet = false; for (mp_sint32 i = 0; i < chnInf->venv.envstruc->num-1; i++) { if (eop >= chnInf->venv.envstruc->env[i][0] && eop < chnInf->venv.envstruc->env[i+1][0]) { chnInf->venv.a = i; chnInf->venv.b = i+1; chnInf->venv.step = eop; bSet = true; break; } } if (!bSet) { // if position is beyond the last envelope point // we limit it to the last point and exit bool beyond = eop > chnInf->venv.envstruc->env[chnInf->venv.envstruc->num-1][0]; chnInf->venv.a = chnInf->venv.envstruc->num-1; chnInf->venv.b = chnInf->venv.envstruc->num; chnInf->venv.step = chnInf->venv.envstruc->env[chnInf->venv.envstruc->num-1][0]; if (beyond) break; } // check if we set envelope position to a loop end point // in that case wrap to the loop start, otherwise the loop // end is skipped and the envelope will roll out without // looping if ((chnInf->venv.envstruc->type & 4) && chnInf->venv.step == chnInf->venv.envstruc->env[chnInf->venv.envstruc->loope][0]) { chnInf->venv.a=chnInf->venv.envstruc->loops; chnInf->venv.b=chnInf->venv.envstruc->loops+1; chnInf->venv.step=chnInf->venv.envstruc->env[chnInf->venv.a][0]; } break; } // set BPM case 0x16 : { if (eop) { bpm=eop; this->adder = getbpmrate(eop); } }; break; case 0x19 : if (eop) chnInf->old[effcnt].panslide=eop; break; case 0x1B : { x = eop & 0xf; y = eop & 0xF0; if (x) chnInf->old[effcnt].retrig = (chnInf->old[effcnt].retrig & 0xF0) | x; if (y) chnInf->old[effcnt].retrig = (chnInf->old[effcnt].retrig & 0x0F) | y; eop = chnInf->old[effcnt].retrig; chnInf->retrigmaxRxx[effcnt] = eop & 0xF; // Simulate really nasty FT2 bug: // When a volume is set in the volume column // the interval for the first retrig is lengthen by one tick if (chnInf->hasSetVolume && playModeFT2) { chnInf->retrigcounterRxx[effcnt] = -1; chnInf->hasSetVolume = false; } // If a note is playing on tick 0, increase counter if (chnInf->currentnote && chnInf->validnote) chnInf->retrigcounterRxx[effcnt]++; break; } // Tremor case 0x1D : if (eop) chnInf->old[effcnt].tremor=eop; break; // MDL set sample offset case 0x1F : { smpoffs[chn]=((mp_sint32)eop<<8)+((mp_sint32)chnInf->eop[(effcnt+1)%numEffects]<<16); }; break; case 0x20 : if (eop) chnInf->old[effcnt].arpeg=eop; break; // ULT set sample offset case 0x21 : { smpoffs[chn]=((mp_sint32)eop<<10); }; break; // ULT Fine set sample offset case 0x22 : { mp_sint32 op = (((mp_sint32)eop)<<8) + ((mp_sint32)chnInf->eop[(effcnt+1)%numEffects]); smpoffs[chn]=op<<2; }; break; // ULT special commands case 0x23 : { if (((eop >> 4) == 1 || (eop&0xF) == 1) || ((eop >> 4) == 12 || (eop&0xF) == 12)) { breakLoop(chn); } if ((eop >> 4) == 2 || (eop&0xF) == 2) { chnInf->flags &= ~CHANNEL_FLAGS_FORCE_FORWARD; chnInf->flags |= CHANNEL_FLAGS_FORCE_BACKWARD; setBackward(chn); } }; break; // Far position jump (PLM support) case 0x2B : { pjump = 1; pjumppos = eop; pjumprow = chnInf->eop[(effcnt+1)%numEffects]; pjumpPriority = MP_NUMEFFECTS*chn + effcnt; }; break; // Fine porta up case 0x31 : { if (eop) chnInf->old[effcnt].fineportaup=eop; chnInf->per-=chnInf->old[effcnt].fineportaup*4; handlePeriodUnderflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; }; break; // Fine porta down case 0x32 : { if (eop) chnInf->old[effcnt].fineportadown=eop; chnInf->per+=chnInf->old[effcnt].fineportadown*4; handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; }; break; case 0x36 : { if (!eop) { chnInf->execloop=0; chnInf->loopstart=rowcnt; chnInf->loopingValidPosition = poscnt; } else { if (chnInf->loopcounter==eop) { // Imitate nasty XM bug here: if (playModeFT2) { startNextRow = chnInf->loopstart; } RESETLOOPING } else { chnInf->execloop=1; chnInf->loopcounter++; } } }; break; case 0x38 : if (options[PlayModeOptionPanningE8x]) chnInf->pan=(mp_ubyte)XModule::pan15to255(eop); break; case 0x39 : { chnInf->retrigcounterE9x[effcnt] = 0; if (eop) { chnInf->retrigmaxE9x[effcnt] = eop & 0xF; // If a note is playing on tick 0, increase counter if (chnInf->currentnote && chnInf->validnote) chnInf->retrigcounterE9x[effcnt]++; } else if (!chnInf->currentnote) { // trigger envelopes ALWAYS triggerInstrumentFX(chnInf); chnInf->keyon = true; // trigger replay only when last note has been valid if (chnInf->validnote) playInstrument(chn, chnInf); } }; break; case 0x3A : { if (eop) chnInf->old[effcnt].finevolslide=eop; chnInf->vol+=chnInf->old[effcnt].finevolslide*4; if (chnInf->vol>255) chnInf->vol=255; chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; }; break; case 0x3B : { if (eop) chnInf->old[effcnt].finevolslide=eop; chnInf->vol-=chnInf->old[effcnt].finevolslide*4; if (chnInf->vol<0) chnInf->vol=0; chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; }; break; // Note delay triggers envelopes/autovibrato/fade out again case 0x3D : { triggerInstrumentFX(chnInf); chnInf->keyon = true; }; break; case 0x3E : { patDelay = true; patDelayCount = (mp_sint32)tickSpeed*((mp_sint32)eop+1); }; break; // Xtra fine porta up case 0x41 : { if (eop) chnInf->old[effcnt].xfineportaup=eop; chnInf->per-=chnInf->old[effcnt].xfineportaup; handlePeriodUnderflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; }; break; case 0x42 : { if (eop) chnInf->old[effcnt].xfineportadown=eop; chnInf->per+=chnInf->old[effcnt].xfineportadown; handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; }; break; // MDL fine portas up case 0x43 : { if (eop) chnInf->old[effcnt].portaup=eop; if (chnInf->old[effcnt].portaup>=0xE0) { y=chnInf->old[effcnt].portaup>>4; x=chnInf->old[effcnt].portaup&0xf; switch (y) { case 0xF: chnInf->per-=x*4; handlePeriodUnderflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; break; case 0xE: chnInf->per-=(x>>1); handlePeriodUnderflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; break; } } }; break; case 0x44 : { if (eop) chnInf->old[effcnt].portaup=eop; if (chnInf->old[effcnt].portaup>=0xE0) { y=chnInf->old[effcnt].portaup>>4; x=chnInf->old[effcnt].portaup&0xf; switch (y) { case 0xF : chnInf->per+=x*4; handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; break; case 0xE : chnInf->per+=(x>>1); handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; break; } } }; break; case 0x45 : { if (eop) chnInf->old[effcnt].volslide=eop; if (chnInf->old[effcnt].volslide>=0xE0) { y=chnInf->old[effcnt].volslide>>4; x=chnInf->old[effcnt].volslide&0xf; switch (y) { case 0xF : chnInf->vol+=x*4; if (chnInf->vol>255) chnInf->vol=255; break; case 0xE : chnInf->vol+=x; if (chnInf->vol>255) chnInf->vol=255; break; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } } break; case 0x46 : { if (eop) chnInf->old[effcnt].volslide=eop; if (chnInf->old[effcnt].volslide>=0xE0) { y=chnInf->old[effcnt].volslide>>4; x=chnInf->old[effcnt].volslide&0xf; switch (y) { case 0xF : chnInf->vol-=x*4; if (chnInf->vol<0) chnInf->vol=0; break; case 0xE : chnInf->vol-=x; if (chnInf->vol<0) chnInf->vol=0; break; } chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } }; break; // S3M porta up case 0x47 : { if (eop) chnInf->old[effcnt].portaup=eop; if (chnInf->old[effcnt].portaup>=0xE0) { y=chnInf->old[effcnt].portaup>>4; x=chnInf->old[effcnt].portaup&0xf; switch (y) { case 0xF: chnInf->per-=x*4; // Special for ST3 if (chnInf->per <= 0) stopSample(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; break; case 0xE: chnInf->per-=x; // Special for ST3 if (chnInf->per <= 0) stopSample(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; break; } } }; break; // S3M porta down case 0x48 : { if (eop) chnInf->old[effcnt].portaup=eop; if (chnInf->old[effcnt].portaup>=0xE0) { y=chnInf->old[effcnt].portaup>>4; x=chnInf->old[effcnt].portaup&0xf; switch (y) { case 0xF : chnInf->per+=x*4; handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; break; case 0xE : chnInf->per+=x; handlePeriodOverflow(chn); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; break; } } }; break; // S3M volslide case 0x49 : { if (eop) chnInf->old[effcnt].volslide=eop; if (chnInf->old[effcnt].volslide) { y=chnInf->old[effcnt].volslide>>4; x=chnInf->old[effcnt].volslide&0xf; if ((x!=0x0F)&&(y!=0x0F)) break; if (x==0x0F && !y) break; if (y==0x0F && !x) break; if (x==0x0F) { chnInf->vol+=y*4; if (chnInf->vol>255) chnInf->vol=255; chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } if (y==0x0F) { chnInf->vol-=x*4; if (chnInf->vol<0) chnInf->vol=0; chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } } }; break; // extra fine volslide up (PSM support) case 0x4B : { if (eop) chnInf->old[effcnt].finevolslide=eop; chnInf->vol+=chnInf->old[effcnt].finevolslide; if (chnInf->vol>255) chnInf->vol=255; chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; }; break; // extra fine volslide down (PSM support) case 0x4C : { if (eop) chnInf->old[effcnt].finevolslide=eop; chnInf->vol-=chnInf->old[effcnt].finevolslide; if (chnInf->vol<0) chnInf->vol=0; chnInf->tremorVol = chnInf->tremoloVol = chnInf->vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; }; break; // high precision porta up (PSM support) // same as 0x01 but 4x more accurate case 0x4D : if (eop) chnInf->old[effcnt].portaup=eop; break; // high precision porta down (PSM support) // same as 0x02 but 4x more accurate case 0x4E : if (eop) chnInf->old[effcnt].portaup=eop; break; // AMS: Set sampleflags case 0x4F : if (!eop) { chnInf->flags &= ~CHANNEL_FLAGS_FORCE_BACKWARD; chnInf->flags |= CHANNEL_FLAGS_FORCE_FORWARD; setForward(chn); } else if (eop == 1) { chnInf->flags &= ~CHANNEL_FLAGS_FORCE_FORWARD; chnInf->flags |= CHANNEL_FLAGS_FORCE_BACKWARD; setBackward(chn); } else if (eop == 2) { chnInf->flags |= CHANNEL_FLAGS_FORCE_BILOOP; } else if (eop == 3) // break sampleloop / oktalyzer too { breakLoop(chn); } break; // AMS: Set channel mastervol case 0x50 : chnInf->masterVol=eop; break; // Digibooster set real BPM case 0x52 : { if (eop) { baseBpm = eop >= 32 ? eop : 32; // Simply recalculate this->adder = getbpmrate(bpm); } break; } // Oktalyzer: fine note slide down case 0x54: { if (chnInf->note > eop) { chnInf->note-=eop; if (chnInf->note < 3*12) chnInf->note = 3*12; chnInf->per = getperiod(chnInf->note,chnInf->relnote,chnInf->finetune); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } } break; // Oktalyzer: fine note slide up case 0x55: { if (chnInf->note < XModule::NOTE_LAST-eop) { chnInf->note+=eop; if (chnInf->note > 6*12) chnInf->note = 6*12; chnInf->per = getperiod(chnInf->note,chnInf->relnote,chnInf->finetune); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; } } break; // S3M global volslide case 0x59 : { if (eop) chnInf->old[effcnt].gvolslide=eop; if (chnInf->old[effcnt].gvolslide) { y=chnInf->old[effcnt].gvolslide>>4; x=chnInf->old[effcnt].gvolslide&0xf; if ((x!=0x0F)&&(y!=0x0F)) break; if (x==0x0F && !y) break; if (y==0x0F && !x) break; if (x==0x0F) { mainVolume+=y*4; if (mainVolume>255) mainVolume=255; break; } if (y==0x0F) { mainVolume-=x*4; if (mainVolume<0) mainVolume=0; break; } } break; } } // switch } void PlayerSTD::doTickeffects() { for (mp_sint32 chn=0;chnspeed) dstEnv.bpmAdder = getbpmrate(dstEnv.envstruc->speed); } void PlayerSTD::triggerEnvelopes(TModuleChannel* chnInf) { mp_uword e = module->smp[chnInf->smp].venvnum; if (e) { triggerEnvelope(chnInf->venv, module->venvs[e-1]); } else chnInf->venv.envstruc=NULL; e = module->smp[chnInf->smp].penvnum; if (e) { triggerEnvelope(chnInf->penv, module->penvs[e-1]); } else chnInf->penv.envstruc=NULL; e = module->smp[chnInf->smp].fenvnum; if (e) { triggerEnvelope(chnInf->fenv, module->fenvs[e-1]); } else chnInf->fenv.envstruc=NULL; e = module->smp[chnInf->smp].vibenvnum; if (e) { triggerEnvelope(chnInf->vibenv, module->vibenvs[e-1]); } else chnInf->vibenv.envstruc=NULL; } void PlayerSTD::triggerAutovibrato(TModuleChannel* chnInf) { if (module->smp[chnInf->smp].vibdepth&&module->smp[chnInf->smp].vibrate) { //chnInf->avibused=1; chnInf->avibused=module->smp[chnInf->smp].vibtype+1; chnInf->avibdepth=module->smp[chnInf->smp].vibdepth; chnInf->avibspd=module->smp[chnInf->smp].vibrate; chnInf->avibswcnt=0; chnInf->avibsweep=module->smp[chnInf->smp].vibsweep; } else chnInf->avibused=0; } void PlayerSTD::triggerInstrumentFX(TModuleChannel* chnInf) { if (chnInf->smp != -1) { triggerEnvelopes(chnInf); triggerAutovibrato(chnInf); chnInf->fadevolstart = 65536; chnInf->fadevolstep = module->smp[chnInf->smp].volfade; } } void PlayerSTD::progressRow() { mp_sint32 slotsize = (numEffects*2)+2; TXMPattern* pattern = &module->phead[patternIndex]; mp_ubyte *row = pattern->patternData+ (pattern->channum*slotsize*rowcnt); //for (mp_sint32 chn=0;chn<1;chn++) { for (mp_sint32 chn=0;chncurrentnote = row[pp]; mp_sint32 i = row[pp+1]; bool noteporta = false; bool notedelay = false; mp_sint32 oldIns = chnInf->ins; mp_sint32 oldSmp = chnInf->smp; // Effect preprocessor & get effect + operand from interleaved pattern data mp_sint32 effcnt, finetune = 0x7FFFFFFF; for (effcnt = 0; effcnt < numEffects; effcnt++) { chnInf->eff[effcnt] = row[(pp+2)+(effcnt*2)]; chnInf->eop[effcnt] = row[(pp+2)+(effcnt*2+1)]; switch (chnInf->eff[effcnt]) { // We need to know if we process the note as new note or or portamento destination period case 0x03: case 0x05: noteporta = true; break; // XM key off at tick with tick operand == 0 is like normal key off case 0x14: if (chnInf->eop[effcnt] == 0) note = XModule::NOTE_OFF; break; // set finetune will override the instrument setting case 0x35: finetune = XModule::modfinetunes[playModeFT2 ? ((chnInf->eop[effcnt] - 8) & 0xF) : (chnInf->eop[effcnt] & 0xF)]; break; // note delay without note retriggers last note case 0x3d: if (chnInf->eop[effcnt]) { notedelay = true; if (!note && playModeFT2) note = chnInf->lastnoportanote; } break; } } // Check new instrument settings only if valid note or no note at all if (i && note <= XModule::NOTE_LAST) { // valid sample? bool invalidIns = true; bool invalidSmp = true; #ifdef MILKYTRACKER // ---------------------------------------------------------------- // When editing in MilkyTracker all instruments have 16 samples // So I need another way of finding out which instruments are // invalid ones // ---------------------------------------------------------------- mp_sint32 n = note; if (!note) n = chnInf->note; // here we have a little problem if (!n) { for (mp_sint32 j = 0; j < 120; j++) { if (module->instr[i-1].snum[j] != -1) { n = 1; break; } } } // invalid instrument if (i <= module->header.insnum && n && n <= 120) { mp_sint32 s = module->instr[i-1].snum[n-1]; if (module->smp[s].sample) invalidIns = false; } // invalid sample if (module->instr[i-1].samp && n && n <= 120) { mp_sint32 s = module->instr[i-1].snum[n-1]; if (s != -1 && module->smp[s].sample) invalidSmp = false; } #else // invalid instrument if (i <= module->header.insnum && module->instr[i-1].samp) invalidIns = false; // invalid sample if (module->instr[i-1].samp && module->instr[i-1].snum[0] != -1) invalidSmp = false; #endif if (!invalidIns) // valid sample chnInf->ins = i; else if (note) // invalid sample { // cut means stop sample in FT2 if (!newInsPTFlag && !newInsST3Flag && !noteporta) { chnInf->smp = -1; chnInf->ins = 0; stopSample(chn); } } // protracker sample cut when invalid instrument is triggered if (newInsPTFlag) { if (!note) { if (invalidSmp) { chnInf->smp = -1; chnInf->ins = 0; chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = 0; // cut means: volume to zero (no stop sample) chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; //stopSample(chn); } else { chnInf->smp = module->instr[i-1].snum[0]; } } else { if (invalidSmp) { chnInf->smp = -1; chnInf->ins = 0; chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = 0; // cut means: volume to zero (no stop sample) chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; // NOT sure!!! //stopSample(chn); } } } // screamtracker continues playing when invalid instrument is triggered // applies new volume when instrument only is triggered else if (newInsST3Flag) { if (!note) { if (!invalidSmp) { chnInf->smp = module->instr[i-1].snum[0]; } // completely invalid instrument without note, does nothing at all else { i = 0; } } } } chnInf->validnote = true; if (note && note < XModule::NOTE_OFF) { if (chnInf->ins) { chnInf->smp = module->instr[chnInf->ins-1].snum[note-1]; if ((module->instr[chnInf->ins-1].flags & 1) && module->instr[chnInf->ins-1].notemap[note-1] != 0xFF) { chnInf->currentnote = note = module->instr[chnInf->ins-1].notemap[note-1] + 1; } // invalid sample entry? // Only apply new fintune / relative note number when not doing portamento if (chnInf->smp != -1 && !noteporta) { mp_sint32 finalNote = note + (mp_sint32)module->smp[chnInf->smp].relnote; // Within current note range? if (finalNote >= 1 && finalNote <= 119) { chnInf->finetune = (finetune != 0x7FFFFFFF ? finetune : module->smp[chnInf->smp].finetune); chnInf->relnote = module->smp[chnInf->smp].relnote; chnInf->freqadjust = module->smp[chnInf->smp].freqadjust; } // This is not a valid note else { chnInf->validnote = false; note = chnInf->note; } } } mp_sint32 relnote = chnInf->relnote; mp_sint32 finetune = chnInf->finetune; // If this is not a note portamento // and a valid note => keep that note and calculate new period if (!noteporta) { chnInf->note=chnInf->lastnoportanote=note; chnInf->per=getperiod(note,relnote,finetune); chnInf->hasVibrato = false; chnInf->finalVibratoPer = 0; // if there is a valid note => destroy portamento to note memory when playing an S3M(?) if (/*newInsPTFlag||*/newInsST3Flag) { chnInf->destnote=0; chnInf->destper=0; } } // If this is a note portamento keep destination's note + period else { // if a note delay is happening while the portamento is set, [AND we don't have a note (?)] // we restore the original period, but the destination period keeps set if (playModeFT2 && notedelay/* && !chnInf->currentnote*/) { chnInf->per=getperiod(note,relnote,finetune); if (chnInf->currentnote) chnInf->lastnoportanote = chnInf->currentnote; noteporta = false; } else { chnInf->lastnoportanote=chnInf->note; chnInf->destnote=chnInf->note=note; chnInf->destper=getperiod(note,relnote,finetune); } } // If this has not been a valid note, do not trigger it if (!chnInf->validnote) note = 0; } // man this FT2 bug emulation starts getting on my nerves: // only take new instrument of there is no note porta if (playModeFT2 && i && (noteporta || !chnInf->validnote)) { i = chnInf->ins = oldIns; chnInf->smp = oldSmp; } // when we have a new instrument we apply the settings // for this instrument, but in FT2 mode we only do it, when we're not // having a note portamento at the same time if (i && chnInf->smp != -1 && note < XModule::NOTE_OFF) { if ((module->smp[chnInf->smp].flags&1)) { chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = module->smp[chnInf->smp].vol; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } if (playModeFT2 && (module->smp[chnInf->smp].flags&2)) chnInf->pan = module->smp[chnInf->smp].pan; if ((module->smp[chnInf->smp].flags&4)) chnInf->masterVol = module->smp[chnInf->smp].vol; triggerInstrumentFX(chnInf); // reset vibrato/tremolo/tremor/retrig counters for (effcnt=0;effcntvibpos[effcnt] = chnInf->tremorcnt[effcnt] = chnInf->trmpos[effcnt] = chnInf->retrigcounterRxx[effcnt] = 0; if (playModePT) smpoffs[chn] = 0; chnInf->keyon = true; } // ------ 11/05/05: it seems that note off commands are processed BEFORE effect commands // S3M style keyoff: // sample is stopped if (note == XModule::NOTE_CUT) { note=0; if (chnInf->venv.envstruc!=NULL) { if (!(chnInf->venv.envstruc->type&1)) { chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = 0; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; stopSample(chn); } } else { chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = 0; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; stopSample(chn); } } // XM style keyoff: // volume is set to zero else if (note == XModule::NOTE_OFF) { note=0; // no envelope or no volume envelope if (chnInf->venv.envstruc!=NULL) { if (!(chnInf->venv.envstruc->type&1)) { chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = 0; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } } else { chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = 0; chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } chnInf->keyon = false; } chnInf->hasSetVolume = false; for (effcnt=0;effcnteff[effcnt] == 0x09 && !note && module->getType() == XModule::ModuleType_MTM) { note = chnInf->note; } // FT2 hack // when note delay appears, we ignore the portamento operand else if (chnInf->eff[effcnt] == 0x03 && notedelay && playModeFT2) { chnInf->eop[effcnt] = 0; } doEffect(chn, chnInf, effcnt); } // for if (note) { if (note <= XModule::NOTE_OFF) { if (!noteporta) { playInstrument(chn, chnInf); } else if (oldPTInsChangeFlag && newInsPTFlag && noteporta && i && chnInf->smp != -1 && chnInf->note) { playInstrument(chn, chnInf, true); } } } // note else if (oldPTInsChangeFlag && newInsPTFlag && i && chnInf->note && chnInf->per) { playInstrument(chn, chnInf, true); } } } } void PlayerSTD::update() { mp_sint32 c; //for (c=10;c<11;c++) { #ifdef MILKYTRACKER for (c=0;cflags & CHANNEL_FLAGS_UPDATE_IGNORE) continue; mp_sint32 dfs = chnInf->flags & CHANNEL_FLAGS_DFS, dvs = chnInf->flags & CHANNEL_FLAGS_DVS; if ((chnInf->per)&&(!dfs)) setFreq(c,getfreq(c,getfinalperiod(c,chnInf->hasVibrato ? chnInf->finalVibratoPer : chnInf->per),chnInf->freqadjust)); if (!dvs) setVol(c,getvolume(c,chnInf-> hasTremolo ? chnInf->finalTremoloVol : chnInf->vol)); setPan(c,getpanning(c,chnInf->pan)); if (chnInf->venv.envstruc != NULL && !chnInf->venv.envstruc->speed) { prenvelope(c,&chnInf->venv,chnInf->keyon); } if (chnInf->penv.envstruc != NULL && !chnInf->penv.envstruc->speed) { prenvelope(c,&chnInf->penv,chnInf->keyon); } if (chnInf->fenv.envstruc != NULL && !chnInf->fenv.envstruc->speed) { prenvelope(c,&chnInf->fenv,chnInf->keyon); } if (chnInf->vibenv.envstruc != NULL && !chnInf->vibenv.envstruc->speed) { prenvelope(c,&chnInf->vibenv,chnInf->keyon); } if (!chnInf->keyon) { chnInf->fadevolstart-=chnInf->fadevolstep; if (chnInf->fadevolstart<0) chnInf->fadevolstart=0; } if (chnInf->avibused) { chnInf->avibcnt+=chnInf->avibspd; if (chnInf->avibswcntavibsweep) chnInf->avibswcnt++; } } } void PlayerSTD::updateBPMIndependent() { mp_int64 dummy; mp_sint32 c; #ifdef MILKYTRACKER for (c=0;cflags & CHANNEL_FLAGS_UPDATE_IGNORE) continue; bool dfs = chnInf->flags & CHANNEL_FLAGS_DFS, dvs = chnInf->flags & CHANNEL_FLAGS_DVS; // Volume envelope if (chnInf->venv.envstruc != NULL && chnInf->venv.envstruc->speed) { dummy = (mp_int64)chnInf->venv.bpmCounter; dummy+=(mp_int64)chnInf->venv.bpmAdder; chnInf->venv.bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(c,&chnInf->venv,chnInf->keyon); if (!dvs) setVol(c,getvolume(c,chnInf-> hasTremolo ? chnInf->finalTremoloVol : chnInf->vol)); } } // Panning envelope if (chnInf->penv.envstruc != NULL && chnInf->penv.envstruc->speed) { dummy = (mp_int64)chnInf->penv.bpmCounter; dummy+=(mp_int64)chnInf->penv.bpmAdder; chnInf->penv.bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(c,&chnInf->penv,chnInf->keyon); setPan(c,getpanning(c,chnInf->pan)); } } // Frequency envelope: Digitracker MDL if (chnInf->fenv.envstruc != NULL && chnInf->fenv.envstruc->speed) { dummy = (mp_int64)chnInf->fenv.bpmCounter; dummy+=(mp_int64)chnInf->fenv.bpmAdder; chnInf->fenv.bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(c,&chnInf->fenv,chnInf->keyon); if ((chnInf->per)&&(!dfs)) setFreq(c,getfreq(c,getfinalperiod(c,chnInf->per),chnInf->freqadjust)); } } // Vibrato envelope: Velvet Studio AMS if (chnInf->vibenv.envstruc != NULL && chnInf->vibenv.envstruc->speed) { dummy = (mp_int64)chnInf->vibenv.bpmCounter; dummy+=(mp_int64)chnInf->vibenv.bpmAdder; chnInf->vibenv.bpmCounter = (mp_sint32)dummy; // check overflow-carry if (dummy>>32) { prenvelope(c,&chnInf->vibenv,chnInf->keyon); if ((chnInf->per)&&(!dfs)) setFreq(c,getfreq(c,getfinalperiod(c,chnInf->per),chnInf->freqadjust)); } } } } void inline PlayerSTD::setNewPosition(mp_sint32 poscnt) { if (statusEventListener) statusEventListener->patternEndReached(*this, *module, poscnt); if (poscnt == this->poscnt) return; if (poscnt>=module->header.ordnum) poscnt=module->header.restart; // reset looping flags RESET_ALL_LOOPING lastUnvisitedPos = this->poscnt; this->poscnt = poscnt; } void PlayerSTD::tickhandler() { mp_sint32 maxTicks; if (!idle) { // Important! Without this, the different playmodes will not be recognized properly updatePlayModeFlags(); // sanity check 1 if (patternIndexToPlay == -1 && poscnt >= module->header.ordnum) { halt(); return; } // Play special pattern? if (patternIndexToPlay == -1) patternIndex = module->header.ord[poscnt]; else patternIndex = patternIndexToPlay; TXMPattern* pattern = &module->phead[patternIndex]; if (pattern->patternData == NULL) { halt(); return; } // sanity check 2 :) if (rowcnt >= pattern->rows) { if (patternIndexToPlay == -1) { //rowcnt = 0; ticker = 0; goto nextrow; } else { //halt(); //return; rowcnt = 0; ticker = 0; } } numEffects = pattern->effnum; numChannels = pattern->channum <= module->header.channum ? pattern->channum : module->header.channum; mp_sint32 c; if (ticker == 0) { // Keep track of visited rows mp_sint32 absolutePos = poscnt*256+rowcnt; if (isRowVisited(absolutePos) && !repeat) { // pattern loop active? bool b = false; for (c=0;cpatternData+(pattern->channum*slotsize*rowcnt); // process high priority effects in advance to other effects mp_ubyte* slot = row; for (c=0;c=maxTicks) { if (patDelay) patDelay = false; // reset ticker ticker=0; // if we're told to play this row only, we will stop now // and neither process any of those pattern jump/repeat stuff if (playOneRowOnly) { BPMCounter = adder = 0; return; } if (patternIndexToPlay == -1) { // break pattern? if (pbreak&&(poscnt<(module->header.ordnum-1))) { if (!pjump || (pjump && pjumpPriority > pbreakPriority)) setNewPosition(poscnt+1); rowcnt=pbreakpos-1; startNextRow = -1; } else if (pbreak&&(poscnt==(module->header.ordnum-1))) { // Pattern break on the last order? Break to restart position if (!pjump || (pjump && pjumpPriority > pbreakPriority)) setNewPosition(module->header.restart); rowcnt=pbreakpos-1; startNextRow = -1; } // pattern jump? if (pjump) { if (!pbreak || (pbreak && pjumpPriority > pbreakPriority)) rowcnt = pjumprow-1; setNewPosition(pjumppos); startNextRow = -1; } // it could be that our position has changed because // of position jumps, so make sure we're getting the real position here patternIndex = module->header.ord[poscnt]; } // We have one pattern to play else { // Position jump occurred and repeating is allowed, start again if (pjump || pbreak) { rowcnt = -1; startNextRow = -1; if (statusEventListener) statusEventListener->patternEndReached(*this, *module, poscnt); } //RESETLOOPING // macro } // handle loop for (c=0;c=module->phead[patternIndex].rows) { // start at row 0? if (startNextRow != -1) { rowcnt = startNextRow; startNextRow = -1; } else { rowcnt = 0; } if (patternIndexToPlay == -1) { // play next order setNewPosition(poscnt+1); } // We have one pattern to play but repeating isn't allowed, so stop here else if (!repeat) { halt(); return; } // We have one pattern to play and repeating is allowed so start again else { rowcnt = 0; // reset looping flags RESET_ALL_LOOPING if (statusEventListener) statusEventListener->patternEndReached(*this, *module, poscnt); } } // halting has been requested if (haltFlag) { halt(); } } } else { numChannels = module->header.channum; } update(); } void PlayerSTD::halt() { halted = true; BPMCounter = adder = 0; if (resetOnStopFlag) resetChannelsWithoutMuting(); } bool PlayerSTD::grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const { channelInfo.note = chninfo[chn].currentnote; channelInfo.instrument = chninfo[chn].ins; channelInfo.volume = chninfo[chn].vol; channelInfo.panning = chninfo[chn].pan; channelInfo.numeffects = numEffects; memcpy(channelInfo.effects, chninfo[chn].eff, sizeof(chninfo[chn].eff)); memcpy(channelInfo.operands, chninfo[chn].eop, sizeof(chninfo[chn].eop)); return true; } ////////////////////////////////////////////////////////////////////////////////////////// // for MilkyTracker use ////////////////////////////////////////////////////////////////////////////////////////// void PlayerSTD::playNote(mp_ubyte chn, mp_sint32 note, mp_sint32 i, mp_sint32 vol/* = -1*/) { if (!i) return; //stopSample(chn); smpoffs[chn] = 0; TModuleChannel *chnInf = &chninfo[chn]; bool invalidSample = false; #ifdef MILKYTRACKER for (mp_uint32 j = 0; j < 96; j++) #else for (mp_uint32 j = 0; j < 120; j++) #endif { mp_sword s = module->instr[i-1].snum[j]; if (s != -1 && module->smp[s].sample) { invalidSample = true; break; } } if (!invalidSample) return; chnInf->ins = i; if (note && note < XModule::NOTE_OFF) { if (chn >= module->header.channum) chnInf->pan = 0x80; if (chnInf->ins) { chnInf->smp = module->instr[chnInf->ins-1].snum[note-1]; // invalid sample entry if (chnInf->smp != -1) { if (module->smp[chnInf->smp].sample == NULL) { chnInf->ins = 0; return; } mp_sint32 finalNote = note + (mp_sint32)module->smp[chnInf->smp].relnote; // Within current note range? if (!(finalNote >= 1 && finalNote <= 119)) return; chnInf->finetune=module->smp[chnInf->smp].finetune; chnInf->relnote=module->smp[chnInf->smp].relnote; } } mp_sint32 relnote = chnInf->relnote; mp_sint32 finetune = chnInf->finetune; chnInf->note=note; chnInf->per=getperiod(note,relnote,finetune); } if (i && chnInf->smp != -1 && note < XModule::NOTE_OFF) { if ((module->smp[chnInf->smp].flags&1)) { chnInf->vol = chnInf->tremorVol = chnInf->tremoloVol = (vol == -1 ? module->smp[chnInf->smp].vol : vol); chnInf->hasTremolo = false; chnInf->finalTremoloVol = 0; } if ((playMode == PlayMode_FastTracker2) && (module->smp[chnInf->smp].flags&2)) chnInf->pan=module->smp[chnInf->smp].pan; if ((module->smp[chnInf->smp].flags&4)) chnInf->masterVol=module->smp[chnInf->smp].vol; triggerInstrumentFX(chnInf); // reset vibrato/tremolo/tremor counter for (mp_sint32 effcnt=0;effcntvibpos[effcnt] = chnInf->tremorcnt[effcnt] = chnInf->trmpos[effcnt] = 0; chnInf->keyon = true; } if (note) { // S3M style key-off // sample is stopped if (note == XModule::NOTE_CUT) { note=0; if (chnInf->venv.envstruc!=NULL) { if (!(chnInf->venv.envstruc->type&1)) { chnInf->vol = 0; stopSample(chn); } } else { chnInf->vol=0; stopSample(chn); } } // XM style-keyoff // volume is set to zero else if (note == XModule::NOTE_OFF) { note=0; if (chnInf->venv.envstruc!=NULL) { if (!(chnInf->venv.envstruc->type&1)) chnInf->vol = 0; } else chnInf->vol=0; chnInf->keyon = false; } else { playInstrument(chn, chnInf); } } } milkytracker-0.90.85+dfsg/src/milkyplay/XMFile.cpp0000644000175000017500000002701711163403715021065 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ ////////////////////////////////////////////////////////////////////////// // System dependent file loading routines // // to make future porting easier // ////////////////////////////////////////////////////////////////////////// #include "XMFile.h" XMFileBase::XMFileBase() : baseOffset(0) { } XMFileBase::~XMFileBase() { } void XMFileBase::seekWithBaseOffset(mp_dword pos) { seek(pos+baseOffset); } mp_uint32 XMFileBase::sizeWithBaseOffset() { return size()-baseOffset; } mp_uint32 XMFileBase::posWithBaseOffset() { return pos()-baseOffset; } ////////////////////////////////////////////////////////////////////////// // Reading/writing of little endian stuff // ////////////////////////////////////////////////////////////////////////// mp_ubyte XMFileBase::readByte() { mp_ubyte c; mp_sint32 bytesRead = read(&c,1,1); //ASSERT(bytesRead == 1); if (!(bytesRead == 1)) c = 0; return (mp_ubyte)c; } mp_uword XMFileBase::readWord() { mp_ubyte c[2]; mp_sint32 bytesRead = read(&c,1,2); //ASSERT(bytesRead == 2); if (!(bytesRead == 2)) c[0] = c[1] = 0; return (mp_uword)((mp_uword)c[0]+((mp_uword)c[1]<<8)); } mp_dword XMFileBase::readDword() { mp_ubyte c[4]; mp_sint32 bytesRead = read(&c,1,4); //ASSERT(bytesRead == 4); if (!(bytesRead == 4)) c[0] = c[1] = c[2] = c[3] = 0; return (mp_dword)((mp_uint32)c[0]+ ((mp_uint32)c[1]<<8)+ ((mp_uint32)c[2]<<16)+ ((mp_uint32)c[3]<<24)); } void XMFileBase::readWords(mp_uword* buffer,mp_sint32 count) { for (mp_sint32 i = 0; i < count; i++) *buffer++ = readWord(); } void XMFileBase::readDwords(mp_dword* buffer,mp_sint32 count) { for (mp_sint32 i = 0; i < count; i++) *buffer++ = readDword(); } void XMFileBase::writeByte(mp_ubyte b) { mp_sint32 bytesWritten = write(&b, 1, 1); ASSERT(bytesWritten == 1); } void XMFileBase::writeWord(mp_uword w) { mp_ubyte c[2]; c[0] = (mp_ubyte)w; c[1] = (mp_ubyte)(w>>8); mp_sint32 bytesWritten = write(&c, 1, 2); ASSERT(bytesWritten == 2); } void XMFileBase::writeDword(mp_dword dw) { mp_ubyte c[4]; c[0] = (mp_ubyte)dw; c[1] = (mp_ubyte)(dw>>8); c[2] = (mp_ubyte)(dw>>16); c[3] = (mp_ubyte)(dw>>24); mp_sint32 bytesWritten = write(&c, 1, 4); ASSERT(bytesWritten == 4); } void XMFileBase::writeWords(const mp_uword* buffer,mp_sint32 count) { for (mp_sint32 i = 0; i < count; i++) { writeWord(*buffer); buffer++; } } void XMFileBase::writeDwords(const mp_dword* buffer,mp_sint32 count) { for (mp_sint32 i = 0; i < count; i++) { writeDword(*buffer); buffer++; } } void XMFileBase::writeString(const char* string) { write(string, 1, strlen(string)); } #define BUFFERSIZE 16384 ////////////////////////////////////////////////////////////////////////// // WIN32 implentation // ////////////////////////////////////////////////////////////////////////// #ifdef WIN32 #include XMFile::XMFile(const SYSCHAR* fileName, bool writeAccess /* = false*/) : XMFileBase(), fileName(fileName), cacheBuffer(NULL) { this->writeAccess = writeAccess; bytesRead = 0; handle = CreateFile(fileName, writeAccess ? GENERIC_WRITE : GENERIC_READ, writeAccess ? FILE_SHARE_WRITE : FILE_SHARE_READ, NULL, writeAccess ? CREATE_ALWAYS : OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //ASSERT(handle != INVALID_HANDLE_VALUE); if (writeAccess) { cacheBuffer = new mp_ubyte[BUFFERSIZE+16]; currentCacheBufferPtr = cacheBuffer; } } bool XMFile::isOpen() { return handle != INVALID_HANDLE_VALUE; } XMFile::~XMFile() { if (writeAccess && handle != INVALID_HANDLE_VALUE) flush(); if (cacheBuffer) delete[] cacheBuffer; CloseHandle(handle); } mp_sint32 XMFile::read(void* ptr,mp_sint32 size,mp_sint32 count) { unsigned long NumberOfBytesRead; bool bResult = (bool)ReadFile(handle,ptr,size*count,&NumberOfBytesRead,NULL); bytesRead+=(mp_uint32)NumberOfBytesRead; if (!bResult) return -1; return (mp_sint32)NumberOfBytesRead; } void XMFile::flush() { unsigned long NumberOfBytesWritten; bool bResult = (bool)WriteFile(handle,cacheBuffer, currentCacheBufferPtr-cacheBuffer, &NumberOfBytesWritten, NULL); bytesRead+=(mp_uint32)NumberOfBytesWritten; currentCacheBufferPtr = cacheBuffer; } mp_sint32 XMFile::write(const void* ptr,mp_sint32 size,mp_sint32 count) { #ifdef DEBUG unsigned long NumberOfBytesWritten; bool bResult = (bool)WriteFile(handle,ptr,size*count,&NumberOfBytesWritten,NULL); bytesRead+=(mp_uint32)NumberOfBytesWritten; if (!bResult) return -1; return (mp_sint32)NumberOfBytesWritten; FlushFileBuffers(handle); #else // Buffer to be written is bigger than our internal cache // => Write through if (size*count > BUFFERSIZE) { // Flush first flush(); unsigned long NumberOfBytesWritten; bool bResult = (bool)WriteFile(handle,ptr,size*count,&NumberOfBytesWritten,NULL); bytesRead+=(mp_uint32)NumberOfBytesWritten; if (!bResult) return -1; return (mp_sint32)NumberOfBytesWritten; } // Buffer to be written still fits into our cache buffer if (size*count + currentCacheBufferPtr <= cacheBuffer+BUFFERSIZE) { // Copy into cache memcpy(currentCacheBufferPtr, ptr, size*count); // Advance current cache ptr currentCacheBufferPtr += size*count; } else { // Buffer doesn't fit, flush buffer first flush(); // Copy into cache memcpy(currentCacheBufferPtr, ptr, size*count); // Advance currentCacheBufferPtr += size*count; } if (currentCacheBufferPtr == cacheBuffer + BUFFERSIZE) flush(); bytesRead+=size*count; return size*count; #endif } void XMFile::seek(mp_uint32 pos, SeekOffsetTypes seekOffsetType/* = SeekOffsetTypeStart*/) { if (writeAccess) { flush(); } DWORD moveMethod = FILE_BEGIN; if (seekOffsetType == XMFile::SeekOffsetTypeCurrent) moveMethod = FILE_CURRENT; else if (seekOffsetType == XMFile::SeekOffsetTypeEnd) moveMethod = FILE_END; SetFilePointer(handle, pos, NULL, moveMethod); } mp_uint32 XMFile::pos() { return SetFilePointer(handle, 0, NULL, FILE_CURRENT); } mp_uint32 XMFile::size() { mp_uint32 size = 0; mp_uint32 curPos = pos(); SetFilePointer(handle, 0, NULL, FILE_END); size = pos(); seek(curPos); return size; } bool XMFile::remove(const SYSCHAR* file) { return DeleteFile(file); } bool XMFile::exists(const SYSCHAR* file) { HANDLE handle = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); bool res = handle != INVALID_HANDLE_VALUE; if (res) CloseHandle(handle); return res; } const char* XMFile::getFileNameASCII() { const SYSCHAR* ptr = fileName+_tcslen(fileName); while (*ptr != '\\' && ptr > fileName) ptr--; if (*ptr == '\\') ptr++; fileNameASCII = new char[_tcslen(ptr)+1]; for (mp_uint32 i = 0; i <= _tcslen(ptr); i++) fileNameASCII[i] = (char)ptr[i]; //strcpy(fileNameASCII, ptr); return fileNameASCII; } ////////////////////////////////////////////////////////////////////////// // C compatible implentation // ////////////////////////////////////////////////////////////////////////// #else #include XMFile::XMFile(const SYSCHAR* fileName, bool writeAccess /* = false*/) : XMFileBase(), fileName(fileName), fileNameASCII(NULL), cacheBuffer(NULL) { this->writeAccess = writeAccess; bytesRead = 0; handle = fopen(fileName,writeAccess?"wb":"rb"); //ASSERT(handle != NULL); if (writeAccess) { cacheBuffer = new mp_ubyte[BUFFERSIZE]; currentCacheBufferPtr = cacheBuffer; } } XMFile::~XMFile() { if (writeAccess && handle != NULL) flush(); if (handle != NULL) fclose(handle); if (fileNameASCII) delete[] fileNameASCII; if (cacheBuffer) delete[] cacheBuffer; } bool XMFile::isOpen() { return handle != NULL; } mp_sint32 XMFile::read(void* ptr, mp_sint32 size, mp_sint32 count) { unsigned long NumberOfBytesRead = fread(ptr,size,count,handle)*size; bytesRead += NumberOfBytesRead; return (mp_sint32)NumberOfBytesRead; } void XMFile::flush() { fwrite(cacheBuffer, 1, currentCacheBufferPtr-cacheBuffer, handle); currentCacheBufferPtr = cacheBuffer; } mp_sint32 XMFile::write(const void* ptr, mp_sint32 size, mp_sint32 count) { // Buffer to be written is bigger than our internal cache // => Write through if (size*count > BUFFERSIZE) { // Flush first flush(); unsigned long NumberOfBytesWritten = fwrite(ptr,size,count,handle)*size; bytesRead += NumberOfBytesWritten; return (mp_sint32)NumberOfBytesWritten; } // Buffer to be written still fits into our cache buffer if (size*count + currentCacheBufferPtr <= cacheBuffer+BUFFERSIZE) { // Copy into cache memcpy(currentCacheBufferPtr, ptr, size*count); // Advance current cache ptr currentCacheBufferPtr += size*count; } else { // Buffer doesn't fit, flush buffer first flush(); // Copy into cache memcpy(currentCacheBufferPtr, ptr, size*count); // Advance currentCacheBufferPtr += size*count; } if (currentCacheBufferPtr == cacheBuffer + BUFFERSIZE) flush(); bytesRead+=size*count; return size*count; } void XMFile::seek(mp_uint32 pos, SeekOffsetTypes seekOffsetType/* = SeekOffsetTypeStart*/) { if (writeAccess) { flush(); fflush(handle); } int moveMethod = SEEK_SET; if (seekOffsetType == XMFile::SeekOffsetTypeCurrent) moveMethod = SEEK_CUR; else if (seekOffsetType == XMFile::SeekOffsetTypeEnd) moveMethod = SEEK_END; fseek(handle,pos,moveMethod); } mp_uint32 XMFile::pos() { return ftell(handle); } mp_uint32 XMFile::size() { mp_uint32 size = 0; mp_uint32 curPos = pos(); fseek(handle,0,SEEK_END); size = pos(); seek(curPos); return size; } bool XMFile::exists(const SYSCHAR* file) { FHANDLE handle = fopen(file,"rb"); bool res = handle != NULL; if (res) fclose(handle); return res; } bool XMFile::remove(const SYSCHAR* file) { return unlink(file) == 0; } const char* XMFile::getFileNameASCII() { const SYSCHAR* ptr = fileName+strlen(fileName); while (*ptr != '/' && ptr > fileName) ptr--; if (*ptr == '/') ptr++; fileNameASCII = new char[strlen(ptr)+1]; strcpy(fileNameASCII, ptr); return fileNameASCII; } #endif milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriverManager.h0000644000175000017500000000510411163403715023107 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriverManager.h * * This class serves as provider and manager of different kind of * AudioDriver instances. Different kinds of AudioDrivers can be * requested on the same system. * * */ #ifndef __AUDIODRIVERMANAGER_H__ #define __AUDIODRIVERMANAGER_H__ #include "MilkyPlayTypes.h" class AudioDriverInterface; class AudioDriverManager { private: AudioDriverInterface** driverList; mp_sint32 numDrivers; mp_sint32 defaultDriverIndex; mutable mp_sint32 enumerationIndex; public: AudioDriverManager(); ~AudioDriverManager(); /** * Get the preferred audio driver for this system * NULL is returned if either none is available or an alloc error occurred * @return audio driver instance */ AudioDriverInterface* getPreferredAudioDriver(); AudioDriverInterface* getAudioDriverByName(const char* name); const char* getFirstDriverName() const; const char* getNextDriverName() const; mp_sint32 getPreferredAudioDriverSampleRate() const; mp_sint32 getPreferredAudioDriverBufferSize() const; }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderFAR.cpp0000644000175000017500000001641711163403715021502 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderFAR.cpp * MilkyPlay Module Loader: Farandole Composer * */ #include "Loaders.h" const char* LoaderFAR::identifyModule(const mp_ubyte* buffer) { // check for .FAR module if (!memcmp(buffer,"FAR\xFE",4)) { return "FAR"; } return NULL; } mp_sint32 LoaderFAR::load(XMFileBase& f, XModule* module) { mp_ubyte buffer[2048]; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_sint32 i,j; // read most of the header f.read(buffer, 1, 98); memcpy(header->sig, buffer, 3); memcpy(header->name, buffer + 4, 32); header->freqtab = 1; header->mainvol = 255; header->tempo = buffer[75]; header->speed = 80; header->tempo = 4; header->channum = 16; char* unpackedSongMessage = new char[LittleEndian::GET_WORD(buffer + 96)]; f.read(unpackedSongMessage, 1, LittleEndian::GET_WORD(buffer + 96)); mp_sint32 size = LittleEndian::GET_WORD(buffer + 96); // song message isn't null terminated for (i = 0; i < size; i++) if (unpackedSongMessage[i] == '\0') unpackedSongMessage[i] = ' '; for (i = 0; i < size; i++) { char line[140]; memset(line, 0, sizeof(line)); if (size - i >= 131) { XModule::convertStr(line, unpackedSongMessage+i, 132, false); i+=131; } else { XModule::convertStr(line, unpackedSongMessage+i, size-i, false); i+=size-i; } module->addSongMessageLine(line); } delete[] unpackedSongMessage; f.read(header->ord, 1, 256); header->patnum = f.readByte(); header->ordnum = f.readByte(); header->restart = f.readByte(); mp_uword patSizes[256]; f.readWords(patSizes, 256); j = LittleEndian::GET_WORD(buffer + 47) - (869 + LittleEndian::GET_WORD(buffer + 96)); for (i = 0; i < j; i++) f.readByte(); j = 0; for (i = 0; i < 256; i++) if (patSizes[i]) j = i; header->patnum = j+1; for (i = 0; i < header->patnum; i++) { if (patSizes[i]) { mp_ubyte* pattern = new mp_ubyte[patSizes[i]]; f.read(pattern, 1, patSizes[i]); // brauch ich des? mp_sint32 pNumRows = (patSizes[i] - 2) / (16*4); mp_sint32 numRows = *pattern + 2; // huh? if (numRows > pNumRows) numRows = pNumRows; phead[i].rows = numRows; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)]; // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)); mp_sint32 r,c,cnt = 2; mp_sint32 offs = 0; for (r=0;r < phead[i].rows; r++) { for (c=0;c < header->channum;c++) { mp_ubyte note = pattern[cnt]; mp_ubyte ins = pattern[cnt+1]; mp_ubyte vol = pattern[cnt+2]; mp_ubyte eff = pattern[cnt+3] >> 4; mp_ubyte op = pattern[cnt+3] & 0x0F; if (vol) { vol = XModule::vol64to255(vol << 2); phead[i].patternData[offs+2] = 0x0C; phead[i].patternData[offs+3] = vol; } if (note) { note+=12*3; ins++; } phead[i].patternData[offs]=note; phead[i].patternData[offs+1]=ins; eff=0x70; op = pattern[cnt+3]; /*switch (eff) { // porta to note case 0x03: op <<= 4; break; // retrigger case 0x04: eff = 0x39; break; // vibrato depth case 0x5: vibDepth[c] = op; break; // vibrato case 0x6: eff = 0x04; op = (op<<4)|vibDepth[c]; break; // volslide up case 0x07: eff = 0x0A; op<<=4; break; // volslide down case 0x08: eff = 0x0A; break; // break case 0x0B: eff = 0x08; op <<= 4; break; case 0x00: break; case 0x0f: eff = 0x7f; break; default: printf("Missing effects %i,%i\n",eff,op); eff = op = 0; }*/ phead[i].patternData[offs+4]=eff; phead[i].patternData[offs+5]=op; offs+=(phead[i].effnum * 2 + 2); cnt+=4; } } delete[] pattern; } } char sampleMap[8]; f.read(sampleMap, 1, 8); j = 0; for (i = 0; i < 64; i++) if (sampleMap[i>>3]&(1<<(i&7))) j = i+1; header->insnum = j; mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { if (sampleMap[i>>3]&(1<<(i&7))) { instr[i].samp = 1; for (j = 0; j < 120; j++) instr[i].snum[j] = s; f.read(instr[i].name, 1, 32); memcpy(smp[s].name, instr[i].name, 32); mp_sint32 size = f.readDword(); mp_ubyte finetune = f.readByte(); mp_sint32 volume = f.readByte() << 4; if (volume>255) volume = 255; mp_sint32 repstart = f.readDword(); mp_sint32 repend = f.readDword(); mp_ubyte type = f.readByte(); mp_ubyte flags = f.readByte(); smp[s].vol = volume; smp[s].flags = 1; smp[s].samplen = size; smp[s].loopstart = repstart; mp_sint32 looplen = (repend - repstart); if (looplen < 0) looplen = 0; smp[s].looplen = looplen; if (flags & 8) smp[s].type = 1; if (type & 1) { smp[s].type |= 16; smp[s].samplen >>= 1; smp[s].loopstart >>=1; smp[s].looplen >>=1; } if (module->loadModuleSample(f, s) != 0) return -7; s++; } } header->smpnum = s; strcpy(header->tracker,"Farandole Composer"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderS3M.cpp0000644000175000017500000003325411163403715021472 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderS3M.cpp * MilkyPlay Module Loader: ScreamTracker 3 */ #include "Loaders.h" const char* LoaderS3M::identifyModule(const mp_ubyte* buffer) { // check for .S3M module if (!memcmp(buffer+0x2C,"SCRM",4)) { return "S3M"; } // this is not an .S3M return NULL; } static mp_sint32 convertS3MPattern(TXMPattern* XMPattern, const mp_ubyte* srcPattern, mp_uint32 maxChannels, mp_sint32 patCnt) { XMPattern->channum = maxChannels; XMPattern->effnum = 2; XMPattern->rows = 64; XMPattern->patternData = new mp_ubyte[maxChannels*6*64]; if (XMPattern->patternData == NULL) { return -1; } memset(XMPattern->patternData,0,maxChannels*6*64); mp_ubyte* dstSlot = XMPattern->patternData; for (mp_sint32 row = 0; row < 64; row++) for (mp_uint32 c = 0; c < maxChannels; c++) { const mp_ubyte* srcSlot = srcPattern+row*32*5+c*5; mp_ubyte note = srcSlot[0]; mp_ubyte finalNote = 0; if (note<254) { finalNote = ((note>>4)*12+(note&0x0f))+1; if (finalNote>120) { #ifdef VERBOSE printf("Wrong note: %i",finalNote); #endif finalNote = 0; } } else if (note==254) { finalNote = 122; // key off, s3m style } dstSlot[0] = finalNote; dstSlot[1] = srcSlot[1]; if (srcSlot[2]<=64) { //if (note != 254) //{ dstSlot[2] = 0xC; dstSlot[3] = XModule::vol64to255(srcSlot[2]); //} } mp_ubyte eff = srcSlot[3]; mp_ubyte op = srcSlot[4]; /*if (patCnt == 51 && c == 7) { printf("%i, %i\n",srcSlot[0],srcSlot[1]); getch(); }*/ mp_ubyte nEff = 0; mp_ubyte nOp = 0; switch (eff) { // Set speed (ticks) case 0x01: nEff = 0x1C; nOp = op; break; // Jump to order case 0x02: nEff = 0x0B; nOp = op; break; // Pattern break case 0x03: nEff = 0x0D; nOp = op; break; // volume slide case 0x04: nEff = 0x49; nOp = op; break; // porta down case 0x05: nEff = 0x48; nOp = op; break; // porta up case 0x06: nEff = 0x47; nOp = op; break; // tone porta case 0x07: nEff = 0x03; nOp = op; break; // vibrato case 0x08: nEff = 0x04; nOp = op; break; // tremor case 0x09: nEff = 0x1D; nOp = op; break; // arpeggio case 0x0A: nEff = 0x20; nOp = op; break; // vibrato & volslide case 0x0B: nEff = 0x06; nOp = op; break; // tone porta & volslide case 0x0C: nEff = 0x05; nOp = op; break; // set sample offset case 0x0F: nEff = 0x09; nOp = op; break; // retrig case 0x11: nEff = 0x1B; nOp = op; break; // tremolo case 0x12: nEff = 0x07; nOp = op; break; // various subeffects case 0x13: eff = op>>4; op&=0xf; switch (eff) { // set panning case 0x8: nEff = 0x08; nOp = XModule::pan15to255(op); break; // pattern loop case 0xB: nEff = 0x36; nOp = op; break; // note cut case 0xC: nEff = 0x3C; nOp = op; break; // note delay case 0xD: nEff = 0x3D; nOp = op; break; // pattern delay case 0xE: nEff = 0x3E; nOp = op; break; default: #ifdef VERBOSE printf("Unsupported subcommand in Pattern %i, Channel %i, Row %i: %x,%x\n",patCnt,c,row,eff,op); #endif break; } break; // set tempo case 0x14: nEff = 0x16; nOp = op; break; // fine vibrato case 0x15: nEff = 0x4A; nOp = op; break; // set global volume case 0x16: if (op>64) op = 64; nEff = 0x10; nOp = XModule::vol64to255(op); break; // global volume slide (stupid IT/MPT) case 0x17: nEff = 0x59; nOp = op; break; default: #ifdef VERBOSE if (eff!=255) { printf("Unsupported command: %x,%x\n",eff,op); } #endif break; } /*if (patCnt == 3 && c == 6) { printf("%x, %x, %x\n",finalNote,nEff,nOp); }*/ dstSlot[4] = nEff; dstSlot[5] = nOp; dstSlot+=6; } return 0; } mp_sint32 LoaderS3M::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(&header->name,1,28); header->whythis1a = f.readByte(); if (f.readByte() != 16) return -8; // no ST3 module f.readByte(); // skip something f.readByte(); // skip something header->ordnum = f.readWord(); // number of positions in order list (songlength) mp_ubyte* orders = new mp_ubyte[header->ordnum]; if (orders == NULL) return -7; header->insnum = f.readWord(); // number of instruments header->patnum = f.readWord(); // number of patterns mp_sint32 flags = f.readWord(); // st3 flags mp_sint32 Cvt = f.readWord(); header->flags = XModule::MODULE_ST3NEWINSTRUMENT | XModule::MODULE_ST3DUALCOMMANDS; if (Cvt == 0x1300 || (flags & 64)) header->flags |= module->MODULE_OLDS3MVOLSLIDES; header->flags |= module->MODULE_ST3NOTECUT; /*mp_uword Ffi = */f.readWord(); f.read(header->sig,1,4); header->mainvol = module->vol64to255(f.readByte()); // initial main volume header->tempo = f.readByte(); // tempo header->speed = f.readByte(); // speed f.readByte(); // global volume? skipped... f.readByte(); // ignore GUS click removal /*mp_ubyte dp = */f.readByte(); f.readDword(); // skip something f.readDword(); // skip something f.readWord(); // skip some more... mp_ubyte channelSettings[32]; f.read(channelSettings,1,32); mp_sint32 numChannels = 0; for (numChannels = 0; numChannels < 32; numChannels++) if (channelSettings[numChannels] == 255) break; header->channum = numChannels; // number of channels f.read(orders,1,header->ordnum); mp_sint32 j = 0, i = 0; for (i = 0; i < header->ordnum; i++) { if (orders[i] == 255) break; header->ord[j++] = orders[i]; } header->ordnum = j; // final songlength delete[] orders; mp_uword* insParaPtrs = new mp_uword[header->insnum]; if (insParaPtrs == NULL) return -7; f.readWords(insParaPtrs,header->insnum); mp_uword* patParaPtrs = new mp_uword[header->patnum]; if (patParaPtrs == NULL) { delete[] insParaPtrs; return -7; } f.readWords(patParaPtrs,header->patnum); //for (i = 0; i < header->insnum; i++) //{ // printf("%x\n",insParaPtrs[i]*16); //} ////////////////////// // read instruments // ////////////////////// mp_uint32* samplePtrs = new mp_uint32[header->insnum]; if (samplePtrs == NULL) { delete[] insParaPtrs; delete[] patParaPtrs; return -7; } memset(samplePtrs,0,sizeof(mp_uint32)*header->insnum); mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { mp_uint32 insOffs = insParaPtrs[i]*16; if (insOffs) { f.seekWithBaseOffset(insOffs); // We can only read that if it's a sample mp_ubyte type = f.readByte(); if (type == 1) { f.read(smp[s].name,1,12); // read dos filename mp_ubyte bOffs = f.readByte(); mp_uword wOffs = f.readWord(); // stupid fileoffsets samplePtrs[i] = (((mp_uint32)bOffs<<16)+(mp_uint32)wOffs)*16; smp[s].flags = 1; smp[s].pan = 0x80; smp[s].samplen = f.readDword(); smp[s].loopstart = f.readDword(); mp_sint32 looplen = ((mp_sint32)f.readDword() - (mp_sint32)smp[s].loopstart); if (looplen < 0) looplen = 0; smp[s].looplen = looplen; smp[s].vol = module->vol64to255(f.readByte()); f.readByte(); // skip something smp[s].res = f.readByte() == 0x04 ? 0xAD : 0; // packing mp_ubyte flags = f.readByte(); // looping if (flags & 1) { smp[s].type = 1; } // 16 bit sample if (flags & 4) { smp[s].type |= 16; smp[s].samplen >>= 1; smp[s].loopstart >>= 1; smp[s].looplen >>= 1; } mp_uint32 c4spd = f.readDword(); XModule::convertc4spd(c4spd,&smp[s].finetune,&smp[s].relnote); #ifdef VERBOSE printf("%i, %i\n",c4spd,module->getc4spd(smp[s].relnote,smp[s].finetune)); #endif f.readDword(); // skip something f.readDword(); // skip two internal words f.readDword(); // skip internal dword f.read(instr[i].name,1,28); // instrument name f.readDword(); // skip signature if (samplePtrs[i] && smp[s].samplen) { instr[i].samp=1; for (j=0;j<120;j++) instr[i].snum[j] = s; s++; } } else if (type == 0) { samplePtrs[i] = 0; mp_ubyte buffer[12]; f.read(buffer,1,12); // read dos filename f.readByte(); f.readWord(); f.readDword(); f.readDword(); f.readDword(); f.readByte(); f.readByte(); // skip something f.readByte(); // skip packing f.readByte(); f.readDword(); f.readDword(); // skip something f.readDword(); // skip two internal words f.readDword(); // skip internal dword f.read(instr[i].name,1,28); // instrument name f.readDword(); // skip signature } else { samplePtrs[i] = 0; } } } ////////////////////// // read patterns // ////////////////////// mp_ubyte* pattern = new mp_ubyte[64*32*5]; if (pattern == NULL) { delete[] insParaPtrs; delete[] patParaPtrs; delete[] samplePtrs; return -7; } mp_uint32 songMaxChannels = 1; for (i = 0; i < header->patnum; i++) { for (j = 0; j < 32*64; j++) { pattern[j*5] = 0xFF; pattern[j*5+1] = 0; pattern[j*5+2] = 0xFF; pattern[j*5+3] = 0xFF; pattern[j*5+4] = 0; } mp_uint32 patOffs = patParaPtrs[i]*16; mp_uint32 maxChannels = 1; if (patOffs) { f.seekWithBaseOffset(patOffs); mp_uint32 size = f.readWord()-2; mp_ubyte* packed = new mp_ubyte[size+5]; if (packed == NULL) { delete[] insParaPtrs; delete[] patParaPtrs; delete[] samplePtrs; delete[] pattern; return -7; } f.read(packed,1,size); mp_uint32 index = 0; mp_uint32 row = 0; while (indexmaxChannels && (pi & (32+64+128))) { maxChannels = chn; } mp_ubyte* slot = pattern+(row*32*5)+chn*5; if (pi & 32) { slot[0] = packed[index++]; slot[1] = packed[index++]; } if (pi & 64) { slot[2] = packed[index++]; } if (pi & 128) { slot[3] = packed[index++]; slot[4] = packed[index++]; } } maxChannels++; if (maxChannels > header->channum) maxChannels = header->channum; delete[] packed; } if (maxChannels > songMaxChannels) songMaxChannels = maxChannels; convertS3MPattern(&phead[i], pattern, maxChannels, i); } if (header->channum > songMaxChannels) header->channum = songMaxChannels; delete[] pattern; delete[] insParaPtrs; delete[] patParaPtrs; s = 0; for (i = 0; i < header->insnum; i++) { mp_uint32 smpOffs = samplePtrs[i]; if (smpOffs) { f.seekWithBaseOffset(smpOffs); if (!smp[s].samplen) continue; bool adpcm = (smp[s].res == 0xAD); if (module->loadModuleSample(f, s, adpcm ? XModule::ST_PACKING_ADPCM : XModule::ST_UNSIGNED, adpcm ? (XModule::ST_16BIT | XModule::ST_PACKING_ADPCM) : (XModule::ST_16BIT | XModule::ST_UNSIGNED)) != 0) { delete[] samplePtrs; return -7; } if (adpcm) // no longer needed smp[s].res = 0; s++; } } delete[] samplePtrs; header->smpnum = s; strcpy(header->tracker,"Screamtracker 3"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/Mixable.h0000644000175000017500000000350111163403715020757 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Mixable.h * MilkyPlay * * Created by Peter Barth on 14.12.07. * */ #ifndef __MIXABLE_H__ #define __MIXABLE_H__ #include "MilkyPlayTypes.h" struct Mixable { virtual ~Mixable() { } virtual void mix(mp_sint32* buffer, mp_uint32 numSamples) = 0; }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderDIGI.cpp0000644000175000017500000002136611163403715021605 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderDIGI.cpp * MilkyPlay Module Loader: Digibooster 1.0 - 1.7 */ #include "Loaders.h" const char* LoaderDIGI::identifyModule(const mp_ubyte* buffer) { if (strcmp((const char*)buffer, "DIGI Booster module") == 0) { return "DIGI"; } return NULL; } static void convertEvent(mp_ubyte* dst, mp_ubyte* src) { mp_ubyte b1 = src[0]; mp_ubyte b2 = src[1]; mp_ubyte b3 = src[2]; mp_ubyte b4 = src[3]; mp_sint32 note,ins,eff,notenum = 0; note = ((b1&0xf)<<8)+b2; ins = (b1&0xf0)+(b3>>4); eff = b3&0xf; if (eff==0xE) { eff=(b4>>4)+0x30; b4&=0xf; if (eff == 0x33) { eff = 0x4F; b4 = 1; } if (eff == 0x34) { eff = 0x51; // key off at tick 0 b4 = 0; } if (eff == 0x35) { if (b4 == 0) { eff = 0x50; // AMS set channel mastervolume to zero b4 = 0; } else if (b4 == 1) { eff = 0x50; // AMS set channel mastervolume to 255 b4 = 255; } } if (eff == 0x38) { #ifdef VERBOSE printf("Unsupported Digibooster effect: extended offset\n"); #endif eff = b4 = 0; } if (eff == 0x39) { #ifdef VERBOSE printf("Unsupported Digibooster effect: retrace\n"); #endif eff = b4 = 0; } } if ((!eff)&&b4) eff=0x20; if (eff==0x8) eff = b4 = 0; // old style modules don't support last effect for: // - portamento up/down // - volume slide if (eff==0x1&&(!b4)) eff = 0; if (eff==0x2&&(!b4)) eff = 0; if (eff==0xA&&(!b4)) eff = 0; if (eff==0x5&&(!b4)) eff = 0x3; if (eff==0x6&&(!b4)) eff = 0x4; if (eff==0xC) { b4 = XModule::vol64to255(b4); } if (note) notenum = XModule::amigaPeriodToNote(note); dst[0] = notenum; dst[1] = ins; dst[2] = eff; dst[3] = b4; } mp_sint32 LoaderDIGI::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_sint32 i,j; mp_ubyte buffer[31*4]; // read header f.read(header->sig, 1, 16); // skip 4 bytes (ule\0) f.readDword(); // skip version string f.readDword(); // check version mp_ubyte ver = f.readByte(); if (ver < 0x10 || ver > 0x17) return -8; // read numchannels header->channum = f.readByte(); // packenable mp_ubyte pack = f.readByte(); f.read(buffer, 1, 19); // read numpatterns header->patnum = (mp_sword)f.readByte() + 1; // read songlength header->ordnum = (mp_sword)f.readByte() + 1; f.read(header->ord, 1, 128); header->insnum = 31; f.read(buffer, 4, 31); mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { mp_sint32 slen = BigEndian::GET_DWORD(buffer+i*4); if (slen) { instr[i].samp = 1; for (j = 0; j < 120; j++) instr[i].snum[j] = s; smp[s].samplen = slen; s++; } } header->smpnum = s; // loop starts f.read(buffer, 4, 31); for (i = 0; i < header->insnum; i++) { if (instr[i].samp) { s = instr[i].snum[0]; smp[s].loopstart = BigEndian::GET_DWORD(buffer+i*4); } } // loop lengths f.read(buffer, 4, 31); for (i = 0; i < header->insnum; i++) { if (instr[i].samp) { s = instr[i].snum[0]; smp[s].looplen = BigEndian::GET_DWORD(buffer+i*4); if (smp[s].looplen) smp[s].type = 1; } } // volumes & finetunes f.read(buffer, 1, 31); f.read(buffer+31, 1, 31); for (i = 0; i < header->insnum; i++) { if (instr[i].samp) { s = instr[i].snum[0]; smp[s].vol = XModule::vol64to255(buffer[i]); smp[s].pan = 0x80; smp[s].flags = 1; smp[s].finetune = ((mp_sbyte)buffer[i+31])*16; } } f.read(header->name, 1, 32); for (i = 0; i < header->insnum; i++) { f.read(instr[i].name, 1, 30); if (instr[i].samp) { s = instr[i].snum[0]; memcpy(smp[s].name, instr[i].name, 30); } } // read patterns for (i = 0; i < header->patnum; i++) { phead[i].rows = 64; phead[i].effnum = 1; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*4]; // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum*4); mp_sint32 pSize = 64*header->channum*4 + 64; if (pack) { f.read(buffer, 1, 2); pSize = BigEndian::GET_WORD(buffer); if (pSize && pSize < 64) return -8; // read packing mask f.read(buffer, 1, 64); } else { memset(buffer, 0xFF, 64); } if (!pSize) continue; mp_ubyte* pattern = new mp_ubyte[pSize-64]; if (pattern == NULL) return -7; f.read(pattern, 1, pSize-64); mp_ubyte* patPtr = pattern; mp_sint32 r,c,cnt=0; if (pack) { for (r=0;r<64;r++) { for (c=0;cchannum;c++) { if (buffer[r] & (1 << (7-c))) { convertEvent(phead[i].patternData + cnt, patPtr); patPtr+=4; } cnt+=4; } } } else { for (c=0;cchannum;c++) { for (r=0;r<64;r++) { cnt = r*header->channum*4+c*4; convertEvent(phead[i].patternData + cnt, patPtr); patPtr+=4; } } } delete[] pattern; } // No for something really stupid: Pattern loop correction for (mp_sint32 p = 0; p < header->patnum; p++) { struct Position { mp_sint32 row, channel; }; mp_ubyte* pattern = phead[p].patternData; Position loopStart = {-1, -1}, loopEnd = {-1, -1}; for (i = 0; i < 64; i++) { for (j = 0; j < header->channum; j++) { mp_ubyte* slot = pattern + i*header->channum*4 + j*4; // Loop start if (slot[2] == 0x36 && !slot[3]) { loopStart.row = i; loopStart.channel = j; } else if (slot[2] == 0x36 && slot[3]) { loopEnd.row = i; loopEnd.channel = j; } } if (loopEnd.row != -1 && loopEnd.channel != -1 && loopStart.row != -1 && loopStart.channel != -1 && loopStart.channel != loopEnd.channel) { // sanity check if (loopStart.row == loopEnd.row) { mp_ubyte* slot = pattern + loopStart.row*header->channum*4 + loopStart.channel*4; slot[2] = slot[3] = 0; slot = pattern + loopEnd.row*header->channum*4 + loopEnd.channel*4; slot[2] = slot[3] = 0; } else { for (j = 0; j < header->channum; j++) { mp_ubyte* slotStart = pattern + loopStart.row*header->channum*4 + j*4; mp_ubyte* slotEnd = pattern + loopEnd.row*header->channum*4 + j*4; if (!slotStart[2] && !slotEnd[2] && !slotStart[3] && !slotEnd[3]) { mp_ubyte* slot = pattern + loopStart.row*header->channum*4 + loopStart.channel*4; slotStart[2] = slot[2]; slotStart[3] = slot[3]; slot[2] = slot[3] = 0; slot = pattern + loopEnd.row*header->channum*4 + loopEnd.channel*4; slotEnd[2] = slot[2]; slotEnd[3] = slot[3]; slot[2] = slot[3] = 0; break; } } } loopStart.row = loopStart.channel = loopEnd.row = loopEnd.channel = -1; } } } if (module->loadModuleSamples(f) != 0) return -7; header->speed = 125; header->tempo = 6; header->mainvol = 255; strcpy(header->tracker,"Digibooster"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriver_WAVWriter.cpp0000644000175000017500000001053611163403715024066 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriver_WAVWriter.cpp * MilkyPlay * * Created by Peter Barth on 29.07.05. * */ #include "AudioDriver_WAVWriter.h" struct TWAVHeader { mp_ubyte RIFF[4]; // "RIFF" mp_dword length; // filesize - 8 mp_ubyte WAVE[4]; // "WAVE" mp_ubyte FMT[4]; // "fmt " mp_dword fmtDataLength; // = 16 mp_uword encodingTag; mp_uword numChannels; // Channels: 1 = mono, 2 = stereo mp_dword sampleRate; // Samples per second: e.g., 44100 mp_dword bytesPerSecond; // sample rate * block align mp_uword blockAlign; // channels * numBits / 8 mp_uword numBits; // 8 or 16 mp_ubyte DATA[4]; // "data" mp_dword dataLength; // sample data size }; static void writeWAVHeader(XMFile* f, const TWAVHeader& hdr) { f->write(hdr.RIFF, 1, 4); f->writeDword(hdr.length); f->write(hdr.WAVE, 1, 4); f->write(hdr.FMT, 1, 4); f->writeDword(hdr.fmtDataLength); f->writeWord(hdr.encodingTag); f->writeWord(hdr.numChannels); f->writeDword(hdr.sampleRate); f->writeDword(hdr.bytesPerSecond); f->writeWord(hdr.blockAlign); f->writeWord(hdr.numBits); f->write(hdr.DATA, 1, 4); f->writeDword(hdr.dataLength); } WAVWriter::WAVWriter(const SYSCHAR* fileName) : AudioDriver_NULL(), f(NULL), mixFreq(44100) { TWAVHeader hdr; f = new XMFile(fileName, true); if (!f->isOpenForWriting()) { delete f; f = NULL; } else { // build wav header memcpy(hdr.RIFF, "RIFF", 4); hdr.length = 44 - 8; memcpy(hdr.WAVE, "WAVE", 4); memcpy(hdr.FMT, "fmt ", 4); hdr.fmtDataLength = 16; hdr.encodingTag = 1; hdr.numChannels = 2; hdr.sampleRate = mixFreq; hdr.numBits = 16; hdr.blockAlign = (hdr.numChannels*hdr.numBits) / 8; hdr.bytesPerSecond = hdr.sampleRate*hdr.blockAlign; memcpy(hdr.DATA, "data", 4); hdr.dataLength = 0; writeWAVHeader(f, hdr); } } WAVWriter::~WAVWriter() { if (f) delete f; } mp_sint32 WAVWriter::initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { mp_sint32 res = AudioDriver_NULL::initDevice(bufferSizeInWords, mixFrequency, mixer); if (res < 0) return res; mixFreq = mixFrequency; return 0; } mp_sint32 WAVWriter::closeDevice() { if (!f) return -1; TWAVHeader hdr; // build wav header memcpy(hdr.RIFF, "RIFF", 4); hdr.length = 44 + numSamplesWritten*4 - 8; memcpy(hdr.WAVE, "WAVE", 4); memcpy(hdr.FMT, "fmt ", 4); hdr.fmtDataLength = 16; hdr.encodingTag = 1; hdr.numChannels = 2; hdr.sampleRate = mixFreq; hdr.numBits = 16; hdr.blockAlign = (hdr.numChannels*hdr.numBits) / 8; hdr.bytesPerSecond = hdr.sampleRate*hdr.blockAlign; memcpy(hdr.DATA, "data", 4); hdr.dataLength = (numSamplesWritten*2*hdr.numBits)/8; f->seek(0); writeWAVHeader(f, hdr); return 0; } void WAVWriter::advance() { AudioDriver_NULL::advance(); if (!f) return; f->writeWords((mp_uword*)compensateBuffer, bufferSize); } milkytracker-0.90.85+dfsg/src/milkyplay/Makefile.in0000644000175000017500000006442211317506534021307 0ustar admin2admin2# Makefile.in generated by automake 1.11 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@ 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 = : subdir = src/milkyplay DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in 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 = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libmilkyplay_a_AR = $(AR) $(ARFLAGS) libmilkyplay_a_LIBADD = am_libmilkyplay_a_OBJECTS = AudioDriverBase.$(OBJEXT) \ AudioDriverManager.$(OBJEXT) AudioDriver_NULL.$(OBJEXT) \ AudioDriver_WAVWriter.$(OBJEXT) ChannelMixer.$(OBJEXT) \ ExporterXM.$(OBJEXT) LittleEndian.$(OBJEXT) \ Loader669.$(OBJEXT) LoaderAMF.$(OBJEXT) LoaderAMS.$(OBJEXT) \ LoaderCBA.$(OBJEXT) LoaderDBM.$(OBJEXT) LoaderDIGI.$(OBJEXT) \ LoaderDSM.$(OBJEXT) LoaderDTM.$(OBJEXT) LoaderFAR.$(OBJEXT) \ LoaderGDM.$(OBJEXT) LoaderIMF.$(OBJEXT) LoaderIT.$(OBJEXT) \ LoaderMDL.$(OBJEXT) LoaderMOD.$(OBJEXT) LoaderMTM.$(OBJEXT) \ LoaderMXM.$(OBJEXT) LoaderOKT.$(OBJEXT) LoaderPLM.$(OBJEXT) \ LoaderPSM.$(OBJEXT) LoaderPTM.$(OBJEXT) LoaderS3M.$(OBJEXT) \ LoaderSTM.$(OBJEXT) LoaderULT.$(OBJEXT) LoaderUNI.$(OBJEXT) \ LoaderXM.$(OBJEXT) MasterMixer.$(OBJEXT) PlayerBase.$(OBJEXT) \ PlayerGeneric.$(OBJEXT) PlayerSTD.$(OBJEXT) \ ResamplerFactory.$(OBJEXT) SampleLoaderAIFF.$(OBJEXT) \ SampleLoaderALL.$(OBJEXT) SampleLoaderAbstract.$(OBJEXT) \ SampleLoaderGeneric.$(OBJEXT) SampleLoaderIFF.$(OBJEXT) \ SampleLoaderWAV.$(OBJEXT) XIInstrument.$(OBJEXT) \ XMFile.$(OBJEXT) XModule.$(OBJEXT) AudioDriver_ALSA.$(OBJEXT) \ AudioDriver_JACK.$(OBJEXT) AudioDriver_SDL.$(OBJEXT) libmilkyplay_a_OBJECTS = $(am_libmilkyplay_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(libmilkyplay_a_SOURCES) DIST_SOURCES = $(libmilkyplay_a_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALSA_CFLAGS = @ALSA_CFLAGS@ ALSA_LIBS = @ALSA_LIBS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RTMIDI = @RTMIDI@ RTMIDI_DIR = @RTMIDI_DIR@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ZZIP_CFLAGS = @ZZIP_CFLAGS@ ZZIP_LIBS = @ZZIP_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ 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@ noinst_LIBRARIES = libmilkyplay.a libmilkyplay_a_SOURCES = AudioDriverBase.cpp AudioDriverManager.cpp \ AudioDriver_NULL.cpp AudioDriver_WAVWriter.cpp ChannelMixer.cpp ExporterXM.cpp \ LittleEndian.cpp Loader669.cpp LoaderAMF.cpp LoaderAMS.cpp LoaderCBA.cpp \ LoaderDBM.cpp LoaderDIGI.cpp LoaderDSM.cpp LoaderDTM.cpp LoaderFAR.cpp \ LoaderGDM.cpp LoaderIMF.cpp LoaderIT.cpp LoaderMDL.cpp LoaderMOD.cpp \ LoaderMTM.cpp LoaderMXM.cpp LoaderOKT.cpp LoaderPLM.cpp LoaderPSM.cpp \ LoaderPTM.cpp LoaderS3M.cpp LoaderSTM.cpp LoaderULT.cpp LoaderUNI.cpp \ LoaderXM.cpp MasterMixer.cpp PlayerBase.cpp PlayerGeneric.cpp PlayerSTD.cpp \ ResamplerFactory.cpp SampleLoaderAIFF.cpp SampleLoaderALL.cpp \ SampleLoaderAbstract.cpp SampleLoaderGeneric.cpp SampleLoaderIFF.cpp \ SampleLoaderWAV.cpp XIInstrument.cpp XMFile.cpp XModule.cpp \ drivers/alsa/AudioDriver_ALSA.cpp drivers/jack/AudioDriver_JACK.cpp \ drivers/sdl/AudioDriver_SDL.cpp noinst_HEADERS = AudioDriverBase.h AudioDriverManager.h \ AudioDriver_COMPENSATE.h AudioDriver_NULL.h AudioDriver_WAVWriter.h \ ChannelMixer.h LittleEndian.h Loaders.h MasterMixer.h MilkyPlay.h \ MilkyPlayCommon.h MilkyPlayTypes.h Mixable.h PlayerBase.h PlayerGeneric.h \ PlayerSTD.h ResamplerAmiga.h ResamplerCubic.h ResamplerFactory.h \ ResamplerFast.h ResamplerMacros.h ResamplerSinc.h SampleLoaderAIFF.h \ SampleLoaderALL.h SampleLoaderAbstract.h SampleLoaderGeneric.h \ SampleLoaderIFF.h SampleLoaderWAV.h XIInstrument.h XMFile.h XModule.h \ computed-blep.h drivers/alsa/AudioDriver_ALSA.h \ drivers/jack/AudioDriver_JACK.h drivers/sdl/AudioDriver_SDL.h INCLUDES = -I$(top_srcdir)/src/milkyplay \ -I$(top_srcdir)/src/milkyplay/drivers/generic \ -I$(top_srcdir)/src/milkyplay/drivers/jack \ -I$(top_srcdir)/src/milkyplay/drivers/sdl AM_CPPFLAGS = -DMILKYTRACKER -D__THREADTIMER__ -DDRIVER_UNIX ${SDL_CFLAGS} all: all-am .SUFFIXES: .SUFFIXES: .cpp .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) --gnu src/milkyplay/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/milkyplay/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-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmilkyplay.a: $(libmilkyplay_a_OBJECTS) $(libmilkyplay_a_DEPENDENCIES) -rm -f libmilkyplay.a $(libmilkyplay_a_AR) libmilkyplay.a $(libmilkyplay_a_OBJECTS) $(libmilkyplay_a_LIBADD) $(RANLIB) libmilkyplay.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AudioDriverBase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AudioDriverManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AudioDriver_ALSA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AudioDriver_JACK.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AudioDriver_NULL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AudioDriver_SDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AudioDriver_WAVWriter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChannelMixer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ExporterXM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LittleEndian.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Loader669.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderAMF.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderAMS.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderCBA.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderDBM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderDIGI.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderDSM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderDTM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderFAR.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderGDM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderIMF.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderIT.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderMDL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderMOD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderMTM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderMXM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderOKT.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderPLM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderPSM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderPTM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderS3M.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderSTM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderULT.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderUNI.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LoaderXM.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MasterMixer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PlayerBase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PlayerGeneric.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PlayerSTD.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ResamplerFactory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleLoaderAIFF.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleLoaderALL.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleLoaderAbstract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleLoaderGeneric.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleLoaderIFF.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleLoaderWAV.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XIInstrument.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMFile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XModule.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` AudioDriver_ALSA.o: drivers/alsa/AudioDriver_ALSA.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT AudioDriver_ALSA.o -MD -MP -MF $(DEPDIR)/AudioDriver_ALSA.Tpo -c -o AudioDriver_ALSA.o `test -f 'drivers/alsa/AudioDriver_ALSA.cpp' || echo '$(srcdir)/'`drivers/alsa/AudioDriver_ALSA.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/AudioDriver_ALSA.Tpo $(DEPDIR)/AudioDriver_ALSA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drivers/alsa/AudioDriver_ALSA.cpp' object='AudioDriver_ALSA.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o AudioDriver_ALSA.o `test -f 'drivers/alsa/AudioDriver_ALSA.cpp' || echo '$(srcdir)/'`drivers/alsa/AudioDriver_ALSA.cpp AudioDriver_ALSA.obj: drivers/alsa/AudioDriver_ALSA.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT AudioDriver_ALSA.obj -MD -MP -MF $(DEPDIR)/AudioDriver_ALSA.Tpo -c -o AudioDriver_ALSA.obj `if test -f 'drivers/alsa/AudioDriver_ALSA.cpp'; then $(CYGPATH_W) 'drivers/alsa/AudioDriver_ALSA.cpp'; else $(CYGPATH_W) '$(srcdir)/drivers/alsa/AudioDriver_ALSA.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/AudioDriver_ALSA.Tpo $(DEPDIR)/AudioDriver_ALSA.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drivers/alsa/AudioDriver_ALSA.cpp' object='AudioDriver_ALSA.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o AudioDriver_ALSA.obj `if test -f 'drivers/alsa/AudioDriver_ALSA.cpp'; then $(CYGPATH_W) 'drivers/alsa/AudioDriver_ALSA.cpp'; else $(CYGPATH_W) '$(srcdir)/drivers/alsa/AudioDriver_ALSA.cpp'; fi` AudioDriver_JACK.o: drivers/jack/AudioDriver_JACK.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT AudioDriver_JACK.o -MD -MP -MF $(DEPDIR)/AudioDriver_JACK.Tpo -c -o AudioDriver_JACK.o `test -f 'drivers/jack/AudioDriver_JACK.cpp' || echo '$(srcdir)/'`drivers/jack/AudioDriver_JACK.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/AudioDriver_JACK.Tpo $(DEPDIR)/AudioDriver_JACK.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drivers/jack/AudioDriver_JACK.cpp' object='AudioDriver_JACK.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o AudioDriver_JACK.o `test -f 'drivers/jack/AudioDriver_JACK.cpp' || echo '$(srcdir)/'`drivers/jack/AudioDriver_JACK.cpp AudioDriver_JACK.obj: drivers/jack/AudioDriver_JACK.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT AudioDriver_JACK.obj -MD -MP -MF $(DEPDIR)/AudioDriver_JACK.Tpo -c -o AudioDriver_JACK.obj `if test -f 'drivers/jack/AudioDriver_JACK.cpp'; then $(CYGPATH_W) 'drivers/jack/AudioDriver_JACK.cpp'; else $(CYGPATH_W) '$(srcdir)/drivers/jack/AudioDriver_JACK.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/AudioDriver_JACK.Tpo $(DEPDIR)/AudioDriver_JACK.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drivers/jack/AudioDriver_JACK.cpp' object='AudioDriver_JACK.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o AudioDriver_JACK.obj `if test -f 'drivers/jack/AudioDriver_JACK.cpp'; then $(CYGPATH_W) 'drivers/jack/AudioDriver_JACK.cpp'; else $(CYGPATH_W) '$(srcdir)/drivers/jack/AudioDriver_JACK.cpp'; fi` AudioDriver_SDL.o: drivers/sdl/AudioDriver_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT AudioDriver_SDL.o -MD -MP -MF $(DEPDIR)/AudioDriver_SDL.Tpo -c -o AudioDriver_SDL.o `test -f 'drivers/sdl/AudioDriver_SDL.cpp' || echo '$(srcdir)/'`drivers/sdl/AudioDriver_SDL.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/AudioDriver_SDL.Tpo $(DEPDIR)/AudioDriver_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drivers/sdl/AudioDriver_SDL.cpp' object='AudioDriver_SDL.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o AudioDriver_SDL.o `test -f 'drivers/sdl/AudioDriver_SDL.cpp' || echo '$(srcdir)/'`drivers/sdl/AudioDriver_SDL.cpp AudioDriver_SDL.obj: drivers/sdl/AudioDriver_SDL.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT AudioDriver_SDL.obj -MD -MP -MF $(DEPDIR)/AudioDriver_SDL.Tpo -c -o AudioDriver_SDL.obj `if test -f 'drivers/sdl/AudioDriver_SDL.cpp'; then $(CYGPATH_W) 'drivers/sdl/AudioDriver_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/drivers/sdl/AudioDriver_SDL.cpp'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/AudioDriver_SDL.Tpo $(DEPDIR)/AudioDriver_SDL.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='drivers/sdl/AudioDriver_SDL.cpp' object='AudioDriver_SDL.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o AudioDriver_SDL.obj `if test -f 'drivers/sdl/AudioDriver_SDL.cpp'; then $(CYGPATH_W) 'drivers/sdl/AudioDriver_SDL.cpp'; else $(CYGPATH_W) '$(srcdir)/drivers/sdl/AudioDriver_SDL.cpp'; fi` 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 $(LIBRARIES) $(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-generic clean-noinstLIBRARIES 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 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-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic 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 pdf pdf-am ps ps-am tags uninstall \ uninstall-am \ EXTRA_DIST = PlayerFAR.cpp PlayerFAR.h PlayerIT.cpp PlayerIT.h \ drivers/generic/AudioDriver_PORTAUDIO.cpp \ drivers/generic/AudioDriver_PORTAUDIO.h \ drivers/generic/AudioDriver_RTAUDIO.cpp drivers/generic/AudioDriver_RTAUDIO.h \ drivers/generic/RtAudio3Impl.cpp drivers/generic/RtAudio4Impl.cpp \ drivers/generic/portaudio/portaudio.h drivers/generic/rtaudio/RtAudio3.cpp \ drivers/generic/rtaudio/RtAudio3.h drivers/generic/rtaudio/RtAudio4.cpp \ drivers/generic/rtaudio/RtAudio4.h drivers/generic/rtaudio/RtError3.h \ drivers/generic/rtaudio/RtError4.h drivers/generic/rtaudio/asio/asio.cpp \ drivers/generic/rtaudio/asio/asio.h \ drivers/generic/rtaudio/asio/asiodrivers.cpp \ drivers/generic/rtaudio/asio/asiodrivers.h \ drivers/generic/rtaudio/asio/asiodrvr.h \ drivers/generic/rtaudio/asio/asiolist.cpp \ drivers/generic/rtaudio/asio/asiolist.h drivers/generic/rtaudio/asio/asiosys.h \ drivers/generic/rtaudio/asio/ginclude.h \ drivers/generic/rtaudio/asio/iasiodrv.h \ drivers/generic/rtaudio/asio/iasiothiscallresolver.cpp \ drivers/generic/rtaudio/asio/iasiothiscallresolver.h \ drivers/generic/rtaudio/oss/soundcard.h drivers/osx/AudioDriver_COREAUDIO.cpp \ drivers/osx/AudioDriver_COREAUDIO.h drivers/psp/AudioDriver_PSP.cpp \ drivers/psp/AudioDriver_PSP.h drivers/windows/AudioDriver_MMSYSTEM.cpp \ drivers/windows/AudioDriver_MMSYSTEM.h # 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: milkytracker-0.90.85+dfsg/src/milkyplay/PlayerIT.h0000644000175000017500000005741111163403715021100 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerIT.h * MilyPlay core * * Created by Peter Barth on Tue Oct 19 2004. * */ #ifndef __PLAYERIT_H__ #define __PLAYERIT_H__ #include "PlayerBase.h" #include "XModule.h" class PlayerIT : public PlayerBase { private: enum EXMMinPeriod { XM_MINPERIOD = 50 }; struct TPrEnv { TEnvelope *envstruc; bool enabled; mp_sint32 a,b,step; mp_uint32 bpmCounter, bpmAdder; private: bool reachedEnd(bool keyon) { bool reachedEnd = ((step >= envstruc->env[b][0]) && (b >= envstruc->num - 1)); if (!reachedEnd) return false; bool ITBreakLoop = (envstruc->type & 16); if (ITBreakLoop && keyon) return false; bool AMSBreakLoop = (envstruc->type & (4+8)) == (4+8); bool XMBreakLoop = ((envstruc->type & (2+4)) == (2+4)) && (envstruc->sustain == envstruc->loope); bool brokeLoop = !keyon && (AMSBreakLoop || XMBreakLoop); //bool res = ((envstruc->type & 4) && brokeLoop) || (!(envstruc->type & 4)); return ((envstruc->type & 4) && brokeLoop) || (!(envstruc->type & 4)); } public: bool finished(bool keyon) { if (envstruc == NULL || !enabled) return false; return reachedEnd(keyon); } bool cutted(bool keyon) { return (envstruc && reachedEnd(keyon) && envstruc->env[b][1] == 0); } void setEnabled(bool enabled) { this->enabled = enabled; } bool isEnabled() { return enabled && envstruc != NULL; } }; struct TLastOperands { mp_ubyte portaup; mp_ubyte portadown; mp_ubyte portanote; mp_ubyte fineportaup; mp_ubyte fineportadown; mp_ubyte xfineportaup; mp_ubyte xfineportadown; mp_ubyte volslide; mp_ubyte finevolslide; mp_ubyte gvolslide; mp_ubyte chnvolslide; mp_ubyte panslide; mp_ubyte arpeg; mp_ubyte retrig; mp_ubyte tremor; mp_ubyte smpoffset; mp_ubyte temposlide; }; #define DEFINE_STATINTERFACE \ mp_sint32 getNote() { return chnstat().note; } \ mp_sint32 getIns() { return chnstat().ins; } \ mp_uword getInsflags() { return chnstat().insflags; } \ mp_sint32 getSmp() { return chnstat().smp; } \ \ void setNote(mp_sint32 note) { chnstat().note = note; } \ void setIns(mp_sint32 ins) { chnstat().ins = ins; } \ void setInsflags(mp_uword insflags) { chnstat().insflags = insflags; } \ void setSmp(mp_sint32 smp) { chnstat().smp = smp; } \ \ mp_sint32 getFlags() { return chnstat().flags; } \ void setFlags(mp_uint32 flags) { chnstat().flags = flags; } \ void setFlag(mp_uint32 flag) { chnstat().flags |= flag; } \ void resetFlag(mp_uint32 flag) { chnstat().flags &= ~flag; } \ bool isFlagSet(mp_uint32 flag) { return (chnstat().flags & flag); } \ \ void setVol(mp_sint32 vol) { chnstat().vol = vol; } \ void incVol(mp_sint32 offs) { chnstat().vol+=offs; if (chnstat().vol>255) chnstat().vol=255; } \ void decVol(mp_sint32 offs) { chnstat().vol-=offs; if (chnstat().vol<0) chnstat().vol=0; } \ void adjustTremoloTremorVol() { chnstat().tremorVol = chnstat().tremoloVol = chnstat().vol; chnstat().hasTremolo = false; chnstat().finalTremoloVol = 0; } \ void adjustTremoloVol() { chnstat().tremoloVol = chnstat().vol; chnstat().hasTremolo = false; chnstat().finalTremoloVol = 0; } \ void setFinalTremVol(mp_sint32 vol) { chnstat().finalTremoloVol = vol; chnstat().hasTremolo = true; } \ \ void setPan(mp_sint32 pan) { chnstat().pan = pan; } \ void incPan(mp_sint32 offs) { chnstat().pan+=offs; if (chnstat().pan>255) chnstat().pan=255; } \ void decPan(mp_sint32 offs) { chnstat().pan-=offs; if (chnstat().pan<0) chnstat().pan=0; } \ \ void setPer(mp_sint32 per) { chnstat().per = per; } \ void decPer(mp_sint32 offs) { chnstat().per-=offs; } \ void incPer(mp_sint32 offs) { chnstat().per+=offs; } \ void adjustVibratoPer() { chnstat().hasVibrato = false; chnstat().finalVibratoPer = 0; } \ void setFinalVibratoPer(mp_sint32 per) { chnstat().finalVibratoPer = per; chnstat().hasVibrato = true; } \ \ void clampPerMax(mp_sint32 max) { if (chnstat().per > max) chnstat().per = max; } \ void clampPerMin(mp_sint32 min) { if (chnstat().per < min) chnstat().per = min; } \ \ void setMasterVol(mp_sint32 vol) { chnstat().masterVol = vol; } \ void incMasterVol(mp_sint32 offs) { chnstat().masterVol+=offs; if (chnstat().masterVol>255) chnstat().masterVol=255; } \ void decMasterVol(mp_sint32 offs) { chnstat().masterVol-=offs; if (chnstat().masterVol<0) chnstat().masterVol=0; } \ void setInsMasterVol(mp_sint32 vol) { chnstat().insMasterVol = vol; } \ void setSmpMasterVol(mp_sint32 vol) { chnstat().smpMasterVol = vol; } \ void setFreqadjust(mp_sword freqadjust) { chnstat().freqadjust = freqadjust; } \ void setRelnote(mp_sint32 relnote) { chnstat().relnote = relnote; } \ void setFinetune(mp_sint32 finetune) { chnstat().finetune = finetune; } \ \ mp_sint32 getVol() { return chnstat().vol; } \ mp_sint32 getTremoloVol() { return chnstat().tremoloVol; } \ mp_sint32 getTremorVol() { return chnstat().tremorVol; } \ mp_sint32 getVolume() { return chnstat().getVolumeInternal(); } \ \ mp_sint32 getPan() { return chnstat().pan; } \ mp_sint32 getPer() { return chnstat().per; } \ mp_sint32 getPeriod() { return chnstat().getPeriodInternal(); } \ \ mp_sint32 getMasterVol() { return chnstat().masterVol; } \ mp_sint32 getInsMasterVol() { return chnstat().insMasterVol; } \ mp_sint32 getSmpMasterVol() { return chnstat().smpMasterVol; } \ mp_sword getFreqadjust() { return chnstat().freqadjust; } \ mp_sint32 getRelnote() { return chnstat().relnote; } \ mp_sint32 getFinetune() { return chnstat().finetune; } \ \ bool getKeyon() { return chnstat().keyon; } \ \ TPrEnv& getVenv() { return chnstat().venv; } \ TPrEnv& getPenv() { return chnstat().penv; } \ TPrEnv& getFenv() { return chnstat().fenv; } \ TPrEnv& getVibenv() { return chnstat().vibenv; } \ TPrEnv& getPitchenv() { return chnstat().pitchenv; } \ \ mp_ubyte getAvibused() { return chnstat().avibused; } \ mp_ubyte getAvibspd() { return chnstat().avibspd; } \ mp_ubyte getAvibdepth() { return chnstat().avibdepth; } \ mp_ubyte getAvibcnt() { return chnstat().avibcnt; } \ mp_ubyte getAvibsweep() { return chnstat().avibsweep; } \ mp_sint32 getAvibswcnt() { return chnstat().avibswcnt; } \ \ void setKeyon(bool keyon) { chnstat().keyon = keyon; } \ void setAvibused(mp_ubyte avibused) { chnstat().avibused = avibused; } \ void setAvibspd(mp_ubyte avibspd) { chnstat().avibspd = avibspd; } \ void setAvibdepth(mp_ubyte avibdepth) { chnstat().avibdepth = avibdepth; } \ void setAvibcnt(mp_ubyte avibcnt) { chnstat().avibcnt = avibcnt; } \ void setAvibsweep(mp_ubyte avibsweep) { chnstat().avibsweep = avibsweep; } \ void setAvibswcnt(mp_sint32 avibswcnt) { chnstat().avibswcnt = avibswcnt; } \ \ void avibAdvance() \ { \ chnstat().avibcnt+=chnstat().avibspd; \ /* IT style auto vibrato */ \ if (chnstat().avibused & 128) \ { \ if (chnstat().avibswcnt < ((mp_sint32)chnstat().avibdepth << 8) && chnstat().avibsweep) \ /* Our vibrato depth is two times finer than the one from IT, increment by sweep*2 */ \ chnstat().avibswcnt+=(mp_sint32)chnstat().avibsweep<<1; \ } \ /* XM style auto vibrato */ \ else \ { \ if (chnstat().avibswcnt < chnstat().avibsweep) \ chnstat().avibswcnt = (chnstat().avibswcnt+1) & 0xFF; \ } \ } \ \ void setFadevolstart(mp_sint32 fadevolstart) { chnstat().fadevolstart = fadevolstart; } \ mp_sint32 getFadevolstart() { return chnstat().fadevolstart; } \ \ void setFadevolstep(mp_sint32 fadevolstep) { chnstat().fadevolstep = fadevolstep; } \ mp_sint32 getFadevolstep() { return chnstat().fadevolstep; } \ \ void decFadevolstart() { chnstat().fadevolstart-=chnstat().fadevolstep; if (chnstat().fadevolstart<0) chnstat().fadevolstart=0; } \ \ void setFadeout(bool fadeout) { chnstat().fadeout = fadeout; } \ bool getFadeout() { return chnstat().fadeout; } \ \ void setCutoff(mp_ubyte cutoff) { chnstat().cutoff = cutoff; } \ mp_ubyte getCutoff() { return chnstat().cutoff; } \ \ void setResonance(mp_ubyte resonance) { chnstat().resonance = resonance; } \ mp_ubyte getResonance() { return chnstat().resonance; } public: struct TChnState { TChnState& chnstat() { return *this; } mp_uint32 flags; mp_sint32 note; mp_sint32 ins; mp_uword insflags; mp_sint32 smp; mp_sint32 vol; mp_sint32 tremoloVol; mp_sint32 finalTremoloVol; mp_sint32 tremorVol; bool hasTremolo; mp_sint32 pan; mp_sint32 per; mp_sint32 finalVibratoPer; bool hasVibrato; mp_sint32 insMasterVol; mp_sint32 smpMasterVol; mp_sint32 masterVol; mp_sint32 relnote; mp_sint32 finetune; mp_sword freqadjust; bool keyon; bool fadeout; TPrEnv venv; TPrEnv penv; TPrEnv fenv; TPrEnv vibenv; TPrEnv pitchenv; mp_ubyte avibused; mp_ubyte avibspd; mp_ubyte avibdepth; mp_ubyte avibcnt; mp_ubyte avibsweep; mp_sint32 avibswcnt; mp_sint32 fadevolstart; mp_sint32 fadevolstep; mp_sint32 getVolumeInternal() { return hasTremolo ? finalTremoloVol : vol; } mp_sint32 getPeriodInternal() { return hasVibrato ? finalVibratoPer : per; } mp_ubyte cutoff; mp_ubyte resonance; DEFINE_STATINTERFACE }; private: struct TModuleChannel; struct TVirtualChannel { private: bool active; mp_sint32 channelIndex; TChnState state; TModuleChannel* host; TModuleChannel* oldHost; public: // if we're in background we work on our own state // if not, we're just going to work on the host state TChnState& chnstat(); TChnState& getRealState() { return state; } void updateState(const TChnState& src) { state = src; state.flags = 0; } void setActive(bool active) { this->active = active; } bool getActive() { return active; } void setHost(TModuleChannel* host) { this->host = host; } TModuleChannel* getHost() { return host; } bool getBackground() { return host == NULL; } void setOldHost(TModuleChannel* host) { this->oldHost = host; } TModuleChannel* getOldHost() { return oldHost; } void setChannelIndex(mp_sint32 channelIndex) { this->channelIndex = channelIndex; } mp_sint32 getChannelIndex() { return channelIndex; } DEFINE_STATINTERFACE mp_sint32 getResultingVolume() { mp_sint32 vol = (getVolume()*getFadevolstart())>>16; vol = (vol*getMasterVol()*getInsMasterVol())>>16; vol = (vol*getSmpMasterVol())>>8; return vol; } void clear() { mp_sint32 cIndex = channelIndex; memset(this, 0, sizeof(TVirtualChannel)); channelIndex = cIndex; } friend struct TModuleChannel; }; struct TModuleChannel { private: TChnState state; TVirtualChannel* vchn; public: // if we're having a virtual channel, we need to work on the state of the virtual channel // if not, we're just going to work on our own state TChnState& chnstat() { return vchn ? vchn->chnstat() : state; } TChnState& getRealState() { return state; } bool hasVchn() { return vchn != NULL; } TVirtualChannel* getVchn() { return vchn; } void linkVchn(TVirtualChannel* vchn) { vchn->clear(); vchn->setActive(true); this->vchn = vchn; vchn->setHost(this); } TVirtualChannel* unlinkVchn() { vchn->setHost(NULL); vchn->setOldHost(this); vchn->updateState(getRealState()); TVirtualChannel* result = vchn; vchn = NULL; return result; } mp_sint32 getPlaybackChannelIndex() { return ((vchn == NULL) ? -1 : vchn->getChannelIndex()); } DEFINE_STATINTERFACE void slideToPer(mp_sint32 op) { if (destper>chnstat().per) { chnstat().per+=op; if (chnstat().per>destper) chnstat().per=destper; } else if (destper>3]>>(row&7))&1; } void visitRow(mp_sint32 row) { rowHits[row>>3] |= (1<<(row&7)); } TVirtualChannel* allocateVirtualChannel(); void releaseVirtualChannel(TVirtualChannel* vchn) { vchn->setActive(false); if (vchn->getChannelIndex() == curMaxVirChannels-1) curMaxVirChannels--; } struct TNNATriggerInfo { mp_sint32 note; mp_sint32 ins; mp_sint32 smp; }; void handleNoteOFF(TChnState& state); void handlePastNoteAction(TModuleChannel* chnInf, mp_ubyte pastNoteActionType); bool handleDCT(TModuleChannel* chnInf, const TNNATriggerInfo& triggerInfo, mp_ubyte DCT, mp_ubyte DCA); bool handleNNAs(TModuleChannel* chnInf, const TNNATriggerInfo& triggerInfo); void adjustVirtualChannels(); static void prenvelope(TPrEnv* env, bool keyon, bool timingIT); // process envelopes static mp_sint32 getenvval(TPrEnv* env, mp_sint32 n); // get envelope value static mp_sint32 interpolate(mp_sint32 eax,mp_sint32 ebx,mp_sint32 ecx,mp_sint32 edi,mp_sint32 esi); // This takes the period *with* 8 bit fractional part static mp_sint32 getlinfreq(mp_sint32 per); // This takes the period *with* 8 bit fractional part static mp_sint32 getlogfreq(mp_sint32 per); // this returns a period *without* the 8 bit fractional part mp_sint32 getlinperiod(mp_sint32 note, mp_sint32 relnote, mp_sint32 finetune); // this returns a period *without* the 8 bit fractional part mp_sint32 getlogperiod(mp_sint32 note, mp_sint32 relnote, mp_sint32 finetune); mp_uint32 getbpmrate(mp_uint32 bpm) { // digibooster "real BPM" setting mp_uint32 realCiaTempo = (bpm * (baseBpm << 8) / 125) >> 8; if (!realCiaTempo) realCiaTempo++; mp_int64 t = ((mp_int64)realCiaTempo)<<(32+2); const mp_uint32 timerBase = (mp_uint32)(5.0f*500.0f*(MP_BEATLENGTH*MP_TIMERFREQ / (float)MP_BASEFREQ)); return (mp_uint32)(t/timerBase); } mp_sint32 getperiod(mp_sint32 note, mp_sint32 relnote, mp_sint32 finetune) { /*mp_sint32 logper = getlogperiod(note,relnote,finetune); mp_sint32 linper = getlinperiod(note,relnote,finetune); mp_sint32 logfreq = getlogfreq(logper<<8); mp_sint32 linfreq = getlinfreq(linper<<8); return (module->header.freqtab&1) ? linper : logper;*/ if (playModeFT2) { // FT2 doesn't support lower 3 bits if (finetune > 0) finetune &= ~3; else if (finetune < 0) { finetune = -((-finetune + 7) & ~3); if (finetune < -128) finetune = -128; } } return (module->header.freqtab&1) ? getlinperiod(note,relnote,finetune) : getlogperiod(note,relnote,finetune); } mp_sint32 getFinalVolume(TChnState& state, mp_sint32 nv, mp_sint32 mainVolume) { mp_sint32 vol = (nv*getenvval(&state.venv,256))>>7; vol = (vol*state.fadevolstart)>>16; vol = (vol*state.masterVol*state.insMasterVol)>>16; vol = (vol*state.smpMasterVol*mainVolume)>>16; return vol; } mp_sint32 getFinalCutoff(TChnState& state, mp_sint32 nc) { if (state.pitchenv.envstruc != NULL && state.pitchenv.envstruc->type & 128) return (nc != MP_INVALID_VALUE) ? nc*getenvval(&state.pitchenv, 256) : 127*getenvval(&state.pitchenv, 256); else return (nc != MP_INVALID_VALUE) ? (nc << 8) : nc; } mp_sint32 getFinalPanning(TChnState& state, mp_sint32 np) { mp_sint32 envpan = getenvval(&state.penv,128); //if (envpan!=256) cprintf("%i\r\n",envpan); mp_sint32 finalpan = np+(envpan-128)*(128-abs(np-128))/128; if (finalpan<0) finalpan=0; if (finalpan>255) finalpan=255; return finalpan; } mp_sint32 getFinalFreq(TChnState& state, mp_sint32 per) { if (per<1) return 0; // valid envelope and pitch envelope is not configured as filter envelope if (state.pitchenv.envstruc != NULL && !(state.pitchenv.envstruc->type & 128) && (state.pitchenv.envstruc->type & 1)) { // scale the envelope point that 256 units match one semitone mp_sint32 pitch = (getenvval(&state.pitchenv, 128) - 128) * 32; // add that semitone to the current note mp_sint32 note = state.getNote() + (pitch>>8); // the tone between two semitones mp_sint32 subnote = pitch & 255; // that would be the actual period we have mp_sint32 baseperiod = getperiod(state.getNote(), state.getRelnote(), state.getFinetune()); mp_sint32 period1 = getperiod(note, state.getRelnote(), state.getFinetune()); mp_sint32 period2 = getperiod(note+1, state.getRelnote(), state.getFinetune()); mp_sint32 finalperiod = (period1 * (256-subnote) + period2 * subnote); mp_sint32 diff = finalperiod - (baseperiod << 8); per+=diff; if (per < XM_MINPERIOD) per = XM_MINPERIOD; } mp_sint32 eval = getenvval(&state.fenv,128)-128; mp_uint32 freq = (module->header.freqtab&1) ? getlinfreq(per) : getlogfreq(per); mp_sint32 finalFreq = (freq+(eval*63))+(mp_sint32)state.freqadjust; if (finalFreq < 0) finalFreq = 0; return finalFreq; } mp_sint32 getFinalPeriod(TChnState& state, mp_sint32 p); void playInstrument(TModuleChannel* chnInf, bool bNoRestart = false); void triggerEnvelope(TPrEnv& dstEnv, TEnvelope& srcEnv); void triggerEnvelopes(TModuleChannel* chnInf); void triggerAutovibrato(TModuleChannel* chnInf); void triggerInstrumentFX(TModuleChannel* chnInf, bool triggerEnv = true); void updatePlayModeFlags(); void handlePeriodOverflow(TModuleChannel* chnInf) { // PTK/FT1 playmode if (playModePTPitchLimit && options[PlayModeOptionForcePTPitchLimit]) { chnInf->clampPerMax(856*4); } // FT2 playmode (does nothing right now) else { //if (chnInf->per > 14150) // chnInf->per %= 14150; } } void handlePeriodUnderflow(TModuleChannel* chnInf) { // PTK/FT1 playmode if (playModePTPitchLimit && options[PlayModeOptionForcePTPitchLimit]) { chnInf->clampPerMin(113*4); } // FT2 playmode (clamp on low value, not what FT2 does btw.) else { chnInf->clampPerMin(XM_MINPERIOD); //chninfo[channel].per &= 0x3FFF; } } mp_sint32 calcVibrato(TModuleChannel* chnInf, mp_sint32 effcnt, mp_sint32 depthShift = 5); void doTickVolslidePT(TModuleChannel* chnInf, mp_sint32 effcnt); void doTickVolslideST(TModuleChannel* chnInf, mp_sint32 effcnt); void doTickEffect(TModuleChannel* chnInf, mp_sint32 effcnt); void doVolslidePT(TModuleChannel* chnInf, mp_sint32 effcnt, mp_ubyte eop); void doVolslideST(TModuleChannel* chnInf, mp_sint32 effcnt, mp_ubyte eop); void doEffect(TModuleChannel* chnInf, mp_sint32 effcnt); void doTickeffects(); void progressRow(); void update(); void updateBPMIndependent(); void setNewPosition(mp_sint32 poscnt); void tickhandler(); mp_sint32 allocateStructures(); void freeMemory(); // stop song by setting flag and setting speed to zero void halt(); protected: virtual void clearEffectMemory(); public: PlayerIT(mp_uint32 frequency); virtual ~PlayerIT(); virtual PlayerTypes getType() const { return PlayerType_IT; } void setNumMaxVirChannels(mp_sint32 max) { numMaxVirChannels = max; } mp_sint32 getNumMaxVirChannels() const { return numMaxVirChannels; } // virtual from mixer class, perform playing here virtual void timerHandler(mp_sint32 currentBeatPacket); // override base class method virtual mp_sint32 startPlaying(XModule* module, bool repeat = false, mp_uint32 startPosition = 0, mp_uint32 startRow = 0, mp_sint32 numChannels = -1, const mp_ubyte* customPanningTable = NULL, bool idle = false, mp_sint32 patternIndex = -1, bool playOneRowOnly = false); virtual void restart(mp_uint32 startPosition = 0, mp_uint32 startRow = 0, bool resetMixer = true, const mp_ubyte* customPanningTable = NULL, bool playOneRowOnly = false); virtual void reset(); virtual void resetAllSpeed(); virtual bool grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const; mp_sint32 getCurMaxVirChannels() const { return curMaxVirChannels; } }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderGeneric.cpp0000644000175000017500000001044411163403715023602 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderGeneric.cpp * MilkyPlay * * Created by Peter Barth on 16.09.05. * */ #include "SampleLoaderGeneric.h" #include "SampleLoaderWAV.h" #include "SampleLoaderIFF.h" #include "SampleLoaderAIFF.h" #include "SampleLoaderALL.h" SampleLoaderGeneric::SampleLoaderGeneric(const SYSCHAR* fileName, XModule& module) : SampleLoaderAbstract(fileName, module) { } mp_sint32 SampleLoaderGeneric::getNumChannels() { SampleLoaderAbstract* loader = getSuitableLoader(); if (loader) { mp_sint32 res = loader->getNumChannels(); delete loader; return res; } return 0; } const char* SampleLoaderGeneric::getChannelName(mp_sint32 channelIndex) { SampleLoaderAbstract* loader = getSuitableLoader(); if (loader) { const char* res = loader->getChannelName(channelIndex); delete loader; return res; } return SampleLoaderAbstract::getChannelName(channelIndex); } bool SampleLoaderGeneric::identifySample() { SampleLoaderAbstract* loader = getSuitableLoader(); if (loader) { delete loader; return true; } return false; } mp_sint32 SampleLoaderGeneric::loadSample(mp_sint32 index, mp_sint32 channelIndex) { SampleLoaderAbstract* loader = getSuitableLoader(); loader->setPreferredDefaultName(this->preferredDefaultName); if (loader) { mp_sint32 res = loader->loadSample(index, channelIndex); delete loader; return res; } return -9999; } mp_sint32 SampleLoaderGeneric::saveSample(const SYSCHAR* fileName, mp_sint32 index, OutputFiletypes type) { SampleLoaderAbstract* loader = NULL; switch (type) { case OutputFiletypeWAV: loader = new SampleLoaderWAV(theFileName, theModule); break; case OutputFiletypeIFF: loader = new SampleLoaderIFF(theFileName, theModule); break; case OutputFiletypeAIFF: loader = new SampleLoaderAIFF(theFileName, theModule); break; case OutputFiletypeRAW: loader = new SampleLoaderALL(theFileName, theModule); break; } if (loader) { mp_sint32 res = loader->saveSample(fileName, index); delete loader; return res; } return -9999; } SampleLoaderAbstract* SampleLoaderGeneric::getSuitableLoader() { // Try to find WAV first SampleLoaderAbstract* loader = new SampleLoaderWAV(theFileName, theModule); if (loader && loader->identifySample()) return loader; delete loader; // Try to find IFF then loader = new SampleLoaderIFF(theFileName, theModule); if (loader && loader->identifySample()) return loader; delete loader; // Try to find AIFF then loader = new SampleLoaderAIFF(theFileName, theModule); if (loader && loader->identifySample()) return loader; delete loader; // Try to find something else loader = new SampleLoaderALL(theFileName, theModule); if (loader && loader->identifySample()) return loader; delete loader; return NULL; } milkytracker-0.90.85+dfsg/src/milkyplay/PlayerSTD.h0000644000175000017500000003164711163403715021221 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerSTD.h * MilkyPlay * * Created by Peter Barth on Tue Oct 19 2004. * */ #ifndef __PLAYERSTD_H__ #define __PLAYERSTD_H__ #include "ChannelMixer.h" #include "PlayerBase.h" #include "XModule.h" class PlayerSTD : public PlayerBase { public: struct StatusEventListener { virtual ~StatusEventListener() { } virtual void playerTickStarted(PlayerSTD& player, XModule& module) { } virtual void playerTickEnded(PlayerSTD& player, XModule& module) { } virtual void timerTickStarted(PlayerSTD& player, XModule& module) { } virtual void timerTickEnded(PlayerSTD& player, XModule& module) { } virtual void patternEndReached(PlayerSTD& player, XModule& module, mp_sint32& newOrderIndex) { } }; private: enum { XM_MINPERIOD = 50 }; struct TPrEnv { TEnvelope* envstruc; mp_sint32 a,b,step; mp_uint32 bpmCounter, bpmAdder; mp_uint32 timeTrackSize; struct TTimeRecord { mp_sword pos; const TEnvelope* envstruc; }; TTimeRecord* timeRecord; TPrEnv() : timeTrackSize(0), timeRecord(NULL) { } ~TPrEnv() { delete[] timeRecord; } void clear() { envstruc = 0; a = b = step = 0; bpmCounter = bpmAdder = 0; if (timeTrackSize && timeRecord) memset(timeRecord, 0, sizeof(TTimeRecord)*timeTrackSize); } void reallocTimeRecord(mp_uint32 size) { timeTrackSize = size; delete[] timeRecord; timeRecord = new TTimeRecord[size]; } }; struct TLastOperands { mp_ubyte portaup; mp_ubyte portadown; mp_ubyte portanote; mp_ubyte fineportaup; mp_ubyte fineportadown; mp_ubyte xfineportaup; mp_ubyte xfineportadown; mp_ubyte volslide; mp_ubyte finevolslide; mp_ubyte gvolslide; mp_ubyte panslide; mp_ubyte arpeg; mp_ubyte retrig; mp_ubyte tremor; mp_ubyte smpoffset; }; struct TModuleChannel { mp_uint32 flags; mp_sint32 ins; mp_sint32 smp; bool hasSetVolume; mp_sint32 vol, tremoloVol, finalTremoloVol, tremorVol; bool hasTremolo; mp_sint32 masterVol; mp_sint32 pan; mp_sint32 per, finalVibratoPer, destper; bool hasVibrato; //mp_sint32 c4spd; mp_sint32 currentnote, relnote; mp_sint32 finetune; mp_sword freqadjust; mp_sint32 note, destnote, lastnoportanote; bool validnote; mp_ubyte eff[MP_NUMEFFECTS]; mp_ubyte eop[MP_NUMEFFECTS]; TLastOperands old[MP_NUMEFFECTS]; mp_sint32 loopstart; mp_sint32 execloop; mp_sint32 loopcounter; bool isLooping; mp_sint32 loopingValidPosition; mp_ubyte vibdepth[MP_NUMEFFECTS]; mp_ubyte vibspeed[MP_NUMEFFECTS]; mp_ubyte vibpos[MP_NUMEFFECTS]; mp_ubyte trmdepth[MP_NUMEFFECTS]; mp_ubyte trmspeed[MP_NUMEFFECTS]; mp_ubyte trmpos[MP_NUMEFFECTS]; mp_ubyte tremorcnt[MP_NUMEFFECTS]; mp_sint32 retrigcounterE9x[MP_NUMEFFECTS]; mp_ubyte retrigmaxE9x[MP_NUMEFFECTS]; mp_sint32 retrigcounterRxx[MP_NUMEFFECTS]; mp_ubyte retrigmaxRxx[MP_NUMEFFECTS]; bool keyon; TPrEnv venv; TPrEnv penv; TPrEnv fenv; TPrEnv vibenv; mp_sint32 fadevolstart; mp_sint32 fadevolstep; mp_ubyte avibused; mp_ubyte avibspd; mp_ubyte avibdepth; mp_ubyte avibcnt; mp_ubyte avibsweep; mp_ubyte avibswcnt; void clear() { flags = 0; ins = 0; smp = 0; hasSetVolume = 0; vol = tremoloVol = finalTremoloVol = tremorVol = 0; hasTremolo = false; masterVol = 0; pan = 0; per = finalVibratoPer = destper = 0; hasVibrato = 0; currentnote = relnote = 0; finetune = 0; freqadjust = 0; note = destnote = lastnoportanote = 0; validnote = false; memset(&eff, 0, sizeof(eff)); memset(&eop, 0, sizeof(eop)); memset(&old, 0, sizeof(old)); loopstart = 0; execloop = 0; loopcounter = 0; isLooping = false; loopingValidPosition = 0; memset(&vibdepth, 0, sizeof(vibdepth)); memset(&vibpos, 0, sizeof(vibpos)); memset(&trmdepth, 0, sizeof(trmdepth)); memset(&trmspeed, 0, sizeof(trmspeed)); memset(&trmpos, 0, sizeof(trmpos)); memset(&tremorcnt, 0, sizeof(tremorcnt)); memset(&retrigcounterE9x, 0, sizeof(retrigcounterE9x)); memset(&retrigmaxE9x, 0, sizeof(retrigmaxE9x)); memset(&retrigcounterRxx, 0, sizeof(retrigcounterRxx)); memset(&retrigmaxRxx, 0, sizeof(retrigmaxRxx)); keyon = false; venv.clear(); penv.clear(); fenv.clear(); vibenv.clear(); fadevolstart = 0; fadevolstep = 0; avibused = 0; avibspd = 0; avibdepth = 0; avibcnt = 0; avibsweep = 0; avibswcnt = 0; } void reallocTimeRecord(mp_uint32 size) { venv.reallocTimeRecord(size); penv.reallocTimeRecord(size); fenv.reallocTimeRecord(size); vibenv.reallocTimeRecord(size); } }; private: static const mp_sint32 vibtab[32]; static const mp_uword lintab[769]; static const mp_uint32 logtab[]; StatusEventListener* statusEventListener; TModuleChannel* chninfo; // our channel information mp_sint32 lastNumAllocatedChannels; mp_uint32* smpoffs; mp_ubyte* attick; mp_sint32 patternIndex; // holds current pattern index mp_sint32 numEffects; // current number of effects mp_sint32 numChannels; // current number of channels mp_ubyte pbreak; mp_ubyte pbreakpos; mp_sint32 pbreakPriority; mp_ubyte pjump; mp_ubyte pjumppos,pjumprow; mp_sint32 pjumpPriority; bool patDelay; bool haltFlag; mp_sint32 startNextRow; mp_sint32 patDelayCount; // keep track of what positions we already visited (bitmap) mp_ubyte rowHits[256*256/8]; bool isLooping; /////////////////////////////////////////////////////////////////////////////////////////////////// // this information is updated while the song plays /////////////////////////////////////////////////////////////////////////////////////////////////// bool newInsPTFlag; // New instrument PT like bool newInsST3Flag; // New instrument ST3 like bool oldPTInsChangeFlag; // sample without note flag (old PT style) bool playModePT; bool playModePTPitchLimit; bool playModeFT2; bool playModeChopSampleOffset; bool isRowVisited(mp_sint32 row) { return (rowHits[row>>3]>>(row&7))&1; } void visitRow(mp_sint32 row) { rowHits[row>>3] |= (1<<(row&7)); } static void prenvelope(mp_sint32 c, TPrEnv* env, mp_sint32 keyon); // process envelopes static mp_sint32 getenvval(mp_sint32 c, TPrEnv* env, mp_sint32 n); // get envelope value // This takes the period *with* 8 bit fractional part static mp_sint32 getlinfreq(mp_sint32 per); // This takes the period *with* 8 bit fractional part static mp_sint32 getlogfreq(mp_sint32 per); // this returns a period *without* the 8 bit fractional part static mp_sint32 getlinperiod(mp_sint32 note,mp_sint32 relnote,mp_sint32 finetune); static mp_sint32 interpolate(mp_sint32 eax,mp_sint32 ebx,mp_sint32 ecx,mp_sint32 edi,mp_sint32 esi); // this returns a period *without* the 8 bit fractional part static mp_sint32 getlogperiod(mp_sint32 note,mp_sint32 relnote,mp_sint32 finetune); mp_uint32 getbpmrate(mp_uint32 bpm) { // digibooster "real BPM" setting mp_uint32 realCiaTempo = (bpm * (baseBpm << 8) / 125) >> 8; if (!realCiaTempo) realCiaTempo++; mp_int64 t = ((mp_int64)realCiaTempo)<<(32+2); const mp_uint32 timerBase = (mp_uint32)(5.0f*500.0f*(MP_BEATLENGTH*MP_TIMERFREQ / (float)MP_BASEFREQ)); return (mp_uint32)(t/timerBase); } mp_sint32 getperiod(mp_sint32 note,mp_sint32 relnote,mp_sint32 finetune) { if (playModeFT2) { // FT2 doesn't support lower 3 bits if (finetune > 0) finetune &= 0xF8; else if (finetune < 0) { finetune = -((-finetune + 7) & 0xF8); if (finetune < -128) finetune = -128; } } return (module->header.freqtab&1) ? getlinperiod(note,relnote,finetune) : getlogperiod(note,relnote,finetune); } mp_sint32 getvolume(mp_sint32 c,mp_sint32 nv) { mp_sint32 vol = (nv*getenvval(c,&chninfo[c].venv,256))>>7; vol = (vol*chninfo[c].fadevolstart)>>16; vol = (vol*chninfo[c].masterVol)>>8; vol = (vol*mainVolume)>>8; return vol; } mp_sint32 getpanning(mp_sint32 c,mp_sint32 np) { mp_sint32 envpan = getenvval(c,&chninfo[c].penv,128); //if (envpan!=256) cprintf("%i\r\n",envpan); mp_sint32 finalpan = np+(envpan-128)*(128-abs(np-128))/128; if (finalpan<0) finalpan=0; if (finalpan>255) finalpan=255; return finalpan; } mp_sint32 getfreq(mp_sint32 c,mp_sint32 per,mp_sword freqadjust) { if (per<1) return 0; mp_sint32 eval = getenvval(c,&chninfo[c].fenv,128)-128; mp_uint32 freq; freq = (module->header.freqtab&1) ? getlinfreq(per) : getlogfreq(per); mp_sint32 finalFreq = (freq+(eval*63))+freqadjust; if (finalFreq < 0) finalFreq = 0; return finalFreq; } mp_sint32 getfinalperiod(mp_sint32 c, mp_sint32 p); void playInstrument(mp_sint32 chn, TModuleChannel* chnInf, bool bNoRestart = false); void triggerEnvelope(TPrEnv& dstEnv, TEnvelope& srcEnv); void triggerEnvelopes(TModuleChannel* chnInf); void triggerAutovibrato(TModuleChannel* chnInf); void triggerInstrumentFX(TModuleChannel* chnInf); void updatePlayModeFlags(); void handlePeriodOverflow(mp_sint32 channel) { // PTK/FT1 playmode if (playModePTPitchLimit && options[PlayModeOptionForcePTPitchLimit]) { if (chninfo[channel].per > 856*4) chninfo[channel].per = 856*4; } // FT2 playmode (does nothing right now) else { //if (chninfo[channel].per > 14150) // chninfo[channel].per %= 14150; } } void handlePeriodUnderflow(mp_sint32 channel) { // PTK/FT1 playmode if (playModePTPitchLimit && options[PlayModeOptionForcePTPitchLimit]) { if (chninfo[channel].per < 113*4) chninfo[channel].per = 113*4; } // FT2 playmode (clamp on low value, not what FT2 does btw.) else { if (chninfo[channel].per < XM_MINPERIOD) chninfo[channel].per = XM_MINPERIOD; //chninfo[channel].per &= 0x3FFF; } } mp_sint32 calcVibrato(TModuleChannel* chnInf, mp_sint32 effcnt); void doTickEffect(mp_sint32 chn, TModuleChannel* chnInf, mp_sint32 effcnt); void doEffect(mp_sint32 chn, TModuleChannel* chnInf, mp_sint32 effcnt); void doTickeffects(); void progressRow(); void update(); void updateBPMIndependent(); //void handleQueuedPositions(mp_sint32& poscnt); void setNewPosition(mp_sint32 poscnt); void tickhandler(); mp_sint32 allocateStructures(); void freeMemory(); // stop song by setting flag and setting speed to zero void halt(); protected: virtual void clearEffectMemory(); public: PlayerSTD(mp_uint32 frequency, StatusEventListener* statusEventListener = NULL); virtual ~PlayerSTD(); virtual PlayerTypes getType() const { return PlayerType_Generic; } virtual mp_sint32 adjustFrequency(mp_uint32 frequency); virtual mp_sint32 setBufferSize(mp_uint32 bufferSize); // virtual from mixer class, perform playing here virtual void timerHandler(mp_sint32 currentBeatPacket); virtual void restart(mp_uint32 startPosition = 0, mp_uint32 startRow = 0, bool resetMixer = true, const mp_ubyte* customPanningTable = NULL, bool playOneRowOnly = false); virtual void reset(); virtual void resetAllSpeed(); virtual bool grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const; // milkytracker virtual void playNote(mp_ubyte chn, mp_sint32 note, mp_sint32 ins, mp_sint32 vol = -1); virtual void setPanning(mp_ubyte chn, mp_ubyte pan) { chninfo[chn].pan = pan; } #ifdef MILKYTRACKER friend class PlayerController; friend class PlayerGeneric; friend class PlayerStatusTracker; #endif }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/ResamplerMacros.h0000644000175000017500000004512411163403715022504 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * ResamplerMacros.h * MilkyPlay mixer macros & "templates" * * * "- Be prepared! Are you sure you want to know? :-)" * */ #ifndef __RESAMPLERMACROS_H__ #define __RESAMPLERMACROS_H__ #define VALIDATE \ /*ASSERT((void*)(sample+(posfixed>>16)) >= (void*)chn->sample);*/ #define PROCESS_BLOCK(MIXER) \ mp_sint32 blockCount = count>>3; \ mp_sint32 remainCount = count & 7; \ while (blockCount) \ { \ VALIDATE \ MIXER \ posfixed+=smpadd; \ VALIDATE \ MIXER \ posfixed+=smpadd; \ VALIDATE \ MIXER \ posfixed+=smpadd; \ VALIDATE \ MIXER \ posfixed+=smpadd; \ VALIDATE \ MIXER \ posfixed+=smpadd; \ VALIDATE \ MIXER \ posfixed+=smpadd; \ VALIDATE \ MIXER \ posfixed+=smpadd; \ VALIDATE \ MIXER \ posfixed+=smpadd; \ blockCount--; \ } \ while (remainCount) \ { \ VALIDATE \ MIXER \ posfixed+=smpadd; \ remainCount--; \ } #define NOCHECKMIXER_TEMPLATE(MIXER_8BIT,MIXER_16BIT) \ if (!(chn->flags&4)) \ { \ const mp_sbyte* sample = chn->sample + basepos; \ PROCESS_BLOCK(MIXER_8BIT) \ } \ else \ { \ const mp_sword* sample = (const mp_sword*)chn->sample + basepos; \ PROCESS_BLOCK(MIXER_16BIT) \ } ///////////////////////////////////////////////////////// // NO INTERPOLATION AND NO VOLUME RAMPING // ///////////////////////////////////////////////////////// #define NOCHECKMIXER_8BIT_NORMAL \ sd1 = sample[posfixed>>16]<<8; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); #define NOCHECKMIXER_16BIT_NORMAL \ sd1 = sample[posfixed>>16]; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); ///////////////////////////////////////////////////////// // NO INTERPOLATION BUT VOLUME RAMPING // ///////////////////////////////////////////////////////// #define NOCHECKMIXER_8BIT_NORMAL_RAMP(_RAMP_) \ sd1 = sample[posfixed>>16]<<8; \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #define NOCHECKMIXER_16BIT_NORMAL_RAMP(_RAMP_) \ sd1 = sample[posfixed>>16]; \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } ///////////////////////////////////////////////////////// // INTERPOLATION AND NO VOLUME RAMPING // ///////////////////////////////////////////////////////// #define NOCHECKMIXER_8BIT_LERP \ sd1 = sample[posfixed>>16]<<8; \ sd2 = sample[(posfixed>>16)+1]<<8; \ \ sd1 =((sd1<<12)+((posfixed>>4)&0xfff)*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); #define NOCHECKMIXER_16BIT_LERP \ sd1 = sample[posfixed>>16]; \ sd2 = sample[(posfixed>>16)+1]; \ \ sd1 =((sd1<<12)+((posfixed>>4)&0xfff)*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); ///////////////////////////////////////////////////////// // INTERPOLATION AND VOLUME RAMPING // ///////////////////////////////////////////////////////// #define NOCHECKMIXER_8BIT_LERP_RAMP(_RAMP_) \ sd1 = sample[posfixed>>16]<<8; \ sd2 = sample[(posfixed>>16)+1]<<8; \ \ sd1 =((sd1<<12)+((posfixed>>4)&0xfff)*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #define NOCHECKMIXER_16BIT_LERP_RAMP(_RAMP_) \ sd1 = sample[posfixed>>16]; \ sd2 = sample[(posfixed>>16)+1]; \ \ sd1 =((sd1<<12)+((posfixed>>4)&0xfff)*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } ///////////////////////////////////////////////////////// // INTERPOLATION/VOLUME RAMPING and FILTERING // ///////////////////////////////////////////////////////// #define NOCHECKMIXER_8BIT_LERP_RAMP_FILTER(_RAMP_) \ sd1 = sample[posfixed>>16]<<8; \ sd2 = sample[(posfixed>>16)+1]<<8; \ \ sd1 =((sd1<<12)+((posfixed>>4)&0xfff)*(sd2-sd1))>>12; \ \ sd1 = (MP_FP_MUL(sd1, a) + MP_FP_MUL(currsample, b) + MP_FP_MUL(prevsample, c)) >> ChannelMixer::MP_FILTERPRECISION; \ prevsample = currsample; \ currsample = sd1; \ \ /* adjust volume for left/right channels & mix */ \ (*buffer++)+=MP_FP_MUL(sd1, voll>>14); \ (*buffer++)+=MP_FP_MUL(sd1, volr>>14); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #define NOCHECKMIXER_16BIT_LERP_RAMP_FILTER(_RAMP_) \ sd1 = sample[posfixed>>16]; \ sd2 = sample[(posfixed>>16)+1]; \ \ sd1 =((sd1<<12)+((posfixed>>4)&0xfff)*(sd2-sd1))>>12; \ \ sd1 = (MP_FP_MUL(sd1, a) + MP_FP_MUL(currsample, b) + MP_FP_MUL(prevsample, c)) >> ChannelMixer::MP_FILTERPRECISION; \ prevsample = currsample; \ currsample = sd1; \ \ /* adjust volume for left/right channels & mix */ \ (*buffer++)+=MP_FP_MUL(sd1, voll>>14); \ (*buffer++)+=MP_FP_MUL(sd1, volr>>14); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #define BIDIR_REPOSITION(FRACBITS, SMPPOS, SMPPOSFRAC, LOOPSTART, LOOPEND) \ if (!((SMPPOS == LOOPEND) && (SMPPOSFRAC == 0) ||\ (SMPPOS == LOOPSTART) && (SMPPOSFRAC == 0))) \ { \ do \ { \ if (SMPPOS >= LOOPEND) \ SMPPOS = LOOPEND-(SMPPOS-LOOPEND+1); \ else if (SMPPOS < LOOPSTART) \ SMPPOS = LOOPSTART + (LOOPSTART-SMPPOS - 1); \ SMPPOSFRAC = ((1<= LOOPSTART && SMPPOS <= LOOPEND)); \ } #define FULLMIXER_TEMPLATE(MIXER_8BIT, MIXER_16BIT, FRACBITS, LABELNO) \ mp_sint32 smppos = chn->smppos; \ mp_sint32 smpposfrac = chn->smpposfrac; \ mp_sint32 smpadd = chn->smpadd; \ mp_sint32 loopstart = chn->loopstart; \ mp_sint32 loopend = chn->loopend; \ mp_sint32 flags = chn->flags; \ const mp_sbyte* sample = chn->sample; \ mp_sint32 sd1,sd2; \ \ /* 8 bit version */ \ if (!(flags&4)) \ { \ \ if (((((flags&3) == 0 || (flags&3) == 1)) && !(flags&ChannelMixer::MP_SAMPLE_BACKWARD)) || \ ((flags&3) == 2 && (flags&ChannelMixer::MP_SAMPLE_BACKWARD) == 0)) \ { \ \ while (count) \ { \ MIXER_8BIT \ MP_INCREASESMPPOS(smppos,smpposfrac,smpadd,FRACBITS); \ /* stop playing if necessary */ \ if (smppos>=loopend) \ { \ if ((flags & 3) == 0) \ { \ if (flags & ChannelMixer::MP_SAMPLE_ONESHOT) \ { \ flags &= ~ChannelMixer::MP_SAMPLE_ONESHOT; \ flags |= 1; \ chn->loopend = chn->loopendcopy; \ loopend = chn->loopend; \ /*ASSERT(loopend-loopstart > 0);*/ \ smppos = ((smppos - loopstart)%(loopend-loopstart))+loopstart; \ } \ else \ { \ flags&=~ChannelMixer::MP_SAMPLE_PLAY; \ break; \ } \ } \ else if ((flags & 3) == 1) \ { \ /*if (smppos>=((loopend<<1)-loopstart))*/ \ /* smppos=loopstart;*/ \ /*else */\ /* smppos=loopstart+(smppos-loopend); */\ /*ASSERT(loopend-loopstart > 0);*/ \ smppos = ((smppos - loopstart)%(loopend-loopstart))+loopstart; \ } \ else \ { \ flags|=ChannelMixer::MP_SAMPLE_BACKWARD; \ BIDIR_REPOSITION(FRACBITS, smppos, smpposfrac, loopstart, loopend) \ /*ASSERT(smppos >= loopstart && smppos <= loopend);*/ \ goto continueWithBiDir8_## LABELNO; \ } \ } \ \ continueWithNormalDir8_## LABELNO: \ \ count--; \ \ } \ \ } \ /* bi-dir loop */ \ else \ { \ while (count) \ { \ MIXER_8BIT \ MP_INCREASESMPPOS(smppos,smpposfrac,-smpadd,FRACBITS); \ \ if (loopstart>smppos) \ { \ if ((flags & 3) == 0) \ { \ flags&=~ChannelMixer::MP_SAMPLE_PLAY; \ break; \ } \ else if ((flags & 3) == 1) \ { \ smppos = loopend-((loopstart-smppos)%(loopend-loopstart)); \ } \ else \ { \ flags&=~ChannelMixer::MP_SAMPLE_BACKWARD; \ BIDIR_REPOSITION(FRACBITS, smppos, smpposfrac, loopstart, loopend) \ /*ASSERT(smppos >= loopstart && smppos <= loopend);*/ \ goto continueWithNormalDir8_## LABELNO; \ } \ } \ \ continueWithBiDir8_## LABELNO: \ \ count--; \ \ } \ \ } \ \ } \ else \ { \ \ if (((((flags&3) == 0 || (flags&3) == 1)) && !(flags&ChannelMixer::MP_SAMPLE_BACKWARD)) || \ ((flags&3) == 2 && (flags&ChannelMixer::MP_SAMPLE_BACKWARD) == 0)) \ { \ \ while (count) \ { \ MIXER_16BIT \ MP_INCREASESMPPOS(smppos,smpposfrac,smpadd,FRACBITS); \ /* stop playing if necessary */ \ if (smppos>=loopend) \ { \ if ((flags & 3) == 0) \ { \ if (flags & ChannelMixer::MP_SAMPLE_ONESHOT) \ { \ flags &= ~ChannelMixer::MP_SAMPLE_ONESHOT; \ flags |= 1; \ chn->loopend = chn->loopendcopy; \ loopend = chn->loopend; \ smppos = ((smppos - loopstart)%(loopend-loopstart))+loopstart; \ } \ else \ { \ flags&=~ChannelMixer::MP_SAMPLE_PLAY; \ break; \ } \ } \ else if ((flags & 3) == 1) \ { \ /*if (smppos>=((loopend<<1)-loopstart))*/ \ /* smppos=loopstart;*/ \ /*else */\ /* smppos=loopstart+(smppos-loopend); */\ smppos = ((smppos - loopstart)%(loopend-loopstart))+loopstart; \ } \ else \ { \ flags|=ChannelMixer::MP_SAMPLE_BACKWARD; \ BIDIR_REPOSITION(FRACBITS, smppos, smpposfrac, loopstart, loopend) \ /*ASSERT(smppos >= loopstart && smppos <= loopend);*/ \ goto continueWithBiDir16_## LABELNO; \ } \ } \ \ continueWithNormalDir16_## LABELNO: \ \ count--; \ \ } \ \ } \ /* bi-dir loop */ \ else \ { \ while (count) \ { \ MIXER_16BIT \ MP_INCREASESMPPOS(smppos,smpposfrac,-smpadd,FRACBITS); \ \ if (loopstart>smppos) \ { \ if ((flags & 3) == 0) \ { \ flags&=~ChannelMixer::MP_SAMPLE_PLAY; \ break; \ } \ else if ((flags & 3) == 1) \ { \ smppos = loopend-((loopstart-smppos)%(loopend-loopstart)); \ } \ else \ { \ flags&=~ChannelMixer::MP_SAMPLE_BACKWARD; \ BIDIR_REPOSITION(FRACBITS, smppos, smpposfrac, loopstart, loopend) \ /*ASSERT(smppos >= loopstart && smppos <= loopend);*/ \ goto continueWithNormalDir16_## LABELNO; \ } \ } \ \ continueWithBiDir16_## LABELNO: \ \ count--; \ \ } \ \ } \ \ } \ chn->smppos = smppos; \ chn->smpposfrac = smpposfrac; \ /*chn->smpadd = smpadd;*/ \ chn->flags = flags; ///////////////////////////////////////////////////////// // NO INTERPOLATION AND NO VOLUME RAMPING // ///////////////////////////////////////////////////////// #define FULLMIXER_8BIT_NORMAL \ /* 8 bit sample */ \ sd1 = ((mp_sbyte)sample[smppos])<<8; \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); #define FULLMIXER_16BIT_NORMAL \ /* 16 bit sample */ \ sd1 = ((mp_sword*)(sample))[smppos]; \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); ///////////////////////////////////////////////////////// // NO INTERPOLATION BUT VOLUME RAMPING // ///////////////////////////////////////////////////////// #define FULLMIXER_8BIT_NORMAL_RAMP(_RAMP_) \ /* 8 bit sample */ \ sd1 = ((mp_sbyte)sample[smppos])<<8; \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #define FULLMIXER_16BIT_NORMAL_RAMP(_RAMP_) \ /* 16 bit sample */ \ sd1 = ((mp_sword*)(sample))[smppos]; \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } ///////////////////////////////////////////////////////// // INTERPOLATION AND NO VOLUME RAMPING // ///////////////////////////////////////////////////////// #define FULLMIXER_8BIT_LERP \ /* 8 bit sample */ \ sd1 = ((mp_sbyte)sample[smppos])<<8; \ sd2 = ((mp_sbyte)sample[smppos+1])<<8; \ \ sd1 =((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); #define FULLMIXER_16BIT_LERP \ /* 16 bit sample */ \ sd1 = ((mp_sword*)(sample))[smppos]; \ sd2 = ((mp_sword*)(sample))[smppos+1]; \ \ sd1 =((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); ///////////////////////////////////////////////////////// // INTERPOLATION AND VOLUME RAMPING // ///////////////////////////////////////////////////////// #define FULLMIXER_8BIT_LERP_RAMP(_RAMP_) \ /* 8 bit sample */ \ sd1 = ((mp_sbyte)sample[smppos])<<8; \ sd2 = ((mp_sbyte)sample[smppos+1])<<8; \ \ sd1 =((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #define FULLMIXER_16BIT_LERP_RAMP(_RAMP_) \ /* 16 bit sample */ \ sd1 = ((mp_sword*)(sample))[smppos]; \ sd2 = ((mp_sword*)(sample))[smppos+1]; \ \ sd1 =((sd1<<12)+(smpposfrac>>4)*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } ///////////////////////////////////////////////////////// // INTERPOLATION/VOLUME RAMPING and FILTERING // ///////////////////////////////////////////////////////// #define FULLMIXER_8BIT_LERP_RAMP_FILTER(_RAMP_) \ sd1 = ((mp_sbyte)sample[smppos])<<8; \ sd2 = ((mp_sbyte)sample[smppos+1])<<8; \ \ sd1 =((sd1<<12)+((smpposfrac>>4)&0xfff)*(sd2-sd1))>>12; \ \ sd1 = (MP_FP_MUL(sd1, a) + MP_FP_MUL(currsample, b) + MP_FP_MUL(prevsample, c)) >> ChannelMixer::MP_FILTERPRECISION; \ prevsample = currsample; \ currsample = sd1; \ \ /* adjust volume for left/right channels & mix */ \ (*buffer++)+=MP_FP_MUL(sd1, voll>>14); \ (*buffer++)+=MP_FP_MUL(sd1, volr>>14); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #define FULLMIXER_16BIT_LERP_RAMP_FILTER(_RAMP_) \ sd1 = ((mp_sword*)(sample))[smppos]; \ sd2 = ((mp_sword*)(sample))[smppos+1]; \ \ sd1 =((sd1<<12)+((smpposfrac>>4)&0xfff)*(sd2-sd1))>>12; \ \ sd1 = (MP_FP_MUL(sd1, a) + MP_FP_MUL(currsample, b) + MP_FP_MUL(prevsample, c)) >> ChannelMixer::MP_FILTERPRECISION; \ prevsample = currsample; \ currsample = sd1; \ \ /* adjust volume for left/right channels & mix */ \ (*buffer++)+=MP_FP_MUL(sd1, voll>>14); \ (*buffer++)+=MP_FP_MUL(sd1, volr>>14); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } ///////////////////////////////////////////////////////// // INTERPOLATION AND VOLUME RAMPING HIRES // ///////////////////////////////////////////////////////// #define FULLMIXER_8BIT_LERP_RAMP_HIRES(_RAMP_) \ /* 8 bit sample */ \ sd1 = ((mp_sbyte)sample[smppos])<<8; \ sd2 = ((mp_sbyte)sample[smppos+1])<<8; \ \ sd1 =((sd1<<12)+(smpposfrac>>(4+12))*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #define FULLMIXER_16BIT_LERP_RAMP_HIRES(_RAMP_) \ /* 16 bit sample */ \ sd1 = ((mp_sword*)(sample))[smppos]; \ sd2 = ((mp_sword*)(sample))[smppos+1]; \ \ sd1 =((sd1<<12)+(smpposfrac>>(4+12))*(sd2-sd1))>>12; \ \ /* adjust volume for left channel & mix */ \ (*buffer++)+=((sd1*(voll>>15))>>15); \ /* adjust volume for right channel & mix */ \ (*buffer++)+=((sd1*(volr>>15))>>15); \ \ if ((_RAMP_)) \ { \ voll+=rampFromVolStepL; \ volr+=rampFromVolStepR; \ } #endif milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderWAV.h0000644000175000017500000000734311163403715022334 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderWAV.h * MilkyPlay * * Created by Peter Barth on 14.09.05. * */ #ifndef SAMPLELOADERWAV__H #define SAMPLELOADERWAV__H #include "SampleLoaderAbstract.h" class SampleLoaderWAV : public SampleLoaderAbstract { private: struct TWAVHeader { mp_ubyte RIFF[4]; // "RIFF" mp_dword length; // filesize - 8 mp_ubyte WAVE[4]; // "WAVE" mp_ubyte FMT[4]; // "fmt " mp_dword fmtDataLength; // = 16 mp_uword encodingTag; mp_uword numChannels; // Channels: 1 = mono, 2 = stereo mp_dword sampleRate; // Samples per second: e.g., 44100 mp_dword bytesPerSecond; // sample rate * block align mp_uword blockAlign; // channels * numBits / 8 mp_uword numBits; // 8 or 16 mp_ubyte DATA[4]; // "data" mp_dword dataLength; // sample data size }; struct TSamplerChunk { mp_dword dwManufacturer; mp_dword dwProduct; mp_dword dwSamplePeriod; mp_dword dwMIDIUnityNote; mp_dword dwMIDIPitchFraction; mp_dword dwSMPTEFormat; mp_dword dwSMPTEOffset; mp_dword cSampleLoops; mp_dword cbSamplerData; TSamplerChunk() : dwManufacturer(0), dwProduct(0), dwSamplePeriod(0), dwMIDIUnityNote(0), dwMIDIPitchFraction(0), dwSMPTEFormat(0), dwSMPTEOffset(0), cSampleLoops(0), cbSamplerData(0) { } }; struct TSampleLoop { mp_dword dwIdentifier; mp_dword dwType; mp_dword dwStart; mp_dword dwEnd; mp_dword dwFraction; mp_dword dwPlayCount; TSampleLoop() : dwIdentifier(0), dwType(0), dwStart(0), dwEnd(0), dwFraction(0), dwPlayCount(0) { } }; static const char* channelNames[]; mp_sint32 parseFMTChunk(XMFile& f, TWAVHeader& hdr); mp_sint32 parseDATAChunk(XMFile& f, TWAVHeader& hdr, mp_sint32 index, mp_sint32 channelIndex); mp_sint32 parseSMPLChunk(XMFile& f, TWAVHeader& hdr, TSamplerChunk& samplerChunk, TSampleLoop& sampleLoop); public: SampleLoaderWAV(const SYSCHAR* fileName, XModule& theModule); virtual bool identifySample(); virtual mp_sint32 getNumChannels(); virtual const char* getChannelName(mp_sint32 channelIndex); virtual mp_sint32 loadSample(mp_sint32 index, mp_sint32 channelIndex); virtual mp_sint32 saveSample(const SYSCHAR* fileName, mp_sint32); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderDTM.cpp0000644000175000017500000004603611163403715021516 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderDTM.cpp * MilkyPlay Module Loader: Digitrekker 3.0 and Digital Tracker * * Created by Peter Barth on 15.01.06. * */ #include "Loaders.h" const char* LoaderDTM_2::identifyModule(const mp_ubyte* buffer) { // check for .DTM module if (memcmp(buffer,"D.T.",4)) return NULL; bool hasPATT = false, hasINST = false, hasSEQ = false; mp_sint32 i = 8 + BigEndian::GET_DWORD(buffer+4); while (i < 2040 && !(hasPATT && hasINST && hasSEQ)) { mp_ubyte ID[4], lenBuf[4]; memcpy(ID, buffer + i, 4); i+=4; memcpy(lenBuf, buffer + i, 4); i+=4; mp_uint32 chunkLen = BigEndian::GET_DWORD(lenBuf); switch (BigEndian::GET_DWORD(ID)) { case 0x532E512E : hasSEQ = true; break; case 0x50415454: hasPATT = true; break; case 0x494E5354: hasINST = true; break; } i+=chunkLen; } if (hasPATT && hasINST && hasSEQ) return "DTM_2"; return NULL; } mp_sint32 LoaderDTM_2::load(XMFileBase& f, XModule* module) { enum PatternFormatTypes { PTStyle, DTStyle }; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; header->mainvol = 255; header->tempo = 6; header->speed = 125; header->flags = XModule::MODULE_OLDPTINSTRUMENTCHANGE | XModule::MODULE_PTNEWINSTRUMENT; mp_sint32 i = 0, s = 0; PatternFormatTypes patternFormat = DTStyle; while (true) { mp_ubyte ID[4], buffer[4]; mp_uint32 bytesRead = f.read(ID, 4, 1); if (bytesRead != 4) break; bytesRead = f.read(buffer, 4, 1); if (bytesRead != 4) break; mp_uint32 chunkLen = BigEndian::GET_DWORD(buffer); switch (BigEndian::GET_DWORD(ID)) { case 0x442E542E : // 'D.T.' { mp_sint32 pos = f.posWithBaseOffset(); f.read(buffer, 1, 2); mp_uword type = BigEndian::GET_WORD(buffer); if (type) { return -8; } f.read(buffer, 1, 4); f.read(buffer, 1, 2); if (BigEndian::GET_WORD(buffer)) header->tempo = BigEndian::GET_WORD(buffer); f.read(buffer, 1, 2); if (BigEndian::GET_WORD(buffer)) header->speed = BigEndian::GET_WORD(buffer); mp_uint32 len = chunkLen - 10; mp_ubyte* name = new mp_ubyte[len]; if (name == NULL) return -7; f.read(name, 1, len); mp_uint32 i = 0; mp_uint32 fLen = len; while (i < len && (!name[i] || name[i] == 32)) { i++; fLen--; } memcpy(header->name, name+i, fLen < sizeof(header->name) ? fLen : sizeof(header->name)); for (i = 0; i < sizeof(header->name); i++) if (!header->name[i]) header->name[i] = 32; delete[] name; f.seekWithBaseOffset(pos + chunkLen); break; } case 0x532E512E: // 'S.Q.' { mp_uint32 pos = f.posWithBaseOffset(); f.read(buffer, 1, 2); header->ordnum = BigEndian::GET_WORD(buffer); f.read(buffer, 1, 2); header->restart = BigEndian::GET_WORD(buffer); f.read(buffer, 1, 4); f.read(header->ord, 1, header->ordnum); f.seekWithBaseOffset(pos + chunkLen); break; } case 0x50415454: // 'PATT' { mp_uint32 pos = f.posWithBaseOffset(); f.read(buffer, 1, 2); header->channum = BigEndian::GET_WORD(buffer); f.read(buffer, 1, 2); header->patnum = BigEndian::GET_WORD(buffer); f.read(buffer, 1, 4); if (!BigEndian::GET_DWORD(buffer)) patternFormat = PTStyle; else if (memcmp(buffer,"2.04",4) == 0) patternFormat = DTStyle; else return -8; f.seekWithBaseOffset(pos + chunkLen); break; } case 0x494E5354: // 'INST' { mp_uint32 pos = f.posWithBaseOffset(); f.read(buffer, 1, 2); header->insnum = BigEndian::GET_WORD(buffer); s = 0; for (i = 0; i < header->insnum; i++) { f.readDword(); // reserved f.read(buffer, 1, 4); smp[s].samplen = BigEndian::GET_DWORD(buffer); mp_ubyte fine = f.readByte(); smp[s].vol = module->vol64to255(f.readByte()); f.read(buffer, 1, 4); smp[s].loopstart = BigEndian::GET_DWORD(buffer); f.read(buffer, 1, 4); smp[s].looplen = BigEndian::GET_DWORD(buffer); f.read(instr[i].name, 1, 22); // instrument name f.read(buffer, 1, 2); mp_uword type = BigEndian::GET_WORD(buffer); mp_ubyte bits = (mp_ubyte)type; f.read(buffer, 1, 4); // MIDI f.read(buffer, 1, 4); mp_uint32 c4spd = BigEndian::GET_DWORD(buffer); mp_sint32 newC4spd = XModule::sfinetunes[fine & 0xF]; newC4spd = (c4spd*newC4spd) / 8363; XModule::convertc4spd(newC4spd, &smp[s].finetune, &smp[s].relnote); //XModule::convertc4spd(c4spd,&smp[s].finetune,&smp[s].relnote); smp[s].type = (bits == 16 ? 16 : 0); smp[s].flags = 1; smp[s].pan = 0x80; // 16 bit sample if (smp[s].type & 16) { smp[s].type |= 16; smp[s].samplen >>= 1; smp[s].loopstart >>= 1; smp[s].looplen >>= 1; } // looping if (smp[s].looplen > 2) smp[s].type |= 1; if (smp[s].samplen) { instr[i].samp = 1; for (mp_uint32 j = 0; j < 120; j++) instr[i].snum[j] = s; s++; } } header->smpnum = s; f.seekWithBaseOffset(pos + chunkLen); break; } case 0x44415054: { mp_uint32 pos = f.posWithBaseOffset(); f.readDword(); // reserved f.read(buffer, 1, 2); i = BigEndian::GET_WORD(buffer); f.read(buffer, 1, 2); mp_uint32 numRows = BigEndian::GET_WORD(buffer); if (i >= 0 && i < header->patnum) { mp_ubyte* patData = new mp_ubyte[chunkLen - 8]; phead[i].rows = numRows; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*6]; memset(phead[i].patternData,0,phead[i].rows*header->channum*6); f.read(patData, 1, chunkLen - 8); mp_ubyte* pData = patData; mp_ubyte* dstSlot = phead[i].patternData; for (mp_uint32 r = 0; r < numRows; r++) { for (mp_sint32 c = 0; c < phead[i].channum; c++) { mp_ubyte ins = 0,eff = 0,notenum = 0, op = 0, vol = 0; if (patternFormat == PTStyle) { mp_sint32 note = 0; mp_ubyte b1 = pData[0]; mp_ubyte b2 = pData[1]; mp_ubyte b3 = pData[2]; mp_ubyte b4 = pData[3]; note = ((b1&0xf)<<8)+b2; ins = (b1&0xf0)+(b3>>4); eff = b3&0xf; if (note) notenum = XModule::amigaPeriodToNote(note); dstSlot[0] = notenum; op = b4; } else if (patternFormat == DTStyle) { mp_ubyte octave = pData[0] >> 4; notenum = pData[0]&0xF; vol = pData[1]>>2; ins = ((pData[1]&3)<<4) | (pData[2]>>4); eff = pData[2]&0xF; op = pData[3]; if (octave && notenum) { dstSlot[0] = octave*12 + notenum; } } else ASSERT(false); dstSlot[1] = ins; if (vol) { dstSlot[2] = 0xC; mp_sint32 finalVol = ((mp_sint32)(vol-1)*0x41CE8)>>16; if (finalVol > 255) finalVol = 255; dstSlot[3] = finalVol; } if (eff==0xE) { eff=(op>>4)+0x30; op&=0xf; } if ((!eff)&&op) eff=0x20; // old style modules don't support last effect for: // - portamento up/down // - volume slide if (eff==0x1&&(!op)) eff = 0; if (eff==0x2&&(!op)) eff = 0; if (eff==0xA&&(!op)) eff = 0; if (eff==0x5&&(!op)) eff = 0x3; if (eff==0x6&&(!op)) eff = 0x4; if (eff==0xC) { op = XModule::vol64to255(op); } dstSlot[4] = eff; dstSlot[5] = op; pData+=4; dstSlot+=6; } } delete[] patData; } f.seekWithBaseOffset(pos + chunkLen); break; } case 0x44414954: { mp_uint32 pos = f.posWithBaseOffset(); f.read(buffer, 1, 2); i = BigEndian::GET_WORD(buffer); if (instr[i].samp) { s = instr[i].snum[0]; if (module->loadModuleSample(f, s, XModule::ST_DEFAULT, XModule::ST_16BIT | XModule::ST_BIGENDIAN) != 0) return -7; } f.seekWithBaseOffset(pos + chunkLen); break; } default: { mp_uint32 pos = f.posWithBaseOffset(); f.seekWithBaseOffset(pos + chunkLen); break; } } } strcpy(header->tracker,"Digital Tracker"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } #define CLEAN_DTM_1 \ if (trackSeq) delete[] trackSeq; \ if (tracks) for (mp_sint32 i = 0; i < numTracks; i++) delete[] tracks[i]; delete[] tracks; const char* LoaderDTM_1::identifyModule(const mp_ubyte* buffer) { // check for .DTM module if (memcmp(buffer,"SONG",4)) return NULL; bool hasINFO = false, hasINIT = false, hasPSEQ = false; mp_sint32 i = 8; while (i < 2040 && !(hasINFO && hasINIT && hasPSEQ)) { mp_ubyte ID[4], lenBuf[4]; memcpy(ID, buffer + i, 4); i+=4; memcpy(lenBuf, buffer + i, 4); i+=4; mp_uint32 chunkLen = LittleEndian::GET_DWORD(lenBuf); switch (BigEndian::GET_DWORD(ID)) { case 0x494E464F: hasINFO = true; break; case 0x494E4954: hasINIT = true; break; case 0x50534551 : hasPSEQ = true; break; } i+=chunkLen; } if (hasINFO && hasINIT && hasPSEQ) return "DTM_1"; return NULL; } mp_sint32 LoaderDTM_1::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; bool hasSong = false, hasInfo = false, hasInit = false, hasInst = false, hasTrak = false, hasSamp = false; bool insActive = false; mp_sint32 numTracks = 0; header->mainvol = 255; header->tempo = 6; header->speed = 125; mp_uword* trackSeq = NULL; mp_ubyte** tracks = NULL; mp_sint32 i = 0, s = 0, t = 0; while (true) { mp_ubyte ID[4], buffer[4]; mp_uint32 bytesRead = f.read(ID, 4, 1); if (bytesRead != 4) break; bytesRead = f.read(buffer, 4, 1); if (bytesRead != 4) break; mp_uint32 chunkLen = LittleEndian::GET_DWORD(buffer); switch (BigEndian::GET_DWORD(ID)) { case 0x534F4E47: // 'SONG' { hasSong = true; break; } case 0x4E414D45: // 'NAME' { mp_uint32 pos = f.posWithBaseOffset(); f.read(header->name, 1, chunkLen < sizeof(header->name) ? chunkLen : sizeof(header->name)); f.seekWithBaseOffset(pos + chunkLen); break; } case 0x494E464F: // 'INFO' { hasInfo = true; mp_uint32 pos = f.posWithBaseOffset(); // just assume everything is correct here header->channum = f.readWord(); header->ordnum = f.readWord(); header->patnum = f.readWord(); numTracks = f.readWord(); header->insnum = f.readWord(); tracks = new mp_ubyte*[numTracks]; if (tracks == NULL) { CLEAN_DTM_1 return -7; } memset(tracks, 0, sizeof(mp_ubyte*)*numTracks); f.seekWithBaseOffset(pos + chunkLen); break; } case 0x494E4954: // 'INIT' hasInit = true; break; case 0x73706564: // 'sped' header->tempo = f.readWord(); header->speed = f.readWord(); break; case 0x50534551: // 'PSEQ' f.read(header->ord, 1, chunkLen); break; case 0x50415454: // 'PATT' { trackSeq = new mp_uword[header->patnum * header->channum]; if (trackSeq == NULL) { CLEAN_DTM_1 return -7; } f.readWords(trackSeq, header->patnum * header->channum); break; } case 0x494E5354: // 'INST' hasInst = true; insActive = true; s = i = 0; break; case 0x53414D50 : // 'SAMP' hasSamp = true; insActive = false; s = i = 0; break; case 0x73616D70: // 'samp' { mp_uint32 pos = f.posWithBaseOffset(); if (insActive) { f.read(instr[i].name, 1, 32); // instrument name smp[s].samplen = f.readDword(); smp[s].loopstart = f.readDword(); mp_sint32 looplen = ((mp_sint32)f.readDword() - (mp_sint32)smp[s].loopstart); if (looplen < 0) looplen = 0; smp[s].looplen = looplen; mp_uint32 c4spd = f.readWord(); XModule::convertc4spd(c4spd,&smp[s].finetune,&smp[s].relnote); smp[s].vol = module->vol64to255(f.readByte()); mp_ubyte bits = f.readByte(); smp[s].type = (bits == 16 ? 16 : 0); f.read(smp[s].name,1,13); // read dos filename smp[s].flags = 1; smp[s].pan = 0x80; // looping if (smp[s].looplen) smp[s].type |= 1; // 16 bit sample /*if (flags & 4) { smp[s].type |= 16; smp[s].samplen >>= 1; smp[s].loopstart >>= 1; smp[s].looplen >>= 1; }*/ if (smp[s].samplen) { instr[i].samp = 1; for (mp_uint32 j = 0; j < 120; j++) instr[i].snum[j] = s; s++; } i++; } else { if (instr[i].samp) { if (module->loadModuleSample(f, s) != 0) { CLEAN_DTM_1 return -7; } s++; header->smpnum = s; } i++; } f.seekWithBaseOffset(pos + chunkLen); break; } case 0x5452414B: // 'TRAK' { hasTrak = true; t = 0; break; } case 0x7472616B: // 'trak' { if (t >= numTracks) { CLEAN_DTM_1 return -8; } tracks[t] = new mp_ubyte[chunkLen]; if (tracks[t] == NULL) { CLEAN_DTM_1 return -7; } f.read(tracks[t], 1, chunkLen); t++; break; } default: { mp_uint32 pos = f.posWithBaseOffset(); f.seekWithBaseOffset(pos + chunkLen); break; } } } if (!hasSong || !hasInfo || !hasInit || !hasInst || !hasTrak || !hasSamp) { CLEAN_DTM_1 return -8; } mp_ubyte lTab[256]; mp_ubyte rTab[256]; for (mp_sint32 pan = 0; pan < 256; pan++) { mp_sint32 left = 255-pan; if (left>128) left=128; mp_sint32 right = pan; if (right>128) right=128; lTab[pan] = left; rTab[pan] = right; } // rebuild pattern data mp_uword* pTrackSeq = trackSeq; for (i = 0; i < header->patnum;i++) { mp_sint32 numRows = 0; mp_sint32 c; for (c=0;cchannum;c++) { if (pTrackSeq[c] < numTracks) if (LittleEndian::GET_WORD(tracks[pTrackSeq[c]]) > numRows) numRows = LittleEndian::GET_WORD(tracks[*pTrackSeq]); } phead[i].rows = numRows; phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*6]; // out of memory? if (phead[i].patternData == NULL) { CLEAN_DTM_1 return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum*6); for (c=0;cchannum;c++) { if (*pTrackSeq < numTracks) { mp_sint32 numRows = LittleEndian::GET_WORD(tracks[*pTrackSeq]); mp_ubyte *track = tracks[*pTrackSeq] + 2; for (mp_sint32 row = 0; row < numRows; row++) { mp_ubyte* dstSlot = phead[i].patternData+row*phead[i].channum*6+c*6; mp_ubyte note = (track[row] == 0x80 ? (mp_ubyte)XModule::NOTE_OFF : track[row]); mp_ubyte ins = track[row+numRows]; mp_ubyte eff1 = track[row+numRows*2] >= 1 ? 0x0C : 0; mp_ubyte op1 = track[row+numRows*2] >= 1 ? XModule::vol64to255(track[row+numRows*2]-1) : 0; mp_ubyte hi = track[row+numRows*4]; mp_ubyte lo = track[row+numRows*5]; //printf("%x, %x, %x\n", track[row+numRows*3], track[row+numRows*4], track[row+numRows*5]); mp_ubyte eff2 = 0; mp_ubyte op2 = 0; switch (track[row+numRows*3]-1) { case 0x07: eff2 = 0x07; op2 = ((hi > 0x0F ? 0x0F : hi) << 4) + (lo > 0x0F ? 0x0F : lo); break; case 0x09: eff2 = 0x09; op2 = (((((mp_uint32)hi) << 8) + (mp_uint32)lo)<<4)>>8; break; case 0x0A: // volume slide up if (hi != 0 && hi != 0xFF) { eff2 = 0x0A; op2 = ((hi > 0x0F) ? 0xF : hi) << 4; } else if (lo != 0 && lo != 0xFF) { eff2 = 0x0A; op2 = ((lo > 0x0F) ? 0xF : lo); } break; case 0x10: // set tempo eff2 = 0x16; op2 = lo; break; case 0x11: // set panning { if (hi > 64) hi = 64; if (lo > 64) lo = 64; mp_sint32 dist = 0x7FFFFFFF; mp_sint32 x = hi<<1; mp_sint32 y = lo<<1; mp_sint32 index = -1; for (mp_sint32 j = 0; j < 256; j++) { if (((lTab[j]-y)*(lTab[j]-y) + (rTab[j]-x)*(rTab[j]-x)) < dist) { dist = ((lTab[j]-y)*(lTab[j]-y) + (rTab[j]-x)*(rTab[j]-x)); index = j; } } if (index != -1) { eff2 = 0x08; op2 = index; } break; } } dstSlot[0] = note; dstSlot[1] = ins; dstSlot[2] = eff1; dstSlot[3] = op1; dstSlot[4] = eff2; dstSlot[5] = op2; } } pTrackSeq++; } } CLEAN_DTM_1 strcpy(header->tracker,"Digitrekker"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderGDM.cpp0000644000175000017500000002675411163403715021506 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderGDM.cpp * MilkyPlay Module Loader: GDM General Digimusic */ #include "Loaders.h" const char* LoaderGDM::identifyModule(const mp_ubyte* buffer) { // check for .GDM module if (!memcmp(buffer,"GDM\xFE",4)) { return "GDM"; } return NULL; } struct tgdmheader { mp_ubyte sig[4]; // 'GDMË›' 000 mp_ubyte name[32]; // name of the song 004 mp_ubyte composer[32]; // composer? 036 mp_uword returnword; // return word (0x0D0A) 068 mp_ubyte whythis1a; // unknown 070 mp_ubyte mainid[4]; // 'GFMS' 071 mp_ubyte crap[6]; // maybe some time in the future 075 mp_ubyte panset[32]; // Channel panning (0xFF=Unused channel) 081 mp_ubyte mainvol; // Main volume of the song (0-64) 113 mp_ubyte tickspd; // initial tickspeed 114 mp_ubyte bpmspd; // initial bpmspeed 115 mp_uword unknown1; // not known yet 116 mp_uint32 orderlistpos; // adress for orderlist (in the file) 118 mp_ubyte ordnum; // length of the song-1 122 mp_uint32 patternpos; // adress for first pattern (in the file) 123 mp_ubyte patnum; // number of patterns-1 127 mp_uint32 insinfopos; // adress for first instrument (in the file) 128 mp_uint32 samplepos; // adress for first sample (in the file) 132 mp_ubyte insnum; // number of instruments-1 136 mp_ubyte channum; // number of channels mp_ubyte ord[256]; // orderlist }; struct tgdmsample { mp_ubyte name[32]; // name of instrument 000 mp_ubyte filename[13]; // filename with 0 terminator 032 mp_uint32 samplen; // size of sample 045 mp_uint32 loopstart; // loop start 049 mp_uint32 loopend; // loop end+1 053 mp_ubyte unknown1; // not known yet 057 mp_uint32 c4speed; // c4speed of sample 058 mp_ubyte vol; // volume of sample 060 mp_ubyte unknown2; // not known yet 061 }; struct TXMNoteSlot { mp_uword Note,Ins,Eff[4],Op[4]; }; mp_sint32 LoaderGDM::load(XMFileBase& f, XModule* module) { mp_sint32 i,j; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; tgdmheader GDMHeader; tgdmsample GDMSmp; f.read(GDMHeader.sig, 1, 4); f.read(header->name, 1, 32); f.read(GDMHeader.composer, 1, 32); GDMHeader.returnword = f.readWord(); GDMHeader.whythis1a = f.readByte(); f.read(GDMHeader.mainid, 1, 4); f.read(GDMHeader.crap, 1, 6); f.read(GDMHeader.panset, 1, 32); GDMHeader.mainvol = f.readByte(); GDMHeader.tickspd = f.readByte(); GDMHeader.bpmspd = f.readByte(); GDMHeader.unknown1 = f.readWord(); GDMHeader.orderlistpos = f.readDword(); GDMHeader.ordnum = f.readByte(); GDMHeader.patternpos = f.readDword(); GDMHeader.patnum = f.readByte(); GDMHeader.insinfopos = f.readDword(); GDMHeader.samplepos = f.readDword(); GDMHeader.insnum = f.readByte(); memcpy(&header->sig, &GDMHeader.sig, 3); strcpy(header->tracker,"..converted.."); header->ordnum = GDMHeader.ordnum + 1; header->patnum = GDMHeader.patnum + 1; header->insnum = GDMHeader.insnum + 1; header->tempo = GDMHeader.tickspd; header->speed = GDMHeader.bpmspd; header->mainvol = XModule::vol64to255(GDMHeader.mainvol); f.seekWithBaseOffset(GDMHeader.orderlistpos); f.read(&header->ord, 1, header->ordnum); i = 0; do { i++; } while (GDMHeader.panset[i]!=0xFF); header->channum = i; f.seekWithBaseOffset(GDMHeader.insinfopos); mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { f.read(GDMSmp.name, 1, 32); #ifdef VERBOSE printf("%s\n",GDMSmp.name); #endif f.read(GDMSmp.filename, 1, 13); GDMSmp.samplen = f.readDword(); GDMSmp.loopstart = f.readDword(); GDMSmp.loopend = f.readDword() - 1; GDMSmp.unknown1 = f.readByte(); GDMSmp.c4speed = f.readWord(); GDMSmp.vol = f.readByte(); GDMSmp.unknown2 = f.readByte(); if (GDMSmp.samplen>2) { memcpy(instr[i].name, GDMSmp.name, 30); memcpy(smp[s].name, GDMSmp.filename, 12); smp[s].flags = 1; smp[s].pan = 0x80; smp[s].samplen = GDMSmp.samplen; smp[s].loopstart = GDMSmp.loopstart; mp_sint32 looplen = (GDMSmp.loopend - smp[s].loopstart); if (looplen < 0) looplen = 0; smp[s].looplen = looplen; XModule::convertc4spd(GDMSmp.c4speed,&smp[s].finetune,&smp[s].relnote); smp[s].vol = XModule::vol64to255(GDMSmp.vol); if (looplen>2) smp[s].type=1; // looped sample instr[i].samp=1; for (j=0;j<120;j++) instr[i].snum[j] = s; s++; } } header->smpnum = s; f.seekWithBaseOffset(GDMHeader.patternpos); for (i=0;ipatnum;i++) { //cprintf("converting pattern %x/%x\r",PatCnt+1,GDMHeader.patnum); mp_sint32 patsize = f.readWord(); patsize-=2; mp_sint32 slotSize = 2 + 4*2; phead[i].rows = 64; phead[i].effnum = 4; phead[i].channum= (mp_ubyte)header->channum; //phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*slotSize]; mp_ubyte* tempPattern = new mp_ubyte[phead[i].rows*header->channum*slotSize]; if (tempPattern == NULL) return -7; // out of memory? //if (phead[i].patternData == NULL) // return -7; //memset(phead[i].patternData,0,phead[i].rows*header->channum*slotSize); memset(tempPattern,0,phead[i].rows*header->channum*slotSize); if (patsize) { mp_ubyte* packed=new mp_ubyte[patsize*2]; if (packed==NULL) return -7; memset(packed, 0, patsize*2); f.read(packed, 1, patsize); mp_sint32 offs = 0; mp_sint32 pos = 0; mp_uword b1 = 0; mp_uword b2 = 0; mp_sint32 maxEffects = 0; for (mp_sint32 RowCnt=0;RowCnt<64;RowCnt++) { do { b1=packed[offs++]; if (b1) { pos=(RowCnt*header->channum)+(b1&31); TXMNoteSlot XMSlot; memset(&XMSlot, 0, sizeof(XMSlot)); if ((b1&32)) { b2=packed[offs++]&127; XMSlot.Note=(b2>>4)*12+(b2&0xf); XMSlot.Ins=packed[offs++]; } if ((b1&64)) { mp_ubyte eff = 0; do { eff = packed[offs++]; XMSlot.Eff[eff>>6] = eff&0x1f; XMSlot.Op[eff>>6] = packed[offs++]; if ((eff>>6) + 1 > maxEffects) maxEffects = (eff>>6) + 1; /*if (b1==0x2C) { XMSlot.Vol=b2+0x10; XMSlot.Eff=packed[offs++]&0x1f; XMSlot.Op=packed[offs++]; } else { if (b1==0xC) XMSlot.Vol=b2+0x10; else { XMSlot.Eff=b1&0x1f; XMSlot.Op=b2; } }*/ } while (eff&32); } mp_sint32 dstOffs = pos * slotSize; tempPattern[dstOffs]=(mp_ubyte)XMSlot.Note; tempPattern[dstOffs+1]=(mp_ubyte)XMSlot.Ins; for (mp_sint32 j = 0; j < phead[i].effnum; j++) { switch (XMSlot.Eff[j]) { case 0x00: if (XMSlot.Op[j]) XMSlot.Eff[j]=0x20; break; case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x09: case 0x0a: case 0x0b: case 0x0d: case 0x0e: break; case 0x0c: XMSlot.Op[j] = XModule::vol64to255(XMSlot.Op[j]); break; // tremor case 0x08: XMSlot.Eff[j] = XMSlot.Op[j] = 0; break; case 0x0f: XMSlot.Eff[j] = 0x1c; break; // arpeggio case 0x10: XMSlot.Eff[j] = 0x20; break; case 0x12: XMSlot.Eff[j] = 0x39; break; case 0x13: XMSlot.Eff[j] = 0x10; XMSlot.Op[j] = XModule::vol64to255(XMSlot.Op[j]); break; // fine vibrato case 0x14: XMSlot.Eff[j] = 0x4a; break; // set bpm case 0x1f: XMSlot.Eff[j] = 0x16; break; default: XMSlot.Eff[j] = XMSlot.Op[j] = 0; } //if ((!XMSlot.Eff[j])&&(XMSlot.Op[j])) XMSlot.Eff[j]=0x20; if (XMSlot.Eff[j]==0xE) { XMSlot.Eff[j]=(XMSlot.Op[j]>>4)+0x30; XMSlot.Op[j]=XMSlot.Op[j]&0xf; } tempPattern[dstOffs+2+j*2]=(mp_ubyte)XMSlot.Eff[j]; tempPattern[dstOffs+2+j*2+1]=(mp_ubyte)XMSlot.Op[j]; } } } while (b1); } delete[] packed; // sort out unused effects mp_sint32 newSlotSize = 2 + maxEffects*2; phead[i].rows = 64; phead[i].effnum = maxEffects; phead[i].channum= (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*newSlotSize]; // out of memory? if (phead[i].patternData == NULL) return -7; memset(phead[i].patternData,0,phead[i].rows*header->channum*newSlotSize); for (mp_sint32 r = 0; r < phead[i].rows; r++) for (mp_sint32 c = 0; c < phead[i].channum; c++) { mp_sint32 srcOffs = (r * phead[i].channum + c) * slotSize; mp_sint32 dstOffs = (r * phead[i].channum + c) * newSlotSize; // lazyness here memcpy(phead[i].patternData + dstOffs, tempPattern + srcOffs, newSlotSize); } delete[] tempPattern; } } f.seekWithBaseOffset(GDMHeader.samplepos); if (module->loadModuleSamples(f, XModule::ST_UNSIGNED) != 0) return -7; strcpy(header->tracker,"General Digimusic"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/XMFile.h0000644000175000017500000001005711163403715020526 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * XMFile.h * MilkyPlay * * Created by Peter Barth on Tue Oct 19 2004. * */ #ifndef __XMFILE_H__ #define __XMFILE_H__ #include "MilkyPlayCommon.h" class XMFileBase { private: mp_dword baseOffset; public: XMFileBase(); virtual ~XMFileBase(); virtual mp_sint32 read(void* ptr,mp_sint32 size,mp_sint32 count) = 0; virtual mp_sint32 write(const void* ptr,mp_sint32 size,mp_sint32 count) = 0; enum SeekOffsetTypes { SeekOffsetTypeStart, SeekOffsetTypeCurrent, SeekOffsetTypeEnd }; virtual void seek(mp_uint32 pos, SeekOffsetTypes seekOffsetType = SeekOffsetTypeStart) = 0; virtual mp_uint32 pos() = 0; virtual mp_uint32 size() = 0; virtual bool isEOF() { return pos() >= size(); } virtual const SYSCHAR* getFileName() = 0; virtual const char* getFileNameASCII() = 0; virtual bool isOpen() = 0; virtual bool isOpenForWriting() = 0; mp_ubyte readByte(); mp_uword readWord(); mp_dword readDword(); void readWords(mp_uword* buffer,mp_sint32 count); void readDwords(mp_dword* buffer,mp_sint32 count); void writeByte(mp_ubyte b); void writeWord(mp_uword w); void writeDword(mp_dword dw); void writeWords(const mp_uword* buffer,mp_sint32 count); void writeDwords(const mp_dword* buffer,mp_sint32 count); void writeString(const char* string); void setBaseOffset(mp_dword baseOffset) { this->baseOffset = baseOffset; } mp_dword getBaseOffset() const { return baseOffset; } void seekWithBaseOffset(mp_dword pos); mp_uint32 sizeWithBaseOffset(); mp_uint32 posWithBaseOffset(); }; class XMFile : public XMFileBase { private: const SYSCHAR* fileName; char* fileNameASCII; FHANDLE handle; mp_uint32 bytesRead; bool writeAccess; mp_ubyte* cacheBuffer; mp_ubyte* currentCacheBufferPtr; void flush(); public: XMFile(const SYSCHAR* fileName, bool writeAccess = false); virtual ~XMFile(); virtual mp_sint32 read(void* ptr,mp_sint32 size,mp_sint32 count); virtual mp_sint32 write(const void* ptr,mp_sint32 size,mp_sint32 count); virtual void seek(mp_uint32 pos, SeekOffsetTypes seekOffsetType = SeekOffsetTypeStart); virtual mp_uint32 pos(); virtual mp_uint32 size(); virtual const SYSCHAR* getFileName() { return fileName; } virtual const char* getFileNameASCII(); virtual bool isOpen(); virtual bool isOpenForWriting() { return isOpen() && writeAccess; } static bool exists(const SYSCHAR* file); static bool remove(const SYSCHAR* file); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderDSM.cpp0000644000175000017500000004375211163403715021517 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderDSM.cpp * MilkyPlay Module Loader: Dynamic Studio & DSIK old and new Internal file formats */ #include "Loaders.h" ///////////////////////////////////////////////// // Dynamic Studio DSM ///////////////////////////////////////////////// const char* LoaderDSm::identifyModule(const mp_ubyte* buffer) { // check for .DSM module if (!memcmp(buffer,"DSm\x1A\x20",5)) { return "DSm"; } return NULL; } mp_sint32 LoaderDSm::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; strcpy(header->tracker,"Dynamic Studio"); f.read(header->sig, 1, 3); f.readByte(); if (f.readByte() != 0x20) return -8; f.read(header->name, 1, 20); f.readDword(); f.readDword(); f.readDword(); f.readDword(); f.readDword(); header->channum = f.readByte(); header->insnum = f.readByte(); header->ordnum = f.readByte(); header->tempo = 6; header->speed = 125; f.readByte(); header->mainvol = ((mp_sint32)f.readByte() * 255) / 100; f.readDword(); f.readDword(); f.readDword(); f.readWord(); mp_sint32 i,j; for (i = 0; i < header->channum; i++) header->pan[i] = (mp_ubyte)XModule::pan15to255(f.readByte()); f.read(header->ord, 1, header->ordnum); header->patnum=0; for (i=0;iordnum;i++) if (header->ord[i]>header->patnum) header->patnum=header->ord[i]; header->patnum++; // skip trackinfo for (i = 0; i < header->patnum * header->channum * 2; i++) f.readDword(); mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { f.read(instr[i].name, 1, 22); mp_ubyte type = f.readByte(); mp_sint32 len = f.readWord(); mp_ubyte ft = f.readByte(); mp_ubyte vol = f.readByte(); mp_sint32 repstart = f.readWord(); mp_sint32 replen = f.readWord(); f.readByte(); if ((len>2) && type) { memcpy(smp[s].name, instr[i].name, 22); instr[i].samp=1; for (j = 0; j < 120; j++) instr[i].snum[j] = s; module->convertc4spd(module->sfinetunes[ft],&smp[s].finetune,&smp[s].relnote); smp[s].flags = 1; smp[s].samplen = len; smp[s].loopstart = repstart; smp[s].looplen = replen; smp[s].vol = XModule::vol64to255(vol); if (replen > 2) smp[s].type = 1; if (type == 16) smp[s].type |= 16; s++; } } header->smpnum = s; // read patterns for (i = 0; i < header->patnum; i++) { mp_ubyte* pattern = new mp_ubyte[header->channum * 4 * 64]; f.read(pattern, 1, header->channum * 4 * 64); phead[i].rows = 64; phead[i].effnum = 1; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)]; // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)); mp_sint32 r,c,cnt = 0; mp_sint32 offs = 0; for (r = 0; r < phead[i].rows; r++) { for (c = 0; c < header->channum;c++) { mp_ubyte note = pattern[cnt+1]; if (note) { note >>= 1; note+=12*2; } mp_ubyte ins = pattern[cnt]; mp_ubyte eff = pattern[cnt+2]; mp_ubyte op = pattern[cnt+3]; phead[i].patternData[offs] = note; phead[i].patternData[offs+1] = ins; switch (eff) { case 0x00: if (op) eff = 0x20; break; case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x09: case 0x0A: case 0x0B: case 0x0D: case 0x0F: break; case 0x08: { switch (op >> 4) { // set panning case 0x0: op=(mp_ubyte)XModule::pan15to255(op); break; // fine porta up case 0x3: eff = 0x31; op &= 0xf; break; // fine porta down case 0x4: eff = 0x32; op &= 0xf; break; default: #ifdef VERBOSE printf("Unsupported command: %i/%i\n", eff, op); #endif break; } } break; case 0x0C: op = XModule::vol64to255(op); break; case 0x0E: eff = 0x30 + (op >> 4); op &= 0xF; break; case 0x11: eff = 0x01; break; case 0x12: eff = 0x02; break; default: #ifdef VERBOSE printf("Unsupported command: %i/%i\n", eff, op); #endif eff = op = 0; } // old style modules don't support last effect for: // - portamento up/down // - volume slide if (eff==0x1&&(!op)) eff = 0; if (eff==0x2&&(!op)) eff = 0; if (eff==0xA&&(!op)) eff = 0; if (eff==0x5&&(!op)) eff=0x3; if (eff==0x6&&(!op)) eff=0x4; phead[i].patternData[offs+2] = eff; phead[i].patternData[offs+3] = op; offs+=(phead[i].effnum * 2 + 2); cnt+=4; } } delete[] pattern; } if (module->loadModuleSamples(f) != 0) return -7; //module->setDefaultPanning(); module->postProcessSamples(); return 0; } ///////////////////////////////////////////////// // Old DSIK ///////////////////////////////////////////////// const char* LoaderDSMv1::identifyModule(const mp_ubyte* buffer) { // check for .DSM module if (!memcmp(buffer,"DSM\x10",4)) { return "DSMv1"; } return NULL; } static mp_sint32 convertDSMPattern(TXMPattern* XMPattern, const mp_ubyte* srcPattern, mp_uint32 maxChannels, mp_sint32 patCnt, mp_sint32 octaveAdjust = 24) { XMPattern->channum = maxChannels; XMPattern->effnum = 2; XMPattern->rows = 64; XMPattern->patternData = new mp_ubyte[maxChannels*6*64]; if (XMPattern->patternData == NULL) { return -1; } memset(XMPattern->patternData,0,maxChannels*6*64); mp_ubyte* dstSlot = XMPattern->patternData; for (mp_sint32 row = 0; row < 64; row++) for (mp_uint32 c = 0; c < maxChannels; c++) { const mp_ubyte* srcSlot = srcPattern+row*32*5+c*5; mp_ubyte note = srcSlot[0]; if (note) note+=octaveAdjust; dstSlot[0] = note; dstSlot[1] = srcSlot[1]; if (srcSlot[2]<=64) { dstSlot[2] = 0xC; dstSlot[3] = XModule::vol64to255(srcSlot[2]); } mp_ubyte eff = srcSlot[3]; mp_ubyte op = srcSlot[4]; if (eff <= 0xF) { if (eff==0xE) { eff=(op>>4)+0x30; op&=0xf; } if ((!eff)&&op) eff=0x20; if (eff==0x5&&(!op)) eff=0x3; if (eff==0x6&&(!op)) eff=0x4; if (eff==0xC) { op = XModule::vol64to255(op); } if (eff == 0x38) { eff = 0x8; op = XModule::pan15to255(op); } dstSlot[4] = eff; dstSlot[5] = op; } dstSlot+=6; } return 0; } mp_sint32 LoaderDSMv1::load(XMFileBase& f, XModule* module) { mp_sint32 i,j; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(header->sig,3,1); f.readByte(); f.read(&header->name,1,28); f.readDword(); // skip next 5 bytes f.readByte(); header->channum = f.readByte(); // number of channels header->ordnum = f.readByte(); // songlength header->insnum = f.readByte(); header->patnum = f.readByte(); header->tempo = f.readByte(); header->speed = f.readByte(); header->mainvol = XModule::vol64to255(f.readByte()); // initial main volume f.readDword(); // skip next 4 bytes f.read(header->ord,1,128); mp_uword* insParaPtrs = new mp_uword[header->insnum]; if (insParaPtrs == NULL) return -7; f.readWords(insParaPtrs,header->insnum); mp_uword* patParaPtrs = new mp_uword[header->patnum]; if (patParaPtrs == NULL) { delete[] insParaPtrs; return -7; } f.readWords(patParaPtrs,header->patnum); //for (i = 0; i < header->insnum; i++) //{ // printf("%x\n",insParaPtrs[i]*16); //} ////////////////////// // read instruments // ////////////////////// mp_uint32* samplePtrs = new mp_uint32[header->insnum]; if (samplePtrs == NULL) { delete[] insParaPtrs; delete[] patParaPtrs; return -7; } memset(samplePtrs,0,sizeof(mp_uint32)*header->insnum); mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { mp_uint32 insOffs = insParaPtrs[i]*16; if (insOffs) { f.seekWithBaseOffset(insOffs); //f.read(buffer,1,64); if (f.readDword() == 0x10495344) // "DSI"+0x10 { f.read(instr[i].name,1,30); // instrument name memcpy(smp[s].name,instr[i].name,30); f.readByte(); // zero terminator maybe? mp_ubyte bOffs = f.readByte(); mp_uword wOffs = f.readWord(); // stupid fileoffsets samplePtrs[s] = (((mp_uint32)bOffs<<16)+(mp_uint32)wOffs)*16; smp[s].flags = 1; smp[s].pan = 0x80; smp[s].samplen = f.readWord(); smp[s].loopstart = f.readWord(); mp_sint32 looplen = ((mp_uint32)f.readWord() - (mp_uint32)smp[s].loopstart); if (looplen < 0) looplen = 0; smp[s].looplen = looplen; XModule::convertc4spd(f.readWord(),&smp[s].finetune,&smp[s].relnote); smp[s].vol = XModule::vol64to255(f.readByte()); if (looplen>0) smp[s].type=1; // looped sample if (smp[s].samplen) { instr[i].samp=1; for (j=0;j<120;j++) instr[i].snum[j] = s; s++; } //f.readDword(); //f.readDword(); //f.readDword(); //f.readDword(); //f.readByte(); } } } header->smpnum = s; ////////////////////// // read patterns // ////////////////////// mp_ubyte* pattern = new mp_ubyte[64*32*5]; if (pattern == NULL) { delete[] insParaPtrs; delete[] patParaPtrs; delete[] samplePtrs; return -7; } for (i = 0; i < header->patnum; i++) { for (j = 0; j < 32*64; j++) { pattern[j*5] = 0; pattern[j*5+1] = 0; pattern[j*5+2] = 0xFF; pattern[j*5+3] = 0; pattern[j*5+4] = 0; } mp_uint32 maxChannels = 1; mp_uint32 patOffs = patParaPtrs[i]*16; if (patOffs) { f.seekWithBaseOffset(patOffs); mp_uint32 size = f.readWord()-2; mp_ubyte* packed = new mp_ubyte[size]; if (packed == NULL) { delete[] insParaPtrs; delete[] patParaPtrs; delete[] samplePtrs; delete[] pattern; return -7; } f.read(packed,1,size); mp_uint32 index = 0; mp_uint32 row = 0; mp_ubyte obfuscate = 3; while (indexmaxChannels) maxChannels = chn; mp_ubyte* slot = pattern+(row*32*5)+chn*5; if (pi & 128) { slot[0] = packed[index++]; obfuscate++; } if (pi & 64) { slot[1] = packed[index++]; obfuscate++; } if (pi & 32) { slot[2] = packed[index++]; obfuscate++; } if (pi & 16) { slot[3] = packed[index++]; slot[4] = packed[index++]; obfuscate++; obfuscate++; } } maxChannels++; if (maxChannels > header->channum) maxChannels = header->channum; delete[] packed; } convertDSMPattern(&phead[i],pattern, maxChannels, i); } delete[] pattern; delete[] insParaPtrs; delete[] patParaPtrs; for (i = 0; i < header->smpnum; i++) { f.seekWithBaseOffset(samplePtrs[i]); if (module->loadModuleSample(f,i) != 0) { delete[] samplePtrs; return -7; } } strcpy(header->tracker,"Digisound Interface Kit"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } ///////////////////////////////////////////////// // New DSIK ///////////////////////////////////////////////// const char* LoaderDSMv2::identifyModule(const mp_ubyte* buffer) { // check for .DSM module if (!memcmp(buffer,"RIFF",4) && !memcmp(buffer+8,"DSMFSONG",8)) { return "DSMv2"; } return NULL; } mp_sint32 LoaderDSMv2::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; // Even though the new DSM format is chunk based we don't read it // in a real chunk fashion i.e. we're assuming fixed structure // skip RIFF and chunk length f.seekWithBaseOffset(8); f.read(header->sig, 1, 4); // skip "SONG" & chunk length f.readDword(); if (f.readDword() != 0xC0) return -8; f.read(header->name, 1, 28); mp_uword ver = f.readWord(); mp_uword flags = f.readWord(); f.readDword(); header->ordnum = f.readWord(); header->insnum = f.readWord(); header->patnum = f.readWord(); header->channum = f.readWord(); header->mainvol = XModule::vol64to255(f.readByte()); mp_ubyte mainvol = f.readByte(); header->tempo = f.readByte(); header->speed = f.readByte(); mp_ubyte panpos[16]; f.read(panpos, 1, 16); f.read(header->ord, 1, 128); mp_sint32 patcnt = 0; mp_sint32 inscnt = 0; mp_sint32 smpcnt = 0; mp_uint32 size = f.sizeWithBaseOffset(); while (f.posWithBaseOffset() < size && (patcnt < header->patnum || inscnt < header->insnum)) { mp_ubyte ID[4]; f.read(ID, 1, 4); mp_dword chunkLen = f.readDword(); switch (BigEndian::GET_DWORD(&ID)) { // "PATT" case 0x50415454: { mp_sint32 j; mp_uint32 size = f.readWord()-2; mp_ubyte* packed = new mp_ubyte[size]; if (packed == NULL) { return -7; } f.read(packed, 1, size); mp_ubyte* pattern = new mp_ubyte[64*32*5]; if (pattern == NULL) { delete[] packed; return -7; } for (j = 0; j < 32*64; j++) { pattern[j*5] = 0; pattern[j*5+1] = 0; pattern[j*5+2] = 0xFF; pattern[j*5+3] = 0; pattern[j*5+4] = 0; } mp_uint32 maxChannels = 1; mp_uint32 index = 0; mp_uint32 row = 0; while (indexmaxChannels) maxChannels = chn; mp_ubyte* slot = pattern+(row*32*5)+chn*5; if (pi & 128) { slot[0] = packed[index++]; } if (pi & 64) { slot[1] = packed[index++]; } if (pi & 32) { slot[2] = packed[index++]; } if (pi & 16) { slot[3] = packed[index++]; slot[4] = packed[index++]; } } maxChannels++; if (maxChannels > header->channum) maxChannels = header->channum; delete[] packed; convertDSMPattern(&phead[patcnt], pattern, maxChannels, patcnt, 0); delete[] pattern; patcnt++; break; } // "INST" case 0x494E5354: { mp_ubyte dosname[13]; f.read(dosname, 1, 13); mp_uword flags = f.readWord(); mp_ubyte vol = f.readByte(); mp_dword length = f.readDword(); mp_dword loopstart = f.readDword(); mp_sint32 looplen = f.readDword() - loopstart; if (looplen < 0) looplen = 0; f.readDword(); mp_sint32 c2spd = f.readWord(); mp_sint32 period = f.readWord(); f.read(instr[inscnt].name, 1, 28); if (length) { instr[inscnt].samp = 1; for (mp_sint32 j = 0; j < 120; j++) instr[inscnt].snum[j] = smpcnt; TXMSample* s = &smp[smpcnt]; s->flags = 1; memcpy(s->name, dosname, sizeof(dosname)); s->samplen = length; s->loopstart = loopstart; s->looplen = looplen; if (flags & 1) s->type = 1; s->vol = XModule::vol64to255(vol); s->pan = 0x80; XModule::convertc4spd(c2spd, &s->finetune, &s->relnote); s->sample = (mp_sbyte*)module->allocSampleMem(length); if (s->sample == NULL) { return -7; } if (!module->loadSample(f, s->sample, length, length, (flags & 2) ? XModule::ST_DEFAULT : XModule::ST_UNSIGNED)) { return -7; } smpcnt++; } inscnt++; break; } } } strcpy(header->tracker,"Digisound Interface Kit"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/LoaderDBM.cpp0000644000175000017500000004001611163403715021464 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderDBM.cpp * MilkyPlay Module Loader: Digibooster Pro * * Created by Peter Barth on 06.03.06. * */ #include "Loaders.h" // to-do: improve detection const char* LoaderDBM::identifyModule(const mp_ubyte* buffer) { // check for .DTM module if (memcmp(buffer,"DBM0",4)) return NULL; return "DBM"; } #define CLEAN_DBM \ { \ mp_uint32 i; \ delete[] srcIns; \ for (i = 0; i < header->smpnum; i++) \ delete[] srcSmp[i].sample; \ delete[] srcSmp; \ delete[] orderListLengths; \ for (i = 0; i < numSubSongs; i++) \ delete[] orderLists[i]; \ for (i = 0; i < header->patnum; i++) \ delete[] patterns[i]; \ delete[] orderLists; \ delete[] patterns; \ } struct DBMInstrument { mp_ubyte name[30]; mp_uword sampnum; mp_uword volume; mp_uint32 finetune; mp_uint32 repstart; mp_uint32 replen; mp_uword panning; mp_uword flags; // added by ME mp_sint32 venvnum; mp_sint32 penvnum; }; struct DBMSample { mp_uint32 flags; mp_uint32 samplen; // bit 0 set - 8 bit sample // bit 1 set - 16 bit sample // bit 2 set - 32 bit sample mp_ubyte* sample; }; static void convertDBMffects(mp_ubyte& effect, mp_ubyte& operand) { //static const char eff[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; switch (effect) { case 0x00: if (operand) effect = 0x20; break; case 0x01: if ((operand & 0xF0) == 0xF0) { // doc says: 1Fx == fine portamento up effect = 0x31; operand &= 0x0F; } break; case 0x02: if ((operand & 0xF0) == 0xF0) { // doc says: 2Fx == fine portamento down effect = 0x32; operand &= 0x0F; } break; case 0x03: case 0x04: break; case 0x05: if ((operand & 0x0F) == 0x0F) { // doc says: 5xF == Tone portamento+Fine Volume slide up // !! unsupported !! // Might be possible with MDL way of combining portamento + volume slide // but with S3M volslide instead of MDL volslide goto missing; } else if ((operand & 0xF0) == 0xF0) { // doc says: 5Fx == Tone portamento+Fine Volume slide down // !! unsupported !! // Might be possible with MDL way of combining portamento + volume slide // but with S3M volslide instead of MDL volslide goto missing; } break; case 0x06: if ((operand & 0x0F) == 0x0F) { // doc says: 6xF == Vibrato+Fine Volume slide up // !! unsupported !! // Might be possible with MDL way of combining vibrato + volume slide // but with S3M volslide instead of MDL volslide goto missing; } else if ((operand & 0xF0) == 0xF0) { // doc says: 6Fx == Vibrato+Fine Volume slide down // !! unsupported !! // Might be possible with MDL way of combining vibrato + volume slide // but with S3M volslide instead of MDL volslide goto missing; } break; // Tremolo doesn't exist, huh? case 0x07: // Panning case 0x08: // Sample offset case 0x09: break; // Volslide (S3M volslide fits best probably) case 0x0A: effect = 0x49; break; // Position jump case 0x0B: break; // set volume case 0x0C: // set global volume case 0x10: operand = XModule::vol64to255(operand); break; // Pattern break case 0x0D: break; // subcommands case 0x0E: { effect = 0x30 + (operand >> 4); operand &= 0xF; switch (effect) { // Set filter: unsupported case 0x30: goto missing; break; // Play backwards case 0x33: // AMS can do that effect = 0x4F; operand = 1; break; // Turn off sound in channel? // can probably be emulated with AMS set channel volume // right now unsupported case 0x34: goto missing; break; // Turn on/off sound in channel? // can probably be emulated with AMS set channel volume // right now unsupported case 0x35: goto missing; break; // set loop/loop case 0x36: goto missing; break; // set offset for loop or what? case 0x37: goto missing; break; } break; } // Pattern break case 0x0F: break; case 0x11: break; // key off case 0x14: if (operand == 0) // AMS key of at tick effect = 0x51; break; // Set envelope position case 0x15: break; // Sample offset slide (unsupported) case 0x18: goto missing; break; // set real BPM case 0x1C: effect = 0x52; break; // echo effects (unsupported) case 0x1f: case 0x20: case 0x21: case 0x22: case 0x23: goto missing; break; default: #ifdef VERBOSE printf("Unknown DBM effect %x with operand %x\n", effect, operand); #endif missing: #ifdef VERBOSE printf("Missing DBM effect %x with operand %x\n", effect, operand); #endif effect = operand = 0; } } static void convertDBMEnvelope(TEnvelope& outEnv, const mp_ubyte* inEnv) { memset(&outEnv, 0, sizeof(TEnvelope)); outEnv.type = *inEnv & 7; #ifdef VERBOSE if (*inEnv >> 3) { printf("Second sustain point used"); } #endif // one single point? // disable envelope if (!*(inEnv+1)) { outEnv.type &= ~1; return; } // DBM stores numpoints-1 outEnv.num = *(inEnv+1) + 1; outEnv.sustain = *(inEnv+2); outEnv.loops = *(inEnv+3); outEnv.loope = *(inEnv+4); inEnv+=6; for (mp_sint32 i = 0; i < outEnv.num; i++) { outEnv.env[i][0] = BigEndian::GET_WORD(inEnv); outEnv.env[i][1] = BigEndian::GET_WORD(inEnv+2) << 2; inEnv+=4; } } mp_sint32 LoaderDBM::load(XMFileBase& f, XModule* module) { module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; mp_sint32 i,j; mp_uword numSubSongs = 0; mp_uword** orderLists = NULL; mp_uword* orderListLengths = NULL; DBMInstrument* srcIns = NULL; mp_ubyte** patterns = NULL; DBMSample* srcSmp = NULL; while (true) { mp_ubyte ID[4], buffer[4]; mp_uint32 bytesRead = f.read(ID, 4, 1); if (bytesRead != 4) break; bytesRead = f.read(buffer, 4, 1); if (bytesRead != 4) break; mp_uint32 chunkLen = BigEndian::GET_DWORD(buffer); switch (BigEndian::GET_DWORD(ID)) { case 0x44424D30: // 'DBM0' memcpy(header->sig, ID, 4); break; case 0x4E414D45: // 'NAME' { mp_ubyte* name = new mp_ubyte[chunkLen]; f.read(name, 1, chunkLen); memcpy(header->name, name, chunkLen > MP_MAXTEXT ? MP_MAXTEXT : chunkLen); delete[] name; break; } case 0x494E464F: // 'INFO' f.read(buffer, 1, 2); header->insnum = BigEndian::GET_WORD(buffer); f.read(buffer, 1, 2); header->smpnum = BigEndian::GET_WORD(buffer); srcSmp = new DBMSample[header->smpnum]; f.read(buffer, 1, 2); numSubSongs = BigEndian::GET_WORD(buffer); // Allocate order list table orderLists = new mp_uword*[numSubSongs]; orderListLengths = new mp_uword[numSubSongs]; f.read(buffer, 1, 2); header->patnum = BigEndian::GET_WORD(buffer); patterns = new mp_ubyte*[header->patnum]; f.read(buffer, 1, 2); header->channum = BigEndian::GET_WORD(buffer); break; case 0x534F4E47: // 'SONG' { // Skip name for (i = 0; i < numSubSongs; i++) { mp_ubyte name[44]; f.read(name, 1, 44); f.read(buffer, 1, 2); orderListLengths[i] = BigEndian::GET_WORD(buffer); orderLists[i] = new mp_uword[BigEndian::GET_WORD(buffer)]; for (j = 0; j < orderListLengths[i]; j++) { f.read(buffer, 1, 2); orderLists[i][j] = BigEndian::GET_WORD(buffer); } } break; } case 0x494E5354: // 'INST' { mp_uword insNum = chunkLen / 50; srcIns = new DBMInstrument[insNum]; for (i = 0; i < insNum; i++) { f.read(srcIns[i].name, 1, 30); f.read(buffer, 2, 1); srcIns[i].sampnum = BigEndian::GET_WORD(buffer); f.read(buffer, 2, 1); srcIns[i].volume = BigEndian::GET_WORD(buffer); f.read(buffer, 4, 1); srcIns[i].finetune = BigEndian::GET_DWORD(buffer); f.read(buffer, 4, 1); srcIns[i].repstart = BigEndian::GET_DWORD(buffer); f.read(buffer, 4, 1); srcIns[i].replen = BigEndian::GET_DWORD(buffer); f.read(buffer, 2, 1); srcIns[i].panning = BigEndian::GET_WORD(buffer); f.read(buffer, 2, 1); srcIns[i].flags = BigEndian::GET_WORD(buffer); srcIns[i].venvnum = srcIns[i].penvnum = -1; } break; } case 0x50415454: // 'PATT' { for (i = 0; i < header->patnum; i++) { f.read(buffer, 2, 1); phead[i].rows = BigEndian::GET_WORD(buffer); f.read(buffer, 4, 1); phead[i].len = BigEndian::GET_DWORD(buffer); patterns[i] = new mp_ubyte[phead[i].len]; f.read(patterns[i], 1, phead[i].len); } break; } case 0x534D504C: // 'SMPL' { for (i = 0; i < header->smpnum; i++) { f.read(buffer, 4, 1); srcSmp[i].flags = BigEndian::GET_DWORD(buffer); f.read(buffer, 4, 1); srcSmp[i].samplen = BigEndian::GET_DWORD(buffer); if (srcSmp[i].flags == 1) { srcSmp[i].sample = new mp_ubyte[srcSmp[i].samplen]; module->loadSample(f, srcSmp[i].sample, srcSmp[i].samplen, srcSmp[i].samplen); } else if (srcSmp[i].flags == 2) { srcSmp[i].sample = new mp_ubyte[srcSmp[i].samplen*2]; module->loadSample(f, srcSmp[i].sample, srcSmp[i].samplen*2, srcSmp[i].samplen, XModule::ST_16BIT | XModule::ST_BIGENDIAN); } else { #ifdef VERBOSE printf("Unsupported sample type"); #endif } } break; } case 0x56454E56: // 'VENV' { f.read(buffer, 2, 1); mp_uword numEnvelopes = BigEndian::GET_WORD(buffer); for (i = 0; i < numEnvelopes; i++) { f.read(buffer, 2, 1); mp_uword index = BigEndian::GET_WORD(buffer); if (index) srcIns[index-1].venvnum = module->numVEnvs; mp_ubyte env[134]; f.read(env, 1, 134); TEnvelope venv; convertDBMEnvelope(venv, env); if (!module->addVolumeEnvelope(venv)) { CLEAN_DBM; return -7; } } break; } case 0x50454E56: // 'PENV' { f.read(buffer, 2, 1); mp_uword numEnvelopes = BigEndian::GET_WORD(buffer); for (i = 0; i < numEnvelopes; i++) { f.read(buffer, 2, 1); mp_uword index = BigEndian::GET_WORD(buffer); if (index) srcIns[index-1].penvnum = module->numPEnvs; mp_ubyte env[134]; f.read(env, 1, 134); TEnvelope penv; convertDBMEnvelope(penv, env); if (!module->addPanningEnvelope(penv)) { CLEAN_DBM; return -7; } } break; } default: f.seekWithBaseOffset(f.posWithBaseOffset() + chunkLen); } } // Convert orderlist, subsongs are not supported yet j = 0; for (i = 0; i < orderListLengths[j]; i++) { if (i < 256) header->ord[i] = (mp_ubyte)orderLists[j][i]; } header->ordnum = orderListLengths[j]; header->mainvol = 255; header->speed = 125; header->tempo = 6; header->flags = XModule::MODULE_OLDPTINSTRUMENTCHANGE | XModule::MODULE_PTNEWINSTRUMENT; header->volenvnum = module->numVEnvs; header->panenvnum = module->numPEnvs; // Convert patterns for (i = 0; i < header->patnum; i++) { phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; const mp_sint32 bps = phead[i].effnum*2+2; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum*bps]; // out of memory? if (phead[i].patternData == NULL) { CLEAN_DBM; return -7; } memset(phead[i].patternData, 0, phead[i].rows*header->channum*bps); mp_uint32 currentRow = 0; j = 0; mp_ubyte* src = patterns[i]; while (j < (signed)phead[i].len && currentRow < phead[i].rows) { mp_ubyte pack = src[j]; j++; if (!pack) currentRow++; else { mp_ubyte note = 0, ins = 0; mp_ubyte eff1 = 0, op1 = 0, eff2 = 0, op2 = 0; mp_ubyte channel = pack-1; pack = src[j]; j++; // Note present? if (pack & 0x01) { if (src[j] == 0x1F) note = XModule::NOTE_OFF; else note = (src[j] >> 4) * 12 + ((src[j] & 0xF)+1); j++; } // Instrument present? if (pack & 0x02) { ins = src[j]; j++; } // Effect 1 present? if (pack & 0x04) { eff1 = src[j]; j++; } // Operand 1 present? if (pack & 0x08) { op1 = src[j]; j++; } // Effect 2 present? if (pack & 0x10) { eff2 = src[j]; j++; } // Operand 1 present? if (pack & 0x20) { op2 = src[j]; j++; } convertDBMffects(eff1, op1); convertDBMffects(eff2, op2); mp_ubyte* dstSlot = phead[i].patternData + currentRow * header->channum*bps + channel*bps; *dstSlot++ = note; *dstSlot++ = ins; *dstSlot++ = eff1; *dstSlot++ = op1; *dstSlot++ = eff2; *dstSlot++ = op2; } } } // convert instrument data for (i = 0; i < header->insnum; i++) { memcpy(instr[i].name, srcIns[i].name, MP_MAXTEXT); for (j = 0; j < 120; j++) instr[i].snum[j] = i; j = srcIns[i].sampnum; if (j && j <= header->smpnum) { j--; if (srcSmp[j].samplen) { instr[i].samp = 1; smp[i].flags = 1 | (srcIns[i].panning ? 2 : 0); smp[i].pan = (srcIns[i].panning ? srcIns[i].panning - 1 : 0x80); smp[i].vol = XModule::vol64to255(srcIns[i].volume); smp[i].samplen = srcSmp[j].samplen; if (srcSmp[j].flags == 1) { smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen); memcpy(smp[i].sample, srcSmp[j].sample, smp[i].samplen); } else if (srcSmp[j].flags == 2) { smp[i].sample = (mp_sbyte*)module->allocSampleMem(smp[i].samplen*2); memcpy(smp[i].sample, srcSmp[j].sample, smp[i].samplen*2); smp[i].type |= 16; } XModule::convertc4spd(srcIns[i].finetune, &smp[i].finetune, &smp[i].relnote); smp[i].loopstart = srcIns[i].repstart; smp[i].looplen = srcIns[i].replen; if (((srcIns[i].flags & 3) == 1) && smp[i].looplen) smp[i].type |= 1; else if (((srcIns[i].flags & 2) == 2) && smp[i].looplen) smp[i].type |= 2; if (srcIns[i].venvnum >= 0) smp[i].venvnum = srcIns[i].venvnum+1; if (srcIns[i].penvnum >= 0) smp[i].penvnum = srcIns[i].penvnum+1; } } } CLEAN_DBM; header->smpnum = header->insnum; strcpy(header->tracker,"Digibooster Pro"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderWAV.cpp0000644000175000017500000004242211163403715022664 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderWAV.cpp * MilkyPlay * * Created by Peter Barth on 14.09.05. * */ #include "SampleLoaderWAV.h" #include "XMFile.h" #include "XModule.h" const char* SampleLoaderWAV::channelNames[] = {"Left","Right"}; SampleLoaderWAV::SampleLoaderWAV(const SYSCHAR* fileName, XModule& theModule) : SampleLoaderAbstract(fileName, theModule) { } bool SampleLoaderWAV::identifySample() { return getNumChannels() != 0; } mp_sint32 SampleLoaderWAV::parseFMTChunk(XMFile& f, TWAVHeader& hdr) { if (hdr.fmtDataLength < 16) return -8; hdr.encodingTag = f.readWord(); if (hdr.encodingTag != 0x1 && hdr.encodingTag != 0x3) return -8; hdr.numChannels = f.readWord(); if (hdr.numChannels < 1 || hdr.numChannels > 2) return -8; hdr.sampleRate = f.readDword(); hdr.bytesPerSecond = f.readDword(); hdr.blockAlign = f.readWord(); hdr.numBits = f.readWord(); if (hdr.numBits != 8 && hdr.numBits != 16 && hdr.numBits != 24 && hdr.numBits != 32) return -8; // skip rest of format structure if greater than 16 for (mp_uint32 i = 0; i < hdr.fmtDataLength - 16; i++) f.readByte(); return 0; } mp_sint32 SampleLoaderWAV::parseDATAChunk(XMFile& f, TWAVHeader& hdr, mp_sint32 index, mp_sint32 channelIndex) { TXMSample* smp = &theModule.smp[index]; if (hdr.dataLength) { if (hdr.numBits == 8) { if (smp->sample) { theModule.freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->samplen = hdr.dataLength; if (hdr.numChannels == 2) { mp_sbyte* buffer = new mp_sbyte[smp->samplen]; if (buffer == NULL) return -7; theModule.loadSample(f, buffer, smp->samplen, smp->samplen, XModule::ST_UNSIGNED); smp->samplen>>=1; smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen); if (smp->sample == NULL) { delete[] buffer; return -7; } // Downmix channels if (channelIndex < 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) { mp_sint32 s1 = buffer[i*2]; mp_sint32 s2 = buffer[i*2+1]; smp->sample[i] = (mp_sbyte)((s1+s2)>>1); } } // take left channel else if (channelIndex == 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) smp->sample[i] = buffer[i*2]; } // take right channel else if (channelIndex == 1) { for (mp_uint32 i = 0; i < smp->samplen; i++) smp->sample[i] = buffer[i*2+1]; } else ASSERT(false); delete[] buffer; } else { smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen); if (smp->sample == NULL) return -7; theModule.loadSample(f, smp->sample, smp->samplen, smp->samplen, XModule::ST_UNSIGNED); } smp->type = 0; } else if (hdr.numBits == 16) { if (smp->sample) { theModule.freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->samplen = hdr.dataLength>>1; if (hdr.numChannels == 2) { mp_sword* buffer = new mp_sword[smp->samplen]; if (buffer == NULL) return -7; theModule.loadSample(f, buffer, hdr.dataLength, smp->samplen, XModule::ST_16BIT); smp->samplen>>=1; smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen*2); if (smp->sample == NULL) { delete[] buffer; return -7; } mp_sword* sample = (mp_sword*)smp->sample; // Downmix channels if (channelIndex < 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) { mp_sint32 s1 = buffer[i*2]; mp_sint32 s2 = buffer[i*2+1]; sample[i] = (mp_sword)((s1+s2)>>1); } } // take left channel else if (channelIndex == 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = buffer[i*2]; } // take right channel else if (channelIndex == 1) { for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = buffer[i*2+1]; } else ASSERT(false); delete[] buffer; } else { smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen*2); if (smp->sample == NULL) return -7; theModule.loadSample(f, smp->sample, hdr.dataLength, smp->samplen, XModule::ST_16BIT); } smp->type = 16; } else if (hdr.numBits == 24) { if (smp->sample) { theModule.freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->samplen = hdr.dataLength/3; if (hdr.numChannels == 2) { mp_ubyte* buffer = new mp_ubyte[smp->samplen*3]; if (buffer == NULL) return -7; f.read(buffer, 3, smp->samplen); smp->samplen>>=1; smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen*2); if (smp->sample == NULL) { delete[] buffer; return -7; } mp_sword* sample = (mp_sword*)smp->sample; // Downmix channels if (channelIndex < 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) { mp_sword s1 = ((mp_sint32)buffer[i*6+1] + (((mp_sint32)buffer[i*6+2])<<8)); mp_sword s2 = ((mp_sint32)buffer[i*6+4] + (((mp_sint32)buffer[i*6+5])<<8)); sample[i] = ((mp_sint32)s1 + (mp_sint32)s2) >> 1; } } // take left channel else if (channelIndex == 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = ((mp_sint32)buffer[i*6+1] + (((mp_sint32)buffer[i*6+2])<<8)); } // take right channel else if (channelIndex == 1) { for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = ((mp_sint32)buffer[i*6+4] + (((mp_sint32)buffer[i*6+5])<<8)); } else ASSERT(false); delete[] buffer; } else { smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen*2); if (smp->sample == NULL) return -7; mp_ubyte* buffer = new mp_ubyte[smp->samplen*3]; if (buffer == NULL) return -7; f.read(buffer, 3, smp->samplen); mp_sword* sample = (mp_sword*)smp->sample; for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = ((mp_sint32)buffer[i*3+1] + (((mp_sint32)buffer[i*3+2])<<8)); delete[] buffer; } smp->type = 16; } else if (hdr.numBits == 32) { // 32 bit DWORD sample data? if (hdr.encodingTag == 0x01) { if (smp->sample) { theModule.freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->samplen = hdr.dataLength>>2; if (hdr.numChannels == 2) { mp_sint32* buffer = new mp_sint32[smp->samplen]; if (buffer == NULL) return -7; f.readDwords((mp_dword*)buffer, smp->samplen); smp->samplen>>=1; smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen*2); if (smp->sample == NULL) { delete[] buffer; return -7; } mp_sword* sample = (mp_sword*)smp->sample; // Downmix channels if (channelIndex < 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) { mp_sint32 s1 = buffer[i*2]>>16; mp_sint32 s2 = buffer[i*2+1]>>16; sample[i] = (mp_sword)((s1+s2)>>1); } } // take left channel else if (channelIndex == 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = buffer[i*2]>>16; } // take right channel else if (channelIndex == 1) { for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = buffer[i*2+1]>>16; } else ASSERT(false); delete[] buffer; } else { smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen*2); if (smp->sample == NULL) return -7; mp_sint32* buffer = new mp_sint32[smp->samplen]; if (buffer == NULL) return -7; f.readDwords((mp_dword*)buffer, smp->samplen); mp_sword* sample = (mp_sword*)smp->sample; for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = buffer[i]>>16; delete[] buffer; } } else if (hdr.encodingTag == 0x03) { if (smp->sample) { theModule.freeSampleMem((mp_ubyte*)smp->sample); smp->sample = NULL; } smp->samplen = hdr.dataLength>>2; if (hdr.numChannels == 2) { float* buffer = new float[smp->samplen]; if (buffer == NULL) return -7; f.readDwords(reinterpret_cast(buffer), smp->samplen); smp->samplen>>=1; smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen*2); if (smp->sample == NULL) { delete[] buffer; return -7; } mp_sword* sample = (mp_sword*)smp->sample; // Downmix channels if (channelIndex < 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) { mp_sint32 s1 = (mp_sint32)(buffer[i*2]*32767.0f); mp_sint32 s2 = (mp_sint32)(buffer[i*2+1]*32767.0f); sample[i] = (mp_sword)((s1+s2)>>1); } } // take left channel else if (channelIndex == 0) { for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = (mp_sint32)(buffer[i*2]*32767.0f); } // take right channel else if (channelIndex == 1) { for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = (mp_sint32)(buffer[i*2+1]*32767.0f); } else ASSERT(false); delete[] buffer; } else { smp->sample = (mp_sbyte*)theModule.allocSampleMem(smp->samplen*2); if (smp->sample == NULL) return -7; float* buffer = new float[smp->samplen]; if (buffer == NULL) return -7; f.readDwords(reinterpret_cast(buffer), smp->samplen); mp_sword* sample = (mp_sword*)smp->sample; for (mp_uint32 i = 0; i < smp->samplen; i++) sample[i] = (mp_sint32)(buffer[i]*32767.0f); delete[] buffer; } } smp->type = 16; } smp->loopstart = 0; smp->looplen = 0; nameToSample(preferredDefaultName, smp); XModule::convertc4spd(hdr.sampleRate, &smp->finetune, &smp->relnote); smp->vol = 255; smp->pan = 0x80; smp->flags = 3; } return 0; } mp_sint32 SampleLoaderWAV::parseSMPLChunk(XMFile& f, TWAVHeader& hdr, TSamplerChunk& samplerChunk, TSampleLoop& sampleLoop) { mp_dword pos = (unsigned)f.pos() + (unsigned)hdr.dataLength; f.readDwords((mp_dword*)&samplerChunk, sizeof(TSamplerChunk) / sizeof(mp_dword)); if (samplerChunk.cSampleLoops) { f.readDwords((mp_dword*)&sampleLoop, sizeof(TSampleLoop) / sizeof(mp_dword)); } f.seek(pos); return 0; } mp_sint32 SampleLoaderWAV::getNumChannels() { XMFile f(theFileName); TWAVHeader hdr; f.read(hdr.RIFF, 1, 4); if (memcmp(hdr.RIFF, "RIFF", 4)) return 0; hdr.length = f.readDword(); f.read(hdr.WAVE, 1, 4); if (memcmp(hdr.WAVE, "WAVE", 4)) return 0; hdr.numChannels = 0; do { f.read(hdr.FMT, 1, 4); hdr.fmtDataLength = f.readDword(); // found a "fmt " chunk? if (memcmp(hdr.FMT, "fmt ", 4) == 0) { mp_sint32 res = parseFMTChunk(f, hdr); if (res < 0) return 0; break; } else { mp_dword pos = (unsigned)f.pos() + (unsigned)hdr.fmtDataLength; if (pos >= f.size()) break; f.seek(pos); } } while (f.pos() < f.size()); return hdr.numChannels; } const char* SampleLoaderWAV::getChannelName(mp_sint32 channelIndex) { if (channelIndex < 2) return channelNames[channelIndex]; else return SampleLoaderAbstract::getChannelName(channelIndex); } mp_sint32 SampleLoaderWAV::loadSample(mp_sint32 index, mp_sint32 channelIndex) { XMFile f(theFileName); TWAVHeader hdr; f.read(hdr.RIFF, 1, 4); if (memcmp(hdr.RIFF, "RIFF", 4)) return -8; hdr.length = f.readDword(); f.read(hdr.WAVE, 1, 4); if (memcmp(hdr.WAVE, "WAVE", 4)) return -8; // Start looking for "fmt " chunk hdr.numChannels = 0; do { f.read(hdr.FMT, 1, 4); hdr.fmtDataLength = f.readDword(); // found a "fmt " chunk? if (memcmp(hdr.FMT, "fmt ", 4) == 0) { mp_sint32 res = parseFMTChunk(f, hdr); if (res < 0) return res; break; } else { mp_dword pos = (unsigned)f.pos() + (unsigned)hdr.fmtDataLength; if (pos >= f.size()) break; f.seek(pos); } } while (f.pos() < f.size()); // check if we found a "fmt " chunk, otherwise the number of channels will be 0 if (hdr.numChannels == 0) return -8; // process remaining chunks TSamplerChunk samplerChunk; TSampleLoop sampleLoop; bool hasSamplerChunk = false; bool hasData = false; do { mp_sint32 res = f.read(hdr.DATA, 1, 4); if (res < 4) break; hdr.dataLength = f.readDword(); if (memcmp(hdr.DATA, "data", 4) == 0) { mp_sint32 res = parseDATAChunk(f, hdr, index, channelIndex); if (res < 0) return res; hasData = true; } else if (memcmp(hdr.DATA, "smpl", 4) == 0) { mp_sint32 res = parseSMPLChunk(f, hdr, samplerChunk, sampleLoop); if (res == 0) hasSamplerChunk = true; } else { mp_sint32 pos = f.pos() + hdr.dataLength; if (pos >= (signed)f.size()) break; f.seek(pos); } } while (f.pos() < f.size()); if (!hasData) return -8; if (hasSamplerChunk && samplerChunk.cSampleLoops) { TXMSample* smp = &theModule.smp[index]; mp_dword start = sampleLoop.dwStart/* / (hdr.numBits*hdr.numChannels / 8)*/; mp_dword end = sampleLoop.dwEnd/* / (hdr.numBits*hdr.numChannels / 8)*/; if (end > smp->samplen) end = smp->samplen; if (start < end && end <= smp->samplen) { smp->loopstart = start; smp->looplen = end - start; switch (sampleLoop.dwType) { case 0: smp->type|=1; break; case 1: smp->type|=2; break; } } } return 0; } mp_sint32 SampleLoaderWAV::saveSample(const SYSCHAR* fileName, mp_sint32 index) { TXMSample* smp = &theModule.smp[index]; XMFile f(fileName, true); TWAVHeader hdr; TSamplerChunk samplerChunk; TSampleLoop sampleLoop; bool hasLoop = (smp->type & 3) != 0; // build wav header memcpy(hdr.RIFF, "RIFF", 4); hdr.length = 44 + ((smp->type&16) ? smp->samplen*2 : smp->samplen) - 8 + (hasLoop ? (sizeof(TSamplerChunk) + sizeof(TSampleLoop) + 8) : 0); memcpy(hdr.WAVE, "WAVE", 4); memcpy(hdr.FMT, "fmt ", 4); hdr.fmtDataLength = 16; hdr.encodingTag = 1; hdr.numChannels = 1; hdr.sampleRate = XModule::getc4spd(smp->relnote,smp->finetune); hdr.numBits = ((smp->type&16) ? 16 : 8); hdr.blockAlign = (1*hdr.numBits) / 8; hdr.bytesPerSecond = hdr.sampleRate*hdr.blockAlign; f.write(hdr.RIFF, 1, 4); f.writeDword(hdr.length); f.write(hdr.WAVE, 1, 4); f.write(hdr.FMT, 1, 4); f.writeDword(hdr.fmtDataLength); f.writeWord(hdr.encodingTag); f.writeWord(hdr.numChannels); f.writeDword(hdr.sampleRate); f.writeDword(hdr.bytesPerSecond); f.writeWord(hdr.blockAlign); f.writeWord(hdr.numBits); if (hasLoop) { memcpy(hdr.DATA, "smpl", 4); hdr.dataLength = sizeof(TSamplerChunk) + sizeof(TSampleLoop); f.write(hdr.DATA, 1, 4); f.writeDword(hdr.dataLength); samplerChunk.cSampleLoops = 1; samplerChunk.dwSamplePeriod = (mp_dword)(1000.0*1000.0*1000.0 / hdr.sampleRate); sampleLoop.dwType = ((smp->type & 3) == 2 ? 1 : 0); sampleLoop.dwStart = smp->loopstart; sampleLoop.dwEnd = smp->loopstart + smp->looplen; f.writeDwords((mp_dword*)&samplerChunk, sizeof(samplerChunk) / sizeof(mp_dword)); f.writeDwords((mp_dword*)&sampleLoop, sizeof(sampleLoop) / sizeof(mp_dword)); } memcpy(hdr.DATA, "data", 4); hdr.dataLength = (smp->samplen*hdr.numBits)/8; f.write(hdr.DATA, 1, 4); f.writeDword(hdr.dataLength); if (smp->type & 16) { for (mp_uint32 i = 0; i < smp->samplen; i++) f.writeWord(smp->getSampleValue(i)); } else { // WAV 8 bit is unsigned mp_ubyte* dstPtr = new mp_ubyte[smp->samplen]; mp_ubyte* dst = dstPtr; for (mp_uint32 i = 0; i < smp->samplen; i++) *dstPtr++ = ((mp_sbyte)smp->getSampleValue(i))^127; f.write(dst, 1, smp->samplen); delete[] dst; } return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/Loader669.cpp0000644000175000017500000001662411163403715021416 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * Loader669.cpp * MilkyPlay Module Loader: 669 * * Warning: This is an one-by-one conversion of an assembler version ;) * * -------------------------------- * Version History: * -------------------------------- * 01/24/05: 669 loader is now handled by the FAR replayer * */ #include "Loaders.h" const char* Loader669::identifyModule(const mp_ubyte* buffer) { mp_sint32 i; // check for .669 module if (!memcmp(buffer,"if",2) || !memcmp(buffer,"JN",2)) { // NOS if ((mp_ubyte)buffer[0x6e] > 64) return NULL; // NOP if ((mp_ubyte)buffer[0x6f] > 128) return NULL; if ((mp_ubyte)buffer[0x70] > 127) return NULL; for (i = 0; i < 0x80; i++) { if ((mp_ubyte)buffer[0x71 + i] > 128 && (mp_ubyte)buffer[0x71 + i] != 255) return NULL; if ((mp_ubyte)buffer[0xf1 + i] > 32) return NULL; if ((mp_ubyte)buffer[0x171 + i] > 63) return NULL; } return "669"; } return NULL; } mp_sint32 Loader669::load(XMFileBase& f, XModule* module) { mp_ubyte buffer[2048]; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(buffer,1,0x1f1); memcpy(header->sig, buffer, 2); memcpy(header->name, buffer+2, 30); mp_sint32 i; for (i = 0; i < 256; i++) { if (buffer[i + 0x71] == 0xFF) break; header->ord[i] = buffer[i + 0x71]; } header->ordnum = i; // song message char* unpackedSongMessage = reinterpret_cast(buffer+2); mp_sint32 size = 108; // song message isn't null terminated for (i = 0; i < size; i++) if (unpackedSongMessage[i] == '\0') unpackedSongMessage[i] = ' '; for (i = 0; i < size; i++) { char line[40]; memset(line, 0, sizeof(line)); if (size - i >= 35) { XModule::convertStr(line, unpackedSongMessage+i, 36, false); i+=35; } else { XModule::convertStr(line, unpackedSongMessage+i, size-i, false); i+=size-i; } module->addSongMessageLine(line); } #ifdef VERBOSE printf("%s\n",module->message); #endif header->restart = LittleEndian::GET_WORD(buffer + 0x70); header->insnum = buffer[0x6e]; // number of instruments header->patnum = buffer[0x6f]; // number of patterns header->speed = 80; // default tickspeed header->tempo = 4; // default tempo header->mainvol = 255; header->channum = 9; // add one more channel for speed settings header->freqtab = 1; mp_uint32 s = 0; for (i = 0; i < header->insnum; i++) { f.read(buffer + 0x1f1,1,25); memcpy(instr[i].name, buffer + 0x1f1, 12); if (LittleEndian::GET_DWORD(buffer + 13 + 0x1f1) != 0) { mp_uint32 size = LittleEndian::GET_DWORD(buffer + 13 + 0x1f1); mp_uint32 loopstart = LittleEndian::GET_DWORD(buffer + 17 + 0x1f1); mp_uint32 loopend = LittleEndian::GET_DWORD(buffer + 21 + 0x1f1); if (size > 0) { instr[i].samp = 1; for (mp_sint32 j = 0; j < 120; j++) instr[i].snum[j] = s; smp[s].samplen = size; smp[s].flags = 0; smp[s].finetune = 0; if (loopend != 1048575 && loopend <= size) { smp[s].loopstart = loopstart; smp[s].looplen = loopend - loopstart; smp[s].type = 1; } s++; } } } header->smpnum = s; for (i = 0; i < header->patnum;i++) { f.read(buffer + 0x1f1, 1, 0x600); phead[i].rows = buffer[0x171 + i] + 1; #ifdef VERBOSE printf("%i\n",phead[i].rows); #endif phead[i].effnum = 2; phead[i].channum = (mp_ubyte)header->channum; phead[i].patternData = new mp_ubyte[phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)]; // out of memory? if (phead[i].patternData == NULL) { return -7; } memset(phead[i].patternData,0,phead[i].rows*header->channum * (phead[i].effnum * 2 + 2)); mp_sint32 r,c,cnt = 0x1f1; mp_sint32 offs = 0; for (r=0;r < phead[i].rows; r++) { // add speed into first channel if (r == 0 && buffer[i+0xf1]) { phead[i].patternData[offs+4] = 0x70; phead[i].patternData[offs+5] = 0xF0 + (buffer[i+0xf1]&0xF); } offs+=(phead[i].effnum * 2 + 2); for (c=1;c < header->channum;c++) { mp_ubyte note = (buffer[cnt] >> 2) + 25; mp_ubyte ins = ((((buffer[cnt]&3)<<4) + (buffer[cnt+1] >> 4))) + 1; mp_sint32 vol = (((mp_sint32)buffer[cnt+1] & 0xf) + 1) * 16; if (vol >= 256) vol = 255; mp_ubyte eff1 = 0xC; mp_ubyte op1 = vol; if (buffer[cnt+2] != 0xff) { mp_ubyte eff2 = buffer[cnt+2] >> 4; mp_ubyte op2 = buffer[cnt+2] & 0xf; switch (eff2) { case 0x00: eff2 = 0x70; op2 |= 0x10; #ifdef VERBOSE printf("porta up\n"); #endif break; case 0x01: eff2 = 0x70; op2 |= 0x20; #ifdef VERBOSE printf("porta down\n"); #endif break; case 0x02: eff2 = 0x70; op2 |= 0x30; break; case 0x04: eff2 = 0x70; op2 |= 0x40; break; case 0x05: eff2 = 0x70; op2 |= 0xF0; break; default: #ifdef VERBOSE printf("%i, %i\n",eff2, op2); #endif eff2 = op2 = 0; } phead[i].patternData[offs+4]=eff2; phead[i].patternData[offs+5]=op2; } if (buffer[cnt] == 0xfe) { note = ins = 0; } else if (buffer[cnt] == 0xff) { note = ins = eff1 = op1 = 0; } phead[i].patternData[offs]=note; phead[i].patternData[offs+1]=ins; phead[i].patternData[offs+2]=eff1; phead[i].patternData[offs+3]=op1; offs+=(phead[i].effnum * 2 + 2); cnt+=3; } } } if (module->loadModuleSamples(f, XModule::ST_UNSIGNED) != 0) return -7; strcpy(header->tracker,"Composer669"); module->setDefaultPanning(); module->postProcessSamples(true); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/MasterMixer.h0000644000175000017500000001162411163403715021643 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * MasterMixer.h * MilkyPlay * * Created by Peter Barth on 14.12.07. * */ #ifndef __MASTERMIXER_H__ #define __MASTERMIXER_H__ #include "Mixable.h" class MasterMixer { public: enum MasterMixerNotifications { MasterMixerNotificationBufferSizeChanged, MasterMixerNotificationSampleRateChanged }; class MasterMixerNotificationListener { public: virtual ~MasterMixerNotificationListener() { } virtual void masterMixerNotification(MasterMixerNotifications notification) = 0; }; MasterMixer(mp_uint32 sampleRate, mp_uint32 bufferSize = 0, mp_uint32 numDevices = 1, class AudioDriverInterface* audioDriver = 0); virtual ~MasterMixer(); void setMasterMixerNotificationListener(MasterMixerNotificationListener* listener); mp_sint32 openAudioDevice(); mp_sint32 closeAudioDevice(); mp_sint32 start(); mp_sint32 stop(); mp_sint32 pause(); mp_sint32 resume(); bool isPlaying() const { return started; } bool isPaused() const { return paused; } bool isInitialized() const { return initialized; } bool isActive() const { return started && !paused; } mp_sint32 setBufferSize(mp_uint32 bufferSize); mp_uint32 getBufferSize() const { return bufferSize; } mp_sint32 setSampleRate(mp_uint32 sampleRate); mp_uint32 getSampleRate() const { return sampleRate; } bool addDevice(Mixable* device, bool paused = false); bool removeDevice(Mixable* device, bool blocking = true); bool isDeviceRemoved(Mixable* device); bool pauseDevice(Mixable* device, bool blocking = true); bool resumeDevice(Mixable* device); bool isDevicePaused(Mixable* device); void mixerHandler(mp_sword* buffer); // allows to control the loudness of the resulting output stream // by bit-shifting the output *right* (dividing by 2^shift) void setSampleShift(mp_sint32 shift) { sampleShift = shift; } mp_uint32 getSampleShift() const { return sampleShift; } // disable mixing... you don't need to understand this void setDisableMixing(bool disableMixing) { this->disableMixing = disableMixing; } void setFilterHook(Mixable* filterHook) { this->filterHook = filterHook; } Mixable* getFilterHook(Mixable* filterHook) const { return filterHook; } // some legacy functions used by milkytracker const class AudioDriverInterface* getAudioDriver() const { return audioDriver; } const char* getCurrentAudioDriverName() const; bool setCurrentAudioDriverByName(const char* name); const class AudioDriverManager* getAudioDriverManager() const; mp_sint32 getCurrentSample(mp_sint32 position, mp_sint32 channel); mp_sint32 getCurrentSamplePeak(mp_sint32 position, mp_sint32 channel); private: MasterMixerNotificationListener* listener; mp_uint32 sampleRate; mp_uint32 bufferSize; mp_sint32* buffer; mp_uint32 sampleShift; bool disableMixing; mp_uint32 numDevices; Mixable* filterHook; struct DeviceDescriptor { Mixable* mixable; bool markedForRemoval; bool markedForPause; bool paused; DeviceDescriptor() : mixable(0), markedForRemoval(false), markedForPause(false), paused(false) { } }; DeviceDescriptor* devices; mutable class AudioDriverManager* audioDriverManager; AudioDriverInterface* audioDriver; bool initialized; bool started; bool paused; void notifyListener(MasterMixerNotifications notification); void cleanup(); inline void prepareBuffer(); inline void swapOutBuffer(mp_sword* bufferOut); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/MilkyPlayCommon.h0000644000175000017500000000570011163403715022465 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * MilkyPlayCommon.h * MilkyPlay * * Created by Peter Barth on 23.12.04. * */ #ifndef __MILKYPLAYCOMMON_H__ #define __MILKYPLAYCOMMON_H__ #include "MilkyPlayTypes.h" #if defined WIN32 && !defined _WIN32_WCE #include #define ASSERT assert #endif #if defined WIN32 || defined _WIN32_WCE #include #elif defined __PSP__ #include #define ASSERT assert #include #include #include #include #include #else #include #define ASSERT assert #include #include #include #include #include #endif #if defined WIN32 || defined _WIN32_WCE typedef TCHAR SYSCHAR; typedef HANDLE FHANDLE; #ifdef __GNUWIN32__ typedef long long mp_int64; #else typedef __int64 mp_int64; #endif #else typedef long long mp_int64; typedef char SYSCHAR; typedef FILE* FHANDLE; #endif #ifdef MILKYTRACKER #define MP_MAXSAMPLES 256*16 #else #define MP_MAXSAMPLES 256 #endif #define MP_NUMEFFECTS 4 #if defined(WIN32) || defined(_WIN32_WCE) && !defined(__FORCE_SDL_AUDIO__) #define DRIVER_WIN32 #elif defined(__APPLE__) && !defined(__FORCE_SDL_AUDIO__) #define DRIVER_OSX #elif defined(__MILKYPLAY_UNIX__) && !defined(__FORCE_SDL_AUDIO__) #define DRIVER_UNIX #elif defined(__PSP__) && !defined(__FORCE_SDL_AUDIO__) #define DRIVER_PSP #else #define DRIVER_SDL #endif #endif milkytracker-0.90.85+dfsg/src/milkyplay/PlayerFAR.h0000644000175000017500000000643111163403715021170 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * PlayerFAR.h * MilkyPlay core * * Created by Peter Barth on Thu Jan 20 2005. * */ #ifndef __PLAYERFAR_H__ #define __PLAYERFAR_H__ #include "PlayerBase.h" class PlayerFAR : public PlayerBase { private: static mp_uword Freqs[]; static mp_uword VolTab[]; static mp_sint32 SinTable[16][128]; static mp_sint32 mTempo[16]; // from TRAK.C mp_uword OverFlow,OCount,PlayOrder; mp_sint32 PitchWheel[16],DestPitch[16],Increment[16],PresPitch[16]; mp_sint32 VolWheel[16],DestVol[16],VIncrement[16],PresVol[16]; mp_sint32 RetLeft[16],RetSpc[16],CurSpc[16],RetSmp[16],RetVol[16]; mp_sint32 OfftCnt[16],RetCnt[16]; mp_sint32 VibOn[16]; mp_sint32 VibPtr[16],VibInc[16]; mp_sint32 CurVols[16]; mp_ubyte CurBalance[16]; mp_sint32 CurFreqs[16]; mp_sint32 CurNote[16]; mp_sint32 CurEff[16]; mp_sint32 VibAmp; mp_ubyte TempoType; mp_sint32 PlayTempo,TempoBend,CurVoice,CurPattern; mp_sint32 CurChSmp[16]; mp_ubyte GrabBuf[64]; private: void CalcTempo(); void UpdateTempo(mp_sint32 tps); void SetFreq(mp_sint32 chn, mp_sint32 freq); void SetVolume(mp_sint32 chn, mp_sint32 vol); void SetBalance(mp_sint32 chn, mp_ubyte balance); protected: virtual void clearEffectMemory(); public: PlayerFAR(mp_uint32 frequency); virtual ~PlayerFAR(); virtual PlayerTypes getType() const { return PlayerType_FAR; } // virtual from mixer class, perform playing here virtual void timerHandler(mp_sint32 currentBeatPacket); virtual void restart(mp_uint32 startPosition = 0, mp_uint32 startRow = 0, bool resetMixer = true, const mp_ubyte* customPanningTable = NULL, bool playOneRowOnly = false); virtual bool grabChannelInfo(mp_sint32 chn, TPlayerChannelInfo& channelInfo) const; }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/AudioDriverBase.h0000644000175000017500000001414711163403715022416 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * AudioDriverBase.h * MilkyPlay * * Created by Peter Barth on Fri Feb 25 2005. * */ #ifndef __AUDIODRIVERBASE_H__ #define __AUDIODRIVERBASE_H__ #include "MilkyPlayTypes.h" // WAV Header & mixing buffer info #define MP_NUMCHANNELS 2 #define MP_NUMBITS 16 #define MP_NUMBYTES (NUMBITS>>3) class MasterMixer; class AudioDriverInterface { public: virtual ~AudioDriverInterface() { } // init device, hook resources virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) = 0; virtual mp_uint32 getMixFrequency() const = 0; // close device, unhook resources virtual mp_sint32 closeDevice() = 0; // start device virtual mp_sint32 start() = 0; // stop device virtual mp_sint32 stop() = 0; // pause the device: // this is actually a little bit awkward, because it was meant to // be an interface for waveOutPause (win32) which immediately pauses the // device no matter how large the buffer size is whereas stop waits // until all pending buffers have been played which is not suitable for // a client player application. // You *should* implement this anyway, just set a flag and don't // output any audio when the flag is set or something virtual mp_sint32 pause() = 0; // resume the device from paused state virtual mp_sint32 resume() = 0; // if the device supports query of how many samples are played since // start has been called, return number of samples here virtual mp_uint32 getNumPlayedSamples() const = 0; // returns the position within the buffer virtual mp_uint32 getBufferPos() const = 0; // if the device supports query of how many samples are played since // start has been called, return true here virtual bool supportsTimeQuery() = 0; // should be kinda unique virtual const char* getDriverID() = 0; // required by wav/null drivers, ignore if you're not writing a wav writer virtual void advance() = 0; // return preferred sample rate here virtual mp_sint32 getPreferredSampleRate() const = 0; // should return preferred buffer size for preferred sample rate (see above) virtual mp_sint32 getPreferredBufferSize() const = 0; virtual void msleep(mp_uint32 msecs) = 0; virtual bool isMixerActive() = 0; virtual void setIdle(bool idle) = 0; }; // ------------------------------------------------------------------------- // Important note: On construction an AudioDriver instance should not // hook any real resources, so it should be possible to instantiate // different audio driver implementations on the same plattform // accessing the same audio device without interfering each other. // ------------------------------------------------------------------------- // all critical functions are supposed to return win32 waveOut legacy API // error codes which are: // 0 = no error // -1 = no free device // -2 = can't get device ID // -3 = can't get device capabilities // -4 = device can't handle requested format // -5 = can't close device // -6 = can't open device // -7 = out of memory // -8 = unknown error // ------------------------------------------------------------------------- class AudioDriverBase : public AudioDriverInterface { protected: MasterMixer* mixer; mp_sint32 bufferSize; mp_uint32 mixFrequency; bool mono; bool idle; bool markedAsIdle; public: AudioDriverBase() : mixer(0), bufferSize(0), mixFrequency(1), mono(false), idle(false), markedAsIdle(false) { } virtual ~AudioDriverBase() {} // init device, hook resources virtual mp_sint32 initDevice(mp_sint32 bufferSizeInWords, mp_uint32 mixFrequency, MasterMixer* mixer) { this->mixer = mixer; bufferSize = bufferSizeInWords; this->mixFrequency = mixFrequency; return 0; } mp_uint32 getMixFrequency() const { return mixFrequency; } // if the device supports query of how many samples are played since // start has been called, return number of samples here virtual mp_uint32 getNumPlayedSamples() const { return 0; } // returns the position within the buffer virtual mp_uint32 getBufferPos() const { return 0; } // if the device supports query of how many samples are played since // start has been called, return true here virtual bool supportsTimeQuery() { return false; } // required by wav/null drivers, ignore if you're not writing a wav writer virtual void advance() { } // return preferred sample rate here virtual mp_sint32 getPreferredSampleRate() const { return 48000; } virtual void msleep(mp_uint32 msecs); virtual bool isMixerActive(); virtual void setIdle(bool idle); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/SampleLoaderALL.h0000644000175000017500000000415411163403715022304 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * SampleLoaderALL.h * MilkyPlay * * Created by Peter Barth on 14.09.05. * */ #ifndef SAMPLELOADERALL__H #define SAMPLELOADERALL__H #include "SampleLoaderAbstract.h" class SampleLoaderALL : public SampleLoaderAbstract { private: static const char* channelNames[]; public: SampleLoaderALL(const SYSCHAR* fileName, XModule& theModule); virtual bool identifySample(); virtual mp_sint32 getNumChannels(); virtual mp_sint32 loadSample(mp_sint32 index, mp_sint32 channelIndex); virtual mp_sint32 saveSample(const SYSCHAR* fileName, mp_sint32); }; #endif milkytracker-0.90.85+dfsg/src/milkyplay/LoaderPTM.cpp0000644000175000017500000002322411163403715021524 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * LoaderPTM.cpp * MilkyPlay Module Loader: PolyTracker */ #include "Loaders.h" const char* LoaderPTM::identifyModule(const mp_ubyte* buffer) { // check for .PTM module if (!memcmp(buffer+44,"PTMF",4)) { return "PTM"; } // this is not an .PTM return NULL; } static mp_sint32 convertPTMPattern(TXMPattern* XMPattern, const mp_ubyte* srcPattern, mp_uint32 maxChannels, mp_sint32 patCnt) { XMPattern->channum = maxChannels; XMPattern->effnum = 2; XMPattern->rows = 64; XMPattern->patternData = new mp_ubyte[maxChannels*6*64]; if (XMPattern->patternData == NULL) { return -1; } memset(XMPattern->patternData,0,maxChannels*6*64); mp_ubyte* dstSlot = XMPattern->patternData; for (mp_sint32 row = 0; row < 64; row++) for (mp_uint32 c = 0; c < maxChannels; c++) { const mp_ubyte* srcSlot = srcPattern+row*32*5+c*5; dstSlot[0] = (srcSlot[0]==254 ? (mp_ubyte)XModule::NOTE_CUT : srcSlot[0]); dstSlot[1] = srcSlot[1]; if (srcSlot[2]<=64) { dstSlot[2] = 0xC; dstSlot[3] = XModule::vol64to255(srcSlot[2]); } mp_ubyte eff = srcSlot[3]; mp_ubyte op = srcSlot[4]; mp_ubyte nEff = 0; mp_ubyte nOp = 0; switch (eff) { // arpeggio case 0x00: if (op) { nEff = 0x20; nOp = op; } break; // porta up case 0x01: nEff = 0x47; nOp = op; break; // porta down case 0x02: nEff = 0x48; nOp = op; break; // tone porta case 0x03: nEff = 0x03; nOp = op; break; // vibrato case 0x04: nEff = 0x04; nOp = op; break; // tone porta & volslide case 0x05: nEff = 0x05; nOp = op; break; // vibrato & volslide case 0x06: nEff = 0x06; nOp = op; break; // tremolo case 0x07: nEff = 0x07; nOp = op; break; // set sample offset case 0x09: nEff = 0x09; nOp = op; break; // volume slide case 0x0A: nEff = 0x49; nOp = op; break; // Jump to order case 0x0B: nEff = 0x0B; nOp = op; break; // Jump to order case 0x0C: nEff = 0x0C; nOp = XModule::vol64to255(op); break; // Pattern break case 0x0D: nEff = 0x0D; nOp = op; break; // PT subeffects case 0x0E: nEff=(op>>4)+0x30; nOp = op&0xf; if (nEff == 0x38) { nEff = 0x08; nOp<<=4; } break; // Set speed case 0x0F: nEff = 0x0F; nOp = op; break; // set global volume case 0x10: nEff = 0x10; nOp = XModule::vol64to255(op); break; // retrig case 0x11: nEff = 0x1B; nOp = op; break; // fine vibrato case 0x12: nEff = 0x4A; nOp = op; break; default: #ifdef VERBOSE if (eff!=255) { printf("Unsupported command: %x,%x\n",eff,op); } #endif break; } dstSlot[4] = nEff; dstSlot[5] = nOp; dstSlot+=6; } return 0; } mp_sint32 LoaderPTM::load(XMFileBase& f, XModule* module) { mp_ubyte orders[256]; mp_uword patParaPtrs[129]; mp_uint32 samplePtrs[256]; module->cleanUp(); // this will make code much easier to read TXMHeader* header = &module->header; TXMInstrument* instr = module->instr; TXMSample* smp = module->smp; TXMPattern* phead = module->phead; // we're already out of memory here if (!phead || !instr || !smp) return -7; f.read(&header->name,1,28); header->whythis1a = f.readByte(); if (f.readWord() != 0x203) return -8; // can't read this one f.readByte(); // skip something header->ordnum = f.readWord(); // number of positions in order list (songlength) header->insnum = f.readWord(); // number of instruments header->smpnum = header->insnum; header->patnum = f.readWord(); // number of patterns header->channum = f.readWord(); f.readDword(); f.read(header->sig,1,4); f.readDword(); f.readDword(); f.readDword(); f.readDword(); mp_ubyte channelSettings[32]; f.read(channelSettings,1,32); header->flags = XModule::MODULE_ST3NEWINSTRUMENT; // not sure about this though header->mainvol = 255; // initial main volume header->tempo = 6; // tempo header->speed = 125; // speed f.read(orders,1,256); mp_sint32 i,j; for (i = 0; i < header->ordnum; i++) header->ord[i] = orders[i]; f.readWords(patParaPtrs,128); ////////////////////// // read instruments // ////////////////////// memset(samplePtrs,0,sizeof(mp_uint32)*header->insnum); bool bPatOffsetWorkaround = false; mp_sint32 s = 0; for (i = 0; i < header->insnum; i++) { mp_ubyte type = f.readByte(); f.read(smp[s].name,1,12); // read dos filename smp[s].vol = module->vol64to255(f.readByte()); mp_uint32 c4spd = f.readWord(); module->convertc4spd(c4spd,&smp[s].finetune,&smp[s].relnote); f.readWord(); // stupid fileoffsets samplePtrs[s] = f.readDword(); // pattern size workaround / see ptm doc for details if (samplePtrs[s] && !bPatOffsetWorkaround) { patParaPtrs[header->patnum] = samplePtrs[i]>>4; bPatOffsetWorkaround = true; } mp_sint32 correct = ((type&16)>>4)+1; smp[s].samplen = f.readDword(); smp[s].loopstart = f.readDword(); mp_sint32 looplen = ((mp_sint32)f.readDword() - correct - (mp_sint32)smp[s].loopstart); if (looplen < 0) looplen = 0; smp[s].looplen = looplen; smp[s].flags = 1; smp[s].pan = 0x80; f.readDword(); // skip gus stuff f.readDword(); f.readDword(); f.readByte(); f.readByte(); f.read(instr[i].name,1,28); // instrument name f.readDword(); // should be 0x534d5450, can also be 0 // looping if (type & 4) { if (type & 8) smp[s].type = 2; else smp[s].type = 1; } // 16 bit sample if (type & 16) { smp[s].type |= 16; smp[s].samplen >>= 1; smp[s].loopstart >>= 1; smp[s].looplen >>= 1; } if ((type & 3) && (smp[s].samplen != 0)) { instr[i].samp=1; for (j=0;j<120;j++) instr[i].snum[j] = s; s++; } } header->smpnum = s; ////////////////////// // read patterns // ////////////////////// mp_ubyte* pattern = new mp_ubyte[64*32*5]; if (pattern == NULL) { return -7; } for (i = 0; i < header->patnum; i++) { for (j = 0; j < 32*64; j++) { pattern[j*5] = 0x00; pattern[j*5+1] = 0; pattern[j*5+2] = 0xFF; pattern[j*5+3] = 0; pattern[j*5+4] = 0; } mp_uint32 patOffs = patParaPtrs[i]*16; mp_uint32 maxChannels = 1; if (patOffs) { f.seekWithBaseOffset(patOffs); mp_sint32 size = (patParaPtrs[i+1]-patParaPtrs[i])<<4; mp_ubyte* packed = new mp_ubyte[size]; if (packed == NULL) { delete[] pattern; return -7; } f.read(packed,1,size); mp_sint32 index = 0; mp_uint32 row = 0; while (indexmaxChannels) maxChannels = chn; mp_ubyte* slot = pattern+(row*32*5)+chn*5; if (pi & 32) { if (row<64) { slot[0] = packed[index++]; slot[1] = packed[index++]; } else index+=2; } if (pi & 64) { if (row<64) { slot[3] = packed[index++]; slot[4] = packed[index++]; } else index+=2; } if (pi & 128) { if (row<64) slot[2] = packed[index++]; else index++; } } maxChannels++; if (maxChannels > header->channum) maxChannels = header->channum; delete[] packed; } convertPTMPattern(&phead[i],pattern,maxChannels,i); } delete[] pattern; for (i = 0; i < header->smpnum; i++) { mp_uint32 smpOffs = samplePtrs[i]; if (smpOffs) { f.seekWithBaseOffset(smpOffs); if (module->loadModuleSample(f, i, XModule::ST_DELTA, XModule::ST_16BIT | XModule::ST_DELTA_PTM) != 0) return -7; } } strcpy(header->tracker,"Polytracker"); module->setDefaultPanning(); module->postProcessSamples(); return 0; } milkytracker-0.90.85+dfsg/src/milkyplay/ResamplerAmiga.h0000644000175000017500000001710011163403715022267 0ustar admin2admin2/* * Copyright (c) 2009, The MilkyTracker Team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* Implementation of Antti Lankila's Amiga sound model, see: * http://bel.fi/~alankila/modguide/interpolate.txt * (a copy can be found in the resources/reference/Amiga_resampler) * * TODO: filter volume changes (maybe), add dithering on the output * * Chris (Deltafire) 13/1/2008 */ // Amiiiiiiiiiiiiigaaaaaaaaa #include "computed-blep.h" template class ResamplerAmiga : public ChannelMixer::ResamplerBase { private: // Some constants enum { BLEP_SCALE = 17, MAX_BLEPS = 32, MAX_AGE = 2048, PAULA_FREQ = 3546895 }; // the structure that holds data of bleps struct blepState_t { mp_sint32 level; mp_uword age; }; const int* table; // Storage mp_sint32 numChannels; blepState_t** bleps; mp_sint32* currentLevel; mp_sint32* activeBleps; mp_sint32 paulaAdvance; void cleanUp(mp_sint32 num) { for (mp_sint32 i = 0; i < num; i++) delete[] bleps[i]; delete[] bleps; delete[] currentLevel; delete[] activeBleps; } void realloc(mp_sint32 oldNum, mp_sint32 newNum) { cleanUp(oldNum); bleps = new blepState_t*[newNum]; for (mp_sint32 i = 0; i < newNum; i++) bleps[i] = new blepState_t[MAX_BLEPS]; currentLevel = new mp_sint32[newNum]; activeBleps = new mp_sint32[newNum]; } void clearState() { memset(currentLevel, 0, numChannels*sizeof(mp_uint32)); memset(activeBleps, 0, numChannels*sizeof(mp_sint32)); for (mp_sint32 i = 0; i < numChannels; i++) memset(bleps[i], 0, MAX_BLEPS*sizeof(blepState_t)); } public: ResamplerAmiga() : numChannels(0), bleps(NULL), currentLevel(NULL), activeBleps(NULL) { } virtual ~ResamplerAmiga() { cleanUp(numChannels); } virtual void setFrequency(mp_sint32 frequency) { paulaAdvance = PAULA_FREQ / frequency; } virtual void setNumChannels(mp_sint32 num) { // one more channel for the scope dummy num++; realloc(numChannels, num); numChannels = num; clearState(); } inline mp_sint32 interpolate_amiga_8bit(const mp_sint32 sample, const mp_sint32 channel, const ChannelMixer::TMixerChannel* chn) { if(sample != currentLevel[channel]) { // We have a newborn blep! // Make room for it memmove(&bleps[channel][1], &bleps[channel][0], sizeof(blepState_t) * activeBleps[channel]); if(++activeBleps[channel] == MAX_BLEPS) { #ifndef WIN32 fprintf(stderr, "AMIGA: Blep list truncated!\n"); #endif activeBleps[channel]--; } bleps[channel][0].level = sample - currentLevel[channel]; bleps[channel][0].age = ((chn->fixedtimefrac + (chn->fixedtime & 0xffff)) * paulaAdvance) >> 16; currentLevel[channel] = sample; } mp_sint32 s = 0; // Age teh bleps! for(mp_sint32 i = 0; i < activeBleps[channel]; i++) { s -= winsinc_integral[filterTable*WINSINCSIZE+bleps[channel][i].age] * bleps[channel][i].level; if((bleps[channel][i].age += paulaAdvance) >= MAX_AGE) activeBleps[channel] = i; // It died of old age :( } s >>= (BLEP_SCALE - 8); s += sample << 8; return s; } // Due to 32-bit limitations the 16-bit resampler is less precise // PS, copy & paste is quicker than messing around with templates ;) inline mp_sint32 interpolate_amiga_16bit(const mp_sint32 sample, const mp_sint32 channel, const ChannelMixer::TMixerChannel* chn) { if(sample != currentLevel[channel]) { // We have a newborn blep! // Make room for it memmove(&bleps[channel][1], &bleps[channel][0], sizeof(blepState_t) * activeBleps[channel]); if(++activeBleps[channel] == MAX_BLEPS) { #ifndef WIN32 fprintf(stderr, "AMIGA: Blep list truncated!\n"); #endif activeBleps[channel]--; } bleps[channel][0].level = sample - currentLevel[channel]; bleps[channel][0].age = ((chn->fixedtimefrac + (chn->fixedtime & 0xffff)) * paulaAdvance) >> 16; currentLevel[channel] = sample; } mp_sint32 s = 0; // Age teh bleps! for(mp_sint32 i = 0; i < activeBleps[channel]; i++) { s -= (winsinc_integral[filterTable*WINSINCSIZE+bleps[channel][i].age]>>3) * bleps[channel][i].level; if((bleps[channel][i].age += paulaAdvance) >= MAX_AGE) activeBleps[channel] = i; // It died of old age :( } s >>= BLEP_SCALE - 3; s += sample; return s; } virtual bool isRamping() { return false; } virtual bool supportsFullChecking() { return false; } virtual bool supportsNoChecking() { return true; } inline void addBlockNoCheck(mp_sint32* buffer, ChannelMixer::TMixerChannel* chn, mp_uint32 count) { // adding some local variables, will be faster to access than attributes of chn mp_sint32 voll = chn->finalvoll; mp_sint32 volr = chn->finalvolr; mp_sint32 smppos = chn->smppos; mp_sint32 smpposfrac = chn->smpposfrac; const mp_sint32 smpadd = (chn->flags&ChannelMixer::MP_SAMPLE_BACKWARD) ? -chn->smpadd : chn->smpadd; mp_sint32 fp = smpadd*count; MP_INCREASESMPPOS(chn->smppos,chn->smpposfrac,fp,16); // when the channel index is -1 we're going to use the dummy channel const mp_sint32 channel = (chn->index == -1 ? this->numChannels - 1 : chn->index); if (chn->flags & 4) { // 16 bit const mp_sword* sample = ((const mp_sword*) chn->sample) + smppos; smppos = smpposfrac; while (count--) { mp_sint32 s = sample[smppos>>16]; s = interpolate_amiga_16bit(s, channel, chn); (*buffer++)+=(s*(voll>>15))>>15; (*buffer++)+=(s*(volr>>15))>>15; smppos+=smpadd; MP_INCREASESMPPOS(chn->fixedtime, chn->fixedtimefrac, smpadd, 16); } } else { // 8 bit const mp_sbyte* sample = &chn->sample[smppos]; smppos = smpposfrac; while (count--) { mp_sint32 s = sample[smppos>>16]; s = interpolate_amiga_8bit(s, channel, chn); // Really, the volume should be applied before the interpolation (*buffer++)+=(s*(voll>>15))>>15; (*buffer++)+=(s*(volr>>15))>>15; smppos+=smpadd; // advance time, this is necessary because it's not being done // when not being used, so we'll do it here MP_INCREASESMPPOS(chn->fixedtime, chn->fixedtimefrac, smpadd, 16); } } } }; milkytracker-0.90.85+dfsg/additional/0000755000175000017500000000000011317506145016536 5ustar admin2admin2milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/0000755000175000017500000000000011317506145022045 5ustar admin2admin2milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/PocketPC KeyConfig.ico0000644000175000017500000000206610737746457026075 0ustar admin2admin2 è&(( @€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€‡wwwwwwwwwwwwww€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ÿÿÿÿÿÿÿÿÿÿÿÿ÷€‡ˆˆˆˆˆˆˆˆˆˆˆˆˆ‡€‡wwwwwwwwwwwwww€‡DDDDDDDDD@€‡DDDDDDDDDGpwp€‡DDDDDDDDDGpwp€‡DDDDDDDDDDDDDD€‡wwwwwwwwwwwwww€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€ÿÿÿÿÿÿÿÿÿÿÿÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆ€‡ÿÿÿÿÿÿ€‡ÿÿÿÿÿÿ€‡ÿÿÿÿÿÿ€‡ÿÿÿÿÿÿ€‡ÿÿÿÿÿÿ€‡ÿÿÿÿÿÿ€‡ÿÿÿÿÿÿ€‡ˆˆˆˆˆˆ€‡DDDððð€‡DDDDDD€‡wwwwww€ˆˆˆˆˆˆˆˆÿÿÿÿmilkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/KeyConfigDlg.cpp0000644000175000017500000005544311000100706025047 0ustar admin2admin2#include #include #include #include "resource.h" #include "KeyConfigDlg.h" #include "Registry.h" #include "TrackerSettingsDatabase.h" #include "VirtualKeyToScanCodeTable.h" #include "XMFile.h" #include "PPSystem_WIN32.h" #include "Event.h" #define NUMTABS 3 #ifndef _WIN32_WCE_EMULATION short nInvalidKeys[] = {13,17,91,131,132}; #else short nInvalidKeys[] = {91,132}; #endif #define INDEXTOSTATEIMAGEMASK(i) ((i) << 12) #ifndef ListView_SetCheckState #define ListView_SetCheckState(h, i, f) \ ListView_SetItemState(h, i, INDEXTOSTATEIMAGEMASK((f) + 1), LVIS_STATEIMAGEMASK) #endif LPCTSTR szExecutable = _T("MilkyTracker.exe"); LPCTSTR szValidExtensions[] = {_T("669"),_T("Composer 669"), _T("amf"), _T("Asylum Music Format 1.0"), _T("ams"), _T("Velvet Studio / Extreme Tracker"), _T("cba"), _T("Chuck Biscuits & Black Artist"), _T("dbm"), _T("Digibooster Pro"), _T("digi"), _T("Digibooster"), _T("dsm"), _T("Digisound Interface Kit / Dynamic Studio"), _T("dtm"), _T("Digitrekker / Digital Tracker (Atari)"), _T("far"), _T("Farandole Composer"), _T("gdm"), _T("General Digimusic"), _T("gmc"), _T("Game Music Creator"), _T("imf"), _T("Imago Orpheus"), _T("it"), _T("Impulse Tracker"), _T("mdl"), _T("Digitracker 3"), _T("mod"), _T("Protracker"), _T("mtm"), _T("Multitracker"), _T("mxm"), _T("Cubic Tiny XM"), _T("okt"), _T("Oktalyzer"), _T("okta"), _T("Oktalyzer"), _T("plm"), _T("DisorderTracker 2"), _T("psm"), _T("Epic Megagames MASI"), _T("ptm"), _T("Polytracker"), _T("s3m"), _T("Screamtracker 3"), _T("stm"), _T("Screamtracker 2"), _T("ult"), _T("Ultratracker"), _T("uni"), _T("MikMod"), _T("xm"), _T("Fasttracker II"), NULL, NULL}; static BOOL bSetKey = FALSE; static HWND hWndMain = NULL; static HINSTANCE hInstance = NULL; static int NUM_KEYS; // forward declarations BOOL CALLBACK KeyDialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK OtherDialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK FileAssociationDialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static HWND g_hWndTabs[NUMTABS] = {NULL}; static DWORD g_nTabDialogIDs[NUMTABS] = {IDD_KEYDIALOG, IDD_OTHERDIALOG, IDD_FILEASSOCIATIONDIALOG}; static DLGPROC g_pDialogProcs[NUMTABS] = {KeyDialogProc, OtherDialogProc, FileAssociationDialogProc}; static TrackerSettingsDatabase* keyDatabase = NULL; struct TButtonMapping { TCHAR functionName[512]; WORD buttonCode; BYTE keyModifiers; BYTE virtualKeyCode; }; TButtonMapping mappings[256]; TButtonMapping* currentMapping; unsigned int DEFINEKEY(unsigned int vk, unsigned int modifier = 0, unsigned int buttonCode = 0xFFFF) { return (vk << 24) + (modifier << 16) + buttonCode; } void SetupKeyDatabase() { keyDatabase = new TrackerSettingsDatabase(); keyDatabase->store("KEY:Cursor up", DEFINEKEY(VK_UP)); keyDatabase->store("KEY:Cursor down", DEFINEKEY(VK_DOWN)); keyDatabase->store("KEY:Cursor left", DEFINEKEY(VK_LEFT)); keyDatabase->store("KEY:Cursor right", DEFINEKEY(VK_RIGHT)); keyDatabase->store("KEY:Delete", DEFINEKEY(VK_DELETE)); keyDatabase->store("KEY:Insert", DEFINEKEY(VK_INSERT)); keyDatabase->store("KEY:Backspace", DEFINEKEY(VK_BACK)); keyDatabase->store("KEY:Insert line", DEFINEKEY(VK_INSERT, KeyModifierSHIFT)); keyDatabase->store("KEY:Backspace line", DEFINEKEY(VK_BACK, KeyModifierSHIFT)); keyDatabase->store("KEY:Undo", DEFINEKEY('Z', KeyModifierCTRL)); keyDatabase->store("KEY:Redo", DEFINEKEY('Y', KeyModifierCTRL)); keyDatabase->store("KEY:Play song", DEFINEKEY(VK_RETURN)); keyDatabase->store("KEY:Play pattern", DEFINEKEY(VK_RETURN, KeyModifierCTRL)); keyDatabase->store("KEY:Play pattern from current position", DEFINEKEY(VK_RETURN, KeyModifierSHIFT)); keyDatabase->store("KEY:Preview row", DEFINEKEY(VK_SPACE, KeyModifierSHIFT)); keyDatabase->store("KEY:Preview song/pattern", DEFINEKEY(VK_SPACE, KeyModifierALT)); keyDatabase->store("KEY:Stop playing", DEFINEKEY(VK_ESCAPE)); keyDatabase->store("KEY:Record mode toggle", DEFINEKEY(VK_SPACE)); keyDatabase->store("ORIENTATION", 0); keyDatabase->store("ALLOWVIRTUALKEYS", 0); keyDatabase->store("HIDETASKBAR", 1); keyDatabase->store("DOUBLEPIXELS", 0); keyDatabase->store("DONTTURNOFFDEVICE", 0); if (XMFile::exists(System::getConfigFileName(_T("keys.cfg")))) { XMFile f(System::getConfigFileName(_T("keys.cfg"))); keyDatabase->serialize(f); } const PPDictionaryKey* theKey = keyDatabase->getFirstKey(); int j = 0; while (theKey) { PPString str = theKey->getKey(); char szText[512]; strcpy(szText, str); if (memcmp(szText,"KEY:",4) == 0) { for (unsigned int i = 0; i <= strlen(szText); i++) mappings[j].functionName[i] = szText[i]; unsigned int v = theKey->getIntValue(); mappings[j].buttonCode = (WORD)(v & 0xFFFF); mappings[j].keyModifiers = (BYTE)(v >> 16); mappings[j].virtualKeyCode = (BYTE)(v >> 24); j++; } theKey = keyDatabase->getNextKey(); } NUM_KEYS = j; } void ShutdownKeyDatabase() { bool isKeyboardKey = false; for (int j = 0; j < NUM_KEYS; j++) { // Check if button maps to any existing keyboard virtual key if (mappings[j].buttonCode >= 0 && mappings[j].buttonCode < 256) { if (vkeyToScancode[mappings[j].buttonCode] != -1) isKeyboardKey = true; } char szText[512]; for (unsigned int i = 0; i <= _tcslen(mappings[j].functionName); i++) szText[i] = (char)mappings[j].functionName[i]; unsigned int v = DEFINEKEY(mappings[j].virtualKeyCode, mappings[j].keyModifiers, mappings[j].buttonCode); keyDatabase->store(szText, (signed)v); } // If one of the mapped buttons is used by key on keyboard // give warning const PPDictionaryKey* theKey = keyDatabase->restore("ALLOWVIRTUALKEYS"); if (theKey && isKeyboardKey) { BOOL allowExternalKeys = theKey->getIntValue(); if (allowExternalKeys) { TCHAR szText[2048]; ::LoadString(hInstance, IDS_WARNING_BUTTONMAPPINGINTERFERENCE, szText, 2048); ::MessageBox(hWndMain, szText, _T("Warning"), MB_OK); } } XMFile f(System::getConfigFileName(_T("keys.cfg")), true); keyDatabase->serialize(f); } typedef BOOL (__stdcall *UnregisterFunc1Proc)( UINT, UINT ); void RegisterKeys(HWND hWnd) { HINSTANCE hCoreDll; UnregisterFunc1Proc procUndergisterFunc; hCoreDll = LoadLibrary(_T("coredll.dll")); ASSERT(hCoreDll); procUndergisterFunc = (UnregisterFunc1Proc)GetProcAddress( hCoreDll, _T("UnregisterFunc1")); ASSERT(procUndergisterFunc); for (int i=0x0; i<=0xc0; i++) { procUndergisterFunc(MOD_KEYUP, i); RegisterHotKey(hWnd, i, MOD_KEYUP, i); } for (i=0xc1; i<=0xff; i++) { procUndergisterFunc(MOD_WIN | MOD_KEYUP, i); RegisterHotKey(hWnd, i, MOD_WIN | MOD_KEYUP, i); } FreeLibrary(hCoreDll); } void UnregisterKeys(HWND hWnd) { for (int i=0; i<=0xff; i++) { UnregisterHotKey(hWnd, i); } } static void SetupListView(HWND hWndDlg) { HWND hWndListView = GetDlgItem(hWndDlg, IDC_LIST1); ListView_SetExtendedListViewStyle(hWndListView, ListView_GetExtendedListViewStyle(hWndListView) | LVS_EX_FULLROWSELECT); LVCOLUMN lvColumn; lvColumn.mask = LVCF_TEXT | LVCF_WIDTH; // ---- Setup columns --- lvColumn.cx = 140; lvColumn.pszText = _T("Function"); ListView_InsertColumn(hWndListView, 0, &lvColumn); lvColumn.cx = 66; lvColumn.pszText = _T("Button"); ListView_InsertColumn(hWndListView, 1, &lvColumn); } static void BuildKeyList(HWND hWndDlg) { HWND hWndListView = GetDlgItem(hWndDlg, IDC_LIST1); ListView_DeleteAllItems(hWndListView); // ---- Insert items ---- LVITEM lvItem; memset(&lvItem,0,sizeof(lvItem)); lvItem.mask = LVIF_TEXT; for (int i = 0; i < NUM_KEYS; i++) { TCHAR szKeyCode[33]; if (mappings[i].buttonCode == 65535) _tcscpy(szKeyCode, _T("(unused)")); else wsprintf(szKeyCode, _T("%i"), mappings[i].buttonCode); lvItem.iItem = i; lvItem.pszText = mappings[i].functionName+4; ListView_InsertItem(hWndListView, &lvItem); ListView_SetItemText(hWndListView, lvItem.iItem ,1, szKeyCode); } } static void UpdateKeyList(HWND hWndDlg, TButtonMapping* mapping) { HWND hWndListView = GetDlgItem(hWndDlg, IDC_LIST1); LVITEM lvItem; memset(&lvItem,0,sizeof(lvItem)); for (int i = 0; i < NUM_KEYS; i++) { if (mappings + i == mapping) { TCHAR szKeyCode[33]; if (mappings[i].buttonCode == 65535) _tcscpy(szKeyCode, _T("(unused)")); else wsprintf(szKeyCode, _T("%i"), mappings[i].buttonCode); lvItem.iItem = i; ListView_SetItemText(hWndListView, lvItem.iItem ,1, szKeyCode); } } } void SetNewKey(HWND hWndDlg, TButtonMapping* currentMapping,unsigned short nKeyCode) { if (!currentMapping) return; // look if key was already assigned for (int i = 0; i < NUM_KEYS; i++) if (mappings[i].buttonCode == nKeyCode) { mappings[i].buttonCode = -1; UpdateKeyList(hWndDlg, mappings + i); } currentMapping->buttonCode = nKeyCode; } static void UpdateKeyCodes(HWND hWndDlg, TButtonMapping* currentMapping) { SetDlgItemText(hWndDlg, IDC_KEY, currentMapping->functionName+4); if (currentMapping && currentMapping->buttonCode != 65535) { SetDlgItemInt(hWndDlg, IDC_KEYEDIT1, currentMapping->buttonCode, TRUE); } else { SetDlgItemText(hWndDlg, IDC_KEYEDIT1, _T("N/A")); } //HWND hWndButton = GetDlgItem(hWndDlg, IDC_KEYBUTTON1); } static void ShowInputTextfield(HWND hWndDlg, BOOL bShow) { HWND hWnd = GetDlgItem(hWndDlg, IDC_STATIC1); ShowWindow(hWnd, bShow ? SW_SHOW : SW_HIDE); hWnd = GetDlgItem(hWndDlg, IDC_STATIC2); ShowWindow(hWnd, bShow ? SW_SHOW : SW_HIDE); hWnd = GetDlgItem(hWndDlg, IDC_STATIC3); ShowWindow(hWnd, !bShow ? SW_SHOW : SW_HIDE); hWnd = GetDlgItem(hWndDlg, IDC_KEYEDIT1); ShowWindow(hWnd, bShow ? SW_SHOW : SW_HIDE); hWnd = GetDlgItem(hWndDlg, IDC_KEY); ShowWindow(hWnd, bShow ? SW_SHOW : SW_HIDE); } static void CheckRadioButtons(HWND hWndRadioButtons[], int numEntries, int checkIndex) { for (int i = 0; i < numEntries; i++) if (i != checkIndex) { bool checked = (::SendMessage(hWndRadioButtons[i], BM_GETCHECK, 0, 0) == BST_CHECKED); if (checked) ::SendMessage(hWndRadioButtons[i], BM_SETCHECK, BST_UNCHECKED, 0); } bool checked = (::SendMessage(hWndRadioButtons[checkIndex], BM_GETCHECK, 0, 0) == BST_CHECKED); if (!checked) ::SendMessage(hWndRadioButtons[checkIndex], BM_SETCHECK, BST_CHECKED, 0); } static void UpdateCheckboxesAndRadioButtons(HWND hWndDlg) { const PPDictionaryKey* theKey = keyDatabase->restore("ORIENTATION"); HWND hWndRadio[3]; hWndRadio[0] = GetDlgItem(hWndDlg, IDC_RADIO_ORIENTATION_90CW); hWndRadio[1] = GetDlgItem(hWndDlg, IDC_RADIO_ORIENTATION_90CCW); hWndRadio[2] = GetDlgItem(hWndDlg, IDC_RADIO_ORIENTATION_NORMAL); if (theKey && theKey->getIntValue() >= 0 && theKey->getIntValue() < 3) CheckRadioButtons(hWndRadio, 3, theKey->getIntValue()); else CheckRadioButtons(hWndRadio, 3, 0); // allow virtual keys theKey = keyDatabase->restore("ALLOWVIRTUALKEYS"); HWND hWnd = GetDlgItem(hWndDlg, IDC_CHECKALLOWVKEYS); if (theKey) SendMessage(hWnd, BM_SETCHECK, theKey->getIntValue() ? BST_CHECKED : BST_UNCHECKED, 0); else SendMessage(hWnd, BM_SETCHECK, BST_UNCHECKED, 0); // hide taskbar theKey = keyDatabase->restore("HIDETASKBAR"); hWnd = GetDlgItem(hWndDlg, IDC_CHECKHIDETASKBAR); if (theKey) SendMessage(hWnd, BM_SETCHECK, theKey->getIntValue() ? BST_CHECKED : BST_UNCHECKED, 0); else SendMessage(hWnd, BM_SETCHECK, BST_UNCHECKED, 0); // double pixels theKey = keyDatabase->restore("DOUBLEPIXELS"); hWnd = GetDlgItem(hWndDlg, IDC_CHECKDOUBLEPIXELS); if (theKey) SendMessage(hWnd, BM_SETCHECK, theKey->getIntValue() ? BST_CHECKED : BST_UNCHECKED, 0); else SendMessage(hWnd, BM_SETCHECK, BST_UNCHECKED, 0); // device turn off theKey = keyDatabase->restore("DONTTURNOFFDEVICE"); hWnd = GetDlgItem(hWndDlg, IDC_DONTTURNOFFDEVICE); if (theKey) SendMessage(hWnd, BM_SETCHECK, theKey->getIntValue() ? BST_CHECKED : BST_UNCHECKED, 0); else SendMessage(hWnd, BM_SETCHECK, BST_UNCHECKED, 0); } static BOOL CALLBACK KeyDialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { currentMapping = NULL; UpdateKeyCodes(hWndDlg, currentMapping); ShowInputTextfield(hWndDlg, FALSE); SetupListView(hWndDlg); BuildKeyList(hWndDlg); RegisterKeys(hWndDlg); return TRUE; } case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR) lParam; LV_DISPINFO *pLvdi = (LV_DISPINFO *)lParam; NM_LISTVIEW *pNm = (NM_LISTVIEW *)lParam; switch(pnmh->idFrom) { case IDC_LIST1: { switch(pLvdi->hdr.code) { case LVN_ITEMACTIVATE: { currentMapping = mappings + pNm->iItem; UpdateKeyCodes(hWndDlg, currentMapping); ShowInputTextfield(hWndDlg, TRUE); bSetKey = TRUE; /*LVITEM lvItem; memset(&lvItem,0,sizeof(lvItem)); lvItem.mask = LVIF_PARAM; lvItem.iItem = pNm->iItem; ListView_GetItem(pNm->hdr.hwndFrom,&lvItem); return 0;*/ break; } } } break; } return 0; } break; case WM_HOTKEY: { UINT nVirtKey = HIWORD(lParam); if (!bSetKey) break; BOOL invalidKey = FALSE; for (int i = 0; i < NUM_INVALID_KEYS; i++) if ((short)nVirtKey == nInvalidKeys[i]) { invalidKey = TRUE; break; } if (invalidKey) break; SetNewKey(hWndDlg, currentMapping,(short)nVirtKey); UpdateKeyList(hWndDlg, currentMapping); currentMapping = NULL; UpdateKeyCodes(hWndDlg, currentMapping); ShowInputTextfield(hWndDlg, FALSE); bSetKey = FALSE; break; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_KEYRESETALL: { for (int i = 0; i < NUM_KEYS; i++) mappings[i].buttonCode = -1; BuildKeyList(hWndDlg); break; } } break; } case WM_CLOSE: UnregisterKeys(hWndDlg); DestroyWindow(hWndDlg); return TRUE; break; case WM_CTLCOLORSTATIC: { HBRUSH hbr = (HBRUSH)DefWindowProc(hWndDlg, uMsg, wParam, lParam); HDC hdcStatic = (HDC)wParam; HWND hwndStatic = (HWND)lParam; int dlgID = GetDlgCtrlID(hwndStatic); switch (dlgID) { case IDC_KEY: SetTextColor(hdcStatic, RGB(255,0,0)); break; } return (BOOL)hbr; } } return FALSE; } static BOOL CALLBACK OtherDialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { UpdateCheckboxesAndRadioButtons(hWndDlg); return TRUE; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_RADIO_ORIENTATION_90CW: { const PPDictionaryKey* theKey = keyDatabase->restore("ORIENTATION"); if (theKey) keyDatabase->store("ORIENTATION", 0); UpdateCheckboxesAndRadioButtons(hWndDlg); break; } case IDC_RADIO_ORIENTATION_90CCW: { const PPDictionaryKey* theKey = keyDatabase->restore("ORIENTATION"); if (theKey) keyDatabase->store("ORIENTATION", 1); UpdateCheckboxesAndRadioButtons(hWndDlg); break; } case IDC_RADIO_ORIENTATION_NORMAL: { const PPDictionaryKey* theKey = keyDatabase->restore("ORIENTATION"); if (theKey) keyDatabase->store("ORIENTATION", 2); UpdateCheckboxesAndRadioButtons(hWndDlg); break; } case IDC_CHECKALLOWVKEYS: { const PPDictionaryKey* theKey = keyDatabase->restore("ALLOWVIRTUALKEYS"); if (theKey) { pp_int32 newVal = !theKey->getIntValue(); keyDatabase->store("ALLOWVIRTUALKEYS", newVal); } UpdateCheckboxesAndRadioButtons(hWndDlg); break; } case IDC_CHECKHIDETASKBAR: { const PPDictionaryKey* theKey = keyDatabase->restore("HIDETASKBAR"); if (theKey) { pp_int32 newVal = !theKey->getIntValue(); keyDatabase->store("HIDETASKBAR", newVal); } UpdateCheckboxesAndRadioButtons(hWndDlg); break; } case IDC_CHECKDOUBLEPIXELS: { const PPDictionaryKey* theKey = keyDatabase->restore("DOUBLEPIXELS"); if (theKey) { pp_int32 newVal = !theKey->getIntValue(); keyDatabase->store("DOUBLEPIXELS", newVal); } UpdateCheckboxesAndRadioButtons(hWndDlg); break; } case IDC_DONTTURNOFFDEVICE: { const PPDictionaryKey* theKey = keyDatabase->restore("DONTTURNOFFDEVICE"); if (theKey) { pp_int32 newVal = !theKey->getIntValue(); keyDatabase->store("DONTTURNOFFDEVICE", newVal); } UpdateCheckboxesAndRadioButtons(hWndDlg); break; } } break; } case WM_CLOSE: DestroyWindow(hWndDlg); return TRUE; break; } return FALSE; } static void UpdateRegistryFromListView(HWND hWndDlg) { HWND hWndListView = ::GetDlgItem(hWndDlg, IDC_LIST2); int i = 0; while (szValidExtensions[i*2] != NULL) { BOOL bState = ListView_GetCheckState(hWndListView, i); if (RegQueryFileInfo(szExecutable, hInstance, szValidExtensions[i*2]) && (!bState)) { RegUnregisterFileInfo(szExecutable, hInstance, szValidExtensions[i*2]); } else if (bState) { RegFileInfo(szExecutable, hInstance, szValidExtensions[i*2], 0); // IDI_APP } i++; } } static BOOL CALLBACK FileAssociationDialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hWndListView = GetDlgItem(hWndDlg, IDC_LIST2); switch (uMsg) { case WM_INITDIALOG: { ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_CHECKBOXES); ListView_SetExtendedListViewStyle(hWndListView, ListView_GetExtendedListViewStyle(hWndListView) | LVS_EX_FULLROWSELECT); int res; LVCOLUMN lvColumn; lvColumn.mask = LVCF_TEXT | LVCF_WIDTH; // file list view lvColumn.cx = 70; lvColumn.pszText = _T("Extension"); res = ListView_InsertColumn(hWndListView, 0, &lvColumn); lvColumn.cx = 240; lvColumn.pszText = _T("Description"); res = ListView_InsertColumn(hWndListView, 1, &lvColumn); LVITEM lvItem; memset(&lvItem,0,sizeof(lvItem)); lvItem.mask = LVIF_TEXT; int i = 0; while (szValidExtensions[i*2] != NULL) { lvItem.iItem = i; lvItem.pszText = const_cast(szValidExtensions[i*2]); res = ListView_InsertItem(hWndListView,&lvItem); ListView_SetItemText(hWndListView, lvItem.iItem ,1, const_cast(szValidExtensions[i*2+1])); ListView_SetCheckState(hWndListView, i, RegQueryFileInfo(szExecutable, hInstance, szValidExtensions[i*2])); i++; } return TRUE; } case WM_COMMAND: { if ((LOWORD(wParam) == IDC_SELECT_ALL)) { int i = 0; while (szValidExtensions[i*2] != NULL) { ListView_SetCheckState(hWndListView, i, 1); i++; } return TRUE; } else if ((LOWORD(wParam) == IDC_DESELECT_ALL)) { int i = 0; while (szValidExtensions[i*2] != NULL) { ListView_SetCheckState(hWndListView, i, 0); i++; } return TRUE; } } case WM_CLOSE: DestroyWindow(hWndDlg); return TRUE; break; } return FALSE; } static void CheckForMilkyTrackerAppExe() { TCHAR szModule[MAX_PATH]; GetFullAppPath(szExecutable, hInstance, szModule, MAX_PATH); if (!XMFile::exists(szModule)) { TCHAR szText[2048]; ::LoadString(hInstance, IDS_WARNING_MILKYTRACKERAPPEXENOTFOUND, szText, 2048); ::MessageBox(hWndMain, szText, _T("Warning"), MB_OK); } } static void ShowTab(HWND hWndDlg, int nSel) { HWND hWndTabCtrl = GetDlgItem(hWndDlg, IDC_TAB1); RECT l_rectClient, l_rectWnd; GetClientRect(hWndTabCtrl, &l_rectClient); TabCtrl_AdjustRect(hWndTabCtrl, FALSE, &l_rectClient); GetWindowRect(hWndTabCtrl, &l_rectWnd); POINT p1,p2; p1.x = l_rectWnd.left; p1.y = l_rectWnd.top; p2.x = l_rectWnd.right; p2.y = l_rectWnd.bottom; ScreenToClient(hWndDlg,&p1); ScreenToClient(hWndDlg,&p2); l_rectWnd.left = p1.x; l_rectWnd.top = p1.y; l_rectWnd.right = p2.x; l_rectWnd.bottom = p2.y; OffsetRect(&l_rectClient, l_rectWnd.left,l_rectWnd.top); int width = l_rectClient.right - l_rectClient.left; int height = l_rectClient.bottom - l_rectClient.top; SetWindowPos(g_hWndTabs[nSel], HWND_TOP, l_rectClient.left, l_rectClient.top, width, height, SWP_SHOWWINDOW); } static BOOL CALLBACK TabDialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { #ifdef _WIN32_WCE //On Rapier devices you normally create all Dialog's as fullscreen dialog's // with an OK button in the upper corner. You should get/set any program settings // during each modal dialog creation and destruction SHINITDLGINFO shidi; // Create a Done button and size it. shidi.dwMask = SHIDIM_FLAGS; shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN; shidi.hDlg = hWndDlg; //initialzes the dialog based on the dwFlags parameter SHInitDialog(&shidi); #endif // Load database SetupKeyDatabase(); // Check for MilkyTracker.exe in current path CheckForMilkyTrackerAppExe(); // tab stuff HWND hWndTabCtrl = GetDlgItem(hWndDlg, IDC_TAB1); TCITEM item; item.pszText = _T("Buttons"); item.mask = TCIF_TEXT; TabCtrl_InsertItem(hWndTabCtrl, 0, &item); item.pszText = _T("Other"); TabCtrl_InsertItem(hWndTabCtrl, 1, &item); item.pszText = _T("File associations"); TabCtrl_InsertItem(hWndTabCtrl, 2, &item); for (int i = 0; i < NUMTABS; i++) { g_hWndTabs[i] = CreateDialog(hInstance, MAKEINTRESOURCE(g_nTabDialogIDs[i]), hWndDlg, g_pDialogProcs[i]); } ShowTab(hWndDlg, 0); TabCtrl_SetCurFocus(hWndTabCtrl, 0); return TRUE; } case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR) lParam; switch (pnmh->code) { case TCN_SELCHANGE: { HWND hWndTabCtrl = GetDlgItem(hWndDlg, IDC_TAB1); int nSel = TabCtrl_GetCurSel(hWndTabCtrl); ShowTab(hWndDlg, nSel); break; } } break; } case WM_COMMAND: { if ((LOWORD(wParam) == IDOK)) { UpdateRegistryFromListView(g_hWndTabs[2]); ShutdownKeyDatabase(); SendMessage(hWndMain, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWndDlg); SendMessage (hWndMain, WM_CLOSE, 0, 0); return TRUE; } else if ((LOWORD(wParam) == IDCANCEL)) { SendMessage(hWndMain, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWndDlg); SendMessage (hWndMain, WM_CLOSE, 0, 0); return TRUE; } break; } case WM_CLOSE: DestroyWindow(hWndDlg); memset(g_hWndTabs, 0, sizeof(g_hWndTabs)); return TRUE; break; } return FALSE; } void CreateKeyDialog(HINSTANCE hInst, HWND hWnd) { hWndMain = hWnd; hInstance = hInst; HWND hWndD = CreateDialog(hInst, MAKEINTRESOURCE(IDD_TABDIALOG), hWnd, TabDialogProc); ShowWindow(hWndD, SW_SHOW); } milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/PocketPC KeyConfig.cpp0000644000175000017500000001421510737746457026104 0ustar admin2admin2// PocketPC KeyConfig.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "PocketPC KeyConfig.h" #include #include #include // -------------------- key config dlg ---------------------------------- #include "KeyConfigDlg.h" // ---------------------------------------------------------------------- #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; // The current instance HWND hwndCB; // The command bar handle static SHACTIVATEINFO s_sai; // Forward declarations of functions included in this code module: ATOM MyRegisterClass (HINSTANCE, LPTSTR); BOOL InitInstance (HINSTANCE, int); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM); HWND CreateRpCommandBar(HWND); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; HACCEL hAccelTable; // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_POCKETPCKEYCONFIG); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } // // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // // COMMENTS: // // It is important to call this function so that the application // will get 'well formed' small icons associated with it. // ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_POCKETPCKEYCONFIG)); wc.hCursor = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = 0; wc.lpszClassName = szWindowClass; return RegisterClass(&wc); } // // FUNCTION: InitInstance(HANDLE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd = NULL; TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // The window class name hInst = hInstance; // Store instance handle in our global variable // Initialize global strings LoadString(hInstance, IDC_POCKETPCKEYCONFIG, szWindowClass, MAX_LOADSTRING); LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); //If it is already running, then focus on the window hWnd = FindWindow(szWindowClass, szTitle); if (hWnd) { SetForegroundWindow ((HWND) (((DWORD)hWnd) | 0x01)); return 0; } MyRegisterClass(hInstance, szWindowClass); RECT rect; GetClientRect(hWnd, &rect); hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } //When the main window is created using CW_USEDEFAULT the height of the menubar (if one // is created is not taken into account). So we resize the window after creating it // if a menubar is present { RECT rc; GetWindowRect(hWnd, &rc); rc.bottom -= MENU_HEIGHT; if (hwndCB) MoveWindow(hWnd, rc.left, rc.top, rc.right, rc.bottom, FALSE); } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; int wmId, wmEvent; PAINTSTRUCT ps; TCHAR szHello[MAX_LOADSTRING]; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_HELP_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_FILE_EXIT: case IDOK: SendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWnd); SendMessage (hWnd, WM_CLOSE, 0, 0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_CREATE: hwndCB = CreateRpCommandBar(hWnd); // ------------------ create key settings dialog ----- CreateKeyDialog(hInst, hWnd); // --------------------------------------------------- break; case WM_PAINT: RECT rt; hdc = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rt); LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); DrawText(hdc, szHello, _tcslen(szHello), &rt, DT_SINGLELINE | DT_VCENTER | DT_CENTER); EndPaint(hWnd, &ps); break; case WM_DESTROY: CommandBar_Destroy(hwndCB); PostQuitMessage(0); break; case WM_SETTINGCHANGE: SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } HWND CreateRpCommandBar(HWND hwnd) { SHMENUBARINFO mbi; memset(&mbi, 0, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = hwnd; mbi.nToolBarId = IDM_MENU; mbi.hInstRes = hInst; mbi.nBmpId = 0; mbi.cBmpImages = 0; if (!SHCreateMenuBar(&mbi)) return NULL; return mbi.hwndMB; } // Mesage handler for the About box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { SHINITDLGINFO shidi; switch (message) { case WM_INITDIALOG: // Create a Done button and size it. shidi.dwMask = SHIDIM_FLAGS; shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN; shidi.hDlg = hDlg; SHInitDialog(&shidi); return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; } milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/KeyConfigDlg.h0000644000175000017500000000051010737746457024540 0ustar admin2admin2#ifndef KEYCONFIGDLG__H #define KEYCONFIGDLG__H #ifndef _WIN32_WCE_EMULATION #define NUM_INVALID_KEYS 5 extern short nInvalidKeys[5]; #else #define NUM_INVALID_KEYS 2 extern short nInvalidKeys[2]; #endif void RegisterKeys(HWND hWnd); void UnregisterKeys(HWND hWnd); void CreateKeyDialog(HINSTANCE hInst, HWND hWnd); #endifmilkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/newres.h0000644000175000017500000000156310737746457023547 0ustar admin2admin2#ifndef __NEWRES_H__ #define __NEWRES_H__ #if !defined(UNDER_CE) #define UNDER_CE _WIN32_WCE #endif #if defined(_WIN32_WCE) #if !defined(WCEOLE_ENABLE_DIALOGEX) #define DIALOGEX DIALOG DISCARDABLE #endif #include #define SHMENUBAR RCDATA #if defined(WIN32_PLATFORM_PSPC) && (_WIN32_WCE >= 300) #include #define AFXCE_IDR_SCRATCH_SHMENU 28700 #else #define I_IMAGENONE (-2) #define NOMENU 0xFFFF #define IDS_SHNEW 1 #define IDM_SHAREDNEW 10 #define IDM_SHAREDNEWDEFAULT 11 #endif // _WIN32_WCE_PSPC #define AFXCE_IDD_SAVEMODIFIEDDLG 28701 #endif // _WIN32_WCE #ifdef RC_INVOKED #ifndef _INC_WINDOWS #define _INC_WINDOWS #include "winuser.h" // extract from windows header #include "winver.h" #endif #endif #ifdef IDC_STATIC #undef IDC_STATIC #endif #define IDC_STATIC (-1) #endif //__NEWRES_H__ milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/PocketPC KeyConfig.h0000644000175000017500000000056210737746457025551 0ustar admin2admin2 #if !defined(AFX_POCKETPCKEYCONFIG_H__159E0D94_E1F9_479E_A337_A03081FBBD41__INCLUDED_) #define AFX_POCKETPCKEYCONFIG_H__159E0D94_E1F9_479E_A337_A03081FBBD41__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "resource.h" #define MENU_HEIGHT 26 #endif // !defined(AFX_POCKETPCKEYCONFIG_H__159E0D94_E1F9_479E_A337_A03081FBBD41__INCLUDED_) milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/Registry.h0000644000175000017500000000066010737746457024051 0ustar admin2admin2#ifndef __REGISTRY_H__ #define __REGISTRY_H__ #include void GetFullAppPath(LPCTSTR pszApplicationTitle, HINSTANCE hInst, LPTSTR pszModule, UINT max); BOOL RegQueryFileInfo(LPCTSTR pszExecutable, HINSTANCE hInst, LPCTSTR pszExt); void RegFileInfo(LPCTSTR pszExecutable, HINSTANCE hInst, LPCTSTR pszExt, int idi_app); // IDI_APP void RegUnregisterFileInfo(LPCTSTR pszExecutable, HINSTANCE hInst, LPCTSTR pszExt); #endifmilkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/resource.h0000644000175000017500000000436410737746457024075 0ustar admin2admin2//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by PocketPC KeyConfig.rc // #define IDS_APP_TITLE 1 #define IDS_HELLO 2 #define IDC_POCKETPCKEYCONFIG 3 #define IDI_POCKETPCKEYCONFIG 101 #define IDM_MENU 102 #define IDD_ABOUTBOX 103 #define IDS_HELP 104 #define IDD_KEYDIALOG 104 #define IDD_OTHERDIALOG 105 #define IDD_FILEASSOCIATIONDIALOG 106 #define IDD_TABDIALOG 107 #define IDI_ICON1 110 #define IDS_COMMAND1 301 #define IDS_WARNING_BUTTONMAPPINGINTERFERENCE 302 #define IDS_WARNING_MILKYTRACKERAPPEXENOTFOUND 303 #define IDC_KEYBUTTON1 1001 #define IDC_KEYEDIT1 1002 #define IDC_KEYRESETALL 1003 #define IDC_BUTTON1 1004 #define IDC_LIST1 1005 #define IDC_LIST2 1006 #define IDC_STATIC2 1007 #define IDC_STATIC1 1008 #define IDC_STATIC3 1009 #define IDC_KEYEDIT2 1010 #define IDC_KEY 1011 #define IDC_GROUP 1012 #define IDC_CHECKFLIPORIENTATION 1013 #define IDC_CHECKALLOWVKEYS 1014 #define IDC_TAB1 1015 #define IDC_CHECKALLOWVKEYS2 1015 #define IDC_DONTTURNOFFDEVICE 1015 #define IDC_CHECKHIDETASKBAR 1016 #define IDC_RADIO_ORIENTATION_90CW 1017 #define IDC_RADIO_ORIENTATION_90CCW 1018 #define IDC_RADIO_ORIENTATION_NORMAL 1019 #define IDC_CHECKDOUBLEPIXELS 1020 #define IDC_SELECT_ALL 1021 #define IDC_DESELECT_ALL 1022 #define IDM_MAIN_COMMAND1 40001 #define IDM_HELP_ABOUT 40003 #define IDM_FILE_EXIT 40004 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 113 #define _APS_NEXT_COMMAND_VALUE 40005 #define _APS_NEXT_CONTROL_VALUE 1013 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/StdAfx.h0000644000175000017500000000144610737746457023435 0ustar admin2admin2// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__5FDB452E_354E_48F7_AE1C_1B8375FF6F91__INCLUDED_) #define AFX_STDAFX_H__5FDB452E_354E_48F7_AE1C_1B8375FF6F91__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers // Windows Header Files: #include // Local Header Files // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}} // Microsoft eMbedded Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__5FDB452E_354E_48F7_AE1C_1B8375FF6F91__INCLUDED_) milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/PocketPC KeyConfig.rc0000644000175000017500000001732310737746457025731 0ustar admin2admin2//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "newres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // German (Germany) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 LANGUAGE LANG_GERMAN, SUBLANG_GERMAN #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_KEYDIALOG DIALOG DISCARDABLE 0, 0, 143, 159 STYLE WS_CHILD FONT 8, "System" BEGIN EDITTEXT IDC_KEYEDIT1,94,85,35,12,ES_AUTOHSCROLL | ES_READONLY PUSHBUTTON "Reset keys",IDC_KEYRESETALL,84,108,45,11 CONTROL "List1",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,3,2,126,75 LTEXT "Current button mapping:",IDC_STATIC1,3,87,80,8 LTEXT "Press button to assign a new mapping",IDC_STATIC2,3,97, 126,8 LTEXT "Double tap a function to assign button. Press OK when finished or Cancel to abort without saving.", IDC_STATIC3,3,79,126,26 LTEXT "Static",IDC_KEY,3,78,126,8 END IDD_OTHERDIALOG DIALOG DISCARDABLE 0, 0, 143, 159 STYLE WS_CHILD FONT 8, "System" BEGIN CONTROL "Double Pixels",IDC_CHECKDOUBLEPIXELS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,8,65,58,10 CONTROL "Hide Taskbar",IDC_CHECKHIDETASKBAR,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,8,78,57,10 CONTROL "Allow external keyboard events",IDC_CHECKALLOWVKEYS, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,91,117,10 CONTROL "Don't turn off device",IDC_DONTTURNOFFDEVICE,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,8,105,82,10 GROUPBOX "Other options",IDC_STATIC,3,54,126,65 CONTROL "Right handed (90CW)",IDC_RADIO_ORIENTATION_90CW,"Button", BS_AUTORADIOBUTTON,8,17,108,10 CONTROL "Left handed (90CCW)",IDC_RADIO_ORIENTATION_90CCW,"Button", BS_AUTORADIOBUTTON,8,28,108,10 CONTROL "Normal (Portrait)",IDC_RADIO_ORIENTATION_NORMAL,"Button", BS_AUTORADIOBUTTON,8,39,108,10 GROUPBOX "Orientation",IDC_STATIC,3,7,126,44 END IDD_FILEASSOCIATIONDIALOG DIALOG DISCARDABLE 0, 0, 143, 159 STYLE WS_CHILD FONT 8, "System" BEGIN CONTROL "List1",IDC_LIST2,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,3,2,126,104 PUSHBUTTON "Unmark all",IDC_DESELECT_ALL,38,108,43,11 PUSHBUTTON "Mark all",IDC_SELECT_ALL,84,108,45,11 END IDD_TABDIALOG DIALOG DISCARDABLE 0, 0, 138, 174 STYLE WS_POPUP FONT 8, "System" BEGIN CONTROL "Tab1",IDC_TAB1,"SysTabControl32",TCS_BOTTOM,1,0,136,137 DEFPUSHBUTTON "OK",IDOK,66,140,31,11 PUSHBUTTON "Cancel",IDCANCEL,101,140,31,11 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_KEYDIALOG, DIALOG BEGIN LEFTMARGIN, 3 RIGHTMARGIN, 129 TOPMARGIN, 7 BOTTOMMARGIN, 153 END IDD_OTHERDIALOG, DIALOG BEGIN LEFTMARGIN, 3 RIGHTMARGIN, 129 TOPMARGIN, 7 BOTTOMMARGIN, 153 END IDD_TABDIALOG, DIALOG BEGIN RIGHTMARGIN, 137 BOTTOMMARGIN, 173 HORZGUIDE, 11 HORZGUIDE, 21 HORZGUIDE, 31 HORZGUIDE, 40 HORZGUIDE, 49 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON1 ICON DISCARDABLE "icon1.ico" #endif // German (Germany) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 140, 57 STYLE WS_POPUP | WS_CAPTION EXSTYLE 0x80000000L CAPTION "About MilkyTracker config tool" FONT 8, "System" BEGIN ICON IDI_ICON1,IDC_STATIC,11,17,20,20 LTEXT "MilkyTracker config tool",IDC_STATIC,39,10,76,8, SS_NOPREFIX LTEXT "Copyright (C) 2005/2006",IDC_STATIC,39,25,81,8 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_ABOUTBOX, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 133 TOPMARGIN, 7 BOTTOMMARGIN, 50 END END #endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""newres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Data // IDM_MENU SHMENUBAR MOVEABLE PURE BEGIN IDM_MENU, 1, I_IMAGENONE, IDM_MAIN_COMMAND1, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_HELP, 0, 0, END ///////////////////////////////////////////////////////////////////////////// // // Menubar // IDM_MENU MENU DISCARDABLE BEGIN POPUP "Tools" BEGIN MENUITEM "About", IDM_HELP_ABOUT MENUITEM "Exit", IDM_FILE_EXIT END END ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDC_POCKETPCKEYCONFIG ACCELERATORS DISCARDABLE BEGIN "A", IDM_HELP_ABOUT, VIRTKEY, CONTROL, NOINVERT "Q", IDOK, VIRTKEY, CONTROL, NOINVERT END ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE DISCARDABLE BEGIN IDS_APP_TITLE "MilkyTracker config" IDC_POCKETPCKEYCONFIG "POCKETPCKEYCONFIG" END STRINGTABLE DISCARDABLE BEGIN IDS_HELP "Tools" END STRINGTABLE DISCARDABLE BEGIN IDS_COMMAND1 "Done " IDS_WARNING_BUTTONMAPPINGINTERFERENCE "The current button mapping might interfere with keys of your external keyboard.\nIf you're using an external keyboard and you're experiencing odd key pressing behaviour change/disable the current mapping." IDS_WARNING_MILKYTRACKERAPPEXENOTFOUND "MilkyTracker.exe can not be located in the current folder. Please run this program from the same folder as MilkyTracker.exe." END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/Registry.cpp0000644000175000017500000002233710737746457024411 0ustar admin2admin2#include "Registry.h" void GetFullAppPath(LPCTSTR pszApplicationTitle, HINSTANCE hInst, LPTSTR pszModule, UINT max) { ::GetModuleFileName(hInst, pszModule, max); LPTSTR pStr = pszModule+_tcslen(pszModule); while (*pStr != '\\' && pStr > pszModule) pStr--; if (_tcslen(pStr) > 0) { pStr++; *pStr = '\0'; } _tcscat(pszModule, pszApplicationTitle); } int SameProgram(LPCTSTR pszStr, LPCTSTR pszModule) { LPCTSTR pStr = pszModule+_tcslen(pszModule); while (*pStr != '\\' && pStr > pszModule) pStr--; if (*pStr == '\\') pStr++; for (unsigned int i = 0; i < _tcslen(pszStr) - _tcslen(pStr); i++) { BOOL bMatch = TRUE; for (unsigned int j = 0; j < _tcslen(pStr); j++) if (pszStr[i+j] != pStr[j]) { bMatch = FALSE; break; } if (bMatch) return 0; } return -1; } BOOL RegQueryFileInfo(LPCTSTR pszExecutable, HINSTANCE hInst, LPCTSTR pszExt) { TCHAR szBuff[MAX_PATH + 32]; TCHAR szBuff2[MAX_PATH + 32]; TCHAR szModule[MAX_PATH]; GetFullAppPath(pszExecutable, hInst, szModule, MAX_PATH); TCHAR wExt[32], wFile[32+4], wCommand[32+15], wIcon[32+10]; TCHAR wDefault[256]; _tcscpy(wDefault, _T("Default")); _tcscpy(wExt,_T(".")); _tcscat(wExt,pszExt); _tcscpy(wFile,pszExt); _tcscat(wFile,_T("file")); _tcscpy(wCommand,wFile); _tcscat(wCommand,_T("\\Shell\\Open\\Command")); _tcscpy(wIcon,wFile); _tcscat(wIcon,_T("\\DefaultIcon")); DWORD dwSize; HKEY hKey = 0; if (RegOpenKeyEx (HKEY_CLASSES_ROOT, wExt, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { dwSize = sizeof(szBuff); RegQueryValueEx (hKey, wDefault, 0, NULL, (LPBYTE)szBuff, &dwSize); RegCloseKey(hKey); if (_tcsicmp(szBuff, wFile) != 0) return FALSE; } else return FALSE; if (RegOpenKeyEx (HKEY_CLASSES_ROOT, wCommand, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { dwSize = sizeof(szBuff); RegQueryValueEx (hKey, wDefault, 0, NULL, (LPBYTE)szBuff, &dwSize); RegCloseKey(hKey); wsprintf(szBuff2, _T("\"%s\" %%1"), szModule); if (SameProgram(szBuff, szModule) != 0) return FALSE; } else return FALSE; return TRUE; } void RegFileInfo(LPCTSTR pszExecutable, HINSTANCE hInst, LPCTSTR pszExt, int idi_app) // IDI_APP { TCHAR szBuff[MAX_PATH + 32]; TCHAR szBuff2[MAX_PATH + 32]; TCHAR szModule[MAX_PATH]; GetFullAppPath(pszExecutable, hInst, szModule, MAX_PATH); TCHAR wExt[32], wFile[32+4], wCommand[32+15], wIcon[32+10]; TCHAR wDefault[256]; TCHAR szBackup[256]; _tcscpy(wDefault, _T("Default")); _tcscpy(wExt,_T(".")); _tcscat(wExt,pszExt); _tcscpy(wFile,pszExt); _tcscat(wFile,_T("file")); _tcscpy(wCommand,wFile); _tcscat(wCommand,_T("\\Shell\\Open\\Command")); _tcscpy(wIcon,wFile); _tcscat(wIcon,_T("\\DefaultIcon")); DWORD dwSize; HKEY hKey = 0; DWORD dwDisposition; if (RegOpenKeyEx (HKEY_CLASSES_ROOT, wExt, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { dwSize = sizeof(szBuff); RegQueryValueEx (hKey, wDefault, 0, NULL, (LPBYTE)szBuff, &dwSize); RegCloseKey(hKey); if (_tcsicmp(szBuff, wFile) != 0) { _tcscpy(szBuff2,wFile); _tcscat(szBuff2,_T("\\OldProg")); if (RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuff2, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition)==ERROR_SUCCESS) { wsprintf(szBackup, _T("LinkBackup")); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, szBackup, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } } } if (RegCreateKeyEx(HKEY_CLASSES_ROOT, wExt, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { _tcscpy(szBuff, wFile); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, wDefault, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } if (RegOpenKeyEx (HKEY_CLASSES_ROOT, wCommand, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { dwSize = sizeof(szBuff); RegQueryValueEx (hKey, wDefault, 0, NULL, (LPBYTE)szBuff, &dwSize); RegCloseKey(hKey); wsprintf(szBuff2, _T("\"%s\" %%1"), szModule); //if (_tcsicmp(szBuff, szBuff2) != 0) if (SameProgram(szBuff, szModule) != 0) { _tcscpy(szBuff2,wFile); _tcscat(szBuff2,_T("\\OldProg")); if (RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuff2, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition)==ERROR_SUCCESS) { wsprintf(szBackup, _T("ProgramBackup")); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, szBackup, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } } } if (RegCreateKeyEx(HKEY_CLASSES_ROOT, wCommand, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { wsprintf(szBuff, _T("\"%s\" %%1"), szModule); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, wDefault, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } if (RegOpenKeyEx (HKEY_CLASSES_ROOT, wIcon, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { dwSize = sizeof(szBuff); RegQueryValueEx (hKey, wDefault, 0, NULL, (LPBYTE)szBuff, &dwSize); RegCloseKey(hKey); wsprintf(szBuff2, _T("%s,-%d"), szModule, idi_app); //if (_tcsicmp(szBuff, szBuff2) != 0) if (SameProgram(szBuff, szModule) != 0) { _tcscpy(szBuff2,wFile); _tcscat(szBuff2,_T("\\OldProg")); if (RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuff2, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { wsprintf(szBackup, _T("IconBackup")); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, szBackup, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } } } if (RegCreateKeyEx(HKEY_CLASSES_ROOT, wIcon, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { wsprintf(szBuff, _T("%s,-%d"), szModule, idi_app); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, wDefault, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } } void RegUnregisterFileInfo(LPCTSTR pszExecutable, HINSTANCE hInst, LPCTSTR pszExt) { TCHAR szBuff[MAX_PATH + 32]; TCHAR szBuff2[MAX_PATH + 32]; TCHAR szLinkBackup[MAX_PATH + 32]; TCHAR szIconBackup[MAX_PATH + 32]; TCHAR szProgramBackup[MAX_PATH + 32]; TCHAR szModule[MAX_PATH]; GetFullAppPath(pszExecutable, hInst, szModule, MAX_PATH); TCHAR wExt[32], wFile[32+4], wCommand[32+15], wIcon[32+10]; TCHAR wDefault[256]; _tcscpy(wDefault, _T("Default")); _tcscpy(wExt,_T(".")); _tcscat(wExt,pszExt); _tcscpy(wFile,pszExt); _tcscat(wFile,_T("file")); _tcscpy(wCommand,wFile); _tcscat(wCommand,_T("\\Shell\\Open\\Command")); _tcscpy(wIcon,wFile); _tcscat(wIcon,_T("\\DefaultIcon")); DWORD dwSize; HKEY hKey = 0; int rc; _tcscpy(szBuff2,wFile); _tcscat(szBuff2,_T("\\OldProg")); // check if we're having backup of previous file association if (RegOpenKeyEx (HKEY_CLASSES_ROOT, szBuff2, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { dwSize = sizeof(szLinkBackup); if (RegQueryValueEx (hKey, _T("LinkBackup"), 0, NULL, (LPBYTE)szLinkBackup, &dwSize) != ERROR_SUCCESS) memset(szLinkBackup, 0, sizeof(szLinkBackup)); dwSize = sizeof(szIconBackup); if (RegQueryValueEx (hKey, _T("IconBackup"), 0, NULL, (LPBYTE)szIconBackup, &dwSize) != ERROR_SUCCESS) memset(szIconBackup, 0, sizeof(szIconBackup)); dwSize = sizeof(szProgramBackup); if (RegQueryValueEx (hKey, _T("ProgramBackup"), 0, NULL, (LPBYTE)szProgramBackup, &dwSize) != ERROR_SUCCESS) memset(szProgramBackup, 0, sizeof(szProgramBackup)); RegCloseKey(hKey); if (*szLinkBackup && RegOpenKeyEx (HKEY_CLASSES_ROOT, wExt, 0, KEY_QUERY_VALUE, &hKey)==ERROR_SUCCESS) { _tcscpy(szBuff, szLinkBackup); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, wDefault, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } if (*szIconBackup && RegOpenKeyEx (HKEY_CLASSES_ROOT, wIcon, 0, KEY_QUERY_VALUE, &hKey)==ERROR_SUCCESS) { _tcscpy(szBuff, szIconBackup); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, wDefault, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } if (*szProgramBackup && RegOpenKeyEx (HKEY_CLASSES_ROOT, wCommand, 0, KEY_QUERY_VALUE, &hKey)==ERROR_SUCCESS) { _tcscpy(szBuff, szProgramBackup); dwSize = (_tcslen(szBuff) + 1) * sizeof(TCHAR); RegSetValueEx(hKey, wDefault, 0, REG_SZ, (LPBYTE)szBuff, dwSize); RegCloseKey(hKey); } rc = RegDeleteKey(HKEY_CLASSES_ROOT, szBuff2); } else { _tcscpy(szBuff,wFile); _tcscat(szBuff,_T("\\Shell\\Open\\Command")); rc = RegDeleteKey(HKEY_CLASSES_ROOT, szBuff); _tcscpy(szBuff,wFile); _tcscat(szBuff,_T("\\Shell\\Open")); rc = RegDeleteKey(HKEY_CLASSES_ROOT, szBuff); _tcscpy(szBuff,wFile); _tcscat(szBuff,_T("\\Shell")); rc = RegDeleteKey(HKEY_CLASSES_ROOT, szBuff); _tcscpy(szBuff,wFile); _tcscat(szBuff,_T("\\DefaultIcon")); rc = RegDeleteKey(HKEY_CLASSES_ROOT, szBuff); _tcscpy(szBuff,wFile); rc = RegDeleteKey(HKEY_CLASSES_ROOT, szBuff); rc = RegDeleteKey(HKEY_CLASSES_ROOT, wExt); } }milkytracker-0.90.85+dfsg/additional/PocketPC KeyConfig/StdAfx.cpp0000644000175000017500000000045110737746457023763 0ustar admin2admin2// stdafx.cpp : source file that includes just the standard includes // PocketPC KeyConfig.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" // TODO: reference any additional headers you need in STDAFX.H // and not in this file milkytracker-0.90.85+dfsg/AUTHORS0000644000175000017500000000101611316456771015504 0ustar admin2admin2Main Code: Peter "pailes" Barth Additional Code: Christopher "Deltafire" O'Neill (SDL ports, some features/bugfixes) Antti S. Lankila (Amiga filter coefficients) Varthall (Amiga port) Andrew Simper (noise code) David Ross (EQ code) Stuart Caie/Claudio Matsuoka (powerpacker decrunching) 3rd Party Libraries: RtMidi/RtAudio PortAudio zlib zziplib Pixel Graphics: kenet raina IDC Demo songs: svenzzon Strobe & Kmuland raina ASCII art (.nfo file): H2o